From 66ada0d2ac2a8b3208a924bd578d66625a2f8b46 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Sun, 11 May 2025 14:16:35 +0300 Subject: [PATCH 1/3] git subrepo clone https://github.com/stsp/ncurses.git contrib/ncurses subrepo: subdir: "contrib/ncurses" merged: "70ab4fd6e" upstream: origin: "https://github.com/stsp/ncurses.git" branch: "master" commit: "70ab4fd6e" git-subrepo: version: "0.4.6" origin: "???" commit: "???" --- contrib/ncurses/.gitrepo | 12 + contrib/ncurses/ANNOUNCE | 733 + contrib/ncurses/AUTHORS | 41 + contrib/ncurses/Ada95/Makefile.in | 121 + contrib/ncurses/Ada95/README | 34 + contrib/ncurses/Ada95/TODO | 56 + contrib/ncurses/Ada95/aclocal.m4 | 5398 +++ contrib/ncurses/Ada95/configure | 19722 ++++++++++ contrib/ncurses/Ada95/configure.in | 607 + contrib/ncurses/Ada95/doc/Makefile.in | 100 + contrib/ncurses/Ada95/gen/Makefile.in | 385 + contrib/ncurses/Ada95/gen/adacurses-config.in | 83 + contrib/ncurses/Ada95/gen/gen.c | 582 + contrib/ncurses/Ada95/gen/html.m4 | 41 + contrib/ncurses/Ada95/gen/normal.m4 | 38 + contrib/ncurses/Ada95/gen/table.m4 | 36 + .../gen/terminal_interface-curses-aux.ads.m4 | 121 + ..._interface-curses-forms-field_types.ads.m4 | 239 + ...erface-curses-forms-field_user_data.ads.m4 | 71 + ...terface-curses-forms-form_user_data.ads.m4 | 71 + .../terminal_interface-curses-forms.ads.m4 | 749 + ...terface-curses-menus-item_user_data.ads.m4 | 76 + ...terface-curses-menus-menu_user_data.ads.m4 | 71 + .../terminal_interface-curses-menus.ads.m4 | 639 + .../terminal_interface-curses-mouse.ads.m4 | 204 + ...l_interface-curses-panels-user_data.ads.m4 | 71 + .../terminal_interface-curses-panels.ads.m4 | 148 + .../terminal_interface-curses-trace.ads.m4 | 125 + .../gen/terminal_interface-curses.adb.m4 | 2559 ++ .../gen/terminal_interface-curses.ads.m4 | 2015 + .../ncurses/Ada95/include/MKncurses_def.sh | 81 + contrib/ncurses/Ada95/include/Makefile.in | 105 + contrib/ncurses/Ada95/include/ncurses_cfg.hin | 73 + contrib/ncurses/Ada95/include/ncurses_defs | 200 + contrib/ncurses/Ada95/make-tar.sh | 174 + contrib/ncurses/Ada95/mk-1st.awk | 91 + contrib/ncurses/Ada95/mk-pkg.awk | 90 + .../ncurses/Ada95/package/AdaCurses-doc.spec | 61 + contrib/ncurses/Ada95/package/AdaCurses.spec | 137 + contrib/ncurses/Ada95/package/debian/compat | 1 + contrib/ncurses/Ada95/package/debian/control | 19 + .../ncurses/Ada95/package/debian/copyright | 79 + contrib/ncurses/Ada95/package/debian/docs | 1 + contrib/ncurses/Ada95/package/debian/rules | 104 + .../Ada95/package/debian/source/format | 1 + contrib/ncurses/Ada95/package/debian/watch | 4 + contrib/ncurses/Ada95/samples/Makefile.in | 186 + contrib/ncurses/Ada95/samples/README | 36 + contrib/ncurses/Ada95/samples/explain.txt | 186 + contrib/ncurses/Ada95/samples/ncurses.adb | 48 + .../Ada95/samples/ncurses2-acs_and_scroll.adb | 712 + .../Ada95/samples/ncurses2-acs_and_scroll.ads | 42 + .../Ada95/samples/ncurses2-acs_display.adb | 236 + .../Ada95/samples/ncurses2-acs_display.ads | 42 + .../Ada95/samples/ncurses2-attr_test.adb | 363 + .../Ada95/samples/ncurses2-attr_test.ads | 43 + .../Ada95/samples/ncurses2-color_edit.adb | 260 + .../Ada95/samples/ncurses2-color_edit.ads | 42 + .../Ada95/samples/ncurses2-color_test.adb | 164 + .../Ada95/samples/ncurses2-color_test.ads | 42 + .../Ada95/samples/ncurses2-demo_forms.adb | 499 + .../Ada95/samples/ncurses2-demo_forms.ads | 42 + .../Ada95/samples/ncurses2-demo_pad.adb | 678 + .../Ada95/samples/ncurses2-demo_pad.ads | 42 + .../Ada95/samples/ncurses2-demo_panels.adb | 382 + .../Ada95/samples/ncurses2-demo_panels.ads | 42 + .../Ada95/samples/ncurses2-flushinp_test.adb | 136 + .../Ada95/samples/ncurses2-flushinp_test.ads | 44 + .../Ada95/samples/ncurses2-genericputs.adb | 118 + .../Ada95/samples/ncurses2-genericputs.ads | 73 + .../ncurses/Ada95/samples/ncurses2-getch.ads | 42 + .../Ada95/samples/ncurses2-getch_test.adb | 257 + .../Ada95/samples/ncurses2-getch_test.ads | 42 + .../ncurses/Ada95/samples/ncurses2-getopt.adb | 164 + .../ncurses/Ada95/samples/ncurses2-getopt.ads | 61 + contrib/ncurses/Ada95/samples/ncurses2-m.adb | 446 + contrib/ncurses/Ada95/samples/ncurses2-m.ads | 44 + .../Ada95/samples/ncurses2-menu_test.adb | 169 + .../Ada95/samples/ncurses2-menu_test.ads | 42 + .../Ada95/samples/ncurses2-overlap_test.adb | 159 + .../Ada95/samples/ncurses2-overlap_test.ads | 42 + .../Ada95/samples/ncurses2-slk_test.adb | 173 + .../Ada95/samples/ncurses2-slk_test.ads | 42 + .../samples/ncurses2-test_sgr_attributes.adb | 186 + .../samples/ncurses2-test_sgr_attributes.ads | 42 + .../Ada95/samples/ncurses2-trace_set.adb | 496 + .../Ada95/samples/ncurses2-trace_set.ads | 42 + .../ncurses/Ada95/samples/ncurses2-util.adb | 186 + .../ncurses/Ada95/samples/ncurses2-util.ads | 77 + contrib/ncurses/Ada95/samples/ncurses2.ads | 45 + contrib/ncurses/Ada95/samples/rain.adb | 180 + contrib/ncurses/Ada95/samples/rain.ads | 44 + .../samples/sample-curses_demo-attributes.adb | 123 + .../samples/sample-curses_demo-attributes.ads | 46 + .../samples/sample-curses_demo-mouse.adb | 221 + .../samples/sample-curses_demo-mouse.ads | 46 + .../Ada95/samples/sample-curses_demo.adb | 144 + .../Ada95/samples/sample-curses_demo.ads | 46 + .../Ada95/samples/sample-explanation.adb_p | 441 + .../Ada95/samples/sample-explanation.ads | 60 + .../Ada95/samples/sample-form_demo-aux.adb | 264 + .../Ada95/samples/sample-form_demo-aux.ads | 93 + .../samples/sample-form_demo-handler.adb | 99 + .../samples/sample-form_demo-handler.ads | 65 + .../Ada95/samples/sample-form_demo.adb | 131 + .../Ada95/samples/sample-form_demo.ads | 46 + .../samples/sample-function_key_setting.adb | 215 + .../samples/sample-function_key_setting.ads | 83 + .../Ada95/samples/sample-header_handler.adb | 186 + .../Ada95/samples/sample-header_handler.ads | 54 + .../ncurses/Ada95/samples/sample-helpers.adb | 69 + .../ncurses/Ada95/samples/sample-helpers.ads | 55 + .../Ada95/samples/sample-keyboard_handler.adb | 195 + .../Ada95/samples/sample-keyboard_handler.ads | 56 + .../ncurses/Ada95/samples/sample-manifest.ads | 68 + .../Ada95/samples/sample-menu_demo-aux.adb | 205 + .../Ada95/samples/sample-menu_demo-aux.ads | 72 + .../samples/sample-menu_demo-handler.adb | 109 + .../samples/sample-menu_demo-handler.ads | 65 + .../Ada95/samples/sample-menu_demo.adb | 397 + .../Ada95/samples/sample-menu_demo.ads | 46 + .../Ada95/samples/sample-my_field_type.adb | 69 + .../Ada95/samples/sample-my_field_type.ads | 62 + .../Ada95/samples/sample-text_io_demo.adb | 189 + .../Ada95/samples/sample-text_io_demo.ads | 46 + contrib/ncurses/Ada95/samples/sample.adb | 221 + contrib/ncurses/Ada95/samples/sample.ads | 44 + contrib/ncurses/Ada95/samples/split-path.awk | 56 + contrib/ncurses/Ada95/samples/status.adb | 58 + contrib/ncurses/Ada95/samples/status.ads | 61 + contrib/ncurses/Ada95/samples/tour.adb | 47 + contrib/ncurses/Ada95/samples/tour.ads | 42 + contrib/ncurses/Ada95/src/Makefile.in | 428 + .../ncurses/Ada95/src/c_threaded_variables.c | 57 + .../ncurses/Ada95/src/c_threaded_variables.h | 59 + contrib/ncurses/Ada95/src/c_varargs_to_ada.c | 118 + contrib/ncurses/Ada95/src/c_varargs_to_ada.h | 82 + contrib/ncurses/Ada95/src/library-cfg.sh | 73 + contrib/ncurses/Ada95/src/library.gpr.in | 71 + contrib/ncurses/Ada95/src/modules | 73 + contrib/ncurses/Ada95/src/ncurses_compat.c | 146 + .../src/terminal_interface-curses-aux.adb | 117 + ...terface-curses-forms-field_types-alpha.adb | 59 + ...terface-curses-forms-field_types-alpha.ads | 54 + ...-curses-forms-field_types-alphanumeric.adb | 59 + ...-curses-forms-field_types-alphanumeric.ads | 55 + ...rses-forms-field_types-enumeration-ada.adb | 82 + ...rses-forms-field_types-enumeration-ada.ads | 60 + ...e-curses-forms-field_types-enumeration.adb | 113 + ...e-curses-forms-field_types-enumeration.ads | 99 + ...face-curses-forms-field_types-intfield.adb | 63 + ...face-curses-forms-field_types-intfield.ads | 56 + ...-curses-forms-field_types-ipv4_address.adb | 59 + ...-curses-forms-field_types-ipv4_address.ads | 52 + ...rface-curses-forms-field_types-numeric.adb | 66 + ...rface-curses-forms-field_types-numeric.ads | 56 + ...erface-curses-forms-field_types-regexp.adb | 59 + ...erface-curses-forms-field_types-regexp.ads | 56 + ...e-curses-forms-field_types-user-choice.adb | 105 + ...e-curses-forms-field_types-user-choice.ads | 95 + ...nterface-curses-forms-field_types-user.adb | 127 + ...nterface-curses-forms-field_types-user.ads | 96 + ...nal_interface-curses-forms-field_types.adb | 270 + ...interface-curses-forms-field_user_data.adb | 81 + ..._interface-curses-forms-form_user_data.adb | 82 + .../src/terminal_interface-curses-forms.adb | 1032 + ..._interface-curses-menus-item_user_data.adb | 72 + ..._interface-curses-menus-menu_user_data.adb | 73 + .../src/terminal_interface-curses-menus.adb | 904 + .../src/terminal_interface-curses-mouse.adb | 218 + ...inal_interface-curses-panels-user_data.adb | 79 + .../src/terminal_interface-curses-panels.adb | 166 + .../src/terminal_interface-curses-putwin.adb | 78 + .../src/terminal_interface-curses-putwin.ads | 51 + .../src/terminal_interface-curses-termcap.adb | 164 + .../src/terminal_interface-curses-termcap.ads | 81 + .../terminal_interface-curses-terminfo.adb | 162 + .../terminal_interface-curses-terminfo.ads | 82 + .../terminal_interface-curses-text_io-aux.adb | 129 + .../terminal_interface-curses-text_io-aux.ads | 56 + ...al_interface-curses-text_io-complex_io.adb | 74 + ...al_interface-curses-text_io-complex_io.ads | 71 + ...al_interface-curses-text_io-decimal_io.adb | 76 + ...al_interface-curses-text_io-decimal_io.ads | 67 + ...nterface-curses-text_io-enumeration_io.adb | 81 + ...nterface-curses-text_io-enumeration_io.ads | 64 + ...inal_interface-curses-text_io-fixed_io.adb | 76 + ...inal_interface-curses-text_io-fixed_io.ads | 67 + ...inal_interface-curses-text_io-float_io.adb | 77 + ...inal_interface-curses-text_io-float_io.ads | 67 + ...al_interface-curses-text_io-integer_io.adb | 71 + ...al_interface-curses-text_io-integer_io.ads | 64 + ...al_interface-curses-text_io-modular_io.adb | 71 + ...al_interface-curses-text_io-modular_io.ads | 64 + .../src/terminal_interface-curses-text_io.adb | 339 + .../src/terminal_interface-curses-text_io.ads | 137 + .../src/terminal_interface-curses-trace.adb_p | 77 + .../ncurses/Ada95/src/terminal_interface.ads | 48 + contrib/ncurses/COPYING | 29 + contrib/ncurses/INSTALL | 2543 ++ contrib/ncurses/MANIFEST | 1250 + contrib/ncurses/Makefile.in | 132 + contrib/ncurses/Makefile.os2 | 260 + contrib/ncurses/NEWS | 15836 ++++++++ contrib/ncurses/README | 221 + contrib/ncurses/README.MinGW | 148 + contrib/ncurses/README.emx | 73 + contrib/ncurses/TO-DO | 214 + contrib/ncurses/VERSION | 1 + contrib/ncurses/aclocal.m4 | 10400 +++++ contrib/ncurses/announce.html.in | 1754 + contrib/ncurses/c++/Makefile.in | 294 + contrib/ncurses/c++/NEWS | 72 + contrib/ncurses/c++/PROBLEMS | 35 + contrib/ncurses/c++/README-first | 81 + contrib/ncurses/c++/cursesapp.cc | 174 + contrib/ncurses/c++/cursesapp.h | 191 + contrib/ncurses/c++/cursesf.cc | 474 + contrib/ncurses/c++/cursesf.h | 968 + contrib/ncurses/c++/cursesm.cc | 414 + contrib/ncurses/c++/cursesm.h | 674 + contrib/ncurses/c++/cursesmain.cc | 96 + contrib/ncurses/c++/cursesp.cc | 139 + contrib/ncurses/c++/cursesp.h | 271 + contrib/ncurses/c++/cursespad.cc | 300 + contrib/ncurses/c++/cursesw.cc | 470 + contrib/ncurses/c++/cursesw.h | 1581 + contrib/ncurses/c++/cursslk.cc | 141 + contrib/ncurses/c++/cursslk.h | 240 + contrib/ncurses/c++/demo.cc | 573 + contrib/ncurses/c++/edit_cfg.sh | 72 + contrib/ncurses/c++/etip.h.in | 406 + contrib/ncurses/c++/headers | 41 + contrib/ncurses/c++/internal.h | 72 + contrib/ncurses/c++/modules | 45 + contrib/ncurses/config.guess | 1815 + contrib/ncurses/config.sub | 2354 ++ contrib/ncurses/configure | 31724 ++++++++++++++++ contrib/ncurses/configure-dj64 | 14 + contrib/ncurses/configure.in | 2613 ++ contrib/ncurses/dist.mk | 178 + contrib/ncurses/doc/hackguide.doc | 685 + contrib/ncurses/doc/html/Ada95.html | 344 + .../doc/html/NCURSES-Programming-HOWTO.html | 7501 ++++ contrib/ncurses/doc/html/ada/files.htm | 18 + contrib/ncurses/doc/html/ada/files/T.htm | 83 + contrib/ncurses/doc/html/ada/funcs.htm | 39 + contrib/ncurses/doc/html/ada/funcs/A.htm | 29 + contrib/ncurses/doc/html/ada/funcs/B.htm | 25 + contrib/ncurses/doc/html/ada/funcs/C.htm | 63 + contrib/ncurses/doc/html/ada/funcs/D.htm | 51 + contrib/ncurses/doc/html/ada/funcs/E.htm | 22 + contrib/ncurses/doc/html/ada/funcs/F.htm | 59 + contrib/ncurses/doc/html/ada/funcs/G.htm | 100 + contrib/ncurses/doc/html/ada/funcs/H.htm | 26 + contrib/ncurses/doc/html/ada/funcs/I.htm | 55 + contrib/ncurses/doc/html/ada/funcs/K.htm | 18 + contrib/ncurses/doc/html/ada/funcs/L.htm | 25 + contrib/ncurses/doc/html/ada/funcs/M.htm | 55 + contrib/ncurses/doc/html/ada/funcs/N.htm | 39 + contrib/ncurses/doc/html/ada/funcs/O.htm | 16 + contrib/ncurses/doc/html/ada/funcs/P.htm | 63 + contrib/ncurses/doc/html/ada/funcs/Q.htm | 12 + contrib/ncurses/doc/html/ada/funcs/R.htm | 43 + contrib/ncurses/doc/html/ada/funcs/S.htm | 195 + contrib/ncurses/doc/html/ada/funcs/T.htm | 43 + contrib/ncurses/doc/html/ada/funcs/U.htm | 27 + contrib/ncurses/doc/html/ada/funcs/V.htm | 15 + contrib/ncurses/doc/html/ada/funcs/W.htm | 57 + contrib/ncurses/doc/html/ada/index.htm | 42 + contrib/ncurses/doc/html/ada/main.htm | 82 + contrib/ncurses/doc/html/ada/table.html | 340 + .../terminal_interface-curses-aux__adb.htm | 135 + .../terminal_interface-curses-aux__ads.htm | 136 + ...ce-curses-forms-field_types-alpha__adb.htm | 77 + ...ce-curses-forms-field_types-alpha__ads.htm | 72 + ...es-forms-field_types-alphanumeric__adb.htm | 77 + ...es-forms-field_types-alphanumeric__ads.htm | 73 + ...forms-field_types-enumeration-ada__adb.htm | 100 + ...forms-field_types-enumeration-ada__ads.htm | 78 + ...ses-forms-field_types-enumeration__adb.htm | 131 + ...ses-forms-field_types-enumeration__ads.htm | 117 + ...curses-forms-field_types-intfield__adb.htm | 81 + ...curses-forms-field_types-intfield__ads.htm | 74 + ...es-forms-field_types-ipv4_address__adb.htm | 77 + ...es-forms-field_types-ipv4_address__ads.htm | 70 + ...-curses-forms-field_types-numeric__adb.htm | 84 + ...-curses-forms-field_types-numeric__ads.htm | 74 + ...e-curses-forms-field_types-regexp__adb.htm | 77 + ...e-curses-forms-field_types-regexp__ads.htm | 74 + ...ses-forms-field_types-user-choice__adb.htm | 123 + ...ses-forms-field_types-user-choice__ads.htm | 113 + ...ace-curses-forms-field_types-user__adb.htm | 145 + ...ace-curses-forms-field_types-user__ads.htm | 114 + ...nterface-curses-forms-field_types__adb.htm | 288 + ...nterface-curses-forms-field_types__ads.htm | 258 + ...face-curses-forms-field_user_data__adb.htm | 99 + ...face-curses-forms-field_user_data__ads.htm | 88 + ...rface-curses-forms-form_user_data__adb.htm | 100 + ...rface-curses-forms-form_user_data__ads.htm | 88 + .../terminal_interface-curses-forms__adb.htm | 1050 + .../terminal_interface-curses-forms__ads.htm | 800 + ...rface-curses-menus-item_user_data__adb.htm | 90 + ...rface-curses-menus-item_user_data__ads.htm | 93 + ...rface-curses-menus-menu_user_data__adb.htm | 91 + ...rface-curses-menus-menu_user_data__ads.htm | 88 + .../terminal_interface-curses-menus__adb.htm | 922 + .../terminal_interface-curses-menus__ads.htm | 692 + .../terminal_interface-curses-mouse__adb.htm | 236 + .../terminal_interface-curses-mouse__ads.htm | 223 + ...interface-curses-panels-user_data__adb.htm | 97 + ...interface-curses-panels-user_data__ads.htm | 88 + .../terminal_interface-curses-panels__adb.htm | 184 + .../terminal_interface-curses-panels__ads.htm | 165 + .../terminal_interface-curses-putwin__adb.htm | 96 + .../terminal_interface-curses-putwin__ads.htm | 69 + ...terminal_interface-curses-termcap__adb.htm | 182 + ...terminal_interface-curses-termcap__ads.htm | 99 + ...erminal_interface-curses-terminfo__adb.htm | 180 + ...erminal_interface-curses-terminfo__ads.htm | 100 + ...inal_interface-curses-text_io-aux__adb.htm | 147 + ...inal_interface-curses-text_io-aux__ads.htm | 74 + ...terface-curses-text_io-complex_io__adb.htm | 92 + ...terface-curses-text_io-complex_io__ads.htm | 89 + ...terface-curses-text_io-decimal_io__adb.htm | 94 + ...terface-curses-text_io-decimal_io__ads.htm | 85 + ...ace-curses-text_io-enumeration_io__adb.htm | 99 + ...ace-curses-text_io-enumeration_io__ads.htm | 82 + ...interface-curses-text_io-fixed_io__adb.htm | 94 + ...interface-curses-text_io-fixed_io__ads.htm | 85 + ...interface-curses-text_io-float_io__adb.htm | 95 + ...interface-curses-text_io-float_io__ads.htm | 85 + ...terface-curses-text_io-integer_io__adb.htm | 89 + ...terface-curses-text_io-integer_io__ads.htm | 82 + ...terface-curses-text_io-modular_io__adb.htm | 89 + ...terface-curses-text_io-modular_io__ads.htm | 82 + ...terminal_interface-curses-text_io__adb.htm | 357 + ...terminal_interface-curses-text_io__ads.htm | 155 + .../terminal_interface-curses-trace__adb.htm | 79 + .../terminal_interface-curses-trace__ads.htm | 143 + .../ada/terminal_interface-curses__adb.htm | 2575 ++ .../ada/terminal_interface-curses__ads.htm | 2121 ++ ...rminal_interface-curses_constants__ads.htm | 401 + .../doc/html/ada/terminal_interface__ads.htm | 66 + contrib/ncurses/doc/html/announce.html | 1754 + contrib/ncurses/doc/html/hackguide.html | 962 + contrib/ncurses/doc/html/index.html | 68 + .../doc/html/man/adacursesw6-config.1.html | 144 + .../ncurses/doc/html/man/captoinfo.1m.html | 214 + contrib/ncurses/doc/html/man/clear.1.html | 165 + .../ncurses/doc/html/man/curs_add_wch.3x.html | 397 + .../doc/html/man/curs_add_wchstr.3x.html | 148 + .../ncurses/doc/html/man/curs_addch.3x.html | 351 + .../doc/html/man/curs_addchstr.3x.html | 138 + .../ncurses/doc/html/man/curs_addstr.3x.html | 133 + .../ncurses/doc/html/man/curs_addwstr.3x.html | 134 + .../ncurses/doc/html/man/curs_attr.3x.html | 525 + .../ncurses/doc/html/man/curs_beep.3x.html | 116 + .../ncurses/doc/html/man/curs_bkgd.3x.html | 217 + .../ncurses/doc/html/man/curs_bkgrnd.3x.html | 205 + .../ncurses/doc/html/man/curs_border.3x.html | 158 + .../doc/html/man/curs_border_set.3x.html | 181 + .../ncurses/doc/html/man/curs_clear.3x.html | 161 + .../ncurses/doc/html/man/curs_color.3x.html | 588 + .../ncurses/doc/html/man/curs_delch.3x.html | 121 + .../doc/html/man/curs_deleteln.3x.html | 133 + .../ncurses/doc/html/man/curs_extend.3x.html | 140 + .../ncurses/doc/html/man/curs_get_wch.3x.html | 195 + .../doc/html/man/curs_get_wstr.3x.html | 206 + .../doc/html/man/curs_getcchar.3x.html | 219 + .../ncurses/doc/html/man/curs_getch.3x.html | 454 + .../ncurses/doc/html/man/curs_getstr.3x.html | 277 + .../ncurses/doc/html/man/curs_getyx.3x.html | 126 + .../ncurses/doc/html/man/curs_in_wch.3x.html | 124 + .../doc/html/man/curs_in_wchstr.3x.html | 135 + .../ncurses/doc/html/man/curs_inch.3x.html | 136 + .../ncurses/doc/html/man/curs_inchstr.3x.html | 137 + .../ncurses/doc/html/man/curs_initscr.3x.html | 350 + .../ncurses/doc/html/man/curs_inopts.3x.html | 417 + .../ncurses/doc/html/man/curs_ins_wch.3x.html | 126 + .../doc/html/man/curs_ins_wstr.3x.html | 149 + .../ncurses/doc/html/man/curs_insch.3x.html | 120 + .../ncurses/doc/html/man/curs_insstr.3x.html | 143 + .../ncurses/doc/html/man/curs_instr.3x.html | 157 + .../ncurses/doc/html/man/curs_inwstr.3x.html | 153 + .../ncurses/doc/html/man/curs_kernel.3x.html | 292 + .../ncurses/doc/html/man/curs_legacy.3x.html | 132 + .../doc/html/man/curs_memleaks.3x.html | 148 + .../ncurses/doc/html/man/curs_mouse.3x.html | 425 + .../ncurses/doc/html/man/curs_move.3x.html | 111 + .../ncurses/doc/html/man/curs_opaque.3x.html | 172 + .../ncurses/doc/html/man/curs_outopts.3x.html | 223 + .../ncurses/doc/html/man/curs_overlay.3x.html | 128 + contrib/ncurses/doc/html/man/curs_pad.3x.html | 253 + .../ncurses/doc/html/man/curs_print.3x.html | 130 + .../ncurses/doc/html/man/curs_printw.3x.html | 165 + .../ncurses/doc/html/man/curs_refresh.3x.html | 182 + .../ncurses/doc/html/man/curs_scanw.3x.html | 197 + .../doc/html/man/curs_scr_dump.3x.html | 187 + .../ncurses/doc/html/man/curs_scroll.3x.html | 134 + contrib/ncurses/doc/html/man/curs_slk.3x.html | 339 + .../doc/html/man/curs_sp_funcs.3x.html | 315 + .../doc/html/man/curs_termattrs.3x.html | 176 + .../ncurses/doc/html/man/curs_termcap.3x.html | 403 + .../doc/html/man/curs_terminfo.3x.html | 697 + .../ncurses/doc/html/man/curs_threads.3x.html | 638 + .../ncurses/doc/html/man/curs_touch.3x.html | 150 + .../ncurses/doc/html/man/curs_trace.3x.html | 288 + .../ncurses/doc/html/man/curs_util.3x.html | 443 + .../doc/html/man/curs_variables.3x.html | 307 + .../ncurses/doc/html/man/curs_window.3x.html | 278 + .../doc/html/man/default_colors.3x.html | 167 + .../ncurses/doc/html/man/define_key.3x.html | 118 + contrib/ncurses/doc/html/man/form.3x.html | 268 + .../ncurses/doc/html/man/form_cursor.3x.html | 111 + .../ncurses/doc/html/man/form_data.3x.html | 97 + .../ncurses/doc/html/man/form_driver.3x.html | 301 + .../ncurses/doc/html/man/form_field.3x.html | 131 + .../html/man/form_field_attributes.3x.html | 125 + .../doc/html/man/form_field_buffer.3x.html | 170 + .../doc/html/man/form_field_info.3x.html | 123 + .../doc/html/man/form_field_just.3x.html | 112 + .../doc/html/man/form_field_new.3x.html | 139 + .../doc/html/man/form_field_opts.3x.html | 181 + .../doc/html/man/form_field_userptr.3x.html | 106 + .../html/man/form_field_validation.3x.html | 255 + .../doc/html/man/form_fieldtype.3x.html | 208 + .../ncurses/doc/html/man/form_hook.3x.html | 165 + contrib/ncurses/doc/html/man/form_new.3x.html | 123 + .../doc/html/man/form_new_page.3x.html | 109 + .../ncurses/doc/html/man/form_opts.3x.html | 125 + .../ncurses/doc/html/man/form_page.3x.html | 137 + .../ncurses/doc/html/man/form_post.3x.html | 126 + .../doc/html/man/form_requestname.3x.html | 106 + .../ncurses/doc/html/man/form_userptr.3x.html | 106 + .../doc/html/man/form_variables.3x.html | 133 + contrib/ncurses/doc/html/man/form_win.3x.html | 131 + contrib/ncurses/doc/html/man/index.html | 127 + contrib/ncurses/doc/html/man/infocmp.1m.html | 557 + .../ncurses/doc/html/man/infotocap.1m.html | 107 + .../ncurses/doc/html/man/key_defined.3x.html | 105 + contrib/ncurses/doc/html/man/keybound.3x.html | 112 + contrib/ncurses/doc/html/man/keyok.3x.html | 115 + .../doc/html/man/legacy_coding.3x.html | 124 + contrib/ncurses/doc/html/man/menu.3x.html | 243 + .../doc/html/man/menu_attributes.3x.html | 133 + .../ncurses/doc/html/man/menu_cursor.3x.html | 110 + .../ncurses/doc/html/man/menu_driver.3x.html | 245 + .../ncurses/doc/html/man/menu_format.3x.html | 123 + .../ncurses/doc/html/man/menu_hook.3x.html | 134 + .../ncurses/doc/html/man/menu_items.3x.html | 128 + .../ncurses/doc/html/man/menu_mark.3x.html | 121 + contrib/ncurses/doc/html/man/menu_new.3x.html | 121 + .../ncurses/doc/html/man/menu_opts.3x.html | 145 + .../ncurses/doc/html/man/menu_pattern.3x.html | 126 + .../ncurses/doc/html/man/menu_post.3x.html | 128 + .../doc/html/man/menu_requestname.3x.html | 106 + .../ncurses/doc/html/man/menu_spacing.3x.html | 130 + .../ncurses/doc/html/man/menu_userptr.3x.html | 106 + contrib/ncurses/doc/html/man/menu_win.3x.html | 131 + .../doc/html/man/mitem_current.3x.html | 136 + .../ncurses/doc/html/man/mitem_name.3x.html | 100 + .../ncurses/doc/html/man/mitem_new.3x.html | 124 + .../ncurses/doc/html/man/mitem_opts.3x.html | 119 + .../doc/html/man/mitem_userptr.3x.html | 106 + .../ncurses/doc/html/man/mitem_value.3x.html | 111 + .../doc/html/man/mitem_visible.3x.html | 93 + contrib/ncurses/doc/html/man/ncurses.3x.html | 1559 + .../doc/html/man/ncursesw6-config.1.html | 127 + contrib/ncurses/doc/html/man/new_pair.3x.html | 188 + contrib/ncurses/doc/html/man/panel.3x.html | 306 + .../ncurses/doc/html/man/resizeterm.3x.html | 217 + contrib/ncurses/doc/html/man/scr_dump.5.html | 419 + contrib/ncurses/doc/html/man/tabs.1.html | 283 + contrib/ncurses/doc/html/man/term.5.html | 429 + contrib/ncurses/doc/html/man/term.7.html | 231 + .../doc/html/man/term_variables.3x.html | 200 + contrib/ncurses/doc/html/man/terminfo.5.html | 2534 ++ contrib/ncurses/doc/html/man/tic.1m.html | 512 + contrib/ncurses/doc/html/man/toe.1m.html | 204 + contrib/ncurses/doc/html/man/tput.1.html | 586 + contrib/ncurses/doc/html/man/tset.1.html | 421 + contrib/ncurses/doc/html/man/user_caps.5.html | 425 + contrib/ncurses/doc/html/man/wresize.3x.html | 129 + contrib/ncurses/doc/html/ncurses-intro.html | 3390 ++ contrib/ncurses/doc/ncurses-intro.doc | 2518 ++ contrib/ncurses/form/Makefile.in | 212 + contrib/ncurses/form/READ.ME | 43 + contrib/ncurses/form/f_trace.c | 72 + contrib/ncurses/form/fld_arg.c | 104 + contrib/ncurses/form/fld_attr.c | 120 + contrib/ncurses/form/fld_current.c | 164 + contrib/ncurses/form/fld_def.c | 399 + contrib/ncurses/form/fld_dup.c | 101 + contrib/ncurses/form/fld_ftchoice.c | 76 + contrib/ncurses/form/fld_ftlink.c | 88 + contrib/ncurses/form/fld_info.c | 114 + contrib/ncurses/form/fld_just.c | 87 + contrib/ncurses/form/fld_link.c | 97 + contrib/ncurses/form/fld_max.c | 83 + contrib/ncurses/form/fld_move.c | 65 + contrib/ncurses/form/fld_newftyp.c | 149 + contrib/ncurses/form/fld_opts.c | 139 + contrib/ncurses/form/fld_pad.c | 86 + contrib/ncurses/form/fld_page.c | 83 + contrib/ncurses/form/fld_stat.c | 80 + contrib/ncurses/form/fld_type.c | 98 + contrib/ncurses/form/fld_user.c | 73 + contrib/ncurses/form/form.h | 460 + contrib/ncurses/form/form.priv.h | 308 + contrib/ncurses/form/frm_cursor.c | 71 + contrib/ncurses/form/frm_data.c | 193 + contrib/ncurses/form/frm_def.c | 451 + contrib/ncurses/form/frm_driver.c | 5011 +++ contrib/ncurses/form/frm_hook.c | 144 + contrib/ncurses/form/frm_opts.c | 128 + contrib/ncurses/form/frm_page.c | 107 + contrib/ncurses/form/frm_post.c | 125 + contrib/ncurses/form/frm_req_name.c | 179 + contrib/ncurses/form/frm_scale.c | 70 + contrib/ncurses/form/frm_sub.c | 84 + contrib/ncurses/form/frm_user.c | 73 + contrib/ncurses/form/frm_win.c | 91 + contrib/ncurses/form/fty_alnum.c | 203 + contrib/ncurses/form/fty_alpha.c | 203 + contrib/ncurses/form/fty_enum.c | 444 + contrib/ncurses/form/fty_generic.c | 305 + contrib/ncurses/form/fty_int.c | 298 + contrib/ncurses/form/fty_ipv4.c | 121 + contrib/ncurses/form/fty_num.c | 344 + contrib/ncurses/form/fty_regex.c | 388 + contrib/ncurses/form/headers | 33 + contrib/ncurses/form/llib-lform | 847 + contrib/ncurses/form/llib-lformt | 847 + contrib/ncurses/form/llib-lformtw | 860 + contrib/ncurses/form/llib-lformw | 860 + contrib/ncurses/form/modules | 79 + contrib/ncurses/include/Caps | 1024 + contrib/ncurses/include/Caps-ncurses | 478 + contrib/ncurses/include/Caps.aix4 | 1126 + contrib/ncurses/include/Caps.hpux11 | 1039 + contrib/ncurses/include/Caps.keys | 1116 + contrib/ncurses/include/Caps.osf1r5 | 1031 + contrib/ncurses/include/Caps.uwin | 837 + contrib/ncurses/include/MKhashsize.sh | 43 + contrib/ncurses/include/MKkey_defs.sh | 197 + contrib/ncurses/include/MKncurses_def.sh | 81 + contrib/ncurses/include/MKparametrized.sh | 75 + contrib/ncurses/include/MKterm.h.awk.in | 413 + contrib/ncurses/include/Makefile.in | 177 + contrib/ncurses/include/capdefaults.c | 87 + contrib/ncurses/include/curses.events | 55 + contrib/ncurses/include/curses.h.in | 1535 + contrib/ncurses/include/curses.tail | 197 + contrib/ncurses/include/curses.wide | 314 + contrib/ncurses/include/edit_cfg.sh | 69 + contrib/ncurses/include/hashed_db.h | 72 + contrib/ncurses/include/headers | 53 + contrib/ncurses/include/nc_access.h | 80 + contrib/ncurses/include/nc_alloc.h | 127 + contrib/ncurses/include/nc_mingw.h | 92 + contrib/ncurses/include/nc_panel.h | 80 + contrib/ncurses/include/nc_string.h | 90 + contrib/ncurses/include/nc_termios.h | 168 + contrib/ncurses/include/nc_tparm.h | 93 + contrib/ncurses/include/nc_win32.h | 189 + contrib/ncurses/include/ncurses_cfg.hin | 74 + contrib/ncurses/include/ncurses_defs | 279 + contrib/ncurses/include/ncurses_dll.h.in | 103 + contrib/ncurses/include/ncurses_mingw.h | 82 + contrib/ncurses/include/term_entry.h | 220 + contrib/ncurses/include/termcap.h.in | 73 + contrib/ncurses/include/tic.h | 379 + contrib/ncurses/include/unctrl.h.in | 68 + contrib/ncurses/include/win32_curses.h | 72 + contrib/ncurses/install-sh | 541 + contrib/ncurses/man/MKada_config.in | 149 + contrib/ncurses/man/MKncu_config.in | 104 + contrib/ncurses/man/MKterminfo.sh | 123 + contrib/ncurses/man/Makefile.in | 107 + contrib/ncurses/man/captoinfo.1m | 234 + contrib/ncurses/man/clear.1 | 186 + contrib/ncurses/man/curs_add_wch.3x | 563 + contrib/ncurses/man/curs_add_wchstr.3x | 172 + contrib/ncurses/man/curs_addch.3x | 505 + contrib/ncurses/man/curs_addchstr.3x | 157 + contrib/ncurses/man/curs_addstr.3x | 154 + contrib/ncurses/man/curs_addwstr.3x | 161 + contrib/ncurses/man/curs_attr.3x | 716 + contrib/ncurses/man/curs_beep.3x | 110 + contrib/ncurses/man/curs_bkgd.3x | 233 + contrib/ncurses/man/curs_bkgrnd.3x | 223 + contrib/ncurses/man/curs_border.3x | 163 + contrib/ncurses/man/curs_border_set.3x | 205 + contrib/ncurses/man/curs_clear.3x | 139 + contrib/ncurses/man/curs_color.3x | 591 + contrib/ncurses/man/curs_delch.3x | 119 + contrib/ncurses/man/curs_deleteln.3x | 148 + contrib/ncurses/man/curs_extend.3x | 128 + contrib/ncurses/man/curs_get_wch.3x | 263 + contrib/ncurses/man/curs_get_wstr.3x | 228 + contrib/ncurses/man/curs_getcchar.3x | 188 + contrib/ncurses/man/curs_getch.3x | 726 + contrib/ncurses/man/curs_getstr.3x | 494 + contrib/ncurses/man/curs_getyx.3x | 160 + contrib/ncurses/man/curs_in_wch.3x | 131 + contrib/ncurses/man/curs_in_wchstr.3x | 133 + contrib/ncurses/man/curs_inch.3x | 170 + contrib/ncurses/man/curs_inchstr.3x | 136 + contrib/ncurses/man/curs_initscr.3x | 489 + contrib/ncurses/man/curs_inopts.3x | 815 + contrib/ncurses/man/curs_ins_wch.3x | 126 + contrib/ncurses/man/curs_ins_wstr.3x | 199 + contrib/ncurses/man/curs_insch.3x | 118 + contrib/ncurses/man/curs_insstr.3x | 188 + contrib/ncurses/man/curs_instr.3x | 223 + contrib/ncurses/man/curs_inwstr.3x | 231 + contrib/ncurses/man/curs_kernel.3x | 424 + contrib/ncurses/man/curs_legacy.3x | 120 + contrib/ncurses/man/curs_memleaks.3x | 131 + contrib/ncurses/man/curs_mouse.3x | 528 + contrib/ncurses/man/curs_move.3x | 111 + contrib/ncurses/man/curs_opaque.3x | 161 + contrib/ncurses/man/curs_outopts.3x | 233 + contrib/ncurses/man/curs_overlay.3x | 99 + contrib/ncurses/man/curs_pad.3x | 302 + contrib/ncurses/man/curs_print.3x | 138 + contrib/ncurses/man/curs_printw.3x | 205 + contrib/ncurses/man/curs_refresh.3x | 168 + contrib/ncurses/man/curs_scanw.3x | 255 + contrib/ncurses/man/curs_scr_dump.3x | 236 + contrib/ncurses/man/curs_scroll.3x | 167 + contrib/ncurses/man/curs_slk.3x | 386 + contrib/ncurses/man/curs_sp_funcs.3x | 284 + contrib/ncurses/man/curs_termattrs.3x | 129 + contrib/ncurses/man/curs_termcap.3x | 691 + contrib/ncurses/man/curs_terminfo.3x | 1109 + contrib/ncurses/man/curs_threads.3x | 638 + contrib/ncurses/man/curs_touch.3x | 125 + contrib/ncurses/man/curs_trace.3x | 301 + contrib/ncurses/man/curs_util.3x | 535 + contrib/ncurses/man/curs_variables.3x | 375 + contrib/ncurses/man/curs_window.3x | 288 + contrib/ncurses/man/default_colors.3x | 153 + contrib/ncurses/man/define_key.3x | 129 + contrib/ncurses/man/form.3x | 246 + contrib/ncurses/man/form_cursor.3x | 71 + contrib/ncurses/man/form_data.3x | 61 + contrib/ncurses/man/form_driver.3x | 265 + contrib/ncurses/man/form_field.3x | 91 + contrib/ncurses/man/form_field_attributes.3x | 97 + contrib/ncurses/man/form_field_buffer.3x | 147 + contrib/ncurses/man/form_field_info.3x | 95 + contrib/ncurses/man/form_field_just.3x | 82 + contrib/ncurses/man/form_field_new.3x | 104 + contrib/ncurses/man/form_field_opts.3x | 146 + contrib/ncurses/man/form_field_userptr.3x | 65 + contrib/ncurses/man/form_field_validation.3x | 209 + contrib/ncurses/man/form_fieldtype.3x | 163 + contrib/ncurses/man/form_hook.3x | 97 + contrib/ncurses/man/form_new.3x | 84 + contrib/ncurses/man/form_new_page.3x | 78 + contrib/ncurses/man/form_opts.3x | 86 + contrib/ncurses/man/form_page.3x | 98 + contrib/ncurses/man/form_post.3x | 86 + contrib/ncurses/man/form_requestname.3x | 66 + contrib/ncurses/man/form_userptr.3x | 64 + contrib/ncurses/man/form_variables.3x | 77 + contrib/ncurses/man/form_win.3x | 92 + contrib/ncurses/man/infocmp.1m | 700 + contrib/ncurses/man/infotocap.1m | 96 + contrib/ncurses/man/key_defined.3x | 85 + contrib/ncurses/man/keybound.3x | 104 + contrib/ncurses/man/keyok.3x | 111 + contrib/ncurses/man/legacy_coding.3x | 109 + contrib/ncurses/man/make_sed.sh | 95 + contrib/ncurses/man/man_db.renames.in | 316 + contrib/ncurses/man/manhtml.aliases | 146 + contrib/ncurses/man/manhtml.externs | 88 + contrib/ncurses/man/manlinks.sed | 118 + contrib/ncurses/man/menu.3x | 215 + contrib/ncurses/man/menu_attributes.3x | 113 + contrib/ncurses/man/menu_cursor.3x | 69 + contrib/ncurses/man/menu_driver.3x | 205 + contrib/ncurses/man/menu_format.3x | 86 + contrib/ncurses/man/menu_hook.3x | 97 + contrib/ncurses/man/menu_items.3x | 87 + contrib/ncurses/man/menu_mark.3x | 82 + contrib/ncurses/man/menu_new.3x | 81 + contrib/ncurses/man/menu_opts.3x | 106 + contrib/ncurses/man/menu_pattern.3x | 91 + contrib/ncurses/man/menu_post.3x | 89 + contrib/ncurses/man/menu_requestname.3x | 67 + contrib/ncurses/man/menu_spacing.3x | 94 + contrib/ncurses/man/menu_userptr.3x | 64 + contrib/ncurses/man/menu_win.3x | 92 + contrib/ncurses/man/mitem_current.3x | 98 + contrib/ncurses/man/mitem_name.3x | 59 + contrib/ncurses/man/mitem_new.3x | 89 + contrib/ncurses/man/mitem_opts.3x | 81 + contrib/ncurses/man/mitem_userptr.3x | 65 + contrib/ncurses/man/mitem_value.3x | 72 + contrib/ncurses/man/mitem_visible.3x | 54 + contrib/ncurses/man/ncurses.3x | 2359 ++ contrib/ncurses/man/new_pair.3x | 166 + contrib/ncurses/man/panel.3x | 293 + contrib/ncurses/man/resizeterm.3x | 180 + contrib/ncurses/man/scr_dump.5 | 476 + contrib/ncurses/man/tabs.1 | 360 + contrib/ncurses/man/term.5 | 578 + contrib/ncurses/man/term.7 | 237 + contrib/ncurses/man/term_variables.3x | 181 + contrib/ncurses/man/terminfo.head | 226 + contrib/ncurses/man/terminfo.tail | 2128 ++ contrib/ncurses/man/tic.1m | 622 + contrib/ncurses/man/toe.1m | 241 + contrib/ncurses/man/tput.1 | 1012 + contrib/ncurses/man/tset.1 | 466 + contrib/ncurses/man/user_caps.5 | 469 + contrib/ncurses/man/wresize.3x | 131 + contrib/ncurses/menu/Makefile.in | 214 + contrib/ncurses/menu/READ.ME | 43 + contrib/ncurses/menu/eti.h | 55 + contrib/ncurses/menu/headers | 34 + contrib/ncurses/menu/llib-lmenu | 552 + contrib/ncurses/menu/llib-lmenut | 552 + contrib/ncurses/menu/llib-lmenutw | 552 + contrib/ncurses/menu/llib-lmenuw | 552 + contrib/ncurses/menu/m_attribs.c | 145 + contrib/ncurses/menu/m_cursor.c | 113 + contrib/ncurses/menu/m_driver.c | 571 + contrib/ncurses/menu/m_format.c | 133 + contrib/ncurses/menu/m_global.c | 601 + contrib/ncurses/menu/m_hook.c | 153 + contrib/ncurses/menu/m_item_cur.c | 114 + contrib/ncurses/menu/m_item_nam.c | 73 + contrib/ncurses/menu/m_item_new.c | 277 + contrib/ncurses/menu/m_item_opt.c | 160 + contrib/ncurses/menu/m_item_top.c | 108 + contrib/ncurses/menu/m_item_use.c | 77 + contrib/ncurses/menu/m_item_val.c | 103 + contrib/ncurses/menu/m_item_vis.c | 69 + contrib/ncurses/menu/m_items.c | 111 + contrib/ncurses/menu/m_new.c | 144 + contrib/ncurses/menu/m_opts.c | 184 + contrib/ncurses/menu/m_pad.c | 96 + contrib/ncurses/menu/m_pattern.c | 125 + contrib/ncurses/menu/m_post.c | 384 + contrib/ncurses/menu/m_req_name.c | 132 + contrib/ncurses/menu/m_scale.c | 77 + contrib/ncurses/menu/m_spacing.c | 114 + contrib/ncurses/menu/m_sub.c | 101 + contrib/ncurses/menu/m_trace.c | 79 + contrib/ncurses/menu/m_userptr.c | 77 + contrib/ncurses/menu/m_win.c | 101 + contrib/ncurses/menu/menu.h | 281 + contrib/ncurses/menu/menu.priv.h | 161 + contrib/ncurses/menu/mf_common.h | 98 + contrib/ncurses/menu/modules | 64 + contrib/ncurses/misc/Makefile.in | 232 + contrib/ncurses/misc/chkdef.cmd | 115 + contrib/ncurses/misc/cleantic.cmd | 45 + contrib/ncurses/misc/cmpdef.cmd | 135 + contrib/ncurses/misc/csort | 37 + contrib/ncurses/misc/emx.src | 886 + contrib/ncurses/misc/form.def | 101 + contrib/ncurses/misc/form.ref | 106 + contrib/ncurses/misc/gen-pkgconfig.in | 251 + contrib/ncurses/misc/gen_edit.sh | 119 + contrib/ncurses/misc/magic | 91 + contrib/ncurses/misc/makedef.cmd | 180 + contrib/ncurses/misc/makellib | 168 + contrib/ncurses/misc/menu.def | 81 + contrib/ncurses/misc/menu.ref | 73 + contrib/ncurses/misc/ncu2openbsd | 1288 + contrib/ncurses/misc/ncurses-config.in | 383 + contrib/ncurses/misc/ncurses.def | 447 + contrib/ncurses/misc/ncurses.ref | 572 + contrib/ncurses/misc/ncurses.supp | 206 + contrib/ncurses/misc/panel.def | 20 + contrib/ncurses/misc/panel.ref | 18 + contrib/ncurses/misc/run_tic.in | 213 + contrib/ncurses/misc/shlib | 142 + contrib/ncurses/misc/tabset/std | 1 + contrib/ncurses/misc/tabset/stdcrt | 1 + contrib/ncurses/misc/tabset/vt100 | 3 + contrib/ncurses/misc/tabset/vt300 | 3 + contrib/ncurses/misc/tdlint | 114 + contrib/ncurses/misc/terminfo.src | 27733 ++++++++++++++ contrib/ncurses/mk-0th.awk | 175 + contrib/ncurses/mk-1st.awk | 608 + contrib/ncurses/mk-2nd.awk | 154 + contrib/ncurses/mk-hdr.awk | 115 + contrib/ncurses/ncurses/Makefile.in | 384 + contrib/ncurses/ncurses/README | 51 + contrib/ncurses/ncurses/README.IZ | 96 + contrib/ncurses/ncurses/SigAction.h | 110 + contrib/ncurses/ncurses/base/MKkeyname.awk | 178 + contrib/ncurses/ncurses/base/MKlib_gen.sh | 565 + contrib/ncurses/ncurses/base/MKunctrl.awk | 177 + contrib/ncurses/ncurses/base/README | 36 + contrib/ncurses/ncurses/base/define_key.c | 86 + contrib/ncurses/ncurses/base/key_defined.c | 88 + contrib/ncurses/ncurses/base/keybound.c | 64 + contrib/ncurses/ncurses/base/keyok.c | 103 + contrib/ncurses/ncurses/base/legacy_coding.c | 58 + contrib/ncurses/ncurses/base/lib_addch.c | 602 + contrib/ncurses/ncurses/base/lib_addstr.c | 259 + contrib/ncurses/ncurses/base/lib_beep.c | 91 + contrib/ncurses/ncurses/base/lib_bkgd.c | 273 + contrib/ncurses/ncurses/base/lib_box.c | 140 + contrib/ncurses/ncurses/base/lib_chgat.c | 80 + contrib/ncurses/ncurses/base/lib_clear.c | 57 + contrib/ncurses/ncurses/base/lib_clearok.c | 56 + contrib/ncurses/ncurses/base/lib_clrbot.c | 77 + contrib/ncurses/ncurses/base/lib_clreol.c | 92 + contrib/ncurses/ncurses/base/lib_color.c | 1166 + contrib/ncurses/ncurses/base/lib_colorset.c | 65 + contrib/ncurses/ncurses/base/lib_delch.c | 70 + contrib/ncurses/ncurses/base/lib_delwin.c | 103 + contrib/ncurses/ncurses/base/lib_dft_fgbg.c | 104 + contrib/ncurses/ncurses/base/lib_driver.c | 148 + contrib/ncurses/ncurses/base/lib_echo.c | 84 + contrib/ncurses/ncurses/base/lib_endwin.c | 84 + contrib/ncurses/ncurses/base/lib_erase.c | 97 + contrib/ncurses/ncurses/base/lib_flash.c | 88 + contrib/ncurses/ncurses/base/lib_freeall.c | 201 + contrib/ncurses/ncurses/base/lib_getch.c | 802 + contrib/ncurses/ncurses/base/lib_getstr.c | 221 + contrib/ncurses/ncurses/base/lib_hline.c | 89 + contrib/ncurses/ncurses/base/lib_immedok.c | 55 + contrib/ncurses/ncurses/base/lib_inchstr.c | 69 + contrib/ncurses/ncurses/base/lib_initscr.c | 110 + contrib/ncurses/ncurses/base/lib_insch.c | 165 + contrib/ncurses/ncurses/base/lib_insdel.c | 64 + contrib/ncurses/ncurses/base/lib_insnstr.c | 96 + contrib/ncurses/ncurses/base/lib_instr.c | 122 + contrib/ncurses/ncurses/base/lib_isendwin.c | 62 + contrib/ncurses/ncurses/base/lib_leaveok.c | 56 + contrib/ncurses/ncurses/base/lib_mouse.c | 2099 + contrib/ncurses/ncurses/base/lib_move.c | 61 + contrib/ncurses/ncurses/base/lib_mvwin.c | 121 + contrib/ncurses/ncurses/base/lib_newterm.c | 376 + contrib/ncurses/ncurses/base/lib_newwin.c | 399 + contrib/ncurses/ncurses/base/lib_nl.c | 96 + contrib/ncurses/ncurses/base/lib_overlay.c | 223 + contrib/ncurses/ncurses/base/lib_pad.c | 349 + contrib/ncurses/ncurses/base/lib_printw.c | 167 + contrib/ncurses/ncurses/base/lib_redrawln.c | 88 + contrib/ncurses/ncurses/base/lib_refresh.c | 307 + contrib/ncurses/ncurses/base/lib_restart.c | 115 + contrib/ncurses/ncurses/base/lib_scanw.c | 126 + contrib/ncurses/ncurses/base/lib_screen.c | 1086 + contrib/ncurses/ncurses/base/lib_scroll.c | 153 + contrib/ncurses/ncurses/base/lib_scrollok.c | 56 + contrib/ncurses/ncurses/base/lib_scrreg.c | 61 + contrib/ncurses/ncurses/base/lib_set_term.c | 867 + contrib/ncurses/ncurses/base/lib_slk.c | 254 + contrib/ncurses/ncurses/base/lib_slkatr_set.c | 81 + contrib/ncurses/ncurses/base/lib_slkatrof.c | 67 + contrib/ncurses/ncurses/base/lib_slkatron.c | 67 + contrib/ncurses/ncurses/base/lib_slkatrset.c | 62 + contrib/ncurses/ncurses/base/lib_slkattr.c | 65 + contrib/ncurses/ncurses/base/lib_slkclear.c | 75 + contrib/ncurses/ncurses/base/lib_slkcolor.c | 91 + contrib/ncurses/ncurses/base/lib_slkinit.c | 89 + contrib/ncurses/ncurses/base/lib_slklab.c | 62 + contrib/ncurses/ncurses/base/lib_slkrefr.c | 188 + contrib/ncurses/ncurses/base/lib_slkset.c | 157 + contrib/ncurses/ncurses/base/lib_slktouch.c | 62 + contrib/ncurses/ncurses/base/lib_touch.c | 98 + contrib/ncurses/ncurses/base/lib_ungetch.c | 94 + contrib/ncurses/ncurses/base/lib_vline.c | 89 + contrib/ncurses/ncurses/base/lib_wattroff.c | 65 + contrib/ncurses/ncurses/base/lib_wattron.c | 67 + contrib/ncurses/ncurses/base/lib_winch.c | 55 + contrib/ncurses/ncurses/base/lib_window.c | 254 + contrib/ncurses/ncurses/base/nc_panel.c | 54 + contrib/ncurses/ncurses/base/new_pair.c | 393 + contrib/ncurses/ncurses/base/resizeterm.c | 541 + contrib/ncurses/ncurses/base/safe_sprintf.c | 299 + contrib/ncurses/ncurses/base/sigaction.c | 100 + contrib/ncurses/ncurses/base/tries.c | 147 + contrib/ncurses/ncurses/base/use_window.c | 54 + contrib/ncurses/ncurses/base/version.c | 43 + contrib/ncurses/ncurses/base/vsscanf.c | 354 + contrib/ncurses/ncurses/base/wresize.c | 279 + contrib/ncurses/ncurses/build.priv.h | 108 + contrib/ncurses/ncurses/curses.priv.h | 2691 ++ contrib/ncurses/ncurses/fifo_defs.h | 86 + contrib/ncurses/ncurses/llib-lncurses | 4506 +++ contrib/ncurses/ncurses/llib-lncursest | 4627 +++ contrib/ncurses/ncurses/llib-lncursestw | 5628 +++ contrib/ncurses/ncurses/llib-lncursesw | 5507 +++ contrib/ncurses/ncurses/llib-ltic | 203 + contrib/ncurses/ncurses/llib-ltict | 203 + contrib/ncurses/ncurses/llib-ltictw | 203 + contrib/ncurses/ncurses/llib-lticw | 203 + contrib/ncurses/ncurses/llib-ltinfo | 1607 + contrib/ncurses/ncurses/llib-ltinfot | 1719 + contrib/ncurses/ncurses/llib-ltinfotw | 1781 + contrib/ncurses/ncurses/llib-ltinfow | 1669 + contrib/ncurses/ncurses/modules | 253 + contrib/ncurses/ncurses/new_pair.h | 139 + contrib/ncurses/ncurses/report_hashing.c | 73 + contrib/ncurses/ncurses/report_offsets.c | 274 + contrib/ncurses/ncurses/term.priv.h | 364 + contrib/ncurses/ncurses/tinfo/MKcaptab.awk | 95 + contrib/ncurses/ncurses/tinfo/MKcaptab.sh | 236 + contrib/ncurses/ncurses/tinfo/MKcodes.awk | 176 + contrib/ncurses/ncurses/tinfo/MKfallback.sh | 167 + contrib/ncurses/ncurses/tinfo/MKkeys_list.sh | 71 + contrib/ncurses/ncurses/tinfo/MKnames.awk | 203 + contrib/ncurses/ncurses/tinfo/MKuserdefs.sh | 146 + contrib/ncurses/ncurses/tinfo/README | 37 + contrib/ncurses/ncurses/tinfo/access.c | 319 + contrib/ncurses/ncurses/tinfo/add_tries.c | 124 + contrib/ncurses/ncurses/tinfo/alloc_entry.c | 414 + contrib/ncurses/ncurses/tinfo/alloc_ttype.c | 713 + contrib/ncurses/ncurses/tinfo/captoinfo.c | 1058 + contrib/ncurses/ncurses/tinfo/comp_error.c | 173 + contrib/ncurses/ncurses/tinfo/comp_expand.c | 227 + contrib/ncurses/ncurses/tinfo/comp_hash.c | 151 + contrib/ncurses/ncurses/tinfo/comp_parse.c | 772 + contrib/ncurses/ncurses/tinfo/comp_scan.c | 1063 + contrib/ncurses/ncurses/tinfo/db_iterator.c | 460 + contrib/ncurses/ncurses/tinfo/doalloc.c | 62 + contrib/ncurses/ncurses/tinfo/entries.c | 194 + contrib/ncurses/ncurses/tinfo/free_ttype.c | 105 + contrib/ncurses/ncurses/tinfo/getenv_num.c | 76 + contrib/ncurses/ncurses/tinfo/hashed_db.c | 342 + contrib/ncurses/ncurses/tinfo/home_terminfo.c | 67 + contrib/ncurses/ncurses/tinfo/init_keytry.c | 114 + contrib/ncurses/ncurses/tinfo/lib_acs.c | 326 + contrib/ncurses/ncurses/tinfo/lib_baudrate.c | 317 + contrib/ncurses/ncurses/tinfo/lib_cur_term.c | 200 + contrib/ncurses/ncurses/tinfo/lib_data.c | 405 + contrib/ncurses/ncurses/tinfo/lib_has_cap.c | 95 + contrib/ncurses/ncurses/tinfo/lib_kernel.c | 201 + contrib/ncurses/ncurses/tinfo/lib_longname.c | 104 + contrib/ncurses/ncurses/tinfo/lib_napms.c | 97 + contrib/ncurses/ncurses/tinfo/lib_options.c | 378 + contrib/ncurses/ncurses/tinfo/lib_print.c | 114 + contrib/ncurses/ncurses/tinfo/lib_raw.c | 431 + contrib/ncurses/ncurses/tinfo/lib_setup.c | 1210 + contrib/ncurses/ncurses/tinfo/lib_termcap.c | 429 + contrib/ncurses/ncurses/tinfo/lib_termname.c | 59 + contrib/ncurses/ncurses/tinfo/lib_tgoto.c | 222 + contrib/ncurses/ncurses/tinfo/lib_ti.c | 188 + contrib/ncurses/ncurses/tinfo/lib_tparm.c | 1408 + contrib/ncurses/ncurses/tinfo/lib_tputs.c | 460 + contrib/ncurses/ncurses/tinfo/lib_ttyflags.c | 330 + contrib/ncurses/ncurses/tinfo/lib_win32con.c | 1252 + contrib/ncurses/ncurses/tinfo/lib_win32util.c | 134 + contrib/ncurses/ncurses/tinfo/make_hash.c | 445 + contrib/ncurses/ncurses/tinfo/make_keys.c | 167 + contrib/ncurses/ncurses/tinfo/name_match.c | 126 + contrib/ncurses/ncurses/tinfo/obsolete.c | 335 + contrib/ncurses/ncurses/tinfo/parse_entry.c | 1158 + contrib/ncurses/ncurses/tinfo/read_entry.c | 933 + contrib/ncurses/ncurses/tinfo/read_termcap.c | 1202 + contrib/ncurses/ncurses/tinfo/strings.c | 144 + contrib/ncurses/ncurses/tinfo/tinfo_driver.c | 1554 + contrib/ncurses/ncurses/tinfo/trim_sgr0.c | 335 + contrib/ncurses/ncurses/tinfo/use_screen.c | 63 + contrib/ncurses/ncurses/tinfo/write_entry.c | 967 + contrib/ncurses/ncurses/trace/README | 34 + contrib/ncurses/ncurses/trace/lib_trace.c | 459 + contrib/ncurses/ncurses/trace/lib_traceatr.c | 418 + contrib/ncurses/ncurses/trace/lib_tracebits.c | 303 + contrib/ncurses/ncurses/trace/lib_tracechr.c | 90 + contrib/ncurses/ncurses/trace/lib_tracedmp.c | 187 + contrib/ncurses/ncurses/trace/lib_tracemse.c | 158 + contrib/ncurses/ncurses/trace/trace_buf.c | 125 + contrib/ncurses/ncurses/trace/trace_tries.c | 82 + contrib/ncurses/ncurses/trace/trace_xnames.c | 79 + contrib/ncurses/ncurses/trace/varargs.c | 190 + contrib/ncurses/ncurses/trace/visbuf.c | 380 + contrib/ncurses/ncurses/tty/MKexpanded.sh | 136 + contrib/ncurses/ncurses/tty/hardscroll.c | 386 + contrib/ncurses/ncurses/tty/hashmap.c | 594 + contrib/ncurses/ncurses/tty/lib_mvcur.c | 1435 + contrib/ncurses/ncurses/tty/lib_tstp.c | 428 + contrib/ncurses/ncurses/tty/lib_twait.c | 523 + contrib/ncurses/ncurses/tty/lib_vidattr.c | 433 + contrib/ncurses/ncurses/tty/tty_update.c | 2292 ++ contrib/ncurses/ncurses/wcwidth.h | 820 + contrib/ncurses/ncurses/widechar/charable.c | 85 + .../ncurses/ncurses/widechar/lib_add_wch.c | 450 + .../ncurses/ncurses/widechar/lib_box_set.c | 114 + contrib/ncurses/ncurses/widechar/lib_cchar.c | 158 + .../ncurses/ncurses/widechar/lib_erasewchar.c | 96 + .../ncurses/ncurses/widechar/lib_get_wch.c | 121 + .../ncurses/ncurses/widechar/lib_get_wstr.c | 227 + .../ncurses/ncurses/widechar/lib_hline_set.c | 78 + contrib/ncurses/ncurses/widechar/lib_in_wch.c | 65 + .../ncurses/ncurses/widechar/lib_in_wchnstr.c | 77 + .../ncurses/ncurses/widechar/lib_ins_wch.c | 153 + contrib/ncurses/ncurses/widechar/lib_inwstr.c | 107 + .../ncurses/ncurses/widechar/lib_key_name.c | 67 + .../ncurses/widechar/lib_pecho_wchar.c | 58 + .../ncurses/ncurses/widechar/lib_slk_wset.c | 78 + .../ncurses/ncurses/widechar/lib_unget_wch.c | 115 + .../ncurses/ncurses/widechar/lib_vid_attr.c | 369 + .../ncurses/ncurses/widechar/lib_vline_set.c | 78 + contrib/ncurses/ncurses/widechar/lib_wacs.c | 148 + .../ncurses/ncurses/widechar/lib_wunctrl.c | 72 + contrib/ncurses/ncurses/widechar/widechars.c | 153 + .../ncurses/ncurses/win32con/gettimeofday.c | 57 + contrib/ncurses/ncurses/win32con/wcwidth.c | 52 + .../ncurses/ncurses/win32con/win32_driver.c | 1225 + contrib/ncurses/ncurses/win32con/win_driver.c | 2281 ++ .../ncurses/package/debian-mingw/changelog | 11 + contrib/ncurses/package/debian-mingw/compat | 1 + contrib/ncurses/package/debian-mingw/control | 22 + .../ncurses/package/debian-mingw/copyright | 100 + .../mingw32-ncurses6td.lintian-overrides | 7 + contrib/ncurses/package/debian-mingw/rules | 150 + .../package/debian-mingw/source/format | 1 + contrib/ncurses/package/debian-mingw/watch | 4 + .../ncurses/package/debian-mingw64/changelog | 11 + contrib/ncurses/package/debian-mingw64/compat | 1 + .../ncurses/package/debian-mingw64/control | 22 + .../ncurses/package/debian-mingw64/copyright | 100 + .../mingw64-ncurses6td.lintian-overrides | 7 + contrib/ncurses/package/debian-mingw64/rules | 150 + .../package/debian-mingw64/source/format | 1 + contrib/ncurses/package/debian-mingw64/watch | 4 + contrib/ncurses/package/debian/changelog | 11 + contrib/ncurses/package/debian/compat | 1 + contrib/ncurses/package/debian/control | 56 + contrib/ncurses/package/debian/copyright | 100 + .../debian/ncurses6td.lintian-overrides | 9 + .../package/debian/ncurses6td.triggers | 1 + .../debian/ncursest6td.lintian-overrides | 9 + .../package/debian/ncursest6td.triggers | 1 + contrib/ncurses/package/debian/rules | 289 + contrib/ncurses/package/debian/source/format | 1 + contrib/ncurses/package/debian/watch | 4 + contrib/ncurses/package/mingw-ncurses.nsi | 190 + contrib/ncurses/package/mingw-ncurses.spec | 163 + contrib/ncurses/package/ncurses.map | 1233 + contrib/ncurses/package/ncurses.spec | 185 + contrib/ncurses/package/ncurses.sym | 900 + contrib/ncurses/package/ncursest.map | 1199 + contrib/ncurses/package/ncursest.spec | 187 + contrib/ncurses/package/ncursest.sym | 897 + contrib/ncurses/package/ncursestw.map | 1321 + contrib/ncurses/package/ncursestw.sym | 1011 + contrib/ncurses/package/ncursesw.map | 1342 + contrib/ncurses/package/ncursesw.sym | 1008 + contrib/ncurses/panel/Makefile.in | 208 + contrib/ncurses/panel/headers | 33 + contrib/ncurses/panel/llib-lpanel | 199 + contrib/ncurses/panel/llib-lpanelt | 199 + contrib/ncurses/panel/llib-lpaneltw | 199 + contrib/ncurses/panel/llib-lpanelw | 199 + contrib/ncurses/panel/modules | 52 + contrib/ncurses/panel/p_above.c | 85 + contrib/ncurses/panel/p_below.c | 86 + contrib/ncurses/panel/p_bottom.c | 75 + contrib/ncurses/panel/p_delete.c | 61 + contrib/ncurses/panel/p_hidden.c | 55 + contrib/ncurses/panel/p_hide.c | 63 + contrib/ncurses/panel/p_move.c | 61 + contrib/ncurses/panel/p_new.c | 129 + contrib/ncurses/panel/p_replace.c | 61 + contrib/ncurses/panel/p_show.c | 73 + contrib/ncurses/panel/p_top.c | 47 + contrib/ncurses/panel/p_update.c | 79 + contrib/ncurses/panel/p_user.c | 57 + contrib/ncurses/panel/p_win.c | 47 + contrib/ncurses/panel/panel.c | 162 + contrib/ncurses/panel/panel.h | 100 + contrib/ncurses/panel/panel.priv.h | 212 + contrib/ncurses/progs/MKtermsort.sh | 186 + contrib/ncurses/progs/Makefile.in | 385 + contrib/ncurses/progs/capconvert | 260 + contrib/ncurses/progs/clear.c | 108 + contrib/ncurses/progs/clear.sh | 30 + contrib/ncurses/progs/clear_cmd.c | 60 + contrib/ncurses/progs/clear_cmd.h | 45 + contrib/ncurses/progs/dump_entry.c | 1829 + contrib/ncurses/progs/dump_entry.h | 94 + contrib/ncurses/progs/infocmp.c | 2026 + contrib/ncurses/progs/modules | 50 + contrib/ncurses/progs/progs.priv.h | 137 + contrib/ncurses/progs/reset_cmd.c | 697 + contrib/ncurses/progs/reset_cmd.h | 66 + contrib/ncurses/progs/tabs.c | 710 + contrib/ncurses/progs/tic.c | 3371 ++ contrib/ncurses/progs/toe.c | 779 + contrib/ncurses/progs/tparm_type.c | 109 + contrib/ncurses/progs/tparm_type.h | 57 + contrib/ncurses/progs/tput.c | 506 + contrib/ncurses/progs/transform.c | 80 + contrib/ncurses/progs/tset.c | 921 + contrib/ncurses/progs/tty_settings.c | 107 + contrib/ncurses/progs/tty_settings.h | 51 + contrib/ncurses/test/Makefile.in | 177 + contrib/ncurses/test/README | 858 + contrib/ncurses/test/aclocal.m4 | 5098 +++ contrib/ncurses/test/back_ground.c | 320 + contrib/ncurses/test/background.c | 264 + contrib/ncurses/test/blue.c | 542 + contrib/ncurses/test/bs.6 | 95 + contrib/ncurses/test/bs.c | 1285 + contrib/ncurses/test/bulgarian-utf8-tabs.txt | 6 + contrib/ncurses/test/bulgarian-utf8.txt | 6 + contrib/ncurses/test/cardfile.c | 635 + contrib/ncurses/test/cardfile.dat | 13 + contrib/ncurses/test/chgat.c | 407 + contrib/ncurses/test/clip_printw.c | 476 + contrib/ncurses/test/color_content.c | 324 + contrib/ncurses/test/color_name.h | 104 + contrib/ncurses/test/color_set.c | 129 + contrib/ncurses/test/combine.c | 313 + contrib/ncurses/test/configure | 25116 ++++++++++++ contrib/ncurses/test/configure.in | 541 + contrib/ncurses/test/demo_altkeys.c | 177 + contrib/ncurses/test/demo_defkey.c | 316 + contrib/ncurses/test/demo_forms.c | 651 + contrib/ncurses/test/demo_forms.txt | 20 + contrib/ncurses/test/demo_keyok.c | 123 + contrib/ncurses/test/demo_menus.c | 1063 + contrib/ncurses/test/demo_new_pair.c | 410 + contrib/ncurses/test/demo_panels.c | 834 + contrib/ncurses/test/demo_tabs.c | 127 + contrib/ncurses/test/demo_termcap.c | 933 + contrib/ncurses/test/demo_terminfo.c | 965 + contrib/ncurses/test/ditto.c | 504 + contrib/ncurses/test/dots.c | 251 + contrib/ncurses/test/dots_curses.c | 237 + contrib/ncurses/test/dots_mvcur.c | 268 + contrib/ncurses/test/dots_termcap.c | 344 + contrib/ncurses/test/dots_xcurses.c | 286 + contrib/ncurses/test/dump_window.c | 179 + contrib/ncurses/test/dump_window.h | 40 + contrib/ncurses/test/dup_field.c | 450 + contrib/ncurses/test/echochar.c | 184 + contrib/ncurses/test/edit_field.c | 438 + contrib/ncurses/test/edit_field.h | 59 + contrib/ncurses/test/escherknot.xbm | 473 + contrib/ncurses/test/extended_color.c | 260 + contrib/ncurses/test/filter.c | 435 + contrib/ncurses/test/firework.c | 241 + contrib/ncurses/test/firstlast.c | 173 + contrib/ncurses/test/foldkeys.c | 281 + contrib/ncurses/test/form_driver_w.c | 208 + contrib/ncurses/test/gdc.6 | 106 + contrib/ncurses/test/gdc.c | 490 + contrib/ncurses/test/hanoi.c | 376 + contrib/ncurses/test/hashtest.c | 254 + contrib/ncurses/test/inch_wide.c | 327 + contrib/ncurses/test/inchs.c | 331 + contrib/ncurses/test/ins_wide.c | 525 + contrib/ncurses/test/insdelln.c | 429 + contrib/ncurses/test/inserts.c | 454 + contrib/ncurses/test/key_names.c | 115 + contrib/ncurses/test/keynames.c | 104 + contrib/ncurses/test/knight.c | 964 + contrib/ncurses/test/linedata.h | 111 + contrib/ncurses/test/link2exe.sh | 2 + contrib/ncurses/test/linux-color.dat | 49 + contrib/ncurses/test/list_keys.c | 533 + contrib/ncurses/test/listused.sh | 186 + contrib/ncurses/test/lrtest.c | 214 + contrib/ncurses/test/make-tar.sh | 163 + contrib/ncurses/test/mensetmanus.xbm | 258 + contrib/ncurses/test/mini.xterm_48x48.xpm | 264 + contrib/ncurses/test/mk-test.awk | 190 + contrib/ncurses/test/modules | 126 + contrib/ncurses/test/move_field.c | 547 + contrib/ncurses/test/movewindow.c | 812 + contrib/ncurses/test/ncurses.c | 8075 ++++ contrib/ncurses/test/ncurses_tst.hin | 57 + contrib/ncurses/test/newdemo.c | 401 + .../ncurses/test/package/debian-mingw/compat | 1 + .../ncurses/test/package/debian-mingw/control | 18 + .../test/package/debian-mingw/copyright | 79 + .../ncurses/test/package/debian-mingw/docs | 1 + .../ncurses/test/package/debian-mingw/rules | 101 + .../test/package/debian-mingw/source/format | 1 + .../ncurses/test/package/debian-mingw/watch | 4 + .../test/package/debian-mingw64/compat | 1 + .../test/package/debian-mingw64/control | 18 + .../test/package/debian-mingw64/copyright | 79 + .../ncurses/test/package/debian-mingw64/docs | 1 + .../ncurses/test/package/debian-mingw64/rules | 101 + .../test/package/debian-mingw64/source/format | 1 + .../ncurses/test/package/debian-mingw64/watch | 4 + contrib/ncurses/test/package/debian/compat | 1 + contrib/ncurses/test/package/debian/control | 26 + contrib/ncurses/test/package/debian/copyright | 79 + contrib/ncurses/test/package/debian/docs | 1 + contrib/ncurses/test/package/debian/rules | 167 + .../ncurses/test/package/debian/source/format | 1 + contrib/ncurses/test/package/debian/watch | 4 + .../test/package/mingw-ncurses-examples.spec | 124 + .../test/package/ncurses-examples.spec | 115 + contrib/ncurses/test/padview.c | 550 + contrib/ncurses/test/pair_content.c | 316 + contrib/ncurses/test/parse_rgb.h | 98 + contrib/ncurses/test/picsmap.c | 1835 + contrib/ncurses/test/picsmap.h | 71 + contrib/ncurses/test/popup_msg.c | 185 + contrib/ncurses/test/popup_msg.h | 43 + contrib/ncurses/test/programs | 121 + contrib/ncurses/test/railroad.c | 292 + contrib/ncurses/test/rain.c | 468 + contrib/ncurses/test/redraw.c | 249 + contrib/ncurses/test/savescreen.c | 663 + contrib/ncurses/test/savescreen.sh | 67 + contrib/ncurses/test/sp_tinfo.c | 359 + contrib/ncurses/test/tclock.c | 299 + contrib/ncurses/test/terminal.xbm | 52 + contrib/ncurses/test/test.priv.h | 1356 + contrib/ncurses/test/test_add_wchstr.c | 619 + contrib/ncurses/test/test_addchstr.c | 529 + contrib/ncurses/test/test_addstr.c | 437 + contrib/ncurses/test/test_addwstr.c | 537 + contrib/ncurses/test/test_arrays.c | 233 + contrib/ncurses/test/test_delwin.c | 151 + contrib/ncurses/test/test_endwin.c | 132 + contrib/ncurses/test/test_get_wstr.c | 429 + contrib/ncurses/test/test_getstr.c | 429 + contrib/ncurses/test/test_instr.c | 322 + contrib/ncurses/test/test_inwstr.c | 331 + contrib/ncurses/test/test_mouse.c | 284 + contrib/ncurses/test/test_opaque.c | 524 + contrib/ncurses/test/test_setupterm.c | 275 + contrib/ncurses/test/test_sgr.c | 392 + contrib/ncurses/test/test_termattrs.c | 207 + contrib/ncurses/test/test_tparm.c | 709 + contrib/ncurses/test/test_unget_wch.c | 116 + contrib/ncurses/test/test_vid_puts.c | 166 + contrib/ncurses/test/test_vidputs.c | 165 + contrib/ncurses/test/testaddch.c | 121 + contrib/ncurses/test/testcurs.c | 805 + contrib/ncurses/test/testscanw.c | 104 + contrib/ncurses/test/tput-colorcube | 131 + contrib/ncurses/test/tput-initc | 156 + contrib/ncurses/test/tracemunch | 939 + contrib/ncurses/test/view.c | 666 + contrib/ncurses/test/widechars-utf8-tabs.txt | 15 + contrib/ncurses/test/widechars-utf8.txt | 7 + contrib/ncurses/test/widechars.h | 72 + contrib/ncurses/test/worm.c | 697 + contrib/ncurses/test/xmas.c | 1178 + contrib/ncurses/test/xterm-16color.dat | 54 + contrib/ncurses/test/xterm-256color.dat | 294 + contrib/ncurses/test/xterm-88color.dat | 126 + contrib/ncurses/test/xterm-color_48x48.xpm | 61 + 1253 files changed, 509809 insertions(+) create mode 100644 contrib/ncurses/.gitrepo create mode 100644 contrib/ncurses/ANNOUNCE create mode 100644 contrib/ncurses/AUTHORS create mode 100644 contrib/ncurses/Ada95/Makefile.in create mode 100644 contrib/ncurses/Ada95/README create mode 100644 contrib/ncurses/Ada95/TODO create mode 100644 contrib/ncurses/Ada95/aclocal.m4 create mode 100755 contrib/ncurses/Ada95/configure create mode 100644 contrib/ncurses/Ada95/configure.in create mode 100644 contrib/ncurses/Ada95/doc/Makefile.in create mode 100644 contrib/ncurses/Ada95/gen/Makefile.in create mode 100644 contrib/ncurses/Ada95/gen/adacurses-config.in create mode 100644 contrib/ncurses/Ada95/gen/gen.c create mode 100644 contrib/ncurses/Ada95/gen/html.m4 create mode 100644 contrib/ncurses/Ada95/gen/normal.m4 create mode 100644 contrib/ncurses/Ada95/gen/table.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-aux.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-forms.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-menus.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-mouse.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-panels.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses-trace.ads.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses.adb.m4 create mode 100644 contrib/ncurses/Ada95/gen/terminal_interface-curses.ads.m4 create mode 100755 contrib/ncurses/Ada95/include/MKncurses_def.sh create mode 100644 contrib/ncurses/Ada95/include/Makefile.in create mode 100644 contrib/ncurses/Ada95/include/ncurses_cfg.hin create mode 100644 contrib/ncurses/Ada95/include/ncurses_defs create mode 100755 contrib/ncurses/Ada95/make-tar.sh create mode 100644 contrib/ncurses/Ada95/mk-1st.awk create mode 100644 contrib/ncurses/Ada95/mk-pkg.awk create mode 100644 contrib/ncurses/Ada95/package/AdaCurses-doc.spec create mode 100644 contrib/ncurses/Ada95/package/AdaCurses.spec create mode 100644 contrib/ncurses/Ada95/package/debian/compat create mode 100644 contrib/ncurses/Ada95/package/debian/control create mode 100644 contrib/ncurses/Ada95/package/debian/copyright create mode 100644 contrib/ncurses/Ada95/package/debian/docs create mode 100755 contrib/ncurses/Ada95/package/debian/rules create mode 100644 contrib/ncurses/Ada95/package/debian/source/format create mode 100644 contrib/ncurses/Ada95/package/debian/watch create mode 100644 contrib/ncurses/Ada95/samples/Makefile.in create mode 100644 contrib/ncurses/Ada95/samples/README create mode 100644 contrib/ncurses/Ada95/samples/explain.txt create mode 100644 contrib/ncurses/Ada95/samples/ncurses.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-acs_display.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-acs_display.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-attr_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-attr_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-color_edit.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-color_edit.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-color_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-color_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-demo_forms.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-demo_forms.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-demo_pad.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-demo_pad.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-demo_panels.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-demo_panels.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-genericputs.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-genericputs.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-getch.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-getch_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-getch_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-getopt.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-getopt.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-m.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-m.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-menu_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-menu_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-overlap_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-overlap_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-slk_test.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-slk_test.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-trace_set.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-trace_set.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-util.adb create mode 100644 contrib/ncurses/Ada95/samples/ncurses2-util.ads create mode 100644 contrib/ncurses/Ada95/samples/ncurses2.ads create mode 100644 contrib/ncurses/Ada95/samples/rain.adb create mode 100644 contrib/ncurses/Ada95/samples/rain.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-curses_demo.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-curses_demo.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-explanation.adb_p create mode 100644 contrib/ncurses/Ada95/samples/sample-explanation.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-form_demo-aux.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-form_demo-aux.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-form_demo-handler.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-form_demo-handler.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-form_demo.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-form_demo.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-function_key_setting.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-function_key_setting.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-header_handler.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-header_handler.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-helpers.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-helpers.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-keyboard_handler.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-keyboard_handler.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-manifest.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-menu_demo-aux.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-menu_demo-aux.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-menu_demo-handler.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-menu_demo-handler.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-menu_demo.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-menu_demo.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-my_field_type.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-my_field_type.ads create mode 100644 contrib/ncurses/Ada95/samples/sample-text_io_demo.adb create mode 100644 contrib/ncurses/Ada95/samples/sample-text_io_demo.ads create mode 100644 contrib/ncurses/Ada95/samples/sample.adb create mode 100644 contrib/ncurses/Ada95/samples/sample.ads create mode 100644 contrib/ncurses/Ada95/samples/split-path.awk create mode 100644 contrib/ncurses/Ada95/samples/status.adb create mode 100644 contrib/ncurses/Ada95/samples/status.ads create mode 100644 contrib/ncurses/Ada95/samples/tour.adb create mode 100644 contrib/ncurses/Ada95/samples/tour.ads create mode 100644 contrib/ncurses/Ada95/src/Makefile.in create mode 100644 contrib/ncurses/Ada95/src/c_threaded_variables.c create mode 100644 contrib/ncurses/Ada95/src/c_threaded_variables.h create mode 100644 contrib/ncurses/Ada95/src/c_varargs_to_ada.c create mode 100644 contrib/ncurses/Ada95/src/c_varargs_to_ada.h create mode 100755 contrib/ncurses/Ada95/src/library-cfg.sh create mode 100644 contrib/ncurses/Ada95/src/library.gpr.in create mode 100644 contrib/ncurses/Ada95/src/modules create mode 100644 contrib/ncurses/Ada95/src/ncurses_compat.c create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-aux.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_user_data.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms-form_user_data.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-forms.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-menus-item_user_data.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-menus.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-mouse.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-panels-user_data.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-panels.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.adb create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.ads create mode 100644 contrib/ncurses/Ada95/src/terminal_interface-curses-trace.adb_p create mode 100644 contrib/ncurses/Ada95/src/terminal_interface.ads create mode 100644 contrib/ncurses/COPYING create mode 100644 contrib/ncurses/INSTALL create mode 100644 contrib/ncurses/MANIFEST create mode 100644 contrib/ncurses/Makefile.in create mode 100644 contrib/ncurses/Makefile.os2 create mode 100644 contrib/ncurses/NEWS create mode 100644 contrib/ncurses/README create mode 100644 contrib/ncurses/README.MinGW create mode 100644 contrib/ncurses/README.emx create mode 100644 contrib/ncurses/TO-DO create mode 100644 contrib/ncurses/VERSION create mode 100644 contrib/ncurses/aclocal.m4 create mode 100644 contrib/ncurses/announce.html.in create mode 100644 contrib/ncurses/c++/Makefile.in create mode 100644 contrib/ncurses/c++/NEWS create mode 100644 contrib/ncurses/c++/PROBLEMS create mode 100644 contrib/ncurses/c++/README-first create mode 100644 contrib/ncurses/c++/cursesapp.cc create mode 100644 contrib/ncurses/c++/cursesapp.h create mode 100644 contrib/ncurses/c++/cursesf.cc create mode 100644 contrib/ncurses/c++/cursesf.h create mode 100644 contrib/ncurses/c++/cursesm.cc create mode 100644 contrib/ncurses/c++/cursesm.h create mode 100644 contrib/ncurses/c++/cursesmain.cc create mode 100644 contrib/ncurses/c++/cursesp.cc create mode 100644 contrib/ncurses/c++/cursesp.h create mode 100644 contrib/ncurses/c++/cursespad.cc create mode 100644 contrib/ncurses/c++/cursesw.cc create mode 100644 contrib/ncurses/c++/cursesw.h create mode 100644 contrib/ncurses/c++/cursslk.cc create mode 100644 contrib/ncurses/c++/cursslk.h create mode 100644 contrib/ncurses/c++/demo.cc create mode 100755 contrib/ncurses/c++/edit_cfg.sh create mode 100644 contrib/ncurses/c++/etip.h.in create mode 100644 contrib/ncurses/c++/headers create mode 100644 contrib/ncurses/c++/internal.h create mode 100644 contrib/ncurses/c++/modules create mode 100755 contrib/ncurses/config.guess create mode 100755 contrib/ncurses/config.sub create mode 100755 contrib/ncurses/configure create mode 100755 contrib/ncurses/configure-dj64 create mode 100644 contrib/ncurses/configure.in create mode 100644 contrib/ncurses/dist.mk create mode 100644 contrib/ncurses/doc/hackguide.doc create mode 100644 contrib/ncurses/doc/html/Ada95.html create mode 100644 contrib/ncurses/doc/html/NCURSES-Programming-HOWTO.html create mode 100644 contrib/ncurses/doc/html/ada/files.htm create mode 100644 contrib/ncurses/doc/html/ada/files/T.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/A.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/B.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/C.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/D.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/E.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/F.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/G.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/H.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/I.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/K.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/L.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/M.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/N.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/O.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/P.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/Q.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/R.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/S.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/T.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/U.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/V.htm create mode 100644 contrib/ncurses/doc/html/ada/funcs/W.htm create mode 100644 contrib/ncurses/doc/html/ada/index.htm create mode 100644 contrib/ncurses/doc/html/ada/main.htm create mode 100644 contrib/ncurses/doc/html/ada/table.html create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses__adb.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface-curses_constants__ads.htm create mode 100644 contrib/ncurses/doc/html/ada/terminal_interface__ads.htm create mode 100644 contrib/ncurses/doc/html/announce.html create mode 100644 contrib/ncurses/doc/html/hackguide.html create mode 100644 contrib/ncurses/doc/html/index.html create mode 100644 contrib/ncurses/doc/html/man/adacursesw6-config.1.html create mode 100644 contrib/ncurses/doc/html/man/captoinfo.1m.html create mode 100644 contrib/ncurses/doc/html/man/clear.1.html create mode 100644 contrib/ncurses/doc/html/man/curs_add_wch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_add_wchstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_addch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_addchstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_addstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_addwstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_attr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_beep.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_bkgd.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_bkgrnd.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_border.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_border_set.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_clear.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_color.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_delch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_deleteln.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_extend.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_get_wch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_get_wstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_getcchar.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_getch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_getstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_getyx.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_in_wch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_in_wchstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_inch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_inchstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_initscr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_inopts.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_ins_wch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_ins_wstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_insch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_insstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_instr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_inwstr.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_kernel.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_legacy.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_memleaks.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_mouse.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_move.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_opaque.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_outopts.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_overlay.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_pad.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_print.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_printw.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_refresh.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_scanw.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_scr_dump.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_scroll.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_slk.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_sp_funcs.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_termattrs.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_termcap.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_terminfo.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_threads.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_touch.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_trace.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_util.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_variables.3x.html create mode 100644 contrib/ncurses/doc/html/man/curs_window.3x.html create mode 100644 contrib/ncurses/doc/html/man/default_colors.3x.html create mode 100644 contrib/ncurses/doc/html/man/define_key.3x.html create mode 100644 contrib/ncurses/doc/html/man/form.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_cursor.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_data.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_driver.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_attributes.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_buffer.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_info.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_just.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_new.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_opts.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_userptr.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_field_validation.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_fieldtype.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_hook.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_new.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_new_page.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_opts.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_page.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_post.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_requestname.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_userptr.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_variables.3x.html create mode 100644 contrib/ncurses/doc/html/man/form_win.3x.html create mode 100644 contrib/ncurses/doc/html/man/index.html create mode 100644 contrib/ncurses/doc/html/man/infocmp.1m.html create mode 100644 contrib/ncurses/doc/html/man/infotocap.1m.html create mode 100644 contrib/ncurses/doc/html/man/key_defined.3x.html create mode 100644 contrib/ncurses/doc/html/man/keybound.3x.html create mode 100644 contrib/ncurses/doc/html/man/keyok.3x.html create mode 100644 contrib/ncurses/doc/html/man/legacy_coding.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_attributes.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_cursor.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_driver.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_format.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_hook.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_items.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_mark.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_new.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_opts.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_pattern.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_post.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_requestname.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_spacing.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_userptr.3x.html create mode 100644 contrib/ncurses/doc/html/man/menu_win.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_current.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_name.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_new.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_opts.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_userptr.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_value.3x.html create mode 100644 contrib/ncurses/doc/html/man/mitem_visible.3x.html create mode 100644 contrib/ncurses/doc/html/man/ncurses.3x.html create mode 100644 contrib/ncurses/doc/html/man/ncursesw6-config.1.html create mode 100644 contrib/ncurses/doc/html/man/new_pair.3x.html create mode 100644 contrib/ncurses/doc/html/man/panel.3x.html create mode 100644 contrib/ncurses/doc/html/man/resizeterm.3x.html create mode 100644 contrib/ncurses/doc/html/man/scr_dump.5.html create mode 100644 contrib/ncurses/doc/html/man/tabs.1.html create mode 100644 contrib/ncurses/doc/html/man/term.5.html create mode 100644 contrib/ncurses/doc/html/man/term.7.html create mode 100644 contrib/ncurses/doc/html/man/term_variables.3x.html create mode 100644 contrib/ncurses/doc/html/man/terminfo.5.html create mode 100644 contrib/ncurses/doc/html/man/tic.1m.html create mode 100644 contrib/ncurses/doc/html/man/toe.1m.html create mode 100644 contrib/ncurses/doc/html/man/tput.1.html create mode 100644 contrib/ncurses/doc/html/man/tset.1.html create mode 100644 contrib/ncurses/doc/html/man/user_caps.5.html create mode 100644 contrib/ncurses/doc/html/man/wresize.3x.html create mode 100644 contrib/ncurses/doc/html/ncurses-intro.html create mode 100644 contrib/ncurses/doc/ncurses-intro.doc create mode 100644 contrib/ncurses/form/Makefile.in create mode 100644 contrib/ncurses/form/READ.ME create mode 100644 contrib/ncurses/form/f_trace.c create mode 100644 contrib/ncurses/form/fld_arg.c create mode 100644 contrib/ncurses/form/fld_attr.c create mode 100644 contrib/ncurses/form/fld_current.c create mode 100644 contrib/ncurses/form/fld_def.c create mode 100644 contrib/ncurses/form/fld_dup.c create mode 100644 contrib/ncurses/form/fld_ftchoice.c create mode 100644 contrib/ncurses/form/fld_ftlink.c create mode 100644 contrib/ncurses/form/fld_info.c create mode 100644 contrib/ncurses/form/fld_just.c create mode 100644 contrib/ncurses/form/fld_link.c create mode 100644 contrib/ncurses/form/fld_max.c create mode 100644 contrib/ncurses/form/fld_move.c create mode 100644 contrib/ncurses/form/fld_newftyp.c create mode 100644 contrib/ncurses/form/fld_opts.c create mode 100644 contrib/ncurses/form/fld_pad.c create mode 100644 contrib/ncurses/form/fld_page.c create mode 100644 contrib/ncurses/form/fld_stat.c create mode 100644 contrib/ncurses/form/fld_type.c create mode 100644 contrib/ncurses/form/fld_user.c create mode 100644 contrib/ncurses/form/form.h create mode 100644 contrib/ncurses/form/form.priv.h create mode 100644 contrib/ncurses/form/frm_cursor.c create mode 100644 contrib/ncurses/form/frm_data.c create mode 100644 contrib/ncurses/form/frm_def.c create mode 100644 contrib/ncurses/form/frm_driver.c create mode 100644 contrib/ncurses/form/frm_hook.c create mode 100644 contrib/ncurses/form/frm_opts.c create mode 100644 contrib/ncurses/form/frm_page.c create mode 100644 contrib/ncurses/form/frm_post.c create mode 100644 contrib/ncurses/form/frm_req_name.c create mode 100644 contrib/ncurses/form/frm_scale.c create mode 100644 contrib/ncurses/form/frm_sub.c create mode 100644 contrib/ncurses/form/frm_user.c create mode 100644 contrib/ncurses/form/frm_win.c create mode 100644 contrib/ncurses/form/fty_alnum.c create mode 100644 contrib/ncurses/form/fty_alpha.c create mode 100644 contrib/ncurses/form/fty_enum.c create mode 100644 contrib/ncurses/form/fty_generic.c create mode 100644 contrib/ncurses/form/fty_int.c create mode 100644 contrib/ncurses/form/fty_ipv4.c create mode 100644 contrib/ncurses/form/fty_num.c create mode 100644 contrib/ncurses/form/fty_regex.c create mode 100644 contrib/ncurses/form/headers create mode 100644 contrib/ncurses/form/llib-lform create mode 100644 contrib/ncurses/form/llib-lformt create mode 100644 contrib/ncurses/form/llib-lformtw create mode 100644 contrib/ncurses/form/llib-lformw create mode 100644 contrib/ncurses/form/modules create mode 100644 contrib/ncurses/include/Caps create mode 100644 contrib/ncurses/include/Caps-ncurses create mode 100644 contrib/ncurses/include/Caps.aix4 create mode 100644 contrib/ncurses/include/Caps.hpux11 create mode 100644 contrib/ncurses/include/Caps.keys create mode 100644 contrib/ncurses/include/Caps.osf1r5 create mode 100644 contrib/ncurses/include/Caps.uwin create mode 100755 contrib/ncurses/include/MKhashsize.sh create mode 100755 contrib/ncurses/include/MKkey_defs.sh create mode 100755 contrib/ncurses/include/MKncurses_def.sh create mode 100755 contrib/ncurses/include/MKparametrized.sh create mode 100644 contrib/ncurses/include/MKterm.h.awk.in create mode 100644 contrib/ncurses/include/Makefile.in create mode 100644 contrib/ncurses/include/capdefaults.c create mode 100644 contrib/ncurses/include/curses.events create mode 100644 contrib/ncurses/include/curses.h.in create mode 100644 contrib/ncurses/include/curses.tail create mode 100644 contrib/ncurses/include/curses.wide create mode 100755 contrib/ncurses/include/edit_cfg.sh create mode 100644 contrib/ncurses/include/hashed_db.h create mode 100644 contrib/ncurses/include/headers create mode 100644 contrib/ncurses/include/nc_access.h create mode 100644 contrib/ncurses/include/nc_alloc.h create mode 100644 contrib/ncurses/include/nc_mingw.h create mode 100644 contrib/ncurses/include/nc_panel.h create mode 100644 contrib/ncurses/include/nc_string.h create mode 100644 contrib/ncurses/include/nc_termios.h create mode 100644 contrib/ncurses/include/nc_tparm.h create mode 100644 contrib/ncurses/include/nc_win32.h create mode 100644 contrib/ncurses/include/ncurses_cfg.hin create mode 100644 contrib/ncurses/include/ncurses_defs create mode 100644 contrib/ncurses/include/ncurses_dll.h.in create mode 100644 contrib/ncurses/include/ncurses_mingw.h create mode 100644 contrib/ncurses/include/term_entry.h create mode 100644 contrib/ncurses/include/termcap.h.in create mode 100644 contrib/ncurses/include/tic.h create mode 100644 contrib/ncurses/include/unctrl.h.in create mode 100644 contrib/ncurses/include/win32_curses.h create mode 100755 contrib/ncurses/install-sh create mode 100644 contrib/ncurses/man/MKada_config.in create mode 100644 contrib/ncurses/man/MKncu_config.in create mode 100755 contrib/ncurses/man/MKterminfo.sh create mode 100644 contrib/ncurses/man/Makefile.in create mode 100644 contrib/ncurses/man/captoinfo.1m create mode 100644 contrib/ncurses/man/clear.1 create mode 100644 contrib/ncurses/man/curs_add_wch.3x create mode 100644 contrib/ncurses/man/curs_add_wchstr.3x create mode 100644 contrib/ncurses/man/curs_addch.3x create mode 100644 contrib/ncurses/man/curs_addchstr.3x create mode 100644 contrib/ncurses/man/curs_addstr.3x create mode 100644 contrib/ncurses/man/curs_addwstr.3x create mode 100644 contrib/ncurses/man/curs_attr.3x create mode 100644 contrib/ncurses/man/curs_beep.3x create mode 100644 contrib/ncurses/man/curs_bkgd.3x create mode 100644 contrib/ncurses/man/curs_bkgrnd.3x create mode 100644 contrib/ncurses/man/curs_border.3x create mode 100644 contrib/ncurses/man/curs_border_set.3x create mode 100644 contrib/ncurses/man/curs_clear.3x create mode 100644 contrib/ncurses/man/curs_color.3x create mode 100644 contrib/ncurses/man/curs_delch.3x create mode 100644 contrib/ncurses/man/curs_deleteln.3x create mode 100644 contrib/ncurses/man/curs_extend.3x create mode 100644 contrib/ncurses/man/curs_get_wch.3x create mode 100644 contrib/ncurses/man/curs_get_wstr.3x create mode 100644 contrib/ncurses/man/curs_getcchar.3x create mode 100644 contrib/ncurses/man/curs_getch.3x create mode 100644 contrib/ncurses/man/curs_getstr.3x create mode 100644 contrib/ncurses/man/curs_getyx.3x create mode 100644 contrib/ncurses/man/curs_in_wch.3x create mode 100644 contrib/ncurses/man/curs_in_wchstr.3x create mode 100644 contrib/ncurses/man/curs_inch.3x create mode 100644 contrib/ncurses/man/curs_inchstr.3x create mode 100644 contrib/ncurses/man/curs_initscr.3x create mode 100644 contrib/ncurses/man/curs_inopts.3x create mode 100644 contrib/ncurses/man/curs_ins_wch.3x create mode 100644 contrib/ncurses/man/curs_ins_wstr.3x create mode 100644 contrib/ncurses/man/curs_insch.3x create mode 100644 contrib/ncurses/man/curs_insstr.3x create mode 100644 contrib/ncurses/man/curs_instr.3x create mode 100644 contrib/ncurses/man/curs_inwstr.3x create mode 100644 contrib/ncurses/man/curs_kernel.3x create mode 100644 contrib/ncurses/man/curs_legacy.3x create mode 100644 contrib/ncurses/man/curs_memleaks.3x create mode 100644 contrib/ncurses/man/curs_mouse.3x create mode 100644 contrib/ncurses/man/curs_move.3x create mode 100644 contrib/ncurses/man/curs_opaque.3x create mode 100644 contrib/ncurses/man/curs_outopts.3x create mode 100644 contrib/ncurses/man/curs_overlay.3x create mode 100644 contrib/ncurses/man/curs_pad.3x create mode 100644 contrib/ncurses/man/curs_print.3x create mode 100644 contrib/ncurses/man/curs_printw.3x create mode 100644 contrib/ncurses/man/curs_refresh.3x create mode 100644 contrib/ncurses/man/curs_scanw.3x create mode 100644 contrib/ncurses/man/curs_scr_dump.3x create mode 100644 contrib/ncurses/man/curs_scroll.3x create mode 100644 contrib/ncurses/man/curs_slk.3x create mode 100644 contrib/ncurses/man/curs_sp_funcs.3x create mode 100644 contrib/ncurses/man/curs_termattrs.3x create mode 100644 contrib/ncurses/man/curs_termcap.3x create mode 100644 contrib/ncurses/man/curs_terminfo.3x create mode 100644 contrib/ncurses/man/curs_threads.3x create mode 100644 contrib/ncurses/man/curs_touch.3x create mode 100644 contrib/ncurses/man/curs_trace.3x create mode 100644 contrib/ncurses/man/curs_util.3x create mode 100644 contrib/ncurses/man/curs_variables.3x create mode 100644 contrib/ncurses/man/curs_window.3x create mode 100644 contrib/ncurses/man/default_colors.3x create mode 100644 contrib/ncurses/man/define_key.3x create mode 100644 contrib/ncurses/man/form.3x create mode 100644 contrib/ncurses/man/form_cursor.3x create mode 100644 contrib/ncurses/man/form_data.3x create mode 100644 contrib/ncurses/man/form_driver.3x create mode 100644 contrib/ncurses/man/form_field.3x create mode 100644 contrib/ncurses/man/form_field_attributes.3x create mode 100644 contrib/ncurses/man/form_field_buffer.3x create mode 100644 contrib/ncurses/man/form_field_info.3x create mode 100644 contrib/ncurses/man/form_field_just.3x create mode 100644 contrib/ncurses/man/form_field_new.3x create mode 100644 contrib/ncurses/man/form_field_opts.3x create mode 100644 contrib/ncurses/man/form_field_userptr.3x create mode 100644 contrib/ncurses/man/form_field_validation.3x create mode 100644 contrib/ncurses/man/form_fieldtype.3x create mode 100644 contrib/ncurses/man/form_hook.3x create mode 100644 contrib/ncurses/man/form_new.3x create mode 100644 contrib/ncurses/man/form_new_page.3x create mode 100644 contrib/ncurses/man/form_opts.3x create mode 100644 contrib/ncurses/man/form_page.3x create mode 100644 contrib/ncurses/man/form_post.3x create mode 100644 contrib/ncurses/man/form_requestname.3x create mode 100644 contrib/ncurses/man/form_userptr.3x create mode 100644 contrib/ncurses/man/form_variables.3x create mode 100644 contrib/ncurses/man/form_win.3x create mode 100644 contrib/ncurses/man/infocmp.1m create mode 100644 contrib/ncurses/man/infotocap.1m create mode 100644 contrib/ncurses/man/key_defined.3x create mode 100644 contrib/ncurses/man/keybound.3x create mode 100644 contrib/ncurses/man/keyok.3x create mode 100644 contrib/ncurses/man/legacy_coding.3x create mode 100755 contrib/ncurses/man/make_sed.sh create mode 100644 contrib/ncurses/man/man_db.renames.in create mode 100644 contrib/ncurses/man/manhtml.aliases create mode 100644 contrib/ncurses/man/manhtml.externs create mode 100644 contrib/ncurses/man/manlinks.sed create mode 100644 contrib/ncurses/man/menu.3x create mode 100644 contrib/ncurses/man/menu_attributes.3x create mode 100644 contrib/ncurses/man/menu_cursor.3x create mode 100644 contrib/ncurses/man/menu_driver.3x create mode 100644 contrib/ncurses/man/menu_format.3x create mode 100644 contrib/ncurses/man/menu_hook.3x create mode 100644 contrib/ncurses/man/menu_items.3x create mode 100644 contrib/ncurses/man/menu_mark.3x create mode 100644 contrib/ncurses/man/menu_new.3x create mode 100644 contrib/ncurses/man/menu_opts.3x create mode 100644 contrib/ncurses/man/menu_pattern.3x create mode 100644 contrib/ncurses/man/menu_post.3x create mode 100644 contrib/ncurses/man/menu_requestname.3x create mode 100644 contrib/ncurses/man/menu_spacing.3x create mode 100644 contrib/ncurses/man/menu_userptr.3x create mode 100644 contrib/ncurses/man/menu_win.3x create mode 100644 contrib/ncurses/man/mitem_current.3x create mode 100644 contrib/ncurses/man/mitem_name.3x create mode 100644 contrib/ncurses/man/mitem_new.3x create mode 100644 contrib/ncurses/man/mitem_opts.3x create mode 100644 contrib/ncurses/man/mitem_userptr.3x create mode 100644 contrib/ncurses/man/mitem_value.3x create mode 100644 contrib/ncurses/man/mitem_visible.3x create mode 100644 contrib/ncurses/man/ncurses.3x create mode 100644 contrib/ncurses/man/new_pair.3x create mode 100644 contrib/ncurses/man/panel.3x create mode 100644 contrib/ncurses/man/resizeterm.3x create mode 100644 contrib/ncurses/man/scr_dump.5 create mode 100644 contrib/ncurses/man/tabs.1 create mode 100644 contrib/ncurses/man/term.5 create mode 100644 contrib/ncurses/man/term.7 create mode 100644 contrib/ncurses/man/term_variables.3x create mode 100644 contrib/ncurses/man/terminfo.head create mode 100644 contrib/ncurses/man/terminfo.tail create mode 100644 contrib/ncurses/man/tic.1m create mode 100644 contrib/ncurses/man/toe.1m create mode 100644 contrib/ncurses/man/tput.1 create mode 100644 contrib/ncurses/man/tset.1 create mode 100644 contrib/ncurses/man/user_caps.5 create mode 100644 contrib/ncurses/man/wresize.3x create mode 100644 contrib/ncurses/menu/Makefile.in create mode 100644 contrib/ncurses/menu/READ.ME create mode 100644 contrib/ncurses/menu/eti.h create mode 100644 contrib/ncurses/menu/headers create mode 100644 contrib/ncurses/menu/llib-lmenu create mode 100644 contrib/ncurses/menu/llib-lmenut create mode 100644 contrib/ncurses/menu/llib-lmenutw create mode 100644 contrib/ncurses/menu/llib-lmenuw create mode 100644 contrib/ncurses/menu/m_attribs.c create mode 100644 contrib/ncurses/menu/m_cursor.c create mode 100644 contrib/ncurses/menu/m_driver.c create mode 100644 contrib/ncurses/menu/m_format.c create mode 100644 contrib/ncurses/menu/m_global.c create mode 100644 contrib/ncurses/menu/m_hook.c create mode 100644 contrib/ncurses/menu/m_item_cur.c create mode 100644 contrib/ncurses/menu/m_item_nam.c create mode 100644 contrib/ncurses/menu/m_item_new.c create mode 100644 contrib/ncurses/menu/m_item_opt.c create mode 100644 contrib/ncurses/menu/m_item_top.c create mode 100644 contrib/ncurses/menu/m_item_use.c create mode 100644 contrib/ncurses/menu/m_item_val.c create mode 100644 contrib/ncurses/menu/m_item_vis.c create mode 100644 contrib/ncurses/menu/m_items.c create mode 100644 contrib/ncurses/menu/m_new.c create mode 100644 contrib/ncurses/menu/m_opts.c create mode 100644 contrib/ncurses/menu/m_pad.c create mode 100644 contrib/ncurses/menu/m_pattern.c create mode 100644 contrib/ncurses/menu/m_post.c create mode 100644 contrib/ncurses/menu/m_req_name.c create mode 100644 contrib/ncurses/menu/m_scale.c create mode 100644 contrib/ncurses/menu/m_spacing.c create mode 100644 contrib/ncurses/menu/m_sub.c create mode 100644 contrib/ncurses/menu/m_trace.c create mode 100644 contrib/ncurses/menu/m_userptr.c create mode 100644 contrib/ncurses/menu/m_win.c create mode 100644 contrib/ncurses/menu/menu.h create mode 100644 contrib/ncurses/menu/menu.priv.h create mode 100644 contrib/ncurses/menu/mf_common.h create mode 100644 contrib/ncurses/menu/modules create mode 100644 contrib/ncurses/misc/Makefile.in create mode 100644 contrib/ncurses/misc/chkdef.cmd create mode 100644 contrib/ncurses/misc/cleantic.cmd create mode 100644 contrib/ncurses/misc/cmpdef.cmd create mode 100755 contrib/ncurses/misc/csort create mode 100644 contrib/ncurses/misc/emx.src create mode 100644 contrib/ncurses/misc/form.def create mode 100644 contrib/ncurses/misc/form.ref create mode 100644 contrib/ncurses/misc/gen-pkgconfig.in create mode 100755 contrib/ncurses/misc/gen_edit.sh create mode 100644 contrib/ncurses/misc/magic create mode 100644 contrib/ncurses/misc/makedef.cmd create mode 100755 contrib/ncurses/misc/makellib create mode 100644 contrib/ncurses/misc/menu.def create mode 100644 contrib/ncurses/misc/menu.ref create mode 100755 contrib/ncurses/misc/ncu2openbsd create mode 100644 contrib/ncurses/misc/ncurses-config.in create mode 100644 contrib/ncurses/misc/ncurses.def create mode 100644 contrib/ncurses/misc/ncurses.ref create mode 100644 contrib/ncurses/misc/ncurses.supp create mode 100644 contrib/ncurses/misc/panel.def create mode 100644 contrib/ncurses/misc/panel.ref create mode 100644 contrib/ncurses/misc/run_tic.in create mode 100755 contrib/ncurses/misc/shlib create mode 100644 contrib/ncurses/misc/tabset/std create mode 100644 contrib/ncurses/misc/tabset/stdcrt create mode 100644 contrib/ncurses/misc/tabset/vt100 create mode 100644 contrib/ncurses/misc/tabset/vt300 create mode 100755 contrib/ncurses/misc/tdlint create mode 100644 contrib/ncurses/misc/terminfo.src create mode 100644 contrib/ncurses/mk-0th.awk create mode 100644 contrib/ncurses/mk-1st.awk create mode 100644 contrib/ncurses/mk-2nd.awk create mode 100644 contrib/ncurses/mk-hdr.awk create mode 100644 contrib/ncurses/ncurses/Makefile.in create mode 100644 contrib/ncurses/ncurses/README create mode 100644 contrib/ncurses/ncurses/README.IZ create mode 100644 contrib/ncurses/ncurses/SigAction.h create mode 100644 contrib/ncurses/ncurses/base/MKkeyname.awk create mode 100755 contrib/ncurses/ncurses/base/MKlib_gen.sh create mode 100644 contrib/ncurses/ncurses/base/MKunctrl.awk create mode 100644 contrib/ncurses/ncurses/base/README create mode 100644 contrib/ncurses/ncurses/base/define_key.c create mode 100644 contrib/ncurses/ncurses/base/key_defined.c create mode 100644 contrib/ncurses/ncurses/base/keybound.c create mode 100644 contrib/ncurses/ncurses/base/keyok.c create mode 100644 contrib/ncurses/ncurses/base/legacy_coding.c create mode 100644 contrib/ncurses/ncurses/base/lib_addch.c create mode 100644 contrib/ncurses/ncurses/base/lib_addstr.c create mode 100644 contrib/ncurses/ncurses/base/lib_beep.c create mode 100644 contrib/ncurses/ncurses/base/lib_bkgd.c create mode 100644 contrib/ncurses/ncurses/base/lib_box.c create mode 100644 contrib/ncurses/ncurses/base/lib_chgat.c create mode 100644 contrib/ncurses/ncurses/base/lib_clear.c create mode 100644 contrib/ncurses/ncurses/base/lib_clearok.c create mode 100644 contrib/ncurses/ncurses/base/lib_clrbot.c create mode 100644 contrib/ncurses/ncurses/base/lib_clreol.c create mode 100644 contrib/ncurses/ncurses/base/lib_color.c create mode 100644 contrib/ncurses/ncurses/base/lib_colorset.c create mode 100644 contrib/ncurses/ncurses/base/lib_delch.c create mode 100644 contrib/ncurses/ncurses/base/lib_delwin.c create mode 100644 contrib/ncurses/ncurses/base/lib_dft_fgbg.c create mode 100644 contrib/ncurses/ncurses/base/lib_driver.c create mode 100644 contrib/ncurses/ncurses/base/lib_echo.c create mode 100644 contrib/ncurses/ncurses/base/lib_endwin.c create mode 100644 contrib/ncurses/ncurses/base/lib_erase.c create mode 100644 contrib/ncurses/ncurses/base/lib_flash.c create mode 100644 contrib/ncurses/ncurses/base/lib_freeall.c create mode 100644 contrib/ncurses/ncurses/base/lib_getch.c create mode 100644 contrib/ncurses/ncurses/base/lib_getstr.c create mode 100644 contrib/ncurses/ncurses/base/lib_hline.c create mode 100644 contrib/ncurses/ncurses/base/lib_immedok.c create mode 100644 contrib/ncurses/ncurses/base/lib_inchstr.c create mode 100644 contrib/ncurses/ncurses/base/lib_initscr.c create mode 100644 contrib/ncurses/ncurses/base/lib_insch.c create mode 100644 contrib/ncurses/ncurses/base/lib_insdel.c create mode 100644 contrib/ncurses/ncurses/base/lib_insnstr.c create mode 100644 contrib/ncurses/ncurses/base/lib_instr.c create mode 100644 contrib/ncurses/ncurses/base/lib_isendwin.c create mode 100644 contrib/ncurses/ncurses/base/lib_leaveok.c create mode 100644 contrib/ncurses/ncurses/base/lib_mouse.c create mode 100644 contrib/ncurses/ncurses/base/lib_move.c create mode 100644 contrib/ncurses/ncurses/base/lib_mvwin.c create mode 100644 contrib/ncurses/ncurses/base/lib_newterm.c create mode 100644 contrib/ncurses/ncurses/base/lib_newwin.c create mode 100644 contrib/ncurses/ncurses/base/lib_nl.c create mode 100644 contrib/ncurses/ncurses/base/lib_overlay.c create mode 100644 contrib/ncurses/ncurses/base/lib_pad.c create mode 100644 contrib/ncurses/ncurses/base/lib_printw.c create mode 100644 contrib/ncurses/ncurses/base/lib_redrawln.c create mode 100644 contrib/ncurses/ncurses/base/lib_refresh.c create mode 100644 contrib/ncurses/ncurses/base/lib_restart.c create mode 100644 contrib/ncurses/ncurses/base/lib_scanw.c create mode 100644 contrib/ncurses/ncurses/base/lib_screen.c create mode 100644 contrib/ncurses/ncurses/base/lib_scroll.c create mode 100644 contrib/ncurses/ncurses/base/lib_scrollok.c create mode 100644 contrib/ncurses/ncurses/base/lib_scrreg.c create mode 100644 contrib/ncurses/ncurses/base/lib_set_term.c create mode 100644 contrib/ncurses/ncurses/base/lib_slk.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkatr_set.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkatrof.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkatron.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkatrset.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkattr.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkclear.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkcolor.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkinit.c create mode 100644 contrib/ncurses/ncurses/base/lib_slklab.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkrefr.c create mode 100644 contrib/ncurses/ncurses/base/lib_slkset.c create mode 100644 contrib/ncurses/ncurses/base/lib_slktouch.c create mode 100644 contrib/ncurses/ncurses/base/lib_touch.c create mode 100644 contrib/ncurses/ncurses/base/lib_ungetch.c create mode 100644 contrib/ncurses/ncurses/base/lib_vline.c create mode 100644 contrib/ncurses/ncurses/base/lib_wattroff.c create mode 100644 contrib/ncurses/ncurses/base/lib_wattron.c create mode 100644 contrib/ncurses/ncurses/base/lib_winch.c create mode 100644 contrib/ncurses/ncurses/base/lib_window.c create mode 100644 contrib/ncurses/ncurses/base/nc_panel.c create mode 100644 contrib/ncurses/ncurses/base/new_pair.c create mode 100644 contrib/ncurses/ncurses/base/resizeterm.c create mode 100644 contrib/ncurses/ncurses/base/safe_sprintf.c create mode 100644 contrib/ncurses/ncurses/base/sigaction.c create mode 100644 contrib/ncurses/ncurses/base/tries.c create mode 100644 contrib/ncurses/ncurses/base/use_window.c create mode 100644 contrib/ncurses/ncurses/base/version.c create mode 100644 contrib/ncurses/ncurses/base/vsscanf.c create mode 100644 contrib/ncurses/ncurses/base/wresize.c create mode 100644 contrib/ncurses/ncurses/build.priv.h create mode 100644 contrib/ncurses/ncurses/curses.priv.h create mode 100644 contrib/ncurses/ncurses/fifo_defs.h create mode 100644 contrib/ncurses/ncurses/llib-lncurses create mode 100644 contrib/ncurses/ncurses/llib-lncursest create mode 100644 contrib/ncurses/ncurses/llib-lncursestw create mode 100644 contrib/ncurses/ncurses/llib-lncursesw create mode 100644 contrib/ncurses/ncurses/llib-ltic create mode 100644 contrib/ncurses/ncurses/llib-ltict create mode 100644 contrib/ncurses/ncurses/llib-ltictw create mode 100644 contrib/ncurses/ncurses/llib-lticw create mode 100644 contrib/ncurses/ncurses/llib-ltinfo create mode 100644 contrib/ncurses/ncurses/llib-ltinfot create mode 100644 contrib/ncurses/ncurses/llib-ltinfotw create mode 100644 contrib/ncurses/ncurses/llib-ltinfow create mode 100644 contrib/ncurses/ncurses/modules create mode 100644 contrib/ncurses/ncurses/new_pair.h create mode 100644 contrib/ncurses/ncurses/report_hashing.c create mode 100644 contrib/ncurses/ncurses/report_offsets.c create mode 100644 contrib/ncurses/ncurses/term.priv.h create mode 100644 contrib/ncurses/ncurses/tinfo/MKcaptab.awk create mode 100755 contrib/ncurses/ncurses/tinfo/MKcaptab.sh create mode 100644 contrib/ncurses/ncurses/tinfo/MKcodes.awk create mode 100755 contrib/ncurses/ncurses/tinfo/MKfallback.sh create mode 100755 contrib/ncurses/ncurses/tinfo/MKkeys_list.sh create mode 100644 contrib/ncurses/ncurses/tinfo/MKnames.awk create mode 100755 contrib/ncurses/ncurses/tinfo/MKuserdefs.sh create mode 100644 contrib/ncurses/ncurses/tinfo/README create mode 100644 contrib/ncurses/ncurses/tinfo/access.c create mode 100644 contrib/ncurses/ncurses/tinfo/add_tries.c create mode 100644 contrib/ncurses/ncurses/tinfo/alloc_entry.c create mode 100644 contrib/ncurses/ncurses/tinfo/alloc_ttype.c create mode 100644 contrib/ncurses/ncurses/tinfo/captoinfo.c create mode 100644 contrib/ncurses/ncurses/tinfo/comp_error.c create mode 100644 contrib/ncurses/ncurses/tinfo/comp_expand.c create mode 100644 contrib/ncurses/ncurses/tinfo/comp_hash.c create mode 100644 contrib/ncurses/ncurses/tinfo/comp_parse.c create mode 100644 contrib/ncurses/ncurses/tinfo/comp_scan.c create mode 100644 contrib/ncurses/ncurses/tinfo/db_iterator.c create mode 100644 contrib/ncurses/ncurses/tinfo/doalloc.c create mode 100644 contrib/ncurses/ncurses/tinfo/entries.c create mode 100644 contrib/ncurses/ncurses/tinfo/free_ttype.c create mode 100644 contrib/ncurses/ncurses/tinfo/getenv_num.c create mode 100644 contrib/ncurses/ncurses/tinfo/hashed_db.c create mode 100644 contrib/ncurses/ncurses/tinfo/home_terminfo.c create mode 100644 contrib/ncurses/ncurses/tinfo/init_keytry.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_acs.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_baudrate.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_cur_term.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_data.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_has_cap.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_kernel.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_longname.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_napms.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_options.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_print.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_raw.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_setup.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_termcap.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_termname.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_tgoto.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_ti.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_tparm.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_tputs.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_ttyflags.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_win32con.c create mode 100644 contrib/ncurses/ncurses/tinfo/lib_win32util.c create mode 100644 contrib/ncurses/ncurses/tinfo/make_hash.c create mode 100644 contrib/ncurses/ncurses/tinfo/make_keys.c create mode 100644 contrib/ncurses/ncurses/tinfo/name_match.c create mode 100644 contrib/ncurses/ncurses/tinfo/obsolete.c create mode 100644 contrib/ncurses/ncurses/tinfo/parse_entry.c create mode 100644 contrib/ncurses/ncurses/tinfo/read_entry.c create mode 100644 contrib/ncurses/ncurses/tinfo/read_termcap.c create mode 100644 contrib/ncurses/ncurses/tinfo/strings.c create mode 100644 contrib/ncurses/ncurses/tinfo/tinfo_driver.c create mode 100644 contrib/ncurses/ncurses/tinfo/trim_sgr0.c create mode 100644 contrib/ncurses/ncurses/tinfo/use_screen.c create mode 100644 contrib/ncurses/ncurses/tinfo/write_entry.c create mode 100644 contrib/ncurses/ncurses/trace/README create mode 100644 contrib/ncurses/ncurses/trace/lib_trace.c create mode 100644 contrib/ncurses/ncurses/trace/lib_traceatr.c create mode 100644 contrib/ncurses/ncurses/trace/lib_tracebits.c create mode 100644 contrib/ncurses/ncurses/trace/lib_tracechr.c create mode 100644 contrib/ncurses/ncurses/trace/lib_tracedmp.c create mode 100644 contrib/ncurses/ncurses/trace/lib_tracemse.c create mode 100644 contrib/ncurses/ncurses/trace/trace_buf.c create mode 100644 contrib/ncurses/ncurses/trace/trace_tries.c create mode 100644 contrib/ncurses/ncurses/trace/trace_xnames.c create mode 100644 contrib/ncurses/ncurses/trace/varargs.c create mode 100644 contrib/ncurses/ncurses/trace/visbuf.c create mode 100755 contrib/ncurses/ncurses/tty/MKexpanded.sh create mode 100644 contrib/ncurses/ncurses/tty/hardscroll.c create mode 100644 contrib/ncurses/ncurses/tty/hashmap.c create mode 100644 contrib/ncurses/ncurses/tty/lib_mvcur.c create mode 100644 contrib/ncurses/ncurses/tty/lib_tstp.c create mode 100644 contrib/ncurses/ncurses/tty/lib_twait.c create mode 100644 contrib/ncurses/ncurses/tty/lib_vidattr.c create mode 100644 contrib/ncurses/ncurses/tty/tty_update.c create mode 100644 contrib/ncurses/ncurses/wcwidth.h create mode 100644 contrib/ncurses/ncurses/widechar/charable.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_add_wch.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_box_set.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_cchar.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_erasewchar.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_get_wch.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_get_wstr.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_hline_set.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_in_wch.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_in_wchnstr.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_ins_wch.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_inwstr.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_key_name.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_pecho_wchar.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_slk_wset.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_unget_wch.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_vid_attr.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_vline_set.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_wacs.c create mode 100644 contrib/ncurses/ncurses/widechar/lib_wunctrl.c create mode 100644 contrib/ncurses/ncurses/widechar/widechars.c create mode 100644 contrib/ncurses/ncurses/win32con/gettimeofday.c create mode 100644 contrib/ncurses/ncurses/win32con/wcwidth.c create mode 100644 contrib/ncurses/ncurses/win32con/win32_driver.c create mode 100644 contrib/ncurses/ncurses/win32con/win_driver.c create mode 100644 contrib/ncurses/package/debian-mingw/changelog create mode 100644 contrib/ncurses/package/debian-mingw/compat create mode 100644 contrib/ncurses/package/debian-mingw/control create mode 100644 contrib/ncurses/package/debian-mingw/copyright create mode 100644 contrib/ncurses/package/debian-mingw/mingw32-ncurses6td.lintian-overrides create mode 100755 contrib/ncurses/package/debian-mingw/rules create mode 100644 contrib/ncurses/package/debian-mingw/source/format create mode 100644 contrib/ncurses/package/debian-mingw/watch create mode 100644 contrib/ncurses/package/debian-mingw64/changelog create mode 100644 contrib/ncurses/package/debian-mingw64/compat create mode 100644 contrib/ncurses/package/debian-mingw64/control create mode 100644 contrib/ncurses/package/debian-mingw64/copyright create mode 100644 contrib/ncurses/package/debian-mingw64/mingw64-ncurses6td.lintian-overrides create mode 100755 contrib/ncurses/package/debian-mingw64/rules create mode 100644 contrib/ncurses/package/debian-mingw64/source/format create mode 100644 contrib/ncurses/package/debian-mingw64/watch create mode 100644 contrib/ncurses/package/debian/changelog create mode 100644 contrib/ncurses/package/debian/compat create mode 100644 contrib/ncurses/package/debian/control create mode 100644 contrib/ncurses/package/debian/copyright create mode 100644 contrib/ncurses/package/debian/ncurses6td.lintian-overrides create mode 100644 contrib/ncurses/package/debian/ncurses6td.triggers create mode 100644 contrib/ncurses/package/debian/ncursest6td.lintian-overrides create mode 100644 contrib/ncurses/package/debian/ncursest6td.triggers create mode 100755 contrib/ncurses/package/debian/rules create mode 100644 contrib/ncurses/package/debian/source/format create mode 100644 contrib/ncurses/package/debian/watch create mode 100644 contrib/ncurses/package/mingw-ncurses.nsi create mode 100644 contrib/ncurses/package/mingw-ncurses.spec create mode 100644 contrib/ncurses/package/ncurses.map create mode 100644 contrib/ncurses/package/ncurses.spec create mode 100644 contrib/ncurses/package/ncurses.sym create mode 100644 contrib/ncurses/package/ncursest.map create mode 100644 contrib/ncurses/package/ncursest.spec create mode 100644 contrib/ncurses/package/ncursest.sym create mode 100644 contrib/ncurses/package/ncursestw.map create mode 100644 contrib/ncurses/package/ncursestw.sym create mode 100644 contrib/ncurses/package/ncursesw.map create mode 100644 contrib/ncurses/package/ncursesw.sym create mode 100644 contrib/ncurses/panel/Makefile.in create mode 100644 contrib/ncurses/panel/headers create mode 100644 contrib/ncurses/panel/llib-lpanel create mode 100644 contrib/ncurses/panel/llib-lpanelt create mode 100644 contrib/ncurses/panel/llib-lpaneltw create mode 100644 contrib/ncurses/panel/llib-lpanelw create mode 100644 contrib/ncurses/panel/modules create mode 100644 contrib/ncurses/panel/p_above.c create mode 100644 contrib/ncurses/panel/p_below.c create mode 100644 contrib/ncurses/panel/p_bottom.c create mode 100644 contrib/ncurses/panel/p_delete.c create mode 100644 contrib/ncurses/panel/p_hidden.c create mode 100644 contrib/ncurses/panel/p_hide.c create mode 100644 contrib/ncurses/panel/p_move.c create mode 100644 contrib/ncurses/panel/p_new.c create mode 100644 contrib/ncurses/panel/p_replace.c create mode 100644 contrib/ncurses/panel/p_show.c create mode 100644 contrib/ncurses/panel/p_top.c create mode 100644 contrib/ncurses/panel/p_update.c create mode 100644 contrib/ncurses/panel/p_user.c create mode 100644 contrib/ncurses/panel/p_win.c create mode 100644 contrib/ncurses/panel/panel.c create mode 100644 contrib/ncurses/panel/panel.h create mode 100644 contrib/ncurses/panel/panel.priv.h create mode 100755 contrib/ncurses/progs/MKtermsort.sh create mode 100644 contrib/ncurses/progs/Makefile.in create mode 100755 contrib/ncurses/progs/capconvert create mode 100644 contrib/ncurses/progs/clear.c create mode 100755 contrib/ncurses/progs/clear.sh create mode 100644 contrib/ncurses/progs/clear_cmd.c create mode 100644 contrib/ncurses/progs/clear_cmd.h create mode 100644 contrib/ncurses/progs/dump_entry.c create mode 100644 contrib/ncurses/progs/dump_entry.h create mode 100644 contrib/ncurses/progs/infocmp.c create mode 100644 contrib/ncurses/progs/modules create mode 100644 contrib/ncurses/progs/progs.priv.h create mode 100644 contrib/ncurses/progs/reset_cmd.c create mode 100644 contrib/ncurses/progs/reset_cmd.h create mode 100644 contrib/ncurses/progs/tabs.c create mode 100644 contrib/ncurses/progs/tic.c create mode 100644 contrib/ncurses/progs/toe.c create mode 100644 contrib/ncurses/progs/tparm_type.c create mode 100644 contrib/ncurses/progs/tparm_type.h create mode 100644 contrib/ncurses/progs/tput.c create mode 100644 contrib/ncurses/progs/transform.c create mode 100644 contrib/ncurses/progs/tset.c create mode 100644 contrib/ncurses/progs/tty_settings.c create mode 100644 contrib/ncurses/progs/tty_settings.h create mode 100644 contrib/ncurses/test/Makefile.in create mode 100644 contrib/ncurses/test/README create mode 100644 contrib/ncurses/test/aclocal.m4 create mode 100644 contrib/ncurses/test/back_ground.c create mode 100644 contrib/ncurses/test/background.c create mode 100644 contrib/ncurses/test/blue.c create mode 100644 contrib/ncurses/test/bs.6 create mode 100644 contrib/ncurses/test/bs.c create mode 100644 contrib/ncurses/test/bulgarian-utf8-tabs.txt create mode 100644 contrib/ncurses/test/bulgarian-utf8.txt create mode 100644 contrib/ncurses/test/cardfile.c create mode 100644 contrib/ncurses/test/cardfile.dat create mode 100644 contrib/ncurses/test/chgat.c create mode 100644 contrib/ncurses/test/clip_printw.c create mode 100644 contrib/ncurses/test/color_content.c create mode 100644 contrib/ncurses/test/color_name.h create mode 100644 contrib/ncurses/test/color_set.c create mode 100644 contrib/ncurses/test/combine.c create mode 100755 contrib/ncurses/test/configure create mode 100644 contrib/ncurses/test/configure.in create mode 100644 contrib/ncurses/test/demo_altkeys.c create mode 100644 contrib/ncurses/test/demo_defkey.c create mode 100644 contrib/ncurses/test/demo_forms.c create mode 100644 contrib/ncurses/test/demo_forms.txt create mode 100644 contrib/ncurses/test/demo_keyok.c create mode 100644 contrib/ncurses/test/demo_menus.c create mode 100644 contrib/ncurses/test/demo_new_pair.c create mode 100644 contrib/ncurses/test/demo_panels.c create mode 100644 contrib/ncurses/test/demo_tabs.c create mode 100644 contrib/ncurses/test/demo_termcap.c create mode 100644 contrib/ncurses/test/demo_terminfo.c create mode 100644 contrib/ncurses/test/ditto.c create mode 100644 contrib/ncurses/test/dots.c create mode 100644 contrib/ncurses/test/dots_curses.c create mode 100644 contrib/ncurses/test/dots_mvcur.c create mode 100644 contrib/ncurses/test/dots_termcap.c create mode 100644 contrib/ncurses/test/dots_xcurses.c create mode 100644 contrib/ncurses/test/dump_window.c create mode 100644 contrib/ncurses/test/dump_window.h create mode 100644 contrib/ncurses/test/dup_field.c create mode 100644 contrib/ncurses/test/echochar.c create mode 100644 contrib/ncurses/test/edit_field.c create mode 100644 contrib/ncurses/test/edit_field.h create mode 100644 contrib/ncurses/test/escherknot.xbm create mode 100644 contrib/ncurses/test/extended_color.c create mode 100644 contrib/ncurses/test/filter.c create mode 100644 contrib/ncurses/test/firework.c create mode 100644 contrib/ncurses/test/firstlast.c create mode 100644 contrib/ncurses/test/foldkeys.c create mode 100644 contrib/ncurses/test/form_driver_w.c create mode 100644 contrib/ncurses/test/gdc.6 create mode 100644 contrib/ncurses/test/gdc.c create mode 100644 contrib/ncurses/test/hanoi.c create mode 100644 contrib/ncurses/test/hashtest.c create mode 100644 contrib/ncurses/test/inch_wide.c create mode 100644 contrib/ncurses/test/inchs.c create mode 100644 contrib/ncurses/test/ins_wide.c create mode 100644 contrib/ncurses/test/insdelln.c create mode 100644 contrib/ncurses/test/inserts.c create mode 100644 contrib/ncurses/test/key_names.c create mode 100644 contrib/ncurses/test/keynames.c create mode 100644 contrib/ncurses/test/knight.c create mode 100644 contrib/ncurses/test/linedata.h create mode 100755 contrib/ncurses/test/link2exe.sh create mode 100644 contrib/ncurses/test/linux-color.dat create mode 100644 contrib/ncurses/test/list_keys.c create mode 100755 contrib/ncurses/test/listused.sh create mode 100644 contrib/ncurses/test/lrtest.c create mode 100755 contrib/ncurses/test/make-tar.sh create mode 100644 contrib/ncurses/test/mensetmanus.xbm create mode 100644 contrib/ncurses/test/mini.xterm_48x48.xpm create mode 100644 contrib/ncurses/test/mk-test.awk create mode 100644 contrib/ncurses/test/modules create mode 100644 contrib/ncurses/test/move_field.c create mode 100644 contrib/ncurses/test/movewindow.c create mode 100644 contrib/ncurses/test/ncurses.c create mode 100644 contrib/ncurses/test/ncurses_tst.hin create mode 100644 contrib/ncurses/test/newdemo.c create mode 100644 contrib/ncurses/test/package/debian-mingw/compat create mode 100644 contrib/ncurses/test/package/debian-mingw/control create mode 100644 contrib/ncurses/test/package/debian-mingw/copyright create mode 100644 contrib/ncurses/test/package/debian-mingw/docs create mode 100755 contrib/ncurses/test/package/debian-mingw/rules create mode 100644 contrib/ncurses/test/package/debian-mingw/source/format create mode 100644 contrib/ncurses/test/package/debian-mingw/watch create mode 100644 contrib/ncurses/test/package/debian-mingw64/compat create mode 100644 contrib/ncurses/test/package/debian-mingw64/control create mode 100644 contrib/ncurses/test/package/debian-mingw64/copyright create mode 100644 contrib/ncurses/test/package/debian-mingw64/docs create mode 100755 contrib/ncurses/test/package/debian-mingw64/rules create mode 100644 contrib/ncurses/test/package/debian-mingw64/source/format create mode 100644 contrib/ncurses/test/package/debian-mingw64/watch create mode 100644 contrib/ncurses/test/package/debian/compat create mode 100644 contrib/ncurses/test/package/debian/control create mode 100644 contrib/ncurses/test/package/debian/copyright create mode 100644 contrib/ncurses/test/package/debian/docs create mode 100755 contrib/ncurses/test/package/debian/rules create mode 100644 contrib/ncurses/test/package/debian/source/format create mode 100644 contrib/ncurses/test/package/debian/watch create mode 100644 contrib/ncurses/test/package/mingw-ncurses-examples.spec create mode 100644 contrib/ncurses/test/package/ncurses-examples.spec create mode 100644 contrib/ncurses/test/padview.c create mode 100644 contrib/ncurses/test/pair_content.c create mode 100644 contrib/ncurses/test/parse_rgb.h create mode 100644 contrib/ncurses/test/picsmap.c create mode 100644 contrib/ncurses/test/picsmap.h create mode 100644 contrib/ncurses/test/popup_msg.c create mode 100644 contrib/ncurses/test/popup_msg.h create mode 100644 contrib/ncurses/test/programs create mode 100644 contrib/ncurses/test/railroad.c create mode 100644 contrib/ncurses/test/rain.c create mode 100644 contrib/ncurses/test/redraw.c create mode 100644 contrib/ncurses/test/savescreen.c create mode 100755 contrib/ncurses/test/savescreen.sh create mode 100644 contrib/ncurses/test/sp_tinfo.c create mode 100644 contrib/ncurses/test/tclock.c create mode 100644 contrib/ncurses/test/terminal.xbm create mode 100644 contrib/ncurses/test/test.priv.h create mode 100644 contrib/ncurses/test/test_add_wchstr.c create mode 100644 contrib/ncurses/test/test_addchstr.c create mode 100644 contrib/ncurses/test/test_addstr.c create mode 100644 contrib/ncurses/test/test_addwstr.c create mode 100644 contrib/ncurses/test/test_arrays.c create mode 100644 contrib/ncurses/test/test_delwin.c create mode 100644 contrib/ncurses/test/test_endwin.c create mode 100644 contrib/ncurses/test/test_get_wstr.c create mode 100644 contrib/ncurses/test/test_getstr.c create mode 100644 contrib/ncurses/test/test_instr.c create mode 100644 contrib/ncurses/test/test_inwstr.c create mode 100644 contrib/ncurses/test/test_mouse.c create mode 100644 contrib/ncurses/test/test_opaque.c create mode 100644 contrib/ncurses/test/test_setupterm.c create mode 100644 contrib/ncurses/test/test_sgr.c create mode 100644 contrib/ncurses/test/test_termattrs.c create mode 100644 contrib/ncurses/test/test_tparm.c create mode 100644 contrib/ncurses/test/test_unget_wch.c create mode 100644 contrib/ncurses/test/test_vid_puts.c create mode 100644 contrib/ncurses/test/test_vidputs.c create mode 100644 contrib/ncurses/test/testaddch.c create mode 100644 contrib/ncurses/test/testcurs.c create mode 100644 contrib/ncurses/test/testscanw.c create mode 100755 contrib/ncurses/test/tput-colorcube create mode 100755 contrib/ncurses/test/tput-initc create mode 100755 contrib/ncurses/test/tracemunch create mode 100644 contrib/ncurses/test/view.c create mode 100644 contrib/ncurses/test/widechars-utf8-tabs.txt create mode 100644 contrib/ncurses/test/widechars-utf8.txt create mode 100644 contrib/ncurses/test/widechars.h create mode 100644 contrib/ncurses/test/worm.c create mode 100644 contrib/ncurses/test/xmas.c create mode 100644 contrib/ncurses/test/xterm-16color.dat create mode 100644 contrib/ncurses/test/xterm-256color.dat create mode 100644 contrib/ncurses/test/xterm-88color.dat create mode 100644 contrib/ncurses/test/xterm-color_48x48.xpm diff --git a/contrib/ncurses/.gitrepo b/contrib/ncurses/.gitrepo new file mode 100644 index 00000000..d6042160 --- /dev/null +++ b/contrib/ncurses/.gitrepo @@ -0,0 +1,12 @@ +; DO NOT EDIT (unless you know what you are doing) +; +; This subdirectory is a git "subrepo", and this file is maintained by the +; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme +; +[subrepo] + remote = https://github.com/stsp/ncurses.git + branch = master + commit = 70ab4fd6ee899bc319b91c91852f7c2c18687e49 + parent = 8f297e020f3a585f5e9888115916add7b6e11b8e + method = merge + cmdver = 0.4.6 diff --git a/contrib/ncurses/ANNOUNCE b/contrib/ncurses/ANNOUNCE new file mode 100644 index 00000000..6abf551c --- /dev/null +++ b/contrib/ncurses/ANNOUNCE @@ -0,0 +1,733 @@ + Announcing ncurses 6.5 + +Overview + + The ncurses (new curses) library is a free software emulation of + curses in System V Release 4.0 (SVr4), and more. It uses terminfo + format, supports pads and color and multiple highlights and forms + characters and function-key mapping, and has all the other SVr4-curses + enhancements over BSD curses. SVr4 curses became the basis of X/Open + Curses. + + In mid-June 1995, the maintainer of 4.4BSD curses declared that he + considered 4.4BSD curses obsolete, and encouraged the keepers of unix + releases such as BSD/OS, FreeBSD and NetBSD to switch over to ncurses. + + Since 1995, ncurses has been ported to many systems: + * It is used in almost every system based on the Linux kernel (aside + from some embedded applications). + * It is used as the system curses library on OpenBSD, FreeBSD and + MacOS. + * It is used in environments such as Cygwin and MinGW. The first of + these was EMX on OS/2 Warp. + * It is used (though usually not as the system curses) on all of the + vendor unix systems, e.g., AIX, HP-UX, IRIX64, SCO, Solaris, + Tru64. + * It should work readily on any ANSI/POSIX-conforming unix. + + The distribution includes the library and support utilities, including + * captoinfo, a termcap conversion tool + * clear, utility for clearing the screen + * infocmp, the terminfo decompiler + * tabs, set tabs on a terminal + * tic, the terminfo compiler + * toe, list (table of) terminfo entries + * tput, utility for retrieving terminal capabilities in shell + scripts + * tset, to initialize the terminal + + Full manual pages are provided for the library and tools. + + The ncurses distribution is available at ncurses' homepage: + + https://invisible-island.net/archives/ncurses/ or + https://invisible-mirror.net/archives/ncurses/ . + + It is also available at the GNU distribution site + + https://ftp.gnu.org/gnu/ncurses/ . + +Release Notes + + These notes are for ncurses 6.5, released April 27, 2024. + + This release is designed to be source-compatible with ncurses 5.0 + through 6.4; providing extensions to the application binary interface + (ABI). Although the source can still be configured to support the + ncurses 5 ABI, the reason for the release is to reflect improvements + to the ncurses 6 ABI and the supporting utility programs. + + There are, of course, numerous other improvements, listed in this + announcement. + + The most important bug-fixes/improvements dealt with robustness + issues. The release notes also mention some other bug-fixes, but are + focused on new features and improvements to existing features since + ncurses 6.4 release. + + Library improvements + + New features + + These are new features: + * The low-level terminfo and termcap interfaces are used both by the + higher-level curses library, as well as by many applications. + The functions which convert parameterized terminal capability + strings for output to the terminal (tiparm and tparm) analyze the + capability string to determine which parameters are strings (i.e., + addresses), versus numbers (not addresses). + The library's analysis of a capability string may differ from the + calling application's design if environment variables are used to + point to an invalid terminal database. This is a longstanding + problem with all implementations of terminfo, dating from the + early 1980s. + Two new functions address this problem: by providing a function + which allows the calling application to tell ncurses how many + string-parameters to expect: + + tiscan_s helps applications check formatting capabilities + that would be passed to tiparm_s. + + tiparm_s provides applications a way to tell ncurses what the + expected parameters are for a capability. + * The ncurses library supports a compile-time feature (enabled with + the configure --enable-check-size option) which simplifies + initialization with terminals which do not negotiate window + (screen) size. This is done in setupterm, by providing for using + ANSI cursor-position report (in user6/user7 terminfo capabilities) + to obtain the screen size if neither environment variables or + ioctl is used. + The ncurses test-program with options "-E -T" demonstrates this + feature. + * add functions to query tty-flags in SCREEN + + This release drops compatibility with obsolete versions of tack, e.g., + pre-1.08 + + Other improvements + + These are improvements to existing features: + * In addition to the new, safer function tiparm_s, ncurses adds + checks to make the older tiparm, tparm and tgoto functions safer: + + the terminfo functions tiparm and tparm ensure that the + capability string comes from the terminal description which + ncurses loads, rather than from random data which the + application happens to have. + + the tgoto function disallows capabilities which its analysis + shows will attempt to use string parameters. + + ncurses uses internal functions which correspond to tiparm, + and tgoto which ensure that the capability strings which are + passed to these functions come from the loaded terminal + description. + * improve check in lib_tparm.c, ensuring that a char* fits into a + TPARM_ARG + * modify _nc_syserr_abort to use _nc_env_access, rather than only + checking root uid + * improve thread lock in lib_trace.c + * modify flushinp to use file descriptors in SCREEN, rather than + from TERMINAL, and check if they are for a terminal, like SVr4 + * modify mcprint to use file descriptor in SCREEN, for consistency + * modify internal function _nc_read_file_entry to show relevant + filename in warnings + * improve checks in internal function convert_string for corrupt + terminfo entry + * review/improve handling of out-of-memory conditions + * limit delays to 30 seconds, i.e., padding delays in terminfo, as + well as napms and delay_output functions + * fix reallocation loop for vsnprintf in _nc_sprintf_string by + copying the va_list variable + * modify delscreen to limit the windows which it creates to just + those associated with the screen + * modify endwin to return an error if it is called again without an + intervening screen update + * modify wenclose to handle pads + * eliminate use of PATH_MAX in lib_trace.c + * provide for any CCHARW_MAX greater than 1 + + These are corrections to existing features: + * correct loop termination condition in waddnstr and waddnwstr + * improve parsing in internal function _nc_msec_cost, allowing a + single decimal point + * amend parameter check for entire string versus specific length in + winsnstr and wins_nwstr to match Solaris; make similar correction + to wins_nwstr + * correct internal function wadd_wch_literal when adding a + non-spacing character to a double-width character + * correct definition of Charable macro for non-wide ncurses library + . + + Program improvements + + Several improvements were made to the utility programs. Some were done + to make the infocmp option "-u" option help refactor the terminal + database. + + infocmp + + + add limit checks for processing extended capabilities with + the "-u" option + + correct initial alignment of extended capabilities, so that + the "-u" option can be used for more than two terminal types + + modify "-u" option to not report cancels for strings which + were already cancelled in a use'd chunk. + + correct an assignment "-u" for detecting if a boolean is + unset in a base entry and set in a use'd chunk, i.e., if it + was cancelled. + + tic + + + correct limit-check when dumping tc/use clause via "-I" + + check return value of _nc_save_str, in special case where + extended capabilities are processed but the terminal + description was not initialized + + modify check for multiply defined aliases to report problems + within the current runtime rather than for conflicts with + pre-existing terminal descriptions. + + disallow using $TERMINFO or $HOME/.terminfo when "-o" option + is used + + tput and tset + + + add "-v" option to tput, to show warnings + + modify reset command to avoid altering clocal if the terminal + uses a modem + + modify reset feature to avoid 1-second sleep if running in a + pseudo-terminal + + Examples + + Along with the library and utilities, improvements were made to the + ncurses-examples: + * modify test_tparm to account for extended capabilities + * corrected mouse mask in test/testcurs.c + * modify test/clip_printw.c to optionally test non-wrapped updates + * modify test/test_mouse.c to use curses api for raw/noraw + * modify test/clip_printw.c to optionally test non-wrapped updates + + There is one new demo/test programs: + + test/test_endwin.c + This program shows the return-status from endwin with different + combinations of endwin (repeated), initscr, newterm. + + Terminal database + + There are several new terminal descriptions: + * ansi+apparrows + * contour + * linux+kbs for terminals which imitate xterm's behavior with Linux + * rio, rio-direct + * mostlike + * ms-vt100-16color, winconsole + * vt100+noapp, vt100+noapp+pc, xterm+app+pc, xterm+decedit from + xterm #389 + * putty+cursor to reflect amending of modified cursor-keys in 2021 + * wezterm + + There are many changes to existing terminal descriptions. Some were + updates to several descriptions, using the infocmp "-u" option in a + script to determine which building-block entries could be used to + replace multiple capability settings (and trim redundant information). + + Other changes include: + * document XF, kxIN and kxOUT + * add note on sun regarding wscons/cmdtool/shelltool + * remove DECCOLM+DECSCLM from foot + * add xterm+focus to foot+base + * add ecma+strikeout to putty + * use CSI 3J in vte-2017 + * use oldxterm+sm+1006 in vte-2014 + * modify xgterm to work around line-drawing bug + * add xterm focus mode 1004 to xterm+focus as fe/fd capabilities, + like vim. + * add xterm+focus to alacritty+common + * add XR/xr, to work with vim, and use RV/rv to denote DA2 and its + response + * add XF flag to xterm+focus so that termcap applications can be + aware of terminals which may support focus in/out + * use xterm+focus in xterm-p370 and tmux + * remove xterm+sm+1006 from tmux + * NetBSD-related fixes for x68k and wsvt25 + + Documentation + + As usual, this release + * improves documentation by describing new features, + * attempts to improve the description of features which users have + found confusing + * fills in overlooked descriptions of features which were described + in the NEWS file but treated sketchily in manual pages. + + In addition to providing background information to explain these + features and show how they evolved, there are corrections, + clarifications, etc.: + * Corrections: + + add assignment in CF_MAN_PAGES to fill in value for + TERMINFO_DIRS in ncurses, terminfo and tic manpages. + + clarify interaction of -R option versus -C, -I and -r in + infocmp manpage. + + correct manpage description of panel_hidden. + + improve manpage description for addch versus unctrl format + used for non-printable characters. + + improve manpages discussing file descriptors in low-level + functions. + + improve description of search rules for terminal descriptions + in terminfo manpage. + + modify dist.mk to avoid passing developer's comments in + manpages into the generated html documentation. + + modify test-package "ncurses6-doc" to use manpage-aliases, + which in turn required a change to the configure script to + factor in the extra-suffix option when deriving alias names. + * New/improved history and portability sections: + + add information about "ttycap", termcap's forerunner, to + tset.1 + + document limitations of tparm, and error-returns in + curs_terminfo.3x + + document limitations of tgoto, and error-returns in + curs_termcap.3x + * Other improvements: + + This release has many changes to improve the formatting and + style of the manpages. + + Manpages now use consistent section-naming, page headers and + footers (including the modification date for each page). + + Table layout has been revised. + + There are no new manual pages (all of the manual page updates are to + existing pages). + + Interesting bug-fixes + + The changes to tparm, tgoto which improve the design of the low-level + interfaces are interesting, but are not bug-fixes per se. + + Configuration changes + + Major changes + + These are the major changes (aside from introducing tiparm_s): + * use wide-character (ncursesw) by default + * use opaque typedefs by default + + However, most of the work on configure scripts was done to reduce + warnings within the configure script: + * intrusive warnings from GNU grep regarding fgrep and egrep + * fatal errors in compile-checks, arising from recent "Modern C" + efforts by some developers which caused longstanding configure + checks to fail. + After repairing the configure script, none of that activity + affected ncurses because stricter warnings are used routinely in + development. + + Other improvements made to configure checks include + * use string-hacks in alloc_entry.c, alloc_type.c and hardscroll.c, + overlooked due to compiler changes in recent OpenBSD releases + * revise progs.priv.h to provide for NC_ISATTY reuse + * configure check for MB_LEN_MAX provides warning as needed + * trim a space after some "-R" options, fixing builds for + applications built using clang and ncurses on Solaris + * work around misconfiguration of MacPorts gcc13, which exposes + invalid definition of MB_LEN_MAX in gcc's fallback copy of + limits.h + * modified experimental Windows driver works with xterm mouse + protocol + + Configuration options + + There are a few new configure options: + + --disable-setuid-environ + Compile with environment restriction, so certain environment + variables are not available when running via a setuid/setgid + application. These are (for example $TERMINFO) those that allow + the search path for the terminfo or termcap entry to be + customized. + + A setuid/setgid application inherits its environment variables + from the current user, in contrast to sudo which may limit the + environment variables that ncurses uses. + + --enable-check-size + Compile-in feature to detect screensize for terminals which do + not advertise their screensize, e.g., serial terminals. + + --with-abi-altered=NUM + Override the displayed (rather than compiled-in) ABI. Only + packagers who have created configurations where the ABI differs + from ncurses should be interested in this option. + + --with-strip-program=XXX + When stripping executables during install, use the specified + program rather than "strip" overriding program chosen by the + install program for stripping executables. + + These configure options are modified: + + --with-pkg-config-libdir[=DIR] + The optional DIR parameter can now be "auto" to automatically + use pkg-config's library directory. + + The default is $(libdir). + + --with-xterm-kbs[=XXX] + The default is "auto" which tells the configure script to + choose BS or DEL according to platform defaults. + + Portability + + Many of the portability changes are implemented via the configure + script: + * add/use configure check for clock_gettime, to supersede + gettimeofday. + * modify configure script check for pkg-config library directory to + take into account an older version 0.15.0 which used + PKG_CONFIG_PATH but not PKG_CONFIG_LIBDIR + * allow for MinGW32-/64-bit configurations to use _DEFAULT_SOURCE + * modify CF_XOPEN_SOURCE macro's amend default case to avoid + undefining _XOPEN_SOURCE if _POSIX_C_SOURCE is defined + * updated configure script macro CF_XOPEN_SOURCE, for uClibc-ng + * modify version-check for gcc/g++, now works for msys2 + * build-fixes related to configure-options and/or platform: + + fix for --enable-fvisibility + + fix for unusual values of --with-rel-version + + fix for unusual values of --with-abi-version + + fix for --disable-tcap-names + + fix for termcap in nc_access.h + * other configure-script improvements: + + recent msys2 headers work with _DEFAULT_SOURCE; amend check + + use $ac_includes_default in most cases where stdlib.h should + work + + use #error consistently vs "make an error" + + add configure macro for gettimeofday vs inline check + + Here are some of the other portability fixes: + * modify configure scripts/makefiles to omit KEY_RESIZE if the + corresponding SIGWINCH feature is disabled + * increase MB_CUR_MAX to 16, matching glibc's MB_LEN_MAX + * add BSD erase2 to characters handled by tset/reset + * use getauxval when available, to improve setuid/setgid checks + * set dwShareMode in calls to CreateConsoleScreenBuffer + * use CreateFile with "CONIN$", "CONOUT$" rather than GetStdHandle + to obtain a handle on the actual console, avoiding redirection in + the MinGW/Win32 configurations + * modify MinGW driver to return KEY_BACKSPACE when an unmodified + VK_BACK virtual key is entered + * modify MinGW configuration to provide for running in MSYS/MSYS2 + shells, assuming ConPTY support + _________________________________________________________________ + +Features of ncurses + + The ncurses package is fully upward-compatible with SVr4 (System V + Release 4) curses: + * All of the SVr4 calls have been implemented (and are documented). + * ncurses supports the features of SVr4 curses including keyboard + mapping, color, form drawing with ACS characters, and automatic + recognition of keypad and function keys. + * ncurses provides work-alike replacements of SVr4 supplemental + libraries based on curses, but which were not specified by X/Open + Curses: + + the panel library, supporting a stack of windows with backing + store + + the menu library, supporting a uniform but flexible interface + for menu programming + + the form library, supporting data collection through + on-screen forms + * ncurses's terminal database is fully compatible with that used by + SVr4 curses. + + ncurses supports user-defined capabilities that it can see, + but which are hidden from SVr4 curses applications using the + same terminal database. + + It can be optionally configured to match the format used in + related systems such as AIX and Tru64. + + Alternatively, ncurses can be configured to use hashed + databases rather than the directory of files used by SVr4 + curses. + * The ncurses utilities have options to allow you to filter terminfo + entries for use with less capable curses/terminfo versions such as + the HP-UX and AIX ports. + + The ncurses package also has many useful extensions over SVr4: + * The API is 8-bit clean and base-level conformant with the X/Open + Curses specification, XSI curses (that is, it implements all BASE + level features, and almost all EXTENDED features). It includes + many function calls not supported under SVr4 curses (but + portability of all calls is documented so you can use the SVr4 + subset only). + * Unlike SVr3 curses, ncurses can write to the rightmost-bottommost + corner of the screen if your terminal has an insert-character + capability. + * Ada95 and C++ bindings. + * Support for mouse event reporting with X Window xterm and FreeBSD + and OS/2 console windows. + * Extended mouse support via Alessandro Rubini's gpm package. + * The function wresize allows you to resize windows, preserving + their data. + * The function use_default_colors allows you to use the terminal's + default colors for the default color pair, achieving the effect of + transparent colors. + * The functions keyok and define_key allow you to better control the + use of function keys, e.g., disabling the ncurses KEY_MOUSE, or by + defining more than one control sequence to map to a given key + code. + * Support for direct-color terminals, such as modern xterm. + * Support for 256-color terminals, such as modern xterm. + * Support for 16-color terminals, such as aixterm and modern xterm. + * Better cursor-movement optimization. The package now features a + cursor-local-movement computation more efficient than either BSD's + or System V's. + * Super hardware scrolling support. The screen-update code + incorporates a novel, simple, and cheap algorithm that enables it + to make optimal use of hardware scrolling, line-insertion, and + line-deletion for screen-line movements. This algorithm is more + powerful than the 4.4BSD curses quickch routine. + * Real support for terminals with the magic-cookie glitch. The + screen-update code will refrain from drawing a highlight if the + magic- cookie unattributed spaces required just before the + beginning and after the end would step on a non-space character. + It will automatically shift highlight boundaries when doing so + would make it possible to draw the highlight without changing the + visual appearance of the screen. + * It is possible to generate the library with a list of pre-loaded + fallback entries linked to it so that it can serve those terminal + types even when no terminfo tree or termcap file is accessible + (this may be useful for support of screen-oriented programs that + must run in single-user mode). + * The tic/captoinfo utility provided with ncurses has the ability to + translate many termcaps from the XENIX, IBM and AT&T extension + sets. + * A BSD-like tset utility is provided. + * The ncurses library and utilities will automatically read terminfo + entries from $HOME/.terminfo if it exists, and compile to that + directory if it exists and the user has no write access to the + system directory. This feature makes it easier for users to have + personal terminfo entries without giving up access to the system + terminfo directory. + * You may specify a path of directories to search for compiled + descriptions with the environment variable TERMINFO_DIRS (this + generalizes the feature provided by TERMINFO under stock System + V.) + * In terminfo source files, use capabilities may refer not just to + other entries in the same source file (as in System V) but also to + compiled entries in either the system terminfo directory or the + user's $HOME/.terminfo directory. + * The table-of-entries utility toe makes it easy for users to see + exactly what terminal types are available on the system. + * X/Open Curses permits most functions it specifies to be made + available as macros as well. ncurses does this + + to improve performance, e.g., for operations composed of + simpler functions such as cursor movement following by adding + text to the screen, + + to simplify the implementation by reusing functions which use + common parameters, e.g., the standard screen stdscr, and + + to provide functions that return values via their parameters + Except for the last case, ncurses provides a non-macro + implementation of the function. If the macro definition is + disabled with #undef, or by defining NCURSES_NOMACROS the function + may be linked (and its calls will be checked against the + prototype). + * Extensive documentation is provided (see the Additional Reading + section of the ncurses FAQ for online documentation). + +Applications using ncurses + + The ncurses distribution includes a selection of test programs + (including a few games). These are available separately as + ncurses-examples + + The ncurses library has been tested with a wide variety of + applications including: + + aptitude + FrontEnd to Apt, the debian package manager + + https://wiki.debian.org/Aptitude + + cdk + Curses Development Kit + + https://invisible-island.net/cdk/ + + ded + directory-editor + + https://invisible-island.net/ded/ + + dialog + the underlying application used in Slackware's setup, and the + basis for similar install/configure applications on many + systems. + + https://invisible-island.net/dialog/ + + lynx + the text WWW browser + + https://lynx.invisible-island.net/ + + mutt + mail utility + + http://www.mutt.org/ + + ncftp + file-transfer utility + + https://www.ncftp.com/ + + nvi + New vi uses ncurses. + + https://sites.google.com/a/bostic.com/keithbostic/the-berkeley- + vi-editor-home-page + + ranger + A console file manager with VI key bindings in Python. + + https://ranger.github.io/ + + tin + newsreader, supporting color, MIME + + http://www.tin.org/ + + vifm + File manager with vi like keybindings + + https://vifm.info/ + + as well as some that use ncurses for the terminfo support alone: + + minicom + terminal emulator for serial modem connections + + https://salsa.debian.org/minicom-team/minicom + + mosh + a replacement for ssh. + + https://mosh.org/ + + tack + terminfo action checker + + https://invisible-island.net/ncurses/tack.html + + tmux + terminal multiplexor + + https://github.com/tmux/tmux/wiki + + vile + vi-like-emacs may be built to use the terminfo, termcap or + curses interfaces. + + https://invisible-island.net/vile/ + + and finally, those which use only the termcap interface: + + emacs + text editor + + https://www.gnu.org/software/emacs/ + + less + The most commonly used pager (a program that displays text + files). + + http://www.greenwoodsoftware.com/less/ + + screen + terminal multiplexor + + https://www.gnu.org/software/screen/ + + vim + text editor + + https://www.vim.org/ + +Development activities + + Zeyd Ben-Halim started ncurses from a previous package pcurses, + written by Pavel Curtis. Eric S. Raymond continued development. + Juergen Pfeifer wrote most of the form and menu libraries. + + Ongoing development work is done by Thomas E. Dickey. Thomas E. Dickey + has acted as the maintainer for the Free Software Foundation, which + held a copyright on ncurses for releases 4.2 through 6.1. Following + the release of ncurses 6.1, effective as of release 6.2, copyright for + ncurses reverted to Thomas E. Dickey (see the ncurses FAQ for + additional information). + + Contact the current maintainers at + + bug-ncurses@gnu.org + + To join the ncurses mailing list, please write email to + + bug-ncurses-request@gnu.org + + containing the line: + + subscribe @ + + This list is open to anyone interested in helping with the development + and testing of this package. + + Beta versions of ncurses are made available at + + https://invisible-island.net/archives/ncurses/current/ and + https://invisible-mirror.net/archives/ncurses/current/ . + + Patches to the current release are made available at + + https://invisible-island.net/archives/ncurses/6.4/ and + https://invisible-mirror.net/archives/ncurses/6.4/ . + + There is an archive of the mailing list here: + + https://lists.gnu.org/archive/html/bug-ncurses . + +Related resources + + The release notes make scattered references to these pages, which may + be interesting by themselves: + * ncurses licensing + * Symbol versioning in ncurses + * Comments on ncurses versus slang (S-Lang) + * Comments on OpenBSD + * tack - terminfo action checker + * tctest - termcap library checker + * Terminal Database + +Other resources + + The distribution provides a newer version of the terminfo-format + terminal description file once maintained by Eric Raymond . Unlike the + older version, the termcap and terminfo data are provided in the same + file, which also provides several user-definable extensions beyond the + X/Open Curses specification. + + You can find lots of information on terminal-related topics not + covered in the terminfo file in Richard Shuford's archive (original). + The collection of computer manuals at bitsavers.org has also been + useful. + + * Overview + * Release Notes + + Library improvements + o New features + o Other improvements + + Program improvements + o Utilities + o Examples + + Terminal database + + Documentation + + Interesting bug-fixes + + Configuration changes + o Major changes + o Configuration options + + Portability + * Features of ncurses + * Applications using ncurses + * Development activities + * Related resources + * Other resources diff --git a/contrib/ncurses/AUTHORS b/contrib/ncurses/AUTHORS new file mode 100644 index 00000000..9a5ac067 --- /dev/null +++ b/contrib/ncurses/AUTHORS @@ -0,0 +1,41 @@ +------------------------------------------------------------------------------- +-- Copyright 2020-2021,2024 Thomas E. Dickey -- +-- Copyright 2006,2017 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: AUTHORS,v 1.7 2024/06/15 20:43:32 tom Exp $ +------------------------------------------------------------------------------- +These are the principal authors/contributors of ncurses since 1.9.9e, +in decreasing order of their contribution: + +TD Thomas E. Dickey +JPF Juergen Pfeifer +ESR Eric S Raymond +AVL Alexander V Lukyanov +PB Philippe Blain +SV Sven Verdoolaege +NB Nicolas Boulenguez +GBR Branden Robinson diff --git a/contrib/ncurses/Ada95/Makefile.in b/contrib/ncurses/Ada95/Makefile.in new file mode 100644 index 00000000..c937df98 --- /dev/null +++ b/contrib/ncurses/Ada95/Makefile.in @@ -0,0 +1,121 @@ +# $Id: Makefile.in,v 1.31 2024/08/11 00:24:28 tom Exp $ +############################################################################## +# Copyright 2020-2022,2024 Thomas E. Dickey # +# Copyright 1998-2010,2015 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Juergen Pfeifer, 1996 +# +# Version Control +# $Revision: 1.31 $ +# +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +libdir = @libdir@ +libexecdir = @libexecdir@ +includedir = @includedir@ + +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +DATADIR = $(DESTDIR)$(datadir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) +LIBEXECDIR = $(DESTDIR)$(libexecdir@MERGE_PREFIX@) + +SUBDIRS = @ADA_SUBDIRS@ + +INSTALL = @INSTALL@ @INSTALL_OPT_O@ +INSTALL_SCRIPT = @INSTALL@ + +TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)" +@SET_MAKE@ + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : depend +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs \ +sources \ +install \ +install.libs \ +uninstall \ +uninstall.libs :: + for d in $(SUBDIRS); do \ + ( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\ + done + +clean \ +mostlyclean :: + for d in $(SUBDIRS); do \ + ( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\ + done + +distclean \ +realclean :: + for d in $(SUBDIRS); do \ + ( cd $$d && $(MAKE) $(TOP_MFLAGS) $@ ) ;\ + done + rm -rf lib + for lib_kind in static dynamic; do \ + rm -rf $${lib_kind}-ali; \ + rm -rf $${lib_kind}-obj; \ + done + -rm -f config.cache config.log config.status include/ncurses_cfg.h + -rm -f Makefile + +depend : + @ + +check : + @echo "The test-programs are interactive" + +tags : + @ + +preinstall : + @ + +install.data : + @ diff --git a/contrib/ncurses/Ada95/README b/contrib/ncurses/Ada95/README new file mode 100644 index 00000000..2e66625f --- /dev/null +++ b/contrib/ncurses/Ada95/README @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- + +-- Author: Juergen Pfeifer, 1996 + +The documentation is provided in HTML format in the ./html +subdirectory. The main document is named index.html + diff --git a/contrib/ncurses/Ada95/TODO b/contrib/ncurses/Ada95/TODO new file mode 100644 index 00000000..10354952 --- /dev/null +++ b/contrib/ncurses/Ada95/TODO @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-1999,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: TODO,v 1.8 2021/09/01 23:22:33 tom Exp $ +------------------------------------------------------------------------------- + +-- Intensive testing + Perhaps the delivery of the Beta will help a bit. + +-- Documentation + Like most WEB pages: under continuous construction + +-- Style cleanup + +-- Alternate functions for procedures with out params + Comfort purpose + +-- Sample program + Under continuous construction (and it is not a WEB page!!!) + +-- Make the binding objects a shared library + They are rather large, so it would make sense, otherwise Ada95 + would look too large, although the generated code is as compact + as C or C++. I'll wait a bit until the GNAT people provide some + better support to construct shared libraries. + +-- Think about more inlining + +-- Check for memory leaks. + Oh I would like it so much if the GNAT guys would put an optional + GC into their system. diff --git a/contrib/ncurses/Ada95/aclocal.m4 b/contrib/ncurses/Ada95/aclocal.m4 new file mode 100644 index 00000000..443e8929 --- /dev/null +++ b/contrib/ncurses/Ada95/aclocal.m4 @@ -0,0 +1,5398 @@ +dnl*************************************************************************** +dnl Copyright 2018-2023,2024 Thomas E. Dickey * +dnl Copyright 2010-2017,2018 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl Author: Thomas E. Dickey +dnl +dnl $Id: aclocal.m4,v 1.221 2024/08/11 00:23:05 tom Exp $ +dnl Macros used in NCURSES Ada95 auto-configuration script. +dnl +dnl These macros are maintained separately from NCURSES. The copyright on +dnl this file applies to the aggregation of macros and does not affect use of +dnl these macros in other applications. +dnl +dnl See these pages for additional information: +dnl https://invisible-island.net/autoconf/ +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl +dnl --------------------------------------------------------------------------- +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49 +dnl ------------------ +dnl Conditionally generate script according to whether we're using a given autoconf. +dnl +dnl $1 = version to compare against +dnl $2 = code to use if AC_ACVERSION is at least as high as $1. +dnl $3 = code to use if AC_ACVERSION is older than $1. +define([CF_ACVERSION_CHECK], +[ +ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl +ifdef([m4_version_compare], +[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])], +[CF_ACVERSION_COMPARE( +AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])), +AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53 +dnl -------------------- +dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1, +dnl MAJOR2, MINOR2, TERNARY2, +dnl PRINTABLE2, not FOUND, FOUND) +define([CF_ACVERSION_COMPARE], +[ifelse(builtin([eval], [$2 < $5]), 1, +[ifelse([$8], , ,[$8])], +[ifelse([$9], , ,[$9])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADA_INCLUDE_DIRS version: 8 updated: 2013/10/14 04:24:07 +dnl ------------------- +dnl Construct the list of include-options for the C programs in the Ada95 +dnl binding. +AC_DEFUN([CF_ADA_INCLUDE_DIRS], +[ +ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS" +if test "$srcdir" != "."; then + ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS" +fi +if test "$GCC" != yes; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" +elif test "$includedir" != "/usr/include"; then + if test "$includedir" = '${prefix}/include' ; then + if test x$prefix != x/usr ; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi + else + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi +fi +AC_SUBST(ACPPFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_ADAFLAGS version: 1 updated: 2010/06/19 15:22:18 +dnl --------------- +dnl Add to $ADAFLAGS, which is substituted into makefile and scripts. +AC_DEFUN([CF_ADD_ADAFLAGS],[ + ADAFLAGS="$ADAFLAGS $1" + AC_SUBST(ADAFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15 +dnl ------------- +dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +dnl +dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS, +dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily +dnl confused by the quotes (which require backslashes to keep them usable). +AC_DEFUN([CF_ADD_CFLAGS], +[ +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $1 +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags) + ;; + esac + CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags) + ;; + esac + ;; + (*) + CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags) + ;; + esac + ;; +(yes) + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)]) + CF_APPEND_TEXT(CFLAGS,$cf_new_cflags) +fi + +if test -n "$cf_new_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)]) + CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags) +fi + +if test -n "$cf_new_extra_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)]) + CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags) +fi + +AC_SUBST(EXTRA_CPPFLAGS) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04 +dnl ------------- +dnl Add an include-directory to $CPPFLAGS. Don't add /usr/include, since it is +dnl redundant. We don't normally need to add -I/usr/local/include for gcc, +dnl but old versions (and some misinstalled ones) need that. To make things +dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to +dnl the include-path). +AC_DEFUN([CF_ADD_INCDIR], +[ +if test -n "$1" ; then + for cf_add_incdir in $1 + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir) + AC_TRY_COMPILE([#include ], + [printf("Hello")], + [], + [cf_have_incdir=yes]) + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + CF_VERBOSE(adding $cf_add_incdir to include-path) + ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05 +dnl ---------- +dnl Add a library, used to enforce consistency. +dnl +dnl $1 = library to add, without the "-l" +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42 +dnl ------------- +dnl Adds to the library-path +dnl +dnl Some machines have trouble with multiple -L options. +dnl +dnl $1 is the (list of) directory(s) to add +dnl $2 is the optional name of the variable to update (default LDFLAGS) +dnl +AC_DEFUN([CF_ADD_LIBDIR], +[ +if test -n "$1" ; then + for cf_add_libdir in $1 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + CF_VERBOSE(adding $cf_add_libdir to library-path) + ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])" + fi + fi + done +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33 +dnl ----------- +dnl Add one or more libraries, used to enforce consistency. Libraries are +dnl prepended to an existing list, since their dependencies are assumed to +dnl already exist in the list. +dnl +dnl $1 = libraries to add, with the "-l", etc. +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIBS],[ +cf_add_libs="[$]ifelse($2,,LIBS,[$2])" +# reverse order +cf_add_0lib= +for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +ifelse($2,,LIBS,[$2])="$cf_add_libs" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42 +dnl ------------------ +dnl Append to a search-list for a nonstandard header/lib-file +dnl $1 = the variable to return as result +dnl $2 = the package name +dnl $3 = the subdirectory, e.g., bin, include or lib +dnl $4 = the directory under which we will test for subdirectories +dnl $5 = a directory that we do not want $4 to match +AC_DEFUN([CF_ADD_SUBDIR_PATH], +[ +test "x$4" != "x$5" && \ +test -d "$4" && \ +ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) { + test -n "$verbose" && echo " ... testing for $3-directories under $4" + test -d "$4/$3" && $1="[$]$1 $4/$3" + test -d "$4/$3/$2" && $1="[$]$1 $4/$3/$2" + test -d "$4/$3/$2/$3" && $1="[$]$1 $4/$3/$2/$3" + test -d "$4/$2/$3" && $1="[$]$1 $4/$2/$3" + test -d "$4/$2/$3/$2" && $1="[$]$1 $4/$2/$3/$2" +} +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40 +dnl ---------------- +dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions. +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +define([CF_APPEND_CFLAGS], +[ +for cf_add_cflags in $1 +do + case "x$cf_add_cflags" in + (x-[[DU]]*) + CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2]) + CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2]) + ;; + esac + CF_ADD_CFLAGS([$cf_add_cflags],[$2]) +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55 +dnl -------------- +dnl use this macro for appending text without introducing an extra blank at +dnl the beginning +define([CF_APPEND_TEXT], +[ + test -n "[$]$1" && $1="[$]$1 " + $1="[$]{$1}$2" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31 +dnl -------------- +dnl Allow user to disable a normally-on option. +AC_DEFUN([CF_ARG_DISABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31 +dnl ------------- +dnl Allow user to enable a normally-off option. +AC_DEFUN([CF_ARG_ENABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14 +dnl ------------- +dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus +dnl values. +dnl +dnl Parameters: +dnl $1 = option name +dnl $2 = help-string +dnl $3 = action to perform if option is not default +dnl $4 = action if perform if option is default +dnl $5 = default option value (either 'yes' or 'no') +AC_DEFUN([CF_ARG_OPTION], +[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes) + if test "$enableval" != "$5" ; then +ifelse([$3],,[ :]dnl +,[ $3]) ifelse([$4],,,[ + else + $4]) + fi],[enableval=$5 ifelse([$4],,,[ + $4 +])dnl +])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_AR_FLAGS version: 9 updated: 2021/01/01 13:31:04 +dnl ----------- +dnl Check for suitable "ar" (archiver) options for updating an archive. +dnl +dnl In particular, handle some obsolete cases where the "-" might be omitted, +dnl as well as a workaround for breakage of make's archive rules by the GNU +dnl binutils "ar" program. +AC_DEFUN([CF_AR_FLAGS],[ +AC_REQUIRE([CF_PROG_AR]) + +AC_CACHE_CHECK(for options to update archives, cf_cv_ar_flags,[ + case "$cf_cv_system_name" in + (*-msvc*) + cf_cv_ar_flags='' + cat >mk_static_lib.sh <<-EOF + #!$SHELL + MSVC_BIN="[$]AR" + out="\[$]1" + shift + exec \[$]MSVC_BIN -out:"\[$]out" \[$]@ + EOF + chmod +x mk_static_lib.sh + AR=`pwd`/mk_static_lib.sh + ;; + (*) + cf_cv_ar_flags=unknown + for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv + do + + # check if $ARFLAGS already contains this choice + if test "x$ARFLAGS" != "x" ; then + cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"` + if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then + cf_cv_ar_flags= + break + fi + fi + + rm -f "conftest.$ac_cv_objext" + rm -f conftest.a + + cat >"conftest.$ac_ext" <&AC_FD_CC + $AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&AC_FD_CC 1>/dev/null + if test -f conftest.a ; then + cf_cv_ar_flags="$cf_ar_flags" + break + fi + else + CF_VERBOSE(cannot compile test-program) + break + fi + done + rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext" + ;; + esac +]) + +if test -n "$ARFLAGS" ; then + if test -n "$cf_cv_ar_flags" ; then + ARFLAGS="$ARFLAGS $cf_cv_ar_flags" + fi +else + ARFLAGS=$cf_cv_ar_flags +fi + +AC_SUBST(ARFLAGS) +]) +dnl --------------------------------------------------------------------------- +dnl CF_BUILD_CC version: 13 updated: 2024/06/22 13:42:22 +dnl ----------- +dnl If we're cross-compiling, allow the user to override the tools and their +dnl options. The configure script is oriented toward identifying the host +dnl compiler, etc., but we need a build compiler to generate parts of the +dnl source. +dnl +dnl $1 = default for $CPPFLAGS +dnl $2 = default for $LIBS +AC_DEFUN([CF_BUILD_CC],[ +CF_ACVERSION_CHECK(2.52,, + [AC_REQUIRE([CF_PROG_EXT])]) +if test "$cross_compiling" = yes ; then + + # defaults that we might want to override + : ${BUILD_CFLAGS:=''} + : ${BUILD_CPPFLAGS:='ifelse([$1],,,[$1])'} + : ${BUILD_LDFLAGS:=''} + : ${BUILD_LIBS:='ifelse([$2],,,[$2])'} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} + + AC_ARG_WITH(build-cc, + [ --with-build-cc=XXX the build C compiler ($BUILD_CC)], + [BUILD_CC="$withval"], + [AC_CHECK_PROGS(BUILD_CC, [gcc clang c99 c89 cc cl],none)]) + AC_MSG_CHECKING(for native build C compiler) + AC_MSG_RESULT($BUILD_CC) + + AC_MSG_CHECKING(for native build C preprocessor) + AC_ARG_WITH(build-cpp, + [ --with-build-cpp=XXX the build C preprocessor ($BUILD_CPP)], + [BUILD_CPP="$withval"], + [BUILD_CPP='${BUILD_CC} -E']) + AC_MSG_RESULT($BUILD_CPP) + + AC_MSG_CHECKING(for native build C flags) + AC_ARG_WITH(build-cflags, + [ --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)], + [BUILD_CFLAGS="$withval"]) + AC_MSG_RESULT($BUILD_CFLAGS) + + AC_MSG_CHECKING(for native build C preprocessor-flags) + AC_ARG_WITH(build-cppflags, + [ --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)], + [BUILD_CPPFLAGS="$withval"]) + AC_MSG_RESULT($BUILD_CPPFLAGS) + + AC_MSG_CHECKING(for native build linker-flags) + AC_ARG_WITH(build-ldflags, + [ --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)], + [BUILD_LDFLAGS="$withval"]) + AC_MSG_RESULT($BUILD_LDFLAGS) + + AC_MSG_CHECKING(for native build linker-libraries) + AC_ARG_WITH(build-libs, + [ --with-build-libs=XXX the build libraries (${BUILD_LIBS})], + [BUILD_LIBS="$withval"]) + AC_MSG_RESULT($BUILD_LIBS) + + # this assumes we're on Unix. + BUILD_EXEEXT= + BUILD_OBJEXT=o + + : ${BUILD_CC:='${CC}'} + + AC_MSG_CHECKING(if the build-compiler "$BUILD_CC" works) + + cf_save_crossed=$cross_compiling + cf_save_ac_link=$ac_link + cross_compiling=no + cf_build_cppflags=$BUILD_CPPFLAGS + test "$cf_build_cppflags" = "#" && cf_build_cppflags= + ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $cf_build_cppflags $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&AS_MESSAGE_LOG_FD' + + AC_TRY_RUN([#include + int main(int argc, char *argv[]) + { + ${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0); + } + ], + cf_ok_build_cc=yes, + cf_ok_build_cc=no, + cf_ok_build_cc=unknown) + + cross_compiling=$cf_save_crossed + ac_link=$cf_save_ac_link + + AC_MSG_RESULT($cf_ok_build_cc) + + if test "$cf_ok_build_cc" != yes + then + AC_MSG_ERROR([Cross-build requires two compilers. +Use --with-build-cc to specify the native compiler.]) + fi + +else + : ${BUILD_CC:='${CC}'} + : ${BUILD_CPP:='${CPP}'} + : ${BUILD_CFLAGS:='${CFLAGS}'} + : ${BUILD_CPPFLAGS:='${CPPFLAGS}'} + : ${BUILD_LDFLAGS:='${LDFLAGS}'} + : ${BUILD_LIBS:='${LIBS}'} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} +fi + +AC_SUBST(BUILD_CC) +AC_SUBST(BUILD_CPP) +AC_SUBST(BUILD_CFLAGS) +AC_SUBST(BUILD_CPPFLAGS) +AC_SUBST(BUILD_LDFLAGS) +AC_SUBST(BUILD_LIBS) +AC_SUBST(BUILD_EXEEXT) +AC_SUBST(BUILD_OBJEXT) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_C11_NORETURN version: 4 updated: 2023/02/18 17:41:25 +dnl --------------- +AC_DEFUN([CF_C11_NORETURN], +[ +AC_MSG_CHECKING(if you want to use C11 _Noreturn feature) +CF_ARG_ENABLE(stdnoreturn, + [ --enable-stdnoreturn enable C11 _Noreturn feature for diagnostics], + [enable_stdnoreturn=yes], + [enable_stdnoreturn=no]) +AC_MSG_RESULT($enable_stdnoreturn) + +if test $enable_stdnoreturn = yes; then +AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn, + [AC_TRY_COMPILE([ +$ac_includes_default +#include +static _Noreturn void giveup(void) { exit(0); } + ], + [if (feof(stdin)) giveup()], + cf_cv_c11_noreturn=yes, + cf_cv_c11_noreturn=no) + ]) +else + cf_cv_c11_noreturn=no, +fi + +if test "$cf_cv_c11_noreturn" = yes; then + AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if header is available and working]) + AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported]) + HAVE_STDNORETURN_H=1 +else + HAVE_STDNORETURN_H=0 +fi + +AC_SUBST(HAVE_STDNORETURN_H) +AC_SUBST(STDC_NORETURN) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CC_ENV_FLAGS version: 11 updated: 2023/02/20 11:15:46 +dnl --------------- +dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content +dnl into CC. This will not help with broken scripts that wrap the compiler +dnl with options, but eliminates a more common category of user confusion. +dnl +dnl In particular, it addresses the problem of being able to run the C +dnl preprocessor in a consistent manner. +dnl +dnl Caveat: this also disallows blanks in the pathname for the compiler, but +dnl the nuisance of having inconsistent settings for compiler and preprocessor +dnl outweighs that limitation. +AC_DEFUN([CF_CC_ENV_FLAGS], +[ +# This should have been defined by AC_PROG_CC +: "${CC:=cc}" + +AC_MSG_CHECKING(\$CFLAGS variable) +case "x$CFLAGS" in +(*-[[IUD]]*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options) + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + CF_ADD_CFLAGS($cf_arg) + done + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac + +AC_MSG_CHECKING(\$CC variable) +case "$CC" in +(*[[\ \ ]]-*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options) + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'` + cf_flags=`echo "$CC" | sed -e "s%^$cf_prog%%"` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[[IUDfgOW]]*) + CF_ADD_CFLAGS($cf_arg) + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + CF_VERBOSE(resulting CC: '$CC') + CF_VERBOSE(resulting CFLAGS: '$CFLAGS') + CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS') + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CFG_DEFAULTS version: 16 updated: 2021/01/04 19:33:05 +dnl --------------- +dnl Determine the default configuration into which we'll install ncurses. This +dnl can be overridden by the user's command-line options. There's two items to +dnl look for: +dnl 1. the prefix (e.g., /usr) +dnl 2. the header files (e.g., /usr/include/ncurses) +dnl We'll look for a previous installation of ncurses and use the same defaults. +dnl +dnl We don't use AC_PREFIX_DEFAULT, because it gets evaluated too soon, and +dnl we don't use AC_PREFIX_PROGRAM, because we cannot distinguish ncurses's +dnl programs from a vendor's. +AC_DEFUN([CF_CFG_DEFAULTS], +[AC_REQUIRE([AC_PROG_FGREP])dnl + +AC_MSG_CHECKING(for prefix) +if test "x$prefix" = "xNONE" ; then + case "$cf_cv_system_name" in + # non-vendor systems don't have a conflict + (openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*) + prefix=/usr + ;; + (*) prefix=$ac_default_prefix + ;; + esac +fi +AC_MSG_RESULT($prefix) + +if test "x$prefix" = "xNONE" ; then +AC_MSG_CHECKING(for default include-directory) +test -n "$verbose" && echo 1>&AC_FD_MSG +for cf_symbol in \ + "$includedir" \ + "$includedir/ncurses" \ + "$prefix/include" \ + "$prefix/include/ncurses" \ + /usr/local/include \ + /usr/local/include/ncurses \ + /usr/include \ + /usr/include/ncurses +do + cf_dir=`eval echo "$cf_symbol"` + if test -f "$cf_dir/curses.h" ; then + if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then + includedir="$cf_symbol" + test -n "$verbose" && echo $ECHO_N " found " 1>&AC_FD_MSG + break + fi + fi + test -n "$verbose" && echo " tested $cf_dir" 1>&AC_FD_MSG +done +AC_MSG_RESULT($includedir) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15 +dnl -------------- +dnl Check if we're accidentally using a cache from a different machine. +dnl Derive the system name, as a check for reusing the autoconf cache. +dnl +dnl If we've packaged config.guess and config.sub, run that (since it does a +dnl better job than uname). Normally we'll use AC_CANONICAL_HOST, but allow +dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM +dnl which is useful in cross-compiles. +dnl +dnl Note: we would use $ac_config_sub, but that is one of the places where +dnl autoconf 2.5x broke compatibility with autoconf 2.13 +AC_DEFUN([CF_CHECK_CACHE], +[ +if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then + ifelse([$1],,[AC_CANONICAL_HOST],[$1]) + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.]) +AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"]) + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name) + +if test ".$system_name" != ".$cf_cv_system_name" ; then + AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)) + AC_MSG_ERROR("Please remove config.cache and try again.") +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_GNAT_VERSION version: 4 updated: 2021/01/01 13:31:04 +dnl --------------------- +AC_DEFUN([CF_CHECK_GNAT_VERSION], +[ +AC_REQUIRE([CF_GNAT_VERSION]) +case "$cf_cv_gnat_version" in +(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]]) + cf_cv_prog_gnat_correct=yes + ;; +(*) + AC_MSG_WARN(Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding.) + cf_cv_prog_gnat_correct=no + ;; +esac +]) +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_LIBSSP version: 1 updated: 2021/10/30 10:40:19 +dnl --------------- +dnl Check if libssp is needed, e.g., to work around misconfigured libraries +dnl used in cross-compiling to MinGW. +AC_DEFUN([CF_CHECK_LIBSSP],[ +AC_CACHE_CHECK(if ssp library is needed,cf_cv_need_libssp,[ +AC_TRY_LINK([ +#include +#include +],[ + DIR *dp = opendir("."); +],cf_cv_need_libssp=no,[ + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lssp" + AC_TRY_LINK([ +#include +#include + ],[ + DIR *dp = opendir("."); + ],cf_cv_need_libssp=yes, + cf_cv_need_libssp=maybe) + LIBS="$cf_save_LIBS" +])dnl +]) + +if test "x$cf_cv_need_libssp" = xyes +then + CF_ADD_LIB(ssp) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CLANG_COMPILER version: 9 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Check if the given compiler is really clang. clang's C driver defines +dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does +dnl not ignore some gcc options. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = CLANG_COMPILER (default) +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_CLANG_COMPILER],[ +ifelse([$2],,CLANG_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + AC_TRY_COMPILE([],[ +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif +],[ifelse([$2],,CLANG_COMPILER,[$2])=yes +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2])) +fi + +CLANG_VERSION=none + +if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then + case "$CC" in + (c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]]) + AC_MSG_WARN(replacing broken compiler alias $CC) + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + AC_MSG_CHECKING(version of $CC) + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + AC_MSG_RESULT($CLANG_VERSION) + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + AC_MSG_CHECKING(if option $cf_clang_opt works) + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + AC_TRY_LINK([ + #include ],[ + printf("hello!\\n");],[ + cf_clang_optok=yes],[ + cf_clang_optok=no]) + AC_MSG_RESULT($cf_clang_optok) + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + CF_VERBOSE(adding option $cf_clang_opt) + CF_APPEND_TEXT(CFLAGS,$cf_clang_opt) + fi + done +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_CONST_X_STRING version: 8 updated: 2023/12/01 17:22:50 +dnl ----------------- +dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most +dnl character-strings. +dnl +dnl It is ambiguous because the specification accommodated the pre-ANSI +dnl compilers bundled by more than one vendor in lieu of providing a standard C +dnl compiler other than by costly add-ons. Because of this, the specification +dnl did not take into account the use of const for telling the compiler that +dnl string literals would be in readonly memory. +dnl +dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to +dnl let the compiler decide how to represent Xt's strings which were #define'd. +dnl That does not solve the problem of using the block of Xt's strings which +dnl are compiled into the library (and is less efficient than one might want). +dnl +dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both +dnl when compiling the library and compiling using the library, to tell the +dnl compiler that String is const. +AC_DEFUN([CF_CONST_X_STRING], +[ +AC_REQUIRE([AC_PATH_XTRA]) + +CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING]) + +AC_TRY_COMPILE( +[ +#include +#include +], +[String foo = malloc(1); free((void*)foo)],[ + +AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[ + AC_TRY_COMPILE( + [ +#undef _CONST_X_STRING +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + ],[String foo = malloc(1); *foo = 0],[ + cf_cv_const_x_string=no + ],[ + cf_cv_const_x_string=yes + ]) +]) + +CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING]) + +case "$cf_cv_const_x_string" in +(no) + CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES) + ;; +(*) + CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING) + ;; +esac + +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_HEADER version: 6 updated: 2022/12/02 20:06:52 +dnl ---------------- +dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common +dnl variations of ncurses' installs. +dnl +dnl $1 = ncurses when looking for ncurses, or is empty +AC_DEFUN([CF_CURSES_HEADER],[ +AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[ +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h ifelse($1,,,[$1/ncurses.h]) \ + curses.h ifelse($1,,,[$1/curses.h]) ifelse($1,,[ncurses/ncurses.h ncurses/curses.h]) +do +AC_TRY_COMPILE([#include <${cf_header}>], + [initscr(); endwin()], + [cf_cv_ncurses_header=$cf_header; break],[]) +done +]) + +if test "$cf_cv_ncurses_header" = none ; then + AC_MSG_ERROR(No curses header-files found) +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. +AC_CHECK_HEADERS($cf_cv_ncurses_header) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42 +dnl ---------- +dnl "dirname" is not portable, so we fake it with a shell script. +AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04 +dnl --------------- +dnl You can always use "make -n" to see the actual options, but it is hard to +dnl pick out/analyze warning messages when the compile-line is long. +dnl +dnl Sets: +dnl ECHO_LT - symbol to control if libtool is verbose +dnl ECHO_LD - symbol to prefix "cc -o" lines +dnl RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o) +dnl SHOW_CC - symbol to put before explicit "cc -c" lines +dnl ECHO_CC - symbol to put before any "cc" line +dnl +AC_DEFUN([CF_DISABLE_ECHO],[ +AC_MSG_CHECKING(if you want to see long compiling messages) +CF_ARG_DISABLE(echo, + [ --disable-echo do not display "compiling" commands], + [ + ECHO_LT='--silent' + ECHO_LD='@echo linking [$]@;' + RULE_CC='@echo compiling [$]<' + SHOW_CC='@echo compiling [$]@' + ECHO_CC='@' +],[ + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' +]) +AC_MSG_RESULT($enableval) +AC_SUBST(ECHO_LT) +AC_SUBST(ECHO_LD) +AC_SUBST(RULE_CC) +AC_SUBST(SHOW_CC) +AC_SUBST(ECHO_CC) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_GNAT_PROJECTS version: 1 updated: 2014/06/01 11:34:00 +dnl ------------------------ +AC_DEFUN([CF_DISABLE_GNAT_PROJECTS],[ +AC_MSG_CHECKING(if we want to use GNAT projects) +CF_ARG_DISABLE(gnat-projects, + [ --disable-gnat-projects test: disable GNAT projects even if usable], + [enable_gnat_projects=no], + [enable_gnat_projects=yes]) +AC_MSG_RESULT($enable_gnat_projects) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_BROKEN_LINKER version: 2 updated: 2021/01/02 17:09:14 +dnl ----------------------- +dnl Some linkers cannot reference a data-only object. Cygwin used to be one. +dnl This usually follows CF_LINK_DATAONLY, but is not required in case we need +dnl an unconditional feature. +AC_DEFUN([CF_ENABLE_BROKEN_LINKER],[ + +AC_MSG_CHECKING(if you want broken-linker support code) +AC_ARG_ENABLE(broken_linker, + [ --enable-broken_linker compile with broken-linker support code], + [with_broken_linker=$enableval], + [with_broken_linker=no]) +AC_MSG_RESULT($with_broken_linker) + +: "${BROKEN_LINKER:=0}" +if test "x$with_broken_linker" = xyes ; then + AC_DEFINE(BROKEN_LINKER,1,[Define to 1 to work around linkers which cannot link data-only modules]) + BROKEN_LINKER=1 +fi +AC_SUBST(BROKEN_LINKER) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50 +dnl ------------------ +dnl Configure-option to enable gcc warnings +dnl +dnl $1 = extra options to add, if supported +dnl $2 = option for checking attributes. By default, this is done when +dnl warnings are enabled. For other values: +dnl yes: always do this, e.g., to use in generated library-headers +dnl no: never do this +AC_DEFUN([CF_ENABLE_WARNINGS],[ +if test "$GCC" = yes || test "$GXX" = yes +then +CF_FIX_WARNINGS(CFLAGS) +CF_FIX_WARNINGS(CPPFLAGS) +CF_FIX_WARNINGS(LDFLAGS) +AC_MSG_CHECKING(if you want to turn on gcc warnings) +CF_ARG_ENABLE(warnings, + [ --enable-warnings test: turn on gcc compiler warnings], + [enable_warnings=yes], + [enable_warnings=no]) +AC_MSG_RESULT($enable_warnings) +if test "$enable_warnings" = "yes" +then + ifelse($2,,[CF_GCC_ATTRIBUTES]) + CF_GCC_WARNINGS($1) +fi +ifelse($2,yes,[CF_GCC_ATTRIBUTES]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIND_LIBRARY version: 11 updated: 2021/01/02 09:31:20 +dnl --------------- +dnl Look for a non-standard library, given parameters for AC_TRY_LINK. We +dnl prefer a standard location, and use -L options only if we do not find the +dnl library in the standard library location(s). +dnl $1 = library name +dnl $2 = library class, usually the same as library name +dnl $3 = includes +dnl $4 = code fragment to compile/link +dnl $5 = corresponding function-name +dnl $6 = flag, nonnull if failure should not cause an error-exit +dnl +dnl Sets the variable "$cf_libdir" as a side-effect, so we can see if we had +dnl to use a -L option. +AC_DEFUN([CF_FIND_LIBRARY], +[ + eval 'cf_cv_have_lib_'"$1"'=no' + cf_libdir="" + AC_CHECK_FUNC($5, + eval 'cf_cv_have_lib_'"$1"'=yes',[ + cf_save_LIBS="$LIBS" + AC_MSG_CHECKING(for $5 in -l$1) + LIBS="-l$1 $LIBS" + AC_TRY_LINK([$3],[$4], + [AC_MSG_RESULT(yes) + eval 'cf_cv_have_lib_'"$1"'=yes' + ], + [AC_MSG_RESULT(no) + CF_LIBRARY_PATH(cf_search,$2) + for cf_libdir in $cf_search + do + AC_MSG_CHECKING(for -l$1 in $cf_libdir) + LIBS="-L$cf_libdir -l$1 $cf_save_LIBS" + AC_TRY_LINK([$3],[$4], + [AC_MSG_RESULT(yes) + eval 'cf_cv_have_lib_'"$1"'=yes' + break], + [AC_MSG_RESULT(no) + LIBS="$cf_save_LIBS"]) + done + ]) + ]) +eval 'cf_found_library="[$]cf_cv_have_lib_'"$1"\" +ifelse($6,,[ +if test "$cf_found_library" = no ; then + AC_MSG_ERROR(Cannot link $1 library) +fi +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42 +dnl --------------- +dnl Find a library (specifically the linkage used in the code fragment), +dnl searching for it if it is not already in the library path. +dnl See also CF_ADD_SEARCHPATH. +dnl +dnl Parameters (4-on are optional): +dnl $1 = headers for library entrypoint +dnl $2 = code fragment for library entrypoint +dnl $3 = the library name without the "-l" option or ".so" suffix. +dnl $4 = action to perform if successful (default: update CPPFLAGS, etc) +dnl $5 = action to perform if not successful +dnl $6 = module name, if not the same as the library name +dnl $7 = extra libraries +dnl +dnl Sets these variables: +dnl $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found +dnl $cf_cv_header_path_$3 - include-directory if needed +dnl $cf_cv_library_path_$3 - library-directory if needed +dnl $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3 +AC_DEFUN([CF_FIND_LINKAGE],[ + +# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these +# will be set on completion of the AC_TRY_LINK below. +cf_cv_header_path_$3= +cf_cv_library_path_$3= + +CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)]) + +cf_save_LIBS="$LIBS" + +AC_TRY_LINK([$1],[$2],[ + cf_cv_find_linkage_$3=yes + cf_cv_header_path_$3=/usr/include + cf_cv_library_path_$3=/usr/lib +],[ + +LIBS="-l$3 $7 $cf_save_LIBS" + +AC_TRY_LINK([$1],[$2],[ + cf_cv_find_linkage_$3=yes + cf_cv_header_path_$3=/usr/include + cf_cv_library_path_$3=/usr/lib + cf_cv_library_file_$3="-l$3" +],[ + cf_cv_find_linkage_$3=no + LIBS="$cf_save_LIBS" + + CF_VERBOSE(find linkage for $3 library) + CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)]) + + cf_save_CPPFLAGS="$CPPFLAGS" + cf_test_CPPFLAGS="$CPPFLAGS" + + CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6])) + for cf_cv_header_path_$3 in $cf_search + do + if test -d "$cf_cv_header_path_$3" ; then + CF_VERBOSE(... testing $cf_cv_header_path_$3) + CPPFLAGS="$cf_save_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3) + AC_TRY_COMPILE([$1],[$2],[ + CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3) + cf_cv_find_linkage_$3=maybe + cf_test_CPPFLAGS="$CPPFLAGS" + break],[ + CPPFLAGS="$cf_save_CPPFLAGS" + ]) + fi + done + + if test "$cf_cv_find_linkage_$3" = maybe ; then + + CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)]) + + cf_save_LIBS="$LIBS" + cf_save_LDFLAGS="$LDFLAGS" + + ifelse([$6],,,[ + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-l$3 $7 $cf_save_LIBS" + AC_TRY_LINK([$1],[$2],[ + CF_VERBOSE(... found $3 library in system) + cf_cv_find_linkage_$3=yes]) + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + ]) + + if test "$cf_cv_find_linkage_$3" != yes ; then + CF_LIBRARY_PATH(cf_search,$3) + for cf_cv_library_path_$3 in $cf_search + do + if test -d "$cf_cv_library_path_$3" ; then + CF_VERBOSE(... testing $cf_cv_library_path_$3) + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-l$3 $7 $cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3" + AC_TRY_LINK([$1],[$2],[ + CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3) + cf_cv_find_linkage_$3=yes + cf_cv_library_file_$3="-l$3" + break],[ + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS" + ]) + fi + done + CPPFLAGS="$cf_save_CPPFLAGS" + LDFLAGS="$cf_save_LDFLAGS" + fi + + else + cf_cv_find_linkage_$3=no + fi + ],$7) +]) + +LIBS="$cf_save_LIBS" + +if test "$cf_cv_find_linkage_$3" = yes ; then +ifelse([$4],,[ + CF_ADD_INCDIR($cf_cv_header_path_$3) + CF_ADD_LIBDIR($cf_cv_library_path_$3) + CF_ADD_LIB($3) +],[$4]) +else +ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIXUP_ADAFLAGS version: 2 updated: 2015/04/17 21:13:04 +dnl ----------------- +dnl make ADAFLAGS consistent with CFLAGS +AC_DEFUN([CF_FIXUP_ADAFLAGS],[ + AC_MSG_CHECKING(optimization options for ADAFLAGS) + case "$CFLAGS" in + (*-g*) + CF_ADD_ADAFLAGS(-g) + ;; + esac + case "$CFLAGS" in + (*-O*) + cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[[ ]].*//'` + CF_ADD_ADAFLAGS($cf_O_flag) + ;; + esac + AC_MSG_RESULT($ADAFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31 +dnl --------------- +dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc. Any of gcc's +dnl "-Werror" flags can interfere with configure-checks. Those go into +dnl EXTRA_CFLAGS. +dnl +dnl $1 = variable name to repair +define([CF_FIX_WARNINGS],[ +if test "$GCC" = yes || test "$GXX" = yes +then + case [$]$1 in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in [$]$1 + do + case "x$cf_temp_scan" in + (x-Werror=format*) + CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan) + ;; + (x-Werror=*) + CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan) + ;; + (*) + CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan) + ;; + esac + done + if test "x[$]$1" != "x$cf_temp_flags" + then + CF_VERBOSE(repairing $1: [$]$1) + $1="$cf_temp_flags" + CF_VERBOSE(... fixed [$]$1) + CF_VERBOSE(... extra $EXTRA_CFLAGS) + fi + ;; + esac +fi +AC_SUBST(EXTRA_CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_GETTIME version: 3 updated: 2024/05/11 13:40:02 +dnl --------------- +dnl Check for gettimeofday or clock_gettime. In 2023, the former is still more +dnl widely supported, but "deprecated" (2008), so we will use the latter if it +dnl is available, to reduce compiler warnings. +AC_DEFUN([CF_FUNC_GETTIME],[ +cf_save_libs="$LIBS" +AC_CHECK_FUNC(clock_gettime, + cf_cv_test_clock_gettime=yes, + AC_CHECK_LIB(rt, clock_gettime, + [LIBS="-lrt $LIBS" + cf_cv_test_clock_gettime=yes], + cf_cv_test_clock_gettime=no)) + +if test "$cf_cv_test_clock_gettime" = yes ; then +AC_CACHE_CHECK(if clock_gettime links,cf_cv_func_clock_gettime,[ + AC_TRY_LINK([ +$ac_includes_default +#include + ], + [struct timespec ts; + int rc = clock_gettime(CLOCK_REALTIME, &ts) + + clock_gettime(CLOCK_MONOTONIC, &ts); + (void) rc; (void)ts], + [cf_cv_func_clock_gettime=yes], + [cf_cv_func_clock_gettime=no]) +]) +else + cf_cv_func_clock_gettime=no +fi + +if test "$cf_cv_func_clock_gettime" = yes +then + AC_DEFINE(HAVE_CLOCK_GETTIME,1,[Define to 1 if we have clock_gettime function]) +else +AC_CHECK_FUNC(gettimeofday, + AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]),[ + +AC_CHECK_LIB(bsd, gettimeofday, + AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]) + CF_ADD_LIB(bsd))])dnl CLIX: bzero, select, gettimeofday +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25 +dnl ----------------- +dnl Test for availability of useful gcc __attribute__ directives to quiet +dnl compiler warnings. Though useful, not all are supported -- and contrary +dnl to documentation, unrecognized directives cause older compilers to barf. +AC_DEFUN([CF_GCC_ATTRIBUTES], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([CF_C11_NORETURN])dnl + +if test "$GCC" = yes || test "$GXX" = yes +then +cat > conftest.i < "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + CF_UPPER(cf_ATTRIBUTE,$cf_attribute) + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&AC_FD_CC + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <>confdefs.h + case "$cf_attribute" in + (noreturn) + AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc]) + ;; + (printf) + cf_value='/* nothing */' + if test "$cf_printf_attribute" != no ; then + cf_value='__attribute__((format(printf,fmt,var)))' + AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc]) + ;; + (scanf) + cf_value='/* nothing */' + if test "$cf_scanf_attribute" != no ; then + cf_value='__attribute__((format(scanf,fmt,var)))' + AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc]) + ;; + (unused) + AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc]) + ;; + esac + fi + done +else + ${FGREP-fgrep} define conftest.i >>confdefs.h +fi +rm -rf ./conftest* +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_VERSION version: 9 updated: 2023/03/05 14:30:13 +dnl -------------- +dnl Find version of gcc, and (because icc/clang pretend to be gcc without being +dnl compatible), attempt to determine if icc/clang is actually used. +AC_DEFUN([CF_GCC_VERSION],[ +AC_REQUIRE([AC_PROG_CC]) +GCC_VERSION=none +if test "$GCC" = yes ; then + AC_MSG_CHECKING(version of $CC) + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^[[^(]]*([[^)]][[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + AC_MSG_RESULT($GCC_VERSION) +fi +CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS) +CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59 +dnl --------------- +dnl Check if the compiler supports useful warning options. There's a few that +dnl we don't use, simply because they're too noisy: +dnl +dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x) +dnl -Winline (usually not worthwhile) +dnl -Wredundant-decls (system headers make this too noisy) +dnl -Wtraditional (combines too many unrelated messages, only a few useful) +dnl -Wwrite-strings (too noisy, but should review occasionally). This +dnl is enabled for ncurses using "--enable-const". +dnl -pedantic +dnl +dnl Parameter: +dnl $1 is an optional list of gcc warning flags that a particular +dnl application might want to use, e.g., "no-unused" for +dnl -Wno-unused +dnl Special: +dnl If $with_ext_const is "yes", add a check for -Wwrite-strings +dnl +AC_DEFUN([CF_GCC_WARNINGS], +[ +AC_REQUIRE([CF_GCC_VERSION]) +if test "x$have_x" = xyes; then CF_CONST_X_STRING fi +cat > "conftest.$ac_ext" </dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes +]) +test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS" +AC_SUBST(GNATPREP_OPTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_GENERICS version: 7 updated: 2021/01/01 13:31:04 +dnl ---------------- +AC_DEFUN([CF_GNAT_GENERICS], +[ +AC_REQUIRE([CF_GNAT_VERSION]) + +AC_MSG_CHECKING(if GNAT supports generics) +case "$cf_cv_gnat_version" in +(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]]) + cf_gnat_generics=yes + ;; +(*) + cf_gnat_generics=no + ;; +esac +AC_MSG_RESULT($cf_gnat_generics) + +if test "$cf_gnat_generics" = yes +then + cf_compile_generics=generics + cf_generic_objects="\${GENOBJS}" +else + cf_compile_generics= + cf_generic_objects= +fi + +AC_SUBST(cf_compile_generics) +AC_SUBST(cf_generic_objects) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_PROJECTS version: 13 updated: 2021/01/02 17:09:14 +dnl ---------------- +dnl GNAT projects are configured with ".gpr" project files. +dnl GNAT libraries are a further development, using the project feature. +AC_DEFUN([CF_GNAT_PROJECTS], +[ +AC_REQUIRE([CF_GNAT_VERSION]) +AC_REQUIRE([CF_DISABLE_GNAT_PROJECTS]) + +cf_gnat_libraries=no +cf_gnat_projects=no + +if test "$enable_gnat_projects" != no ; then +AC_MSG_CHECKING(if GNAT supports project files) +case "$cf_cv_gnat_version" in +(3.[[0-9]]*) + ;; +(*) + case "$cf_cv_system_name" in + (cygwin*|msys*) + ;; + (*) + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src conftest.bin conftest.lib + then + cd conftest.src + rm -rf ./conftest* ./*~conftest* + cat >>library.gpr <>confpackage.ads <>confpackage.adb <&AC_FD_CC 2>&1 ) ; then + cf_gnat_projects=yes + fi + cd .. + fi + if test -f conftest.lib/confpackage.ali + then + cf_gnat_libraries=yes + fi + rm -rf ./conftest* ./*~conftest* + ;; + esac + ;; +esac +AC_MSG_RESULT($cf_gnat_projects) +fi # enable_gnat_projects + +if test "$cf_gnat_projects" = yes +then + AC_MSG_CHECKING(if GNAT supports libraries) + AC_MSG_RESULT($cf_gnat_libraries) +fi + +USE_OLD_MAKERULES="" +USE_GNAT_PROJECTS="#" +USE_GNAT_MAKE_GPR="#" +USE_GNAT_GPRBUILD="#" + +if test "$cf_gnat_projects" = yes +then + USE_OLD_MAKERULES="#" + USE_GNAT_PROJECTS="" + if test "$cf_cv_VERSION_GPRBUILD" != no + then + USE_GNAT_GPRBUILD="" + elif test "$cf_cv_VERSION_GNATMAKE" != no + then + USE_GNAT_MAKE_GPR="" + else + AC_MSG_WARN(use old makefile rules since tools are missing) + fi +fi + +if test "$cf_gnat_libraries" = yes +then + USE_GNAT_LIBRARIES="" +else + USE_GNAT_LIBRARIES="#" +fi + +AC_SUBST(USE_OLD_MAKERULES) +AC_SUBST(USE_GNAT_PROJECTS) +AC_SUBST(USE_GNAT_LIBRARIES) +AC_SUBST(USE_GNAT_MAKE_GPR) +AC_SUBST(USE_GNAT_GPRBUILD) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_SIGINT version: 2 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Check if gnat supports SIGINT, and presumably tasking. For the latter, it +dnl is noted that gnat may compile a tasking unit even for configurations which +dnl fail at runtime. +AC_DEFUN([CF_GNAT_SIGINT],[ +AC_CACHE_CHECK(if GNAT supports SIGINT,cf_cv_gnat_sigint,[ +CF_GNAT_TRY_LINK([with Ada.Interrupts.Names; + +package ConfTest is + + pragma Warnings (Off); -- the next pragma exists since 3.11p + pragma Unreserve_All_Interrupts; + pragma Warnings (On); + + protected Process is + procedure Stop; + function Continue return Boolean; + pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT); + private + Done : Boolean := False; + end Process; + +end ConfTest;], +[package body ConfTest is + protected body Process is + procedure Stop is + begin + Done := True; + end Stop; + function Continue return Boolean is + begin + return not Done; + end Continue; + end Process; +end ConfTest;], + [cf_cv_gnat_sigint=yes], + [cf_cv_gnat_sigint=no])]) + +if test "$cf_cv_gnat_sigint" = yes ; then + USE_GNAT_SIGINT="" +else + USE_GNAT_SIGINT="#" +fi +AC_SUBST(USE_GNAT_SIGINT) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_TRY_LINK version: 4 updated: 2021/01/01 13:31:04 +dnl ---------------- +dnl Verify that a test program compiles/links with GNAT. +dnl $cf_ada_make is set to the program that compiles/links +dnl $ADAFLAGS may be set to the GNAT flags. +dnl +dnl $1 is the text of the spec +dnl $2 is the text of the body +dnl $3 is the shell command to execute if successful +dnl $4 is the shell command to execute if not successful +AC_DEFUN([CF_GNAT_TRY_LINK], +[ +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&AC_FD_CC 2>&1 ) ; then +ifelse($3,, :,[ $3]) +ifelse($4,,,[else + $4]) +fi +rm -rf ./conftest* ./*~conftest* +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_TRY_RUN version: 6 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Verify that a test program compiles and runs with GNAT +dnl $cf_ada_make is set to the program that compiles/links +dnl $ADAFLAGS may be set to the GNAT flags. +dnl +dnl $1 is the text of the spec +dnl $2 is the text of the body +dnl $3 is the shell command to execute if successful +dnl $4 is the shell command to execute if not successful +AC_DEFUN([CF_GNAT_TRY_RUN], +[ +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&AC_FD_CC 2>&1 ) ; then + if ( ./conftest 1>&AC_FD_CC 2>&1 ) ; then +ifelse($3,, :,[ $3]) +ifelse($4,,,[ else + $4]) + fi +ifelse($4,,,[else + $4]) +fi +rm -rf ./conftest* ./*~conftest* +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_VERSION version: 22 updated: 2019/12/31 08:53:54 +dnl --------------- +dnl $1 = cache variable to update +dnl $2 = program name +dnl Verify version of GNAT or related tool +AC_DEFUN([CF_GNAT_VERSION], +[ +AC_CACHE_CHECK(for ifelse($2,,gnat,$2) version, cf_cv_gnat_version,[ +cf_cv_gnat_version=`ifelse($2,,${cf_ada_make:-gnatmake},$2) --version 2>&1 | \ + grep '[[0-9]].[[0-9]][[0-9]]*' |\ + sed -e '2,$d' -e 's/[[^0-9 \.]]//g' -e 's/^[[ ]]*//' -e 's/ .*//'` +]) +test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no +ifelse($1,,,[eval $1=$cf_cv_gnat_version; unset cf_cv_gnat_version]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41 +dnl ------------- +dnl Check if we must define _GNU_SOURCE to get a reasonable value for +dnl _XOPEN_SOURCE, upon which many POSIX definitions depend. This is a defect +dnl (or misfeature) of glibc2, which breaks portability of many applications, +dnl since it is interwoven with GNU extensions. +dnl +dnl Well, yes we could work around it... +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +AC_DEFUN([CF_GNU_SOURCE], +[ +cf_gnu_xopen_source=ifelse($1,,500,$1) + +AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[ +AC_TRY_COMPILE([#include ],[ + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif], + [cf_cv_gnu_library=yes], + [cf_cv_gnu_library=no]) +]) + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[ + cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + AC_TRY_COMPILE([#include ],[ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif], + [cf_cv_gnu_library_219=yes], + [cf_cv_gnu_library_219=no]) + CPPFLAGS="$cf_save" + ]) + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[ + CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source) + AC_TRY_COMPILE([ + #include + #include + ],[ + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif], + [cf_cv_gnu_dftsrc_219=yes], + [cf_cv_gnu_dftsrc_219=no]) + ]) + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[ + AC_TRY_COMPILE([#include ],[ + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif], + [cf_cv_gnu_source=no], + [cf_save="$CPPFLAGS" + CF_ADD_CFLAGS(-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif], + [cf_cv_gnu_source=no], + [cf_cv_gnu_source=yes]) + CPPFLAGS="$cf_save" + ]) + ]) + + if test "$cf_cv_gnu_source" = yes + then + AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[ + CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif], + [cf_cv_default_source=no], + [cf_cv_default_source=yes]) + ]) + if test "$cf_cv_default_source" = yes + then + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + fi + fi + fi + +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Construct a search-list of directories for a nonstandard header-file +dnl +dnl Parameters +dnl $1 = the variable to return as result +dnl $2 = the package name +AC_DEFUN([CF_HEADER_PATH], +[ +$1= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE) + cf_header_path_list="$cf_header_path_list [$]$1" + ;; + esac + done +fi + +# add the variations for the package we are looking for +CF_SUBDIR_PATH($1,$2,include) + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && $1="[$]$1 $includedir" + test -d "$includedir/$2" && $1="[$]$1 $includedir/$2" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && $1="[$]$1 $oldincludedir" + test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2" +} + +$1="[$]$1 $cf_header_path_list" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54 +dnl --------------- +dnl Insert text into the help-message, for readability, from AC_ARG_WITH. +AC_DEFUN([CF_HELP_MESSAGE], +[CF_ACVERSION_CHECK(2.53,[],[ +AC_DIVERT_HELP($1)])dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INCLUDE_DIRS version: 10 updated: 2014/09/19 20:58:42 +dnl --------------- +dnl Construct the list of include-options according to whether we're building +dnl in the source directory or using '--srcdir=DIR' option. +AC_DEFUN([CF_INCLUDE_DIRS], +[ +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS" +fi +CPPFLAGS="-I../include $CPPFLAGS" +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir} $CPPFLAGS" +fi +CPPFLAGS="-I. $CPPFLAGS" +AC_SUBST(CPPFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPTS version: 3 updated: 2023/06/03 15:17:30 +dnl --------------- +dnl prompt for/fill-in useful install-program options +AC_DEFUN([CF_INSTALL_OPTS], +[ +CF_INSTALL_OPT_S +CF_INSTALL_OPT_P +CF_INSTALL_OPT_O +CF_INSTALL_OPT_STRIP_PROG +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_O version: 3 updated: 2020/12/31 20:19:42 +dnl ---------------- +dnl Almost all "install" programs default to the current user's ownership. +dnl Almost - MINIX is an exception. +AC_DEFUN([CF_INSTALL_OPT_O], +[ +AC_MSG_CHECKING(if install needs to be told about ownership) +case `$ac_config_guess` in +(*minix) + with_install_o=yes + ;; +(*) + with_install_o=no + ;; +esac + +AC_MSG_RESULT($with_install_o) +if test "x$with_install_o" = xyes +then + INSTALL_OPT_O="`id root|sed -e 's/uid=[[0-9]]*(/ -o /' -e 's/gid=[[0-9]]*(/ -g /' -e 's/ [[^=[:space:]]][[^=[:space:]]]*=.*/ /' -e 's/)//g'`" +else + INSTALL_OPT_O= +fi + +AC_SUBST(INSTALL_OPT_O) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_P version: 3 updated: 2021/01/01 13:31:04 +dnl ---------------- +dnl Some install-programs accept a "-p" option to preserve file modification +dnl timestamps. That can be useful as an install option, as well as a way to +dnl avoid the need for ranlib after copying a static archive. +AC_DEFUN([CF_INSTALL_OPT_P], +[ +: "${INSTALL:=install}" +AC_CACHE_CHECK(if install accepts -p option, cf_cv_install_p,[ + rm -rf ./conftest* + date >conftest.in + mkdir conftest.out + sleep 3 + if $INSTALL -p conftest.in conftest.out 2>/dev/null + then + if test -f conftest.out/conftest.in + then + test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \ + test conftest.out/conftest.in -nt conftest.in 2>conftest.err + if test -s conftest.err + then + cf_cv_install_p=no + else + cf_cv_install_p=yes + fi + else + cf_cv_install_p=no + fi + else + cf_cv_install_p=no + fi + rm -rf ./conftest* +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_S version: 3 updated: 2021/01/05 19:23:48 +dnl ---------------- +dnl By default, we should strip executables which are installed, but leave the +dnl ability to suppress that for unit-testing. +AC_DEFUN([CF_INSTALL_OPT_S], +[ +AC_MSG_CHECKING(if you want to install stripped executables) +CF_ARG_DISABLE(stripping, + [ --disable-stripping do not strip (debug info) installed executables], + [enable_stripping=no], + [enable_stripping=yes]) +AC_MSG_RESULT($enable_stripping) + +if test "$enable_stripping" = yes +then + INSTALL_OPT_S="-s" +else + INSTALL_OPT_S= +fi +AC_SUBST(INSTALL_OPT_S) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_STRIP_PROG version: 1 updated: 2023/06/03 15:17:30 +dnl ------------------------- +dnl Provide an option for overriding the strip program used in install "-s" +dnl +dnl coreutils install provides a --strip-program option +dnl FreeBSD uses STRIPBIN environment variable, while NetBSD and OpenBSD use +dnl STRIP environment variable. Other versions of install do not support this. +AC_DEFUN([CF_INSTALL_OPT_STRIP_PROG], +[ +AC_REQUIRE([CF_INSTALL_OPT_S]) +if test -n "$INSTALL_OPT_S" +then + AC_MSG_CHECKING(if you want to specify strip-program) + AC_ARG_WITH(strip-program, + [ --with-strip-program=XX specify program to use when stripping in install], + [with_strip_program=$withval], + [with_strip_program=no]) + AC_MSG_RESULT($with_strip_program) + if test "$with_strip_program" != no + then + AC_MSG_CHECKING(if strip-program is supported with this installer) + cf_install_program=`echo "$INSTALL" | sed -e 's%[[ ]]*[[ ]]-.%%'` + check_install_strip=no + if test -f "$cf_install_program" + then + check_install_version=`"$cf_install_program" --version 2>/dev/null | head -n 1 | grep coreutils` + if test -n "$check_install_version" + then + check_install_strip="option" + else + for check_strip_variable in STRIPBIN STRIP + do + if strings "$cf_install_program" | grep "^$check_strip_variable[$]" >/dev/null + then + check_install_strip="environ" + break + fi + done + fi + fi + AC_MSG_RESULT($check_install_strip) + case "$check_install_strip" in + (no) + AC_MSG_WARN($cf_install_program does not support strip program option) + with_strip_program=no + ;; + (environ) + cat >install.tmp <<-CF_EOF + #! $SHELL + STRIPBIN="$with_strip_program" \\ + STRIP="$with_strip_program" \\ + $INSTALL "[$]@" + CF_EOF + INSTALL="`pwd`/install.tmp" + chmod +x "$INSTALL" + CF_VERBOSE(created $INSTALL) + ;; + (option) + INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" + ;; + esac + fi +fi +AC_SUBST(INSTALL_OPT_S) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_PREFIX version: 1 updated: 2024/08/10 20:16:32 +dnl ----------------- +dnl Special option for use by system-builders: the install-prefix is used to +dnl adjust the location into which the actual install is done, so that an +dnl archive can be built without modifying the host system's configuration. +AC_DEFUN([CF_INSTALL_PREFIX],[ +AC_MSG_CHECKING(for an installation directory prefix) +AC_ARG_WITH(install-prefix, + [ --with-install-prefix=DESTDIR use DESTDIR as installation directory prefix], + [case "x$withval" in + (xyes|xno) + ;; + (*) DESTDIR="$withval" + ;; + esac]) +AC_MSG_RESULT([${DESTDIR:-(none)}]) +AC_SUBST(DESTDIR) + +AC_MSG_CHECKING(if installation directory prefix should be merged) +CF_ARG_ENABLE(install-prefix, + [ --enable-install-prefix merge DESTDIR with installation prefix], + cf_install_prefix=yes, + cf_install_prefix=no) +AC_MSG_RESULT($cf_install_prefix) + +if test "$cf_install_prefix" = yes ; then + MERGE_PREFIX=':$(prefix)%=%' +else + MERGE_PREFIX='' +fi + +AC_SUBST(MERGE_PREFIX) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INTEL_COMPILER version: 9 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Check if the given compiler is really the Intel compiler for Linux. It +dnl tries to imitate gcc, but does not return an error when it finds a mismatch +dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_INTEL_COMPILER],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +ifelse([$2],,INTEL_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + case "$host_os" in + (linux*|gnu*) + AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc" + AC_TRY_COMPILE([],[ +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif +],[ifelse([$2],,INTEL_COMPILER,[$2])=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2])) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LARGEFILE version: 13 updated: 2023/12/03 19:09:59 +dnl ------------ +dnl Add checks for large file support. +AC_DEFUN([CF_LARGEFILE],[ +ifdef([AC_FUNC_FSEEKO],[ + AC_SYS_LARGEFILE + if test "$enable_largefile" != no ; then + AC_FUNC_FSEEKO + + # Normally we would collect these definitions in the config.h, + # but (like _XOPEN_SOURCE), some environments rely on having these + # defined before any of the system headers are included. Another + # case comes up with C++, e.g., on AIX the compiler compiles the + # header files by themselves before looking at the body files it is + # told to compile. For ncurses, those header files do not include + # the config.h + if test "$ac_cv_sys_large_files" != no + then + CF_APPEND_TEXT(CPPFLAGS,-D_LARGE_FILES) + fi + if test "$ac_cv_sys_largefile_source" != no + then + CF_APPEND_TEXT(CPPFLAGS,-D_LARGEFILE_SOURCE) + fi + if test "$ac_cv_sys_file_offset_bits" != no + then + CF_APPEND_TEXT(CPPFLAGS,-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits) + fi + + AC_CACHE_CHECK(whether to use struct dirent64, cf_cv_struct_dirent64,[ + AC_TRY_COMPILE([ +#pragma GCC diagnostic error "-Wincompatible-pointer-types" +#include +#include + +#ifndef __REDIRECT +/* if transitional largefile support is setup, this is true */ +extern struct dirent64 * readdir(DIR *); +#endif + ],[ + DIR *dp = opendir("."); + struct dirent64 *x = readdir(dp); + struct dirent *y = readdir(dp); + int z = x - y; + (void)z; + ], + [cf_cv_struct_dirent64=yes], + [cf_cv_struct_dirent64=no]) + ]) + test "$cf_cv_struct_dirent64" = yes && AC_DEFINE(HAVE_STRUCT_DIRENT64,1,[Define to 1 if we have struct dirent64]) + fi +]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl For the given system and compiler, find the compiler flags to pass to the +dnl loader to use the "rpath" feature. +AC_DEFUN([CF_LD_RPATH_OPT], +[ +AC_REQUIRE([CF_CHECK_CACHE]) + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + AC_MSG_CHECKING(for an rpath option) + case "$cf_cv_system_name" in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[[2-9]].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + AC_MSG_RESULT($LD_RPATH_OPT) + + case "x$LD_RPATH_OPT" in + (x-R*) + AC_MSG_CHECKING(if we need a space after rpath option) + cf_save_LIBS="$LIBS" + CF_ADD_LIBS(${LD_RPATH_OPT}$libdir) + AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes) + LIBS="$cf_save_LIBS" + AC_MSG_RESULT($cf_rpath_space) + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Construct a search-list of directories for a nonstandard library-file +dnl +dnl Parameters +dnl $1 = the variable to return as result +dnl $2 = the package name +AC_DEFUN([CF_LIBRARY_PATH], +[ +$1= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE) + cf_library_path_list="$cf_library_path_list [$]$1" + ;; + esac + done +fi + +CF_SUBDIR_PATH($1,$2,lib) + +$1="$cf_library_path_list [$]$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_PREFIX version: 14 updated: 2021/01/01 13:31:04 +dnl ------------- +dnl Compute the library-prefix for the given host system +dnl $1 = variable to set +define([CF_LIB_PREFIX], +[ + case "$cf_cv_system_name" in + (OS/2*|os2*) + if test "$DFT_LWR_MODEL" = libtool; then + LIB_PREFIX='lib' + else + LIB_PREFIX='' + fi + ;; + (*-msvc*) + LIB_PREFIX='' + ;; + (*) LIB_PREFIX='lib' + ;; + esac +ifelse($1,,,[$1=$LIB_PREFIX]) + AC_SUBST(LIB_PREFIX) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_SUFFIX version: 28 updated: 2021/01/01 16:53:59 +dnl ------------- +dnl Compute the library file-suffix from the given model name +dnl $1 = model name +dnl $2 = variable to set (the nominal library suffix) +dnl $3 = dependency variable to set (actual filename) +dnl The variable $LIB_SUFFIX, if set, prepends the variable to set. +AC_DEFUN([CF_LIB_SUFFIX], +[ + case X$1 in + (Xlibtool) + $2='.la' + $3=[$]$2 + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + $2='_g.lib' + ;; + (*) + $2='_g.a' + ;; + esac + $3=[$]$2 + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + $2='_p.lib' + ;; + (*) + $2='_p.a' + ;; + esac + $3=[$]$2 + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[[5-7]]*) + $2='.so' + $3=[$]$2 + ;; + (*-msvc*) + $2='.dll' + $3='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + $2='.dll' + $3='.dll.a' + ;; + (darwin*) + $2='.dylib' + $3=[$]$2 + ;; + (hpux*) + case "$target" in + (ia64*) + $2='.so' + $3=[$]$2 + ;; + (*) + $2='.sl' + $3=[$]$2 + ;; + esac + ;; + (*) + $2='.so' + $3=[$]$2 + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + $2='.lib' + ;; + (*) + $2='.a' + ;; + esac + $3=[$]$2 + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + $2="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$2}" + $3="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$3}" + fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_TYPE version: 5 updated: 2015/04/17 21:13:04 +dnl ----------- +dnl Compute the string to append to -library from the given model name +dnl $1 = model name +dnl $2 = variable to set +dnl The variable $LIB_SUFFIX, if set, prepends the variable to set. +AC_DEFUN([CF_LIB_TYPE], +[ + case $1 in + (libtool) $2='' ;; + (normal) $2='' ;; + (debug) $2='_g' ;; + (profile) $2='_p' ;; + (shared) $2='' ;; + esac + test -n "$LIB_SUFFIX" && $2="${LIB_SUFFIX}[$]{$2}" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LINK_DATAONLY version: 15 updated: 2023/12/03 10:03:10 +dnl ---------------- +dnl Some systems have a non-ANSI linker that doesn't pull in modules that have +dnl only data (i.e., no functions), for example NeXT. On those systems we'll +dnl have to provide wrappers for global tables to ensure they're linked +dnl properly. +AC_DEFUN([CF_LINK_DATAONLY], +[ +AC_MSG_CHECKING([if data-only library module links]) +AC_CACHE_VAL(cf_cv_link_dataonly,[ + rm -f conftest.a + cat >conftest.$ac_ext <&AC_FD_CC 1>/dev/null + fi + rm -f conftest.$ac_ext data.o + cat >conftest.$ac_ext <&AC_FD_CC 1>/dev/null + fi + rm -f conftest.$ac_ext func.o + ( eval $RANLIB conftest.a ) 2>&AC_FD_CC >/dev/null + cf_saveLIBS="$LIBS" + LIBS="conftest.a $LIBS" + AC_TRY_RUN([ + extern int testfunc(void); + int main(void) + { + ${cf_cv_main_return:-return} (!testfunc()); + } + ], + [cf_cv_link_dataonly=yes], + [cf_cv_link_dataonly=no], + [cf_cv_link_dataonly=unknown]) + LIBS="$cf_saveLIBS" + ]) +AC_MSG_RESULT($cf_cv_link_dataonly) + +if test "$cf_cv_link_dataonly" = no ; then + AC_DEFINE(BROKEN_LINKER,1,[if data-only library module does not link]) + BROKEN_LINKER=1 +fi +AC_SUBST(BROKEN_LINKER) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKEFLAGS version: 21 updated: 2021/09/04 06:47:34 +dnl ------------ +dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make' +dnl options to lower-levels. It is very useful for "make -n" -- if we have it. +dnl (GNU 'make' does both, something POSIX 'make', which happens to make the +dnl ${MAKEFLAGS} variable incompatible because it adds the assignments :-) +AC_DEFUN([CF_MAKEFLAGS], +[AC_REQUIRE([AC_PROG_FGREP])dnl + +AC_CACHE_CHECK(for makeflags variable, cf_cv_makeflags,[ + cf_cv_makeflags='' + for cf_option in '-${MAKEFLAGS}' '${MFLAGS}' + do + cat >cf_makeflags.tmp </dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[[ ]]*$,,'` + case "$cf_result" in + (.*k|.*kw) + cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`" + case "$cf_result" in + (.*CC=*) cf_cv_makeflags= + ;; + (*) cf_cv_makeflags=$cf_option + ;; + esac + break + ;; + (.-) + ;; + (*) + CF_MSG_LOG(given option \"$cf_option\", no match \"$cf_result\") + ;; + esac + done + rm -f cf_makeflags.tmp +]) + +AC_SUBST(cf_cv_makeflags) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21 +dnl ------------- +dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which +dnl acts as a placeholder. +dnl +dnl The ".PHONY" feature was proposed in 2011 here +dnl https://www.austingroupbugs.net/view.php?id=523 +dnl and is scheduled for release in P1003.1 Issue 8 (late 2022). +dnl +dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with +dnl a few others (i.e., GNU make and the non-POSIX "BSD" make): +dnl +dnl + This is a GNU make feature (since April 1988, but in turn from binutils, +dnl date unspecified). +dnl +dnl + It was adopted in NetBSD make in June 1995. +dnl +dnl + The other BSD make programs are derived from the NetBSD make (and for +dnl that reason are not actually different "implementations"). +dnl +dnl + Some features of NetBSD make were actually adapted from pmake, which +dnl began as a modified GNU make starting in 1993. +dnl +dnl + Version 3.8 of the dmake program in January 1992 also implemented this +dnl GNU make extension, but is less well known than the BSD make. +AC_DEFUN([CF_MAKE_PHONY],[ +AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[ + rm -rf conftest* + ( + mkdir conftest || exit 1 + cd conftest + cat >makefile <<'CF_EOF' +.PHONY: always +DATA=0 +always: always.out + @echo "** making [$]@ [$](DATA)" +once: once.out + @echo "** making [$]@ [$](DATA)" +always.out: + @echo "** making [$]@ [$](DATA)" + echo [$](DATA) > [$]@ +once.out: + @echo "** making [$]@ [$](DATA)" + echo [$](DATA) > [$]@ +CF_EOF + for cf_data in 1 2 3 + do + ${MAKE:-make} always DATA=$cf_data + ${MAKE:-make} once DATA=$cf_data + ${MAKE:-make} -t always once + if test -f always ; then + echo "no (case 1)" > ../conftest.tmp + elif test ! -f always.out ; then + echo "no (case 2)" > ../conftest.tmp + elif test ! -f once.out ; then + echo "no (case 3)" > ../conftest.tmp + elif ! cmp -s always.out once.out ; then + echo "no (case 4)" > ../conftest.tmp + diff always.out once.out + else + cf_check="`cat always.out`" + if test "x$cf_check" != "x$cf_data" ; then + echo "no (case 5)" > ../conftest.tmp + else + echo yes > ../conftest.tmp + rm -f ./*.out + continue + fi + fi + break + done + ) >&AC_FD_CC 2>&1 + cf_cv_make_PHONY="`cat conftest.tmp`" + rm -rf conftest* +]) +MAKE_NO_PHONY="#" +MAKE_PHONY="#" +test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY= +test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY= +AC_SUBST(MAKE_NO_PHONY) +AC_SUBST(MAKE_PHONY) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32 +dnl ------------ +dnl Generate tags/TAGS targets for makefiles. Do not generate TAGS if we have +dnl a monocase filesystem. +AC_DEFUN([CF_MAKE_TAGS],[ +AC_REQUIRE([CF_MIXEDCASE_FILENAMES]) + +AC_CHECK_PROGS(CTAGS, exctags ctags) +AC_CHECK_PROGS(ETAGS, exetags etags) + +AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no) + +if test "$cf_cv_mixedcase" = yes ; then + AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no) +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +AC_SUBST(CTAGS) +AC_SUBST(ETAGS) + +AC_SUBST(MAKE_UPPER_TAGS) +AC_SUBST(MAKE_LOWER_TAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59 +dnl ---------------------- +dnl Check if the file-system supports mixed-case filenames. If we're able to +dnl create a lowercase name and see it as uppercase, it doesn't support that. +AC_DEFUN([CF_MIXEDCASE_FILENAMES], +[ +AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[ +if test "$cross_compiling" = yes ; then + case "$target_alias" in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi +]) +test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MKSTEMP version: 13 updated: 2023/12/01 17:22:50 +dnl ---------- +dnl Check for a working mkstemp. This creates two files, checks that they are +dnl successfully created and distinct (AmigaOS apparently fails on the last). +AC_DEFUN([CF_MKSTEMP],[ +AC_CHECK_HEADERS( \ +unistd.h \ +) +AC_CACHE_CHECK(for working mkstemp, cf_cv_func_mkstemp,[ +rm -rf ./conftest* +AC_TRY_RUN([ +$ac_includes_default + +int main(void) +{ + static char tmpl[] = "conftestXXXXXX"; + char name[2][80]; + int n; + int result = 0; + int fd; + struct stat sb; + + umask(077); + for (n = 0; n < 2; ++n) { + strcpy(name[n], tmpl); + if ((fd = mkstemp(name[n])) >= 0) { + if (!strcmp(name[n], tmpl) + || stat(name[n], &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG + || (sb.st_mode & 077) != 0) { + result = 1; + } + close(fd); + } + } + if (result == 0 + && !strcmp(name[0], name[1])) + result = 1; + ${cf_cv_main_return:-return}(result); +} +],[cf_cv_func_mkstemp=yes +],[cf_cv_func_mkstemp=no +],[cf_cv_func_mkstemp=maybe]) +]) +if test "x$cf_cv_func_mkstemp" = xmaybe ; then + AC_CHECK_FUNC(mkstemp) +fi +if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then + AC_DEFINE(HAVE_MKSTEMP,1,[Define to 1 if mkstemp() is available and working.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32 +dnl ---------- +dnl Write a debug message to config.log, along with the line number in the +dnl configure script. +AC_DEFUN([CF_MSG_LOG],[ +echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_ADDON version: 7 updated: 2024/06/01 17:37:13 +dnl ---------------- +dnl Configure an ncurses add-on, built outside the ncurses tree. +AC_DEFUN([CF_NCURSES_ADDON],[ +AC_REQUIRE([CF_NCURSES_CONFIG]) + +AC_PROVIDE([CF_SUBST_NCURSES_VERSION]) + +AC_MSG_CHECKING(for specified curses library type) +AC_ARG_WITH(screen, + [ --with-screen=XXX use specified curses-libraries], + [cf_cv_screen=$withval], + [cf_cv_screen=ncurses]) + +case $cf_cv_screen in +(curses|curses_*) + CF_CURSES_CONFIG + ;; +(ncursesw*) + CF_UTF8_LIB + CF_NCURSES_CONFIG($cf_cv_screen) + ;; +(ncurses*) + CF_NCURSES_CONFIG($cf_cv_screen) + ;; +(*) + AC_MSG_ERROR(unexpected screen-value: $cf_cv_screen) + ;; +esac + +AC_SUBST(cf_cv_screen) + +if test "$NCURSES_CONFIG_PKG" != none ; then + cf_version=`$PKG_CONFIG --modversion $NCURSES_CONFIG_PKG 2>/dev/null` + + NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'` + NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.//' -e 's/\..*//'` + NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.//'` + + cf_cv_abi_version=`$PKG_CONFIG --variable=abi_version $NCURSES_CONFIG_PKG 2>/dev/null` + if test -z "$cf_cv_abi_version" + then + cf_cv_abi_version=`$PKG_CONFIG --variable=major_version $NCURSES_CONFIG_PKG 2>/dev/null` + fi + +elif test "$NCURSES_CONFIG" != none ; then + + cf_version=`$NCURSES_CONFIG --version 2>/dev/null` + + NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'` + NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.//' -e 's/\..*//'` + NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.//'` + + # ABI version is not available from headers + cf_cv_abi_version=`$NCURSES_CONFIG --abi-version 2>/dev/null` + +else + + for cf_name in MAJOR MINOR PATCH + do + cat >conftest.$ac_ext < + AUTOCONF_$cf_name NCURSES_VERSION_$cf_name +CF_EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | fgrep AUTOCONF_$cf_name >conftest.out" + AC_TRY_EVAL(cf_try) + if test -f conftest.out ; then + cf_result=`sed -e "s/^.*AUTOCONF_${cf_name}[[ ]][[ ]]*//" conftest.out` + eval NCURSES_$cf_name=\"$cf_result\" + # cat conftest.$ac_ext + # cat conftest.out + fi + done + + cf_cv_abi_version=${NCURSES_MAJOR} + +fi + +cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR} + +dnl Show the computed version, for logging +cf_cv_timestamp=`date` + +AC_MSG_RESULT(Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)) + +dnl We need these values in the generated headers +AC_SUBST(NCURSES_MAJOR) +AC_SUBST(NCURSES_MINOR) +AC_SUBST(NCURSES_PATCH) + +dnl We need these values in the generated makefiles +AC_SUBST(cf_cv_rel_version) +AC_SUBST(cf_cv_abi_version) + +dnl FIXME - not needed for Ada95 +AC_SUBST(cf_cv_builtin_bool) +AC_SUBST(cf_cv_header_stdbool_h) +AC_SUBST(cf_cv_type_of_bool)dnl + +AC_CACHE_CHECK(if KEY_RESIZE is supported,cf_cv_curses_resizes,[ + AC_TRY_COMPILE([#include <${cf_cv_ncurses_header:-curses.h}>], + [int key = KEY_RESIZE; (void)key], + cf_cv_curses_resizes=yes, + cf_cv_curses_resizes=no)]) +cf_cv_enable_sigwinch=0 +test "$cf_cv_curses_resizes" = yes && cf_cv_enable_sigwinch=1 +AC_SUBST(cf_cv_enable_sigwinch) +]) +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_CC_CHECK version: 6 updated: 2023/02/18 17:47:58 +dnl ------------------- +dnl Check if we can compile with ncurses' header file +dnl $1 is the cache variable to set +dnl $2 is the header-file to include +dnl $3 is the root name (ncurses or ncursesw) +AC_DEFUN([CF_NCURSES_CC_CHECK],[ + AC_TRY_COMPILE([ +]ifelse($3,ncursesw,[ +#define _XOPEN_SOURCE_EXTENDED +#undef HAVE_LIBUTF8_H /* in case we used CF_UTF8_LIB */ +#define HAVE_LIBUTF8_H /* to force ncurses' header file to use cchar_t */ +])[ +#include <$2>],[ +#ifdef NCURSES_VERSION +]ifelse($3,ncursesw,[ +#ifndef WACS_BSSB + #error WACS_BSSB is not defined +#endif +])[ +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + ] + ,[$1=$2] + ,[$1=no]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_CONFIG version: 28 updated: 2021/08/28 15:20:37 +dnl ----------------- +dnl Tie together the configure-script macros for ncurses, preferring these in +dnl order: +dnl a) ".pc" files for pkg-config, using $NCURSES_CONFIG_PKG +dnl b) the "-config" script from ncurses, using $NCURSES_CONFIG +dnl c) just plain libraries +dnl +dnl $1 is the root library name (default: "ncurses") +AC_DEFUN([CF_NCURSES_CONFIG],[ +AC_REQUIRE([CF_PKG_CONFIG]) +cf_ncuconfig_root=ifelse($1,,ncurses,$1) +cf_have_ncuconfig=no + +if test "x${PKG_CONFIG:=none}" != xnone; then + AC_MSG_CHECKING(pkg-config for $cf_ncuconfig_root) + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + AC_MSG_RESULT(yes) + + AC_MSG_CHECKING(if the $cf_ncuconfig_root package files work) + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[[89]]9@@*-W*) + CF_ADD_CFLAGS($cf_pkg_cflags) + CF_ADD_LIBS($cf_pkg_libs) + + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); mousemask(0,0); tigetstr((char *)0);], + [AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); }], + [cf_test_ncuconfig=yes], + [cf_test_ncuconfig=no], + [cf_test_ncuconfig=maybe])], + [cf_test_ncuconfig=no]) + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[[^ ]]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[[^ ]]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + + CF_APPEND_CFLAGS($cf_pkg_cflags) + CF_ADD_LIBS($cf_pkg_libs) + + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); mousemask(0,0); tigetstr((char *)0);], + [AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); }], + [cf_have_ncuconfig=yes], + [cf_have_ncuconfig=no], + [cf_have_ncuconfig=maybe])], + [cf_have_ncuconfig=no]) + AC_MSG_RESULT($cf_have_ncuconfig) + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + CF_TERM_HEADER + fi + + else + AC_MSG_RESULT(no) + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + + CF_ACVERSION_CHECK(2.52, + [AC_CHECK_TOOLS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)], + [AC_PATH_PROGS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)]) + + if test "$NCURSES_CONFIG" != none ; then + + CF_APPEND_CFLAGS(`$NCURSES_CONFIG --cflags`) + CF_ADD_LIBS(`$NCURSES_CONFIG --libs`) + + # even with config script, some packages use no-override for curses.h + CF_CURSES_HEADER(ifelse($1,,ncurses,$1)) + + dnl like CF_NCURSES_CPPFLAGS + AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) + + dnl like CF_NCURSES_LIBS + CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_ncuconfig_root) + AC_DEFINE_UNQUOTED($cf_nculib_ROOT) + + dnl like CF_NCURSES_VERSION + cf_cv_ncurses_version="`$NCURSES_CONFIG --version`" + + else + + CF_NCURSES_CPPFLAGS(ifelse($1,,ncurses,$1)) + CF_NCURSES_LIBS(ifelse($1,,ncurses,$1)) + + fi +else + NCURSES_CONFIG=none +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_CPPFLAGS version: 22 updated: 2021/01/02 09:31:20 +dnl ------------------- +dnl Look for the SVr4 curses clone 'ncurses' in the standard places, adjusting +dnl the CPPFLAGS variable so we can include its header. +dnl +dnl The header files may be installed as either curses.h, or ncurses.h (would +dnl be obsolete, except that some packagers prefer this name to distinguish it +dnl from a "native" curses implementation). If not installed for overwrite, +dnl the curses.h file would be in an ncurses subdirectory (e.g., +dnl /usr/include/ncurses), but someone may have installed overwriting the +dnl vendor's curses. Only very old versions (pre-1.9.2d, the first autoconf'd +dnl version) of ncurses don't define either __NCURSES_H or NCURSES_VERSION in +dnl the header. +dnl +dnl If the installer has set $CFLAGS or $CPPFLAGS so that the ncurses header +dnl is already in the include-path, don't even bother with this, since we cannot +dnl easily determine which file it is. In this case, it has to be . +dnl +dnl The optional parameter gives the root name of the library, in case it is +dnl not installed as the default curses library. That is how the +dnl wide-character version of ncurses is installed. +AC_DEFUN([CF_NCURSES_CPPFLAGS], +[AC_REQUIRE([CF_WITH_CURSES_DIR]) + +AC_PROVIDE([CF_CURSES_CPPFLAGS])dnl +cf_ncuhdr_root=ifelse($1,,ncurses,$1) + +test -n "$cf_cv_curses_dir" && \ +test "$cf_cv_curses_dir" != "no" && { \ + CF_ADD_INCDIR($cf_cv_curses_dir/include/$cf_ncuhdr_root) +} + +AC_CACHE_CHECK(for $cf_ncuhdr_root header in include-path, cf_cv_ncurses_h,[ + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + CF_NCURSES_CC_CHECK(cf_cv_ncurses_h,$cf_header,$1) + test "$cf_cv_ncurses_h" != no && break + done +]) + +CF_NCURSES_HEADER +CF_TERM_HEADER + +# some applications need this, but should check for NCURSES_VERSION +AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) + +CF_NCURSES_VERSION +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_HEADER version: 7 updated: 2021/01/04 19:33:05 +dnl ----------------- +dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common +dnl variations of ncurses' installs. +dnl +dnl See also CF_CURSES_HEADER, which sets the same cache variable. +AC_DEFUN([CF_NCURSES_HEADER],[ + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +AC_CACHE_CHECK(for $cf_ncuhdr_root include-path, cf_cv_ncurses_h2,[ + test -n "$verbose" && echo + CF_HEADER_PATH(cf_search,$cf_ncuhdr_root) + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + CF_ADD_INCDIR($cf_incdir) + for cf_header in \ + ncurses.h \ + curses.h + do + CF_NCURSES_CC_CHECK(cf_cv_ncurses_h2,$cf_header,$1) + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&AC_FD_MSG + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&AC_FD_MSG + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && AC_MSG_ERROR(not found) + ]) + + CF_DIRNAME(cf_1st_incdir,$cf_cv_ncurses_h2) + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + CF_ADD_INCDIR($cf_1st_incdir) + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + AC_DEFINE(HAVE_NCURSES_H,1,[Define to 1 if we have ncurses.h]) + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + AC_DEFINE(HAVE_NCURSES_NCURSES_H,1,[Define to 1 if we have ncurses/ncurses.h]) + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + AC_DEFINE(HAVE_NCURSESW_NCURSES_H,1,[Define to 1 if we have ncursesw/ncurses.h]) + ;; +esac + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_LIBS version: 21 updated: 2021/09/04 06:37:12 +dnl --------------- +dnl Look for the ncurses library. This is a little complicated on Linux, +dnl because it may be linked with the gpm (general purpose mouse) library. +dnl Some distributions have gpm linked with (bsd) curses, which makes it +dnl unusable with ncurses. However, we don't want to link with gpm unless +dnl ncurses has a dependency, since gpm is normally set up as a shared library, +dnl and the linker will record a dependency. +dnl +dnl The optional parameter gives the root name of the library, in case it is +dnl not installed as the default curses library. That is how the +dnl wide-character version of ncurses is installed. +AC_DEFUN([CF_NCURSES_LIBS], +[AC_REQUIRE([CF_NCURSES_CPPFLAGS]) + +cf_nculib_root=ifelse($1,,ncurses,$1) + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +AC_CHECK_LIB(gpm,Gpm_Open, + [AC_CHECK_LIB(gpm,initscr, + [LIBS="$cf_ncurses_SAVE"], + [cf_ncurses_LIBS="-lgpm"])]) + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"]) + fi + ;; +esac + +CF_ADD_LIBS($cf_ncurses_LIBS) + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + CF_ADD_LIBS(-l$cf_nculib_root) +else + CF_FIND_LIBRARY($cf_nculib_root,$cf_nculib_root, + [#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr()], + initscr) +fi + +if test -n "$cf_ncurses_LIBS" ; then + AC_MSG_CHECKING(if we can link $cf_nculib_root without $cf_ncurses_LIBS) + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); mousemask(0,0); tigetstr((char *)0);], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + LIBS="$cf_ncurses_SAVE"]) +fi + +CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_nculib_root) +AC_DEFINE_UNQUOTED($cf_nculib_ROOT) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_VERSION version: 18 updated: 2024/01/07 06:34:16 +dnl ------------------ +dnl Check for the version of ncurses, to aid in reporting bugs, etc. +dnl Call CF_CURSES_CPPFLAGS first, or CF_NCURSES_CPPFLAGS. We don't use +dnl AC_REQUIRE since that does not work with the shell's if/then/else/fi. +AC_DEFUN([CF_NCURSES_VERSION], +[ +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl +AC_CACHE_CHECK(for ncurses version, cf_cv_ncurses_version,[ + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + AC_TRY_RUN([ +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +}],[ + cf_cv_ncurses_version=`cat $cf_tempfile`],,[ + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&AC_FD_CC | grep '^Autoconf ' >conftest.out" + AC_TRY_EVAL(cf_try) + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[[^"]]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi +]) + rm -f "$cf_tempfile" +]) +test "$cf_cv_ncurses_version" = no || AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_OBJ_SUBDIR version: 8 updated: 2021/01/01 13:31:04 +dnl ------------- +dnl Compute the object-directory name from the given model name +AC_DEFUN([CF_OBJ_SUBDIR], +[ + case $1 in + (libtool) $2='obj_lo' ;; + (normal) $2='objects' ;; + (debug) $2='obj_g' ;; + (profile) $2='obj_p' ;; + (shared) + case "$cf_cv_system_name" in + (cygwin|msys) + $2='objects' ;; + (*) + $2='obj_s' ;; + esac + esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATHSEP version: 8 updated: 2021/01/01 13:31:04 +dnl ---------- +dnl Provide a value for the $PATH and similar separator (or amend the value +dnl as provided in autoconf 2.5x). +AC_DEFUN([CF_PATHSEP], +[ + AC_MSG_CHECKING(for PATH separator) + case "$cf_cv_system_name" in + (os2*) PATH_SEPARATOR=';' ;; + (*) ${PATH_SEPARATOR:=':'} ;; + esac +ifelse([$1],,,[$1=$PATH_SEPARATOR]) + AC_SUBST(PATH_SEPARATOR) + AC_MSG_RESULT($PATH_SEPARATOR) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATH_SYNTAX version: 19 updated: 2024/08/03 13:08:58 +dnl -------------- +dnl Check the argument to see that it looks like a pathname. Rewrite it if it +dnl begins with one of the prefix/exec_prefix variables, and then again if the +dnl result begins with 'NONE'. This is necessary to work around autoconf's +dnl delayed evaluation of those symbols. +AC_DEFUN([CF_PATH_SYNTAX],[ +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x[$]$1" in +(x\[$]\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\[$]\{*prefix\}*|x\[$]\{*dir\}*) + eval $1="[$]$1" + case "x[$]$1" in + (xNONE/*) + $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PKG_CONFIG version: 13 updated: 2023/10/28 11:59:01 +dnl ------------- +dnl Check for the package-config program, unless disabled by command-line. +dnl +dnl Sets $PKG_CONFIG to the pathname of the pkg-config program. +AC_DEFUN([CF_PKG_CONFIG], +[ +AC_MSG_CHECKING(if you want to use pkg-config) +AC_ARG_WITH(pkg-config, + [[ --with-pkg-config[=CMD] enable/disable use of pkg-config and its name CMD]], + [cf_pkg_config=$withval], + [cf_pkg_config=yes]) +AC_MSG_RESULT($cf_pkg_config) + +case "$cf_pkg_config" in +(no) + PKG_CONFIG=none + ;; +(yes) + CF_ACVERSION_CHECK(2.52, + [AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)], + [AC_PATH_PROG(PKG_CONFIG, pkg-config, none)]) + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + CF_PATH_SYNTAX(PKG_CONFIG) +elif test "x$cf_pkg_config" != xno ; then + AC_MSG_WARN(pkg-config is not installed) +fi + +AC_SUBST(PKG_CONFIG) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_C_SOURCE version: 12 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed. +dnl +dnl POSIX.1-1990 _POSIX_SOURCE +dnl POSIX.1-1990 and _POSIX_SOURCE and +dnl POSIX.2-1992 C-Language _POSIX_C_SOURCE=2 +dnl Bindings Option +dnl POSIX.1b-1993 _POSIX_C_SOURCE=199309L +dnl POSIX.1c-1996 _POSIX_C_SOURCE=199506L +dnl X/Open 2000 _POSIX_C_SOURCE=200112L +dnl +dnl Parameters: +dnl $1 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_POSIX_C_SOURCE], +[AC_REQUIRE([CF_POSIX_VISIBLE])dnl + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1]) + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE) +CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE) + +AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[ + CF_MSG_LOG(if the symbol is already defined go no further) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif], + [cf_cv_posix_c_source=no], + [cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[[12]]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + AC_TRY_COMPILE([#include ],[ +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif],[], + cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE") + fi + CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE) + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source) + CF_MSG_LOG(if the second compile does not leave our definition intact error) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif],, + [cf_cv_posix_c_source=no]) + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + ]) +]) + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_ADD_CFLAGS($cf_cv_posix_c_source) +fi + +fi # cf_cv_posix_visible + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17 +dnl ---------------- +dnl POSIX documents test-macros which an application may set before any system +dnl headers are included to make features available. +dnl +dnl Some BSD platforms (originally FreeBSD, but copied by a few others) +dnl diverged from POSIX in 2002 by setting symbols which make all of the most +dnl recent features visible in the system header files unless the application +dnl overrides the corresponding test-macros. Doing that introduces portability +dnl problems. +dnl +dnl This macro makes a special check for the symbols used for this, to avoid a +dnl conflicting definition. +AC_DEFUN([CF_POSIX_VISIBLE], +[ +AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[ +AC_TRY_COMPILE([#include ],[ +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif +],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_AR version: 1 updated: 2009/01/01 20:15:22 +dnl ---------- +dnl Check for archiver "ar". +AC_DEFUN([CF_PROG_AR],[ +AC_CHECK_TOOL(AR, ar, ar) +]) +dnl --------------------------------------------------------------------------- +dnl CF_PROG_AWK version: 1 updated: 2006/09/16 11:40:59 +dnl ----------- +dnl Check for awk, ensure that the check found something. +AC_DEFUN([CF_PROG_AWK], +[ +AC_PROG_AWK +test -z "$AWK" && AC_MSG_ERROR(No awk program found) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54 +dnl ---------- +dnl standard check for CC, plus followup sanity checks +dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name +AC_DEFUN([CF_PROG_CC],[ +CF_ACVERSION_CHECK(2.53, + [AC_MSG_WARN(this will incorrectly handle gnatgcc choice) + AC_REQUIRE([AC_PROG_CC])], + []) +ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)]) +CF_GCC_VERSION +CF_ACVERSION_CHECK(2.52, + [AC_PROG_CC_STDC], + [CF_ANSI_CC_REQD]) +CF_CC_ENV_FLAGS +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_CC_C_O version: 6 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Analogous to AC_PROG_CC_C_O, but more useful: tests only $CC, ensures that +dnl the output file can be renamed, and allows for a shell variable that can +dnl be used later. The parameter is either CC or CXX. The result is the +dnl cache variable: +dnl $cf_cv_prog_CC_c_o +dnl $cf_cv_prog_CXX_c_o +dnl +dnl $1 = compiler +dnl $2 = compiler options, if any +AC_DEFUN([CF_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_MSG_CHECKING([whether [$]$1 understands -c and -o together]) +AC_CACHE_VAL(cf_cv_prog_$1_c_o, +[ +cat > conftest.$ac_ext </dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) + test -z "$EGREP" && AC_MSG_ERROR(No egrep program found) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_EXT version: 15 updated: 2021/01/02 09:31:20 +dnl ----------- +dnl Compute $PROG_EXT, used for non-Unix ports, such as OS/2 EMX. +AC_DEFUN([CF_PROG_EXT], +[ +AC_REQUIRE([CF_CHECK_CACHE]) +case "$cf_cv_system_name" in +(os2*) + CFLAGS="$CFLAGS -Zmt" + CF_APPEND_TEXT(CPPFLAGS,-D__ST_MT_ERRNO__) + CXXFLAGS="$CXXFLAGS -Zmt" + # autoconf's macro sets -Zexe and suffix both, which conflict:w + LDFLAGS="$LDFLAGS -Zmt -Zcrtdll" + ac_cv_exeext=.exe + ;; +esac + +AC_EXEEXT +AC_OBJEXT + +PROG_EXT="$EXEEXT" +AC_SUBST(PROG_EXT) +test -n "$PROG_EXT" && AC_DEFINE_UNQUOTED(PROG_EXT,"$PROG_EXT",[Define to the program extension (normally blank)]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_GNAT version: 12 updated: 2021/01/02 17:09:14 +dnl ------------ +dnl Check for gnat/gnatmake/etc, ensure that the toolset is complete. +AC_DEFUN([CF_PROG_GNAT],[ +for cf_prog_gnat in gnat gnatmake gprconfig gprbuild +do + CF_UPPER(cf_upper_prog_gnat,${cf_prog_gnat}) + + unset ac_cv_path_cf_TEMP_gnat + unset cf_TEMP_gnat + AC_PATH_PROG(cf_TEMP_gnat,$cf_prog_gnat,no) + eval "cf_cv_PATH_$cf_upper_prog_gnat=[$]ac_cv_path_cf_TEMP_gnat" + + if test "x$cf_TEMP_gnat" != xno; then + unset cf_cv_gnat_version + unset cf_TEMP_gnat + CF_GNAT_VERSION(cf_TEMP_gnat,$cf_prog_gnat) + fi + eval "cf_cv_VERSION_$cf_upper_prog_gnat=[$]cf_TEMP_gnat" + + unset cf_TEMP_gnat + unset cf_cv_gnat_version + unset ac_cv_path_cf_TEMP_gnat +done + +if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then + cf_ada_make= + cf_cv_prog_gnat_correct=no +else + cf_ada_make=gnatmake + if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then + # gprconfig is newer than gnatmake; we can continue... + cf_ada_config="##" + else + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src + then + cf_ada_config="" + cd conftest.src + for cf_gprconfig in Ada C + do + AC_MSG_CHECKING(for gprconfig name for $cf_gprconfig) + if test "$cf_gprconfig" = C + then + for cf_gprconfig_param in \ + "$cf_gprconfig,,,,GNATGCC" \ + "$cf_gprconfig,,,,GCC" \ + "$cf_gprconfig" + do + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1` + test -n "$cf_gprconfig_value" && break + done + else + cf_gprconfig_param=$cf_gprconfig + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1` + fi + if test -n "$cf_gprconfig_value" + then + eval "cf_ada_config_[$]cf_gprconfig=[$]cf_gprconfig_value" + AC_MSG_RESULT($cf_gprconfig_value) + else + AC_MSG_RESULT(missing) + cf_ada_config="#" + break + fi + done + cd .. + rm -rf ./conftest* ./*~conftest* + fi + fi + if test "x$cf_ada_config" != "x#" + then + CF_GNAT_VERSION + CF_CHECK_GNAT_VERSION + AC_CHECK_PROG(M4_exists, m4, yes, no) + if test "$ac_cv_prog_M4_exists" = no; then + cf_cv_prog_gnat_correct=no + AC_MSG_WARN(Ada95 binding required program m4 not found. Ada95 binding disabled) + fi + if test "$cf_cv_prog_gnat_correct" = yes; then + AC_MSG_CHECKING(if GNAT works) + CF_GNAT_TRY_RUN([procedure conftest;], +[with Text_IO; +with GNAT.OS_Lib; +procedure conftest is +begin + Text_IO.Put ("Hello World"); + Text_IO.New_Line; + GNAT.OS_Lib.OS_Exit (0); +end conftest;], +[cf_cv_prog_gnat_correct=yes], +[cf_cv_prog_gnat_correct=no]) + AC_MSG_RESULT($cf_cv_prog_gnat_correct) + fi + else + cf_cv_prog_gnat_correct=no + fi +fi + +AC_SUBST(cf_ada_make) +AC_SUBST(cf_ada_config) +AC_SUBST(cf_ada_config_Ada) +AC_SUBST(cf_ada_config_C) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_INSTALL version: 11 updated: 2024/08/03 13:08:58 +dnl --------------- +dnl Force $INSTALL to be an absolute-path. Otherwise, edit_man.sh and the +dnl misc/tabset install won't work properly. Usually this happens only when +dnl using the fallback mkinstalldirs script +AC_DEFUN([CF_PROG_INSTALL], +[AC_PROG_INSTALL +AC_REQUIRE([CF_GLOB_FULLPATH])dnl +case x$INSTALL in +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(*) + CF_DIRNAME(cf_dir,$INSTALL) + test -z "$cf_dir" && cf_dir=. + INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LN_S version: 2 updated: 2010/08/14 18:25:37 +dnl ------------ +dnl Combine checks for "ln -s" and "ln -sf", updating $LN_S to include "-f" +dnl option if it is supported. +AC_DEFUN([CF_PROG_LN_S],[ +AC_PROG_LN_S +AC_MSG_CHECKING(if $LN_S -f options work) + +rm -f conf$$.src conf$$dst +echo >conf$$.dst +echo first >conf$$.src +if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then + cf_prog_ln_sf=yes +else + cf_prog_ln_sf=no +fi +rm -f conf$$.dst conf$$src +AC_MSG_RESULT($cf_prog_ln_sf) + +test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40 +dnl ---------------- +dnl Remove a given option from CFLAGS/CPPFLAGS +dnl $1 = option to remove +dnl $2 = variable to update +dnl $3 = nonempty to allow verbose message +define([CF_REMOVE_CFLAGS], +[ +cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ ]][[ ]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ ]][[^ ]]*\\)\?%%" -e 's/^[[ ]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'` + test "[$]$2" != "$cf_old_cflag" || break + ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)]) + $2="$cf_old_cflag" +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 +dnl ---------------- +dnl Remove all -U and -D options that refer to the given symbol from a list +dnl of C compiler options. This works around the problem that not all +dnl compilers process -U and -D options from left-to-right, so a -U option +dnl cannot be used to cancel the effect of a preceding -D option. +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = symbol to remove +define([CF_REMOVE_DEFINE], +[ +$1=`echo "$2" | \ + sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ + -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_LIB version: 1 updated: 2007/02/17 14:11:52 +dnl ------------- +dnl Remove the given library from the symbol +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = library to remove +define([CF_REMOVE_LIB], +[ +# remove $3 library from $2 +$1=`echo "$2" | sed -e 's/-l$3[[ ]]//g' -e 's/-l$3[$]//'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45 +dnl --------------------- +dnl Restore flags saved in CF_SAVE_XTRA_FLAGS +dnl $1 = name of current macro +define([CF_RESTORE_XTRA_FLAGS], +[ +LIBS="$cf_save_LIBS_$1" +CFLAGS="$cf_save_CFLAGS_$1" +CPPFLAGS="$cf_save_CPPFLAGS_$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44 +dnl ------------------ +dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers +dnl and libraries which do not update those variables. +dnl +dnl $1 = name of current macro +define([CF_SAVE_XTRA_FLAGS], +[ +cf_save_LIBS_$1="$LIBS" +cf_save_CFLAGS_$1="$CFLAGS" +cf_save_CPPFLAGS_$1="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[[IUD]]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SHARED_OPTS version: 111 updated: 2024/03/29 20:08:49 +dnl -------------- +dnl -------------- +dnl Attempt to determine the appropriate CC/LD options for creating a shared +dnl library. +dnl +dnl Notes: +dnl a) ${LOCAL_LDFLAGS} is used to link executables that will run within +dnl the build-tree, i.e., by making use of the libraries that are compiled in +dnl $rel_builddir/lib We avoid compiling-in a $rel_builddir/lib path for the +dnl shared library since that can lead to unexpected results at runtime. +dnl b) ${LOCAL_LDFLAGS2} has the same intention but assumes that the shared +dnl libraries are compiled in ../../lib +dnl +dnl The variable 'cf_cv_do_symlinks' is used to control whether we configure +dnl to install symbolic links to the rel/abi versions of shared libraries. +dnl +dnl The variable 'cf_cv_shlib_version' controls whether we use the rel or abi +dnl version when making symbolic links. +dnl +dnl The variable 'cf_cv_shlib_version_infix' controls whether shared library +dnl version numbers are infix (ex: libncurses..dylib) or postfix +dnl (ex: libncurses.so.). +dnl +dnl Some loaders leave 'so_locations' lying around. It is nice to clean up. +AC_DEFUN([CF_SHARED_OPTS], +[ + AC_REQUIRE([CF_LD_RPATH_OPT]) + + RM_SHARED_OPTS= + LOCAL_LDFLAGS= + LOCAL_LDFLAGS2= + LD_SHARED_OPTS= + INSTALL_LIB="-m 644" + : ${rel_builddir:=.} + + shlibdir=$libdir + AC_SUBST(shlibdir) + + MAKE_DLLS="#" + AC_SUBST(MAKE_DLLS) + + cf_cv_do_symlinks=no + cf_ld_rpath_opt= + test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT" + + AC_MSG_CHECKING(whether to use release or ABI version in shared library file names) + AC_ARG_WITH(shlib-version, + [[ --with-shlib-version[={rel|abi}] use release or ABI version in shared library file names]], + [test -z "$withval" && withval=auto + case "$withval" in + (yes) + cf_cv_shlib_version=auto + ;; + (rel|abi|auto) + cf_cv_shlib_version=$withval + ;; + (*) + AC_MSG_RESULT($withval) + AC_MSG_ERROR([option value must be one of: rel, abi, or auto]) + ;; + esac + ],[cf_cv_shlib_version=auto]) + AC_MSG_RESULT($cf_cv_shlib_version) + + cf_cv_rm_so_locs=no + cf_try_cflags= + + # Some less-capable ports of gcc support only -fpic + CC_SHARED_OPTS= + + cf_try_fPIC=no + if test "$GCC" = yes + then + cf_try_fPIC=yes + else + case "$cf_cv_system_name" in + (*linux*) # e.g., PGI compiler + cf_try_fPIC=yes + ;; + esac + fi + + if test "$cf_try_fPIC" = yes + then + AC_MSG_CHECKING(which $CC option to use) + cf_save_CFLAGS="$CFLAGS" + for CC_SHARED_OPTS in -fPIC -fpic '' + do + CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS" + AC_TRY_COMPILE([#include ],[int x = 1; (void)x],[break],[]) + done + AC_MSG_RESULT($CC_SHARED_OPTS) + CFLAGS="$cf_save_CFLAGS" + fi + + cf_cv_shlib_version_infix=no + + case "$cf_cv_system_name" in + (aix4.[3-9]*|aix[[5-7]]*) + if test "$GCC" = yes; then + CC_SHARED_OPTS='-Wl,-brtl' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@' + else + CC_SHARED_OPTS='-brtl' + # as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@' + fi + ;; + (beos*) + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $[@] -Xlinker -soname=`basename $[@]` -nostart -e 0' + ;; + (cygwin*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=cygdll + cf_cv_shlib_version_infix=cygdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/cyg/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \[$]SHARED_LIB + ** IMPORT_LIB \[$]IMPORT_LIB +EOF + exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (msys*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=msysdll + cf_cv_shlib_version_infix=msysdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/msys-/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \[$]SHARED_LIB + ** IMPORT_LIB \[$]IMPORT_LIB +EOF + exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (darwin*) + cf_try_cflags="no-cpp-precomp" + CC_SHARED_OPTS="-dynamic" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $[@]` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $[@]' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi + cf_cv_shlib_version_infix=yes + AC_CACHE_CHECK([if ld -search_paths_first works], cf_cv_ldflags_search_paths_first, [ + cf_save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + AC_TRY_LINK(, [int i;], cf_cv_ldflags_search_paths_first=yes, cf_cv_ldflags_search_paths_first=no) + LDFLAGS=$cf_save_LDFLAGS]) + if test "$cf_cv_ldflags_search_paths_first" = yes; then + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + fi + ;; + (haiku*) + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (hpux[[7-8]]*) + # HP-UX 8.07 ld lacks "+b" option used for libdir search-list + if test "$GCC" != yes; then + CC_SHARED_OPTS='+Z' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $[@]' + INSTALL_LIB="-m 555" + ;; + (hpux*) + # (tested with gcc 2.7.2 -- I don't have c89) + if test "$GCC" = yes; then + LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}' + else + CC_SHARED_OPTS='+Z' + LD_SHARED_OPTS='-Wl,+b,${libdir}' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $[@]' + # HP-UX shared libraries must be executable, and should be + # readonly to exploit a quirk in the memory manager. + INSTALL_LIB="-m 555" + ;; + (interix*) + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}' + else + cf_shared_soname='`basename $[@]`' + fi + CC_SHARED_OPTS= + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $[@]' + ;; + (irix*) + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + # tested with IRIX 5.2 and 'cc'. + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $[@]` -o $[@]' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $[@]` -o $[@]' + fi + cf_cv_rm_so_locs=yes + ;; + (linux*|gnu*|k*bsd*-gnu) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (mingw*msvc*) + cf_cv_shlib_version=msvcdll + cf_cv_shlib_version_infix=msvcdll + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-link -dll" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ ${LD} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.lib/'\` + shift + my_ld=\[$]1 + shift + cat <<-EOF + Linking shared library + ** SHARED LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + args=\$(echo \[$]* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g") + exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args + mv "\${IMPORT_LIB}" "\${IMPORT_LIB}" +CF_EOF + chmod +x mk_shared_lib.sh + cat >mk_prog.sh <<-CF_EOF + #!$SHELL + shift + # Ignore first argument (compiler) and use LD (link.exe) unconditionally + LD="[$]LD" + clopts=() + ldopts=("/subsystem:console") + libs=() + isdll=0 + while test \[$]# -gt 0; do + case "\[$]1" in + -link) + # ignore -link argument + ;; + -M[[TD]] | -M[[TD]]d) + # ignore runtime-library option + ;; + -dll) + isdll=1 + ;; + -W* | -w*) + # ignore warnings + ;; + -D*) + clopts+=("\[$]1") + ;; + -I*) + clopts+=("\[$]1") + ;; + -l*) + libs+=("\`echo \"\[$]1\" | sed \"s/^-l//\"\`") + ;; + -L*) + ldopts+=("\`echo \"\[$]1\" | sed \"s/^-L/-LIBPATH:/\"\`") + ;; + *.obj | *.o) + ldopts+=("\[$]1") + ;; + -Wl,*) + for linkarg in \`echo '\[$]1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do + ldopts+=("\[$]{linkarg}") + done + ;; + *.lib) + ldopts+=("\[$]1") + ;; + -o) + shift + ldopts+=("-out:\[$]1") + ;; + *) + clopts+=("\[$]1") + ldopts+=("\[$]1") + ;; + esac + shift + done + if [[ "\$isdll" -ne 0 ]]; then + for lib in \[$]{libs[[*]]}; do + ldopts+=("\[$]lib.dll.lib") + done + else + for lib in \[$]{libs[[*]]}; do + ldopts+=("\[$]lib.lib") + done + fi + cat <<-EOF + Creating program + ** ld options: "\[$]{ldopts[[@]]}" +EOF + exec \[$]LD \[$]{ldopts[[@]]} +CF_EOF + chmod +x mk_prog.sh + LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh" + LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh" + ;; + (mingw*) + cf_cv_shlib_version=mingw + cf_cv_shlib_version_infix=mingw + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-Wl,--enable-auto-import" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \[$]SHARED_LIB + ** IMPORT_LIB \[$]IMPORT_LIB +EOF + exec \[$]* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (openbsd[[2-9]].*|mirbsd*) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (nskJ*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $[@]' + ;; + (nskL*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $[@]' + ;; + (nto-qnx*|openbsd*|freebsd[[12]].*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $[@]' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (dragonfly*|freebsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (netbsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + if test "$cf_cv_shlib_version" = auto; then + if test -f /usr/libexec/ld.elf_so; then + cf_cv_shlib_version=abi + else + cf_cv_shlib_version=rel + fi + fi + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $[@]' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $[@]' + fi + ;; + (osf*|mls+*) + # tested with OSF/1 V3.2 and 'cc' + # tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't + # link with shared libs). + MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $[@]`' + case "$host_os" in + (osf4*) + MK_SHARED_LIB="${MK_SHARED_LIB} -msym" + ;; + esac + MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $[@]' + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + cf_cv_rm_so_locs=yes + ;; + (sco3.2v5*) # also uw2* and UW7: hops 13-Apr-98 + # tested with osr5.0.5 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-belf -KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $[@] .${REL_VERSION}`.${ABI_VERSION} -o [$]@' + if test "$cf_cv_enable_rpath" = yes ; then + # only way is to set LD_RUN_PATH but no switch for it + RUN_PATH=$libdir + fi + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + LINK_PROGS='LD_RUN_PATH=${libdir}' + LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib' + ;; + (sunos4*) + # tested with SunOS 4.1.1 and gcc 2.7.0 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $[@]' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (solaris2*) + # tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2 + # tested with SunOS 5.10 (solaris 10) and gcc 3.4.3 + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-R\$(LOCAL_LIBDIR):\${libdir}" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="-R\${libdir} $EXTRA_LDFLAGS" + fi + CF_SHARED_SONAME + if test "$GCC" != yes; then + cf_save_CFLAGS="$CFLAGS" + for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O + do + CFLAGS="$cf_shared_opts $cf_save_CFLAGS" + AC_TRY_COMPILE([#include ],[printf("Hello\\n");],[break]) + done + CFLAGS="$cf_save_CFLAGS" + CC_SHARED_OPTS=$cf_shared_opts + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $[@]' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $[@]' + fi + ;; + (sysv5uw7*|unix_sv*) + # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o [$]@' + ;; + (*) + CC_SHARED_OPTS='unknown' + MK_SHARED_LIB='echo unknown' + ;; + esac + + # This works if the last tokens in $MK_SHARED_LIB are the -o target. + case "$cf_cv_shlib_version" in + (rel|abi) + case "$MK_SHARED_LIB" in + (*'-o $[@]') + test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes + ;; + (*) + AC_MSG_WARN(ignored --with-shlib-version) + ;; + esac + ;; + esac + + if test -n "$cf_try_cflags" + then +cat > conftest.$ac_ext < +int main(int argc, char *argv[[]]) +{ + printf("hello\\n"); + return (argv[[argc-1]] == 0) ; +} +EOF + cf_save_CFLAGS="$CFLAGS" + for cf_opt in $cf_try_cflags + do + CFLAGS="$cf_save_CFLAGS -$cf_opt" + AC_MSG_CHECKING(if CFLAGS option -$cf_opt works) + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + cf_save_CFLAGS="$CFLAGS" + else + AC_MSG_RESULT(no) + fi + done + CFLAGS="$cf_save_CFLAGS" + fi + + + # RPATH_LIST is a colon-separated list of directories + test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}" + test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}" + + test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations" + + CF_VERBOSE(CC_SHARED_OPTS: $CC_SHARED_OPTS) + CF_VERBOSE(MK_SHARED_LIB: $MK_SHARED_LIB) + + AC_SUBST(CC_SHARED_OPTS) + AC_SUBST(LD_RPATH_OPT) + AC_SUBST(LD_SHARED_OPTS) + AC_SUBST(MK_SHARED_LIB) + AC_SUBST(RM_SHARED_OPTS) + + AC_SUBST(LINK_PROGS) + AC_SUBST(LINK_TESTS) + + AC_SUBST(EXTRA_LDFLAGS) + AC_SUBST(LOCAL_LDFLAGS) + AC_SUBST(LOCAL_LDFLAGS2) + + AC_SUBST(INSTALL_LIB) + AC_SUBST(RPATH_LIST) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SHARED_SONAME version: 3 updated: 2008/09/08 18:34:43 +dnl ---------------- +dnl utility macro for CF_SHARED_OPTS, constructs "$cf_cv_shared_soname" for +dnl substitution into MK_SHARED_LIB string for the "-soname" (or similar) +dnl option. +dnl +dnl $1 is the default that should be used for "$cf_cv_shlib_version". +dnl If missing, use "rel". +define([CF_SHARED_SONAME], +[ + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=ifelse($1,,rel,$1) + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $[@]`' + fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_STRIP_G_OPT version: 4 updated: 2021/01/02 09:31:20 +dnl -------------- +dnl Remove "-g" option from the compiler options +AC_DEFUN([CF_STRIP_G_OPT], +[$1=`echo "${$1}" | CF__SED_TRIMBLANKS(-e 's%-g %%' -e 's%-g$%%')`])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06 +dnl -------------- +dnl Construct a search-list for a nonstandard header/lib-file +dnl $1 = the variable to return as result +dnl $2 = the package name +dnl $3 = the subdirectory, e.g., bin, include or lib +AC_DEFUN([CF_SUBDIR_PATH], +[ +$1= + +CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE) + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + [$]HOME +do + CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix) +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TERM_HEADER version: 6 updated: 2021/01/02 09:31:20 +dnl -------------- +dnl Look for term.h, which is part of X/Open curses. It defines the interface +dnl to terminfo database. Usually it is in the same include-path as curses.h, +dnl but some packagers change this, breaking various applications. +AC_DEFUN([CF_TERM_HEADER],[ +AC_CACHE_CHECK(for terminfo header, cf_cv_term_header,[ +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[[^.]]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +AC_TRY_COMPILE([#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> +],[int x = auto_left_margin; (void)x],[ + cf_cv_term_header="$cf_test"],[ + cf_cv_term_header=unknown + ]) + test "$cf_cv_term_header" != unknown && break +done +]) + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h]) + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h]) + ;; +(ncursesw/term.h) + AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h]) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TOP_BUILDDIR version: 2 updated: 2013/07/27 17:38:32 +dnl --------------- +dnl Define a top_builddir symbol, for applications that need an absolute path. +AC_DEFUN([CF_TOP_BUILDDIR], +[ +top_builddir=ifelse($1,,`pwd`,$1) +AC_SUBST(top_builddir) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16 +dnl ------------------- +dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we +dnl can define it successfully. +AC_DEFUN([CF_TRY_XOPEN_SOURCE],[ +AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[ + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY, + [cf_cv_xopen_source=no], + [cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE) + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY, + [cf_cv_xopen_source=no], + [cf_cv_xopen_source=$cf_XOPEN_SOURCE]) + CPPFLAGS="$cf_save" + ]) +]) + +if test "$cf_cv_xopen_source" != no ; then + CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE) + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE) + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + CF_APPEND_CFLAGS($cf_temp_xopen_source) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59 +dnl -------- +dnl Make an uppercase version of a variable +dnl $1=uppercase($2) +AC_DEFUN([CF_UPPER], +[ +$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTF8_LIB version: 11 updated: 2024/08/10 10:23:45 +dnl ----------- +dnl Check for multibyte support, and if not found, utf8 compatibility library +AC_DEFUN([CF_UTF8_LIB], +[ +AC_CHECK_HEADERS(wchar.h) +AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[ + cf_save_LIBS="$LIBS" + AC_TRY_LINK([ +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif +],[putwc(0,0);], + [cf_cv_utf8_lib=yes], + [CF_FIND_LINKAGE([ +#include ],[putwc(0,0);],utf8, + [cf_cv_utf8_lib=add-on], + [cf_cv_utf8_lib=no]) +])]) + +# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between +# ncurses/ncursesw: +if test "$cf_cv_utf8_lib" = "add-on" ; then + AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h]) + CF_ADD_INCDIR($cf_cv_header_path_utf8) + CF_ADD_LIBDIR($cf_cv_library_path_utf8) + CF_ADD_LIBS($cf_cv_library_file_utf8) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12 +dnl ---------- +dnl Use AC_VERBOSE w/o the warnings +AC_DEFUN([CF_VERBOSE], +[test -n "$verbose" && echo " $1" 1>&AC_FD_MSG +CF_MSG_LOG([$1]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WEAK_SYMBOLS version: 1 updated: 2008/08/16 19:18:06 +dnl --------------- +dnl Check for compiler-support for weak symbols. +dnl This works with "recent" gcc. +AC_DEFUN([CF_WEAK_SYMBOLS],[ +AC_CACHE_CHECK(if $CC supports weak symbols,cf_cv_weak_symbols,[ + +AC_TRY_COMPILE([ +#include ], +[ +#if defined(__GNUC__) +# if defined __USE_ISOC99 +# define _cat_pragma(exp) _Pragma(#exp) +# define _weak_pragma(exp) _cat_pragma(weak name) +# else +# define _weak_pragma(exp) +# endif +# define _declare(name) __extension__ extern __typeof__(name) name +# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) +#endif + +weak_symbol(fopen); +],[cf_cv_weak_symbols=yes],[cf_cv_weak_symbols=no]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA version: 1 updated: 2024/05/18 13:55:23 +dnl ----------- +dnl Check for the Ada compiler (unless requested to not do this), which causes +dnl a further check for a C compiler which can work with the Ada compiler. +AC_DEFUN([CF_WITH_ADA],[ +AC_ARG_WITH(ada, + [ --without-ada suppress check for Ada compiler], + [cf_with_ada=$withval], + [cf_with_ada=yes]) + +cf_prog_cc="gcc cc" +if test "x$cf_with_ada" = xyes +then + CF_PROG_GNAT + if test "x$cf_cv_prog_gnat_correct" = xyes; then + # gcc's developers chose to deprecate gnatgcc before making gprconfig + # work. They replaced gnatgcc in gcc 13 with a script which spits out + # a warning offering advice which could never work. + # + # Here is a workaround. + AC_PATH_PROG(cf_cv_path_gnatgcc,gnatgcc,no) + if test "$cf_cv_path_gnatgcc" != no + then + AC_MSG_CHECKING(for improvement) + cf_file_gnatgcc=`file -L "$cf_cv_path_gnatgcc" 2>/dev/null` + case "x$cf_file_gnatgcc" in + (*script*) + cf_cv_path_gnatgcc=`sh -x "$cf_cv_path_gnatgcc" --version 2>&1 | grep -w exec | sed -e 's/^[[ ]]*+[[ ]]*//' -e 's/exec[[ ]]//' -e 's/ .*//'` + ;; + (*) + cf_cv_path_gnatgcc=no + ;; + esac + AC_MSG_RESULT($cf_cv_path_gnatgcc) + test "$cf_cv_path_gnatgcc" = no && cf_cv_path_gnatgcc=gnatgcc + cf_prog_cc="$cf_cv_path_gnatgcc $cf_prog_cc" + fi + fi +fi +case "$cf_prog_cc" in +(*/*) + CC="$cf_prog_cc" + AC_SUBST(CC) + ;; +(*) + CF_PROG_CC($cf_prog_cc) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_COMPILER version: 3 updated: 2023/10/28 11:59:01 +dnl -------------------- +dnl Command-line option to specify the Ada95 compiler. +AC_DEFUN([CF_WITH_ADA_COMPILER],[ +AC_MSG_CHECKING(for Ada95 compiler) +AC_ARG_WITH(ada-compiler, + [[ --with-ada-compiler[=CMD] use CMD as Ada95 compiler (default: gnatmake)]], + [cf_ada_compiler=$withval], + [cf_ada_compiler=gnatmake]) +AC_SUBST(cf_ada_compiler) +AC_MSG_RESULT($cf_ada_compiler) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_INCLUDE version: 3 updated: 2023/10/28 11:59:01 +dnl ------------------- +dnl Command-line option to specify where Ada includes will install. +AC_DEFUN([CF_WITH_ADA_INCLUDE],[ +AC_MSG_CHECKING(for Ada95 include directory) +CF_WITH_PATH(ada-include, + [ --with-ada-include=DIR find Ada95 includes in DIR], + ADA_INCLUDE, + PREFIX/share/ada/adainclude, + [$]prefix/share/ada/adainclude) +AC_SUBST(ADA_INCLUDE) +AC_MSG_RESULT($ADA_INCLUDE) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_LIBNAME version: 3 updated: 2023/11/22 20:48:30 +dnl ------------------- +dnl CF_WITH_ADA_LIBNAME +dnl ------------------- +dnl Command-line option to specify how to name the resulting Ada library. +dnl $1 = default value +AC_DEFUN([CF_WITH_ADA_LIBNAME],[ +AC_MSG_CHECKING(for Ada95 curses library name) +AC_ARG_WITH(ada-libname, + [[ --with-ada-libname[=XXX] use XXX as Ada95 library name]], + ADA_LIBNAME=[$]withval, + ADA_LIBNAME=$1) +case "x$ADA_LIBNAME" in +(x|xyes|xno) + ADA_LIBNAME=$1 + ;; +esac +AC_SUBST(ADA_LIBNAME) +AC_MSG_RESULT($ADA_LIBNAME) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_OBJECTS version: 3 updated: 2023/10/28 11:59:01 +dnl ------------------- +dnl Command-line option to specify where Ada objects will install. +AC_DEFUN([CF_WITH_ADA_OBJECTS],[ +AC_MSG_CHECKING(for Ada95 object directory) +CF_WITH_PATH(ada-objects, + [ --with-ada-objects=DIR find Ada95 objects in DIR], + ADA_OBJECTS, + PREFIX/lib/ada/adalib, + [$]prefix/lib/ada/adalib) +AC_SUBST(ADA_OBJECTS) +AC_MSG_RESULT($ADA_OBJECTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_SHAREDLIB version: 6 updated: 2023/10/28 11:59:01 +dnl --------------------- +dnl Command-line option to specify if an Ada95 shared library should be built, +dnl and optionally what its soname should be. +AC_DEFUN([CF_WITH_ADA_SHAREDLIB],[ +AC_REQUIRE([CF_GNAT_PROJECTS]) +AC_MSG_CHECKING(whether to build an Ada95 shared library) +AC_ARG_WITH(ada-sharedlib, + [ --with-ada-sharedlib build Ada95 shared library; requires GNAT project support], + [with_ada_sharedlib=$withval], + [with_ada_sharedlib=no]) +cf_ada_sharedlib_warn=no + +if test "x$with_ada_sharedlib" != xno +then + if test "x$cf_gnat_projects" != xyes + then + with_ada_sharedlib=no + cf_ada_sharedlib_warn=yes + fi +fi + +AC_MSG_RESULT($with_ada_sharedlib) +if test "x$cf_ada_sharedlib_warn" != xno +then + AC_MSG_WARN(disabling Ada95 shared library since GNAT projects are not supported) +fi + +ADA_SHAREDLIB='lib$(LIB_NAME).so.1' +MAKE_ADA_SHAREDLIB="#" + +if test "x$with_ada_sharedlib" != xno +then + MAKE_ADA_SHAREDLIB= + if test "x$with_ada_sharedlib" != xyes + then + ADA_SHAREDLIB="$with_ada_sharedlib" + fi +fi + +AC_SUBST(ADA_SHAREDLIB) +AC_SUBST(MAKE_ADA_SHAREDLIB) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_CURSES_DIR version: 4 updated: 2021/01/02 19:22:58 +dnl ------------------ +dnl Wrapper for AC_ARG_WITH to specify directory under which to look for curses +dnl libraries. +AC_DEFUN([CF_WITH_CURSES_DIR],[ + +AC_MSG_CHECKING(for specific curses-directory) +AC_ARG_WITH(curses-dir, + [ --with-curses-dir=DIR directory in which (n)curses is installed], + [cf_cv_curses_dir=$withval], + [cf_cv_curses_dir=no]) +AC_MSG_RESULT($cf_cv_curses_dir) + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + CF_PATH_SYNTAX(withval) + if test -d "$cf_cv_curses_dir" + then + CF_ADD_INCDIR($cf_cv_curses_dir/include) + CF_ADD_LIBDIR($cf_cv_curses_dir/lib) + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_LIB_PREFIX version: 2 updated: 2021/01/01 16:53:59 +dnl ------------------ +dnl Allow the library-prefix to be overridden. OS/2 EMX originally had no +dnl "lib" prefix, e.g., because it used the dll naming convention. +dnl +dnl $1 = variable to set +AC_DEFUN([CF_WITH_LIB_PREFIX], +[ +AC_MSG_CHECKING(if you want to have a library-prefix) +AC_ARG_WITH(lib-prefix, + [ --with-lib-prefix override library-prefix], + [with_lib_prefix=$withval], + [with_lib_prefix=auto]) +AC_MSG_RESULT($with_lib_prefix) + +if test "$with_lib_prefix" = auto +then + CF_LIB_PREFIX($1) +elif test "$with_lib_prefix" = no +then + LIB_PREFIX= +else + LIB_PREFIX=$with_lib_prefix +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PATH version: 12 updated: 2021/09/04 06:35:04 +dnl ------------ +dnl Wrapper for AC_ARG_WITH to ensure that user supplies a pathname, not just +dnl defaulting to yes/no. +dnl +dnl $1 = option name +dnl $2 = help-text +dnl $3 = environment variable to set +dnl $4 = default value, shown in the help-message, must be a constant +dnl $5 = default value, if it is an expression & cannot be in the help-message +dnl +AC_DEFUN([CF_WITH_PATH], +[AC_ARG_WITH($1,[$2 ](default: ifelse([$4],,empty,[$4])),, +ifelse([$4],,[withval="${$3}"],[withval="${$3:-ifelse([$5],,[$4],[$5])}"]))dnl +if ifelse([$5],,true,[test -n "$5"]) ; then +CF_PATH_SYNTAX(withval) +fi +eval $3="$withval" +AC_SUBST($3)dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PKG_CONFIG_LIBDIR version: 25 updated: 2024/08/03 13:34:29 +dnl ------------------------- +dnl Allow the choice of the pkg-config library directory to be overridden. +dnl +dnl pkg-config uses a search-list built from these colon-separated lists of +dnl directories: +dnl a) $PKG_CONFIG_PATH (tested first, added if set) +dnl b) $PKG_CONFIG_LIBDIR (tested second, added if set) +dnl c) builtin-list (added if $PKG_CONFIG_LIBDIR is not set) +dnl +dnl pkgconf (used with some systems such as FreeBSD in place of pkg-config) +dnl optionally ignores $PKG_CONFIG_LIBDIR. Very old versions of pkg-config, +dnl e.g., Solaris 10 also do not recognize $PKG_CONFIG_LIBDIR. +AC_DEFUN([CF_WITH_PKG_CONFIG_LIBDIR],[ +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +case "$PKG_CONFIG" in +(no|none|yes) + AC_MSG_CHECKING(for pkg-config library directory) + ;; +(*) + AC_MSG_CHECKING(for $PKG_CONFIG library directory) + ;; +esac + +# if $PKG_CONFIG_LIBDIR is set, try to use that +if test -n "$PKG_CONFIG_PATH"; then + cf_search_path=`echo "$PKG_CONFIG_PATH" | sed -e 's/:/ /g' -e 's,^[[ ]]*,,' -e 's,[[ ]]*$,,'` +elif test -n "$PKG_CONFIG_LIBDIR"; then + cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[[ ]]*,,' -e 's,[[ ]]*$,,'` +else + cf_search_path=auto +fi + +# if the option is used, let that override. otherwise default to "libdir" +AC_ARG_WITH(pkg-config-libdir, + [[ --with-pkg-config-libdir[=XXX] use given directory for installing pc-files]], + [cf_search_path=$withval], + [test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir]) + +case "x$cf_search_path" in +(xlibdir) + PKG_CONFIG_LIBDIR='${libdir}/pkgconfig' + AC_MSG_RESULT($PKG_CONFIG_LIBDIR) + cf_search_path= + ;; +(x) + ;; +(x$GLOB_FULLPATH_POSIX\ *|x$GLOB_FULLPATH_OTHER\ *) + PKG_CONFIG_LIBDIR= + ;; +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + PKG_CONFIG_LIBDIR="$cf_search_path" + AC_MSG_RESULT($PKG_CONFIG_LIBDIR) + cf_search_path= + ;; +(xyes|xauto) + AC_MSG_RESULT(auto) + cf_search_path= + # Look for the library directory using the same prefix as the executable + AC_MSG_CHECKING(for search-list) + if test "x$PKG_CONFIG" != xnone + then + # works for pkg-config since version 0.24 (2009) + # works for pkgconf since version 0.8.3 (2012) + for cf_pkg_program in \ + `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ + pkg-config \ + pkgconf + do + cf_raw_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null` + case "$cf_raw_search_path" in + (*\\*) + cf_search_path=`echo "$cf_raw_search_path" | tr ';' ' ' | tr '\' '/'` + ;; + (*/*) + cf_search_path=`echo "$cf_raw_search_path" | tr : ' '` + ;; + esac + test -n "$cf_search_path" && break + done + + # works for pkg-config since import in 2005 of original 2001 HP code. + test -z "$cf_search_path" && \ + cf_search_path=` + "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ +/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ + sub(\"^[[^']]*'\",\"\"); \ + sub(\"'.*\",\"\"); \ + printf \" %s\", \\[$]0; } \ +{ next; } \ +"` + fi + + AC_MSG_RESULT($cf_search_path) + ;; +(*) + AC_MSG_ERROR(Unexpected option value: $cf_search_path) + ;; +esac + +if test -n "$cf_search_path" +then + AC_MSG_CHECKING(for first directory) + cf_pkg_config_path=none + for cf_config in $cf_search_path + do + if test -d "$cf_config" + then + cf_pkg_config_path=$cf_config + break + fi + done + AC_MSG_RESULT($cf_pkg_config_path) + + if test "x$cf_pkg_config_path" != xnone ; then + # limit this to the first directory found + PKG_CONFIG_LIBDIR="$cf_pkg_config_path" + fi + + if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path" + then + AC_MSG_CHECKING(for workaround) + if test "$prefix" = "NONE" ; then + cf_prefix="$ac_default_prefix" + else + cf_prefix="$prefix" + fi + eval cf_libdir=$libdir + cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"` + cf_backup= + for cf_config in $cf_search_path + do + case $cf_config in + $cf_libdir/pkgconfig) + PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig + break + ;; + *) + test -z "$cf_backup" && cf_backup=$cf_config + ;; + esac + done + test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup + AC_MSG_RESULT($PKG_CONFIG_LIBDIR) + fi +fi + +AC_SUBST(PKG_CONFIG_LIBDIR) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PTHREAD version: 7 updated: 2015/04/18 08:56:57 +dnl --------------- +dnl Check for POSIX thread library. +AC_DEFUN([CF_WITH_PTHREAD], +[ +AC_MSG_CHECKING(if you want to link with the pthread library) +AC_ARG_WITH(pthread, + [ --with-pthread use POSIX thread library], + [with_pthread=$withval], + [with_pthread=no]) +AC_MSG_RESULT($with_pthread) + +if test "$with_pthread" != no ; then + AC_CHECK_HEADER(pthread.h,[ + AC_DEFINE(HAVE_PTHREADS_H,1,[Define to 1 if we have pthreads.h header]) + + for cf_lib_pthread in pthread c_r + do + AC_MSG_CHECKING(if we can link with the $cf_lib_pthread library) + cf_save_LIBS="$LIBS" + CF_ADD_LIB($cf_lib_pthread) + AC_TRY_LINK([ +#include +],[ + int rc = pthread_create(0,0,0,0); + int r2 = pthread_mutexattr_settype(0, 0); +],[with_pthread=yes],[with_pthread=no]) + LIBS="$cf_save_LIBS" + AC_MSG_RESULT($with_pthread) + test "$with_pthread" = yes && break + done + + if test "$with_pthread" = yes ; then + CF_ADD_LIB($cf_lib_pthread) + AC_DEFINE(HAVE_LIBPTHREADS,1,[Define to 1 if we have pthreads library]) + else + AC_MSG_ERROR(Cannot link with pthread library) + fi + ]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_WITH_SYSTYPE version: 1 updated: 2013/01/26 16:26:12 +dnl --------------- +dnl For testing, override the derived host system-type which is used to decide +dnl things such as the linker commands used to build shared libraries. This is +dnl normally chosen automatically based on the type of system which you are +dnl building on. We use it for testing the configure script. +dnl +dnl This is different from the --host option: it is used only for testing parts +dnl of the configure script which would not be reachable with --host since that +dnl relies on the build environment being real, rather than mocked up. +AC_DEFUN([CF_WITH_SYSTYPE],[ +CF_CHECK_CACHE([AC_CANONICAL_SYSTEM]) +AC_ARG_WITH(system-type, + [ --with-system-type=XXX test: override derived host system-type], +[AC_MSG_WARN(overriding system type to $withval) + cf_cv_system_name=$withval + host_os=$withval +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_XOPEN_SOURCE version: 67 updated: 2023/09/06 18:55:27 +dnl --------------- +dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions, +dnl or adapt to the vendor's definitions to get equivalent functionality, +dnl without losing the common non-POSIX features. +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +dnl $2 is the nominal value for _POSIX_C_SOURCE +dnl +dnl The default case prefers _XOPEN_SOURCE over _POSIX_C_SOURCE if the +dnl implementation predefines it, because X/Open and most implementations agree +dnl that the latter is a legacy or "aligned" value. +dnl +dnl Because _XOPEN_SOURCE is preferred, if defining _POSIX_C_SOURCE turns +dnl that off, then refrain from setting _POSIX_C_SOURCE explicitly. +dnl +dnl References: +dnl https://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html +dnl https://docs.oracle.com/cd/E19253-01/816-5175/standards-5/index.html +dnl https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html +AC_DEFUN([CF_XOPEN_SOURCE],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([CF_POSIX_VISIBLE]) + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=ifelse([$1],,500,[$1]) +cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2]) +cf_xopen_source= + +case "$host_os" in +(aix[[4-7]]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(darwin[[0-8]].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[[56]].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin|msys|mingw*|linux*uclibc) + CF_GNU_SOURCE($cf_XOPEN_SOURCE) + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[[6-9]]*) + # OpenBSD 6.x has broken locale support, both compile-time and runtime. + # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + # Abusing the conformance level is a workaround. + AC_MSG_WARN(this system does not provide usable locale support) + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=700 + ;; +(openbsd[[4-5]]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[[45]]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + CF_TRY_XOPEN_SOURCE + cf_save_xopen_cppflags="$CPPFLAGS" + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + # Some of these niche implementations use copy/paste, double-check... + if test "$cf_cv_xopen_source" = no ; then + CF_VERBOSE(checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE) + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[ + AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable) + CPPFLAGS="$cf_save_xopen_cppflags"]) + fi + ;; +esac + +if test -n "$cf_xopen_source" ; then + CF_APPEND_CFLAGS($cf_xopen_source,true) +fi + +dnl In anything but the default case, we may have system-specific setting +dnl which is still not guaranteed to provide all of the entrypoints that +dnl _XOPEN_SOURCE would yield. +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + AC_MSG_CHECKING(if _XOPEN_SOURCE really is set) + AC_TRY_COMPILE([#include ],[ +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif], + [cf_XOPEN_SOURCE_set=yes], + [cf_XOPEN_SOURCE_set=no]) + AC_MSG_RESULT($cf_XOPEN_SOURCE_set) + if test "$cf_XOPEN_SOURCE_set" = yes + then + AC_TRY_COMPILE([#include ],[ +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#error (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#endif], + [cf_XOPEN_SOURCE_set_ok=yes], + [cf_XOPEN_SOURCE_set_ok=no]) + if test "$cf_XOPEN_SOURCE_set_ok" = no + then + AC_MSG_WARN(_XOPEN_SOURCE is lower than requested) + fi + else + CF_TRY_XOPEN_SOURCE + fi +fi +fi # cf_cv_posix_visible +]) +dnl --------------------------------------------------------------------------- +dnl CF__SED_TRIMBLANKS version: 1 updated: 2021/01/02 09:31:20 +dnl ------------------ +dnl Trim something using sed, then trim extra whitespace +dnl $1 = extra parameters, e.g., in CF_STRIP_G_OPT +define([CF__SED_TRIMBLANKS],[sed ifelse($1,,,[$1] )-e 's%[[ ]]% %g' -e 's% [[ ]]*% %g' -e 's%^ %%' -e 's% [$]%%'])dnl +dnl --------------------------------------------------------------------------- +dnl CF__XOPEN_SOURCE_BODY version: 2 updated: 2023/02/18 17:41:25 +dnl --------------------- +dnl body of test when test-compiling for _XOPEN_SOURCE check +define([CF__XOPEN_SOURCE_BODY], +[ +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif +]) +dnl --------------------------------------------------------------------------- +dnl CF__XOPEN_SOURCE_HEAD version: 2 updated: 2023/02/18 17:41:25 +dnl --------------------- +dnl headers to include when test-compiling for _XOPEN_SOURCE check +define([CF__XOPEN_SOURCE_HEAD], +[ +$ac_includes_default +]) diff --git a/contrib/ncurses/Ada95/configure b/contrib/ncurses/Ada95/configure new file mode 100755 index 00000000..45ac71dd --- /dev/null +++ b/contrib/ncurses/Ada95/configure @@ -0,0 +1,19722 @@ +#! /bin/sh +# From configure.in Revision: 1.94 . +# Guess values for system-dependent variables and create Makefiles. +# Generated by Autoconf 2.52.20240618. +# +# Copyright 2003-2022,2023 Thomas E. Dickey +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr="expr" +else + as_expr="false" +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln' +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset="unset" +else + as_unset="false" +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: "${ac_max_here_lines=38}" + +ac_unique_file="gen/gen.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${datarootdir}/info' +mandir='${datarootdir}/man' + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo "$ac_feature" | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo "$ac_feature" | sed 's/-/_/g'` + case "$ac_option" in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst \ + | --runs | --run | --ru) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* \ + | --runs=* | --run=* | --ru=*) + runstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo "$ac_package" | sed 's/-/_/g'` + case "$ac_option" in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo "$ac_package" | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*dir | -dvi* | -doc* | -html* | -local* | -pdf* | -ps* ) + echo "$as_me: WARNING: unsupported option: $ac_option" >&2 + ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export "$ac_envvar" ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo "$ac_prev" | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo "$ac_var"` + case "$ac_val" in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo "$ac_var"` + case "$ac_val" in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: should be removed in autoconf 3.0. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat < if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +EOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue + cd "$ac_subdir" + # A "../" for each directory in /$ac_subdir. + ac_dots=`echo "$ac_subdir" | + sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'` + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir="$srcdir" ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_sub_srcdir="$srcdir/$ac_subdir" ;; + *) # Relative path. + ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_sub_srcdir/configure.gnu"; then + echo + $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_sub_srcdir/configure"; then + echo + $SHELL "$ac_sub_srcdir/configure" --help=recursive + elif test -f "$ac_sub_srcdir/configure.ac" || + test -f "$ac_sub_srcdir/configure.in"; then + echo + "$ac_configure" --help + else + echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if "$ac_init_version"; then + cat <<\EOF + +Copyright 2003-2022,2023 Thomas E. Dickey +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +EOF + exit 0 +fi +exec 5>config.log +cat >&5 </dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +PATH = $PATH + +_ASUNAME +} >&5 + +cat >&5 <\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + echo >&5 + echo "## ----------------- ##" >&5 + echo "## Cache variables. ##" >&5 + echo "## ----------------- ##" >&5 + echo >&5 + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} >&5 + sed "/^$/d" confdefs.h >conftest.log + if test -s conftest.log; then + echo >&5 + echo "## ------------ ##" >&5 + echo "## confdefs.h. ##" >&5 + echo "## ------------ ##" >&5 + echo >&5 + cat conftest.log >&5 + fi + (echo; echo) >&5 + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" >&5 + echo "$as_me: exit $exit_status" >&5 + rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal" +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:956: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + cat "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:967: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:975: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case "$ac_old_set,$ac_new_set" in + set,) + { echo "$as_me:991: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:995: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:1001: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:1003: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:1005: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. It doesn't matter if + # we pass some twice (in addition to the command line arguments). + if test "$ac_new_set" = set; then + case "$ac_new_val" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val" + ;; + esac + fi +done +if "$ac_cache_corrupted"; then + { echo "$as_me:1024: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:1026: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in + *c*,-n*) ECHO_N= + ECHO_C= # newlines do not sed ;-) only broken shells would use this case anyway + ECHO_T=' ' + ;; + *c*,* ) ECHO_N=-n + ECHO_C= + ECHO_T= + ;; + *) ECHO_N= + ECHO_C='\c' + ECHO_T= + ;; +esac +echo "#! $SHELL" >conftest.sh +echo "exit 0" >>conftest.sh +chmod +x conftest.sh +if { (echo "$as_me:1055: PATH=\".;.\"; conftest.sh") >&5 + (PATH=".;."; conftest.sh) 2>&5 + ac_status=$? + echo "$as_me:1058: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + ac_path_separator=';' +else + ac_path_separator=: +fi +PATH_SEPARATOR="$ac_path_separator" +rm -f conftest.sh + +ac_config_headers="$ac_config_headers include/ncurses_cfg.h:include/ncurses_cfg.hin" + +PACKAGE="AdaCurses" + +top_builddir=`pwd` + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:1090: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:1100: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:1104: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:1113: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` || + { { echo "$as_me:1117: error: $ac_config_sub $ac_cv_build_alias failed." >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1122: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +echo "$as_me:1129: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` || + { { echo "$as_me:1138: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1143: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then + echo "$as_me:1151: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` || + { { echo "$as_me:1160: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1165: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && +cat >>confdefs.h <&6 +else + cf_cv_system_name="$system_name" +fi + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && echo "$as_me:1197: result: Configuring for $cf_cv_system_name" >&5 +echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6 + +if test ".$system_name" != ".$cf_cv_system_name" ; then + echo "$as_me:1201: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5 +echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6 + { { echo "$as_me:1203: error: \"Please remove config.cache and try again.\"" >&5 +echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# Check whether --with-system-type or --without-system-type was given. +if test "${with_system_type+set}" = set; then + withval="$with_system_type" + { echo "$as_me:1211: WARNING: overriding system type to $withval" >&5 +echo "$as_me: WARNING: overriding system type to $withval" >&2;} + cf_cv_system_name=$withval + host_os=$withval + +fi; + +### Save the given $CFLAGS to allow user-override. +cf_user_CFLAGS="$CFLAGS" + +### Default install-location +for ac_prog in ggrep grep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1226: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$GREP"; then + ac_cv_prog_GREP="$GREP" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_GREP="$ac_prog" +echo "$as_me:1241: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +GREP=$ac_cv_prog_GREP +if test -n "$GREP"; then + echo "$as_me:1249: result: $GREP" >&5 +echo "${ECHO_T}$GREP" >&6 +else + echo "$as_me:1252: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$GREP" && break +done +test -n "$GREP" || GREP=": " + +echo "$as_me:1260: checking for fgrep" >&5 +echo $ECHO_N "checking for fgrep... $ECHO_C" >&6 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + for ac_prog in gfgrep fgrep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1272: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_FGREP="$ac_dir/$ac_word" + echo "$as_me:1289: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +FGREP=$ac_cv_path_FGREP + +if test -n "$FGREP"; then + echo "$as_me:1300: result: $FGREP" >&5 +echo "${ECHO_T}$FGREP" >&6 +else + echo "$as_me:1303: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$FGREP" && break +done +test -n "$FGREP" || FGREP=": " + + test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:1311: error: cannot find workable fgrep" >&5 +echo "$as_me: error: cannot find workable fgrep" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:1316: result: $ac_cv_path_FGREP" >&5 +echo "${ECHO_T}$ac_cv_path_FGREP" >&6 + FGREP="$ac_cv_path_FGREP" + +echo "$as_me:1320: checking for prefix" >&5 +echo $ECHO_N "checking for prefix... $ECHO_C" >&6 +if test "x$prefix" = "xNONE" ; then + case "$cf_cv_system_name" in + # non-vendor systems don't have a conflict + (openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*) + prefix=/usr + ;; + (*) prefix=$ac_default_prefix + ;; + esac +fi +echo "$as_me:1332: result: $prefix" >&5 +echo "${ECHO_T}$prefix" >&6 + +if test "x$prefix" = "xNONE" ; then +echo "$as_me:1336: checking for default include-directory" >&5 +echo $ECHO_N "checking for default include-directory... $ECHO_C" >&6 +test -n "$verbose" && echo 1>&6 +for cf_symbol in \ + "$includedir" \ + "$includedir/ncurses" \ + "$prefix/include" \ + "$prefix/include/ncurses" \ + /usr/local/include \ + /usr/local/include/ncurses \ + /usr/include \ + /usr/include/ncurses +do + cf_dir=`eval echo "$cf_symbol"` + if test -f "$cf_dir/curses.h" ; then + if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then + includedir="$cf_symbol" + test -n "$verbose" && echo $ECHO_N " found " 1>&6 + break + fi + fi + test -n "$verbose" && echo " tested $cf_dir" 1>&6 +done +echo "$as_me:1359: result: $includedir" >&5 +echo "${ECHO_T}$includedir" >&6 +fi + +### Checks for programs. + +# Check whether --with-ada or --without-ada was given. +if test "${with_ada+set}" = set; then + withval="$with_ada" + cf_with_ada=$withval +else + cf_with_ada=yes +fi; + +cf_prog_cc="gcc cc" +if test "x$cf_with_ada" = xyes +then + +for cf_prog_gnat in gnat gnatmake gprconfig gprbuild +do + +cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + unset ac_cv_path_cf_TEMP_gnat + unset cf_TEMP_gnat + # Extract the first word of "$cf_prog_gnat", so it can be a program name with args. +set dummy $cf_prog_gnat; ac_word=$2 +echo "$as_me:1386: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_cf_TEMP_gnat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $cf_TEMP_gnat in + [\\/]* | ?:[\\/]*) + ac_cv_path_cf_TEMP_gnat="$cf_TEMP_gnat" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_cf_TEMP_gnat="$ac_dir/$ac_word" + echo "$as_me:1403: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_cf_TEMP_gnat" && ac_cv_path_cf_TEMP_gnat="no" + ;; +esac +fi +cf_TEMP_gnat=$ac_cv_path_cf_TEMP_gnat + +if test -n "$cf_TEMP_gnat"; then + echo "$as_me:1415: result: $cf_TEMP_gnat" >&5 +echo "${ECHO_T}$cf_TEMP_gnat" >&6 +else + echo "$as_me:1418: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + eval "cf_cv_PATH_$cf_upper_prog_gnat=$ac_cv_path_cf_TEMP_gnat" + + if test "x$cf_TEMP_gnat" != xno; then + unset cf_cv_gnat_version + unset cf_TEMP_gnat + +echo "$as_me:1428: checking for $cf_prog_gnat version" >&5 +echo $ECHO_N "checking for $cf_prog_gnat version... $ECHO_C" >&6 +if test "${cf_cv_gnat_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gnat_version=`$cf_prog_gnat --version 2>&1 | \ + grep '[0-9].[0-9][0-9]*' |\ + sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'` + +fi +echo "$as_me:1439: result: $cf_cv_gnat_version" >&5 +echo "${ECHO_T}$cf_cv_gnat_version" >&6 +test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no +eval cf_TEMP_gnat=$cf_cv_gnat_version; unset cf_cv_gnat_version + + fi + eval "cf_cv_VERSION_$cf_upper_prog_gnat=$cf_TEMP_gnat" + + unset cf_TEMP_gnat + unset cf_cv_gnat_version + unset ac_cv_path_cf_TEMP_gnat +done + +if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then + cf_ada_make= + cf_cv_prog_gnat_correct=no +else + cf_ada_make=gnatmake + if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then + # gprconfig is newer than gnatmake; we can continue... + cf_ada_config="##" + else + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src + then + cf_ada_config="" + cd conftest.src + for cf_gprconfig in Ada C + do + echo "$as_me:1468: checking for gprconfig name for $cf_gprconfig" >&5 +echo $ECHO_N "checking for gprconfig name for $cf_gprconfig... $ECHO_C" >&6 + if test "$cf_gprconfig" = C + then + for cf_gprconfig_param in \ + "$cf_gprconfig,,,,GNATGCC" \ + "$cf_gprconfig,,,,GCC" \ + "$cf_gprconfig" + do + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1` + test -n "$cf_gprconfig_value" && break + done + else + cf_gprconfig_param=$cf_gprconfig + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1` + fi + if test -n "$cf_gprconfig_value" + then + eval "cf_ada_config_$cf_gprconfig=$cf_gprconfig_value" + echo "$as_me:1487: result: $cf_gprconfig_value" >&5 +echo "${ECHO_T}$cf_gprconfig_value" >&6 + else + echo "$as_me:1490: result: missing" >&5 +echo "${ECHO_T}missing" >&6 + cf_ada_config="#" + break + fi + done + cd .. + rm -rf ./conftest* ./*~conftest* + fi + fi + if test "x$cf_ada_config" != "x#" + then + +echo "$as_me:1503: checking for gnat version" >&5 +echo $ECHO_N "checking for gnat version... $ECHO_C" >&6 +if test "${cf_cv_gnat_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gnat_version=`${cf_ada_make:-gnatmake} --version 2>&1 | \ + grep '[0-9].[0-9][0-9]*' |\ + sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'` + +fi +echo "$as_me:1514: result: $cf_cv_gnat_version" >&5 +echo "${ECHO_T}$cf_cv_gnat_version" >&6 +test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no + +case "$cf_cv_gnat_version" in +(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9]) + cf_cv_prog_gnat_correct=yes + ;; +(*) + { echo "$as_me:1523: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&5 +echo "$as_me: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&2;} + cf_cv_prog_gnat_correct=no + ;; +esac + + # Extract the first word of "m4", so it can be a program name with args. +set dummy m4; ac_word=$2 +echo "$as_me:1531: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_M4_exists+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$M4_exists"; then + ac_cv_prog_M4_exists="$M4_exists" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_M4_exists="yes" +echo "$as_me:1546: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_M4_exists" && ac_cv_prog_M4_exists="no" +fi +fi +M4_exists=$ac_cv_prog_M4_exists +if test -n "$M4_exists"; then + echo "$as_me:1555: result: $M4_exists" >&5 +echo "${ECHO_T}$M4_exists" >&6 +else + echo "$as_me:1558: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$ac_cv_prog_M4_exists" = no; then + cf_cv_prog_gnat_correct=no + { echo "$as_me:1564: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&5 +echo "$as_me: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&2;} + fi + if test "$cf_cv_prog_gnat_correct" = yes; then + echo "$as_me:1568: checking if GNAT works" >&5 +echo $ECHO_N "checking if GNAT works... $ECHO_C" >&6 + +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&5 2>&1 ) ; then + if ( ./conftest 1>&5 2>&1 ) ; then + cf_cv_prog_gnat_correct=yes + else + cf_cv_prog_gnat_correct=no + fi +else + cf_cv_prog_gnat_correct=no +fi +rm -rf ./conftest* ./*~conftest* + + echo "$as_me:1596: result: $cf_cv_prog_gnat_correct" >&5 +echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6 + fi + else + cf_cv_prog_gnat_correct=no + fi +fi + + if test "x$cf_cv_prog_gnat_correct" = xyes; then + # gcc's developers chose to deprecate gnatgcc before making gprconfig + # work. They replaced gnatgcc in gcc 13 with a script which spits out + # a warning offering advice which could never work. + # + # Here is a workaround. + # Extract the first word of "gnatgcc", so it can be a program name with args. +set dummy gnatgcc; ac_word=$2 +echo "$as_me:1612: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_cf_cv_path_gnatgcc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $cf_cv_path_gnatgcc in + [\\/]* | ?:[\\/]*) + ac_cv_path_cf_cv_path_gnatgcc="$cf_cv_path_gnatgcc" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_cf_cv_path_gnatgcc="$ac_dir/$ac_word" + echo "$as_me:1629: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_cf_cv_path_gnatgcc" && ac_cv_path_cf_cv_path_gnatgcc="no" + ;; +esac +fi +cf_cv_path_gnatgcc=$ac_cv_path_cf_cv_path_gnatgcc + +if test -n "$cf_cv_path_gnatgcc"; then + echo "$as_me:1641: result: $cf_cv_path_gnatgcc" >&5 +echo "${ECHO_T}$cf_cv_path_gnatgcc" >&6 +else + echo "$as_me:1644: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$cf_cv_path_gnatgcc" != no + then + echo "$as_me:1650: checking for improvement" >&5 +echo $ECHO_N "checking for improvement... $ECHO_C" >&6 + cf_file_gnatgcc=`file -L "$cf_cv_path_gnatgcc" 2>/dev/null` + case "x$cf_file_gnatgcc" in + (*script*) + cf_cv_path_gnatgcc=`sh -x "$cf_cv_path_gnatgcc" --version 2>&1 | grep -w exec | sed -e 's/^[ ]*+[ ]*//' -e 's/exec[ ]//' -e 's/ .*//'` + ;; + (*) + cf_cv_path_gnatgcc=no + ;; + esac + echo "$as_me:1661: result: $cf_cv_path_gnatgcc" >&5 +echo "${ECHO_T}$cf_cv_path_gnatgcc" >&6 + test "$cf_cv_path_gnatgcc" = no && cf_cv_path_gnatgcc=gnatgcc + cf_prog_cc="$cf_cv_path_gnatgcc $cf_prog_cc" + fi + fi +fi +case "$cf_prog_cc" in +(*/*) + CC="$cf_prog_cc" + + ;; +(*) + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" +if test -n "$ac_tool_prefix"; then + for ac_prog in $cf_prog_cc + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:1686: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +echo "$as_me:1701: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1709: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1712: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in $cf_prog_cc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1725: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="$ac_prog" +echo "$as_me:1740: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1748: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1751: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +test -z "$CC" && { { echo "$as_me:1761: error: no acceptable cc found in \$PATH" >&5 +echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:1766:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo "$2"` +{ (eval echo "$as_me:1769: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:1772: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:1774: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:1777: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:1779: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:1782: \$? = $ac_status" >&5 + (exit "$ac_status"); } + +cat >"conftest.$ac_ext" <<_ACEOF +#line 1786 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:1802: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'` +if { (eval echo "$as_me:1805: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:1808: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. +for ac_file in `ls a.exe conftest.exe 2>/dev/null; + ls a.out conftest 2>/dev/null; + ls a.* conftest.* 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +{ { echo "$as_me:1831: error: C compiler cannot create executables" >&5 +echo "$as_me: error: C compiler cannot create executables" >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:1837: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1842: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:1848: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1851: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:1858: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:1866: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe "conftest$ac_cv_exeext" +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1873: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:1875: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:1878: checking for executable suffix" >&5 +echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 +if { (eval echo "$as_me:1880: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:1883: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:1899: error: cannot compute EXEEXT: cannot compile and link" >&5 +echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f "conftest$ac_cv_exeext" +echo "$as_me:1905: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f "conftest.$ac_ext" +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:1911: checking for object suffix" >&5 +echo $ECHO_N "checking for object suffix... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 1917 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:1929: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1932: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +{ { echo "$as_me:1944: error: cannot compute OBJEXT: cannot compile" >&5 +echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext" +fi +echo "$as_me:1951: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:1955: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 1961 "configure" +#include "confdefs.h" + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1976: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1979: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1982: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1985: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_compiler_gnu=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:1997: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:2003: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 2009 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2021: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2024: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2027: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2030: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_prog_cc_g=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:2040: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >"conftest.$ac_ext" <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2067: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2070: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2073: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2076: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 2088 "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2101: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2104: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2107: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2110: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +continue +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2120 "configure" +#include "confdefs.h" +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2132: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2135: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2138: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2141: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +rm -rf conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo "$ac_declaration" >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +GCC_VERSION=none +if test "$GCC" = yes ; then + echo "$as_me:2171: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^[^(]*([^)][^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + echo "$as_me:2175: result: $GCC_VERSION" >&5 +echo "${ECHO_T}$GCC_VERSION" >&6 +fi + +INTEL_COMPILER=no + +if test "$GCC" = yes ; then + case "$host_os" in + (linux*|gnu*) + echo "$as_me:2184: checking if this is really Intel C compiler" >&5 +echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -no-gcc" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2189 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2206: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2209: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2212: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2215: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + INTEL_COMPILER=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:2226: result: $INTEL_COMPILER" >&5 +echo "${ECHO_T}$INTEL_COMPILER" >&6 + ;; + esac +fi + +CLANG_COMPILER=no + +if test "$GCC" = yes ; then + echo "$as_me:2235: checking if this is really Clang C compiler" >&5 +echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2239 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2256: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2259: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2262: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2265: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + CLANG_COMPILER=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:2275: result: $CLANG_COMPILER" >&5 +echo "${ECHO_T}$CLANG_COMPILER" >&6 +fi + +CLANG_VERSION=none + +if test "x$CLANG_COMPILER" = "xyes" ; then + case "$CC" in + (c[1-9][0-9]|*/c[1-9][0-9]) + { echo "$as_me:2284: WARNING: replacing broken compiler alias $CC" >&5 +echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;} + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + echo "$as_me:2291: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + echo "$as_me:2295: result: $CLANG_VERSION" >&5 +echo "${ECHO_T}$CLANG_VERSION" >&6 + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + echo "$as_me:2302: checking if option $cf_clang_opt works" >&5 +echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2307 "configure" +#include "confdefs.h" + + #include +int +main (void) +{ + + printf("hello!\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:2321: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:2324: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:2327: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2330: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_clang_optok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_clang_optok=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:2341: result: $cf_clang_optok" >&5 +echo "${ECHO_T}$cf_clang_optok" >&6 + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + test -n "$verbose" && echo " adding option $cf_clang_opt" 1>&6 + +echo "${as_me:-configure}:2347: testing adding option $cf_clang_opt ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_clang_opt" + + fi + done +fi + +echo "$as_me:2356: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >"conftest.$ac_ext" <<_ACEOF +#line 2364 "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (char **p, int i) +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main (void) +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2411: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2414: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2417: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2420: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" +done +rm -f "conftest.$ac_ext" "conftest.$ac_objext" +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:2437: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:2440: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# This should have been defined by AC_PROG_CC +: "${CC:=cc}" + +echo "$as_me:2448: checking \$CFLAGS variable" >&5 +echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 +case "x$CFLAGS" in +(*-[IUD]*) + echo "$as_me:2452: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2454: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;} + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + done + ;; +(*) + echo "$as_me:2562: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +echo "$as_me:2567: checking \$CC variable" >&5 +echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 +case "$CC" in +(*[\ \ ]-*) + echo "$as_me:2571: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2573: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;} + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'` + cf_flags=`echo "$CC" | sed -e "s%^$cf_prog%%"` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[IUDfgOW]*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + test -n "$verbose" && echo " resulting CC: '$CC'" 1>&6 + +echo "${as_me:-configure}:2690: testing resulting CC: '$CC' ..." 1>&5 + + test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 + +echo "${as_me:-configure}:2694: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 + + test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 + +echo "${as_me:-configure}:2698: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 + + ;; +(*) + echo "$as_me:2702: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + + ;; +esac + +echo "$as_me:2710: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + for ac_prog in gegrep egrep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2722: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_EGREP="$ac_dir/$ac_word" + echo "$as_me:2739: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +EGREP=$ac_cv_path_EGREP + +if test -n "$EGREP"; then + echo "$as_me:2750: result: $EGREP" >&5 +echo "${ECHO_T}$EGREP" >&6 +else + echo "$as_me:2753: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$EGREP" && break +done +test -n "$EGREP" || EGREP=": " + + test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:2761: error: cannot find workable egrep" >&5 +echo "$as_me: error: cannot find workable egrep" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:2766: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6 + EGREP="$ac_cv_path_EGREP" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" +echo "$as_me:2776: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2797 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:2802: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2808: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2831 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:2835: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2841: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:2878: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2888 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:2893: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2899: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2922 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:2926: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2932: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + : +else + { { echo "$as_me:2960: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +if test $ac_cv_c_compiler_gnu = yes; then + echo "$as_me:2973: checking whether $CC needs -traditional" >&5 +echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 +if test "${ac_cv_prog_gcc_traditional+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_pattern="Autoconf.*'x'" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2980 "configure" +#include "confdefs.h" +#include +int Autoconf = TIOCGETP; +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -rf conftest* + + if test $ac_cv_prog_gcc_traditional = no; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 2995 "configure" +#include "confdefs.h" +#include +int Autoconf = TCGETA; +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +fi +rm -rf conftest* + + fi +fi +echo "$as_me:3008: result: $ac_cv_prog_gcc_traditional" >&5 +echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +echo "$as_me:3015: checking whether $CC understands -c and -o together" >&5 +echo $ECHO_N "checking whether $CC understands -c and -o together... $ECHO_C" >&6 +if test "${cf_cv_prog_CC_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat > conftest.$ac_ext <&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3033: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + test -f conftest2.$ac_objext && { (eval echo "$as_me:3035: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3038: \$? = $ac_status" >&5 + (exit "$ac_status"); }; +then + eval cf_cv_prog_CC_c_o=yes +else + eval cf_cv_prog_CC_c_o=no +fi +rm -rf ./conftest* + +fi +if test "$cf_cv_prog_CC_c_o" = yes; then + echo "$as_me:3049: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:3052: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +for ac_prog in mawk gawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3073: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AWK="$ac_prog" +echo "$as_me:3088: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:3096: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:3099: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +test -z "$AWK" && { { echo "$as_me:3106: error: No awk program found" >&5 +echo "$as_me: error: No awk program found" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:3110: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:3120: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + test -z "$EGREP" && { { echo "$as_me:3124: error: No egrep program found" >&5 +echo "$as_me: error: No egrep program found" >&2;} + { (exit 1); exit 1; }; } + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:3140: checking for a BSD compatible install" >&5 +echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_IFS=$IFS; IFS=$ac_path_separator + for ac_dir in $PATH; do + IFS=$ac_save_IFS + # Account for people who put trailing slashes in PATH elements. + case $ac_dir/ in + / | ./ | .// | /cC/* \ + | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ + | /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if $as_executable_p "$ac_dir/$ac_prog"; then + if test $ac_prog = install && + grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:3189: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:3200: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:3204: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:3207: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:3211: checking if $LN_S -f options work" >&5 +echo $ECHO_N "checking if $LN_S -f options work... $ECHO_C" >&6 + +rm -f conf$$.src conf$$dst +echo >conf$$.dst +echo first >conf$$.src +if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then + cf_prog_ln_sf=yes +else + cf_prog_ln_sf=no +fi +rm -f conf$$.dst conf$$src +echo "$as_me:3223: result: $cf_prog_ln_sf" >&5 +echo "${ECHO_T}$cf_prog_ln_sf" >&6 + +test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" + +case "$cf_cv_system_name" in +(cygwin*|msys*|mingw32*|mingw64|os2*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER='[a-zA-Z]:[\\/]*' + ;; +(*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER=$GLOB_FULLPATH_POSIX + ;; +esac + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:3251: checking for a BSD compatible install" >&5 +echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_IFS=$IFS; IFS=$ac_path_separator + for ac_dir in $PATH; do + IFS=$ac_save_IFS + # Account for people who put trailing slashes in PATH elements. + case $ac_dir/ in + / | ./ | .// | /cC/* \ + | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ + | /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if $as_executable_p "$ac_dir/$ac_prog"; then + if test $ac_prog = install && + grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:3300: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case x$INSTALL in +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(*) + cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'` + test -z "$cf_dir" && cf_dir=. + INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" + ;; +esac + +echo "$as_me:3321: checking if you want to install stripped executables" >&5 +echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6 + +# Check whether --enable-stripping or --disable-stripping was given. +if test "${enable_stripping+set}" = set; then + enableval="$enable_stripping" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_stripping=no + else + enable_stripping=yes + fi +else + enableval=yes + enable_stripping=yes + +fi; +echo "$as_me:3338: result: $enable_stripping" >&5 +echo "${ECHO_T}$enable_stripping" >&6 + +if test "$enable_stripping" = yes +then + INSTALL_OPT_S="-s" +else + INSTALL_OPT_S= +fi + +: "${INSTALL:=install}" +echo "$as_me:3349: checking if install accepts -p option" >&5 +echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6 +if test "${cf_cv_install_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -rf ./conftest* + date >conftest.in + mkdir conftest.out + sleep 3 + if $INSTALL -p conftest.in conftest.out 2>/dev/null + then + if test -f conftest.out/conftest.in + then + test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \ + test conftest.out/conftest.in -nt conftest.in 2>conftest.err + if test -s conftest.err + then + cf_cv_install_p=no + else + cf_cv_install_p=yes + fi + else + cf_cv_install_p=no + fi + else + cf_cv_install_p=no + fi + rm -rf ./conftest* + +fi +echo "$as_me:3380: result: $cf_cv_install_p" >&5 +echo "${ECHO_T}$cf_cv_install_p" >&6 + +echo "$as_me:3383: checking if install needs to be told about ownership" >&5 +echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6 +case `$ac_config_guess` in +(*minix) + with_install_o=yes + ;; +(*) + with_install_o=no + ;; +esac + +echo "$as_me:3394: result: $with_install_o" >&5 +echo "${ECHO_T}$with_install_o" >&6 +if test "x$with_install_o" = xyes +then + INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`" +else + INSTALL_OPT_O= +fi + +if test -n "$INSTALL_OPT_S" +then + echo "$as_me:3405: checking if you want to specify strip-program" >&5 +echo $ECHO_N "checking if you want to specify strip-program... $ECHO_C" >&6 + +# Check whether --with-strip-program or --without-strip-program was given. +if test "${with_strip_program+set}" = set; then + withval="$with_strip_program" + with_strip_program=$withval +else + with_strip_program=no +fi; + echo "$as_me:3415: result: $with_strip_program" >&5 +echo "${ECHO_T}$with_strip_program" >&6 + if test "$with_strip_program" != no + then + echo "$as_me:3419: checking if strip-program is supported with this installer" >&5 +echo $ECHO_N "checking if strip-program is supported with this installer... $ECHO_C" >&6 + cf_install_program=`echo "$INSTALL" | sed -e 's%[ ]*[ ]-.%%'` + check_install_strip=no + if test -f "$cf_install_program" + then + check_install_version=`"$cf_install_program" --version 2>/dev/null | head -n 1 | grep coreutils` + if test -n "$check_install_version" + then + check_install_strip="option" + else + for check_strip_variable in STRIPBIN STRIP + do + if strings "$cf_install_program" | grep "^$check_strip_variable$" >/dev/null + then + check_install_strip="environ" + break + fi + done + fi + fi + echo "$as_me:3440: result: $check_install_strip" >&5 +echo "${ECHO_T}$check_install_strip" >&6 + case "$check_install_strip" in + (no) + { echo "$as_me:3444: WARNING: $cf_install_program does not support strip program option" >&5 +echo "$as_me: WARNING: $cf_install_program does not support strip program option" >&2;} + with_strip_program=no + ;; + (environ) + cat >install.tmp <<-CF_EOF + #! $SHELL + STRIPBIN="$with_strip_program" \\ + STRIP="$with_strip_program" \\ + $INSTALL "$@" + CF_EOF + INSTALL="`pwd`/install.tmp" + chmod +x "$INSTALL" + test -n "$verbose" && echo " created $INSTALL" 1>&6 + +echo "${as_me:-configure}:3459: testing created $INSTALL ..." 1>&5 + + ;; + (option) + INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" + ;; + esac + fi +fi + +echo "$as_me:3469: checking for long file names" >&5 +echo $ECHO_N "checking for long file names... $ECHO_C" >&6 +if test "${ac_cv_sys_long_file_names+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_sys_long_file_names=yes +# Test for long file names in all the places we know might matter: +# . the current directory, where building will happen +# $prefix/lib where we will be installing things +# $exec_prefix/lib likewise +# eval it to expand exec_prefix. +# $TMPDIR if set, where it might want to write temporary files +# if $TMPDIR is not set: +# /tmp where it might want to write temporary files +# /var/tmp likewise +# /usr/tmp likewise +if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then + ac_tmpdirs=$TMPDIR +else + ac_tmpdirs='/tmp /var/tmp /usr/tmp' +fi +for ac_dir in . $ac_tmpdirs `eval echo "$prefix/lib" "$exec_prefix/lib"` ; do + test -d "$ac_dir" || continue + test -w "$ac_dir" || continue # It is less confusing to not echo anything here. + ac_xdir=$ac_dir/cf$$ + (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue + ac_tf1=$ac_xdir/conftest9012345 + ac_tf2=$ac_xdir/conftest9012346 + (echo 1 >"$ac_tf1") 2>/dev/null + (echo 2 >"$ac_tf2") 2>/dev/null + ac_val=`cat "$ac_tf1" 2>/dev/null` + if test ! -f "$ac_tf1" || test "$ac_val" != 1; then + ac_cv_sys_long_file_names=no + rm -rf "$ac_xdir" 2>/dev/null + break + fi + rm -rf "$ac_xdir" 2>/dev/null +done +fi +echo "$as_me:3508: result: $ac_cv_sys_long_file_names" >&5 +echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6 +if test "$ac_cv_sys_long_file_names" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LONG_FILE_NAMES 1 +EOF + +fi + +# if we find pkg-config, check if we should install the ".pc" files. + +echo "$as_me:3520: checking if you want to use pkg-config" >&5 +echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6 + +# Check whether --with-pkg-config or --without-pkg-config was given. +if test "${with_pkg_config+set}" = set; then + withval="$with_pkg_config" + cf_pkg_config=$withval +else + cf_pkg_config=yes +fi; +echo "$as_me:3530: result: $cf_pkg_config" >&5 +echo "${ECHO_T}$cf_pkg_config" >&6 + +case "$cf_pkg_config" in +(no) + PKG_CONFIG=none + ;; +(yes) + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +echo "$as_me:3542: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:3559: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG + +if test -n "$PKG_CONFIG"; then + echo "$as_me:3570: result: $PKG_CONFIG" >&5 +echo "${ECHO_T}$PKG_CONFIG" >&6 +else + echo "$as_me:3573: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:3582: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:3599: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none" + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG + +if test -n "$ac_pt_PKG_CONFIG"; then + echo "$as_me:3611: result: $ac_pt_PKG_CONFIG" >&5 +echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 +else + echo "$as_me:3614: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + PKG_CONFIG=$ac_pt_PKG_CONFIG +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$PKG_CONFIG" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval PKG_CONFIG="$PKG_CONFIG" + case "x$PKG_CONFIG" in + (xNONE/*) + PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:3655: error: expected a pathname, not \"$PKG_CONFIG\"" >&5 +echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +elif test "x$cf_pkg_config" != xno ; then + { echo "$as_me:3662: WARNING: pkg-config is not installed" >&5 +echo "$as_me: WARNING: pkg-config is not installed" >&2;} +fi + +case "$PKG_CONFIG" in +(no|none|yes) + echo "$as_me:3668: checking for pkg-config library directory" >&5 +echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6 + ;; +(*) + echo "$as_me:3672: checking for $PKG_CONFIG library directory" >&5 +echo $ECHO_N "checking for $PKG_CONFIG library directory... $ECHO_C" >&6 + ;; +esac + +# if $PKG_CONFIG_LIBDIR is set, try to use that +if test -n "$PKG_CONFIG_PATH"; then + cf_search_path=`echo "$PKG_CONFIG_PATH" | sed -e 's/:/ /g' -e 's,^[ ]*,,' -e 's,[ ]*$,,'` +elif test -n "$PKG_CONFIG_LIBDIR"; then + cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[ ]*,,' -e 's,[ ]*$,,'` +else + cf_search_path=auto +fi + +# if the option is used, let that override. otherwise default to "libdir" + +# Check whether --with-pkg-config-libdir or --without-pkg-config-libdir was given. +if test "${with_pkg_config_libdir+set}" = set; then + withval="$with_pkg_config_libdir" + cf_search_path=$withval +else + test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir +fi; + +case "x$cf_search_path" in +(xlibdir) + PKG_CONFIG_LIBDIR='${libdir}/pkgconfig' + echo "$as_me:3699: result: $PKG_CONFIG_LIBDIR" >&5 +echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 + cf_search_path= + ;; +(x) + ;; +(x$GLOB_FULLPATH_POSIX\ *|x$GLOB_FULLPATH_OTHER\ *) + PKG_CONFIG_LIBDIR= + ;; +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + PKG_CONFIG_LIBDIR="$cf_search_path" + echo "$as_me:3710: result: $PKG_CONFIG_LIBDIR" >&5 +echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 + cf_search_path= + ;; +(xyes|xauto) + echo "$as_me:3715: result: auto" >&5 +echo "${ECHO_T}auto" >&6 + cf_search_path= + # Look for the library directory using the same prefix as the executable + echo "$as_me:3719: checking for search-list" >&5 +echo $ECHO_N "checking for search-list... $ECHO_C" >&6 + if test "x$PKG_CONFIG" != xnone + then + # works for pkg-config since version 0.24 (2009) + # works for pkgconf since version 0.8.3 (2012) + for cf_pkg_program in \ + `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ + pkg-config \ + pkgconf + do + cf_raw_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null` + case "$cf_raw_search_path" in + (*\\*) + cf_search_path=`echo "$cf_raw_search_path" | tr ';' ' ' | tr '\' '/'` + ;; + (*/*) + cf_search_path=`echo "$cf_raw_search_path" | tr : ' '` + ;; + esac + test -n "$cf_search_path" && break + done + + # works for pkg-config since import in 2005 of original 2001 HP code. + test -z "$cf_search_path" && \ + cf_search_path=` + "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ +/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ + sub(\"^[^']*'\",\"\"); \ + sub(\"'.*\",\"\"); \ + printf \" %s\", \\$0; } \ +{ next; } \ +"` + fi + + echo "$as_me:3754: result: $cf_search_path" >&5 +echo "${ECHO_T}$cf_search_path" >&6 + ;; +(*) + { { echo "$as_me:3758: error: Unexpected option value: $cf_search_path" >&5 +echo "$as_me: error: Unexpected option value: $cf_search_path" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +if test -n "$cf_search_path" +then + echo "$as_me:3766: checking for first directory" >&5 +echo $ECHO_N "checking for first directory... $ECHO_C" >&6 + cf_pkg_config_path=none + for cf_config in $cf_search_path + do + if test -d "$cf_config" + then + cf_pkg_config_path=$cf_config + break + fi + done + echo "$as_me:3777: result: $cf_pkg_config_path" >&5 +echo "${ECHO_T}$cf_pkg_config_path" >&6 + + if test "x$cf_pkg_config_path" != xnone ; then + # limit this to the first directory found + PKG_CONFIG_LIBDIR="$cf_pkg_config_path" + fi + + if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path" + then + echo "$as_me:3787: checking for workaround" >&5 +echo $ECHO_N "checking for workaround... $ECHO_C" >&6 + if test "$prefix" = "NONE" ; then + cf_prefix="$ac_default_prefix" + else + cf_prefix="$prefix" + fi + eval cf_libdir=$libdir + cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"` + cf_backup= + for cf_config in $cf_search_path + do + case $cf_config in + $cf_libdir/pkgconfig) + PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig + break + ;; + *) + test -z "$cf_backup" && cf_backup=$cf_config + ;; + esac + done + test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup + echo "$as_me:3810: result: $PKG_CONFIG_LIBDIR" >&5 +echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 + fi +fi + +echo "$as_me:3815: checking if you want to build test-programs" >&5 +echo $ECHO_N "checking if you want to build test-programs... $ECHO_C" >&6 + +# Check whether --with-tests or --without-tests was given. +if test "${with_tests+set}" = set; then + withval="$with_tests" + cf_with_tests=$withval +else + cf_with_tests=yes +fi; +echo "$as_me:3825: result: $cf_with_tests" >&5 +echo "${ECHO_T}$cf_with_tests" >&6 + +echo "$as_me:3828: checking if we should assume mixed-case filenames" >&5 +echo $ECHO_N "checking if we should assume mixed-case filenames... $ECHO_C" >&6 + +# Check whether --enable-mixed-case or --disable-mixed-case was given. +if test "${enable_mixed_case+set}" = set; then + enableval="$enable_mixed_case" + enable_mixedcase=$enableval +else + enable_mixedcase=auto +fi; +echo "$as_me:3838: result: $enable_mixedcase" >&5 +echo "${ECHO_T}$enable_mixedcase" >&6 +if test "$enable_mixedcase" = "auto" ; then + +echo "$as_me:3842: checking if filesystem supports mixed-case filenames" >&5 +echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6 +if test "${cf_cv_mixedcase+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes ; then + case "$target_alias" in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi + +fi +echo "$as_me:3869: result: $cf_cv_mixedcase" >&5 +echo "${ECHO_T}$cf_cv_mixedcase" >&6 +test "$cf_cv_mixedcase" = yes && +cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + +else + cf_cv_mixedcase=$enable_mixedcase + if test "$enable_mixedcase" = "yes" ; then + cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + + fi +fi + +# do this after mixed-case option (tags/TAGS is not as important as tic). +echo "$as_me:3887: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:3907: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:3911: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +echo "$as_me:3916: checking for \".PHONY\" make-support" >&5 +echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6 +if test "${cf_cv_make_PHONY+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -rf conftest* + ( + mkdir conftest || exit 1 + cd conftest + cat >makefile <<'CF_EOF' +.PHONY: always +DATA=0 +always: always.out + @echo "** making $@ $(DATA)" +once: once.out + @echo "** making $@ $(DATA)" +always.out: + @echo "** making $@ $(DATA)" + echo $(DATA) > $@ +once.out: + @echo "** making $@ $(DATA)" + echo $(DATA) > $@ +CF_EOF + for cf_data in 1 2 3 + do + ${MAKE:-make} always DATA=$cf_data + ${MAKE:-make} once DATA=$cf_data + ${MAKE:-make} -t always once + if test -f always ; then + echo "no (case 1)" > ../conftest.tmp + elif test ! -f always.out ; then + echo "no (case 2)" > ../conftest.tmp + elif test ! -f once.out ; then + echo "no (case 3)" > ../conftest.tmp + elif ! cmp -s always.out once.out ; then + echo "no (case 4)" > ../conftest.tmp + diff always.out once.out + else + cf_check="`cat always.out`" + if test "x$cf_check" != "x$cf_data" ; then + echo "no (case 5)" > ../conftest.tmp + else + echo yes > ../conftest.tmp + rm -f ./*.out + continue + fi + fi + break + done + ) >&5 2>&1 + cf_cv_make_PHONY="`cat conftest.tmp`" + rm -rf conftest* + +fi +echo "$as_me:3971: result: $cf_cv_make_PHONY" >&5 +echo "${ECHO_T}$cf_cv_make_PHONY" >&6 +MAKE_NO_PHONY="#" +MAKE_PHONY="#" +test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY= +test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY= + +for ac_prog in exctags ctags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3982: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CTAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CTAGS"; then + ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CTAGS="$ac_prog" +echo "$as_me:3997: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CTAGS=$ac_cv_prog_CTAGS +if test -n "$CTAGS"; then + echo "$as_me:4005: result: $CTAGS" >&5 +echo "${ECHO_T}$CTAGS" >&6 +else + echo "$as_me:4008: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CTAGS" && break +done + +for ac_prog in exetags etags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:4019: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ETAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ETAGS"; then + ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ETAGS="$ac_prog" +echo "$as_me:4034: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ETAGS=$ac_cv_prog_ETAGS +if test -n "$ETAGS"; then + echo "$as_me:4042: result: $ETAGS" >&5 +echo "${ECHO_T}$ETAGS" >&6 +else + echo "$as_me:4045: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ETAGS" && break +done + +# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args. +set dummy ${CTAGS:-ctags}; ac_word=$2 +echo "$as_me:4054: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_LOWER_TAGS"; then + ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_LOWER_TAGS="yes" +echo "$as_me:4069: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no" +fi +fi +MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS +if test -n "$MAKE_LOWER_TAGS"; then + echo "$as_me:4078: result: $MAKE_LOWER_TAGS" >&5 +echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 +else + echo "$as_me:4081: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cf_cv_mixedcase" = yes ; then + # Extract the first word of "${ETAGS:-etags}", so it can be a program name with args. +set dummy ${ETAGS:-etags}; ac_word=$2 +echo "$as_me:4088: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_UPPER_TAGS"; then + ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_UPPER_TAGS="yes" +echo "$as_me:4103: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no" +fi +fi +MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS +if test -n "$MAKE_UPPER_TAGS"; then + echo "$as_me:4112: result: $MAKE_UPPER_TAGS" >&5 +echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 +else + echo "$as_me:4115: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +echo "$as_me:4135: checking for makeflags variable" >&5 +echo $ECHO_N "checking for makeflags variable... $ECHO_C" >&6 +if test "${cf_cv_makeflags+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_makeflags='' + for cf_option in '-${MAKEFLAGS}' '${MFLAGS}' + do + cat >cf_makeflags.tmp </dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[ ]*$,,'` + case "$cf_result" in + (.*k|.*kw) + cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`" + case "$cf_result" in + (.*CC=*) cf_cv_makeflags= + ;; + (*) cf_cv_makeflags=$cf_option + ;; + esac + break + ;; + (.-) + ;; + (*) + +echo "${as_me:-configure}:4165: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5 + + ;; + esac + done + rm -f cf_makeflags.tmp + +fi +echo "$as_me:4173: result: $cf_cv_makeflags" >&5 +echo "${ECHO_T}$cf_cv_makeflags" >&6 + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:4179: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +echo "$as_me:4194: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:4202: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:4205: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:4214: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_RANLIB="ranlib" +echo "$as_me:4229: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="':'" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:4238: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:4241: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. +set dummy ${ac_tool_prefix}ld; ac_word=$2 +echo "$as_me:4253: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LD"; then + ac_cv_prog_LD="$LD" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LD="${ac_tool_prefix}ld" +echo "$as_me:4268: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LD=$ac_cv_prog_LD +if test -n "$LD"; then + echo "$as_me:4276: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:4279: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_LD"; then + ac_ct_LD=$LD + # Extract the first word of "ld", so it can be a program name with args. +set dummy ld; ac_word=$2 +echo "$as_me:4288: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_LD"; then + ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_LD="ld" +echo "$as_me:4303: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_LD" && ac_cv_prog_ac_ct_LD="ld" +fi +fi +ac_ct_LD=$ac_cv_prog_ac_ct_LD +if test -n "$ac_ct_LD"; then + echo "$as_me:4312: result: $ac_ct_LD" >&5 +echo "${ECHO_T}$ac_ct_LD" >&6 +else + echo "$as_me:4315: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + LD=$ac_ct_LD +else + LD="$ac_cv_prog_LD" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:4327: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AR="${ac_tool_prefix}ar" +echo "$as_me:4342: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:4350: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:4353: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:4362: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_AR="ar" +echo "$as_me:4377: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:4386: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:4389: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:4401: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AR="${ac_tool_prefix}ar" +echo "$as_me:4416: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:4424: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:4427: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:4436: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_AR="ar" +echo "$as_me:4451: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:4460: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:4463: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +echo "$as_me:4472: checking for options to update archives" >&5 +echo $ECHO_N "checking for options to update archives... $ECHO_C" >&6 +if test "${cf_cv_ar_flags+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + case "$cf_cv_system_name" in + (*-msvc*) + cf_cv_ar_flags='' + cat >mk_static_lib.sh <<-EOF + #!$SHELL + MSVC_BIN="$AR" + out="\$1" + shift + exec \$MSVC_BIN -out:"\$out" \$@ + EOF + chmod +x mk_static_lib.sh + AR=`pwd`/mk_static_lib.sh + ;; + (*) + cf_cv_ar_flags=unknown + for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv + do + + # check if $ARFLAGS already contains this choice + if test "x$ARFLAGS" != "x" ; then + cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"` + if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then + cf_cv_ar_flags= + break + fi + fi + + rm -f "conftest.$ac_cv_objext" + rm -f conftest.a + + cat >"conftest.$ac_ext" <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4515: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&5 + $AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&5 1>/dev/null + if test -f conftest.a ; then + cf_cv_ar_flags="$cf_ar_flags" + break + fi + else + test -n "$verbose" && echo " cannot compile test-program" 1>&6 + +echo "${as_me:-configure}:4526: testing cannot compile test-program ..." 1>&5 + + break + fi + done + rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext" + ;; + esac + +fi +echo "$as_me:4536: result: $cf_cv_ar_flags" >&5 +echo "${ECHO_T}$cf_cv_ar_flags" >&6 + +if test -n "$ARFLAGS" ; then + if test -n "$cf_cv_ar_flags" ; then + ARFLAGS="$ARFLAGS $cf_cv_ar_flags" + fi +else + ARFLAGS=$cf_cv_ar_flags +fi + + echo "$as_me:4547: checking for PATH separator" >&5 +echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6 + case "$cf_cv_system_name" in + (os2*) PATH_SEPARATOR=';' ;; + (*) ${PATH_SEPARATOR:=':'} ;; + esac + + echo "$as_me:4554: result: $PATH_SEPARATOR" >&5 +echo "${ECHO_T}$PATH_SEPARATOR" >&6 + +echo "$as_me:4557: checking for an installation directory prefix" >&5 +echo $ECHO_N "checking for an installation directory prefix... $ECHO_C" >&6 + +# Check whether --with-install-prefix or --without-install-prefix was given. +if test "${with_install_prefix+set}" = set; then + withval="$with_install_prefix" + case "x$withval" in + (xyes|xno) + ;; + (*) DESTDIR="$withval" + ;; + esac +fi; +echo "$as_me:4570: result: ${DESTDIR:-(none)}" >&5 +echo "${ECHO_T}${DESTDIR:-(none)}" >&6 + +echo "$as_me:4573: checking if installation directory prefix should be merged" >&5 +echo $ECHO_N "checking if installation directory prefix should be merged... $ECHO_C" >&6 + +# Check whether --enable-install-prefix or --disable-install-prefix was given. +if test "${enable_install_prefix+set}" = set; then + enableval="$enable_install_prefix" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + cf_install_prefix=yes + else + cf_install_prefix=no + fi +else + enableval=no + cf_install_prefix=no + +fi; +echo "$as_me:4590: result: $cf_install_prefix" >&5 +echo "${ECHO_T}$cf_install_prefix" >&6 + +if test "$cf_install_prefix" = yes ; then + MERGE_PREFIX=':$(prefix)%=%' +else + MERGE_PREFIX='' +fi + +############################################################################### + +# If we're cross-compiling, allow the user to override the tools and their +# options. The configure script is oriented toward identifying the host +# compiler, etc., but we need a build compiler to generate parts of the source. + +if test "$cross_compiling" = yes ; then + + # defaults that we might want to override + : ${BUILD_CFLAGS:=''} + : ${BUILD_CPPFLAGS:=''} + : ${BUILD_LDFLAGS:=''} + : ${BUILD_LIBS:=''} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} + +# Check whether --with-build-cc or --without-build-cc was given. +if test "${with_build_cc+set}" = set; then + withval="$with_build_cc" + BUILD_CC="$withval" +else + for ac_prog in gcc clang c99 c89 cc cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:4624: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_BUILD_CC="$ac_prog" +echo "$as_me:4639: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + echo "$as_me:4647: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 +else + echo "$as_me:4650: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$BUILD_CC" && break +done +test -n "$BUILD_CC" || BUILD_CC="none" + +fi; + echo "$as_me:4659: checking for native build C compiler" >&5 +echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6 + echo "$as_me:4661: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 + + echo "$as_me:4664: checking for native build C preprocessor" >&5 +echo $ECHO_N "checking for native build C preprocessor... $ECHO_C" >&6 + +# Check whether --with-build-cpp or --without-build-cpp was given. +if test "${with_build_cpp+set}" = set; then + withval="$with_build_cpp" + BUILD_CPP="$withval" +else + BUILD_CPP='${BUILD_CC} -E' +fi; + echo "$as_me:4674: result: $BUILD_CPP" >&5 +echo "${ECHO_T}$BUILD_CPP" >&6 + + echo "$as_me:4677: checking for native build C flags" >&5 +echo $ECHO_N "checking for native build C flags... $ECHO_C" >&6 + +# Check whether --with-build-cflags or --without-build-cflags was given. +if test "${with_build_cflags+set}" = set; then + withval="$with_build_cflags" + BUILD_CFLAGS="$withval" +fi; + echo "$as_me:4685: result: $BUILD_CFLAGS" >&5 +echo "${ECHO_T}$BUILD_CFLAGS" >&6 + + echo "$as_me:4688: checking for native build C preprocessor-flags" >&5 +echo $ECHO_N "checking for native build C preprocessor-flags... $ECHO_C" >&6 + +# Check whether --with-build-cppflags or --without-build-cppflags was given. +if test "${with_build_cppflags+set}" = set; then + withval="$with_build_cppflags" + BUILD_CPPFLAGS="$withval" +fi; + echo "$as_me:4696: result: $BUILD_CPPFLAGS" >&5 +echo "${ECHO_T}$BUILD_CPPFLAGS" >&6 + + echo "$as_me:4699: checking for native build linker-flags" >&5 +echo $ECHO_N "checking for native build linker-flags... $ECHO_C" >&6 + +# Check whether --with-build-ldflags or --without-build-ldflags was given. +if test "${with_build_ldflags+set}" = set; then + withval="$with_build_ldflags" + BUILD_LDFLAGS="$withval" +fi; + echo "$as_me:4707: result: $BUILD_LDFLAGS" >&5 +echo "${ECHO_T}$BUILD_LDFLAGS" >&6 + + echo "$as_me:4710: checking for native build linker-libraries" >&5 +echo $ECHO_N "checking for native build linker-libraries... $ECHO_C" >&6 + +# Check whether --with-build-libs or --without-build-libs was given. +if test "${with_build_libs+set}" = set; then + withval="$with_build_libs" + BUILD_LIBS="$withval" +fi; + echo "$as_me:4718: result: $BUILD_LIBS" >&5 +echo "${ECHO_T}$BUILD_LIBS" >&6 + + # this assumes we're on Unix. + BUILD_EXEEXT= + BUILD_OBJEXT=o + + : ${BUILD_CC:='${CC}'} + + echo "$as_me:4727: checking if the build-compiler \"$BUILD_CC\" works" >&5 +echo $ECHO_N "checking if the build-compiler \"$BUILD_CC\" works... $ECHO_C" >&6 + + cf_save_crossed=$cross_compiling + cf_save_ac_link=$ac_link + cross_compiling=no + cf_build_cppflags=$BUILD_CPPFLAGS + test "$cf_build_cppflags" = "#" && cf_build_cppflags= + ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $cf_build_cppflags $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&5' + + if test "$cross_compiling" = yes; then + cf_ok_build_cc=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 4741 "configure" +#include "confdefs.h" +#include + int main(int argc, char *argv[]) + { + ${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0); + } + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:4751: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4754: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:4756: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4759: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_ok_build_cc=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_ok_build_cc=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + + cross_compiling=$cf_save_crossed + ac_link=$cf_save_ac_link + + echo "$as_me:4774: result: $cf_ok_build_cc" >&5 +echo "${ECHO_T}$cf_ok_build_cc" >&6 + + if test "$cf_ok_build_cc" != yes + then + { { echo "$as_me:4779: error: Cross-build requires two compilers. +Use --with-build-cc to specify the native compiler." >&5 +echo "$as_me: error: Cross-build requires two compilers. +Use --with-build-cc to specify the native compiler." >&2;} + { (exit 1); exit 1; }; } + fi + +else + : ${BUILD_CC:='${CC}'} + : ${BUILD_CPP:='${CPP}'} + : ${BUILD_CFLAGS:='${CFLAGS}'} + : ${BUILD_CPPFLAGS:='${CPPFLAGS}'} + : ${BUILD_LDFLAGS:='${LDFLAGS}'} + : ${BUILD_LIBS:='${LIBS}'} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} +fi + +############################################################################### + +### Options to allow the user to specify the set of libraries which are used. +### Use "--without-normal --with-shared" to allow the default model to be +### shared, for example. +cf_list_models="" + +echo "$as_me:4804: checking if you want to build shared C-objects" >&5 +echo $ECHO_N "checking if you want to build shared C-objects... $ECHO_C" >&6 + +# Check whether --with-shared or --without-shared was given. +if test "${with_shared+set}" = set; then + withval="$with_shared" + with_shared=$withval +else + with_shared=no +fi; +echo "$as_me:4814: result: $with_shared" >&5 +echo "${ECHO_T}$with_shared" >&6 +test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared" + +echo "$as_me:4818: checking for specified models" >&5 +echo $ECHO_N "checking for specified models... $ECHO_C" >&6 +test -z "$cf_list_models" && cf_list_models=normal +echo "$as_me:4821: result: $cf_list_models" >&5 +echo "${ECHO_T}$cf_list_models" >&6 + +### Use the first model as the default, and save its suffix for use in building +### up test-applications. +echo "$as_me:4826: checking for default model" >&5 +echo $ECHO_N "checking for default model... $ECHO_C" >&6 +DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'` +echo "$as_me:4829: result: $DFT_LWR_MODEL" >&5 +echo "${ECHO_T}$DFT_LWR_MODEL" >&6 + +DFT_UPR_MODEL=`echo "$DFT_LWR_MODEL" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +echo "$as_me:4834: checking for specific curses-directory" >&5 +echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6 + +# Check whether --with-curses-dir or --without-curses-dir was given. +if test "${with_curses_dir+set}" = set; then + withval="$with_curses_dir" + cf_cv_curses_dir=$withval +else + cf_cv_curses_dir=no +fi; +echo "$as_me:4844: result: $cf_cv_curses_dir" >&5 +echo "${ECHO_T}$cf_cv_curses_dir" >&6 + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:4873: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + if test -d "$cf_cv_curses_dir" + then + +if test -n "$cf_cv_curses_dir/include" ; then + for cf_add_incdir in $cf_cv_curses_dir/include + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4909 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4921: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4924: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4927: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4930: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:4947: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +if test -n "$cf_cv_curses_dir/lib" ; then + for cf_add_libdir in $cf_cv_curses_dir/lib + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:4983: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + fi +fi + +cf_ncuconfig_root=ncurses +cf_have_ncuconfig=no + +if test "x${PKG_CONFIG:=none}" != xnone; then + echo "$as_me:4998: checking pkg-config for $cf_ncuconfig_root" >&5 +echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + echo "$as_me:5001: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:5004: checking if the $cf_ncuconfig_root package files work" >&5 +echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6 + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[89]9@@*-W*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkg_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5137 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:5149: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5152: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:5155: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5158: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_test_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 5164 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:5171: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5174: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:5176: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5179: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_test_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + +for cf_add_cflags in $cf_pkg_cflags +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5353 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:5365: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5368: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:5371: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5374: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 5380 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:5387: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5390: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:5392: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5395: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:5412: result: $cf_have_ncuconfig" >&5 +echo "${ECHO_T}$cf_have_ncuconfig" >&6 + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + +echo "$as_me:5428: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 5446 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5461: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5464: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5467: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5470: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:5486: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + + fi + + else + echo "$as_me:5521: result: no" >&5 +echo "${ECHO_T}no" >&6 + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + +if test -n "$ac_tool_prefix"; then + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:5537: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NCURSES_CONFIG"; then + ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog" +echo "$as_me:5552: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG +if test -n "$NCURSES_CONFIG"; then + echo "$as_me:5560: result: $NCURSES_CONFIG" >&5 +echo "${ECHO_T}$NCURSES_CONFIG" >&6 +else + echo "$as_me:5563: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$NCURSES_CONFIG" && break + done +fi +if test -z "$NCURSES_CONFIG"; then + ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:5576: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_NCURSES_CONFIG"; then + ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog" +echo "$as_me:5591: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG +if test -n "$ac_ct_NCURSES_CONFIG"; then + echo "$as_me:5599: result: $ac_ct_NCURSES_CONFIG" >&5 +echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 +else + echo "$as_me:5602: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_NCURSES_CONFIG" && break +done +test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none" + + NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG +fi + + if test "$NCURSES_CONFIG" != none ; then + +for cf_add_cflags in `$NCURSES_CONFIG --cflags` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + # even with config script, some packages use no-override for curses.h + +echo "$as_me:5759: checking if we have identified curses headers" >&5 +echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 +if test "${cf_cv_ncurses_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h ncurses/ncurses.h \ + curses.h ncurses/curses.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 5771 "configure" +#include "confdefs.h" +#include <${cf_header}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5783: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5786: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5789: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5792: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_header=$cf_header; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:5803: result: $cf_cv_ncurses_header" >&5 +echo "${ECHO_T}$cf_cv_ncurses_header" >&6 + +if test "$cf_cv_ncurses_header" = none ; then + { { echo "$as_me:5807: error: No curses header-files found" >&5 +echo "$as_me: error: No curses header-files found" >&2;} + { (exit 1); exit 1; }; } +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. + +for ac_header in $cf_cv_ncurses_header +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:5817: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 5823 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:5827: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:5833: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:5852: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF +#line 5908 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5920: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5923: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5926: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5929: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:5946: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +} + +echo "$as_me:5965: checking for $cf_ncuhdr_root header in include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5977 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6001: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6004: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6007: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6010: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + test "$cf_cv_ncurses_h" != no && break + done + +fi +echo "$as_me:6025: result: $cf_cv_ncurses_h" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h" >&6 + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +echo "$as_me:6032: checking for $cf_ncuhdr_root include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$verbose" && echo + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root" + test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root" + test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root" +} + +cf_search="$cf_search $cf_header_path_list" + + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + +if test -n "$cf_incdir" ; then + for cf_add_incdir in $cf_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 6153 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6165: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6168: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6171: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6174: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:6191: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + + for cf_header in \ + ncurses.h \ + curses.h + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 6214 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6238: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6241: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6244: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6247: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h2=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h2=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6 + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6 + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:6268: error: not found" >&5 +echo "$as_me: error: not found" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:6273: result: $cf_cv_ncurses_h2" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h2" >&6 + + cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'` + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + +if test -n "$cf_1st_incdir" ; then + for cf_add_incdir in $cf_1st_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 6309 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6321: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6324: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6327: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6330: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:6347: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_H 1 +EOF + + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_NCURSES_H 1 +EOF + + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_NCURSES_H 1 +EOF + + ;; +esac + +echo "$as_me:6395: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 6413 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6428: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6431: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6434: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6437: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:6453: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +# some applications need this, but should check for NCURSES_VERSION + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +echo "$as_me:6491: checking for ncurses version" >&5 +echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6 +if test "${cf_cv_ncurses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + if test "$cross_compiling" = yes; then + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out" + { (eval echo "$as_me:6517: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:6520: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6530 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:6557: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6560: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:6562: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6565: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_ncurses_version=`cat $cf_tempfile` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f "$cf_tempfile" + +fi +echo "$as_me:6579: result: $cf_cv_ncurses_version" >&5 +echo "${ECHO_T}$cf_cv_ncurses_version" >&6 +test "$cf_cv_ncurses_version" = no || +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_root=ncurses + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +echo "$as_me:6592: checking for Gpm_Open in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 6600 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Open (void); +int +main (void) +{ +Gpm_Open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6619: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6622: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6625: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6628: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:6639: result: $ac_cv_lib_gpm_Gpm_Open" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6 +if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then + echo "$as_me:6642: checking for initscr in -lgpm" >&5 +echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 6650 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6669: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6672: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6675: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6678: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:6689: result: $ac_cv_lib_gpm_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6 +if test "$ac_cv_lib_gpm_initscr" = yes; then + LIBS="$cf_ncurses_SAVE" +else + cf_ncurses_LIBS="-lgpm" +fi + +fi + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + echo "$as_me:6704: checking for tgoto in -lmytinfo" >&5 +echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6 +if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmytinfo $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 6712 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6731: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6734: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6737: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6740: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_mytinfo_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_mytinfo_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:6751: result: $ac_cv_lib_mytinfo_tgoto" >&5 +echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6 +if test "$ac_cv_lib_mytinfo_tgoto" = yes; then + cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS" +fi + + fi + ;; +esac + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no' + cf_libdir="" + echo "$as_me:6800: checking for initscr" >&5 +echo $ECHO_N "checking for initscr... $ECHO_C" >&6 +if test "${ac_cv_func_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6806 "configure" +#include "confdefs.h" +#define initscr autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef initscr + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_initscr) || defined (__stub___initscr) +#error found stub for initscr +#endif + + return initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6837: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6840: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6843: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6846: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:6856: result: $ac_cv_func_initscr" >&5 +echo "${ECHO_T}$ac_cv_func_initscr" >&6 +if test "$ac_cv_func_initscr" = yes; then + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' +else + + cf_save_LIBS="$LIBS" + echo "$as_me:6863: checking for initscr in -l$cf_nculib_root" >&5 +echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6 + LIBS="-l$cf_nculib_root $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 6867 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6879: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6882: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6885: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6888: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:6890: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:6897: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root" + test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root" + test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_libdir in $cf_search + do + echo "$as_me:6965: checking for -l$cf_nculib_root in $cf_libdir" >&5 +echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6 + LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 6969 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6981: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6984: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6987: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6990: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:6992: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:6999: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_save_LIBS" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi + +eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\" + +if test "$cf_found_library" = no ; then + { { echo "$as_me:7014: error: Cannot link $cf_nculib_root library" >&5 +echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +if test -n "$cf_ncurses_LIBS" ; then + echo "$as_me:7022: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5 +echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6 + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + cat >"conftest.$ac_ext" <<_ACEOF +#line 7032 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7044: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7047: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7050: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7053: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:7055: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:7060: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_ncurses_SAVE" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for specified curses library type... $ECHO_C" >&6 + +# Check whether --with-screen or --without-screen was given. +if test "${with_screen+set}" = set; then + withval="$with_screen" + cf_cv_screen=$withval +else + cf_cv_screen=ncurses +fi; + +case $cf_cv_screen in +(curses|curses_*) + CF_CURSES_CONFIG + ;; +(ncursesw*) + +for ac_header in wchar.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:7098: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7104 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:7108: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:7114: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:7133: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6 +if test "${cf_cv_utf8_lib+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LIBS="$LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 7151 "configure" +#include "confdefs.h" + +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif + +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7168: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7171: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7174: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7177: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_utf8_lib=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these +# will be set on completion of the AC_TRY_LINK below. +cf_cv_header_path_utf8= +cf_cv_library_path_utf8= + +echo "${as_me:-configure}:7189: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5 + +cf_save_LIBS="$LIBS" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 7194 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7207: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7210: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7213: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7216: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_find_linkage_utf8=yes + cf_cv_header_path_utf8=/usr/include + cf_cv_library_path_utf8=/usr/lib + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +LIBS="-lutf8 $cf_save_LIBS" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 7230 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7243: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7246: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7249: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7252: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_find_linkage_utf8=yes + cf_cv_header_path_utf8=/usr/include + cf_cv_library_path_utf8=/usr/lib + cf_cv_library_file_utf8="-lutf8" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_find_linkage_utf8=no + LIBS="$cf_save_LIBS" + + test -n "$verbose" && echo " find linkage for utf8 library" 1>&6 + +echo "${as_me:-configure}:7269: testing find linkage for utf8 library ..." 1>&5 + +echo "${as_me:-configure}:7271: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5 + + cf_save_CPPFLAGS="$CPPFLAGS" + cf_test_CPPFLAGS="$CPPFLAGS" + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/utf8" && cf_search="$cf_search $cf_header_path/include/utf8" + test -d "$cf_header_path/include/utf8/include" && cf_search="$cf_search $cf_header_path/include/utf8/include" + test -d "$cf_header_path/utf8/include" && cf_search="$cf_search $cf_header_path/utf8/include" + test -d "$cf_header_path/utf8/include/utf8" && cf_search="$cf_search $cf_header_path/utf8/include/utf8" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/utf8" && cf_search="$cf_search $prefix/include/utf8" + test -d "$prefix/include/utf8/include" && cf_search="$cf_search $prefix/include/utf8/include" + test -d "$prefix/utf8/include" && cf_search="$cf_search $prefix/utf8/include" + test -d "$prefix/utf8/include/utf8" && cf_search="$cf_search $prefix/utf8/include/utf8" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/include/utf8" + test -d "$cf_subdir_prefix/include/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/include/utf8/include" + test -d "$cf_subdir_prefix/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/utf8/include" + test -d "$cf_subdir_prefix/utf8/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8" +} + +cf_search="$cf_search $cf_header_path_list" + + for cf_cv_header_path_utf8 in $cf_search + do + if test -d "$cf_cv_header_path_utf8" ; then + test -n "$verbose" && echo " ... testing $cf_cv_header_path_utf8" 1>&6 + +echo "${as_me:-configure}:7362: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 7370 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:7383: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7386: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:7389: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7392: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " ... found utf8 headers in $cf_cv_header_path_utf8" 1>&6 + +echo "${as_me:-configure}:7397: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5 + + cf_cv_find_linkage_utf8=maybe + cf_test_CPPFLAGS="$CPPFLAGS" + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + done + + if test "$cf_cv_find_linkage_utf8" = maybe ; then + +echo "${as_me:-configure}:7415: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5 + + cf_save_LIBS="$LIBS" + cf_save_LDFLAGS="$LDFLAGS" + + if test "$cf_cv_find_linkage_utf8" != yes ; then + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/utf8" && cf_search="$cf_search $cf_library_path/lib/utf8" + test -d "$cf_library_path/lib/utf8/lib" && cf_search="$cf_search $cf_library_path/lib/utf8/lib" + test -d "$cf_library_path/utf8/lib" && cf_search="$cf_search $cf_library_path/utf8/lib" + test -d "$cf_library_path/utf8/lib/utf8" && cf_search="$cf_search $cf_library_path/utf8/lib/utf8" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/utf8" && cf_search="$cf_search $prefix/lib/utf8" + test -d "$prefix/lib/utf8/lib" && cf_search="$cf_search $prefix/lib/utf8/lib" + test -d "$prefix/utf8/lib" && cf_search="$cf_search $prefix/utf8/lib" + test -d "$prefix/utf8/lib/utf8" && cf_search="$cf_search $prefix/utf8/lib/utf8" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8" + test -d "$cf_subdir_prefix/lib/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib" + test -d "$cf_subdir_prefix/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib" + test -d "$cf_subdir_prefix/utf8/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_cv_library_path_utf8 in $cf_search + do + if test -d "$cf_cv_library_path_utf8" ; then + test -n "$verbose" && echo " ... testing $cf_cv_library_path_utf8" 1>&6 + +echo "${as_me:-configure}:7490: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5 + + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-lutf8 $cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8" + cat >"conftest.$ac_ext" <<_ACEOF +#line 7496 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7509: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7512: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7515: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7518: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " ... found utf8 library in $cf_cv_library_path_utf8" 1>&6 + +echo "${as_me:-configure}:7523: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5 + + cf_cv_find_linkage_utf8=yes + cf_cv_library_file_utf8="-lutf8" + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + fi + done + CPPFLAGS="$cf_save_CPPFLAGS" + LDFLAGS="$cf_save_LDFLAGS" + fi + + else + cf_cv_find_linkage_utf8=no + fi + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +LIBS="$cf_save_LIBS" + +if test "$cf_cv_find_linkage_utf8" = yes ; then +cf_cv_utf8_lib=add-on +else +cf_cv_utf8_lib=no +fi + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:7565: result: $cf_cv_utf8_lib" >&5 +echo "${ECHO_T}$cf_cv_utf8_lib" >&6 + +# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between +# ncurses/ncursesw: +if test "$cf_cv_utf8_lib" = "add-on" ; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBUTF8_H 1 +EOF + +if test -n "$cf_cv_header_path_utf8" ; then + for cf_add_incdir in $cf_cv_header_path_utf8 + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 7603 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:7615: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7618: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:7621: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7624: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:7641: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +if test -n "$cf_cv_library_path_utf8" ; then + for cf_add_libdir in $cf_cv_library_path_utf8 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:7677: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +cf_ncuconfig_root=$cf_cv_screen +cf_have_ncuconfig=no + +if test "x${PKG_CONFIG:=none}" != xnone; then + echo "$as_me:7707: checking pkg-config for $cf_ncuconfig_root" >&5 +echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + echo "$as_me:7710: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:7713: checking if the $cf_ncuconfig_root package files work" >&5 +echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6 + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[89]9@@*-W*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkg_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 7846 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7858: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7861: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7864: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7867: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_test_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7873 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:7880: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7883: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:7885: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7888: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_test_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + +for cf_add_cflags in $cf_pkg_cflags +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8062 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8074: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8077: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8080: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8083: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 8089 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:8096: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8099: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:8101: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8104: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:8121: result: $cf_have_ncuconfig" >&5 +echo "${ECHO_T}$cf_have_ncuconfig" >&6 + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + +echo "$as_me:8137: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 8155 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8170: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8173: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8176: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8179: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:8195: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + + fi + + else + echo "$as_me:8230: result: no" >&5 +echo "${ECHO_T}no" >&6 + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + +if test -n "$ac_tool_prefix"; then + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:8246: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NCURSES_CONFIG"; then + ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog" +echo "$as_me:8261: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG +if test -n "$NCURSES_CONFIG"; then + echo "$as_me:8269: result: $NCURSES_CONFIG" >&5 +echo "${ECHO_T}$NCURSES_CONFIG" >&6 +else + echo "$as_me:8272: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$NCURSES_CONFIG" && break + done +fi +if test -z "$NCURSES_CONFIG"; then + ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:8285: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_NCURSES_CONFIG"; then + ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog" +echo "$as_me:8300: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG +if test -n "$ac_ct_NCURSES_CONFIG"; then + echo "$as_me:8308: result: $ac_ct_NCURSES_CONFIG" >&5 +echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 +else + echo "$as_me:8311: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_NCURSES_CONFIG" && break +done +test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none" + + NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG +fi + + if test "$NCURSES_CONFIG" != none ; then + +for cf_add_cflags in `$NCURSES_CONFIG --cflags` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + # even with config script, some packages use no-override for curses.h + +echo "$as_me:8468: checking if we have identified curses headers" >&5 +echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 +if test "${cf_cv_ncurses_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h $cf_cv_screen/ncurses.h \ + curses.h $cf_cv_screen/curses.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 8480 "configure" +#include "confdefs.h" +#include <${cf_header}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8492: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8495: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8498: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8501: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_header=$cf_header; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:8512: result: $cf_cv_ncurses_header" >&5 +echo "${ECHO_T}$cf_cv_ncurses_header" >&6 + +if test "$cf_cv_ncurses_header" = none ; then + { { echo "$as_me:8516: error: No curses header-files found" >&5 +echo "$as_me: error: No curses header-files found" >&2;} + { (exit 1); exit 1; }; } +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. + +for ac_header in $cf_cv_ncurses_header +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:8526: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 8532 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:8536: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:8542: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:8561: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF +#line 8617 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8629: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8632: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8635: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8638: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:8655: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +} + +echo "$as_me:8674: checking for $cf_ncuhdr_root header in include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8686 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8710: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8713: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8716: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8719: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + test "$cf_cv_ncurses_h" != no && break + done + +fi +echo "$as_me:8734: result: $cf_cv_ncurses_h" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h" >&6 + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +echo "$as_me:8741: checking for $cf_ncuhdr_root include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$verbose" && echo + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root" + test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root" + test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root" +} + +cf_search="$cf_search $cf_header_path_list" + + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + +if test -n "$cf_incdir" ; then + for cf_add_incdir in $cf_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8862 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8874: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8877: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8880: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8883: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:8900: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + + for cf_header in \ + ncurses.h \ + curses.h + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8923 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8947: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8950: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8953: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8956: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h2=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h2=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6 + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6 + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:8977: error: not found" >&5 +echo "$as_me: error: not found" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:8982: result: $cf_cv_ncurses_h2" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h2" >&6 + + cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'` + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + +if test -n "$cf_1st_incdir" ; then + for cf_add_incdir in $cf_1st_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 9018 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9030: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9033: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9036: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9039: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:9056: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_H 1 +EOF + + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_NCURSES_H 1 +EOF + + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_NCURSES_H 1 +EOF + + ;; +esac + +echo "$as_me:9104: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 9122 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9137: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9140: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9143: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9146: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:9162: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +# some applications need this, but should check for NCURSES_VERSION + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +echo "$as_me:9200: checking for ncurses version" >&5 +echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6 +if test "${cf_cv_ncurses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + if test "$cross_compiling" = yes; then + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out" + { (eval echo "$as_me:9226: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:9229: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 9239 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:9266: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9269: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:9271: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9274: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_ncurses_version=`cat $cf_tempfile` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f "$cf_tempfile" + +fi +echo "$as_me:9288: result: $cf_cv_ncurses_version" >&5 +echo "${ECHO_T}$cf_cv_ncurses_version" >&6 +test "$cf_cv_ncurses_version" = no || +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_root=$cf_cv_screen + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +echo "$as_me:9301: checking for Gpm_Open in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 9309 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Open (void); +int +main (void) +{ +Gpm_Open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9328: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9331: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9334: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9337: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9348: result: $ac_cv_lib_gpm_Gpm_Open" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6 +if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then + echo "$as_me:9351: checking for initscr in -lgpm" >&5 +echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 9359 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9378: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9381: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9384: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9387: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9398: result: $ac_cv_lib_gpm_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6 +if test "$ac_cv_lib_gpm_initscr" = yes; then + LIBS="$cf_ncurses_SAVE" +else + cf_ncurses_LIBS="-lgpm" +fi + +fi + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + echo "$as_me:9413: checking for tgoto in -lmytinfo" >&5 +echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6 +if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmytinfo $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 9421 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9440: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9443: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9446: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9449: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_mytinfo_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_mytinfo_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9460: result: $ac_cv_lib_mytinfo_tgoto" >&5 +echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6 +if test "$ac_cv_lib_mytinfo_tgoto" = yes; then + cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS" +fi + + fi + ;; +esac + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no' + cf_libdir="" + echo "$as_me:9509: checking for initscr" >&5 +echo $ECHO_N "checking for initscr... $ECHO_C" >&6 +if test "${ac_cv_func_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 9515 "configure" +#include "confdefs.h" +#define initscr autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef initscr + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_initscr) || defined (__stub___initscr) +#error found stub for initscr +#endif + + return initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9546: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9549: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9552: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9555: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:9565: result: $ac_cv_func_initscr" >&5 +echo "${ECHO_T}$ac_cv_func_initscr" >&6 +if test "$ac_cv_func_initscr" = yes; then + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' +else + + cf_save_LIBS="$LIBS" + echo "$as_me:9572: checking for initscr in -l$cf_nculib_root" >&5 +echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6 + LIBS="-l$cf_nculib_root $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 9576 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9588: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9591: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9594: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9597: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:9599: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:9606: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root" + test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root" + test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_libdir in $cf_search + do + echo "$as_me:9674: checking for -l$cf_nculib_root in $cf_libdir" >&5 +echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6 + LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 9678 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9690: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9693: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9696: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9699: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:9701: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:9708: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_save_LIBS" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi + +eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\" + +if test "$cf_found_library" = no ; then + { { echo "$as_me:9723: error: Cannot link $cf_nculib_root library" >&5 +echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +if test -n "$cf_ncurses_LIBS" ; then + echo "$as_me:9731: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5 +echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6 + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + cat >"conftest.$ac_ext" <<_ACEOF +#line 9741 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9753: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9756: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9759: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9762: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:9764: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:9769: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_ncurses_SAVE" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + echo "$as_me:9797: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:9800: checking if the $cf_ncuconfig_root package files work" >&5 +echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6 + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[89]9@@*-W*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkg_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 9933 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:9945: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9948: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9951: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9954: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_test_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 9960 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:9967: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9970: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:9972: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9975: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_test_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + +for cf_add_cflags in $cf_pkg_cflags +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 10149 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10161: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10164: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10167: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10170: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10176 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:10183: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10186: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:10188: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10191: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:10208: result: $cf_have_ncuconfig" >&5 +echo "${ECHO_T}$cf_have_ncuconfig" >&6 + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + +echo "$as_me:10224: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 10242 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10257: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10260: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10263: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10266: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:10282: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + + fi + + else + echo "$as_me:10317: result: no" >&5 +echo "${ECHO_T}no" >&6 + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + +if test -n "$ac_tool_prefix"; then + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:10333: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NCURSES_CONFIG"; then + ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog" +echo "$as_me:10348: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG +if test -n "$NCURSES_CONFIG"; then + echo "$as_me:10356: result: $NCURSES_CONFIG" >&5 +echo "${ECHO_T}$NCURSES_CONFIG" >&6 +else + echo "$as_me:10359: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$NCURSES_CONFIG" && break + done +fi +if test -z "$NCURSES_CONFIG"; then + ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:10372: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_NCURSES_CONFIG"; then + ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog" +echo "$as_me:10387: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG +if test -n "$ac_ct_NCURSES_CONFIG"; then + echo "$as_me:10395: result: $ac_ct_NCURSES_CONFIG" >&5 +echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 +else + echo "$as_me:10398: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_NCURSES_CONFIG" && break +done +test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none" + + NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG +fi + + if test "$NCURSES_CONFIG" != none ; then + +for cf_add_cflags in `$NCURSES_CONFIG --cflags` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + # even with config script, some packages use no-override for curses.h + +echo "$as_me:10555: checking if we have identified curses headers" >&5 +echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 +if test "${cf_cv_ncurses_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h $cf_cv_screen/ncurses.h \ + curses.h $cf_cv_screen/curses.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 10567 "configure" +#include "confdefs.h" +#include <${cf_header}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10579: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10582: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10585: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10588: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_header=$cf_header; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:10599: result: $cf_cv_ncurses_header" >&5 +echo "${ECHO_T}$cf_cv_ncurses_header" >&6 + +if test "$cf_cv_ncurses_header" = none ; then + { { echo "$as_me:10603: error: No curses header-files found" >&5 +echo "$as_me: error: No curses header-files found" >&2;} + { (exit 1); exit 1; }; } +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. + +for ac_header in $cf_cv_ncurses_header +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:10613: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10619 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:10623: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:10629: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:10648: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF +#line 10704 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10716: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10719: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10722: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10725: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:10742: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +} + +echo "$as_me:10761: checking for $cf_ncuhdr_root header in include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 10773 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10797: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10800: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10803: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10806: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + test "$cf_cv_ncurses_h" != no && break + done + +fi +echo "$as_me:10821: result: $cf_cv_ncurses_h" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h" >&6 + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +echo "$as_me:10828: checking for $cf_ncuhdr_root include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$verbose" && echo + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root" + test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root" + test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root" +} + +cf_search="$cf_search $cf_header_path_list" + + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + +if test -n "$cf_incdir" ; then + for cf_add_incdir in $cf_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 10949 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10961: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10964: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10967: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10970: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:10987: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + + for cf_header in \ + ncurses.h \ + curses.h + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11010 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11034: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11037: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11040: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11043: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h2=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h2=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6 + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6 + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:11064: error: not found" >&5 +echo "$as_me: error: not found" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:11069: result: $cf_cv_ncurses_h2" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h2" >&6 + + cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'` + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + +if test -n "$cf_1st_incdir" ; then + for cf_add_incdir in $cf_1st_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11105 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11117: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11120: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11123: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11126: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:11143: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_H 1 +EOF + + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_NCURSES_H 1 +EOF + + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_NCURSES_H 1 +EOF + + ;; +esac + +echo "$as_me:11191: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 11209 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11224: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11227: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11230: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11233: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:11249: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +# some applications need this, but should check for NCURSES_VERSION + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +echo "$as_me:11287: checking for ncurses version" >&5 +echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6 +if test "${cf_cv_ncurses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + if test "$cross_compiling" = yes; then + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out" + { (eval echo "$as_me:11313: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:11316: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 11326 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:11353: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11356: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:11358: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11361: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_ncurses_version=`cat $cf_tempfile` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f "$cf_tempfile" + +fi +echo "$as_me:11375: result: $cf_cv_ncurses_version" >&5 +echo "${ECHO_T}$cf_cv_ncurses_version" >&6 +test "$cf_cv_ncurses_version" = no || +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_root=$cf_cv_screen + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +echo "$as_me:11388: checking for Gpm_Open in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 11396 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Open (void); +int +main (void) +{ +Gpm_Open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11415: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11418: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11421: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11424: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:11435: result: $ac_cv_lib_gpm_Gpm_Open" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6 +if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then + echo "$as_me:11438: checking for initscr in -lgpm" >&5 +echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 11446 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11465: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11468: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11471: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11474: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:11485: result: $ac_cv_lib_gpm_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6 +if test "$ac_cv_lib_gpm_initscr" = yes; then + LIBS="$cf_ncurses_SAVE" +else + cf_ncurses_LIBS="-lgpm" +fi + +fi + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + echo "$as_me:11500: checking for tgoto in -lmytinfo" >&5 +echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6 +if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmytinfo $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 11508 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11527: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11530: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11533: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11536: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_mytinfo_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_mytinfo_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:11547: result: $ac_cv_lib_mytinfo_tgoto" >&5 +echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6 +if test "$ac_cv_lib_mytinfo_tgoto" = yes; then + cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS" +fi + + fi + ;; +esac + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no' + cf_libdir="" + echo "$as_me:11596: checking for initscr" >&5 +echo $ECHO_N "checking for initscr... $ECHO_C" >&6 +if test "${ac_cv_func_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 11602 "configure" +#include "confdefs.h" +#define initscr autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef initscr + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_initscr) || defined (__stub___initscr) +#error found stub for initscr +#endif + + return initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11633: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11636: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11639: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11642: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:11652: result: $ac_cv_func_initscr" >&5 +echo "${ECHO_T}$ac_cv_func_initscr" >&6 +if test "$ac_cv_func_initscr" = yes; then + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' +else + + cf_save_LIBS="$LIBS" + echo "$as_me:11659: checking for initscr in -l$cf_nculib_root" >&5 +echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6 + LIBS="-l$cf_nculib_root $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 11663 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11675: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11678: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11681: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11684: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:11686: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:11693: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root" + test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root" + test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_libdir in $cf_search + do + echo "$as_me:11761: checking for -l$cf_nculib_root in $cf_libdir" >&5 +echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6 + LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 11765 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11777: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11780: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11783: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11786: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:11788: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:11795: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_save_LIBS" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi + +eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\" + +if test "$cf_found_library" = no ; then + { { echo "$as_me:11810: error: Cannot link $cf_nculib_root library" >&5 +echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +if test -n "$cf_ncurses_LIBS" ; then + echo "$as_me:11818: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5 +echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6 + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + cat >"conftest.$ac_ext" <<_ACEOF +#line 11828 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11840: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11843: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11846: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11849: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:11851: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:11856: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_ncurses_SAVE" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo "$as_me: error: unexpected screen-value: $cf_cv_screen" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +if test "$NCURSES_CONFIG_PKG" != none ; then + cf_version=`$PKG_CONFIG --modversion $NCURSES_CONFIG_PKG 2>/dev/null` + + NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'` + NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.//' -e 's/\..*//'` + NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.//'` + + cf_cv_abi_version=`$PKG_CONFIG --variable=abi_version $NCURSES_CONFIG_PKG 2>/dev/null` + if test -z "$cf_cv_abi_version" + then + cf_cv_abi_version=`$PKG_CONFIG --variable=major_version $NCURSES_CONFIG_PKG 2>/dev/null` + fi + +elif test "$NCURSES_CONFIG" != none ; then + + cf_version=`$NCURSES_CONFIG --version 2>/dev/null` + + NCURSES_MAJOR=`echo "$cf_version" | sed -e 's/\..*//'` + NCURSES_MINOR=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.//' -e 's/\..*//'` + NCURSES_PATCH=`echo "$cf_version" | sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.//'` + + # ABI version is not available from headers + cf_cv_abi_version=`$NCURSES_CONFIG --abi-version 2>/dev/null` + +else + + for cf_name in MAJOR MINOR PATCH + do + cat >conftest.$ac_ext < + AUTOCONF_$cf_name NCURSES_VERSION_$cf_name +CF_EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | fgrep AUTOCONF_$cf_name >conftest.out" + { (eval echo "$as_me:11915: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:11918: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_result=`sed -e "s/^.*AUTOCONF_${cf_name}[ ][ ]*//" conftest.out` + eval NCURSES_$cf_name=\"$cf_result\" + # cat conftest.$ac_ext + # cat conftest.out + fi + done + + cf_cv_abi_version=${NCURSES_MAJOR} + +fi + +cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR} + +cf_cv_timestamp=`date` + +echo "$as_me:11936: result: Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&5 +echo "${ECHO_T}Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_version ($cf_cv_timestamp)" >&6 + +echo "$as_me:11939: checking if KEY_RESIZE is supported" >&5 +echo $ECHO_N "checking if KEY_RESIZE is supported... $ECHO_C" >&6 +if test "${cf_cv_curses_resizes+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11946 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +int key = KEY_RESIZE; (void)key + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11958: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11961: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11964: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11967: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_curses_resizes=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_curses_resizes=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:11977: result: $cf_cv_curses_resizes" >&5 +echo "${ECHO_T}$cf_cv_curses_resizes" >&6 +cf_cv_enable_sigwinch=0 +test "$cf_cv_curses_resizes" = yes && cf_cv_enable_sigwinch=1 + +echo "$as_me:11982: checking if you want to have a library-prefix" >&5 +echo $ECHO_N "checking if you want to have a library-prefix... $ECHO_C" >&6 + +# Check whether --with-lib-prefix or --without-lib-prefix was given. +if test "${with_lib_prefix+set}" = set; then + withval="$with_lib_prefix" + with_lib_prefix=$withval +else + with_lib_prefix=auto +fi; +echo "$as_me:11992: result: $with_lib_prefix" >&5 +echo "${ECHO_T}$with_lib_prefix" >&6 + +if test "$with_lib_prefix" = auto +then + + case "$cf_cv_system_name" in + (OS/2*|os2*) + if test "$DFT_LWR_MODEL" = libtool; then + LIB_PREFIX='lib' + else + LIB_PREFIX='' + fi + ;; + (*-msvc*) + LIB_PREFIX='' + ;; + (*) LIB_PREFIX='lib' + ;; + esac +cf_prefix=$LIB_PREFIX + +elif test "$with_lib_prefix" = no +then + LIB_PREFIX= +else + LIB_PREFIX=$with_lib_prefix +fi + +LIB_SUFFIX= + +############################################################################### + +if test X"$CC_G_OPT" = X"" ; then + CC_G_OPT='-g' + test -n "$GCC" && test "${ac_cv_prog_cc_g}" != yes && CC_G_OPT='' +fi + +echo "$as_me:12030: checking for default loader flags" >&5 +echo $ECHO_N "checking for default loader flags... $ECHO_C" >&6 +case $DFT_LWR_MODEL in +(normal) LD_MODEL='' ;; +(debug) LD_MODEL=$CC_G_OPT ;; +(profile) LD_MODEL='-pg';; +(shared) LD_MODEL='' ;; +esac +echo "$as_me:12038: result: $LD_MODEL" >&5 +echo "${ECHO_T}$LD_MODEL" >&6 + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + echo "$as_me:12044: checking for an rpath option" >&5 +echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6 + case "$cf_cv_system_name" in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[2-9].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + echo "$as_me:12075: result: $LD_RPATH_OPT" >&5 +echo "${ECHO_T}$LD_RPATH_OPT" >&6 + + case "x$LD_RPATH_OPT" in + (x-R*) + echo "$as_me:12080: checking if we need a space after rpath option" >&5 +echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6 + cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 12101 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12113: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12116: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12119: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12122: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_rpath_space=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_rpath_space=yes +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + echo "$as_me:12132: result: $cf_rpath_space" >&5 +echo "${ECHO_T}$cf_rpath_space" >&6 + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi + + RM_SHARED_OPTS= + LOCAL_LDFLAGS= + LOCAL_LDFLAGS2= + LD_SHARED_OPTS= + INSTALL_LIB="-m 644" + : ${rel_builddir:=.} + + shlibdir=$libdir + + MAKE_DLLS="#" + + cf_cv_do_symlinks=no + cf_ld_rpath_opt= + test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT" + + echo "$as_me:12154: checking whether to use release or ABI version in shared library file names" >&5 +echo $ECHO_N "checking whether to use release or ABI version in shared library file names... $ECHO_C" >&6 + +# Check whether --with-shlib-version or --without-shlib-version was given. +if test "${with_shlib_version+set}" = set; then + withval="$with_shlib_version" + test -z "$withval" && withval=auto + case "$withval" in + (yes) + cf_cv_shlib_version=auto + ;; + (rel|abi|auto) + cf_cv_shlib_version=$withval + ;; + (*) + echo "$as_me:12169: result: $withval" >&5 +echo "${ECHO_T}$withval" >&6 + { { echo "$as_me:12171: error: option value must be one of: rel, abi, or auto" >&5 +echo "$as_me: error: option value must be one of: rel, abi, or auto" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + +else + cf_cv_shlib_version=auto +fi; + echo "$as_me:12180: result: $cf_cv_shlib_version" >&5 +echo "${ECHO_T}$cf_cv_shlib_version" >&6 + + cf_cv_rm_so_locs=no + cf_try_cflags= + + # Some less-capable ports of gcc support only -fpic + CC_SHARED_OPTS= + + cf_try_fPIC=no + if test "$GCC" = yes + then + cf_try_fPIC=yes + else + case "$cf_cv_system_name" in + (*linux*) # e.g., PGI compiler + cf_try_fPIC=yes + ;; + esac + fi + + if test "$cf_try_fPIC" = yes + then + echo "$as_me:12203: checking which $CC option to use" >&5 +echo $ECHO_N "checking which $CC option to use... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + for CC_SHARED_OPTS in -fPIC -fpic '' + do + CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 12210 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +int x = 1; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12222: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12225: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12228: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12231: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done + echo "$as_me:12240: result: $CC_SHARED_OPTS" >&5 +echo "${ECHO_T}$CC_SHARED_OPTS" >&6 + CFLAGS="$cf_save_CFLAGS" + fi + + cf_cv_shlib_version_infix=no + + case "$cf_cv_system_name" in + (aix4.3-9*|aix[5-7]*) + if test "$GCC" = yes; then + CC_SHARED_OPTS='-Wl,-brtl' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@' + else + CC_SHARED_OPTS='-brtl' + # as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@' + fi + ;; + (beos*) + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $@ -Xlinker -soname=`basename $@` -nostart -e 0' + ;; + (cygwin*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=cygdll + cf_cv_shlib_version_infix=cygdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/cyg/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (msys*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=msysdll + cf_cv_shlib_version_infix=msysdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/msys-/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (darwin*) + cf_try_cflags="no-cpp-precomp" + CC_SHARED_OPTS="-dynamic" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $@` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $@' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi + cf_cv_shlib_version_infix=yes + echo "$as_me:12311: checking if ld -search_paths_first works" >&5 +echo $ECHO_N "checking if ld -search_paths_first works... $ECHO_C" >&6 +if test "${cf_cv_ldflags_search_paths_first+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + cat >"conftest.$ac_ext" <<_ACEOF +#line 12320 "configure" +#include "confdefs.h" + +int +main (void) +{ +int i; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12332: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12335: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12338: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12341: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ldflags_search_paths_first=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ldflags_search_paths_first=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LDFLAGS=$cf_save_LDFLAGS +fi +echo "$as_me:12352: result: $cf_cv_ldflags_search_paths_first" >&5 +echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6 + if test "$cf_cv_ldflags_search_paths_first" = yes; then + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + fi + ;; + (haiku*) + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (hpux[7-8]*) + # HP-UX 8.07 ld lacks "+b" option used for libdir search-list + if test "$GCC" != yes; then + CC_SHARED_OPTS='+Z' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $@' + INSTALL_LIB="-m 555" + ;; + (hpux*) + # (tested with gcc 2.7.2 -- I don't have c89) + if test "$GCC" = yes; then + LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}' + else + CC_SHARED_OPTS='+Z' + LD_SHARED_OPTS='-Wl,+b,${libdir}' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $@' + # HP-UX shared libraries must be executable, and should be + # readonly to exploit a quirk in the memory manager. + INSTALL_LIB="-m 555" + ;; + (interix*) + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_shared_soname='`basename $@`' + fi + CC_SHARED_OPTS= + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $@' + ;; + (irix*) + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + # tested with IRIX 5.2 and 'cc'. + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $@` -o $@' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $@` -o $@' + fi + cf_cv_rm_so_locs=yes + ;; + (linux*|gnu*|k*bsd*-gnu) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (mingw*msvc*) + cf_cv_shlib_version=msvcdll + cf_cv_shlib_version_infix=msvcdll + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-link -dll" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${LD} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.lib/'\` + shift + my_ld=\$1 + shift + cat <<-EOF + Linking shared library + ** SHARED LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + args=\$(echo \$* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g") + exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args + mv "\${IMPORT_LIB}" "\${IMPORT_LIB}" +CF_EOF + chmod +x mk_shared_lib.sh + cat >mk_prog.sh <<-CF_EOF + #!$SHELL + shift + # Ignore first argument (compiler) and use LD (link.exe) unconditionally + LD="$LD" + clopts=() + ldopts=("/subsystem:console") + libs=() + isdll=0 + while test \$# -gt 0; do + case "\$1" in + -link) + # ignore -link argument + ;; + -M[TD] | -M[TD]d) + # ignore runtime-library option + ;; + -dll) + isdll=1 + ;; + -W* | -w*) + # ignore warnings + ;; + -D*) + clopts+=("\$1") + ;; + -I*) + clopts+=("\$1") + ;; + -l*) + libs+=("\`echo \"\$1\" | sed \"s/^-l//\"\`") + ;; + -L*) + ldopts+=("\`echo \"\$1\" | sed \"s/^-L/-LIBPATH:/\"\`") + ;; + *.obj | *.o) + ldopts+=("\$1") + ;; + -Wl,*) + for linkarg in \`echo '\$1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do + ldopts+=("\${linkarg}") + done + ;; + *.lib) + ldopts+=("\$1") + ;; + -o) + shift + ldopts+=("-out:\$1") + ;; + *) + clopts+=("\$1") + ldopts+=("\$1") + ;; + esac + shift + done + if [ "\$isdll" -ne 0 ]; then + for lib in \${libs[*]}; do + ldopts+=("\$lib.dll.lib") + done + else + for lib in \${libs[*]}; do + ldopts+=("\$lib.lib") + done + fi + cat <<-EOF + Creating program + ** ld options: "\${ldopts[@]}" +EOF + exec \$LD \${ldopts[@]} +CF_EOF + chmod +x mk_prog.sh + LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh" + LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh" + ;; + (mingw*) + cf_cv_shlib_version=mingw + cf_cv_shlib_version_infix=mingw + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-Wl,--enable-auto-import" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + exec \$* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (openbsd[2-9].*|mirbsd*) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (nskJ*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $@' + ;; + (nskL*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $@' + ;; + (nto-qnx*|openbsd*|freebsd[12].*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $@' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (dragonfly*|freebsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (netbsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + if test "$cf_cv_shlib_version" = auto; then + if test -f /usr/libexec/ld.elf_so; then + cf_cv_shlib_version=abi + else + cf_cv_shlib_version=rel + fi + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $@' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $@' + fi + ;; + (osf*|mls+*) + # tested with OSF/1 V3.2 and 'cc' + # tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't + # link with shared libs). + MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $@`' + case "$host_os" in + (osf4*) + MK_SHARED_LIB="${MK_SHARED_LIB} -msym" + ;; + esac + MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $@' + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + cf_cv_rm_so_locs=yes + ;; + (sco3.2v5*) # also uw2* and UW7: hops 13-Apr-98 + # tested with osr5.0.5 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-belf -KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $@ .${REL_VERSION}`.${ABI_VERSION} -o $@' + if test "$cf_cv_enable_rpath" = yes ; then + # only way is to set LD_RUN_PATH but no switch for it + RUN_PATH=$libdir + fi + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + LINK_PROGS='LD_RUN_PATH=${libdir}' + LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib' + ;; + (sunos4*) + # tested with SunOS 4.1.1 and gcc 2.7.0 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $@' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (solaris2*) + # tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2 + # tested with SunOS 5.10 (solaris 10) and gcc 3.4.3 + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-R\$(LOCAL_LIBDIR):\${libdir}" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="-R\${libdir} $EXTRA_LDFLAGS" + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + if test "$GCC" != yes; then + cf_save_CFLAGS="$CFLAGS" + for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O + do + CFLAGS="$cf_shared_opts $cf_save_CFLAGS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 12702 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12714: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12717: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12720: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12723: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done + CFLAGS="$cf_save_CFLAGS" + CC_SHARED_OPTS=$cf_shared_opts + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $@' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $@' + fi + ;; + (sysv5uw7*|unix_sv*) + # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@' + ;; + (*) + CC_SHARED_OPTS='unknown' + MK_SHARED_LIB='echo unknown' + ;; + esac + + # This works if the last tokens in $MK_SHARED_LIB are the -o target. + case "$cf_cv_shlib_version" in + (rel|abi) + case "$MK_SHARED_LIB" in + (*'-o $@') + test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes + ;; + (*) + { echo "$as_me:12760: WARNING: ignored --with-shlib-version" >&5 +echo "$as_me: WARNING: ignored --with-shlib-version" >&2;} + ;; + esac + ;; + esac + + if test -n "$cf_try_cflags" + then +cat > conftest.$ac_ext < +int main(int argc, char *argv[]) +{ + printf("hello\\n"); + return (argv[argc-1] == 0) ; +} +EOF + cf_save_CFLAGS="$CFLAGS" + for cf_opt in $cf_try_cflags + do + CFLAGS="$cf_save_CFLAGS -$cf_opt" + echo "$as_me:12782: checking if CFLAGS option -$cf_opt works" >&5 +echo $ECHO_N "checking if CFLAGS option -$cf_opt works... $ECHO_C" >&6 + if { (eval echo "$as_me:12784: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12787: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + echo "$as_me:12789: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cf_save_CFLAGS="$CFLAGS" + else + echo "$as_me:12793: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi + done + CFLAGS="$cf_save_CFLAGS" + fi + + # RPATH_LIST is a colon-separated list of directories + test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}" + test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}" + + test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations" + + test -n "$verbose" && echo " CC_SHARED_OPTS: $CC_SHARED_OPTS" 1>&6 + +echo "${as_me:-configure}:12808: testing CC_SHARED_OPTS: $CC_SHARED_OPTS ..." 1>&5 + + test -n "$verbose" && echo " MK_SHARED_LIB: $MK_SHARED_LIB" 1>&6 + +echo "${as_me:-configure}:12812: testing MK_SHARED_LIB: $MK_SHARED_LIB ..." 1>&5 + +# The test/sample programs in the original tree link using rpath option. +# Make it optional for packagers. +if test -n "$LOCAL_LDFLAGS" +then + echo "$as_me:12818: checking if you want to link sample programs with rpath option" >&5 +echo $ECHO_N "checking if you want to link sample programs with rpath option... $ECHO_C" >&6 + +# Check whether --enable-rpath-link or --disable-rpath-link was given. +if test "${enable_rpath_link+set}" = set; then + enableval="$enable_rpath_link" + with_rpath_link=$enableval +else + with_rpath_link=yes +fi; + echo "$as_me:12828: result: $with_rpath_link" >&5 +echo "${ECHO_T}$with_rpath_link" >&6 + if test "$with_rpath_link" = no + then + LOCAL_LDFLAGS= + LOCAL_LDFLAGS2= + fi +fi + +############################################################################### + +### use option --enable-broken-linker to force on use of broken-linker support + +echo "$as_me:12841: checking if you want broken-linker support code" >&5 +echo $ECHO_N "checking if you want broken-linker support code... $ECHO_C" >&6 + +# Check whether --enable-broken_linker or --disable-broken_linker was given. +if test "${enable_broken_linker+set}" = set; then + enableval="$enable_broken_linker" + with_broken_linker=$enableval +else + with_broken_linker=no +fi; +echo "$as_me:12851: result: $with_broken_linker" >&5 +echo "${ECHO_T}$with_broken_linker" >&6 + +: "${BROKEN_LINKER:=0}" +if test "x$with_broken_linker" = xyes ; then + +cat >>confdefs.h <<\EOF +#define BROKEN_LINKER 1 +EOF + + BROKEN_LINKER=1 +fi + +# Check to define _XOPEN_SOURCE "automatically" + +echo "$as_me:12866: checking if the POSIX test-macros are already defined" >&5 +echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6 +if test "${cf_cv_posix_visible+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 12873 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12892: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12895: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12898: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12901: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_visible=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_visible=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:12912: result: $cf_cv_posix_visible" >&5 +echo "${ECHO_T}$cf_cv_posix_visible" >&6 + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=600 +cf_POSIX_C_SOURCE=199506L +cf_xopen_source= + +case "$host_os" in +(aix[4-7]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(darwin[0-8].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[56].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin|msys|mingw*|linux*uclibc) + +cf_gnu_xopen_source=$cf_XOPEN_SOURCE + +echo "$as_me:12954: checking if this is the GNU C library" >&5 +echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6 +if test "${cf_cv_gnu_library+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 12961 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12980: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12983: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12986: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12989: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_library=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_library=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:13000: result: $cf_cv_gnu_library" >&5 +echo "${ECHO_T}$cf_cv_gnu_library" >&6 + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + echo "$as_me:13008: checking if _DEFAULT_SOURCE can be used as a basis" >&5 +echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6 +if test "${cf_cv_gnu_library_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13020 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13039: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13042: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13045: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13048: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_library_219=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_library_219=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +echo "$as_me:13060: result: $cf_cv_gnu_library_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_library_219" >&6 + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + echo "$as_me:13065: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_dftsrc_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13170 "configure" +#include "confdefs.h" + + #include + #include + +int +main (void) +{ + + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13190: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13193: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13196: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13199: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_dftsrc_219=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_dftsrc_219=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:13210: result: $cf_cv_gnu_dftsrc_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6 + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + echo "$as_me:13219: checking if we must define _GNU_SOURCE" >&5 +echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13226 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13241: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13244: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13247: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13250: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_GNU_SOURCE +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13357 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13372: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13375: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13378: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13381: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_source=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:13396: result: $cf_cv_gnu_source" >&5 +echo "${ECHO_T}$cf_cv_gnu_source" >&6 + + if test "$cf_cv_gnu_source" = yes + then + echo "$as_me:13401: checking if we should also define _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_default_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13411 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13426: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13429: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13432: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13435: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_default_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_default_source=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:13446: result: $cf_cv_default_source" >&5 +echo "${ECHO_T}$cf_cv_default_source" >&6 + if test "$cf_cv_default_source" = yes + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + fi + fi + fi + +fi + + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:13483: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:13489: testing if the symbol is already defined go no further ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13492 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13507: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13510: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13513: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13516: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 13537 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13552: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13555: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13558: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13561: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + +echo "${as_me:-configure}:13572: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:13580: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13583 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13598: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13601: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13604: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13607: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:13623: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[6-9]*) + # OpenBSD 6.x has broken locale support, both compile-time and runtime. + # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + # Abusing the conformance level is a workaround. + { echo "$as_me:13740: WARNING: this system does not provide usable locale support" >&5 +echo "$as_me: WARNING: this system does not provide usable locale support" >&2;} + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=700 + ;; +(openbsd[4-5]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[45]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + +echo "$as_me:13772: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13779 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13797: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13800: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13803: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13806: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13818 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13836: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13839: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13842: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13845: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:13860: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +for cf_add_cflags in $cf_temp_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + + cf_save_xopen_cppflags="$CPPFLAGS" + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:14020: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:14026: testing if the symbol is already defined go no further ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 14029 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14044: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14047: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14050: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14053: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 14074 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14089: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14092: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14095: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14098: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + +echo "${as_me:-configure}:14109: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:14117: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 14120 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14135: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14138: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14141: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14144: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:14160: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + # Some of these niche implementations use copy/paste, double-check... + if test "$cf_cv_xopen_source" = no ; then + test -n "$verbose" && echo " checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE" 1>&6 + +echo "${as_me:-configure}:14273: testing checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 14276 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14294: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14297: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14300: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14303: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + { echo "$as_me:14310: WARNING: _POSIX_C_SOURCE definition is not usable" >&5 +echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;} + CPPFLAGS="$cf_save_xopen_cppflags" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + ;; +esac + +if test -n "$cf_xopen_source" ; then + +for cf_add_cflags in $cf_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + test -n "$verbose" && echo " removing old option $cf_add_cflags from CFLAGS" 1>&6 + +echo "${as_me:-configure}:14333: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5 + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + test -n "$verbose" && echo " removing old option $cf_add_cflags from CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:14345: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5 + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:14433: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:14443: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:14453: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + echo "$as_me:14465: checking if _XOPEN_SOURCE really is set" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 14468 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14483: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14486: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14489: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14492: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_XOPEN_SOURCE_set=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_XOPEN_SOURCE_set=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:14501: result: $cf_XOPEN_SOURCE_set" >&5 +echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6 + if test "$cf_XOPEN_SOURCE_set" = yes + then + cat >"conftest.$ac_ext" <<_ACEOF +#line 14506 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#error (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14521: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14524: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14527: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14530: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_XOPEN_SOURCE_set_ok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_XOPEN_SOURCE_set_ok=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + if test "$cf_XOPEN_SOURCE_set_ok" = no + then + { echo "$as_me:14541: WARNING: _XOPEN_SOURCE is lower than requested" >&5 +echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} + fi + else + +echo "$as_me:14546: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 14553 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14571: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14574: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14577: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14580: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 14592 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14610: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14613: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14616: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14619: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:14634: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +for cf_add_cflags in $cf_temp_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + + fi +fi +fi # cf_cv_posix_visible + +echo "$as_me:14781: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 14787 "configure" +#include "confdefs.h" +#include +#include +#include +#include + +_ACEOF +if { (eval echo "$as_me:14795: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:14801: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_stdc=no +fi +rm -f conftest.err "conftest.$ac_ext" + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >"conftest.$ac_ext" <<_ACEOF +#line 14823 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >"conftest.$ac_ext" <<_ACEOF +#line 14841 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 14862 "configure" +#include "confdefs.h" +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main (void) +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + $ac_main_return(2); + $ac_main_return (0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:14888: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14891: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:14893: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14896: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_header_stdc=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +fi +echo "$as_me:14909: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:14925: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 14931 "configure" +#include "confdefs.h" +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14937: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14940: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14943: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14946: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Header=no" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:14956: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking whether exit is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_exit+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 14972 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +#ifndef exit + (void) exit; +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14987: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14990: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14993: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14996: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_have_decl_exit=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_have_decl_exit=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:15006: result: $ac_cv_have_decl_exit" >&5 +echo "${ECHO_T}$ac_cv_have_decl_exit" >&6 + +# Check whether --enable-largefile or --disable-largefile was given. +if test "${enable_largefile+set}" = set; then + enableval="$enable_largefile" + +fi; +if test "$enable_largefile" != no; then + + echo "$as_me:15016: checking for special C compiler options needed for large files" >&5 +echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_largefile_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat >"conftest.$ac_ext" <<_ACEOF +#line 15028 "configure" +#include "confdefs.h" +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15048: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15051: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15054: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15057: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" + CC="$CC -n32" + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15067: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15070: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15073: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15076: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_largefile_CC=' -n32'; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" + break + done + CC=$ac_save_CC + rm -f "conftest.$ac_ext" + fi +fi +echo "$as_me:15090: result: $ac_cv_sys_largefile_CC" >&5 +echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6 + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + echo "$as_me:15096: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_file_offset_bits+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_file_offset_bits=no + cat >"conftest.$ac_ext" <<_ACEOF +#line 15104 "configure" +#include "confdefs.h" +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15124: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15127: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15130: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15133: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 15142 "configure" +#include "confdefs.h" +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15163: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15166: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15169: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15172: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_file_offset_bits=64; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + break +done +fi +echo "$as_me:15183: result: $ac_cv_sys_file_offset_bits" >&5 +echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6 +if test "$ac_cv_sys_file_offset_bits" != no; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_large_files+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_large_files=no + cat >"conftest.$ac_ext" <<_ACEOF +#line 15201 "configure" +#include "confdefs.h" +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15221: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15224: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15227: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15230: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 15239 "configure" +#include "confdefs.h" +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15260: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15263: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15266: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15269: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_large_files=1; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + break +done +fi +echo "$as_me:15280: result: $ac_cv_sys_large_files" >&5 +echo "${ECHO_T}$ac_cv_sys_large_files" >&6 +if test "$ac_cv_sys_large_files" != no; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_largefile_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_largefile_source=no + cat >"conftest.$ac_ext" <<_ACEOF +#line 15301 "configure" +#include "confdefs.h" +#include + #include +int +main (void) +{ + + int (*my_fseeko)(FILE *, off_t, int) = fseeko; + return my_fseeko(stdin, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15316: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15319: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15322: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15325: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 15334 "configure" +#include "confdefs.h" +#define _LARGEFILE_SOURCE 1 +#include + #include +int +main (void) +{ + + int (*my_fseeko)(FILE *, off_t, int) = fseeko; + return my_fseeko(stdin, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15350: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15353: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15356: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15359: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_largefile_source=1; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + break +done +fi +echo "$as_me:15370: result: $ac_cv_sys_largefile_source" >&5 +echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6 +if test "$ac_cv_sys_largefile_source" != no; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for fseeko... $ECHO_C" >&6 +if test "${ac_cv_func_fseeko+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 15390 "configure" +#include "confdefs.h" +#include + #include +int +main (void) +{ +int (*my_fseeko)(FILE *, off_t, int) = fseeko; + return my_fseeko && my_fseeko (stdin, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15404: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15407: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15410: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15413: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_fseeko=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_fseeko=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:15423: result: $ac_cv_func_fseeko" >&5 +echo "${ECHO_T}$ac_cv_func_fseeko" >&6 +if test $ac_cv_func_fseeko = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_FSEEKO 1 +EOF + +fi + + # Normally we would collect these definitions in the config.h, + # but (like _XOPEN_SOURCE), some environments rely on having these + # defined before any of the system headers are included. Another + # case comes up with C++, e.g., on AIX the compiler compiles the + # header files by themselves before looking at the body files it is + # told to compile. For ncurses, those header files do not include + # the config.h + if test "$ac_cv_sys_large_files" != no + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_LARGE_FILES" + + fi + if test "$ac_cv_sys_largefile_source" != no + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_LARGEFILE_SOURCE" + + fi + if test "$ac_cv_sys_file_offset_bits" != no + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" + + fi + + echo "$as_me:15462: checking whether to use struct dirent64" >&5 +echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6 +if test "${cf_cv_struct_dirent64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 15469 "configure" +#include "confdefs.h" + +#pragma GCC diagnostic error "-Wincompatible-pointer-types" +#include +#include + +#ifndef __REDIRECT +/* if transitional largefile support is setup, this is true */ +extern struct dirent64 * readdir(DIR *); +#endif + +int +main (void) +{ + + DIR *dp = opendir("."); + struct dirent64 *x = readdir(dp); + struct dirent *y = readdir(dp); + int z = x - y; + (void)z; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15496: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15499: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15502: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15505: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_struct_dirent64=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_struct_dirent64=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:15516: result: $cf_cv_struct_dirent64" >&5 +echo "${ECHO_T}$cf_cv_struct_dirent64" >&6 + test "$cf_cv_struct_dirent64" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_STRUCT_DIRENT64 1 +EOF + + fi + +### Enable compiling-in rcs id's +echo "$as_me:15526: checking if RCS identifiers should be compiled-in" >&5 +echo $ECHO_N "checking if RCS identifiers should be compiled-in... $ECHO_C" >&6 + +# Check whether --with-rcs-ids or --without-rcs-ids was given. +if test "${with_rcs_ids+set}" = set; then + withval="$with_rcs_ids" + with_rcs_ids=$withval +else + with_rcs_ids=no +fi; +echo "$as_me:15536: result: $with_rcs_ids" >&5 +echo "${ECHO_T}$with_rcs_ids" >&6 +test "$with_rcs_ids" = yes && +cat >>confdefs.h <<\EOF +#define USE_RCS_IDS 1 +EOF + +############################################################################### + +### Note that some functions (such as const) are normally disabled anyway. +echo "$as_me:15546: checking if you want to build with function extensions" >&5 +echo $ECHO_N "checking if you want to build with function extensions... $ECHO_C" >&6 + +# Check whether --enable-ext-funcs or --disable-ext-funcs was given. +if test "${enable_ext_funcs+set}" = set; then + enableval="$enable_ext_funcs" + with_ext_funcs=$enableval +else + with_ext_funcs=yes +fi; +echo "$as_me:15556: result: $with_ext_funcs" >&5 +echo "${ECHO_T}$with_ext_funcs" >&6 +if test "$with_ext_funcs" = yes ; then + NCURSES_EXT_FUNCS=1 + +cat >>confdefs.h <<\EOF +#define HAVE_USE_DEFAULT_COLORS 1 +EOF + +cat >>confdefs.h <<\EOF +#define NCURSES_EXT_FUNCS 1 +EOF + +else + NCURSES_EXT_FUNCS=0 +fi + +### use option --enable-const to turn on use of const beyond that in XSI. +echo "$as_me:15574: checking for extended use of const keyword" >&5 +echo $ECHO_N "checking for extended use of const keyword... $ECHO_C" >&6 + +# Check whether --enable-const or --disable-const was given. +if test "${enable_const+set}" = set; then + enableval="$enable_const" + with_ext_const=$enableval +else + with_ext_const=no +fi; +echo "$as_me:15584: result: $with_ext_const" >&5 +echo "${ECHO_T}$with_ext_const" >&6 +NCURSES_CONST='/*nothing*/' +if test "$with_ext_const" = yes ; then + NCURSES_CONST=const +fi + +############################################################################### +# These options are relatively safe to experiment with. + +echo "$as_me:15594: checking if you want all development code" >&5 +echo $ECHO_N "checking if you want all development code... $ECHO_C" >&6 + +# Check whether --with-develop or --without-develop was given. +if test "${with_develop+set}" = set; then + withval="$with_develop" + with_develop=$withval +else + with_develop=no +fi; +echo "$as_me:15604: result: $with_develop" >&5 +echo "${ECHO_T}$with_develop" >&6 + +############################################################################### +# These are just experimental, probably should not be in a package: + +# This is still experimental (20080329), but should ultimately be moved to +# the script-block --with-normal, etc. + +echo "$as_me:15613: checking if you want to link with the pthread library" >&5 +echo $ECHO_N "checking if you want to link with the pthread library... $ECHO_C" >&6 + +# Check whether --with-pthread or --without-pthread was given. +if test "${with_pthread+set}" = set; then + withval="$with_pthread" + with_pthread=$withval +else + with_pthread=no +fi; +echo "$as_me:15623: result: $with_pthread" >&5 +echo "${ECHO_T}$with_pthread" >&6 + +if test "$with_pthread" != no ; then + echo "$as_me:15627: checking for pthread.h" >&5 +echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6 +if test "${ac_cv_header_pthread_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 15633 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:15637: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:15643: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_pthread_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_pthread_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:15662: result: $ac_cv_header_pthread_h" >&5 +echo "${ECHO_T}$ac_cv_header_pthread_h" >&6 +if test "$ac_cv_header_pthread_h" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_PTHREADS_H 1 +EOF + + for cf_lib_pthread in pthread c_r + do + echo "$as_me:15672: checking if we can link with the $cf_lib_pthread library" >&5 +echo $ECHO_N "checking if we can link with the $cf_lib_pthread library... $ECHO_C" >&6 + cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 15693 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + int rc = pthread_create(0,0,0,0); + int r2 = pthread_mutexattr_settype(0, 0); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15710: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15713: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15716: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15719: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + with_pthread=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +with_pthread=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + echo "$as_me:15729: result: $with_pthread" >&5 +echo "${ECHO_T}$with_pthread" >&6 + test "$with_pthread" = yes && break + done + + if test "$with_pthread" = yes ; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cat >>confdefs.h <<\EOF +#define HAVE_LIBPTHREADS 1 +EOF + + else + { { echo "$as_me:15757: error: Cannot link with pthread library" >&5 +echo "$as_me: error: Cannot link with pthread library" >&2;} + { (exit 1); exit 1; }; } + fi + +fi + +fi + +echo "$as_me:15766: checking if you want to use weak-symbols for pthreads" >&5 +echo $ECHO_N "checking if you want to use weak-symbols for pthreads... $ECHO_C" >&6 + +# Check whether --enable-weak-symbols or --disable-weak-symbols was given. +if test "${enable_weak_symbols+set}" = set; then + enableval="$enable_weak_symbols" + use_weak_symbols=$withval +else + use_weak_symbols=no +fi; +echo "$as_me:15776: result: $use_weak_symbols" >&5 +echo "${ECHO_T}$use_weak_symbols" >&6 +if test "$use_weak_symbols" = yes ; then + +echo "$as_me:15780: checking if $CC supports weak symbols" >&5 +echo $ECHO_N "checking if $CC supports weak symbols... $ECHO_C" >&6 +if test "${cf_cv_weak_symbols+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 15787 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ + +#if defined(__GNUC__) +# if defined __USE_ISOC99 +# define _cat_pragma(exp) _Pragma(#exp) +# define _weak_pragma(exp) _cat_pragma(weak name) +# else +# define _weak_pragma(exp) +# endif +# define _declare(name) __extension__ extern __typeof__(name) name +# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) +#endif + +weak_symbol(fopen); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15813: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15816: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15819: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15822: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_weak_symbols=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_weak_symbols=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:15833: result: $cf_cv_weak_symbols" >&5 +echo "${ECHO_T}$cf_cv_weak_symbols" >&6 + +else + cf_cv_weak_symbols=no +fi + +if test $cf_cv_weak_symbols = yes ; then + +cat >>confdefs.h <<\EOF +#define USE_WEAK_SYMBOLS 1 +EOF + +fi + +PTHREAD= +if test "$with_pthread" = "yes" ; then + +cat >>confdefs.h <<\EOF +#define USE_PTHREADS 1 +EOF + + enable_reentrant=yes + if test $cf_cv_weak_symbols = yes ; then + PTHREAD=-lpthread + fi +fi + +# OpenSUSE is installing ncurses6, using reentrant option. +echo "$as_me:15862: checking for _nc_TABSIZE" >&5 +echo $ECHO_N "checking for _nc_TABSIZE... $ECHO_C" >&6 +if test "${ac_cv_func__nc_TABSIZE+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 15868 "configure" +#include "confdefs.h" +#define _nc_TABSIZE autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef _nc_TABSIZE + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _nc_TABSIZE (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub__nc_TABSIZE) || defined (__stub____nc_TABSIZE) +#error found stub for _nc_TABSIZE +#endif + + return _nc_TABSIZE (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15899: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15902: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15905: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15908: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func__nc_TABSIZE=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func__nc_TABSIZE=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:15918: result: $ac_cv_func__nc_TABSIZE" >&5 +echo "${ECHO_T}$ac_cv_func__nc_TABSIZE" >&6 +if test "$ac_cv_func__nc_TABSIZE" = yes; then + assume_reentrant=yes +else + assume_reentrant=no +fi + +# Reentrant code has to be opaque; there's little advantage to making ncurses +# opaque outside of that, so there is no --enable-opaque option. We can use +# this option without --with-pthreads, but this will be always set for +# pthreads. +echo "$as_me:15930: checking if you want experimental reentrant code" >&5 +echo $ECHO_N "checking if you want experimental reentrant code... $ECHO_C" >&6 + +# Check whether --enable-reentrant or --disable-reentrant was given. +if test "${enable_reentrant+set}" = set; then + enableval="$enable_reentrant" + with_reentrant=$enableval +else + with_reentrant=$assume_reentrant +fi; +echo "$as_me:15940: result: $with_reentrant" >&5 +echo "${ECHO_T}$with_reentrant" >&6 +if test "$with_reentrant" = yes ; then + cf_cv_enable_reentrant=1 + if test $cf_cv_weak_symbols = yes ; then + +# remove pthread library from $LIBS +LIBS=`echo "$LIBS" | sed -e 's/-lpthread[ ]//g' -e 's/-lpthread$//'` + + elif test "$assume_reentrant" = no ; then + LIB_SUFFIX="t${LIB_SUFFIX}" + fi + +cat >>confdefs.h <<\EOF +#define USE_REENTRANT 1 +EOF + +else + cf_cv_enable_reentrant=0 +fi + +### Allow using a different wrap-prefix +if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then + echo "$as_me:15963: checking for prefix used to wrap public variables" >&5 +echo $ECHO_N "checking for prefix used to wrap public variables... $ECHO_C" >&6 + +# Check whether --with-wrap-prefix or --without-wrap-prefix was given. +if test "${with_wrap_prefix+set}" = set; then + withval="$with_wrap_prefix" + NCURSES_WRAP_PREFIX=$withval +else + NCURSES_WRAP_PREFIX=_nc_ +fi; + echo "$as_me:15973: result: $NCURSES_WRAP_PREFIX" >&5 +echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6 +else + NCURSES_WRAP_PREFIX=_nc_ +fi + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6 + +# Check whether --enable-echo or --disable-echo was given. +if test "${enable_echo+set}" = set; then + enableval="$enable_echo" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + + ECHO_LT='--silent' + ECHO_LD='@echo linking $@;' + RULE_CC='@echo compiling $<' + SHOW_CC='@echo compiling $@' + ECHO_CC='@' + + else + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + + fi +else + enableval=yes + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + +fi; +echo "$as_me:16021: result: $enableval" >&5 +echo "${ECHO_T}$enableval" >&6 + +echo "$as_me:16024: checking if you want to use C11 _Noreturn feature" >&5 +echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6 + +# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given. +if test "${enable_stdnoreturn+set}" = set; then + enableval="$enable_stdnoreturn" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_stdnoreturn=yes + else + enable_stdnoreturn=no + fi +else + enableval=no + enable_stdnoreturn=no + +fi; +echo "$as_me:16041: result: $enable_stdnoreturn" >&5 +echo "${ECHO_T}$enable_stdnoreturn" >&6 + +if test $enable_stdnoreturn = yes; then +echo "$as_me:16045: checking for C11 _Noreturn feature" >&5 +echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6 +if test "${cf_cv_c11_noreturn+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 16051 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +static _Noreturn void giveup(void) { exit(0); } + +int +main (void) +{ +if (feof(stdin)) giveup() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:16067: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16070: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:16073: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16076: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_c11_noreturn=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_c11_noreturn=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:16087: result: $cf_cv_c11_noreturn" >&5 +echo "${ECHO_T}$cf_cv_c11_noreturn" >&6 +else + cf_cv_c11_noreturn=no, +fi + +if test "$cf_cv_c11_noreturn" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_STDNORETURN_H 1 +EOF + +cat >>confdefs.h <&6 + +echo "${as_me:-configure}:16143: testing repairing CFLAGS: $CFLAGS ..." 1>&5 + + CFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6 + +echo "${as_me:-configure}:16148: testing ... fixed $CFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:16152: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + case $CPPFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $CPPFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$CPPFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing CPPFLAGS: $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:16191: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5 + + CPPFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:16196: testing ... fixed $CPPFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:16200: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + case $LDFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $LDFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$LDFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing LDFLAGS: $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:16239: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5 + + LDFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:16244: testing ... fixed $LDFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:16248: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +echo "$as_me:16255: checking if you want to turn on gcc warnings" >&5 +echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6 + +# Check whether --enable-warnings or --disable-warnings was given. +if test "${enable_warnings+set}" = set; then + enableval="$enable_warnings" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_warnings=yes + else + enable_warnings=no + fi +else + enableval=no + enable_warnings=no + +fi; +echo "$as_me:16272: result: $enable_warnings" >&5 +echo "${ECHO_T}$enable_warnings" >&6 +if test "$enable_warnings" = "yes" +then + +if test "x$have_x" = xyes; then + +cf_save_LIBS_CF_CONST_X_STRING="$LIBS" +cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS" +cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + +cat >"conftest.$ac_ext" <<_ACEOF +#line 16296 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +String foo = malloc(1); free((void*)foo) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:16311: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16314: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:16317: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16320: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + +echo "$as_me:16323: checking for X11/Xt const-feature" >&5 +echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6 +if test "${cf_cv_const_x_string+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 16330 "configure" +#include "confdefs.h" + +#undef _CONST_X_STRING +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + +int +main (void) +{ +String foo = malloc(1); *foo = 0 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:16348: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16351: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:16354: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16357: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_const_x_string=no + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_const_x_string=yes + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:16372: result: $cf_cv_const_x_string" >&5 +echo "${ECHO_T}$cf_cv_const_x_string" >&6 + +LIBS="$cf_save_LIBS_CF_CONST_X_STRING" +CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING" +CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING" + +case "$cf_cv_const_x_string" in +(no) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES" + + ;; +(*) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING" + + ;; +esac + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi +cat > "conftest.$ac_ext" <&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall" + for cf_opt in \ + wd1419 \ + wd1683 \ + wd1684 \ + wd193 \ + wd593 \ + wd279 \ + wd810 \ + wd869 \ + wd981 + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:16433: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16436: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:16438: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown" +then + { echo "$as_me:16446: checking for $CC warning options..." >&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + cf_warn_CONST="" + test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings" + cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs" + test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings= + for cf_opt in W Wall \ + Wbad-function-cast \ + Wcast-align \ + Wcast-qual \ + Wdeclaration-after-statement \ + Wextra \ + Winline \ + Wmissing-declarations \ + Wmissing-prototypes \ + Wnested-externs \ + Wpointer-arith \ + Wshadow \ + Wstrict-prototypes \ + Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas Wswitch-enum + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:16469: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16472: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:16474: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + case "$cf_opt" in + (Winline) + case "$GCC_VERSION" in + ([34].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:16482: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + (Wpointer-arith) + case "$GCC_VERSION" in + ([12].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:16492: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + esac + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +fi +rm -rf ./conftest* + +fi + +if test "$GCC" = yes || test "$GXX" = yes +then +cat > conftest.i <&5 +echo "$as_me: checking for $CC __attribute__ directives..." >&6;} +cat > "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + +cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&5 + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16581: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:16583: result: ... $cf_attribute" >&5 +echo "${ECHO_T}... $cf_attribute" >&6 + cat conftest.h >>confdefs.h + case "$cf_attribute" in + (noreturn) + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_PRINTF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_SCANF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf ./conftest* +fi + +fi + +if test "x$enable_warnings" = "xyes"; then + + ADAFLAGS="$ADAFLAGS -gnatwa -gnatyg" + +fi + +### use option --enable-assertions to turn on generation of assertion code +echo "$as_me:16651: checking if you want to enable runtime assertions" >&5 +echo $ECHO_N "checking if you want to enable runtime assertions... $ECHO_C" >&6 + +# Check whether --enable-assertions or --disable-assertions was given. +if test "${enable_assertions+set}" = set; then + enableval="$enable_assertions" + with_assertions=$enableval +else + with_assertions=no +fi; +echo "$as_me:16661: result: $with_assertions" >&5 +echo "${ECHO_T}$with_assertions" >&6 +if test -n "$GCC" +then + if test "$with_assertions" = no + then + CPPFLAGS="$CPPFLAGS -DNDEBUG" + else + + ADAFLAGS="$ADAFLAGS -gnata" + + fi +fi + +### use option --disable-leaks to suppress "permanent" leaks, for testing + +cat >>confdefs.h <<\EOF +#define HAVE_NC_ALLOC_H 1 +EOF + +### use option --enable-expanded to generate certain macros as functions + +# Check whether --enable-expanded or --disable-expanded was given. +if test "${enable_expanded+set}" = set; then + enableval="$enable_expanded" + test "$enableval" = yes && +cat >>confdefs.h <<\EOF +#define NCURSES_EXPANDED 1 +EOF + +fi; + +### use option --disable-macros to suppress macros in favor of functions + +# Check whether --enable-macros or --disable-macros was given. +if test "${enable_macros+set}" = set; then + enableval="$enable_macros" + test "$enableval" = no && +cat >>confdefs.h <<\EOF +#define NCURSES_NOMACROS 1 +EOF + +fi; + +# Normally we only add trace() to the debug-library. Allow this to be +# extended to all models of the ncurses library: +cf_all_traces=no +case "$CFLAGS $CPPFLAGS" in +(*-DTRACE*) + cf_all_traces=yes + ;; +esac + +echo "$as_me:16714: checking whether to add trace feature to all models" >&5 +echo $ECHO_N "checking whether to add trace feature to all models... $ECHO_C" >&6 + +# Check whether --with-trace or --without-trace was given. +if test "${with_trace+set}" = set; then + withval="$with_trace" + cf_with_trace=$withval +else + cf_with_trace=$cf_all_traces +fi; +echo "$as_me:16724: result: $cf_with_trace" >&5 +echo "${ECHO_T}$cf_with_trace" >&6 + +if test "$cf_with_trace" = yes ; then + ADA_TRACE=TRUE + +cat >>confdefs.h <<\EOF +#define TRACE 1 +EOF + +else + ADA_TRACE=FALSE +fi + +echo "$as_me:16738: checking if we want to use GNAT projects" >&5 +echo $ECHO_N "checking if we want to use GNAT projects... $ECHO_C" >&6 + +# Check whether --enable-gnat-projects or --disable-gnat-projects was given. +if test "${enable_gnat_projects+set}" = set; then + enableval="$enable_gnat_projects" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_gnat_projects=no + else + enable_gnat_projects=yes + fi +else + enableval=yes + enable_gnat_projects=yes + +fi; +echo "$as_me:16755: result: $enable_gnat_projects" >&5 +echo "${ECHO_T}$enable_gnat_projects" >&6 + +### Checks for libraries. +case $cf_cv_system_name in +(*mingw32*) + +echo "$as_me:16762: checking if ssp library is needed" >&5 +echo $ECHO_N "checking if ssp library is needed... $ECHO_C" >&6 +if test "${cf_cv_need_libssp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 16769 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + + DIR *dp = opendir("."); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16786: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16789: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16792: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16795: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_libssp=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lssp" + cat >"conftest.$ac_ext" <<_ACEOF +#line 16805 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + + DIR *dp = opendir("."); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16822: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16825: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16828: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16831: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_libssp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_need_libssp=maybe +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:16845: result: $cf_cv_need_libssp" >&5 +echo "${ECHO_T}$cf_cv_need_libssp" >&6 + +if test "x$cf_cv_need_libssp" = xyes +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lssp; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + ;; +(*) + +cf_save_libs="$LIBS" +echo "$as_me:16873: checking for clock_gettime" >&5 +echo $ECHO_N "checking for clock_gettime... $ECHO_C" >&6 +if test "${ac_cv_func_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 16879 "configure" +#include "confdefs.h" +#define clock_gettime autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef clock_gettime + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char clock_gettime (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_clock_gettime) || defined (__stub___clock_gettime) +#error found stub for clock_gettime +#endif + + return clock_gettime (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16910: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16913: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16916: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16919: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:16929: result: $ac_cv_func_clock_gettime" >&5 +echo "${ECHO_T}$ac_cv_func_clock_gettime" >&6 +if test "$ac_cv_func_clock_gettime" = yes; then + cf_cv_test_clock_gettime=yes +else + echo "$as_me:16934: checking for clock_gettime in -lrt" >&5 +echo $ECHO_N "checking for clock_gettime in -lrt... $ECHO_C" >&6 +if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 16942 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char clock_gettime (void); +int +main (void) +{ +clock_gettime (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16961: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16964: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16967: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16970: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_rt_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_rt_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:16981: result: $ac_cv_lib_rt_clock_gettime" >&5 +echo "${ECHO_T}$ac_cv_lib_rt_clock_gettime" >&6 +if test "$ac_cv_lib_rt_clock_gettime" = yes; then + LIBS="-lrt $LIBS" + cf_cv_test_clock_gettime=yes +else + cf_cv_test_clock_gettime=no +fi + +fi + +if test "$cf_cv_test_clock_gettime" = yes ; then +echo "$as_me:16993: checking if clock_gettime links" >&5 +echo $ECHO_N "checking if clock_gettime links... $ECHO_C" >&6 +if test "${cf_cv_func_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 17000 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ +struct timespec ts; + int rc = clock_gettime(CLOCK_REALTIME, &ts) + + clock_gettime(CLOCK_MONOTONIC, &ts); + (void) rc; (void)ts + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17018: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17021: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17024: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17027: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:17038: result: $cf_cv_func_clock_gettime" >&5 +echo "${ECHO_T}$cf_cv_func_clock_gettime" >&6 +else + cf_cv_func_clock_gettime=no +fi + +if test "$cf_cv_func_clock_gettime" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_CLOCK_GETTIME 1 +EOF + +else +echo "$as_me:17052: checking for gettimeofday" >&5 +echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6 +if test "${ac_cv_func_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17058 "configure" +#include "confdefs.h" +#define gettimeofday autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef gettimeofday + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday) +#error found stub for gettimeofday +#endif + + return gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17089: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17092: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17095: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17098: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_gettimeofday=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:17108: result: $ac_cv_func_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6 +if test "$ac_cv_func_gettimeofday" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + +else + +echo "$as_me:17118: checking for gettimeofday in -lbsd" >&5 +echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 17126 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (void); +int +main (void) +{ +gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17145: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17148: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17151: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17154: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_gettimeofday=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:17165: result: $ac_cv_lib_bsd_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6 +if test "$ac_cv_lib_bsd_gettimeofday" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi +fi + + ;; +esac + +### Checks for header files. +echo "$as_me:17198: checking for signed char" >&5 +echo $ECHO_N "checking for signed char... $ECHO_C" >&6 +if test "${ac_cv_type_signed_char+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17204 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((signed char *) 0) + return 0; +if (sizeof (signed char)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17219: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17222: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17225: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17228: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_signed_char=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_signed_char=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:17238: result: $ac_cv_type_signed_char" >&5 +echo "${ECHO_T}$ac_cv_type_signed_char" >&6 + +echo "$as_me:17241: checking size of signed char" >&5 +echo $ECHO_N "checking size of signed char... $ECHO_C" >&6 +if test "${ac_cv_sizeof_signed_char+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$ac_cv_type_signed_char" = yes; then + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >"conftest.$ac_ext" <<_ACEOF +#line 17250 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) >= 0)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17262: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17265: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17268: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17271: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 17276 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17288: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17291: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17294: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17297: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=-1 ac_mid=-1 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 17313 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) >= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17325: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17328: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17331: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17334: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"` + cat >"conftest.$ac_ext" <<_ACEOF +#line 17350 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17362: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17365: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17368: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17371: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +ac_cv_sizeof_signed_char=$ac_lo +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:17384: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17389 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +FILE *f = fopen ("conftest.val", "w"); +if (!f) + $ac_main_return (1); +fprintf (f, "%ld", (long)(sizeof (signed char))); +fclose (f); + ; + return 0; +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:17405: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17408: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:17410: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17413: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sizeof_signed_char=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_signed_char=0 +fi +fi +echo "$as_me:17429: result: $ac_cv_sizeof_signed_char" >&5 +echo "${ECHO_T}$ac_cv_sizeof_signed_char" >&6 +cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17444 "configure" +#include "confdefs.h" +#include +#include <$ac_hdr> + +int +main (void) +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17459: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17462: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17465: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17468: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Header=no" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:17478: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6 +if test "${ac_cv_lib_dir_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldir $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 17499 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (void); +int +main (void) +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17518: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17521: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17524: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17527: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dir_opendir=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dir_opendir=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:17538: result: $ac_cv_lib_dir_opendir" >&5 +echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6 +if test "$ac_cv_lib_dir_opendir" = yes; then + LIBS="$LIBS -ldir" +fi + +else + echo "$as_me:17545: checking for opendir in -lx" >&5 +echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6 +if test "${ac_cv_lib_x_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lx $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 17553 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (void); +int +main (void) +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17572: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17575: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17578: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17581: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_x_opendir=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_x_opendir=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:17592: result: $ac_cv_lib_x_opendir" >&5 +echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6 +if test "$ac_cv_lib_x_opendir" = yes; then + LIBS="$LIBS -lx" +fi + +fi + +echo "$as_me:17600: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17606 "configure" +#include "confdefs.h" +#include +#include +#include + +int +main (void) +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17622: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17625: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17628: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17631: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_header_time=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:17641: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +### checks for compiler characteristics +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +echo "$as_me:17659: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17665 "configure" +#include "confdefs.h" + +int +main (void) +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; (void)x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; (void)zero; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + (void)s; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + (void)foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + (void)p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + (void)foo; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17727: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17730: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17733: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17736: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_c_const=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:17746: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\EOF +#define const +EOF + +fi + +### Checks for external-data + +echo "$as_me:17758: checking if data-only library module links" >&5 +echo $ECHO_N "checking if data-only library module links... $ECHO_C" >&6 +if test "${cf_cv_link_dataonly+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -f conftest.a + cat >conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17772: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + mv conftest.o data.o && \ + ( $AR $ARFLAGS conftest.a data.o ) 2>&5 1>/dev/null + fi + rm -f conftest.$ac_ext data.o + cat >conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17799: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + mv conftest.o func.o && \ + ( $AR $ARFLAGS conftest.a func.o ) 2>&5 1>/dev/null + fi + rm -f conftest.$ac_ext func.o + ( eval $RANLIB conftest.a ) 2>&5 >/dev/null + cf_saveLIBS="$LIBS" + LIBS="conftest.a $LIBS" + if test "$cross_compiling" = yes; then + cf_cv_link_dataonly=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17812 "configure" +#include "confdefs.h" + + extern int testfunc(void); + int main(void) + { + ${cf_cv_main_return:-return} (!testfunc()); + } + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:17823: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17826: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:17828: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17831: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_link_dataonly=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_link_dataonly=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + LIBS="$cf_saveLIBS" + +fi + +echo "$as_me:17846: result: $cf_cv_link_dataonly" >&5 +echo "${ECHO_T}$cf_cv_link_dataonly" >&6 + +if test "$cf_cv_link_dataonly" = no ; then + +cat >>confdefs.h <<\EOF +#define BROKEN_LINKER 1 +EOF + + BROKEN_LINKER=1 +fi + +### Checks for library functions. + +for ac_header in \ +unistd.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:17865: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17871 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:17875: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:17881: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:17900: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for working mkstemp... $ECHO_C" >&6 +if test "${cf_cv_func_mkstemp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +rm -rf ./conftest* +if test "$cross_compiling" = yes; then + cf_cv_func_mkstemp=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17921 "configure" +#include "confdefs.h" + +$ac_includes_default + +int main(void) +{ + static char tmpl[] = "conftestXXXXXX"; + char name[2][80]; + int n; + int result = 0; + int fd; + struct stat sb; + + umask(077); + for (n = 0; n < 2; ++n) { + strcpy(name[n], tmpl); + if ((fd = mkstemp(name[n])) >= 0) { + if (!strcmp(name[n], tmpl) + || stat(name[n], &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG + || (sb.st_mode & 077) != 0) { + result = 1; + } + close(fd); + } + } + if (result == 0 + && !strcmp(name[0], name[1])) + result = 1; + ${cf_cv_main_return:-return}(result); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:17956: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17959: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:17961: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17964: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_mkstemp=yes + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_mkstemp=no + +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:17979: result: $cf_cv_func_mkstemp" >&5 +echo "${ECHO_T}$cf_cv_func_mkstemp" >&6 +if test "x$cf_cv_func_mkstemp" = xmaybe ; then + echo "$as_me:17982: checking for mkstemp" >&5 +echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6 +if test "${ac_cv_func_mkstemp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17988 "configure" +#include "confdefs.h" +#define mkstemp autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef mkstemp + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char mkstemp (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_mkstemp) || defined (__stub___mkstemp) +#error found stub for mkstemp +#endif + + return mkstemp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18019: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18022: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18025: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18028: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_mkstemp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_mkstemp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:18038: result: $ac_cv_func_mkstemp" >&5 +echo "${ECHO_T}$ac_cv_func_mkstemp" >&6 + +fi +if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then + +cat >>confdefs.h <<\EOF +#define HAVE_MKSTEMP 1 +EOF + +fi + +if test -z "$cf_user_CFLAGS" && test "$with_no_leaks" = no ; then + CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'` + CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'` +fi + +cf_with_ada=yes +if test "$cf_with_ada" != "no" ; then + if test "$cf_cv_prog_gnat_correct" = yes; then + + echo "$as_me:18059: checking optimization options for ADAFLAGS" >&5 +echo $ECHO_N "checking optimization options for ADAFLAGS... $ECHO_C" >&6 + case "$CFLAGS" in + (*-g*) + + ADAFLAGS="$ADAFLAGS -g" + + ;; + esac + case "$CFLAGS" in + (*-O*) + cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[ ].*//'` + + ADAFLAGS="$ADAFLAGS $cf_O_flag" + + ;; + esac + echo "$as_me:18076: result: $ADAFLAGS" >&5 +echo "${ECHO_T}$ADAFLAGS" >&6 + +echo "$as_me:18079: checking if GNATPREP supports -T option" >&5 +echo $ECHO_N "checking if GNATPREP supports -T option... $ECHO_C" >&6 +if test "${cf_cv_gnatprep_opt_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gnatprep_opt_t=no +gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes + +fi +echo "$as_me:18089: result: $cf_cv_gnatprep_opt_t" >&5 +echo "${ECHO_T}$cf_cv_gnatprep_opt_t" >&6 +test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS" + +echo "$as_me:18093: checking if GNAT supports generics" >&5 +echo $ECHO_N "checking if GNAT supports generics... $ECHO_C" >&6 +case "$cf_cv_gnat_version" in +(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9]) + cf_gnat_generics=yes + ;; +(*) + cf_gnat_generics=no + ;; +esac +echo "$as_me:18103: result: $cf_gnat_generics" >&5 +echo "${ECHO_T}$cf_gnat_generics" >&6 + +if test "$cf_gnat_generics" = yes +then + cf_compile_generics=generics + cf_generic_objects="\${GENOBJS}" +else + cf_compile_generics= + cf_generic_objects= +fi + +echo "$as_me:18115: checking if GNAT supports SIGINT" >&5 +echo $ECHO_N "checking if GNAT supports SIGINT... $ECHO_C" >&6 +if test "${cf_cv_gnat_sigint+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&5 2>&1 ) ; then + cf_cv_gnat_sigint=yes +else + cf_cv_gnat_sigint=no +fi +rm -rf ./conftest* ./*~conftest* + +fi +echo "$as_me:18163: result: $cf_cv_gnat_sigint" >&5 +echo "${ECHO_T}$cf_cv_gnat_sigint" >&6 + +if test "$cf_cv_gnat_sigint" = yes ; then + USE_GNAT_SIGINT="" +else + USE_GNAT_SIGINT="#" +fi + +cf_gnat_libraries=no +cf_gnat_projects=no + +if test "$enable_gnat_projects" != no ; then +echo "$as_me:18176: checking if GNAT supports project files" >&5 +echo $ECHO_N "checking if GNAT supports project files... $ECHO_C" >&6 +case "$cf_cv_gnat_version" in +(3.[0-9]*) + ;; +(*) + case "$cf_cv_system_name" in + (cygwin*|msys*) + ;; + (*) + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src conftest.bin conftest.lib + then + cd conftest.src + rm -rf ./conftest* ./*~conftest* + cat >>library.gpr <>confpackage.ads <>confpackage.adb <&5 2>&1 ) ; then + cf_gnat_projects=yes + fi + cd .. + fi + if test -f conftest.lib/confpackage.ali + then + cf_gnat_libraries=yes + fi + rm -rf ./conftest* ./*~conftest* + ;; + esac + ;; +esac +echo "$as_me:18239: result: $cf_gnat_projects" >&5 +echo "${ECHO_T}$cf_gnat_projects" >&6 +fi # enable_gnat_projects + +if test "$cf_gnat_projects" = yes +then + echo "$as_me:18245: checking if GNAT supports libraries" >&5 +echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6 + echo "$as_me:18247: result: $cf_gnat_libraries" >&5 +echo "${ECHO_T}$cf_gnat_libraries" >&6 +fi + +USE_OLD_MAKERULES="" +USE_GNAT_PROJECTS="#" +USE_GNAT_MAKE_GPR="#" +USE_GNAT_GPRBUILD="#" + +if test "$cf_gnat_projects" = yes +then + USE_OLD_MAKERULES="#" + USE_GNAT_PROJECTS="" + if test "$cf_cv_VERSION_GPRBUILD" != no + then + USE_GNAT_GPRBUILD="" + elif test "$cf_cv_VERSION_GNATMAKE" != no + then + USE_GNAT_MAKE_GPR="" + else + { echo "$as_me:18267: WARNING: use old makefile rules since tools are missing" >&5 +echo "$as_me: WARNING: use old makefile rules since tools are missing" >&2;} + fi +fi + +if test "$cf_gnat_libraries" = yes +then + USE_GNAT_LIBRARIES="" +else + USE_GNAT_LIBRARIES="#" +fi + +echo "$as_me:18279: checking for Ada95 compiler" >&5 +echo $ECHO_N "checking for Ada95 compiler... $ECHO_C" >&6 + +# Check whether --with-ada-compiler or --without-ada-compiler was given. +if test "${with_ada_compiler+set}" = set; then + withval="$with_ada_compiler" + cf_ada_compiler=$withval +else + cf_ada_compiler=gnatmake +fi; + +echo "$as_me:18290: result: $cf_ada_compiler" >&5 +echo "${ECHO_T}$cf_ada_compiler" >&6 + + cf_ada_package=terminal_interface + +echo "$as_me:18295: checking for Ada95 include directory" >&5 +echo $ECHO_N "checking for Ada95 include directory... $ECHO_C" >&6 + +# Check whether --with-ada-include or --without-ada-include was given. +if test "${with_ada_include+set}" = set; then + withval="$with_ada_include" + +else + withval="${ADA_INCLUDE:-$prefix/share/ada/adainclude}" +fi; if test -n "$prefix/share/ada/adainclude" ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:18329: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +eval ADA_INCLUDE="$withval" + +echo "$as_me:18338: result: $ADA_INCLUDE" >&5 +echo "${ECHO_T}$ADA_INCLUDE" >&6 + +echo "$as_me:18341: checking for Ada95 object directory" >&5 +echo $ECHO_N "checking for Ada95 object directory... $ECHO_C" >&6 + +# Check whether --with-ada-objects or --without-ada-objects was given. +if test "${with_ada_objects+set}" = set; then + withval="$with_ada_objects" + +else + withval="${ADA_OBJECTS:-$prefix/lib/ada/adalib}" +fi; if test -n "$prefix/lib/ada/adalib" ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:18375: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +eval ADA_OBJECTS="$withval" + +echo "$as_me:18384: result: $ADA_OBJECTS" >&5 +echo "${ECHO_T}$ADA_OBJECTS" >&6 + +echo "$as_me:18387: checking whether to build an Ada95 shared library" >&5 +echo $ECHO_N "checking whether to build an Ada95 shared library... $ECHO_C" >&6 + +# Check whether --with-ada-sharedlib or --without-ada-sharedlib was given. +if test "${with_ada_sharedlib+set}" = set; then + withval="$with_ada_sharedlib" + with_ada_sharedlib=$withval +else + with_ada_sharedlib=no +fi; +cf_ada_sharedlib_warn=no + +if test "x$with_ada_sharedlib" != xno +then + if test "x$cf_gnat_projects" != xyes + then + with_ada_sharedlib=no + cf_ada_sharedlib_warn=yes + fi +fi + +echo "$as_me:18408: result: $with_ada_sharedlib" >&5 +echo "${ECHO_T}$with_ada_sharedlib" >&6 +if test "x$cf_ada_sharedlib_warn" != xno +then + { echo "$as_me:18412: WARNING: disabling Ada95 shared library since GNAT projects are not supported" >&5 +echo "$as_me: WARNING: disabling Ada95 shared library since GNAT projects are not supported" >&2;} +fi + +ADA_SHAREDLIB='lib$(LIB_NAME).so.1' +MAKE_ADA_SHAREDLIB="#" + +if test "x$with_ada_sharedlib" != xno +then + MAKE_ADA_SHAREDLIB= + if test "x$with_ada_sharedlib" != xyes + then + ADA_SHAREDLIB="$with_ada_sharedlib" + fi +fi + + # allow the Ada binding to be renamed + +echo "$as_me:18430: checking for Ada95 curses library name" >&5 +echo $ECHO_N "checking for Ada95 curses library name... $ECHO_C" >&6 + +# Check whether --with-ada-libname or --without-ada-libname was given. +if test "${with_ada_libname+set}" = set; then + withval="$with_ada_libname" + ADA_LIBNAME=$withval +else + ADA_LIBNAME=AdaCurses +fi; +case "x$ADA_LIBNAME" in +(x|xyes|xno) + ADA_LIBNAME=AdaCurses + ;; +esac + +echo "$as_me:18446: result: $ADA_LIBNAME" >&5 +echo "${ECHO_T}$ADA_LIBNAME" >&6 + + else + { { echo "$as_me:18450: error: No usable Ada compiler found" >&5 +echo "$as_me: error: No usable Ada compiler found" >&2;} + { (exit 1); exit 1; }; } + fi +else + { { echo "$as_me:18455: error: The Ada compiler is needed for this package" >&5 +echo "$as_me: error: The Ada compiler is needed for this package" >&2;} + { (exit 1); exit 1; }; } +fi + +################################################################################ + +# not needed +TINFO_LDFLAGS2= + +TINFO_LIBS= + +### Construct the list of include-directories to be generated + +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS" +fi +CPPFLAGS="-I../include $CPPFLAGS" +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir} $CPPFLAGS" +fi +CPPFLAGS="-I. $CPPFLAGS" + +ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS" +if test "$srcdir" != "."; then + ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS" +fi +if test "$GCC" != yes; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" +elif test "$includedir" != "/usr/include"; then + if test "$includedir" = '${prefix}/include' ; then + if test x$prefix != x/usr ; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi + else + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi +fi + +### Build up pieces for makefile rules +echo "$as_me:18495: checking default library suffix" >&5 +echo $ECHO_N "checking default library suffix... $ECHO_C" >&6 + + case $DFT_LWR_MODEL in + (libtool) DFT_ARG_SUFFIX='' ;; + (normal) DFT_ARG_SUFFIX='' ;; + (debug) DFT_ARG_SUFFIX='_g' ;; + (profile) DFT_ARG_SUFFIX='_p' ;; + (shared) DFT_ARG_SUFFIX='' ;; + esac + test -n "$LIB_SUFFIX" && DFT_ARG_SUFFIX="${LIB_SUFFIX}${DFT_ARG_SUFFIX}" +echo "$as_me:18506: result: $DFT_ARG_SUFFIX" >&5 +echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6 + +echo "$as_me:18509: checking default library-dependency suffix" >&5 +echo $ECHO_N "checking default library-dependency suffix... $ECHO_C" >&6 + + case X$DFT_LWR_MODEL in + (Xlibtool) + DFT_LIB_SUFFIX='.la' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + DFT_LIB_SUFFIX='_g.lib' + ;; + (*) + DFT_LIB_SUFFIX='_g.a' + ;; + esac + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + DFT_LIB_SUFFIX='_p.lib' + ;; + (*) + DFT_LIB_SUFFIX='_p.a' + ;; + esac + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[5-7]*) + DFT_LIB_SUFFIX='.so' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (*-msvc*) + DFT_LIB_SUFFIX='.dll' + DFT_DEP_SUFFIX='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + DFT_LIB_SUFFIX='.dll' + DFT_DEP_SUFFIX='.dll.a' + ;; + (darwin*) + DFT_LIB_SUFFIX='.dylib' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (hpux*) + case "$target" in + (ia64*) + DFT_LIB_SUFFIX='.so' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (*) + DFT_LIB_SUFFIX='.sl' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + esac + ;; + (*) + DFT_LIB_SUFFIX='.so' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + DFT_LIB_SUFFIX='.lib' + ;; + (*) + DFT_LIB_SUFFIX='.a' + ;; + esac + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + DFT_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_LIB_SUFFIX}" + DFT_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_DEP_SUFFIX}" + fi +echo "$as_me:18592: result: $DFT_DEP_SUFFIX" >&5 +echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6 + +echo "$as_me:18595: checking default object directory" >&5 +echo $ECHO_N "checking default object directory... $ECHO_C" >&6 + + case $DFT_LWR_MODEL in + (libtool) DFT_OBJ_SUBDIR='obj_lo' ;; + (normal) DFT_OBJ_SUBDIR='objects' ;; + (debug) DFT_OBJ_SUBDIR='obj_g' ;; + (profile) DFT_OBJ_SUBDIR='obj_p' ;; + (shared) + case "$cf_cv_system_name" in + (cygwin|msys) + DFT_OBJ_SUBDIR='objects' ;; + (*) + DFT_OBJ_SUBDIR='obj_s' ;; + esac + esac +echo "$as_me:18611: result: $DFT_OBJ_SUBDIR" >&5 +echo "${ECHO_T}$DFT_OBJ_SUBDIR" >&6 + +### Set up low-level terminfo dependencies for makefiles. + +if test "$DFT_LWR_MODEL" = shared ; then + case $cf_cv_system_name in + (cygwin*) + # "lib" files have ".dll.a" suffix, "cyg" files have ".dll" + ;; + (msys*) + # "lib" files have ".dll.a" suffix, "msys-" files have ".dll" + ;; + esac +fi + +USE_ARG_SUFFIX=${DFT_ARG_SUFFIX} + +USE_LIB_SUFFIX=${DFT_ARG_SUFFIX} + +USE_CFG_SUFFIX=${DFT_ARG_SUFFIX} + +### Construct the list of subdirectories for which we'll customize makefiles +### with the appropriate compile-rules. + +SUB_MAKEFILES="gen/adacurses${USE_ARG_SUFFIX}-config:gen/adacurses-config.in" + +cat >>confdefs.h <confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +: "${CONFIG_STATUS=./config.status}" +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:18753: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >"$CONFIG_STATUS" <<_ACEOF +#! $SHELL +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +me=\`echo "\$0" | sed -e 's,.*\\/,,'\` + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +ac_cs_invocation="\$0 \$@" + +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS +_ACEOF + +cat >>"$CONFIG_STATUS" <<\_ACEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr="expr" +else + as_expr="false" +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln' +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset="unset" +else + as_unset="false" +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +exec 6>&1 + +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS" +fi + +cat >>"$CONFIG_STATUS" <<\EOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +EOF + +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +EOF +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:18934: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:18953: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +exec 5>>config.log +cat >&5 << _ACEOF + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by $as_me 2.52.20240618, executed with + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + > "$ac_cs_invocation" +on `(hostname || uname -n) 2>/dev/null | sed 1q` + +_ACEOF +EOF + +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "$SUB_MAKEFILES" ) CONFIG_FILES="$CONFIG_FILES $SUB_MAKEFILES" ;; + "src/library.gpr" ) CONFIG_FILES="$CONFIG_FILES src/library.gpr:src/library.gpr.in" ;; + "doc/adacurses${DFT_ARG_SUFFIX}-config.1" ) CONFIG_FILES="$CONFIG_FILES doc/adacurses${DFT_ARG_SUFFIX}-config.1:doc/MKada_config.in" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + "include/ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/ncurses_cfg.h:include/ncurses_cfg.hin" ;; + *) { { echo "$as_me:19028: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if "$ac_need_defaults"; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: "${TMPDIR=/tmp}" +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +EOF + +cat >>"$CONFIG_STATUS" <"\$tmp"/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datarootdir@,$datarootdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@runstatedir@,$runstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@DEFS@,$DEFS,;t t +s,@LIBS@,$LIBS,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@top_builddir@,$top_builddir,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@GREP@,$GREP,;t t +s,@FGREP@,$FGREP,;t t +s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t +s,@M4_exists@,$M4_exists,;t t +s,@cf_ada_make@,$cf_ada_make,;t t +s,@cf_ada_config@,$cf_ada_config,;t t +s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t +s,@cf_ada_config_C@,$cf_ada_config_C,;t t +s,@cf_cv_path_gnatgcc@,$cf_cv_path_gnatgcc,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@AWK@,$AWK,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@LN_S@,$LN_S,;t t +s,@GLOB_FULLPATH_POSIX@,$GLOB_FULLPATH_POSIX,;t t +s,@GLOB_FULLPATH_OTHER@,$GLOB_FULLPATH_OTHER,;t t +s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t +s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t +s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t +s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t +s,@MAKE_PHONY@,$MAKE_PHONY,;t t +s,@CTAGS@,$CTAGS,;t t +s,@ETAGS@,$ETAGS,;t t +s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t +s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t +s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@LD@,$LD,;t t +s,@ac_ct_LD@,$ac_ct_LD,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t +s,@ARFLAGS@,$ARFLAGS,;t t +s,@DESTDIR@,$DESTDIR,;t t +s,@MERGE_PREFIX@,$MERGE_PREFIX,;t t +s,@BUILD_CC@,$BUILD_CC,;t t +s,@BUILD_CPP@,$BUILD_CPP,;t t +s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t +s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t +s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t +s,@BUILD_LIBS@,$BUILD_LIBS,;t t +s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t +s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t +s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t +s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t +s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t +s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t +s,@cf_cv_screen@,$cf_cv_screen,;t t +s,@NCURSES_MAJOR@,$NCURSES_MAJOR,;t t +s,@NCURSES_MINOR@,$NCURSES_MINOR,;t t +s,@NCURSES_PATCH@,$NCURSES_PATCH,;t t +s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t +s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t +s,@cf_cv_builtin_bool@,$cf_cv_builtin_bool,;t t +s,@cf_cv_header_stdbool_h@,$cf_cv_header_stdbool_h,;t t +s,@cf_cv_type_of_bool@,$cf_cv_type_of_bool,;t t +s,@cf_cv_enable_sigwinch@,$cf_cv_enable_sigwinch,;t t +s,@LIB_PREFIX@,$LIB_PREFIX,;t t +s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t +s,@CC_G_OPT@,$CC_G_OPT,;t t +s,@LD_MODEL@,$LD_MODEL,;t t +s,@shlibdir@,$shlibdir,;t t +s,@MAKE_DLLS@,$MAKE_DLLS,;t t +s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t +s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t +s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t +s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t +s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t +s,@LINK_PROGS@,$LINK_PROGS,;t t +s,@LINK_TESTS@,$LINK_TESTS,;t t +s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t +s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t +s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t +s,@INSTALL_LIB@,$INSTALL_LIB,;t t +s,@RPATH_LIST@,$RPATH_LIST,;t t +s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t +s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t +s,@NCURSES_CONST@,$NCURSES_CONST,;t t +s,@PTHREAD@,$PTHREAD,;t t +s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t +s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t +s,@ECHO_LT@,$ECHO_LT,;t t +s,@ECHO_LD@,$ECHO_LD,;t t +s,@RULE_CC@,$RULE_CC,;t t +s,@SHOW_CC@,$SHOW_CC,;t t +s,@ECHO_CC@,$ECHO_CC,;t t +s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t +s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t +s,@STDC_NORETURN@,$STDC_NORETURN,;t t +s,@ADAFLAGS@,$ADAFLAGS,;t t +s,@ADA_TRACE@,$ADA_TRACE,;t t +s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t +s,@cf_compile_generics@,$cf_compile_generics,;t t +s,@cf_generic_objects@,$cf_generic_objects,;t t +s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t +s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t +s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t +s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t +s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t +s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t +s,@cf_ada_compiler@,$cf_ada_compiler,;t t +s,@cf_ada_package@,$cf_ada_package,;t t +s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t +s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t +s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t +s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t +s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t +s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t +s,@TINFO_LIBS@,$TINFO_LIBS,;t t +s,@ACPPFLAGS@,$ACPPFLAGS,;t t +s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t +s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t +s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t +s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t +s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t +s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t +s,@TEST_ARG2@,$TEST_ARG2,;t t +s,@TEST_LIBS2@,$TEST_LIBS2,;t t +s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t +s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t +s,@NCURSES_TREE@,$NCURSES_TREE,;t t +s,@EXTERNAL_TREE@,$EXTERNAL_TREE,;t t +s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t +s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t +CEOF + +EOF + + cat >>"$CONFIG_STATUS" <<\EOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while "$ac_more_lines"; do + if test "$ac_beg" -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag + else + sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag + fi + if test ! -s "$tmp"/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && sed -e 's/\\\\*$//g' -e 's/$/\\/' -e 's/;t t\\/;t t/' -e 't' -e '3,'$ac_max_sed_lines's/$/\\/' "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed + # It is possible to make a multiline substitution using escaped newlines. + # Ensure that we do not split the substitution between script fragments. + ac_BEG=$ac_end + ac_END=`expr "$ac_end" + "$ac_max_sed_lines"` + sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next + if test -s "$tmp"/subs.next; then + grep '^s,@[^@,][^@,]*@,.*$' "$tmp"/subs.next | grep -v '^s,@.*;t t$' >"$tmp"/subs.edit + if test ! -s "$tmp"/subs.edit; then + grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit + if test ! -s "$tmp"/subs.edit; then + if test "$ac_beg" -gt 1; then + ac_end=`expr "$ac_end" - 1` + continue + fi + fi + fi + fi + + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr "$ac_sed_frag" + 1` + ac_beg=$ac_end + ac_end=`expr "$ac_end" + "$ac_max_sed_lines"` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="cat" + fi +fi # test -n "$CONFIG_FILES" + +EOF +cat >>"$CONFIG_STATUS" <<\EOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + - | *:- | *:-:* ) # input from stdin + cat >"$tmp"/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$srcdir" in + .) ac_srcdir=. + if test -z "$ac_dots"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) + ac_srcdir="$srcdir$ac_dir_suffix"; + ac_top_srcdir="$srcdir" ;; + *) # Relative path. + ac_srcdir="$ac_dots$srcdir$ac_dir_suffix" + ac_top_srcdir="$ac_dots$srcdir" ;; + esac + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_dots$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:19395: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + configure_input="Generated automatically from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo "$tmp"/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:19413: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:19426: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +EOF +cat >>"$CONFIG_STATUS" <<\EOF + ac_warn_datarootdir=no + if test x"$ac_file" != x-; then + for ac_item in $ac_file_inputs + do + ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"` + if test -n "$ac_seen"; then + ac_used=`grep '@datarootdir@' "$ac_item"` + if test -z "$ac_used"; then + { echo "$as_me:19442: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + fi + ac_seen=`grep '${datarootdir}' "$ac_item"` + if test -n "$ac_seen"; then + { echo "$as_me:19451: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + done + fi + +if test "x$ac_warn_datarootdir" = xyes; then + ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'" +fi + +EOF +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out + rm -f "$tmp"/stdin +EOF +test -n "${FGREP}" || FGREP="grep -F" +test -n "${EGREP}" || EGREP="grep -E" +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF + if test x"$ac_file" != x-; then + cp "$tmp/out" "$ac_file" + + for ac_name in prefix exec_prefix datarootdir + do + ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"` + if test -n "$ac_seen"; then + ac_init=`$EGREP '[ ]*'$ac_name'[ ]*=' "$ac_file"` + if test -z "$ac_init"; then + ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'` + { echo "$as_me:19496: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&5 +echo "$as_me: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&2;} + fi + fi + done + $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out + $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out + if test -s "$tmp"/out; then + ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out` + { echo "$as_me:19507: WARNING: Some variables may not be substituted: +$ac_seen" >&5 +echo "$as_me: WARNING: Some variables may not be substituted: +$ac_seen" >&2;} + fi + else + cat "$tmp"/out + fi + rm -f "$tmp"/out + +done +EOF +cat >>"$CONFIG_STATUS" <<\EOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_iB='\([ ]\),\1#\2define\3' +ac_iC=' ' +ac_iD='\4,;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + - | *:- | *:-:* ) # input from stdin + cat >"$tmp"/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:19556: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo "$tmp"/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:19567: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:19580: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >"$tmp"/in + +EOF + +# Transform confdefs.h into a list of #define's. We won't use it as a sed +# script, but as data to insert where we see @DEFS@. We expect AC_SAVE_DEFS to +# be either 'cat' or 'sort'. +cat confdefs.h | uniq >conftest.vals + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +echo ' rm -f conftest.frag' >> "$CONFIG_STATUS" +while grep . conftest.vals >/dev/null +do + # Write chunks of a limited-size here document to conftest.frag. + echo ' cat >> conftest.frag <> "$CONFIG_STATUS" + sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS" + echo 'CEOF' >> "$CONFIG_STATUS" + sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +# Run sed to substitute the contents of conftest.frag into $tmp/in at the +# marker @DEFS@. +echo ' cat >> conftest.edit < "$tmp"/out +rm -f "$tmp"/in +mv "$tmp"/out "$tmp"/in +rm -f conftest.edit conftest.frag +' >> "$CONFIG_STATUS" + +cat >>"$CONFIG_STATUS" <<\EOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated automatically by configure. */" >"$tmp"/config.h + else + echo "/* $ac_file. Generated automatically by configure. */" >"$tmp"/config.h + fi + cat "$tmp"/in >>"$tmp"/config.h + rm -f "$tmp"/in + if test x"$ac_file" != x-; then + if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then + { echo "$as_me:19638: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + fi + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" + fi + else + cat "$tmp"/config.h + rm -f "$tmp"/config.h + fi +done +EOF +cat >>"$CONFIG_STATUS" <<\EOF +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + + case "$ac_dest" in + default ) +$AWK -v PACKAGE=$PACKAGE -f $srcdir/mk-pkg.awk > Makefile +if test -z "$USE_OLD_MAKERULES" ; then + $AWK -f $srcdir/mk-1st.awk <$srcdir/src/modules >>src/Makefile +fi + ;; + esac +done +EOF + +cat >>"$CONFIG_STATUS" <<\EOF + +{ (exit 0); exit 0; } +EOF +chmod +x "$CONFIG_STATUS" +ac_clean_files=$ac_clean_files_save + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL "$CONFIG_STATUS" || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + "$ac_cs_success" || { (exit 1); exit 1; } +fi +${MAKE:-make} preinstall diff --git a/contrib/ncurses/Ada95/configure.in b/contrib/ncurses/Ada95/configure.in new file mode 100644 index 00000000..bd58beb7 --- /dev/null +++ b/contrib/ncurses/Ada95/configure.in @@ -0,0 +1,607 @@ +dnl*************************************************************************** +dnl Copyright 2018-2023,2024 Thomas E. Dickey * +dnl Copyright 2010-2016,2018 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl Author: Thomas E. Dickey +dnl +dnl $Id: configure.in,v 1.94 2024/08/11 00:22:07 tom Exp $ +dnl Process this file with autoconf to produce a configure script. +dnl +dnl For additional information, see +dnl https://invisible-island.net/autoconf/ +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl +dnl --------------------------------------------------------------------------- +AC_PREREQ(2.52.20210509) +AC_REVISION($Revision: 1.94 $) +AC_INIT(gen/gen.c) +AC_CONFIG_HEADER(include/ncurses_cfg.h:include/ncurses_cfg.hin) + +AC_DEFUN([AC_PATH_XTRA],[])dnl ignore dependencies on this + +PACKAGE="AdaCurses" AC_SUBST(PACKAGE) + +CF_TOP_BUILDDIR + +CF_HELP_MESSAGE(General Options:) + +CF_WITH_SYSTYPE + +### Save the given $CFLAGS to allow user-override. +cf_user_CFLAGS="$CFLAGS" + +### Default install-location +CF_CFG_DEFAULTS + +### Checks for programs. +CF_WITH_ADA +AC_PROG_CPP +AC_PROG_GCC_TRADITIONAL +CF_PROG_CC_C_O(CC,[$CFLAGS $CPPFLAGS]) + +AC_ARG_PROGRAM + +CF_PROG_AWK +CF_PROG_EGREP +AC_PROG_INSTALL +CF_PROG_LN_S + +CF_PROG_INSTALL +CF_INSTALL_OPTS + +AC_SYS_LONG_FILE_NAMES + +# if we find pkg-config, check if we should install the ".pc" files. +CF_PKG_CONFIG +CF_WITH_PKG_CONFIG_LIBDIR + +AC_MSG_CHECKING(if you want to build test-programs) +AC_ARG_WITH(tests, + [ --without-tests suppress build with test-programs], + [cf_with_tests=$withval], + [cf_with_tests=yes]) +AC_MSG_RESULT($cf_with_tests) + +AC_MSG_CHECKING(if we should assume mixed-case filenames) +AC_ARG_ENABLE(mixed-case, + [ --enable-mixed-case tic should assume mixed-case filenames], + [enable_mixedcase=$enableval], + [enable_mixedcase=auto]) +AC_MSG_RESULT($enable_mixedcase) +if test "$enable_mixedcase" = "auto" ; then + CF_MIXEDCASE_FILENAMES +else + cf_cv_mixedcase=$enable_mixedcase + if test "$enable_mixedcase" = "yes" ; then + AC_DEFINE(MIXEDCASE_FILENAMES) + fi +fi + +# do this after mixed-case option (tags/TAGS is not as important as tic). +AC_PROG_MAKE_SET +CF_MAKE_PHONY +CF_MAKE_TAGS +CF_MAKEFLAGS + +dnl These are standard among *NIX systems, but not when cross-compiling +AC_CHECK_TOOL(RANLIB, ranlib, ':') +AC_CHECK_TOOL(LD, ld, ld) +AC_CHECK_TOOL(AR, ar, ar) +CF_AR_FLAGS +CF_PATHSEP + +CF_INSTALL_PREFIX + +############################################################################### +CF_HELP_MESSAGE(Build-Tools Needed to Compile Temporary Applications for Cross-compiling:) +# If we're cross-compiling, allow the user to override the tools and their +# options. The configure script is oriented toward identifying the host +# compiler, etc., but we need a build compiler to generate parts of the source. +CF_BUILD_CC + +############################################################################### +CF_HELP_MESSAGE(Options to Specify the Libraries Built/Used:) + +### Options to allow the user to specify the set of libraries which are used. +### Use "--without-normal --with-shared" to allow the default model to be +### shared, for example. +cf_list_models="" + +AC_MSG_CHECKING(if you want to build shared C-objects) +AC_ARG_WITH(shared, + [ --with-shared generate shared C-objects (needed for --with-ada-sharedlib)], + [with_shared=$withval], + [with_shared=no]) +AC_MSG_RESULT($with_shared) +test "$with_shared" = "yes" && cf_list_models="$cf_list_models shared" + +AC_MSG_CHECKING(for specified models) +test -z "$cf_list_models" && cf_list_models=normal +AC_MSG_RESULT($cf_list_models) + +### Use the first model as the default, and save its suffix for use in building +### up test-applications. +AC_MSG_CHECKING(for default model) +DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'` +AC_MSG_RESULT($DFT_LWR_MODEL) + +CF_UPPER(DFT_UPR_MODEL,$DFT_LWR_MODEL)dnl + +AC_SUBST(DFT_LWR_MODEL)dnl the default model ("normal") +AC_SUBST(DFT_UPR_MODEL)dnl the default model ("NORMAL") + +CF_NCURSES_ADDON + +CF_WITH_LIB_PREFIX(cf_prefix) + +LIB_SUFFIX= +AC_SUBST(LIB_SUFFIX) + +############################################################################### + +dnl Not all ports of gcc support the -g option + +if test X"$CC_G_OPT" = X"" ; then + CC_G_OPT='-g' + test -n "$GCC" && test "${ac_cv_prog_cc_g}" != yes && CC_G_OPT='' +fi +AC_SUBST(CC_G_OPT) + +AC_MSG_CHECKING(for default loader flags) +case $DFT_LWR_MODEL in +(normal) LD_MODEL='' ;; +(debug) LD_MODEL=$CC_G_OPT ;; +(profile) LD_MODEL='-pg';; +(shared) LD_MODEL='' ;; +esac +AC_SUBST(LD_MODEL)dnl the type of link (e.g., -g or -pg) +AC_MSG_RESULT($LD_MODEL) + +CF_SHARED_OPTS + +# The test/sample programs in the original tree link using rpath option. +# Make it optional for packagers. +if test -n "$LOCAL_LDFLAGS" +then + AC_MSG_CHECKING(if you want to link sample programs with rpath option) + AC_ARG_ENABLE(rpath-link, + [ --enable-rpath-link link sample programs with rpath option], + [with_rpath_link=$enableval], + [with_rpath_link=yes]) + AC_MSG_RESULT($with_rpath_link) + if test "$with_rpath_link" = no + then + LOCAL_LDFLAGS= + LOCAL_LDFLAGS2= + fi +fi + +############################################################################### +CF_HELP_MESSAGE(Fine-Tuning Your Configuration:) + +### use option --enable-broken-linker to force on use of broken-linker support +CF_ENABLE_BROKEN_LINKER + +# Check to define _XOPEN_SOURCE "automatically" +CF_XOPEN_SOURCE(600) +AC_CHECK_DECL(exit) + +CF_LARGEFILE + +### Enable compiling-in rcs id's +AC_MSG_CHECKING(if RCS identifiers should be compiled-in) +AC_ARG_WITH(rcs-ids, + [ --with-rcs-ids compile-in RCS identifiers], + [with_rcs_ids=$withval], + [with_rcs_ids=no]) +AC_MSG_RESULT($with_rcs_ids) +test "$with_rcs_ids" = yes && AC_DEFINE(USE_RCS_IDS,1,[Define to 1 if RCS identifiers should be compiled-in)]) + +############################################################################### +CF_HELP_MESSAGE(Extensions:) + +### Note that some functions (such as const) are normally disabled anyway. +AC_MSG_CHECKING(if you want to build with function extensions) +AC_ARG_ENABLE(ext-funcs, + [ --disable-ext-funcs disable function-extensions], + [with_ext_funcs=$enableval], + [with_ext_funcs=yes]) +AC_MSG_RESULT($with_ext_funcs) +if test "$with_ext_funcs" = yes ; then + NCURSES_EXT_FUNCS=1 + AC_DEFINE(HAVE_USE_DEFAULT_COLORS,1,[Define to 1 if we have use_default_colors function]) + AC_DEFINE(NCURSES_EXT_FUNCS,1,[Define to 1 if we have ncurses extended functions]) +else + NCURSES_EXT_FUNCS=0 +fi +AC_SUBST(NCURSES_EXT_FUNCS) + +### use option --enable-const to turn on use of const beyond that in XSI. +AC_MSG_CHECKING(for extended use of const keyword) +AC_ARG_ENABLE(const, + [ --enable-const compile with extra/non-standard const], + [with_ext_const=$enableval], + [with_ext_const=no]) +AC_MSG_RESULT($with_ext_const) +NCURSES_CONST='/*nothing*/' +if test "$with_ext_const" = yes ; then + NCURSES_CONST=const +fi +AC_SUBST(NCURSES_CONST) + +############################################################################### +# These options are relatively safe to experiment with. +CF_HELP_MESSAGE(Development Code:) +AC_MSG_CHECKING(if you want all development code) +AC_ARG_WITH(develop, + [ --without-develop disable development options], + [with_develop=$withval], + [with_develop=no]) +AC_MSG_RESULT($with_develop) + +############################################################################### +# These are just experimental, probably should not be in a package: +CF_HELP_MESSAGE(Experimental Code:) + +# This is still experimental (20080329), but should ultimately be moved to +# the script-block --with-normal, etc. +CF_WITH_PTHREAD + +AC_MSG_CHECKING(if you want to use weak-symbols for pthreads) +AC_ARG_ENABLE(weak-symbols, + [ --enable-weak-symbols enable weak-symbols for pthreads], + [use_weak_symbols=$withval], + [use_weak_symbols=no]) +AC_MSG_RESULT($use_weak_symbols) +if test "$use_weak_symbols" = yes ; then + CF_WEAK_SYMBOLS +else + cf_cv_weak_symbols=no +fi + +if test $cf_cv_weak_symbols = yes ; then + AC_DEFINE(USE_WEAK_SYMBOLS,1,[Define to 1 to enable weak-symbols for pthreads]) +fi + +PTHREAD= +if test "$with_pthread" = "yes" ; then + AC_DEFINE(USE_PTHREADS,1,[Define to 1 to use the pthreads library]) + enable_reentrant=yes + if test $cf_cv_weak_symbols = yes ; then + PTHREAD=-lpthread + fi +fi +AC_SUBST(PTHREAD) + +# OpenSUSE is installing ncurses6, using reentrant option. +AC_CHECK_FUNC(_nc_TABSIZE,[assume_reentrant=yes], [assume_reentrant=no]) + +# Reentrant code has to be opaque; there's little advantage to making ncurses +# opaque outside of that, so there is no --enable-opaque option. We can use +# this option without --with-pthreads, but this will be always set for +# pthreads. +AC_MSG_CHECKING(if you want experimental reentrant code) +AC_ARG_ENABLE(reentrant, + [ --enable-reentrant compile with experimental reentrant code], + [with_reentrant=$enableval], + [with_reentrant=$assume_reentrant]) +AC_MSG_RESULT($with_reentrant) +if test "$with_reentrant" = yes ; then + cf_cv_enable_reentrant=1 + if test $cf_cv_weak_symbols = yes ; then + CF_REMOVE_LIB(LIBS,$LIBS,pthread) + elif test "$assume_reentrant" = no ; then + LIB_SUFFIX="t${LIB_SUFFIX}" + fi + AC_DEFINE(USE_REENTRANT,1,[Define to 1 to compile with experimental reentrant code]) +else + cf_cv_enable_reentrant=0 +fi +AC_SUBST(cf_cv_enable_reentrant) + +### Allow using a different wrap-prefix +if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then + AC_MSG_CHECKING(for prefix used to wrap public variables) + AC_ARG_WITH(wrap-prefix, + [ --with-wrap-prefix=XXX override prefix used for public variables], + [NCURSES_WRAP_PREFIX=$withval], + [NCURSES_WRAP_PREFIX=_nc_]) + AC_MSG_RESULT($NCURSES_WRAP_PREFIX) +else + NCURSES_WRAP_PREFIX=_nc_ +fi +AC_SUBST(NCURSES_WRAP_PREFIX) +AC_DEFINE_UNQUOTED(NCURSES_WRAP_PREFIX,"$NCURSES_WRAP_PREFIX",[Define to override _nc_ ncurses internal prefix]) + +############################################################################### +CF_HELP_MESSAGE(Testing/development Options:) + +### use option --disable-echo to suppress full display compiling commands +CF_DISABLE_ECHO + +CF_ENABLE_WARNINGS(Wno-unknown-pragmas Wswitch-enum,yes) +if test "x$enable_warnings" = "xyes"; then + CF_ADD_ADAFLAGS(-gnatwa -gnatyg) +fi + +### use option --enable-assertions to turn on generation of assertion code +AC_MSG_CHECKING(if you want to enable runtime assertions) +AC_ARG_ENABLE(assertions, + [ --enable-assertions test: turn on generation of assertion code], + [with_assertions=$enableval], + [with_assertions=no]) +AC_MSG_RESULT($with_assertions) +if test -n "$GCC" +then + if test "$with_assertions" = no + then + CPPFLAGS="$CPPFLAGS -DNDEBUG" + else + CF_ADD_ADAFLAGS(-gnata) + fi +fi + +### use option --disable-leaks to suppress "permanent" leaks, for testing +AC_DEFINE(HAVE_NC_ALLOC_H,1,[Define to 1 if we have nc_alloc.h header]) + +### use option --enable-expanded to generate certain macros as functions +AC_ARG_ENABLE(expanded, + [ --enable-expanded test: generate functions for certain macros], + [test "$enableval" = yes && AC_DEFINE(NCURSES_EXPANDED,1,[Define to 1 if ncurses macros should be expanded as functions])]) + +### use option --disable-macros to suppress macros in favor of functions +AC_ARG_ENABLE(macros, + [ --disable-macros test: use functions rather than macros], + [test "$enableval" = no && AC_DEFINE(NCURSES_NOMACROS,1,[Define to 1 if ncurses macros should be expanded as functions])]) + +# Normally we only add trace() to the debug-library. Allow this to be +# extended to all models of the ncurses library: +cf_all_traces=no +case "$CFLAGS $CPPFLAGS" in +(*-DTRACE*) + cf_all_traces=yes + ;; +esac + +AC_MSG_CHECKING(whether to add trace feature to all models) +AC_ARG_WITH(trace, +[ --with-trace test: add trace() function to all models of ncurses], +[cf_with_trace=$withval], +[cf_with_trace=$cf_all_traces]) +AC_MSG_RESULT($cf_with_trace) + +if test "$cf_with_trace" = yes ; then + ADA_TRACE=TRUE + AC_DEFINE(TRACE,1,[Define to 1 if we have support trace functions]) +else + ADA_TRACE=FALSE +fi + +AC_SUBST(ADA_TRACE) + +CF_DISABLE_GNAT_PROJECTS + +### Checks for libraries. +case $cf_cv_system_name in +(*mingw32*) + CF_CHECK_LIBSSP + ;; +(*) + CF_FUNC_GETTIME + ;; +esac + +### Checks for header files. +AC_CHECK_SIZEOF([signed char]) +AC_HEADER_DIRENT +AC_HEADER_TIME + +### checks for compiler characteristics +AC_LANG_C +AC_C_CONST + +### Checks for external-data +CF_LINK_DATAONLY + +### Checks for library functions. +CF_MKSTEMP + +dnl We'll do our own -g libraries, unless the user's overridden via $CFLAGS +if test -z "$cf_user_CFLAGS" && test "$with_no_leaks" = no ; then + CF_STRIP_G_OPT(CFLAGS) + CF_STRIP_G_OPT(CXXFLAGS) +fi + +CF_HELP_MESSAGE(Ada95 Binding Options:) +cf_with_ada=yes +dnl Check for availability of GNU Ada Translator (GNAT). +dnl At the moment we support no other Ada95 compiler. +if test "$cf_with_ada" != "no" ; then + if test "$cf_cv_prog_gnat_correct" = yes; then + CF_FIXUP_ADAFLAGS + + CF_GNATPREP_OPT_T + + CF_GNAT_GENERICS + CF_GNAT_SIGINT + CF_GNAT_PROJECTS + + CF_WITH_ADA_COMPILER + + cf_ada_package=terminal_interface + AC_SUBST(cf_ada_package) + + CF_WITH_ADA_INCLUDE + CF_WITH_ADA_OBJECTS + CF_WITH_ADA_SHAREDLIB + + # allow the Ada binding to be renamed + CF_WITH_ADA_LIBNAME(AdaCurses) + else + AC_MSG_ERROR(No usable Ada compiler found) + fi +else + AC_MSG_ERROR(The Ada compiler is needed for this package) +fi + +################################################################################ + +# not needed +TINFO_LDFLAGS2= +AC_SUBST(TINFO_LDFLAGS2) +TINFO_LIBS= +AC_SUBST(TINFO_LIBS) + +### Construct the list of include-directories to be generated +CF_INCLUDE_DIRS +CF_ADA_INCLUDE_DIRS + +### Build up pieces for makefile rules +AC_MSG_CHECKING(default library suffix) +CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl +AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("") +AC_MSG_RESULT($DFT_ARG_SUFFIX) + +AC_MSG_CHECKING(default library-dependency suffix) +CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_LIB_SUFFIX,DFT_DEP_SUFFIX)dnl +AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a") +AC_MSG_RESULT($DFT_DEP_SUFFIX) + +AC_MSG_CHECKING(default object directory) +CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl +AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj") +AC_MSG_RESULT($DFT_OBJ_SUBDIR) + +### Set up low-level terminfo dependencies for makefiles. + +if test "$DFT_LWR_MODEL" = shared ; then + case $cf_cv_system_name in + (cygwin*) + # "lib" files have ".dll.a" suffix, "cyg" files have ".dll" + ;; + (msys*) + # "lib" files have ".dll.a" suffix, "msys-" files have ".dll" + ;; + esac +fi + +USE_ARG_SUFFIX=${DFT_ARG_SUFFIX} +AC_SUBST(USE_ARG_SUFFIX) + +USE_LIB_SUFFIX=${DFT_ARG_SUFFIX} +AC_SUBST(USE_LIB_SUFFIX) + +USE_CFG_SUFFIX=${DFT_ARG_SUFFIX} +AC_SUBST(USE_CFG_SUFFIX) + +### Construct the list of subdirectories for which we'll customize makefiles +### with the appropriate compile-rules. + +SUB_MAKEFILES="gen/adacurses${USE_ARG_SUFFIX}-config:gen/adacurses-config.in" + +AC_DEFINE_UNQUOTED(NCURSES_PATHSEP,'$PATH_SEPARATOR',[Define to override ':' as the library path-separator]) + +################################################################################ + +TEST_ARG2= +AC_SUBST(TEST_ARG2) + +TEST_LIBS2= +AC_SUBST(TEST_LIBS2) + +dnl for separate build, this is good enough for "sh $(top_srcdir)/misc/shlib" +NCURSES_SHLIB2="sh -c" +AC_SUBST(NCURSES_SHLIB2) + +ADA_SUBDIRS="include gen src doc" +if test "x$cf_with_tests" != "xno" ; then + ADA_SUBDIRS="$ADA_SUBDIRS samples" +fi +for cf_dir in $ADA_SUBDIRS +do + SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile" +done +AC_SUBST(ADA_SUBDIRS) + +NCURSES_TREE="#" +AC_SUBST(NCURSES_TREE) + +EXTERNAL_TREE= +AC_SUBST(EXTERNAL_TREE) + +# match layout used by make-tar.sh +ADAHTML_DIR=../doc/ada +AC_SUBST(ADAHTML_DIR) + +if test "x$cross_compiling" = xyes ; then + ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)' +else + ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)' +fi + +AC_SUBST(ADAGEN_LDFLAGS) + +AC_OUTPUT( \ + $SUB_MAKEFILES \ + src/library.gpr:src/library.gpr.in \ + doc/adacurses${DFT_ARG_SUFFIX}-config.1:doc/MKada_config.in \ + Makefile,[ +$AWK -v PACKAGE=$PACKAGE -f $srcdir/mk-pkg.awk > Makefile +if test -z "$USE_OLD_MAKERULES" ; then + $AWK -f $srcdir/mk-1st.awk <$srcdir/src/modules >>src/Makefile +fi +],[ +### Special initialization commands, used to pass information from the +### configuration-run into config.status + +AWK="$AWK" +DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX" +DFT_LWR_MODEL="$DFT_LWR_MODEL" +LIB_NAME="$LIB_NAME" +LIB_PREFIX="$LIB_PREFIX" +LIB_SUFFIX="$LIB_SUFFIX" +LN_S="$LN_S" +NCURSES_MAJOR="$NCURSES_MAJOR" +NCURSES_MINOR="$NCURSES_MINOR" +NCURSES_PATCH="$NCURSES_PATCH" +PACKAGE="$PACKAGE" +USE_OLD_MAKERULES="$USE_OLD_MAKERULES" +cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE +cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD +cf_cv_abi_version="$cf_cv_abi_version" +cf_cv_rel_version="$cf_cv_rel_version" +cf_cv_rm_so_locs="$cf_cv_rm_so_locs" +cf_cv_shared_soname='$cf_cv_shared_soname' +cf_cv_shlib_version="$cf_cv_shlib_version" +cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix" +cf_cv_system_name="$cf_cv_system_name" +host="$host" +target="$target" + +],cat)dnl +${MAKE:-make} preinstall diff --git a/contrib/ncurses/Ada95/doc/Makefile.in b/contrib/ncurses/Ada95/doc/Makefile.in new file mode 100644 index 00000000..f94a341f --- /dev/null +++ b/contrib/ncurses/Ada95/doc/Makefile.in @@ -0,0 +1,100 @@ +# $Id: Makefile.in,v 1.10 2024/08/10 18:18:19 tom Exp $ +############################################################################## +# Copyright 2019-2021,2024 Thomas E. Dickey # +# Copyright 2011-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# Makefile for AdaCurses manual pages. + +SHELL = @SHELL@ +VPATH = @srcdir@ + +DESTDIR = @DESTDIR@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +mandir = @mandir@ + +INSTALL = @INSTALL@ @INSTALL_OPT_O@ +INSTALL_DATA = @INSTALL_DATA@ + +DFT_ARG_SUFFIX = @DFT_ARG_SUFFIX@ + +THIS = @ADA_LIBNAME@ +DOCDIR = $(DESTDIR)$(datadir@MERGE_PREFIX@)/doc/$(THIS) +MANDIR = $(DESTDIR)$(mandir@MERGE_PREFIX@)/man1 + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.html +@MAKE_PHONY@.PHONY : install.man +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : lint +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.html +@MAKE_PHONY@.PHONY : uninstall.man + +all \ +sources \ +tags : + +$(DOCDIR) \ +$(MANDIR) : + mkdir -p $@ + +install install.man : $(MANDIR) + $(INSTALL_DATA) adacurses${DFT_ARG_SUFFIX}-config.1 $(MANDIR) + +uninstall uninstall.man : + -rm -f $(MANDIR)/adacurses${DFT_ARG_SUFFIX}-config.1 + +# HTML documentation is optional, usually in a separate package. +install.html : $(DOCDIR) + ( cd $(srcdir) && tar -cf - *.htm* ada | tar -C $(DOCDIR) -xf - ) + +uninstall.html : + -rm -rf $(DOCDIR) + +mostlyclean : + -rm -f core tags TAGS *~ *.bak *.ln *.atac trace + +clean: mostlyclean + +distclean realclean: clean + -rm -f Makefile *-config.1 diff --git a/contrib/ncurses/Ada95/gen/Makefile.in b/contrib/ncurses/Ada95/gen/Makefile.in new file mode 100644 index 00000000..135a493e --- /dev/null +++ b/contrib/ncurses/Ada95/gen/Makefile.in @@ -0,0 +1,385 @@ +############################################################################## +# Copyright 2019-2022,2024 Thomas E. Dickey # +# Copyright 1998-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Juergen Pfeifer, 1996 +# and: Thomas E. Dickey, 1997 +# +# $Id: Makefile.in,v 1.105 2024/08/10 17:55:15 tom Exp $ +# +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +x = @EXEEXT@ + +top_srcdir = @top_srcdir@ +DESTDIR = @DESTDIR@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +includedir = @includedir@ + +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) + +INSTALL = @INSTALL@ @INSTALL_OPT_O@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_DATA = @INSTALL_DATA@ + +AWK = @AWK@ +LN_S = @LN_S@ + +CC = @CC@ +HOST_CC = @BUILD_CC@ + +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ +HOST_CFLAGS = @BUILD_CFLAGS@ + +CPPFLAGS = @CPPFLAGS@ +HOST_CPPFLAGS = @ACPPFLAGS@ @BUILD_CPPFLAGS@ \ + -DHAVE_CONFIG_H -I$(srcdir) + +CCFLAGS = $(HOST_CPPFLAGS) $(HOST_CFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ +LOCAL_LIBDIR = @top_builddir@/lib + +LINK = $(HOST_CC) +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ + +# For the wide-character configuration combined with broken_linker, we need +# addresses of ACS_xxx constants, which requires linking with the newly built +# ncurses library. If cross-compiling, the developer has to fill in a workable +# native library for this purpose. +NATIVE_LDFLAGS = @LD_MODEL@ $(LOCAL_LIBS) @TINFO_LDFLAGS2@ $(LDFLAGS) @LIBS@ @LOCAL_LDFLAGS2@ $(LDFLAGS) @TINFO_LIBS@ +CROSS_LDFLAGS = @BUILD_LDFLAGS@ @BUILD_LIBS@ + +ACTUAL_LDFLAGS = @ADAGEN_LDFLAGS@ + +RANLIB = @RANLIB@ + +M4 = m4 +M4FLAGS = -DNCURSES_EXT_FUNCS=@NCURSES_EXT_FUNCS@ + +ADACURSES_CONFIG = adacurses@USE_CFG_SUFFIX@-config + +WRAPPER = @NCURSES_SHLIB2@ + +PROG_GENERATE = ./generate$x +GENERATE = $(PROG_GENERATE) '@USE_ARG_SUFFIX@' +DEL_ADAMODE = sed -e '/^\-\-\ \ \-\*\-\ ada\ \-\*\-.*/d' + +GNATHTML = `command -v gnathtml || command -v gnathtml.pl` + +################################################################################ +ALIB = @cf_ada_package@ +ABASE = $(ALIB)-curses + +ADA_SRCDIR = ../src + +GEN_TARGETS = options.m4 \ + $(ADA_SRCDIR)/$(ABASE).ads \ + $(ADA_SRCDIR)/$(ABASE).adb \ + $(ADA_SRCDIR)/$(ABASE)-aux.ads \ + $(ADA_SRCDIR)/$(ABASE)-trace.ads \ + $(ADA_SRCDIR)/$(ABASE)-menus.ads \ + $(ADA_SRCDIR)/$(ABASE)-forms.ads \ + $(ADA_SRCDIR)/$(ABASE)-mouse.ads \ + $(ADA_SRCDIR)/$(ABASE)-panels.ads \ + $(ADA_SRCDIR)/$(ABASE)-menus-menu_user_data.ads \ + $(ADA_SRCDIR)/$(ABASE)-menus-item_user_data.ads \ + $(ADA_SRCDIR)/$(ABASE)-forms-form_user_data.ads \ + $(ADA_SRCDIR)/$(ABASE)-forms-field_types.ads \ + $(ADA_SRCDIR)/$(ABASE)-forms-field_user_data.ads \ + $(ADA_SRCDIR)/$(ABASE)-panels-user_data.ads \ + $(ADA_SRCDIR)/$(ABASE)_constants.ads + +GEN_SRC = $(srcdir)/$(ABASE).ads.m4 \ + $(srcdir)/$(ABASE).adb.m4 \ + $(srcdir)/$(ABASE)-aux.ads.m4 \ + $(srcdir)/$(ABASE)-trace.ads.m4 \ + $(srcdir)/$(ABASE)-menus.ads.m4 \ + $(srcdir)/$(ABASE)-forms.ads.m4 \ + $(srcdir)/$(ABASE)-mouse.ads.m4 \ + $(srcdir)/$(ABASE)-panels.ads.m4 \ + $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 \ + $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 \ + $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 \ + $(srcdir)/$(ABASE)-forms-field_types.ads.m4 \ + $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 \ + $(srcdir)/$(ABASE)-panels-user_data.ads.m4 + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs : $(GEN_TARGETS) + @echo made $@ + +sources: + +$(BINDIR) : + mkdir -p $@ + +install \ +install.libs :: \ + $(GEN_TARGETS) \ + $(BINDIR) \ + $(ADACURSES_CONFIG) + $(INSTALL_SCRIPT) $(ADACURSES_CONFIG) $(BINDIR)/$(ADACURSES_CONFIG) + +uninstall \ +uninstall.libs :: + -rm -f $(BINDIR)/$(ADACURSES_CONFIG) + +$(PROG_GENERATE): gen.o + @ECHO_LD@ $(LINK) $(CFLAGS_NORMAL) gen.o $(ACTUAL_LDFLAGS) -o $@ + +gen.o: $(srcdir)/gen.c + $(HOST_CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/gen.c + +$(ADA_SRCDIR)/$(ABASE)_constants.ads: $(PROG_GENERATE) + $(WRAPPER) "$(GENERATE) $@" +################################################################################ +$(ADA_SRCDIR)/$(ABASE).ads: $(srcdir)/$(ABASE).ads.m4 \ + $(srcdir)/normal.m4 \ + options.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE).ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE).adb: $(srcdir)/$(ABASE).adb.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE).adb.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-aux.ads: $(srcdir)/$(ABASE)-aux.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-aux.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-trace.ads: $(srcdir)/$(ABASE)-trace.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-trace.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-menus.ads: $(srcdir)/$(ABASE)-menus.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-menus.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-forms.ads: $(srcdir)/$(ABASE)-forms.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-forms.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-mouse.ads: $(srcdir)/$(ABASE)-mouse.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-mouse.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-panels.ads: $(srcdir)/$(ABASE)-panels.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-panels.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-menus-menu_user_data.ads: \ + $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-menus-menu_user_data.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-menus-item_user_data.ads: \ + $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-menus-item_user_data.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-forms-form_user_data.ads: \ + $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-forms-form_user_data.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-forms-field_types.ads: \ + $(srcdir)/$(ABASE)-forms-field_types.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-forms-field_types.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-forms-field_user_data.ads: \ + $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-forms-field_user_data.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +$(ADA_SRCDIR)/$(ABASE)-panels-user_data.ads: \ + $(srcdir)/$(ABASE)-panels-user_data.ads.m4 \ + $(srcdir)/normal.m4 + $(M4) $(M4FLAGS) -DM4MACRO=$(srcdir)/normal.m4 \ + $(srcdir)/$(ABASE)-panels-user_data.ads.m4 |\ + $(DEL_ADAMODE) >$@ + +install.progs :: + +tags: + ctags *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ etags *.[ch] + +mostlyclean :: + -rm -f a.out core $(PROG_GENERATE) *.o + +clean :: mostlyclean + -rm -f options.m4 + -rm -f $(GEN_TARGETS) instab.tmp *.ad[bs] *.html *.ali *.tmp + +distclean :: clean + -rm -f $(ADACURSES_CONFIG) + -rm -f Makefile + +realclean :: distclean + +HTML_DIR = @ADAHTML_DIR@ + +options.m4 : + $(SHELL) -c "if [ @cf_cv_enable_sigwinch@ = 0 ]; \ + then \ + dashes=' --'; \ + else \ + dashes='';\ + fi; \ + echo \"define(OPT_KEY_RESIZE,\\\`\$$dashes')dnl\" > $@" + +instab.tmp : table.m4 $(GEN_SRC) + @rm -f $@ + @for f in $(GEN_SRC) ; do \ + $(M4) $(M4FLAGS) -DM4MACRO=table.m4 $$f | $(DEL_ADAMODE) >> $@ ;\ + done; + +TABLE_TITLE=Correspondence between ncurses C and Ada functions + +$(HTML_DIR)/table.html : instab.tmp + @-touch $@ + @-chmod +w $@ + @echo '' > $@ + @echo '' >> $@ + @echo '' >> $@ + @echo '$(TABLE_TITLE)' >>$@ + @echo '' >> $@ + @echo '' >> $@ + @echo '

$(TABLE_TITLE)

' >>$@ + @echo '

Sorted by C function name

' >>$@ + @echo '' >>$@ + @echo '' >>$@ + @echo '' >>$@ + @sort < instab.tmp >> $@ + @echo '
C nameAda nameman page
' >>$@ + @rm -f instab.tmp + +adahtml: + test -n "$(GNATHTML)" || exit 1 + @find $(HTML_DIR) -type f -exec rm -f {} \; + @mkdir -p $(HTML_DIR) + ( cp -p ../src/*.ad[sb] . && chmod +w *.ad[sb] ) +@USE_OLD_MAKERULES@ ln -sf ../src/*.ali . +@USE_GNAT_PROJECTS@ ln -sf ../static-ali/*.ali . + @echo "Filtering generated files" + @for f in $(GEN_SRC); do \ + h=`basename $$f` ;\ + g=`basename $$f .ads.m4` ;\ + if test "$$g" != "$$h" ; then \ + $(M4) $(M4FLAGS) -DM4MACRO=html.m4 $$f | $(DEL_ADAMODE) > $$g.ads ;\ + echo "... $$g.ads" ;\ + fi \ + done + @-rm -f $(HTML_DIR)/$(ALIB)*.htm* + $(GNATHTML) -d -f $(ALIB)*.ads + for f in html/$(ALIB)*.htm*; do \ + a=`basename $$f` ; \ + sed -e 's/You may also.*body.*//' <$$f |\ + sed -e 's%\%GNAT%g' |\ + sed -e 's%<A HREF%%g' |\ + sed -e 's%#1A\([[:space:]]*NAME="[^"]*"\)#2%%' |\ + sed -e 's%#1/A#2%%' |\ + sed -e 's/3X/3x/g' |\ + sed -e 's/$$\([ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxz0123456789_]*:.*\)\$$/@\1@/' |\ + sed -e 's%</A>%%g' > $$a.tmp ;\ + mv $$a.tmp $$f ;\ + done + @rm -f *.ad[sb] *.ali *.tmp + @for f in funcs.htm main.htm ; do \ + sed -e "\%\[ \]%d" < html/$$f > $$f ;\ + mv $$f html/$$f ;\ + done + @rm -f "html/funcs/ .htm" + @cp -pdrf html/* $(HTML_DIR)/ + @rm -rf html + +html : adahtml $(HTML_DIR)/table.html + @echo made $@ + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/Ada95/gen/adacurses-config.in b/contrib/ncurses/Ada95/gen/adacurses-config.in new file mode 100644 index 00000000..a5394170 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/adacurses-config.in @@ -0,0 +1,83 @@ +#! /bin/sh +# $Id: adacurses-config.in,v 1.15 2022/07/16 21:16:43 tom Exp $ +############################################################################## +# Copyright 2019-2020,2022 Thomas E. Dickey # +# Copyright 2007-2014,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# This script returns the options to add to `gnatmake' for using AdaCurses. + +DESTDIR=@DESTDIR@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ + +ADA_INCLUDE=@ADA_INCLUDE@ +ADA_OBJECTS=@ADA_OBJECTS@ + +VERSION=@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@ + +CFLAGS="-aI$ADA_INCLUDE -aO$ADA_OBJECTS" +LIBS="-L$ADA_OBJECTS -l@ADA_LIBNAME@" + +THIS="@ADA_LIBNAME@" +THIS_CFG="${THIS}@DFT_ARG_SUFFIX@-config" + +case "x$1" in + x--version) + echo @ADA_LIBNAME@ $VERSION + ;; + x--cflags) + echo "$CFLAGS" + ;; + x--libs) + echo "$LIBS" + ;; + x) + # if no parameter is given, give what gnatmake needs + echo "$CFLAGS -largs $LIBS" + ;; + x--help) + cat <&2 + exit 1 + ;; +esac diff --git a/contrib/ncurses/Ada95/gen/gen.c b/contrib/ncurses/Ada95/gen/gen.c new file mode 100644 index 00000000..b37de1b0 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/gen.c @@ -0,0 +1,582 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2014,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1996 * + * and: Thomas E. Dickey, 1998 * + * and: Nicolas Boulenguez, 2011 * + ****************************************************************************/ + +/* + Version Control + $Id: gen.c,v 1.79 2024/01/19 13:41:45 tom Exp $ + --------------------------------------------------------------------------*/ +/* + This program prints on its standard output the source for the + Terminal_Interface.Curses_Constants Ada package specification. This pure + package only exports C constants to the Ada compiler. + */ + +#ifdef HAVE_CONFIG_H +#include +#else +#include +#endif + +#include +#include + +#include +#include + +#undef UCHAR +#undef UINT +#undef ULONG + +typedef unsigned char UCHAR; +typedef unsigned int UINT; +typedef unsigned long ULONG; + +/* These global variables will be set by main () */ +static int little_endian; +static const char *my_program_invocation_name = NULL; + +static void +my_error(const char *message) +{ + fprintf(stderr, "%s: %s\n", my_program_invocation_name, message); + exit(EXIT_FAILURE); +} + +static void +print_constant(FILE * fp, + const char *name, + UINT value) +{ + fprintf(fp, " %-28s : constant := %u;\n", name, value); +} + +static void +print_long_val(FILE * fp, + const char *name, + long value) +{ + fprintf(fp, " %-28s : constant := %ld;\n", name, value); +} + +static void +print_size_of(FILE * fp, + const char *name, + size_t value) +{ + fprintf(fp, " %-28s : constant := %lu;\n", name, (unsigned long)value); +} + +#define PRINT_NAMED_CONSTANT(name) \ + print_long_val (fp, #name, name) + +static void +print_comment(FILE * fp, const char *message) +{ + fprintf(fp, "\n -- %s\n\n", message); +} + +/* + * Make sure that KEY_MIN and KEY_MAX are defined. + * main () will protest if KEY_MIN == 256 + */ +#ifndef KEY_MAX +# define KEY_MAX 0777 +#endif +#ifndef KEY_MIN +# define KEY_MIN 0401 +#endif + +static UCHAR +bit_is_set(const UCHAR * const data, + const UINT offset) +{ + const UCHAR byte = data[offset >> 3]; + UINT bit; + + if (little_endian) + bit = offset; /* offset */ + else /* or */ + bit = ~offset; /* 7 - offset */ + bit &= 7; /* modulo 8 */ + return (UCHAR) (byte & (1 << bit)); +} + +/* Find lowest and highest used offset in a byte array. */ +/* Returns 0 if and only if all bits are unset. */ +static int +find_pos(const UCHAR * const data, + const UINT sizeof_data, + UINT * const low, + UINT * const high) +{ + const UINT last = (sizeof_data << 3) - 1; + UINT offset; + + for (offset = last; !bit_is_set(data, offset); offset--) + if (!offset) /* All bits are 0. */ + return 0; + *high = offset; + + for (offset = 0; !bit_is_set(data, offset); offset++) + { + } + *low = offset; + + return -1; +} + +#define PRINT_BITMASK(c_type, ada_name, mask_macro) \ + { \ + UINT first, last; \ + c_type mask = (mask_macro); \ + if (!find_pos ((UCHAR *)&mask, sizeof (mask), &first, &last)) \ + my_error ("failed to locate " ada_name); \ + print_constant (fp, ada_name "_First", first); \ + print_constant (fp, ada_name "_Last", last); \ + } + +#define PRINT_NAMED_BITMASK(c_type, mask_macro) \ + PRINT_BITMASK (c_type, #mask_macro, mask_macro) + +#define STRUCT_OFFSET(record, field) \ + { \ + UINT first, last; \ + record mask; \ + memset (&mask, 0, sizeof (mask)); \ + memset (&mask.field, 0xff, sizeof(mask.field)); \ + if (!find_pos ((UCHAR *)&mask, sizeof (mask), &first, &last)) \ + my_error ("failed to locate" #record "_" #field); \ + print_constant (fp, #record "_" #field "_First", first); \ + print_constant (fp, #record "_" #field "_Last", last); \ + } + +/*--------------------*/ +/* Start of main (). */ +/*--------------------*/ + +int +main(int argc, const char *argv[]) +{ + FILE *fp = 0; + const int x = 0x12345678; + + little_endian = (*((const char *)&x) == 0x78); + + my_program_invocation_name = argv[0]; + + if (KEY_MIN == 256) + my_error("unexpected value for KEY_MIN: 256"); + + if (argc == 3) + { + fp = fopen(argv[2], "wb"); + } + else if (argc == 2) + { + fp = stdout; + } + else + { + my_error("Only one or two arguments expected (DFT_ARG_SUFFIX)"); + } + + if ((strlen(argv[0]) + strlen(__FILE__)) > 25) + { + fprintf(fp, "-- Generated by the C program %.40s.\n", + my_program_invocation_name); + } + else + { + fprintf(fp, "-- Generated by the C program %s (source %s).\n", + my_program_invocation_name, + __FILE__); + } + fprintf(fp, "-- Do not edit this file directly.\n"); + fprintf(fp, "-- The values provided here may vary on your system.\n"); + fprintf(fp, "\n"); + fprintf(fp, "with System;\n"); + fprintf(fp, "package Terminal_Interface.Curses_Constants is\n"); + fprintf(fp, " pragma Pure;\n"); + fprintf(fp, "\n"); + + fprintf(fp, " DFT_ARG_SUFFIX : constant String := \"%s\";\n", argv[1]); + fprintf(fp, + " Bit_Order : constant System.Bit_Order := System.%s_Order_First;\n", + little_endian ? "Low" : "High"); + print_size_of(fp, "Sizeof_Bool", 8 * sizeof(bool)); + + PRINT_NAMED_CONSTANT(OK); + PRINT_NAMED_CONSTANT(ERR); + fprintf(fp, + " pragma Warnings (Off); -- redefinition of Standard.True and False\n"); + PRINT_NAMED_CONSTANT(TRUE); + PRINT_NAMED_CONSTANT(FALSE); + fprintf(fp, " pragma Warnings (On);\n"); + + print_comment(fp, "Version of the ncurses library from extensions(3NCURSES)"); + PRINT_NAMED_CONSTANT(NCURSES_VERSION_MAJOR); + PRINT_NAMED_CONSTANT(NCURSES_VERSION_MINOR); + fprintf(fp, " Version : constant String := \"%d.%d\";\n", + NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR); + + print_comment(fp, "Character non-color attributes from attr(3NCURSES)"); + fprintf(fp, " -- attr_t and chtype may be signed in C.\n"); + fprintf(fp, " type attr_t is mod 2 ** %lu;\n", (long unsigned)(8 * sizeof(attr_t))); + PRINT_NAMED_BITMASK(attr_t, A_CHARTEXT); + PRINT_NAMED_BITMASK(attr_t, A_COLOR); + PRINT_BITMASK(attr_t, "Attr", A_ATTRIBUTES & ~A_COLOR); + PRINT_NAMED_BITMASK(attr_t, A_STANDOUT); + PRINT_NAMED_BITMASK(attr_t, A_UNDERLINE); + PRINT_NAMED_BITMASK(attr_t, A_REVERSE); + PRINT_NAMED_BITMASK(attr_t, A_BLINK); + PRINT_NAMED_BITMASK(attr_t, A_DIM); + PRINT_NAMED_BITMASK(attr_t, A_BOLD); + PRINT_NAMED_BITMASK(attr_t, A_PROTECT); + PRINT_NAMED_BITMASK(attr_t, A_INVIS); + PRINT_NAMED_BITMASK(attr_t, A_ALTCHARSET); + PRINT_NAMED_BITMASK(attr_t, A_HORIZONTAL); + PRINT_NAMED_BITMASK(attr_t, A_LEFT); + PRINT_NAMED_BITMASK(attr_t, A_LOW); + PRINT_NAMED_BITMASK(attr_t, A_RIGHT); + PRINT_NAMED_BITMASK(attr_t, A_TOP); + PRINT_NAMED_BITMASK(attr_t, A_VERTICAL); + print_size_of(fp, "chtype_Size", 8 * sizeof(chtype)); + + print_comment(fp, "predefined color numbers from color(3NCURSES)"); + PRINT_NAMED_CONSTANT(COLOR_BLACK); + PRINT_NAMED_CONSTANT(COLOR_RED); + PRINT_NAMED_CONSTANT(COLOR_GREEN); + PRINT_NAMED_CONSTANT(COLOR_YELLOW); + PRINT_NAMED_CONSTANT(COLOR_BLUE); + PRINT_NAMED_CONSTANT(COLOR_MAGENTA); + PRINT_NAMED_CONSTANT(COLOR_CYAN); + PRINT_NAMED_CONSTANT(COLOR_WHITE); + + print_comment(fp, "ETI return codes from ncurses.h"); + PRINT_NAMED_CONSTANT(E_OK); + PRINT_NAMED_CONSTANT(E_SYSTEM_ERROR); + PRINT_NAMED_CONSTANT(E_BAD_ARGUMENT); + PRINT_NAMED_CONSTANT(E_POSTED); + PRINT_NAMED_CONSTANT(E_CONNECTED); + PRINT_NAMED_CONSTANT(E_BAD_STATE); + PRINT_NAMED_CONSTANT(E_NO_ROOM); + PRINT_NAMED_CONSTANT(E_NOT_POSTED); + PRINT_NAMED_CONSTANT(E_UNKNOWN_COMMAND); + PRINT_NAMED_CONSTANT(E_NO_MATCH); + PRINT_NAMED_CONSTANT(E_NOT_SELECTABLE); + PRINT_NAMED_CONSTANT(E_NOT_CONNECTED); + PRINT_NAMED_CONSTANT(E_REQUEST_DENIED); + PRINT_NAMED_CONSTANT(E_INVALID_FIELD); + PRINT_NAMED_CONSTANT(E_CURRENT); + + print_comment(fp, "Input key codes not defined in any ncurses manpage"); + PRINT_NAMED_CONSTANT(KEY_MIN); + PRINT_NAMED_CONSTANT(KEY_MAX); +#ifdef KEY_CODE_YES + PRINT_NAMED_CONSTANT(KEY_CODE_YES); +#endif + + print_comment(fp, "Input key codes from getch(3NCURSES)"); + PRINT_NAMED_CONSTANT(KEY_BREAK); + PRINT_NAMED_CONSTANT(KEY_DOWN); + PRINT_NAMED_CONSTANT(KEY_UP); + PRINT_NAMED_CONSTANT(KEY_LEFT); + PRINT_NAMED_CONSTANT(KEY_RIGHT); + PRINT_NAMED_CONSTANT(KEY_HOME); + PRINT_NAMED_CONSTANT(KEY_BACKSPACE); + PRINT_NAMED_CONSTANT(KEY_F0); +#define PRINT_NAMED_FUNC_KEY(name) print_constant(fp, "KEY_F"#name, KEY_F(name)) + PRINT_NAMED_FUNC_KEY(1); + PRINT_NAMED_FUNC_KEY(2); + PRINT_NAMED_FUNC_KEY(3); + PRINT_NAMED_FUNC_KEY(4); + PRINT_NAMED_FUNC_KEY(5); + PRINT_NAMED_FUNC_KEY(6); + PRINT_NAMED_FUNC_KEY(7); + PRINT_NAMED_FUNC_KEY(8); + PRINT_NAMED_FUNC_KEY(9); + PRINT_NAMED_FUNC_KEY(10); + PRINT_NAMED_FUNC_KEY(11); + PRINT_NAMED_FUNC_KEY(12); + PRINT_NAMED_FUNC_KEY(13); + PRINT_NAMED_FUNC_KEY(14); + PRINT_NAMED_FUNC_KEY(15); + PRINT_NAMED_FUNC_KEY(16); + PRINT_NAMED_FUNC_KEY(17); + PRINT_NAMED_FUNC_KEY(18); + PRINT_NAMED_FUNC_KEY(19); + PRINT_NAMED_FUNC_KEY(20); + PRINT_NAMED_FUNC_KEY(21); + PRINT_NAMED_FUNC_KEY(22); + PRINT_NAMED_FUNC_KEY(23); + PRINT_NAMED_FUNC_KEY(24); + PRINT_NAMED_CONSTANT(KEY_DL); + PRINT_NAMED_CONSTANT(KEY_IL); + PRINT_NAMED_CONSTANT(KEY_DC); + PRINT_NAMED_CONSTANT(KEY_IC); + PRINT_NAMED_CONSTANT(KEY_EIC); + PRINT_NAMED_CONSTANT(KEY_CLEAR); + PRINT_NAMED_CONSTANT(KEY_EOS); + PRINT_NAMED_CONSTANT(KEY_EOL); + PRINT_NAMED_CONSTANT(KEY_SF); + PRINT_NAMED_CONSTANT(KEY_SR); + PRINT_NAMED_CONSTANT(KEY_NPAGE); + PRINT_NAMED_CONSTANT(KEY_PPAGE); + PRINT_NAMED_CONSTANT(KEY_STAB); + PRINT_NAMED_CONSTANT(KEY_CTAB); + PRINT_NAMED_CONSTANT(KEY_CATAB); + PRINT_NAMED_CONSTANT(KEY_ENTER); + PRINT_NAMED_CONSTANT(KEY_SRESET); + PRINT_NAMED_CONSTANT(KEY_RESET); + PRINT_NAMED_CONSTANT(KEY_PRINT); + PRINT_NAMED_CONSTANT(KEY_LL); + PRINT_NAMED_CONSTANT(KEY_A1); + PRINT_NAMED_CONSTANT(KEY_A3); + PRINT_NAMED_CONSTANT(KEY_B2); + PRINT_NAMED_CONSTANT(KEY_C1); + PRINT_NAMED_CONSTANT(KEY_C3); + PRINT_NAMED_CONSTANT(KEY_BTAB); + PRINT_NAMED_CONSTANT(KEY_BEG); + PRINT_NAMED_CONSTANT(KEY_CANCEL); + PRINT_NAMED_CONSTANT(KEY_CLOSE); + PRINT_NAMED_CONSTANT(KEY_COMMAND); + PRINT_NAMED_CONSTANT(KEY_COPY); + PRINT_NAMED_CONSTANT(KEY_CREATE); + PRINT_NAMED_CONSTANT(KEY_END); + PRINT_NAMED_CONSTANT(KEY_EXIT); + PRINT_NAMED_CONSTANT(KEY_FIND); + PRINT_NAMED_CONSTANT(KEY_HELP); + PRINT_NAMED_CONSTANT(KEY_MARK); + PRINT_NAMED_CONSTANT(KEY_MESSAGE); + PRINT_NAMED_CONSTANT(KEY_MOVE); + PRINT_NAMED_CONSTANT(KEY_NEXT); + PRINT_NAMED_CONSTANT(KEY_OPEN); + PRINT_NAMED_CONSTANT(KEY_OPTIONS); + PRINT_NAMED_CONSTANT(KEY_PREVIOUS); + PRINT_NAMED_CONSTANT(KEY_REDO); + PRINT_NAMED_CONSTANT(KEY_REFERENCE); + PRINT_NAMED_CONSTANT(KEY_REFRESH); + PRINT_NAMED_CONSTANT(KEY_REPLACE); + PRINT_NAMED_CONSTANT(KEY_RESTART); + PRINT_NAMED_CONSTANT(KEY_RESUME); + PRINT_NAMED_CONSTANT(KEY_SAVE); + PRINT_NAMED_CONSTANT(KEY_SBEG); + PRINT_NAMED_CONSTANT(KEY_SCANCEL); + PRINT_NAMED_CONSTANT(KEY_SCOMMAND); + PRINT_NAMED_CONSTANT(KEY_SCOPY); + PRINT_NAMED_CONSTANT(KEY_SCREATE); + PRINT_NAMED_CONSTANT(KEY_SDC); + PRINT_NAMED_CONSTANT(KEY_SDL); + PRINT_NAMED_CONSTANT(KEY_SELECT); + PRINT_NAMED_CONSTANT(KEY_SEND); + PRINT_NAMED_CONSTANT(KEY_SEOL); + PRINT_NAMED_CONSTANT(KEY_SEXIT); + PRINT_NAMED_CONSTANT(KEY_SFIND); + PRINT_NAMED_CONSTANT(KEY_SHELP); + PRINT_NAMED_CONSTANT(KEY_SHOME); + PRINT_NAMED_CONSTANT(KEY_SIC); + PRINT_NAMED_CONSTANT(KEY_SLEFT); + PRINT_NAMED_CONSTANT(KEY_SMESSAGE); + PRINT_NAMED_CONSTANT(KEY_SMOVE); + PRINT_NAMED_CONSTANT(KEY_SNEXT); + PRINT_NAMED_CONSTANT(KEY_SOPTIONS); + PRINT_NAMED_CONSTANT(KEY_SPREVIOUS); + PRINT_NAMED_CONSTANT(KEY_SPRINT); + PRINT_NAMED_CONSTANT(KEY_SREDO); + PRINT_NAMED_CONSTANT(KEY_SREPLACE); + PRINT_NAMED_CONSTANT(KEY_SRIGHT); + PRINT_NAMED_CONSTANT(KEY_SRSUME); + PRINT_NAMED_CONSTANT(KEY_SSAVE); + PRINT_NAMED_CONSTANT(KEY_SSUSPEND); + PRINT_NAMED_CONSTANT(KEY_SUNDO); + PRINT_NAMED_CONSTANT(KEY_SUSPEND); + PRINT_NAMED_CONSTANT(KEY_UNDO); + PRINT_NAMED_CONSTANT(KEY_MOUSE); +#ifdef KEY_RESIZE + PRINT_NAMED_CONSTANT(KEY_RESIZE); +#endif + + print_comment(fp, "alternate character codes (ACS) from addch(3NCURSES)"); +#define PRINT_ACS(name) print_size_of (fp, #name, (size_t)(&name - &acs_map[0])) + PRINT_ACS(ACS_ULCORNER); + PRINT_ACS(ACS_LLCORNER); + PRINT_ACS(ACS_URCORNER); + PRINT_ACS(ACS_LRCORNER); + PRINT_ACS(ACS_LTEE); + PRINT_ACS(ACS_RTEE); + PRINT_ACS(ACS_BTEE); + PRINT_ACS(ACS_TTEE); + PRINT_ACS(ACS_HLINE); + PRINT_ACS(ACS_VLINE); + PRINT_ACS(ACS_PLUS); + PRINT_ACS(ACS_S1); + PRINT_ACS(ACS_S9); + PRINT_ACS(ACS_DIAMOND); + PRINT_ACS(ACS_CKBOARD); + PRINT_ACS(ACS_DEGREE); + PRINT_ACS(ACS_PLMINUS); + PRINT_ACS(ACS_BULLET); + PRINT_ACS(ACS_LARROW); + PRINT_ACS(ACS_RARROW); + PRINT_ACS(ACS_DARROW); + PRINT_ACS(ACS_UARROW); + PRINT_ACS(ACS_BOARD); + PRINT_ACS(ACS_LANTERN); + PRINT_ACS(ACS_BLOCK); + PRINT_ACS(ACS_S3); + PRINT_ACS(ACS_S7); + PRINT_ACS(ACS_LEQUAL); + PRINT_ACS(ACS_GEQUAL); + PRINT_ACS(ACS_PI); + PRINT_ACS(ACS_NEQUAL); + PRINT_ACS(ACS_STERLING); + + print_comment(fp, "Menu_Options from opts(3MENU)"); + PRINT_NAMED_BITMASK(Menu_Options, O_ONEVALUE); + PRINT_NAMED_BITMASK(Menu_Options, O_SHOWDESC); + PRINT_NAMED_BITMASK(Menu_Options, O_ROWMAJOR); + PRINT_NAMED_BITMASK(Menu_Options, O_IGNORECASE); + PRINT_NAMED_BITMASK(Menu_Options, O_SHOWMATCH); + PRINT_NAMED_BITMASK(Menu_Options, O_NONCYCLIC); + print_size_of(fp, "Menu_Options_Size", 8 * sizeof(Menu_Options)); + + print_comment(fp, "Item_Options from menu_opts(3MENU)"); + PRINT_NAMED_BITMASK(Item_Options, O_SELECTABLE); + print_size_of(fp, "Item_Options_Size", 8 * sizeof(Item_Options)); + + print_comment(fp, "Field_Options from field_opts(3FORM)"); + PRINT_NAMED_BITMASK(Field_Options, O_VISIBLE); + PRINT_NAMED_BITMASK(Field_Options, O_ACTIVE); + PRINT_NAMED_BITMASK(Field_Options, O_PUBLIC); + PRINT_NAMED_BITMASK(Field_Options, O_EDIT); + PRINT_NAMED_BITMASK(Field_Options, O_WRAP); + PRINT_NAMED_BITMASK(Field_Options, O_BLANK); + PRINT_NAMED_BITMASK(Field_Options, O_AUTOSKIP); + PRINT_NAMED_BITMASK(Field_Options, O_NULLOK); + PRINT_NAMED_BITMASK(Field_Options, O_PASSOK); + PRINT_NAMED_BITMASK(Field_Options, O_STATIC); + print_size_of(fp, "Field_Options_Size", 8 * sizeof(Field_Options)); + + print_comment(fp, "Field_Options from opts(3FORM)"); + PRINT_NAMED_BITMASK(Field_Options, O_NL_OVERLOAD); + PRINT_NAMED_BITMASK(Field_Options, O_BS_OVERLOAD); + + /* Field_Options_Size is defined below */ + + print_comment(fp, "MEVENT structure from mouse(3NCURSES)"); + STRUCT_OFFSET(MEVENT, id); + STRUCT_OFFSET(MEVENT, x); + STRUCT_OFFSET(MEVENT, y); + STRUCT_OFFSET(MEVENT, z); + STRUCT_OFFSET(MEVENT, bstate); + print_size_of(fp, "MEVENT_Size", 8 * sizeof(MEVENT)); + + print_comment(fp, "mouse events from mouse(3NCURSES)"); + { + mmask_t all_events; + +#define PRINT_MOUSE_EVENT(event) \ + print_constant (fp, #event, event); \ + all_events |= event + + all_events = 0; + PRINT_MOUSE_EVENT(BUTTON1_RELEASED); + PRINT_MOUSE_EVENT(BUTTON1_PRESSED); + PRINT_MOUSE_EVENT(BUTTON1_CLICKED); + PRINT_MOUSE_EVENT(BUTTON1_DOUBLE_CLICKED); + PRINT_MOUSE_EVENT(BUTTON1_TRIPLE_CLICKED); +#ifdef BUTTON1_RESERVED_EVENT + PRINT_MOUSE_EVENT(BUTTON1_RESERVED_EVENT); +#endif + print_constant(fp, "all_events_button_1", (UINT) all_events); + + all_events = 0; + PRINT_MOUSE_EVENT(BUTTON2_RELEASED); + PRINT_MOUSE_EVENT(BUTTON2_PRESSED); + PRINT_MOUSE_EVENT(BUTTON2_CLICKED); + PRINT_MOUSE_EVENT(BUTTON2_DOUBLE_CLICKED); + PRINT_MOUSE_EVENT(BUTTON2_TRIPLE_CLICKED); +#ifdef BUTTON2_RESERVED_EVENT + PRINT_MOUSE_EVENT(BUTTON2_RESERVED_EVENT); +#endif + print_constant(fp, "all_events_button_2", (UINT) all_events); + + all_events = 0; + PRINT_MOUSE_EVENT(BUTTON3_RELEASED); + PRINT_MOUSE_EVENT(BUTTON3_PRESSED); + PRINT_MOUSE_EVENT(BUTTON3_CLICKED); + PRINT_MOUSE_EVENT(BUTTON3_DOUBLE_CLICKED); + PRINT_MOUSE_EVENT(BUTTON3_TRIPLE_CLICKED); +#ifdef BUTTON3_RESERVED_EVENT + PRINT_MOUSE_EVENT(BUTTON3_RESERVED_EVENT); +#endif + print_constant(fp, "all_events_button_3", (UINT) all_events); + + all_events = 0; + PRINT_MOUSE_EVENT(BUTTON4_RELEASED); + PRINT_MOUSE_EVENT(BUTTON4_PRESSED); + PRINT_MOUSE_EVENT(BUTTON4_CLICKED); + PRINT_MOUSE_EVENT(BUTTON4_DOUBLE_CLICKED); + PRINT_MOUSE_EVENT(BUTTON4_TRIPLE_CLICKED); +#ifdef BUTTON4_RESERVED_EVENT + PRINT_MOUSE_EVENT(BUTTON4_RESERVED_EVENT); +#endif + print_constant(fp, "all_events_button_4", (UINT) all_events); + } + PRINT_NAMED_CONSTANT(BUTTON_CTRL); + PRINT_NAMED_CONSTANT(BUTTON_SHIFT); + PRINT_NAMED_CONSTANT(BUTTON_ALT); + PRINT_NAMED_CONSTANT(REPORT_MOUSE_POSITION); + PRINT_NAMED_CONSTANT(ALL_MOUSE_EVENTS); + + print_comment(fp, "trace selection from trace(3NCURSES)"); + PRINT_NAMED_BITMASK(UINT, TRACE_TIMES); + PRINT_NAMED_BITMASK(UINT, TRACE_TPUTS); + PRINT_NAMED_BITMASK(UINT, TRACE_UPDATE); + PRINT_NAMED_BITMASK(UINT, TRACE_MOVE); + PRINT_NAMED_BITMASK(UINT, TRACE_CHARPUT); + PRINT_NAMED_BITMASK(UINT, TRACE_CALLS); + PRINT_NAMED_BITMASK(UINT, TRACE_VIRTPUT); + PRINT_NAMED_BITMASK(UINT, TRACE_IEVENT); + PRINT_NAMED_BITMASK(UINT, TRACE_BITS); + PRINT_NAMED_BITMASK(UINT, TRACE_ICALLS); + PRINT_NAMED_BITMASK(UINT, TRACE_CCALLS); + PRINT_NAMED_BITMASK(UINT, TRACE_DATABASE); + PRINT_NAMED_BITMASK(UINT, TRACE_ATTRS); + print_size_of(fp, "Trace_Size", 8 * sizeof(UINT)); + + fprintf(fp, "end Terminal_Interface.Curses_Constants;\n"); + exit(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/Ada95/gen/html.m4 b/contrib/ncurses/Ada95/gen/html.m4 new file mode 100644 index 00000000..22374f6b --- /dev/null +++ b/contrib/ncurses/Ada95/gen/html.m4 @@ -0,0 +1,41 @@ +dnl*************************************************************************** +dnl Copyright 2019,2020 Thomas E. Dickey * +dnl Copyright 2000-2006,2007 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl $Id: html.m4,v 1.5 2020/02/02 23:34:34 tom Exp $ +define(`ANCHORIDX',`0')dnl +define(`MANPAGE',`define(`MANPG',$1)dnl +|===================================================================== + -- | Man page MANPG + -- |=====================================================================')dnl +define(`ANCHOR',`define(`ANCHORIDX',incr(ANCHORIDX))dnl +`#'1A NAME="AFU`_'ANCHORIDX"`#'2dnl +define(`CFUNAME',`$1')define(`AFUNAME',`$2')dnl +|#1/A#2')dnl +define(`AKA',``AKA': CFUNAME')dnl +define(`ALIAS',``AKA': $1')dnl diff --git a/contrib/ncurses/Ada95/gen/normal.m4 b/contrib/ncurses/Ada95/gen/normal.m4 new file mode 100644 index 00000000..51327027 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/normal.m4 @@ -0,0 +1,38 @@ +dnl*************************************************************************** +dnl Copyright 2020 Thomas E. Dickey * +dnl Copyright 1998,2006 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl $Id: normal.m4,v 1.3 2020/02/02 23:34:34 tom Exp $ +define(`MANPAGE',`define(`MANPG',$1)dnl +|===================================================================== + -- | Man page MANPG + -- |=====================================================================')dnl +define(`ANCHOR',`define(`CFUNAME',`$1')define(`AFUNAME',`$2')'dnl +|)dnl +define(`AKA',``AKA': CFUNAME')dnl +define(`ALIAS',``AKA': $1')dnl diff --git a/contrib/ncurses/Ada95/gen/table.m4 b/contrib/ncurses/Ada95/gen/table.m4 new file mode 100644 index 00000000..7de07d3c --- /dev/null +++ b/contrib/ncurses/Ada95/gen/table.m4 @@ -0,0 +1,36 @@ +dnl*************************************************************************** +dnl Copyright 2020 Thomas E. Dickey * +dnl Copyright 2000,2006 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl $Id: table.m4,v 1.3 2020/02/02 23:34:34 tom Exp $ +define(`ANCHORIDX',`0')dnl +define(`MANPAGE',`define(`MANPG',$1)')dnl +divert(-1)dnl +define(`ANCHOR',`divert(0)define(`ANCHORIDX',incr(ANCHORIDX))dnl +$1$2MANPG +divert(-1)') diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-aux.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-aux.ads.m4 new file mode 100644 index 00000000..94eaad87 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-aux.ads.m4 @@ -0,0 +1,121 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-aux__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Aux -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1998-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.25 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System; +with Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; + +package Terminal_Interface.Curses.Aux is + pragma Preelaborate (Terminal_Interface.Curses.Aux); + + subtype C_Int is Interfaces.C.int; + subtype C_Short is Interfaces.C.short; + subtype C_Long_Int is Interfaces.C.long; + subtype C_Size_T is Interfaces.C.size_t; + subtype C_UInt is Interfaces.C.unsigned; + subtype C_ULong is Interfaces.C.unsigned_long; + subtype C_Char_Ptr is Interfaces.C.Strings.chars_ptr; + type C_Void_Ptr is new System.Address; + + -- This is how those constants are defined in ncurses. I see them also + -- exactly like this in all ETI implementations I ever tested. So it + -- could be that this is quite general, but please check with your curses. + -- This is critical, because curses sometime mixes Boolean returns with + -- returning an error status. + Curses_Ok : constant C_Int := Curses_Constants.OK; + Curses_Err : constant C_Int := Curses_Constants.ERR; + + Curses_True : constant C_Int := Curses_Constants.TRUE; + Curses_False : constant C_Int := Curses_Constants.FALSE; + + -- Eti_Error: type for error codes returned by the menu and form subsystem + type Eti_Error is + (E_Current, + E_Invalid_Field, + E_Request_Denied, + E_Not_Connected, + E_Not_Selectable, + E_No_Match, + E_Unknown_Command, + E_Not_Posted, + E_No_Room, + E_Bad_State, + E_Connected, + E_Posted, + E_Bad_Argument, + E_System_Error, + E_Ok); + + procedure Eti_Exception (Code : Eti_Error); + -- Do nothing if Code = E_Ok. + -- Else dispatch the error code and raise the appropriate exception. + + procedure Fill_String (Cp : chars_ptr; + Str : out String); + -- Fill the Str parameter with the string denoted by the chars_ptr + -- C-Style string. + + function Fill_String (Cp : chars_ptr) return String; + -- Same but as function. + +private + for Eti_Error'Size use C_Int'Size; + pragma Convention (C, Eti_Error); + for Eti_Error use + (E_Current => Curses_Constants.E_CURRENT, + E_Invalid_Field => Curses_Constants.E_INVALID_FIELD, + E_Request_Denied => Curses_Constants.E_REQUEST_DENIED, + E_Not_Connected => Curses_Constants.E_NOT_CONNECTED, + E_Not_Selectable => Curses_Constants.E_NOT_SELECTABLE, + E_No_Match => Curses_Constants.E_NO_MATCH, + E_Unknown_Command => Curses_Constants.E_UNKNOWN_COMMAND, + E_Not_Posted => Curses_Constants.E_NOT_POSTED, + E_No_Room => Curses_Constants.E_NO_ROOM, + E_Bad_State => Curses_Constants.E_BAD_STATE, + E_Connected => Curses_Constants.E_CONNECTED, + E_Posted => Curses_Constants.E_POSTED, + E_Bad_Argument => Curses_Constants.E_BAD_ARGUMENT, + E_System_Error => Curses_Constants.E_SYSTEM_ERROR, + E_Ok => Curses_Constants.E_OK); +end Terminal_Interface.Curses.Aux; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 new file mode 100644 index 00000000..0f5db6ca --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 @@ -0,0 +1,239 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-forms-field_user_data__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1998-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.21 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C; +with Terminal_Interface.Curses.Aux; + +package Terminal_Interface.Curses.Forms.Field_Types is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types); + subtype C_Int is Interfaces.C.int; + + -- MANPAGE(`form_fieldtype.3x') + + type Field_Type is abstract tagged null record; + -- Abstract base type for all field types. A concrete field type + -- is an extension that adds some data elements describing formats or + -- boundary values for the type and validation routines. + -- For the builtin low-level fieldtypes, the validation routines are + -- already defined by the low-level C library. + -- The builtin types like Alpha or AlphaNumeric etc. are defined in + -- child packages of this package. You may use one of them as example + -- how to create you own child packages for low-level field types that + -- you may have already written in C. + + type Field_Type_Access is access all Field_Type'Class; + + -- ANCHOR(`set_field_type()',`Set_Type') + procedure Set_Field_Type (Fld : Field; + Fld_Type : Field_Type) is abstract; + -- AKA + -- But: we hide the vararg mechanism of the C interface. You always + -- have to pass a single Field_Type parameter. + + -- --------------------------------------------------------------------- + + -- MANPAGE(`form_field_validation.3x') + + -- ANCHOR(`field_type()',`Get_Type') + function Get_Type (Fld : Field) return Field_Type_Access; + -- AKA + -- ALIAS(`field_arg()') + -- In Ada95 we can combine these. If you try to retrieve the field type + -- that is not defined as extension of the abstract tagged type above, + -- you will raise a Form_Exception. + -- This is not inlined + + -- +---------------------------------------------------------------------- + -- | Private Part. + -- | Most of this is used by the implementations of the child packages. + -- | +private + type Makearg_Function is access + function (Args : System.Address) return System.Address; + pragma Convention (C, Makearg_Function); + + type Copyarg_Function is access + function (Usr : System.Address) return System.Address; + pragma Convention (C, Copyarg_Function); + + type Freearg_Function is access + procedure (Usr : System.Address); + pragma Convention (C, Freearg_Function); + + type Field_Check_Function is access + function (Fld : Field; Usr : System.Address) return Curses_Bool; + pragma Convention (C, Field_Check_Function); + + type Char_Check_Function is access + function (Ch : C_Int; Usr : System.Address) return Curses_Bool; + pragma Convention (C, Char_Check_Function); + + type Choice_Function is access + function (Fld : Field; Usr : System.Address) return Curses_Bool; + pragma Convention (C, Choice_Function); + + -- +---------------------------------------------------------------------- + -- | This must be in sync with the FIELDTYPE structure in form.h + -- | + type Low_Level_Field_Type is + record + Status : Interfaces.C.unsigned_short; + Ref_Count : Interfaces.C.long; + Left, Right : System.Address; + Makearg : Makearg_Function; + Copyarg : Copyarg_Function; + Freearg : Freearg_Function; + Fcheck : Field_Check_Function; + Ccheck : Char_Check_Function; + Next, Prev : Choice_Function; + end record; + pragma Convention (C, Low_Level_Field_Type); + type C_Field_Type is access all Low_Level_Field_Type; + + Null_Field_Type : constant C_Field_Type := null; + + -- +---------------------------------------------------------------------- + -- | This four low-level fieldtypes are the ones associated with + -- | fieldtypes handled by this binding. Any other low-level fieldtype + -- | will result in a Form_Exception is function Get_Type. + -- | + M_Generic_Type : C_Field_Type := null; + M_Generic_Choice : C_Field_Type := null; + M_Builtin_Router : C_Field_Type := null; + M_Choice_Router : C_Field_Type := null; + + -- Two wrapper functions to access those low-level fieldtypes defined + -- in this package. + function C_Builtin_Router return C_Field_Type; + function C_Choice_Router return C_Field_Type; + + procedure Wrap_Builtin (Fld : Field; + Typ : Field_Type'Class; + Cft : C_Field_Type := C_Builtin_Router); + -- This procedure has to be called by the Set_Field_Type implementation + -- for builtin low-level fieldtypes to replace it by an Ada95 + -- conformant Field_Type object. + -- The parameter Cft must be C_Builtin_Router for regular low-level + -- fieldtypes (like TYP_ALPHA or TYP_ALNUM) and C_Choice_Router for + -- low-level fieldtypes witch choice functions (like TYP_ENUM). + -- Any other value will raise a Form_Exception. + + function Make_Arg (Args : System.Address) return System.Address; + pragma Import (C, Make_Arg, "void_star_make_arg"); + -- This is the Makearg_Function for the internal low-level types + -- introduced by this binding. + + function Copy_Arg (Usr : System.Address) return System.Address; + pragma Convention (C, Copy_Arg); + -- This is the Copyarg_Function for the internal low-level types + -- introduced by this binding. + + procedure Free_Arg (Usr : System.Address); + pragma Convention (C, Free_Arg); + -- This is the Freearg_Function for the internal low-level types + -- introduced by this binding. + + function Field_Check_Router (Fld : Field; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Field_Check_Router); + -- This is the Field_Check_Function for the internal low-level types + -- introduced to wrap the low-level types by a Field_Type derived + -- type. It routes the call to the corresponding low-level validation + -- function. + + function Char_Check_Router (Ch : C_Int; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Char_Check_Router); + -- This is the Char_Check_Function for the internal low-level types + -- introduced to wrap the low-level types by a Field_Type derived + -- type. It routes the call to the corresponding low-level validation + -- function. + + function Next_Router (Fld : Field; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Next_Router); + -- This is the Choice_Function for the internal low-level types + -- introduced to wrap the low-level types by a Field_Type derived + -- type. It routes the call to the corresponding low-level next_choice + -- function. + + function Prev_Router (Fld : Field; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Prev_Router); + -- This is the Choice_Function for the internal low-level types + -- introduced to wrap the low-level types by a Field_Type derived + -- type. It routes the call to the corresponding low-level prev_choice + -- function. + + -- This is the Argument structure maintained by all low-level field types + -- introduced by this binding. + type Argument is record + Typ : Field_Type_Access; -- the Field_Type creating this record + Usr : System.Address; -- original arg for builtin low-level types + Cft : C_Field_Type; -- the original low-level type + end record; + type Argument_Access is access all Argument; + + -- +---------------------------------------------------------------------- + -- | + -- | Some Imports of libform routines to deal with low-level fieldtypes. + -- | + function New_Fieldtype (Fcheck : Field_Check_Function; + Ccheck : Char_Check_Function) + return C_Field_Type; + pragma Import (C, New_Fieldtype, "new_fieldtype"); + + function Set_Fieldtype_Arg (Cft : C_Field_Type; + Mak : Makearg_Function := Make_Arg'Access; + Cop : Copyarg_Function := Copy_Arg'Access; + Fre : Freearg_Function := Free_Arg'Access) + return Aux.Eti_Error; + pragma Import (C, Set_Fieldtype_Arg, "set_fieldtype_arg"); + + function Set_Fieldtype_Choice (Cft : C_Field_Type; + Next, Prev : Choice_Function) + return Aux.Eti_Error; + pragma Import (C, Set_Fieldtype_Choice, "set_fieldtype_choice"); + +end Terminal_Interface.Curses.Forms.Field_Types; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 new file mode 100644 index 00000000..71334b60 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 @@ -0,0 +1,71 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-forms-field_user_data__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_User_Data -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.17 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +generic + type User is limited private; + type User_Access is access User; +package Terminal_Interface.Curses.Forms.Field_User_Data is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_User_Data); + + -- MANPAGE(`form_field_userptr.3x') + + -- ANCHOR(`set_field_userptr',`Set_User_Data') + procedure Set_User_Data (Fld : Field; + Data : User_Access); + -- AKA + pragma Inline (Set_User_Data); + + -- ANCHOR(`field_userptr',`Get_User_Data') + procedure Get_User_Data (Fld : Field; + Data : out User_Access); + -- AKA + + -- ANCHOR(`field_userptr',`Get_User_Data') + function Get_User_Data (Fld : Field) return User_Access; + -- AKA + -- Sama as function + pragma Inline (Get_User_Data); + +end Terminal_Interface.Curses.Forms.Field_User_Data; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 new file mode 100644 index 00000000..4a989492 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 @@ -0,0 +1,71 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-forms-form_user_data__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Form_User_Data -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.16 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +generic + type User is limited private; + type User_Access is access User; +package Terminal_Interface.Curses.Forms.Form_User_Data is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Form_User_Data); + + -- MANPAGE(`form_userptr.3x') + + -- ANCHOR(`set_form_userptr',`Set_User_Data') + procedure Set_User_Data (Frm : Form; + Data : User_Access); + -- AKA + pragma Inline (Set_User_Data); + + -- ANCHOR(`form_userptr',`Get_User_Data') + procedure Get_User_Data (Frm : Form; + Data : out User_Access); + -- AKA + + -- ANCHOR(`form_userptr',`Get_User_Data') + function Get_User_Data (Frm : Form) return User_Access; + -- AKA + -- Same as function + pragma Inline (Get_User_Data); + +end Terminal_Interface.Curses.Forms.Form_User_Data; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms.ads.m4 new file mode 100644 index 00000000..1293d373 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-forms.ads.m4 @@ -0,0 +1,749 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-forms__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Form -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.34 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System; +with Ada.Characters.Latin_1; + +package Terminal_Interface.Curses.Forms is + pragma Preelaborate (Terminal_Interface.Curses.Forms); + pragma Linker_Options ("-lform" & Curses_Constants.DFT_ARG_SUFFIX); + + Space : Character renames Ada.Characters.Latin_1.Space; + + type Field is private; + type Form is private; + + Null_Field : constant Field; + Null_Form : constant Form; + + type Field_Justification is (None, + Left, + Center, + Right); + + type Field_Option_Set is + record + Visible : Boolean; + Active : Boolean; + Public : Boolean; + Edit : Boolean; + Wrap : Boolean; + Blank : Boolean; + Auto_Skip : Boolean; + Null_Ok : Boolean; + Pass_Ok : Boolean; + Static : Boolean; + end record; + pragma Convention (C_Pass_By_Copy, Field_Option_Set); + + for Field_Option_Set use + record + Visible at 0 range Curses_Constants.O_VISIBLE_First + .. Curses_Constants.O_VISIBLE_Last; + Active at 0 range Curses_Constants.O_ACTIVE_First + .. Curses_Constants.O_ACTIVE_Last; + Public at 0 range Curses_Constants.O_PUBLIC_First + .. Curses_Constants.O_PUBLIC_Last; + Edit at 0 range Curses_Constants.O_EDIT_First + .. Curses_Constants.O_EDIT_Last; + Wrap at 0 range Curses_Constants.O_WRAP_First + .. Curses_Constants.O_WRAP_Last; + Blank at 0 range Curses_Constants.O_BLANK_First + .. Curses_Constants.O_BLANK_Last; + Auto_Skip at 0 range Curses_Constants.O_AUTOSKIP_First + .. Curses_Constants.O_AUTOSKIP_Last; + Null_Ok at 0 range Curses_Constants.O_NULLOK_First + .. Curses_Constants.O_NULLOK_Last; + Pass_Ok at 0 range Curses_Constants.O_PASSOK_First + .. Curses_Constants.O_PASSOK_Last; + Static at 0 range Curses_Constants.O_STATIC_First + .. Curses_Constants.O_STATIC_Last; + end record; + pragma Warnings (Off); + for Field_Option_Set'Size use Curses_Constants.Field_Options_Size; + pragma Warnings (On); + + function Default_Field_Options return Field_Option_Set; + -- The initial defaults for the field options. + pragma Inline (Default_Field_Options); + + type Form_Option_Set is + record + NL_Overload : Boolean; + BS_Overload : Boolean; + end record; + pragma Convention (C_Pass_By_Copy, Form_Option_Set); + + for Form_Option_Set use + record + NL_Overload at 0 range Curses_Constants.O_NL_OVERLOAD_First + .. Curses_Constants.O_NL_OVERLOAD_Last; + BS_Overload at 0 range Curses_Constants.O_BS_OVERLOAD_First + .. Curses_Constants.O_BS_OVERLOAD_Last; + end record; + pragma Warnings (Off); + for Form_Option_Set'Size use Curses_Constants.Field_Options_Size; + pragma Warnings (On); + + function Default_Form_Options return Form_Option_Set; + -- The initial defaults for the form options. + pragma Inline (Default_Form_Options); + + type Buffer_Number is new Natural; + + type Field_Array is array (Positive range <>) of aliased Field; + pragma Convention (C, Field_Array); + + type Field_Array_Access is access Field_Array; + + procedure Free (FA : in out Field_Array_Access; + Free_Fields : Boolean := False); + -- Release the memory for an allocated field array + -- If Free_Fields is True, call Delete() for all the fields in + -- the array. + + subtype Form_Request_Code is Key_Code range (Key_Max + 1) .. (Key_Max + 57); + + -- The prefix F_ stands for "Form Request" + F_Next_Page : constant Form_Request_Code := Key_Max + 1; + F_Previous_Page : constant Form_Request_Code := Key_Max + 2; + F_First_Page : constant Form_Request_Code := Key_Max + 3; + F_Last_Page : constant Form_Request_Code := Key_Max + 4; + + F_Next_Field : constant Form_Request_Code := Key_Max + 5; + F_Previous_Field : constant Form_Request_Code := Key_Max + 6; + F_First_Field : constant Form_Request_Code := Key_Max + 7; + F_Last_Field : constant Form_Request_Code := Key_Max + 8; + F_Sorted_Next_Field : constant Form_Request_Code := Key_Max + 9; + F_Sorted_Previous_Field : constant Form_Request_Code := Key_Max + 10; + F_Sorted_First_Field : constant Form_Request_Code := Key_Max + 11; + F_Sorted_Last_Field : constant Form_Request_Code := Key_Max + 12; + F_Left_Field : constant Form_Request_Code := Key_Max + 13; + F_Right_Field : constant Form_Request_Code := Key_Max + 14; + F_Up_Field : constant Form_Request_Code := Key_Max + 15; + F_Down_Field : constant Form_Request_Code := Key_Max + 16; + + F_Next_Char : constant Form_Request_Code := Key_Max + 17; + F_Previous_Char : constant Form_Request_Code := Key_Max + 18; + F_Next_Line : constant Form_Request_Code := Key_Max + 19; + F_Previous_Line : constant Form_Request_Code := Key_Max + 20; + F_Next_Word : constant Form_Request_Code := Key_Max + 21; + F_Previous_Word : constant Form_Request_Code := Key_Max + 22; + F_Begin_Field : constant Form_Request_Code := Key_Max + 23; + F_End_Field : constant Form_Request_Code := Key_Max + 24; + F_Begin_Line : constant Form_Request_Code := Key_Max + 25; + F_End_Line : constant Form_Request_Code := Key_Max + 26; + F_Left_Char : constant Form_Request_Code := Key_Max + 27; + F_Right_Char : constant Form_Request_Code := Key_Max + 28; + F_Up_Char : constant Form_Request_Code := Key_Max + 29; + F_Down_Char : constant Form_Request_Code := Key_Max + 30; + + F_New_Line : constant Form_Request_Code := Key_Max + 31; + F_Insert_Char : constant Form_Request_Code := Key_Max + 32; + F_Insert_Line : constant Form_Request_Code := Key_Max + 33; + F_Delete_Char : constant Form_Request_Code := Key_Max + 34; + F_Delete_Previous : constant Form_Request_Code := Key_Max + 35; + F_Delete_Line : constant Form_Request_Code := Key_Max + 36; + F_Delete_Word : constant Form_Request_Code := Key_Max + 37; + F_Clear_EOL : constant Form_Request_Code := Key_Max + 38; + F_Clear_EOF : constant Form_Request_Code := Key_Max + 39; + F_Clear_Field : constant Form_Request_Code := Key_Max + 40; + F_Overlay_Mode : constant Form_Request_Code := Key_Max + 41; + F_Insert_Mode : constant Form_Request_Code := Key_Max + 42; + + -- Vertical Scrolling + F_ScrollForward_Line : constant Form_Request_Code := Key_Max + 43; + F_ScrollBackward_Line : constant Form_Request_Code := Key_Max + 44; + F_ScrollForward_Page : constant Form_Request_Code := Key_Max + 45; + F_ScrollBackward_Page : constant Form_Request_Code := Key_Max + 46; + F_ScrollForward_HalfPage : constant Form_Request_Code := Key_Max + 47; + F_ScrollBackward_HalfPage : constant Form_Request_Code := Key_Max + 48; + + -- Horizontal Scrolling + F_HScrollForward_Char : constant Form_Request_Code := Key_Max + 49; + F_HScrollBackward_Char : constant Form_Request_Code := Key_Max + 50; + F_HScrollForward_Line : constant Form_Request_Code := Key_Max + 51; + F_HScrollBackward_Line : constant Form_Request_Code := Key_Max + 52; + F_HScrollForward_HalfLine : constant Form_Request_Code := Key_Max + 53; + F_HScrollBackward_HalfLine : constant Form_Request_Code := Key_Max + 54; + + F_Validate_Field : constant Form_Request_Code := Key_Max + 55; + F_Next_Choice : constant Form_Request_Code := Key_Max + 56; + F_Previous_Choice : constant Form_Request_Code := Key_Max + 57; + + -- For those who like the old 'C' style request names + REQ_NEXT_PAGE : Form_Request_Code renames F_Next_Page; + REQ_PREV_PAGE : Form_Request_Code renames F_Previous_Page; + REQ_FIRST_PAGE : Form_Request_Code renames F_First_Page; + REQ_LAST_PAGE : Form_Request_Code renames F_Last_Page; + + REQ_NEXT_FIELD : Form_Request_Code renames F_Next_Field; + REQ_PREV_FIELD : Form_Request_Code renames F_Previous_Field; + REQ_FIRST_FIELD : Form_Request_Code renames F_First_Field; + REQ_LAST_FIELD : Form_Request_Code renames F_Last_Field; + REQ_SNEXT_FIELD : Form_Request_Code renames F_Sorted_Next_Field; + REQ_SPREV_FIELD : Form_Request_Code renames F_Sorted_Previous_Field; + REQ_SFIRST_FIELD : Form_Request_Code renames F_Sorted_First_Field; + REQ_SLAST_FIELD : Form_Request_Code renames F_Sorted_Last_Field; + REQ_LEFT_FIELD : Form_Request_Code renames F_Left_Field; + REQ_RIGHT_FIELD : Form_Request_Code renames F_Right_Field; + REQ_UP_FIELD : Form_Request_Code renames F_Up_Field; + REQ_DOWN_FIELD : Form_Request_Code renames F_Down_Field; + + REQ_NEXT_CHAR : Form_Request_Code renames F_Next_Char; + REQ_PREV_CHAR : Form_Request_Code renames F_Previous_Char; + REQ_NEXT_LINE : Form_Request_Code renames F_Next_Line; + REQ_PREV_LINE : Form_Request_Code renames F_Previous_Line; + REQ_NEXT_WORD : Form_Request_Code renames F_Next_Word; + REQ_PREV_WORD : Form_Request_Code renames F_Previous_Word; + REQ_BEG_FIELD : Form_Request_Code renames F_Begin_Field; + REQ_END_FIELD : Form_Request_Code renames F_End_Field; + REQ_BEG_LINE : Form_Request_Code renames F_Begin_Line; + REQ_END_LINE : Form_Request_Code renames F_End_Line; + REQ_LEFT_CHAR : Form_Request_Code renames F_Left_Char; + REQ_RIGHT_CHAR : Form_Request_Code renames F_Right_Char; + REQ_UP_CHAR : Form_Request_Code renames F_Up_Char; + REQ_DOWN_CHAR : Form_Request_Code renames F_Down_Char; + + REQ_NEW_LINE : Form_Request_Code renames F_New_Line; + REQ_INS_CHAR : Form_Request_Code renames F_Insert_Char; + REQ_INS_LINE : Form_Request_Code renames F_Insert_Line; + REQ_DEL_CHAR : Form_Request_Code renames F_Delete_Char; + REQ_DEL_PREV : Form_Request_Code renames F_Delete_Previous; + REQ_DEL_LINE : Form_Request_Code renames F_Delete_Line; + REQ_DEL_WORD : Form_Request_Code renames F_Delete_Word; + REQ_CLR_EOL : Form_Request_Code renames F_Clear_EOL; + REQ_CLR_EOF : Form_Request_Code renames F_Clear_EOF; + REQ_CLR_FIELD : Form_Request_Code renames F_Clear_Field; + REQ_OVL_MODE : Form_Request_Code renames F_Overlay_Mode; + REQ_INS_MODE : Form_Request_Code renames F_Insert_Mode; + + REQ_SCR_FLINE : Form_Request_Code renames F_ScrollForward_Line; + REQ_SCR_BLINE : Form_Request_Code renames F_ScrollBackward_Line; + REQ_SCR_FPAGE : Form_Request_Code renames F_ScrollForward_Page; + REQ_SCR_BPAGE : Form_Request_Code renames F_ScrollBackward_Page; + REQ_SCR_FHPAGE : Form_Request_Code renames F_ScrollForward_HalfPage; + REQ_SCR_BHPAGE : Form_Request_Code renames F_ScrollBackward_HalfPage; + + REQ_SCR_FCHAR : Form_Request_Code renames F_HScrollForward_Char; + REQ_SCR_BCHAR : Form_Request_Code renames F_HScrollBackward_Char; + REQ_SCR_HFLINE : Form_Request_Code renames F_HScrollForward_Line; + REQ_SCR_HBLINE : Form_Request_Code renames F_HScrollBackward_Line; + REQ_SCR_HFHALF : Form_Request_Code renames F_HScrollForward_HalfLine; + REQ_SCR_HBHALF : Form_Request_Code renames F_HScrollBackward_HalfLine; + + REQ_VALIDATION : Form_Request_Code renames F_Validate_Field; + REQ_NEXT_CHOICE : Form_Request_Code renames F_Next_Choice; + REQ_PREV_CHOICE : Form_Request_Code renames F_Previous_Choice; + + procedure Request_Name (Key : Form_Request_Code; + Name : out String); + + function Request_Name (Key : Form_Request_Code) return String; + -- Same as function + pragma Inline (Request_Name); + + ------------------ + -- Exceptions -- + ------------------ + Form_Exception : exception; + + -- MANPAGE(`form_field_new.3x') + + -- ANCHOR(`new_field()',`Create') + function Create (Height : Line_Count; + Width : Column_Count; + Top : Line_Position; + Left : Column_Position; + Off_Screen : Natural := 0; + More_Buffers : Buffer_Number := Buffer_Number'First) + return Field; + -- AKA + -- An overloaded Create is defined later. Pragma Inline appears there. + + -- ANCHOR(`new_field()',`New_Field') + function New_Field (Height : Line_Count; + Width : Column_Count; + Top : Line_Position; + Left : Column_Position; + Off_Screen : Natural := 0; + More_Buffers : Buffer_Number := Buffer_Number'First) + return Field renames Create; + -- AKA + pragma Inline (New_Field); + + -- ANCHOR(`free_field()',`Delete') + procedure Delete (Fld : in out Field); + -- AKA + -- Reset Fld to Null_Field + -- An overloaded Delete is defined later. Pragma Inline appears there. + + -- ANCHOR(`dup_field()',`Duplicate') + function Duplicate (Fld : Field; + Top : Line_Position; + Left : Column_Position) return Field; + -- AKA + pragma Inline (Duplicate); + + -- ANCHOR(`link_field()',`Link') + function Link (Fld : Field; + Top : Line_Position; + Left : Column_Position) return Field; + -- AKA + pragma Inline (Link); + + -- MANPAGE(`form_field_just.3x') + + -- ANCHOR(`set_field_just()',`Set_Justification') + procedure Set_Justification (Fld : Field; + Just : Field_Justification := None); + -- AKA + pragma Inline (Set_Justification); + + -- ANCHOR(`field_just()',`Get_Justification') + function Get_Justification (Fld : Field) return Field_Justification; + -- AKA + pragma Inline (Get_Justification); + + -- MANPAGE(`form_field_buffer.3x') + + -- ANCHOR(`set_field_buffer()',`Set_Buffer') + procedure Set_Buffer + (Fld : Field; + Buffer : Buffer_Number := Buffer_Number'First; + Str : String); + -- AKA + -- Not inlined + + -- ANCHOR(`field_buffer()',`Get_Buffer') + procedure Get_Buffer + (Fld : Field; + Buffer : Buffer_Number := Buffer_Number'First; + Str : out String); + -- AKA + + function Get_Buffer + (Fld : Field; + Buffer : Buffer_Number := Buffer_Number'First) return String; + -- AKA + -- Same but as function + pragma Inline (Get_Buffer); + + -- ANCHOR(`set_field_status()',`Set_Status') + procedure Set_Status (Fld : Field; + Status : Boolean := True); + -- AKA + pragma Inline (Set_Status); + + -- ANCHOR(`field_status()',`Changed') + function Changed (Fld : Field) return Boolean; + -- AKA + pragma Inline (Changed); + + -- ANCHOR(`set_field_max()',`Set_Maximum_Size') + procedure Set_Maximum_Size (Fld : Field; + Max : Natural := 0); + -- AKA + pragma Inline (Set_Maximum_Size); + + -- MANPAGE(`form_field_opts.3x') + + -- ANCHOR(`set_field_opts()',`Set_Options') + procedure Set_Options (Fld : Field; + Options : Field_Option_Set); + -- AKA + -- An overloaded version is defined later. Pragma Inline appears there + + -- ANCHOR(`field_opts_on()',`Switch_Options') + procedure Switch_Options (Fld : Field; + Options : Field_Option_Set; + On : Boolean := True); + -- AKA + -- ALIAS(`field_opts_off()') + -- An overloaded version is defined later. Pragma Inline appears there + + -- ANCHOR(`field_opts()',`Get_Options') + procedure Get_Options (Fld : Field; + Options : out Field_Option_Set); + -- AKA + + -- ANCHOR(`field_opts()',`Get_Options') + function Get_Options (Fld : Field := Null_Field) + return Field_Option_Set; + -- AKA + -- An overloaded version is defined later. Pragma Inline appears there + + -- MANPAGE(`form_field_attributes.3x') + + -- ANCHOR(`set_field_fore()',`Set_Foreground') + procedure Set_Foreground + (Fld : Field; + Fore : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + pragma Inline (Set_Foreground); + + -- ANCHOR(`field_fore()',`Foreground') + procedure Foreground (Fld : Field; + Fore : out Character_Attribute_Set); + -- AKA + + -- ANCHOR(`field_fore()',`Foreground') + procedure Foreground (Fld : Field; + Fore : out Character_Attribute_Set; + Color : out Color_Pair); + -- AKA + pragma Inline (Foreground); + + -- ANCHOR(`set_field_back()',`Set_Background') + procedure Set_Background + (Fld : Field; + Back : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + pragma Inline (Set_Background); + + -- ANCHOR(`field_back()',`Background') + procedure Background (Fld : Field; + Back : out Character_Attribute_Set); + -- AKA + + -- ANCHOR(`field_back()',`Background') + procedure Background (Fld : Field; + Back : out Character_Attribute_Set; + Color : out Color_Pair); + -- AKA + pragma Inline (Background); + + -- ANCHOR(`set_field_pad()',`Set_Pad_Character') + procedure Set_Pad_Character (Fld : Field; + Pad : Character := Space); + -- AKA + pragma Inline (Set_Pad_Character); + + -- ANCHOR(`field_pad()',`Pad_Character') + procedure Pad_Character (Fld : Field; + Pad : out Character); + -- AKA + pragma Inline (Pad_Character); + + -- MANPAGE(`form_field_info.3x') + + -- ANCHOR(`field_info()',`Info') + procedure Info (Fld : Field; + Lines : out Line_Count; + Columns : out Column_Count; + First_Row : out Line_Position; + First_Column : out Column_Position; + Off_Screen : out Natural; + Additional_Buffers : out Buffer_Number); + -- AKA + pragma Inline (Info); + + -- ANCHOR(`dynamic_field_info()',`Dynamic_Info') + procedure Dynamic_Info (Fld : Field; + Lines : out Line_Count; + Columns : out Column_Count; + Max : out Natural); + -- AKA + pragma Inline (Dynamic_Info); + + -- MANPAGE(`form_win.3x') + + -- ANCHOR(`set_form_win()',`Set_Window') + procedure Set_Window (Frm : Form; + Win : Window); + -- AKA + pragma Inline (Set_Window); + + -- ANCHOR(`form_win()',`Get_Window') + function Get_Window (Frm : Form) return Window; + -- AKA + pragma Inline (Get_Window); + + -- ANCHOR(`set_form_sub()',`Set_Sub_Window') + procedure Set_Sub_Window (Frm : Form; + Win : Window); + -- AKA + pragma Inline (Set_Sub_Window); + + -- ANCHOR(`form_sub()',`Get_Sub_Window') + function Get_Sub_Window (Frm : Form) return Window; + -- AKA + pragma Inline (Get_Sub_Window); + + -- ANCHOR(`scale_form()',`Scale') + procedure Scale (Frm : Form; + Lines : out Line_Count; + Columns : out Column_Count); + -- AKA + pragma Inline (Scale); + + -- MANPAGE(`form_hook.3x') + + type Form_Hook_Function is access procedure (Frm : Form); + pragma Convention (C, Form_Hook_Function); + + -- ANCHOR(`set_field_init()',`Set_Field_Init_Hook') + procedure Set_Field_Init_Hook (Frm : Form; + Proc : Form_Hook_Function); + -- AKA + pragma Inline (Set_Field_Init_Hook); + + -- ANCHOR(`set_field_term()',`Set_Field_Term_Hook') + procedure Set_Field_Term_Hook (Frm : Form; + Proc : Form_Hook_Function); + -- AKA + pragma Inline (Set_Field_Term_Hook); + + -- ANCHOR(`set_form_init()',`Set_Form_Init_Hook') + procedure Set_Form_Init_Hook (Frm : Form; + Proc : Form_Hook_Function); + -- AKA + pragma Inline (Set_Form_Init_Hook); + + -- ANCHOR(`set_form_term()',`Set_Form_Term_Hook') + procedure Set_Form_Term_Hook (Frm : Form; + Proc : Form_Hook_Function); + -- AKA + pragma Inline (Set_Form_Term_Hook); + + -- ANCHOR(`field_init()',`Get_Field_Init_Hook') + function Get_Field_Init_Hook (Frm : Form) return Form_Hook_Function; + -- AKA + pragma Import (C, Get_Field_Init_Hook, "field_init"); + + -- ANCHOR(`field_term()',`Get_Field_Term_Hook') + function Get_Field_Term_Hook (Frm : Form) return Form_Hook_Function; + -- AKA + pragma Import (C, Get_Field_Term_Hook, "field_term"); + + -- ANCHOR(`form_init()',`Get_Form_Init_Hook') + function Get_Form_Init_Hook (Frm : Form) return Form_Hook_Function; + -- AKA + pragma Import (C, Get_Form_Init_Hook, "form_init"); + + -- ANCHOR(`form_term()',`Get_Form_Term_Hook') + function Get_Form_Term_Hook (Frm : Form) return Form_Hook_Function; + -- AKA + pragma Import (C, Get_Form_Term_Hook, "form_term"); + + -- MANPAGE(`form_field.3x') + + -- ANCHOR(`set_form_fields()',`Redefine') + procedure Redefine (Frm : Form; + Flds : Field_Array_Access); + -- AKA + pragma Inline (Redefine); + + -- ANCHOR(`set_form_fields()',`Set_Fields') + procedure Set_Fields (Frm : Form; + Flds : Field_Array_Access) renames Redefine; + -- AKA + -- pragma Inline (Set_Fields); + + -- ANCHOR(`form_fields()',`Fields') + function Fields (Frm : Form; + Index : Positive) return Field; + -- AKA + pragma Inline (Fields); + + -- ANCHOR(`field_count()',`Field_Count') + function Field_Count (Frm : Form) return Natural; + -- AKA + pragma Inline (Field_Count); + + -- ANCHOR(`move_field()',`Move') + procedure Move (Fld : Field; + Line : Line_Position; + Column : Column_Position); + -- AKA + pragma Inline (Move); + + -- MANPAGE(`form_new.3x') + + -- ANCHOR(`new_form()',`Create') + function Create (Fields : Field_Array_Access) return Form; + -- AKA + pragma Inline (Create); + + -- ANCHOR(`new_form()',`New_Form') + function New_Form (Fields : Field_Array_Access) return Form + renames Create; + -- AKA + -- pragma Inline (New_Form); + + -- ANCHOR(`free_form()',`Delete') + procedure Delete (Frm : in out Form); + -- AKA + -- Reset Frm to Null_Form + pragma Inline (Delete); + + -- MANPAGE(`form_opts.3x') + + -- ANCHOR(`set_form_opts()',`Set_Options') + procedure Set_Options (Frm : Form; + Options : Form_Option_Set); + -- AKA + pragma Inline (Set_Options); + + -- ANCHOR(`form_opts_on()',`Switch_Options') + procedure Switch_Options (Frm : Form; + Options : Form_Option_Set; + On : Boolean := True); + -- AKA + -- ALIAS(`form_opts_off()') + pragma Inline (Switch_Options); + + -- ANCHOR(`form_opts()',`Get_Options') + procedure Get_Options (Frm : Form; + Options : out Form_Option_Set); + -- AKA + + -- ANCHOR(`form_opts()',`Get_Options') + function Get_Options (Frm : Form := Null_Form) return Form_Option_Set; + -- AKA + pragma Inline (Get_Options); + + -- MANPAGE(`form_post.3x') + + -- ANCHOR(`post_form()',`Post') + procedure Post (Frm : Form; + Post : Boolean := True); + -- AKA + -- ALIAS(`unpost_form()') + pragma Inline (Post); + + -- MANPAGE(`form_cursor.3x') + + -- ANCHOR(`pos_form_cursor()',`Position_Cursor') + procedure Position_Cursor (Frm : Form); + -- AKA + pragma Inline (Position_Cursor); + + -- MANPAGE(`form_data.3x') + + -- ANCHOR(`data_ahead()',`Data_Ahead') + function Data_Ahead (Frm : Form) return Boolean; + -- AKA + pragma Inline (Data_Ahead); + + -- ANCHOR(`data_behind()',`Data_Behind') + function Data_Behind (Frm : Form) return Boolean; + -- AKA + pragma Inline (Data_Behind); + + -- MANPAGE(`form_driver.3x') + + type Driver_Result is (Form_Ok, + Request_Denied, + Unknown_Request, + Invalid_Field); + + -- ANCHOR(`form_driver()',`Driver') + function Driver (Frm : Form; + Key : Key_Code) return Driver_Result; + -- AKA + -- Driver not inlined + + -- MANPAGE(`form_page.3x') + + type Page_Number is new Natural; + + -- ANCHOR(`set_current_field()',`Set_Current') + procedure Set_Current (Frm : Form; + Fld : Field); + -- AKA + pragma Inline (Set_Current); + + -- ANCHOR(`current_field()',`Current') + function Current (Frm : Form) return Field; + -- AKA + pragma Inline (Current); + + -- ANCHOR(`set_form_page()',`Set_Page') + procedure Set_Page (Frm : Form; + Page : Page_Number := Page_Number'First); + -- AKA + pragma Inline (Set_Page); + + -- ANCHOR(`form_page()',`Page') + function Page (Frm : Form) return Page_Number; + -- AKA + pragma Inline (Page); + + -- ANCHOR(`field_index()',`Get_Index') + function Get_Index (Fld : Field) return Positive; + -- AKA + -- Please note that in this binding we start the numbering of fields + -- with 1. So this is number is one more than you get from the low + -- level call. + pragma Inline (Get_Index); + + -- MANPAGE(`form_new_page.3x') + + -- ANCHOR(`set_new_page()',`Set_New_Page') + procedure Set_New_Page (Fld : Field; + New_Page : Boolean := True); + -- AKA + pragma Inline (Set_New_Page); + + -- ANCHOR(`new_page()',`Is_New_Page') + function Is_New_Page (Fld : Field) return Boolean; + -- AKA + pragma Inline (Is_New_Page); + + -- MANPAGE(`form_requestname.3x') + -- Not Implemented: form_request_name, form_request_by_name + +------------------------------------------------------------------------------ +private + type Field is new System.Storage_Elements.Integer_Address; + type Form is new System.Storage_Elements.Integer_Address; + + Null_Field : constant Field := 0; + Null_Form : constant Form := 0; + +end Terminal_Interface.Curses.Forms; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 new file mode 100644 index 00000000..57dc963c --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 @@ -0,0 +1,76 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-menus-item_user_data__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Menus.Item_User_Data -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.18 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +generic + type User is limited private; + type User_Access is access User; +package Terminal_Interface.Curses.Menus.Item_User_Data is + pragma Preelaborate (Terminal_Interface.Curses.Menus.Item_User_Data); + + -- The binding uses the same user pointer for menu items + -- as the low level C implementation. So you can safely + -- read or write the user pointer also with the C routines + -- + -- MANPAGE(`mitem_userptr.3x') + + -- ANCHOR(`set_item_userptr',`Set_User_Data') + procedure Set_User_Data (Itm : Item; + Data : User_Access); + -- AKA + pragma Inline (Set_User_Data); + + -- ANCHOR(`item_userptr',`Get_User_Data') + procedure Get_User_Data (Itm : Item; + Data : out User_Access); + -- AKA + + -- ANCHOR(`item_userptr',`Get_User_Data') + function Get_User_Data (Itm : Item) return User_Access; + -- AKA + -- Same as function + pragma Inline (Get_User_Data); + +end Terminal_Interface.Curses.Menus.Item_User_Data; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 new file mode 100644 index 00000000..af8ae12d --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 @@ -0,0 +1,71 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-menus-menu_user_data__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Menus.Menu_User_Data -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.16 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +generic + type User is limited private; + type User_Access is access User; +package Terminal_Interface.Curses.Menus.Menu_User_Data is + pragma Preelaborate (Terminal_Interface.Curses.Menus.Menu_User_Data); + + -- MANPAGE(`menu_userptr.3x') + + -- ANCHOR(`set_menu_userptr',`Set_User_Data') + procedure Set_User_Data (Men : Menu; + Data : User_Access); + -- AKA + pragma Inline (Set_User_Data); + + -- ANCHOR(`menu_userptr',`Get_User_Data') + procedure Get_User_Data (Men : Menu; + Data : out User_Access); + -- AKA + + -- ANCHOR(`menu_userptr',`Get_User_Data') + function Get_User_Data (Men : Menu) return User_Access; + -- AKA + -- Same as function + pragma Inline (Get_User_Data); + +end Terminal_Interface.Curses.Menus.Menu_User_Data; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus.ads.m4 new file mode 100644 index 00000000..6914c16b --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-menus.ads.m4 @@ -0,0 +1,639 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-menus__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Menu -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.32 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System; +with Ada.Characters.Latin_1; + +package Terminal_Interface.Curses.Menus is + pragma Preelaborate (Terminal_Interface.Curses.Menus); + pragma Linker_Options ("-lmenu" & Curses_Constants.DFT_ARG_SUFFIX); + + Space : Character renames Ada.Characters.Latin_1.Space; + + type Item is private; + type Menu is private; + + --------------------------- + -- Interface constants -- + --------------------------- + Null_Item : constant Item; + Null_Menu : constant Menu; + + subtype Menu_Request_Code is Key_Code + range (Key_Max + 1) .. (Key_Max + 17); + + -- The prefix M_ stands for "Menu Request" + M_Left_Item : constant Menu_Request_Code := Key_Max + 1; + M_Right_Item : constant Menu_Request_Code := Key_Max + 2; + M_Up_Item : constant Menu_Request_Code := Key_Max + 3; + M_Down_Item : constant Menu_Request_Code := Key_Max + 4; + M_ScrollUp_Line : constant Menu_Request_Code := Key_Max + 5; + M_ScrollDown_Line : constant Menu_Request_Code := Key_Max + 6; + M_ScrollDown_Page : constant Menu_Request_Code := Key_Max + 7; + M_ScrollUp_Page : constant Menu_Request_Code := Key_Max + 8; + M_First_Item : constant Menu_Request_Code := Key_Max + 9; + M_Last_Item : constant Menu_Request_Code := Key_Max + 10; + M_Next_Item : constant Menu_Request_Code := Key_Max + 11; + M_Previous_Item : constant Menu_Request_Code := Key_Max + 12; + M_Toggle_Item : constant Menu_Request_Code := Key_Max + 13; + M_Clear_Pattern : constant Menu_Request_Code := Key_Max + 14; + M_Back_Pattern : constant Menu_Request_Code := Key_Max + 15; + M_Next_Match : constant Menu_Request_Code := Key_Max + 16; + M_Previous_Match : constant Menu_Request_Code := Key_Max + 17; + + -- For those who like the old 'C' names for the request codes + REQ_LEFT_ITEM : Menu_Request_Code renames M_Left_Item; + REQ_RIGHT_ITEM : Menu_Request_Code renames M_Right_Item; + REQ_UP_ITEM : Menu_Request_Code renames M_Up_Item; + REQ_DOWN_ITEM : Menu_Request_Code renames M_Down_Item; + REQ_SCR_ULINE : Menu_Request_Code renames M_ScrollUp_Line; + REQ_SCR_DLINE : Menu_Request_Code renames M_ScrollDown_Line; + REQ_SCR_DPAGE : Menu_Request_Code renames M_ScrollDown_Page; + REQ_SCR_UPAGE : Menu_Request_Code renames M_ScrollUp_Page; + REQ_FIRST_ITEM : Menu_Request_Code renames M_First_Item; + REQ_LAST_ITEM : Menu_Request_Code renames M_Last_Item; + REQ_NEXT_ITEM : Menu_Request_Code renames M_Next_Item; + REQ_PREV_ITEM : Menu_Request_Code renames M_Previous_Item; + REQ_TOGGLE_ITEM : Menu_Request_Code renames M_Toggle_Item; + REQ_CLEAR_PATTERN : Menu_Request_Code renames M_Clear_Pattern; + REQ_BACK_PATTERN : Menu_Request_Code renames M_Back_Pattern; + REQ_NEXT_MATCH : Menu_Request_Code renames M_Next_Match; + REQ_PREV_MATCH : Menu_Request_Code renames M_Previous_Match; + + procedure Request_Name (Key : Menu_Request_Code; + Name : out String); + + function Request_Name (Key : Menu_Request_Code) return String; + -- Same as function + + ------------------ + -- Exceptions -- + ------------------ + + Menu_Exception : exception; + -- + -- Menu options + -- + type Menu_Option_Set is + record + One_Valued : Boolean; + Show_Descriptions : Boolean; + Row_Major_Order : Boolean; + Ignore_Case : Boolean; + Show_Matches : Boolean; + Non_Cyclic : Boolean; + end record; + pragma Convention (C_Pass_By_Copy, Menu_Option_Set); + + for Menu_Option_Set use + record + One_Valued at 0 range Curses_Constants.O_ONEVALUE_First + .. Curses_Constants.O_ONEVALUE_Last; + Show_Descriptions at 0 range Curses_Constants.O_SHOWDESC_First + .. Curses_Constants.O_SHOWDESC_Last; + Row_Major_Order at 0 range Curses_Constants.O_ROWMAJOR_First + .. Curses_Constants.O_ROWMAJOR_Last; + Ignore_Case at 0 range Curses_Constants.O_IGNORECASE_First + .. Curses_Constants.O_IGNORECASE_Last; + Show_Matches at 0 range Curses_Constants.O_SHOWMATCH_First + .. Curses_Constants.O_SHOWMATCH_Last; + Non_Cyclic at 0 range Curses_Constants.O_NONCYCLIC_First + .. Curses_Constants.O_NONCYCLIC_Last; + end record; + pragma Warnings (Off); + for Menu_Option_Set'Size use Curses_Constants.Menu_Options_Size; + pragma Warnings (On); + + function Default_Menu_Options return Menu_Option_Set; + -- Initial default options for a menu. + pragma Inline (Default_Menu_Options); + -- + -- Item options + -- + type Item_Option_Set is + record + Selectable : Boolean; + end record; + pragma Convention (C_Pass_By_Copy, Item_Option_Set); + + for Item_Option_Set use + record + Selectable at 0 range Curses_Constants.O_SELECTABLE_First + .. Curses_Constants.O_SELECTABLE_Last; + end record; + pragma Warnings (Off); + for Item_Option_Set'Size use Curses_Constants.Item_Options_Size; + pragma Warnings (On); + + function Default_Item_Options return Item_Option_Set; + -- Initial default options for an item. + pragma Inline (Default_Item_Options); + + -- + -- Item Array + -- + type Item_Array is array (Positive range <>) of aliased Item; + pragma Convention (C, Item_Array); + + type Item_Array_Access is access Item_Array; + + procedure Free (IA : in out Item_Array_Access; + Free_Items : Boolean := False); + -- Release the memory for an allocated item array + -- If Free_Items is True, call Delete() for all the items in + -- the array. + + -- MANPAGE(`mitem_new.3x') + + -- ANCHOR(`new_item()',`Create') + function Create (Name : String; + Description : String := "") return Item; + -- AKA + -- Not inlined. + + -- ANCHOR(`new_item()',`New_Item') + function New_Item (Name : String; + Description : String := "") return Item + renames Create; + -- AKA + + -- ANCHOR(`free_item()',`Delete') + procedure Delete (Itm : in out Item); + -- AKA + -- Resets Itm to Null_Item + + -- MANPAGE(`mitem_value.3x') + + -- ANCHOR(`set_item_value()',`Set_Value') + procedure Set_Value (Itm : Item; + Value : Boolean := True); + -- AKA + pragma Inline (Set_Value); + + -- ANCHOR(`item_value()',`Value') + function Value (Itm : Item) return Boolean; + -- AKA + pragma Inline (Value); + + -- MANPAGE(`mitem_visible.3x') + + -- ANCHOR(`item_visible()',`Visible') + function Visible (Itm : Item) return Boolean; + -- AKA + pragma Inline (Visible); + + -- MANPAGE(`mitem_opts.3x') + + -- ANCHOR(`set_item_opts()',`Set_Options') + procedure Set_Options (Itm : Item; + Options : Item_Option_Set); + -- AKA + -- An overloaded Set_Options is defined later. Pragma Inline appears there + + -- ANCHOR(`item_opts_on()',`Switch_Options') + procedure Switch_Options (Itm : Item; + Options : Item_Option_Set; + On : Boolean := True); + -- AKA + -- ALIAS(`item_opts_off()') + -- An overloaded Switch_Options is defined later. + -- Pragma Inline appears there + + -- ANCHOR(`item_opts()',`Get_Options') + procedure Get_Options (Itm : Item; + Options : out Item_Option_Set); + -- AKA + + -- ANCHOR(`item_opts()',`Get_Options') + function Get_Options (Itm : Item := Null_Item) return Item_Option_Set; + -- AKA + -- An overloaded Get_Options is defined later. Pragma Inline appears there + + -- MANPAGE(`mitem_name.3x') + + -- ANCHOR(`item_name()',`Name') + procedure Name (Itm : Item; + Name : out String); + -- AKA + function Name (Itm : Item) return String; + -- AKA + -- Implemented as function + pragma Inline (Name); + + -- ANCHOR(`item_description();',`Description') + procedure Description (Itm : Item; + Description : out String); + -- AKA + + function Description (Itm : Item) return String; + -- AKA + -- Implemented as function + pragma Inline (Description); + + -- MANPAGE(`mitem_current.3x') + + -- ANCHOR(`set_current_item()',`Set_Current') + procedure Set_Current (Men : Menu; + Itm : Item); + -- AKA + pragma Inline (Set_Current); + + -- ANCHOR(`current_item()',`Current') + function Current (Men : Menu) return Item; + -- AKA + pragma Inline (Current); + + -- ANCHOR(`set_top_row()',`Set_Top_Row') + procedure Set_Top_Row (Men : Menu; + Line : Line_Position); + -- AKA + pragma Inline (Set_Top_Row); + + -- ANCHOR(`top_row()',`Top_Row') + function Top_Row (Men : Menu) return Line_Position; + -- AKA + pragma Inline (Top_Row); + + -- ANCHOR(`item_index()',`Get_Index') + function Get_Index (Itm : Item) return Positive; + -- AKA + -- Please note that in this binding we start the numbering of items + -- with 1. So this is number is one more than you get from the low + -- level call. + pragma Inline (Get_Index); + + -- MANPAGE(`menu_post.3x') + + -- ANCHOR(`post_menu()',`Post') + procedure Post (Men : Menu; + Post : Boolean := True); + -- AKA + -- ALIAS(`unpost_menu()') + pragma Inline (Post); + + -- MANPAGE(`menu_opts.3x') + + -- ANCHOR(`set_menu_opts()',`Set_Options') + procedure Set_Options (Men : Menu; + Options : Menu_Option_Set); + -- AKA + pragma Inline (Set_Options); + + -- ANCHOR(`menu_opts_on()',`Switch_Options') + procedure Switch_Options (Men : Menu; + Options : Menu_Option_Set; + On : Boolean := True); + -- AKA + -- ALIAS(`menu_opts_off()') + pragma Inline (Switch_Options); + + -- ANCHOR(`menu_opts()',`Get_Options') + procedure Get_Options (Men : Menu; + Options : out Menu_Option_Set); + -- AKA + + -- ANCHOR(`menu_opts()',`Get_Options') + function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set; + -- AKA + pragma Inline (Get_Options); + + -- MANPAGE(`menu_win.3x') + + -- ANCHOR(`set_menu_win()',`Set_Window') + procedure Set_Window (Men : Menu; + Win : Window); + -- AKA + pragma Inline (Set_Window); + + -- ANCHOR(`menu_win()',`Get_Window') + function Get_Window (Men : Menu) return Window; + -- AKA + pragma Inline (Get_Window); + + -- ANCHOR(`set_menu_sub()',`Set_Sub_Window') + procedure Set_Sub_Window (Men : Menu; + Win : Window); + -- AKA + pragma Inline (Set_Sub_Window); + + -- ANCHOR(`menu_sub()',`Get_Sub_Window') + function Get_Sub_Window (Men : Menu) return Window; + -- AKA + pragma Inline (Get_Sub_Window); + + -- ANCHOR(`scale_menu()',`Scale') + procedure Scale (Men : Menu; + Lines : out Line_Count; + Columns : out Column_Count); + -- AKA + pragma Inline (Scale); + + -- MANPAGE(`menu_cursor.3x') + + -- ANCHOR(`pos_menu_cursor()',`Position_Cursor') + procedure Position_Cursor (Men : Menu); + -- AKA + pragma Inline (Position_Cursor); + + -- MANPAGE(`menu_mark.3x') + + -- ANCHOR(`set_menu_mark()',`Set_Mark') + procedure Set_Mark (Men : Menu; + Mark : String); + -- AKA + pragma Inline (Set_Mark); + + -- ANCHOR(`menu_mark()',`Mark') + procedure Mark (Men : Menu; + Mark : out String); + -- AKA + + function Mark (Men : Menu) return String; + -- AKA + -- Implemented as function + pragma Inline (Mark); + + -- MANPAGE(`menu_attributes.3x') + + -- ANCHOR(`set_menu_fore()',`Set_Foreground') + procedure Set_Foreground + (Men : Menu; + Fore : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + pragma Inline (Set_Foreground); + + -- ANCHOR(`menu_fore()',`Foreground') + procedure Foreground (Men : Menu; + Fore : out Character_Attribute_Set); + -- AKA + + -- ANCHOR(`menu_fore()',`Foreground') + procedure Foreground (Men : Menu; + Fore : out Character_Attribute_Set; + Color : out Color_Pair); + -- AKA + pragma Inline (Foreground); + + -- ANCHOR(`set_menu_back()',`Set_Background') + procedure Set_Background + (Men : Menu; + Back : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + pragma Inline (Set_Background); + + -- ANCHOR(`menu_back()',`Background') + procedure Background (Men : Menu; + Back : out Character_Attribute_Set); + -- AKA + -- ANCHOR(`menu_back()',`Background') + + procedure Background (Men : Menu; + Back : out Character_Attribute_Set; + Color : out Color_Pair); + -- AKA + pragma Inline (Background); + + -- ANCHOR(`set_menu_grey()',`Set_Grey') + procedure Set_Grey + (Men : Menu; + Grey : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + pragma Inline (Set_Grey); + + -- ANCHOR(`menu_grey()',`Grey') + procedure Grey (Men : Menu; + Grey : out Character_Attribute_Set); + -- AKA + + -- ANCHOR(`menu_grey()',`Grey') + procedure Grey + (Men : Menu; + Grey : out Character_Attribute_Set; + Color : out Color_Pair); + -- AKA + pragma Inline (Grey); + + -- ANCHOR(`set_menu_pad()',`Set_Pad_Character') + procedure Set_Pad_Character (Men : Menu; + Pad : Character := Space); + -- AKA + pragma Inline (Set_Pad_Character); + + -- ANCHOR(`menu_pad()',`Pad_Character') + procedure Pad_Character (Men : Menu; + Pad : out Character); + -- AKA + pragma Inline (Pad_Character); + + -- MANPAGE(`menu_spacing.3x') + + -- ANCHOR(`set_menu_spacing()',`Set_Spacing') + procedure Set_Spacing (Men : Menu; + Descr : Column_Position := 0; + Row : Line_Position := 0; + Col : Column_Position := 0); + -- AKA + pragma Inline (Set_Spacing); + + -- ANCHOR(`menu_spacing()',`Spacing') + procedure Spacing (Men : Menu; + Descr : out Column_Position; + Row : out Line_Position; + Col : out Column_Position); + -- AKA + pragma Inline (Spacing); + + -- MANPAGE(`menu_pattern.3x') + + -- ANCHOR(`set_menu_pattern()',`Set_Pattern') + function Set_Pattern (Men : Menu; + Text : String) return Boolean; + -- AKA + -- Return TRUE if the pattern matches, FALSE otherwise + pragma Inline (Set_Pattern); + + -- ANCHOR(`menu_pattern()',`Pattern') + procedure Pattern (Men : Menu; + Text : out String); + -- AKA + pragma Inline (Pattern); + + -- MANPAGE(`menu_format.3x') + + -- ANCHOR(`set_menu_format()',`Set_Format') + procedure Set_Format (Men : Menu; + Lines : Line_Count; + Columns : Column_Count); + -- Not implemented: 0 argument for Lines or Columns; + -- instead use Format to get the current sizes + -- The default format is 16 rows, 1 column. Calling + -- set_menu_format with a null menu pointer will change this + -- default. A zero row or column argument to set_menu_format + -- is interpreted as a request not to change the current + -- value. + -- AKA + pragma Inline (Set_Format); + + -- ANCHOR(`menu_format()',`Format') + procedure Format (Men : Menu; + Lines : out Line_Count; + Columns : out Column_Count); + -- AKA + pragma Inline (Format); + + -- MANPAGE(`menu_hook.3x') + + type Menu_Hook_Function is access procedure (Men : Menu); + pragma Convention (C, Menu_Hook_Function); + + -- ANCHOR(`set_item_init()',`Set_Item_Init_Hook') + procedure Set_Item_Init_Hook (Men : Menu; + Proc : Menu_Hook_Function); + -- AKA + pragma Inline (Set_Item_Init_Hook); + + -- ANCHOR(`set_item_term()',`Set_Item_Term_Hook') + procedure Set_Item_Term_Hook (Men : Menu; + Proc : Menu_Hook_Function); + -- AKA + pragma Inline (Set_Item_Term_Hook); + + -- ANCHOR(`set_menu_init()',`Set_Menu_Init_Hook') + procedure Set_Menu_Init_Hook (Men : Menu; + Proc : Menu_Hook_Function); + -- AKA + pragma Inline (Set_Menu_Init_Hook); + + -- ANCHOR(`set_menu_term()',`Set_Menu_Term_Hook') + procedure Set_Menu_Term_Hook (Men : Menu; + Proc : Menu_Hook_Function); + -- AKA + pragma Inline (Set_Menu_Term_Hook); + + -- ANCHOR(`item_init()',`Get_Item_Init_Hook') + function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function; + -- AKA + pragma Inline (Get_Item_Init_Hook); + + -- ANCHOR(`item_term()',`Get_Item_Term_Hook') + function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function; + -- AKA + pragma Inline (Get_Item_Term_Hook); + + -- ANCHOR(`menu_init()',`Get_Menu_Init_Hook') + function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function; + -- AKA + pragma Inline (Get_Menu_Init_Hook); + + -- ANCHOR(`menu_term()',`Get_Menu_Term_Hook') + function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function; + -- AKA + pragma Inline (Get_Menu_Term_Hook); + + -- MANPAGE(`menu_items.3x') + + -- ANCHOR(`set_menu_items()',`Redefine') + procedure Redefine (Men : Menu; + Items : Item_Array_Access); + -- AKA + pragma Inline (Redefine); + + procedure Set_Items (Men : Menu; + Items : Item_Array_Access) renames Redefine; + -- pragma Inline (Set_Items); + + -- ANCHOR(`menu_items()',`Items') + function Items (Men : Menu; + Index : Positive) return Item; + -- AKA + pragma Inline (Items); + + -- ANCHOR(`item_count()',`Item_Count') + function Item_Count (Men : Menu) return Natural; + -- AKA + pragma Inline (Item_Count); + + -- MANPAGE(`menu_new.3x') + + -- ANCHOR(`new_menu()',`Create') + function Create (Items : Item_Array_Access) return Menu; + -- AKA + -- Not inlined + + function New_Menu (Items : Item_Array_Access) return Menu renames Create; + + -- ANCHOR(`free_menu()',`Delete') + procedure Delete (Men : in out Menu); + -- AKA + -- Reset Men to Null_Menu + -- Not inlined + + -- MANPAGE(`menu_driver.3x') + + type Driver_Result is (Menu_Ok, + Request_Denied, + Unknown_Request, + No_Match); + + -- ANCHOR(`menu_driver()',`Driver') + function Driver (Men : Menu; + Key : Key_Code) return Driver_Result; + -- AKA + -- Driver is not inlined + + -- ANCHOR(`menu_requestname.3x') + -- Not Implemented: menu_request_name, menu_request_by_name +------------------------------------------------------------------------------- +private + type Item is new System.Storage_Elements.Integer_Address; + type Menu is new System.Storage_Elements.Integer_Address; + + Null_Item : constant Item := 0; + Null_Menu : constant Menu := 0; + +end Terminal_Interface.Curses.Menus; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-mouse.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-mouse.ads.m4 new file mode 100644 index 00000000..6506b4ed --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-mouse.ads.m4 @@ -0,0 +1,204 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-mouse__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Mouse -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2014,2015 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.33 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System; + +package Terminal_Interface.Curses.Mouse is + pragma Preelaborate (Terminal_Interface.Curses.Mouse); + + -- MANPAGE(`curs_mouse.3x') + -- mouse_trafo, wmouse_trafo are implemented as Transform_Coordinates + -- in the parent package. + -- + -- Not implemented: + -- REPORT_MOUSE_POSITION (i.e. as a parameter to Register_Reportable_Event + -- or Start_Mouse) + type Event_Mask is private; + No_Events : constant Event_Mask; + All_Events : constant Event_Mask; + + type Mouse_Button is (Left, -- aka: Button 1 + Middle, -- aka: Button 2 + Right, -- aka: Button 3 + Button4, -- aka: Button 4 + Control, -- Control Key + Shift, -- Shift Key + Alt); -- ALT Key + + subtype Real_Buttons is Mouse_Button range Left .. Button4; + subtype Modifier_Keys is Mouse_Button range Control .. Alt; + + type Button_State is (Released, + Pressed, + Clicked, + Double_Clicked, + Triple_Clicked); + + type Button_States is array (Button_State) of Boolean; + pragma Pack (Button_States); + + All_Clicks : constant Button_States := (Clicked .. Triple_Clicked => True, + others => False); + All_States : constant Button_States := (others => True); + + type Mouse_Event is private; + + -- MANPAGE(`curs_mouse.3x') + + function Has_Mouse return Boolean; + -- Return true if a mouse device is supported, false otherwise. + + procedure Register_Reportable_Event + (Button : Mouse_Button; + State : Button_State; + Mask : in out Event_Mask); + -- Stores the event described by the button and the state in the mask. + -- Before you call this the first time, you should initialize the mask + -- with the Empty_Mask constant + pragma Inline (Register_Reportable_Event); + + procedure Register_Reportable_Events + (Button : Mouse_Button; + State : Button_States; + Mask : in out Event_Mask); + -- Register all events described by the Button and the State bitmap. + -- Before you call this the first time, you should initialize the mask + -- with the Empty_Mask constant + + -- ANCHOR(`mousemask()',`Start_Mouse') + -- There is one difference to mousmask(): we return the value of the + -- old mask, that means the event mask value before this call. + -- Not Implemented: The library version + -- returns a Mouse_Mask that tells which events are reported. + function Start_Mouse (Mask : Event_Mask := All_Events) + return Event_Mask; + -- AKA + pragma Inline (Start_Mouse); + + procedure End_Mouse (Mask : Event_Mask := No_Events); + -- Terminates the mouse, restores the specified event mask + pragma Inline (End_Mouse); + + -- ANCHOR(`getmouse()',`Get_Mouse') + function Get_Mouse return Mouse_Event; + -- AKA + pragma Inline (Get_Mouse); + + procedure Get_Event (Event : Mouse_Event; + Y : out Line_Position; + X : out Column_Position; + Button : out Mouse_Button; + State : out Button_State); + -- !!! Warning: X and Y are screen coordinates. Due to ripped of lines they + -- may not be identical to window coordinates. + -- Not Implemented: Get_Event only reports one event, the C library + -- version supports multiple events, e.g. {click-1, click-3} + pragma Inline (Get_Event); + + -- ANCHOR(`ungetmouse()',`Unget_Mouse') + procedure Unget_Mouse (Event : Mouse_Event); + -- AKA + pragma Inline (Unget_Mouse); + + -- ANCHOR(`wenclose()',`Enclosed_In_Window') + function Enclosed_In_Window (Win : Window := Standard_Window; + Event : Mouse_Event) return Boolean; + -- AKA + -- But : use event instead of screen coordinates. + pragma Inline (Enclosed_In_Window); + + -- ANCHOR(`mouseinterval()',`Mouse_Interval') + function Mouse_Interval (Msec : Natural := 200) return Natural; + -- AKA + pragma Inline (Mouse_Interval); + +private + -- This can be as little as 32 bits (unsigned), or as long as the system's + -- unsigned long. Declare it as the minimum size to handle all valid + -- sizes. + type Event_Mask is mod 4294967296; + + type Mouse_Event is + record + Id : Integer range Integer (Interfaces.C.short'First) .. + Integer (Interfaces.C.short'Last); + X, Y, Z : Integer range Integer (Interfaces.C.int'First) .. + Integer (Interfaces.C.int'Last); + Bstate : Event_Mask; + end record; + pragma Convention (C, Mouse_Event); + + for Mouse_Event use + record + Id at 0 range Curses_Constants.MEVENT_id_First + .. Curses_Constants.MEVENT_id_Last; + X at 0 range Curses_Constants.MEVENT_x_First + .. Curses_Constants.MEVENT_x_Last; + Y at 0 range Curses_Constants.MEVENT_y_First + .. Curses_Constants.MEVENT_y_Last; + Z at 0 range Curses_Constants.MEVENT_z_First + .. Curses_Constants.MEVENT_z_Last; + Bstate at 0 range Curses_Constants.MEVENT_bstate_First + .. Curses_Constants.MEVENT_bstate_Last; + end record; + for Mouse_Event'Size use Curses_Constants.MEVENT_Size; + Generation_Bit_Order : System.Bit_Order renames Curses_Constants.Bit_Order; + + BUTTON_CTRL : constant Event_Mask := Curses_Constants.BUTTON_CTRL; + BUTTON_SHIFT : constant Event_Mask := Curses_Constants.BUTTON_SHIFT; + BUTTON_ALT : constant Event_Mask := Curses_Constants.BUTTON_ALT; + BUTTON1_EVENTS : constant Event_Mask + := Curses_Constants.all_events_button_1; + BUTTON2_EVENTS : constant Event_Mask + := Curses_Constants.all_events_button_2; + BUTTON3_EVENTS : constant Event_Mask + := Curses_Constants.all_events_button_3; + BUTTON4_EVENTS : constant Event_Mask + := Curses_Constants.all_events_button_4; + ALL_MOUSE_EVENTS : constant Event_Mask := Curses_Constants.ALL_MOUSE_EVENTS; + No_Events : constant Event_Mask := 0; + All_Events : constant Event_Mask := ALL_MOUSE_EVENTS; + +end Terminal_Interface.Curses.Mouse; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 new file mode 100644 index 00000000..4d60e52c --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 @@ -0,0 +1,71 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-panels-user_data__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Panels.User_Data -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.16 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +generic + type User is limited private; + type User_Access is access all User; +package Terminal_Interface.Curses.Panels.User_Data is + pragma Preelaborate (Terminal_Interface.Curses.Panels.User_Data); + + -- MANPAGE(`panel.3x') + + -- ANCHOR(`set_panel_userptr',`Set_User_Data') + procedure Set_User_Data (Pan : Panel; + Data : User_Access); + -- AKA + pragma Inline (Set_User_Data); + + -- ANCHOR(`panel_userptr',`Get_User_Data') + procedure Get_User_Data (Pan : Panel; + Data : out User_Access); + -- AKA + + -- ANCHOR(`panel_userptr',`Get_User_Data') + function Get_User_Data (Pan : Panel) return User_Access; + -- AKA + -- Same as function + pragma Inline (Get_User_Data); + +end Terminal_Interface.Curses.Panels.User_Data; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-panels.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-panels.ads.m4 new file mode 100644 index 00000000..1175343a --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-panels.ads.m4 @@ -0,0 +1,148 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-panels__ads.htm')dnl +include(M4MACRO)dnl +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Panels -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.23 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System; + +package Terminal_Interface.Curses.Panels is + pragma Preelaborate (Terminal_Interface.Curses.Panels); + pragma Linker_Options ("-lpanel" & Curses_Constants.DFT_ARG_SUFFIX); + + type Panel is private; + + --------------------------- + -- Interface constants -- + --------------------------- + Null_Panel : constant Panel; + + ------------------- + -- Exceptions -- + ------------------- + + Panel_Exception : exception; + + -- MANPAGE(`panel.3x') + + -- ANCHOR(`new_panel()',`Create') + function Create (Win : Window) return Panel; + -- AKA + pragma Inline (Create); + + -- ANCHOR(`new_panel()',`New_Panel') + function New_Panel (Win : Window) return Panel renames Create; + -- AKA + -- pragma Inline (New_Panel); + + -- ANCHOR(`bottom_panel()',`Bottom') + procedure Bottom (Pan : Panel); + -- AKA + pragma Inline (Bottom); + + -- ANCHOR(`top_panel()',`Top') + procedure Top (Pan : Panel); + -- AKA + pragma Inline (Top); + + -- ANCHOR(`show_panel()',`Show') + procedure Show (Pan : Panel); + -- AKA + pragma Inline (Show); + + -- ANCHOR(`update_panels()',`Update_Panels') + procedure Update_Panels; + -- AKA + pragma Import (C, Update_Panels, "update_panels"); + + -- ANCHOR(`hide_panel()',`Hide') + procedure Hide (Pan : Panel); + -- AKA + pragma Inline (Hide); + + -- ANCHOR(`panel_window()',`Get_Window') + function Get_Window (Pan : Panel) return Window; + -- AKA + pragma Inline (Get_Window); + + -- ANCHOR(`panel_window()',`Panel_Window') + function Panel_Window (Pan : Panel) return Window renames Get_Window; + -- pragma Inline (Panel_Window); + + -- ANCHOR(`replace_panel()',`Replace') + procedure Replace (Pan : Panel; + Win : Window); + -- AKA + pragma Inline (Replace); + + -- ANCHOR(`move_panel()',`Move') + procedure Move (Pan : Panel; + Line : Line_Position; + Column : Column_Position); + -- AKA + pragma Inline (Move); + + -- ANCHOR(`panel_hidden()',`Is_Hidden') + function Is_Hidden (Pan : Panel) return Boolean; + -- AKA + pragma Inline (Is_Hidden); + + -- ANCHOR(`panel_above()',`Above') + function Above (Pan : Panel) return Panel; + -- AKA + pragma Import (C, Above, "panel_above"); + + -- ANCHOR(`panel_below()',`Below') + function Below (Pan : Panel) return Panel; + -- AKA + pragma Import (C, Below, "panel_below"); + + -- ANCHOR(`del_panel()',`Delete') + procedure Delete (Pan : in out Panel); + -- AKA + pragma Inline (Delete); + +private + type Panel is new System.Storage_Elements.Integer_Address; + Null_Panel : constant Panel := 0; + +end Terminal_Interface.Curses.Panels; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses-trace.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses-trace.ads.m4 new file mode 100644 index 00000000..794d1329 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses-trace.ads.m4 @@ -0,0 +1,125 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses-trace__ads.htm')dnl +include(M4MACRO)------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Trace -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control: +-- $Revision: 1.5 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +package Terminal_Interface.Curses.Trace is + pragma Preelaborate (Terminal_Interface.Curses.Trace); + + type Trace_Attribute_Set is + record + Times : Boolean; + Tputs : Boolean; + Update : Boolean; + Cursor_Move : Boolean; + Character_Output : Boolean; + Calls : Boolean; + Virtual_Puts : Boolean; + Input_Events : Boolean; + TTY_State : Boolean; + Internal_Calls : Boolean; + Character_Calls : Boolean; + Termcap_TermInfo : Boolean; + Attribute_Color : Boolean; + end record; + pragma Convention (C_Pass_By_Copy, Trace_Attribute_Set); + + for Trace_Attribute_Set use + record + Times at 0 range Curses_Constants.TRACE_TIMES_First + .. Curses_Constants.TRACE_TIMES_Last; + Tputs at 0 range Curses_Constants.TRACE_TPUTS_First + .. Curses_Constants.TRACE_TPUTS_Last; + Update at 0 range Curses_Constants.TRACE_UPDATE_First + .. Curses_Constants.TRACE_UPDATE_Last; + Cursor_Move at 0 range Curses_Constants.TRACE_MOVE_First + .. Curses_Constants.TRACE_MOVE_Last; + Character_Output at 0 range Curses_Constants.TRACE_CHARPUT_First + .. Curses_Constants.TRACE_CHARPUT_Last; + Calls at 0 range Curses_Constants.TRACE_CALLS_First + .. Curses_Constants.TRACE_CALLS_Last; + Virtual_Puts at 0 range Curses_Constants.TRACE_VIRTPUT_First + .. Curses_Constants.TRACE_VIRTPUT_Last; + Input_Events at 0 range Curses_Constants.TRACE_IEVENT_First + .. Curses_Constants.TRACE_IEVENT_Last; + TTY_State at 0 range Curses_Constants.TRACE_BITS_First + .. Curses_Constants.TRACE_BITS_Last; + Internal_Calls at 0 range Curses_Constants.TRACE_ICALLS_First + .. Curses_Constants.TRACE_ICALLS_Last; + Character_Calls at 0 range Curses_Constants.TRACE_CCALLS_First + .. Curses_Constants.TRACE_CCALLS_Last; + Termcap_TermInfo at 0 range Curses_Constants.TRACE_DATABASE_First + .. Curses_Constants.TRACE_DATABASE_Last; + Attribute_Color at 0 range Curses_Constants.TRACE_ATTRS_First + .. Curses_Constants.TRACE_ATTRS_Last; + end record; + pragma Warnings (Off); + for Trace_Attribute_Set'Size use Curses_Constants.Trace_Size; + pragma Warnings (On); + + Trace_Disable : constant Trace_Attribute_Set := (others => False); + + Trace_Ordinary : constant Trace_Attribute_Set := + (Times => True, + Tputs => True, + Update => True, + Cursor_Move => True, + Character_Output => True, + others => False); + Trace_Maximum : constant Trace_Attribute_Set := (others => True); + +------------------------------------------------------------------------------ + + -- MANPAGE(`curs_trace.3x') + + -- ANCHOR(`trace()',`Trace_on') + procedure Trace_On (x : Trace_Attribute_Set); + -- The debugging library has trace. + + -- ANCHOR(`_tracef()',`Trace_Put') + procedure Trace_Put (str : String); + -- AKA + + Current_Trace_Setting : Trace_Attribute_Set; + pragma Import (C, Current_Trace_Setting, "_nc_tracing"); + +end Terminal_Interface.Curses.Trace; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses.adb.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses.adb.m4 new file mode 100644 index 00000000..c966f9b9 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses.adb.m4 @@ -0,0 +1,2559 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses__adb.htm')dnl +include(M4MACRO)------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018-2020,2024 Thomas E. Dickey -- +-- Copyright 2007-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.17 $ +-- $Date: 2024/03/30 13:24:07 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System; + +with Terminal_Interface.Curses.Aux; +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; +with Ada.Characters.Handling; use Ada.Characters.Handling; +with Ada.Strings.Fixed; + +package body Terminal_Interface.Curses is + + use Aux; + + package ASF renames Ada.Strings.Fixed; + + type chtype_array is array (size_t range <>) + of aliased Attributed_Character; + pragma Convention (C, chtype_array); + +------------------------------------------------------------------------------ + function Key_Name (Key : Real_Key_Code) return String + is + function Keyname (K : C_Int) return chars_ptr; + pragma Import (C, Keyname, "keyname"); + + Ch : Character; + begin + if Key <= Character'Pos (Character'Last) then + Ch := Character'Val (Key); + if Is_Control (Ch) then + return Un_Control (Attributed_Character'(Ch => Ch, + Color => Color_Pair'First, + Attr => Normal_Video)); + elsif Is_Graphic (Ch) then + declare + S : String (1 .. 1); + begin + S (1) := Ch; + return S; + end; + else + return ""; + end if; + else + return Fill_String (Keyname (C_Int (Key))); + end if; + end Key_Name; + + procedure Key_Name (Key : Real_Key_Code; + Name : out String) + is + begin + ASF.Move (Key_Name (Key), Name); + end Key_Name; + +------------------------------------------------------------------------------ + procedure Init_Screen + is + function Initscr return Window; + pragma Import (C, Initscr, "initscr"); + + W : Window; + begin + W := Initscr; + if W = Null_Window then + raise Curses_Exception; + end if; + end Init_Screen; + + procedure End_Windows + is + function Endwin return C_Int; + pragma Import (C, Endwin, "endwin"); + begin + if Endwin = Curses_Err then + raise Curses_Exception; + end if; + end End_Windows; + + function Is_End_Window return Boolean + is + function Isendwin return Curses_Bool; + pragma Import (C, Isendwin, "isendwin"); + begin + if Isendwin = Curses_Bool_False then + return False; + else + return True; + end if; + end Is_End_Window; +------------------------------------------------------------------------------ + procedure Move_Cursor (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position) + is + function Wmove (Win : Window; + Line : C_Int; + Column : C_Int + ) return C_Int; + pragma Import (C, Wmove, "wmove"); + begin + if Wmove (Win, C_Int (Line), C_Int (Column)) = Curses_Err then + raise Curses_Exception; + end if; + end Move_Cursor; +------------------------------------------------------------------------------ + procedure Add (Win : Window := Standard_Window; + Ch : Attributed_Character) + is + function Waddch (W : Window; + Ch : Attributed_Character) return C_Int; + pragma Import (C, Waddch, "waddch"); + begin + if Waddch (Win, Ch) = Curses_Err then + raise Curses_Exception; + end if; + end Add; + + procedure Add (Win : Window := Standard_Window; + Ch : Character) + is + begin + Add (Win, + Attributed_Character'(Ch => Ch, + Color => Color_Pair'First, + Attr => Normal_Video)); + end Add; + + procedure Add + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Ch : Attributed_Character) + is + function mvwaddch (W : Window; + Y : C_Int; + X : C_Int; + Ch : Attributed_Character) return C_Int; + pragma Import (C, mvwaddch, "mvwaddch"); + begin + if mvwaddch (Win, C_Int (Line), + C_Int (Column), + Ch) = Curses_Err + then + raise Curses_Exception; + end if; + end Add; + + procedure Add + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Ch : Character) + is + begin + Add (Win, + Line, + Column, + Attributed_Character'(Ch => Ch, + Color => Color_Pair'First, + Attr => Normal_Video)); + end Add; + + procedure Add_With_Immediate_Echo + (Win : Window := Standard_Window; + Ch : Attributed_Character) + is + function Wechochar (W : Window; + Ch : Attributed_Character) return C_Int; + pragma Import (C, Wechochar, "wechochar"); + begin + if Wechochar (Win, Ch) = Curses_Err then + raise Curses_Exception; + end if; + end Add_With_Immediate_Echo; + + procedure Add_With_Immediate_Echo + (Win : Window := Standard_Window; + Ch : Character) + is + begin + Add_With_Immediate_Echo + (Win, + Attributed_Character'(Ch => Ch, + Color => Color_Pair'First, + Attr => Normal_Video)); + end Add_With_Immediate_Echo; +------------------------------------------------------------------------------ + function Create (Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window + is + function Newwin (Number_Of_Lines : C_Int; + Number_Of_Columns : C_Int; + First_Line_Position : C_Int; + First_Column_Position : C_Int) return Window; + pragma Import (C, Newwin, "newwin"); + + W : Window; + begin + W := Newwin (C_Int (Number_Of_Lines), + C_Int (Number_Of_Columns), + C_Int (First_Line_Position), + C_Int (First_Column_Position)); + if W = Null_Window then + raise Curses_Exception; + end if; + return W; + end Create; + + procedure Delete (Win : in out Window) + is + function Wdelwin (W : Window) return C_Int; + pragma Import (C, Wdelwin, "delwin"); + begin + if Wdelwin (Win) = Curses_Err then + raise Curses_Exception; + end if; + Win := Null_Window; + end Delete; + + function Sub_Window + (Win : Window := Standard_Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window + is + function Subwin + (Win : Window; + Number_Of_Lines : C_Int; + Number_Of_Columns : C_Int; + First_Line_Position : C_Int; + First_Column_Position : C_Int) return Window; + pragma Import (C, Subwin, "subwin"); + + W : Window; + begin + W := Subwin (Win, + C_Int (Number_Of_Lines), + C_Int (Number_Of_Columns), + C_Int (First_Line_Position), + C_Int (First_Column_Position)); + if W = Null_Window then + raise Curses_Exception; + end if; + return W; + end Sub_Window; + + function Derived_Window + (Win : Window := Standard_Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window + is + function Derwin + (Win : Window; + Number_Of_Lines : C_Int; + Number_Of_Columns : C_Int; + First_Line_Position : C_Int; + First_Column_Position : C_Int) return Window; + pragma Import (C, Derwin, "derwin"); + + W : Window; + begin + W := Derwin (Win, + C_Int (Number_Of_Lines), + C_Int (Number_Of_Columns), + C_Int (First_Line_Position), + C_Int (First_Column_Position)); + if W = Null_Window then + raise Curses_Exception; + end if; + return W; + end Derived_Window; + + function Duplicate (Win : Window) return Window + is + function Dupwin (Win : Window) return Window; + pragma Import (C, Dupwin, "dupwin"); + + W : constant Window := Dupwin (Win); + begin + if W = Null_Window then + raise Curses_Exception; + end if; + return W; + end Duplicate; + + procedure Move_Window (Win : Window; + Line : Line_Position; + Column : Column_Position) + is + function Mvwin (Win : Window; + Line : C_Int; + Column : C_Int) return C_Int; + pragma Import (C, Mvwin, "mvwin"); + begin + if Mvwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then + raise Curses_Exception; + end if; + end Move_Window; + + procedure Move_Derived_Window (Win : Window; + Line : Line_Position; + Column : Column_Position) + is + function Mvderwin (Win : Window; + Line : C_Int; + Column : C_Int) return C_Int; + pragma Import (C, Mvderwin, "mvderwin"); + begin + if Mvderwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then + raise Curses_Exception; + end if; + end Move_Derived_Window; + + procedure Set_Synch_Mode (Win : Window := Standard_Window; + Mode : Boolean := False) + is + function Syncok (Win : Window; + Mode : Curses_Bool) return C_Int; + pragma Import (C, Syncok, "syncok"); + begin + if Syncok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then + raise Curses_Exception; + end if; + end Set_Synch_Mode; +------------------------------------------------------------------------------ + procedure Add (Win : Window := Standard_Window; + Str : String; + Len : Integer := -1) + is + function Waddnstr (Win : Window; + Str : char_array; + Len : C_Int := -1) return C_Int; + pragma Import (C, Waddnstr, "waddnstr"); + + Txt : char_array (0 .. Str'Length); + Length : size_t; + begin + To_C (Str, Txt, Length); + if Waddnstr (Win, Txt, C_Int (Len)) = Curses_Err then + raise Curses_Exception; + end if; + end Add; + + procedure Add + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : String; + Len : Integer := -1) + is + begin + Move_Cursor (Win, Line, Column); + Add (Win, Str, Len); + end Add; +------------------------------------------------------------------------------ + procedure Add + (Win : Window := Standard_Window; + Str : Attributed_String; + Len : Integer := -1) + is + function Waddchnstr (Win : Window; + Str : chtype_array; + Len : C_Int := -1) return C_Int; + pragma Import (C, Waddchnstr, "waddchnstr"); + + Txt : chtype_array (0 .. Str'Length); + begin + for Length in 1 .. size_t (Str'Length) loop + Txt (Length - 1) := Str (Natural (Length)); + end loop; + Txt (Str'Length) := Default_Character; + if Waddchnstr (Win, + Txt, + C_Int (Len)) = Curses_Err + then + raise Curses_Exception; + end if; + end Add; + + procedure Add + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : Attributed_String; + Len : Integer := -1) + is + begin + Move_Cursor (Win, Line, Column); + Add (Win, Str, Len); + end Add; +------------------------------------------------------------------------------ + procedure Border + (Win : Window := Standard_Window; + Left_Side_Symbol : Attributed_Character := Default_Character; + Right_Side_Symbol : Attributed_Character := Default_Character; + Top_Side_Symbol : Attributed_Character := Default_Character; + Bottom_Side_Symbol : Attributed_Character := Default_Character; + Upper_Left_Corner_Symbol : Attributed_Character := Default_Character; + Upper_Right_Corner_Symbol : Attributed_Character := Default_Character; + Lower_Left_Corner_Symbol : Attributed_Character := Default_Character; + Lower_Right_Corner_Symbol : Attributed_Character := Default_Character) + is + function Wborder (W : Window; + LS : Attributed_Character; + RS : Attributed_Character; + TS : Attributed_Character; + BS : Attributed_Character; + ULC : Attributed_Character; + URC : Attributed_Character; + LLC : Attributed_Character; + LRC : Attributed_Character) return C_Int; + pragma Import (C, Wborder, "wborder"); + begin + if Wborder (Win, + Left_Side_Symbol, + Right_Side_Symbol, + Top_Side_Symbol, + Bottom_Side_Symbol, + Upper_Left_Corner_Symbol, + Upper_Right_Corner_Symbol, + Lower_Left_Corner_Symbol, + Lower_Right_Corner_Symbol) = Curses_Err + then + raise Curses_Exception; + end if; + end Border; + + procedure Box + (Win : Window := Standard_Window; + Vertical_Symbol : Attributed_Character := Default_Character; + Horizontal_Symbol : Attributed_Character := Default_Character) + is + begin + Border (Win, + Vertical_Symbol, Vertical_Symbol, + Horizontal_Symbol, Horizontal_Symbol); + end Box; + + procedure Horizontal_Line + (Win : Window := Standard_Window; + Line_Size : Natural; + Line_Symbol : Attributed_Character := Default_Character) + is + function Whline (W : Window; + Ch : Attributed_Character; + Len : C_Int) return C_Int; + pragma Import (C, Whline, "whline"); + begin + if Whline (Win, + Line_Symbol, + C_Int (Line_Size)) = Curses_Err + then + raise Curses_Exception; + end if; + end Horizontal_Line; + + procedure Vertical_Line + (Win : Window := Standard_Window; + Line_Size : Natural; + Line_Symbol : Attributed_Character := Default_Character) + is + function Wvline (W : Window; + Ch : Attributed_Character; + Len : C_Int) return C_Int; + pragma Import (C, Wvline, "wvline"); + begin + if Wvline (Win, + Line_Symbol, + C_Int (Line_Size)) = Curses_Err + then + raise Curses_Exception; + end if; + end Vertical_Line; + +------------------------------------------------------------------------------ + function Get_Keystroke (Win : Window := Standard_Window) + return Real_Key_Code + is + function Wgetch (W : Window) return C_Int; + pragma Import (C, Wgetch, "wgetch"); + + C : constant C_Int := Wgetch (Win); + begin + if C = Curses_Err then + return Key_None; + else + return Real_Key_Code (C); + end if; + end Get_Keystroke; + + procedure Undo_Keystroke (Key : Real_Key_Code) + is + function Ungetch (Ch : C_Int) return C_Int; + pragma Import (C, Ungetch, "ungetch"); + begin + if Ungetch (C_Int (Key)) = Curses_Err then + raise Curses_Exception; + end if; + end Undo_Keystroke; + + function Has_Key (Key : Special_Key_Code) return Boolean + is + function Haskey (Key : C_Int) return C_Int; + pragma Import (C, Haskey, "has_key"); + begin + if Haskey (C_Int (Key)) = Curses_False then + return False; + else + return True; + end if; + end Has_Key; + + function Is_Function_Key (Key : Special_Key_Code) return Boolean + is + L : constant Special_Key_Code := Special_Key_Code (Natural (Key_F0) + + Natural (Function_Key_Number'Last)); + begin + if Key >= Key_F0 and then Key <= L then + return True; + else + return False; + end if; + end Is_Function_Key; + + function Function_Key (Key : Real_Key_Code) + return Function_Key_Number + is + begin + if Is_Function_Key (Key) then + return Function_Key_Number (Key - Key_F0); + else + raise Constraint_Error; + end if; + end Function_Key; + + function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code + is + begin + return Real_Key_Code (Natural (Key_F0) + Natural (Key)); + end Function_Key_Code; +------------------------------------------------------------------------------ + procedure Standout (Win : Window := Standard_Window; + On : Boolean := True) + is + function wstandout (Win : Window) return C_Int; + pragma Import (C, wstandout, "wstandout"); + function wstandend (Win : Window) return C_Int; + pragma Import (C, wstandend, "wstandend"); + + Err : C_Int; + begin + if On then + Err := wstandout (Win); + else + Err := wstandend (Win); + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Standout; + + procedure Switch_Character_Attribute + (Win : Window := Standard_Window; + Attr : Character_Attribute_Set := Normal_Video; + On : Boolean := True) + is + function Wattron (Win : Window; + C_Attr : Attributed_Character) return C_Int; + pragma Import (C, Wattron, "wattr_on"); + function Wattroff (Win : Window; + C_Attr : Attributed_Character) return C_Int; + pragma Import (C, Wattroff, "wattr_off"); + -- In Ada we use the On Boolean to control whether or not we want to + -- switch on or off the attributes in the set. + Err : C_Int; + AC : constant Attributed_Character := (Ch => Character'First, + Color => Color_Pair'First, + Attr => Attr); + begin + if On then + Err := Wattron (Win, AC); + else + Err := Wattroff (Win, AC); + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Switch_Character_Attribute; + + procedure Set_Character_Attributes + (Win : Window := Standard_Window; + Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Wattrset (Win : Window; + C_Attr : Attributed_Character) return C_Int; + pragma Import (C, Wattrset, "wattrset"); -- ??? wattr_set + begin + if Wattrset (Win, (Ch => Character'First, + Color => Color, + Attr => Attr)) = Curses_Err + then + raise Curses_Exception; + end if; + end Set_Character_Attributes; + + function Get_Character_Attribute (Win : Window := Standard_Window) + return Character_Attribute_Set + is + function Wattrget (Win : Window; + Atr : access Attributed_Character; + Col : access C_Short; + Opt : System.Address) return C_Int; + pragma Import (C, Wattrget, "wattr_get"); + + Attr : aliased Attributed_Character; + Col : aliased C_Short; + Res : constant C_Int := Wattrget (Win, Attr'Access, Col'Access, + System.Null_Address); + begin + if Res = Curses_Ok then + return Attr.Attr; + else + raise Curses_Exception; + end if; + end Get_Character_Attribute; + + function Get_Character_Attribute (Win : Window := Standard_Window) + return Color_Pair + is + function Wattrget (Win : Window; + Atr : access Attributed_Character; + Col : access C_Short; + Opt : System.Address) return C_Int; + pragma Import (C, Wattrget, "wattr_get"); + + Attr : aliased Attributed_Character; + Col : aliased C_Short; + Res : constant C_Int := Wattrget (Win, Attr'Access, Col'Access, + System.Null_Address); + begin + if Res = Curses_Ok then + return Attr.Color; + else + raise Curses_Exception; + end if; + end Get_Character_Attribute; + + procedure Set_Color (Win : Window := Standard_Window; + Pair : Color_Pair) + is + function Wset_Color (Win : Window; + Color : C_Short; + Opts : C_Void_Ptr) return C_Int; + pragma Import (C, Wset_Color, "wcolor_set"); + begin + if Wset_Color (Win, + C_Short (Pair), + C_Void_Ptr (System.Null_Address)) = Curses_Err + then + raise Curses_Exception; + end if; + end Set_Color; + + procedure Change_Attributes + (Win : Window := Standard_Window; + Count : Integer := -1; + Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Wchgat (Win : Window; + Cnt : C_Int; + Attr : Attributed_Character; + Color : C_Short; + Opts : System.Address := System.Null_Address) + return C_Int; + pragma Import (C, Wchgat, "wchgat"); + begin + if Wchgat (Win, + C_Int (Count), + (Ch => Character'First, + Color => Color_Pair'First, + Attr => Attr), + C_Short (Color)) = Curses_Err + then + raise Curses_Exception; + end if; + end Change_Attributes; + + procedure Change_Attributes + (Win : Window := Standard_Window; + Line : Line_Position := Line_Position'First; + Column : Column_Position := Column_Position'First; + Count : Integer := -1; + Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + begin + Move_Cursor (Win, Line, Column); + Change_Attributes (Win, Count, Attr, Color); + end Change_Attributes; +------------------------------------------------------------------------------ + procedure Beep + is + function Beeper return C_Int; + pragma Import (C, Beeper, "beep"); + begin + if Beeper = Curses_Err then + raise Curses_Exception; + end if; + end Beep; + + procedure Flash_Screen + is + function Flash return C_Int; + pragma Import (C, Flash, "flash"); + begin + if Flash = Curses_Err then + raise Curses_Exception; + end if; + end Flash_Screen; +------------------------------------------------------------------------------ + procedure Set_Cbreak_Mode (SwitchOn : Boolean := True) + is + function Cbreak return C_Int; + pragma Import (C, Cbreak, "cbreak"); + function NoCbreak return C_Int; + pragma Import (C, NoCbreak, "nocbreak"); + + Err : C_Int; + begin + if SwitchOn then + Err := Cbreak; + else + Err := NoCbreak; + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Set_Cbreak_Mode; + + procedure Set_Raw_Mode (SwitchOn : Boolean := True) + is + function Raw return C_Int; + pragma Import (C, Raw, "raw"); + function NoRaw return C_Int; + pragma Import (C, NoRaw, "noraw"); + + Err : C_Int; + begin + if SwitchOn then + Err := Raw; + else + Err := NoRaw; + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Set_Raw_Mode; + + procedure Set_Echo_Mode (SwitchOn : Boolean := True) + is + function Echo return C_Int; + pragma Import (C, Echo, "echo"); + function NoEcho return C_Int; + pragma Import (C, NoEcho, "noecho"); + + Err : C_Int; + begin + if SwitchOn then + Err := Echo; + else + Err := NoEcho; + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Set_Echo_Mode; + + procedure Set_Meta_Mode (Win : Window := Standard_Window; + SwitchOn : Boolean := True) + is + function Meta (W : Window; Mode : Curses_Bool) return C_Int; + pragma Import (C, Meta, "meta"); + begin + if Meta (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then + raise Curses_Exception; + end if; + end Set_Meta_Mode; + + procedure Set_KeyPad_Mode (Win : Window := Standard_Window; + SwitchOn : Boolean := True) + is + function Keypad (W : Window; Mode : Curses_Bool) return C_Int; + pragma Import (C, Keypad, "keypad"); + begin + if Keypad (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then + raise Curses_Exception; + end if; + end Set_KeyPad_Mode; + + function Get_KeyPad_Mode (Win : Window := Standard_Window) + return Boolean + is + function Is_Keypad (W : Window) return Curses_Bool; + pragma Import (C, Is_Keypad, "is_keypad"); + begin + return (Is_Keypad (Win) /= Curses_Bool_False); + end Get_KeyPad_Mode; + + procedure Half_Delay (Amount : Half_Delay_Amount) + is + function Halfdelay (Amount : C_Int) return C_Int; + pragma Import (C, Halfdelay, "halfdelay"); + begin + if Halfdelay (C_Int (Amount)) = Curses_Err then + raise Curses_Exception; + end if; + end Half_Delay; + + procedure Set_Flush_On_Interrupt_Mode + (Win : Window := Standard_Window; + Mode : Boolean := True) + is + function Intrflush (Win : Window; Mode : Curses_Bool) return C_Int; + pragma Import (C, Intrflush, "intrflush"); + begin + if Intrflush (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then + raise Curses_Exception; + end if; + end Set_Flush_On_Interrupt_Mode; + + procedure Set_Queue_Interrupt_Mode + (Win : Window := Standard_Window; + Flush : Boolean := True) + is + procedure Qiflush; + pragma Import (C, Qiflush, "qiflush"); + procedure No_Qiflush; + pragma Import (C, No_Qiflush, "noqiflush"); + begin + if Win = Null_Window then + raise Curses_Exception; + end if; + if Flush then + Qiflush; + else + No_Qiflush; + end if; + end Set_Queue_Interrupt_Mode; + + procedure Set_NoDelay_Mode + (Win : Window := Standard_Window; + Mode : Boolean := False) + is + function Nodelay (Win : Window; Mode : Curses_Bool) return C_Int; + pragma Import (C, Nodelay, "nodelay"); + begin + if Nodelay (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then + raise Curses_Exception; + end if; + end Set_NoDelay_Mode; + + procedure Set_Timeout_Mode (Win : Window := Standard_Window; + Mode : Timeout_Mode; + Amount : Natural) + is + procedure Wtimeout (Win : Window; Amount : C_Int); + pragma Import (C, Wtimeout, "wtimeout"); + + Time : C_Int; + begin + case Mode is + when Blocking => Time := -1; + when Non_Blocking => Time := 0; + when Delayed => + if Amount = 0 then + raise Constraint_Error; + end if; + Time := C_Int (Amount); + end case; + Wtimeout (Win, Time); + end Set_Timeout_Mode; + + procedure Set_Escape_Timer_Mode + (Win : Window := Standard_Window; + Timer_Off : Boolean := False) + is + function Notimeout (Win : Window; Mode : Curses_Bool) return C_Int; + pragma Import (C, Notimeout, "notimeout"); + begin + if Notimeout (Win, Curses_Bool (Boolean'Pos (Timer_Off))) + = Curses_Err + then + raise Curses_Exception; + end if; + end Set_Escape_Timer_Mode; + +------------------------------------------------------------------------------ + procedure Set_NL_Mode (SwitchOn : Boolean := True) + is + function NL return C_Int; + pragma Import (C, NL, "nl"); + function NoNL return C_Int; + pragma Import (C, NoNL, "nonl"); + + Err : C_Int; + begin + if SwitchOn then + Err := NL; + else + Err := NoNL; + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Set_NL_Mode; + + procedure Clear_On_Next_Update + (Win : Window := Standard_Window; + Do_Clear : Boolean := True) + is + function Clear_Ok (W : Window; Flag : Curses_Bool) return C_Int; + pragma Import (C, Clear_Ok, "clearok"); + begin + if Clear_Ok (Win, Curses_Bool (Boolean'Pos (Do_Clear))) = Curses_Err then + raise Curses_Exception; + end if; + end Clear_On_Next_Update; + + procedure Use_Insert_Delete_Line + (Win : Window := Standard_Window; + Do_Idl : Boolean := True) + is + function IDL_Ok (W : Window; Flag : Curses_Bool) return C_Int; + pragma Import (C, IDL_Ok, "idlok"); + begin + if IDL_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idl))) = Curses_Err then + raise Curses_Exception; + end if; + end Use_Insert_Delete_Line; + + procedure Use_Insert_Delete_Character + (Win : Window := Standard_Window; + Do_Idc : Boolean := True) + is + procedure IDC_Ok (W : Window; Flag : Curses_Bool); + pragma Import (C, IDC_Ok, "idcok"); + begin + IDC_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idc))); + end Use_Insert_Delete_Character; + + procedure Leave_Cursor_After_Update + (Win : Window := Standard_Window; + Do_Leave : Boolean := True) + is + function Leave_Ok (W : Window; Flag : Curses_Bool) return C_Int; + pragma Import (C, Leave_Ok, "leaveok"); + begin + if Leave_Ok (Win, Curses_Bool (Boolean'Pos (Do_Leave))) = Curses_Err then + raise Curses_Exception; + end if; + end Leave_Cursor_After_Update; + + procedure Immediate_Update_Mode + (Win : Window := Standard_Window; + Mode : Boolean := False) + is + procedure Immedok (Win : Window; Mode : Curses_Bool); + pragma Import (C, Immedok, "immedok"); + begin + Immedok (Win, Curses_Bool (Boolean'Pos (Mode))); + end Immediate_Update_Mode; + + procedure Allow_Scrolling + (Win : Window := Standard_Window; + Mode : Boolean := False) + is + function Scrollok (Win : Window; Mode : Curses_Bool) return C_Int; + pragma Import (C, Scrollok, "scrollok"); + begin + if Scrollok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then + raise Curses_Exception; + end if; + end Allow_Scrolling; + + function Scrolling_Allowed (Win : Window := Standard_Window) + return Boolean + is + function Is_Scroll_Ok (W : Window) return Curses_Bool; + pragma Import (C, Is_Scroll_Ok, "is_scrollok"); + begin + return (Is_Scroll_Ok (Win) /= Curses_Bool_False); + end Scrolling_Allowed; + + procedure Set_Scroll_Region + (Win : Window := Standard_Window; + Top_Line : Line_Position; + Bottom_Line : Line_Position) + is + function Wsetscrreg (Win : Window; + Lin : C_Int; + Col : C_Int) return C_Int; + pragma Import (C, Wsetscrreg, "wsetscrreg"); + begin + if Wsetscrreg (Win, C_Int (Top_Line), C_Int (Bottom_Line)) + = Curses_Err + then + raise Curses_Exception; + end if; + end Set_Scroll_Region; +------------------------------------------------------------------------------ + procedure Update_Screen + is + function Do_Update return C_Int; + pragma Import (C, Do_Update, "doupdate"); + begin + if Do_Update = Curses_Err then + raise Curses_Exception; + end if; + end Update_Screen; + + procedure Refresh (Win : Window := Standard_Window) + is + function Wrefresh (W : Window) return C_Int; + pragma Import (C, Wrefresh, "wrefresh"); + begin + if Wrefresh (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Refresh; + + procedure Refresh_Without_Update + (Win : Window := Standard_Window) + is + function Wnoutrefresh (W : Window) return C_Int; + pragma Import (C, Wnoutrefresh, "wnoutrefresh"); + begin + if Wnoutrefresh (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Refresh_Without_Update; + + procedure Redraw (Win : Window := Standard_Window) + is + function Redrawwin (Win : Window) return C_Int; + pragma Import (C, Redrawwin, "redrawwin"); + begin + if Redrawwin (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Redraw; + + procedure Redraw + (Win : Window := Standard_Window; + Begin_Line : Line_Position; + Line_Count : Positive) + is + function Wredrawln (Win : Window; First : C_Int; Cnt : C_Int) + return C_Int; + pragma Import (C, Wredrawln, "wredrawln"); + begin + if Wredrawln (Win, + C_Int (Begin_Line), + C_Int (Line_Count)) = Curses_Err + then + raise Curses_Exception; + end if; + end Redraw; + +------------------------------------------------------------------------------ + procedure Erase (Win : Window := Standard_Window) + is + function Werase (W : Window) return C_Int; + pragma Import (C, Werase, "werase"); + begin + if Werase (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Erase; + + procedure Clear (Win : Window := Standard_Window) + is + function Wclear (W : Window) return C_Int; + pragma Import (C, Wclear, "wclear"); + begin + if Wclear (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Clear; + + procedure Clear_To_End_Of_Screen (Win : Window := Standard_Window) + is + function Wclearbot (W : Window) return C_Int; + pragma Import (C, Wclearbot, "wclrtobot"); + begin + if Wclearbot (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Clear_To_End_Of_Screen; + + procedure Clear_To_End_Of_Line (Win : Window := Standard_Window) + is + function Wcleareol (W : Window) return C_Int; + pragma Import (C, Wcleareol, "wclrtoeol"); + begin + if Wcleareol (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Clear_To_End_Of_Line; +------------------------------------------------------------------------------ + procedure Set_Background + (Win : Window := Standard_Window; + Ch : Attributed_Character) + is + procedure WBackground (W : Window; Ch : Attributed_Character); + pragma Import (C, WBackground, "wbkgdset"); + begin + WBackground (Win, Ch); + end Set_Background; + + procedure Change_Background + (Win : Window := Standard_Window; + Ch : Attributed_Character) + is + function WChangeBkgd (W : Window; Ch : Attributed_Character) + return C_Int; + pragma Import (C, WChangeBkgd, "wbkgd"); + begin + if WChangeBkgd (Win, Ch) = Curses_Err then + raise Curses_Exception; + end if; + end Change_Background; + + function Get_Background (Win : Window := Standard_Window) + return Attributed_Character + is + function Wgetbkgd (Win : Window) return Attributed_Character; + pragma Import (C, Wgetbkgd, "getbkgd"); + begin + return Wgetbkgd (Win); + end Get_Background; +------------------------------------------------------------------------------ + procedure Change_Lines_Status (Win : Window := Standard_Window; + Start : Line_Position; + Count : Positive; + State : Boolean) + is + function Wtouchln (Win : Window; + Sta : C_Int; + Cnt : C_Int; + Chg : C_Int) return C_Int; + pragma Import (C, Wtouchln, "wtouchln"); + begin + if Wtouchln (Win, C_Int (Start), C_Int (Count), + C_Int (Boolean'Pos (State))) = Curses_Err + then + raise Curses_Exception; + end if; + end Change_Lines_Status; + + procedure Touch (Win : Window := Standard_Window) + is + Y : Line_Position; + X : Column_Position; + begin + Get_Size (Win, Y, X); + pragma Warnings (Off, X); -- unreferenced + Change_Lines_Status (Win, 0, Positive (Y), True); + end Touch; + + procedure Untouch (Win : Window := Standard_Window) + is + Y : Line_Position; + X : Column_Position; + begin + Get_Size (Win, Y, X); + pragma Warnings (Off, X); -- unreferenced + Change_Lines_Status (Win, 0, Positive (Y), False); + end Untouch; + + procedure Touch (Win : Window := Standard_Window; + Start : Line_Position; + Count : Positive) + is + begin + Change_Lines_Status (Win, Start, Count, True); + end Touch; + + function Is_Touched + (Win : Window := Standard_Window; + Line : Line_Position) return Boolean + is + function WLineTouched (W : Window; L : C_Int) return Curses_Bool; + pragma Import (C, WLineTouched, "is_linetouched"); + begin + if WLineTouched (Win, C_Int (Line)) = Curses_Bool_False then + return False; + else + return True; + end if; + end Is_Touched; + + function Is_Touched + (Win : Window := Standard_Window) return Boolean + is + function WWinTouched (W : Window) return Curses_Bool; + pragma Import (C, WWinTouched, "is_wintouched"); + begin + if WWinTouched (Win) = Curses_Bool_False then + return False; + else + return True; + end if; + end Is_Touched; +------------------------------------------------------------------------------ + procedure Copy + (Source_Window : Window; + Destination_Window : Window; + Source_Top_Row : Line_Position; + Source_Left_Column : Column_Position; + Destination_Top_Row : Line_Position; + Destination_Left_Column : Column_Position; + Destination_Bottom_Row : Line_Position; + Destination_Right_Column : Column_Position; + Non_Destructive_Mode : Boolean := True) + is + function Copywin (Src : Window; + Dst : Window; + Str : C_Int; + Slc : C_Int; + Dtr : C_Int; + Dlc : C_Int; + Dbr : C_Int; + Drc : C_Int; + Ndm : C_Int) return C_Int; + pragma Import (C, Copywin, "copywin"); + begin + if Copywin (Source_Window, + Destination_Window, + C_Int (Source_Top_Row), + C_Int (Source_Left_Column), + C_Int (Destination_Top_Row), + C_Int (Destination_Left_Column), + C_Int (Destination_Bottom_Row), + C_Int (Destination_Right_Column), + Boolean'Pos (Non_Destructive_Mode) + ) = Curses_Err + then + raise Curses_Exception; + end if; + end Copy; + + procedure Overwrite + (Source_Window : Window; + Destination_Window : Window) + is + function Overwrite (Src : Window; Dst : Window) return C_Int; + pragma Import (C, Overwrite, "overwrite"); + begin + if Overwrite (Source_Window, Destination_Window) = Curses_Err then + raise Curses_Exception; + end if; + end Overwrite; + + procedure Overlay + (Source_Window : Window; + Destination_Window : Window) + is + function Overlay (Src : Window; Dst : Window) return C_Int; + pragma Import (C, Overlay, "overlay"); + begin + if Overlay (Source_Window, Destination_Window) = Curses_Err then + raise Curses_Exception; + end if; + end Overlay; + +------------------------------------------------------------------------------ + procedure Insert_Delete_Lines + (Win : Window := Standard_Window; + Lines : Integer := 1) -- default is to insert one line above + is + function Winsdelln (W : Window; N : C_Int) return C_Int; + pragma Import (C, Winsdelln, "winsdelln"); + begin + if Winsdelln (Win, C_Int (Lines)) = Curses_Err then + raise Curses_Exception; + end if; + end Insert_Delete_Lines; + + procedure Delete_Line (Win : Window := Standard_Window) + is + begin + Insert_Delete_Lines (Win, -1); + end Delete_Line; + + procedure Insert_Line (Win : Window := Standard_Window) + is + begin + Insert_Delete_Lines (Win, 1); + end Insert_Line; +------------------------------------------------------------------------------ + + procedure Get_Size + (Win : Window := Standard_Window; + Number_Of_Lines : out Line_Count; + Number_Of_Columns : out Column_Count) + is + function GetMaxY (W : Window) return C_Int; + pragma Import (C, GetMaxY, "getmaxy"); + + function GetMaxX (W : Window) return C_Int; + pragma Import (C, GetMaxX, "getmaxx"); + + Y : constant C_Int := GetMaxY (Win); + X : constant C_Int := GetMaxX (Win); + begin + Number_Of_Lines := Line_Count (Y); + Number_Of_Columns := Column_Count (X); + end Get_Size; + + procedure Get_Window_Position + (Win : Window := Standard_Window; + Top_Left_Line : out Line_Position; + Top_Left_Column : out Column_Position) + is + function GetBegY (W : Window) return C_Int; + pragma Import (C, GetBegY, "getbegy"); + + function GetBegX (W : Window) return C_Int; + pragma Import (C, GetBegX, "getbegx"); + + Y : constant C_Short := C_Short (GetBegY (Win)); + X : constant C_Short := C_Short (GetBegX (Win)); + begin + Top_Left_Line := Line_Position (Y); + Top_Left_Column := Column_Position (X); + end Get_Window_Position; + + procedure Get_Cursor_Position + (Win : Window := Standard_Window; + Line : out Line_Position; + Column : out Column_Position) + is + function GetCurY (W : Window) return C_Int; + pragma Import (C, GetCurY, "getcury"); + + function GetCurX (W : Window) return C_Int; + pragma Import (C, GetCurX, "getcurx"); + + Y : constant C_Short := C_Short (GetCurY (Win)); + X : constant C_Short := C_Short (GetCurX (Win)); + begin + Line := Line_Position (Y); + Column := Column_Position (X); + end Get_Cursor_Position; + + procedure Get_Origin_Relative_To_Parent + (Win : Window; + Top_Left_Line : out Line_Position; + Top_Left_Column : out Column_Position; + Is_Not_A_Subwindow : out Boolean) + is + function GetParY (W : Window) return C_Int; + pragma Import (C, GetParY, "getpary"); + + function GetParX (W : Window) return C_Int; + pragma Import (C, GetParX, "getparx"); + + Y : constant C_Int := GetParY (Win); + X : constant C_Int := GetParX (Win); + begin + if Y = -1 then + Top_Left_Line := Line_Position'Last; + Top_Left_Column := Column_Position'Last; + Is_Not_A_Subwindow := True; + else + Top_Left_Line := Line_Position (Y); + Top_Left_Column := Column_Position (X); + Is_Not_A_Subwindow := False; + end if; + end Get_Origin_Relative_To_Parent; +------------------------------------------------------------------------------ + function New_Pad (Lines : Line_Count; + Columns : Column_Count) return Window + is + function Newpad (Lines : C_Int; Columns : C_Int) return Window; + pragma Import (C, Newpad, "newpad"); + + W : Window; + begin + W := Newpad (C_Int (Lines), C_Int (Columns)); + if W = Null_Window then + raise Curses_Exception; + end if; + return W; + end New_Pad; + + function Sub_Pad + (Pad : Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window + is + function Subpad + (Pad : Window; + Number_Of_Lines : C_Int; + Number_Of_Columns : C_Int; + First_Line_Position : C_Int; + First_Column_Position : C_Int) return Window; + pragma Import (C, Subpad, "subpad"); + + W : Window; + begin + W := Subpad (Pad, + C_Int (Number_Of_Lines), + C_Int (Number_Of_Columns), + C_Int (First_Line_Position), + C_Int (First_Column_Position)); + if W = Null_Window then + raise Curses_Exception; + end if; + return W; + end Sub_Pad; + + procedure Refresh + (Pad : Window; + Source_Top_Row : Line_Position; + Source_Left_Column : Column_Position; + Destination_Top_Row : Line_Position; + Destination_Left_Column : Column_Position; + Destination_Bottom_Row : Line_Position; + Destination_Right_Column : Column_Position) + is + function Prefresh + (Pad : Window; + Source_Top_Row : C_Int; + Source_Left_Column : C_Int; + Destination_Top_Row : C_Int; + Destination_Left_Column : C_Int; + Destination_Bottom_Row : C_Int; + Destination_Right_Column : C_Int) return C_Int; + pragma Import (C, Prefresh, "prefresh"); + begin + if Prefresh (Pad, + C_Int (Source_Top_Row), + C_Int (Source_Left_Column), + C_Int (Destination_Top_Row), + C_Int (Destination_Left_Column), + C_Int (Destination_Bottom_Row), + C_Int (Destination_Right_Column)) = Curses_Err + then + raise Curses_Exception; + end if; + end Refresh; + + procedure Refresh_Without_Update + (Pad : Window; + Source_Top_Row : Line_Position; + Source_Left_Column : Column_Position; + Destination_Top_Row : Line_Position; + Destination_Left_Column : Column_Position; + Destination_Bottom_Row : Line_Position; + Destination_Right_Column : Column_Position) + is + function Pnoutrefresh + (Pad : Window; + Source_Top_Row : C_Int; + Source_Left_Column : C_Int; + Destination_Top_Row : C_Int; + Destination_Left_Column : C_Int; + Destination_Bottom_Row : C_Int; + Destination_Right_Column : C_Int) return C_Int; + pragma Import (C, Pnoutrefresh, "pnoutrefresh"); + begin + if Pnoutrefresh (Pad, + C_Int (Source_Top_Row), + C_Int (Source_Left_Column), + C_Int (Destination_Top_Row), + C_Int (Destination_Left_Column), + C_Int (Destination_Bottom_Row), + C_Int (Destination_Right_Column)) = Curses_Err + then + raise Curses_Exception; + end if; + end Refresh_Without_Update; + + procedure Add_Character_To_Pad_And_Echo_It + (Pad : Window; + Ch : Attributed_Character) + is + function Pechochar (Pad : Window; Ch : Attributed_Character) + return C_Int; + pragma Import (C, Pechochar, "pechochar"); + begin + if Pechochar (Pad, Ch) = Curses_Err then + raise Curses_Exception; + end if; + end Add_Character_To_Pad_And_Echo_It; + + procedure Add_Character_To_Pad_And_Echo_It + (Pad : Window; + Ch : Character) + is + begin + Add_Character_To_Pad_And_Echo_It + (Pad, + Attributed_Character'(Ch => Ch, + Color => Color_Pair'First, + Attr => Normal_Video)); + end Add_Character_To_Pad_And_Echo_It; +------------------------------------------------------------------------------ + procedure Scroll (Win : Window := Standard_Window; + Amount : Integer := 1) + is + function Wscrl (Win : Window; N : C_Int) return C_Int; + pragma Import (C, Wscrl, "wscrl"); + + begin + if Wscrl (Win, C_Int (Amount)) = Curses_Err then + raise Curses_Exception; + end if; + end Scroll; + +------------------------------------------------------------------------------ + procedure Delete_Character (Win : Window := Standard_Window) + is + function Wdelch (Win : Window) return C_Int; + pragma Import (C, Wdelch, "wdelch"); + begin + if Wdelch (Win) = Curses_Err then + raise Curses_Exception; + end if; + end Delete_Character; + + procedure Delete_Character + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position) + is + function Mvwdelch (Win : Window; + Lin : C_Int; + Col : C_Int) return C_Int; + pragma Import (C, Mvwdelch, "mvwdelch"); + begin + if Mvwdelch (Win, C_Int (Line), C_Int (Column)) = Curses_Err then + raise Curses_Exception; + end if; + end Delete_Character; +------------------------------------------------------------------------------ + function Peek (Win : Window := Standard_Window) + return Attributed_Character + is + function Winch (Win : Window) return Attributed_Character; + pragma Import (C, Winch, "winch"); + begin + return Winch (Win); + end Peek; + + function Peek + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position) return Attributed_Character + is + function Mvwinch (Win : Window; + Lin : C_Int; + Col : C_Int) return Attributed_Character; + pragma Import (C, Mvwinch, "mvwinch"); + begin + return Mvwinch (Win, C_Int (Line), C_Int (Column)); + end Peek; +------------------------------------------------------------------------------ + procedure Insert (Win : Window := Standard_Window; + Ch : Attributed_Character) + is + function Winsch (Win : Window; Ch : Attributed_Character) return C_Int; + pragma Import (C, Winsch, "winsch"); + begin + if Winsch (Win, Ch) = Curses_Err then + raise Curses_Exception; + end if; + end Insert; + + procedure Insert + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Ch : Attributed_Character) + is + function Mvwinsch (Win : Window; + Lin : C_Int; + Col : C_Int; + Ch : Attributed_Character) return C_Int; + pragma Import (C, Mvwinsch, "mvwinsch"); + begin + if Mvwinsch (Win, + C_Int (Line), + C_Int (Column), + Ch) = Curses_Err + then + raise Curses_Exception; + end if; + end Insert; +------------------------------------------------------------------------------ + procedure Insert (Win : Window := Standard_Window; + Str : String; + Len : Integer := -1) + is + function Winsnstr (Win : Window; + Str : char_array; + Len : Integer := -1) return C_Int; + pragma Import (C, Winsnstr, "winsnstr"); + + Txt : char_array (0 .. Str'Length); + Length : size_t; + begin + To_C (Str, Txt, Length); + if Winsnstr (Win, Txt, Len) = Curses_Err then + raise Curses_Exception; + end if; + end Insert; + + procedure Insert + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : String; + Len : Integer := -1) + is + function Mvwinsnstr (Win : Window; + Line : C_Int; + Column : C_Int; + Str : char_array; + Len : C_Int) return C_Int; + pragma Import (C, Mvwinsnstr, "mvwinsnstr"); + + Txt : char_array (0 .. Str'Length); + Length : size_t; + begin + To_C (Str, Txt, Length); + if Mvwinsnstr (Win, C_Int (Line), C_Int (Column), Txt, C_Int (Len)) + = Curses_Err + then + raise Curses_Exception; + end if; + end Insert; +------------------------------------------------------------------------------ + procedure Peek (Win : Window := Standard_Window; + Str : out String; + Len : Integer := -1) + is + function Winnstr (Win : Window; + Str : char_array; + Len : C_Int) return C_Int; + pragma Import (C, Winnstr, "winnstr"); + + N : Integer := Len; + Txt : char_array (0 .. Str'Length); + Cnt : Natural; + begin + if N < 0 then + N := Str'Length; + end if; + if N > Str'Length then + raise Constraint_Error; + end if; + Txt (0) := Interfaces.C.char'First; + if Winnstr (Win, Txt, C_Int (N)) = Curses_Err then + raise Curses_Exception; + end if; + To_Ada (Txt, Str, Cnt, True); + if Cnt < Str'Length then + Str ((Str'First + Cnt) .. Str'Last) := (others => ' '); + end if; + end Peek; + + procedure Peek + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : out String; + Len : Integer := -1) + is + begin + Move_Cursor (Win, Line, Column); + Peek (Win, Str, Len); + end Peek; +------------------------------------------------------------------------------ + procedure Peek + (Win : Window := Standard_Window; + Str : out Attributed_String; + Len : Integer := -1) + is + function Winchnstr (Win : Window; + Str : chtype_array; -- out + Len : C_Int) return C_Int; + pragma Import (C, Winchnstr, "winchnstr"); + + N : Integer := Len; + Txt : constant chtype_array (0 .. Str'Length) + := (0 => Default_Character); + Cnt : Natural := 0; + begin + if N < 0 then + N := Str'Length; + end if; + if N > Str'Length then + raise Constraint_Error; + end if; + if Winchnstr (Win, Txt, C_Int (N)) = Curses_Err then + raise Curses_Exception; + end if; + for To in Str'Range loop + exit when Txt (size_t (Cnt)) = Default_Character; + Str (To) := Txt (size_t (Cnt)); + Cnt := Cnt + 1; + end loop; + if Cnt < Str'Length then + Str ((Str'First + Cnt) .. Str'Last) := + (others => (Ch => ' ', + Color => Color_Pair'First, + Attr => Normal_Video)); + end if; + end Peek; + + procedure Peek + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : out Attributed_String; + Len : Integer := -1) + is + begin + Move_Cursor (Win, Line, Column); + Peek (Win, Str, Len); + end Peek; +------------------------------------------------------------------------------ + procedure Get (Win : Window := Standard_Window; + Str : out String; + Len : Integer := -1) + is + function Wgetnstr (Win : Window; + Str : char_array; + Len : C_Int) return C_Int; + pragma Import (C, Wgetnstr, "wgetnstr"); + + N : Integer := Len; + Txt : char_array (0 .. Str'Length); + Cnt : Natural; + begin + if N < 0 then + N := Str'Length; + end if; + if N > Str'Length then + raise Constraint_Error; + end if; + Txt (0) := Interfaces.C.char'First; + if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then + raise Curses_Exception; + end if; + To_Ada (Txt, Str, Cnt, True); + if Cnt < Str'Length then + Str ((Str'First + Cnt) .. Str'Last) := (others => ' '); + end if; + end Get; + + procedure Get + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : out String; + Len : Integer := -1) + is + begin + Move_Cursor (Win, Line, Column); + Get (Win, Str, Len); + end Get; +------------------------------------------------------------------------------ + procedure Init_Soft_Label_Keys + (Format : Soft_Label_Key_Format := Three_Two_Three) + is + function Slk_Init (Fmt : C_Int) return C_Int; + pragma Import (C, Slk_Init, "slk_init"); + begin + if Slk_Init (Soft_Label_Key_Format'Pos (Format)) = Curses_Err then + raise Curses_Exception; + end if; + end Init_Soft_Label_Keys; + + procedure Set_Soft_Label_Key (Label : Label_Number; + Text : String; + Fmt : Label_Justification := Left) + is + function Slk_Set (Label : C_Int; + Txt : char_array; + Fmt : C_Int) return C_Int; + pragma Import (C, Slk_Set, "slk_set"); + + Txt : char_array (0 .. Text'Length); + Len : size_t; + begin + To_C (Text, Txt, Len); + if Slk_Set (C_Int (Label), Txt, + C_Int (Label_Justification'Pos (Fmt))) = Curses_Err + then + raise Curses_Exception; + end if; + end Set_Soft_Label_Key; + + procedure Refresh_Soft_Label_Keys + is + function Slk_Refresh return C_Int; + pragma Import (C, Slk_Refresh, "slk_refresh"); + begin + if Slk_Refresh = Curses_Err then + raise Curses_Exception; + end if; + end Refresh_Soft_Label_Keys; + + procedure Refresh_Soft_Label_Keys_Without_Update + is + function Slk_Noutrefresh return C_Int; + pragma Import (C, Slk_Noutrefresh, "slk_noutrefresh"); + begin + if Slk_Noutrefresh = Curses_Err then + raise Curses_Exception; + end if; + end Refresh_Soft_Label_Keys_Without_Update; + + procedure Get_Soft_Label_Key (Label : Label_Number; + Text : out String) + is + function Slk_Label (Label : C_Int) return chars_ptr; + pragma Import (C, Slk_Label, "slk_label"); + begin + Fill_String (Slk_Label (C_Int (Label)), Text); + end Get_Soft_Label_Key; + + function Get_Soft_Label_Key (Label : Label_Number) return String + is + function Slk_Label (Label : C_Int) return chars_ptr; + pragma Import (C, Slk_Label, "slk_label"); + begin + return Fill_String (Slk_Label (C_Int (Label))); + end Get_Soft_Label_Key; + + procedure Clear_Soft_Label_Keys + is + function Slk_Clear return C_Int; + pragma Import (C, Slk_Clear, "slk_clear"); + begin + if Slk_Clear = Curses_Err then + raise Curses_Exception; + end if; + end Clear_Soft_Label_Keys; + + procedure Restore_Soft_Label_Keys + is + function Slk_Restore return C_Int; + pragma Import (C, Slk_Restore, "slk_restore"); + begin + if Slk_Restore = Curses_Err then + raise Curses_Exception; + end if; + end Restore_Soft_Label_Keys; + + procedure Touch_Soft_Label_Keys + is + function Slk_Touch return C_Int; + pragma Import (C, Slk_Touch, "slk_touch"); + begin + if Slk_Touch = Curses_Err then + raise Curses_Exception; + end if; + end Touch_Soft_Label_Keys; + + procedure Switch_Soft_Label_Key_Attributes + (Attr : Character_Attribute_Set; + On : Boolean := True) + is + function Slk_Attron (Ch : Attributed_Character) return C_Int; + pragma Import (C, Slk_Attron, "slk_attron"); + function Slk_Attroff (Ch : Attributed_Character) return C_Int; + pragma Import (C, Slk_Attroff, "slk_attroff"); + + Err : C_Int; + Ch : constant Attributed_Character := (Ch => Character'First, + Attr => Attr, + Color => Color_Pair'First); + begin + if On then + Err := Slk_Attron (Ch); + else + Err := Slk_Attroff (Ch); + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Switch_Soft_Label_Key_Attributes; + + procedure Set_Soft_Label_Key_Attributes + (Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Slk_Attrset (Ch : Attributed_Character) return C_Int; + pragma Import (C, Slk_Attrset, "slk_attrset"); + + Ch : constant Attributed_Character := (Ch => Character'First, + Attr => Attr, + Color => Color); + begin + if Slk_Attrset (Ch) = Curses_Err then + raise Curses_Exception; + end if; + end Set_Soft_Label_Key_Attributes; + + function Get_Soft_Label_Key_Attributes return Character_Attribute_Set + is + function Slk_Attr return Attributed_Character; + pragma Import (C, Slk_Attr, "slk_attr"); + + Attr : constant Attributed_Character := Slk_Attr; + begin + return Attr.Attr; + end Get_Soft_Label_Key_Attributes; + + function Get_Soft_Label_Key_Attributes return Color_Pair + is + function Slk_Attr return Attributed_Character; + pragma Import (C, Slk_Attr, "slk_attr"); + + Attr : constant Attributed_Character := Slk_Attr; + begin + return Attr.Color; + end Get_Soft_Label_Key_Attributes; + + procedure Set_Soft_Label_Key_Color (Pair : Color_Pair) + is + function Slk_Color (Color : C_Short) return C_Int; + pragma Import (C, Slk_Color, "slk_color"); + begin + if Slk_Color (C_Short (Pair)) = Curses_Err then + raise Curses_Exception; + end if; + end Set_Soft_Label_Key_Color; + +------------------------------------------------------------------------------ + procedure Enable_Key (Key : Special_Key_Code; + Enable : Boolean := True) + is + function Keyok (Keycode : C_Int; + On_Off : Curses_Bool) return C_Int; + pragma Import (C, Keyok, "keyok"); + begin + if Keyok (C_Int (Key), Curses_Bool (Boolean'Pos (Enable))) + = Curses_Err + then + raise Curses_Exception; + end if; + end Enable_Key; +------------------------------------------------------------------------------ + procedure Define_Key (Definition : String; + Key : Special_Key_Code) + is + function Defkey (Def : char_array; + Key : C_Int) return C_Int; + pragma Import (C, Defkey, "define_key"); + + Txt : char_array (0 .. Definition'Length); + Length : size_t; + begin + To_C (Definition, Txt, Length); + if Defkey (Txt, C_Int (Key)) = Curses_Err then + raise Curses_Exception; + end if; + end Define_Key; +------------------------------------------------------------------------------ + procedure Un_Control (Ch : Attributed_Character; + Str : out String) + is + function Unctrl (Ch : Attributed_Character) return chars_ptr; + pragma Import (C, Unctrl, "unctrl"); + begin + Fill_String (Unctrl (Ch), Str); + end Un_Control; + + function Un_Control (Ch : Attributed_Character) return String + is + function Unctrl (Ch : Attributed_Character) return chars_ptr; + pragma Import (C, Unctrl, "unctrl"); + begin + return Fill_String (Unctrl (Ch)); + end Un_Control; + + procedure Delay_Output (Msecs : Natural) + is + function Delayoutput (Msecs : C_Int) return C_Int; + pragma Import (C, Delayoutput, "delay_output"); + begin + if Delayoutput (C_Int (Msecs)) = Curses_Err then + raise Curses_Exception; + end if; + end Delay_Output; + + procedure Flush_Input + is + function Flushinp return C_Int; + pragma Import (C, Flushinp, "flushinp"); + begin + if Flushinp = Curses_Err then -- docu says that never happens, but... + raise Curses_Exception; + end if; + end Flush_Input; +------------------------------------------------------------------------------ + function Baudrate return Natural + is + function Baud return C_Int; + pragma Import (C, Baud, "baudrate"); + begin + return Natural (Baud); + end Baudrate; + + function Erase_Character return Character + is + function Erasechar return C_Int; + pragma Import (C, Erasechar, "erasechar"); + begin + return Character'Val (Erasechar); + end Erase_Character; + + function Kill_Character return Character + is + function Killchar return C_Int; + pragma Import (C, Killchar, "killchar"); + begin + return Character'Val (Killchar); + end Kill_Character; + + function Has_Insert_Character return Boolean + is + function Has_Ic return Curses_Bool; + pragma Import (C, Has_Ic, "has_ic"); + begin + if Has_Ic = Curses_Bool_False then + return False; + else + return True; + end if; + end Has_Insert_Character; + + function Has_Insert_Line return Boolean + is + function Has_Il return Curses_Bool; + pragma Import (C, Has_Il, "has_il"); + begin + if Has_Il = Curses_Bool_False then + return False; + else + return True; + end if; + end Has_Insert_Line; + + function Supported_Attributes return Character_Attribute_Set + is + function Termattrs return Attributed_Character; + pragma Import (C, Termattrs, "termattrs"); + + Ch : constant Attributed_Character := Termattrs; + begin + return Ch.Attr; + end Supported_Attributes; + + procedure Long_Name (Name : out String) + is + function Longname return chars_ptr; + pragma Import (C, Longname, "longname"); + begin + Fill_String (Longname, Name); + end Long_Name; + + function Long_Name return String + is + function Longname return chars_ptr; + pragma Import (C, Longname, "longname"); + begin + return Fill_String (Longname); + end Long_Name; + + procedure Terminal_Name (Name : out String) + is + function Termname return chars_ptr; + pragma Import (C, Termname, "termname"); + begin + Fill_String (Termname, Name); + end Terminal_Name; + + function Terminal_Name return String + is + function Termname return chars_ptr; + pragma Import (C, Termname, "termname"); + begin + return Fill_String (Termname); + end Terminal_Name; +------------------------------------------------------------------------------ + procedure Init_Pair (Pair : Redefinable_Color_Pair; + Fore : Color_Number; + Back : Color_Number) + is + function Initpair (Pair : C_Short; + Fore : C_Short; + Back : C_Short) return C_Int; + pragma Import (C, Initpair, "init_pair"); + begin + if Integer (Pair) >= Number_Of_Color_Pairs then + raise Constraint_Error; + end if; + if Integer (Fore) >= Number_Of_Colors or else + Integer (Back) >= Number_Of_Colors + then + raise Constraint_Error; + end if; + if Initpair (C_Short (Pair), C_Short (Fore), C_Short (Back)) + = Curses_Err + then + raise Curses_Exception; + end if; + end Init_Pair; + + procedure Pair_Content (Pair : Color_Pair; + Fore : out Color_Number; + Back : out Color_Number) + is + type C_Short_Access is access all C_Short; + function Paircontent (Pair : C_Short; + Fp : C_Short_Access; + Bp : C_Short_Access) return C_Int; + pragma Import (C, Paircontent, "pair_content"); + + F, B : aliased C_Short; + begin + if Paircontent (C_Short (Pair), F'Access, B'Access) = Curses_Err then + raise Curses_Exception; + else + Fore := Color_Number (F); + Back := Color_Number (B); + end if; + end Pair_Content; + + function Has_Colors return Boolean + is + function Hascolors return Curses_Bool; + pragma Import (C, Hascolors, "has_colors"); + begin + if Hascolors = Curses_Bool_False then + return False; + else + return True; + end if; + end Has_Colors; + + procedure Init_Color (Color : Color_Number; + Red : RGB_Value; + Green : RGB_Value; + Blue : RGB_Value) + is + function Initcolor (Col : C_Short; + Red : C_Short; + Green : C_Short; + Blue : C_Short) return C_Int; + pragma Import (C, Initcolor, "init_color"); + begin + if Initcolor (C_Short (Color), C_Short (Red), C_Short (Green), + C_Short (Blue)) = Curses_Err + then + raise Curses_Exception; + end if; + end Init_Color; + + function Can_Change_Color return Boolean + is + function Canchangecolor return Curses_Bool; + pragma Import (C, Canchangecolor, "can_change_color"); + begin + if Canchangecolor = Curses_Bool_False then + return False; + else + return True; + end if; + end Can_Change_Color; + + procedure Color_Content (Color : Color_Number; + Red : out RGB_Value; + Green : out RGB_Value; + Blue : out RGB_Value) + is + type C_Short_Access is access all C_Short; + + function Colorcontent (Color : C_Short; R, G, B : C_Short_Access) + return C_Int; + pragma Import (C, Colorcontent, "color_content"); + + R, G, B : aliased C_Short; + begin + if Colorcontent (C_Short (Color), R'Access, G'Access, B'Access) = + Curses_Err + then + raise Curses_Exception; + else + Red := RGB_Value (R); + Green := RGB_Value (G); + Blue := RGB_Value (B); + end if; + end Color_Content; + +------------------------------------------------------------------------------ + procedure Save_Curses_Mode (Mode : Curses_Mode) + is + function Def_Prog_Mode return C_Int; + pragma Import (C, Def_Prog_Mode, "def_prog_mode"); + function Def_Shell_Mode return C_Int; + pragma Import (C, Def_Shell_Mode, "def_shell_mode"); + + Err : C_Int; + begin + case Mode is + when Curses => Err := Def_Prog_Mode; + when Shell => Err := Def_Shell_Mode; + end case; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Save_Curses_Mode; + + procedure Reset_Curses_Mode (Mode : Curses_Mode) + is + function Reset_Prog_Mode return C_Int; + pragma Import (C, Reset_Prog_Mode, "reset_prog_mode"); + function Reset_Shell_Mode return C_Int; + pragma Import (C, Reset_Shell_Mode, "reset_shell_mode"); + + Err : C_Int; + begin + case Mode is + when Curses => Err := Reset_Prog_Mode; + when Shell => Err := Reset_Shell_Mode; + end case; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Reset_Curses_Mode; + + procedure Save_Terminal_State + is + function Savetty return C_Int; + pragma Import (C, Savetty, "savetty"); + begin + if Savetty = Curses_Err then + raise Curses_Exception; + end if; + end Save_Terminal_State; + + procedure Reset_Terminal_State + is + function Resetty return C_Int; + pragma Import (C, Resetty, "resetty"); + begin + if Resetty = Curses_Err then + raise Curses_Exception; + end if; + end Reset_Terminal_State; + + procedure Rip_Off_Lines (Lines : Integer; + Proc : Stdscr_Init_Proc) + is + function Ripoffline (Lines : C_Int; + Proc : Stdscr_Init_Proc) return C_Int; + pragma Import (C, Ripoffline, "_nc_ripoffline"); + begin + if Ripoffline (C_Int (Lines), Proc) = Curses_Err then + raise Curses_Exception; + end if; + end Rip_Off_Lines; + + procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility) + is + function Curs_Set (Curs : C_Int) return C_Int; + pragma Import (C, Curs_Set, "curs_set"); + + Res : C_Int; + begin + Res := Curs_Set (Cursor_Visibility'Pos (Visibility)); + if Res /= Curses_Err then + Visibility := Cursor_Visibility'Val (Res); + end if; + end Set_Cursor_Visibility; + + procedure Nap_Milli_Seconds (Ms : Natural) + is + function Napms (Ms : C_Int) return C_Int; + pragma Import (C, Napms, "napms"); + begin + if Napms (C_Int (Ms)) = Curses_Err then + raise Curses_Exception; + end if; + end Nap_Milli_Seconds; +------------------------------------------------------------------------------ + function Lines return Line_Count + is + function LINES_As_Function return Interfaces.C.int; + pragma Import (C, LINES_As_Function, "LINES_as_function"); + begin + return Line_Count (LINES_As_Function); + end Lines; + + function Columns return Column_Count + is + function COLS_As_Function return Interfaces.C.int; + pragma Import (C, COLS_As_Function, "COLS_as_function"); + begin + return Column_Count (COLS_As_Function); + end Columns; + + function Tab_Size return Natural + is + function TABSIZE_As_Function return Interfaces.C.int; + pragma Import (C, TABSIZE_As_Function, "TABSIZE_as_function"); + + begin + return Natural (TABSIZE_As_Function); + end Tab_Size; + + function Number_Of_Colors return Natural + is + function COLORS_As_Function return Interfaces.C.int; + pragma Import (C, COLORS_As_Function, "COLORS_as_function"); + begin + return Natural (COLORS_As_Function); + end Number_Of_Colors; + + function Number_Of_Color_Pairs return Natural + is + function COLOR_PAIRS_As_Function return Interfaces.C.int; + pragma Import (C, COLOR_PAIRS_As_Function, "COLOR_PAIRS_as_function"); + begin + return Natural (COLOR_PAIRS_As_Function); + end Number_Of_Color_Pairs; +------------------------------------------------------------------------------ + procedure Transform_Coordinates + (W : Window := Standard_Window; + Line : in out Line_Position; + Column : in out Column_Position; + Dir : Transform_Direction := From_Screen) + is + type Int_Access is access all C_Int; + function Transform (W : Window; + Y, X : Int_Access; + Dir : Curses_Bool) return C_Int; + pragma Import (C, Transform, "wmouse_trafo"); + + X : aliased C_Int := C_Int (Column); + Y : aliased C_Int := C_Int (Line); + D : Curses_Bool := Curses_Bool_False; + R : C_Int; + begin + if Dir = To_Screen then + D := 1; + end if; + R := Transform (W, Y'Access, X'Access, D); + if R = Curses_False then + raise Curses_Exception; + else + Line := Line_Position (Y); + Column := Column_Position (X); + end if; + end Transform_Coordinates; +------------------------------------------------------------------------------ + procedure Use_Default_Colors is + function C_Use_Default_Colors return C_Int; + pragma Import (C, C_Use_Default_Colors, "use_default_colors"); + Err : constant C_Int := C_Use_Default_Colors; + begin + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Use_Default_Colors; + + procedure Assume_Default_Colors (Fore : Color_Number := Default_Color; + Back : Color_Number := Default_Color) + is + function C_Assume_Default_Colors (Fore : C_Int; + Back : C_Int) return C_Int; + pragma Import (C, C_Assume_Default_Colors, "assume_default_colors"); + + Err : constant C_Int := C_Assume_Default_Colors (C_Int (Fore), + C_Int (Back)); + begin + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Assume_Default_Colors; +------------------------------------------------------------------------------ + function Curses_Version return String + is + function curses_versionC return chars_ptr; + pragma Import (C, curses_versionC, "curses_version"); + Result : constant chars_ptr := curses_versionC; + begin + return Fill_String (Result); + end Curses_Version; +------------------------------------------------------------------------------ + procedure Curses_Free_All is + procedure curses_freeall; + pragma Import (C, curses_freeall, "_nc_freeall"); + begin + -- Use this only for testing: you cannot use curses after calling it, + -- so it has to be the "last" thing done before exiting the program. + -- This will not really free ALL of memory used by curses. That is + -- because it cannot free the memory used for stdout's setbuf. The + -- _nc_free_and_exit() procedure can do that, but it can be invoked + -- safely only from C - and again, that only as the "last" thing done + -- before exiting the program. + curses_freeall; + end Curses_Free_All; +------------------------------------------------------------------------------ + function Use_Extended_Names (Enable : Boolean) return Boolean + is + function use_extended_namesC (e : Curses_Bool) return C_Int; + pragma Import (C, use_extended_namesC, "use_extended_names"); + + Res : constant C_Int := + use_extended_namesC (Curses_Bool (Boolean'Pos (Enable))); + begin + if Res = C_Int (Curses_Bool_False) then + return False; + else + return True; + end if; + end Use_Extended_Names; +------------------------------------------------------------------------------ + procedure Screen_Dump_To_File (Filename : String) + is + function scr_dump (f : char_array) return C_Int; + pragma Import (C, scr_dump, "scr_dump"); + Txt : char_array (0 .. Filename'Length); + Length : size_t; + begin + To_C (Filename, Txt, Length); + if Curses_Err = scr_dump (Txt) then + raise Curses_Exception; + end if; + end Screen_Dump_To_File; + + procedure Screen_Restore_From_File (Filename : String) + is + function scr_restore (f : char_array) return C_Int; + pragma Import (C, scr_restore, "scr_restore"); + Txt : char_array (0 .. Filename'Length); + Length : size_t; + begin + To_C (Filename, Txt, Length); + if Curses_Err = scr_restore (Txt) then + raise Curses_Exception; + end if; + end Screen_Restore_From_File; + + procedure Screen_Init_From_File (Filename : String) + is + function scr_init (f : char_array) return C_Int; + pragma Import (C, scr_init, "scr_init"); + Txt : char_array (0 .. Filename'Length); + Length : size_t; + begin + To_C (Filename, Txt, Length); + if Curses_Err = scr_init (Txt) then + raise Curses_Exception; + end if; + end Screen_Init_From_File; + + procedure Screen_Set_File (Filename : String) + is + function scr_set (f : char_array) return C_Int; + pragma Import (C, scr_set, "scr_set"); + Txt : char_array (0 .. Filename'Length); + Length : size_t; + begin + To_C (Filename, Txt, Length); + if Curses_Err = scr_set (Txt) then + raise Curses_Exception; + end if; + end Screen_Set_File; +------------------------------------------------------------------------------ + procedure Resize (Win : Window := Standard_Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count) is + function wresize (win : Window; + lines : C_Int; + columns : C_Int) return C_Int; + pragma Import (C, wresize); + begin + if wresize (Win, + C_Int (Number_Of_Lines), + C_Int (Number_Of_Columns)) = Curses_Err + then + raise Curses_Exception; + end if; + end Resize; +------------------------------------------------------------------------------ + +end Terminal_Interface.Curses; diff --git a/contrib/ncurses/Ada95/gen/terminal_interface-curses.ads.m4 b/contrib/ncurses/Ada95/gen/terminal_interface-curses.ads.m4 new file mode 100644 index 00000000..d6b18e58 --- /dev/null +++ b/contrib/ncurses/Ada95/gen/terminal_interface-curses.ads.m4 @@ -0,0 +1,2015 @@ +-- -*- ada -*- +define(`HTMLNAME',`terminal_interface-curses__ads.htm')dnl +include(M4MACRO)include(options.m4)------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020,2024 Thomas E. Dickey -- +-- Copyright 1998-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.49 $ +-- $Date: 2024/01/19 16:51:30 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System.Storage_Elements; +with Interfaces.C; -- We need this for some assertions. + +with Terminal_Interface.Curses_Constants; + +package Terminal_Interface.Curses is + pragma Preelaborate (Terminal_Interface.Curses); + pragma Linker_Options ("-lncurses" & Curses_Constants.DFT_ARG_SUFFIX); + + Major_Version : constant := Curses_Constants.NCURSES_VERSION_MAJOR; + Minor_Version : constant := Curses_Constants.NCURSES_VERSION_MINOR; + NC_Version : String renames Curses_Constants.Version; + + type Window is private; + Null_Window : constant Window; + + type Line_Position is new Integer; -- line coordinate + type Column_Position is new Integer; -- column coordinate + + subtype Line_Count is Line_Position range 1 .. Line_Position'Last; + -- Type to count lines. We do not allow null windows, so must be positive + subtype Column_Count is Column_Position range 1 .. Column_Position'Last; + -- Type to count columns. We do not allow null windows, so must be positive + + type Key_Code is new Integer; + -- That is anything including real characters, special keys and logical + -- request codes. + + -- FIXME: The "-1" should be Curses_Err + subtype Real_Key_Code is Key_Code range -1 .. Curses_Constants.KEY_MAX; + -- This are the codes that potentially represent a real keystroke. + -- Not all codes may be possible on a specific terminal. To check the + -- availability of a special key, the Has_Key function is provided. + + subtype Special_Key_Code is Real_Key_Code + range Curses_Constants. KEY_MIN - 1 .. Real_Key_Code'Last; + -- Type for a function- or special key number + + subtype Normal_Key_Code is Real_Key_Code range + Character'Pos (Character'First) .. Character'Pos (Character'Last); + -- This are the codes for regular (incl. non-graphical) characters. + + -- For those who like to use the original key names we produce them were + -- they differ from the original. + + -- Constants for function- and special keys + Key_None : constant Special_Key_Code + := Curses_Constants.KEY_MIN - 1; + Key_Min : constant Special_Key_Code + := Curses_Constants.KEY_MIN; + Key_Break : constant Special_Key_Code + := Curses_Constants.KEY_BREAK; + KEY_DOWN : constant Special_Key_Code + := Curses_Constants.KEY_DOWN; + Key_Cursor_Down : Special_Key_Code renames KEY_DOWN; + KEY_UP : constant Special_Key_Code + := Curses_Constants.KEY_UP; + Key_Cursor_Up : Special_Key_Code renames KEY_UP; + KEY_LEFT : constant Special_Key_Code + := Curses_Constants.KEY_LEFT; + Key_Cursor_Left : Special_Key_Code renames KEY_LEFT; + KEY_RIGHT : constant Special_Key_Code + := Curses_Constants.KEY_RIGHT; + Key_Cursor_Right : Special_Key_Code renames KEY_RIGHT; + Key_Home : constant Special_Key_Code + := Curses_Constants.KEY_HOME; + Key_Backspace : constant Special_Key_Code + := Curses_Constants.KEY_BACKSPACE; + Key_F0 : constant Special_Key_Code + := Curses_Constants.KEY_F0; + Key_F1 : constant Special_Key_Code + := Curses_Constants.KEY_F1; + Key_F2 : constant Special_Key_Code + := Curses_Constants.KEY_F2; + Key_F3 : constant Special_Key_Code + := Curses_Constants.KEY_F3; + Key_F4 : constant Special_Key_Code + := Curses_Constants.KEY_F4; + Key_F5 : constant Special_Key_Code + := Curses_Constants.KEY_F5; + Key_F6 : constant Special_Key_Code + := Curses_Constants.KEY_F6; + Key_F7 : constant Special_Key_Code + := Curses_Constants.KEY_F7; + Key_F8 : constant Special_Key_Code + := Curses_Constants.KEY_F8; + Key_F9 : constant Special_Key_Code + := Curses_Constants.KEY_F9; + Key_F10 : constant Special_Key_Code + := Curses_Constants.KEY_F10; + Key_F11 : constant Special_Key_Code + := Curses_Constants.KEY_F11; + Key_F12 : constant Special_Key_Code + := Curses_Constants.KEY_F12; + Key_F13 : constant Special_Key_Code + := Curses_Constants.KEY_F13; + Key_F14 : constant Special_Key_Code + := Curses_Constants.KEY_F14; + Key_F15 : constant Special_Key_Code + := Curses_Constants.KEY_F15; + Key_F16 : constant Special_Key_Code + := Curses_Constants.KEY_F16; + Key_F17 : constant Special_Key_Code + := Curses_Constants.KEY_F17; + Key_F18 : constant Special_Key_Code + := Curses_Constants.KEY_F18; + Key_F19 : constant Special_Key_Code + := Curses_Constants.KEY_F19; + Key_F20 : constant Special_Key_Code + := Curses_Constants.KEY_F20; + Key_F21 : constant Special_Key_Code + := Curses_Constants.KEY_F21; + Key_F22 : constant Special_Key_Code + := Curses_Constants.KEY_F22; + Key_F23 : constant Special_Key_Code + := Curses_Constants.KEY_F23; + Key_F24 : constant Special_Key_Code + := Curses_Constants.KEY_F24; + KEY_DL : constant Special_Key_Code + := Curses_Constants.KEY_DL; + Key_Delete_Line : Special_Key_Code renames KEY_DL; + KEY_IL : constant Special_Key_Code + := Curses_Constants.KEY_IL; + Key_Insert_Line : Special_Key_Code renames KEY_IL; + KEY_DC : constant Special_Key_Code + := Curses_Constants.KEY_DC; + Key_Delete_Char : Special_Key_Code renames KEY_DC; + KEY_IC : constant Special_Key_Code + := Curses_Constants.KEY_IC; + Key_Insert_Char : Special_Key_Code renames KEY_IC; + KEY_EIC : constant Special_Key_Code + := Curses_Constants.KEY_EIC; + Key_Exit_Insert_Mode : Special_Key_Code renames KEY_EIC; + KEY_CLEAR : constant Special_Key_Code + := Curses_Constants.KEY_CLEAR; + Key_Clear_Screen : Special_Key_Code renames KEY_CLEAR; + KEY_EOS : constant Special_Key_Code + := Curses_Constants.KEY_EOS; + Key_Clear_End_Of_Screen : Special_Key_Code renames KEY_EOS; + KEY_EOL : constant Special_Key_Code + := Curses_Constants.KEY_EOL; + Key_Clear_End_Of_Line : Special_Key_Code renames KEY_EOL; + KEY_SF : constant Special_Key_Code + := Curses_Constants.KEY_SF; + Key_Scroll_1_Forward : Special_Key_Code renames KEY_SF; + KEY_SR : constant Special_Key_Code + := Curses_Constants.KEY_SR; + Key_Scroll_1_Backward : Special_Key_Code renames KEY_SR; + KEY_NPAGE : constant Special_Key_Code + := Curses_Constants.KEY_NPAGE; + Key_Next_Page : Special_Key_Code renames KEY_NPAGE; + KEY_PPAGE : constant Special_Key_Code + := Curses_Constants.KEY_PPAGE; + Key_Previous_Page : Special_Key_Code renames KEY_PPAGE; + KEY_STAB : constant Special_Key_Code + := Curses_Constants.KEY_STAB; + Key_Set_Tab : Special_Key_Code renames KEY_STAB; + KEY_CTAB : constant Special_Key_Code + := Curses_Constants.KEY_CTAB; + Key_Clear_Tab : Special_Key_Code renames KEY_CTAB; + KEY_CATAB : constant Special_Key_Code + := Curses_Constants.KEY_CATAB; + Key_Clear_All_Tabs : Special_Key_Code renames KEY_CATAB; + KEY_ENTER : constant Special_Key_Code + := Curses_Constants.KEY_ENTER; + Key_Enter_Or_Send : Special_Key_Code renames KEY_ENTER; + KEY_SRESET : constant Special_Key_Code + := Curses_Constants.KEY_SRESET; + Key_Soft_Reset : Special_Key_Code renames KEY_SRESET; + Key_Reset : constant Special_Key_Code + := Curses_Constants.KEY_RESET; + Key_Print : constant Special_Key_Code + := Curses_Constants.KEY_PRINT; + KEY_LL : constant Special_Key_Code + := Curses_Constants.KEY_LL; + Key_Bottom : Special_Key_Code renames KEY_LL; + KEY_A1 : constant Special_Key_Code + := Curses_Constants.KEY_A1; + Key_Upper_Left_Of_Keypad : Special_Key_Code renames KEY_A1; + KEY_A3 : constant Special_Key_Code + := Curses_Constants.KEY_A3; + Key_Upper_Right_Of_Keypad : Special_Key_Code renames KEY_A3; + KEY_B2 : constant Special_Key_Code + := Curses_Constants.KEY_B2; + Key_Center_Of_Keypad : Special_Key_Code renames KEY_B2; + KEY_C1 : constant Special_Key_Code + := Curses_Constants.KEY_C1; + Key_Lower_Left_Of_Keypad : Special_Key_Code renames KEY_C1; + KEY_C3 : constant Special_Key_Code + := Curses_Constants.KEY_C3; + Key_Lower_Right_Of_Keypad : Special_Key_Code renames KEY_C3; + KEY_BTAB : constant Special_Key_Code + := Curses_Constants.KEY_BTAB; + Key_Back_Tab : Special_Key_Code renames KEY_BTAB; + KEY_BEG : constant Special_Key_Code + := Curses_Constants.KEY_BEG; + Key_Beginning : Special_Key_Code renames KEY_BEG; + Key_Cancel : constant Special_Key_Code + := Curses_Constants.KEY_CANCEL; + Key_Close : constant Special_Key_Code + := Curses_Constants.KEY_CLOSE; + Key_Command : constant Special_Key_Code + := Curses_Constants.KEY_COMMAND; + Key_Copy : constant Special_Key_Code + := Curses_Constants.KEY_COPY; + Key_Create : constant Special_Key_Code + := Curses_Constants.KEY_CREATE; + Key_End : constant Special_Key_Code + := Curses_Constants.KEY_END; + Key_Exit : constant Special_Key_Code + := Curses_Constants.KEY_EXIT; + Key_Find : constant Special_Key_Code + := Curses_Constants.KEY_FIND; + Key_Help : constant Special_Key_Code + := Curses_Constants.KEY_HELP; + Key_Mark : constant Special_Key_Code + := Curses_Constants.KEY_MARK; + Key_Message : constant Special_Key_Code + := Curses_Constants.KEY_MESSAGE; + Key_Move : constant Special_Key_Code + := Curses_Constants.KEY_MOVE; + Key_Next : constant Special_Key_Code + := Curses_Constants.KEY_NEXT; + Key_Open : constant Special_Key_Code + := Curses_Constants.KEY_OPEN; + Key_Options : constant Special_Key_Code + := Curses_Constants.KEY_OPTIONS; + Key_Previous : constant Special_Key_Code + := Curses_Constants.KEY_PREVIOUS; + Key_Redo : constant Special_Key_Code + := Curses_Constants.KEY_REDO; + Key_Reference : constant Special_Key_Code + := Curses_Constants.KEY_REFERENCE; + Key_Refresh : constant Special_Key_Code + := Curses_Constants.KEY_REFRESH; + Key_Replace : constant Special_Key_Code + := Curses_Constants.KEY_REPLACE; + Key_Restart : constant Special_Key_Code + := Curses_Constants.KEY_RESTART; + Key_Resume : constant Special_Key_Code + := Curses_Constants.KEY_RESUME; + Key_Save : constant Special_Key_Code + := Curses_Constants.KEY_SAVE; + KEY_SBEG : constant Special_Key_Code + := Curses_Constants.KEY_SBEG; + Key_Shift_Begin : Special_Key_Code renames KEY_SBEG; + KEY_SCANCEL : constant Special_Key_Code + := Curses_Constants.KEY_SCANCEL; + Key_Shift_Cancel : Special_Key_Code renames KEY_SCANCEL; + KEY_SCOMMAND : constant Special_Key_Code + := Curses_Constants.KEY_SCOMMAND; + Key_Shift_Command : Special_Key_Code renames KEY_SCOMMAND; + KEY_SCOPY : constant Special_Key_Code + := Curses_Constants.KEY_SCOPY; + Key_Shift_Copy : Special_Key_Code renames KEY_SCOPY; + KEY_SCREATE : constant Special_Key_Code + := Curses_Constants.KEY_SCREATE; + Key_Shift_Create : Special_Key_Code renames KEY_SCREATE; + KEY_SDC : constant Special_Key_Code + := Curses_Constants.KEY_SDC; + Key_Shift_Delete_Char : Special_Key_Code renames KEY_SDC; + KEY_SDL : constant Special_Key_Code + := Curses_Constants.KEY_SDL; + Key_Shift_Delete_Line : Special_Key_Code renames KEY_SDL; + Key_Select : constant Special_Key_Code + := Curses_Constants.KEY_SELECT; + KEY_SEND : constant Special_Key_Code + := Curses_Constants.KEY_SEND; + Key_Shift_End : Special_Key_Code renames KEY_SEND; + KEY_SEOL : constant Special_Key_Code + := Curses_Constants.KEY_SEOL; + Key_Shift_Clear_End_Of_Line : Special_Key_Code renames KEY_SEOL; + KEY_SEXIT : constant Special_Key_Code + := Curses_Constants.KEY_SEXIT; + Key_Shift_Exit : Special_Key_Code renames KEY_SEXIT; + KEY_SFIND : constant Special_Key_Code + := Curses_Constants.KEY_SFIND; + Key_Shift_Find : Special_Key_Code renames KEY_SFIND; + KEY_SHELP : constant Special_Key_Code + := Curses_Constants.KEY_SHELP; + Key_Shift_Help : Special_Key_Code renames KEY_SHELP; + KEY_SHOME : constant Special_Key_Code + := Curses_Constants.KEY_SHOME; + Key_Shift_Home : Special_Key_Code renames KEY_SHOME; + KEY_SIC : constant Special_Key_Code + := Curses_Constants.KEY_SIC; + Key_Shift_Insert_Char : Special_Key_Code renames KEY_SIC; + KEY_SLEFT : constant Special_Key_Code + := Curses_Constants.KEY_SLEFT; + Key_Shift_Cursor_Left : Special_Key_Code renames KEY_SLEFT; + KEY_SMESSAGE : constant Special_Key_Code + := Curses_Constants.KEY_SMESSAGE; + Key_Shift_Message : Special_Key_Code renames KEY_SMESSAGE; + KEY_SMOVE : constant Special_Key_Code + := Curses_Constants.KEY_SMOVE; + Key_Shift_Move : Special_Key_Code renames KEY_SMOVE; + KEY_SNEXT : constant Special_Key_Code + := Curses_Constants.KEY_SNEXT; + Key_Shift_Next_Page : Special_Key_Code renames KEY_SNEXT; + KEY_SOPTIONS : constant Special_Key_Code + := Curses_Constants.KEY_SOPTIONS; + Key_Shift_Options : Special_Key_Code renames KEY_SOPTIONS; + KEY_SPREVIOUS : constant Special_Key_Code + := Curses_Constants.KEY_SPREVIOUS; + Key_Shift_Previous_Page : Special_Key_Code renames KEY_SPREVIOUS; + KEY_SPRINT : constant Special_Key_Code + := Curses_Constants.KEY_SPRINT; + Key_Shift_Print : Special_Key_Code renames KEY_SPRINT; + KEY_SREDO : constant Special_Key_Code + := Curses_Constants.KEY_SREDO; + Key_Shift_Redo : Special_Key_Code renames KEY_SREDO; + KEY_SREPLACE : constant Special_Key_Code + := Curses_Constants.KEY_SREPLACE; + Key_Shift_Replace : Special_Key_Code renames KEY_SREPLACE; + KEY_SRIGHT : constant Special_Key_Code + := Curses_Constants.KEY_SRIGHT; + Key_Shift_Cursor_Right : Special_Key_Code renames KEY_SRIGHT; + KEY_SRSUME : constant Special_Key_Code + := Curses_Constants.KEY_SRSUME; + Key_Shift_Resume : Special_Key_Code renames KEY_SRSUME; + KEY_SSAVE : constant Special_Key_Code + := Curses_Constants.KEY_SSAVE; + Key_Shift_Save : Special_Key_Code renames KEY_SSAVE; + KEY_SSUSPEND : constant Special_Key_Code + := Curses_Constants.KEY_SSUSPEND; + Key_Shift_Suspend : Special_Key_Code renames KEY_SSUSPEND; + KEY_SUNDO : constant Special_Key_Code + := Curses_Constants.KEY_SUNDO; + Key_Shift_Undo : Special_Key_Code renames KEY_SUNDO; + Key_Suspend : constant Special_Key_Code + := Curses_Constants.KEY_SUSPEND; + Key_Undo : constant Special_Key_Code + := Curses_Constants.KEY_UNDO; + Key_Mouse : constant Special_Key_Code + := Curses_Constants.KEY_MOUSE; +OPT_KEY_RESIZE Key_Resize : constant Special_Key_Code +OPT_KEY_RESIZE := Curses_Constants.KEY_RESIZE; + Key_Max : constant Special_Key_Code + := Special_Key_Code'Last; + + subtype User_Key_Code is Key_Code + range (Key_Max + 129) .. Key_Code'Last; + -- This is reserved for user defined key codes. The range between Key_Max + -- and the first user code is reserved for subsystems like menu and forms. + + -------------------------------------------------------------------------- + + type Color_Number is range -1 .. Integer (Interfaces.C.short'Last); + for Color_Number'Size use Interfaces.C.short'Size; + -- (n)curses uses a short for the color index + -- The model is, that a Color_Number is an index into an array of + -- (potentially) definable colors. Some of those indices are + -- predefined (see below), although they may not really exist. + + Black : constant Color_Number := Curses_Constants.COLOR_BLACK; + Red : constant Color_Number := Curses_Constants.COLOR_RED; + Green : constant Color_Number := Curses_Constants.COLOR_GREEN; + Yellow : constant Color_Number := Curses_Constants.COLOR_YELLOW; + Blue : constant Color_Number := Curses_Constants.COLOR_BLUE; + Magenta : constant Color_Number := Curses_Constants.COLOR_MAGENTA; + Cyan : constant Color_Number := Curses_Constants.COLOR_CYAN; + White : constant Color_Number := Curses_Constants.COLOR_WHITE; + + type RGB_Value is range 0 .. Integer (Interfaces.C.short'Last); + for RGB_Value'Size use Interfaces.C.short'Size; + -- Some system may allow to redefine a color by setting RGB values. + + type Color_Pair is range 0 .. 255; + for Color_Pair'Size use 8; + subtype Redefinable_Color_Pair is Color_Pair range 1 .. 255; + -- (n)curses reserves 1 Byte for the color-pair number. Color Pair 0 + -- is fixed (Black & White). A color pair is simply a combination of + -- two colors described by Color_Numbers, one for the foreground and + -- the other for the background + + type Character_Attribute_Set is + record + Stand_Out : Boolean; + Under_Line : Boolean; + Reverse_Video : Boolean; + Blink : Boolean; + Dim_Character : Boolean; + Bold_Character : Boolean; + Protected_Character : Boolean; + Invisible_Character : Boolean; + Alternate_Character_Set : Boolean; + Horizontal : Boolean; + Left : Boolean; + Low : Boolean; + Right : Boolean; + Top : Boolean; + Vertical : Boolean; + end record; + + for Character_Attribute_Set use + record + Stand_Out at 0 range + Curses_Constants.A_STANDOUT_First - Curses_Constants.Attr_First + .. Curses_Constants.A_STANDOUT_Last - Curses_Constants.Attr_First; + Under_Line at 0 range + Curses_Constants.A_UNDERLINE_First - Curses_Constants.Attr_First + .. Curses_Constants.A_UNDERLINE_Last - Curses_Constants.Attr_First; + Reverse_Video at 0 range + Curses_Constants.A_REVERSE_First - Curses_Constants.Attr_First + .. Curses_Constants.A_REVERSE_Last - Curses_Constants.Attr_First; + Blink at 0 range + Curses_Constants.A_BLINK_First - Curses_Constants.Attr_First + .. Curses_Constants.A_BLINK_Last - Curses_Constants.Attr_First; + Dim_Character at 0 range + Curses_Constants.A_DIM_First - Curses_Constants.Attr_First + .. Curses_Constants.A_DIM_Last - Curses_Constants.Attr_First; + Bold_Character at 0 range + Curses_Constants.A_BOLD_First - Curses_Constants.Attr_First + .. Curses_Constants.A_BOLD_Last - Curses_Constants.Attr_First; + Protected_Character at 0 range + Curses_Constants.A_PROTECT_First - Curses_Constants.Attr_First + .. Curses_Constants.A_PROTECT_Last - Curses_Constants.Attr_First; + Invisible_Character at 0 range + Curses_Constants.A_INVIS_First - Curses_Constants.Attr_First + .. Curses_Constants.A_INVIS_Last - Curses_Constants.Attr_First; + Alternate_Character_Set at 0 range + Curses_Constants.A_ALTCHARSET_First - Curses_Constants.Attr_First + .. Curses_Constants.A_ALTCHARSET_Last - Curses_Constants.Attr_First; + Horizontal at 0 range + Curses_Constants.A_HORIZONTAL_First - Curses_Constants.Attr_First + .. Curses_Constants.A_HORIZONTAL_Last - Curses_Constants.Attr_First; + Left at 0 range + Curses_Constants.A_LEFT_First - Curses_Constants.Attr_First + .. Curses_Constants.A_LEFT_Last - Curses_Constants.Attr_First; + Low at 0 range + Curses_Constants.A_LOW_First - Curses_Constants.Attr_First + .. Curses_Constants.A_LOW_Last - Curses_Constants.Attr_First; + Right at 0 range + Curses_Constants.A_RIGHT_First - Curses_Constants.Attr_First + .. Curses_Constants.A_RIGHT_Last - Curses_Constants.Attr_First; + Top at 0 range + Curses_Constants.A_TOP_First - Curses_Constants.Attr_First + .. Curses_Constants.A_TOP_Last - Curses_Constants.Attr_First; + Vertical at 0 range + Curses_Constants.A_VERTICAL_First - Curses_Constants.Attr_First + .. Curses_Constants.A_VERTICAL_Last - Curses_Constants.Attr_First; + end record; + + Normal_Video : constant Character_Attribute_Set := (others => False); + + type Attributed_Character is + record + Attr : Character_Attribute_Set; + Color : Color_Pair; + Ch : Character; + end record; + pragma Convention (C_Pass_By_Copy, Attributed_Character); + -- This is the counterpart for the chtype in C. + + for Attributed_Character use + record + Ch at 0 range Curses_Constants.A_CHARTEXT_First + .. Curses_Constants.A_CHARTEXT_Last; + Color at 0 range Curses_Constants.A_COLOR_First + .. Curses_Constants.A_COLOR_Last; + pragma Warnings (Off); + Attr at 0 range Curses_Constants.Attr_First + .. Curses_Constants.Attr_Last; + pragma Warnings (On); + end record; + for Attributed_Character'Size use Curses_Constants.chtype_Size; + + Default_Character : constant Attributed_Character + := (Ch => Character'First, + Color => Color_Pair'First, + Attr => (others => False)); -- preelaboratable Normal_Video + + type Attributed_String is array (Positive range <>) of Attributed_Character; + pragma Convention (C, Attributed_String); + -- In this binding we allow strings of attributed characters. + + ------------------ + -- Exceptions -- + ------------------ + Curses_Exception : exception; + Wrong_Curses_Version : exception; + + -- Those exceptions are raised by the ETI (Extended Terminal Interface) + -- subpackets for Menu and Forms handling. + -- + Eti_System_Error : exception; + Eti_Bad_Argument : exception; + Eti_Posted : exception; + Eti_Connected : exception; + Eti_Bad_State : exception; + Eti_No_Room : exception; + Eti_Not_Posted : exception; + Eti_Unknown_Command : exception; + Eti_No_Match : exception; + Eti_Not_Selectable : exception; + Eti_Not_Connected : exception; + Eti_Request_Denied : exception; + Eti_Invalid_Field : exception; + Eti_Current : exception; + + -------------------------------------------------------------------------- + -- External C variables + -- Conceptually even in C this are kind of constants, but they are + -- initialized and sometimes changed by the library routines at runtime + -- depending on the type of terminal. I believe the best way to model + -- this is to use functions. + -------------------------------------------------------------------------- + + function Lines return Line_Count; + pragma Inline (Lines); + + function Columns return Column_Count; + pragma Inline (Columns); + + function Tab_Size return Natural; + pragma Inline (Tab_Size); + + function Number_Of_Colors return Natural; + pragma Inline (Number_Of_Colors); + + function Number_Of_Color_Pairs return Natural; + pragma Inline (Number_Of_Color_Pairs); + + subtype ACS_Index is Character range + Character'Val (0) .. Character'Val (127); + function ACS_Map (Index : ACS_Index) return Attributed_Character; + pragma Import (C, ACS_Map, "acs_map_as_function"); + + -- Constants for several characters from the Alternate Character Set + -- You must use these constants as indices into the ACS_Map function + -- to get the corresponding attributed character at runtime + ACS_Upper_Left_Corner : constant ACS_Index + := Character'Val (Curses_Constants.ACS_ULCORNER); + ACS_Lower_Left_Corner : constant ACS_Index + := Character'Val (Curses_Constants.ACS_LLCORNER); + ACS_Upper_Right_Corner : constant ACS_Index + := Character'Val (Curses_Constants.ACS_URCORNER); + ACS_Lower_Right_Corner : constant ACS_Index + := Character'Val (Curses_Constants.ACS_LRCORNER); + ACS_Left_Tee : constant ACS_Index + := Character'Val (Curses_Constants.ACS_LTEE); + ACS_Right_Tee : constant ACS_Index + := Character'Val (Curses_Constants.ACS_RTEE); + ACS_Bottom_Tee : constant ACS_Index + := Character'Val (Curses_Constants.ACS_BTEE); + ACS_Top_Tee : constant ACS_Index + := Character'Val (Curses_Constants.ACS_TTEE); + ACS_Horizontal_Line : constant ACS_Index + := Character'Val (Curses_Constants.ACS_HLINE); + ACS_Vertical_Line : constant ACS_Index + := Character'Val (Curses_Constants.ACS_VLINE); + ACS_Plus_Symbol : constant ACS_Index + := Character'Val (Curses_Constants.ACS_PLUS); + ACS_Scan_Line_1 : constant ACS_Index + := Character'Val (Curses_Constants.ACS_S1); + ACS_Scan_Line_9 : constant ACS_Index + := Character'Val (Curses_Constants.ACS_S9); + ACS_Diamond : constant ACS_Index + := Character'Val (Curses_Constants.ACS_DIAMOND); + ACS_Checker_Board : constant ACS_Index + := Character'Val (Curses_Constants.ACS_CKBOARD); + ACS_Degree : constant ACS_Index + := Character'Val (Curses_Constants.ACS_DEGREE); + ACS_Plus_Minus : constant ACS_Index + := Character'Val (Curses_Constants.ACS_PLMINUS); + ACS_Bullet : constant ACS_Index + := Character'Val (Curses_Constants.ACS_BULLET); + ACS_Left_Arrow : constant ACS_Index + := Character'Val (Curses_Constants.ACS_LARROW); + ACS_Right_Arrow : constant ACS_Index + := Character'Val (Curses_Constants.ACS_RARROW); + ACS_Down_Arrow : constant ACS_Index + := Character'Val (Curses_Constants.ACS_DARROW); + ACS_Up_Arrow : constant ACS_Index + := Character'Val (Curses_Constants.ACS_UARROW); + ACS_Board_Of_Squares : constant ACS_Index + := Character'Val (Curses_Constants.ACS_BOARD); + ACS_Lantern : constant ACS_Index + := Character'Val (Curses_Constants.ACS_LANTERN); + ACS_Solid_Block : constant ACS_Index + := Character'Val (Curses_Constants.ACS_BLOCK); + ACS_Scan_Line_3 : constant ACS_Index + := Character'Val (Curses_Constants.ACS_S3); + ACS_Scan_Line_7 : constant ACS_Index + := Character'Val (Curses_Constants.ACS_S7); + ACS_Less_Or_Equal : constant ACS_Index + := Character'Val (Curses_Constants.ACS_LEQUAL); + ACS_Greater_Or_Equal : constant ACS_Index + := Character'Val (Curses_Constants.ACS_GEQUAL); + ACS_PI : constant ACS_Index + := Character'Val (Curses_Constants.ACS_PI); + ACS_Not_Equal : constant ACS_Index + := Character'Val (Curses_Constants.ACS_NEQUAL); + ACS_Sterling : constant ACS_Index + := Character'Val (Curses_Constants.ACS_STERLING); + + -- MANPAGE(`curs_initscr.3x') + -- | Not implemented: newterm, set_term, delscreen + + -- ANCHOR(`stdscr',`Standard_Window') + function Standard_Window return Window; + -- AKA + pragma Import (C, Standard_Window, "stdscr_as_function"); + pragma Inline (Standard_Window); + + -- ANCHOR(`curscr',`Current_Window') + function Current_Window return Window; + -- AKA + pragma Import (C, Current_Window, "curscr_as_function"); + pragma Inline (Current_Window); + + -- ANCHOR(`initscr()',`Init_Screen') + procedure Init_Screen; + + -- ANCHOR(`initscr()',`Init_Windows') + procedure Init_Windows renames Init_Screen; + -- AKA + pragma Inline (Init_Screen); + -- pragma Inline (Init_Windows); + + -- ANCHOR(`endwin()',`End_Windows') + procedure End_Windows; + -- AKA + procedure End_Screen renames End_Windows; + pragma Inline (End_Windows); + -- pragma Inline (End_Screen); + + -- ANCHOR(`isendwin()',`Is_End_Window') + function Is_End_Window return Boolean; + -- AKA + pragma Inline (Is_End_Window); + + -- MANPAGE(`curs_move.3x') + + -- ANCHOR(`wmove()',`Move_Cursor') + procedure Move_Cursor (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position); + -- AKA + -- ALIAS(`move()') + pragma Inline (Move_Cursor); + + -- MANPAGE(`curs_addch.3x') + + -- ANCHOR(`waddch()',`Add') + procedure Add (Win : Window := Standard_Window; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`addch()') + + procedure Add (Win : Window := Standard_Window; + Ch : Character); + -- Add a single character at the current logical cursor position to + -- the window. Use the current windows attributes. + + -- ANCHOR(`mvwaddch()',`Add') + procedure Add + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`mvaddch()') + + procedure Add + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Ch : Character); + -- Move to the position and add a single character into the window + -- There are more Add routines, so the Inline pragma follows later + + -- ANCHOR(`wechochar()',`Add_With_Immediate_Echo') + procedure Add_With_Immediate_Echo + (Win : Window := Standard_Window; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`echochar()') + + procedure Add_With_Immediate_Echo + (Win : Window := Standard_Window; + Ch : Character); + -- Add a character and do an immediate refresh of the screen. + pragma Inline (Add_With_Immediate_Echo); + + -- MANPAGE(`curs_window.3x') + -- Not Implemented: wcursyncup + + -- ANCHOR(`newwin()',`Create') + function Create + (Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window; + -- Not Implemented: Default Number_Of_Lines, Number_Of_Columns + -- the C version lets them be 0, see the man page. + -- AKA + pragma Inline (Create); + + function New_Window + (Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window + renames Create; + -- pragma Inline (New_Window); + + -- ANCHOR(`delwin()',`Delete') + procedure Delete (Win : in out Window); + -- AKA + -- Reset Win to Null_Window + pragma Inline (Delete); + + -- ANCHOR(`subwin()',`Sub_Window') + function Sub_Window + (Win : Window := Standard_Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window; + -- AKA + pragma Inline (Sub_Window); + + -- ANCHOR(`derwin()',`Derived_Window') + function Derived_Window + (Win : Window := Standard_Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window; + -- AKA + pragma Inline (Derived_Window); + + -- ANCHOR(`dupwin()',`Duplicate') + function Duplicate (Win : Window) return Window; + -- AKA + pragma Inline (Duplicate); + + -- ANCHOR(`mvwin()',`Move_Window') + procedure Move_Window (Win : Window; + Line : Line_Position; + Column : Column_Position); + -- AKA + pragma Inline (Move_Window); + + -- ANCHOR(`mvderwin()',`Move_Derived_Window') + procedure Move_Derived_Window (Win : Window; + Line : Line_Position; + Column : Column_Position); + -- AKA + pragma Inline (Move_Derived_Window); + + -- ANCHOR(`wsyncup()',`Synchronize_Upwards') + procedure Synchronize_Upwards (Win : Window); + -- AKA + pragma Import (C, Synchronize_Upwards, "wsyncup"); + + -- ANCHOR(`wsyncdown()',`Synchronize_Downwards') + procedure Synchronize_Downwards (Win : Window); + -- AKA + pragma Import (C, Synchronize_Downwards, "wsyncdown"); + + -- ANCHOR(`syncok()',`Set_Synch_Mode') + procedure Set_Synch_Mode (Win : Window := Standard_Window; + Mode : Boolean := False); + -- AKA + pragma Inline (Set_Synch_Mode); + + -- MANPAGE(`curs_addstr.3x') + + -- ANCHOR(`waddnstr()',`Add') + procedure Add (Win : Window := Standard_Window; + Str : String; + Len : Integer := -1); + -- AKA + -- ALIAS(`waddstr()') + -- ALIAS(`addnstr()') + -- ALIAS(`addstr()') + + -- ANCHOR(`mvwaddnstr()',`Add') + procedure Add (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : String; + Len : Integer := -1); + -- AKA + -- ALIAS(`mvwaddstr()') + -- ALIAS(`mvaddnstr()') + -- ALIAS(`mvaddstr()') + + -- MANPAGE(`curs_addchstr.3x') + + -- ANCHOR(`waddchnstr()',`Add') + procedure Add (Win : Window := Standard_Window; + Str : Attributed_String; + Len : Integer := -1); + -- AKA + -- ALIAS(`waddchstr()') + -- ALIAS(`addchnstr()') + -- ALIAS(`addchstr()') + + -- ANCHOR(`mvwaddchnstr()',`Add') + procedure Add (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : Attributed_String; + Len : Integer := -1); + -- AKA + -- ALIAS(`mvwaddchstr()') + -- ALIAS(`mvaddchnstr()') + -- ALIAS(`mvaddchstr()') + pragma Inline (Add); + + -- MANPAGE(`curs_border.3x') + -- | Not implemented: mvhline, mvwhline, mvvline, mvwvline + -- | use Move_Cursor then Horizontal_Line or Vertical_Line + + -- ANCHOR(`wborder()',`Border') + procedure Border + (Win : Window := Standard_Window; + Left_Side_Symbol : Attributed_Character := Default_Character; + Right_Side_Symbol : Attributed_Character := Default_Character; + Top_Side_Symbol : Attributed_Character := Default_Character; + Bottom_Side_Symbol : Attributed_Character := Default_Character; + Upper_Left_Corner_Symbol : Attributed_Character := Default_Character; + Upper_Right_Corner_Symbol : Attributed_Character := Default_Character; + Lower_Left_Corner_Symbol : Attributed_Character := Default_Character; + Lower_Right_Corner_Symbol : Attributed_Character := Default_Character + ); + -- AKA + -- ALIAS(`border()') + pragma Inline (Border); + + -- ANCHOR(`box()',`Box') + procedure Box + (Win : Window := Standard_Window; + Vertical_Symbol : Attributed_Character := Default_Character; + Horizontal_Symbol : Attributed_Character := Default_Character); + -- AKA + pragma Inline (Box); + + -- ANCHOR(`whline()',`Horizontal_Line') + procedure Horizontal_Line + (Win : Window := Standard_Window; + Line_Size : Natural; + Line_Symbol : Attributed_Character := Default_Character); + -- AKA + -- ALIAS(`hline()') + pragma Inline (Horizontal_Line); + + -- ANCHOR(`wvline()',`Vertical_Line') + procedure Vertical_Line + (Win : Window := Standard_Window; + Line_Size : Natural; + Line_Symbol : Attributed_Character := Default_Character); + -- AKA + -- ALIAS(`vline()') + pragma Inline (Vertical_Line); + + -- MANPAGE(`curs_getch.3x') + -- Not implemented: mvgetch, mvwgetch + + -- ANCHOR(`wgetch()',`Get_Keystroke') + function Get_Keystroke (Win : Window := Standard_Window) + return Real_Key_Code; + -- AKA + -- ALIAS(`getch()') + -- Get a character from the keyboard and echo it - if enabled - to the + -- window. + -- If for any reason (i.e. a timeout) we could not get a character the + -- returned keycode is Key_None. + pragma Inline (Get_Keystroke); + + -- ANCHOR(`ungetch()',`Undo_Keystroke') + procedure Undo_Keystroke (Key : Real_Key_Code); + -- AKA + pragma Inline (Undo_Keystroke); + + -- ANCHOR(`has_key()',`Has_Key') + function Has_Key (Key : Special_Key_Code) return Boolean; + -- AKA + pragma Inline (Has_Key); + + -- | + -- | Some helper functions + -- | + function Is_Function_Key (Key : Special_Key_Code) return Boolean; + -- Return True if the Key is a function key (i.e. one of F0 .. F63) + pragma Inline (Is_Function_Key); + + subtype Function_Key_Number is Integer range 0 .. 63; + -- (n)curses allows for 64 function keys. + + function Function_Key (Key : Real_Key_Code) return Function_Key_Number; + -- Return the number of the function key. If the code is not a + -- function key, a CONSTRAINT_ERROR will be raised. + pragma Inline (Function_Key); + + function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code; + -- Return the key code for a given function-key number. + pragma Inline (Function_Key_Code); + + -- MANPAGE(`curs_attr.3x') + -- | Not implemented attr_off, wattr_off, + -- | attr_on, wattr_on, attr_set, wattr_set + + -- PAIR_NUMBER + -- PAIR_NUMBER(c) is the same as c.Color + + -- ANCHOR(`standout()',`Standout') + procedure Standout (Win : Window := Standard_Window; + On : Boolean := True); + -- ALIAS(`wstandout()') + -- ALIAS(`wstandend()') + + -- ANCHOR(`wattron()',`Switch_Character_Attribute') + procedure Switch_Character_Attribute + (Win : Window := Standard_Window; + Attr : Character_Attribute_Set := Normal_Video; + On : Boolean := True); -- if False we switch Off. + -- Switches those Attributes set to true in the list. + -- AKA + -- ALIAS(`wattroff()') + -- ALIAS(`attron()') + -- ALIAS(`attroff()') + + -- ANCHOR(`wattrset()',`Set_Character_Attributes') + procedure Set_Character_Attributes + (Win : Window := Standard_Window; + Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + -- ALIAS(`attrset()') + pragma Inline (Set_Character_Attributes); + + -- ANCHOR(`wattr_get()',`Get_Character_Attributes') + function Get_Character_Attribute + (Win : Window := Standard_Window) return Character_Attribute_Set; + -- AKA + -- ALIAS(`attr_get()') + + -- ANCHOR(`wattr_get()',`Get_Character_Attribute') + function Get_Character_Attribute + (Win : Window := Standard_Window) return Color_Pair; + -- AKA + pragma Inline (Get_Character_Attribute); + + -- ANCHOR(`wcolor_set()',`Set_Color') + procedure Set_Color (Win : Window := Standard_Window; + Pair : Color_Pair); + -- AKA + -- ALIAS(`color_set()') + pragma Inline (Set_Color); + + -- ANCHOR(`wchgat()',`Change_Attributes') + procedure Change_Attributes + (Win : Window := Standard_Window; + Count : Integer := -1; + Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + -- ALIAS(`chgat()') + + -- ANCHOR(`mvwchgat()',`Change_Attributes') + procedure Change_Attributes + (Win : Window := Standard_Window; + Line : Line_Position := Line_Position'First; + Column : Column_Position := Column_Position'First; + Count : Integer := -1; + Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + -- ALIAS(`mvchgat()') + pragma Inline (Change_Attributes); + + -- MANPAGE(`curs_beep.3x') + + -- ANCHOR(`beep()',`Beep') + procedure Beep; + -- AKA + pragma Inline (Beep); + + -- ANCHOR(`flash()',`Flash_Screen') + procedure Flash_Screen; + -- AKA + pragma Inline (Flash_Screen); + + -- MANPAGE(`curs_inopts.3x') + + -- | Not implemented : typeahead + -- + -- ANCHOR(`cbreak()',`Set_Cbreak_Mode') + procedure Set_Cbreak_Mode (SwitchOn : Boolean := True); + -- AKA + -- ALIAS(`nocbreak()') + pragma Inline (Set_Cbreak_Mode); + + -- ANCHOR(`raw()',`Set_Raw_Mode') + procedure Set_Raw_Mode (SwitchOn : Boolean := True); + -- AKA + -- ALIAS(`noraw()') + pragma Inline (Set_Raw_Mode); + + -- ANCHOR(`echo()',`Set_Echo_Mode') + procedure Set_Echo_Mode (SwitchOn : Boolean := True); + -- AKA + -- ALIAS(`noecho()') + pragma Inline (Set_Echo_Mode); + + -- ANCHOR(`meta()',`Set_Meta_Mode') + procedure Set_Meta_Mode (Win : Window := Standard_Window; + SwitchOn : Boolean := True); + -- AKA + pragma Inline (Set_Meta_Mode); + + -- ANCHOR(`keypad()',`Set_KeyPad_Mode') + procedure Set_KeyPad_Mode (Win : Window := Standard_Window; + SwitchOn : Boolean := True); + -- AKA + pragma Inline (Set_KeyPad_Mode); + + function Get_KeyPad_Mode (Win : Window := Standard_Window) + return Boolean; + -- This has no pendant in C. There you've to look into the WINDOWS + -- structure to get the value. Bad practice, not repeated in Ada. + + type Half_Delay_Amount is range 1 .. 255; + + -- ANCHOR(`halfdelay()',`Half_Delay') + procedure Half_Delay (Amount : Half_Delay_Amount); + -- AKA + pragma Inline (Half_Delay); + + -- ANCHOR(`intrflush()',`Set_Flush_On_Interrupt_Mode') + procedure Set_Flush_On_Interrupt_Mode + (Win : Window := Standard_Window; + Mode : Boolean := True); + -- AKA + pragma Inline (Set_Flush_On_Interrupt_Mode); + + -- ANCHOR(`qiflush()',`Set_Queue_Interrupt_Mode') + procedure Set_Queue_Interrupt_Mode + (Win : Window := Standard_Window; + Flush : Boolean := True); + -- AKA + -- ALIAS(`noqiflush()') + pragma Inline (Set_Queue_Interrupt_Mode); + + -- ANCHOR(`nodelay()',`Set_NoDelay_Mode') + procedure Set_NoDelay_Mode + (Win : Window := Standard_Window; + Mode : Boolean := False); + -- AKA + pragma Inline (Set_NoDelay_Mode); + + type Timeout_Mode is (Blocking, Non_Blocking, Delayed); + + -- ANCHOR(`wtimeout()',`Set_Timeout_Mode') + procedure Set_Timeout_Mode (Win : Window := Standard_Window; + Mode : Timeout_Mode; + Amount : Natural); -- in Milliseconds + -- AKA + -- ALIAS(`timeout()') + -- Instead of overloading the semantic of the sign of amount, we + -- introduce the Timeout_Mode parameter. This should improve + -- readability. For Blocking and Non_Blocking, the Amount is not + -- evaluated. + -- We do not inline this procedure. + + -- ANCHOR(`notimeout()',`Set_Escape_Time_Mode') + procedure Set_Escape_Timer_Mode + (Win : Window := Standard_Window; + Timer_Off : Boolean := False); + -- AKA + pragma Inline (Set_Escape_Timer_Mode); + + -- MANPAGE(`curs_outopts.3x') + + -- ANCHOR(`nl()',`Set_NL_Mode') + procedure Set_NL_Mode (SwitchOn : Boolean := True); + -- AKA + -- ALIAS(`nonl()') + pragma Inline (Set_NL_Mode); + + -- ANCHOR(`clearok()',`Clear_On_Next_Update') + procedure Clear_On_Next_Update + (Win : Window := Standard_Window; + Do_Clear : Boolean := True); + -- AKA + pragma Inline (Clear_On_Next_Update); + + -- ANCHOR(`idlok()',`Use_Insert_Delete_Line') + procedure Use_Insert_Delete_Line + (Win : Window := Standard_Window; + Do_Idl : Boolean := True); + -- AKA + pragma Inline (Use_Insert_Delete_Line); + + -- ANCHOR(`idcok()',`Use_Insert_Delete_Character') + procedure Use_Insert_Delete_Character + (Win : Window := Standard_Window; + Do_Idc : Boolean := True); + -- AKA + pragma Inline (Use_Insert_Delete_Character); + + -- ANCHOR(`leaveok()',`Leave_Cursor_After_Update') + procedure Leave_Cursor_After_Update + (Win : Window := Standard_Window; + Do_Leave : Boolean := True); + -- AKA + pragma Inline (Leave_Cursor_After_Update); + + -- ANCHOR(`immedok()',`Immediate_Update_Mode') + procedure Immediate_Update_Mode + (Win : Window := Standard_Window; + Mode : Boolean := False); + -- AKA + pragma Inline (Immediate_Update_Mode); + + -- ANCHOR(`scrollok()',`Allow_Scrolling') + procedure Allow_Scrolling + (Win : Window := Standard_Window; + Mode : Boolean := False); + -- AKA + pragma Inline (Allow_Scrolling); + + function Scrolling_Allowed (Win : Window := Standard_Window) return Boolean; + -- There is no such function in the C interface. + pragma Inline (Scrolling_Allowed); + + -- ANCHOR(`wsetscrreg()',`Set_Scroll_Region') + procedure Set_Scroll_Region + (Win : Window := Standard_Window; + Top_Line : Line_Position; + Bottom_Line : Line_Position); + -- AKA + -- ALIAS(`setscrreg()') + pragma Inline (Set_Scroll_Region); + + -- MANPAGE(`curs_refresh.3x') + + -- ANCHOR(`doupdate()',`Update_Screen') + procedure Update_Screen; + -- AKA + pragma Inline (Update_Screen); + + -- ANCHOR(`wrefresh()',`Refresh') + procedure Refresh (Win : Window := Standard_Window); + -- AKA + -- There is an overloaded Refresh for Pads. + -- The Inline pragma appears there + -- ALIAS(`refresh()') + + -- ANCHOR(`wnoutrefresh()',`Refresh_Without_Update') + procedure Refresh_Without_Update + (Win : Window := Standard_Window); + -- AKA + -- There is an overloaded Refresh_Without_Update for Pads. + -- The Inline pragma appears there + + -- ANCHOR(`redrawwin()',`Redraw') + procedure Redraw (Win : Window := Standard_Window); + -- AKA + + -- ANCHOR(`wredrawln()',`Redraw') + procedure Redraw (Win : Window := Standard_Window; + Begin_Line : Line_Position; + Line_Count : Positive); + -- AKA + pragma Inline (Redraw); + + -- MANPAGE(`curs_clear.3x') + + -- ANCHOR(`werase()',`Erase') + procedure Erase (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`erase()') + pragma Inline (Erase); + + -- ANCHOR(`wclear()',`Clear') + procedure Clear + (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`clear()') + pragma Inline (Clear); + + -- ANCHOR(`wclrtobot()',`Clear_To_End_Of_Screen') + procedure Clear_To_End_Of_Screen + (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`clrtobot()') + pragma Inline (Clear_To_End_Of_Screen); + + -- ANCHOR(`wclrtoeol()',`Clear_To_End_Of_Line') + procedure Clear_To_End_Of_Line + (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`clrtoeol()') + pragma Inline (Clear_To_End_Of_Line); + + -- MANPAGE(`curs_bkgd.3x') + + -- ANCHOR(`wbkgdset()',`Set_Background') + -- TODO: we could have Set_Background(Window; Character_Attribute_Set) + -- because in C it is common to see bkgdset(A_BOLD) or + -- bkgdset(COLOR_PAIR(n)) + procedure Set_Background + (Win : Window := Standard_Window; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`bkgdset()') + pragma Inline (Set_Background); + + -- ANCHOR(`wbkgd()',`Change_Background') + procedure Change_Background + (Win : Window := Standard_Window; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`bkgd()') + pragma Inline (Change_Background); + + -- ANCHOR(`wbkgdget()',`Get_Background') + -- ? wbkgdget is not listed in curs_bkgd, getbkgd is thpough. + function Get_Background (Win : Window := Standard_Window) + return Attributed_Character; + -- AKA + -- ALIAS(`bkgdget()') + pragma Inline (Get_Background); + + -- MANPAGE(`curs_touch.3x') + + -- ANCHOR(`untouchwin()',`Untouch') + procedure Untouch (Win : Window := Standard_Window); + -- AKA + pragma Inline (Untouch); + + -- ANCHOR(`touchwin()',`Touch') + procedure Touch (Win : Window := Standard_Window); + -- AKA + + -- ANCHOR(`touchline()',`Touch') + procedure Touch (Win : Window := Standard_Window; + Start : Line_Position; + Count : Positive); + -- AKA + pragma Inline (Touch); + + -- ANCHOR(`wtouchln()',`Change_Line_Status') + procedure Change_Lines_Status (Win : Window := Standard_Window; + Start : Line_Position; + Count : Positive; + State : Boolean); + -- AKA + pragma Inline (Change_Lines_Status); + + -- ANCHOR(`is_linetouched()',`Is_Touched') + function Is_Touched (Win : Window := Standard_Window; + Line : Line_Position) return Boolean; + -- AKA + + -- ANCHOR(`is_wintouched()',`Is_Touched') + function Is_Touched (Win : Window := Standard_Window) return Boolean; + -- AKA + pragma Inline (Is_Touched); + + -- MANPAGE(`curs_overlay.3x') + + -- ANCHOR(`copywin()',`Copy') + procedure Copy + (Source_Window : Window; + Destination_Window : Window; + Source_Top_Row : Line_Position; + Source_Left_Column : Column_Position; + Destination_Top_Row : Line_Position; + Destination_Left_Column : Column_Position; + Destination_Bottom_Row : Line_Position; + Destination_Right_Column : Column_Position; + Non_Destructive_Mode : Boolean := True); + -- AKA + pragma Inline (Copy); + + -- ANCHOR(`overwrite()',`Overwrite') + procedure Overwrite (Source_Window : Window; + Destination_Window : Window); + -- AKA + pragma Inline (Overwrite); + + -- ANCHOR(`overlay()',`Overlay') + procedure Overlay (Source_Window : Window; + Destination_Window : Window); + -- AKA + pragma Inline (Overlay); + + -- MANPAGE(`curs_deleteln.3x') + + -- ANCHOR(`winsdelln()',`Insert_Delete_Lines') + procedure Insert_Delete_Lines + (Win : Window := Standard_Window; + Lines : Integer := 1); -- default is to insert one line above + -- AKA + -- ALIAS(`insdelln()') + pragma Inline (Insert_Delete_Lines); + + -- ANCHOR(`wdeleteln()',`Delete_Line') + procedure Delete_Line (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`deleteln()') + pragma Inline (Delete_Line); + + -- ANCHOR(`winsertln()',`Insert_Line') + procedure Insert_Line (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`insertln()') + pragma Inline (Insert_Line); + + -- MANPAGE(`curs_getyx.3x') + + -- ANCHOR(`getmaxyx()',`Get_Size') + procedure Get_Size + (Win : Window := Standard_Window; + Number_Of_Lines : out Line_Count; + Number_Of_Columns : out Column_Count); + -- AKA + pragma Inline (Get_Size); + + -- ANCHOR(`getbegyx()',`Get_Window_Position') + procedure Get_Window_Position + (Win : Window := Standard_Window; + Top_Left_Line : out Line_Position; + Top_Left_Column : out Column_Position); + -- AKA + pragma Inline (Get_Window_Position); + + -- ANCHOR(`getyx()',`Get_Cursor_Position') + procedure Get_Cursor_Position + (Win : Window := Standard_Window; + Line : out Line_Position; + Column : out Column_Position); + -- AKA + pragma Inline (Get_Cursor_Position); + + -- ANCHOR(`getparyx()',`Get_Origin_Relative_To_Parent') + procedure Get_Origin_Relative_To_Parent + (Win : Window; + Top_Left_Line : out Line_Position; + Top_Left_Column : out Column_Position; + Is_Not_A_Subwindow : out Boolean); + -- AKA + -- Instead of placing -1 in the coordinates as return, we use a Boolean + -- to return the info that the window has no parent. + pragma Inline (Get_Origin_Relative_To_Parent); + + -- MANPAGE(`curs_pad.3x') + + -- ANCHOR(`newpad()',`New_Pad') + function New_Pad (Lines : Line_Count; + Columns : Column_Count) return Window; + -- AKA + pragma Inline (New_Pad); + + -- ANCHOR(`subpad()',`Sub_Pad') + function Sub_Pad + (Pad : Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count; + First_Line_Position : Line_Position; + First_Column_Position : Column_Position) return Window; + -- AKA + pragma Inline (Sub_Pad); + + -- ANCHOR(`prefresh()',`Refresh') + procedure Refresh + (Pad : Window; + Source_Top_Row : Line_Position; + Source_Left_Column : Column_Position; + Destination_Top_Row : Line_Position; + Destination_Left_Column : Column_Position; + Destination_Bottom_Row : Line_Position; + Destination_Right_Column : Column_Position); + -- AKA + pragma Inline (Refresh); + + -- ANCHOR(`pnoutrefresh()',`Refresh_Without_Update') + procedure Refresh_Without_Update + (Pad : Window; + Source_Top_Row : Line_Position; + Source_Left_Column : Column_Position; + Destination_Top_Row : Line_Position; + Destination_Left_Column : Column_Position; + Destination_Bottom_Row : Line_Position; + Destination_Right_Column : Column_Position); + -- AKA + pragma Inline (Refresh_Without_Update); + + -- ANCHOR(`pechochar()',`Add_Character_To_Pad_And_Echo_It') + procedure Add_Character_To_Pad_And_Echo_It + (Pad : Window; + Ch : Attributed_Character); + -- AKA + + procedure Add_Character_To_Pad_And_Echo_It + (Pad : Window; + Ch : Character); + pragma Inline (Add_Character_To_Pad_And_Echo_It); + + -- MANPAGE(`curs_scroll.3x') + + -- ANCHOR(`wscrl()',`Scroll') + procedure Scroll (Win : Window := Standard_Window; + Amount : Integer := 1); + -- AKA + -- ALIAS(`scroll()') + -- ALIAS(`scrl()') + pragma Inline (Scroll); + + -- MANPAGE(`curs_delch.3x') + + -- ANCHOR(`wdelch()',`Delete_Character') + procedure Delete_Character (Win : Window := Standard_Window); + -- AKA + -- ALIAS(`delch()') + + -- ANCHOR(`mvwdelch()',`Delete_Character') + procedure Delete_Character + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position); + -- AKA + -- ALIAS(`mvdelch()') + pragma Inline (Delete_Character); + + -- MANPAGE(`curs_inch.3x') + + -- ANCHOR(`winch()',`Peek') + function Peek (Win : Window := Standard_Window) + return Attributed_Character; + -- ALIAS(`inch()') + -- AKA + + -- ANCHOR(`mvwinch()',`Peek') + function Peek + (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position) return Attributed_Character; + -- AKA + -- ALIAS(`mvinch()') + -- More Peek's follow, pragma Inline appears later. + + -- MANPAGE(`curs_insch.3x') + + -- ANCHOR(`winsch()',`Insert') + procedure Insert (Win : Window := Standard_Window; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`insch()') + + -- ANCHOR(`mvwinsch()',`Insert') + procedure Insert (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Ch : Attributed_Character); + -- AKA + -- ALIAS(`mvinsch()') + + -- MANPAGE(`curs_insstr.3x') + + -- ANCHOR(`winsnstr()',`Insert') + procedure Insert (Win : Window := Standard_Window; + Str : String; + Len : Integer := -1); + -- AKA + -- ALIAS(`winsstr()') + -- ALIAS(`insnstr()') + -- ALIAS(`insstr()') + + -- ANCHOR(`mvwinsnstr()',`Insert') + procedure Insert (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : String; + Len : Integer := -1); + -- AKA + -- ALIAS(`mvwinsstr()') + -- ALIAS(`mvinsnstr()') + -- ALIAS(`mvinsstr()') + pragma Inline (Insert); + + -- MANPAGE(`curs_instr.3x') + + -- ANCHOR(`winnstr()',`Peek') + procedure Peek (Win : Window := Standard_Window; + Str : out String; + Len : Integer := -1); + -- AKA + -- ALIAS(`winstr()') + -- ALIAS(`innstr()') + -- ALIAS(`instr()') + + -- ANCHOR(`mvwinnstr()',`Peek') + procedure Peek (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : out String; + Len : Integer := -1); + -- AKA + -- ALIAS(`mvwinstr()') + -- ALIAS(`mvinnstr()') + -- ALIAS(`mvinstr()') + + -- MANPAGE(`curs_inchstr.3x') + + -- ANCHOR(`winchnstr()',`Peek') + procedure Peek (Win : Window := Standard_Window; + Str : out Attributed_String; + Len : Integer := -1); + -- AKA + -- ALIAS(`winchstr()') + -- ALIAS(`inchnstr()') + -- ALIAS(`inchstr()') + + -- ANCHOR(`mvwinchnstr()',`Peek') + procedure Peek (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : out Attributed_String; + Len : Integer := -1); + -- AKA + -- ALIAS(`mvwinchstr()') + -- ALIAS(`mvinchnstr()') + -- ALIAS(`mvinchstr()') + -- We do not inline the Peek procedures + + -- MANPAGE(`curs_getstr.3x') + + -- ANCHOR(`wgetnstr()',`Get') + procedure Get (Win : Window := Standard_Window; + Str : out String; + Len : Integer := -1); + -- AKA + -- ALIAS(`wgetstr()') + -- ALIAS(`getnstr()') + -- ALIAS(`getstr()') + -- actually getstr is not supported because that results in buffer + -- overflows. + + -- ANCHOR(`mvwgetnstr()',`Get') + procedure Get (Win : Window := Standard_Window; + Line : Line_Position; + Column : Column_Position; + Str : out String; + Len : Integer := -1); + -- AKA + -- ALIAS(`mvwgetstr()') + -- ALIAS(`mvgetnstr()') + -- ALIAS(`mvgetstr()') + -- Get is not inlined + + -- MANPAGE(`curs_slk.3x') + + -- Not Implemented: slk_attr_on, slk_attr_off, slk_attr_set + + type Soft_Label_Key_Format is (Three_Two_Three, + Four_Four, + PC_Style, -- ncurses specific + PC_Style_With_Index); -- " + type Label_Number is new Positive range 1 .. 12; + type Label_Justification is (Left, Centered, Right); + + -- ANCHOR(`slk_init()',`Init_Soft_Label_Keys') + procedure Init_Soft_Label_Keys + (Format : Soft_Label_Key_Format := Three_Two_Three); + -- AKA + pragma Inline (Init_Soft_Label_Keys); + + -- ANCHOR(`slk_set()',`Set_Soft_Label_Key') + procedure Set_Soft_Label_Key (Label : Label_Number; + Text : String; + Fmt : Label_Justification := Left); + -- AKA + -- We do not inline this procedure + + -- ANCHOR(`slk_refresh()',`Refresh_Soft_Label_Key') + procedure Refresh_Soft_Label_Keys; + -- AKA + pragma Inline (Refresh_Soft_Label_Keys); + + -- ANCHOR(`slk_noutrefresh()',`Refresh_Soft_Label_Keys_Without_Update') + procedure Refresh_Soft_Label_Keys_Without_Update; + -- AKA + pragma Inline (Refresh_Soft_Label_Keys_Without_Update); + + -- ANCHOR(`slk_label()',`Get_Soft_Label_Key') + procedure Get_Soft_Label_Key (Label : Label_Number; + Text : out String); + -- AKA + + -- ANCHOR(`slk_label()',`Get_Soft_Label_Key') + function Get_Soft_Label_Key (Label : Label_Number) return String; + -- AKA + -- Same as function + pragma Inline (Get_Soft_Label_Key); + + -- ANCHOR(`slk_clear()',`Clear_Soft_Label_Keys') + procedure Clear_Soft_Label_Keys; + -- AKA + pragma Inline (Clear_Soft_Label_Keys); + + -- ANCHOR(`slk_restore()',`Restore_Soft_Label_Keys') + procedure Restore_Soft_Label_Keys; + -- AKA + pragma Inline (Restore_Soft_Label_Keys); + + -- ANCHOR(`slk_touch()',`Touch_Soft_Label_Keys') + procedure Touch_Soft_Label_Keys; + -- AKA + pragma Inline (Touch_Soft_Label_Keys); + + -- ANCHOR(`slk_attron()',`Switch_Soft_Label_Key_Attributes') + procedure Switch_Soft_Label_Key_Attributes + (Attr : Character_Attribute_Set; + On : Boolean := True); + -- AKA + -- ALIAS(`slk_attroff()') + pragma Inline (Switch_Soft_Label_Key_Attributes); + + -- ANCHOR(`slk_attrset()',`Set_Soft_Label_Key_Attributes') + procedure Set_Soft_Label_Key_Attributes + (Attr : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First); + -- AKA + pragma Inline (Set_Soft_Label_Key_Attributes); + + -- ANCHOR(`slk_attr()',`Get_Soft_Label_Key_Attributes') + function Get_Soft_Label_Key_Attributes return Character_Attribute_Set; + -- AKA + + -- ANCHOR(`slk_attr()',`Get_Soft_Label_Key_Attributes') + function Get_Soft_Label_Key_Attributes return Color_Pair; + -- AKA + pragma Inline (Get_Soft_Label_Key_Attributes); + + -- ANCHOR(`slk_color()',`Set_Soft_Label_Key_Color') + procedure Set_Soft_Label_Key_Color (Pair : Color_Pair); + -- AKA + pragma Inline (Set_Soft_Label_Key_Color); + + -- MANPAGE(`keybound.3x') + -- Not Implemented: keybound + + -- MANPAGE(`keyok.3x') + + -- ANCHOR(`keyok()',`Enable_Key') + procedure Enable_Key (Key : Special_Key_Code; + Enable : Boolean := True); + -- AKA + pragma Inline (Enable_Key); + + -- MANPAGE(`define_key.3x') + + -- ANCHOR(`define_key()',`Define_Key') + procedure Define_Key (Definition : String; + Key : Special_Key_Code); + -- AKA + pragma Inline (Define_Key); + + -- MANPAGE(`curs_util.3x') + + -- | Not implemented : filter, use_env + -- | putwin, getwin are in the child package PutWin + -- + + -- ANCHOR(`keyname()',`Key_Name') + procedure Key_Name (Key : Real_Key_Code; + Name : out String); + -- AKA + -- The external name for a real keystroke. + + -- ANCHOR(`keyname()',`Key_Name') + function Key_Name (Key : Real_Key_Code) return String; + -- AKA + -- Same as function + -- We do not inline this routine + + -- ANCHOR(`unctrl()',`Un_Control') + procedure Un_Control (Ch : Attributed_Character; + Str : out String); + -- AKA + + -- ANCHOR(`unctrl()',`Un_Control') + function Un_Control (Ch : Attributed_Character) return String; + -- AKA + -- Same as function + pragma Inline (Un_Control); + + -- ANCHOR(`delay_output()',`Delay_Output') + procedure Delay_Output (Msecs : Natural); + -- AKA + pragma Inline (Delay_Output); + + -- ANCHOR(`flushinp()',`Flush_Input') + procedure Flush_Input; + -- AKA + pragma Inline (Flush_Input); + + -- MANPAGE(`curs_termattrs.3x') + + -- ANCHOR(`baudrate()',`Baudrate') + function Baudrate return Natural; + -- AKA + pragma Inline (Baudrate); + + -- ANCHOR(`erasechar()',`Erase_Character') + function Erase_Character return Character; + -- AKA + pragma Inline (Erase_Character); + + -- ANCHOR(`killchar()',`Kill_Character') + function Kill_Character return Character; + -- AKA + pragma Inline (Kill_Character); + + -- ANCHOR(`has_ic()',`Has_Insert_Character') + function Has_Insert_Character return Boolean; + -- AKA + pragma Inline (Has_Insert_Character); + + -- ANCHOR(`has_il()',`Has_Insert_Line') + function Has_Insert_Line return Boolean; + -- AKA + pragma Inline (Has_Insert_Line); + + -- ANCHOR(`termattrs()',`Supported_Attributes') + function Supported_Attributes return Character_Attribute_Set; + -- AKA + pragma Inline (Supported_Attributes); + + -- ANCHOR(`longname()',`Long_Name') + procedure Long_Name (Name : out String); + -- AKA + + -- ANCHOR(`longname()',`Long_Name') + function Long_Name return String; + -- AKA + -- Same as function + pragma Inline (Long_Name); + + -- ANCHOR(`termname()',`Terminal_Name') + procedure Terminal_Name (Name : out String); + -- AKA + + -- ANCHOR(`termname()',`Terminal_Name') + function Terminal_Name return String; + -- AKA + -- Same as function + pragma Inline (Terminal_Name); + + -- MANPAGE(`curs_color.3x') + + -- COLOR_PAIR + -- COLOR_PAIR(n) in C is the same as + -- Attributed_Character(Ch => Nul, Color => n, Attr => Normal_Video) + -- In C you often see something like c = c | COLOR_PAIR(n); + -- This is equivalent to c.Color := n; + + -- ANCHOR(`start_color()',`Start_Color') + procedure Start_Color; + -- AKA + pragma Import (C, Start_Color, "start_color"); + + -- ANCHOR(`init_pair()',`Init_Pair') + procedure Init_Pair (Pair : Redefinable_Color_Pair; + Fore : Color_Number; + Back : Color_Number); + -- AKA + pragma Inline (Init_Pair); + + -- ANCHOR(`pair_content()',`Pair_Content') + procedure Pair_Content (Pair : Color_Pair; + Fore : out Color_Number; + Back : out Color_Number); + -- AKA + pragma Inline (Pair_Content); + + -- ANCHOR(`has_colors()',`Has_Colors') + function Has_Colors return Boolean; + -- AKA + pragma Inline (Has_Colors); + + -- ANCHOR(`init_color()',`Init_Color') + procedure Init_Color (Color : Color_Number; + Red : RGB_Value; + Green : RGB_Value; + Blue : RGB_Value); + -- AKA + pragma Inline (Init_Color); + + -- ANCHOR(`can_change_color()',`Can_Change_Color') + function Can_Change_Color return Boolean; + -- AKA + pragma Inline (Can_Change_Color); + + -- ANCHOR(`color_content()',`Color_Content') + procedure Color_Content (Color : Color_Number; + Red : out RGB_Value; + Green : out RGB_Value; + Blue : out RGB_Value); + -- AKA + pragma Inline (Color_Content); + + -- MANPAGE(`curs_kernel.3x') + -- | Not implemented: getsyx, setsyx + -- + type Curses_Mode is (Curses, Shell); + + -- ANCHOR(`def_prog_mode()',`Save_Curses_Mode') + procedure Save_Curses_Mode (Mode : Curses_Mode); + -- AKA + -- ALIAS(`def_shell_mode()') + pragma Inline (Save_Curses_Mode); + + -- ANCHOR(`reset_prog_mode()',`Reset_Curses_Mode') + procedure Reset_Curses_Mode (Mode : Curses_Mode); + -- AKA + -- ALIAS(`reset_shell_mode()') + pragma Inline (Reset_Curses_Mode); + + -- ANCHOR(`savetty()',`Save_Terminal_State') + procedure Save_Terminal_State; + -- AKA + pragma Inline (Save_Terminal_State); + + -- ANCHOR(`resetty();',`Reset_Terminal_State') + procedure Reset_Terminal_State; + -- AKA + pragma Inline (Reset_Terminal_State); + + type Stdscr_Init_Proc is access + function (Win : Window; + Columns : Column_Count) return Integer; + pragma Convention (C, Stdscr_Init_Proc); + -- N.B.: the return value is actually ignored, but it seems to be + -- a good practice to return 0 if you think all went fine + -- and -1 otherwise. + + -- ANCHOR(`ripoffline()',`Rip_Off_Lines') + procedure Rip_Off_Lines (Lines : Integer; + Proc : Stdscr_Init_Proc); + -- AKA + -- N.B.: to be more precise, this uses a ncurses specific enhancement of + -- ripoffline(), in which the Lines argument absolute value is the + -- number of lines to be ripped of. The official ripoffline() only + -- uses the sign of Lines to remove a single line from bottom or top. + pragma Inline (Rip_Off_Lines); + + type Cursor_Visibility is (Invisible, Normal, Very_Visible); + + -- ANCHOR(`curs_set()',`Set_Cursor_Visibility') + procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility); + -- AKA + pragma Inline (Set_Cursor_Visibility); + + -- ANCHOR(`napms()',`Nap_Milli_Seconds') + procedure Nap_Milli_Seconds (Ms : Natural); + -- AKA + pragma Inline (Nap_Milli_Seconds); + + -- |===================================================================== + -- | Some useful helpers. + -- |===================================================================== + type Transform_Direction is (From_Screen, To_Screen); + procedure Transform_Coordinates + (W : Window := Standard_Window; + Line : in out Line_Position; + Column : in out Column_Position; + Dir : Transform_Direction := From_Screen); + -- This procedure transforms screen coordinates into coordinates relative + -- to the window and vice versa, depending on the Dir parameter. + -- Screen coordinates are the position information for the physical device. + -- An Curses_Exception will be raised if Line and Column are not in the + -- Window or if you pass the Null_Window as argument. + -- We do not inline this procedure + + -- MANPAGE(`default_colors.3x') + + Default_Color : constant Color_Number := -1; + + -- ANCHOR(`use_default_colors()',`Use_Default_Colors') + procedure Use_Default_Colors; + -- AKA + pragma Inline (Use_Default_Colors); + + -- ANCHOR(`assume_default_colors()',`Assume_Default_Colors') + procedure Assume_Default_Colors (Fore : Color_Number := Default_Color; + Back : Color_Number := Default_Color); + -- AKA + pragma Inline (Assume_Default_Colors); + + -- MANPAGE(`curs_extend.3x') + + -- ANCHOR(`curses_version()',`Curses_Version') + function Curses_Version return String; + -- AKA + + -- ANCHOR(`use_extended_names()',`Use_Extended_Names') + -- The returnvalue is the previous setting of the flag + function Use_Extended_Names (Enable : Boolean) return Boolean; + -- AKA + + -- MANPAGE(`curs_trace.3x') + + -- ANCHOR(`_nc_freeall()',`Curses_Free_All') + procedure Curses_Free_All; + -- AKA + + -- MANPAGE(`curs_scr_dump.3x') + + -- ANCHOR(`scr_dump()',`Screen_Dump_To_File') + procedure Screen_Dump_To_File (Filename : String); + -- AKA + + -- ANCHOR(`scr_restore()',`Screen_Restore_From_File') + procedure Screen_Restore_From_File (Filename : String); + -- AKA + + -- ANCHOR(`scr_init()',`Screen_Init_From_File') + procedure Screen_Init_From_File (Filename : String); + -- AKA + + -- ANCHOR(`scr_set()',`Screen_Set_File') + procedure Screen_Set_File (Filename : String); + -- AKA + + -- MANPAGE(`curs_print.3x') + -- Not implemented: mcprint + + -- MANPAGE(`curs_printw.3x') + -- Not implemented: printw, wprintw, mvprintw, mvwprintw, vwprintw, + -- vw_printw + -- Please use the Ada style Text_IO child packages for formatted + -- printing. It does not make a lot of sense to map the printf style + -- C functions to Ada. + + -- MANPAGE(`curs_scanw.3x') + -- Not implemented: scanw, wscanw, mvscanw, mvwscanw, vwscanw, vw_scanw + + -- MANPAGE(`resizeterm.3x') + -- Not Implemented: resizeterm + + -- MANPAGE(`wresize.3x') + + -- ANCHOR(`wresize()',`Resize') + procedure Resize (Win : Window := Standard_Window; + Number_Of_Lines : Line_Count; + Number_Of_Columns : Column_Count); + -- AKA + +private + type Window is new System.Storage_Elements.Integer_Address; + Null_Window : constant Window := 0; + + -- The next constants are generated and may be different on your + -- architecture. + -- + + Sizeof_Bool : constant := Curses_Constants.Sizeof_Bool; + + type Curses_Bool is mod 2 ** Sizeof_Bool; + + Curses_Bool_False : constant Curses_Bool := 0; + +end Terminal_Interface.Curses; diff --git a/contrib/ncurses/Ada95/include/MKncurses_def.sh b/contrib/ncurses/Ada95/include/MKncurses_def.sh new file mode 100755 index 00000000..9d802441 --- /dev/null +++ b/contrib/ncurses/Ada95/include/MKncurses_def.sh @@ -0,0 +1,81 @@ +#! /bin/sh +# $Id: MKncurses_def.sh,v 1.5 2022/07/16 17:03:59 tom Exp $ +############################################################################## +# Copyright 2020,2022 Thomas E. Dickey # +# Copyright 2003 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# MKncurses_def.sh -- generate fallback definitions for ncurses_cfg.h +# +# Author: Thomas E. Dickey 2000 +# +# Given the choice between constructs such as +# +# #if defined(foo) && foo +# #if foo +# +# we chose the latter. It is guaranteed by the language standard, and there +# appear to be no broken compilers that do not honor that detail. But some +# people want to use gcc's -Wundef option (corresponding to one of the less +# useful features in Watcom's compiler) to check for misspellings. So we +# generate a set of fallback definitions to quiet the warnings without making +# the code ugly. +# +DEFS="${1-ncurses_defs}" +cat <$@ + +tags: + ctags *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ etags *.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + +clean :: mostlyclean + -rm -f $(AUTO_SRC) + +distclean :: clean + -rm -f Makefile + +realclean :: distclean + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/Ada95/include/ncurses_cfg.hin b/contrib/ncurses/Ada95/include/ncurses_cfg.hin new file mode 100644 index 00000000..c19ac8a5 --- /dev/null +++ b/contrib/ncurses/Ada95/include/ncurses_cfg.hin @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 2005-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997 * + ****************************************************************************/ +/* + * $Id: ncurses_cfg.hin,v 1.13 2024/06/08 14:04:14 tom Exp $ + * + * This is a template-file used to generate the "ncurses_cfg.h" file. + * + * Rather than list every definition, the configuration script substitutes the + * definitions that it finds using 'sed'. You need a patch (original date + * 971222) to autoconf 2.12 or 2.13 to do this. + * + * See: + * https://invisible-island.net/autoconf/ + * https://invisible-island.net/archives/autoconf/ + */ +#ifndef NC_CONFIG_H +#define NC_CONFIG_H +@DEFS@ + +#include + + /* The C compiler may not treat these properly but C++ has to */ +#ifdef __cplusplus +#undef const +#undef inline +#else +#if defined(lint) || defined(TRACE) +#undef inline +#define inline /* nothing */ +#endif +#endif + + /* On HP-UX, the C compiler doesn't grok mbstate_t without + -D_XOPEN_SOURCE=500. However, this causes problems on + IRIX. So, we #define mbstate_t to int in configure.in + only for the C compiler if needed. */ +#ifndef __cplusplus +#ifdef NEED_MBSTATE_T_DEF +#define mbstate_t int +#endif +#endif + +#endif /* NC_CONFIG_H */ diff --git a/contrib/ncurses/Ada95/include/ncurses_defs b/contrib/ncurses/Ada95/include/ncurses_defs new file mode 100644 index 00000000..adc1b24f --- /dev/null +++ b/contrib/ncurses/Ada95/include/ncurses_defs @@ -0,0 +1,200 @@ +# $Id: ncurses_defs,v 1.47 2021/12/04 23:08:11 tom Exp $ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 2008-2012,2013 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# See "MKncurses_def.sh" for an explanation. +# +# (hint: don't try to define NDEBUG ;-) + +BROKEN_LINKER +BSD_TPUTS +CPP_HAS_PARAM_INIT +CURSES_ACS_ARRAY acs_map +CURSES_WACS_ARRAY _nc_wacs +DECL_ERRNO +ETIP_NEEDS_MATH_H +GCC_NORETURN /* nothing */ +GCC_UNUSED /* nothing */ +HAVE_BIG_CORE +HAVE_BSD_CGETENT +HAVE_BSD_SIGNAL_H +HAVE_BTOWC +HAVE_BUILTIN_H +HAVE_CHGAT 1 +HAVE_COLOR_SET 1 +HAVE_DIRENT_H +HAVE_ERRNO +HAVE_FCNTL_H +HAVE_FILTER 1 +HAVE_FORM_H +HAVE_GETBEGX 1 +HAVE_GETCURX 1 +HAVE_GETCWD +HAVE_GETEGID +HAVE_GETEUID +HAVE_GETMAXX 1 +HAVE_GETNSTR +HAVE_GETOPT_H +HAVE_GETPARX 1 +HAVE_GETTIMEOFDAY +HAVE_GETWIN 1 +HAVE_GPM_H +HAVE_GPP_BUILTIN_H +HAVE_GXX_BUILTIN_H +HAVE_HAS_KEY +HAVE_IOSTREAM +HAVE_ISASCII +HAVE_ISSETUGID +HAVE_LANGINFO_CODESET +HAVE_LIBC_H +HAVE_LIBDBMALLOC +HAVE_LIBDMALLOC +HAVE_LIBFORM +HAVE_LIBGPM +HAVE_LIBMENU +HAVE_LIBMPATROL +HAVE_LIBPANEL +HAVE_LIMITS_H +HAVE_LINK +HAVE_LOCALE_H +HAVE_LONG_FILE_NAMES +HAVE_MBLEN +HAVE_MBRLEN +HAVE_MBRTOWC +HAVE_MBSRTOWCS +HAVE_MBSTOWCS +HAVE_MBTOWC +HAVE_MENU_H +HAVE_MKSTEMP +HAVE_MVVLINE 1 +HAVE_MVWVLINE 1 +HAVE_NANOSLEEP +HAVE_NC_ALLOC_H +HAVE_PANEL_H +HAVE_POLL +HAVE_POLL_H +HAVE_PURIFY +HAVE_PUTWC +HAVE_PUTWIN 1 +HAVE_REGEXPR_H_FUNCS +HAVE_REGEXP_H_FUNCS +HAVE_REGEX_H_FUNCS +HAVE_REMOVE +HAVE_RESIZETERM +HAVE_RESIZE_TERM +HAVE_RIPOFFLINE 1 +HAVE_SELECT +HAVE_SETUPTERM 1 +HAVE_SIGACTION +HAVE_SIGVEC +HAVE_SIZECHANGE +HAVE_SLK_COLOR +HAVE_SLK_INIT 1 +HAVE_STRSTR +HAVE_SYMLINK +HAVE_SYS_BSDTYPES_H +HAVE_SYS_IOCTL_H +HAVE_SYS_PARAM_H +HAVE_SYS_POLL_H +HAVE_SYS_SELECT_H +HAVE_SYS_TERMIO_H +HAVE_SYS_TIMES_H +HAVE_SYS_TIME_H +HAVE_SYS_TIME_SELECT +HAVE_TCGETATTR +HAVE_TCGETPGRP +HAVE_TELL +HAVE_TERMATTRS 1 +HAVE_TERMIOS_H +HAVE_TERMIO_H +HAVE_TERMNAME 1 +HAVE_TERM_H 1 +HAVE_TGETENT 1 +HAVE_TIGETNUM 1 +HAVE_TIGETSTR 1 +HAVE_TIMES +HAVE_TYPEAHEAD 1 +HAVE_TYPEINFO +HAVE_TYPE_ATTR_T +HAVE_TYPE_SIGACTION +HAVE_UNISTD_H +HAVE_UNLINK +HAVE_USE_DEFAULT_COLORS +HAVE_VFSCANF +HAVE_VSNPRINTF +HAVE_VSSCANF +HAVE_WCSRTOMBS +HAVE_WCSTOMBS +HAVE_WCTOB +HAVE_WCTOMB +HAVE_WCTYPE_H +HAVE_WINSSTR 1 +HAVE_WORKING_POLL +HAVE_WRESIZE +HAVE__DOSCAN +MIXEDCASE_FILENAMES +NCURSES_CHAR_EQ +NCURSES_EXPANDED +NCURSES_EXT_COLORS +NCURSES_EXT_FUNCS +NCURSES_NO_PADDING +NCURSES_PATHSEP ':' +NEED_PTEM_H +NO_LEAKS +PURE_TERMINFO +STDC_HEADERS +SVR4_ACTION +SVR4_TERMIO +SYSTEM_NAME "unknown" +TERMINFO "none" +TERMPATH "none" +TIME_WITH_SYS_TIME +TYPEOF_CHTYPE +USE_COLORFGBG +USE_DATABASE +USE_GETCAP +USE_GETCAP_CACHE +USE_HARD_TABS +USE_HASHED_DB +USE_HASHMAP +USE_HOME_TERMINFO +USE_LINKS +USE_MY_MEMMOVE +USE_OK_BCOPY +USE_RCS_IDS +USE_REENTRANT +USE_SAFE_SPRINTF +USE_SCROLL_HINTS +USE_SIGWINCH +USE_SYMLINKS +USE_SYSMOUSE +USE_TERMCAP +USE_WEAK_SYMBOLS +USE_WIDEC_SUPPORT +USE_XMC_SUPPORT diff --git a/contrib/ncurses/Ada95/make-tar.sh b/contrib/ncurses/Ada95/make-tar.sh new file mode 100755 index 00000000..083812da --- /dev/null +++ b/contrib/ncurses/Ada95/make-tar.sh @@ -0,0 +1,174 @@ +#!/bin/sh +# $Id: make-tar.sh,v 1.23 2022/11/05 20:29:41 tom Exp $ +############################################################################## +# Copyright 2019-2021,2022 Thomas E. Dickey # +# Copyright 2010-2015,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# Construct a tar-file containing only the Ada95 tree as well as its associated +# documentation. The reason for doing that is to simplify distributing the +# ada binding as a separate package. + +CDPATH=: +export CDPATH + +TARGET=`pwd` + +: "${ROOTNAME:=ncurses-Ada95}" +: "${PKG_NAME:=AdaCurses}" +: "${DESTDIR:=$TARGET}" +: "${TMPDIR:=/tmp}" + +# make timestamps of generated files predictable +same_timestamp() { + touch -r ../NEWS "$1" +} + +grep_assign() { + grep_assign=`grep -E "^$2\>" "$1" | sed -e "s/^$2[ ]*=[ ]*//" -e 's/"//g'` + eval "$2"=\""$grep_assign"\" +} + +grep_patchdate() { + grep_assign ../dist.mk NCURSES_MAJOR + grep_assign ../dist.mk NCURSES_MINOR + grep_assign ../dist.mk NCURSES_PATCH +} + +# The rpm spec-file in the ncurses tree is a template. Fill in the version +# information from dist.mk +edit_specfile() { + sed \ + -e "s/\\/$NCURSES_MAJOR/g" \ + -e "s/\\/$NCURSES_MINOR/g" \ + -e "s/\\/$NCURSES_PATCH/g" "$1" >"$1.new" + chmod u+w "$1" + mv "$1.new" "$1" + same_timestamp "$1" +} + +make_changelog() { + [ -f "$1" ] && chmod u+w "$1" + cat >"$1" <MANIFEST ) +same_timestamp $BUILD/$ROOTNAME/MANIFEST + +cd $BUILD || exit + +# Remove build-artifacts. +find . -name RCS -exec rm -rf {} \; +find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null +find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null +find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null + +# There is no need for this script in the tar file. +rm -f $ROOTNAME/make-tar.sh + +# Remove build-artifacts. +find . -name "*.gz" -exec rm -rf {} \; + +# Make the files writable... +chmod -R u+w . + +# Cleanup timestamps +[ -n "$TOUCH_DIRS" ] && "$TOUCH_DIRS" "$ROOTNAME" + +tar cf - $TAR_OPTIONS $ROOTNAME | gzip >"$DESTDIR/$ROOTNAME.tar.gz" +cd "$DESTDIR" || exit + +pwd +ls -l $ROOTNAME.tar.gz + +# vi:ts=4 sw=4 diff --git a/contrib/ncurses/Ada95/mk-1st.awk b/contrib/ncurses/Ada95/mk-1st.awk new file mode 100644 index 00000000..616bfa6b --- /dev/null +++ b/contrib/ncurses/Ada95/mk-1st.awk @@ -0,0 +1,91 @@ +# $Id: mk-1st.awk,v 1.5 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2010,2011 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# Generate compile-rules for the Ada95 modules that we are using in libraries +# or programs. This script is used for older versions of gnatmake, which do +# not build libraries reliably, e.g., gnatmake 3.15. +# +# Fields in src/modules: +# $1 = module name +# $2 = directory where spec-dependency ".ads" is found +# $3 = directory where body-dependency ".adb" is found +# $4 = unit to compile (spec or body) +# +BEGIN { + printf "\n"; + printf "# generated by Ada95/mk-1st.awk\n"; + } + /^[#]/ { + next + } + /^$/ { + next + } + { + printf "\n"; + printf "%s.o :", $1; + + if ( $2 == "none" ) { + pre_spec = ""; + } else if ( $2 == "." ) { + pre_spec = ""; + printf " \\\n\t\t%s.ads", $1; + } else { + pre_spec = sprintf("%s/", $2); + printf " \\\n\t\t%s%s.ads", pre_spec, $1; + } + + if ( $3 == "none" ) { + pre_body = ""; + } else if ( $3 == "." ) { + pre_body = ""; + printf " \\\n\t\t%s.adb", $1; + } else { + pre_body = sprintf("%s/", $3); + printf " \\\n\t\t%s%s.adb", pre_body, $1; + printf " \\\n\t\t$(BASEDEPS)"; + } + + if ( $4 == "spec" ) { + suffix = "ads"; + prefix = pre_spec; + } else { + suffix = "adb"; + prefix = pre_body; + } + + printf "\n"; + printf "\t$(ADA) $(ADAFLAGS) -c -o $@ %s%s.%s\n", prefix, $1, suffix + } +END { + print "" + } diff --git a/contrib/ncurses/Ada95/mk-pkg.awk b/contrib/ncurses/Ada95/mk-pkg.awk new file mode 100644 index 00000000..bb07abe0 --- /dev/null +++ b/contrib/ncurses/Ada95/mk-pkg.awk @@ -0,0 +1,90 @@ +# $Id: mk-pkg.awk,v 1.1 2022/12/17 23:41:18 tom Exp $ +############################################################################## +# Copyright 2022 Thomas E. Dickey # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# add rules to Makefile for AdaCurses binding package. +BEGIN { + print "# generated by mk-pkg.awk\n"; + } +END { + printf "PACKAGE = %s\n", PACKAGE + print "real_bindir = $(libexecdir)/$(PACKAGE)" + print "REAL_BINDIR = $(LIBEXECDIR)/$(PACKAGE)" + print "SUB_MFLAGS = $(TOP_MFLAGS) BINDIR=$(REAL_BINDIR)" + print "samples = samples" + print "" + print "TESTS = \\" + print " $(samples)/ncurses \\" + print " $(samples)/rain \\" + print " $(samples)/tour" + print "" + print "DATAFILES = \\" + print " $(samples)/explain.txt" + print "" + print "all:: $(TESTS)" + print "" + print "# we might install the example-programs" + print "$(PACKAGE) :" + print " @echo \"creating $(PACKAGE) script\"" + print " @$(SHELL) -c '\\" + print " L=$(real_bindir); \\" + print " rm -f $@; \\" + print " echo \"#!$(SHELL)\" > $@;\\" + print " echo \"PATH=\\\"$$L\\\":\\$$PATH\" >>$@;\\" + print " echo \"export PATH\" >>$@;\\" + print " echo \"if test \\$$# != 0; then\" >>$@;\\" + print " echo \" exec \\\"\\$$@\\\"\" >>$@;\\" + print " echo \"elif test -t 1; then\" >>$@;\\" + print " echo \" cd \\\"$$L\\\" || exit\" >>$@;\\" + print " echo \" ls -l | \\$${PAGER:-less}\" >>$@;\\" + print " echo \"fi\" >>$@;\\" + print " echo \"echo \\\"usage: $@ [program]\\\"\" >>$@'" + print "" + print "install \\" + print "install.examples:: $(PACKAGE) $(BINDIR) $(REAL_BINDIR) $(DATADIR) $(TESTS)" + print " @echo \"installing $(PACKAGE) -> $(BINDIR)/\"" + print " $(INSTALL_SCRIPT) $(PACKAGE) $(BINDIR)" + print " ( cd samples && $(MAKE) $(SUB_MFLAGS) install.examples )" + print "" + print "uninstall \\" + print "uninstall.examples ::" + print " -rm -f $(BINDIR)/$(PACKAGE)" + print " ( cd samples && $(MAKE) $(SUB_MFLAGS) uninstall.examples )" + print "" + print "clean \\" + print "mostlyclean \\" + print "realclean \\" + print "distclean ::" + print " -rm -f $(PACKAGE)" + print "" + print "$(BINDIR) $(REAL_BINDIR) $(DATADIR) :" + print " mkdir -p $@" + + } diff --git a/contrib/ncurses/Ada95/package/AdaCurses-doc.spec b/contrib/ncurses/Ada95/package/AdaCurses-doc.spec new file mode 100644 index 00000000..cfc8527c --- /dev/null +++ b/contrib/ncurses/Ada95/package/AdaCurses-doc.spec @@ -0,0 +1,61 @@ +Summary: AdaCurses - Ada95 binding documentation for ncurses +%define AppProgram AdaCurses +%define AppVersion MAJOR.MINOR +%define AppRelease YYYYMMDD +%define AppPackage %{AppProgram}-doc +# $Id: AdaCurses-doc.spec,v 1.8 2024/06/08 13:54:31 tom Exp $ +Name: %{AppPackage} +Version: %{AppVersion} +Release: %{AppRelease} +License: MIT +Group: Applications/Development +URL: https://invisible-island.net/%{AppProgram} +Source0: %{AppProgram}-%{AppRelease}.tgz +Packager: Thomas Dickey + +%description +This is the Ada95 binding documentation from the ncurses MAJOR.MINOR +distribution, for patch-date YYYYMMDD. +%prep + +%define debug_package %{nil} + +%setup -q -n %{AppProgram}-%{AppRelease} + +%build + +INSTALL_PROGRAM='${INSTALL}' \ +%configure \ + --target %{_target_platform} \ + --prefix=%{_prefix} \ + --datadir=%{_datadir} \ + --with-ada-sharedlib + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +(cd doc && make install.html DESTDIR=$RPM_BUILD_ROOT ) + +%clean +if rm -rf $RPM_BUILD_ROOT; then + echo OK +else + find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1 +fi +exit 0 + +%files +%defattr(-,root,root) +%{_datadir}/doc/%{AppProgram} + +%changelog +# each patch should add its ChangeLog entries here + +* Sat Nov 16 2019 Thomas Dickey +- modify clean-rule to work around Fedora NFS bugs. + +* Sat Sep 07 2019 Thomas Dickey +- use AppProgram to replace "AdaCurses" globally + +* Sat Mar 26 2011 Thomas Dickey +- initial version diff --git a/contrib/ncurses/Ada95/package/AdaCurses.spec b/contrib/ncurses/Ada95/package/AdaCurses.spec new file mode 100644 index 00000000..aa557ab1 --- /dev/null +++ b/contrib/ncurses/Ada95/package/AdaCurses.spec @@ -0,0 +1,137 @@ +Summary: Ada95 binding for ncurses +%define AppProgram AdaCurses +%define AppVersion MAJOR.MINOR +%define AppRelease YYYYMMDD +# $Id: AdaCurses.spec,v 1.34 2024/06/08 13:53:14 tom Exp $ +Name: %{AppProgram} +Version: %{AppVersion} +Release: %{AppRelease} +License: MIT +Group: Applications/Development +URL: https://invisible-island.net/%{AppProgram} +Source0: %{AppProgram}-%{AppRelease}.tgz +Packager: Thomas Dickey + +%description +This is the Ada95 binding from the ncurses MAJOR.MINOR distribution, for +patch-date YYYYMMDD. + +In addition to a library, this package installs sample programs in +"bin/%{AppProgram}" to avoid conflict with other packages. +%prep + +%global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0) +%global is_redhat %(test -f /etc/redhat-release && echo 1 || echo 0) +%global is_suse %(if grep -E -i '(opensuse)' /etc/issue >/dev/null; then echo 1; else echo 0; fi) + +%define debug_package %{nil} + +%define need_filter %(if grep -E -i '(red hat|fedora)' /etc/issue >/dev/null; then echo 1; elif test -f /etc/fedora-release; then echo 1; else echo 0; fi) + +%if %{need_filter} == 1 +# http://fedoraproject.org/wiki/EPEL:Packaging_Autoprovides_and_Requires_Filtering +%filter_from_requires /lib%{AppProgram}.so.1/d +%filter_setup +%endif + +%setup -q -n %{AppProgram}-%{AppRelease} + +%build + +%define ada_libdir %{_libdir}/ada/adalib +%define ada_include %{_prefix}/share/ada/adainclude + +%if %{is_mandriva} +# Mageia 8 lacks gprbuild, needed for building shared libraries. +%define ada_model --without-shared --without-ada-sharedlib --with-ada-objects=%{_libdir}/adalib +%else +# OpenSUSE actually lacks gprbuild, but there is a workable "community" package. +%define ada_model --with-shared --with-ada-sharedlib +%if %{is_redhat} +# Fedora 36 LTO does not work with gprbuild system configuration. +unset CFLAGS +unset LDFLAGS +unset LT_SYS_LIBRARY_PATH +%endif +%endif + +INSTALL_PROGRAM='${INSTALL}' \ + ./configure %{ada_model} \ + --target %{_target_platform} \ + --prefix=%{_prefix} \ + --bindir=%{_bindir} \ + --libdir=%{_libdir} \ + --libexecdir=%{_libexecdir} \ + --with-ada-include=%{ada_include} \ + --with-ada-objects=%{ada_libdir} \ + --mandir=%{_mandir} \ + --datadir=%{_datadir} \ + --disable-rpath-link \ + --disable-echo \ + --verbose \ + --with-screen=ncursesw6dev \ + --enable-warnings + +make + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +make install DESTDIR=$RPM_BUILD_ROOT +make install.examples DESTDIR=$RPM_BUILD_ROOT + +%clean +if rm -rf $RPM_BUILD_ROOT; then + echo OK +else + find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1 +fi +exit 0 + +%files +%defattr(-,root,root) +%{_bindir}/%{AppProgram} +%{_bindir}/adacurses*-config +%{_libexecdir}/%{AppProgram}/* +%{ada_libdir}/ +%if %{need_filter} == 1 +%{_libdir}/lib%{AppProgram}.* +%endif +%if %{is_suse} +%{_libdir}/lib%{AppProgram}.* +%endif +%{_mandir}/man1/adacurses*-config.1* +%{_datadir}/%{AppProgram}/* +%{ada_include}/ + +%changelog +# each patch should add its ChangeLog entries here + +* Sat Dec 17 2022 Thomas Dickey +- install sample programs in libexec + +* Sat Nov 19 2022 Thomas Dickey +- use static libraries for Mageia. + +* Sat Nov 12 2022 Thomas Dickey +- unset environment variables to work around Fedora LTO bugs. +- build-fix for OpenSUSE with gprbuild. + +* Sat Nov 16 2019 Thomas Dickey +- modify clean-rule to work around Fedora NFS bugs. + +* Sat Sep 14 2019 Thomas Dickey +- build-fixes for Fedora29, OpenSUSE + +* Sat Sep 07 2019 Thomas Dickey +- use AppProgram to replace "AdaCurses" globally +- amend install-paths to work with Fedora30 + +* Thu Mar 31 2011 Thomas Dickey +- use --with-shared option for consistency with --with-ada-sharelib +- ensure that MY_DATADIR is set when installing examples +- add ada_libdir symbol to handle special case where libdir is /usr/lib64 +- use --disable-rpath-link to link sample programs without rpath + +* Fri Mar 25 2011 Thomas Dickey +- initial version diff --git a/contrib/ncurses/Ada95/package/debian/compat b/contrib/ncurses/Ada95/package/debian/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/Ada95/package/debian/control b/contrib/ncurses/Ada95/package/debian/control new file mode 100644 index 00000000..1a9aefda --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/control @@ -0,0 +1,19 @@ +Source: adacurses +Maintainer: Thomas E. Dickey +Section: misc +Priority: optional +Build-Depends: debhelper (>= 5), + gnat, + gprbuild +Homepage: https://invisible-island.net/adacurses/ +Standards-Version: 4.6.1.0 + +Package: adacurses +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Ada95 binding for ncurses + This package installs as "adacurses" to avoid conflict with other packages. + This is the Ada95 binding from the ncurses distribution. + . + In addition to a library, this package installs sample programs in + "bin/AdaCurses" to avoid conflict with other packages. diff --git a/contrib/ncurses/Ada95/package/debian/copyright b/contrib/ncurses/Ada95/package/debian/copyright new file mode 100644 index 00000000..b4060150 --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/copyright @@ -0,0 +1,79 @@ +Upstream source https://invisible-island.net/ncurses/Ada95.html + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 by Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 2010-2023,2024 by Thomas E. Dickey +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + + FSF changes to this file are in the public domain. + + Calling this script install-sh is preferred over install.sh, to prevent + `make' implicit rules from creating a file called install from it + when there is no Makefile. + + This script is compatible with the BSD install script, but was written + from scratch. It can only install one file at a time, a restriction + shared with many OS's install programs. + +On Debian systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL-2' + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/Ada95/package/debian/docs b/contrib/ncurses/Ada95/package/debian/docs new file mode 100644 index 00000000..e845566c --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/docs @@ -0,0 +1 @@ +README diff --git a/contrib/ncurses/Ada95/package/debian/rules b/contrib/ncurses/Ada95/package/debian/rules new file mode 100755 index 00000000..8f8e841c --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/rules @@ -0,0 +1,104 @@ +#!/usr/bin/make -f +# MAde with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +TARGET_DIR = $(CURDIR)/debian/adacurses +SAMPLE_DIR = $(TARGET_DIR)/usr/libexec/AdaCurses + +CFLAGS = $(shell dpkg-buildflags --get CFLAGS) $(CC_NORMAL) +CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS) +LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS) + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + + +configure: configure-stamp +configure-stamp: + dh_testdir + + CFLAGS="$(CFLAGS)" \ + CPPFLAGS="$(CPPFLAGS)" \ + LDFLAGS="$(LDFLAGS)" ./configure \ + --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --prefix=/usr \ + --disable-rpath-link \ + --with-shared \ + --with-ada-sharedlib \ + --with-screen=ncursesw6td \ + --without-pkg-config + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f makefile ] || $(MAKE) distclean + + rm -f configure-stamp build-stamp install-stamp + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_prep + dh_installdirs + + $(MAKE) install DESTDIR=$(TARGET_DIR) + + # FIXME: it would be nice to make these into separate packages + ( cd samples && $(MAKE) install.examples DESTDIR=$(TARGET_DIR) BINDIR=$(SAMPLE_DIR) ) + ( cd doc && $(MAKE) install.html DESTDIR=$(TARGET_DIR) ) + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# No binary-indep target. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installexamples + dh_installchangelogs NEWS + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_makeshlibs + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/contrib/ncurses/Ada95/package/debian/source/format b/contrib/ncurses/Ada95/package/debian/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/Ada95/package/debian/watch b/contrib/ncurses/Ada95/package/debian/watch new file mode 100644 index 00000000..5a8f1d2a --- /dev/null +++ b/contrib/ncurses/Ada95/package/debian/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/AdaCurses/AdaCurses-([\d.]+)\.tgz \ + debian uupdate diff --git a/contrib/ncurses/Ada95/samples/Makefile.in b/contrib/ncurses/Ada95/samples/Makefile.in new file mode 100644 index 00000000..ec7e52e5 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/Makefile.in @@ -0,0 +1,186 @@ +############################################################################## +# Copyright 2018-2021,2024 Thomas E. Dickey # +# Copyright 1998-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Juergen Pfeifer, 1996 +# +# $Id: Makefile.in,v 1.66 2024/08/10 17:56:19 tom Exp $ +# +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +x = @EXEEXT@ + +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +libdir = @libdir@ +includedir = @includedir@ + +INSTALL = @INSTALL@ @INSTALL_OPT_O@ +INSTALL_DATA = @INSTALL_DATA@ + +AWK = @AWK@ +LN_S = @LN_S@ + +CC = @CC@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ + +CPPFLAGS = @ACPPFLAGS@ \ + -DHAVE_CONFIG_H -I$(srcdir) + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ +LOCAL_LIBDIR = @top_builddir@/lib + +LINK = $(CC) +LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ + +RANLIB = @RANLIB@ +################################################################################ +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +DATADIR = $(DESTDIR)$(datadir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) + +MY_DATADIR = $(DATADIR)/@ADA_LIBNAME@ +THIS_DATADIR = $(datadir)/@ADA_LIBNAME@ + +################################################################################ +ada_srcdir = ../src + +LD_FLAGS = @LD_MODEL@ $(LOCAL_LIBS) @LDFLAGS@ @LIBS@ @LOCAL_LDFLAGS2@ $(LDFLAGS) + +ADA = @cf_ada_compiler@ +ADAPREP = gnatprep +ADAFLAGS = @ADAFLAGS@ -I$(srcdir) + +ADAMAKE = @cf_ada_make@ +ADAMAKEFLAGS = -a \ + -A$(srcdir) \ + -A$(ada_srcdir) \ + -A$(srcdir)/$(ada_srcdir) + +ALIB = @cf_ada_package@ +ABASE = $(ALIB)-curses +THISLIB = sample + +CARGS = -cargs $(ADAFLAGS) +LARGS = -largs -L../lib -l@ADA_LIBNAME@ @TEST_ARG2@ $(LD_FLAGS) @TEST_LIBS2@ + +PROGS = tour$x ncurses$x @USE_GNAT_SIGINT@ rain$x + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.examples +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.examples +@MAKE_PHONY@.PHONY : uninstall.libs + +all :: $(PROGS) + @echo made $@ + +sources : + @echo made $@ + +libs \ +install \ +install.libs :: $(PROGS) + @echo made $@ + +uninstall \ +uninstall.libs :: + @echo made $@ + +install.examples :: $(BINDIR) $(PROGS) + $(INSTALL) $(PROGS) $(BINDIR) + +install.examples :: $(MY_DATADIR) + $(INSTALL_DATA) explain.txt $(MY_DATADIR) + +uninstall.examples :: + -( cd $(BINDIR) && rm -f $(PROGS) ) + -rmdir $(BINDIR) + -rm -f $(MY_DATADIR)/explain.txt + -rmdir $(MY_DATADIR) + +$(BINDIR) \ +$(MY_DATADIR) : + mkdir -p $@ + +AUTO_SRC = $(THISLIB)-explanation.adb + +ncurses$x : $(AUTO_SRC) + $(ADAMAKE) $(ADAMAKEFLAGS) ncurses $(CARGS) $(LARGS) + +tour$x : $(AUTO_SRC) + $(ADAMAKE) $(ADAMAKEFLAGS) tour $(CARGS) $(LARGS) + +rain$x : $(AUTO_SRC) + $(ADAMAKE) $(ADAMAKEFLAGS) rain $(CARGS) $(LARGS) + +mostlyclean: + @echo made $@ + +clean :: mostlyclean + rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] \ + rm -f $(AUTO_SRC) + rm -f trace screendump b~*.ad[bs] + +distclean :: clean + rm -f Makefile + +realclean :: distclean + @echo made $@ + +$(THISLIB)-explanation.adb : $(srcdir)/$(THISLIB)-explanation.adb_p + rm -f $@ + $(AWK) -v this_datadir=$(THIS_DATADIR) -f $(srcdir)/split-path.awk < $(srcdir)/$(THISLIB)-explanation.adb_p >$@ diff --git a/contrib/ncurses/Ada95/samples/README b/contrib/ncurses/Ada95/samples/README new file mode 100644 index 00000000..85623433 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/README @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README,v 1.3 2020/02/02 23:34:34 tom Exp $ +------------------------------------------------------------------------------- + +The intention of the demo at this point in time is not to demonstrate all +the features of (n)curses and its subsystems, but to give some sample +sources how to use the binding at all. + +Ideally in the future we can combine both goals. diff --git a/contrib/ncurses/Ada95/samples/explain.txt b/contrib/ncurses/Ada95/samples/explain.txt new file mode 100644 index 00000000..f05eede3 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/explain.txt @@ -0,0 +1,186 @@ +#VERSION +This is Version 00.90.00 of the demo package. +#MENUKEYS +In a menu you can use the following Keys in the whole application: + + - CTRL-X eXit the menu + - CTRL-N Go to next item + - CTRL-P Go to previous item + - CTRL-U Scroll up one line + - CTRL-D Scroll down one line + - CTRL-F Scroll down one page + - PAGE DOWN Scroll down one page + - PAGE UP Scroll back one page + - CTRL-B Scroll back one page + - CTRL-Y Clear pattern + - CTRL-H Delete last character from pattern + - Backspace Delete last character from pattern + - CTRL-A Next pattern match + - CTRL-E Previous pattern match + - CTRL-T Toggle item in a multi-selection menu + - CR or LF Select an item + - HOME Key Go to the first item + - F3 Quit the menu + - Cursor Down Down one item + - Cursor Up Up one item + - Cursor Left Left one item + - Cursor Right Right one item + - END Key Go to last item +#FORMKEYS + - CTRL-X eXit the form + - CTRL-F Go forward to the next field + - CTRL-B Go backward to the previous field + - CTRL-L Go to the field left of the current one + - CTRL-R Go to the field right of the current one + - CTRL-U Go to the field above the current one + - CTRL-D Go to the field below the current one + + - CTRL-W Go to the next word in the field + - CTRL-T Go to the previous word in the field + + - CTRL-A Go to the beginning of the field + - CTRL-E Go to the end of the field + + - CTRL-I Insert a blank character at the current position + - CTRL-O Insert a line + - CTRL-V Delete a character + - CTRL-H Delete previous character + - CTRL-Y Delete a line + - CTRL-G Delete a word + - CTRL-K Clear to end of field + + - CTRL-N Next choice in a choice field (Enumerations etc.) + - CTRL-P Previous choice in a choice field. +#HELP +#HELPKEYS +You may scroll with the Cursor Up/Down Keys. +You may leave the help with the Function Key labeled 'Quit'. +#INHELP +You are already in the help system. +You may leave the help with the Function Key labeled 'Quit'. +#MAIN +This is the main menu of the sample program for the ncurses Ada95 +binding. The main intention of the demo is not to demonstrate or +test all the features of ncurses and its subsystems, but to provide +to you some sample code how to use the binding with Ada95. + +You may select this options: + + * Look at some ncurses core functions + * Look at some features of the menu subsystem + * Look at some features of the form subsystem + * Look at the output of the Ada.Text_IO like functions + for ncurses. + +#MAINPAD +You may press at any place in this demo CTRL-C. This will give you a command +window. You can just type in the Label-String of a function key, then this +key will be simulated. This should help you to run the application even if +you run it on a terminal with no or only a few function keys. With CTRL-N +and CTRL-P you may browse through the possible values in the command window. +#MENU00 +Here we give you a selection of various menu demonstrations. +#MENU-PAD00 +This menu itself is a demo for a single valued, 1-column menu with +descriptions for the items, a marker and a padding character between +the item name and the description. +#MENU01 +This is a demo of the some of the menu layout options. One of them +is the spacing functionality. Just press the Key labeled "Flip" to +flip between the non-spaced and a spaced version of the menu. Please +note that this functionality is unique for ncurses and is not found +in the SVr4 menu implementation. + +This is a menu that sometimes does not fit into its window and +therefore it becomes a scroll menu. + +You can also see here very nicely the pattern matching functionality +of menus. Type for example a 'J' and you will be positioned to the +next item after the current starting with a 'J'. Any more characters +you type in make the pattern more specific. With CTRL-A and CTRL-Z +(for more details press the Key labeled "Keys") you can browse +through all the items matching the pattern. + +You may change the format of the menu. Just press one of the keys +labeled "4x1", "4x2" or "4x3" to get a menu with that many rows +and columns. + +With the Keys "O-Row" or "O-Col" (they occupy the same label and +switch on selection) you can change the major order scheme for +the menu. If "O-Col" is visible, the menu is currently major +ordered by rows, you can switch to major column order by pressing +the key. If "O-Row" is visible, it is just the reverse situation. +This Key is not visible in "4x1" layout mode, because in this case +the functionality makes no sense. + +With the Keys "Multi" or "Singl" (they occupy the same label and +switch on selection) you can change whether or not the menu allows +multiple or only single selection. + +With the Keys "+Desc" or "-Desc" (they occupy the same label and +switch on selection) you can change whether or not the descriptions +for each item should be displayed. Please not that this key is +not visible in the "4x3" layout mode, because in this case the +menu would not fit on a typical 80x24 screen. + +With the Keys "Disab" or "Enab" (they occupy the same label and +switch on selection) you can dis- or enable the selectability of +the month with 31 days. +#MENU-PAD01 +You may press "Flip" to see the effect of ncurses unique menu-spacing. +The Keys "4x1", "4x2" and "4x3" will change the format of the menu. +Please note that this is a scrolling menu. You may also play with the +pattern matching functionality or try to change the format of the menu. +For more details press the Key labeled "Help". +#FORM00 +This is a demo of the forms package. +#FORM-PAD00 +Please note that this demo is far from being complete. It really shows +only a small part of the functionality of the forms package. Let's hope +the next version will have a richer demo (You want to contribute ?). +#NOTIMPL +Sorry this functionality of the demo is not implemented at the moment. +Remember this is a freeware project, so I can use only my very rare +free time to continue coding. If you would like to contribute, you +are very welcome ! +#CURSES00 +This is a menu where you can select some different demos of the ncurses +functionality. +#CURSES-PAD00 +Please note that this demo is far from being complete. It really shows +only a small part of the functionality of the curses package. Let's hope +the next version will have a richer demo (You want to contribute ?). +#MOUSEKEYS +In this demo you may use this keys: + + - Key labeled "Help" to get a help + - Key labeled "Keys" is what you are reading now + - Key labeled "Quit" to leave the demo + +You may click the mouse buttons at any location at the screen and look +at the protocol window ! +#MOUSE00 +A rather simple use of a mouse as demo. It is there just to test the +code and to provide the sample source. + +It might be of interest, that the output into the protocol window is +done by the (n)curses Text_IO subpackages. Especially the output of +the button and state names is done by Ads's enumeration IO, which +allows you to print the names of enumeration literals. That's really +nice. +#MOUSE-PAD00 +This is a very simple demo of the mouse features of ncurses. It is there +just to test whether or not the generated code for the binding really +works on the different architectures (seems so). +#ATTRIBDEMO +Again this is a more than simple demo and just here to give you the +sourcecode. +#ATTRIBKEYS +You may press one of the three well known standard keys of this demo. +#ATTRIB-PAD00 +Again this is a more than simple demo and just here to give you the +source code. Feel free to contribute more. +#TEXTIO +#TEXTIOKEYS +#TEXTIO-PAD00 +#END diff --git a/contrib/ncurses/Ada95/samples/ncurses.adb b/contrib/ncurses/Ada95/samples/ncurses.adb new file mode 100644 index 00000000..39ba7dcb --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses.adb @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.m; use ncurses2.m; +with GNAT.OS_Lib; use GNAT.OS_Lib; + +procedure ncurses is +begin + OS_Exit (main); +end ncurses; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.adb b/contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.adb new file mode 100644 index 00000000..7bb492c5 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.adb @@ -0,0 +1,712 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 2000-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.13 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- Windows and scrolling tester. +-- Demonstrate windows + +with Ada.Strings.Fixed; +with Ada.Strings; + +with ncurses2.util; use ncurses2.util; +with ncurses2.genericPuts; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse; +with Terminal_Interface.Curses.PutWin; use Terminal_Interface.Curses.PutWin; + +with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO; +with Ada.Streams; use Ada.Streams; + +procedure ncurses2.acs_and_scroll is + + Macro_Quit : constant Key_Code := Character'Pos ('Q') mod 16#20#; + Macro_Escape : constant Key_Code := Character'Pos ('[') mod 16#20#; + + Quit : constant Key_Code := CTRL ('Q'); + Escape : constant Key_Code := CTRL ('['); + + Botlines : constant Line_Position := 4; + + type pair is record + y : Line_Position; + x : Column_Position; + end record; + + type Frame; + type FrameA is access Frame; + + f : File_Type; + dumpfile : constant String := "screendump"; + + procedure Outerbox (ul, lr : pair; onoff : Boolean); + function HaveKeyPad (w : Window) return Boolean; + function HaveScroll (w : Window) return Boolean; + procedure newwin_legend (curpw : Window); + procedure transient (curpw : Window; msg : String); + procedure newwin_report (win : Window := Standard_Window); + procedure selectcell (uli : Line_Position; + ulj : Column_Position; + lri : Line_Position; + lrj : Column_Position; + p : out pair; + b : out Boolean); + function getwindow return Window; + procedure newwin_move (win : Window; + dy : Line_Position; + dx : Column_Position); + function delete_framed (fp : FrameA; showit : Boolean) return FrameA; + + -- A linked list + -- I wish there was a standard library linked list. Oh well. + type Frame is record + next, last : FrameA; + do_scroll : Boolean; + do_keypad : Boolean; + wind : Window; + end record; + + current : FrameA; + + c : Key_Code; + + procedure Outerbox (ul, lr : pair; onoff : Boolean) is + begin + if onoff then + -- Note the fix of an obscure bug + -- try making a 1x1 box then enlarging it, the is a blank + -- upper left corner! + Add (Line => ul.y - 1, Column => ul.x - 1, + Ch => ACS_Map (ACS_Upper_Left_Corner)); + Add (Line => ul.y - 1, Column => lr.x + 1, + Ch => ACS_Map (ACS_Upper_Right_Corner)); + Add (Line => lr.y + 1, Column => lr.x + 1, + Ch => ACS_Map (ACS_Lower_Right_Corner)); + Add (Line => lr.y + 1, Column => ul.x - 1, + Ch => ACS_Map (ACS_Lower_Left_Corner)); + + Move_Cursor (Line => ul.y - 1, Column => ul.x); + Horizontal_Line (Line_Symbol => ACS_Map (ACS_Horizontal_Line), + Line_Size => Integer (lr.x - ul.x) + 1); + Move_Cursor (Line => ul.y, Column => ul.x - 1); + Vertical_Line (Line_Symbol => ACS_Map (ACS_Vertical_Line), + Line_Size => Integer (lr.y - ul.y) + 1); + Move_Cursor (Line => lr.y + 1, Column => ul.x); + Horizontal_Line (Line_Symbol => ACS_Map (ACS_Horizontal_Line), + Line_Size => Integer (lr.x - ul.x) + 1); + Move_Cursor (Line => ul.y, Column => lr.x + 1); + Vertical_Line (Line_Symbol => ACS_Map (ACS_Vertical_Line), + Line_Size => Integer (lr.y - ul.y) + 1); + else + Add (Line => ul.y - 1, Column => ul.x - 1, Ch => ' '); + Add (Line => ul.y - 1, Column => lr.x + 1, Ch => ' '); + Add (Line => lr.y + 1, Column => lr.x + 1, Ch => ' '); + Add (Line => lr.y + 1, Column => ul.x - 1, Ch => ' '); + + Move_Cursor (Line => ul.y - 1, Column => ul.x); + Horizontal_Line (Line_Symbol => Blank2, + Line_Size => Integer (lr.x - ul.x) + 1); + Move_Cursor (Line => ul.y, Column => ul.x - 1); + Vertical_Line (Line_Symbol => Blank2, + Line_Size => Integer (lr.y - ul.y) + 1); + Move_Cursor (Line => lr.y + 1, Column => ul.x); + Horizontal_Line (Line_Symbol => Blank2, + Line_Size => Integer (lr.x - ul.x) + 1); + Move_Cursor (Line => ul.y, Column => lr.x + 1); + Vertical_Line (Line_Symbol => Blank2, + Line_Size => Integer (lr.y - ul.y) + 1); + end if; + end Outerbox; + + function HaveKeyPad (w : Window) return Boolean is + begin + return Get_KeyPad_Mode (w); + exception + when Curses_Exception => return False; + end HaveKeyPad; + + function HaveScroll (w : Window) return Boolean is + begin + return Scrolling_Allowed (w); + exception + when Curses_Exception => return False; + end HaveScroll; + + procedure newwin_legend (curpw : Window) is + + package p is new genericPuts (200); + use p; + use p.BS; + + type string_a is access String; + + type rrr is record + msg : string_a; + code : Integer range 0 .. 3; + end record; + + legend : constant array (Positive range <>) of rrr := + ( + ( + new String'("^C = create window"), 0 + ), + ( + new String'("^N = next window"), 0 + ), + ( + new String'("^P = previous window"), 0 + ), + ( + new String'("^F = scroll forward"), 0 + ), + ( + new String'("^B = scroll backward"), 0 + ), + ( + new String'("^K = keypad(%s)"), 1 + ), + ( + new String'("^S = scrollok(%s)"), 2 + ), + ( + new String'("^W = save window to file"), 0 + ), + ( + new String'("^R = restore window"), 0 + ), + ( + new String'("^X = resize"), 0 + ), + ( + new String'("^Q%s = exit"), 3 + ) + ); + + buf : Bounded_String; + do_keypad : constant Boolean := HaveKeyPad (curpw); + do_scroll : constant Boolean := HaveScroll (curpw); + + pos : Natural; + + mypair : pair; + + begin + Move_Cursor (Line => Lines - 4, Column => 0); + for n in legend'Range loop + pos := Ada.Strings.Fixed.Index (Source => legend (n).msg.all, + Pattern => "%s"); + buf := To_Bounded_String (legend (n).msg.all); + case legend (n).code is + when 0 => null; + when 1 => + if do_keypad then + Replace_Slice (buf, pos, pos + 1, "yes"); + else + Replace_Slice (buf, pos, pos + 1, "no"); + end if; + when 2 => + if do_scroll then + Replace_Slice (buf, pos, pos + 1, "yes"); + else + Replace_Slice (buf, pos, pos + 1, "no"); + end if; + when 3 => + if do_keypad then + Replace_Slice (buf, pos, pos + 1, "/ESC"); + else + Replace_Slice (buf, pos, pos + 1, ""); + end if; + end case; + Get_Cursor_Position (Line => mypair.y, Column => mypair.x); + if Columns < mypair.x + 3 + Column_Position (Length (buf)) then + Add (Ch => newl); + elsif n /= 1 then -- n /= legen'First + Add (Str => ", "); + end if; + myAdd (Str => buf); + end loop; + Clear_To_End_Of_Line; + end newwin_legend; + + procedure transient (curpw : Window; msg : String) is + begin + newwin_legend (curpw); + if msg /= "" then + Add (Line => Lines - 1, Column => 0, Str => msg); + Refresh; + Nap_Milli_Seconds (1000); + end if; + + Move_Cursor (Line => Lines - 1, Column => 0); + + if HaveKeyPad (curpw) then + Add (Str => "Non-arrow"); + else + Add (Str => "All other"); + end if; + Add (Str => " characters are echoed, window should "); + if not HaveScroll (curpw) then + Add (Str => "not "); + end if; + Add (Str => "scroll"); + + Clear_To_End_Of_Line; + end transient; + + procedure newwin_report (win : Window := Standard_Window) is + y : Line_Position; + x : Column_Position; + use Int_IO; + tmp2a : String (1 .. 2); + tmp2b : String (1 .. 2); + begin + if win /= Standard_Window then + transient (win, ""); + end if; + Get_Cursor_Position (win, y, x); + Move_Cursor (Line => Lines - 1, Column => Columns - 17); + Put (tmp2a, Integer (y)); + Put (tmp2b, Integer (x)); + Add (Str => "Y = " & tmp2a & " X = " & tmp2b); + if win /= Standard_Window then + Refresh; + else + Move_Cursor (win, y, x); + end if; + end newwin_report; + + procedure selectcell (uli : Line_Position; + ulj : Column_Position; + lri : Line_Position; + lrj : Column_Position; + p : out pair; + b : out Boolean) is + c : Key_Code; + res : pair; + i : Line_Position := 0; + j : Column_Position := 0; + si : constant Line_Position := lri - uli + 1; + sj : constant Column_Position := lrj - ulj + 1; + begin + res.y := uli; + res.x := ulj; + loop + Move_Cursor (Line => uli + i, Column => ulj + j); + newwin_report; + + c := Getchar; + case c is + when + Macro_Quit | + Macro_Escape => + -- on the same line macro calls interfere due to the # comment + -- this is needed because keypad off affects all windows. + -- try removing the ESCAPE and see what happens. + b := False; + return; + when KEY_UP => + i := i + si - 1; + -- same as i := i - 1 because of Modulus arithmetic, + -- on Line_Position, which is a Natural + -- the C version uses this form too, interestingly. + when KEY_DOWN => + i := i + 1; + when KEY_LEFT => + j := j + sj - 1; + when KEY_RIGHT => + j := j + 1; + when Key_Mouse => + declare + event : Mouse_Event; + y : Line_Position; + x : Column_Position; + Button : Mouse_Button; + State : Button_State; + + begin + event := Get_Mouse; + Get_Event (Event => event, + Y => y, + X => x, + Button => Button, + State => State); + if y > uli and x > ulj then + i := y - uli; + j := x - ulj; + -- same as when others => + res.y := uli + i; + res.x := ulj + j; + p := res; + b := True; + return; + else + Beep; + end if; + end; + when others => + res.y := uli + i; + res.x := ulj + j; + p := res; + b := True; + return; + end case; + i := i mod si; + j := j mod sj; + end loop; + end selectcell; + + function getwindow return Window is + rwindow : Window; + ul, lr : pair; + result : Boolean; + begin + Move_Cursor (Line => 0, Column => 0); + Clear_To_End_Of_Line; + Add (Str => "Use arrows to move cursor, anything else to mark corner 1"); + Refresh; + selectcell (2, 1, Lines - Botlines - 2, Columns - 2, ul, result); + if not result then + return Null_Window; + end if; + Add (Line => ul.y - 1, Column => ul.x - 1, + Ch => ACS_Map (ACS_Upper_Left_Corner)); + Move_Cursor (Line => 0, Column => 0); + Clear_To_End_Of_Line; + Add (Str => "Use arrows to move cursor, anything else to mark corner 2"); + Refresh; + selectcell (ul.y, ul.x, Lines - Botlines - 2, Columns - 2, lr, result); + if not result then + return Null_Window; + end if; + + rwindow := Sub_Window (Number_Of_Lines => lr.y - ul.y + 1, + Number_Of_Columns => lr.x - ul.x + 1, + First_Line_Position => ul.y, + First_Column_Position => ul.x); + + Outerbox (ul, lr, True); + Refresh; + + Refresh (rwindow); + + Move_Cursor (Line => 0, Column => 0); + Clear_To_End_Of_Line; + return rwindow; + end getwindow; + + procedure newwin_move (win : Window; + dy : Line_Position; + dx : Column_Position) is + cur_y, max_y : Line_Position; + cur_x, max_x : Column_Position; + begin + Get_Cursor_Position (win, cur_y, cur_x); + Get_Size (win, max_y, max_x); + cur_x := Column_Position'Min (Column_Position'Max (cur_x + dx, 0), + max_x - 1); + cur_y := Line_Position'Min (Line_Position'Max (cur_y + dy, 0), + max_y - 1); + + Move_Cursor (win, Line => cur_y, Column => cur_x); + end newwin_move; + + function delete_framed (fp : FrameA; showit : Boolean) return FrameA is + np : FrameA; + begin + fp.all.last.all.next := fp.all.next; + fp.all.next.all.last := fp.all.last; + + if showit then + Erase (fp.all.wind); + Refresh (fp.all.wind); + end if; + Delete (fp.all.wind); + + if fp = fp.all.next then + np := null; + else + np := fp.all.next; + end if; + -- TODO free(fp); + return np; + end delete_framed; + + Mask : Event_Mask := No_Events; + Mask2 : Event_Mask; + + usescr : Window; + +begin + if Has_Mouse then + Register_Reportable_Event ( + Button => Left, + State => Clicked, + Mask => Mask); + Mask2 := Start_Mouse (Mask); + end if; + c := CTRL ('C'); + Set_Raw_Mode (SwitchOn => True); + loop + transient (Standard_Window, ""); + case c is + when Character'Pos ('c') mod 16#20# => -- Ctrl('c') + declare + neww : constant FrameA := new Frame'(null, null, + False, False, + Null_Window); + begin + neww.all.wind := getwindow; + if neww.all.wind = Null_Window then + exit; + -- was goto breakout; ha ha ha + else + + if current = null then + neww.all.next := neww; + neww.all.last := neww; + else + neww.all.next := current.all.next; + neww.all.last := current; + neww.all.last.all.next := neww; + neww.all.next.all.last := neww; + end if; + current := neww; + + Set_KeyPad_Mode (current.all.wind, True); + current.all.do_keypad := HaveKeyPad (current.all.wind); + current.all.do_scroll := HaveScroll (current.all.wind); + end if; + end; + when Character'Pos ('N') mod 16#20# => -- Ctrl('N') + if current /= null then + current := current.all.next; + end if; + when Character'Pos ('P') mod 16#20# => -- Ctrl('P') + if current /= null then + current := current.all.last; + end if; + when Character'Pos ('F') mod 16#20# => -- Ctrl('F') + if current /= null and then HaveScroll (current.all.wind) then + Scroll (current.all.wind, 1); + end if; + when Character'Pos ('B') mod 16#20# => -- Ctrl('B') + if current /= null and then HaveScroll (current.all.wind) then + -- The C version of Scroll may return ERR which is ignored + -- we need to avoid the exception + -- with the 'and HaveScroll(current.wind)' + Scroll (current.all.wind, -1); + end if; + when Character'Pos ('K') mod 16#20# => -- Ctrl('K') + if current /= null then + current.all.do_keypad := not current.all.do_keypad; + Set_KeyPad_Mode (current.all.wind, current.all.do_keypad); + end if; + when Character'Pos ('S') mod 16#20# => -- Ctrl('S') + if current /= null then + current.all.do_scroll := not current.all.do_scroll; + Allow_Scrolling (current.all.wind, current.all.do_scroll); + end if; + when Character'Pos ('W') mod 16#20# => -- Ctrl('W') + if current /= current.all.next then + Create (f, Name => dumpfile); -- TODO error checking + if not Is_Open (f) then + raise Curses_Exception; + end if; + Put_Window (current.all.wind, f); + Close (f); + current := delete_framed (current, True); + end if; + when Character'Pos ('R') mod 16#20# => -- Ctrl('R') + declare + neww : FrameA := new Frame'(null, null, False, False, + Null_Window); + begin + Open (f, Mode => In_File, Name => dumpfile); + neww := new Frame'(null, null, False, False, Null_Window); + + neww.all.next := current.all.next; + neww.all.last := current; + neww.all.last.all.next := neww; + neww.all.next.all.last := neww; + + neww.all.wind := Get_Window (f); + Close (f); + + Refresh (neww.all.wind); + end; + when Character'Pos ('X') mod 16#20# => -- Ctrl('X') + if current /= null then + declare + tmp, ul, lr : pair; + mx : Column_Position; + my : Line_Position; + tmpbool : Boolean; + begin + Move_Cursor (Line => 0, Column => 0); + Clear_To_End_Of_Line; + Add (Str => "Use arrows to move cursor, anything else " & + "to mark new corner"); + Refresh; + + Get_Window_Position (current.all.wind, ul.y, ul.x); + + selectcell (ul.y, ul.x, Lines - Botlines - 2, Columns - 2, + tmp, tmpbool); + if not tmpbool then + -- the C version had a goto. I refuse gotos. + Beep; + else + Get_Size (current.all.wind, lr.y, lr.x); + lr.y := lr.y + ul.y - 1; + lr.x := lr.x + ul.x - 1; + Outerbox (ul, lr, False); + Refresh_Without_Update; + + Get_Size (current.all.wind, my, mx); + if my > tmp.y - ul.y then + Get_Cursor_Position (current.all.wind, lr.y, lr.x); + Move_Cursor (current.all.wind, tmp.y - ul.y + 1, 0); + Clear_To_End_Of_Screen (current.all.wind); + Move_Cursor (current.all.wind, lr.y, lr.x); + end if; + if mx > tmp.x - ul.x then + for i in 0 .. my - 1 loop + Move_Cursor (current.all.wind, i, tmp.x - ul.x + 1); + Clear_To_End_Of_Line (current.all.wind); + end loop; + end if; + Refresh_Without_Update (current.all.wind); + + lr := tmp; + -- The C version passes invalid args to resize + -- which returns an ERR. For Ada we avoid the exception. + if lr.y /= ul.y and lr.x /= ul.x then + Resize (current.all.wind, lr.y - ul.y + 0, + lr.x - ul.x + 0); + end if; + + Get_Window_Position (current.all.wind, ul.y, ul.x); + Get_Size (current.all.wind, lr.y, lr.x); + lr.y := lr.y + ul.y - 1; + lr.x := lr.x + ul.x - 1; + Outerbox (ul, lr, True); + Refresh_Without_Update; + + Refresh_Without_Update (current.all.wind); + Move_Cursor (Line => 0, Column => 0); + Clear_To_End_Of_Line; + Update_Screen; + end if; + end; + end if; + when Key_F10 => + declare tmp : pair; tmpbool : Boolean; + begin + -- undocumented --- use this to test area clears + selectcell (0, 0, Lines - 1, Columns - 1, tmp, tmpbool); + Clear_To_End_Of_Screen; + Refresh; + end; + when Key_Cursor_Up => + newwin_move (current.all.wind, -1, 0); + when Key_Cursor_Down => + newwin_move (current.all.wind, 1, 0); + when Key_Cursor_Left => + newwin_move (current.all.wind, 0, -1); + when Key_Cursor_Right => + newwin_move (current.all.wind, 0, 1); + when Key_Backspace | Key_Delete_Char => + declare + y : Line_Position; + x : Column_Position; + tmp : Line_Position; + begin + Get_Cursor_Position (current.all.wind, y, x); + -- x := x - 1; + -- I got tricked by the -1 = Max_Natural - 1 result + -- y := y - 1; + if not (x = 0 and y = 0) then + if x = 0 then + y := y - 1; + Get_Size (current.all.wind, tmp, x); + end if; + x := x - 1; + Delete_Character (current.all.wind, y, x); + end if; + end; + when others => + -- TODO c = '\r' ? + if current /= null then + declare + begin + Add (current.all.wind, Ch => Code_To_Char (c)); + exception + when Curses_Exception => null; + -- this happens if we are at the + -- lower right of a window and add a character. + end; + else + Beep; + end if; + end case; + newwin_report (current.all.wind); + if current /= null then + usescr := current.all.wind; + else + usescr := Standard_Window; + end if; + Refresh (usescr); + c := Getchar (usescr); + exit when c = Quit or (c = Escape and HaveKeyPad (usescr)); + -- TODO when does c = ERR happen? + end loop; + + -- TODO while current /= null loop + -- current := delete_framed(current, False); + -- end loop; + + Allow_Scrolling (Mode => True); + + End_Mouse (Mask2); + Set_Raw_Mode (SwitchOn => True); + Erase; + End_Windows; + +end ncurses2.acs_and_scroll; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.ads b/contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.ads new file mode 100644 index 00000000..bd2759a6 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-acs_and_scroll.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.acs_and_scroll; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-acs_display.adb b/contrib/ncurses/Ada95/samples/ncurses2-acs_display.adb new file mode 100644 index 00000000..2916e15c --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-acs_display.adb @@ -0,0 +1,236 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.7 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with ncurses2.genericPuts; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +with Ada.Strings.Unbounded; +with Ada.Strings.Fixed; + +procedure ncurses2.acs_display is + use Int_IO; + + procedure show_upper_chars (first : Integer); + function show_1_acs (N : Integer; + name : String; + code : Attributed_Character) + return Integer; + procedure show_acs_chars; + + procedure show_upper_chars (first : Integer) is + C1 : constant Boolean := (first = 128); + last : constant Integer := first + 31; + package p is new ncurses2.genericPuts (200); + use p; + use p.BS; + use Ada.Strings.Unbounded; + + tmpa : Unbounded_String; + tmpb : BS.Bounded_String; + begin + Erase; + Switch_Character_Attribute + (Attr => (Bold_Character => True, others => False)); + Move_Cursor (Line => 0, Column => 20); + tmpa := To_Unbounded_String ("Display of "); + if C1 then + tmpa := tmpa & "C1"; + else + tmpa := tmpa & "GR"; + end if; + tmpa := tmpa & " Character Codes "; + myPut (tmpb, first); + Append (tmpa, To_String (tmpb)); + Append (tmpa, " to "); + myPut (tmpb, last); + Append (tmpa, To_String (tmpb)); + Add (Str => To_String (tmpa)); + Switch_Character_Attribute + (On => False, + Attr => (Bold_Character => True, others => False)); + Refresh; + + for code in first .. last loop + declare + row : constant Line_Position + := Line_Position (4 + ((code - first) mod 16)); + col : constant Column_Position + := Column_Position (((code - first) / 16) * + Integer (Columns) / 2); + tmp3 : String (1 .. 3); + tmpx : String (1 .. Integer (Columns / 4)); + reply : Key_Code; + begin + Put (tmp3, code); + myPut (tmpb, code, 16); + tmpa := To_Unbounded_String (tmp3 & " (" & To_String (tmpb) & ')'); + + Ada.Strings.Fixed.Move (To_String (tmpa), tmpx, + Justify => Ada.Strings.Right); + Add (Line => row, Column => col, + Str => tmpx & ' ' & ':' & ' '); + if C1 then + Set_NoDelay_Mode (Mode => True); + end if; + Add_With_Immediate_Echo (Ch => Code_To_Char (Key_Code (code))); + -- TODO check this + if C1 then + reply := Getchar; + while reply /= Key_None loop + Add (Ch => Code_To_Char (reply)); + Nap_Milli_Seconds (10); + reply := Getchar; + end loop; + Set_NoDelay_Mode (Mode => False); + end if; + end; + end loop; + end show_upper_chars; + + function show_1_acs (N : Integer; + name : String; + code : Attributed_Character) + return Integer is + height : constant Integer := 16; + row : constant Line_Position := Line_Position (4 + (N mod height)); + col : constant Column_Position := Column_Position ((N / height) * + Integer (Columns) / 2); + tmpx : String (1 .. Integer (Columns) / 3); + begin + Ada.Strings.Fixed.Move (name, tmpx, + Justify => Ada.Strings.Right, + Drop => Ada.Strings.Left); + Add (Line => row, Column => col, Str => tmpx & ' ' & ':' & ' '); + -- we need more room than C because our identifiers are longer + -- 22 chars actually + Add (Ch => code); + return N + 1; + end show_1_acs; + + procedure show_acs_chars is + n : Integer; + begin + Erase; + Switch_Character_Attribute + (Attr => (Bold_Character => True, others => False)); + Add (Line => 0, Column => 20, + Str => "Display of the ACS Character Set"); + Switch_Character_Attribute (On => False, + Attr => (Bold_Character => True, + others => False)); + Refresh; + + -- the following is useful to generate the below + -- grep '^[ ]*ACS_' ../src/terminal_interface-curses.ads | + -- awk '{print "n := show_1_acs(n, \""$1"\", ACS_Map("$1"));"}' + + n := show_1_acs (0, "ACS_Upper_Left_Corner", + ACS_Map (ACS_Upper_Left_Corner)); + n := show_1_acs (n, "ACS_Lower_Left_Corner", + ACS_Map (ACS_Lower_Left_Corner)); + n := show_1_acs (n, "ACS_Upper_Right_Corner", + ACS_Map (ACS_Upper_Right_Corner)); + n := show_1_acs (n, "ACS_Lower_Right_Corner", + ACS_Map (ACS_Lower_Right_Corner)); + n := show_1_acs (n, "ACS_Left_Tee", ACS_Map (ACS_Left_Tee)); + n := show_1_acs (n, "ACS_Right_Tee", ACS_Map (ACS_Right_Tee)); + n := show_1_acs (n, "ACS_Bottom_Tee", ACS_Map (ACS_Bottom_Tee)); + n := show_1_acs (n, "ACS_Top_Tee", ACS_Map (ACS_Top_Tee)); + n := show_1_acs (n, "ACS_Horizontal_Line", + ACS_Map (ACS_Horizontal_Line)); + n := show_1_acs (n, "ACS_Vertical_Line", ACS_Map (ACS_Vertical_Line)); + n := show_1_acs (n, "ACS_Plus_Symbol", ACS_Map (ACS_Plus_Symbol)); + n := show_1_acs (n, "ACS_Scan_Line_1", ACS_Map (ACS_Scan_Line_1)); + n := show_1_acs (n, "ACS_Scan_Line_9", ACS_Map (ACS_Scan_Line_9)); + n := show_1_acs (n, "ACS_Diamond", ACS_Map (ACS_Diamond)); + n := show_1_acs (n, "ACS_Checker_Board", ACS_Map (ACS_Checker_Board)); + n := show_1_acs (n, "ACS_Degree", ACS_Map (ACS_Degree)); + n := show_1_acs (n, "ACS_Plus_Minus", ACS_Map (ACS_Plus_Minus)); + n := show_1_acs (n, "ACS_Bullet", ACS_Map (ACS_Bullet)); + n := show_1_acs (n, "ACS_Left_Arrow", ACS_Map (ACS_Left_Arrow)); + n := show_1_acs (n, "ACS_Right_Arrow", ACS_Map (ACS_Right_Arrow)); + n := show_1_acs (n, "ACS_Down_Arrow", ACS_Map (ACS_Down_Arrow)); + n := show_1_acs (n, "ACS_Up_Arrow", ACS_Map (ACS_Up_Arrow)); + n := show_1_acs (n, "ACS_Board_Of_Squares", + ACS_Map (ACS_Board_Of_Squares)); + n := show_1_acs (n, "ACS_Lantern", ACS_Map (ACS_Lantern)); + n := show_1_acs (n, "ACS_Solid_Block", ACS_Map (ACS_Solid_Block)); + n := show_1_acs (n, "ACS_Scan_Line_3", ACS_Map (ACS_Scan_Line_3)); + n := show_1_acs (n, "ACS_Scan_Line_7", ACS_Map (ACS_Scan_Line_7)); + n := show_1_acs (n, "ACS_Less_Or_Equal", ACS_Map (ACS_Less_Or_Equal)); + n := show_1_acs (n, "ACS_Greater_Or_Equal", + ACS_Map (ACS_Greater_Or_Equal)); + n := show_1_acs (n, "ACS_PI", ACS_Map (ACS_PI)); + n := show_1_acs (n, "ACS_Not_Equal", ACS_Map (ACS_Not_Equal)); + n := show_1_acs (n, "ACS_Sterling", ACS_Map (ACS_Sterling)); + + if n = 0 then + raise Constraint_Error; + end if; + end show_acs_chars; + + c1 : Key_Code; + c : Character := 'a'; +begin + loop + case c is + when 'a' => + show_acs_chars; + when '0' | '1' | '2' | '3' => + show_upper_chars (ctoi (c) * 32 + 128); + when others => + null; + end case; + Add (Line => Lines - 3, Column => 0, + Str => "Note: ANSI terminals may not display C1 characters."); + Add (Line => Lines - 2, Column => 0, + Str => "Select: a=ACS, 0=C1, 1,2,3=GR characters, q=quit"); + Refresh; + c1 := Getchar; + c := Code_To_Char (c1); + exit when c = 'q' or c = 'x'; + end loop; + Pause; + Erase; + End_Windows; +end ncurses2.acs_display; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-acs_display.ads b/contrib/ncurses/Ada95/samples/ncurses2-acs_display.ads new file mode 100644 index 00000000..d685e58a --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-acs_display.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.acs_display; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-attr_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-attr_test.adb new file mode 100644 index 00000000..b41cc808 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-attr_test.adb @@ -0,0 +1,363 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2007,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.10 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Terminfo; +use Terminal_Interface.Curses.Terminfo; +with Ada.Characters.Handling; +with Ada.Strings.Fixed; + +procedure ncurses2.attr_test is + + function subset (super, sub : Character_Attribute_Set) return Boolean; + function intersect (b, a : Character_Attribute_Set) return Boolean; + function has_A_COLOR (attr : Attributed_Character) return Boolean; + function show_attr (row : Line_Position; + skip : Natural; + attr : Character_Attribute_Set; + name : String; + once : Boolean) return Line_Position; + procedure attr_getc (skip : in out Integer; + fg, bg : in out Color_Number; + result : out Boolean); + + function subset (super, sub : Character_Attribute_Set) return Boolean is + begin + if + (super.Stand_Out or not sub.Stand_Out) and + (super.Under_Line or not sub.Under_Line) and + (super.Reverse_Video or not sub.Reverse_Video) and + (super.Blink or not sub.Blink) and + (super.Dim_Character or not sub.Dim_Character) and + (super.Bold_Character or not sub.Bold_Character) and + (super.Alternate_Character_Set or not sub.Alternate_Character_Set) and + (super.Invisible_Character or not sub.Invisible_Character) -- and +-- (super.Protected_Character or not sub.Protected_Character) and +-- (super.Horizontal or not sub.Horizontal) and +-- (super.Left or not sub.Left) and +-- (super.Low or not sub.Low) and +-- (super.Right or not sub.Right) and +-- (super.Top or not sub.Top) and +-- (super.Vertical or not sub.Vertical) + then + return True; + else + return False; + end if; + end subset; + + function intersect (b, a : Character_Attribute_Set) return Boolean is + begin + if + (a.Stand_Out and b.Stand_Out) or + (a.Under_Line and b.Under_Line) or + (a.Reverse_Video and b.Reverse_Video) or + (a.Blink and b.Blink) or + (a.Dim_Character and b.Dim_Character) or + (a.Bold_Character and b.Bold_Character) or + (a.Alternate_Character_Set and b.Alternate_Character_Set) or + (a.Invisible_Character and b.Invisible_Character) -- or +-- (a.Protected_Character and b.Protected_Character) or +-- (a.Horizontal and b.Horizontal) or +-- (a.Left and b.Left) or +-- (a.Low and b.Low) or +-- (a.Right and b.Right) or +-- (a.Top and b.Top) or +-- (a.Vertical and b.Vertical) + then + return True; + else + return False; + end if; + end intersect; + + function has_A_COLOR (attr : Attributed_Character) return Boolean is + begin + if attr.Color /= Color_Pair (0) then + return True; + else + return False; + end if; + end has_A_COLOR; + + -- Print some text with attributes. + function show_attr (row : Line_Position; + skip : Natural; + attr : Character_Attribute_Set; + name : String; + once : Boolean) return Line_Position is + + function make_record (n : Integer) return Character_Attribute_Set; + function make_record (n : Integer) return Character_Attribute_Set is + -- unsupported means true + a : Character_Attribute_Set := (others => False); + m : Integer; + rest : Integer; + begin + -- ncv is a bitmap with these fields + -- A_STANDOUT, + -- A_UNDERLINE, + -- A_REVERSE, + -- A_BLINK, + -- A_DIM, + -- A_BOLD, + -- A_INVIS, + -- A_PROTECT, + -- A_ALTCHARSET + -- It means no_color_video, + -- video attributes that can't be used with colors + -- see man terminfo.5 + m := n mod 2; + rest := n / 2; + if 1 = m then + a.Stand_Out := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Under_Line := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Reverse_Video := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Blink := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Bold_Character := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Invisible_Character := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Protected_Character := True; + end if; + m := rest mod 2; + rest := rest / 2; + if 1 = m then + a.Alternate_Character_Set := True; + end if; + + return a; + end make_record; + + ncv : constant Integer := Get_Number ("ncv"); + + begin + Move_Cursor (Line => row, Column => 8); + Add (Str => name & " mode:"); + Move_Cursor (Line => row, Column => 24); + Add (Ch => '|'); + if skip /= 0 then + -- printw("%*s", skip, " ") + Add (Str => Ada.Strings.Fixed."*" (skip, ' ')); + end if; + if once then + Switch_Character_Attribute (Attr => attr); + else + Set_Character_Attributes (Attr => attr); + end if; + Add (Str => "abcde fghij klmno pqrst uvwxy z"); + if once then + Switch_Character_Attribute (Attr => attr, On => False); + end if; + if skip /= 0 then + Add (Str => Ada.Strings.Fixed."*" (skip, ' ')); + end if; + Add (Ch => '|'); + if attr /= Normal_Video then + declare begin + if not subset (super => Supported_Attributes, sub => attr) then + Add (Str => " (N/A)"); + elsif ncv > 0 and has_A_COLOR (Get_Background) then + declare + Color_Supported_Attributes : + constant Character_Attribute_Set := make_record (ncv); + begin + if intersect (Color_Supported_Attributes, attr) then + Add (Str => " (NCV) "); + end if; + end; + end if; + end; + end if; + return row + 2; + end show_attr; + + procedure attr_getc (skip : in out Integer; + fg, bg : in out Color_Number; + result : out Boolean) is + ch : constant Key_Code := Getchar; + nc : constant Color_Number := Color_Number (Number_Of_Colors); + begin + result := True; + if Ada.Characters.Handling.Is_Digit (Character'Val (ch)) then + skip := ctoi (Code_To_Char (ch)); + elsif ch = CTRL ('L') then + Touch; + Touch (Current_Window); + Refresh; + elsif Has_Colors then + case ch is + -- Note the mathematical elegance compared to the C version. + when Character'Pos ('f') => fg := (fg + 1) mod nc; + when Character'Pos ('F') => fg := (fg - 1) mod nc; + when Character'Pos ('b') => bg := (bg + 1) mod nc; + when Character'Pos ('B') => bg := (bg - 1) mod nc; + when others => + result := False; + end case; + else + result := False; + end if; + end attr_getc; + + -- pairs could be defined as array ( Color_Number(0) .. colors - 1) of + -- array (Color_Number(0).. colors - 1) of Boolean; + pairs : array (Color_Pair'Range) of Boolean := (others => False); + fg, bg : Color_Number := Black; -- = 0; + xmc : constant Integer := Get_Number ("xmc"); + skip : Integer := xmc; + n : Integer; + + use Int_IO; + +begin + pairs (0) := True; + + if skip < 0 then + skip := 0; + end if; + n := skip; + + loop + declare + row : Line_Position := 2; + normal : Attributed_Character := Blank2; + -- ??? + begin + -- row := 2; -- weird, row is set to 0 without this. + -- TODO delete the above line, it was a gdb quirk that confused me + if Has_Colors then + declare pair : constant Color_Pair := + Color_Pair (fg * Color_Number (Number_Of_Colors) + bg); + begin + -- Go though each color pair. Assume that the number of + -- Redefinable_Color_Pairs is 8*8 with predefined Colors 0..7 + if not pairs (pair) then + Init_Pair (pair, fg, bg); + pairs (pair) := True; + end if; + normal.Color := pair; + end; + end if; + Set_Background (Ch => normal); + Erase; + + Add (Line => 0, Column => 20, + Str => "Character attribute test display"); + + row := show_attr (row, n, (Stand_Out => True, others => False), + "STANDOUT", True); + row := show_attr (row, n, (Reverse_Video => True, others => False), + "REVERSE", True); + row := show_attr (row, n, (Bold_Character => True, others => False), + "BOLD", True); + row := show_attr (row, n, (Under_Line => True, others => False), + "UNDERLINE", True); + row := show_attr (row, n, (Dim_Character => True, others => False), + "DIM", True); + row := show_attr (row, n, (Blink => True, others => False), + "BLINK", True); +-- row := show_attr (row, n, (Protected_Character => True, +-- others => False), "PROTECT", True); + row := show_attr (row, n, (Invisible_Character => True, + others => False), "INVISIBLE", True); + row := show_attr (row, n, Normal_Video, "NORMAL", False); + + Move_Cursor (Line => row, Column => 8); + if xmc > -1 then + Add (Str => "This terminal does have the magic-cookie glitch"); + else + Add (Str => "This terminal does not have the magic-cookie glitch"); + end if; + Move_Cursor (Line => row + 1, Column => 8); + Add (Str => "Enter a digit to set gaps on each side of " & + "displayed attributes"); + Move_Cursor (Line => row + 2, Column => 8); + Add (Str => "^L = repaint"); + if Has_Colors then + declare tmp1 : String (1 .. 1); + begin + Add (Str => ". f/F/b/F toggle colors ("); + Put (tmp1, Integer (fg)); + Add (Str => tmp1); + Add (Ch => '/'); + Put (tmp1, Integer (bg)); + Add (Str => tmp1); + Add (Ch => ')'); + end; + end if; + Refresh; + end; + + declare result : Boolean; begin + attr_getc (n, fg, bg, result); + exit when not result; + end; + end loop; + + Set_Background (Ch => Blank2); + Erase; + End_Windows; +end ncurses2.attr_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-attr_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-attr_test.ads new file mode 100644 index 00000000..08931eec --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-attr_test.ads @@ -0,0 +1,43 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.3 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.attr_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-color_edit.adb b/contrib/ncurses/Ada95/samples/ncurses2-color_edit.adb new file mode 100644 index 00000000..7c30c666 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-color_edit.adb @@ -0,0 +1,260 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.7 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with ncurses2.genericPuts; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +procedure ncurses2.color_edit is + use Int_IO; + + type RGB_Enum is (Redx, Greenx, Bluex); + + procedure change_color (current : Color_Number; + field : RGB_Enum; + value : RGB_Value; + usebase : Boolean); + + procedure change_color (current : Color_Number; + field : RGB_Enum; + value : RGB_Value; + usebase : Boolean) is + red, green, blue : RGB_Value; + begin + if usebase then + Color_Content (current, red, green, blue); + else + red := 0; + green := 0; + blue := 0; + end if; + + case field is + when Redx => red := red + value; + when Greenx => green := green + value; + when Bluex => blue := blue + value; + end case; + + declare + begin + Init_Color (current, red, green, blue); + exception + when Curses_Exception => Beep; + end; + + end change_color; + + package x is new ncurses2.genericPuts (100); use x; + + tmpb : x.BS.Bounded_String; + + tmp4 : String (1 .. 4); + tmp6 : String (1 .. 6); + tmp8 : String (1 .. 8); + -- This would be easier if Ada had a Bounded_String + -- defined as a class instead of the inferior generic package, + -- then I could define Put, Add, and Get for them. Blech. + value : RGB_Value := 0; + red, green, blue : RGB_Value; + max_colors : constant Natural := Number_Of_Colors; + current : Color_Number := 0; + field : RGB_Enum := Redx; + this_c : Key_Code := 0; +begin + Refresh; + + for i in Color_Number'(0) .. Color_Number (Number_Of_Colors) loop + Init_Pair (Color_Pair (i), White, i); + end loop; + + Move_Cursor (Line => Lines - 2, Column => 0); + Add (Str => "Number: "); + myPut (tmpb, Integer (value)); + myAdd (Str => tmpb); + + loop + + Switch_Character_Attribute (On => False, + Attr => (Bold_Character => True, + others => False)); + Add (Line => 0, Column => 20, Str => "Color RGB Value Editing"); + + Switch_Character_Attribute (On => False, + Attr => (Bold_Character => True, + others => False)); + + for i in Color_Number'(0) .. Color_Number (Number_Of_Colors) loop + Move_Cursor (Line => 2 + Line_Position (i), Column => 0); + if current = i then + Add (Ch => '>'); + else + Add (Ch => ' '); + end if; + -- TODO if i <= color_names'Max then + Put (tmp8, Integer (i)); + Set_Character_Attributes (Color => Color_Pair (i)); + Add (Str => " "); + Set_Character_Attributes; + + Refresh; + + Color_Content (i, red, green, blue); + Add (Str => " R = "); + if current = i and field = Redx then + Switch_Character_Attribute (On => True, + Attr => (Stand_Out => True, + others => False)); + end if; + Put (tmp4, Integer (red)); + Add (Str => tmp4); + if current = i and field = Redx then + Set_Character_Attributes; + end if; + Add (Str => " G = "); + if current = i and field = Greenx then + Switch_Character_Attribute (On => True, + Attr => (Stand_Out => True, + others => False)); + end if; + Put (tmp4, Integer (green)); + Add (Str => tmp4); + if current = i and field = Greenx then + Set_Character_Attributes; + end if; + Add (Str => " B = "); + if current = i and field = Bluex then + Switch_Character_Attribute (On => True, + Attr => (Stand_Out => True, + others => False)); + end if; + Put (tmp4, Integer (blue)); + Add (Str => tmp4); + if current = i and field = Bluex then + Set_Character_Attributes; + end if; + Set_Character_Attributes; + Add (Ch => ')'); + end loop; + Add (Line => Line_Position (Number_Of_Colors + 3), Column => 0, + Str => "Use up/down to select a color, left/right to change " & + "fields."); + Add (Line => Line_Position (Number_Of_Colors + 4), Column => 0, + Str => "Modify field by typing nnn=, nnn-, or nnn+. ? for help."); + + Move_Cursor (Line => 2 + Line_Position (current), Column => 0); + + this_c := Getchar; + if Is_Digit (this_c) then + value := 0; + end if; + + case this_c is + when KEY_UP => + current := (current - 1) mod Color_Number (max_colors); + when KEY_DOWN => + current := (current + 1) mod Color_Number (max_colors); + when KEY_RIGHT => + field := RGB_Enum'Val ((RGB_Enum'Pos (field) + 1) mod 3); + when KEY_LEFT => + field := RGB_Enum'Val ((RGB_Enum'Pos (field) - 1) mod 3); + when + Character'Pos ('0') | + Character'Pos ('1') | + Character'Pos ('2') | + Character'Pos ('3') | + Character'Pos ('4') | + Character'Pos ('5') | + Character'Pos ('6') | + Character'Pos ('7') | + Character'Pos ('8') | + Character'Pos ('9') => + value := value * 10 + RGB_Value (ctoi (Code_To_Char (this_c))); + + when Character'Pos ('+') => + change_color (current, field, value, True); + + when Character'Pos ('-') => + change_color (current, field, -value, True); + + when Character'Pos ('=') => + change_color (current, field, value, False); + + when Character'Pos ('?') => + Erase; + P (" RGB Value Editing Help"); + P (""); + P ("You are in the RGB value editor. Use the arrow keys to " & + "select one of"); + P ("the fields in one of the RGB triples of the current colors;" & + " the one"); + P ("currently selected will be reverse-video highlighted."); + P (""); + P ("To change a field, enter the digits of the new value; they" & + " are echoed"); + P ("as entered. Finish by typing `='. The change will take" & + " effect instantly."); + P ("To increment or decrement a value, use the same procedure," & + " but finish"); + P ("with a `+' or `-'."); + P (""); + P ("To quit, do `x' or 'q'"); + + Pause; + Erase; + when Character'Pos ('q') | + Character'Pos ('x') => + null; + when others => + Beep; + end case; + Move_Cursor (Line => Lines - 2, Column => 0); + Put (tmp6, Integer (value)); + Add (Str => "Number: " & tmp6); + + Clear_To_End_Of_Line; + exit when this_c = Character'Pos ('x') or + this_c = Character'Pos ('q'); + end loop; + + Erase; + End_Windows; +end ncurses2.color_edit; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-color_edit.ads b/contrib/ncurses/Ada95/samples/ncurses2-color_edit.ads new file mode 100644 index 00000000..a44889b2 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-color_edit.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.color_edit; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-color_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-color_test.adb new file mode 100644 index 00000000..ca35e04a --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-color_test.adb @@ -0,0 +1,164 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.4 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; + +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Ada.Strings.Fixed; + +procedure ncurses2.color_test is + use Int_IO; + + procedure show_color_name (y, x : Integer; color : Integer); + + color_names : constant array (0 .. 15) of String (1 .. 7) := + ( + "black ", + "red ", + "green ", + "yellow ", + "blue ", + "magenta", + "cyan ", + "white ", + "BLACK ", + "RED ", + "GREEN ", + "YELLOW ", + "BLUE ", + "MAGENTA", + "CYAN ", + "WHITE " + ); + + procedure show_color_name (y, x : Integer; color : Integer) is + tmp5 : String (1 .. 5); + begin + if Number_Of_Colors > 8 then + + Put (tmp5, color); + Add (Line => Line_Position (y), Column => Column_Position (x), + Str => tmp5); + else + Add (Line => Line_Position (y), Column => Column_Position (x), + Str => color_names (color)); + end if; + end show_color_name; + + top, width : Integer; + hello : String (1 .. 5); + -- tmp3 : String (1 .. 3); + -- tmp2 : String (1 .. 2); + +begin + Refresh; + Add (Str => "There are "); + -- Put(tmp3, Number_Of_Colors*Number_Of_Colors); + Add (Str => Ada.Strings.Fixed.Trim (Integer'Image (Number_Of_Colors * + Number_Of_Colors), + Ada.Strings.Left)); + Add (Str => " color pairs"); + Add (Ch => newl); + + if Number_Of_Colors > 8 then + width := 4; + else + width := 8; + end if; + + if Number_Of_Colors > 8 then + hello := "Test "; + else + hello := "Hello"; + end if; + + for Bright in Boolean loop + if Number_Of_Colors > 8 then + top := 0; + else + top := Boolean'Pos (Bright) * (Number_Of_Colors + 3); + end if; + Clear_To_End_Of_Screen; + Move_Cursor (Line => Line_Position (top) + 1, Column => 0); + -- Put(tmp2, Number_Of_Colors); + Add (Str => Ada.Strings.Fixed.Trim (Integer'Image (Number_Of_Colors), + Ada.Strings.Left)); + Add (Ch => 'x'); + Add (Str => Ada.Strings.Fixed.Trim (Integer'Image (Number_Of_Colors), + Ada.Strings.Left)); + Add (Str => " matrix of foreground/background colors, bright *"); + if Bright then + Add (Str => "on"); + else + Add (Str => "off"); + end if; + Add (Ch => '*'); + + for i in 0 .. Number_Of_Colors - 1 loop + show_color_name (top + 2, (i + 1) * width, i); + end loop; + for i in 0 .. Number_Of_Colors - 1 loop + show_color_name (top + 3 + i, 0, i); + end loop; + for i in 1 .. Number_Of_Color_Pairs - 1 loop + Init_Pair (Color_Pair (i), Color_Number (i mod Number_Of_Colors), + Color_Number (i / Number_Of_Colors)); + -- attron((attr_t) COLOR_PAIR(i)) -- Huh? + Set_Color (Pair => Color_Pair (i)); + if Bright then + Switch_Character_Attribute (Attr => (Bold_Character => True, + others => False)); + end if; + Add (Line => Line_Position (top + 3 + (i / Number_Of_Colors)), + Column => Column_Position ((i mod Number_Of_Colors + 1) * + width), + Str => hello); + Set_Character_Attributes; + end loop; + if Number_Of_Colors > 8 or Bright then + Pause; + end if; + end loop; + + Erase; + End_Windows; +end ncurses2.color_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-color_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-color_test.ads new file mode 100644 index 00000000..e927fdd6 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-color_test.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.color_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-demo_forms.adb b/contrib/ncurses/Ada95/samples/ncurses2-demo_forms.adb new file mode 100644 index 00000000..b2d72ba4 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-demo_forms.adb @@ -0,0 +1,499 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 2000-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.9 $ +-- $Date: 2021/09/04 10:52:55 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms; +with Terminal_Interface.Curses.Forms.Field_User_Data; +with Ada.Characters.Handling; +with Ada.Strings; +with Ada.Strings.Bounded; + +procedure ncurses2.demo_forms is + package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (80); + + type myptr is access Integer; + + -- The C version stores a pointer in the userptr and + -- converts it into a long integer. + -- The correct, but inconvenient way to do it is to use a + -- pointer to long and keep the pointer constant. + -- It just adds one memory piece to allocate and deallocate (not done here) + + package StringData is new + Terminal_Interface.Curses.Forms.Field_User_Data (Integer, myptr); + + function edit_secure (me : Field; c_in : Key_Code) return Key_Code; + function form_virtualize (f : Form; w : Window) return Key_Code; + function my_form_driver (f : Form; c : Key_Code) return Boolean; + function make_label (frow : Line_Position; + fcol : Column_Position; + label : String) return Field; + function make_field (frow : Line_Position; + fcol : Column_Position; + rows : Line_Count; + cols : Column_Count; + secure : Boolean) return Field; + procedure display_form (f : Form); + procedure erase_form (f : Form); + + -- prints '*' instead of characters. + -- Not that this keeps a bug from the C version: + -- type in the psasword field then move off and back. + -- the cursor is at position one, but + -- this assumes it as at the end so text gets appended instead + -- of overwtitting. + function edit_secure (me : Field; c_in : Key_Code) return Key_Code is + rows, frow : Line_Position; + nrow : Natural; + cols, fcol : Column_Position; + nbuf : Buffer_Number; + c : Key_Code := c_in; + c2 : Character; + + use StringData; + begin + Info (me, rows, cols, frow, fcol, nrow, nbuf); + -- TODO if result = Form_Ok and nbuf > 0 then + -- C version checked the return value + -- of Info, the Ada binding throws an exception I think. + if nbuf > 0 then + declare + temp : BS.Bounded_String; + temps : String (1 .. 10); + -- TODO Get_Buffer povides no information on the field length? + len : myptr; + begin + Get_Buffer (me, 1, Str => temps); + -- strcpy(temp, field_buffer(me, 1)); + Get_User_Data (me, len); + temp := BS.To_Bounded_String (temps (1 .. len.all)); + if c <= Key_Max then + c2 := Code_To_Char (c); + if Ada.Characters.Handling.Is_Graphic (c2) then + BS.Append (temp, c2); + len.all := len.all + 1; + Set_Buffer (me, 1, BS.To_String (temp)); + c := Character'Pos ('*'); + else + c := 0; + end if; + else + case c is + when REQ_BEG_FIELD | + REQ_CLR_EOF | + REQ_CLR_EOL | + REQ_DEL_LINE | + REQ_DEL_WORD | + REQ_DOWN_CHAR | + REQ_END_FIELD | + REQ_INS_CHAR | + REQ_INS_LINE | + REQ_LEFT_CHAR | + REQ_NEW_LINE | + REQ_NEXT_WORD | + REQ_PREV_WORD | + REQ_RIGHT_CHAR | + REQ_UP_CHAR => + c := 0; -- we don't want to do inline editing + when REQ_CLR_FIELD => + if len.all /= 0 then + temp := BS.To_Bounded_String (""); + Set_Buffer (me, 1, BS.To_String (temp)); + len.all := 0; + end if; + + when REQ_DEL_CHAR | + REQ_DEL_PREV => + if len.all /= 0 then + BS.Delete (temp, BS.Length (temp), BS.Length (temp)); + Set_Buffer (me, 1, BS.To_String (temp)); + len.all := len.all - 1; + end if; + when others => null; + end case; + end if; + end; + end if; + return c; + end edit_secure; + + mode : Key_Code := REQ_INS_MODE; + + function form_virtualize (f : Form; w : Window) return Key_Code is + type lookup_t is record + code : Key_Code; + result : Key_Code; + -- should be Form_Request_Code, but we need MAX_COMMAND + 1 + end record; + + lookup : constant array (Positive range <>) of lookup_t := + ( + ( + Character'Pos ('A') mod 16#20#, REQ_NEXT_CHOICE + ), + ( + Character'Pos ('B') mod 16#20#, REQ_PREV_WORD + ), + ( + Character'Pos ('C') mod 16#20#, REQ_CLR_EOL + ), + ( + Character'Pos ('D') mod 16#20#, REQ_DOWN_FIELD + ), + ( + Character'Pos ('E') mod 16#20#, REQ_END_FIELD + ), + ( + Character'Pos ('F') mod 16#20#, REQ_NEXT_PAGE + ), + ( + Character'Pos ('G') mod 16#20#, REQ_DEL_WORD + ), + ( + Character'Pos ('H') mod 16#20#, REQ_DEL_PREV + ), + ( + Character'Pos ('I') mod 16#20#, REQ_INS_CHAR + ), + ( + Character'Pos ('K') mod 16#20#, REQ_CLR_EOF + ), + ( + Character'Pos ('L') mod 16#20#, REQ_LEFT_FIELD + ), + ( + Character'Pos ('M') mod 16#20#, REQ_NEW_LINE + ), + ( + Character'Pos ('N') mod 16#20#, REQ_NEXT_FIELD + ), + ( + Character'Pos ('O') mod 16#20#, REQ_INS_LINE + ), + ( + Character'Pos ('P') mod 16#20#, REQ_PREV_FIELD + ), + ( + Character'Pos ('R') mod 16#20#, REQ_RIGHT_FIELD + ), + ( + Character'Pos ('S') mod 16#20#, REQ_BEG_FIELD + ), + ( + Character'Pos ('U') mod 16#20#, REQ_UP_FIELD + ), + ( + Character'Pos ('V') mod 16#20#, REQ_DEL_CHAR + ), + ( + Character'Pos ('W') mod 16#20#, REQ_NEXT_WORD + ), + ( + Character'Pos ('X') mod 16#20#, REQ_CLR_FIELD + ), + ( + Character'Pos ('Y') mod 16#20#, REQ_DEL_LINE + ), + ( + Character'Pos ('Z') mod 16#20#, REQ_PREV_CHOICE + ), + ( + Character'Pos ('[') mod 16#20#, -- ESCAPE + Form_Request_Code'Last + 1 + ), + ( + Key_Backspace, REQ_DEL_PREV + ), + ( + KEY_DOWN, REQ_DOWN_CHAR + ), + ( + Key_End, REQ_LAST_FIELD + ), + ( + Key_Home, REQ_FIRST_FIELD + ), + ( + KEY_LEFT, REQ_LEFT_CHAR + ), + ( + KEY_LL, REQ_LAST_FIELD + ), + ( + Key_Next, REQ_NEXT_FIELD + ), + ( + KEY_NPAGE, REQ_NEXT_PAGE + ), + ( + KEY_PPAGE, REQ_PREV_PAGE + ), + ( + Key_Previous, REQ_PREV_FIELD + ), + ( + KEY_RIGHT, REQ_RIGHT_CHAR + ), + ( + KEY_UP, REQ_UP_CHAR + ), + ( + Character'Pos ('Q') mod 16#20#, -- QUIT + Form_Request_Code'Last + 1 -- TODO MAX_FORM_COMMAND + 1 + ) + ); + + c : Key_Code := Getchar (w); + me : constant Field := Current (f); + + begin + if c = Character'Pos (']') mod 16#20# then + if mode = REQ_INS_MODE then + mode := REQ_OVL_MODE; + else + mode := REQ_INS_MODE; + end if; + c := mode; + else + for n in lookup'Range loop + if lookup (n).code = c then + c := lookup (n).result; + exit; + end if; + end loop; + end if; + + -- Force the field that the user is typing into to be in reverse video, + -- while the other fields are shown underlined. + if c <= Key_Max then + c := edit_secure (me, c); + Set_Background (me, (Reverse_Video => True, others => False)); + elsif c <= Form_Request_Code'Last then + c := edit_secure (me, c); + Set_Background (me, (Under_Line => True, others => False)); + end if; + return c; + end form_virtualize; + + function my_form_driver (f : Form; c : Key_Code) return Boolean is + flag : constant Driver_Result := Driver (f, F_Validate_Field); + begin + if c = Form_Request_Code'Last + 1 and + flag = Form_Ok + then + return True; + else + Beep; + return False; + end if; + end my_form_driver; + + function make_label (frow : Line_Position; + fcol : Column_Position; + label : String) return Field is + f : constant Field := Create (1, label'Length, frow, fcol, 0, 0); + o : Field_Option_Set := Get_Options (f); + begin + if f /= Null_Field then + Set_Buffer (f, 0, label); + o.Active := False; + Set_Options (f, o); + end if; + return f; + end make_label; + + function make_field (frow : Line_Position; + fcol : Column_Position; + rows : Line_Count; + cols : Column_Count; + secure : Boolean) return Field is + f : Field; + use StringData; + len : myptr; + begin + if secure then + f := Create (rows, cols, frow, fcol, 0, 1); + else + f := Create (rows, cols, frow, fcol, 0, 0); + end if; + + if f /= Null_Field then + Set_Background (f, (Under_Line => True, others => False)); + len := new Integer; + len.all := 0; + Set_User_Data (f, len); + end if; + return f; + end make_field; + + procedure display_form (f : Form) is + w : Window; + rows : Line_Count; + cols : Column_Count; + begin + Scale (f, rows, cols); + + w := New_Window (rows + 2, cols + 4, 0, 0); + if w /= Null_Window then + Set_Window (f, w); + Set_Sub_Window (f, Derived_Window (w, rows, cols, 1, 2)); + Box (w); -- 0,0 + Set_KeyPad_Mode (w, True); + end if; + + -- TODO if Post(f) /= Form_Ok then it is a procedure + declare + begin + Post (f); + exception + when + Eti_System_Error | + Eti_Bad_Argument | + Eti_Posted | + Eti_Connected | + Eti_Bad_State | + Eti_No_Room | + Eti_Not_Posted | + Eti_Unknown_Command | + Eti_No_Match | + Eti_Not_Selectable | + Eti_Not_Connected | + Eti_Request_Denied | + Eti_Invalid_Field | + Eti_Current => + Refresh (w); + end; + -- end if; + end display_form; + + procedure erase_form (f : Form) is + w : Window := Get_Window (f); + s : Window := Get_Sub_Window (f); + begin + Post (f, False); + Erase (w); + Refresh (w); + Delete (s); + Delete (w); + end erase_form; + + finished : Boolean := False; + f : constant Field_Array_Access := new Field_Array (1 .. 12); + secure : Field; + myform : Form; + w : Window; + c : Key_Code; + result : Driver_Result; +begin + Move_Cursor (Line => 18, Column => 0); + Add (Str => "Defined form-traversal keys: ^Q/ESC- exit form"); + Add (Ch => newl); + Add (Str => "^N -- go to next field ^P -- go to previous field"); + Add (Ch => newl); + Add (Str => "Home -- go to first field End -- go to last field"); + Add (Ch => newl); + Add (Str => "^L -- go to field to left ^R -- go to field to right"); + Add (Ch => newl); + Add (Str => "^U -- move upward to field ^D -- move downward to field"); + Add (Ch => newl); + Add (Str => "^W -- go to next word ^B -- go to previous word"); + Add (Ch => newl); + Add (Str => "^S -- go to start of field ^E -- go to end of field"); + Add (Ch => newl); + Add (Str => "^H -- delete previous char ^Y -- delete line"); + Add (Ch => newl); + Add (Str => "^G -- delete current word ^C -- clear to end of line"); + Add (Ch => newl); + Add (Str => "^K -- clear to end of field ^X -- clear field"); + Add (Ch => newl); + Add (Str => "Arrow keys move within a field as you would expect."); + + Add (Line => 4, Column => 57, Str => "Forms Entry Test"); + + Refresh; + + -- describe the form + f.all (1) := make_label (0, 15, "Sample Form"); + f.all (2) := make_label (2, 0, "Last Name"); + f.all (3) := make_field (3, 0, 1, 18, False); + f.all (4) := make_label (2, 20, "First Name"); + f.all (5) := make_field (3, 20, 1, 12, False); + f.all (6) := make_label (2, 34, "Middle Name"); + f.all (7) := make_field (3, 34, 1, 12, False); + f.all (8) := make_label (5, 0, "Comments"); + f.all (9) := make_field (6, 0, 4, 46, False); + f.all (10) := make_label (5, 20, "Password:"); + f.all (11) := make_field (5, 30, 1, 9, True); + secure := f.all (11); + f.all (12) := Null_Field; + + myform := New_Form (f); + + display_form (myform); + + w := Get_Window (myform); + Set_Raw_Mode (SwitchOn => True); + Set_NL_Mode (SwitchOn => True); -- lets us read ^M's + while not finished loop + c := form_virtualize (myform, w); + result := Driver (myform, c); + case result is + when Form_Ok => + Add (Line => 5, Column => 57, Str => Get_Buffer (secure, 1)); + Clear_To_End_Of_Line; + Refresh; + when Unknown_Request => + finished := my_form_driver (myform, c); + when others => + Beep; + end case; + end loop; + + erase_form (myform); + + -- TODO Free_Form(myform); + -- for (c = 0; f[c] != 0; c++) free_field(f[c]); + Set_Raw_Mode (SwitchOn => False); + Set_NL_Mode (SwitchOn => True); + +end ncurses2.demo_forms; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-demo_forms.ads b/contrib/ncurses/Ada95/samples/ncurses2-demo_forms.ads new file mode 100644 index 00000000..775e7771 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-demo_forms.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.demo_forms; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-demo_pad.adb b/contrib/ncurses/Ada95/samples/ncurses2-demo_pad.adb new file mode 100644 index 00000000..86bfb2d6 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-demo_pad.adb @@ -0,0 +1,678 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.11 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; + +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +with Interfaces.C; +with System.Storage_Elements; +with System.Address_To_Access_Conversions; + +with Ada.Text_IO; +-- with Ada.Real_Time; use Ada.Real_Time; +-- TODO is there a way to use Real_Time or Ada.Calendar in place of +-- gettimeofday? + +-- Demonstrate pads. +procedure ncurses2.demo_pad is + + type timestruct is record + seconds : Integer; + microseconds : Integer; + end record; + + type myfunc is access function (w : Window) return Key_Code; + + function gettime return timestruct; + procedure do_h_line (y : Line_Position; + x : Column_Position; + c : Attributed_Character; + to : Column_Position); + procedure do_v_line (y : Line_Position; + x : Column_Position; + c : Attributed_Character; + to : Line_Position); + function padgetch (win : Window) return Key_Code; + function panner_legend (line : Line_Position) return Boolean; + procedure panner_legend (line : Line_Position); + procedure panner_h_cleanup (from_y : Line_Position; + from_x : Column_Position; + to_x : Column_Position); + procedure panner_v_cleanup (from_y : Line_Position; + from_x : Column_Position; + to_y : Line_Position); + procedure panner (pad : Window; + top_xp : Column_Position; + top_yp : Line_Position; + portyp : Line_Position; + portxp : Column_Position; + pgetc : myfunc); + + function gettime return timestruct is + + retval : timestruct; + + use Interfaces.C; + type timeval is record + tv_sec : long; + tv_usec : long; + end record; + pragma Convention (C, timeval); + + -- TODO function from_timeval is new Ada.Unchecked_Conversion( + -- timeval_a, System.Storage_Elements.Integer_Address); + -- should Interfaces.C.Pointers be used here? + + package myP is new System.Address_To_Access_Conversions (timeval); + use myP; + + t : constant Object_Pointer := new timeval; + + function gettimeofday + (TP : System.Storage_Elements.Integer_Address; + TZP : System.Storage_Elements.Integer_Address) return int; + pragma Import (C, gettimeofday, "gettimeofday"); + tmp : int; + begin + tmp := gettimeofday (System.Storage_Elements.To_Integer + (myP.To_Address (t)), + System.Storage_Elements.To_Integer + (myP.To_Address (null))); + if tmp < 0 then + retval.seconds := 0; + retval.microseconds := 0; + else + retval.seconds := Integer (t.all.tv_sec); + retval.microseconds := Integer (t.all.tv_usec); + end if; + return retval; + end gettime; + + -- in C, The behavior of mvhline, mvvline for negative/zero length is + -- unspecified, though we can rely on negative x/y values to stop the + -- macro. Except Ada makes Line_Position(-1) = Natural - 1 so forget it. + procedure do_h_line (y : Line_Position; + x : Column_Position; + c : Attributed_Character; + to : Column_Position) is + begin + if to > x then + Move_Cursor (Line => y, Column => x); + Horizontal_Line (Line_Size => Natural (to - x), Line_Symbol => c); + end if; + end do_h_line; + + procedure do_v_line (y : Line_Position; + x : Column_Position; + c : Attributed_Character; + to : Line_Position) is + begin + if to > y then + Move_Cursor (Line => y, Column => x); + Vertical_Line (Line_Size => Natural (to - y), Line_Symbol => c); + end if; + end do_v_line; + + function padgetch (win : Window) return Key_Code is + c : Key_Code; + c2 : Character; + begin + c := Getchar (win); + c2 := Code_To_Char (c); + + case c2 is + when '!' => + ShellOut (False); + return Key_Refresh; + when Character'Val (Character'Pos ('r') mod 16#20#) => -- CTRL('r') + End_Windows; + Refresh; + return Key_Refresh; + when Character'Val (Character'Pos ('l') mod 16#20#) => -- CTRL('l') + return Key_Refresh; + when 'U' => + return Key_Cursor_Up; + when 'D' => + return Key_Cursor_Down; + when 'R' => + return Key_Cursor_Right; + when 'L' => + return Key_Cursor_Left; + when '+' => + return Key_Insert_Line; + when '-' => + return Key_Delete_Line; + when '>' => + return Key_Insert_Char; + when '<' => + return Key_Delete_Char; + -- when ERR=> /* FALLTHRU */ + when 'q' => + return (Key_Exit); + when others => + return (c); + end case; + end padgetch; + + show_panner_legend : Boolean := True; + + function panner_legend (line : Line_Position) return Boolean is + legend : constant array (0 .. 3) of String (1 .. 61) := + ( + "Use arrow keys (or U,D,L,R) to pan, q to quit (?,t,s flags) ", + "Use ! to shell-out. Toggle legend:?, timer:t, scroll mark:s.", + "Use +,- (or j,k) to grow/shrink the panner vertically. ", + "Use <,> (or h,l) to grow/shrink the panner horizontally. "); + legendsize : constant := 4; + + n : constant Integer := legendsize - Integer (Lines - line); + begin + if line < Lines and n >= 0 then + Move_Cursor (Line => line, Column => 0); + if show_panner_legend then + Add (Str => legend (n)); + end if; + Clear_To_End_Of_Line; + return show_panner_legend; + end if; + return False; + end panner_legend; + + procedure panner_legend (line : Line_Position) is + begin + if not panner_legend (line) then + Beep; + end if; + end panner_legend; + + procedure panner_h_cleanup (from_y : Line_Position; + from_x : Column_Position; + to_x : Column_Position) is + begin + if not panner_legend (from_y) then + do_h_line (from_y, from_x, Blank2, to_x); + end if; + end panner_h_cleanup; + + procedure panner_v_cleanup (from_y : Line_Position; + from_x : Column_Position; + to_y : Line_Position) is + begin + if not panner_legend (from_y) then + do_v_line (from_y, from_x, Blank2, to_y); + end if; + end panner_v_cleanup; + + procedure panner (pad : Window; + top_xp : Column_Position; + top_yp : Line_Position; + portyp : Line_Position; + portxp : Column_Position; + pgetc : myfunc) is + + function f (y : Line_Position) return Line_Position; + function f (x : Column_Position) return Column_Position; + function greater (y1, y2 : Line_Position) return Integer; + function greater (x1, x2 : Column_Position) return Integer; + + top_x : Column_Position := top_xp; + top_y : Line_Position := top_yp; + porty : Line_Position := portyp; + portx : Column_Position := portxp; + + -- f[x] returns max[x - 1, 0] + function f (y : Line_Position) return Line_Position is + begin + if y > 0 then + return y - 1; + else + return y; -- 0 + end if; + end f; + + function f (x : Column_Position) return Column_Position is + begin + if x > 0 then + return x - 1; + else + return x; -- 0 + end if; + end f; + + function greater (y1, y2 : Line_Position) return Integer is + begin + if y1 > y2 then + return 1; + else + return 0; + end if; + end greater; + + function greater (x1, x2 : Column_Position) return Integer is + begin + if x1 > x2 then + return 1; + else + return 0; + end if; + end greater; + + pymax : Line_Position; + basey : Line_Position := 0; + pxmax : Column_Position; + basex : Column_Position := 0; + c : Key_Code; + scrollers : Boolean := True; + before, after : timestruct; + timing : Boolean := True; + + package floatio is new Ada.Text_IO.Float_IO (Long_Float); + begin + Get_Size (pad, pymax, pxmax); + Allow_Scrolling (Mode => False); -- we don't want stdscr to scroll! + + c := Key_Refresh; + loop + -- During shell-out, the user may have resized the window. Adjust + -- the port size of the pad to accommodate this. Ncurses + -- automatically resizes all of the normal windows to fit on the + -- new screen. + if top_x > Columns then + top_x := Columns; + end if; + if portx > Columns then + portx := Columns; + end if; + if top_y > Lines then + top_y := Lines; + end if; + if porty > Lines then + porty := Lines; + end if; + + case c is + when Key_Refresh | Character'Pos ('?') => + if c = Key_Refresh then + Erase; + else -- '?' + show_panner_legend := not show_panner_legend; + end if; + panner_legend (Lines - 4); + panner_legend (Lines - 3); + panner_legend (Lines - 2); + panner_legend (Lines - 1); + when Character'Pos ('t') => + timing := not timing; + if not timing then + panner_legend (Lines - 1); + end if; + when Character'Pos ('s') => + scrollers := not scrollers; + + -- Move the top-left corner of the pad, keeping the + -- bottom-right corner fixed. + when Character'Pos ('h') => + -- increase-columns: move left edge to left + if top_x = 0 then + Beep; + else + panner_v_cleanup (top_y, top_x, porty); + top_x := top_x - 1; + end if; + + when Character'Pos ('j') => + -- decrease-lines: move top-edge down + if top_y >= porty then + Beep; + else + if top_y /= 0 then + panner_h_cleanup (top_y - 1, f (top_x), portx); + end if; + top_y := top_y + 1; + end if; + when Character'Pos ('k') => + -- increase-lines: move top-edge up + if top_y = 0 then + Beep; + else + top_y := top_y - 1; + panner_h_cleanup (top_y, top_x, portx); + end if; + + when Character'Pos ('l') => + -- decrease-columns: move left-edge to right + if top_x >= portx then + Beep; + else + if top_x /= 0 then + panner_v_cleanup (f (top_y), top_x - 1, porty); + end if; + top_x := top_x + 1; + end if; + + -- Move the bottom-right corner of the pad, keeping the + -- top-left corner fixed. + when Key_Insert_Char => + -- increase-columns: move right-edge to right + if portx >= pxmax or portx >= Columns then + Beep; + else + panner_v_cleanup (f (top_y), portx - 1, porty); + portx := portx + 1; + -- C had ++portx instead of portx++, weird. + end if; + when Key_Insert_Line => + -- increase-lines: move bottom-edge down + if porty >= pymax or porty >= Lines then + Beep; + else + panner_h_cleanup (porty - 1, f (top_x), portx); + porty := porty + 1; + end if; + + when Key_Delete_Char => + -- decrease-columns: move bottom edge up + if portx <= top_x then + Beep; + else + portx := portx - 1; + panner_v_cleanup (f (top_y), portx, porty); + end if; + + when Key_Delete_Line => + -- decrease-lines + if porty <= top_y then + Beep; + else + porty := porty - 1; + panner_h_cleanup (porty, f (top_x), portx); + end if; + when Key_Cursor_Left => + -- pan leftwards + if basex > 0 then + basex := basex - 1; + else + Beep; + end if; + when Key_Cursor_Right => + -- pan rightwards + -- if (basex + portx - (pymax > porty) < pxmax) + if basex + portx - + Column_Position (greater (pymax, porty)) < pxmax + then + -- if basex + portx < pxmax or + -- (pymax > porty and basex + portx - 1 < pxmax) then + basex := basex + 1; + else + Beep; + end if; + + when Key_Cursor_Up => + -- pan upwards + if basey > 0 then + basey := basey - 1; + else + Beep; + end if; + + when Key_Cursor_Down => + -- pan downwards + -- same as if (basey + porty - (pxmax > portx) < pymax) + if basey + porty - + Line_Position (greater (pxmax, portx)) < pymax + then + -- if (basey + porty < pymax) or + -- (pxmax > portx and basey + porty - 1 < pymax) then + basey := basey + 1; + else + Beep; + end if; + + when Character'Pos ('H') | + Key_Home | + Key_Find => + basey := 0; + + when Character'Pos ('E') | + Key_End | + Key_Select => + if pymax < porty then + basey := 0; + else + basey := pymax - porty; + end if; + + when others => + Beep; + end case; + + -- more writing off the screen. + -- Interestingly, the exception is not handled if + -- we put a block around this. + -- declare --begin + if top_y /= 0 and top_x /= 0 then + Add (Line => top_y - 1, Column => top_x - 1, + Ch => ACS_Map (ACS_Upper_Left_Corner)); + end if; + if top_x /= 0 then + do_v_line (top_y, top_x - 1, ACS_Map (ACS_Vertical_Line), porty); + end if; + if top_y /= 0 then + do_h_line (top_y - 1, top_x, ACS_Map (ACS_Horizontal_Line), portx); + end if; + -- exception when Curses_Exception => null; end; + + -- in C was ... pxmax > portx - 1 + if scrollers and pxmax >= portx then + declare + length : constant Column_Position := portx - top_x - 1; + lowend, highend : Column_Position; + begin + -- Instead of using floats, I'll use integers only. + lowend := top_x + (basex * length) / pxmax; + highend := top_x + ((basex + length) * length) / pxmax; + + do_h_line (porty - 1, top_x, ACS_Map (ACS_Horizontal_Line), + lowend); + if highend < portx then + Switch_Character_Attribute + (Attr => (Reverse_Video => True, others => False), + On => True); + do_h_line (porty - 1, lowend, Blank2, highend + 1); + Switch_Character_Attribute + (Attr => (Reverse_Video => True, others => False), + On => False); + do_h_line (porty - 1, highend + 1, + ACS_Map (ACS_Horizontal_Line), portx); + end if; + end; + else + do_h_line (porty - 1, top_x, ACS_Map (ACS_Horizontal_Line), portx); + end if; + + if scrollers and pymax >= porty then + declare + length : constant Line_Position := porty - top_y - 1; + lowend, highend : Line_Position; + begin + lowend := top_y + (basey * length) / pymax; + highend := top_y + ((basey + length) * length) / pymax; + + do_v_line (top_y, portx - 1, ACS_Map (ACS_Vertical_Line), + lowend); + if highend < porty then + Switch_Character_Attribute + (Attr => (Reverse_Video => True, others => False), + On => True); + do_v_line (lowend, portx - 1, Blank2, highend + 1); + Switch_Character_Attribute + (Attr => (Reverse_Video => True, others => False), + On => False); + do_v_line (highend + 1, portx - 1, + ACS_Map (ACS_Vertical_Line), porty); + end if; + end; + else + do_v_line (top_y, portx - 1, ACS_Map (ACS_Vertical_Line), porty); + end if; + + if top_y /= 0 then + Add (Line => top_y - 1, Column => portx - 1, + Ch => ACS_Map (ACS_Upper_Right_Corner)); + end if; + if top_x /= 0 then + Add (Line => porty - 1, Column => top_x - 1, + Ch => ACS_Map (ACS_Lower_Left_Corner)); + end if; + declare + begin + -- Here is another place where it is possible + -- to write to the corner of the screen. + Add (Line => porty - 1, Column => portx - 1, + Ch => ACS_Map (ACS_Lower_Right_Corner)); + exception + when Curses_Exception => null; + end; + + before := gettime; + + Refresh_Without_Update; + + declare + -- the C version allows the panel to have a zero height + -- which raise the exception + begin + Refresh_Without_Update + ( + pad, + basey, basex, + top_y, top_x, + porty - Line_Position (greater (pxmax, portx)) - 1, + portx - Column_Position (greater (pymax, porty)) - 1); + exception + when Curses_Exception => null; + end; + + Update_Screen; + + if timing then + declare + s : String (1 .. 7); + elapsed : Long_Float; + begin + after := gettime; + elapsed := (Long_Float (after.seconds - before.seconds) + + Long_Float (after.microseconds + - before.microseconds) + / 1.0e6); + Move_Cursor (Line => Lines - 1, Column => Columns - 20); + floatio.Put (s, elapsed, Aft => 3, Exp => 0); + Add (Str => s); + Refresh; + end; + end if; + + c := pgetc (pad); + exit when c = Key_Exit; + + end loop; + + Allow_Scrolling (Mode => True); + + end panner; + + Gridsize : constant := 3; + Gridcount : Integer := 0; + + Pad_High : constant Line_Count := 200; + Pad_Wide : constant Column_Count := 200; + panpad : Window := New_Pad (Pad_High, Pad_Wide); +begin + if panpad = Null_Window then + Cannot ("cannot create requested pad"); + return; + end if; + + for i in 0 .. Pad_High - 1 loop + for j in 0 .. Pad_Wide - 1 loop + if i mod Gridsize = 0 and j mod Gridsize = 0 then + if i = 0 or j = 0 then + Add (panpad, '+'); + else + -- depends on ASCII? + Add (panpad, + Ch => Character'Val (Character'Pos ('A') + + Gridcount mod 26)); + Gridcount := Gridcount + 1; + end if; + elsif i mod Gridsize = 0 then + Add (panpad, '-'); + elsif j mod Gridsize = 0 then + Add (panpad, '|'); + else + declare + -- handle the write to the lower right corner error + begin + Add (panpad, ' '); + exception + when Curses_Exception => null; + end; + end if; + end loop; + end loop; + panner_legend (Lines - 4); + panner_legend (Lines - 3); + panner_legend (Lines - 2); + panner_legend (Lines - 1); + + Set_KeyPad_Mode (panpad, True); + -- Make the pad (initially) narrow enough that a trace file won't wrap. + -- We'll still be able to widen it during a test, since that's required + -- for testing boundaries. + + panner (panpad, 2, 2, Lines - 5, Columns - 15, padgetch'Access); + + Delete (panpad); + End_Windows; -- Hmm, Erase after End_Windows + Erase; +end ncurses2.demo_pad; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-demo_pad.ads b/contrib/ncurses/Ada95/samples/ncurses2-demo_pad.ads new file mode 100644 index 00000000..f110632d --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-demo_pad.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.demo_pad; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-demo_panels.adb b/contrib/ncurses/Ada95/samples/ncurses2-demo_panels.adb new file mode 100644 index 00000000..aa6ca369 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-demo_panels.adb @@ -0,0 +1,382 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 2000-2008,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.9 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Panels.User_Data; + +with ncurses2.genericPuts; + +procedure ncurses2.demo_panels (nap_mseci : Integer) is + + function mkpanel (color : Color_Number; + rows : Line_Count; + cols : Column_Count; + tly : Line_Position; + tlx : Column_Position) return Panel; + procedure rmpanel (pan : in out Panel); + procedure pflush; + procedure wait_a_while (msec : Integer); + procedure saywhat (text : String); + procedure fill_panel (pan : Panel); + + nap_msec : Integer := nap_mseci; + + function mkpanel (color : Color_Number; + rows : Line_Count; + cols : Column_Count; + tly : Line_Position; + tlx : Column_Position) return Panel is + win : Window; + pan : Panel := Null_Panel; + begin + win := New_Window (rows, cols, tly, tlx); + if Null_Window /= win then + pan := New_Panel (win); + if pan = Null_Panel then + Delete (win); + elsif Has_Colors then + declare + fg, bg : Color_Number; + begin + if color = Blue then + fg := White; + else + fg := Black; + end if; + bg := color; + Init_Pair (Color_Pair (color), fg, bg); + Set_Background (win, (Ch => ' ', + Attr => Normal_Video, + Color => Color_Pair (color))); + end; + else + Set_Background (win, (Ch => ' ', + Attr => (Bold_Character => True, + others => False), + Color => Color_Pair (color))); + end if; + end if; + return pan; + end mkpanel; + + procedure rmpanel (pan : in out Panel) is + win : Window := Panel_Window (pan); + begin + Delete (pan); + Delete (win); + end rmpanel; + + procedure pflush is + begin + Update_Panels; + Update_Screen; + end pflush; + + procedure wait_a_while (msec : Integer) is + begin + -- The C version had some #ifdef blocks here + if msec = 1 then + Getchar; + else + Nap_Milli_Seconds (msec); + end if; + end wait_a_while; + + procedure saywhat (text : String) is + begin + Move_Cursor (Line => Lines - 1, Column => 0); + Clear_To_End_Of_Line; + Add (Str => text); + end saywhat; + + -- from sample-curses_demo.adb + type User_Data is new String (1 .. 2); + type User_Data_Access is access all User_Data; + package PUD is new Panels.User_Data (User_Data, User_Data_Access); + + use PUD; + + procedure fill_panel (pan : Panel) is + win : constant Window := Panel_Window (pan); + num : constant Character := Get_User_Data (pan).all (2); + tmp6 : String (1 .. 6) := "-panx-"; + maxy : Line_Count; + maxx : Column_Count; + + begin + Move_Cursor (win, 1, 1); + tmp6 (5) := num; + Add (win, Str => tmp6); + Clear_To_End_Of_Line (win); + Box (win); + Get_Size (win, maxy, maxx); + for y in 2 .. maxy - 3 loop + for x in 1 .. maxx - 3 loop + Move_Cursor (win, y, x); + Add (win, num); + end loop; + end loop; + exception + when Curses_Exception => null; + end fill_panel; + + modstr : constant array (0 .. 5) of String (1 .. 5) := + ("test ", + "TEST ", + "(**) ", + "*()* ", + "<--> ", + "LAST " + ); + + package p is new ncurses2.genericPuts (1024); + use p; + use p.BS; + -- the C version said register int y, x; + tmpb : BS.Bounded_String; + +begin + Refresh; + + for y in 0 .. Integer (Lines - 2) loop + for x in 0 .. Integer (Columns - 1) loop + myPut (tmpb, (y + x) mod 10); + myAdd (Str => tmpb); + end loop; + end loop; + for y in 0 .. 4 loop + declare + p1, p2, p3, p4, p5 : Panel; + U1 : constant User_Data_Access := new User_Data'("p1"); + U2 : constant User_Data_Access := new User_Data'("p2"); + U3 : constant User_Data_Access := new User_Data'("p3"); + U4 : constant User_Data_Access := new User_Data'("p4"); + U5 : constant User_Data_Access := new User_Data'("p5"); + + begin + p1 := mkpanel (Red, Lines / 2 - 2, Columns / 8 + 1, 0, 0); + Set_User_Data (p1, U1); + p2 := mkpanel (Green, Lines / 2 + 1, Columns / 7, Lines / 4, + Columns / 10); + Set_User_Data (p2, U2); + p3 := mkpanel (Yellow, Lines / 4, Columns / 10, Lines / 2, + Columns / 9); + Set_User_Data (p3, U3); + p4 := mkpanel (Blue, Lines / 2 - 2, Columns / 8, Lines / 2 - 2, + Columns / 3); + Set_User_Data (p4, U4); + p5 := mkpanel (Magenta, Lines / 2 - 2, Columns / 8, Lines / 2, + Columns / 2 - 2); + Set_User_Data (p5, U5); + + fill_panel (p1); + fill_panel (p2); + fill_panel (p3); + fill_panel (p4); + fill_panel (p5); + Hide (p4); + Hide (p5); + pflush; + saywhat ("press any key to continue"); + wait_a_while (nap_msec); + + saywhat ("h3 s1 s2 s4 s5; press any key to continue"); + Move (p1, 0, 0); + Hide (p3); + Show (p1); + Show (p2); + Show (p4); + Show (p5); + pflush; + wait_a_while (nap_msec); + + saywhat ("s1; press any key to continue"); + Show (p1); + pflush; + wait_a_while (nap_msec); + + saywhat ("s2; press any key to continue"); + Show (p2); + pflush; + wait_a_while (nap_msec); + + saywhat ("m2; press any key to continue"); + Move (p2, Lines / 3 + 1, Columns / 8); + pflush; + wait_a_while (nap_msec); + + saywhat ("s3;"); + Show (p3); + pflush; + wait_a_while (nap_msec); + + saywhat ("m3; press any key to continue"); + Move (p3, Lines / 4 + 1, Columns / 15); + pflush; + wait_a_while (nap_msec); + + saywhat ("b3; press any key to continue"); + Bottom (p3); + pflush; + wait_a_while (nap_msec); + + saywhat ("s4; press any key to continue"); + Show (p4); + pflush; + wait_a_while (nap_msec); + + saywhat ("s5; press any key to continue"); + Show (p5); + pflush; + wait_a_while (nap_msec); + + saywhat ("t3; press any key to continue"); + Top (p3); + pflush; + wait_a_while (nap_msec); + + saywhat ("t1; press any key to continue"); + Top (p1); + pflush; + wait_a_while (nap_msec); + + saywhat ("t2; press any key to continue"); + Top (p2); + pflush; + wait_a_while (nap_msec); + + saywhat ("t3; press any key to continue"); + Top (p3); + pflush; + wait_a_while (nap_msec); + + saywhat ("t4; press any key to continue"); + Top (p4); + pflush; + wait_a_while (nap_msec); + + for itmp in 0 .. 5 loop + declare + w4 : constant Window := Panel_Window (p4); + w5 : constant Window := Panel_Window (p5); + begin + + saywhat ("m4; press any key to continue"); + Move_Cursor (w4, Lines / 8, 1); + Add (w4, modstr (itmp)); + Move (p4, Lines / 6, Column_Position (itmp) * (Columns / 8)); + Move_Cursor (w5, Lines / 6, 1); + Add (w5, modstr (itmp)); + pflush; + wait_a_while (nap_msec); + + saywhat ("m5; press any key to continue"); + Move_Cursor (w4, Lines / 6, 1); + Add (w4, modstr (itmp)); + Move (p5, Lines / 3 - 1, (Column_Position (itmp) * 10) + 6); + Move_Cursor (w5, Lines / 8, 1); + Add (w5, modstr (itmp)); + pflush; + wait_a_while (nap_msec); + end; + end loop; + + saywhat ("m4; press any key to continue"); + Move (p4, Lines / 6, 6 * (Columns / 8)); + -- Move(p4, Lines / 6, itmp * (Columns / 8)); + pflush; + wait_a_while (nap_msec); + + saywhat ("t5; press any key to continue"); + Top (p5); + pflush; + wait_a_while (nap_msec); + + saywhat ("t2; press any key to continue"); + Top (p2); + pflush; + wait_a_while (nap_msec); + + saywhat ("t1; press any key to continue"); + Top (p1); + pflush; + wait_a_while (nap_msec); + + saywhat ("d2; press any key to continue"); + rmpanel (p2); + pflush; + wait_a_while (nap_msec); + + saywhat ("h3; press any key to continue"); + Hide (p3); + pflush; + wait_a_while (nap_msec); + + saywhat ("d1; press any key to continue"); + rmpanel (p1); + pflush; + wait_a_while (nap_msec); + + saywhat ("d4; press any key to continue"); + rmpanel (p4); + pflush; + wait_a_while (nap_msec); + + saywhat ("d5; press any key to continue"); + rmpanel (p5); + pflush; + wait_a_while (nap_msec); + if nap_msec = 1 then + exit; + else + nap_msec := 100; + end if; + + end; + end loop; + + Erase; + End_Windows; + +end ncurses2.demo_panels; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-demo_panels.ads b/contrib/ncurses/Ada95/samples/ncurses2-demo_panels.ads new file mode 100644 index 00000000..a35842de --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-demo_panels.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.demo_panels (nap_mseci : Integer); diff --git a/contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.adb new file mode 100644 index 00000000..eca47339 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.adb @@ -0,0 +1,136 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with ncurses2.util; use ncurses2.util; + +procedure ncurses2.flushinp_test (win : Window) is + + procedure Continue (win : Window); + + procedure Continue (win : Window) is + begin + Set_Echo_Mode (False); + Move_Cursor (win, 10, 1); + Add (win, 10, 1, " Press any key to continue"); + Refresh (win); + Getchar (win); + end Continue; + + h, by, sh : Line_Position; + w, bx, sw : Column_Position; + + subWin : Window; + +begin + Clear (win); + Get_Size (win, h, w); + Get_Window_Position (win, by, bx); + sw := w / 3; + sh := h / 3; + subWin := Sub_Window (win, sh, sw, by + h - sh - 2, bx + w - sw - 2); + + if Has_Colors then + Init_Pair (2, Cyan, Blue); + Change_Background (subWin, + Attributed_Character'(Ch => ' ', Color => 2, + Attr => Normal_Video)); + end if; + + Set_Character_Attributes (subWin, + (Bold_Character => True, others => False)); + Box (subWin); + Add (subWin, 2, 1, "This is a subwindow"); + Refresh (win); + + Set_Cbreak_Mode (True); + Add (win, 0, 1, "This is a test of the flushinp() call."); + + Add (win, 2, 1, "Type random keys for 5 seconds."); + Add (win, 3, 1, + "These should be discarded (not echoed) after the subwindow " & + "goes away."); + Refresh (win); + + for i in 0 .. 4 loop + Move_Cursor (subWin, 1, 1); + Add (subWin, Str => "Time = "); + Add (subWin, Str => Integer'Image (i)); + Refresh (subWin); + Nap_Milli_Seconds (1000); + Flush_Input; + end loop; + + Delete (subWin); + Erase (win); + Flash_Screen; + Refresh (win); + Nap_Milli_Seconds (1000); + + Add (win, 2, 1, + Str => "If you were still typing when the window timer expired,"); + Add (win, 3, 1, + "or else you typed nothing at all while it was running,"); + Add (win, 4, 1, + "test was invalid. You'll see garbage or nothing at all. "); + Add (win, 6, 1, "Press a key"); + Move_Cursor (win, 9, 10); + Refresh (win); + Set_Echo_Mode (True); + Getchar (win); + Flush_Input; + Add (win, 12, 0, + "If you see any key other than what you typed, flushinp() is broken."); + Continue (win); + + Move_Cursor (win, 9, 10); + Delete_Character (win); + Refresh (win); + Move_Cursor (win, 12, 0); + Clear_To_End_Of_Line; + Add (win, + "What you typed should now have been deleted; if not, wdelch() " & + "failed."); + Continue (win); + + Set_Cbreak_Mode (True); + +end ncurses2.flushinp_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.ads new file mode 100644 index 00000000..ca8244e1 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-flushinp_test.ads @@ -0,0 +1,44 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; + +procedure ncurses2.flushinp_test (win : Terminal_Interface.Curses.Window); diff --git a/contrib/ncurses/Ada95/samples/ncurses2-genericputs.adb b/contrib/ncurses/Ada95/samples/ncurses2-genericputs.adb new file mode 100644 index 00000000..71d1c163 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-genericputs.adb @@ -0,0 +1,118 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2008,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.5 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body ncurses2.genericPuts is + + procedure myGet (Win : Window := Standard_Window; + Str : out BS.Bounded_String; + Len : Integer := -1) + is + function Wgetnstr (Win : Window; + Str : char_array; + Len : int) return int; + pragma Import (C, Wgetnstr, "wgetnstr"); + + N : Integer := Len; + Txt : char_array (0 .. size_t (Max_Length)); + xStr : String (1 .. Max_Length); + Cnt : Natural; + begin + if N < 0 then + N := Max_Length; + end if; + if N > Max_Length then + raise Constraint_Error; + end if; + Txt (0) := Interfaces.C.char'First; + if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then + raise Curses_Exception; + end if; + To_Ada (Txt, xStr, Cnt, True); + Str := To_Bounded_String (xStr (1 .. Cnt)); + end myGet; + + procedure myPut (Str : out BS.Bounded_String; + i : Integer; + Base : Number_Base := 10) is + package Int_IO is new Integer_IO (Integer); use Int_IO; + tmp : String (1 .. BS.Max_Length); + begin + Put (tmp, i, Base); + Str := To_Bounded_String (tmp); + Trim (Str, Ada.Strings.Trim_End'(Ada.Strings.Left)); + end myPut; + + procedure myAdd (Str : BS.Bounded_String) is + begin + Add (Str => To_String (Str)); + end myAdd; + + -- from ncurses-aux + procedure Fill_String (Cp : chars_ptr; + Str : out BS.Bounded_String) + is + -- Fill the string with the characters referenced by the + -- chars_ptr. + -- + Len : Natural; + begin + if Cp /= Null_Ptr then + Len := Natural (Strlen (Cp)); + if Max_Length < Len then + raise Constraint_Error; + end if; + declare + S : String (1 .. Len); + begin + S := Value (Cp); + Str := To_Bounded_String (S); + end; + else + Str := Null_Bounded_String; + end if; + + end Fill_String; + +end ncurses2.genericPuts; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-genericputs.ads b/contrib/ncurses/Ada95/samples/ncurses2-genericputs.ads new file mode 100644 index 00000000..41f2c9b7 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-genericputs.ads @@ -0,0 +1,73 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.4 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +with Ada.Text_IO; use Ada.Text_IO; +with Ada.Strings.Bounded; +use Ada.Strings.Bounded; +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; +with Terminal_Interface.Curses; + +generic + Max : Natural; + -- type mystring is private; + -- type myint is +package ncurses2.genericPuts is + package BS is new + Ada.Strings.Bounded.Generic_Bounded_Length (Max); + use BS; + + procedure myGet (Win : Terminal_Interface.Curses.Window + := Terminal_Interface.Curses.Standard_Window; + Str : out BS.Bounded_String; + Len : Integer := -1); + + procedure myPut (Str : out BS.Bounded_String; + i : Integer; + Base : Number_Base := 10); + -- the default should be Ada.Text_IO.Integer_IO.Default_Base + -- but Default_Base is hidden in the generic so doesn't exist! + procedure myAdd (Str : BS.Bounded_String); + + procedure Fill_String (Cp : chars_ptr; Str : out BS.Bounded_String); +end ncurses2.genericPuts; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-getch.ads b/contrib/ncurses/Ada95/samples/ncurses2-getch.ads new file mode 100644 index 00000000..7fabce9c --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-getch.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure getch_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-getch_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-getch_test.adb new file mode 100644 index 00000000..8bcb7a41 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-getch_test.adb @@ -0,0 +1,257 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.10 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- Character input test +-- test the keypad feature + +with ncurses2.util; use ncurses2.util; + +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse; +with Ada.Characters.Handling; +with Ada.Strings.Bounded; + +with ncurses2.genericPuts; + +procedure ncurses2.getch_test is + use Int_IO; + + function mouse_decode (ep : Mouse_Event) return String; + + function mouse_decode (ep : Mouse_Event) return String is + Y : Line_Position; + X : Column_Position; + Button : Mouse_Button; + State : Button_State; + package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (200); + use BS; + buf : Bounded_String := To_Bounded_String (""); + begin + -- Note that these bindings do not allow + -- two button states, + -- The C version can print {click-1, click-3} for example. + -- They also don't have the 'id' or z coordinate. + Get_Event (ep, Y, X, Button, State); + + -- TODO Append (buf, "id "); from C version + Append (buf, "at ("); + Append (buf, Column_Position'Image (X)); + Append (buf, ", "); + Append (buf, Line_Position'Image (Y)); + Append (buf, ") state"); + Append (buf, Mouse_Button'Image (Button)); + + Append (buf, " = "); + Append (buf, Button_State'Image (State)); + return To_String (buf); + end mouse_decode; + + buf : String (1 .. 1024); -- TODO was BUFSIZE + n : Integer; + c : Key_Code; + blockflag : Timeout_Mode := Blocking; + firsttime : Boolean := True; + tmp2 : Event_Mask; + tmp6 : String (1 .. 6); + tmp20 : String (1 .. 20); + x : Column_Position; + y : Line_Position; + tmpx : Integer; + incount : Integer := 0; + +begin + Refresh; + tmp2 := Start_Mouse (All_Events); + Add (Str => "Delay in 10ths of a second ( for blocking input)? "); + Set_Echo_Mode (SwitchOn => True); + Get (Str => buf); + + Set_Echo_Mode (SwitchOn => False); + Set_NL_Mode (SwitchOn => False); + + if Ada.Characters.Handling.Is_Digit (buf (1)) then + Get (Item => n, From => buf, Last => tmpx); + Set_Timeout_Mode (Mode => Delayed, Amount => n * 100); + blockflag := Delayed; + end if; + + c := Character'Pos ('?'); + Set_Raw_Mode (SwitchOn => True); + loop + if not firsttime then + Add (Str => "Key pressed: "); + Put (tmp6, Integer (c), 8); + Add (Str => tmp6); + Add (Ch => ' '); + if c = Key_Mouse then + declare + event : Mouse_Event; + begin + event := Get_Mouse; + Add (Str => "KEY_MOUSE, "); + Add (Str => mouse_decode (event)); + Add (Ch => newl); + end; + elsif c >= Key_Min then + Key_Name (c, tmp20); + Add (Str => tmp20); + -- I used tmp and got bitten by the length problem:-> + Add (Ch => newl); + elsif c > 16#80# then -- TODO fix, use constant if possible + declare + c2 : constant Character := Character'Val (c mod 16#80#); + begin + if Ada.Characters.Handling.Is_Graphic (c2) then + Add (Str => "M-"); + Add (Ch => c2); + else + Add (Str => "M-"); + Add (Str => Un_Control ((Ch => c2, + Color => Color_Pair'First, + Attr => Normal_Video))); + end if; + Add (Str => " (high-half character)"); + Add (Ch => newl); + end; + else + declare + c2 : constant Character := Character'Val (c mod 16#80#); + begin + if Ada.Characters.Handling.Is_Graphic (c2) then + Add (Ch => c2); + Add (Str => " (ASCII printable character)"); + Add (Ch => newl); + else + Add (Str => Un_Control ((Ch => c2, + Color => Color_Pair'First, + Attr => Normal_Video))); + Add (Str => " (ASCII control character)"); + Add (Ch => newl); + end if; + end; + end if; + -- TODO I am not sure why this was in the C version + -- the delay statement scroll anyway. + Get_Cursor_Position (Line => y, Column => x); + if y >= Lines - 1 then + Move_Cursor (Line => 0, Column => 0); + end if; + Clear_To_End_Of_Line; + end if; + + firsttime := False; + if c = Character'Pos ('g') then + declare + package p is new ncurses2.genericPuts (1024); + use p; + use p.BS; + timedout : Boolean := False; + boundedbuf : Bounded_String; + begin + Add (Str => "getstr test: "); + Set_Echo_Mode (SwitchOn => True); + -- Note that if delay mode is set + -- Get can raise an exception. + -- The C version would print the string it had so far + -- also TODO get longer length string, like the C version + declare begin + myGet (Str => boundedbuf); + exception when Curses_Exception => + Add (Str => "Timed out."); + Add (Ch => newl); + timedout := True; + end; + -- note that the Ada Get will stop reading at 1024. + if not timedout then + Set_Echo_Mode (SwitchOn => False); + Add (Str => " I saw '"); + myAdd (Str => boundedbuf); + Add (Str => "'."); + Add (Ch => newl); + end if; + end; + elsif c = Character'Pos ('s') then + ShellOut (True); + elsif c = Character'Pos ('x') or + c = Character'Pos ('q') or + (c = Key_None and blockflag = Blocking) + then + exit; + elsif c = Character'Pos ('?') then + Add (Str => "Type any key to see its keypad value. Also:"); + Add (Ch => newl); + Add (Str => "g -- triggers a getstr test"); + Add (Ch => newl); + Add (Str => "s -- shell out"); + Add (Ch => newl); + Add (Str => "q -- quit"); + Add (Ch => newl); + Add (Str => "? -- repeats this help message"); + Add (Ch => newl); + end if; + + loop + c := Getchar; + exit when c /= Key_None; + if blockflag /= Blocking then + Put (tmp6, incount); -- argh string length! + Add (Str => tmp6); + Add (Str => ": input timed out"); + Add (Ch => newl); + else + Put (tmp6, incount); + Add (Str => tmp6); + Add (Str => ": input error"); + Add (Ch => newl); + exit; + end if; + incount := incount + 1; + end loop; + end loop; + + End_Mouse (tmp2); + Set_Timeout_Mode (Mode => Blocking, Amount => 0); -- amount is ignored + Set_Raw_Mode (SwitchOn => False); + Set_NL_Mode (SwitchOn => True); + Erase; + End_Windows; +end ncurses2.getch_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-getch_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-getch_test.ads new file mode 100644 index 00000000..01e19283 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-getch_test.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.getch_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-getopt.adb b/contrib/ncurses/Ada95/samples/ncurses2-getopt.adb new file mode 100644 index 00000000..7c902f93 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-getopt.adb @@ -0,0 +1,164 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2008,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.9 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- A simplified version of the GNU getopt function +-- copyright Free Software Foundtion + +with Ada.Strings.Fixed; +with Ada.Strings.Bounded; +with Ada.Text_IO; use Ada.Text_IO; + +package body ncurses2.getopt is + + nextchar : Natural := 0; + + -- Ncurses doesn't use the non option elements so we are spared + -- the job of computing those. + + -- also the user is not allowed to modify argv or argc + -- Doing so is Erroneous execution. + + -- long options are not handled. + + procedure Qgetopt (retval : out Integer; + argc : Integer; + argv : stringfunc; + -- argv will be the Argument function. + optstring : String; + optind : in out Integer; + -- ignored for ncurses, must be initialized to 1 by + -- the caller + Optarg : out stringa + -- a garbage collector would be useful here. + ) is + + package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (200); + use BS; + optargx : Bounded_String; + begin + + if argc < optind then + retval := -1; + return; + end if; + + optargx := To_Bounded_String (""); + + if nextchar = 0 then + + if argv (optind) = "--" then + -- the rest are non-options, we ignore them + retval := -1; + return; + end if; + + if argv (optind)(1) /= '-' or argv (optind)'Length = 1 then + optind := optind + 1; + Optarg := new String'(argv (optind)); + retval := 1; + return; + end if; + + nextchar := 2; -- skip the one hyphen. + end if; + + -- Look at and handle the next short option-character. + declare + c : Character := argv (optind) (nextchar); + temp : constant Natural := + Ada.Strings.Fixed.Index (optstring, String'(1 => c)); + begin + if temp = 0 or c = ':' then + Put_Line (Standard_Error, + argv (optind) & ": invalid option -- " & c); + c := '?'; + return; + end if; + + if optstring (temp + 1) = ':' then + if optstring (temp + 2) = ':' then + -- This is an option that accepts an argument optionally. + if nextchar /= argv (optind)'Length then + optargx := To_Bounded_String + (argv (optind) (nextchar .. argv (optind)'Length)); + else + Optarg := null; + end if; + else + -- This is an option that requires an argument. + if nextchar /= argv (optind)'Length then + optargx := To_Bounded_String + (argv (optind) (nextchar .. argv (optind)'Length)); + optind := optind + 1; + elsif optind = argc then + Put_Line (Standard_Error, + argv (optind) & + ": option requires an argument -- " & c); + if optstring (optstring'First) = ':' then + c := ':'; + else + c := '?'; + end if; + else + -- increment it again when taking next ARGV-elt as argument. + optind := optind + 1; + optargx := To_Bounded_String (argv (optind)); + optind := optind + 1; + end if; + end if; + nextchar := 0; + else -- no argument for the option + if nextchar = argv (optind)'Length then + optind := optind + 1; + nextchar := 0; + else + nextchar := nextchar + 1; + end if; + end if; + + retval := Character'Pos (c); + Optarg := new String'(To_String (optargx)); + return; + end; + end Qgetopt; + +end ncurses2.getopt; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-getopt.ads b/contrib/ncurses/Ada95/samples/ncurses2-getopt.ads new file mode 100644 index 00000000..09d997cf --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-getopt.ads @@ -0,0 +1,61 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.3 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package ncurses2.getopt is + + type stringa is access String; + + type stringfunc is access + function (n : Positive) return String; + + procedure Qgetopt (retval : out Integer; + argc : Integer; + argv : stringfunc; + optstring : String; + optind : in out Integer; + -- ignored for ncurses, must be initialized to 0 + -- by the caller + Optarg : out stringa + -- a garbage collector would be useful here. + ); + +end ncurses2.getopt; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-m.adb b/contrib/ncurses/Ada95/samples/ncurses2-m.adb new file mode 100644 index 00000000..e8a837d8 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-m.adb @@ -0,0 +1,446 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 2000-2007,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.11 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- TODO use Default_Character where appropriate + +-- This is an Ada version of ncurses +-- I translated this because it tests the most features. + +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace; + +with Ada.Text_IO; use Ada.Text_IO; + +with Ada.Characters.Latin_1; + +with Ada.Command_Line; use Ada.Command_Line; + +with Ada.Strings.Unbounded; + +with ncurses2.util; use ncurses2.util; +with ncurses2.getch_test; +with ncurses2.attr_test; +with ncurses2.color_test; +with ncurses2.demo_panels; +with ncurses2.color_edit; +with ncurses2.slk_test; +with ncurses2.acs_display; +with ncurses2.acs_and_scroll; +with ncurses2.flushinp_test; +with ncurses2.test_sgr_attributes; +with ncurses2.menu_test; +with ncurses2.demo_pad; +with ncurses2.demo_forms; +with ncurses2.overlap_test; +with ncurses2.trace_set; + +with ncurses2.getopt; use ncurses2.getopt; + +package body ncurses2.m is + + function To_trace (n : Integer) return Trace_Attribute_Set; + procedure usage; + procedure Set_Terminal_Modes; + function Do_Single_Test (c : Character) return Boolean; + + function To_trace (n : Integer) return Trace_Attribute_Set is + a : Trace_Attribute_Set := (others => False); + m : Integer; + rest : Integer; + begin + m := n mod 2; + if 1 = m then + a.Times := True; + end if; + rest := n / 2; + + m := rest mod 2; + if 1 = m then + a.Tputs := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Update := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Cursor_Move := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Character_Output := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Calls := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Virtual_Puts := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Input_Events := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.TTY_State := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Internal_Calls := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Character_Calls := True; + end if; + rest := rest / 2; + m := rest mod 2; + if 1 = m then + a.Termcap_TermInfo := True; + end if; + + return a; + end To_trace; + + -- these are type Stdscr_Init_Proc; + + function rip_footer ( + Win : Window; + Columns : Column_Count) return Integer; + pragma Convention (C, rip_footer); + + function rip_footer ( + Win : Window; + Columns : Column_Count) return Integer is + begin + Set_Background (Win, (Ch => ' ', + Attr => (Reverse_Video => True, others => False), + Color => 0)); + Erase (Win); + Move_Cursor (Win, 0, 0); + Add (Win, "footer:" & Columns'Img & " columns"); + Refresh_Without_Update (Win); + return 0; -- Curses_OK; + end rip_footer; + + function rip_header ( + Win : Window; + Columns : Column_Count) return Integer; + pragma Convention (C, rip_header); + + function rip_header ( + Win : Window; + Columns : Column_Count) return Integer is + begin + Set_Background (Win, (Ch => ' ', + Attr => (Reverse_Video => True, others => False), + Color => 0)); + Erase (Win); + Move_Cursor (Win, 0, 0); + Add (Win, "header:" & Columns'Img & " columns"); + -- 'Img is a GNAT extension + Refresh_Without_Update (Win); + return 0; -- Curses_OK; + end rip_header; + + procedure usage is + -- type Stringa is access String; + use Ada.Strings.Unbounded; + -- tbl : constant array (Positive range <>) of Stringa := ( + tbl : constant array (Positive range <>) of Unbounded_String + := ( + To_Unbounded_String ("Usage: ncurses [options]"), + To_Unbounded_String (""), + To_Unbounded_String ("Options:"), + To_Unbounded_String (" -a f,b set default-colors " & + "(assumed white-on-black)"), + To_Unbounded_String (" -d use default-colors if terminal " & + "supports them"), + To_Unbounded_String (" -e fmt specify format for soft-keys " & + "test (e)"), + To_Unbounded_String (" -f rip-off footer line " & + "(can repeat)"), + To_Unbounded_String (" -h rip-off header line " & + "(can repeat)"), + To_Unbounded_String (" -s msec specify nominal time for " & + "panel-demo (default: 1, to hold)"), + To_Unbounded_String (" -t mask specify default trace-level " & + "(may toggle with ^T)") + ); + begin + for n in tbl'Range loop + Put_Line (Standard_Error, To_String (tbl (n))); + end loop; + -- exit(EXIT_FAILURE); + -- TODO should we use Set_Exit_Status and throw and exception? + end usage; + + procedure Set_Terminal_Modes is begin + Set_Raw_Mode (SwitchOn => False); + Set_Cbreak_Mode (SwitchOn => True); + Set_Echo_Mode (SwitchOn => False); + Allow_Scrolling (Mode => True); + Use_Insert_Delete_Line (Do_Idl => True); + Set_KeyPad_Mode (SwitchOn => True); + end Set_Terminal_Modes; + + nap_msec : Integer := 1; + + function Do_Single_Test (c : Character) return Boolean is + begin + case c is + when 'a' => + getch_test; + when 'b' => + attr_test; + when 'c' => + if not Has_Colors then + Cannot ("does not support color."); + else + color_test; + end if; + when 'd' => + if not Has_Colors then + Cannot ("does not support color."); + elsif not Can_Change_Color then + Cannot ("has hardwired color values."); + else + color_edit; + end if; + when 'e' => + slk_test; + when 'f' => + acs_display; + when 'o' => + demo_panels (nap_msec); + when 'g' => + acs_and_scroll; + when 'i' => + flushinp_test (Standard_Window); + when 'k' => + test_sgr_attributes; + when 'm' => + menu_test; + when 'p' => + demo_pad; + when 'r' => + demo_forms; + when 's' => + overlap_test; + when 't' => + trace_set; + when '?' => + null; + when others => return False; + end case; + return True; + end Do_Single_Test; + + command : Character; + my_e_param : Soft_Label_Key_Format := Four_Four; + assumed_colors : Boolean := False; + default_colors : Boolean := False; + default_fg : Color_Number := White; + default_bg : Color_Number := Black; + -- nap_msec was an unsigned long integer in the C version, + -- yet napms only takes an int! + + c : Integer; + c2 : Character; + optind : Integer := 1; -- must be initialized to one. + optarg : getopt.stringa; + + length : Integer; + tmpi : Integer; + + package myio is new Ada.Text_IO.Integer_IO (Integer); + + save_trace : Integer := 0; + save_trace_set : Trace_Attribute_Set; + + function main return Integer is + begin + loop + Qgetopt (c, Argument_Count, Argument'Access, + "a:de:fhs:t:", optind, optarg); + exit when c = -1; + c2 := Character'Val (c); + case c2 is + when 'a' => + -- Ada doesn't have scanf, it doesn't even have a + -- regular expression library. + assumed_colors := True; + myio.Get (optarg.all, Integer (default_fg), length); + myio.Get (optarg.all (length + 2 .. optarg.all'Length), + Integer (default_bg), length); + when 'd' => + default_colors := True; + when 'e' => + myio.Get (optarg.all, tmpi, length); + if tmpi > 3 then + usage; + return 1; + end if; + my_e_param := Soft_Label_Key_Format'Val (tmpi); + when 'f' => + Rip_Off_Lines (-1, rip_footer'Access); + when 'h' => + Rip_Off_Lines (1, rip_header'Access); + when 's' => + myio.Get (optarg.all, nap_msec, length); + when 't' => + myio.Get (optarg.all, save_trace, length); + when others => + usage; + return 1; + end case; + end loop; + + -- the C version had a bunch of macros here. + + -- if (!isatty(fileno(stdin))) + -- isatty is not available in the standard Ada so skip it. + save_trace_set := To_trace (save_trace); + Trace_On (save_trace_set); + + Init_Soft_Label_Keys (my_e_param); + + Init_Screen; + Set_Background (Ch => (Ch => Blank, + Attr => Normal_Video, + Color => Color_Pair'First)); + + if Has_Colors then + Start_Color; + if default_colors then + Use_Default_Colors; + elsif assumed_colors then + Assume_Default_Colors (default_fg, default_bg); + end if; + end if; + + Set_Terminal_Modes; + Save_Curses_Mode (Curses); + + End_Windows; + + -- TODO add macro #if blocks. + Put_Line ("Welcome to " & Curses_Version & ". Press ? for help."); + + loop + Put_Line ("This is the ncurses main menu"); + Put_Line ("a = keyboard and mouse input test"); + Put_Line ("b = character attribute test"); + Put_Line ("c = color test pattern"); + Put_Line ("d = edit RGB color values"); + Put_Line ("e = exercise soft keys"); + Put_Line ("f = display ACS characters"); + Put_Line ("g = display windows and scrolling"); + Put_Line ("i = test of flushinp()"); + Put_Line ("k = display character attributes"); + Put_Line ("m = menu code test"); + Put_Line ("o = exercise panels library"); + Put_Line ("p = exercise pad features"); + Put_Line ("q = quit"); + Put_Line ("r = exercise forms code"); + Put_Line ("s = overlapping-refresh test"); + Put_Line ("t = set trace level"); + Put_Line ("? = repeat this command summary"); + + Put ("> "); + Flush; + + command := Ada.Characters.Latin_1.NUL; + -- get_input: + -- loop + declare + Ch : Character; + begin + Get (Ch); + -- TODO if read(ch) <= 0 + -- TODO ada doesn't have an Is_Space function + command := Ch; + -- TODO if ch = '\n' or '\r' are these in Ada? + end; + -- end loop get_input; + + declare + begin + if Do_Single_Test (command) then + Flush_Input; + Set_Terminal_Modes; + Reset_Curses_Mode (Curses); + Clear; + Refresh; + End_Windows; + if command = '?' then + Put_Line ("This is the ncurses capability tester."); + Put_Line ("You may select a test from the main menu by " & + "typing the"); + Put_Line ("key letter of the choice (the letter to left " & + "of the =)"); + Put_Line ("at the > prompt. The commands `x' or `q' will " & + "exit."); + end if; + -- continue; --why continue in the C version? + end if; + exception + when Curses_Exception => End_Windows; + end; + + exit when command = 'q'; + end loop; + Curses_Free_All; + return 0; -- TODO ExitProgram(EXIT_SUCCESS); + end main; + +end ncurses2.m; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-m.ads b/contrib/ncurses/Ada95/samples/ncurses2-m.ads new file mode 100644 index 00000000..3c87da75 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-m.ads @@ -0,0 +1,44 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package ncurses2.m is + function main return Integer; +end ncurses2.m; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-menu_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-menu_test.adb new file mode 100644 index 00000000..721f7502 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-menu_test.adb @@ -0,0 +1,169 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.9 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; + +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus; +with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse; + +procedure ncurses2.menu_test is + function menu_virtualize (c : Key_Code) return Key_Code; + procedure xAdd (l : Line_Position; c : Column_Position; s : String); + + function menu_virtualize (c : Key_Code) return Key_Code is + begin + case c is + when Character'Pos (newl) | Key_Exit => + return Menu_Request_Code'Last + 1; -- MAX_COMMAND? TODO + when Character'Pos ('u') => + return M_ScrollUp_Line; + when Character'Pos ('d') => + return M_ScrollDown_Line; + when Character'Pos ('b') | Key_Next_Page => + return M_ScrollUp_Page; + when Character'Pos ('f') | Key_Previous_Page => + return M_ScrollDown_Page; + when Character'Pos ('n') | Key_Cursor_Down => + return M_Next_Item; + when Character'Pos ('p') | Key_Cursor_Up => + return M_Previous_Item; + when Character'Pos (' ') => + return M_Toggle_Item; + when Key_Mouse => + return c; + when others => + Beep; + return c; + end case; + end menu_virtualize; + + MENU_Y : constant Line_Count := 8; + MENU_X : constant Column_Count := 8; + + type String_Access is access String; + + animals : constant array (Positive range <>) of String_Access := + (new String'("Lions"), + new String'("Tigers"), + new String'("Bears"), + new String'("(Oh my!)"), + new String'("Newts"), + new String'("Platypi"), + new String'("Lemurs")); + + items_a : constant Item_Array_Access := + new Item_Array (1 .. animals'Last + 1); + + tmp : Event_Mask; + + procedure xAdd (l : Line_Position; c : Column_Position; s : String) is + begin + Add (Line => l, Column => c, Str => s); + end xAdd; + + mrows : Line_Count; + mcols : Column_Count; + + menuwin : Window; + + m : Menu; + + c1 : Key_Code; + + c : Driver_Result; + r : Key_Code; +begin + tmp := Start_Mouse; + xAdd (0, 0, "This is the menu test:"); + xAdd (2, 0, " Use up and down arrow to move the select bar."); + xAdd (3, 0, " 'n' and 'p' act like arrows."); + xAdd (4, 0, " 'b' and 'f' scroll up/down (page), 'u' and 'd' (line)."); + xAdd (5, 0, " Press return to exit."); + Refresh; + + for i in animals'Range loop + items_a.all (i) := New_Item (animals (i).all); + end loop; + items_a.all (animals'Last + 1) := Null_Item; + + m := New_Menu (items_a); + + Set_Format (m, Line_Position (animals'Last + 1) / 2, 1); + Scale (m, mrows, mcols); + + menuwin := Create (mrows + 2, mcols + 2, MENU_Y, MENU_X); + Set_Window (m, menuwin); + Set_KeyPad_Mode (menuwin, True); + Box (menuwin); -- 0,0? + + Set_Sub_Window (m, Derived_Window (menuwin, mrows, mcols, 1, 1)); + + Post (m); + + loop + c1 := Getchar (menuwin); + r := menu_virtualize (c1); + c := Driver (m, r); + exit when c = Unknown_Request; -- E_UNKNOWN_COMMAND? + if c = Request_Denied then + Beep; + end if; + -- continue ? + end loop; + + Move_Cursor (Line => Lines - 2, Column => 0); + Add (Str => "You chose: "); + Add (Str => Name (Current (m))); + Add (Ch => newl); + Pause; -- the C version didn't use Pause, it spelled it out + + Post (m, False); -- unpost, not clear :-( + declare begin + Delete (menuwin); + exception when Curses_Exception => null; end; + -- menuwin has children so will raise the exception. + + Delete (m); + + End_Mouse (tmp); +end ncurses2.menu_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-menu_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-menu_test.ads new file mode 100644 index 00000000..1b7e74bb --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-menu_test.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.menu_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-overlap_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-overlap_test.adb new file mode 100644 index 00000000..6f3341ba --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-overlap_test.adb @@ -0,0 +1,159 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020-2021,2024 Thomas E. Dickey -- +-- Copyright 2000-2014,2015 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.10 $ +-- $Date: 2024/03/30 13:21:15 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +-- test effects of overlapping windows + +procedure ncurses2.overlap_test is + + procedure fillwin (win : Window; ch : Character); + procedure crosswin (win : Window; ch : Character); + + procedure fillwin (win : Window; ch : Character) is + y1 : Line_Position; + x1 : Column_Position; + begin + Get_Size (win, y1, x1); + for y in 0 .. y1 - 1 loop + Move_Cursor (win, y, 0); + for x in 0 .. x1 - 1 loop + Add (win, Ch => ch); + end loop; + end loop; + exception + when Curses_Exception => null; + -- write to lower right corner + end fillwin; + + procedure crosswin (win : Window; ch : Character) is + y1 : Line_Position; + x1 : Column_Position; + begin + Get_Size (win, y1, x1); + for y in 0 .. y1 - 1 loop + for x in 0 .. x1 - 1 loop + if (x > (x1 - 1) / 3 and x <= (2 * (x1 - 1)) / 3) or + (y > (y1 - 1) / 3 and y <= (2 * (y1 - 1)) / 3) + then + Move_Cursor (win, y, x); + Add (win, Ch => ch); + end if; + end loop; + end loop; + end crosswin; + + -- In a 24x80 screen like some xterms are, the instructions will + -- be overwritten. + ch : Character; + win1 : Window := New_Window (9, 20, 3, 3); + win2 : Window := New_Window (9, 20, 9, 16); +begin + Set_Raw_Mode (SwitchOn => True); + Refresh; + Move_Cursor (Line => 0, Column => 0); + Add (Str => "This test shows the behavior of wnoutrefresh() with " & + "respect to"); + Add (Ch => newl); + Add (Str => "the shared region of two overlapping windows A and B. " & + "The cross"); + Add (Ch => newl); + Add (Str => "pattern in each window does not overlap the other."); + Add (Ch => newl); + + Move_Cursor (Line => 18, Column => 0); + Add (Str => "a = refresh A, then B, then doupdate. b = refresh B, " & + "then A, then doupdate"); + Add (Ch => newl); + Add (Str => "c = fill window A with letter A. d = fill window B " & + "with letter B."); + Add (Ch => newl); + Add (Str => "e = cross pattern in window A. f = cross pattern " & + "in window B."); + Add (Ch => newl); + Add (Str => "g = clear window A. h = clear window B."); + Add (Ch => newl); + Add (Str => "i = overwrite A onto B. j = overwrite " & + "B onto A."); + Add (Ch => newl); + Add (Str => "^Q/ESC = terminate test."); + + loop + ch := Code_To_Char (Getchar); + exit when ch = CTRL ('Q') or ch = CTRL ('['); -- QUIT or ESCAPE + case ch is + when 'a' => -- refresh window A first, then B + Refresh_Without_Update (win1); + Refresh_Without_Update (win2); + Update_Screen; + when 'b' => -- refresh window B first, then A + Refresh_Without_Update (win2); + Refresh_Without_Update (win1); + Update_Screen; + when 'c' => -- fill window A so it is visible + fillwin (win1, 'A'); + when 'd' => -- fill window B so it is visible + fillwin (win2, 'B'); + when 'e' => -- cross test pattern in window A + crosswin (win1, 'A'); + when 'f' => -- cross test pattern in window B + crosswin (win2, 'B'); + when 'g' => -- clear window A + Clear (win1); + Move_Cursor (win1, 0, 0); + when 'h' => -- clear window B + Clear (win2); + Move_Cursor (win2, 0, 0); + when 'i' => -- overwrite A onto B + Overwrite (win1, win2); + when 'j' => -- overwrite B onto A + Overwrite (win2, win1); + when others => null; + end case; + end loop; + + Delete (win2); + Delete (win1); + Erase; + End_Windows; +end ncurses2.overlap_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-overlap_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-overlap_test.ads new file mode 100644 index 00000000..d6589eab --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-overlap_test.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.overlap_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-slk_test.adb b/contrib/ncurses/Ada95/samples/ncurses2-slk_test.adb new file mode 100644 index 00000000..4971ed64 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-slk_test.adb @@ -0,0 +1,173 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 2000-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.11 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +with Ada.Strings.Unbounded; +with Interfaces.C; +with Terminal_Interface.Curses.Aux; + +procedure ncurses2.slk_test is + procedure myGet (Win : Window := Standard_Window; + Str : out Ada.Strings.Unbounded.Unbounded_String; + Len : Integer := -1); + + procedure myGet (Win : Window := Standard_Window; + Str : out Ada.Strings.Unbounded.Unbounded_String; + Len : Integer := -1) + is + use Ada.Strings.Unbounded; + use Interfaces.C; + use Terminal_Interface.Curses.Aux; + + function Wgetnstr (Win : Window; + Str : char_array; + Len : int) return int; + pragma Import (C, Wgetnstr, "wgetnstr"); + + -- FIXME: how to construct "(Len > 0) ? Len : 80"? + Ask : constant Interfaces.C.size_t := Interfaces.C.size_t'Val (Len + 80); + Txt : char_array (0 .. Ask); + + begin + Txt (0) := Interfaces.C.char'First; + if Wgetnstr (Win, Txt, Txt'Length) = Curses_Err then + raise Curses_Exception; + end if; + Str := To_Unbounded_String (To_Ada (Txt, True)); + end myGet; + + use Ada.Strings.Unbounded; + + c : Key_Code; + buf : Unbounded_String; + c2 : Character; + fmt : Label_Justification := Centered; + tmp : Integer; + +begin + c := CTRL ('l'); + loop + Move_Cursor (Line => 0, Column => 0); + c2 := Code_To_Char (c); + case c2 is + when Character'Val (Character'Pos ('l') mod 16#20#) => -- CTRL('l') + Erase; + Switch_Character_Attribute (Attr => (Bold_Character => True, + others => False)); + Add (Line => 0, Column => 20, + Str => "Soft Key Exerciser"); + Switch_Character_Attribute (On => False, + Attr => (Bold_Character => True, + others => False)); + + Move_Cursor (Line => 2, Column => 0); + P ("Available commands are:"); + P (""); + P ("^L -- refresh screen"); + P ("a -- activate or restore soft keys"); + P ("d -- disable soft keys"); + P ("c -- set centered format for labels"); + P ("l -- set left-justified format for labels"); + P ("r -- set right-justified format for labels"); + P ("[12345678] -- set label; labels are numbered 1 through 8"); + P ("e -- erase stdscr (should not erase labels)"); + P ("s -- test scrolling of shortened screen"); + P ("x, q -- return to main menu"); + P (""); + P ("Note: if activating the soft keys causes your terminal to"); + P ("scroll up one line, your terminal auto-scrolls when anything"); + P ("is written to the last screen position. The ncurses code"); + P ("does not yet handle this gracefully."); + Refresh; + Restore_Soft_Label_Keys; + + when 'a' => + Restore_Soft_Label_Keys; + when 'e' => + Clear; + when 's' => + Add (Line => 20, Column => 0, + Str => "Press Q to stop the scrolling-test: "); + loop + c := Getchar; + c2 := Code_To_Char (c); + exit when c2 = 'Q'; + -- c = ERR? + -- TODO when c is not a character (arrow key) + -- the behavior is different from the C version. + Add (Ch => c2); + end loop; + when 'd' => + Clear_Soft_Label_Keys; + when 'l' => + fmt := Left; + when 'c' => + fmt := Centered; + when 'r' => + fmt := Right; + when '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' => + Add (Line => 20, Column => 0, + Str => "Please enter the label value: "); + Set_Echo_Mode (SwitchOn => True); + myGet (Str => buf); + Set_Echo_Mode (SwitchOn => False); + tmp := ctoi (c2); + Set_Soft_Label_Key (Label_Number (tmp), To_String (buf), fmt); + Refresh_Soft_Label_Keys; + Move_Cursor (Line => 20, Column => 0); + Clear_To_End_Of_Line; + when 'x' | 'q' => + exit; + -- the C version needed a goto, ha ha + -- breaks exit the case not the loop because fall-through + -- happens in C! + when others => + Beep; + end case; + c := Getchar; + -- TODO exit when c = EOF + end loop; + Erase; + End_Windows; +end ncurses2.slk_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-slk_test.ads b/contrib/ncurses/Ada95/samples/ncurses2-slk_test.ads new file mode 100644 index 00000000..1aff9d0c --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-slk_test.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.slk_test; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.adb b/contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.adb new file mode 100644 index 00000000..ac6df4a1 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.adb @@ -0,0 +1,186 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.3 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with ncurses2.util; use ncurses2.util; + +-- Graphic-rendition test (adapted from vttest) + +procedure ncurses2.test_sgr_attributes is + + procedure xAdd (l : Line_Position; c : Column_Position; s : String); + + procedure xAdd (l : Line_Position; c : Column_Position; s : String) is + begin + Add (Line => l, Column => c, Str => s); + end xAdd; + + normal, current : Attributed_Character; +begin + for pass in reverse Boolean loop + if pass then + normal := (Ch => ' ', Attr => Normal_Video, Color => 0); + else + normal := (Ch => ' ', Attr => + (Reverse_Video => True, others => False), Color => 0); + end if; + + -- Use non-default colors if possible to exercise bce a little + if Has_Colors then + Init_Pair (1, White, Blue); + normal.Color := 1; + end if; + Set_Background (Ch => normal); + Erase; + xAdd (1, 20, "Graphic rendition test pattern:"); + + xAdd (4, 1, "vanilla"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + Set_Background (Ch => current); + xAdd (4, 40, "bold"); + + current := normal; + current.Attr.Under_Line := not current.Attr.Under_Line; + Set_Background (Ch => current); + xAdd (6, 6, "underline"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + current.Attr.Under_Line := not current.Attr.Under_Line; + Set_Background (Ch => current); + xAdd (6, 45, "bold underline"); + + current := normal; + current.Attr.Blink := not current.Attr.Blink; + Set_Background (Ch => current); + xAdd (8, 1, "blink"); + + current := normal; + current.Attr.Blink := not current.Attr.Blink; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + Set_Background (Ch => current); + xAdd (8, 40, "bold blink"); + + current := normal; + current.Attr.Under_Line := not current.Attr.Under_Line; + current.Attr.Blink := not current.Attr.Blink; + Set_Background (Ch => current); + xAdd (10, 6, "underline blink"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + current.Attr.Under_Line := not current.Attr.Under_Line; + current.Attr.Blink := not current.Attr.Blink; + Set_Background (Ch => current); + xAdd (10, 45, "bold underline blink"); + + current := normal; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (12, 1, "negative"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (12, 40, "bold negative"); + + current := normal; + current.Attr.Under_Line := not current.Attr.Under_Line; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (14, 6, "underline negative"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + current.Attr.Under_Line := not current.Attr.Under_Line; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (14, 45, "bold underline negative"); + + current := normal; + current.Attr.Blink := not current.Attr.Blink; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (16, 1, "blink negative"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + current.Attr.Blink := not current.Attr.Blink; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (16, 40, "bold blink negative"); + + current := normal; + current.Attr.Under_Line := not current.Attr.Under_Line; + current.Attr.Blink := not current.Attr.Blink; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (18, 6, "underline blink negative"); + + current := normal; + current.Attr.Bold_Character := not current.Attr.Bold_Character; + current.Attr.Under_Line := not current.Attr.Under_Line; + current.Attr.Blink := not current.Attr.Blink; + current.Attr.Reverse_Video := not current.Attr.Reverse_Video; + Set_Background (Ch => current); + xAdd (18, 45, "bold underline blink negative"); + + Set_Background (Ch => normal); + Move_Cursor (Line => Lines - 2, Column => 1); + if pass then + Add (Str => "Dark"); + else + Add (Str => "Light"); + end if; + Add (Str => " background. "); + Clear_To_End_Of_Line; + Pause; + end loop; + + Set_Background (Ch => Blank2); + Erase; + End_Windows; + +end ncurses2.test_sgr_attributes; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.ads b/contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.ads new file mode 100644 index 00000000..55895473 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-test_sgr_attributes.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.test_sgr_attributes; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-trace_set.adb b/contrib/ncurses/Ada95/samples/ncurses2-trace_set.adb new file mode 100644 index 00000000..3b1983da --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-trace_set.adb @@ -0,0 +1,496 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses2.trace_set -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020,2023 Thomas E. Dickey -- +-- Copyright 2000-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.8 $ +-- $Date: 2023/06/17 17:21:47 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with ncurses2.util; use ncurses2.util; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace; +with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus; + +with Ada.Strings.Bounded; + +-- interactively set the trace level + +procedure ncurses2.trace_set is + + function menu_virtualize (c : Key_Code) return Key_Code; + function subset (super, sub : Trace_Attribute_Set) return Boolean; + function trace_or (a, b : Trace_Attribute_Set) return Trace_Attribute_Set; + function trace_num (tlevel : Trace_Attribute_Set) return String; + function tracetrace (tlevel : Trace_Attribute_Set) return String; + function run_trace_menu (m : Menu; count : Integer) return Boolean; + + function menu_virtualize (c : Key_Code) return Key_Code is + begin + case c is + when Character'Pos (newl) | Key_Exit => + return Menu_Request_Code'Last + 1; -- MAX_COMMAND? TODO + when Character'Pos ('u') => + return M_ScrollUp_Line; + when Character'Pos ('d') => + return M_ScrollDown_Line; + when Character'Pos ('b') | Key_Next_Page => + return M_ScrollUp_Page; + when Character'Pos ('f') | Key_Previous_Page => + return M_ScrollDown_Page; + when Character'Pos ('n') | Key_Cursor_Down => + return M_Next_Item; + when Character'Pos ('p') | Key_Cursor_Up => + return M_Previous_Item; + when Character'Pos (' ') => + return M_Toggle_Item; + when Key_Mouse => + return c; + when others => + Beep; + return c; + end case; + end menu_virtualize; + + type string_a is access String; + type tbl_entry is record + name : string_a; + mask : Trace_Attribute_Set; + end record; + + t_tbl : constant array (Positive range <>) of tbl_entry := + ( + (new String'("Disable"), + Trace_Disable), + (new String'("Times"), + Trace_Attribute_Set'(Times => True, others => False)), + (new String'("Tputs"), + Trace_Attribute_Set'(Tputs => True, others => False)), + (new String'("Update"), + Trace_Attribute_Set'(Update => True, others => False)), + (new String'("Cursor_Move"), + Trace_Attribute_Set'(Cursor_Move => True, others => False)), + (new String'("Character_Output"), + Trace_Attribute_Set'(Character_Output => True, others => False)), + (new String'("Ordinary"), + Trace_Ordinary), + (new String'("Calls"), + Trace_Attribute_Set'(Calls => True, others => False)), + (new String'("Virtual_Puts"), + Trace_Attribute_Set'(Virtual_Puts => True, others => False)), + (new String'("Input_Events"), + Trace_Attribute_Set'(Input_Events => True, others => False)), + (new String'("TTY_State"), + Trace_Attribute_Set'(TTY_State => True, others => False)), + (new String'("Internal_Calls"), + Trace_Attribute_Set'(Internal_Calls => True, others => False)), + (new String'("Character_Calls"), + Trace_Attribute_Set'(Character_Calls => True, others => False)), + (new String'("Termcap_TermInfo"), + Trace_Attribute_Set'(Termcap_TermInfo => True, others => False)), + (new String'("Maximum"), + Trace_Maximum) + ); + + package BS is new Ada.Strings.Bounded.Generic_Bounded_Length (300); + + function subset (super, sub : Trace_Attribute_Set) return Boolean is + begin + if + (super.Times or not sub.Times) and + (super.Tputs or not sub.Tputs) and + (super.Update or not sub.Update) and + (super.Cursor_Move or not sub.Cursor_Move) and + (super.Character_Output or not sub.Character_Output) and + (super.Calls or not sub.Calls) and + (super.Virtual_Puts or not sub.Virtual_Puts) and + (super.Input_Events or not sub.Input_Events) and + (super.TTY_State or not sub.TTY_State) and + (super.Internal_Calls or not sub.Internal_Calls) and + (super.Character_Calls or not sub.Character_Calls) and + (super.Termcap_TermInfo or not sub.Termcap_TermInfo) and + True + then + return True; + else + return False; + end if; + end subset; + + function trace_or (a, b : Trace_Attribute_Set) return Trace_Attribute_Set is + retval : Trace_Attribute_Set := Trace_Disable; + begin + retval.Times := (a.Times or b.Times); + retval.Tputs := (a.Tputs or b.Tputs); + retval.Update := (a.Update or b.Update); + retval.Cursor_Move := (a.Cursor_Move or b.Cursor_Move); + retval.Character_Output := (a.Character_Output or b.Character_Output); + retval.Calls := (a.Calls or b.Calls); + retval.Virtual_Puts := (a.Virtual_Puts or b.Virtual_Puts); + retval.Input_Events := (a.Input_Events or b.Input_Events); + retval.TTY_State := (a.TTY_State or b.TTY_State); + retval.Internal_Calls := (a.Internal_Calls or b.Internal_Calls); + retval.Character_Calls := (a.Character_Calls or b.Character_Calls); + retval.Termcap_TermInfo := (a.Termcap_TermInfo or b.Termcap_TermInfo); + + return retval; + end trace_or; + + -- Print the hexadecimal value of the mask so + -- users can set it from the command line. + + function trace_num (tlevel : Trace_Attribute_Set) return String is + result : Integer := 0; + m : Integer := 1; + begin + + if tlevel.Times then + result := result + m; + end if; + m := m * 2; + + if tlevel.Tputs then + result := result + m; + end if; + m := m * 2; + + if tlevel.Update then + result := result + m; + end if; + m := m * 2; + + if tlevel.Cursor_Move then + result := result + m; + end if; + m := m * 2; + + if tlevel.Character_Output then + result := result + m; + end if; + m := m * 2; + + if tlevel.Calls then + result := result + m; + end if; + m := m * 2; + + if tlevel.Virtual_Puts then + result := result + m; + end if; + m := m * 2; + + if tlevel.Input_Events then + result := result + m; + end if; + m := m * 2; + + if tlevel.TTY_State then + result := result + m; + end if; + m := m * 2; + + if tlevel.Internal_Calls then + result := result + m; + end if; + m := m * 2; + + if tlevel.Character_Calls then + result := result + m; + end if; + m := m * 2; + + if tlevel.Termcap_TermInfo then + result := result + m; + end if; + m := m * 2; + return result'Img; + end trace_num; + + function tracetrace (tlevel : Trace_Attribute_Set) return String is + + use BS; + buf : Bounded_String := To_Bounded_String (""); + begin + -- The C version prints the hexadecimal value of the mask, we + -- won't do that here because this is Ada. + + if tlevel = Trace_Disable then + Append (buf, "Trace_Disable"); + else + + if subset (tlevel, + Trace_Attribute_Set'(Times => True, others => False)) + then + Append (buf, "Times"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Tputs => True, others => False)) + then + Append (buf, "Tputs"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Update => True, others => False)) + then + Append (buf, "Update"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Cursor_Move => True, + others => False)) + then + Append (buf, "Cursor_Move"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Character_Output => True, + others => False)) + then + Append (buf, "Character_Output"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Ordinary) + then + Append (buf, "Ordinary"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Calls => True, others => False)) + then + Append (buf, "Calls"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Virtual_Puts => True, + others => False)) + then + Append (buf, "Virtual_Puts"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Input_Events => True, + others => False)) + then + Append (buf, "Input_Events"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(TTY_State => True, + others => False)) + then + Append (buf, "TTY_State"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Internal_Calls => True, + others => False)) + then + Append (buf, "Internal_Calls"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Character_Calls => True, + others => False)) + then + Append (buf, "Character_Calls"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Attribute_Set'(Termcap_TermInfo => True, + others => False)) + then + Append (buf, "Termcap_TermInfo"); + Append (buf, ", "); + end if; + + if subset (tlevel, + Trace_Maximum) + then + Append (buf, "Maximum"); + Append (buf, ", "); + end if; + end if; + + if To_String (buf) (Length (buf) - 1) = ',' then + Delete (buf, Length (buf) - 1, Length (buf)); + end if; + + return To_String (buf); + end tracetrace; + + function run_trace_menu (m : Menu; count : Integer) return Boolean is + i, p : Item; + changed : Boolean; + c, v : Key_Code; + begin + loop + changed := (count /= 0); + c := Getchar (Get_Window (m)); + v := menu_virtualize (c); + case Driver (m, v) is + when Unknown_Request => + return False; + when others => + i := Current (m); + if i = Menus.Items (m, 1) then -- the first item + for n in t_tbl'First + 1 .. t_tbl'Last loop + if Value (i) then + Set_Value (i, False); + changed := True; + end if; + end loop; + else + for n in t_tbl'First + 1 .. t_tbl'Last loop + p := Menus.Items (m, n); + if Value (p) then + Set_Value (Menus.Items (m, 1), False); + changed := True; + exit; + end if; + end loop; + end if; + if not changed then + return True; + end if; + end case; + end loop; + end run_trace_menu; + + nc_tracing, mask : Trace_Attribute_Set; + pragma Import (C, nc_tracing, "_nc_tracing"); + items_a : constant Item_Array_Access := + new Item_Array (t_tbl'First .. t_tbl'Last + 1); + mrows : Line_Count; + mcols : Column_Count; + menuwin : Window; + menu_y : constant Line_Position := 8; + menu_x : constant Column_Position := 8; + ip : Item; + m : Menu; + count : Integer; + newtrace : Trace_Attribute_Set; +begin + Add (Line => 0, Column => 0, Str => "Interactively set trace level:"); + Add (Line => 2, Column => 0, + Str => " Press space bar to toggle a selection."); + Add (Line => 3, Column => 0, + Str => " Use up and down arrow to move the select bar."); + Add (Line => 4, Column => 0, + Str => " Press return to set the trace level."); + Add (Line => 6, Column => 0, Str => "(Current trace level is "); + Add (Str => tracetrace (nc_tracing) & " numerically: " & + trace_num (nc_tracing)); + Add (Ch => ')'); + + Refresh; + + for n in t_tbl'Range loop + items_a.all (n) := New_Item (t_tbl (n).name.all); + end loop; + items_a.all (t_tbl'Last + 1) := Null_Item; + + m := New_Menu (items_a); + + Set_Format (m, 16, 2); + Scale (m, mrows, mcols); + + Switch_Options (m, (One_Valued => True, others => False), On => False); + menuwin := New_Window (mrows + 2, mcols + 2, menu_y, menu_x); + Set_Window (m, menuwin); + Set_KeyPad_Mode (menuwin, SwitchOn => True); + Box (menuwin); + + Set_Sub_Window (m, Derived_Window (menuwin, mrows, mcols, 1, 1)); + + Post (m); + + for n in t_tbl'Range loop + ip := Items (m, n); + mask := t_tbl (n).mask; + if mask = Trace_Disable then + Set_Value (ip, nc_tracing = Trace_Disable); + elsif subset (sub => mask, super => nc_tracing) then + Set_Value (ip, True); + end if; + end loop; + + count := 1; + while run_trace_menu (m, count) loop + count := count + 1; + end loop; + + newtrace := Trace_Disable; + for n in t_tbl'Range loop + ip := Items (m, n); + if Value (ip) then + mask := t_tbl (n).mask; + newtrace := trace_or (newtrace, mask); + end if; + end loop; + + Trace_On (newtrace); + Trace_Put ("trace level interactively set to " & + tracetrace (nc_tracing)); + + Move_Cursor (Line => Lines - 4, Column => 0); + Add (Str => "Trace level is "); + Add (Str => tracetrace (nc_tracing)); + Add (Ch => newl); + Pause; -- was just Add(); Getchar + + Post (m, False); + -- menuwin has subwindows I think, which makes an error. + declare begin + Delete (menuwin); + exception when Curses_Exception => null; end; + + -- free_menu(m); + -- free_item() +end ncurses2.trace_set; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-trace_set.ads b/contrib/ncurses/Ada95/samples/ncurses2-trace_set.ads new file mode 100644 index 00000000..352736c9 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-trace_set.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses2.trace_set -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure ncurses2.trace_set; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-util.adb b/contrib/ncurses/Ada95/samples/ncurses2-util.adb new file mode 100644 index 00000000..152a5d37 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-util.adb @@ -0,0 +1,186 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses2.util -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2008,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.10 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; use Ada.Text_IO; + +with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace; + +with Interfaces.C; +with Interfaces.C.Strings; + +with Ada.Characters.Handling; + +with ncurses2.genericPuts; + +package body ncurses2.util is + + -- #defines from C + -- #define CTRL(x) ((x) & 0x1f) + function CTRL (c : Character) return Key_Code is + begin + return Character'Pos (c) mod 16#20#; + -- uses a property of ASCII + -- A = 16#41#; a = 16#61#; ^A = 1 or 16#1# + end CTRL; + + function CTRL (c : Character) return Character is + begin + return Character'Val (Character'Pos (c) mod 16#20#); + -- uses a property of ASCII + -- A = 16#41#; a = 16#61#; ^A = 1 or 16#1# + end CTRL; + + save_trace : Trace_Attribute_Set; + -- Common function to allow ^T to toggle trace-mode in the middle of a test + -- so that trace-files can be made smaller. + function Getchar (win : Window := Standard_Window) return Key_Code is + c : Key_Code; + begin + -- #ifdef TRACE + c := Get_Keystroke (win); + while c = CTRL ('T') loop + -- if _nc_tracing in C + if Current_Trace_Setting /= Trace_Disable then + save_trace := Current_Trace_Setting; + Trace_Put ("TOGGLE-TRACING OFF"); + Current_Trace_Setting := Trace_Disable; + else + Current_Trace_Setting := save_trace; + end if; + Trace_On (Current_Trace_Setting); + if Current_Trace_Setting /= Trace_Disable then + Trace_Put ("TOGGLE-TRACING ON"); + end if; + end loop; + -- #else c := Get_Keystroke; + return c; + end Getchar; + + procedure Getchar (win : Window := Standard_Window) is + begin + if Getchar (win) < 0 then + Beep; + end if; + end Getchar; + + procedure Pause is + begin + Move_Cursor (Line => Lines - 1, Column => 0); + Add (Str => "Press any key to continue... "); + Getchar; + end Pause; + + procedure Cannot (s : String) is + use Interfaces.C; + use Interfaces.C.Strings; + function getenv (x : char_array) return chars_ptr; + pragma Import (C, getenv, "getenv"); + tmp1 : char_array (0 .. 10); + package p is new ncurses2.genericPuts (1024); + use p; + use p.BS; + + tmpb : BS.Bounded_String; + + Length : size_t; + begin + To_C ("TERM", tmp1, Length); + Fill_String (getenv (tmp1), tmpb); + Add (Ch => newl); + myAdd (Str => "This " & tmpb & " terminal " & s); + Pause; + end Cannot; + + procedure ShellOut (message : Boolean) is + use Interfaces.C; + Txt : char_array (0 .. 10); + Length : size_t; + procedure system (x : char_array); + pragma Import (C, system, "system"); + begin + To_C ("sh", Txt, Length); + if message then + Add (Str => "Shelling out..."); + end if; + Save_Curses_Mode (Mode => Curses); + End_Windows; + system (Txt); + if message then + Add (Str => "returned from shellout."); + Add (Ch => newl); + end if; + Refresh; + end ShellOut; + + function Is_Digit (c : Key_Code) return Boolean is + begin + if c >= 16#100# then + return False; + else + return Ada.Characters.Handling.Is_Digit (Character'Val (c)); + end if; + end Is_Digit; + + procedure P (s : String) is + begin + Add (Str => s); + Add (Ch => newl); + end P; + + function Code_To_Char (c : Key_Code) return Character is + begin + if c > Character'Pos (Character'Last) then + return Character'Val (0); + -- maybe raise exception? + else + return Character'Val (c); + end if; + end Code_To_Char; + + -- This was untestable due to a bug in GNAT (3.12p) + -- Hmm, what bug? I don't remember. + function ctoi (c : Character) return Integer is + begin + return Character'Pos (c) - Character'Pos ('0'); + end ctoi; + +end ncurses2.util; diff --git a/contrib/ncurses/Ada95/samples/ncurses2-util.ads b/contrib/ncurses/Ada95/samples/ncurses2-util.ads new file mode 100644 index 00000000..5d71d73a --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2-util.ads @@ -0,0 +1,77 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses2.util -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.3 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +with Ada.Text_IO; +package ncurses2.util is + + Blank : constant Character := ' '; + Blank2 : constant Attributed_Character := + (Ch => Blank, Attr => Normal_Video, Color => Color_Pair'First); + + newl : constant Character := Character'Val (10); + + function CTRL (c : Character) return Key_Code; + + function CTRL (c : Character) return Character; + + function Getchar (win : Window := Standard_Window) return Key_Code; + + procedure Getchar (win : Window := Standard_Window); + + procedure Pause; + + procedure Cannot (s : String); + + procedure ShellOut (message : Boolean); + + package Int_IO is new Ada.Text_IO.Integer_IO (Integer); + + function Is_Digit (c : Key_Code) return Boolean; + + procedure P (s : String); + + function Code_To_Char (c : Key_Code) return Character; + function ctoi (c : Character) return Integer; + +end ncurses2.util; diff --git a/contrib/ncurses/Ada95/samples/ncurses2.ads b/contrib/ncurses/Ada95/samples/ncurses2.ads new file mode 100644 index 00000000..42e66f30 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/ncurses2.ads @@ -0,0 +1,45 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- ncurses -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Eugene V. Melaragno 2000 +-- Version Control +-- $Revision: 1.2 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +package ncurses2 is + pragma Pure (ncurses2); +end ncurses2; diff --git a/contrib/ncurses/Ada95/samples/rain.adb b/contrib/ncurses/Ada95/samples/rain.adb new file mode 100644 index 00000000..2649252a --- /dev/null +++ b/contrib/ncurses/Ada95/samples/rain.adb @@ -0,0 +1,180 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Rain -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2007,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Laurent Pautet +-- Modified by: Juergen Pfeifer, 1997 +-- Version Control +-- $Revision: 1.9 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- -- +with ncurses2.util; use ncurses2.util; +with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random; +with Status; use Status; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +procedure Rain is + + Visibility : Cursor_Visibility; + + subtype X_Position is Line_Position; + subtype Y_Position is Column_Position; + + Xpos : array (1 .. 5) of X_Position; + Ypos : array (1 .. 5) of Y_Position; + + done : Boolean; + + c : Key_Code; + + N : Integer; + + G : Generator; + + Max_X, X : X_Position; + Max_Y, Y : Y_Position; + + procedure Next (J : in out Integer); + procedure Cursor (X : X_Position; Y : Y_Position); + + procedure Next (J : in out Integer) is + begin + if J = 5 then + J := 1; + else + J := J + 1; + end if; + end Next; + + procedure Cursor (X : X_Position; Y : Y_Position) is + begin + Move_Cursor (Line => X, Column => Y); + end Cursor; + pragma Inline (Cursor); + +begin + + Init_Screen; + Set_NL_Mode; + Set_Echo_Mode (False); + + Visibility := Invisible; + Set_Cursor_Visibility (Visibility); + Set_Timeout_Mode (Standard_Window, Non_Blocking, 0); + + Max_X := Lines - 5; + Max_Y := Columns - 5; + + for I in Xpos'Range loop + Xpos (I) := X_Position (Float (Max_X) * Random (G)) + 2; + Ypos (I) := Y_Position (Float (Max_Y) * Random (G)) + 2; + end loop; + + N := 1; + done := False; + while not done and Process.Continue loop + + X := X_Position (Float (Max_X) * Random (G)) + 2; + Y := Y_Position (Float (Max_Y) * Random (G)) + 2; + + Cursor (X, Y); + Add (Ch => '.'); + + Cursor (Xpos (N), Ypos (N)); + Add (Ch => 'o'); + + -- + Next (N); + Cursor (Xpos (N), Ypos (N)); + Add (Ch => 'O'); + + -- + Next (N); + Cursor (Xpos (N) - 1, Ypos (N)); + Add (Ch => '-'); + Cursor (Xpos (N), Ypos (N) - 1); + Add (Str => "|.|"); + Cursor (Xpos (N) + 1, Ypos (N)); + Add (Ch => '-'); + + -- + Next (N); + Cursor (Xpos (N) - 2, Ypos (N)); + Add (Ch => '-'); + Cursor (Xpos (N) - 1, Ypos (N) - 1); + Add (Str => "/\\"); + Cursor (Xpos (N), Ypos (N) - 2); + Add (Str => "| O |"); + Cursor (Xpos (N) + 1, Ypos (N) - 1); + Add (Str => "\\/"); + Cursor (Xpos (N) + 2, Ypos (N)); + Add (Ch => '-'); + + -- + Next (N); + Cursor (Xpos (N) - 2, Ypos (N)); + Add (Ch => ' '); + Cursor (Xpos (N) - 1, Ypos (N) - 1); + Add (Str => " "); + Cursor (Xpos (N), Ypos (N) - 2); + Add (Str => " "); + Cursor (Xpos (N) + 1, Ypos (N) - 1); + Add (Str => " "); + Cursor (Xpos (N) + 2, Ypos (N)); + Add (Ch => ' '); + + Xpos (N) := X; + Ypos (N) := Y; + + c := Getchar; + case c is + when Character'Pos ('q') => done := True; + when Character'Pos ('Q') => done := True; + when Character'Pos ('s') => Set_NoDelay_Mode (Standard_Window, False); + when Character'Pos (' ') => Set_NoDelay_Mode (Standard_Window, True); + when others => null; + end case; + + Nap_Milli_Seconds (50); + end loop; + + Visibility := Normal; + Set_Cursor_Visibility (Visibility); + End_Windows; + Curses_Free_All; + +end Rain; diff --git a/contrib/ncurses/Ada95/samples/rain.ads b/contrib/ncurses/Ada95/samples/rain.ads new file mode 100644 index 00000000..20ec0651 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/rain.ads @@ -0,0 +1,44 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Rain -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Laurent Pautet +-- Modified by: Juergen Pfeifer, 1997 +-- Version Control +-- $Revision: 1.8 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- -- +procedure Rain; diff --git a/contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.adb b/contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.adb new file mode 100644 index 00000000..ed937116 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.adb @@ -0,0 +1,123 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Curses_Demo.Attributes -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.14 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Explanation; use Sample.Explanation; + +package body Sample.Curses_Demo.Attributes is + + procedure Demo + is + P : Panel := Create (Standard_Window); + K : Real_Key_Code; + begin + Set_Meta_Mode; + Set_KeyPad_Mode; + + Top (P); + + Push_Environment ("ATTRIBDEMO"); + Default_Labels; + Notepad ("ATTRIB-PAD00"); + + Set_Character_Attributes (Attr => (others => False)); + Add (Line => 1, Column => Columns / 2 - 10, + Str => "This is NORMAL"); + + Set_Character_Attributes (Attr => (Stand_Out => True, + others => False)); + Add (Line => 2, Column => Columns / 2 - 10, + Str => "This is Stand_Out"); + + Set_Character_Attributes (Attr => (Under_Line => True, + others => False)); + Add (Line => 3, Column => Columns / 2 - 10, + Str => "This is Under_Line"); + + Set_Character_Attributes (Attr => (Reverse_Video => True, + others => False)); + Add (Line => 4, Column => Columns / 2 - 10, + Str => "This is Reverse_Video"); + + Set_Character_Attributes (Attr => (Blink => True, + others => False)); + Add (Line => 5, Column => Columns / 2 - 10, + Str => "This is Blink"); + + Set_Character_Attributes (Attr => (Dim_Character => True, + others => False)); + Add (Line => 6, Column => Columns / 2 - 10, + Str => "This is Dim_Character"); + + Set_Character_Attributes (Attr => (Bold_Character => True, + others => False)); + Add (Line => 7, Column => Columns / 2 - 10, + Str => "This is Bold_Character"); + + Refresh_Without_Update; + Update_Panels; Update_Screen; + + loop + K := Get_Key; + if K in Special_Key_Code'Range then + case K is + when QUIT_CODE => exit; + when HELP_CODE => Explain_Context; + when EXPLAIN_CODE => Explain ("ATTRIBKEYS"); + when others => null; + end case; + end if; + end loop; + + Pop_Environment; + Clear; + Refresh_Without_Update; + Delete (P); + Update_Panels; Update_Screen; + + end Demo; + +end Sample.Curses_Demo.Attributes; diff --git a/contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.ads b/contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.ads new file mode 100644 index 00000000..636c12f3 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-curses_demo-attributes.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Curses_Demo.Attributes -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample.Curses_Demo.Attributes is + + procedure Demo; + +end Sample.Curses_Demo.Attributes; diff --git a/contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.adb b/contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.adb new file mode 100644 index 00000000..d388e4c8 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.adb @@ -0,0 +1,221 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Curses_Demo.Mouse -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.17 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse; +with Terminal_Interface.Curses.Text_IO; use Terminal_Interface.Curses.Text_IO; +with Terminal_Interface.Curses.Text_IO.Integer_IO; +with Terminal_Interface.Curses.Text_IO.Enumeration_IO; + +with Sample.Helpers; use Sample.Helpers; +with Sample.Manifest; use Sample.Manifest; +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Explanation; use Sample.Explanation; + +package body Sample.Curses_Demo.Mouse is + + package Int_IO is new + Terminal_Interface.Curses.Text_IO.Integer_IO (Integer); + use Int_IO; + + package Button_IO is new + Terminal_Interface.Curses.Text_IO.Enumeration_IO (Mouse_Button); + use Button_IO; + + package State_IO is new + Terminal_Interface.Curses.Text_IO.Enumeration_IO (Button_State); + use State_IO; + + procedure Demo is + + type Controls is array (1 .. 3) of Panel; + + Frame : Window; + Msg : Window; + Ctl : Controls; + Pan : Panel; + K : Real_Key_Code; + V : Cursor_Visibility := Invisible; + W : Window; + Note : Window; + Msg_L : constant Line_Count := 8; + Lins : Line_Position := Lines; + Cols : Column_Position; + Mask : Event_Mask; + procedure Show_Mouse_Event; + + procedure Show_Mouse_Event + is + Evt : constant Mouse_Event := Get_Mouse; + Y : Line_Position; + X : Column_Position; + Button : Mouse_Button; + State : Button_State; + W : Window; + begin + Get_Event (Evt, Y, X, Button, State); + Put (Msg, "Event at"); + Put (Msg, " X="); Put (Msg, Integer (X), 3); + Put (Msg, ", Y="); Put (Msg, Integer (Y), 3); + Put (Msg, ", Btn="); Put (Msg, Button, 10); + Put (Msg, ", Stat="); Put (Msg, State, 15); + for I in Ctl'Range loop + W := Get_Window (Ctl (I)); + if Enclosed_In_Window (W, Evt) then + Transform_Coordinates (W, Y, X, From_Screen); + Put (Msg, ",Box("); + Put (Msg, (I), 1); Put (Msg, ","); + Put (Msg, Integer (Y), 1); Put (Msg, ","); + Put (Msg, Integer (X), 1); Put (Msg, ")"); + end if; + end loop; + New_Line (Msg); + Flush (Msg); + Update_Panels; Update_Screen; + end Show_Mouse_Event; + + begin + Push_Environment ("MOUSE00"); + Notepad ("MOUSE-PAD00"); + Default_Labels; + Set_Cursor_Visibility (V); + + Note := Notepad_Window; + if Note /= Null_Window then + Get_Window_Position (Note, Lins, Cols); + end if; + Frame := Create (Msg_L, Columns, Lins - Msg_L, 0); + if Has_Colors then + Set_Background (Win => Frame, + Ch => (Color => Default_Colors, + Attr => Normal_Video, + Ch => ' ')); + Set_Character_Attributes (Win => Frame, + Attr => Normal_Video, + Color => Default_Colors); + Erase (Frame); + end if; + Msg := Derived_Window (Frame, Msg_L - 2, Columns - 2, 1, 1); + Pan := Create (Frame); + + Set_Meta_Mode; + Set_KeyPad_Mode; + Mask := Start_Mouse; + + Box (Frame); + Window_Title (Frame, "Mouse Protocol"); + Refresh_Without_Update (Frame); + Allow_Scrolling (Msg, True); + + declare + Middle_Column : constant Integer := Integer (Columns) / 2; + Middle_Index : constant Natural := Ctl'First + (Ctl'Length / 2); + Width : constant Column_Count := 5; + Height : constant Line_Count := 3; + Half : constant Column_Count := Width / 2; + Space : constant Column_Count := 3; + Position : Integer; + W : Window; + begin + for I in Ctl'Range loop + Position := ((I) - Integer (Middle_Index)) * + Integer (Half + Space + Width) + Middle_Column; + W := Create (Height, + Width, + 1, + Column_Position (Position)); + if Has_Colors then + Set_Background (Win => W, + Ch => (Color => Menu_Back_Color, + Attr => Normal_Video, + Ch => ' ')); + Set_Character_Attributes (Win => W, + Attr => Normal_Video, + Color => Menu_Fore_Color); + Erase (W); + end if; + Ctl (I) := Create (W); + Box (W); + Move_Cursor (W, 1, Half); + Put (W, (I), 1); + Refresh_Without_Update (W); + end loop; + end; + + Update_Panels; Update_Screen; + + loop + K := Get_Key; + if K in Special_Key_Code'Range then + case K is + when QUIT_CODE => exit; + when HELP_CODE => Explain_Context; + when EXPLAIN_CODE => Explain ("MOUSEKEYS"); + when Key_Mouse => Show_Mouse_Event; + when others => null; + end case; + end if; + end loop; + + for I in Ctl'Range loop + W := Get_Window (Ctl (I)); + Clear (W); + Delete (Ctl (I)); + Delete (W); + end loop; + + Clear (Frame); + Delete (Pan); + Delete (Msg); + Delete (Frame); + + Set_Cursor_Visibility (V); + End_Mouse (Mask); + + Pop_Environment; + Update_Panels; Update_Screen; + + end Demo; + +end Sample.Curses_Demo.Mouse; diff --git a/contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.ads b/contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.ads new file mode 100644 index 00000000..fbaebab6 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-curses_demo-mouse.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Curses_Demo.Mouse -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample.Curses_Demo.Mouse is + + procedure Demo; + +end Sample.Curses_Demo.Mouse; diff --git a/contrib/ncurses/Ada95/samples/sample-curses_demo.adb b/contrib/ncurses/Ada95/samples/sample-curses_demo.adb new file mode 100644 index 00000000..f342a325 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-curses_demo.adb @@ -0,0 +1,144 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Curses_Demo -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2004,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.18 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus; +with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Panels.User_Data; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Helpers; use Sample.Helpers; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; + +with Sample.Explanation; use Sample.Explanation; + +with Sample.Menu_Demo.Handler; +with Sample.Curses_Demo.Mouse; +with Sample.Curses_Demo.Attributes; + +package body Sample.Curses_Demo is + + type User_Data is new Integer; + type User_Data_Access is access all User_Data; + package PUD is new Panels.User_Data (User_Data, User_Data_Access); + -- We use above instantiation of the generic User_Data package to + -- demonstrate and test the use of the user data mechanism. + + procedure Demo + is + function My_Driver (M : Menu; + K : Key_Code; + Pan : Panel) return Boolean; + package Mh is new Sample.Menu_Demo.Handler (My_Driver); + + Itm : Item_Array_Access := new Item_Array' + (New_Item ("Attributes Demo"), + New_Item ("Mouse Demo"), + Null_Item); + M : Menu := New_Menu (Itm); + U1 : constant User_Data_Access := new User_Data'(4711); + U2 : User_Data_Access; + + function My_Driver (M : Menu; + K : Key_Code; + Pan : Panel) return Boolean + is + Idx : constant Positive := Get_Index (Current (M)); + Result : Boolean := False; + begin + PUD.Set_User_Data (Pan, U1); -- set some user data, just for fun + if K in User_Key_Code'Range then + if K = QUIT then + Result := True; + elsif K = SELECT_ITEM then + if Idx in Itm'Range then + Hide (Pan); + Update_Panels; + end if; + case Idx is + when 1 => Sample.Curses_Demo.Attributes.Demo; + when 2 => Sample.Curses_Demo.Mouse.Demo; + when others => Not_Implemented; + end case; + if Idx in Itm'Range then + Top (Pan); + Show (Pan); + Update_Panels; + Update_Screen; + end if; + end if; + end if; + PUD.Get_User_Data (Pan, U2); -- get the user data + pragma Assert (U1.all = U2.all and then U1 = U2); + return Result; + end My_Driver; + + begin + + if (1 + Item_Count (M)) /= Itm'Length then + raise Constraint_Error; + end if; + + if not Has_Mouse then + declare + O : Item_Option_Set; + begin + Get_Options (Itm.all (2), O); + O.Selectable := False; + Set_Options (Itm.all (2), O); + end; + end if; + + Push_Environment ("CURSES00"); + Notepad ("CURSES-PAD00"); + Default_Labels; + Refresh_Soft_Label_Keys_Without_Update; + + Mh.Drive_Me (M, " Demo "); + Pop_Environment; + + Delete (M); + Free (Itm, True); + end Demo; + +end Sample.Curses_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-curses_demo.ads b/contrib/ncurses/Ada95/samples/sample-curses_demo.ads new file mode 100644 index 00000000..264c4c01 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-curses_demo.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Curses_Demo -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample.Curses_Demo is + + procedure Demo; + +end Sample.Curses_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-explanation.adb_p b/contrib/ncurses/Ada95/samples/sample-explanation.adb_p new file mode 100644 index 00000000..f99ceb6f --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-explanation.adb_p @@ -0,0 +1,441 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Explanation -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2019,2020 Thomas E. Dickey -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.5 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- Poor mans help system. This scans a sequential file for key lines and +-- then reads the lines up to the next key. Those lines are presented in +-- a window as help or explanation. +-- +with Ada.Text_IO; use Ada.Text_IO; +with Ada.Unchecked_Deallocation; +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; + +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Manifest; use Sample.Manifest; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Helpers; use Sample.Helpers; + +package body Sample.Explanation is + + Help_Keys : constant String := "HELPKEYS"; + In_Help : constant String := "INHELP"; + + File_Name : constant String := "explain.txt"; + F : File_Type; + + type Help_Line; + type Help_Line_Access is access Help_Line; + pragma Controlled (Help_Line_Access); + type String_Access is access String; + pragma Controlled (String_Access); + + type Help_Line is + record + Prev, Next : Help_Line_Access; + Line : String_Access; + end record; + + procedure Explain (Key : String; + Win : Window); + + procedure Release_String is + new Ada.Unchecked_Deallocation (String, + String_Access); + procedure Release_Help_Line is + new Ada.Unchecked_Deallocation (Help_Line, + Help_Line_Access); + + function Search (Key : String) return Help_Line_Access; + procedure Release_Help (Root : in out Help_Line_Access); + + function Check_File (Name : String) return Boolean; + + procedure Explain (Key : String) + is + begin + Explain (Key, Null_Window); + end Explain; + + procedure Explain (Key : String; + Win : Window) + is + -- Retrieve the text associated with this key and display it in this + -- window. If no window argument is passed, the routine will create + -- a temporary window and use it. + + function Filter_Key return Real_Key_Code; + procedure Unknown_Key; + procedure Redo; + procedure To_Window (C : in out Help_Line_Access; + More : in out Boolean); + + Frame : Window := Null_Window; + + W : Window := Win; + K : Real_Key_Code; + P : Panel; + + Height : Line_Count; + Width : Column_Count; + Help : Help_Line_Access := Search (Key); + Current : Help_Line_Access; + Top_Line : Help_Line_Access; + + Has_More : Boolean := True; + + procedure Unknown_Key + is + begin + Add (W, "Help message with ID "); + Add (W, Key); + Add (W, " not found."); + Add (W, Character'Val (10)); + Add (W, "Press the Function key labeled 'Quit' key to continue."); + end Unknown_Key; + + procedure Redo + is + H : Help_Line_Access := Top_Line; + begin + if Top_Line /= null then + for L in 0 .. (Height - 1) loop + Add (W, L, 0, H.all.Line.all); + exit when H.all.Next = null; + H := H.all.Next; + end loop; + else + Unknown_Key; + end if; + end Redo; + + function Filter_Key return Real_Key_Code + is + K : Real_Key_Code; + begin + loop + K := Get_Key (W); + if K in Special_Key_Code'Range then + case K is + when HELP_CODE => + if not Find_Context (In_Help) then + Push_Environment (In_Help, False); + Explain (In_Help, W); + Pop_Environment; + Redo; + end if; + when EXPLAIN_CODE => + if not Find_Context (Help_Keys) then + Push_Environment (Help_Keys, False); + Explain (Help_Keys, W); + Pop_Environment; + Redo; + end if; + when others => exit; + end case; + else + exit; + end if; + end loop; + return K; + end Filter_Key; + + procedure To_Window (C : in out Help_Line_Access; + More : in out Boolean) + is + L : Line_Position := 0; + begin + loop + Add (W, L, 0, C.all.Line.all); + L := L + 1; + exit when C.all.Next = null or else L = Height; + C := C.all.Next; + end loop; + if C.all.Next /= null then + pragma Assert (L = Height); + More := True; + else + More := False; + end if; + end To_Window; + + begin + if W = Null_Window then + Push_Environment ("HELP"); + Default_Labels; + Frame := New_Window (Lines - 2, Columns, 0, 0); + if Has_Colors then + Set_Background (Win => Frame, + Ch => (Ch => ' ', + Color => Help_Color, + Attr => Normal_Video)); + Set_Character_Attributes (Win => Frame, + Attr => Normal_Video, + Color => Help_Color); + Erase (Frame); + end if; + Box (Frame); + Set_Character_Attributes (Frame, (Reverse_Video => True, + others => False)); + Add (Frame, Lines - 3, 2, "Cursor Up/Down scrolls"); + Set_Character_Attributes (Frame); -- Back to default. + Window_Title (Frame, "Explanation"); + W := Derived_Window (Frame, Lines - 4, Columns - 2, 1, 1); + Refresh_Without_Update (Frame); + Get_Size (W, Height, Width); + Set_Meta_Mode (W); + Set_KeyPad_Mode (W); + Allow_Scrolling (W, True); + Set_Echo_Mode (False); + P := Create (Frame); + Top (P); + Update_Panels; + else + Clear (W); + Refresh_Without_Update (W); + end if; + + Current := Help; Top_Line := Help; + + if null = Help then + Unknown_Key; + loop + K := Filter_Key; + exit when K = QUIT_CODE; + end loop; + else + To_Window (Current, Has_More); + if Has_More then + -- This means there are more lines available, so we have to go + -- into a scroll manager. + loop + K := Filter_Key; + if K in Special_Key_Code'Range then + case K is + when Key_Cursor_Down => + if Current.all.Next /= null then + Move_Cursor (W, Height - 1, 0); + Scroll (W, 1); + Current := Current.all.Next; + Top_Line := Top_Line.all.Next; + Add (W, Current.all.Line.all); + end if; + when Key_Cursor_Up => + if Top_Line.all.Prev /= null then + Move_Cursor (W, 0, 0); + Scroll (W, -1); + Top_Line := Top_Line.all.Prev; + Current := Current.all.Prev; + Add (W, Top_Line.all.Line.all); + end if; + when QUIT_CODE => exit; + when others => null; + end case; + end if; + end loop; + else + loop + K := Filter_Key; + exit when K = QUIT_CODE; + end loop; + end if; + end if; + + Clear (W); + + if Frame /= Null_Window then + Clear (Frame); + Delete (P); + Delete (W); + Delete (Frame); + Pop_Environment; + end if; + + Update_Panels; + Update_Screen; + + Release_Help (Help); + + end Explain; + + function Search (Key : String) return Help_Line_Access + is + Last : Natural; + Buffer : String (1 .. 256); + Root : Help_Line_Access := null; + Current : Help_Line_Access; + Tail : Help_Line_Access := null; + + function Next_Line return Boolean; + + function Next_Line return Boolean + is + H_End : constant String := "#END"; + begin + Get_Line (F, Buffer, Last); + if Last = H_End'Length and then H_End = Buffer (1 .. Last) then + return False; + else + return True; + end if; + end Next_Line; + begin + Reset (F); + Outer : + loop + exit Outer when not Next_Line; + if Last = (1 + Key'Length) + and then Key = Buffer (2 .. Last) + and then Buffer (1) = '#' + then + loop + exit when not Next_Line; + exit when Buffer (1) = '#'; + Current := new Help_Line'(null, null, + new String'(Buffer (1 .. Last))); + if Tail = null then + Release_Help (Root); + Root := Current; + else + Tail.all.Next := Current; + Current.all.Prev := Tail; + end if; + Tail := Current; + end loop; + exit Outer; + end if; + end loop Outer; + return Root; + end Search; + + procedure Release_Help (Root : in out Help_Line_Access) + is + Next : Help_Line_Access; + begin + loop + exit when Root = null; + Next := Root.all.Next; + Release_String (Root.all.Line); + Release_Help_Line (Root); + Root := Next; + end loop; + end Release_Help; + + procedure Explain_Context + is + begin + Explain (Context); + end Explain_Context; + + procedure Notepad (Key : String) + is + H : constant Help_Line_Access := Search (Key); + T : Help_Line_Access := H; + N : Line_Count := 1; + L : Line_Position := 0; + W : Window; + P : Panel; + begin + if H /= null then + loop + T := T.all.Next; + exit when T = null; + N := N + 1; + end loop; + W := New_Window (N + 2, Columns, Lines - N - 2, 0); + if Has_Colors then + Set_Background (Win => W, + Ch => (Ch => ' ', + Color => Notepad_Color, + Attr => Normal_Video)); + Set_Character_Attributes (Win => W, + Attr => Normal_Video, + Color => Notepad_Color); + Erase (W); + end if; + Box (W); + Window_Title (W, "Notepad"); + P := New_Panel (W); + T := H; + loop + Add (W, L + 1, 1, T.all.Line.all, Integer (Columns - 2)); + L := L + 1; + T := T.all.Next; + exit when T = null; + end loop; + T := H; + Release_Help (T); + Refresh_Without_Update (W); + Notepad_To_Context (P); + end if; + end Notepad; + + function Check_File (Name : String) return Boolean is + The_File : File_Type; + begin + Open (The_File, In_File, Name); + Close (The_File); + return True; + exception + when Name_Error => + return False; + end Check_File; + +begin + if Check_File + ($THIS_DATADIR + & File_Name) + then + Open (F, In_File, + $THIS_DATADIR + & File_Name); + elsif Check_File (File_Name) then + Open (F, In_File, File_Name); + else + Put_Line (Standard_Error, + "The file " + & File_Name + & " was not found in " + & $THIS_DATADIR + ); + raise Name_Error; + end if; +end Sample.Explanation; +-- vile:adamode diff --git a/contrib/ncurses/Ada95/samples/sample-explanation.ads b/contrib/ncurses/Ada95/samples/sample-explanation.ads new file mode 100644 index 00000000..6e955b4b --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-explanation.ads @@ -0,0 +1,60 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Explanation -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- Poor mans help system. This scans a sequential file for key lines and +-- then reads the lines up to the next key. Those lines are presented in +-- a window as help or explanation. +-- +package Sample.Explanation is + + procedure Explain (Key : String); + -- Retrieve the text associated with this key and display it. + + procedure Explain_Context; + -- Explain the current context. + + procedure Notepad (Key : String); + -- Put a note on the screen and maintain it with the context + + Explanation_Not_Found : exception; + Explanation_Error : exception; + +end Sample.Explanation; diff --git a/contrib/ncurses/Ada95/samples/sample-form_demo-aux.adb b/contrib/ncurses/Ada95/samples/sample-form_demo-aux.adb new file mode 100644 index 00000000..072b1871 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-form_demo-aux.adb @@ -0,0 +1,264 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Form_Demo.Aux -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2004,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.18 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Characters.Latin_1; use Ada.Characters.Latin_1; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Helpers; use Sample.Helpers; +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Explanation; use Sample.Explanation; + +package body Sample.Form_Demo.Aux is + + procedure Geometry (F : Form; + L : out Line_Count; -- Lines used for menu + C : out Column_Count; -- Columns used for menu + Y : out Line_Position; -- Proposed Line for menu + X : out Column_Position) -- Proposed Column for menu + is + begin + Scale (F, L, C); + + L := L + 2; -- count for frame at top and bottom + C := C + 2; -- " + + -- Calculate horizontal coordinate at the screen center + X := (Columns - C) / 2; + Y := 1; -- start always in line 1 + end Geometry; + + function Create (F : Form; + Title : String; + Lin : Line_Position; + Col : Column_Position) return Panel + is + W, S : Window; + L : Line_Count; + C : Column_Count; + Y : Line_Position; + X : Column_Position; + Pan : Panel; + begin + Geometry (F, L, C, Y, X); + W := New_Window (L, C, Lin, Col); + Set_Meta_Mode (W); + Set_KeyPad_Mode (W); + if Has_Colors then + Set_Background (Win => W, + Ch => (Ch => ' ', + Color => Default_Colors, + Attr => Normal_Video)); + Set_Character_Attributes (Win => W, + Color => Default_Colors, + Attr => Normal_Video); + Erase (W); + end if; + S := Derived_Window (W, L - 2, C - 2, 1, 1); + Set_Meta_Mode (S); + Set_KeyPad_Mode (S); + Box (W); + Set_Window (F, W); + Set_Sub_Window (F, S); + if Title'Length > 0 then + Window_Title (W, Title); + end if; + Pan := New_Panel (W); + Post (F); + return Pan; + end Create; + + procedure Destroy (F : Form; + P : in out Panel) + is + W, S : Window; + begin + W := Get_Window (F); + S := Get_Sub_Window (F); + Post (F, False); + Erase (W); + Delete (P); + Set_Window (F, Null_Window); + Set_Sub_Window (F, Null_Window); + Delete (S); + Delete (W); + Update_Panels; + end Destroy; + + function Get_Request (F : Form; + P : Panel; + Handle_CRLF : Boolean := True) return Key_Code + is + W : constant Window := Get_Window (F); + K : Real_Key_Code; + Ch : Character; + begin + Top (P); + loop + K := Get_Key (W); + if K in Special_Key_Code'Range then + case K is + when HELP_CODE => Explain_Context; + when EXPLAIN_CODE => Explain ("FORMKEYS"); + when Key_Home => return F_First_Field; + when Key_End => return F_Last_Field; + when QUIT_CODE => return QUIT; + when Key_Cursor_Down => return F_Down_Char; + when Key_Cursor_Up => return F_Up_Char; + when Key_Cursor_Left => return F_Previous_Char; + when Key_Cursor_Right => return F_Next_Char; + when Key_Next_Page => return F_Next_Page; + when Key_Previous_Page => return F_Previous_Page; + when Key_Backspace => return F_Delete_Previous; + when Key_Clear_Screen => return F_Clear_Field; + when Key_Clear_End_Of_Line => return F_Clear_EOF; + when others => return K; + end case; + elsif K in Normal_Key_Code'Range then + Ch := Character'Val (K); + case Ch is + when CAN => return QUIT; -- CTRL-X + + when ACK => return F_Next_Field; -- CTRL-F + when STX => return F_Previous_Field; -- CTRL-B + when FF => return F_Left_Field; -- CTRL-L + when DC2 => return F_Right_Field; -- CTRL-R + when NAK => return F_Up_Field; -- CTRL-U + when EOT => return F_Down_Field; -- CTRL-D + + when ETB => return F_Next_Word; -- CTRL-W + when DC4 => return F_Previous_Word; -- CTRL-T + + when SOH => return F_Begin_Field; -- CTRL-A + when ENQ => return F_End_Field; -- CTRL-E + + when HT => return F_Insert_Char; -- CTRL-I + when SI => return F_Insert_Line; -- CTRL-O + when SYN => return F_Delete_Char; -- CTRL-V + when BS => return F_Delete_Previous; -- CTRL-H + when EM => return F_Delete_Line; -- CTRL-Y + when BEL => return F_Delete_Word; -- CTRL-G + when VT => return F_Clear_EOF; -- CTRL-K + + when SO => return F_Next_Choice; -- CTRL-N + when DLE => return F_Previous_Choice; -- CTRL-P + + when CR | LF => + if Handle_CRLF then + return F_New_Line; + else + return K; + end if; + when others => return K; + end case; + else + return K; + end if; + end loop; + end Get_Request; + + function Make (Top : Line_Position; + Left : Column_Position; + Text : String) return Field + is + Fld : Field; + C : constant Column_Count := Column_Count (Text'Length); + begin + Fld := New_Field (1, C, Top, Left); + Set_Buffer (Fld, 0, Text); + Switch_Options (Fld, (Active => True, others => False), False); + if Has_Colors then + Set_Background (Fld => Fld, Color => Default_Colors); + end if; + return Fld; + end Make; + + function Make (Height : Line_Count := 1; + Width : Column_Count; + Top : Line_Position; + Left : Column_Position; + Off_Screen : Natural := 0) return Field + is + Fld : constant Field := New_Field (Height, Width, Top, Left, Off_Screen); + begin + if Has_Colors then + Set_Foreground (Fld => Fld, Color => Form_Fore_Color); + Set_Background (Fld => Fld, Color => Form_Back_Color); + else + Set_Background (Fld, (Reverse_Video => True, others => False)); + end if; + return Fld; + end Make; + + function Default_Driver (F : Form; + K : Key_Code; + P : Panel) return Boolean + is + begin + if P = Null_Panel then + raise Panel_Exception; + end if; + if K in User_Key_Code'Range and then K = QUIT then + if Driver (F, F_Validate_Field) = Form_Ok then + return True; + end if; + end if; + return False; + end Default_Driver; + + function Count_Active (F : Form) return Natural + is + N : Natural := 0; + O : Field_Option_Set; + H : constant Natural := Field_Count (F); + begin + if H > 0 then + for I in 1 .. H loop + Get_Options (Fields (F, I), O); + if O.Active then + N := N + 1; + end if; + end loop; + end if; + return N; + end Count_Active; + +end Sample.Form_Demo.Aux; diff --git a/contrib/ncurses/Ada95/samples/sample-form_demo-aux.ads b/contrib/ncurses/Ada95/samples/sample-form_demo-aux.ads new file mode 100644 index 00000000..7e7f2867 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-form_demo-aux.ads @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Form_Demo.Aux -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms; + +package Sample.Form_Demo.Aux is + + procedure Geometry (F : Form; + L : out Line_Count; + C : out Column_Count; + Y : out Line_Position; + X : out Column_Position); + -- Calculate the geometry for a panel being able to be used to display + -- the menu. + + function Create (F : Form; + Title : String; + Lin : Line_Position; + Col : Column_Position) return Panel; + -- Create a panel decorated with a frame and the title at the specified + -- position. The dimension of the panel is derived from the menus layout. + + procedure Destroy (F : Form; + P : in out Panel); + -- Destroy all the windowing structures associated with this menu and + -- panel. + + function Get_Request (F : Form; + P : Panel; + Handle_CRLF : Boolean := True) return Key_Code; + -- Centralized request driver for all menus in this sample. This + -- gives us a common key binding for all menus. + + function Make (Top : Line_Position; + Left : Column_Position; + Text : String) return Field; + -- create a label + + function Make (Height : Line_Count := 1; + Width : Column_Count; + Top : Line_Position; + Left : Column_Position; + Off_Screen : Natural := 0) return Field; + -- create a editable field + + function Default_Driver (F : Form; + K : Key_Code; + P : Panel) return Boolean; + + function Count_Active (F : Form) return Natural; + -- Count the number of active fields in the form + +end Sample.Form_Demo.Aux; diff --git a/contrib/ncurses/Ada95/samples/sample-form_demo-handler.adb b/contrib/ncurses/Ada95/samples/sample-form_demo-handler.adb new file mode 100644 index 00000000..d180b1d5 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-form_demo-handler.adb @@ -0,0 +1,99 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Form_Demo.Handler -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2004,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Sample.Form_Demo.Aux; + +package body Sample.Form_Demo.Handler is + + package Aux renames Sample.Form_Demo.Aux; + + procedure Drive_Me (F : Form; + Title : String := "") + is + L : Line_Count; + C : Column_Count; + Y : Line_Position; + X : Column_Position; + begin + Aux.Geometry (F, L, C, Y, X); + Drive_Me (F, Y, X, Title); + end Drive_Me; + + procedure Drive_Me (F : Form; + Lin : Line_Position; + Col : Column_Position; + Title : String := "") + is + Pan : Panel := Aux.Create (F, Title, Lin, Col); + V : Cursor_Visibility := Normal; + Handle_CRLF : Boolean := True; + + begin + Set_Cursor_Visibility (V); + if Aux.Count_Active (F) = 1 then + Handle_CRLF := False; + end if; + loop + declare + K : constant Key_Code := Aux.Get_Request (F, Pan, Handle_CRLF); + R : Driver_Result; + begin + if (K = 13 or else K = 10) and then not Handle_CRLF then + R := Unknown_Request; + else + R := Driver (F, K); + end if; + case R is + when Form_Ok => null; + when Unknown_Request => + if My_Driver (F, K, Pan) then + exit; + end if; + when others => Beep; + end case; + end; + end loop; + Set_Cursor_Visibility (V); + Aux.Destroy (F, Pan); + end Drive_Me; + +end Sample.Form_Demo.Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-form_demo-handler.ads b/contrib/ncurses/Ada95/samples/sample-form_demo-handler.ads new file mode 100644 index 00000000..8966e5bc --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-form_demo-handler.ads @@ -0,0 +1,65 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Form_Demo.Handler -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; +use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; +use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Forms; +use Terminal_Interface.Curses.Forms; + +generic + with function My_Driver (Frm : Form; + K : Key_Code; + Pan : Panel) return Boolean; +package Sample.Form_Demo.Handler is + + procedure Drive_Me (F : Form; + Lin : Line_Position; + Col : Column_Position; + Title : String := ""); + -- Position the menu at the given point and drive it. + + procedure Drive_Me (F : Form; + Title : String := ""); + -- Center menu and drive it. + +end Sample.Form_Demo.Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-form_demo.adb b/contrib/ncurses/Ada95/samples/sample-form_demo.adb new file mode 100644 index 00000000..72ca51c4 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-form_demo.adb @@ -0,0 +1,131 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Form_Demo -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.17 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms; +with Terminal_Interface.Curses.Forms.Field_User_Data; +with Sample.My_Field_Type; use Sample.My_Field_Type; +with Sample.Explanation; use Sample.Explanation; +with Sample.Form_Demo.Aux; use Sample.Form_Demo.Aux; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Form_Demo.Handler; + +with Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada; +with Terminal_Interface.Curses.Forms.Field_Types.Enumeration; +use Terminal_Interface.Curses.Forms.Field_Types.Enumeration; +with Terminal_Interface.Curses.Forms.Field_Types.IntField; +use Terminal_Interface.Curses.Forms.Field_Types.IntField; + +package body Sample.Form_Demo is + + type User_Data is + record + Data : Integer; + end record; + type User_Access is access User_Data; + + package Fld_U is new + Terminal_Interface.Curses.Forms.Field_User_Data (User_Data, + User_Access); + + type Weekday is (Sunday, Monday, Tuesday, Wednesday, Thursday, + Friday, Saturday); + + package Weekday_Enum is new + Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada (Weekday); + + Enum_Field : constant Enumeration_Field := + Weekday_Enum.Create; + + procedure Demo + is + + Mft : constant My_Data := (Ch => 'X'); + + FA : Field_Array_Access := new Field_Array' + (Make (0, 14, "Sample Entry Form"), + Make (2, 0, "WeekdayEnumeration"), + Make (2, 20, "Numeric 1-10"), + Make (2, 34, "Only 'X'"), + Make (5, 0, "Multiple Lines offscreen(Scroll)"), + Make (Width => 18, Top => 3, Left => 0), + Make (Width => 12, Top => 3, Left => 20), + Make (Width => 12, Top => 3, Left => 34), + Make (Width => 46, Top => 6, Left => 0, Height => 4, Off_Screen => 2), + Null_Field + ); + + Frm : Terminal_Interface.Curses.Forms.Form := Create (FA); + + I_F : constant Integer_Field := (Precision => 0, + Lower_Limit => 1, + Upper_Limit => 10); + + F1, F2 : User_Access; + + package Fh is new Sample.Form_Demo.Handler (Default_Driver); + + begin + Push_Environment ("FORM00"); + Notepad ("FORM-PAD00"); + Default_Labels; + + Set_Field_Type (FA.all (6), Enum_Field); + Set_Field_Type (FA.all (7), I_F); + Set_Field_Type (FA.all (8), Mft); + + F1 := new User_Data'(Data => 4711); + Fld_U.Set_User_Data (FA.all (1), F1); + + Fh.Drive_Me (Frm); + + Fld_U.Get_User_Data (FA.all (1), F2); + pragma Assert (F1 = F2); + pragma Assert (F1.Data = F2.Data); + + Pop_Environment; + Delete (Frm); + + Free (FA, True); + end Demo; + +end Sample.Form_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-form_demo.ads b/contrib/ncurses/Ada95/samples/sample-form_demo.ads new file mode 100644 index 00000000..0dda0711 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-form_demo.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Form_Demo -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample.Form_Demo is + + procedure Demo; + +end Sample.Form_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-function_key_setting.adb b/contrib/ncurses/Ada95/samples/sample-function_key_setting.adb new file mode 100644 index 00000000..6c5a804f --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-function_key_setting.adb @@ -0,0 +1,215 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Function_Key_Setting -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.16 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Unchecked_Deallocation; +with Sample.Manifest; use Sample.Manifest; + +-- This package implements a simple stack of function key label environments. +-- +package body Sample.Function_Key_Setting is + + Max_Label_Length : constant Positive := 8; + Number_Of_Keys : Label_Number := Label_Number'Last; + Justification : Label_Justification := Left; + + subtype Label is String (1 .. Max_Label_Length); + type Label_Array is array (Label_Number range <>) of Label; + + type Key_Environment (N : Label_Number := Label_Number'Last); + type Env_Ptr is access Key_Environment; + pragma Controlled (Env_Ptr); + + type String_Access is access String; + pragma Controlled (String_Access); + + Active_Context : String_Access := new String'("MAIN"); + Active_Notepad : Panel := Null_Panel; + + type Key_Environment (N : Label_Number := Label_Number'Last) is + record + Prev : Env_Ptr; + Help : String_Access; + Notepad : Panel; + Labels : Label_Array (1 .. N); + end record; + + procedure Release_String is + new Ada.Unchecked_Deallocation (String, + String_Access); + + procedure Release_Environment is + new Ada.Unchecked_Deallocation (Key_Environment, + Env_Ptr); + + Top_Of_Stack : Env_Ptr := null; + + procedure Push_Environment (Key : String; + Reset : Boolean := True) + is + P : constant Env_Ptr := new Key_Environment (Number_Of_Keys); + begin + -- Store the current labels in the environment + for I in 1 .. Number_Of_Keys loop + Get_Soft_Label_Key (I, P.all.Labels (I)); + if Reset then + Set_Soft_Label_Key (I, " "); + end if; + end loop; + P.all.Prev := Top_Of_Stack; + -- now store active help context and notepad + P.all.Help := Active_Context; + P.all.Notepad := Active_Notepad; + -- The notepad must now vanish and the new notepad is empty. + if P.all.Notepad /= Null_Panel then + Hide (P.all.Notepad); + Update_Panels; + end if; + Active_Notepad := Null_Panel; + Active_Context := new String'(Key); + + Top_Of_Stack := P; + if Reset then + Refresh_Soft_Label_Keys_Without_Update; + end if; + end Push_Environment; + + procedure Pop_Environment + is + P : Env_Ptr := Top_Of_Stack; + begin + if Top_Of_Stack = null then + raise Function_Key_Stack_Error; + else + for I in 1 .. Number_Of_Keys loop + Set_Soft_Label_Key (I, P.all.Labels (I), Justification); + end loop; + pragma Assert (Active_Context /= null); + Release_String (Active_Context); + Active_Context := P.all.Help; + Refresh_Soft_Label_Keys_Without_Update; + Notepad_To_Context (P.all.Notepad); + Top_Of_Stack := P.all.Prev; + Release_Environment (P); + end if; + end Pop_Environment; + + function Context return String + is + begin + if Active_Context /= null then + return Active_Context.all; + else + return ""; + end if; + end Context; + + function Find_Context (Key : String) return Boolean + is + P : Env_Ptr := Top_Of_Stack; + begin + if Active_Context.all = Key then + return True; + else + loop + exit when P = null; + if P.all.Help.all = Key then + return True; + else + P := P.all.Prev; + end if; + end loop; + return False; + end if; + end Find_Context; + + procedure Notepad_To_Context (Pan : Panel) + is + W : Window; + begin + if Active_Notepad /= Null_Panel then + W := Get_Window (Active_Notepad); + Clear (W); + Delete (Active_Notepad); + Delete (W); + end if; + Active_Notepad := Pan; + if Pan /= Null_Panel then + Top (Pan); + end if; + Update_Panels; + Update_Screen; + end Notepad_To_Context; + + procedure Initialize (Mode : Soft_Label_Key_Format := PC_Style; + Just : Label_Justification := Left) + is + begin + case Mode is + when PC_Style .. PC_Style_With_Index + => Number_Of_Keys := 12; + when others + => Number_Of_Keys := 8; + end case; + Init_Soft_Label_Keys (Mode); + Justification := Just; + end Initialize; + + procedure Default_Labels + is + begin + Set_Soft_Label_Key (FKEY_QUIT, "Quit"); + Set_Soft_Label_Key (FKEY_HELP, "Help"); + Set_Soft_Label_Key (FKEY_EXPLAIN, "Keys"); + Refresh_Soft_Label_Keys_Without_Update; + end Default_Labels; + + function Notepad_Window return Window + is + begin + if Active_Notepad /= Null_Panel then + return Get_Window (Active_Notepad); + else + return Null_Window; + end if; + end Notepad_Window; + +end Sample.Function_Key_Setting; diff --git a/contrib/ncurses/Ada95/samples/sample-function_key_setting.ads b/contrib/ncurses/Ada95/samples/sample-function_key_setting.ads new file mode 100644 index 00000000..daf14534 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-function_key_setting.ads @@ -0,0 +1,83 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Function_Key_Setting -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; + +-- This package implements a simple stack of function key label environments. +-- +package Sample.Function_Key_Setting is + + procedure Push_Environment (Key : String; + Reset : Boolean := True); + -- Push the definition of the current function keys on an internal + -- stack. If the reset flag is true, all labels are reset while + -- pushed, so the new environment can assume a tabula rasa. + -- The Key defines the new Help Context associated with the new + -- Environment. This saves also the currently active Notepad. + + procedure Pop_Environment; + -- Pop the Definitions from the stack and make them the current ones. + -- This also restores the Help context and the previous Notepad. + + procedure Initialize (Mode : Soft_Label_Key_Format := PC_Style; + Just : Label_Justification := Left); + -- Initialize the environment + + function Context return String; + -- Return the current context identifier + + function Find_Context (Key : String) return Boolean; + -- Look for a context, return true if it is in the stack, + -- false otherwise. + + procedure Notepad_To_Context (Pan : Panel); + -- Add a panel representing a notepad to the current context. + + Function_Key_Stack_Error : exception; + + procedure Default_Labels; + -- Set the default labels used in all environments + + function Notepad_Window return Window; + -- Return the current notepad window or Null_Window if there is none. + +end Sample.Function_Key_Setting; diff --git a/contrib/ncurses/Ada95/samples/sample-header_handler.adb b/contrib/ncurses/Ada95/samples/sample-header_handler.adb new file mode 100644 index 00000000..572aa8aa --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-header_handler.adb @@ -0,0 +1,186 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Header_Handler -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.21 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Calendar; use Ada.Calendar; +with Terminal_Interface.Curses.Text_IO.Integer_IO; +with Sample.Manifest; use Sample.Manifest; + +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Integer_IO); + +-- This package handles the painting of the header line of the screen. +-- +package body Sample.Header_Handler is + + package Int_IO is new + Terminal_Interface.Curses.Text_IO.Integer_IO (Integer); + use Int_IO; + + Header_Window : Window := Null_Window; + + Display_Hour : Integer := -1; -- hour last displayed + Display_Min : Integer := -1; -- minute last displayed + Display_Day : Integer := -1; -- day last displayed + Display_Month : Integer := -1; -- month last displayed + + -- This is the routine handed over to the curses library to be called + -- as initialization routine when ripping of the header lines from + -- the screen. This routine must follow C conventions. + function Init_Header_Window (Win : Window; + Columns : Column_Count) return Integer; + pragma Convention (C, Init_Header_Window); + + procedure Internal_Update_Header_Window (Do_Update : Boolean); + + -- The initialization must be called before Init_Screen. It steals two + -- lines from the top of the screen. + procedure Init_Header_Handler + is + begin + Rip_Off_Lines (2, Init_Header_Window'Access); + end Init_Header_Handler; + + procedure N_Out (N : Integer); + + -- Emit a two digit number and ensure that a leading zero is generated if + -- necessary. + procedure N_Out (N : Integer) + is + begin + if N < 10 then + Add (Header_Window, '0'); + Put (Header_Window, N, 1); + else + Put (Header_Window, N, 2); + end if; + end N_Out; + + -- Paint the header window. The input parameter is a flag indicating + -- whether or not the screen should be updated physically after painting. + procedure Internal_Update_Header_Window (Do_Update : Boolean) + is + type Month_Name_Array is + array (Month_Number'First .. Month_Number'Last) of String (1 .. 9); + + Month_Names : constant Month_Name_Array := + ("January ", + "February ", + "March ", + "April ", + "May ", + "June ", + "July ", + "August ", + "September", + "October ", + "November ", + "December "); + + Now : constant Time := Clock; + Sec : constant Integer := Integer (Seconds (Now)); + Hour : constant Integer := Sec / 3600; + Minute : constant Integer := (Sec - Hour * 3600) / 60; + Mon : constant Month_Number := Month (Now); + D : constant Day_Number := Day (Now); + begin + if Header_Window /= Null_Window then + if Minute /= Display_Min + or else Hour /= Display_Hour + or else Display_Day /= D + or else Display_Month /= Mon + then + Move_Cursor (Header_Window, 0, 0); + N_Out (D); Add (Header_Window, '.'); + Add (Header_Window, Month_Names (Mon)); + Move_Cursor (Header_Window, 1, 0); + N_Out (Hour); Add (Header_Window, ':'); + N_Out (Minute); + Display_Min := Minute; + Display_Hour := Hour; + Display_Month := Mon; + Display_Day := D; + Refresh_Without_Update (Header_Window); + if Do_Update then + Update_Screen; + end if; + end if; + end if; + end Internal_Update_Header_Window; + + -- This routine is called in the keyboard input timeout handler. So it will + -- periodically update the header line of the screen. + procedure Update_Header_Window + is + begin + Internal_Update_Header_Window (True); + end Update_Header_Window; + + function Init_Header_Window (Win : Window; + Columns : Column_Count) return Integer + is + Title : constant String := "Ada 95 ncurses Binding Sample"; + Pos : Column_Position; + begin + Header_Window := Win; + if Win /= Null_Window then + if Has_Colors then + Set_Background (Win => Win, + Ch => (Ch => ' ', + Color => Header_Color, + Attr => Normal_Video)); + Set_Character_Attributes (Win => Win, + Attr => Normal_Video, + Color => Header_Color); + Erase (Win); + end if; + Leave_Cursor_After_Update (Win, True); + Pos := Columns - Column_Position (Title'Length); + Add (Win, 0, Pos / 2, Title); + -- In this phase we must not allow a physical update, because + -- ncurses is not properly initialized at this point. + Internal_Update_Header_Window (False); + return 0; + else + return -1; + end if; + end Init_Header_Window; + +end Sample.Header_Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-header_handler.ads b/contrib/ncurses/Ada95/samples/sample-header_handler.ads new file mode 100644 index 00000000..18f76d70 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-header_handler.ads @@ -0,0 +1,54 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Header_Handler -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +-- This package handles the painting of the header line of the screen. +-- +package Sample.Header_Handler is + + procedure Init_Header_Handler; + -- Initialize the handler for the headerlines. + + procedure Update_Header_Window; + -- Update the information in the header window + +end Sample.Header_Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-helpers.adb b/contrib/ncurses/Ada95/samples/sample-helpers.adb new file mode 100644 index 00000000..4dbdd40c --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-helpers.adb @@ -0,0 +1,69 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Helpers -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Sample.Explanation; use Sample.Explanation; + +-- This package contains some convenient helper routines used throughout +-- this example. +-- +package body Sample.Helpers is + + procedure Window_Title (Win : Window; + Title : String) + is + Height : Line_Count; + Width : Column_Count; + Pos : Column_Position := 0; + begin + Get_Size (Win, Height, Width); + if Title'Length < Width then + Pos := (Width - Title'Length) / 2; + end if; + Add (Win, 0, Pos, Title); + end Window_Title; + + procedure Not_Implemented is + begin + Explain ("NOTIMPL"); + end Not_Implemented; + +end Sample.Helpers; diff --git a/contrib/ncurses/Ada95/samples/sample-helpers.ads b/contrib/ncurses/Ada95/samples/sample-helpers.ads new file mode 100644 index 00000000..5b7d3d7d --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-helpers.ads @@ -0,0 +1,55 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Helpers -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +-- This package contains some convenient helper routines used throughout +-- this example. +-- +package Sample.Helpers is + + procedure Window_Title (Win : Window; + Title : String); + -- Put a title string into the first line of the window + + procedure Not_Implemented; + +end Sample.Helpers; diff --git a/contrib/ncurses/Ada95/samples/sample-keyboard_handler.adb b/contrib/ncurses/Ada95/samples/sample-keyboard_handler.adb new file mode 100644 index 00000000..5a671fa7 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-keyboard_handler.adb @@ -0,0 +1,195 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Keyboard_Handler -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.17 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Strings; use Ada.Strings; +with Ada.Strings.Fixed; use Ada.Strings.Fixed; +with Ada.Strings.Maps.Constants; use Ada.Strings.Maps.Constants; +with Ada.Characters.Latin_1; use Ada.Characters.Latin_1; +with Ada.Characters.Handling; use Ada.Characters.Handling; + +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms; +with Terminal_Interface.Curses.Forms.Field_Types.Enumeration; +use Terminal_Interface.Curses.Forms.Field_Types.Enumeration; + +with Sample.Header_Handler; use Sample.Header_Handler; +with Sample.Form_Demo.Aux; use Sample.Form_Demo.Aux; +with Sample.Manifest; use Sample.Manifest; +with Sample.Form_Demo.Handler; + +-- This package contains a centralized keyboard handler used throughout +-- this example. The handler establishes a timeout mechanism that provides +-- periodical updates of the common header lines used in this example. +-- + +package body Sample.Keyboard_Handler is + + In_Command : Boolean := False; + + function Get_Key (Win : Window := Standard_Window) return Real_Key_Code + is + K : Real_Key_Code; + + function Command return Real_Key_Code; + + function Command return Real_Key_Code + is + function My_Driver (F : Form; + C : Key_Code; + P : Panel) return Boolean; + package Fh is new Sample.Form_Demo.Handler (My_Driver); + + type Label_Array is array (Label_Number) of String (1 .. 8); + + Labels : Label_Array; + + FA : Field_Array_Access := new Field_Array' + (Make (0, 0, "Command:"), + Make (Top => 0, Left => 9, Width => Columns - 11), + Null_Field); + + K : Real_Key_Code := Key_None; + N : Natural := 0; + + function My_Driver (F : Form; + C : Key_Code; + P : Panel) return Boolean + is + Ch : Character; + begin + if P = Null_Panel then + raise Panel_Exception; + end if; + if C in User_Key_Code'Range and then C = QUIT then + if Driver (F, F_Validate_Field) = Form_Ok then + K := Key_None; + return True; + end if; + elsif C in Normal_Key_Code'Range then + Ch := Character'Val (C); + if Ch = LF or else Ch = CR then + if Driver (F, F_Validate_Field) = Form_Ok then + declare + Buffer : String (1 .. Positive (Columns - 11)); + Cmdc : String (1 .. 8); + begin + Get_Buffer (Fld => FA.all (2), Str => Buffer); + Trim (Buffer, Left); + if Buffer (1) /= ' ' then + Cmdc := To_Upper (Buffer (Cmdc'Range)); + for I in Labels'Range loop + if Cmdc = Labels (I) then + K := Function_Key_Code + (Function_Key_Number (I)); + exit; + end if; + end loop; + end if; + return True; + end; + end if; + end if; + end if; + return False; + end My_Driver; + + begin + In_Command := True; + for I in Label_Number'Range loop + Get_Soft_Label_Key (I, Labels (I)); + Trim (Labels (I), Left); + Translate (Labels (I), Upper_Case_Map); + if Labels (I) (1) /= ' ' then + N := N + 1; + end if; + end loop; + if N > 0 then -- some labels were really set + declare + Enum_Info : Enumeration_Info (N); + Enum_Field : Enumeration_Field; + J : Positive := Enum_Info.Names'First; + + Frm : Form := Create (FA); + + begin + for I in Label_Number'Range loop + if Labels (I) (1) /= ' ' then + Enum_Info.Names (J) := new String'(Labels (I)); + J := J + 1; + end if; + end loop; + Enum_Field := Create (Enum_Info, True); + Set_Field_Type (FA.all (2), Enum_Field); + Set_Background (FA.all (2), Normal_Video); + + Fh.Drive_Me (Frm, Lines - 3, 0); + Delete (Frm); + Update_Panels; Update_Screen; + end; + end if; + Free (FA, True); + In_Command := False; + return K; + end Command; + + begin + Set_Timeout_Mode (Win, Delayed, 30000); + loop + K := Get_Keystroke (Win); + if K = Key_None then -- a timeout occurred + Update_Header_Window; + elsif K = 3 and then not In_Command then -- CTRL-C + K := Command; + exit when K /= Key_None; + else + exit; + end if; + end loop; + return K; + end Get_Key; + + procedure Init_Keyboard_Handler is + begin + null; + end Init_Keyboard_Handler; + +end Sample.Keyboard_Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-keyboard_handler.ads b/contrib/ncurses/Ada95/samples/sample-keyboard_handler.ads new file mode 100644 index 00000000..6daecc81 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-keyboard_handler.ads @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Keyboard_Handler -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +-- This package contains a centralized keyboard handler used throughout +-- this example. The handler establishes a timeout mechanism that provides +-- periodical updates of the common header lines used in this example. +-- +package Sample.Keyboard_Handler is + + function Get_Key (Win : Window := Standard_Window) return Real_Key_Code; + -- The central routine for handling keystrokes. + + procedure Init_Keyboard_Handler; + -- Initialize the keyboard + +end Sample.Keyboard_Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-manifest.ads b/contrib/ncurses/Ada95/samples/sample-manifest.ads new file mode 100644 index 00000000..1fa33a9e --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-manifest.ads @@ -0,0 +1,68 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Manifest -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +package Sample.Manifest is + + QUIT : constant User_Key_Code := User_Key_Code'First; + SELECT_ITEM : constant User_Key_Code := QUIT + 1; + + FKEY_HELP : constant Label_Number := 1; + HELP_CODE : constant Special_Key_Code := Key_F1; + FKEY_EXPLAIN : constant Label_Number := 2; + EXPLAIN_CODE : constant Special_Key_Code := Key_F2; + FKEY_QUIT : constant Label_Number := 3; + QUIT_CODE : constant Special_Key_Code := Key_F3; + + Menu_Marker : constant String := "=> "; + + Default_Colors : constant Redefinable_Color_Pair := 1; + Menu_Fore_Color : constant Redefinable_Color_Pair := 2; + Menu_Back_Color : constant Redefinable_Color_Pair := 3; + Menu_Grey_Color : constant Redefinable_Color_Pair := 4; + Form_Fore_Color : constant Redefinable_Color_Pair := 5; + Form_Back_Color : constant Redefinable_Color_Pair := 6; + Notepad_Color : constant Redefinable_Color_Pair := 7; + Help_Color : constant Redefinable_Color_Pair := 8; + Header_Color : constant Redefinable_Color_Pair := 9; + +end Sample.Manifest; diff --git a/contrib/ncurses/Ada95/samples/sample-menu_demo-aux.adb b/contrib/ncurses/Ada95/samples/sample-menu_demo-aux.adb new file mode 100644 index 00000000..f64e41da --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-menu_demo-aux.adb @@ -0,0 +1,205 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Menu_Demo.Aux -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020,2023 Thomas E. Dickey -- +-- Copyright 1998-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.16 $ +-- $Date: 2023/06/17 17:21:59 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Characters.Latin_1; use Ada.Characters.Latin_1; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Helpers; use Sample.Helpers; +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Explanation; use Sample.Explanation; + +package body Sample.Menu_Demo.Aux is + + procedure Geometry (M : Menu; + L : out Line_Count; + C : out Column_Count; + Y : out Line_Position; + X : out Column_Position; + Fy : out Line_Position; + Fx : out Column_Position); + + procedure Geometry (M : Menu; + L : out Line_Count; -- Lines used for menu + C : out Column_Count; -- Columns used for menu + Y : out Line_Position; -- Proposed Line for menu + X : out Column_Position; -- Proposed Column for menu + Fy : out Line_Position; -- Vertical inner frame + Fx : out Column_Position) -- Horiz. inner frame + is + Spc_Desc : Column_Position; -- spaces between description and item + begin + Set_Mark (M, Menu_Marker); + + Spacing (M, Spc_Desc, Fy, Fx); + Scale (M, L, C); + + Fx := Fx + Column_Position (Fy - 1); -- looks a bit nicer + + L := L + 2 * Fy; -- count for frame at top and bottom + C := C + 2 * Fx; -- " + + -- Calculate horizontal coordinate at the screen center + X := (Columns - C) / 2; + Y := 1; -- always starting on line 1 + + end Geometry; + + procedure Geometry (M : Menu; + L : out Line_Count; -- Lines used for menu + C : out Column_Count; -- Columns used for menu + Y : out Line_Position; -- Proposed Line for menu + X : out Column_Position) -- Proposed Column for menu + is + Fy : Line_Position; + Fx : Column_Position; + begin + Geometry (M, L, C, Y, X, Fy, Fx); + end Geometry; + + function Create (M : Menu; + Title : String; + Lin : Line_Position; + Col : Column_Position) return Panel + is + W, S : Window; + L : Line_Count; + C : Column_Count; + Y, Fy : Line_Position; + X, Fx : Column_Position; + Pan : Panel; + begin + Geometry (M, L, C, Y, X, Fy, Fx); + W := New_Window (L, C, Lin, Col); + Set_Meta_Mode (W); + Set_KeyPad_Mode (W); + if Has_Colors then + Set_Background (Win => W, + Ch => (Ch => ' ', + Color => Menu_Back_Color, + Attr => Normal_Video)); + Set_Foreground (Men => M, Color => Menu_Fore_Color); + Set_Background (Men => M, Color => Menu_Back_Color); + Set_Grey (Men => M, Color => Menu_Grey_Color); + Erase (W); + end if; + S := Derived_Window (W, L - Fy, C - Fx, Fy, Fx); + Set_Meta_Mode (S); + Set_KeyPad_Mode (S); + Box (W); + Set_Window (M, W); + Set_Sub_Window (M, S); + if Title'Length > 0 then + Window_Title (W, Title); + end if; + Pan := New_Panel (W); + Post (M); + return Pan; + end Create; + + procedure Destroy (M : Menu; + P : in out Panel) + is + W, S : Window; + begin + W := Get_Window (M); + S := Get_Sub_Window (M); + Post (M, False); + Erase (W); + Delete (P); + Set_Window (M, Null_Window); + Set_Sub_Window (M, Null_Window); + Delete (S); + Delete (W); + Update_Panels; + end Destroy; + + function Get_Request (M : Menu; P : Panel) return Key_Code + is + W : constant Window := Get_Window (M); + K : Real_Key_Code; + Ch : Character; + begin + Top (P); + loop + K := Get_Key (W); + if K in Special_Key_Code'Range then + case K is + when HELP_CODE => Explain_Context; + when EXPLAIN_CODE => Explain ("MENUKEYS"); + when Key_Home => return REQ_FIRST_ITEM; + when QUIT_CODE => return QUIT; + when Key_Cursor_Down => return REQ_DOWN_ITEM; + when Key_Cursor_Up => return REQ_UP_ITEM; + when Key_Cursor_Left => return REQ_LEFT_ITEM; + when Key_Cursor_Right => return REQ_RIGHT_ITEM; + when Key_End => return REQ_LAST_ITEM; + when Key_Backspace => return REQ_BACK_PATTERN; + when Key_Next_Page => return REQ_SCR_DPAGE; + when Key_Previous_Page => return REQ_SCR_UPAGE; + when others => return K; + end case; + elsif K in Normal_Key_Code'Range then + Ch := Character'Val (K); + case Ch is + when CAN => return QUIT; -- CTRL-X + when SO => return REQ_NEXT_ITEM; -- CTRL-N + when DLE => return REQ_PREV_ITEM; -- CTRL-P + when NAK => return REQ_SCR_ULINE; -- CTRL-U + when EOT => return REQ_SCR_DLINE; -- CTRL-D + when ACK => return REQ_SCR_DPAGE; -- CTRL-F + when STX => return REQ_SCR_UPAGE; -- CTRL-B + when EM => return REQ_CLEAR_PATTERN; -- CTRL-Y + when BS => return REQ_BACK_PATTERN; -- CTRL-H + when SOH => return REQ_NEXT_MATCH; -- CTRL-A + when ENQ => return REQ_PREV_MATCH; -- CTRL-E + when DC4 => return REQ_TOGGLE_ITEM; -- CTRL-T + + when CR | LF => return SELECT_ITEM; + when others => return K; + end case; + else + return K; + end if; + end loop; + end Get_Request; + +end Sample.Menu_Demo.Aux; diff --git a/contrib/ncurses/Ada95/samples/sample-menu_demo-aux.ads b/contrib/ncurses/Ada95/samples/sample-menu_demo-aux.ads new file mode 100644 index 00000000..778b34cf --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-menu_demo-aux.ads @@ -0,0 +1,72 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Menu_Demo.Aux -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus; + +package Sample.Menu_Demo.Aux is + + procedure Geometry (M : Menu; + L : out Line_Count; + C : out Column_Count; + Y : out Line_Position; + X : out Column_Position); + -- Calculate the geometry for a panel being able to be used to display + -- the menu. + + function Create (M : Menu; + Title : String; + Lin : Line_Position; + Col : Column_Position) return Panel; + -- Create a panel decorated with a frame and the title at the specified + -- position. The dimension of the panel is derived from the menus layout. + + procedure Destroy (M : Menu; + P : in out Panel); + -- Destroy all the windowing structures associated with this menu and + -- panel. + + function Get_Request (M : Menu; P : Panel) return Key_Code; + -- Centralized request driver for all menus in this sample. This + -- gives us a common key binding for all menus. + +end Sample.Menu_Demo.Aux; diff --git a/contrib/ncurses/Ada95/samples/sample-menu_demo-handler.adb b/contrib/ncurses/Ada95/samples/sample-menu_demo-handler.adb new file mode 100644 index 00000000..ebbaf43c --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-menu_demo-handler.adb @@ -0,0 +1,109 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Menu_Demo.Handler -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2004,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions : -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.17 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Sample.Menu_Demo.Aux; +with Sample.Manifest; use Sample.Manifest; +with Terminal_Interface.Curses.Mouse; use Terminal_Interface.Curses.Mouse; + +package body Sample.Menu_Demo.Handler is + + package Aux renames Sample.Menu_Demo.Aux; + + procedure Drive_Me (M : Menu; + Title : String := "") + is + L : Line_Count; + C : Column_Count; + Y : Line_Position; + X : Column_Position; + begin + Aux.Geometry (M, L, C, Y, X); + Drive_Me (M, Y, X, Title); + end Drive_Me; + + procedure Drive_Me (M : Menu; + Lin : Line_Position; + Col : Column_Position; + Title : String := "") + is + Mask : Event_Mask := No_Events; + Old : Event_Mask; + Pan : Panel := Aux.Create (M, Title, Lin, Col); + V : Cursor_Visibility := Invisible; + begin + -- We are only interested in Clicks with the left button + Register_Reportable_Events (Left, All_Clicks, Mask); + Old := Start_Mouse (Mask); + Set_Cursor_Visibility (V); + loop + declare + K : Key_Code := Aux.Get_Request (M, Pan); + R : constant Driver_Result := Driver (M, K); + begin + case R is + when Menu_Ok => null; + when Unknown_Request => + declare + I : constant Item := Current (M); + O : Item_Option_Set; + begin + if K = Key_Mouse then + K := SELECT_ITEM; + end if; + Get_Options (I, O); + if K = SELECT_ITEM and then not O.Selectable then + Beep; + else + if My_Driver (M, K, Pan) then + exit; + end if; + end if; + end; + when others => Beep; + end case; + end; + end loop; + End_Mouse (Old); + Aux.Destroy (M, Pan); + end Drive_Me; + +end Sample.Menu_Demo.Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-menu_demo-handler.ads b/contrib/ncurses/Ada95/samples/sample-menu_demo-handler.ads new file mode 100644 index 00000000..eff73e06 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-menu_demo-handler.ads @@ -0,0 +1,65 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Menu_Demo.Handler -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; +use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; +use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Menus; +use Terminal_Interface.Curses.Menus; + +generic + with function My_Driver (Men : Menu; + K : Key_Code; + Pan : Panel) return Boolean; +package Sample.Menu_Demo.Handler is + + procedure Drive_Me (M : Menu; + Lin : Line_Position; + Col : Column_Position; + Title : String := ""); + -- Position the menu at the given point and drive it. + + procedure Drive_Me (M : Menu; + Title : String := ""); + -- Center menu and drive it. + +end Sample.Menu_Demo.Handler; diff --git a/contrib/ncurses/Ada95/samples/sample-menu_demo.adb b/contrib/ncurses/Ada95/samples/sample-menu_demo.adb new file mode 100644 index 00000000..7e49ddde --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-menu_demo.adb @@ -0,0 +1,397 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Menu_Demo -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2008,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.20 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus; +with Terminal_Interface.Curses.Menus.Menu_User_Data; +with Terminal_Interface.Curses.Menus.Item_User_Data; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Menu_Demo.Handler; +with Sample.Helpers; use Sample.Helpers; +with Sample.Explanation; use Sample.Explanation; + +package body Sample.Menu_Demo is + + package Spacing_Demo is + procedure Spacing_Test; + end Spacing_Demo; + + package body Spacing_Demo is + + procedure Spacing_Test + is + function My_Driver (M : Menu; + K : Key_Code; + P : Panel) return Boolean; + + procedure Set_Option_Key; + procedure Set_Select_Key; + procedure Set_Description_Key; + procedure Set_Hide_Key; + + package Mh is new Sample.Menu_Demo.Handler (My_Driver); + + I : Item_Array_Access := new Item_Array' + (New_Item ("January", "31 Days"), + New_Item ("February", "28/29 Days"), + New_Item ("March", "31 Days"), + New_Item ("April", "30 Days"), + New_Item ("May", "31 Days"), + New_Item ("June", "30 Days"), + New_Item ("July", "31 Days"), + New_Item ("August", "31 Days"), + New_Item ("September", "30 Days"), + New_Item ("October", "31 Days"), + New_Item ("November", "30 Days"), + New_Item ("December", "31 Days"), + Null_Item); + + M : Menu := New_Menu (I); + Flip_State : Boolean := True; + Hide_Long : Boolean := False; + + type Format_Code is (Four_By_1, Four_By_2, Four_By_3); + type Operations is (Flip, Reorder, Reformat, Reselect, Describe); + + type Change is array (Operations) of Boolean; + pragma Pack (Change); + No_Change : constant Change := Change'(others => False); + + Current_Format : Format_Code := Four_By_1; + To_Change : Change := No_Change; + + function My_Driver (M : Menu; + K : Key_Code; + P : Panel) return Boolean + is + begin + if M = Null_Menu then + raise Menu_Exception; + end if; + if P = Null_Panel then + raise Panel_Exception; + end if; + To_Change := No_Change; + if K in User_Key_Code'Range then + if K = QUIT then + return True; + end if; + end if; + if K in Special_Key_Code'Range then + case K is + when Key_F4 => + To_Change (Flip) := True; + return True; + when Key_F5 => + To_Change (Reformat) := True; + Current_Format := Four_By_1; + return True; + when Key_F6 => + To_Change (Reformat) := True; + Current_Format := Four_By_2; + return True; + when Key_F7 => + To_Change (Reformat) := True; + Current_Format := Four_By_3; + return True; + when Key_F8 => + To_Change (Reorder) := True; + return True; + when Key_F9 => + To_Change (Reselect) := True; + return True; + when Key_F10 => + if Current_Format /= Four_By_3 then + To_Change (Describe) := True; + return True; + else + return False; + end if; + when Key_F11 => + Hide_Long := not Hide_Long; + declare + O : Item_Option_Set; + begin + for J in I'Range loop + Get_Options (I.all (J), O); + O.Selectable := True; + if Hide_Long then + case J is + when 1 | 3 | 5 | 7 | 8 | 10 | 12 => + O.Selectable := False; + when others => null; + end case; + end if; + Set_Options (I.all (J), O); + end loop; + end; + return False; + when others => null; + end case; + end if; + return False; + end My_Driver; + + procedure Set_Option_Key + is + O : Menu_Option_Set; + begin + if Current_Format = Four_By_1 then + Set_Soft_Label_Key (8, ""); + else + Get_Options (M, O); + if O.Row_Major_Order then + Set_Soft_Label_Key (8, "O-Col"); + else + Set_Soft_Label_Key (8, "O-Row"); + end if; + end if; + Refresh_Soft_Label_Keys_Without_Update; + end Set_Option_Key; + + procedure Set_Select_Key + is + O : Menu_Option_Set; + begin + Get_Options (M, O); + if O.One_Valued then + Set_Soft_Label_Key (9, "Multi"); + else + Set_Soft_Label_Key (9, "Singl"); + end if; + Refresh_Soft_Label_Keys_Without_Update; + end Set_Select_Key; + + procedure Set_Description_Key + is + O : Menu_Option_Set; + begin + if Current_Format = Four_By_3 then + Set_Soft_Label_Key (10, ""); + else + Get_Options (M, O); + if O.Show_Descriptions then + Set_Soft_Label_Key (10, "-Desc"); + else + Set_Soft_Label_Key (10, "+Desc"); + end if; + end if; + Refresh_Soft_Label_Keys_Without_Update; + end Set_Description_Key; + + procedure Set_Hide_Key + is + begin + if Hide_Long then + Set_Soft_Label_Key (11, "Enab"); + else + Set_Soft_Label_Key (11, "Disab"); + end if; + Refresh_Soft_Label_Keys_Without_Update; + end Set_Hide_Key; + + begin + Push_Environment ("MENU01"); + Notepad ("MENU-PAD01"); + Default_Labels; + Set_Soft_Label_Key (4, "Flip"); + Set_Soft_Label_Key (5, "4x1"); + Set_Soft_Label_Key (6, "4x2"); + Set_Soft_Label_Key (7, "4x3"); + Set_Option_Key; + Set_Select_Key; + Set_Description_Key; + Set_Hide_Key; + + Set_Format (M, 4, 1); + loop + Mh.Drive_Me (M); + exit when To_Change = No_Change; + if To_Change (Flip) then + if Flip_State then + Flip_State := False; + Set_Spacing (M, 3, 2, 0); + else + Flip_State := True; + Set_Spacing (M); + end if; + elsif To_Change (Reformat) then + case Current_Format is + when Four_By_1 => Set_Format (M, 4, 1); + when Four_By_2 => Set_Format (M, 4, 2); + when Four_By_3 => + declare + O : Menu_Option_Set; + begin + Get_Options (M, O); + O.Show_Descriptions := False; + Set_Options (M, O); + Set_Format (M, 4, 3); + end; + end case; + Set_Option_Key; + Set_Description_Key; + elsif To_Change (Reorder) then + declare + O : Menu_Option_Set; + begin + Get_Options (M, O); + O.Row_Major_Order := not O.Row_Major_Order; + Set_Options (M, O); + Set_Option_Key; + end; + elsif To_Change (Reselect) then + declare + O : Menu_Option_Set; + begin + Get_Options (M, O); + O.One_Valued := not O.One_Valued; + Set_Options (M, O); + Set_Select_Key; + end; + elsif To_Change (Describe) then + declare + O : Menu_Option_Set; + begin + Get_Options (M, O); + O.Show_Descriptions := not O.Show_Descriptions; + Set_Options (M, O); + Set_Description_Key; + end; + else + null; + end if; + end loop; + Set_Spacing (M); + + Pop_Environment; + pragma Assert (Get_Index (Items (M, 1)) = Get_Index (I (1))); + Delete (M); + Free (I, True); + end Spacing_Test; + end Spacing_Demo; + + procedure Demo + is + -- We use this datatype only to test the instantiation of + -- the Menu_User_Data generic package. No functionality + -- behind it. + type User_Data is new Integer; + type User_Data_Access is access User_Data; + + -- Those packages are only instantiated to test the usability. + -- No real functionality is shown in the demo. + package MUD is new Menu_User_Data (User_Data, User_Data_Access); + package IUD is new Item_User_Data (User_Data, User_Data_Access); + + function My_Driver (M : Menu; + K : Key_Code; + P : Panel) return Boolean; + + package Mh is new Sample.Menu_Demo.Handler (My_Driver); + + Itm : Item_Array_Access := new Item_Array' + (New_Item ("Menu Layout Options"), + New_Item ("Demo of Hook functions"), + Null_Item); + M : Menu := New_Menu (Itm); + + U1 : constant User_Data_Access := new User_Data'(4711); + U2 : User_Data_Access; + U3 : constant User_Data_Access := new User_Data'(4712); + U4 : User_Data_Access; + + function My_Driver (M : Menu; + K : Key_Code; + P : Panel) return Boolean + is + Idx : constant Positive := Get_Index (Current (M)); + begin + if K in User_Key_Code'Range then + if K = QUIT then + return True; + elsif K = SELECT_ITEM then + if Idx in Itm'Range then + Hide (P); + Update_Panels; + end if; + case Idx is + when 1 => Spacing_Demo.Spacing_Test; + when others => Not_Implemented; + end case; + if Idx in Itm'Range then + Top (P); + Show (P); + Update_Panels; + Update_Screen; + end if; + end if; + end if; + return False; + end My_Driver; + begin + Push_Environment ("MENU00"); + Notepad ("MENU-PAD00"); + Default_Labels; + Refresh_Soft_Label_Keys_Without_Update; + Set_Pad_Character (M, '|'); + + MUD.Set_User_Data (M, U1); + IUD.Set_User_Data (Itm.all (1), U3); + + Mh.Drive_Me (M); + + MUD.Get_User_Data (M, U2); + pragma Assert (U1 = U2 and U1.all = 4711); + + IUD.Get_User_Data (Itm.all (1), U4); + pragma Assert (U3 = U4 and U3.all = 4712); + + Pop_Environment; + Delete (M); + Free (Itm, True); + end Demo; + +end Sample.Menu_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-menu_demo.ads b/contrib/ncurses/Ada95/samples/sample-menu_demo.ads new file mode 100644 index 00000000..84b5a694 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-menu_demo.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Menu_Demo -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample.Menu_Demo is + + procedure Demo; + +end Sample.Menu_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-my_field_type.adb b/contrib/ncurses/Ada95/samples/sample-my_field_type.adb new file mode 100644 index 00000000..dbdd88ab --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-my_field_type.adb @@ -0,0 +1,69 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.My_Field_Type -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2008 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.17 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +-- This is a very simple user defined field type. It accepts only a +-- defined character as input into the field. +-- +package body Sample.My_Field_Type is + + -- That's simple. There are minimal field validity checks. + function Field_Check (Fld : Field; + Typ : My_Data) return Boolean + is + begin + if Fld = Null_Field or Typ.Ch = Character'Val (0) then + return False; + end if; + return True; + end Field_Check; + + -- Check exactly against the specified character. + function Character_Check (Ch : Character; + Typ : My_Data) return Boolean + is + C : constant Character := Typ.Ch; + begin + return Ch = C; + end Character_Check; + +end Sample.My_Field_Type; diff --git a/contrib/ncurses/Ada95/samples/sample-my_field_type.ads b/contrib/ncurses/Ada95/samples/sample-my_field_type.ads new file mode 100644 index 00000000..1f1e65f3 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-my_field_type.ads @@ -0,0 +1,62 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.My_Field_Type -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2003,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Forms; use Terminal_Interface.Curses.Forms; +with Terminal_Interface.Curses.Forms.Field_Types.User; +use Terminal_Interface.Curses.Forms.Field_Types.User; + +-- This is a very simple user defined field type. It accepts only a +-- defined character as input into the field. +-- +package Sample.My_Field_Type is + + type My_Data is new User_Defined_Field_Type with + record + Ch : Character; + end record; + + function Field_Check (Fld : Field; + Typ : My_Data) return Boolean; + + function Character_Check (Ch : Character; + Typ : My_Data) return Boolean; + +end Sample.My_Field_Type; diff --git a/contrib/ncurses/Ada95/samples/sample-text_io_demo.adb b/contrib/ncurses/Ada95/samples/sample-text_io_demo.adb new file mode 100644 index 00000000..f23fe7ce --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-text_io_demo.adb @@ -0,0 +1,189 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Text_IO_Demo -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.19 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Numerics.Generic_Elementary_Functions; + +with Ada.Numerics.Complex_Types; +use Ada.Numerics.Complex_Types; + +with Terminal_Interface.Curses; +use Terminal_Interface.Curses; + +with Terminal_Interface.Curses.Panels; +use Terminal_Interface.Curses.Panels; + +with Terminal_Interface.Curses.Text_IO; +use Terminal_Interface.Curses.Text_IO; + +with Terminal_Interface.Curses.Text_IO.Integer_IO; +with Terminal_Interface.Curses.Text_IO.Float_IO; +with Terminal_Interface.Curses.Text_IO.Enumeration_IO; +with Terminal_Interface.Curses.Text_IO.Complex_IO; +with Terminal_Interface.Curses.Text_IO.Decimal_IO; +with Terminal_Interface.Curses.Text_IO.Modular_IO; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Explanation; use Sample.Explanation; + +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Complex_IO); +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Decimal_IO); +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Enumeration_IO); +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Float_IO); +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Integer_IO); +pragma Elaborate_All (Terminal_Interface.Curses.Text_Io.Modular_IO); + +package body Sample.Text_IO_Demo is + + type Weekday is (Sunday, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday); + + type Dec is delta 0.01 digits 5 range 0.0 .. 4.0; + type Md is mod 5; + + package Math is new + Ada.Numerics.Generic_Elementary_Functions (Float); + + package Int_IO is new + Terminal_Interface.Curses.Text_IO.Integer_IO (Integer); + use Int_IO; + + package Real_IO is new + Terminal_Interface.Curses.Text_IO.Float_IO (Float); + use Real_IO; + + package Enum_IO is new + Terminal_Interface.Curses.Text_IO.Enumeration_IO (Weekday); + use Enum_IO; + + package C_IO is new + Terminal_Interface.Curses.Text_IO.Complex_IO (Ada.Numerics.Complex_Types); + use C_IO; + + package D_IO is new + Terminal_Interface.Curses.Text_IO.Decimal_IO (Dec); + use D_IO; + + package M_IO is new + Terminal_Interface.Curses.Text_IO.Modular_IO (Md); + use M_IO; + + procedure Demo + is + W : Window; + P : Panel := Create (Standard_Window); + K : Real_Key_Code; + Im : constant Complex := (0.0, 1.0); + Fx : constant Dec := 3.14; + Dc : constant Dec := 2.72; + L : Md; + + begin + Push_Environment ("TEXTIO"); + Default_Labels; + Notepad ("TEXTIO-PAD00"); + + Set_Echo_Mode (False); + Set_Meta_Mode; + Set_KeyPad_Mode; + W := Sub_Window (Standard_Window, Lines - 2, Columns - 2, 1, 1); + Box; + Refresh_Without_Update; + Set_Meta_Mode (W); + Set_KeyPad_Mode (W); + Immediate_Update_Mode (W, True); + + Set_Window (W); + + for I in 1 .. 10 loop + Put ("Square root of "); + Put (Item => I, Width => 5); + Put (" is "); + Put (Item => Math.Sqrt (Float (I)), Exp => 0, Aft => 7); + New_Line; + end loop; + + for W in Weekday loop + Put (Item => W); Put (' '); + end loop; + New_Line; + + L := Md'First; + for I in 1 .. 2 loop + for J in Md'Range loop + Put (L); Put (' '); + L := L + 1; + end loop; + end loop; + New_Line; + + Put (Im); New_Line; + Put (Fx); New_Line; + Put (Dc); New_Line; + + loop + K := Get_Key; + if K in Special_Key_Code'Range then + case K is + when QUIT_CODE => exit; + when HELP_CODE => Explain_Context; + when EXPLAIN_CODE => Explain ("TEXTIOKEYS"); + when others => null; + end case; + end if; + end loop; + + Set_Window (Null_Window); + Erase; Refresh_Without_Update; + Delete (P); + Delete (W); + + Pop_Environment; + end Demo; + +end Sample.Text_IO_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample-text_io_demo.ads b/contrib/ncurses/Ada95/samples/sample-text_io_demo.ads new file mode 100644 index 00000000..307f3700 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample-text_io_demo.ads @@ -0,0 +1,46 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample.Text_IO_Demo -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample.Text_IO_Demo is + + procedure Demo; + +end Sample.Text_IO_Demo; diff --git a/contrib/ncurses/Ada95/samples/sample.adb b/contrib/ncurses/Ada95/samples/sample.adb new file mode 100644 index 00000000..e10294b7 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample.adb @@ -0,0 +1,221 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2008,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.19 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Text_IO; + +with Ada.Exceptions; use Ada.Exceptions; + +with Terminal_Interface.Curses; use Terminal_Interface.Curses; +with Terminal_Interface.Curses.Panels; use Terminal_Interface.Curses.Panels; +with Terminal_Interface.Curses.Menus; use Terminal_Interface.Curses.Menus; +with Terminal_Interface.Curses.Menus.Menu_User_Data; +with Terminal_Interface.Curses.Menus.Item_User_Data; + +with Sample.Manifest; use Sample.Manifest; +with Sample.Function_Key_Setting; use Sample.Function_Key_Setting; +with Sample.Keyboard_Handler; use Sample.Keyboard_Handler; +with Sample.Header_Handler; use Sample.Header_Handler; +with Sample.Explanation; use Sample.Explanation; + +with Sample.Menu_Demo.Handler; +with Sample.Curses_Demo; +with Sample.Form_Demo; +with Sample.Menu_Demo; +with Sample.Text_IO_Demo; + +with GNAT.OS_Lib; + +package body Sample is + + type User_Data is + record + Data : Integer; + end record; + type User_Access is access User_Data; + + package Ud is new + Terminal_Interface.Curses.Menus.Menu_User_Data + (User_Data, User_Access); + + package Id is new + Terminal_Interface.Curses.Menus.Item_User_Data + (User_Data, User_Access); + + procedure Whow is + procedure Main_Menu; + procedure Main_Menu + is + function My_Driver (M : Menu; + K : Key_Code; + Pan : Panel) return Boolean; + + package Mh is new Sample.Menu_Demo.Handler (My_Driver); + + I : Item_Array_Access := new Item_Array' + (New_Item ("Curses Core Demo"), + New_Item ("Menu Demo"), + New_Item ("Form Demo"), + New_Item ("Text IO Demo"), + Null_Item); + + M : Menu := New_Menu (I); + + D1, D2 : User_Access; + I1, I2 : User_Access; + + function My_Driver (M : Menu; + K : Key_Code; + Pan : Panel) return Boolean + is + Idx : constant Positive := Get_Index (Current (M)); + begin + if K in User_Key_Code'Range then + if K = QUIT then + return True; + elsif K = SELECT_ITEM then + if Idx <= 4 then + Hide (Pan); + Update_Panels; + end if; + case Idx is + when 1 => Sample.Curses_Demo.Demo; + when 2 => Sample.Menu_Demo.Demo; + when 3 => Sample.Form_Demo.Demo; + when 4 => Sample.Text_IO_Demo.Demo; + when others => null; + end case; + if Idx <= 4 then + Top (Pan); + Show (Pan); + Update_Panels; + Update_Screen; + end if; + end if; + end if; + return False; + end My_Driver; + + begin + + if (1 + Item_Count (M)) /= I'Length then + raise Constraint_Error; + end if; + + D1 := new User_Data'(Data => 4711); + Ud.Set_User_Data (M, D1); + + I1 := new User_Data'(Data => 1174); + Id.Set_User_Data (I.all (1), I1); + + Set_Spacing (Men => M, Row => 2); + + Default_Labels; + Notepad ("MAINPAD"); + + Mh.Drive_Me (M, " Demo "); + + Ud.Get_User_Data (M, D2); + pragma Assert (D1 = D2); + pragma Assert (D1.Data = D2.Data); + + Id.Get_User_Data (I.all (1), I2); + pragma Assert (I1 = I2); + pragma Assert (I1.Data = I2.Data); + + Delete (M); + Free (I, True); + end Main_Menu; + + begin + Initialize (PC_Style_With_Index); + Init_Header_Handler; + Init_Screen; + + if Has_Colors then + Start_Color; + + Init_Pair (Pair => Default_Colors, Fore => Black, Back => White); + Init_Pair (Pair => Menu_Back_Color, Fore => Black, Back => Cyan); + Init_Pair (Pair => Menu_Fore_Color, Fore => Red, Back => Cyan); + Init_Pair (Pair => Menu_Grey_Color, Fore => White, Back => Cyan); + Init_Pair (Pair => Notepad_Color, Fore => Black, Back => Yellow); + Init_Pair (Pair => Help_Color, Fore => Blue, Back => Cyan); + Init_Pair (Pair => Form_Back_Color, Fore => Black, Back => Cyan); + Init_Pair (Pair => Form_Fore_Color, Fore => Red, Back => Cyan); + Init_Pair (Pair => Header_Color, Fore => Black, Back => Green); + + Set_Background (Ch => (Color => Default_Colors, + Attr => Normal_Video, + Ch => ' ')); + Set_Character_Attributes (Attr => Normal_Video, + Color => Default_Colors); + Erase; + + Set_Soft_Label_Key_Attributes (Color => Header_Color); + -- This propagates the attributes to the label window + Refresh_Soft_Label_Keys; + end if; + + Init_Keyboard_Handler; + + Set_Echo_Mode (False); + Set_Raw_Mode; + Set_Meta_Mode; + Set_KeyPad_Mode; + + -- Initialize the Function Key Environment + -- We have some fixed key throughout this sample + Main_Menu; + End_Windows; + Curses_Free_All; + + exception + when Event : others => + Terminal_Interface.Curses.End_Windows; + Text_IO.Put ("Exception: "); + Text_IO.Put (Exception_Name (Event)); + Text_IO.New_Line; + GNAT.OS_Lib.OS_Exit (1); + + end Whow; + +end Sample; diff --git a/contrib/ncurses/Ada95/samples/sample.ads b/contrib/ncurses/Ada95/samples/sample.ads new file mode 100644 index 00000000..fecab98d --- /dev/null +++ b/contrib/ncurses/Ada95/samples/sample.ads @@ -0,0 +1,44 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Sample -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Sample is + procedure Whow; +end Sample; diff --git a/contrib/ncurses/Ada95/samples/split-path.awk b/contrib/ncurses/Ada95/samples/split-path.awk new file mode 100644 index 00000000..5b340ba5 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/split-path.awk @@ -0,0 +1,56 @@ +############################################################################## +# Copyright 2020,2022 Thomas E. Dickey # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# $Id: split-path.awk,v 1.4 2022/11/26 23:46:20 tom Exp $ +BEGIN { cols = 72; } +/[$]THIS_DATADIR/ { + if (substr(this_datadir, length(this_datadir)) != "/") + this_datadir = this_datadir "/"; + gsub("[$]THIS_DATADIR", "\"" this_datadir "\""); + if ( length ($0) > cols ) { + indent = index($0, "\"") - 1; + broken = index($0, "&"); + if (broken > 0 && broken < indent) + indent = broken - 1; + leader = sprintf ("%*s& ", indent, " "); + buffer = $0; + first = 1; + while ( length(buffer) > cols ) { + printf("%.*s\"\n", cols, buffer); + buffer = leader "\"" substr(buffer, cols + 1); + } + if ( buffer != "" && buffer != leader "\"\"" ) + printf("%.*s\n", cols, buffer); + next; + } +} +{ + print; +} diff --git a/contrib/ncurses/Ada95/samples/status.adb b/contrib/ncurses/Ada95/samples/status.adb new file mode 100644 index 00000000..eb55c756 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/status.adb @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Status -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Laurent Pautet +-- Modified by: Juergen Pfeifer, 1997 +-- Version Control +-- $Revision: 1.9 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- This package has been contributed by Laurent Pautet -- +-- -- +package body Status is + + protected body Process is + procedure Stop is + begin + Done := True; + end Stop; + function Continue return Boolean is + begin + return not Done; + end Continue; + end Process; + +end Status; diff --git a/contrib/ncurses/Ada95/samples/status.ads b/contrib/ncurses/Ada95/samples/status.ads new file mode 100644 index 00000000..66fd19e9 --- /dev/null +++ b/contrib/ncurses/Ada95/samples/status.ads @@ -0,0 +1,61 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Status -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Laurent Pautet +-- Modified by: Juergen Pfeifer, 1997 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- This package has been contributed by Laurent Pautet -- +-- -- +with Ada.Interrupts.Names; + +package Status is + + pragma Warnings (Off); -- the next pragma exists since 3.11p + pragma Unreserve_All_Interrupts; + pragma Warnings (On); + + protected Process is + procedure Stop; + function Continue return Boolean; + pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT); + private + Done : Boolean := False; + end Process; + +end Status; diff --git a/contrib/ncurses/Ada95/samples/tour.adb b/contrib/ncurses/Ada95/samples/tour.adb new file mode 100644 index 00000000..07f206ea --- /dev/null +++ b/contrib/ncurses/Ada95/samples/tour.adb @@ -0,0 +1,47 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- tour -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Sample; use Sample; + +procedure Tour is +begin + Whow; +end Tour; diff --git a/contrib/ncurses/Ada95/samples/tour.ads b/contrib/ncurses/Ada95/samples/tour.ads new file mode 100644 index 00000000..0011bbfc --- /dev/null +++ b/contrib/ncurses/Ada95/samples/tour.ads @@ -0,0 +1,42 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding Samples -- +-- -- +-- Tour -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control +-- $Revision: 1.11 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +procedure Tour; diff --git a/contrib/ncurses/Ada95/src/Makefile.in b/contrib/ncurses/Ada95/src/Makefile.in new file mode 100644 index 00000000..c35dbc08 --- /dev/null +++ b/contrib/ncurses/Ada95/src/Makefile.in @@ -0,0 +1,428 @@ +############################################################################## +# Copyright 2018-2021,2024 Thomas E. Dickey # +# Copyright 1999-2016,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Juergen Pfeifer, 1996 +# +# $Id: Makefile.in,v 1.97 2024/08/10 18:18:44 tom Exp $ +# +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +ADA_MFLAGS = @cf_cv_makeflags@ +@SET_MAKE@ + +MODEL = ../../@DFT_OBJ_SUBDIR@ + +DESTDIR = @DESTDIR@ + +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +includedir = @includedir@ +libdir = @libdir@ + +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) +ADA_INCLUDE = $(DESTDIR)@ADA_INCLUDE@ +ADA_OBJECTS = $(DESTDIR)@ADA_OBJECTS@ + +INSTALL = @INSTALL@ @INSTALL_OPT_O@ +INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AWK = @AWK@ +LN_S = @LN_S@ + +CC = @CC@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ + +CPPFLAGS = @ACPPFLAGS@ @CPPFLAGS@ \ + -DHAVE_CONFIG_H -I$(srcdir) + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +LINK = $(CC) +LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ + +RANLIB = @RANLIB@ + +################################################################################ +ADA = @cf_ada_compiler@ +ADAPREP = gnatprep +ADAFLAGS = @ADAFLAGS@ -I. -I$(srcdir) + +LIB_NAME = @ADA_LIBNAME@ +SONAME = @ADA_SHAREDLIB@ + +GNAT_PROJECT = @ADA_LIBNAME@.gpr + +# build/source are the Ada95 tree +BUILD_DIR = .. +SOURCE_DIR = .. + +BUILD_DIR_LIB = $(BUILD_DIR)/lib +SOURCE_DIR_SRC = $(SOURCE_DIR)/src + +ADAMAKE = @cf_ada_make@ +ADAMAKEFLAGS = \ + -P$(GNAT_PROJECT) \ + -XBUILD_DIR=`cd $(BUILD_DIR);pwd` \ + -XSOURCE_DIR=`cd $(SOURCE_DIR);pwd` \ + -XSOURCE_DIR2=`cd $(srcdir);pwd` \ + -XLIB_NAME=$(LIB_NAME) \ + -XSONAME=$(SONAME) + +CARGS = -cargs $(ADAFLAGS) +LARGS = + +STATIC_LIBNAME = lib$(LIB_NAME).a +SHARED_LIBNAME = $(SONAME) +SHARED_SYMLINK = lib$(LIB_NAME).so + +ALIB = @cf_ada_package@ +ABASE = $(ALIB)-curses +################################################################################ +GENERATED_SOURCES=$(ABASE).ads \ + $(ABASE).adb \ + $(ABASE)-aux.ads \ + $(ABASE)-trace.ads \ + $(ABASE)-menus.ads \ + $(ABASE)-forms.ads \ + $(ABASE)-mouse.ads \ + $(ABASE)-panels.ads \ + $(ABASE)-menus-menu_user_data.ads \ + $(ABASE)-menus-item_user_data.ads \ + $(ABASE)-forms-form_user_data.ads \ + $(ABASE)-forms-field_types.ads \ + $(ABASE)-forms-field_user_data.ads \ + $(ABASE)-panels-user_data.ads +################################################################################ +LIBOBJS=$(ALIB).o \ + $(ABASE)-aux.o \ + $(ABASE).o \ + $(ABASE)-terminfo.o \ + $(ABASE)-termcap.o \ + $(ABASE)-putwin.o \ + $(ABASE)-trace.o \ + $(ABASE)-mouse.o \ + $(ABASE)-panels.o \ + $(ABASE)-menus.o \ + $(ABASE)-forms.o \ + $(ABASE)-forms-field_types.o \ + $(ABASE)-forms-field_types-alpha.o \ + $(ABASE)-forms-field_types-alphanumeric.o \ + $(ABASE)-forms-field_types-intfield.o \ + $(ABASE)-forms-field_types-numeric.o \ + $(ABASE)-forms-field_types-regexp.o \ + $(ABASE)-forms-field_types-enumeration.o \ + $(ABASE)-forms-field_types-ipv4_address.o \ + $(ABASE)-forms-field_types-user.o \ + $(ABASE)-forms-field_types-user-choice.o \ + $(ABASE)-text_io.o \ + $(ABASE)-text_io-aux.o + +# Ada object files for generic packages. Since gnat 3.10 they are +# also compiled +GENOBJS=$(ABASE)-menus-menu_user_data.o \ + $(ABASE)-menus-item_user_data.o \ + $(ABASE)-forms-form_user_data.o \ + $(ABASE)-forms-field_user_data.o \ + $(ABASE)-forms-field_types-enumeration-ada.o \ + $(ABASE)-panels-user_data.o \ + $(ABASE)-text_io-integer_io.o \ + $(ABASE)-text_io-float_io.o \ + $(ABASE)-text_io-fixed_io.o \ + $(ABASE)-text_io-decimal_io.o \ + $(ABASE)-text_io-enumeration_io.o \ + $(ABASE)-text_io-modular_io.o \ + $(ABASE)-text_io-complex_io.o + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all :: $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) + @echo done + +$(ADA_INCLUDE) \ +$(ADA_OBJECTS) \ +$(LIBDIR) \ +$(BUILD_DIR_LIB) : + mkdir -p $@ + +$(GENERATED_SOURCES) : + ( cd ../gen; $(MAKE) $(ADA_MFLAGS) ) + +sources : $(GENERATED_SOURCES) + @echo made $@ + +libs \ +install \ +install.libs :: \ + $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) + @echo made $(STATIC_LIBNAME) + +#OLD:BEGIN +install \ +install.libs :: \ + $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) \ + $(ADA_OBJECTS) + @$(INSTALL_LIB) \ + $(BUILD_DIR_LIB)/$(STATIC_LIBNAME) \ + $(ADA_OBJECTS) + +uninstall \ +uninstall.libs :: + @rm -f $(ADA_OBJECTS)/$(STATIC_LIBNAME) +#OLD:END + +mostlyclean :: + rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] *.a + +clean :: mostlyclean + rm -f $(ABASE)-trace.adb + +distclean :: clean + rm -f Makefile library.gpr + +realclean :: distclean + +BASEDEPS=$(ABASE).ads $(ABASE)-aux.ads $(ABASE).adb + +$(ABASE)-trace.adb : $(srcdir)/$(ABASE)-trace.adb_p + rm -f $@ + $(ADAPREP) -DADA_TRACE=@ADA_TRACE@ @GNATPREP_OPTS@ $(srcdir)/$(ABASE)-trace.adb_p $@ + +############################################################################### +# Use these definitions when building a shared library. +SHARED_C_OBJS = c_varargs_to_ada.o c_threaded_variables.o ncurses_compat.o +SHARED_OBJS = $(SHARED_C_OBJS) @USE_OLD_MAKERULES@$(LIBOBJS) @cf_generic_objects@ + +c_varargs_to_ada.o : $(srcdir)/c_varargs_to_ada.c + $(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/c_varargs_to_ada.c + +c_threaded_variables.o : $(srcdir)/c_threaded_variables.c + $(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/c_threaded_variables.c + +ncurses_compat.o : $(srcdir)/ncurses_compat.c + $(CC) $(CFLAGS_DEFAULT) -c -o $@ $(srcdir)/ncurses_compat.c + +############################################################################### +# Use these definitions when building a static library. +STATIC_C_OBJS = static_c_varargs_to_ada.o static_c_threaded_variables.o static_ncurses_compat.o +STATIC_OBJS = $(STATIC_C_OBJS) @USE_OLD_MAKERULES@$(LIBOBJS) @cf_generic_objects@ + +static_c_varargs_to_ada.o : $(srcdir)/c_varargs_to_ada.c + $(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/c_varargs_to_ada.c + +static_c_threaded_variables.o : $(srcdir)/c_threaded_variables.c + $(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/c_threaded_variables.c + +static_ncurses_compat.o : $(srcdir)/ncurses_compat.c + $(CC) $(CFLAGS_NORMAL) -c -o $@ $(srcdir)/ncurses_compat.c + +############################################################################### + +@USE_OLD_MAKERULES@$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) :: \ +@USE_OLD_MAKERULES@ $(BUILD_DIR_LIB) \ +@USE_OLD_MAKERULES@ $(STATIC_OBJS) +@USE_OLD_MAKERULES@ $(AR) $(ARFLAGS) $@ $(STATIC_OBJS) + +$(BUILD_DIR)/static-ali : ; mkdir -p $@ +$(BUILD_DIR)/static-obj : ; mkdir -p $@ + +STATIC_DIRS = \ + $(BUILD_DIR_LIB) \ + $(BUILD_DIR)/static-ali \ + $(BUILD_DIR)/static-obj + +@USE_GNAT_PROJECTS@$(BUILD_DIR_LIB)/$(STATIC_LIBNAME) :: \ +@USE_GNAT_PROJECTS@ $(ABASE)-trace.adb \ +@USE_GNAT_PROJECTS@ $(STATIC_C_OBJS) \ +@USE_GNAT_PROJECTS@ $(STATIC_DIRS) +@USE_GNAT_PROJECTS@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ +@USE_GNAT_PROJECTS@ -rm -f $(GNAT_PROJECT) +@USE_GNAT_PROJECTS@ $(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT) +@USE_GNAT_PROJECTS@ @echo "Using GNAT Project:" +@USE_GNAT_MAKE_GPR@ @-$(SHELL) -c "diff -c $(srcdir)/library.gpr $(GNAT_PROJECT); exit 0" +@USE_GNAT_MAKE_GPR@ $(ADAMAKE) $(ADAMAKEFLAGS) -XLIB_KIND=static +@USE_GNAT_MAKE_GPR@ $(AR) $(ARFLAGS) $@ $(STATIC_C_OBJS) +@USE_GNAT_MAKE_GPR@ -rm -f $(GNAT_PROJECT) +@USE_GNAT_GPRBUILD@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" +@USE_GNAT_GPRBUILD@ gprbuild -p $(ADAMAKEFLAGS) -XLIB_KIND=static +@USE_GNAT_GPRBUILD@ -rm -f $(GNAT_PROJECT) + +#OLD:BEGIN +@USE_GNAT_LIBRARIES@install \ +@USE_GNAT_LIBRARIES@install.libs :: \ +@USE_GNAT_LIBRARIES@ $(ADA_OBJECTS) +@USE_GNAT_LIBRARIES@ $(INSTALL_LIB) \ +@USE_GNAT_LIBRARIES@ $(BUILD_DIR)/static-ali/*.ali \ +@USE_GNAT_LIBRARIES@ $(ADA_OBJECTS) +#OLD:END +# While gprinstall is the "recommended" tool, it is rather brittle, with +# hardcoded assumptions about the use of the install-name which prevent using +# that tool to make the directory layout of older versions of the AdaCurses +# package. +# +# In principle, one might just do +# --install-name="" +# and in dry-run mode, gprinstall pretends to handle it properly (trimming the +# empty directory level), but without the dry-run option, it fails (tested +# with gnat 10.1.1). +#NEW:BEGIN +#@USE_GNAT_LIBRARIES@install \ +#@USE_GNAT_LIBRARIES@install.libs :: +#@USE_GNAT_LIBRARIES@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ +#@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) +#@USE_GNAT_LIBRARIES@ $(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT) +#@USE_GNAT_LIBRARIES@ @echo "Using GNAT Project:" +#@USE_GNAT_LIBRARIES@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" +#@USE_GNAT_LIBRARIES@ +#@USE_GNAT_LIBRARIES@ gprinstall -m -v -f -p \ +#@USE_GNAT_LIBRARIES@ --prefix="$(DESTDIR)$(prefix)" \ +#@USE_GNAT_LIBRARIES@ $(ADAMAKEFLAGS) -XLIB_KIND=static \ +#@USE_GNAT_LIBRARIES@ --lib-subdir="$(DESTDIR)$(prefix)"/lib \ +#@USE_GNAT_LIBRARIES@ --ali-subdir="$(DESTDIR)$(prefix)"/lib/ada/adalib \ +#@USE_GNAT_LIBRARIES@ --sources-subdir="$(DESTDIR)$(prefix)"/share/ada/adainclude +#@USE_GNAT_LIBRARIES@ +#@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) +#NEW:END + +#OLD:BEGIN +uninstall \ +uninstall.libs :: + @rm -f $(ADA_OBJECTS)/$(STATIC_LIBNAME) +#OLD:END +#NEW:BEGIN +#@USE_GNAT_LIBRARIES@uninstall \ +#@USE_GNAT_LIBRARIES@uninstall.libs :: +#@USE_GNAT_LIBRARIES@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ +#@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) +#@USE_GNAT_LIBRARIES@ $(SHELL) $(srcdir)/library-cfg.sh static library.gpr $(CFLAGS_NORMAL) >$(GNAT_PROJECT) +#@USE_GNAT_LIBRARIES@ @echo "Using GNAT Project:" +#@USE_GNAT_LIBRARIES@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" +#@USE_GNAT_LIBRARIES@ +#@USE_GNAT_LIBRARIES@ gprinstall -v -f --prefix="$(DESTDIR)$(prefix)" --uninstall $(ADAMAKEFLAGS) -XLIB_KIND=static +#@USE_GNAT_LIBRARIES@ +#@USE_GNAT_LIBRARIES@ -rm -f $(GNAT_PROJECT) +#NEW:END + +@USE_GNAT_LIBRARIES@uninstall \ +@USE_GNAT_LIBRARIES@uninstall.libs :: +@USE_GNAT_LIBRARIES@ @$(SHELL) -c 'for name in $(BUILD_DIR)/static-ali/*.ali ; do rm -f $(ADA_OBJECTS)/`basename $$name`; done' + +$(BUILD_DIR)/dynamic-ali : ; mkdir -p $@ +$(BUILD_DIR)/dynamic-obj : ; mkdir -p $@ + +SHARED_DIRS = \ + $(BUILD_DIR_LIB) \ + $(BUILD_DIR)/dynamic-ali \ + $(BUILD_DIR)/dynamic-obj + +@MAKE_ADA_SHAREDLIB@all :: $(BUILD_DIR_LIB)/$(SHARED_LIBNAME) +@MAKE_ADA_SHAREDLIB@$(BUILD_DIR_LIB)/$(SHARED_LIBNAME) :: \ +@MAKE_ADA_SHAREDLIB@ $(ABASE)-trace.adb \ +@MAKE_ADA_SHAREDLIB@ $(SHARED_DIRS) \ +@MAKE_ADA_SHAREDLIB@ $(SHARED_OBJS) +@MAKE_ADA_SHAREDLIB@ cp $(SHARED_OBJS) $(BUILD_DIR)/dynamic-obj/ +@MAKE_ADA_SHAREDLIB@ @cf_ada_config@gprconfig --batch --config=Ada --config=C,,,,@cf_ada_config_C@ +@MAKE_ADA_SHAREDLIB@ -rm -f $(GNAT_PROJECT) +@MAKE_ADA_SHAREDLIB@ $(SHELL) $(srcdir)/library-cfg.sh dynamic library.gpr $(CFLAGS_SHARED) >$(GNAT_PROJECT) +@MAKE_ADA_SHAREDLIB@ @echo "Making Ada shared-lib:" +@MAKE_ADA_SHAREDLIB@ @-$(SHELL) -c "diff -c library.gpr $(GNAT_PROJECT); exit 0" +@MAKE_ADA_SHAREDLIB@ $(ADAMAKE) $(ADAMAKEFLAGS) -XLIB_KIND=dynamic +@MAKE_ADA_SHAREDLIB@ -rm -f $(GNAT_PROJECT) + +install \ +install.libs :: $(ADA_INCLUDE) + $(INSTALL_LIB) \ + $(SOURCE_DIR_SRC)/*.ad[sb] \ + $(ADA_INCLUDE) + +install \ +install.libs :: $(ADA_INCLUDE) + $(INSTALL_LIB) \ + $(GENERATED_SOURCES) \ + $(ADA_INCLUDE) + +uninstall \ +uninstall.libs :: + $(SHELL) -c 'for name in $(SOURCE_DIR_SRC)/*.ad[sb] $(GENERATED_SOURCES); do rm -f $(ADA_INCLUDE)/`basename $$name`; done' + +@MAKE_ADA_SHAREDLIB@install \ +@MAKE_ADA_SHAREDLIB@install.libs :: $(ADA_OBJECTS) $(LIBDIR) +@MAKE_ADA_SHAREDLIB@ $(INSTALL_LIB) \ +@MAKE_ADA_SHAREDLIB@ $(BUILD_DIR)/dynamic-ali/* \ +@MAKE_ADA_SHAREDLIB@ $(ADA_OBJECTS) +@MAKE_ADA_SHAREDLIB@ $(INSTALL_LIB) \ +@MAKE_ADA_SHAREDLIB@ $(BUILD_DIR_LIB)/$(SHARED_LIBNAME) \ +@MAKE_ADA_SHAREDLIB@ $(LIBDIR) +@MAKE_ADA_SHAREDLIB@ ( cd $(LIBDIR) && $(LN_S) $(SHARED_LIBNAME) $(SHARED_SYMLINK) ) +@MAKE_ADA_SHAREDLIB@ +@MAKE_ADA_SHAREDLIB@uninstall \ +@MAKE_ADA_SHAREDLIB@uninstall.libs :: +@MAKE_ADA_SHAREDLIB@ $(SHELL) -c 'for name in $(BUILD_DIR)/dynamic-ali/* ; do rm -f $(ADA_OBJECTS)/`basename $$name`; done' +@MAKE_ADA_SHAREDLIB@ +@MAKE_ADA_SHAREDLIB@uninstall \ +@MAKE_ADA_SHAREDLIB@uninstall.libs :: +@MAKE_ADA_SHAREDLIB@ rm -f $(LIBDIR)/$(SHARED_SYMLINK) +@MAKE_ADA_SHAREDLIB@ rm -f $(LIBDIR)/$(SHARED_LIBNAME) + +#rm-docs : +# gnatdoc --enable-build $(ADAMAKEFLAGS) -XLIB_KIND=static + +clean :: + -rm -f default.cgpr + -rm -rf $(BUILD_DIR)/*-ali + -rm -rf $(BUILD_DIR)/*-obj + -rm -rf $(BUILD_DIR_LIB) +#@USE_GNAT_PROJECTS@ gprclean $(ADAMAKEFLAGS) -XLIB_KIND=static +#@MAKE_ADA_SHAREDLIB@ gprclean $(ADAMAKEFLAGS) -XLIB_KIND=dynamic diff --git a/contrib/ncurses/Ada95/src/c_threaded_variables.c b/contrib/ncurses/Ada95/src/c_threaded_variables.c new file mode 100644 index 00000000..44b4bcbc --- /dev/null +++ b/contrib/ncurses/Ada95/src/c_threaded_variables.c @@ -0,0 +1,57 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Nicolas Boulenguez, 2011 * + ****************************************************************************/ + +#include "c_threaded_variables.h" + +#define WRAP(type, name) \ + type \ + name ## _as_function (void) \ + { \ + return name; \ + } +/* *INDENT-OFF* */ +WRAP(WINDOW *, stdscr) +WRAP(WINDOW *, curscr) + +WRAP(int, LINES) +WRAP(int, COLS) +WRAP(int, TABSIZE) +WRAP(int, COLORS) +WRAP(int, COLOR_PAIRS) + +chtype +acs_map_as_function(char inx) +{ + return acs_map[(unsigned char) inx]; +} +/* *INDENT-ON* */ diff --git a/contrib/ncurses/Ada95/src/c_threaded_variables.h b/contrib/ncurses/Ada95/src/c_threaded_variables.h new file mode 100644 index 00000000..e27ff7c3 --- /dev/null +++ b/contrib/ncurses/Ada95/src/c_threaded_variables.h @@ -0,0 +1,59 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2014,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* $Id: c_threaded_variables.h,v 1.4 2020/02/02 23:34:34 tom Exp $ */ + +#ifndef __C_THREADED_VARIABLES_H +#define __C_THREADED_VARIABLES_H + +#include + +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif + +#include + +extern WINDOW *stdscr_as_function(void); +extern WINDOW *curscr_as_function(void); + +extern int LINES_as_function(void); +extern int LINES_as_function(void); +extern int COLS_as_function(void); +extern int TABSIZE_as_function(void); +extern int COLORS_as_function(void); +extern int COLOR_PAIRS_as_function(void); + +extern chtype acs_map_as_function(char /* index */ ); + +#endif /* __C_THREADED_VARIABLES_H */ diff --git a/contrib/ncurses/Ada95/src/c_varargs_to_ada.c b/contrib/ncurses/Ada95/src/c_varargs_to_ada.c new file mode 100644 index 00000000..7561911a --- /dev/null +++ b/contrib/ncurses/Ada95/src/c_varargs_to_ada.c @@ -0,0 +1,118 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2011,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Nicolas Boulenguez, 2011 * + ****************************************************************************/ + +/* + Version Control + $Id: c_varargs_to_ada.c,v 1.7 2020/02/02 23:34:34 tom Exp $ + --------------------------------------------------------------------------*/ +/* + */ + +#include "c_varargs_to_ada.h" + +int +set_field_type_alnum(FIELD *field, + int minimum_width) +{ + return set_field_type(field, TYPE_ALNUM, minimum_width); +} + +int +set_field_type_alpha(FIELD *field, + int minimum_width) +{ + return set_field_type(field, TYPE_ALPHA, minimum_width); +} + +int +set_field_type_enum(FIELD *field, + char **value_list, + int case_sensitive, + int unique_match) +{ + return set_field_type(field, TYPE_ENUM, value_list, case_sensitive, + unique_match); +} + +int +set_field_type_integer(FIELD *field, + int precision, + long minimum, + long maximum) +{ + return set_field_type(field, TYPE_INTEGER, precision, minimum, maximum); +} + +int +set_field_type_numeric(FIELD *field, + int precision, + double minimum, + double maximum) +{ + return set_field_type(field, TYPE_NUMERIC, precision, minimum, maximum); +} + +int +set_field_type_regexp(FIELD *field, + char *regular_expression) +{ + return set_field_type(field, TYPE_REGEXP, regular_expression); +} + +int +set_field_type_ipv4(FIELD *field) +{ + return set_field_type(field, TYPE_IPV4); +} + +int +set_field_type_user(FIELD *field, + FIELDTYPE *fieldtype, + void *arg) +{ + return set_field_type(field, fieldtype, arg); +} + +void * +void_star_make_arg(va_list *list) +{ + return va_arg(*list, void *); +} + +#ifdef TRACE +void +_traces(const char *fmt, char *arg) +{ + _tracef(fmt, arg); +} +#endif diff --git a/contrib/ncurses/Ada95/src/c_varargs_to_ada.h b/contrib/ncurses/Ada95/src/c_varargs_to_ada.h new file mode 100644 index 00000000..8b782192 --- /dev/null +++ b/contrib/ncurses/Ada95/src/c_varargs_to_ada.h @@ -0,0 +1,82 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2011,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* $Id: c_varargs_to_ada.h,v 1.5 2020/02/02 23:34:34 tom Exp $ */ + +#ifndef __C_VARARGS_TO_ADA_H +#define __C_VARARGS_TO_ADA_H + +#ifdef HAVE_CONFIG_H +#include +#else +#include +#endif + +#include + +#include + +extern int set_field_type_alnum(FIELD * /* field */ , + int /* minimum_width */ ); + +extern int set_field_type_alpha(FIELD * /* field */ , + int /* minimum_width */ ); + +extern int set_field_type_enum(FIELD * /* field */ , + char ** /* value_list */ , + int /* case_sensitive */ , + int /* unique_match */ ); + +extern int set_field_type_integer(FIELD * /* field */ , + int /* precision */ , + long /* minimum */ , + long /* maximum */ ); + +extern int set_field_type_numeric(FIELD * /* field */ , + int /* precision */ , + double /* minimum */ , + double /* maximum */ ); + +extern int set_field_type_regexp(FIELD * /* field */ , + char * /* regular_expression */ ); + +extern int set_field_type_ipv4(FIELD * /* field */ ); + +extern int set_field_type_user(FIELD * /* field */ , + FIELDTYPE * /* fieldtype */ , + void * /* arg */ ); + +extern void *void_star_make_arg(va_list * /* list */ ); + +#ifdef TRACE +extern void _traces(const char * /* fmt */ + ,char * /* arg */ ); +#endif + +#endif /* __C_VARARGS_TO_ADA_H */ diff --git a/contrib/ncurses/Ada95/src/library-cfg.sh b/contrib/ncurses/Ada95/src/library-cfg.sh new file mode 100755 index 00000000..b9b5c938 --- /dev/null +++ b/contrib/ncurses/Ada95/src/library-cfg.sh @@ -0,0 +1,73 @@ +#!/bin/sh +############################################################################## +# Copyright 2018-2020,2022 Thomas E. Dickey # +# Copyright 2016,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# $Id: library-cfg.sh,v 1.8 2022/07/16 17:03:59 tom Exp $ +# +# Work around incompatible behavior introduced with gnat6, which causes +# gnatmake to attempt to compile all of the C objects which might be part of +# the project. This can only work if we provide the compiler flags (done here +# by making a copy of the project file with that information filled in). +model=$1 +shift 1 +input=$1 +shift 1 +param= +while test $# != 0 +do + case "x$1" in + *-[OgDIWf]*) + test -n "$param" && param="$param," + param="$param\"$1\"" + ;; + *) + echo "${0##*/}: ignored option $1" >&2 + ;; + esac + shift 1 +done + +SHARE="-- " +test "x$model" = "xdynamic" && SHARE= + +SCRIPT=library-cfg.tmp +cat >$SCRIPT < + +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif + +#include + +#if defined(NCURSES_VERSION_PATCH) + +#if NCURSES_VERSION_PATCH < 20081122 +extern bool has_mouse(void); +extern int _nc_has_mouse(void); + +bool +has_mouse(void) +{ + return (bool)_nc_has_mouse(); +} +#endif + +/* + * These are provided by lib_gen.c: + */ +#if NCURSES_VERSION_PATCH < 20070331 +extern bool (is_keypad) (const WINDOW *); +extern bool (is_scrollok) (const WINDOW *); + +bool +is_keypad(const WINDOW *win) +{ + return ((win)->_use_keypad); +} + +bool + (is_scrollok) (const WINDOW *win) +{ + return ((win)->_scroll); +} +#endif + +#if NCURSES_VERSION_PATCH < 20060107 +extern int (getbegx) (WINDOW *); +extern int (getbegy) (WINDOW *); +extern int (getcurx) (WINDOW *); +extern int (getcury) (WINDOW *); +extern int (getmaxx) (WINDOW *); +extern int (getmaxy) (WINDOW *); +extern int (getparx) (WINDOW *); +extern int (getpary) (WINDOW *); + +int + (getbegy) (WINDOW *win) +{ + return ((win) ? (win)->_begy : ERR); +} + +int + (getbegx) (WINDOW *win) +{ + return ((win) ? (win)->_begx : ERR); +} + +int + (getcury) (WINDOW *win) +{ + return ((win) ? (win)->_cury : ERR); +} + +int + (getcurx) (WINDOW *win) +{ + return ((win) ? (win)->_curx : ERR); +} + +int + (getmaxy) (WINDOW *win) +{ + return ((win) ? ((win)->_maxy + 1) : ERR); +} + +int + (getmaxx) (WINDOW *win) +{ + return ((win) ? ((win)->_maxx + 1) : ERR); +} + +int + (getpary) (WINDOW *win) +{ + return ((win) ? (win)->_pary : ERR); +} + +int + (getparx) (WINDOW *win) +{ + return ((win) ? (win)->_parx : ERR); +} +#endif + +#endif diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-aux.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-aux.adb new file mode 100644 index 00000000..2f506aff --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-aux.adb @@ -0,0 +1,117 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Aux -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package body Terminal_Interface.Curses.Aux is + -- + -- Some helpers + procedure Fill_String (Cp : chars_ptr; + Str : out String) + is + -- Fill the string with the characters referenced by the + -- chars_ptr. + -- + Len : Natural; + begin + if Cp /= Null_Ptr then + Len := Natural (Strlen (Cp)); + if Str'Length < Len then + raise Constraint_Error; + end if; + declare + S : String (1 .. Len); + begin + S := Value (Cp); + Str (Str'First .. (Str'First + Len - 1)) := S (S'Range); + end; + else + Len := 0; + end if; + + if Len < Str'Length then + Str ((Str'First + Len) .. Str'Last) := (others => ' '); + end if; + + end Fill_String; + + function Fill_String (Cp : chars_ptr) return String + is + Len : Natural; + begin + if Cp /= Null_Ptr then + Len := Natural (Strlen (Cp)); + if Len = 0 then + return ""; + else + declare + S : String (1 .. Len); + begin + Fill_String (Cp, S); + return S; + end; + end if; + else + return ""; + end if; + end Fill_String; + + procedure Eti_Exception (Code : Eti_Error) + is + begin + case Code is + when E_Ok => null; + when E_System_Error => raise Eti_System_Error; + when E_Bad_Argument => raise Eti_Bad_Argument; + when E_Posted => raise Eti_Posted; + when E_Connected => raise Eti_Connected; + when E_Bad_State => raise Eti_Bad_State; + when E_No_Room => raise Eti_No_Room; + when E_Not_Posted => raise Eti_Not_Posted; + when E_Unknown_Command => raise Eti_Unknown_Command; + when E_No_Match => raise Eti_No_Match; + when E_Not_Selectable => raise Eti_Not_Selectable; + when E_Not_Connected => raise Eti_Not_Connected; + when E_Request_Denied => raise Eti_Request_Denied; + when E_Invalid_Field => raise Eti_Invalid_Field; + when E_Current => raise Eti_Current; + end case; + end Eti_Exception; + +end Terminal_Interface.Curses.Aux; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb new file mode 100644 index 00000000..23cf7b76 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb @@ -0,0 +1,59 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Alpha -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.14 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.Alpha is + + procedure Set_Field_Type (Fld : Field; + Typ : Alpha_Field) + is + function Set_Fld_Type (F : Field := Fld; + Arg1 : C_Int) return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_alpha"); + + begin + Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Minimum_Field_Width))); + Wrap_Builtin (Fld, Typ); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.Alpha; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads new file mode 100644 index 00000000..3cfadb6c --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads @@ -0,0 +1,54 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Alpha -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface.Curses.Forms.Field_Types.Alpha is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.Alpha); + + type Alpha_Field is new Field_Type + with record + Minimum_Field_Width : Natural := 0; + end record; + + procedure Set_Field_Type (Fld : Field; + Typ : Alpha_Field); + pragma Inline (Set_Field_Type); + +end Terminal_Interface.Curses.Forms.Field_Types.Alpha; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb new file mode 100644 index 00000000..55db15c7 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb @@ -0,0 +1,59 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.14 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric is + + procedure Set_Field_Type (Fld : Field; + Typ : AlphaNumeric_Field) + is + function Set_Fld_Type (F : Field := Fld; + Arg1 : C_Int) return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_alnum"); + + begin + Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Minimum_Field_Width))); + Wrap_Builtin (Fld, Typ); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads new file mode 100644 index 00000000..ef17c257 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads @@ -0,0 +1,55 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric is + pragma Preelaborate + (Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric); + + type AlphaNumeric_Field is new Field_Type + with record + Minimum_Field_Width : Natural := 0; + end record; + + procedure Set_Field_Type (Fld : Field; + Typ : AlphaNumeric_Field); + pragma Inline (Set_Field_Type); + +end Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb new file mode 100644 index 00000000..472aa239 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb @@ -0,0 +1,82 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2004,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Characters.Handling; use Ada.Characters.Handling; + +package body Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada is + + function Create (Set : Type_Set := Mixed_Case; + Case_Sensitive : Boolean := False; + Must_Be_Unique : Boolean := False) + return Enumeration_Field + is + I : Enumeration_Info (T'Pos (T'Last) - T'Pos (T'First) + 1); + J : Positive := 1; + begin + I.Case_Sensitive := Case_Sensitive; + I.Match_Must_Be_Unique := Must_Be_Unique; + + for E in T'Range loop + I.Names (J) := new String'(T'Image (E)); + -- The Image attribute defaults to upper case, so we have to handle + -- only the other ones... + if Set /= Upper_Case then + I.Names (J).all := To_Lower (I.Names (J).all); + if Set = Mixed_Case then + I.Names (J).all (I.Names (J).all'First) := + To_Upper (I.Names (J).all (I.Names (J).all'First)); + end if; + end if; + J := J + 1; + end loop; + + return Create (I, True); + end Create; + + function Value (Fld : Field; + Buf : Buffer_Number := Buffer_Number'First) return T + is + begin + return T'Value (Get_Buffer (Fld, Buf)); + end Value; + +end Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads new file mode 100644 index 00000000..33bc343e --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads @@ -0,0 +1,60 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type T is (<>); + +package Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada is + pragma Preelaborate + (Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada); + + function Create (Set : Type_Set := Mixed_Case; + Case_Sensitive : Boolean := False; + Must_Be_Unique : Boolean := False) + return Enumeration_Field; + + function Value (Fld : Field; + Buf : Buffer_Number := Buffer_Number'First) return T; + -- Translate the content of the fields buffer - indicated by the + -- buffer number - into an enumeration value. If the buffer is empty + -- or the content is invalid, a Constraint_Error is raises. + +end Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb new file mode 100644 index 00000000..d45a9e90 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb @@ -0,0 +1,113 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Enumeration -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Unchecked_Deallocation; +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.Enumeration is + + function Create (Info : Enumeration_Info; + Auto_Release_Names : Boolean := False) + return Enumeration_Field + is + procedure Release_String is + new Ada.Unchecked_Deallocation (String, + String_Access); + E : Enumeration_Field; + L : constant size_t := 1 + size_t (Info.C); + S : String_Access; + begin + E.Case_Sensitive := Info.Case_Sensitive; + E.Match_Must_Be_Unique := Info.Match_Must_Be_Unique; + E.Arr := new chars_ptr_array (size_t (1) .. L); + for I in 1 .. Positive (L - 1) loop + if Info.Names (I) = null then + raise Form_Exception; + end if; + E.Arr.all (size_t (I)) := New_String (Info.Names (I).all); + if Auto_Release_Names then + S := Info.Names (I); + Release_String (S); + end if; + end loop; + E.Arr.all (L) := Null_Ptr; + return E; + end Create; + + procedure Release (Enum : in out Enumeration_Field) + is + I : size_t := 0; + P : chars_ptr; + begin + loop + P := Enum.Arr.all (I); + exit when P = Null_Ptr; + Free (P); + Enum.Arr.all (I) := Null_Ptr; + I := I + 1; + end loop; + Enum.Arr := null; + end Release; + + procedure Set_Field_Type (Fld : Field; + Typ : Enumeration_Field) + is + function Set_Fld_Type (F : Field := Fld; + Arg1 : chars_ptr_array; + Arg2 : C_Int; + Arg3 : C_Int) return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_enum"); + + begin + if Typ.Arr = null then + raise Form_Exception; + end if; + Eti_Exception + (Set_Fld_Type + (Arg1 => Typ.Arr.all, + Arg2 => C_Int (Boolean'Pos (Typ.Case_Sensitive)), + Arg3 => C_Int (Boolean'Pos (Typ.Match_Must_Be_Unique)))); + Wrap_Builtin (Fld, Typ, C_Choice_Router); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.Enumeration; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads new file mode 100644 index 00000000..ca9ab523 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads @@ -0,0 +1,99 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Enumeration -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C.Strings; + +package Terminal_Interface.Curses.Forms.Field_Types.Enumeration is + pragma Preelaborate + (Terminal_Interface.Curses.Forms.Field_Types.Enumeration); + + type String_Access is access String; + + -- Type_Set is used by the child package Ada + type Type_Set is (Lower_Case, Upper_Case, Mixed_Case); + + type Enum_Array is array (Positive range <>) + of String_Access; + + type Enumeration_Info (C : Positive) is + record + Case_Sensitive : Boolean := False; + Match_Must_Be_Unique : Boolean := False; + Names : Enum_Array (1 .. C); + end record; + + type Enumeration_Field is new Field_Type with private; + + function Create (Info : Enumeration_Info; + Auto_Release_Names : Boolean := False) + return Enumeration_Field; + -- Make an fieldtype from the info. Enumerations are special, because + -- they normally don't copy the enum values into a private store, so + -- we have to care for the lifetime of the info we provide. + -- The Auto_Release_Names flag may be used to automatically releases + -- the strings in the Names array of the Enumeration_Info. + + function Make_Enumeration_Type (Info : Enumeration_Info; + Auto_Release_Names : Boolean := False) + return Enumeration_Field renames Create; + + procedure Release (Enum : in out Enumeration_Field); + -- But we may want to release the field to release the memory allocated + -- by it internally. After that the Enumeration field is no longer usable. + + -- The next type definitions are all ncurses extensions. They are typically + -- not available in other curses implementations. + + procedure Set_Field_Type (Fld : Field; + Typ : Enumeration_Field); + pragma Inline (Set_Field_Type); + +private + type CPA_Access is access Interfaces.C.Strings.chars_ptr_array; + + type Enumeration_Field is new Field_Type with + record + Case_Sensitive : Boolean := False; + Match_Must_Be_Unique : Boolean := False; + Arr : CPA_Access := null; + end record; + +end Terminal_Interface.Curses.Forms.Field_Types.Enumeration; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb new file mode 100644 index 00000000..59e9d1e2 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb @@ -0,0 +1,63 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.IntField -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.14 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.IntField is + + procedure Set_Field_Type (Fld : Field; + Typ : Integer_Field) + is + function Set_Fld_Type (F : Field := Fld; + Arg1 : C_Int; + Arg2 : C_Long_Int; + Arg3 : C_Long_Int) return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_integer"); + + begin + Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Precision), + Arg2 => C_Long_Int (Typ.Lower_Limit), + Arg3 => C_Long_Int (Typ.Upper_Limit))); + Wrap_Builtin (Fld, Typ); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.IntField; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads new file mode 100644 index 00000000..1217824a --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.IntField -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface.Curses.Forms.Field_Types.IntField is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.IntField); + + type Integer_Field is new Field_Type with + record + Precision : Natural; + Lower_Limit : Integer; + Upper_Limit : Integer; + end record; + + procedure Set_Field_Type (Fld : Field; + Typ : Integer_Field); + pragma Inline (Set_Field_Type); + +end Terminal_Interface.Curses.Forms.Field_Types.IntField; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb new file mode 100644 index 00000000..4b5d10b5 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb @@ -0,0 +1,59 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.14 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address is + + procedure Set_Field_Type (Fld : Field; + Typ : Internet_V4_Address_Field) + is + function Set_Fld_Type (F : Field := Fld) + return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_ipv4"); + + begin + Eti_Exception (Set_Fld_Type); + Wrap_Builtin (Fld, Typ); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads new file mode 100644 index 00000000..bf3b77d5 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads @@ -0,0 +1,52 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address is + pragma Preelaborate + (Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address); + + type Internet_V4_Address_Field is new Field_Type with null record; + + procedure Set_Field_Type (Fld : Field; + Typ : Internet_V4_Address_Field); + pragma Inline (Set_Field_Type); + +end Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb new file mode 100644 index 00000000..7b1d9318 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb @@ -0,0 +1,66 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Numeric -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.Numeric is + + procedure Set_Field_Type (Fld : Field; + Typ : Numeric_Field) + is + type Double is new Interfaces.C.double; + + function Set_Fld_Type (F : Field := Fld; + Arg1 : C_Int; + Arg2 : Double; + Arg3 : Double) return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_numeric"); + + begin + Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Precision), + Arg2 => Double (Typ.Lower_Limit), + Arg3 => Double (Typ.Upper_Limit))); + Wrap_Builtin (Fld, Typ); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.Numeric; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads new file mode 100644 index 00000000..a7df7a47 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.Numeric -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface.Curses.Forms.Field_Types.Numeric is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.Numeric); + + type Numeric_Field is new Field_Type with + record + Precision : Natural; + Lower_Limit : Float; + Upper_Limit : Float; + end record; + + procedure Set_Field_Type (Fld : Field; + Typ : Numeric_Field); + pragma Inline (Set_Field_Type); + +end Terminal_Interface.Curses.Forms.Field_Types.Numeric; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb new file mode 100644 index 00000000..fbc42e94 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb @@ -0,0 +1,59 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.RegExp -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C; use Interfaces.C; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.RegExp is + + procedure Set_Field_Type (Fld : Field; + Typ : Regular_Expression_Field) + is + function Set_Ftyp (F : Field := Fld; + Arg1 : char_array) return Eti_Error; + pragma Import (C, Set_Ftyp, "set_field_type_regexp"); + + begin + Eti_Exception (Set_Ftyp (Arg1 => To_C (Typ.Regular_Expression.all))); + Wrap_Builtin (Fld, Typ); + end Set_Field_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.RegExp; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads new file mode 100644 index 00000000..ee5146b7 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.RegExp -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface.Curses.Forms.Field_Types.RegExp is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.RegExp); + + type String_Access is access String; + + type Regular_Expression_Field is new Field_Type with + record + Regular_Expression : String_Access; + end record; + + procedure Set_Field_Type (Fld : Field; + Typ : Regular_Expression_Field); + pragma Inline (Set_Field_Type); + +end Terminal_Interface.Curses.Forms.Field_Types.RegExp; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb new file mode 100644 index 00000000..913cec05 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb @@ -0,0 +1,105 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.User.Choice -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.21 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System.Address_To_Access_Conversions; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.User.Choice is + + package Argument_Conversions is + new System.Address_To_Access_Conversions (Argument); + + function Generic_Next (Fld : Field; + Usr : System.Address) return Curses_Bool + is + Result : Boolean; + Udf : constant User_Defined_Field_Type_With_Choice_Access := + User_Defined_Field_Type_With_Choice_Access + (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ); + begin + Result := Next (Fld, Udf.all); + return Curses_Bool (Boolean'Pos (Result)); + end Generic_Next; + + function Generic_Prev (Fld : Field; + Usr : System.Address) return Curses_Bool + is + Result : Boolean; + Udf : constant User_Defined_Field_Type_With_Choice_Access := + User_Defined_Field_Type_With_Choice_Access + (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ); + begin + Result := Previous (Fld, Udf.all); + return Curses_Bool (Boolean'Pos (Result)); + end Generic_Prev; + + -- ----------------------------------------------------------------------- + -- + function C_Generic_Choice return C_Field_Type + is + Res : Eti_Error; + T : C_Field_Type; + begin + if M_Generic_Choice = Null_Field_Type then + T := New_Fieldtype (Generic_Field_Check'Access, + Generic_Char_Check'Access); + if T = Null_Field_Type then + raise Form_Exception; + else + Res := Set_Fieldtype_Arg (T, + Make_Arg'Access, + Copy_Arg'Access, + Free_Arg'Access); + Eti_Exception (Res); + + Res := Set_Fieldtype_Choice (T, + Generic_Next'Access, + Generic_Prev'Access); + Eti_Exception (Res); + end if; + M_Generic_Choice := T; + end if; + pragma Assert (M_Generic_Choice /= Null_Field_Type); + return M_Generic_Choice; + end C_Generic_Choice; + +end Terminal_Interface.Curses.Forms.Field_Types.User.Choice; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads new file mode 100644 index 00000000..518c1929 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads @@ -0,0 +1,95 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.User.Choice -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2008,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C; + +package Terminal_Interface.Curses.Forms.Field_Types.User.Choice is + pragma Preelaborate + (Terminal_Interface.Curses.Forms.Field_Types.User.Choice); + + subtype C_Int is Interfaces.C.int; + + type User_Defined_Field_Type_With_Choice is abstract new + User_Defined_Field_Type with null record; + -- This is the root of the mechanism we use to create field types in + -- Ada95 that allow the prev/next mechanism. You should your own type + -- derive from this one and implement the Field_Check, Character_Check + -- Next and Previous functions for your own type. + + type User_Defined_Field_Type_With_Choice_Access is access all + User_Defined_Field_Type_With_Choice'Class; + + function Next + (Fld : Field; + Typ : User_Defined_Field_Type_With_Choice) return Boolean + is abstract; + -- If True is returned, the function successfully generated a next + -- value into the fields buffer. + + function Previous + (Fld : Field; + Typ : User_Defined_Field_Type_With_Choice) return Boolean + is abstract; + -- If True is returned, the function successfully generated a previous + -- value into the fields buffer. + + -- +---------------------------------------------------------------------- + -- | Private Part. + -- | +private + function C_Generic_Choice return C_Field_Type; + + function Generic_Next (Fld : Field; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Generic_Next); + -- This is the generic next Choice_Function for the low-level fieldtype + -- representing all the User_Defined_Field_Type derivatives. It routes + -- the call to the Next implementation for the type. + + function Generic_Prev (Fld : Field; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Generic_Prev); + -- This is the generic prev Choice_Function for the low-level fieldtype + -- representing all the User_Defined_Field_Type derivatives. It routes + -- the call to the Previous implementation for the type. + +end Terminal_Interface.Curses.Forms.Field_Types.User.Choice; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.adb new file mode 100644 index 00000000..3f90b958 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.adb @@ -0,0 +1,127 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.User -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.24 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with System.Address_To_Access_Conversions; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Field_Types.User is + + procedure Set_Field_Type (Fld : Field; + Typ : User_Defined_Field_Type) + is + function Allocate_Arg (T : User_Defined_Field_Type'Class) + return Argument_Access; + + function Set_Fld_Type (F : Field := Fld; + Cft : C_Field_Type := C_Generic_Type; + Arg1 : Argument_Access) + return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_user"); + + function Allocate_Arg (T : User_Defined_Field_Type'Class) + return Argument_Access + is + Ptr : constant Field_Type_Access + := new User_Defined_Field_Type'Class'(T); + begin + return new Argument'(Usr => System.Null_Address, + Typ => Ptr, + Cft => Null_Field_Type); + end Allocate_Arg; + + begin + Eti_Exception (Set_Fld_Type (Arg1 => Allocate_Arg (Typ))); + end Set_Field_Type; + + package Argument_Conversions is + new System.Address_To_Access_Conversions (Argument); + + function Generic_Field_Check (Fld : Field; + Usr : System.Address) return Curses_Bool + is + Result : Boolean; + Udf : constant User_Defined_Field_Type_Access := + User_Defined_Field_Type_Access + (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ); + begin + Result := Field_Check (Fld, Udf.all); + return Curses_Bool (Boolean'Pos (Result)); + end Generic_Field_Check; + + function Generic_Char_Check (Ch : C_Int; + Usr : System.Address) return Curses_Bool + is + Result : Boolean; + Udf : constant User_Defined_Field_Type_Access := + User_Defined_Field_Type_Access + (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ); + begin + Result := Character_Check (Character'Val (Ch), Udf.all); + return Curses_Bool (Boolean'Pos (Result)); + end Generic_Char_Check; + + -- ----------------------------------------------------------------------- + -- + function C_Generic_Type return C_Field_Type + is + Res : Eti_Error; + T : C_Field_Type; + begin + if M_Generic_Type = Null_Field_Type then + T := New_Fieldtype (Generic_Field_Check'Access, + Generic_Char_Check'Access); + if T = Null_Field_Type then + raise Form_Exception; + else + Res := Set_Fieldtype_Arg (T, + Make_Arg'Access, + Copy_Arg'Access, + Free_Arg'Access); + Eti_Exception (Res); + end if; + M_Generic_Type := T; + end if; + pragma Assert (M_Generic_Type /= Null_Field_Type); + return M_Generic_Type; + end C_Generic_Type; + +end Terminal_Interface.Curses.Forms.Field_Types.User; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.ads new file mode 100644 index 00000000..c82a70cf --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types-user.ads @@ -0,0 +1,96 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types.User -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2009,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.16 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C; + +package Terminal_Interface.Curses.Forms.Field_Types.User is + pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.User); + subtype C_Int is Interfaces.C.int; + + type User_Defined_Field_Type is abstract new Field_Type with null record; + -- This is the root of the mechanism we use to create field types in + -- Ada95. You should your own type derive from this one and implement + -- the Field_Check and Character_Check functions for your own type. + + type User_Defined_Field_Type_Access is access all + User_Defined_Field_Type'Class; + + function Field_Check + (Fld : Field; + Typ : User_Defined_Field_Type) return Boolean + is abstract; + -- If True is returned, the field is considered valid, otherwise it is + -- invalid. + + function Character_Check + (Ch : Character; + Typ : User_Defined_Field_Type) return Boolean + is abstract; + -- If True is returned, the character is considered as valid for the + -- field, otherwise as invalid. + + procedure Set_Field_Type (Fld : Field; + Typ : User_Defined_Field_Type); + -- This should work for all types derived from User_Defined_Field_Type. + -- No need to reimplement it for your derived type. + + -- +---------------------------------------------------------------------- + -- | Private Part. + -- | Used by the Choice child package. +private + function C_Generic_Type return C_Field_Type; + + function Generic_Field_Check (Fld : Field; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Generic_Field_Check); + -- This is the generic Field_Check_Function for the low-level fieldtype + -- representing all the User_Defined_Field_Type derivatives. It routes + -- the call to the Field_Check implementation for the type. + + function Generic_Char_Check (Ch : C_Int; + Usr : System.Address) return Curses_Bool; + pragma Convention (C, Generic_Char_Check); + -- This is the generic Char_Check_Function for the low-level fieldtype + -- representing all the User_Defined_Field_Type derivatives. It routes + -- the call to the Character_Check implementation for the type. + +end Terminal_Interface.Curses.Forms.Field_Types.User; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types.adb new file mode 100644 index 00000000..19f4aee1 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_types.adb @@ -0,0 +1,270 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_Types -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.29 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; +with Ada.Unchecked_Deallocation; +with System.Address_To_Access_Conversions; + +-- | +-- |===================================================================== +-- | man page form_fieldtype.3x +-- |===================================================================== +-- | +package body Terminal_Interface.Curses.Forms.Field_Types is + + use type System.Address; + + package Argument_Conversions is + new System.Address_To_Access_Conversions (Argument); + + function Get_Fieldtype (F : Field) return C_Field_Type; + pragma Import (C, Get_Fieldtype, "field_type"); + + function Get_Arg (F : Field) return System.Address; + pragma Import (C, Get_Arg, "field_arg"); + -- | + -- |===================================================================== + -- | man page form_field_validation.3x + -- |===================================================================== + -- | + -- | + -- | + function Get_Type (Fld : Field) return Field_Type_Access + is + Low_Level : constant C_Field_Type := Get_Fieldtype (Fld); + Arg : Argument_Access; + begin + if Low_Level = Null_Field_Type then + return null; + else + if Low_Level = M_Builtin_Router or else + Low_Level = M_Generic_Type or else + Low_Level = M_Choice_Router or else + Low_Level = M_Generic_Choice + then + Arg := Argument_Access + (Argument_Conversions.To_Pointer (Get_Arg (Fld))); + if Arg = null then + raise Form_Exception; + else + return Arg.all.Typ; + end if; + else + raise Form_Exception; + end if; + end if; + end Get_Type; + + function Copy_Arg (Usr : System.Address) return System.Address + is + begin + return Usr; + end Copy_Arg; + + procedure Free_Arg (Usr : System.Address) + is + procedure Free_Type is new Ada.Unchecked_Deallocation + (Field_Type'Class, Field_Type_Access); + procedure Freeargs is new Ada.Unchecked_Deallocation + (Argument, Argument_Access); + + To_Be_Free : Argument_Access + := Argument_Access (Argument_Conversions.To_Pointer (Usr)); + Low_Level : C_Field_Type; + begin + if To_Be_Free /= null then + if To_Be_Free.all.Usr /= System.Null_Address then + Low_Level := To_Be_Free.all.Cft; + if Low_Level.all.Freearg /= null then + Low_Level.all.Freearg (To_Be_Free.all.Usr); + end if; + end if; + if To_Be_Free.all.Typ /= null then + Free_Type (To_Be_Free.all.Typ); + end if; + Freeargs (To_Be_Free); + end if; + end Free_Arg; + + procedure Wrap_Builtin (Fld : Field; + Typ : Field_Type'Class; + Cft : C_Field_Type := C_Builtin_Router) + is + Usr_Arg : constant System.Address := Get_Arg (Fld); + Low_Level : constant C_Field_Type := Get_Fieldtype (Fld); + Arg : Argument_Access; + function Set_Fld_Type (F : Field := Fld; + Cf : C_Field_Type := Cft; + Arg1 : Argument_Access) return Eti_Error; + pragma Import (C, Set_Fld_Type, "set_field_type_user"); + + begin + pragma Assert (Low_Level /= Null_Field_Type); + if Cft /= C_Builtin_Router and then Cft /= C_Choice_Router then + raise Form_Exception; + else + Arg := new Argument'(Usr => System.Null_Address, + Typ => new Field_Type'Class'(Typ), + Cft => Get_Fieldtype (Fld)); + if Usr_Arg /= System.Null_Address then + if Low_Level.all.Copyarg /= null then + Arg.all.Usr := Low_Level.all.Copyarg (Usr_Arg); + else + Arg.all.Usr := Usr_Arg; + end if; + end if; + + Eti_Exception (Set_Fld_Type (Arg1 => Arg)); + end if; + end Wrap_Builtin; + + function Field_Check_Router (Fld : Field; + Usr : System.Address) return Curses_Bool + is + Arg : constant Argument_Access + := Argument_Access (Argument_Conversions.To_Pointer (Usr)); + begin + pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type + and then Arg.all.Typ /= null); + if Arg.all.Cft.all.Fcheck /= null then + return Arg.all.Cft.all.Fcheck (Fld, Arg.all.Usr); + else + return 1; + end if; + end Field_Check_Router; + + function Char_Check_Router (Ch : C_Int; + Usr : System.Address) return Curses_Bool + is + Arg : constant Argument_Access + := Argument_Access (Argument_Conversions.To_Pointer (Usr)); + begin + pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type + and then Arg.all.Typ /= null); + if Arg.all.Cft.all.Ccheck /= null then + return Arg.all.Cft.all.Ccheck (Ch, Arg.all.Usr); + else + return 1; + end if; + end Char_Check_Router; + + function Next_Router (Fld : Field; + Usr : System.Address) return Curses_Bool + is + Arg : constant Argument_Access + := Argument_Access (Argument_Conversions.To_Pointer (Usr)); + begin + pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type + and then Arg.all.Typ /= null); + if Arg.all.Cft.all.Next /= null then + return Arg.all.Cft.all.Next (Fld, Arg.all.Usr); + else + return 1; + end if; + end Next_Router; + + function Prev_Router (Fld : Field; + Usr : System.Address) return Curses_Bool + is + Arg : constant Argument_Access := + Argument_Access (Argument_Conversions.To_Pointer (Usr)); + begin + pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type + and then Arg.all.Typ /= null); + if Arg.all.Cft.all.Prev /= null then + return Arg.all.Cft.all.Prev (Fld, Arg.all.Usr); + else + return 1; + end if; + end Prev_Router; + + -- ----------------------------------------------------------------------- + -- + function C_Builtin_Router return C_Field_Type + is + T : C_Field_Type; + begin + if M_Builtin_Router = Null_Field_Type then + T := New_Fieldtype (Field_Check_Router'Access, + Char_Check_Router'Access); + if T = Null_Field_Type then + raise Form_Exception; + else + Eti_Exception (Set_Fieldtype_Arg (T, + Make_Arg'Access, + Copy_Arg'Access, + Free_Arg'Access)); + end if; + M_Builtin_Router := T; + end if; + pragma Assert (M_Builtin_Router /= Null_Field_Type); + return M_Builtin_Router; + end C_Builtin_Router; + + -- ----------------------------------------------------------------------- + -- + function C_Choice_Router return C_Field_Type + is + T : C_Field_Type; + begin + if M_Choice_Router = Null_Field_Type then + T := New_Fieldtype (Field_Check_Router'Access, + Char_Check_Router'Access); + if T = Null_Field_Type then + raise Form_Exception; + else + Eti_Exception (Set_Fieldtype_Arg (T, + Make_Arg'Access, + Copy_Arg'Access, + Free_Arg'Access)); + + Eti_Exception (Set_Fieldtype_Choice (T, + Next_Router'Access, + Prev_Router'Access)); + end if; + M_Choice_Router := T; + end if; + pragma Assert (M_Choice_Router /= Null_Field_Type); + return M_Choice_Router; + end C_Choice_Router; + +end Terminal_Interface.Curses.Forms.Field_Types; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_user_data.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_user_data.adb new file mode 100644 index 00000000..8b947d51 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-field_user_data.adb @@ -0,0 +1,81 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Field_User_Data -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.17 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +-- | +-- |===================================================================== +-- | man page form_field_userptr.3x +-- |===================================================================== +-- | +package body Terminal_Interface.Curses.Forms.Field_User_Data is + -- | + -- | + -- | + procedure Set_User_Data (Fld : Field; + Data : User_Access) + is + function Set_Field_Userptr (Fld : Field; + Usr : User_Access) return Eti_Error; + pragma Import (C, Set_Field_Userptr, "set_field_userptr"); + + begin + Eti_Exception (Set_Field_Userptr (Fld, Data)); + end Set_User_Data; + -- | + -- | + -- | + function Get_User_Data (Fld : Field) return User_Access + is + function Field_Userptr (Fld : Field) return User_Access; + pragma Import (C, Field_Userptr, "field_userptr"); + begin + return Field_Userptr (Fld); + end Get_User_Data; + + procedure Get_User_Data (Fld : Field; + Data : out User_Access) + is + begin + Data := Get_User_Data (Fld); + end Get_User_Data; + +end Terminal_Interface.Curses.Forms.Field_User_Data; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-form_user_data.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-form_user_data.adb new file mode 100644 index 00000000..5091c22d --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms-form_user_data.adb @@ -0,0 +1,82 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms.Form_User_Data -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.17 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +-- | +-- |===================================================================== +-- | man page form__userptr.3x +-- |===================================================================== +-- | +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms.Form_User_Data is + + -- | + -- | + -- | + procedure Set_User_Data (Frm : Form; + Data : User_Access) + is + function Set_Form_Userptr (Frm : Form; + Data : User_Access) return Eti_Error; + pragma Import (C, Set_Form_Userptr, "set_form_userptr"); + + begin + Eti_Exception (Set_Form_Userptr (Frm, Data)); + end Set_User_Data; + -- | + -- | + -- | + function Get_User_Data (Frm : Form) return User_Access + is + function Form_Userptr (Frm : Form) return User_Access; + pragma Import (C, Form_Userptr, "form_userptr"); + begin + return Form_Userptr (Frm); + end Get_User_Data; + + procedure Get_User_Data (Frm : Form; + Data : out User_Access) + is + begin + Data := Get_User_Data (Frm); + end Get_User_Data; + +end Terminal_Interface.Curses.Forms.Form_User_Data; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-forms.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms.adb new file mode 100644 index 00000000..f50420e6 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-forms.adb @@ -0,0 +1,1032 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Forms -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.33 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Unchecked_Deallocation; + +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; +with Interfaces.C.Pointers; + +with Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Forms is + + use Terminal_Interface.Curses.Aux; + + type C_Field_Array is array (Natural range <>) of aliased Field; + package F_Array is new + Interfaces.C.Pointers (Natural, Field, C_Field_Array, Null_Field); + +------------------------------------------------------------------------------ + -- | + -- | + -- | + -- subtype chars_ptr is Interfaces.C.Strings.chars_ptr; + + procedure Request_Name (Key : Form_Request_Code; + Name : out String) + is + function Form_Request_Name (Key : C_Int) return chars_ptr; + pragma Import (C, Form_Request_Name, "form_request_name"); + begin + Fill_String (Form_Request_Name (C_Int (Key)), Name); + end Request_Name; + + function Request_Name (Key : Form_Request_Code) return String + is + function Form_Request_Name (Key : C_Int) return chars_ptr; + pragma Import (C, Form_Request_Name, "form_request_name"); + begin + return Fill_String (Form_Request_Name (C_Int (Key))); + end Request_Name; +------------------------------------------------------------------------------ + -- | + -- | + -- | + -- | + -- |===================================================================== + -- | man page form_field_new.3x + -- |===================================================================== + -- | + -- | + -- | + function Create (Height : Line_Count; + Width : Column_Count; + Top : Line_Position; + Left : Column_Position; + Off_Screen : Natural := 0; + More_Buffers : Buffer_Number := Buffer_Number'First) + return Field + is + function Newfield (H, W, T, L, O, M : C_Int) return Field; + pragma Import (C, Newfield, "new_field"); + Fld : constant Field := Newfield (C_Int (Height), C_Int (Width), + C_Int (Top), C_Int (Left), + C_Int (Off_Screen), + C_Int (More_Buffers)); + begin + if Fld = Null_Field then + raise Form_Exception; + end if; + return Fld; + end Create; +-- | +-- | +-- | + procedure Delete (Fld : in out Field) + is + function Free_Field (Fld : Field) return Eti_Error; + pragma Import (C, Free_Field, "free_field"); + + begin + Eti_Exception (Free_Field (Fld)); + Fld := Null_Field; + end Delete; + -- | + -- | + -- | + function Duplicate (Fld : Field; + Top : Line_Position; + Left : Column_Position) return Field + is + function Dup_Field (Fld : Field; + Top : C_Int; + Left : C_Int) return Field; + pragma Import (C, Dup_Field, "dup_field"); + + F : constant Field := Dup_Field (Fld, + C_Int (Top), + C_Int (Left)); + begin + if F = Null_Field then + raise Form_Exception; + end if; + return F; + end Duplicate; + -- | + -- | + -- | + function Link (Fld : Field; + Top : Line_Position; + Left : Column_Position) return Field + is + function Lnk_Field (Fld : Field; + Top : C_Int; + Left : C_Int) return Field; + pragma Import (C, Lnk_Field, "link_field"); + + F : constant Field := Lnk_Field (Fld, + C_Int (Top), + C_Int (Left)); + begin + if F = Null_Field then + raise Form_Exception; + end if; + return F; + end Link; + -- | + -- |===================================================================== + -- | man page form_field_just.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Justification (Fld : Field; + Just : Field_Justification := None) + is + function Set_Field_Just (Fld : Field; + Just : C_Int) return Eti_Error; + pragma Import (C, Set_Field_Just, "set_field_just"); + + begin + Eti_Exception (Set_Field_Just (Fld, + C_Int (Field_Justification'Pos (Just)))); + end Set_Justification; + -- | + -- | + -- | + function Get_Justification (Fld : Field) return Field_Justification + is + function Field_Just (Fld : Field) return C_Int; + pragma Import (C, Field_Just, "field_just"); + begin + return Field_Justification'Val (Field_Just (Fld)); + end Get_Justification; + -- | + -- |===================================================================== + -- | man page form_field_buffer.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Buffer + (Fld : Field; + Buffer : Buffer_Number := Buffer_Number'First; + Str : String) + is + function Set_Fld_Buffer (Fld : Field; + Bufnum : C_Int; + S : char_array) + return Eti_Error; + pragma Import (C, Set_Fld_Buffer, "set_field_buffer"); + + begin + Eti_Exception (Set_Fld_Buffer (Fld, C_Int (Buffer), To_C (Str))); + end Set_Buffer; + -- | + -- | + -- | + procedure Get_Buffer + (Fld : Field; + Buffer : Buffer_Number := Buffer_Number'First; + Str : out String) + is + function Field_Buffer (Fld : Field; + B : C_Int) return chars_ptr; + pragma Import (C, Field_Buffer, "field_buffer"); + begin + Fill_String (Field_Buffer (Fld, C_Int (Buffer)), Str); + end Get_Buffer; + + function Get_Buffer + (Fld : Field; + Buffer : Buffer_Number := Buffer_Number'First) return String + is + function Field_Buffer (Fld : Field; + B : C_Int) return chars_ptr; + pragma Import (C, Field_Buffer, "field_buffer"); + begin + return Fill_String (Field_Buffer (Fld, C_Int (Buffer))); + end Get_Buffer; + -- | + -- | + -- | + procedure Set_Status (Fld : Field; + Status : Boolean := True) + is + function Set_Fld_Status (Fld : Field; + St : C_Int) return Eti_Error; + pragma Import (C, Set_Fld_Status, "set_field_status"); + + begin + if Set_Fld_Status (Fld, Boolean'Pos (Status)) /= E_Ok then + raise Form_Exception; + end if; + end Set_Status; + -- | + -- | + -- | + function Changed (Fld : Field) return Boolean + is + function Field_Status (Fld : Field) return C_Int; + pragma Import (C, Field_Status, "field_status"); + + Res : constant C_Int := Field_Status (Fld); + begin + if Res = Curses_False then + return False; + else + return True; + end if; + end Changed; + -- | + -- | + -- | + procedure Set_Maximum_Size (Fld : Field; + Max : Natural := 0) + is + function Set_Field_Max (Fld : Field; + M : C_Int) return Eti_Error; + pragma Import (C, Set_Field_Max, "set_max_field"); + + begin + Eti_Exception (Set_Field_Max (Fld, C_Int (Max))); + end Set_Maximum_Size; + -- | + -- |===================================================================== + -- | man page form_field_opts.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Options (Fld : Field; + Options : Field_Option_Set) + is + function Set_Field_Opts (Fld : Field; + Opt : Field_Option_Set) return Eti_Error; + pragma Import (C, Set_Field_Opts, "set_field_opts"); + + begin + Eti_Exception (Set_Field_Opts (Fld, Options)); + end Set_Options; + -- | + -- | + -- | + procedure Switch_Options (Fld : Field; + Options : Field_Option_Set; + On : Boolean := True) + is + function Field_Opts_On (Fld : Field; + Opt : Field_Option_Set) return Eti_Error; + pragma Import (C, Field_Opts_On, "field_opts_on"); + function Field_Opts_Off (Fld : Field; + Opt : Field_Option_Set) return Eti_Error; + pragma Import (C, Field_Opts_Off, "field_opts_off"); + + begin + if On then + Eti_Exception (Field_Opts_On (Fld, Options)); + else + Eti_Exception (Field_Opts_Off (Fld, Options)); + end if; + end Switch_Options; + -- | + -- | + -- | + procedure Get_Options (Fld : Field; + Options : out Field_Option_Set) + is + function Field_Opts (Fld : Field) return Field_Option_Set; + pragma Import (C, Field_Opts, "field_opts"); + + begin + Options := Field_Opts (Fld); + end Get_Options; + -- | + -- | + -- | + function Get_Options (Fld : Field := Null_Field) + return Field_Option_Set + is + Fos : Field_Option_Set; + begin + Get_Options (Fld, Fos); + return Fos; + end Get_Options; + -- | + -- |===================================================================== + -- | man page form_field_attributes.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Foreground + (Fld : Field; + Fore : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Set_Field_Fore (Fld : Field; + Attr : Attributed_Character) return Eti_Error; + pragma Import (C, Set_Field_Fore, "set_field_fore"); + + begin + Eti_Exception (Set_Field_Fore (Fld, (Ch => Character'First, + Color => Color, + Attr => Fore))); + end Set_Foreground; + -- | + -- | + -- | + procedure Foreground (Fld : Field; + Fore : out Character_Attribute_Set) + is + function Field_Fore (Fld : Field) return Attributed_Character; + pragma Import (C, Field_Fore, "field_fore"); + begin + Fore := Field_Fore (Fld).Attr; + end Foreground; + + procedure Foreground (Fld : Field; + Fore : out Character_Attribute_Set; + Color : out Color_Pair) + is + function Field_Fore (Fld : Field) return Attributed_Character; + pragma Import (C, Field_Fore, "field_fore"); + begin + Fore := Field_Fore (Fld).Attr; + Color := Field_Fore (Fld).Color; + end Foreground; + -- | + -- | + -- | + procedure Set_Background + (Fld : Field; + Back : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Set_Field_Back (Fld : Field; + Attr : Attributed_Character) return Eti_Error; + pragma Import (C, Set_Field_Back, "set_field_back"); + + begin + Eti_Exception (Set_Field_Back (Fld, (Ch => Character'First, + Color => Color, + Attr => Back))); + end Set_Background; + -- | + -- | + -- | + procedure Background (Fld : Field; + Back : out Character_Attribute_Set) + is + function Field_Back (Fld : Field) return Attributed_Character; + pragma Import (C, Field_Back, "field_back"); + begin + Back := Field_Back (Fld).Attr; + end Background; + + procedure Background (Fld : Field; + Back : out Character_Attribute_Set; + Color : out Color_Pair) + is + function Field_Back (Fld : Field) return Attributed_Character; + pragma Import (C, Field_Back, "field_back"); + begin + Back := Field_Back (Fld).Attr; + Color := Field_Back (Fld).Color; + end Background; + -- | + -- | + -- | + procedure Set_Pad_Character (Fld : Field; + Pad : Character := Space) + is + function Set_Field_Pad (Fld : Field; + Ch : C_Int) return Eti_Error; + pragma Import (C, Set_Field_Pad, "set_field_pad"); + + begin + Eti_Exception (Set_Field_Pad (Fld, + C_Int (Character'Pos (Pad)))); + end Set_Pad_Character; + -- | + -- | + -- | + procedure Pad_Character (Fld : Field; + Pad : out Character) + is + function Field_Pad (Fld : Field) return C_Int; + pragma Import (C, Field_Pad, "field_pad"); + begin + Pad := Character'Val (Field_Pad (Fld)); + end Pad_Character; + -- | + -- |===================================================================== + -- | man page form_field_info.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Info (Fld : Field; + Lines : out Line_Count; + Columns : out Column_Count; + First_Row : out Line_Position; + First_Column : out Column_Position; + Off_Screen : out Natural; + Additional_Buffers : out Buffer_Number) + is + type C_Int_Access is access all C_Int; + function Fld_Info (Fld : Field; + L, C, Fr, Fc, Os, Ab : C_Int_Access) + return Eti_Error; + pragma Import (C, Fld_Info, "field_info"); + + L, C, Fr, Fc, Os, Ab : aliased C_Int; + begin + Eti_Exception (Fld_Info (Fld, + L'Access, C'Access, + Fr'Access, Fc'Access, + Os'Access, Ab'Access)); + Lines := Line_Count (L); + Columns := Column_Count (C); + First_Row := Line_Position (Fr); + First_Column := Column_Position (Fc); + Off_Screen := Natural (Os); + Additional_Buffers := Buffer_Number (Ab); + end Info; +-- | +-- | +-- | + procedure Dynamic_Info (Fld : Field; + Lines : out Line_Count; + Columns : out Column_Count; + Max : out Natural) + is + type C_Int_Access is access all C_Int; + function Dyn_Info (Fld : Field; L, C, M : C_Int_Access) return Eti_Error; + pragma Import (C, Dyn_Info, "dynamic_field_info"); + + L, C, M : aliased C_Int; + begin + Eti_Exception (Dyn_Info (Fld, + L'Access, C'Access, + M'Access)); + Lines := Line_Count (L); + Columns := Column_Count (C); + Max := Natural (M); + end Dynamic_Info; + -- | + -- |===================================================================== + -- | man page form_win.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Window (Frm : Form; + Win : Window) + is + function Set_Form_Win (Frm : Form; + Win : Window) return Eti_Error; + pragma Import (C, Set_Form_Win, "set_form_win"); + + begin + Eti_Exception (Set_Form_Win (Frm, Win)); + end Set_Window; + -- | + -- | + -- | + function Get_Window (Frm : Form) return Window + is + function Form_Win (Frm : Form) return Window; + pragma Import (C, Form_Win, "form_win"); + + W : constant Window := Form_Win (Frm); + begin + return W; + end Get_Window; + -- | + -- | + -- | + procedure Set_Sub_Window (Frm : Form; + Win : Window) + is + function Set_Form_Sub (Frm : Form; + Win : Window) return Eti_Error; + pragma Import (C, Set_Form_Sub, "set_form_sub"); + + begin + Eti_Exception (Set_Form_Sub (Frm, Win)); + end Set_Sub_Window; + -- | + -- | + -- | + function Get_Sub_Window (Frm : Form) return Window + is + function Form_Sub (Frm : Form) return Window; + pragma Import (C, Form_Sub, "form_sub"); + + W : constant Window := Form_Sub (Frm); + begin + return W; + end Get_Sub_Window; + -- | + -- | + -- | + procedure Scale (Frm : Form; + Lines : out Line_Count; + Columns : out Column_Count) + is + type C_Int_Access is access all C_Int; + function M_Scale (Frm : Form; Yp, Xp : C_Int_Access) return Eti_Error; + pragma Import (C, M_Scale, "scale_form"); + + X, Y : aliased C_Int; + begin + Eti_Exception (M_Scale (Frm, Y'Access, X'Access)); + Lines := Line_Count (Y); + Columns := Column_Count (X); + end Scale; + -- | + -- |===================================================================== + -- | man page menu_hook.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Field_Init_Hook (Frm : Form; + Proc : Form_Hook_Function) + is + function Set_Field_Init (Frm : Form; + Proc : Form_Hook_Function) return Eti_Error; + pragma Import (C, Set_Field_Init, "set_field_init"); + + begin + Eti_Exception (Set_Field_Init (Frm, Proc)); + end Set_Field_Init_Hook; + -- | + -- | + -- | + procedure Set_Field_Term_Hook (Frm : Form; + Proc : Form_Hook_Function) + is + function Set_Field_Term (Frm : Form; + Proc : Form_Hook_Function) return Eti_Error; + pragma Import (C, Set_Field_Term, "set_field_term"); + + begin + Eti_Exception (Set_Field_Term (Frm, Proc)); + end Set_Field_Term_Hook; + -- | + -- | + -- | + procedure Set_Form_Init_Hook (Frm : Form; + Proc : Form_Hook_Function) + is + function Set_Form_Init (Frm : Form; + Proc : Form_Hook_Function) return Eti_Error; + pragma Import (C, Set_Form_Init, "set_form_init"); + + begin + Eti_Exception (Set_Form_Init (Frm, Proc)); + end Set_Form_Init_Hook; + -- | + -- | + -- | + procedure Set_Form_Term_Hook (Frm : Form; + Proc : Form_Hook_Function) + is + function Set_Form_Term (Frm : Form; + Proc : Form_Hook_Function) return Eti_Error; + pragma Import (C, Set_Form_Term, "set_form_term"); + + begin + Eti_Exception (Set_Form_Term (Frm, Proc)); + end Set_Form_Term_Hook; + -- | + -- |===================================================================== + -- | man page form_fields.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Redefine (Frm : Form; + Flds : Field_Array_Access) + is + function Set_Frm_Fields (Frm : Form; + Items : System.Address) return Eti_Error; + pragma Import (C, Set_Frm_Fields, "set_form_fields"); + + begin + pragma Assert (Flds.all (Flds'Last) = Null_Field); + if Flds.all (Flds'Last) /= Null_Field then + raise Form_Exception; + else + Eti_Exception (Set_Frm_Fields (Frm, Flds.all (Flds'First)'Address)); + end if; + end Redefine; + -- | + -- | + -- | + function Fields (Frm : Form; + Index : Positive) return Field + is + use F_Array; + + function C_Fields (Frm : Form) return Pointer; + pragma Import (C, C_Fields, "form_fields"); + + P : Pointer := C_Fields (Frm); + begin + if P = null or else Index > Field_Count (Frm) then + raise Form_Exception; + else + P := P + ptrdiff_t (C_Int (Index) - 1); + return P.all; + end if; + end Fields; + -- | + -- | + -- | + function Field_Count (Frm : Form) return Natural + is + function Count (Frm : Form) return C_Int; + pragma Import (C, Count, "field_count"); + begin + return Natural (Count (Frm)); + end Field_Count; + -- | + -- | + -- | + procedure Move (Fld : Field; + Line : Line_Position; + Column : Column_Position) + is + function Move (Fld : Field; L, C : C_Int) return Eti_Error; + pragma Import (C, Move, "move_field"); + + begin + Eti_Exception (Move (Fld, C_Int (Line), C_Int (Column))); + end Move; + -- | + -- |===================================================================== + -- | man page form_new.3x + -- |===================================================================== + -- | + -- | + -- | + function Create (Fields : Field_Array_Access) return Form + is + function NewForm (Fields : System.Address) return Form; + pragma Import (C, NewForm, "new_form"); + + M : Form; + begin + pragma Assert (Fields.all (Fields'Last) = Null_Field); + if Fields.all (Fields'Last) /= Null_Field then + raise Form_Exception; + else + M := NewForm (Fields.all (Fields'First)'Address); + if M = Null_Form then + raise Form_Exception; + end if; + return M; + end if; + end Create; + -- | + -- | + -- | + procedure Delete (Frm : in out Form) + is + function Free (Frm : Form) return Eti_Error; + pragma Import (C, Free, "free_form"); + + begin + Eti_Exception (Free (Frm)); + Frm := Null_Form; + end Delete; + -- | + -- |===================================================================== + -- | man page form_opts.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Options (Frm : Form; + Options : Form_Option_Set) + is + function Set_Form_Opts (Frm : Form; + Opt : Form_Option_Set) return Eti_Error; + pragma Import (C, Set_Form_Opts, "set_form_opts"); + + begin + Eti_Exception (Set_Form_Opts (Frm, Options)); + end Set_Options; + -- | + -- | + -- | + procedure Switch_Options (Frm : Form; + Options : Form_Option_Set; + On : Boolean := True) + is + function Form_Opts_On (Frm : Form; + Opt : Form_Option_Set) return Eti_Error; + pragma Import (C, Form_Opts_On, "form_opts_on"); + function Form_Opts_Off (Frm : Form; + Opt : Form_Option_Set) return Eti_Error; + pragma Import (C, Form_Opts_Off, "form_opts_off"); + + begin + if On then + Eti_Exception (Form_Opts_On (Frm, Options)); + else + Eti_Exception (Form_Opts_Off (Frm, Options)); + end if; + end Switch_Options; + -- | + -- | + -- | + procedure Get_Options (Frm : Form; + Options : out Form_Option_Set) + is + function Form_Opts (Frm : Form) return Form_Option_Set; + pragma Import (C, Form_Opts, "form_opts"); + + begin + Options := Form_Opts (Frm); + end Get_Options; + -- | + -- | + -- | + function Get_Options (Frm : Form := Null_Form) return Form_Option_Set + is + Fos : Form_Option_Set; + begin + Get_Options (Frm, Fos); + return Fos; + end Get_Options; + -- | + -- |===================================================================== + -- | man page form_post.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Post (Frm : Form; + Post : Boolean := True) + is + function M_Post (Frm : Form) return Eti_Error; + pragma Import (C, M_Post, "post_form"); + function M_Unpost (Frm : Form) return Eti_Error; + pragma Import (C, M_Unpost, "unpost_form"); + + begin + if Post then + Eti_Exception (M_Post (Frm)); + else + Eti_Exception (M_Unpost (Frm)); + end if; + end Post; + -- | + -- |===================================================================== + -- | man page form_cursor.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Position_Cursor (Frm : Form) + is + function Pos_Form_Cursor (Frm : Form) return Eti_Error; + pragma Import (C, Pos_Form_Cursor, "pos_form_cursor"); + + begin + Eti_Exception (Pos_Form_Cursor (Frm)); + end Position_Cursor; + -- | + -- |===================================================================== + -- | man page form_data.3x + -- |===================================================================== + -- | + -- | + -- | + function Data_Ahead (Frm : Form) return Boolean + is + function Ahead (Frm : Form) return C_Int; + pragma Import (C, Ahead, "data_ahead"); + + Res : constant C_Int := Ahead (Frm); + begin + if Res = Curses_False then + return False; + else + return True; + end if; + end Data_Ahead; + -- | + -- | + -- | + function Data_Behind (Frm : Form) return Boolean + is + function Behind (Frm : Form) return C_Int; + pragma Import (C, Behind, "data_behind"); + + Res : constant C_Int := Behind (Frm); + begin + if Res = Curses_False then + return False; + else + return True; + end if; + end Data_Behind; + -- | + -- |===================================================================== + -- | man page form_driver.3x + -- |===================================================================== + -- | + -- | + -- | + function Driver (Frm : Form; + Key : Key_Code) return Driver_Result + is + function Frm_Driver (Frm : Form; Key : C_Int) return Eti_Error; + pragma Import (C, Frm_Driver, "form_driver"); + + R : constant Eti_Error := Frm_Driver (Frm, C_Int (Key)); + begin + case R is + when E_Unknown_Command => + return Unknown_Request; + when E_Invalid_Field => + return Invalid_Field; + when E_Request_Denied => + return Request_Denied; + when others => + Eti_Exception (R); + return Form_Ok; + end case; + end Driver; + -- | + -- |===================================================================== + -- | man page form_page.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_Current (Frm : Form; + Fld : Field) + is + function Set_Current_Fld (Frm : Form; Fld : Field) return Eti_Error; + pragma Import (C, Set_Current_Fld, "set_current_field"); + + begin + Eti_Exception (Set_Current_Fld (Frm, Fld)); + end Set_Current; + -- | + -- | + -- | + function Current (Frm : Form) return Field + is + function Current_Fld (Frm : Form) return Field; + pragma Import (C, Current_Fld, "current_field"); + + Fld : constant Field := Current_Fld (Frm); + begin + if Fld = Null_Field then + raise Form_Exception; + end if; + return Fld; + end Current; + -- | + -- | + -- | + procedure Set_Page (Frm : Form; + Page : Page_Number := Page_Number'First) + is + function Set_Frm_Page (Frm : Form; Pg : C_Int) return Eti_Error; + pragma Import (C, Set_Frm_Page, "set_form_page"); + + begin + Eti_Exception (Set_Frm_Page (Frm, C_Int (Page))); + end Set_Page; + -- | + -- | + -- | + function Page (Frm : Form) return Page_Number + is + function Get_Page (Frm : Form) return C_Int; + pragma Import (C, Get_Page, "form_page"); + + P : constant C_Int := Get_Page (Frm); + begin + if P < 0 then + raise Form_Exception; + else + return Page_Number (P); + end if; + end Page; + + function Get_Index (Fld : Field) return Positive + is + function Get_Fieldindex (Fld : Field) return C_Int; + pragma Import (C, Get_Fieldindex, "field_index"); + + Res : constant C_Int := Get_Fieldindex (Fld); + begin + if Res = Curses_Err then + raise Form_Exception; + end if; + return Positive (Natural (Res) + Positive'First); + end Get_Index; + + -- | + -- |===================================================================== + -- | man page form_new_page.3x + -- |===================================================================== + -- | + -- | + -- | + procedure Set_New_Page (Fld : Field; + New_Page : Boolean := True) + is + function Set_Page (Fld : Field; Flg : C_Int) return Eti_Error; + pragma Import (C, Set_Page, "set_new_page"); + + begin + Eti_Exception (Set_Page (Fld, Boolean'Pos (New_Page))); + end Set_New_Page; + -- | + -- | + -- | + function Is_New_Page (Fld : Field) return Boolean + is + function Is_New (Fld : Field) return C_Int; + pragma Import (C, Is_New, "new_page"); + + Res : constant C_Int := Is_New (Fld); + begin + if Res = Curses_False then + return False; + else + return True; + end if; + end Is_New_Page; + + procedure Free (FA : in out Field_Array_Access; + Free_Fields : Boolean := False) + is + procedure Release is new Ada.Unchecked_Deallocation + (Field_Array, Field_Array_Access); + begin + if FA /= null and then Free_Fields then + for I in FA'First .. (FA'Last - 1) loop + if FA.all (I) /= Null_Field then + Delete (FA.all (I)); + end if; + end loop; + end if; + Release (FA); + end Free; + + -- |===================================================================== + + function Default_Field_Options return Field_Option_Set + is + begin + return Get_Options (Null_Field); + end Default_Field_Options; + + function Default_Form_Options return Form_Option_Set + is + begin + return Get_Options (Null_Form); + end Default_Form_Options; + +end Terminal_Interface.Curses.Forms; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-menus-item_user_data.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-menus-item_user_data.adb new file mode 100644 index 00000000..6374376b --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-menus-item_user_data.adb @@ -0,0 +1,72 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Menus.Item_User_Data -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.16 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Menus.Item_User_Data is + + procedure Set_User_Data (Itm : Item; + Data : User_Access) + is + function Set_Item_Userptr (Itm : Item; + Addr : User_Access) return Eti_Error; + pragma Import (C, Set_Item_Userptr, "set_item_userptr"); + + begin + Eti_Exception (Set_Item_Userptr (Itm, Data)); + end Set_User_Data; + + function Get_User_Data (Itm : Item) return User_Access + is + function Item_Userptr (Itm : Item) return User_Access; + pragma Import (C, Item_Userptr, "item_userptr"); + begin + return Item_Userptr (Itm); + end Get_User_Data; + + procedure Get_User_Data (Itm : Item; + Data : out User_Access) + is + begin + Data := Get_User_Data (Itm); + end Get_User_Data; + +end Terminal_Interface.Curses.Menus.Item_User_Data; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb new file mode 100644 index 00000000..7c3ccfa4 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb @@ -0,0 +1,73 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Menus.Menu_User_Data -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.17 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.Menus.Menu_User_Data is + + procedure Set_User_Data (Men : Menu; + Data : User_Access) + is + function Set_Menu_Userptr (Men : Menu; + Data : User_Access) return Eti_Error; + pragma Import (C, Set_Menu_Userptr, "set_menu_userptr"); + + begin + Eti_Exception (Set_Menu_Userptr (Men, Data)); + + end Set_User_Data; + + function Get_User_Data (Men : Menu) return User_Access + is + function Menu_Userptr (Men : Menu) return User_Access; + pragma Import (C, Menu_Userptr, "menu_userptr"); + begin + return Menu_Userptr (Men); + end Get_User_Data; + + procedure Get_User_Data (Men : Menu; + Data : out User_Access) + is + begin + Data := Get_User_Data (Men); + end Get_User_Data; + +end Terminal_Interface.Curses.Menus.Menu_User_Data; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-menus.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-menus.adb new file mode 100644 index 00000000..76f3e36e --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-menus.adb @@ -0,0 +1,904 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Menus -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.34 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Unchecked_Deallocation; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; +with Interfaces.C.Pointers; + +package body Terminal_Interface.Curses.Menus is + + type C_Item_Array is array (Natural range <>) of aliased Item; + package I_Array is new + Interfaces.C.Pointers (Natural, Item, C_Item_Array, Null_Item); + + subtype chars_ptr is Interfaces.C.Strings.chars_ptr; + +------------------------------------------------------------------------------ + procedure Request_Name (Key : Menu_Request_Code; + Name : out String) + is + function Request_Name (Key : C_Int) return chars_ptr; + pragma Import (C, Request_Name, "menu_request_name"); + begin + Fill_String (Request_Name (C_Int (Key)), Name); + end Request_Name; + + function Request_Name (Key : Menu_Request_Code) return String + is + function Request_Name (Key : C_Int) return chars_ptr; + pragma Import (C, Request_Name, "menu_request_name"); + begin + return Fill_String (Request_Name (C_Int (Key))); + end Request_Name; + + function Create (Name : String; + Description : String := "") return Item + is + type Char_Ptr is access all Interfaces.C.char; + function Newitem (Name, Desc : Char_Ptr) return Item; + pragma Import (C, Newitem, "new_item"); + + type Name_String is new char_array (0 .. Name'Length); + type Name_String_Ptr is access Name_String; + pragma Controlled (Name_String_Ptr); + + type Desc_String is new char_array (0 .. Description'Length); + type Desc_String_Ptr is access Desc_String; + pragma Controlled (Desc_String_Ptr); + + Name_Str : constant Name_String_Ptr := new Name_String; + Desc_Str : constant Desc_String_Ptr := new Desc_String; + Name_Len, Desc_Len : size_t; + Result : Item; + begin + To_C (Name, Name_Str.all, Name_Len); + To_C (Description, Desc_Str.all, Desc_Len); + Result := Newitem (Name_Str.all (Name_Str.all'First)'Access, + Desc_Str.all (Desc_Str.all'First)'Access); + if Result = Null_Item then + raise Eti_System_Error; + end if; + return Result; + end Create; + + procedure Delete (Itm : in out Item) + is + function Descname (Itm : Item) return chars_ptr; + pragma Import (C, Descname, "item_description"); + function Itemname (Itm : Item) return chars_ptr; + pragma Import (C, Itemname, "item_name"); + + function Freeitem (Itm : Item) return Eti_Error; + pragma Import (C, Freeitem, "free_item"); + + Ptr : chars_ptr; + begin + Ptr := Descname (Itm); + if Ptr /= Null_Ptr then + Interfaces.C.Strings.Free (Ptr); + end if; + Ptr := Itemname (Itm); + if Ptr /= Null_Ptr then + Interfaces.C.Strings.Free (Ptr); + end if; + Eti_Exception (Freeitem (Itm)); + Itm := Null_Item; + end Delete; +------------------------------------------------------------------------------- + procedure Set_Value (Itm : Item; + Value : Boolean := True) + is + function Set_Item_Val (Itm : Item; + Val : C_Int) return Eti_Error; + pragma Import (C, Set_Item_Val, "set_item_value"); + + begin + Eti_Exception (Set_Item_Val (Itm, Boolean'Pos (Value))); + end Set_Value; + + function Value (Itm : Item) return Boolean + is + function Item_Val (Itm : Item) return C_Int; + pragma Import (C, Item_Val, "item_value"); + begin + if Item_Val (Itm) = Curses_False then + return False; + else + return True; + end if; + end Value; + +------------------------------------------------------------------------------- + function Visible (Itm : Item) return Boolean + is + function Item_Vis (Itm : Item) return C_Int; + pragma Import (C, Item_Vis, "item_visible"); + begin + if Item_Vis (Itm) = Curses_False then + return False; + else + return True; + end if; + end Visible; +------------------------------------------------------------------------------- + procedure Set_Options (Itm : Item; + Options : Item_Option_Set) + is + function Set_Item_Opts (Itm : Item; + Opt : Item_Option_Set) return Eti_Error; + pragma Import (C, Set_Item_Opts, "set_item_opts"); + + begin + Eti_Exception (Set_Item_Opts (Itm, Options)); + end Set_Options; + + procedure Switch_Options (Itm : Item; + Options : Item_Option_Set; + On : Boolean := True) + is + function Item_Opts_On (Itm : Item; + Opt : Item_Option_Set) return Eti_Error; + pragma Import (C, Item_Opts_On, "item_opts_on"); + function Item_Opts_Off (Itm : Item; + Opt : Item_Option_Set) return Eti_Error; + pragma Import (C, Item_Opts_Off, "item_opts_off"); + + begin + if On then + Eti_Exception (Item_Opts_On (Itm, Options)); + else + Eti_Exception (Item_Opts_Off (Itm, Options)); + end if; + end Switch_Options; + + procedure Get_Options (Itm : Item; + Options : out Item_Option_Set) + is + function Item_Opts (Itm : Item) return Item_Option_Set; + pragma Import (C, Item_Opts, "item_opts"); + + begin + Options := Item_Opts (Itm); + end Get_Options; + + function Get_Options (Itm : Item := Null_Item) return Item_Option_Set + is + Ios : Item_Option_Set; + begin + Get_Options (Itm, Ios); + return Ios; + end Get_Options; +------------------------------------------------------------------------------- + procedure Name (Itm : Item; + Name : out String) + is + function Itemname (Itm : Item) return chars_ptr; + pragma Import (C, Itemname, "item_name"); + begin + Fill_String (Itemname (Itm), Name); + end Name; + + function Name (Itm : Item) return String + is + function Itemname (Itm : Item) return chars_ptr; + pragma Import (C, Itemname, "item_name"); + begin + return Fill_String (Itemname (Itm)); + end Name; + + procedure Description (Itm : Item; + Description : out String) + is + function Descname (Itm : Item) return chars_ptr; + pragma Import (C, Descname, "item_description"); + begin + Fill_String (Descname (Itm), Description); + end Description; + + function Description (Itm : Item) return String + is + function Descname (Itm : Item) return chars_ptr; + pragma Import (C, Descname, "item_description"); + begin + return Fill_String (Descname (Itm)); + end Description; +------------------------------------------------------------------------------- + procedure Set_Current (Men : Menu; + Itm : Item) + is + function Set_Curr_Item (Men : Menu; + Itm : Item) return Eti_Error; + pragma Import (C, Set_Curr_Item, "set_current_item"); + + begin + Eti_Exception (Set_Curr_Item (Men, Itm)); + end Set_Current; + + function Current (Men : Menu) return Item + is + function Curr_Item (Men : Menu) return Item; + pragma Import (C, Curr_Item, "current_item"); + + Res : constant Item := Curr_Item (Men); + begin + if Res = Null_Item then + raise Menu_Exception; + end if; + return Res; + end Current; + + procedure Set_Top_Row (Men : Menu; + Line : Line_Position) + is + function Set_Toprow (Men : Menu; + Line : C_Int) return Eti_Error; + pragma Import (C, Set_Toprow, "set_top_row"); + + begin + Eti_Exception (Set_Toprow (Men, C_Int (Line))); + end Set_Top_Row; + + function Top_Row (Men : Menu) return Line_Position + is + function Toprow (Men : Menu) return C_Int; + pragma Import (C, Toprow, "top_row"); + + Res : constant C_Int := Toprow (Men); + begin + if Res = Curses_Err then + raise Menu_Exception; + end if; + return Line_Position (Res); + end Top_Row; + + function Get_Index (Itm : Item) return Positive + is + function Get_Itemindex (Itm : Item) return C_Int; + pragma Import (C, Get_Itemindex, "item_index"); + + Res : constant C_Int := Get_Itemindex (Itm); + begin + if Res = Curses_Err then + raise Menu_Exception; + end if; + return Positive (Natural (Res) + Positive'First); + end Get_Index; +------------------------------------------------------------------------------- + procedure Post (Men : Menu; + Post : Boolean := True) + is + function M_Post (Men : Menu) return Eti_Error; + pragma Import (C, M_Post, "post_menu"); + function M_Unpost (Men : Menu) return Eti_Error; + pragma Import (C, M_Unpost, "unpost_menu"); + + begin + if Post then + Eti_Exception (M_Post (Men)); + else + Eti_Exception (M_Unpost (Men)); + end if; + end Post; +------------------------------------------------------------------------------- + procedure Set_Options (Men : Menu; + Options : Menu_Option_Set) + is + function Set_Menu_Opts (Men : Menu; + Opt : Menu_Option_Set) return Eti_Error; + pragma Import (C, Set_Menu_Opts, "set_menu_opts"); + + begin + Eti_Exception (Set_Menu_Opts (Men, Options)); + end Set_Options; + + procedure Switch_Options (Men : Menu; + Options : Menu_Option_Set; + On : Boolean := True) + is + function Menu_Opts_On (Men : Menu; + Opt : Menu_Option_Set) return Eti_Error; + pragma Import (C, Menu_Opts_On, "menu_opts_on"); + function Menu_Opts_Off (Men : Menu; + Opt : Menu_Option_Set) return Eti_Error; + pragma Import (C, Menu_Opts_Off, "menu_opts_off"); + + begin + if On then + Eti_Exception (Menu_Opts_On (Men, Options)); + else + Eti_Exception (Menu_Opts_Off (Men, Options)); + end if; + end Switch_Options; + + procedure Get_Options (Men : Menu; + Options : out Menu_Option_Set) + is + function Menu_Opts (Men : Menu) return Menu_Option_Set; + pragma Import (C, Menu_Opts, "menu_opts"); + + begin + Options := Menu_Opts (Men); + end Get_Options; + + function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set + is + Mos : Menu_Option_Set; + begin + Get_Options (Men, Mos); + return Mos; + end Get_Options; +------------------------------------------------------------------------------- + procedure Set_Window (Men : Menu; + Win : Window) + is + function Set_Menu_Win (Men : Menu; + Win : Window) return Eti_Error; + pragma Import (C, Set_Menu_Win, "set_menu_win"); + + begin + Eti_Exception (Set_Menu_Win (Men, Win)); + end Set_Window; + + function Get_Window (Men : Menu) return Window + is + function Menu_Win (Men : Menu) return Window; + pragma Import (C, Menu_Win, "menu_win"); + + W : constant Window := Menu_Win (Men); + begin + return W; + end Get_Window; + + procedure Set_Sub_Window (Men : Menu; + Win : Window) + is + function Set_Menu_Sub (Men : Menu; + Win : Window) return Eti_Error; + pragma Import (C, Set_Menu_Sub, "set_menu_sub"); + + begin + Eti_Exception (Set_Menu_Sub (Men, Win)); + end Set_Sub_Window; + + function Get_Sub_Window (Men : Menu) return Window + is + function Menu_Sub (Men : Menu) return Window; + pragma Import (C, Menu_Sub, "menu_sub"); + + W : constant Window := Menu_Sub (Men); + begin + return W; + end Get_Sub_Window; + + procedure Scale (Men : Menu; + Lines : out Line_Count; + Columns : out Column_Count) + is + type C_Int_Access is access all C_Int; + function M_Scale (Men : Menu; + Yp, Xp : C_Int_Access) return Eti_Error; + pragma Import (C, M_Scale, "scale_menu"); + + X, Y : aliased C_Int; + begin + Eti_Exception (M_Scale (Men, Y'Access, X'Access)); + Lines := Line_Count (Y); + Columns := Column_Count (X); + end Scale; +------------------------------------------------------------------------------- + procedure Position_Cursor (Men : Menu) + is + function Pos_Menu_Cursor (Men : Menu) return Eti_Error; + pragma Import (C, Pos_Menu_Cursor, "pos_menu_cursor"); + + begin + Eti_Exception (Pos_Menu_Cursor (Men)); + end Position_Cursor; + +------------------------------------------------------------------------------- + procedure Set_Mark (Men : Menu; + Mark : String) + is + type Char_Ptr is access all Interfaces.C.char; + function Set_Mark (Men : Menu; + Mark : Char_Ptr) return Eti_Error; + pragma Import (C, Set_Mark, "set_menu_mark"); + + Txt : char_array (0 .. Mark'Length); + Len : size_t; + begin + To_C (Mark, Txt, Len); + Eti_Exception (Set_Mark (Men, Txt (Txt'First)'Access)); + end Set_Mark; + + procedure Mark (Men : Menu; + Mark : out String) + is + function Get_Menu_Mark (Men : Menu) return chars_ptr; + pragma Import (C, Get_Menu_Mark, "menu_mark"); + begin + Fill_String (Get_Menu_Mark (Men), Mark); + end Mark; + + function Mark (Men : Menu) return String + is + function Get_Menu_Mark (Men : Menu) return chars_ptr; + pragma Import (C, Get_Menu_Mark, "menu_mark"); + begin + return Fill_String (Get_Menu_Mark (Men)); + end Mark; + +------------------------------------------------------------------------------- + procedure Set_Foreground + (Men : Menu; + Fore : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Set_Menu_Fore (Men : Menu; + Attr : Attributed_Character) return Eti_Error; + pragma Import (C, Set_Menu_Fore, "set_menu_fore"); + + Ch : constant Attributed_Character := (Ch => Character'First, + Color => Color, + Attr => Fore); + begin + Eti_Exception (Set_Menu_Fore (Men, Ch)); + end Set_Foreground; + + procedure Foreground (Men : Menu; + Fore : out Character_Attribute_Set) + is + function Menu_Fore (Men : Menu) return Attributed_Character; + pragma Import (C, Menu_Fore, "menu_fore"); + begin + Fore := Menu_Fore (Men).Attr; + end Foreground; + + procedure Foreground (Men : Menu; + Fore : out Character_Attribute_Set; + Color : out Color_Pair) + is + function Menu_Fore (Men : Menu) return Attributed_Character; + pragma Import (C, Menu_Fore, "menu_fore"); + begin + Fore := Menu_Fore (Men).Attr; + Color := Menu_Fore (Men).Color; + end Foreground; + + procedure Set_Background + (Men : Menu; + Back : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Set_Menu_Back (Men : Menu; + Attr : Attributed_Character) return Eti_Error; + pragma Import (C, Set_Menu_Back, "set_menu_back"); + + Ch : constant Attributed_Character := (Ch => Character'First, + Color => Color, + Attr => Back); + begin + Eti_Exception (Set_Menu_Back (Men, Ch)); + end Set_Background; + + procedure Background (Men : Menu; + Back : out Character_Attribute_Set) + is + function Menu_Back (Men : Menu) return Attributed_Character; + pragma Import (C, Menu_Back, "menu_back"); + begin + Back := Menu_Back (Men).Attr; + end Background; + + procedure Background (Men : Menu; + Back : out Character_Attribute_Set; + Color : out Color_Pair) + is + function Menu_Back (Men : Menu) return Attributed_Character; + pragma Import (C, Menu_Back, "menu_back"); + begin + Back := Menu_Back (Men).Attr; + Color := Menu_Back (Men).Color; + end Background; + + procedure Set_Grey (Men : Menu; + Grey : Character_Attribute_Set := Normal_Video; + Color : Color_Pair := Color_Pair'First) + is + function Set_Menu_Grey (Men : Menu; + Attr : Attributed_Character) return Eti_Error; + pragma Import (C, Set_Menu_Grey, "set_menu_grey"); + + Ch : constant Attributed_Character := (Ch => Character'First, + Color => Color, + Attr => Grey); + + begin + Eti_Exception (Set_Menu_Grey (Men, Ch)); + end Set_Grey; + + procedure Grey (Men : Menu; + Grey : out Character_Attribute_Set) + is + function Menu_Grey (Men : Menu) return Attributed_Character; + pragma Import (C, Menu_Grey, "menu_grey"); + begin + Grey := Menu_Grey (Men).Attr; + end Grey; + + procedure Grey (Men : Menu; + Grey : out Character_Attribute_Set; + Color : out Color_Pair) + is + function Menu_Grey (Men : Menu) return Attributed_Character; + pragma Import (C, Menu_Grey, "menu_grey"); + begin + Grey := Menu_Grey (Men).Attr; + Color := Menu_Grey (Men).Color; + end Grey; + + procedure Set_Pad_Character (Men : Menu; + Pad : Character := Space) + is + function Set_Menu_Pad (Men : Menu; + Ch : C_Int) return Eti_Error; + pragma Import (C, Set_Menu_Pad, "set_menu_pad"); + + begin + Eti_Exception (Set_Menu_Pad (Men, C_Int (Character'Pos (Pad)))); + end Set_Pad_Character; + + procedure Pad_Character (Men : Menu; + Pad : out Character) + is + function Menu_Pad (Men : Menu) return C_Int; + pragma Import (C, Menu_Pad, "menu_pad"); + begin + Pad := Character'Val (Menu_Pad (Men)); + end Pad_Character; +------------------------------------------------------------------------------- + procedure Set_Spacing (Men : Menu; + Descr : Column_Position := 0; + Row : Line_Position := 0; + Col : Column_Position := 0) + is + function Set_Spacing (Men : Menu; + D, R, C : C_Int) return Eti_Error; + pragma Import (C, Set_Spacing, "set_menu_spacing"); + + begin + Eti_Exception (Set_Spacing (Men, + C_Int (Descr), + C_Int (Row), + C_Int (Col))); + end Set_Spacing; + + procedure Spacing (Men : Menu; + Descr : out Column_Position; + Row : out Line_Position; + Col : out Column_Position) + is + type C_Int_Access is access all C_Int; + function Get_Spacing (Men : Menu; + D, R, C : C_Int_Access) return Eti_Error; + pragma Import (C, Get_Spacing, "menu_spacing"); + + D, R, C : aliased C_Int; + begin + Eti_Exception (Get_Spacing (Men, + D'Access, + R'Access, + C'Access)); + Descr := Column_Position (D); + Row := Line_Position (R); + Col := Column_Position (C); + end Spacing; +------------------------------------------------------------------------------- + function Set_Pattern (Men : Menu; + Text : String) return Boolean + is + type Char_Ptr is access all Interfaces.C.char; + function Set_Pattern (Men : Menu; + Pattern : Char_Ptr) return Eti_Error; + pragma Import (C, Set_Pattern, "set_menu_pattern"); + + S : char_array (0 .. Text'Length); + L : size_t; + Res : Eti_Error; + begin + To_C (Text, S, L); + Res := Set_Pattern (Men, S (S'First)'Access); + case Res is + when E_No_Match => + return False; + when others => + Eti_Exception (Res); + return True; + end case; + end Set_Pattern; + + procedure Pattern (Men : Menu; + Text : out String) + is + function Get_Pattern (Men : Menu) return chars_ptr; + pragma Import (C, Get_Pattern, "menu_pattern"); + begin + Fill_String (Get_Pattern (Men), Text); + end Pattern; +------------------------------------------------------------------------------- + procedure Set_Format (Men : Menu; + Lines : Line_Count; + Columns : Column_Count) + is + function Set_Menu_Fmt (Men : Menu; + Lin : C_Int; + Col : C_Int) return Eti_Error; + pragma Import (C, Set_Menu_Fmt, "set_menu_format"); + + begin + Eti_Exception (Set_Menu_Fmt (Men, + C_Int (Lines), + C_Int (Columns))); + + end Set_Format; + + procedure Format (Men : Menu; + Lines : out Line_Count; + Columns : out Column_Count) + is + type C_Int_Access is access all C_Int; + function Menu_Fmt (Men : Menu; + Y, X : C_Int_Access) return Eti_Error; + pragma Import (C, Menu_Fmt, "menu_format"); + + L, C : aliased C_Int; + begin + Eti_Exception (Menu_Fmt (Men, L'Access, C'Access)); + Lines := Line_Count (L); + Columns := Column_Count (C); + end Format; +------------------------------------------------------------------------------- + procedure Set_Item_Init_Hook (Men : Menu; + Proc : Menu_Hook_Function) + is + function Set_Item_Init (Men : Menu; + Proc : Menu_Hook_Function) return Eti_Error; + pragma Import (C, Set_Item_Init, "set_item_init"); + + begin + Eti_Exception (Set_Item_Init (Men, Proc)); + end Set_Item_Init_Hook; + + procedure Set_Item_Term_Hook (Men : Menu; + Proc : Menu_Hook_Function) + is + function Set_Item_Term (Men : Menu; + Proc : Menu_Hook_Function) return Eti_Error; + pragma Import (C, Set_Item_Term, "set_item_term"); + + begin + Eti_Exception (Set_Item_Term (Men, Proc)); + end Set_Item_Term_Hook; + + procedure Set_Menu_Init_Hook (Men : Menu; + Proc : Menu_Hook_Function) + is + function Set_Menu_Init (Men : Menu; + Proc : Menu_Hook_Function) return Eti_Error; + pragma Import (C, Set_Menu_Init, "set_menu_init"); + + begin + Eti_Exception (Set_Menu_Init (Men, Proc)); + end Set_Menu_Init_Hook; + + procedure Set_Menu_Term_Hook (Men : Menu; + Proc : Menu_Hook_Function) + is + function Set_Menu_Term (Men : Menu; + Proc : Menu_Hook_Function) return Eti_Error; + pragma Import (C, Set_Menu_Term, "set_menu_term"); + + begin + Eti_Exception (Set_Menu_Term (Men, Proc)); + end Set_Menu_Term_Hook; + + function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function + is + function Item_Init (Men : Menu) return Menu_Hook_Function; + pragma Import (C, Item_Init, "item_init"); + begin + return Item_Init (Men); + end Get_Item_Init_Hook; + + function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function + is + function Item_Term (Men : Menu) return Menu_Hook_Function; + pragma Import (C, Item_Term, "item_term"); + begin + return Item_Term (Men); + end Get_Item_Term_Hook; + + function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function + is + function Menu_Init (Men : Menu) return Menu_Hook_Function; + pragma Import (C, Menu_Init, "menu_init"); + begin + return Menu_Init (Men); + end Get_Menu_Init_Hook; + + function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function + is + function Menu_Term (Men : Menu) return Menu_Hook_Function; + pragma Import (C, Menu_Term, "menu_term"); + begin + return Menu_Term (Men); + end Get_Menu_Term_Hook; +------------------------------------------------------------------------------- + procedure Redefine (Men : Menu; + Items : Item_Array_Access) + is + function Set_Items (Men : Menu; + Items : System.Address) return Eti_Error; + pragma Import (C, Set_Items, "set_menu_items"); + + begin + pragma Assert (Items.all (Items'Last) = Null_Item); + if Items.all (Items'Last) /= Null_Item then + raise Menu_Exception; + else + Eti_Exception (Set_Items (Men, Items.all'Address)); + end if; + end Redefine; + + function Item_Count (Men : Menu) return Natural + is + function Count (Men : Menu) return C_Int; + pragma Import (C, Count, "item_count"); + begin + return Natural (Count (Men)); + end Item_Count; + + function Items (Men : Menu; + Index : Positive) return Item + is + use I_Array; + + function C_Mitems (Men : Menu) return Pointer; + pragma Import (C, C_Mitems, "menu_items"); + + P : Pointer := C_Mitems (Men); + begin + if P = null or else Index > Item_Count (Men) then + raise Menu_Exception; + else + P := P + ptrdiff_t (C_Int (Index) - 1); + return P.all; + end if; + end Items; + +------------------------------------------------------------------------------- + function Create (Items : Item_Array_Access) return Menu + is + function Newmenu (Items : System.Address) return Menu; + pragma Import (C, Newmenu, "new_menu"); + + M : Menu; + begin + pragma Assert (Items.all (Items'Last) = Null_Item); + if Items.all (Items'Last) /= Null_Item then + raise Menu_Exception; + else + M := Newmenu (Items.all'Address); + if M = Null_Menu then + raise Menu_Exception; + end if; + return M; + end if; + end Create; + + procedure Delete (Men : in out Menu) + is + function Free (Men : Menu) return Eti_Error; + pragma Import (C, Free, "free_menu"); + + begin + Eti_Exception (Free (Men)); + Men := Null_Menu; + end Delete; + +------------------------------------------------------------------------------ + function Driver (Men : Menu; + Key : Key_Code) return Driver_Result + is + function Driver (Men : Menu; + Key : C_Int) return Eti_Error; + pragma Import (C, Driver, "menu_driver"); + + R : constant Eti_Error := Driver (Men, C_Int (Key)); + begin + case R is + when E_Unknown_Command => + return Unknown_Request; + when E_No_Match => + return No_Match; + when E_Request_Denied | E_Not_Selectable => + return Request_Denied; + when others => + Eti_Exception (R); + return Menu_Ok; + end case; + end Driver; + + procedure Free (IA : in out Item_Array_Access; + Free_Items : Boolean := False) + is + procedure Release is new Ada.Unchecked_Deallocation + (Item_Array, Item_Array_Access); + begin + if IA /= null and then Free_Items then + for I in IA'First .. (IA'Last - 1) loop + if IA.all (I) /= Null_Item then + Delete (IA.all (I)); + end if; + end loop; + end if; + Release (IA); + end Free; + +------------------------------------------------------------------------------- + function Default_Menu_Options return Menu_Option_Set + is + begin + return Get_Options (Null_Menu); + end Default_Menu_Options; + + function Default_Item_Options return Item_Option_Set + is + begin + return Get_Options (Null_Item); + end Default_Item_Options; +------------------------------------------------------------------------------- + +end Terminal_Interface.Curses.Menus; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-mouse.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-mouse.adb new file mode 100644 index 00000000..a8efd345 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-mouse.adb @@ -0,0 +1,218 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Mouse -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2018,2020 Thomas E. Dickey -- +-- Copyright 1999-2009,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.28 $ +-- $Date: 2020/06/27 18:50:44 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; +with Interfaces.C; use Interfaces.C; +use Interfaces; + +package body Terminal_Interface.Curses.Mouse is + + function Has_Mouse return Boolean + is + function Mouse_Avail return C_Int; + pragma Import (C, Mouse_Avail, "has_mouse"); + begin + if Has_Key (Key_Mouse) or else Mouse_Avail /= 0 then + return True; + else + return False; + end if; + end Has_Mouse; + + function Get_Mouse return Mouse_Event + is + type Event_Access is access all Mouse_Event; + + function Getmouse (Ev : Event_Access) return C_Int; + pragma Import (C, Getmouse, "getmouse"); + + Event : aliased Mouse_Event; + begin + if Getmouse (Event'Access) = Curses_Err then + raise Curses_Exception; + end if; + return Event; + end Get_Mouse; + + procedure Register_Reportable_Event (Button : Mouse_Button; + State : Button_State; + Mask : in out Event_Mask) + is + Button_Nr : constant Natural := Mouse_Button'Pos (Button); + State_Nr : constant Natural := Button_State'Pos (State); + begin + if Button in Modifier_Keys and then State /= Pressed then + raise Curses_Exception; + else + if Button in Real_Buttons then + Mask := Mask or ((2 ** (6 * Button_Nr)) ** State_Nr); + else + Mask := Mask or (BUTTON_CTRL ** (Button_Nr - 4)); + end if; + end if; + end Register_Reportable_Event; + + procedure Register_Reportable_Events (Button : Mouse_Button; + State : Button_States; + Mask : in out Event_Mask) + is + begin + for S in Button_States'Range loop + if State (S) then + Register_Reportable_Event (Button, S, Mask); + end if; + end loop; + end Register_Reportable_Events; + + function Start_Mouse (Mask : Event_Mask := All_Events) + return Event_Mask + is + function MMask (M : Event_Mask; + O : access Event_Mask) return Event_Mask; + pragma Import (C, MMask, "mousemask"); + R : Event_Mask; + Old : aliased Event_Mask; + begin + R := MMask (Mask, Old'Access); + if R = No_Events then + Beep; + end if; + return Old; + end Start_Mouse; + + procedure End_Mouse (Mask : Event_Mask := No_Events) + is + begin + if Mask /= No_Events then + Beep; + end if; + end End_Mouse; + + procedure Dispatch_Event (Mask : Event_Mask; + Button : out Mouse_Button; + State : out Button_State); + + procedure Dispatch_Event (Mask : Event_Mask; + Button : out Mouse_Button; + State : out Button_State) is + L : Event_Mask; + begin + Button := Alt; -- preset to non real button; + if (Mask and BUTTON1_EVENTS) /= 0 then + Button := Left; + elsif (Mask and BUTTON2_EVENTS) /= 0 then + Button := Middle; + elsif (Mask and BUTTON3_EVENTS) /= 0 then + Button := Right; + elsif (Mask and BUTTON4_EVENTS) /= 0 then + Button := Button4; + end if; + if Button in Real_Buttons then + State := Released; -- preset to non real button; + L := 2 ** (6 * Mouse_Button'Pos (Button)); + for I in Button_State'Range loop + if (Mask and L) /= 0 then + State := I; + exit; + end if; + L := 2 * L; + end loop; + else + State := Pressed; + if (Mask and BUTTON_CTRL) /= 0 then + Button := Control; + elsif (Mask and BUTTON_SHIFT) /= 0 then + Button := Shift; + elsif (Mask and BUTTON_ALT) /= 0 then + Button := Alt; + end if; + end if; + end Dispatch_Event; + + procedure Get_Event (Event : Mouse_Event; + Y : out Line_Position; + X : out Column_Position; + Button : out Mouse_Button; + State : out Button_State) + is + Mask : constant Event_Mask := Event.Bstate; + begin + X := Column_Position (Event.X); + Y := Line_Position (Event.Y); + Dispatch_Event (Mask, Button, State); + end Get_Event; + + procedure Unget_Mouse (Event : Mouse_Event) + is + function Ungetmouse (Ev : Mouse_Event) return C_Int; + pragma Import (C, Ungetmouse, "ungetmouse"); + begin + if Ungetmouse (Event) = Curses_Err then + raise Curses_Exception; + end if; + end Unget_Mouse; + + function Enclosed_In_Window (Win : Window := Standard_Window; + Event : Mouse_Event) return Boolean + is + function Wenclose (Win : Window; Y : C_Int; X : C_Int) + return Curses_Bool; + pragma Import (C, Wenclose, "wenclose"); + begin + if Wenclose (Win, C_Int (Event.Y), C_Int (Event.X)) + = Curses_Bool_False + then + return False; + else + return True; + end if; + end Enclosed_In_Window; + + function Mouse_Interval (Msec : Natural := 200) return Natural + is + function Mouseinterval (Msec : C_Int) return C_Int; + pragma Import (C, Mouseinterval, "mouseinterval"); + begin + return Natural (Mouseinterval (C_Int (Msec))); + end Mouse_Interval; + +end Terminal_Interface.Curses.Mouse; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-panels-user_data.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-panels-user_data.adb new file mode 100644 index 00000000..504b07d4 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-panels-user_data.adb @@ -0,0 +1,79 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Panels.User_Data -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Interfaces.C; +with Terminal_Interface.Curses.Aux; +use Terminal_Interface.Curses.Aux; +with Terminal_Interface.Curses.Panels; +use Terminal_Interface.Curses.Panels; + +package body Terminal_Interface.Curses.Panels.User_Data is + + use type Interfaces.C.int; + + procedure Set_User_Data (Pan : Panel; + Data : User_Access) + is + function Set_Panel_Userptr (Pan : Panel; + Addr : User_Access) return C_Int; + pragma Import (C, Set_Panel_Userptr, "set_panel_userptr"); + begin + if Set_Panel_Userptr (Pan, Data) = Curses_Err then + raise Panel_Exception; + end if; + end Set_User_Data; + + function Get_User_Data (Pan : Panel) return User_Access + is + function Panel_Userptr (Pan : Panel) return User_Access; + pragma Import (C, Panel_Userptr, "panel_userptr"); + begin + return Panel_Userptr (Pan); + end Get_User_Data; + + procedure Get_User_Data (Pan : Panel; + Data : out User_Access) + is + begin + Data := Get_User_Data (Pan); + end Get_User_Data; + +end Terminal_Interface.Curses.Panels.User_Data; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-panels.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-panels.adb new file mode 100644 index 00000000..8602f32b --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-panels.adb @@ -0,0 +1,166 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Panels -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2004,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; +with Interfaces.C; + +package body Terminal_Interface.Curses.Panels is + + use type Interfaces.C.int; + + function Create (Win : Window) return Panel + is + function Newpanel (Win : Window) return Panel; + pragma Import (C, Newpanel, "new_panel"); + + Pan : Panel; + begin + Pan := Newpanel (Win); + if Pan = Null_Panel then + raise Panel_Exception; + end if; + return Pan; + end Create; + + procedure Bottom (Pan : Panel) + is + function Bottompanel (Pan : Panel) return C_Int; + pragma Import (C, Bottompanel, "bottom_panel"); + begin + if Bottompanel (Pan) = Curses_Err then + raise Panel_Exception; + end if; + end Bottom; + + procedure Top (Pan : Panel) + is + function Toppanel (Pan : Panel) return C_Int; + pragma Import (C, Toppanel, "top_panel"); + begin + if Toppanel (Pan) = Curses_Err then + raise Panel_Exception; + end if; + end Top; + + procedure Show (Pan : Panel) + is + function Showpanel (Pan : Panel) return C_Int; + pragma Import (C, Showpanel, "show_panel"); + begin + if Showpanel (Pan) = Curses_Err then + raise Panel_Exception; + end if; + end Show; + + procedure Hide (Pan : Panel) + is + function Hidepanel (Pan : Panel) return C_Int; + pragma Import (C, Hidepanel, "hide_panel"); + begin + if Hidepanel (Pan) = Curses_Err then + raise Panel_Exception; + end if; + end Hide; + + function Get_Window (Pan : Panel) return Window + is + function Panel_Win (Pan : Panel) return Window; + pragma Import (C, Panel_Win, "panel_window"); + + Win : constant Window := Panel_Win (Pan); + begin + if Win = Null_Window then + raise Panel_Exception; + end if; + return Win; + end Get_Window; + + procedure Replace (Pan : Panel; + Win : Window) + is + function Replace_Pan (Pan : Panel; + Win : Window) return C_Int; + pragma Import (C, Replace_Pan, "replace_panel"); + begin + if Replace_Pan (Pan, Win) = Curses_Err then + raise Panel_Exception; + end if; + end Replace; + + procedure Move (Pan : Panel; + Line : Line_Position; + Column : Column_Position) + is + function Move (Pan : Panel; + Line : C_Int; + Column : C_Int) return C_Int; + pragma Import (C, Move, "move_panel"); + begin + if Move (Pan, C_Int (Line), C_Int (Column)) = Curses_Err then + raise Panel_Exception; + end if; + end Move; + + function Is_Hidden (Pan : Panel) return Boolean + is + function Panel_Hidden (Pan : Panel) return C_Int; + pragma Import (C, Panel_Hidden, "panel_hidden"); + begin + if Panel_Hidden (Pan) = Curses_False then + return False; + else + return True; + end if; + end Is_Hidden; + + procedure Delete (Pan : in out Panel) + is + function Del_Panel (Pan : Panel) return C_Int; + pragma Import (C, Del_Panel, "del_panel"); + begin + if Del_Panel (Pan) = Curses_Err then + raise Panel_Exception; + end if; + Pan := Null_Panel; + end Delete; + +end Terminal_Interface.Curses.Panels; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.adb new file mode 100644 index 00000000..cbaeaf2b --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.adb @@ -0,0 +1,78 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.PutWin -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.5 $ +-- Binding Version 01.00 + +with Ada.Streams.Stream_IO.C_Streams; +with Interfaces.C_Streams; +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; + +package body Terminal_Interface.Curses.PutWin is + + package ICS renames Interfaces.C_Streams; + package ACS renames Ada.Streams.Stream_IO.C_Streams; + use type C_Int; + + procedure Put_Window (Win : Window; + File : Ada.Streams.Stream_IO.File_Type) is + function putwin (Win : Window; f : ICS.FILEs) return C_Int; + pragma Import (C, putwin, "putwin"); + + R : constant C_Int := putwin (Win, ACS.C_Stream (File)); + begin + if R /= Curses_Ok then + raise Curses_Exception; + end if; + end Put_Window; + + function Get_Window (File : Ada.Streams.Stream_IO.File_Type) + return Window is + function getwin (f : ICS.FILEs) return Window; + pragma Import (C, getwin, "getwin"); + + W : constant Window := getwin (ACS.C_Stream (File)); + begin + if W = Null_Window then + raise Curses_Exception; + else + return W; + end if; + end Get_Window; + +end Terminal_Interface.Curses.PutWin; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.ads new file mode 100644 index 00000000..df7b0d1f --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-putwin.ads @@ -0,0 +1,51 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.PutWin -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.5 $ +-- Binding Version 01.00 + +with Ada.Streams.Stream_IO; + +package Terminal_Interface.Curses.PutWin is + + procedure Put_Window (Win : Window; + File : Ada.Streams.Stream_IO.File_Type); + + function Get_Window (File : Ada.Streams.Stream_IO.File_Type) return Window; + +end Terminal_Interface.Curses.PutWin; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.adb new file mode 100644 index 00000000..d09457cc --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.adb @@ -0,0 +1,164 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Termcap -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; + +package body Terminal_Interface.Curses.Termcap is + + function Get_Entry (Name : String) return Boolean + is + function tgetent (name : char_array; val : char_array) + return C_Int; + pragma Import (C, tgetent, "tgetent"); + NameTxt : char_array (0 .. Name'Length); + Length : size_t; + ignored : constant char_array (0 .. 0) := (0 => nul); + result : C_Int; + begin + To_C (Name, NameTxt, Length); + result := tgetent (char_array (ignored), NameTxt); + if result = -1 then + raise Curses_Exception; + else + return Boolean'Val (result); + end if; + end Get_Entry; + +------------------------------------------------------------------------------ + function Get_Flag (Name : String) return Boolean + is + function tgetflag (id : char_array) return C_Int; + pragma Import (C, tgetflag, "tgetflag"); + Txt : char_array (0 .. Name'Length); + Length : size_t; + begin + To_C (Name, Txt, Length); + if tgetflag (Txt) = 0 then + return False; + else + return True; + end if; + end Get_Flag; + +------------------------------------------------------------------------------ + procedure Get_Number (Name : String; + Value : out Integer; + Result : out Boolean) + is + function tgetnum (id : char_array) return C_Int; + pragma Import (C, tgetnum, "tgetnum"); + Txt : char_array (0 .. Name'Length); + Length : size_t; + begin + To_C (Name, Txt, Length); + Value := Integer (tgetnum (Txt)); + if Value = -1 then + Result := False; + else + Result := True; + end if; + end Get_Number; + +------------------------------------------------------------------------------ + procedure Get_String (Name : String; + Value : out String; + Result : out Boolean) + is + function tgetstr (id : char_array; + buf : char_array) return chars_ptr; + pragma Import (C, tgetstr, "tgetstr"); + Txt : char_array (0 .. Name'Length); + Length : size_t; + Txt2 : chars_ptr; + type t is new char_array (0 .. 1024); -- does it need to be 1024? + Return_Buffer : constant t := (others => nul); + begin + To_C (Name, Txt, Length); + Txt2 := tgetstr (Txt, char_array (Return_Buffer)); + if Txt2 = Null_Ptr then + Result := False; + else + Value := Fill_String (Txt2); + Result := True; + end if; + end Get_String; + + function Get_String (Name : String) return Boolean + is + function tgetstr (Id : char_array; + buf : char_array) return chars_ptr; + pragma Import (C, tgetstr, "tgetstr"); + Txt : char_array (0 .. Name'Length); + Length : size_t; + Txt2 : chars_ptr; + type t is new char_array (0 .. 1024); -- does it need to be 1024? + Phony_Txt : constant t := (others => nul); + begin + To_C (Name, Txt, Length); + Txt2 := tgetstr (Txt, char_array (Phony_Txt)); + if Txt2 = Null_Ptr then + return False; + else + return True; + end if; + end Get_String; + +------------------------------------------------------------------------------ + function TGoto (Cap : String; + Col : Column_Position; + Row : Line_Position) return Termcap_String is + function tgoto (cap : char_array; + col : C_Int; + row : C_Int) return chars_ptr; + pragma Import (C, tgoto); + Txt : char_array (0 .. Cap'Length); + Length : size_t; + begin + To_C (Cap, Txt, Length); + return Termcap_String (Fill_String + (tgoto (Txt, C_Int (Col), C_Int (Row)))); + end TGoto; + +end Terminal_Interface.Curses.Termcap; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.ads new file mode 100644 index 00000000..1450cbaa --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-termcap.ads @@ -0,0 +1,81 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Termcap -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.5 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +package Terminal_Interface.Curses.Termcap is + pragma Preelaborate (Terminal_Interface.Curses.Termcap); + + -- |===================================================================== + -- | Man page curs_termcap.3x + -- |===================================================================== + -- Not implemented: tputs (see curs_terminfo) + + type Termcap_String is new String; + + -- | + function TGoto (Cap : String; + Col : Column_Position; + Row : Line_Position) return Termcap_String; + -- AKA: tgoto() + + -- | + function Get_Entry (Name : String) return Boolean; + -- AKA: tgetent() + + -- | + function Get_Flag (Name : String) return Boolean; + -- AKA: tgetflag() + + -- | + procedure Get_Number (Name : String; + Value : out Integer; + Result : out Boolean); + -- AKA: tgetnum() + + -- | + procedure Get_String (Name : String; + Value : out String; + Result : out Boolean); + function Get_String (Name : String) return Boolean; + -- Returns True if the string is found. + -- AKA: tgetstr() + +end Terminal_Interface.Curses.Termcap; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.adb new file mode 100644 index 00000000..c15fa3d0 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.adb @@ -0,0 +1,162 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Terminfo -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.7 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux; +with Interfaces.C; use Interfaces.C; +with Interfaces.C.Strings; use Interfaces.C.Strings; +with Ada.Unchecked_Conversion; + +package body Terminal_Interface.Curses.Terminfo is + + function Is_MinusOne_Pointer (P : chars_ptr) return Boolean; + + function Is_MinusOne_Pointer (P : chars_ptr) return Boolean is + type Weird_Address is new System.Storage_Elements.Integer_Address; + Invalid_Pointer : constant Weird_Address := -1; + function To_Weird is new Ada.Unchecked_Conversion + (Source => chars_ptr, Target => Weird_Address); + begin + if To_Weird (P) = Invalid_Pointer then + return True; + else + return False; + end if; + end Is_MinusOne_Pointer; + pragma Inline (Is_MinusOne_Pointer); + +------------------------------------------------------------------------------ + function Get_Flag (Name : String) return Boolean + is + function tigetflag (id : char_array) return Curses_Bool; + pragma Import (C, tigetflag); + Txt : char_array (0 .. Name'Length); + Length : size_t; + begin + To_C (Name, Txt, Length); + if tigetflag (Txt) = Curses_Bool (Curses_True) then + return True; + else + return False; + end if; + end Get_Flag; + +------------------------------------------------------------------------------ + procedure Get_String (Name : String; + Value : out Terminfo_String; + Result : out Boolean) + is + function tigetstr (id : char_array) return chars_ptr; + pragma Import (C, tigetstr, "tigetstr"); + Txt : char_array (0 .. Name'Length); + Length : size_t; + Txt2 : chars_ptr; + begin + To_C (Name, Txt, Length); + Txt2 := tigetstr (Txt); + if Txt2 = Null_Ptr then + Result := False; + elsif Is_MinusOne_Pointer (Txt2) then + raise Curses_Exception; + else + Value := Terminfo_String (Fill_String (Txt2)); + Result := True; + end if; + end Get_String; + +------------------------------------------------------------------------------ + function Has_String (Name : String) return Boolean + is + function tigetstr (id : char_array) return chars_ptr; + pragma Import (C, tigetstr, "tigetstr"); + Txt : char_array (0 .. Name'Length); + Length : size_t; + Txt2 : chars_ptr; + begin + To_C (Name, Txt, Length); + Txt2 := tigetstr (Txt); + if Txt2 = Null_Ptr then + return False; + elsif Is_MinusOne_Pointer (Txt2) then + raise Curses_Exception; + else + return True; + end if; + end Has_String; + +------------------------------------------------------------------------------ + function Get_Number (Name : String) return Integer is + function tigetstr (s : char_array) return C_Int; + pragma Import (C, tigetstr); + Txt : char_array (0 .. Name'Length); + Length : size_t; + begin + To_C (Name, Txt, Length); + return Integer (tigetstr (Txt)); + end Get_Number; + +------------------------------------------------------------------------------ + procedure Put_String (Str : Terminfo_String; + affcnt : Natural := 1; + putc : putctype := null) is + function tputs (str : char_array; + affcnt : C_Int; + putc : putctype) return C_Int; + function putp (str : char_array) return C_Int; + pragma Import (C, tputs); + pragma Import (C, putp); + Txt : char_array (0 .. Str'Length); + Length : size_t; + Err : C_Int; + begin + To_C (String (Str), Txt, Length); + if putc = null then + Err := putp (Txt); + else + Err := tputs (Txt, C_Int (affcnt), putc); + end if; + if Err = Curses_Err then + raise Curses_Exception; + end if; + end Put_String; + +end Terminal_Interface.Curses.Terminfo; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.ads new file mode 100644 index 00000000..efde2417 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-terminfo.ads @@ -0,0 +1,82 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Terminfo -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2000-2002,2003 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.5 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ + +with Interfaces.C; + +package Terminal_Interface.Curses.Terminfo is + pragma Preelaborate (Terminal_Interface.Curses.Terminfo); + + -- |===================================================================== + -- | Man page curs_terminfo.3x + -- |===================================================================== + -- Not implemented: setupterm, setterm, set_curterm, del_curterm, + -- restartterm, tparm, putp, vidputs, vidattr, + -- mvcur + + type Terminfo_String is new String; + + -- | + procedure Get_String (Name : String; + Value : out Terminfo_String; + Result : out Boolean); + function Has_String (Name : String) return Boolean; + -- AKA: tigetstr() + + -- | + function Get_Flag (Name : String) return Boolean; + -- AKA: tigetflag() + + -- | + function Get_Number (Name : String) return Integer; + -- AKA: tigetnum() + + type putctype is access function (c : Interfaces.C.int) + return Interfaces.C.int; + pragma Convention (C, putctype); + + -- | + procedure Put_String (Str : Terminfo_String; + affcnt : Natural := 1; + putc : putctype := null); + -- AKA: tputs() + +end Terminal_Interface.Curses.Terminfo; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.adb new file mode 100644 index 00000000..91307b7f --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.adb @@ -0,0 +1,129 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Aux -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.14 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package body Terminal_Interface.Curses.Text_IO.Aux is + + procedure Put_Buf + (Win : Window; + Buf : String; + Width : Field; + Signal : Boolean := True; + Ljust : Boolean := False) + is + L : Field; + Len : Field; + W : Field := Width; + LC : Line_Count; + CC : Column_Count; + Y : Line_Position; + X : Column_Position; + + procedure Output (From, To : Field); + + procedure Output (From, To : Field) + is + begin + if Len > 0 then + if W = 0 then + W := Len; + end if; + if Len > W then + -- LRM A10.6 (7) says this + W := Len; + end if; + + pragma Assert (Len <= W); + Get_Size (Win, LC, CC); + if Column_Count (Len) > CC then + if Signal then + raise Layout_Error; + else + return; + end if; + else + if Len < W and then not Ljust then + declare + Filler : constant String (1 .. (W - Len)) + := (others => ' '); + begin + Put (Win, Filler); + end; + end if; + Get_Cursor_Position (Win, Y, X); + if (X + Column_Position (Len)) > CC then + New_Line (Win); + end if; + Put (Win, Buf (From .. To)); + if Len < W and then Ljust then + declare + Filler : constant String (1 .. (W - Len)) + := (others => ' '); + begin + Put (Win, Filler); + end; + end if; + end if; + end if; + end Output; + + begin + pragma Assert (Win /= Null_Window); + if Ljust then + L := 1; + for I in 1 .. Buf'Length loop + exit when Buf (L) = ' '; + L := L + 1; + end loop; + Len := L - 1; + Output (1, Len); + else -- input buffer is not left justified + L := Buf'Length; + for I in 1 .. Buf'Length loop + exit when Buf (L) = ' '; + L := L - 1; + end loop; + Len := Buf'Length - L; + Output (L + 1, Buf'Length); + end if; + end Put_Buf; + +end Terminal_Interface.Curses.Text_IO.Aux; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.ads new file mode 100644 index 00000000..946e4154 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-aux.ads @@ -0,0 +1,56 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Aux -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +private package Terminal_Interface.Curses.Text_IO.Aux is + -- pragma Preelaborate (Aux); + + -- This routine is called from the Text_IO output routines for numeric + -- and enumeration types. + -- + procedure Put_Buf + (Win : Window; -- The output window + Buf : String; -- The buffer containing the text + Width : Field; -- The width of the output field + Signal : Boolean := True; -- If true, we raise Layout_Error + Ljust : Boolean := False); -- The Buf is left justified + +end Terminal_Interface.Curses.Text_IO.Aux; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.adb new file mode 100644 index 00000000..e05571db --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.adb @@ -0,0 +1,74 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Complex_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Terminal_Interface.Curses.Text_IO.Float_IO; + +package body Terminal_Interface.Curses.Text_IO.Complex_IO is + + package FIO is new + Terminal_Interface.Curses.Text_IO.Float_IO (Complex_Types.Real'Base); + + procedure Put + (Win : Window; + Item : Complex; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) + is + begin + Put (Win, '('); + FIO.Put (Win, Item.Re, Fore, Aft, Exp); + Put (Win, ','); + FIO.Put (Win, Item.Im, Fore, Aft, Exp); + Put (Win, ')'); + end Put; + + procedure Put + (Item : Complex; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) + is + begin + Put (Get_Window, Item, Fore, Aft, Exp); + end Put; + +end Terminal_Interface.Curses.Text_IO.Complex_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.ads new file mode 100644 index 00000000..f70cd81c --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-complex_io.ads @@ -0,0 +1,71 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Complex_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Numerics.Generic_Complex_Types; + +generic + with package Complex_Types is new Ada.Numerics.Generic_Complex_Types (<>); + +package Terminal_Interface.Curses.Text_IO.Complex_IO is + + use Complex_Types; + + Default_Fore : Field := 2; + Default_Aft : Field := Real'Digits - 1; + Default_Exp : Field := 3; + + procedure Put + (Win : Window; + Item : Complex; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + + procedure Put + (Item : Complex; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Complex_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb new file mode 100644 index 00000000..a8bea13f --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb @@ -0,0 +1,76 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Decimal_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Terminal_Interface.Curses.Text_IO.Aux; + +package body Terminal_Interface.Curses.Text_IO.Decimal_IO is + + package Aux renames Terminal_Interface.Curses.Text_IO.Aux; + package DIO is new Ada.Text_IO.Decimal_IO (Num); + + procedure Put + (Win : Window; + Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) + is + Buf : String (1 .. Field'Last); + Len : Field := Fore + 1 + Aft; + begin + if Exp > 0 then + Len := Len + 1 + Exp; + end if; + DIO.Put (Buf, Item, Aft, Exp); + Aux.Put_Buf (Win, Buf, Len, False); + end Put; + + procedure Put + (Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) is + begin + Put (Get_Window, Item, Fore, Aft, Exp); + end Put; + +end Terminal_Interface.Curses.Text_IO.Decimal_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads new file mode 100644 index 00000000..7678ee09 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads @@ -0,0 +1,67 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Decimal_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type Num is delta <> digits <>; + +package Terminal_Interface.Curses.Text_IO.Decimal_IO is + + Default_Fore : Field := Num'Fore; + Default_Aft : Field := Num'Aft; + Default_Exp : Field := 0; + + procedure Put + (Win : Window; + Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + + procedure Put + (Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Decimal_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb new file mode 100644 index 00000000..b1d53b1e --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb @@ -0,0 +1,81 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Enumeration_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Ada.Characters.Handling; use Ada.Characters.Handling; +with Terminal_Interface.Curses.Text_IO.Aux; + +package body Terminal_Interface.Curses.Text_IO.Enumeration_IO is + + package Aux renames Terminal_Interface.Curses.Text_IO.Aux; + package EIO is new Ada.Text_IO.Enumeration_IO (Enum); + + procedure Put + (Win : Window; + Item : Enum; + Width : Field := Default_Width; + Set : Type_Set := Default_Setting) + is + Buf : String (1 .. Field'Last); + Tset : Ada.Text_IO.Type_Set; + begin + if Set /= Mixed_Case then + Tset := Ada.Text_IO.Type_Set'Val (Type_Set'Pos (Set)); + else + Tset := Ada.Text_IO.Lower_Case; + end if; + EIO.Put (Buf, Item, Tset); + if Set = Mixed_Case then + Buf (Buf'First) := To_Upper (Buf (Buf'First)); + end if; + Aux.Put_Buf (Win, Buf, Width, True, True); + end Put; + + procedure Put + (Item : Enum; + Width : Field := Default_Width; + Set : Type_Set := Default_Setting) + is + begin + Put (Get_Window, Item, Width, Set); + end Put; + +end Terminal_Interface.Curses.Text_IO.Enumeration_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads new file mode 100644 index 00000000..11aa198e --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads @@ -0,0 +1,64 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Enumeration_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type Enum is (<>); + +package Terminal_Interface.Curses.Text_IO.Enumeration_IO is + + Default_Width : Field := 0; + Default_Setting : Type_Set := Mixed_Case; + + procedure Put + (Win : Window; + Item : Enum; + Width : Field := Default_Width; + Set : Type_Set := Default_Setting); + + procedure Put + (Item : Enum; + Width : Field := Default_Width; + Set : Type_Set := Default_Setting); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Enumeration_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb new file mode 100644 index 00000000..79474d25 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb @@ -0,0 +1,76 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Fixed_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Terminal_Interface.Curses.Text_IO.Aux; + +package body Terminal_Interface.Curses.Text_IO.Fixed_IO is + + package Aux renames Terminal_Interface.Curses.Text_IO.Aux; + package FIXIO is new Ada.Text_IO.Fixed_IO (Num); + + procedure Put + (Win : Window; + Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) + is + Buf : String (1 .. Field'Last); + Len : Field := Fore + 1 + Aft; + begin + if Exp > 0 then + Len := Len + 1 + Exp; + end if; + FIXIO.Put (Buf, Item, Aft, Exp); + Aux.Put_Buf (Win, Buf, Len, False); + end Put; + + procedure Put + (Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) is + begin + Put (Get_Window, Item, Fore, Aft, Exp); + end Put; + +end Terminal_Interface.Curses.Text_IO.Fixed_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads new file mode 100644 index 00000000..82055815 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads @@ -0,0 +1,67 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Fixed_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type Num is delta <>; + +package Terminal_Interface.Curses.Text_IO.Fixed_IO is + + Default_Fore : Field := Num'Fore; + Default_Aft : Field := Num'Aft; + Default_Exp : Field := 0; + + procedure Put + (Win : Window; + Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + + procedure Put + (Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Fixed_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.adb new file mode 100644 index 00000000..a9aa156c --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.adb @@ -0,0 +1,77 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Float_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Terminal_Interface.Curses.Text_IO.Aux; + +package body Terminal_Interface.Curses.Text_IO.Float_IO is + + package Aux renames Terminal_Interface.Curses.Text_IO.Aux; + package FIO is new Ada.Text_IO.Float_IO (Num); + + procedure Put + (Win : Window; + Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) + is + Buf : String (1 .. Field'Last); + Len : Field := Fore + 1 + Aft; + begin + if Exp > 0 then + Len := Len + 1 + Exp; + end if; + FIO.Put (Buf, Item, Aft, Exp); + Aux.Put_Buf (Win, Buf, Len, False); + end Put; + + procedure Put + (Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp) + is + begin + Put (Get_Window, Item, Fore, Aft, Exp); + end Put; + +end Terminal_Interface.Curses.Text_IO.Float_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.ads new file mode 100644 index 00000000..9797bcff --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-float_io.ads @@ -0,0 +1,67 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Float_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type Num is digits <>; + +package Terminal_Interface.Curses.Text_IO.Float_IO is + + Default_Fore : Field := 2; + Default_Aft : Field := Num'Digits - 1; + Default_Exp : Field := 3; + + procedure Put + (Win : Window; + Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + + procedure Put + (Item : Num; + Fore : Field := Default_Fore; + Aft : Field := Default_Aft; + Exp : Field := Default_Exp); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Float_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.adb new file mode 100644 index 00000000..01611514 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.adb @@ -0,0 +1,71 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Integer_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Terminal_Interface.Curses.Text_IO.Aux; + +package body Terminal_Interface.Curses.Text_IO.Integer_IO is + + package Aux renames Terminal_Interface.Curses.Text_IO.Aux; + package IIO is new Ada.Text_IO.Integer_IO (Num); + + procedure Put + (Win : Window; + Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base) + is + Buf : String (1 .. Field'Last); + begin + IIO.Put (Buf, Item, Base); + Aux.Put_Buf (Win, Buf, Width); + end Put; + + procedure Put + (Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base) + is + begin + Put (Get_Window, Item, Width, Base); + end Put; + +end Terminal_Interface.Curses.Text_IO.Integer_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.ads new file mode 100644 index 00000000..4ef79d84 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-integer_io.ads @@ -0,0 +1,64 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Integer_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type Num is range <>; + +package Terminal_Interface.Curses.Text_IO.Integer_IO is + + Default_Width : Field := Num'Width; + Default_Base : Number_Base := 10; + + procedure Put + (Win : Window; + Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base); + + procedure Put + (Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Integer_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.adb new file mode 100644 index 00000000..85c6db4a --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.adb @@ -0,0 +1,71 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Modular_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Terminal_Interface.Curses.Text_IO.Aux; + +package body Terminal_Interface.Curses.Text_IO.Modular_IO is + + package Aux renames Terminal_Interface.Curses.Text_IO.Aux; + package MIO is new Ada.Text_IO.Modular_IO (Num); + + procedure Put + (Win : Window; + Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base) + is + Buf : String (1 .. Field'Last); + begin + MIO.Put (Buf, Item, Base); + Aux.Put_Buf (Win, Buf, Width); + end Put; + + procedure Put + (Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base) + is + begin + Put (Get_Window, Item, Width, Base); + end Put; + +end Terminal_Interface.Curses.Text_IO.Modular_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.ads new file mode 100644 index 00000000..d876447d --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io-modular_io.ads @@ -0,0 +1,64 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO.Modular_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.13 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +generic + type Num is mod <>; + +package Terminal_Interface.Curses.Text_IO.Modular_IO is + + Default_Width : Field := Num'Width; + Default_Base : Number_Base := 10; + + procedure Put + (Win : Window; + Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base); + + procedure Put + (Item : Num; + Width : Field := Default_Width; + Base : Number_Base := Default_Base); + +private + pragma Inline (Put); + +end Terminal_Interface.Curses.Text_IO.Modular_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.adb b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.adb new file mode 100644 index 00000000..c7238e26 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.adb @@ -0,0 +1,339 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.23 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package body Terminal_Interface.Curses.Text_IO is + + Default_Window : Window := Null_Window; + + procedure Set_Window (Win : Window) + is + begin + Default_Window := Win; + end Set_Window; + + function Get_Window return Window + is + begin + if Default_Window = Null_Window then + return Standard_Window; + else + return Default_Window; + end if; + end Get_Window; + pragma Inline (Get_Window); + + procedure Flush (Win : Window) + is + begin + Refresh (Win); + end Flush; + + procedure Flush + is + begin + Flush (Get_Window); + end Flush; + + -------------------------------------------- + -- Specification of line and page lengths -- + -------------------------------------------- + + -- There are no set routines in this package. I assume, that you allocate + -- the window with an appropriate size. + -- A scroll-window is interpreted as an page with unbounded page length, + -- i.e. it returns the conventional 0 as page length. + + function Line_Length (Win : Window) return Count + is + N_Lines : Line_Count; + N_Cols : Column_Count; + begin + Get_Size (Win, N_Lines, N_Cols); + -- if Natural (N_Cols) > Natural (Count'Last) then + -- raise Layout_Error; + -- end if; + return Count (N_Cols); + end Line_Length; + + function Line_Length return Count + is + begin + return Line_Length (Get_Window); + end Line_Length; + + function Page_Length (Win : Window) return Count + is + N_Lines : Line_Count; + N_Cols : Column_Count; + begin + if Scrolling_Allowed (Win) then + return 0; + else + Get_Size (Win, N_Lines, N_Cols); + -- if Natural (N_Lines) > Natural (Count'Last) then + -- raise Layout_Error; + -- end if; + return Count (N_Lines); + end if; + end Page_Length; + + function Page_Length return Count + is + begin + return Page_Length (Get_Window); + end Page_Length; + + ------------------------------------ + -- Column, Line, and Page Control -- + ------------------------------------ + procedure New_Line (Win : Window; Spacing : Positive_Count := 1) + is + P_Size : constant Count := Page_Length (Win); + begin + if not Spacing'Valid then + raise Constraint_Error; + end if; + + for I in 1 .. Spacing loop + if P_Size > 0 and then Line (Win) >= P_Size then + New_Page (Win); + else + Add (Win, ASCII.LF); + end if; + end loop; + end New_Line; + + procedure New_Line (Spacing : Positive_Count := 1) + is + begin + New_Line (Get_Window, Spacing); + end New_Line; + + procedure New_Page (Win : Window) + is + begin + Clear (Win); + end New_Page; + + procedure New_Page + is + begin + New_Page (Get_Window); + end New_Page; + + procedure Set_Col (Win : Window; To : Positive_Count) + is + Y : Line_Position; + X1 : Column_Position; + X2 : Column_Position; + N : Natural; + begin + if not To'Valid then + raise Constraint_Error; + end if; + + Get_Cursor_Position (Win, Y, X1); + N := Natural (To); N := N - 1; + X2 := Column_Position (N); + if X1 > X2 then + New_Line (Win, 1); + X1 := 0; + end if; + if X1 < X2 then + declare + Filler : constant String (Integer (X1) .. (Integer (X2) - 1)) + := (others => ' '); + begin + Put (Win, Filler); + end; + end if; + end Set_Col; + + procedure Set_Col (To : Positive_Count) + is + begin + Set_Col (Get_Window, To); + end Set_Col; + + procedure Set_Line (Win : Window; To : Positive_Count) + is + Y1 : Line_Position; + Y2 : Line_Position; + X : Column_Position; + N : Natural; + begin + if not To'Valid then + raise Constraint_Error; + end if; + + Get_Cursor_Position (Win, Y1, X); + pragma Warnings (Off, X); -- unreferenced + N := Natural (To); N := N - 1; + Y2 := Line_Position (N); + if Y2 < Y1 then + New_Page (Win); + Y1 := 0; + end if; + if Y1 < Y2 then + New_Line (Win, Positive_Count (Y2 - Y1)); + end if; + end Set_Line; + + procedure Set_Line (To : Positive_Count) + is + begin + Set_Line (Get_Window, To); + end Set_Line; + + function Col (Win : Window) return Positive_Count + is + Y : Line_Position; + X : Column_Position; + N : Natural; + begin + Get_Cursor_Position (Win, Y, X); + N := Natural (X); N := N + 1; + -- if N > Natural (Count'Last) then + -- raise Layout_Error; + -- end if; + return Positive_Count (N); + end Col; + + function Col return Positive_Count + is + begin + return Col (Get_Window); + end Col; + + function Line (Win : Window) return Positive_Count + is + Y : Line_Position; + X : Column_Position; + N : Natural; + begin + Get_Cursor_Position (Win, Y, X); + N := Natural (Y); N := N + 1; + -- if N > Natural (Count'Last) then + -- raise Layout_Error; + -- end if; + return Positive_Count (N); + end Line; + + function Line return Positive_Count + is + begin + return Line (Get_Window); + end Line; + + ----------------------- + -- Characters Output -- + ----------------------- + + procedure Put (Win : Window; Item : Character) + is + P_Size : constant Count := Page_Length (Win); + Y : Line_Position; + X : Column_Position; + L : Line_Count; + C : Column_Count; + begin + if P_Size > 0 then + Get_Cursor_Position (Win, Y, X); + Get_Size (Win, L, C); + if (Y + 1) = L and then (X + 1) = C then + New_Page (Win); + end if; + end if; + Add (Win, Item); + end Put; + + procedure Put (Item : Character) + is + begin + Put (Get_Window, Item); + end Put; + + -------------------- + -- Strings-Output -- + -------------------- + + procedure Put (Win : Window; Item : String) + is + P_Size : constant Count := Page_Length (Win); + Y : Line_Position; + X : Column_Position; + L : Line_Count; + C : Column_Count; + begin + if P_Size > 0 then + Get_Cursor_Position (Win, Y, X); + Get_Size (Win, L, C); + if (Y + 1) = L and then (X + 1 + Item'Length) >= C then + New_Page (Win); + end if; + end if; + Add (Win, Item); + end Put; + + procedure Put (Item : String) + is + begin + Put (Get_Window, Item); + end Put; + + procedure Put_Line + (Win : Window; + Item : String) + is + begin + Put (Win, Item); + New_Line (Win, 1); + end Put_Line; + + procedure Put_Line + (Item : String) + is + begin + Put_Line (Get_Window, Item); + end Put_Line; + +end Terminal_Interface.Curses.Text_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.ads b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.ads new file mode 100644 index 00000000..33c19423 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-text_io.ads @@ -0,0 +1,137 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Text_IO -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +with Ada.Text_IO; +with Ada.IO_Exceptions; + +package Terminal_Interface.Curses.Text_IO is + + use type Ada.Text_IO.Count; + subtype Count is Ada.Text_IO.Count; + subtype Positive_Count is Count range 1 .. Count'Last; + + subtype Field is Ada.Text_IO.Field; + subtype Number_Base is Integer range 2 .. 16; + + type Type_Set is (Lower_Case, Upper_Case, Mixed_Case); + + -- For most of the routines you will see a version without a Window + -- type parameter. They will operate on a default window, which can + -- be set by the user. It is initially equal to Standard_Window. + + procedure Set_Window (Win : Window); + -- Set Win as the default window + + function Get_Window return Window; + -- Get the current default window + + procedure Flush (Win : Window); + procedure Flush; + + -------------------------------------------- + -- Specification of line and page lengths -- + -------------------------------------------- + + -- There are no set routines in this package. I assume, that you allocate + -- the window with an appropriate size. + -- A scroll-window is interpreted as an page with unbounded page length, + -- i.e. it returns the conventional 0 as page length. + + function Line_Length (Win : Window) return Count; + function Line_Length return Count; + + function Page_Length (Win : Window) return Count; + function Page_Length return Count; + + ------------------------------------ + -- Column, Line, and Page Control -- + ------------------------------------ + procedure New_Line (Win : Window; Spacing : Positive_Count := 1); + procedure New_Line (Spacing : Positive_Count := 1); + + procedure New_Page (Win : Window); + procedure New_Page; + + procedure Set_Col (Win : Window; To : Positive_Count); + procedure Set_Col (To : Positive_Count); + + procedure Set_Line (Win : Window; To : Positive_Count); + procedure Set_Line (To : Positive_Count); + + function Col (Win : Window) return Positive_Count; + function Col return Positive_Count; + + function Line (Win : Window) return Positive_Count; + function Line return Positive_Count; + + ----------------------- + -- Characters-Output -- + ----------------------- + + procedure Put (Win : Window; Item : Character); + procedure Put (Item : Character); + + -------------------- + -- Strings-Output -- + -------------------- + + procedure Put (Win : Window; Item : String); + procedure Put (Item : String); + + procedure Put_Line + (Win : Window; + Item : String); + + procedure Put_Line + (Item : String); + + -- Exceptions + + Status_Error : exception renames Ada.IO_Exceptions.Status_Error; + Mode_Error : exception renames Ada.IO_Exceptions.Mode_Error; + Name_Error : exception renames Ada.IO_Exceptions.Name_Error; + Use_Error : exception renames Ada.IO_Exceptions.Use_Error; + Device_Error : exception renames Ada.IO_Exceptions.Device_Error; + End_Error : exception renames Ada.IO_Exceptions.End_Error; + Data_Error : exception renames Ada.IO_Exceptions.Data_Error; + Layout_Error : exception renames Ada.IO_Exceptions.Layout_Error; + +end Terminal_Interface.Curses.Text_IO; diff --git a/contrib/ncurses/Ada95/src/terminal_interface-curses-trace.adb_p b/contrib/ncurses/Ada95/src/terminal_interface-curses-trace.adb_p new file mode 100644 index 00000000..11acf3d4 --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface-curses-trace.adb_p @@ -0,0 +1,77 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface.Curses.Trace -- +-- -- +-- B O D Y -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2001-2011,2014 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.12 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +#if ADA_TRACE then +with Interfaces.C; use Interfaces.C; +#end if; + +package body Terminal_Interface.Curses.Trace is + +#if ADA_TRACE then + procedure Trace_On (x : Trace_Attribute_Set) is + procedure traceC (y : Trace_Attribute_Set); + pragma Import (C, traceC, "trace"); + begin + traceC (x); + end Trace_On; + + procedure Trace_Put (str : String) is + procedure tracef (format : char_array; s : char_array); + pragma Import (C, tracef, "_traces"); + -- _traces() is defined in c_varargs_to_ada.h + begin + tracef (To_C ("%s"), To_C (str)); + end Trace_Put; +#else + procedure Trace_On (x : Trace_Attribute_Set) is + pragma Warnings (Off, x); -- unreferenced + begin + null; + end Trace_On; + + procedure Trace_Put (str : String) is + pragma Warnings (Off, str); -- unreferenced + begin + null; + end Trace_Put; +#end if; + +end Terminal_Interface.Curses.Trace; diff --git a/contrib/ncurses/Ada95/src/terminal_interface.ads b/contrib/ncurses/Ada95/src/terminal_interface.ads new file mode 100644 index 00000000..a78f145c --- /dev/null +++ b/contrib/ncurses/Ada95/src/terminal_interface.ads @@ -0,0 +1,48 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT ncurses Binding -- +-- -- +-- Terminal_Interface -- +-- -- +-- S P E C -- +-- -- +------------------------------------------------------------------------------ +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1999-2003,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell -- +-- copies of the Software, and to permit persons to whom the Software is -- +-- furnished to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -- +-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR -- +-- THE USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------ +-- Author: Juergen Pfeifer, 1996 +-- Version Control: +-- $Revision: 1.15 $ +-- $Date: 2020/02/02 23:34:34 $ +-- Binding Version 01.00 +------------------------------------------------------------------------------ +package Terminal_Interface is + pragma Pure (Terminal_Interface); +-- +-- Everything is in the child units +-- +end Terminal_Interface; diff --git a/contrib/ncurses/COPYING b/contrib/ncurses/COPYING new file mode 100644 index 00000000..540047f1 --- /dev/null +++ b/contrib/ncurses/COPYING @@ -0,0 +1,29 @@ +Copyright 2018-2023,2024 Thomas E. Dickey +Copyright 1998-2017,2018 Free Software Foundation, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, distribute with modifications, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR +THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + +-- vile:txtmode fc=72 +-- $Id: COPYING,v 1.13 2024/01/05 21:13:17 tom Exp $ diff --git a/contrib/ncurses/INSTALL b/contrib/ncurses/INSTALL new file mode 100644 index 00000000..73b6d065 --- /dev/null +++ b/contrib/ncurses/INSTALL @@ -0,0 +1,2543 @@ +------------------------------------------------------------------------------- +-- Copyright 2018-2023,2024 Thomas E. Dickey -- +-- Copyright 1998-2017,2018 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: INSTALL,v 1.257 2024/08/10 17:43:39 tom Exp $ +--------------------------------------------------------------------- + How to install Ncurses/Terminfo on your system +--------------------------------------------------------------------- + + ************************************************************ + * READ ALL OF THIS FILE BEFORE YOU TRY TO INSTALL NCURSES. * + ************************************************************ + +You should be reading the file INSTALL in a directory called ncurses-d.d, +where d.d is the current version number. There should be several +subdirectories, including 'c++', 'form', 'man', 'menu', 'misc', 'ncurses', +'panel', 'progs', and 'test'. See 'README' for a roadmap to the package. + +If you are a distribution integrator or packager, please read and act on the +section titled FOR SYSTEM INTEGRATORS below. + +If you are converting from BSD curses and do not have root access, be sure +to read the BSD CONVERSION NOTES section below. + +If you are trying to build applications using gpm with ncurses, +read the USING GPM section below. + +If you are cross-compiling, see the note below on +BUILDING WITH A CROSS-COMPILER. + +If you want to build the Ada95 binding, go to the Ada95 directory and +follow the instructions there. The Ada95 binding is not covered below. + + +REQUIREMENTS: +------------ + +You will need the following to build and install ncurses under UNIX: + + * ANSI C compiler (gcc, for instance) + * sh (bash will do) + * awk (mawk or gawk will do) + * sed + * BSD or System V style install (a script is enclosed) + +Ncurses has been also built in the OS/2 EMX environment. + + +INSTALLATION PROCEDURE: +---------------------- + +1. First, decide whether you want ncurses to replace your existing library + (in which case you'll need super-user privileges) or be installed in + parallel with it. + + The --prefix option to configure changes the root directory for installing + ncurses. The default is normally in subdirectories of /usr/local, except + for systems where ncurses is normally installed as a system library (see + "FOR SYSTEM INTEGRATORS"). Use --prefix=/usr to replace your + default curses distribution. + + The package gets installed beneath the --prefix directory as follows: + + In $(prefix)/bin: tic, infocmp, captoinfo, tset, + reset, clear, tput, toe, tabs + In $(prefix)/lib: libncurses*.* libcurses.a + In $(prefix)/share/terminfo: compiled terminal descriptions + In $(prefix)/include: C header files + Under $(prefix)/man: the manual pages + + Note that the configure script attempts to locate previous installation of + ncurses, and will set the default prefix according to where it finds the + ncurses headers. + + Do not use commands such as + + make install prefix=XXX + + to change the prefix after configuration, since the prefix value is used + for some absolute pathnames such as TERMINFO. Instead do this + + make install DESTDIR=XXX + + See also the discussion of --with-install-prefix. + +2. Type './configure' in the top-level directory of the distribution to + configure ncurses for your operating system and create the Makefiles. + Besides --prefix, various configuration options are available to customize + the installation; use './configure --help' to list the available options. + + If your operating system is not supported, read the PORTABILITY section in + the file ncurses/README for information on how to create a configuration + file for your system. + + The 'configure' script generates makefile rules for one or more object + models and their associated libraries: + + libncurses.a (normal) + + libcurses.a (normal, a link to libncurses.a) + This gets left out if you configure with --disable-overwrite. + + libncurses.so (shared) + + libncurses_g.a (debug) + + libncurses_p.a (profile) + + libncurses.la (libtool) + + If you configure using the --enable-widec option, a "w" is appended to the + library names (e.g., libncursesw.a), and the resulting libraries support + wide-characters, e.g., via a UTF-8 locale. The corresponding header files + are compatible with the non-wide-character configuration; wide-character + features are provided by ifdef's in the header files. The wide-character + library interfaces are not binary-compatible with the non-wide-character + version. Building and running the wide-character code relies on a fairly + recent implementation of libiconv. We have built this configuration on + various systems using libiconv, sometimes requiring libutf8. + + If you configure using the --with-pthread option, a "t" is appended to + the library names (e.g., libncursest.a, libncursestw.a). + + If you do not specify any models, the normal and debug libraries will be + configured. Typing 'configure' with no arguments is equivalent to: + + ./configure --with-normal --with-debug --enable-overwrite + + Typing + + ./configure --with-shared + + makes the shared libraries the default, resulting in + + ./configure --with-shared --with-normal --with-debug --enable-overwrite + + If you want only shared libraries, type + + ./configure --with-shared --without-normal --without-debug + + Rules for generating shared libraries are highly dependent upon the choice + of host system and compiler. We've been testing shared libraries on + several systems, but more work needs to be done to make shared libraries + work on other systems. + + If you have libtool installed, you can type + + ./configure --with-libtool + + to generate the appropriate static and/or shared libraries for your + platform using libtool. + + You can make curses and terminfo fall back to an existing file of termcap + definitions by configuring with --enable-termcap. If you do this, the + library will search /etc/termcap before the terminfo database, and will + also interpret the contents of the $TERM environment variable. See the + section BSD CONVERSION NOTES below. + +3. Type 'make'. Ignore any warnings; no error messages should be produced. + This should compile the ncurses library, the terminfo compiler tic(1), + captoinfo(1), infocmp(1), toe(1), clear(1) tset(1), reset(1), and tput(1) + programs (see the manual pages for explanation of what they do), some test + programs, and the panels, menus, and forms libraries. + +4. Run ncurses and several other test programs in the test directory to + verify that ncurses functions correctly before doing an install that + may overwrite system files. Read the file test/README for details on + the test programs. + + NOTE: You must have installed the terminfo database, or set the + environment variable $TERMINFO to point to a SVr4-compatible terminfo + database before running the test programs. Not all vendors' terminfo + databases are SVr4-compatible, but most seem to be. + + It is possible to configure ncurses to use other terminfo database + formats. A few are provided as examples in the include-directory (see + --with-caps). + + If you run the test programs WITHOUT installing terminfo, ncurses may + read the termcap file and cache that in $HOME/.terminfo, which will + thereafter be used instead of the terminfo database. See the comments + on "--enable-getcap-cache", to see why this is a Bad Thing. + + The ncurses program is designed specifically to test the ncurses library. + You can use it to verify that the screen highlights work correctly, that + cursor addressing and window scrolling works OK, etc. + +5. Once you've tested, you can type 'make install' to install libraries, + the programs, the terminfo database and the manual pages. Alternately, + you can type 'make install' in each directory you want to install. In the + top-level directory, you can do a partial install using these commands: + + 'make install.progs' installs tic, infocmp, etc... + 'make install.includes' installs the headers. + 'make install.libs' installs the libraries (and the headers). + 'make install.data' installs the terminfo data. (Note: 'tic' must + be installed before the terminfo data can be + compiled). + 'make install.man' installs the manual pages. + + ############################################################################ + # CAVEAT EMPTOR: 'install.data' run as root will NUKE any existing # + # terminfo database. If you have any custom or unusual entries SAVE them # + # before you install ncurses. # + ############################################################################ + + The terminfo(5) manual page must be preprocessed with tbl(1) before + being formatted by nroff(1). Modern man(1) implementations tend to do + this by default, but you may want to look at your version's manual page + to be sure. You may also install the manual pages after preprocessing + with tbl(1) by specifying the configure option --with-manpage-tbl. + + If the system already has a curses library that you need to keep using + you'll need to distinguish between it and ncurses. See the discussion of + --disable-overwrite. If ncurses is installed outside the standard + directories (/usr/include and /usr/lib) then all your users will need to + use the -I option to compile programs and -L to link them. + + If you have another curses installed in your system and you accidentally + compile using its curses.h you'll end up with a large number of + undefined symbols at link time. + + IF YOU DO NOT HAVE ROOT: Change directory to the 'progs' subdirectory + and run the 'capconvert' script. This script will deduce various things + about your environment and use them to build you a private terminfo tree, + so you can use ncurses applications. + + If more than one user at your site does this, the space for the duplicate + trees is wasted. Try to get your site administrators to install a system- + wide terminfo tree instead. + + See the BSD CONVERSION NOTES section below for a few more details. + +6. The c++ directory has C++ classes that are built on top of ncurses and + panels. You must have c++ (and its libraries) installed before you can + compile and run the demo. + + Use --without-cxx-binding to tell configure to not build the C++ bindings + and demo. + + If you do not have C++, you must use the --without-cxx option to tell + the configure script to not attempt to determine the type of 'bool' + which may be supported by C++. IF YOU USE THIS OPTION, BE ADVISED THAT + YOU MAY NOT BE ABLE TO COMPILE (OR RUN) NCURSES APPLICATIONS WITH C++. + + +CONFIGURE OPTIONS: +----------------- + + The configure script provides a short list of its options when you type + + ./configure --help + + The --help and several options are common to all configure scripts that + are generated with autoconf. Those are all listed before the line + + --enable and --with options recognized: + + The other options are specific to this package. We list them in + alphabetic order. + + --disable-assumed-color + With ncurses 5.1, we introduced a new function, assume_default_colors() + which allows applications to specify what the default foreground and + background color are assumed to be. Most color applications use + full-screen color; but a few do not color the background. While the + assumed values can be overridden by invoking assume_default_colors(), + you may find it useful to set the assumed values to the pre-5.1 + convention, using this configure option. + + --disable-big-core + Assume machine has little memory. The configure script attempts to + determine if your machine has enough memory (about 6Mb) to compile the + terminfo database without writing portions to disk. Some allocators + return deceptive results, so you may have to override the configure + script. Or you may be building tic for a smaller machine. + + --disable-big-strings + Disable compile-time optimization of predefined tables which puts + all of their strings into a very long string, to reduce relocation + overhead. + + --disable-database + Use only built-in data. The ncurses libraries normally read terminfo + and termcap data from disk. You can configure ncurses to have a + built-in database, aka "fallback" entries. Embedded applications may + have no need for an external database. Some, but not all of the + programs are useful in this configuration, e.g., tset and tput versus + infocmp and tic. + + --disable-db-install + Do not install the terminal database. This is used to omit features + for packages, as done with --without-progs. + + --disable-echo + Use the option --disable-echo to make the build-log less verbose by + suppressing the display of the compile and link commands. This makes + it easier to see the compiler warnings. (You can always use "make -n" + to see the options that are used). + + --disable-ext-funcs + Disable function-extensions. Configure ncurses without the functions + that are not specified by XSI. See ncurses/modules for the exact + list of library modules that would be suppressed. + + --disable-gnat-projects + Disable GNAT projects even if usable, for testing old makefile rules. + + --disable-hashmap + Compile without hashmap scrolling-optimization code. This algorithm is + the default. + + --disable-home-terminfo + The $HOME/.terminfo directory is normally added to ncurses' search + list for reading/writing terminfo entries, since that directory is + more likely writable than the system terminfo database. Use this + option to disable the feature altogether. + + --disable-largefile + Disable compiler flags needed to use large-file interfaces. + + --disable-leaks + For testing, compile-in code that frees memory that normally would not + be freed, to simplify analysis of memory-leaks. + + Any implementation of curses must not free the memory associated with + a screen, since (even after calling endwin()), it must be available + for use in the next call to refresh(). There are also chunks of + memory held for performance reasons. That makes it hard to analyze + curses applications for memory leaks. To work around this, build a + debugging version of the ncurses library which frees those chunks + which it can, and provides the _nc_free_and_exit() function to free + the remainder and then exit. The ncurses utility and test programs + use this feature, e.g., via the ExitProgram() macro. + + Because this lies outside of the library's intended usage, it is not + normally considered part of the ABI. If there were some (as yet + unplanned) extension which frees memory in a manner that would let the + library resume and reallocate memory, then that would not use a "_nc_" + prefix. + + --disable-lib-suffixes + Suppress the "w", "t" or "tw" suffixes which normally would be added + to the library names for the --enable-widec and --with-pthread options. + + --disable-libtool-version + when using --with-libtool, control how the major/minor version numbers + are used for constructing the library name. + + The default uses the -version-number feature of libtool, which makes + the library names compatible (though not identical) with the standard + build using --with-shared. + + Use --disable-libtool-version to use the libtool -version-info feature. + This corresponds to the setting used before patch 20100515. + + Starting with patch 20141115, using this option causes the configure + script to apply the top-level VERSION file to the ABI version used + for libtool. + + --disable-lp64 + The header files will ignore use of the _LP64 symbol to make chtype + and mmask_t types 32 bits (they may be long on 64-bit hosts, for + compatibility with older releases). + + NOTE: this is potentially an ABI change, depending on existing + packages. The default for this option is "disabled" for ncurses + ABI 5, and "enabled" for ABI 6. + + --disable-macros + For testing, use functions rather than macros. The program will run + more slowly, but it is simpler to debug. This defines NCURSES_NOMACROS + at build time. See also the --enable-expanded option. + + --disable-overwrite + If you are installing ncurses on a system which contains another + development version of curses, or which could be confused by the loader + for another version, we recommend that you leave out the link to + -lcurses. The ncurses library is always available as -lncurses. + Disabling overwrite also causes the ncurses header files to be + installed into a subdirectory, e.g., /usr/local/include/ncurses, + rather than the include directory. This makes it simpler to avoid + compile-time conflicts with other versions of curses.h + + Putting the header files into a subdirectory assumes that applications + will follow the (standard) practice of including the headers with + reference to the subdirectory name. For instance, the normal ncurses + header would be included using + + #include + #include + + while the ncursesw headers would be found this way: + + #include + #include + + In either case (with or without the --disable-overwrite option), + almost all applications are designed to include a related set of + curses header files from the same directory. + + Manipulating the --includedir configure option to put header files + directly in a subdirectory of the normal include-directory defeats + this, and breaks builds of portable applications. Likewise, putting + some headers in /usr/include, and others in a subdirectory is a good + way to break builds. + + When configured with --disable-overwrite, the installed header files' + embedded #include's are adjusted to use the same style of includes + noted above. In particular, the unctrl.h header is included from + curses.h, which means that a makefile which tells the compiler to + include directly from the subdirectory will fail to compile correctly. + Without some special effort, it will either fail to compile at all, + or the compiler may find a different unctrl.h file. + + In addition to the curses library, a system may provide its own + versions of the add-on libraries (form, menu, panel), which would + not be compatible with ncurses. These options allow you to rename + ncurses' add-on libraries to avoid conflicts when linking: + + --with-form-libname=XXX + --with-menu-libname=XXX + --with-panel-libname=XXX + + Rather than renaming them arbitrarily, a prefix or suffix is + recommended. An "n" prefix provides consistency with ncurses versus + curses, i.e., + + --with-form-libname=nform + --with-menu-libname=nmenu + --with-panel-libname=npanel + + --disable-pkg-ldflags + Omit options in $LDFLAGS and $EXTRA_LDFLAGS from the pkg-config ".pc" + and corresponding ncurses*-config script which normally are listed via + the "--libs" option. These options are normally used to facilitate + linking to ncurses when it was configured to use the rpath feature. + + See also --enable-rpath and --disable-rpath-hack. + + --disable-relink + If --enable-rpath is given, the generated makefiles normally will + rebuild shared libraries during install. Use this option to simply + copy whatever the linker produced. + + Static libraries cannot simply be copied because tools use timestamps + to determine if the library's symbol table is up to date. If your + install program supports the "-p" (preserve timestamp) option, that + is used when --disable-relink is given, to avoid rebuilding the symbol + table. + + Finally, some tools ignore the subsecond timestamps supported by some + filesystems. This option adds a 1-second sleep to help those tools + avoid unnecessary relinking during the install process. + + --disable-root-access + Compile with environment restriction, so most file-access is limited + when running as root, or via a setuid/setgid application. + + --disable-root-environ + Compile with environment restriction, so certain environment variables + are not available when running as root. These are (for example + $TERMINFO) those that allow the search path for the terminfo or termcap + entry to be customized. + + Disabling the root environment variables also disables the setuid + environment variables by default. Use the --disable-setuid-environ + option to modify this behavior. + + --disable-rpath-hack + Normally the configure script helps link libraries found in unusual + places by adding an rpath option to the link command. If you are + building packages, this feature may be redundant. Use this option + to suppress the feature. + + --disable-scroll-hints + Compile without scroll-hints code. This option is ignored when + hashmap scrolling is configured, which is the default. + + --disable-stripping + Do not strip installed executables. + + --disable-setuid-environ + Compile with environment restriction, so certain environment variables + are not available when running via a setuid/setgid application. These + are (for example $TERMINFO) those that allow the search path for the + terminfo or termcap entry to be customized. + + A setuid/setgid application inherits its environment variables from + the current user, in contrast to sudo which may limit the environment + variables that ncurses uses. + + --disable-tic-depends + When building shared libraries, normally the tic library is linked to + depend upon the ncurses library (or equivalently, on the tinfo-library + if the --with-termlib option was given). The tic- and tinfo-library + ABIs do not depend on the --enable-widec option. Some packagers have + used this to reduce the number of library files which are packaged by + using only one copy of those libraries. To make this work properly, + the tic library must be built without an explicit dependency on the + underlying library (ncurses vs ncursesw, tinfo vs tinfow). Use this + configure option to do that. + For example + configure --with-ticlib --with-shared --disable-tic-depends + + --disable-tparm-varargs + Portable programs should call tparm() using the fixed-length parameter + list documented in X/Open. ncurses provides varargs support for this + function. Use --disable-tparm-varargs to disable this support. + + --enable-assertions + For testing, compile-in assertion code. This is used only for a few + places where ncurses cannot easily recover by returning an error code. + + --enable-broken_linker + A few platforms have what we consider a broken linker: it cannot link + objects from an archive solely by referring to data objects in those + files, but requires a function reference. This configure option + changes several data references to functions to work around this + problem. + + NOTE: With ncurses 5.1, this may not be necessary, since we are + told that some linkers interpret uninitialized global data as a + different type of reference which behaves as described above. We have + explicitly initialized all of the global data to work around the + problem. + + --enable-bsdpad + Recognize BSD-style prefix padding. Some programs written using + the BSD curses API use tputs("50") to implement delays. + + --enable-check-size + Compile-in feature to detect screensize for terminals which do not + advertise their screensize, e.g., serial terminals. + + --enable-colorfgbg + Compile with experimental $COLORFGBG code. That environment variable + is set by some terminal emulators as a hint to applications, by + advertising the default foreground and background colors. During + initialization, ncurses sets color pair 0 to match this. + + --enable-const + The curses interface as documented in XSI is rather old, in fact + including features that precede ANSI C. The prototypes generally do + not make effective use of "const". When using stricter compilers (or + gcc with appropriate warnings), you may see warnings about the mismatch + between const and non-const data. We provide a configure option which + changes the interfaces to use const - quieting these warnings and + reflecting the actual use of the parameters more closely. The ncurses + library uses the symbol NCURSES_CONST for these instances of const, + and if you have asked for compiler warnings, will add gcc's const-qual + warning. There will still be warnings due to subtle inconsistencies + in the interface, but at a lower level. + + NOTE: configuring ncurses with this option may detract from the + portability of your applications by encouraging you to use const in + places where the XSI curses interface would not allow them. Similar + issues arise when porting to SVr4 curses, which uses const in even + fewer places. + + --enable-expanded + For testing, generate functions for certain macros to make them visible + as such to the debugger. See also the --disable-macros option. + + --enable-exp-win32 + When configuring for MinGW, use the experimental Windows 10 driver. + + --enable-ext-colors + Extend the cchar_t structure to allow more than 16 colors to be + encoded. This applies only to the wide-character (--enable-widec) + configuration. + + NOTE: using this option will make libraries which are not binary- + compatible with libncursesw 5.4. None of the interfaces change, but + applications which have an array of cchar_t's must be recompiled. + + --enable-ext-mouse + Modify the encoding of mouse state to make room for a 5th mouse button. + That allows one to use ncurses with a wheel mouse with xterm or + similar X terminal emulators. + + NOTE: using this option will make libraries which are not binary- + compatible with libncursesw 5.4. None of the interfaces change, but + applications which have mouse mask mmask_t's must be recompiled. + + --enable-ext-putwin + Modify the file-format written by putwin() to use printable text rather + than binary files, allowing getwin() to read screen dumps written by + differently-configured ncurses libraries. The extended getwin() can + still read binary screen dumps from the "same" configuration of + ncurses. This does not change the ABI (the binary interface seen by + calling applications). + + --enable-fvisibility + Use the gcc "-fvisibility=hidden" option to make symbols which are not + explicitly exported, "hidden". Doing this may reduce the number of + symbols exported in the C++ binding; it should have less effect on the + C libraries when symbol-versioning is used. + + --enable-getcap + Use the 4.4BSD getcap code if available, or a bundled version of it to + fetch termcap entries. Entries read in this way cannot use (make + cross-references to) the terminfo tree, but it is faster than reading + /etc/termcap. + + If configured for one of the *BSD systems, this automatically uses + the hashed database system produced using cap_mkdb or similar tools. + In that case, there is no advantage in using the --enable-getcap-cache + option. + + See also the --with-hashed-db option. + + --enable-getcap-cache + Cache translated termcaps under the directory $HOME/.terminfo + + NOTE: this sounds good - it makes ncurses run faster the second time. + But look where the data comes from - an /etc/termcap containing lots of + entries that are not up to date. If you configure with this option and + forget to install the terminfo database before running an ncurses + application, you will end up with a hidden terminfo database that + generally does not support color and will miss some function keys. + + --enable-hard-tabs + Compile-in cursor-optimization code that uses hard-tabs. We would make + this a standard feature except for the concern that the terminfo entry + may not be accurate, or that your stty settings have disabled the use + of tabs. + + --enable-install-prefix + Extend the --with-install-prefix feature to replace the prefix value + with $DESTDIR rather than simply prepending $DESTDIR to install + pathnames. This works with any "make" which supports AT&T style + variable substitution. + + --enable-interop + Compile-in experimental interop bindings. These provide generic types + for the form-library. + + --enable-mixed-case + Controls whether the filesystem on which the terminfo database resides + supports mixed-case filenames (normal for UNIX, but not on other + systems). If you do not specify this option, the configure script + checks the current filesystem. + + --enable-no-padding + Compile-in support for the $NCURSES_NO_PADDING environment variable, + which allows you to suppress the effect of non-mandatory padding in + terminfo entries. This is the default, unless you have disabled the + extended functions. + + --enable-opaque-curses + --enable-opaque-form + --enable-opaque-menu + --enable-opaque-panel + Define symbol in curses.h controlling whether some library structures + are opaque, meaning that their members are accessible only via the + documented API. The --enable-opaque-curses option may be overridden + by the --enable-reentrant option. + + Enabling opaque-curses enables opaque for the form, menu, and panel + libraries. Use their corresponding options to disable the feature + individually. + + NOTE: beginning with ncurses 6.5 this option is enabled by default; + older versions disable it by default. + + --enable-pc-files + If pkg-config is found (see --with-pkg-config), generate ".pc" files + for each of the libraries, and install them in pkg-config's library + directory. + + --enable-pthreads-eintr + add logic in threaded configuration to ensure that a read(2) system + call can be interrupted for SIGWINCH. + + --enable-reentrant + Compile configuration which improves reentrant use of the library by + reducing global and static variables. This option is also set if + --with-pthread is used. + + Enabling this option adds a "t" to the library names, except for the + special case when --enable-weak-symbols is also used. + + --enable-rpath + Use rpath option when generating shared libraries, and (with some + restrictions) when linking the corresponding programs. This originally + (in 1997) applied mainly to systems using the GNU linker (read the + manpage). + + More recently it is useful for systems that require special treatment + shared libraries in "unusual" locations. The "system" libraries reside + in directories which are on the loader's default search-path. While + you may be able to use workarounds such as the $LD_LIBRARY_PATH + environment variable, they do not work with setuid applications since + the LD_LIBRARY_PATH variable would be unset in that situation. + + This option does not apply to --with-libtool, since libtool makes + extra assumptions about rpath. + + --enable-safe-sprintf + Compile with experimental safe-sprintf code. You may consider using + this if you are building ncurses for a system that has neither + vsnprintf() or vsprintf(). It is slow, however, and is used only on + very old systems which lack vsnprintf(). + + --enable-signed-char + The term.h header declares a Booleans[] array typed "char". But it + stores signed values there and "char" is not necessarily signed. + Some packagers choose to alter the type of Booleans[] though this + is not strictly compatible. This option allows one to implement this + alteration without patching the source code. + + --enable-sigwinch + Compile support for ncurses' SIGWINCH handler. If your application has + its own SIGWINCH handler, ncurses will not use its own. The ncurses + handler causes wgetch() to return KEY_RESIZE when the screen-size + changes. This option is the default, unless you have disabled the + extended functions. + + --enable-sp-funcs + Compile-in support for extended functions which accept a SCREEN pointer, + reducing the need for juggling the global SP value with set_term() and + delscreen(). + + --enable-stdnoreturn + When enabled, check if the header exists, and if found + define GCC_NORETURN to _Noreturn rather than either the gcc-specific + __attribute__((noreturn)) or an empty token. Doing this may require + calling programs which use GCC_NORETURN in their own function + definitions to be modified, because _Noreturn is only accepted as + the first token in a declaration. + + --enable-string-hacks + Controls whether strlcat and strlcpy may be used. The same issue + applies to OpenBSD's warnings about snprintf, noting that this function + is weakly standardized. + + Aside from stifling these warnings, there is no functional improvement + in ncurses. + + --enable-symlinks + If your system supports symbolic links, make tic use symbolic links + rather than hard links to save diskspace when writing aliases in the + terminfo database. + + --enable-tcap-names + Compile-in support for user-definable terminal capabilities. Use the + -x option of tic and infocmp to treat unrecognized terminal + capabilities as user-defined strings. This option is the default, + unless you have disabled the extended functions. + + --enable-term-driver + Enable experimental terminal-driver. This is currently used for the + MinGW port, by providing a way to substitute the low-level terminfo + library with different terminal drivers. + + --enable-termcap + Compile in support for reading terminal descriptions from termcap if no + match is found in the terminfo database. See also the --enable-getcap + and --enable-getcap-cache options. + + Termcap support requires run-time parsing rather than loading + predigested data. If you have specified --with-ticlib, then you + cannot have termcap support since run-time parsing is done in the + tic library, which is intentionally not part of normal linkage + dependencies. + + --enable-warnings + Turn on GCC compiler warnings. There should be only a few. + + --enable-wattr-macros + The 6.0 ABI adds support for extended colors and for extended mouse. + The former is a noticeable problem when developers inadvertently + compile using the ncurses6 header files and link with an ncurses5 + library, because the wattr* macros use a new field in the WINDOW + structure. These macros are used in several applications. + + Since ncurses provides an actual function for each of these macros, + suppressing them from the curses.h header allows the ncurses5 libraries + to be used in most applications. + + NOTE: The extended colors also are used in the cchar_t structure, but + fewer applications use that. + + NOTE: This workaround does not help with mismatches in the ncurses + mouse version. The extended mouse feature uses one less fewer bit for + each button, so that only the first button will work as expected with + a mismatch between header and library. Again, most applications will + work, since most use only the first button. + + --enable-weak-symbols + If the --with-pthread option is set, check if the compiler supports + weak-symbols. If it does, then name the thread-capable library without + the "t" (libncurses rather than libncursest), and provide for + dynamically loading the pthreads entrypoints at runtime. This allows + one to reduce the number of library files for ncurses. + + --enable-wgetch-events + Compile with experimental wgetch-events code. See ncurses/README.IZ + + --enable-widec + Compile with wide-character code. This makes a different version of + the libraries (e.g., libncursesw.so), which stores characters as + wide-characters, + + NOTE: applications compiled with this configuration are not compatible + with those built for 8-bit characters. You cannot simply make a + symbolic link to equate libncurses.so with libncursesw.so + + NOTE: the Ada95 binding may be built against either version of the the + ncurses library, but you must decide which: the binding installs the + same set of files for either version. Currently (2023/10/21) it does + not use the extended features from the wide-character code, so it is + probably better to not install the binding for that configuration. + + NOTE: beginning with ncurses 6.5 this option is enabled by default; + older versions disable it by default. + + --enable-xmc-glitch + Compile-in support experimental xmc (magic cookie) code. + + --with-abi-altered=NUM + Override the displayed (rather than compiled-in) ABI. Only packagers + who have created configurations where the ABI differs from ncurses + should be interested in this option. + + --with-abi-version=NUM + Override the ABI version, which is used in shared library filenames. + Normally this is the same as the release version; some ports have + special requirements for compatibility. + + This option does not affect linking with libtool, which uses the + release major/minor numbers. + + --with-ada-compiler=CMD + Specify the Ada95 compiler command (default "gnatmake") + + --with-ada-include=DIR + Tell where to install the Ada includes (default: + PREFIX/lib/ada/adainclude) + + --with-ada-libname=NAME + Override the name of the Ada binding (default: "AdaCurses") + + --with-ada-objects=DIR + Tell where to install the Ada objects (default: PREFIX/lib/ada/adalib) + + --with-ada-sharedlib + Build a shared library for Ada95 binding, if the compiler permits. + + NOTE: You must also set the --with-shared option on some platforms + for a successful build. You need not use this option when you set + --with-shared, unless you want to use the Ada shared library. + + --with-bool=TYPE + If --without-cxx is specified, override the type used for the "bool" + declared in curses.h (normally the type is automatically chosen to + correspond with that in , or defaults to platform-specific + sizes). + + --with-build-cc=XXX + If cross-compiling, specify a host C compiler, which is needed to + compile a few utilities which generate source modules for ncurses. + If you do not give this option, the configure script checks if the + $BUILD_CC variable is set, and otherwise defaults to gcc or cc. + + --with-build-cflags=XXX + If cross-compiling, specify the host C compiler-flags. You might need + to do this if the target compiler has unusual flags which confuse the + host compiler. + + You can also set the environment variable $BUILD_CFLAGS rather than + use this option. + + --with-build-cpp=XXX + This option is provided by the same macro used for $BUILD_CC, etc., + but is not directly used by ncurses. + + --with-build-cppflags=XXX + If cross-compiling, specify the host C preprocessor-flags. You might + need to do this if the target compiler has unusual flags which confuse + the host compiler. + + You can also set the environment variable $BUILD_CPPFLAGS rather than + use this option. + + --with-build-ldflags=XXX + If cross-compiling, specify the host linker-flags. You might need to + do this if the target linker has unusual flags which confuse the host + compiler. + + You can also set the environment variable $BUILD_LDFLAGS rather than + use this option. + + --with-build-libs=XXX + If cross-compiling, the host libraries. You might need to do this if + the target environment requires unusual libraries. + + You can also set the environment variable $BUILD_LIBS rather than + use this option. + + --with-caps=XXX + Specify an alternate terminfo capabilities file, which makes the + configure script look for "include/Caps.XXX". A few systems, e.g., + AIX 4.x use the same overall file-format as ncurses for terminfo + data, but use different alignments within the tables to support + legacy applications. For those systems, you can configure ncurses + to use a terminfo database which is compatible with the native + applications. + + --with-ccharw-max=XXX + Override the size of the wide-character array in cchar_t structures. + Changing this will alter the binary interface. This defaults to 5. + + --with-chtype=TYPE + Override type of chtype, which stores the video attributes and (if + --enable-widec is not given) a character. Prior to ncurses 5.5, this + was always unsigned long, but with ncurses 5.5, it may be unsigned. + Use this option if you need to preserve compatibility with 64-bit + executables, e.g., by setting "--with-chtype=long" (the configure + script supplies "unsigned"). + + --with-config-suffix=XXX + Specify an suffix for "ncurses*" in the ncurses*-config filename to + work around conflicts with packages. The suffix is placed before the + dash. + + --with-cxx-libname=NAME + Override the basename of the ncurses++ library (default: "ncurses++") + + --with-cxx-shared + When --with-shared is set, build libncurses++ as a shared library. + This implicitly relies upon building with gcc/g++, since other + compiler suites may have differences in the way shared libraries are + built. libtool by the way has similar limitations. + + --with-database=XXX + Specify the terminfo source file to install. Usually you will wish + to install ncurses' default (misc/terminfo.src). Certain systems + have special requirements, e.g, OS/2 EMX has a customized terminfo + source file. + + --with-dbmalloc + For testing, compile and link with Conor Cahill's dbmalloc library. + This also sets the --disable-leaks option. + + --with-debug + Generate debug-libraries (default). These are named by adding "_g" + to the root, e.g., libncurses_g.a + + --with-default-terminfo-dir=XXX + Specify the default terminfo database directory. This is normally + DATADIR/terminfo, e.g., /usr/share/terminfo. + + --with-dmalloc + For testing, compile and link with Gray Watson's dmalloc library. + This also sets the --disable-leaks option. + + --with-export-syms[=XXX] + Limit exported symbols using libtool. The configure script + automatically chooses an appropriate ".sym" file, which lists the + symbols which are part of the ABI. + + --with-extra-suffix[=XXX] + Add the given suffix to header- and library-names to simplify + installing incompatible ncurses libraries, e.g., those using a + different ABI. The renaming affects the name of the + include-subdirectory if --disable-overwrite is given. + + --with-fallbacks=XXX + Specify a list of fallback terminal descriptions which will be + compiled into the ncurses library. See CONFIGURING FALLBACK ENTRIES. + + See also "--with-tic-path" and "--with-infocmp-path". + + --with-form-libname=NAME + Override the basename of the form library (default: "form") + + --with-gpm + use Alessandro Rubini's GPM library to provide mouse support on the + Linux console. Prior to ncurses 5.5, this introduced a dependency on + the GPM library. + + Currently ncurses uses the dlsym() function to bind to the library at + runtime, so it is only necessary that the library be present when + ncurses is built, to obtain the filename (or soname) used in the + corresponding dlopen() call. If you give a value for this option, + e.g., + + --with-gpm=$HOME/tmp/test-gpm.so + + that overrides the configure check for the soname. + + See also --without-dlsym + + --with-hashed-db[=XXX] + Use a hashed database for storing terminfo data rather than storing + each compiled entry in a separate binary file within a directory + tree. + + In particular, this uses the Berkeley database 1.8.5 interface, as + provided by that and its successors db 2, 3, and 4. The actual + interface is slightly different in the successor versions of the + Berkeley database. The database should have been configured using + "--enable-compat185". + + If you use this option for configuring ncurses, tic will only be able + to write entries in the hashed database. infocmp can still read + entries from a directory tree as well as reading entries from the + hashed database. To do this, infocmp determines whether the $TERMINFO + variable points to a directory or a file, and reads the directory-tree + or hashed database respectively. + + You cannot have a directory containing both hashed-database and + filesystem-based terminfo entries. + + Use the parameter value to give the install-prefix used for the + database, e.g., + --with-hashed-db=/usr/local/BigBase + to find the corresponding include- and lib-directories under the + given directory. Alternatively, you can specify a directory leaf + name, e.g., + --with-hashed-db=db4 + to make the configure script look for files in a subdirectory such as + /usr/include/db4/db.h + /usr/lib/db4/libdb.so + + See also the --enable-getcap option. + + --with-infocmp-path[=XXX] + Use this option to override the automatic detection of infocmp in your + $PATH when building fallbacks (see "--with-fallbacks"). + + --with-install-prefix=XXX + Allows you to specify an alternate location for installing ncurses + after building it. The value you specify is prepended to the "real" + install location. This simplifies making binary packages. The + makefile variable DESTDIR is set by this option. It is also possible + to use + make install DESTDIR=XXX + since the makefiles pass that variable to subordinate makes. + + NOTE: a few systems build shared libraries with fixed pathnames; this + option probably will not work for those configurations. + + --with-lib-prefix=XXX + OS/2 EMX used a different naming convention from most Unix-like + platforms. It required that the "lib" part of a library name was + omitted. Newer EMX as part of eComStation does not follow that + convention. Use this option to override the configure script's + assumptions about the library-prefix. If this option is omitted, it + uses the original OS/2 EMX convention for that platform. Use + "--with-lib-prefix=lib" for the newer EMX in eComStation. Use + "--without-lib-prefix" to suppress it for other odd platforms. + + --with-libtool[=XXX] + Generate libraries with libtool. If this option is selected, then it + overrides all other library model specifications. Note that libtool + must already be installed, uses makefile rules dependent on GNU make, + and does not promise to follow the version numbering convention of + other shared libraries on your system. However, if the --with-shared + option does not succeed, you may get better results with this option. + + If a parameter value is given, it must be the full pathname of the + particular version of libtool, e.g., + /usr/bin/libtool-1.2.3 + + It is possible to rebuild the configure script to use the automake + macros for libtool, e.g., AC_PROG_LIBTOOL. See the comments in + aclocal.m4 for CF_PROG_LIBTOOL, and ensure that you build configure + using the appropriate patch for autoconf from + https://invisible-island.net/autoconf/ + + --with-libtool-opts=XXX + Allow user to pass additional libtool options into the library creation + and link steps. The main use for this is to do something like + ./configure --with-libtool-opts=-static + to get the same behavior as automake-flavored + ./configure --enable-static + + --with-manpage-aliases + Tell the configure script you wish to create entries in the + man-directory for aliases to manpages which list them, e.g., the + functions in the panel manpage. This is the default. You can disable + it if your man program does this. You can also disable + --with-manpage-symlinks to install files containing a ".so" command + rather than symbolic links. + + --with-manpage-format=XXX + Tell the configure script how you would like to install man-pages. The + option value must be one of these: gzip, compress, BSDI, normal, + formatted. If you do not give this option, the configure script + attempts to determine which is the case. + + --with-manpage-renames=XXX + Tell the configure script that you wish to rename the manpages while + installing. Currently the only distribution which does this is Debian. + The option value specifies the name of a file that lists the renamed + files, e.g., $srcdir/man/man_db.renames + + --with-manpage-symlinks + Tell the configure script that you wish to make symbolic links in the + man-directory for aliases to the man-pages. This is the default, but + can be disabled for systems that provide this automatically. Doing + this on systems that do not support symbolic links will result in + copying the man-page for each alias. + + --with-manpage-tbl + Tell the configure script that you wish to preprocess the manpages + by running them through tbl to generate tables understandable by + nroff. + + --with-menu-libname=NAME + Override the basename of the menu library (default: "menu") + + --with-mmask-t=TYPE + Override type of mmask_t, which stores the mouse mask. Prior to + ncurses 5.5, this was always unsigned long, but with ncurses 5.5, it + may be unsigned. Use this option if you need to preserve compatibility + with 64-bit executables. + + --with-normal + Generate normal (i.e., static) libraries (default). + + Note: on Linux, the configure script will attempt to use the GPM + library via the dlsym() function call. Use --without-dlsym to disable + this feature, or --without-gpm, depending on whether you wish to use + GPM. + + --with-ospeed=TYPE + Override type of ospeed variable, which is part of the termcap + compatibility interface. In termcap, this is a 'short', which works + for a wide range of baudrates because ospeed is not the actual speed + but the encoded value, e.g., B9600 would be a small number such as 13. + However the encoding scheme originally allowed for values "only" up to + 38400bd. A newer set of definitions past 38400bd is not encoded as + compactly, and is not guaranteed to fit into a short (see the function + cfgetospeed(), which returns a speed_t for this reason). In practice, + applications that required knowledge of the ospeed variable, i.e., + those using termcap, do not use the higher speeds. Your application + (or system, in general) may or may not. + + --with-panel-libname=NAME + Override the basename of the panel library (default: "panel") + + --with-pc-suffix=SUFFIX + If ".pc" files are installed (see --enable-pc-files), optionally add a + suffix to the files and corresponding package names to separate + unusual configurations. If no option value is given (or if it is + "none"), no suffix is added. + + --with-pcre2 + Add PCRE2 (Perl-compatible regular expressions v2) to the build if it + is available and the user requests it. Assume the application will + otherwise use the POSIX interface. + + This is useful for MinGW builds because the usual POSIX interface is + not supplied by the development environment, while ncurses' form + library uses a regular expression feature for one of the field types. + + --with-pkg-config[=CMD] + Check for pkg-config, optionally specifying its pathname. + + --with-pkg-config-libdir[=DIR] + If pkg-config was found, override the automatic check for its library + path. The optional DIR value can be + + "auto", automatically use pkg-config's library directory, or + + "libdir", use a ${libdir}/pkgconfig (based on the configuration), or + + a directory path, i.e., beginning with "/". + + The configure script allows only a single directory, because + that is used as the directory in which to install ".pc" files. + + The automatic check for the library path prefers the first directory + which currently exists. If none of the directories listed by + pkg-config exist, the check prefers a pkgconfig directory under the + "libdir" set by the configure script (which may not be the system + default), or if pkg-config lists nothing suitable, the first one which + is listed by pkg-config is used. + + --with-profile + Generate profile-libraries These are named by adding "_p" to the root, + e.g., libncurses_p.a + + --with-pthread + Link with POSIX threads, set --enable-reentrant. The use_window() and + use_screen() functions will use mutex's, allowing rudimentary support + for multithreaded applications. + + --with-rcs-ids + Compile-in RCS identifiers. Most of the C files have an identifier. + + --with-rel-version=NUM + Override the release version, which may be used in shared library + filenames. This consists of a major and minor version number separated + by ".". Normally the major version number is the same as the ABI + version; some ports have special requirements for compatibility. + + --with-shared + Generate shared-libraries. The names given depend on the system for + which you are building, typically using a ".so" suffix, along with + symbolic links that refer to the release version. + + NOTE: Unless you override the configure script by setting the $CFLAGS + environment variable, these will not be built with the -g debugging + option. + + NOTE: For some configurations, e.g., installing a new version of + ncurses shared libraries on a machine which already has ncurses + shared libraries, you may encounter problems with the linker. + For example, it may prevent you from running the build tree's + copy of tic (for installing the terminfo database) because it + loads the system's copy of the ncurses shared libraries. + + In that case, using the misc/shlib script may be helpful, since it + sets $LD_LIBRARY_PATH to point to the build tree, e.g., + + ./misc/shlib make install + + Alternatively, for most platforms, the linker accepts a list of + directories which will be searched for libraries at run-time. The + configure script allows you to modify this list using the + RPATH_LIST environment variable. It is a colon-separated list of + directories (default: the "libdir" set via the configure script). + If you set that to put "../lib" first in the list, the linker will + look first at the build-directory, and avoid conflict with libraries + already installed. One drawback to this approach is that libraries + can be accidentally searched in any "../lib" directory. + + NOTE: If you use the --with-ada-sharedlib option, you should also + set this option, to ensure that C-language modules needed for the + Ada binding use appropriate compiler options. + + --with-shlib-version=XXX + Specify whether to use the release or ABI version for shared libraries. + This is normally chosen automatically based on the type of system + which you are building on. We use it for testing the configure script. + + --with-strip-program=XXX + When stripping executables during install, use the specified program + rather than "strip". + + --with-sysmouse + use FreeBSD sysmouse interface provide mouse support on the console. + + --with-system-type=XXX + For testing, override the derived host system-type which is used to + decide things such as the linker commands used to build shared + libraries. This is normally chosen automatically based on the type of + system which you are building on. We use it for testing the configure + script. + + --with-terminfo-dirs=XXX + Specify a search-list of terminfo directories which will be compiled + into the ncurses library (default: DATADIR/terminfo) + + This is a colon-separated list, like the $TERMINFO_DIRS environment + variable. + + --with-termlib[=XXX] + When building the ncurses library, organize this as two parts: the + curses library (libncurses) and the low-level terminfo library + (libtinfo). This is done to accommodate applications that use only + the latter. The terminfo library is about half the size of the total. + + If an option value is given, that overrides the name of the terminfo + library. For instance, if the wide-character version is built, the + terminfo library would be named libtinfow. But the libtinfow interface + is upward compatible from libtinfo, so it would be possible to overlay + libtinfo.so with a "wide" version of libtinfow.so by renaming it with + this option. + + --with-termpath=XXX + Specify a search-list of termcap files which will be compiled into the + ncurses library (default: /etc/termcap:/usr/share/misc/termcap) + + --with-tic-path[=XXX] + Use this option to override the automatic detection of tic in your + $PATH when building fallbacks (see "--with-fallbacks"). + + --with-ticlib[=XXX] + When building the ncurses library, build a separate library for + the modules that are used only by the utility programs. Normally + those would be bundled with the termlib or ncurses libraries. + + If an option value is given, that overrides the name of the tic + library. As in termlib, there is no ABI difference between the + "wide" libticw.so and libtic.so + + NOTE: Overriding the name of the tic library may be useful if you are + also using the --with-termlib option to rename libtinfo. If you are + not doing that, renaming the tic library can result in conflicting + library dependencies for tic and other programs built with the tic + library. + + --with-tparm-arg[=XXX] + Override the type used for tparm() arguments, which normally is a + "long". However the function must assume that its arguments can hold a + pointer to char's which is not always workable for 64-bit platforms. A + better choice would be intptr_t, which was not available at the time + tparm's interface was defined. + + If the option is not given, this defaults to "long". + + --with-trace + Configure the trace() function as part of the all models of the ncurses + library. Normally it is part of the debug (libncurses_g) library only. + + --with-valgrind + For testing, compile with debug option. + This also sets the --disable-leaks option. + + --with-versioned-syms[=XXX] + The Solaris, GNU and reportedly some other linkers (ld) accept a + "--version-script" option which tells the linker to annotate the + resulting objects with version identifiers. + + Use "objdump -T" on a library to see the annotations. + + The configure script attempts to automatically apply a suitable ".map" + file to provide this information for Linux. Solaris mapfiles differ: + + a) comments are not accepted + b) wildcards are not accepted, except for a special case of "_*". + c) each symbol listed in the map file must exist in the library + + The Solaris limitations conflict with the development goal of providing + a small set of ".map" files as examples, which cover the most common + configurations. Because that coverage is done by merging together + several builds, some symbols will be listed in the the ".map" files + that do not happen to be present in one configuration or another. + + The sample ".map" (and ".sym") files were generated using a set of + scripts which built several configurations for each release version, + checking to see which of the "_nc_" symbols can be made local. + + These sample ".map" files will not cover all possible combinations. + In some cases, e.g., when using the --with-weak-symbols option, you + may prefer to use a different ".map" file by setting this option's + value. + + --with-wrap-prefix=XXX + When using the --enable-reentrant option, ncurses redefines variables + that would be global in curses, e.g., LINES, as a macro that calls a + "wrapping" function which fetches the data from the current SCREEN + structure. Normally that function is named by prepending "_nc_" to the + variable's name. The function is technically private (since portable + applications would not refer directly to it). But according to one + line of reasoning, it is not the same type of "private" as functions + which applications should not call even via a macro. This configure + option lets you choose the prefix for these wrapped variables. + + --with-x11-rgb=FILE + Provide a pathname for the X11 rgb file, used by the picsmap program. + This overrides a configure check which usually works, but is needed + due to the lack of standardization for X11's files. + + --with-xterm-kbs=XXX + Configure xterm's terminfo entries to use either BS (^H, i.e., ASCII + backspace) or DEL (^?, or 127). XXX can be BS (or bs, 8) or DEL + (or del, 127). If XXX is "auto", the configure script chooses BS or + DEL according to platform defaults. + + During installation, the makefile and scripts modifies the "xterm+kbs" + terminfo entry to use this setting. + + --without-ada + Suppress the configure script's check for Ada95, do not build the + Ada95 binding and related demo. + + --without-curses-h + Don't install the ncurses header with the name "curses.h". Rather, + install as "ncurses.h" and modify the installed headers and manpages + accordingly. + + Likewise, do not install an alias "curses" for the ncurses manpage. + + --without-cxx + XSI curses declares "bool" as part of the interface. C++ also declares + "bool". Neither specifies the size and type of booleans, but both + insist on the same name. We chose to accommodate this by making the + configure script check for the size and type (e.g., unsigned or signed) + that your C++ compiler uses for booleans. If you do not wish to use + ncurses with C++, use this option to tell the configure script to not + adjust ncurses bool to match C++. + + --without-cxx-binding + Suppress the configure script's check for C++, do not build the + C++ binding and related demo. + + --without-develop + Disable development options. This does not include those that change + the interface, such as --enable-widec. + + --without-dlsym + Do not use dlsym() to load GPM dynamically. + + --without-manpages + Tell the configure script to suppress the install of ncurses' manpages. + + --without-progs + Tell the configure script to suppress the build of ncurses' application + programs (e.g., tic). The test applications will still be built if you + type "make", though not if you simply do "make install". + + --without-tests + Tell the configure script to suppress the build of ncurses' test + programs. + + --without-xterm-new + Tell the configure script to use "xterm-old" for the entry used in + the terminfo database. This will work with variations such as + X11R5 and X11R6 xterm. + + +COMPATIBILITY WITH OLDER RELEASES: +--------------------------------- + + Because ncurses implements X/Open Curses, its interface is fairly stable. + That does not mean the interface does not change. Changes are made to the + documented interfaces when we find differences between ncurses and X/Open + or implementations which largely correspond to X/Open (such as Solaris). + We add extensions to those interfaces to solve problems not addressed by + the original curses design, but those must not conflict with the X/Open + documentation. + + Here are some of the major interface changes, and related problems which + you may encounter when building a system with different versions of + ncurses: + + 6.5 (Apt 27, 2024) + Interface changes: + + + the WINDOW structure and some related internal data types declared + in have been made opaque by default; + + the FORM, MENU, and PANEL structures and related internal data types + from their corresponding header files have been made opqaue by + default; and + + support for wide characters is now enabled by default. + + Added extensions: + + + is_cbreak, is_echo, is_nl, and is_raw, as well as "_sp" variants + + + tiparm_s and tiscan_s + + Added internal functions (other than "_sp" variants): + + + _nc_env_access + + Removed internal functions: + + + none + + Modified internal functions: + + + These now pass a const parameter: _nc_delink_entry, _nc_str_copy, + and _nc_trans_string + + 6.4 (Dec 31, 2022) + Interface changes: + + + none + + Added extensions: + + + none + + Added internal functions (other than "_sp" variants): + + + add _nc_free_termtype1 and _nc_free_tparm, for memory-leaks + + Removed internal functions: + + + none + + Modified internal functions: + + + none + + 6.3 (Oct 21, 2021) + Interface changes: + + + the definition of TERMTYPE2 is now internal, not visible in the ABI, + like the enclosing TERMINAL which was previously made opaque. This + was done to provide SCREEN-specific "static" variables in terminfo. + + Added extensions: + + + add sp-funcs for erasewchar, killwchar. + + Added internal functions (other than "_sp" variants): + + + _nc_safe_fopen and _nc_safe_open3 limit privileges if possible when + opening a file; otherwise disallow access for updating files. + + + _nc_tiparm is a variant of tiparm which is used when all of the + parameters are known to be numbers rather than possibly strings. + + + _nc_reset_tparm improves tic's checks by resetting the terminfo + "static variables" before calling functions which may update them. + + Removed internal functions: + + + none + + Modified internal functions: + + + _nc_trace_ttymode passes pointer to const data + + + _nc_tparm_analyze passes pointer to int*, not int[] + + 6.2 (Feb 12, 2020) + Interface changes: + + + the terminal database must be compiled with ncurses 6.2 tic; + older versions of tic/infocmp will not work. Aside from that, + the compiled database will work with older applications. + + + "*.pc" and "ncurses*-config" files give the same information. + + + vwprintw and vwscanw are deprecated. + + Added extensions: + + + These make it simpler to substitute a debug-configuration of the + library for non-debug: + curses_trace + exit_curses + exit_terminfo + + Added internal functions (other than "_sp" variants): + + + These provide fast-lookup of common user-defined capabilities: + _nc_find_user_entry + _nc_get_userdefs_table + _nc_get_hash_user + + + This is added to work around compiler-warnings: + _nc_fmt_funcptr + + Removed internal functions: + + + _nc_import_termtype + + Modified internal functions: + + + _nc_reserve_pairs no longer returns a value + + 6.1 (Jan 27, 2018) + Interface changes: + + + X/Open Curses specifies a "reserved" void* parameter in several + functions, saying that it must be NULL. In this release, if the + parameter is non-NULL, it is interpreted as a point to an integer + containing a color pair. In previous releases, a non-NULL parameter + caused an error return. Portable applications are unaffected. Here + are the functions which have been extended: + attr_get + attr_off + attr_on + attr_set + chgat + color_set + mvchgat + mvwchgat + slk_attr_off + slk_attr_on + slk_attr_set + wattr_get + wattr_on + wattr_off + wattr_set + wchgat + wcolor_set + + + the TERMINAL structure declared in has been made opaque, + and its size increased to handle the increased size of color pair + and color value, as well as other numeric capabilities. + + A few applications required change, e.g., to use def_prog_mode; + only one application (tack) is known to have a valid reason for + accessing these internal details, and that was addressed by the + release of tack 1.08 in 2017. Internal functions marked as used + by tack will be deprecated in future releases. + + Added extensions: + + + Several new functions were added to manipulate extended color pairs + and color values. These include: + alloc_pair + extended_color_content + extended_pair_content + extended_slk_color + find_pair + free_pair + init_extended_color + init_extended_pair + reset_color_pairs + + as well as corresponding sp-functions. + + + A new terminfo capability "RGB" tells the ncurses library that the + color values are red/green/blue, to eliminate the need for palettes + in that special case for the color_content function. + + Added internal functions (other than "_sp" variants): + _nc_copy_termtype2 + _nc_export_termtype2 + _nc_fallback2 + _nc_find_prescr + _nc_forget_prescr + _nc_free_termtype2 + _nc_read_entry2 + _nc_write_object + + Removed internal functions: + _nc_check_termtype + _nc_resolve_uses + + Modified internal functions: + + + symbols are used by tic/infocmp/toe: + _nc_align_termtype - change parameters to TERMTYPE2* + _nc_check_termtype2 - change parameter to TERMTYPE2* + _nc_read_file_entry - change parameter to TERMTYPE2* + _nc_read_termtype - change parameter to TERMTYPE2* + _nc_trim_sgr0 - change parameter to TERMTYPE2* + _nc_write_entry - change parameter to TERMTYPE2* + + + symbols used only within the library: + _nc_fallback - change return type to TERMTYPE2* + _nc_init_termtype - change parameter to TERMTYPE2* + + 6.0 (Aug 08, 2015) + Interface changes: + + + The 6.0 ABI modifies the defaults for these configure options: + --enable-const + --enable-ext-colors + --enable-ext-mouse + --enable-ext-putwin + --enable-interop + --enable-lp64 + --enable-sp-funcs + --with-chtype=uint32_t + --with-mmask_t=uint32_t + --with-tparm-arg=intptr_t + + + ncurses supports symbol versioning. If you use this feature, about + half of the "_nc_" private symbols are changed to local symbols. + + + a few applications may need to explicitly flush the standard output + when switching between printf's and (curses) printw. + + Added extensions: + + + use_tioctl is an improvement over use_env + + + added wgetdelay to support the NCURSES_OPAQUE feature. + + Added internal functions (other than "_sp" variants): + _nc_init_termtype + _nc_mvcur + _nc_putchar + _nc_setenv_num + _nc_trace_mmask_t + + Removed internal functions: + none + + Modified internal functions: + _nc_do_color - change parameters from short/bool to int + _nc_keypad - change parameter from bool to int + _nc_setupscreen - change parameter from bool to int + _nc_signal_handler - change parameter from bool to int + + 5.9 (Apr 04, 2011) + 5.8 (Feb 26, 2011) + Interface changes: + + + add an alternate library configuration, i.e., "terminal driver" to + support port to Windows, built with MinGW. There are two drivers + (terminfo and Windows console). The terminfo driver works on other + platforms. + + + add a new set of functions which accept a SCREEN* parameter, in + contrast with the original set which use the global value "sp". + By default, these names end with "_sp", and are otherwise + functionally identical with the originals. + + In addition to the "_sp" functions, there are a few new functions + associated with this feature: ceiling_panel, ground_panel, + new_prescr. + + If the library is not built with the sp-funcs extension, there + are no related interface changes. + + + add tiparm function based on review of X/Open Curses Issue 7. + + + change internal _nc_has_mouse function to public has_mouse function + + Added extensions: + + + add a few more functions to support the NCURSES_OPAQUE feature: + get_escdelay, is_pad, is_subwin + + Added internal functions (other than "_sp" variants): + _nc_curscr_of + _nc_format_slks + _nc_get_alias_table + _nc_get_hash_info + _nc_insert_wch + _nc_newscr_of + _nc_outc_wrapper + _nc_retrace_char + _nc_retrace_int_attr_t + _nc_retrace_mmask_t + _nc_setup_tinfo + _nc_stdscr_of + _nc_tinfo_cmdch + + Removed internal functions: + _nc_makenew (some configurations replace by _nc_makenew_sp) + + Modified internal functions: + _nc_UpdateAttrs + _nc_get_hash_table + _nc_has_mouse + _nc_insert_ch + _nc_wgetch + + 5.7 (November 2, 2008) + Interface changes: + + + generate linkable stubs for some macros: + getattrs + + + Add new library configuration for tic-library (the non-curses portion + of the ncurses library used for the tic program as well as some + others such as tack. There is no API change, but makefiles would be + changed to use the tic-library built separately. + + tack, distributed separately from ncurses, uses some of the internal + _nc_XXX functions, which are declared in the tic.h header file. + + The reason for providing this separate library is that none of the + functions in it are suitable for threaded applications. + + + Add new library configuration (ncursest, ncurseswt) which provides + rudimentary support for POSIX threads. This introduces opaque + access functions to the WINDOW structure and adds a parameter to + several internal functions. + + + move most internal variables (except tic-library) into data blocks + _nc_globals and _nc_prescreen to simplify analysis. Those were + globally accessible, but since they were not part of the documented + API, there is no ABI change. + + + changed static tables of strings to be indices into long strings, to + improve startup performance. This changes parameter lists for some + of the internal functions. + + Added extensions: + + + add NCURSES_OPAQUE definition in curses.h to control whether internal + details of the WINDOW structure are visible to an application. This + is always defined when the threaded library is built, and is optional + otherwise. New functions for this: is_cleared, is_idcok, is_idlok, + is_immedok, is_keypad, is_leaveok, is_nodelay, is_notimeout, + is_scrollok, is_syncok, wgetparent and wgetscrreg. + + + the threaded library (ncursest) also disallows direct updating of + global curses-level variables, providing functions (via macros) for + obtaining their value. A few of those variables can be modified by + the application, using new functions: set_escdelay, set_tabsize + + + added functions use_window() and use_screen() which wrap a mutex + (if threading is configured) around a call to a user-supplied + function. + + Added internal functions: + _nc_get_alias_table + _nc_get_screensize + _nc_keyname + _nc_screen_of + _nc_set_no_padding + _nc_tracechar + _nc_tracemouse + _nc_unctrl + _nc_ungetch + + These are used for leak-testing, and are stubs for + ABI compatibility when ncurses is not configured for that + using the --disable-leaks configure script option: + + _nc_free_and_exit + _nc_leaks_tinfo + + Removed internal functions: + none + + Modified internal functions: + _nc_fifo_dump + _nc_find_entry + _nc_handle_sigwinch + _nc_init_keytry + _nc_keypad + _nc_locale_breaks_acs + _nc_timed_wait + _nc_update_screensize + + Use new typedef TRIES to replace "struct tries": + + _nc_add_to_try + _nc_expand_try + _nc_remove_key + _nc_remove_string + _nc_trace_tries + + 5.6 (December 17, 2006) + Interface changes: + + + generate linkable stubs for some macros: + + getbegx, getbegy, getcurx, getcury, getmaxx, getmaxy, getparx, + getpary, getpary, + + and (for libncursesw) + + wgetbkgrnd + + Added extensions: + nofilter() + use_legacy_coding() + + Added internal functions: + _nc_first_db + _nc_get_source + _nc_handle_sigwinch + _nc_is_abs_path + _nc_is_dir_path + _nc_is_file_path + _nc_keep_tic_dir + _nc_keep_tic_dir + _nc_last_db + _nc_next_db + _nc_read_termtype + _nc_tic_dir + + Also (if using the hashed database configuration): + + _nc_db_close + _nc_db_first + _nc_db_get + _nc_db_have_data + _nc_db_have_index + _nc_db_next + _nc_db_open + _nc_db_put + + otherwise + + _nc_hashed_db + + Removed internal functions: + none + + Modified internal functions: + _nc_add_to_try + _nc_do_color + _nc_expand_try + _nc_remove_key + _nc_setupscreen + + 5.5 (October 10, 2005) + Interface changes: + + + terminfo installs "xterm-new" as "xterm" entry rather than + "xterm-old" (aka xterm-r6). + + + terminfo data is installed using the tic -x option (few systems + still use ncurses 4.2). + + + modify C++ binding to work with newer C++ compilers by providing + initializers and using modern casts. Old-style header names are + still used in this release to allow compiling with not-so-old + compilers. + + + form and menu libraries now work with wide-character data. + Applications which bypassed the form library and manipulated the + FIELD.buf data directly will not work properly with libformw, since + that no longer points to an array of char. The set_field_buffer() + and field_buffer() functions translate to/from the actual field + data. + + + change SP->_current_attr to a pointer, adjust ifdef's to ensure that + libtinfo.so and libtinfow.so have the same ABI. The reason for this + is that the corresponding data which belongs to the upper-level + ncurses library has a different size in each model. + + + winnstr() now returns multibyte character strings for the + wide-character configuration. + + + assume_default_colors() no longer requires that use_default_colors() + be called first. + + + data_ahead() now works with wide-characters. + + + slk_set() and slk_wset() now accept and store multibyte or + multicolumn characters. + + + start_color() now returns OK if colors have already been started. + start_color() also returns ERR if it cannot allocate memory. + + + pair_content() now returns -1 for consistency with init_pair() if it + corresponds to the default-color. + + + unctrl() now returns null if its parameter does not correspond + to an unsigned char. + + Added extensions: + Experimental mouse version 2 supports wheel mice with buttons + 4 and 5. This requires ABI 6 because it modifies the encoding + of mouse events. + + Experimental extended colors allows encoding of 256 foreground + and background colors, e.g., with the xterm-256color or + xterm-88color terminfo entries. This requires ABI 6 because + it changes the size of cchar_t. + + Added internal functions: + _nc_check_termtype2 + _nc_resolve_uses2 + _nc_retrace_cptr + _nc_retrace_cvoid_ptr + _nc_retrace_void_ptr + _nc_setup_term + + Removed internal functions: + none + + Modified internal functions: + _nc_insert_ch + _nc_save_str + _nc_trans_string + + 5.4 (February 8, 2004) + Interface changes: + + + add the remaining functions for X/Open curses wide-character support. + These are only available if the library is configured using the + --enable-widec option. + pecho_wchar() + slk_wset() + + + write getyx() and related 2-return macros in terms of getcury(), + getcurx(), etc. + + + simplify ifdef for bool declaration in curses.h + + + modify ifdef's in curses.h that disabled use of __attribute__() for + g++, since recent versions implement the cases which ncurses uses. + + + change some interfaces to use const: + define_key() + mvprintw() + mvwprintw() + printw() + vw_printw() + winsnstr() + wprintw() + + Added extensions: + key_defined() + + Added internal functions: + _nc_get_locale() + _nc_insert_ch() + _nc_is_charable() wide + _nc_locale_breaks_acs() + _nc_pathlast() + _nc_to_char() wide + _nc_to_widechar() wide + _nc_tparm_analyze() + _nc_trace_bufcat() debug + _nc_unicode_locale() + + Removed internal functions: + _nc_outstr() + _nc_sigaction() + + Modified internal functions: + _nc_remove_string() + _nc_retrace_chtype() + + 5.3 (October 12, 2002) + Interface changes: + + + change type for bool used in headers to NCURSES_BOOL, which usually + is the same as the compiler's definition for 'bool'. + + + add all but two functions for X/Open curses wide-character support. + These are only available if the library is configured using the + --enable-widec option. Missing functions are + pecho_wchar() + slk_wset() + + + add environment variable $NCURSES_ASSUMED_COLORS to modify the + assume_default_colors() extension. + + Added extensions: + is_term_resized() + resize_term() + + Added internal functions: + _nc_altcharset_name() debug + _nc_reset_colors() + _nc_retrace_bool() debug + _nc_retrace_unsigned() debug + _nc_rootname() + _nc_trace_ttymode() debug + _nc_varargs() debug + _nc_visbufn() debug + _nc_wgetch() + + Removed internal functions: + _nc_background() + + Modified internal functions: + _nc_freeall() debug + + 5.2 (October 21, 2000) + Interface changes: + + + revert termcap ospeed variable to 'short' (see discussion of the + --with-ospeed configure option). + + 5.1 (July 8, 2000) + Interface changes: + + + made the extended terminal capabilities + (configure --enable-tcap-names) a standard feature. This should + be transparent to applications that do not require it. + + + removed the trace() function and related trace support from the + production library. + + + modified curses.h.in, undef'ing some symbols to avoid conflict + with C++ STL. + + Added extensions: assume_default_colors(). + + 5.0 (October 23, 1999) + Interface changes: + + + implemented the wcolor_set() and slk_color() functions. + + + move macro winch to a function, to hide details of struct ldat + + + corrected prototypes for slk_* functions, using chtype rather than + attr_t. + + + the slk_attr_{set,off,on} functions need an additional void* + parameter according to XSI. + + + modified several prototypes to correspond with 1997 version of X/Open + Curses: [w]attr_get(), [w]attr_set(), border_set() have different + parameters. Some functions were renamed or misspelled: + erase_wchar(), in_wchntr(), mvin_wchntr(). Some developers have used + attr_get(). + + Added extensions: keybound(), curses_version(). + + Terminfo database changes: + + + change translation for termcap 'rs' to terminfo 'rs2', which is + the documented equivalent, rather than 'rs1'. + + The problems are subtler in recent releases. + + a) This release provides users with the ability to define their own + terminal capability extensions, like termcap. To accomplish this, + we redesigned the TERMTYPE struct (in term.h). Very few + applications use this struct. They must be recompiled to work with + the 5.0 library. + + a) If you use the extended terminfo names (i.e., you used configure + --enable-tcap-names), the resulting terminfo database can have some + entries which are not readable by older versions of ncurses. This + is a bug in the older versions: + + + the terminfo database stores booleans, numbers and strings in + arrays. The capabilities that are listed in the arrays are + specified by X/Open. ncurses recognizes a number of obsolete and + extended names which are stored past the end of the specified + entries. + + + a change to read_entry.c in 951001 made the library do an lseek() + call incorrectly skipping data which is already read from the + string array. This happens when the number of strings in the + terminfo data file is greater than STRCOUNT, the number of + specified and obsolete or extended strings. + + + as part of alignment with the X/Open final specification, in the + 990109 patch we added two new terminfo capabilities: + set_a_attributes and set_pglen_inch). This makes the indices for + the obsolete and extended capabilities shift up by 2. + + + the last two capabilities in the obsolete/extended list are memu + and meml, which are found in most terminfo descriptions for xterm. + + When trying to read this terminfo entry, the spurious lseek() + causes the library to attempt to read the final portion of the + terminfo data (the text of the string capabilities) 4 characters + past its starting point, and reads 4 characters too few. The + library rejects the data, and applications are unable to + initialize that terminal type. + + FIX: remove memu and meml from the xterm description. They are + obsolete, not used by ncurses. (It appears that the feature was + added to xterm to make it more like hpterm). + + This is not a problem if you do not use the -x option of tic to + create a terminfo database with extended names. Note that the + user-defined terminal capabilities are not affected by this bug, + since they are stored in a table after the older terminfo data ends, + and are invisible to the older libraries. + + c) Some developers did not wish to use the C++ binding, and used the + configure --without-cxx option. This causes problems if someone + uses the ncurses library from C++ because that configure test + determines the type for C++'s bool and makes ncurses match it, since + both C++ and curses are specified to declare bool. Calling ncurses + functions with the incorrect type for bool will cause execution + errors. In 5.0 we added a configure option "--without-cxx-binding" + which controls whether the binding itself is built and installed. + + 4.2 (March 2, 1998) + Interface changes: + + + correct prototype for termattrs() as per XPG4 version 2. + + + add placeholder prototypes for color_set(), erasewchar(), + term_attrs(), wcolor_set() as per XPG4 version 2. + + + add macros getcur[xy] getbeg[xy] getpar[xy], which are defined in + SVr4 headers. + + New extensions: keyok() and define_key(). + + Terminfo database changes: + + + corrected definition in curses.h for ACS_LANTERN, which was 'I' + rather than 'i'. + + 4.1 (May 15, 1997) + + We added these extensions: use_default_colors(). Also added + configure option --enable-const, to support the use of const where + X/Open should have, but did not, specify. + + The terminfo database content changed the representation of color for + most entries that use ANSI colors. SVr4 curses treats the setaf/setab + and setf/setb capabilities differently, interchanging the red/blue + colors in the latter. + + 4.0 (December 24, 1996) + + We bumped to version 4.0 because the newly released Linux dynamic + loader (ld.so.1.8.5) did not load shared libraries whose ABI and REL + versions were inconsistent. At that point, ncurses ABI was 3.4 and the + REL was 1.9.9g, so we made them consistent. + + 1.9.9g (December 1, 1996) + + This fixed most of the problems with 1.9.9e, and made these interface + changes: + + + remove tparam(), which had been provided for compatibility with + some termcap. tparm() is standard, and does not conflict with + application's fallback for missing tparam(). + + + turn off hardware echo in initscr(). This changes the sense of the + echo() function, which was initialized to echoing rather than + nonechoing (the latter is specified). There were several other + corrections to the terminal I/O settings which cause applications to + behave differently. + + + implemented several functions (such as attr_on()) which were + available only as macros. + + + corrected several typos in curses.h.in (i.e., the mvXXXX macros). + + + corrected prototypes for delay_output(), + has_color, immedok() and idcok(). + + + corrected misspelled getbkgd(). Some applications used the + misspelled name. + + + added _yoffset to WINDOW. The size of WINDOW does not impact + applications, since they use only pointers to WINDOW structs. + + These changes were made to the terminfo database: + + + removed boolean 'getm' which was available as an extended name. + + We added these extensions: wresize(), resizeterm(), has_key() and + mcprint(). + + 1.9.9e (March 24, 1996) + + not recommended (a last-minute/untested change left the forms and + menus libraries unusable since they do not repaint the screen). + Foreground/background colors are combined incorrectly, working properly + only on a black background. When this was released, the X/Open + specification was available only in draft form. + + Some applications (such as lxdialog) were "fixed" to work with the + incorrect color scheme. + + +FOR SYSTEM INTEGRATORS: +---------------------- + + Configuration and Installation: + + On platforms where ncurses is assumed to be installed in /usr/lib, + the configure script uses "/usr" as a default. These include any + that use the Linux kernel, as well as these special cases: + + FreeBSD, NetBSD, OpenBSD, Cygwin, MinGW + + For other platforms, the default is "/usr/local". See the discussion + of the "--disable-overwrite" option. + + The location of the terminfo is set indirectly by the "--datadir" + configure option, e.g., /usr/share/terminfo, given a datadir of + /usr/share. You may want to override this if you are installing + ncurses libraries in nonstandard locations, but wish to share the + terminfo database. + + Normally the ncurses library is configured in a pure-terminfo mode; + that is, with the --disable-termcap option. This makes the ncurses + library smaller and faster. The ncurses library includes a termcap + emulation that queries the terminfo database, so even applications that + use raw termcap to query terminal characteristics will win (providing + you recompile and relink them!). + + If you must configure with termcap fallback enabled, you may also wish + to use the --enable-getcap option. This speeds up termcap-based + startups, at the expense of not allowing personal termcap entries to + reference the terminfo tree. See comments in + ncurses/tinfo/read_termcap.c for further details. + + Note that if you have $TERMCAP set, ncurses will use that value + to locate termcap data. In particular, running from xterm will + set $TERMCAP to the contents of the xterm's termcap entry. + If ncurses sees that, it will not examine /etc/termcap. + + Keyboard Mapping: + + The terminfo file assumes that Shift-Tab generates \E[Z (the ECMA-48 + reverse-tabulation sequence) rather than ^I. Here are the loadkeys -d + mappings that will set this up: + + keycode 15 = Tab Tab + alt keycode 15 = Meta_Tab + shift keycode 15 = F26 + string F26 ="\033[Z" + + Naming the Console Terminal + + In various systems there has been a practice of designating the system + console driver type as 'console'. Please do not do this! It + complicates peoples' lives, because it can mean that several different + terminfo entries from different operating systems all logically want to + be called 'console'. + + Please pick a name unique to your console driver and set that up + in the /etc/inittab table or local equivalent. Send the entry to the + terminfo maintainer (listed in the misc/terminfo file) to be included + in the terminfo file, if it is not already there. See the + term(7) manual page included with this distribution for more on + conventions for choosing type names. + + Here are some recommended primary console names: + + linux -- Linux console driver + freebsd -- FreeBSD + netbsd -- NetBSD + bsdos -- BSD/OS + + If you are responsible for integrating ncurses for one of these + distributions, please either use the recommended name or get back + to us explaining why you don't want to, so we can work out nomenclature + that will make users' lives easier rather than harder. + + +MODERN XTERM VERSIONS: +--------------------- + + The terminfo database file included with this distribution assumes you + are running a modern xterm based on XFree86 (i.e., xterm-new). The + earlier X11R6 entry (xterm-r6) and X11R5 entry (xterm-r5) is provided + as well. See the --without-xterm-new configure script option if you + are unable to update your system. + + +CONFIGURING FALLBACK ENTRIES: +---------------------------- + + In order to support operation of ncurses programs before the terminfo + tree is accessible (that is, in single-user mode or at OS installation + time) the ncurses library can be compiled to include an array of + pre-fetched fallback entries. + + NOTE: This must be done on a machine which has ncurses' infocmp and + terminfo database installed (as well as ncurses' tic and infocmp + programs). That is because the fallback sources are generated and + compiled into the library before the build-tree's copy of infocmp is + available. + + These entries are checked by setupterm() only when the conventional + fetches from the terminfo tree and the termcap fallback (if configured) + have been tried and failed. Thus, the presence of a fallback will not + shadow modifications to the on-disk entry for the same type, when that + entry is accessible. + + By default, there are no entries on the fallback list. After you have + built the ncurses suite for the first time, you can change the list + (the process needs infocmp(1)). To do so, use the script + ncurses/tinfo/MKfallback.sh. The configure script option + --with-fallbacks does this (it accepts a comma-separated list of the + names you wish, and does not require a rebuild). + + If you wanted (say) to have linux, vt100, and xterm fallbacks, you + might use the commands + + cd ncurses; + tinfo/MKfallback.sh \ + $TERMINFO \ + ../misc/terminfo.src \ + `which tic` \ + `which infocmp` \ + linux vt100 xterm >fallback.c + + The first four parameters of the script are normally supplied by + the configured makefiles via the "--with-fallbacks" option. They + are + + 1) the location of the terminfo database + 2) the source for the terminfo entries + 3) the location of the tic program, used to create a terminfo + database. + 4) the location of the infocmp program, used to print a terminfo + description. + + Then just rebuild and reinstall the library as you would normally. + You can restore the default empty fallback list with + + tinfo/MKfallback.sh \ + $TERMINFO \ + ../misc/terminfo.src \ + `which tic` \ + `which infocmp` \ + >fallback.c + + The overhead for an empty fallback list is one trivial stub function. + Any non-empty fallback list is const'd and therefore lives in shareable + text space. You can look at the comment trailing each initializer in + the generated ncurses/fallback.c file to see the core cost of the + fallbacks. A good rule of thumb for modern vt100-like entries is that + each one will cost about 2.5K of text space. + + +BSD CONVERSION NOTES: +-------------------- + + If you need to support really ancient BSD programs, you probably + want to configure with the --enable-bsdpad option. What this does + is enable code in tputs() that recognizes a numeric prefix on a + capability as a request for that much trailing padding in milliseconds. + There are old BSD programs that do things like tputs("50"). + + (If you are distributing ncurses as a support-library component of + an application you probably want to put the remainder of this section + in the package README file.) + + The following note applies only if you have configured ncurses with + --enable-termcap. + +------------------------------- CUT HERE -------------------------------- + +If you are installing this application privately (either because you +have no root access or want to experiment with it before doing a root +installation), there are a couple of details you need to be aware of. +They have to do with the ncurses library, which uses terminfo rather +than termcap for describing terminal characteristics. + +Though the ncurses library is terminfo-based, it can interpret your +TERMCAP variable (if present), any local termcap files you reference +through it, and the system termcap file. However, to avoid slowing +down your application startup, it does this only once per terminal type! + +The first time you load a given terminal type from your termcap +database, the library initialization code will automatically write it +in terminfo format to a subdirectory under $HOME/.terminfo. After +that, the initialization code will find it there and do a (much +faster) terminfo fetch. + +Usually, all this means is that your home directory will silently grow +an invisible .terminfo subdirectory which will get filled in with +terminfo descriptions of terminal types as you invoke them. If anyone +ever installs a global terminfo tree on your system, this will quietly +stop happening and your $HOME/.terminfo will become redundant. + +The objective of all this logic is to make converting from BSD termcap +as painless as possible without slowing down your application (termcap +compilation is expensive). + +If you don't have a TERMCAP variable or custom personal termcap file, +you can skip the rest of this dissertation. + +If you *do* have a TERMCAP variable and/or a custom personal termcap file +that defines a terminal type, that definition will stop being visible +to this application after the first time you run it, because it will +instead see the terminfo entry that it wrote to $HOME/terminfo the +first time around. + +Subsequently, editing the TERMCAP variable or personal TERMCAP file +will have no effect unless you explicitly remove the terminfo entry +under $HOME/terminfo. If you do that, the entry will be recompiled +from your termcap resources the next time it is invoked. + +To avoid these complications, use infocmp(1) and tic(1) to edit the +terminfo directory directly. + +------------------------------- CUT HERE -------------------------------- + +USING GPM: +--------- + Ncurses 4.1 and up can be configured to use GPM (General Purpose Mouse) + which is used with Linux console. Be aware that GPM is commonly + installed as a shared library which contains a wrapper for the curses + wgetch() function (libcurses.o). Some integrators have simplified + linking applications by combining all or part of libcurses.so into the + libgpm.so file, producing symbol conflicts with ncurses (specifically + the wgetch function). This was originally the BSD curses, but + generally whatever curses library exists on the system. + + You may be able to work around this problem by linking as follows: + + cc -o foo foo.o -lncurses -lgpm -lncurses + + but the linker may not cooperate, producing mysterious errors. + See the FAQ, as well as the discussion under the --with-gpm option: + + https://invisible-island.net/ncurses/ncurses.faq.html#using_gpm_lib + + +BUILDING WITH A CROSS-COMPILER: +------------------------------ + Ncurses can be built with a cross-compiler. Some parts must be built + with the host's compiler since they are used for building programs + (e.g., ncurses/make_hash and ncurses/make_keys) that generate tables + that are compiled into the ncurses library. The essential thing to do + is set the BUILD_CC environment variable to your host's compiler, and + run the configure script configuring for the cross-compiler. + + The configure options --with-build-cc, etc., are provided to make this + simpler. Since make_hash and make_keys use only ANSI C features, it + is normally not necessary to provide the other options such as + --with-build-libs, but they are provided for completeness. + + Note that all of the generated source-files which are part of ncurses + will be made if you use + + make sources + + This would be useful in porting to an environment which has little + support for the tools used to generate the sources, e.g., sed, awk and + Bourne-shell. + + When ncurses has been successfully cross-compiled, you may want to use + "make install" (with a suitable target directory) to construct an + install tree. Note that in this case (as with the --with-fallbacks + option), ncurses uses the development platform's tic to do the "make + install.data" portion. + + The system's tic program is used to install the terminal database, + even for cross-compiles. For best results, the tic program should be + from the most current version of ncurses. + + NOTE: the system's tic program may use a different terminfo database + format than the target system. For instance, as described in term(5), + the conventional terminfo layout uses a directory hierarchy with one + letter names, while some platforms use two-letter names to work with + case-insensitive filesystems. The configure script searches for a tic + program using the AC_CHECK_TOOL macro, which will prefer programs + using the canonical host prefix in their name. You can use this fact + to provide a cross-compiler support utility tic, otherwise you can + override the configure script's choice using --with-tic-path + + +BUG REPORTS: +----------- + Send any feedback to the ncurses mailing list at + bug-ncurses@gnu.org. To subscribe send mail to + bug-ncurses-request@gnu.org with body that reads: + subscribe ncurses + + The Hacker's Guide in the doc directory includes some guidelines + on how to report bugs in ways that will get them fixed most quickly. + +-- vile:txtmode fc=78 diff --git a/contrib/ncurses/MANIFEST b/contrib/ncurses/MANIFEST new file mode 100644 index 00000000..9e506b48 --- /dev/null +++ b/contrib/ncurses/MANIFEST @@ -0,0 +1,1250 @@ +./ANNOUNCE +./AUTHORS +./Ada95/Makefile.in +./Ada95/README +./Ada95/TODO +./Ada95/aclocal.m4 +./Ada95/configure +./Ada95/configure.in +./Ada95/doc/Makefile.in +./Ada95/gen/Makefile.in +./Ada95/gen/adacurses-config.in +./Ada95/gen/gen.c +./Ada95/gen/html.m4 +./Ada95/gen/normal.m4 +./Ada95/gen/table.m4 +./Ada95/gen/terminal_interface-curses-aux.ads.m4 +./Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 +./Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 +./Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 +./Ada95/gen/terminal_interface-curses-forms.ads.m4 +./Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 +./Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 +./Ada95/gen/terminal_interface-curses-menus.ads.m4 +./Ada95/gen/terminal_interface-curses-mouse.ads.m4 +./Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 +./Ada95/gen/terminal_interface-curses-panels.ads.m4 +./Ada95/gen/terminal_interface-curses-trace.ads.m4 +./Ada95/gen/terminal_interface-curses.adb.m4 +./Ada95/gen/terminal_interface-curses.ads.m4 +./Ada95/include/MKncurses_def.sh +./Ada95/include/Makefile.in +./Ada95/include/ncurses_cfg.hin +./Ada95/include/ncurses_defs +./Ada95/make-tar.sh +./Ada95/mk-1st.awk +./Ada95/mk-pkg.awk +./Ada95/package/AdaCurses-doc.spec +./Ada95/package/AdaCurses.spec +./Ada95/package/debian/compat +./Ada95/package/debian/control +./Ada95/package/debian/copyright +./Ada95/package/debian/docs +./Ada95/package/debian/rules +./Ada95/package/debian/source/format +./Ada95/package/debian/watch +./Ada95/samples/Makefile.in +./Ada95/samples/README +./Ada95/samples/explain.txt +./Ada95/samples/ncurses.adb +./Ada95/samples/ncurses2-acs_and_scroll.adb +./Ada95/samples/ncurses2-acs_and_scroll.ads +./Ada95/samples/ncurses2-acs_display.adb +./Ada95/samples/ncurses2-acs_display.ads +./Ada95/samples/ncurses2-attr_test.adb +./Ada95/samples/ncurses2-attr_test.ads +./Ada95/samples/ncurses2-color_edit.adb +./Ada95/samples/ncurses2-color_edit.ads +./Ada95/samples/ncurses2-color_test.adb +./Ada95/samples/ncurses2-color_test.ads +./Ada95/samples/ncurses2-demo_forms.adb +./Ada95/samples/ncurses2-demo_forms.ads +./Ada95/samples/ncurses2-demo_pad.adb +./Ada95/samples/ncurses2-demo_pad.ads +./Ada95/samples/ncurses2-demo_panels.adb +./Ada95/samples/ncurses2-demo_panels.ads +./Ada95/samples/ncurses2-flushinp_test.adb +./Ada95/samples/ncurses2-flushinp_test.ads +./Ada95/samples/ncurses2-genericputs.adb +./Ada95/samples/ncurses2-genericputs.ads +./Ada95/samples/ncurses2-getch.ads +./Ada95/samples/ncurses2-getch_test.adb +./Ada95/samples/ncurses2-getch_test.ads +./Ada95/samples/ncurses2-getopt.adb +./Ada95/samples/ncurses2-getopt.ads +./Ada95/samples/ncurses2-m.adb +./Ada95/samples/ncurses2-m.ads +./Ada95/samples/ncurses2-menu_test.adb +./Ada95/samples/ncurses2-menu_test.ads +./Ada95/samples/ncurses2-overlap_test.adb +./Ada95/samples/ncurses2-overlap_test.ads +./Ada95/samples/ncurses2-slk_test.adb +./Ada95/samples/ncurses2-slk_test.ads +./Ada95/samples/ncurses2-test_sgr_attributes.adb +./Ada95/samples/ncurses2-test_sgr_attributes.ads +./Ada95/samples/ncurses2-trace_set.adb +./Ada95/samples/ncurses2-trace_set.ads +./Ada95/samples/ncurses2-util.adb +./Ada95/samples/ncurses2-util.ads +./Ada95/samples/ncurses2.ads +./Ada95/samples/rain.adb +./Ada95/samples/rain.ads +./Ada95/samples/sample-curses_demo-attributes.adb +./Ada95/samples/sample-curses_demo-attributes.ads +./Ada95/samples/sample-curses_demo-mouse.adb +./Ada95/samples/sample-curses_demo-mouse.ads +./Ada95/samples/sample-curses_demo.adb +./Ada95/samples/sample-curses_demo.ads +./Ada95/samples/sample-explanation.adb_p +./Ada95/samples/sample-explanation.ads +./Ada95/samples/sample-form_demo-aux.adb +./Ada95/samples/sample-form_demo-aux.ads +./Ada95/samples/sample-form_demo-handler.adb +./Ada95/samples/sample-form_demo-handler.ads +./Ada95/samples/sample-form_demo.adb +./Ada95/samples/sample-form_demo.ads +./Ada95/samples/sample-function_key_setting.adb +./Ada95/samples/sample-function_key_setting.ads +./Ada95/samples/sample-header_handler.adb +./Ada95/samples/sample-header_handler.ads +./Ada95/samples/sample-helpers.adb +./Ada95/samples/sample-helpers.ads +./Ada95/samples/sample-keyboard_handler.adb +./Ada95/samples/sample-keyboard_handler.ads +./Ada95/samples/sample-manifest.ads +./Ada95/samples/sample-menu_demo-aux.adb +./Ada95/samples/sample-menu_demo-aux.ads +./Ada95/samples/sample-menu_demo-handler.adb +./Ada95/samples/sample-menu_demo-handler.ads +./Ada95/samples/sample-menu_demo.adb +./Ada95/samples/sample-menu_demo.ads +./Ada95/samples/sample-my_field_type.adb +./Ada95/samples/sample-my_field_type.ads +./Ada95/samples/sample-text_io_demo.adb +./Ada95/samples/sample-text_io_demo.ads +./Ada95/samples/sample.adb +./Ada95/samples/sample.ads +./Ada95/samples/split-path.awk +./Ada95/samples/status.adb +./Ada95/samples/status.ads +./Ada95/samples/tour.adb +./Ada95/samples/tour.ads +./Ada95/src/Makefile.in +./Ada95/src/c_threaded_variables.c +./Ada95/src/c_threaded_variables.h +./Ada95/src/c_varargs_to_ada.c +./Ada95/src/c_varargs_to_ada.h +./Ada95/src/library-cfg.sh +./Ada95/src/library.gpr.in +./Ada95/src/modules +./Ada95/src/ncurses_compat.c +./Ada95/src/terminal_interface-curses-aux.adb +./Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb +./Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads +./Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb +./Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads +./Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb +./Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads +./Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb +./Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads +./Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb +./Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads +./Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb +./Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads +./Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb +./Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads +./Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb +./Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads +./Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb +./Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads +./Ada95/src/terminal_interface-curses-forms-field_types-user.adb +./Ada95/src/terminal_interface-curses-forms-field_types-user.ads +./Ada95/src/terminal_interface-curses-forms-field_types.adb +./Ada95/src/terminal_interface-curses-forms-field_user_data.adb +./Ada95/src/terminal_interface-curses-forms-form_user_data.adb +./Ada95/src/terminal_interface-curses-forms.adb +./Ada95/src/terminal_interface-curses-menus-item_user_data.adb +./Ada95/src/terminal_interface-curses-menus-menu_user_data.adb +./Ada95/src/terminal_interface-curses-menus.adb +./Ada95/src/terminal_interface-curses-mouse.adb +./Ada95/src/terminal_interface-curses-panels-user_data.adb +./Ada95/src/terminal_interface-curses-panels.adb +./Ada95/src/terminal_interface-curses-putwin.adb +./Ada95/src/terminal_interface-curses-putwin.ads +./Ada95/src/terminal_interface-curses-termcap.adb +./Ada95/src/terminal_interface-curses-termcap.ads +./Ada95/src/terminal_interface-curses-terminfo.adb +./Ada95/src/terminal_interface-curses-terminfo.ads +./Ada95/src/terminal_interface-curses-text_io-aux.adb +./Ada95/src/terminal_interface-curses-text_io-aux.ads +./Ada95/src/terminal_interface-curses-text_io-complex_io.adb +./Ada95/src/terminal_interface-curses-text_io-complex_io.ads +./Ada95/src/terminal_interface-curses-text_io-decimal_io.adb +./Ada95/src/terminal_interface-curses-text_io-decimal_io.ads +./Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb +./Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads +./Ada95/src/terminal_interface-curses-text_io-fixed_io.adb +./Ada95/src/terminal_interface-curses-text_io-fixed_io.ads +./Ada95/src/terminal_interface-curses-text_io-float_io.adb +./Ada95/src/terminal_interface-curses-text_io-float_io.ads +./Ada95/src/terminal_interface-curses-text_io-integer_io.adb +./Ada95/src/terminal_interface-curses-text_io-integer_io.ads +./Ada95/src/terminal_interface-curses-text_io-modular_io.adb +./Ada95/src/terminal_interface-curses-text_io-modular_io.ads +./Ada95/src/terminal_interface-curses-text_io.adb +./Ada95/src/terminal_interface-curses-text_io.ads +./Ada95/src/terminal_interface-curses-trace.adb_p +./Ada95/src/terminal_interface.ads +./COPYING +./INSTALL +./MANIFEST +./Makefile.in +./Makefile.os2 +./NEWS +./README +./README.MinGW +./README.emx +./TO-DO +./VERSION +./aclocal.m4 +./announce.html.in +./c++/Makefile.in +./c++/NEWS +./c++/PROBLEMS +./c++/README-first +./c++/cursesapp.cc +./c++/cursesapp.h +./c++/cursesf.cc +./c++/cursesf.h +./c++/cursesm.cc +./c++/cursesm.h +./c++/cursesmain.cc +./c++/cursesp.cc +./c++/cursesp.h +./c++/cursespad.cc +./c++/cursesw.cc +./c++/cursesw.h +./c++/cursslk.cc +./c++/cursslk.h +./c++/demo.cc +./c++/edit_cfg.sh +./c++/etip.h.in +./c++/headers +./c++/internal.h +./c++/modules +./config.guess +./config.sub +./configure +./configure.in +./dist.mk +./doc/hackguide.doc +./doc/html/Ada95.html +./doc/html/NCURSES-Programming-HOWTO.html +./doc/html/ada/files.htm +./doc/html/ada/files/T.htm +./doc/html/ada/funcs.htm +./doc/html/ada/funcs/A.htm +./doc/html/ada/funcs/B.htm +./doc/html/ada/funcs/C.htm +./doc/html/ada/funcs/D.htm +./doc/html/ada/funcs/E.htm +./doc/html/ada/funcs/F.htm +./doc/html/ada/funcs/G.htm +./doc/html/ada/funcs/H.htm +./doc/html/ada/funcs/I.htm +./doc/html/ada/funcs/K.htm +./doc/html/ada/funcs/L.htm +./doc/html/ada/funcs/M.htm +./doc/html/ada/funcs/N.htm +./doc/html/ada/funcs/O.htm +./doc/html/ada/funcs/P.htm +./doc/html/ada/funcs/Q.htm +./doc/html/ada/funcs/R.htm +./doc/html/ada/funcs/S.htm +./doc/html/ada/funcs/T.htm +./doc/html/ada/funcs/U.htm +./doc/html/ada/funcs/V.htm +./doc/html/ada/funcs/W.htm +./doc/html/ada/index.htm +./doc/html/ada/main.htm +./doc/html/ada/table.html +./doc/html/ada/terminal_interface-curses-aux__adb.htm +./doc/html/ada/terminal_interface-curses-aux__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm +./doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm +./doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm +./doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm +./doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm +./doc/html/ada/terminal_interface-curses-forms__adb.htm +./doc/html/ada/terminal_interface-curses-forms__ads.htm +./doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm +./doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm +./doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm +./doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm +./doc/html/ada/terminal_interface-curses-menus__adb.htm +./doc/html/ada/terminal_interface-curses-menus__ads.htm +./doc/html/ada/terminal_interface-curses-mouse__adb.htm +./doc/html/ada/terminal_interface-curses-mouse__ads.htm +./doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm +./doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm +./doc/html/ada/terminal_interface-curses-panels__adb.htm +./doc/html/ada/terminal_interface-curses-panels__ads.htm +./doc/html/ada/terminal_interface-curses-putwin__adb.htm +./doc/html/ada/terminal_interface-curses-putwin__ads.htm +./doc/html/ada/terminal_interface-curses-termcap__adb.htm +./doc/html/ada/terminal_interface-curses-termcap__ads.htm +./doc/html/ada/terminal_interface-curses-terminfo__adb.htm +./doc/html/ada/terminal_interface-curses-terminfo__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm +./doc/html/ada/terminal_interface-curses-text_io__adb.htm +./doc/html/ada/terminal_interface-curses-text_io__ads.htm +./doc/html/ada/terminal_interface-curses-trace__adb.htm +./doc/html/ada/terminal_interface-curses-trace__ads.htm +./doc/html/ada/terminal_interface-curses__adb.htm +./doc/html/ada/terminal_interface-curses__ads.htm +./doc/html/ada/terminal_interface-curses_constants__ads.htm +./doc/html/ada/terminal_interface__ads.htm +./doc/html/announce.html +./doc/html/hackguide.html +./doc/html/index.html +./doc/html/man/adacursesw6-config.1.html +./doc/html/man/captoinfo.1m.html +./doc/html/man/clear.1.html +./doc/html/man/curs_add_wch.3x.html +./doc/html/man/curs_add_wchstr.3x.html +./doc/html/man/curs_addch.3x.html +./doc/html/man/curs_addchstr.3x.html +./doc/html/man/curs_addstr.3x.html +./doc/html/man/curs_addwstr.3x.html +./doc/html/man/curs_attr.3x.html +./doc/html/man/curs_beep.3x.html +./doc/html/man/curs_bkgd.3x.html +./doc/html/man/curs_bkgrnd.3x.html +./doc/html/man/curs_border.3x.html +./doc/html/man/curs_border_set.3x.html +./doc/html/man/curs_clear.3x.html +./doc/html/man/curs_color.3x.html +./doc/html/man/curs_delch.3x.html +./doc/html/man/curs_deleteln.3x.html +./doc/html/man/curs_extend.3x.html +./doc/html/man/curs_get_wch.3x.html +./doc/html/man/curs_get_wstr.3x.html +./doc/html/man/curs_getcchar.3x.html +./doc/html/man/curs_getch.3x.html +./doc/html/man/curs_getstr.3x.html +./doc/html/man/curs_getyx.3x.html +./doc/html/man/curs_in_wch.3x.html +./doc/html/man/curs_in_wchstr.3x.html +./doc/html/man/curs_inch.3x.html +./doc/html/man/curs_inchstr.3x.html +./doc/html/man/curs_initscr.3x.html +./doc/html/man/curs_inopts.3x.html +./doc/html/man/curs_ins_wch.3x.html +./doc/html/man/curs_ins_wstr.3x.html +./doc/html/man/curs_insch.3x.html +./doc/html/man/curs_insstr.3x.html +./doc/html/man/curs_instr.3x.html +./doc/html/man/curs_inwstr.3x.html +./doc/html/man/curs_kernel.3x.html +./doc/html/man/curs_legacy.3x.html +./doc/html/man/curs_memleaks.3x.html +./doc/html/man/curs_mouse.3x.html +./doc/html/man/curs_move.3x.html +./doc/html/man/curs_opaque.3x.html +./doc/html/man/curs_outopts.3x.html +./doc/html/man/curs_overlay.3x.html +./doc/html/man/curs_pad.3x.html +./doc/html/man/curs_print.3x.html +./doc/html/man/curs_printw.3x.html +./doc/html/man/curs_refresh.3x.html +./doc/html/man/curs_scanw.3x.html +./doc/html/man/curs_scr_dump.3x.html +./doc/html/man/curs_scroll.3x.html +./doc/html/man/curs_slk.3x.html +./doc/html/man/curs_sp_funcs.3x.html +./doc/html/man/curs_termattrs.3x.html +./doc/html/man/curs_termcap.3x.html +./doc/html/man/curs_terminfo.3x.html +./doc/html/man/curs_threads.3x.html +./doc/html/man/curs_touch.3x.html +./doc/html/man/curs_trace.3x.html +./doc/html/man/curs_util.3x.html +./doc/html/man/curs_variables.3x.html +./doc/html/man/curs_window.3x.html +./doc/html/man/default_colors.3x.html +./doc/html/man/define_key.3x.html +./doc/html/man/form.3x.html +./doc/html/man/form_cursor.3x.html +./doc/html/man/form_data.3x.html +./doc/html/man/form_driver.3x.html +./doc/html/man/form_field.3x.html +./doc/html/man/form_field_attributes.3x.html +./doc/html/man/form_field_buffer.3x.html +./doc/html/man/form_field_info.3x.html +./doc/html/man/form_field_just.3x.html +./doc/html/man/form_field_new.3x.html +./doc/html/man/form_field_opts.3x.html +./doc/html/man/form_field_userptr.3x.html +./doc/html/man/form_field_validation.3x.html +./doc/html/man/form_fieldtype.3x.html +./doc/html/man/form_hook.3x.html +./doc/html/man/form_new.3x.html +./doc/html/man/form_new_page.3x.html +./doc/html/man/form_opts.3x.html +./doc/html/man/form_page.3x.html +./doc/html/man/form_post.3x.html +./doc/html/man/form_requestname.3x.html +./doc/html/man/form_userptr.3x.html +./doc/html/man/form_variables.3x.html +./doc/html/man/form_win.3x.html +./doc/html/man/index.html +./doc/html/man/infocmp.1m.html +./doc/html/man/infotocap.1m.html +./doc/html/man/key_defined.3x.html +./doc/html/man/keybound.3x.html +./doc/html/man/keyok.3x.html +./doc/html/man/legacy_coding.3x.html +./doc/html/man/menu.3x.html +./doc/html/man/menu_attributes.3x.html +./doc/html/man/menu_cursor.3x.html +./doc/html/man/menu_driver.3x.html +./doc/html/man/menu_format.3x.html +./doc/html/man/menu_hook.3x.html +./doc/html/man/menu_items.3x.html +./doc/html/man/menu_mark.3x.html +./doc/html/man/menu_new.3x.html +./doc/html/man/menu_opts.3x.html +./doc/html/man/menu_pattern.3x.html +./doc/html/man/menu_post.3x.html +./doc/html/man/menu_requestname.3x.html +./doc/html/man/menu_spacing.3x.html +./doc/html/man/menu_userptr.3x.html +./doc/html/man/menu_win.3x.html +./doc/html/man/mitem_current.3x.html +./doc/html/man/mitem_name.3x.html +./doc/html/man/mitem_new.3x.html +./doc/html/man/mitem_opts.3x.html +./doc/html/man/mitem_userptr.3x.html +./doc/html/man/mitem_value.3x.html +./doc/html/man/mitem_visible.3x.html +./doc/html/man/ncurses.3x.html +./doc/html/man/ncursesw6-config.1.html +./doc/html/man/new_pair.3x.html +./doc/html/man/panel.3x.html +./doc/html/man/resizeterm.3x.html +./doc/html/man/scr_dump.5.html +./doc/html/man/tabs.1.html +./doc/html/man/term.5.html +./doc/html/man/term.7.html +./doc/html/man/term_variables.3x.html +./doc/html/man/terminfo.5.html +./doc/html/man/tic.1m.html +./doc/html/man/toe.1m.html +./doc/html/man/tput.1.html +./doc/html/man/tset.1.html +./doc/html/man/user_caps.5.html +./doc/html/man/wresize.3x.html +./doc/html/ncurses-intro.html +./doc/ncurses-intro.doc +./form/Makefile.in +./form/READ.ME +./form/f_trace.c +./form/fld_arg.c +./form/fld_attr.c +./form/fld_current.c +./form/fld_def.c +./form/fld_dup.c +./form/fld_ftchoice.c +./form/fld_ftlink.c +./form/fld_info.c +./form/fld_just.c +./form/fld_link.c +./form/fld_max.c +./form/fld_move.c +./form/fld_newftyp.c +./form/fld_opts.c +./form/fld_pad.c +./form/fld_page.c +./form/fld_stat.c +./form/fld_type.c +./form/fld_user.c +./form/form.h +./form/form.priv.h +./form/frm_cursor.c +./form/frm_data.c +./form/frm_def.c +./form/frm_driver.c +./form/frm_hook.c +./form/frm_opts.c +./form/frm_page.c +./form/frm_post.c +./form/frm_req_name.c +./form/frm_scale.c +./form/frm_sub.c +./form/frm_user.c +./form/frm_win.c +./form/fty_alnum.c +./form/fty_alpha.c +./form/fty_enum.c +./form/fty_generic.c +./form/fty_int.c +./form/fty_ipv4.c +./form/fty_num.c +./form/fty_regex.c +./form/headers +./form/llib-lform +./form/llib-lformt +./form/llib-lformtw +./form/llib-lformw +./form/modules +./include/Caps +./include/Caps-ncurses +./include/Caps.aix4 +./include/Caps.hpux11 +./include/Caps.keys +./include/Caps.osf1r5 +./include/Caps.uwin +./include/MKhashsize.sh +./include/MKkey_defs.sh +./include/MKncurses_def.sh +./include/MKparametrized.sh +./include/MKterm.h.awk.in +./include/Makefile.in +./include/capdefaults.c +./include/curses.events +./include/curses.h.in +./include/curses.tail +./include/curses.wide +./include/edit_cfg.sh +./include/hashed_db.h +./include/headers +./include/nc_access.h +./include/nc_alloc.h +./include/nc_mingw.h +./include/nc_panel.h +./include/nc_string.h +./include/nc_termios.h +./include/nc_tparm.h +./include/nc_win32.h +./include/ncurses_cfg.hin +./include/ncurses_defs +./include/ncurses_dll.h.in +./include/ncurses_mingw.h +./include/term_entry.h +./include/termcap.h.in +./include/tic.h +./include/unctrl.h.in +./include/win32_curses.h +./install-sh +./man/MKada_config.in +./man/MKncu_config.in +./man/MKterminfo.sh +./man/Makefile.in +./man/captoinfo.1m +./man/clear.1 +./man/curs_add_wch.3x +./man/curs_add_wchstr.3x +./man/curs_addch.3x +./man/curs_addchstr.3x +./man/curs_addstr.3x +./man/curs_addwstr.3x +./man/curs_attr.3x +./man/curs_beep.3x +./man/curs_bkgd.3x +./man/curs_bkgrnd.3x +./man/curs_border.3x +./man/curs_border_set.3x +./man/curs_clear.3x +./man/curs_color.3x +./man/curs_delch.3x +./man/curs_deleteln.3x +./man/curs_extend.3x +./man/curs_get_wch.3x +./man/curs_get_wstr.3x +./man/curs_getcchar.3x +./man/curs_getch.3x +./man/curs_getstr.3x +./man/curs_getyx.3x +./man/curs_in_wch.3x +./man/curs_in_wchstr.3x +./man/curs_inch.3x +./man/curs_inchstr.3x +./man/curs_initscr.3x +./man/curs_inopts.3x +./man/curs_ins_wch.3x +./man/curs_ins_wstr.3x +./man/curs_insch.3x +./man/curs_insstr.3x +./man/curs_instr.3x +./man/curs_inwstr.3x +./man/curs_kernel.3x +./man/curs_legacy.3x +./man/curs_memleaks.3x +./man/curs_mouse.3x +./man/curs_move.3x +./man/curs_opaque.3x +./man/curs_outopts.3x +./man/curs_overlay.3x +./man/curs_pad.3x +./man/curs_print.3x +./man/curs_printw.3x +./man/curs_refresh.3x +./man/curs_scanw.3x +./man/curs_scr_dump.3x +./man/curs_scroll.3x +./man/curs_slk.3x +./man/curs_sp_funcs.3x +./man/curs_termattrs.3x +./man/curs_termcap.3x +./man/curs_terminfo.3x +./man/curs_threads.3x +./man/curs_touch.3x +./man/curs_trace.3x +./man/curs_util.3x +./man/curs_variables.3x +./man/curs_window.3x +./man/default_colors.3x +./man/define_key.3x +./man/form.3x +./man/form_cursor.3x +./man/form_data.3x +./man/form_driver.3x +./man/form_field.3x +./man/form_field_attributes.3x +./man/form_field_buffer.3x +./man/form_field_info.3x +./man/form_field_just.3x +./man/form_field_new.3x +./man/form_field_opts.3x +./man/form_field_userptr.3x +./man/form_field_validation.3x +./man/form_fieldtype.3x +./man/form_hook.3x +./man/form_new.3x +./man/form_new_page.3x +./man/form_opts.3x +./man/form_page.3x +./man/form_post.3x +./man/form_requestname.3x +./man/form_userptr.3x +./man/form_variables.3x +./man/form_win.3x +./man/infocmp.1m +./man/infotocap.1m +./man/key_defined.3x +./man/keybound.3x +./man/keyok.3x +./man/legacy_coding.3x +./man/make_sed.sh +./man/man_db.renames.in +./man/manhtml.aliases +./man/manhtml.externs +./man/manlinks.sed +./man/menu.3x +./man/menu_attributes.3x +./man/menu_cursor.3x +./man/menu_driver.3x +./man/menu_format.3x +./man/menu_hook.3x +./man/menu_items.3x +./man/menu_mark.3x +./man/menu_new.3x +./man/menu_opts.3x +./man/menu_pattern.3x +./man/menu_post.3x +./man/menu_requestname.3x +./man/menu_spacing.3x +./man/menu_userptr.3x +./man/menu_win.3x +./man/mitem_current.3x +./man/mitem_name.3x +./man/mitem_new.3x +./man/mitem_opts.3x +./man/mitem_userptr.3x +./man/mitem_value.3x +./man/mitem_visible.3x +./man/ncurses.3x +./man/new_pair.3x +./man/panel.3x +./man/resizeterm.3x +./man/scr_dump.5 +./man/tabs.1 +./man/term.5 +./man/term.7 +./man/term_variables.3x +./man/terminfo.head +./man/terminfo.tail +./man/tic.1m +./man/toe.1m +./man/tput.1 +./man/tset.1 +./man/user_caps.5 +./man/wresize.3x +./menu/Makefile.in +./menu/READ.ME +./menu/eti.h +./menu/headers +./menu/llib-lmenu +./menu/llib-lmenut +./menu/llib-lmenutw +./menu/llib-lmenuw +./menu/m_attribs.c +./menu/m_cursor.c +./menu/m_driver.c +./menu/m_format.c +./menu/m_global.c +./menu/m_hook.c +./menu/m_item_cur.c +./menu/m_item_nam.c +./menu/m_item_new.c +./menu/m_item_opt.c +./menu/m_item_top.c +./menu/m_item_use.c +./menu/m_item_val.c +./menu/m_item_vis.c +./menu/m_items.c +./menu/m_new.c +./menu/m_opts.c +./menu/m_pad.c +./menu/m_pattern.c +./menu/m_post.c +./menu/m_req_name.c +./menu/m_scale.c +./menu/m_spacing.c +./menu/m_sub.c +./menu/m_trace.c +./menu/m_userptr.c +./menu/m_win.c +./menu/menu.h +./menu/menu.priv.h +./menu/mf_common.h +./menu/modules +./misc/Makefile.in +./misc/chkdef.cmd +./misc/cleantic.cmd +./misc/cmpdef.cmd +./misc/csort +./misc/emx.src +./misc/form.def +./misc/form.ref +./misc/gen-pkgconfig.in +./misc/gen_edit.sh +./misc/magic +./misc/makedef.cmd +./misc/makellib +./misc/menu.def +./misc/menu.ref +./misc/ncu2openbsd +./misc/ncurses-config.in +./misc/ncurses.def +./misc/ncurses.ref +./misc/ncurses.supp +./misc/panel.def +./misc/panel.ref +./misc/run_tic.in +./misc/shlib +./misc/tabset/std +./misc/tabset/stdcrt +./misc/tabset/vt100 +./misc/tabset/vt300 +./misc/tdlint +./misc/terminfo.src +./mk-0th.awk +./mk-1st.awk +./mk-2nd.awk +./mk-hdr.awk +./ncurses/Makefile.in +./ncurses/README +./ncurses/README.IZ +./ncurses/SigAction.h +./ncurses/base/MKkeyname.awk +./ncurses/base/MKlib_gen.sh +./ncurses/base/MKunctrl.awk +./ncurses/base/README +./ncurses/base/define_key.c +./ncurses/base/key_defined.c +./ncurses/base/keybound.c +./ncurses/base/keyok.c +./ncurses/base/legacy_coding.c +./ncurses/base/lib_addch.c +./ncurses/base/lib_addstr.c +./ncurses/base/lib_beep.c +./ncurses/base/lib_bkgd.c +./ncurses/base/lib_box.c +./ncurses/base/lib_chgat.c +./ncurses/base/lib_clear.c +./ncurses/base/lib_clearok.c +./ncurses/base/lib_clrbot.c +./ncurses/base/lib_clreol.c +./ncurses/base/lib_color.c +./ncurses/base/lib_colorset.c +./ncurses/base/lib_delch.c +./ncurses/base/lib_delwin.c +./ncurses/base/lib_dft_fgbg.c +./ncurses/base/lib_driver.c +./ncurses/base/lib_echo.c +./ncurses/base/lib_endwin.c +./ncurses/base/lib_erase.c +./ncurses/base/lib_flash.c +./ncurses/base/lib_freeall.c +./ncurses/base/lib_getch.c +./ncurses/base/lib_getstr.c +./ncurses/base/lib_hline.c +./ncurses/base/lib_immedok.c +./ncurses/base/lib_inchstr.c +./ncurses/base/lib_initscr.c +./ncurses/base/lib_insch.c +./ncurses/base/lib_insdel.c +./ncurses/base/lib_insnstr.c +./ncurses/base/lib_instr.c +./ncurses/base/lib_isendwin.c +./ncurses/base/lib_leaveok.c +./ncurses/base/lib_mouse.c +./ncurses/base/lib_move.c +./ncurses/base/lib_mvwin.c +./ncurses/base/lib_newterm.c +./ncurses/base/lib_newwin.c +./ncurses/base/lib_nl.c +./ncurses/base/lib_overlay.c +./ncurses/base/lib_pad.c +./ncurses/base/lib_printw.c +./ncurses/base/lib_redrawln.c +./ncurses/base/lib_refresh.c +./ncurses/base/lib_restart.c +./ncurses/base/lib_scanw.c +./ncurses/base/lib_screen.c +./ncurses/base/lib_scroll.c +./ncurses/base/lib_scrollok.c +./ncurses/base/lib_scrreg.c +./ncurses/base/lib_set_term.c +./ncurses/base/lib_slk.c +./ncurses/base/lib_slkatr_set.c +./ncurses/base/lib_slkatrof.c +./ncurses/base/lib_slkatron.c +./ncurses/base/lib_slkatrset.c +./ncurses/base/lib_slkattr.c +./ncurses/base/lib_slkclear.c +./ncurses/base/lib_slkcolor.c +./ncurses/base/lib_slkinit.c +./ncurses/base/lib_slklab.c +./ncurses/base/lib_slkrefr.c +./ncurses/base/lib_slkset.c +./ncurses/base/lib_slktouch.c +./ncurses/base/lib_touch.c +./ncurses/base/lib_ungetch.c +./ncurses/base/lib_vline.c +./ncurses/base/lib_wattroff.c +./ncurses/base/lib_wattron.c +./ncurses/base/lib_winch.c +./ncurses/base/lib_window.c +./ncurses/base/nc_panel.c +./ncurses/base/new_pair.c +./ncurses/base/resizeterm.c +./ncurses/base/safe_sprintf.c +./ncurses/base/sigaction.c +./ncurses/base/tries.c +./ncurses/base/use_window.c +./ncurses/base/version.c +./ncurses/base/vsscanf.c +./ncurses/base/wresize.c +./ncurses/build.priv.h +./ncurses/curses.priv.h +./ncurses/fifo_defs.h +./ncurses/llib-lncurses +./ncurses/llib-lncursest +./ncurses/llib-lncursestw +./ncurses/llib-lncursesw +./ncurses/llib-ltic +./ncurses/llib-ltict +./ncurses/llib-ltictw +./ncurses/llib-lticw +./ncurses/llib-ltinfo +./ncurses/llib-ltinfot +./ncurses/llib-ltinfotw +./ncurses/llib-ltinfow +./ncurses/modules +./ncurses/new_pair.h +./ncurses/report_hashing.c +./ncurses/report_offsets.c +./ncurses/term.priv.h +./ncurses/tinfo/MKcaptab.awk +./ncurses/tinfo/MKcaptab.sh +./ncurses/tinfo/MKcodes.awk +./ncurses/tinfo/MKfallback.sh +./ncurses/tinfo/MKkeys_list.sh +./ncurses/tinfo/MKnames.awk +./ncurses/tinfo/MKuserdefs.sh +./ncurses/tinfo/README +./ncurses/tinfo/access.c +./ncurses/tinfo/add_tries.c +./ncurses/tinfo/alloc_entry.c +./ncurses/tinfo/alloc_ttype.c +./ncurses/tinfo/captoinfo.c +./ncurses/tinfo/comp_error.c +./ncurses/tinfo/comp_expand.c +./ncurses/tinfo/comp_hash.c +./ncurses/tinfo/comp_parse.c +./ncurses/tinfo/comp_scan.c +./ncurses/tinfo/db_iterator.c +./ncurses/tinfo/doalloc.c +./ncurses/tinfo/entries.c +./ncurses/tinfo/free_ttype.c +./ncurses/tinfo/getenv_num.c +./ncurses/tinfo/hashed_db.c +./ncurses/tinfo/home_terminfo.c +./ncurses/tinfo/init_keytry.c +./ncurses/tinfo/lib_acs.c +./ncurses/tinfo/lib_baudrate.c +./ncurses/tinfo/lib_cur_term.c +./ncurses/tinfo/lib_data.c +./ncurses/tinfo/lib_has_cap.c +./ncurses/tinfo/lib_kernel.c +./ncurses/tinfo/lib_longname.c +./ncurses/tinfo/lib_napms.c +./ncurses/tinfo/lib_options.c +./ncurses/tinfo/lib_print.c +./ncurses/tinfo/lib_raw.c +./ncurses/tinfo/lib_setup.c +./ncurses/tinfo/lib_termcap.c +./ncurses/tinfo/lib_termname.c +./ncurses/tinfo/lib_tgoto.c +./ncurses/tinfo/lib_ti.c +./ncurses/tinfo/lib_tparm.c +./ncurses/tinfo/lib_tputs.c +./ncurses/tinfo/lib_ttyflags.c +./ncurses/tinfo/lib_win32con.c +./ncurses/tinfo/lib_win32util.c +./ncurses/tinfo/make_hash.c +./ncurses/tinfo/make_keys.c +./ncurses/tinfo/name_match.c +./ncurses/tinfo/obsolete.c +./ncurses/tinfo/parse_entry.c +./ncurses/tinfo/read_entry.c +./ncurses/tinfo/read_termcap.c +./ncurses/tinfo/strings.c +./ncurses/tinfo/tinfo_driver.c +./ncurses/tinfo/trim_sgr0.c +./ncurses/tinfo/use_screen.c +./ncurses/tinfo/write_entry.c +./ncurses/trace/README +./ncurses/trace/lib_trace.c +./ncurses/trace/lib_traceatr.c +./ncurses/trace/lib_tracebits.c +./ncurses/trace/lib_tracechr.c +./ncurses/trace/lib_tracedmp.c +./ncurses/trace/lib_tracemse.c +./ncurses/trace/trace_buf.c +./ncurses/trace/trace_tries.c +./ncurses/trace/trace_xnames.c +./ncurses/trace/varargs.c +./ncurses/trace/visbuf.c +./ncurses/tty/MKexpanded.sh +./ncurses/tty/hardscroll.c +./ncurses/tty/hashmap.c +./ncurses/tty/lib_mvcur.c +./ncurses/tty/lib_tstp.c +./ncurses/tty/lib_twait.c +./ncurses/tty/lib_vidattr.c +./ncurses/tty/tty_update.c +./ncurses/wcwidth.h +./ncurses/widechar/charable.c +./ncurses/widechar/lib_add_wch.c +./ncurses/widechar/lib_box_set.c +./ncurses/widechar/lib_cchar.c +./ncurses/widechar/lib_erasewchar.c +./ncurses/widechar/lib_get_wch.c +./ncurses/widechar/lib_get_wstr.c +./ncurses/widechar/lib_hline_set.c +./ncurses/widechar/lib_in_wch.c +./ncurses/widechar/lib_in_wchnstr.c +./ncurses/widechar/lib_ins_wch.c +./ncurses/widechar/lib_inwstr.c +./ncurses/widechar/lib_key_name.c +./ncurses/widechar/lib_pecho_wchar.c +./ncurses/widechar/lib_slk_wset.c +./ncurses/widechar/lib_unget_wch.c +./ncurses/widechar/lib_vid_attr.c +./ncurses/widechar/lib_vline_set.c +./ncurses/widechar/lib_wacs.c +./ncurses/widechar/lib_wunctrl.c +./ncurses/widechar/widechars.c +./ncurses/win32con/gettimeofday.c +./ncurses/win32con/wcwidth.c +./ncurses/win32con/win32_driver.c +./ncurses/win32con/win_driver.c +./package/debian-mingw/changelog +./package/debian-mingw/compat +./package/debian-mingw/control +./package/debian-mingw/copyright +./package/debian-mingw/mingw32-ncurses6td.lintian-overrides +./package/debian-mingw/rules +./package/debian-mingw/source/format +./package/debian-mingw/watch +./package/debian-mingw64/changelog +./package/debian-mingw64/compat +./package/debian-mingw64/control +./package/debian-mingw64/copyright +./package/debian-mingw64/mingw64-ncurses6td.lintian-overrides +./package/debian-mingw64/rules +./package/debian-mingw64/source/format +./package/debian-mingw64/watch +./package/debian/changelog +./package/debian/compat +./package/debian/control +./package/debian/copyright +./package/debian/ncurses6td.lintian-overrides +./package/debian/ncurses6td.triggers +./package/debian/ncursest6td.lintian-overrides +./package/debian/ncursest6td.triggers +./package/debian/rules +./package/debian/source/format +./package/debian/watch +./package/mingw-ncurses.nsi +./package/mingw-ncurses.spec +./package/ncurses.map +./package/ncurses.spec +./package/ncurses.sym +./package/ncursest.map +./package/ncursest.spec +./package/ncursest.sym +./package/ncursestw.map +./package/ncursestw.sym +./package/ncursesw.map +./package/ncursesw.sym +./panel/Makefile.in +./panel/headers +./panel/llib-lpanel +./panel/llib-lpanelt +./panel/llib-lpaneltw +./panel/llib-lpanelw +./panel/modules +./panel/p_above.c +./panel/p_below.c +./panel/p_bottom.c +./panel/p_delete.c +./panel/p_hidden.c +./panel/p_hide.c +./panel/p_move.c +./panel/p_new.c +./panel/p_replace.c +./panel/p_show.c +./panel/p_top.c +./panel/p_update.c +./panel/p_user.c +./panel/p_win.c +./panel/panel.c +./panel/panel.h +./panel/panel.priv.h +./progs/MKtermsort.sh +./progs/Makefile.in +./progs/capconvert +./progs/clear.c +./progs/clear.sh +./progs/clear_cmd.c +./progs/clear_cmd.h +./progs/dump_entry.c +./progs/dump_entry.h +./progs/infocmp.c +./progs/modules +./progs/progs.priv.h +./progs/reset_cmd.c +./progs/reset_cmd.h +./progs/tabs.c +./progs/tic.c +./progs/toe.c +./progs/tparm_type.c +./progs/tparm_type.h +./progs/tput.c +./progs/transform.c +./progs/tset.c +./progs/tty_settings.c +./progs/tty_settings.h +./test/Makefile.in +./test/README +./test/aclocal.m4 +./test/back_ground.c +./test/background.c +./test/blue.c +./test/bs.6 +./test/bs.c +./test/bulgarian-utf8-tabs.txt +./test/bulgarian-utf8.txt +./test/cardfile.c +./test/cardfile.dat +./test/chgat.c +./test/clip_printw.c +./test/color_content.c +./test/color_name.h +./test/color_set.c +./test/combine.c +./test/configure +./test/configure.in +./test/demo_altkeys.c +./test/demo_defkey.c +./test/demo_forms.c +./test/demo_forms.txt +./test/demo_keyok.c +./test/demo_menus.c +./test/demo_new_pair.c +./test/demo_panels.c +./test/demo_tabs.c +./test/demo_termcap.c +./test/demo_terminfo.c +./test/ditto.c +./test/dots.c +./test/dots_curses.c +./test/dots_mvcur.c +./test/dots_termcap.c +./test/dots_xcurses.c +./test/dump_window.c +./test/dump_window.h +./test/dup_field.c +./test/echochar.c +./test/edit_field.c +./test/edit_field.h +./test/escherknot.xbm +./test/extended_color.c +./test/filter.c +./test/firework.c +./test/firstlast.c +./test/foldkeys.c +./test/form_driver_w.c +./test/gdc.6 +./test/gdc.c +./test/hanoi.c +./test/hashtest.c +./test/inch_wide.c +./test/inchs.c +./test/ins_wide.c +./test/insdelln.c +./test/inserts.c +./test/key_names.c +./test/keynames.c +./test/knight.c +./test/linedata.h +./test/linux-color.dat +./test/list_keys.c +./test/listused.sh +./test/lrtest.c +./test/make-tar.sh +./test/mensetmanus.xbm +./test/mini.xterm_48x48.xpm +./test/mk-test.awk +./test/modules +./test/move_field.c +./test/movewindow.c +./test/ncurses.c +./test/ncurses_tst.hin +./test/newdemo.c +./test/package/debian-mingw/compat +./test/package/debian-mingw/control +./test/package/debian-mingw/copyright +./test/package/debian-mingw/docs +./test/package/debian-mingw/rules +./test/package/debian-mingw/source/format +./test/package/debian-mingw/watch +./test/package/debian-mingw64/compat +./test/package/debian-mingw64/control +./test/package/debian-mingw64/copyright +./test/package/debian-mingw64/docs +./test/package/debian-mingw64/rules +./test/package/debian-mingw64/source/format +./test/package/debian-mingw64/watch +./test/package/debian/compat +./test/package/debian/control +./test/package/debian/copyright +./test/package/debian/docs +./test/package/debian/rules +./test/package/debian/source/format +./test/package/debian/watch +./test/package/mingw-ncurses-examples.spec +./test/package/ncurses-examples.spec +./test/padview.c +./test/pair_content.c +./test/parse_rgb.h +./test/picsmap.c +./test/picsmap.h +./test/popup_msg.c +./test/popup_msg.h +./test/programs +./test/railroad.c +./test/rain.c +./test/redraw.c +./test/savescreen.c +./test/savescreen.sh +./test/sp_tinfo.c +./test/tclock.c +./test/terminal.xbm +./test/test.priv.h +./test/test_add_wchstr.c +./test/test_addchstr.c +./test/test_addstr.c +./test/test_addwstr.c +./test/test_arrays.c +./test/test_delwin.c +./test/test_endwin.c +./test/test_get_wstr.c +./test/test_getstr.c +./test/test_instr.c +./test/test_inwstr.c +./test/test_mouse.c +./test/test_opaque.c +./test/test_setupterm.c +./test/test_sgr.c +./test/test_termattrs.c +./test/test_tparm.c +./test/test_unget_wch.c +./test/test_vid_puts.c +./test/test_vidputs.c +./test/testaddch.c +./test/testcurs.c +./test/testscanw.c +./test/tput-colorcube +./test/tput-initc +./test/tracemunch +./test/view.c +./test/widechars-utf8-tabs.txt +./test/widechars-utf8.txt +./test/widechars.h +./test/worm.c +./test/xmas.c +./test/xterm-16color.dat +./test/xterm-256color.dat +./test/xterm-88color.dat +./test/xterm-color_48x48.xpm diff --git a/contrib/ncurses/Makefile.in b/contrib/ncurses/Makefile.in new file mode 100644 index 00000000..1303e171 --- /dev/null +++ b/contrib/ncurses/Makefile.in @@ -0,0 +1,132 @@ +# $Id: Makefile.in,v 1.46 2022/10/01 22:53:36 tom Exp $ +############################################################################## +# Copyright 2018-2021,2022 Thomas E. Dickey # +# Copyright 1998-2014,2015 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Master Makefile for ncurses library. + +SHELL = @SHELL@ +VPATH = @srcdir@ + +DESTDIR=@DESTDIR@ +RPATH_LIST=@RPATH_LIST@ +TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)" + +@SET_MAKE@ + +NCURSES_MAJOR = @NCURSES_MAJOR@ +NCURSES_MINOR = @NCURSES_MINOR@ +NCURSES_PATCH = @NCURSES_PATCH@ + +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ + +bindir = @bindir@ +ticdir = @TERMINFO@ +includedir = @includedir@ +includesubdir = @includesubdir@ +libdir = @libdir@ +mandir = @mandir@ +pkgdir = @PKG_CONFIG_LIBDIR@ + +include_dir = ${includedir}${includesubdir} + +FGREP = @FGREP@ + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +DIRS_TO_MAKE = @DIRS_TO_MAKE@ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : depend +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : preinstall +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : tags +@MAKE_PHONY@.PHONY : uninstall + +all :: $(DIRS_TO_MAKE) + +$(DIRS_TO_MAKE) : + mkdir $@ + +preinstall : + @ echo '' + @ echo '** Configuration summary for NCURSES $(NCURSES_MAJOR).$(NCURSES_MINOR) $(NCURSES_PATCH):' + @ echo '' + @ echo ' extended funcs: '`test @NCURSES_EXT_FUNCS@ != 0 && echo yes || echo no` + @ echo ' xterm terminfo: '@WHICH_XTERM@ + @ echo '' + @ echo ' bin directory: '$(bindir) + @ echo ' lib directory: '$(libdir) + @ echo ' include directory: '$(include_dir) + @ echo ' man directory: '$(mandir) +@MAKE_TERMINFO@ @ echo ' terminfo directory: '$(ticdir) +@USE_FALLBACKS@ @ echo ' using fallback-list: '@FALLBACK_LIST@ +@MAKE_PC_FILES@ @ echo ' pkg-config directory: '$(pkgdir) + @ echo '' + @ test "$(include_dir)" = "$(prefix)/include" || \ + echo '** Include-directory is not in a standard location' + @ test ! -f $(include_dir)/termcap.h || \ + $(FGREP) NCURSES_VERSION $(include_dir)/termcap.h >/dev/null || \ + echo '** Will overwrite non-ncurses termcap.h' + @ test ! -f $(include_dir)/curses.h || \ + $(FGREP) NCURSES_VERSION $(include_dir)/curses.h >/dev/null || \ + echo '** Will overwrite non-ncurses curses.h' + +distclean \ +realclean :: + +check : + @ echo The test-programs are interactive + + +# Put the common rules here so that we can easily construct the list of +# directories to visit. +all \ +clean \ +distclean \ +mostlyclean \ +realclean \ +depend \ +sources \ +tags \ +uninstall \ +install :: diff --git a/contrib/ncurses/Makefile.os2 b/contrib/ncurses/Makefile.os2 new file mode 100644 index 00000000..bc3407d6 --- /dev/null +++ b/contrib/ncurses/Makefile.os2 @@ -0,0 +1,260 @@ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 1998-2000,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +################################################################################ +# $Id: Makefile.os2,v 1.13 2021/06/17 21:20:30 tom Exp $ +# +# Wrapper Makefile for ncurses library under OS/2. +# Author: Juan Jose Garcia Ripoll . +# Webpage: http://www.arrakis.es/~worm/ +################################################################################ +# +# Notes (from I Zakharevich) +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +# I could build the library with the following sequence of commands: +# +# touch Makefile +# make -f Makefile.os2 config +# make -f Makefile.os2 CC=gcc HOSTCC=gcc CXX=gcc +# +# Ignoring the following errors: +# Invalid configuration `os2'... +# ... ac_maketemp="make": not found +# ... syntax error: `done' unexpected +# No rule to make target `lib/ncurses4.dll' +# +# You may need to run +# +# rm make.defs +# make -f Makefile.os2 make.defs +# +# if the build of misc/panel.def fails. +# +# If you do not have perl, the configuration will fail. Use autoconf to +# generate the EMX-specific configure script (see README.emx), and run the +# configure script to generate the makefiles. Then, run +# +# make -f Makefile.os2 make.dlls +# +# Notes (from J J G Ripoll) +# ~~~~~~~~~~~~~~~~~~~~~~~~~ +# The `make.defs' rule creates the new '.def' files and outputs a diagnostic +# about symbols that disappear from one release to the other, as well as +# checks about the new '.def' consistency. If there were no problems, the +# maintainer is free to replace the `.ref' files with the newer ones using the +# `save.defs' rule. So, the only tough work is ensuring that the symbols that +# disappear are not essential. +# +# I first thought about killing '_nc_*' symbols, but it seems that some of +# them --_nc_panel_hook, _nc_ada*, etc-- are needed outside ncurses.dll. +# However, the whole size of the export table will not be larger than 1k or +# so. +# +# [installation] +# +# The way things are handled in misc/Makefile is not well suited for OS/2, +# where only emx.src is needed. Thus, I've written a few wrapper rules in +# Makefile.os2 that handle installation/deinstallation. +# +# [distribution] +# +# There's also a new rule that configures and builds a sort of binary +# distribution, much like the one I prepared for 1.9.9e. It's `os2dist'. +# +################################################################################ + +all :: config + +# This is for configuring + +# What is a useful value for this? +CONFIG_OPTS = --enable-termcap +WWWGET = lynx -source +MV_F = mv -f +DLL_LN_OPTS = -Zcrtdll -Zdll -Zomf -Zmt + +config: config.cache + +config.cache: configure.cmd configure + -$(MV_F) $@ $@.ref + configure.cmd $(CONFIG_OPTS) + +configure.cmd: configure convert_configure.pl + perl convert_configure.pl configure > $@ + +convert_configure.pl: + $(WWWGET) ftp://ftp.math.ohio-state.edu/pub/users/ilya/os2/$@ > $@ + +install :: + echo *** + echo *** Do not use this command. Use install.os2 instead. + echo *** + exit 2 + +install.os2 : install.emxdata install.libs install.progs + +include ./Makefile + +all :: make.dlls + +# +# DLLs and that stuff +# + +LIBRARIES = ncurses form menu panel + +DLL_TAG = $(NCURSES_MAJOR) +LIB_TAG = _s + +DLL_ROOTS = $(addsuffix $(DLL_TAG), $(LIBRARIES)) +DLLS = $(addsuffix .dll, $(addprefix ./lib/, $(DLL_ROOTS))) + +LIB_ROOTS = $(addsuffix $(LIB_TAG), $(LIBRARIES)) +LIBS = $(addsuffix .lib, $(addprefix ./lib/, $(LIB_ROOTS))) + +LIBS_AOUT = $(addsuffix .a, $(addprefix ./lib/, $(LIB_ROOTS))) + +DEFS = $(addsuffix .def, $(addprefix ./misc/, $(LIBRARIES))) + +DLL_SIGNATURE = NCurses-$(NCURSES_MAJOR)-$(NCURSES_MINOR)-$(NCURSES_PATCH) + +./lib/%$(LIB_TAG).lib : ./misc/%.def + emximp -o $@ $< + +./lib/%$(LIB_TAG).a : ./misc/%.def + emximp -o $@ $< + +./lib/%$(DLL_TAG).dll : ./lib/%.a + emxomf -o ./lib/$*$(DLL_TAG).lib $< + if [ "$*" = "ncurses" ]; then \ + gcc $(LDFLAGS) $(DLL_LN_OPTS) ./lib/$*$(DLL_TAG).lib \ + ./misc/$*.def -o $@; \ + else \ + gcc $(LDFLAGS) $(DLL_LN_OPTS) ./lib/$*$(DLL_TAG).lib \ + ./lib/ncurses$(LIB_TAG).lib ./misc/$*.def -o $@; \ + fi + -rm -f ./lib/$*$(DLL_TAG).lib + +make.dlls : $(DEFS) $(LIBS) $(DLLS) $(LIBS_AOUT) + +$(DEFS) : make.defs + +LIBDIR = $(DESTDIR)$(libdir) +$(LIBDIR) : + mkdir -p $@ + +install.libs :: $(LIBS) $(DLLS) $(LIBDIR) + @for i in $(DLL_ROOTS); do \ + echo installing ./lib/$$i.dll as $(LIBDIR)/$$i.dll; \ + $(INSTALL_DATA) ./lib/$$i.dll $(LIBDIR)/$$i.dll; done + @for i in $(LIB_ROOTS); do \ + echo installing ./lib/$$i.lib as $(LIBDIR)/$$i.lib; \ + $(INSTALL_DATA) ./lib/$$i.lib $(LIBDIR)/$$i.lib; done + +uninstall.libs :: + -@for i in $(DLL_ROOTS); do \ + echo uninstalling $(LIBDIR)/$$i.dll; \ + rm -f $(LIBDIR)/$$i.dll; done + -@for i in $(LIB_ROOTS); do \ + echo uninstalling $(LIBDIR)/$$i.lib; \ + rm -f $(LIBDIR)/$$i.lib; done + +make.defs : + for i in $(LIBRARIES); do \ + echo LIBRARY $${i}$(DLL_TAG) INITINSTANCE TERMINSTANCE > ./misc/$$i.def; \ + echo DESCRIPTION \"$(DLL_SIGNATURE), module $$i\" >> ./misc/$$i.def; \ + echo CODE LOADONCALL >> ./misc/$$i.def; \ + echo DATA LOADONCALL NONSHARED MULTIPLE >> ./misc/$$i.def; \ + echo EXPORTS >> ./misc/$$i.def; \ + echo Creating $$i.def; \ + (cmd /C ".\\misc\\makedef.cmd ./lib/$$i.a ./misc/$$i.ref >> ./misc/$$i.def" \ + && cmd /C ".\\misc\\chkdef.cmd ./misc/$$i.def") \ + || exit 1; \ + done + touch make.defs + +save.defs : + for i in $(LIBRARIES); do \ + test -f ./misc/$$i.def && cp ./misc/$$i.def ./misc/$$i.ref; \ + done + +clean \ +os2clean :: + -rm -f $(DLLS) $(LIBS) + +realclean :: + -rm -f $(addprefix ./misc/, $(addsuffix .def, $(LIBRARIES))) + +# +# This is a simplified version of misc/Makefile +# + +TICDIR = $(DESTDIR)$(datadir)/terminfo +TABSETDIR = $(DESTDIR)$(datadir)/tabset + +$(TICDIR) : + mkdir -p $@ + +install \ +install.emxdata :: $(TICDIR) + -@rm -fr $(TICDIR)/* + echo Building terminfo database, please wait... + set TERMINFO=$(TICDIR); ./progs/tic ./misc/emx.src + echo Installing the terminfo cleaner and the sources... + cp ./misc/emx.src ./misc/cleantic.cmd $(TICDIR) + ./misc/cleantic.cmd $(TICDIR) + +uninstall \ +uninstall.emxdata :: + -cd $(TICDIR) && rm -rf * + -cd $(TABSETDIR) && rm -rf * + +# +# This is for preparing binary distributions +# + +OS2NAME=ncurses-$(NCURSES_MAJOR).$(NCURSES_MINOR)-emx + +# +# FIXME: this assumes that we can rerun the configure script, changing only +# the install-prefix. That means we cannot provide "interesting" options +# when building. +# +os2dist : + $(MAKE) -f Makefile.os2 os2clean + ./configure --without-debug --with-install-prefix=`pwd|sed -e 's@^.:@@'`/$(OS2NAME) + $(MAKE) -f Makefile.os2 $(CF_MFLAGS) install.os2 + -rm -f $(OS2NAME).zip + echo NCurses-$(NCURSES_MAJOR).$(NCURSES_MINOR)-$(NCURSES_PATCH) for emx > $(OS2NAME)/FILE_ID.DIZ + echo Binary release. >> $(OS2NAME)/FILE_ID.DIZ + zip -r $(OS2NAME).zip ./$(OS2NAME) + +clean \ +os2clean :: + -rm -rf $(OS2NAME) + -rm -f $(OS2NAME).zip + diff --git a/contrib/ncurses/NEWS b/contrib/ncurses/NEWS new file mode 100644 index 00000000..13c22dd3 --- /dev/null +++ b/contrib/ncurses/NEWS @@ -0,0 +1,15836 @@ +------------------------------------------------------------------------------- +-- Copyright 2018-2023,2024 Thomas E. Dickey -- +-- Copyright 1998-2017,2018 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: NEWS,v 1.4195 2024/11/02 21:08:17 tom Exp $ +------------------------------------------------------------------------------- + +This is a log of changes that ncurses has gone through since Zeyd started +working with Pavel Curtis' original work, pcurses, in 1992. + +Changes through 1.9.9e are recorded by Zeyd M Ben-Halim. +Changes since 1.9.9e are recorded by Thomas E Dickey. + +Contributors include those who have provided patches (even small ones), as well +as those who provide useful information (bug reports, analyses). Changes with +no cited author are the work of Thomas E Dickey (TD). + +A few contributors may be cited in this file by their initials. +Each accounts for half of one percent or more of the changes since 1.9.9e. +See the AUTHORS file for the corresponding full names. + +Changes through 1.9.9e did not credit all contributions; +it is not possible to add this information. + +20241102 + + remove djgpp-specific initialization to binary mode (report/patch by + Stas Sergeev). + + add extended-keys for djgpp 2.05 -TD + +20241026 + + update ms-terminal -TD + + add ms-terminal-direct -TD + + correct dimensions in test/popup_msg.c, fixing an overrun (patch by + Stas Sergeev, cf: 20211219). + +20241019 + + fixes for compiler warnings/cppcheck. + + build-fixes for DJGPP configuration (patches by Stas Sergeev) + +20241006 + + fixes for compiler warnings/cppcheck. + + use xterm+alt+title in wezterm -TD + +20240928 + + improve error-message from infocmp when a terminal entry cannot be + opened (patch by Branden Robinson). + + improve filtering of -L options in misc/gen-pkgconfig.in and in + misc/ncurses-config.in + + add check in wresize() for out-of-range dimensions (report by Peter + Bierma). + +20240922 + + add a few null-pointer checks in ncurses + + improve test-driver in ncurses/link_test.c + + restore background character in manpages as described in X/Open + Curses section 3.3.6, and add option "-c" to test programs to + illustrate a non-blank character in the window background property. + + improve formatting/style of manpages (patches by Branden Robinson). + + modify ncurses*-config to add -I option in --cflag where needed for + --disable-overwrite to match ".pc" files. + + disallow directories and block/character devices in safe-open. + + amend scr_restore() and scr_init() to remove the target window only + after validating the source window which will replace the target + (report by Zixi Liu). + +20240914 + + modify _nc_flush() to also flush stderr to help the flash capability + to work in bash (patch by Harm te Hennepe, cf: 20201128) + + omit -g and -fXXX flags from CFLAGS in misc/ncurses-config.in + + improve formatting/style of manpages (patches by Branden Robinson). + + improve examples in NCURSES-Programming-HOWTO.html + + update comments in terminfo.src -TD + +20240831 + + build-fix for a case in msys2 where gettimeofday() was available but + the fallback was partly configured. + > patch by Rafael Kitover: + + separate the _NC_WINDOWS platform macro into _NC_WINDOWS_NATIVE, + for MinGW and other native Win32 support, and _NC_WINDOWS, to make + some Win32 features available under the Cygwin runtime, in this case + the term-driver. + + make some minor adjustments to allow + ./configure --enable-term-driver + to also work on Cygwin platforms such as Cygwin and MSYS2. + +20240824 + + modify infocmp and tabs to use actual name in usage and header. + + modify test/demo_keyok.c to accept ^Q for quit, for consistency. + +20240817 + + review/update foot for 1.18.1 -TD + + add a note about DomTerm 3.2.0 -TD + + add new glob-expressions variables to list in config.status script + (patch by Werner Fink). + + add --enable-install-prefix to modify behavior of $DESTDIR to merge + or replace the value set by --prefix (adapted from suggestion by + Eli Zaretskii). + +20240810 + + modify misc/Makefile.in and misc/run_tic.in so that $DESTDIR is set + and used only in the makefile. + + modify CF_WITH_PKG_CONFIG_LIBDIR to allow for pkg-config using + DOS/Windows pathname syntax (report by Eli Zaretskii). + + improve glob-expressions in configure script + + remove unused Get_Menu_Screen() macro from menu.priv.h + + update config.guess, config.sub + +20240727 + + improve formatting/style of manpages (patches by Branden Robinson). + + fixes for compiler warnings/cppcheck. + + modify wattron/wattroff calls in form/m_post.c to call wattr_on and + wattr_off to omit cast used in the former for X/Open compatibility + (patch by Bill Gray). + + modify wezterm, omitting its broken left/right margin feature (report + by Thayne McCombs) -TD + +20240720 + + improve formatting/style of manpages (patches by Branden Robinson). + + modify configure script and misc/Makefile to accept glob expressions + that include Windows/DOS drive-letters (report by Eli Zaretskii). + + fix misspelled ifdef and correct return-value of _nc_mingw_tcflush in + win_driver.c (report/patch by Eli Zaretskii). + +20240713 + + modify misc/ncurses-config.in, improved match with pkg-config output. + +20240706 + + update configure script to use macro changes from dialog. + + modify CF_NCURSES_PTHREADS to avoid equating package and library + names. + +20240629 + + build-fix for ncurses-examples with newer PDCurses, which no longer + has stubs for unimplemented features. + + add help-popup for test_instr.c, test_inwstr.c + + modify checks in delwin to avoid checking if the window is a pad + until first checking if it is still on the active window-list + (cf: 20211115). + + improve -t option of test/gdc.c, allowing hours only, or hours and + minutes only. + +20240622 + + improve test/gdc.c (patch by Branden Robinson). + + improve formatting/style of manpages (patches by Branden Robinson). + + adjust naming of mingw *-config scripts to match the pkg-config names + + widen pattern in pc/*-config scripts to disallow more linker options + + add --cflags-only-I and --cflags-only-other options to + misc/ncurses-config.in + + revert change to CF_BUILD_CC macro (report by Vassili Courzakis, + cf: 20240518). + +20240615 + + improve formatting/style of manpages (patches by Branden Robinson). + + review/update modules files. + + improve install-rules in Ada95 makefiles (report by Branden Robinson). + + improve formatting/style of manpages in test-directory. + +20240608 + + change winwstr to return wide character count instead of OK (patch + by Branden Robinson). + + improve formatting/style of manpages (patches by Branden Robinson). + + rename testing dpkg's for ncurses6 to resolve a naming conflict with + Debian's ncurses packages. + +20240601 + + improve formatting/style of manpages (patches by Branden Robinson). + + change Ada95/configure to use --with-screen option rather than + --enable-widec, to provide more choices of underlying curses library + +20240525 + + build-fix for configure option --disable-ext-funcs + + improve formatting/style of manpages (patches by Branden Robinson). + + review/update iTerm2 for 3.5.0 -TD + +20240519 + + update Ada95/configure to match change for -DTRACE + + revert change to include/ncurses_defs, which caused build failure if + tracing was not enabled (report by Branden Robinson). + +20240518 + + improve formatting/style of manpages (patches by Branden Robinson). + + move makefile's -DTRACE into include/ncurses_cfg.h, to simplify use + of CFLAGS/CPPFLAGS. + + improve check for clock_gettime(), from xterm. + + modify configure script to work around broken gnatgcc script found in + gcc-13 builds. + +20240511 + + improve formatting/style of manpages (patches by Branden Robinson). + + limit value from ESCDELAY environment variable to 30 seconds, like + other delay limits. + + limit values from LINES and COLUMNS environment variables to 512 + (report by Miroslav Lichvar). + +20240504 + + update ncurses/wcwidth.c, for MinGW ports, from xterm. + + trim obsolete comment about tack from INSTALL. + +20240427 6.5 release for upload to ftp.gnu.org + + update announcement + + fixes/corrections for manpages (patches by Branden Robinson). + + fix redefinition of CASTxPTR, for legacy Unix. + +20240420 + + improve formatting/style of manpages (patches by Branden Robinson). + + compiler warning/portability fixes. + +20240414 + + build/bug-fix for check-size feature (reports by Sam James, Gabriele + Balducci). + +20240413 + + improve formatting/style of manpages (patches by Branden Robinson). + + provide for padding in check-size feature, using new_prescr() to + pass interim SCREEN pointer. + + complete change for opaque options (Gentoo #928973, cf: 20231021). + + update package /debian/rules and related lintian overrides + + revise progs.priv.h to provide for NC_ISATTY reuse + +20240330 + + remove masking of ISIG in cbreak() (report by Benno Schulenberg). + + modify test/test_mouse.c to use curses api for raw/noraw. + > improved configure macros from other program development: + + build-fix for clang on Solaris + + suppress filename/timestamp in gzip'd manpages (suggested for + byacc by Andrin Geiger) + +20240323 + + modify tput/tset reset feature to avoid 1-second sleep if running in + a pseudo-terminal. + + modify check-size feature to avoid using it in a pseudoterminal + (cf: 20231016) + + improve formatting/style of manpages (patches by Branden Robinson). + + trim a space after some "-R" options, fixing builds for applications + built using clang and ncurses on Solaris. + +20240309 + + modify xgterm to work around line-drawing bug -TD + + use CSI 3J in vte-2017 (report by Sven Joachim) + +20240302 + + add configure check for MB_LEN_MAX, to provide warning as needed. + + improve formatting/style of manpages (patches by Branden Robinson). + + fix regression in tput which disallowed hex/octal parameters (report + by Werner Fink, cf: 20230408) + + update config.guess, config.sub + +20240224 + + improve man/curs_mouse.3x style (Branden Robinson, Sven Joachim). + + provide for CCHARW_MAX greater than 1 + + eliminate use of PATH_MAX in lib_trace.c + + work around misconfiguration of MacPorts gcc13, which exposes invalid + definition of MB_LEN_MAX in gcc's fallback copy of limits.h (MacPorts + #69374). + +20240217 + + add vt100+noapp, vt100+noapp+pc, xterm+app+pc, xterm+decedit from + xterm #389 -TD + + fix inconsistent description of wmouse_trafo() (Debian #1059778). + + modify wenclose() to handle pads (Debian #1059783). + + improve manpage discussion of mouseinterval() (Debian #1058560). + +20240210 + + compiler-warning fixes, while investigating an optimizer bug in + "gcc (MacPorts gcc13 13.2.0_4+stdlib_flag) 13.2.0" + which results in only the first byte of a multibyte character being + printed to the screen. + +20240203 + + minor changes to tracing and locale-checks. + +20240127 + + amend change to z39-a (report by Sven Joachim). + + use xterm+nopcfkeys, vt52-basic, dec+pp, dec+sl, vt52+arrows, + hp+pfk+cr, klone+acs, klone+color, klone+sgr, ncr160wy50+pp + to trim -TD + + NetBSD-related fixes for x68k and wsvt25 (patch by Thomas Klausner) + +20240120 + + improve formatting/style of manpages (patches by Branden Robinson). + + amend discussion of aliases in tput.1 + + use ansi+sgrbold, ansi+sgrdim, ansi+sgrso, ansi+sgrul, ansi+tabs + ecma+color, ecma+sgr, vt100+4bsd, vt100+pfkeys, vt220+pcedit + xterm+256color, xterm+acs, xterm+nopcfkeys, xterm+pcf2 to trim -TD + + modify configure scripts/makefiles to omit KEY_RESIZE if the + corresponding SIGWINCH feature is disabled. + +20240113 + + improve formatting/style of manpages (patches by Branden Robinson). + + modify dist.mk to avoid passing developer's comments in manpages into + the generated html documentation. + + use ansi+local, ansi+local1, ansi+pp, ansi+rca, ansi+rca2, ansi+sgr + to trim -TD + + restore padding for wy520* and vt320-k311 (report by Sven Joachim). + +20240106 + + use ansi+arrows, ansi+apparrows, ansi+csr, ansi+erase, ansi+idc, + ansi+idc1, ansi+idl, ansi+idl1, ansi+inittabs to trim -TD + + minor manpage formatting changes for consistency. + + modify doc-html test package's install-directory, per lintian. + + add attr_get.3x to man_db.renames.in (patch by Sven Joachim). + +20231230 + + improve formatting/style of manpages (patches by Branden Robinson). + + add ms-vt100-16color, winconsole -TD + + add rio, rio-direct -TD + + add mostlike -TD + + add wezterm, contour -TD + +20231223 + + improve formatting/style of manpages (patches by Branden Robinson). + +20231217 + + improve formatting/style of manpages (patches by Branden Robinson). + + correct an assignment in infocmp "-u" for detecting if a boolean + is unset in a base entry and set in a use'd chunk, i.e., if it was + cancelled. + + modify infocmp "-u" option to not report cancels for strings which + were already cancelled in a use'd chunk. + + join two lines in infotocap.3x to eliminate a spurious "description" + link in installed manpages (report by Sven Joachim). + + fix typo in NEWS (report by Sven Joachim). + +20231209 + + modify infocmp "-u" option to not report cancels in use'd chunks + which are not mentioned in the top-level terminal description. + + remove xterm+sm+1006 from tmux (Debian #1057688). + + used "infocmp -u" to help trim redundant capabilities -TD + + updated man/edit_man.sh to allow for "\%" markers embedded after + bold font escapes in manpage cross-references (Debian #1057651). + + reduce compiler-warnings in configure checks + +20231202 + + correct initial alignment of extended capabilities in infocmp, so + that the "-u" option can be used for more than two terminal types. + + improve formatting/style of manpages, changing environment variables + to italics (patches by Branden Robinson). + +20231125 + + add information about "ttycap", termcap's forerunner, to tset.1 + (patch by Branden Robinson). + + improve formatting/style of manpages, including section reordering + (patches by Branden Robinson). + + modify usage messages in configure script, bracketing optional values + (report by Branden Robinson). + +20231121 + + amend fix for Debian #1055882, correcting nul terminator check in + waddnstr (Debian #1056340). + +20231118 + + improve description of length-parameter and error-returns in several + manpages: curs_addchstr.3x, curs_addstr.3x, curs_addwstr.3x, + curs_in_wch.3x, curs_in_wchstr.3x, curs_inchstr.3x, curs_ins_wstr.3x, + curs_insstr.3x, curs_instr.3x, curs_inwstr.3x + + amend parameter check for entire string versus specific length in + winsnstr() and wins_nwstr() to match Solaris. + + make similar correction to wins_nwstr(). + + correct loop termination condition in waddnstr() and waddnwstr() + (Debian #1055882, cf: 20201205). + +20231111 + + used "infocmp -u" to help trim redundant capabilities -TD + + add limit checks in infocmp needed when processing extended + capabilities with the "-u" option. + + fix inconsistent sort-order in see-also sections of manpages. + + fix a few compiler warnings for Solaris 10. + + modify endwin() to return an error if it is called again without an + intervening screen update (report by Rajeev Pillai, NetBSD #57592). + +20231104 + + modify reset command to avoid altering clocal if the terminal uses a + modem (prompted by discussion with Werner Fink, Michal Suchanek, + OpenSUSE #1201384, Debian #60377). + + build-fixes for --with-caps variations. + + correct a couple of section-references in INSTALL. + +20231028 + + move xterm focus mode 1004 from xterm+sm+1006 into xterm+focus as + fe/fd capabilities, like vim (vim-pr #13440). + + modify --with-pkg-config-libdir option to make "libdir" the default, + as documented, rather than "auto" (report by Branden Robinson). + + improve messages from configure script (patches by Branden Robinson). + +20231021 + + use oldxterm+sm+1006 in vte-2014 (report by Benno Schulenberg) -TD + + add ansi+apparrows -TD + + change defaults for configure opaque and widec options (prompted by + discussion with Branden Robinson). + + minor cleanup of compiler- and manpage-warnings. + +20231016 + + make the recent change to setupterm optional "--enable-check-size" + (Debian #1054022). + +20231014 + + improve formatting/style of manpages (patches by Branden Robinson). + + updated configure script macro CF_XOPEN_SOURCE, for uClibc-ng + + update config.guess, config.sub + +20231007 + + improve loop-limit for get_position(). + + improve manual description of immedok (Debian #1053603). + + fix a few formatting issues with manpages (Debian #1053123). + + improve formatting/style of manpages (patches by Branden Robinson). + +20231001 + + modify setupterm to provide for using ANSI cursor-position report (in + user6/user7 terminfo capabilities) to obtain screensize if neither + environment variables or ioctl is used. The ncurses test-program + with options "-E -T" demonstrates this feature. + + improve error messages in tic (patch by Branden Robinson). + + improve formatting/style of manpages (patches by Branden Robinson). + + modify test/clip_printw.c to optionally test non-wrapped updates. + + fix reallocation loop for vsnprintf() in _nc_sprintf_string() by + copying the va_list variable (patch by Ian Abbott). + +20230923 + + improve formatting of manpages (patches by Branden Robinson). + + amend change to delscreen() to limit the windows which it creates to + just those associated with the screen (report by Frederic Boiteux, + cf: 20220813). + +20230918 + + new tarball/errata (report by Sven Joachim). + +20230917 + + improve formatting of manpages (integrated patches by Branden + Robinson). + + correct limit for name-length in write_entry.c (report/testcase by + Luna Saphie Mittelbach). + + limit delays to 30 seconds, i.e., padding delays in terminfo, as well + as napms() and delay_output() functions. + + improve a few pointer-checks. + + improve parsing in _nc_msec_cost, allowing a single decimal point. + +20230909 + + improve formatting of manpages (patches by Branden Robinson), for + captoinfo.1m and terminfo.5 + > patches by Nicholas Marriott: + + use string-hacks in alloc_entry.c, alloc_type.c and hardscroll.c, + overlooked due to compiler changes in recent OpenBSD releases. + + add "-6" option to ncu2openbsd script. + +20230902 + + improve description of search rules for terminal descriptions in + terminfo manpage (report by Sven Joachim). + +20230826 + + fixes for compiler-warnings. + + update config.guess, config.sub + +20230819 + + various manpage-formatting fixes. + + correct formatting of table header in curs_inopts.3x (Branden + Robinson). + + correct manpage description of panel_hidden (report by Benjamin + Mordaunt). + +20230812 + + add/use putty+cursor to reflect amending of modified cursor-keys in + 2021 -TD + + add ecma+strikeout to putty -TD + + add functions to query tty-flags in SCREEN (request by Bill Gray). + +20230805 + + fix a few manpages needing tbl marker, seen by lintian warning. + + fixes for compiler-warnings. + + minor grammatical fix for manpages (Branden Robinson). + +20230729 + + improve manpages for wgetnstr() and wget_nwstr(). + + modify MinGW configuration to provide for running in MSYS/MSYS2 + shells, assuming ConPTY support (patch by Pavel Fedin). + + add assignment in CF_MAN_PAGES to fill in value for TERMINFO_DIRS in + ncurses, terminfo and tic manpages (patch by Sven Joachim). + +20230722 + + add "auto" default for --with-xterm-kbs configure option. + +20230715 + + correct wadd_wch_literal() when adding a non-spacing character to a + double-width character. + + improve manual page for curs_util. + + improve manual page for wadd_wch(). + +20230708 + + add linux+kbs for terminals which imitate xterm's behavior with + Linux -TD + + modify MinGW driver to return KEY_BACKSPACE when an unmodified + VK_BACK virtual key is entered (prompted by patch by Pavel Fedin, + Savannah #64292). + + disallow using $TERMINFO or $HOME/.terminfo when tic "-o" option is + used (report by Sven Joachim, Debian #1040048). + +20230701 + + fix mandoc warnings about unnecessary markup. + + improve parameter check in tparm_setup() + +20230625 + + adjust man/make_sed.sh to work with dates as the third field of TH. + + fixes for out-of-memory condition (report by "eaglegai"). + +20230624 + + fixes for out-of-memory condition (report by "eaglegai"). + +20230617 + + markup manpages with revision information (prompted by discussion + with Bjarni Ingi Gislason). + +20230615 + + modify _nc_read_file_entry() to show relevant filename in warnings. + + improve checks in convert_string() for corrupt terminfo entry (report + and test-case by Gregory James Duck). + +20230610 + + improve manpages discussing file descriptors in low-level functions. + + modify flushinp to use file descriptors in SCREEN, rather than from + TERMINAL, and check if they are for a terminal, like SVr4. + + modify mcprint to use file descriptor in SCREEN, for consistency. + + add xterm+focus to foot+base (patch by Daniel Ekloef). + + correct definition of Charable() for non-wide ncurses library (report + and test-case by Zbigniew Baniewski). + +20230603 + + add configure option --with-strip-program, to override program + chosen by the install program for stripping executables (prompted + by discussion with Aapo Rantalainen). + + fix typo in INSTALL (report/patch by Aapo Rantalainen). + + improve error-checks for isEILSEQ() + + increase MB_CUR_MAX to 16, matching glibc's MB_LEN_MAX. + + corrected mouse mask in test/testcurs.c + + improve thread lock in lib_trace.c + +20230527 + + fixes for compiler warnings/cppcheck. + +20230520 + + fixes for compiler warnings in MinGW environments. + +20230514 + + modify test-package "ncurses6-doc" to use manpage-aliases, which in + turn required a change to the configure script to factor in the + extra-suffix option when deriving alias names. + + add mode 1004 to xterm+sm+1006 from xterm #380 -TD + +20230506 + > build-fixes related to configure-options and/or platform: + + fix for --enable-fvisibility + + fix for unusual values of --with-rel-version + + fix for unusual values of --with-abi-version + + fix for --disable-tcap-names + + fix for termcap in nc_access.h (report by Werner Fink). + +20230429 + + revise recent change to _nc_write_entry to isolate it to a Cygwin bug + (cf: 20230311) + + amend fix for wgetnstr, wgetn_wstr to use cbreak mode unless raw + mode was set (cf: 20210522). + + fix a few warnings from cppcheck, etc. + + correct copy/paste error in nc_access.h (report by Werner Fink). + +20230424 + + check return value of _nc_save_str(), in special case for tic where + extended capabilities are processed but the terminal description was + not initialized (report by Ziqiao Kong). + + regenerate llib-* files. + +20230423 + + add tiscan_s() to help applications check formatting capabilities + that would be passed to tiparm_s, etc. + + add tiparm_s() to provide applications a way to tell ncurses what + the expected parameters are for a capability (tmux #3531). + + improve check in lib_tparm.c, ensuring that a char* fits into a + TPARM_ARG. + + add --disable-setuid-environ configure option (request by Sven + Joachim). + + drop compatibility with obsolete versions of tack, e.g., pre-1.08 + (Debian #1034549, cf: 20170722). + +20230418 + + improve checks for limits on privileged execution: + + modify _nc_syserr_abort() to use _nc_env_access(), rather than + only checking root uid. + + use getauxval() when available, to improve setuid/setgid checks. + + modify test packages to disable root access/environ options. + + modify tgoto() to accept no-parameter capabilities, for joe editor + (OpenSUSE #1210485, Gentoo #904263). + +20230415 + + configure script fixes: + + fix copy/paste error in configure option --disable-root-access + (report/patch by Sven Joachim). + + modify CF_XOPEN_SOURCE macro's amend default case to avoid + undefining _XOPEN_SOURCE if _POSIX_C_SOURCE is defined. + + modify test_tparm to account for extended capabilities. + + add checks in tparm() and tiparm() for misuse of numeric parameters, + overlooked in 20230408. + + fix errata in clear.1 and curs_terminfo.3x + +20230408 + + document limitations of tparm, and error-returns in curs_terminfo.3x + + document limitations of tgoto, and error-returns in curs_termcap.3x + + add xterm+focus to alacritty+common (patch by Christian Duerr). + + add "-v" option to tput, to show warnings. + > improve checks for malformed terminfo data (report/analysis by + Jonathan Bar Or, Michael Pearse, Emanuele Cozzi). + + make the parameter type/count checks in _nc_tiparm() more stringent + + update tgoto() to account for _nc_tiparm() changes + + add checks in tparm() and tiparm() for misuse of string parameters + + add special cases in tput to handle extensions Cs/Ms parameters + + ignore compiled-terminfo where the array sizes exceed the standard + +20230401 + + modify experimental Windows driver to work with xterm mouse protocol. + + remove DECCOLM+DECSCLM from foot (patch by Daniel Ekloef). + +20230311 + + improve manpage description for addch versus unctrl format used for + non-printable characters. + + modify version-check for gcc/g++, now works for msys2. + + modify check in _nc_write_entry() for multiply defined aliases to + report problems within the current runtime of tic rather than for + conflicts with pre-existing terminal descriptions. + + allow for MinGW32-/64-bit configurations to use _DEFAULT_SOURCE + + clarify interaction of -R option versus -C, -I and -r in infocmp + manpage. + + build-fix in lib_win32con.c (cf: 20230211). + +20230225 + + build-fixes for rpm test-packages. + + add/use configure check for clock_gettime(), to supersede + gettimeofday(). + +20230218 + + configure-script improvements: + + recent msys2 headers work with _DEFAULT_SOURCE; amend check + + use $ac_includes_default in most cases where stdlib.h should work + + use #error consistently vs "make an error" + + add configure macro for gettimeofday vs inline check + +20230211 + + set dwShareMode in calls to CreateConsoleScreenBuffer() (patch by + Hannes Domani). + + use CreateFile with "CONIN$", "CONOUT$" rather than GetStdHandle to + obtain a handle on the actual console, avoiding redirection in the + MinGW/Win32 configurations (adapted from patch by LIU Hao). + +20230128 + + document XF, kxIN and kxOUT -TD + + add note on sun/wscons/cmdtool/shelltool -TD + + modify configure script check for pkg-config library directory to + take into account an older version 0.15.0 which used PKG_CONFIG_PATH + but not PKG_CONFIG_LIBDIR + +20230121 + + correct limit-check when dumping tc/use clause via tic -I (report by + Gabriel Ravier). + + correct a check for manpage-alias in edit_man.sh, to work with out of + tree builds (report by Sven Joachim). + +20230114 + + change RV to XR/xr, to avoid conflict with pre-existing usage in vim, + to use RV/rv to denote DA2 and its response (discussion with Bram + Moolenaar) -TD + + add XF flag to xterm+focus so that termcap applications can be aware + of terminals which may support focus in/out -TD + + use xterm+focus in xterm-p370 and tmux -TD + + improve configure-script macros vs compiler warnings. + +20230107 + + add --with-abi-altered configure option (prompted by discussion with + Brian Inglis). + + add BSD erase2 to characters handled by tset/reset. + + improve configure-script macros vs compiler warnings. + + regenerate configure scripts with autoconf 2.52.20221202 + + add RV report+version (suggested by Bram Moolenaar). + + add comment to bracketed+paste explaining that vim patch 9.0.1117 is + needed for use with the updated xterm descriptions (suggested by Bram + Moolenaar). + +20221231 6.4 release for upload to ftp.gnu.org + + update release notes + + regenerate llib-* files. + + correct PS vs PE names in bracketed+paste (report by Bram Moolenaar) + -TD + +20221224 + + add mutex lock/unlock in a few places reported by thread-sanitizer + + add/use bracketed+paste to help identify terminals supporting this + xterm feature (prompted by discussion with Bram Moolenaar) -TD + +20221217 + + install Ada95 sample programs in libexecdir, adding a wrapper + script to invoke those. + +20221210 + + add minimal -h/-V getopt logic to the remaining test-programs. + + free new_pair() data in delscreen (report by "magiblot"). + + add clarification of the scope of dynamic variables in terminfo(5). + + remove a stray '/' from description of %g in terminfo(5). + +20221203 + + add -h usage and -V version options to the test-programs which use + getopt. + + use "command -v" rather than "type" in Ada95/gen/Makefile.in to fix + a portability issue (patch by Nicolas Boulenguez). + + update ncurses-howto, more documentation fixes along with corrections + to example programs. + +20221126 + + fix an error in pathname of explain.txt (cf: 20200201). + + fix an error in "@" command in test/ncurses.c F-menu (cf: 20190121). + + improve formatting of ncurses-intro.html and hackguide.html + + improve man/curs_clear.3x links to other pages + +20221119 + + use static libraries for AdaCurses test-package for Mageia, since no + gprbuild package is available. + + updated test packages for Debian. + +20221112 + + build-fixes for AdaCurses RPM test-package. + +20221105 + + regenerate configure scripts with autoconf 2.52.20221009 + + modify "--with-manpage-format" to support bzip2 and xz compression + (prompted by discussion with Sam James). + + modify make-tar.sh scripts to make timestamps more predictable. + +20221029 + + improve curs_slk.3x discussion of extensions and portability (report + by Bill Gray). + +20221023 + + change man_db.renames to template, to handle ncurses*-config script + with the extra-suffix configure option. + +20221015 + + fix another memory-leak in tic. + + update install-sh script from autoconf, to fix install problem for + Ada95 with Arch; as noted in + https://lists.gnu.org/archive/html/automake/2018-09/msg00005.html + there are unaddressed issues. + + update CF_XOPEN_SOURCE, adding GNU libc suffixes for abi64, abin32, + x32 (report by Sven Joachim): + + correct ifdef's for _nc_set_read_thread() (patch by Mikhail Korolev, + cf: 20220813). + +20221008 + + correct a switch-statement case in configure script to allow for test + builds with ABI=7. + + modify misc/gen-pkgconfig.in to allow for the case where the library + directory does not yet exist, since this is processed before doing an + install (report by Michal Liszcz). + +20221001 + + modify configure/scripts to work around interference by GNU grep 3.8 + (report by Sam James). + + update CF_XOPEN_SOURCE, adding variants "gnueabi" and "gnueabihf" to + get _DEFAULT_SOURCE special case (report by Adam Sampson) + +20220924 + + modify configure macro CF_BUILD_CC to check if the build-compiler + works, rather than that it is different from the cross-compiler, e.g., + to accommodate a compiler which can be used for either purpose with + different flags (report by Mikhail Korolev). + + fix another memory-leak in tic. + + correct change for cppcheck in menu library (report/analysis by + "tuxway", cf: 20220903). + + update config.guess, config.sub + +20220917 + + reduce memory-leak in tic by separating allocations for struct entry + from TERMTYPE2 (cf: 20220430). + + improve interaction between tic -v option and NCURSES_TRACE, by + processing the latter only when -v option does not set _nc_tracing. + + modify curses_trace() to show the trace-mask as symbols, e.g., + TRACE_ORDINARY, DEBUG_LEVEL(3). + +20220910 + + amend verbose-option change to make this affect level 3, e.g., using + "tic -cv3 terminfo". + + work around musl's nonstandard use of feature test macros by adding + a definition for NCURSES_WIDECHAR to the generated ".pc" and *-config + files (report by Sam James). + +20220903 + + modify verbose-option of infocmp, tic, toe to enable debug-tracing + if that is configured. + +20220827 + + modify configure scripts to use overlooked cases for LD and + PKG_CONFIG variables (report by Alan Webb, Gentoo #866398). + + modify nsterm to use xterm+alt1049 (report by Paul Handly) -TD + + modify putty to use xterm+alt1049 -TD + +20220820 + + fix some cppcheck warnings, mostly style, in ncurses and c++ + libraries and progs directory. + + add curses_trace to ifdef's for START_TRACE in test/test.priv.h + + update config.guess + +20220813 + + modify delscreen to more effectively delete all windows on the given + screen. + + amend portability note for delwin in manual page. + + adapt test/test_delwin.c from example by Bill Gray. + + account for prescreen data if freeing leaks in pthread-configuration + + split-out _nc_set_read_thread(), to reduce compiler warnings about + pthread_self(), which may/may not be a weak symbol. + + improve pthread-configuration for test/worm.c + +20220806 + + amend end_of_stream() to allow for input files without a final + newline. + + check for non-textfiles to tic. + +20220729 + + fixes to build with dietlibc: + + add configure check for fpathconf (report by Georg Lehner). + + add configure check for math sine/cosine, needed in test/tclock, + and eliminate pow() from test/hanoi (report by Georg Lehner). + + use wcsnlen as an alternative to wmemchr if it is not found + (adapted from patch by Georg Lehner). + + trim out some unwanted linker options from ncurses*config and .pc + files seen in Fedora 36+. + +20220724 + + add portability notes for delscreen and delwin in manual. + + improve pthread-configuration for test/worm.c, test/rain.c + + improve pointer/limit checks associated with deleting a screen + (Debian #1015756). + +20220716 + + build-fix for test_mouse.c, for non-standard cfmakeraw. + + improve shell-scripts with shellcheck + + fix typo in run_tic.in (report/patch by Jan Starke). + +20220709 + + lock the prescreen data consistently in newterm, etc., for the + pthreads configuration (report by Tom de Vries). + +20220703 + + add consistency check in tic for u6/u7/u8/u9 and NQ capabilities. + + use NQ to flag entries where the terminal does not support query and + response -TD + + use ansi+enq and decid+cpr in cases where the terminal probably + supported the u6-u9 extension -TD + + add/use apollo+vt132, xterm+alt47 -TD + +20220625 + + improve man/curs_bkgd.3x, explaining that bkgdset can affect results + for bkgd (report by Anton Vidovic). + + correct dsl in dec+sl (report by Rajeev Pillai) -TD + + add/use ansi+cpr, decid+cpr -TD + +20220618 + + add a null-pointer check for term_names field in copy_termtype(), + needed for MinGW port (report by Peiyuan Song, cf: 20220521). + + revise kon/kon2/jfbterm to undo "linux2.6" change to + smacs/rmacs/enacs (Debian #1012800) -TD + + amended note for att610+cvis0, as per documentation for att610, + att620, att730 -TD + +20220612 + + modify waddch_literal() to allow for double-width base character when + merging a combining character (report by Gavin Troy). + + improve _tracecchar_t2() formatting of base+combining character. + +20220604 + + add note on portable memory-leak checking in man/curs_memleaks.3x + + remove u6-u9 from teken-2018 -TD + + set "xterm-new" to "xterm-p370", add "xterm-p371" -TD + +20220529 + + expanded notes for teken/syscons -TD + + fix overlooked copying of extended string-heap in copy_termtype + (cf: 20220430). + + update config.guess + +20220521 + + improve memory-leak checking in several test-programs. + + set trailing null on string passed from winsnstr() to wins_nwstr(). + + modify del_curterm() to fix memory-leak introduced by change to + copy_termtype(). + +20220514 + + further improvements to test/test_mouse.c; compare with ncurses test + program menu A/a. + +20220507 + + add test/test_mouse.c (patch by Leonid S Usov). + + add a few debug-traces for tic, fix a couple of memory-leaks. + +20220501 + + build-fix for debug-traces (report/patch by Chris Clayton). + +20220430 + + modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and + also provide for focus in/out responses -TD + + modify default case in handle_wheel() to always report button-release + events, e.g., for xterm mouse mode 1003 (patch by Leonid S Usov). + + improve valid_entryname() to disallow characters used in terminfo + syntax: '#', '=', '|', '\'. + + alter copy_termtype() to allocate new str_table and ext_str_table + data rather than relying upon its callers. + + use calloc in _nc_init_entry() when allocating stringbuf, to ensure + it is initialized. + + add library-level TYPE_CALLOC for consistency with TYPE_MALLOC. + + add some debug-traces for tic/infocmp. + +20220423 + + in-progress work on invalid_merge(), disable it (cf: 20220402). + + fix memory leak in _nc_tic_dir() when called from _nc_set_writedir(). + + fix memory leak in tic when "-c" option is used. + +20220416 + + add a limit-check to guard against corrupt terminfo data + (report/testcase by NCNIPC of China). + + add check/warning in configure script if option --with-xterm-kbs is + missing or inconsistent (Arch #74379). + + add setlocale call to several test-programs. + + allow extended-color number in opts parameter of wattr_on. + +20220409 + + add test/test_unget_wch.c + +20220402 + + amend extended_captype(), returning CANCEL if a string is explicitly + cancelled. + + make description-fields distinct -TD + +20220326 + + update teken -TD + + add teken-16color, teken-vt and teken-sc -TD + + add a few missing details for vte-2018 (report by Robert Lange) -TD + +20220319 + + add xgterm -TD + + correct setal in mintty/tmux entries, add to vte-2018 (report by + Robert Lange) + + add blink to vte-2018 (report by Robert Lange) + + improve tic warning about XT versus redundant tsl, etc. + +20220312 + + add xterm+acs building-block -TD + + add xterm-p370, for use in older terminals -TD + + add dec+sl to xterm-new, per xterm patch #371 -TD + + add mosh and mosh-256color -TD + +20220305 + + replace obsolescent "-gnatg" option with "-gnatwa" and "-gnatyg", to + work around build problems with gnat 12. + + update external links in Ada95.html + + trim unused return-value from canonical_name(). + +20220226 + + fix issues found with coverity: + + rewrite canonical_name() function of infocmp to ensure buffer size + + corrected use of original tty-modes in tput init/reset subcommands + + modify tabs program to limit tab-stop values to max-columns + + add limit-checks for palette rgb values in test/ncurses.c + + add a few null-pointer checks to help with static-analysis. + + enforce limit on number of soft-keys used in c++ binding. + + adjust a buffer-limit in write_entry.c to quiet a bogus warning from + gcc 12.0.1 + +20220219 + + expanded description in man/resizeterm.3x + + additional workaround for ImageMagick in test/picsmap.c + +20220212 + + improve font-formatting in other manpages, for consistency. + + correct/improve font-formatting in curs_wgetch.3x (patch by Benno + Schulenberg). + +20220205 + + workaround in test/picsmap.c for use of floating point for rgb values + by ImageMagick 6.9.11, which appears to use the wrong upper limit. + + improve use of "trap" in shell scripts, using "fixup-trap". + +20220129 + + minor updates for test-packages + + improve handling of --with-pkg-config-libdir option, allowing for the + case where either $PKG_CONFIG_LIBDIR or the option value has a + colon-separated list of directories (report by Rudi Heitbaum, + cf: 20211113). + + update kitty -TD + +20220122 + + add ABI 7 defaults to configure script. + + add warning in configure script if file specified for "--with-caps" + does not exist. + + use fix for CF_FIX_WARNINGS from cdk-perl, ignoring error-exit on + format-warnings. + + improve readability of long parameterized expressions with the + infocmp "-f" option by allowing split before a "%p" marker. + +20220115 + + improve checks for valid mouse events when an intermediate mouse + state is not part of the mousemask specified by the caller (report by + Anton Vidovic, cf: 20111022). + + use newer version 1.36 of gnathtml for generating Ada html files. + +20220101 + + add section on releasing memory to curs_termcap.3x and + curs_terminfo.3x manpages. + +20211225 + + improve markup, e.g., for external manpage links in the manpages + (prompted by report by Helge Kreutzmann). + +20211219 + + install ncurses-examples programs in libexecdir, adding a wrapper + script to invoke those. + + add help-screen and screen-dump to test/combine.c + +20211211 + + add test/combine.c, to demo/test combining characters. + +20211204 + + improve configure check for getttynam (report by Werner Fink). + +20211127 + + fix errata in description fields (report by Eric Lindblad) -TD + + add x10term+sl, aixterm+sl, ncr260vp+sl, ncr260vp+vt, wyse+sl -TD + +20211120 + + add dim, ecma+strikeout to st-0.6 -TD + + deallocate the tparm cache when del_curterm is called for the last + allocated TERMINAL structure (report/testcase by Bram Moolenaar, + cf: 20200531). + + modify test-package to more closely conform to Debian multi-arch. + + if the --with-pkg-config-libdir option is not given, use + ${libdir}/pkgconfig as a default (prompted by discussion with Ross + Burton). + +20211115 + + fix memory-leak in delwin for pads (report by Werner Fink, OpenSUSE + #1192668, cf: 20211106), + +20211113 + + minor clarification to clear.1 (Debian #999437). + + add xterm+sl-alt, use that in foot+base (report by Jonas Grosse + Sundrup) -TD + + improve search-path check for pkg-config, for Debian testing which + installs pkg-config with architecture-prefixes. + +20211106 + + improve check in misc/Makefile.in for empty $PKG_CONFIG_LIBDIR + + modify wnoutrefresh to call pnoutrefresh if its parameter is a pad, + rather than treating it as an error, and modify new_panel to permit + its window-parameter to be a pad (report by Giorgos Xou). + + fix a memory-leak in del_curterm (prompted by discussion with Bram + Moolenaar, cf: 20210821). + +20211030 + + simplify some references to WINDOWS._flags using macros. + + add a "check" rule in Ada95 makefile, to help with test-packages. + + build-fix for cross-compiling to MingW, conditionally add -lssp + +20211026 + + corrected regex needed for older pkg-config used in Solaris 10. + + amend configure option's auto-search to account for systems where + none of the directories known to pkg-config exist, adapted from + mailing-list comment (report by Milan P. Stanic). + +20211021 6.3 release for upload to ftp.gnu.org + + update release notes + + add "ncu2openbsd" script, to illustrate how to update an OpenBSD + system to use a current ncurses release. + +20211018 + + check for screen size-change in scr_init() and scr_restore(), in case + a screen dump does not match the current screen dimensions (report by + Frank Tkalcevic). + +20211017 + + amend change for pkg-config to account for "none" being returned in + the libdir-path result rather than "no" (report by Gabriele Balducci). + +20211016 + + build-fix for pmake with libtool. + + improve make-tar.sh scripts, adding COPYING to tar file, and clean up + shellcheck warnings. + + add link for "reset6" manpage in test-package ncurses6-doc + + revise configure option --with-pkg-config-libdir, using the actual + search path from pkg-config or pkgconf using the output from --debug + (report by Pascal Pignard). + + freeze ABI in ".map" files. + +20211009 + + implement "+m" option in tabs program. + + fill in some details for infoton -TD + + fix spelling/consistency in several descriptions -TD + + use vt420+lrmm in vt420 -TD + + modify save_tty_settings() to avoid opening /dev/tty for cases other + than reset/init, e.g., for clear. + + modify output of "toe -as" to show first description found rather + than the last. + + improve tic checks for number of parameters of smglp, smgrp, smgtp, + and smgbp (cf: 20020525). + + correct off-by-one comparison in last_char(), which did not allow + special case of ":" in a terminfo description field (cf: 20120407). + + remove check in tic that assumes that none or both parameterized and + non-parameterized margin-setting capabilities are present + (cf: 20101002). + +20211002 + + use return-value from vsnprintf to reallocate as needed to allow for + buffers larger than the screen size (report by "_RuRo_"). + + modify tset "-q" option to refrain from modifying terminal modes, to + match the documentation. + + add section on margins to terminfo.5, adapted from X/Open Curses. + + make tput/tset warning messages consistently using alias names when + those are used, rather than the underlying program's name. + + improve tput usage message for aliases such as clear, by eliminating + tput-specific portions. + + add a check in toe to ensure that a "termcap file" is text rather + than binary. + + further build-fixes for OpenBSD 6.9, whose header files differ from + the other BSDs. + +20210925 + + add kbeg to xterm+keypad to accommodate termcap applications -TD + + add smglp and smgrp to vt420+lrmm, to provide useful data for the + "tabs" +m option -TD + + build-fix for gcc 3.4.3 with Solaris10, which does not allow forward + reference of anonymous struct typedef. + + modify tput to allow multiple commands per line. + + minor fixes for tset manpage. + +20210911 + + adjust ifdef in test_opaque.c to fix build with ncurses 5.7 + + add testing note for xterm-{hp|sco|sun} -TD + + corrected description for ansi.sys-old -TD + + add xterm+nopcfkeys, to fill in keys for xterm-hp, xterm-sun -TD + + use hp+arrows in a few places -TD + + use hp+pfk-cr in a few places -TD + +20210905 + + correct logic in filtering of redefinitions (report by Sven Joachim, + cf: 20210828). + +20210904 + + modify linux3.0 entry to reflect default mapping of shift-tab by + kbd 1.14 (report by Jan Engelhardt) -TD + + add historical note to tput, curses-terminfo and curses-color + manpages based on source-code for SVr2, SVr3 and SVr4. + + minor grammatical fixes for "it's" vs "its" (report by Nick Black). + + amend fix for --disable-root-environ (report by Arnav Singh). + + build-fix for compiling link_test + + drop symbols GCC_PRINTF and GCC_SCANF from curses.h.in, to simplify + use (Debian #993179). + +20210828 + + correct reversed check for --disable-root-environ (report/analysis + by Arnav Singh, cf: 20210626). + + apply gcc format attribute to prototypes which use a va_list + parameter rather than a "..." variable-length parameter list + (prompted by discussion in a tmux pull-request). + + modify configure scripts to filter out redefinitions of _XOPEN_SOURCE, + e.g., for NetBSD which generally supports 500, but 600 is needed for + ncursesw. + + improve documentation for tparm and static/dynamic variables. + + improve typography in terminfo.5 (patch by Branden Robinson). + +20210821 + + improve tparm implementation of %P and %g, more closely matching + SVr4 terminfo. + + move internals of TERMINAL structure to new header term.priv.h + + add "check" rule for ncurses/Makefile + + corrected tsl capability for terminator -TD + + add check in tic to report instances where tparm would detect an + error in an expression (cf: 20201010). + + correct a few places where SP->_pair_limit was used rather than + SP->_pair_alloc (cf: 20170812). + + fix missing "%d" for setaf/setab code 8-15 in xterm+direct16 (report + by Florian Weimer) -TD + + fix some documentation errata from OpenBSD changes. + + update config.sub + +20210814 + + add workaround for broken pcre2 package in Debian 10, from xterm #369. + +20210807 + + ignore "--dynamic-linker" option in generated pkg/config files, + adapted from "distr1" patch. + + add CF_SHARED_OPTS case for Haiku, from patch in haikuports. + +20210731 + + add extensions in xterm+tmux and ecma+strikeout to ms-terminal, + but cancel the non-working Cr and Ms capabilities -TD + + add foot and foot-direct -TD + +20210724 + + add workaround for Windows Terminal's problems with CR/LF mapping to + ms-terminal (patch by Juergen Pfeifer). + + review/update current Windows Terminal vs ms-terminal -TD + +20210718 + + correct typo in "vip" comments (report by Nick Black), reviewed this + against Glink manual -TD + + fill in some missing pieces for pccons, to make it comparable to the + vt220 entry -TD + + modify mk-1st.awk to account for extra-suffix configure option + (report by Juergen Pfeifer). + + change default for --disable-wattr-macros option to help packagers + who reuse wide ncursesw header file with non-wide ncurses library. + + build-fix for test/test_opaque.c, for configurations without opaque + curses structs. + +20210710 + + improve history section for tset manpage based on the 1BSD tarball, + which preceded BSD's SCCS checkins by more than three years. + + improve CF_XOPEN_CURSES macro used in test/configure (report by Urs + Jansen). + + further improvement of libtool configuration, adding a dependency of + the install.tic rule, etc., on the library in the build-tree. + + update config.sub + +20210703 + + amend libtool configuration to add dependency for install.tic, etc., + in ncurses/Makefile on the lower-level libraries. + + modify configure script to support ".PHONY" make program feature. + +20210626 + + add configure option --disable-root-access, which tells ncurses to + disallow most file-opens by setuid processes. + + use default colors in pccon "op" -TD + + correct rmacs/smacs in aaa+dec, aaa+rv -TD + + add hpterm-color2 and hp98550-color (Martin Trusler) + + regenerate man-html documentation. + +20210619 + + improve configure-macro used for dependencies of --disable-leaks such + as --with-valgrind + + trim trailing blanks from files + +20210612 + + fixes for scan-build, valgrind build/testing. + + update config.guess + +20210605 + + add a summary of ncurses-specific preprocessor symbols to curses.h + (prompted by discussion with Peter Farley, Bill Gray). + +20210522 + + regenerate configure scripts with autoconf 2.52.20210509 to eliminate + an unnecessary warning in config.log (report by Miroslav Lichvar). + + add a note in manual page to explain ungetch vs unget_wch (prompted + by discussion with Peter Farley). + + add sp-funcs for erasewchar, killwchar. + + modify wgetnstr, wgetn_wstr to improve compatibility with SVr4 curses + in its treatment of interrupt and quit characters (prompted by + report/testcase by Bill Gray) + + update config.guess, config.sub + +20210515 + + improve manual pages for wgetnstr, newwin (prompted by + report/testcase by Bill Gray). + +20210508 + + modify tputs' error check to allow it to be used without first + calling tgetent or setupterm, noting that terminfo initialization + is required for supporting the terminfo delay feature (report by + Sebastiano Vigna). + + fix several warnings from clang --analyze + + add null-pointer check in comp_parse.c, when a "use=" clause refers + to a nonexisting terminal description (report/patch by Miroslav + Lichvar, cf: 20210227). + +20210501 + + add a special case in the configure script to work around one of the + build-time breakages reported for OpenBSD 6 here: + https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + There is no workaround for the other issue, a broken linker spec. + + modify configure check for libtool to prevent accidental use of an + OpenBSD program which uses the same name. + + update config.guess, config.sub + +20210424 + + avoid using broken system macros for snprintf which interfere with + _nc_SLIMIT's conditionally adding a parameter when the string-hacks + configure option is enabled. + + add a "all::" rule before the new "check" rule in test/Makefile.in + +20210418 + + improve CF_LINK_FUNCS by ensuring that the source-file is closed + before linking to the target. + + add "check" rules for headers in c++, progs and test-directories. + + build-fix for termsort module when configured with termcap (reports + by Rajeev V Pillai, Rudi Heitbaum). + +20210417 + + extend --disable-pkg-ldflags option to also control whether $LDFLAGS + from the build is provided in -config and .pc files (Debian #986764). + + fix some cppcheck warnings, mostly style, in ncurses and c++ + libraries and progs directory. + + fix off-by-one limit for tput's processing command-line arguments + (patch by Hadrien Lacour). + +20210403 + + fix some cppcheck warnings, mostly style, in ncurses library and + progs directory. + + improve description of BSD-style padding in curs_termcap.3x + + improved CF_C11_NORETURN macro, from byacc changes. + + fix "--enable-leak" in CF_DISABLE_LEAKS to allow turning + leak-checking off later in a set of options. + + relax modification-time comparison in CF_LINK_FUNCS to allow it to + accept link() function with NFS filesystems which change the mtime + on the link target, e.g., several BSD systems. + + call delay_output_sp to handle BSD-style padding when tputs_sp is + called, whether directly or internally, to ensure that the SCREEN + pointer is passed correctly (reports by Henric Jungheim, Juraj + Lutter). + +20210327 + + build-fixes for Solaris10 /bin/sh + + fix some cppcheck warnings, mostly style, in ncurses test-programs, + form and menu libraries. + +20210323 + + add configure option --enable-stdnoreturn, making the _Noreturn + keyword optional to ease transition (prompted by report by + Rajeev V Pillai). + +20210320 + + improve parameter-checking in tput by forcing it to analyze any + extended string capability, e.g., as used in the Cs and Ms + capabilities of the tmux description (report by Brad Town, + cf: 20200531). + + remove an incorrect free in the fallback (non-checking) version of + _nc_free_and_exit (report by Miroslav Lichvar). + + correct use-ordering in some xterm-direct flavors -TD + + add hterm, hterm-256color (Mike Frysinger) + + if the build-time compiler accepts c11's _Noreturn keyword, use that + rather than gcc's attribute. + + change configure-check for gcc's noreturn attribute to assume it is + a prefix rather than suffix, matching c11's _Noreturn convention. + + add "lint" rule to c++/Makefile, e.g., with cppcheck. + +20210313 + + improve configure CF_LD_SEARCHPATH macro used for ncurses*-config and + ".pc" files, from dialog changes. + + reduce dependency of math-library in test programs. + + minor fixes for test_tparm.c (cf: 20210306) + + mention "ncurses" prefix in curses_version() manpage (report by + Michal Bielinski). + +20210306 + + improved test/test_tparm.c, by limiting the tests to capabilities + that might have parameters or padding, and combined with tputs test. + + improve discussion of padding versus tparm and tputs in + man/curs_terminfo.3x + + update portability note for FreeBSD in man/tput.1 + +20210227 + + modify tic/infocmp to eliminate unnecessary "\" to escape ":" in + terminfo format. + + add check in tic for duplicate "use=" clauses. + +20210220 + + improve tic warning when oc/op do not mention SGR 39/49 for xterm + compatible XT flag. + + revert change to lib_addch.c in waddch_literal() from 20210130, since + the followup fix in PutCharLR() actually corrects the problem while + this change causes too-early filling/wrapping (report by Johannes + Altmanninger). + + add/use vt220+pcedit and vt220+vtedit -TD + + add scrt/securecrt and absolute -TD + + add nel to xterm-new, though supported since X11R5 -TD + + add/use xterm+nofkeys -TD + + move use of ecma+italics from xterm-basic to xterm+nofkeys -TD + +20210213 + + add test/back_ground.c, to exercise the wide-character background + functions. + + add a check in _nc_build_wch() in case the background character is a + wide-character, rather than a new part of a multibyte character. + + improve tracemunch's coverage of form/menu/panel libraries. + + improve tracemunch's checking/reporting the type for the first + parameter, e.g., "WINDOW*" rather than "#1". + +20210206 + + provide for wide-characters as background character in wbkgrnd + (report/testcase by Anton Vidovic) + + add name for Fedora's pcre2 to configure check for "--with-pcre2" + option, from xterm #363 -TD + + modify adjustment in PutCharLR to restore the cursor position before + writing to the lower-right corner, rather than decrementing the + cursor column, in case it was a double-width character (cf: 20210130). + +20210130 + + correct an off-by-one in comparison in waddch_literal() which caused + scrolling when a double-cell character would not fit at the lower + right corner of the screen (report by Benno Schulenberg). + + split-out att610+cvis, vt220+cvis, vt220+cvis8 -TD + + add vt220-base, for terminal emulators which generally have not + supported att610's blinking cursor control -TD + + use vt220+cvis in vt220, etc -TD + + use att610+cvis, xterm+tmux and ansi+enq in kitty -TD + + use vt220+cvis in st, terminology, termite since they ignore + blinking-cursor detail in att610+cvis -TD + +20210123 + + modify package/config scripts to provide an explicit -L option for + cases when the loader search path has other directories preceding + the one in which ncurses is installed (report by Yuri Victorovich). + + minor build-fixes in configure script and makefiles to work around + quirks of pmake. + +20210116 + + add comment for linux2.6 regarding CONFIG_CONSOLE_TRANSLATIONS + (report by Patrick McDermott) -TD + + make opts extension for getcchar work as documented for ncurses 6.1, + adding "-g" flag to test/demo_new_pair to illustrate. + +20210109 + + fix errata in man/ncurses.3x from recent updates. + + improve quoting/escaping in configure script, uses some features of + autoconf 2.52.20210105 + +20210102 + + update man/curs_memleaks.3x, to include which declares + exit_terminfo. + + clarify man/curs_terminfo.3x, to mention why the macro setterm is + defined in , and remove it from the list of prototypes + (prompted by patch by Graeme McCutcheon). + + amend man/curs_terminfo.3x, to note that is required + for certain functions, e.g., those using chtype or attr_t for + types, as well as mvcur (cf: 20201031). + + use parameter-names in prototypes in curs_sp_funcs.3x, for + consistency with other manpages. + +20201227 + + update terminology entry to 1.8.1 -TD + + fix some compiler-warnings which gcc8 reports incorrectly. + +20201219 + + suppress hyphenation in generated html for manpages, to address + regression in upgrade of groff 1.22.2 to 1.22.3. + + fix inconsistent sort-order in see-also sections of manpages (report + by Chris Bennett). + +20201212 + + improve manual pages for form field-types. + +20201205 + + amend build-fixes for gnat 10 to work with certain systems lacking + gprbuild (cf: 20200627). + + eliminate an additional strlen and wsclen. + + eliminate an unnecessary strlen in waddnstr() (suggested by Benjamin + Abendroth). + + modify inopts manpage, separating the items for nodelay and notimeout + (patch by Benno Schulenberg). + + correct mlterm3 kf1-kf4 (Debian #975322) -TD + + add flash to mlterm3 -TD + +20201128 + + add Smulx to alacritty (Christian Duerr). + + add rep to PuTTY -TD + + add putty+keypad -TD + + add another fflush(stdout) in _nc_flush() to handle time-delays in + the middle of strings such as flash when the application uses + low-level calls rather than curses (cf: 20161217). + + modify configure check for c89/c99 aliases of clang to use its + -std option instead, because some platforms, in particular macOS, + do not provide workable c89/c99 aliases. + +20201121 + + fix some compiler-warnings in experimental Windows-10 driver. + + add the definitions needed in recent configure-check for clang + (report by Steven Pitman). + +20201114 + + fix some compiler-warnings in experimental Windows-10 driver. + + modify a check for parameters in terminfo capabilities to handle the + special case where short extended capability strings were not + converted from terminfo to termcap format. + + modify CF_MIXEDCASE_FILENAMES macro, adding darwin as special case + when cross-compiling (report by Eli Rykoff). + +20201107 + + update kitty+common -TD + + add putty+screen and putty-screen (suggested by Alexandre Montaron). + + explain in ncurses.3x that functions in the tinfo library do not rely + upon wide-characters (prompted by discussion with Reuben Thomas). + +20201031 + + modify MKterm.h.in so that it is not necessary to include + before (prompted by discussion with Reuben Thomas). + + review/improve synopsis for curs_sp_funcs.3x (prompted by discussion + with Reuben Thomas). + + improve format of output in tic's check_infotocap() function, to + ensure that the messages contain only printable text. + + modify configure-check for clang to verify that -Qunused-arguments + is supported. IBM's xlclang does not support it (report by Steven + Pitman). + +20201024 + + provide workaround configure-check for bool when cross-compiling. + + fix a potential indexing error in _nc_parse_entry(), seen with + Herlim's test data using address-sanitizer. + + change a null-pointer check in set_curterm to a valid-string check, + needed in to tic's use-resolution when pad_char is cancelled + (report/testcase by Robert Sebastian Herlim) + + improve tic's -c option to validate the number and type of parameters + and compare against expected number/type before deciding which set of + parameter-lists to use in tparm calls (report/testcase by Robert + Sebastian Herlim). + + fix a link for tabs.1 manpage in announce.html.in (report by Nick + Black), as well as some fixes via linklint. + +20201017 + + improve manpage typography. + + improve discussion in curs_addch.3x of the use of unctrl to display + nonprintable characters. + + add a note in terminfo.5 explaining that no-parameter strings such + as sgr0 or cnorm should not be used with tparm. + +20201010 + + correct sgr in aaa+rv (report by Florian Weimer) -TD + + fix some sgr inconsistencies in d230c, ibm6153, ibm6154, + ncrvt100an -TD + + improve tic's check for errors detected in tparm (prompted by + discussion with Florian Weimer). + + set output-mode to binary in experimental Windows-10 driver (Juergen + Pfeifer). + +20201003 + + remove output-related checks for nl/nonl (report by Leon Winter). + + change tmux's kbs to ^? (report by Premysl Eric Janouch) + + simplify mlterm initialization with DECSTR -TD + + fix a typo in man/curs_terminfo.3 (Reuben Thomas). + + add tmux-direct (tmux #2370, Debian #895754) + + add user-defined capabilities from mintty to Caps-ncurses, for + checking consistency with tic. + +20200926 + + correct configure-check for gnurx library. + + regenerate llib-* files. + + modify tracemunch and the panel library to show readable traces for + panel- and user-pointers. + +20200919 + + update mlterm3 for 3.9.0 (report by Premysl Eric Janouch) -TD + +20200918 + + corrected condition for appending curses.events to the generated + curses.h (report by Sven Joachim, Debian #970545). + +20200912 + + add configure-check for systre/tre with mingw configuration, to get + the library-dependencies as seen in msys2 configuration for mingw64. + + build-fixes for the win32-driver configuration. + + use more defensive binary mode setting for Win32 (Juergen Pfeifer). + +20200907 + + fix regression in setupterm validating non-empty $TERM (report by + Soren Tempel). + +20200906 + + merge/adapt in-progress work by Juergen Pfeifer for new version of + win32-driver. + + correct description of vt330/vt340 (Ross Combs). + +20200831 + + build-fix for awk-scripts modified for win32-driver (report by Werner + Fink). + +20200829 + + remove a redundant NCURSES_EXPORT as a build-fix for "Maarten + Anonymous". + + merge/adapt in-progress work by Juergen Pfeifer for new version of + win32-driver. + + modify configure script, moving gcc -Werror options to EXTRA_CFLAGS + to avoid breaking configure-checks (adapted from ongoing work on + mawk and lynx). + > errata for terminfo.src (report by Florian Weimer): + + correct icl6404 csr + + correct ti916 cup + + improve ndr9500 + +20200822 + + improve version-number extraction in MKlib_gen.sh + + make the test-package for manpages installable by adjusting the + man_db.renames file. + + correct an off-by-one loop-limit in convert_strings function + (report by Yue Tai). + + add CF_SHARED_OPTS cases for HPE NonStop systems (Randall S Becker). + + modify CF_SHARED_OPTS case for NetBSD to use the same "-shared" + option for the non-rpath case as for the rpath case, to allow gcc to + provide suitable runtime initialization (report by Rajeev V Pillai). + +20200817 + + reduce build-warnings by excluding ncurses-internals from deprecation + warnings. + + mark wgetch-events feature as deprecated. + + add definition for $(LIBS) to ncurses/Makefile.in, to simplify builds + using the string-hacks option. + + prevent KEY_EVENT from appearing in curses.h unless the configure + option --enable-wgetch-events is used (report by Werner Fink). + +20200816 + + amend tic/infocmp check to allow for the respective tool's absence + (report by Steve Wills, cf: 20200808). + + improved some of the build-scripts with shellcheck + + filter out -MT/-MD/-MTd/-MDd options in script for Visual Studio C++ + (discussion with "Maarten Anonymous"). + +20200808 + + improve discussion of the system's tic utility when used as part + of cross-compiling (discussion with Keith Marshall). + + modify configuration checks for build-time tic/infocmp to use + AC_CHECK_TOOL. That can still be overridden by --with-tic-path and + --with-infocmp-path when fallbacks are used, but even if not using + fallbacks, the improved check may help with cross-compiling + (discussion with Keith Marshall). + + other build-fixes for Ada95 with MinGW. + + modify Ada95 source-generation utility to write to a file given as + parameter rather than to the standard output, allowing builds with + MinGW. + +20200801 + + remove remaining parts of checks for ISC Unix (cf: 20121006). + + add user32.lib to LDFLAGS for Visual Studio C++ configuration + (discussion with "Maarten Anonymous"). + + modify MKkey_defs.sh to hide ncurses' definition of KEY_EVENTS to + reduce Visual Studio C++ redefinition warnings. + + improve/update checks for external functions in test/configure + +20200725 + + set LINK_TESTS in CF_SHARED_OPTS for msvc (patch by + "Maarten Anonymous") + + improved workaround for redefinition-warnings for KEY_EVENT. + + improve man/term.5 section on legacy storage format (report by + Florian Weimer). + +20200718 + + reduce redefinition-warnings for KEY_EVENT when building with Visual + Studio C++. + + define NCURSES_STATIC when compiling programs to link with static + libraries, to work with MinGW vs Visual Studio C++. + > additional changes for building with Visual Studio C++ and msys2 + (reports/patches by "Maarten Anonymous") + + modify c++/Makefile.in to set the current directory while compiling + the main program, so the linker can find related objects. + + several changes to allow the c++/demo program to compile/link. + + change an ifdef in test-directory, to use VC++ wide-character funcs. + +20200711 + + fix pound-sign mapping in acsc of linux2.6 entry (report by Ingo + Bruckl). + + additional changes for building with Visual Studio C++ and msys2 + (reports/patches by "Maarten Anonymous") + + build-improvements for Windows 10 and MinGW (patch by Juergen + Pfeifer). + + fix a typo in curs_printw.3x (patch by William Pursell). + + fix two errors in infotocap which allowed indexing outside the + buffer (report/testcases by Zhang Gan). + + update length of strings in infocmp's usage function to restore a + trailing null on the longest string (report/testcase by Zhang Gen). + +20200704 + + modify version-check with Ada generics to use the same pattern as in + the check for supported gnat versions (report by Pascal Pignard). + > additional changes for building with Visual Studio C++ and msys2 + (patches by "Maarten Anonymous"): + + adjust headers/declarations to provide for "dllimport" vs "dllexport" + declarations when constructing DLLs, to worko with Visual Studio C++. + +20200627 + + build-fixes for gnat 10.1.1, whose gnatmake drops integration with + gprbuild. + + correct buffer-length in test/color_name.h + +20200613 + + update list of functions in ncurses.3x + + move dlclose() call from lib_mouse.c to delscreen() to avoid a case + in the former which could be called from SIGTSTP handler (Debian + #961097). + +20200606 + + add xterm+256color2, xterm+88color2, to deprecate nonstandard usage + in xterm+256color, xterm+88color -TD + + add shifted Linux console keys in linux+sfkeys entry for + screen.linux (report by Alexandre Montaron). + + use vt100+enq in screen (report by Alexandre Montaron). + + add screen.linux-s alias (suggested by Alexandre Montaron). + +20200531 + + correct configure version-check/warnng for g++ to allow for 10.x + + re-enable "bel" in konsole-base (report by Nia Huang) + + add linux-s entry (patch by Alexandre Montaron). + + drop long-obsolete convert_configure.pl + + add test/test_tparm.c, for checking tparm changes. + + improve parameter-checking for tparm, adding function _nc_tiparm() to + handle the most-used case, which accepts only numeric parameters + (report/testcase by "puppet-meteor"). + + use a more conservative estimate of the buffer-size in lib_tparm.c's + save_text() and save_number(), in case the sprintf() function + passes-through unexpected characters from a format specifier + (report/testcase by "puppet-meteor"). + + add a check for end-of-string in cvtchar to handle a malformed + string in infotocap (report/testcase by "puppet-meteor"). + +20200523 + + update version-check for gnat to allow for gnat 10.x to 99.x + + fix an uninitialized variable in lib_mouse.c changes (cf: 20200502) + + add a check in EmitRange to guard against repeat_char emitting digits + which could be interpreted as BSD-style padding when --enable-bsdpad + is configured (report/patch by Hiltjo Posthuma). + + add --disable-pkg-ldflags to suppress EXTRA_LDFLAGS from the + generated pkg-config and ncurses*-config files, to simplify + configuring in the case where rpath is used but the packager wants + to hide the feature (report by Michael Stapelberg). + > fixes for building with Visual Studio C++ and msys2 (patches by + "Maarten Anonymous"): + + modify CF_SHARED_OPTS to generate a script which translates linker + options into Visual Studio's dialect. + + omit parentheses around function-names in generated lib_gen.c to + work around a Visual Studio C++ limitation. + +20200516 + + add notes on termcap.h header in curs_termcap.3x + + update notes on vscode / xterm.js -TD + +20200509 + + add "-r" option to the dots test-programs, to help with scripting + a performance comparison. + + build-fix test/move_field.c for NetBSD curses, whose form headers + use different names than SVr4 or ncurses. + +20200502 + + add details on the change to Linux SGR 21 in 2018 -TD + + add xterm-direct16 and xterm-direct256 -TD + + modify lib_mouse.c to check for out-of-range button numbers, convert + those to position reports. + +20200425 + + use vt100+fnkeys in putty -TD + + fix a typo in tput.1; "columns" should be "cols". + +20200418 + + improve tracemunch logic for "RUN" compaction. + + fix a special case in wresize() where copying the old text did not + check if the last cell on a row was the beginning of a fullwidth + character (adapted from patch by Benno Schulenberg). + + use vt52+keypad in xterm-vt52, from xterm #354 -TD + + improve see-also section of user_caps.5 + +20200411 + + fix find_pair(), overlooked when refactoring for _nc_reserve_pairs() + (report/testcase by Brad Town, cf: 20170812). + + add a trailing null for magic-string in putwin, flagged by gcc 10 + + update check for gcc version versus gnat to work with gcc 10.x + +20200404 + + modify -fvisibility check to work with g++ + > fixes for building with Visual Studio C++ and msys2 (patches by + "Maarten Anonymous"): + + add configure option and check for gcc -fvisibility=hidden feature + + define NCURSES_NOMACROS in lib_gen.c to work around Visual Studio + C++ preprocessor limitations. + + modify some of the configure-macros, as well as mk-1st.awk to work + with Visual Studio C++ default filenaming. + +20200328 + + correct length of buffer copied in dup_field(). + + remove "$(srcdir)/" from path of library.gpr, needed for out-of-tree + builds of Ada95 (patch by Adam Van Ymeren). + +20200321 + + improve configure-checks to reduce warnings about unused variables. + + improve description of error-returns in waddch and waddnstr manual + pages (prompted by patch by Benno Schulenberg). + + add test/move_field.c to demonstrate move_field(), and a stub for + a corresponding demo of dup_field(). + +20200314 + + add history note to curs_scanw.3x for and + + add history note to curs_printw.3x for and + + add portability note to ncurses.3x regarding + +20200308 + + update copyright notices in test-packages. + + modify tracemunch to guard against errors in its known_p1 table. + + add several --with-xxx-libname options, to help with pkgsrc (prompted + by discussion with Thomas Klausner). + +20200301 + + modify wbkgd() and wbkgrnd() to avoid storing a null in the + background character, because it may be used in cases where the + corresponding 0x80 is not treated as a null (report by Marc Rechte, + cf: 20181208). + +20200229 + + modify CF_NCURSES_CONFIG to work around xcode's c99 "-W" option, + which conflicts with conventional use for passing linker options. + > fixes for building with Visual Studio C++ and msys2 (patches by + "Maarten Anonymous"): + + check for pcre2posix.h instead of pcre2-posix.h + + add case in CF_SHARED_OPTS for msys2 + msvc + + add fallback definition for STDIN_FILENO in progs.priv.h + + modify win_driver.c to use _alloca() rather than gcc's variable + length array feature. + + add NCURSES_IMPEXP to ncurses wrapped-variable declarations + + remove NCURSES_IMPEXP from class variables in c++/cursslk.h + + remove fallback prototype for exit() from c++/etip.h.in + + use configured check for in a couple of places + + conditionally include winsock.h in ncurses/win32con/gettimeofday.c, + because Visual Studio needs this for the timestruct declaration. + + adjust syntax in a couple of files using the NCURSES_API symbol. + +20200222 + + expanded note in ncurses.3x regarding automatically-included headers + + improve vt50h and vt52 based on DECScope manual -TD + + add/use vt52+keypad and vt52-basic -TD + + check/workaround for line-too-long in Ada95 generate utility when + building out-of-tree. + + improve/update HEADER_DEPS in */Makefile.in + + add "check" rule to include/Makefile, to demonstrate that the headers + include all of the required headers for the types used. + +20200215 + + improve manual page for panel library, extending the portability + section as well as documenting error-returns. + + show tic's version when installing terminal database in run_tic.sh + + correct check for gcc vs other compilers used in ncurses 6.0, from + FreeBSD patch by Kyle Evans (cf: 20150725). + + add notes for 6.2 to INSTALL. + +20200212 6.2 release for upload to ftp.gnu.org + + update release notes + + minor build-fixes, mostly to test-package scripts + +20200208 + + modify check for sizeof(wchar_t) to ensure it gives useful result + when cross-compiling. + + drop assumption in configure script that Cygwin's linker is broken. + + define NCURSES_BROKEN_LINKER if the broken-linker feature is used, + to simplify configure-checks for ncurses-examples. + +20200202 + + reassert copyright on ncurses, per discussion in ncurses FAQ: + https://invisible-island.net/ncurses/ncurses.faq.html#relicensed + +20200201 + + modify comparison in make_hash.c to correct a special case in + collision handling for Caps-hpux11 + + add testing utility report_hashing to check hash-tables used for + terminfo and termcap names. + + fix a missing prototype for _nc_free_and_exit(). + + update a few comments about tack 1.07 + + use an awk script to split too-long pathnames used in Ada95 sample + programs for explain.txt + +20200118 + + expanded description of XM in user_caps.5 + + improve xm example for xterm+x11mouse, xterm+sm+1006 -TD + + add history section to curs_slk.3x and curs_terminfo.3x manpages. + + update alacritty entries for 0.4.0 (prompted by patch by + Christian Durr) -TD + + correct spelling errors found with codespell. + + fix for test/configure, from xterm #352. + +20200111 + + improve configure macros which check for the X11/Intrinsic.h header, + to accommodate recent MacOS changes. + + suppress gcc's -Winline warning; it has not been useful for some time + + update config.guess, config.sub + +20200104 + + modify a couple of macros in aclocal.m4 to allow autoconf 2.69 to + "work", to help illustrate discussion in + https://invisible-island.net/autoconf/my-autoconf.html + + fix some warnings from autoheader-252 + +20191228 + + in gen-pkgconfig.in, move the RPATH_LIST and PRIVATE_LIBS assignments + past the various prefix/libdir assignments, to allow for using those + symbols, e.g., as done via CF_SHARED_OPTS. + + improve ncurses*-config and pc-files by filtering out linker-specs. + + modify test-package to more closely match Fedora's configuration + for PIE/PIC feature and debug-packages. + +20191221 + + correct pathname used in Ada95 sample programs for explain.txt, to + work with test-packages. + + improve tracemunch: + + keep track of TERMINAL* values + + if tracing was first turned on after initialization, attempt to + show distinct screen, window and terminal names anyway. + + ensure that GCC_NORETURN is defined in term.h, because the prototype + for exit_terminfo() uses it (report by Werner Fink). + +20191214 + + add exit_curses() and exit_terminfo() to replace internal symbols for + leak-checking. + +20191207 + + fix a few warnings for test-package builds + + add curses_trace(), to replace trace(). + +20191130 + + add portability section to curs_getcchar manpage (prompted by + discussion with Nick Black). + + improve portability discussion of ACS characters in curs_addch + manpage. + + improve typography for double-quotes in manpages. + +20191123 + + fix typo for MinGW rpm test-package. + + workaround in rpm specs for NFS problems in Fedora 31. + +20191116 + + modify ncurses/Makefile.in to fix a case where Debian/testing changes + to the ld --as-needed configuration broke ncurses-examples test + packages. + + drop library-dependency on psapi for MinGW port, since win_driver.c + defines PSAPI_VERSION to 2, making it use GetProcessImageFileName + from kernel32.dll (prompted by patch by Simon Sobish, cf: 20140503). + +20191109 + + add warning-check in tic for terminals with parm_dch vs parm_ich. + + drop ich1 from rxvt-basic, Eterm and mlterm to improve compatibility + with old non-curses programs -TD + + reviewed st 0.8.2, updated some details -TD + + use ansi+rep several places -TD + + corrected tic's check for ich1 (report by Sebastian J. Bronner, + cf: 20020901). + +20191102 + + check parameter of set_escdelay, return ERR if negative. + + check parameter of set_tabsize, return ERR if not greater than zero + (report/patch by Anthony Sottile). + + revise CF_ADD_LIBS macro to prepend rather than append libraries. + + add "xterm-mono" to help packagers (report by Sven Joachim) -TD + +20191026 + + add a note in man/curs_add_wch.3x about Unicode terminology for the + line-drawing characters (report by Nick Black). + + improve comment in lib_tgoto.c regarding the use of \200 where a + \0 would be intended by the caller (report by "64 bit", cf: 20000923). + + modify linux-16color to accommodate Linux console driver change in + early 2018 (report by Dino Petrucci). + +20191019 + + modify make_hash to not require --disable-leaks, to simplify building + with address-sanitizer. + + modify tic to exit if it cannot remove a conflicting name, because + treating that as a partial success can cause an infinite loop in + use-resolution (report/testcase by Hongxu Chen, cf: 20111001). + +20191015 + + improve buffer-checks in captoinfo.c, for some cases when the + input string is shorter than expected. + > fix two errata in tic (report/testcases by Hongxu Chen): + + check for missing character after backslash in write_it + + check for missing characters after "%>" when converting from termcap + syntax (cf: 980530). + +20191012 + + amend recent changes to ncurses*-config and pc-files to filter out + Debian linker-flags (report by Sven Joachim, cf: 20150516). + + clarify relationship between tic, infocmp and captoinfo in manpage. + + check for invalid hashcode in _nc_find_type_entry and + _nc_find_name_entry. + > fix several errata in tic (reports/testcases by "zjuchenyuan"): + + check for invalid hashcode in _nc_find_entry. + + check for missing character after backslash in fmt_entry + + check for acsc with odd length in dump_entry in check for one-one + mapping (cf: 20060415); + + check length when converting from old AIX box_chars_1 capability, + overlooked in changes to eliminate strcpy (cf: 20001007). + +20191005 + + modify the ncurse*-config and pc-files to more closely match for the + -I and -l options. + +20190928 + + amend the ncurses*-config and pc-files to take into account the rpath + hack which differed between those files. + + improve -L option filtering in ncurses*-config + + improve recovery from error when reading command-character in + test/ncurses.c, showing the relevant error message and not exiting on + EINTR (cf: 20180922) + +20190921 + + add a note in resizeterm manpage about top-level windows which touch + the screen's borders. + + modify configure-checks for gnat to identify each of the tools path + and version. + +20190914 + + build-fixes for Ada95 configure-script and corresponding test package + +20190907 + + add --with-ada-libname option and modify Ada95 configuration to + allow renaming the "AdaCurses" library (prompted by proposed changes + by Pascal Pignard). + + modify configure script to distinguish gcc from icc and clang when + the --enable-warnings option is not used, to avoid unnecessary + warnings about unrecognized inline options (report by Sven Joachim). + +20190831 + + build-fixes for configuration using --program-suffix with Ada95, + noticed with MacOS but applicable to other platforms without + libpanelw, etc. + +20190824 + + fix some cppcheck warnings, mostly style, in ncurses test-programs. + +20190817 + + amend 20181208 changes for wbkgd() and wbkgrnd(), fixing a few + details where it still differed from SVr4. + + fix some cppcheck warnings, mostly style, in ncurses test-programs. + +20190810 + + fix a few more coverity warnings. + +20190803 + + improve loop limits in _nc_scroll_window() to handle a case where + the scrolled data is a pad which is taller than the window (patch + by Rob King). + + amend the change to screen, because tmux relies upon that entry + and does not support that feature (Debian #933572) -TD + + updated ms-terminal entry & notes -TD + + updated kitty entry & notes -TD + + updated alacritty+common entry & notes -TD + + use xterm+sl-twm for consistency -TD + +20190728 + + fix a few more coverity warnings. + + more documentation updates based on tctest. + +20190727 + + fix a few coverity warnings. + + documentation updates based on tctest. + +20190720 + + fix a few warnings for gcc 4.x + + add some portability/historical details to the tic, toe and infocmp + manual pages. + + correct fix for broken link from terminfo(5) to tabs(1) manpage + (report by Sven Joachim). + +20190713 + + change reset's behavior for margins to simply clear soft-margins if + possible, rather than clearing and then setting them according to the + terminal's width (suggested by Thomas Wolff). + + correct order of one wbkgd versus start_color call in test/padview.c + +20190706 + + add domterm -TD + + improve comments for recent changes, add alias xterm.js -TD + +20190630 + + add --with-tic-path and --with-infocmp-path to work around problems + building fallback source using pre-6.0 tic/infocmp. + + add a check in tic for paired indn/rin + + correct a buffer-limit in write_entry.c for systems that use caseless + filenames. + + add ms-terminal -TD + + add vscode, vscode-direct -TD + +20190623 + + improve the tabs.1 manual page to distinguish the PWB/Unix and 7th + Edition versions of the tabs utility. + + add configure check for getenv() to work around implementation shown + in Emscripten #6766, use that to optionally suppress START_TRACE + macro, whose call to getenv() may not work properly (report by Ilya + Ig Petrov). + + modify initialization functions to avoid relying upon persistent + data for the result from getenv(). + + update config.guess, config.sub + +20190615 + + expand the portability section of the man/tabs.1 manual page. + + regenerate HTML manpages. + +20190609 + + add mintty, mintty-direct (adapted from patch by Thomas Wolff). + Some of the suggested user-defined capabilities are commented-out, + to allow builds with ncurses 5.9 and 6.0 + + add Smol/Rmol for tmux, vte-2018 (patch by Nicholas Marriott). + + add rs1 to konsole, mlterm -TD + + modify _nc_merge_entry() to make a copy of the data which it merges, + to avoid modifying the source-data when aligning extended names. + +20190601 + + modify an internal call to vid_puts to pass extended color pairs + e.g., from tty_update.c and lib_mvcur.c (report by Niegodziwy Beru). + + improve manual page description of init_tabs capability and TABSIZE + variable. + +20190525 + + modify reset_cmd.c to allow for tabstops at intervals other than 8 + (report by Vincent Huisman). + +20190518 + + update xterm-new to xterm patch #345 -TD + + add/use xterm+keypad in xterm-new (report by Alain D D Williams) -TD + + update terminator entry -TD + + remove hard-tabs from ti703 (report by Robert Clausecker) + + mention meml/memu/box1 in user_caps manual page. + + mention user_caps.5 in tic and infocmp manual pages. + +20190511 + + fix a spurious blank line seen with "infocmp -1fx xterm+x11mouse" + + add checks in repair_subwindows() to keep the current position and + scroll-margins inside the resized subwindow. + + add a limit check in newline_forces_scroll() for the case where the + row is inside scroll-margins, but not at the end (report by Toshio + Kuratomi, cf: 20170729). + + corrected a warning message in tic for extended capabilities versus + number of parameters. + +20190504 + + improve workaround for Solaris wcwidth versus line-drawing characters + (report by Pavel Stehule). + + add special case in tic to validate RGB string-capability extension. + + corrected string/parameter-field for RGB in Caps-ncurses. + +20190427 + + corrected problem in terminfo load/realignment which prevented + infocmp from comparing extended capabilities with the same name + but different types. + +20190420 + + improve ifdef's for TABSIZE variable, to help with AIX/HPUX ports. + +20190413 + + check for TABSIZE variable in test/configure script. + + used test/test_arrays.c to improve Caps.aix1 and Caps.hpux11 + + corrected filtering of comments in MKparametrized.sh + + reduce duplication across Caps* files by moving some parts which do + not depend on order into Caps-ncurses. + +20190406 + + modify MKcaptab.sh, MKkey_defs.sh, and MKhashsize.sh to handle + split-up Caps-files. + + build-fixes if extended-functions are disabled. + +20190330 + + add "screen5", to mention italics (report by Stefan Assmann) + + modify description of xterm+x11hilite to eliminate unused p5 -TD + + add configure script checks to help with a port to Ultrix 3.1 + (report by Dennis Grevenstein). + + check if "b" binary feature of fopen works + + check for missing feature of locale.h + + add fallback for strstr() in test-programs + + add fallback for STDOUT_FILENO in test-programs + + update config.guess, config.sub + +20190323 + + move macro for is_linetouched() inside NCURSES_NOMACROS ifndef. + + corrected prototypes in several manpages using script to extract + those in compilable form. + + use _nc_copy_termtype2() rather than direct assignment in setupterm, + in case it is called repeatedly using fallback terminfo descriptions + (report/patch by Werner Fink). + +20190317 + + regenerate llib-* files. + + modify tic to also use new function for user-defined capability info. + + modify _nc_parse_entry() to check if a user-defined capability has + an unexpected type; ignore it in that case. + + fix a special case of link-anchors in generated Ada html files. + + use newer rel=author tag in generated html rather than rev=made, + which did not become accepted. + +20190309 + + in-progress changes to add parameter-checking for common user-defined + capabilities in tic. + + update MKcodes.awk and MKnames.awk to ignore the new "userdef" + data in Caps-ncurses (cf: 20190302). + +20190302 + + corrected some of the undocumented terminfo names in Caps.hpux11 + + add "Caps-ncurses" file to help with checking inconsistencies in some + user-defined capabilities. + + amend check for repeat_char to handle a case where setlocale() was + called after initscr() (report by "Ampera"). + +20190223 + + fix typo in adds200 -TD + + add tic check for consistent alternate character set capabilities. + + improve check in mvcur() to decide whether to use hard-tabs, using + xt, tbc and hts as clues. + + replace check in reset command for obsolete "pt" capability using + tbc and hts capabilities as clues (report by Nicolas Marriott). + +20190216 + + improve manual page description of TABSIZE. + + add test/demo_tabs program. + +20190209 + + add check in tic to provide warnings for mismatched number of + parameters in the documented user-capability extensions. + +20190202 + + modify rpm test-package ".spec" file to work around naming conflict + with Redhat's package for ncurses6. + + modify no-leaks code in test/picsmap to avoid non-standard tdestroy. + + amend change to configure script which altered the top-level makefile + to avoid attempting to install the terminfo database when it was not + configured, to allow for installing the ".pc" files which are also + in the misc directory (report by Steve Wills). + +20190126 + + change some "%define" statements in test-packages for RPMs to + "%global" to work around changes in rpm 4.14 from recent Redhat. + + fixes for O_INPUT_FIELD extension (patch by Leon Winter). + + eliminate fixed buffer-size when reading $TERMCAP variable. + + correct logic in read_entry.c which prevented $TERMCAP variable from + being interpreted as a fallback to terminfo entry (prompted by + Savannah #54556, cf: 20110924). + +20190121 + + add a check in test/configure to work around non-ncurses termcap.h + file in Slackware. + + corrected flag for "seq" method of db 1.8.5 interface, needed by toe + on some of the BSDs. + + updated "string-hacks" feature. + + minor improvements to manpage typography. + + corrected conditionally-compiled limit on color pairs (report by + "Hudd"). + + add -x option to test/pair_content, test/color_content for testing + init_extended_pair, extended_pair_content, init_extended_color, + extended_color_content + + add -p option to test/pair_content, test/color_content to show the + return values from the tested functions. + + improve manual page curs_color.3x discussion of error returns and + extensions. + + add O_INPUT_FIELD extension to form library (patch by Leon Winter). + + override/suppress --enable-db-install if --disable-database configure + option was given. + + change a too-large terminal entry in tic from a fatal error to a + warning (prompted by discussion with Gabriele Balducci). + +20190112 + + fix typo in term(5), improve explanation of format (report by Otto + Modinos). + + add nsterm-direct -TD + + use SGR 1006 mouse for konsole-base -TD + + use SGR 1006 mouse for putty -TD + + add ti703/ti707, ti703-w/ti707-w (Robert Clausecker) + +20190105 + + add dummy "check" rule in top-level and test-Makefile to simply + building test-packages for Arch. + + modify configure script to avoid conflict with a non-POSIX feature + that enables all parts of the system headers by default. Some + packagers have come to rely upon this behavior (FreeBSD #234049). + + update config.guess, config.sub + +20181229 + + improve man/curs_mouse.3x with regard to xterm + + modify tracemunch to accept filename parameters in addition to use + as a pipe/filter. + + minor optimization to reduce calls to _nc_reserve_pairs (prompted by + discussion with Bryan Christ). + + add test/pair_content.c and test/color_content.c + + modify infocmp to omit filtering of "OTxx" names which are used for + obsolete capabilities, when the output is sorted by long-names. + Doing this helps when making a table of the short/long capability + names. + +20181215 + + several fixes for gcc8 strict compiler warnings. + + fix a typo in comments (Aaron Gyes). + + add nsterm-build309 to replace nsterm-256color, assigning the latter + as an alias of nsterm, to make mouse work with nsterm-256color -TD + + base gnome-256color entry on "gnome", not "vte", for consistency -TD + + updates for configure macros from work on tin and xterm: + + CF_GNU_SOURCE, allow for Cygwin's newlib when checking for the + _DEFAULT_SOURCE symbol. + + CF_VA_COPY, add fallback check if neither va_copy/__va_copy is + supported, to try copying the pointers for va_list, or as an array. + Also add another fallback check, for __builtin_va_copy(), which + could be used with AIX xlc in c89 mode. + +20181208 + + modify wbkgd() and wbkgrnd() to improve compatibility with SVr4 + curses, changing the way the window rendition is updated when the + background character is modified (report by Valery Ushakov). + +20181201 + + add midnightbsd to CF_XOPEN_SOURCE macro (patch by Urs Jansen). + + add "@" command to test/ncurses F-test, to allow rapid jump to + different character pages. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20181125 + + build-fix (reports by Chih-Hsuan Yen, Sven Joachim). + +20181124 + + check --with-fallbacks option to ensure there is a value, and add + the fallback information to top-level Makefile summary. + + add some traces in initialization to show whether a fallback entry is + used. + + build-fix for test/movewindow with ncurses-examples on Solaris. + + add "-l" option to test/background, to dump screen contents in a form + that lets different curses implementations be compared. + + modify the initialization checks for mouse so that the xterm+sm+1006 + block will work with terminal descriptions not mentioning xterm + (report by Tomas Janousek). + +20181117 + + ignore the hex/b64 $TERMINFO in toe's listing. + + correct a status-check in _nc_read_tic_entry() so that if reading + a hex/b64 $TERMINFO, and the $TERM does not match, fall-through to + the compiled-in search list. + +20181110 + + several workarounds to ensure proper C compiler used in parts of + Ada95 tree. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20181027 + + add OpenGL clients alacritty and kitty -TD + + add Smulx for tmux, vte-2018 -Nicholas Marriott + +20181020 + + ignore $TERMINFO as a default value in configure script if it came + from the infocmp -Q option. + + allow value for --with-versioned-syms to be a relative pathname + + add a couple of broken-linker symbols to the list of versioned + symbols to help with link-time optimization versus weak symbols. + + apply shift/control/alt logic when decoding xterm's 1006 mode to + wheel-mouse events (Redhat #1610681). + +20181013 + + amend change from 20180818, which undid a fix for the $INSTALL value + to make it an absolute path. + +20181006 + + improve a configure check to work with newer optimizers (report by + Denis Pronin, Gentoo #606142). + + fix typo in tput.c (Sven Joachim, cf: 20180825). + +20180929 + + fix typo in tvi955 -TD + + corrected acsc for regent60 -TD + + add alias n7900 -TD + + corrected acsc for tvi950 -TD + + remove bogus kf0 from tvi950 -TD + + added function-key definitions to agree with Televideo 950 manual -TD + + add bel to tvi950 -TD + + add shifted function-keys to regent60 -TD + + renumber regent40 function-keys to match manual -TD + + add cd (clr_eos) to adds200 -TD + +20180923 + + build-fix: remove a _tracef call which was used for debugging (report + by Chris Clayton). + +20180922 + + ignore interrupted system-call in test/ncurses's command-line, e.g., + if the terminal were resized. + + add shift/control/alt logic for decoding xterm's 1006 mode (Redhat + #1610681, cf: 20141011). + + modify rpm test-packages to not use --disable-relink with Redhat, + since Fedora 28's tools do not work with that feature. + +20180908 + + document --with-pcre2 configure option in INSTALL. + + improve workaround for special case in PutAttrChar() where a cell is + marked as alternate-character set, to handle a case where the + character in the cell does not correspond to any of the ASCII + fallbacks (report by Leon Winter, cf: 20180505). + + amend change to form library which attempted to avoid unnecessary + update of cursor position in non-public fields, to simply disable + output in this case (patch by Leon Winter, cf: 20180414). + + improve check for LINE_MAX runtime limit, to accommodate broken + implementations of sysconf(). + +20180901 + + improve manual page for wgetnstr, giving background for the length + parameter. + + define a limit for wgetnstr, wgetn_wstr when length is negative or + "too large". + + update configure script to autoconf 2.52.20180819 (Debian #887390). + +20180825 + + add a section to tput manual page clarifying how it determines the + terminal size (prompted by discussion with Grant Jenks). + + add "--disable-relink" to rpm test-packages, for consistency with the + deb test-packages. + + split spec-file into ncurses6.spec and ncursest6.spec to work around + toolset breakage in Fedora 28. + + drop mention of "--disable-touching", which was not in the final + 20180818 updates. + +20180818 + + build-fix for PDCurses with ncurses-examples. + + improved CF_CC_ENV_FLAGS. + + modify configure scripts to reduce relinking/ranlib during library + install (Debian #903790): + + use "install -p" when available, to avoid need for ranlib of + static libraries. + + modify scripts which use "--disable-relink" to add a 1-second + sleep to work around tools which use whole-second timestamps, e.g., + in utime() rather than the actual file system resolution. + +20180804 + + improve logic for clear with E3 extension, in case the terminal + scrolls content onto its saved-lines before actually clearing + the display, by clearing the saved-lines after clearing the + display (report/patch by Nicholas Marriott). + +20180728 + + improve documentation regarding feature-test macros in curses.h + + improve documentation regarding the virtual and physical screens. + + formatting fixes for manpages, regenerate man-html documentation. + +20180721 + + build-fixes for gcc8. + + corrected acsc for wy50 -TD + + add wy50 and wy60 shifted function-keys as kF1 to kF16 -TD + + remove ansi+rep mis-added to interix in 2018-02-23 -TD + +20180714 + + add enum, regex examples to test/demo_forms + + add configure check for pcre-posix library to help with MinGW port. + +20180707 + + build-fixes for gcc8. + + correct order of WINDOW._ttytype versus WINDOW._windowlist in + report_offsets. + + fix a case where tiparm could return null if the format-string was + empty (Debian #902630). + +20180630 + + add acsc string to vi200 (Nibby Nebbulous) + add right/down-arrow to vi200's acsc -TD + + add "x" to tput's getopt string so that "tput -x clear" works + (Nicholas Marriott). + + minor fixes prompted by anonymous report on stack overflow: + + correct order of checks in _nc_get_locale(), for systems lacking + locale support. + + add "#error" in a few places to flag unsupported configurations + +20180623 + + use _WIN32/_WIN64 in preference to __MINGW32__/__MINGW64__ symbols + to simplify building with MSVC, since the former are defined in both + compiler configurations (report by Ali Abdulkadir). + + further improvements to configure-checks from work on dialog, i.e., + updated CF_ADD_INCDIR, CF_FIND_LINKAGE, CF_GCC_WARNINGS, + CF_GNU_SOURCE, CF_LARGEFILE, CF_POSIX_C_SOURCE, CF_SIZECHANGE, and + CF_TRY_XOPEN_SOURCE. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20180616 + + build-fix for ncurses-examples related to gcc8-fixes (cf: 20180526). + + reduce use of _GNU_SOURCE for current glibc where _DEFAULT_SOURCE + combines with _XOPEN_SOURCE (Debian #900987). + + change target configure level for _XOPEN_SOURCE to 600 to address + use of vsscanf and setenv. + + improved configure-checks CF_SIZECHANGE and CF_STRUCT_TERMIOS from + work on dialog. + +20180609 + + modify generated ncurses*config and ncurses.pc, ncursesw.pc, etc., + to list helper libraries such as gpm for static linking (Debian + #900839). + + marked vwprintw and vwscanw as deprecated; recommend using vw_printw + and vw_scanw, respectively. + +20180602 + + add RPM test-package "ncursest-examples". + + modified RPM test-package to work with Mageia6. + +20180526 + + add note in curs_util.3x about unctrl.h + + review/improve header files to ensure that those include necessary + files except for the previously-documented cases (report by Isaac + Pascual Monells). + + improved test-package scripts, adapted from byacc 1.9 20180525. + + fix some gcc8 warnings seen in Redhat package build, but + work around bug in gcc8 compiler warnings in comp_parse.c + +20180519 + + formatting fixes for manpages, regenerate man-html documentation. + + trim spurious whitespace from tmux in 2018-02-24 changes; + fix some inconsistencies in/between tmux- and iterm2-entries for SGR + (report by C Anthony Risinger) + + improve iterm2 using some xterm features which it has adapted -TD + + add check in pair_content() to handle the case where caller asks + for an uninitialized pair (Debian #898658). + +20180512 + + remove trailing ';' from GCC_DEPRECATED definition. + + repair a change from 20110730 which left an error-check/warning dead. + + fix several minor Coverity warnings. + +20180505 + + add deprecation warnings for internal functions called by older + versions of tack. + + fix a special case in PutAttrChar() where a cell is marked as + alternate-character set, but the terminal does not actually support + the given graphic character. This would happen in an older terminal + such as vt52, which lacks most line-drawing capability. + + use configure --with-config-suffix option to work around filename + conflict with Debian packages versus test-packages. + + update tracemunch to work with perl 5.26.2, which changed the rules + for escaping regular expressions. + +20180428 + + document new form-extension O_EDGE_INSERT_STAY (report by Leon + Winter). + + correct error-returns listed in manual pages for a few form functions + (report by Leon Winter). + + add a check in form-library for null-pointer dereference: + unfocus_current_field (form); + form_driver (form, REQ_VALIDATION); + (patch by Leon Winter). + +20180414 + + modify form library to optionally delay cursor movement on a field + edge/boundary (patch by Leon Winter). + + modify form library to avoid unnecessary update of cursor position in + non-public fields (patch by Leon Winter). + + remove unused _nc_import_termtype2() function. + + also add/improve null-pointer checks in other places + + add a null-pointer check in _nc_parse_entry to handle an error when + a use-name is invalid syntax (report by Chung-Yi Lin). + +20180407 + + clarify in manual pages that vwprintw and vwscanw are obsolete, + not part of X/Open Curses since 2007. + + use "const" in some prototypes rather than NCURSES_CONST where X/Open + Curses was updated to do this, e.g., wscanw, newterm, the terminfo + interface. Also use "const" for consistency in the termcap + interface, which was withdrawn by X/Open Curses in Issue 5 (2007). + As of Issue 7, X/Open Curses still lacks "const" for certain return + values, e.g., keyname(). + +20180331 + + improve terminfo write/read by modifying the fourth item of the + extended header to denote the number of valid strings in the extended + string table (prompted by a comment in unibilium's sources). + +20180324 + + amend Scaled256() macro in test/picsmap.c to cover the full range + 0..1000 (report by Roger Pau Monne). + + add some checks in tracemunch for undefined variables. + + trim some redundant capabilities from st-0.7 -TD + + trim unnecessary setf/setb from interix -TD + +20180317 + + fix a check in infotocap which may not have detected a problem when + it should have. + + add a check in tic for the case where setf/setb are given using + different strings, but provide identical results to setaf/setab. + + further improve fix for terminfo.5 (patch by Kir Kolyshkin). + + reorder loop-limit checks in winsnstr() in case the string has no + terminating null and only the number of characters is used (patch + by Gyorgy Jeney). + +20180303 + + modify TurnOn/TurnOff macros in lib_vidattr.c and lib_vid_attr.c to + avoid expansion of "CUR" in trace. + + improve a few lintian warnings in test-packages. + + modify lib_setup to avoid calling pthread_self() without first + verifying that the address is valid, i.e., for weak symbols + (report/patch by Werner Fink). + + modify generated terminfo.5 to not use "expand" and related width + on the last column of tables, making layout on wide terminals look + better (adapted from patch by Kir Kolyshkin). + + add a category to report_offsets, e.g., "w" for wide-character, "t" + for threads to make the report more readable. Reorganized the + structures reported to make the categories more apparent. + + simplify some ifdef's for extended-colors. + + add NCURSES_GLOBALS and NCURSES_PRESCREEN to report_offsets, to show + how similar the different tinfo configurations are. + +20180224 + + modify _nc_resolve_uses2() to detect incompatible types when merging + a "use=" clause of extended capabilities. The problem was seen in a + defective terminfo integrated from simpleterm sources in 20171111, + compounded by repair in 20180121. + + correct Ss/Ms interchange in st-0.7 entry (tmux #1264) -TD + + fix remaining flash capabilities with trailing mandatory delays -TD + + correct cut/paste in NEWS (report by Sven Joachim). + +20180217 + + remove incorrect free() from 20170617 changes (report by David Macek). + + correct type for "U8" in user_caps.5; it is a number not boolean. + + add a null-pointer check in safe_sprintf.c (report by Steven Noonan). + + improve fix for Debian #882620 by reusing limit2 variable (report by + Julien Cristau, Sven Joachim). + +20180210 + + modify misc/Makefile.in to install/uninstall explicit list in case + the build-directory happens to have no ".pc" files when an uninstall + is performed (report by Jeffrey Walton). + + deprecate safe-sprintf, since the vsnprintf function, which does what + was needed, was standardized long ago. + + add several development/experimental options to development packages. + + minor reordering of options in configure script to make the threaded + and reentrant options distinct from the other extensions which are + normally enabled. + +20180203 + + minor fixes to test/*.h to make them idempotent. + + add/use test/parse_rgb.h to show how the "RGB" capability works. + + add a clarification in user_caps.5 regarding "RGB" capability. + + add extended_slk_color{,_sp} symbols to the appropriate + package/*.{map,sym} files (report by Sven Joachim, cf: 20170401). + +20180129 + + update "VERSION" file, used in shared-library naming. + +20180127 6.1 release for upload to ftp.gnu.org + +20180127 + + updated release notes + + amend a warning message from tic which should have flagged misuse + of "XT" capability in "screen" terminal description. + > terminfo changes: + + trim "XT" from screen entry, add comments to explain why it was + not suitable -TD + + modify iterm to use xterm+sl-twm building block -TD + + mark konsole-420pc, konsole-vt100, konsole-xf3x obsolete reflecting + konsole's removal in 2008 -TD + + expanded the history section of konsole to explain its flawed + imitation of xterm's keyboard -TD + + use xterm+x11mouse in screen.* entries because screen does not yet + support xterm's 1006 mode -TD + + add nsterm-build400 for macOS 10.13 -TD + + add ansi+idc1, use that in ansi+idc adding dch for consistency -TD + + update vte to vte-2017 -TD + + add ecma+strikeout to vte-2017 -TD + + add iterm2-direct -TD + + updated teraterm, added teraterm-256color -TD + + add mlterm-direct -TD + + add descriptions for ANSI building-blocks -TD + +20180121 pre-release + > terminfo changes: + + add xterm+noalt, xterm+titlestack, xterm+alt1049, xterm+alt+title + blocks from xterm #331 -TD + + add xterm+direct, xterm+indirect, xterm-direct entries from xterm + #331 -TD + + modify xterm+256color and xterm+256setaf to use correct number of + color pairs, for ncurses 6.1 -TD + + add rs1 capability to xterm-256color -TD + + modify xterm-r5, xterm-r6 and xterm-xf86-v32 to use xterm+kbs to + match xterm #272, reflecting packager's changes -TD + + remove "boolean" Se, Ss from st-0.7 -TD + + add konsole-direct and st-direct -TD + + remove unsupported "Tc" capability from st-0.7; use st-direct if + direct-colors are wanted -TD + + add vte-direct -TD + + add XT, hpa, indn, and vpa to screen, and invis, E3 to tmux (patch by + Pierre Carru) + + use xterm+sm+1006 in xterm-new, vte-2014 -TD + + use xterm+x11mouse in iterm, iterm2, mlterm3 because xterm's 1006 + mode does not work with those programs. konsole is debatable -TD + + add "termite" entry (report by Markus Pfeiffer) -TD + > merge branch begun April 2, 2017 which provides these features: + + support read/write new binary-format for terminfo which stores + numeric capabilities as a signed 32-bit integer. The test programs + such as picsmap, ncurses were created or updated during 2017 to use + this feature. + + the new format is written by the wide-character configuration of + tic when it finds a numeric capability larger than 32767. + + other applications such as infocmp built with the wide-character + ncurses library work as expected. + + applications built with the "narrow" (8-bit) configuration will + read the new format, but will limit those extended values to 32767. + + in either wide/narrow configuration, the structure defined in + term.h still uses signed 16-bit values. + + because it is incompatible with the legacy (mid-1980s) binary format, + a new magic value is provided for the "file" program. + + the term.5 manual page is updated to describe this new format. + + the limit on file-size for compiled terminfo is increased in the + wide-character configuration to 32768. + +20180120 + + build-fix in picsmap.c for stdint.h existence. + + add --disable-stripping option to configure scripts. + + modify ncurses-examples to install test-scripts in the data directory. + + work around tool-breakage in Debian 9 and later by invoking + gprconfig to specify the C compiler to be used by gnatmake, + and conditionally suppressing Library_Options line for static + libraries. + + bump the compat level for test-packages to 7, i.e., Debian 5. + +20180106 + + fixes for writing extended color pairs in putwin. + + modify test/savescreen.c to add test patterns that exercise 88-, + 256-, etc., colors. + + modify configure option --with-build-cc, adding clang, c89 and c99 + as possible default values. + + modify ncurses-examples configure script to use pkg-config for the + extra form/menu/panel libraries, to be more consistent with the + handling of the curses/ncurses library. + + modify test-packages for mingw to supply "pc" files. + + modify gen-pkgconfig.in to list -lpthread as a private library when + configured to access it via weak symbols. + + simplify gen-pkgconfig.in, adding -ltinfo without the special linker + checks because some versions of the linker simply hard-code the + behavior. + + update URLs for ncurses website to use https. + + modify CF_CURSES_LIBS to fill in $cf_nculib_root in case the + ncurses-examples are built with a system ncurses that lacks the + standard "curses" symbolic link, as done by SuSE. The symbol is + needed to make a followup check for the pthread library work, and + would be set properly using the options "--with-screen", etc. + + generate misc/*.pc with "all" rule, as done for "sources" rule + (report by Jeffrey Walton). + +20171230 + + build-fix for ncurses-examples with Fedora27, adding check for + reset_color_pairs() -- not yet in Fedora's package. + + consistently add $CFLAGS to $MK_SHARED_LIB symbol in configure + script when the latter happens to use the C compiler rather than + directly using the loader (report by Jeffrey Walton). + + set ABI for upcoming 6.1 release in "*.map" files. While there are + some remaining internals to apply, no ABI-related changes are + anticipated. + + add configure --with-config-suffix option to work around filename + conflict with Redhat packages versus test-packages. + +20171223 + + modify ncurses-examples to quiet const-warnings when building with + PDCurses. + + modify toe to not exit if unable to read a terminal description, + e.g., if there is a permission problem. + + minor fix for progs/toe.c, using _nc_free_termtype2. + + assign 0 to pointer in _nc_tgetent_leak() after freeing it. Also + avoid reusing pointer from previous successful call to tgetent + if the latest call is unsuccessful (patch by Michael Schroeder, + OpenSuSE #1070450). + + minor fix for test/tracemunch, initialize $awaiting variable. + +20171216 + + repair template in test/package/ncurses-examples.spec (cf: 20171111). + + improve tic's warning about the number of parameters tparm might use + for u1-u9 by making a special case for u6. + + improve curs_attr.3x discussion of color pairs. + +20171209 + + modify misc/ncurses-config.in to make output with --includedir + consistent with --cflags, i.e., when --disable-overwrite option was + configured the output should show the subdirectory where headers + are. + + modify MKlib_gen.sh to suppress macros when calling an "implemented" + function in link_test.c + + updated ftp-url used in test-packages, etc. + + modify order of -pie/-shared options in configure script in case + LDFLAGS uses "-pie", working around a defect or limitation in the GNU + linker (prompted by patch by Yogesh Prasad, forwarded by Jay Shah). + + add entry in man_db.renames for user_caps.5 + +20171125 + + modify MKlib_gen.sh to avoid tracing result from getstr/getnstr + before initialized. + + add "-a" aspect-ratio option to picsmap. + + add configure check for default path of rgb.txt, used in picsmap. + + modify _nc_write_entry() to truncate too-long filename (report by + Hosein Askari, Debian #882620). + + build-fix for ncurses-examples with NetBSD curses: + + it lacks the use_env() function. + + it lacks libpanel; a recent change used the wrong ifdef symbol. + + add a macro for is_linetouched() and adjust the function's return + value to make it possible for most applications to check for an + error-return (report by Midolikawa H). + + additional manpage cleanup. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20171118 + + add a note to curs_addch.3x on portability. + + add a note to curs_pad.3x on the origin and portability of pads. + + improve manpage description of getattrs (report by Midolikawa H). + + improve manpage macros (prompted by discussion in Debian #880551. + + reviewed test-programs using KEY_RESIZE, made fixes to test/worm.c + + add a "-d" option to picsmap for default-colors. + + modify old terminology entry and a few other terminal emulators to + account for xon -TD + + correct sgr string for tmux, which used screen's "standout" code + rather than the standard code (patch by Roman Kagan) + + correct sgr/sgr0 strings in a few other cases reported by tic, making + those correspond to the non-sgr settings where they differ, but + otherwise use ECMA-48 consistently: + jaixterm, aixterm, att5420_2, att4424, att500, decansi, d410-7b, + dm80, hpterm, emu-220, hp2, iTerm2.app, mterm-ansi, ncrvt100an, + st-0.7, vi603, vwmterm -TD + + build-fix for diagnostics warning in lib_mouse.c for pre-5.0 versions + of gcc which did not recognize the diagnostic "push" pragma (patch by + Vassili Courzakis). + +20171111 + + add "op" to xterm+256setaf -TD + + reviewed terminology 1.0.0 -TD + + reviewed st 0.7 -TD + + suppress debug-package for ncurses-examples rpm build. + +20171104 + + check for interrupt in color-pair initialization of dots_curses.c, + dots_xcurses.c + + add z/Z zoom feature to test/ncurses.c C/c screens. + + add '<' and '>' commands to test/ncurses.c S/s screens, to better + test off-by-ones in the overlap/copywin functions. + +20171028 + + improve man/curs_inwstr.3x, correct end-logic for lib_inwstr.c + (report by Midolikawa H). + + fix typo in a few places for "improvements" (patch by Sven Joachim). + + clear the other half of a double-width character on which a line + drawing character is drawn. + + make test/ncurses.c "s" test easier to understand which subtests are + available; add a "S" wide-character overlap test-screen. + + modify test/ncurses.c C/c tests to allow for extended color pairs. + + add endwin() call in error-returns from test/ncurses.c omitted in + recent redesign of its menu (cf: 20170923). + + improve install of hashed-db by removing the ".db" file as done for + directory-tree terminal databases. + + repair a few overlooked items in include/ncurses_defs from recent + port/refactoring of test-programs (cf: 20170909). + + add test/padview.c, to compare pads with direct updates in view.c + +20171021 + + modify test/view.c to expand tabs using the ncurses library rather + than in the test-program. + + remove very old SIGWINCH example in test/view.c, just use KEY_RESIZE. + + add -T, -e, -f -m options to "dots" test-programs. + + fix a few typos in usage-messages for test-programs. + +20171014 + + minor cleanup to test/view.c: + + eliminate "-n" option by simply reading the whole file. + + implement page up/down commands. + + add check in tput for init/reset operands to ensure those use a + terminal. + + improve manual pages which discuss chtype, cchar_t types and the + attribute values which can be stored in those types. + + correct array-index when parsing "-T" command-line option in tabs + program. + + modify demo_new_pair.c to pass extended pairs to setcchar(). + + add test/dots_xcurses.c to illustrate a different approach used for + extended colors which can be contrasted with dots_curses.c. + + add a check in tic to note when a description uses non-mandatory + delays without xon_xoff. This is not an error, but some descriptions + for a terminal emulator may use the combination incorrectly. + +20171007 + + modify "-T" option of clear and tput to call use_tioctl() to obtain + the operating system's notion of the screensize if possible. + + review/repair some exit-codes for tput, making usage-message exit + with 2 rather than 1, and a failure to open terminal 4+errno. + + amend check in tput, tabs and clear to allow those to use the + database-only features in cron if a -T option gives a suitable + terminal name (report by Lauri Tirkkonen). + + correct an ifdef in test/ncurses.c for systems with soft-keys but + not slk_color(). + + regenerate man-html documentation. + +20170930 + + fix a symbol conflict that made ncurses.c C/c menu not work with + Solaris xpg4 curses. + + add refresh() call to dots_mvcur.c, needed to use mvcur() with + Solaris xpg4 curses after calling newterm(). + + minor fixes for configure script from work on ncurses-examples and + tin. + + improve animation in test/xmas.c by adding a time-delay in blinkit(). + + modify several test programs to reflect that ncurses honors existing + signal handlers in initscr(), while other implementations do not. + + modify bs.c to make it easier to quit. + + change ncurses-examples to use attr_t vs chtype to follow X/Open + documentation more closely since Solaris xpg4-curses uses different + values for WA_xxx vs A_xxx that rely on attr_t being an unsigned + short. Tru64 aka OSF1, HPUX, AIX did as ncurses does, equating the + two sets. + +20170923 + + modify menu for test/ncurses.c to fit on 24-line screen. + + build-fix for configure --with-caps=uwin + + add options to test_arrays.c, for selecting termcap vs terminfo, etc. + +20170916 + + minor fix to test/filter.c to avoid clearing the command in one case. + + modify filter() to discard clr_eos if back_color_erase is set. + +20170909 + + improve wide-character implementation of myADDNSTR() in frm_driver.c, + which was inconsistent with the normal implementation. + + save/restore cursor position in Undo_Justification(), matching + behavior of Buffer_To_Window() (report by Leon Winter). + + modify test/knight to provide the "slow" solution for small screens + using "R", noting that Warnsdorf's method is easily done with "a". + + modify several test-programs which call use_default_colors() to + consistently do this only if "-d" option is given. + + additional changes to test with non-standard variants of curses: + + modify a loop limit in firework.c to work around absence of limit + checks in some libraries. + + fill the last row of a window with "?" in firstlast if waddch does + not return ERR on the lower-right corner. + + add checks in test/configure for some functions not in 4.3BSD curses. + + fix a regression in test/configure (cf: 20170826). + +20170902 + + amend change for endwin-state for better consistency with the older + logic (report/patch by Jeb Rosen, cf: 20170722). + + modify check in fmt_entry() to handle a cancelled reset string + (Debian #873746). Make similar fixes in other parts of dump_entry.c + and tput.c + +20170827 + + fix a bug in repeat_char logic (cf: 20170729, report by Chris Clayton). + +20170826 + + fixes for "iterm2" (report by Leonardo Brondani Schenkel) -TD + + corrected a warning from tic about keys which are the same, to skip + over missing/cancelled values. + + add check in tic for unnecessary use of "2" to denote a shifted + special key. + + improve checks in trim_sgr0, comp_parse.c and parse_entry.c, for + cancelled string capabilities. + + add check in _nc_parse_entry() for invalid entry name, setting the + name to "invalid" to avoid problems storing entries. + + add/improve checks in tic's parser to address invalid input + + add a check in comp_scan.c to handle the special case where a + nontext file ending with a NUL rather than newline is given to tic + as input (Redhat #1484274). + + allow for cancelled capabilities in _nc_save_str (Redhat #1484276). + + add validity checks for "use=" target in _nc_parse_entry (Redhat + #1484284). + + check for invalid strings in postprocess_termcap (Redhat #1484285) + + reset secondary pointers on EOF in next_char() (Redhat #1484287). + + guard _nc_safe_strcpy() and _nc_safe_strcat() against calls using + cancelled strings (Redhat #1484291). + + correct typo in curs_memleaks.3x (Sven Joachim). + + improve test/configure checks for some curses variants not based on + X/Open Curses. + + add options for test/configure to disable checks for form, menu and + panel libraries. + +20170819 + + update "iterm" entry -TD + + add "iterm2" entry (report by Leonardo Brondani Schenkel) -TD + + regenerate llib-* files. + + regenerate HTML manpages. + + improve picsmap test-program: + + reduce memory used for tsearch + + add report in log file showing cumulative color coverage. + + add -x option to clear/tput to make the E3 extension optional + (cf: 20130622). + + add options -T and -V to clear command for compatibility with tput. + + add usage message to clear command (Debian #371855). + + improve usage messages for tset and tput. + + minor fixes to "RGB" extension and reset_color_pairs(). + +20170812 + + improve description of -R option in infocmp manual page (report by + Stephane Chazelas). + + add reset_color_pairs() function. + + add user_caps.5 manual page to document the terminfo extensions used + by ncurses. + + improve build scripts, using SIGQUIT vs SIGTRAP; add other configure + script fixes from work on xterm, lynx and tack. + + modify install-rule for ncurses-examples to put the data files in + /usr/share/ncurses-examples + + improve tracemunch, by changing address-parameters of add_wch(), + color_content() and pair_content() to dummy parameters. + + minor optimization to _nc_change_pair, to return quickly when the + current screen is marked for clearing. + + in-progress changes to improve performance of test/picsmap.c for + loading image files. + + modify allocation for SCREEN's color-pair table to start small, grow + on demand up to the existing limit. + + add "RGB" extension capability for direct-color support, use this to + improve color_content(). + + improve picsmap test-program: + + if no palette file is needed, attempt to load one based on $TERM, + checking first in the current directory, then by adding ".dat" + suffix, and finally in the data-directory, e.g., + /usr/share/ncurses-examples + + add "-l" option for logging + + add "-d" option for debugging + + add "-s" option for stepping automatically through list of images, + with time delay. + + use tsearch to improve time for loading color table for images. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20170729 + + update interix entry using tack and SFU on Windows 7 Ultimate -TD + + use ^? for kdch1 in interix (reported by Jonathan de Boyne Pollard) + + add "rep" to xterm-new, available since 1997/01/26 -TD + + move SGR 24 and 27 from vte-2014 to vte-2012 (request by Alain + Williams) -TD + + add a check in newline_forces_scroll() in case a program moves the + cursor outside scrolling margins (report by Robert King). + + improve _nc_tparm_analyze, using that to extend the checks made by + tic for reporting inconsistencies between the expected number of + parameters for a capability and the actual. + + amend handling of repeat_char capability in EmitRange (adapted from + report/patch by Dick Wesseling): + + translate the character to the alternate character set when the + alternate character set is enabled. + + do not use repeat_char for characters past 255. + + document "_nc_free_tinfo" in manual page, because it could be used in + tack for memory-leak checking. + + add "--without-tack" configure option to refine "--with-progs" + configure option. Normally tack is no longer built in-tree, but + a few packagers combine it during the build. If term_entry.h is + installed, there is no advantage to in-tree builds. + + adjust configure-script to define HAVE_CURSES_DATA_BOOLNAMES symbol + needed for tack 1.08 when built in-tree. Rather than relying upon + internal "_nc_" functions, tack now uses the boolean, number and + string capability name-arrays provided by ncurses and SVr4 Unix + curses. It still uses term_entry.h for the definitions of the + extended capability arrays. + + add an overlooked null-pointer check in mvcur changes from 20170722 + +20170722 + + improve test-packages for ncurses-examples and AdaCurses for lintian + + modify logic for endwin-state to be able to detect the case where + the screen was never initialized, using that to trigger a flush of + ncurses' buffer for mvcur, e.g., in test/dots_mvcur.c for the + term-driver configuration. + + add dependency upon ncurses_cfg.h to a few other internal header + files to allow each to be compiled separately. + + add dependency upon ncurses_cfg.h to tic's header-files; any program + using tic-library will have to supply this file. Legacy tack + versions supply this file; ongoing tack development has dropped the + dependency upon tic-library and new releases will not be affected. + +20170715 + + modify command-line parameters for "convert" used in picsmap to work + with ImageMagick 6.8 and newer. + + fix build-problem with tack and ABI-5 (Debian #868328). + + repair termcap-format from tic/infocmp broken in 20170701 fixes + (Debian #868266). + + reformat terminfo.src with 20170513 updates. + + improve test-packages to address lintian warnings. + +20170708 + + add a note to tic manual page about -W versus -f options. + + correct a limit-check in fixes from 20170701 (report by Sven Joachim). + +20170701 + + modify update_getenv() in db_iterator.c to ensure that environment + variables which are not initially set will be checked later if an + application happens to set them (patch by Guillaume Maudoux). + + remove initialization-check for calling napms() in the term-driver + configuration; none is needed. + + add help-screen to test/test_getstr.c and test/test_get_wstr.c + + improve compatibility between different configurations of new_prescr, + fixing a case with threaded code and term-driver where c++/demo did + not work (cf: 20160213). + + the fixes for Redhat #1464685 obscured a problem subsequently + reported in Redhat #1464687; the given test-case was no longer + reproducible. Testing without the fixes for the earlier reports + showed a problem with buffer overflow in dump_entry.c, which is + addressed by reducing the use of a fixed-size buffer. + + add/improve checks in tic's parser to address invalid input + (Redhat #1464684, #1464685, #1464686, #1464691). + + alloc_entry.c, add a check for a null-pointer. + + parse_entry.c, add several checks for valid pointers as well as + one check to ensure that a single character on a line is not + treated as the 2-character termcap short-name. + + fix a memory leak in delscreen() (report by Bai Junq). + + improve tracemunch, showing thread identifiers as names. + + fix a use-after-free in NCursesMenu::~NCursesMenu() + + further amend incorrect calls for memory-leaks from 20170617 changes + (report by Allen Hewes). + +20170624 + + modify c++/etip.h.in to accommodate deprecation of throw() and + throws() in c++17 (prompted by patch by Romain Geissler). + + remove some incorrect calls for memory-leaks from 20170617 changes + (report by Allen Hewes). + + add test-programs for termattrs and term_attrs. + + modify _nc_outc_wrapper to use the standard output if the screen was + not initialized, rather than returning an error. + + improve checks for low-level terminfo functions when the terminal + has not been initialized (Redhat #1345963). + + modify make_hash to allow building with address-sanitizer, + assuming that --disable-leaks is configured. + + amend changes for number_format() in 20170506 to avoid undefined + behavior when shifting (patch by Emanuele Giaquinta). + +20170617 + + fill in some places where TERMTYPE2 vs TERMTYPE was not used + (report by Allen Hewes). + + use ExitTerminfo() internally in error-exits for ncurses' setupterm + to help with leak checking. + + use ExitProgram() in error-exit from initscr() to help with leak + checking. + + review test-programs, adding checks for cases where the terminal + cannot be initialized. + +20170610 + + add option "-xp" to picsmap.c, to use init_extended_pair(). + + make simple performance fixes for picsmap.c + + improve aspect ratio of images read from "convert" in picsmap.c + +20170603 + + add option to picsmap to use color-palette files, e.g., for mapping + to xterm-256color. + + move the data in SCREEN used for the alloc_pair() function to the + end, to restore compatibility between ncurses/ncursesw libtinfo + (report/patch by Miroslav Lichvar). + + add build-time utility "report_offsets" to help show when the various + configurations of tinfo library are compatible or not. + +20170527 + + improved test/picsmap.c: + + lookup named colors for xpm files in rgb.txt + + accept blanks in color-keys for xpm files. + + if neither xbm/xpm work, try "convert", which may be available. + +20170520 + + modify test/picsmap.c to read xpm files. + + modify package/debian/* to create documentation packages, so the + related files can be checked with lintian. + + fix some typos in manpages (report/patch by Sven Joachim). + +20170513 + + add test/picsmap.c to fill in some testing issues not met by dots. + The initial version reads X bitmap (".xbm") files. + + repair logic which forces a repaint where a color-pair's content is + changed (cf: 20170311). + + improve tracemunch, showing screenXX pointers as names. + +20170506 + + modify tic/infocmp display of numeric values to use hexadecimal when + they are "close" to a power of two, making the result more readable. + + improve discussion of portability in curs_mouse.3x + + change line-length for generated html/manpages to 78 columns from 65. + + improve discussion of line-drawing characters in curs_add_wch.3x + (prompted by discussion with Lorinczy Zsigmond). + + cleanup formatting of hackguide.html and ncurses-intro.html + + add examples for WACS_D_PLUS and WACS_T_PLUS to test/ncurses.c + +20170429 + + corrected a case where $with_gpm was set to "maybe" after CF_WITH_GPM, + overlooked in 20160528 fixes (report by Alexandre Bury). + + improve a couple of test-program's help-messages. + + corrected loop in rain.c from 20170415 changes. + + modify winnstr and winchnstr to return error if the output pointer is + null, as well as adding a null pointer check of the window pointer + for better compatibility with other implementations. + + improve discussion of NetBSD curses in scr_dump.5 + + modify LIMIT_TYPED macro in new_pair.h to avoid changing sign of the + value to be limited (reports by Darby Payne, Rob Boudreau). + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20170422 + + build-fix for termcap-configuration (report by Chi-Hsuan Yen). + + improve terminfo manual page discussion of control- and graphics- + characters. + + remove tic warning about "^?" in string capabilities, which was + marked as an extension (cf: 20000610, 20110820); however all Unix + implementations support this and X/Open Curses does not address it. + On the other hand, termcap never did support this feature. + + correct missing comma-separator between string capabilities in + icl6402 and m2-nam -TD + + restore rmir/smir in ansi+idc to better match original ansiterm+idc, + add alias ansiterm (report by Robert King). + + amend an old check for ambiguous use of "ma" in terminfo versus + a termcap use, if the capability is cancelled to treat it as number. + + correct a case in _nc_captoinfo() which read "%%" and emitted "%". + + modify sscanf calls in _nc_infotocap() for patterns "%{number}%+%c" + and "%'char'%+%c" to check that the final character is really 'c', + avoiding a case in icl6404 which cannot be converted to termcap. + + in _nc_infotocap(), add a check to ensure that terminfo "^?" is not + written to termcap, because the BSDs did not implement that. + + in _nc_tic_expand() and _nc_infotocap(), improve string-length check + when deciding whether to use "^X" or "\xxx" format for control + characters, to make the output of tic/infocmp more predictable. + + limit termcap "%d" width to 2 digits on input, and use "%2" in + preference to "%02" on output. + + correct terminfo/termcap conversion of "%02" and "%03" into "%2" and + "%3"; the result repeated the last character. + + add man/scr_dump.5 to document screen-dump format. + +20170415 + + modify several test programs to use new popup_msgs, adapted from + help-screen used in test/edit_field.c + + drop two symbols obsoleted in 2004: _nc_check_termtype, and + _nc_resolve_uses + + fix some old copyright dates (cf: 20031025). + + build-fixes for test/savescreen.c to work with AIX and HPUX. + + minor fix to configure script, adding a backslash/continuation. + + extend TERMINAL structure for ABI 6 to store numbers internally as + integers rather than short, by adding new data for this purpose. + + more fixes for minor memory-leaks in test-programs. + +20170408 + + change logic in wins_nwstr() to avoid addressing data past the output + of mbstowcs(). + + correct a call to setcchar() in Data_Entry_w() from 20131207 changes. + + fix minor memory-leaks in test-programs. + + further improve ifdef in term_entry.h for internal definitions not + used by tack. + +20170401 + + minor fixes for vt100+4bsd, e.g., delay in sgr for consistency -TD + + add smso for env230, to match sgr -TD + + remove p7/protect from sgr in fbterm -TD + + drop setf/setb from fbterm; setaf/setab are enough -TD + + make xterm-pcolor sgr consistent with other capabilities -TD + + add rmxx/smxx ECMA-48 strikeout extension to tmux and xterm-basic + (discussion with Nicholas Marriott) + + add test-programs sp_tinfo and extended_color + + modify no-leaks code for lib_cur_term.c to account for the tgetent() + cache. + + modify setupterm() to save original tty-modes so that erasechar() + works as expected. Also modify _nc_setupscreen() to avoid redundant + calls to get original tty-modes. + + modify set_curterm() to update ttytype[] data used by longname(). + + modify wattr_set() and wattr_get() to return ERR if win-parameter is + null, as documented. + + improve cast used for null-pointer checks in header macros, to + reduce compiler warnings. + + modify several functions, using the reserved "opts" parameter to pass + color- and pair-values larger than 16-bits: + + getcchar(), setcchar(), slk_attr_set(), vid_puts(), wattr_get(), + wattr_set(), wchgat(), wcolor_set(). + + Other functions call these with the corresponding altered behavior, + including chgat(), mvchgat(), mvwchgat(), slk_color_on(), + slk_color_off(), vid_attr(). + + add new functions for manipulating color- and pair-values larger + than 16-bits. These are extended_color_content(), + extended_pair_content(), extended_slk_color(), init_extended_color(), + init_extended_pair(), and the corresponding sp-funcs. + +20170325 + + fix a memory leak in the window-list when creating multiple screens + (reports by Andres Martinelli, Debian #783486). + + reviewed calls from link_test.c, added a few more null-pointer + checks. + + add a null-pointer check in ungetmouse, in case mousemask was not + called (report by "Kau"). + + updated curs_sp_funcs.3x for new functions. + +20170318 + + change TERMINAL structure in term.h to make it opaque. Some + applications misuse its members, e.g., directly modifying it + rather than using def_prog_mode(). + + modify utility headers such as tic.h to make it clearer which are + externals that are used by tack. + + improve curs_slk.3x in particular its discussion of portability. + + fix cut/paste in legacy_encoding.3x + + add prototype for find_pair() to new_pair.3x (report by Branden + Robinson). + + fix a couple of broken links in generated man-html documentation. + + regenerate man-html documentation. + +20170311 + + modify vt100 rs2 string to reset vt52 mode and scrolling regions + (report/analysis by Robert King) -TD + + add vt100+4bsd building block, use that for older terminals rather + than "vt100" which is now mostly used as a building block for + terminal emulators -TD + + correct a few spelling errors in terminfo.src comments -TD + + add fbterm -TD + + fix a typo in ncurses.c test_attr legend (patch by Petr Vanek). + + changed internal colorpair_t to a struct, eliminating an internal + 8-bit limit on colors + + add ncurses/new_pair.h + + add ncurses/base/new_pair.c with alloc_pair(), find_pair() and + free_pair() functions + + add test/demo_new_pair.c + +20170304 + + improve terminfo manual description of terminfo syntax. + + clarify the use of wint_t vs wchar_t in curs_get_wstr.3x + + improve description of endwin() in manual. + + modify setcchar() and getcchar() to treat negative color-pair as an + error. + + fix a typo in include/hashed_db.h (Andre Sa). + +20170225 + + fixes for CF_CC_ENV_FLAGS (report by Ross Burton). + +20170218 + + fix several formatting issues with manual pages. + + correct read of terminfo entry in which all strings are absent or + explicitly cancelled. Before this fix, the result was that all were + treated as only absent. + + modify infocmp to suppress mixture of absent/cancelled capabilities + that would only show as "NULL, NULL", unless the -q option is used, + e.g., to show "-, @" or "@, -". + +20170212 + + build-fixes for PGI compilers (report by Adam J. Stewart) + + accept whitespace in sed expression for generating expanded.c + + modify configure check that g++ compiler warnings are not used. + + add configure check for -fPIC option needed for shared libraries. + + let configure --disable-ext-funcs override the default for the + --enable-sp-funcs option. + + mark some structs in form/menu/panel libraries as potentially opaque + without modifying API/ABI. + + add configure option --enable-opaque-curses for ncurses library and + similar options for the other libraries. + +20170204 + + trim newlines, tabs and escaped newlines from terminfo "paths" passed + to db-iterator. + + ignore zero-length files in db-iterator; these are useful for + instance to suppress "$HOME/.terminfo" when not wanted. + + amended "b64:" encoder to work with the terminfo reader. + + modify terminfo reader to accept "b64:" format using RFC-3548 in + as well as RFC-4648 url/filename-safe format. + + modify terminfo reader to accept "hex:" format as generated by + "infocmp -0qQ1" (cf: 20150905). + + adjust authors comment to reflect drop below 1% for SV. + +20170128 + + minor comment-fixes to help automate links to bug-urls -TD + + add dvtm, dvtm-256color -TD + + add settings corresponding to xterm-keys option to tmux entry to + reflect upcoming change to make that option "on" by default + (patch by Nicholas Marriott). + + uncancel Ms in tmux entry (Harry Gindi, Nicholas Marriott). + + add dumb-emacs-ansi -TD + +20170121 + + improve discussion of early history of tput program. + + incorporate A_COLOR mask into COLOR_PAIR(), in case user application + provides an out-of-range pair number (report by Elijah Stone). + + clarify description in tput manual page regarding support for + termcap names (prompted by FreeBSD #214709). + + remove a restriction in tput's support for termcap names which + omitted capabilities normally not shown in termcap translations + (cf: 990123). + + modify configure script for clang as used on FreeBSD, to work around + clang's differences in exit codes vs gcc. + +20170114 + + improve discussion of early history of tset/reset programs. + + clarify in manual pages that the optional verbose option level is + available only when ncurses is configured for tracing. + + amend change from 20161231 to avoid writing traces to the standard + error after initializing the trace feature using the environment + variable. + +20170107 + + amend changes for tput to reset tty modes to "sane" if the program + is run as "reset", like tset. Likewise, ensure that tset sends + either reset- or init-strings. + + improve manual page descriptions of tput init/reset and tset/reset, + to make it easier to see how they are similar and different. + + move a static result from key_name() to _nc_globals + + modify _nc_get_screensize to allow for use_env() and use_tioctl() + state to be per-screen when sp-funcs are configured, better matching + the behavior when using the term-driver configuration. + + improve cross-references in manual pages for often used functions + + move SCREEN field for use_tioctl() data before the ncursesw fields, + and limit that to the sp-funcs configuration to improve termlib + compatibility (cf: 20120714). + + correct order of initialization for traces in use_env() and + use_tioctl() versus first trace calls. + +20161231 + + fix errata for ncurses-howto (report by Damien Ruscoe). + + fix a few places in configure/build scripts where DESTDIR and rpath + were combined (report by Thomas Klausner). + + merge current st description (report by Harry Gindi) -TD + + modify flash capability for linux and wyse entries to put the delay + between the reverse/normal escapes rather than after -TD + + modify program tabs to pass the actual tty file descriptor to + setupterm rather than the standard output, making padding work + consistently. + + explain in clear's manual page that it writes to stdout. + + add special case for verbose debugging traces of command-line + utilities which write to stderr (cf: 20161126). + + remove a trace with literal escapes from skip_DECSCNM(), added in + 20161203. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20161224 + + correct parameters for copywin call in _nc_Synchronize_Attributes() + (patch by Leon Winter). + + improve color-handling section in terminfo manual page (prompted by + patch by Mihail Konev). + + modify programs clear, tput and tset to pass the actual tty file + descriptor to setupterm rather than the standard output, making + padding work. + +20161217 + + add tput-colorcube demo script. + + add -r and -s options to tput-initc demo, to match usage in xterm. + + flush the standard output in _nc_flush for the case where SP is zero, + e.g., when called via putp. This fixes a scenario where "tput flash" + did not work after changes in 20130112. + +20161210 + + add configure script option --disable-wattr-macros for use in cases + where one wants to use the same headers for ncurses5/ncurses6 + development, by suppressing the wattr* macros which differ due to + the introduction of extended colors (prompted by comments in + Debian #230990, Redhat #1270534). + + add test/tput-initc to demonstrate tput used to initialize palette + from a data file. + + modify test/xterm*.dat to use the newer color4/color12 values. + +20161203 + + improve discussion of field validation in form_driver.3x manual page. + + update curs_trace.3x manual page. + +20161126 + + modify linux-16color to not mask dim, standout or reverse with the + ncv capability -TD + + add 0.1sec mandatory delay to flash capabilities using the VT100 + reverse-video control -TD + + omit selection of ISO-8859-1 for G0 in enacs capability from linux2.6 + entry, to avoid conflict with the user-defined mapping. The reset + feature will use ISO-8859-1 in any case (Mikulas Patocka). + + improve check in tic for delays by also warning about beep/flash + when a delay is not embedded, or if those use the VT100 reverse + video escape without using a delay. + + minor fix for syntax-check of delays from 20161119 changes. + + modify trace() to avoid overwriting existing file (report by Maor + Shwartz). + +20161119 + + add check in tic for some syntax errors of delays, as well as use of + proportional delays for non-line capabilities. + + document history of the clear program and the E3 extension, prompted + by various discussions including + http://unix.stackexchange.com/questions/87469/clearing-the-old-scrollback-buffer + +20161112 + + improve -W option in tic/infocmp: + + correct order of size-adjustments in wrapped lines + + if -f option splits line, do not further split it with -W + + begin a new line when adding "use=" after a wrapped line + +20161105 + + fix typo in man/terminfo.tail (Alain Williams). + + correct program-name in adacurses6-config.1 manual page. + +20161029 + + add new function "unfocus_current_field" (Leon Winter) + +20161022 + + modify tset -w (and tput reset) to update the program's copy of the + screensize if it was already set in the system, to improve tabstop + setting which relies upon knowing the actual screensize. + + add functionality of tset -w to tput, like the "-c" feature this is + not optional in tput. + + add "clear" as a possible link/alias to tput. + + improve tput's check for being called as "init" or "reset" to allow + for transformed names. + + split-out the "clear" function from progs/clear.c, share with + tput to get the same behavior, e.g., the E3 extension. + +20161015 + + amend internal use of tputs to consistently use the number of lines + affected, e.g., for insert/delete character operations. While + merging terminfo source early in 1995, several descriptions used the + "*" proportional delay for these operations, prompting a change in + doupdate. + + regenerate llib-* files. + + regenerate HTML manpages. + + fix several formatting issues with manual pages. + +20161008 + + adjust size in infocmp/tic to work with strlcpy. + + fix configure script to record when strlcat is found on OpenBSD. + + build-fix for "recent" OpenBSD vs baudrate. + +20161001 + + add -W option to tic/infocmp to force long strings to wrap. This is + in addition to the -w option which attempts to fit capabilities into + a given line-length. + + add linux-m1 minitel entries (patch by Alexandre Montaron). + + correct rs2 string for vt100-nam -TD + +20160924 + + modify _nc_tic_expand to escape comma if it immediately follows a + percent sign, to work with minitel change. + + updated minitel and viewdata descriptions (Alexandre Montaron). + +20160917 + + build-fix for gnat6, which unhelpfully attempts to compile C files. + + fix typo in 20160910 changes (Debian #837892, patch by Sven Joachim). + +20160910 + + trim dead code ifdef'd with HIDE_EINTR since 970830 (discussion with + Leon Winter). + + trim some obsolete/incorrect wording about EINTR from wgetch manual + page (patch by Leon Winter). + + really correct 20100515 change (patch by Rich Coe). + + add "--enable-string-hacks" option to test/configure + + completed string-hacks for "sprintf", etc., including test-programs. + + make "--enable-string-hacks" work with Debian by checking for the + "bsd" library and its associated "" header. + +20160903 + + correct 20100515 change for weak signals versus sigprocmask (report + by Rich Coe). + + modify misc/Makefile.in to work around OpenBSD "make" which unlike + all other versions of "make" does not recognize continuation lines + of comments. + + amend the last change to CF_C_ENV_FLAGS to move only the + preprocessor, optimization and warning flags to CPPFLAGS and CFLAGS, + leaving the residue in CC. That happens to work for gcc's various + "model" options, but may require tuning for other compilers (report + by Sven Joachim). + +20160827 + + add "v" menu entry to test/ncurses.c to show baudrate and other + values. + + add "newer" baudrate symbols from Linux and FreeBSD to progs/tset.c, + lib_baudrate.c + + modify CF_XOPEN_SOURCE macro: + + add "uclinux" to case for "linux" (patch by Yann E. Morin) + + modify _GNU_SOURCE for cygwin headers, tested with cygwin 2.3, 2.5 + (patch by Corinna Vinschen, from changes to tin). + + improve CF_CC_ENV_FLAGS macro to allow for compiler wrappers such + as "ccache" (report by Enrico Scholz). + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20160820 + + update tput manual page to reflect changes to manipulate terminal + modes by sharing functions with tset. + + add the terminal-mode parts of "reset" (aka tset) to the "tput reset" + command, making the two almost the same except for window-size. + + adapt logic used in dialog "--keep-tite" option for test/filter.c as + "-a" option. When set, test/filter attempts to suppress the + alternate screen. + + correct a typo in interix entry -TD + +20160813 + + add a dependency upon generated-sources in Ada95/src/Makefile.in to + handle a case of "configure && make install". + + trim trailing blanks from include/Caps*, to work around a problem + in sed (Debian #818067). + +20160806 + + improve CF_GNU_SOURCE configure macro to optionally define + _DEFAULT_SOURCE work around a nuisance in recent glibc releases. + + move the terminfo-specific parts of tput's "reset" function into + the shared reset_cmd.c, making the two forms of reset use the same + strings. + + split-out the terminal initialization functions from tset as + progs/reset_cmd.c, as part of changes to merge the reset-feature + with tput. + +20160730 + + change tset's initialization to allow it to get settings from the + standard input as well as /dev/tty, to be more effective when + output or error are redirected. + + improve discussion of history and portability for tset/reset/tput + manual pages. + +20160723 + + improve error message from tset/reset when both stderr/stdout are + redirected to a file or pipe. + + improve organization of curs_attr.3x, curs_color.3x + +20160709 + + work around Debian's antique/unmaintained version of mawk when + building link_test. + + improve test/list_keys.c, showing ncurses's convention of modifiers + for special keys, based on xterm. + +20160702 + + improve test/list_keys.c, using $TERM if no parameters are given. + +20160625 + + build-fixes for ncurses "test_progs" rule. + + amend change to CF_CC_ENV_FLAGS in 20160521 to make multilib build + work (report by Sven Joachim). + +20160618 + + build-fixes for ncurses-examples with NetBSD curses. + + improve test/list_keys.c, fixing column-widths and sorting the list + to make it more readable. + +20160611 + + revise fix for Debian #805618 (report by Vlado Potisk, cf: 20151128). + + modify test/ncurses.c a/A screens to make exiting on an escape + character depend on the start of keypad and timeout modes, to allow + better testing of function-keys. + + modify rs1 for xterm-16color, xterm-88color and xterm-256color to + reset palette using "oc" string as in linux -TD + + use ANSI reply for u8 in xterm-new, to reflect vt220-style responses + that could be returned -TD + + added a few capabilities fixed in recent vte -TD + +20160604 + + correct logic for -f option in test/demo_terminfo.c + + add test/list_keys.c + +20160528 + + further workaround for PIE/PIC breakage which causes gpm to not link. + + fix most cppcheck warnings, mostly style, in ncurses library. + +20160521 + + improved manual page description of tset/reset versus window-size. + + fixes to work with a slightly broken compiler configuration which + cannot compile "Hello World!" without adding compiler options + (report by Ola x Nilsson): + + pass appropriate compiler options to the CF_PROG_CC_C_O macro. + + when separating compiler and options in CF_CC_ENV_FLAGS, ensure + that all options are split-off into CFLAGS or CPPFLAGS + + restore some -I options removed in 20140726 because they appeared + to be redundant. In fact, they are needed for a compiler that + cannot combine -c and -o options. + +20160514 + + regenerate HTML manpages. + + improve manual pages for wgetch and wget_wch to point out that they + might return values without names in curses.h (Debian #822426). + + make linux3.0 entry the default linux entry (Debian #823658) -TD + + modify linux2.6 entry to improve line-drawing so that the linux3.0 + entry can be used in non-UTF-8 mode -TD + + document return value of use_extended_names (report by Mike Gran). + +20160507 + + amend change to _nc_do_color to restore the early return for the + special case used in _nc_screen_wrap (report by Dick Streefland, + cf: 20151017). + + modify test/ncurses.c: + + check return-value of putwin + + correct ifdef which made the 'g' test's legend not reflect changes + to keypad- and scroll-modes. + + correct return-value of extended putwin (report by Mike Gran). + +20160423 + + modify test/ncurses.c 'd' edit-color menu to optionally read xterm + color palette directly from terminal, as well as handling KEY_RESIZE + and screen-repainting with control/L and control/R. + + add 'oc' capability to xterm+256color, allowing palette reset for + xterm -TD + +20160416 + + add workaround in configure script for inept transition to PIE vs + PIC builds documented in + https://fedoraproject.org/wiki/Changes/Harden_All_Packages + + add "reset" to list of programs whose names might change in manpages + due to program-transformation configure options. + + drop long-obsolete "-n" option from tset. + +20160409 + + modify test/blue.c to use Unicode values for card-glyphs when + available, as well as improving the check for CP437 and CP850. + +20160402 + + regenerate HTML manpages. + + improve manual pages for utilities with respect to POSIX versus + X/Open Curses. + +20160326 + + regenerate HTML manpages. + + improve test/demo_menus.c, allowing mouse-click on the menu-headers + to switch the active menu. This requires a new extension option + O_MOUSE_MENU to tell the menu driver to put mouse events which do not + apply to the active menu back into the queue so that the application + can handle the event. + +20160319 + + improve description of tgoto parameters (report by Steffen Nurpmeso). + + amend workaround for Solaris line-drawing to restore a special case + that maps Unicode line-drawing characters into the acsc string for + non-Unicode locales (Debian #816888). + +20160312 + + modified test/filter.c to illustrate an alternative to getnstr, that + polls for input while updating a clock on the right margin as well + as responding to window size-changes. + +20160305 + + omit a redefinition of "inline" when traces are enabled, since this + does not work with gcc 5.3.x MinGW cross-compiling (cf: 20150912). + +20160220 + + modify test/configure script to check for pthread dependency of + ncursest or ncursestw library when building ncurses examples, e.g., + in case weak symbols are used. + + modify configure macro for shared-library rules to use -Wl,-rpath + rather than -rpath to work around a bug in scons (FreeBSD #178732, + cf: 20061021). + + double-width multibyte characters were not counted properly in + winsnstr and wins_nwstr (report/example by Eric Pruitt). + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20160213 + + amend fix for _nc_ripoffline from 20091031 to make test/ditto.c work + in threaded configuration. + + move _nc_tracebits, _tracedump and _tracemouse to curses.priv.h, + since they are not part of the suggested ABI6. + +20160206 + + define WIN32_LEAN_AND_MEAN for MinGW port, making builds faster. + + modify test/ditto.c to allow $XTERM_PROG environment variable to + override "xterm" as the name of the program to run in the threaded + configuration. + +20160130 + + improve formatting of man/curs_refresh.3x and man/tset.1 manpages + + regenerate HTML manpages using newer man2html to eliminate some + unwanted blank lines. + +20160123 + + ifdef'd header-file definition of mouse_trafo() with NCURSES_NOMACROS + (report by Corey Minyard). + + fix some strict compiler-warnings in traces. + +20160116 + + tidy up comments about hardcoded 256color palette (report by + Leonardo Brondani Schenkel) -TD + + add putty-noapp entry, and amend putty entry to use application mode + for better consistency with xterm (report by Leonardo Brondani + Schenkel) -TD + + modify _nc_viscbuf2() and _tracecchar_t2() to trace wide-characters + as a whole rather than their multibyte equivalents. + + minor fix in wadd_wchnstr() to ensure that each cell has nonzero + width. + + move PUTC_INIT calls next to wcrtomb calls, to avoid carry-over of + error status when processing Unicode values which are not mapped. + +20160102 + + modify ncurses c/C color test-screens to take advantage of wide + screens, reducing the number of lines used for 88- and 256-colors. + + minor refinement to check versus ncv to ignore two parameters of + SGR 38 and 48 when those come from color-capabilities. + +20151226 + + add check in tic for use of bold, etc., video attributes in the + color capabilities, accounting whether the feature is listed in ncv. + + add check in tic for conflict between ritm, rmso, rmul versus sgr0. + +20151219 + + add a paragraph to curs_getch.3x discussing key naming (discussion + with James Crippen). + + amend workaround for Solaris vs line-drawing to take the configure + check into account. + + add a configure check for wcwidth() versus the ncurses line-drawing + characters, to use in special-casing systems such as Solaris. + +20151212 + + improve CF_XOPEN_CURSES macro used in test/configure, to define as + needed NCURSES_WIDECHAR for platforms where _XOPEN_SOURCE_EXTENDED + does not work. Also modified the test program to ensure that if + building with ncurses, that the cchar_t type is checked, since that + normally is since 20111030 ifdef'd depending on this test. + + improve 20121222 workaround for broken acs, letting Solaris "work" + in spite of its misconfigured wcwidth which marks all of the line + drawing characters as double-width. + +20151205 + + update form_cursor.3x, form_post.3x, menu_attributes.3x to list + function names in NAME section (patch by Jason McIntyre). + + minor fixes to manpage NAME/SYNOPSIS sections to consistently use + rule that either all functions which are prototyped in SYNOPSIS are + listed in the NAME section, or the manual-page name is the sole item + listed in the NAME section. The latter is used to reduce clutter, + e.g., for the top-level library manual pages as well as for certain + feature-pages such as SP-funcs and threading (prompted by patches by + Jason McIntyre). + +20151128 + + add option to preserve leading whitespace in form fields (patch by + Leon Winter). + + add missing assignment in lib_getch.c to make notimeout() work + (Debian #805618). + + add 't' toggle for notimeout() function in test/ncurses.c a/A screens + + add viewdata terminal description (Alexandre Montaron). + + fix a case in tic/infocmp for formatting capabilities where a + backslash at the end of a string was mishandled. + + fix some typos in curs_inopts.3x (Benno Schulenberg). + +20151121 + + fix some inconsistencies in the pccon* entries -TD + + add bold to pccon+sgr+acs and pccon-base (Tati Chevron). + + add keys f12-f124 to pccon+keys (Tati Chevron). + + add test/test_sgr.c program to exercise all combinations of sgr. + +20151107 + + modify tset's assignment to TERM in its output to reflect the name by + which the terminal description is found, rather than the primary + name. That was an unnecessary part from the initial conversion of + tset from termcap to terminfo. The termcap program in 4.3BSD did + this to avoid using the short 2-character name (report by Rich + Burridge). + + minor fix to configure script to ensure that rules for resulting.map + are only generated when needed (cf: 20151101). + + modify configure script to handle the case where tic-library is + renamed, but the --with-debug option is used by itself without + normal or shared libraries (prompted by comment in Debian #803482). + +20151101 + + amend change for pkg-config which allows build of pc-files when no + valid pkg-config library directory was configured to suppress the + actual install if it is not overridden to a valid directory at + install time (cf: 20150822). + + modify editing script which generates resulting.map to work with the + clang configuration on recent FreeBSD, which gives an error on an + empty "local" section. + + fix a spurious "(Part)" message in test/ncurses.c b/B tests due + to incorrect attribute-masking. + +20151024 + + modify MKexpanded.sh to update the expansion of a temporary filename + to "expanded.c", for use in trace statements. + + modify layout of b/B tests in test/ncurses.c to allow for additional + annotation on the right margin; some terminals with partial support + did not display well. + + fix typo in curs_attr.3x (patch by Sven Joachim). + + fix typo in INSTALL (patch by Tomas Cech). + + improve configure check for setting WILDCARD_SYMS variable; on ppc64 + the variable is in the Data section rather than Text (patch by Michel + Normand, Novell #946048). + + using configure option "--without-fallbacks" incorrectly caused + FALLBACK_LIST to be set to "no" (patch by Tomas Cech). + + updated minitel entries to fix kel problem with emacs, and add + minitel1b-nb (Alexandre Montaron). + + reviewed/updated nsterm entry Terminal.app in OSX -TD + + replace some dead URLs in comments with equivalents from the + Internet Archive -TD + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20151017 + + modify ncurses/Makefile.in to sort keys.list in POSIX locale + (Debian #801864, patch by Esa Peuha). + + remove an early-return from _nc_do_color, which can interfere with + data needed by bkgd when ncurses is configured with extended colors + (patch by Denis Tikhomirov). + > fixes for OS/2 (patches by KO Myung-Hun) + + use button instead of kbuf[0] in EMX-specific part of lib_mouse.c + + support building with libtool on OS/2 + + use stdc++ on OS/2 kLIBC + + clear cf_XOPEN_SOURCE on OS/2 + +20151010 + + add configure check for openpty to test/configure script, for ditto. + + minor fixes to test/view.c in investigating Debian #790847. + + update autoconf patch to 2.52.20150926, incorporates a fix for Cdk. + + add workaround for breakage of POSIX makefiles by recent binutils + change. + + improve check for working poll() by using posix_openpt() as a + fallback in case there is no valid terminal on the standard input + (prompted by discussion on bug-ncurses mailing list, Debian #676461). + +20150926 + + change makefile rule for removing resulting.map to distclean rather + than clean. + + add /lib/terminfo to terminfo-dirs in ".deb" test-package. + + add note on portability of resizeterm and wresize to manual pages. + +20150919 + + clarify in resizeterm.3x how KEY_RESIZE is pushed onto the input + stream. + + clarify in curs_getch.3x that the keypad mode affects ability to + read KEY_MOUSE codes, but does not affect KEY_RESIZE. + + add overlooked build-fix needed with Cygwin for separate Ada95 + configure script, cf: 20150606 (report by Nicolas Boulenguez) + +20150912 + + fixes for configure/build using clang on OSX (prompted by report by + William Gallafent). + + do not redefine "inline" in ncurses_cfg.h; this was originally to + solve a problem with gcc/g++, but is aggravated by clang's misuse + of symbols to pretend it is gcc. + + add braces to configure script to prevent unwanted add of + "-lstdc++" to the CXXLIBS symbol. + + improve/update test-program used for checking existence of stdc++ + library. + + if $CXXLIBS is set, the linkage test uses that in addition to $LIBS + +20150905 + + add note in curs_addch.3x about line-drawing when it depends upon + UTF-8. + + add tic -q option for consistency with infocmp, use it to suppress + all comments from the "tic -I" output. + + modify infocmp -q option to suppress the "Reconstructed from" + header. + + add infocmp/tic -Q option, which allows one to dump the compiled + form of the terminal entry, in hexadecimal or base64. + +20150822 + + sort options in usage message for infocmp, to make it simpler to + see unused letters. + + update usage message for tic, adding "-0" option. + + documented differences in ESCDELAY versus AIX's implementation. + + fix some compiler warnings from ports. + + modify --with-pkg-config-libdir option to make it possible to install + ".pc" files even if pkg-config is not found (adapted from patch by + Joshua Root). + +20150815 + + disallow "no" as a possible value for "--with-shlib-version" option, + overlooked in cleanup-changes for 20000708 (report by Tommy Alex). + + update release notes in INSTALL. + + regenerate llib-* files to help with review for release notes. + +20150810 + + workaround for Debian #65617, which was fixed in mawk's upstream + releases in 2009 (report by Sven Joachim). See + https://invisible-island.net/mawk/CHANGES.html#t20090727 + +20150808 6.0 release for upload to ftp.gnu.org + +20150808 + + build-fix for Ada95 on older platforms without stdint.h + + build-fix for Solaris, whose /bin/sh and /usr/bin/sed are non-POSIX. + + update release announcement, summarizing more than 800 changes across + more than 200 snapshots. + + minor fixes to manpages, etc., to simplify linking from announcement + page. + +20150725 + + updated llib-* files. + + build-fixes for ncurses library "test_progs" rule. + + use alternate workaround for gcc 5.x feature (adapted from patch by + Mikhail Peselnik). + + add status line to tmux via xterm+sl (patch by Nicholas Marriott). + + fixes for st 0.5 from testing with tack -TD + + review/improve several manual pages to break up wall-of-text: + curs_add_wch.3x, curs_attr.3x, curs_bkgd.3x, curs_bkgrnd.3x, + curs_getcchar.3x, curs_getch.3x, curs_kernel.3x, curs_mouse.3x, + curs_outopts.3x, curs_overlay.3x, curs_pad.3x, curs_termattrs.3x + curs_trace.3x, and curs_window.3x + +20150719 + + correct an old logic error for %A and %O in tparm (report by "zreed"). + + improve documentation for signal handlers by adding section in the + curs_initscr.3x page. + + modify logic in make_keys.c to not assume anything about the size + of strnames and strfnames variables, since those may be functions + in the thread- or broken-linker configurations (problem found by + Coverity). + + modify test/configure script to check for pthreads configuration, + e.g., ncursestw library. + +20150711 + + modify scripts to build/use test-packages for the pthreads + configuration of ncurses6. + + add references to ttytype and termcap symbols in demo_terminfo.c and + demo_termcap.c to ensure that when building ncursest.map, etc., that + the corresponding names such as _nc_ttytype are added to the list of + versioned symbols (report by Werner Fink) + + fix regression from 20150704 (report/patch by Werner Fink). + +20150704 + + fix a few problems reported by Coverity. + + fix comparison against "/usr/include" in misc/gen-pkgconfig.in + (report by Daiki Ueno, Debian #790548, cf: 20141213). + +20150627 + + modify configure script to remove deprecated ABI 5 symbols when + building ABI 6. + + add symbols _nc_Default_Field, _nc_Default_Form, _nc_has_mouse to + map-files, but marked as deprecated so that they can easily be + suppressed from ABI 6 builds (Debian #788610). + + comment-out "screen.xterm" entry, and inherit screen.xterm-256color + from xterm-new (report by Richard Birkett) -TD + + modify read_entry.c to set the error-return to -1 if no terminal + databases were found, as documented for setupterm. + + add test_setupterm.c to demonstrate normal/error returns from the + setupterm and restartterm functions. + + amend cleanup change from 20110813 which removed redundant definition + of ret_error, etc., from tinfo_driver.c, to account for the fact that + it should return a bool rather than int (report/analysis by Johannes + Schindelin). + +20150613 + + fix overflow warning for OSX with lib_baudrate.c (cf: 20010630). + + modify script used to generate map/sym files to mark 5.9.20150530 as + the last "5.9" version, and regenerated the files. That makes the + files not use ".current" for the post-5.9 symbols. This also + corrects the label for _nc_sigprocmask used in when weak symbols are + configured for the ncursest/ncursestw libraries (prompted by + discussion with Sven Joachim). + + fix typo in NEWS (report by Sven Joachim). + +20150606 pre-release + + make ABI 6 the default by updates to dist.mk and VERSION, with the + intention that the existing ABI 5 should build as before using the + "--with-abi-version=5" option. + + regenerate ada- and man-html documentation. + + minor fixes to color- and util-manpages. + + fix a regression in Ada95/gen/Makefile.in, to handle special case of + Cygwin, which uses the broken-linker feature. + + amend fix for CF_NCURSES_CONFIG used in test/configure to assume that + ncurses package scripts work when present for cross-compiling, as the + lessor of two evils (cf: 20150530). + + add check in configure script to disallow conflicting options + "--with-termlib" and "--enable-term-driver". + + move defaults for "--disable-lp64" and "--with-versioned-syms" into + CF_ABI_DEFAULTS macro. + +20150530 + + change private type for Event_Mask in Ada95 binding to work when + mmask_t is set to 32-bits. + + remove spurious "%;" from st entry (report by Daniel Pitts) -TD + + add vte-2014, update vte to use that -TD + + modify tic and infocmp to "move" a diagnostic for tparm strings that + have a syntax error to tic's "-c" option (report by Daniel Pitts). + + fix two problems with configure script macros (Debian #786436, + cf: 20150425, cf: 20100529). + +20150523 + + add 'P' menu item to test/ncurses.c, to show pad in color. + + improve discussion in curs_color.3x about color rendering (prompted + by comment on Stack Overflow forum): + + remove screen-bce.mlterm, since mlterm does not do "bce" -TD + + add several screen.XXX entries to support the respective variations + for 256 colors -TD + + add putty+fnkeys* building-block entries -TD + + add smkx/rmkx to capabilities analyzed with infocmp "-i" option. + +20150516 + + amend change to ".pc" files to only use the extra loader flags which + may have rpath options (report by Sven Joachim, cf: 20150502). + + change versioning for dpkg's in test-packages for Ada95 and + ncurses-examples for consistency with Debian, to work with package + updates. + + regenerate html manpages. + + clarify handling of carriage return in waddch manual page; it was + discussed only in the portability section (prompted by comment on + Stack Overflow forum): + +20150509 + + add test-packages for cross-compiling ncurses-examples using the + MinGW test-packages. These are only the Debian packages; RPM later. + + cleanup format of debian/copyright files + + add pc-files to the MinGW cross-compiling test-packages. + + correct a couple of places in gen-pkgconfig.in to handle renaming of + the tinfo library. + +20150502 + + modify the configure script to allow different default values + for ABI 5 versus ABI 6. + + add wgetch-events to test-packages. + + add a note on how to build ncurses-examples to test/README. + + fix a memory leak in delscreen (report by Daniel Kahn Gillmor, + Debian #783486) -TD + + remove unnecessary ';' from E3 capabilities -TD + + add tmux entry, derived from screen (patch by Nicholas Marriott). + + split-out recent change to nsterm-bce as nsterm-build326, and add + nsterm-build342 to reflect changes with successive releases of OSX + (discussion with Leonardo B Schenkel) + + add xon, ich1, il1 to ibm3161 (patch by Stephen Powell, Debian + #783806) + + add sample "magic" file, to document ext-putwin. + + modify gen-pkgconfig.in to add explicit -ltinfo, etc., to the + generated ".pc" file when ld option "--as-needed" is used, or when + ncurses and tinfo are installed without using rpath (prompted by + discussion with Sylvain Bertrand). + + modify test-package for ncurses6 to omit rpath feature when installed + in /usr. + + add OSX's "*.dSYM" to clean-rules in makefiles. + + make extra-suffix work for OSX configuration, e.g., for shared + libraries. + + modify Ada95/configure script to work with pkg-config + + move test-package for ncurses6 to /usr, since filename-conflicts have + been eliminated. + + corrected build rules for Ada95/gen/generate; it does not depend on + the ncurses library aside from headers. + + reviewed man pages, fixed a few other spelling errors. + + fix a typo in curs_util.3x (Sven Joachim). + + use extra-suffix in some overlooked shared library dependencies + found by 20150425 changes for test-packages. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20150425 + + expanded description of tgetstr's area pointer in manual page + (report by Todd M Lewis). + + in-progress changes to modify test-packages to use ncursesw6 rather + than ncursesw, with updated configure scripts. + + modify CF_NCURSES_CONFIG in Ada95- and test-configure scripts to + check for ".pc" files via pkg-config, but add a linkage check since + frequently pkg-config configurations are broken. + + modify misc/gen-pkgconfig.in to include EXTRA_LDFLAGS, e.g., for the + rpath option. + + add 'dim' capability to screen entry (report by Leonardo B Schenkel) + + add several key definitions to nsterm-bce to match preconfigured + keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel) + + fix repeated "extra-suffix" in ncurses-config.in (cf: 20150418). + + improve term_variables manual page, adding section on the terminfo + long-name symbols which are defined in the term.h header. + + fix bug in lib_tracebits.c introduced in const-fixes (cf: 20150404). + +20150418 + + avoid a blank line in output from tabs program by ending it with + a carriage return as done in FreeBSD (patch by James Clarke). + + build-fix for the "--enable-ext-putwin" feature when not using + wide characters (report by Werner Fink). + + modify autoconf macros to use scripting improvement from xterm. + + add -brtl option to compiler options on AIX 5-7, needed to link + with the shared libraries. + + add --with-extra-suffix option to help with installing nonconflicting + ncurses6 packages, e.g., avoiding header- and library-conflicts. + NOTE: as a side-effect, this renames + adacurses-config to adacurses5-config and + adacursesw-config to adacursesw5-config + + modify debian/rules test package to suffix programs with "6". + + clarify in curs_inopts.3x that window-specific settings do not + inherit into new windows. + +20150404 + + improve description of start_color() in the manual. + + modify several files in ncurses- and progs-directories to allow + const data used in internal tables to be put by the linker into the + readonly text segment. + +20150329 + + correct cut/paste error for "--enable-ext-putwin" that made it the + same as "--enable-ext-colors" (report by Roumen Petrov) + +20150328 + + add "-f" option to test/savescreen.c to help with testing/debugging + the extended putwin/getwin. + + add logic for writing/reading combining characters in the extended + putwin/getwin. + + add "--enable-ext-putwin" configure option to turn on the extended + putwin/getwin. + +20150321 + + in-progress changes to provide an extended version of putwin and + getwin which will be capable of reading screen-dumps between the + wide/normal ncurses configurations. These are text files, except + for a magic code at the beginning: + 0 string \210\210 Screen-dump (ncurses) + +20150307 + + document limitations of getwin in manual page (prompted by discussion + with John S Urban). + + extend test/savescreen.c to demonstrate that color pair values + and graphic characters can be restored using getwin. + +20150228 + + modify win_driver.c to eliminate the constructor, to make it more + usable in an application which may/may not need the console window + (report by Grady Martin). + +20150221 + + capture define's related to -D_XOPEN_SOURCE from the configure check + and add those to the *-config and *.pc files, to simplify use for + the wide-character libraries. + + modify ncurses.spec to accommodate Fedora21's location of pkg-config + directory. + + correct sense of "--disable-lib-suffixes" configure option (report + by Nicolas Boos, cf: 20140426). + +20150214 + + regenerate html manpages using improved man2html from work on xterm. + + regenerated ".map" and ".sym" files using improved script, accounting + for the "--enable-weak-symbols" configure option (report by Werner + Fink). + +20150131 + + regenerated ".map" and ".sym" files using improved script, showing + the combinations of configure options used at each stage. + +20150124 + + add configure check to determine if "local: _*;" can be used in the + ".map" files to selectively omit symbols beginning with "_". On at + least recent FreeBSD, the wildcard applies to all "_" symbols. + + remove obsolete/conflicting rule for ncurses.map from + ncurses/Makefile.in (cf: 20130706). + +20150117 + + improve description in INSTALL of the --with-versioned-syms option. + + add combination of --with-hashed-db and --with-ticlib to + configurations for ".map" files (report by Werner Fink). + +20150110 + + add a step to generating ".map" files, to declare any remaining + symbols beginning with "_" as local, at the last version node. + + improve configure checks for pkg-config, addressing a variant found + with FreeBSD ports. + + modify win_driver.c to provide characters for special keys, like + ansi.sys, when keypad mode is off, rather than returning nothing at + all (discussion with Eli Zaretskii). + + add "broken_linker" and "hashed-db" configure options to combinations + use for generating the ".map" and ".sym" files. + + avoid using "ld" directly when creating shared library, to simplify + cross-compiles. Also drop "-Bsharable" option from shared-library + rules for FreeBSD and DragonFly (FreeBSD #196592). + + fix a memory leak in form library Free_RegularExpression_Type() + (report by Pavel Balaev). + +20150103 + + modify_nc_flush() to retry if interrupted (patch by Stian Skjelstad). + + change map files to make _nc_freeall a global, since it may be used + via the Ada95 binding when checking for memory leaks. + + improve sed script used in 20141220 to account for wide-, threaded- + variations in ABI 6. + +20141227 + + regenerate ".map" files, using step overlooked in 20141213 to use + the same patch-dates across each file to match ncurses.map (report by + Sven Joachim). + +20141221 + + fix an incorrect variable assignment in 20141220 changes (report by + Sven Joachim). + +20141220 + + updated Ada95/configure with macro changes from 20141213 + + tie configure options --with-abi-version and --with-versioned-syms + together, so that ABI 6 libraries have distinct symbol versions from + the ABI 5 libraries. + + replace obsolete/nonworking link to man2html with current one, + regenerate html-manpages. + +20141213 + + modify misc/gen-pkgconfig.in to add -I option for include-directory + when using both --prefix and --disable-overwrite (report by Misty + De Meo). + + add configure option --with-pc-suffix to allow minor renaming of + ".pc" files and the corresponding library. Use this in the test + package for ncurses6. + + modify configure script so that if pkg-config is not installed, it + is still possible to install ".pc" files (report by Misty De Meo). + + updated ".sym" files, removing symbols which are marked as "local" + in the corresponding ".map" files. + + updated ".map" files to reflect move of comp_captab and comp_hash + from tic-library to tinfo-library in 20090711 (report by Sven + Joachim). + +20141206 + + updated ".map" files so that each symbol that may be shared across + the different library configurations has the same label. Some + review is needed to ensure these are really compatible. + + modify MKlib_gen.sh to work around change in development version of + gcc introduced here: + https://gcc.gnu.org/ml/gcc-patches/2014-06/msg02185.html + https://gcc.gnu.org/ml/gcc-patches/2014-07/msg00236.html + (reports by Marcus Shawcroft, Maohui Lei). + + improved configure macro CF_SUBDIR_PATH, from lynx changes. + +20141129 + + improved ".map" files by generating them with a script that builds + ncurses with several related configurations and merges the results. + A further refinement is planned, to make the tic- and tinfo-library + symbols use the same versions across each of the four configurations + which are represented (reports by Sven Joachim, Werner Fink). + +20141115 + + improve description of limits for color values and color pairs in + curs_color.3x (prompted by patch by Tim van der Molen). + + add VERSION file, using first field in that to record the ABI version + used for configure --with-libtool --disable-libtool-version + + add configure options for applying the ".map" and ".sym" files to + the ncurses, form, menu and panel libraries. + + add ".map" and ".sym" files to show exported symbols, e.g., for + symbol-versioning. + +20141101 + + improve strict compiler-warnings by adding a cast in TRACE_RETURN + and making a new TRACE_RETURN1 macro for cases where the cast does + not apply. + +20141025 + + in-progress changes to integrate the win32 console driver with the + msys2 configuration. + +20141018 + + reviewed terminology 0.6.1, add function key definitions. None of + the vt100-compatibility issues were improved -TD + + improve infocmp conversion of extended capabilities to termcap by + correcting the limit check against parametrized[], as well as filling + in a check if the string happens to have parameters, e.g., "xm" + in recent changes. + + add check for zero/negative dimensions for resizeterm and resize_term + (report by Mike Gran). + +20141011 + + add experimental support for xterm's 1005 mouse mode, to use in a + demonstration of its limitations. + + add experimental support for "%u" format to terminfo. + + modify test/ncurses.c to also show position reports in 'a' test. + + minor formatting fixes to _nc_trace_mmask_t, make this function + exported to help with debugging mouse changes. + + improve behavior of wheel-mice for xterm protocol, noting that there + are only button-presses for buttons "4" and "5", so there is no need + to wait to combine events into double-clicks (report/analysis by + Greg Field). + + provide examples xterm-1005 and xterm-1006 terminfo entries -TD + + implement decoder for xterm SGR 1006 mouse mode. + +20140927 + + implement curs_set in win_driver.c + + implement flash in win_driver.c + + fix an infinite loop in win_driver.c if the command-window loses + focus. + + improve the non-buffered mode, i.e., NCURSES_CONSOLE2, of + win_driver.c by temporarily changing the buffer-size to match the + window-size to eliminate the scrollback. Also enforce a minimum + screen-size of 24x80 in the non-buffered mode. + + modify generated misc/Makefile to suppress install.data from the + dependencies if the --disable-db-install option is used, compensating + for the top-level makefile changes used to add ncurses*-config in the + 20140920 changes (report by Steven Honeyman). + +20140920 + + add ncurses*-config to bin-directory of sample package-scripts. + + add check to ensure that getopt is available; this is a problem in + some older cross-compiler environments. + + expanded on the description of --disable-overwrite in INSTALL + (prompted by reports by Joakim Tjernlund, Thomas Klausner). + See Gentoo #522586 and NetBSD #49200 for examples. + which relates to the clarified guidelines. + + remove special logic from CF_INCLUDE_DIRS which adds the directory + for the --includedir from the build (report by Joakim Tjernlund). + + add case for Unixware to CF_XOPEN_SOURCE, from lynx changes. + + update config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20140913 + + add a configure check to ignore some of the plethora of non-working + C++ cross-compilers. + + build-fixes for Ada95 with gnat 4.9 + +20140906 + + build-fix and other improvements for port of ncurses-examples to + NetBSD. + + minor compiler-warning fixes. + +20140831 + + modify test/demo_termcap.c and test/demo_terminfo.c to make their + options more directly comparable, and add "-i" option to specify + a terminal description filename to parse for names to lookup. + +20140823 + + fix special case where double-width character overwrites a single- + width character in the first column (report by Egmont Koblinger, + cf: 20050813). + +20140816 + + fix colors in ncurses 'b' test which did not work after changing + it to put the test-strings in subwindows (cf: 20140705). + + merge redundant SEE-ALSO sections in form and menu manpages. + +20140809 + + modify declarations for user-data pointers in C++ binding to use + reinterpret_cast to facilitate converting typed pointers to void* + in user's application (patch by Adam Jiang). + + regenerated html manpages. + + add note regarding cause and effect for TERM in ncurses manpage, + having noted clueless verbiage in Terminal.app's "help" file + which reverses cause/effect. + + remove special fallback definition for NCURSES_ATTR_T, since macros + have resolved type-mismatches using casts (cf: 970412). + + fixes for win_driver.c: + + handle repainting on endwin/refresh combination. + + implement beep(). + + minor cleanup. + +20140802 + + minor portability fixes for MinGW: + + ensure WINVER is defined in makefiles rather than using headers + + add check for gnatprep "-T" option + + work around bug introduced by gcc 4.8.1 in MinGW which breaks + "trace" feature: + http://stackoverflow.com/questions/20877689/gcc-4-8-1-minggw-d-option-does-not-work-as-usual + + fix most compiler warnings for Cygwin ncurses-examples. + + restore "redundant" -I options in test/Makefile.in, since they are + typically needed when building the derived ncurses-examples package + (cf: 20140726). + +20140726 + + eliminate some redundant -I options used for building libraries, and + ensure that ${srcdir} is added to the include-options (prompted by + discussion with Paul Gilmartin). + + modify configure script to work with Minix3.2 + + add form library extension O_DYNAMIC_JUSTIFY option which can be + used to override the different treatment of justification for static + versus dynamic fields (adapted from patch by Leon Winter). + + add a null pointer check in test/edit_field.c (report/analysis by + Leon Winter, cf: 20130608). + +20140719 + + make workarounds for compiling test-programs with NetBSD curses. + + improve configure macro CF_ADD_LIBS, to eliminate repeated -l/-L + options, from xterm changes. + +20140712 + + correct Charable() macro check for A_ALTCHARSET in wide-characters. + + build-fix for position-debug code in tty_update.c, to work with or + without sp-funcs. + +20140705 + + add w/W toggle to ncurses.c 'B' test, to demonstrate permutation of + video-attributes and colors with double-width character strings. + +20140629 + + correct check in win_driver.c for saving screen contents, e.g., when + NCURSES_CONSOLE2 is set (cf: 20140503). + + reorganize b/B menu items in ncurses.c, putting the test-strings into + subwindows. This is needed for a planned change to use Unicode + fullwidth characters in the test-screens. + + correct update to form status for _NEWTOP, broken by fixes for + compiler warnings (patch by Leon Winter, cf: 20120616). + +20140621 + + change shared-library suffix for AIX 5 and 6 to ".so", avoiding + conflict with the static library (report by Ben Lentz). + + document RPATH_LIST in INSTALL file, as part of workarounds for + upgrading an ncurses library using the "--with-shared" option. + + modify test/ncurses.c c/C tests to cycle through subsets of the + total number of colors, to better illustrate 8/16/88/256-colors by + providing directly comparable screens. + + add test/dots_curses.c, for comparison with the low-level examples. + +20140614 + + fix dereference before null check found by Coverity in tic.c + (cf: 20140524). + + fix sign-extension bug in read_entry.c which prevented "toe" from + reading empty "screen+italics" entry. + + modify sgr for screen.xterm-new to support dim capability -TD + + add dim capability to nsterm+7 -TD + + cancel dim capability for iterm -TD + + add dim, invis capabilities to vte-2012 -TD + + add sitm/ritm to konsole-base and mlterm3 -TD + +20140609 + > fix regression in screen terminfo entries (reports by Christian + Ebert, Gabriele Balducci) -TD + + revert the change to screen; see notes for why this did not work -TD + + cancel sitm/ritm for entries which extend "screen", to work around + screen's hardcoded behavior for SGR 3 -TD + +20140607 + + separate masking for sgr in vidputs from sitm/ritm, which do not + overlap with sgr functionality. + + remove unneeded -i option from adacurses-config; put -a in the -I + option for consistency (patch by Pascal Pignard). + + update xterm-new terminfo entry to xterm patch #305 -TD + + change format of test-scripts for Debian Ada95 and ncurses-examples + packages to quilted to work around Debian #700177 (cf: 20130907). + + build fix for form_driver_w.c as part of ncurses-examples package for + older ncurses than 20131207. + + add Hello World example to adacurses-config manpage. + + remove unused --enable-pc-files option from Ada95/configure. + + add --disable-gnat-projects option for testing. + + revert changes to Ada95 project-files configuration (cf: 20140524). + + corrected usage message in adacurses-config. + +20140524 + + fix typo in ncurses manpage for the NCURSES_NO_MAGIC_COOKIE + environment variable. + + improve discussion of input-echoing in curs_getch.3x + + clarify discussion in curs_addch.3x of wrapping. + + modify parametrized.h to make fln non-padded. + + correct several entries which had termcap-style padding used in + terminfo: adm21, aj510, alto-h19, att605-pc, x820 -TD + + correct syntax for padding in some entries: dg211, h19 -TD + + correct ti924-8 which had confused padding versus octal escapes -TD + + correct padding in sbi entry -TD + + fix an old bug in the termcap emulation; "%i" was ignored in tparm() + because the parameters to be incremented were already on the internal + stack (report by Corinna Vinschen). + + modify tic's "-c" option to take into account the "-C" option to + activate additional checks which compare the results from running + tparm() on the terminfo expressions versus the translated termcap + expressions. + + modify tic to allow it to read from FIFOs (report by Matthieu Fronton, + cf: 20120324). + > patches by Nicolas Boulenguez: + + explicit dereferences to suppress some style warnings. + + when c_varargs_to_ada.c includes its header, use double quotes + instead of <>. + + samples/ncurses2-util.adb: removed unused with clause. The warning + was removed by an obsolete pragma. + + replaced Unreferenced pragmas with Warnings (Off). The latter, + available with older GNATs, needs no configure test. This also + replaces 3 untested Unreferenced pragmas. + + simplified To_C usage in trace handling. Using two parameters allows + some basic formatting, and avoids a warning about security with some + compiler flags. + + for generated Ada sources, replace many snippets with one pure + package. + + removed C_Chtype and its conversions. + + removed C_AttrType and its conversions. + + removed conversions between int, Item_Option_Set, Menu_Option_Set. + + removed int, Field_Option_Set, Item_Option_Set conversions. + + removed C_TraceType, Attribute_Option_Set conversions. + + replaced C.int with direct use of Eti_Error, now enumerated. As it + was used in a case statement, values were tested by the Ada compiler + to be consecutive anyway. + + src/Makefile.in: remove duplicate stanza + + only consider using a project for shared libraries. + + style. Silent gnat-4.9 warning about misplaced "then". + + generate shared library project to honor ADAFLAGS, LDFLAGS. + +20140510 + + cleanup recently introduced compiler warnings for MingW port. + + workaround for ${MAKEFLAGS} configure check versus GNU make 4.0, + which introduces more than one gratuitous incompatibility. + +20140503 + + add vt520ansi terminfo entry (patch by Mike Gran) + + further improve MinGW support for the scenario where there is an + ANSI-escapes handler such as ansicon running in the console window + (patch by Juergen Pfeifer). + +20140426 + + add --disable-lib-suffixes option (adapted from patch by Juergen + Pfeifer). + + merge some changes from Juergen Pfeifer's work with MSYS2, to + simplify later merging: + + use NC_ISATTY() macro for isatty() in library + + add _nc_mingw_isatty() and related functions to windows-driver + + rename terminal driver entrypoints to simplify grep's + + remove a check in the sp-funcs flavor of newterm() which allowed only + the first call to newterm() to succeed (report by Thomas Beierlein, + cf: 20090927). + +20140419 + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20140412 + + modify configure script: + + drop the -no-gcc option from Intel compiler, from lynx changes. + + extend the --with-hashed-db configure option to simplify building + with different versions of Berkeley database using FreeBSD ports. + + improve initialization for MinGW port (Juergen Pfeifer): + + enforce Windows-style path-separator if cross-compiling, + + add a driver-name method to each of the drivers, + + allow the Windows driver name to match "unknown", ignoring case, + + lengthen the built-in name for the Windows console driver to + "#win32console", and + + move the comparison of driver-names allowing abbreviation, e.g., + to "#win32con" into the Windows console driver. + +20140329 + + add check in tic for mismatch between ccc and initp/initc + + cancel ccc in putty-256color and konsole-256color for consistency + with the cancelled initc capability (patch by Sven Zuhlsdorf). + + add xterm+256setaf building block for various terminals which only + get the 256-color feature half-implemented -TD + + updated "st" entry (leaving the 0.1.1 version as "simpleterm") to + 0.4.1 -TD + +20140323 + + fix typo in "mlterm" entry (report by Gabriele Balducci) -TD + +20140322 + + use types from in sample build-scripts for chtype, etc. + + modify configure script and curses.h.in to allow the types specified + using --with-chtype and related options to be defined in + + add terminology entry -TD + + add mlterm3 entry, use that as "mlterm" -TD + + inherit mlterm-256color from mlterm -TD + +20140315 + + modify _nc_New_TopRow_and_CurrentItem() to ensure that the menu's + top-row is adjusted as needed to ensure that the current item is + on the screen (patch by Johann Klammer). + + add wgetdelay() to retrieve _delay member of WINDOW if it happens to + be opaque, e.g., in the pthread configuration (prompted by patch by + Soren Brinkmann). + +20140308 + + modify ifdef in read_entry.c to handle the case where + NCURSES_USE_DATABASE is not defined (patch by Xin Li). + + add cast in form_driver_w() to fix ARM build (patch by Xin Li). + + add logic to win_driver.c to save/restore screen contents when not + allocating a console-buffer (cf: 20140215). + +20140301 + + clarify error-returns from newwin (report by Ruslan Nabioullin). + +20140222 + + fix some compiler warnings in win_driver.c + + updated notes for wsvt25 based on tack and vttest -TD + + add teken entry to show actual properties of FreeBSD's "xterm" + console -TD + +20140215 + + in-progress changes to win_driver.c to implement output without + allocating a console-buffer. This uses a pre-existing environment + variable NCGDB used by Juergen Pfeifer for debugging (prompted by + discussion with Erwin Waterlander regarding Console2, which hangs + when reading in an allocated console-buffer). + + add -t option to gdc.c, and modify to accept "S" to step through the + scrolling-stages. + + regenerate NCURSES-Programming-HOWTO.html to fix some of the broken + html emitted by docbook. + +20140209 + + modify CF_XOPEN_SOURCE macro to omit followup check to determine if + _XOPEN_SOURCE can/should be defined. g++ 4.7.2 built on Solaris 10 + has some header breakage due to its own predefinition of this symbol + (report by Jean-Pierre Flori, Sage #15796). + +20140201 + + add/use symbol NCURSES_PAIRS_T like NCURSES_COLOR_T, to illustrate + which "short" types are for color pairs and which are color values. + + fix build for s390x, by correcting field bit offsets in generated + representation clauses when int=32 long=64 and endian=big, or at + least on s390x (patch by Nicolas Boulenguez). + + minor cleanup change to test/form_driver_w.c (patch by Gaute Hope). + +20140125 + + remove unnecessary ifdef's in Ada95/gen/gen.c, which reportedly do + not work as is with gcc 4.8 due to fixes using chtype cast made for + new compiler warnings by gcc 4.8 in 20130824 (Debian #735753, patch + by Nicolas Boulenguez). + +20140118 + + apply includesubdir variable which was introduced in 20130805 to + gen-pkgconfig.in (Debian #735782). + +20131221 + + further improved man2html, used this to fix broken links in html + manpages. See + ftp://ftp.invisible-island.net/ncurses/patches/man2html + +20131214 + + modify configure-script/ifdef's to allow OLD_TTY feature to be + suppressed if the type of ospeed is configured using the option + --with-ospeed to not be a short. By default, it is a short for + termcap-compatibility (adapted from suggestion by Christian + Weisgerber). + + correct a typo in _nc_baudrate() (patch by Christian Weisgerber, + cf: 20061230). + + fix a few -Wlogical-op warnings. + + updated llib-l* files. + +20131207 + + add form_driver_w() entrypoint to wide-character forms library, as + well as test program form_driver_w (adapted from patch by Gaute + Hope). + +20131123 + + minor fix for CF_GCC_WARNINGS to special-case options which are not + recognized by clang. + +20131116 + + add special case to configure script to move _XOPEN_SOURCE_EXTENDED + definition from CPPFLAGS to CFLAGS if it happens to be needed for + Solaris, because g++ errors with that definition (report by + Jean-Pierre Flori, Sage #15268). + + correct logic in infocmp's -i option which was intended to ignore + strings which correspond to function-keys as candidates for piecing + together initialization- or reset-strings. The problem dates to + 1.9.7a, but was overlooked until changes in -Wlogical-op warnings for + gcc 4.8 (report by David Binderman). + + updated CF_GCC_WARNINGS to documented options for gcc 4.9.0, moving + checks for -Wextra and -Wdeclaration-after-statement into the macro, + and adding checks for -Wignored-qualifiers, -Wlogical-op and + -Wvarargs + + updated CF_CURSES_UNCTRL_H and CF_SHARED_OPTS macros from ongoing + work on cdk. + + update config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20131110 + + minor cleanup of terminfo.tail + +20131102 + + use TS extension to describe xterm's title-escapes -TD + + modify terminator and nsterm-s to use xterm+sl-twm building block -TD + + update hurd.ti, add xenl to reflect 2011-03-06 change in + http://git.savannah.gnu.org/cgit/hurd/hurd.git/log/console/display.c + (Debian #727119). + + simplify pfkey expression in ansi.sys -TD + +20131027 + + correct/simplify ifdef's for cur_term versus broken-linker and + reentrant options (report by Jean-Pierre Flori, cf: 20090530). + + modify release/version combinations in test build-scripts to make + them more consistent with other packages. + +20131019 + + add nc_mingw.h to installed headers for MinGW port; needed for + compiling ncurses-examples. + + add rpm-script for testing cross-compile of ncurses-examples. + +20131014 + + fix new typo in CF_ADA_INCLUDE_DIRS macro (report by Roumen Petrov). + +20131012 + + fix a few compiler warnings in progs and test. + + minor fix to package/debian-mingw/rules, do not strip dll's. + + minor fixes to configure script for empty $prefix, e.g., when doing + cross-compiles to MinGW. + + add script for building test-packages of binaries cross-compiled to + MinGW using NSIS. + +20131005 + + minor fixes for ncurses-example package and makefile. + + add scripts for test-builds of cross-compiler packages for ncurses6 + to MinGW. + +20130928 + + some build-fixes for ncurses-examples with NetBSD-6.0 curses, though + it lacks some common functions such as use_env() which is not yet + addressed. + + build-fix and some compiler warning fixes for ncurses-examples with + OpenBSD 5.3 + + fix a possible null-pointer reference in a trace message from newterm. + + quiet a few warnings from NetBSD 6.0 namespace pollution by + nonstandard popcount() function in standard strings.h header. + + ignore g++ 4.2.1 warnings for "-Weffc++" in c++/cursesmain.cc + + fix a few overlooked places for --enable-string-hacks option. + +20130921 + + fix typo in curs_attr.3x (patch by Sven Joachim, cf: 20130831). + + build-fix for --with-shared option for DragonFly and FreeBSD (report + by Rong-En Fan, cf: 20130727). + +20130907 + + build-fixes for MSYS for two test-programs (patches by Ray Donnelly, + Alexey Pavlov). + + revert change to two of the dpkg format files, to work with dpkg + before/after Debian #700177. + + fix gcc -Wconversion warning in wattr_get() macro. + + add msys and msysdll to known host/configuration types (patch by + Alexey Pavlov). + + modify CF_RPATH_HACK configure macro to not rely upon "-u" option + of sort, improving portability. + + minor improvements for test-programs from reviewing Solaris port. + + update config.guess, config.sub from + http://git.savannah.gnu.org/cgit/config.git + +20130831 + + modify test/ncurses.c b/B tests to display lines only for the + attributes which a given terminal supports, to make room for an + italics test. + + completed ncv table in terminfo.tail; it did not list the wide + character codes listed in X/Open Curses issue 7. + + add A_ITALIC extension (prompted by discussion with Egmont Koblinger). + +20130824 + + fix some gcc 4.8 -Wconversion warnings. + + change format of dpkg test-scripts to quilted to work around bug + introduced by Debian #700177. + + discard cached keyname() values if meta() is changed after a value + was cached using (report by Kurban Mallachiev). + +20130816 + + add checks in tic to warn about terminals which lack cursor + addressing, capabilities or having those, are marked as hard_copy or + generic_type. + + use --without-progs in mingw-ncurses rpm. + + split out _nc_init_termtype() from alloc_entry.c to use in MinGW + port when tic and other programs are not needed. + +20130805 + + minor fixes to the --disable-overwrite logic, to ensure that the + configured $(includedir) is not cancelled by the mingwxx-filesystem + rpm macros. + + add --disable-db-install configure option, to simplify building + cross-compile support packages. + + add mingw-ncurses.spec file, for testing cross-compiles. + +20130727 + + improve configure macros from ongoing work on cdk, dialog, xterm: + + CF_ADD_LIB_AFTER - fix a problem with -Wl options + + CF_RPATH_HACK - add missing result-message + + CF_SHARED_OPTS - modify to use $rel_builddir in cygwin and mingw + dll symbols (which can be overridden) rather than explicit "../". + + CF_SHARED_OPTS - modify NetBSD and DragonFly symbols to use ${CC} + rather than ${LD} to improve rpath support. + + CF_SHARED_OPTS - add a symbol to denote the temporary files that + are created by the macro, to simplify clean-rules. + + CF_X_ATHENA - trim extra libraries to work with -Wl,--as-needed + + fix a regression in hashed-database support for NetBSD, which uses + the key-size differently from other implementations (cf: 20121229). + +20130720 + + further improvements for setupterm manpage, clarifying the + initialization of cur_term. + +20130713 + + improve manpages for initscr and setupterm. + + minor compiler-warning fixes + +20130706 + + add fallback defs for and (cf: 20120225). + + add check for size of wchar_t, use that to suppress a chunk of + wcwidth.h in MinGW port. + + quiet linker warnings for MinGW cross-compile with dll's using the + --enable-auto-import flag. + + add ncurses.map rule to ncurses/Makefile to help diagnose symbol + table issues. + +20130622 + + modify the clear program to take into account the E3 extended + capability to clear the terminal's scrollback buffer (patch by + Miroslav Lichvar, Redhat #815790). + + clarify in resizeterm manpage that LINES and COLS are updated. + + updated ansi example in terminfo.tail, correct misordered example + of sgr. + + fix other doclifter warnings for manpages + + remove unnecessary ".ta" in terminfo.tail, add missing ".fi" + (patch by Eric Raymond). + +20130615 + + minor changes to some configure macros to make them more reusable. + + fixes for tabs program (prompted by report by Nick Andrik). + + corrected logic in command-line parsing of -a and -c predefined + tab-lists options. + + allow "-0" and "-8" options to be combined with others, e.g.,"-0d". + + make warning messages more consistent with the other utilities by + not printing the full pathname of the program. + + add -V option for consistency with other utilities. + + fix off-by-one in columns for tabs program when processing an option + such as "-5" (patch by Nick Andrik). + +20130608 + + add to test/demo_forms.c examples of using the menu-hooks as well + as showing how the menu item user-data can be used to pass a callback + function pointer. + + add test/dots_termcap.c + + remove setupterm call from test/demo_termcap.c + + build-fix if --disable-ext-funcs configure option is used. + + modified test/edit_field.c and test/demo_forms.c to move the lengths + into a user-data structure, keeping the original string for later + expansion to free-format input/out demo. + + modified test/demo_forms.c to load data from file. + + added note to clarify Terminal.app's non-emulation of the various + terminal types listed in the preferences dialog -TD + + fix regression in error-reporting in lib_setup.c (Debian #711134, + cf: 20121117). + + build-fix for a case where --enable-broken_linker and + --enable-reentrant options are combined (report by George R Goffe). + +20130525 + + modify mvcur() to distinguish between internal use by the ncurses + library, and external callers, preventing it from reading the content + of the screen which is only nonblank when curses calls have updated + it. This makes test/dots_mvcur.c avoid painting colored cells in + the left margin of the display. + + minor fix to test/dots_mvcur.c + + move configured symbols USE_DATABASE and USE_TERMCAP to term.h as + NCURSES_USE_DATABASE and NCURSES_USE_TERMCAP to allow consistent + use of these symbols in term_entry.h + +20130518 + + corrected ifdefs in test/testcurs.c to allow comparison of mouse + interface versus pdcurses (cf: 20130316). + + add pow() to configure-check for math library, needed since + 20121208 for test/hanoi (Debian #708056). + + regenerated html manpages. + + update doctype used for html documentation. + +20130511 + + move nsterm-related entries out of "obsolete" section to more + plausible "ansi consoles" -TD + + additional cleanup of table-of-contents by reordering -TD + + revise fix for check for 8-bit value in _nc_insert_ch(); prior fix + prevented inserts when video attributes were attached to the data + (cf: 20121215) (Redhat #959534). + +20130504 + + fixes for issues found by Coverity: + + correct FNKEY() macro in progs/dump_entry.c, allowing kf11-kf63 to + display when infocmp's -R option is used for HP or AIX subsets. + + fix dead-code issue with test/movewindow.c + + improve limited-checking in _nc_read_termtype(). + +20130427 + + fix clang 3.2 warning in progs/dump_entry.c + + drop AC_TYPE_SIGNAL check; ncurses relies on c89 and later. + +20130413 + + add MinGW to cases where ncurses installs by default into /usr + (prompted by discussion with Daniel Silva Ferreira). + + add -D option to infocmp's usage-message (patch by Miroslav Lichvar). + + add a missing 'int' type for main function in configure check for + type of bool variable, to work with clang 3.2 (report by Dmitri + Gribenko). + + improve configure check for static_cast, to work with clang 3.2 + (report by Dmitri Gribenko). + + re-order rule for demo.o and macros defining header dependencies in + c++/Makefile.in to accommodate gmake (report by Dmitri Gribenko). + +20130406 + + improve parameter checking in copywin(). + + modify configure script to work around OS X's "libtool" program, to + choose glibtool instead. At the same time, chance the autoconf macro + to look for a "tool" rather than a "prog", to help with potential use + in cross-compiling. + + separate the rpath usage for c++ library from demo program + (Redhat #911540) + + update/correct header-dependencies in c++ makefile (report by Werner + Fink). + + add --with-cxx-shared to dpkg-script, as done for rpm-script. + +20130324 + + build-fix for libtool configuration (reports by Daniel Silva Ferreira + and Roumen Petrov). + +20130323 + + build-fix for OS X, to handle changes for --with-cxx-shared feature + (report by Christian Ebert). + + change initialization for vt220, similar entries for consistency + with cursor-key strings (NetBSD #47674) -TD + + further improvements to linux-16color (Benjamin Sittler) + +20130316 + + additional fix for tic.c, to allocate missing buffer space. + + eliminate configure-script warnings for gen-pkgconfig.in + + correct typo in sgr string for sun-color, + add bold for consistency with sgr, + change smso for consistency with sgr -TD + + correct typo in sgr string for terminator -TD + + add blink to the attributes masked by ncv in linux-16color (report + by Benjamin Sittler) + + improve warning message from post-load checking for missing "%?" + operator by tic/infocmp by showing the entry name and capability. + + minor formatting improvement to tic/infocmp -f option to ensure + line split after "%;". + + amend scripting for --with-cxx-shared option to handle the debug + library "libncurses++_g.a" (report by Sven Joachim). + +20130309 + + amend change to toe.c for reading from /dev/zero, to ensure that + there is a buffer for the temporary filename (cf: 20120324). + + regenerated html manpages. + + fix typo in terminfo.head (report by Sven Joachim, cf: 20130302). + + updated some autoconf macros: + + CF_ACVERSION_CHECK, from byacc 1.9 20130304 + + CF_INTEL_COMPILER, CF_XOPEN_SOURCE from luit 2.0-20130217 + + add configure option --with-cxx-shared to permit building + libncurses++ as a shared library when using g++, e.g., the same + limitations as libtool but better integrated with the usual build + configuration (Redhat #911540). + + modify MKkey_defs.sh to filter out build-path which was unnecessarily + shown in curses.h (Debian #689131). + +20130302 + + add section to terminfo manpage discussing user-defined capabilities. + + update manpage description of NCURSES_NO_SETBUF, explaining why it + is obsolete. + + add a check in waddch_nosync() to ensure that tab characters are + treated as control characters; some broken locales claim they are + printable. + + add some traces to the Windows console driver. + + initialize a temporary array in _nc_mbtowc, needed for some cases + of raw input in MinGW port. + +20130218 + + correct ifdef on change to lib_twait.c (report by Werner Fink). + + update config.guess, config.sub + +20130216 + + modify test/testcurs.c to work with mouse for ncurses as it does for + pdcurses. + + modify test/knight.c to work with mouse for pdcurses as it does for + ncurses. + + modify internal recursion in wgetch() which handles cooked mode to + check if the call to wgetnstr() returned an error. This can happen + when both nocbreak() and nodelay() are set, for instance (report by + Nils Christopher Brause) (cf: 960418). + + fixes for issues found by Coverity: + + add a check for valid position in ClearToEOS() + + fix in lib_twait.c when --enable-wgetch-events is used, pointer + use after free. + + improve a limit-check in make_hash.c + + fix a memory leak in hashed_db.c + +20130209 + + modify test/configure script to make it simpler to override names + of curses-related libraries, to help with linking with pdcurses in + MinGW environment. + + if the --with-terminfo-dirs configure option is not used, there is + no corresponding compiled-in value for that. Fill in "no default + value" for that part of the manpage substitution. + +20130202 + + correct initialization in knight.c which let it occasionally make + an incorrect move (cf: 20001028). + + improve documentation of the terminfo/termcap search path. + +20130126 + + further fixes to mvcur to pass callback function (cf: 20130112), + needed to make test/dots_mvcur work. + + reduce calls to SetConsoleActiveScreenBuffer in win_driver.c, to + help reduce flicker. + + modify configure script to omit "+b" from linker options for very + old HP-UX systems (report by Dennis Grevenstein) + + add HP-UX workaround for missing EILSEQ on old HP-UX systems (patch + by Dennis Grevenstein). + + restore memmove/strdup support for antique systems (request by + Dennis Grevenstein). + + change %l behavior in tparm to push the string length onto the stack + rather than saving the formatted length into the output buffer + (report by Roy Marples, cf: 980620). + +20130119 + + fixes for issues found by Coverity: + + fix memory leak in safe_sprintf.c + + add check for return-value in tty_update.c + + correct initialization for -s option in test/view.c + + add check for numeric overflow in lib_instr.c + + improve error-checking in copywin + + add advice in infocmp manpage for termcap users (Debian #698469). + + add "-y" option to test/demo_termcap and test/demo_terminfo to + demonstrate behavior with/without extended capabilities. + + updated termcap manpage to document legacy termcap behavior for + matching capability names. + + modify name-comparison for tgetstr, etc., to accommodate legacy + applications as well as to improve compatibility with BSD 4.2 + termcap implementations (Debian #698299) (cf: 980725). + +20130112 + + correct prototype in manpage for vid_puts. + + drop ncurses/tty/tty_display.h, ncurses/tty/tty_input.h, since they + are unused in the current driver model. + + modify mvcur to use stdout except when called within the ncurses + library. + + modify vidattr and vid_attr to use stdout as documented in manpage. + + amend changes made to buffering in 20120825 so that the low-level + putp() call uses stdout rather than ncurses' internal buffering. + The putp_sp() call does the same, for consistency (Redhat #892674). + +20130105 + + add "-s" option to test/view.c to allow it to start in single-step + mode, reducing size of trace files when it is used for debugging + MinGW changes. + + revert part of 20121222 change to tinfo_driver.c + + add experimental logic in win_driver.c to improve optimization of + screen updates. This does not yet work with double-width characters, + so it is ifdef'd out for the moment (prompted by report by Erwin + Waterlander regarding screen flicker). + +20121229 + + fix Coverity warnings regarding copying into fixed-size buffers. + + add throw-declarations in the c++ binding per Coverity warning. + + minor changes to new-items for consistent reference to bug-report + numbers. + +20121222 + + add *.dSYM directories to clean-rule in ncurses directory makefile, + for Mac OS builds. + + add a configure check for gcc option -no-cpp-precomp, which is not + available in all Mac OS X configurations (report by Andras Salamon, + cf: 20011208). + + improve 20021221 workaround for broken acs, handling a case where + that ACS_xxx character is not in the acsc string but there is a known + wide-character which can be used. + +20121215 + + fix several warnings from clang 3.1 --analyze, includes correcting + a null-pointer check in _nc_mvcur_resume. + + correct display of double-width characters with MinGW port (report + by Erwin Waterlander). + + replace MinGW's wcrtomb(), fixing a problem with _nc_viscbuf + > fixes based on Coverity report: + + correct coloring in test/bs.c + + correct check for 8-bit value in _nc_insert_ch(). + + remove dead code in progs/tset.c, test/linedata.h + + add null-pointer checks in lib_tracemse.c, panel.priv.h, and some + test-programs. + +20121208 + + modify test/knight.c to show the number of choices possible for + each position in automove option, e.g., to allow user to follow + Warnsdorff's rule to solve the puzzle. + + modify test/hanoi.c to show the minimum number of moves possible for + the given number of tiles (prompted by patch by Lucas Gioia). + > fixes based on Coverity report: + + remove a few redundant checks. + + correct logic in test/bs.c, when randomly placing a specific type of + ship. + + check return value from remove/unlink in tic. + + check return value from sscanf in test/ncurses.c + + fix a null dereference in c++/cursesw.cc + + fix two instances of uninitialized variables when configuring for the + terminal driver. + + correct scope of variable used in SetSafeOutcWrapper macro. + + set umask when calling mkstemp in tic. + + initialize wbkgrndset() temporary variable when extended-colors are + used. + +20121201 + + also replace MinGW's wctomb(), fixing a problem with setcchar(). + + modify test/view.c to load UTF-8 when built with MinGW by using + regular win32 API because the MinGW functions mblen() and mbtowc() + do not work. + +20121124 + + correct order of color initialization versus display in some of the + test-programs, e.g., test_addstr.c + > fixes based on Coverity report: + + delete windows on exit from some of the test-programs. + +20121117 + > fixes based on Coverity report: + + add missing braces around FreeAndNull in two places. + + various fixes in test/ncurses.c + + improve limit-checks in tinfo/make_hash.c, tinfo/read_entry.c + + correct malloc size in progs/infocmp.c + + guard against negative array indices in test/knight.c + + fix off-by-one limit check in test/color_name.h + + add null-pointer check in progs/tabs.c, test/bs.c, test/demo_forms.c, + test/inchs.c + + fix memory-leak in tinfo/lib_setup.c, progs/toe.c, + test/clip_printw.c, test/demo_menus.c + + delete unused windows in test/chgat.c, test/clip_printw.c, + test/insdelln.c, test/newdemo.c on error-return. + +20121110 + + modify configure macro CF_INCLUDE_DIRS to put $CPPFLAGS after the + local -I include options in case someone has set conflicting -I + options in $CPPFLAGS (prompted by patch for ncurses/Makefile.in by + Vassili Courzakis). + + modify the ncurses*-config scripts to eliminate relative paths from + the RPATH_LIST variable, e.g., "../lib" as used in installing shared + libraries or executables. + +20121102 + + realign these related pages: + curs_add_wchstr.3x + curs_addchstr.3x + curs_addstr.3x + curs_addwstr.3x + and fix a long-ago error in curs_addstr.3x which said that a -1 + length parameter would only write as much as fit onto one line + (report by Reuben Thomas). + + remove obsolete fallback _nc_memmove() for memmove()/bcopy(). + + remove obsolete fallback _nc_strdup() for strdup(). + + cancel any debug-rpm in package/ncurses.spec + + reviewed vte-2012, reverted most of the change since it was incorrect + based on testing with tack -TD + + un-cancel the initc in vte-256color, since this was implemented + starting with version 0.20 in 2009 -TD + +20121026 + + improve malloc/realloc checking (prompted by discussion in Redhat + #866989). + + add ncurses test-program as "ncurses6" to the rpm- and dpkg-scripts. + + updated configure macros CF_GCC_VERSION and CF_WITH_PATHLIST. The + first corrects pattern used for Mac OS X's customization of gcc. + +20121017 + + fix change to _nc_scroll_optimize(), which incorrectly freed memory + (Redhat #866989). + +20121013 + + add vte-2012, gnome-2012, making these the defaults for vte/gnome + (patch by Christian Persch). + +20121006 + + improve CF_GCC_VERSION to work around Debian's customization of gcc + --version message. + + improve configure macros as done in byacc: + + drop 2.13 compatibility; use 2.52.xxxx version only since EMX port + has used that for a while. + + add 3rd parameter to AC_DEFINE's to allow autoheader to run, i.e., + for experimental use. + + remove unused configure macros. + + modify configure script and makefiles to quiet new autoconf warning + for LIBS_TO_MAKE variable. + + modify configure script to show $PATH_SEPARATOR variable. + + update config.guess, config.sub + +20120922 + + modify setupterm to set its copy of TERM to "unknown" if configured + for the terminal driver and TERM was null or empty. + + modify treatment of TERM variable for MinGW port to allow explicit + use of the windows console driver by checking if $TERM is set to + "#win32con" or an abbreviation of that. + + undo recent change to fallback definition of vsscanf() to build with + older Solaris compilers (cf: 20120728). + +20120908 + + add test-screens to test/ncurses to show 256-characters at a time, + to help with MinGW port. + +20120903 + + simplify varargs logic in lib_printw.c; va_copy is no longer needed + there. + + modifications for MinGW port to make wide-character display usable. + +20120902 + + regenerate configure script (report by Sven Joachim, cf: 20120901). + +20120901 + + add a null-pointer check in _nc_flush (cf: 20120825). + + fix a case in _nc_scroll_optimize() where the _oldnums_list array + might not be allocated. + + improve comparisons in configure.in for unset shell variables. + +20120826 + + increase size of ncurses' output-buffer, in case of very small + initial screen-sizes. + + fix evaluation of TERMINFO and TERMINFO_DIRS default values as needed + after changes to use --datarootdir (reports by Gabriele Balducci, + Roumen Petrov). + +20120825 + + change output buffering scheme, using buffer maintained by ncurses + rather than stdio, to avoid problems with SIGTSTP handling (report + by Brian Bloniarz). + +20120811 + + update autoconf patch to 2.52.20120811, adding --datarootdir + (prompted by discussion with Erwin Waterlander). + + improve description of --enable-reentrant option in README and the + INSTALL file. + + add nsterm-256color, make this the default nsterm -TD + + remove bw from nsterm-bce, per testing with tack -TD + +20120804 + + update test/configure, adding check for tinfo library. + + improve limit-checks for the getch fifo (report by Werner Fink). + + fix a remaining mismatch between $with_echo and the symbols updated + for CF_DISABLE_ECHO affecting parameters for mk-2nd.awk (report by + Sven Joachim, cf: 20120317). + + modify followup check for pkg-config's library directory in the + --enable-pc-files option to validate syntax (report by Sven Joachim, + cf: 20110716). + +20120728 + + correct path for ncurses_mingw.h in include/headers, in case build + is done outside source-tree (patch by Roumen Petrov). + + modify some older xterm entries to align with xterm source -TD + + separate "xterm-old" alias from "xterm-r6" -TD + + add E3 extended capability to xterm-basic and putty -TD + + parenthesize parameters of other macros in curses.h -TD + + parenthesize parameter of COLOR_PAIR and PAIR_NUMBER in curses.h + in case it happens to be a comma-expression, etc. (patch by Nick + Black). + +20120721 + + improved form_request_by_name() and menu_request_by_name(). + + eliminate two fixed-size buffers in toe.c + + extend use_tioctl() to have expected behavior when use_env(FALSE) and + use_tioctl(TRUE) are called. + + modify ncurses test-program, adding -E and -T options to demonstrate + use_env() versus use_tioctl(). + +20120714 + + add use_tioctl() function (adapted from patch by Werner Fink, + Novell #769788): + +20120707 + + add ncurses_mingw.h to installed headers (prompted by patch by + Juergen Pfeifer). + + clarify return-codes from wgetch() in response to SIGWINCH (prompted + by Novell #769788). + + modify resizeterm() to always push a KEY_RESIZE onto the fifo, even + if screensize is unchanged. Modify _nc_update_screensize() to push a + KEY_RESIZE if there was a SIGWINCH, even if it does not call + resizeterm(). These changes eliminate the case where a SIGWINCH is + received, but ERR returned from wgetch or wgetnstr because the screen + dimensions did not change (Novell #769788). + +20120630 + + add --enable-interop to sample package scripts (suggested by Juergen + Pfeifer). + + update CF_PATH_SYNTAX macro, from mawk changes. + + modify mk-0th.awk to allow for generating llib-ltic, etc., though + some work is needed on cproto to work with lib_gen.c to update + llib-lncurses. + + remove redundant getenv() cal in database-iterator leftover from + cleanup in 20120622 changes (report by Sven Joachim). + +20120622 + + add -d, -e and -q options to test/demo_terminfo and test/demo_termcap + + fix caching of environment variables in database-iterator (patch by + Philippe Troin, Redhat #831366). + +20120616 + + add configure check to distinguish clang from gcc to eliminate + warnings about unused command-line parameters when compiler warnings + are enabled. + + improve behavior when updating terminfo entries which are hardlinked + by allowing for the possibility that an alias has been repurposed to + a new primary name. + + fix some strict compiler warnings based on package scripts. + + further fixes for configure check for working poll (Debian #676461). + +20120608 + + fix an uninitialized variable in -c/-n logic for infocmp changes + (cf: 20120526). + + corrected fix for building c++ binding with clang 3.0 (report/patch + by Richard Yao, Gentoo #417613, cf: 20110409) + + correct configure check for working poll, fixing the case where stdin + is redirected, e.g., in rpm/dpkg builds (Debian #676461). + + add rpm- and dpkg-scripts, to test those build-environments. + The resulting packages are used only for testing. + +20120602 + + add kdch1 aka "Remove" to vt220 and vt220-8 entries -TD + + add kdch1, etc., to qvt108 -TD + + add dl1/il1 to some entries based on dl/il values -TD + + add dl to simpleterm -TD + + add consistency-checks in tic for insert-line vs delete-line + controls, and insert/delete-char keys + + correct no-leaks logic in infocmp when doing comparisons, fixing + duplicate free of entries given via the command-line, and freeing + entries loaded from the last-but-one of files specified on the + command-line. + + add kdch1 to wsvt25 entry from NetBSD CVS (reported by David Lord, + analysis by Martin Husemann). + + add cnorm/civis to wsvt25 entry from NetBSD CVS (report/analysis by + Onno van der Linden). + +20120526 + + extend -c and -n options of infocmp to allow comparing more than two + entries. + + correct check in infocmp for number of terminal names when more than + two are given. + + correct typo in curs_threads.3x (report by Yanhui Shen on + freebsd-hackers mailing list). + +20120512 + + corrected 'op' for bterm (report by Samuel Thibault) -TD + + modify test/background.c to demonstrate a background character + holding a colored ACS_HLINE. The behavior differs from SVr4 due to + the thick- and double-line extension (cf: 20091003). + + modify handling of acs characters in PutAttrChar to avoid mapping an + unmapped character to a space with A_ALTCHARSET set. + + rewrite vt520 entry based on vt420 -TD + +20120505 + + remove p6 (bold) from opus3n1+ for consistency -TD + + remove acs stuff from env230 per clues in Ingres termcap -TD + + modify env230 sgr/sgr0 to match other capabilities -TD + + modify smacs/rmacs in bq300-8 to match sgr/sgr0 -TD + + make sgr for dku7202 agree with other caps -TD + + make sgr for ibmpc agree with other caps -TD + + make sgr for tek4107 agree with other caps -TD + + make sgr for ndr9500 agree with other caps -TD + + make sgr for sco-ansi agree with other caps -TD + + make sgr for d410 agree with other caps -TD + + make sgr for d210 agree with other caps -TD + + make sgr for d470c, d470c-7b agree with other caps -TD + + remove redundant AC_DEFINE for NDEBUG versus Makefile definition. + + fix a back-link in _nc_delink_entry(), which is needed if ncurses is + configured with --enable-termcap and --disable-getcap. + +20120428 + + fix some inconsistencies between vt320/vt420, e.g., cnorm/civis -TD + + add eslok flag to dec+sl -TD + + dec+sl applies to vt320 and up -TD + + drop wsl width from xterm+sl -TD + + reuse xterm+sl in putty and nsca-m -TD + + add ansi+tabs to vt520 -TD + + add ansi+enq to vt220-vt520 -TD + + fix a compiler warning in example in ncurses-intro.doc (Paul Waring). + + added paragraph in keyname manpage telling how extended capabilities + are interpreted as key definitions. + + modify tic's check of conflicting key definitions to include extended + capability strings in addition to the existing check on predefined + keys. + +20120421 + + improve cleanup of temporary files in tic using atexit(). + + add msgr to vt420, similar DEC vtXXX entries -TD + + add several missing vt420 capabilities from vt220 -TD + + factor out ansi+pp from several entries -TD + + change xterm+sl and xterm+sl-twm to include only the status-line + capabilities and not "use=xterm", making them more generally useful + as building-blocks -TD + + add dec+sl building block, as example -TD + +20120414 + + add XT to some terminfo entries to improve usefulness for other + applications than screen, which would like to pretend that xterm's + title is a status-line. -TD + + change use-clauses in ansi-mtabs, hp2626, and hp2622 based on review + of ordering and overrides -TD + + add consistency check in tic for screen's "XT" capability. + + add section in terminfo.src summarizing the user-defined capabilities + used in that file -TD + +20120407 + + fix an inconsistency between tic/infocmp "-x" option; tic omits all + non-standard capabilities, while infocmp was ignoring only the user + definable capabilities. + + improve special case in tic parsing of description to allow it to be + followed by terminfo capabilities. Previously the description had to + be the last field on an input line to allow tic to distinguish + between termcap and terminfo format while still allowing commas to be + embedded in the description. + + correct variable name in gen_edit.sh which broke configurability of + the --with-xterm-kbs option. + + revert 2011-07-16 change to "linux" alias, return to "linux2.2" -TD + + further amend 20110910 change, providing for configure-script + override of the "linux" terminfo entry to install and changing the + default for that to "linux2.2" (Debian #665959). + +20120331 + + update Ada95/configure to use CF_DISABLE_ECHO (cf: 20120317). + + correct order of use-clauses in st-256color -TD + + modify configure script to look for gnatgcc if the Ada95 binding + is built, in preference to the default gcc/cc (suggested by + Nicolas Boulenguez). + + modify configure script to ensure that the same -On option used for + the C compiler in CFLAGS is used for ADAFLAGS rather than simply + using "-O3" (suggested by Nicolas Boulenguez) + +20120324 + + amend an old fix so that next_char() exits properly for empty files, + e.g., from reading /dev/null (cf: 20080804). + + modify tic so that it can read from the standard input, or from + a character device. Because tic uses seek's, this requires writing + the data to a temporary file first (prompted by remark by Sven + Joachim) (cf: 20000923). + +20120317 + + correct a check made in lib_napms.c, so that terminfo applications + can again use napms() (cf: 20110604). + + add a note in tic.h regarding required casts for ABSENT_BOOLEAN + (cf: 20040327). + + correct scripting for --disable-echo option in test/configure. + + amend check for missing c++ compiler to work when no error is + reported, and no variables set (cf: 20021206). + + add/use configure macro CF_DISABLE_ECHO. + +20120310 + + fix some strict compiler warnings for abi6 and 64-bits. + + use begin_va_copy/end_va_copy macros in lib_printw.c (cf: 20120303). + + improve a limit-check in infocmp.c (Werner Fink): + +20120303 + + minor tidying of terminfo.tail, clarify reason for limitation + regarding mapping of \0 to \200 + + minor improvement to _nc_copy_termtype(), using memcpy to replace + loops. + + fix no-leaks checking in test/demo_termcap.c to account for multiple + calls to setupterm(). + + modified the libgpm change to show previous load as a problem in the + debug-trace. + > merge some patches from OpenSUSE rpm (Werner Fink): + + ncurses-5.7-printw.dif, fixes for varargs handling in lib_printw.c + + ncurses-5.7-gpm.dif, do not dlopen libgpm if already loaded by + runtime linker + + ncurses-5.6-fallback.dif, do not free arrays and strings from static + fallback entries + +20120228 + + fix breakage in tic/infocmp from 20120225 (report by Werner Fink). + +20120225 + + modify configure script to allow creating dll's for MinGW when + cross-compiling. + + add --enable-string-hacks option to control whether strlcat and + strlcpy may be used. The same issue applies to OpenBSD's warnings + about snprintf, noting that this function is weakly standardized. + + add configure checks for strlcat, strlcpy and snprintf, to help + reduce bogus warnings with OpenBSD builds. + + build-fix for OpenBSD 4.9 to supply consistent intptr_t declaration + (cf:20111231) + + update config.guess, config.sub + +20120218 + + correct CF_ETIP_DEFINES configure macro, making it exit properly on + the first success (patch by Pierre Labastie). + + improve configure macro CF_MKSTEMP by moving existence-check for + mkstemp out of the AC_TRY_RUN, to help with cross-compiles. + + improve configure macro CF_FUNC_POLL from luit changes to detect + broken implementations, e.g., with Mac OS X. + + add configure option --with-tparm-arg + + build-fix for MinGW cross-compiling, so that make_hash does not + depend on TTY definition (cf: 20111008). + +20120211 + + make sgr for xterm-pcolor agree with other caps -TD + + make sgr for att5425 agree with other caps -TD + + make sgr for att630 agree with other caps -TD + + make sgr for linux entries agree with other caps -TD + + make sgr for tvi9065 agree with other caps -TD + + make sgr for ncr260vt200an agree with other caps -TD + + make sgr for ncr160vt100pp agree with other caps -TD + + make sgr for ncr260vt300an agree with other caps -TD + + make sgr for aaa-60-dec-rv, aaa+dec agree with other caps -TD + + make sgr for cygwin, cygwinDBG agree with other caps -TD + + add configure option --with-xterm-kbs to simplify configuration for + Linux versus most other systems. + +20120204 + + improved tic -D option, avoid making target directory and provide + better diagnostics. + +20120128 + + add mach-gnu (Debian #614316, patch by Samuel Thibault) + + add mach-gnu-color, tweaks to mach-gnu terminfo -TD + + make sgr for sun-color agree with smso -TD + + make sgr for prism9 agree with other caps -TD + + make sgr for icl6404 agree with other caps -TD + + make sgr for ofcons agree with other caps -TD + + make sgr for att5410v1, att4415, att620 agree with other caps -TD + + make sgr for aaa-unk, aaa-rv agree with other caps -TD + + make sgr for avt-ns agree with other caps -TD + + amend fix intended to separate fixups for acsc to allow "tic -cv" to + give verbose warnings (cf: 20110730). + + modify misc/gen-edit.sh to make the location of the tabset directory + consistent with misc/Makefile.in, i.e., using ${datadir}/tabset + (Debian #653435, patch by Sven Joachim). + +20120121 + + add --with-lib-prefix option to allow configuring for old/new flavors + of OS/2 EMX. + + modify check for gnat version to allow for year, as used in FreeBSD + port. + + modify check_existence() in db_iterator.c to simply check if the + path is a directory or file, according to the need. Checking for + directory size also gives no usable result with OS/2 (cf: 20120107). + + support OS/2 kLIBC (patch by KO Myung-Hun). + +20120114 + + several improvements to test/movewindow.c (prompted by discussion on + Linux Mint forum): + + modify movement commands to make them continuous + + rewrote the test for mvderwin + + rewrote the test for recursive mvwin + + split-out reusable CF_WITH_NCURSES_ETC macro in test/configure.in + + updated configure macro CF_XOPEN_SOURCE, build-fixes for Mac OS X + and OpenBSD. + + regenerated html manpages. + +20120107 + + various improvements for MinGW (Juergen Pfeifer): + + modify stat() calls to ignore the st_size member + + drop mk-dlls.sh script. + + change recommended regular expression library. + + modify rain.c to allow for threaded configuration. + + modify tset.c to allow for case when size-change logic is not used. + +20111231 + + modify toe's report when -a and -s options are combined, to add + a column showing which entries belong to a given database. + + add -s option to toe, to sort its output. + + modify progs/toe.c, simplifying use of db-iterator results to use + caching improvements from 20111001 and 20111126. + + correct generation of pc-files when ticlib or termlib options are + given to rename the corresponding tic- or tinfo-libraries (report + by Sven Joachim). + +20111224 + + document a portability issue with tput, i.e., that scripts which work + with ncurses may fail in other implementations that do no parameter + analysis. + + add putty-sco entry -TD + +20111217 + + review/fix places in manpages where --program-prefix configure option + was not being used. + + add -D option to infocmp, to show the database locations that it + could use. + + fix build for the special case where term-driver, ticlib and termlib + are all enabled. The terminal driver depends on a few features in + the base ncurses library, so tic's dependencies include both ncurses + and termlib. + + fix build work for term-driver when --enable-wgetch-events option is + enabled. + + use types to fix some questionable casts to void*. + +20111210 + + modify configure script to check if thread library provides + pthread_mutexattr_settype(), e.g., not provided by Solaris 2.6 + + modify configure script to suppress check to define _XOPEN_SOURCE + for IRIX64, since its header files have a conflict versus + _SGI_SOURCE. + + modify configure script to add ".pc" files for tic- and + tinfo-libraries, which were omitted in recent change (cf: 20111126). + + fix inconsistent checks on $PKG_CONFIG variable in configure script. + +20111203 + + modify configure-check for etip.h dependencies, supplying a temporary + copy of ncurses_dll.h since it is a generated file (prompted by + Debian #646977). + + modify CF_CPP_PARAM_INIT "main" function to work with current C++. + +20111126 + + correct database iterator's check for duplicate entries + (cf: 20111001). + + modify database iterator to ignore $TERMCAP when it is not an + absolute pathname. + + add -D option to tic, to show the database locations that it could + use. + + improve description of database locations in tic manpage. + + modify the configure script to generate a list of the ".pc" files to + generate, rather than deriving the list from the libraries which have + been built (patch by Mike Frysinger). + + use AC_CHECK_TOOLS in preference to AC_PATH_PROGS when searching for + ncurses*-config, e.g., in Ada95/configure and test/configure (adapted + from patch by Mike Frysinger). + +20111119 + + remove obsolete/conflicting fallback definition for _POSIX_SOURCE + from curses.priv.h, fixing a regression with IRIX64 and Tru64 + (cf: 20110416) + + modify _nc_tic_dir() to ensure that its return-value is nonnull, + i.e., the database iterator was not initialized. This case is needed + to when tic is translating to termcap, rather than loading the + database (cf: 20111001). + +20111112 + + add pccon entries for OpenBSD console (Alexei Malinin). + + build-fix for OpenBSD 4.9 with gcc 4.2.1, setting _XOPEN_SOURCE to + 600 to work around inconsistent ifdef'ing of wcstof between C and + C++ header files. + + modify capconvert script to accept more than exact match on "xterm", + e.g., the "xterm-*" variants, to exclude from the conversion (patch + by Robert Millan). + + add -lc_r as alternative for -lpthread, allows build of threaded code + in older FreeBSD machines. + + build-fix for MirBSD, which fails when either _XOPEN_SOURCE or + _POSIX_SOURCE are defined. + + fix a typo misc/Makefile.in, used in uninstalling pc-files. + +20111030 + + modify make_db_path() to allow creating "terminfo.db" in the same + directory as an existing "terminfo" directory. This fixes a case + where switching between hashed/filesystem databases would cause the + new hashed database to be installed in the next best location - + root's home directory. + + add variable cf_cv_prog_gnat_correct to those passed to + config.status, fixing a problem with Ada95 builds (cf: 20111022). + + change feature test from _XPG5 to _XOPEN_SOURCE in two places, to + accommodate broken implementations for _XPG6. + + eliminate usage of NULL symbol from etip.h, to reduce header + interdependencies. + + add configure check to decide when to add _XOPEN_SOURCE define to + compiler options, i.e., for Solaris 10 and later (cf: 20100403). + This is a workaround for gcc 4.6, which fails to build the c++ + binding if that symbol is defined by the application, due to + incorrectly combining the corresponding feature test macros + (report by Peter Kruse). + +20111022 + + correct logic for discarding mouse events, retaining the partial + events used to build up click, double-click, etc, until needed + (cf: 20110917). + + fix configure script to avoid creating unused Ada95 makefile when + gnat does not work. + + cleanup width-related gcc 3.4.3 warnings for 64-bit platform, for the + internal functions of libncurses. The external interface of courses + uses bool, which still produces these warnings. + +20111015 + + improve description of --disable-tic-depends option to make it + clear that it may be useful whether or not the --with-termlib + option is also given (report by Sven Joachim). + + amend termcap equivalent for set_pglen_inch to use the X/Open + "YI" rather than the obsolete Solaris 2.5 "sL" (cf: 990109). + + improve manpage for tgetent differences from termcap library. + +20111008 + + moved static data from db_iterator.c to lib_data.c + + modify db_iterator.c for memory-leak checking, fix one leak. + + modify misc/gen-pkgconfig.in to use Requires.private for the parts + of ncurses rather than Requires, as well as Libs.private for the + other library dependencies (prompted by Debian #644728). + +20111001 + + modify tic "-K" option to only set the strict-flag rather than force + source-output. That allows the same flag to control the parser for + input and output of termcap source. + + modify _nc_getent() to ignore backslash at the end of a comment line, + making it consistent with ncurses' parser. + + restore a special-case check for directory needed to make termcap + text files load as if they were databases (cf: 20110924). + + modify tic's resolution/collision checking to attempt to remove the + conflicting alias from the second entry in the pair, which is + normally following in the source file. Also improved the warning + message to make it simpler to see which alias is the problem. + + improve performance of the database iterator by caching search-list. + +20110925 + + add a missing "else" in changes to _nc_read_tic_entry(). + +20110924 + + modify _nc_read_tic_entry() so that hashed-database is checked before + filesystem. + + updated CF_CURSES_LIBS check in test/configure script. + + modify configure script and makefiles to split TIC_ARGS and + TINFO_ARGS into pieces corresponding to LDFLAGS and LIBS variables, + to help separate searches for tic- and tinfo-libraries (patch by Nick + Alcock aka "Nix"). + + build-fix for lib_mouse.c changes (cf: 20110917). + +20110917 + + fix compiler warning for clang 2.9 + + improve merging of mouse events (integrated patch by Damien + Guibouret). + + correct mask-check used in lib_mouse for wheel mouse buttons 4/5 + (patch by Damien Guibouret). + +20110910 + + modify misc/gen_edit.sh to select a "linux" entry which works with + the current kernel rather than assuming it is always "linux3.0" + (cf: 20110716). + + revert a change to getmouse() which had the undesirable side-effect + of suppressing button-release events (report by Damien Guibouret, + cf: 20100102). + + add xterm+kbs fragment from xterm #272 -TD + + add configure option --with-pkg-config-libdir to provide control over + the actual directory into which pc-files are installed, do not use + the pkg-config environment variables (discussion with Frederic L W + Meunier). + + add link to mailing-list archive in announce.html.in, as done in + FAQ (prompted by question by Andrius Bentkus). + + improve manpage install by adjusting the "#include" examples to + show the ncurses-subdirectory used when --disable-overwrite option + is used. + + install an alias for "curses" to the ncurses manpage, tied to the + --with-curses-h configure option (suggested by Reuben Thomas). + +20110903 + + propagate error-returns from wresize, i.e., the internal + increase_size and decrease_size functions through resize_term (report + by Tim van der Molen, cf: 20020713). + + fix typo in tset manpage (patch by Sven Joachim). + +20110820 + + add a check to ensure that termcap files which might have "^?" do + not use the terminfo interpretation as "\177". + + minor cleanup of X-terminal emulator section of terminfo.src -TD + + add terminator entry -TD + + add simpleterm entry -TD + + improve wattr_get macros by ensuring that if the window pointer is + null, then the attribute and color values returned will be zero + (cf: 20110528). + +20110813 + + add substitution for $RPATH_LIST to misc/ncurses-config.in + + improve performance of tic with hashed-database by caching the + database connection, using atexit() to cleanup. + + modify treatment of 2-character aliases at the beginning of termcap + entries so they are not counted in use-resolution, since these are + guaranteed to be unique. Also ignore these aliases when reporting + the primary name of the entry (cf: 20040501) + + double-check gn (generic) flag in terminal descriptions to + accommodate old/buggy termcap databases which misused that feature. + + minor fixes to _nc_tgetent(), ensure buffer is initialized even on + error-return. + +20110807 + + improve rpath fix from 20110730 by ensuring that the new $RPATH_LIST + variable is defined in the makefiles which use it. + + build-fix for DragonFlyBSD's pkgsrc in test/configure script. + + build-fixes for NetBSD 5.1 with termcap support enabled. + + corrected k9 in dg460-ansi, add other features based on manuals -TD + + improve trimming of whitespace at the end of terminfo/termcap output + from tic/infocmp. + + when writing termcap source, ensure that colons in the description + field are translated to a non-delimiter, i.e., "=". + + add "-0" option to tic/infocmp, to make the termcap/terminfo source + use a single line. + + add a null-pointer check when handling the $CC variable. + +20110730 + + modify configure script and makefiles in c++ and progs to allow the + directory used for rpath option to be overridden, e.g., to work + around updates to the variables used by tic during an install. + + add -K option to tic/infocmp, to provide stricter BSD-compatibility + for termcap output. + + add _nc_strict_bsd variable in tic library which controls the + "strict" BSD termcap compatibility from 20110723, plus these + features: + + allow escapes such as "\8" and "\9" when reading termcap + + disallow "\a", "\e", "\l", "\s" and "\:" escapes when reading + termcap files, passing through "a", "e", etc. + + expand "\:" as "\072" on output. + + modify _nc_get_token() to reset the token's string value in case + there is a string-typed token lacking the "=" marker. + + fix a few memory leaks in _nc_tgetent. + + fix a few places where reading from a termcap file could refer to + freed memory. + + add an overflow check when converting terminfo/termcap numeric + values, since terminfo stores those in a short, and they must be + positive. + + correct internal variables used for translating to termcap "%>" + feature, and translating from termcap %B to terminfo, needed by + tctest (cf: 19991211). + + amend a minor fix to acsc when loading a termcap file to separate it + from warnings needed for tic (cf: 20040710) + + modify logic in _nc_read_entry() and _nc_read_tic_entry() to allow + a termcap file to be handled via TERMINFO_DIRS. + + modify _nc_infotocap() to include non-mandatory padding when + translating to termcap. + + modify _nc_read_termcap_entry(), passing a flag in the case where + getcap is used, to reduce interactive warning messages. + +20110723 + + add a check in start_color() to limit color-pairs to 256 when + extended colors are not supported (patch by David Benjamin). + + modify setcchar to omit no-longer-needed OR'ing of color pair in + the SetAttr() macro (patch by David Benjamin). + + add kich1 to sun terminfo entry (Yuri Pankov) + + use bold rather than reverse for smso in sun-color terminfo entry + (Yuri Pankov). + + improve generation of termcap using tic/infocmp -C option, e.g., + to correspond with 4.2BSD (prompted by discussion with Yuri Pankov + regarding Schilling's test program): + + translate %02 and %03 to %2 and %3 respectively. + + suppress string capabilities which use %s, not supported by tgoto + + use \040 rather than \s + + expand null characters as \200 rather than \0 + + modify configure script to support shared libraries for DragonFlyBSD. + +20110716 + + replace an assert() in _nc_Free_Argument() with a regular null + pointer check (report/analysis by Franjo Ivancic). + + modify configure --enable-pc-files option to take into account the + PKG_CONFIG_PATH variable (report by Frederic L W Meunier). + + add/use xterm+tmux chunk from xterm #271 -TD + + resync xterm-new entry from xterm #271 -TD + + add E3 extended capability to linux-basic (Miroslav Lichvar) + + add linux2.2, linux2.6, linux3.0 entries to give context for E3 -TD + + add SI/SO change to linux2.6 entry (Debian #515609) -TD + + fix inconsistent tabset path in pcmw (Todd C. Miller). + + remove a backslash which continued comment, obscuring altos3 + definition with OpenBSD toolset (Nicholas Marriott). + +20110702 + + add workaround from xterm #271 changes to ensure that compiler flags + are not used in the $CC variable. + + improve support for shared libraries, tested with AIX 5.3, 6.1 and + 7.1 with both gcc 4.2.4 and cc. + + modify configure checks for AIX to include release 7.x + + add loader flags/libraries to libtool options so that dynamic loading + works properly, adapted from ncurses-5.7-ldflags-with-libtool.patch + at gentoo prefix repository (patch by Michael Haubenwallner). + +20110626 + + move include of nc_termios.h out of term_entry.h, since the latter + is installed, e.g., for tack while the former is not (report by + Sven Joachim). + +20110625 + + improve cleanup() function in lib_tstp.c, using _exit() rather than + exit() and checking for SIGTERM rather than SIGQUIT (prompted by + comments forwarded by Nicholas Marriott). + + reduce name pollution from term.h, moving fallback #define's for + tcgetattr(), etc., to new private header nc_termios.h (report by + Sergio NNX). + + two minor fixes for tracing (patch by Vassili Courzakis). + + improve trace initialization by starting it in use_env() and + ripoffline(). + + review old email, add details for some changelog entries. + +20110611 + + update minix entry to minix 3.2 (Thomas Cort). + + fix a strict compiler warning in change to wattr_get (cf: 20110528). + +20110604 + + fixes for MirBSD port: + + set default prefix to /usr. + + add support for shared libraries in configure script. + + use S_ISREG and S_ISDIR consistently, with fallback definitions. + + add a few more checks based on ncurses/link_test. + + modify MKlib_gen.sh to handle sp-funcs renaming of NCURSES_OUTC type. + +20110528 + + add case to CF_SHARED_OPTS for Interix (patch by Markus Duft). + + used ncurses/link_test to check for behavior when the terminal has + not been initialized and when an application passes null pointers + to the library. Added checks to cover this (prompted by Redhat + #707344). + + modify MKlib_gen.sh to make its main() function call each function + with zero parameters, to help find inconsistent checking for null + pointers, etc. + +20110521 + + fix warnings from clang 2.7 "--analyze" + +20110514 + + compiler-warning fixes in panel and progs. + + modify CF_PKG_CONFIG macro, from changes to tin -TD + + modify CF_CURSES_FUNCS configure macro, used in test directory + configure script: + + work around (non-optimizer) bug in gcc 4.2.1 which caused + test-expression to be omitted from executable. + + force the linker to see a link-time expression of a symbol, to + help work around weak-symbol issues. + +20110507 + + update discussion of MKfallback.sh script in INSTALL; normally the + script is used automatically via the configured makefiles. However + there are still occasions when it might be used directly by packagers + (report by Gunter Schaffler). + + modify misc/ncurses-config.in to omit the "-L" option from the + "--libs" output if the library directory is /usr/lib. + + change order of tests for curses.h versus ncurses.h headers in the + configure scripts for Ada95 and test-directories, to look for + ncurses.h, from fixes to tin -TD + + modify ncurses/tinfo/access.c to account for Tandem's root uid + (report by Joachim Schmitz). + +20110430 + + modify rules in Ada95/src/Makefile.in to ensure that the PIC option + is not used when building a static library (report by Nicolas + Boulenguez): + + Ada95 build-fix for big-endian architectures such as sparc. This + undoes one of the fixes from 20110319, which added an "Unused" member + to representation clauses, replacing that with pragmas to suppress + warnings about unused bits (patch by Nicolas Boulenguez). + +20110423 + + add check in test/configure for use_window, use_screen. + + add configure-checks for getopt's variables, which may be declared + as different types on some Unix systems. + + add check in test/configure for some legacy curses types of the + function pointer passed to tputs(). + + modify init_pair() to accept -1's for color value after + assume_default_colors() has been called (Debian #337095). + + modify test/background.c, adding command-line options to demonstrate + assume_default_colors() and use_default_colors(). + +20110416 + + modify configure script/source-code to only define _POSIX_SOURCE if + the checks for sigaction and/or termios fail, and if _POSIX_C_SOURCE + and _XOPEN_SOURCE are undefined (report by Valentin Ochs). + + update config.guess, config.sub + +20110409 + + fixes to build c++ binding with clang 3.0 (patch by Alexander + Kolesen). + + add check for unctrl.h in test/configure, to work around breakage in + some ncurses packages. + + add "--disable-widec" option to test/configure script. + + add "--with-curses-colr" and "--with-curses-5lib" options to the + test/configure script to address testing with very old machines. + +20110404 5.9 release for upload to ftp.gnu.org + +20110402 + + various build-fixes for the rpm/dpkg scripts. + + add "--enable-rpath-link" option to Ada95/configure, to allow + packages to suppress the rpath feature which is normally used for + the in-tree build of sample programs. + + corrected definition of libdir variable in Ada95/src/Makefile.in, + needed for rpm script. + + add "--with-shared" option to Ada95/configure script, to allow + making the C-language parts of the binding use appropriate compiler + options if building a shared library with gnat. + +20110329 + > portability fixes for Ada95 binding: + + add configure check to ensure that SIGINT works with gnat. This is + needed for the "rain" sample program. If SIGINT does not work, omit + that sample program. + + correct typo in check of $PKG_CONFIG variable in Ada95/configure + + add ncurses_compat.c, to supply functions used in the Ada95 binding + which were added in 5.7 and later. + + modify sed expression in CF_NCURSES_ADDON to eliminate a dependency + upon GNU sed. + +20110326 + + add special check in Ada95/configure script for ncurses6 reentrant + code. + + regen Ada html documentation. + + build-fix for Ada shared libraries versus the varargs workaround. + + add rpm and dpkg scripts for Ada95 and test directories, for test + builds. + + update test/configure macros CF_CURSES_LIBS, CF_XOPEN_SOURCE and + CF_X_ATHENA_LIBS. + + add configure check to determine if gnat's project feature supports + libraries, i.e., collections of .ali files. + + make all dereferences in Ada95 samples explicit. + + fix typo in comment in lib_add_wch.c (patch by Petr Pavlu). + + add configure check for, ifdef's for math.h which is in a separate + package on Solaris and potentially not installed (report by Petr + Pavlu). + > fixes for Ada95 binding (Nicolas Boulenguez): + + improve type-checking in Ada95 by eliminating a few warning-suppress + pragmas. + + suppress unreferenced warnings. + + make all dereferences in binding explicit. + +20110319 + + regen Ada html documentation. + + change order of -I options from ncurses*-config script when the + --disable-overwrite option was used, so that the subdirectory include + is listed first. + + modify the make-tar.sh scripts to add a MANIFEST and NEWS file. + + modify configure script to provide value for HTML_DIR in + Ada95/gen/Makefile.in, which depends on whether the Ada95 binding is + distributed separately (report by Nicolas Boulenguez). + + modify configure script to add "-g" and/or "-O3" to ADAFLAGS if the + CFLAGS for the build has these options. + + amend change from 20070324, to not add 1 to the result of getmaxx + and getmaxy in the Ada binding (report by Nicolas Boulenguez for + thread in comp.lang.ada). + + build-fix Ada95/samples for gnat 4.5 + + spelling fixes for Ada95/samples/explain.txt + > fixes for Ada95 binding (Nicolas Boulenguez): + + add item in Trace_Attribute_Set corresponding to TRACE_ATTRS. + + add workaround for binding to set_field_type(), which uses varargs. + The original binding from 990220 relied on the prevalent + implementation of varargs which did not support or need va_copy(). + + add dependency on gen/Makefile.in needed for *-panels.ads + + add Library_Options to library.gpr + + add Languages to library.gpr, for gprbuild + +20110307 + + revert changes to limit-checks from 20110122 (Debian #616711). + > minor type-cleanup of Ada95 binding (Nicolas Boulenguez): + + corrected a minor sign error in a field of Low_Level_Field_Type, to + conform to form.h. + + replaced C_Int by Curses_Bool as return type for some callbacks, see + fieldtype(3FORM). + + modify samples/sample-explain.adb to provide explicit message when + explain.txt is not found. + +20110305 + + improve makefiles for Ada95 tree (patch by Nicolas Boulenguez). + + fix an off-by-one error in _nc_slk_initialize() from 20100605 fixes + for compiler warnings (report by Nicolas Boulenguez). + + modify Ada95/gen/gen.c to declare unused bits in generated layouts, + needed to compile when chtype is 64-bits using gnat 4.4.5 + +20110226 5.8 release for upload to ftp.gnu.org + +20110226 + + update release notes, for 5.8. + + regenerated html manpages. + + change open() in _nc_read_file_entry() to fopen() for consistency + with write_file(). + + modify misc/run_tic.in to create parent directory, in case this is + a new install of hashed database. + + fix typo in Ada95/mk-1st.awk which causes error with original awk. + +20110220 + + configure script rpath fixes from xterm #269. + + workaround for cygwin's non-functional features.h, to force ncurses' + configure script to define _XOPEN_SOURCE_EXTENDED when building + wide-character configuration. + + build-fix in run_tic.sh for OS/2 EMX install + + add cons25-debian entry (patch by Brian M Carlson, Debian #607662). + +20110212 + + regenerated html manpages. + + use _tracef() in show_where() function of tic, to work correctly with + special case of trace configuration. + +20110205 + + add xterm-utf8 entry as a demo of the U8 feature -TD + + add U8 feature to denote entries for terminal emulators which do not + support VT100 SI/SO when processing UTF-8 encoding -TD + + improve the NCURSES_NO_UTF8_ACS feature by adding a check for an + extended terminfo capability U8 (prompted by mailing list + discussion). + +20110122 + + start documenting interface changes for upcoming 5.8 release. + + correct limit-checks in derwin(). + + correct limit-checks in newwin(), to ensure that windows have nonzero + size (report by Garrett Cooper). + + fix a missing "weak" declaration for pthread_kill (patch by Nicholas + Alcock). + + improve documentation of KEY_ENTER in curs_getch.3x manpage (prompted + by discussion with Kevin Martin). + +20110115 + + modify Ada95/configure script to make the --with-curses-dir option + work without requiring the --with-ncurses option. + + modify test programs to allow them to be built with NetBSD curses. + + document thick- and double-line symbols in curs_add_wch.3x manpage. + + document WACS_xxx constants in curs_add_wch.3x manpage. + + fix some warnings for clang 2.6 "--analyze" + + modify Ada95 makefiles to make html-documentation with the project + file configuration if that is used. + + update config.guess, config.sub + +20110108 + + regenerated html manpages. + + minor fixes to enable lint when trace is not enabled, e.g., with + clang --analyze. + + fix typo in man/default_colors.3x (patch by Tim van der Molen). + + update ncurses/llib-lncurses* + +20110101 + + fix remaining strict compiler warnings in ncurses library ABI=5, + except those dealing with function pointers, etc. + +20101225 + + modify nc_tparm.h, adding guards against repeated inclusion, and + allowing TPARM_ARG to be overridden. + + fix some strict compiler warnings in ncurses library. + +20101211 + + suppress ncv in screen entry, allowing underline (patch by Alejandro + R Sedeno). + + also suppress ncv in konsole-base -TD + + fixes in wins_nwstr() and related functions to ensure that special + characters, i.e., control characters are handled properly with the + wide-character configuration. + + correct a comparison in wins_nwstr() (Redhat #661506). + + correct help-messages in some of the test-programs, which still + referred to quitting with 'q'. + +20101204 + + add special case to _nc_infotocap() to recognize the setaf/setab + strings from xterm+256color and xterm+88color, and provide a reduced + version which works with termcap. + + remove obsolete emacs "Local Variables" section from documentation + (request by Sven Joachim). + + update doc/html/index.html to include NCURSES-Programming-HOWTO.html + (report by Sven Joachim). + +20101128 + + modify test/configure and test/Makefile.in to handle this special + case of building within a build-tree (Debian #34182): + mkdir -p build && cd build && ../test/configure && make + +20101127 + + miscellaneous build-fixes for Ada95 and test-directories when built + out-of-tree. + + use VPATH in makefiles to simplify out-of-tree builds (Debian #34182). + + fix typo in rmso for tek4106 entry -Goran Weinholt + +20101120 + + improve checks in test/configure for X libraries, from xterm #267 + changes. + + modify test/configure to allow it to use the build-tree's libraries + e.g., when using that to configure the test-programs without the + rpath feature (request by Sven Joachim). + + repurpose "gnome" terminfo entries as "vte", retaining "gnome" items + for compatibility, but generally deprecating those since the VTE + library is what actually defines the behavior of "gnome", etc., + since 2003 -TD + +20101113 + + compiler warning fixes for test programs. + + various build-fixes for test-programs with pdcurses. + + updated configure checks for X packages in test/configure from xterm + #267 changes. + + add configure check to gnatmake, to accommodate cygwin. + +20101106 + + correct list of sub-directories needed in Ada95 tree for building as + a separate package. + + modify scripts in test-directory to improve builds as a separate + package. + +20101023 + + correct parsing of relative tab-stops in tabs program (report by + Philip Ganchev). + + adjust configure script so that "t" is not added to library suffix + when weak-symbols are used, allowing the pthread configuration to + more closely match the non-thread naming (report by Werner Fink). + + modify configure check for tic program, used for fallbacks, to a + warning if not found. This makes it simpler to use additional + scripts to bootstrap the fallbacks code using tic from the build + tree (report by Werner Fink). + + fix several places in configure script using ${variable-value} form. + + modify configure macro CF_LDFLAGS_STATIC to accommodate some loaders + which do not support selectively linking against static libraries + (report by John P. Hartmann) + + fix an unescaped dash in man/tset.1 (report by Sven Joachim). + +20101009 + + correct comparison used for setting 16-colors in linux-16color + entry (Novell #644831) -TD + + improve linux-16color entry, using "dim" for color-8 which makes it + gray rather than black like color-0 -TD + + drop misc/ncu-indent and misc/jpf-indent; they are provided by an + external package "cindent". + +20101002 + + improve linkages in html manpages, adding references to the newer + pages, e.g., *_variables, curs_sp_funcs, curs_threads. + + add checks in tic for inconsistent cursor-movement controls, and for + inconsistent printer-controls. + + fill in no-parameter forms of cursor-movement where a parameterized + form is available -TD + + fill in missing cursor controls where the form of the controls is + ANSI -TD + + fix inconsistent punctuation in form_variables manpage (patch by + Sven Joachim). + + add parameterized cursor-controls to linux-basic (report by Dae) -TD + > patch by Juergen Pfeifer: + + document how to build 32-bit libraries in README.MinGW + + fixes to filename computation in mk-dlls.sh.in + + use POSIX locale in mk-dlls.sh.in rather than en_US (report by Sven + Joachim). + + add a check in mk-dlls.sh.in to obtain the size of a pointer to + distinguish between 32-bit and 64-bit hosts. The result is stored + in mingw_arch + +20100925 + + add "XT" capability to entries for terminals that support both + xterm-style mouse- and title-controls, for "screen" which + special-cases TERM beginning with "xterm" or "rxvt" -TD + > patch by Juergen Pfeifer: + + use 64-Bit MinGW toolchain (recommended package from TDM, see + README.MinGW). + + support pthreads when using the TDM MinGW toolchain + +20100918 + + regenerated html manpages. + + minor fixes for symlinks to curs_legacy.3x and curs_slk.3x manpages. + + add manpage for sp-funcs. + + add sp-funcs to test/listused.sh, for documentation aids. + +20100911 + + add manpages for summarizing public variables of curses-, terminfo- + and form-libraries. + + minor fixes to manpages for consistency (patch by Jason McIntyre). + + modify tic's -I/-C dump to reformat acsc strings into canonical form + (sorted, unique mapping) (cf: 971004). + + add configure check for pthread_kill(), needed for some old + platforms. + +20100904 + + add configure option --without-tests, to suppress building test + programs (request by Frederic L W Meunier). + +20100828 + + modify nsterm, xnuppc and tek4115 to make sgr/sgr0 consistent -TD + + add check in terminfo source-reader to provide more informative + message when someone attempts to run tic on a compiled terminal + description (prompted by Debian #593920). + + note in infotocap and captoinfo manpages that they read terminal + descriptions from text-files (Debian #593920). + + improve acsc string for vt52, show arrow keys (patch by Benjamin + Sittler). + +20100814 + + document in manpages that "mv" functions first use wmove() to check + the window pointer and whether the position lies within the window + (suggested by Poul-Henning Kamp). + + fixes to curs_color.3x, curs_kernel.3x and wresize.3x manpages (patch + by Tim van der Molen). + + modify configure script to transform library names for tic- and + tinfo-libraries so that those build properly with Mac OS X shared + library configuration. + + modify configure script to ensure that it removes conftest.dSYM + directory leftover on checks with Mac OS X. + + modify configure script to cleanup after check for symbolic links. + +20100807 + + correct a typo in mk-1st.awk (patch by Gabriele Balducci) + (cf: 20100724) + + improve configure checks for location of tic and infocmp programs + used for installing database and for generating fallback data, + e.g., for cross-compiling. + + add Markus Kuhn's wcwidth function for compiling MinGW + + add special case to CF_REGEX for cross-compiling to MinGW target. + +20100731 + + modify initialization check for win32con driver to eliminate need for + special case for TERM "unknown", using terminal database if available + (prompted by discussion with Roumen Petrov). + + for MinGW port, ensure that terminal driver is setup if tgetent() + is called (patch by Roumen Petrov). + + document tabs "-0" and "-8" options in manpage. + + fix Debian "lintian" issues with manpages reported in + http://lintian.debian.org/full/csmall@debian.org.html#ncurses + +20100724 + + add a check in tic for missing set_tab if clear_all_tabs given. + + improve use of symbolic links in makefiles by using "-f" option if + it is supported, to eliminate temporary removal of the target + (prompted by http://www.t2-project.org/packages/ncurses.html) + + minor improvement to test/ncurses.c, reset color pairs in 'd' test + after exit from 'm' main-menu command. + + improved ncu-indent, from mawk changes, allows more than one of + GCC_NORETURN, GCC_PRINTFLIKE and GCC_SCANFLIKE on a single line. + +20100717 + + add hard-reset for rs2 to wsvt25 to help ensure that reset ends + the alternate character set (patch by Nicholas Marriott) + + remove tar-copy.sh and related configure/Makefile chunks, since the + Ada95 binding is now installed using rules in Ada95/src. + +20100703 + + continue integrating changes to use gnatmake project files in Ada95 + + add/use configure check to turn on project rules for Ada95/src. + + revert the vfork change from 20100130, since it does not work. + +20100626 + + continue integrating changes to use gnatmake project files in Ada95 + + old gnatmake (3.15) does not produce libraries using project-file; + work around by adding script to generate alternate makefile. + +20100619 + + continue integrating changes to use gnatmake project files in Ada95 + + add configure --with-ada-sharedlib option, for the test_make rule. + + move Ada95-related logic into aclocal.m4, since additional checks + will be needed to distinguish old/new implementations of gnat. + +20100612 + + start integrating changes to use gnatmake project files in Ada95 tree + + add test_make / test_clean / test_install rules in Ada95/src + + change install-path for adainclude directory to /usr/share/ada (was + /usr/lib/ada). + + update Ada95/configure. + + add mlterm+256color entry, for mlterm 3.0.0 -TD + + modify test/configure to use macros to ensure consistent order + of updating LIBS variable. + +20100605 + + change search order of options for Solaris in CF_SHARED_OPTS, to + work with 64-bit compiles. + + correct quoting of assignment in CF_SHARED_OPTS case for aix + (cf: 20081227) + +20100529 + + regenerated html documentation. + + modify test/configure to support pkg-config for checking X libraries + used by PDCurses. + + add/use configure macro CF_ADD_LIB to force consistency of + assignments to $LIBS, etc. + + fix configure script for combining --with-pthread + and --enable-weak-symbols options. + +20100522 + + correct cross-compiling configure check for CF_MKSTEMP macro, by + adding a check cache variable set by AC_CHECK_FUNC (report by + Pierre Labastie). + + simplify include-dependencies of make_hash and make_keys, to reduce + the need for setting BUILD_CPPFLAGS in cross-compiling when the + build- and target-machines differ. + + repair broken-linker configuration by restoring a definition of SP + variable to curses.priv.h, and adjusting for cases where sp-funcs + are used. + + improve configure macro CF_AR_FLAGS, allowing ARFLAGS environment + variable to override (prompted by report by Pablo Cazallas). + +20100515 + + add configure option --enable-pthreads-eintr to control whether the + new EINTR feature is enabled. + + modify logic in pthread configuration to allow EINTR to interrupt + a read operation in wgetch() (Novell #540571, patch by Werner Fink). + + drop mkdirs.sh, use "mkdir -p". + + add configure option --disable-libtool-version, to use the + "-version-number" feature which was added in libtool 1.5 (report by + Peter Haering). The default value for the option uses the newer + feature, which makes libraries generated using libtool compatible + with the standard builds of ncurses. + + updated test/configure to match configure script macros. + + fixes for configure script from lynx changes: + + improve CF_FIND_LINKAGE logic for the case where a function is + found in predefined libraries. + + revert part of change to CF_HEADER (cf: 20100424) + +20100501 + + correct limit-check in wredrawln, accounting for begy/begx values + (patch by David Benjamin). + + fix most compiler warnings from clang. + + amend build-fix for OpenSolaris, to ensure that a system header is + included in curses.h before testing feature symbols, since they + may be defined by that route. + +20100424 + + fix some strict compiler warnings in ncurses library. + + modify configure macro CF_HEADER_PATH to not look for variations in + the predefined include directories. + + improve configure macros CF_GCC_VERSION and CF_GCC_WARNINGS to work + with gcc 4.x's c89 alias, which gives warning messages for cases + where older versions would produce an error. + +20100417 + + modify _nc_capcmp() to work with cancelled strings. + + correct translation of "^" in _nc_infotocap(), used to transform + terminfo to termcap strings + + add configure --disable-rpath-hack, to allow disabling the feature + which adds rpath options for libraries in unusual places. + + improve CF_RPATH_HACK_2 by checking if the rpath option for a given + directory was already added. + + improve CF_RPATH_HACK_2 by using ldd to provide a standard list of + directories (which will be ignored). + +20100410 + + improve win_driver.c handling of mouse: + + discard motion events + + avoid calling _nc_timed_wait when there is a mouse event + + handle 4th and "rightmost" buttons. + + quote substitutions in CF_RPATH_HACK_2 configure macro, needed for + cases where there are embedded blanks in the rpath option. + +20100403 + + add configure check for exctags vs ctags, to work around pkgsrc. + + simplify logic in _nc_get_screensize() to make it easier to see how + environment variables may override system- and terminfo-values + (prompted by discussion with Igor Bujna). + + make debug-traces for COLOR_PAIR and PAIR_NUMBER less verbose. + + improve handling of color-pairs embedded in attributes for the + extended-colors configuration. + + modify MKlib_gen.sh to build link_test with sp-funcs. + + build-fixes for OpenSolaris aka Solaris 11, for wide-character + configuration as well as for rpath feature in *-config scripts. + +20100327 + + refactor CF_SHARED_OPTS configure macro, making CF_RPATH_HACK more + reusable. + + improve configure CF_REGEX, similar fixes. + + improve configure CF_FIND_LINKAGE, adding add check between system + (default) and explicit paths, where we can find the entrypoint in the + given library. + + add check if Gpm_Open() returns a -2, e.g., for "xterm". This is + normally suppressed but can be overridden using $NCURSES_GPM_TERMS. + Ensure that Gpm_Close() is called in this case. + +20100320 + + rename atari and st52 terminfo entries to atari-old, st52-old, use + newer entries from FreeMiNT by Guido Flohr (from patch/report by Alan + Hourihane). + +20100313 + + modify install-rule for manpages so that *-config manpages will + install when building with --srcdir (report by Sven Joachim). + + modify CF_DISABLE_LEAKS configure macro so that the --enable-leaks + option is not the same as --disable-leaks (GenToo #305889). + + modify #define's for build-compiler to suppress cchar_t symbol from + compile of make_hash and make_keys, improving cross-compilation of + ncursesw (report by Bernhard Rosenkraenzer). + + modify CF_MAN_PAGES configure macro to replace all occurrences of + TPUT in tput.1's manpage (Debian #573597, report/analysis by Anders + Kaseorg). + +20100306 + + generate manpages for the *-config scripts, adapted from help2man + (suggested by Sven Joachim). + + use va_copy() in _nc_printf_string() to avoid conflicting use of + va_list value in _nc_printf_length() (report by Wim Lewis). + +20100227 + + add Ada95/configure script, to use in tar-file created by + Ada95/make-tar.sh + + fix typo in wresize.3x (patch by Tim van der Molen). + + modify screen-bce.XXX entries to exclude ech, since screen's color + model does not clear with color for that feature -TD + +20100220 + + add make-tar.sh scripts to Ada95 and test subdirectories to help with + making those separately distributable. + + build-fix for static libraries without dlsym (Debian #556378). + + fix a syntax error in man/form_field_opts.3x (patch by Ingo + Schwarze). + +20100213 + + add several screen-bce.XXX entries -TD + +20100206 + + update mrxvt terminfo entry -TD + + modify win_driver.c to support mouse single-clicks. + + correct name for termlib in ncurses*-config, e.g., if it is renamed + to provide a single file for ncurses/ncursesw libraries (patch by + Miroslav Lichvar). + +20100130 + + use vfork in test/ditto.c if available (request by Mike Frysinger). + + miscellaneous cleanup of manpages. + + fix typo in curs_bkgd.3x (patch by Tim van der Molen). + + build-fix for --srcdir (patch by Miroslav Lichvar). + +20100123 + + for term-driver configuration, ensure that the driver pointer is + initialized in setupterm so that terminfo/termcap programs work. + + amend fix for Debian #542031 to ensure that wattrset() returns only + OK or ERR, rather than the attribute value (report by Miroslav + Lichvar). + + reorder WINDOWLIST to put WINDOW data after SCREEN pointer, making + _nc_screen_of() compatible between normal/wide libraries again (patch + by Miroslav Lichvar) + + review/fix include-dependencies in modules files (report by Miroslav + Lichvar). + +20100116 + + modify win_driver.c to initialize acs_map for win32 console, so + that line-drawing works. + + modify win_driver.c to initialize TERMINAL struct so that programs + such as test/lrtest.c and test/ncurses.c which test string + capabilities can run. + + modify term-driver modules to eliminate forward-reference + declarations. + +20100109 + + modify configure macro CF_XOPEN_SOURCE, etc., to use CF_ADD_CFLAGS + consistently to add new -D's while removing duplicates. + + modify a few configure macros to consistently put new options + before older in the list. + + add tiparm(), based on review of X/Open Curses Issue 7. + + minor documentation cleanup. + + update config.guess, config.sub from + http://savannah.gnu.org/projects/config + (caveat - its maintainer put 2010 copyright date on files dated 2009) + +20100102 + + minor improvement to tic's checking of similar SGR's to allow for the + most common case of SGR 0. + + modify getmouse() to act as its documentation implied, returning on + each call the preceding event until none are left. When no more + events remain, it will return ERR. + +20091227 + + change order of lookup in progs/tput.c, looking for terminfo data + first. This fixes a confusion between termcap "sg" and terminfo + "sgr" or "sgr0", originally from 990123 changes, but exposed by + 20091114 fixes for hashing. With this change, only "dl" and "ed" are + ambiguous (Mandriva #56272). + +20091226 + + add bterm terminfo entry, based on bogl 0.1.18 -TD + + minor fix to rxvt+pcfkeys terminfo entry -TD + + build-fixes for Ada95 tree for gnat 4.4 "style". + +20091219 + + remove old check in mvderwin() which prevented moving a derived + window whose origin happened to coincide with its parent's origin + (report by Katarina Machalkova). + + improve test/ncurses.c to put mouse droppings in the proper window. + + update minix terminfo entry -TD + + add bw (auto-left-margin) to nsterm* entries (Benjamin Sittler) + +20091212 + + correct transfer of multicolumn characters in multirow + field_buffer(), which stopped at the end of the first row due to + filling of unused entries in a cchar_t array with nulls. + + updated nsterm* entries (Benjamin Sittler, Emanuele Giaquinta) + + modify _nc_viscbuf2() and _tracecchar_t2() to show wide-character + nulls. + + use strdup() in set_menu_mark(), restore .marklen struct member on + failure. + + eliminate clause 3 from the UCB copyrights in read_termcap.c and + tset.c per + ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change + (patch by Nicholas Marriott). + + replace a malloc in tic.c with strdup, checking for failure (patch by + Nicholas Marriott). + + update config.guess, config.sub from + http://savannah.gnu.org/projects/config + +20091205 + + correct layout of working window used to extract data in + wide-character configured by set_field_buffer (patch by Rafael + Garrido Fernandez) + + improve some limit-checks related to filename length in reading and + writing terminfo entries. + + ensure that filename is always filled in when attempting to read + a terminfo entry, so that infocmp can report the filename (patch + by Nicholas Marriott). + +20091128 + + modify mk-1st.awk to allow tinfo library to be built when term-driver + is enabled. + + add error-check to configure script to ensure that sp-funcs is + enabled if term-driver is, since some internal interfaces rely upon + this. + +20091121 + + fix case where progs/tput is used while sp-funcs is configure; this + requires save/restore of out-character function from _nc_prescreen + rather than the SCREEN structure (report by Charles Wilson). + + fix typo in man/curs_trace.3x which caused incorrect symbolic links + + improved configure macros CF_GCC_ATTRIBUTES, CF_PROG_LINT. + +20091114 + + updated man/curs_trace.3x + + limit hashing for termcap-names to 2-characters (Ubuntu #481740). + + change a variable name in lib_newwin.c to make it clearer which + value is being freed on error (patch by Nicholas Marriott). + +20091107 + + improve test/ncurses.c color-cycling test by reusing attribute- + and color-cycling logic from the video-attributes screen. + + add ifdef'd with NCURSES_INTEROP_FUNCS experimental bindings in form + library which help make it compatible with interop applications + (patch by Juergen Pfeifer). + + add configure option --enable-interop, for integrating changes + for generic/interop support to form-library by Juergen Pfeifer + +20091031 + + modify use of $CC environment variable which is defined by X/Open + as a curses feature, to ignore it if it is not a single character + (prompted by discussion with Benjamin C W Sittler). + + add START_TRACE in slk_init + + fix a regression in _nc_ripoffline which made test/ncurses.c not show + soft-keys, broken in 20090927 merging. + + change initialization of "hidden" flag for soft-keys from true to + false, broken in 20090704 merging (Ubuntu #464274). + + update nsterm entries (patch by Benjamin C W Sittler, prompted by + discussion with Fabian Groffen in GenToo #206201). + + add test/xterm-256color.dat + +20091024 + + quiet some pedantic gcc warnings. + + modify _nc_wgetch() to check for a -1 in the fifo, e.g., after a + SIGWINCH, and discard that value, to avoid confusing application + (patch by Eygene Ryabinkin, FreeBSD #136223). + +20091017 + + modify handling of $PKG_CONFIG_LIBDIR to use only the first item in + a possibly colon-separated list (Debian #550716). + +20091010 + + supply a null-terminator to buffer in _nc_viswibuf(). + + fix a sign-extension bug in unget_wch() (report by Mike Gran). + + minor fixes to error-returns in default function for tputs, as well + as in lib_screen.c + +20091003 + + add WACS_xxx definitions to wide-character configuration for thick- + and double-lines (discussion with Slava Zanko). + + remove unnecessary kcan assignment to ^C from putty (Sven Joachim) + + add ccc and initc capabilities to xterm-16color -TD + > patch by Benjamin C W Sittler: + + add linux-16color + + correct initc capability of linux-c-nc end-of-range + + similar change for dg+ccc and dgunix+ccc + +20090927 + + move leak-checking for comp_captab.c into _nc_leaks_tinfo() since + that module since 20090711 is in libtinfo. + + add configure option --enable-term-driver, to allow compiling with + terminal-driver. That is used in MinGW port, and (being somewhat + more complicated) is an experimental alternative to the conventional + termlib internals. Currently, it requires the sp-funcs feature to + be enabled. + + completed integrating "sp-funcs" by Juergen Pfeifer in ncurses + library (some work remains for forms library). + +20090919 + + document return code from define_key (report by Mike Gran). + + make some symbolic links in the terminfo directory-tree shorter + (patch by Daniel Jacobowitz, forwarded by Sven Joachim).). + + fix some groff warnings in terminfo.5, etc., from recent Debian + changes. + + change ncv and op capabilities in sun-color terminfo entry to match + Sun's entry for this (report by Laszlo Peter). + + improve interix smso terminfo capability by using reverse rather than + bold (report by Kristof Zelechovski). + +20090912 + + add some test programs (and make these use the same special keys + by sharing linedata.h functions): + test/test_addstr.c + test/test_addwstr.c + test/test_addchstr.c + test/test_add_wchstr.c + + correct internal _nc_insert_ch() to use _nc_insert_wch() when + inserting wide characters, since the wins_wch() function that it used + did not update the cursor position (report by Ciprian Craciun). + +20090906 + + fix typo s/is_timeout/is_notimeout/ which made "man is_notimeout" not + work. + + add null-pointer checks to other opaque-functions. + + add is_pad() and is_subwin() functions for opaque access to WINDOW + (discussion with Mark Dickinson). + + correct merge to lib_newterm.c, which broke when sp-funcs was + enabled. + +20090905 + + build-fix for building outside source-tree (report by Sven Joachim). + + fix Debian lintian warning for man/tabs.1 by making section number + agree with file-suffix (report by Sven Joachim). + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090829 + + workaround for bug in g++ 4.1-4.4 warnings for wattrset() macro on + amd64 (Debian #542031). + + fix typo in curs_mouse.3x (Debian #429198). + +20090822 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090815 + + correct use of terminfo capabilities for initializing soft-keys, + broken in 20090510 merging. + + modify wgetch() to ensure it checks SIGWINCH when it gets an error + in non-blocking mode (patch by Clemens Ladisch). + + use PATH_SEPARATOR symbol when substituting into run_tic.sh, to + help with builds on non-Unix platforms such as OS/2 EMX. + + modify scripting for misc/run_tic.sh to test configure script's + $cross_compiling variable directly rather than comparing host/build + compiler names (prompted by comment in GenToo #249363). + + fix configure script option --with-database, which was coded as an + enable-type switch. + + build-fixes for --srcdir (report by Frederic L W Meunier). + +20090808 + + separate _nc_find_entry() and _nc_find_type_entry() from + implementation details of hash function. + +20090803 + + add tabs.1 to man/man_db.renames + + modify lib_addch.c to compensate for removal of wide-character test + from unctrl() in 20090704 (Debian #539735). + +20090801 + + improve discussion in INSTALL for use of system's tic/infocmp for + cross-compiling and building fallbacks. + + modify test/demo_termcap.c to correspond better to options in + test/demo_terminfo.c + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + + fix logic for 'V' in test/ncurses.c tests f/F. + +20090728 + + correct logic in tigetnum(), which caused tput program to treat all + string capabilities as numeric (report by Rajeev V Pillai, + cf: 20090711). + +20090725 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090718 + + fix a null-pointer check in _nc_format_slks() in lib_slk.c, from + 20090704 changes. + + modify _nc_find_type_entry() to use hashing. + + make CCHARW_MAX value configurable, noting that changing this would + change the size of cchar_t, and would be ABI-incompatible. + + modify test-programs, e.g,. test/view.c, to address subtle + differences between Tru64/Solaris and HPUX/AIX getcchar() return + values. + + modify length returned by getcchar() to count the trailing null + which is documented in X/Open (cf: 20020427). + + fixes for test programs to build/work on HPUX and AIX, etc. + +20090711 + + improve performance of tigetstr, etc., by using hashing code from tic. + + minor fixes for memory-leak checking. + + add test/demo_terminfo, for comparison with demo_termcap + +20090704 + + remove wide-character checks from unctrl() (patch by Clemens Ladisch). + + revise wadd_wch() and wecho_wchar() to eliminate dependency on + unctrl(). + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090627 + + update llib-lncurses[wt] to use sp-funcs. + + various code-fixes to build/work with --disable-macros configure + option. + + add several new files from Juergen Pfeifer which will be used when + integration of "sp-funcs" is complete. This includes a port to + MinGW. + +20090613 + + move definition for NCURSES_WRAPPED_VAR back to ncurses_dll.h, to + make includes of term.h without curses.h work (report by "Nix"). + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090607 + + fix a regression in lib_tputs.c, from ongoing merges. + +20090606 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090530 + + fix an infinite recursion when adding a legacy-coding 8-bit value + using insch() (report by Clemens Ladisch). + + free home-terminfo string in del_curterm() (patch by Dan Weber). + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090523 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090516 + + work around antique BSD game's manipulation of stdscr, etc., versus + SCREEN's copy of the pointer (Debian #528411). + + add a cast to wattrset macro to avoid compiler warning when comparing + its result against ERR (adapted from patch by Matt Kraii, Debian + #528374). + +20090510 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090502 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + + add vwmterm terminfo entry (patch by Bryan Christ). + +20090425 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090419 + + build fix for _nc_free_and_exit() change in 20090418 (report by + Christian Ebert). + +20090418 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090411 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + This change finishes merging for menu and panel libraries, does + part of the form library. + +20090404 + + suppress configure check for static/dynamic linker flags for gcc on + Darwin (report by Nelson Beebe). + +20090328 + + extend ansi.sys pfkey capability from kf1-kf10 to kf1-kf48, moving + function key definitions from emx-base for consistency -TD + + correct missing final 'p' in pfkey capability of ansi.sys-old (report + by Kalle Olavi Niemitalo). + + improve test/ncurses.c 'F' test, show combining characters in color. + + quiet a false report by cppcheck in c++/cursesw.cc by eliminating + a temporary variable. + + use _nc_doalloc() rather than realloc() in a few places in ncurses + library to avoid leak in out-of-memory condition (reports by William + Egert and Martin Ettl based on cppcheck tool). + + add --with-ncurses-wrap-prefix option to test/configure (discussion + with Charles Wilson). + + use ncurses*-config scripts if available for test/configure. + + update test/aclocal.m4 and test/configure + > patches by Charles Wilson: + + modify CF_WITH_LIBTOOL configure check to allow unreleased libtool + version numbers (e.g. which include alphabetic chars, as well as + digits, after the final '.'). + + improve use of -no-undefined option for libtool by setting an + intermediate variable LT_UNDEF in the configure script, and then + using that in the libtool link-commands. + + fix an missing use of NCURSES_PUBLIC_VAR() in tinfo/MKcodes.awk + from 20090321 changes. + + improve mk-1st.awk script by writing separate cases for the + LIBTOOL_LINK command, depending on which library (ncurses, ticlib, + termlib) is to be linked. + + modify configure.in to allow broken-linker configurations, not just + enable-reentrant, to set public wrap prefix. + +20090321 + + add TICS_LIST and SHLIB_LIST to allow libtool 2.2.6 on Cygwin to + build with tic and term libraries (patch by Charles Wilson). + + add -no-undefined option to libtool for Cygwin, MinGW, U/Win and AIX + (report by Charles Wilson). + + fix definition for c++/Makefile.in's SHLIB_LIST, which did not list + the form, menu or panel libraries (patch by Charles Wilson). + + add configure option --with-wrap-prefix to allow setting the prefix + for functions used to wrap global variables to something other than + "_nc_" (discussion with Charles Wilson). + +20090314 + + modify scripts to generate ncurses*-config and pc-files to add + dependency for tinfo library (patch by Charles Wilson). + + improve comparison of program-names when checking for linked flavors + such as "reset" by ignoring the executable suffix (reports by Charles + Wilson, Samuel Thibault and Cedric Bretaudeau on Cygwin mailing + list). + + suppress configure check for static/dynamic linker flags for gcc on + Solaris 10, since gcc is confused by absence of static libc, and + does not switch back to dynamic mode before finishing the libraries + (reports by Joel Bertrand, Alan Pae). + + minor fixes to Intel compiler warning checks in configure script. + + modify _nc_leaks_tinfo() so leak-checking in test/railroad.c works. + + modify set_curterm() to make broken-linker configuration work with + changes from 20090228 (report by Charles Wilson). + +20090228 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + + modify declaration of cur_term when broken-linker is used, but + enable-reentrant is not, to match pre-5.7 (report by Charles Wilson). + +20090221 + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + +20090214 + + add configure script --enable-sp-funcs to enable the new set of + extended functions. + + start integrating patches by Juergen Pfeifer: + + add extended functions which specify the SCREEN pointer for several + curses functions which use the global SP (these are incomplete; + some internals work is needed to complete these). + + add special cases to configure script for MinGW port. + +20090207 + + update several configure macros from lynx changes + + append (not prepend) to CFLAGS/CPPFLAGS + + change variable from PATHSEP to PATH_SEPARATOR + + improve install-rules for pc-files (patch by Miroslav Lichvar). + + make it work with $DESTDIR + + create the pkg-config library directory if needed. + +20090124 + + modify init_pair() to allow caller to create extra color pairs beyond + the color_pairs limit, which use default colors (request by Emanuele + Giaquinta). + + add misc/terminfo.tmp and misc/*.pc to "sources" rule. + + fix typo "==" where "=" is needed in ncurses-config.in and + gen-pkgconfig.in files (Debian #512161). + +20090117 + + add -shared option to MK_SHARED_LIB when -Bsharable is used, for + *BSD's, without which "main" might be one of the shared library's + dependencies (report/analysis by Ken Dickey). + + modify waddch_literal(), updating line-pointer after a multicolumn + character is found to not fit on the current row, and wrapping is + done. Since the line-pointer was not updated, the wrapped + multicolumn character was written to the beginning of the current row + (cf: 20041023, reported by "Nick" regarding problem with ncmpc + http://musicpd.org/mantis/bug_view_page.php?bug_id=1930). + +20090110 + + add screen.Eterm terminfo entry (GenToo #124887) -TD + + modify adacurses-config to look for ".ali" files in the adalib + directory. + + correct install for Ada95, which omitted libAdaCurses.a used in + adacurses-config + + change install for adacurses-config to provide additional flavors + such as adacursesw-config, for ncursesw (GenToo #167849). + +20090105 + + remove undeveloped feature in ncurses-config.in for setting + prefix variable. + + recent change to ncurses-config.in did not take into account the + --disable-overwrite option, which sets $includedir to the + subdirectory and using just that for a -I option does not work - fix + (report by Frederic L W Meunier). + +20090104 + + modify gen-pkgconfig.in to eliminate a dependency on rpath when + deciding whether to add $LIBS to --libs output; that should be shown + for the ncurses and tinfo libraries without taking rpath into + account. + + fix an overlooked change from $AR_OPTS to $ARFLAGS in mk-1st.awk, + used in static libraries (report by Marty Jack). + +20090103 + + add a configure-time check to pick a suitable value for + CC_SHARED_OPTS for Solaris (report by Dagobert Michelsen). + + add configure --with-pkg-config and --enable-pc-files options, along + with misc/gen-pkgconfig.in which can be used to generate ".pc" files + for pkg-config (request by Jan Engelhardt). + + use $includedir symbol in misc/ncurses-config.in, add --includedir + option. + + change makefiles to use $ARFLAGS rather than $AR_OPTS, provide a + configure check to detect whether a "-" is needed before "ar" + options. + + update config.guess, config.sub from + http://savannah.gnu.org/projects/config + +20081227 + + modify mk-1st.awk to work with extra categories for tinfo library. + + modify configure script to allow building shared libraries with gcc + on AIX 5 or 6 (adapted from patch by Lital Natan). + +20081220 + + modify to omit the opaque-functions from lib_gen.o when + --disable-ext-funcs is used. + + add test/clip_printw.c to illustrate how to use printw without + wrapping. + + modify ncurses 'F' test to demo wborder_set() with colored lines. + + modify ncurses 'f' test to demo wborder() with colored lines. + +20081213 + + add check for failure to open hashed-database needed for db4.6 + (GenToo #245370). + + corrected --without-manpages option; previous change only suppressed + the auxiliary rules install.man and uninstall.man + + add case for FreeMINT to configure macro CF_XOPEN_SOURCE (patch from + GenToo #250454). + + fixes from NetBSD port at + http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/devel/ncurses/patches + patch-ac (build-fix for DragonFly) + patch-ae (use INSTALL_SCRIPT for installing misc/ncurses*-config). + + improve configure script macros CF_HEADER_PATH and CF_LIBRARY_PATH + by adding CFLAGS, CPPFLAGS and LDFLAGS, LIBS values to the + search-lists. + + correct title string for keybound manpage (patch by Frederic Culot, + OpenBSD documentation/6019), + +20081206 + + move del_curterm() call from _nc_freeall() to _nc_leaks_tinfo() to + work for progs/clear, progs/tabs, etc. + + correct buffer-size after internal resizing of wide-character + set_field_buffer(), broken in 20081018 changes (report by Mike Gran). + + add "-i" option to test/filter.c to tell it to use initscr() rather + than newterm(), to investigate report on comp.unix.programmer that + ncurses would clear the screen in that case (it does not - the issue + was xterm's alternate screen feature). + + add check in mouse-driver to disable connection if GPM returns a + zero, indicating that the connection is closed (Debian #506717, + adapted from patch by Samuel Thibault). + +20081129 + + improve a workaround in adding wide-characters, when a control + character is found. The library (cf: 20040207) uses unctrl() to + obtain a printable version of the control character, but was not + passing color or video attributes. + + improve test/ncurses.c 'a' test, using unctrl() more consistently to + display meta-characters. + + turn on _XOPEN_CURSES definition in curses.h + + add eterm-color entry (report by Vincent Lefevre) -TD + + correct use of key_name() in test/ncurses.c 'A' test, which only + displays wide-characters, not key-codes since 20070612 (report by + Ricardo Cantu). + +20081122 + + change _nc_has_mouse() to has_mouse(), reflect its use in C++ and + Ada95 (patch by Juergen Pfeifer). + + document in TO-DO an issue with Cygwin's package for GNAT (report + by Mike Dennison). + + improve error-checking of command-line options in "tabs" program. + +20081115 + + change several terminfo entries to make consistent use of ANSI + clear-all-tabs -TD + + add "tabs" program (prompted by Debian #502260). + + add configure --without-manpages option (request by Mike Frysinger). + +20081102 5.7 release for upload to ftp.gnu.org + +20081025 + + add a manpage to discuss memory leaks. + + add support for shared libraries for QNX (other than libtool, which + does not work well on that platform). + + build-fix for QNX C++ binding. + +20081018 + + build-fixes for OS/2 EMX. + + modify form library to accept control characters such as newline + in set_field_buffer(), which is compatible with Solaris (report by + Nit Khair). + + modify configure script to assume --without-hashed-db when + --disable-database is used. + + add "-e" option in ncurses/Makefile.in when generating source-files + to force earlier exit if the build environment fails unexpectedly + (prompted by patch by Adrian Bunk). + + change configure script to use CF_UTF8_LIB, improved variant of + CF_LIBUTF8. + +20081012 + + add teraterm4.59 terminfo entry, use that as primary teraterm entry, rename + original to teraterm2.3 -TD + + update "gnome" terminfo to 2.22.3 -TD + + update "konsole" terminfo to 1.6.6, needs today's fix for tic -TD + + add "aterm" terminfo -TD + + add "linux2.6.26" terminfo -TD + + add logic to tic for cancelling strings in user-defined capabilities, + overlooked til now. + +20081011 + + regenerated html documentation. + + add -m and -s options to test/keynames.c and test/key_names.c to test + the meta() function with keyname() or key_name(), respectively. + + correct return value of key_name() on error; it is null. + + document some unresolved issues for rpath and pthreads in TO-DO. + + fix a missing prototype for ioctl() on OpenBSD in tset.c + + add configure option --disable-tic-depends to make explicit whether + tic library depends on ncurses/ncursesw library, amends change from + 20080823 (prompted by Debian #501421). + +20081004 + + some build-fixes for configure --disable-ext-funcs (incomplete, but + works for C/C++ parts). + + improve configure-check for awks unable to handle large strings, e.g. + AIX 5.1 whose awk silently gives up on large printf's. + +20080927 + + fix build for --with-dmalloc by workaround for redefinition of + strndup between string.h and dmalloc.h + + fix build for --disable-sigwinch + + add environment variable NCURSES_GPM_TERMS to allow override to use + GPM on terminals other than "linux", etc. + + disable GPM mouse support when $TERM does not happen to contain + "linux", since Gpm_Open() no longer limits its assertion to terminals + that it might handle, e.g., within "screen" in xterm. + + reset mouse file-descriptor when unloading GPM library (report by + Miroslav Lichvar). + + fix build for --disable-leaks --enable-widec --with-termlib + > patch by Juergen Pfeifer: + + use improved initialization for soft-label keys in Ada95 sample code. + + discard internal symbol _nc_slk_format (unused since 20080112). + + move call of slk_paint_info() from _nc_slk_initialize() to + slk_intern_refresh(), improving initialization. + +20080925 + + fix bug in mouse code for GPM from 20080920 changes (reported in + Debian #500103, also Miroslav Lichvar). + +20080920 + + fix shared-library rules for cygwin with tic- and tinfo-libraries. + + fix a memory leak when failure to connect to GPM. + + correct check for notimeout() in wgetch() (report on linux.redhat + newsgroup by FurtiveBertie). + + add an example warning-suppression file for valgrind, + misc/ncurses.supp (based on example from Reuben Thomas) + +20080913 + + change shared-library configuration for OpenBSD, make rpath work. + + build-fixes for using libutf8, e.g., on OpenBSD 3.7 + +20080907 + + corrected fix for --enable-weak-symbols (report by Frederic L W + Meunier). + +20080906 + + corrected gcc options for building shared libraries on IRIX64. + + add configure check for awk programs unable to handle big-strings, + use that to improve the default for --enable-big-strings option. + + makefile-fixes for --enable-weak-symbols (report by Frederic L W + Meunier). + + update test/configure script. + + adapt ifdef's from library to make test/view.c build when mbrtowc() + is unavailable, e.g., with HPUX 10.20. + + add configure check for wcsrtombs, mbsrtowcs, which are used in + test/ncurses.c, and use wcstombs, mbstowcs instead if available, + fixing build of ncursew for HPUX 11.00 + +20080830 + + fixes to make Ada95 demo_panels() example work. + + modify Ada95 'rain' test program to accept keyboard commands like the + C-version. + + modify BeOS-specific ifdef's to build on Haiku (patch by Scott + Mccreary). + + add configure-check to see if the std namespace is legal for cerr + and endl, to fix a build issue with Tru64. + + consistently use NCURSES_BOOL in lib_gen.c + + filter #line's from lib_gen.c + + change delimiter in MKlib_gen.sh from '%' to '@', to avoid + substitution by IBM xlc to '#' as part of its extensions to digraphs. + + update config.guess, config.sub from + http://savannah.gnu.org/projects/config + (caveat - its maintainer removed support for older Linux systems). + +20080823 + + modify configure check for pthread library to work with OSF/1 5.1, + which uses #define's to associate its header and library. + + use pthread_mutexattr_init() for initializing pthread_mutexattr_t, + makes threaded code work on HPUX 11.23 + + fix a bug in demo_menus in freeing menus (cf: 20080804). + + modify configure script for the case where tic library is used (and + possibly renamed) to remove its dependency upon ncurses/ncursew + library (patch by Dr Werner Fink). + + correct manpage for menu_fore() which gave wrong default for + the attribute used to display a selected entry (report by Mike Gran). + + add Eterm-256color, Eterm-88color and rxvt-88color (prompted by + Debian #495815) -TD + +20080816 + + add configure option --enable-weak-symbols to turn on new feature. + + add configure-check for availability of weak symbols. + + modify linkage with pthread library to use weak symbols so that + applications not linked to that library will not use the mutexes, + etc. This relies on gcc, and may be platform-specific (patch by Dr + Werner Fink). + + add note to INSTALL to document limitation of renaming of tic library + using the --with-ticlib configure option (report by Dr Werner Fink). + + document (in manpage) why tputs does not detect I/O errors (prompted + by comments by Samuel Thibault). + + fix remaining warnings from Klocwork report. + +20080804 + + modify _nc_panelhook() data to account for a permanent memory leak. + + fix memory leaks in test/demo_menus + + fix most warnings from Klocwork tool (report by Larry Zhou). + + modify configure script CF_XOPEN_SOURCE macro to add case for + "dragonfly" from xterm #236 changes. + + modify configure script --with-hashed-db to let $LIBS override the + search for the db library (prompted by report by Samson Pierre). + +20080726 + + build-fixes for gcc 4.3.1 (changes to gnat "warnings", and C inlining + thresholds). + +20080713 + + build-fix (reports by Christian Ebert, Funda Wang). + +20080712 + + compiler-warning fixes for Solaris. + +20080705 + + use NCURSES_MOUSE_MASK() in definition of BUTTON_RELEASE(), etc., to + make those work properly with the "--enable-ext-mouse" configuration + (cf: 20050205). + + improve documentation of build-cc options in INSTALL. + + work-around a bug in gcc 4.2.4 on AIX, which does not pass the + -static/-dynamic flags properly to linker, causing test/bs to + not link. + +20080628 + + correct some ifdef's needed for the broken-linker configuration. + + make debugging library's $BAUDRATE feature work for termcap + interface. + + make $NCURSES_NO_PADDING feature work for termcap interface (prompted + by comment on FreeBSD mailing list). + + add screen.mlterm terminfo entry -TD + + improve mlterm and mlterm+pcfkeys terminfo entries -TD + +20080621 + + regenerated html documentation. + + expand manpage description of parameters for form_driver() and + menu_driver() (prompted by discussion with Adam Spragg). + + add null-pointer checks for cur_term in baudrate() and + def_shell_mode(), def_prog_mode() + + fix some memory leaks in delscreen() and wide acs. + +20080614 + + modify test/ditto.c to illustrate multi-threaded use_screen(). + + change CC_SHARED_OPTS from -KPIC to -xcode=pic32 for Solaris. + + add "-shared" option to MK_SHARED_LIB for gcc on Solaris (report + by Poor Yorick). + +20080607 + + finish changes to wgetch(), making it switch as needed to the + window's actual screen when calling wrefresh() and wgetnstr(). That + allows wgetch() to get used concurrently in different threads with + some minor restrictions, e.g., the application should not delete a + window which is being used in a wgetch(). + + simplify mutex's, combining the window- and screen-mutex's. + +20080531 + + modify wgetch() to use the screen which corresponds to its window + parameter rather than relying on SP; some dependent functions still + use SP internally. + + factor out most use of SP in lib_mouse.c, using parameter. + + add internal _nc_keyname(), replacing keyname() to associate with a + particular SCREEN rather than the global SP. + + add internal _nc_unctrl(), replacing unctrl() to associate with a + particular SCREEN rather than the global SP. + + add internal _nc_tracemouse(), replacing _tracemouse() to eliminate + its associated global buffer _nc_globals.tracemse_buf now in SCREEN. + + add internal _nc_tracechar(), replacing _tracechar() to use SCREEN in + preference to the global _nc_globals.tracechr_buf buffer. + +20080524 + + modify _nc_keypad() to make it switch temporarily as needed to the + screen which must be updated. + + wrap cur_term variable to help make _nc_keymap() thread-safe, and + always set the screen's copy of this variable in set_curterm(). + + restore curs_set() state after endwin()/refresh() (report/patch + Miroslav Lichvar) + +20080517 + + modify configure script to note that --enable-ext-colors and + --enable-ext-mouse are not experimental, but extensions from + the ncurses ABI 5. + + corrected manpage description of setcchar() (discussion with + Emanuele Giaquinta). + + fix for adding a non-spacing character at the beginning of a line + (report/patch by Miroslav Lichvar). + +20080503 + + modify screen.* terminfo entries using new screen+fkeys to fix + overridden keys in screen.rxvt (Debian #478094) -TD + + modify internal interfaces to reduce wgetch()'s dependency on the + global SP. + + simplify some loops with macros each_screen(), each_window() and + each_ripoff(). + +20080426 + + continue modifying test/ditto.c toward making it demonstrate + multithreaded use_screen(), using fifos to pass data between screens. + + fix typo in form.3x (report by Mike Gran). + +20080419 + + add screen.rxvt terminfo entry -TD + + modify tic -f option to format spaces as \s to prevent them from + being lost when that is read back in unformatted strings. + + improve test/ditto.c, using a "talk"-style layout. + +20080412 + + change test/ditto.c to use openpty() and xterm. + + add locks for copywin(), dupwin(), overlap(), overlay() on their + window parameters. + + add locks for initscr() and newterm() on updates to the SCREEN + pointer. + + finish table in curs_thread.3x manpage. + +20080405 + + begin table in curs_thread.3x manpage describing the scope of data + used by each function (or symbol) for threading analysis. + + add null-pointer checks to setsyx() and getsyx() (prompted by + discussion by Martin v. Lowis and Jeroen Ruigrok van der Werven on + python-dev2 mailing list). + +20080329 + + add null-pointer checks in set_term() and delscreen(). + + move _nc_windows into _nc_globals, since windows can be pads, which + are not associated with a particular screen. + + change use_screen() to pass the SCREEN* parameter rather than + stdscr to the callback function. + + force libtool to use tag for 'CC' in case it does not detect this, + e.g., on aix when using CC=powerpc-ibm-aix5.3.0.0-gcc + (report/patch by Michael Haubenwallner). + + override OBJEXT to "lo" when building with libtool, to work on + platforms such as AIX where libtool may use a different suffix for + the object files than ".o" (report/patch by Michael Haubenwallner). + + add configure --with-pthread option, for building with the POSIX + thread library. + +20080322 + + fill in extended-color pair two more places in wbkgrndset() and + waddch_nosync() (prompted by Sedeno's patch). + + fill in extended-color pair in _nc_build_wch() to make colors work + for wide-characters using extended-colors (patch by Alejandro R + Sedeno). + + add x/X toggles to ncurses.c C color test to test/demo + wide-characters with extended-colors. + + add a/A toggles to ncurses.c c/C color tests. + + modify test/ditto.c to use use_screen(). + + finish modifying test/rain.c to demonstrate threads. + +20080308 + + start modifying test/rain.c for threading demo. + + modify test/ncurses.c to make 'f' test accept the f/F/b/F/ toggles + that the 'F' accepts. + + modify test/worm.c to show trail in reverse-video when other threads + are working concurrently. + + fix a deadlock from improper nesting of mutexes for windowlist and + window. + +20080301 + + fixes from 20080223 resolved issue with mutexes; change to use + recursive mutexes to fix memory leak in delwin() as called from + _nc_free_and_exit(). + +20080223 + + fix a size-difference in _nc_globals which caused hanging of mutex + lock/unlock when termlib was built separately. + +20080216 + + avoid using nanosleep() in threaded configuration since that often + is implemented to suspend the entire process. + +20080209 + + update test programs to build/work with various UNIX curses for + comparisons. This was to reinvestigate statement in X/Open Curses + that insnstr and winsnstr perform wrapping. None of the Unix-branded + implementations do this, as noted in manpage (cf: 20040228). + +20080203 + + modify _nc_setupscreen() to set the legacy-coding value the same + for both narrow/wide models. It had been set only for wide model, + but is needed to make unctrl() work with locale in the narrow model. + + improve waddch() and winsch() handling of EILSEQ from mbrtowc() by + using unctrl() to display illegal bytes rather than trying to append + further bytes to make up a valid sequence (reported by Andrey A + Chernov). + + modify unctrl() to check codes in 128-255 range versus isprint(). + If they are not printable, and locale was set, use a "M-" or "~" + sequence. + +20080126 + + improve threading in test/worm.c (wrap refresh calls, and KEY_RESIZE + handling). Now it hangs in napms(), no matter whether nanosleep() + or poll() or select() are used on Linux. + +20080119 + + fixes to build with --disable-ext-funcs + + add manpage for use_window and use_screen. + + add set_tabsize() and set_escdelay() functions. + +20080112 + + remove recursive-mutex definitions, finish threading demo for worm.c + + remove a redundant adjustment of lines in resizeterm.c's + adjust_window() which caused occasional misadjustment of stdscr when + softkeys were used. + +20080105 + + several improvements to terminfo entries based on xterm #230 -TD + + modify MKlib_gen.sh to handle keyname/key_name prototypes, so the + "link_test" builds properly. + + fix for toe command-line options -u/-U to ensure filename is given. + + fix allocation-size for command-line parsing in infocmp from 20070728 + (report by Miroslav Lichvar) + + improve resizeterm() by moving ripped-off lines, and repainting the + soft-keys (report by Katarina Machalkova) + + add clarification in wclear's manpage noting that the screen will be + cleared even if a subwindow is cleared (prompted by Christer Enfors + question). + + change test/ncurses.c soft-key tests to work with KEY_RESIZE. + +20071222 + + continue implementing support for threading demo by adding mutex + for delwin(). + +20071215 + + add several functions to C++ binding which wrap C functions that + pass a WINDOW* parameter (request by Chris Lee). + +20071201 + + add note about configure options needed for Berkeley database to the + INSTALL file. + + improve checks for version of Berkeley database libraries. + + amend fix for rpath to not modify LDFLAGS if the platform has no + applicable transformation (report by Christian Ebert, cf: 20071124). + +20071124 + + modify configure option --with-hashed-db to accept a parameter which + is the install-prefix of a given Berkeley Database (prompted by + pierre4d2 comments). + + rewrite wrapper for wcrtomb(), making it work on Solaris. This is + used in the form library to determine the length of the buffer needed + by field_buffer (report by Alfred Fung). + + remove unneeded window-parameter from C++ binding for wresize (report + by Chris Lee). + +20071117 + + modify the support for filesystems which do not support mixed-case to + generate 2-character (hexadecimal) codes for the lower-level of the + filesystem terminfo database (request by Michail Vidiassov). + + add configure option --enable-mixed-case, to allow overriding the + configure script's check if the filesystem supports mixed-case + filenames. + + add wresize() to C++ binding (request by Chris Lee). + + define NCURSES_EXT_FUNCS and NCURSES_EXT_COLORS in curses.h to make + it simpler to tell if the extended functions and/or colors are + declared. + +20071103 + + update memory-leak checks for changes to names.c and codes.c + + correct acsc strings in h19, z100 (patch by Benjamin C W Sittler). + +20071020 + + continue implementing support for threading demo by adding mutex + for use_window(). + + add mrxvt terminfo entry, add/fix xterm building blocks for modified + cursor keys -TD + + compile with FreeBSD "contemporary" TTY interface (patch by + Rong-En Fan). + +20071013 + + modify makefile rules to allow clear, tput and tset to be built + without libtic. The other programs (infocmp, tic and toe) rely on + that library. + + add/modify null-pointer checks in several functions for SP and/or + the WINDOW* parameter (report by Thorben Krueger). + + fixes for field_buffer() in formw library (see Redhat #310071, + patches by Miroslav Lichvar). + + improve performance of NCURSES_CHAR_EQ code (patch by Miroslav + Lichvar). + + update/improve mlterm and rxvt terminfo entries, e.g., for + the modified cursor- and keypad-keys -TD + +20071006 + + add code to curses.priv.h ifdef'd with NCURSES_CHAR_EQ, which + changes the CharEq() macro to an inline function to allow comparing + cchar_t struct's without comparing gaps in a possibly unpacked + memory layout (report by Miroslav Lichvar). + +20070929 + + add new functions to lib_trace.c to setup mutex's for the _tracef() + calls within the ncurses library. + + for the reentrant model, move _nc_tputs_trace and _nc_outchars into + the SCREEN. + + start modifying test/worm.c to provide threading demo (incomplete). + + separated ifdef's for some BSD-related symbols in tset.c, to make + it compile on LynxOS (report by Greg Gemmer). +20070915 + + modify Ada95/gen/Makefile to use shlib script, to simplify building + shared-library configuration on platforms lacking rpath support. + + build-fix for Ada95/src/Makefile to reflect changed dependency for + the terminal-interface-curses-aux.adb file which is now generated. + + restructuring test/worm.c, for use_window() example. + +20070908 + + add use_window() and use_screen() functions, to develop into support + for threaded library (incomplete). + + fix typos in man/curs_opaque.3x which kept the install script from + creating symbolic links to two aliases created in 20070818 (report by + Rong-En Fan). + +20070901 + + remove a spurious newline from output of html.m4, which caused links + for Ada95 html to be incorrect for the files generated using m4. + + start investigating mutex's for SCREEN manipulation (incomplete). + + minor cleanup of codes.c/names.c for --enable-const + + expand/revise "Routine and Argument Names" section of ncurses manpage + to address report by David Givens in newsgroup discussion. + + fix interaction between --without-progs/--with-termcap configure + options (report by Michail Vidiassov). + + fix typo in "--disable-relink" option (report by Michail Vidiassov). + +20070825 + + fix a sign-extension bug in infocmp's repair_acsc() function + (cf: 971004). + + fix old configure script bug which prevented "--disable-warnings" + option from working (patch by Mike Frysinger). + +20070818 + + add 9term terminal description (request by Juhapekka Tolvanen) -TD + + modify comp_hash.c's string output to avoid misinterpreting a null + "\0" followed by a digit. + + modify MKnames.awk and MKcodes.awk to support big-strings. + This only applies to the cases (broken linker, reentrant) where + the corresponding arrays are accessed via wrapper functions. + + split MKnames.awk into two scripts, eliminating the shell redirection + which complicated the make process and also the bogus timestamp file + which was introduced to fix "make -j". + + add test/test_opaque.c, test/test_arrays.c + + add wgetscrreg() and wgetparent() for applications that may need it + when NCURSES_OPAQUE is defined (prompted by Bryan Christ). + +20070812 + + amend treatment of infocmp "-r" option to retain the 1023-byte limit + unless "-T" is given (cf: 981017). + + modify comp_captab.c generation to use big-strings. + + make _nc_capalias_table and _nc_infoalias_table private accessed via + _nc_get_alias_table() since the tables are used only within the tic + library. + + modify configure script to skip Intel compiler in CF_C_INLINE. + + make _nc_info_hash_table and _nc_cap_hash_table private accessed via + _nc_get_hash_table() since the tables are used only within the tic + library. + +20070728 + + make _nc_capalias_table and _nc_infoalias_table private, accessed via + _nc_get_alias_table() since they are used only by parse_entry.c + + make _nc_key_names private since it is used only by lib_keyname.c + + add --disable-big-strings configure option to control whether + unctrl.c is generated using the big-string optimization - which may + use strings longer than supported by a given compiler. + + reduce relocation tables for tic, infocmp by changing type of + internal hash tables to short, and make those private symbols. + + eliminate large fixed arrays from progs/infocmp.c + +20070721 + + change winnstr() to stop at the end of the line (cf: 970315). + + add test/test_get_wstr.c + + add test/test_getstr.c + + add test/test_inwstr.c + + add test/test_instr.c + +20070716 + + restore a call to obtain screen-size in _nc_setupterm(), which + is used in tput and other non-screen applications via setupterm() + (Debian #433357, reported by Florent Bayle, Christian Ohm, + cf: 20070310). + +20070714 + + add test/savescreen.c test-program + + add check to trace-file open, if the given name is a directory, add + ".log" to the name and try again. + + add konsole-256color entry -TD + + add extra gcc warning options from xterm. + + minor fixes for ncurses/hashmap test-program. + + modify configure script to quiet c++ build with libtool when the + --disable-echo option is used. + + modify configure script to disable ada95 if libtool is selected, + writing a warning message (addresses FreeBSD #114493). + + update config.guess, config.sub + +20070707 + + add continuous-move "M" to demo_panels to help test refresh changes. + + improve fix for refresh of window on top of multi-column characters, + taking into account some split characters on left/right window + boundaries. + +20070630 + + add "widec" row to _tracedump() output to help diagnose remaining + problems with multi-column characters. + + partial fix for refresh of window on top of multi-column characters + which are partly overwritten (report by Sadrul H Chowdhury). + + ignore A_CHARTEXT bits in vidattr() and vid_attr(), in case + multi-column extension bits are passed there. + + add setlocale() call to demo_panels.c, needed for wide-characters. + + add some output flags to _nc_trace_ttymode to help diagnose a bug + report by Larry Virden, i.e., ONLCR, OCRNL, ONOCR and ONLRET, + +20070623 + + add test/demo_panels.c + + implement opaque version of setsyx() and getsyx(). + +20070612 + + corrected xterm+pcf2 terminfo modifiers for F1-F4, to match xterm + #226 -TD + + split-out key_name() from MKkeyname.awk since it now depends upon + wunctrl() which is not in libtinfo (report by Rong-En Fan). + +20070609 + + add test/key_name.c + + add stdscr cases to test/inchs.c and test/inch_wide.c + + update test/configure + + correct formatting of DEL (0x7f) in _nc_vischar(). + + null-terminate result of wunctrl(). + + add null-pointer check in key_name() (report by Andreas Krennmair, + cf: 20020901). + +20070602 + + adapt mouse-handling code from menu library in form-library + (discussion with Clive Nicolson). + + add a modification of test/dots.c, i.e., test/dots_mvcur.c to + illustrate how to use mvcur(). + + modify wide-character flavor of SetAttr() to preserve the + WidecExt() value stored in the .attr field, e.g., in case it + is overwritten by chgat (report by Aleksi Torhamo). + + correct buffer-size for _nc_viswbuf2n() (report by Aleksi Torhamo). + + build-fixes for Solaris 2.6 and 2.7 (patch by Peter O'Gorman). + +20070526 + + modify keyname() to use "^X" form only if meta() has been called, or + if keyname() is called without initializing curses, e.g., via + initscr() or newterm() (prompted by LinuxBase #1604). + + document some portability issues in man/curs_util.3x + + add a shadow copy of TTY buffer to _nc_prescreen to fix applications + broken by moving that data into SCREEN (cf: 20061230). + +20070512 + + add 'O' (wide-character panel test) in ncurses.c to demonstrate a + problem reported by Sadrul H Chowdhury with repainting parts of + a fullwidth cell. + + modify slk_init() so that if there are preceding calls to + ripoffline(), those affect the available lines for soft-keys (adapted + from patch by Clive Nicolson). + + document some portability issues in man/curs_getyx.3x + +20070505 + + fix a bug in Ada95/samples/ncurses which caused a variable to + become uninitialized in the "b" test. + + fix Ada95/gen/Makefile.in adahtml rule to account for recent + movement of files, fix a few incorrect manpage references in the + generated html. + + add Ada95 binding to _nc_freeall() as Curses_Free_All to help with + memory-checking. + + correct some functions in Ada95 binding which were using return value + from C where none was returned: idcok(), immedok() and wtimeout(). + + amend recent changes for Ada95 binding to make it build with + Cygwin's linker, e.g., with configure options + --enable-broken-linker --with-ticlib + +20070428 + + add a configure check for gcc's options for inlining, use that to + quiet a warning message where gcc's default behavior changed from + 3.x to 4.x. + + improve warning message when checking if GPM is linked to curses + library by not warning if its use of "wgetch" is via a weak symbol. + + add loader options when building with static libraries to ensure that + an installed shared library for ncurses does not conflict. This is + reported as problem with Tru64, but could affect other platforms + (report Martin Mokrejs, analysis by Tim Mooney). + + fix build on cygwin after recent ticlib/termlib changes, i.e., + + adjust TINFO_SUFFIX value to work with cygwin's dll naming + + revert a change from 20070303 which commented out dependency of + SHLIB_LIST in form/menu/panel/c++ libraries. + + fix initialization of ripoff stack pointer (cf: 20070421). + +20070421 + + move most static variables into structures _nc_globals and + _nc_prescreen, to simplify storage. + + add/use configure script macro CF_SIG_ATOMIC_T, use the corresponding + type for data manipulated by signal handlers (prompted by comments + in mailing.openbsd.bugs newsgroup). + + modify CF_WITH_LIBTOOL to allow one to pass options such as -static + to the libtool create- and link-operations. + +20070414 + + fix whitespace in curs_opaque.3x which caused a spurious ';' in + the installed aliases (report by Peter Santoro). + + fix configure script to not try to generate adacurses-config when + Ada95 tree is not built. + +20070407 + + add man/curs_legacy.3x, man/curs_opaque.3x + + fix acs_map binding for Ada95 when --enable-reentrant is used. + + add adacurses-config to the Ada95 install, based on version from + FreeBSD port, in turn by Juergen Pfeifer in 2000 (prompted by + comment on comp.lang.ada newsgroup). + + fix includes in c++ binding to build with Intel compiler + (cf: 20061209). + + update install rule in Ada95 to use mkdirs.sh + > other fixes prompted by inspection for Coverity report: + + modify ifdef's for c++ binding to use try/catch/throw statements + + add a null-pointer check in tack/ansi.c request_cfss() + + fix a memory leak in ncurses/base/wresize.c + + corrected check for valid memu/meml capabilities in + progs/dump_entry.c when handling V_HPUX case. + > fixes based on Coverity report: + + remove dead code in test/bs.c + + remove dead code in test/demo_defkey.c + + remove an unused assignment in progs/infocmp.c + + fix a limit check in tack/ansi.c tools_charset() + + fix tack/ansi.c tools_status() to perform the VT320/VT420 + tests in request_cfss(). The function had exited too soon. + + fix a memory leak in tic.c's make_namelist() + + fix a couple of places in tack/output.c which did not check for EOF. + + fix a loop-condition in test/bs.c + + add index checks in lib_color.c for color palettes + + add index checks in progs/dump_entry.c for version_filter() handling + of V_BSD case. + + fix a possible null-pointer dereference in copywin() + + fix a possible null-pointer dereference in waddchnstr() + + add a null-pointer check in _nc_expand_try() + + add a null-pointer check in tic.c's make_namelist() + + add a null-pointer check in _nc_expand_try() + + add null-pointer checks in test/cardfile.c + + fix a double-free in ncurses/tinfo/trim_sgr0.c + + fix a double-free in ncurses/base/wresize.c + + add try/catch block to c++/cursesmain.cc + +20070331 + + modify Ada95 binding to build with --enable-reentrant by wrapping + global variables (bug: acs_map does not yet work). + + modify Ada95 binding to use the new access-functions, allowing it + to build/run when NCURSES_OPAQUE is set. + + add access-functions and macros to return properties of the WINDOW + structure, e.g., when NCURSES_OPAQUE is set. + + improved install-sh's quoting. + + use mkdirs.sh rather than mkinstalldirs, e.g., to use fixes from + other programs. + +20070324 + + eliminate part of the direct use of WINDOW data from Ada95 interface. + + fix substitutions for termlib filename to make configure option + --enable-reentrant work with --with-termlib. + + change a constructor for NCursesWindow to allow compiling with + NCURSES_OPAQUE set, since we cannot pass a reference to + an opaque pointer. + +20070317 + + ignore --with-chtype=unsigned since unsigned is always added to + the type in curses.h; do the same for --with-mmask-t. + + change warning regarding --enable-ext-colors and wide-character + in the configure script to an error. + + tweak error message in CF_WITH_LIBTOOL to distinguish other programs + such as Darwin's libtool program (report by Michail Vidiassov) + + modify edit_man.sh to allow for multiple substitutions per line. + + set locale in misc/ncurses-config.in since it uses a range + + change permissions libncurses++.a install (report by Michail + Vidiassov). + + corrected length of temporary buffer in wide-character version + of set_field_buffer() (related to report by Bryan Christ). + +20070311 + + fix mk-1st.awk script install_shlib() function, broken in 20070224 + changes for cygwin (report by Michail Vidiassov). + +20070310 + + increase size of array in _nc_visbuf2n() to make "tic -v" work + properly in its similar_sgr() function (report/analysis by Peter + Santoro). + + add --enable-reentrant configure option for ongoing changes to + implement a reentrant version of ncurses: + + libraries are suffixed with "t" + + wrap several global variables (curscr, newscr, stdscr, ttytype, + COLORS, COLOR_PAIRS, COLS, ESCDELAY, LINES and TABSIZE) as + functions returning values stored in SCREEN or cur_term. + + move some initialization (LINES, COLS) from lib_setup.c, + i.e., setupterm() to _nc_setupscreen(), i.e., newterm(). + +20070303 + + regenerated html documentation. + + add NCURSES_OPAQUE symbol to curses.h, will use to make structs + opaque in selected configurations. + + move the chunk in lib_acs.c which resets acs capabilities when + running on a terminal whose locale interferes with those into + _nc_setupscreen(), so the libtinfo/libtinfow files can be made + identical (requested by Miroslav Lichvar). + + do not use configure variable SHLIB_LIBS for building libraries + outside the ncurses directory, since that symbol is customized + only for that directory, and using it introduces an unneeded + dependency on libdl (requested by Miroslav Lichvar). + + modify mk-1st.awk so the generated makefile rules for linking or + installing shared libraries do not first remove the library, in + case it is in use, e.g., libncurses.so by /bin/sh (report by Jeff + Chua). + + revised section "Using NCURSES under XTERM" in ncurses-intro.html + (prompted by newsgroup comment by Nick Guenther). + +20070224 + + change internal return codes of _nc_wgetch() to check for cases + where KEY_CODE_YES should be returned, e.g., if a KEY_RESIZE was + ungetch'd, and read by wget_wch(). + + fix static-library build broken in 20070217 changes to remove "-ldl" + (report by Miroslav Lichvar). + + change makefile/scripts for cygwin to allow building termlib. + + use Form_Hook in manpages to match form.h + + use Menu_Hook in manpages, as well as a few places in menu.h + + correct form- and menu-manpages to use specific Field_Options, + Menu_Options and Item_Options types. + + correct prototype for _tracechar() in manpage (cf: 20011229). + + correct prototype for wunctrl() in manpage. + +20070217 + + fixes for $(TICS_LIST) in ncurses/Makefile (report by Miroslav + Lichvar). + + modify relinking of shared libraries to apply only when rpath is + enabled, and add --disable-relink option which can be used to + disable the feature altogether (reports by Michail Vidiassov, + Adam J Richter). + + fix --with-termlib option for wide-character configuration, stripping + the "w" suffix in one place (report by Miroslav Lichvar). + + remove "-ldl" from some library lists to reduce dependencies in + programs (report by Miroslav Lichvar). + + correct description of --enable-signed-char in configure --help + (report by Michail Vidiassov). + + add pattern for GNU/kFreeBSD configuration to CF_XOPEN_SOURCE, + which matches an earlier change to CF_SHARED_OPTS, from xterm #224 + fixes. + + remove "${DESTDIR}" from -install_name option used for linking + shared libraries on Darwin (report by Michail Vidiassov). + +20070210 + + add test/inchs.c, test/inch_wide.c, to test win_wchnstr(). + + remove libdl from library list for termlib (report by Miroslav + Lichvar). + + fix configure.in to allow --without-progs --with-termlib (patch by + Miroslav Lichvar). + + modify win_wchnstr() to ensure that only a base cell is returned + for each multi-column character (prompted by report by Wei Kong + regarding change in mvwin_wch() cf: 20041023). + +20070203 + + modify fix_wchnstr() in form library to strip attributes (and color) + from the cchar_t array (field cells) read from a field's window. + Otherwise, when copying the field cells back to the window, the + associated color overrides the field's background color (report by + Ricardo Cantu). + + improve tracing for form library, showing created forms, fields, etc. + + ignore --enable-rpath configure option if --with-shared was omitted. + + add _nc_leaks_tinfo(), _nc_free_tic(), _nc_free_tinfo() entrypoints + to allow leak-checking when both tic- and tinfo-libraries are built. + + drop CF_CPP_VSCAN_FUNC macro from configure script, since C++ binding + no longer relies on it. + + disallow combining configure script options --with-ticlib and + --enable-termcap (report by Rong-En Fan). + + remove tack from ncurses tree. + +20070128 + + fix typo in configure script that broke --with-termlib option + (report by Rong-En Fan). + +20070127 + + improve fix for FreeBSD gnu/98975, to allow for null pointer passed + to tgetent() (report by Rong-en Fan). + + update tack/HISTORY and tack/README to tell how to build it after + it is removed from the ncurses tree. + + fix configure check for libtool's version to trim blank lines + (report by sci-fi@hush.ai). + + review/eliminate other original-file artifacts in cursesw.cc, making + its license consistent with ncurses. + + use ncurses vw_scanw() rather than reading into a fixed buffer in + the c++ binding for scanw() methods (prompted by report by Nuno Dias). + + eliminate fixed-buffer vsprintf() calls in c++ binding. + +20070120 + + add _nc_leaks_tic() to separate leak-checking of tic library from + term/ncurses libraries, and thereby eliminate a library dependency. + + fix test/mk-test.awk to ignore blank lines. + + correct paths in include/headers, for --srcdir (patch by Miroslav + Lichvar). + +20070113 + + add a break-statement in misc/shlib to ensure that it exits on the + _first_ matched directory (report by Paul Novak). + + add tack/configure, which can be used to build tack outside the + ncurses build-tree. + + add --with-ticlib option, to build/install the tic-support functions + in a separate library (suggested by Miroslav Lichvar). + +20070106 + + change MKunctrl.awk to reduce relocation table for unctrl.o + + change MKkeyname.awk to reduce relocation table for keyname.o + (patch by Miroslav Lichvar). + +20061230 + + modify configure check for libtool's version to trim blank lines + (report by sci-fi@hush.ai). + + modify some modules to allow them to be reentrant if _REENTRANT is + defined: lib_baudrate.c, resizeterm.c (local data only) + + eliminate static data from some modules: add_tries.c, hardscroll.c, + lib_ttyflags.c, lib_twait.c + + improve manpage install to add aliases for the transformed program + names, e.g., from --program-prefix. + + used linklint to verify links in the HTML documentation, made fixes + to manpages as needed. + + fix a typo in curs_mouse.3x (report by William McBrine). + + fix install-rule for ncurses5-config to make the bin-directory. + +20061223 + + modify configure script to omit the tic (terminfo compiler) support + from ncurses library if --without-progs option is given. + + modify install rule for ncurses5-config to do this via "install.libs" + + modify shared-library rules to allow FreeBSD 3.x to use rpath. + + update config.guess, config.sub + +20061217 5.6 release for upload to ftp.gnu.org + +20061217 + + add ifdef's for for HPUX, which has the corresponding + definitions in . + + revert the va_copy() change from 20061202, since it was neither + correct nor portable. + + add $(LOCAL_LIBS) definition to progs/Makefile.in, needed for + rpath on Solaris. + + ignore wide-acs line-drawing characters that wcwidth() claims are + not one-column. This is a workaround for Solaris' broken locale + support. + +20061216 + + modify configure --with-gpm option to allow it to accept a parameter, + i.e., the name of the dynamic GPM library to load via dlopen() + (requested by Bryan Henderson). + + add configure option --with-valgrind, changes from vile. + + modify configure script AC_TRY_RUN and AC_TRY_LINK checks to use + 'return' in preference to 'exit()'. + +20061209 + + change default for --with-develop back to "no". + + add XTABS to tracing of TTY bits. + + updated autoconf patch to ifdef-out the misfeature which declares + exit() for configure tests. This fixes a redefinition warning on + Solaris. + + use ${CC} rather than ${LD} in shared library rules for IRIX64, + Solaris to help ensure that initialization sections are provided for + extra linkage requirements, e.g., of C++ applications (prompted by + comment by Casper Dik in newsgroup). + + rename "$target" in CF_MAN_PAGES to make it easier to distinguish + from the autoconf predefined symbol. There was no conflict, + since "$target" was used only in the generated edit_man.sh file, + but SuSE's rpm package contains a patch. + +20061202 + + update man/term.5 to reflect extended terminfo support and hashed + database configuration. + + updates for test/configure script. + + adapted from SuSE rpm package: + + remove long-obsolete workaround for broken-linker which declared + cur_term in tic.c + + improve error recovery in PUTC() macro when wcrtomb() does not + return usable results for an 8-bit character. + + patches from rpm package (SuSE): + + use va_copy() in extra varargs manipulation for tracing version + of printw, etc. + + use a va_list rather than a null in _nc_freeall()'s call to + _nc_printf_string(). + + add some see-also references in manpages to show related + wide-character functions (suggested by Claus Fischer). + +20061125 + + add a check in lib_color.c to ensure caller does not increase COLORS + above max_colors, which is used as an array index (discussion with + Simon Sasburg). + + add ifdef's allowing ncurses to be built with tparm() using either + varargs (the existing status), or using a fixed-parameter list (to + match X/Open). + +20061104 + + fix redrawing of windows other than stdscr using wredrawln() by + touching the corresponding rows in curscr (discussion with Dan + Gookin). + + add test/redraw.c + + add test/echochar.c + + review/cleanup manpage descriptions of error-returns for form- and + menu-libraries (prompted by FreeBSD docs/46196). + +20061028 + + add AUTHORS file -TD + + omit the -D options from output of the new config script --cflags + option (suggested by Ralf S Engelschall). + + make NCURSES_INLINE unconditionally defined in curses.h + +20061021 + + revert change to accommodate bash 3.2, since that breaks other + platforms, e.g., Solaris. + + minor fixes to NEWS file to simplify scripting to obtain list of + contributors. + + improve some shared-library configure scripting for Linux, FreeBSD + and NetBSD to make "--with-shlib-version" work. + + change configure-script rules for FreeBSD shared libraries to allow + for rpath support in versions past 3. + + use $(DESTDIR) in makefile rules for installing/uninstalling the + package config script (reports/patches by Christian Wiese, + Ralf S Engelschall). + + fix a warning in the configure script for NetBSD 2.0, working around + spurious blanks embedded in its ${MAKEFLAGS} symbol. + + change test/Makefile to simplify installing test programs in a + different directory when --enable-rpath is used. + +20061014 + + work around bug in bash 3.2 by adding extra quotes (Jim Gifford). + + add/install a package config script, e.g., "ncurses5-config" or + "ncursesw5-config", according to configuration options. + +20061007 + + add several GNU Screen terminfo variations with 16- and 256-colors, + and status line (Alain Bench). + + change the way shared libraries (other than libtool) are installed. + Rather than copying the build-tree's libraries, link the shared + objects into the install directory. This makes the --with-rpath + option work except with $(DESTDIR) (cf: 20000930). + +20060930 + + fix ifdef in c++/internal.h for QNX 6.1 + + test-compiled with (old) egcs-1.1.2, modified configure script to + not unset the $CXX and related variables which would prevent this. + + fix a few terminfo.src typos exposed by improvements to "-f" option. + + improve infocmp/tic "-f" option formatting. + +20060923 + + make --disable-largefile option work (report by Thomas M Ott). + + updated html documentation. + + add ka2, kb1, kb3, kc2 to vt220-keypad as an extension -TD + + minor improvements to rxvt+pcfkeys -TD + +20060916 + + move static data from lib_mouse.c into SCREEN struct. + + improve ifdef's for _POSIX_VDISABLE in tset to work with Mac OS X + (report by Michail Vidiassov). + + modify CF_PATH_SYNTAX to ensure it uses the result from --prefix + option (from lynx changes) -TD + + adapt AC_PROG_EGREP check, noting that this is likely to be another + place aggravated by POSIXLY_CORRECT. + + modify configure check for awk to ensure that it is found (prompted + by report by Christopher Parker). + + update config.sub + +20060909 + + add kon, kon2 and jfbterm terminfo entry (request by Till Maas) -TD + + remove invis capability from klone+sgr, mainly used by linux entry, + since it does not really do this -TD + +20060903 + + correct logic in wadd_wch() and wecho_wch(), which did not guard + against passing the multi-column attribute into a call on waddch(), + e.g., using data returned by win_wch() (cf: 20041023) + (report by Sadrul H Chowdhury). + +20060902 + + fix kterm's acsc string -TD + + fix for change to tic/infocmp in 20060819 to ensure no blank is + embedded into a termcap description. + + workaround for 20050806 ifdef's change to allow visbuf.c to compile + when using --with-termlib --with-trace options. + + improve tgetstr() by making the return value point into the user's + buffer, if provided (patch by Miroslav Lichvar (see Redhat #202480)). + + correct libraries needed for foldkeys (report by Stanislav Ievlev) + +20060826 + + add terminfo entries for xfce terminal (xfce) and multi gnome + terminal (mgt) -TD + + add test/foldkeys.c + +20060819 + + modify tic and infocmp to avoid writing trailing blanks on terminfo + source output (Debian #378783). + + modify configure script to ensure that if the C compiler is used + rather than the loader in making shared libraries, the $(CFLAGS) + variable is also used (Redhat #199369). + + port hashed-db code to db2 and db3. + + fix a bug in tgetent() from 20060625 and 20060715 changes + (patch/analysis by Miroslav Lichvar (see Redhat #202480)). + +20060805 + + updated xterm function-keys terminfo to match xterm #216 -TD + + add configure --with-hashed-db option (tested only with FreeBSD 6.0, + e.g., the db 1.8.5 interface). + +20060729 + + modify toe to access termcap data, e.g., via cgetent() functions, + or as a text file if those are not available. + + use _nc_basename() in tset to improve $SHELL check for csh/sh. + + modify _nc_read_entry() and _nc_read_termcap_entry() so infocmp, + can access termcap data when the terminfo database is disabled. + +20060722 + + widen the test for xterm kmous a little to allow for other strings + than \E[M, e.g., for xterm-sco functionality in xterm. + + update xterm-related terminfo entries to match xterm patch #216 -TD + + update config.guess, config.sub + +20060715 + + fix for install-rule in Ada95 to add terminal_interface.ads + and terminal_interface.ali (anonymous posting in comp.lang.ada). + + correction to manpage for getcchar() (report by William McBrine). + + add test/chgat.c + + modify wchgat() to mark updated cells as changed so a refresh will + repaint those cells (comments by Sadrul H Chowdhury and William + McBrine). + + split up dependency of names.c and codes.c in ncurses/Makefile to + work with parallel make (report/analysis by Joseph S Myers). + + suppress a warning message (which is ignored) for systems without + an ldconfig program (patch by Justin Hibbits). + + modify configure script --disable-symlinks option to allow one to + disable symlink() in tic even when link() does not work (report by + Nigel Horne). + + modify MKfallback.sh to use tic -x when constructing fallback tables + to allow extended capabilities to be retrieved from a fallback entry. + + improve leak-checking logic in tgetent() from 20060625 to ensure that + it does not free the current screen (report by Miroslav Lichvar). + +20060708 + + add a check for _POSIX_VDISABLE in tset (NetBSD #33916). + + correct _nc_free_entries() and related functions used for memory leak + checking of tic. + +20060701 + + revert a minor change for magic-cookie support from 20060513, which + caused unexpected reset of attributes, e.g., when resizing test/view + in color mode. + + note in clear manpage that the program ignores command-line + parameters (prompted by Debian #371855). + + fixes to make lib_gen.c build properly with changes to the configure + --disable-macros option and NCURSES_NOMACROS (cf: 20060527) + + update/correct several terminfo entries -TD + + add some notes regarding copyright to terminfo.src -TD + +20060625 + + fixes to build Ada95 binding with gnat-4.1.0 + + modify read_termtype() so the term_names data is always allocated as + part of the str_table, a better fix for a memory leak (cf: 20030809). + + reduce memory leaks in repeated calls to tgetent() by remembering the + last TERMINAL* value allocated to hold the corresponding data and + freeing that if the tgetent() result buffer is the same as the + previous call (report by "Matt" for FreeBSD gnu/98975). + + modify tack to test extended capability function-key strings. + + improved gnome terminfo entry (GenToo #122566). + + improved xterm-256color terminfo entry (patch by Alain Bench). + +20060617 + + fix two small memory leaks related to repeated tgetent() calls + with TERM=screen (report by "Matt" for FreeBSD gnu/98975). + + add --enable-signed-char to simplify Debian package. + + reduce name-pollution in term.h by removing #define's for HAVE_xxx + symbols. + + correct typo in curs_terminfo.3x (Debian #369168). + +20060603 + + enable the mouse in test/movewindow.c + + improve a limit-check in frm_def.c (John Heasley). + + minor copyright fixes. + + change configure script to produce test/Makefile from data file. + +20060527 + + add a configure option --enable-wgetch-events to enable + NCURSES_WGETCH_EVENTS, and correct the associated loop-logic in + lib_twait.c (report by Bernd Jendrissek). + + remove include/nomacros.h from build, since the ifdef for + NCURSES_NOMACROS makes that obsolete. + + add entrypoints for some functions which were only provided as macros + to make NCURSES_NOMACROS ifdef work properly: getcurx(), getcury(), + getbegx(), getbegy(), getmaxx(), getmaxy(), getparx() and getpary(), + wgetbkgrnd(). + + provide ifdef for NCURSES_NOMACROS which suppresses most macro + definitions from curses.h, i.e., where a macro is defined to override + a function to improve performance. Allowing a developer to suppress + these definitions can simplify some application (discussion with + Stanislav Ievlev). + + improve description of memu/meml in terminfo manpage. + +20060520 + + if msgr is false, reset video attributes when doing an automargin + wrap to the next line. This makes the ncurses 'k' test work properly + for hpterm. + + correct caching of keyname(), which was using only half of its table. + + minor fixes to memory-leak checking. + + make SCREEN._acs_map and SCREEN._screen_acs_map pointers rather than + arrays, making ACS_LEN less visible to applications (suggested by + Stanislav Ievlev). + + move chunk in SCREEN ifdef'd for USE_WIDEC_SUPPORT to the end, so + _screen_acs_map will have the same offset in both ncurses/ncursesw, + making the corresponding tinfo/tinfow libraries binary-compatible + (cf: 20041016, report by Stanislav Ievlev). + +20060513 + + improve debug-tracing for EmitRange(). + + change default for --with-develop to "yes". Add NCURSES_NO_HARD_TABS + and NCURSES_NO_MAGIC_COOKIE environment variables to allow runtime + suppression of the related hard-tabs and xmc-glitch features. + + add ncurses version number to top-level manpages, e.g., ncurses, tic, + infocmp, terminfo as well as form, menu, panel. + + update config.guess, config.sub + + modify ncurses.c to work around a bug in NetBSD 3.0 curses + (field_buffer returning null for a valid field). The 'r' test + appears to not work with that configuration since the new_fieldtype() + function is broken in that implementation. + +20060506 + + add hpterm-color terminfo entry -TD + + fixes to compile test-programs with HPUX 11.23 + +20060422 + + add copyright notices to files other than those that are generated, + data or adapted from pdcurses (reports by William McBrine, David + Taylor). + + improve rendering on hpterm by not resetting attributes at the end + of doupdate() if the terminal has the magic-cookie feature (report + by Bernd Rieke). + + add 256color variants of terminfo entries for programs which are + reported to implement this feature -TD + +20060416 + + fix typo in change to NewChar() macro from 20060311 changes, which + broke tab-expansion (report by Frederic L W Meunier). + +20060415 + + document -U option of tic and infocmp. + + modify tic/infocmp to suppress smacs/rmacs when acsc is suppressed + due to size limit, e.g., converting to termcap format. Also + suppress them if the output format does not contain acsc and it + was not VT100-like, i.e., a one-one mapping (Novell #163715). + + add configure check to ensure that SIGWINCH is defined on platforms + such as OS X which exclude that when _XOPEN_SOURCE, etc., are + defined (report by Nicholas Cole) + +20060408 + + modify write_object() to not write coincidental extensions of an + entry made due to it being referenced in a use= clause (report by + Alain Bench). + + another fix for infocmp -i option, which did not ensure that some + escape sequences had comparable prefixes (report by Alain Bench). + +20060401 + + improve discussion of init/reset in terminfo and tput manpages + (report by Alain Bench). + + use is3 string for a fallback of rs3 in the reset program; it was + using is2 (report by Alain Bench). + + correct logic for infocmp -i option, which did not account for + multiple digits in a parameter (cf: 20040828) (report by Alain + Bench). + + move _nc_handle_sigwinch() to lib_setup.c to make --with-termlib + option work after 20060114 changes (report by Arkadiusz Miskiewicz). + + add copyright notices to test-programs as needed (report by William + McBrine). + +20060318 + + modify ncurses.c 'F' test to combine the wide-characters with color + and/or video attributes. + + modify test/ncurses to use CTL/Q or ESC consistently for exiting + a test-screen (some commands used 'x' or 'q'). + +20060312 + + fix an off-by-one in the scrolling-region change (cf_ 20060311). + +20060311 + + add checks in waddchnstr() and wadd_wchnstr() to stop copying when + a null character is found (report by Igor Bogomazov). + + modify progs/Makefile.in to make "tput init" work properly with + cygwin, i.e., do not pass a ".exe" in the reference string used + in check_aliases (report by Samuel Thibault). + + add some checks to ensure current position is within scrolling + region before scrolling on a new line (report by Dan Gookin). + + change some NewChar() usage to static variables to work around + stack garbage introduced when cchar_t is not packed (Redhat #182024). + +20060225 + + workarounds to build test/movewindow with PDcurses 2.7. + + fix for nsterm-16color entry (patch by Alain Bench). + + correct a typo in infocmp manpage (Debian #354281). + +20060218 + + add nsterm-16color entry -TD + + updated mlterm terminfo entry -TD + + remove 970913 feature for copying subwindows as they are moved in + mvwin() (discussion with Bryan Christ). + + modify test/demo_menus.c to demonstrate moving a menu (both the + window and subwindow) using shifted cursor-keys. + + start implementing recursive mvwin() in movewindow.c (incomplete). + + add a fallback definition for GCC_PRINTFLIKE() in test.priv.h, + for movewindow.c (report by William McBrine). + + add help-message to test/movewindow.c + +20060211 + + add test/movewindow.c, to test mvderwin(). + + fix ncurses soft-key test so color changes are shown immediately + rather than delayed. + + modify ncurses soft-key test to hide the keys when exiting the test + screen. + + fixes to build test programs with PDCurses 2.7, e.g., its headers + rely on autoconf symbols, and it declares stubs for nonfunctional + terminfo and termcap entrypoints. + +20060204 + + improved test/configure to build test/ncurses on HPUX 11 using the + vendor curses. + + documented ALTERNATE CONFIGURATIONS in the ncurses manpage, for the + benefit of developers who do not read INSTALL. + +20060128 + + correct form library Window_To_Buffer() change (cf: 20040516), which + should ignore the video attributes (report by Ricardo Cantu). + +20060121 + + minor fixes to xmc-glitch experimental code: + + suppress line-drawing + + implement max_attributes + tested with xterm. + + minor fixes for the database iterator. + + fix some buffer limits in c++ demo (comment by Falk Hueffner in + Debian #348117). + +20060114 + + add toe -a option, to show all databases. This uses new private + interfaces in the ncurses library for iterating through the list of + databases. + + fix toe from 20000909 changes which made it not look at + $HOME/.terminfo + + make toe's -v option parameter optional as per manpage. + + improve SIGWINCH handling by postponing its effect during newterm(), + etc., when allocating screens. + +20060111 + + modify wgetnstr() to return KEY_RESIZE if a sigwinch occurs. Use + this in test/filter.c + + fix an error in filter() modification which caused some applications + to fail. + +20060107 + + check if filter() was called when getting the screensize. Keep it + at 1 if so (based on Redhat #174498). + + add extension nofilter(). + + refined the workaround for ACS mapping. + + make ifdef's consistent in curses.h for the extended colors so the + header file can be used for the normal curses library. The header + file installed for extended colors is a variation of the + wide-character configuration (report by Frederic L W Meunier). + +20051231 + + add a workaround to ACS mapping to allow applications such as + test/blue.c to use the "PC ROM" characters by masking them with + A_ALTCHARSET. This worked up til 5.5, but was lost in the revision + of legacy coding (report by Michael Deutschmann). + + add a null-pointer check in the wide-character version of + calculate_actual_width() (report by Victor Julien). + + improve test/ncurses 'd' (color-edit) test by allowing the RGB + values to be set independently (patch by William McBrine). + + modify test/configure script to allow building test programs with + PDCurses/X11. + + modified test programs to allow some to work with NetBSD curses. + Several do not because NetBSD curses implements a subset of X/Open + curses, and also lacks much of SVr4 additions. But it's enough for + comparison. + + update config.guess and config.sub + +20051224 + + use BSD-specific fix for return-value from cgetent() from CVS where + an unknown terminal type would be reportd as "database not found". + + make tgetent() return code more readable using new symbols + TGETENT_YES, etc. + + remove references to non-existent "tctest" program. + + remove TESTPROGS from progs/Makefile.in (it was referring to code + that was never built in that directory). + + typos in curs_addchstr.3x, some doc files (noticed in OpenBSD CVS). + +20051217 + + add use_legacy_coding() function to support lynx's font-switching + feature. + + fix formatting in curs_termcap.3x (report by Mike Frysinger). + + modify MKlib_gen.sh to change preprocessor-expanded _Bool back to + bool. + +20051210 + + extend test/ncurses.c 's' (overlay window) test to exercise overlay(), + overwrite() and copywin() with different combinations of colors and + attributes (including background color) to make it easy to see the + effect of the different functions. + + corrections to menu/m_global.c for wide-characters (report by + Victor Julien). + +20051203 + + add configure option --without-dlsym, allowing developers to + configure GPM support without using dlsym() (discussion with Michael + Setzer). + + fix wins_nwstr(), which did not handle single-column non-8bit codes + (Debian #341661). + +20051126 + + move prototypes for wide-character trace functions from curses.tail + to curses.wide to avoid accidental reference to those if + _XOPEN_SOURCE_EXTENDED is defined without ensuring that is + included. + + add/use NCURSES_INLINE definition. + + change some internal functions to use int/unsigned rather than the + short equivalents. + +20051119 + + remove a redundant check in lib_color.c (Debian #335655). + + use ld's -search_paths_first option on Darwin to work around odd + search rules on that platform (report by Christian Gennerat, analysis + by Andrea Govoni). + + remove special case for Darwin in CF_XOPEN_SOURCE configure macro. + + ignore EINTR in tcgetattr/tcsetattr calls (Debian #339518). + + fix several bugs in test/bs.c (patch by Stephen Lindholm). + +20051112 + + other minor fixes to cygwin based on tack -TD + + correct smacs in cygwin (Debian #338234, report by Baurzhan + Ismagulov, who noted that it was fixed in Cygwin). + +20051029 + + add shifted up/down arrow codes to xterm-new as kind/kri strings -TD + + modify wbkgrnd() to avoid clearing the A_CHARTEXT attribute bits + since those record the state of multicolumn characters (Debian + #316663). + + modify werase to clear multicolumn characters that extend into + a derived window (Debian #316663). + +20051022 + + move assignment from environment variable ESCDELAY from initscr() + down to newterm() so the environment variable affects timeouts for + terminals opened with newterm() as well. + + fix a memory leak in keyname(). + + add test/demo_altkeys.c + + modify test/demo_defkey.c to exit from loop via 'q' to allow + leak-checking, as well as fix a buffer size in winnstr() call. + +20051015 + + correct order of use-clauses in rxvt-basic entry which made codes for + f1-f4 vt100-style rather than vt220-style (report by Gabor Z Papp). + + suppress configure check for gnatmake if Ada95/Makefile.in is not + found. + + correct a typo in configure --with-bool option for the case where + --without-cxx is used (report by Daniel Jacobowitz). + + add a note to INSTALL's discussion of --with-normal, pointing out + that one may wish to use --without-gpm to ensure a completely + static link (prompted by report by Felix von Leitner). + +20051010 5.5 release for upload to ftp.gnu.org + +20051008 + + document in demo_forms.c some portability issues. + +20051001 + + document side-effect of werase() which sets the cursor position. + + save/restore the current position in form field editing to make + overlay mode work. + +20050924 + + correct header dependencies in progs, allowing parallel make (report + by Daniel Jacobowitz). + + modify CF_BUILD_CC to ensure that pre-setting $BUILD_CC overrides + the configure check for --with-build-cc (report by Daniel Jacobowitz). + + modify CF_CFG_DEFAULTS to not use /usr as the default prefix for + NetBSD. + + update config.guess and config.sub from + http://subversions.gnu.org/cgi-bin/viewcvs/config/config/ + +20050917 + + modify sed expression which computes path for /usr/lib/terminfo + symbolic link in install to ensure that it does not change unexpected + levels of the path (Gentoo #42336). + + modify default for --disable-lp64 configure option to reduce impact + on existing 64-bit builds. Enabling the _LP64 option may change the + size of chtype and mmask_t. However, for ABI 6, it is enabled by + default (report by Mike Frysinger). + + add configure script check for --enable-ext-mouse, bump ABI to 6 by + default if it is used. + + improve configure script logic for bumping ABI to omit this if the + --with-abi-version option was used. + + update address for Free Software Foundation in tack's source. + + correct wins_wch(), which was not marking the filler-cells of + multi-column characters (cf: 20041023). + +20050910 + + modify mouse initialization to ensure that Gpm_Open() is called only + once. Otherwise GPM gets confused in its initialization of signal + handlers (Debian #326709). + +20050903 + + modify logic for backspacing in a multiline form field to ensure that + it works even when the preceding line is full (report by Frank van + Vugt). + + remove comment about BUGS section of ncurses manpage (Debian #325481) + +20050827 + + document some workarounds for shared and libtool library + configurations in INSTALL (see --with-shared and --with-libtool). + + modify CF_GCC_VERSION and CF_GXX_VERSION macros to accommodate + cross-compilers which emit the platform name in their version + message, e.g., + arm-sa1100-linux-gnu-g++ (GCC) 4.0.1 + (report by Frank van Vugt). + +20050820 + + start updating documentation for upcoming 5.5 release. + + fix to make libtool and libtinfo work together again (cf: 20050122). + + fixes to allow building traces into libtinfo + + add debug trace to tic that shows if/how ncurses will write to the + lower corner of a terminal's screen. + + update llib-l* files. + +20050813 + + modify initializers in c++ binding to build with old versions of g++. + + improve special case for 20050115 repainting fix, ensuring that if + the first changed cell is not a character that the range to be + repainted is adjusted to start at a character's beginning (Debian + #316663). + +20050806 + + fixes to build on QNX 6.1 + + improve configure script checks for Intel 9.0 compiler. + + remove #include's for libc.h (obsolete). + + adjust ifdef's in curses.priv.h so that when cross-compiling to + produce comp_hash and make_keys, no dependency on wchar.h is needed. + That simplifies the build-cppflags (report by Frank van Vugt). + + move modules related to key-binding into libtinfo to fix linkage + problem caused by 20050430 changes to MKkeyname.sh (report by + Konstantin Andreev). + +20050723 + + updates/fixes for configure script macros from vile -TD + + make prism9's sgr string agree with the rest of the terminfo -TD + + make vt220's sgr0 string consistent with sgr string, do this for + several related cases -TD + + improve translation to termcap by filtering the 'me' (sgr0) strings + as in the runtime call to tgetent() (prompted by a discussion with + Thomas Klausner). + + improve tic check for sgr0 versus sgr(0), to help ensure that sgr0 + resets line-drawing. + +20050716 + + fix special cases for trimming sgr0 for hurd and vt220 (Debian + #318621). + + split-out _nc_trim_sgr0() from modifications made to tgetent(), to + allow it to be used by tic to provide information about the runtime + changes that would be made to sgr0 for termcap applications. + + modify make_sed.sh to make the group-name in the NAME section of + form/menu library manpage agree with the TITLE string when renaming + is done for Debian (Debian #78866). + +20050702 + + modify parameter type in c++ binding for insch() and mvwinsch() to + be consistent with underlying ncurses library (was char, is chtype). + + modify treatment of Intel compiler to allow _GNU_SOURCE to be defined + on Linux. + + improve configure check for nanosleep(), checking that it works since + some older systems such as AIX 4.3 have a nonworking version. + +20050625 + + update config.guess and config.sub from + http://subversions.gnu.org/cgi-bin/viewcvs/config/config/ + + modify misc/shlib to work in test-directory. + + suppress $suffix in misc/run_tic.sh when cross-compiling. This + allows cross-compiles to use the host's tic program to handle the + "make install.data" step. + + improve description of $LINES and $COLUMNS variables in manpages + (prompted by report by Dave Ulrick). + + improve description of cross-compiling in INSTALL + + add NCURSES-Programming-HOWTO.html by Pradeep Padala + (see http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/). + + modify configure script to obtain soname for GPM library (discussion + with Daniel Jacobowitz). + + modify configure script so that --with-chtype option will still + compute the unsigned literals suffix for constants in curses.h + (report by Daniel Jacobowitz: + + patches from Daniel Jacobowitz: + + the man_db.renames entry for tack.1 was backwards. + + tack.1 had some 1m's that should have been 1M's. + + the section for curs_inwstr.3 was wrong. + +20050619 + + correction to --with-chtype option (report by Daniel Jacobowitz). + +20050618 + + move build-time edit_man.sh and edit_man.sed scripts to top directory + to simplify reusing them for renaming tack's manpage (prompted by a + review of Debian package). + + revert minor optimization from 20041030 (Debian #313609). + + libtool-specific fixes, tested with libtool 1.4.3, 1.5.0, 1.5.6, + 1.5.10 and 1.5.18 (all work except as noted previously for the c++ + install using libtool 1.5.0): + + modify the clean-rule in c++/Makefile.in to work with IRIX64 make + program. + + use $(LIBTOOL_UNINSTALL) symbol, overlooked in 20030830 + + add configure options --with-chtype and --with-mmask-t, to allow + overriding of the non-LP64 model's use of the corresponding types. + + revise test for size of chtype (and mmask_t), which always returned + "long" due to an uninitialized variable (report by Daniel Jacobowitz). + +20050611 + + change _tracef's that used "%p" format for va_list values to ignore + that, since on some platforms those are not pointers. + + fixes for long-formats in printf's due to largefile support. + +20050604 + + fixes for termcap support: + + reset pointer to _nc_curr_token.tk_name when the input stream is + closed, which could point to free memory (cf: 20030215). + + delink TERMTYPE data which is used by the termcap reader, so that + extended names data will be freed consistently. + + free pointer to TERMTYPE data in _nc_free_termtype() rather than + its callers. + + add some entrypoints for freeing permanently allocated data via + _nc_freeall() when NO_LEAKS is defined. + + amend 20041030 change to _nc_do_color to ensure that optimization is + applied only when the terminal supports back_color_erase (bce). + +20050528 + + add sun-color terminfo entry -TD + + correct a missing assignment in c++ binding's method + NCursesPanel::UserPointer() from 20050409 changes. + + improve configure check for large-files, adding check for dirent64 + from vile -TD + + minor change to configure script to improve linker options for the + Ada95 tree. + +20050515 + + document error conditions for ncurses library functions (report by + Stanislav Ievlev). + + regenerated html documentation for ada binding. + see ftp://ftp.invisible-island.net/ncurses/patches/gnathtml + +20050507 + + regenerated html documentation for manpages. + + add $(BUILD_EXEEXT) suffix to invocation of make_keys in + ncurses/Makefile (Gentoo #89772). + + modify c++/demo.cc to build with g++ -fno-implicit-templates option + (patch by Mike Frysinger). + + modify tic to filter out long extended names when translating to + termcap format. Only two characters are permissible for termcap + capability names. + +20050430 + + modify terminfo entries xterm-new and rxvt to add strings for + shift-, control-cursor keys. + + workaround to allow c++ binding to compile with g++ 2.95.3, which + has a broken implementation of static_cast<> (patch by Jeff Chua). + + modify initialization of key lookup table so that if an extended + capability (tic -x) string is defined, and its name begins with 'k', + it will automatically be treated as a key. + + modify test/keynames.c to allow for the possibility of extended + key names, e.g., via define_key(), or via "tic -x". + + add test/demo_termcap.c to show the contents of given entry via the + termcap interface. + +20050423 + + minor fixes for vt100/vt52 entries -TD + + add configure option --enable-largefile + + corrected libraries used to build Ada95/gen/gen, found in testing + gcc 4.0.0. + +20050416 + + update config.guess, config.sub + + modify configure script check for _XOPEN_SOURCE, disable that on + Darwin whose header files have problems (patch by Chris Zubrzycki). + + modify form library Is_Printable_String() to use iswprint() rather + than wcwidth() for determining if a character is printable. The + latter caused it to reject menu items containing non-spacing + characters. + + modify ncurses test program's F-test to handle non-spacing characters + by combining them with a reverse-video blank. + + review/fix several gcc -Wconversion warnings. + +20050409 + + correct an off-by-one error in m_driver() for mouse-clicks used to + position the mouse to a particular item. + + implement test/demo_menus.c + + add some checks in lib_mouse to ensure SP is set. + + modify C++ binding to make 20050403 changes work with the configure + --enable-const option. + +20050403 + + modify start_color() to return ERR if it cannot allocate memory. + + address g++ compiler warnings in C++ binding by adding explicit + member initialization, assignment operators and copy constructors. + Most of the changes simply preserve the existing semantics of the + binding, which can leak memory, etc., but by making these features + visible, it provides a framework for improving the binding. + + improve C++ binding using static_cast, etc. + + modify configure script --enable-warnings to add options to g++ to + correspond to the gcc --enable-warnings. + + modify C++ binding to use some C internal functions to make it + compile properly on Solaris (and other platforms). + +20050327 + + amend change from 20050320 to limit it to configurations with a + valid locale. + + fix a bug introduced in 20050320 which broke the translation of + nonprinting characters to uparrow form (report by Takahashi Tamotsu). + +20050326 + + add ifdef's for _LP64 in curses.h to avoid using wasteful 64-bits for + chtype and mmask_t, but add configure option --disable-lp64 in case + anyone used that configuration. + + update misc/shlib script to account for Mac OS X (report by Michail + Vidiassov). + + correct comparison for wrapping multibyte characters in + waddch_literal() (report by Takahashi Tamotsu). + +20050320 + + add -c and -w options to tset to allow user to suppress ncurses' + resizing of the terminal emulator window in the special case where it + is not able to detect the true size (report by Win Delvaux, Debian + #300419). + + modify waddch_nosync() to account for locale zn_CH.GBK, which uses + codes 128-159 as part of multibyte characters (report by Wang + WenRui, Debian #300512). + +20050319 + + modify ncurses.c 'd' test to make it work with 88-color + configuration, i.e., by implementing scrolling. + + improve scrolling in ncurses.c 'c' and 'C' tests, e.g., for 88-color + configuration. + +20050312 + + change tracemunch to use strict checking. + + modify ncurses.c 'p' test to test line-drawing within a pad. + + implement environment variable NCURSES_NO_UTF8_ACS to support + miscellaneous terminal emulators which ignore alternate character + set escape sequences when in UTF-8 mode. + +20050305 + + change NCursesWindow::err_handler() to a virtual function (request by + Steve Beal). + + modify fty_int.c and fty_num.c to handle wide characters (report by + Wolfgang Gutjahr). + + adapt fix for fty_alpha.c to fty_alnum.c, which also handled normal + and wide characters inconsistently (report by Wolfgang Gutjahr). + + update llib-* files to reflect internal interface additions/changes. + +20050226 + + improve test/configure script, adding tests for _XOPEN_SOURCE, etc., + from lynx. + + add aixterm-16color terminfo entry -TD + + modified xterm-new terminfo entry to work with tgetent() changes -TD + + extended changes in tgetent() from 20040710 to allow the substring of + sgr0 which matches rmacs to be at the beginning of the sgr0 string + (request by Thomas Wolff). Wolff says the visual effect in + combination with pre-20040710 ncurses is improved. + + fix off-by-one in winnstr() call which caused form field validation + of multibyte characters to ignore the last character in a field. + + correct logic in winsch() for inserting multibyte strings; the code + would clear cells after the insertion rather than push them to the + right (cf: 20040228). + + fix an inconsistency in Check_Alpha_Field() between normal and wide + character logic (report by Wolfgang Gutjahr). + +20050219 + + fix a bug in editing wide-characters in form library: deleting a + nonwide character modified the previous wide-character. + + update manpage to describe NCURSES_MOUSE_VERSION 2. + + correct manpage description of mouseinterval() (Debian #280687). + + add a note to default_colors.3x explaining why this extension was + added (Debian #295083). + + add traces to panel library. + +20050212 + + improve editing of wide-characters in form library: left/right + cursor movement, and single-character deletions work properly. + + disable GPM mouse support when $TERM happens to be prefixed with + "xterm". Gpm_Open() would otherwise assert that it can deal with + mouse events in this case. + + modify GPM mouse support so it closes the server connection when + the caller disables the mouse (report by Stanislav Ievlev). + +20050205 + + add traces for callback functions in form library. + + add experimental configure option --enable-ext-mouse, which defines + NCURSES_MOUSE_VERSION 2, and modifies the encoding of mouse events to + support wheel mice, which may transmit buttons 4 and 5. This works + with xterm and similar X terminal emulators (prompted by question by + Andreas Henningsson, this is also related to Debian #230990). + + improve configure macros CF_XOPEN_SOURCE and CF_POSIX_C_SOURCE to + avoid redefinition warnings on cygwin. + +20050129 + + merge remaining development changes for extended colors (mostly + complete, does not appear to break other configurations). + + add xterm-88color.dat (part of extended colors testing). + + improve _tracedump() handling of color pairs past 96. + + modify return-value from start_color() to return OK if colors have + already been started. + + modify curs_color.3x list error conditions for init_pair(), + pair_content() and color_content(). + + modify pair_content() to return -1 for consistency with init_pair() + if it corresponds to the default-color. + + change internal representation of default-color to allow application + to use color number 255. This does not affect the total number of + color pairs which are allowed. + + add a top-level tags rule. + +20050122 + + add a null-pointer check in wgetch() in case it is called without + first calling initscr(). + + add some null-pointer checks for SP, which is not set by libtinfo. + + modify misc/shlib to ensure that absolute pathnames are used. + + modify test/Makefile.in, etc., to link test programs only against the + libraries needed, e.g., omit form/menu/panel library for the ones + that are curses-specific. + + change SP->_current_attr to a pointer, adjust ifdef's to ensure that + libtinfo.so and libtinfow.so have the same ABI. The reason for this + is that the corresponding data which belongs to the upper-level + ncurses library has a different size in each model (report by + Stanislav Ievlev). + +20050115 + + minor fixes to allow test-compiles with g++. + + correct column value shown in tic's warnings, which did not account + for leading whitespace. + + add a check in _nc_trans_string() for improperly ended strings, i.e., + where a following line begins in column 1. + + modify _nc_save_str() to return a null pointer on buffer overflow. + + improve repainting while scrolling wide-character data (Eungkyu Song). + +20050108 + + merge some development changes to extend color capabilities. + +20050101 + + merge some development changes to extend color capabilities. + + fix manpage typo (FreeBSD report docs/75544). + + update config.guess, config.sub + > patches for configure script (Albert Chin-A-Young): + + improved fix to make mbstate_t recognized on HPUX 11i (cf: + 20030705), making vsscanf() prototype visible on IRIX64. Tested for + on HP-UX 11i, Solaris 7, 8, 9, AIX 4.3.3, 5.2, Tru64 UNIX 4.0D, 5.1, + IRIX64 6.5, Redhat Linux 7.1, 9, and RHEL 2.1, 3.0. + + print the result of the --disable-home-terminfo option. + + use -rpath when compiling with SGI C compiler. + +20041225 + + add trace calls to remaining public functions in form and menu + libraries. + + fix check for numeric digits in test/ncurses.c 'b' and 'B' tests. + + fix typo in test/ncurses.c 'c' test from 20041218. + +20041218 + + revise test/ncurses.c 'c' color test to improve use for xterm-88color + and xterm-256color, added 'C' test using the wide-character color_set + and attr_set functions. + +20041211 + + modify configure script to work with Intel compiler. + + fix an limit-check in wadd_wchnstr() which caused labels in the + forms-demo to be one character short. + + fix typo in curs_addchstr.3x (Jared Yanovich). + + add trace calls to most functions in form and menu libraries. + + update working-position for adding wide-characters when window is + scrolled (prompted by related report by Eungkyu Song). + +20041204 + + replace some references on Linux to wcrtomb() which use it to obtain + the length of a multibyte string with _nc_wcrtomb, since wcrtomb() is + broken in glibc (see Debian #284260). + + corrected length-computation in wide-character support for + field_buffer(). + + some fixes to frm_driver.c to allow it to accept multibyte input. + + modify configure script to work with Intel 8.0 compiler. + +20041127 + + amend change to setupterm() in 20030405 which would reuse the value + of cur_term if the same output was selected. This now reuses it only + when setupterm() is called from tgetent(), which has no notion of + separate SCREENs. Note that tgetent() must be called after initscr() + or newterm() to use this feature (Redhat #140326). + + add a check in CF_BUILD_CC macro to ensure that developer has given + the --with-build-cc option when cross-compiling (report by Alexandre + Campo). + + improved configure script checks for _XOPEN_SOURCE and + _POSIX_C_SOURCE (fix for IRIX 5.3 from Georg Schwarz, _POSIX_C_SOURCE + updates from lynx). + + cosmetic fix to test/gdc.c to recolor the bottom edge of the box + for consistency (comment by Dan Nelson). + +20041120 + + update wsvt25 terminfo entry -TD + + modify test/ins_wide.c to test all flavors of ins_wstr(). + + ignore filler-cells in wadd_wchnstr() when adding a cchar_t array + which consists of multi-column characters, since this function + constructs them (cf: 20041023). + + modify winnstr() to return multibyte character strings for the + wide-character configuration. + +20041106 + + fixes to make slk_set() and slk_wset() accept and store multibyte + or multicolumn characters. + +20041030 + + improve color optimization a little by making _nc_do_color() check + if the old/new pairs are equivalent to the default pair 0. + + modify assume_default_colors() to not require that + use_default_colors() be called first. + +20041023 + + modify term_attrs() to use termattrs(), add the extended attributes + such as enter_horizontal_hl_mode for WA_HORIZONTAL to term_attrs(). + + add logic in waddch_literal() to clear orphaned cells when one + multi-column character partly overwrites another. + + improved logic for clearing cells when a multi-column character + must be wrapped to a new line. + + revise storage of cells for multi-column characters to correct a + problem with repainting. In the old scheme, it was possible for + doupdate() to decide that only part of a multi-column character + should be repainted since the filler cells stored only an attribute + to denote them as fillers, rather than the character value and the + attribute. + +20041016 + + minor fixes for traces. + + add SP->_screen_acs_map[], used to ensure that mapping of missing + line-drawing characters is handled properly. For example, ACS_DARROW + is absent from xterm-new, and it was coincidentally displayed the + same as ACS_BTEE. + +20041009 + + amend 20021221 workaround for broken acs to reset the sgr, rmacs + and smacs strings as well. Also modify the check for screen's + limitations in that area to allow the multi-character shift-in + and shift-out which seem to work. + + change GPM initialization, using dl library to load it dynamically + at runtime (Debian #110586). + +20041002 + + correct logic for color pair in setcchar() and getcchar() (patch by + Marcin 'Qrczak' Kowalczyk). + + add t/T commands to ncurses b/B tests to allow a different color to + be tested for the attrset part of the test than is used in the + background color. + +20040925 + + fix to make setcchar() to work when its wchar_t* parameter is + pointing to a string which contains more data than can be converted. + + modify wget_wstr() and example in ncurses.c to work if wchar_t and + wint_t are different sizes (report by Marcin 'Qrczak' Kowalczyk). + +20040918 + + remove check in wget_wch() added to fix an infinite loop, appears to + have been working around a transitory glibc bug, and interferes + with normal operation (report by Marcin 'Qrczak' Kowalczyk). + + correct wadd_wch() and wecho_wch(), which did not pass the rendition + information (report by Marcin 'Qrczak' Kowalczyk). + + fix aclocal.m4 so that the wide-character version of ncurses gets + compiled as libncursesw.5.dylib, instead of libncurses.5w.dylib + (adapted from patch by James J Ramsey). + + change configure script for --with-caps option to indicate that it + is no longer experimental. + + change configure script to reflect the fact that --enable-widec has + not been "experimental" since 5.3 (report by Bruno Lustosa). + +20040911 + + add 'B' test to ncurses.c, to exercise some wide-character functions. + +20040828 + + modify infocmp -i option to match 8-bit controls against its table + entries, e.g., so it can analyze the xterm-8bit entry. + + add morphos terminfo entry, improve amiga-8bit entry (Pavel Fedin). + + correct translation of "%%" in terminfo format to termcap, e.g., + using "tic -C" (Redhat #130921). + + modified configure script CF_XOPEN_SOURCE macro to ensure that if + it defines _POSIX_C_SOURCE, that it defines it to a specific value + (comp.os.stratus newsgroup comment). + +20040821 + + fixes to build with Ada95 binding with gnat 3.4 (all warnings are + fatal, and gnat does not follow the guidelines for pragmas). + However that did find a coding error in Assume_Default_Colors(). + + modify several terminfo entries to ensure xterm mouse and cursor + visibility are reset in rs2 string: hurd, putty, gnome, + konsole-base, mlterm, Eterm, screen (Debian #265784, Debian #55637). + The xterm entries are left alone - old ones for compatibility, and + the new ones do not require this change. -TD + +20040814 + + fake a SIGWINCH in newterm() to accommodate buggy terminal emulators + and window managers (Debian #265631). + > terminfo updates -TD + + remove dch/dch1 from rxvt because they are implemented inconsistently + with the common usage of bce/ech + + remove khome from vt220 (vt220's have no home key) + + add rxvt+pcfkeys + +20040807 + + modify test/ncurses.c 'b' test, adding v/V toggles to cycle through + combinations of video attributes so that for instance bold and + underline can be tested. This made the legend too crowded, added + a help window as well. + + modify test/ncurses.c 'b' test to cycle through default colors if + the -d option is set. + + update putty terminfo entry (Robert de Bath). + +20040731 + + modify test/cardfile.c to allow it to read more data than can be + displayed. + + correct logic in resizeterm.c which kept it from processing all + levels of window hierarchy (reports by Folkert van Heusden, + Chris Share). + +20040724 + + modify "tic -cv" to ignore delays when comparing strings. Also + modify it to ignore a canceled sgr string, e.g., for terminals which + cannot properly combine attributes in one control sequence. + + corrections for gnome and konsole entries (Redhat #122815, patch by + Hans de Goede) + > terminfo updates -TD + + make ncsa-m rmacs/smacs consistent with sgr + + add sgr, rc/sc and ech to syscons entries + + add function-keys to decansi + + add sgr to mterm-ansi + + add sgr, civis, cnorm to emu + + correct/simplify cup in addrinfo + +20040717 + > terminfo updates -TD + + add xterm-pc-fkeys + + review/update gnome and gnome-rh90 entries (prompted by Redhat + #122815). + + review/update konsole entries + + add sgr, correct sgr0 for kterm and mlterm + + correct tsl string in kterm + +20040711 + + add configure option --without-xterm-new + +20040710 + + add check in wget_wch() for printable bytes that are not part of a + multibyte character. + + modify wadd_wchnstr() to render text using window's background + attributes. + + improve tic's check to compare sgr and sgr0. + + fix c++ directory's .cc.i rule. + + modify logic in tgetent() which adjusts the termcap "me" string + to work with ISO-2022 string used in xterm-new (cf: 20010908). + + modify tic's check for conflicting function keys to omit that if + converting termcap to termcap format. + + add -U option to tic and infocmp. + + add rmam/smam to linux terminfo entry (Trevor Van Bremen) + > terminfo updates -TD + + minor fixes for emu + + add emu-220 + + change wyse acsc strings to use 'i' map rather than 'I' + + fixes for avatar0 + + fixes for vp3a+ + +20040703 + + use tic -x to install terminfo database -TD + + add -x to infocmp's usage message. + + correct field used for comparing O_ROWMAJOR in set_menu_format() + (report/patch by Tony Li). + + fix a missing nul check in set_field_buffer() from 20040508 changes. + > terminfo updates -TD + + make xterm-xf86-v43 derived from xterm-xf86-v40 rather than + xterm-basic -TD + + align with xterm patch #192's use of xterm-new -TD + + update xterm-new and xterm-8bit for cvvis/cnorm strings -TD + + make xterm-new the default "xterm" entry -TD + +20040626 + + correct BUILD_CPPFLAGS substitution in ncurses/Makefile.in, to allow + cross-compiling from a separate directory tree (report/patch by + Dan Engel). + + modify is_term_resized() to ensure that window sizes are nonzero, + as documented in the manpage (report by Ian Collier). + + modify CF_XOPEN_SOURCE configure macro to make Hurd port build + (Debian #249214, report/patch by Jeff Bailey). + + configure-script mods from xterm, e.g., updates to CF_ADD_CFLAGS + + update config.guess, config.sub + > terminfo updates -TD + + add mlterm + + add xterm-xf86-v44 + + modify xterm-new aka xterm-xfree86 to accommodate luit, which + relies on G1 being used via an ISO-2022 escape sequence (report by + Juliusz Chroboczek) + + add 'hurd' entry + +20040619 + + reconsidered winsnstr(), decided after comparing other + implementations that wrapping is an X/Open documentation error. + + modify test/inserts.c to test all flavors of insstr(). + +20040605 + + add setlocale() calls to a few test programs which may require it: + demo_forms.c, filter.c, ins_wide.c, inserts.c + + correct a few misspelled function names in ncurses-intro.html (report + by Tony Li). + + correct internal name of key_defined() manpage, which conflicted with + define_key(). + +20040529 + + correct size of internal pad used for holding wide-character + field_buffer() results. + + modify data_ahead() to work with wide-characters. + +20040522 + + improve description of terminfo if-then-else expressions (suggested + by Arne Thomassen). + + improve test/ncurses.c 'd' test, allow it to use external file for + initial palette (added xterm-16color.dat and linux-color.dat), and + reset colors to the initial palette when starting/ending the test. + + change limit-check in init_color() to allow r/g/b component to + reach 1000 (cf: 20020928). + +20040516 + + modify form library to use cchar_t's rather than char's in the + wide-character configuration for storing data for field buffers. + + correct logic of win_wchnstr(), which did not work for more than + one cell. + +20040508 + + replace memset/memcpy usage in form library with for-loops to + simplify changing the datatype of FIELD.buf, part of wide-character + changes. + + fix some inconsistent use of #if/#ifdef (report by Alain Guibert). + +20040501 + + modify menu library to account for actual number of columns used by + multibyte character strings, in the wide-character configuration + (adapted from patch by Philipp Tomsich). + + add "-x" option to infocmp like tic's "-x", for use in "-F" + comparisons. This modifies infocmp to only report extended + capabilities if the -x option is given, making this more consistent + with tic. Some scripts may break, since infocmp previous gave this + information without an option. + + modify termcap-parsing to retain 2-character aliases at the beginning + of an entry if the "-x" option is used in tic. + +20040424 + + minor compiler-warning and test-program fixes. + +20040417 + + modify tic's missing-sgr warning to apply to terminfo only. + + free some memory leaks in tic. + + remove check in post_menu() that prevented menus from extending + beyond the screen (request by Max J. Werner). + + remove check in newwin() that prevents allocating windows + that extend beyond the screen. Solaris curses does this. + + add ifdef in test/color_set.c to allow it to compile with older + curses. + + add napms() calls to test/dots.c to make it not be a CPU hog. + +20040403 + + modify unctrl() to return null if its parameter does not correspond + to an unsigned char. + + add some limit-checks to guard isprint(), etc., from being used on + values that do not fit into an unsigned char (report by Sami Farin). + +20040328 + + fix a typo in the _nc_get_locale() change. + +20040327 + + modify _nc_get_locale() to use setlocale() to query the program's + current locale rather than using getenv(). This fixes a case in tin + which relies on legacy treatment of 8-bit characters when the locale + is not initialized (reported by Urs Jansen). + + add sgr string to screen's and rxvt's terminfo entries -TD. + + add a check in tic for terminfo entries having an sgr0 but no sgr + string. This confuses Tru64 and HPUX curses when combined with + color, e.g., making them leave line-drawing characters in odd places. + + correct casts used in ABSENT_BOOLEAN, CANCELLED_BOOLEAN, matches the + original definitions used in Debian package to fix PowerPC bug before + 20030802 (Debian #237629). + +20040320 + + modify PutAttrChar() and PUTC() macro to improve use of + A_ALTCHARSET attribute to prevent line-drawing characters from + being lost in situations where the locale would otherwise treat the + raw data as nonprintable (Debian #227879). + +20040313 + + fix a redefinition of CTRL() macro in test/view.c for AIX 5.2 (report + by Jim Idle). + + remove ".PP" after ".SH NAME" in a few manpages; this confuses + some apropos script (Debian #237831). + +20040306 + + modify ncurses.c 'r' test so editing commands, like inserted text, + set the field background, and the state of insert/overlay editing + mode is shown in that test. + + change syntax of dummy targets in Ada95 makefiles to work with pmake. + + correct logic in test/ncurses.c 'b' for noncolor terminals which + did not recognize a quit-command (cf: 20030419). + +20040228 + + modify _nc_insert_ch() to allow for its input to be part of a + multibyte string. + + split out lib_insnstr.c, to prepare to rewrite it. X/Open states + that this function performs wrapping, unlike all of the other + insert-functions. Currently it does not wrap. + + check for nl_langinfo(CODESET), use it if available (report by + Stanislav Ievlev). + + split-out CF_BUILD_CC macro, actually did this for lynx first. + + fixes for configure script CF_WITH_DBMALLOC and CF_WITH_DMALLOC, + which happened to work with bash, but not with Bourne shell (report + by Marco d'Itri via tin-dev). + +20040221 + + some changes to adapt the form library to wide characters, incomplete + (request by Mike Aubury). + + add symbol to curses.h which can be used to suppress include of + stdbool.h, e.g., + #define NCURSES_ENABLE_STDBOOL_H 0 + #include + (discussion on XFree86 mailing list). + +20040214 + + modify configure --with-termlib option to accept a value which sets + the name of the terminfo library. This would allow a packager to + build libtinfow.so renamed to coincide with libtinfo.so (discussion + with Stanislav Ievlev). + + improve documentation of --with-install-prefix, --prefix and + $(DESTDIR) in INSTALL (prompted by discussion with Paul Lew). + + add configure check if the compiler can use -c -o options to rename + its output file, use that to omit the 'cd' command which was used to + ensure object files are created in a separate staging directory + (prompted by comments by Johnny Wezel, Martin Mokrejs). + +20040208 5.4 release for upload to ftp.gnu.org + + update TO-DO. + +20040207 pre-release + + minor fixes to _nc_tparm_analyze(), i.e., do not count %i as a param, + and do not count %d if it follows a %p. + + correct an inconsistency between handling of codes in the 128-255 + range, e.g., as illustrated by test/ncurses.c f/F tests. In POSIX + locale, the latter did not show printable results, while the former + did. + + modify MKlib_gen.sh to compensate for broken C preprocessor on Mac + OS X, which alters "%%" to "% % " (report by Robert Simms, fix + verified by Scott Corscadden). + +20040131 pre-release + + modify SCREEN struct to align it between normal/wide curses flavors + to simplify future changes to build a single version of libtinfo + (patch by Stanislav Ievlev). + + document handling of carriage return by addch() in manpage. + + document special features of unctrl() in manpage. + + documented interface changes in INSTALL. + + corrected control-char test in lib_addch.c to account for locale + (Debian #230335, cf: 971206). + + updated test/configure.in to use AC_EXEEXT and AC_OBJEXT. + + fixes to compile Ada95 binding with Debian gnat 3.15p-4 package. + + minor configure-script fixes for older ports, e.g., BeOS R4.5. + +20040125 pre-release + + amend change to PutAttrChar() from 20030614 which computed the number + of cells for a possibly multi-cell character. The 20030614 change + forced the cell to a blank if the result from wcwidth() was not + greater than zero. However, wcwidth() called for parameters in the + range 128-255 can give this return value. The logic now simply + ensures that the number of cells is greater than zero without + modifying the displayed value. + +20040124 pre-release + + looked good for 5.4 release for upload to ftp.gnu.org (but see above) + + modify configure script check for ranlib to use AC_CHECK_TOOL, since + that works better for cross-compiling. + +20040117 pre-release + + modify lib_get_wch.c to prefer mblen/mbtowc over mbrlen/mbrtowc to + work around core dump in Solaris 8's locale support, e.g., for + zh_CN.GB18030 (report by Saravanan Bellan). + + add includes for and in configure script macro + to make check work with Tru64 4.0d. + + add terminfo entry for U/Win -TD + + add terminfo entries for SFU aka Interix aka OpenNT (Federico + Bianchi). + + modify tput's error messages to prefix them with the program name + (report by Vincent Lefevre, patch by Daniel Jacobowitz (see Debian + #227586)). + + correct a place in tack where exit_standout_mode was used instead of + exit_attribute_mode (patch by Jochen Voss (see Debian #224443)). + + modify c++/cursesf.h to use const in the Enumeration_Field method. + + remove an ambiguous (actually redundant) method from c++/cursesf.h + + make $HOME/.terminfo update optional (suggested by Stanislav Ievlev). + + improve sed script which extracts libtool's version in the + CF_WITH_LIBTOOL macro. + + add ifdef'd call to AC_PROG_LIBTOOL to CF_WITH_LIBTOOL macro (to + simplify local patch for Albert Chin-A-Young).. + + add $(CXXFLAGS) to link command in c++/Makefile.in (adapted from + patch by Albert Chin-A-Young).. + + fix a missing substitution in configure.in for "$target" needed for + HPUX .so/.sl case. + + resync CF_XOPEN_SOURCE configure macro with lynx; fixes IRIX64 and + NetBSD 1.6 conflicts with _XOPEN_SOURCE. + + make check for stdbool.h more specific, to ensure that including it + will actually define/declare bool for the configured compiler. + + rewrite ifdef's in curses.h relating NCURSES_BOOL and bool. The + intention of that is to #define NCURSES_BOOL as bool when the + compiler declares bool, and to #define bool as NCURSES_BOOL when it + does not (reported by Jim Gifford, Sam Varshavchik, cf: 20031213). + +20040110 pre-release + + change minor version to 4, i.e., ncurses 5.4 + + revised/improved terminfo entries for tvi912b, tvi920b (Benjamin C W + Sittler). + + simplified ncurses/base/version.c by defining the result from the + configure script rather than using sprintf (suggested by Stanislav + Ievlev). + + remove obsolete casts from c++/cursesw.h (reported by Stanislav + Ievlev). + + modify configure script so that when configuring for termlib, programs + such as tic are not linked with the upper-level ncurses library + (suggested by Stanislav Ievlev). + + move version.c from ncurses/base to ncurses/tinfo to allow linking + of tic, etc., using libtinfo (suggested by Stanislav Ievlev). + +20040103 + + adjust -D's to build ncursesw on OpenBSD. + + modify CF_PROG_EXT to make OS/2 build with EXEEXT. + + add pecho_wchar(). + + remove include from lib_slk_wset.c which is not needed (or + available) on older platforms. + +20031227 + + add -D's to build ncursew on FreeBSD 5.1. + + modify shared library configuration for FreeBSD 4.x/5.x to add the + soname information (request by Marc Glisse). + + modify _nc_read_tic_entry() to not use MAX_ALIAS, but PATH_MAX only + for limiting the length of a filename in the terminfo database. + + modify termname() to return the terminal name used by setupterm() + rather than $TERM, without truncating to 14 characters as documented + by X/Open (report by Stanislav Ievlev, cf: 970719). + + re-add definition for _BSD_TYPES, lost in merge (cf: 20031206). + +20031220 + + add configure option --with-manpage-format=catonly to address + behavior of BSDI, allow install of man+cat files on NetBSD, whose + behavior has diverged by requiring both to be present. + + remove leading blanks from comment-lines in manlinks.sed script to + work with Tru64 4.0d. + + add screen.linux terminfo entry (discussion on mutt-users mailing + list). + +20031213 + + add a check for tic to flag missing backslashes for termcap + continuation lines. ncurses reads the whole entry, but termcap + applications do not. + + add configure option "--with-manpage-aliases" extending + "--with-manpage-aliases" to provide the option of generating ".so" + files rather than symbolic links for manpage aliases. + + add bool definition in include/curses.h.in for configurations with no + usable C++ compiler (cf: 20030607). + + fix pathname of SigAction.h for building with --srcdir (reported by + Mike Castle). + +20031206 + + folded ncurses/base/sigaction.c into includes of ncurses/SigAction.h, + since that header is used only within ncurses/tty/lib_tstp.c, for + non-POSIX systems (discussion with Stanislav Ievlev). + + remove obsolete _nc_outstr() function (report by Stanislav Ievlev + ). + + add test/background.c and test/color_set.c + + modify color_set() function to work with color pair 0 (report by + George Andreou ). + + add configure option --with-trace, since defining TRACE seems too + awkward for some cases. + + remove a call to _nc_free_termtype() from read_termtype(), since the + corresponding buffer contents were already zeroed by a memset (cf: + 20000101). + + improve configure check for _XOPEN_SOURCE and related definitions, + adding special cases for Solaris' __EXTENSIONS__ and FreeBSD's + __BSD_TYPES (reports by Marc Glisse ). + + small fixes to compile on Solaris and IRIX64 using cc. + + correct typo in check for pre-POSIX sort options in MKkey_defs.sh + (cf: 20031101). + +20031129 + + modify _nc_gettime() to avoid a problem with arithmetic on unsigned + values (Philippe Blain). + + improve the nanosleep() logic in napms() by checking for EINTR and + restarting (Philippe Blain). + + correct expression for "%D" in lib_tgoto.c (Juha Jarvi + ). + +20031122 + + add linux-vt terminfo entry (Andrey V Lukyanov ). + + allow "\|" escape in terminfo; tic should not warn about this. + + save the full pathname of the trace-file the first time it is opened, + to avoid creating it in different directories if the application + opens and closes it while changing its working directory. + + modify configure script to provide a non-empty default for + $BROKEN_LINKER + +20031108 + + add DJGPP to special case of DOS-style drive letters potentially + appearing in TERMCAP environment variable. + + fix some spelling in comments (reports by Jason McIntyre, Jonathon + Gray). + + update config.guess, config.sub + +20031101 + + fix a memory leak in error-return from setupterm() (report by + Stanislav Ievlev ). + + use EXEEXT and OBJEXT consistently in makefiles. + + amend fixes for cross-compiling to use separate executable-suffix + BUILD_EXEEXT (cf: 20031018). + + modify MKkey_defs.sh to check for sort utility that does not + recognize key options, e.g., busybox (report by Peter S Mazinger + ). + + fix potential out-of-bounds indexing in _nc_infotocap() (found by + David Krause using some of the new malloc debugging features + under OpenBSD, patch by Ted Unangst). + + modify CF_LIB_SUFFIX for Itanium releases of HP-UX, which use a + ".so" suffix (patch by Jonathan Ward ). + +20031025 + + update terminfo for xterm-xfree86 -TD + + add check for multiple "tc=" clauses in a termcap to tic. + + check for missing op/oc in tic. + + correct _nc_resolve_uses() and _nc_merge_entry() to allow infocmp and + tic to show cancelled capabilities. These functions were ignoring + the state of the target entry, which should be untouched if cancelled. + + correct comment in tack/output.c (Debian #215806). + + add some null-pointer checks to lib_options.c (report by Michael + Bienia). + + regenerated html documentation. + + correction to tar-copy.sh, remove a trap command that resulted in + leaving temporary files (cf: 20030510). + + remove contact/maintainer addresses for Juergen Pfeifer (his request). + +20031018 + + updated test/configure to reflect changes for libtool (cf: 20030830). + + fix several places in tack/pad.c which tested and used the parameter- + and parameterless strings inconsistently, i.e., in pad_rin(), + pad_il(), pad_indn() and pad_dl() (Debian #215805). + + minor fixes for configure script and makefiles to cleanup executables + generated when cross-compiling for DJGPP. + + modify infocmp to omit check for $TERM for operations that do not + require it, e.g., "infocmp -e" used to build fallback list (report by + Egmont Koblinger). + +20031004 + + add terminfo entries for DJGPP. + + updated note about maintainer in ncurses-intro.html + +20030927 + + update terminfo entries for gnome terminal. + + modify tack to reset colors after each color test, correct a place + where exit_standout_mode was used instead of exit_attribute_mode. + + improve tack's bce test by making it set colors other than black + on white. + + plug a potential recursion between napms() and _nc_timed_wait() + (report by Philippe Blain). + +20030920 + + add --with-rel-version option to allow workaround to allow making + libtool on Darwin generate the "same" library names as with the + --with-shared option. The Darwin ld program does not work well + with a zero as the minor-version value (request by Chris Zubrzycki). + + modify CF_MIXEDCASE_FILENAMES macro to work with cross-compiling. + + modify tack to allow it to run from fallback terminfo data. + > patch by Philippe Blain: + + improve PutRange() by adjusting call to EmitRange() and corresponding + return-value to not emit unchanged characters on the end of the + range. + + improve a check for changed-attribute by exiting a loop when the + change is found. + + improve logic in TransformLine(), eliminating a duplicated comparison + in the clr_bol logic. + +20030913 + > patch by Philippe Blain: + + in ncurses/tty/lib_mvcur.c, + move the label 'nonlocal' just before the second gettimeofday() to + be able to compute the diff time when 'goto nonlocal' used. + Rename 'msec' to 'microsec' in the debug-message. + + in ncurses/tty/lib_mvcur.c, + Use _nc_outch() in carriage return/newline movement instead of + putchar() which goes to stdout. Move test for xold>0 out of loop. + + in ncurses/tinfo/setbuf.c, + Set the flag SP->_buffered at the end of operations when all has been + successful (typeMalloc can fail). + + simplify NC_BUFFERED macro by moving check inside _nc_setbuf(). + +20030906 + + modify configure script to avoid using "head -1", which does not + work if POSIXLY_CORRECT (sic) is set. + + modify run_tic.in to avoid using wrong shared libraries when + cross-compiling (Dan Kegel). + +20030830 + + alter configure script help message to make it clearer that + --with-build-cc does not specify a cross-compiler (suggested by Dan + Kegel ). + + modify configure script to accommodate libtool 1.5, as well as add an + parameter to the "--with-libtool" option which can specify the + pathname of libtool (report by Chris Zubrzycki). We note that + libtool 1.5 has more than one bug in its C++ support, so it is not + able to install libncurses++, for instance, if $DESTDIR or the option + --with-install-prefix is used. + +20030823 + > patch by Philippe Blain: + + move assignments to SP->_cursrow, SP->_curscol into online_mvcur(). + + make baudrate computation in delay_output() consistent with the + assumption in _nc_mvcur_init(), i.e., a byte is 9 bits. + +20030816 + + modify logic in waddch_literal() to take into account zh_TW.Big5 + whose multibyte sequences may contain "printable" characters, e.g., + a "g" in the sequence "\247g" (Debian #204889, cf: 20030621). + + improve storage used by _nc_safe_strcpy() by ensuring that the size + is reset based on the initialization call, in case it were called + after other strcpy/strcat calls (report by Philippe Blain). + > patch by Philippe Blain: + + remove an unused ifdef for REAL_ATTR & WANT_CHAR + + correct a place where _cup_cost was used rather than _cuu_cost + +20030809 + + fix a small memory leak in _nc_free_termtype(). + + close trace-file if trace() is called with a zero parameter. + + free memory allocated for soft-key strings, in delscreen(). + + fix an allocation size in safe_sprintf.c for the "*" format code. + + correct safe_sprintf.c to not return a null pointer if the format + happens to be an empty string. This applies to the "configure + --enable-safe-sprintf" option (Redhat #101486). + +20030802 + + modify casts used for ABSENT_BOOLEAN and CANCELLED_BOOLEAN (report by + Daniel Jacobowitz). + > patch by Philippe Blain: + + change padding for change_scroll_region to not be proportional to + the size of the scroll-region. + + correct error-return in _nc_safe_strcat(). + +20030726 + + correct limit-checks in _nc_scroll_window() (report and test-case by + Thomas Graf cf: 20011020). + + re-order configure checks for _XOPEN_SOURCE to avoid conflict with + _GNU_SOURCE check. + +20030719 + + use clr_eol in preference to blanks for bce terminals, so select and + paste will have fewer trailing blanks, e.g., when using xterm + (request by Vincent Lefevre). + + correct prototype for wunctrl() in manpage. + + add configure --with-abi-version option (discussion with Charles + Wilson). + > cygwin changes from Charles Wilson: + + aclocal.m4: on cygwin, use autodetected prefix for import + and static lib, but use "cyg" for DLL. + + include/ncurses_dll.h: correct the comments to reflect current + status of cygwin/mingw port. Fix compiler warning. + + misc/run_tic.in: ensure that tic.exe can find the uninstalled + DLL, by adding the lib-directory to the PATH variable. + + misc/terminfo.src (nxterm|xterm-color): make xterm-color + primary instead of nxterm, to match XFree86's xterm.terminfo + usage and to prevent circular links. + (rxvt): add additional codes from rxvt.org. + (rxvt-color): new alias + (rxvt-xpm): new alias + (rxvt-cygwin): like rxvt, but with special acsc codes. + (rxvt-cygwin-native): ditto. rxvt may be run under XWindows, or + with a "native" MSWin GUI. Each takes different acsc codes, + which are both different from the "normal" rxvt's acsc. + (cygwin): cygwin-in-cmd.exe window. Lots of fixes. + (cygwinDBG): ditto. + + mk-1st.awk: use "cyg" for the DLL prefix, but "lib" for import + and static libs. + +20030712 + + update config.guess, config.sub + + add triples for configuring shared libraries with the Debian + GNU/FreeBSD packages (patch by Robert Millan ). + +20030705 + + modify CF_GCC_WARNINGS so it only applies to gcc, not g++. Some + platforms have installed g++ along with the native C compiler, which + would not accept gcc warning options. + + add -D_XOPEN_SOURCE=500 when configuring with --enable-widec, to + get mbstate_t declaration on HPUX 11.11 (report by David Ellement). + + add _nc_pathlast() to get rid of casts in _nc_basename() calls. + + correct a sign-extension in wadd_wch() and wecho_wchar() from + 20030628 (report by Tomohiro Kubota). + + work around omission of btowc() and wctob() from wide-character + support (sic) in NetBSD 1.6 using mbtowc() and wctomb() (report by + Gabor Z Papp). + + add portability note to curs_get_wstr.3x (Debian #199957). + +20030628 + + rewrite wadd_wch() and wecho_wchar() to call waddch() and wechochar() + respectively, to avoid calling waddch_noecho() with wide-character + data, since that function assumes its input is 8-bit data. + Similarly, modify waddnwstr() to call wadd_wch(). + + remove logic from waddnstr() which transformed multibyte character + strings into wide-characters. Rewrite of waddch_literal() from + 20030621 assumes its input is raw multibyte data rather than wide + characters (report by Tomohiro Kubota). + +20030621 + + write getyx() and related 2-return macros in terms of getcury(), + getcurx(), etc. + + modify waddch_literal() in case an application passes bytes of a + multibyte character directly to waddch(). In this case, waddch() + must reassemble the bytes into a wide-character (report by Tomohiro + Kubota ). + +20030614 + + modify waddch_literal() in case a multibyte value occupies more than + two cells. + + modify PutAttrChar() to compute the number of character cells that + are used in multibyte values. This fixes a problem displaying + double-width characters (report/test by Mitsuru Chinen + ). + + add a null-pointer check for result of keyname() in _tracechar() + + modify _tracechar() to work around glibc sprintf bug. + +20030607 + + add a call to setlocale() in cursesmain.cc, making demo display + properly in a UTF-8 locale. + + add a fallback definition in curses.priv.h for MB_LEN_MAX (prompted + by discussion with Gabor Z Papp). + + use macros NCURSES_ACS() and NCURSES_WACS() to hide cast needed to + appease -Wchar-subscript with g++ 3.3 (Debian #195732). + + fix a redefinition of $RANLIB in the configure script when libtool + is used, which broke configure on Mac OS X (report by Chris Zubrzycki + ). + + simplify ifdef for bool declaration in curses.h.in (suggested by + Albert Chin-A-Young). + + remove configure script check to allow -Wconversion for older + versions of gcc (suggested by Albert Chin-A-Young). + +20030531 + + regenerated html manpages. + + modify ifdef's in curses.h.in that disabled use of __attribute__() + for g++, since recent versions implement the cases which ncurses uses + (Debian #195230). + + modify _nc_get_token() to handle a case where an entry has no + description, and capabilities begin on the same line as the entry + name. + + fix a typo in ncurses_dll.h reported by gcc 3.3. + + add an entry for key_defined.3x to man_db.renames. + +20030524 + + modify setcchar() to allow converting control characters to complex + characters (report/test by Mitsuru Chinen ). + + add tkterm entry -TD + + modify parse_entry.c to allow a terminfo entry with a leading + 2-character name (report by Don Libes). + + corrected acsc in screen.teraterm, which requires a PC-style mapping. + + fix trace statements in read_entry.c to use lseek() rather than + tell(). + + fix signed/unsigned warnings from Sun's compiler (gcc should give + these warnings, but it is unpredictable). + + modify configure script to omit -Winline for gcc 3.3, since that + feature is broken. + + modify manlinks.sed to add a few functions that were overlooked since + they return function pointers: field_init, field_term, form_init, + form_term, item_init, item_term, menu_init and menu_term. + +20030517 + + prevent recursion in wgetch() via wgetnstr() if the connection cannot + be switched between cooked/raw modes because it is not a TTY (report + by Wolfgang Gutjahr ). + + change parameter of define_key() and key_defined() to const (prompted + by Debian #192860). + + add a check in test/configure for ncurses extensions, since there + are some older versions, etc., which would not compile with the + current test programs. + + corrected demo in test/ncurses.c of wgetn_wstr(), which did not + convert wchar_t string to multibyte form before printing it. + + corrections to lib_get_wstr.c: + + null-terminate buffer passed to setcchar(), which occasionally + failed. + + map special characters such as erase- and kill-characters into + key-codes so those will work as expected even if they are not + mentioned in the terminfo. + + modify PUTC() and Charable() macros to make wide-character line + drawing work for POSIX locale on Linux console (cf: 20021221). + +20030510 + + make typography for program options in manpages consistent (report + by Miloslav Trmac ). + + correct dependencies in Ada95/src/Makefile.in, so the builds with + "--srcdir" work (report by Warren L Dodge). + + correct missing definition of $(CC) in Ada95/gen/Makefile.in + (reported by Warren L Dodge ). + + fix typos and whitespace in manpages (patch by Jason McIntyre + ). + +20030503 + + fix form_driver() cases for REQ_CLR_EOF, REQ_CLR_EOL, REQ_DEL_CHAR, + REQ_DEL_PREV and REQ_NEW_LINE, which did not ensure the cursor was at + the editing position before making modifications. + + add test/demo_forms and associated test/edit_field.c demos. + + modify test/configure.in to use test/modules for the list of objects + to compile rather than using the list of programs. + +20030419 + + modify logic of acsc to use the original character if no mapping is + defined, noting that Solaris does this. + + modify ncurses 'b' test to avoid using the acs_map[] array since + 20021231 changes it to no longer contain information from the acsc + string. + + modify makefile rules in c++, progs, tack and test to ensure that + the compiler flags (e.g., $CFLAGS or $CCFLAGS) are used in the link + command (report by Jose Luis Rico Botella ). + + modify soft-key initialization to use A_REVERSE if A_STANDOUT would + not be shown when colors are used, i.e., if ncv#1 is set in the + terminfo as is done in "screen". + +20030412 + + add a test for slk_color(), in ncurses.c + + fix some issues reported by valgrind in the slk_set() and slk_wset() + code, from recent rewrite. + + modify ncurses 'E' test to use show previous label via slk_label(), + as in 'e' test. + + modify wide-character versions of NewChar(), NewChar2() macros to + ensure that the whole struct is initialized. + +20030405 + + modify setupterm() to check if the terminfo and terminal-modes have + already been read. This ensures that it does not reinvoke + def_prog_mode() when an application calls more than one function, + such as tgetent() and initscr() (report by Olaf Buddenhagen). + +20030329 + + add 'E' test to ncurses.c, to exercise slk_wset(). + + correct handling of carriage-return in wgetn_wstr(), used in demo of + slk_wset(). + + first draft of slk_wset() function. + +20030322 + + improved warnings in tic when suppressing items to fit in termcap's + 1023-byte limit. + + built a list in test/README showing which externals are being used + by either programs in the test-directory or via internal library + calls. + + adjust include-options in CF_ETIP_DEFINES to avoid missing + ncurses_dll.h, fixing special definitions that may be needed for + etip.h (reported by Greg Schafer ). + +20030315 + + minor fixes for cardfile.c, to make it write the updated fields to + a file when ^W is given. + + add/use _nc_trace_bufcat() to eliminate some fixed buffer limits in + trace code. + +20030308 + + correct a case in _nc_remove_string(), used by define_key(), to avoid + infinite loop if the given string happens to be a substring of other + strings which are assigned to keys (report by John McCutchan). + + add key_defined() function, to tell which keycode a string is bound + to (discussion with John McCutchan ). + + correct keybound(), which reported definitions in the wrong table, + i.e., the list of definitions which are disabled by keyok(). + + modify demo_keydef.c to show the details it changes, and to check + for errors. + +20030301 + + restructured test/configure script, make it work for libncursesw. + + add description of link_fieldtype() to manpage (report by + L Dee Holtsclaw ). + +20030222 + + corrected ifdef's relating to configure check for wchar_t, etc. + + if the output is a socket or other non-tty device, use 1 millisecond + for the cost in mvcur; previously it was 9 milliseconds because the + baudrate was not known. + + in _nc_get_tty_mode(), initialize the TTY buffer on error, since + glibc copies uninitialized data in that case, as noted by valgrind. + + modify tput to use the same parameter analysis as tparm() does, to + provide for user-defined strings, e.g., for xterm title, a + corresponding capability might be + title=\E]2;%p1%s^G, + + modify MKlib_gen.sh to avoid passing "#" tokens through the C + preprocessor. This works around Mac OS X's preprocessor, which + insists on adding a blank on each side of the token (report/analysis + by Kevin Murphy ). + +20030215 + + add configure check for wchar_t and wint_t types, rather than rely + on preprocessor definitions. Also work around for gcc fixinclude + bug which creates a shadow copy of curses.h if it sees these symbols + apparently typedef'd. + + if database is disabled, do not generate run_tic.sh + + minor fixes for memory-leak checking when termcap is read. + +20030208 + + add checking in tic for incomplete line-drawing character mapping. + + updated configure script to reflect fix for AC_PROG_GCC_TRADITIONAL, + which is broken in autoconf 2.5x for Mac OS X 10.2.3 (report by + Gerben Wierda ). + + make return value from _nc_printf_string() consistent. Before, + depending on whether --enable-safe-sprintf was used, it might not be + cached for reallocating. + +20030201 + + minor fixes for memory-leak checking in lib_tparm.c, hardscroll.c + + correct a potentially-uninitialized value if _read_termtype() does + not read as much data as expected (report by Wolfgang Rohdewald + ). + + correct several places where the aclocal.m4 macros relied on cache + variable names which were incompatible (as usual) between autoconf + 2.13 and 2.5x, causing the test for broken-linker to give incorrect + results (reports by Gerben Wierda and Thomas Esser + ). + + do not try to open gpm mouse driver if standard output is not a tty; + the gpm library does not make this check (bug report for dialog + by David Oliveira ). + +20030125 + + modified emx.src to correspond more closely to terminfo.src, added + emx-base to the latter -TD + + add configure option for FreeBSD sysmouse, --with-sysmouse, and + implement support for that in lib_mouse.c, lib_getch.c + +20030118 + + revert 20030105 change to can_clear_with(), does not work for the + case where the update is made on cells which are blanks with + attributes, e.g., reverse. + + improve ifdef's to guard against redefinition of wchar_t and wint_t + in curses.h (report by Urs Jansen). + +20030111 + + improve mvcur() by checking if it is safe to move when video + attributes are set (msgr), and if not, reset/restore attributes + within that function rather than doing it separately in the GoTo() + function in tty_update.c (suggested by Philippe Blain). + + add a message in run_tic.in to explain more clearly what does not + work when attempting to create a symbolic link for /usr/lib/terminfo + on OS/2 and other platforms with no symbolic links (report by John + Polterak). + + change several sed scripts to avoid using "\+" since it is not a BRE + (basic regular expression). One instance caused terminfo.5 to be + misformatted on FreeBSD (report by Kazuo Horikawa + (see FreeBSD docs/46709)). + + correct misspelled 'wint_t' in curs_get_wch.3x (Michael Elkins). + +20030105 + + improve description of terminfo operators, especially static/dynamic + variables (comments by Mark I Manning IV ). + + demonstrate use of FIELDTYPE by modifying test/ncurses 'r' test to + use the predefined TYPE_ALPHA field-type, and by defining a + specialized type for the middle initial/name. + + fix MKterminfo.sh, another workaround for POSIXLY_CORRECT misfeature + of sed 4.0 + > patch by Philippe Blain: + + optimize can_clear_with() a little by testing first if the parameter + is indeed a "blank". + + simplify ClrBottom() a little by allowing it to use clr_eos to clear + sections as small as one line. + + improve ClrToEOL() by checking if clr_eos is available before trying + to use it. + + use tputs() rather than putp() in a few cases in tty_update.c since + the corresponding delays are proportional to the number of lines + affected: repeat_char, clr_eos, change_scroll_region. + +20021231 + + rewrite of lib_acs.c conflicts with copying of SCREEN acs_map to/from + global acs_map[] array; removed the lines that did the copying. + +20021228 + + change some overlooked tputs() calls in scrolling code to use putp() + (report by Philippe Blain). + + modify lib_getch.c to avoid recursion via wgetnstr() when the input + is not a tty and consequently mode-changes do not work (report by + ). + + rewrote lib_acs.c to allow PutAttrChar() to decide how to render + alternate-characters, i.e., to work with Linux console and UTF-8 + locale. + + correct line/column reference in adjust_window(), needed to make + special windows such as curscr track properly when resizing (report + by Lucas Gonze ). + > patch by Philippe Blain: + + correct the value used for blank in ClrBottom() (broken in 20000708). + + correct an off-by-one in GoTo() parameter in _nc_scrolln(). + +20021221 + + change several tputs() calls in scrolling code to use putp(), to + enable padding which may be needed for some terminals (patch by + Philippe Blain). + + use '%' as sed substitute delimiter in run_tic script to avoid + problems with pathname delimiters such as ':' and '@' (report by John + Polterak). + + implement a workaround so that line-drawing works with screen's + crippled UTF-8 support (tested with 3.9.13). This only works with + the wide-character support (--enable-widec); the normal library will + simply suppress line-drawing when running in a UTF-8 locale in screen. + +20021214 + + allow BUILD_CC and related configure script variables to be + overridden from the environment. + + make build-tools variables in ncurses/Makefile.in consistent with + the configure script variables (report by Maciej W Rozycki). + + modify ncurses/modules to allow + configure --disable-leaks --disable-ext-funcs + to build (report by Gary Samuelson). + + fix a few places in configure.in which lacked quotes (report by + Gary Samuelson ). + + correct handling of multibyte characters in waddch_literal() which + force wrapping because they are started too late on the line (report + by Sam Varshavchik). + + small fix for CF_GNAT_VERSION to ignore the help-message which + gnatmake adds to its version-message. + > Maciej W Rozycki : + + use AC_CHECK_TOOL to get proper values for AR and LD for cross + compiling. + + use $cross_compiling variable in configure script rather than + comparing $host_alias and $target alias, since "host" is + traditionally misused in autoconf to refer to the target platform. + + change configure --help message to use "build" rather than "host" + when referring to the --with-build-XXX options. + +20021206 + + modify CF_GNAT_VERSION to print gnatmake's version, and to allow for + possible gnat versions such as 3.2 (report by Chris Lingard + ). + + modify #define's for CKILL and other default control characters in + tset to use the system's default values if they are defined. + + correct interchanged defaults for kill and interrupt characters + in tset, which caused it to report unnecessarily (Debian #171583). + + repair check for missing C++ compiler, which is broken in autoconf + 2.5x by hardcoding it to g++ (report by Martin Mokrejs). + + update config.guess, config.sub (2002-11-30) + + modify configure script to skip --with-shared, etc., when the + --with-libtool option is given, since they would be ignored anyway. + + fix to allow "configure --with-libtool --with-termlib" to build. + + modify configure script to show version number of libtool, to help + with bug reports. libtool still gets confused if the installed + ncurses libraries are old, since it ignores the -L options at some + point (tested with libtool 1.3.3 and 1.4.3). + + reorder configure script's updating of $CPPFLAGS and $CFLAGS to + prevent -I options in the user's environment from introducing + conflicts with the build -I options (may be related to reports by + Patrick Ash and George Goffe). + + rename test/define_key.c to test/demo_defkey.c, test/keyok.c to + test/demo_keyok.c to allow building these with libtool. + +20021123 + + add example program test/define_key.c for define_key(). + + add example program test/keyok.c for keyok(). + + add example program test/ins_wide.c for wins_wch() and wins_wstr(). + + modify wins_wch() and wins_wstr() to interpret tabs by using the + winsch() internal function. + + modify setcchar() to allow for wchar_t input strings that have + more than one spacing character. + +20021116 + + fix a boundary check in lib_insch.c (patch by Philippe Blain). + + change type for *printw functions from NCURSES_CONST to const + (prompted by comment by Pedro Palhoto Matos , + but really from a note on X/Open's website stating that either is + acceptable, and the latter will be used in a future revision). + + add xterm-1002, xterm-1003 terminfo entries to demonstrate changes in + lib_mouse.c (20021026) -TD + + add screen-bce, screen-s entries from screen 3.9.13 (report by + Adam Lazur ) -TD + + add mterm terminfo entries -TD + +20021109 + + split-out useful fragments in terminfo for vt100 and vt220 numeric + keypad, i.e., vt100+keypad, vt100+pfkeys, vt100+fnkeys and + vt220+keypad. The last as embedded in various entries had ka3 and + kb2 interchanged (report/discussion with Leonard den Ottolander + ). + + add check in tic for keypads consistent with vt100 layout. + + improve checks in tic for color capabilities + +20021102 + + check for missing/empty/illegal terminfo name in _nc_read_entry() + (report by Martin Mokrejs, where $TERM was set to an empty string). + + rewrote lib_insch.c, combining it with lib_insstr.c so both handle + tab and other control characters consistently (report by Philippe + Blain). + + remove an #undef for KEY_EVENT from curses.tail used in the + experimental NCURSES_WGETCH_EVENTS feature. The #undef confuses + dpkg's build script (Debian #165897). + + fix MKlib_gen.sh, working around the ironically named POSIXLY_CORRECT + feature of GNU sed 4.0 (reported by Ervin Nemeth ). + +20021026 + + implement logic in lib_mouse.c to handle position reports which are + generated when XFree86 xterm is initialized with private modes 1002 + or 1003. These are returned to the application as the + REPORT_MOUSE_POSITION mask, which was not implemented. Tested both + with ncurses 'a' menu (prompted by discussion with Larry Riedel + ). + + modify lib_mouse.c to look for "XM" terminfo string, which allows + one to override the escape sequence used to enable/disable mouse + mode. In particular this works for XFree86 xterm private modes + 1002 and 1003. If "XM" is missing (note that this is an extended + name), lib_mouse uses the conventional private mode 1000. + + correct NOT_LOCAL() macro in lib_mvcur.c to refer to screen_columns + where it used screen_lines (report by Philippe Blain). + + correct makefile rules for the case when both --with-libtool and + --with-gpm are given (report by Mr E_T ). + + add note to terminfo manpage regarding the differences between + setaf/setab and setf/setb capabilities (report by Pavel Roskin). + +20021019 + + remove redundant initialization of TABSIZE in newterm(), since it is + already done in setupterm() (report by Philippe Blain). + + add test/inserts.c, to test winnstr() and winsch(). + + replace 'sort' in dist.mk with script that sets locale to POSIX. + + update URLs in announce.html.in (patch by Frederic L W Meunier). + + remove glibc add-on files, which are no longer needed (report by + Frederic L W Meunier). + +20021012 5.3 release for upload to ftp.gnu.org + + modify ifdef's in etip.h.in to allow the etip.h header to compile + with gcc 3.2 (patch by Dimitar Zhekov ). + + add logic to setupterm() to make it like initscr() and newterm(), + by checking for $NCURSES_TRACE environment variable and enabling + the debug trace in that case. + + modify setupterm() to ensure that it initializes the baudrate, for + applications such as tput (report by Frank Henigman). + + modify definition of bits used for command-line and library debug + traces to avoid overlap, using new definition TRACE_SHIFT to relate + the two. + + document tput's interpretation of parameterized strings according to + whether parameters are given, etc. (discussion with Robert De Bath). + +20021005 pre-release + + correct winnwstr() to account for non-character cells generated when + a double-width character is added (report by Michael Bienia + ). + + modify _nc_viswbuf2n() to provide better results using wctomb(). + + correct logic in _nc_varargs() which broke tracing of parameters for + formats such as "%.*s". + + correct scale factor in linux-c and linux-c-nc terminfo entries + (report Floyd Davidson). + + change tic -A option to -t, add the same option to infocmp for + consistency. + + correct "%c" implementation in lib_tparm.c, which did not map a null + character to a 128 (cf: 980620) (patch by Frank Henigman + ). + +20020928 pre-release + + modify MKkey_defs.sh to check for POSIX sort -k option, use that if + it is found, to accommodate newer utility which dropped the + compatibility support for +number options (reported by Andrey A + Chernov). + + modify linux terminfo entry to use color palette feature from + linux-c-nc entry (comments by Tomasz Wasiak and Floyd Davidson). + + restore original color definitions in endwin() if init_color() was + used, and resume those colors on the next doupdate() or refresh() + (report by Tomasz Wasiak ). + + improve debug-traces by modifying MKlib_gen.sh to generate calls + to returnBool() and returnAttr(). + + add/use _nc_visbufn() and _nc_viswbufn() to limit the debug trace + of waddnstr() and similar functions to match the parameters as used. + + add/use _nc_retrace_bool() and _nc_retrace_unsigned(). + + correct type used by _nc_retrace_chtype(). + + add debug traces to some functions in lib_mouse.c + + modify lib_addch.c to handle non-spacing characters. + + correct parameter of RemAttr() in lib_bkgd.c, which caused the c++ + demo's boxes to lose the A_ALTCHARSET flag (broken in 20020629). + + correct width computed in _tracedump(), which did not account for + the attributes (broken in 20010602). + + modify test/tracemunch to replace addresses for windows other than + curscr, newscr and stdscr with window0, window1, etc. + +20020921 pre-release + + redid fix for edit_man.sed path. + + workaround for Cygwin bug which makes subprocess writes to stdout + result in core dump. + + documented getbegx(), etc. + + minor fixes to configure script to use '%' consistently as a sed + delimiter rather than '@'. + > patch by Philippe Blain: + + add check in lib_overlay.c to ensure that the windows to be merged + actually overlap, and in copywin(), limit the area to be touched + to the lines given for the destination window. + +20020914 pre-release + + modified curses.h so that if the wide-character version is installed + overwriting /usr/include/curses.h, and if it relied on libutf8.h, + then applications that use that header for wide-character support + must define HAVE_LIBUTF8_H. + + modify putwin(), getwin() and dupwin() to allow them to operate on + pads (request by Philippe Blain). + + correct attribute-merging in wborder(), broken in 20020216 (report + by Tomasz Wasiak ). + > patch by Philippe Blain: + + corrected pop-counts in tparam_internal() to '!' and '~' cases. + + use sizeof(NCURSES_CH_T) in one place that used sizeof(chtype). + + remove some unused variables from mvcur test-driver. + +20020907 pre-release + + change configure script to allow install of widec-character + (ncursesw) headers to overwrite normal (ncurses) headers, since the + latter is a compatible subset of the former. + + fix path of edit_man.sed in configure script, needed to regenerate + html manpages on Debian. + + fix mismatched enums in vsscanf.c, which caused warning on Solaris. + + update README.emx to reflect current patch used for autoconf. + + change web- and ftp-site to invisible-island.net + > patch by Philippe Blain: + + change case for 'P' in tparam_internal() to indicate that it pops + a variable from the stack. + + correct sense of precision and width in parse_format(), to avoid + confusion. + + modify lib_tparm.c, absorb really_get_space() into get_space(). + + modify getwin() and dupwin() to copy the _notimeout, _idlok and + _idcok window fields. + + better fix for _nc_set_type(), using typeMalloc(). + +20020901 pre-release + + change minor version to 3, i.e., ncurses 5.3 + + update config.guess, config.sub + + retest build with each configure option; minor ifdef fixes. + + make keyname() return a null pointer rather than "UNKNOWN STRING" to + match XSI. + + modify handling of wide line-drawing character functions to use the + normal line-drawing characters when not in UTF-8 locale. + + add check/fix to comp_parse.c to suppress warning about missing acsc + string. This happens in configurations where raw termcap information + is processed; tic already does this and other checks. + + modify tic's check for ich/ich1 versus rmir/smir to only warn about + ich1, to match xterm patch #70 notes. + + moved information for ripped-off lines into SCREEN struct to allow + use in resizeterm(). + + add experimental wgetch_events(), ifdef'd with NCURSES_WGETCH_EVENTS + (adapted from patch by Ilya Zakharevich - see ncurses/README.IZ). + + amend check in kgetch() from 20020824 to look only for function-keys, + otherwise escape sequences are not resolved properly. + > patch by Philippe Blain: + + removed redundant assignment to SP->_checkfd from newterm(). + + check return-value of setupterm() in restartterm(). + + use sizeof(NCURSES_CH_T) in a few places that used sizeof(chtype). + + prevent dupwin() from duplicating a pad. + + prevent putwin() from writing a pad. + + use typeRealloc() or typeMalloc() in preference to direct calls on + _nc_doalloc(). + +20020824 + + add a check in kgetch() for cooked characters in the fifo to avoid + calling fifo_push() when a KEY_RESIZE is available (report/analysis + by Sam Varshavchik ). + + fix an overlooked case for Redhat #68199 (Philippe Blain). + + ensure clearerr() is called before using ferror() e.g., in + lib_screen.c (report by Philippe Blain). + +20020817 + + modify lib_screen.c and lib_newwin.c to maintain the SCREEN-specific + pointers for curscr/stdscr/newscr when scr_save() and scr_restore() + modify the global curscr/stdscr/newscr variables. Fixes Redhat + #68199. + + add checks for null pointer in calls to tparm() and tgoto() based on + FreeBSD bug report. If ncurses were built with termcap support, and + the first call to tgoto() were a zero-length string, the result would + be a null pointer, which was not handled properly. + + correct a typo in terminfo.head, which gave the octal code for colon + rather than comma. + + remove the "tic -u" option from 20020810, since it did not account + for nested "tc=" clauses, and when that was addressed, was still + unsatisfactory. + +20020810 + + add tic -A option to suppress capabilities which are commented out + when translating to termcap. + + add tic -u option to provide older behavior of "tc=" clauses. + + modified tic to expand all but the final "tc=" clause in a termcap + entry, to accommodate termcap libraries which do not handle multiple + tc clauses. + + correct typo in curs_inopts.3x regarding CS8/CS7 usage (report by + Philippe Blain). + + remove a couple of redundant uses of A_ATTRIBUTES in expressions + using AttrOf(), which already incorporates that mask (report by + Philippe Blain). + + document TABSIZE variable. + + add NCURSES_ASSUMED_COLORS environment variable, to allow users to + override compiled-in default black-on-white assumption used in + assume_default_colors(). + + correct an off-by-one comparison against max_colors in COLORFGBG + logic. + + correct a use of uninitialized memory found by valgrind (reported by + Olaf Buddenhagen ). + + modified wresize() to ensure that a failed realloc will not corrupt + the window structure, and to make subwindows fit within the resized + window (completes Debian #87678, Debian #101699) + +20020803 + + fix an off-by-one in lib_pad.c check for limits of pad (patch by + Philippe Blain). + + revise logic for BeOS in lib_twait.c altered in 20011013 to restore + logic used by lib_getch.c's support for GPM or EMX mouse (report by + Philippe Blain) + + remove NCURSES_CONST from several prototypes in curses.wide, to make + the --enable-const --enable-widec configure options to work together + (report by George Goffe ). + +20020727 + + finish no-leak checking in cardfile.c, using this for testing changes + to resizeterm(). + + simplify _nc_freeall() using delscreen(). + +20020720 + + check error-return from _nc_set_tty_mode() in _nc_initscr() and + reset_prog_mode() (report/patch by Philippe Blain). + + regenerate configure using patch for autoconf 2.52, to address + problem with identifying C++ bool type. + + correct/improve logic to produce an exit status for errors in tput, + which did not exit with an error when told to put a string not in the + current terminfo entry (report by David Gomez ). + + modify configure script AC_OUTPUT() call to work around defect in + autoconf 2.52 which adds an ifdef'd include to the generated + configure definitions. + + remove fstat() check from scr_init(), which also fixes a missing + include for from 20020713 (reported by David Ellement, + fix suggested by Philippe Blain). + + update curs_scanw.3x manpage to note that XSI curses differs from + SVr4 curses: return-values are incompatible. + + correct several prototypes in manpages which used const + inconsistently with the curses.h file, and removed spurious const's + in a few places from curses.h, e.g., for wbkgd() (report by Glenn + Maynard ). + + change internal type used by tparm() to long, to work with LP64 model. + + modify nc_alloc.h to allow building with g++, for testing. + +20020713 + + add resize-handling to cardfile.c test program. + + altered resizeterm() to avoid having it fail when a child window + cannot be resized because it would be larger than its parent. (More + work must be done on this, but it works well enough to integrate). + + improve a limit-check in lib_refresh.c + + remove check in lib_screen.c relating dumptime to file's modification + times, since that would not necessarily work for remotely mounted + filesystems. + + modify lrtest to simplify debugging changes to resizeterm, e.g., + t/T commands to enable/disable tracing. + + updated status of multibyte support in TO-DO. + + update contact info in source-files (patch by Juergen Pfeifer). + +20020706 + + add Caps.hpux11, as an example. + + modify version_filter(), used to implement -R option for tic and + infocmp, to use computed array offsets based on the Caps.* file which + is actually configured, rather than constants which correspond to + the Caps file. + + reorganized lib_raw.c to avoid updating SP and cur_term state if the + functions fail (reported by Philippe Blain). + + add -Wundef to gcc warnings, adjust a few ifdef's to accommodate gcc. + +20020629 + + correct parameters to setcchar() in ncurses.c (cf: 20020406). + + set locale in most test programs (view.c and ncurses.c were the + only ones). + + add configure option --with-build-cppflags (report by Maksim A + Nikulin ). + + correct a typo in wide-character logic for lib_bkgnd.c (Philippe + Blain). + + modify lib_wacs.c to not cancel the acsc, smacs, rmacs strings when + in UTF-8 locale. Wide-character functions use Unicode values, while + narrow-character functions use the terminfo data. + + fix a couple of places in Ada95/samples which did not compile with + gnat 3.14 + + modify mkinstalldirs so the DOS-pathname case is locale-independent. + + fix locale problem in MKlib_gen.sh by forcing related variables to + POSIX (C), using same approach as autoconf (set variables only if + they were set before). Update MKterminfo.sh and MKtermsort.sh to + match. + +20020622 + + add charset to generated html. + + add mvterm entry, adapted from a FreeBSD bug-report by Daniel Rudy + -TD + + add rxvt-16color, ibm+16color entries -TD + + modify check in --disable-overwrite option so that it is used by + default unless the --prefix/$prefix value is not /usr, in attempt to + work around packagers, e.g., for Sun's freeware, who do not read the + INSTALL notes. + +20020615 + + modify wgetch() to allow returning ungetch'd KEY_RESIZE as a function + key code in get_wch(). + + extended resize-handling in test/ncurses 'a' menu to the entire + stack of windows created with 'w' commands. + + improve $COLORFGBG feature by interpreting an out-of-range color + value as an SGR 39 or 49, for foreground/background respectively. + + correct a typo in configure --enable-colorfgbg option, and move it + to the experimental section (cf: 20011208). + +20020601 + + add logic to dump_entry.c to remove function-key definitions that do + not fit into the 1023-byte limit for generated termcaps. This makes + hds200 fit. + + more improvements to tic's warnings, including logic to ignore + differences between delay values in sgr strings. + + move definition of KEY_RESIZE into MKkeydefs.sh script, to + accommodate Caps.osf1r5 which introduced a conflicting definition. + +20020525 + + add simple resize-handling in test/ncurses.c 'a' menu. + + fixes in keyname() and _tracechar() to handle negative values. + + make tic's warnings about mismatches in sgr strings easier to follow. + + correct tic checks for number of parameters in smgbp and smglp. + + improve scoansi terminfo entry, and add scoansi-new entry -TD + + add pcvt25-color terminfo entry -TD + + add kf13-kf48 strings to cons25w terminfo entry (reported by Stephen + Hurd in newsgroup lucky.freebsd.bugs) -TD + + add entrypoint _nc_trace_ttymode(), use this to distinguish the + Ottyb and Nttyb members of terminal (aka cur_term), for tracing. + +20020523 + + correct and simplify logic for lib_pad.c change in 20020518 (reported + by Mike Castle). + +20020518 + + fix lib_pad.c for case of drawing a double-width character which + falls off the left margin of the pad (patch by Kriang Lerdsuwanakij + ) + + modify configure script to work around broken gcc 3.1 "--version" + option, which adds unnecessary trash to the requested information. + + adjust ifdef's in case SIGWINCH is not defined, e.g., with DJGPP + (reported by Ben Decker ). + +20020511 + + implement vid_puts(), vid_attr(), term_attrs() based on the narrow- + character versions as well. + + implement erasewchar(), killwchar() based on erasechar() and + killchar(). + + modify erasechar() and killchar() to return ERR if the value was + VDISABLE. + + correct a bug in wresize() in handling subwindows (based on patch by + Roger Gammans , report by Scott Beck + ). + + improve test/tclock.c by making the second-hand update more often + if gettimeofday() is available. + +20020429 + + workaround for Solaris sed with MKlib_gen.sh (reported by Andy + Tsouladze ). + +20020427 + + correct return-value from getcchar(), making it consistent with + Solaris and Tru64. + + reorder loops that generate makefile rules for different models vs + subsets so configure --with-termlib works again. This was broken by + logic added to avoid duplicate rules in changes to accommodate cygwin + dll's (reported by George.R.Goffe@seagate.com). + + update config.guess, config.sub + +20020421 + + modify ifdef's in write_entry.c to allow use of symbolic links on + platforms with no hard links, e.g., BeOS. + + modify a few includes to allow compile with BeOS, which has stdbool.h + with a conflicting definition for 'bool' versus its OS.h definition. + + amend MKlib_gen.sh to work with gawk, which defines 'func' as an + alias for 'function'. + +20020420 + + correct form of prototype for ripoffline(). + + modify MKlib_gen.sh to test that all functions marked as implemented + can be linked. + +20020413 + + add manpages: curs_get_wstr.3x, curs_in_wchstr.3x + + implement wgetn_wstr(). + + implement win_wchnstr(). + + remove redefinition of unget_wch() in lib_gen.c (reported by + Jungshik Shin ). + +20020406 + + modified several of the test programs to allow them to compile with + vendor curses implementations, e.g., Solaris, AIX -TD + +20020323 + + modified test/configure to allow configuring against ncursesw. + + change WACS_xxx definition to use address, to work like Tru64 curses. + +20020317 + + add 'e' and 'm' toggles to 'a', 'A' tests in ncurses.c to demonstrate + effect of echo/noecho and meta modes. + + add 'A' test to ncurses.c to demonstrate wget_wch() and related + functions. + + add manpage: curs_get_wch.3x + + implement unget_wch(). + + implement wget_wch(). + +20020310 + + regenerated html manpages. + + add manpages: curs_in_wch.3x, curs_ins_wch.3x, curs_ins_wstr.3x + + implement wins_wch(). + + implement win_wch(). + + implement wins_nwstr(), wins_wstr(). + +20020309 + + add manpages: curs_addwstr.3x, curs_winwstr.3x + + implement winnwstr(), winwstr(). + +20020223 + + add manpages: curs_add_wchstr.3x, curs_bkgrnd.3x + + document wunctrl, key_name. + + implement key_name(). + + remove const's in lib_box.c incorrectly leftover after splitting off + lib_box_set.c + + update llib-lncurses, llib-ncursesw, fix configure script related to + these. + +20020218 + + remove quotes on "SYNOPSIS" in man/curs_box_set.3x, which resulted + in spurious symlinks on install. + +20020216 + + implement whline_set(), wvline_set(), add manpage curs_border_set. + + add subtest 'b' to 'F' and 'f' in ncurses.c to demonstrate use of + box() and box_set() functions. + + add subtest 'u' to 'F' in ncurses.c, to demonstrate use of addstr() + given UTF-8 string equivalents of WACS_xxx symbols. + + minor fixes to several manpages based on groff -ww output. + + add descriptions of external variables of termcap interface to + the manpage (report by Bruce Evans ). + > patches by Bernhard Rosenkraenzer: + + correct configure option --with-bool, which was executed as + --with-ospeed. + + add quotes for parameters of --with-bool and --with-ospeed configure + options. + > patch by Sven Verdoolaege (report by Gerhard Haering + ): + + correct typos in definitions of several wide-character macros: + waddwstr, wgetbkgrnd, mvaddwstr, mvwadd_wchnstr, mvwadd_wchnstr, + mvwaddwstr. + + pass $(CPPFLAGS) to MKlib_gen.sh, thereby fixing a missing definition + of _XOPEN_SOURCE_EXTENDED, e.g., on Solaris + +20020209 + + implement wide-acs characters for UTF-8 locales. When in UTF-8 + locale, ignore narrow version of acs. Add 'F' test to test/ncurses.c + to demonstrate. + + correct prototype in keybound manpage (noted from a Debian mailing + list item). + +20020202 + + add several cases to the wscanw() example in testcurs.c, showing the + format. + + implement a simple vsscanf() fallback function which uses the %n + conversion to help parse the input data (prompted by discussion with + Albert Chin-A-Young). + + modify mk-1st.awk and test/Makefile.in to add $(LDFLAGS) when making + shared libraries, and to use $(CFLAGS) when linking test programs + (patch by Albert Chin-A-Young). + + add a call to _nc_keypad() in keypad() to accommodate applications + such as nvi, which use curses for output but not for input (fixes + Debian #131263, cf: 20011215). + + add entrypoints to resizeterm.c which provide better control over the + process: is_term_resized() and resize_term(). The latter restores + the original design of resizeterm() before KEY_RESIZE was added in + 970906. Do this to accommodate 20010922 changes to view.c, but allow + for programs with their own sigwinch handler, such as lynx (reported + by Russell Ruby ). + +20020127 + + fix a typo in change to mk-1st.awk, which broke the shared-library + makefile rules (reported by Martin Mokrejs). + +20020126 + + update config.guess, config.sub + + finish changes needed to build dll's on cygwin. + + fix a typo in mvwchat() macro (reported by Cy ). + + add configure check for mbstate_t, needed for wide-character + configuration. On some platforms we must include to + define this (reported by Daniel Jacobowitz). + + incorporate some of the changes needed to build dll's on cygwin. + +20020112a + + workaround for awk did not work with mawk, adjusted shell script. + +20020112 + + add Caps.osf1r5, as an example. + + modify behavior of can_clear_with() so that if an application is + running in a non-bce terminals with default colors enabled, it + returns true, allowing the user to select/paste text without picking + up extraneous trailing blanks (adapted from patch by Daniel + Jacobowitz ). + + modify generated curses.h to ifdef-out prototypes for extensions if + they are disabled, and to define curses_version() as a string in that + case. This is needed to make the programs such as tic build in that + configuration. + + modified generated headers.sh to remove a gzip'd version of the + target file if it exists, in case non-gzip'd manpages are installed + into a directory where gzip'd ones exist. In that case, the latter + would be found. + + corrected a redundant initialization of signal handlers from 20010922 + changes. + + clarified bug-reporting address in terminfo.src (report by John H + DuBois III ). + > several fixes from Robert Joop: + + do not use "-v" option of awk in MKkey_defs.sh because it does not + work with SunOS nawk. + + modify definitions for libutf8 in curses.h to avoid redefinition + warnings for mblen + + quoted references to compiler in shell command in misc/Makefile, in + case it uses multiple tokens. + +20011229 + + restore special case from 20010922 changes to omit SA_RESTART when + setting up SIGWINCH handler, which is needed to allow wgetch() to be + interrupted by that signal. + + updated configure macro CF_WITH_PATHLIST, to omit some double quotes + not needed with autoconf 2.52 + + revert configure script to autoconf 2.13 patched with + autoconf-2.13-19990117.patch.gz (or later) + from + ftp://invisible-island.net/autoconf/ + because autoconf 2.52 macro AC_PROG_AWK does not work on HPUX 11.0 + (report by David Ellement ). This also fixes a + different problem configuring with Mac OS X (reported by Marc Smith + ). + +20011222 + + modify include/edit_cfg.h to eliminate BROKEN_LINKER symbol from + term.h + + move prototype for _nc_vsscanf() into curses.h.in to omit + HAVE_VSSCANF symbol from curses.h, which was dependent upon the + ncurses_cfg.h file which is not installed. + + use ACS_LEN rather than SIZEOF(acs_map) in trace code of lib_acs.c, + to work with broken linker configuration, e.g., cygwin (report by + Robert Joop ). + + make napms() call _nc_timed_wait() rather than poll() or select(), + to work around broken implementations of these on cygwin. + +20011218 + + drop configure macro CF_WIDEC_SHIFT, since that was rendered obsolete + by Sven Verdoolaege's rewrite of wide-character support. This makes + libncursesw incompatible again, but makes the header files almost the + same as in the narrow-character configuration. + + simplify definitions that combine wide/narrow versions of bkgd, etc., + to eliminate differences between the wide/narrow versions of curses.h + + correct typo in configure macro CF_FUNC_VSSCANF + + correct location of call to _nc_keypad() from 20011215 changes which + prevented keypad() from being disabled (reported by Lars Hecking). + +20011215 + + rewrote ncurses 'a' test to exercise wgetch() and keypad() functions + better, e.g., by adding a 'w' command to create new windows which + may have different keypad() settings. + + corrected logic of keypad() by adding internal screen state to track + whether the terminal's keypad-mode has been set. Use this in + wgetch() to update the keypad-mode according to whether the + associated window's keypad-mode has been set with keypad(). This + corrects a related problem restoring terminal state after handling + SIGTSTP (reported by Mike Castle). + + regenerate configure using patch for autoconf 2.52 + autoconf-2.52-patch.gz + at + ftp://invisible-island.net/autoconf/ + + update config.guess, config.sub from + http://subversions.gnu.org/cgi-bin/viewcvs/config/config/ + + minor changes to quoting in configure script to allow it to work + with autoconf 2.52 + +20011208 + + modify final checks in lib_setup.c for line and col values, making + them independent. + + modify acs_map[] if configure --broken-linker is specified, to make + it use a function rather than an array (prompted by an incorrect + implementation in cygwin package). + + correct spelling of configure option --enable-colorfgbg, which + happened to work if --with-develop was set (noted in cygwin package + for ncurses). + + modify ifdef for genericerror() to compile with SUNWspro Sun WorkShop + 6 update 1 C++ 5.2 (patch by Sullivan N Beck ). + + add configure checks to see if ncurses' fallback vsscanf() will + compile either of the special cases for FILE structs, and if not, + force it to the case which simply returns an error (report by + Sullivan N Beck indicates that Solaris 8 with + 64-bits does not allow access to FILE's fields). + + modify ifdef's for c++/cursesw.cc to use the fallback vsscanf() in + the ncurses library if no better substitute for this can be found + in the C++ runtime. + + modify the build to name dynamic libraries according to the + convention used on OS X and Darwin. Rather than something like + libncurses.dylib.5.2, Darwin would name it libncurses. 5.dylib. + There are a few additional minor fixes, such as setting the library + version and compatibility version numbers (patch by Jason Evans + ). + + use 'sh' to run mkinstalldirs, to work around problems with buggy + versions of 'make' on OS/2 (report by John Polterak ). + + correct typo in manpage description of curs_set() (Debian #121548). + + replace the configure script existence-check for mkstemp() by one + that checks if the function works, needed for older glibc and + AmigaOS. + +20011201 + + modify script that generates fallbacks.c to compile a temporary + copy of the terminfo source in case the host does not contain all of + the entries requested for fallbacks (request by Greg Roelofs). + + modify configure script to accommodate systems such as Mac OS X whose + header defines a 'bool' type inconsistent with ncurses, + which normally makes 'bool' consistent with C++. Include + from curses.h to force consistent usage, define a new type + NCURSES_BOOL and related that to the exported 'bool' as either a + typedef or definition, according to whether is present + (based on a bug report for tin 1.5.9 by Aaron Adams ). + +20011124 + + added/updated terminfo entries for M$ telnet and KDE konsole -TD + +20011117 + + updated/expanded Apple_Terminal and Darwin PowerPC terminfo entries + (Benjamin C W Sittler). + + add putty terminfo entry -TD + + if configuring for wide-curses, define _XOPEN_SOURCE_EXTENDED, since + this may not otherwise be defined to make test/view.c compile. + +20011110 + + review/correct several missing/generated items in curses.wide, sorted + the lists to make subsequent diff's easier to track. + +20011103 + + add manual pages for add_wch(), echo_wchar(), getcchar(), + mvadd_wch(), mvwadd_wch(), setcchar(), wadd_wch() and wecho_wchar(). + + implement wecho_wchar() + + modify _tracedump() to handle wide-characters by mapping them to '?' + and control-characters to '.', to make the trace file readable. Also + dynamically allocate the buffer used by _tracedump() for formatting + the results. + + modify T_CALLED/T_RETURN macros to ease balancing call/return lines + in a trace by using curly braces. + + implement _nc_viscbuf(), for tracing cchar_t arrays. + + correct trace-calls in setcchar() and getcchar() functions, which + traced the return values but not the entry to each function. + + correct usage message in test/view.c, which still mentioned -u flag. + +20011027 + + modify configure script to allow building with termcap only, or with + fallbacks only. In this case, we do not build tic and toe. + + add configure --with-termpath option, to override default TERMPATH + value of /etc/termcap:/usr/share/misc/termcap. + + cosmetic change to tack: make menu descriptions agree with menu + titles. + +20011020 + + rewrote limit-checks in wscrl() and associated _nc_scroll_window(), + to ensure that if the parameter of wscrl() is larger than the size of + the scrolling region, then the scrolling region will be cleared + (report by Ben Kohlen ). + + add trace/varargs.c, using this to trace parameters in lib_printw.c + + implement _tracecchar_t2() and _tracecchar_t(). + + split-out trace/visbuf.c + + correct typo in lib_printw.c changes from 20010922 (report by Mike + Castle). + +20011013 + + modify run_tic.sh to check if the build is a cross-compile. In that + case, do not use the build's tic to install the terminfo database + (report by Rafael Rodriguez Velilla ). + + modify mouse click resolution so that mouseinterval(-1) will disable + it, e.g., to handle touchscreens via a slow connection (request by + Byron Stanoszek ). + + correct mouseinterval() default value shown in curs_mouse.3x + + remove conflicting definition of mouse_trafo() (reported by Lars + Hecking, using gcc 2.95.3). + +20011001 + + simpler fix for signal_name(), to replace the one overlooked in + 20010929 (reported by Larry Virden). + +20010929 + + add -i option to view.c, to test ncurses' check for non-default + signal handler for SIGINT, etc. + + add cases for shared-libraries on Darwin/OS X (patch by Rob Braun + ). + + modify tset to restore original I/O modes if an error is encountered. + Also modify to use buffered stderr consistently rather than mixing + with write(). + + change signal_name() function to use if-then-else rather than case + statement, since signal-values aren't really integers (reported by + Larry Virden). + + add limit checks in wredrawln(), fixing a problem where lynx was + repainting a pad which was much larger than the screen. + +20010922 + + fix: PutRange() was counting the second part of a wide character as + part of a run, resulting in a cursor position that was one too far + (patch by Sven Verdoolaege). + + modify resizeterm() to not queue a KEY_RESIZE if there was no + SIGWINCH, thereby separating the two styles of SIGWINCH handling + in test/view.c + + simplified lib_tstp.c, modify it to use SA_RESTART flag for SIGWINCH. + + eliminate several static buffers in the terminfo compiler, using + allocated buffers. + + modify MKkeyname.awk so that keyname() does not store its result into + a static buffer that is overwritten by the next call. + + reorganize the output of infocmp -E and -e options to compile cleanly + with gcc -Wwrite-strings warnings. + + remove redefinition of chgat/wchgat/mvwchgat from curses.wide + +20010915 + + add label to test/view.c, showing the name of the last key or signal + that made the screen repaint, to make it clearer when a sigwinch + does this. + + use ExitProgram() consistently in the test-programs to make it + simpler to test leaks with dmalloc, etc. + + move hashtab static data out of hashmap.c into SCREEN struct. + + make NO_LEAK code compile with revised WINDOWLIST structs. + +20010908 + + modify tgetent() to check if exit_attribute_mode resets the alternate + character set, and if so, attempt to adjust the copy of the termcap + "me" string which it will return to eliminate that part. In + particular, 'screen' would lose track of line-drawing characters + (report by Frederic L W Meunier <0@pervalidus.net>, analysis by + Michael Schroeder). + +20010901 + + specify DOCTYPE in html manpages. + + add missing macros for several "generated" functions: attr_get(), + attr_off(), attr_on(), attr_set(), chgat(), mvchgat(), mvwchgat() and + mouse_trafo(). + + modify view.c to agree with non-experimental status of ncurses' + sigwinch handler: + + change the sense of the -r option, making it default to ncurses' + sigwinch handler. + + add a note explaining what functions are unsafe in a signal + handler. + + add a -c option, to set color display, for testing. + + unset $data variable in MKterminfo.sh script, to address potential + infinite loop if shell malfunction (report by Samuel Mikes + , for bash 2.05.0 on a Linux 2.0.36 system). + + change kbs in mach terminfo entries to ^? (Marcus Brinkmann + ). + + correct logic for COLORFGBG environment variable: if rxvt is compiled + with xpm support, the variable has three fields, making it slightly + incompatible with itself. In either case, the background color is + the last field. + +20010825 + + move calls to def_shell_mode() and def_prog_mode() before loop with + callbacks in lib_set_term.c, since the c++ demo otherwise initialized + the tty modes before saving them (patch by John David Anglin + ). + + duplicate logic used to initialize trace in newterm(), in initscr() + to avoid confusing trace of initscr(). + + simplify allocation of WINDOW and WINDOWLIST structs by making the + first a part of the second rather than storing a pointer. This saves + a call to malloc for each window (discussion with Philippe Blain). + + remove unused variable 'used_ncv' from lib_vidattr.c (Philippe + Blain). + + modify c++/Makefile.in to accommodate archive programs that are + different for C++ than for C, and add cases for vendor's C++ + compilers on Solaris and IRIX (report by Albert Chin-A-Young). + + correct manpage description of criteria for deciding if the terminal + supports xterm mouse controls. + + add several configure script options to aid with cross-compiling: + --with-build-cc, --with-build-cflags, --with-build-ldflags, and + --with-build-libs (request by Greg Roelofs). + + change criteria for deciding if configure is cross-compiling from + host/build mismatch to host/target mismatch (request by Greg Roelofs + ). + + correct logic for infocmp -e and -E options which writes the data for + the ext_Names[] array. This is needed if one constructs a fallback + table for a terminfo entry which uses extended termcap names, e.g., + AX in a color xterm. + + fix undefined NCURSES_PATHSEP when configure --disable-database + option is given. + +20010811 + + fix for VALID_BOOLEAN() macro when char is not signed. + + modify 'clean' rule for C++ binding to work with Sun compiler, which + caches additional information in a subdirectory of the objects. + + added llib-ncursesw. + +20010804 + + add Caps.keys example for experimental extended function keys + (adapted from a patch by Ilya Zakharevich). + + correct parameter types of vidputs() and vidattr() to agree with + header files (report by William P Setzer). + + fix typos in several man-pages (patch by William P Setzer). + + remove unneeded ifdef for __GNUG__ in CF_CPP_VSCAN_FUNC configure + macro, which made ncurses C++ binding fail to build with other + C++ compilers such as HPUX 11.x (report by Albert Chin-A-Young). + + workaround for bug in HPUX 11.x C compiler: add a blank after + NCURSES_EXPORT macro in form.h (report by Albert Chin-A-Young) + + ignore blank lines in Caps* files in MKkey_defs.sh script (report by + Albert Chin-A-Young). + + correct definition of key_end in Caps.aix4, which left KEY_END + undefined (report by Albert Chin-A-Young). + + remove a QNX-specific fallback prototype for vsscanf(), which is + obsolete with QNX RTP. + + review/fix some of the T() and TR() macro calls, having noticed that + there was no data for delwin() in a trace of dialog because there was + no returnVoid call for wtimeout(). Also, traces in lib_twait.c are + now selected under TRACE_IEVENT rather than TRACE_CALLS. + +20010728 + + add a _nc_access() check before opening files listed via $TERMPATH. + + using modified man2html, regenerate some of the html manpages to fix + broken HREF's where the link was hyphenated. + +20010721 + + add some limit/pointer checks to -S option of tputs. + + updated/expanded Apple_Terminal and Darwin PowerPC terminfo entries + (Benjamin C W Sittler). + + add a note in curs_termcap.3x regarding a defect in the XSI + description of tgetent (based on a discussion with Urs Jansen + regarding the HPUX 11.x implementation, whose termcap interface is + not compatible with existing termcap programs). + + modify manhtml rule in dist.mk to preserve copyright notice on the + generated files, as well as to address HTML style issues reported by + tidy and weblint. Regenerated/updated corresponding html files. + + comment out use of Protected_Character and related rarely used + attributes in ncurses Ada95 test/demo to compile with wide-character + configuration. + +20010714 + + implement a simple example in C++ demo to test scanw(). + + corrected stdio function used to implement scanw() in cursesw.cc + + correct definition of RemAttr() macro from 20010602 changes, which + caused C++ SillyDemo to not show line-drawing characters. + + modify C++ binding, adding getKey() which can be overridden by user + to substitute functions other than getch() for keyboard processing + of forms and menus (patch by Juergen Pfeifer). + +20010707 + + fix some of the trace calls which needed modification to work with + new wide-character structures. + + modify magic-cookie code in tty_update.c to compile with new + wide-character structures (report by ). + + ensure that _XOPEN_SOURCE_EXTENDED is defined in curses.priv.h if + compiling for wide-character configuration. + + make addnwstr() handle non-spacing characters (patch by Sven + Verdoolaege). + +20010630 + + add configure check to define _GNU_SOURCE, needed to prop up glibc + header files. + + split-out include/curses.wide to solve spurious redefinitions caused + by defining _GNU_SOURCE, and move includes for before + to work around misdefinition of ERR in glibc 2.1.3 header + file. + + extended ospeed change to NetBSD and OpenBSD -TD + + modify logic in lib_baudrate.c for ospeed, for FreeBSD to make it + work properly for termcap applications (patch by Andrey A Chernov). + +20010623 + + correct an overlooked CharOf/UChar instance (reports by Eugene Lee + , Sven Verdoolaege). + + correct unneeded ifdef for wunctrl() (reported by Sven Verdoolaege) + +20010618 + + change overlooked several CharOf/UChar instances. + > several patches from Sven Verdoolaege: + + correct a typo in wunctrl(), which made it appear that botwc() was + needed (no such function: use btowc()). + + reimplement wide-character demo in test/view.c, using new functions. + + implement getcchar(), setcchar(), wadd_wchnstr() and related macros. + + fix a syntax problem with do/if/while in PUTC macro (curses.priv.h). + +20010616 + + add parentheses in macros for malloc in test.priv.h, fixes an + expression in view.c (report by Wolfgang Gutjahr ). + + add Caps.uwin, as an example. + + change the way curses.h is generated, making the list of function + key definitions extracted from the Caps file. + + add #undef's before possible redefinition of ERR and OK in curses.h + + modify logic in tic, toe, tput and tset which checks for basename of + argv[0] to work properly on systems such as OS/2 which have + case-independent filenames and/or program suffixes, e.g., ".ext". + +20010609 + + add a configure check, if --enable-widec is specified, for putwc(), + which may be in libutf8. + + remove some unnecessary text from curs_extend.3x and + default_colors.3x which caused man-db to make incorrect symbolic + links (Debian #99550). + + add configure check if cast for _IO_va_list is needed to compile + C++ vscan code (Debian #97945). + > several patches from Sven Verdoolaege: + + correct code that used non-standard auto-initialization of a struct, + which gcc allows (report by Larry Virden). + + use putwc() in PUTC() macro. + + make addstr() work for the special case where the codeset is + non-stateful (eg. UTF-8), as well as stateful codesets. + +20010603 + + correct loop expression in NEXT_CHAR macro for lib_addstr.c changes + from 20010602 (report by Mike Castle). + +20010602 + + modify mvcur() to avoid emitting newline characters when nonl() mode + is set. Normally this is not a problem since the actual terminal + mode is set to suppress nl/crlf translations, however it is useful to + allow the caller to manipulate the terminal mode to avoid staircasing + effects after spawning a process which writes messages (for lynx + 2.8.4) -TD + > several patches from Sven Verdoolaege : + + remove redundant type-conversion in fifo_push() + + correct definition of addwstr() macro in curses.h.in + + remove _nc_utf8_outch() + + rename most existing uses of CharOf() to UChar(), e.g., where it is + used to prevent sign-extension in ctype macros. + + change some chtype's to attr_t's where the corresponding variables + are used to manipulate attributes. + + UpdateAttr() was applied to both attributes (attr_t) and characters + (chtype). Modify macro and calls to it to make these distinct. + + add CharEq() macro, use in places where wide-character configuration + implementation uses a struct for cchar_t. + + moved struct ldat into curses.priv.h, to hide implementation details. + + change CharOf() macro to use it for masking A_CHARTEXT data from + chtype's. + + add L() macro to curses.priv.h, for long-character literals. + + replace several assignments from struct ldat entries to chtype or + char values with combinations of CharOf() and AttrOf() macros. + + add/use intermediate ChAttrOf() and ChCharOf() macros where we know + we are using chtype data. + + add/use lowlevel attribute manipulation macros AddAttr(), RemAttr() + and SetAttr(). + + add/use SetChar() macro, to change a cchar_t based on a character and + attributes. + + convert most internal use of chtype to NCURSES_CH_T, to simplify use + of cchar_t for wide-character configuration. Similarly, use ARG_CH_T + where a pointer would be more useful. + + add stubs for tracing cchar_t values. + + add/use macro ISBLANK() + + add/use constructors for cchar_t's: NewChar(), NewChar2(). + + add/use macros CHREF(), CHDEREF(), AttrOfD(), CharOfD() to facilitate + passing cchar_t's by address. + + add/use PUTC_DATA, PUTC() macros. + + for wide-character configuration, move the window background data to + the end of the WINDOW struct so that whether _XOPEN_SOURCE_EXTENDED + is defined or not, the offsets in the struct will not change. + + modify addch() to work with wide-characters. + + mark several wide-character functions as generated in curses.h.in + + implement wunctrl(), wadd_wch(), wbkgrndset(), wbkgrnd(), + wborder_set() and waddnwstr(). + +20010526 + + add experimental --with-caps=XXX option to customize to similar + terminfo database formats such as AIX 4.x + + add Caps.aix4 as an example. + + modify Caps to add columns for the the KEY_xxx symbols. + + modify configure --with-widec to suppress overwrite of libcurses.so + and curses.h + + add checks to toe.c to avoid being confused by files and directories + where we would expect the reverse, e.g., source-files in the + top-level terminfo levels as is the case for AIX. + +20010519 + + add top-level 'depend' rule for the C sources, assuming that the + makedepend program is available. As a side-effect, this makes + the generated sources, as in "make sources" (prompted by a report + by Mike Castle that "make -j" fails because the resulting parallel + processes race to generate ncurses/names.c). + + modify configure script so that --disable-overwrite option's action + to add a symbolic link for libcurses applies to the static library as + well as the shared library when both are configured (report by Felix + Natter ). + + add ELKS terminfo entries (Federico Bianchi + ) + + add u6 (CSR) to Eterm (Michael Jennings). + +20010512 + + modify test/ncurses.c to work with xterm-256color, which has fewer + color pairs than colors*colors (report by David Ellement + ). + +20010505 + + corrected screen.xterm-xfree86 entry. + + update comment in Caps regarding IBM (AIX) function-key definitions. + +20010421 + + modify c++/Makefile.in to link with libncurses++w.a when configured + for wide-characters (patch by Sven Verdoolaege). + + add check in _nc_trace_buf() to refrain from freeing a null pointer. + + improve CF_PROG_INSTALL macro using CF_DIRNAME. + + update config.guess, config.sub from autoconf 2.49e (alpha). + +20010414 + + add secondary check in tic.c, similar_sgr() to see if the reason + for mismatch was that the individual capabilities used a time-delay + while sgr did not. Used this to cleanup mismatches, e.g., in vt100, + and remove time-delay from Apple_Terminal entries. + + add Apple_Terminal terminfo entries (Benjamin C W Sittler + ). + + correct definitions of shifted editing keys for xterm-xfree86 -TD + + fix a bug in test/bs.c from 20010407 (patch by Erik Sigra). + + prevent relative_move() from doing an overwrite if it detects 8-bit + characters when configured for UTF-8 (reported by Sven Verdoolaege + ). + +20010407 + + add configure checks for strstream.h vscan function, and similar + stdio-based function which may be used in C++ binding for gcc 3.0 + (reports by George Goffe, Lars Hecking, Mike Castle). + + rewrite parts of configure.in which used changequote(). That feature + is broken in the latest autoconf alphas (e.g., 2.49d). + + add a missing pathname for ncurses_dll.h, needed when building in + a directory outside the source tree (patch by Sven Verdoolaege + ). + > fix 2 bugs in test/bs.c Erik Sigra : + + no ships were ever placed in the last row or in the last column. + This made the game very easy to win, because you never had to waste + any shots there, but the computer did. + + the squares around a sunken ship that belonged to the player were not + displayed as already hit by the computer, like it does for the + player. + +20010331 + + add some examples of customizing screen's terminfo: + screen.xterm-xfree86, screen.xterm-r6, screen.teraterm -TD + + modify screen's terminfo entry to match the khome/kend in screen + 3.09.08 (Debian #92215). + + correct a memory leak in forms library (report by Stefan Vogtner + ) (patch by Juergen Pfeifer). + +20010324 + + change symbols used to guard against repeated includes to begin + consistently with "NCURSES_" rather than a leading underscore. There + are other symbols defined in the header files which begin with a + leading underscore, but they are part of the legacy interface. + + reorder includes in c++ binding so that rcs identifiers can be + compiled-in. + + add .cc.ii rule to c++ makefile, to get preprocessor output for + debugging. + + correct configure script handling of @keyword@ substitutions when the + --with-manpage-renames option is given (cf: 20000715, fixes Debian + #89939). + + report stack underflow/overflow in tparm() when tic -cv option is + given. + + remove spurious "%|" operator from xterm-xfree86 terminfo entry, + (reported by Adam Costello , Debian #89222). + +20010310 + + cleanup of newdemo.c, fixing some ambiguous expressions noted by gcc + 2.95.2, and correcting some conflicting color pair initializations. + + add missing copyright notice for cursesw.h + + review, make minor fixes for use of '::' for referring to C-language + interface from C++ binding. + + modify configure check for g++ library slightly to accommodate + nonstandard version number, e.g., -2.7 (report by Ronald Ho + ). + + add configure check for c++ header, replace hardcoded + ifdef. + + workaround for pre-release of gcc 3.0 libstdc++, which has dropped + vscan from strstreambuf to follow standard, use wrapper for C vscanf + instead (report by George Goffe and Matt Taggart + , fixes Debian . + +20010303 + + modify interface of _nc_get_token() to pass 'silent' parameter to it, + to make quieter loading of /etc/termcap (patch by Todd C Miller). + + correct a few typos in curs_slk.3x and curs_outopts.3x manpages + (patch by Todd C Miller). + +20010224 + + compiler-warning fixes (reported by Nelson Beebe). + +20010210 + + modify screen terminfo entry to use new 3.9.8 feature allowing xterm + mouse controls -TD + +20010203 + + broaden patterns used to match OS/2 EMX in configure script to cover + variant used in newer config.guess/config.sub + + remove changequote() calls from configure script, since this feature + is broken in the autoconf 2.49c alpha, maintainers decline to fix. + + remove macro callPutChar() from tty_update.c, since this is no longer + needed (reported by Philippe Blain). + + add a null-pointer check in tic.c to handle the case when the input + file is really empty. Modify the next_char() function in comp_scan.c + to allow arbitrarily long lines, and incidentally supply a newline to + files that do not end in a newline. These changes improve tic's + recovery from attempts to read binary files, e.g., its output from + the terminfo database (reported by Bernhard Rosenkraenzer). + +20010127 + + revert change to c++/demo.cc from 20001209, which changed definition + of main() apparently to accommodate cygwin linker, but broke the demo + program. + + workaround for broken egcs 2.91.66 which calls member functions + (i.e., lines() and colors() of NCursesWindow before calling its + constructor. Add calls to initialize() in a few constructors which + did not do this already. + + use the GNAT preprocessor to make the necessary switch between TRACE + and NO_TRACE configurations (patch by Juergen Pfeifer). + > patches by Bernhard Rosenkraenzer: + + modify kterm terminfo entry to use SCS sequence to support alternate + character set (it does not work with SI/SO). + + --with-ospeed=something didn't work. configure.in checked for a + $enableval where it should check for $withval. Also, + ncurses/llib-lncurses still had a hardcoded short. + +20010114 + + correction to my merge of Tom Riddle's patch that broke tic in some + conditions (reported by Enoch Wexler ) -TD + +20010113 + + modify view.c to test halfdelay(). Like other tests, this recognizes + the 's' and space commands for stopping/starting polled input, shows + a freerunning clock in the header. If given a parameter to 's', that + makes view.c use halfdelay() with that parameter rather than + nodelay(). + + fix to allow compile with the experimental configure option + --disable-hashmap. + + modify postprocess_termcap() to avoid overwriting key_backspace, + key_left, key_down when processing a non-base entry (report/patch by + Tom Riddle). + + modify _nc_wrap_entry(), adding option to reallocate the string + table, needed in _nc_merge_entry() when merging termcap entries. + (adapted from report/patch by Tom Riddle ). + + modify a few configure script macros to keep $CFLAGS used only for + compiler options, preprocessor options in $CPPFLAGS. + +20001230 + + correct marker positions in lrtest.c after receiving a sigwinch. + + fix ifdef's in ncurses.c to build against pre-5.2 for testing. + + fixes to tclock for resizing behavior, redundant computation (report + and patch by A M Kuchling ). + +20001216 + + improved scoansi terminfo entry -TD + + modify configure script and makefile in Ada95/src to compile a stub + for the trace functions when ncurses does not provide those. + +20001209 + + add ncurses_dll.h and related definitions to support generating DLL's + with cygwin (adapted from a patch by Charles Wilson + , changed NCURSES_EXPORT macro to make it + work with 'indent') -TD + +20001202 + + correct prototypes for some functions in curs_termcap.3x, matching + termcap.h, which matches X/Open. + > patch by Juergen Pfeifer: + + a revised version of the Ada enhancements sent in by "H. + Nanosecond", aka Eugene V Melaragno . This + patch includes + - small fixes to the existing ncurses binding + - addition of some more low-level functions to the binding, including + termcap and terminfo functions + - An Ada implementation of the "ncurses" test application originally + written in C. + +20001125 + + modify logic in lib_setup.c to allow either lines or columns value + from terminfo to be used if the screen size cannot be determined + dynamically rather than requiring both (patch by Ehud Karni + ). + + add check in lib_tgoto.c's is_termcap() function to reject null or + empty strings (reported by Valentin Nechayev to + freebsd-bugs). + + add definition from configure script that denotes the path-separator, + which is normally a colon. The path-separator is a semicolon on + OS/2 EMX and similar systems which may use a colon within pathnames. + + alter logic to set default for --disable-overwrite option to set it + to 'yes' if the --prefix/$prefix value is not /usr/local, thereby + accommodating the most common cause of problems: gcc's nonstandard + search rules. Other locations such as /usr/local/ncurses will + default to overwriting (report by Lars Hecking ). + +20001118 + + modify default for --disable-overwrite configure option to disable + if the --prefix or $prefix value is not /usr. + + add cygwin to systems for which ncurses is installed by default into + /usr rather than /usr/local. + +20001111 + + minor optimization in comp_error.c and lib_termname.c, using + strncat() to replace strncpy() (patch by Solar Designer). + + add a use_terminfo_vars() check for $HOME/.termcap, and check for + geteuid() to use_terminfo_vars() (patch by Solar Designer + ). + + improved cygwin terminfo entry, based on patch by + . + + modify _nc_write_entry() to allow for the possibility that linking + aliases on a filesystem that ignores case would not succeed because + the source and destination differ only by case, e.g., NCR260VT300WPP0 + on cygwin (report by Neil Zanella). + + fix a typo in the curs_deleteln.3x man page (patch by Bernhard + Rosenkraenzer ). + +20001104 + + add configure option --with-ospeed to assist packagers in transition + to 5.3 change to ospeed type. + + add/use CharOf() macro to suppress sign-extension of char type on + platforms where this is a problem in ctype macros, e.g., Solaris. + + change trace output to binary format. + + correct a missing quote adjustment in CF_PATH_SYNTAX autoconf + macro, for OS/2 EMX configuration. + + rearrange a few configure macros, moving preprocessor options to + $CPPFLAGS (a now-obsolete version of autoconf did not consistently + use $CPPFLAGS in both the compile and preprocessor checks). + + add a check in relative_move() to guard against buffer overflow in + the overwrite logic. + +20001028 + + add message to configure script showing g++ version. + + resync config.guess, config.sub + + modify lib_delwin.c, making it return ERR if the window did not exist + (suggested by Neil Zanella). + + add cases for FreeBSD 3.1 to tdlint and makellib scripts, used this + to test/review ncurses library. (Would use lclint, but it doesn't + work). + + reorganized knight.c to avoid forward references. Correct screen + updates when backtracking, especially to the first cell. Add F/B/a + commands. + +20001021 5.2 release for upload to ftp.gnu.org + + update generated html files from manpages. + + modify dist.mk to use edit_man.sh to substitute autoconf'd variables + in html manpages. + + fix an uninitialized pointer in read_termcap.c (report by Todd C + Miller, from report/patch by Philip Guenther ). + + correct help-message and array limit in knight.c (patch by Brian + Raiter ). + > patch by Juergen Pfeifer: + + fix to avoid warning by GNAT-3.13p about use of inconsistent casing + for some identifiers defined in the standard package. + + cosmetic change to forms/fty_enum.c + +20001014 + + correct an off-by-one position in test/railroad.c which could cause + wrapping at the right margin. + + test/repair some issues with libtool configuration. Make + --disable-echo force libtool --silent. (Libtool does not work for + OS/2 EMX, works partly for SCO - libtool is still very specific to + gcc). + + change default of --with-manpage-tbl to "no", since for most of the + platforms which do have tbl installed, the system "man" program + understands how to run tbl automatically. + + minor improvement to force_bar() in comp_parse.c (Bernhard + Rosenkraenzer ). + + modify lib_tparm.c to use get_space() before writing terminating + null character, both for consistency as well as to ensure that if + save_char() was called immediately before, that the allocated memory + is enough (patch by Sergei Ivanov). + + add note about termcap ML capability which is duplicated between two + different capabilities: smgl and smglr (reported by Sergei Ivanov + ). + + correct parameter counts in include/Caps for dclk as well as some + printer-specific capabilities: csnm, defc, scs, scsd, smgtp, smglp. + > patch by Johnny C Lam : + + add support for building with libtool (apparently version 1.3.5, + since old versions do not handle -L../lib), using new configure + option --with-libtool. + + add configure option --with-manpage-tbl, which causes the manpages to + be preprocessed by tbl(1) prior to installation, + + add configure option --without-curses-h, which causes the + installation process to install curses.h as ncurses.h and make + appropriate changes to headers and manpages. + +20001009 + + correct order of options/parameters in run_tic.in invocation of tic, + which did not work with standard getopt() (reported by Ethan + Butterfield ). + + correct logic for 'reverse' variable in lib_vidattr.c, which was + setting it true without checking if newmode had A_REVERSE set, e.g., + using $TERM=ansi on OS/2 EMX (see 20000917). + > patch by Todd C Miller: + + add a few missing use_terminfo_vars() and fixes up _nc_tgetent(). + Previously, _nc_cgetset() would still get called on cp so the + simplest thing is to set cp to NULL if !use_terminfo_vars(). + + added checks for an empty $HOME environment variable. + > patches for OS/2 EMX (Ilya Zakharevich): + + modify convert_configure.pl to support INSTALL. Change compiler + options in that script to use multithreading, needed for the mouse. + + modify OS/2 mouse support, retrying as a 2-button mouse if code fails + to set up a 3-button mouse. + + improve code for OS/2 mouse support, using _nc_timed_wait() to + replace select() call. + +20001007 + + change type of ospeed variable back to short to match its use in + legacy applications (reported by Andrey A Chernov). + + add case to configure script for --enable-rpath on IRIX (patch by + Albert Chin-A-Young). + + minor fix to position_check() function, to ensure it gets the whole + cursor report before decoding. + + add configure option --disable-assumed-color, to allow pre-5.1 + convention of default colors used for color-pair 0 to be configured + (see assume_default_colors()). + + rename configure option --enable-hashmap --disable-hashmap, and + reorder the configure options, splitting the experimental and + development + + add configure option --disable-root-environ, which tells ncurses to + disregard $TERMINFO and similar environment variables if the current + user is root, or running setuid/setgid (based on discussion with + several people). + + modified misc/run_tic.in to use tic -o, to eliminate dependency on + $TERMINFO variable for installs. + + add table entry for plab_norm to tput, so it passes in strings + for that capability. + + modify parse_format() in lib_tparm.c to ignore precision if it is + longer than 10000 (report by Jouko Pynnonen). + + rewrote limit checks in lib_mvcur.c using new functions + _nc_safe_strcat(), etc. Made other related changes to check lengths + used for strcat/strcpy (report by Jouko Pynnonen + ). + +20000930 + + modify several descriptions, including those for setaf, setab, in + include/Caps to indicate that the entries are parameterized. This + information is used to tell which strings are translated when + converting to termcap. Fixes a problem where the generated termcap + would contain a spurious "%p1" for the terminfo "%p1%d". + + modify ld -rpath options (e.g., Linux, and Solaris) to use an + absolute pathname for the build tree's lib directory (prompted by + discussion with Albert Chin-A-Young). + + modify "make install.man" and "make uninstall.man" to include tack's + man-page. + + various fixes for install scripts used to support configure --srcdir + and --with-install-prefix (reported by Matthew Clarke + ). + + make configure script checks on variables $GCC and $GXX consistently + compare against 'yes' rather than test if they are nonnull, since + either may be set to the corresponding name of the C or C++ compiler + (report/patch by Albert Chin-A-Young). + +20000923 + + modify rs2 capability in xterm-r6 and similar where cursor + save/restore bracketed the sequence for resetting video attributes. + The cursor restore would undo that (report by John Hawkinson + (see NetBSD misc/11052)). + + using parameter check added to tic, corrected 27 typos in + terminfo.src -TD + + modify tic to verify that its inputs are really files, in case + someone tries to read a directory (or /dev/zero). + + add a check for empty buffers returned by fgets() in comp_scan.c + next_char() function, in case tic is run on a non-text file (fixes + a core dump reported by Aaron Campbell ). + + add to railroad.c some code exercising tgoto(), providing an + alternate form of display if the terminal supports cursor addressing. + + split-out tgoto() again, this time into new file lib_tgoto.c, and + implement a conventional BSD-style tgoto() which is used if the + capability string does not contain terminfo-style padding or + parameters (requested by Andrey A Chernov). + + add check to tic which reports capabilities that do not reference + the expected number of parameters. + + add error checking to infocmp's -v and -m options to ensure that + the option value is indeed a number. + + some cleanup of logic in _nc_signal_handler() to verify if SIGWINCH + handler is setup. Separated the old/new sigaction data for SIGTSTP + from the other signals. + +20000917 + + add S0, E0 extensions to screen's terminfo entry, which is another + way to solve the misconfiguration issue -TD + + completed special case for tgoto from 20000916 + +20000916 + + update xterm terminfo entries to match XFree86 xterm patch #146 -TD + + add Matrix Orbital terminfo entries (from Eric Z Ayers + ). + + add special case to lib_tparm.c to allow 'screen' program to use a + termcap-style parameter "%." to tgoto() for switching character sets. + + use LN_S substitution in run_tic.in, to work on OS/2 EMX which has + no symbolic links. + + updated notes in README.emx regarding autoconf patches. + + replace a lookup table in lib_vidattr.c used to decode no_color_video + with a logic expression (suggested by Philippe Blain). + + add a/A toggle to ncurses.c 'b' test, which clears/sets alternate + character set attribute from the displayed text. + + correct inequality in parameter analysis of rewritten lib_tparm.c + which had the effect of ignoring p9 in set_attributes (sgr), breaking + alternate character set (reported by Piotr Majka ). + + correct ifdef'ing for GCC_PRINTF, GCC_SCANF which would not compile + with Sun WorkShop compilers since these tokens were empty (cf: + 20000902, reported by Albert Chin-A-Young). + +20000909 + + correct an uninitialized parameter to open_tempfile() in tic.c which + made "tic -I" give an ambiguous error message about tmpnam. + + add special case in lib_vidattr.c to reset underline and standout for + devices that have no sgr0 defined (patch by Don Lewis + ). Note that this will not work for bold + mode, since there is no exit-bold-mode capability. + + improved patch for Make_Enum_Type (patch by Juergen Pfeifer). + + modify tparm to disallow arithmetic on strings, analyze the varargs + list to read strings as strings and numbers as numbers. + + modify tparm's internal function spop() to treat a null pointer as + an empty string. + + modify tput program so it can be renamed or invoked via a link as + 'reset' or 'init', producing the same effect as 'tput reset' or 'tput + init'. + + add private entrypoint _nc_basename(), use to consolidate related + code in progs, as well as accommodating OS/2 EMX pathnames. + + remove NCURSES_CONST line from edit_cfg.sh to compensate for its + removal (except via AC_SUBST) from configure.in, making + --enable-const work again (reported by Juergen Pfeifer). + + regen'd configure to pick up "hpux*" change from 20000902. + +20000902 + + modify tset.c to check for transformed "reset" program name, if any. + + add a check for null pointer in Make_Enum_Type() (reported by Steven + W Orr ). + + change functions _nc_parse_entry() and postprocess_termcap() to avoid + using strtok(), because it is non-reentrant (reported by Andrey A + Chernov ). + + remove "hpux10.*" case from CF_SHARED_OPTS configure script macro. + This differed from the "hpux*" case by using reversed symbolic + links, which made the 5.1 version not match the configuration of + 5.0 shared libraries (reported by Albert Chin-A-Young). + + correct a dependency in Ada95/src/Makefile.in which prevented + building with configure --srcdir (patch by H Nanosecond + ). + + modify ifdef's in curses.h.in to avoid warning if GCC_PRINTF or + GCC_SCANF was not previously defined (reported by Pavel Roskin + ). + + add MKncurses_def.sh to generate fallback definitions for + ncurses_cfg.h, to quiet gcc -Wundef warnings, modified ifdef's in + code to consistently use "#if" rather than "#ifdef". + +20000826 + + add QNX qansi entries to terminfo -TD + + add os2 entry to misc/emx.src (). + + add configure option --with-database to allow specifying a different + terminfo source-file to install. On OS/2 EMX, this defaults to + misc/emx.src + + change misc/run_tic.sh to derive it from misc/run_tic.in, to simplify + setting .exe extension on OS/2 EMX. + + add .exe extension in Ada95/gen/Makefile.in, + Ada95/samples/Makefile.in, for OS/2 EMX (reported by + ). + + add configure check for filesystems (such as OS/2 EMX) which do not + distinguish between upper/lowercase filenames, use this to fix tags + rules in makefiles. + + initialize fds[] array to 0's in _nc_timed_wait(); apparently poll() + only sets the revents members of that array when there is activity + corresponding to the related file (report by Glenn Cooper + , using Purify on Solaris 5.6). + + change configure script to use AC_CANONICAL_SYSTEM rather than + AC_CANONICAL_HOST, which means that configure --target will set + a default program-prefix. + + add note on cross-compiling to INSTALL (which does not rely on the + AC_CANONICAL_* macros). + +20000819 + + add cases for EMX OS/2 to config.guess, config.sub + + new version of config.guess, config.sub from lynx 2.8.4dev.7 + + add definitions via transform.h to allow tic and tput to check for + the transformed aliases rather than the original infotocap, etc. + + simplify transform-expressions in progs/Makefile.in, make the + uninstall rule work for transformed program names. + + change symbol used by --install-prefix configure option from + INSTALL_PREFIX to DESTDIR (the latter has become common usage + although the name is misleading). + + modify programs to use curses_version() string to report the version + of ncurses with which they are compiled rather than the + NCURSES_VERSION string. The function returns the patch level in + addition to the major and minor version numbers. + +20000812 + + modify CF_MAN_PAGES configure macro to make transformed program names + a parameter to that macro rather than embedding them in the macro. + + newer config.guess, config.sub (reference version used in lynx + 2.8.4dev.7). + + add configure option --with-default-terminfo-dir=DIR to allow + specifying the default terminfo database directory (request by Albert + Chin-A-Young). + + minor updates for terminfo.src from FreeBSD termcap change-history. + + correct notes in README and INSTALL regarding documentation files + that were moved from misc directory to doc (report by Rich Kulawiec + ). + + change most remaining unquoted parameters of 'test' in configure + script to use quotes, for instance fixing a problem in the + --disable-database option (reported by Christian Mondrup + ). + + minor adjustments to work around some of the incompatibilities/bugs + in autoconf 2.29a alpha. + + add -I/usr/local/include when --with-ncurses option is used in + test/configure script. + + correct logic in adjust_cancels(), which did not check both + alternatives when reclassifying an extended name between boolean, + number and string, causing an infinite loop in tic. + +20000730 + + correct a missing backslash in curses.priv.h + +20000729 + + change handling of non_dest_scroll_region in tty_update.c to clear + text after it is shifted in rather than before shifting out. Also + correct row computation (reported by Ruediger Kuhlmann + ). + + add/use new trace function to display chtype values from winch() and + getbkgd(). + + add trace mask TRACE_ATTRS, alter several existing _tracef calls that + trace attribute changes under TRACE_CALLS to use this. + + modify MKlib_gen.sh so that functions returning chtype will call + returnChar(). + + add returnChar() trace, for functions returning chtype. + + change indent.pro to line up parenthesis. + +20000722 + + fix a heap problem with the c++ binding (report by + , patch by Juergen Pfeifer). + + minor adjustment to ClrToEOL() to handle an out-of-bounds parameter. + + modify the check for big-core to force a couple of memory accesses, + which may work as needed for older/less-capable machines (if not, + there's still the explicit configure option). + > fixes based on diff's for Amiga and BeOS found at + http://www.mathematik.uni-karlsruhe.de/~kuhlmann/cross/ncurses/ + + alter definition of NCURSES_CONST to make it non-empty. + + add amiga-vnc terminfo entry. + + redefine 'TEXT' in menu.h for AMIGA, since it is reported to have + an (unspecified) symbol conflict. + + replaced case-statement in _nc_tracebits() for CSIZE with a table to + simplify working around implementations that define random + combinations of the related macros to zero. + + modify configure test for tcgetattr() to allow for old + implementations, e.g., on BeOS, which only defined it as a macro. + > patches by Bruno Haible: + + when checking LC_ALL/LC_CTYPE/LANG environment variables for UTF-8 + locale, ignore those which are set to an empty value, as per SUSV2. + + encode 0xFFFD in UTF-8 with 3 bytes, not 2. + + modify _nc_utf8_outch() to avoid sign-extension when checking for + out-of-range value. + +20000715 + + correct manlinks.sed script to avoid using ERE "\+", which is not + understood by older versions of sed (patch by Albert Chin-A-Young). + + implement configure script options that transform installed program + names, e.g., --program-prefix, including the manpage names and cross + references (patch by Albert Chin-A-Young ). + + correct several mismatches between manpage filename and ".TH" + directives, renaming dft_fgbg.3x to default_colors.3x and + menu_attribs.3x to menu_attributes.3x (report by Todd C Miller). + + correct missing includes for in several places, including + the C++ binding. This is not noted by gcc unless we use the + -fno-builtin option (reported by Igor Schein ). + + modified progs/tset.c and tack/sysdep.c to build with sgttyb + interface if neither termio or termios is available. Tested this + with FreeBSD 2.1.5 (which does have termios - but the sgttyb does + work). + +20000708 5.1 release for upload to ftp.gnu.org + + document configure options in INSTALL. + + add man-page for ncurses trace functions. + + correct return value shown in curs_touch.3x for is_linetouched() and + is_wintouched(), in curs_initscr.3x for isendwin(), and in + curs_termattr.3x for has_ic() and has_il(). + + add prototypes for touchline() and touchwin(), adding them to the + list of generated functions. + + modify fifo_push() to put ERR into the fifo just like other values to + return from wgetch(). It was returning without doing that, making + end-of-file condition incorrectly return a 0 (reported by Todd C + Miller). + + uncomment CC_SHARED_OPTS for progs and tack (see 971115), since they + are needed for SCO OpenServer. + + move _nc_disable_period from free_ttype.c to comp_scan.c to appease + dynamic loaders on SCO and IRIX64. + + add "-a" option to test/ncurses.c to invoke assume_default_colors() + for testing. + + correct assignment in assume_default_colors() which tells ncurses + whether to use default colors, or the assumed ones (reported by Gary + Funck ). + + review/correct logic in mk-1st.awk for making symbolic links for + shared libraries, in particular for FreeBSD, etc. + + regenerate misc/*.def files for OS/2 EMX dll's. + + correct quoting of values for CC_SHARED_OPTS in aclocal.m4 for + cases openbsd2*, openbsd*, freebsd* and netbsd* (patch by Peter + Wemm) (err in 20000610). + + minor updates to release notes, as well as adding/updating URLs for + examples cited in announce.html + > several fixes from Philippe Blain : + + correct placement of ifdef for NCURSES_XNAMES in function + _nc_free_termtype(), fixes a memory leak. + + add a call to _nc_synchook() to the end of function whline() like + that in wvline() (difference was in 1.9.4). + + make ClearScreen() a little faster by moving two instances of + UpdateAttr() out of for-loops. + + simplify ClrBottom() by eliminating the tstLine data, using for-loops + (cf: 960428). + +20000701 pre-release + + change minor version to 1, i.e., ncurses 5.1 + + add experimental configure option --enable-colorfgbg to check for + $COLORFGBG variable as set by rxvt/aterm/Eterm. + + add Eterm terminfo entry (Michael Jennings ). + + modify manlinks.sed to pick aliases from the SYNOPSIS section, and + several manpages so manlinks.sed can find aliases for creating + symbolic links. + + add explanation to run_tic.sh regarding extended terminal + capabilities. + + change message format for edit_cfg.sh, since some people interpret + it as a warning. + + correct unescaped '$' in sysv5uw7*|unix_sv* rule for CF_SHARED_OPTS + configure macro (report by Thanh Ma ). + + correct logic in lib_twait.c as used by lib_mouse.c for GPM mouse + support when poll() is used rather than select() (prompted by + discussion with David Allen ). + +20000624 pre-release + + modify TransformLine() to check for cells with different color pairs + that happen to render the same display colors. + + apply $NCURSES_NO_PADDING to cost-computation in mvcur(). + + improve cost computation in PutRange() by accounting for the use + of parm_right_cursor in mvcur(). + + correct cost computation in EmitRange(), which was not using the + normalized value for cursor_address. + + newer config.guess, config.sub (reference version used in TIN 1.5.6). + +20000617 + + update config.guess, config.sub (reference version used in PCRE 3.2). + + resync changes to gnathtml against version 1.22, regenerated html + files under doc/html/ada using this (1.22.1.1). + + regenerated html files under doc/html/man after correcting top and + bottom margin options for man2html in dist.mk + + minor fixes to test programs ncurses 'i' and testcurs program to make + the subwindow's background color cover the subwindow. + + modify configure script so AC_MSG_ERROR is temporarily defined to a + warning in AC_PROG_CXX to make it recover from a missing C++ compiler + without requiring user to add --without-cxx option (adapted from + comment by Akim Demaille to autoconf mailing list). + + modify headers.sh to avoid creating temporary files in the build + directory when installing headers (reported by Sergei Pokrovsky + ) + +20000610 + + regenerated the html files under doc/html/ada/files and + doc/html/ada/funcs with a slightly-improved gnathtml. + + add kmous capability to linux terminfo entry to allow it to use + xterm-style events provided by gpm patch by Joerg Schoen. + + make the configure macro CF_SHARED_OPTS a little smarter by testing + if -fPIC is supported by gcc rather than -fpic. The former option + allows larger symbol tables. + + update config.guess and config.sub (patches by + Kevin Buettner (for elf64_ia64), + Bernd Kuemmerlen (for MacOS X)). + + add warning for 'tic -cv' about use of '^?' in terminfo source, which + is an extension. + +20000527 + + modify echo() behavior of getch() to match Solaris curses for + carriage return and backspace (reported by Neil Zanella). + + change _nc_flush() to a function. + + modify delscreen() to check if the output stream has been closed, and + if so, free the buffer allocated for setbuf (this provides an + ncurses-specific way to avoid a memory leak when repeatedly calling + newterm reported by Chipp C ). + + correct typo in curs_getch.3x manpage regarding noecho (reported by + David Malone ). + + add a "make libs" rule. + + make the Ada95 interface build with configure --enable-widec. + + if the configure --enable-widec option is given, append 'w' to names + of the generated libraries (e.g., libncursesw.so) to avoid conflict + with existing ncurses libraries. + +20000520 + + modify view.c to make a rudimentary viewer of UTF-8 text if ncurses + is configured with the experimental wide-character support. + + add a simple UTF-8 output driver to the experimental wide-character + support. If any of the environment variables LC_ALL, LC_CTYPE or + LANG contain the string "UTF-8", this driver will be used to + translate the output to UTF-8. This works with XFree86 xterm. + + modify configure script to allow building shared libraries on BeOS + (from a patch by Valeriy E Ushakov). + + modify lib_addch.c to allow repeated update to the lower-right + corner, rather than displaying only the first character written until + the cursor is moved. Recent versions of SVr4 curses can update the + lower-right corner, and behave this way (reported by Neil Zanella). + + add a limit-check in _nc_do_color(), to avoid using invalid color + pair value (report by Brendan O'Dea ). + +20000513 + + the tack program knows how to use smcup and rmcup but the "show caps + that can be tested" feature did not reflect this knowledge. Correct + the display in the menu tack/test/edit/c (patch by Daniel Weaver). + + xterm-16color does allow bold+colors, removed ncv#32 from that + terminfo entry. + +20000506 + + correct assignment to SP->_has_sgr_39_49 in lib_dft_fgbg.c, which + broke check for screen's AX capability (reported by Valeriy E Ushakov + ). + + change man2html rule in dist.mk to workaround bug in some + man-programs that ignores locale when rendering hyphenation. + + change web- and ftp-site to dickey.his.com + +20000429 + + move _nc_curr_token from parse_entry.c to comp_scan.c, to work around + problem linking tack on MacOS X DP3. + + include in lib_napms.c to compile on MacOS X DP3 + (reported by Gerben Wierda ). + + modify lib_vidattr.c to check for ncv fixes when pair-0 is not + default colors. + + add -d option to ncurses.c, to turn on default-colors for testing. + + add a check to _nc_makenew() to ensure that newwin() and newpad() + calls do not silently fail by passing too-large limits. + + add symbol NCURSES_SIZE_T to use rather than explicit 'short' for + internal window and pad sizes. Note that since this is visible in + the WINDOW struct, it would be an ABI change to make this an 'int' + (prompted by a question by Bastian Trompetter + , who attempted to create a 96000-line pad). + +20000422 + + add mgterm terminfo entry from NetBSD, minor adjustments to sun-ss5, + aixterm entries -TD + + modify tack/ansi.c to make it more tolerant of bad ANSI replies. An + example of an illegal ANSI response can be found using Microsoft's + Telnet client. A correct display can be found using a VT-4xx + terminal or XFree86 xterm with: + XTerm*VT100*decTerminalID: 450 + (patch by Daniel Weaver). + + modify gdc.c to recognize 'q' for quit, 's' for single-step and ' ' + for resume. Add '-n' option to force gdc's standard input to + /dev/null, to both illustrate the use of newterm() for specifying + alternate inputs as well as for testing signal handling. + + minor fix for configure option --with-manpage-symlinks, for target + directories that contain a period ('.') (reported by Larry Virden). + +20000415 + + minor additions to beterm entry (feedback from Rico Tudor) -TD + + corrections/updates for some IBM terminfo entries -TD + + modify _nc_screen_wrap() so that when exiting curses mode with + non-default colors, the last line on the screen will be cleared to + the screen's default colors (request by Alexander V Lukyanov). + + modify ncurses.c 'r' example to set nonl(), allowing control/M to be + read for demonstrating the REQ_NEW_LINE operation (prompted by a + question by Tony L Keith ). + + modify ncurses.c 'r' example of field_info() to work on Solaris 2.7, + documented extension of ncurses which allows a zero pointer. + + modify fmt_complex() to avoid buffer overflow in case of excess + recursion, and to recognize "%e%?" as a synonym for else-if, which + means that it will not recur for that special case. + + add logic to support $TERMCAP variable in case the USE_GETCAP symbol + is defined (patch by Todd C Miller). + + modify one of the m4 files used to generate the Ada95 sources, + to avoid using the token "symbols" (patch by Juergen Pfeifer). + +20000408 + + add terminfo entries bsdos-pc-m, bsdos-pc-mono (Jeffrey C Honig) + + correct spelling error in terminfo entry name: bq300-rv was given as + bg300-rv in esr's version. + + modify redrawwin() macro so its parameter is fully parenthesized + (fixes Debian #61088). + + correct formatting error in dump_entry() which set incorrect column + value when no newline trimming was needed at the end of an entry, + before appending "use=" clauses (cf: 960406). + +20000401 + + add configure option --with-manpage-symlinks + + change unctrl() to render C1 characters (128-159) as ~@, ~A, etc. + + change makefiles so trace() function is provided only if TRACE is + defined, e.g., in the debug library. Modify related calls to + _tracechar() to use unctrl() instead. + +20000325 + + add screen's AX capability (for ECMA SGR 39 and 49) to applicable + terminfo entries, use presence of this as a check for a small + improvement in setting default colors. + + improve logic in _nc_do_color() implementing assume_default_colors() + by passing in previous color pair info to eliminate redundant call to + set_original_colors(). (Part of this is from a patch by Alexander + V Lukyanov). + + modify warning in _nc_trans_string() about a possibly too-long string + to do this once only rather than for each character past the + threshold (600). Change interface of _nc_trans_string() to allow + check for buffer overflow. + + correct use of memset in _nc_read_entry_source() to initialize ENTRY + struct each time before reading new data into it, rather than once + per loop (cf: 990301). This affects multi-entry in-core operations + such as "infocmp -Fa". + +20000319 + + remove a spurious pointer increment in _nc_infotocap() changes from + 20000311. Add check for '.' in format of number, since that also + is not permitted in termcap. + + correct typo in rxvt-basic terminfo from temporary change made while + integrating 20000318. + +20000318 + + revert part of the vt220 change (request by Todd C Miller). + + add ansi-* terminfo entries from ESR's version. + + add -a option to tic and infocmp, which retains commented-out + capabilities during source translation/comparison, e.g., captoinfo + and infotocap. + + modify cardfile.c to display an empty card if no input data file is + found, fixes a core dump in that case (reported by Bruno Haible). + + correct bracketing in CF_MATH_LIB configure macro, which gave wrong + result for OS/2 EMX. + + supply required parameter for _nc_resolve_uses() call in + read_termcap.c, overlooked in 20000311 (reported by Todd C Miller). + > patches by Bruno Haible : + + fix a compiler warning in fty_enum.c + + correct LIB_PREFIX expression for DEPS_CURSES in progs, tack + makefiles, which resulted in redundant linking (cf: 20000122). + +20000311 + + make ifdef's for BROKEN_LINKER consistent (patch by Todd C Miller). + + improved tack/README (patch by Daniel Weaver). + + modify tput.c to ensure that unspecified parameters are passed to + tparm() as 0's. + + add a few checks in infocmp to guard against buffer overflow when + displaying string capabilities. + + add check for zero-uses in infocmp's file_comparison() function + before calling _nc_align_termtype(). Otherwise one parameter is + indexed past the end of the uses-array. + + add an option -q to infocmp to specify the less verbose output, + keeping the existing format as the default, though not retaining the + previous behavior that made the -F option compare each entry to + itself. + + adapted patch by ESR to make infocmp -F less verbose -TD + (the submitted patch was unusable because it did not compile + properly) + + modify write_entry.c to ensure that absent or cancelled booleans + are written as FALSE, for consistency with infocmp which now + assumes this. Note that for the small-core configuration, tic + may not produce the same result as before. + + change some private library interfaces used by infocmp, e.g., + _nc_resolve_uses(). + + add a check in _nc_infotocap() to ensure that cm-style capabilities + accept only %d codes when converting the format from terminfo to + termcap. + + modify ENTRY struct to separate the data in 'parent' into the name + and link values (the original idea to merge both into 'parent' was + not good). + + discard repair_acsc(tterm); + > patch by Juergen Pfeifer: + + drop support for gnat 3.10 + + move generated documentation and html files under ./doc directory, + adding makefile rules for this to dist.mk + +20000304 + + correct conflicting use of tparm() in 20000226 change to tic, which + made it check only one entry at a time. + + fix errors in ncurses-intro.html and hackguide.html shown by Dave + Raggett's tidy. + + make the example in ncurses-intro.html do something plausible, and + corrected misleading comment (reported by Neil Zanella). + + modify pnoutrefresh() to set newscr->_leaveok as wnoutrefresh() does, + to fix a case where the cursor position was not updated as in + Solaris (patch by David Mosberger ). + + add a limit-check for wresize() to ensure that a subwindow does not + address out of bounds. + + correct offsets used for subwindows in wresize() (patch by Michael + Andres ). + + regenerate html'ized manual pages with man2html 3.0.1 (patch by + Juergen Pfeifer). This generated a file with a space in its name, + which I removed. + + fix a few spelling errors in tack. + + modify tack/Makefile.in to match linker options of progs/Makefile.in; + otherwise it does not build properly for older HPUX shared library + configurations. + + add several terminfo entries from esr's "11.0". + +20000226 + + make 'tput flash' work properly for xterm by flushing output in + delay_output() when using napms(), and modifying xterm's terminfo to + specify no padding character. Otherwise, xterm's reported baud rate + can mislead ncurses into producing too few padding characters + (Debian #58530). + + add a check to tic for consistency between sgr and the separate + capabilities such as smso, use this to check/correct several + terminfo entries (Debian #58530). + + add a check to tic if cvvis is the same as cnorm, adjusted several + terminfo entries to remove the conflict (Debian #58530). + + correct prototype shown in attr_set()/wattr_set() manpages (fixes + Debian #53962). + + minor clarification for curs_set() and leaveok() manpages. + + use mkstemp() for creating temporary file for tic's processing of + $TERMCAP contents (fixes Debian #56465). + + correct two errors from integrating Alexander's changes: did not + handle the non-bce case properly in can_erase_with() (noted by + Alexander), and left fg/bg uninitialized in the pair-zero case of + _nc_do_color() (reported by Dr Werner Fink and + Ismael Cordeiro ). + +20000219 + + store default-color code consistently as C_MASK, even if given as + -1 for convenience (adapted from patches by Alexander V Lukyanov). + > patches by Alexander V Lukyanov: + + change can_clear_with() macro to accommodate logic for + assume_default_colors(), making most of the FILL_BCE logic + unnecessary. Made can_clear_with() an inline function to make it + simpler to read. + +20000212 + + corrected form of recent copyright dates. + + minor corrections to xterm-xf86-v333 terminfo entry -TD + > patches by Alexander V Lukyanov: + + reworded dft_fgbg.3x to avoid assuming that the terminal's default + colors are white on black. + + fix initialization of tstLine so that it is filled with current blank + character in any case. Previously it was possible to have it filled + with old blank. The wrong over-optimization was introduced in 991002 + patch. (it is not very critical as the only bad effect is not using + clr_eos for clearing if blank has changed). + +20000205 + + minor corrections/updates to several terminfo entries: rxvt-basic, + vt520, vt525, ibm5151, xterm-xf86-v40 -TD + + modify ifdef's for poll() to allow it to use , thereby + allowing poll() to be used on Linux. + + add CF_FUNC_POLL macro to check if poll() is able to select from + standard input. If not we will not use it, preferring select() + (adapted from patch by Michael Pakovic ). + + update CF_SHARED_OPTS macro for SCO Unixware 7.1 to allow building + shared libraries (reported/tested by Thanh ). + + override $LANGUAGE in build to avoid incorrect ordering of keynames. + + correct CF_MATH_LIB parameter, must be sin(x), not sqrt(x). + +20000122 + + resync CF_CHECK_ERRNO and CF_LIB_PREFIX macros from tin and xterm -TD + + modify CF_MATH_LIB configure macro to parameterize the test function + used, for reuse in dialog and similar packages. + + correct tests for file-descriptors in OS/2 EMX mouse support. A + negative value could be used by FD_SET, causing the select() call + to wait indefinitely. + +20000115 + + additional fixes for non-bce terminals (handling of delete_character) + to work when assume_default_colors() is not specified. + + modify warning message from _nc_parse_entry() regarding extended + capability names to print only if tic/infocmp/toe have the -v flag + set, and not at all in ordinary user applications. Otherwise, this + warning would be shown for screen's extended capabilities in programs + that use the termcap interface (reported by Todd C Miller). + + modify use of _nc_tracing from programs such as tic so their debug + level is not in the same range as values set by trace() function. + + small panel header cleanup (patch by Juergen Pfeifer). + + add 'railroad' demo for termcap interface. + + modify 'tic' to write its usage message to stderr (patch by Todd C + Miller). + +20000108 + + add prototype for erase() to curses.h.in, needed to make test + programs build with c++/g++. + + add .c.i and .c.h suffix rules to generated makefiles, for debugging. + + correct install rule for tack.1; it assumed that file was in the + current directory (reported by Mike Castle ). + + modify terminfo/termcap translation to suppress acsc before trying + sgr if the entry would be too large (patch by Todd C Miller). + + document a special case of incompatibility between ncurses 4.2 and + 5.0, add a section for this in INSTALL. + + add TRACE_DATABASE flag for trace(). + +20000101 + + update mach, add mach-color terminfo entries based on Debian diffs + for ncurses 5.0 -TD + + add entries for xterm-hp, xterm-vt220, xterm-vt52 and xterm-noapp + terminfo entries -TD + + change OTrs capabilities to rs2 in terminfo.src -TD + + add obsolete and extended capabilities to 'screen' terminfo -TD + + corrected conversion from terminfo rs2 to termcap rs (cf: 980704) + + make conversion to termcap ug (underline glitch) more consistently + applied. + + fix out-of-scope use of 'personal[]' buffer in 'toe' (this error + was in the original pre-1.9.7 version, when $HOME/.terminfo was + introduced). + + modify 'toe' to ignore terminfo directories to which it has no + permissions. + + modify read_termtype(), fixing 'toe', which could dump core when it + found an incomplete entry such as "dumb" because it did not + initialize its buffer for _nc_read_file_entry(). + + use -fPIC rather than -fpic for shared libraries on Linux, not + needed for i386 but some ports (from Debian diffs for 5.0) -TD + + use explicit VALID_NUMERIC() checks in a few places that had been + overlooked, and add a check to ensure that init_tabs is nonzero, + to avoid divide-by-zero (reported by Todd C Miller). + + minor fix for CF_ANSI_CC_CHECK configure macro, for HPUX 10.x (from + tin) -TD + +19991218 + + reorder tests during mouse initialization to allow for gpm to run in + xterm, or for xterm to be used under OS/2 EMX. Also drop test for + $DISPLAY in favor of kmous=\E[M or $TERM containing "xterm" (report + by Christian Weisgerber ). + + modify raw() and noraw() to clear/restore IEXTEN flag which affects + stty lnext on systems such as FreeBSD (report by Bruce Evans + , via Jason Evans ). + + fix a potential (but unlikely) buffer overflow in failed() function + of tset.c (reported by Todd C Miller). + + add manual-page for ncurses extensions, documented curses_version(), + use_extended_names(). + +19991211 + + treat as untranslatable to termcap those terminfo strings which + contain non-decimal formatting, e.g., hexadecimal or octal. + + correct commented-out capabilities that cannot be translated to + termcap, which did not check if a colon must be escaped. + + correct termcap translation for "%>" and "%+", which did not check + if a colon must be escaped, for instance. + + use save_string/save_char for _nc_captoinfo() to eliminate fixed + buffer (originally for _nc_infotocap() in 960301 -TD). + + correct expression used for terminfo equivalent of termcap %B, + adjust regent100 entry which uses this. + + some cleanup and commenting of ad hoc cases in _nc_infotocap(). + + eliminate a fixed-buffer in tic, used for translating comments. + + add manpage for infotocap + +19991204 + + add kvt and gnome terminfo entries -TD + + correct translation of "%%" by infotocap, which was emitted as "%". + + add "obsolete" termcap strings to terminfo.src + + modify infocmp to default to showing obsolete capabilities rather + than terminfo only. + + modify write_entry.c so that if extended names (i.e., configure + --enable-tcap-names) are active, then tic will also write "obsolete" + capabilities that are present in the terminfo source. + + modify tic so that when running as captoinfo or infotocap, it + initializes the output format as in -C and -I options, respectively. + + improve infocmp and tic -f option by splitting long strings that do + not have if-then-else construct, but do have parameters, e.g., the + initc for xterm-88color. + + refine MKtermsort.sh slightly by using bool for the *_from_termcap + arrays. + +19991127 + + additional fixes for non-bce terminals (handling of clear_screen, + clr_eol, clr_eos, scrolling) to work when assume_default_colors() is + not specified. + + several small changes to xterm terminfo entries -TD. + + move logic for _nc_windows in lib_freeall.c inside check for nonnull + SP, since it is part of that struct. + + remove obsolete shlib-versions, which was unintentionally re-added + in 970927. + + modify infocmp -e, -E options to ensure that generated fallback.c + type for Booleans agrees with term.h (reported by Eric Norum + ). + + correct configure script's use of $LIB_PREFIX, which did not work + for installing the c++ directory if $libdir did not end with "/lib" + (reported by Huy Le ). + + modify infocmp so -L and -f options work together. + + modify the initialization of SP->_color_table[] in start_color() so + that color_content() will return usable values for COLORS greater + than 8. + + modify ncurses 'd' test in case COLORS is greater than 16, e.g., for + xterm-88color, to limit the displayed/computed colors to 16. + > patch by Juergen Pfeifer: + + simplify coding of the panel library according to suggestions by + Philippe Blain. + + improve macro coding for a few macros in curses.priv.h + +19991113 + + modify treatment of color pair 0 so that if ncurses is configured + to support default colors, and they are not active, then ncurses + will set that explicitly, not relying on orig_colors or orig_pair. + + add new extension, assume_default_colors() to provide better control + over the use of default colors. + + modify test programs to use more-specific ifdef's for existence of + wresize(), resizeterm() and use_default_colors(). + + modify configure script to add specific ifdef's for some functions + that are included when --enable-ext-funcs is in effect, so their + existence can be ifdef'd in the test programs. + + reorder some configure options, moving those extensions that have + evolved from experimental status into a new section. + + change configure --enable-tcap-names to enable this by default. + +19991106 + + install tack's manpage (reported by Robert Weiner + ) + + correct worm.c's handling of KEY_RESIZE (patch by Frank Heckenbach). + + modify curses.h.in, undef'ing some symbols to avoid conflict with C++ + STL (reported by Matt Gerassimoff ) + +19991030 + + modify linux terminfo entry to indicate that dim does not mix with + color (reported by Klaus Weide ). + + correct several typos in terminfo entries related to missing '[' + in CSI's -TD + + fix several compiler warnings in c++ binding (reported by Tim + Mooney for alphaev56-dec-osf4.0f + + rename parameter of _nc_free_entries() to accommodate lint. + + correct lint rule for tack, used incorrect list of source files. + + add case to config.guess, config.sub for Rhapsody. + + improve configure tests for libg++ and libstdc++ by omitting the + math library (which is missing on Rhapsody), and improved test for + the math library itself (adapted from path by Nelson H. F. Beebe). + + explicitly initialize to zero several data items which were + implicitly initialized, e.g., cur_term. If not explicitly + initialized, their storage type is C (common), and causes problems + linking on Rhapsody 5.5 using gcc 2.7.2.1 (reported by Nelson H. F. + Beebe). + + modify Ada95 binding to not include the linker option for Ada + bindings in the Ada headers, but in the Makefiles instead (patch by + Juergen Pfeifer). + +19991023 5.0 release for upload to ftp.gnu.org + + effective with release of 5.0, change NCURSES_VERSION_PATCH to + 4-digit year. + + add function curses_version(), to return ncurses library version + (request by Bob van der Poel). + + remove rmam, smam from cygwin terminfo entry. + + modify FreeBSD cons25 terminfo entry to add cnorm and cvvis, as well + as update ncv to indicate that 'dim' conflicts with colors. + + modify configure script to use symbolic links for FreeBSD shared + libraries by default. + + correct ranf() function in rain and worm programs to ensure it does + not return 1.0 + + hide the cursor in hanoi.c if it is running automatically. + + amend lrtest.c to account for optimizations that exploit margin + wrapping. + + add a simple terminfo demo, dots.c + + modify SIGINT/SIGQUIT handler to set a flag used in _nc_outch() to + tell it to use write() rather than putc(), since the latter is not + safe in a signal handler according to POSIX. + + add/use internal macros _nc_flush() and NC_OUTPUT to hide details + of output-file pointer in ncurses library. + + uncomment CC_SHARED_OPTS (see 971115), since they are needed for SCO + OpenServer. + + correct CC_SHARED_OPTS for building shared libraries for SCO + OpenServer. + + remove usleep() from alternatives in napms(), since it may interact + with alarm(), causing a process to be interrupted by SIGALRM (with + advice from Bela Lubkin). + + modify terminal_interface-curses-forms.ads.m4 to build/work with + GNAT 3.10 (patch by Juergen Pfeifer). + + remove part of CF_GPP_LIBRARY configure-script macro, which did not + work with gcc 2.7.2.3 + + minor fix to test/tclock.c to avoid beeping more than once per second + + add 's' and ' ' decoding to test/rain.c + +991016 pre-release + + corrected BeOS code for lib_twait.c, making nodelay() function work. + +991009 pre-release + + correct ncurses' value for cursor-column in PutCharLR(), which was + off-by-one in one case (patch by Ilya Zakharevich). + + fix some minor errors in position_check() debugging code, found while + using this to validate the PutCharLR() patch. + + modify firework, lrtest, worm examples to be resizable, and to + recognize 'q' for quit, 's' for single-step and ' ' for resume. + + restore reverted change to terminal_interface-curses-forms.ads.m4, + add a note on building with gnat 3.10p to Ada95/TODO. + + add a copy of the standalone configure script for the test-directory + to simplify testing on SCO and Solaris. + +991002 pre-release + + minor fixes for _nc_msec_cost(), color_content(), pair_content(), + _nc_freewin(), ClrBottom() and onscreen_mvcur() (analysis by Philippe + Blain, comments by Alexander V Lukyanov). + + simplify definition of PANEL and eliminate internal functions + _nc_calculate_obscure(), _nc_free_obscure() and _nc_override(), + (patch by Juergen Pfeifer, analysis by Philippe Blain + )). + + change renaming of dft_fgbg.3x to use_default_colors.3ncurses in + man_db.renames, since Debian is not concerned with 14-character + filename limitation (Debian bug report by Josip Rodin + ). + + corrected scoansi terminfo entry by testing with scoterm and console. + + revert change from 990614 to terminal_interface-curses-forms.ads.m4, + since this does not work for gnat 3.10p + + modify tclock example to be resizable (if ncurses' sigwinch handler + is used), and in color. + + use $(CC) rather than 'gcc' in MK_SHARED_LIB symbols, used for Linux + shared library rules. + +990925 pre-release + + add newer NetBSD console terminfo entries + + add amiga-8bit terminfo entry (from Henning 'Faroul' Peters + ) + + remove -lcurses -ltermcap from configure script's check for the gpm + library, since they are not really necessary (a properly configured + gpm library has no dependency on any curses library), and if the + curses library is not installed, this would cause the test to fail. + + modify tic's -C option so that terminfo "use=" clauses are translated + to "tc=" clauses even when running it as captoinfo. + + modify CF_STDCPP_LIBRARY configure macro to perform its check only + for GNU C++, since that library conflicts with SGI's libC on IRIX-6.2 + + modify CF_SHARED_OPTS configure macro to support build on NetBSD with + ELF libraries (patch by Bernd Ernesti ). + + correct a problem in libpanel, where the _nc_top_panel variable was + not set properly when bottom_panel() is called to hide a panel which + is the only one on the stack (report/analysis by Michael Andres + , patch by Juergen Pfeifer). + +990918 pre-release + + add acsc string to HP 70092 terminfo entry (patch by Joerg Wunsch + ). + + add top-level uninstall.data and uninstall.man makefile rules. + + correct logic of CF_LINK_FUNCS configure script, from BeOS changes so + that hard-links work on Unix again. + + change default value of cf_cv_builtin_bool to 1 (suggested by + Jeremy Buhler), making it less likely that a conflicting declaration + of bool will be seen when compiling with C++. + +990911 pre-release + + improved configure checks for builtin.h + + minor changes to C++ binding (remove static initializations, and make + configure-test for parameter initializations) for features not + allowed by vendor's C++ compilers (reported by Martin Mokrejs, this + applies to SGI, though I found SCO has the same characteristics). + + corrected quoting of ETIP_xxx definitions which support old versions + of g++, e.g., those using -lg++ + + remove 'L' code from safe_sprintf.c, since 'long double' is not + widely portable. safe_sprintf.c is experimental, however, and + exists mainly as a fallback for systems without snprintf (reported + by Martin Mokrejs , for IRIX 6.2) + + modify definition of _nc_tinfo_fkeys in broken-linker configuration + so that it is not unnecessarily made extern (Jeffrey C Honig). + +990904 pre-release + + move definition for builtin.h in configure tests to specific check + for libg++, since qt uses the same filename incompatibly. + + correct logic of lib_termcap.c tgetstr function, which did not copy + the result to the buffer parameter. Testing shows Solaris does + update this, though of course tgetent's buffer is untouched (reported + in Peter Edwards in + mpc.lists.freebsd.current newsgroup. + + corrected beterm terminfo entry, which lists some capabilities which + are not actually provided by the BeOS Terminal. + + add special logic to replace select() calls on BeOS, whose select() + function works only for sockets. + + correct missing escape in mkterm.h.awk.in, which caused part + of the copyright noticed to be omitted (reported by Peter + Wemm ). + > several small changes to make the c++ binding and demo work on OS/2 + EMX (related to a clean reinstall of EMX): + + correct library-prefix for c++ binding; none is needed. + + add $x suffix to make_hash and make_keys so 'make distclean' works. + + correct missing $x suffix for tack, c++ demo executables. + + split CF_CXX_LIBRARY into CF_GPP_LIBRARY (for -lg++) and + CF_STDCPP_LIBRARY (for -lstdc++) + +990828 pre-release + + add cygwin terminfo entry -TD + + modify CF_PROG_EXT configure macro to set .exe extension for cygwin. + + add configure option --without-cxx-binding, modifying the existing + --without-cxx option to check only for the C++ compiler + characteristics. Whether or not the C++ binding is needed, the + configure script checks for the size/type of bool, to make ncurses + match. Otherwise C++ applications cannot use ncurses. + +990821 pre-release + + updated configure macros CF_MAKEFLAGS, CF_CHECK_ERRNO + + minor corrections to beterm terminfo entry. + + modify lib_setup.c to reject values of $TERM which have a '/' in + them. + + add ifdef's to guard against CS5, CS6, CS7, CS8 being zero, as more + than one is on BeOS. That would break a switch statement. + + add configure macro CF_LINK_FUNCS to detect and work around BeOS's + nonfunctional link(). + + improved configure macros CF_BOOL_DECL and CF_BOOL_SIZE to detect + BeOS's bool, which is declared as an unsigned char. + +990814 pre-release + + add ms-vt100 terminfo entry -TD + + minor fixes for misc/emx.src, based on testing with tack. + + minor fix for test/ncurses.c, test 'a', in case ncv is not set. + +990731 pre-release + + minor correction for 'screen' terminfo entry. + + clarify description of errret values for setupterm in manpage. + + modify tput to allow it to emit capabilities for hardcopy terminals + (patch by Goran Uddeborg ). + + modify the 'o' (panel) test in ncurses.c to show the panels in color + or at least in bold, to test Juergen's change to wrefresh(). + > patches by Juergen Pfeifer: + + Fixes a problem using wbkgdset() with panels. It has actually + nothing to with panels but is a problem in the implementation of + wrefresh(). Whenever a window changes its background attribute to + something different than newscr's background attribute, the whole + window is touched to force a copy to newscr. This is an unwanted + side-effect of wrefresh() and it is actually not necessary. A + changed background attribute affects only further outputs of + background it doesn't mean anything to the current content of the + window. So there is no need to force a copy. (reported by Frank + Heckenbach ). + + an upward compatible enhancement of the NCursesPad class in the C++ + binding. It allows one to add a "viewport" window to a pad and then + to use panning to view the pad through the viewport window. + +990724 pre-release + + suppress a call to def_prog_mode() in the SIGTSTP handler if the + signal was received while not in curses mode, e.g., endwin() was + called in preparation for spawning a shell command (reported by Frank + Heckenbach ) + + corrected/enhanced xterm-r5, xterm+sl, xterm+sl-twm terminfo entries. + + change test for xterm mouse capability: it now checks only if the + user's $DISPLAY variable is set in conjunction with the kmous + capability being present in the terminfo. Before, it checked if any + of "xterm", "rxvt" or "kterm" were substrings of the terminal name. + However, some emulators which are incompatible with xterm in other + ways do support the xterm mouse capability. + + reviewed and made minor changes in ncurses to quiet g++ warnings + about shadowed or uninitialized variables. g++ incorrectly warns + about uninitialized variables because it does not take into account + short-circuit expression evaluation. + + change ncurses 'b' test to start in color pair 0 and to show in the + right margin those attributes which are suppressed by no_color_video, + i.e., "(NCV)". + + modify ifdef's in curses.h so that __attribute__ is not redefined + when compiling with g++, but instead disabled the macros derived for + __attribute__ since g++ does not consistently recognize the same + keywords as gcc (reported by Stephan K Zitz ). + + update dependencies for term.h in ncurses/modules (reported by + Ilya Zakharevich). + +990710 pre-release + + modify the form demo in ncurses.c to illustrate how to manipulate the + field appearance, e.g, for highlighting or translating the field + contents. + + correct logic in write_entry from split-out of home_terminfo in + 980919, which prevented update of $HOME/.terminfo (reported by Philip + Spencer ). + +990703 pre-release + + modify linux terminfo description to make use of kernel 2.2.x mods + that support cursor style, e.g., to implement cvvis (patch by Frank + Heckenbach ) + + add special-case in setupterm to retain previously-saved terminal + settings in cur_term, which happens when curses and termcap calls are + mixed (from report by Bjorn Helgaas ). + + suppress initialization of key-tries in _nc_keypad() if we are only + disabling keypad mode, e.g., in endwin() called when keypad() was + not. + + modify the Ada95 makefile to ensure that always the Ada files from + the development tree are used for building and not the eventually + installed ones (patch by Juergen Pfeifer). + +990626 pre-release + + use TTY definition in tack/sysdep.c rather than struct termios + (reported by Philippe De Muyter). + + add a fallback for strstr, used in lib_mvcur.c and tack/edit.c, + not present on sysV68 (reported by Philippe De Muyter). + + correct definition in comp_hash.c to build with configure + --with-rcs-ids option. + +990619 pre-release + + modified ifdef's for sigaction and sigvec to ensure we do not try to + handle SIGTSTP if neither is available (from report by Philippe De + Muyter). + > patch by Philippe De Muyter: + + in tic.c, use `unlink' if `remove' is not available. + + use only `unsigned' as fallback value for `speed_t'. Some files used + `short' instead. + +990616 pre-release + + fix some compiler warnings in tack. + + add a check for predefined bool type in CC, based on report that + BeOS predefines a bool type. + + correct logic for infocmp -e option, i.e., the configure + --with-fallbacks option, which I'd not updated when implementing + extended names (cf: 990301). The new implementation adds a "-E" + option to infocmp -TD + > patch by Juergen Pfeifer: + + introduce the private type Curses_Bool in the Ada95 binding + implementation. This is to clearly represent the use of "bool" also + in the binding. It should have no effect on the generated code. + + improve the man page for field_buffer() to tell the people, that the + whole buffer including leading/trailing spaces is returned. This is + a common source of confusion, so it's better to document it clearly. + +990614 pre-release + > patch by Juergen Pfeifer: + + use pragma PreElaborate in several places. + + change a few System.Address uses to more specific types. + + change interface version-number to 1.0 + + regenerate Ada95 HTML files. + +990612 pre-release + + modify lib_endwin.c to avoid calling reset_shell_mode(), return ERR + if it appears that curses was never initialized, e.g., by initscr(). + For instance, this guards against setting the terminal modes to + strange values if endwin() is called after setupterm(). In the same + context, Solaris curses will dump core. + + modify logic that avoids a conflict in lib_vidattr.c between sgr0 and + equivalent values in rmso or rmul by ensuring we do not modify the + data which would be returned by the terminfo or termcap interfaces + (reported by Brad Pepers , cf: 960706). + + add a null-pointer check for SP in lib_vidattr.c to logic that checks + for magic cookies. + + improve fallback declaration of 'bool' when the --without-cxx option + is given, by using a 'char' on i386 and related hosts (prompted by + discussion with Alexander V Lukyanov). + +990605 pre-release + + include time.h in lib_napms.c if nanosleep is used (patch by + R Lindsay Todd ). + + add an "#undef bool" to curses.h, in case someone tries to define it, + e.g., perl. + + add check to tparm to guard against divide by zero (reported by Aaron + Campbell ). + +990516 pre-release + + minor fix to build tack on CLIX (mismatched const). + > patch by Juergen Pfeifer: + + change Juergen's old email address with new one in the files where it + is referenced. The Ada95 HTML pages are regenerated. + + update MANIFEST to list the tack files. + +990509 pre-release + + minor fixes to make 'tack' build/link on NeXT (reported by Francisco + A. Tomei Torres). + +990417 pre-release + + add 'tack' program (which is GPL'd), updating it to work with the + modified TERMTYPE struct and making a fix to support setaf/setab + capabilities. Note that the tack program is not part of the + ncurses libraries, but an application which can be distributed with + ncurses. The configure script will ignore the directory if it is + omitted, however. + + modify gpm mouse support so that buttons 2 and 3 are used for + select/paste only when shift key is pressed, making them available + for use by an application (patch by Klaus Weide). + + add complete list of function keys to scoansi terminfo entry - TD + +990410 pre-release + + add a simple test program cardfile.c to illustrate how to read form + fields, and showing forms within panels. + + change shared-library versioning for the Hurd to be like Linux rather + than *BSD (patch by Mark Kettenis ). + + add linux-lat terminfo entry. + + back-out _nc_access check in read_termcap.c (both incorrect and + unnecessary, except to guard against a small window where the file's + ownership may change). + +990403 pre-release + + remove conflicting _nc_free_termtype() function from test module + lib_freeall.c + + use _nc_access check in read_termcap.c for termpaths[] array (noted + by Jeremy Buhler, indicating that Alan Cox made a similar patch). + > patch by Juergen Pfeifer: + + modify menu creation to not inherit status flag from the default menu + which says that the associated marker string has been allocated and + should be freed (bug reported by Marek Paliwoda" + ) + +990327 pre-release (alpha.gnu.org:/gnu/ncurses-5.0-beta1.tar.gz) + + minor fixes to xterm-xfree86 terminfo entry - TD. + + split up an expression in configure script check for ldconfig to + workaround limitation of BSD/OS sh (reported by Jeff Haas + ). + + correct a typo in man/form_hook.3x (Todd C Miller). + +990318 pre-release + + parenthesize and undef 'index' symbol in c++ binding and demo, to + accommodate its definition on NeXT (reported by Francisco A. Tomei + Torres). + + add sigismember() to base/sigaction.c compatibility to link on NeXT + (reported by Francisco A. Tomei Torres). + + further refinements to inequality in hashmap.c to cover a case with + ^U in nvi (patch by Alexander V Lukyanov). + +990316 pre-release + + add fallback definition for getcwd, to link on NeXT. + + add a copy of cur_term to tic.c to make it link properly on NeXT + (reported by Francisco A. Tomei Torres). + + change inequality in hashmap.c which checks the distance traveled by + a chunk so that ^D command in nvi (scrolls 1/2 screen) will use + scrolling logic (patch by Alexander V Lukyanov, reported by Jeffrey + C Honig). + +990314 pre-release + + modify lib_color.c to handle a special case where the curscr + attributes have been made obsolete (patch by Alexander V Lukyanov). + + update BSD/OS console terminfo entries to use klone+sgr and + klone+color (patch by Jeffrey C Honig). + + update glibc addon configure script for extended capabilities. + + correct a couple of warnings in the --enable-const configuration. + + make comp_hash build properly with _nc_strdup(), on NeXT (reported by + Francisco A. Tomei Torres ). + +990313 pre-release + + correct typos in linux-c initc string - TD + + add 'crt' terminfo entry, update xterm-xfree86 entry - TD + + remove a spurious argument to tparm() in lib_sklrefr.c (patch by + Alexander V Lukyanov). + +990307 pre-release + + back-out change to wgetch because it causes a problem with ^Z + handling in lynx (reported by Kim DeVaughn). + +990306 pre-release + + add -G option to tic and infocmp, to reverse the "-g" option. + + recode functions in name_match.c to avoid use of strncpy, which + caused a 4-fold slowdown in tic (cf: 980530). + + correct a few warnings about sign-extension in recent changes. + > patch by Juergen Pfeifer: + + fixes suggested by Jeff Bradbury : + + improved parameter checking in new_fieldtype(). + + fixed a typo in wgetch() timeout handling. + + allow slk_init() to be called per newterm call. The internal SLK + state is stored in the SCREEN struct after every newterm() and then + reset for the next newterm. + + fix the problem that a slk_refresh() refreshes stdscr if the + terminal has true SLKs. + + update HTML documentation for Ada binding. + +990301 pre-release + + remove 'bool' casts from definitions of TRUE/FALSE so that statements + such as "#if TRUE" work. This was originally done to allow for a C++ + compiler which would warn of implicit conversions between enum and + int, but is not needed for g++ (reported by Kim DeVaughn). + + add use_extended_names() function to allow applications to suppress + read of the extended capabilities. + + add configure option --enable-tcap-names to support logic which + allows ncurses' tic to define new (i.e., extended) terminal + capabilities. This is activated by the tic -x switch. The infocmp + program automatically shows or compares extended capabilities. + Note: This changes the Strings and similar arrays in the TERMTYPE + struct so that applications which manipulate it must be recompiled. + + use macros typeMalloc, typeCalloc and typeRealloc consistently + throughout ncurses library. + + add _nc_strdup() to doalloc.c. + + modify define_key() to allow multiple strings to be bound to the + same keycode. + + correct logic error in _nc_remove_string, from 990220. + > patch for Ada95 binding (Juergen Pfeifer): + + regenerate some of the html documentation + + minor cleanup in terminal_interface-curses.adb + +990220 pre-release + + resolve ambiguity of kend/kll/kslt and khome/kfnd/kich1 strings in + xterm and ncsa terminfo entries by removing the unneeded ones. Note + that some entries will return kend & khome versus kslt and kfnd, for + PC-style keyboards versus strict vt220 compatibility - TD + + add function keybound(), which returns the definition associated with + a given keycode. + + modify define_key() to undefine the given string when no keycode is + given. + + modify keyok() so it works properly if there is more than one string + defined for a keycode. + + add check to tic to warn about terminfo descriptions that contain + more than one key assigned to the same string. This is shown only if + the verbose (-v) option is given. Moved related logic (tic -v) from + comp_parse.c into the tic program. + + add/use _nc_trace_tries() to show the function keys that will be + recognized. + + rename init_acs to _nc_init_acs (request by Alexander V Lukyanov). + > patch for Ada95 binding (Juergen Pfeifer): + + remove all the *_adabind.c from ncurses, menu and form projects. + Those little helper routines have all been implemented in Ada and are + no longer required. + + The option handling routines in menu and form have been made more + save. They now make sure that the unused bits in options are always + zero. + + modify configuration scripts to + + use gnatmake as default compiler name. This is a safer choice than + gcc, because some GNAT implementations use other names for the + compilerdriver to avoid conflicts. + + use new default installation locations for the Ada files according + to the proposed GNU Ada filesystem standard (for Linux). + + simplify the Makefiles for the Ada binding + + rename ada_include directory to src. + +990213 + + enable sigwinch handler by default. + + disable logic that allows setbuf to be turned off/on, because some + implementations will overrun the buffer after it has been disabled + once. + +990206 + + suppress sc/rc capabilities from terminal description if they appear + in smcup/rmcup. This affects only scrolling optimization, to fix a + problem reported by several people with xterm's alternate screen, + though the problem is more general. + > patch for Ada95 binding (Juergen Pfeifer): + + removed all pragma Preelaborate() stuff, because the just released + gnat-3.11p complains on some constructs. + + fixed some upper/lower case notations because gnat-3.11p found + inconsistent use. + + used a new method to generate the HTML documentation of the Ada95 + binding. This invalidates nearly the whole ./Ada95/html subtree. + Nearly all current files in this subtree are removed + +990130 + + cache last result from _nc_baudrate, for performance (suggested by + Alexander V Lukyanov). + + modify ClrUpdate() function to workaround a problem in nvi, which + uses redrawwin in SIGTSTP handling. Jeffrey C Honig reported that + ncurses repainted the screen with nulls before resuming normal + operation (patch by Alexander V Lukyanov). + + generalize is_xterm() function a little by letting xterm/rxvt/kterm + be any substring rather than the prefix. + + modify lib_data.c to initialize SP. Some linkers, e.g., IBM's, will + not link a module if the only symbols exported from the module are + uninitialized ones (patch by Ilya Zakharevich). Ilya says that he + has seen messages claiming this behavior conforms to the standard.) + + move call on _nc_signal_handler past _nc_initscr, to avoid a small + window where Nttyb hasn't yet been filled (reported by Klaus Weide). + + modify lib_tstp.c to block SIGTTOU when handling SIGTSTP, fixes a + problem where ncurses applications which were run via a shell script + would hang when given a ^Z. Also, check if the terminal's process + group is consistent, i.e., a shell has not taken ownership of it, + before deciding to save the current terminal settings in the SIGTSTP + handler (patch by Klaus Weide). + + correct spelling of ACS_ names in curs_border.3x (reported by Bob van + der Poel ). + + correct a couple of typos in the macros supporting the configure + --with-shlib-version option. + +990123 + + modify fty_regex.c to compile on HAVE_REGEXPR_H_FUNCS machine (patch + by Kimio Ishii ). + + rename BSDI console terminfo entries: bsdos to bsdos-pc-nobold, and + bsdos-bold to bsdos-pc (patch by Jeffrey C Honig). + + modify tput to accept termcap names as an alternative to terminfo + names (patch by Jeffrey C Honig). + + correct a typo in term.7 (Todd C Miller). + + add configure --with-shlib-version option to allow installing shared + libraries named according to release or ABI versions. This + parametrizes some existing logic in the configure script, and is + intended for compatibility upgrades on Digital Unix, which used + versioned libraries in ncurses 4.2, but no longer does (cf: 980425). + + resync configure script against autoconf 2.13 + patches + + minor improvements for teraterm terminfo entry based on the program's + source distribution. + +990116 + + change default for configure --enable-big-core to assume machines do + have enough memory to resolve terminfo.src in-memory. + + correct name of ncurses library in TEST_ARGS when configuring with + debug library. + + minor fixes to compile ncurses library with broken-linker with g++. + + add --enable-broken-linker configure option, default to environment + variable $BROKEN_LINKER (request by Jeffrey C Honig). + + change key_names[] array to static since it is not part of the curses + interface (reported by Jeffrey C Honig ). + +990110 + + add Tera Term terminfo entry - TD + +990109 + + reviewed/corrected macros in curses.h as per XSI document. + + provide support for termcap PC variable by copying it from terminfo + data and using it as the padding character in tputs (reported by + Alexander V Lukyanov). + + corrected iris-ansi and iris-ansi-ap terminfo entries for kent and + kf9-kf12 capabilities, as well as adding kcbt. + + document the mouse handling mechanism in menu_driver and make a small + change in menu_driver's return codes to provide more consistency + (patch by Juergen Pfeifer). + + add fallback definition for NCURSES_CONST to termcap.h.in (reported + by Uchiyama Yasushi ). + + move lib_restart.c to ncurses/base, since it uses curses functions + directly, and therefore cannot be used in libtinfo.so + + rename micro_char_size to micro_col_size, adding #define to retain + old name. + + add set_a_attributes and set_pglen_inch to terminfo structure, as per + XSI and Solaris 2.5. + + minor makefile files to build ncurses test_progs + + update html files in misc directory to reflect changes since 4.2 + +990102 + + disable scroll hints when hashmap is enabled (patch by Alexander + V Lukyanov). + + move logic for tic's verify of -e option versus -I and -C so that the + terminfo data is not processed if we cannot handle -e (reported by + Steven Schwartz . + + add test-driver traces to terminfo and termcap functions. + + provide support for termcap ospeed variable by copying it from the + internal cur_term member, and using ospeed as the baudrate reference + for the delay_output and tputs functions. If an application does not + set ospeed, the library behaves as before, except that _nc_timed_wait + is no longer used, or needed, since ospeed always has a value. But + the application can modify ospeed to adjust the output of padding + characters (prompted by a bug report for screen 3.7.6 and email from + Michael Schroeder ). + + removed some unused ifdef's as part of Alexander's restructuring. + + reviewed/updated curses.h, term.h against X/Open Curses Issue 4 + Version 2. This includes making some parameters NCURSES_CONST + rather than const, e.g., in termcap.h. + + change linux terminfo entry to use ncv#2, since underline does not + work with color + +981226 + + miscellaneous corrections for curses.h to match XSI. + + change --enable-no-padding configure option to be normally enabled. + + add section to ncurses manpage for environment variables. + + investigated Debian bug report that pertains to screen 3.7.4/3.7.6 + changes, found no sign of problems on Linux (or on SunOS, Solaris) + running screen built with ncurses. + + check if tmp_fp is opened in tic.c before closing it (patch by Pavel + Roskin ). + + correct several font specification typos in man-pages. + +981220 + + correct default value for BUILD_CC (reported by Larry Virden). + +981219 + + modify _nc_set_writedir() to set a flag in _nc_tic_dir() to prevent + it from changing the terminfo directory after chdir'ing to it. + Otherwise, a relative path in $TERMINFO would confuse tic (prompted + by a Debian bug report). + + correct/update ncsa terminfo entry (report by Larry Virden). + + update xterm-xfree86 terminfo to current (patch 90), smcur/rmcur + changes + + add Mathew Vernon's mach console entries to terminfo.src + + more changes, moving functions, as part of Alexander's restructuring. + + modify configure script for GNU/Hurd share-library support, introduce + BUILD_CC variable for cross compiling (patch by Uchiyama Yasushi + ) + +981212 + + add environment variable NCURSES_NO_SETBUF to allow disabling the + setbuf feature, for testing purposes. + + correct ifdef's for termcap.h versus term.h that suppress redundant + declarations of prototypes (reported by H.J.Lu). + + modify Makefile.os2 to add linker flags which allow multiple copies + of an application to coexist (reported by Ilya Zakharevich). + + update Makefile.glibc and associated configure script so that ncurses + builds as a glibc add-on with the new directory configuration + (reported by H.J.Lu). + +981205 + + modify gen_reps() function in gen.c to work properly on SunOS + (sparc), which is a left-to-right architecture. + + modify relative_move and tputs to avoid an interaction with the + BSD-style padding. The relative_move function could produce a string + to replace on the screen which began with a numeric character, which + was then interpreted by tputs as padding. Now relative_move will not + generate a string with a leading digit in that case (overwrite). + Also, tputs will only interpret padding if the string begins with a + digit; as coded it permitted a string to begin with a decimal point + or asterisk (reported by Larry Virden). + > patches by Juergen Pfeifer: + + fix a typo in m_driver.c mouse handling and improves the error + handling. + + fix broken mouse handling in the Ada95 binding + + make the Ada95 sample application menus work with the new menu mouse + support + + improve the mouse handling introduced by Ilya; it now handles menus + with spacing. + + repair a minor bug in the menu_driver code discovered during this + rework. + + add new function wmouse_trafo() to hide implementation details of + _yoffset member of WINDOW struct needed for mouse coordinate + transformation. + +981128 + + modify Ada95/gen/gen.c to avoid using return-value of sprintf, since + some older implementations (e.g., SunOS 4.x) return the buffer + address rather than its length. + > patch by Rick Ohnemus: + + modify demo.cc to get it to compile with newer versions of egcs. + + trim a space that appears at the end of the table preprocessor lines + ('\" t). This space prevents some versions of man from displaying + the pages - changed to remove all trailing whitespace (TD) + + finally, 'make clean' does not remove panel objects. + > patches by Ilya Zakharevich: + + allow remapping of OS/2 mouse buttons using environment variable + MOUSE_BUTTONS_123 with the default value 132. + + add mouse support to ncurses menus. + +981121 + + modify misc/makedef.cmd to report old-style .def file symbols, and to + generate the .def files sorted by increasing names rather than the + reverse. + + add misc/*.ref which are J.J.G.Ripoll's dll definition files (renamed + from misc/*.old), and updated based on the entrypoint coding he used + for an older version of ncurses. + + add README.emx, to document how to build on OS/2 EMX. + + updates for config.guess, config.sub from Lynx + > patches by Ilya Zakharevich: + + minor fixes for mouse handling mode: + a) Do not initialize mouse if the request is to have no mouse; + b) Allow switching of OS/2 VIO mouse on and off. + + modify Makefile.os2 to support alternative means of generating + configure script, by translating Unix script with Perl. + > patches by Juergen Pfeifer: + + Updates MANIFEST to reflect changes in source structure + + Eliminates a problem introduced with my last patch for the C++ + binding in the panels code. It removes the update() call done in the + panel destructor. + + Changes in the Ada95 binding to better support systems where + sizeof(chtype)!=sizeof(int) (e.g. DEC Alpha). + +981114 + + modify install-script for manpages to skip over .orig and .rej files + (request by Larry Virden). + > patches/discussion by Alexander V Lukyanov: + + move base-library sources into ncurses/base and tty (serial terminal) + sources into ncurses/tty, as part of Alexander V Lukyanov's proposed + changes to ncurses library. + + copy _tracemouse() into ncurses.c so that lib_tracemse.c need not + be linked into the normal ncurses library. + + move macro winch to a function, to hide details of struct ldat + > patches by Juergen Pfeifer: + + fix a potential compile problem in cursesw.cc + + some Ada95 cosmetics + + fix a gen.c problem when compiling on 64-Bit machines + + fix Ada95/gen/Makefile.in "-L" linker switch + + modify Ada95 makefiles to use the INSTALL_PREFIX setting. + +981107 + + ifdef'd out lib_freeall.c when not configured. + + rename _tracebits() to _nc_tracebits(). + + move terminfo-library sources into ncurses/tinfo, and trace-support + functions into ncurses/trace as part of Alexander V Lukyanov's + proposed changes to ncurses library. + + modify generated term.h to always specify its own definitions for + HAVE_TERMIOS_H, etc., to guard against inclusion by programs with + broken configure scripts. + +981031 + + modify terminfo parsing to accept octal and hexadecimal constants, + like Solaris. + + remove an autoconf 2.10 artifact from the configure script's check + for "-g" compiler options. (Though harmless, this confused someone + at Debian, who recently issued a patch that results in the opposite + effect). + + add configure option --with-ada-compiler to accommodate installations + that do not use gcc as the driver for GNAT (patch by Juergen + Pfeifer). + +981017 + + ensure ./man exists in configure script, needed when configuring + with --srcdir option. + + modify infocmp "-r" option to remove limit on formatted termcap + output, which makes it more like Solaris' version. + + modify captoinfo to treat no-argument case more like Solaris' + version, which uses the contents of $TERMCAP as the entry to format. + + modify mk-2nd.awk to handle subdirectories, e.g., ncurses/tty + (patch by Alexander V Lukyanov). + +981010 + + modify --with-terminfo-dirs option so that the default value is the + ${datadir} value, unless $TERMINFO_DIRS is already set. This gets + rid of a hardcoded list of candidate directories in the configure + script. + + add some error-checking to _nc_read_file_entry() to ensure that + strings are properly terminated (Todd C Miller). + + rename manpage file curs_scr_dmp.3x to curs_scr_dump.3x, to + correspond with contents (reported by Neil Zanella + ). + + remove redundant configure check for C++ which did not work when $CXX + was specified with a full pathname (reported by Andreas Jaeger). + + corrected bcopy/memmove check; the macro was not standalone. + +981003 + + remove unnecessary portion of OS/2 EMX mouse change from + check_pending() (reported by Alexander V Lukyanov). + +980926 + + implement mouse support for OS/2 EMX (adapted from patch against + 4.2(?) by Ilya Zakharevich). + + add configure-check for bcopy/memmove, for 980919 changes to hashmap. + + merge Data General terminfo from Hasufin - TD + + merge AIX 3.2.5 terminfo descriptions for IBM terminals, replaces + some older entries - TD + + modify tic to compile into %'char' form in preference to %{number}, + since that is a little more efficient. + + minor correction to infocmp to avoid displaying "difference" between + two capabilities that are rendered in equivalent forms. + + add "-g" option to tic/infocmp to force character constants to be + displayed in quoted form. Otherwise their decimal values are shown. + + modify setupterm so that cancelled strings are treated the same as + absent strings, cancelled and absent booleans false (does not affect + tic, infocmp). + + modify tic, infocmp to discard redundant i3, r3 strings when output + to termcap format. + > patch by Alexander V Lukyanov: + + improve performance of tparm, now it takes 19% instead of 25% when + profiling worm. + + rename maxlen/minlen to prec/width for better readability. + + use format string for printing strings. + + use len argument correctly in save_text, and pass it to save_number. + +980919 + + make test_progs compile (but hashmap does not function). + + correct NC_BUFFERED macro, used in lib_mvcur test-driver, modify + associated logic to avoid freeing the SP->_setbuf data. + + add modules home_terminfo and getenv_num to libtinfo. + + move write_entry to libtinfo, to work with termcap caching. + + minor fixes to blue.c to build with atac. + + remove softscroll.c module; no longer needed for testing. + > patches by Todd C Miller: + + use strtol(3) instead of atoi(3) when parsing env variables so we can + detect a bogus (non-numeric) value. + + check for terminal names > MAX_NAME_SIZE in a few more places when + dealing with env variables again. + + fix a MAX_NAME_SIZE that should be MAX_NAME_SIZE+1 + + use sizeof instead of strlen(3) on PRIVATE_INFO since it is a fixed + string #define (compile time vs runtime). + + when setting errno to ENOMEM, set it right before the return, not + before code that could, possibly, set errno to a different value. + > patches by Alexander V Lukyanov: + + use default background in update_cost_from_blank() + + disable scroll-hints when hashmap is configured. + + improve integration of hashmap scrolling code, by adding oldhash and + newhash data to SP struct. + + invoke del_curterm from delscreen. + + modify del_curterm to set cur_term to null if it matches the + function's parameter which is deleted. + + modify lib_doupdate to prefer parm_ich to the enter_insert_mode and + exit_insert_mode combination, adjusting InsCharCost to check + enter_insert_mode, exit_insert_mode and insert_padding. Add + insert_padding in insert mode after each char. This adds new costs + to the SP struct. + +980912 + + modify test-driver in lib_mvcur.s to use _nc_setbuffer, for + consistent treatment. + + modify ncurses to restore output to unbuffered on endwin, and resume + buffering in refresh (see lib_set_term.c and NC_BUFFERED macro). + + corrected HTML version numbers (according to the W3C validator, they + never were HTML 2.0-compliant, but are acceptable 3.0). + +980905 + + modify MKterminfo.sh to generate terminfo.5 with tables sorted by + capability name, as in SVr4. + + modified term.h, termcap.h headers to avoid redundant declarations. + + change 'u_int' type in tset.c to unsigned, making this compile on + Sequent PRX 4.1 (reported by Michael Sterrett ). + +980829 + + corrections to mailing addresses, and moving the magic line that + causes the man program to invoke tbl to the first line of each + manpage (patch by Rick Ohnemus ). + + add Makefile.os2 and supporting scripts to generate dll's on OS/2 EMX + (from J.J.G.Ripoll, with further integration by TD). + + correct a typo in icl6404 terminfo entry. + + add xtermm and xtermc terminfo entries. + > from esr's terminfo version: + + Added Francesco Potorti's tuned Wyse 99 entries. + + dtterm enacs (from Alexander V Lukyanov). + + Add ncsa-ns, ncsa-m-ns and ncsa-m entries from esr version. + +980822 + + document AT&T acs characters in terminfo.5 manpage. + + use EMX _scrsize() function if terminfo and environment do not + declare the screen size (reported by Ilya Zakharevich + ). + + remove spurious '\' characters from eterm and osborne terminfo + entries (prompted by an old Debian bug report). + + correct reversed malloc/realloc calls in _nc_doalloc (reported by + Hans-Joachim Widmaier ). + + correct misplaced parenthesis which caused file-descriptor from + opening termcap to be lost, from 980725 changes (reported by Andreas + Jaeger). + +980815 + + modify lib_setup.c to eliminate unneeded include of + when termios is not used (patch by Todd C Miller). + + add function _nc_doalloc, to ensure that failed realloc calls do not + leak memory (reported by Todd C Miller). + + improved ncsa-telnet terminfo entry. + +980809 + + correct missing braces around a trace statement in read_entry.c, + from 980808 (reported by Kim DeVaughn and Liviu + Daia). + +980808 + + fix missing include in ditto.c (reported by Bernhard + Rosenkraenzer ) + + add NCSA telnet terminfo entries from Francesco Potorti + , from Debian bug reports. + + make handling of $LINES and $COLUMNS variables more compatible with + Solaris by allowing them to individually override the window size + as obtained via ioctl. + +980801 + + modify lib_vidattr.c to allow for terminal types (e.g., xterm-color) + which may reset all attributes in the 'op' capability, so that colors + are set before turning on bold and other attributes, but still after + turning attributes off. + + add 'ditto.c' to test directory to illustrate use of newterm for + initializing multiple screens. + + modify _nc_write_entry() to recover from failed attempt to link alias + for a terminfo on a filesystem which does not preserve character case + (reported by Peter L Jordan ). + +980725 + + updated versions of config.guess and config.sub based on automake 1.3 + + change name-comparisons in lib_termcap to compare no more than 2 + characters (gleaned from Debian distribution of 1.9.9g-8.8, verified + with Solaris curses). + + fix typo in curs_insstr.3x (patch by Todd C Miller) + + use 'access()' to check if ncurses library should be permitted to + open or modify files with fopen/open/link/unlink/remove calls, in + case the calling application is running in setuid mode (request by + Cristian Gafton , responding to Duncan Simpson + ). + + arm100 terminfo entries from Dave Millen ). + + qnxt2 and minitel terminfo entries from esr's version. + +980718 + + use -R option with ldconfig on FreeBSD because otherwise it resets + the search path to /usr/lib (reported by Dan Nelson). + + add -soname option when building shared libraries on OpenBSD 2.x + (request by QingLong). + + add configure options --with-manpage-format and + --with-manpage-renames (request by QingLong). + + correct conversion of CANCELLED_NUMERIC in write_object(), which was + omitting the high-order byte, producing a 254 in the compiled + terminfo. + + modify return-values of tgetflag, tgetnum, tgetstr, tigetflag, + tigetnum and tigetstr to be compatible with Solaris (gleaned from + Debian distribution of 1.9.9g-8.8). + + modify _nc_syserr_abort to abort only when compiled for debugging, + otherwise simply exit with an error. + +980711 + + modify Ada95 'gen' program to use appropriate library suffix (e.g., + "_g" for a debug build). + + update Ada95 'make clean' rule to include generics .ali files + + add a configure test to ensure that if GNAT is found, that it can + compile/link working Ada95 program. + + flush output in beep and flash functions, fixing a problem with + getstr (patch by Alexander V Lukyanov) + + fix egcs 1.0.2 warning for etip.h (patch by Chris Johns). + + correct ifdef/brace nesting in lib_sprintf.c (patch by Bernhard + Rosenkraenzer ). + + correct typo in wattr_get macro from 980509 fixes (patch by Dan + Nelson). + +980704 + + merge changes from current XFree86 xterm terminfo descriptions. + + add configure option '--without-ada'. + + add a smart-default for termcap 'ac' to terminfo 'acs_chars' which + corresponds to vt100. + + change translation for termcap 'rs' to terminfo 'rs2', which is + the documented equivalent, rather than 'rs1'. + +980627 + + slow 'worm' down a little, for very fast machines. + + corrected firstchar/lastchar computation in lib_hline.c + + simplify some expressions with CHANGED_CELL, CHANGED_RANGE and + CHANGED_TO_EOL macros. + + modify init_pair so that if a color-pair is reinitialized, we will + repaint the areas of the screen whose color changes, like SVr4 curses + (reported by Christian Maurer ). + + modify getsyx/setsyx macros to comply with SVr4 man-page which + says that leaveok() affects their behavior (report by Darryl Miles, + patch by Alexander V Lukyanov). + +980620 + + review terminfo.5 against Solaris 2.6 curses version, corrected + several minor errors/omissions. + + implement tparm %l format. + + implement tparm printf-style width and precision for %s, %d, %x, %o + as per XSI. + + implement tparm dynamic variables (reported by Xiaodan Tang). + +980613 + + update man-page for for wattr_set, wattr_get (cf: 980509) + + correct limits in hashtest, which would cause nonprinting characters + to be written to large screens. + + correct configure script, when --without-cxx was specified: the + wrong variable was used for cf_cv_type_of_bool. Compilers up to gcc + 2.8 tolerated the missing 'int'. + + remove the hardcoded name "gcc" for the GNU Ada compiler. The + compiler's name might be something like "egcs" (patch by Juergen + Pfeifer). + + correct curs_addch.3x, which implied that echochar could directly + display control characters (patch by Alexander V Lukyanov). + + fix typos in ncurses-intro.html (patch by Sidik Isani + ) + +980606 + + add configure test for conflicting use of exception in math.h and + other headers. + + minor optimization to 'hash()' function in hashmap.c, reduces its + time by 10%. + + correct form of LD_SHARED_OPTS for HP-UX 10.x (patch by Tim Mooney). + + fix missing quotes for 'print' in MKunctrl.awk script (reported by + Mihai Budiu ). + > patch by Alexander V Lukyanov: + + correct problem on Solaris (with poll() function) where getch could + hang indefinitely even if timeout(x) was called. This turned out to + be because milliseconds was not updated before 'goto retry' in + _nc_timed_wait. + + simplified the function _nc_timed_wait and fixed another bug, which + was the assumption of !GOOD_SELECT && HAVE_GETTIMEOFDAY in *timeleft + assignment. + + removed the cycle on EINTR, as it seems to be useless. + +980530 + + add makefile-rule for test/keynames + + modify run_tic.sh and shlib to ensure that user's .profile does not + override the $PATH used to run tic (patch by Tim Mooney). + + restore LD_SHARED_OPTS to $(LD_SHARED_FLAGS) when linking programs, + needed for HP-UX shared-library path (recommended by Tim Mooney). + + remove special case of HP-UX -L options, use +b options to embed + $(libdir) in the shared libraries (recommended by Tim Mooney). + + add checks for some possible buffer overflows and unchecked + malloc/realloc/calloc/strdup return values (patch by Todd C Miller + ) + +980523 + + correct maxx/maxy expression for num_columns/num_lines in derwin + (patch by Alexander V Lukyanov). + + add /usr/share/lib/terminfo and /usr/lib/terminfo as compatibility + fallbacks to _nc_read_entry(), along with --with-terminfo-dirs + configure option (suggested by Mike Hopkirk). + + modify config.guess to recognize Unixware 2.1 and 7 (patch by Mike + Hopkirk ). + + suppress definition of CC_SHARED_OPTS in LDFLAGS_SHARED in c++ + Makefile.in, since this conflicts when g++ is used with HP-UX + compiler (reported by Tim Mooney). + + parenthesize 'strcpy' calls in c++ binding to workaround redefinition + in some C++ implementations (reported by several people running + egcs with glibc 2.0.93, analysis by Andreas Jaeger. + +980516 + + modify write_entry.c so that it will not attempt to link aliases + with embedded '/', but give only a warning. + + put -L$(libdir) first when linking programs, except for HP-UX. + + modify comp_scan.c to handle SVr4 terminfo description for att477, + which contains a colon in the description field. + + modify configure script to support SCO osr5.0.5 shared libraries, + from comp.unix.sco.programmer newsgroup item (Mike Hopkirk). + + eliminate extra GoTo call in lib_doupdate.c (patch by Alexander V. + Lukyanov). + + minor adjustments of const/NCURSES_CONST from IRIX compile. + + add updates based on esr's 980509 version of terminfo.src. + +980509 + + correct macros for wattr_set, wattr_get, separate wattrset macro from + these to preserve behavior that allows attributes to be combined with + color pair numbers. + + add configure option --enable-no-padding, to allow environment + variable $NCURSES_NO_PADDING to eliminate non-mandatory padding, + thereby making terminal emulators (e.g., for vt100) a little more + efficient (request by Daniel Eisenbud ). + + modify configure script to embed ABI in shared libraries for HP-UX + 10.x (detailed request by Tim Mooney). + + add test/example of the 'filter()' function. + + add nxterm and xterm-color terminfo description (request by Cristian + Gafton ). + + modify rxvt terminfo description to clear alternate screen before + switching back to normal screen, for compatibility with applications + which use xterm (reported by Manoj Kasichainula ). + + modify linux terminfo description to reset color palette (reported + by Telford Tendys ). + + correction to doupdate, for case where terminal does not support + insert/delete character. The logic did not check that there was a + difference in alignment of changes to old/new screens before + repainting the whole non-blank portion of the line. Modified to fall + through into logic that reduces by the portion which does not differ + (reported by Daniel Eisenbud ). + + minor performance improvement to wnoutrefresh by moving some + comparisons out of inner loop. + +980425 + + modify configure script to substitute NCURSES_CONST in curses.h + + updated terminfo entries for xterm-xf86-v40, xterm-16color, + xterm-8bit to correspond to XFree86 3.9Ag. + + remove restriction that forces ncurses to use setaf/setab if the + number of colors is greater than 8. (see 970524 for xterm-16color). + + change order of -L options (so that $(libdir) is searched first) when + linking tic and other programs, to workaround HP's linker. + Otherwise, the -L../lib is embedded when linking against shared + libraries and the installed program does not run (reported by Ralf + Hildebrandt). + + modify configuration of shared libraries on Digital Unix so that + versioning is embedded in the library, rather than implied by + links (patch by Tim Mooney). + +980418 + + modify etip.h to avoid conflict with math.h on HP-UX 9.03 with gcc + 2.8.1 which redefines 'exception' (reported by Ralf Hildebrandt + ). + + correct configure tests in CF_SHARED_OPTS which used $CC value to + check for gcc, rather than autoconf's $GCC value. This did not + work properly if the full pathname of the compiler were given + (reported by Michael Yount ). + + revise check for compiler options to force ANSI mode since repeating + an option such as -Aa causes HP's compiler to fail on its own headers + (reported by Clint Olsen ). + +980411 + + ifdef'd has_key() and mcprint() as extended functions. + + modified several prototypes to correspond with 1997 version of + X/Open Curses (affects ABI since developers have used attr_get). + + remove spurious trailing blanks in glibc addon-scripts (patch by + H.J.Lu). + + insert a few braces at locations where gcc-2.8.x asks to use them to + avoid ambiguous else's, use -fpic rather than -fPIC for Linux (patch + by Juergen Pfeifer). + +980404 + + split SHLIB_LIST into SHLIB_DIRS/SHLIB_LIST to keep -L options + before -l to accommodate Solaris' linker (reported by Larry Virden). + +980328 + + modify lib_color.c to eliminate dependency on orig_colors and + orig_pair, since SVr4 curses does not require these either, but + uses them when they are available. + + add detailed usage-message to infocmp. + + correct a typo in att6386 entry (a "%?" which was "?"). + + add -f option to infocmp and tic, which formats the terminfo + if/then/else/endif so that they are readable (with newlines and + tabs). + + fixes for glibc addon scripts (patch by H.J.Lu). + +980321 + + revise configure macro CF_SPEED_TYPE so that termcap.h has speed_t + declared (from Adam J Richter ) + + remove spurious curs_set() call from leaveok() (J T Conklin). + + corrected handling leaveok() in doupdate() (patch by Alexander V. + Lukyanov). + + improved version of wredrawln (patch by Alexander V. Lukyanov). + + correct c++/Makefile.in so install target do not have embedded ../lib + to confuse it (patch by Thomas Graf ). + + add warning to preinstall rule which checks if the installer would + overwrite a curses.h or termcap.h that is not derived from ncurses. + (The recommended configuration for developers who need both is to + use --disable-overwrite). + + modify preinstall rule in top-level Makefile to avoid implicit + use of 'sh', to accommodate Ultrix 4.4 (reported by Joao Palhoto + Matos , patch by Thomas Esser + ) + + refine ifdef's for TRACE so that libncurses has fewer dependencies + on libtinfo when TRACE is disabled. + + modify configure script so that if the --with-termlib option is used + to generate a separate terminfo library, we chain it to the ncurses + library with a "-l" option (reported by Darryl Miles and Ian T. + Zimmerman). + +980314 + + correct limits and window in wredrawln function (reported/analysis by + Alexander V. Lukyanov). + + correct sed expression in configure script for --with-fallback + option (patch by Jesse Thilo). + + correct some places in configure script where $enableval was used + rather than $withval (patch by Darryl Miles ). + + modify some man-pages so no '.' or '..' falls between TH and SH + macros, to accommodate man_db program (reported by Ian T. Zimmerman + ). + + terminfo.src 10.2.1 downloaded from ESR's webpage (ESR). + > several changes by Juergen Pfeifer: + + add copyright notices (and rcs id's) on remaining man-pages. + + corrected prototypes for slk_* functions, using chtype rather than + attr_t. + + implemented the wcolor_set() and slk_color() functions + + the slk_attr_{set,off,on} functions need an additional void* + parameter according to XSI. + + fix the C++ and Ada95 binding as well as the man pages to + reflect above enhancements. + +980307 + + use 'stat()' rather than 'access()' in toe.c to check for the + existence of $HOME/.terminfo, since it may be a file. + + suppress configure CF_CXX_LIBRARY check if we are not using g++ + 2.7.x, since this is not needed with g++ 2.8 or egcs (patch by + Juergen Pfeifer). + + turn on hashmap scrolling code by default, intend to remedy defects + by 4.3 release. + + minor corrections to terminfo.src changelog. + +980302 4.2 release for upload to prep.ai.mit.edu + + correct Florian's email address in ncurses-intro.html + + terminfo.src 10.2.0 (ESR). + +980228 pre-release + + add linux-koi8r replace linux-koi8, which is not KOI8 (patch by + QingLong ). + + minor documentation fixes (patch by Juergen Pfeifer). + + add setlocale() call to ncurses.c (reported by Claes G. Lindblad + ). + + correct sign-extension in lib_insstr.c (reported by Sotiris + Vassilopoulos ) + +980221 pre-release + + regenerated some documentation overlooked in 980214 patch + (ncurses-intro.doc, curs_outopts.3x.html) + + minor ifdef change to C++ binding to work with gcc 2.8.0 (patch by + Juergen Pfeifer). + + change maintainer's mailing address to florian@gnu.org, change + tentative mailing list address to bug-ncurses-request@gnu.org (patch + by Florian La Roche). + + add definition of $(REL_VERSION) to c++/Makefile.in (reported by Gran + Hasse ). + + restore version numbers to Ada95 binding, accidentally deleted by + copyright patch (patch by Juergen Pfeifer). + +980214 pre-release + + remove ncurses.lsm from MANIFEST so that it won't be used in FSF + distributions, though it is retained in development. + + correct scaling of milliseconds to nanoseconds in lib_napms.c (patch + by Jeremy Buhler). + + update mailing-list information (bug-ncurses@gnu.org). + + update announcement for upcoming 4.2 release. + + modify -lm test to check for 'sin()' rather than 'floor()' + + remove spurious commas from terminfo.src descriptions. + + change copyright notices to Free Software Foundation + +980207 + + minor fixes for autoconf macros CF_ERRNO, CF_HELP_MESSAGE and + CF_SIZECHANGE + + modify Makefile.glibc so that $(objpfx) is defined (H.J.Lu). + + ifdef-out true-return from _nc_mouse_inline() which depends on + merge of QNX patch (pending 4.2 release). + > patch to split off seldom-used modules in ncurses (J T Conklin): + This reduces size by up to 2.6kb. + + move functionality of _nc_usleep into napms, add configuration case + for nanosleep(). + + moved wchgat() from lib_addch.c to lib_chgat.c + + moved clearok(), immedok(), leaveok(), and scrollok() from + lib_options.c to lib_clearok.c, lib_immedok.c, lib_leaveok.c and + lib_scrollok.c. + + moved napms() from lib_kernel.c to lib_napms.c + + moved echo() and noecho() from lib_raw.c to lib_echo.c + + moved nl() and nonl() from lib_raw.c to lib_nl.c + +980131 + + corrected conversion in tclock.c (cf: 971018). + + updates to Makefile.glibc and associated Linux configure script + (patch by H.J.Lu). + + workaround a quoting problem on SunOS with tar-copy.sh + + correct init_pair() calls in worm.c to work when use_default_colors() + is not available. + + include in CF_SYS_TIME_SELECT to work with FreeBSD + 2.1.5 + + add ncv capability to FreeBSD console (cons25w), making reverse + work with color. + + correct sense of configure-test for sys/time.h inclusion with + sys/select.h + + fixes for Ada95/ada_include/Makefile.in to work with --srcdir option. + + remove unused/obsolete test-program rules from progs/Makefile.in + (the rules in ncurses/Makefile.in work). + + remove shared-library loader flags from test/Makefile.in, etc. + + simplify test/configure.in using new version of autoconf to create + test/ncurses_cfg.h + + suppress suffix rules in test/Makefile.in, provide explicit + dependency to work with --srcdir option and less capable 'make' + programs. + > adapted from patch for QNX by Xiaodan Tang: + + initialize %P and %g variables set/used in tparm, and also ensure + that empty strings don't return a null result from tparam_internal + + add QNX-specific prototype for vsscanf() + + move initialization of SP->_keytry from init_keytry() to newterm() to + avoid resetting it via a keyok() call by mouse_activate(). + + reorganized some functions in lib_mouse() to use case-statements. + + remove sgr string from qnx terminfo entry since it is reported to + turn off attributes inconsistently. + +980124 + + add f/F/b/B commands to ncurses 'b' test to toggle colors, providing + test for no_color_video. + + adjusted emx.src to use no_color_video, now works with ncurses 'b' + and 'k' tests. + + implement no_color_video attribute, and as a special case, reverse + colors when the reverse attribute cannot be combined with color. + + check for empty string in $TERM variable (reported by Brett Michaels + ). + > from reports by Fred Fish: + + add configure-test for isascii + + add configure-test for -lm library. + + modify CF_BOOL_SIZE to check if C++ bool types are unsigned. + > patches by J.J.G.Ripoll + + add configure/makefile variables to support .exe extension on + OS/2 EMX (requires additional autoconf patches). + + explicitly initialize variables in lib_data.c to appease OS/2 linker + > patches by Fred Fish + + misc/Makefile.in (install.data): Avoid trying to install the CVS + directory. + + aclocal.m4 (install.includes): Remove files in the include directory + where we are going to install new ones, not the original source + files. + + misc/terminfo.src: Add entry for "beterm", derived from termcap + distributed with BeOS PR2 using captoinfo. + + aclocal.m4: Wrap $cf_cv_type_of_bool with quotes (contains space) + + aclocal.m4: Assume bool types are unsigned. + + progs/infocmp.c: workaround mwcc 32k function data limit + +980117 + + correct initialization of color-pair (cf: 970524) in xmas.c, which + was using only one color-pair for all colors (reported by + J.J.G.Ripoll). + + add multithread options for objects build on EMX, for compatibility + with XFree86. + + split up an expression in MKlib_gen.sh to work around a problem on + OS/2 EMX, with 'ash' (patch by J.J.G.Ripoll). + + change terminfo entries xterm (xterm-xf86-v40), xterm-8bit rs1 to use + hard reset. + + rename terminfo entry xterm-xf86-v39t to xterm-xf86-v40 + + remove bold/underline from sun console entries since they're not + implemented. + + correct _tracef calls in _tracedump(), which did not separate format + from parameters. + + correct getopt string for tic "-o" option, and add it to man-page + synopsis (reported by Darren Hiebert ). + + correct typo in panel/Makefile.in, reversed if-statement in scrolling + optimization (Alexander V. Lukyanov). + + test for 'remove()', use 'unlink() if not found (patch by Philippe De + Muyter ). + > patches by Juergen Pfeifer: + + Improve a feature of the forms driver. For invisible fields + (O_VISIBLE off) only the contents but not the attributes are cleared. + We now clear both. (Reported by Javier Kohan + ) + + The man page form_field_opts.3x makes now clear, that invisible + fields are also always inactive. + + adjust ifdef's to compile the C++ binding with the just released + gcc-2.8.0 c++ and the corresponding new C++ libraries. + +980110 + + correct "?" command in ncurses.c; it was performing non-screen writes + while the program was in screen mode. (It "worked" in 1.9.9e because + that version sets OPOST and OCRNL incorrectly). + + return error from functions in lib_kernel, lib_raw and lib_ti if + cur_term is null, or if underlying I/O fails. + + amend change to tputs() so that it does not return an error if + cur_term is null, since some applications depend on being able to use + tputs without initializing the terminal (reported by Christian J. + Robinson ). + +980103 + + add a copy of emx.src from J.J.G.Ripoll's OS/2 EMX version of ncurses + 1.9.9e, together with fixes/additions for the "ansi" terminal type. + + add tic check for save/restore cursor if change_scroll_region is + defined (reference: O'Reilly book). + + modify read_termcap.c to handle EMX-style pathnames (reported by + J.J.G.Ripoll). + + modify lib_raw.c to use EMX's setmode (patch from J.J.G.Ripoll). + Ripoll says EMX's curses does this. + + modify _nc_tic_expand() to generate \0 rather than \200. + + move/revise 'expand()' from dump_entry.c to ncurses library as + _nc_tic_expand(), for use by tack. + + decode \a as \007 for terminfo, as per XSI. + + correct translation of terminfo "^@", to \200, like \0. + + modify next_char() to treat the same as , for + cross-platform compatibility. + + use new version of autoconf (971230) to work around limited + environment on CLIX, due to the way autoconf builds --help message. + > patch by Juergen Pfeifer: + + check that the Ada95 binding runs against the correct version of + ncurses. + + insert constants about the library version into the main spec-file of + the Ada95 binding. + +971227 + + modify open/fopen calls to use binary mode, needed for EMX. + + modify configure script to work with autoconf 2.10 mods for OS/2 + EMX (from J.J.G.Ripoll). + + generated ncurses_cfg.h with patch (971222) to autoconf 2.12 which + bypasses limited sed buffer length. + > several changes from Juan Jose Garcia Ripoll + (J.J.G.Ripoll) to support OS/2 EMX: + + add a _scrolling flag to SP, to set when we encounter a terminal + that simply cannot scroll. + + corrected logic in _nc_add_to_try(), by ensuring that strings with + embedded \200 characters are matched. + + don't assume the host has 'link()' function, for linking terminfo + entries. + +971220 + + if there's no ioctl's to support sigwinch handler, disable it. + + add configure option --disable-ext-funcs to remove the extended + functions from the build. + + add configure option --with-termlib to generate the terminfo + functions as a separate library. + + add 'sources' rule to facilitate cross-compiling. + + review/fix order of mostlyclean/clean/distclean rules. + + modify install-rule for headers to first remove old header, in + case there was a symbolic link that confuses the install script. + + corrected substitution for NCURSES_CONST in term.h (cf: 971108) + + add null pointer checks in wnoutrefresh(), overlap() (patch by + Xiaodan Tang ) + + correct tputs(), which could dereference a null cur_term if invoked + before terminal is initialized (patch by Christopher Seawood + ) + > patch by Juergen Pfeifer: + + makes better use of "pragma Inline" in the Ada95 binding + + resynchronizes the generated html manpages + +971213 + + additional fixes for man-pages section-references + + add (for debugging) a check for ich/ich1 conflict with smir/rmir + to tic, etc. + + remove hpa/vpa from rxvt terminal description because they are not + implemented correctly, added sgr0. + + change ncurses 's' to use raw mode, so ^Q works (reported by Rudolf + Leitgeb ) + +971206 + + modify protection when installing libraries to (normally) not + executable. HP-UX shared libraries are an exception. + + add configure check for 'tack'. + + implement script for renaming section-references in man-page install, + for Debian configuration. + + add validity-check for SP in trace code in baudrate() (reported by + Daniel Weaver). + > patch by Alexander V. Lukyanov (fixes to match sol25 curses) + + modify 'overlay()' so that copy applies target window background to + characters. + + correct 'mvwin()' so that it does not clear the previous locations. + + correct lib_acs.c so that 8-bit character is not sign expanded in + case of wide characters in chtype. + + correct control-char test in lib_addch.c for use with wide chars + + use attribute in the chtype when adding a control character in + lib_addch.c control char was added with current attribute + +971129 + + save/restore errno in _tracef() function + + change treatment of initialize_color to use a range of 0..1000 + (recommended by Daniel Weaver). + + set umask in mkinstalldirs, fixing problems reported by users who + have set root's umask to 077. + + correct bug in tic that caused capabilities to be reprinted at the + end of output when they had embedded comments. + + rewrote wredrawln to correspond to XSI, and split-out since it is + not often used (from report by Alexander V. Lukyanov, 970825) + + rewrote Dan Nelson's change to make it portable, as well as to + correct logic for handling backslashes. + + add code to _nc_tgetent() to make it work more like a real tgetent(). + It removes all empty fields, and removes all but the first in a group + of duplicate caps. The code was pulled from the BSD libtermcap code + in termcap.c (patch by Dan Nelson + + don't include --enable-widec in the --with-develop configure option, + since it is not binary-compatible with 4.1 (noted by Alexander V. + Lukyanov) + > patch by Juergen Pfeifer: + + further improvements of the usage of elaboration pragmas in the Ada95 + binding + + enhanced Ada95 sample to use the user_data mechanism for panels. + + a fix for the configuration script to make gnat-3.10 the required + version. + + resync of the html version of the manpages + +971122 + > fixes/updates for terminfo.src: + + add vt220-js, pilot, rbcomm, datapoint entries from esr's 27-jun-97 + version. + + add hds200 description (Walter Skorski) + + add EMX 0.9b descriptions + + correct rmso/smso capabilities in wy30-mc and wy50-mc (Daniel Weaver) + + rename xhpterm back to hpterm. + > patch by Juergen Pfeifer: + + Improves the usage of elaboration pragmas for the Ada95 binding. + + Adds a translation of the test/rain.c into Ada95 to the samples. + This has been contributed to the project by Laurent Pautet + (pautet@gnat.com) + +971115 + + increase MAX_NAME_SIZE to 512 to handle extremely long alias list + in HP-UX terminfo. + + correction & simplification of delay computation in tputs, based on + comments from Daniel Weaver. + + replace test for SCO with more precise header tests. + + add configure test for unsigned literals, use in NCURSES_BITS macro. + + comment-out the -PIC, etc., flags from c++, progs and test makefiles + since they probably are not needed, and are less efficient (noted by + Juergen Fluk) + + add -L$(libdir) to loader options, after -L../lib so that loaders + that record this information will tend to do the right thing if + the programs are moved around after installing them (suggested by + Juergen Fluk). + + add -R option to loader options for programs for Solaris if the + --enable-rpath option is specified for the libraries. + +971112 + + correct installed filename for shared libraries on *BSD (reported by + Juergen Fluk). + +971108 + + cleanup logic for deciding when tputs() should call delay_output(), + based on comments from Daniel Weaver. + + modified tputs() to avoid use of float. + + correct use of trailpad in tputs(), which used the wrong variable + in call to delay_output(). + + correct inverted expression for null-count in delay_output() + (analysis by Daniel Weaver). + + apply --enable-rpath option to Solaris (requested by Larry Virden). + + correct substitution of EXTRA_CFLAGS for gcc 2.6.3 + + correct check for error-return by _nc_tgetent(), which returns 0 + for success. + + add configure test for BSD 4.4 cgetent() function, modify + read_termcap.c to use the host's version of that if found, using the + terminal database on FreeBSD (reported by Peter Wemm). + + add u8, u9 strings to sun-il description for Daniel Weaver. + + use NCURSES_CONST in panel's user-pointer. + + modify edit_cfg.sh and MKterm.h.awk.in to substitute NCURSES_CONST + so that will work on NeXT. + + use _nc_set_screen() rather than assignments to SP to fix port to + NeXT (reported by Francisco A. Tomei Torres). + +971101 + + force mandatory padding in bell and flash_screen, as specified in + XSI. + + don't allow padding_baud_rate to override mandatory delays (reported + by Daniel Weaver). + + modify delay_output() to use _nc_timed_wait() if no baudrate has been + defined, or if the cur_term pointer is not initialized. XSI treats + this as unspecified. (requested by Daniel Weaver). + + change getcap-cache ifdef's to eliminate unnecessary chdir/mkdir + when that feature is not configured. + + remove _nc_err_abort() calls when write_entry.c finds a directory but + cannot write to it, e.g., when translating part/all of /etc/termcap + (reported by Andreas Jaeger ). + (this dates back to 951102 in 1.9.7a). + + minor ifdef fixes to compile with atac and glibc 2.0.5c + + add check for -lgen when configuring regexpr.h + + modify Solaris shared-library option "-d y" to "-dy" to workaround + incompatibility of gcc 2.7.2 vs vendor's tools. + +971026 + + correct ifdef's for struct winsize vs struct ttysize in lib_setup.c + to compile on SCO. + + remove dangling backslash in panel/Makefile.in + + modify MKkeyname.awk to work with SCO's nawk, which dumps core in the + length() function. + + correct length of allocation in _nc_add_to_try(), to allow for + trailing null. + + correct logic in _nc_remove_key(), which was discarding too many + nodes (patch by Alexander V. Lukyanov) + +971025 + + add definition for $(REL_VERSION) to test/Makefile.in, so *BSD + shared libraries link properly (see 970524). + + modify Linux shared-library generation to include library + dependencies (e.g., -lncurses and -lgpm) in the forms, menu and + panel libraries (suggested by Juergen Pfeifer). + + modify configure script to use config.guess and config.sub rather + than uname, which is unreliable on some systems. + + updated Makefile.glibc, test-built with glibc 2.0.5c + + modify keyname() to return values consistent with SVr4 curses (patch + by Juergen Fluk). + > changes requested by Daniel Weaver: + + modify delay_output() so that it uses the same output function as + tputs() if called from that function. + + move _baudrate from SCREEN to TERMINAL so that low-level use of + tputs works when SP is not set. + > patch by Juergen Pfeifer: + + factor lib_menu and lib_form into smaller modules + + clean up the interface between panel and SCREEN + + minor changes to the Ada95 mouse support implementation + + minor bugfix in C++ binding to ripoff windows + + fix a few Ada95 html documentation pages + +971018 + + split-out lib_ungetch.c, make runtime link to resizeterm() to + decouple those modules from lib_restart.c + + add xterm-xf86-v39t description to terminfo.src + + reset SP->_endwin in lib_tstp.c cleanup() function after calling + endwin() to avoid unnecessary repainting if the application has + established an atexit function, etc. Encountered this problem in + the c++ demo, whose destructors repaint the screen. + + combine _nc_get_screensize() and resizeterm() calls as new function + _nc_update_screensize(). + + minor fixes to allow compile with g++ (suggested by Nelson H. F. + Beebe). + + implement install-rules for Ada95 makefiles. + + use screen_lines or MAXLINES as needed where LINES was coded, + as well as screen_columns for COLS, in the ncurses library. + > patch by Alexander V. Lukyanov: + + modify logic for ripped-off lines to handle several SCREENs. + > patch by Juergen Pfeifer: + + factors lib_slk.c into some smaller modules + + factors panel.c into some smaller modules + + puts the static information about the current panel stack into the + SCREEN structure to allow different panel stacks on different + screens. + + preliminary fix for an error adjusting LINES to account for + ripped-off lines. + +971011 + + move _nc_max_click_interval and other mouse interface items to SCREEN + struct so that they are associated with a single terminal, and also + save memory when the application does not need a mouse (roughly 3k vs + 0.5k on Linux). + + modify mouseinterval() so that a negative parameter queries the + click-interval without modifying it. + + modify ncurses 'i' test to work with ncurses' apparent extension from + SVr4, i.e., allows nocbreak+noecho (analysis by Alexander V. + Lukyanov). + + add configure options --with-ada-includes and --with-ada-objects, + to drive Ada95 binding install (not yet implemented). + + install C++ binding as -lncurses++ and associated headers with the + other ncurses headers. + + fix header uninstall if configure --srcdir is used. + > minor interface changes to support 'tack' program -TD + (request by Daniel Weaver ). + + export functions _nc_trans_string() and _nc_msec_cost(). + + add variable _nc_nulls_sent, to record the number of padding + characters output in delay_output(). + + move tests for generic_type and hard_copy terminals in setupterm() + to the end of that function so that the library will still be + initialized, though not generally useful for curses programs. + > patches by Alexander V. Lukyanov: + + modify ClrBottom() to avoid using clr_eos if there is only one line + to erase. + + typo in configure --help. + > patch by J T Conklin (with minor resync against Juergen's changes) + + split-out lib_flash.c from lib_beep.c + + split-out lib_hline.c and lib_vline.c from lib_box.c + + split-out lib_wattron.c, lib_wattroff.c from lib_addch.c + +971005 + > patch by Juergen Pfeifer: + + correct source/target of c++/edit_cfg.sh + +971004 + + add color, mouse support to kterm terminfo entry. + + modify lib_mouse.c to recognize rxvt, kterm, color_xterm also as + providing "xterm"-style mouse. + + updated rxvt's terminfo description to correspond to 2.21b, with + fixes for the acsc (the box1 capability is incorrect, ech1 does not + work). + + fix logic in parse_entry.c that discarded acsc when 'synthesizing' + an entry from equivalents in XENIX or AIX. This lets ncurses handle + the distribution copy of rxvt's terminfo. + + modify acsc capability for linux and linux-koi8 terminfo descriptions + (from Pavel Roskin ). + + corrected definition in curses.h for ACS_LANTERN, which was 'I' + rather than 'i' (see 970802). + + updated terminfo.src with reformatted acsc entries, and repaired the + trashed entries with spurious '\' characters that this exposed. + + add logic to dump_entry.c to reformat acsc entries into canonical + form (sorted, unique mapping). + + add configure script to generate c++/etip.h + + add configure --with-develop option, to enable by default most of the + experimental options (requested by Alexander V. Lukyanov). + + rename 'deinstall' to 'uninstall', following GNU convention + (suggested by Alexander V. Lukyanov). + > patches by Alexander V. Lukyanov: + + modify tactics 2 and 5 in onscreen_mvcur(), to allow them on the last + line of the screen, since carriage return will not cause a newline. + + remove clause from PutCharLR() that would try to use + eat_newline_glitch since that apparently does not work on some + terminals (e.g., M$ telnet). + + correct a limit check in scroll_csr_backward() + > patches by Juergen Pfeifer: + + adds dummy implementations of methods above() and below() to the + NCursesPanel class. + + fixes missing returncode in NCursesWindow::ripoffline() + + fixes missing returncode in TestApplication::run() in demo.cc + + We should at least give a comment in etip.h why it is currently a + problem to install the C++ binding somewhere + + makes the WINDOW* argument of wenclose() a const. + + modifies several of the routines in lib_adabind.c to use a const + WINDOW* argument. + +970927 + + add 'deinstall' rules. + + use explicit assignments in configure --without-progs option to + work around autoconf bug which doesn't always set $withval. + + check for ldconfig, don't try to run it if not found. + + implement simple/unoptimized case in lib_doupdate.c to handle + display with magic cookie glitch, tested with ncurses.c program. + + correct missing _tracef in getmouse(), to balance the returnCode + macro. + + simplify show_attr() in ncurses.c using termattrs(). + > patches by Juergen Pfeifer: + + provides missing inlines for mvw[hv]line in cursesw.h of the C++ + binding + + fixes a typo in a comment of frm_driver.c + + Enhances Ada95 Makefiles to fulfill the requirement of GNAT-3.10 that + generics should be compiled. Proper fixes to the configuration + scripts are also provided. + +970920 + + several modifications to the configure script (requested by Ward + Horner): + + add configure options --without-progs, to suppress the build of the + utility programs, e.g., for cross-compiling. + + add $(HOSTCCFLAGS) and $(HOSTLDFLAGS) symbols to ncurses + Makefile.in, to simplify setup for cross compiling. + + add logic in configure script to recognize "--target=vxworks", and + generate load/install actions for VxWorks objects. + + move typedef for sigaction_t into SigAction.h to work around problem + generating lint library. + + modify fty_regex.c to reflect renaming of ifdef's for regular + expressions. + + simplify ifdef in lib_setup.c for TIOCGWINSZ since that symbol may + reside in . + + merge testcurs.c with version from PDCurses 2.3, clarifying some of + the more obscure tests, which rely upon color. + + use macros getbegyx() and getmaxyx() in newdemo.c and testcurs.c + + modify ncurses.c to use getbegyx() and getmaxyx() macros to cover up + implementation difference wrt SVr4 curses, allow 's' test to work. + + add missing endwin() to testscanw.c program (reported by Fausto + Saporito ). + + fixes/updates for Makefile.glibc and related files under sysdeps + (patch by H.J.Lu). + > patches by Juergen Pfeifer: + + add checks for null pointers, especially WINDOW's throughout the + ncurses library. + + solve a problem with wrong calculation of panel overlapping (reported + by Ward Horner): + + make sure that a panel's window isn't a pad. + + do more error checking in module lib_touch.c + + missing files for Ada95 binding from the last patch + + synch. of generated html pages (RCS-Id's were wrong in html files) + + support for Key_Resize in Ada binding + + changed documentation style in ./c++/cursesm.h + > patches by Alexander V. Lukyanov: + + undo attempt to do recursive inlining for PutChar(), noting that it + did not improve timing measurably, but inflated the size of + lib_doupdate.o + +970913 + + modify rain.c to use color. + + correct scroll_csr_backward() to match scroll_csr_forward(). + + minor adjustment to llib-lncurses, to work with Solaris 2.5.1 + + minor fixes to sysdeps/unix/sysv/linux/configure to reflect renaming + of configure cache variables in 970906. + + correct logic involving changes to O_VISIBLE option in + Synchronize_Options function in frm_driver.c (Tony Hoffmann + ) + + add $(HOSTCC) symbol to ncurses Makefile.in, to simplify setup for + cross compiling (suggested by Chris Johns). + + modify ifdef in lib_setup.c to only include if we can + use it to support screen-size calculation (reported by Chris Johns). + + #undef unctrl to avoid symbol conflict in port to RTEMS (reported by + Chris Johns ) + > patches by Juergen Pfeifer: + + simplified, made minor corrections to Ada95 binding to form + fieldtype. + + The C++ binding has been enhanced: + + Improve NCursesWindow class: added additional methods to cover + more ncurses functionality. Make refresh() and noutrefresh() + virtual members to allow different implementation in the + NCursesPanel class. + + CAUTION: changed order of parameters in vline() and hline() of + NCursesWindow class. + + Make refresh() in NCursesPanel non-static, it is now a + reimplementation of refresh() in the base class. Added + noutrefresh() to NCursesPanel. + + Added NCursesForm and related classes to support libform + functionality. + + Moved most of configuration related stuff from cursesw.h to etip.h + + Added NCursesApplication class to support easy configuration of + menu and forms related attributes as well as ripped of title lines + and Soft-Label-Keys for an application. + + Support of Auto-Cleanup for a menu's fieldlist. + + Change of return type for current_item() and operator[] for menus. + + Enhanced demo. + + Fixed a bug in form/fld_def.c: take into account that copyarg and + freearg for a fieldtype may be NULL, makearg must not be NULL + + Fixed a bug in form/fld_type.c: in set_fieldtype_arg() makearg must + not be NULL, copyarg and freearg may be NULL. + + Fixed a bug in form/frm_def.c: Allow Disconnect_Fields() if it is + already disconnected. + + Enhance form/frm_driver.c: Allow growth of dynamic fields also on + navigation requests. + + Fixed a bug in form/fty_enum.c: wrong position of postincrement in + case-insensitiva comparison routine. + + Enhanced form/lib_adabind.c with function _nc_get_field() to get a + forms field by index. + + Enhanced menu/m_adabind.c with function _nc_get_item() to get a menus + item by index. + + Fixed in curses.h.in: make chtype argument for pechochar() constant. + Mark wbkgdset() as implemented, remove wbkgdset macro, because it was + broken (didn't handle colors correctly). + + Enhanced lib_mouse.c: added _nc_has_mouse() function + + Added _nc_has_mouse() prototype to curses.priv.h + + Modified lib_bkgd.c: hopefully correct implementation of wbkgdset(); + streamlined implementation of wbkgd() + + Modified lib_mvwin.c: Disable move of a pad. Implement (costly) + move of subwindows. Fixed update behavior of movements of regular + windows. + + Fixed lib_pad.c: make chtype argument of pechochar() const. + + Fixed lib_window.c: dupwin() is not(!) in every bit a really clone + of the original. Subwindows become regular windows by doing a + dupwin(). + + Improved manpage form_fieldtype.3x + > patches by Alexander V. Lukyanov: + + simplify the PutChar() handling of exit_am_mode, because we already + know that auto_right_margin is true. + + add a check in PutChar() for ability to insert to the case of + shifting character to LR corner. + + in terminal initialization by _nc_screen_resume(), make sure that + terminal right margin mode is known. + + move logic that invokes touchline(), or does the equivalent, into + _nc_scroll_window(). + + modify scrolling logic use of insert/delete line capability, assuming + that they affect the screen contents only within the current + scrolling region. + + modify rain.c to demonstrate SIGWINCH handler. + + remove logic from getch() that would return an ERR if the application + called getch() when the cursor was at the lower-right corner of the + physical screen, and the terminal does not have insert-character + ability. + + change view.c so that it breaks out of getch() loop if a KEY_RESIZE + is read, and modify logic in getch() so this fix will yield the + desired behavior, i.e., the screen is repainted automatically when + the terminal window is resized. + +970906 + + add configure option --enable-sigwinch + + modify view.c to test KEY_RESIZE logic, with "-r" option. + + modify testcurs.c to eliminate misleading display wrt cursor type + by testing if the terminal supports cnorm, civis, cvvis. + + several fixes for m68k/NeXT 4.0, to bring cur_term, _nc_curr_line and + _nc_curr_col variables into linked programs: move these variables, + making new modules lib_cur_term and trace_buf (reported by Francisco + Alberto Tomei Torres ). + > patches by Alexander V. Lukyanov: + + add pseudo-functionkey KEY_RESIZE which is returned by getch() when + the SIGWINCH handler has been called since the last call to + doupdate(). + + modify lib_twait.c to hide EINTR only if HIDE_EINTR is defined. + + add SIGWINCH handler to ncurses library which is used if there is no + application SIGWINCH handler in effect when the screen is + initialized. + + make linked list of all SCREEN structures. + + move curses.h include before definition of SCREEN to use types in + that structure. + + correction to ensure that wgetstr uses only a newline to force a + scroll (970831). + +970831 + + add experimental configure option --enable-safe-sprintf; the normal + mode now allocates a buffer as large as the screen for the + lib_printw.c functions. + + modify wgetch to refresh screen when reading ungetch'd characters, + since the application may require this - SVr4 does this. + + refine treatment of newline in wgetstr to echo only when this would + force the screen to scroll. + +970830 + + remove override in wgetstr() that forces keypad(), since SVr4 does + not do this. + + correct y-reference for erasure in wgetstr() when a wrap forces a + scroll. + + correct x-position in waddch() after a wrap forces a scroll. + + echo newline in wgetstr(), making testscanw.c scroll properly when + scanw is done. + + modify vwscanw() to avoid potential buffer overflow. + + rewrote lib_printw.c to eliminate fixed-buffer limits. + > patches by Alexander V. Lukyanov: + + correct an error in handling cooked mode in wgetch(); processing + was in the wrong order. + + simplified logic in wgetch() that handles backspace, etc., by using + wechochar(). + + correct wechochar() so that it interprets the output character as + in waddch(). + + modify pechochar() to use prefresh() rather than doupdate(), since + the latter does not guarantee immediate refresh of the pad. + + modify pechochar() so that if called with a non-pad WINDOW, will + invoke wechochar() instead. + + modify fifo indices to allow fifo to be longer than 127 bytes. + +970823 + + add xterm-8bit to terminfo.src + + moved logic for SP->_fifohold inside check_pending() to make it + work properly when we add calls to that function. + + ensure that bool functions return only TRUE or FALSE, and TRUE/FALSE + are assigned to bool values (patch by H.J.Lu). + > patches by Alexander V. Lukyanov: + + several fixes to getch: + 1. Separate cooked and raw keys in fifo + 2. Fix the case of ungetch'ed KEY_MOUSE + 3. wrap the code for hiding EINTR with ifdef HIDE_EINTR + 4. correctly handle input errors (i.e., EINTR) without loss of raw + keys + 5. recognize ESC KEY_LEFT and similar + 6. correctly handle the case of reception of KEY_MOUSE from gpm + + correct off-by-one indexing error in _nc_mouse_parse(), that caused + single mouse events (press/release) to be ignored in favor of + composed events (click). Improves on a fix from integrating gpm + support in 961229. + + add another call to check_pending, before scrolling, for + line-breakout optimization + + improve hashmap.c by + 1. fixed loop condition in grow_hunks() + 2. not marking lines with offset 0 + 3. fixed condition of 'too far' criteria, thus one-line hunks are + ignored and two lines interchanged won't pass. + + rewrote/simplified _nc_scroll_optimize() by separating into two + passes, forward/backward, looking for chunks moving only in the given + direction. + + move logic that emits sgr0 when initializing the screen to + _nc_screen_init(), now invoked from newterm. + + move cursor-movement cleanup from endwin() into _nc_mvcur_wrap() + function and screen cleanup (i.e., color) into _nc_screen_wrap() + function. + + add new functions _nc_screen_init(), _nc_screen_resume() and + _nc_screen_wrap(). + + rename _nc_mvcur_scrolln() to _nc_scrolln(). + + add a copy of acs_map[] to the SCREEN structure, where it can be + stored/retrieved via set_term(). + + move variables _nc_idcok, _nc_idlok, _nc_windows into the SCREEN + structure. + +970816 + + implement experimental _nc_perform_scroll(). + + modify newterm (actually _nc_setupscreen()) to emit an sgr0 when + initializing the screen, as does SVr4 (reported by Alexander V. + Lukyanov). + + added test_progs rule to ncurses/Makefile. + + modify test/configure.in to check if initscr is already in $LIBS + before looking for (n)curses library. + + correct version-number in configure script for OSF1 shared-library + options (patch by Tim Mooney). + + add -DNDEBUG to CPPFLAGS for --enable-assertions (as Juergen + originally patched) since the c++ demo files do not necessarily + include ncurses_cfg.h + + supply default value for --enable-assertions option in configure + script (reported by Kriang Lerdsuwanakij ). + > patches by Alexander V. Lukyanov: + + correct/simplify logic of werase(), wclrtoeol() and wclrbot(). See + example firstlast.c + + optimize waddch_literal() and waddch_nosync() by factoring out + common subexpressions. + + correct sense of NDEBUG ifdef for CHECK_POSITION macro. + + corrections to render_char(), to make handling of colored blanks + match SVr4 curses, as well as to correct a bug that xor'd space + against the background character. + + replaced hash function with a faster one (timed it) + + rewrote the hashmap algorithm to be one-pass, this avoids multiple + cost_effective() calls on the same lines. + + modified cost_effective() so it is now slightly more precise. + > patches for glibc integration (H.J.Lu): + + add modules define_key, keyok, name_match, tries + + add makefile rules for some of the unit tests in ncurses (mvcur, + captoinfo, hardscroll, hashmap). + + update Linux configure-script for wide-character definitions. + +970809 + + modify _tracebits() to show the character size (e.g., CS8). + + modify tparm() to emit '\200' where the generated string would have a + null (reported by From: Ian Dall for + terminal type ncr7900). + + modify install process so that ldconfig is not invoked if the + package is built with an install-prefix. + + correct test program for chtype size (reported by Tim Mooney). + + add configure option --disable-scroll-hints, using this to ifdef the + logic that computes indices for _nc_scroll_optimize(). + + add module ncurses/softscroll.c, to perform single-stage computation + of scroll indices used in _nc_scroll_optimize(). This is faster than + the existing scrolling algorithm, but tends to make too-small hunks. + + eliminate fixed buffer size in _nc_linedump(). + + minor fixes to lib_doupdate.c to add tradeoff between clr_eol (el) + and clr_bol (el1), refine logic in ClrUpdate() and ClrBottom() (patch + by Alexander V. Lukyanov). + + add test/testaddch.c, from a pending patch by Alexander V. Lukyanov. + + correct processing of "configure --enable-assertions" option (patch + by Juergen Pfeifer). + +970802 + + add '-s' (single-step) option too test/hashtest.c, correct an error + in loop limit for '-f' (footer option), toggle scrollok() when + writing footer to avoid wrap at lower-right corner. + + correct behavior of clrtoeol() immediately after wrapping cursor, + which was not clearing the line at the cursor position (reported by + Liviu Daia ). + + corrected mapping for ACS_LANTERN, which was 'I' rather than 'i' + (reported by Klaus Weide ). + + many corrections to make progs/capconvert work, as well as make it + reasonably portable and integrated with ncurses 4.1 (reported by Dave + Furstenau ). + +970726 + + add flag SP->_fifohold, corresponding logic to modify the behavior of + the line breakout logic so that if the application does not read + input, refreshes will not be stopped, but only slowed. + + generate slk_attr_off(), slk_attr_on(), slk_attr_set(), vid_attr(), + ifdef'd for wide-character support, since ncurses' WA_xxx attribute + masks are identical with the A_xxx masks. + + modify MKlib_gen.sh to generate ifdef'd functions to support optional + configuration of wide-characters. + + modify tset to behave more like SVr4's tset, which does not modify + the settings of intr, quit or erase unless they are given as command + options (reported by Nelson H. F. Beebe ). + + modify tset to look in /etc/ttys or /etc/ttytype if the configuration + does not have getttynam(). + + extend baudrate table in tset.c to match baudrate() function. + + add table entries for B230400 and B460800 to baudrate() function. + + improve breakout logic by allowing it before the first line updated, + which is what SVr4 curses does (patch by Alexander V. Lukyanov). + + correct initialization of vcost in relative_move(), for cursor-down + case (patch by Alexander V. Lukyanov). + > nits gleaned from Debian distribution of 1.9.9g-3: + + install symbolic link for intotocap. + + reference libc directly when making shared libraries. + + correct renaming of curs_scr_dmp.3x in man_db.renames. + + guard tgetflag() and other termcap functions against null cur_term + pointer. + +970719 + + corrected initial state of software echo (error in 970405, reported + by Alexander V. Lukyanov). + + reviewed/added messages to configure script, so that all non-test + options should be accompanied by a message. + + add configure check for long filenames, using this to determine if + it is safe to allow long aliases for terminal descriptions as does + SVr4. + + add configure options for widec (wide character), hashmap (both + experimental). + > patch by Alexander V. Lukyanov: + + hashmap.c - improved by heuristic, so that scroll test works much + better when csr is not available. + + hardscroll.c - patched so that it continues to scroll other chunks + after failure to scroll one. + + lib_doupdate.c - _nc_mvcur_scrolln extended to handle more cases; csr + is avoided as it is relative costly. Fixed wrong coordinates in one + case and wrong string in TRACE. + > patch by Juergen Pfeifer: + + modify C++ binding to compile on AIX 4.x with the IBM C-SET++ + compiler. + +970712 + + remove alternate character set from kterm terminfo entry; it uses the + shift-out control for a purpose incompatible with curses, i.e., font + switching. + + disentangle 'xterm' terminfo entry from some derived entries that + should be based on xterm-r6 instead. + + add cbt to xterm-xf86-xv32 terminfo entry; I added the emulation for + XFree86 3.1.2F, but overlooked its use in terminfo then - T.Dickey. + + correct logic in lib_mvcur.c that uses back_tab. + +970706 + + correct change from 970628 to ClrUpdate() in lib_doupdate.c so that + contents of curscr are saved in newscr before clearing the screen. + This is needed to make repainting work with the present logic of + TransformLine(). + + use napms() rather than sleep() in tset.c to avoid interrupting I/O. + +970705 + + add limit checks to _nc_read_file_entry() to guard against overflow + of buffer when reading incompatible terminfo format, e.g, from OSF/1. + + correct some loop-variable errors in xmc support in lib_doupdate.c + + modify ncurses 'b' test to add gaps, specified by user, to allow + investigation of interaction with xmc (magic cookie) code. + + correct typo in 970524 mods to xmas.c, had omitted empty parameter + list from has_colors(), which gcc ignores, but SVr4 does not + (reported by Larry Virden). + + correct rmso capability in wy50-mc description. + + add configure option "--enable-hard-tabs", renamed TABS_OK ifdef to + USE_HARD_TABS. + > patch by Juergen Pfeifer: + + Add bindings for keyok() and define_key() to the Ada95 packages. + + Improve man pages menu_post.3x and menu_format.3x + + Fix the HTML pages in the Ada95/html directory to reflect the above + changes. + +970628 + + modify change from 970101 to ClrUpdate() in lib_doupdate.c so that + pending changes to both curscr and newscr are flushed properly. + This fixes a case where the first scrolling operation in nvi would + cause the screen to be cleared unnecessarily and repainted before + doing the indexing, i.e., by repeatedly pressing 'j' (reported by + Juergen Pfeifer). + + correct error in trans_string() which added embedded newlines in a + terminfo description to the stored strings. + + remove spurious newlines from sgr in wyse50 (and several other) + terminfo descriptions. + + add configure option for experimental xmc (magic cookie) code, + "--enable-xmc-glitch". When disabled (the default), attributes that + would store a magic cookie are suppressed in vidputs(). The magic + cookie code is far from workable at this stage; the configuration + option is a stopgap. + + move _nc_initscr() from lib_initscr.c to lib_newterm.c + + correct path for invoking make_keys (a missing "./"). + +970621 + + correct sign-extension problem with "infocmp -e", which corrupted + acsc values computed for linux fallback data. + + correct dependency on ncurses/names.c (a missing "./"). + + modify configure script to use '&&' even for cd'ing to existing + directories to work around broken shell interpreters. + + correct a loop-limit in _nc_hash_map() (patch by Alexander V. + Lukyanov). + +970615 + + restore logic in _nc_scroll_optimize() which marks as touched the + lines in curscr that are shifted. + + add new utility 'make_keys' to compute keys.tries as a table rather + than a series of function calls. + + correct include-dependency for tic.h used by name_match + + removed buffer-allocation for name and description from m_item_new.c, + since this might result in incompatibilities with SVr4. Also fixed + the corresponding Ada95 binding module (patch by Juergen Pfeifer, + report by Avery Pennarun ) + + removed the mechanism to timestamp the generated Ada95 sources. This + resulted always in generating patches for the HTML doc, even when + nothing really changed (patch by Juergen Pfeifer). + + improve man page mitem_new.3x (patch by Juergen Pfeifer). + +970614 + + remove ech capability from rxvt description because it does not work. + + add missing case logic for infocmp -I option (reported by Lorenzo M. + Catucci ) + + correct old bug in pnoutrefresh() unmasked by fix in 970531; this + caused glitches in the ncurses 'p' test since the area outside the + pad was not compared when setting up indices for _nc_scroll_optimize. + + rewrote tracebits() to workaround misdefinition of TOSTOP on Ultrix + 4.4, as well as to eliminate fixed-size buffer (reported by Chris + Tanner ) + + correct prototype for termattrs() as per XPG4 version 2. + + add placeholder prototypes for color_set(), erasewchar(), + term_attrs(), wcolor_set() as per XPG4 version 2. + + correct attribution for progs/progs.priv.h and lib_twait.c + + improve line-breakout logic by checking based on changed lines rather + than total lines (patch by Alexander V. Lukyanov). + + correct loop limits for table-lookup of enumerated value in form + (patch by Juergen Pfeifer). + + improve threshold computation for determining when to call ClrToEOL + (patch by Alexander V. Lukyanov). + +970531 + + add configure option --disable-database to force the library to + use only the fallback data. + + add configure option --with-fallbacks, to specify list of fallback + terminal descriptions. + + add a symbolic link for ncurses.h during install; too many programs + still assume there's an ncurses.h + + add new terminfo.src entry for xterm-xf86-v33. + + restore terminfo.src entry for emu to using setf/setb, since it is + not, after all, generating ANSI sequences. Corrected missing comma + that caused setf/setb entries to merge. + + modify mousemask() to use keyok() to enable/disable KEY_MOUSE, so + that applications can disable ncurses' mouse and supply their own + handler. + + add extensions keyok() and define_key(). These are designed to allow + the user's application better control over the use of function keys, + e.g., disabling the ncurses KEY_MOUSE. (The define_key idea was from + a mailing-list thread started by Kenneth Albanowski + Nov'1995). + + restore original behavior in ncurses 'g' test, i.e., explicitly + set the keypad mode rather than use the default, since it confuses + people. + + rewrote the newdemo banner so it's readable (reported by Hugh + Daniel). + + tidy up exit from hashtest (reported by Hugh Daniel). + + restore check for ^Q in ncurses 'g' test broken in 970510 (reported + by Hugh Daniel) + + correct tput program, checking return-value of setupterm (patch by + Florian La Roche). + + correct logic in pnoutrefresh() and pechochar() functions (reported + by Kriang Lerdsuwanakij ). The computation + of 'wide' date to eric's #283 (1.9.9), and the pechochar bug to the + original implementation (1.9.6). + + correct typo in vt102-w terminfo.src entry (patch by Robert Wuest + ) + + move calls of _nc_background() out of various loops, as its return + value will be the same for the whole window being operated on (patch + by J T Conklin). + + add macros getcur[xy] getbeg[xy] getpar[xy], which are defined in + SVr4 headers (patch by J T Conklin ) + + modify glibc addon-configure scripts (patch by H.J.Lu). + + correct a bug in hashmap.c: the size used for clearing the hashmap + table was incorrect, causing stack corruption for large values of + LINES, e.g., >MAXLINES/2 (patch by Alexander V. Lukyanov). + + eric's terminfo 9.13.23 & 9.13.24 changes: replaced minitel-2 entry, + added MGR, ansi-nt (note: the changes described for 9.13.24 have not + been applied). + > several changes by Juergen Pfeifer: + + correct a missing error-return in form_driver.c when wrapping of a + field is not possible. + + correct logic in form_driver.c for configurations that do not have + memccpy() (reported by Sidik Isani ) + + change several c++ binding functions to inline. + + modify c++ menu binding to inherit from panels, for proper + initialization. + + correct freeing of menu items in c++ binding. + + modify c++ binding to reflect removal of const from user data pointer + in forms/menus libraries. + +970524 + + add description of xterm-16color. + + modify name of shared-library on *BSD to end with $(REL_VERSION) + rather than $(ABI_VERSION) to match actual convention on FreeBSD + (cf: 960713). + + add OpenBSD to shared-library case, same as NetBSD and FreeBSD + (reported by Hugh Daniel ). + + corrected include-dependency in menu/Makefile so that "make install" + works properly w/o first doing "make". + + add fallback definition for isascii, used in infocmp. + + modify xmas to use color, and to exit right away when a key is + pressed. + + modify gdc so that the scrolled digits function as described (there + was no time delay between the stages, and the digits overwrote the + bounding box without tidying up). + + modify lib_color.c to use setaf/setab only for the ANSI color codes + 0 through 7. Using 16 colors requires setf/setb. + + modify ncurses 'c' test to work with 16 colors, as well as the normal + 8 colors. + + remove const qualifier from user data pointer in forms and menus + libraries (patch by Juergen Pfeifer). + + rewrote 'waddchnstr()' to avoid using the _nc_waddch_nosync() + function, thereby not interpreting tabs, etc., as per spec (patch by + Alexander V. Lukyanov). + +970517 + + suppress check for pre-existing ncurses header if the --prefix + option is specified. + + add configure options "--with-system-type" and + "--with-system-release" to assist in checking the generated + makefiles. + + add configure option "--enable-rpath" to allow installers to specify + that programs linked against shared libraries will have their library + path embedded, allowing installs into nonstandard locations. + + add flags to OSF1 shared-library options to specify version and + symbol file (patch by Tim Mooney ) + + add missing definition for ABI_VERSION to c++/Makefile.in (reported + by Satoshi Adachi ). + + modify link flags to accommodate HP-UX linker which embeds absolute + pathnames in executables linked against shared libraries (reported by + Jason Evans , solved by Alan Shutko + ). + + drop unnecessary check for attribute-change in onscreen_mvcur() since + mvcur() is the only caller within the library, and that check in turn + is exercised only from lib_doupdate.c (patch by Alexander V. + Lukyanov). + + add 'blank' parameter to _nc_scroll_window() so _nc_mvcur_scrolln() + can use the background of stdscr as a parameter to that function + (patch by Alexander V. Lukyanov). + + moved _nc_mvcur_scrolln() from lib_mvcur.c to lib_doupdate.c, to use + the latter's internal functions, as well as to eliminate unnecessary + cursor save/restore operations (patch by Alexander V. Lukyanov). + + omit parameter of ClrUpdate(), since it is called only for newscr, + further optimized/reduced by using ClearScreen() and TransformLine() + to get rid of duplicate code (patch by Alexander V. Lukyanov). + + modify scrolling algorithm in _nc_scroll_optimize() to reject hunks + that are smaller than the distance to be moved (patch by Alexander V. + Lukyanov). + + correct a place where the panel library was not ifdef'd in ncurses.c + (Juergen Pfeifer) + + documentation fixes (Juergen Pfeifer) + +970515 4.1 release for upload to prep.ai.mit.edu + + re-tag changes since 970505 as 4.1 release. + +970510 + + modify ncurses 'g' test to allow mouse input + + modify default xterm description to include mouse. + + modify configure script to add -Wwrite-strings if gcc warnings are + enabled while configuring --enable-const (and fixed related + warnings). + + add toggle, status display for keypad mode to ncurses 'g' test to + verify that keypad and scrollok are not inherited from parent window + during a call to newwin. + + correction to MKexpanded.sh to make it work when configure --srcdir + is used (reported by H.J.Lu). + + revise test for bool-type, ensuring that it checks if builtin.h is + available before including it, adding test for sizeof(bool) equal + to sizeof(short), and warning user if the size cannot be determined + (reported by Alexander V. Lukyanov). + + add files to support configuration of ncurses as an add-on library + for GNU libc (patch by H.J.Lu ) + +970506 + + correct buffer overrun in lib_traceatr.c + + modify change to lib_vidattr.c to avoid redundant orig_pair. + + turn on 'echo()' in hanoi.c, since it is initially off. + + rename local 'errno' variable in etip.h to avoid conflict with global + (H.J.Lu). + + modify configure script to cache LD, AR, AR_OPTS (patch by H.J.Lu + ) + +970505 4.1 pre-release + + regenerate the misc directory html dumps without the link list, which + is not useful. + + correct dependency in form directory makefile which caused + unnecessary recompiles. + + correct substitution for ABI_VERSION in test-makefile + + modify install rules for shared-library targets to remove the target + before installing, since some install programs do not properly handle + overwrite of symbolic links. + + change order of top-level targets so that 'include' immediate + precedes the 'ncurses' directory, reducing the time between new + headers and new libraries (requested by Larry Virden). + + modify lib_vidattr.c so that colors are turned off only before + modifying other attributes, turned on after others. This makes the + hanoi.c program display correctly on FreeBSD console. + + modify debug code in panel library to print user-data addresses + rather than the strings which they (may) point to. + + add check to ensure that C++ binding and demo are not built with g++ + versions below 2.7, since the binding uses templates. + + modify c++ binding and demo to build and run with SGI's c++ compiler. + (It also compiles with the Sun SparcWorks compiler, but the demo does + not link, due to a vtbl problem). + + corrections to demo.cc, to fix out-of-scope variables (Juergen + Pfeifer). + +970503 + + correct memory leak in _nc_trace_buf(). + + add configure test for regexpr.h, for Unixware 1.x. + + correct missing "./" prefixing names of generated files in ncurses + directory. + + use single-quotes in configure scripts assignments for MK_SHARED_LIB + to workaround shell bug on FreeBSD 2.1.5 + + remove tabs from intermediate #define's for GCC_PRINTF, GCC_SCANF + that caused incorrect result in ncurses_cfg.h + + correct initialization in lib_trace.c, which omitted version info. + + remove ech, el1 attributes from cons25w description; they appear to + malfunction in FreeBSD 2.1.5 + + correct color attributes in terminfo.src and lib_color.c to match + SVr4 behavior by interchanging codes 1,4, 3,6 in the setf/setb + capabilities. + + use curs_set() rather than checks via tigetstr() for test programs + that hide the cursor: firework, rain, worm. + + ensure that if the terminal lacks change_scroll_region, parm_index + and parm_rindex are used only to scroll the whole screen (patch by + Peter Wemm). + + correct curs_set() logic, which did not return ERR if the requested + attributes did not exist, nor did it assume an unknown initial state + for the cursor (patch by Alexander V. Lukyanov). + + combine IDcTransformLine and NoIDcTransformLine to new TransformLine + function in lib_doupdate.c (patch by Alexander V. Lukyanov). + + correct hashmap.c, which did not update index information (patch by + Alexander V. Lukyanov). + + fixes for C++ binding and demo (see c++/NEWS) (Juergen Pfeifer). + + correct index in lib_instr.c (Juergen Pfeifer). + + correct typo in 970426 patch from Tom's cleanup of lib_overlay.c + (patch by Juergen Pfeifer). + +970426 + + corrected cost computation in PutRange(), which was using + milliseconds compared to characters by adding two new members to the + SCREEN struct, _hpa_ch_cost and _cup_ch_cost. + + drop ncurses/lib_unctrl.c, add ncurses/MKunctrl.awk to generate a + const array of strings (suggested by Alexander V. Lukyanov). The + original suggestion in 970118 used a perl script. + + rewrote ncurses 'b' test to better exercise magic-cookie (xmc), as + well as noting the attributes that are not supported by a terminal. + + trace the computation of cost values in lib_mvcur.c + + modify _nc_visbuf() to use octal rather than hex, corrected sign + extension bug in that function that caused buffer overflow. + + modify trace in lib_acs.c to use _nc_visbuf(). + + suppress trace within _traceattr2(). + + correct logic of _tracechtype2(), which did not account for repeats + or redefinition within an acsc string. + + modify debug-library version baudrate() to use environment variable + $BAUDRATE to override speed computation. This is needed for + regression testing. + + correct problems shown by "weblint -pedantic". + + update mailing-list information (now ncurses@bsdi.com). + +970419 + + Improve form_field_validation.3x manpage to better describe the + precision parameter for TYPE_NUMERIC and TYPE_INTEGER. Provide more + precise information how the range checking can be avoided. (patch by + Juergen Pfeifer, reported by Bryan Henderson) + + change type of min/max value of form types TYPE_INTEGER to long to + match SVr4 documentation. + + set the form window to stdscr in set_form_win() so that form_win() + won't return null (patch by Juergen Pfeifer, reported by Bryan + Henderson ). + +970412 + + corrected ifdef'ing of inline (cf: 970321) for TRACE vs C++. + + corrected toggle_attr_off() macro (patch by Andries Brouwer). + + modify treatment of empty token in $MANPATH to /usr/man (reported by + ) + + modify traces that record functions-called so that chtype and attr_t + values are expressed symbolically, to simplify reuse of generated + test-scripts on SVr4 regression testing. + + add new trace functions _traceattr2() and _tracechtype2() + +970405 + + add configure option --enable-const, to support the use of 'const' + where XSI should have, but did not, specify. This defines + NCURSES_CONST, which is an empty token otherwise, for strict + compatibility. + + make processing of configure options more verbose by echoing the + --enable/--with values. + + add configure option --enable-big-core + + set initial state of software echo off as per XSI. + + check for C++ builtin.h header + + correct computation of absolute-path for $INSTALL that dropped "-c" + parameter from the expression. + + rename config.h to ncurses_cfg.h to avoid naming-conflict when + ncurses is integrated into larger systems (adapted from diffs by + H.J.Lu for libc). + + correct inequality in lib_doupdate.c that caused a single-char to not + be updated when the char on the right-margin was not blank, idcok() + was true (patch by Alexander V Lukyanov (in 970124), reported + by Kriang Lerdsuwanakij in 970329). + + modify 'clean' rule in include/Makefile so that files created by + configure script are removed in 'distclean' rule instead. + +970328 + + correct array limit in tparam_internal(), add case to interpret "%x" + (patch by Andreas Schwab) + + rewrote number-parsing in ncurses.c 'd' test; it did not reset the + value properly when non-numeric characters were given (reported by + Andreas Schwab ) + +970321 + + move definition of __INTERNAL_CAPS_VISIBLE before include for + progs.priv.h (patch by David MacKenzie). + + add configuration summary, reordered check for default include + directory to better accommodate a case where installer is configuring + a second copy of ncurses (reported by Klaus Weide + ) + + moved the #define for 'inline' as an empty token from the + $(CFLAGS_DEBUG) symbol into config.h, to avoid redefinition warning + (reported by Ward Horner). + + modify test for bool builtin type to use 'unsigned' rather than + 'unknown' when cross-compiling (reported by Ward Horner). + +970315 + + add header dependencies so that "make install.libs" will succeed + even if "make all" is not done first. + + moved some macros from lib_doupdate.c to curses.priv.h to use in + expanded functions with ATAC. + + correct implementation of lib_instr.c; both XSI and SVr4 agree that + the winnstr functions can return more characters than will fit on one + line. + +970308 + + modify script that generates lib_gen.c to support traces of called & + return. + + add new configure option "--disable-macros", for testing calls within + lib_gen.c + + corrected logic that screens level-checking of called/return traces. + +970301 + + use new configure macro NC_SUBST to replace AC_PATH_PROG, better + addressing request by Ward Horner. + + check for cross-compiling before trying to invoke the autoconf + AC_FUNC_SETVBUF_REVERSED macro (reported by Ward Horner) + + correct/simplify loop in _nc_visbuf(), 970201 changes omitted + a pointer-increment. + + eliminate obsolete symbol SHARED_ABI from dist.mk (noted by + Florian La Roche). + +970215 + + add configure option --enable-expanded, together with code that + implements an expanded form of certain complex macros, for testing + with ATAC. + + disable CHECK_POSITION unless --with-assertions is configured + (Alexander V Lukyanov pointed out that this is redundant). + + use keyname() to show traced chtype values where applicable rather + than _tracechar(), which truncates the value to 8-bits. + + minor fixes to TRACE_ICALLS, added T_CREATE, TRACE_CCALLS macros. + + modify makefiles in progs and test directories to avoid using C + preprocessor options on link commands (reported by Ward Horner) + + correct ifdef/include-order for nc_alloc.h vs lib_freeall.c (reported + by Ward Horner) + + modify ifdef's to use configure-defined symbols consistently + (reported by Ward Horner) + + add/use new makefile symbols AR, AR_OPTS and LD to assist in non-UNIX + ports (reported by Ward Horner ) + + rename struct try to struct tries, to avoid name conflict with C++ + (reported by Gary Johnson). + + modify worm.c to hide cursor while running. + + add -Wcast-qual to gcc warnings, fix accordingly. + + use PutChar rather than PutAttrChar in ClrToEOL to properly handle + wrapping (Alexander V Lukyanov). + + correct spurious echoing of input in hanoi.c from eric's #291 & #292 + patches (reported by Vernon C. Hoxie ). + + extend IRIX configuration to IRIX64 + + supply missing install.libs rule needed after restructuring + test/Makefile.in + +970208 + + modify "make mostlyclean" to leave automatically-generated source + in the ncurses directory, for use in cross-compiles. + + autogenerated object-dependencies for test directory + + add configure option --with-rcs-ids + + modify configuration scripts to generate major/minor/patch versions + (suggested by Alexander V Lukyanov). + + supply missing va_end's in lib_scanw.c + + use stream I/O for trace-output, to eliminate fixed-size buffer + + add TRACE_ICALLS definition/support to lib_trace.c + + modify Ada95 binding to work with GNAT 3.09 (Juergen Pfeifer). + +970201 + + add/modify traces for called/return values to simplify extraction + for test scripts. + + changed _nc_visbuf to quote its result, and to dynamically allocate + the returned buffer. + + invoke ldconfig after installing shared library + + modify install so that overwrite applies to shared library -lcurses + in preference to static library (reported by Zeyd M Ben-Halim 960928). + + correct missing ';' in 961221 mod to overwrite optional use of $(LN_S) + symbol. + + fixes to allow "make install" to work without first doing a "make + all" (suggested by Larry Virden). + +970125 + + correct order of #ifdef for TABS_OK. + + instrumented toe.c to test memory-leaks. + + correct memory-deallocation in toe.c (patch by Jesse Thilo). + + include in configuration test for regex.h (patch by + Andreas Schwab) + + make infocmp recognize -I option, for SVr4 compatibility (reported by + Andreas Schwab ) + +970118 + + add extension 'use_default_colors()', modified test applications that + use default background (firework, gdc, hanoi, knight, worm) to + demonstrate. + + correct some limit checks in lib_doupdate.c exposed while running + worm. + + use typeCalloc macro for readability. + + add/use definition for CONST to accommodate testing with Solaris + (SVr4) curses, which doesn't use 'const' in its prototypes. + + modify ifdef's in test/hashtest.c and test/view.c to compile with + Solaris curses. + + modify _tracedump() to pad colors & attrs lines to match change + in 970101 showing first/last changes. + + corrected location of terminating null on dynamically allocated forms + fields (patch by Per Foreby). + +970111 + + added headers to make view.c compile on SCO with the resizeterm() + code (i.e., struct winsize) - though this compiles, I don't have a + suitable test configuration since SIGWINCH doesn't pass my network to + that machine - T.Dickey. + + update test/configure.in to supply some default substitutions. + + modify configure script to add -lncurses after -lgpm to fix problem + linking against static libraries. + + add a missing noraw() to test/ncurses.c (places noted by Jeremy + Buhler) + + add a missing wclear() to test/testcurs.c (patch by Jeremy Buhler + ) + + modify headers to accommodate compilers that don't allow duplicate + "#define" lines for NCURSES_VERSION (reported by Larry W. Virden + ) + + fix formatting glitch in curs_getch.3x (patch by Jesse Thilo). + + modify lib_doupdate to make el, el1 and ed optimization use the + can_clear_with macro, and change EmitRange to allow leaving cursor at + the middle of interval, rather than always at the end (patch by + Alexander V Lukyanov). This was originally 960929, resync 970106. + +970104 + + workaround defect in autoconf 2.12 (which terminates configuration + if no C++ compiler is found) by adding an option --without-cxx. + + modify several man-pages to use tbl, where .nf/.fi was used (reported + by Jesse Thilo). + + correct font-codes in some man-pages (patch by Jesse Thilo + ) + + use configure script's knowledge of existence of g++ library for the + c++ Makefile (reported by Paul Jackson). + + correct misleading description of --datadir configuration option + (reported by Paul Jackson ) + +970101 + + several corrections to _nc_mvcur_scrolln(), prompted by a bug report + from Peter Wemm: + > the logic for non_dest_scroll_region was interchanged between the + forward & reverse scrolling cases. + > multiple returns from the function allowed certain conditions to do + part of an operation before discovering that it couldn't be + completed, returning an error without restoring the cursor. + > some returns were ERR, where the function had completed the + operation, because the insert/delete line logic was improperly + tested (this was probably the case Peter saw). + > contrary to comments, some scrolling cases were tested after the + insert/delete line method. + + modify _tracedump() to show first/last changes. + + modify param of ClrUpdate() in lib_doupdate.c to 'newscr', fixes + refresh problem (reported by Peter Wemm) that caused nvi to not show + result of ":r !ls" until a ^L was typed. + +961229 (internal alpha) + + correct some of the writable-strings warnings (reported by Gary + Johnson ). Note that most of the remaining ones + are part of the XSI specification, and can't be "fixed". + + improve include-dependencies in form, menu, panel directories. + + correct logic of delay_output(), which would return early if + there is data on stdin. + + modify interface & logic of _nc_timed_wait() to support 2 file + descriptors, needed for GPM. + + integrate patch by Andrew Kuchling for GPM (mouse) + support, correcting logic in wgetch() and _nc_mouse_parse() which + prevented patch from working properly -TD + + improve performance of panel algorithm (Juergen Pfeifer 961203). + + strip RCS id's from generated .html files in Ada95 subtree. + + resync with generated .html files (Juergen Pfeifer 961223). + + terminfo.src 10.1.0 (ESR). + +961224 4.0 release + + release as 4.0 to accommodate Linux ld.so.1.8.5 + + correct syntax/spelling, regenerated .doc files from .html using + lynx 2.5 + + refined forms/menus makefiles (Juergen Pfeifer 961223). + +961221 - snapshot + + remove logic in read_entry.c that attempts to refine errno by using + 'access()' for the directory (from patch by Florian La Roche). + + correct configure test/substitution that inhibits generating + include-path to /usr/include if gcc is used (reported by Florian La + Roche). + + modify setupterm() to allocate new TERMINAL for each call, just as + solaris' curses does (Alexander V Lukyanov 960829). + + corrected memory leaks in read_entry.c + + add configure options --with-dbmalloc, --with-dmalloc, and + --disable-leaks, tested by instrumenting infocmp, ncurses programs. + + move #include's for stdlib.h and string.h to *.priv.h to accommodate + use of dbmalloc. + + modify use of $(LN_S) to follow recommendation in autoconf 2.12, + i.e., set current directory before linking. + + split-out panel.priv.h, improve dependencies for forms, menus + (Juergen Pfeifer 961204). + + modify _nc_freewin() to reset globals curscr/newscr/stdscr when + freeing the corresponding WINDOW (found using Purify). + + modify delwin() to return ERR if the window to be deleted has + subwindows, needed as a side-effect of resizeterm() (found using + Purify). Tested and found that SVr4 curses behaves this way. + + implement logic for _nc_freeall(), bringing stub up to date. + +961215 + + modify wbkgd() so that it doesn't set nulls in the rendered text, + even if its argument doesn't specify a character (fixes test case by + Juergen Pfeifer for bug-report). + + set window-attributes in wbkgd(), to simplify comparison against + Solaris curses, which does this. + +961214 - snapshot + + replace most constants in ncurses 'o' test by expressions, making it + work with wider range of screen sizes. + + add options to ncurses.c to specify 'e' test softkey format, and the + number of header/footer lines to rip-off. + + add ^R (repaint after resize), ^L (refresh) commands to ncurses 'p' + test. + + add shell-out (!) command to ncurses 'p' test to allow test of + resize between endwin/refresh. + + correct line-wrap case in mvcur() by emitting carriage return, + overlooked in 960928, but needed due to SVr4 compatibility changes to + terminal modes in 960907. + + correct logic in wresize that causes new lines to be allocated, + broken for the special case of increasing rows only in 960907's fix + for subwindows. + + modify configure script to generate $(LDFLAGS) with -L and -l options + in preference to explicit library filenames. (NOTE: this may + require further amending, since I vaguely recall a dynamic loader + that did not work properly without the full names, but it should be + handled as an exception to the rule, since some linkers do bulk + inclusion of libraries when given the full name - T.Dickey). + + modify configure script to allow user-supplied $CFLAGS to set the + debug-option in all libraries (requested by lots of people) -TD + + use return consistently from main(), rather than exit (reported by + Florian La Roche). + + add --enable-getcap-cache option to configure, normally disabled + (requested by Florian La Roche). + + make configure test for gettimeofday() and possibly -lbsd more + efficient (requested by Florian La Roche ) + + minor adjustments to Ada95 binding (patches by Juergen Pfeifer) + + correct attributes after emitting orig_pair in lib_vidattr.c (patch + by Alexander V Lukyanov). + +961208 + + corrected README wrt Ada95 (Juergen Pfeifer) + +961207 - snapshot + + integrate resizeterm() into doupdate(), so that if screen size + changes between endwin/refresh, ncurses will resize windows to fit + (this needs additional testing with pads and softkeys). + + add, for memory-leak testing, _nc_freeall() entrypoint to free all + data used in ncurses library. + + initialize _nc_idcok, _nc_idlok statically to resolve discrepancy + between initscr() and newwin() initialization (reported by + Alexander V Lukyanov). + + test built VERSION=4.0, SHARED_ABI=4 with Linux ld.so.1.8.5 + (set beta versions to those values -- NOTE that subsequent pre-4.0 + beta may not be interchangeable). + + modify configure script to work with autoconf 2.12 + +961130 1.9.9g release + + add copyright notices to configuration scripts (written by Thomas + Dickey). + +961127 + > patch, mostly for panel (Juergen Pfeifer): + + cosmetic improvement for a few routines in the ncurses core library + to avoid warning messages. + + the panel overlap detection was broken + + the panel_window() function was not fool-proof. + + Some inlining... + + Cosmetic changes (also to avoid warning messages when compiling with + -DTRACE). + +961126 + > patch by Juergen Pfeifer: + + eliminates warning messages for the compile of libform. + + inserts Per Foreby's new field type TYPE_IPV4 into libform. + + Updates man page and the Ada95 binding to reflect this. + + Improves inlining in libmenu and libform. + +961120 + + improve the use of the "const" qualifier in the + panel library (Juergen Pfeifer) + + change set_panel_userptr() and panel_userptr() to use void* + (Juergen Pfeifer) + +961119 + + change ABI to 3.4 + + package with 961119 version of Ada95 binding (fixes for gnat-3.07). + (Juergen Pfeifer) + + correct initialization of the stdscr pseudo panel in panel library + (Juergen Pfeifer) + + use MODULE_ID (rcs keywords) in forms and menus libraries (Juergen + Pfeifer). + > patch #324 (ESR): + + typo in curs_termcap man page (reported by Hendrik Reichel + <106065.2344@compuserve.com>) + + change default xterm entry to xterm-r6. + + add entry for color_xterm + +961116 - snapshot + + lint found several functions that had only #define implementations + (e.g., attr_off), modified curses.h.in to generate them as per XSI + Curses requirement that every macro be available as a function. + + add check in infocmp.c to guard against string compare of + CANCELLED_STRING values. + + modify firework.c, rain.c to hide cursor while running. + + correct missing va_end in lib_tparm.c + + modify hanoi.c to work on non-color terminals, and to use timing + delays when in autoplay mode. + + correct 'echochar()' to refresh immediately (reported by Adrian + Garside <94ajg2@eng.cam.ac.uk>) + > patch #322 (ESR): + + reorganize terminfo.src entries for xterm. + +961109 - snapshot + + corrected error in line-breakout logic (lib_doupdate.c) + + modified newdemo to use wgetch(win) rather than getch() to eliminate + a spurious clear-screen. + + corrected ifdef's for 'poll()' configuration. + + added modules to ncurses, form, menu for Ada95 binding (Juergen + Pfeifer). + + modify set_field_buffer() to allow assignment of string longer than + the initial buffer length, and to return the complete string rather + than only the initial size (Juergen Pfeifer and Per Foreby + ). + +961102 - snapshot + + configure for 'poll()' in preference to 'select()', since older + systems are more likely to have a broken 'select()'. + + modified render_char() to avoid OR'ing colors. + + minor fixes to testcurs.c, newdemo.c test programs: ifdef'd out the + resize test, use wbkgd and corrected box() parameters. + + make flushinp() test work in ncurses.c by using napms() instead of + sleep(). + + undo ESR's changes to xterm-x11r6 (it no longer matched the X11R6.1 + distribution, as stated) + + terminfo 9.13.18 resync (ESR) + + check for getenv("HOME") returning null (ESR). + + change buffer used to decode xterm-mouse commands to unsigned to + handle displays wider than 128 chars (Juergen Pfeifer). + + correct typo curs_outopts.3x (Juergen Pfeifer). + + correct limit-checking in wenclose() (Juergen Pfeifer). + + correction to Peter Wemm's newwin change (Thomas Fehr + ). + + corrections to logic that combines colors and attributes; they must + not be OR'd (Juergen Pfeifer, extending from report/patch by Rick + Marshall). + +961026 - snapshot + + reset flags in 'getwin()' that might cause refresh to attempt to + manipulate the non-existent parent of a window that is read from a + file (lib_screen.c). + + restructure _nc_timed_wait() to log more information, and to try to + recover from badly-behaved 'select()' calls (still testing this). + + move define for GOOD_SELECT into configure script. + + corrected extra '\' character inserted before ',' in comp_scan.c + + corrected expansion of %-format characters in dump_entry.c; some were + rendered as octal constants. + + modify dump_entry.c to make terminfo output more readable and like + SVr4, by using "\s" for spaces (leading/trailing only), "\," for + comma, "\^" and "\:" as well. + + corrected some memory leaks in ncurses.c, and a minor logic error + in the top-level command-parser. + + correction for label format 4 (PC style with info line), a + slk_clear(), slk_restore() sequence didn't redraw the info line + (Juergen Pfeifer). + + modified the slk window (if simulated) to inherit the background and + default character attributes from stdscr (Juergen Pfeifer). + + corrected limit-check in set_top_row (Juergen Pfeifer). + +961019 - snapshot + + correct loop-limit in wnoutrefresh(), bug exposed during pipe-testing + had '.lastchar' entry one beyond '._maxx'. + + modify ncurses test-program to work with data piped to it. + + corrected pathname computation in run_tic.sh, removing extra "../" + (reported by Tim Mooney). + + modified configure script to use previous install's location for + curses.h + + added NetBSD and FreeBSD to platforms that use --prefix=/usr as + a default. + +961013 + + revised xterm terminfo descriptions to reflect the several versions + that are available. + + corrected a pointer reference in dump_entry.c that didn't test if + the pointer was -1. + +961005 - snapshot + + correct _nc_mvcur_scrolln for terminals w/o scrolling region. + + add -x option to hashtest to control whether it allows writes to the + lower-right corner. + + ifdef'd (NCURSES_TEST) the logic for _nc_optimize_enable to make it + simpler to construct tests (for double-check of _nc_hash_map tests). + + correct ifdef's for c++ in curses.h + + change default xterm type to xterm-x11r6. + + correct quoting in configure that made man-pages installed with + $datadir instead of actual terminfo path. + + correct whitespace in include/Caps, which caused kf11, clr_eol and + clr_end to be omitted from terminfo.5 + + fix memory leaks in delscreen() (adapted from Alexander V Lukyanov). + + improve appearance of marker in multi-selection menu (Juergen + Pfeifer) + + fix behavior for forms with all fields inactive (Juergen Pfeifer) + + document 'field_index()' (Juergen Pfeifer) + > patch #321 (ESR): + + add some more XENIX keycap translations to include/Caps. + + modify newwin to set initial state of each line to 'touched' + (from patch by Peter Wemm ) + + in SET_TTY, replace TCSANOW with TCSADRAIN (Alexander V Lukyanov). + +960928 - snapshot + + ifdef'd out _nc_hash_map (still slower) + + add graphic characters to vt52 description. + + use PutAttrChar in ClrToEOL to ensure proper background, position. + + simplify/correct logic in 'mvcur()' that does wrapping; it was + updating the position w/o actually moving the cursor, which broke + relative moves. + + ensure that 'doupdate()' sets the .oldindex values back to a sane + state; this was causing a spurious refresh in ncurses 'r'. + + add logic to configure (from vile) to guard against builders who + don't remove config.cache & config.status when doing new builds -TD + + corrected logic for 'repeat_char' in EmitRange (cf: eric #317), which + did not follow the 2-parameter scheme specified in XSI. + + corrected logic of wrefresh, wnoutrefresh broken in #319, making + clearok work properly (report by Michael Elkins). + + corrected problem with endwin introduced by #314 (removing the + scrolling-region reset) that broke ncurses.c tests. + + corrected order of args in AC_CHECK_LIB (from report by Ami Fischman + ). + + corrected formatting of terminfo.5 tables (Juergen Ehling) + > patch 320 (ESR): + + change ABI to 3.3 + + emit a carriage-return in 'endwin()' to workaround a kernel bug in + BSDI. (requested by Mike Karels ) + + reverse the default o configure --enable-termcap (consensus). + > patch 319 (ESR): + + modified logic for clearok and related functions (from report by + Michael Elkins) - untested + > patch 318 (ESR): + + correction to #317. + > patch 317 (ESR): + + re-add _nc_hash_map + + modify EmitRange to maintain position as per original design + (patch by A. Lukyanov). + + modify test/ncurses.c and tputs, etc., to allow trace counting + output characters. + + add hashtest.c program to time the hashmap optimization. + > patch 316 (ESR): + + add logic to deal with magic-cookie (how was this tested?) + (lib_doupdate.c). + + add ncurses.c driver for magic-cookie, some fixes to ncurses.c + > patch 315 (ESR): + + merge changes to lib_doupdate.c to use ech and rep - untested + (patch by Alexander V Lukyanov). + + modified handling of interrupted system calls - untested + (lib_getch.c, lib_twait.c). + + new function _nc_mvcur_resume() + + fix return value for 'overlay()', 'overwrite()' + +960914 - snapshot + + implement subwindow-logic in wresize, minor fixes to ncurses 'g' + test. + + corrected bracketing of fallback.c (reported/suggested fix by Juergen + Ehling ). + + update xterm-color to reflect XFree86 3.1.3G release. + + correct broken dtterm description from #314 patch (e.g., spurious + newline. The 'pairs' change might work, but no one's tested it + either ;-) + + clarify the documentation for the builtin form fieldtypes (Juergen + Pfeifer) + > patch 314 (ESR): + + reset scroll region on startup rather than at wrapup time + (enhancement suggested by Alexander V Lukyanov). + + make storage of palette tables and their size counts per-screen for + multi-terminal applications (suggested by Alexander V Lukyanov). + + Improved error reporting for infotocap translation errors. + + Update terminfo.src to 9.13.14. + +960907 - snapshot + + rewrote wgetstr to make it erase control chars and also fix bogus use + of _nc_outstr which caused the display to not wrap properly (display + problem reported by John M. Flinchbaugh ) + + modify ncurses 'f' test to accommodate terminal responses to C1 codes + (and split up this screen to accommodate non-ANSI terminals). + + test enter_insert_mode and exit_insert_mode in has_ic(). + + removed bogus logic in mvcur that assumes nl/nonl set output modes + (XSI says they are input modes; SVr4 implements this). + + added macros SET_TTY, GET_TTY to term.h + + correct getstr() logic that altered terminal modes w/o restoring. + + disable ICRNL, etc., during initialization to match SVr4, removing + the corresponding logic from raw, cbreak, etc. + + disable ONLCR during initialization, to match SVr4 (this is needed + for cursor optimization when the cursor-down is a newline). + + replaced ESR's imitation of wresize with my original (his didn't + work). + +960831 - snapshot + + memory leaks (Alexander V. Lukyanov). + + modified pnoutrefresh() to be more tolerant of too-large screen + size (reported by Michael Elkins). + + correct handling of terminfo files with no strings (Philippe De + Muyter) + + correct "tic -s" to take into account -I, -C options. + + modify ncurses 'f' test to not print codes 80 through 9F, since they + are considered control codes by ANSI terminals. + +960824 - snapshot + + correct speed variable-type in 'tgetent()' (reported by Peter Wemm) + + make "--enable-getcap" configuration-option work (reported by + Peter Wemm ) + +960820 + + correct err in 960817 that changed return-value of tigetflag() + (reported by Alexander V. Lukyanov). + + modify infocmp to use library default search-path for terminfo + directory (Alexander V. Lukyanov). + +960817 - snapshot + + corrected an err in mvcur that broke resizing-behavior. + + correct fall-thru behavior of _nc_read_entry(), which was not finding + descriptions that existed in directories past the first one searched + (reported by Alexander V. Lukyanov) + + corrected typo in dtterm description. + > patch 313 (ESR): + + add dtterm description + + clarify ncurses 'i' test (drop mvwscanw subtest) + +960810 - snapshot + + correct nl()/nonl() to work as per SVr4 & XSI. + + minor fixes to ncurses.c (use 'noraw()', mvscanw return-code) + + refine configure-test for "-g" option (Tim Mooney). + + correct interaction between O_BLANK and NEW_LINE request in form + library (Juergen Pfeifer) + +960804 + + revised fix to tparm; previous fix reversed parameter order. + > patch 312 (ESR): + correct terminfo.src corrupted by #310 + > patch 311 (ESR): + + fix idlok() and idcok() and the default of the idlok switch (report + by Ville Sulko). + +960803 - snapshot + + corrected tparm to handle capability strings without explicit pop + (reported by William P Setzer) + + add fallback def for GCC_NORETURN, GCC_UNUSED for termcap users + (reported by Tim Mooney). + > patch 310 (ESR): + + documentation and prototyping errors for has_color, immedok and idcok + (reported by William P Setzer ) + + updated qnx terminfo entry (patch by Michael Hunter) + +960730 + + eliminate quoted includes in ncurses subdirectory, ensure config.h + is included first. + + newterm initializes terminal settings the same as initscr (reported + by Tim Mooney). + +960727 - snapshot + + call cbreak() in initscr(), as per XSI & SVr4. + + turn off hardware echo in initscr() as per XSI & SVr4 + > patch 309 (ESR): + + terminfo changes (9.3.9), from BRL + + add more checks to terminfo parser. + + add more symbols to infocmp. + +960720 - snapshot + + save previous-attribute in lib_vidattr.c if SP is null (reported by + Juergen Fluk ) + + corrected calls on _nc_render so that background character is set + as per XSI. + + corrected wbkgdset macro (XSI allows background character to be + null), and tests that use it. + + more corrections to terminfo (xterm & rxvt) + + undid change to mcprint prototype (cannot use size_t in curses.h + because not all systems declare it in the headers that we can safely + include therein). + + move the ifdefs for errno into curses.priv.h + > patch 308 (ESR): + + terminfo changes (9.3.8) + + modified logic of error-reporting in terminfo parser + + fix option-processing bug in toe. + +960713 - snapshot + + always check for since ISC needs it to declare + fd_set (Juergen Pfeifer) + + install shared-libraries on NetBSD/FreeBSD with ABI-version (reported + by Juergen Pfeifer, Mike Long) + + add LOCAL_LDFLAGS2 symbol (Juergen Pfeifer) + + corrected prototype for delay_output() -- bump ABI to 3.2 + + patch 307 (ESR): + + enable more translations of nonstandard caps, and document them. + + misc/terminfo.src update to 9.13.8 + + patch 306 (ESR): + + moved logic that filters out rmul and rmso from setupterm to newterm + where it is less likely to interfere with termcap applications. + + cosmetic fixes to test/ncurses.c + + modify open() call in ncurses/read_entry.c to use O_RDONLY symbol + rather than constant (report by mib). + + misc/terminfo.src sgr0 and acsc changes (report by Philippe De + Muyter). + + modify ncurses/comp_parse.c so that entries containing a "+" can + have missing rmcup vs smcup. + +960707 + + rollback ESR's #305 change to terminfo.src (it breaks existing + applications, e.g., 'less 290'). + + correct path of edit_man.sh, and fix typo that made all man-pages + preformatted. + + restore man/menu_requestname.3x omitted in Zeyd's resync (oops). + + auto-configure the GCC_PRINTFLIKE/GCC_SCANFLIKE macros (reported by + Philippe De Muyter). + +960706 - snapshot + + make lib_vidattr.c more readable using macros. + + filter out rmul, rmso that conflict with sgr0 when reading terminal + descriptions. + + work around autoconf bug, force $INSTALL to absolute path + (reported by Zeyd). + + modify man-page install for BSDI to install preformatted .0 files + (reported by David MacKenzie). + + add/use gcc __attribute__ for printf and scanf in curses.h + + added SGR attributes test-case to ncurses + + revised ncurses 't' logic to show trace-disable effect in the menu. + + use getopt in ncurses program to process -s and -t options. + + make ncurses 'p' legend toggle with '?' + + disable scrollok during the ncurses 'p' test; if it is enabled the + stdscr will scroll when putting the box-corners in the lower-right + of the screen. + > patch 305 (ESR): + + added sanity-checking of various paired string attributes. + + misc/terminfo.src update to 9.13.7 (report by A. Lukyanov). + + modify man/Makefile.in to make terminfo.5 during normal build. + > patch 304 (ESR): + + corrected allocation-length for $HOME/.terminfo path. + +960629 - snapshot + + check return code of _nc_mvcur_scrolln() in _nc_scroll_optimize() for + terminals with no scrolling-support (reported by Nikolay Shadrin + ) + + added ^S scrollok-toggle to ncurses 'g' test. + + added ^T trace-toggle to ncurses tests. + + modified ncurses test program to use ^Q or ESC consistently for + terminating tests (rather than ^D), and to use control keys rather + than function keys in 'g' test. + + corrected misplaced wclrtoeol calls in addch to accommodate wrapping + (reported by Philippe De Muyter). + + modify lib_doupdate.c to use effective costs to tradeoff between + delete-character/insert-character vs normal updating (reported by + David MacKenzie). + + compute effective costs for screen update operations (e.g., clr_eos, + delete_character). + + corrected error in knight.c exposed by wrap fixes in 960622; the + msgwin needed scrollok set. + + corrected last change to IDcTransformLine logic to avoid conflict + between PutRange and InsStr + + modified run_tic.sh to not use /usr/tmp (reported by David + MacKenzie), and further revised it and aclocal.m4 to use $TMPDIR if + set. + + corrected off-by-one in RoomFor call in read_entry.c + +960622 - snapshot + + modified logic that wraps cursor in addch to follow the XSI spec, + (implemented in SVr4) which states that the cursor position is + updated when wrapping. Renamed _NEED_WRAP to _WRAPPED to reflect the + actual semantics. + + added -s option to tic, to provide better diagnostics in run_tic.sh + + improved error-recovery for tabset install. + + change ABI to 3.1 (dropped tparam, corrected getbkgd(), added + _yoffset to WINDOW). + + modified initialization of SP->_ofp so that init_acs() is called with + the "right" file pointer (reported by Rick Marshall + + documentation fixes (Juergen Pfeifer). + + corrected, using new SCREEN and WINDOW members, the behavior of + ncurses if one uses ripoffline() to remove a line from the top of the + screen (Juergen Pfeifer). + + modified autoconf scripts to prepare for Ada95 (GNAT) binding to + ncurses (Juergen Pfeifer). + + incorrect buffer-size in _nc_read_entry, reported by ESR. + +960617 + + corrected two logic errors in read_entry.c, write_entry.c (called by + tic, the write/read of terminfo entries used inconsistent rules for + locating the entries; the $TERMINFO_DIRS code would find only the + first entry in a list). + + refined pathname computation in run_tic.sh and shlib. + + corrected initialization of $IP in misc/run_tic.sh + +960615 - snapshot + + ifdef'd out _nc_hash_map() call because it does not improve speed. + + display version of gcc if configure script identifies it. + + modify configure script to use /usr as Linux's default prefix. + + modify run_tic.sh to use shlib script, fixes some problems installing + with a shared-library configuration. + + adjusted configure script so that it doesn't run tests with the + warnings turned on, which makes config.log hard to read. + + added 'lint' rule to top-level Makefile. + + added configure option '--with-install-prefix' for use by system + builders to install into staging locations (requested by + Charles Levert ). + + corrected autoconfigure for Debian man program; it's not installed + as "man_db". + + set noecho in 'worm'; it was ifdef'd for debug only + + updated test/configure.in for timing-display in ncurses 'p' test + + corrected misspelled 'getbkgd()'. + + corrected wbkgdset to work like observed syvr4 (sets A_CHARTEXT part + to blank if no character given, copies attributes to window's + attributes). + + modified lib_doupdate.c to use lower-level SP's current_attr state + instead of curscr's state, since it is redundant. + + correction to IDcTransformLine logic which controls where InsStr is + invoked (refined by Alexander V Lukyanov). + > patch 303 (ESR): + + conditionally include Chris Torek's hash function _nc_hash_map(). + + better fix for nvi refresh-bug (Rick Marshall) + + fix for bug in handling of interrupted keystroke waits, + (Werner Fleck). + + misc/ncurses-intro.html syntax fix (Kajiyama Tamito). + +960601 - snapshot + + auto-configure man-page compression-format and renames for Debian. + + corrected several typos in curses.h.in (i.e., the mvXXXX macros). + + re-order curses.priv.h for lint. + + added rules for lintlib, lint + + corrected ifdef for BROKEN_LINKER in MKnames.awk.in + + corrected missing INSTALL_DATA in misc/Makefile.in + + flush output when changing cursor-visibility (Rick Marshall) + + fix a minor bug in the _nc_ripoff() routine and improve error + checking when creating the label window (Juergen Pfeifer). + + enhancement to the control over the new PC-style soft key format. + allow caller now to select whether or not one wants to have + the index-line; see curs_slk.3x for documentation (Juergen Pfeifer). + + typos, don't use inline with "-g" (Philippe De Muyter) + + fixes for menus & wattr-, slk-functions (Juergen Pfeifer) + +960526 - snapshot + + removed --with-ticdir option altogether, maintain compatibility with + existing applications via symbolic link in run_tic.sh + + patch for termio.h, signal (Philippe De Muyter) + + auto-configure gcc warning options rather than infer from version. + + auto-configure __attribute__ for different gcc versions. + + corrected special use of clearok() in hardscroll.c by resetting flag + in wrefresh(). + + include stdlib.h before defs for EXIT_SUCCESS, for OSF/1. + + include sys/types.h in case stdlib.h does not declare size_t. + + fixes for makefile (Tim Mooney) + + fixes for menus & forms (Juergen Pfeifer) + > patch 302 (ESR): + + improve hash function (suggested by Alexander V Lukyanov). + + 9.13.4 update for terminfo.src + +960518 - snapshot + + revised ncurses.c panner test, let pad abut all 4 sides of screen. + + refined case in lib_doupdate.c for ClrToEOL(). + + corrected prior change for PutRange (Alexander V Lukyanov + ). + + autoconf mods (Tim Mooney ). + + locale fix for forms (Philippe De Muyter ) + + renamed "--with-datadir" option to "--with-ticdir" to avoid + confusion, and made this check for the /usr/lib/terminfo pre-existing + directory. + > patches 299-301 (ESR): + + html fixes (Phillippe de Muyter). + + fix typo in ncurses-intro.html (report by Fabrizio Polacco). + + added hashmap.c + + mods to tracing, especially for ACS chars. + + corrected off-by-one in IDCtransform. + + corrected intermittent mouse bug by using return-value from read(). + + mods to parse_entry.c, for smarter defaults. + +960512 + + use getopt in 'tic'; added -L option and modified -e option to allow + list from a file. + +960511 + + don't use fixed buffer-size in tparm(). + + modified tic to create terminfo directory if it doesn't exist. + + added -T options to tic and infocmp (for testing/analysis) + + refined the length criteria for termcap and terminfo + + optimize lib_doupdate with memcpy, PutRange + > patches 297, 298 (ESR): + + implement TERMINFO_DIRS, and -o option of tic + + added TRACE_IEVENT + + fix REQ_TOGGLE_ITEM in menu/menu_driver.c; it could select but not + deselect. + + added lib_print.c (request by Rick Marshall). + + added has_key() (request by Juergen Pfeifer). + + do not issue clrtoeol or clrtobot if the relevant portion of the line + is already blank (analysis by Keith Bostic). + + add parentheses for parameters of COLOR_PAIR and PAIR_NUMBER macros + (analysis by Jurgen Eidt). + + update screen's notion of cursor position in endwin() (analysis by + Alexander Lukyanov). + + added 't' to ncurses.c test. + + moved delay_output() to lib_tputs.c + + removed tparam() (was added in 1.9.9, but conflicts with emacs and + is not part of X/Open Curses). + + removed boolean version of 'getm'. + + misc cursor & optimization fixes. + +960504 - snapshot + + modified ncurses 'p' test to allow full-screen range for panner size. + + fixes for locale (Philippe De Muyter ) + + don't use fixed buffer-size in fmt_entry(). + + added usage-message to 'infocmp'. + + modified install.includes rules to prepend subdirectory-name to + "#include" if needed. + +960430 + + protect wrefresh, wnoutrefresh from invocation with pad argument. + + corrected default CCFLAGS in test/Makefile. + +960428 - snapshot + + implemented logic to support terminals with background color erase + (e.g., rxvt and the newer color xterm). + + improved screen update logic (off-by-one logic error; use clr_eos if + possible) + +960426 - snapshot + + change ncurses 'a' test to run in raw mode. + + make TIOCGWINSZ configure test less stringent, in case user + configures via terminal that cannot get screen size. + > patches 295, 296 (ESR): + + split lib_kernel.c, lib_setup.c and names.c in order to reduce + overhead for programs that use only termcap features. + + new "-e" and "-h" options of tic (request by Tony Nugent). + + fix bug in mandatory-delay logic in lib_tputs.c (report by Sven + Verdoolaege). + + fix for "infocmp -e" to emit correct initializers (reported by Manual + J Novoa III). + + restore working-directory in read_termcap.c (report by Kayvan + Sylvan). + + use "-h" option on Solaris when generating shared libraries on + Solaris 2.5 to record the library name in the file, for assisting + the loader (patch by Scott Kramer). + + undo patch #294 changes to form and menu libraries (request by + Juergen Pfeifer). + +960418 - snapshot + + use autoconf 2.9 + + fix for AIX 3.2.5 (must define _POSIX_SOURCE to get termios struct + definitions via , modified macros in lib_raw.c to avoid + K&R-style substitution) + > patches 293, 294 (ESR): + + rewrite wsyncup(), wsyncdown(), as well as small fixes to form and + menu libraries to fix echo-breakage introduced by 1.8.9, 1.9.9e + changes (patches by Juergen Pfeifer). + + fix compile under QNX 4.2 by defining ONLCR in lib_raw.c when + __QNX__ is defined (patch by Michael Hunter). + + modify setupterm() to match documentation for its return value, fix + newterm to work with this change (report by Emmet Lazich). + + add checks in getch() for error, return ERR as appropriate (report by + Emmet Lazich). + + mods to wgetch() in cooked mode (report by Pete Seebach). + + corrected askuser() logic in tset (patch by Remco Treffkorn). + + correct interaction of endwin() with mouse processing (report by + Michael Elkins). + + added trace support for TTY flags + + update terminfo.src to 9.13.1 + + FreeBSD console entries (patch by Andrew Chernov). + +960406 + + fixes for NeXT, ISC and HPUX auto-configure + + autogenerate development header-dependencies (config.h, *.priv.h) + + corrected single-column formatting of "use=" (e.g., in tic) + + modify tic to read full terminfo-names + + corrected divide-by-zero that caused hang (or worse) when redirecting + output + + modify tic to generate directories only as-needed (and corrected + instance of use of data from function that had already returned). + +### ncurses-1.9.8a -> 1.9.9e + +* fixed broken wsyncup()/wysncdown(), as a result wnoutrefresh() now has + copy-changed-lines behavior. +* added and documented wresize() function. +* more fixes to LOWER-RIGHT corner handling. +* changed the line-breakout optimization code to allow some lines to be + emitted before the first check. +* added option for tic to use symbolic instead of hard links (for AFS) +* fix to restore auto-wrap mode. +* trace level can be controlled by environment variable. +* better handling of NULs in terminal descriptions. +* improved compatibility with observed SVR4 behavior. +* the refresh behavior of over-lapping windows is now more efficient and + behaves like SVR4. +* use autoconf 2.7, which results in a working setup for SCO 5.0. +* support for ESCDELAY. +* small fixes for menu/form code. +* the test directory has its own configure. +* fixes to pads when optimizing scrolling. +* fixed several off-by-one bugs. +* fixes for termcap->terminfo translation; less restrictions more correct + behavior. + +### ncurses-1.9.7 -> 1.9.8a + +* teach infocmp -i to recognize ECMA highlight sequences +* infocmp now dumps all SVr4 termcaps (not just the SVr4 ones) on -C +* support infocmp -RBSD. +* satisfy XSI Curses requirement that every macro be available as a function. +* This represents the last big change to the public interface of ncurses. The + ABI_VERSION has now been set at 3.0 and should stay there barring any great + catastrophies or acts of God. +* The C++ has been cleaned up in reaction to the changes to satisfy XSI's + requirements. +* libncurses now gets linked to libcurses to help seamless emulation + (replacement) of a vendor's curses. --disable-overwrite turns this behavior + off. + +### ncurses-1.9.6 -> 1.9.7 + +* corrected return values of setupterm() +* Fixed some bugs in tput (it does padding now) +* fixed a bug in tic that made it do the wrong thing on entries with more than + one `use' capability. +* corrected the screen-size calculation at startup time to alter the + numeric capabilities as per SVr4, not just LINES and COLS. +* toe(1) introduced; does what infocmp -T used to. +* tic(1) can now translate AIX box1 and font[0123] capabilities. +* tic uses much less core, the dotic.sh kluge can go away now. +* fix read_entry() and write_entry() to pass through cancelled capabilities OK. +* Add $HOME/.terminfo as source/target directory for terminfo entries. +* termcap compilation now automatically dumps an entry to $HOME/.terminfo. +* added -h option to toe(1). +* added -R option to tic(1) and infocmp(1). +* added fallback-entry-list feature. +* added -i option to infocmp(1). +* do a better job at detecting if we're on SCO. + +### ncurses-1.9.5 -> 1.9.6 + +* handling of TERMCAP environment variables now works correctly. +* various changes to shorten termcap translations to less that 1024 chars. +* tset(1) added +* mouse support for xterm. +* most data tables are now const and accordingly live in shareable text space. +* Obey the XPG4/SVr4 practice that echo() is initially off. +* tic is much better at translating XENIX and AIX termcap entries now. +* tic can interpret ko capabilities now. +* integrated Juergen Pfeifer's forms library. +* taught write_entry() how not to write more than it needs to; this change + reduces the size of the terminfo tree by a full 26%! +* infocmp -T option added. +* better warnings about historical tic quirks from tic. + +### ncurses 1.9.4 -> 1.9.5 + +* menus library is now included with documentation. +* lib_mvcur has been carefully profiled and tuned. +* Fixed a ^Z-handling bug that was tanking lynx(1). +* HJ Lu's patches for ELF shared libraries under Linux +* terminfo.src 9.8.2 +* tweaks for compiling in separate directories. +* Thomas Dickey's patches to support NeXT's brain-dead linker +* Eric Raymond's patches to fix problems with long termcap entries. +* more support for shared libraries under SunOS and IRIX. + +### ncurses 1.9.3 -> 1.9.4 + +* fixed an undefined-order-of-evaluation bug in lib_acs.c +* systematically gave non-API public functions and data an _nc_ prefix. +* integrated Juergen Pfeifer's menu code into the distribution. +* totally rewrote the knight test game's interface + +### ncurses 1.9.2c -> 1.9.3 + +* fixed the TERMCAP_FILE Support. +* fixed off-by-one errors in scrolling code +* added tracemunch to the test tools +* took steps to cut the running time of make install.data + +### ncurses 1.9.2c -> 1.9.2d + +* revised 'configure' script to produce libraries for normal, debug, + profile and shared object models. + +### ncurses 1.9.1 -> 1.9.2 + +* use 'autoconf' to implement 'configure' script. +* panels support added +* tic now checks for excessively long termcap entries when doing translation +* first cut at eliminating namespace pollution. + +### ncurses 1.8.9 -> 1.9 + +* cleanup gcc warnings for the following: use size_t where 'int' is not + appropriate, fixed some shadowed variables, change attr_t to compatible with + chtype, use attr_t in some places where it was confused with 'int'. +* use chtype/attr_t casts as appropriate to ensure portability of masking + operations. +* added-back waddchnstr() to lib_addstr.c (it had been deleted). +* supplied missing prototypes in curses.h +* include in lib_termcap.c to ensure that the prototypes + are consistent (they weren't). +* corrected prototype of tputs in +* rewrote varargs parsing in lib_tparm.c (to avoid referencing memory + that may be out of bounds on the stack) -- Purify found this. +* ensure that TRACE is defined in lib_trace.c (to solve prototype + warnings from gcc). +* corrected scrolling-region size in 'mvcur_wrap()' +* more spelling fixes +* use 'calloc()' to allocate WINDOW struct in lib_newwin.c (Purify). +* set default value for SP->_ofp in lib_set_term.c (otherwise SunOS dumps + core in init_acs()). +* include in write_entry.c (most "braindead" includes declare errno + in that file). + +### ncurses 1.8.8 -> 1.8.9 + +* compile (mostly) clean with gcc 2.5.8 -Wall -Wstrict-prototypes + -Wmissing-prototypes -Wconversion and using __attribute__ to flush out + non-portable use of "%x" for pointers, or for chtype data (which is declared + as a long). +* modified doupdate to ensure that typahead was turned on before attempting + select-call (otherwise, some implementations hang). +* added trace mask TRACE_FIFO, use this in lib_getch.c to allow finer + resolution of traces. +* improved bounds checking on several critical functions. +* the data directory has been replaced by the new master terminfo file. +* -F file-comparison option added to infocmp. +* compatibility with XSI Curses is now documented in the man bages. +* wsyncup/wsyncdown functions are reliable now; subwindow code in general + is much less flaky. +* capabilities ~msgr, tilde_glitch, insert_padding, generic_type, no_pad_char, + memory_above, memory_below, and hard_copy are now used properly. +* cursor-movement optimization has been completely rewritten. +* vertical-movement optimization now uses hardware scrolling, il, dl. + +### ncurses 1.8.7 -> 1.8.8 +* untic no longer exists, infocmp replaces it. +* tic can understand termcap now, especially if it is called captoinfo. +* The Linux Standard Console terminfo entry is called linux insead of console. + It also uses the kernel's new method of changing charsets. +* initscr() will EXIT upon error (as the docs say) This will mostly happen if + you try to run on an undefined terminal. +* I can get things running on AIX but tic can't compile terminfo. I have to + compile entries on another machine. Volunteers to hunt this bug are welcome. +* wbkgd() and wbkgdset() can be used to set a windows background to color. + wclear()/werase() DO NOT use the current attribute to clear the screen. + This is the way SVR4 curses works. PDCurses 2.1 is broken in this respect, + though PDCurses 2.2 has been fixed. +* cleaned up the test/ directory. +* test/worm will segfault after quite a while. +* many spelling corrections courtesy of Thomas E. Dickey + +### ncurses 1.8.6 -> 1.8.7 +* cleaned up programs in test/ directory. +* fixed wbkgdset() macro. +* modified getstr() to stop it from advancing cursor in noecho mode. +* modified linux terminfo entry to work with the latest kernel to get + the correct alternate character set. +* also added a linux-mono entry for those running on monochrome screens. +* changed initscr() so that it behaves like the man page says it does. + this fixes the problem with programs in test/ crashing with SIGSEV if + a terminal is undefined. +* modified addch() to avoid using any term.h #define's +* removed duplicate tgoto() in lib_tparm.c +* modified dump_entry.c so that infocmp deals correctly with ',' in acsc +* modified delwin() to correctly handle deleting subwindows. +* fixed Makefile.dist to stop installing an empty curses.h +* fixed a couple of out-of-date notes in man pages. + +### ncurses 1.8.5 -> 1.8.6 +* Implemented wbkgd(), bkgd(), bkgdset(), and wbkgdset(). +* The handling of attributes has been improved and now does not turn off color + if other attributes are turned off. +* scrolling code is improved. Scrolling in subwindows is still broken. +* Fixes to several bugs that manifest them on platforms other than Linux. +* The default to meta now depends on the status of the terminal when ncurses + is started. +* The interface to the tracing facility has changed. Instead of the pair of + functions traceon() and traceoff(), there is just one function trace() which + takes a trace mask argument. The trace masks, defined in curses.h, are + as follows: + + #define TRACE_DISABLE 0x00 /* turn off tracing */ + #define TRACE_ORDINARY 0x01 /* ordinary trace mode */ + #define TRACE_CHARPUT 0x02 /* also trace all character outputs */ + #define TRACE_MAXIMUM 0x0f /* maximum trace level */ + + More trace masks may be added, or these may be changed, in future releases. +* The pad code has been improved and the pad test code in test/ncurses.c has + been improved. +* The prototype ansi entry has been changed to work with a wider variety + of emulators. +* Fix to the prototype ansi entry that enables it to work with PC emulators + that treat trailing ";m" in a highlight sequence as ";0m"; this doesn't + break operation with any emulators. +* There are now working infocmp, captoinfo, tput, and tclear utilities. +* tic can now compile entries in termcap syntax. +* Core-dump bug in pnoutrefresh fixed. +* We now recognize and compile all the nonstandard capabilities in Ross + Ridge's mytinfo package (rendering it obsolete). +* General cleanup and documentation improvements. +* Fixes and additions to the installation-documentation files. +* Take cursor to normal mode on endwin. + +### ncurses 1.8.4 -> 1.8.5 +* serious bugs in updating screen which caused erratic non-display, + fixed. +* fixed initialization for getch() related variable which cause + unpredictable results. +* fixed another doupdate bug which only appeared if you have + parm_char. +* implemented redrawln() and redrawwin(). +* implemented winsnstr() and related functions. +* cleaned up insertln() and deleteln() and implemented (w)insdeln(). +* changed Makefile.dist so that installation of man pages will + take note of the terminfo directory. +* fixed Configure (removed the mysterious 'X'). +* Eric S. Raymond fixed the script.* files so that they work with + stock awk. + +#### ncurses 1.8.3 -> 1.8.4 #### #### +* fixed bug in refreshing the screen after return from shell_mode. + There are still problems but they don't manifest themselves on + my machine (Linux 0.99.14f). +* added wgetnstr() and modified things accordingly. +* fixed the script.src script.test to work with awk not just gawk. +* Configure can now take an argument of the target system. +* added test/ncurses.c which replaces several other programs and + performs more testing. +[Thanks to Eric S Raymond for the last 4] +* more fixes to lib_overlay.c and added test/over.c to illustrate + how it works. +* fixed ungetch() to take int instead of ch. +* fixes to cure wgetch() if flushinp() is called. + +One note I forgot to mention in 1.8.3 is that tracing is off by +default starting in the version. If you want tracing output, put +traceon(); in your code and link with -ldcurses. + +#### ncurses 1.8.2 -> ncurses 1.8.3 #### #### +MAJOR CHANGES: +1) The order of capabilities has been changed in order to achieve +binary compatibility with SVR4 terminfo database. This has the +unfortunate effect of breaking application currently linked with +ncurses. To ensure correct behavior, recompile all such programs. +Most programs using color or newer capabilities will break, others +will probably continue to work ok. + +2) Pavel Curtis has renounced his copyright to the public domain. +This means that his original sources (posted to comp.sources.unix, +volume 1) are now in the public domain. The current sources are +NOT in the public domain, they are copyrighted by me. I'm +entertaining ideas on what the new terms ncurses is released under. + +3) Eric S. Raymond has supplied a complete set of man pages for +ncurses in ?roff format. They will eventually replace most of the +current docs. Both sets are included in this release. + +Other changes and notes from 1.8.2 include: +* SIGSEGV during scrolling no longer occurs. +* Other problems with scrolling and use of idl have been corrected. +* lib_getch.c has been re-written and should perform flawlessly. + please use test/getch.c and any other programs to test this. +* ripoffline() is implemented (Thanks to Eric) and slk_ functions + changed accordingly. +* I've added support for terminals that scroll if you write in the + bottom-right corner. +* fixed more bugs in pads code. If anybody has a program that uses + pads I'd love a copy. +* correct handling for terminal with back_color_erase capability + (such as Linux console, and most PC terminals) +* ^Z handling apparently didn't work (I should never trust code + sent me to me without extensive testing). It now seems to be + fixed. Let me know if you have problems. +* I've added support for Apollo and NeXT, but it may still be + incomplete, especially when dealing with the lack of POSIX + features. +* scrolling should be more efficient on terminals with idl + capabilities. Please see src/lib_scroll.c for more notes. +* The line drawing routines were offset by 1 at both ends. This + is now fixed. +* added a few missing prototypes and macros (e.g. setterm()) +* fixed code in src/lib_overlay.c which used to crash. +* added a few more programs in test/ The ones from the PDCurses + package are useful, especially if you have SVR4 proper. I'm + interested in the results you get on such a systems (Eric? ;-). + They already exposed certain bugs in ncurses. +* See src/README for porting notes. +* The C++ code should really replace ncurses.h instead of working + around it. It should avoid name-space clashes with nterm.h (use + rows instead of lines, etc.) +* The C++ should compile ok. I've added explicit rules to the + Makefile because no C++ defaults are documented on the suns. +* The docs say that echo() and nocbreak() are mutually exclusive. + At the moment ncurses will switch to cbreak() if the case above + occurs. Should it continue to do so? How about echo() and noraw()? +* PDCurses seem to assume that wclear() will use current attribute + when clearing the screen. According to Eric this is not the case + with SVR4. +* I have discovered, to my chagrin, SunOS 4.x (and probably other systems) + * doesn't have vsscanf and God knows what else! I've will do a vsscanf(). +* I've also found out that the src/script.* rely on gawk and will not + work with stock awk or even with nawk. Any changes are welcome. +* Linux is more tolerant of NULL dereferences than most systems. This + fact was exposed by hanoi. +* ncurses still seems inefficient in drawing the screen on a serial + link between Linux and suns. The padding may be the culprit. +* There seems to be one lingering problem with doupdate() after shelling + out. Despite the fact the it is sending out the correct information + to the terminal, nothing takes effect until you press ^L or another + refresh takes place. And yes, output does get flushed. + +#### ncurses 1.8.1 -> ncurses 1.8.2 #### Nov 28, 1993 #### + +* added support for SVR4 and BSDI's BSD/386. +* major update and fix to scrolling routine. +* MORE fixes to stuff in lib_getch.c. +* cleaned-up configuration options and can now generate + Config.* files through an awk script. +* changed setupterm() so it can be called more than once, + add added set_curterm(), del_curterm(). +* a few minor cleanups. +* added more prototypes in curses.h + +#### ncurses 1.8 -> ncurses 1.8.1 #### Nov 4, 1993 #### + +* added support for NeXTStep 3.0 +* added termcap emulation (not well tested). +* more complete C++ interface to ncurses. +* fixed overlay(), overwrite(), and added copywin(). +* a couple of bug fixes. +* a few code cleanups. + +#### ncurses 0.7.2/0.7.3 -> ncurses 1.8 #### Aug 31, 1993 #### + +* The annoying message "can't open file." was due to missing + terminfo entry for the used terminal. It has now been + replaced by a hopefully more helpful message. +* Problems with running on serial lines are now fixed. +* Added configuration files for SunOS, Linux, HP/UX, Ultrix, + 386bsd/BSDI (if you have others send'em to me) +* Cleaner Makefile. +* The documentation in manual.doc is now more uptodate. +* update optimization and support for hp terminals, and 386bsd + console driver(s). +* mvcur optimization for terminals without cursor addressing + (doesn't work on Linux) +* if cursor moved since last update, getch() will refresh the + screen before working. +* getch() & alarm() can now live together. in 0.7.3 a signal + interrupted getch() (bug or feature?) now the getch is + restarted. +* scanw() et all were sick, now fixed. +* support for 8-bit input (use meta()). +* added default screen size to all terminfos. +* added c++ Ncursesw class. +* several minor bug fixes. + +#### ncurses 0.7.2 -> ncurses 0.7.3 #### May 27, 1993 #### + +* Config file to cope with different platforms (386BSD, BSDI, Ultrix, SunOS) +* more fixes to lib_getch.c +* changes related to Config + +#### ncurses 0.7 -> ncurses 0.7.2 #### May 22, 1993 #### + +* docs updated slightly (color usage is now documented). +* yet another fix for getch(), this one fixes problems with ESC being swallowed + if another character is typed before the 1 second timeout. +* Hopefully, addstr() and addch() are 8-bit clean. +* fixed lib_tparm.c to use stdarg.h (should run on suns now) +* order of capabilities changed to reflect that specified in SYSV + this will allow for binary-compatibility with existing terminfo dbs. +* added halfdelay() +* fixed problems with asc_init() +* added A_PROTECT and A_INVIS +* cleaned up vidputs() +* general cleanup of the code +* more attention to portability to other systems +* added terminfos for hp70092 (won't work until changes to lib_update.c are + made) and 386BSD pcvt drivers. + +Thanks to Hellmuth Michaelis for his help. +optimization code is slated for the next major release, stay tuned! + +#### ncurses 0.6/0.61 -> ncurses 0.7 #### April 1, 1993 +Please note that the next release will be called 1.8. If you want to know about +the rationale drop me a line. + +Included are several test programs in test/. +I've split up the panels library, reversi, tetris, sokoban. They are now +available separately from netcom.com:pub/zmbenhal/ + +* color and ACS support is now fully compatible with SYSV at the terminfo + level. +* Capabilities now includes as many SYSV caps I could find. +* tigetflag,tigetnum,tigetstr functions added. +* boolnames, boolfnames, boolcodes numnames, numfnames, numcodes, + strnames, strfnames, strcodes arrays are now added. +* keyname() is added. +* All function keys can be defined in terminfo entries. +* fixed lin_tparm.c to behave properly. +* terminfo entries for vt* and xterm are included (improvements are welcome) +* more automation in handling caps and keys. +* included fixes from 0.6.1 +* added a few more missing functions. +* fixed a couple of minor bugs. +* updated docs JUST a little (still miles behind in documenting the newer + features). + +#### ncurses 0.6 -> ncurses 0.61 #### + +1) Included the missing data/console. + +2) allow attributes when drawing boxes. + +3) corrected usage of win->_delay value. + +4) fixed a bug in lib_getch.c. if it didn't recognize a sequence it would + simply return the last character in the sequence. The correct + behavior is to return the entire sequence one character at a time. + +#### ncurses0.5 -> ncurses0.6 #### March 1, 1993 #### +* removed _numchngd from struct _win_st and made appropriate changes. +* rewritten kgetch() to remove problems with interaction between alarm and + read(). It caused SIGSEGV every now and then. +* fixed a bug that miscounted the numbers of columns when updating. + (in lib_doupdate.c(ClrUpdate() -- iterate to columns not columns-1) +* fixed a bug that cause the lower-right corner to be incorrect. + (in lib_doupdate.c(putChar() -- check against columns not columns-1) +* made resize() and cleanup() static to lib_newterm.c +* added notimeout(). +* added timeout() define in curses.h +* added more function prototypes and fixed napms. +* added use_env(). +* moved screen size detection to lib_setup.c. +* fixed newterm() to confirm to prototype. +* removed SIGWINCH support as SYSV does not define its semantics. +* cleaned-up lib_touch.c +* added waddnstr() and relatives. +* added slk_* support. +* fixed a bug in wdeleteln(). +* added PANEL library. +* modified Makefile for smoother installation. +* terminfo.h is really term.h + +#### ncurses 0.4 -> ncurses 0.5 #### Feb 14, 1993 #### +* changed _win_st structure to allow support for missing functionality. +* Addition of terminfo support for all KEY_*. +* Support for nodelay(), timeout(), notimeout(). +* fixed a bug with the keypad char reading that did not return ESC until + another key is pressed. +* nl mapping no longer occur on output (as should be) + fixed bug '\n' no causing a LF. +* fixed bug that reset terminal colors regardless of whether we use color + or not. +* Better support for ACS (not quite complete). +* fixed bug in wvline(). +* added curs_set(). +* changed from signal() to sigaction(). +* re-included the contents of important.patch into source. + +#### ncurses 0.3 -> ncurses 0.4 #### Feb 3, 1993 #### +* Addition of more KEY_* definitions. +* Addition of function prototypes. +* Addition of several missing functions. +* No more crashes if screen size is undefined (use SIGWINCH handler). +* added a handler to cleanup after SIGSEGV (hopefully never needed). +* changed SRCDIR from /etc/term to /usr/lib/terminfo. +* renamed compile/dump to tic/untic. +* New scrolling code. +* fixed bug that reversed the sense of nl() and nonl(). + +#### ncurses 0.2 -> ncurses 0.3 #### Jan 20, 1993 #### +* more support for color and graphics see test/ for examples. +* fixed various files to allow correct update after shelling out. +* more fixes for updates. +* no more core dumps if you don't have a terminfo entry. +* support for LINES and COLUMNS environment variables. +* support for SIGWINCH signal. +* added a handler for SIGINT for clean exits. + +#### ncurses 0.1 -> ncurses 0.2 #### Aug 14, 1992 #### +* support for color. +* support for PC graphic characters. +* lib_trace.c updated to use stdarg.h and vprintf routines. +* added gdc.c (Great Digital Clock) as an example of using color. + +#### ncurses -> ncurses 0.1 #### Jul 31, 1992 #### +* replacing sgtty stuff by termios stuff. +* ANSIfication of some functions. +* Disabling cost analysis 'cause it's incorrect. +* A quick hack for a terminfo entry. + +-- vile:txtmode: diff --git a/contrib/ncurses/README b/contrib/ncurses/README new file mode 100644 index 00000000..5587f5b7 --- /dev/null +++ b/contrib/ncurses/README @@ -0,0 +1,221 @@ +------------------------------------------------------------------------------- +-- Copyright 2020-2021,2023 Thomas E. Dickey -- +-- Copyright 1998-2012,2018 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README,v 1.31 2023/10/28 14:49:04 tom Exp $ +------------------------------------------------------------------------------- + README file for the ncurses package + +See the file ANNOUNCE for a summary of ncurses features and ports. +See the file INSTALL for instructions on how to build and install ncurses. +See the file NEWS for a release history and bug-fix notes. +See the file TO-DO for things that still need doing, including known bugs. + +Browse the file doc/html/ncurses-intro.html for narrative descriptions of how +to use ncurses and the panel, menu, and form libraries. + +Browse the file doc/html/hackguide.html for a tour of the package internals. + +Find plain text versions of both of these documents in doc/. + +ROADMAP AND PACKAGE OVERVIEW: + +You should be reading this file in a directory called: ncurses-d.d, where d.d +is the current version number (see the dist.mk file in this directory for +that). There should be a number of subdirectories, including `c++', `form', +`man', `menu', `misc', `ncurses', `panel', `progs', `test', and `Ada95'. + +A full build/install of this package typically installs several libraries, a +handful of utilities, and a database hierarchy. Here is an inventory of the +pieces: + +The libraries are: + + libncurses.a (normal) + libncurses.so (shared) + libncurses_g.a (debug and trace code enabled) + libncurses_p.a (profiling enabled) + + libpanel.a (normal) + libpanel.so (shared) + libpanel_g.a (debug and trace code enabled) + + libmenu.a (normal) + libmenu.so (shared) + libmenu_g.a (debug enabled) + + libform.a (normal) + libform.so (shared) + libform_g.a (debug enabled) + +If you configure using the --enable-widec option, a "w" is appended to the +library names (e.g., libncursesw.a), and the resulting libraries support +wide-characters, e.g., via a UTF-8 locale. The corresponding header files +are compatible with the non-wide-character configuration; wide-character +features are provided by ifdef's in the header files. The wide-character +library interfaces are not binary-compatible with the non-wide-character +version. + +If you configure using the --enable-reentrant option, a "t" is appended to the +library names (e.g., libncursest.a) and the resulting libraries have a +different binary interface, making the ncurses interface more opaque. + +The ncurses libraries implement the curses API. The panel, menu and forms +libraries implement clones of the SVr4 panel, menu and forms APIs. The source +code for these lives in the `ncurses', `panel', `menu', and `form' directories +respectively. + +In the `c++' directory, you'll find code that defines an interface to the +curses, forms, menus and panels library packaged as C++ classes, and a demo +program in C++ to test it. These class definition modules are not installed +by the 'make install.libs' rule as libncurses++. + +In the `Ada95' directory, you'll find code and documentation for an +Ada95 binding of the curses API, to be used with the GNAT compiler. +This binding is built by a normal top-level `make' if configure detects +an usable version of GNAT (3.11 or above). It is not installed automatically. +See the Ada95 directory for more build and installation instructions and +for documentation of the binding. + +To do its job, the ncurses code needs your terminal type to be set in the +environment variable TERM (normally set by your OS; under UNIX, getty(1) +typically does this, but you can override it in your .profile); and, it needs +a database of terminal descriptions in which to look up your terminal type's +capabilities. + +In older (V7/BSD) versions of curses, the database was a flat text file, +/etc/termcap; in newer (USG/USL) versions, the database is a hierarchy of +fast-loading binary description blocks under /usr/lib/terminfo. These binary +blocks are compiled from an improved editable text representation called +`terminfo' format (documented in man/terminfo.5). The ncurses library can use +either /etc/termcap or the compiled binary terminfo blocks, but prefers the +second form. + +In the `misc' directory, there is a text file terminfo.src, in editable +terminfo format, which can be used to generate the terminfo binaries (that's +what make install.data does). If the package was built with the +--enable-termcap option enabled, and the ncurses library cannot find a +terminfo description for your terminal, it will fall back to the termcap file +supplied with your system (which the ncurses package installation leaves +strictly alone). + +The utilities are as follows: + + tic -- terminfo source to binary compiler + infocmp -- terminfo binary to source decompiler/comparator + clear -- emits clear-screen for current terminal + tabs -- set tabs on a terminal + tput -- shell-script access to terminal capabilities. + toe -- table of entries utility + tset -- terminal-initialization utility + +The first two (tic and infocmp) are used for manipulating terminfo +descriptions; the next two (clear and tput) are for use in shell scripts. The +last (tset) is provided for 4.4BSD compatibility. The source code for all of +these lives in the `progs' directory. + +Detailed documentation for all libraries and utilities can be found in the +`man' and `doc' directories. An HTML introduction to ncurses, panels, and +menus programming lives in the `doc/html' directory. Manpages in HTML format +are under `doc/html/man'. + +The `test' directory contains programs that can be used to verify or +demonstrate the functions of the ncurses libraries. See test/README for +descriptions of these programs. Notably, the `ncurses' utility is designed to +help you systematically exercise the library functions. + +AUTHORS: + +Pavel Curtis: + wrote the original ncurses + +Zeyd M. Ben-Halim: + port of original to Linux and many enhancements. + +Thomas Dickey (maintainer for 1.9.9g through 4.1, resuming with FSF's 5.0): + configuration scripts, porting, mods to adhere to XSI Curses in the + areas of background color, terminal modes. Also memory leak testing, + the wresize, default colors and key definition extensions and numerous + bug fixes -- more than half of those enumerated in NEWS beginning with + the internal release 1.8.9, see + + https://invisible-island.net/personal/changelogs.html + +Florian La Roche (official maintainer for FSF's ncurses 4.2) + Beginning with release 4.2, ncurses is distributed under an MIT-style + license. + +Eric S. Raymond: + the man pages, infocmp(1), tput(1), clear(1), captoinfo(1), tset(1), + toe(1), most of tic(1), trace levels, the HTML intro, wgetnstr() and + many other entry points, the cursor-movement optimization, the + scroll-pack optimizer for vertical motions, the mouse interface and + xterm mouse support, and the ncurses test program. + +Juergen Pfeifer + The menu and form libraries, C++ bindings for ncurses, menus, forms + and panels, as well as the Ada95 binding. Ongoing support for panel. + +CONTRIBUTORS: + +Alexander V. Lukyanov + for numerous fixes and improvements to the optimization logic. + +David MacKenzie + for first-class bug-chasing and methodical testing. + +Ross Ridge + for the code that hacks termcap parameterized strings into terminfo. + +Warren Tucker and Gerhard Fuernkranz, + for writing and sending the panel library. + +Hellmuth Michaelis, + for many patches and testing the optimization code. + +Eric Newton, Ulrich Drepper, and Anatoly Ivasyuk: + the C++ code. + +Jonathan Ross, + for lessons in using sed. + +Keith Bostic (maintainer of 4.4BSD curses) + for help, criticism, comments, bug-finding, and being willing to + deep-six BSD curses for this one when it grew up. + +Richard Stallman, + for his commitment to making ncurses free software. + +Countless other people have contributed by reporting bugs, sending fixes, +suggesting improvements, and generally whining about ncurses :-) + +BUGS: + See the INSTALL file for bug and developer-list addresses. + The Hacker's Guide in the doc directory includes some guidelines + on how to report bugs in ways that will get them fixed most quickly. + +-- vile:txtmode fc=78 diff --git a/contrib/ncurses/README.MinGW b/contrib/ncurses/README.MinGW new file mode 100644 index 00000000..3add2e7d --- /dev/null +++ b/contrib/ncurses/README.MinGW @@ -0,0 +1,148 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 2008-2011,2012 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README.MinGW,v 1.14 2020/09/06 22:22:44 tom Exp $ +-- Author: Juergen Pfeifer +------------------------------------------------------------------------------- + +This is work in progress, but it is in an state where one can see it +works at least on the Windows Console. + +You should install the MSYS2 package, so that you have a shell environment that +allows you to run scripts, especially configure, etc. You can get that +from + https://www.msys2.org/ + +or the individual packages from + + https://sourceforge.net/projects/msys2/files/ + +You may also use a hosted MinGW cross-compile toolchain, e.g., on Ubuntu or +ArchLinux to build the libraries and tools. + +To build ncurses for native Windows with support for the new Windows 10 Virtual +Terminal and PseudoConsole support, you should install at least version 8.0 of +the mingw-w64-x86_64-headers package as it appears to have support for the +required Windows SDK level. Please note that some of the Linux distributions +are a bit behind with respect to the required MinGW header versions and you may +not be able to properly build the libraries for current Windows 10 using these +toolchains. Although it is a bit slow, MSYS2 on Windows 10 64-Bit is the +authoritative build environment for the MinGW version of ncurses. + +Using MinGW is a pragmatic decision, it is the easiest way to port this +heavily UNIX based sourcebase to native Windows. The goal is of course +to provide the includes, libraries and DLLs to be used with the more +common traditional development environments on Windows, mainly with +Microsoft Visual Studio. + +The TERM environment variable must be set especially to activate the Windows +console-driver. The driver checks if TERM is set to "#win32con" (explicit +use) or if TERM is unset or empty (implicit). + +Beginning with build 17763 (Fall 2018 update), Windows 10 supports ANSI escape +sequences (Virtual Terminal support). If ncurses detects this or a later +Windows 10 version, the interpretation of the implicit TERM setting (which +means: TERM is not set or empty) changes. In this case, TERM is to be assumed +to be "ms-terminal" and ncurses acts using the regular terminfo based driver, +thus acting like a regular Terminal we all know from UNIX like environments. + +This code requires WindowsNT 6.0 or better, which means on the client +Windows Vista or better, on the server Windows Server 2008 or better. + +If running on Windows 10 Build 17763 or later is detected, any program +spawning a subprocess running a ncurses program should use the new +PseudoConsole support, which provides what we know as pty from the UNIX +world also for Windows. Using the CreatePseudoConsole API +(see https://docs.microsoft.com/en-us/windows/console/createpseudoconsole) +in the calling process, it is guaranteed that the called ncurses program has +a console that is required by its implementation, even if the calling program +is NOT a console program, e.g., MSYS2's own mintty Terminal emulator. + +In the current MSYS2/minGW setup, building MinGW shared libraries with +libtool for ncurses seems to be broken, so I recommend NOT to use libtool. + +To build a modern but still small footprint ncurses that provides +hooks for interop, I recommend using these options: + + --without-libtool + --disable-home-terminfo + --enable-database + --disable-termcap + --enable-sp-funcs + --enable-term-driver + --enable-interop + +This is the configuration command line which I am using at the moment +(assuming environment variable MINGW_ROOT holds the root directory name of +your MinGW build): + +./configure \ + --prefix=/mingw64 \ + --without-cxx \ + --without-ada \ + --enable-warnings \ + --enable-assertions \ + --enable-exp-win32 \ + --enable-ext-funcs \ + --disable-home-terminfo \ + --disable-echo \ + --disable-getcap \ + --disable-hard-tabs \ + --disable-leaks \ + --disable-macros \ + --disable-overwrite \ + --enable-opaque-curses \ + --enable-opaque-panel \ + --enable-opaque-menu \ + --enable-opaque-form \ + --enable-database \ + --enable-sp-funcs \ + --enable-term-driver \ + --enable-interop \ + --disable-termcap \ + --enable-database \ + --with-progs \ + --without-libtool \ + --enable-pc-files \ + --with-shared \ + --with-normal \ + --without-debug \ + --with-fallbacks=ms-terminal \ + --without-manpages + +Please note that it is also necessary to set this environment variable: + +export PATH_SEPARATOR=";" + +in order to parse the terminfo paths correctly. Terminfo paths should +always be separated by a semicolon, even when running under MSYS2. + +All the options above are - like the whole Windows support - +experimental. + +-- vile:txtmode diff --git a/contrib/ncurses/README.emx b/contrib/ncurses/README.emx new file mode 100644 index 00000000..666eaec7 --- /dev/null +++ b/contrib/ncurses/README.emx @@ -0,0 +1,73 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-2006,2018 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README.emx,v 1.12 2021/06/17 21:20:30 tom Exp $ +-- Author: Thomas Dickey +------------------------------------------------------------------------------- + +You can build ncurses on OS/2 in the EMX environment. But you must build and +acquire tools. Not all of the tools distributed with EMX work properly, and +some additional ones are required. + +First, the configure script distributed with ncurses will not run as-is in EMX. +You can generate a new one if you have autoconf built for EMX. You will need +the EMX development tools, of course. Get these programs to start: + + GNU m4 program (version 1.4) + GNU autoconf (version 2.13). + GNU patch (version 2.5) + +Apply the autoconf patches from + + https://invisible-island.net/autoconf + ftp://ftp.invisible-island.net/autoconf + +These are ordered by date: + + autoconf-2.13-20030927.patch.gz + autoconf-2.13-20030927-emx.patch.gz + +I built my development environment for ncurses using EMX 0.9c at the end of +1997. Much of the EMX patch for autoconf was done originally by J.J.G.Ripoll, +using a similar environment (he prefers using the 'ash' shell). Newer versions +may fix these problems: + + + The pdksh program distributed at Hobbes and Leo (with a 1996 date) is + defective. It does not process "here documents" correctly (which + renders it useless for running the autoconf script). I built my own + copy of pdksh 5.2.13, which does have the bug corrected (documented + in the change log for pdksh). + + + I also built from sources (because the distributed binaries did not + work) the cmp, diff programs. + + Other required utilities such as ar, cat, chmod, cp, gawk, grep, mv, + ls, rm, mkdir, sed, sort and tr worked. + +Once you have autoconf patched and installed, run 'autoconf' from the top-level +directory of ncurses to generate the EMX-specific configure script. diff --git a/contrib/ncurses/TO-DO b/contrib/ncurses/TO-DO new file mode 100644 index 00000000..f021a1b5 --- /dev/null +++ b/contrib/ncurses/TO-DO @@ -0,0 +1,214 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2010,2011 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: TO-DO,v 1.58 2020/02/02 23:34:34 tom Exp $ +------------------------------------------------------------------------------- + +SHORT-TERM TO-DO ITEMS: + +Known Problems: + ++ libtool does not work with GNAT. + ++ The screen optimization has been tested only in an ad hoc manner. We should + develop a good set of regression tests to cover lib_doupdate.c and + lib_mvcur.c. + ++ Magic cookie support (for nonzero xmc values) does not work, since the logic + does not take into account refresh. Also, the initial optimize does not + adjust the current location when a cookie is emitted. + ++ Scrolling optimization has holes: for example, it forces repaints of the + screen between calls to refresh(). + ++ SVr4 uses slightly different rules for determining when softkeys are shown. + For example, they are initially displayed (before the ncurses 'e' test + activates them), and a touchwin can apparently also force them to be + displayed. + ++ The code departs from perfect 8-bit cleanness in one respect; you cannot + specify a character \200 as part of a capability string, because the + terminfo library interprets \200 as a request to embed NUL (\000) at that + point. This is a legacy terminfo property we can't mess with. + ++ The window classes defined in the c++ subdirectory need documentation. Some + C++ programmer could earn a lot of good karma by doing this... + ++ vid_attr() should support the set_a_attributes (sgr1) string, but does not. + There appear to be no terminals that require that functionality. + ++ the configure --disable-ext-funcs option does not work for Ada95 tree. + ++ the --with-pthread configuration builds for Cygwin, but does not work + properly (test/worm.c shows all of the worms in the same location). + ++ the --enable-rpath configure option builds for the corresponding platforms; + however combining it with --with-ticlib and --with-termlib does not always + produce libraries that can be run without setting environment variables. + Building those with libtool does not work either. (This is a problem with + the BSD platforms). + ++ more work is needed to make the MinGW port support ordinary terminals. + +Portability (or lack thereof): + ++ Users of older System V UNIXes (but not Solaris, and probably not SVr4) may + trip over a known problem with the signal-handling code which causes abrupt + termination of ncurses applications following resume from a ^Z suspend (this + problem was first seen running lynx). You will not see this problem if you + are using one of the 4.4BSD derivatives like such as, NetBSD, or BSDI, or + systems using that convention. For details, see the analysis in the header + comment of ncurses/tty/lib_tstp.c . + ++ In theory, vwprintw and vwscanf are supposed to use the older varargs.h + interface for handling variadic argument lists (and are deprecated by X/Open + for that reason). Many newer systems do no have varargs.h, instead they have + only the newer X/Open-standard stdargs.h equivalent. So these functions use + stdargs instead. This is unlikely to be a problem unless you're building + ncurses on a System V old enough to only have varargs.h. (Solaris 2.5.1 used + the stdarg.h binding as well). + ++ If you're using a system old enough not to have a native vsscanf(3) in its + library, vwscanw() will not work. If you want to fix this, add an + implementation to ncurses/vsscanf.c. + ++ The C++ binding fails to build with a few C++ compilers. + ++ terminfo.5 does not format with the SunOS (and most other platform's) tbl + utility because it relies on a diversion for each table entry. Get the + groff package. + +Untested features: + ++ The code for the HP color model using set_color_pair is untested. + ++ The code for handling soft labels on a terminal type with built-in support + for them (num_labels > 0, label_height, label_width, label_format, label_off, + label_on, plab_norm, lab_f*) has not been tested. The label_format and + lab_f* capabilities aren't presently used. + +LONGER-TERM TO-DO ITEMS: + +1. Extended COSE conformance + +There is an XPG4 standard released in 1996 which describes a superset +of the SVr4 API. The library is BASE conformant with this standard. +We would like to make ncurses fully conformant at the EXTENDED level +supporting internationalization. + +2. DOS port + +Only a few of the files in the library depend on the terminfo format. +It should be possible to further kernelize the package, then rewrite +a small number of core files to produce a functionally-compatible +port that would do updates to a memory-mapped screen area. The first +result of this would be a DOS port. + +3. X port + +It would be nice if ncurses could recognize when it was running under X and +maintain its own window. With this feature, all ncurses programs would +automatically become X programs. The challenge is to handle resize events +properly. + +4. Unused capabilities + +The currently unused capabilities fall naturally into several groups: + +A. Status-line capabilities: + + Booleans: has_status_line, status_line_esc_ok. + Numerics: width_status_line. + Strings: dis_status_line, from_status_line, to_status_line. + +System V Release 1 curses made no use of these at all. SVr4's use, if +any, is unknown. From the AT&T termcap file it looks like curses, in general, +shouldn't use them; terminal variants with status lines have their line count +decremented by 1, suggesting that curses is supposed to leave the status line +alone. + +B. Printer capabilities: + + Boolean: col_addr_glitch, cr_cancels_micro_mode, has_print_wheel, + row_addr_glitch, semi_auto_right_margin, cpi_changes_res, + lpi_changes_res. + Numeric: buffer_capacity, dot_horz_spacing, dot_vert_spacing, + max_micro_address, max_micro_jump, micro_col_size, + micro_line_size, number_of_pins, output_res_char, + output_res_line, output_res_horz_inch, print_rate, + wide_char_size, bit_image_entwining, bit_image_type. + String: down_half_line, form_feed, up_half_line, set_left_margin, + set_right_margin, clear_margins, change_char_pitch + ... set_page_length (all the SVr4 printer caps), + +Curses doesn't use these. + +C. Printer-control capabilities: + + Boolean: prtr_silent. + Strings: print_screen, prtr_on, prtr_off, prtr_non. + +Curses doesn't use these. + +D. Dialer strings: + + Strings: hangup, dial_phone, quick_dial, tone, pulse, flash_hook, + fixed_pause, wait_tone. + +Curses doesn't use these. + +E. Window and virtual-terminal capabilities: + + Numerics: maximum_windows, virtual_terminal. + Strings: req_for_input, create_window, goto_window, set_window. + +These seem to be fossils from some AT&T experiments on character-based +window systems that never escaped the lab. The virtual_terminal cap had +something to do with building terminal emulations into tty line disciplines. + +F. Unused VDT capabilities: + + Booleans: erase_overstrike, has_meta_key, insert_null_glitch, + move_insert, dest_tabs_magic_smso, transparent_underline, + needs_xon_xoff, hard_cursor. + Numerics: lines_of_memory, buttons. + Strings: pkey_key, pkey_local, pkey_xmit, underline_char, + enter_xon_mode, exit_xon_mode, xon_character, xoff_character, + display_clock, remove_clock, user[0-5], display_pc_char, + enter_scancode_mode, exit_scancode_mode, pc_term_options, + scancode_escape, alt_scancode_esc. + +These are the potentially important ones for ncurses. Notes: + + i) ncurses doesn't need move_insert; it never uses cup/hpa/vpa while + insert_mode is on. + + ii) We probably don't care about dest_tabs_magic_smso; only + Telerays used it and they're all long obsolete. + +-- vile:txtmode diff --git a/contrib/ncurses/VERSION b/contrib/ncurses/VERSION new file mode 100644 index 00000000..0c76fddc --- /dev/null +++ b/contrib/ncurses/VERSION @@ -0,0 +1 @@ +5:0:10 6.5 20241102 diff --git a/contrib/ncurses/aclocal.m4 b/contrib/ncurses/aclocal.m4 new file mode 100644 index 00000000..d195f324 --- /dev/null +++ b/contrib/ncurses/aclocal.m4 @@ -0,0 +1,10400 @@ +dnl*************************************************************************** +dnl Copyright 2018-2023,2024 Thomas E. Dickey * +dnl Copyright 1998-2017,2018 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl Author: Thomas E. Dickey 1995-on +dnl +dnl $Id: aclocal.m4,v 1.1088 2024/08/11 00:17:28 tom Exp $ +dnl Macros used in NCURSES auto-configuration script. +dnl +dnl These macros are maintained separately from NCURSES. The copyright on +dnl this file applies to the aggregation of macros and does not affect use of +dnl these macros in other applications. +dnl +dnl See these pages for additional information: +dnl https://invisible-island.net/autoconf/ +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl +dnl --------------------------------------------------------------------------- +dnl --------------------------------------------------------------------------- +dnl AM_LANGINFO_CODESET version: 7 updated: 2023/01/11 04:05:23 +dnl ------------------- +dnl Inserted as requested by gettext 0.10.40 +dnl File from /usr/share/aclocal +dnl codeset.m4 +dnl ==================== +dnl serial AM1 +dnl +dnl From Bruno Haible. +AC_DEFUN([AM_LANGINFO_CODESET], +[ +AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([ +$ac_includes_default +#include ], + [char* cs = nl_langinfo(CODESET); (void)cs], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test "$am_cv_langinfo_codeset" = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ABI_DEFAULTS version: 5 updated: 2023/10/21 08:54:23 +dnl --------------- +dnl Provide configure-script defaults for different ncurses ABIs. +AC_DEFUN([CF_ABI_DEFAULTS],[ +AC_REQUIRE([CF_NCURSES_WITH_ABI_VERSION]) + +# ABI 5 defaults: +cf_dft_ccharw_max=5 +cf_dft_chtype=auto +cf_dft_ext_colors=no +cf_dft_ext_const=no +cf_dft_ext_mouse=no +cf_dft_ext_putwin=no +cf_dft_ext_spfuncs=no +cf_dft_filter_syms=no +cf_dft_interop=no +cf_dft_mmask_t=auto +cf_dft_opaque_curses=no +cf_dft_ordinate_type=short +cf_dft_signed_char=no +cf_dft_tparm_arg=long +cf_dft_widec=no +cf_dft_with_lp64=no + +# ABI 6 default differences from ABI 5: +case x$cf_cv_abi_default in +(x[[6789]]) + cf_dft_chtype=uint32_t + cf_dft_ext_colors=yes + cf_dft_ext_const=yes + cf_dft_ext_mouse=yes + cf_dft_ext_putwin=yes + cf_dft_ext_spfuncs=yes + cf_dft_filter_syms=yes + cf_dft_interop=yes + cf_dft_mmask_t=uint32_t + cf_dft_opaque_curses=yes + cf_dft_tparm_arg=intptr_t + cf_dft_widec=yes + cf_dft_with_lp64=yes + ;; +esac + +# ABI 7 default differences from ABI 6: +case x$cf_cv_abi_default in +(x[[789]]) + cf_dft_ccharw_max=6 + cf_dft_mmask_t=uint64_t + cf_dft_ordinate_type=int + cf_dft_signed_char=yes + # also: remove the wgetch-events feature in ABI 7 + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49 +dnl ------------------ +dnl Conditionally generate script according to whether we're using a given autoconf. +dnl +dnl $1 = version to compare against +dnl $2 = code to use if AC_ACVERSION is at least as high as $1. +dnl $3 = code to use if AC_ACVERSION is older than $1. +define([CF_ACVERSION_CHECK], +[ +ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl +ifdef([m4_version_compare], +[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])], +[CF_ACVERSION_COMPARE( +AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])), +AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53 +dnl -------------------- +dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1, +dnl MAJOR2, MINOR2, TERNARY2, +dnl PRINTABLE2, not FOUND, FOUND) +define([CF_ACVERSION_COMPARE], +[ifelse(builtin([eval], [$2 < $5]), 1, +[ifelse([$8], , ,[$8])], +[ifelse([$9], , ,[$9])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADA_INCLUDE_DIRS version: 8 updated: 2013/10/14 04:24:07 +dnl ------------------- +dnl Construct the list of include-options for the C programs in the Ada95 +dnl binding. +AC_DEFUN([CF_ADA_INCLUDE_DIRS], +[ +ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS" +if test "$srcdir" != "."; then + ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS" +fi +if test "$GCC" != yes; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" +elif test "$includedir" != "/usr/include"; then + if test "$includedir" = '${prefix}/include' ; then + if test x$prefix != x/usr ; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi + else + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi +fi +AC_SUBST(ACPPFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_ADAFLAGS version: 1 updated: 2010/06/19 15:22:18 +dnl --------------- +dnl Add to $ADAFLAGS, which is substituted into makefile and scripts. +AC_DEFUN([CF_ADD_ADAFLAGS],[ + ADAFLAGS="$ADAFLAGS $1" + AC_SUBST(ADAFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15 +dnl ------------- +dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +dnl +dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS, +dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily +dnl confused by the quotes (which require backslashes to keep them usable). +AC_DEFUN([CF_ADD_CFLAGS], +[ +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $1 +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags) + ;; + esac + CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags) + ;; + esac + ;; + (*) + CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags) + ;; + esac + ;; +(yes) + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)]) + CF_APPEND_TEXT(CFLAGS,$cf_new_cflags) +fi + +if test -n "$cf_new_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)]) + CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags) +fi + +if test -n "$cf_new_extra_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)]) + CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags) +fi + +AC_SUBST(EXTRA_CPPFLAGS) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_CXXFLAGS version: 1 updated: 2020/04/04 16:16:13 +dnl --------------- +dnl Copy non-preprocessor flags to $CXXFLAGS, preprocessor flags to $CPPFLAGS +dnl The second parameter if given makes this macro verbose. +dnl +dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS, +dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily +dnl confused by the quotes (which require backslashes to keep them usable). +AC_DEFUN([CF_ADD_CXXFLAGS], +[ +cf_save_CXXFLAGS="$CFLAGS" +CFLAGS="$CXXFLAGS" +CF_ADD_CFLAGS($1 ifelse($2,,,[,$2])) +CXXFLAGS="$CFLAGS" +CFLAGS="$cf_save_CXXFLAGS" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04 +dnl ------------- +dnl Add an include-directory to $CPPFLAGS. Don't add /usr/include, since it is +dnl redundant. We don't normally need to add -I/usr/local/include for gcc, +dnl but old versions (and some misinstalled ones) need that. To make things +dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to +dnl the include-path). +AC_DEFUN([CF_ADD_INCDIR], +[ +if test -n "$1" ; then + for cf_add_incdir in $1 + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir) + AC_TRY_COMPILE([#include ], + [printf("Hello")], + [], + [cf_have_incdir=yes]) + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + CF_VERBOSE(adding $cf_add_incdir to include-path) + ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05 +dnl ---------- +dnl Add a library, used to enforce consistency. +dnl +dnl $1 = library to add, without the "-l" +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42 +dnl ------------- +dnl Adds to the library-path +dnl +dnl Some machines have trouble with multiple -L options. +dnl +dnl $1 is the (list of) directory(s) to add +dnl $2 is the optional name of the variable to update (default LDFLAGS) +dnl +AC_DEFUN([CF_ADD_LIBDIR], +[ +if test -n "$1" ; then + for cf_add_libdir in $1 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + CF_VERBOSE(adding $cf_add_libdir to library-path) + ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])" + fi + fi + done +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33 +dnl ----------- +dnl Add one or more libraries, used to enforce consistency. Libraries are +dnl prepended to an existing list, since their dependencies are assumed to +dnl already exist in the list. +dnl +dnl $1 = libraries to add, with the "-l", etc. +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIBS],[ +cf_add_libs="[$]ifelse($2,,LIBS,[$2])" +# reverse order +cf_add_0lib= +for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +ifelse($2,,LIBS,[$2])="$cf_add_libs" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42 +dnl ------------------ +dnl Append to a search-list for a nonstandard header/lib-file +dnl $1 = the variable to return as result +dnl $2 = the package name +dnl $3 = the subdirectory, e.g., bin, include or lib +dnl $4 = the directory under which we will test for subdirectories +dnl $5 = a directory that we do not want $4 to match +AC_DEFUN([CF_ADD_SUBDIR_PATH], +[ +test "x$4" != "x$5" && \ +test -d "$4" && \ +ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) { + test -n "$verbose" && echo " ... testing for $3-directories under $4" + test -d "$4/$3" && $1="[$]$1 $4/$3" + test -d "$4/$3/$2" && $1="[$]$1 $4/$3/$2" + test -d "$4/$3/$2/$3" && $1="[$]$1 $4/$3/$2/$3" + test -d "$4/$2/$3" && $1="[$]$1 $4/$2/$3" + test -d "$4/$2/$3/$2" && $1="[$]$1 $4/$2/$3/$2" +} +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40 +dnl ---------------- +dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions. +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +define([CF_APPEND_CFLAGS], +[ +for cf_add_cflags in $1 +do + case "x$cf_add_cflags" in + (x-[[DU]]*) + CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2]) + CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2]) + ;; + esac + CF_ADD_CFLAGS([$cf_add_cflags],[$2]) +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55 +dnl -------------- +dnl use this macro for appending text without introducing an extra blank at +dnl the beginning +define([CF_APPEND_TEXT], +[ + test -n "[$]$1" && $1="[$]$1 " + $1="[$]{$1}$2" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31 +dnl -------------- +dnl Allow user to disable a normally-on option. +AC_DEFUN([CF_ARG_DISABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31 +dnl ------------- +dnl Allow user to enable a normally-off option. +AC_DEFUN([CF_ARG_ENABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14 +dnl ------------- +dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus +dnl values. +dnl +dnl Parameters: +dnl $1 = option name +dnl $2 = help-string +dnl $3 = action to perform if option is not default +dnl $4 = action if perform if option is default +dnl $5 = default option value (either 'yes' or 'no') +AC_DEFUN([CF_ARG_OPTION], +[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes) + if test "$enableval" != "$5" ; then +ifelse([$3],,[ :]dnl +,[ $3]) ifelse([$4],,,[ + else + $4]) + fi],[enableval=$5 ifelse([$4],,,[ + $4 +])dnl +])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_AR_FLAGS version: 9 updated: 2021/01/01 13:31:04 +dnl ----------- +dnl Check for suitable "ar" (archiver) options for updating an archive. +dnl +dnl In particular, handle some obsolete cases where the "-" might be omitted, +dnl as well as a workaround for breakage of make's archive rules by the GNU +dnl binutils "ar" program. +AC_DEFUN([CF_AR_FLAGS],[ +AC_REQUIRE([CF_PROG_AR]) + +AC_CACHE_CHECK(for options to update archives, cf_cv_ar_flags,[ + case "$cf_cv_system_name" in + (*-msvc*) + cf_cv_ar_flags='' + cat >mk_static_lib.sh <<-EOF + #!$SHELL + MSVC_BIN="[$]AR" + out="\[$]1" + shift + exec \[$]MSVC_BIN -out:"\[$]out" \[$]@ + EOF + chmod +x mk_static_lib.sh + AR=`pwd`/mk_static_lib.sh + ;; + (*) + cf_cv_ar_flags=unknown + for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv + do + + # check if $ARFLAGS already contains this choice + if test "x$ARFLAGS" != "x" ; then + cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"` + if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then + cf_cv_ar_flags= + break + fi + fi + + rm -f "conftest.$ac_cv_objext" + rm -f conftest.a + + cat >"conftest.$ac_ext" <&AC_FD_CC + $AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&AC_FD_CC 1>/dev/null + if test -f conftest.a ; then + cf_cv_ar_flags="$cf_ar_flags" + break + fi + else + CF_VERBOSE(cannot compile test-program) + break + fi + done + rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext" + ;; + esac +]) + +if test -n "$ARFLAGS" ; then + if test -n "$cf_cv_ar_flags" ; then + ARFLAGS="$ARFLAGS $cf_cv_ar_flags" + fi +else + ARFLAGS=$cf_cv_ar_flags +fi + +AC_SUBST(ARFLAGS) +]) +dnl --------------------------------------------------------------------------- +dnl CF_AWK_BIG_PRINTF version: 5 updated: 2015/04/17 21:13:04 +dnl ----------------- +dnl Check if awk can handle big strings using printf. Some older versions of +dnl awk choke on large strings passed via "%s". +dnl +dnl $1 = desired string size +dnl $2 = variable to set with result +AC_DEFUN([CF_AWK_BIG_PRINTF], +[ + case x$AWK in + (x) + eval $2=no + ;; + (*) + if ( ${AWK} 'BEGIN { xx = "x"; while (length(xx) < $1) { xx = xx "x"; }; printf("%s\n", xx); }' 2>/dev/null \ + | $AWK '{ printf "%d\n", length([$]0); }' 2>/dev/null | $AWK 'BEGIN { eqls=0; recs=0; } { recs++; if ([$]0 == 12000) eqls++; } END { if (recs != 1 || eqls != 1) exit 1; }' 2>/dev/null >/dev/null ) ; then + eval $2=yes + else + eval $2=no + fi + ;; + esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_BOOL_DECL version: 9 updated: 2023/12/03 09:21:34 +dnl ------------ +dnl Test if 'bool' is a builtin type in the configured C++ compiler. Some +dnl older compilers (e.g., gcc 2.5.8) don't support 'bool' directly; gcc +dnl 2.6.3 does, in anticipation of the ANSI C++ standard. +dnl +dnl Treat the configuration-variable specially here, since we're directly +dnl substituting its value (i.e., 1/0). +dnl +dnl $1 is the shell variable to store the result in, if not $cv_cv_builtin_bool +AC_DEFUN([CF_BOOL_DECL], +[ +AC_MSG_CHECKING(if we should include stdbool.h) + +AC_CACHE_VAL(cf_cv_header_stdbool_h,[ + AC_TRY_COMPILE([],[bool foo = false; (void)foo], + [cf_cv_header_stdbool_h=0], + [AC_TRY_COMPILE([ +#ifndef __BEOS__ +#include +#endif +],[bool foo = false; (void)foo], + [cf_cv_header_stdbool_h=1], + [cf_cv_header_stdbool_h=0])])]) + +if test "$cf_cv_header_stdbool_h" = 1 +then AC_MSG_RESULT(yes) +else AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING([for builtin bool type]) + +AC_CACHE_VAL(ifelse($1,,cf_cv_builtin_bool,[$1]),[ + AC_TRY_COMPILE([ +#include +#include +],[bool x = false; (void)x], + [ifelse($1,,cf_cv_builtin_bool,[$1])=1], + [ifelse($1,,cf_cv_builtin_bool,[$1])=0]) + ]) + +if test "$ifelse($1,,cf_cv_builtin_bool,[$1])" = 1 +then AC_MSG_RESULT(yes) +else AC_MSG_RESULT(no) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_BOOL_SIZE version: 20 updated: 2023/02/18 17:41:25 +dnl ------------ +dnl Test for the size of 'bool' in the configured C++ compiler (e.g., a type). +dnl Don't bother looking for bool.h, since it has been deprecated. +dnl +dnl If the current compiler is C rather than C++, we get the bool definition +dnl from . +AC_DEFUN([CF_BOOL_SIZE], +[ +AC_CHECK_SIZEOF(bool,,[ +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif +]) + +AC_CACHE_CHECK(for type of bool, cf_cv_type_of_bool,[ + rm -f cf_test.out + AC_TRY_RUN([ +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int main(void) +{ + FILE *fp = fopen("cf_test.out", "w"); + if (fp != 0) { + bool x = true; + if ((bool)(-x) >= 0) + fputs("unsigned ", fp); + if (sizeof(x) == sizeof(int)) fputs("int", fp); + else if (sizeof(x) == sizeof(char)) fputs("char", fp); + else if (sizeof(x) == sizeof(short))fputs("short",fp); + else if (sizeof(x) == sizeof(long)) fputs("long", fp); + fclose(fp); + } + ${cf_cv_main_return:-return}(0); +} + ], + [cf_cv_type_of_bool=`cat cf_test.out` + if test -z "$cf_cv_type_of_bool"; then + cf_cv_type_of_bool=unknown + fi], + [cf_cv_type_of_bool=unknown], + [ + case x$ac_cv_sizeof_bool in + (x1) cf_cv_type_of_bool="unsigned char";; + (x2) cf_cv_type_of_bool="unsigned short";; + (x4) cf_cv_type_of_bool="unsigned int";; + (x8) cf_cv_type_of_bool="unsigned long";; + (*) cf_cv_type_of_bool=unknown;; + esac + ]) + rm -f cf_test.out +]) + +if test "$cf_cv_type_of_bool" = unknown ; then + case .$NCURSES_BOOL in + (.auto|.) NCURSES_BOOL=unsigned;; + esac + AC_MSG_WARN(Assuming $NCURSES_BOOL for type of bool) + cf_cv_type_of_bool=$NCURSES_BOOL +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_BUILD_CC version: 13 updated: 2024/06/22 13:42:22 +dnl ----------- +dnl If we're cross-compiling, allow the user to override the tools and their +dnl options. The configure script is oriented toward identifying the host +dnl compiler, etc., but we need a build compiler to generate parts of the +dnl source. +dnl +dnl $1 = default for $CPPFLAGS +dnl $2 = default for $LIBS +AC_DEFUN([CF_BUILD_CC],[ +CF_ACVERSION_CHECK(2.52,, + [AC_REQUIRE([CF_PROG_EXT])]) +if test "$cross_compiling" = yes ; then + + # defaults that we might want to override + : ${BUILD_CFLAGS:=''} + : ${BUILD_CPPFLAGS:='ifelse([$1],,,[$1])'} + : ${BUILD_LDFLAGS:=''} + : ${BUILD_LIBS:='ifelse([$2],,,[$2])'} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} + + AC_ARG_WITH(build-cc, + [ --with-build-cc=XXX the build C compiler ($BUILD_CC)], + [BUILD_CC="$withval"], + [AC_CHECK_PROGS(BUILD_CC, [gcc clang c99 c89 cc cl],none)]) + AC_MSG_CHECKING(for native build C compiler) + AC_MSG_RESULT($BUILD_CC) + + AC_MSG_CHECKING(for native build C preprocessor) + AC_ARG_WITH(build-cpp, + [ --with-build-cpp=XXX the build C preprocessor ($BUILD_CPP)], + [BUILD_CPP="$withval"], + [BUILD_CPP='${BUILD_CC} -E']) + AC_MSG_RESULT($BUILD_CPP) + + AC_MSG_CHECKING(for native build C flags) + AC_ARG_WITH(build-cflags, + [ --with-build-cflags=XXX the build C compiler-flags ($BUILD_CFLAGS)], + [BUILD_CFLAGS="$withval"]) + AC_MSG_RESULT($BUILD_CFLAGS) + + AC_MSG_CHECKING(for native build C preprocessor-flags) + AC_ARG_WITH(build-cppflags, + [ --with-build-cppflags=XXX the build C preprocessor-flags ($BUILD_CPPFLAGS)], + [BUILD_CPPFLAGS="$withval"]) + AC_MSG_RESULT($BUILD_CPPFLAGS) + + AC_MSG_CHECKING(for native build linker-flags) + AC_ARG_WITH(build-ldflags, + [ --with-build-ldflags=XXX the build linker-flags ($BUILD_LDFLAGS)], + [BUILD_LDFLAGS="$withval"]) + AC_MSG_RESULT($BUILD_LDFLAGS) + + AC_MSG_CHECKING(for native build linker-libraries) + AC_ARG_WITH(build-libs, + [ --with-build-libs=XXX the build libraries (${BUILD_LIBS})], + [BUILD_LIBS="$withval"]) + AC_MSG_RESULT($BUILD_LIBS) + + # this assumes we're on Unix. + BUILD_EXEEXT= + BUILD_OBJEXT=o + + : ${BUILD_CC:='${CC}'} + + AC_MSG_CHECKING(if the build-compiler "$BUILD_CC" works) + + cf_save_crossed=$cross_compiling + cf_save_ac_link=$ac_link + cross_compiling=no + cf_build_cppflags=$BUILD_CPPFLAGS + test "$cf_build_cppflags" = "#" && cf_build_cppflags= + ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $cf_build_cppflags $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&AS_MESSAGE_LOG_FD' + + AC_TRY_RUN([#include + int main(int argc, char *argv[]) + { + ${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0); + } + ], + cf_ok_build_cc=yes, + cf_ok_build_cc=no, + cf_ok_build_cc=unknown) + + cross_compiling=$cf_save_crossed + ac_link=$cf_save_ac_link + + AC_MSG_RESULT($cf_ok_build_cc) + + if test "$cf_ok_build_cc" != yes + then + AC_MSG_ERROR([Cross-build requires two compilers. +Use --with-build-cc to specify the native compiler.]) + fi + +else + : ${BUILD_CC:='${CC}'} + : ${BUILD_CPP:='${CPP}'} + : ${BUILD_CFLAGS:='${CFLAGS}'} + : ${BUILD_CPPFLAGS:='${CPPFLAGS}'} + : ${BUILD_LDFLAGS:='${LDFLAGS}'} + : ${BUILD_LIBS:='${LIBS}'} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} +fi + +AC_SUBST(BUILD_CC) +AC_SUBST(BUILD_CPP) +AC_SUBST(BUILD_CFLAGS) +AC_SUBST(BUILD_CPPFLAGS) +AC_SUBST(BUILD_LDFLAGS) +AC_SUBST(BUILD_LIBS) +AC_SUBST(BUILD_EXEEXT) +AC_SUBST(BUILD_OBJEXT) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_C11_NORETURN version: 4 updated: 2023/02/18 17:41:25 +dnl --------------- +AC_DEFUN([CF_C11_NORETURN], +[ +AC_MSG_CHECKING(if you want to use C11 _Noreturn feature) +CF_ARG_ENABLE(stdnoreturn, + [ --enable-stdnoreturn enable C11 _Noreturn feature for diagnostics], + [enable_stdnoreturn=yes], + [enable_stdnoreturn=no]) +AC_MSG_RESULT($enable_stdnoreturn) + +if test $enable_stdnoreturn = yes; then +AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn, + [AC_TRY_COMPILE([ +$ac_includes_default +#include +static _Noreturn void giveup(void) { exit(0); } + ], + [if (feof(stdin)) giveup()], + cf_cv_c11_noreturn=yes, + cf_cv_c11_noreturn=no) + ]) +else + cf_cv_c11_noreturn=no, +fi + +if test "$cf_cv_c11_noreturn" = yes; then + AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if header is available and working]) + AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported]) + HAVE_STDNORETURN_H=1 +else + HAVE_STDNORETURN_H=0 +fi + +AC_SUBST(HAVE_STDNORETURN_H) +AC_SUBST(STDC_NORETURN) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CC_ENV_FLAGS version: 11 updated: 2023/02/20 11:15:46 +dnl --------------- +dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content +dnl into CC. This will not help with broken scripts that wrap the compiler +dnl with options, but eliminates a more common category of user confusion. +dnl +dnl In particular, it addresses the problem of being able to run the C +dnl preprocessor in a consistent manner. +dnl +dnl Caveat: this also disallows blanks in the pathname for the compiler, but +dnl the nuisance of having inconsistent settings for compiler and preprocessor +dnl outweighs that limitation. +AC_DEFUN([CF_CC_ENV_FLAGS], +[ +# This should have been defined by AC_PROG_CC +: "${CC:=cc}" + +AC_MSG_CHECKING(\$CFLAGS variable) +case "x$CFLAGS" in +(*-[[IUD]]*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options) + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + CF_ADD_CFLAGS($cf_arg) + done + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac + +AC_MSG_CHECKING(\$CC variable) +case "$CC" in +(*[[\ \ ]]-*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options) + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'` + cf_flags=`echo "$CC" | sed -e "s%^$cf_prog%%"` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[[IUDfgOW]]*) + CF_ADD_CFLAGS($cf_arg) + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + CF_VERBOSE(resulting CC: '$CC') + CF_VERBOSE(resulting CFLAGS: '$CFLAGS') + CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS') + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CFG_DEFAULTS version: 16 updated: 2021/01/04 19:33:05 +dnl --------------- +dnl Determine the default configuration into which we'll install ncurses. This +dnl can be overridden by the user's command-line options. There's two items to +dnl look for: +dnl 1. the prefix (e.g., /usr) +dnl 2. the header files (e.g., /usr/include/ncurses) +dnl We'll look for a previous installation of ncurses and use the same defaults. +dnl +dnl We don't use AC_PREFIX_DEFAULT, because it gets evaluated too soon, and +dnl we don't use AC_PREFIX_PROGRAM, because we cannot distinguish ncurses's +dnl programs from a vendor's. +AC_DEFUN([CF_CFG_DEFAULTS], +[AC_REQUIRE([AC_PROG_FGREP])dnl + +AC_MSG_CHECKING(for prefix) +if test "x$prefix" = "xNONE" ; then + case "$cf_cv_system_name" in + # non-vendor systems don't have a conflict + (openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*) + prefix=/usr + ;; + (*) prefix=$ac_default_prefix + ;; + esac +fi +AC_MSG_RESULT($prefix) + +if test "x$prefix" = "xNONE" ; then +AC_MSG_CHECKING(for default include-directory) +test -n "$verbose" && echo 1>&AC_FD_MSG +for cf_symbol in \ + "$includedir" \ + "$includedir/ncurses" \ + "$prefix/include" \ + "$prefix/include/ncurses" \ + /usr/local/include \ + /usr/local/include/ncurses \ + /usr/include \ + /usr/include/ncurses +do + cf_dir=`eval echo "$cf_symbol"` + if test -f "$cf_dir/curses.h" ; then + if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then + includedir="$cf_symbol" + test -n "$verbose" && echo $ECHO_N " found " 1>&AC_FD_MSG + break + fi + fi + test -n "$verbose" && echo " tested $cf_dir" 1>&AC_FD_MSG +done +AC_MSG_RESULT($includedir) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CGETENT version: 7 updated: 2023/02/18 17:41:25 +dnl ---------- +dnl Check if the terminal-capability database functions are available. If not, +dnl ncurses has a much-reduced version. +AC_DEFUN([CF_CGETENT],[ +AC_CACHE_CHECK(for terminal-capability database functions,cf_cv_cgetent,[ +AC_TRY_LINK([ +$ac_includes_default],[ + char temp[128]; + char *buf = temp; + char *db_array = temp; + cgetent(&buf, &db_array, "vt100"); + cgetcap(buf, "tc", '='); + cgetmatch(buf, "tc"); + ], + [cf_cv_cgetent=yes], + [cf_cv_cgetent=no]) +]) + +if test "$cf_cv_cgetent" = yes +then + AC_DEFINE(HAVE_BSD_CGETENT,1,[Define to 1 if we have BSD cgetent]) +AC_CACHE_CHECK(if cgetent uses const parameter,cf_cv_cgetent_const,[ +AC_TRY_LINK([ +#pragma GCC diagnostic error "-Wincompatible-pointer-types-discards-qualifiers" +$ac_includes_default],[ + char temp[128]; + char *buf = temp; +#ifndef _NETBSD_SOURCE /* given, since April 2004 in stdlib.h */ + const char *db_array = temp; + cgetent(&buf, &db_array, "vt100"); +#endif + cgetcap(buf, "tc", '='); + cgetmatch(buf, "tc"); + ], + [cf_cv_cgetent_const=yes], + [cf_cv_cgetent_const=no]) +]) + if test "$cf_cv_cgetent_const" = yes + then + AC_DEFINE_UNQUOTED(CGETENT_CONST,const,[Define to const if needed for some BSD cgetent variations]) + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15 +dnl -------------- +dnl Check if we're accidentally using a cache from a different machine. +dnl Derive the system name, as a check for reusing the autoconf cache. +dnl +dnl If we've packaged config.guess and config.sub, run that (since it does a +dnl better job than uname). Normally we'll use AC_CANONICAL_HOST, but allow +dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM +dnl which is useful in cross-compiles. +dnl +dnl Note: we would use $ac_config_sub, but that is one of the places where +dnl autoconf 2.5x broke compatibility with autoconf 2.13 +AC_DEFUN([CF_CHECK_CACHE], +[ +if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then + ifelse([$1],,[AC_CANONICAL_HOST],[$1]) + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.]) +AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"]) + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name) + +if test ".$system_name" != ".$cf_cv_system_name" ; then + AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)) + AC_MSG_ERROR("Please remove config.cache and try again.") +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_ENVIRON version: 5 updated: 2023/02/18 17:41:25 +dnl ---------------- +dnl Check for data that is usually declared in , e.g., the 'environ' +dnl variable. Define a DECL_xxx symbol if we must declare it ourselves. +dnl +dnl $1 = the name to check +dnl $2 = the assumed type +AC_DEFUN([CF_CHECK_ENVIRON], +[ +AC_CACHE_CHECK(if external $1 is declared, cf_cv_dcl_$1,[ + AC_TRY_COMPILE([ +$ac_includes_default], + ifelse([$2],,void*,[$2]) x = (ifelse([$2],,void*,[$2])) $1; (void)x, + [cf_cv_dcl_$1=yes], + [cf_cv_dcl_$1=no]) +]) + +if test "$cf_cv_dcl_$1" = no ; then + CF_UPPER(cf_result,decl_$1) + AC_DEFINE_UNQUOTED($cf_result) +fi + +# It's possible (for near-UNIX clones) that the data doesn't exist +CF_CHECK_EXTERN_DATA($1,ifelse([$2],,int,[$2])) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_ERRNO version: 14 updated: 2023/02/18 17:41:25 +dnl -------------- +dnl Check for data that is usually declared in or , e.g., +dnl the 'errno' variable. Define a DECL_xxx symbol if we must declare it +dnl ourselves. +dnl +dnl $1 = the name to check +dnl $2 = the assumed type +AC_DEFUN([CF_CHECK_ERRNO], +[ +AC_CACHE_CHECK(if external $1 is declared, cf_cv_dcl_$1,[ + AC_TRY_COMPILE([ +$ac_includes_default +#include ], + ifelse([$2],,int,[$2]) x = (ifelse([$2],,int,[$2])) $1; (void)x, + [cf_cv_dcl_$1=yes], + [cf_cv_dcl_$1=no]) +]) + +if test "$cf_cv_dcl_$1" = no ; then + CF_UPPER(cf_result,decl_$1) + AC_DEFINE_UNQUOTED($cf_result) +fi + +# It's possible (for near-UNIX clones) that the data doesn't exist +CF_CHECK_EXTERN_DATA($1,ifelse([$2],,int,[$2])) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_EXTERN_DATA version: 5 updated: 2021/09/04 06:35:04 +dnl -------------------- +dnl Check for existence of external data in the current set of libraries. If +dnl we can modify it, it is real enough. +dnl $1 = the name to check +dnl $2 = its type +AC_DEFUN([CF_CHECK_EXTERN_DATA], +[ +AC_CACHE_CHECK(if external $1 exists, cf_cv_have_$1,[ + AC_TRY_LINK([ +#undef $1 +extern $2 $1; +], + [$1 = 2], + [cf_cv_have_$1=yes], + [cf_cv_have_$1=no]) +]) + +if test "$cf_cv_have_$1" = yes ; then + CF_UPPER(cf_result,have_$1) + AC_DEFINE_UNQUOTED($cf_result) +fi + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_FVISIBILITY version: 2 updated: 2020/04/04 16:16:13 +dnl -------------------- +dnl Check whether the compiler understands -fvisibility=hidden +dnl +dnl $1 = compiler +dnl $2 = compiler-flags variable name +dnl $3 = cache variable to set +AC_DEFUN([CF_CHECK_FVISIBILITY],[ +AC_CACHE_CHECK(if $1 -fvisibility=hidden option works,$3,[ + cf_save_cflags="[$]$2" + $2="[$]$2 -fvisibility=hidden" + AC_TRY_LINK([ +__attribute__ ((visibility("default"))) int somefunc() {return 42;} + ],[ + if (somefunc()) return 1; +], + [$3=yes], + [$3=no]) + $2=$cf_save_cflags +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_GETENV version: 4 updated: 2023/12/03 10:18:09 +dnl --------------- +dnl Check if repeated getenv calls return the same pointer, e.g., it does not +dnl discard the previous pointer when returning a new one. +AC_DEFUN([CF_CHECK_GETENV], +[ +AC_REQUIRE([CF_CHECK_ENVIRON]) +AC_CHECK_FUNC( getenv, ,, AC_MSG_ERROR(getenv not found) ) +AC_CHECK_FUNCS( putenv setenv strdup ) +AC_CACHE_CHECK(if getenv returns consistent values,cf_cv_consistent_getenv,[ +AC_TRY_RUN([ +$ac_includes_default + +#if defined(HAVE_ENVIRON) && defined(DECL_ENVIRON) && !defined(environ) +extern char **environ; /* POSIX, but some systems are not... */ +#endif + +#if defined(HAVE_STRDUP) +#define str_alloc(s) strdup(s) +#else +#define str_alloc(s) strcpy(malloc(strlen(s) + 1, s)) +#endif + +static void set_value(const char *name, const char *value) +{ +#if defined(HAVE_SETENV) + setenv(name, value, 1); +#elif defined(HAVE_PUTENV) + char buffer[1024]; + sprintf(buffer, "%s=%s", name, value); + putenv(str_alloc(buffer)); +#else +#error neither putenv/setenv found +#endif +} +int main(void) +{ + int pass; + size_t numenv, limit, j; + char **mynames; + char **myvalues; + char **mypointer; + char *equals; + for (numenv = 0; environ[numenv]; ++numenv) ; + limit = numenv + 10; + mynames = (char **) calloc(limit + 1, sizeof(char *)); + myvalues = (char **) calloc(limit + 1, sizeof(char *)); + mypointer = (char **) calloc(limit + 1, sizeof(char *)); +#if defined(HAVE_ENVIRON) + for (j = 0; environ[j]; ++j) { + mynames[j] = str_alloc(environ[j]); + equals = strchr(mynames[j], '='); + if (equals != 0) { + *equals++ = '\\0'; + myvalues[j] = str_alloc(equals); + } else { + myvalues[j] = str_alloc(""); + } + } +#endif + for (j = numenv; j < limit; ++j) { + char name[80]; + char value[80]; + size_t found; + size_t k = 0; + do { + size_t jk; + found = 0; + sprintf(name, "TERM%lu", (unsigned long) k); + for (jk = 0; jk < j; ++jk) { + if (!strcmp(name, mynames[jk])) { + found = 1; + ++k; + break; + } + } + } while (found); + sprintf(value, "%lu:%p", (unsigned long) k, (void*)&mynames[j]); + set_value(name, value); + mynames[j] = str_alloc(name); + myvalues[j] = str_alloc(value); + } + for (pass = 0; pass < 3; ++pass) { + for (j = 0; j < limit; ++j) { + char *value = getenv(mynames[j]); + if (pass) { + if (value == 0) { + fprintf(stderr, "getenv returned null for %s\\n", mynames[j]); + ${cf_cv_main_return:-return}(1); + } else if (value != mypointer[j]) { + fprintf(stderr, "getenv returned different pointer for %s\\n", mynames[j]); + ${cf_cv_main_return:-return}(1); + } else if (strcmp(value, myvalues[j])) { + fprintf(stderr, "getenv returned different value for %s\\n", mynames[j]); + ${cf_cv_main_return:-return}(1); + } + } else { + size_t k; + mypointer[j] = value; + for (k = 0; k < j; ++k) { + if (mypointer[j] == mypointer[k]) { + fprintf(stderr, "getenv returned same pointer for %s and %s\\n", mynames[j], mynames[k]); + ${cf_cv_main_return:-return}(1); + } + } + } + } + } + ${cf_cv_main_return:-return}(0); +} +], +[cf_cv_consistent_getenv=yes], +[cf_cv_consistent_getenv=no], +[cf_cv_consistent_getenv=unknown]) +]) + +if test "x$cf_cv_consistent_getenv" = xno +then + AC_DEFINE(HAVE_CONSISTENT_GETENV,1,[Define to 1 if getenv repeatably returns the same value for a given name]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_GNAT_VERSION version: 4 updated: 2021/01/01 13:31:04 +dnl --------------------- +AC_DEFUN([CF_CHECK_GNAT_VERSION], +[ +AC_REQUIRE([CF_GNAT_VERSION]) +case "$cf_cv_gnat_version" in +(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]]) + cf_cv_prog_gnat_correct=yes + ;; +(*) + AC_MSG_WARN(Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding.) + cf_cv_prog_gnat_correct=no + ;; +esac +]) +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_GPM_WGETCH version: 6 updated: 2021/01/04 18:48:01 +dnl ------------------- +dnl Check if GPM is already linked with curses. If so - and if the linkage +dnl is not "weak" - warn about this because it can create problems linking +dnl applications with ncurses. +AC_DEFUN([CF_CHECK_GPM_WGETCH],[ +AC_REQUIRE([AC_PROG_EGREP])dnl + +AC_CHECK_LIB(gpm,Gpm_Wgetch,[ + +AC_CACHE_CHECK(if GPM is weakly bound to curses library, cf_cv_check_gpm_wgetch,[ +cf_cv_check_gpm_wgetch=unknown +if test "$cross_compiling" != yes ; then + +cat >conftest.$ac_ext < +int main(void) +{ + Gpm_Wgetch(); + ${cf_cv_main_return:-return}(0); +} +CF_EOF + + cf_save_LIBS="$LIBS" + # This only works if we can look at the symbol table. If a shared + # library is stripped for install, we cannot use that. So we're forced + # to rely on the static library, noting that some packagers may not + # include it. + LIBS="-static -lgpm -dynamic $LIBS" + if AC_TRY_EVAL(ac_compile) ; then + if AC_TRY_EVAL(ac_link) ; then + cf_cv_check_gpm_wgetch="`nm \"conftest$ac_exeext\" | ${EGREP-egrep} '\' | ${EGREP-egrep} '\<[[vVwW]]\>'`" + test -n "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=yes + test -z "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=no + fi + fi + rm -rf ./conftest* + LIBS="$cf_save_LIBS" +fi +]) + +if test "$cf_cv_check_gpm_wgetch" != yes ; then + AC_MSG_WARN(GPM library is already linked with curses - read the FAQ) +fi +])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_LIBSSP version: 1 updated: 2021/10/30 10:40:19 +dnl --------------- +dnl Check if libssp is needed, e.g., to work around misconfigured libraries +dnl used in cross-compiling to MinGW. +AC_DEFUN([CF_CHECK_LIBSSP],[ +AC_CACHE_CHECK(if ssp library is needed,cf_cv_need_libssp,[ +AC_TRY_LINK([ +#include +#include +],[ + DIR *dp = opendir("."); +],cf_cv_need_libssp=no,[ + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lssp" + AC_TRY_LINK([ +#include +#include + ],[ + DIR *dp = opendir("."); + ],cf_cv_need_libssp=yes, + cf_cv_need_libssp=maybe) + LIBS="$cf_save_LIBS" +])dnl +]) + +if test "x$cf_cv_need_libssp" = xyes +then + CF_ADD_LIB(ssp) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_LIBTOOL_VERSION version: 3 updated: 2024/06/12 04:19:01 +dnl ------------------------ +dnl Show the version of libtool +dnl +dnl Save the version in a cache variable - this is not entirely a good thing, +dnl but the version string from libtool is very ugly, and for bug reports it +dnl might be useful to have the original string. +dnl +dnl There is an imitation in OpenBSD, which has no apparent use other than to +dnl deny that it is GNU libtool. Just ignore it. +AC_DEFUN([CF_CHECK_LIBTOOL_VERSION],[ +if test -n "$LIBTOOL" && test "$LIBTOOL" != none +then + AC_MSG_CHECKING(version of $LIBTOOL) + CF_LIBTOOL_VERSION + AC_MSG_RESULT($cf_cv_libtool_version) + ifdef([LT_PACKAGE_VERSION],,[ + if test -n "$cf_cv_libtool_version" + then + cf_check_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' -e 's,[[()]],...,g' -e 's,[[ ]],-,g' -e '2,$d'` + case "x$cf_check_libtool_version" in + (*...GNU-libtool...*) + ;; + (*) + AC_MSG_ERROR(This is not GNU libtool) + ;; + esac + else + AC_MSG_ERROR(No version found for $LIBTOOL) + fi + ]) +else + AC_MSG_ERROR(GNU libtool has not been found) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_WCHAR_H version: 5 updated: 2023/12/03 09:21:34 +dnl ---------------- +dnl Check if wchar.h can be used, i.e., without defining _XOPEN_SOURCE_EXTENDED +AC_DEFUN([CF_CHECK_WCHAR_H],[ +AC_CHECK_HEADERS( \ +wchar.h \ +wctype.h \ +) +AC_CACHE_CHECK(if wchar.h can be used as is,cf_cv_wchar_h_okay,[ +AC_TRY_COMPILE( +[ +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif +#ifdef HAVE_WCTYPE_H +#include +#endif +],[ + wint_t foo = 0; + int bar = iswpunct(foo); (void) bar], + [cf_cv_wchar_h_okay=yes], + [cf_cv_wchar_h_okay=no])]) + +if test "$cf_cv_wchar_h_okay" = no +then + CF_PREDEFINE(_XOPEN_SOURCE_EXTENDED) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_WCWIDTH_GRAPHICS version: 4 updated: 2023/12/03 10:17:07 +dnl ------------------------- +dnl Most "modern" terminal emulators are based to some degree on VT100, and +dnl should support line-drawing. Even with Unicode. There is a problem. +dnl +dnl While most of the VT100 graphics characters were incorporated into Unicode, +dnl all of those were combined into a page of useful graphics characters. +dnl +dnl So far, so good. +dnl +dnl However, while they are useful, there are other considerations. CJK +dnl is (because of poor device resolution) often rendered as double-width +dnl characters. So... for these generally-useful characters, what should +dnl be the width (to make them consistent with adjacent characters)? +dnl +dnl The obvious choice would have been to make this locale-dependent, and use +dnl wcwidth() to tell applications what the actual width is. That was too +dnl obvious. Instead, we have a slew of "ambiguous-width" characters. +dnl See for example +dnl http://www.unicode.org/reports/tr11/tr11-29.html +dnl http://www.cl.cam.ac.uk/~mgk25/ucs/scw-proposal.html +dnl +dnl The EastAsianWidth-6.2.0.txt file from the Unicode organization lists +dnl more than 22,000 characters, with 1281 of those as ambiguous-width. For +dnl instance, it lists half (44/96) of the Latin-1 characters as +dnl ambiguous-width. Also, all of the box-characters at 0x2500 are ambiguous. +dnl +dnl What this means for the implementor is that on some systems wcwidth() can +dnl give bad advice. On Solaris, some of the ambiguous widths are returned as +dnl 1 (the Latin-1 characters), while others are returned as 2 (line-drawing +dnl characters). These do not necessarily match the behavior of the terminal +dnl emulator. xterm, for instance, does an optional startup check to find if +dnl this problem (or similar) exists with the system's locale tables, rejecting +dnl them if they are too unreliable. +AC_DEFUN([CF_CHECK_WCWIDTH_GRAPHICS],[ +AC_CACHE_CHECK(if wcwidth agrees graphics are single-width, cf_cv_wcwidth_graphics,[ +cat >conftest.in < +#include + +#define MY_LEN 80 + +int +main(void) +{ + FILE *fp; + unsigned value; + char buffer[MY_LEN + 1]; + char notes[MY_LEN + 1]; + int totals = 0; + int passed = 0; + + if (setlocale(LC_ALL, "en_US.UTF8") || + setlocale(LC_ALL, "en_US.UTF-8") || + setlocale(LC_ALL, "en_US.utf8") || + setlocale(LC_ALL, "en_US.utf-8")) { + if ((fp = fopen("conftest.in", "r")) != 0) { + while (fgets(buffer, MY_LEN, fp) != 0) { + if (*buffer == '-') { + fprintf(stderr, "\\t%s", buffer); + } else if (sscanf(buffer, "%x %s", &value, notes) == 2) { + ++totals; + if (wcwidth((int)value) == 1) + ++passed; + fprintf(stderr, "%d\\t%s", wcwidth((int)value), buffer); + } else { + fprintf(stderr, "?\\t%s", buffer); + } + } + } + } + fprintf(stderr, "%d/%d passed wcwidth/graphics check\\n", passed, totals); + return (totals == passed) ? 0 : 1; +} +], +[cf_cv_wcwidth_graphics=yes], +[cf_cv_wcwidth_graphics=no], +[cf_cv_wcwidth_graphics=unknown]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CLANG_COMPILER version: 9 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Check if the given compiler is really clang. clang's C driver defines +dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does +dnl not ignore some gcc options. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = CLANG_COMPILER (default) +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_CLANG_COMPILER],[ +ifelse([$2],,CLANG_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + AC_TRY_COMPILE([],[ +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif +],[ifelse([$2],,CLANG_COMPILER,[$2])=yes +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2])) +fi + +CLANG_VERSION=none + +if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then + case "$CC" in + (c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]]) + AC_MSG_WARN(replacing broken compiler alias $CC) + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + AC_MSG_CHECKING(version of $CC) + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + AC_MSG_RESULT($CLANG_VERSION) + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + AC_MSG_CHECKING(if option $cf_clang_opt works) + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + AC_TRY_LINK([ + #include ],[ + printf("hello!\\n");],[ + cf_clang_optok=yes],[ + cf_clang_optok=no]) + AC_MSG_RESULT($cf_clang_optok) + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + CF_VERBOSE(adding option $cf_clang_opt) + CF_APPEND_TEXT(CFLAGS,$cf_clang_opt) + fi + done +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_CONST_X_STRING version: 8 updated: 2023/12/01 17:22:50 +dnl ----------------- +dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most +dnl character-strings. +dnl +dnl It is ambiguous because the specification accommodated the pre-ANSI +dnl compilers bundled by more than one vendor in lieu of providing a standard C +dnl compiler other than by costly add-ons. Because of this, the specification +dnl did not take into account the use of const for telling the compiler that +dnl string literals would be in readonly memory. +dnl +dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to +dnl let the compiler decide how to represent Xt's strings which were #define'd. +dnl That does not solve the problem of using the block of Xt's strings which +dnl are compiled into the library (and is less efficient than one might want). +dnl +dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both +dnl when compiling the library and compiling using the library, to tell the +dnl compiler that String is const. +AC_DEFUN([CF_CONST_X_STRING], +[ +AC_REQUIRE([AC_PATH_XTRA]) + +CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING]) + +AC_TRY_COMPILE( +[ +#include +#include +], +[String foo = malloc(1); free((void*)foo)],[ + +AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[ + AC_TRY_COMPILE( + [ +#undef _CONST_X_STRING +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + ],[String foo = malloc(1); *foo = 0],[ + cf_cv_const_x_string=no + ],[ + cf_cv_const_x_string=yes + ]) +]) + +CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING]) + +case "$cf_cv_const_x_string" in +(no) + CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES) + ;; +(*) + CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING) + ;; +esac + +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CPP_OVERRIDE version: 1 updated: 2022/08/20 16:07:10 +dnl --------------- +dnl Check if the C++ compiler accepts the override keyword. This is a C++-11 +dnl feature. +AC_DEFUN([CF_CPP_OVERRIDE], +[ +if test -n "$CXX"; then +AC_CACHE_CHECK(if $CXX accepts override keyword,cf_cv_cpp_override,[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_RUN([ + +class base +{ +public: + virtual int foo(float x) = 0; +}; + + +class derived: public base +{ +public: + int foo(float x) override { return x != 0.0 ? 1 : 0; } +}; + +int main(void) { } +], + [cf_cv_cpp_override=yes], + [cf_cv_cpp_override=no], + [cf_cv_cpp_override=unknown]) + AC_LANG_RESTORE +]) +fi +test "$cf_cv_cpp_override" = yes && AC_DEFINE(CPP_HAS_OVERRIDE,1,[Define to 1 if C++ has override keyword]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CPP_PARAM_INIT version: 7 updated: 2017/01/21 11:06:25 +dnl ----------------- +dnl Check if the C++ compiler accepts duplicate parameter initialization. This +dnl is a late feature for the standard and is not in some recent compilers +dnl (1999/9/11). +AC_DEFUN([CF_CPP_PARAM_INIT], +[ +if test -n "$CXX"; then +AC_CACHE_CHECK(if $CXX accepts parameter initialization,cf_cv_cpp_param_init,[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_RUN([ +class TEST { +private: + int value; +public: + TEST(int x = 1); + ~TEST(); +}; + +TEST::TEST(int x = 1) // some compilers do not like second initializer +{ + value = x; +} +int main(void) { } +], + [cf_cv_cpp_param_init=yes], + [cf_cv_cpp_param_init=no], + [cf_cv_cpp_param_init=unknown]) + AC_LANG_RESTORE +]) +fi +test "$cf_cv_cpp_param_init" = yes && AC_DEFINE(CPP_HAS_PARAM_INIT,1,[Define to 1 if C++ has parameter initialization]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CPP_STATIC_CAST version: 3 updated: 2013/04/13 18:03:21 +dnl ------------------ +dnl Check if the C++ compiler accepts static_cast in generics. This appears to +dnl not be supported in g++ before 3.0 +AC_DEFUN([CF_CPP_STATIC_CAST], +[ +if test -n "$CXX"; then + +AC_CACHE_CHECK(if $CXX accepts static_cast,cf_cv_cpp_static_cast,[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + + AC_TRY_COMPILE([ +class NCursesPanel +{ +public: + NCursesPanel(int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0) + { + } + NCursesPanel(); + ~NCursesPanel(); +}; + +template class NCursesUserPanel : public NCursesPanel +{ +public: + NCursesUserPanel (int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = static_cast(0)) + : NCursesPanel (nlines, ncols, begin_y, begin_x) + { + }; + NCursesUserPanel(const T* p_UserData = static_cast(0)) : NCursesPanel() + { + }; + + virtual ~NCursesUserPanel() {}; +}; +],[ + const char* p_UserData = static_cast(0)], + [cf_cv_cpp_static_cast=yes], + [cf_cv_cpp_static_cast=no]) + + AC_LANG_RESTORE +]) + +fi + +test "$cf_cv_cpp_static_cast" = yes && AC_DEFINE(CPP_HAS_STATIC_CAST,1,[Define to 1 if C++ has static_cast]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CXX_AR_FLAGS version: 3 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Setup special archiver flags for given compilers. +AC_DEFUN([CF_CXX_AR_FLAGS],[ + CXX_AR='$(AR)' + CXX_ARFLAGS='$(ARFLAGS)' + case "$cf_cv_system_name" in + (irix*) + if test "$GXX" != yes ; then + CXX_AR='$(CXX)' + CXX_ARFLAGS='-ar -o' + fi + ;; + (sco3.2v5*) + CXXLDFLAGS="-u main" + ;; + (solaris2*) + if test "$GXX" != yes ; then + CXX_AR='$(CXX)' + CXX_ARFLAGS='-xar -o' + fi + ;; + esac + AC_SUBST(CXXLDFLAGS) + AC_SUBST(CXX_AR) + AC_SUBST(CXX_ARFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CXX_IOSTREAM_NAMESPACE version: 2 updated: 2012/10/06 17:56:13 +dnl ------------------------- +dnl For c++, check if iostream uses "std::" namespace. +AC_DEFUN([CF_CXX_IOSTREAM_NAMESPACE],[ +AC_CHECK_HEADERS(iostream) +if test x"$ac_cv_header_iostream" = xyes ; then + AC_MSG_CHECKING(if iostream uses std-namespace) + AC_TRY_COMPILE([ +#include +using std::endl; +using std::cerr;],[ +cerr << "testing" << endl; +],[cf_iostream_namespace=yes],[cf_iostream_namespace=no]) + AC_MSG_RESULT($cf_iostream_namespace) + if test "$cf_iostream_namespace" = yes ; then + AC_DEFINE(IOSTREAM_NAMESPACE,1,[Define to 1 if C++ has namespace iostream]) + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_C_INLINE version: 6 updated: 2019/09/07 13:38:36 +dnl ----------- +dnl Check if the C compiler supports "inline". +dnl $1 is the name of a shell variable to set if inline is supported +dnl $2 is the threshold for gcc 4.x's option controlling maximum inline size +AC_DEFUN([CF_C_INLINE],[ +AC_REQUIRE([CF_GCC_VERSION]) +AC_C_INLINE +$1= +if test "$ac_cv_c_inline" != no ; then + $1=inline + if test "$INTEL_COMPILER" = yes + then + : + elif test "$CLANG_COMPILER" = yes + then + : + elif test "$GCC" = yes + then + AC_CACHE_CHECK(if $CC supports options to tune inlining,cf_cv_gcc_inline,[ + cf_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS --param max-inline-insns-single=$2" + AC_TRY_COMPILE([inline int foo(void) { return 1; }], + [${cf_cv_main_return:-return} foo()], + [cf_cv_gcc_inline=yes], + [cf_cv_gcc_inline=no]) + CFLAGS=$cf_save_CFLAGS + ]) + if test "$cf_cv_gcc_inline" = yes ; then + CF_ADD_CFLAGS([--param max-inline-insns-single=$2]) + fi + fi +fi +AC_SUBST($1) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42 +dnl ---------- +dnl "dirname" is not portable, so we fake it with a shell script. +AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DIRS_TO_MAKE version: 4 updated: 2021/01/01 13:31:04 +dnl --------------- +AC_DEFUN([CF_DIRS_TO_MAKE], +[ +DIRS_TO_MAKE="lib" +for cf_item in $cf_list_models +do + CF_OBJ_SUBDIR($cf_item,cf_subdir) + for cf_item2 in $DIRS_TO_MAKE + do + test "$cf_item2" = "$cf_subdir" && break + done + test ".$cf_item2" != ".$cf_subdir" && DIRS_TO_MAKE="$DIRS_TO_MAKE $cf_subdir" +done +for cf_dir in $DIRS_TO_MAKE +do + test ! -d "$cf_dir" && mkdir "$cf_dir" +done +AC_SUBST(DIRS_TO_MAKE) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04 +dnl --------------- +dnl You can always use "make -n" to see the actual options, but it is hard to +dnl pick out/analyze warning messages when the compile-line is long. +dnl +dnl Sets: +dnl ECHO_LT - symbol to control if libtool is verbose +dnl ECHO_LD - symbol to prefix "cc -o" lines +dnl RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o) +dnl SHOW_CC - symbol to put before explicit "cc -c" lines +dnl ECHO_CC - symbol to put before any "cc" line +dnl +AC_DEFUN([CF_DISABLE_ECHO],[ +AC_MSG_CHECKING(if you want to see long compiling messages) +CF_ARG_DISABLE(echo, + [ --disable-echo do not display "compiling" commands], + [ + ECHO_LT='--silent' + ECHO_LD='@echo linking [$]@;' + RULE_CC='@echo compiling [$]<' + SHOW_CC='@echo compiling [$]@' + ECHO_CC='@' +],[ + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' +]) +AC_MSG_RESULT($enableval) +AC_SUBST(ECHO_LT) +AC_SUBST(ECHO_LD) +AC_SUBST(RULE_CC) +AC_SUBST(SHOW_CC) +AC_SUBST(ECHO_CC) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_GNAT_PROJECTS version: 1 updated: 2014/06/01 11:34:00 +dnl ------------------------ +AC_DEFUN([CF_DISABLE_GNAT_PROJECTS],[ +AC_MSG_CHECKING(if we want to use GNAT projects) +CF_ARG_DISABLE(gnat-projects, + [ --disable-gnat-projects test: disable GNAT projects even if usable], + [enable_gnat_projects=no], + [enable_gnat_projects=yes]) +AC_MSG_RESULT($enable_gnat_projects) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_LEAKS version: 9 updated: 2021/04/03 16:41:50 +dnl ---------------- +dnl Combine no-leak checks with the libraries or tools that are used for the +dnl checks. +AC_DEFUN([CF_DISABLE_LEAKS],[ + +AC_REQUIRE([CF_WITH_DMALLOC]) +AC_REQUIRE([CF_WITH_DBMALLOC]) +AC_REQUIRE([CF_WITH_VALGRIND]) + +AC_MSG_CHECKING(if you want to perform memory-leak testing) +AC_ARG_ENABLE(leaks, + [ --disable-leaks test: free permanent memory, analyze leaks], + [enable_leaks=$enableval], + [enable_leaks=yes]) +dnl with_no_leaks is more readable... +if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi +AC_MSG_RESULT($with_no_leaks) + +if test "$enable_leaks" = no ; then + AC_DEFINE(NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.]) + AC_DEFINE(YY_NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_LIBTOOL_VERSION version: 3 updated: 2015/04/17 21:13:04 +dnl -------------------------- +dnl Check if we should use the libtool 1.5 feature "-version-number" instead of +dnl the older "-version-info" feature. The newer feature allows us to use +dnl version numbering on shared libraries which make them compatible with +dnl various systems. +AC_DEFUN([CF_DISABLE_LIBTOOL_VERSION], +[ +AC_MSG_CHECKING(if libtool -version-number should be used) +CF_ARG_DISABLE(libtool-version, + [ --disable-libtool-version enable to use libtool's incompatible naming scheme], + [cf_libtool_version=no], + [cf_libtool_version=yes]) +AC_MSG_RESULT($cf_libtool_version) + +if test "$cf_libtool_version" = yes ; then + LIBTOOL_VERSION="-version-number" +else + LIBTOOL_VERSION="-version-info" + case "x$VERSION" in + (x) + AC_MSG_WARN(VERSION was not set) + ;; + (x*.*.*) + ABI_VERSION="$VERSION" + CF_VERBOSE(ABI_VERSION: $ABI_VERSION) + ;; + (x*:*:*) + ABI_VERSION=`echo "$VERSION" | sed -e 's/:/./g'` + CF_VERBOSE(ABI_VERSION: $ABI_VERSION) + ;; + (*) + AC_MSG_WARN(unexpected VERSION value: $VERSION) + ;; + esac +fi + +AC_SUBST(ABI_VERSION) +AC_SUBST(LIBTOOL_VERSION) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_RPATH_HACK version: 3 updated: 2021/01/05 20:14:44 +dnl --------------------- +dnl The rpath-hack makes it simpler to build programs, particularly with the +dnl *BSD ports which may have essential libraries in unusual places. But it +dnl can interfere with building an executable for the base system. Use this +dnl option in that case. +AC_DEFUN([CF_DISABLE_RPATH_HACK], +[ +AC_MSG_CHECKING(if rpath-hack should be disabled) +CF_ARG_DISABLE(rpath-hack, + [ --disable-rpath-hack don't add rpath options for additional libraries], + [enable_rpath_hack=no], + [enable_rpath_hack=yes]) +dnl TODO - drop cf_disable_rpath_hack +if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi +AC_MSG_RESULT($cf_disable_rpath_hack) + +if test "$enable_rpath_hack" = yes ; then + CF_RPATH_HACK +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_BROKEN_LINKER version: 2 updated: 2021/01/02 17:09:14 +dnl ----------------------- +dnl Some linkers cannot reference a data-only object. Cygwin used to be one. +dnl This usually follows CF_LINK_DATAONLY, but is not required in case we need +dnl an unconditional feature. +AC_DEFUN([CF_ENABLE_BROKEN_LINKER],[ + +AC_MSG_CHECKING(if you want broken-linker support code) +AC_ARG_ENABLE(broken_linker, + [ --enable-broken_linker compile with broken-linker support code], + [with_broken_linker=$enableval], + [with_broken_linker=no]) +AC_MSG_RESULT($with_broken_linker) + +: "${BROKEN_LINKER:=0}" +if test "x$with_broken_linker" = xyes ; then + AC_DEFINE(BROKEN_LINKER,1,[Define to 1 to work around linkers which cannot link data-only modules]) + BROKEN_LINKER=1 +fi +AC_SUBST(BROKEN_LINKER) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_PC_FILES version: 16 updated: 2021/11/20 12:48:37 +dnl ------------------ +dnl This is the "--enable-pc-files" option, which is available if there is a +dnl pkg-config configuration on the local machine. +AC_DEFUN([CF_ENABLE_PC_FILES],[ +AC_REQUIRE([CF_PKG_CONFIG]) +AC_REQUIRE([CF_WITH_PKG_CONFIG_LIBDIR]) + +if test "x$PKG_CONFIG" != xnone +then + AC_MSG_CHECKING(if we should install .pc files for $PKG_CONFIG) +else + AC_MSG_CHECKING(if we should install .pc files) +fi + +AC_ARG_ENABLE(pc-files, + [ --enable-pc-files generate and install .pc files for pkg-config], + [enable_pc_files=$enableval], + [enable_pc_files=no]) +AC_MSG_RESULT($enable_pc_files) + +if test "x$enable_pc_files" != xno +then + MAKE_PC_FILES= + case "x$PKG_CONFIG_LIBDIR" in + (xno|xnone|xyes|x) + AC_MSG_WARN(no PKG_CONFIG_LIBDIR was found) + ;; + (*) + cf_pkg_config_libdir="$PKG_CONFIG_LIBDIR" + CF_PATH_SYNTAX(cf_pkg_config_libdir) + ;; + esac +else + MAKE_PC_FILES="#" +fi +AC_SUBST(MAKE_PC_FILES) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_RPATH version: 2 updated: 2010/03/27 18:39:42 +dnl --------------- +dnl Check if the rpath option should be used, setting cache variable +dnl cf_cv_enable_rpath if so. +AC_DEFUN([CF_ENABLE_RPATH], +[ +AC_MSG_CHECKING(if rpath option should be used) +AC_ARG_ENABLE(rpath, +[ --enable-rpath use rpath option when generating shared libraries], +[cf_cv_enable_rpath=$enableval], +[cf_cv_enable_rpath=no]) +AC_MSG_RESULT($cf_cv_enable_rpath) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_STRING_HACKS version: 6 updated: 2021/01/05 19:23:48 +dnl ---------------------- +dnl On a few platforms, the compiler and/or loader nags with untruthful +dnl comments stating that "most" uses of strcat/strcpy/sprintf are incorrect, +dnl and implying that most uses of the recommended alternatives are correct. +dnl +dnl Factually speaking, no one has actually counted the number of uses of these +dnl functions versus the total of incorrect uses. Samples of a few thousand +dnl instances are meaningless compared to the hundreds of millions of lines of +dnl existing C code. +dnl +dnl strlcat/strlcpy are (as of 2012) non-standard, and are available on some +dnl platforms, in implementations of varying quality. Likewise, snprintf is +dnl standard - but evolved through phases, and older implementations are likely +dnl to yield surprising results, as documented in manpages on various systems. +AC_DEFUN([CF_ENABLE_STRING_HACKS], +[ +AC_MSG_CHECKING(if you want to work around bogus compiler/loader warnings) +AC_ARG_ENABLE(string-hacks, + [ --enable-string-hacks work around bogus compiler/loader warnings], + [enable_string_hacks=$enableval], + [enable_string_hacks=no]) +AC_MSG_RESULT($enable_string_hacks) + +if test "x$enable_string_hacks" = "xyes"; then + AC_DEFINE(USE_STRING_HACKS,1,[Define to 1 to work around bogus compiler/loader warnings]) + AC_MSG_WARN(enabling string-hacks to work around bogus compiler/loader warnings) + AC_CHECK_FUNC(strlcat,[ + AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function]) + ],[ + AC_CHECK_LIB(bsd,strlcat,[ + CF_ADD_LIB(bsd) + AC_CHECK_HEADERS(bsd/string.h) + AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function]) + ]) + ]) + AC_CHECK_FUNCS( strlcpy snprintf ) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50 +dnl ------------------ +dnl Configure-option to enable gcc warnings +dnl +dnl $1 = extra options to add, if supported +dnl $2 = option for checking attributes. By default, this is done when +dnl warnings are enabled. For other values: +dnl yes: always do this, e.g., to use in generated library-headers +dnl no: never do this +AC_DEFUN([CF_ENABLE_WARNINGS],[ +if test "$GCC" = yes || test "$GXX" = yes +then +CF_FIX_WARNINGS(CFLAGS) +CF_FIX_WARNINGS(CPPFLAGS) +CF_FIX_WARNINGS(LDFLAGS) +AC_MSG_CHECKING(if you want to turn on gcc warnings) +CF_ARG_ENABLE(warnings, + [ --enable-warnings test: turn on gcc compiler warnings], + [enable_warnings=yes], + [enable_warnings=no]) +AC_MSG_RESULT($enable_warnings) +if test "$enable_warnings" = "yes" +then + ifelse($2,,[CF_GCC_ATTRIBUTES]) + CF_GCC_WARNINGS($1) +fi +ifelse($2,yes,[CF_GCC_ATTRIBUTES]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ERRNO version: 5 updated: 1997/11/30 12:44:39 +dnl -------- +dnl Check if 'errno' is declared in +AC_DEFUN([CF_ERRNO], +[ +CF_CHECK_ERRNO(errno) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ETIP_DEFINES version: 7 updated: 2023/10/28 11:59:01 +dnl --------------- +dnl Test for conflicting definitions of exception in gcc 2.8.0, etc., between +dnl math.h and builtin.h, only for ncurses +AC_DEFUN([CF_ETIP_DEFINES], +[ +AC_MSG_CHECKING(for special defines needed for etip.h) +cf_save_CXXFLAGS="$CXXFLAGS" +cf_result="none" + +# etip.h includes ncurses.h which includes ncurses_dll.h +# But ncurses_dll.h is generated - fix here. +test -d include || mkdir include +test -f include/ncurses_dll.h || sed -e 's/@NCURSES_WRAP_PREFIX@/'$NCURSES_WRAP_PREFIX'/g' "${srcdir}/include/ncurses_dll.h.in" >include/ncurses_dll.h + +for cf_math in "" MATH_H +do +for cf_excp in "" MATH_EXCEPTION +do + CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu -Iinclude -I${srcdir}/include" + test -n "$cf_math" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_math}" + test -n "$cf_excp" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_excp}" +AC_TRY_COMPILE([ +#include +],[],[ + test -n "$cf_math" && AC_DEFINE_UNQUOTED(ETIP_NEEDS_${cf_math}) + test -n "$cf_excp" && AC_DEFINE_UNQUOTED(ETIP_NEEDS_${cf_excp}) + cf_result="$cf_math $cf_excp" + break 2 +],[]) +done +done +AC_MSG_RESULT([${cf_result:-(none)}]) +CXXFLAGS="$cf_save_CXXFLAGS" +]) +dnl --------------------------------------------------------------------------- +dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42 +dnl --------------- +dnl Find a library (specifically the linkage used in the code fragment), +dnl searching for it if it is not already in the library path. +dnl See also CF_ADD_SEARCHPATH. +dnl +dnl Parameters (4-on are optional): +dnl $1 = headers for library entrypoint +dnl $2 = code fragment for library entrypoint +dnl $3 = the library name without the "-l" option or ".so" suffix. +dnl $4 = action to perform if successful (default: update CPPFLAGS, etc) +dnl $5 = action to perform if not successful +dnl $6 = module name, if not the same as the library name +dnl $7 = extra libraries +dnl +dnl Sets these variables: +dnl $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found +dnl $cf_cv_header_path_$3 - include-directory if needed +dnl $cf_cv_library_path_$3 - library-directory if needed +dnl $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3 +AC_DEFUN([CF_FIND_LINKAGE],[ + +# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these +# will be set on completion of the AC_TRY_LINK below. +cf_cv_header_path_$3= +cf_cv_library_path_$3= + +CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)]) + +cf_save_LIBS="$LIBS" + +AC_TRY_LINK([$1],[$2],[ + cf_cv_find_linkage_$3=yes + cf_cv_header_path_$3=/usr/include + cf_cv_library_path_$3=/usr/lib +],[ + +LIBS="-l$3 $7 $cf_save_LIBS" + +AC_TRY_LINK([$1],[$2],[ + cf_cv_find_linkage_$3=yes + cf_cv_header_path_$3=/usr/include + cf_cv_library_path_$3=/usr/lib + cf_cv_library_file_$3="-l$3" +],[ + cf_cv_find_linkage_$3=no + LIBS="$cf_save_LIBS" + + CF_VERBOSE(find linkage for $3 library) + CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)]) + + cf_save_CPPFLAGS="$CPPFLAGS" + cf_test_CPPFLAGS="$CPPFLAGS" + + CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6])) + for cf_cv_header_path_$3 in $cf_search + do + if test -d "$cf_cv_header_path_$3" ; then + CF_VERBOSE(... testing $cf_cv_header_path_$3) + CPPFLAGS="$cf_save_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3) + AC_TRY_COMPILE([$1],[$2],[ + CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3) + cf_cv_find_linkage_$3=maybe + cf_test_CPPFLAGS="$CPPFLAGS" + break],[ + CPPFLAGS="$cf_save_CPPFLAGS" + ]) + fi + done + + if test "$cf_cv_find_linkage_$3" = maybe ; then + + CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)]) + + cf_save_LIBS="$LIBS" + cf_save_LDFLAGS="$LDFLAGS" + + ifelse([$6],,,[ + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-l$3 $7 $cf_save_LIBS" + AC_TRY_LINK([$1],[$2],[ + CF_VERBOSE(... found $3 library in system) + cf_cv_find_linkage_$3=yes]) + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + ]) + + if test "$cf_cv_find_linkage_$3" != yes ; then + CF_LIBRARY_PATH(cf_search,$3) + for cf_cv_library_path_$3 in $cf_search + do + if test -d "$cf_cv_library_path_$3" ; then + CF_VERBOSE(... testing $cf_cv_library_path_$3) + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-l$3 $7 $cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3" + AC_TRY_LINK([$1],[$2],[ + CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3) + cf_cv_find_linkage_$3=yes + cf_cv_library_file_$3="-l$3" + break],[ + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS" + ]) + fi + done + CPPFLAGS="$cf_save_CPPFLAGS" + LDFLAGS="$cf_save_LDFLAGS" + fi + + else + cf_cv_find_linkage_$3=no + fi + ],$7) +]) + +LIBS="$cf_save_LIBS" + +if test "$cf_cv_find_linkage_$3" = yes ; then +ifelse([$4],,[ + CF_ADD_INCDIR($cf_cv_header_path_$3) + CF_ADD_LIBDIR($cf_cv_library_path_$3) + CF_ADD_LIB($3) +],[$4]) +else +ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIND_SUB_INCDIR version: 3 updated: 2021/01/01 13:31:04 +dnl ------------------ +dnl Find an include-directory with the given leaf-name. This is useful for +dnl example with FreeBSD ports, which use this convention to distinguish +dnl different versions of the same port. +AC_DEFUN([CF_FIND_SUB_INCDIR],[ + CF_SUBDIR_PATH(cf_search,$1,include) + for cf_item in $cf_search + do + case "$cf_item" in + (*/$1) + CF_ADD_INCDIR($cf_item) + ;; + esac + done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIND_SUB_LIBDIR version: 3 updated: 2021/01/01 13:31:04 +dnl ------------------ +dnl Find a library-directory with the given leaf-name. This is useful for +dnl example with FreeBSD ports, which use this convention to distinguish +dnl different versions of the same port. +AC_DEFUN([CF_FIND_SUB_LIBDIR],[ + CF_SUBDIR_PATH(cf_search,$1,lib) + for cf_item in $cf_search + do + case "$cf_item" in + (*/$1) + CF_ADD_LIBDIR($cf_item) + ;; + esac + done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIXUP_ADAFLAGS version: 2 updated: 2015/04/17 21:13:04 +dnl ----------------- +dnl make ADAFLAGS consistent with CFLAGS +AC_DEFUN([CF_FIXUP_ADAFLAGS],[ + AC_MSG_CHECKING(optimization options for ADAFLAGS) + case "$CFLAGS" in + (*-g*) + CF_ADD_ADAFLAGS(-g) + ;; + esac + case "$CFLAGS" in + (*-O*) + cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[[ ]].*//'` + CF_ADD_ADAFLAGS($cf_O_flag) + ;; + esac + AC_MSG_RESULT($ADAFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31 +dnl --------------- +dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc. Any of gcc's +dnl "-Werror" flags can interfere with configure-checks. Those go into +dnl EXTRA_CFLAGS. +dnl +dnl $1 = variable name to repair +define([CF_FIX_WARNINGS],[ +if test "$GCC" = yes || test "$GXX" = yes +then + case [$]$1 in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in [$]$1 + do + case "x$cf_temp_scan" in + (x-Werror=format*) + CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan) + ;; + (x-Werror=*) + CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan) + ;; + (*) + CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan) + ;; + esac + done + if test "x[$]$1" != "x$cf_temp_flags" + then + CF_VERBOSE(repairing $1: [$]$1) + $1="$cf_temp_flags" + CF_VERBOSE(... fixed [$]$1) + CF_VERBOSE(... extra $EXTRA_CFLAGS) + fi + ;; + esac +fi +AC_SUBST(EXTRA_CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FOPEN_BIN_R version: 3 updated: 2023/01/05 18:05:46 +dnl -------------- +dnl Check if fopen works when the "b" (binary) flag is added to the mode +dnl parameter. POSIX ignores the "b", which c89 specified. Some very old +dnl systems do not accept it. +AC_DEFUN([CF_FOPEN_BIN_R],[ +AC_CACHE_CHECK(if fopen accepts explicit binary mode,cf_cv_fopen_bin_r,[ + AC_TRY_RUN([ +$ac_includes_default + +int main(void) +{ + FILE *fp = fopen("conftest.tmp", "wb"); + int rc = 0; + if (fp != 0) { + int p, q; + for (p = 0; p < 256; ++p) { + fputc(p, fp); + } + fclose(fp); + fp = fopen("conftest.tmp", "rb"); + if (fp != 0) { + for (p = 0; p < 256; ++p) { + q = fgetc(fp); + if (q != p) { + rc = 1; + break; + } + } + } else { + rc = 1; + } + } else { + rc = 1; + } + ${cf_cv_main_return:-return} (rc); +} +], + [cf_cv_fopen_bin_r=yes], + [cf_cv_fopen_bin_r=no], + [cf_cv_fopen_bin_r=unknown]) +]) +test "x$cf_cv_fopen_bin_r" != xno && AC_DEFINE(USE_FOPEN_BIN_R,1,[Define to 1 if fopen accepts explicit binary mode]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FORGET_TOOL version: 1 updated: 2013/04/06 18:03:09 +dnl -------------- +dnl Forget that we saw the given tool. +AC_DEFUN([CF_FORGET_TOOL],[ +unset ac_cv_prog_ac_ct_$1 +unset ac_ct_$1 +unset $1 +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_DLSYM version: 4 updated: 2015/09/12 14:46:44 +dnl ------------- +dnl Test for dlsym() and related functions, as well as libdl. +dnl +dnl Sets +dnl $cf_have_dlsym +dnl $cf_have_libdl +AC_DEFUN([CF_FUNC_DLSYM],[ +cf_have_dlsym=no +AC_CHECK_FUNC(dlsym,cf_have_dlsym=yes,[ + +cf_have_libdl=no +AC_CHECK_LIB(dl,dlsym,[ + cf_have_dlsym=yes + cf_have_libdl=yes])]) + +if test "$cf_have_dlsym" = yes ; then + test "$cf_have_libdl" = yes && { CF_ADD_LIB(dl) } + + AC_MSG_CHECKING(whether able to link to dl*() functions) + AC_TRY_LINK([#include ],[ + void *obj; + if ((obj = dlopen("filename", 0)) != 0) { + if (dlsym(obj, "symbolname") == 0) { + dlclose(obj); + } + }],[ + AC_DEFINE(HAVE_LIBDL,1,[Define to 1 if we have dl library])],[ + AC_MSG_ERROR(Cannot link test program for libdl)]) + AC_MSG_RESULT(ok) +else + AC_MSG_ERROR(Cannot find dlsym function) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_GETTIME version: 3 updated: 2024/05/11 13:40:02 +dnl --------------- +dnl Check for gettimeofday or clock_gettime. In 2023, the former is still more +dnl widely supported, but "deprecated" (2008), so we will use the latter if it +dnl is available, to reduce compiler warnings. +AC_DEFUN([CF_FUNC_GETTIME],[ +cf_save_libs="$LIBS" +AC_CHECK_FUNC(clock_gettime, + cf_cv_test_clock_gettime=yes, + AC_CHECK_LIB(rt, clock_gettime, + [LIBS="-lrt $LIBS" + cf_cv_test_clock_gettime=yes], + cf_cv_test_clock_gettime=no)) + +if test "$cf_cv_test_clock_gettime" = yes ; then +AC_CACHE_CHECK(if clock_gettime links,cf_cv_func_clock_gettime,[ + AC_TRY_LINK([ +$ac_includes_default +#include + ], + [struct timespec ts; + int rc = clock_gettime(CLOCK_REALTIME, &ts) + + clock_gettime(CLOCK_MONOTONIC, &ts); + (void) rc; (void)ts], + [cf_cv_func_clock_gettime=yes], + [cf_cv_func_clock_gettime=no]) +]) +else + cf_cv_func_clock_gettime=no +fi + +if test "$cf_cv_func_clock_gettime" = yes +then + AC_DEFINE(HAVE_CLOCK_GETTIME,1,[Define to 1 if we have clock_gettime function]) +else +AC_CHECK_FUNC(gettimeofday, + AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]),[ + +AC_CHECK_LIB(bsd, gettimeofday, + AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]) + CF_ADD_LIB(bsd))])dnl CLIX: bzero, select, gettimeofday +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_GETTTYNAM version: 2 updated: 2023/01/05 18:06:28 +dnl ----------------- +dnl Check if the 4.3BSD function getttyname exists, as well as if +dnl defines the _PATH_TTYS symbol. If the corresponding file exists, but the +dnl other checks fail, just define HAVE_PATH_TTYS. +AC_DEFUN([CF_FUNC_GETTTYNAM],[ +AC_CACHE_CHECK(if _PATH_TTYS is defined in ttyent.h,cf_cv_PATH_TTYS,[ +AC_TRY_COMPILE([ +#include +#include ],[ +FILE *fp = fopen(_PATH_TTYS, "r"); (void)fp], + [cf_cv_PATH_TTYS=yes], + [cf_cv_PATH_TTYS=no])]) + +if test $cf_cv_PATH_TTYS = no +then + for cf_ttys in /etc/ttytype /etc/ttys + do + if test -f $cf_ttys + then + cf_cv_PATH_TTYS=maybe + AC_DEFINE(_PATH_TTYS,$cf_ttys,[define to pathname of file containing mapping from tty name to terminal type]) + break + fi + done +fi + +if test $cf_cv_PATH_TTYS != no +then + AC_CACHE_CHECK(if _PATH_TTYS file exists,cf_cv_have_PATH_TTYS,[ + AC_TRY_RUN([ +$ac_includes_default + +#include + +int main(void) { + FILE *fp = fopen(_PATH_TTYS, "r"); + ${cf_cv_main_return:-return} (fp == 0); +}], + [cf_cv_have_PATH_TTYS=yes], + [cf_cv_have_PATH_TTYS=no], + [cf_cv_have_PATH_TTYS=unknown])]) + test "$cf_cv_have_PATH_TTYS" = no && cf_cv_PATH_TTYS=no +fi + +if test $cf_cv_PATH_TTYS != no +then + AC_DEFINE(HAVE_PATH_TTYS,1,[define to 1 if system can map tty name to terminal type]) + AC_CACHE_CHECK(for getttynam,cf_cv_func_getttynam,[ + AC_TRY_LINK([#include ], + [struct ttyent *fp = getttynam("/dev/tty"); (void)fp], + [cf_cv_func_getttynam=yes], + [cf_cv_func_getttynam=no])]) + test "$cf_cv_func_getttynam" = yes && AC_DEFINE(HAVE_GETTTYNAM) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_MEMMOVE version: 10 updated: 2023/01/05 18:51:28 +dnl --------------- +dnl Check for memmove, or a bcopy that can handle overlapping copy. If neither +dnl is found, add our own version of memmove to the list of objects. +AC_DEFUN([CF_FUNC_MEMMOVE], +[ +AC_CHECK_FUNC(memmove,,[ +AC_CHECK_FUNC(bcopy,[ + AC_CACHE_CHECK(if bcopy does overlapping moves,cf_cv_good_bcopy,[ + AC_TRY_RUN([ +$ac_includes_default + +int main(void) { + static char data[] = "abcdefghijklmnopqrstuwwxyz"; + char temp[40]; + bcopy(data, temp, sizeof(data)); + bcopy(temp+10, temp, 15); + bcopy(temp+5, temp+15, 10); + ${cf_cv_main_return:-return} (strcmp(temp, "klmnopqrstuwwxypqrstuwwxyz")); +} + ], + [cf_cv_good_bcopy=yes], + [cf_cv_good_bcopy=no], + [cf_cv_good_bcopy=unknown]) + ]) + ],[cf_cv_good_bcopy=no]) + if test "$cf_cv_good_bcopy" = yes ; then + AC_DEFINE(USE_OK_BCOPY,1,[Define to 1 to use bcopy when memmove is unavailable]) + else + AC_DEFINE(USE_MY_MEMMOVE,1,[Define to 1 to use replacement function when memmove is unavailable]) + fi +])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_NANOSLEEP version: 6 updated: 2023/01/05 18:51:33 +dnl ----------------- +dnl Check for existence of workable nanosleep() function. Some systems, e.g., +dnl AIX 4.x, provide a non-working version. +AC_DEFUN([CF_FUNC_NANOSLEEP],[ +AC_CACHE_CHECK(if nanosleep really works,cf_cv_func_nanosleep,[ +AC_TRY_RUN([ +$ac_includes_default + +#include +#include + +#ifdef HAVE_SYS_TIME_H +#include +#endif + +int main(void) { + struct timespec ts1, ts2; + int code; + ts1.tv_sec = 0; + ts1.tv_nsec = 750000000; + ts2.tv_sec = 0; + ts2.tv_nsec = 0; + errno = 0; + code = nanosleep(&ts1, &ts2); /* on failure errno is ENOSYS. */ + ${cf_cv_main_return:-return}(code != 0); +} +], + [cf_cv_func_nanosleep=yes], + [cf_cv_func_nanosleep=no], + [cf_cv_func_nanosleep=unknown])]) + +test "$cf_cv_func_nanosleep" = "yes" && AC_DEFINE(HAVE_NANOSLEEP,1,[Define to 1 if we have nanosleep()]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_OPENPTY version: 7 updated: 2023/12/03 09:21:34 +dnl --------------- +dnl Check for openpty() function, along with header. It may need the +dnl "util" library as well. +AC_DEFUN([CF_FUNC_OPENPTY], +[ +AC_CHECK_LIB(util,openpty,cf_cv_lib_util=yes,cf_cv_lib_util=no) +AC_CACHE_CHECK(for openpty header,cf_cv_func_openpty,[ + cf_save_LIBS="$LIBS" + test "$cf_cv_lib_util" = yes && { CF_ADD_LIB(util) } + for cf_header in pty.h libutil.h util.h + do + AC_TRY_LINK([ +#include <$cf_header> +],[ + int x = openpty((int *)0, (int *)0, (char *)0, + (struct termios *)0, (struct winsize *)0); + (void)x; +],[ + cf_cv_func_openpty=$cf_header + break +],[ + cf_cv_func_openpty=no +]) + done + LIBS="$cf_save_LIBS" +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_POLL version: 11 updated: 2023/01/05 18:51:40 +dnl ------------ +dnl See if the poll function really works. Some platforms have poll(), but +dnl it does not work for terminals or files. +AC_DEFUN([CF_FUNC_POLL],[ +tty >/dev/null 2>&1 || { AC_CHECK_FUNCS(posix_openpt) } +AC_CACHE_CHECK(if poll really works,cf_cv_working_poll,[ +AC_TRY_RUN([ +$ac_includes_default + +#include + +#ifdef HAVE_POLL_H +#include +#else +#include +#endif + +int main(void) { + struct pollfd myfds; + int ret; + + /* check for Darwin bug with respect to "devices" */ + myfds.fd = open("/dev/null", 1); /* O_WRONLY */ + if (myfds.fd < 0) + myfds.fd = 0; + myfds.events = POLLIN; + myfds.revents = 0; + + ret = poll(&myfds, 1, 100); + + if (ret < 0 || (myfds.revents & POLLNVAL)) { + ret = -1; + } else { + int fd = 0; + if (!isatty(fd)) { + fd = open("/dev/tty", 2); /* O_RDWR */ + } +#ifdef HAVE_POSIX_OPENPT + if (fd < 0) { + fd = posix_openpt(O_RDWR); + } +#endif + + if (fd >= 0) { + /* also check with standard input */ + myfds.fd = fd; + myfds.events = POLLIN; + myfds.revents = 0; + ret = poll(&myfds, 1, 100); + } else { + ret = -1; + } + } + ${cf_cv_main_return:-return}(ret < 0); +}], + [cf_cv_working_poll=yes], + [cf_cv_working_poll=no], + [cf_cv_working_poll=unknown])]) +test "$cf_cv_working_poll" = "yes" && AC_DEFINE(HAVE_WORKING_POLL,1,[Define to 1 if the poll function seems to work]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_TERMIOS version: 3 updated: 2012/10/06 17:56:13 +dnl --------------- +dnl Some old/broken variations define tcgetattr() only as a macro in +dnl termio(s).h +AC_DEFUN([CF_FUNC_TERMIOS],[ +AC_REQUIRE([CF_STRUCT_TERMIOS]) +AC_CACHE_CHECK(for tcgetattr, cf_cv_have_tcgetattr,[ +AC_TRY_LINK([ +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_TERMIOS_H +#include +#define TTY struct termios +#else +#ifdef HAVE_TERMIO_H +#include +#define TTY struct termio +#endif +#endif +],[ +TTY foo; +tcgetattr(1, &foo);], +[cf_cv_have_tcgetattr=yes], +[cf_cv_have_tcgetattr=no])]) +test "$cf_cv_have_tcgetattr" = yes && AC_DEFINE(HAVE_TCGETATTR,1,[Define to 1 if we have tcgetattr]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_VSSCANF version: 8 updated: 2023/12/03 19:09:59 +dnl --------------- +dnl Check for vsscanf() function, which is in c9x but generally not in earlier +dnl versions of C. It can often be simulated by other functions on older +dnl systems (where FILE is not opaque). +AC_DEFUN([CF_FUNC_VSSCANF], +[ +AC_CACHE_CHECK(for vsscanf function or workaround,cf_cv_func_vsscanf,[ +AC_TRY_LINK([ +#include +#include + +static void +myfunc(const char *str, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsscanf(str, fmt, ap); + va_end(ap); +} +],[ + myfunc("55", "%d"); +],[cf_cv_func_vsscanf=vsscanf],[ +AC_TRY_LINK([ +#include +#include ],[ + FILE strbuf; + char *str = "from"; + + strbuf._flag = _IOREAD; + strbuf._ptr = strbuf._base = (unsigned char *) str; + strbuf._cnt = strlen(str); + strbuf._file = _NFILE; + return (vfscanf(&strbuf, "%d", ap))],[cf_cv_func_vsscanf=vfscanf],[ +AC_TRY_LINK([ +#include +#include ],[ + FILE strbuf; + char *str = "from"; + + strbuf._flag = _IOREAD; + strbuf._ptr = strbuf._base = (unsigned char *) str; + strbuf._cnt = strlen(str); + strbuf._file = _NFILE; + return (_doscan(&strbuf, "%d", ap))],[cf_cv_func_vsscanf=_doscan],[ +cf_cv_func_vsscanf=no])])])]) + +case "$cf_cv_func_vsscanf" in +(vsscanf) AC_DEFINE(HAVE_VSSCANF,1,[Define to 1 if we have vsscanf]);; +(vfscanf) AC_DEFINE(HAVE_VFSCANF,1,[Define to 1 if we have vfscanf]);; +(_doscan) AC_DEFINE(HAVE__DOSCAN,1,[Define to 1 if we have _doscan]);; +esac + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25 +dnl ----------------- +dnl Test for availability of useful gcc __attribute__ directives to quiet +dnl compiler warnings. Though useful, not all are supported -- and contrary +dnl to documentation, unrecognized directives cause older compilers to barf. +AC_DEFUN([CF_GCC_ATTRIBUTES], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([CF_C11_NORETURN])dnl + +if test "$GCC" = yes || test "$GXX" = yes +then +cat > conftest.i < "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + CF_UPPER(cf_ATTRIBUTE,$cf_attribute) + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&AC_FD_CC + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <>confdefs.h + case "$cf_attribute" in + (noreturn) + AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc]) + ;; + (printf) + cf_value='/* nothing */' + if test "$cf_printf_attribute" != no ; then + cf_value='__attribute__((format(printf,fmt,var)))' + AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc]) + ;; + (scanf) + cf_value='/* nothing */' + if test "$cf_scanf_attribute" != no ; then + cf_value='__attribute__((format(scanf,fmt,var)))' + AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc]) + ;; + (unused) + AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc]) + ;; + esac + fi + done +else + ${FGREP-fgrep} define conftest.i >>confdefs.h +fi +rm -rf ./conftest* +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_VERSION version: 9 updated: 2023/03/05 14:30:13 +dnl -------------- +dnl Find version of gcc, and (because icc/clang pretend to be gcc without being +dnl compatible), attempt to determine if icc/clang is actually used. +AC_DEFUN([CF_GCC_VERSION],[ +AC_REQUIRE([AC_PROG_CC]) +GCC_VERSION=none +if test "$GCC" = yes ; then + AC_MSG_CHECKING(version of $CC) + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^[[^(]]*([[^)]][[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + AC_MSG_RESULT($GCC_VERSION) +fi +CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS) +CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59 +dnl --------------- +dnl Check if the compiler supports useful warning options. There's a few that +dnl we don't use, simply because they're too noisy: +dnl +dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x) +dnl -Winline (usually not worthwhile) +dnl -Wredundant-decls (system headers make this too noisy) +dnl -Wtraditional (combines too many unrelated messages, only a few useful) +dnl -Wwrite-strings (too noisy, but should review occasionally). This +dnl is enabled for ncurses using "--enable-const". +dnl -pedantic +dnl +dnl Parameter: +dnl $1 is an optional list of gcc warning flags that a particular +dnl application might want to use, e.g., "no-unused" for +dnl -Wno-unused +dnl Special: +dnl If $with_ext_const is "yes", add a check for -Wwrite-strings +dnl +AC_DEFUN([CF_GCC_WARNINGS], +[ +AC_REQUIRE([CF_GCC_VERSION]) +if test "x$have_x" = xyes; then CF_CONST_X_STRING fi +cat > "conftest.$ac_ext" <], +[int x = optind; char *y = optarg; (void)x; (void)y], +[cf_cv_getopt_header=$cf_header + break]) +done +]) +if test "$cf_cv_getopt_header" != none ; then + AC_DEFINE(HAVE_GETOPT_HEADER,1,[Define to 1 if getopt variables are declared in header]) +fi +if test "$cf_cv_getopt_header" = getopt.h ; then + AC_DEFINE(NEED_GETOPT_H,1,[Define to 1 if we must include getopt.h]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GLOB_FULLPATH version: 2 updated: 2024/08/03 12:34:02 +dnl ---------------- +dnl Use this in case-statements to check for pathname syntax, i.e., absolute +dnl pathnames. The "x" is assumed since we provide an alternate form for DOS. +AC_DEFUN([CF_GLOB_FULLPATH],[ +AC_REQUIRE([CF_WITH_SYSTYPE])dnl +case "$cf_cv_system_name" in +(cygwin*|msys*|mingw32*|mingw64|os2*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER='[[a-zA-Z]]:[[\\/]]*' + ;; +(*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER=$GLOB_FULLPATH_POSIX + ;; +esac +AC_SUBST(GLOB_FULLPATH_POSIX) +AC_SUBST(GLOB_FULLPATH_OTHER) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNATPREP_OPT_T version: 1 updated: 2014/08/02 18:37:25 +dnl ----------------- +AC_DEFUN([CF_GNATPREP_OPT_T],[ +AC_CACHE_CHECK(if GNATPREP supports -T option,cf_cv_gnatprep_opt_t,[ +cf_cv_gnatprep_opt_t=no +gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes +]) +test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS" +AC_SUBST(GNATPREP_OPTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_GENERICS version: 7 updated: 2021/01/01 13:31:04 +dnl ---------------- +AC_DEFUN([CF_GNAT_GENERICS], +[ +AC_REQUIRE([CF_GNAT_VERSION]) + +AC_MSG_CHECKING(if GNAT supports generics) +case "$cf_cv_gnat_version" in +(3.1[[1-9]]*|3.[[2-9]]*|[[4-9]].*|[[1-9]][[0-9]].[[0-9]]*|20[[0-9]][[0-9]]) + cf_gnat_generics=yes + ;; +(*) + cf_gnat_generics=no + ;; +esac +AC_MSG_RESULT($cf_gnat_generics) + +if test "$cf_gnat_generics" = yes +then + cf_compile_generics=generics + cf_generic_objects="\${GENOBJS}" +else + cf_compile_generics= + cf_generic_objects= +fi + +AC_SUBST(cf_compile_generics) +AC_SUBST(cf_generic_objects) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_PROJECTS version: 13 updated: 2021/01/02 17:09:14 +dnl ---------------- +dnl GNAT projects are configured with ".gpr" project files. +dnl GNAT libraries are a further development, using the project feature. +AC_DEFUN([CF_GNAT_PROJECTS], +[ +AC_REQUIRE([CF_GNAT_VERSION]) +AC_REQUIRE([CF_DISABLE_GNAT_PROJECTS]) + +cf_gnat_libraries=no +cf_gnat_projects=no + +if test "$enable_gnat_projects" != no ; then +AC_MSG_CHECKING(if GNAT supports project files) +case "$cf_cv_gnat_version" in +(3.[[0-9]]*) + ;; +(*) + case "$cf_cv_system_name" in + (cygwin*|msys*) + ;; + (*) + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src conftest.bin conftest.lib + then + cd conftest.src + rm -rf ./conftest* ./*~conftest* + cat >>library.gpr <>confpackage.ads <>confpackage.adb <&AC_FD_CC 2>&1 ) ; then + cf_gnat_projects=yes + fi + cd .. + fi + if test -f conftest.lib/confpackage.ali + then + cf_gnat_libraries=yes + fi + rm -rf ./conftest* ./*~conftest* + ;; + esac + ;; +esac +AC_MSG_RESULT($cf_gnat_projects) +fi # enable_gnat_projects + +if test "$cf_gnat_projects" = yes +then + AC_MSG_CHECKING(if GNAT supports libraries) + AC_MSG_RESULT($cf_gnat_libraries) +fi + +USE_OLD_MAKERULES="" +USE_GNAT_PROJECTS="#" +USE_GNAT_MAKE_GPR="#" +USE_GNAT_GPRBUILD="#" + +if test "$cf_gnat_projects" = yes +then + USE_OLD_MAKERULES="#" + USE_GNAT_PROJECTS="" + if test "$cf_cv_VERSION_GPRBUILD" != no + then + USE_GNAT_GPRBUILD="" + elif test "$cf_cv_VERSION_GNATMAKE" != no + then + USE_GNAT_MAKE_GPR="" + else + AC_MSG_WARN(use old makefile rules since tools are missing) + fi +fi + +if test "$cf_gnat_libraries" = yes +then + USE_GNAT_LIBRARIES="" +else + USE_GNAT_LIBRARIES="#" +fi + +AC_SUBST(USE_OLD_MAKERULES) +AC_SUBST(USE_GNAT_PROJECTS) +AC_SUBST(USE_GNAT_LIBRARIES) +AC_SUBST(USE_GNAT_MAKE_GPR) +AC_SUBST(USE_GNAT_GPRBUILD) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_SIGINT version: 2 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Check if gnat supports SIGINT, and presumably tasking. For the latter, it +dnl is noted that gnat may compile a tasking unit even for configurations which +dnl fail at runtime. +AC_DEFUN([CF_GNAT_SIGINT],[ +AC_CACHE_CHECK(if GNAT supports SIGINT,cf_cv_gnat_sigint,[ +CF_GNAT_TRY_LINK([with Ada.Interrupts.Names; + +package ConfTest is + + pragma Warnings (Off); -- the next pragma exists since 3.11p + pragma Unreserve_All_Interrupts; + pragma Warnings (On); + + protected Process is + procedure Stop; + function Continue return Boolean; + pragma Attach_Handler (Stop, Ada.Interrupts.Names.SIGINT); + private + Done : Boolean := False; + end Process; + +end ConfTest;], +[package body ConfTest is + protected body Process is + procedure Stop is + begin + Done := True; + end Stop; + function Continue return Boolean is + begin + return not Done; + end Continue; + end Process; +end ConfTest;], + [cf_cv_gnat_sigint=yes], + [cf_cv_gnat_sigint=no])]) + +if test "$cf_cv_gnat_sigint" = yes ; then + USE_GNAT_SIGINT="" +else + USE_GNAT_SIGINT="#" +fi +AC_SUBST(USE_GNAT_SIGINT) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_TRY_LINK version: 4 updated: 2021/01/01 13:31:04 +dnl ---------------- +dnl Verify that a test program compiles/links with GNAT. +dnl $cf_ada_make is set to the program that compiles/links +dnl $ADAFLAGS may be set to the GNAT flags. +dnl +dnl $1 is the text of the spec +dnl $2 is the text of the body +dnl $3 is the shell command to execute if successful +dnl $4 is the shell command to execute if not successful +AC_DEFUN([CF_GNAT_TRY_LINK], +[ +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&AC_FD_CC 2>&1 ) ; then +ifelse($3,, :,[ $3]) +ifelse($4,,,[else + $4]) +fi +rm -rf ./conftest* ./*~conftest* +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_TRY_RUN version: 6 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Verify that a test program compiles and runs with GNAT +dnl $cf_ada_make is set to the program that compiles/links +dnl $ADAFLAGS may be set to the GNAT flags. +dnl +dnl $1 is the text of the spec +dnl $2 is the text of the body +dnl $3 is the shell command to execute if successful +dnl $4 is the shell command to execute if not successful +AC_DEFUN([CF_GNAT_TRY_RUN], +[ +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&AC_FD_CC 2>&1 ) ; then + if ( ./conftest 1>&AC_FD_CC 2>&1 ) ; then +ifelse($3,, :,[ $3]) +ifelse($4,,,[ else + $4]) + fi +ifelse($4,,,[else + $4]) +fi +rm -rf ./conftest* ./*~conftest* +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNAT_VERSION version: 22 updated: 2019/12/31 08:53:54 +dnl --------------- +dnl $1 = cache variable to update +dnl $2 = program name +dnl Verify version of GNAT or related tool +AC_DEFUN([CF_GNAT_VERSION], +[ +AC_CACHE_CHECK(for ifelse($2,,gnat,$2) version, cf_cv_gnat_version,[ +cf_cv_gnat_version=`ifelse($2,,${cf_ada_make:-gnatmake},$2) --version 2>&1 | \ + grep '[[0-9]].[[0-9]][[0-9]]*' |\ + sed -e '2,$d' -e 's/[[^0-9 \.]]//g' -e 's/^[[ ]]*//' -e 's/ .*//'` +]) +test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no +ifelse($1,,,[eval $1=$cf_cv_gnat_version; unset cf_cv_gnat_version]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41 +dnl ------------- +dnl Check if we must define _GNU_SOURCE to get a reasonable value for +dnl _XOPEN_SOURCE, upon which many POSIX definitions depend. This is a defect +dnl (or misfeature) of glibc2, which breaks portability of many applications, +dnl since it is interwoven with GNU extensions. +dnl +dnl Well, yes we could work around it... +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +AC_DEFUN([CF_GNU_SOURCE], +[ +cf_gnu_xopen_source=ifelse($1,,500,$1) + +AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[ +AC_TRY_COMPILE([#include ],[ + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif], + [cf_cv_gnu_library=yes], + [cf_cv_gnu_library=no]) +]) + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[ + cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + AC_TRY_COMPILE([#include ],[ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif], + [cf_cv_gnu_library_219=yes], + [cf_cv_gnu_library_219=no]) + CPPFLAGS="$cf_save" + ]) + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[ + CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source) + AC_TRY_COMPILE([ + #include + #include + ],[ + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif], + [cf_cv_gnu_dftsrc_219=yes], + [cf_cv_gnu_dftsrc_219=no]) + ]) + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[ + AC_TRY_COMPILE([#include ],[ + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif], + [cf_cv_gnu_source=no], + [cf_save="$CPPFLAGS" + CF_ADD_CFLAGS(-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif], + [cf_cv_gnu_source=no], + [cf_cv_gnu_source=yes]) + CPPFLAGS="$cf_save" + ]) + ]) + + if test "$cf_cv_gnu_source" = yes + then + AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[ + CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif], + [cf_cv_default_source=no], + [cf_cv_default_source=yes]) + ]) + if test "$cf_cv_default_source" = yes + then + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + fi + fi + fi + +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GPP_LIBRARY version: 13 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl If we're trying to use g++, test if libg++ is installed (a rather common +dnl problem :-). If we have the compiler but no library, we'll be able to +dnl configure, but won't be able to build the c++ demo program. +AC_DEFUN([CF_GPP_LIBRARY], +[ +cf_cxx_library=unknown +case "$cf_cv_system_name" in +(os2*) + cf_gpp_libname=gpp + ;; +(*) + cf_gpp_libname=g++ + ;; +esac +if test "$GXX" = yes; then + AC_MSG_CHECKING([for lib$cf_gpp_libname]) + cf_save="$LIBS" + CF_ADD_LIB($cf_gpp_libname) + AC_TRY_LINK([ +#include <$cf_gpp_libname/builtin.h> + ], + [two_arg_error_handler_t foo2 = lib_error_handler], + [cf_cxx_library=yes + CF_ADD_LIB($cf_gpp_libname,CXXLIBS) + if test "$cf_gpp_libname" = cpp ; then + AC_DEFINE(HAVE_GPP_BUILTIN_H,1,[Define to 1 if we have gpp builtin.h]) + else + AC_DEFINE(HAVE_GXX_BUILTIN_H,1,[Define to 1 if we have g++ builtin.h]) + fi], + [AC_TRY_LINK([ +#include + ], + [two_arg_error_handler_t foo2 = lib_error_handler], + [cf_cxx_library=yes + CF_ADD_LIB($cf_gpp_libname,CXXLIBS) + AC_DEFINE(HAVE_BUILTIN_H,1,[Define to 1 if we have builtin.h])], + [cf_cxx_library=no])]) + LIBS="$cf_save" + AC_MSG_RESULT($cf_cxx_library) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GXX_VERSION version: 9 updated: 2023/03/05 14:30:13 +dnl -------------- +dnl Check for version of g++ +AC_DEFUN([CF_GXX_VERSION],[ +AC_REQUIRE([AC_PROG_CPP]) +GXX_VERSION=none +if test "$GXX" = yes; then + AC_MSG_CHECKING(version of ${CXX:-g++}) + GXX_VERSION="`${CXX:-g++} --version 2>/dev/null | sed -e '2,$d' -e 's/^[[^(]]*([[^)]][[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + if test -z "$GXX_VERSION" + then + GXX_VERSION=unknown + GXX=no + fi + AC_MSG_RESULT($GXX_VERSION) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GXX_WARNINGS version: 11 updated: 2021/01/08 16:50:55 +dnl --------------- +dnl Check if the compiler supports useful warning options. +dnl +dnl Most of gcc's options apply to g++, except: +dnl -Wbad-function-cast +dnl -Wmissing-declarations +dnl -Wnested-externs +dnl +dnl Omit a few (for now): +dnl -Winline +dnl +dnl Parameter: +dnl $1 is an optional list of g++ warning flags that a particular +dnl application might want to use, e.g., "no-unused" for +dnl -Wno-unused +dnl Special: +dnl If $with_ext_const is "yes", add a check for -Wwrite-strings +dnl +AC_DEFUN([CF_GXX_WARNINGS], +[ + +CF_INTEL_COMPILER(GXX,INTEL_CPLUSPLUS,CXXFLAGS) +CF_CLANG_COMPILER(GXX,CLANG_CPLUSPLUS,CXXFLAGS) + +AC_REQUIRE([CF_GXX_VERSION]) + +AC_LANG_SAVE +AC_LANG_CPLUSPLUS + +cat > conftest.$ac_ext < +],[ + char *path = "/tmp/foo"; +#ifdef DB_VERSION_MAJOR +#if DB_VERSION_MAJOR >= 4 + DB *result = 0; + db_create(&result, NULL, 0); + result->open(result, + NULL, + path, + path, + DB_HASH, + DB_CREATE, + 0644); +#elif DB_VERSION_MAJOR >= 3 + DB *result = 0; + db_create(&result, NULL, 0); + result->open(result, + path, + path, + DB_HASH, + DB_CREATE, + 0644); +#elif DB_VERSION_MAJOR >= 2 + DB *result = 0; + db_open(path, + DB_HASH, + DB_CREATE, + 0644, + (DB_ENV *) 0, + (DB_INFO *) 0, + &result); +#endif /* DB_VERSION_MAJOR */ +#else + DB *result = dbopen(path, + 2, + 0644, + DB_HASH, + 0); +#endif + ${cf_cv_main_return:-return}(result != 0) +],[ + if test -n "$cf_db_libs" ; then + cf_cv_hashed_db_libs=$cf_db_libs + else + cf_cv_hashed_db_libs=default + fi + LIBS="$cf_save_libs" + break +]) + LIBS="$cf_save_libs" +done +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HASHED_DB_VERSION version: 5 updated: 2023/02/18 17:41:25 +dnl -------------------- +dnl Given that we have the header file for hashed database, find the version +dnl information. +AC_DEFUN([CF_HASHED_DB_VERSION], +[ +AC_CACHE_CHECK(for version of db, cf_cv_hashed_db_version,[ +cf_cv_hashed_db_version=unknown + +for cf_db_version in 1 2 3 4 5 6 +do + CF_MSG_LOG(checking for db version $cf_db_version) + AC_TRY_COMPILE([ +$ac_includes_default +#include + +#ifdef DB_VERSION_MAJOR + /* db2 (DB_VERSION_MAJOR=2) has also DB_VERSION_MINOR, tested with 7 */ +#if $cf_db_version == DB_VERSION_MAJOR + /* ok */ +#else + #error $cf_db_version is not DB_VERSION_MAJOR +#endif +#else +#if $cf_db_version == 1 + /* ok: assuming this is DB 1.8.5 */ +#else + #error $cf_db_version is not 1 +#endif +#endif +],[DBT *foo = 0],[ + cf_cv_hashed_db_version=$cf_db_version + break + ]) +done +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Construct a search-list of directories for a nonstandard header-file +dnl +dnl Parameters +dnl $1 = the variable to return as result +dnl $2 = the package name +AC_DEFUN([CF_HEADER_PATH], +[ +$1= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE) + cf_header_path_list="$cf_header_path_list [$]$1" + ;; + esac + done +fi + +# add the variations for the package we are looking for +CF_SUBDIR_PATH($1,$2,include) + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && $1="[$]$1 $includedir" + test -d "$includedir/$2" && $1="[$]$1 $includedir/$2" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && $1="[$]$1 $oldincludedir" + test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2" +} + +$1="[$]$1 $cf_header_path_list" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54 +dnl --------------- +dnl Insert text into the help-message, for readability, from AC_ARG_WITH. +AC_DEFUN([CF_HELP_MESSAGE], +[CF_ACVERSION_CHECK(2.53,[],[ +AC_DIVERT_HELP($1)])dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INCLUDE_DIRS version: 10 updated: 2014/09/19 20:58:42 +dnl --------------- +dnl Construct the list of include-options according to whether we're building +dnl in the source directory or using '--srcdir=DIR' option. +AC_DEFUN([CF_INCLUDE_DIRS], +[ +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS" +fi +CPPFLAGS="-I../include $CPPFLAGS" +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir} $CPPFLAGS" +fi +CPPFLAGS="-I. $CPPFLAGS" +AC_SUBST(CPPFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPTS version: 3 updated: 2023/06/03 15:17:30 +dnl --------------- +dnl prompt for/fill-in useful install-program options +AC_DEFUN([CF_INSTALL_OPTS], +[ +CF_INSTALL_OPT_S +CF_INSTALL_OPT_P +CF_INSTALL_OPT_O +CF_INSTALL_OPT_STRIP_PROG +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_O version: 3 updated: 2020/12/31 20:19:42 +dnl ---------------- +dnl Almost all "install" programs default to the current user's ownership. +dnl Almost - MINIX is an exception. +AC_DEFUN([CF_INSTALL_OPT_O], +[ +AC_MSG_CHECKING(if install needs to be told about ownership) +case `$ac_config_guess` in +(*minix) + with_install_o=yes + ;; +(*) + with_install_o=no + ;; +esac + +AC_MSG_RESULT($with_install_o) +if test "x$with_install_o" = xyes +then + INSTALL_OPT_O="`id root|sed -e 's/uid=[[0-9]]*(/ -o /' -e 's/gid=[[0-9]]*(/ -g /' -e 's/ [[^=[:space:]]][[^=[:space:]]]*=.*/ /' -e 's/)//g'`" +else + INSTALL_OPT_O= +fi + +AC_SUBST(INSTALL_OPT_O) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_P version: 3 updated: 2021/01/01 13:31:04 +dnl ---------------- +dnl Some install-programs accept a "-p" option to preserve file modification +dnl timestamps. That can be useful as an install option, as well as a way to +dnl avoid the need for ranlib after copying a static archive. +AC_DEFUN([CF_INSTALL_OPT_P], +[ +: "${INSTALL:=install}" +AC_CACHE_CHECK(if install accepts -p option, cf_cv_install_p,[ + rm -rf ./conftest* + date >conftest.in + mkdir conftest.out + sleep 3 + if $INSTALL -p conftest.in conftest.out 2>/dev/null + then + if test -f conftest.out/conftest.in + then + test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \ + test conftest.out/conftest.in -nt conftest.in 2>conftest.err + if test -s conftest.err + then + cf_cv_install_p=no + else + cf_cv_install_p=yes + fi + else + cf_cv_install_p=no + fi + else + cf_cv_install_p=no + fi + rm -rf ./conftest* +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_S version: 3 updated: 2021/01/05 19:23:48 +dnl ---------------- +dnl By default, we should strip executables which are installed, but leave the +dnl ability to suppress that for unit-testing. +AC_DEFUN([CF_INSTALL_OPT_S], +[ +AC_MSG_CHECKING(if you want to install stripped executables) +CF_ARG_DISABLE(stripping, + [ --disable-stripping do not strip (debug info) installed executables], + [enable_stripping=no], + [enable_stripping=yes]) +AC_MSG_RESULT($enable_stripping) + +if test "$enable_stripping" = yes +then + INSTALL_OPT_S="-s" +else + INSTALL_OPT_S= +fi +AC_SUBST(INSTALL_OPT_S) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_STRIP_PROG version: 1 updated: 2023/06/03 15:17:30 +dnl ------------------------- +dnl Provide an option for overriding the strip program used in install "-s" +dnl +dnl coreutils install provides a --strip-program option +dnl FreeBSD uses STRIPBIN environment variable, while NetBSD and OpenBSD use +dnl STRIP environment variable. Other versions of install do not support this. +AC_DEFUN([CF_INSTALL_OPT_STRIP_PROG], +[ +AC_REQUIRE([CF_INSTALL_OPT_S]) +if test -n "$INSTALL_OPT_S" +then + AC_MSG_CHECKING(if you want to specify strip-program) + AC_ARG_WITH(strip-program, + [ --with-strip-program=XX specify program to use when stripping in install], + [with_strip_program=$withval], + [with_strip_program=no]) + AC_MSG_RESULT($with_strip_program) + if test "$with_strip_program" != no + then + AC_MSG_CHECKING(if strip-program is supported with this installer) + cf_install_program=`echo "$INSTALL" | sed -e 's%[[ ]]*[[ ]]-.%%'` + check_install_strip=no + if test -f "$cf_install_program" + then + check_install_version=`"$cf_install_program" --version 2>/dev/null | head -n 1 | grep coreutils` + if test -n "$check_install_version" + then + check_install_strip="option" + else + for check_strip_variable in STRIPBIN STRIP + do + if strings "$cf_install_program" | grep "^$check_strip_variable[$]" >/dev/null + then + check_install_strip="environ" + break + fi + done + fi + fi + AC_MSG_RESULT($check_install_strip) + case "$check_install_strip" in + (no) + AC_MSG_WARN($cf_install_program does not support strip program option) + with_strip_program=no + ;; + (environ) + cat >install.tmp <<-CF_EOF + #! $SHELL + STRIPBIN="$with_strip_program" \\ + STRIP="$with_strip_program" \\ + $INSTALL "[$]@" + CF_EOF + INSTALL="`pwd`/install.tmp" + chmod +x "$INSTALL" + CF_VERBOSE(created $INSTALL) + ;; + (option) + INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" + ;; + esac + fi +fi +AC_SUBST(INSTALL_OPT_S) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_PREFIX version: 1 updated: 2024/08/10 20:16:32 +dnl ----------------- +dnl Special option for use by system-builders: the install-prefix is used to +dnl adjust the location into which the actual install is done, so that an +dnl archive can be built without modifying the host system's configuration. +AC_DEFUN([CF_INSTALL_PREFIX],[ +AC_MSG_CHECKING(for an installation directory prefix) +AC_ARG_WITH(install-prefix, + [ --with-install-prefix=DESTDIR use DESTDIR as installation directory prefix], + [case "x$withval" in + (xyes|xno) + ;; + (*) DESTDIR="$withval" + ;; + esac]) +AC_MSG_RESULT([${DESTDIR:-(none)}]) +AC_SUBST(DESTDIR) + +AC_MSG_CHECKING(if installation directory prefix should be merged) +CF_ARG_ENABLE(install-prefix, + [ --enable-install-prefix merge DESTDIR with installation prefix], + cf_install_prefix=yes, + cf_install_prefix=no) +AC_MSG_RESULT($cf_install_prefix) + +if test "$cf_install_prefix" = yes ; then + MERGE_PREFIX=':$(prefix)%=%' +else + MERGE_PREFIX='' +fi + +AC_SUBST(MERGE_PREFIX) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INTEL_COMPILER version: 9 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Check if the given compiler is really the Intel compiler for Linux. It +dnl tries to imitate gcc, but does not return an error when it finds a mismatch +dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_INTEL_COMPILER],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +ifelse([$2],,INTEL_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + case "$host_os" in + (linux*|gnu*) + AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc" + AC_TRY_COMPILE([],[ +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif +],[ifelse([$2],,INTEL_COMPILER,[$2])=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2])) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ISASCII version: 5 updated: 2023/12/03 09:21:34 +dnl ---------- +dnl Check if we have either a function or macro for 'isascii()'. +AC_DEFUN([CF_ISASCII], +[ +AC_MSG_CHECKING(for isascii) +AC_CACHE_VAL(cf_cv_have_isascii,[ + AC_TRY_LINK([#include ],[int x = isascii(' '); (void)x], + [cf_cv_have_isascii=yes], + [cf_cv_have_isascii=no]) +])dnl +AC_MSG_RESULT($cf_cv_have_isascii) +test "$cf_cv_have_isascii" = yes && AC_DEFINE(HAVE_ISASCII,1,[Define to 1 if we have isascii()]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LARGEFILE version: 13 updated: 2023/12/03 19:09:59 +dnl ------------ +dnl Add checks for large file support. +AC_DEFUN([CF_LARGEFILE],[ +ifdef([AC_FUNC_FSEEKO],[ + AC_SYS_LARGEFILE + if test "$enable_largefile" != no ; then + AC_FUNC_FSEEKO + + # Normally we would collect these definitions in the config.h, + # but (like _XOPEN_SOURCE), some environments rely on having these + # defined before any of the system headers are included. Another + # case comes up with C++, e.g., on AIX the compiler compiles the + # header files by themselves before looking at the body files it is + # told to compile. For ncurses, those header files do not include + # the config.h + if test "$ac_cv_sys_large_files" != no + then + CF_APPEND_TEXT(CPPFLAGS,-D_LARGE_FILES) + fi + if test "$ac_cv_sys_largefile_source" != no + then + CF_APPEND_TEXT(CPPFLAGS,-D_LARGEFILE_SOURCE) + fi + if test "$ac_cv_sys_file_offset_bits" != no + then + CF_APPEND_TEXT(CPPFLAGS,-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits) + fi + + AC_CACHE_CHECK(whether to use struct dirent64, cf_cv_struct_dirent64,[ + AC_TRY_COMPILE([ +#pragma GCC diagnostic error "-Wincompatible-pointer-types" +#include +#include + +#ifndef __REDIRECT +/* if transitional largefile support is setup, this is true */ +extern struct dirent64 * readdir(DIR *); +#endif + ],[ + DIR *dp = opendir("."); + struct dirent64 *x = readdir(dp); + struct dirent *y = readdir(dp); + int z = x - y; + (void)z; + ], + [cf_cv_struct_dirent64=yes], + [cf_cv_struct_dirent64=no]) + ]) + test "$cf_cv_struct_dirent64" = yes && AC_DEFINE(HAVE_STRUCT_DIRENT64,1,[Define to 1 if we have struct dirent64]) + fi +]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_LDFLAGS_STATIC version: 14 updated: 2021/01/02 17:09:14 +dnl ----------------- +dnl Check for compiler/linker flags used to temporarily force usage of static +dnl libraries. This depends on the compiler and platform. Use this to help +dnl ensure that the linker picks up a given library based on its position in +dnl the list of linker options and libraries. +AC_DEFUN([CF_LDFLAGS_STATIC],[ + +if test "$GCC" = yes ; then + case "$cf_cv_system_name" in + (OS/2*|os2*|aix[[4]]*|solaris2.1[[0-9]]|darwin*) + LDFLAGS_STATIC= + LDFLAGS_SHARED= + ;; + (*) # normally, except when broken + LDFLAGS_STATIC=-static + LDFLAGS_SHARED=-dynamic + ;; + esac +else + case "$cf_cv_system_name" in + (aix[[4-7]]*) # from ld manpage + LDFLAGS_STATIC=-bstatic + LDFLAGS_SHARED=-bdynamic + ;; + (hpux*) # from ld manpage for hpux10.20, hpux11.11 + # We could also use just "archive" and "shared". + LDFLAGS_STATIC=-Wl,-a,archive_shared + LDFLAGS_SHARED=-Wl,-a,shared_archive + ;; + (irix*) # from ld manpage IRIX64 + LDFLAGS_STATIC=-Bstatic + LDFLAGS_SHARED=-Bdynamic + ;; + (osf[[45]]*) # from ld manpage osf4.0d, osf5.1 + # alternative "-oldstyle_liblookup" (not in cc manpage) + LDFLAGS_STATIC=-noso + LDFLAGS_SHARED=-so_archive + ;; + (solaris2*) + LDFLAGS_STATIC=-Bstatic + LDFLAGS_SHARED=-Bdynamic + ;; + esac +fi + +if test -n "$LDFLAGS_STATIC" && test -n "$LDFLAGS_SHARED" +then + AC_MSG_CHECKING(if linker supports switching between static/dynamic) + + rm -f libconftest.a + cat >conftest.$ac_ext < +int cf_ldflags_static(FILE *fp) { return fflush(fp); } +EOF + if AC_TRY_EVAL(ac_compile) ; then + ( $AR $ARFLAGS libconftest.a conftest.o ) 2>&AC_FD_CC 1>/dev/null + ( eval $RANLIB libconftest.a ) 2>&AC_FD_CC >/dev/null + fi + rm -f conftest.* + + cf_save_LIBS="$LIBS" + + LIBS="$LDFLAGS_STATIC -L`pwd` -lconftest $LDFLAGS_DYNAMIC $LIBS" + AC_TRY_LINK([ +#line __oline__ "configure" +#include +int cf_ldflags_static(FILE *fp); +],[ + return cf_ldflags_static(stdin); +],[ + # some linkers simply ignore the -dynamic + case x`file "conftest$ac_exeext" 2>/dev/null` in + (*static*) + cf_ldflags_static=no + ;; + (*) + cf_ldflags_static=yes + ;; + esac +],[cf_ldflags_static=no]) + + rm -f libconftest.* + LIBS="$cf_save_LIBS" + + AC_MSG_RESULT($cf_ldflags_static) + + if test "$cf_ldflags_static" != yes + then + LDFLAGS_STATIC= + LDFLAGS_SHARED= + fi +else + LDFLAGS_STATIC= + LDFLAGS_SHARED= +fi + +AC_SUBST(LDFLAGS_STATIC) +AC_SUBST(LDFLAGS_SHARED) +]) +dnl --------------------------------------------------------------------------- +dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl For the given system and compiler, find the compiler flags to pass to the +dnl loader to use the "rpath" feature. +AC_DEFUN([CF_LD_RPATH_OPT], +[ +AC_REQUIRE([CF_CHECK_CACHE]) + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + AC_MSG_CHECKING(for an rpath option) + case "$cf_cv_system_name" in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[[2-9]].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + AC_MSG_RESULT($LD_RPATH_OPT) + + case "x$LD_RPATH_OPT" in + (x-R*) + AC_MSG_CHECKING(if we need a space after rpath option) + cf_save_LIBS="$LIBS" + CF_ADD_LIBS(${LD_RPATH_OPT}$libdir) + AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes) + LIBS="$cf_save_LIBS" + AC_MSG_RESULT($cf_rpath_space) + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LD_SEARCHPATH version: 4 updated: 2022/08/27 15:43:08 +dnl ---------------- +dnl Try to obtain the linker's search-path, for use in scripts. +dnl +dnl Ignore LD_LIBRARY_PATH, etc. +AC_DEFUN([CF_LD_SEARCHPATH],[ +AC_CACHE_CHECK(for linker search path,cf_cv_ld_searchpath,[ + +if test "$cross_compiling" != yes ; then + +# GNU binutils' ld does not involve permissions which may stop ldconfig. +cf_pathlist=`${LD:-ld} --verbose 2>/dev/null | grep SEARCH_DIR | sed -e 's,SEARCH_DIR[[("=]][[("=]]*,,g' -e 's/"[[)]];//gp' | sort -u` + +# The -NX options tell newer versions of Linux ldconfig to not attempt to +# update the cache, which makes it run faster. +test -z "$cf_pathlist" && \ + cf_pathlist=`(ldconfig -NX -v) 2>/dev/null | sed -e '/^[[ ]]/d' -e 's/:$//' | sort -u` + +test -z "$cf_pathlist" && + cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e '/^[[ ]]/d' -e 's/:$//p' | sort -u` + +# This works with OpenBSD 6.5, which lists only filenames +test -z "$cf_pathlist" && + cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e 's,^Adding \(.*\)/.*[$],\1,p' | sort -u` + +if test -z "$cf_pathlist" +then + # dyld default path with MacOS + if test -f /usr/bin/otool && test "x`uname -s`" = xDarwin + then + # do this to bypass check + cf_cv_ld_searchpath='$HOME/lib' + cf_pathlist="/usr/local/lib /lib /usr/lib" + fi +fi + +if test -z "$cf_pathlist" +then + # Solaris is "SunOS" + if test -f /usr/bin/isainfo && test "x`uname -s`" = xSunOS + then + case x`(isainfo -b)` in + (x64) + cf_pathlist="$cf_pathlist /lib/64 /usr/lib/64" + ;; + (x32) + test -d /usr/ccs/lib && cf_pathlist="$cf_pathlist /usr/ccs/lib" + cf_pathlist="$cf_pathlist /lib /usr/lib" + ;; + (*) + AC_MSG_WARN(problem with Solaris architecture) + ;; + esac + fi +fi + +if test -z "$cf_pathlist" +then + # HP-UX + if test x"`uname -s`" = xHP-UX + then + case x`getconf LONG_BIT` in + (x64) + cf_pathlist="/usr/lib/hpux64" + ;; + (x*) + cf_pathlist="/usr/lib/hpux32" + ;; + esac + fi +fi + +fi + +# If nothing else, assume it is conventional +test -z "$cf_pathlist" && cf_pathlist="/usr/lib /lib" + +# Finally, check that this is only directories +for cf_path in [$]0 $cf_pathlist +do + if test -d "$cf_path"; then + test -n "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath="${cf_cv_ld_searchpath} " + cf_cv_ld_searchpath="${cf_cv_ld_searchpath}${cf_path}" + fi +done + +# Ensure that it is nonempty +test -z "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath=/usr/lib +]) + +LD_SEARCHPATH=`echo "$cf_cv_ld_searchpath"|sed -e 's/ /|/g'` +AC_SUBST(LD_SEARCHPATH) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Construct a search-list of directories for a nonstandard library-file +dnl +dnl Parameters +dnl $1 = the variable to return as result +dnl $2 = the package name +AC_DEFUN([CF_LIBRARY_PATH], +[ +$1= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE) + cf_library_path_list="$cf_library_path_list [$]$1" + ;; + esac + done +fi + +CF_SUBDIR_PATH($1,$2,lib) + +$1="$cf_library_path_list [$]$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIBTOOL_VERSION version: 2 updated: 2024/06/12 04:19:01 +dnl ------------------ +AC_DEFUN([CF_LIBTOOL_VERSION],[ +ifdef([LT_PACKAGE_VERSION],[ + cf_cv_libtool_version=LT_PACKAGE_VERSION +],[ +if test -n "$LIBTOOL" && test "$LIBTOOL" != none +then + cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([[^)]]*)//g' -e 's/^[[^1-9]]*//' -e 's/[[^0-9.]].*//'` +else + cf_cv_libtool_version= +fi +test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version +])dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_PREFIX version: 14 updated: 2021/01/01 13:31:04 +dnl ------------- +dnl Compute the library-prefix for the given host system +dnl $1 = variable to set +define([CF_LIB_PREFIX], +[ + case "$cf_cv_system_name" in + (OS/2*|os2*) + if test "$DFT_LWR_MODEL" = libtool; then + LIB_PREFIX='lib' + else + LIB_PREFIX='' + fi + ;; + (*-msvc*) + LIB_PREFIX='' + ;; + (*) LIB_PREFIX='lib' + ;; + esac +ifelse($1,,,[$1=$LIB_PREFIX]) + AC_SUBST(LIB_PREFIX) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_RULES version: 101 updated: 2024/08/03 13:08:58 +dnl ------------ +dnl Append definitions and rules for the given models to the subdirectory +dnl Makefiles, and the recursion rule for the top-level Makefile. If the +dnl subdirectory is a library-source directory, modify the Libs_To_Make list in +dnl the corresponding makefile to list the models that we'll generate. +dnl +dnl For shared libraries, make a list of symbolic links to construct when +dnl generating each library. The convention used for Linux is the simplest +dnl one: +dnl lib.so -> +dnl lib.so. -> +dnl lib.so.. +dnl +dnl Note: Libs_To_Make is mixed case, since it is not a pure autoconf variable. +AC_DEFUN([CF_LIB_RULES], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([CF_MAKE_PHONY])dnl +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +cf_prefix=$LIB_PREFIX +AC_REQUIRE([CF_SUBST_NCURSES_VERSION]) + +case "$cf_cv_shlib_version" in +(cygdll|msysdll|mingw|msvcdll) + TINFO_NAME=$TINFO_ARG_SUFFIX + TINFO_SUFFIX=.dll + ;; +esac + +if test -n "$TINFO_SUFFIX" ; then + case "$TINFO_SUFFIX" in + (tw*) + TINFO_NAME="${TINFO_NAME}tw${EXTRA_SUFFIX}" + TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^tw'$EXTRA_SUFFIX'//'` + ;; + (t*) + TINFO_NAME="${TINFO_NAME}t${EXTRA_SUFFIX}" + TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^t'$EXTRA_SUFFIX'//'` + ;; + (w*) + TINFO_NAME="${TINFO_NAME}w${EXTRA_SUFFIX}" + TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^w'$EXTRA_SUFFIX'//'` + ;; + esac +fi + +for cf_dir in $SRC_SUBDIRS +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + elif test -f "$srcdir/$cf_dir/modules" ; then + + SHARED_LIB= + Libs_To_Make= + cf_awk_program= + if test -n "${cf_cv_abi_default}" && test "x${cf_cv_abi_default}" != "x5" + then + cf_awk_program="$cf_awk_program\ +/deprecated in ABI${cf_cv_abi_default}/ { next; }\ +{ sub(\"NCURSES([[WT]]+)?\", \"&${cf_cv_abi_default}\"); }\ +" + fi + + if test "x$WILDCARD_SYMS" = xno + then + cf_awk_program="$cf_awk_program\ +/[[ ]]_\\*;/ { skip=1; next; }\ +" + fi + + if test "x$cf_awk_program" != "x" + then + cat >>$cf_dir/Makefile <\[$]@ + +distclean:: + rm -f resulting.map +CF_EOF + fi + + for cf_item in $cf_LIST_MODELS + do + CF_LIB_SUFFIX($cf_item,cf_suffix,cf_depsuf) + if test "$cf_dir" = "c++" + then + CF_MAP_LIB_BASENAME(cf_libname,cxx) + else + CF_MAP_LIB_BASENAME(cf_libname,$cf_dir) + fi + test -z "$cf_libname" && cf_libname="$cf_dir" + if test "$cf_item" = shared ; then + if test -n "${LIB_SUFFIX}" + then + cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'` + else + cf_shared_suffix="$cf_suffix" + fi + if test "$cf_cv_do_symlinks" = yes ; then + cf_version_name= + + case "$cf_cv_shlib_version" in + (rel) + cf_version_name=REL_VERSION + ;; + (abi) + cf_version_name=ABI_VERSION + ;; + esac + + if test -n "$cf_version_name" + then + case "$cf_cv_system_name" in + (darwin*) + # "w", etc? + cf_suffix="${USE_LIB_SUFFIX}"'.${'$cf_version_name'}'"$cf_shared_suffix" + ;; + (*) + cf_suffix="$cf_suffix"'.${'$cf_version_name'}' + ;; + esac + fi + if test -n "${USE_LIB_SUFFIX}" + then + cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'` + else + cf_shared_suffix="$cf_suffix" + fi + fi + # cygwin needs import library, and has unique naming convention + # use autodetected ${cf_prefix} for import lib and static lib, but + # use 'cyg' prefix for shared lib. + case "$cf_cv_shlib_version" in + (cygdll) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/cyg${cf_libname}${cf_cygsuf}" + ;; + (msysdll) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/msys-${cf_libname}${cf_cygsuf}" + ;; + (mingw) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/lib${cf_libname}${cf_cygsuf}" + ;; + (msvcdll) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/${cf_libname}${cf_cygsuf}" + ;; + (*) + cf_add_lib= + ;; + esac + if test -n "$cf_add_lib" + then + Libs_To_Make="$Libs_To_Make $cf_add_lib" + continue + fi + fi + cf_add_lib="../lib/${cf_prefix}${cf_libname}${cf_suffix}" + Libs_To_Make="$Libs_To_Make $cf_add_lib" + done + + if test "$cf_dir" = ncurses ; then + cf_subsets="$LIB_SUBSETS" + cf_r_parts="$cf_subsets" + cf_liblist="$Libs_To_Make" + + while test -n "$cf_r_parts" + do + cf_l_parts=`echo "$cf_r_parts" |sed -e 's/ .*$//'` + cf_r_parts=`echo "$cf_r_parts" |sed -e 's/^[[^ ]]* //'` + if test "$cf_l_parts" != "$cf_r_parts" ; then + cf_add_lib= + case "$cf_l_parts" in + (*termlib*) + cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TINFO_LIB_SUFFIX}%g` + ;; + (*ticlib*) + cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TICS_LIB_SUFFIX}%g` + ;; + (*) + break + ;; + esac + if test -n "$cf_add_lib"; then + Libs_To_Make="$cf_add_lib $Libs_To_Make" + fi + else + break + fi + done + else + cf_subsets=`echo "$LIB_SUBSETS" | sed -e 's/^termlib.* //'` + fi + + if test "$cf_dir" = c++; then + if test "x$with_shared_cxx" != xyes && test -n "$cf_shared_suffix"; then + cf_list= + for cf_item in $Libs_To_Make + do + case "$cf_item" in + (*.a) + ;; + (*) + cf_item=`echo "$cf_item" | sed -e "s,"$cf_shared_suffix",.a,"` + ;; + esac + for cf_test in $cf_list + do + if test "$cf_test" = "$cf_item" + then + cf_LIST_MODELS=`echo "$cf_LIST_MODELS" | sed -e 's/normal//'` + cf_item= + break + fi + done + test -n "$cf_item" && cf_list="$cf_list $cf_item" + done + Libs_To_Make="$cf_list" + fi + fi + + sed -e "s%@Libs_To_Make@%$Libs_To_Make%" \ + -e "s%@SHARED_LIB@%$SHARED_LIB%" \ + "$cf_dir/Makefile" >$cf_dir/Makefile.out + mv "$cf_dir/Makefile.out" "$cf_dir/Makefile" + + $AWK -f "$srcdir/mk-0th.awk" \ + libname="${cf_dir}${LIB_SUFFIX}" subsets="$LIB_SUBSETS" ticlib="$TICS_LIB_SUFFIX" termlib="$TINFO_LIB_SUFFIX" \ + "$srcdir/$cf_dir/modules" >>$cf_dir/Makefile + + for cf_subset in $cf_subsets + do + cf_subdirs= + for cf_item in $cf_LIST_MODELS + do + + echo "Appending rules for ${cf_item} model (${cf_dir}: ${cf_subset})" + CF_UPPER(cf_ITEM,$cf_item) + + CXX_MODEL=$cf_ITEM + if test "$CXX_MODEL" = SHARED; then + case "$cf_cv_shlib_version" in + (cygdll|msysdll|mingw|msvcdll) + test "x$with_shared_cxx" = xno && CF_VERBOSE(overriding CXX_MODEL to SHARED) + with_shared_cxx=yes + ;; + (*) + test "x$with_shared_cxx" = xno && CXX_MODEL=NORMAL + ;; + esac + fi + + CF_LIB_SUFFIX($cf_item,cf_suffix,cf_depsuf) + CF_OBJ_SUBDIR($cf_item,cf_subdir) + + # Test for case where we build libtinfo with a different name. + cf_libname=$cf_dir + if test "$cf_dir" = ncurses ; then + case "$cf_subset" in + (*base*) + cf_libname=${cf_libname}$USE_LIB_SUFFIX + ;; + (*termlib*) + cf_libname=$TINFO_LIB_SUFFIX + ;; + (ticlib*) + cf_libname=$TICS_LIB_SUFFIX + ;; + esac + elif test "$cf_dir" = c++ ; then + CF_MAP_LIB_BASENAME(cf_libname,cxx) + cf_libname=${cf_libname}$USE_LIB_SUFFIX + else + CF_MAP_LIB_BASENAME(cf_libname,$cf_dir) + cf_libname=${cf_libname}$USE_LIB_SUFFIX + fi + if test -n "${USE_ARG_SUFFIX}" ; then + # undo $USE_LIB_SUFFIX add-on in CF_LIB_SUFFIX + cf_suffix=`echo "$cf_suffix" |sed -e "s%^${USE_LIB_SUFFIX}%%"` + fi + + # These dependencies really are for development, not + # builds, but they are useful in porting, too. + cf_depend="../include/ncurses_cfg.h" + if test "$srcdir" = "."; then + cf_reldir="." + else + cf_reldir="\${srcdir}" + fi + + if test -f "$srcdir/$cf_dir/$cf_dir.priv.h" ; then + cf_depend="$cf_depend $cf_reldir/$cf_dir.priv.h" + elif test -f "$srcdir/$cf_dir/curses.priv.h" ; then + cf_depend="$cf_depend $cf_reldir/curses.priv.h" + fi + + cf_dir_suffix= + old_cf_suffix="$cf_suffix" + if test "$cf_cv_shlib_version_infix" = yes ; then + if test -n "$USE_LIB_SUFFIX" ; then + case "$USE_LIB_SUFFIX" in + (tw*) + cf_libname=`echo "$cf_libname" | sed 's/tw'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^tw'$EXTRA_SUFFIX'//'` + cf_dir_suffix=tw$EXTRA_SUFFIX + ;; + (t*) + cf_libname=`echo "$cf_libname" | sed 's/t'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^t'$EXTRA_SUFFIX'//'` + cf_dir_suffix=t$EXTRA_SUFFIX + ;; + (w*) + cf_libname=`echo "$cf_libname" | sed 's/w'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^w'$EXTRA_SUFFIX'//'` + cf_dir_suffix=w$EXTRA_SUFFIX + ;; + (*) + cf_libname=`echo "$cf_libname" | sed 's/'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^'$EXTRA_SUFFIX'//'` + cf_dir_suffix=$EXTRA_SUFFIX + ;; + esac + fi + fi + + $AWK -f "$srcdir/mk-1st.awk" \ + name=${cf_libname}${cf_dir_suffix} \ + traces=$LIB_TRACING \ + MODEL=$cf_ITEM \ + CXX_MODEL=$CXX_MODEL \ + LIB_SUFFIX=$LIB_SUFFIX \ + USE_LIB_SUFFIX=$USE_LIB_SUFFIX \ + make_phony="${cf_cv_make_PHONY:-no}" \ + model=$cf_subdir \ + prefix=$cf_prefix \ + suffix=$cf_suffix \ + subset=$cf_subset \ + driver=$cf_cv_term_driver \ + SymLink="$LN_S" \ + TermlibRoot=$TINFO_NAME \ + TermlibSuffix=$TINFO_SUFFIX \ + ShlibVer=$cf_cv_shlib_version \ + ShlibVerInfix=$cf_cv_shlib_version_infix \ + ReLink=${cf_cv_do_relink:-no} \ + ReRanlib=${cf_cv_do_reranlib:-yes} \ + DoLinks=$cf_cv_do_symlinks \ + rmSoLocs=$cf_cv_rm_so_locs \ + ldconfig="$LDCONFIG" \ + overwrite=$WITH_OVERWRITE \ + depend="$cf_depend" \ + host="$host" \ + libtool_version="$LIBTOOL_VERSION" \ + "$srcdir/$cf_dir/modules" >>$cf_dir/Makefile + + cf_suffix="$old_cf_suffix" + + for cf_subdir2 in $cf_subdirs lib + do + test "$cf_subdir" = "$cf_subdir2" && break + done + test "${cf_subset}.${cf_subdir2}" != "${cf_subset}.${cf_subdir}" && \ + $AWK -f "$srcdir/mk-2nd.awk" \ + name=$cf_dir \ + traces=$LIB_TRACING \ + MODEL=$cf_ITEM \ + model=$cf_subdir \ + subset=$cf_subset \ + srcdir=$srcdir \ + echo=$WITH_ECHO \ + crenames=$cf_cv_prog_CC_c_o \ + cxxrenames=$cf_cv_prog_CXX_c_o \ + "$srcdir/$cf_dir/modules" >>$cf_dir/Makefile + cf_subdirs="$cf_subdirs $cf_subdir" + done + done + fi + + echo ' ( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} [$]@ )' >>Makefile +done + +echo >> Makefile +echo '# generated by CF_LIB_RULES' >> Makefile + +if test "x$cf_cv_make_PHONY" = xyes ; then + cat >> Makefile <<-CF_EOF + + .PHONY : libs + .PHONY : lintlib + .PHONY : install.includes + .PHONY : uninstall.includes + .PHONY : install.libs + .PHONY : uninstall.libs +CF_EOF +fi + +for cf_dir in $SRC_SUBDIRS +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + fi + + if test -f "$cf_dir/Makefile" ; then + case "$cf_dir" in + (Ada95) + echo 'libs \' >> Makefile + echo 'install.libs \' >> Makefile + echo 'uninstall.libs ::' >> Makefile + echo ' ( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} [$]@ )' >> Makefile + ;; + esac + fi + + if test -f "$srcdir/$cf_dir/modules" ; then + + if test "x$cf_cv_make_PHONY" = xyes ; then + cat >> Makefile <<-CF_EOF + + .PHONY : install.$cf_dir + .PHONY : uninstall.$cf_dir +CF_EOF + fi + + echo >> Makefile + if test -f "$srcdir/$cf_dir/headers" ; then +cat >> Makefile <> Makefile <> Makefile <> Makefile <<-CF_EOF + + .PHONY : install.data + .PHONY : uninstall.data +CF_EOF +fi + +if test "x$cf_with_db_install" = xyes; then +cat >> Makefile <> Makefile <> Makefile <<-CF_EOF + + .PHONY : install.man + .PHONY : uninstall.man +CF_EOF +fi + +cat >> Makefile <> Makefile <headers.sh <>headers.sh </<\$END\/\$NAME>/" >> \$TMPSED + done + ;; +(*) + echo "" >> \$TMPSED + ;; +esac +CF_EOF + +else + cat >>headers.sh <//" >> \$TMPSED + NAME=ncurses.h + fi + echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED + done + ;; +(*) + echo "s///" >> \$TMPSED + ;; +esac +CF_EOF +fi +cat >>headers.sh < \$TMPSRC +NAME=\`basename \$SRC\` +CF_EOF +if test "$WITH_CURSES_H" != yes; then + cat >>headers.sh <>headers.sh <>$cf_dir/Makefile + fi + + if test -f "$srcdir/$cf_dir/modules" ; then + if test "$cf_dir" != "c++" ; then + if test "x$cf_cv_make_PHONY" = xyes ; then + cat >> $cf_dir/Makefile <<-CF_EOF + + .PHONY : depend +CF_EOF + fi + + cat >>$cf_dir/Makefile <<"CF_EOF" +depend : ${AUTO_SRC} + makedepend -- ${CPPFLAGS} -- ${C_SRC} + +# DO NOT DELETE THIS LINE -- make depend depends on it. +CF_EOF + fi + fi +done +AC_SUBST(Libs_To_Make) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_SONAME version: 9 updated: 2021/01/04 18:48:01 +dnl ------------- +dnl Find the and soname for the given shared library. Set the cache variable +dnl cf_cv_$3_soname to this, unless it is not found. Then set the cache +dnl variable to "unknown". +dnl +dnl $1 = headers +dnl $2 = code +dnl $3 = library name +AC_DEFUN([CF_LIB_SONAME], +[AC_REQUIRE([AC_PROG_FGREP])dnl + +AC_CACHE_CHECK(for soname of $3 library,cf_cv_$3_soname,[ + +cf_cv_$3_soname=unknown +if test "$cross_compiling" != yes ; then +cat >conftest.$ac_ext </dev/null | sed -e 's,^.*/,,' -e 's, .*$,,' | ${FGREP-fgrep} lib$3.`" + test -z "$cf_cv_$3_soname" && cf_cv_$3_soname=unknown + fi + fi +rm -rf ./conftest* +LIBS="$cf_save_LIBS" +fi +]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_LIB_SUFFIX version: 28 updated: 2021/01/01 16:53:59 +dnl ------------- +dnl Compute the library file-suffix from the given model name +dnl $1 = model name +dnl $2 = variable to set (the nominal library suffix) +dnl $3 = dependency variable to set (actual filename) +dnl The variable $LIB_SUFFIX, if set, prepends the variable to set. +AC_DEFUN([CF_LIB_SUFFIX], +[ + case X$1 in + (Xlibtool) + $2='.la' + $3=[$]$2 + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + $2='_g.lib' + ;; + (*) + $2='_g.a' + ;; + esac + $3=[$]$2 + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + $2='_p.lib' + ;; + (*) + $2='_p.a' + ;; + esac + $3=[$]$2 + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[[5-7]]*) + $2='.so' + $3=[$]$2 + ;; + (*-msvc*) + $2='.dll' + $3='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + $2='.dll' + $3='.dll.a' + ;; + (darwin*) + $2='.dylib' + $3=[$]$2 + ;; + (hpux*) + case "$target" in + (ia64*) + $2='.so' + $3=[$]$2 + ;; + (*) + $2='.sl' + $3=[$]$2 + ;; + esac + ;; + (*) + $2='.so' + $3=[$]$2 + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + $2='.lib' + ;; + (*) + $2='.a' + ;; + esac + $3=[$]$2 + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + $2="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$2}" + $3="${LIB_SUFFIX}${EXTRA_SUFFIX}[$]{$3}" + fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIB_TYPE version: 5 updated: 2015/04/17 21:13:04 +dnl ----------- +dnl Compute the string to append to -library from the given model name +dnl $1 = model name +dnl $2 = variable to set +dnl The variable $LIB_SUFFIX, if set, prepends the variable to set. +AC_DEFUN([CF_LIB_TYPE], +[ + case $1 in + (libtool) $2='' ;; + (normal) $2='' ;; + (debug) $2='_g' ;; + (profile) $2='_p' ;; + (shared) $2='' ;; + esac + test -n "$LIB_SUFFIX" && $2="${LIB_SUFFIX}[$]{$2}" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LINK_DATAONLY version: 15 updated: 2023/12/03 10:03:10 +dnl ---------------- +dnl Some systems have a non-ANSI linker that doesn't pull in modules that have +dnl only data (i.e., no functions), for example NeXT. On those systems we'll +dnl have to provide wrappers for global tables to ensure they're linked +dnl properly. +AC_DEFUN([CF_LINK_DATAONLY], +[ +AC_MSG_CHECKING([if data-only library module links]) +AC_CACHE_VAL(cf_cv_link_dataonly,[ + rm -f conftest.a + cat >conftest.$ac_ext <&AC_FD_CC 1>/dev/null + fi + rm -f conftest.$ac_ext data.o + cat >conftest.$ac_ext <&AC_FD_CC 1>/dev/null + fi + rm -f conftest.$ac_ext func.o + ( eval $RANLIB conftest.a ) 2>&AC_FD_CC >/dev/null + cf_saveLIBS="$LIBS" + LIBS="conftest.a $LIBS" + AC_TRY_RUN([ + extern int testfunc(void); + int main(void) + { + ${cf_cv_main_return:-return} (!testfunc()); + } + ], + [cf_cv_link_dataonly=yes], + [cf_cv_link_dataonly=no], + [cf_cv_link_dataonly=unknown]) + LIBS="$cf_saveLIBS" + ]) +AC_MSG_RESULT($cf_cv_link_dataonly) + +if test "$cf_cv_link_dataonly" = no ; then + AC_DEFINE(BROKEN_LINKER,1,[if data-only library module does not link]) + BROKEN_LINKER=1 +fi +AC_SUBST(BROKEN_LINKER) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LINK_FUNCS version: 13 updated: 2023/12/03 09:24:04 +dnl ------------- +dnl Most Unix systems have both link and symlink, a few don't have symlink. +dnl A few non-Unix systems implement symlink, but not link. +dnl A few non-systems implement neither (or have nonfunctional versions). +dnl +dnl This allows for a 2-second difference in modification times to allow for +dnl some marginal NFS implementations. +AC_DEFUN([CF_LINK_FUNCS], +[ +AC_CHECK_HEADERS( \ +unistd.h \ +) +AC_CHECK_FUNCS( \ + remove \ + unlink ) + +if test "$cross_compiling" = yes ; then + AC_CHECK_FUNCS( \ + link \ + symlink ) +else + AC_CACHE_CHECK(if link/symlink functions work,cf_cv_link_funcs,[ + cf_cv_link_funcs= + for cf_func in link symlink ; do + AC_TRY_RUN([ +$ac_includes_default + +int main(void) +{ + int fail = 0; + char src[] = "conftest.tmp"; + char dst[] = "conftest.chk"; + struct stat src_sb, dst_sb; + FILE *fp = fopen(src, "w"); + if (fp == 0) { fail = 3; } else { + fclose(fp); stat(src, &src_sb); + if ($cf_func(src, dst) < 0) { + fail = 1; + } else if (stat(dst, &dst_sb) < 0) { + fail = 2; + } else { + long diff = (dst_sb.st_mtime - src_sb.st_mtime); + if (diff < 0) diff = -diff; + if (diff > 2) fail = 3; + } + } +#ifdef HAVE_UNLINK + unlink(dst); unlink(src); +#else + remove(dst); remove(src); +#endif + ${cf_cv_main_return:-return} (fail); +} + ],[ + cf_cv_link_funcs="$cf_cv_link_funcs $cf_func" + eval 'ac_cv_func_'$cf_func'=yes'],[ + eval 'ac_cv_func_'$cf_func'=no'],[ + eval 'ac_cv_func_'$cf_func'=error']) + done + test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no + ]) + test "$ac_cv_func_link" = yes && AC_DEFINE(HAVE_LINK,1,[Define to 1 if we have link() function]) + test "$ac_cv_func_symlink" = yes && AC_DEFINE(HAVE_SYMLINK,1,[Define to 1 if we have symlink() function]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKEFLAGS version: 21 updated: 2021/09/04 06:47:34 +dnl ------------ +dnl Some 'make' programs support ${MAKEFLAGS}, some ${MFLAGS}, to pass 'make' +dnl options to lower-levels. It is very useful for "make -n" -- if we have it. +dnl (GNU 'make' does both, something POSIX 'make', which happens to make the +dnl ${MAKEFLAGS} variable incompatible because it adds the assignments :-) +AC_DEFUN([CF_MAKEFLAGS], +[AC_REQUIRE([AC_PROG_FGREP])dnl + +AC_CACHE_CHECK(for makeflags variable, cf_cv_makeflags,[ + cf_cv_makeflags='' + for cf_option in '-${MAKEFLAGS}' '${MFLAGS}' + do + cat >cf_makeflags.tmp </dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[[ ]]*$,,'` + case "$cf_result" in + (.*k|.*kw) + cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`" + case "$cf_result" in + (.*CC=*) cf_cv_makeflags= + ;; + (*) cf_cv_makeflags=$cf_option + ;; + esac + break + ;; + (.-) + ;; + (*) + CF_MSG_LOG(given option \"$cf_option\", no match \"$cf_result\") + ;; + esac + done + rm -f cf_makeflags.tmp +]) + +AC_SUBST(cf_cv_makeflags) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21 +dnl ------------- +dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which +dnl acts as a placeholder. +dnl +dnl The ".PHONY" feature was proposed in 2011 here +dnl https://www.austingroupbugs.net/view.php?id=523 +dnl and is scheduled for release in P1003.1 Issue 8 (late 2022). +dnl +dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with +dnl a few others (i.e., GNU make and the non-POSIX "BSD" make): +dnl +dnl + This is a GNU make feature (since April 1988, but in turn from binutils, +dnl date unspecified). +dnl +dnl + It was adopted in NetBSD make in June 1995. +dnl +dnl + The other BSD make programs are derived from the NetBSD make (and for +dnl that reason are not actually different "implementations"). +dnl +dnl + Some features of NetBSD make were actually adapted from pmake, which +dnl began as a modified GNU make starting in 1993. +dnl +dnl + Version 3.8 of the dmake program in January 1992 also implemented this +dnl GNU make extension, but is less well known than the BSD make. +AC_DEFUN([CF_MAKE_PHONY],[ +AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[ + rm -rf conftest* + ( + mkdir conftest || exit 1 + cd conftest + cat >makefile <<'CF_EOF' +.PHONY: always +DATA=0 +always: always.out + @echo "** making [$]@ [$](DATA)" +once: once.out + @echo "** making [$]@ [$](DATA)" +always.out: + @echo "** making [$]@ [$](DATA)" + echo [$](DATA) > [$]@ +once.out: + @echo "** making [$]@ [$](DATA)" + echo [$](DATA) > [$]@ +CF_EOF + for cf_data in 1 2 3 + do + ${MAKE:-make} always DATA=$cf_data + ${MAKE:-make} once DATA=$cf_data + ${MAKE:-make} -t always once + if test -f always ; then + echo "no (case 1)" > ../conftest.tmp + elif test ! -f always.out ; then + echo "no (case 2)" > ../conftest.tmp + elif test ! -f once.out ; then + echo "no (case 3)" > ../conftest.tmp + elif ! cmp -s always.out once.out ; then + echo "no (case 4)" > ../conftest.tmp + diff always.out once.out + else + cf_check="`cat always.out`" + if test "x$cf_check" != "x$cf_data" ; then + echo "no (case 5)" > ../conftest.tmp + else + echo yes > ../conftest.tmp + rm -f ./*.out + continue + fi + fi + break + done + ) >&AC_FD_CC 2>&1 + cf_cv_make_PHONY="`cat conftest.tmp`" + rm -rf conftest* +]) +MAKE_NO_PHONY="#" +MAKE_PHONY="#" +test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY= +test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY= +AC_SUBST(MAKE_NO_PHONY) +AC_SUBST(MAKE_PHONY) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32 +dnl ------------ +dnl Generate tags/TAGS targets for makefiles. Do not generate TAGS if we have +dnl a monocase filesystem. +AC_DEFUN([CF_MAKE_TAGS],[ +AC_REQUIRE([CF_MIXEDCASE_FILENAMES]) + +AC_CHECK_PROGS(CTAGS, exctags ctags) +AC_CHECK_PROGS(ETAGS, exetags etags) + +AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no) + +if test "$cf_cv_mixedcase" = yes ; then + AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no) +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +AC_SUBST(CTAGS) +AC_SUBST(ETAGS) + +AC_SUBST(MAKE_UPPER_TAGS) +AC_SUBST(MAKE_LOWER_TAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MANPAGE_FORMAT version: 19 updated: 2024/03/30 08:27:40 +dnl ----------------- +dnl Option to allow user to override automatic configuration of manpage format. +dnl There are several special cases: +dnl +dnl compress - man checks for, can display compressed files +dnl bzip2 - man checks for, can display bzip2'd files +dnl gzip - man checks for, can display gzip'd files +dnl xz - man checks for, can display xz'd files +dnl +dnl BSDI - files in the cat-directories are suffixed ".0" +dnl formatted - installer should format (put files in cat-directory) +dnl catonly - installer should only format, e.g., for a turnkey system. +dnl +dnl There are other configurations which this macro does not test, e.g., HPUX's +dnl compressed manpages (but uncompressed manpages are fine, and HPUX's naming +dnl convention would not match our use). +AC_DEFUN([CF_MANPAGE_FORMAT], +[ +AC_REQUIRE([CF_PATHSEP]) +AC_MSG_CHECKING(format of man-pages) + +AC_ARG_WITH(manpage-format, + [ --with-manpage-format specify manpage-format: gzip/compress/bzip2/xz, + BSDI/normal and optionally formatted/catonly, + e.g., gzip,formatted], + [MANPAGE_FORMAT=$withval], + [MANPAGE_FORMAT=unknown]) + +test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=unknown +MANPAGE_FORMAT=`echo "$MANPAGE_FORMAT" | sed -e 's/,/ /g'` + +cf_unknown= + +case "$MANPAGE_FORMAT" in +(unknown) + if test -z "$MANPATH" ; then + MANPATH="/usr/man:/usr/share/man" + fi + + # look for the 'date' man-page (it is most likely to be installed!) + MANPAGE_FORMAT= + cf_preform="no" + cf_catonly="yes" + cf_example="date" + + IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for cf_dir in $MANPATH; do + test -z "$cf_dir" && cf_dir=/usr/man + for cf_name in $cf_dir/man*/$cf_example.[[01]]* $cf_dir/cat*/$cf_example.[[01]]* $cf_dir/man*/$cf_example $cf_dir/cat*/$cf_example + do + cf_test=`echo "$cf_name" | sed -e 's/*//'` + if test "x$cf_test" = "x$cf_name" ; then + + case "$cf_name" in + (*.bz2) MANPAGE_FORMAT="$MANPAGE_FORMAT bzip2";; + (*.xz) MANPAGE_FORMAT="$MANPAGE_FORMAT xz";; + (*.gz) MANPAGE_FORMAT="$MANPAGE_FORMAT gzip";; + (*.Z) MANPAGE_FORMAT="$MANPAGE_FORMAT compress";; + (*.0) MANPAGE_FORMAT="$MANPAGE_FORMAT BSDI";; + (*) MANPAGE_FORMAT="$MANPAGE_FORMAT normal";; + esac + + case "$cf_name" in + ($cf_dir/man*) + cf_catonly=no + ;; + ($cf_dir/cat*) + cf_preform=yes + ;; + esac + break + fi + + # if we found a match in either man* or cat*, stop looking + if test -n "$MANPAGE_FORMAT" ; then + cf_found=no + test "$cf_preform" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT formatted" + test "$cf_catonly" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT catonly" + case "$cf_name" in + ($cf_dir/cat*) + cf_found=yes + ;; + esac + test "$cf_found" = yes && break + fi + done + # only check the first directory in $MANPATH where we find manpages + if test -n "$MANPAGE_FORMAT" ; then + break + fi + done + # if we did not find the example, just assume it is normal + test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=normal + IFS="$ac_save_ifs" + ;; +(*) + for cf_option in $MANPAGE_FORMAT; do + case "$cf_option" in + (xz|bzip2|gzip|compress|BSDI|normal|formatted|catonly) + ;; + (*) + cf_unknown="$cf_unknown $cf_option" + ;; + esac + done + ;; +esac + +AC_MSG_RESULT($MANPAGE_FORMAT) +if test -n "$cf_unknown" ; then + AC_MSG_WARN(Unexpected manpage-format $cf_unknown) +fi + +cf_manpage_format=no +cf_manpage_inboth=no +cf_manpage_so_strip= +cf_manpage_compress= +cf_manpage_coptions= + +for cf_item in $MANPAGE_FORMAT +do +case "$cf_item" in +(catonly) + cf_manpage_format=yes + cf_manpage_inboth=no + ;; +(formatted) + cf_manpage_format=yes + cf_manpage_inboth=yes + ;; +(compress) + cf_manpage_so_strip="Z" + cf_manpage_compress=compress + ;; +(gzip) + cf_manpage_so_strip="gz" + cf_manpage_compress=gzip + cf_manpage_coptions=-n + ;; +(bzip2) + cf_manpage_so_strip="bz2" + cf_manpage_compress=bzip2 + ;; +(xz) + cf_manpage_so_strip="xz" + cf_manpage_compress=xz + ;; +esac +done + +AC_SUBST(cf_manpage_format) +AC_SUBST(cf_manpage_inboth) +AC_SUBST(cf_manpage_so_strip) +AC_SUBST(cf_manpage_compress) +AC_SUBST(cf_manpage_coptions) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MANPAGE_RENAMES version: 17 updated: 2022/10/23 07:46:29 +dnl ------------------ +dnl The Debian people have their own naming convention for manpages. This +dnl option lets us override the name of the file containing renaming, or +dnl disable it altogether. +AC_DEFUN([CF_MANPAGE_RENAMES], +[ +AC_MSG_CHECKING(for manpage renaming) + +AC_ARG_WITH(manpage-renames, + [ --with-manpage-renames specify manpage-renaming], + [MANPAGE_RENAMES=$withval], + [MANPAGE_RENAMES=yes]) + +case ".$MANPAGE_RENAMES" in +(.no) + ;; +(.|.yes) + # Debian 'man' program? + if test -f /etc/debian_version ; then + MANPAGE_RENAMES=man/man_db.renames + else + MANPAGE_RENAMES=no + fi + ;; +esac + +if test "$MANPAGE_RENAMES" = man/man_db.renames ; then + MANPAGE_RENAMES=`pwd`/$MANPAGE_RENAMES +elif test "$MANPAGE_RENAMES" = no ; then + : +elif test ! -f "$MANPAGE_RENAMES" ; then + AC_MSG_ERROR(not a filename: $MANPAGE_RENAMES) +fi + +AC_MSG_RESULT($MANPAGE_RENAMES) +AC_SUBST(MANPAGE_RENAMES) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MANPAGE_SYMLINKS version: 7 updated: 2023/01/21 16:37:17 +dnl ------------------- +dnl Some people expect each tool to make all aliases for manpages in the +dnl man-directory. This accommodates the older, less-capable implementations +dnl of 'man', and is optional. +AC_DEFUN([CF_MANPAGE_SYMLINKS], +[ +AC_MSG_CHECKING(if manpage aliases will be installed) + +AC_ARG_WITH(manpage-aliases, + [ --with-manpage-aliases specify manpage-aliases using .so], + [MANPAGE_ALIASES=$withval], + [MANPAGE_ALIASES=yes]) + +AC_MSG_RESULT($MANPAGE_ALIASES) + +case "x$LN_S" in +(xln*) + cf_use_symlinks=yes + ;; +(*) + cf_use_symlinks=no + ;; +esac + +MANPAGE_SYMLINKS=no +if test "$MANPAGE_ALIASES" = yes ; then +AC_MSG_CHECKING(if manpage symlinks should be used) + +AC_ARG_WITH(manpage-symlinks, + [ --with-manpage-symlinks specify manpage-aliases using symlinks], + [MANPAGE_SYMLINKS=$withval], + [MANPAGE_SYMLINKS=$cf_use_symlinks]) + +if test "$cf_use_symlinks" = no; then +if test "$MANPAGE_SYMLINKS" = yes ; then + AC_MSG_WARN(cannot make symlinks, will use .so files) + MANPAGE_SYMLINKS=no +fi +fi + +AC_MSG_RESULT($MANPAGE_SYMLINKS) +fi + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MANPAGE_TBL version: 3 updated: 2002/01/19 22:51:32 +dnl -------------- +dnl This option causes manpages to be run through tbl(1) to generate tables +dnl correctly. +AC_DEFUN([CF_MANPAGE_TBL], +[ +AC_MSG_CHECKING(for manpage tbl) + +AC_ARG_WITH(manpage-tbl, + [ --with-manpage-tbl specify manpage processing with tbl], + [MANPAGE_TBL=$withval], + [MANPAGE_TBL=no]) + +AC_MSG_RESULT($MANPAGE_TBL) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAN_PAGES version: 59 updated: 2024/03/30 08:27:40 +dnl ------------ +dnl Try to determine if the man-pages on the system are compressed, and if +dnl so, what format is used. Use this information to construct a script that +dnl will install man-pages. +AC_DEFUN([CF_MAN_PAGES], +[ +CF_HELP_MESSAGE(Options to Specify How Manpages are Installed:) +CF_MANPAGE_FORMAT +CF_MANPAGE_RENAMES +CF_MANPAGE_SYMLINKS +CF_MANPAGE_TBL + +if test "$prefix" = "NONE" ; then + cf_prefix="$ac_default_prefix" +else + cf_prefix="$prefix" +fi + +test ! -d man && mkdir man + +cf_edit_man=./edit_man.sh +cf_man_alias=`pwd`/man_alias.sed + +cat >$cf_edit_man <>$cf_man_alias <<-CF_EOF2 + s,@DATADIR@,\$datadir,g + s,@TERMINFO@,\${TERMINFO:="no default value"},g + s,@TERMINFO_DIRS@,\${TERMINFO_DIRS:="no default value"},g + s,@NCURSES_MAJOR@,\${NCURSES_MAJOR:="no default value"},g + s,@NCURSES_MINOR@,\${NCURSES_MINOR:="no default value"},g + s,@NCURSES_PATCH@,\${NCURSES_PATCH:="no default value"},g + s,@NCURSES_OSPEED@,\${NCURSES_OSPEED:="no default value"},g +CF_EOF + ifelse($1,,,[ + for cf_name in $1 + do + cf_NAME=`echo "$cf_name" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + cf_name=`echo "$cf_name" | sed "$program_transform_name"` +cat >>$cf_edit_man <<-CF_EOF + s,@$cf_NAME@,$cf_name,g +CF_EOF + done + ]) +cat >>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <\$TMP +CF_EOF +else +cat >>$cf_edit_man <\$TMP +CF_EOF +fi + +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP +fi +CF_EOF + +if test "$with_overwrite" != yes ; then +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP +CF_EOF +fi + +if test "$with_curses_h" != yes ; then +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP +CF_EOF +fi + +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP + fi +CF_EOF + +if test -n "$cf_manpage_compress" ; then +cat >>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <\$TMP +CF_EOF +if test -n "$cf_manpage_compress" ; then +cat >>$cf_edit_man <>$cf_edit_man < + #include + #include + ], + [double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)], + [cf_cv_need_libm=no], + [cf_cv_need_libm=yes])]) + +if test "$cf_cv_need_libm" = yes +then + + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lm" + AC_CACHE_CHECK(if -lm is available for math functions, + cf_cv_have_libm,[ + AC_TRY_LINK([ + #include + #include + #include + ], + [double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)], + [cf_cv_have_libm=yes], + [cf_cv_have_libm=no])]) + LIBS="$cf_save_LIBS" + + if test "$cf_cv_have_libm" = yes + then + ifelse($1,,[CF_ADD_LIB(m)],[$1=-lm]) + fi +else + cf_cv_have_libm=yes +fi + +if test "$cf_cv_have_libm" = yes +then + AC_DEFINE(HAVE_MATH_FUNCS,1,[Define to 1 if math functions are available]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_MB_LEN_MAX version: 1 updated: 2024/03/02 15:45:10 +dnl ------------- +dnl Check if defines a usable MB_LEN_MAX. That may be because it is +dnl not defined, or it may be a bogus value. +AC_DEFUN([CF_MB_LEN_MAX],[ +AC_CACHE_CHECK(if MB_LEN_MAX is usable,cf_cv_mb_len_max,[ +AC_TRY_COMPILE([ +$ac_includes_default +#include ], +[ +#if defined(MB_LEN_MAX) && MB_LEN_MAX >= 6 + ${cf_cv_main_return:-return}(0); +#else +#error MB_LEN_MAX is not usable +#endif +], [cf_cv_mb_len_max=yes], + [cf_cv_mb_len_max=no])]) +if test "$cf_cv_mb_len_max" = yes +then + AC_DEFINE(HAVE_CONSISTENT_MB_LEN_MAX,1,[Define to 1 if MB_LEN_MAX is usable]) +else + AC_MSG_WARN(MB_LEN_MAX is missing/inconsistent in system headers) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59 +dnl ---------------------- +dnl Check if the file-system supports mixed-case filenames. If we're able to +dnl create a lowercase name and see it as uppercase, it doesn't support that. +AC_DEFUN([CF_MIXEDCASE_FILENAMES], +[ +AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[ +if test "$cross_compiling" = yes ; then + case "$target_alias" in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi +]) +test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MKSTEMP version: 13 updated: 2023/12/01 17:22:50 +dnl ---------- +dnl Check for a working mkstemp. This creates two files, checks that they are +dnl successfully created and distinct (AmigaOS apparently fails on the last). +AC_DEFUN([CF_MKSTEMP],[ +AC_CHECK_HEADERS( \ +unistd.h \ +) +AC_CACHE_CHECK(for working mkstemp, cf_cv_func_mkstemp,[ +rm -rf ./conftest* +AC_TRY_RUN([ +$ac_includes_default + +int main(void) +{ + static char tmpl[] = "conftestXXXXXX"; + char name[2][80]; + int n; + int result = 0; + int fd; + struct stat sb; + + umask(077); + for (n = 0; n < 2; ++n) { + strcpy(name[n], tmpl); + if ((fd = mkstemp(name[n])) >= 0) { + if (!strcmp(name[n], tmpl) + || stat(name[n], &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG + || (sb.st_mode & 077) != 0) { + result = 1; + } + close(fd); + } + } + if (result == 0 + && !strcmp(name[0], name[1])) + result = 1; + ${cf_cv_main_return:-return}(result); +} +],[cf_cv_func_mkstemp=yes +],[cf_cv_func_mkstemp=no +],[cf_cv_func_mkstemp=maybe]) +]) +if test "x$cf_cv_func_mkstemp" = xmaybe ; then + AC_CHECK_FUNC(mkstemp) +fi +if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then + AC_DEFINE(HAVE_MKSTEMP,1,[Define to 1 if mkstemp() is available and working.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32 +dnl ---------- +dnl Write a debug message to config.log, along with the line number in the +dnl configure script. +AC_DEFUN([CF_MSG_LOG],[ +echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_ABI_6 version: 5 updated: 2023/01/07 16:32:06 +dnl ---------------- +dnl Set ncurses' ABI to 6 unless overridden by explicit configure option, and +dnl warn about this. +AC_DEFUN([CF_NCURSES_ABI_6],[ +if test "${with_abi_version+set}" != set; then + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=6.0 + cf_cv_abi_version=6 + cf_cv_abi_default=6 + AC_MSG_WARN(overriding ABI version to $cf_cv_abi_default) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_WITH_ABI_VERSION version: 3 updated: 2021/01/01 13:31:04 +dnl --------------------------- +dnl Allow ncurses's ABI to be overridden. Generally this happens when a +dnl packager has incremented the ABI past that used in the original package, +dnl and wishes to keep doing this. +dnl +dnl $1 is the package name, if any, to derive a corresponding {package}_ABI +dnl symbol. +AC_DEFUN([CF_NCURSES_WITH_ABI_VERSION],[ +CF_WITH_ABI_VERSION($1) +if test "x$cf_cv_abi_version" != "x$with_abi_version" +then + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=$with_abi_version.0 + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NO_LEAKS_OPTION version: 9 updated: 2021/06/13 19:45:41 +dnl ------------------ +dnl see CF_WITH_NO_LEAKS +dnl +dnl $1 = option/name +dnl $2 = help-text +dnl $3 = symbol to define if the option is set +dnl $4 = additional actions to take if the option is set +AC_DEFUN([CF_NO_LEAKS_OPTION],[ +AC_MSG_CHECKING(if you want to use $1 for testing) +AC_ARG_WITH($1, + [$2], + [case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_$1=yes + AC_DEFINE_UNQUOTED($3,1,"Define to 1 if you want to use $1 for testing.")ifelse([$4],,[ + $4 +]) + ;; + esac], + [with_$1=]) +AC_MSG_RESULT(${with_$1:-no}) + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + CF_ADD_CFLAGS([-g]) + ;; + esac + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NUMBER_SYNTAX version: 3 updated: 2023/05/06 16:14:29 +dnl ---------------- +dnl Check if the given variable is a positive integer. Report an error if not. +dnl $1 is the variable +dnl $2 is the message +AC_DEFUN([CF_NUMBER_SYNTAX],[ +if test -n "$1" ; then + case `echo "$1" | sed -e 's/^[[0-9]]*$/0/g'` in + (0) + ;; + (*) + AC_MSG_ERROR($2 is not a number: $1) + ;; + esac +else + AC_MSG_ERROR($2 value is empty) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_OBJ_SUBDIR version: 8 updated: 2021/01/01 13:31:04 +dnl ------------- +dnl Compute the object-directory name from the given model name +AC_DEFUN([CF_OBJ_SUBDIR], +[ + case $1 in + (libtool) $2='obj_lo' ;; + (normal) $2='objects' ;; + (debug) $2='obj_g' ;; + (profile) $2='obj_p' ;; + (shared) + case "$cf_cv_system_name" in + (cygwin|msys) + $2='objects' ;; + (*) + $2='obj_s' ;; + esac + esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_OUTPUT_MANPAGE_RENAMES version: 2 updated: 2022/10/22 19:12:31 +dnl ------------------------- +dnl This runs in the output step to config.status, after man_db.renames has +dnl been generated. +AC_DEFUN([CF_OUTPUT_MANPAGE_RENAMES], +[ +AC_REQUIRE([CF_MANPAGE_RENAMES]) +if test "$MANPAGE_RENAMES" != no ; then + # Construct a sed-script to perform renaming within man-pages + test -n "$verbose" && echo "creating edit_man.sed" + test ! -d man && mkdir man + FGREP="${FGREP-grep -F}" $SHELL "$srcdir/man/make_sed.sh" "$MANPAGE_RENAMES" >./edit_man.sed +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATHSEP version: 8 updated: 2021/01/01 13:31:04 +dnl ---------- +dnl Provide a value for the $PATH and similar separator (or amend the value +dnl as provided in autoconf 2.5x). +AC_DEFUN([CF_PATHSEP], +[ + AC_MSG_CHECKING(for PATH separator) + case "$cf_cv_system_name" in + (os2*) PATH_SEPARATOR=';' ;; + (*) ${PATH_SEPARATOR:=':'} ;; + esac +ifelse([$1],,,[$1=$PATH_SEPARATOR]) + AC_SUBST(PATH_SEPARATOR) + AC_MSG_RESULT($PATH_SEPARATOR) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATH_PROG version: 12 updated: 2021/01/02 09:31:20 +dnl ------------ +dnl Check for a given program, defining corresponding symbol. +dnl $1 = environment variable, which is suffixed by "_PATH" in the #define. +dnl $2 = program name to find. +dnl $3 = optional list of additional program names to test. +dnl $4 = $PATH +dnl +dnl If there is more than one token in the result, #define the remaining tokens +dnl to $1_ARGS. We need this for 'install' in particular. +dnl +dnl FIXME: we should allow this to be overridden by environment variables +dnl +AC_DEFUN([CF_PATH_PROG],[ +AC_REQUIRE([CF_PATHSEP]) +test -z "[$]$1" && $1="$2" +AC_PATH_PROGS($1,[$]$1 $2 ifelse($3,,,$3),[$]$1, ifelse($4,,,$4)) + +cf_path_prog="" +cf_path_args="" +IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" +for cf_temp in $ac_cv_path_$1 +do + if test -z "$cf_path_prog" ; then + if test "$with_full_paths" = yes ; then + CF_PATH_SYNTAX(cf_temp,break) + cf_path_prog="$cf_temp" + else + cf_path_prog="`basename "$cf_temp"`" + fi + elif test -z "$cf_path_args" ; then + cf_path_args="$cf_temp" + else + cf_path_args="$cf_path_args $cf_temp" + fi +done +IFS="$cf_save_ifs" + +if test -n "$cf_path_prog" ; then + CF_MSG_LOG(defining path for ${cf_path_prog}) + AC_DEFINE_UNQUOTED($1_PATH,"$cf_path_prog",Define to pathname $1) + test -n "$cf_path_args" && AC_DEFINE_UNQUOTED($1_ARGS,"$cf_path_args",Define to provide args for $1) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATH_SYNTAX version: 19 updated: 2024/08/03 13:08:58 +dnl -------------- +dnl Check the argument to see that it looks like a pathname. Rewrite it if it +dnl begins with one of the prefix/exec_prefix variables, and then again if the +dnl result begins with 'NONE'. This is necessary to work around autoconf's +dnl delayed evaluation of those symbols. +AC_DEFUN([CF_PATH_SYNTAX],[ +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x[$]$1" in +(x\[$]\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\[$]\{*prefix\}*|x\[$]\{*dir\}*) + eval $1="[$]$1" + case "x[$]$1" in + (xNONE/*) + $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PKG_CONFIG version: 13 updated: 2023/10/28 11:59:01 +dnl ------------- +dnl Check for the package-config program, unless disabled by command-line. +dnl +dnl Sets $PKG_CONFIG to the pathname of the pkg-config program. +AC_DEFUN([CF_PKG_CONFIG], +[ +AC_MSG_CHECKING(if you want to use pkg-config) +AC_ARG_WITH(pkg-config, + [[ --with-pkg-config[=CMD] enable/disable use of pkg-config and its name CMD]], + [cf_pkg_config=$withval], + [cf_pkg_config=yes]) +AC_MSG_RESULT($cf_pkg_config) + +case "$cf_pkg_config" in +(no) + PKG_CONFIG=none + ;; +(yes) + CF_ACVERSION_CHECK(2.52, + [AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)], + [AC_PATH_PROG(PKG_CONFIG, pkg-config, none)]) + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + CF_PATH_SYNTAX(PKG_CONFIG) +elif test "x$cf_pkg_config" != xno ; then + AC_MSG_WARN(pkg-config is not installed) +fi + +AC_SUBST(PKG_CONFIG) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_C_SOURCE version: 12 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed. +dnl +dnl POSIX.1-1990 _POSIX_SOURCE +dnl POSIX.1-1990 and _POSIX_SOURCE and +dnl POSIX.2-1992 C-Language _POSIX_C_SOURCE=2 +dnl Bindings Option +dnl POSIX.1b-1993 _POSIX_C_SOURCE=199309L +dnl POSIX.1c-1996 _POSIX_C_SOURCE=199506L +dnl X/Open 2000 _POSIX_C_SOURCE=200112L +dnl +dnl Parameters: +dnl $1 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_POSIX_C_SOURCE], +[AC_REQUIRE([CF_POSIX_VISIBLE])dnl + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1]) + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE) +CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE) + +AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[ + CF_MSG_LOG(if the symbol is already defined go no further) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif], + [cf_cv_posix_c_source=no], + [cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[[12]]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + AC_TRY_COMPILE([#include ],[ +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif],[], + cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE") + fi + CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE) + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source) + CF_MSG_LOG(if the second compile does not leave our definition intact error) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif],, + [cf_cv_posix_c_source=no]) + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + ]) +]) + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_ADD_CFLAGS($cf_cv_posix_c_source) +fi + +fi # cf_cv_posix_visible + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17 +dnl ---------------- +dnl POSIX documents test-macros which an application may set before any system +dnl headers are included to make features available. +dnl +dnl Some BSD platforms (originally FreeBSD, but copied by a few others) +dnl diverged from POSIX in 2002 by setting symbols which make all of the most +dnl recent features visible in the system header files unless the application +dnl overrides the corresponding test-macros. Doing that introduces portability +dnl problems. +dnl +dnl This macro makes a special check for the symbols used for this, to avoid a +dnl conflicting definition. +AC_DEFUN([CF_POSIX_VISIBLE], +[ +AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[ +AC_TRY_COMPILE([#include ],[ +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif +],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PREDEFINE version: 3 updated: 2023/02/18 17:41:25 +dnl ------------ +dnl Add definitions to CPPFLAGS to ensure they're predefined for all compiles. +dnl +dnl $1 = symbol to test +dnl $2 = value (if any) to use for a predefinition +AC_DEFUN([CF_PREDEFINE], +[ +AC_MSG_CHECKING(if we must define $1) +AC_TRY_COMPILE([#include +],[ +#ifndef $1 +#error $1 is not defined +#endif],[cf_result=no],[cf_result=yes]) +AC_MSG_RESULT($cf_result) + +if test "$cf_result" = yes ; then + CPPFLAGS="$CPPFLAGS ifelse([$2],,-D$1,[-D$1=$2])" +elif test "x$2" != "x" ; then + AC_MSG_CHECKING(checking for compatible value versus $2) + AC_TRY_COMPILE([#include +],[ +#if $1-$2 < 0 +#error $1-$2 is negative +#endif],[cf_result=yes],[cf_result=no]) + AC_MSG_RESULT($cf_result) + if test "$cf_result" = no ; then + # perhaps we can override it - try... + CPPFLAGS="$CPPFLAGS -D$1=$2" + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PRG_RULES version: 2 updated: 2021/01/01 13:31:04 +dnl ------------ +dnl Append definitions and rules for the given programs to the subdirectory +dnl Makefiles, and the recursion rule for the top-level Makefile. +dnl +dnl parameters +dnl $1 = script to run +dnl $2 = list of subdirectories +dnl +dnl variables +dnl $AWK +AC_DEFUN([CF_PRG_RULES], +[ +for cf_dir in $2 +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + elif test -f "$srcdir/$cf_dir/programs" ; then + $AWK -f $1 "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile + fi +done + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_AR version: 1 updated: 2009/01/01 20:15:22 +dnl ---------- +dnl Check for archiver "ar". +AC_DEFUN([CF_PROG_AR],[ +AC_CHECK_TOOL(AR, ar, ar) +]) +dnl --------------------------------------------------------------------------- +dnl CF_PROG_AWK version: 1 updated: 2006/09/16 11:40:59 +dnl ----------- +dnl Check for awk, ensure that the check found something. +AC_DEFUN([CF_PROG_AWK], +[ +AC_PROG_AWK +test -z "$AWK" && AC_MSG_ERROR(No awk program found) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54 +dnl ---------- +dnl standard check for CC, plus followup sanity checks +dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name +AC_DEFUN([CF_PROG_CC],[ +CF_ACVERSION_CHECK(2.53, + [AC_MSG_WARN(this will incorrectly handle gnatgcc choice) + AC_REQUIRE([AC_PROG_CC])], + []) +ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)]) +CF_GCC_VERSION +CF_ACVERSION_CHECK(2.52, + [AC_PROG_CC_STDC], + [CF_ANSI_CC_REQD]) +CF_CC_ENV_FLAGS +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_CC_C_O version: 6 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Analogous to AC_PROG_CC_C_O, but more useful: tests only $CC, ensures that +dnl the output file can be renamed, and allows for a shell variable that can +dnl be used later. The parameter is either CC or CXX. The result is the +dnl cache variable: +dnl $cf_cv_prog_CC_c_o +dnl $cf_cv_prog_CXX_c_o +dnl +dnl $1 = compiler +dnl $2 = compiler options, if any +AC_DEFUN([CF_PROG_CC_C_O], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_MSG_CHECKING([whether [$]$1 understands -c and -o together]) +AC_CACHE_VAL(cf_cv_prog_$1_c_o, +[ +cat > conftest.$ac_ext <&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1` + test -n "$cf_gprconfig_value" && break + done + else + cf_gprconfig_param=$cf_gprconfig + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&AC_FD_CC | ${AWK:-awk} '/^\*/{print [$]3;}' | head -n 1` + fi + if test -n "$cf_gprconfig_value" + then + eval "cf_ada_config_[$]cf_gprconfig=[$]cf_gprconfig_value" + AC_MSG_RESULT($cf_gprconfig_value) + else + AC_MSG_RESULT(missing) + cf_ada_config="#" + break + fi + done + cd .. + rm -rf ./conftest* ./*~conftest* + fi + fi + if test "x$cf_ada_config" != "x#" + then + CF_GNAT_VERSION + CF_CHECK_GNAT_VERSION + AC_CHECK_PROG(M4_exists, m4, yes, no) + if test "$ac_cv_prog_M4_exists" = no; then + cf_cv_prog_gnat_correct=no + AC_MSG_WARN(Ada95 binding required program m4 not found. Ada95 binding disabled) + fi + if test "$cf_cv_prog_gnat_correct" = yes; then + AC_MSG_CHECKING(if GNAT works) + CF_GNAT_TRY_RUN([procedure conftest;], +[with Text_IO; +with GNAT.OS_Lib; +procedure conftest is +begin + Text_IO.Put ("Hello World"); + Text_IO.New_Line; + GNAT.OS_Lib.OS_Exit (0); +end conftest;], +[cf_cv_prog_gnat_correct=yes], +[cf_cv_prog_gnat_correct=no]) + AC_MSG_RESULT($cf_cv_prog_gnat_correct) + fi + else + cf_cv_prog_gnat_correct=no + fi +fi + +AC_SUBST(cf_ada_make) +AC_SUBST(cf_ada_config) +AC_SUBST(cf_ada_config_Ada) +AC_SUBST(cf_ada_config_C) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_INSTALL version: 11 updated: 2024/08/03 13:08:58 +dnl --------------- +dnl Force $INSTALL to be an absolute-path. Otherwise, edit_man.sh and the +dnl misc/tabset install won't work properly. Usually this happens only when +dnl using the fallback mkinstalldirs script +AC_DEFUN([CF_PROG_INSTALL], +[AC_PROG_INSTALL +AC_REQUIRE([CF_GLOB_FULLPATH])dnl +case x$INSTALL in +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(*) + CF_DIRNAME(cf_dir,$INSTALL) + test -z "$cf_dir" && cf_dir=. + INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LDCONFIG version: 5 updated: 2015/04/18 08:56:57 +dnl ---------------- +dnl Check for ldconfig, needed to fixup shared libraries that would be built +dnl and then used in the install. +AC_DEFUN([CF_PROG_LDCONFIG],[ +if test "$cross_compiling" = yes ; then + LDCONFIG=: +else + case "$cf_cv_system_name" in + (dragonfly*|mirbsd*|freebsd*) + test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R" + ;; + (*) LDPATH=$PATH:/sbin:/usr/sbin + AC_PATH_PROG(LDCONFIG,ldconfig,,$LDPATH) + ;; + esac +fi +AC_SUBST(LDCONFIG) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13 +dnl ------------ +AC_DEFUN([CF_PROG_LINT], +[ +AC_CHECK_PROGS(LINT, lint cppcheck splint) +case "x$LINT" in +(xcppcheck|x*/cppcheck) + test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" + ;; +esac +AC_SUBST(LINT_OPTS) +AC_SUBST(LINT_LIBS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LN_S version: 2 updated: 2010/08/14 18:25:37 +dnl ------------ +dnl Combine checks for "ln -s" and "ln -sf", updating $LN_S to include "-f" +dnl option if it is supported. +AC_DEFUN([CF_PROG_LN_S],[ +AC_PROG_LN_S +AC_MSG_CHECKING(if $LN_S -f options work) + +rm -f conf$$.src conf$$dst +echo >conf$$.dst +echo first >conf$$.src +if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then + cf_prog_ln_sf=yes +else + cf_prog_ln_sf=no +fi +rm -f conf$$.dst conf$$src +AC_MSG_RESULT($cf_prog_ln_sf) + +test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REGEX version: 18 updated: 2021/01/01 16:53:59 +dnl -------- +dnl Attempt to determine if we've got one of the flavors of regular-expression +dnl code that we can support. +AC_DEFUN([CF_REGEX], +[ + +cf_regex_func=no +cf_regex_libs= +case "$host_os" in +(mingw*) + # -lsystre -ltre -lintl -liconv + AC_CHECK_LIB(systre,regcomp,[ + AC_CHECK_LIB(iconv,libiconv_open,[CF_ADD_LIB(iconv)]) + AC_CHECK_LIB(intl,libintl_gettext,[CF_ADD_LIB(intl)]) + AC_CHECK_LIB(tre,tre_regcomp,[CF_ADD_LIB(tre)]) + CF_ADD_LIB(systre) + cf_regex_func=regcomp + ],[ + AC_CHECK_LIB(gnurx,regcomp,[ + CF_ADD_LIB(gnurx) + cf_regex_func=regcomp]) + ]) + ;; +(*) + cf_regex_libs="regex re" + AC_CHECK_FUNC(regcomp,[cf_regex_func=regcomp],[ + for cf_regex_lib in $cf_regex_libs + do + AC_CHECK_LIB($cf_regex_lib,regcomp,[ + CF_ADD_LIB($cf_regex_lib) + cf_regex_func=regcomp + break]) + done + ]) + ;; +esac + +if test "$cf_regex_func" = no ; then + AC_CHECK_FUNC(compile,[cf_regex_func=compile],[ + AC_CHECK_LIB(gen,compile,[ + CF_ADD_LIB(gen) + cf_regex_func=compile])]) +fi + +if test "$cf_regex_func" = no ; then + AC_MSG_WARN(cannot find regular expression library) +fi + +AC_CACHE_CHECK(for regular-expression headers,cf_cv_regex_hdrs,[ + +cf_cv_regex_hdrs=no +case "$cf_regex_func" in +(compile) + for cf_regex_hdr in regexp.h regexpr.h + do + AC_TRY_LINK([#include <$cf_regex_hdr>],[ + char *p = compile("", "", "", 0); + int x = step("", ""); + (void)p; + (void)x; + ],[ + cf_cv_regex_hdrs=$cf_regex_hdr + break + ]) + done + ;; +(*) + for cf_regex_hdr in regex.h + do + AC_TRY_LINK([#include +#include <$cf_regex_hdr>],[ + regex_t *p = 0; + int x = regcomp(p, "", 0); + int y = regexec(p, "", 0, 0, 0); + (void)x; + (void)y; + regfree(p); + ],[ + cf_cv_regex_hdrs=$cf_regex_hdr + break + ]) + done + ;; +esac + +]) + +case "$cf_cv_regex_hdrs" in + (no) AC_MSG_WARN(no regular expression header found) ;; + (regex.h) AC_DEFINE(HAVE_REGEX_H_FUNCS,1,[Define to 1 to include regex.h for regular expressions]) ;; + (regexp.h) AC_DEFINE(HAVE_REGEXP_H_FUNCS,1,[Define to 1 to include regexp.h for regular expressions]) ;; + (regexpr.h) AC_DEFINE(HAVE_REGEXPR_H_FUNCS,1,[Define to 1 to include regexpr.h for regular expressions]) ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40 +dnl ---------------- +dnl Remove a given option from CFLAGS/CPPFLAGS +dnl $1 = option to remove +dnl $2 = variable to update +dnl $3 = nonempty to allow verbose message +define([CF_REMOVE_CFLAGS], +[ +cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ ]][[ ]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ ]][[^ ]]*\\)\?%%" -e 's/^[[ ]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'` + test "[$]$2" != "$cf_old_cflag" || break + ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)]) + $2="$cf_old_cflag" +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 +dnl ---------------- +dnl Remove all -U and -D options that refer to the given symbol from a list +dnl of C compiler options. This works around the problem that not all +dnl compilers process -U and -D options from left-to-right, so a -U option +dnl cannot be used to cancel the effect of a preceding -D option. +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = symbol to remove +define([CF_REMOVE_DEFINE], +[ +$1=`echo "$2" | \ + sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ + -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_LIB version: 1 updated: 2007/02/17 14:11:52 +dnl ------------- +dnl Remove the given library from the symbol +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = library to remove +define([CF_REMOVE_LIB], +[ +# remove $3 library from $2 +$1=`echo "$2" | sed -e 's/-l$3[[ ]]//g' -e 's/-l$3[$]//'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45 +dnl --------------------- +dnl Restore flags saved in CF_SAVE_XTRA_FLAGS +dnl $1 = name of current macro +define([CF_RESTORE_XTRA_FLAGS], +[ +LIBS="$cf_save_LIBS_$1" +CFLAGS="$cf_save_CFLAGS_$1" +CPPFLAGS="$cf_save_CPPFLAGS_$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RPATH_HACK version: 13 updated: 2021/01/03 18:30:50 +dnl ------------- +AC_DEFUN([CF_RPATH_HACK], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([CF_LD_RPATH_OPT])dnl + +AC_MSG_CHECKING(for updated LDFLAGS) +if test -n "$LD_RPATH_OPT" ; then + AC_MSG_RESULT(maybe) + + AC_CHECK_PROGS(cf_ldd_prog,ldd,no) + cf_rpath_list="/usr/lib /lib" + if test "$cf_ldd_prog" != no + then + cf_rpath_oops= + +AC_TRY_LINK([#include ], + [printf("Hello");], + [cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq` + cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort | uniq`]) + + # If we passed the link-test, but get a "not found" on a given library, + # this could be due to inept reconfiguration of gcc to make it only + # partly honor /usr/local/lib (or whatever). Sometimes this behavior + # is intentional, e.g., installing gcc in /usr/bin and suppressing the + # /usr/local libraries. + if test -n "$cf_rpath_oops" + then + for cf_rpath_src in $cf_rpath_oops + do + for cf_rpath_dir in \ + /usr/local \ + /usr/pkg \ + /opt/sfw + do + if test -f "$cf_rpath_dir/lib/$cf_rpath_src" + then + CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src) + LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib" + break + fi + done + done + fi + fi + + CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS) + + CF_RPATH_HACK_2(LDFLAGS) + CF_RPATH_HACK_2(LIBS) + + CF_VERBOSE(...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS) +else + AC_MSG_RESULT(no) +fi +AC_SUBST(EXTRA_LDFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RPATH_HACK_2 version: 8 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Do one set of substitutions for CF_RPATH_HACK, adding an rpath option to +dnl EXTRA_LDFLAGS for each -L option found. +dnl +dnl $cf_rpath_list contains a list of directories to ignore. +dnl +dnl $1 = variable name to update. The LDFLAGS variable should be the only one, +dnl but LIBS often has misplaced -L options. +AC_DEFUN([CF_RPATH_HACK_2], +[ +CF_VERBOSE(...checking $1 [$]$1) + +cf_rpath_dst= +for cf_rpath_src in [$]$1 +do + case "$cf_rpath_src" in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + CF_VERBOSE(...Filter $cf_rpath_src ->$cf_rpath_tmp) + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +$1=$cf_rpath_dst + +CF_VERBOSE(...checked $1 [$]$1) +AC_SUBST(EXTRA_LDFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44 +dnl ------------------ +dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers +dnl and libraries which do not update those variables. +dnl +dnl $1 = name of current macro +define([CF_SAVE_XTRA_FLAGS], +[ +cf_save_LIBS_$1="$LIBS" +cf_save_CFLAGS_$1="$CFLAGS" +cf_save_CPPFLAGS_$1="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[[IUD]]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SHARED_OPTS version: 111 updated: 2024/03/29 20:08:49 +dnl -------------- +dnl -------------- +dnl Attempt to determine the appropriate CC/LD options for creating a shared +dnl library. +dnl +dnl Notes: +dnl a) ${LOCAL_LDFLAGS} is used to link executables that will run within +dnl the build-tree, i.e., by making use of the libraries that are compiled in +dnl $rel_builddir/lib We avoid compiling-in a $rel_builddir/lib path for the +dnl shared library since that can lead to unexpected results at runtime. +dnl b) ${LOCAL_LDFLAGS2} has the same intention but assumes that the shared +dnl libraries are compiled in ../../lib +dnl +dnl The variable 'cf_cv_do_symlinks' is used to control whether we configure +dnl to install symbolic links to the rel/abi versions of shared libraries. +dnl +dnl The variable 'cf_cv_shlib_version' controls whether we use the rel or abi +dnl version when making symbolic links. +dnl +dnl The variable 'cf_cv_shlib_version_infix' controls whether shared library +dnl version numbers are infix (ex: libncurses..dylib) or postfix +dnl (ex: libncurses.so.). +dnl +dnl Some loaders leave 'so_locations' lying around. It is nice to clean up. +AC_DEFUN([CF_SHARED_OPTS], +[ + AC_REQUIRE([CF_LD_RPATH_OPT]) + + RM_SHARED_OPTS= + LOCAL_LDFLAGS= + LOCAL_LDFLAGS2= + LD_SHARED_OPTS= + INSTALL_LIB="-m 644" + : ${rel_builddir:=.} + + shlibdir=$libdir + AC_SUBST(shlibdir) + + MAKE_DLLS="#" + AC_SUBST(MAKE_DLLS) + + cf_cv_do_symlinks=no + cf_ld_rpath_opt= + test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT" + + AC_MSG_CHECKING(whether to use release or ABI version in shared library file names) + AC_ARG_WITH(shlib-version, + [[ --with-shlib-version[={rel|abi}] use release or ABI version in shared library file names]], + [test -z "$withval" && withval=auto + case "$withval" in + (yes) + cf_cv_shlib_version=auto + ;; + (rel|abi|auto) + cf_cv_shlib_version=$withval + ;; + (*) + AC_MSG_RESULT($withval) + AC_MSG_ERROR([option value must be one of: rel, abi, or auto]) + ;; + esac + ],[cf_cv_shlib_version=auto]) + AC_MSG_RESULT($cf_cv_shlib_version) + + cf_cv_rm_so_locs=no + cf_try_cflags= + + # Some less-capable ports of gcc support only -fpic + CC_SHARED_OPTS= + + cf_try_fPIC=no + if test "$GCC" = yes + then + cf_try_fPIC=yes + else + case "$cf_cv_system_name" in + (*linux*) # e.g., PGI compiler + cf_try_fPIC=yes + ;; + esac + fi + + if test "$cf_try_fPIC" = yes + then + AC_MSG_CHECKING(which $CC option to use) + cf_save_CFLAGS="$CFLAGS" + for CC_SHARED_OPTS in -fPIC -fpic '' + do + CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS" + AC_TRY_COMPILE([#include ],[int x = 1; (void)x],[break],[]) + done + AC_MSG_RESULT($CC_SHARED_OPTS) + CFLAGS="$cf_save_CFLAGS" + fi + + cf_cv_shlib_version_infix=no + + case "$cf_cv_system_name" in + (aix4.[3-9]*|aix[[5-7]]*) + if test "$GCC" = yes; then + CC_SHARED_OPTS='-Wl,-brtl' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@' + else + CC_SHARED_OPTS='-brtl' + # as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o [$]@' + fi + ;; + (beos*) + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $[@] -Xlinker -soname=`basename $[@]` -nostart -e 0' + ;; + (cygwin*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=cygdll + cf_cv_shlib_version_infix=cygdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/cyg/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \[$]SHARED_LIB + ** IMPORT_LIB \[$]IMPORT_LIB +EOF + exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (msys*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=msysdll + cf_cv_shlib_version_infix=msysdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/msys-/lib/' -e 's/[[0-9]]*\.dll[$]/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \[$]SHARED_LIB + ** IMPORT_LIB \[$]IMPORT_LIB +EOF + exec \[$]* ${LDFLAGS} -shared -Wl,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (darwin*) + cf_try_cflags="no-cpp-precomp" + CC_SHARED_OPTS="-dynamic" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $[@]` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $[@]' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi + cf_cv_shlib_version_infix=yes + AC_CACHE_CHECK([if ld -search_paths_first works], cf_cv_ldflags_search_paths_first, [ + cf_save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + AC_TRY_LINK(, [int i;], cf_cv_ldflags_search_paths_first=yes, cf_cv_ldflags_search_paths_first=no) + LDFLAGS=$cf_save_LDFLAGS]) + if test "$cf_cv_ldflags_search_paths_first" = yes; then + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + fi + ;; + (haiku*) + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (hpux[[7-8]]*) + # HP-UX 8.07 ld lacks "+b" option used for libdir search-list + if test "$GCC" != yes; then + CC_SHARED_OPTS='+Z' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $[@]' + INSTALL_LIB="-m 555" + ;; + (hpux*) + # (tested with gcc 2.7.2 -- I don't have c89) + if test "$GCC" = yes; then + LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}' + else + CC_SHARED_OPTS='+Z' + LD_SHARED_OPTS='-Wl,+b,${libdir}' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $[@]' + # HP-UX shared libraries must be executable, and should be + # readonly to exploit a quirk in the memory manager. + INSTALL_LIB="-m 555" + ;; + (interix*) + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}' + else + cf_shared_soname='`basename $[@]`' + fi + CC_SHARED_OPTS= + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $[@]' + ;; + (irix*) + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + # tested with IRIX 5.2 and 'cc'. + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $[@]` -o $[@]' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $[@]` -o $[@]' + fi + cf_cv_rm_so_locs=yes + ;; + (linux*|gnu*|k*bsd*-gnu) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (mingw*msvc*) + cf_cv_shlib_version=msvcdll + cf_cv_shlib_version_infix=msvcdll + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-link -dll" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ ${LD} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.lib/'\` + shift + my_ld=\[$]1 + shift + cat <<-EOF + Linking shared library + ** SHARED LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + args=\$(echo \[$]* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g") + exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args + mv "\${IMPORT_LIB}" "\${IMPORT_LIB}" +CF_EOF + chmod +x mk_shared_lib.sh + cat >mk_prog.sh <<-CF_EOF + #!$SHELL + shift + # Ignore first argument (compiler) and use LD (link.exe) unconditionally + LD="[$]LD" + clopts=() + ldopts=("/subsystem:console") + libs=() + isdll=0 + while test \[$]# -gt 0; do + case "\[$]1" in + -link) + # ignore -link argument + ;; + -M[[TD]] | -M[[TD]]d) + # ignore runtime-library option + ;; + -dll) + isdll=1 + ;; + -W* | -w*) + # ignore warnings + ;; + -D*) + clopts+=("\[$]1") + ;; + -I*) + clopts+=("\[$]1") + ;; + -l*) + libs+=("\`echo \"\[$]1\" | sed \"s/^-l//\"\`") + ;; + -L*) + ldopts+=("\`echo \"\[$]1\" | sed \"s/^-L/-LIBPATH:/\"\`") + ;; + *.obj | *.o) + ldopts+=("\[$]1") + ;; + -Wl,*) + for linkarg in \`echo '\[$]1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do + ldopts+=("\[$]{linkarg}") + done + ;; + *.lib) + ldopts+=("\[$]1") + ;; + -o) + shift + ldopts+=("-out:\[$]1") + ;; + *) + clopts+=("\[$]1") + ldopts+=("\[$]1") + ;; + esac + shift + done + if [[ "\$isdll" -ne 0 ]]; then + for lib in \[$]{libs[[*]]}; do + ldopts+=("\[$]lib.dll.lib") + done + else + for lib in \[$]{libs[[*]]}; do + ldopts+=("\[$]lib.lib") + done + fi + cat <<-EOF + Creating program + ** ld options: "\[$]{ldopts[[@]]}" +EOF + exec \[$]LD \[$]{ldopts[[@]]} +CF_EOF + chmod +x mk_prog.sh + LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh" + LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh" + ;; + (mingw*) + cf_cv_shlib_version=mingw + cf_cv_shlib_version_infix=mingw + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-Wl,--enable-auto-import" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh [$]@ [$]{CC} [$]{CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\[$]1 + IMPORT_LIB=\`echo "\[$]1" | sed -e 's/[[0-9]]*\.dll[$]/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \[$]SHARED_LIB + ** IMPORT_LIB \[$]IMPORT_LIB +EOF + exec \[$]* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\[$]{IMPORT_LIB} -Wl,--export-all-symbols -o \[$]{SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (openbsd[[2-9]].*|mirbsd*) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (nskJ*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $[@]' + ;; + (nskL*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $[@]' + ;; + (nto-qnx*|openbsd*|freebsd[[12]].*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $[@]' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (dragonfly*|freebsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $[@]' + ;; + (netbsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + if test "$cf_cv_shlib_version" = auto; then + if test -f /usr/libexec/ld.elf_so; then + cf_cv_shlib_version=abi + else + cf_cv_shlib_version=rel + fi + fi + CF_SHARED_SONAME + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $[@]' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $[@]' + fi + ;; + (osf*|mls+*) + # tested with OSF/1 V3.2 and 'cc' + # tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't + # link with shared libs). + MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $[@]`' + case "$host_os" in + (osf4*) + MK_SHARED_LIB="${MK_SHARED_LIB} -msym" + ;; + esac + MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $[@]' + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + cf_cv_rm_so_locs=yes + ;; + (sco3.2v5*) # also uw2* and UW7: hops 13-Apr-98 + # tested with osr5.0.5 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-belf -KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $[@] .${REL_VERSION}`.${ABI_VERSION} -o [$]@' + if test "$cf_cv_enable_rpath" = yes ; then + # only way is to set LD_RUN_PATH but no switch for it + RUN_PATH=$libdir + fi + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + LINK_PROGS='LD_RUN_PATH=${libdir}' + LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib' + ;; + (sunos4*) + # tested with SunOS 4.1.1 and gcc 2.7.0 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $[@]' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (solaris2*) + # tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2 + # tested with SunOS 5.10 (solaris 10) and gcc 3.4.3 + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-R\$(LOCAL_LIBDIR):\${libdir}" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="-R\${libdir} $EXTRA_LDFLAGS" + fi + CF_SHARED_SONAME + if test "$GCC" != yes; then + cf_save_CFLAGS="$CFLAGS" + for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O + do + CFLAGS="$cf_shared_opts $cf_save_CFLAGS" + AC_TRY_COMPILE([#include ],[printf("Hello\\n");],[break]) + done + CFLAGS="$cf_save_CFLAGS" + CC_SHARED_OPTS=$cf_shared_opts + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $[@]' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $[@]' + fi + ;; + (sysv5uw7*|unix_sv*) + # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o [$]@' + ;; + (*) + CC_SHARED_OPTS='unknown' + MK_SHARED_LIB='echo unknown' + ;; + esac + + # This works if the last tokens in $MK_SHARED_LIB are the -o target. + case "$cf_cv_shlib_version" in + (rel|abi) + case "$MK_SHARED_LIB" in + (*'-o $[@]') + test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes + ;; + (*) + AC_MSG_WARN(ignored --with-shlib-version) + ;; + esac + ;; + esac + + if test -n "$cf_try_cflags" + then +cat > conftest.$ac_ext < +int main(int argc, char *argv[[]]) +{ + printf("hello\\n"); + return (argv[[argc-1]] == 0) ; +} +EOF + cf_save_CFLAGS="$CFLAGS" + for cf_opt in $cf_try_cflags + do + CFLAGS="$cf_save_CFLAGS -$cf_opt" + AC_MSG_CHECKING(if CFLAGS option -$cf_opt works) + if AC_TRY_EVAL(ac_compile); then + AC_MSG_RESULT(yes) + cf_save_CFLAGS="$CFLAGS" + else + AC_MSG_RESULT(no) + fi + done + CFLAGS="$cf_save_CFLAGS" + fi + + + # RPATH_LIST is a colon-separated list of directories + test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}" + test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}" + + test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations" + + CF_VERBOSE(CC_SHARED_OPTS: $CC_SHARED_OPTS) + CF_VERBOSE(MK_SHARED_LIB: $MK_SHARED_LIB) + + AC_SUBST(CC_SHARED_OPTS) + AC_SUBST(LD_RPATH_OPT) + AC_SUBST(LD_SHARED_OPTS) + AC_SUBST(MK_SHARED_LIB) + AC_SUBST(RM_SHARED_OPTS) + + AC_SUBST(LINK_PROGS) + AC_SUBST(LINK_TESTS) + + AC_SUBST(EXTRA_LDFLAGS) + AC_SUBST(LOCAL_LDFLAGS) + AC_SUBST(LOCAL_LDFLAGS2) + + AC_SUBST(INSTALL_LIB) + AC_SUBST(RPATH_LIST) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SHARED_SONAME version: 3 updated: 2008/09/08 18:34:43 +dnl ---------------- +dnl utility macro for CF_SHARED_OPTS, constructs "$cf_cv_shared_soname" for +dnl substitution into MK_SHARED_LIB string for the "-soname" (or similar) +dnl option. +dnl +dnl $1 is the default that should be used for "$cf_cv_shlib_version". +dnl If missing, use "rel". +define([CF_SHARED_SONAME], +[ + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=ifelse($1,,rel,$1) + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $[@] .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $[@]`' + fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_SIGWINCH version: 7 updated: 2023/02/18 17:41:25 +dnl ----------- +dnl Use this macro after CF_XOPEN_SOURCE, but do not require it (not all +dnl programs need this test). +dnl +dnl This is really a Mac OS X 10.4.3 workaround. Defining _POSIX_C_SOURCE +dnl forces SIGWINCH to be undefined (breaks xterm, ncurses). Oddly, the struct +dnl winsize declaration is left alone - we may revisit this if Apple choose to +dnl break that part of the interface as well. +AC_DEFUN([CF_SIGWINCH], +[ +AC_CACHE_CHECK(if SIGWINCH is defined,cf_cv_define_sigwinch,[ + AC_TRY_COMPILE([ +#include +#include +],[int x = SIGWINCH; (void)x], + [cf_cv_define_sigwinch=yes], + [AC_TRY_COMPILE([ +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include +],[int x = SIGWINCH; (void)x], + [cf_cv_define_sigwinch=maybe], + [cf_cv_define_sigwinch=no]) +]) +]) + +if test "$cf_cv_define_sigwinch" = maybe ; then +AC_CACHE_CHECK(for actual SIGWINCH definition,cf_cv_fixup_sigwinch,[ +cf_cv_fixup_sigwinch=unknown +cf_sigwinch=32 +while test "$cf_sigwinch" != 1 +do + AC_TRY_COMPILE([ +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include +],[ +#if SIGWINCH != $cf_sigwinch +#error SIGWINCH is not $cf_sigwinch +#endif +int x = SIGWINCH; (void)x], + [cf_cv_fixup_sigwinch=$cf_sigwinch + break]) + +cf_sigwinch="`expr "$cf_sigwinch" - 1`" +done +]) + + if test "$cf_cv_fixup_sigwinch" != unknown ; then + CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch" + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SIG_ATOMIC_T version: 5 updated: 2020/03/10 18:53:47 +dnl --------------- +dnl signal handler, but there are some gcc dependencies in that recommendation. +dnl Try anyway. +AC_DEFUN([CF_SIG_ATOMIC_T], +[ +AC_MSG_CHECKING(for signal global datatype) +AC_CACHE_VAL(cf_cv_sig_atomic_t,[ + for cf_type in \ + "volatile sig_atomic_t" \ + "sig_atomic_t" \ + "int" + do + AC_TRY_COMPILE([ +#include +#include +#include + +extern $cf_type x; +$cf_type x; +static void handler(int sig) +{ + (void)sig; + x = 5; +}], + [signal(SIGINT, handler); + x = 1], + [cf_cv_sig_atomic_t=$cf_type], + [cf_cv_sig_atomic_t=no]) + test "$cf_cv_sig_atomic_t" != no && break + done + ]) +AC_MSG_RESULT($cf_cv_sig_atomic_t) +test "$cf_cv_sig_atomic_t" != no && AC_DEFINE_UNQUOTED(SIG_ATOMIC_T, $cf_cv_sig_atomic_t,[Define to signal global datatype]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SIZECHANGE version: 18 updated: 2021/09/04 06:35:04 +dnl ------------- +dnl Check for definitions & structures needed for window size-changing +dnl +dnl https://stackoverflow.com/questions/18878141/difference-between-structures-ttysize-and-winsize/50769952#50769952 +AC_DEFUN([CF_SIZECHANGE], +[ +AC_REQUIRE([CF_STRUCT_TERMIOS]) +AC_CACHE_CHECK(declaration of size-change, cf_cv_sizechange,[ + cf_cv_sizechange=unknown + cf_save_CPPFLAGS="$CPPFLAGS" + +for cf_opts in "" "NEED_PTEM_H" +do + + CPPFLAGS="$cf_save_CPPFLAGS" + if test -n "$cf_opts" + then + CF_APPEND_TEXT(CPPFLAGS,-D$cf_opts) + fi + AC_TRY_COMPILE([#include +#ifdef HAVE_TERMIOS_H +#include +#else +#ifdef HAVE_TERMIO_H +#include +#endif +#endif + +#ifdef NEED_PTEM_H +/* This is a workaround for SCO: they neglected to define struct winsize in + * termios.h -- it is only in termio.h and ptem.h + */ +#include +#include +#endif + +#ifdef HAVE_SYS_IOCTL_H +#include +#endif +],[ +#ifdef TIOCGSIZE + struct ttysize win; /* SunOS 3.0... */ + int y = win.ts_lines = 2; + int x = win.ts_cols = 1; + (void)y; + (void)x; +#else +#ifdef TIOCGWINSZ + struct winsize win; /* everything else */ + int y = win.ws_row = 2; + int x = win.ws_col = 1; + (void)y; + (void)x; +#else + no TIOCGSIZE or TIOCGWINSZ +#endif /* TIOCGWINSZ */ +#endif /* TIOCGSIZE */ + ], + [cf_cv_sizechange=yes], + [cf_cv_sizechange=no]) + + CPPFLAGS="$cf_save_CPPFLAGS" + if test "$cf_cv_sizechange" = yes ; then + echo "size-change succeeded ($cf_opts)" >&AC_FD_CC + test -n "$cf_opts" && cf_cv_sizechange="$cf_opts" + break + fi +done +]) +if test "$cf_cv_sizechange" != no ; then + AC_DEFINE(HAVE_SIZECHANGE,1,[Define to 1 if sizechange declarations are provided]) + case "$cf_cv_sizechange" in + (NEED*) + AC_DEFINE_UNQUOTED($cf_cv_sizechange ) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SRC_MODULES version: 34 updated: 2023/04/22 11:51:06 +dnl -------------- +dnl For each parameter, test if the source-directory exists, and if it contains +dnl a 'modules' file. If so, add to the list $cf_cv_src_modules which we'll +dnl use in CF_LIB_RULES. +dnl +dnl This uses the configured value to make the lists SRC_SUBDIRS and +dnl SUB_MAKEFILES which are used in the makefile-generation scheme. +AC_DEFUN([CF_SRC_MODULES], +[ +AC_REQUIRE([CF_CHECK_GNAT_VERSION]) +AC_MSG_CHECKING(for src modules) + +# dependencies and linker-arguments for test-programs +TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS" +TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEP2" +if test "$DFT_LWR_MODEL" = "libtool"; then + TEST_ARGS="${TEST_DEPS}" + TEST_ARG2="${TEST_DEP2}" +else + TEST_ARGS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS" + TEST_ARG2="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARG2" +fi + +PC_MODULES_TO_MAKE="ncurses${USE_ARG_SUFFIX}" +cf_cv_src_modules= +for cf_dir in $1 +do + if test -f "$srcdir/$cf_dir/modules" ; then + + if test -z "$cf_cv_src_modules"; then + cf_cv_src_modules=$cf_dir + else + cf_cv_src_modules="$cf_cv_src_modules $cf_dir" + fi + + # Make the ncurses_cfg.h file record the library interface files as + # well. These are header files that are the same name as their + # directory. Ncurses is the only library that does not follow + # that pattern. + if test -f "$srcdir/${cf_dir}/${cf_dir}.h" ; then + CF_UPPER(cf_have_include,$cf_dir) + AC_DEFINE_UNQUOTED(HAVE_${cf_have_include}_H) + AC_DEFINE_UNQUOTED(HAVE_LIB${cf_have_include}) + CF_MAP_LIB_BASENAME(TEST_ROOT,$cf_dir) + TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEPS" + TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TEST_ROOT}${DFT_DEP_SUFFIX} $TEST_DEP2" + if test "$DFT_LWR_MODEL" = "libtool"; then + TEST_ARGS="${TEST_DEPS}" + TEST_ARG2="${TEST_DEP2}" + else + TEST_ARGS="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARGS" + TEST_ARG2="-l${TEST_ROOT}${USE_ARG_SUFFIX} $TEST_ARG2" + fi + PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ${cf_dir}${USE_ARG_SUFFIX}" + fi + fi +done +AC_MSG_RESULT($cf_cv_src_modules) + +TEST_ARGS="-L${LIB_DIR} $TEST_ARGS" +TEST_ARG2="-L${LIB_2ND} $TEST_ARG2" + +AC_SUBST(TEST_ARGS) +AC_SUBST(TEST_DEPS) + +AC_SUBST(TEST_ARG2) +AC_SUBST(TEST_DEP2) + +SRC_SUBDIRS= +if test "x$cf_with_manpages" != xno ; then + SRC_SUBDIRS="$SRC_SUBDIRS man" +fi +SRC_SUBDIRS="$SRC_SUBDIRS include" +for cf_dir in $cf_cv_src_modules +do + SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir" +done +if test "x$cf_with_tests" != "xno" ; then + SRC_SUBDIRS="$SRC_SUBDIRS test" +fi +# always make this, to install the ncurses-config script +SRC_SUBDIRS="$SRC_SUBDIRS misc" +if test "$cf_with_cxx_binding" != no; then + PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ncurses++${USE_ARG_SUFFIX}" + SRC_SUBDIRS="$SRC_SUBDIRS c++" +fi + +test "x$with_termlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TINFO_ARG_SUFFIX" +test "x$with_ticlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TICS_ARG_SUFFIX" + +AC_SUBST(PC_MODULES_TO_MAKE) + +ADA_SUBDIRS= +if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = xyes && test -f "$srcdir/Ada95/Makefile.in" ; then + SRC_SUBDIRS="$SRC_SUBDIRS Ada95" + ADA_SUBDIRS="gen src" + if test "x$cf_with_tests" != "xno" ; then + ADA_SUBDIRS="$ADA_SUBDIRS samples" + fi +fi + +SUB_MAKEFILES= +for cf_dir in $SRC_SUBDIRS +do + SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile" +done + +if test -n "$ADA_SUBDIRS"; then + for cf_dir in $ADA_SUBDIRS + do + SUB_MAKEFILES="$SUB_MAKEFILES Ada95/$cf_dir/Makefile" + done + AC_SUBST(ADA_SUBDIRS) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_STDCPP_LIBRARY version: 12 updated: 2021/01/01 13:31:04 +dnl ----------------- +dnl Check for -lstdc++, which is GNU's standard C++ library. +dnl If $CXXLIBS is set, add that to the libraries used for test-linking. +dnl If -lstdc++ was not already added to $LIBS or $CXXLIBS, and is needed, +dnl add it to $CXXLIBS. +AC_DEFUN([CF_STDCPP_LIBRARY], +[ +if test -n "$GXX" ; then + + cf_save="$LIBS" + LIBS="$LIBS $CXXLIBS" + AC_MSG_CHECKING(if we already have C++ library) + AC_TRY_LINK([ + #include ],[ + std::cout << "Hello World!" << std::endl;], + [cf_have_libstdcpp=yes], + [cf_have_libstdcpp=no]) + AC_MSG_RESULT($cf_have_libstdcpp) + LIBS="$cf_save" + + if test "$cf_have_libstdcpp" != yes + then + case "$cf_cv_system_name" in + (os2*) + if test -z "`g++ -dM -E - < /dev/null | grep __KLIBC__`"; then + cf_stdcpp_libname=stdcpp + else + cf_stdcpp_libname=stdc++ + fi + ;; + (*) + cf_stdcpp_libname=stdc++ + ;; + esac + + AC_CACHE_CHECK(for library $cf_stdcpp_libname,cf_cv_libstdcpp,[ + cf_save="$LIBS" + LIBS="$LIBS $CXXLIBS" + CF_ADD_LIB($cf_stdcpp_libname) + AC_TRY_LINK([ + #include ],[ + std::cout << "Hello World!" << std::endl;], + [cf_cv_libstdcpp=yes], + [cf_cv_libstdcpp=no]) + LIBS="$cf_save" + ]) + test "$cf_cv_libstdcpp" = yes && { CF_ADD_LIB($cf_stdcpp_libname,CXXLIBS) } + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_STRIP_G_OPT version: 4 updated: 2021/01/02 09:31:20 +dnl -------------- +dnl Remove "-g" option from the compiler options +AC_DEFUN([CF_STRIP_G_OPT], +[$1=`echo "${$1}" | CF__SED_TRIMBLANKS(-e 's%-g %%' -e 's%-g$%%')`])dnl +dnl --------------------------------------------------------------------------- +dnl CF_STRUCT_SIGACTION version: 6 updated: 2023/12/03 09:21:34 +dnl ------------------- +dnl Check if we need _POSIX_SOURCE defined to use struct sigaction. We'll only +dnl do this if we've found the sigaction function. +AC_DEFUN([CF_STRUCT_SIGACTION],[ +AC_REQUIRE([CF_XOPEN_SOURCE]) + +if test "$ac_cv_func_sigaction" = yes; then +AC_MSG_CHECKING(whether sigaction needs _POSIX_SOURCE) +AC_TRY_COMPILE([ +#include +#include ], + [struct sigaction act; (void)act], + [sigact_bad=no], + [ +AC_TRY_COMPILE([ +#define _POSIX_SOURCE +#include +#include ], + [struct sigaction act; (void)act], + [sigact_bad=yes + AC_DEFINE(_POSIX_SOURCE,1,[Define to 1 if we must define _POSIX_SOURCE])], + [sigact_bad=unknown])]) +AC_MSG_RESULT($sigact_bad) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_STRUCT_TERMIOS version: 13 updated: 2023/12/03 19:38:54 +dnl ----------------- +dnl Some machines require _POSIX_SOURCE to completely define struct termios. +AC_DEFUN([CF_STRUCT_TERMIOS],[ +AC_REQUIRE([CF_XOPEN_SOURCE]) + +AC_CHECK_HEADERS( \ +termio.h \ +termios.h \ +unistd.h \ +sys/ioctl.h \ +sys/termio.h \ +) + +if test "$ac_cv_header_termios_h" = yes ; then + case "$CFLAGS $CPPFLAGS" in + (*-D_POSIX_SOURCE*) + termios_bad=dunno ;; + (*) termios_bad=maybe ;; + esac + if test "$termios_bad" = maybe ; then + AC_MSG_CHECKING(whether termios.h needs _POSIX_SOURCE) + AC_TRY_COMPILE([#include ], + [struct termios foo; int x = (int)(foo.c_iflag = 1); (void)x], + termios_bad=no, [ + AC_TRY_COMPILE([ +#define _POSIX_SOURCE +#include ], + [struct termios foo; int x = (int)(foo.c_iflag = 2); (void)x], + termios_bad=unknown, + termios_bad=yes AC_DEFINE(_POSIX_SOURCE,1,[Define to 1 if we must define _POSIX_SOURCE])) + ]) + AC_MSG_RESULT($termios_bad) + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06 +dnl -------------- +dnl Construct a search-list for a nonstandard header/lib-file +dnl $1 = the variable to return as result +dnl $2 = the package name +dnl $3 = the subdirectory, e.g., bin, include or lib +AC_DEFUN([CF_SUBDIR_PATH], +[ +$1= + +CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE) + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + [$]HOME +do + CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix) +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SUBST_IF version: 2 updated: 2006/06/17 12:33:03 +dnl ----------- +dnl Shorthand macro for substituting things that the user may override +dnl with an environment variable. +dnl +dnl $1 = condition to pass to "test" +dnl $2 = environment variable +dnl $3 = value if the test succeeds +dnl $4 = value if the test fails +AC_DEFUN([CF_SUBST_IF], +[ +if test $1 ; then + $2=$3 +ifelse($4,,,[else + $2=$4]) +fi +AC_SUBST($2) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SUBST_NCURSES_VERSION version: 11 updated: 2023/01/07 16:32:06 +dnl ------------------------ +dnl Get the version-number for use in shared-library naming, etc. +AC_DEFUN([CF_SUBST_NCURSES_VERSION], +[AC_REQUIRE([AC_PROG_EGREP])dnl + +NCURSES_MAJOR="`${EGREP-egrep} '^NCURSES_MAJOR[[ ]]*=' "$srcdir/dist.mk" | sed -e 's/^[[^0-9]]*//'`" +NCURSES_MINOR="`${EGREP-egrep} '^NCURSES_MINOR[[ ]]*=' "$srcdir/dist.mk" | sed -e 's/^[[^0-9]]*//'`" +NCURSES_PATCH="`${EGREP-egrep} '^NCURSES_PATCH[[ ]]*=' "$srcdir/dist.mk" | sed -e 's/^[[^0-9]]*//'`" +cf_cv_abi_version=${NCURSES_MAJOR} +cf_cv_abi_default=${NCURSES_MAJOR} +cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR} +dnl Show the computed version, for logging +cf_cv_timestamp=`date` +AC_MSG_RESULT(Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_default ($cf_cv_timestamp)) +dnl We need these values in the generated headers +AC_SUBST(NCURSES_MAJOR) +AC_SUBST(NCURSES_MINOR) +AC_SUBST(NCURSES_PATCH) +dnl We need these values in the generated makefiles +AC_SUBST(cf_cv_rel_version) +AC_SUBST(cf_cv_abi_version) +AC_SUBST(cf_cv_abi_default) +AC_SUBST(cf_cv_builtin_bool) +AC_SUBST(cf_cv_header_stdbool_h) +AC_SUBST(cf_cv_type_of_bool)dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SYS_TIME_SELECT version: 6 updated: 2015/04/18 08:56:57 +dnl ------------------ +dnl Check if we can include with ; this breaks on +dnl older SCO configurations. +AC_DEFUN([CF_SYS_TIME_SELECT], +[ +AC_MSG_CHECKING(if sys/time.h works with sys/select.h) +AC_CACHE_VAL(cf_cv_sys_time_select,[ +AC_TRY_COMPILE([ +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +],[],[cf_cv_sys_time_select=yes], + [cf_cv_sys_time_select=no]) + ]) +AC_MSG_RESULT($cf_cv_sys_time_select) +test "$cf_cv_sys_time_select" = yes && AC_DEFINE(HAVE_SYS_TIME_SELECT,1,[Define to 1 if we can include with ]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TOP_BUILDDIR version: 2 updated: 2013/07/27 17:38:32 +dnl --------------- +dnl Define a top_builddir symbol, for applications that need an absolute path. +AC_DEFUN([CF_TOP_BUILDDIR], +[ +top_builddir=ifelse($1,,`pwd`,$1) +AC_SUBST(top_builddir) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TRY_PKG_CONFIG version: 6 updated: 2020/12/31 10:54:15 +dnl ----------------- +dnl This is a simple wrapper to use for pkg-config, for libraries which may be +dnl available in that form. +dnl +dnl $1 = package name, which may be a shell variable +dnl $2 = extra logic to use, if any, after updating CFLAGS and LIBS +dnl $3 = logic to use if pkg-config does not have the package +AC_DEFUN([CF_TRY_PKG_CONFIG],[ +AC_REQUIRE([CF_PKG_CONFIG]) + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$1"; then + CF_VERBOSE(found package $1) + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$1" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "$1" 2>/dev/null`" + CF_VERBOSE(package $1 CFLAGS: $cf_pkgconfig_incs) + CF_VERBOSE(package $1 LIBS: $cf_pkgconfig_libs) + CF_ADD_CFLAGS($cf_pkgconfig_incs) + CF_ADD_LIBS($cf_pkgconfig_libs) + ifelse([$2],,:,[$2]) +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + ifelse([$3],,:,[$3]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16 +dnl ------------------- +dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we +dnl can define it successfully. +AC_DEFUN([CF_TRY_XOPEN_SOURCE],[ +AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[ + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY, + [cf_cv_xopen_source=no], + [cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE) + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY, + [cf_cv_xopen_source=no], + [cf_cv_xopen_source=$cf_XOPEN_SOURCE]) + CPPFLAGS="$cf_save" + ]) +]) + +if test "$cf_cv_xopen_source" != no ; then + CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE) + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE) + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + CF_APPEND_CFLAGS($cf_temp_xopen_source) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_TYPEOF_CHTYPE version: 11 updated: 2023/01/05 17:57:59 +dnl ---------------- +dnl Determine the type we should use for chtype (and attr_t, which is treated +dnl as the same thing). We want around 32 bits, so on most machines want a +dnl long, but on newer 64-bit machines, probably want an int. If we're using +dnl wide characters, we have to have a type compatible with that, as well. +AC_DEFUN([CF_TYPEOF_CHTYPE], +[ +AC_MSG_CHECKING([for type of chtype]) +AC_CACHE_VAL(cf_cv_typeof_chtype,[ + AC_TRY_RUN([ +$ac_includes_default +#define WANT_BITS 31 +int main(void) +{ + FILE *fp = fopen("cf_test.out", "w"); + if (fp != 0) { + char *result = "long"; + if (sizeof(unsigned long) > sizeof(unsigned int)) { + int n; + unsigned int x, y; + for (n = 0; n < WANT_BITS; n++) { + x = (1 << n); + y = (x >> n); + if (y != 1 || x == 0) { + x = 0; + break; + } + } + /* + * If x is nonzero, an int is big enough for the bits + * that we want. + */ + result = (x != 0) ? "int" : "long"; + } + fputs(result, fp); + fclose(fp); + } + ${cf_cv_main_return:-return}(0); +} + ], + [cf_cv_typeof_chtype=`cat cf_test.out`], + [cf_cv_typeof_chtype=long], + [cf_cv_typeof_chtype=long]) + rm -f cf_test.out + ]) +AC_MSG_RESULT($cf_cv_typeof_chtype) + +AC_SUBST(cf_cv_typeof_chtype) +AC_DEFINE_UNQUOTED(TYPEOF_CHTYPE,$cf_cv_typeof_chtype,[Define to actual type if needed for chtype]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TYPE_SIGACTION version: 5 updated: 2023/12/03 09:21:34 +dnl ----------------- +dnl +AC_DEFUN([CF_TYPE_SIGACTION], +[ +AC_MSG_CHECKING([for type sigaction_t]) +AC_CACHE_VAL(cf_cv_type_sigaction,[ + AC_TRY_COMPILE([ +#include ], + [sigaction_t x; (void)x], + [cf_cv_type_sigaction=yes], + [cf_cv_type_sigaction=no])]) +AC_MSG_RESULT($cf_cv_type_sigaction) +test "$cf_cv_type_sigaction" = yes && AC_DEFINE(HAVE_TYPE_SIGACTION,1,[Define to 1 if we have the sigaction_t type]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UNSIGNED_LITERALS version: 3 updated: 2023/12/03 10:02:17 +dnl -------------------- +dnl Test if the compiler supports 'U' and 'L' suffixes. Only old compilers +dnl won't, but they're still there. +AC_DEFUN([CF_UNSIGNED_LITERALS], +[ +AC_MSG_CHECKING([if unsigned literals are legal]) +AC_CACHE_VAL(cf_cv_unsigned_literals,[ + AC_TRY_COMPILE([],[long x = 1L + 1UL + 1U + 1; (void)x], + [cf_cv_unsigned_literals=yes], + [cf_cv_unsigned_literals=no]) + ]) +AC_MSG_RESULT($cf_cv_unsigned_literals) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59 +dnl -------- +dnl Make an uppercase version of a variable +dnl $1=uppercase($2) +AC_DEFUN([CF_UPPER], +[ +$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTF8_LIB version: 11 updated: 2024/08/10 10:23:45 +dnl ----------- +dnl Check for multibyte support, and if not found, utf8 compatibility library +AC_DEFUN([CF_UTF8_LIB], +[ +AC_CHECK_HEADERS(wchar.h) +AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[ + cf_save_LIBS="$LIBS" + AC_TRY_LINK([ +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif +],[putwc(0,0);], + [cf_cv_utf8_lib=yes], + [CF_FIND_LINKAGE([ +#include ],[putwc(0,0);],utf8, + [cf_cv_utf8_lib=add-on], + [cf_cv_utf8_lib=no]) +])]) + +# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between +# ncurses/ncursesw: +if test "$cf_cv_utf8_lib" = "add-on" ; then + AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h]) + CF_ADD_INCDIR($cf_cv_header_path_utf8) + CF_ADD_LIBDIR($cf_cv_library_path_utf8) + CF_ADD_LIBS($cf_cv_library_file_utf8) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_VA_COPY version: 6 updated: 2018/12/04 18:14:25 +dnl ---------- +dnl check for va_copy, part of stdarg.h starting with ISO C 1999. +dnl Also, workaround for glibc's __va_copy, by checking for both. +dnl Finally, try to accommodate pre-ISO C 1999 headers. +AC_DEFUN([CF_VA_COPY],[ +AC_CACHE_CHECK(for va_copy, cf_cv_have_va_copy,[ +AC_TRY_LINK([ +#include +],[ + static va_list dst; + static va_list src; + va_copy(dst, src)], + cf_cv_have_va_copy=yes, + cf_cv_have_va_copy=no)]) + +if test "$cf_cv_have_va_copy" = yes; +then + AC_DEFINE(HAVE_VA_COPY,1,[Define to 1 if we have va_copy]) +else # !cf_cv_have_va_copy + +AC_CACHE_CHECK(for __va_copy, cf_cv_have___va_copy,[ +AC_TRY_LINK([ +#include +],[ + static va_list dst; + static va_list src; + __va_copy(dst, src)], + cf_cv_have___va_copy=yes, + cf_cv_have___va_copy=no)]) + +if test "$cf_cv_have___va_copy" = yes +then + AC_DEFINE(HAVE___VA_COPY,1,[Define to 1 if we have __va_copy]) +else # !cf_cv_have___va_copy + +AC_CACHE_CHECK(for __builtin_va_copy, cf_cv_have___builtin_va_copy,[ +AC_TRY_LINK([ +#include +],[ + static va_list dst; + static va_list src; + __builtin_va_copy(dst, src)], + cf_cv_have___builtin_va_copy=yes, + cf_cv_have___builtin_va_copy=no)]) + +test "$cf_cv_have___builtin_va_copy" = yes && + AC_DEFINE(HAVE___BUILTIN_VA_COPY,1,[Define to 1 if we have __builtin_va_copy]) + +fi # cf_cv_have___va_copy + +fi # cf_cv_have_va_copy + +case "${cf_cv_have_va_copy}${cf_cv_have___va_copy}${cf_cv_have___builtin_va_copy}" in +(*yes*) + ;; + +(*) + AC_CACHE_CHECK(if we can simply copy va_list, cf_cv_pointer_va_list,[ +AC_TRY_LINK([ +#include +],[ + va_list dst; + va_list src; + dst = src], + cf_cv_pointer_va_list=yes, + cf_cv_pointer_va_list=no)]) + + if test "$cf_cv_pointer_va_list" = no + then + AC_CACHE_CHECK(if we can copy va_list indirectly, cf_cv_array_va_list,[ +AC_TRY_LINK([ +#include +],[ + va_list dst; + va_list src; + *dst = *src], + cf_cv_array_va_list=yes, + cf_cv_array_va_list=no)]) + test "$cf_cv_array_va_list" = yes && AC_DEFINE(ARRAY_VA_LIST,1,[Define to 1 if we can copy va_list indirectly]) + fi + ;; +esac +]) +dnl --------------------------------------------------------------------------- +dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12 +dnl ---------- +dnl Use AC_VERBOSE w/o the warnings +AC_DEFUN([CF_VERBOSE], +[test -n "$verbose" && echo " $1" 1>&AC_FD_MSG +CF_MSG_LOG([$1]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_VERSION_INFO version: 9 updated: 2024/06/12 04:04:13 +dnl --------------- +dnl Define several useful symbols derived from the VERSION file. A separate +dnl file is preferred to embedding the version numbers in various scripts. +dnl (automake is a textbook-example of why the latter is a bad idea, but there +dnl are others). +dnl +dnl The file contents are: +dnl libtool-version release-version patch-version +dnl or +dnl release-version +dnl where +dnl libtool-version (see ?) consists of 3 integers separated by '.' +dnl release-version consists of a major version and minor version +dnl separated by '.', optionally followed by a patch-version +dnl separated by '-'. The minor version need not be an +dnl integer (but it is preferred). +dnl patch-version is an integer in the form yyyymmdd, so ifdef's and +dnl scripts can easily compare versions. +dnl +dnl If libtool is used, the first form is required, since CF_WITH_LIBTOOL +dnl simply extracts the first field using 'cut -f1'. +dnl +dnl Optional parameters: +dnl $1 = internal name for package +dnl $2 = external name for package +AC_DEFUN([CF_VERSION_INFO], +[ +if test -f "$srcdir/VERSION" ; then + AC_MSG_CHECKING(for package version) + + # if there are not enough fields, cut returns the last one... + cf_field1=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1` + cf_field2=`sed -e '2,$d' "$srcdir/VERSION" |cut -f2` + cf_field3=`sed -e '2,$d' "$srcdir/VERSION" |cut -f3` + + # this is how CF_BUNDLED_INTL uses $VERSION: + VERSION="$cf_field1" + + VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'` + test -z "$VERSION_MAJOR" && AC_MSG_ERROR(missing major-version) + + VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[[^.]]*\.//' -e 's/-.*//'` + test -z "$VERSION_MINOR" && AC_MSG_ERROR(missing minor-version) + + AC_MSG_RESULT(${VERSION_MAJOR}.${VERSION_MINOR}) + + AC_MSG_CHECKING(for package patch date) + VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[[^-]]*-//'` + case .$VERSION_PATCH in + (.) + AC_MSG_ERROR(missing patch-date $VERSION_PATCH) + ;; + (.[[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]][[0-9]]) + ;; + (*) + AC_MSG_ERROR(illegal patch-date $VERSION_PATCH) + ;; + esac + AC_MSG_RESULT($VERSION_PATCH) +else + AC_MSG_ERROR(did not find $srcdir/VERSION) +fi + +# show the actual data that we have for versions: +CF_VERBOSE(ABI VERSION $VERSION) +CF_VERBOSE(VERSION_MAJOR $VERSION_MAJOR) +CF_VERBOSE(VERSION_MINOR $VERSION_MINOR) +CF_VERBOSE(VERSION_PATCH $VERSION_PATCH) + +AC_SUBST(VERSION) +AC_SUBST(VERSION_MAJOR) +AC_SUBST(VERSION_MINOR) +AC_SUBST(VERSION_PATCH) + +dnl if a package name is given, define its corresponding version info. We +dnl need the package name to ensure that the defined symbols are unique. +ifelse($1,,,[ + PACKAGE=ifelse($2,,$1,$2) + AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE",[Define to the package-name]) + AC_SUBST(PACKAGE) + AH_TEMPLATE([AS_TR_CPP($1[_VERSION])],[version of package]) + AC_DEFINE_UNQUOTED(AS_TR_CPP($1[_VERSION]),"${VERSION_MAJOR}.${VERSION_MINOR}") + AH_TEMPLATE([AS_TR_CPP($1[_PATCHDATE])],[patchdate of package]) + AC_DEFINE_UNQUOTED(AS_TR_CPP($1[_PATCHDATE]),${VERSION_PATCH}) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WCHAR_TYPE version: 5 updated: 2023/12/03 09:21:34 +dnl ------------- +dnl Check if type wide-character type $1 is declared, and if so, which header +dnl file is needed. The second parameter is used to set a shell variable when +dnl the type is not found. The first parameter sets a shell variable for the +dnl opposite sense. +AC_DEFUN([CF_WCHAR_TYPE], +[ +# This is needed on Tru64 5.0 to declare $1 +AC_CACHE_CHECK(if we must include wchar.h to declare $1,cf_cv_$1,[ +AC_TRY_COMPILE([ +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif], + [$1 state; (void)state], + [cf_cv_$1=no], + [AC_TRY_COMPILE([ +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif], + [$1 value; (void) value], + [cf_cv_$1=yes], + [cf_cv_$1=unknown])])]) + +if test "$cf_cv_$1" = yes ; then + AC_DEFINE(NEED_WCHAR_H,1,[Define to 1 if we must include wchar.h]) + NEED_WCHAR_H=1 +fi + +ifelse([$2],,,[ +# if we do not find $1 in either place, use substitution to provide a fallback. +if test "$cf_cv_$1" = unknown ; then + $2=1 +fi +]) +ifelse($3,,,[ +# if we find $1 in either place, use substitution to provide a fallback. +if test "$cf_cv_$1" != unknown ; then + $3=1 +fi +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WEAK_SYMBOLS version: 1 updated: 2008/08/16 19:18:06 +dnl --------------- +dnl Check for compiler-support for weak symbols. +dnl This works with "recent" gcc. +AC_DEFUN([CF_WEAK_SYMBOLS],[ +AC_CACHE_CHECK(if $CC supports weak symbols,cf_cv_weak_symbols,[ + +AC_TRY_COMPILE([ +#include ], +[ +#if defined(__GNUC__) +# if defined __USE_ISOC99 +# define _cat_pragma(exp) _Pragma(#exp) +# define _weak_pragma(exp) _cat_pragma(weak name) +# else +# define _weak_pragma(exp) +# endif +# define _declare(name) __extension__ extern __typeof__(name) name +# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) +#endif + +weak_symbol(fopen); +],[cf_cv_weak_symbols=yes],[cf_cv_weak_symbols=no]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ABI_ALTERED version: 1 updated: 2023/01/07 16:32:06 +dnl ------------------- +dnl Provide a way to override the displayed ABI version, e.g., in filenames. +dnl Check this option after using the ABI version in configuration decisions. +AC_DEFUN([CF_WITH_ABI_ALTERED],[ +AC_REQUIRE([CF_WITH_ABI_VERSION]) +AC_REQUIRE([CF_ABI_DEFAULTS]) +AC_ARG_WITH(abi-altered, +[ --with-abi-altered=XXX override visible ABI version, for packaging],[ + CF_NUMBER_SYNTAX($withval,ABI altered) + if test "$cf_cv_abi_version" != "$withval" + then + AC_MSG_WARN(altering visible ABI from $cf_cv_abi_version to $withval) + cf_cv_abi_version=$withval + fi +])dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ABI_VERSION version: 5 updated: 2023/01/07 16:32:06 +dnl ------------------- +dnl Allow library's ABI to be overridden. Generally this happens when a +dnl packager has incremented the ABI past that used in the original package, +dnl and wishes to keep doing this. +dnl +dnl $1 is the package name, if any, to derive a corresponding {package}_ABI +dnl symbol. +AC_DEFUN([CF_WITH_ABI_VERSION],[ +test -z "$cf_cv_abi_version" && cf_cv_abi_version=0 +AC_ARG_WITH(abi-version, +[ --with-abi-version=XXX override derived ABI version],[ + if test "x$cf_cv_abi_version" != "x$withval" + then + AC_MSG_WARN(overriding ABI version $cf_cv_abi_version to $withval) + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=$withval.0 + ;; + (6.*) + cf_cv_rel_version=$withval.9 # FIXME: should be 10 as of 6.0 release + ;; + esac + fi + cf_cv_abi_version=$withval]) + CF_NUMBER_SYNTAX($cf_cv_abi_version,ABI version) +ifelse($1,,,[ +$1_ABI=$cf_cv_abi_version +]) +cf_cv_abi_default=$cf_cv_abi_version +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA version: 1 updated: 2024/05/18 13:55:23 +dnl ----------- +dnl Check for the Ada compiler (unless requested to not do this), which causes +dnl a further check for a C compiler which can work with the Ada compiler. +AC_DEFUN([CF_WITH_ADA],[ +AC_ARG_WITH(ada, + [ --without-ada suppress check for Ada compiler], + [cf_with_ada=$withval], + [cf_with_ada=yes]) + +cf_prog_cc="gcc cc" +if test "x$cf_with_ada" = xyes +then + CF_PROG_GNAT + if test "x$cf_cv_prog_gnat_correct" = xyes; then + # gcc's developers chose to deprecate gnatgcc before making gprconfig + # work. They replaced gnatgcc in gcc 13 with a script which spits out + # a warning offering advice which could never work. + # + # Here is a workaround. + AC_PATH_PROG(cf_cv_path_gnatgcc,gnatgcc,no) + if test "$cf_cv_path_gnatgcc" != no + then + AC_MSG_CHECKING(for improvement) + cf_file_gnatgcc=`file -L "$cf_cv_path_gnatgcc" 2>/dev/null` + case "x$cf_file_gnatgcc" in + (*script*) + cf_cv_path_gnatgcc=`sh -x "$cf_cv_path_gnatgcc" --version 2>&1 | grep -w exec | sed -e 's/^[[ ]]*+[[ ]]*//' -e 's/exec[[ ]]//' -e 's/ .*//'` + ;; + (*) + cf_cv_path_gnatgcc=no + ;; + esac + AC_MSG_RESULT($cf_cv_path_gnatgcc) + test "$cf_cv_path_gnatgcc" = no && cf_cv_path_gnatgcc=gnatgcc + cf_prog_cc="$cf_cv_path_gnatgcc $cf_prog_cc" + fi + fi +fi +case "$cf_prog_cc" in +(*/*) + CC="$cf_prog_cc" + AC_SUBST(CC) + ;; +(*) + CF_PROG_CC($cf_prog_cc) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_COMPILER version: 3 updated: 2023/10/28 11:59:01 +dnl -------------------- +dnl Command-line option to specify the Ada95 compiler. +AC_DEFUN([CF_WITH_ADA_COMPILER],[ +AC_MSG_CHECKING(for Ada95 compiler) +AC_ARG_WITH(ada-compiler, + [[ --with-ada-compiler[=CMD] use CMD as Ada95 compiler (default: gnatmake)]], + [cf_ada_compiler=$withval], + [cf_ada_compiler=gnatmake]) +AC_SUBST(cf_ada_compiler) +AC_MSG_RESULT($cf_ada_compiler) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_INCLUDE version: 3 updated: 2023/10/28 11:59:01 +dnl ------------------- +dnl Command-line option to specify where Ada includes will install. +AC_DEFUN([CF_WITH_ADA_INCLUDE],[ +AC_MSG_CHECKING(for Ada95 include directory) +CF_WITH_PATH(ada-include, + [ --with-ada-include=DIR find Ada95 includes in DIR], + ADA_INCLUDE, + PREFIX/share/ada/adainclude, + [$]prefix/share/ada/adainclude) +AC_SUBST(ADA_INCLUDE) +AC_MSG_RESULT($ADA_INCLUDE) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_LIBNAME version: 3 updated: 2023/11/22 20:48:30 +dnl ------------------- +dnl CF_WITH_ADA_LIBNAME +dnl ------------------- +dnl Command-line option to specify how to name the resulting Ada library. +dnl $1 = default value +AC_DEFUN([CF_WITH_ADA_LIBNAME],[ +AC_MSG_CHECKING(for Ada95 curses library name) +AC_ARG_WITH(ada-libname, + [[ --with-ada-libname[=XXX] use XXX as Ada95 library name]], + ADA_LIBNAME=[$]withval, + ADA_LIBNAME=$1) +case "x$ADA_LIBNAME" in +(x|xyes|xno) + ADA_LIBNAME=$1 + ;; +esac +AC_SUBST(ADA_LIBNAME) +AC_MSG_RESULT($ADA_LIBNAME) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_OBJECTS version: 3 updated: 2023/10/28 11:59:01 +dnl ------------------- +dnl Command-line option to specify where Ada objects will install. +AC_DEFUN([CF_WITH_ADA_OBJECTS],[ +AC_MSG_CHECKING(for Ada95 object directory) +CF_WITH_PATH(ada-objects, + [ --with-ada-objects=DIR find Ada95 objects in DIR], + ADA_OBJECTS, + PREFIX/lib/ada/adalib, + [$]prefix/lib/ada/adalib) +AC_SUBST(ADA_OBJECTS) +AC_MSG_RESULT($ADA_OBJECTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ADA_SHAREDLIB version: 6 updated: 2023/10/28 11:59:01 +dnl --------------------- +dnl Command-line option to specify if an Ada95 shared library should be built, +dnl and optionally what its soname should be. +AC_DEFUN([CF_WITH_ADA_SHAREDLIB],[ +AC_REQUIRE([CF_GNAT_PROJECTS]) +AC_MSG_CHECKING(whether to build an Ada95 shared library) +AC_ARG_WITH(ada-sharedlib, + [ --with-ada-sharedlib build Ada95 shared library; requires GNAT project support], + [with_ada_sharedlib=$withval], + [with_ada_sharedlib=no]) +cf_ada_sharedlib_warn=no + +if test "x$with_ada_sharedlib" != xno +then + if test "x$cf_gnat_projects" != xyes + then + with_ada_sharedlib=no + cf_ada_sharedlib_warn=yes + fi +fi + +AC_MSG_RESULT($with_ada_sharedlib) +if test "x$cf_ada_sharedlib_warn" != xno +then + AC_MSG_WARN(disabling Ada95 shared library since GNAT projects are not supported) +fi + +ADA_SHAREDLIB='lib$(LIB_NAME).so.1' +MAKE_ADA_SHAREDLIB="#" + +if test "x$with_ada_sharedlib" != xno +then + MAKE_ADA_SHAREDLIB= + if test "x$with_ada_sharedlib" != xyes + then + ADA_SHAREDLIB="$with_ada_sharedlib" + fi +fi + +AC_SUBST(ADA_SHAREDLIB) +AC_SUBST(MAKE_ADA_SHAREDLIB) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl ---------------- +dnl Configure-option for dbmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DBMALLOC],[ +CF_NO_LEAKS_OPTION(dbmalloc, + [ --with-dbmalloc test: use Conor Cahill's dbmalloc library], + [USE_DBMALLOC]) + +if test "$with_dbmalloc" = yes ; then + AC_CHECK_HEADER(dbmalloc.h, + [AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl --------------- +dnl Configure-option for dmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DMALLOC],[ +CF_NO_LEAKS_OPTION(dmalloc, + [ --with-dmalloc test: use Gray Watson's dmalloc library], + [USE_DMALLOC]) + +if test "$with_dmalloc" = yes ; then + AC_CHECK_HEADER(dmalloc.h, + [AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_EXPORT_SYMS version: 5 updated: 2023/11/22 20:48:30 +dnl ------------------- +dnl Use this with libtool to specify the list of symbols that may be exported. +dnl The input file contains one symbol per line; comments work with "#". +dnl +dnl $1 = basename of the ".sym" file (default $PACKAGE) +AC_DEFUN([CF_WITH_EXPORT_SYMS], +[ +AC_MSG_CHECKING(if exported-symbols file should be used) +AC_ARG_WITH(export-syms, + [[ --with-export-syms[=SYM-FILE] limit symbols exported by libtool to those listed in SYM-FILE]], + [with_export_syms=$withval], + [with_export_syms=no]) +if test "x$with_export_syms" = xyes +then + with_export_syms='${top_srcdir}/package/ifelse($1,,${PACKAGE},[$1]).sym' + AC_SUBST(PACKAGE) +fi +AC_MSG_RESULT($with_export_syms) +if test "x$with_export_syms" != xno +then + EXPORT_SYMS="-export-symbols $with_export_syms" + AC_SUBST(EXPORT_SYMS) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_GPM version: 10 updated: 2017/04/29 18:32:18 +dnl ----------- +dnl +dnl The option parameter (if neither yes/no) is assumed to be the name of +dnl the gpm library, e.g., for dynamic loading. +AC_DEFUN([CF_WITH_GPM], +[ +AC_MSG_CHECKING(if you want to link with the GPM mouse library) +AC_ARG_WITH(gpm, + [ --with-gpm use Alessandro Rubini's GPM library], + [with_gpm=$withval], + [with_gpm=maybe]) +AC_MSG_RESULT($with_gpm) + +if test "$with_gpm" != no ; then + AC_CHECK_HEADER(gpm.h,[ + AC_DEFINE(HAVE_GPM_H,1,[Define to 1 if we have gpm.h header]) + if test "$with_gpm" != yes && test "$with_gpm" != maybe ; then + CF_VERBOSE(assuming we really have GPM library) + AC_DEFINE(HAVE_LIBGPM,1,[Define to 1 if we have the gpm library]) + with_gpm=yes + else + AC_CHECK_LIB(gpm,Gpm_Open,[with_gpm=yes],[ + if test "$with_gpm" = maybe; then + AC_MSG_WARN(Cannot link with GPM library) + with_gpm=no + else + AC_MSG_ERROR(Cannot link with GPM library) + fi + ]) + fi + ],[ + test "$with_gpm" != maybe && AC_MSG_WARN(Cannot find GPM header) + with_gpm=no + ]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_WITH_LIBTOOL version: 36 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Provide a configure option to incorporate libtool. Define several useful +dnl symbols for the makefile rules. +dnl +dnl The reference to AC_PROG_LIBTOOL does not normally work, since it uses +dnl macros from libtool.m4 which is in the aclocal directory of automake. +dnl Following is a simple script which turns on the AC_PROG_LIBTOOL macro. +dnl But that still does not work properly since the macro is expanded outside +dnl the CF_WITH_LIBTOOL macro: +dnl +dnl #!/bin/sh +dnl ACLOCAL=`aclocal --print-ac-dir` +dnl if test -z "$ACLOCAL" ; then +dnl echo cannot find aclocal directory +dnl exit 1 +dnl elif test ! -f $ACLOCAL/libtool.m4 ; then +dnl echo cannot find libtool.m4 file +dnl exit 1 +dnl fi +dnl +dnl LOCAL=aclocal.m4 +dnl ORIG=aclocal.m4.orig +dnl +dnl trap "mv $ORIG $LOCAL" 0 1 2 3 15 +dnl rm -f $ORIG +dnl mv $LOCAL $ORIG +dnl +dnl # sed the LIBTOOL= assignment to omit the current directory? +dnl sed -e 's/^LIBTOOL=.*/LIBTOOL=${LIBTOOL:-libtool}/' $ACLOCAL/libtool.m4 >>$LOCAL +dnl cat $ORIG >>$LOCAL +dnl +dnl autoconf-257 $* +dnl +AC_DEFUN([CF_WITH_LIBTOOL], +[ +AC_REQUIRE([CF_DISABLE_LIBTOOL_VERSION]) +ifdef([AC_PROG_LIBTOOL],,[ +LIBTOOL= +]) +# common library maintenance symbols that are convenient for libtool scripts: +LIB_CREATE='${AR} -cr' +LIB_OBJECT='${OBJECTS}' +LIB_SUFFIX=.a +LIB_PREP="$RANLIB" + +# symbols used to prop libtool up to enable it to determine what it should be +# doing: +LIB_CLEAN= +LIB_COMPILE= +LIB_LINK='${CC}' +LIB_INSTALL= +LIB_UNINSTALL= + +AC_MSG_CHECKING(if you want to build libraries with libtool) +AC_ARG_WITH(libtool, + [ --with-libtool generate libraries with libtool], + [with_libtool=$withval], + [with_libtool=no]) +AC_MSG_RESULT($with_libtool) +if test "$with_libtool" != "no"; then +ifdef([AC_PROG_LIBTOOL],[ + # missing_content_AC_PROG_LIBTOOL{{ + AC_PROG_LIBTOOL + # missing_content_AC_PROG_LIBTOOL}} +],[ + if test "$with_libtool" != "yes" ; then + CF_PATH_SYNTAX(with_libtool) + LIBTOOL=$with_libtool + else + AC_CHECK_TOOLS(LIBTOOL,[libtool glibtool],none) + CF_LIBTOOL_VERSION + if test -z "$cf_cv_libtool_version" && test "$LIBTOOL" = libtool + then + CF_FORGET_TOOL(LIBTOOL) + AC_CHECK_TOOLS(LIBTOOL,[glibtool],none) + CF_LIBTOOL_VERSION + fi + fi + if test -z "$LIBTOOL" ; then + AC_MSG_ERROR(Cannot find libtool) + fi +])dnl + LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${libdir} ${LIBTOOL_VERSION} `cut -f1 ${top_srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o' + LIB_OBJECT='${OBJECTS:.o=.lo}' + LIB_SUFFIX=.la + LIB_CLEAN='${LIBTOOL} --mode=clean' + LIB_COMPILE='${LIBTOOL} --mode=compile' + LIB_LINK='${LIBTOOL} --mode=link ${CC} ${LIBTOOL_OPTS}' + LIB_INSTALL='${LIBTOOL} --mode=install' + LIB_UNINSTALL='${LIBTOOL} --mode=uninstall' + LIB_PREP=: + + CF_CHECK_LIBTOOL_VERSION + + # special hack to add -no-undefined (which libtool should do for itself) + LT_UNDEF= + case "$cf_cv_system_name" in + (cygwin*|msys*|mingw32*|os2*|uwin*|aix[[4-7]]) + LT_UNDEF=-no-undefined + ;; + esac + AC_SUBST([LT_UNDEF]) + + # special hack to add --tag option for C++ compiler + case "$cf_cv_libtool_version" in + (1.[[5-9]]*|[[2-9]].[[0-9.a-z]]*) + LIBTOOL_CXX="$LIBTOOL --tag=CXX" + LIBTOOL="$LIBTOOL --tag=CC" + ;; + (*) + LIBTOOL_CXX="$LIBTOOL" + ;; + esac +else + LIBTOOL="" + LIBTOOL_CXX="" +fi + +test -z "$LIBTOOL" && ECHO_LT= + +AC_SUBST(LIBTOOL) +AC_SUBST(LIBTOOL_CXX) +AC_SUBST(LIBTOOL_OPTS) + +AC_SUBST(LIB_CREATE) +AC_SUBST(LIB_OBJECT) +AC_SUBST(LIB_SUFFIX) +AC_SUBST(LIB_PREP) + +AC_SUBST(LIB_CLEAN) +AC_SUBST(LIB_COMPILE) +AC_SUBST(LIB_LINK) +AC_SUBST(LIB_INSTALL) +AC_SUBST(LIB_UNINSTALL) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_LIBTOOL_OPTS version: 6 updated: 2023/11/22 20:48:30 +dnl -------------------- +dnl Allow user to pass additional libtool options into the library creation +dnl and link steps. The main use for this is to do something like +dnl ./configure --with-libtool-opts=-static +dnl to get the same behavior as automake-flavored +dnl ./configure --enable-static +AC_DEFUN([CF_WITH_LIBTOOL_OPTS],[ +AC_MSG_CHECKING(for additional libtool options) +AC_ARG_WITH(libtool-opts, + [[ --with-libtool-opts[=XXX] give libtool additional options XXX]], + [with_libtool_opts=$withval], + [with_libtool_opts=no]) +AC_MSG_RESULT($with_libtool_opts) + +case .$with_libtool_opts in +(.yes|.no|.) + ;; +(*) + LIBTOOL_OPTS="$LIBTOOL_OPTS $with_libtool_opts" + ;; +esac + +AC_SUBST(LIBTOOL_OPTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_LIB_BASENAME version: 2 updated: 2023/11/22 20:48:30 +dnl -------------------- +dnl Allow for overriding the basename of a library, i.e., the part to which +dnl prefixes/suffixes are attached. +dnl +dnl $1 = variable to set +dnl $2 = option name +dnl $3 = default basename for library, if omitted use $2 +AC_DEFUN([CF_WITH_LIB_BASENAME], +[ +AC_MSG_CHECKING(for desired basename for $2 library) +AC_ARG_WITH($2-libname, + [[ --with-$2-libname[=XXX] override ifelse($3,,$2,$3) basename of library]], + [with_lib_basename=$withval], + [with_lib_basename=ifelse($3,,$2,$3)]) +$1="$with_lib_basename" + +case "x[$]$1" in +(x|xno|xnone|xyes) + $1=ifelse($3,,$2,$3) + ;; +(*) + ;; +esac + +AC_MSG_RESULT([$]$1) +AC_SUBST($1) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_LIB_PREFIX version: 2 updated: 2021/01/01 16:53:59 +dnl ------------------ +dnl Allow the library-prefix to be overridden. OS/2 EMX originally had no +dnl "lib" prefix, e.g., because it used the dll naming convention. +dnl +dnl $1 = variable to set +AC_DEFUN([CF_WITH_LIB_PREFIX], +[ +AC_MSG_CHECKING(if you want to have a library-prefix) +AC_ARG_WITH(lib-prefix, + [ --with-lib-prefix override library-prefix], + [with_lib_prefix=$withval], + [with_lib_prefix=auto]) +AC_MSG_RESULT($with_lib_prefix) + +if test "$with_lib_prefix" = auto +then + CF_LIB_PREFIX($1) +elif test "$with_lib_prefix" = no +then + LIB_PREFIX= +else + LIB_PREFIX=$with_lib_prefix +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PATH version: 12 updated: 2021/09/04 06:35:04 +dnl ------------ +dnl Wrapper for AC_ARG_WITH to ensure that user supplies a pathname, not just +dnl defaulting to yes/no. +dnl +dnl $1 = option name +dnl $2 = help-text +dnl $3 = environment variable to set +dnl $4 = default value, shown in the help-message, must be a constant +dnl $5 = default value, if it is an expression & cannot be in the help-message +dnl +AC_DEFUN([CF_WITH_PATH], +[AC_ARG_WITH($1,[$2 ](default: ifelse([$4],,empty,[$4])),, +ifelse([$4],,[withval="${$3}"],[withval="${$3:-ifelse([$5],,[$4],[$5])}"]))dnl +if ifelse([$5],,true,[test -n "$5"]) ; then +CF_PATH_SYNTAX(withval) +fi +eval $3="$withval" +AC_SUBST($3)dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PATHLIST version: 13 updated: 2021/09/04 06:35:04 +dnl ---------------- +dnl Process an option specifying a list of colon-separated paths. +dnl +dnl $1 = option name +dnl $2 = help-text +dnl $3 = environment variable to set +dnl $4 = default value, shown in the help-message, must be a constant +dnl $5 = default value, if it is an expression & cannot be in the help-message +dnl $6 = flag to tell if we want to define or substitute +dnl +AC_DEFUN([CF_WITH_PATHLIST],[ +AC_REQUIRE([CF_PATHSEP]) +AC_ARG_WITH($1,[$2 ](default: ifelse($4,,empty,$4)),, +ifelse($4,,[withval=${$3}],[withval=${$3:-ifelse($5,,$4,$5)}]))dnl + +IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}" +cf_dst_path= +for cf_src_path in $withval +do + CF_PATH_SYNTAX(cf_src_path) + test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR" + cf_dst_path="${cf_dst_path}${cf_src_path}" +done +IFS="$ac_save_ifs" + +ifelse($6,define,[ +# Strip single quotes from the value, e.g., when it was supplied as a literal +# for $4 or $5. +case "$cf_dst_path" in +(\'*) + cf_dst_path="`echo "$cf_dst_path" |sed -e s/\'// -e s/\'\$//`" + ;; +esac +cf_dst_path=`echo "$cf_dst_path" | sed -e 's/\\\\/\\\\\\\\/g'` +]) + +# This may use the prefix/exec_prefix symbols which will only yield "NONE" +# so we have to check/work around. We do prefer the result of "eval"... +eval cf_dst_eval="$cf_dst_path" +case "x$cf_dst_eval" in +(xNONE*) + $3=$cf_dst_path + ;; +(*) + $3="$cf_dst_eval" + ;; +esac +AC_SUBST($3)dnl + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PATH_PROG version: 1 updated: 2019/06/30 19:44:43 +dnl ----------------- +dnl Check for a given program, like CF_PATH_PROG, but allow override using a +dnl "--with-xxx" option. +dnl +dnl Parameters: +dnl $1 = environment variable to set/update +dnl $2 = program name +dnl $3 = help-text +dnl $4 = $PATH +AC_DEFUN([CF_WITH_PATH_PROG],[ +AC_ARG_WITH($2-path, + [ --with-$2-path=XXX specify path of $2 ifelse($3,,,$3)], + [AC_MSG_CHECKING(for $2 program ifelse($3,,,$3)) + $1=$withval + AC_MSG_RESULT([$]$1) + CF_PATH_SYNTAX($1) + ], + [CF_PATH_PROG($1,$2,,ifelse($4,,,$4)) + if test -z "[$]$1" + then + AC_MSG_WARN(no $2 program found ifelse($3,,,$3)) + fi + ]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PCRE2 version: 6 updated: 2021/08/11 20:35:34 +dnl ------------- +dnl Add PCRE2 (Perl-compatible regular expressions v2) to the build if it is +dnl available and the user requests it. Assume the application will otherwise +dnl use the POSIX interface. +dnl +dnl TODO allow $withval to specify package location +AC_DEFUN([CF_WITH_PCRE2], +[ +AC_REQUIRE([CF_PKG_CONFIG]) + +AC_MSG_CHECKING(if you want to use PCRE2 for regular-expressions) +AC_ARG_WITH(pcre2, + [ --with-pcre2 use PCRE2 for regular-expressions]) +test -z "$with_pcre2" && with_pcre2=no +AC_MSG_RESULT($with_pcre2) + +if test "x$with_pcre2" != xno ; then + cf_with_pcre2_ok=no + for cf_with_pcre2 in libpcre2 libpcre2-posix libpcre + do + CF_TRY_PKG_CONFIG($cf_with_pcre2,[cf_with_pcre2_ok=yes; break]) + done + cf_with_pcre2_ok=yes || AC_MSG_ERROR(Cannot find PCRE2 library) + + AC_DEFINE(HAVE_LIB_PCRE2,1,[Define to 1 if we can/should compile with the PCRE2 library]) + + # if pkgconfig gave no results, look for the libraries directly + case "$LIBS" in + (*pcre2-posix*|*pcreposix*) + ;; + (*) + AC_CHECK_LIB(pcre2-posix,regcomp,[ + CF_ADD_LIB(pcre2-posix)], + [AC_CHECK_LIB(pcreposix,regcomp,[ + CF_ADD_LIB(pcreposix) + ],[AC_MSG_ERROR(Cannot find PCRE2 POSIX library)])]) + ;; + esac + + # either way, check for the library header files + AC_CHECK_HEADERS(pcre2posix.h pcreposix.h) + AC_CHECK_FUNCS(PCRE2regcomp) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PKG_CONFIG_LIBDIR version: 25 updated: 2024/08/03 13:34:29 +dnl ------------------------- +dnl Allow the choice of the pkg-config library directory to be overridden. +dnl +dnl pkg-config uses a search-list built from these colon-separated lists of +dnl directories: +dnl a) $PKG_CONFIG_PATH (tested first, added if set) +dnl b) $PKG_CONFIG_LIBDIR (tested second, added if set) +dnl c) builtin-list (added if $PKG_CONFIG_LIBDIR is not set) +dnl +dnl pkgconf (used with some systems such as FreeBSD in place of pkg-config) +dnl optionally ignores $PKG_CONFIG_LIBDIR. Very old versions of pkg-config, +dnl e.g., Solaris 10 also do not recognize $PKG_CONFIG_LIBDIR. +AC_DEFUN([CF_WITH_PKG_CONFIG_LIBDIR],[ +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +case "$PKG_CONFIG" in +(no|none|yes) + AC_MSG_CHECKING(for pkg-config library directory) + ;; +(*) + AC_MSG_CHECKING(for $PKG_CONFIG library directory) + ;; +esac + +# if $PKG_CONFIG_LIBDIR is set, try to use that +if test -n "$PKG_CONFIG_PATH"; then + cf_search_path=`echo "$PKG_CONFIG_PATH" | sed -e 's/:/ /g' -e 's,^[[ ]]*,,' -e 's,[[ ]]*$,,'` +elif test -n "$PKG_CONFIG_LIBDIR"; then + cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[[ ]]*,,' -e 's,[[ ]]*$,,'` +else + cf_search_path=auto +fi + +# if the option is used, let that override. otherwise default to "libdir" +AC_ARG_WITH(pkg-config-libdir, + [[ --with-pkg-config-libdir[=XXX] use given directory for installing pc-files]], + [cf_search_path=$withval], + [test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir]) + +case "x$cf_search_path" in +(xlibdir) + PKG_CONFIG_LIBDIR='${libdir}/pkgconfig' + AC_MSG_RESULT($PKG_CONFIG_LIBDIR) + cf_search_path= + ;; +(x) + ;; +(x$GLOB_FULLPATH_POSIX\ *|x$GLOB_FULLPATH_OTHER\ *) + PKG_CONFIG_LIBDIR= + ;; +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + PKG_CONFIG_LIBDIR="$cf_search_path" + AC_MSG_RESULT($PKG_CONFIG_LIBDIR) + cf_search_path= + ;; +(xyes|xauto) + AC_MSG_RESULT(auto) + cf_search_path= + # Look for the library directory using the same prefix as the executable + AC_MSG_CHECKING(for search-list) + if test "x$PKG_CONFIG" != xnone + then + # works for pkg-config since version 0.24 (2009) + # works for pkgconf since version 0.8.3 (2012) + for cf_pkg_program in \ + `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ + pkg-config \ + pkgconf + do + cf_raw_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null` + case "$cf_raw_search_path" in + (*\\*) + cf_search_path=`echo "$cf_raw_search_path" | tr ';' ' ' | tr '\' '/'` + ;; + (*/*) + cf_search_path=`echo "$cf_raw_search_path" | tr : ' '` + ;; + esac + test -n "$cf_search_path" && break + done + + # works for pkg-config since import in 2005 of original 2001 HP code. + test -z "$cf_search_path" && \ + cf_search_path=` + "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ +/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ + sub(\"^[[^']]*'\",\"\"); \ + sub(\"'.*\",\"\"); \ + printf \" %s\", \\[$]0; } \ +{ next; } \ +"` + fi + + AC_MSG_RESULT($cf_search_path) + ;; +(*) + AC_MSG_ERROR(Unexpected option value: $cf_search_path) + ;; +esac + +if test -n "$cf_search_path" +then + AC_MSG_CHECKING(for first directory) + cf_pkg_config_path=none + for cf_config in $cf_search_path + do + if test -d "$cf_config" + then + cf_pkg_config_path=$cf_config + break + fi + done + AC_MSG_RESULT($cf_pkg_config_path) + + if test "x$cf_pkg_config_path" != xnone ; then + # limit this to the first directory found + PKG_CONFIG_LIBDIR="$cf_pkg_config_path" + fi + + if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path" + then + AC_MSG_CHECKING(for workaround) + if test "$prefix" = "NONE" ; then + cf_prefix="$ac_default_prefix" + else + cf_prefix="$prefix" + fi + eval cf_libdir=$libdir + cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"` + cf_backup= + for cf_config in $cf_search_path + do + case $cf_config in + $cf_libdir/pkgconfig) + PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig + break + ;; + *) + test -z "$cf_backup" && cf_backup=$cf_config + ;; + esac + done + test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup + AC_MSG_RESULT($PKG_CONFIG_LIBDIR) + fi +fi + +AC_SUBST(PKG_CONFIG_LIBDIR) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_PTHREAD version: 7 updated: 2015/04/18 08:56:57 +dnl --------------- +dnl Check for POSIX thread library. +AC_DEFUN([CF_WITH_PTHREAD], +[ +AC_MSG_CHECKING(if you want to link with the pthread library) +AC_ARG_WITH(pthread, + [ --with-pthread use POSIX thread library], + [with_pthread=$withval], + [with_pthread=no]) +AC_MSG_RESULT($with_pthread) + +if test "$with_pthread" != no ; then + AC_CHECK_HEADER(pthread.h,[ + AC_DEFINE(HAVE_PTHREADS_H,1,[Define to 1 if we have pthreads.h header]) + + for cf_lib_pthread in pthread c_r + do + AC_MSG_CHECKING(if we can link with the $cf_lib_pthread library) + cf_save_LIBS="$LIBS" + CF_ADD_LIB($cf_lib_pthread) + AC_TRY_LINK([ +#include +],[ + int rc = pthread_create(0,0,0,0); + int r2 = pthread_mutexattr_settype(0, 0); +],[with_pthread=yes],[with_pthread=no]) + LIBS="$cf_save_LIBS" + AC_MSG_RESULT($with_pthread) + test "$with_pthread" = yes && break + done + + if test "$with_pthread" = yes ; then + CF_ADD_LIB($cf_lib_pthread) + AC_DEFINE(HAVE_LIBPTHREADS,1,[Define to 1 if we have pthreads library]) + else + AC_MSG_ERROR(Cannot link with pthread library) + fi + ]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_WITH_REL_VERSION version: 2 updated: 2023/05/06 18:18:18 +dnl ------------------- +dnl Allow library's release-version to be overridden. Generally this happens when a +dnl packager has incremented the release-version past that used in the original package, +dnl and wishes to keep doing this. +dnl +dnl $1 is the package name, if any, to derive corresponding {package}_MAJOR +dnl and {package}_MINOR symbols +dnl symbol. +AC_DEFUN([CF_WITH_REL_VERSION],[ +test -z "$cf_cv_rel_version" && cf_cv_rel_version=0.0 +AC_ARG_WITH(rel-version, +[ --with-rel-version=XXX override derived release version], +[AC_MSG_WARN(overriding release version $cf_cv_rel_version to $withval) + cf_cv_rel_version=$withval]) +ifelse($1,,[ + CF_NUMBER_SYNTAX($cf_cv_rel_version,Release version) +],[ + $1_MAJOR=`echo "$cf_cv_rel_version" | sed -e 's/\..*//'` + $1_MINOR=`echo "$cf_cv_rel_version" | sed -e 's/^[[^.]]*//' -e 's/^\.//' -e 's/\..*//'` + test -n "$1_MINOR" || $1_MINOR=0 + CF_NUMBER_SYNTAX([$]$1_MAJOR,Release major-version) + CF_NUMBER_SYNTAX([$]$1_MINOR,Release minor-version) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_SYSMOUSE version: 3 updated: 2012/10/06 17:56:13 +dnl ---------------- +dnl If we can compile with sysmouse, make it available unless it is not wanted. +AC_DEFUN([CF_WITH_SYSMOUSE],[ +# not everyone has "test -c" +if test -c /dev/sysmouse 2>/dev/null ; then +AC_MSG_CHECKING(if you want to use sysmouse) +AC_ARG_WITH(sysmouse, + [ --with-sysmouse use sysmouse (FreeBSD console)], + [cf_with_sysmouse=$withval], + [cf_with_sysmouse=maybe]) + if test "$cf_with_sysmouse" != no ; then + AC_TRY_COMPILE([ +#include +#if (__FreeBSD_version >= 400017) +#include +#include +#else +#include +#endif +],[ + struct mouse_info the_mouse; + ioctl(0, CONS_MOUSECTL, &the_mouse); +],[cf_with_sysmouse=yes],[cf_with_sysmouse=no]) + fi +AC_MSG_RESULT($cf_with_sysmouse) +test "$cf_with_sysmouse" = yes && AC_DEFINE(USE_SYSMOUSE,1,[Define to 1 if we can/should use the sysmouse interface]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_SYSTYPE version: 1 updated: 2013/01/26 16:26:12 +dnl --------------- +dnl For testing, override the derived host system-type which is used to decide +dnl things such as the linker commands used to build shared libraries. This is +dnl normally chosen automatically based on the type of system which you are +dnl building on. We use it for testing the configure script. +dnl +dnl This is different from the --host option: it is used only for testing parts +dnl of the configure script which would not be reachable with --host since that +dnl relies on the build environment being real, rather than mocked up. +AC_DEFUN([CF_WITH_SYSTYPE],[ +CF_CHECK_CACHE([AC_CANONICAL_SYSTEM]) +AC_ARG_WITH(system-type, + [ --with-system-type=XXX test: override derived host system-type], +[AC_MSG_WARN(overriding system type to $withval) + cf_cv_system_name=$withval + host_os=$withval +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_TYPE version: 2 updated: 2023/11/25 16:11:47 +dnl ------------ +dnl Accept a TYPE for substitution: +dnl $1 = name of type +dnl $2 = help/usage message +dnl $3 = symbol to set +dnl $4 = default value +AC_DEFUN([CF_WITH_TYPE],[ +AC_MSG_CHECKING(for type of $1) +AC_ARG_WITH([$1], [$2], + [$3="$withval"], + [$3=$4]) +AC_MSG_RESULT([$]$3) +case x[$]$3 in +(x|xyes|xno) + AC_MSG_ERROR(expected a type name for $1) + ;; +esac +AC_SUBST($3) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_VALGRIND version: 1 updated: 2006/12/14 18:00:21 +dnl ---------------- +AC_DEFUN([CF_WITH_VALGRIND],[ +CF_NO_LEAKS_OPTION(valgrind, + [ --with-valgrind test: use valgrind], + [USE_VALGRIND]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_VERSIONED_SYMS version: 14 updated: 2024/08/03 12:34:02 +dnl ---------------------- +dnl Use this when building shared library with ELF, to markup symbols with the +dnl version identifier from the given input file. Generally that identifier is +dnl the same as the SONAME at which the symbol was first introduced. +dnl +dnl $1 = basename of the ".map" file (default $PACKAGE) +AC_DEFUN([CF_WITH_VERSIONED_SYMS], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +AC_MSG_CHECKING(if versioned-symbols file should be used) +AC_ARG_WITH(versioned-syms, + [[ --with-versioned-syms[=MAP-FILE] version ELF shared library symbols per MAP-FILE]], + [with_versioned_syms=$withval], + [with_versioned_syms=no]) +case "x$with_versioned_syms" in +(xyes) + with_versioned_syms='${top_srcdir}/package/ifelse($1,,${PACKAGE},[$1]).map' + AC_SUBST(PACKAGE) + ;; +(xno) + ;; +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + test -f "$with_versioned_syms" || AC_MSG_ERROR(expected a filename: $with_versioned_syms) + ;; +(*) + test -f "$with_versioned_syms" || AC_MSG_ERROR(expected a filename: $with_versioned_syms) + with_versioned_syms=`pwd`/"$with_versioned_syms" + ;; +esac +AC_MSG_RESULT($with_versioned_syms) + +RESULTING_SYMS= +VERSIONED_SYMS= +WILDCARD_SYMS= + +if test "x$with_versioned_syms" != xno +then + RESULTING_SYMS=$with_versioned_syms + case "x$MK_SHARED_LIB" in + (*-Wl,*) + VERSIONED_SYMS="-Wl,--version-script,\${RESULTING_SYMS}" + MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-Wl,%\\[$]{VERSIONED_SYMS} -Wl,%"` + CF_VERBOSE(MK_SHARED_LIB: $MK_SHARED_LIB) + ;; + (*-dy\ *) + VERSIONED_SYMS="-Wl,-M,\${RESULTING_SYMS}" + MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-dy%\\[$]{VERSIONED_SYMS} -dy%"` + CF_VERBOSE(MK_SHARED_LIB: $MK_SHARED_LIB) + ;; + (*) + AC_MSG_WARN(this system does not support versioned-symbols) + ;; + esac + + # Linux ld can selectively override scope, e.g., of symbols beginning with + # "_" by first declaring some as global, and then using a wildcard to + # declare the others as local. Some other loaders cannot do this. Check + # by constructing a (very) simple shared library and inspecting its + # symbols. + if test "x$VERSIONED_SYMS" != "x" + then + AC_MSG_CHECKING(if wildcards can be used to selectively omit symbols) + WILDCARD_SYMS=no + + # make sources + rm -f conftest.* + + cat >conftest.ver <conftest.$ac_ext <conftest.mk <&AC_FD_CC >/dev/null + then + # test for missing symbol in either Data or Text section + cf_missing="`nm -P conftest.so 2>&AC_FD_CC |${FGREP-fgrep} _ismissing | ${EGREP-egrep} '[[ ]][[DT]][[ ]]'`" + test -n "$cf_missing" && WILDCARD_SYMS=yes + fi + AC_MSG_RESULT($WILDCARD_SYMS) + rm -f conftest.* + fi +fi +AC_SUBST(RESULTING_SYMS) +AC_SUBST(VERSIONED_SYMS) +AC_SUBST(WILDCARD_SYMS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_X11_RGB version: 3 updated: 2023/10/28 11:59:01 +dnl --------------- +dnl Handle configure option "--with-x11-rgb", setting these shell +dnl variables: +dnl +dnl $RGB_PATH is the option value, used for finding the X11 rgb file. +dnl $no_x11_rgb is a "#" (comment) if "--without-x11-rgb" is given. +dnl +dnl Most Linux's use this: +dnl /usr/share/X11/rgb.txt +dnl Debian uses this: +dnl /etc/X11/rgb.txt +dnl DragonFlyBSD ports uses this: +dnl /usr/pkg/lib/X11/rgb.txt +dnl FreeBSD ports use these: +dnl /usr/local/lib/X11/rgb.txt +dnl /usr/local/share/X11/rgb.txt +dnl Mandriva has these: +dnl /usr/lib/X11/rgb.txt +dnl /usr/lib64/X11/rgb.txt +dnl NetBSD has these +dnl /usr/X11R7/lib/X11/rgb.txt +dnl OpenSolaris uses +dnl 32-bit: +dnl /usr/X11/etc/X11/rgb.txt +dnl /usr/X11/share/X11/rgb.txt +dnl /usr/X11/lib/X11/rgb.txt +dnl OSX uses +dnl /opt/local/share/X11/rgb.txt (MacPorts) +dnl /opt/X11/share/X11/rgb.txt (non-ports) +dnl 64-bit: +dnl /usr/X11/etc/X11/rgb.txt +dnl /usr/X11/share/X11/rgb.txt (perhaps) +dnl /usr/X11/lib/amd64/X11/rgb.txt +dnl Solaris10 uses (in this order): +dnl /usr/openwin/lib/X11/rgb.txt +dnl /usr/X11/lib/X11/rgb.txt +AC_DEFUN([CF_WITH_X11_RGB],[ +AC_MSG_CHECKING(for X11 rgb file) +AC_ARG_WITH(x11-rgb, + [ --with-x11-rgb=FILE obtain X11 color definitions from FILE (default: EPREFIX/lib/X11/rgb.txt)], + [RGB_PATH=$withval], + [RGB_PATH=auto]) + +if test "x[$]RGB_PATH" = xauto +then + RGB_PATH='${exec_prefix}/lib/X11/rgb.txt' + for cf_path in \ + /opt/local/share/X11/rgb.txt \ + /opt/X11/share/X11/rgb.txt \ + /usr/share/X11/rgb.txt \ + /usr/X11/share/X11/rgb.txt \ + /usr/X11/lib/X11/rgb.txt \ + /usr/lib/X11/rgb.txt \ + /etc/X11/rgb.txt \ + /usr/pkg/lib/X11/rgb.txt \ + /usr/X11R7/lib/X11/rgb.txt \ + /usr/X11R6/lib/X11/rgb.txt \ + /usr/X11R5/lib/X11/rgb.txt \ + /usr/X11R4/lib/X11/rgb.txt \ + /usr/local/lib/X11/rgb.txt \ + /usr/local/share/X11/rgb.txt \ + /usr/lib64/X11/rgb.txt + do + if test -f "$cf_path" ; then + RGB_PATH="$cf_path" + break + fi + done +else + cf_path=$RGB_PATH + CF_PATH_SYNTAX(cf_path) +fi + +AC_MSG_RESULT($RGB_PATH) +AC_SUBST(RGB_PATH) +AC_DEFINE_UNQUOTED(RGB_PATH,"$cf_path",[Define to the full pathname of rgb.txt]) + +no_x11_rgb= +if test "$RGB_PATH" = no +then + no_x11_rgb="#" +fi +AC_SUBST(no_x11_rgb) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_XOPEN_SOURCE version: 67 updated: 2023/09/06 18:55:27 +dnl --------------- +dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions, +dnl or adapt to the vendor's definitions to get equivalent functionality, +dnl without losing the common non-POSIX features. +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +dnl $2 is the nominal value for _POSIX_C_SOURCE +dnl +dnl The default case prefers _XOPEN_SOURCE over _POSIX_C_SOURCE if the +dnl implementation predefines it, because X/Open and most implementations agree +dnl that the latter is a legacy or "aligned" value. +dnl +dnl Because _XOPEN_SOURCE is preferred, if defining _POSIX_C_SOURCE turns +dnl that off, then refrain from setting _POSIX_C_SOURCE explicitly. +dnl +dnl References: +dnl https://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html +dnl https://docs.oracle.com/cd/E19253-01/816-5175/standards-5/index.html +dnl https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html +AC_DEFUN([CF_XOPEN_SOURCE],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([CF_POSIX_VISIBLE]) + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=ifelse([$1],,500,[$1]) +cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2]) +cf_xopen_source= + +case "$host_os" in +(aix[[4-7]]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(darwin[[0-8]].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[[56]].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin|msys|mingw*|linux*uclibc) + CF_GNU_SOURCE($cf_XOPEN_SOURCE) + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[[6-9]]*) + # OpenBSD 6.x has broken locale support, both compile-time and runtime. + # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + # Abusing the conformance level is a workaround. + AC_MSG_WARN(this system does not provide usable locale support) + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=700 + ;; +(openbsd[[4-5]]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[[45]]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + CF_TRY_XOPEN_SOURCE + cf_save_xopen_cppflags="$CPPFLAGS" + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + # Some of these niche implementations use copy/paste, double-check... + if test "$cf_cv_xopen_source" = no ; then + CF_VERBOSE(checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE) + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[ + AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable) + CPPFLAGS="$cf_save_xopen_cppflags"]) + fi + ;; +esac + +if test -n "$cf_xopen_source" ; then + CF_APPEND_CFLAGS($cf_xopen_source,true) +fi + +dnl In anything but the default case, we may have system-specific setting +dnl which is still not guaranteed to provide all of the entrypoints that +dnl _XOPEN_SOURCE would yield. +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + AC_MSG_CHECKING(if _XOPEN_SOURCE really is set) + AC_TRY_COMPILE([#include ],[ +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif], + [cf_XOPEN_SOURCE_set=yes], + [cf_XOPEN_SOURCE_set=no]) + AC_MSG_RESULT($cf_XOPEN_SOURCE_set) + if test "$cf_XOPEN_SOURCE_set" = yes + then + AC_TRY_COMPILE([#include ],[ +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#error (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#endif], + [cf_XOPEN_SOURCE_set_ok=yes], + [cf_XOPEN_SOURCE_set_ok=no]) + if test "$cf_XOPEN_SOURCE_set_ok" = no + then + AC_MSG_WARN(_XOPEN_SOURCE is lower than requested) + fi + else + CF_TRY_XOPEN_SOURCE + fi +fi +fi # cf_cv_posix_visible +]) +dnl --------------------------------------------------------------------------- +dnl CF__SED_TRIMBLANKS version: 1 updated: 2021/01/02 09:31:20 +dnl ------------------ +dnl Trim something using sed, then trim extra whitespace +dnl $1 = extra parameters, e.g., in CF_STRIP_G_OPT +define([CF__SED_TRIMBLANKS],[sed ifelse($1,,,[$1] )-e 's%[[ ]]% %g' -e 's% [[ ]]*% %g' -e 's%^ %%' -e 's% [$]%%'])dnl +dnl --------------------------------------------------------------------------- +dnl CF__XOPEN_SOURCE_BODY version: 2 updated: 2023/02/18 17:41:25 +dnl --------------------- +dnl body of test when test-compiling for _XOPEN_SOURCE check +define([CF__XOPEN_SOURCE_BODY], +[ +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif +]) +dnl --------------------------------------------------------------------------- +dnl CF__XOPEN_SOURCE_HEAD version: 2 updated: 2023/02/18 17:41:25 +dnl --------------------- +dnl headers to include when test-compiling for _XOPEN_SOURCE check +define([CF__XOPEN_SOURCE_HEAD], +[ +$ac_includes_default +]) diff --git a/contrib/ncurses/announce.html.in b/contrib/ncurses/announce.html.in new file mode 100644 index 00000000..737dff41 --- /dev/null +++ b/contrib/ncurses/announce.html.in @@ -0,0 +1,1754 @@ + + + + + + Announcing ncurses @VERSION@ + + + + + +

Announcing ncurses @VERSION@

+ +

Overview

+ +

The ncurses (new curses) + library is a free software emulation of curses in System V + Release 4.0 (SVr4), and more. It uses terminfo format, supports + pads and color and multiple highlights and forms characters and + function-key mapping, and has all the other SVr4-curses + enhancements over BSD curses. SVr4 curses became the basis of + X/Open Curses.

+ +

In mid-June 1995, the maintainer of 4.4BSD curses declared + that he considered 4.4BSD curses obsolete, and encouraged the + keepers of unix releases such as + BSD/OS, FreeBSD and NetBSD to switch over to ncurses.

+ +

Since 1995, ncurses has been + ported to many systems:

+ +
    +
  • It is used in almost every system based on the Linux kernel + (aside from some embedded applications).
  • + +
  • It is used as the system curses library on OpenBSD, FreeBSD + and MacOS.
  • + +
  • It is used in environments such as Cygwin and MinGW. The + first of these was EMX on OS/2 Warp.
  • + +
  • It is used (though usually not as the system + curses) on all of the vendor unix systems, e.g., AIX, HP-UX, IRIX64, SCO, + Solaris, Tru64.
  • + +
  • It should work readily on any ANSI/POSIX-conforming + unix.
  • +
+ +

The distribution includes the library and support utilities, + including

+ +
    +
  • captoinfo, a termcap conversion + tool
  • + +
  • clear, utility for clearing the + screen
  • + +
  • infocmp, the terminfo decompiler
  • + +
  • tabs, set tabs on a terminal
  • + +
  • tic, the terminfo compiler
  • + +
  • toe, list (table of) terminfo + entries
  • + +
  • tput, utility for retrieving terminal + capabilities in shell scripts
  • + +
  • tset, to initialize the terminal
  • +
+ +

Full manual pages are provided for the library and tools.

+ +

The ncurses distribution is + available at ncurses' homepage:

+ +
+

https://invisible-island.net/archives/ncurses/ + or
+ https://invisible-mirror.net/archives/ncurses/ .

+
+ +

It is also available at the GNU distribution site

+ +
+

https://ftp.gnu.org/gnu/ncurses/ .

+
+ +

Release + Notes

+ +

These notes are for ncurses + @VERSION@, released April 27, 2024.

+ +

This release is designed to be source-compatible with + ncurses 5.0 through 6.4; providing + extensions to the application binary interface (ABI). Although + the source can still be configured to support the ncurses 5 ABI, the reason for the release is + to reflect improvements to the ncurses 6 ABI and the supporting utility + programs.

+ +

There are, of course, numerous other improvements, listed in + this announcement.

+ +

The most important + bug-fixes/improvements dealt with robustness issues. The + release notes also mention some other bug-fixes, but are focused + on new features and improvements to existing features since + ncurses 6.4 release.

+ +

Library improvements

+ +

New features

+ +

These are new features:

+ +
    +
  • +

    The low-level terminfo and termcap interfaces are used + both by the higher-level curses library, as well as by many + applications.

    + +

    The functions which convert parameterized terminal + capability strings for output to the terminal + (tiparm and tparm) analyze the + capability string to determine which parameters are strings + (i.e., addresses), versus numbers (not addresses).

    + +

    The library's analysis of a capability string may differ + from the calling application's design if environment + variables are used to point to an invalid terminal database. + This is a longstanding problem with all + implementations of terminfo, dating from the early 1980s.

    + +

    Two new functions address this problem: by providing a + function which allows the calling application to tell ncurses + how many string-parameters to expect:

    + +
      +
    • tiscan_s helps applications check + formatting capabilities that would be passed to + tiparm_s.
    • + +
    • tiparm_s provides applications a way to + tell ncurses what the expected parameters are for a + capability.
    • +
    +
  • + +
  • +

    The ncurses library supports a compile-time feature + (enabled with the configure --enable-check-size + option) which simplifies initialization with terminals which + do not negotiate window (screen) size. This is done in + setupterm, by providing for using ANSI + cursor-position report (in user6/user7 terminfo capabilities) + to obtain the screen size if neither environment variables or + ioctl is used.

    + +

    The ncurses test-program with options + “-E -T” demonstrates this + feature.

    +
  • + +
  • add functions to query tty-flags in + SCREEN
  • +
+ +

This release drops compatibility with obsolete versions of + tack, e.g., pre-1.08

+ +

Other + improvements

+ +

These are improvements to existing features:

+ +
    +
  • +

    In addition to the new, safer function + tiparm_s, ncurses adds checks to make the older + tiparm, tparm and + tgoto functions safer:

    + +
      +
    • +

      the terminfo functions tiparm and + tparm ensure that the capability string + comes from the terminal description which ncurses loads, + rather than from random data which the application + happens to have.

      +
    • + +
    • +

      the tgoto function disallows capabilities + which its analysis shows will attempt to use string + parameters.

      +
    • + +
    • +

      ncurses uses internal functions which correspond to + tiparm, and tgoto which ensure + that the capability strings which are passed to these + functions come from the loaded terminal description.

      +
    • +
    +
  • + +
  • +

    improve check in lib_tparm.c, ensuring that a + char* fits into a TPARM_ARG

    +
  • + +
  • +

    modify _nc_syserr_abort to use + _nc_env_access, rather than only checking root + uid

    +
  • + +
  • +

    improve thread lock in lib_trace.c

    +
  • + +
  • +

    modify flushinp to use file descriptors in + SCREEN, rather than from TERMINAL, + and check if they are for a terminal, like SVr4

    +
  • + +
  • +

    modify mcprint to use file descriptor in + SCREEN, for consistency

    +
  • + +
  • +

    modify internal function _nc_read_file_entry + to show relevant filename in warnings

    +
  • + +
  • +

    improve checks in internal function + convert_string for corrupt terminfo entry

    +
  • + +
  • +

    review/improve handling of out-of-memory conditions

    +
  • + +
  • +

    limit delays to 30 seconds, i.e., padding delays in + terminfo, as well as napms and + delay_output functions

    +
  • + +
  • +

    fix reallocation loop for vsnprintf in + _nc_sprintf_string by copying the va_list + variable

    +
  • + +
  • +

    modify delscreen to delete only windows associated + with the screen

    +
  • + +
  • +

    modify endwin to return an error if it is + called again without an intervening screen update

    +
  • + +
  • +

    modify wenclose to handle pads

    +
  • + +
  • +

    eliminate use of PATH_MAX in + lib_trace.c

    +
  • + +
  • +

    provide for any CCHARW_MAX greater than 1

    +
  • +
+ +

These are corrections to existing features:

+ +
    +
  • +

    correct loop termination condition in + waddnstr and waddnwstr

    +
  • + +
  • +

    improve parsing in internal function + _nc_msec_cost, allowing a single decimal + point

    +
  • + +
  • +

    amend parameter check for entire string versus specific + length in winsnstr and wins_nwstr + to match Solaris; make similar correction to + wins_nwstr

    +
  • + +
  • +

    correct internal function wadd_wch_literal + when adding a non-spacing character to a double-width + character

    +
  • + +
  • +

    correct definition of Charable macro for + non-wide ncurses library .

    +
  • +
+ +

Program + improvements

+ +

Several improvements were made to the + utility programs. Some were done to make the infocmp + option “-u” option help refactor the + terminal database.

+ +
+
infocmp +
+ +
+
    +
  • +

    add limit checks for processing extended capabilities + with the “-u” option

    +
  • + +
  • +

    correct initial alignment of extended capabilities, so + that the “-u” option can be used + for more than two terminal types

    +
  • + +
  • +

    modify “-u” option to not + report cancels for strings which were already cancelled + in a use'd chunk.

    +
  • + +
  • +

    correct an assignment “-u” + for detecting if a boolean is unset in a base entry and + set in a use'd chunk, i.e., if it was cancelled.

    +
  • +
+
+ +
tic +
+ +
+
    +
  • +

    correct limit-check when dumping tc/use clause via + “-I

    +
  • + +
  • +

    check return value of _nc_save_str, in + special case where extended capabilities are processed + but the terminal description was not initialized

    +
  • + +
  • +

    modify check for multiply defined aliases to report + problems within the current runtime rather than for + conflicts with pre-existing terminal descriptions.

    +
  • + +
  • +

    disallow using $TERMINFO or + $HOME/.terminfo when + “-o” option is used

    +
  • +
+
+ +
tput and tset
+ +
+
    +
  • +

    add “-v” option to tput, to + show warnings

    +
  • + +
  • +

    modify reset command to avoid altering clocal + if the terminal uses a modem

    +
  • + +
  • +

    modify reset feature to avoid 1-second sleep + if running in a pseudo-terminal

    +
  • +
+
+
+ +

Examples

+ +

Along with the library and utilities, improvements were made + to the ncurses-examples:

+ +
    +
  • +

    modify test_tparm to account for extended + capabilities

    +
  • + +
  • +

    corrected mouse mask in test/testcurs.c

    +
  • + +
  • +

    modify test/clip_printw.c to optionally test + non-wrapped updates

    +
  • + +
  • +

    modify test/test_mouse.c to use curses api + for raw/noraw

    +
  • + +
  • +

    modify test/clip_printw.c to optionally test + non-wrapped updates

    +
  • +
+ +

There is one new demo/test programs:

+ +
+
test/test_endwin.c +
+ +
+

This program shows the return-status from + endwin with different combinations of + endwin (repeated), initscr, + newterm.

+
+
+ +

Terminal database

+ +

There are several new terminal descriptions:

+ + + +

There are many changes to existing terminal descriptions. Some + were updates to several descriptions, using the + infocmp-u” option in a + script to determine which building-block entries could + be used to replace multiple capability settings (and trim + redundant information).

+ +

Other changes include:

+ +
    +
  • +

    document + XF, kxIN and kxOUT

    +
  • + +
  • +

    add note on sun + regarding wscons/cmdtool/shelltool

    +
  • + +
  • +

    remove DECCOLM+DECSCLM from foot

    +
  • + +
  • +

    add xterm+focus to foot+base

    +
  • + +
  • +

    add ecma+strikeout to putty

    +
  • + +
  • +

    use CSI 3J in vte-2017

    +
  • + +
  • +

    use oldxterm+sm+1006 in vte-2014

    +
  • + +
  • +

    modify xgterm + to work around line-drawing bug

    +
  • + +
  • +

    add xterm focus mode 1004 to xterm+focus + as fe/fd capabilities, like vim.

    +
  • + +
  • +

    add xterm+focus to alacritty+common

    +
  • + +
  • +

    add XR/xr, to work with vim, and use RV/rv to denote DA2 + and its response

    +
  • + +
  • +

    add XF flag to xterm+focus + so that termcap applications can be aware of terminals which + may support focus in/out

    +
  • + +
  • +

    use xterm+focus in xterm-p370 + and tmux

    +
  • + +
  • +

    remove xterm+sm+1006 from tmux

    +
  • + +
  • +

    NetBSD-related fixes for x68k and + wsvt25

    +
  • +
+ +

Documentation

+ +

As usual, this release

+ +
    +
  • +

    improves documentation by describing new features,

    +
  • + +
  • +

    attempts to improve the description of features which + users have found confusing

    +
  • + +
  • +

    fills in overlooked descriptions of features which were + described in the NEWS file + but treated sketchily in manual pages.

    +
  • +
+ +

In addition to providing background information to explain + these features and show how they evolved, there are corrections, + clarifications, etc.:

+ +
    +
  • +

    Corrections:

    + +
      +
    • +

      add assignment in CF_MAN_PAGES to fill in + value for TERMINFO_DIRS in ncurses, terminfo + and tic manpages.

      +
    • + +
    • +

      clarify interaction of -R option versus + -C, -I and -r in + infocmp manpage.

      +
    • + +
    • +

      correct manpage description of panel_hidden.

      +
    • + +
    • +

      improve manpage description for addch versus unctrl + format used for non-printable characters.

      +
    • + +
    • +

      improve manpages discussing file descriptors in + low-level functions.

      +
    • + +
    • +

      improve description of search rules for terminal + descriptions in terminfo manpage.

      +
    • + +
    • +

      modify dist.mk to avoid passing developer's comments + in manpages into the generated html documentation.

      +
    • + +
    • +

      modify test-package "ncurses6-doc" to use + manpage-aliases, which in turn required a change to the + configure script to factor in the extra-suffix option + when deriving alias names.

      +
    • +
    +
  • + +
  • +

    New/improved history and portability sections:

    + +
      +
    • +

      add information about "ttycap", termcap's forerunner, + to tset.1

      +
    • + +
    • +

      document limitations of tparm, and error-returns in + curs_terminfo.3x

      +
    • + +
    • +

      document limitations of tgoto, and error-returns in + curs_termcap.3x

      +
    • +
    +
  • + +
  • +

    Other improvements:

    + +
      +
    • +

      This release has many changes to improve the + formatting and style of the manpages.

      +
    • + +
    • +

      Manpages now use consistent section-naming, page + headers and footers (including the modification date for + each page).

      +
    • + +
    • +

      Table layout has been revised.

      +
    • +
    +
  • +
+ +

There are no new manual pages (all of the manual page updates + are to existing pages).

+ +

Interesting + bug-fixes

+ +

The changes to tparm, tgoto which improve + the design of the low-level interfaces are interesting, + but are not bug-fixes per se.

+ +

Configuration changes

+ +

Major + changes

+ +

These are the major changes (aside from introducing tiparm_s):

+ +
    +
  • +

    use wide-character (ncursesw) by default

    +
  • + +
  • +

    use opaque typedefs by default

    +
  • +
+ +

However, most of the work on configure scripts was done to + reduce warnings within the configure script:

+ +
    +
  • +

    intrusive warnings from GNU grep regarding fgrep and + egrep

    +
  • + +
  • +

    fatal errors in compile-checks, arising from recent + “Modern C” efforts by some developers which + caused longstanding configure checks to fail.

    + +

    After repairing the configure script, none of that + activity affected ncurses because stricter warnings are used + routinely in development.

    +
  • +
+ +

Other improvements made to configure checks include

+ +
    +
  • +

    use string-hacks + in alloc_entry.c, alloc_type.c and hardscroll.c, overlooked + due to compiler changes in recent OpenBSD releases

    +
  • + +
  • +

    revise progs.priv.h to provide for NC_ISATTY reuse

    +
  • + +
  • +

    configure check for MB_LEN_MAX provides warning as + needed

    +
  • + +
  • +

    trim a space after some "-R" options, fixing builds for + applications built using clang and ncurses on Solaris

    +
  • + +
  • +

    work around misconfiguration of MacPorts gcc13, which + exposes invalid definition of MB_LEN_MAX in gcc's + fallback copy of limits.h

    +
  • + +
  • +

    modified experimental Windows driver works with xterm + mouse protocol

    +
  • +
+ +

Configuration options

+ +

There are a few new configure options:

+ +
+
--disable-setuid-environ +
+ +
+

Compile with environment restriction, so certain + environment variables are not available when running via a + setuid/setgid application. These are (for example + $TERMINFO) those that allow the search path for the + terminfo or termcap entry to be customized.

+ +

A setuid/setgid application inherits its environment + variables from the current user, in contrast to sudo which + may limit the environment variables that ncurses uses.

+
+ +
--enable-check-size +
+ +
+

Compile-in feature to detect screensize for terminals + which do not advertise their screensize, e.g., serial + terminals.

+
+ +
--with-abi-altered=NUM +
+ +
+

Override the displayed (rather than compiled-in) ABI. Only + packagers who have created configurations where the ABI + differs from ncurses should be interested in this option.

+
+ +
--with-strip-program=XXX +
+ +
+

When stripping executables during install, use the + specified program rather than “strip” overriding + program chosen by the install program for stripping + executables.

+
+
+ +

These configure options are modified:

+ +
+
--with-pkg-config-libdir[=DIR] +
+ +
+

The optional DIR parameter can now be + “auto” to automatically use pkg-config's library + directory.

+ +

The default is $(libdir).

+
+ +
--with-xterm-kbs[=XXX] +
+ +
+

The default is “auto” which tells the + configure script to choose BS or DEL according to platform + defaults.

+
+
+ +

Portability

+ +

Many of the portability changes are implemented via the + configure script:

+ +
    +
  • +

    add/use configure check for clock_gettime, to + supersede gettimeofday.

    +
  • + +
  • +

    modify configure script check for pkg-config library + directory to take into account an older version 0.15.0 which + used PKG_CONFIG_PATH but not PKG_CONFIG_LIBDIR

    +
  • + +
  • +

    allow for MinGW32-/64-bit configurations to use + _DEFAULT_SOURCE

    +
  • + +
  • +

    modify CF_XOPEN_SOURCE macro's amend default case to avoid + undefining _XOPEN_SOURCE if _POSIX_C_SOURCE is defined

    +
  • + +
  • +

    updated configure script macro CF_XOPEN_SOURCE, for + uClibc-ng

    +
  • + +
  • +

    modify version-check for gcc/g++, now works for msys2

    +
  • + +
  • +

    build-fixes related to configure-options and/or + platform:

    + +
      +
    • fix for --enable-fvisibility
    • + +
    • fix for unusual values of + --with-rel-version
    • + +
    • fix for unusual values of + --with-abi-version
    • + +
    • fix for --disable-tcap-names
    • + +
    • fix for termcap in nc_access.h
    • +
    +
  • + +
  • +

    other configure-script improvements:

    + +
      +
    • recent msys2 headers work with + _DEFAULT_SOURCE; amend check
    • + +
    • use $ac_includes_default in most cases where + stdlib.h should work
    • + +
    • use #error consistently vs "make an + error"
    • + +
    • add configure macro for gettimeofday vs inline + check
    • +
    +
  • +
+ +

Here are some of the other portability fixes:

+ +
    +
  • +

    modify configure scripts/makefiles to omit + KEY_RESIZE if the corresponding SIGWINCH + feature is disabled

    +
  • + +
  • +

    increase MB_CUR_MAX to 16, matching glibc's + MB_LEN_MAX

    +
  • + +
  • +

    add BSD erase2 to characters handled by + tset/reset

    +
  • + +
  • +

    use getauxval when available, to improve + setuid/setgid checks

    +
  • + +
  • +

    set dwShareMode in calls to + CreateConsoleScreenBuffer

    +
  • + +
  • +

    use CreateFile with "CONIN$", + "CONOUT$" rather than GetStdHandle to + obtain a handle on the actual console, avoiding redirection + in the MinGW/Win32 configurations

    +
  • + +
  • +

    modify MinGW driver to return KEY_BACKSPACE when + an unmodified VK_BACK virtual key is entered

    +
  • + +
  • +

    modify MinGW configuration to provide for running in + MSYS/MSYS2 shells, assuming ConPTY support

    +
  • +
+ +
+ +

Features of + ncurses

+ +

The ncurses package is fully + upward-compatible with SVr4 (System V Release 4) curses:

+ +
    +
  • +

    All of the SVr4 calls have been implemented (and are + documented).

    +
  • + +
  • +

    ncurses supports the + features of SVr4 curses including keyboard mapping, color, + form drawing with ACS characters, and automatic recognition + of keypad and function keys.

    +
  • + +
  • +

    ncurses provides work-alike + replacements of SVr4 supplemental libraries based on curses, + but which were not specified by X/Open Curses:

    + +
      +
    • +

      the panel library, permitting windows to stack and + overlap

      +
    • + +
    • +

      the menu library, supporting a uniform but flexible + interface for menu programming

      +
    • + +
    • +

      the form library, supporting data collection through + on-screen forms

      +
    • +
    +
  • + +
  • +

    ncurses's terminal database + is fully compatible with that used by SVr4 curses.

    + +
      +
    • +

      ncurses supports + user-defined capabilities that it can see, but which are + hidden from SVr4 curses applications using the + same terminal database.

      +
    • + +
    • +

      It can be optionally configured to match the format + used in related systems such as AIX and Tru64.

      +
    • + +
    • +

      Alternatively, ncurses + can be configured to use hashed databases rather than the + directory of files used by SVr4 curses.

      +
    • +
    +
  • + +
  • +

    The ncurses utilities have + options to allow you to filter terminfo entries for use with + less capable curses/terminfo versions such + as the HP-UX and AIX ports.

    +
  • +
+ +

The ncurses package also has + many useful extensions over SVr4:

+ +
    +
  • +

    The API is 8-bit clean and base-level conformant with the + X/Open Curses specification, XSI curses (that is, it + implements all BASE level features, and almost all + EXTENDED features). It includes many function calls + not supported under SVr4 curses (but portability of all calls + is documented so you can use the SVr4 subset only).

    +
  • + +
  • +

    Unlike SVr3 curses, ncurses + can write to the rightmost-bottommost corner of the screen if + your terminal has an insert-character capability.

    +
  • + +
  • +

    Ada95 and C++ bindings.

    +
  • + +
  • +

    Support for mouse event reporting with X Window xterm and + FreeBSD and OS/2 console windows.

    +
  • + +
  • +

    Extended mouse support via Alessandro Rubini's gpm + package.

    +
  • + +
  • +

    The function wresize allows you to resize + windows, preserving their data.

    +
  • + +
  • +

    The function use_default_colors allows you to + use the terminal's default colors for the default color pair, + achieving the effect of transparent colors.

    +
  • + +
  • +

    The functions keyok and + define_key allow you to better control the use + of function keys, e.g., disabling the ncurses KEY_MOUSE, or by defining more + than one control sequence to map to a given key code.

    +
  • + +
  • +

    Support for direct-color terminals, such as modern + xterm.

    +
  • + +
  • +

    Support for 256-color terminals, such as modern xterm.

    +
  • + +
  • +

    Support for 16-color terminals, such as aixterm + and modern xterm.

    +
  • + +
  • +

    Better cursor-movement optimization. The package now + features a cursor-local-movement computation more efficient + than either BSD's or System V's.

    +
  • + +
  • +

    Super hardware scrolling support. The screen-update code + incorporates a novel, simple, and cheap algorithm that + enables it to make optimal use of hardware scrolling, + line-insertion, and line-deletion for screen-line movements. + This algorithm is more powerful than the 4.4BSD curses + quickch routine.

    +
  • + +
  • +

    Real support for terminals with the magic-cookie glitch. + The screen-update code will refrain from drawing a highlight + if the magic- cookie unattributed spaces required just before + the beginning and after the end would step on a non-space + character. It will automatically shift highlight boundaries + when doing so would make it possible to draw the highlight + without changing the visual appearance of the screen.

    +
  • + +
  • +

    It is possible to generate the library with a list of + pre-loaded fallback entries linked to it so that it can serve + those terminal types even when no terminfo tree or termcap + file is accessible (this may be useful for support of + screen-oriented programs that must run in single-user + mode).

    +
  • + +
  • +

    The tic/captoinfo utility + provided with ncurses has the + ability to translate many termcaps from the XENIX, IBM and + AT&T extension sets.

    +
  • + +
  • +

    A BSD-like tset utility is provided.

    +
  • + +
  • +

    The ncurses library and + utilities will automatically read terminfo entries from + $HOME/.terminfo if it exists, and compile to that directory + if it exists and the user has no write access to the system + directory. This feature makes it easier for users to have + personal terminfo entries without giving up access to the + system terminfo directory.

    +
  • + +
  • +

    You may specify a path of directories to search for + compiled descriptions with the environment variable + TERMINFO_DIRS (this generalizes the feature provided by + TERMINFO under stock System V.)

    +
  • + +
  • +

    In terminfo source files, use capabilities may refer not + just to other entries in the same source file (as in System + V) but also to compiled entries in either the system terminfo + directory or the user's $HOME/.terminfo directory.

    +
  • + +
  • +

    The table-of-entries utility toe makes it easy for users to see + exactly what terminal types are available on the system.

    +
  • + +
  • +

    X/Open Curses permits most functions it specifies to be + made available as macros as well. ncurses does this

    + +
      +
    • to improve performance, e.g., for operations composed + of simpler functions such as cursor movement following by + adding text to the screen,
    • + +
    • to simplify the implementation by reusing functions + which use common parameters, e.g., the standard screen + stdscr, and
    • + +
    • to provide functions that return values via their + parameters
    • +
    + +

    Except for the last case, ncurses provides a non-macro + implementation of the function. If the macro definition is + disabled with #undef, or by defining + NCURSES_NOMACROS the function may be linked (and + its calls will be checked against the prototype).

    +
  • + +
  • +

    Extensive documentation is provided (see the Additional + Reading section of the ncurses FAQ for online + documentation).

    +
  • +
+ +

Applications using + ncurses

+ +

The ncurses distribution + includes a selection of test programs (including a few games). + These are available separately as ncurses-examples

+ +

The ncurses library has been tested with a wide variety of + applications including:

+ +
+
+
aptitude +
+ +
+

FrontEnd to Apt, the debian package manager

+ +

https://wiki.debian.org/Aptitude

+
+ +
cdk +
+ +
+

Curses Development Kit

+ +

@WEBSITE@/cdk/
+

+
+ +
ded +
+ +
+

directory-editor

+ +

@WEBSITE@/ded/

+
+ +
dialog +
+ +
+

the underlying application used in Slackware's setup, + and the basis for similar install/configure applications on + many systems.

+ +

@WEBSITE@/dialog/

+
+ +
lynx +
+ +
+

the text WWW browser

+ +

https://lynx.invisible-island.net/

+
+ +
mutt +
+ +
+

mail utility

+ +

http://www.mutt.org/

+
+ +
ncftp +
+ +
+

file-transfer utility

+ +

https://www.ncftp.com/

+
+ +
nvi +
+ +
+

New vi uses ncurses.

+ +

+ https://sites.google.com/a/bostic.com/keithbostic/the-berkeley-vi-editor-home-page
+ +

+
+ +
ranger +
+ +
+

A console file manager with VI key bindings in + Python.

+ +

https://ranger.github.io/

+
+ +
tin +
+ +
+

newsreader, supporting color, MIME

+ +

http://www.tin.org/

+
+ +
vifm +
+ +
+

File manager with vi like keybindings

+ +

https://vifm.info/

+
+
+
+ +

as well as some that use ncurses for the terminfo support alone:

+ +
+
+
minicom +
+ +
+

terminal emulator for serial modem connections

+ +

https://salsa.debian.org/minicom-team/minicom

+
+ +
mosh +
+ +
+

a replacement for ssh.

+ +

https://mosh.org/

+
+ +
tack +
+ +
+

terminfo action checker

+ +

@HOMEPAGE@/tack.html

+
+ +
tmux +
+ +
+

terminal multiplexor

+ +

https://github.com/tmux/tmux/wiki

+
+ +
vile +
+ +
+

vi-like-emacs may be built to use the terminfo, + termcap or curses interfaces.

+ +

@WEBSITE@/vile/

+
+
+
+ +

and finally, those which use only the termcap interface:

+ +
+
+
emacs +
+ +
+

text editor

+ +

https://www.gnu.org/software/emacs/

+
+ +
less +
+ +
+

The most commonly used pager (a program that + displays text files).

+ +

http://www.greenwoodsoftware.com/less/

+
+ +
screen +
+ +
+

terminal multiplexor

+ +

https://www.gnu.org/software/screen/

+
+ +
vim +
+ +
+

text editor

+ +

https://www.vim.org/

+
+
+
+ +

Development + activities

+ +

Zeyd Ben-Halim started ncurses + from a previous package pcurses, written by Pavel Curtis. Eric S. + Raymond continued development. Jürgen Pfeifer wrote most of + the form and menu libraries.

+ +

Ongoing development work is done by Thomas E. Dickey. Thomas + E. Dickey has acted as the maintainer for the Free Software + Foundation, which held a copyright on ncurses for + releases 4.2 through 6.1. Following the release of ncurses 6.1, + effective as of release 6.2, copyright for ncurses reverted to + Thomas E. Dickey (see the ncurses FAQ for + additional information).

+ +

Contact the current maintainers at

+ +
+ bug-ncurses@gnu.org +
+ +

To join the ncurses mailing list, please write email to

+ +
+ bug-ncurses-request@gnu.org +
+ containing the line: +
+

subscribe + <name>@<host.domain>

+
+ +

This list is open to anyone interested in helping with the + development and testing of this package.

+ +

Beta versions of ncurses are + made available at

+ +
+

https://invisible-island.net/archives/ncurses/current/ + and
+ https://invisible-mirror.net/archives/ncurses/current/ .

+
+ +

Patches to the current release are made available at

+ +
+

https://invisible-island.net/archives/ncurses/6.4/ + and
+ https://invisible-mirror.net/archives/ncurses/6.4/ .

+
+ +

There is an archive of the mailing list here:

+ +
+

https://lists.gnu.org/archive/html/bug-ncurses .

+
+ +

Related + resources

+ +

The release notes make scattered references to these pages, + which may be interesting by themselves:

+ + + +

Other + resources

+ +

The distribution provides a newer version of the + terminfo-format terminal description file once maintained by + Eric + Raymond . Unlike the older version, the termcap and + terminfo data are provided in the same file, which also provides + several user-definable extensions beyond the X/Open Curses + specification.

+ +

You can find lots of information on terminal-related topics + not covered in the terminfo file in Richard Shuford's + archive (original). + The collection of computer manuals at bitsavers.org has also been + useful.

+ + + + diff --git a/contrib/ncurses/c++/Makefile.in b/contrib/ncurses/c++/Makefile.in new file mode 100644 index 00000000..61e25e6b --- /dev/null +++ b/contrib/ncurses/c++/Makefile.in @@ -0,0 +1,294 @@ +# $Id: Makefile.in,v 1.135 2024/08/11 15:48:44 tom Exp $ +############################################################################## +# Copyright 2018-2021,2024 Thomas E. Dickey # +# Copyright 1998-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# Simple makefile for c++ window class demo + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ + +CF_MFLAGS = @cf_cv_makeflags@ +@SET_MAKE@ +x = @EXEEXT@ +o = .@OBJEXT@ + +MODEL = ../@DFT_OBJ_SUBDIR@ +DESTDIR = @DESTDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) + +PACKAGE = @PACKAGE@ + +LIBTOOL = @LIBTOOL_CXX@ +LIBTOOL_OPTS = @LIBTOOL_OPTS@ @LIBTOOL_OPTS_CXX@ +LIBTOOL_CLEAN = @LIB_CLEAN@ +LIBTOOL_COMPILE = @LIB_COMPILE@ +LIBTOOL_LINK = @LIB_LINK@ +LIBTOOL_INSTALL = @LIB_INSTALL@ +LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ +LIBTOOL_VERSION = @LIBTOOL_VERSION@ +LT_UNDEF = @LT_UNDEF@ + +INSTALL = @INSTALL@ +INSTALL_LIB = $(INSTALL) @INSTALL_LIB@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_OPT_P = @INSTALL_OPT_P@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AWK = @AWK@ +LD = @LD@ +LN_S = @LN_S@ + +CXX_AR = @CXX_AR@ +CXX_ARFLAGS = @CXX_ARFLAGS@ +RANLIB = @LIB_PREP@ + +CXX = @CXX@ +CPP = @CXXCPP@ +CXXFLAGS = @CXXFLAGS@ @EXTRA_CXXFLAGS@ +CXXLIBS = @CXXLIBS@ + +INCDIR = ../include +CPPFLAGS = -DHAVE_CONFIG_H -DBUILDING_NCURSES_CXX -I../c++ @CPPFLAGS@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +CC = ${CXX} +CCFLAGS = $(CPPFLAGS) $(CXXFLAGS) + +CFLAGS_LIBTOOL = $(CCFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CXX_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +NCURSES_MAJOR = @NCURSES_MAJOR@ +NCURSES_MINOR = @NCURSES_MINOR@ +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ + +LOCAL_LIBDIR = @top_builddir@/lib + +LINK = @LINK_PROGS@ $(LIBTOOL_LINK) @CXXLDFLAGS@ +SHLIB_DIRS = -L../lib +SHLIB_LIST = $(SHLIB_DIRS) \ + -l@FORM_NAME@@USE_LIB_SUFFIX@ \ + -l@MENU_NAME@@USE_LIB_SUFFIX@ \ + -l@PANEL_NAME@@USE_LIB_SUFFIX@ \ + -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ + +LIBROOT = ncurses++ + +LIBNAME_LIBTOOL = @LIB_PREFIX@$(LIBROOT)@USE_LIB_SUFFIX@.la +LIBNAME_NORMAL = @LIB_PREFIX@$(LIBROOT)@USE_LIB_SUFFIX@.a +LIBNAME = @LIB_PREFIX@$(LIBROOT)@CXX_LIB_SUFFIX@ + +LIBRARIES = @Libs_To_Make@ + +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ +LINT_LIBS = -lncurses @LIBS@ + +LINK_FLAGS = @EXTRA_LDFLAGS@ -L../lib -l$(LIBROOT)@USE_LIB_SUFFIX@ +RPATH_LIST = @RPATH_LIST@ +MK_SHARED_LIB = @MK_SHARED_LIB@ + +LINK_LIBTOOL = @EXTRA_LDFLAGS@ -L../lib $(LIBRARIES) +LINK_NORMAL = $(LINK_FLAGS) +LINK_DEBUG = $(LINK_FLAGS) +LINK_PROFILE = $(LINK_FLAGS) +LINK_SHARED = $(LINK_FLAGS) + +# flags for test-programs +TEST_LIBS = @TEST_LIBS@ +TEST_ARGS = @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@ +TEST_LDFLAGS = $(TEST_ARGS) @LDFLAGS@ \ + @LD_MODEL@ $(TEST_LIBS) @LIBS@ @LOCAL_LDFLAGS@ $(CXXLIBS) + +LDFLAGS_LIBTOOL = $(TEST_LDFLAGS) $(CFLAGS_LIBTOOL) +LDFLAGS_NORMAL = $(TEST_LDFLAGS) $(CFLAGS_NORMAL) +LDFLAGS_DEBUG = $(TEST_LDFLAGS) $(CFLAGS_DEBUG) +LDFLAGS_PROFILE = $(TEST_LDFLAGS) $(CFLAGS_PROFILE) +LDFLAGS_SHARED = $(TEST_LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@ + +LDFLAGS_DEFAULT = $(LINK_@DFT_UPR_MODEL@) $(LDFLAGS_@DFT_UPR_MODEL@) + +# flags for library built by this makefile +LDFLAGS = $(TEST_ARGS) @LDFLAGS@ \ + @LD_MODEL@ $(TEST_LIBS) @LIBS@ $(CXXLIBS) + +AUTO_SRC = \ + etip.h + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : depend +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs :: $(AUTO_SRC) $(LIBRARIES) + +@MAKE_TESTS@all :: demo$x + +depend : + +sources : $(AUTO_SRC) + +tags: + $(CTAGS) *.[h] *.cc + +$(LIBDIR) : + mkdir -p $@ + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ii *.ln *.atac trace + +clean :: mostlyclean + -$(SHELL) -c "if test -n '$x' ; then $(MAKE) clean x=''; fi" + -rm -rf $(MODEL)/SunWS_cache + -$(LIBTOOL_CLEAN) rm -f demo$x $(AUTO_SRC) $(LIBRARIES) $(OBJS_DEMO) + -rm -rf .libs *.dSYM + +distclean :: clean + -rm -f Makefile + +realclean :: distclean + +############################################################################### + +HEADER_DEPS = @INTERNALS_HDR@ \ + etip.h \ + ../include/curses.h \ + ../include/eti.h \ + ../include/form.h \ + ../include/menu.h \ + ../include/ncurses_cfg.h \ + ../include/ncurses_def.h \ + ../include/ncurses_dll.h \ + ../include/panel.h \ + ../include/unctrl.h \ + $(INCDIR)/nc_string.h \ + $(srcdir)/cursesp.h \ + $(srcdir)/cursesw.h \ + $(srcdir)/cursslk.h \ + $(srcdir)/internal.h + +cursesw_h = $(srcdir)/cursesw.h \ + $(HEADER_DEPS) + +cursesp_h = $(srcdir)/cursesp.h \ + $(cursesw_h) + +cursesf_h = $(srcdir)/cursesf.h \ + $(cursesp_h) + +cursesm_h = $(srcdir)/cursesm.h \ + $(cursesp_h) + +cursslk_h = $(srcdir)/cursslk.h \ + $(cursesw_h) + +cursesapp_h = $(srcdir)/cursesapp.h \ + $(cursslk_h) + +$(INCDIR)/form.h : + ( cd ../form && $(MAKE) $@ ) + +$(INCDIR)/menu.h : + ( cd ../menu && $(MAKE) $@ ) + +$(INCDIR)/panel.h : + ( cd ../panel && $(MAKE) $@ ) + +############################################################################### + +OBJS_DEMO = $(MODEL)/demo$o + +$(MODEL)/demo$o : $(srcdir)/demo.cc \ + $(HEADER_DEPS) \ + $(cursesf_h) \ + $(cursesm_h) \ + $(cursesapp_h) + @echo 'compiling demo (obj_s)' + @( cd $(MODEL) && $(LIBTOOL_COMPILE) $(CXX) $(CFLAGS_DEFAULT) -c $(top_srcdir)/c++/demo.cc -o $@ ) + +demo$x: $(OBJS_DEMO) \ + $(LIBRARIES) \ + @TEST_DEPS@ + @ECHO_LD@ $(LINK) -o $@ $(OBJS_DEMO) $(LDFLAGS_DEFAULT) + +etip.h: $(srcdir)/etip.h.in $(srcdir)/edit_cfg.sh + cp $(srcdir)/etip.h.in $@ + $(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@ + +# Verify that each header-file can be compiled without including another. +check :: + @$(SHELL) -c "for header in *.h;\ + do \ + [ \$${header} = etip.h ] && continue; \ + echo \"** testing \$${header}\" ; \ + echo \"#include <\$${header}>\" >headers.cc; \ + echo \"int main(int argc, char **argv) { (void) argc; (void) argv; return 0; }\" >>headers.cc; \ + $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) headers.cc; \ + done" + -@rm -f headers.* + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/c++/NEWS b/contrib/ncurses/c++/NEWS new file mode 100644 index 00000000..998e5ff3 --- /dev/null +++ b/contrib/ncurses/c++/NEWS @@ -0,0 +1,72 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-1999,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: NEWS,v 1.6 2021/06/17 21:20:30 tom Exp $ +------------------------------------------------------------------------------- +This is a log of changes that the ncurses C++ binding has gone +through starting with the integration of menu and forms integration +into the binding. + +990731 + Improve support for pads. A viewport window may now be added to + a pad. It will then be possible to use a builtin panning mechanism + to view the pad. + +970908 + Improve NCursesWindow class: added additional methods to + cover more ncurses functionality. Make refresh() and + noutrefresh() virtual members to allow different implementation + in the NCursesPanel class. + + CAUTION: changed order of parameters in vline() and hline() of + NCursesWindow class. + + Make refresh() in NCursesPanel non-static, it is now a + reimplementation of refresh() in the base class. Added + noutrefresh() to NCursesPanel. + + Added NCursesForm and related classes to support libform + functionality. + + Moved most of configuration related stuff from cursesw.h to + etip.h + + Added NCursesApplication class to support easy configuration + of menu and forms related attributes as well as ripped of + title lines and Soft-Label-Keys for an application. + + Support of Auto-Cleanup for a menus fieldlist. + + Change of return type for current_item() and operator[] for + menus. + + Enhanced demo. +970502 + + Introduced the THROW and THROWS functions/macros to prepare + a smoother transition to real exception handling. + + Exception classes provided in etip.h + + Added the NCursesMenu class to support libmenu functionality. + + The inheritace relation between NCursesWindow and NCursesColorWindow + was kind of brain damage. Monochrome is a special case of colored, so + the relation should be just the opposite. This would allow all + derived classes like NCursesPanel, NCursesMenu or NCursesForm to + have colors. + To resolve that design flaw I put the color functionality into the + NCursesWindow class and it can be switched on by the static member + useColors(). NCursesColorWindow is still there for compatibility + reasons. diff --git a/contrib/ncurses/c++/PROBLEMS b/contrib/ncurses/c++/PROBLEMS new file mode 100644 index 00000000..daa37545 --- /dev/null +++ b/contrib/ncurses/c++/PROBLEMS @@ -0,0 +1,35 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: PROBLEMS,v 1.4 2020/02/02 23:34:34 tom Exp $ +------------------------------------------------------------------------------- +This is a list of open problems. This mainly lists known missing pieces +and design flaws. + +1. Testing!!! +2. Better demo program diff --git a/contrib/ncurses/c++/README-first b/contrib/ncurses/c++/README-first new file mode 100644 index 00000000..313c1f8e --- /dev/null +++ b/contrib/ncurses/c++/README-first @@ -0,0 +1,81 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-2006,2007 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README-first,v 1.11 2021/06/17 21:20:30 tom Exp $ +------------------------------------------------------------------------------- + C++ interface to ncurses routines +----------------------------------------------------------------------- + +This directory contains the source code for several C++ classes which +ease the use of writing ncurses-based programs. The code was originally +derived from the libg++ CursesWindow class, but rewritten for ncurses. + +The classes simplify the use of window specific functions by +encapsulating them in the window object. Function overloading is +used in order to narrow the interface. For example, you do not have the +distinction between `printw' and `mvprintw' anymore. + +A second benefit is the removal of all #defines which are included in +the curses.h file. This is a steady cause of trouble because many +common identifiers are used. Instead now all #defines are inline +functions, which also allows strict type checking of arguments. + +The next enhancement is color support. It was originally provided by a +derived class. This caused some trouble if you think about Panels or +Menus and Forms with colors. We decided to put color support into the +base class so that any derived class may use color support also. +The implementation chosen here is directed to unrestricted use +of mixes of color and monochrome windows. The original NCursesColorWindow +class is maintained for compatibility reasons. + +The last point to mention is the support of other packages that are +distributed with the ncurses package: the panels library, the menu library +and the form library. This support is provided by the NCursesPanel class, +which is also derived from the NCursesWindow class and the NCursesMenu +and NCursesForm classes which are derived from NCursesPanel. This allows +building interfaces with windows. + +Please see the example program for a quick introduction. + +Note that at this point, there is no documentation for these classes. +Hopefully some will be written in the not too distant future. For now, +to find out how to use the classes, read the code and the example program. + +Suggestions for enhancements and contributions of code (and docs) are +welcome. Please let us know which functionality you miss. + +Original author: + Eric Newton for FSF's libg++ + +Authors of first ncurses based release (NCursesWindow, NCursesPanel): + Ulrich Drepper + and Anatoly Ivasyuk + +Authors of this release: + Juergen Pfeifer + Thomas E. Dickey diff --git a/contrib/ncurses/c++/cursesapp.cc b/contrib/ncurses/c++/cursesapp.cc new file mode 100644 index 00000000..81f60983 --- /dev/null +++ b/contrib/ncurses/c++/cursesapp.cc @@ -0,0 +1,174 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2007,2008 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + * and: Thomas E. Dickey * + ****************************************************************************/ + +#include "internal.h" +#include "cursesapp.h" + +MODULE_ID("$Id: cursesapp.cc,v 1.18 2020/07/18 19:57:11 anonymous.maarten Exp $") + +void +NCursesApplication::init(bool bColors) +{ + if (bColors) + NCursesWindow::useColors(); + + if (Root_Window->colors() > 1) { + b_Colors = TRUE; + Root_Window->setcolor(1); + Root_Window->setpalette(COLOR_YELLOW,COLOR_BLUE); + Root_Window->setcolor(2); + Root_Window->setpalette(COLOR_CYAN,COLOR_BLUE); + Root_Window->setcolor(3); + Root_Window->setpalette(COLOR_BLACK,COLOR_BLUE); + Root_Window->setcolor(4); + Root_Window->setpalette(COLOR_BLACK,COLOR_CYAN); + Root_Window->setcolor(5); + Root_Window->setpalette(COLOR_BLUE,COLOR_YELLOW); + Root_Window->setcolor(6); + Root_Window->setpalette(COLOR_BLACK,COLOR_GREEN); + } + else + b_Colors = FALSE; + + Root_Window->bkgd(' '|window_backgrounds()); +} + +NCursesApplication* NCursesApplication::theApp = 0; +NCursesWindow* NCursesApplication::titleWindow = 0; +NCursesApplication::SLK_Link* NCursesApplication::slk_stack = 0; + + +NCursesWindow *&NCursesApplication::getTitleWindow() { + return titleWindow; +} + +NCursesApplication::~NCursesApplication() THROWS(NCursesException) +{ + Soft_Label_Key_Set* S; + + delete titleWindow; + titleWindow = 0; + + while( (S=top()) ) { + pop(); + delete S; + } + + delete Root_Window; + Root_Window = 0; + + ::endwin(); +} + +NCursesApplication* NCursesApplication::getApplication() { + return theApp; +} + +int NCursesApplication::rinit(NCursesWindow& w) +{ + titleWindow = &w; + return OK; +} + +void NCursesApplication::push(Soft_Label_Key_Set& S) +{ + SLK_Link* L = new SLK_Link; + assert(L != 0); + L->prev = slk_stack; + L->SLKs = &S; + slk_stack = L; + if (Root_Window) + S.show(); +} + +bool NCursesApplication::pop() +{ + if (slk_stack) { + SLK_Link* L = slk_stack; + slk_stack = slk_stack->prev; + delete L; + if (Root_Window) { + Soft_Label_Key_Set* xx = top(); + if (xx != 0) + xx->show(); + } + } + return (slk_stack ? FALSE : TRUE); +} + +Soft_Label_Key_Set* NCursesApplication::top() const +{ + if (slk_stack) + return slk_stack->SLKs; + else + return static_cast(0); +} + +int NCursesApplication::operator()(void) +{ + bool bColors = b_Colors; + Soft_Label_Key_Set* S = 0; + + int ts = titlesize(); + if (ts>0) + NCursesWindow::ripoffline(ts,rinit); + Soft_Label_Key_Set::Label_Layout fmt = useSLKs(); + if (fmt!=Soft_Label_Key_Set::None) { + S = new Soft_Label_Key_Set(fmt); + assert(S != 0); + init_labels(*S); + } + + Root_Window = new NCursesWindow(::stdscr); + init(bColors); + + if (ts>0) + title(); + if (fmt!=Soft_Label_Key_Set::None) { + push(*S); + } + + return run(); +} + +NCursesApplication::NCursesApplication(bool bColors) + : b_Colors(bColors), + Root_Window(NULL) +{ + if (theApp) + THROW(new NCursesException("Application object already created.")); + else + theApp = this; +} diff --git a/contrib/ncurses/c++/cursesapp.h b/contrib/ncurses/c++/cursesapp.h new file mode 100644 index 00000000..1296f374 --- /dev/null +++ b/contrib/ncurses/c++/cursesapp.h @@ -0,0 +1,191 @@ +// * This makes emacs happy -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019-2020,2021 Thomas E. Dickey * + * Copyright 1998-2005,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +// $Id: cursesapp.h,v 1.18 2021/06/17 21:26:02 tom Exp $ + +#ifndef NCURSES_CURSESAPP_H_incl +#define NCURSES_CURSESAPP_H_incl + +#include + +#if (defined(_WIN32) || defined(_WIN64)) +# define NCURSES_CXX_MAIN_NAME cursespp_main +# define NCURSES_CXX_MAIN \ + int main(int argc, char *argv[]) { \ + return NCURSES_CXX_MAIN_NAME(argc, argv); \ + } +#else +# define NCURSES_CXX_MAIN_NAME main +#endif +NCURSES_CXX_IMPEXP int NCURSES_CXX_MAIN_NAME(int argc, char *argv[]); + +class NCURSES_CXX_IMPEXP NCursesApplication { +public: + typedef struct _slk_link { // This structure is used to maintain + struct _slk_link* prev; // a stack of SLKs + Soft_Label_Key_Set* SLKs; + } SLK_Link; +private: + static int rinit(NCursesWindow& w); // Internal Init function for title + static NCursesApplication* theApp; // Global ref. to the application + + static SLK_Link* slk_stack; + +protected: + static NCursesWindow* titleWindow; // The Title Window (if any) + + bool b_Colors; // Is this a color application? + NCursesWindow* Root_Window; // This is the stdscr equiv. + + // Initialization of attributes; + // Rewrite this in your derived class if you prefer other settings + virtual void init(bool bColors); + + // The number of lines for the title window. Default is no title window + // You may rewrite this in your derived class + virtual int titlesize() const { + return 0; + } + + // This method is called to put something into the title window initially + // You may rewrite this in your derived class + virtual void title() { + } + + // The layout used for the Soft Label Keys. Default is to have no SLKs. + // You may rewrite this in your derived class + virtual Soft_Label_Key_Set::Label_Layout useSLKs() const { + return Soft_Label_Key_Set::None; + } + + // This method is called to initialize the SLKs. Default is nothing. + // You may rewrite this in your derived class + virtual void init_labels(Soft_Label_Key_Set& S) const { + (void) S; + } + + // Your derived class must implement this method. The return value must + // be the exit value of your application. + virtual int run() = 0; + + // The constructor is protected, so you may use it in your derived + // class constructor. The argument tells whether or not you want colors. + NCursesApplication(bool wantColors = FALSE); + + NCursesApplication& operator=(const NCursesApplication& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + NCursesApplication(const NCursesApplication& rhs) + : b_Colors(rhs.b_Colors), + Root_Window(rhs.Root_Window) + { + } + + static NCursesWindow *&getTitleWindow(); + +public: + virtual ~NCursesApplication() THROWS(NCursesException); + + // Get a pointer to the current application object + static NCursesApplication* getApplication(); + + // This method runs the application and returns its exit value + int operator()(void); + + // Process the commandline arguments. The default implementation simply + // ignores them. Your derived class may rewrite this. + virtual void handleArgs(int argc, char* argv[]) { + (void) argc; + (void) argv; + } + + // Does this application use colors? + inline bool useColors() const { + return b_Colors; + } + + // Push the Key Set S onto the SLK Stack. S then becomes the current set + // of Soft Labelled Keys. + void push(Soft_Label_Key_Set& S); + + // Throw away the current set of SLKs and make the previous one the + // new current set. + bool pop(); + + // Retrieve the current set of Soft Labelled Keys. + Soft_Label_Key_Set* top() const; + + // Attributes to use for menu and forms foregrounds + virtual chtype foregrounds() const { + return b_Colors ? static_cast(COLOR_PAIR(1)) : A_BOLD; + } + + // Attributes to use for menu and forms backgrounds + virtual chtype backgrounds() const { + return b_Colors ? static_cast(COLOR_PAIR(2)) : A_NORMAL; + } + + // Attributes to use for inactive (menu) elements + virtual chtype inactives() const { + return b_Colors ? static_cast(COLOR_PAIR(3)|A_DIM) : A_DIM; + } + + // Attributes to use for (form) labels and SLKs + virtual chtype labels() const { + return b_Colors ? static_cast(COLOR_PAIR(4)) : A_NORMAL; + } + + // Attributes to use for form backgrounds + virtual chtype dialog_backgrounds() const { + return b_Colors ? static_cast(COLOR_PAIR(4)) : A_NORMAL; + } + + // Attributes to use as default for (form) window backgrounds + virtual chtype window_backgrounds() const { + return b_Colors ? static_cast(COLOR_PAIR(5)) : A_NORMAL; + } + + // Attributes to use for the title window + virtual chtype screen_titles() const { + return b_Colors ? static_cast(COLOR_PAIR(6)) : A_BOLD; + } + +}; + +#endif /* NCURSES_CURSESAPP_H_incl */ diff --git a/contrib/ncurses/c++/cursesf.cc b/contrib/ncurses/c++/cursesf.cc new file mode 100644 index 00000000..bf89ecaf --- /dev/null +++ b/contrib/ncurses/c++/cursesf.cc @@ -0,0 +1,474 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019-2021,2024 Thomas E. Dickey * + * Copyright 1998-2005,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +#include "internal.h" +#include "cursesf.h" +#include "cursesapp.h" + +MODULE_ID("$Id: cursesf.cc,v 1.27 2024/10/05 22:47:12 tom Exp $") + +NCursesFormField::~NCursesFormField () THROWS(NCursesException) +{ + if (field) + OnError(::free_field (field)); +} + +/* Construct a FIELD* array from an array of NCursesFormField + * objects. + */ +FIELD** +NCursesForm::mapFields(NCursesFormField* nfields[]) +{ + int fieldCount = 0,lcv; + FIELD** old_fields; + + assert(nfields != 0); + + for (lcv=0; nfields[lcv]->field; ++lcv) + ++fieldCount; + + FIELD** fields = new FIELD*[fieldCount + 1]; + + for (lcv=0;nfields[lcv]->field;++lcv) { + fields[lcv] = nfields[lcv]->field; + } + fields[lcv] = NULL; + + my_fields = nfields; + + if (form && (old_fields = ::form_fields(form))) { + ::set_form_fields(form, static_cast(0)); + delete[] old_fields; + } + return fields; +} + +void NCursesForm::setDefaultAttributes() +{ + const NCursesApplication* S = NCursesApplication::getApplication(); + + int n = count(); + if (n > 0) { + for(int i=0; ioptions() & (O_EDIT|O_ACTIVE))==(O_EDIT|O_ACTIVE)) { + if (S) { + f->set_foreground(S->foregrounds()); + f->set_background(S->backgrounds()); + } + f->set_pad_character('_'); + } + else { + if (S) + f->set_background(S->labels()); + } + } + } + + if (S) { + bkgd(' '|S->dialog_backgrounds()); + if (sub) + sub->bkgd(' '|S->dialog_backgrounds()); + } +} + +void +NCursesForm::InitForm(NCursesFormField* nfields[], + bool with_frame, + bool autoDelete_Fields) +{ + int mrows, mcols; + + keypad(TRUE); + meta(TRUE); + + b_framed = with_frame; + b_autoDelete = autoDelete_Fields; + + form = static_cast(0); + form = ::new_form(mapFields(nfields)); + if (!form) + OnError (E_SYSTEM_ERROR); + + UserHook* hook = new UserHook; + hook->m_user = NULL; + hook->m_back = this; + hook->m_owner = form; + ::set_form_userptr(form, reinterpret_cast(hook)); + + ::set_form_init (form, _nc_xx_frm_init); + ::set_form_term (form, _nc_xx_frm_term); + ::set_field_init (form, _nc_xx_fld_init); + ::set_field_term (form, _nc_xx_fld_term); + + scale(mrows, mcols); + ::set_form_win(form, w); + + if (with_frame) { + if ((mrows > height()-2) || (mcols > width()-2)) + OnError(E_NO_ROOM); + sub = new NCursesWindow(*this,mrows,mcols,1,1,'r'); + ::set_form_sub(form, sub->w); + b_sub_owner = TRUE; + } + else { + sub = static_cast(0); + b_sub_owner = FALSE; + } + options_on(O_NL_OVERLOAD); + setDefaultAttributes(); +} + +NCursesForm::~NCursesForm() THROWS(NCursesException) +{ + UserHook* hook = reinterpret_cast(::form_userptr(form)); + delete hook; + if (b_sub_owner) { + delete sub; + ::set_form_sub(form, static_cast(0)); + } + if (form) { + FIELD** fields = ::form_fields(form); + int cnt = count(); + + OnError(::set_form_fields(form, static_cast(0))); + + if (b_autoDelete) { + if (cnt>0) { + for (int i=0; i <= cnt; i++) + delete my_fields[i]; + } + delete[] my_fields; + } + + ::free_form(form); + // It's essential to do this after free_form() + delete[] fields; + } +} + +void +NCursesForm::setSubWindow(NCursesWindow& nsub) +{ + if (!isDescendant(nsub)) + OnError(E_SYSTEM_ERROR); + else { + if (b_sub_owner) + delete sub; + sub = ⊄ + ::set_form_sub(form,sub->w); + } +} + +/* Internal hook functions. They will route the hook + * calls to virtual methods of the NCursesForm class, + * so in C++ providing a hook is done simply by + * implementing a virtual method in a derived class + */ +void +_nc_xx_frm_init(FORM *f) +{ + NCursesForm::getHook(f)->On_Form_Init(); +} + +void +_nc_xx_frm_term(FORM *f) +{ + NCursesForm::getHook(f)->On_Form_Termination(); +} + +void +_nc_xx_fld_init(FORM *f) +{ + NCursesForm* F = NCursesForm::getHook(f); + F->On_Field_Init (*(F->current_field ())); +} + +void +_nc_xx_fld_term(FORM *f) +{ + NCursesForm* F = NCursesForm::getHook(f); + F->On_Field_Termination (*(F->current_field ())); +} + +void +NCursesForm::On_Form_Init() +{ +} + +void +NCursesForm::On_Form_Termination() +{ +} + +void +NCursesForm::On_Field_Init(NCursesFormField& field) +{ + (void) field; +} + +void +NCursesForm::On_Field_Termination(NCursesFormField& field) +{ + (void) field; +} + +// call the form driver and do basic error checking. +int +NCursesForm::driver (int c) +{ + int res = ::form_driver (form, c); + switch (res) { + case E_OK: + case E_REQUEST_DENIED: + case E_INVALID_FIELD: + case E_UNKNOWN_COMMAND: + break; + default: + OnError (res); + } + return (res); +} + +void NCursesForm::On_Request_Denied(int c) const +{ + (void) c; + ::beep(); +} + +void NCursesForm::On_Invalid_Field(int c) const +{ + (void) c; + ::beep(); +} + +void NCursesForm::On_Unknown_Command(int c) const +{ + (void) c; + ::beep(); +} + +static const int CMD_QUIT = MAX_COMMAND + 1; + +NCursesFormField* +NCursesForm::operator()(void) +{ + int drvCmnd; + int c; + + post(); + show(); + refresh(); + + while (((drvCmnd = virtualize((c = getKey()))) != CMD_QUIT)) { + int err; + switch((err = driver(drvCmnd))) { + case E_REQUEST_DENIED: + On_Request_Denied(c); + break; + case E_INVALID_FIELD: + On_Invalid_Field(c); + break; + case E_UNKNOWN_COMMAND: + On_Unknown_Command(c); + break; + case E_OK: + break; + default: + OnError(err); + } + } + + unpost(); + hide(); + refresh(); + return my_fields[::field_index (::current_field (form))]; +} + +// Provide a default key virtualization. Translate the keyboard +// code c into a form request code. +// The default implementation provides a hopefully straightforward +// mapping for the most common keystrokes and form requests. +int +NCursesForm::virtualize(int c) +{ + switch(c) { + + case KEY_HOME : return(REQ_FIRST_FIELD); + case KEY_END : return(REQ_LAST_FIELD); + + case KEY_DOWN : return(REQ_DOWN_CHAR); + case KEY_UP : return(REQ_UP_CHAR); + case KEY_LEFT : return(REQ_PREV_CHAR); + case KEY_RIGHT : return(REQ_NEXT_CHAR); + + case KEY_NPAGE : return(REQ_NEXT_PAGE); + case KEY_PPAGE : return(REQ_PREV_PAGE); + + case KEY_BACKSPACE : return(REQ_DEL_PREV); + case KEY_ENTER : return(REQ_NEW_LINE); + case KEY_CLEAR : return(REQ_CLR_FIELD); + + case CTRL('X') : return(CMD_QUIT); // eXit + + case CTRL('F') : return(REQ_NEXT_FIELD); // Forward + case CTRL('B') : return(REQ_PREV_FIELD); // Backward + case CTRL('L') : return(REQ_LEFT_FIELD); // Left + case CTRL('R') : return(REQ_RIGHT_FIELD); // Right + case CTRL('U') : return(REQ_UP_FIELD); // Up + case CTRL('D') : return(REQ_DOWN_FIELD); // Down + + case CTRL('W') : return(REQ_NEXT_WORD); + case CTRL('T') : return(REQ_PREV_WORD); + + case CTRL('A') : return(REQ_BEG_FIELD); + case CTRL('E') : return(REQ_END_FIELD); + + case CTRL('I') : return(REQ_INS_CHAR); + case CTRL('M') : + case CTRL('J') : return(REQ_NEW_LINE); + case CTRL('O') : return(REQ_INS_LINE); + case CTRL('V') : return(REQ_DEL_CHAR); + case CTRL('H') : return(REQ_DEL_PREV); + case CTRL('Y') : return(REQ_DEL_LINE); + case CTRL('G') : return(REQ_DEL_WORD); + case CTRL('K') : return(REQ_CLR_EOF); + + case CTRL('N') : return(REQ_NEXT_CHOICE); + case CTRL('P') : return(REQ_PREV_CHOICE); + + default: + return(c); + } +} +// +// ------------------------------------------------------------------------- +// User Defined Fieldtypes +// ------------------------------------------------------------------------- +// +bool _nc_xx_fld_fcheck(FIELD *f, const void *u) +{ + (void) f; + NCursesFormField* F = reinterpret_cast(const_cast(u)); + assert(F != 0); + UserDefinedFieldType* udf = reinterpret_cast(F->fieldtype()); + assert(udf != 0); + return udf->field_check(*F); +} + +bool _nc_xx_fld_ccheck(int c, const void *u) +{ + NCursesFormField* F = reinterpret_cast(const_cast(u)); + assert(F != 0); + UserDefinedFieldType* udf = + reinterpret_cast(F->fieldtype()); + assert(udf != 0); + return udf->char_check(c); +} + +void* _nc_xx_fld_makearg(va_list* va) +{ + return va_arg(*va,NCursesFormField*); +} + +FIELDTYPE* UserDefinedFieldType::generic_fieldtype = + ::new_fieldtype(_nc_xx_fld_fcheck, + _nc_xx_fld_ccheck); + + +UserDefinedFieldType::UserDefinedFieldType() : NCursesFieldType(generic_fieldtype) { +} + +FIELDTYPE* UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice = + ::new_fieldtype(_nc_xx_fld_fcheck, + _nc_xx_fld_ccheck); + + +UserDefinedFieldType_With_Choice::UserDefinedFieldType_With_Choice() { + fieldtype = generic_fieldtype_with_choice; +} + +bool _nc_xx_next_choice(FIELD *f, const void *u) +{ + (void) f; + NCursesFormField* F = reinterpret_cast(const_cast(u)); + assert(F != 0); + UserDefinedFieldType_With_Choice* udf = + reinterpret_cast(F->fieldtype()); + assert(udf != 0); + return udf->next(*F); +} + +bool _nc_xx_prev_choice(FIELD *f, const void *u) +{ + (void) f; + NCursesFormField* F = reinterpret_cast(const_cast(u)); + assert(F != 0); + UserDefinedFieldType_With_Choice* udf = + reinterpret_cast(F->fieldtype()); + assert(udf != 0); + return udf->previous(*F); +} + +class UDF_Init +{ +private: + int code; + static UDF_Init* I; + +public: + UDF_Init() + : code(0) + { + code = ::set_fieldtype_arg(UserDefinedFieldType::generic_fieldtype, + _nc_xx_fld_makearg, + NULL, + NULL); + if (code==E_OK) + code = ::set_fieldtype_arg + (UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice, + _nc_xx_fld_makearg, + NULL, + NULL); + if (code==E_OK) + code = ::set_fieldtype_choice + (UserDefinedFieldType_With_Choice::generic_fieldtype_with_choice, + _nc_xx_next_choice, + _nc_xx_prev_choice); + } +}; + +UDF_Init* UDF_Init::I = new UDF_Init(); + + diff --git a/contrib/ncurses/c++/cursesf.h b/contrib/ncurses/c++/cursesf.h new file mode 100644 index 00000000..f242fc74 --- /dev/null +++ b/contrib/ncurses/c++/cursesf.h @@ -0,0 +1,968 @@ +// * This makes emacs happy -*-Mode: C++;-*- +// vile:cppmode +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +// $Id: cursesf.h,v 1.40 2024/10/05 22:47:12 tom Exp $ + +#ifndef NCURSES_CURSESF_H_incl +#define NCURSES_CURSESF_H_incl 1 + +#include + +#ifndef __EXT_QNX +#include +#endif + +extern "C" { +# include +} +// +// ------------------------------------------------------------------------- +// The abstract base class for builtin and user defined Fieldtypes. +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP NCursesFormField; // forward declaration + +// Class to represent builtin field types as well as C++ written new +// fieldtypes (see classes UserDefineFieldType... +class NCURSES_CXX_IMPEXP NCursesFieldType +{ + friend class NCursesFormField; + +protected: + FIELDTYPE* fieldtype; + + inline void OnError(int err) const THROW2(NCursesException const, NCursesFormException) { + if (err!=E_OK) + THROW(new NCursesFormException (err)); + } + + NCursesFieldType(FIELDTYPE *f) : fieldtype(f) { + } + + virtual ~NCursesFieldType() {} + + // Set the fields f fieldtype to this one. + virtual void set(NCursesFormField& f) = 0; + +public: + NCursesFieldType() + : fieldtype(STATIC_CAST(FIELDTYPE*)(0)) + { + } + + NCursesFieldType& operator=(const NCursesFieldType& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + NCursesFieldType(const NCursesFieldType& rhs) + : fieldtype(rhs.fieldtype) + { + } + +}; + +// +// ------------------------------------------------------------------------- +// The class representing a forms field, wrapping the lowlevel FIELD struct +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP NCursesFormField +{ + friend class NCursesForm; + +protected: + FIELD *field; // lowlevel structure + NCursesFieldType* ftype; // Associated field type + + // Error handler + inline void OnError (int err) const THROW2(NCursesException const, NCursesFormException) { + if (err != E_OK) + THROW(new NCursesFormException (err)); + } + +public: + // Create a 'Null' field. Can be used to delimit a field list + NCursesFormField() + : field(STATIC_CAST(FIELD*)(0)), + ftype(STATIC_CAST(NCursesFieldType*)(0)) + { + } + + // Create a new field + NCursesFormField (int rows, + int ncols, + int first_row = 0, + int first_col = 0, + int offscreen_rows = 0, + int additional_buffers = 0) + : field(0), + ftype(STATIC_CAST(NCursesFieldType*)(0)) + { + field = ::new_field(rows, ncols, first_row, first_col, + offscreen_rows, additional_buffers); + if (!field) + OnError(errno); + } + + NCursesFormField& operator=(const NCursesFormField& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + NCursesFormField(const NCursesFormField& rhs) + : field(rhs.field), ftype(rhs.ftype) + { + } + + virtual ~NCursesFormField () THROWS(NCursesException); + + // Duplicate the field at a new position + inline NCursesFormField* dup(int first_row, int first_col) + { + NCursesFormField* f = new NCursesFormField(); + if (!f) + OnError(E_SYSTEM_ERROR); + else { + f->ftype = ftype; + f->field = ::dup_field(field,first_row,first_col); + if (!f->field) + OnError(errno); + } + return f; + } + + // Link the field to a new location + inline NCursesFormField* link(int first_row, int first_col) { + NCursesFormField* f = new NCursesFormField(); + if (!f) + OnError(E_SYSTEM_ERROR); + else { + f->ftype = ftype; + f->field = ::link_field(field,first_row,first_col); + if (!f->field) + OnError(errno); + } + return f; + } + + // Get the lowlevel field representation + inline FIELD* get_field() const { + return field; + } + + // Retrieve info about the field + inline void info(int& rows, int& ncols, + int& first_row, int& first_col, + int& offscreen_rows, int& additional_buffers) const { + OnError(::field_info(field, &rows, &ncols, + &first_row, &first_col, + &offscreen_rows, &additional_buffers)); + } + + // Retrieve info about the fields dynamic properties. + inline void dynamic_info(int& dynamic_rows, int& dynamic_cols, + int& max_growth) const { + OnError(::dynamic_field_info(field, &dynamic_rows, &dynamic_cols, + &max_growth)); + } + + // For a dynamic field you may set the maximum growth limit. + // A zero means unlimited growth. + inline void set_maximum_growth(int growth = 0) { + OnError(::set_max_field(field,growth)); + } + + // Move the field to a new position + inline void move(int row, int col) { + OnError(::move_field(field,row,col)); + } + + // Mark the field to start a new page + inline void new_page(bool pageFlag = FALSE) { + OnError(::set_new_page(field,pageFlag)); + } + + // Retrieve whether or not the field starts a new page. + inline bool is_new_page() const { + return ::new_page(field); + } + + // Set the justification for the field + inline void set_justification(int just) { + OnError(::set_field_just(field,just)); + } + + // Retrieve the fields justification + inline int justification() const { + return ::field_just(field); + } + // Set the foreground attribute for the field + inline void set_foreground(chtype foreground) { + OnError(::set_field_fore(field,foreground)); + } + + // Retrieve the fields foreground attribute + inline chtype fore() const { + return ::field_fore(field); + } + + // Set the background attribute for the field + inline void set_background(chtype background) { + OnError(::set_field_back(field,background)); + } + + // Retrieve the fields background attribute + inline chtype back() const { + return ::field_back(field); + } + + // Set the padding character for the field + inline void set_pad_character(int padding) { + OnError(::set_field_pad(field, padding)); + } + + // Retrieve the fields padding character + inline int pad() const { + return ::field_pad(field); + } + + // Switch on the fields options + inline void options_on (Field_Options opts) { + OnError (::field_opts_on (field, opts)); + } + + // Switch off the fields options + inline void options_off (Field_Options opts) { + OnError (::field_opts_off (field, opts)); + } + + // Retrieve the fields options + inline Field_Options options () const { + return ::field_opts (field); + } + + // Set the fields options + inline void set_options (Field_Options opts) { + OnError (::set_field_opts (field, opts)); + } + + // Mark the field as changed + inline void set_changed(bool changeFlag = TRUE) { + OnError(::set_field_status(field,changeFlag)); + } + + // Test whether or not the field is marked as changed + inline bool changed() const { + return ::field_status(field); + } + + // Return the index of the field in the field array of a form + // or -1 if the field is not associated to a form + inline int (index)() const { + return ::field_index(field); + } + + // Store a value in a fields buffer. The default buffer is nr. 0 + inline void set_value(const char *val, int buffer = 0) { + OnError(::set_field_buffer(field,buffer,val)); + } + + // Retrieve the value of a fields buffer. The default buffer is nr. 0 + inline char* value(int buffer = 0) const { + return ::field_buffer(field,buffer); + } + + // Set the validation type of the field. + inline void set_fieldtype(NCursesFieldType& f) { + ftype = &f; + f.set(*this); // A good friend may do that... + } + + // Retrieve the validation type of the field. + inline NCursesFieldType* fieldtype() const { + return ftype; + } + +}; + + // This are the built-in hook functions in this C++ binding. In C++ we use + // virtual member functions (see below On_..._Init and On_..._Termination) + // to provide this functionality in an object oriented manner. +extern "C" { + void _nc_xx_frm_init(FORM *); + void _nc_xx_frm_term(FORM *); + void _nc_xx_fld_init(FORM *); + void _nc_xx_fld_term(FORM *); +} + +// +// ------------------------------------------------------------------------- +// The class representing a form, wrapping the lowlevel FORM struct +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP NCursesForm : public NCursesPanel +{ +protected: + FORM* form; // the lowlevel structure + +private: + NCursesWindow* sub; // the subwindow object + bool b_sub_owner; // is this our own subwindow? + bool b_framed; // has the form a border? + bool b_autoDelete; // Delete fields when deleting form? + + NCursesFormField** my_fields; // The array of fields for this form + + // This structure is used for the form's user data field to link the + // FORM* to the C++ object and to provide extra space for a user pointer. + typedef struct { + void* m_user; // the pointer for the user's data + const NCursesForm* m_back; // backward pointer to C++ object + const FORM* m_owner; + } UserHook; + + // Get the backward pointer to the C++ object from a FORM + static inline NCursesForm* getHook(const FORM *f) { + UserHook* hook = reinterpret_cast(::form_userptr(f)); + assert(hook != 0 && hook->m_owner==f); + return const_cast(hook->m_back); + } + + friend void _nc_xx_frm_init(FORM *); + friend void _nc_xx_frm_term(FORM *); + friend void _nc_xx_fld_init(FORM *); + friend void _nc_xx_fld_term(FORM *); + + // Calculate FIELD* array for the menu + FIELD** mapFields(NCursesFormField* nfields[]); + +protected: + // internal routines + inline void set_user(void *user) { + UserHook* uptr = reinterpret_cast(::form_userptr (form)); + assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form); + uptr->m_user = user; + } + + inline void *get_user() { + const UserHook* uptr = reinterpret_cast(::form_userptr (form)); + assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==form); + return uptr->m_user; + } + + void InitForm (NCursesFormField* Fields[], + bool with_frame, + bool autoDeleteFields); + + inline void OnError (int err) const THROW2(NCursesException const, NCursesFormException) { + if (err != E_OK) + THROW(new NCursesFormException (err)); + } + + // this wraps the form_driver call. + virtual int driver (int c) ; + + // 'Internal' constructor, builds an object without association to a + // field array. + NCursesForm( int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0) + : NCursesPanel(nlines, ncols, begin_y, begin_x), + form (STATIC_CAST(FORM*)(0)), + sub(0), + b_sub_owner(0), + b_framed(0), + b_autoDelete(0), + my_fields(0) + { + } + +public: + // Create form for the default panel. + NCursesForm (NCursesFormField* Fields[], + bool with_frame=FALSE, // reserve space for a frame? + bool autoDelete_Fields=FALSE) // do automatic cleanup? + : NCursesPanel(), + form(0), + sub(0), + b_sub_owner(0), + b_framed(0), + b_autoDelete(0), + my_fields(0) + { + InitForm(Fields, with_frame, autoDelete_Fields); + } + + // Create a form in a panel with the given position and size. + NCursesForm (NCursesFormField* Fields[], + int nlines, + int ncols, + int begin_y, + int begin_x, + bool with_frame=FALSE, // reserve space for a frame? + bool autoDelete_Fields=FALSE) // do automatic cleanup? + : NCursesPanel(nlines, ncols, begin_y, begin_x), + form(0), + sub(0), + b_sub_owner(0), + b_framed(0), + b_autoDelete(0), + my_fields(0) + { + InitForm(Fields, with_frame, autoDelete_Fields); + } + + NCursesForm& operator=(const NCursesForm& rhs) + { + if (this != &rhs) { + *this = rhs; + NCursesPanel::operator=(rhs); + } + return *this; + } + + NCursesForm(const NCursesForm& rhs) + : NCursesPanel(rhs), + form(rhs.form), + sub(rhs.sub), + b_sub_owner(rhs.b_sub_owner), + b_framed(rhs.b_framed), + b_autoDelete(rhs.b_autoDelete), + my_fields(rhs.my_fields) + { + } + + virtual ~NCursesForm() THROWS(NCursesException); + + // Set the default attributes for the form + virtual void setDefaultAttributes(); + + // Retrieve current field of the form. + inline NCursesFormField* current_field() const { + return my_fields[::field_index(::current_field(form))]; + } + + // Set the forms subwindow + void setSubWindow(NCursesWindow& sub); + + // Set these fields for the form + inline void setFields(NCursesFormField* Fields[]) { + OnError(::set_form_fields(form,mapFields(Fields))); + } + + // Remove the form from the screen + inline void unpost (void) { + OnError (::unpost_form (form)); + } + + // Post the form to the screen if flag is true, unpost it otherwise + inline void post(bool flag = TRUE) { + OnError (flag ? ::post_form(form) : ::unpost_form (form)); + } + + // Decorations + inline void frame(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE { + if (b_framed) + NCursesPanel::frame(title,btitle); + else + OnError(E_SYSTEM_ERROR); + } + + inline void boldframe(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE { + if (b_framed) + NCursesPanel::boldframe(title,btitle); + else + OnError(E_SYSTEM_ERROR); + } + + inline void label(const char *topLabel, const char *bottomLabel) NCURSES_OVERRIDE { + if (b_framed) + NCursesPanel::label(topLabel,bottomLabel); + else + OnError(E_SYSTEM_ERROR); + } + + // ----- + // Hooks + // ----- + + // Called after the form gets repositioned in its window. + // This is especially true if the form is posted. + virtual void On_Form_Init(); + + // Called before the form gets repositioned in its window. + // This is especially true if the form is unposted. + virtual void On_Form_Termination(); + + // Called after the field became the current field + virtual void On_Field_Init(NCursesFormField& field); + + // Called before this field is left as current field. + virtual void On_Field_Termination(NCursesFormField& field); + + // Calculate required window size for the form. + void scale(int& rows, int& ncols) const { + OnError(::scale_form(form,&rows,&ncols)); + } + + // Retrieve number of fields in the form. + int count() const { + return ::field_count(form); + } + + // Make the page the current page of the form. + void set_page(int pageNum) { + OnError(::set_form_page(form, pageNum)); + } + + // Retrieve current page number + int page() const { + return ::form_page(form); + } + + // Switch on the forms options + inline void options_on (Form_Options opts) { + OnError (::form_opts_on (form, opts)); + } + + // Switch off the forms options + inline void options_off (Form_Options opts) { + OnError (::form_opts_off (form, opts)); + } + + // Retrieve the forms options + inline Form_Options options () const { + return ::form_opts (form); + } + + // Set the forms options + inline void set_options (Form_Options opts) { + OnError (::set_form_opts (form, opts)); + } + + // Are there more data in the current field after the data shown + inline bool data_ahead() const { + return ::data_ahead(form); + } + + // Are there more data in the current field before the data shown + inline bool data_behind() const { + return ::data_behind(form); + } + + // Position the cursor to the current field + inline void position_cursor () { + OnError (::pos_form_cursor (form)); + } + // Set the current field + inline void set_current(NCursesFormField& F) { + OnError (::set_current_field(form, F.field)); + } + + // Provide a default key virtualization. Translate the keyboard + // code c into a form request code. + // The default implementation provides a hopefully straightforward + // mapping for the most common keystrokes and form requests. + virtual int virtualize(int c); + + // Operators + inline NCursesFormField* operator[](int i) const { + if ( (i < 0) || (i >= ::field_count (form)) ) + OnError (E_BAD_ARGUMENT); + return my_fields[i]; + } + + // Perform the menu's operation + // Return the field where you left the form. + virtual NCursesFormField* operator()(void); + + // Exception handlers. The default is a Beep. + virtual void On_Request_Denied(int c) const; + virtual void On_Invalid_Field(int c) const; + virtual void On_Unknown_Command(int c) const; + +}; + +// +// ------------------------------------------------------------------------- +// This is the typical C++ typesafe way to allow to attach +// user data to a field of a form. Its assumed that the user +// data belongs to some class T. Use T as template argument +// to create a UserField. +// ------------------------------------------------------------------------- +template class NCURSES_CXX_IMPEXP NCursesUserField : public NCursesFormField +{ +public: + NCursesUserField (int rows, + int ncols, + int first_row = 0, + int first_col = 0, + const T* p_UserData = STATIC_CAST(T*)(0), + int offscreen_rows = 0, + int additional_buffers = 0) + : NCursesFormField (rows, ncols, + first_row, first_col, + offscreen_rows, additional_buffers) { + if (field) + OnError(::set_field_userptr(field, STATIC_CAST(void *)(p_UserData))); + } + + virtual ~NCursesUserField() THROWS(NCursesException) {}; + + inline const T* UserData (void) const { + return reinterpret_cast(::field_userptr (field)); + } + + inline virtual void setUserData(const T* p_UserData) { + if (field) + OnError (::set_field_userptr (field, STATIC_CAST(void *)(p_UserData))); + } +}; +// +// ------------------------------------------------------------------------- +// The same mechanism is used to attach user data to a form +// ------------------------------------------------------------------------- +// +template class NCURSES_CXX_IMPEXP NCursesUserForm : public NCursesForm +{ +protected: + // 'Internal' constructor, builds an object without association to a + // field array. + NCursesUserForm( int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = STATIC_CAST(T*)(0)) + : NCursesForm(nlines,ncols,begin_y,begin_x) { + if (form) + set_user (const_cast(reinterpret_cast + (p_UserData))); + } + +public: + NCursesUserForm (NCursesFormField* Fields[], + const T* p_UserData = STATIC_CAST(T*)(0), + bool with_frame=FALSE, + bool autoDelete_Fields=FALSE) + : NCursesForm (Fields, with_frame, autoDelete_Fields) { + if (form) + set_user (const_cast(reinterpret_cast(p_UserData))); + }; + + NCursesUserForm (NCursesFormField* Fields[], + int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = STATIC_CAST(T*)(0), + bool with_frame=FALSE, + bool autoDelete_Fields=FALSE) + : NCursesForm (Fields, nlines, ncols, begin_y, begin_x, + with_frame, autoDelete_Fields) { + if (form) + set_user (const_cast(reinterpret_cast + (p_UserData))); + }; + + virtual ~NCursesUserForm() THROWS(NCursesException) { + }; + + inline T* UserData (void) { + return reinterpret_cast(get_user ()); + }; + + inline virtual void setUserData (const T* p_UserData) { + if (form) + set_user (const_cast(reinterpret_cast(p_UserData))); + } + +}; +// +// ------------------------------------------------------------------------- +// Builtin Fieldtypes +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP Alpha_Field : public NCursesFieldType +{ +private: + int min_field_width; + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype,min_field_width)); + } + +public: + explicit Alpha_Field(int width) + : NCursesFieldType(TYPE_ALPHA), + min_field_width(width) { + } +}; + +class NCURSES_CXX_IMPEXP Alphanumeric_Field : public NCursesFieldType +{ +private: + int min_field_width; + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype,min_field_width)); + } + +public: + explicit Alphanumeric_Field(int width) + : NCursesFieldType(TYPE_ALNUM), + min_field_width(width) { + } +}; + +class NCURSES_CXX_IMPEXP Integer_Field : public NCursesFieldType +{ +private: + int precision; + long lower_limit, upper_limit; + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype, + precision,lower_limit,upper_limit)); + } + +public: + Integer_Field(int prec, long low=0L, long high=0L) + : NCursesFieldType(TYPE_INTEGER), + precision(prec), lower_limit(low), upper_limit(high) { + } +}; + +class NCURSES_CXX_IMPEXP Numeric_Field : public NCursesFieldType +{ +private: + int precision; + double lower_limit, upper_limit; + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype, + precision,lower_limit,upper_limit)); + } + +public: + Numeric_Field(int prec, double low=0.0, double high=0.0) + : NCursesFieldType(TYPE_NUMERIC), + precision(prec), lower_limit(low), upper_limit(high) { + } +}; + +class NCURSES_CXX_IMPEXP Regular_Expression_Field : public NCursesFieldType +{ +private: + char* regex; + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype,regex)); + } + + void copy_regex(const char *source) + { + regex = new char[1 + ::strlen(source)]; + (::strcpy)(regex, source); + } + +public: + explicit Regular_Expression_Field(const char *expr) + : NCursesFieldType(TYPE_REGEXP), + regex(NULL) + { + copy_regex(expr); + } + + Regular_Expression_Field& operator=(const Regular_Expression_Field& rhs) + { + if (this != &rhs) { + *this = rhs; + copy_regex(rhs.regex); + NCursesFieldType::operator=(rhs); + } + return *this; + } + + Regular_Expression_Field(const Regular_Expression_Field& rhs) + : NCursesFieldType(rhs), + regex(NULL) + { + copy_regex(rhs.regex); + } + + ~Regular_Expression_Field() { + delete[] regex; + } +}; + +class NCURSES_CXX_IMPEXP Enumeration_Field : public NCursesFieldType +{ +private: + const char** list; + int case_sensitive; + int non_unique_matches; + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype, + list,case_sensitive,non_unique_matches)); + } +public: + Enumeration_Field(const char* enums[], + bool case_sens=FALSE, + bool non_unique=FALSE) + : NCursesFieldType(TYPE_ENUM), + list(enums), + case_sensitive(case_sens ? -1 : 0), + non_unique_matches(non_unique ? -1 : 0) { + } + + Enumeration_Field& operator=(const Enumeration_Field& rhs) + { + if (this != &rhs) { + *this = rhs; + NCursesFieldType::operator=(rhs); + } + return *this; + } + + Enumeration_Field(const Enumeration_Field& rhs) + : NCursesFieldType(rhs), + list(rhs.list), + case_sensitive(rhs.case_sensitive), + non_unique_matches(rhs.non_unique_matches) + { + } +}; + +class NCURSES_CXX_IMPEXP IPV4_Address_Field : public NCursesFieldType +{ +private: + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype)); + } + +public: + IPV4_Address_Field() : NCursesFieldType(TYPE_IPV4) { + } +}; + +extern "C" { + bool _nc_xx_fld_fcheck(FIELD *, const void*); + bool _nc_xx_fld_ccheck(int c, const void *); + void* _nc_xx_fld_makearg(va_list*); +} + +// +// ------------------------------------------------------------------------- +// Abstract base class for User-Defined Fieldtypes +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP UserDefinedFieldType : public NCursesFieldType +{ + friend class UDF_Init; // Internal helper to set up statics +private: + // For all C++ defined fieldtypes we need only one generic lowlevel + // FIELDTYPE* element. + static FIELDTYPE* generic_fieldtype; + +protected: + // This are the functions required by the low level libforms functions + // to construct a fieldtype. + friend bool _nc_xx_fld_fcheck(FIELD *, const void*); + friend bool _nc_xx_fld_ccheck(int c, const void *); + friend void* _nc_xx_fld_makearg(va_list*); + + void set(NCursesFormField& f) NCURSES_OVERRIDE { + OnError(::set_field_type(f.get_field(),fieldtype,&f)); + } + +protected: + // Redefine this function to do a field validation. The argument + // is a reference to the field you should validate. + virtual bool field_check(NCursesFormField& f) = 0; + + // Redefine this function to do a character validation. The argument + // is the character to be validated. + virtual bool char_check (int c) = 0; + +public: + UserDefinedFieldType(); +}; + +extern "C" { + bool _nc_xx_next_choice(FIELD*, const void *); + bool _nc_xx_prev_choice(FIELD*, const void *); +} + +// +// ------------------------------------------------------------------------- +// Abstract base class for User-Defined Fieldtypes with Choice functions +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP UserDefinedFieldType_With_Choice : public UserDefinedFieldType +{ + friend class UDF_Init; // Internal helper to set up statics +private: + // For all C++ defined fieldtypes with choice functions we need only one + // generic lowlevel FIELDTYPE* element. + static FIELDTYPE* generic_fieldtype_with_choice; + + // This are the functions required by the low level libforms functions + // to construct a fieldtype with choice functions. + friend bool _nc_xx_next_choice(FIELD*, const void *); + friend bool _nc_xx_prev_choice(FIELD*, const void *); + +protected: + // Redefine this function to do the retrieval of the next choice value. + // The argument is a reference to the field tobe examined. + virtual bool next (NCursesFormField& f) = 0; + + // Redefine this function to do the retrieval of the previous choice value. + // The argument is a reference to the field tobe examined. + virtual bool previous(NCursesFormField& f) = 0; + +public: + UserDefinedFieldType_With_Choice(); +}; + +#endif /* NCURSES_CURSESF_H_incl */ diff --git a/contrib/ncurses/c++/cursesm.cc b/contrib/ncurses/c++/cursesm.cc new file mode 100644 index 00000000..3d3ed76f --- /dev/null +++ b/contrib/ncurses/c++/cursesm.cc @@ -0,0 +1,414 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019-2021,2024 Thomas E. Dickey * + * Copyright 1998-2011,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +#include "internal.h" +#include "cursesm.h" +#include "cursesapp.h" + +MODULE_ID("$Id: cursesm.cc,v 1.28 2024/10/05 22:47:12 tom Exp $") + +NCursesMenuItem::~NCursesMenuItem() THROWS(NCursesException) +{ + if (item) + OnError(::free_item(item)); +} + +bool +NCursesMenuItem::action() +{ + return FALSE; +} + +NCursesMenuCallbackItem::~NCursesMenuCallbackItem() THROWS(NCursesException) +{ +} + +bool +NCursesMenuCallbackItem::action() +{ + if (p_fct) + return p_fct (*this); + else + return FALSE; +} + +/* Internal hook functions. They will route the hook + * calls to virtual methods of the NCursesMenu class, + * so in C++ providing a hook is done simply by + * implementing a virtual method in a derived class + */ +void +_nc_xx_mnu_init(MENU *m) +{ + NCursesMenu::getHook(m)->On_Menu_Init(); +} + +void +_nc_xx_mnu_term(MENU *m) +{ + NCursesMenu::getHook(m)->On_Menu_Termination(); +} + +void +_nc_xx_itm_init(MENU *m) +{ + NCursesMenu* M = NCursesMenu::getHook(m); + M->On_Item_Init (*(M->current_item ())); +} + +void +_nc_xx_itm_term(MENU *m) +{ + NCursesMenu* M = NCursesMenu::getHook(m); + M->On_Item_Termination (*(M->current_item ())); +} + +/* Construct an ITEM* array from an array of NCursesMenuItem + * objects. + */ +ITEM** +NCursesMenu::mapItems(NCursesMenuItem* nitems[]) +{ + int itemCount = 0,lcv; + + for (lcv=0; nitems[lcv]->item; ++lcv) + ++itemCount; + + ITEM** itemArray = new ITEM*[itemCount + 1]; + + for (lcv=0;nitems[lcv]->item;++lcv) { + itemArray[lcv] = nitems[lcv]->item; + } + itemArray[lcv] = NULL; + + my_items = nitems; + + if (menu) + delete[] ::menu_items(menu); + return itemArray; +} + +void +NCursesMenu::InitMenu(NCursesMenuItem* nitems[], + bool with_frame, + bool autoDelete_Items) +{ + int mrows, mcols; + + keypad(TRUE); + meta(TRUE); + + b_framed = with_frame; + b_autoDelete = autoDelete_Items; + + menu = static_cast(0); + menu = ::new_menu(mapItems(nitems)); + if (!menu) + OnError (E_SYSTEM_ERROR); + + UserHook* hook = new UserHook; + hook->m_user = NULL; + hook->m_back = this; + hook->m_owner = menu; + ::set_menu_userptr(menu, static_cast(hook)); + + ::set_menu_init (menu, _nc_xx_mnu_init); + ::set_menu_term (menu, _nc_xx_mnu_term); + ::set_item_init (menu, _nc_xx_itm_init); + ::set_item_term (menu, _nc_xx_itm_term); + + scale(mrows, mcols); + ::set_menu_win(menu, w); + + if (with_frame) { + if ((mrows > height()-2) || (mcols > width()-2)) + OnError(E_NO_ROOM); + sub = new NCursesWindow(*this,mrows,mcols,1,1,'r'); + ::set_menu_sub(menu, sub->w); + b_sub_owner = TRUE; + } + else { + sub = static_cast(0); + b_sub_owner = FALSE; + } + setDefaultAttributes(); +} + +void +NCursesMenu::setDefaultAttributes() +{ + const NCursesApplication* S = NCursesApplication::getApplication(); + if (S) { + ::set_menu_fore(menu, S->foregrounds()); + ::set_menu_back(menu, S->backgrounds()); + ::set_menu_grey(menu, S->inactives()); + } +} + +NCursesMenu::~NCursesMenu() THROWS(NCursesException) +{ + UserHook* hook = reinterpret_cast(::menu_userptr(menu)); + delete hook; + if (b_sub_owner) { + ::set_menu_sub(menu, static_cast(0)); + delete sub; + } + if (menu) { + ITEM** itms = ::menu_items(menu); + int cnt = count(); + + OnError(::set_menu_items(menu, static_cast(0))); + + if (b_autoDelete) { + if (cnt>0) { + for (int i=0; i <= cnt; i++) + delete my_items[i]; + } + delete[] my_items; + } + + ::free_menu(menu); + // It's essential to do this after free_menu() + delete[] itms; + } +} + +void +NCursesMenu::setSubWindow(NCursesWindow& nsub) +{ + if (!isDescendant(nsub)) + OnError(E_SYSTEM_ERROR); + else { + if (b_sub_owner) + delete sub; + sub = ⊄ + ::set_menu_sub(menu,sub->w); + } +} + +bool +NCursesMenu::set_pattern (const char *pat) +{ + int res = ::set_menu_pattern (menu, pat); + switch(res) { + case E_OK: + break; + case E_NO_MATCH: + return FALSE; + default: + OnError (res); + } + return TRUE; +} + +// call the menu driver and do basic error checking. +int +NCursesMenu::driver (int c) +{ + int res = ::menu_driver (menu, c); + switch (res) { + case E_OK: + case E_REQUEST_DENIED: + case E_NOT_SELECTABLE: + case E_UNKNOWN_COMMAND: + case E_NO_MATCH: + break; + default: + OnError (res); + } + return (res); +} + +static const int CMD_QUIT = MAX_COMMAND + 1; +static const int CMD_ACTION = MAX_COMMAND + 2; +// +// ------------------------------------------------------------------------- +// Provide a default key virtualization. Translate the keyboard +// code c into a menu request code. +// The default implementation provides a hopefully straightforward +// mapping for the most common keystrokes and menu requests. +// ------------------------------------------------------------------------- +int +NCursesMenu::virtualize(int c) +{ + switch(c) { + case CTRL('X') : return(CMD_QUIT); // eXit + + case KEY_DOWN : return(REQ_DOWN_ITEM); + case CTRL('N') : return(REQ_NEXT_ITEM); // Next + case KEY_UP : return(REQ_UP_ITEM); + case CTRL('P') : return(REQ_PREV_ITEM); // Previous + + case CTRL('U') : return(REQ_SCR_ULINE); // Up + case CTRL('D') : return(REQ_SCR_DLINE); // Down + case CTRL('F') : return(REQ_SCR_DPAGE); // Forward + case CTRL('B') : return(REQ_SCR_UPAGE); // Backward + + case CTRL('Y') : return(REQ_CLEAR_PATTERN); + case CTRL('H') : return(REQ_BACK_PATTERN); + case CTRL('A') : return(REQ_NEXT_MATCH); + case CTRL('E') : return(REQ_PREV_MATCH); + case CTRL('T') : return(REQ_TOGGLE_ITEM); + + case CTRL('J') : + case CTRL('M') : return(CMD_ACTION); + + case KEY_HOME : return(REQ_FIRST_ITEM); + case KEY_LEFT : return(REQ_LEFT_ITEM); + case KEY_RIGHT : return(REQ_RIGHT_ITEM); + case KEY_END : return(REQ_LAST_ITEM); + case KEY_BACKSPACE : return(REQ_BACK_PATTERN); + case KEY_NPAGE : return(REQ_SCR_DPAGE); + case KEY_PPAGE : return(REQ_SCR_UPAGE); + + default: + return(c); + } +} + +NCursesMenuItem* +NCursesMenu::operator()(void) +{ + int drvCmnd; + int c; + bool b_action = FALSE; + + post(); + show(); + refresh(); + + while (!b_action && ((drvCmnd = virtualize((c = getKey()))) != CMD_QUIT)) { + int err; + + switch((err = driver(drvCmnd))) { + case E_REQUEST_DENIED: + On_Request_Denied(c); + break; + case E_NOT_SELECTABLE: + On_Not_Selectable(c); + break; + case E_UNKNOWN_COMMAND: + if (drvCmnd == CMD_ACTION) { + if (options() & O_ONEVALUE) { + NCursesMenuItem* itm = current_item(); + assert(itm != 0); + if (itm->options() & O_SELECTABLE) + { + b_action = itm->action(); + refresh(); + } + else + On_Not_Selectable(c); + } + else { + int n = count(); + for(int i=0; ivalue()) { + b_action |= itm->action(); + refresh(); + } + } + } + } else + On_Unknown_Command(c); + break; + case E_NO_MATCH: + On_No_Match(c); + break; + case E_OK: + break; + default: + OnError(err); + } + } + + unpost(); + hide(); + refresh(); + if (options() & O_ONEVALUE) + return my_items[::item_index (::current_item (menu))]; + else + return NULL; +} + +void +NCursesMenu::On_Menu_Init() +{ +} + +void +NCursesMenu::On_Menu_Termination() +{ +} + +void +NCursesMenu::On_Item_Init(NCursesMenuItem& item) +{ + (void) item; +} + +void +NCursesMenu::On_Item_Termination(NCursesMenuItem& item) +{ + (void) item; +} + +void +NCursesMenu::On_Request_Denied(int c) const +{ + (void) c; + ::beep(); +} + +void +NCursesMenu::On_Not_Selectable(int c) const +{ + (void) c; + ::beep(); +} + +void +NCursesMenu::On_No_Match(int c) const +{ + (void) c; + ::beep(); +} + +void +NCursesMenu::On_Unknown_Command(int c) const +{ + (void) c; + ::beep(); +} diff --git a/contrib/ncurses/c++/cursesm.h b/contrib/ncurses/c++/cursesm.h new file mode 100644 index 00000000..27ccec44 --- /dev/null +++ b/contrib/ncurses/c++/cursesm.h @@ -0,0 +1,674 @@ +// * This makes emacs happy -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +// $Id: cursesm.h,v 1.36 2024/10/05 22:47:12 tom Exp $ + +#ifndef NCURSES_CURSESM_H_incl +#define NCURSES_CURSESM_H_incl 1 + +#include + +extern "C" { +# include +} +// +// ------------------------------------------------------------------------- +// This wraps the ITEM type of +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP NCursesMenuItem +{ + friend class NCursesMenu; + +protected: + ITEM *item; + + inline void OnError (int err) const THROW2(NCursesException const, NCursesMenuException) { + if (err != E_OK) + THROW(new NCursesMenuException (err)); + } + +public: + NCursesMenuItem (const char* p_name = NULL, + const char* p_descript = NULL) + : item(0) + { + item = p_name ? ::new_item (p_name, p_descript) : STATIC_CAST(ITEM*)(0); + if (p_name && !item) + OnError (E_SYSTEM_ERROR); + } + // Create an item. If you pass both parameters as NULL, a delimiting + // item is constructed which can be used to terminate a list of + // NCursesMenu objects. + + NCursesMenuItem& operator=(const NCursesMenuItem& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + NCursesMenuItem(const NCursesMenuItem& rhs) + : item(0) + { + (void) rhs; + } + + virtual ~NCursesMenuItem () THROWS(NCursesException); + // Release the items memory + + inline const char* name () const { + return ::item_name (item); + } + // Name of the item + + inline const char* description () const { + return ::item_description (item); + } + // Description of the item + + inline int (index) (void) const { + return ::item_index (item); + } + // Index of the item in an item array (or -1) + + inline void options_on (Item_Options opts) { + OnError (::item_opts_on (item, opts)); + } + // Switch on the items options + + inline void options_off (Item_Options opts) { + OnError (::item_opts_off (item, opts)); + } + // Switch off the item's option + + inline Item_Options options () const { + return ::item_opts (item); + } + // Retrieve the items options + + inline void set_options (Item_Options opts) { + OnError (::set_item_opts (item, opts)); + } + // Set the items options + + inline void set_value (bool f) { + OnError (::set_item_value (item,f)); + } + // Set/Reset the items selection state + + inline bool value () const { + return ::item_value (item); + } + // Retrieve the items selection state + + inline bool visible () const { + return ::item_visible (item); + } + // Retrieve visibility of the item + + virtual bool action(); + // Perform an action associated with this item; you may use this in an + // user supplied driver for a menu; you may derive from this class and + // overload action() to supply items with different actions. + // If an action returns true, the menu will be exited. The default action + // is to do nothing. +}; + +// Prototype for an items callback function. +typedef bool ITEMCALLBACK(NCursesMenuItem&); + +// If you don't like to create a child class for individual items to +// overload action(), you may use this class and provide a callback +// function pointer for items. +class NCURSES_CXX_IMPEXP NCursesMenuCallbackItem : public NCursesMenuItem +{ +private: + ITEMCALLBACK* p_fct; + +public: + NCursesMenuCallbackItem(ITEMCALLBACK* fct = NULL, + const char* p_name = NULL, + const char* p_descript = NULL ) + : NCursesMenuItem (p_name, p_descript), + p_fct (fct) { + } + + NCursesMenuCallbackItem& operator=(const NCursesMenuCallbackItem& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + NCursesMenuCallbackItem(const NCursesMenuCallbackItem& rhs) + : NCursesMenuItem(rhs), + p_fct(0) + { + } + + virtual ~NCursesMenuCallbackItem() THROWS(NCursesException); + + bool action() NCURSES_OVERRIDE; +}; + + // This are the built-in hook functions in this C++ binding. In C++ we use + // virtual member functions (see below On_..._Init and On_..._Termination) + // to provide this functionality in an object oriented manner. +extern "C" { + void _nc_xx_mnu_init(MENU *); + void _nc_xx_mnu_term(MENU *); + void _nc_xx_itm_init(MENU *); + void _nc_xx_itm_term(MENU *); +} + +// +// ------------------------------------------------------------------------- +// This wraps the MENU type of +// ------------------------------------------------------------------------- +// +class NCURSES_CXX_IMPEXP NCursesMenu : public NCursesPanel +{ +protected: + MENU *menu; + +private: + NCursesWindow* sub; // the subwindow object + bool b_sub_owner; // is this our own subwindow? + bool b_framed; // has the menu a border? + bool b_autoDelete; // Delete items when deleting menu? + + NCursesMenuItem** my_items; // The array of items for this menu + + // This structure is used for the menu's user data field to link the + // MENU* to the C++ object and to provide extra space for a user pointer. + typedef struct { + void* m_user; // the pointer for the user's data + const NCursesMenu* m_back; // backward pointer to C++ object + const MENU* m_owner; + } UserHook; + + // Get the backward pointer to the C++ object from a MENU + static inline NCursesMenu* getHook(const MENU *m) { + UserHook* hook = STATIC_CAST(UserHook*)(::menu_userptr(m)); + assert(hook != 0 && hook->m_owner==m); + return const_cast(hook->m_back); + } + + friend void _nc_xx_mnu_init(MENU *); + friend void _nc_xx_mnu_term(MENU *); + friend void _nc_xx_itm_init(MENU *); + friend void _nc_xx_itm_term(MENU *); + + // Calculate ITEM* array for the menu + ITEM** mapItems(NCursesMenuItem* nitems[]); + +protected: + // internal routines + inline void set_user(void *user) { + UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu)); + assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu); + uptr->m_user = user; + } + + inline void *get_user() { + const UserHook* uptr = STATIC_CAST(UserHook*)(::menu_userptr (menu)); + assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==menu); + return uptr->m_user; + } + + void InitMenu (NCursesMenuItem* menu[], + bool with_frame, + bool autoDeleteItems); + + inline void OnError (int err) const THROW2(NCursesException const, NCursesMenuException) { + if (err != E_OK) + THROW(new NCursesMenuException (this, err)); + } + + // this wraps the menu_driver call. + virtual int driver (int c) ; + + // 'Internal' constructor to create a menu without association to + // an array of items. + NCursesMenu( int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0) + : NCursesPanel(nlines,ncols,begin_y,begin_x), + menu (STATIC_CAST(MENU*)(0)), + sub(0), + b_sub_owner(0), + b_framed(0), + b_autoDelete(0), + my_items(0) + { + } + +public: + // Make a full window size menu + NCursesMenu (NCursesMenuItem* Items[], + bool with_frame=FALSE, // Reserve space for a frame? + bool autoDelete_Items=FALSE) // Autocleanup of Items? + : NCursesPanel(), + menu(0), + sub(0), + b_sub_owner(0), + b_framed(0), + b_autoDelete(0), + my_items(0) + { + InitMenu(Items, with_frame, autoDelete_Items); + } + + // Make a menu with a window of this size. + NCursesMenu (NCursesMenuItem* Items[], + int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + bool with_frame=FALSE, // Reserve space for a frame? + bool autoDelete_Items=FALSE) // Autocleanup of Items? + : NCursesPanel(nlines, ncols, begin_y, begin_x), + menu(0), + sub(0), + b_sub_owner(0), + b_framed(0), + b_autoDelete(0), + my_items(0) + { + InitMenu(Items, with_frame, autoDelete_Items); + } + + NCursesMenu& operator=(const NCursesMenu& rhs) + { + if (this != &rhs) { + *this = rhs; + NCursesPanel::operator=(rhs); + } + return *this; + } + + NCursesMenu(const NCursesMenu& rhs) + : NCursesPanel(rhs), + menu(rhs.menu), + sub(rhs.sub), + b_sub_owner(rhs.b_sub_owner), + b_framed(rhs.b_framed), + b_autoDelete(rhs.b_autoDelete), + my_items(rhs.my_items) + { + } + + virtual ~NCursesMenu () THROWS(NCursesException); + + // Retrieve the menus subwindow + inline NCursesWindow& subWindow() const { + assert(sub!=NULL); + return *sub; + } + + // Set the menus subwindow + void setSubWindow(NCursesWindow& sub); + + // Set these items for the menu + inline void setItems(NCursesMenuItem* Items[]) { + OnError(::set_menu_items(menu,mapItems(Items))); + } + + // Remove the menu from the screen + inline void unpost (void) { + OnError (::unpost_menu (menu)); + } + + // Post the menu to the screen if flag is true, unpost it otherwise + inline void post(bool flag = TRUE) { + flag ? OnError (::post_menu(menu)) : OnError (::unpost_menu (menu)); + } + + // Get the number of rows and columns for this menu + inline void scale (int& mrows, int& mcols) const { + OnError (::scale_menu (menu, &mrows, &mcols)); + } + + // Set the format of this menu + inline void set_format(int mrows, int mcols) { + OnError (::set_menu_format(menu, mrows, mcols)); + } + + // Get the format of this menu + inline void menu_format(int& rows,int& ncols) { + ::menu_format(menu,&rows,&ncols); + } + + // Items of the menu + inline NCursesMenuItem* items() const { + return *my_items; + } + + // Get the number of items in this menu + inline int count() const { + return ::item_count(menu); + } + + // Get the current item (i.e. the one the cursor is located) + inline NCursesMenuItem* current_item() const { + return my_items[::item_index(::current_item(menu))]; + } + + // Get the marker string + inline const char* mark() const { + return ::menu_mark(menu); + } + + // Set the marker string + inline void set_mark(const char *marker) { + OnError (::set_menu_mark (menu, marker)); + } + + // Get the name of the request code c + inline static const char* request_name(int c) { + return ::menu_request_name(c); + } + + // Get the current pattern + inline char* pattern() const { + return ::menu_pattern(menu); + } + + // true if there is a pattern match, false otherwise. + bool set_pattern (const char *pat); + + // set the default attributes for the menu + // i.e. set fore, back and grey attribute + virtual void setDefaultAttributes(); + + // Get the menus background attributes + inline chtype back() const { + return ::menu_back(menu); + } + + // Get the menus foreground attributes + inline chtype fore() const { + return ::menu_fore(menu); + } + + // Get the menus grey attributes (used for unselectable items) + inline chtype grey() const { + return ::menu_grey(menu); + } + + // Set the menus background attributes + inline chtype set_background(chtype a) { + return ::set_menu_back(menu,a); + } + + // Set the menus foreground attributes + inline chtype set_foreground(chtype a) { + return ::set_menu_fore(menu,a); + } + + // Set the menus grey attributes (used for unselectable items) + inline chtype set_grey(chtype a) { + return ::set_menu_grey(menu,a); + } + + inline void options_on (Menu_Options opts) { + OnError (::menu_opts_on (menu,opts)); + } + + inline void options_off(Menu_Options opts) { + OnError (::menu_opts_off(menu,opts)); + } + + inline Menu_Options options() const { + return ::menu_opts(menu); + } + + inline void set_options (Menu_Options opts) { + OnError (::set_menu_opts (menu,opts)); + } + + inline int pad() const { + return ::menu_pad(menu); + } + + inline void set_pad (int padch) { + OnError (::set_menu_pad (menu, padch)); + } + + // Position the cursor to the current item + inline void position_cursor () const { + OnError (::pos_menu_cursor (menu)); + } + + // Set the current item + inline void set_current(NCursesMenuItem& I) { + OnError (::set_current_item(menu, I.item)); + } + + // Get the current top row of the menu + inline int top_row (void) const { + return ::top_row (menu); + } + + // Set the current top row of the menu + inline void set_top_row (int row) { + OnError (::set_top_row (menu, row)); + } + + // spacing control + // Set the spacing for the menu + inline void setSpacing(int spc_description, + int spc_rows, + int spc_columns) { + OnError(::set_menu_spacing(menu, + spc_description, + spc_rows, + spc_columns)); + } + + // Get the spacing info for the menu + inline void Spacing(int& spc_description, + int& spc_rows, + int& spc_columns) const { + OnError(::menu_spacing(menu, + &spc_description, + &spc_rows, + &spc_columns)); + } + + // Decorations + inline void frame(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE { + if (b_framed) + NCursesPanel::frame(title,btitle); + else + OnError(E_SYSTEM_ERROR); + } + + inline void boldframe(const char *title=NULL, const char* btitle=NULL) NCURSES_OVERRIDE { + if (b_framed) + NCursesPanel::boldframe(title,btitle); + else + OnError(E_SYSTEM_ERROR); + } + + inline void label(const char *topLabel, const char *bottomLabel) NCURSES_OVERRIDE { + if (b_framed) + NCursesPanel::label(topLabel,bottomLabel); + else + OnError(E_SYSTEM_ERROR); + } + + // ----- + // Hooks + // ----- + + // Called after the menu gets repositioned in its window. + // This is especially true if the menu is posted. + virtual void On_Menu_Init(); + + // Called before the menu gets repositioned in its window. + // This is especially true if the menu is unposted. + virtual void On_Menu_Termination(); + + // Called after the item became the current item + virtual void On_Item_Init(NCursesMenuItem& item); + + // Called before this item is left as current item. + virtual void On_Item_Termination(NCursesMenuItem& item); + + // Provide a default key virtualization. Translate the keyboard + // code c into a menu request code. + // The default implementation provides a hopefully straightforward + // mapping for the most common keystrokes and menu requests. + virtual int virtualize(int c); + + + // Operators + inline NCursesMenuItem* operator[](int i) const { + if ( (i < 0) || (i >= ::item_count (menu)) ) + OnError (E_BAD_ARGUMENT); + return (my_items[i]); + } + + // Perform the menu's operation + // Return the item where you left the selection mark for a single + // selection menu, or NULL for a multivalued menu. + virtual NCursesMenuItem* operator()(void); + + // -------------------- + // Exception handlers + // Called by operator() + // -------------------- + + // Called if the request is denied + virtual void On_Request_Denied(int c) const; + + // Called if the item is not selectable + virtual void On_Not_Selectable(int c) const; + + // Called if pattern doesn't match + virtual void On_No_Match(int c) const; + + // Called if the command is unknown + virtual void On_Unknown_Command(int c) const; + +}; +// +// ------------------------------------------------------------------------- +// This is the typical C++ typesafe way to allow to attach +// user data to an item of a menu. Its assumed that the user +// data belongs to some class T. Use T as template argument +// to create a UserItem. +// ------------------------------------------------------------------------- +// +template class NCURSES_CXX_IMPEXP NCursesUserItem : public NCursesMenuItem +{ +public: + NCursesUserItem (const char* p_name, + const char* p_descript = NULL, + const T* p_UserData = STATIC_CAST(T*)(0)) + : NCursesMenuItem (p_name, p_descript) { + if (item) + OnError (::set_item_userptr (item, const_cast(reinterpret_cast(p_UserData)))); + } + + virtual ~NCursesUserItem() THROWS(NCursesException) {} + + inline const T* UserData (void) const { + return reinterpret_cast(::item_userptr (item)); + }; + + inline virtual void setUserData(const T* p_UserData) { + if (item) + OnError (::set_item_userptr (item, const_cast(reinterpret_cast(p_UserData)))); + } +}; +// +// ------------------------------------------------------------------------- +// The same mechanism is used to attach user data to a menu +// ------------------------------------------------------------------------- +// +template class NCURSES_CXX_IMPEXP NCursesUserMenu : public NCursesMenu +{ +protected: + NCursesUserMenu( int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = STATIC_CAST(T*)(0)) + : NCursesMenu(nlines,ncols,begin_y,begin_x) { + if (menu) + set_user (const_cast(reinterpret_cast(p_UserData))); + } + +public: + NCursesUserMenu (NCursesMenuItem* Items[], + const T* p_UserData = STATIC_CAST(T*)(0), + bool with_frame=FALSE, + bool autoDelete_Items=FALSE) + : NCursesMenu (Items, with_frame, autoDelete_Items) { + if (menu) + set_user (const_cast(reinterpret_cast(p_UserData))); + }; + + NCursesUserMenu (NCursesMenuItem* Items[], + int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = STATIC_CAST(T*)(0), + bool with_frame=FALSE) + : NCursesMenu (Items, nlines, ncols, begin_y, begin_x, with_frame) { + if (menu) + set_user (const_cast(reinterpret_cast(p_UserData))); + }; + + virtual ~NCursesUserMenu() THROWS(NCursesException) { + }; + + inline T* UserData (void) { + return reinterpret_cast(get_user ()); + }; + + inline virtual void setUserData (const T* p_UserData) { + if (menu) + set_user (const_cast(reinterpret_cast(p_UserData))); + } +}; + +#endif /* NCURSES_CURSESM_H_incl */ diff --git a/contrib/ncurses/c++/cursesmain.cc b/contrib/ncurses/c++/cursesmain.cc new file mode 100644 index 00000000..cc41b50b --- /dev/null +++ b/contrib/ncurses/c++/cursesmain.cc @@ -0,0 +1,96 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2007,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +#include "internal.h" +#include "cursesapp.h" + +#if CPP_HAS_TRY_CATCH && HAVE_IOSTREAM +#pragma GCC diagnostic ignored "-Weffc++" +#include +#pragma GCC diagnostic warning "-Weffc++" +#else +#undef CPP_HAS_TRY_CATCH +#define CPP_HAS_TRY_CATCH 0 +#endif + +MODULE_ID("$Id: cursesmain.cc,v 1.20 2020/07/18 19:57:11 anonymous.maarten Exp $") + +#if HAVE_LOCALE_H +#include +#else +#define setlocale(name,string) /* nothing */ +#endif + +#if NO_LEAKS +#include +#endif + +/* This is the default implementation of main() for a NCursesApplication. + * You only have to instantiate a static NCursesApplication object in your + * main application source file and link this module with your application. + */ +int NCURSES_CXX_MAIN_NAME(int argc, char* argv[]) +{ + setlocale(LC_ALL, ""); + + NCursesApplication* A = NCursesApplication::getApplication(); + if (!A) + return(1); + else { + int res; + + A->handleArgs(argc,argv); + ::endwin(); +#if CPP_HAS_TRY_CATCH + try { + res = (*A)(); + ::endwin(); + } + catch(const NCursesException &e) { + ::endwin(); + std::cerr << e.message << std::endl; + res = e.errorno; + } +#else + res = (*A)(); + ::endwin(); +#endif +#if NO_LEAKS + delete A; + exit_curses(res); +#else + return(res); +#endif + } +} diff --git a/contrib/ncurses/c++/cursesp.cc b/contrib/ncurses/c++/cursesp.cc new file mode 100644 index 00000000..96f9e354 --- /dev/null +++ b/contrib/ncurses/c++/cursesp.cc @@ -0,0 +1,139 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019-2020,2024 Thomas E. Dickey * + * Copyright 1998-2003,2005 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1993, 1997 * + ****************************************************************************/ + +#include "internal.h" +#include "cursesp.h" + +MODULE_ID("$Id: cursesp.cc,v 1.28 2024/10/05 22:47:12 tom Exp $") + +NCursesPanel* NCursesPanel::dummy = static_cast(0); + +void NCursesPanel::init() +{ + p = ::new_panel(w); + if (!p) + OnError(ERR); + + UserHook* hook = new UserHook; + hook->m_user = NULL; + hook->m_back = this; + hook->m_owner = p; + ::set_panel_userptr(p, reinterpret_cast(hook)); +} + +NCursesPanel::~NCursesPanel() THROWS(NCursesException) +{ + UserHook* hook = UserPointer(); + assert(hook != 0 && hook->m_back==this && hook->m_owner==p); + delete hook; + ::del_panel(p); + ::update_panels(); +} + +void +NCursesPanel::redraw() +{ + const PANEL *pan; + + pan = ::panel_above(NULL); + while (pan) { + ::touchwin(panel_window(pan)); + pan = ::panel_above(pan); + } + ::update_panels(); + ::doupdate(); +} + +int +NCursesPanel::refresh() +{ + ::update_panels(); + return ::doupdate(); +} + +int +NCursesPanel::noutrefresh() +{ + ::update_panels(); + return OK; +} + +void +NCursesPanel::boldframe(const char *title, const char* btitle) +{ + standout(); + frame(title, btitle); + standend(); +} + +void +NCursesPanel::frame(const char *title,const char *btitle) +{ + int err = OK; + if (!title && !btitle) { + err = box(); + } + else { + err = box(); + if (err==OK) + label(title,btitle); + } + OnError(err); +} + +void +NCursesPanel::label(const char *tLabel, const char *bLabel) +{ + if (tLabel) + centertext(0,tLabel); + if (bLabel) + centertext(maxy(),bLabel); +} + +void +NCursesPanel::centertext(int row,const char *labelText) +{ + if (labelText) { + int x = (maxx() - ::strlen(labelText)) / 2; + if (x<0) + x=0; + OnError(addstr(row, x, labelText, width())); + } +} + +int +NCursesPanel::getKey(void) +{ + return getch(); +} diff --git a/contrib/ncurses/c++/cursesp.h b/contrib/ncurses/c++/cursesp.h new file mode 100644 index 00000000..f0bd5c9c --- /dev/null +++ b/contrib/ncurses/c++/cursesp.h @@ -0,0 +1,271 @@ +// * This makes emacs happy -*-Mode: C++;-*- +// vile:cppmode +/**************************************************************************** + * Copyright 2019-2021,2022 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +#ifndef NCURSES_CURSESP_H_incl +#define NCURSES_CURSESP_H_incl 1 + +// $Id: cursesp.h,v 1.36 2022/08/20 20:52:15 tom Exp $ + +#include + +extern "C" { +# include +} + +class NCURSES_CXX_IMPEXP NCursesPanel + : public NCursesWindow +{ +protected: + PANEL *p; + static NCursesPanel *dummy; + +private: + // This structure is used for the panel's user data field to link the + // PANEL* to the C++ object and to provide extra space for a user pointer. + typedef struct { + void* m_user; // the pointer for the user's data + const NCursesPanel* m_back; // backward pointer to C++ object + const PANEL* m_owner; // the panel itself + } UserHook; + + inline UserHook *UserPointer() + { + UserHook* uptr = reinterpret_cast( + const_cast(::panel_userptr (p))); + return uptr; + } + + void init(); // Initialize the panel object + +protected: + void set_user(void *user) + { + UserHook* uptr = UserPointer(); + if (uptr != 0 && uptr->m_back==this && uptr->m_owner==p) { + uptr->m_user = user; + } + } + // Set the user pointer of the panel. + + void *get_user() + { + UserHook* uptr = UserPointer(); + void *result = 0; + if (uptr != 0 && uptr->m_back==this && uptr->m_owner==p) + result = uptr->m_user; + return result; + } + + void OnError (int err) const THROW2(NCursesException const, NCursesPanelException) + { + if (err==ERR) + THROW(new NCursesPanelException (this, err)); + } + // If err is equal to the curses error indicator ERR, an error handler + // is called. + + // Get a keystroke. Default implementation calls getch() + virtual int getKey(void); + +public: + NCursesPanel(int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0) + : NCursesWindow(nlines,ncols,begin_y,begin_x), p(0) + { + init(); + } + // Create a panel with this size starting at the requested position. + + NCursesPanel() + : NCursesWindow(::stdscr), p(0) + { + init(); + } + // This constructor creates the default Panel associated with the + // ::stdscr window + + NCursesPanel& operator=(const NCursesPanel& rhs) + { + if (this != &rhs) { + *this = rhs; + NCursesWindow::operator=(rhs); + } + return *this; + } + + NCursesPanel(const NCursesPanel& rhs) + : NCursesWindow(rhs), + p(rhs.p) + { + } + + virtual ~NCursesPanel() THROWS(NCursesException); + + // basic manipulation + inline void hide() + { + OnError (::hide_panel(p)); + } + // Hide the panel. It stays in the stack but becomes invisible. + + inline void show() + { + OnError (::show_panel(p)); + } + // Show the panel, i.e. make it visible. + + inline void top() + { + OnError (::top_panel(p)); + } + // Make this panel the top panel in the stack. + + inline void bottom() + { + OnError (::bottom_panel(p)); + } + // Make this panel the bottom panel in the stack. + // N.B.: The panel associated with ::stdscr is always on the bottom. So + // actually bottom() makes the panel the first above ::stdscr. + + virtual int mvwin(int y, int x) NCURSES_OVERRIDE + { + OnError(::move_panel(p, y, x)); + return OK; + } + + inline bool hidden() const + { + return (::panel_hidden (p) ? TRUE : FALSE); + } + // Return TRUE if the panel is hidden, FALSE otherwise. + +/* The functions panel_above() and panel_below() are not reflected in + the NCursesPanel class. The reason for this is, that we cannot + assume that a panel retrieved by those operations is one wrapped + by a C++ class. Although this situation might be handled, we also + need a reverse mapping from PANEL to NCursesPanel which needs some + redesign of the low level stuff. At the moment, we define them in the + interface but they will always produce an error. */ + inline NCursesPanel& above() const + { + OnError(ERR); + return *dummy; + } + + inline NCursesPanel& below() const + { + OnError(ERR); + return *dummy; + } + + // Those two are rewrites of the corresponding virtual members of + // NCursesWindow + virtual int refresh() NCURSES_OVERRIDE; + // Propagate all panel changes to the virtual screen and update the + // physical screen. + + virtual int noutrefresh() NCURSES_OVERRIDE; + // Propagate all panel changes to the virtual screen. + + static void redraw(); + // Redraw all panels. + + // decorations + virtual void frame(const char* title=NULL, + const char* btitle=NULL); + // Put a frame around the panel and put the title centered in the top line + // and btitle in the bottom line. + + virtual void boldframe(const char* title=NULL, + const char* btitle=NULL); + // Same as frame(), but use highlighted attributes. + + virtual void label(const char* topLabel, + const char* bottomLabel); + // Put the title centered in the top line and btitle in the bottom line. + + virtual void centertext(int row,const char* label); + // Put the label text centered in the specified row. +}; + +/* We use templates to provide a typesafe mechanism to associate + * user data with a panel. A NCursesUserPanel is a panel + * associated with some user data of type T. + */ +template class NCursesUserPanel : public NCursesPanel +{ +public: + NCursesUserPanel (int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = STATIC_CAST(T*)(0)) + : NCursesPanel (nlines, ncols, begin_y, begin_x) + { + if (p) + set_user (const_cast(reinterpret_cast + (p_UserData))); + }; + // This creates an user panel of the requested size with associated + // user data pointed to by p_UserData. + + explicit NCursesUserPanel(const T* p_UserData = STATIC_CAST(T*)(0)) : NCursesPanel() + { + if (p) + set_user(const_cast(reinterpret_cast(p_UserData))); + }; + // This creates an user panel associated with the ::stdscr and user data + // pointed to by p_UserData. + + virtual ~NCursesUserPanel() THROWS(NCursesException) {}; + + T* UserData (void) + { + return reinterpret_cast(get_user ()); + }; + // Retrieve the user data associated with the panel. + + virtual void setUserData (const T* p_UserData) + { + if (p) + set_user (const_cast(reinterpret_cast(p_UserData))); + } + // Associate the user panel with the user data pointed to by p_UserData. +}; + +#endif /* NCURSES_CURSESP_H_incl */ diff --git a/contrib/ncurses/c++/cursespad.cc b/contrib/ncurses/c++/cursespad.cc new file mode 100644 index 00000000..4d30a5c7 --- /dev/null +++ b/contrib/ncurses/c++/cursespad.cc @@ -0,0 +1,300 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1999-2012,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1999 * + ****************************************************************************/ + +#include "internal.h" + +#include + +MODULE_ID("$Id: cursespad.cc,v 1.19 2024/10/05 22:47:12 tom Exp $") + +NCursesPad::NCursesPad(int nlines, int ncols) + : NCursesWindow(), + viewWin(static_cast(0)), + viewSub(static_cast(0)), + h_gridsize(0), v_gridsize(0), + min_row(0), min_col(0) +{ + w = ::newpad(nlines, ncols); + if (static_cast(0) == w) { + count--; + err_handler("Cannot construct window"); + } + alloced = TRUE; +} + + +int NCursesPad::driver (int key) +{ + // Default implementation + switch(key) { + case KEY_UP: + // ======= + return REQ_PAD_UP; + case KEY_DOWN: + // ========= + return REQ_PAD_DOWN; + case KEY_LEFT: + // ========= + return REQ_PAD_LEFT; + case KEY_RIGHT: + // ========== + return REQ_PAD_RIGHT; + case KEY_EXIT: + // ========= + case CTRL('X'): + // ========== + return REQ_PAD_EXIT; + + default: return(key); + } +} + + +void NCursesPad::operator()(void) +{ + NCursesWindow* W = Win(); + + if (static_cast(0) != W) { + int Width = W->width(); + int Height = W->height(); + + int req = REQ_PAD_REFRESH; + + W->keypad(TRUE); + W->meta(TRUE); + refresh(); + + do { + bool changed = FALSE; + + switch (req) { + case REQ_PAD_REFRESH: + // ================ + changed = TRUE; + break; + case REQ_PAD_LEFT: + // ============= + if (min_col > 0) { + changed = TRUE; + if (min_col < h_gridsize) + min_col = 0; + else + min_col -= h_gridsize; + } + else + OnNavigationError(req); + break; + case REQ_PAD_RIGHT: + // ============== + if (min_col < (width() - Width - 1)) { + changed = TRUE; + if (min_col > (width() - Width - h_gridsize - 1)) + min_col = width() - Width - 1; + else + min_col += h_gridsize; + } + else + OnNavigationError(req); + break; + case REQ_PAD_UP: + // =========== + if (min_row > 0) { + changed = TRUE; + if (min_row < v_gridsize) + min_row = 0; + else + min_row -= v_gridsize; + } + else + OnNavigationError(req); + break; + case REQ_PAD_DOWN: + // ============= + if (min_row < (height() - Height - 1)) { + changed = TRUE; + if (min_row > (height() - Height - v_gridsize - 1)) + min_row = height() - Height - 1; + else + min_row += v_gridsize; + } + else + OnNavigationError(req); + break; + + default: + OnUnknownOperation(req); + } + + if (changed) { + noutrefresh(); + W->syncup(); + OnOperation(req); + viewWin->refresh(); + } + } while( (req=driver(W->getch())) != REQ_PAD_EXIT ); + } +} + + +int NCursesPad::refresh() +{ + int res = noutrefresh(); + if (res==OK && (static_cast(0) != viewWin)) { + res = (viewWin->refresh()); + } + return(res); +} + +int NCursesPad::noutrefresh() +{ + int res = OK; + NCursesWindow* W = Win(); + if (static_cast(0) != W) { + int high = W->maxy(); + int wide = W->maxx(); + res = copywin(*W, min_row, min_col, + 0, 0, high, wide, + FALSE); + if (res==OK) { + W->syncup(); + res = viewWin->noutrefresh(); + } + } + return (res); +} + +void NCursesPad::setWindow(NCursesWindow& view, + int v_grid NCURSES_PARAM_INIT(1), + int h_grid NCURSES_PARAM_INIT(1)) +{ + viewWin = &view; + min_row = min_col = 0; + if (h_grid <=0 || v_grid <= 0) + err_handler("Illegal Gridsize"); + else { + h_gridsize = h_grid; + v_gridsize = v_grid; + } +} + +void NCursesPad::setSubWindow(NCursesWindow& sub) +{ + if (static_cast(0) == viewWin) + err_handler("Pad has no viewport"); + assert(viewWin != 0); + if (!viewWin->isDescendant(sub)) + THROW(new NCursesException("NCursesFramePad", E_SYSTEM_ERROR)); + viewSub = ⊂ +} + +void NCursesFramedPad::OnOperation(int pad_req) +{ + (void) pad_req; + const NCursesWindow* W = Win(); + NCursesWindow* W2 = getWindow(); + + if ((static_cast(0) != W) && (static_cast(0) != W2)) { + int Width = W->width(); + int Height = W->height(); + int i, row, col, h_len, v_len; + + int my_width = width(); + + if (my_width != 0) { + h_len = (Width*Width + my_width - 1) / my_width; + if (h_len==0) + h_len = 1; + if (h_len > Width) + h_len = Width; + } else { + h_len = 1; + } + + int my_height = height(); + + if (my_height != 0) { + v_len = (Height*Height + my_height - 1) / my_height; + if (v_len==0) + v_len = 1; + if (v_len > Height) + v_len = Height; + } else { + v_len = 1; + } + + if (my_width != 0) { + col = (min_col * Width + my_width - 1) / my_width; + if (col + h_len > Width) + col = Width - h_len; + } else { + col = 0; + } + + if (my_height != 0) { + row = (min_row * Height + my_height - 1) / my_height; + if (row + v_len > Height) + row = Height - v_len; + } else { + row = 0; + } + + W2->vline(1,Width+1,Height); + W2->attron(A_REVERSE); + if (v_len>=2) { + W2->addch(row+1,Width+1,ACS_UARROW); + for(i=2;iaddch(row+i,Width+1,' '); + W2->addch(row+v_len,Width+1,ACS_DARROW); + } + else { + for(i=1;i<=v_len;i++) + W2->addch(row+i,Width+1,' '); + } + W2->attroff(A_REVERSE); + + W2->hline(Height+1,1,Width); + W2->attron(A_REVERSE); + if (h_len >= 2) { + W2->addch(Height+1,col+1,ACS_LARROW); + for(i=2;iaddch(Height+1,col+i,' '); + W2->addch(Height+1,col+h_len,ACS_RARROW); + } + else { + for(i=1;i<=h_len;i++) + W2->addch(Height+1,col+i,' '); + } + W2->attroff(A_REVERSE); + } +} diff --git a/contrib/ncurses/c++/cursesw.cc b/contrib/ncurses/c++/cursesw.cc new file mode 100644 index 00000000..8ea265cb --- /dev/null +++ b/contrib/ncurses/c++/cursesw.cc @@ -0,0 +1,470 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Authors: + * Thomas E. Dickey + * Juergen Pfeifer + * + * The NCursesWindow class was originally based on a file written by + * Eric Newton, later modified by Ulrich Drepper and Anatoly Ivasyuk. + * However, aside from the compatible interface definition, no trace + * of the original code remains in this version: it consists only of + * changes introduced since 1995. + */ + +#include "internal.h" +#include "cursesw.h" + +MODULE_ID("$Id: cursesw.cc,v 1.56 2020/02/02 23:34:34 tom Exp $") + +#define COLORS_NEED_INITIALIZATION -1 +#define COLORS_NOT_INITIALIZED 0 +#define COLORS_MONOCHROME 1 +#define COLORS_ARE_REALLY_THERE 2 + +#define HaveColors() (colorInitialized == COLORS_ARE_REALLY_THERE) + +// declare static variables for the class +long NCursesWindow::count = 0L; +bool NCursesWindow::b_initialized = FALSE; + +int +NCursesWindow::scanw(const char* fmt, ...) +{ + int result = ERR; + + va_list args; + va_start(args, fmt); + result = ::vw_scanw (w, const_cast(fmt), args); + va_end(args); + + return result; +} + + +int +NCursesWindow::scanw(int y, int x, const char* fmt, ...) +{ + int result = ERR; + + if (::wmove(w, y, x) != ERR) { + va_list args; + va_start(args, fmt); + result = ::vw_scanw (w, const_cast(fmt), args); + va_end(args); + } + return result; +} + + +int +NCursesWindow::scanw(const char* fmt, va_list args) +{ + int result = ERR; + + result = ::vw_scanw (w, const_cast(fmt), args); + + return result; +} + + +int +NCursesWindow::scanw(int y, int x, const char* fmt, va_list args) +{ + int result = ERR; + + if (::wmove(w, y, x) != ERR) { + result = ::vw_scanw (w, const_cast(fmt), args); + } + return result; +} + + +int +NCursesWindow::printw(const char * fmt, ...) +{ + va_list args; + va_start(args, fmt); + int result = ::vw_printw(w, fmt, args); + va_end(args); + return result; +} + + +int +NCursesWindow::printw(int y, int x, const char * fmt, ...) +{ + va_list args; + va_start(args, fmt); + int result = ::wmove(w, y, x); + if (result == OK) { + result = ::vw_printw(w, fmt, args); + } + va_end(args); + return result; +} + + +int +NCursesWindow::printw(const char * fmt, va_list args) +{ + int result = ::vw_printw(w, fmt, args); + return result; +} + + +int +NCursesWindow::printw(int y, int x, const char * fmt, va_list args) +{ + int result = ::wmove(w, y, x); + if (result == OK) { + result = ::vw_printw(w, fmt, args); + } + return result; +} + + +void +NCursesWindow::set_keyboard(void) +{ + keypad(TRUE); + meta(TRUE); +} + +void +NCursesWindow::err_handler(const char *msg) const THROWS(NCursesException) +{ + THROW(new NCursesException(msg)); +} + +void +NCursesWindow::initialize() +{ + if (!b_initialized) { + ::initscr(); + b_initialized = TRUE; + if (colorInitialized == COLORS_NEED_INITIALIZATION) { + colorInitialized = COLORS_NOT_INITIALIZED; + useColors(); + } + ::noecho(); + ::cbreak(); + } +} + +void +NCursesWindow::constructing() +{ + initialize(); + ++count; +} + +NCursesWindow::NCursesWindow() + : w(0), alloced(FALSE), par(0), subwins(0), sib(0) +{ + constructing(); + + w = static_cast(0); +} + +NCursesWindow::NCursesWindow(int nlines, int ncols, int begin_y, int begin_x) + : w(0), alloced(TRUE), par(0), subwins(0), sib(0) +{ + constructing(); + + w = ::newwin(nlines, ncols, begin_y, begin_x); + if (w == 0) { + err_handler("Cannot construct window"); + } + set_keyboard(); +} + +NCursesWindow::NCursesWindow(WINDOW* window) + : w(0), alloced(FALSE), par(0), subwins(0), sib(0) +{ + constructing(); + + // We used to use a reference on the "window" parameter, but we cannot do + // that with an opaque pointer (see NCURSES_OPAQUE). If the parameter was + // "::stdscr", that is first set via the "constructing() call, and is null + // up to that point. So we allow a null pointer here as meaning the "same" + // as "::stdscr". + w = window ? window : ::stdscr; + set_keyboard(); +} + +NCursesWindow::NCursesWindow(NCursesWindow& win, int ny, int nx, + int begin_y, int begin_x, char absrel) + : w(0), alloced(TRUE), par(0), subwins(0), sib(0) +{ + constructing(); + if (absrel == 'a') { // absolute origin + begin_y -= win.begy(); + begin_x -= win.begx(); + } + + // Link this window into its parent's list of subwindows. + // We use derwin(), since this also works for pads. + w = ::derwin(win.w, ny, nx, begin_y, begin_x); + if (w == 0) { + err_handler("Cannot construct subwindow"); + } + + par = &win; + sib = win.subwins; + win.subwins = this; +} + +NCursesWindow::NCursesWindow(NCursesWindow& win, + bool do_box NCURSES_PARAM_INIT(TRUE)) + : w(0), alloced(TRUE), par(0), subwins(0), sib(0) +{ + constructing(); + int myHeight = win.height(); + int myWidth = win.width(); + w = :: derwin(win.w, myHeight - 2, myWidth - 2, 1, 1); + if (w == 0) { + err_handler("Cannot construct subwindow"); + } + + par = &win; + sib = win.subwins; + win.subwins = this; + subwins = 0; + + if (do_box) { + win.box(); + win.touchwin(); + } +} + +NCursesWindow NCursesWindow::Clone() +{ + WINDOW *d = ::dupwin(w); + NCursesWindow W(d); + W.subwins = subwins; + W.sib = sib; + W.par = par; + W.alloced = alloced; + return W; +} + +typedef int (*RIPOFFINIT)(NCursesWindow&); +static RIPOFFINIT R_INIT[5]; // There can't be more +static int r_init_idx = 0; +static RIPOFFINIT* prip = R_INIT; + +NCursesWindow::NCursesWindow(WINDOW *win, int ncols) + : w(0), alloced(FALSE), par(0), subwins(0), sib(0) +{ + (void) ncols; + initialize(); + w = win; +} + +int _nc_xx_ripoff_init(WINDOW *w, int ncols) +{ + (void) ncols; + int res = ERR; + + RIPOFFINIT init = *prip++; + if (init) { + res = init(*(new NCursesWindow(w,ncols))); + } + return res; +} + +int NCursesWindow::ripoffline(int ripoff_lines, + int (*init)(NCursesWindow& win)) +{ + int code = ::_nc_ripoffline(ripoff_lines,_nc_xx_ripoff_init); + if (code == OK && init && ripoff_lines) { + R_INIT[r_init_idx++] = init; + } + return code; +} + +bool +NCursesWindow::isDescendant(NCursesWindow& win) +{ + bool result = FALSE; + + for (NCursesWindow* p = subwins; p != NULL; p = p->sib) { + if (p == &win || p->isDescendant(win)) { + result = TRUE; + break; + } + } + return result; +} + +void +NCursesWindow::kill_subwindows() +{ + NCursesWindow* p = subwins; + + subwins = 0; + while (p != 0) { + NCursesWindow* q = p->sib; + p->kill_subwindows(); + if (p->alloced) { + if (p->w != 0) + ::delwin(p->w); + } + delete p; + p = q; + } +} + + +NCursesWindow::~NCursesWindow() THROWS(NCursesException) +{ + kill_subwindows(); + + if (par != 0) { + // Remove this window from the parent's list of subwindows. + NCursesWindow * next = par->subwins; + NCursesWindow * prev = 0; + while (next != 0) { + if (next == this) { + if (prev != 0) { + prev->sib = next->sib; + } else { + par->subwins = next->sib; + } + break; + } + prev = next; + next = next->sib; + } + } + + if (alloced && w != 0) + ::delwin(w); + + if (alloced) { + --count; + if (count == 0) { + ::endwin(); + } else if (count < 0) { // cannot happen! + err_handler("Too many windows destroyed"); + } + } +} + +// --------------------------------------------------------------------- +// Color stuff +// +int NCursesWindow::colorInitialized = COLORS_NOT_INITIALIZED; + +void +NCursesWindow::useColors(void) +{ + if (colorInitialized == COLORS_NOT_INITIALIZED) { + if (b_initialized) { + if (::has_colors()) { + ::start_color(); + colorInitialized = COLORS_ARE_REALLY_THERE; + } else { + colorInitialized = COLORS_MONOCHROME; + } + } else { + colorInitialized = COLORS_NEED_INITIALIZATION; + } + } +} + +NCURSES_PAIRS_T +NCursesWindow::getPair() const +{ + return static_cast(PAIR_NUMBER(getattrs(w))); +} + +NCURSES_COLOR_T +NCursesWindow::getcolor(int getback) const +{ + NCURSES_COLOR_T fore, back; + + if (HaveColors()) { + if (::pair_content(getPair(), &fore, &back) == ERR) + err_handler("Can't get color pair"); + } else { + // Monochrome means white on black + back = COLOR_BLACK; + fore = COLOR_WHITE; + } + return getback ? back : fore; +} + +int NCursesWindow::NumberOfColors() +{ + return (HaveColors()) ? COLORS : 1; +} + +NCURSES_PAIRS_T +NCursesWindow::getcolor() const +{ + return (HaveColors()) ? getPair() : 0; +} + +int +NCursesWindow::setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back, NCURSES_PAIRS_T pair) +{ + return (HaveColors()) ? ::init_pair(pair, fore, back) : OK; +} + +int +NCursesWindow::setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back) +{ + return setpalette(fore, back, getPair()); +} + + +int +NCursesWindow::setcolor(NCURSES_PAIRS_T pair) +{ + if (HaveColors()) { + if ((pair < 1) || (pair > COLOR_PAIRS)) + err_handler("Can't set color pair"); + + attroff(A_COLOR); + attrset(COLOR_PAIR(pair)); + } + return OK; +} + +#if HAVE_HAS_KEY +bool NCursesWindow::has_mouse() const +{ + return ((::has_key(KEY_MOUSE) || ::has_mouse()) + ? TRUE : FALSE); +} +#endif diff --git a/contrib/ncurses/c++/cursesw.h b/contrib/ncurses/c++/cursesw.h new file mode 100644 index 00000000..eef5a631 --- /dev/null +++ b/contrib/ncurses/c++/cursesw.h @@ -0,0 +1,1581 @@ +// * This makes emacs happy -*-Mode: C++;-*- +// vile:cppmode +/**************************************************************************** + * Copyright 2019-2021,2022 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +#ifndef NCURSES_CURSESW_H_incl +#define NCURSES_CURSESW_H_incl 1 + +// $Id: cursesw.h,v 1.59 2022/08/20 20:52:15 tom Exp $ + +extern "C" { +# include +} + +#if defined(BUILDING_NCURSES_CXX) +# define NCURSES_CXX_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT +#else +# define NCURSES_CXX_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT +#endif + +#define NCURSES_CXX_WRAPPED_VAR(type,name) extern NCURSES_CXX_IMPEXP type NCURSES_PUBLIC_VAR(name)(void) + +#define NCURSES_CXX_EXPORT(type) NCURSES_CXX_IMPEXP type NCURSES_API +#define NCURSES_CXX_EXPORT_VAR(type) NCURSES_CXX_IMPEXP type + +#include + +/* SCO 3.2v4 curses.h includes term.h, which defines lines as a macro. + Undefine it here, because NCursesWindow uses lines as a method. */ +#undef lines + +/* "Convert" macros to inlines. We'll define it as another symbol to avoid + * conflict with library symbols. + */ +#undef UNDEF +#define UNDEF(name) CUR_ ##name + +#ifdef addch +inline int UNDEF(addch)(chtype ch) { return addch(ch); } +#undef addch +#define addch UNDEF(addch) +#endif + +#ifdef addchstr +inline int UNDEF(addchstr)(chtype *at) { return addchstr(at); } +#undef addchstr +#define addchstr UNDEF(addchstr) +#endif + +#ifdef addnstr +inline int UNDEF(addnstr)(const char *str, int n) +{ return addnstr(str, n); } +#undef addnstr +#define addnstr UNDEF(addnstr) +#endif + +#ifdef addstr +inline int UNDEF(addstr)(const char * str) { return addstr(str); } +#undef addstr +#define addstr UNDEF(addstr) +#endif + +#ifdef attroff +inline int UNDEF(attroff)(chtype at) { return attroff(at); } +#undef attroff +#define attroff UNDEF(attroff) +#endif + +#ifdef attron +inline int UNDEF(attron)(chtype at) { return attron(at); } +#undef attron +#define attron UNDEF(attron) +#endif + +#ifdef attrset +inline chtype UNDEF(attrset)(chtype at) { return attrset(at); } +#undef attrset +#define attrset UNDEF(attrset) +#endif + +#ifdef bkgd +inline int UNDEF(bkgd)(chtype ch) { return bkgd(ch); } +#undef bkgd +#define bkgd UNDEF(bkgd) +#endif + +#ifdef bkgdset +inline void UNDEF(bkgdset)(chtype ch) { bkgdset(ch); } +#undef bkgdset +#define bkgdset UNDEF(bkgdset) +#endif + +#ifdef border +inline int UNDEF(border)(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br) +{ return border(ls, rs, ts, bs, tl, tr, bl, br); } +#undef border +#define border UNDEF(border) +#endif + +#ifdef box +inline int UNDEF(box)(WINDOW *win, int v, int h) { return box(win, v, h); } +#undef box +#define box UNDEF(box) +#endif + +#ifdef chgat +inline int UNDEF(chgat)(int n, attr_t attr, NCURSES_PAIRS_T color, const void *opts) { + return chgat(n, attr, color, opts); } +#undef chgat +#define chgat UNDEF(chgat) +#endif + +#ifdef clear +inline int UNDEF(clear)() { return clear(); } +#undef clear +#define clear UNDEF(clear) +#endif + +#ifdef clearok +inline int UNDEF(clearok)(WINDOW* win, bool bf) { return clearok(win, bf); } +#undef clearok +#define clearok UNDEF(clearok) +#else +extern "C" NCURSES_IMPEXP int NCURSES_API clearok(WINDOW*, bool); +#endif + +#ifdef clrtobot +inline int UNDEF(clrtobot)() { return clrtobot(); } +#undef clrtobot +#define clrtobot UNDEF(clrtobot) +#endif + +#ifdef clrtoeol +inline int UNDEF(clrtoeol)() { return clrtoeol(); } +#undef clrtoeol +#define clrtoeol UNDEF(clrtoeol) +#endif + +#ifdef color_set +inline chtype UNDEF(color_set)(NCURSES_PAIRS_T p, void* opts) { return color_set(p, opts); } +#undef color_set +#define color_set UNDEF(color_set) +#endif + +#ifdef crmode +inline int UNDEF(crmode)(void) { return crmode(); } +#undef crmode +#define crmode UNDEF(crmode) +#endif + +#ifdef delch +inline int UNDEF(delch)() { return delch(); } +#undef delch +#define delch UNDEF(delch) +#endif + +#ifdef deleteln +inline int UNDEF(deleteln)() { return deleteln(); } +#undef deleteln +#define deleteln UNDEF(deleteln) +#endif + +#ifdef echochar +inline int UNDEF(echochar)(chtype ch) { return echochar(ch); } +#undef echochar +#define echochar UNDEF(echochar) +#endif + +#ifdef erase +inline int UNDEF(erase)() { return erase(); } +#undef erase +#define erase UNDEF(erase) +#endif + +#ifdef fixterm +inline int UNDEF(fixterm)(void) { return fixterm(); } +#undef fixterm +#define fixterm UNDEF(fixterm) +#endif + +#ifdef flushok +inline int UNDEF(flushok)(WINDOW* _win, bool _bf) { + return flushok(_win, _bf); } +#undef flushok +#define flushok UNDEF(flushok) +#else +#define _no_flushok +#endif + +#ifdef getattrs +inline int UNDEF(getattrs)(WINDOW *win) { return getattrs(win); } +#undef getattrs +#define getattrs UNDEF(getattrs) +#endif + +#ifdef getbegyx +inline void UNDEF(getbegyx)(WINDOW* win, int& y, int& x) { getbegyx(win, y, x); } +#undef getbegyx +#define getbegyx UNDEF(getbegyx) +#endif + +#ifdef getbkgd +inline chtype UNDEF(getbkgd)(const WINDOW *win) { return getbkgd(win); } +#undef getbkgd +#define getbkgd UNDEF(getbkgd) +#endif + +#ifdef getch +inline int UNDEF(getch)() { return getch(); } +#undef getch +#define getch UNDEF(getch) +#endif + +#ifdef getmaxyx +inline void UNDEF(getmaxyx)(WINDOW* win, int& y, int& x) { getmaxyx(win, y, x); } +#undef getmaxyx +#define getmaxyx UNDEF(getmaxyx) +#endif + +#ifdef getnstr +inline int UNDEF(getnstr)(char *_str, int n) { return getnstr(_str, n); } +#undef getnstr +#define getnstr UNDEF(getnstr) +#endif + +#ifdef getparyx +inline void UNDEF(getparyx)(WINDOW* win, int& y, int& x) { getparyx(win, y, x); } +#undef getparyx +#define getparyx UNDEF(getparyx) +#endif + +#ifdef getstr +inline int UNDEF(getstr)(char *_str) { return getstr(_str); } +#undef getstr +#define getstr UNDEF(getstr) +#endif + +#ifdef getyx +inline void UNDEF(getyx)(const WINDOW* win, int& y, int& x) { + getyx(win, y, x); } +#undef getyx +#define getyx UNDEF(getyx) +#endif + +#ifdef hline +inline int UNDEF(hline)(chtype ch, int n) { return hline(ch, n); } +#undef hline +#define hline UNDEF(hline) +#endif + +#ifdef inch +inline chtype UNDEF(inch)() { return inch(); } +#undef inch +#define inch UNDEF(inch) +#endif + +#ifdef inchstr +inline int UNDEF(inchstr)(chtype *str) { return inchstr(str); } +#undef inchstr +#define inchstr UNDEF(inchstr) +#endif + +#ifdef innstr +inline int UNDEF(innstr)(char *_str, int n) { return innstr(_str, n); } +#undef innstr +#define innstr UNDEF(innstr) +#endif + +#ifdef insch +inline int UNDEF(insch)(chtype c) { return insch(c); } +#undef insch +#define insch UNDEF(insch) +#endif + +#ifdef insdelln +inline int UNDEF(insdelln)(int n) { return insdelln(n); } +#undef insdelln +#define insdelln UNDEF(insdelln) +#endif + +#ifdef insertln +inline int UNDEF(insertln)() { return insertln(); } +#undef insertln +#define insertln UNDEF(insertln) +#endif + +#ifdef insnstr +inline int UNDEF(insnstr)(const char *_str, int n) { + return insnstr(_str, n); } +#undef insnstr +#define insnstr UNDEF(insnstr) +#endif + +#ifdef insstr +inline int UNDEF(insstr)(const char *_str) { + return insstr(_str); } +#undef insstr +#define insstr UNDEF(insstr) +#endif + +#ifdef instr +inline int UNDEF(instr)(char *_str) { return instr(_str); } +#undef instr +#define instr UNDEF(instr) +#endif + +#ifdef intrflush +inline void UNDEF(intrflush)(WINDOW *win, bool bf) { intrflush(); } +#undef intrflush +#define intrflush UNDEF(intrflush) +#endif + +#ifdef is_linetouched +inline int UNDEF(is_linetouched)(WINDOW *w, int l) { return is_linetouched(w,l); } +#undef is_linetouched +#define is_linetouched UNDEF(is_linetouched) +#endif + +#ifdef leaveok +inline int UNDEF(leaveok)(WINDOW* win, bool bf) { return leaveok(win, bf); } +#undef leaveok +#define leaveok UNDEF(leaveok) +#else +extern "C" NCURSES_IMPEXP int NCURSES_API leaveok(WINDOW* win, bool bf); +#endif + +#ifdef move +inline int UNDEF(move)(int x, int y) { return move(x, y); } +#undef move +#define move UNDEF(move) +#endif + +#ifdef mvaddch +inline int UNDEF(mvaddch)(int y, int x, chtype ch) +{ return mvaddch(y, x, ch); } +#undef mvaddch +#define mvaddch UNDEF(mvaddch) +#endif + +#ifdef mvaddnstr +inline int UNDEF(mvaddnstr)(int y, int x, const char *str, int n) +{ return mvaddnstr(y, x, str, n); } +#undef mvaddnstr +#define mvaddnstr UNDEF(mvaddnstr) +#endif + +#ifdef mvaddstr +inline int UNDEF(mvaddstr)(int y, int x, const char * str) +{ return mvaddstr(y, x, str); } +#undef mvaddstr +#define mvaddstr UNDEF(mvaddstr) +#endif + +#ifdef mvchgat +inline int UNDEF(mvchgat)(int y, int x, int n, + attr_t attr, NCURSES_PAIRS_T color, const void *opts) { + return mvchgat(y, x, n, attr, color, opts); } +#undef mvchgat +#define mvchgat UNDEF(mvchgat) +#endif + +#ifdef mvdelch +inline int UNDEF(mvdelch)(int y, int x) { return mvdelch(y, x);} +#undef mvdelch +#define mvdelch UNDEF(mvdelch) +#endif + +#ifdef mvgetch +inline int UNDEF(mvgetch)(int y, int x) { return mvgetch(y, x);} +#undef mvgetch +#define mvgetch UNDEF(mvgetch) +#endif + +#ifdef mvgetnstr +inline int UNDEF(mvgetnstr)(int y, int x, char *str, int n) { + return mvgetnstr(y, x, str, n);} +#undef mvgetnstr +#define mvgetnstr UNDEF(mvgetnstr) +#endif + +#ifdef mvgetstr +inline int UNDEF(mvgetstr)(int y, int x, char *str) {return mvgetstr(y, x, str);} +#undef mvgetstr +#define mvgetstr UNDEF(mvgetstr) +#endif + +#ifdef mvinch +inline chtype UNDEF(mvinch)(int y, int x) { return mvinch(y, x);} +#undef mvinch +#define mvinch UNDEF(mvinch) +#endif + +#ifdef mvinnstr +inline int UNDEF(mvinnstr)(int y, int x, char *_str, int n) { + return mvinnstr(y, x, _str, n); } +#undef mvinnstr +#define mvinnstr UNDEF(mvinnstr) +#endif + +#ifdef mvinsch +inline int UNDEF(mvinsch)(int y, int x, chtype c) +{ return mvinsch(y, x, c); } +#undef mvinsch +#define mvinsch UNDEF(mvinsch) +#endif + +#ifdef mvinsnstr +inline int UNDEF(mvinsnstr)(int y, int x, const char *_str, int n) { + return mvinsnstr(y, x, _str, n); } +#undef mvinsnstr +#define mvinsnstr UNDEF(mvinsnstr) +#endif + +#ifdef mvinsstr +inline int UNDEF(mvinsstr)(int y, int x, const char *_str) { + return mvinsstr(y, x, _str); } +#undef mvinsstr +#define mvinsstr UNDEF(mvinsstr) +#endif + +#ifdef mvwaddch +inline int UNDEF(mvwaddch)(WINDOW *win, int y, int x, const chtype ch) +{ return mvwaddch(win, y, x, ch); } +#undef mvwaddch +#define mvwaddch UNDEF(mvwaddch) +#endif + +#ifdef mvwaddchnstr +inline int UNDEF(mvwaddchnstr)(WINDOW *win, int y, int x, const chtype *str, int n) +{ return mvwaddchnstr(win, y, x, str, n); } +#undef mvwaddchnstr +#define mvwaddchnstr UNDEF(mvwaddchnstr) +#endif + +#ifdef mvwaddchstr +inline int UNDEF(mvwaddchstr)(WINDOW *win, int y, int x, const chtype *str) +{ return mvwaddchstr(win, y, x, str); } +#undef mvwaddchstr +#define mvwaddchstr UNDEF(mvwaddchstr) +#endif + +#ifdef mvwaddnstr +inline int UNDEF(mvwaddnstr)(WINDOW *win, int y, int x, const char *str, int n) +{ return mvwaddnstr(win, y, x, str, n); } +#undef mvwaddnstr +#define mvwaddnstr UNDEF(mvwaddnstr) +#endif + +#ifdef mvwaddstr +inline int UNDEF(mvwaddstr)(WINDOW *win, int y, int x, const char * str) +{ return mvwaddstr(win, y, x, str); } +#undef mvwaddstr +#define mvwaddstr UNDEF(mvwaddstr) +#endif + +#ifdef mvwchgat +inline int UNDEF(mvwchgat)(WINDOW *win, int y, int x, int n, + attr_t attr, NCURSES_PAIRS_T color, const void *opts) { + return mvwchgat(win, y, x, n, attr, color, opts); } +#undef mvwchgat +#define mvwchgat UNDEF(mvwchgat) +#endif + +#ifdef mvwdelch +inline int UNDEF(mvwdelch)(WINDOW *win, int y, int x) +{ return mvwdelch(win, y, x); } +#undef mvwdelch +#define mvwdelch UNDEF(mvwdelch) +#endif + +#ifdef mvwgetch +inline int UNDEF(mvwgetch)(WINDOW *win, int y, int x) { return mvwgetch(win, y, x);} +#undef mvwgetch +#define mvwgetch UNDEF(mvwgetch) +#endif + +#ifdef mvwgetnstr +inline int UNDEF(mvwgetnstr)(WINDOW *win, int y, int x, char *str, int n) +{return mvwgetnstr(win, y, x, str, n);} +#undef mvwgetnstr +#define mvwgetnstr UNDEF(mvwgetnstr) +#endif + +#ifdef mvwgetstr +inline int UNDEF(mvwgetstr)(WINDOW *win, int y, int x, char *str) +{return mvwgetstr(win, y, x, str);} +#undef mvwgetstr +#define mvwgetstr UNDEF(mvwgetstr) +#endif + +#ifdef mvwhline +inline int UNDEF(mvwhline)(WINDOW *win, int y, int x, chtype c, int n) { + return mvwhline(win, y, x, c, n); } +#undef mvwhline +#define mvwhline UNDEF(mvwhline) +#endif + +#ifdef mvwinch +inline chtype UNDEF(mvwinch)(WINDOW *win, int y, int x) { + return mvwinch(win, y, x);} +#undef mvwinch +#define mvwinch UNDEF(mvwinch) +#endif + +#ifdef mvwinchnstr +inline int UNDEF(mvwinchnstr)(WINDOW *win, int y, int x, chtype *str, int n) { return mvwinchnstr(win, y, x, str, n); } +#undef mvwinchnstr +#define mvwinchnstr UNDEF(mvwinchnstr) +#endif + +#ifdef mvwinchstr +inline int UNDEF(mvwinchstr)(WINDOW *win, int y, int x, chtype *str) { return mvwinchstr(win, y, x, str); } +#undef mvwinchstr +#define mvwinchstr UNDEF(mvwinchstr) +#endif + +#ifdef mvwinnstr +inline int UNDEF(mvwinnstr)(WINDOW *win, int y, int x, char *_str, int n) { + return mvwinnstr(win, y, x, _str, n); } +#undef mvwinnstr +#define mvwinnstr UNDEF(mvwinnstr) +#endif + +#ifdef mvwinsch +inline int UNDEF(mvwinsch)(WINDOW *win, int y, int x, chtype c) +{ return mvwinsch(win, y, x, c); } +#undef mvwinsch +#define mvwinsch UNDEF(mvwinsch) +#endif + +#ifdef mvwinsnstr +inline int UNDEF(mvwinsnstr)(WINDOW *w, int y, int x, const char *_str, int n) { + return mvwinsnstr(w, y, x, _str, n); } +#undef mvwinsnstr +#define mvwinsnstr UNDEF(mvwinsnstr) +#endif + +#ifdef mvwinsstr +inline int UNDEF(mvwinsstr)(WINDOW *w, int y, int x, const char *_str) { + return mvwinsstr(w, y, x, _str); } +#undef mvwinsstr +#define mvwinsstr UNDEF(mvwinsstr) +#endif + +#ifdef mvwvline +inline int UNDEF(mvwvline)(WINDOW *win, int y, int x, chtype c, int n) { + return mvwvline(win, y, x, c, n); } +#undef mvwvline +#define mvwvline UNDEF(mvwvline) +#endif + +#ifdef napms +inline void UNDEF(napms)(unsigned long x) { napms(x); } +#undef napms +#define napms UNDEF(napms) +#endif + +#ifdef nocrmode +inline int UNDEF(nocrmode)(void) { return nocrmode(); } +#undef nocrmode +#define nocrmode UNDEF(nocrmode) +#endif + +#ifdef nodelay +inline void UNDEF(nodelay)() { nodelay(); } +#undef nodelay +#define nodelay UNDEF(nodelay) +#endif + +#ifdef redrawwin +inline int UNDEF(redrawwin)(WINDOW *win) { return redrawwin(win); } +#undef redrawwin +#define redrawwin UNDEF(redrawwin) +#endif + +#ifdef refresh +inline int UNDEF(refresh)() { return refresh(); } +#undef refresh +#define refresh UNDEF(refresh) +#endif + +#ifdef resetterm +inline int UNDEF(resetterm)(void) { return resetterm(); } +#undef resetterm +#define resetterm UNDEF(resetterm) +#endif + +#ifdef saveterm +inline int UNDEF(saveterm)(void) { return saveterm(); } +#undef saveterm +#define saveterm UNDEF(saveterm) +#endif + +#ifdef scrl +inline int UNDEF(scrl)(int l) { return scrl(l); } +#undef scrl +#define scrl UNDEF(scrl) +#endif + +#ifdef scroll +inline int UNDEF(scroll)(WINDOW *win) { return scroll(win); } +#undef scroll +#define scroll UNDEF(scroll) +#endif + +#ifdef scrollok +inline int UNDEF(scrollok)(WINDOW* win, bool bf) { return scrollok(win, bf); } +#undef scrollok +#define scrollok UNDEF(scrollok) +#else +#if defined(__NCURSES_H) +extern "C" NCURSES_IMPEXP int NCURSES_API scrollok(WINDOW*, bool); +#else +extern "C" NCURSES_IMPEXP int NCURSES_API scrollok(WINDOW*, char); +#endif +#endif + +#ifdef setscrreg +inline int UNDEF(setscrreg)(int t, int b) { return setscrreg(t, b); } +#undef setscrreg +#define setscrreg UNDEF(setscrreg) +#endif + +#ifdef standend +inline int UNDEF(standend)() { return standend(); } +#undef standend +#define standend UNDEF(standend) +#endif + +#ifdef standout +inline int UNDEF(standout)() { return standout(); } +#undef standout +#define standout UNDEF(standout) +#endif + +#ifdef subpad +inline WINDOW *UNDEF(subpad)(WINDOW *p, int l, int c, int y, int x) +{ return derwin(p, l, c, y, x); } +#undef subpad +#define subpad UNDEF(subpad) +#endif + +#ifdef timeout +inline void UNDEF(timeout)(int delay) { timeout(delay); } +#undef timeout +#define timeout UNDEF(timeout) +#endif + +#ifdef touchline +inline int UNDEF(touchline)(WINDOW *win, int s, int c) +{ return touchline(win, s, c); } +#undef touchline +#define touchline UNDEF(touchline) +#endif + +#ifdef touchwin +inline int UNDEF(touchwin)(WINDOW *win) { return touchwin(win); } +#undef touchwin +#define touchwin UNDEF(touchwin) +#endif + +#ifdef untouchwin +inline int UNDEF(untouchwin)(WINDOW *win) { return untouchwin(win); } +#undef untouchwin +#define untouchwin UNDEF(untouchwin) +#endif + +#ifdef vline +inline int UNDEF(vline)(chtype ch, int n) { return vline(ch, n); } +#undef vline +#define vline UNDEF(vline) +#endif + +#ifdef waddchstr +inline int UNDEF(waddchstr)(WINDOW *win, chtype *at) { return waddchstr(win, at); } +#undef waddchstr +#define waddchstr UNDEF(waddchstr) +#endif + +#ifdef waddstr +inline int UNDEF(waddstr)(WINDOW *win, char *str) { return waddstr(win, str); } +#undef waddstr +#define waddstr UNDEF(waddstr) +#endif + +#ifdef wattroff +inline int UNDEF(wattroff)(WINDOW *win, int att) { return wattroff(win, att); } +#undef wattroff +#define wattroff UNDEF(wattroff) +#endif + +#ifdef wattrset +inline int UNDEF(wattrset)(WINDOW *win, int att) { return wattrset(win, att); } +#undef wattrset +#define wattrset UNDEF(wattrset) +#endif + +#ifdef winch +inline chtype UNDEF(winch)(const WINDOW* win) { return winch(win); } +#undef winch +#define winch UNDEF(winch) +#endif + +#ifdef winchnstr +inline int UNDEF(winchnstr)(WINDOW *win, chtype *str, int n) { return winchnstr(win, str, n); } +#undef winchnstr +#define winchnstr UNDEF(winchnstr) +#endif + +#ifdef winchstr +inline int UNDEF(winchstr)(WINDOW *win, chtype *str) { return winchstr(win, str); } +#undef winchstr +#define winchstr UNDEF(winchstr) +#endif + +#ifdef winsstr +inline int UNDEF(winsstr)(WINDOW *w, const char *_str) { + return winsstr(w, _str); } +#undef winsstr +#define winsstr UNDEF(winsstr) +#endif + +#ifdef wstandend +inline int UNDEF(wstandend)(WINDOW *win) { return wstandend(win); } +#undef wstandend +#define wstandend UNDEF(wstandend) +#endif + +#ifdef wstandout +inline int UNDEF(wstandout)(WINDOW *win) { return wstandout(win); } +#undef wstandout +#define wstandout UNDEF(wstandout) +#endif + +/* + * + * C++ class for windows. + * + */ + +extern "C" int _nc_ripoffline(int, int (*init)(WINDOW*, int)); +extern "C" int _nc_xx_ripoff_init(WINDOW *, int); +extern "C" int _nc_has_mouse(void); + +class NCURSES_CXX_IMPEXP NCursesWindow +{ + friend class NCursesMenu; + friend class NCursesForm; + +private: + static bool b_initialized; + static void initialize(); + void constructing(); + friend int _nc_xx_ripoff_init(WINDOW *, int); + + void set_keyboard(); + + NCURSES_COLOR_T getcolor(int getback) const; + NCURSES_PAIRS_T getPair() const; + + static int setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back, NCURSES_PAIRS_T pair); + static int colorInitialized; + + // This private constructor is only used during the initialization + // of windows generated by ripoffline() calls. + NCursesWindow(WINDOW* win, int ncols); + +protected: + virtual void err_handler(const char *) const THROWS(NCursesException); + // Signal an error with the given message text. + + static long count; // count of all active windows: + // We rely on the c++ promise that + // all otherwise uninitialized + // static class vars are set to 0 + + WINDOW* w; // the curses WINDOW + + bool alloced; // TRUE if we own the WINDOW + + NCursesWindow* par; // parent, if subwindow + NCursesWindow* subwins; // head of subwindows list + NCursesWindow* sib; // next subwindow of parent + + void kill_subwindows(); // disable all subwindows + // Destroy all subwindows. + + /* Only for use by derived classes. They are then in charge to + fill the member variables correctly. */ + NCursesWindow(); + +public: + explicit NCursesWindow(WINDOW* window); // useful only for stdscr + + NCursesWindow(int nlines, // number of lines + int ncols, // number of columns + int begin_y, // line origin + int begin_x); // col origin + + NCursesWindow(NCursesWindow& par,// parent window + int nlines, // number of lines + int ncols, // number of columns + int begin_y, // absolute or relative + int begin_x, // origins: + char absrel = 'a');// if `a', begin_y & begin_x are + // absolute screen pos, else if `r', they are relative to par origin + + NCursesWindow(NCursesWindow& par,// parent window + bool do_box = TRUE); + // this is the very common case that we want to create the subwindow that + // is two lines and two columns smaller and begins at (1,1). + // We may automatically request the box around it. + + NCursesWindow& operator=(const NCursesWindow& rhs) + { + if (this != &rhs) + *this = rhs; + return *this; + } + + NCursesWindow(const NCursesWindow& rhs) + : w(rhs.w), alloced(rhs.alloced), par(rhs.par), subwins(rhs.subwins), sib(rhs.sib) + { + } + + virtual ~NCursesWindow() THROWS(NCursesException); + + NCursesWindow Clone(); + // Make an exact copy of the window. + + // Initialization. + static void useColors(void); + // Call this routine very early if you want to have colors. + + static int ripoffline(int ripoff_lines, + int (*init)(NCursesWindow& win)); + // This function is used to generate a window of ripped-of lines. + // If the argument is positive, lines are removed from the top, if it + // is negative lines are removed from the bottom. This enhances the + // lowlevel ripoffline() function because it uses the internal + // implementation that allows to remove more than just a single line. + // This function must be called before any other ncurses function. The + // creation of the window is deferred until ncurses gets initialized. + // The initialization function is then called. + + // ------------------------------------------------------------------------- + // terminal status + // ------------------------------------------------------------------------- + int lines() const { initialize(); return LINES; } + // Number of lines on terminal, *not* window + + int cols() const { initialize(); return COLS; } + // Number of cols on terminal, *not* window + + int tabsize() const { initialize(); return TABSIZE; } + // Size of a tab on terminal, *not* window + + static int NumberOfColors(); + // Number of available colors + + int colors() const { return NumberOfColors(); } + // Number of available colors + + // ------------------------------------------------------------------------- + // window status + // ------------------------------------------------------------------------- + int height() const { return maxy() + 1; } + // Number of lines in this window + + int width() const { return maxx() + 1; } + // Number of columns in this window + + int begx() const { return getbegx(w); } + // Column of top left corner relative to stdscr + + int begy() const { return getbegy(w); } + // Line of top left corner relative to stdscr + + int curx() const { return getcurx(w); } + // Column of top left corner relative to stdscr + + int cury() const { return getcury(w); } + // Line of top left corner relative to stdscr + + int maxx() const { return getmaxx(w) == ERR ? ERR : getmaxx(w)-1; } + // Largest x coord in window + + int maxy() const { return getmaxy(w) == ERR ? ERR : getmaxy(w)-1; } + // Largest y coord in window + + NCURSES_PAIRS_T getcolor() const; + // Actual color pair + + NCURSES_COLOR_T foreground() const { return getcolor(0); } + // Actual foreground color + + NCURSES_COLOR_T background() const { return getcolor(1); } + // Actual background color + + int setpalette(NCURSES_COLOR_T fore, NCURSES_COLOR_T back); + // Set color palette entry + + int setcolor(NCURSES_PAIRS_T pair); + // Set actually used palette entry + + // ------------------------------------------------------------------------- + // window positioning + // ------------------------------------------------------------------------- + virtual int mvwin(int begin_y, int begin_x) { + return ::mvwin(w, begin_y, begin_x); } + // Move window to new position with the new position as top left corner. + // This is virtual because it is redefined in NCursesPanel. + + // ------------------------------------------------------------------------- + // coordinate positioning + // ------------------------------------------------------------------------- + int move(int y, int x) { return ::wmove(w, y, x); } + // Move cursor the this position + + void getyx(int& y, int& x) const { ::getyx(w, y, x); } + // Get current position of the cursor + + void getbegyx(int& y, int& x) const { ::getbegyx(w, y, x); } + // Get beginning of the window + + void getmaxyx(int& y, int& x) const { ::getmaxyx(w, y, x); } + // Get size of the window + + void getparyx(int& y, int& x) const { ::getparyx(w, y, x); } + // Get parent's beginning of the window + + int mvcur(int oldrow, int oldcol, int newrow, int newcol) const { + return ::mvcur(oldrow, oldcol, newrow, newcol); } + // Perform lowlevel cursor motion that takes effect immediately. + + // ------------------------------------------------------------------------- + // input + // ------------------------------------------------------------------------- + int getch() { return ::wgetch(w); } + // Get a keystroke from the window. + + int getch(int y, int x) { return ::mvwgetch(w, y, x); } + // Move cursor to position and get a keystroke from the window + + int getstr(char* str, int n=-1) { + return ::wgetnstr(w, str, n); } + // Read a series of characters into str until a newline or carriage return + // is received. Read at most n characters. If n is negative, the limit is + // ignored. + + int getstr(int y, int x, char* str, int n=-1) { + return ::mvwgetnstr(w, y, x, str, n); } + // Move the cursor to the requested position and then perform the getstr() + // as described above. + + int instr(char *s, int n=-1) { return ::winnstr(w, s, n); } + // Get a string of characters from the window into the buffer s. Retrieve + // at most n characters, if n is negative retrieve all characters up to the + // end of the current line. Attributes are stripped from the characters. + + int instr(int y, int x, char *s, int n=-1) { + return ::mvwinnstr(w, y, x, s, n); } + // Move the cursor to the requested position and then perform the instr() + // as described above. + + int scanw(const char* fmt, ...) + // Perform a scanw function from the window. +#if __GNUG__ >= 2 + __attribute__ ((format (scanf, 2, 3))); +#else + ; +#endif + + int scanw(const char*, va_list); + // Perform a scanw function from the window. + + int scanw(int y, int x, const char* fmt, ...) + // Move the cursor to the requested position and then perform a scanw + // from the window. +#if __GNUG__ >= 2 + __attribute__ ((format (scanf, 4, 5))); +#else + ; +#endif + + int scanw(int y, int x, const char* fmt, va_list); + // Move the cursor to the requested position and then perform a scanw + // from the window. + + // ------------------------------------------------------------------------- + // output + // ------------------------------------------------------------------------- + int addch(const chtype ch) { return ::waddch(w, ch); } + // Put attributed character to the window. + + int addch(int y, int x, const chtype ch) { + return ::mvwaddch(w, y, x, ch); } + // Move cursor to the requested position and then put attributed character + // to the window. + + int echochar(const chtype ch) { return ::wechochar(w, ch); } + // Put attributed character to the window and refresh it immediately. + + int addstr(const char* str, int n=-1) { + return ::waddnstr(w, str, n); } + // Write the string str to the window, stop writing if the terminating + // NUL or the limit n is reached. If n is negative, it is ignored. + + int addstr(int y, int x, const char * str, int n=-1) { + return ::mvwaddnstr(w, y, x, str, n); } + // Move the cursor to the requested position and then perform the addchstr + // as described above. + + int addchstr(const chtype* str, int n=-1) { + return ::waddchnstr(w, str, n); } + // Write the string str to the window, stop writing if the terminating + // NUL or the limit n is reached. If n is negative, it is ignored. + + int addchstr(int y, int x, const chtype * str, int n=-1) { + return ::mvwaddchnstr(w, y, x, str, n); } + // Move the cursor to the requested position and then perform the addchstr + // as described above. + + int printw(const char* fmt, ...) + // Do a formatted print to the window. +#if (__GNUG__ >= 2) && !defined(printf) + __attribute__ ((format (printf, 2, 3))); +#else + ; +#endif + + int printw(int y, int x, const char * fmt, ...) + // Move the cursor and then do a formatted print to the window. +#if (__GNUG__ >= 2) && !defined(printf) + __attribute__ ((format (printf, 4, 5))); +#else + ; +#endif + + int printw(const char* fmt, va_list args); + // Do a formatted print to the window. + + int printw(int y, int x, const char * fmt, va_list args); + // Move the cursor and then do a formatted print to the window. + + chtype inch() const { return ::winch(w); } + // Retrieve attributed character under the current cursor position. + + chtype inch(int y, int x) { return ::mvwinch(w, y, x); } + // Move cursor to requested position and then retrieve attributed character + // at this position. + + int inchstr(chtype* str, int n=-1) { + return ::winchnstr(w, str, n); } + // Read the string str from the window, stop reading if the terminating + // NUL or the limit n is reached. If n is negative, it is ignored. + + int inchstr(int y, int x, chtype * str, int n=-1) { + return ::mvwinchnstr(w, y, x, str, n); } + // Move the cursor to the requested position and then perform the inchstr + // as described above. + + int insch(chtype ch) { return ::winsch(w, ch); } + // Insert attributed character into the window before current cursor + // position. + + int insch(int y, int x, chtype ch) { + return ::mvwinsch(w, y, x, ch); } + // Move cursor to requested position and then insert the attributed + // character before that position. + + int insertln() { return ::winsdelln(w, 1); } + // Insert an empty line above the current line. + + int insdelln(int n=1) { return ::winsdelln(w, n); } + // If n>0 insert that many lines above the current line. If n<0 delete + // that many lines beginning with the current line. + + int insstr(const char *s, int n=-1) { + return ::winsnstr(w, s, n); } + // Insert the string into the window before the current cursor position. + // Insert stops at end of string or when the limit n is reached. If n is + // negative, it is ignored. + + int insstr(int y, int x, const char *s, int n=-1) { + return ::mvwinsnstr(w, y, x, s, n); } + // Move the cursor to the requested position and then perform the insstr() + // as described above. + + int attron (chtype at) { return ::wattron (w, at); } + // Switch on the window attributes; + + int attroff(chtype at) { return ::wattroff(w, static_cast(at)); } + // Switch off the window attributes; + + int attrset(chtype at) { return ::wattrset(w, static_cast(at)); } + // Set the window attributes; + + chtype attrget() { return ::getattrs(w); } + // Get the window attributes; + + int color_set(NCURSES_PAIRS_T color_pair_number, void* opts=NULL) { + return ::wcolor_set(w, color_pair_number, opts); } + // Set the window color attribute; + + int chgat(int n, attr_t attr, NCURSES_PAIRS_T color, const void *opts=NULL) { + return ::wchgat(w, n, attr, color, opts); } + // Change the attributes of the next n characters in the current line. If + // n is negative or greater than the number of remaining characters in the + // line, the attributes will be changed up to the end of the line. + + int chgat(int y, int x, + int n, attr_t attr, NCURSES_PAIRS_T color, const void *opts=NULL) { + return ::mvwchgat(w, y, x, n, attr, color, opts); } + // Move the cursor to the requested position and then perform chgat() as + // described above. + + // ------------------------------------------------------------------------- + // background + // ------------------------------------------------------------------------- + chtype getbkgd() const { return ::getbkgd(w); } + // Get current background setting. + + int bkgd(const chtype ch) { return ::wbkgd(w, ch); } + // Set the background property and apply it to the window. + + void bkgdset(chtype ch) { ::wbkgdset(w, ch); } + // Set the background property. + + // ------------------------------------------------------------------------- + // borders + // ------------------------------------------------------------------------- + int box(chtype vert=0, chtype hor=0) { + return ::wborder(w, vert, vert, hor, hor, 0, 0, 0, 0); } + // Draw a box around the window with the given vertical and horizontal + // drawing characters. If you specify a zero as character, curses will try + // to find a "nice" character. + + int border(chtype left=0, chtype right=0, + chtype top =0, chtype bottom=0, + chtype top_left =0, chtype top_right=0, + chtype bottom_left =0, chtype bottom_right=0) { + return ::wborder(w, left, right, top, bottom, top_left, top_right, + bottom_left, bottom_right); } + // Draw a border around the window with the given characters for the + // various parts of the border. If you pass zero for a character, curses + // will try to find "nice" characters. + + // ------------------------------------------------------------------------- + // lines and boxes + // ------------------------------------------------------------------------- + int hline(int len, chtype ch=0) { return ::whline(w, ch, len); } + // Draw a horizontal line of len characters with the given character. If + // you pass zero for the character, curses will try to find a "nice" one. + + int hline(int y, int x, int len, chtype ch=0) { + return ::mvwhline(w, y, x, ch, len); } + // Move the cursor to the requested position and then draw a horizontal line. + + int vline(int len, chtype ch=0) { return ::wvline(w, ch, len); } + // Draw a vertical line of len characters with the given character. If + // you pass zero for the character, curses will try to find a "nice" one. + + int vline(int y, int x, int len, chtype ch=0) { + return ::mvwvline(w, y, x, ch, len); } + // Move the cursor to the requested position and then draw a vertical line. + + // ------------------------------------------------------------------------- + // erasure + // ------------------------------------------------------------------------- + int erase() { return ::werase(w); } + // Erase the window. + + int clear() { return ::wclear(w); } + // Clear the window. + + int clearok(bool bf) { return ::clearok(w, bf); } + // Set/Reset the clear flag. If set, the next refresh() will clear the + // screen. + + int clrtobot() { return ::wclrtobot(w); } + // Clear to the end of the window. + + int clrtoeol() { return ::wclrtoeol(w); } + // Clear to the end of the line. + + int delch() { return ::wdelch(w); } + // Delete character under the cursor. + + int delch(int y, int x) { return ::mvwdelch(w, y, x); } + // Move cursor to requested position and delete the character under the + // cursor. + + int deleteln() { return ::winsdelln(w, -1); } + // Delete the current line. + + // ------------------------------------------------------------------------- + // screen control + // ------------------------------------------------------------------------- + int scroll(int amount=1) { return ::wscrl(w, amount); } + // Scroll amount lines. If amount is positive, scroll up, otherwise + // scroll down. + + int scrollok(bool bf) { return ::scrollok(w, bf); } + // If bf is TRUE, window scrolls if cursor is moved off the bottom + // edge of the window or a scrolling region, otherwise the cursor is left + // at the bottom line. + + int setscrreg(int from, int to) { + return ::wsetscrreg(w, from, to); } + // Define a soft scrolling region. + + int idlok(bool bf) { return ::idlok(w, bf); } + // If bf is TRUE, use insert/delete line hardware support if possible. + // Otherwise do it in software. + + void idcok(bool bf) { ::idcok(w, bf); } + // If bf is TRUE, use insert/delete character hardware support if possible. + // Otherwise do it in software. + + int touchline(int s, int c) { return ::touchline(w, s, c); } + // Mark the given lines as modified. + + int touchwin() { return ::wtouchln(w, 0, height(), 1); } + // Mark the whole window as modified. + + int untouchwin() { return ::wtouchln(w, 0, height(), 0); } + // Mark the whole window as unmodified. + + int touchln(int s, int cnt, bool changed=TRUE) { + return ::wtouchln(w, s, cnt, static_cast(changed ? 1 : 0)); } + // Mark cnt lines beginning from line s as changed or unchanged, depending + // on the value of the changed flag. + + bool is_linetouched(int line) const { + return (::is_linetouched(w, line) == TRUE ? TRUE:FALSE); } + // Return TRUE if line is marked as changed, FALSE otherwise + + bool is_wintouched() const { + return (::is_wintouched(w) ? TRUE:FALSE); } + // Return TRUE if window is marked as changed, FALSE otherwise + + int leaveok(bool bf) { return ::leaveok(w, bf); } + // If bf is TRUE, curses will leave the cursor after an update wherever + // it is after the update. + + int redrawln(int from, int n) { return ::wredrawln(w, from, n); } + // Redraw n lines starting from the requested line + + int redrawwin() { return ::wredrawln(w, 0, height()); } + // Redraw the whole window + + int doupdate() { return ::doupdate(); } + // Do all outputs to make the physical screen looking like the virtual one + + void syncdown() { ::wsyncdown(w); } + // Propagate the changes down to all descendant windows + + void syncup() { ::wsyncup(w); } + // Propagate the changes up in the hierarchy + + void cursyncup() { ::wcursyncup(w); } + // Position the cursor in all ancestor windows corresponding to our setting + + int syncok(bool bf) { return ::syncok(w, bf); } + // If called with bf=TRUE, syncup() is called whenever the window is changed + +#ifndef _no_flushok + int flushok(bool bf) { return ::flushok(w, bf); } +#endif + + void immedok(bool bf) { ::immedok(w, bf); } + // If called with bf=TRUE, any change in the window will cause an + // automatic immediate refresh() + + int intrflush(bool bf) { return ::intrflush(w, bf); } + + int keypad(bool bf) { return ::keypad(w, bf); } + // If called with bf=TRUE, the application will interpret function keys. + + int nodelay(bool bf) { return ::nodelay(w, bf); } + + int meta(bool bf) { return ::meta(w, bf); } + // If called with bf=TRUE, keys may generate 8-Bit characters. Otherwise + // 7-Bit characters are generated. + + int standout() { return ::wstandout(w); } + // Enable "standout" attributes + + int standend() { return ::wstandend(w); } + // Disable "standout" attributes + + // ------------------------------------------------------------------------- + // The next two are virtual, because we redefine them in the + // NCursesPanel class. + // ------------------------------------------------------------------------- + virtual int refresh() { return ::wrefresh(w); } + // Propagate the changes in this window to the virtual screen and call + // doupdate(). This is redefined in NCursesPanel. + + virtual int noutrefresh() { return ::wnoutrefresh(w); } + // Propagate the changes in this window to the virtual screen. This is + // redefined in NCursesPanel. + + // ------------------------------------------------------------------------- + // multiple window control + // ------------------------------------------------------------------------- + int overlay(NCursesWindow& win) { + return ::overlay(w, win.w); } + // Overlay this window over win. + + int overwrite(NCursesWindow& win) { + return ::overwrite(w, win.w); } + // Overwrite win with this window. + + int copywin(NCursesWindow& win, + int sminrow, int smincol, + int dminrow, int dmincol, + int dmaxrow, int dmaxcol, bool overlaywin=TRUE) { + return ::copywin(w, win.w, sminrow, smincol, dminrow, dmincol, + dmaxrow, dmaxcol, static_cast(overlaywin ? 1 : 0)); } + // Overlay or overwrite the rectangle in win given by dminrow,dmincol, + // dmaxrow,dmaxcol with the rectangle in this window beginning at + // sminrow,smincol. + + // ------------------------------------------------------------------------- + // Extended functions + // ------------------------------------------------------------------------- +#if defined(NCURSES_EXT_FUNCS) && (NCURSES_EXT_FUNCS != 0) + int wresize(int newLines, int newColumns) { + return ::wresize(w, newLines, newColumns); } +#endif + + // ------------------------------------------------------------------------- + // Mouse related + // ------------------------------------------------------------------------- + bool has_mouse() const; + // Return TRUE if terminal supports a mouse, FALSE otherwise + + // ------------------------------------------------------------------------- + // traversal support + // ------------------------------------------------------------------------- + NCursesWindow* child() { return subwins; } + // Get the first child window. + + NCursesWindow* sibling() { return sib; } + // Get the next child of my parent. + + NCursesWindow* parent() { return par; } + // Get my parent. + + bool isDescendant(NCursesWindow& win); + // Return TRUE if win is a descendant of this. +}; + +// ------------------------------------------------------------------------- +// We leave this here for compatibility reasons. +// ------------------------------------------------------------------------- +class NCURSES_CXX_IMPEXP NCursesColorWindow : public NCursesWindow +{ +public: + explicit NCursesColorWindow(WINDOW* &window) // useful only for stdscr + : NCursesWindow(window) { + useColors(); } + + NCursesColorWindow(int nlines, // number of lines + int ncols, // number of columns + int begin_y, // line origin + int begin_x) // col origin + : NCursesWindow(nlines, ncols, begin_y, begin_x) { + useColors(); } + + NCursesColorWindow(NCursesWindow& parentWin,// parent window + int nlines, // number of lines + int ncols, // number of columns + int begin_y, // absolute or relative + int begin_x, // origins: + char absrel = 'a') // if `a', by & bx are + : NCursesWindow(parentWin, + nlines, ncols, // absolute screen pos, + begin_y, begin_x, // else if `r', they are + absrel ) { // relative to par origin + useColors(); } +}; + +// These enum definitions really belong inside the NCursesPad class, but only +// recent compilers support that feature. + + typedef enum { + REQ_PAD_REFRESH = KEY_MAX + 1, + REQ_PAD_UP, + REQ_PAD_DOWN, + REQ_PAD_LEFT, + REQ_PAD_RIGHT, + REQ_PAD_EXIT + } Pad_Request; + + const Pad_Request PAD_LOW = REQ_PAD_REFRESH; // lowest op-code + const Pad_Request PAD_HIGH = REQ_PAD_EXIT; // highest op-code + +// ------------------------------------------------------------------------- +// Pad Support. We allow an association of a pad with a "real" window +// through which the pad may be viewed. +// ------------------------------------------------------------------------- +class NCURSES_CXX_IMPEXP NCursesPad : public NCursesWindow +{ +private: + NCursesWindow* viewWin; // the "viewport" window + NCursesWindow* viewSub; // the "viewport" subwindow + + int h_gridsize, v_gridsize; + +protected: + int min_row, min_col; // top left row/col of the pads display area + + NCursesWindow* Win(void) const { + // Get the window into which the pad should be copied (if any) + return (viewSub?viewSub:(viewWin?viewWin:0)); + } + + NCursesWindow* getWindow(void) const { + return viewWin; + } + + NCursesWindow* getSubWindow(void) const { + return viewSub; + } + + virtual int driver (int key); // Virtualize keystroke key + // The driver translates the keystroke c into an Pad_Request + + virtual void OnUnknownOperation(int pad_req) { + (void) pad_req; + ::beep(); + } + // This is called if the driver returns an unknown op-code + + virtual void OnNavigationError(int pad_req) { + (void) pad_req; + ::beep(); + } + // This is called if a navigation request couldn't be satisfied + + virtual void OnOperation(int pad_req) { + (void) pad_req; + }; + // OnOperation is called if a Pad_Operation was executed and just before + // the refresh() operation is done. + +public: + NCursesPad(int nlines, int ncols); + // create a pad with the given size + + NCursesPad& operator=(const NCursesPad& rhs) + { + if (this != &rhs) { + *this = rhs; + NCursesWindow::operator=(rhs); + } + return *this; + } + + NCursesPad(const NCursesPad& rhs) + : NCursesWindow(rhs), + viewWin(rhs.viewWin), + viewSub(rhs.viewSub), + h_gridsize(rhs.h_gridsize), + v_gridsize(rhs.v_gridsize), + min_row(rhs.min_row), + min_col(rhs.min_col) + { + } + + virtual ~NCursesPad() THROWS(NCursesException) {} + + int echochar(const chtype ch) { return ::pechochar(w, ch); } + // Put the attributed character onto the pad and immediately do a + // prefresh(). + + int refresh() NCURSES_OVERRIDE; + // If a viewport is defined the pad is displayed in this window, otherwise + // this is a noop. + + int refresh(int pminrow, int pmincol, + int sminrow, int smincol, + int smaxrow, int smaxcol) { + return ::prefresh(w, pminrow, pmincol, + sminrow, smincol, smaxrow, smaxcol); + } + // The coordinates sminrow,smincol,smaxrow,smaxcol describe a rectangle + // on the screen. refresh copies a rectangle of this size beginning + // with top left corner pminrow,pmincol onto the screen and calls doupdate(). + + int noutrefresh() NCURSES_OVERRIDE; + // If a viewport is defined the pad is displayed in this window, otherwise + // this is a noop. + + int noutrefresh(int pminrow, int pmincol, + int sminrow, int smincol, + int smaxrow, int smaxcol) { + return ::pnoutrefresh(w, pminrow, pmincol, + sminrow, smincol, smaxrow, smaxcol); + } + // Does the same as refresh() but without calling doupdate(). + + virtual void setWindow(NCursesWindow& view, int v_grid = 1, int h_grid = 1); + // Add the window "view" as viewing window to the pad. + + virtual void setSubWindow(NCursesWindow& sub); + // Use the subwindow "sub" of the viewport window for the actual viewing. + // The full viewport window is usually used to provide some decorations + // like frames, titles etc. + + virtual void operator() (void); + // Perform Pad's operation +}; + +// A FramedPad is constructed always with a viewport window. This viewport +// will be framed (by a box() command) and the interior of the box is the +// viewport subwindow. On the frame we display scrollbar sliders. +class NCURSES_CXX_IMPEXP NCursesFramedPad : public NCursesPad +{ +protected: + virtual void OnOperation(int pad_req) NCURSES_OVERRIDE; + +public: + NCursesFramedPad(NCursesWindow& win, int nlines, int ncols, + int v_grid = 1, int h_grid = 1) + : NCursesPad(nlines, ncols) { + NCursesPad::setWindow(win, v_grid, h_grid); + NCursesPad::setSubWindow(*(new NCursesWindow(win))); + } + // Construct the FramedPad with the given Window win as viewport. + + virtual ~NCursesFramedPad() THROWS(NCursesException) { + delete getSubWindow(); + } + + void setWindow(NCursesWindow& view, int v_grid = 1, int h_grid = 1) NCURSES_OVERRIDE { + (void) view; + (void) v_grid; + (void) h_grid; + err_handler("Operation not allowed"); + } + // Disable this call; the viewport is already defined + + void setSubWindow(NCursesWindow& sub) NCURSES_OVERRIDE { + (void) sub; + err_handler("Operation not allowed"); + } + // Disable this call; the viewport subwindow is already defined + +}; + +#endif /* NCURSES_CURSESW_H_incl */ diff --git a/contrib/ncurses/c++/cursslk.cc b/contrib/ncurses/c++/cursslk.cc new file mode 100644 index 00000000..5ff7dd9d --- /dev/null +++ b/contrib/ncurses/c++/cursslk.cc @@ -0,0 +1,141 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 1998-2005,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +#include "internal.h" +#include "cursesapp.h" + +MODULE_ID("$Id: cursslk.cc,v 1.23 2024/10/05 19:36:22 tom Exp $") + +Soft_Label_Key_Set::Soft_Label_Key& + Soft_Label_Key_Set::Soft_Label_Key::operator=(const char *text) +{ + delete[] label; + size_t need = 1 + ::strlen(text); + label = new char[need]; + ::_nc_STRCPY(label,text,need); + return *this; +} + +long Soft_Label_Key_Set::count = 0L; +int Soft_Label_Key_Set::num_labels = 0; + +Soft_Label_Key_Set::Label_Layout + Soft_Label_Key_Set::format = None; + +void Soft_Label_Key_Set::init() +{ + if (num_labels > 12) + num_labels = 12; + if (num_labels < 0) + num_labels = 0; + slk_array = new Soft_Label_Key[num_labels + 1]; + for(int i=0; i < num_labels; i++) { + slk_array[i].num = i+1; + } + b_attrInit = FALSE; +} + +Soft_Label_Key_Set::Soft_Label_Key_Set() + : b_attrInit(FALSE), + slk_array(NULL) +{ + if (format==None) + Error("No default SLK layout"); + init(); +} + +Soft_Label_Key_Set::Soft_Label_Key_Set(Soft_Label_Key_Set::Label_Layout fmt) + : b_attrInit(FALSE), + slk_array(NULL) +{ + if (fmt==None) + Error("Invalid SLK Layout"); + if (count++==0) { + format = fmt; + if (ERR == ::slk_init(static_cast(fmt))) + Error("slk_init"); + num_labels = (fmt>=PC_Style?12:8); + } + else if (fmt!=format) + Error("All SLKs must have same layout"); + init(); +} + +Soft_Label_Key_Set::~Soft_Label_Key_Set() THROWS(NCursesException) { + if (!::isendwin()) + clear(); + delete[] slk_array; + count--; +} + +Soft_Label_Key_Set::Soft_Label_Key& Soft_Label_Key_Set::operator[](int i) { + if (i<1 || i>num_labels) + Error("Invalid Label index"); + return slk_array[i-1]; +} + +int Soft_Label_Key_Set::labels() const { + return num_labels; +} + +void Soft_Label_Key_Set::activate_label(int i, bool bf) { + if (!b_attrInit) { + const NCursesApplication* A = NCursesApplication::getApplication(); + if (A) attrset(A->labels()); + b_attrInit = TRUE; + } + const Soft_Label_Key& K = (*this)[i]; + if (ERR==::slk_set(K.num,bf?K.label:"",K.format)) + Error("slk_set"); + noutrefresh(); +} + +void Soft_Label_Key_Set::activate_labels(bool bf) +{ + if (!b_attrInit) { + const NCursesApplication* A = NCursesApplication::getApplication(); + if (A) attrset(A->labels()); + b_attrInit = TRUE; + } + for(int i=1; i <= num_labels; i++) { + const Soft_Label_Key& K = (*this)[i]; + if (ERR==::slk_set(K.num,bf?K.label:"",K.format)) + Error("slk_set"); + } + if (bf) + restore(); + else + clear(); + noutrefresh(); +} diff --git a/contrib/ncurses/c++/cursslk.h b/contrib/ncurses/c++/cursslk.h new file mode 100644 index 00000000..7b02ed44 --- /dev/null +++ b/contrib/ncurses/c++/cursslk.h @@ -0,0 +1,240 @@ +// * this is for making emacs happy: -*-Mode: C++;-*- +// vile:cppmode +/**************************************************************************** + * Copyright 2019-2021,2024 Thomas E. Dickey * + * Copyright 1998-2003,2005 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +// $Id: cursslk.h,v 1.20 2024/10/05 22:47:12 tom Exp $ + +#ifndef NCURSES_CURSSLK_H_incl +#define NCURSES_CURSSLK_H_incl + +#include + +class NCURSES_CXX_IMPEXP Soft_Label_Key_Set { +public: + // This inner class represents the attributes of a Soft Label Key (SLK) + class NCURSES_CXX_IMPEXP Soft_Label_Key { + friend class Soft_Label_Key_Set; + public: + typedef enum { Left=0, Center=1, Right=2 } Justification; + + private: + char *label; // The Text of the Label + Justification format; // The Justification + int num; // The number of the Label + + Soft_Label_Key() : label(NULL), format(Left), num(-1) { + } + + virtual ~Soft_Label_Key() { + delete[] label; + }; + + public: + // Set the text of the Label + Soft_Label_Key& operator=(const char *text); + + // Set the Justification of the Label + Soft_Label_Key& operator=(Justification just) { + format = just; + return *this; + } + + // Retrieve the text of the label + inline char* operator()(void) const { + return label; + } + + Soft_Label_Key& operator=(const Soft_Label_Key& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + Soft_Label_Key(const Soft_Label_Key& rhs) + : label(NULL), + format(rhs.format), + num(rhs.num) + { + *this = rhs.label; + } + }; + +public: + typedef enum { + None = -1, + Three_Two_Three = 0, + Four_Four = 1, + PC_Style = 2, + PC_Style_With_Index = 3 + } Label_Layout; + +private: + static long count; // Number of Key Sets + static Label_Layout format; // Layout of the Key Sets + static int num_labels; // Number Of Labels in Key Sets + bool b_attrInit; // Are attributes initialized + + Soft_Label_Key *slk_array; // The array of SLK's + + // Init the Key Set + void init(); + + // Activate or Deactivate Label# i, Label counting starts with 1! + void activate_label(int i, bool bf=TRUE); + + // Activate of Deactivate all Labels + void activate_labels(bool bf); + +protected: + inline void Error (const char* msg) const THROWS(NCursesException) { + THROW(new NCursesException (msg)); + } + + // Remove SLK's from screen + void clear() { + if (ERR==::slk_clear()) + Error("slk_clear"); + } + + // Restore them + void restore() { + if (ERR==::slk_restore()) + Error("slk_restore"); + } + +public: + + // Construct a Key Set, use the most comfortable layout as default. + // You must create a Soft_Label_Key_Set before you create any object of + // the NCursesWindow, NCursesPanel or derived classes. (Actually before + // ::initscr() is called). + explicit Soft_Label_Key_Set(Label_Layout fmt); + + // This constructor assumes, that you already constructed a Key Set + // with a layout by the constructor above. This layout will be reused. + Soft_Label_Key_Set(); + + Soft_Label_Key_Set& operator=(const Soft_Label_Key_Set& rhs) + { + if (this != &rhs) { + *this = rhs; + init(); // allocate a new slk_array[] + } + return *this; + } + + Soft_Label_Key_Set(const Soft_Label_Key_Set& rhs) + : b_attrInit(rhs.b_attrInit), + slk_array(NULL) + { + init(); // allocate a new slk_array[] + } + + virtual ~Soft_Label_Key_Set() THROWS(NCursesException); + + // Get Label# i. Label counting starts with 1! + Soft_Label_Key& operator[](int i); + + // Retrieve number of Labels + int labels() const; + + // Refresh the SLK portion of the screen + inline void refresh() { + if (ERR==::slk_refresh()) + Error("slk_refresh"); + } + + // Mark the SLK portion of the screen for refresh, defer actual refresh + // until next update call. + inline void noutrefresh() { + if (ERR==::slk_noutrefresh()) + Error("slk_noutrefresh"); + } + + // Mark the whole SLK portion of the screen as modified + inline void touch() { + if (ERR==::slk_touch()) + Error("slk_touch"); + } + + // Activate Label# i + inline void show(int i) { + activate_label(i,FALSE); + activate_label(i,TRUE); + } + + // Hide Label# i + inline void hide(int i) { + activate_label(i,FALSE); + } + + // Show all Labels + inline void show() { + activate_labels(FALSE); + activate_labels(TRUE); + } + + // Hide all Labels + inline void hide() { + activate_labels(FALSE); + } + + inline void attron(attr_t attrs) { + if (ERR==::slk_attron(attrs)) + Error("slk_attron"); + } + + inline void attroff(attr_t attrs) { + if (ERR==::slk_attroff(attrs)) + Error("slk_attroff"); + } + + inline void attrset(attr_t attrs) { + if (ERR==::slk_attrset(attrs)) + Error("slk_attrset"); + } + + inline void color(short color_pair_number) { + if (ERR==::slk_color(color_pair_number)) + Error("slk_color"); + } + + inline attr_t attr() const { + return ::slk_attr(); + } +}; + +#endif /* NCURSES_CURSSLK_H_incl */ diff --git a/contrib/ncurses/c++/demo.cc b/contrib/ncurses/c++/demo.cc new file mode 100644 index 00000000..7d300ff3 --- /dev/null +++ b/contrib/ncurses/c++/demo.cc @@ -0,0 +1,573 @@ +// * This makes emacs happy -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2018-2021,2023 Thomas E. Dickey * + * Copyright 1998-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Silly demo program for the NCursesPanel class. + * + * written by Anatoly Ivasyuk (anatoly@nick.csh.rit.edu) + * + * Demo code for NCursesMenu and NCursesForm written by + * Juergen Pfeifer + * + * $Id: demo.cc,v 1.52 2023/08/26 19:14:14 tom Exp $ + */ + +#include "internal.h" +#include "cursesapp.h" +#include "cursesm.h" +#include "cursesf.h" + +#if (defined(_WIN32) || defined(_WIN64)) +#undef KEY_EVENT +#undef sleep +#define sleep(n) Sleep(n) +#else +extern "C" unsigned int sleep(unsigned int); +#endif + +#undef index // needed for NeXT + +// +// ------------------------------------------------------------------------- +// +class SillyDemo +{ + public: + void run(int sleeptime) { + + NCursesPanel *mystd = new NCursesPanel(); + + // Make a few small demo panels + + NCursesPanel *u = new NCursesPanel(8, 20, 12, 4); + NCursesPanel *v = new NCursesPanel(8, 20, 10, 6); + NCursesPanel *w = new NCursesPanel(8, 20, 8, 8); + NCursesPanel *x = new NCursesPanel(8, 20, 6, 10); + NCursesPanel *y = new NCursesPanel(8, 20, 4, 12); + NCursesPanel *z = new NCursesPanel(8, 30, 2, 14); + + // Draw something on the main screen, so we can see what happens + // when panels get moved or deleted. + + mystd->box(); + mystd->move(mystd->height()/2, 1); + mystd->hline(mystd->width()-2); + mystd->move(1, mystd->width()/2); + mystd->vline(mystd->height()-2); + mystd->addch(0, mystd->width()/2, ACS_TTEE); + mystd->addch(mystd->height()-1, mystd->width()/2, ACS_BTEE); + mystd->addch(mystd->height()/2, 0, ACS_LTEE); + mystd->addch(mystd->height()/2, mystd->width()-1, ACS_RTEE); + mystd->addch(mystd->height()/2, mystd->width()/2, ACS_PLUS); + + // Draw frames with titles around panels so that we can see where + // the panels are located. + u->boldframe("Win U"); + v->frame("Win V"); + w->boldframe("Win W"); + x->frame("Win X"); + y->boldframe("Win Y"); + z->frame("Win Z"); + if (NCursesApplication::getApplication()->useColors()) { + u->bkgd(' '|COLOR_PAIR(1)); + w->bkgd(' '|COLOR_PAIR(1)); + y->bkgd(' '|COLOR_PAIR(1)); + v->bkgd(' '|COLOR_PAIR(2)); + x->bkgd(' '|COLOR_PAIR(2)); + z->bkgd(' '|COLOR_PAIR(2)); + } + + // A refresh to any valid panel updates all panels and refreshes + // the screen. Using mystd is just convenient - We know it is always + // valid until the end of the program. + + mystd->refresh(); + sleep(sleeptime); + + // Show what happens when panels are deleted and moved. + + sleep(sleeptime); + delete u; + mystd->refresh(); + + sleep(sleeptime); + delete z; + mystd->refresh(); + + sleep(sleeptime); + delete v; + mystd->refresh(); + + // show how it looks when a panel moves + sleep(sleeptime); + y->mvwin(5, 30); + mystd->refresh(); + + sleep(sleeptime); + delete y; + mystd->refresh(); + + // show how it looks when you raise a panel + sleep(sleeptime); + w->top(); + mystd->refresh(); + + sleep(sleeptime); + delete w; + mystd->refresh(); + + sleep(sleeptime); + delete x; + + mystd->clear(); + mystd->refresh(); + + // Don't forget to clean up the main screen. Since this is the + // last thing using NCursesWindow, this has the effect of + // shutting down ncurses and restoring the terminal state. + + sleep(sleeptime); + delete mystd; + } +}; + +class UserData +{ +private: + int u; +public: + UserData(int x) : u(x) {} + int sleeptime() const { return u; } +}; +// +// ------------------------------------------------------------------------- +// +template class NCURSES_CXX_IMPEXP MyAction : public NCursesUserItem +{ +public: + MyAction (const char* p_name, + const T* p_UserData) + : NCursesUserItem(p_name, static_cast(0), p_UserData) + {} + + virtual ~MyAction() THROWS(NCursesException) {} + + bool action() { + SillyDemo a; + a.run(NCursesUserItem::UserData()->sleeptime()); + return FALSE; + } +}; + +class QuitItem : public NCursesMenuItem +{ +public: + QuitItem() : NCursesMenuItem("Quit") { + } + + bool action() { + return TRUE; + } +}; +// +// ------------------------------------------------------------------------- +// +class Label : public NCursesFormField +{ +public: + Label(const char* title, + int row, int col) + : NCursesFormField(1, static_cast(::strlen(title)), row, col) { + set_value(title); + options_off(O_EDIT|O_ACTIVE); + } +}; +// +// ------------------------------------------------------------------------- +// +class MyFieldType : public UserDefinedFieldType +{ +private: + int chk; +protected: + bool field_check(NCursesFormField& f) { + (void) f; + return TRUE; + } + bool char_check(int c) { + return (c==chk?TRUE:FALSE); + } +public: + MyFieldType(int x) : chk(x) { + } +}; +// +// ------------------------------------------------------------------------- +// +class TestForm : public NCursesForm +{ +private: + NCursesFormField** F; + MyFieldType* mft; + Integer_Field *ift; + Enumeration_Field *eft; + + static const char *weekdays[]; + +public: + TestForm() + : NCursesForm(13, 51, (lines() - 15)/2, (cols() - 53)/2), + F(0), + mft(0), + ift(0), + eft(0) + { + + F = new NCursesFormField*[10]; + mft = new MyFieldType('X'); + ift = new Integer_Field(0, 1, 10); + eft = new Enumeration_Field(weekdays); + + F[0] = new Label("Demo Entry Form", 0, 16); + F[1] = new Label("Weekday Enum", 2, 1); + F[2] = new Label("Number(1-10)", 2, 21); + F[3] = new Label("Only 'X'", 2, 35); + F[4] = new Label("Multiline Field (Dynamic and Scrollable)", 5, 1); + F[5] = new NCursesFormField(1, 18, 3, 1); + F[6] = new NCursesFormField(1, 12, 3, 21); + F[7] = new NCursesFormField(1, 12, 3, 35); + F[8] = new NCursesFormField(4, 46, 6, 1, 2); + F[9] = new NCursesFormField(); + + InitForm(F, TRUE, TRUE); + boldframe(); + + F[5]->set_fieldtype(*eft); + F[6]->set_fieldtype(*ift); + + F[7]->set_fieldtype(*mft); + F[7]->set_maximum_growth(20); // max. 20 characters + F[7]->options_off(O_STATIC); // make field dynamic + + F[8]->set_maximum_growth(10); // max. 10 lines + F[8]->options_off(O_STATIC); // make field dynamic + } + + TestForm& operator=(const TestForm& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + TestForm(const TestForm& rhs) + : NCursesForm(rhs), F(0), mft(0), ift(0), eft(0) + { + } + + ~TestForm() THROWS(NCursesException) { + delete mft; + delete ift; + delete eft; + } +}; + +const char* TestForm::weekdays[] = { + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", + "Friday", "Saturday", NULL }; +// +// ------------------------------------------------------------------------- +// +class FormAction : public NCursesMenuItem +{ +public: + FormAction(const char *s) : NCursesMenuItem(s) { + } + + bool action() { + TestForm F; + Soft_Label_Key_Set* S = new Soft_Label_Key_Set; + for(int i=1; i <= S->labels(); i++) { + char buf[8]; + assert(i < 100); + ::_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "Frm%02d", i % 100); + (*S)[i] = buf; // Text + (*S)[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification + } + NCursesApplication::getApplication()->push(*S); + F(); + NCursesApplication::getApplication()->pop(); + delete S; + return FALSE; + } +}; +// +// ------------------------------------------------------------------------- +// +class PadAction : public NCursesMenuItem +{ +public: + PadAction(const char* s) : NCursesMenuItem(s) { + } + + bool action() { + const int GRIDSIZE = 3; + const int PADSIZE = 200; + unsigned gridcount = 0; + + NCursesPanel mystd; + NCursesPanel P(mystd.lines()-2, mystd.cols()-2, 1, 1); + NCursesFramedPad FP(P, PADSIZE, PADSIZE); + + for (int i=0; i < PADSIZE; i++) { + for (int j=0; j < PADSIZE; j++) { + if (i % GRIDSIZE == 0 && j % GRIDSIZE == 0) { + if (i==0 || j==0) + FP.addch('+'); + else + FP.addch(static_cast('A' + (gridcount++ % 26))); + } + else if (i % GRIDSIZE == 0) + FP.addch('-'); + else if (j % GRIDSIZE == 0) + FP.addch('|'); + else + FP.addch(' '); + } + } + + P.label("Pad Demo", NULL); + FP(); + P.clear(); + return FALSE; + } +}; + +// +// ------------------------------------------------------------------------- +// +class PassiveItem : public NCursesMenuItem +{ +public: + PassiveItem(const char* text) : NCursesMenuItem(text) { + options_off(O_SELECTABLE); + } +}; + +// +// ------------------------------------------------------------------------- +// +class ScanAction : public NCursesMenuItem +{ +public: + ScanAction(const char* s) : NCursesMenuItem(s) { + } + + bool action() { + NCursesPanel *mystd = new NCursesPanel(); + + NCursesPanel *w = new NCursesPanel(mystd->lines() - 2, mystd->cols() - 2, 1, 1); + w->box(); + w->refresh(); + + NCursesPanel *s = new NCursesPanel(w->lines() - 6, w->cols() - 6, 3, 3); + s->scrollok(TRUE); + ::echo(); + + s->printw("Enter decimal integers. The running total will be shown\n"); + int nvalue = -1; + int result = 0; + while (nvalue != 0) { + nvalue = 0; + s->scanw("%d", &nvalue); + if (nvalue != 0) { + s->printw("%d: ", result += nvalue); + } + s->refresh(); + } + s->printw("\nPress any key to continue..."); + s->getch(); + + delete s; + delete w; + delete mystd; + ::noecho(); + return FALSE; + } +}; + +// +// ------------------------------------------------------------------------- +// +class MyMenu : public NCursesMenu +{ +private: + NCursesPanel* P; + NCursesMenuItem** I; + UserData *u; + #define n_items 7 + +public: + MyMenu () + : NCursesMenu (n_items+2, 8, (lines()-10)/2, (cols()-10)/2), + P(0), I(0), u(0) + { + u = new UserData(1); + I = new NCursesMenuItem*[1+n_items]; + I[0] = new PassiveItem("One"); + I[1] = new PassiveItem("Two"); + I[2] = new MyAction ("Silly", u); + I[3] = new FormAction("Form"); + I[4] = new PadAction("Pad"); + I[5] = new ScanAction("Scan"); + I[6] = new QuitItem(); + I[7] = new NCursesMenuItem(); // Terminating empty item + + InitMenu(I, TRUE, TRUE); + + P = new NCursesPanel(1, n_items, LINES-1, 1); + boldframe("Demo", "Silly"); + P->show(); + } + + MyMenu& operator=(const MyMenu& rhs) + { + if (this != &rhs) { + *this = rhs; + } + return *this; + } + + MyMenu(const MyMenu& rhs) + : NCursesMenu(rhs), P(0), I(0), u(0) + { + } + + ~MyMenu() THROWS(NCursesException) + { + P->hide(); + delete P; + delete u; + } + + virtual void On_Menu_Init() + { + NCursesWindow W(::stdscr); + P->move(0, 0); + P->clrtoeol(); + for(int i=1; i<=count(); i++) + P->addch('0' + i); + P->bkgd(W.getbkgd()); + refresh(); + } + + virtual void On_Menu_Termination() + { + P->move(0, 0); + P->clrtoeol(); + refresh(); + } + + virtual void On_Item_Init(NCursesMenuItem& item) + { + P->move(0, item.index()); + P->attron(A_REVERSE); + P->printw("%1d", 1+item.index()); + P->attroff(A_REVERSE); + refresh(); + } + + virtual void On_Item_Termination(NCursesMenuItem& item) + { + P->move(0, item.index()); + P->attroff(A_REVERSE); + P->printw("%1d", 1+item.index()); + refresh(); + } +}; +// +// ------------------------------------------------------------------------- +// +class TestApplication : public NCursesApplication +{ +protected: + int titlesize() const { return 1; } + void title(); + Soft_Label_Key_Set::Label_Layout useSLKs() const { + return Soft_Label_Key_Set::PC_Style_With_Index; + } + void init_labels(Soft_Label_Key_Set& S) const; + +public: + TestApplication() : NCursesApplication(TRUE) { + } + + int run(); +}; + +void TestApplication::init_labels(Soft_Label_Key_Set& S) const +{ + for(int i=1; i <= S.labels(); i++) { + char buf[8]; + assert(i < 100); + ::_nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "Key%02d", i % 100); + S[i] = buf; // Text + S[i] = Soft_Label_Key_Set::Soft_Label_Key::Left; // Justification + } +} + +void TestApplication::title() +{ + const char * const titleText = "Simple C++ Binding Demo"; + const int len = ::strlen(titleText); + + getTitleWindow()->bkgd(screen_titles()); + getTitleWindow()->addstr(0, (getTitleWindow()->cols() - len)/2, titleText); + getTitleWindow()->noutrefresh(); +} + + +int TestApplication::run() +{ + MyMenu M; + M(); + return 0; +} + +// +// ------------------------------------------------------------------------- +// +static TestApplication *Demo = new TestApplication(); + +#if (defined(_WIN32) || defined(_WIN64)) +// This is actually only needed when ncurses is a dll +NCURSES_CXX_MAIN +#endif diff --git a/contrib/ncurses/c++/edit_cfg.sh b/contrib/ncurses/c++/edit_cfg.sh new file mode 100755 index 00000000..928f7fdf --- /dev/null +++ b/contrib/ncurses/c++/edit_cfg.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# $Id: edit_cfg.sh,v 1.19 2022/07/16 18:00:59 tom Exp $ +############################################################################## +# Copyright 2020,2022 Thomas E. Dickey # +# Copyright 1998-2007,2008 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1997-on +# +# Edit the default value of the etip.h file based on the autoconf-generated +# values: +# +# $1 = ncurses_cfg.h +# $2 = etip.h +# +echo "substituting autoconf'd values from $1 into $2" +for name in \ + CPP_HAS_PARAM_INIT \ + CPP_HAS_STATIC_CAST \ + ETIP_NEEDS_MATH_EXCEPTION \ + ETIP_NEEDS_MATH_H \ + HAVE_BUILTIN_H \ + HAVE_GPP_BUILTIN_H \ + HAVE_GXX_BUILTIN_H \ + HAVE_IOSTREAM \ + HAVE_TYPEINFO \ + HAVE_VALUES_H \ + IOSTREAM_NAMESPACE +do + rm -f "$2".bak + mv "$2" "$2".bak + if ( grep "[ ]${name}[ ]1" "$1" >/dev/null 2>&1) + then + value=1 + sed -e 's/define '"$name"'.*$/define '"$name"' 1/' "$2".bak >"$2" + else + value=0 + sed -e 's/define '"$name"'.*$/define '"$name"' 0/' "$2".bak >"$2" + fi + if (cmp -s "$2" "$2".bak) + then + echo '... '$name $value + mv "$2".bak "$2" + else + echo '... '$name $value + rm -f "$2".bak + fi +done diff --git a/contrib/ncurses/c++/etip.h.in b/contrib/ncurses/c++/etip.h.in new file mode 100644 index 00000000..70842ef6 --- /dev/null +++ b/contrib/ncurses/c++/etip.h.in @@ -0,0 +1,406 @@ +// * This makes emacs happy -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2018-2021,2022 Thomas E. Dickey * + * Copyright 1998-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +// $Id: etip.h.in,v 1.50 2022/08/20 20:50:00 tom Exp $ + +#ifndef NCURSES_ETIP_H_incl +#define NCURSES_ETIP_H_incl 1 + +// These are substituted at configure/build time +#ifndef HAVE_BUILTIN_H +#define HAVE_BUILTIN_H 0 +#endif + +#ifndef HAVE_GXX_BUILTIN_H +#define HAVE_GXX_BUILTIN_H 0 +#endif + +#ifndef HAVE_GPP_BUILTIN_H +#define HAVE_GPP_BUILTIN_H 0 +#endif + +#ifndef HAVE_IOSTREAM +#define HAVE_IOSTREAM 0 +#endif + +#ifndef HAVE_TYPEINFO +#define HAVE_TYPEINFO 0 +#endif + +#ifndef HAVE_VALUES_H +#define HAVE_VALUES_H 0 +#endif + +#ifndef ETIP_NEEDS_MATH_H +#define ETIP_NEEDS_MATH_H 0 +#endif + +#ifndef ETIP_NEEDS_MATH_EXCEPTION +#define ETIP_NEEDS_MATH_EXCEPTION 0 +#endif + +#ifndef CPP_HAS_OVERRIDE +#define CPP_HAS_OVERRIDE 0 +#endif + +#ifndef CPP_HAS_PARAM_INIT +#define CPP_HAS_PARAM_INIT 0 +#endif + +#ifndef CPP_HAS_STATIC_CAST +#define CPP_HAS_STATIC_CAST 0 // workaround for g++ 2.95.3 +#endif + +#ifndef IOSTREAM_NAMESPACE +#define IOSTREAM_NAMESPACE 0 +#endif + +#ifdef __GNUG__ +# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8)) +# if HAVE_TYPEINFO +# include +# endif +# endif +#endif + +#if defined(__GNUG__) +# if HAVE_BUILTIN_H || HAVE_GXX_BUILTIN_H || HAVE_GPP_BUILTIN_H +# if ETIP_NEEDS_MATH_H +# if ETIP_NEEDS_MATH_EXCEPTION +# undef exception +# define exception math_exception +# endif +# include +# endif +# undef exception +# define exception builtin_exception +# if HAVE_GPP_BUILTIN_H +# include +# elif HAVE_GXX_BUILTIN_H +# include +# else +# include +# endif +# undef exception +# endif +#elif defined (__SUNPRO_CC) +# include +#endif + +#include + +extern "C" { +#if HAVE_VALUES_H +# include +#endif + +#include +#include +#include +} + +// Language features +#if CPP_HAS_OVERRIDE +#define NCURSES_OVERRIDE override +#else +#define NCURSES_OVERRIDE /*nothing*/ +#endif + +#if CPP_HAS_PARAM_INIT +#define NCURSES_PARAM_INIT(value) = value +#else +#define NCURSES_PARAM_INIT(value) /*nothing*/ +#endif + +#if CPP_HAS_STATIC_CAST +#define STATIC_CAST(s) static_cast +#else +#define STATIC_CAST(s) (s) +#endif + +#ifndef NCURSES_CXX_IMPEXP +#define NCURSES_CXX_IMPEXP /* nothing */ +#endif + +// Forward Declarations +class NCURSES_CXX_IMPEXP NCursesPanel; +class NCURSES_CXX_IMPEXP NCursesMenu; +class NCURSES_CXX_IMPEXP NCursesForm; + +class NCURSES_CXX_IMPEXP NCursesException +{ +public: + const char *message; + int errorno; + + NCursesException (const char* msg, int err) + : message(msg), errorno (err) + {}; + + explicit NCursesException (const char* msg) + : message(msg), errorno (E_SYSTEM_ERROR) + {}; + + NCursesException& operator=(const NCursesException& rhs) + { + message = rhs.message; + errorno = rhs.errorno; + return *this; + } + + NCursesException(const NCursesException& rhs) + : message(rhs.message), errorno(rhs.errorno) + { + } + + virtual const char *classname() const { + return "NCursesWindow"; + } + + virtual ~NCursesException() + { + } +}; + +class NCURSES_CXX_IMPEXP NCursesPanelException : public NCursesException +{ +public: + const NCursesPanel* p; + + NCursesPanelException (const char *msg, int err) : + NCursesException (msg, err), + p (0) + {}; + + NCursesPanelException (const NCursesPanel* panel, + const char *msg, + int err) : + NCursesException (msg, err), + p (panel) + {}; + + explicit NCursesPanelException (int err) : + NCursesException ("panel library error", err), + p (0) + {}; + + NCursesPanelException (const NCursesPanel* panel, + int err) : + NCursesException ("panel library error", err), + p (panel) + {}; + + NCursesPanelException& operator=(const NCursesPanelException& rhs) + { + if (this != &rhs) { + NCursesException::operator=(rhs); + p = rhs.p; + } + return *this; + } + + NCursesPanelException(const NCursesPanelException& rhs) + : NCursesException(rhs), p(rhs.p) + { + } + + virtual const char *classname() const NCURSES_OVERRIDE { + return "NCursesPanel"; + } + + virtual ~NCursesPanelException() + { + } +}; + +class NCURSES_CXX_IMPEXP NCursesMenuException : public NCursesException +{ +public: + const NCursesMenu* m; + + NCursesMenuException (const char *msg, int err) : + NCursesException (msg, err), + m (0) + {}; + + NCursesMenuException (const NCursesMenu* menu, + const char *msg, + int err) : + NCursesException (msg, err), + m (menu) + {}; + + explicit NCursesMenuException (int err) : + NCursesException ("menu library error", err), + m (0) + {}; + + NCursesMenuException (const NCursesMenu* menu, + int err) : + NCursesException ("menu library error", err), + m (menu) + {}; + + NCursesMenuException& operator=(const NCursesMenuException& rhs) + { + if (this != &rhs) { + NCursesException::operator=(rhs); + m = rhs.m; + } + return *this; + } + + NCursesMenuException(const NCursesMenuException& rhs) + : NCursesException(rhs), m(rhs.m) + { + } + + virtual const char *classname() const NCURSES_OVERRIDE { + return "NCursesMenu"; + } + + virtual ~NCursesMenuException() + { + } +}; + +class NCURSES_CXX_IMPEXP NCursesFormException : public NCursesException +{ +public: + const NCursesForm* f; + + NCursesFormException (const char *msg, int err) : + NCursesException (msg, err), + f (0) + {}; + + NCursesFormException (const NCursesForm* form, + const char *msg, + int err) : + NCursesException (msg, err), + f (form) + {}; + + explicit NCursesFormException (int err) : + NCursesException ("form library error", err), + f (0) + {}; + + NCursesFormException (const NCursesForm* form, + int err) : + NCursesException ("form library error", err), + f (form) + {}; + + NCursesFormException& operator=(const NCursesFormException& rhs) + { + if (this != &rhs) { + NCursesException::operator=(rhs); + f = rhs.f; + } + return *this; + } + + NCursesFormException(const NCursesFormException& rhs) + : NCursesException(rhs), f(rhs.f) + { + } + + virtual const char *classname() const NCURSES_OVERRIDE { + return "NCursesForm"; + } + + virtual ~NCursesFormException() + { + } +}; + +#if !((defined(__GNUG__) && defined(__EXCEPTIONS) && (__GNUG__ < 7)) || defined(__SUNPRO_CC)) +# if HAVE_IOSTREAM +# include +# if IOSTREAM_NAMESPACE +using std::cerr; +using std::endl; +# endif +# else +# include +# endif +#endif + +inline void THROW(const NCursesException *e) { +#if defined(__GNUG__) && defined(__EXCEPTIONS) +# if ((__GNUG__ <= 2) && (__GNUC_MINOR__ < 8)) + (*lib_error_handler)(e ? e->classname() : "", e ? e->message : ""); +# elif (__GNUG__ >= 7) + // g++ 7.0 warns about deprecation, but lacks the predefined symbols + ::endwin(); + std::cerr << "Found a problem - goodbye" << std::endl; + exit(EXIT_FAILURE); +# else +# define CPP_HAS_TRY_CATCH 1 +# endif +#elif defined(__SUNPRO_CC) +# if !defined(__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT < 5) + genericerror(1, ((e != 0) ? (char *)(e->message) : "")); +# else +# define CPP_HAS_TRY_CATCH 1 +# endif +#else + if (e) + cerr << e->message << endl; + exit(0); +#endif + +#ifndef CPP_HAS_TRY_CATCH +#define CPP_HAS_TRY_CATCH 0 +#define NCURSES_CPP_TRY /* nothing */ +#define NCURSES_CPP_CATCH(e) if (false) +#define THROWS(s) /* nothing */ +#define THROW2(s,t) /* nothing */ +#elif CPP_HAS_TRY_CATCH + throw *e; +#define NCURSES_CPP_TRY try +#define NCURSES_CPP_CATCH(e) catch(e) +#if defined(__cpp_noexcept_function_type) && (__cpp_noexcept_function_type >= 201510) +// C++17 deprecates the usage of throw(). +#define THROWS(s) /* nothing */ +#define THROW2(s,t) /* nothing */ +#else +#define THROWS(s) throw(s) +#define THROW2(s,t) throw(s,t) +#endif +#endif +} + +#endif /* NCURSES_ETIP_H_incl */ diff --git a/contrib/ncurses/c++/headers b/contrib/ncurses/c++/headers new file mode 100644 index 00000000..9a6a7f53 --- /dev/null +++ b/contrib/ncurses/c++/headers @@ -0,0 +1,41 @@ +# C++ headers +# $Id: headers,v 1.4 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1997 +# +$(srcdir)/cursesapp.h +$(srcdir)/cursesf.h +$(srcdir)/cursesm.h +$(srcdir)/cursesp.h +$(srcdir)/cursesw.h +$(srcdir)/cursslk.h +etip.h +# vile:makemode diff --git a/contrib/ncurses/c++/internal.h b/contrib/ncurses/c++/internal.h new file mode 100644 index 00000000..f67aaec3 --- /dev/null +++ b/contrib/ncurses/c++/internal.h @@ -0,0 +1,72 @@ +// * This makes emacs happy -*-Mode: C++;-*- +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2008,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + ****************************************************************************/ + +// $Id: internal.h,v 1.22 2020/08/29 23:06:41 tom Exp $ + +#ifndef NCURSES_CPLUS_INTERNAL_H +#define NCURSES_CPLUS_INTERNAL_H 1 + +#include + +#if USE_RCS_IDS +#define MODULE_ID(id) static const char Ident[] = id; +#else +#define MODULE_ID(id) /*nothing */ +#endif + +#if (defined(_WIN32) || defined(_WIN64)) +#if defined(EXP_WIN32_DRIVER) +#include +#else +#include +#endif +#undef KEY_EVENT +#endif + +#ifndef _QNX_SOURCE +#include +#include +#endif + +#ifndef CTRL +#define CTRL(x) ((x) & 0x1f) +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#include + +#endif /* NCURSES_CPLUS_INTERNAL_H */ diff --git a/contrib/ncurses/c++/modules b/contrib/ncurses/c++/modules new file mode 100644 index 00000000..0cd80573 --- /dev/null +++ b/contrib/ncurses/c++/modules @@ -0,0 +1,45 @@ +# Program modules +# $Id: modules,v 1.13 2024/06/15 21:07:41 tom Exp $ +############################################################################## +# Copyright 2020,2024 Thomas E. Dickey # +# Copyright 1998-2006,2013 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1995-on +# + +@ base +cursesf c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesf_h) $(cursesapp_h) +cursesm c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesm_h) $(cursesapp_h) +cursesw c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesw_h) +cursespad c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesw_h) +cursesp c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesp_h) +cursslk c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesapp_h) +cursesapp c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesapp_h) +cursesmain c++ $(srcdir) $(HEADER_DEPS) $(internal_h) $(cursesapp_h) $(INCDIR)/nc_alloc.h + +# vile:makemode diff --git a/contrib/ncurses/config.guess b/contrib/ncurses/config.guess new file mode 100755 index 00000000..48a68460 --- /dev/null +++ b/contrib/ncurses/config.guess @@ -0,0 +1,1815 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2024 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2024-07-27' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system '$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2024 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try '$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# Just in case it came from the environment. +GUESS= + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still +# use 'HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c17 c99 c89 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case $UNAME_SYSTEM in +Linux|GNU|GNU/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #elif defined(__LLVM_LIBC__) + LIBC=llvm + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=$UNAME_MACHINE_ARCH-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case $UNAME_VERSION in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; + *:ekkoBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; + *:SolidBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; + macppc:MirBSD:*:*) + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; + *:MirBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; + alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case $ALPHA_CPU_TYPE in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; + Amiga*:UNIX_System_V:4.0:*) + GUESS=m68k-unknown-sysv4 + ;; + *:[Aa]miga[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; + *:[Mm]orph[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-morphos + ;; + *:OS/390:*:*) + GUESS=i370-ibm-openedition + ;; + *:z/VM:*:*) + GUESS=s390-ibm-zvmoe + ;; + *:OS400:*:*) + GUESS=powerpc-ibm-os400 + ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + GUESS=hppa1.1-hitachi-hiuxmpp + ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; + NILE*:*:*:dcosx) + GUESS=pyramid-pyramid-svr4 + ;; + DRS?6000:unix:4.0:6*) + GUESS=sparc-icl-nx6 + ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; + s390x:SunOS:*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; + sun4H:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; + sun4*:SunOS:*:*) + case `/usr/bin/arch -k` in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like '4.1.3-JL'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; + sun3*:SunOS:*:*) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in + sun3) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) + GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac + ;; + aushp:SunOS:*:*) + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; + m68k:machten:*:*) + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; + powerpc:machten:*:*) + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; + RISC*:Mach:*:*) + GUESS=mips-dec-mach_bsd4.3 + ;; + RISC*:ULTRIX:*:*) + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; + VAX*:ULTRIX*:*:*) + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; + Motorola:PowerMAX_OS:*:*) + GUESS=powerpc-motorola-powermax + ;; + Motorola:*:4.3:PL8-*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:Power_UNIX:*:*) + GUESS=powerpc-harris-powerunix + ;; + m88k:CX/UX:7*:*) + GUESS=m88k-harris-cxux7 + ;; + m88k:*:4*:R4*) + GUESS=m88k-motorola-sysv4 + ;; + m88k:*:3*:R3*) + GUESS=m88k-motorola-sysv3 + ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + GUESS=m88k-dg-dgux$UNAME_RELEASE + else + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else + GUESS=i586-dg-dgux$UNAME_RELEASE + fi + ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + GUESS=m88k-dolphin-sysv3 + ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + GUESS=m88k-motorola-sysv3 + ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + GUESS=m88k-tektronix-sysv3 + ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + GUESS=m68k-tektronix-bsd + ;; + *:IRIX*:*:*) + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + GUESS=i386-ibm-aix + ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + int + main () + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + GUESS=$SYSTEM_NAME + else + GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + GUESS=rs6000-ibm-aix3.2.4 + else + GUESS=rs6000-ibm-aix3.2 + fi + ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; + *:AIX:*:*) + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + GUESS=rs6000-bull-bosx + ;; + DPX/2?00:B.O.S.:*:*) + GUESS=m68k-bull-sysv3 + ;; + 9000/[34]??:4.3bsd:1.*:*) + GUESS=m68k-hp-bsd + ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + GUESS=m68k-hp-bsd4.4 + ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + case $UNAME_MACHINE in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case $sc_cpu_version in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case $sc_kernel_bits in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int + main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; + 9000/8??:4.3bsd:*:*) + GUESS=hppa1.0-hp-bsd + ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; + hp8??:OSF1:*:*) + GUESS=hppa1.0-hp-osf + ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk + else + GUESS=$UNAME_MACHINE-unknown-osf1 + fi + ;; + parisc*:Lites*:*:*) + GUESS=hppa1.1-hp-lites + ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + GUESS=c1-convex-bsd + ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + GUESS=c34-convex-bsd + ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + GUESS=c38-convex-bsd + ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + GUESS=c4-convex-bsd + ;; + CRAY*Y-MP:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; + CRAY*T3E:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; + CRAY*SV1:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; + *:UNICOS/mp:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; + sparc*:BSD/OS:*:*) + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; + *:BSD/OS:*:*) + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; + i*:CYGWIN*:*) + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; + *:MINGW*:*) + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; + *:Interix*:*) + case $UNAME_MACHINE in + x86) + GUESS=i586-pc-interix$UNAME_RELEASE + ;; + authenticamd | genuineintel | EM64T) + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; + IA64) + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; + esac ;; + i*:UWIN*:*) + GUESS=$UNAME_MACHINE-pc-uwin + ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + GUESS=x86_64-pc-cygwin + ;; + prep*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; + *:GNU:*:*) + # the GNU system + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-pc-managarm-mlibc" + ;; + *:[Mm]anagarm:*:*) + GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __ARM_EABI__ + #ifdef __ARM_PCS_VFP + ABI=eabihf + #else + ABI=eabi + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; + esac + fi + GUESS=$CPU-unknown-linux-$LIBCABI + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi + ;; + avr32*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + cris:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + crisv32:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + frv:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:Linux:*:*) + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; + ia64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:cos:*:*) + GUESS=$UNAME_MACHINE-unknown-cos + ;; + kvx:mbr:*:*) + GUESS=$UNAME_MACHINE-unknown-mbr + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m32r*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m68*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + padre:Linux:*:*) + GUESS=sparc-unknown-linux-$LIBC + ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + GUESS=hppa64-unknown-linux-$LIBC + ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; + esac + ;; + ppc64:Linux:*:*) + GUESS=powerpc64-unknown-linux-$LIBC + ;; + ppc:Linux:*:*) + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + s390:Linux:*:* | s390x:Linux:*:*) + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; + sh64*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sh*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + vax:Linux:*:*) + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; + x86_64:Linux:*:*) + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; + xtensa*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + GUESS=i386-sequent-sysv4 + ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; + i*86:OS/2:*:*) + # If we were able to find 'uname', then EMX Unix compatibility + # is probably installed. + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; + i*86:XTS-300:*:STOP) + GUESS=$UNAME_MACHINE-unknown-stop + ;; + i*86:atheos:*:*) + GUESS=$UNAME_MACHINE-unknown-atheos + ;; + i*86:syllable:*:*) + GUESS=$UNAME_MACHINE-pc-syllable + ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; + i*86:*DOS:*:*) + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi + ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv32 + fi + ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + GUESS=i586-pc-msdosdjgpp + ;; + Intel:Mach:3*:*) + GUESS=i386-pc-mach3 + ;; + paragon:*:*:*) + GUESS=i860-intel-osf1 + ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi + ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + GUESS=m68010-convergent-sysv + ;; + mc68k:UNIX:SYSTEM5:3.51m) + GUESS=m68k-convergent-sysv + ;; + M680?0:D-NIX:5.3:*) + GUESS=m68k-diab-dnix + ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; + mc68030:UNIX_System_V:4.*:*) + GUESS=m68k-atari-sysv4 + ;; + TSUNAMI:LynxOS:2.*:*) + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; + rs6000:LynxOS:2.*:*) + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; + SM[BE]S:UNIX_SV:*:*) + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; + RM*:ReliantUNIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + RM*:SINIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 + else + GUESS=ns32k-sni-sysv + fi + ;; + PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + GUESS=hppa1.1-stratus-sysv4 + ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + GUESS=i860-stratus-sysv4 + ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=$UNAME_MACHINE-stratus-vos + ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=hppa1.1-stratus-vos + ;; + mc68*:A/UX:*:*) + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; + news*:NEWS-OS:6*:*) + GUESS=mips-sony-newsos6 + ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE + else + GUESS=mips-unknown-sysv$UNAME_RELEASE + fi + ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + GUESS=powerpc-be-beos + ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + GUESS=powerpc-apple-beos + ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + GUESS=i586-pc-beos + ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; + SX-4:SUPER-UX:*:*) + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; + SX-5:SUPER-UX:*:*) + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; + SX-6:SUPER-UX:*:*) + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; + SX-7:SUPER-UX:*:*) + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; + SX-8:SUPER-UX:*:*) + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; + SX-8R:SUPER-UX:*:*) + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; + Power*:Rhapsody:*:*) + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; + *:Rhapsody:*:*) + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; + *:QNX:*:4*) + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; + *:NonStop-UX:*:*) + GUESS=mips-compaq-nonstopux + ;; + BS2000:POSIX*:*:*) + GUESS=bs2000-siemens-sysv + ;; + DS/*:UNIX_System_V:*:*) + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "${cputype-}" = 386; then + UNAME_MACHINE=i386 + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype + fi + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; + *:TOPS-10:*:*) + GUESS=pdp10-unknown-tops10 + ;; + *:TENEX:*:*) + GUESS=pdp10-unknown-tenex + ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + GUESS=pdp10-dec-tops20 + ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + GUESS=pdp10-xkl-tops20 + ;; + *:TOPS-20:*:*) + GUESS=pdp10-unknown-tops20 + ;; + *:ITS:*:*) + GUESS=pdp10-unknown-its + ;; + SEI:*:*:SEIUX) + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; + *:DragonFly:*:*) + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) + GUESS=i386-pc-xenix + ;; + i*86:skyos:*:*) + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; + i*86:rdos:*:*) + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; + *:Ironclad:*:*) + GUESS=$UNAME_MACHINE-unknown-ironclad + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +int +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/contrib/ncurses/config.sub b/contrib/ncurses/config.sub new file mode 100755 index 00000000..4aaae46f --- /dev/null +++ b/contrib/ncurses/config.sub @@ -0,0 +1,2354 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2024 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268,SC2162 # see below for rationale + +timestamp='2024-05-27' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2024 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try '$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + cloudabi*-eabi* \ + | kfreebsd*-gnu* \ + | knetbsd*-gnu* \ + | kopensolaris*-gnu* \ + | linux-* \ + | managarm-* \ + | netbsd*-eabi* \ + | netbsd*-gnu* \ + | nto-qnx* \ + | os2-emx* \ + | rtmk-nova* \ + | storm-chaos* \ + | uclinux-gnu* \ + | uclinux-uclibc* \ + | windows-* ) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + case $field1-$field2 in + # Shorthands that happen to contain a single dash + convex-c[12] | convex-c3[248]) + basic_machine=$field2-convex + basic_os= + ;; + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Do not treat sunos as a manufacturer + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + 3100* \ + | 32* \ + | 3300* \ + | 3600* \ + | 7300* \ + | acorn \ + | altos* \ + | apollo \ + | apple \ + | atari \ + | att* \ + | axis \ + | be \ + | bull \ + | cbm \ + | ccur \ + | cisco \ + | commodore \ + | convergent* \ + | convex* \ + | cray \ + | crds \ + | dec* \ + | delta* \ + | dg \ + | digital \ + | dolphin \ + | encore* \ + | gould \ + | harris \ + | highlevel \ + | hitachi* \ + | hp \ + | ibm* \ + | intergraph \ + | isi* \ + | knuth \ + | masscomp \ + | microblaze* \ + | mips* \ + | motorola* \ + | ncr* \ + | news \ + | next \ + | ns \ + | oki \ + | omron* \ + | pc533* \ + | rebel \ + | rom68k \ + | rombug \ + | semi \ + | sequent* \ + | siemens \ + | sgi* \ + | siemens \ + | sim \ + | sni \ + | sony* \ + | stratus \ + | sun \ + | sun[234]* \ + | tektronix \ + | tti* \ + | ultra \ + | unicom* \ + | wec \ + | winbond \ + | wrs) + basic_machine=$field1-$field2 + basic_os= + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | delta-motorola | 3300-motorola | motorola-delta | motorola-3300) + cpu=m68k + vendor=motorola + ;; + # This used to be dpx2*, but that gets the RS6000-based + # DPX/20 and the x86-based DPX/2-100 wrong. See + # https://oldskool.silicium.org/stations/bull_dpx20.htm + # https://www.feb-patrimoine.com/english/bull_dpx2.htm + # https://www.feb-patrimoine.com/english/unix_and_bull.htm + dpx2 | dpx2[23]00 | dpx2[23]xx) + cpu=m68k + vendor=bull + ;; + dpx2100 | dpx21xx) + cpu=i386 + vendor=bull + ;; + dpx20) + cpu=rs6000 + vendor=bull + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x"$basic_os" != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +obj= +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + saved_IFS=$IFS + IFS="-" read kernel os <&2 + fi + ;; + *) + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; + *) + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os-$obj in + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- | linux-ohos*- ) + ;; + uclinux-uclibc*- | uclinux-gnu*- ) + ;; + managarm-mlibc*- | managarm-kernel*- ) + ;; + windows*-msvc*-) + ;; + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 + exit 1 + ;; + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 + exit 1 + ;; + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 + ;; + kfreebsd*-gnu*- | knetbsd*-gnu*- | netbsd*-gnu*- | kopensolaris*-gnu*-) + ;; + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) + ;; + nto-qnx*-) + ;; + os2-emx-) + ;; + rtmk-nova-) + ;; + *-eabi*- | *-gnueabi*-) + ;; + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format + ;; + -*-) + # Blank kernel with real OS is always fine. + ;; + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos* | *-solaris*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/contrib/ncurses/configure b/contrib/ncurses/configure new file mode 100755 index 00000000..839bb6fe --- /dev/null +++ b/contrib/ncurses/configure @@ -0,0 +1,31724 @@ +#! /bin/sh +# From configure.in Revision: 1.786 . +# Guess values for system-dependent variables and create Makefiles. +# Generated by Autoconf 2.52.20240618. +# +# Copyright 2003-2022,2023 Thomas E. Dickey +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr="expr" +else + as_expr="false" +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln' +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset="unset" +else + as_unset="false" +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: "${ac_max_here_lines=38}" + +ac_unique_file="ncurses/base/lib_initscr.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${datarootdir}/info' +mandir='${datarootdir}/man' + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo "$ac_feature" | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo "$ac_feature" | sed 's/-/_/g'` + case "$ac_option" in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst \ + | --runs | --run | --ru) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* \ + | --runs=* | --run=* | --ru=*) + runstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo "$ac_package" | sed 's/-/_/g'` + case "$ac_option" in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo "$ac_package" | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*dir | -dvi* | -doc* | -html* | -local* | -pdf* | -ps* ) + echo "$as_me: WARNING: unsupported option: $ac_option" >&2 + ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export "$ac_envvar" ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo "$ac_prev" | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo "$ac_var"` + case "$ac_val" in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo "$ac_var"` + case "$ac_val" in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: should be removed in autoconf 3.0. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS +ac_env_CXXCPP_set=${CXXCPP+set} +ac_env_CXXCPP_value=$CXXCPP +ac_cv_env_CXXCPP_set=${CXXCPP+set} +ac_cv_env_CXXCPP_value=$CXXCPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat < if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +EOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue + cd "$ac_subdir" + # A "../" for each directory in /$ac_subdir. + ac_dots=`echo "$ac_subdir" | + sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'` + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir="$srcdir" ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_sub_srcdir="$srcdir/$ac_subdir" ;; + *) # Relative path. + ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_sub_srcdir/configure.gnu"; then + echo + $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_sub_srcdir/configure"; then + echo + $SHELL "$ac_sub_srcdir/configure" --help=recursive + elif test -f "$ac_sub_srcdir/configure.ac" || + test -f "$ac_sub_srcdir/configure.in"; then + echo + "$ac_configure" --help + else + echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if "$ac_init_version"; then + cat <<\EOF + +Copyright 2003-2022,2023 Thomas E. Dickey +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +EOF + exit 0 +fi +exec 5>config.log +cat >&5 </dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +PATH = $PATH + +_ASUNAME +} >&5 + +cat >&5 <\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + echo >&5 + echo "## ----------------- ##" >&5 + echo "## Cache variables. ##" >&5 + echo "## ----------------- ##" >&5 + echo >&5 + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} >&5 + sed "/^$/d" confdefs.h >conftest.log + if test -s conftest.log; then + echo >&5 + echo "## ------------ ##" >&5 + echo "## confdefs.h. ##" >&5 + echo "## ------------ ##" >&5 + echo >&5 + cat conftest.log >&5 + fi + (echo; echo) >&5 + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" >&5 + echo "$as_me: exit $exit_status" >&5 + rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal" +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:1081: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + cat "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:1092: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:1100: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case "$ac_old_set,$ac_new_set" in + set,) + { echo "$as_me:1116: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:1120: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:1126: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:1128: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:1130: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. It doesn't matter if + # we pass some twice (in addition to the command line arguments). + if test "$ac_new_set" = set; then + case "$ac_new_val" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val" + ;; + esac + fi +done +if "$ac_cache_corrupted"; then + { echo "$as_me:1149: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:1151: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in + *c*,-n*) ECHO_N= + ECHO_C= # newlines do not sed ;-) only broken shells would use this case anyway + ECHO_T=' ' + ;; + *c*,* ) ECHO_N=-n + ECHO_C= + ECHO_T= + ;; + *) ECHO_N= + ECHO_C='\c' + ECHO_T= + ;; +esac +echo "#! $SHELL" >conftest.sh +echo "exit 0" >>conftest.sh +chmod +x conftest.sh +if { (echo "$as_me:1180: PATH=\".;.\"; conftest.sh") >&5 + (PATH=".;."; conftest.sh) 2>&5 + ac_status=$? + echo "$as_me:1183: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + ac_path_separator=';' +else + ac_path_separator=: +fi +PATH_SEPARATOR="$ac_path_separator" +rm -f conftest.sh + +ac_config_headers="$ac_config_headers include/ncurses_cfg.h:include/ncurses_cfg.hin" + +top_builddir=`pwd` + +for ac_prog in ggrep grep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1200: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$GREP"; then + ac_cv_prog_GREP="$GREP" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_GREP="$ac_prog" +echo "$as_me:1215: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +GREP=$ac_cv_prog_GREP +if test -n "$GREP"; then + echo "$as_me:1223: result: $GREP" >&5 +echo "${ECHO_T}$GREP" >&6 +else + echo "$as_me:1226: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$GREP" && break +done +test -n "$GREP" || GREP=": " + +echo "$as_me:1234: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + for ac_prog in gegrep egrep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1246: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_EGREP="$ac_dir/$ac_word" + echo "$as_me:1263: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +EGREP=$ac_cv_path_EGREP + +if test -n "$EGREP"; then + echo "$as_me:1274: result: $EGREP" >&5 +echo "${ECHO_T}$EGREP" >&6 +else + echo "$as_me:1277: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$EGREP" && break +done +test -n "$EGREP" || EGREP=": " + + test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:1285: error: cannot find workable egrep" >&5 +echo "$as_me: error: cannot find workable egrep" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:1290: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6 + EGREP="$ac_cv_path_EGREP" + +NCURSES_MAJOR="`${EGREP-egrep} '^NCURSES_MAJOR[ ]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`" +NCURSES_MINOR="`${EGREP-egrep} '^NCURSES_MINOR[ ]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`" +NCURSES_PATCH="`${EGREP-egrep} '^NCURSES_PATCH[ ]*=' "$srcdir/dist.mk" | sed -e 's/^[^0-9]*//'`" +cf_cv_abi_version=${NCURSES_MAJOR} +cf_cv_abi_default=${NCURSES_MAJOR} +cf_cv_rel_version=${NCURSES_MAJOR}.${NCURSES_MINOR} +cf_cv_timestamp=`date` +echo "$as_me:1301: result: Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_default ($cf_cv_timestamp)" >&5 +echo "${ECHO_T}Configuring NCURSES $cf_cv_rel_version ABI $cf_cv_abi_default ($cf_cv_timestamp)" >&6 + +if test -f "$srcdir/VERSION" ; then + echo "$as_me:1305: checking for package version" >&5 +echo $ECHO_N "checking for package version... $ECHO_C" >&6 + + # if there are not enough fields, cut returns the last one... + cf_field1=`sed -e '2,$d' "$srcdir/VERSION" |cut -f1` + cf_field2=`sed -e '2,$d' "$srcdir/VERSION" |cut -f2` + cf_field3=`sed -e '2,$d' "$srcdir/VERSION" |cut -f3` + + # this is how CF_BUNDLED_INTL uses $VERSION: + VERSION="$cf_field1" + + VERSION_MAJOR=`echo "$cf_field2" | sed -e 's/\..*//'` + test -z "$VERSION_MAJOR" && { { echo "$as_me:1317: error: missing major-version" >&5 +echo "$as_me: error: missing major-version" >&2;} + { (exit 1); exit 1; }; } + + VERSION_MINOR=`echo "$cf_field2" | sed -e 's/^[^.]*\.//' -e 's/-.*//'` + test -z "$VERSION_MINOR" && { { echo "$as_me:1322: error: missing minor-version" >&5 +echo "$as_me: error: missing minor-version" >&2;} + { (exit 1); exit 1; }; } + + echo "$as_me:1326: result: ${VERSION_MAJOR}.${VERSION_MINOR}" >&5 +echo "${ECHO_T}${VERSION_MAJOR}.${VERSION_MINOR}" >&6 + + echo "$as_me:1329: checking for package patch date" >&5 +echo $ECHO_N "checking for package patch date... $ECHO_C" >&6 + VERSION_PATCH=`echo "$cf_field3" | sed -e 's/^[^-]*-//'` + case .$VERSION_PATCH in + (.) + { { echo "$as_me:1334: error: missing patch-date $VERSION_PATCH" >&5 +echo "$as_me: error: missing patch-date $VERSION_PATCH" >&2;} + { (exit 1); exit 1; }; } + ;; + (.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) + ;; + (*) + { { echo "$as_me:1341: error: illegal patch-date $VERSION_PATCH" >&5 +echo "$as_me: error: illegal patch-date $VERSION_PATCH" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + echo "$as_me:1346: result: $VERSION_PATCH" >&5 +echo "${ECHO_T}$VERSION_PATCH" >&6 +else + { { echo "$as_me:1349: error: did not find $srcdir/VERSION" >&5 +echo "$as_me: error: did not find $srcdir/VERSION" >&2;} + { (exit 1); exit 1; }; } +fi + +# show the actual data that we have for versions: +test -n "$verbose" && echo " ABI VERSION $VERSION" 1>&6 + +echo "${as_me:-configure}:1357: testing ABI VERSION $VERSION ..." 1>&5 + +test -n "$verbose" && echo " VERSION_MAJOR $VERSION_MAJOR" 1>&6 + +echo "${as_me:-configure}:1361: testing VERSION_MAJOR $VERSION_MAJOR ..." 1>&5 + +test -n "$verbose" && echo " VERSION_MINOR $VERSION_MINOR" 1>&6 + +echo "${as_me:-configure}:1365: testing VERSION_MINOR $VERSION_MINOR ..." 1>&5 + +test -n "$verbose" && echo " VERSION_PATCH $VERSION_PATCH" 1>&6 + +echo "${as_me:-configure}:1369: testing VERSION_PATCH $VERSION_PATCH ..." 1>&5 + + PACKAGE=ncurses + +cat >>confdefs.h <>confdefs.h <>confdefs.h <&5 +echo "$as_me: WARNING: overriding release version $cf_cv_rel_version to $withval" >&2;} + cf_cv_rel_version=$withval +fi; + + NCURSES_MAJOR=`echo "$cf_cv_rel_version" | sed -e 's/\..*//'` + NCURSES_MINOR=`echo "$cf_cv_rel_version" | sed -e 's/^[^.]*//' -e 's/^\.//' -e 's/\..*//'` + test -n "NCURSES_MINOR" || NCURSES_MINOR=0 + +if test -n "$NCURSES_MAJOR" ; then + case `echo "$NCURSES_MAJOR" | sed -e 's/^[0-9]*$/0/g'` in + (0) + ;; + (*) + { { echo "$as_me:1404: error: Release major-version is not a number: $NCURSES_MAJOR" >&5 +echo "$as_me: error: Release major-version is not a number: $NCURSES_MAJOR" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +else + { { echo "$as_me:1410: error: Release major-version value is empty" >&5 +echo "$as_me: error: Release major-version value is empty" >&2;} + { (exit 1); exit 1; }; } +fi + +if test -n "$NCURSES_MINOR" ; then + case `echo "$NCURSES_MINOR" | sed -e 's/^[0-9]*$/0/g'` in + (0) + ;; + (*) + { { echo "$as_me:1420: error: Release minor-version is not a number: $NCURSES_MINOR" >&5 +echo "$as_me: error: Release minor-version is not a number: $NCURSES_MINOR" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +else + { { echo "$as_me:1426: error: Release minor-version value is empty" >&5 +echo "$as_me: error: Release minor-version value is empty" >&2;} + { (exit 1); exit 1; }; } +fi + +test -z "$cf_cv_abi_version" && cf_cv_abi_version=0 + +# Check whether --with-abi-version or --without-abi-version was given. +if test "${with_abi_version+set}" = set; then + withval="$with_abi_version" + + if test "x$cf_cv_abi_version" != "x$withval" + then + { echo "$as_me:1439: WARNING: overriding ABI version $cf_cv_abi_version to $withval" >&5 +echo "$as_me: WARNING: overriding ABI version $cf_cv_abi_version to $withval" >&2;} + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=$withval.0 + ;; + (6.*) + cf_cv_rel_version=$withval.9 # FIXME: should be 10 as of 6.0 release + ;; + esac + fi + cf_cv_abi_version=$withval +fi; + +if test -n "$cf_cv_abi_version" ; then + case `echo "$cf_cv_abi_version" | sed -e 's/^[0-9]*$/0/g'` in + (0) + ;; + (*) + { { echo "$as_me:1458: error: ABI version is not a number: $cf_cv_abi_version" >&5 +echo "$as_me: error: ABI version is not a number: $cf_cv_abi_version" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +else + { { echo "$as_me:1464: error: ABI version value is empty" >&5 +echo "$as_me: error: ABI version value is empty" >&2;} + { (exit 1); exit 1; }; } +fi + +cf_cv_abi_default=$cf_cv_abi_version + +if test "x$cf_cv_abi_version" != "x$with_abi_version" +then + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=$with_abi_version.0 + ;; + esac +fi + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:1497: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:1507: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:1511: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:1520: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` || + { { echo "$as_me:1524: error: $ac_config_sub $ac_cv_build_alias failed." >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1529: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +echo "$as_me:1536: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` || + { { echo "$as_me:1545: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1550: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then + echo "$as_me:1558: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` || + { { echo "$as_me:1567: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1572: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && +cat >>confdefs.h <&6 +else + cf_cv_system_name="$system_name" +fi + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && echo "$as_me:1604: result: Configuring for $cf_cv_system_name" >&5 +echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6 + +if test ".$system_name" != ".$cf_cv_system_name" ; then + echo "$as_me:1608: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5 +echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6 + { { echo "$as_me:1610: error: \"Please remove config.cache and try again.\"" >&5 +echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# Check whether --with-system-type or --without-system-type was given. +if test "${with_system_type+set}" = set; then + withval="$with_system_type" + { echo "$as_me:1618: WARNING: overriding system type to $withval" >&5 +echo "$as_me: WARNING: overriding system type to $withval" >&2;} + cf_cv_system_name=$withval + host_os=$withval + +fi; + +### Save the given $CFLAGS to allow user-override. +cf_user_CFLAGS="$CFLAGS" + +### Default install-location +echo "$as_me:1629: checking for fgrep" >&5 +echo $ECHO_N "checking for fgrep... $ECHO_C" >&6 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + for ac_prog in gfgrep fgrep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1641: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_FGREP="$ac_dir/$ac_word" + echo "$as_me:1658: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +FGREP=$ac_cv_path_FGREP + +if test -n "$FGREP"; then + echo "$as_me:1669: result: $FGREP" >&5 +echo "${ECHO_T}$FGREP" >&6 +else + echo "$as_me:1672: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$FGREP" && break +done +test -n "$FGREP" || FGREP=": " + + test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:1680: error: cannot find workable fgrep" >&5 +echo "$as_me: error: cannot find workable fgrep" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:1685: result: $ac_cv_path_FGREP" >&5 +echo "${ECHO_T}$ac_cv_path_FGREP" >&6 + FGREP="$ac_cv_path_FGREP" + +echo "$as_me:1689: checking for prefix" >&5 +echo $ECHO_N "checking for prefix... $ECHO_C" >&6 +if test "x$prefix" = "xNONE" ; then + case "$cf_cv_system_name" in + # non-vendor systems don't have a conflict + (openbsd*|freebsd*|mirbsd*|linux*|cygwin*|msys*|k*bsd*-gnu|mingw*) + prefix=/usr + ;; + (*) prefix=$ac_default_prefix + ;; + esac +fi +echo "$as_me:1701: result: $prefix" >&5 +echo "${ECHO_T}$prefix" >&6 + +if test "x$prefix" = "xNONE" ; then +echo "$as_me:1705: checking for default include-directory" >&5 +echo $ECHO_N "checking for default include-directory... $ECHO_C" >&6 +test -n "$verbose" && echo 1>&6 +for cf_symbol in \ + "$includedir" \ + "$includedir/ncurses" \ + "$prefix/include" \ + "$prefix/include/ncurses" \ + /usr/local/include \ + /usr/local/include/ncurses \ + /usr/include \ + /usr/include/ncurses +do + cf_dir=`eval echo "$cf_symbol"` + if test -f "$cf_dir/curses.h" ; then + if ( ${FGREP-fgrep} NCURSES_VERSION "$cf_dir/curses.h" >/dev/null 2>&1 ) ; then + includedir="$cf_symbol" + test -n "$verbose" && echo $ECHO_N " found " 1>&6 + break + fi + fi + test -n "$verbose" && echo " tested $cf_dir" 1>&6 +done +echo "$as_me:1728: result: $includedir" >&5 +echo "${ECHO_T}$includedir" >&6 +fi + +### Defaults for ncurses ABI + +# ABI 5 defaults: +cf_dft_ccharw_max=5 +cf_dft_chtype=auto +cf_dft_ext_colors=no +cf_dft_ext_const=no +cf_dft_ext_mouse=no +cf_dft_ext_putwin=no +cf_dft_ext_spfuncs=no +cf_dft_filter_syms=no +cf_dft_interop=no +cf_dft_mmask_t=auto +cf_dft_opaque_curses=no +cf_dft_ordinate_type=short +cf_dft_signed_char=no +cf_dft_tparm_arg=long +cf_dft_widec=no +cf_dft_with_lp64=no + +# ABI 6 default differences from ABI 5: +case x$cf_cv_abi_default in +(x[6789]) + cf_dft_chtype=uint32_t + cf_dft_ext_colors=yes + cf_dft_ext_const=yes + cf_dft_ext_mouse=yes + cf_dft_ext_putwin=yes + cf_dft_ext_spfuncs=yes + cf_dft_filter_syms=yes + cf_dft_interop=yes + cf_dft_mmask_t=uint32_t + cf_dft_opaque_curses=yes + cf_dft_tparm_arg=intptr_t + cf_dft_widec=yes + cf_dft_with_lp64=yes + ;; +esac + +# ABI 7 default differences from ABI 6: +case x$cf_cv_abi_default in +(x[789]) + cf_dft_ccharw_max=6 + cf_dft_mmask_t=uint64_t + cf_dft_ordinate_type=int + cf_dft_signed_char=yes + # also: remove the wgetch-events feature in ABI 7 + ;; +esac + +### override ABI version, e.g., packagers + +# Check whether --with-abi-altered or --without-abi-altered was given. +if test "${with_abi_altered+set}" = set; then + withval="$with_abi_altered" + +if test -n "$withval" ; then + case `echo "$withval" | sed -e 's/^[0-9]*$/0/g'` in + (0) + ;; + (*) + { { echo "$as_me:1793: error: ABI altered is not a number: $withval" >&5 +echo "$as_me: error: ABI altered is not a number: $withval" >&2;} + { (exit 1); exit 1; }; } + ;; + esac +else + { { echo "$as_me:1799: error: ABI altered value is empty" >&5 +echo "$as_me: error: ABI altered value is empty" >&2;} + { (exit 1); exit 1; }; } +fi + + if test "$cf_cv_abi_version" != "$withval" + then + { echo "$as_me:1806: WARNING: altering visible ABI from $cf_cv_abi_version to $withval" >&5 +echo "$as_me: WARNING: altering visible ABI from $cf_cv_abi_version to $withval" >&2;} + cf_cv_abi_version=$withval + fi + +fi; + +### Checks for programs. + +# Check whether --with-ada or --without-ada was given. +if test "${with_ada+set}" = set; then + withval="$with_ada" + cf_with_ada=$withval +else + cf_with_ada=yes +fi; + +cf_prog_cc="gcc cc" +if test "x$cf_with_ada" = xyes +then + +for cf_prog_gnat in gnat gnatmake gprconfig gprbuild +do + +cf_upper_prog_gnat=`echo "${cf_prog_gnat}" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + unset ac_cv_path_cf_TEMP_gnat + unset cf_TEMP_gnat + # Extract the first word of "$cf_prog_gnat", so it can be a program name with args. +set dummy $cf_prog_gnat; ac_word=$2 +echo "$as_me:1836: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_cf_TEMP_gnat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $cf_TEMP_gnat in + [\\/]* | ?:[\\/]*) + ac_cv_path_cf_TEMP_gnat="$cf_TEMP_gnat" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_cf_TEMP_gnat="$ac_dir/$ac_word" + echo "$as_me:1853: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_cf_TEMP_gnat" && ac_cv_path_cf_TEMP_gnat="no" + ;; +esac +fi +cf_TEMP_gnat=$ac_cv_path_cf_TEMP_gnat + +if test -n "$cf_TEMP_gnat"; then + echo "$as_me:1865: result: $cf_TEMP_gnat" >&5 +echo "${ECHO_T}$cf_TEMP_gnat" >&6 +else + echo "$as_me:1868: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + eval "cf_cv_PATH_$cf_upper_prog_gnat=$ac_cv_path_cf_TEMP_gnat" + + if test "x$cf_TEMP_gnat" != xno; then + unset cf_cv_gnat_version + unset cf_TEMP_gnat + +echo "$as_me:1878: checking for $cf_prog_gnat version" >&5 +echo $ECHO_N "checking for $cf_prog_gnat version... $ECHO_C" >&6 +if test "${cf_cv_gnat_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gnat_version=`$cf_prog_gnat --version 2>&1 | \ + grep '[0-9].[0-9][0-9]*' |\ + sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'` + +fi +echo "$as_me:1889: result: $cf_cv_gnat_version" >&5 +echo "${ECHO_T}$cf_cv_gnat_version" >&6 +test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no +eval cf_TEMP_gnat=$cf_cv_gnat_version; unset cf_cv_gnat_version + + fi + eval "cf_cv_VERSION_$cf_upper_prog_gnat=$cf_TEMP_gnat" + + unset cf_TEMP_gnat + unset cf_cv_gnat_version + unset ac_cv_path_cf_TEMP_gnat +done + +if test "x$cf_cv_VERSION_GNATMAKE" = "xno"; then + cf_ada_make= + cf_cv_prog_gnat_correct=no +else + cf_ada_make=gnatmake + if test "x$cf_cv_VERSION_GPRCONFIG" = "xno"; then + # gprconfig is newer than gnatmake; we can continue... + cf_ada_config="##" + else + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src + then + cf_ada_config="" + cd conftest.src + for cf_gprconfig in Ada C + do + echo "$as_me:1918: checking for gprconfig name for $cf_gprconfig" >&5 +echo $ECHO_N "checking for gprconfig name for $cf_gprconfig... $ECHO_C" >&6 + if test "$cf_gprconfig" = C + then + for cf_gprconfig_param in \ + "$cf_gprconfig,,,,GNATGCC" \ + "$cf_gprconfig,,,,GCC" \ + "$cf_gprconfig" + do + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1` + test -n "$cf_gprconfig_value" && break + done + else + cf_gprconfig_param=$cf_gprconfig + cf_gprconfig_value=`echo s| gprconfig --config=$cf_gprconfig_param 2>&5 | ${AWK:-awk} '/^\*/{print $3;}' | head -n 1` + fi + if test -n "$cf_gprconfig_value" + then + eval "cf_ada_config_$cf_gprconfig=$cf_gprconfig_value" + echo "$as_me:1937: result: $cf_gprconfig_value" >&5 +echo "${ECHO_T}$cf_gprconfig_value" >&6 + else + echo "$as_me:1940: result: missing" >&5 +echo "${ECHO_T}missing" >&6 + cf_ada_config="#" + break + fi + done + cd .. + rm -rf ./conftest* ./*~conftest* + fi + fi + if test "x$cf_ada_config" != "x#" + then + +echo "$as_me:1953: checking for gnat version" >&5 +echo $ECHO_N "checking for gnat version... $ECHO_C" >&6 +if test "${cf_cv_gnat_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gnat_version=`${cf_ada_make:-gnatmake} --version 2>&1 | \ + grep '[0-9].[0-9][0-9]*' |\ + sed -e '2,$d' -e 's/[^0-9 \.]//g' -e 's/^[ ]*//' -e 's/ .*//'` + +fi +echo "$as_me:1964: result: $cf_cv_gnat_version" >&5 +echo "${ECHO_T}$cf_cv_gnat_version" >&6 +test -z "$cf_cv_gnat_version" && cf_cv_gnat_version=no + +case "$cf_cv_gnat_version" in +(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9]) + cf_cv_prog_gnat_correct=yes + ;; +(*) + { echo "$as_me:1973: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&5 +echo "$as_me: WARNING: Unsupported GNAT version $cf_cv_gnat_version. We require 3.11 or better. Disabling Ada95 binding." >&2;} + cf_cv_prog_gnat_correct=no + ;; +esac + + # Extract the first word of "m4", so it can be a program name with args. +set dummy m4; ac_word=$2 +echo "$as_me:1981: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_M4_exists+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$M4_exists"; then + ac_cv_prog_M4_exists="$M4_exists" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_M4_exists="yes" +echo "$as_me:1996: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_M4_exists" && ac_cv_prog_M4_exists="no" +fi +fi +M4_exists=$ac_cv_prog_M4_exists +if test -n "$M4_exists"; then + echo "$as_me:2005: result: $M4_exists" >&5 +echo "${ECHO_T}$M4_exists" >&6 +else + echo "$as_me:2008: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$ac_cv_prog_M4_exists" = no; then + cf_cv_prog_gnat_correct=no + { echo "$as_me:2014: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&5 +echo "$as_me: WARNING: Ada95 binding required program m4 not found. Ada95 binding disabled" >&2;} + fi + if test "$cf_cv_prog_gnat_correct" = yes; then + echo "$as_me:2018: checking if GNAT works" >&5 +echo $ECHO_N "checking if GNAT works... $ECHO_C" >&6 + +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&5 2>&1 ) ; then + if ( ./conftest 1>&5 2>&1 ) ; then + cf_cv_prog_gnat_correct=yes + else + cf_cv_prog_gnat_correct=no + fi +else + cf_cv_prog_gnat_correct=no +fi +rm -rf ./conftest* ./*~conftest* + + echo "$as_me:2046: result: $cf_cv_prog_gnat_correct" >&5 +echo "${ECHO_T}$cf_cv_prog_gnat_correct" >&6 + fi + else + cf_cv_prog_gnat_correct=no + fi +fi + + if test "x$cf_cv_prog_gnat_correct" = xyes; then + # gcc's developers chose to deprecate gnatgcc before making gprconfig + # work. They replaced gnatgcc in gcc 13 with a script which spits out + # a warning offering advice which could never work. + # + # Here is a workaround. + # Extract the first word of "gnatgcc", so it can be a program name with args. +set dummy gnatgcc; ac_word=$2 +echo "$as_me:2062: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_cf_cv_path_gnatgcc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $cf_cv_path_gnatgcc in + [\\/]* | ?:[\\/]*) + ac_cv_path_cf_cv_path_gnatgcc="$cf_cv_path_gnatgcc" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_cf_cv_path_gnatgcc="$ac_dir/$ac_word" + echo "$as_me:2079: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_cf_cv_path_gnatgcc" && ac_cv_path_cf_cv_path_gnatgcc="no" + ;; +esac +fi +cf_cv_path_gnatgcc=$ac_cv_path_cf_cv_path_gnatgcc + +if test -n "$cf_cv_path_gnatgcc"; then + echo "$as_me:2091: result: $cf_cv_path_gnatgcc" >&5 +echo "${ECHO_T}$cf_cv_path_gnatgcc" >&6 +else + echo "$as_me:2094: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$cf_cv_path_gnatgcc" != no + then + echo "$as_me:2100: checking for improvement" >&5 +echo $ECHO_N "checking for improvement... $ECHO_C" >&6 + cf_file_gnatgcc=`file -L "$cf_cv_path_gnatgcc" 2>/dev/null` + case "x$cf_file_gnatgcc" in + (*script*) + cf_cv_path_gnatgcc=`sh -x "$cf_cv_path_gnatgcc" --version 2>&1 | grep -w exec | sed -e 's/^[ ]*+[ ]*//' -e 's/exec[ ]//' -e 's/ .*//'` + ;; + (*) + cf_cv_path_gnatgcc=no + ;; + esac + echo "$as_me:2111: result: $cf_cv_path_gnatgcc" >&5 +echo "${ECHO_T}$cf_cv_path_gnatgcc" >&6 + test "$cf_cv_path_gnatgcc" = no && cf_cv_path_gnatgcc=gnatgcc + cf_prog_cc="$cf_cv_path_gnatgcc $cf_prog_cc" + fi + fi +fi +case "$cf_prog_cc" in +(*/*) + CC="$cf_prog_cc" + + ;; +(*) + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" +if test -n "$ac_tool_prefix"; then + for ac_prog in $cf_prog_cc + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:2136: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +echo "$as_me:2151: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:2159: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:2162: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in $cf_prog_cc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2175: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="$ac_prog" +echo "$as_me:2190: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:2198: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:2201: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +test -z "$CC" && { { echo "$as_me:2211: error: no acceptable cc found in \$PATH" >&5 +echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:2216:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo "$2"` +{ (eval echo "$as_me:2219: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:2222: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:2224: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:2227: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:2229: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:2232: \$? = $ac_status" >&5 + (exit "$ac_status"); } + +cat >"conftest.$ac_ext" <<_ACEOF +#line 2236 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:2252: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'` +if { (eval echo "$as_me:2255: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:2258: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. +for ac_file in `ls a.exe conftest.exe 2>/dev/null; + ls a.out conftest 2>/dev/null; + ls a.* conftest.* 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +{ { echo "$as_me:2281: error: C compiler cannot create executables" >&5 +echo "$as_me: error: C compiler cannot create executables" >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:2287: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:2292: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:2298: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2301: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:2308: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:2316: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe "conftest$ac_cv_exeext" +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:2323: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:2325: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:2328: checking for executable suffix" >&5 +echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 +if { (eval echo "$as_me:2330: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:2333: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:2349: error: cannot compute EXEEXT: cannot compile and link" >&5 +echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f "conftest$ac_cv_exeext" +echo "$as_me:2355: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f "conftest.$ac_ext" +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:2361: checking for object suffix" >&5 +echo $ECHO_N "checking for object suffix... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 2367 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:2379: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2382: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +{ { echo "$as_me:2394: error: cannot compute OBJEXT: cannot compile" >&5 +echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext" +fi +echo "$as_me:2401: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:2405: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 2411 "configure" +#include "confdefs.h" + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2426: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2429: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2432: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2435: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_compiler_gnu=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:2447: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:2453: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 2459 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2471: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2474: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2477: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2480: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_prog_cc_g=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:2490: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >"conftest.$ac_ext" <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2517: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2520: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2523: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2526: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 2538 "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2551: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2554: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2557: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2560: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +continue +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2570 "configure" +#include "confdefs.h" +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2582: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2585: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2588: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2591: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +rm -rf conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo "$ac_declaration" >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +GCC_VERSION=none +if test "$GCC" = yes ; then + echo "$as_me:2621: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^[^(]*([^)][^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + echo "$as_me:2625: result: $GCC_VERSION" >&5 +echo "${ECHO_T}$GCC_VERSION" >&6 +fi + +INTEL_COMPILER=no + +if test "$GCC" = yes ; then + case "$host_os" in + (linux*|gnu*) + echo "$as_me:2634: checking if this is really Intel C compiler" >&5 +echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -no-gcc" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2639 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2656: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2659: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2662: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2665: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + INTEL_COMPILER=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:2676: result: $INTEL_COMPILER" >&5 +echo "${ECHO_T}$INTEL_COMPILER" >&6 + ;; + esac +fi + +CLANG_COMPILER=no + +if test "$GCC" = yes ; then + echo "$as_me:2685: checking if this is really Clang C compiler" >&5 +echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2689 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2706: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2709: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2712: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2715: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + CLANG_COMPILER=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:2725: result: $CLANG_COMPILER" >&5 +echo "${ECHO_T}$CLANG_COMPILER" >&6 +fi + +CLANG_VERSION=none + +if test "x$CLANG_COMPILER" = "xyes" ; then + case "$CC" in + (c[1-9][0-9]|*/c[1-9][0-9]) + { echo "$as_me:2734: WARNING: replacing broken compiler alias $CC" >&5 +echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;} + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + echo "$as_me:2741: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + echo "$as_me:2745: result: $CLANG_VERSION" >&5 +echo "${ECHO_T}$CLANG_VERSION" >&6 + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + echo "$as_me:2752: checking if option $cf_clang_opt works" >&5 +echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2757 "configure" +#include "confdefs.h" + + #include +int +main (void) +{ + + printf("hello!\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:2771: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:2774: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:2777: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2780: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_clang_optok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_clang_optok=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:2791: result: $cf_clang_optok" >&5 +echo "${ECHO_T}$cf_clang_optok" >&6 + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + test -n "$verbose" && echo " adding option $cf_clang_opt" 1>&6 + +echo "${as_me:-configure}:2797: testing adding option $cf_clang_opt ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_clang_opt" + + fi + done +fi + +echo "$as_me:2806: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >"conftest.$ac_ext" <<_ACEOF +#line 2814 "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (char **p, int i) +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main (void) +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2861: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2864: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2867: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2870: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" +done +rm -f "conftest.$ac_ext" "conftest.$ac_objext" +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:2887: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:2890: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# This should have been defined by AC_PROG_CC +: "${CC:=cc}" + +echo "$as_me:2898: checking \$CFLAGS variable" >&5 +echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 +case "x$CFLAGS" in +(*-[IUD]*) + echo "$as_me:2902: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2904: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;} + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + done + ;; +(*) + echo "$as_me:3012: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +echo "$as_me:3017: checking \$CC variable" >&5 +echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 +case "$CC" in +(*[\ \ ]-*) + echo "$as_me:3021: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:3023: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;} + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'` + cf_flags=`echo "$CC" | sed -e "s%^$cf_prog%%"` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[IUDfgOW]*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + test -n "$verbose" && echo " resulting CC: '$CC'" 1>&6 + +echo "${as_me:-configure}:3140: testing resulting CC: '$CC' ..." 1>&5 + + test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 + +echo "${as_me:-configure}:3144: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 + + test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 + +echo "${as_me:-configure}:3148: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 + + ;; +(*) + echo "$as_me:3152: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" +echo "$as_me:3166: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 3187 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:3192: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3198: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 3221 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:3225: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3231: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:3268: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 3278 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:3283: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3289: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 3312 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:3316: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3322: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + : +else + { { echo "$as_me:3350: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +if test $ac_cv_c_compiler_gnu = yes; then + echo "$as_me:3363: checking whether $CC needs -traditional" >&5 +echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 +if test "${ac_cv_prog_gcc_traditional+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_pattern="Autoconf.*'x'" + cat >"conftest.$ac_ext" <<_ACEOF +#line 3370 "configure" +#include "confdefs.h" +#include +int Autoconf = TIOCGETP; +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +else + ac_cv_prog_gcc_traditional=no +fi +rm -rf conftest* + + if test $ac_cv_prog_gcc_traditional = no; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 3385 "configure" +#include "confdefs.h" +#include +int Autoconf = TCGETA; +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1; then + ac_cv_prog_gcc_traditional=yes +fi +rm -rf conftest* + + fi +fi +echo "$as_me:3398: result: $ac_cv_prog_gcc_traditional" >&5 +echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +echo "$as_me:3405: checking whether $CC understands -c and -o together" >&5 +echo $ECHO_N "checking whether $CC understands -c and -o together... $ECHO_C" >&6 +if test "${cf_cv_prog_CC_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat > conftest.$ac_ext <&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3423: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + test -f conftest2.$ac_objext && { (eval echo "$as_me:3425: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3428: \$? = $ac_status" >&5 + (exit "$ac_status"); }; +then + eval cf_cv_prog_CC_c_o=yes +else + eval cf_cv_prog_CC_c_o=no +fi +rm -rf ./conftest* + +fi +if test "$cf_cv_prog_CC_c_o" = yes; then + echo "$as_me:3439: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:3442: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cross_compiling" = yes ; then + LDCONFIG=: +else + case "$cf_cv_system_name" in + (dragonfly*|mirbsd*|freebsd*) + test -z "$LDCONFIG" && LDCONFIG="/sbin/ldconfig -R" + ;; + (*) LDPATH=$PATH:/sbin:/usr/sbin + # Extract the first word of "ldconfig", so it can be a program name with args. +set dummy ldconfig; ac_word=$2 +echo "$as_me:3456: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_LDCONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $LDCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_LDCONFIG="$LDCONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$LDPATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_LDCONFIG="$ac_dir/$ac_word" + echo "$as_me:3473: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +LDCONFIG=$ac_cv_path_LDCONFIG + +if test -n "$LDCONFIG"; then + echo "$as_me:3484: result: $LDCONFIG" >&5 +echo "${ECHO_T}$LDCONFIG" >&6 +else + echo "$as_me:3487: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + ;; + esac +fi + +echo "$as_me:3495: checking if you want to ensure bool is consistent with C++" >&5 +echo $ECHO_N "checking if you want to ensure bool is consistent with C++... $ECHO_C" >&6 + +# Check whether --with-cxx or --without-cxx was given. +if test "${with_cxx+set}" = set; then + withval="$with_cxx" + cf_with_cxx=$withval +else + cf_with_cxx=yes +fi; +echo "$as_me:3505: result: $cf_with_cxx" >&5 +echo "${ECHO_T}$cf_with_cxx" >&6 +if test "X$cf_with_cxx" = Xno ; then + CXX="" + GXX="" +else + # with autoconf 2.13, we can change the error to a warning: + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:3523: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" +echo "$as_me:3538: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:3546: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:3549: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3562: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CXX="$ac_prog" +echo "$as_me:3577: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:3585: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:3588: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + +# Provide some information about the compiler. +echo "$as_me:3600:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:3603: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:3606: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:3608: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:3611: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:3613: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:3616: \$? = $ac_status" >&5 + (exit "$ac_status"); } + +echo "$as_me:3619: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 3625 "configure" +#include "confdefs.h" + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:3640: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3643: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:3646: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3649: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_compiler_gnu=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:3661: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:3667: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 3673 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:3685: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3688: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:3691: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3694: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_prog_cxx_g=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:3704: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 3731 "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:3744: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3747: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:3750: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3753: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +continue +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 3763 "configure" +#include "confdefs.h" +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:3775: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3778: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:3781: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3784: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +rm -rf conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo "$ac_declaration" >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + + if test "x$cf_with_cxx" != xno + then + # Several of the C++ configurations do not work, particularly when + # cross-compiling (20140913 -TD) + echo "$as_me:3818: checking if $CXX works" >&5 +echo $ECHO_N "checking if $CXX works... $ECHO_C" >&6 + + save_CPPFLAGS="$CPPFLAGS" + eval cf_includedir=${includedir} + CPPFLAGS="$CPPFLAGS -I${cf_includedir}" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 3826 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + + printf("Hello world!\n") + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:3843: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3846: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:3849: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3852: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cxx_works=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cxx_works=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$save_CPPFLAGS" + + echo "$as_me:3863: result: $cf_cxx_works" >&5 +echo "${ECHO_T}$cf_cxx_works" >&6 + if test "x$cf_cxx_works" = xno + then + { echo "$as_me:3867: WARNING: Ignore $CXX, since it cannot compile hello-world." >&5 +echo "$as_me: WARNING: Ignore $CXX, since it cannot compile hello-world." >&2;} + cf_with_cxx=no; CXX=""; GXX=""; + fi + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + + # autoconf 2.5x removed the error (hardcoding it to g++, or just blank) + if test "$CXX" = "g++" ; then + # Extract the first word of "g++", so it can be a program name with args. +set dummy g++; ac_word=$2 +echo "$as_me:3883: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $CXX in + [\\/]* | ?:[\\/]*) + ac_cv_path_CXX="$CXX" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_CXX="$ac_dir/$ac_word" + echo "$as_me:3900: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +CXX=$ac_cv_path_CXX + +if test -n "$CXX"; then + echo "$as_me:3911: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:3914: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + fi + case "x$CXX" in + (x|xg++) + { echo "$as_me:3921: WARNING: You don't have any C++ compiler, too bad" >&5 +echo "$as_me: WARNING: You don't have any C++ compiler, too bad" >&2;} + cf_with_cxx=no; CXX=""; GXX=""; + ;; + esac +fi + +GXX_VERSION=none +if test "$GXX" = yes; then + echo "$as_me:3930: checking version of ${CXX:-g++}" >&5 +echo $ECHO_N "checking version of ${CXX:-g++}... $ECHO_C" >&6 + GXX_VERSION="`${CXX:-g++} --version 2>/dev/null | sed -e '2,$d' -e 's/^[^(]*([^)][^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + if test -z "$GXX_VERSION" + then + GXX_VERSION=unknown + GXX=no + fi + echo "$as_me:3938: result: $GXX_VERSION" >&5 +echo "${ECHO_T}$GXX_VERSION" >&6 +fi + +case "$GXX_VERSION" in +([1-9][0-9].*) + ;; +(1.*|2.[0-6]*) + { echo "$as_me:3946: WARNING: templates do not work" >&5 +echo "$as_me: WARNING: templates do not work" >&2;} + ;; +esac + +echo "$as_me:3951: checking if you want to build C++ binding and demo" >&5 +echo $ECHO_N "checking if you want to build C++ binding and demo... $ECHO_C" >&6 + +# Check whether --with-cxx-binding or --without-cxx-binding was given. +if test "${with_cxx_binding+set}" = set; then + withval="$with_cxx_binding" + cf_with_cxx_binding=$withval +else + cf_with_cxx_binding=$cf_with_cxx +fi; +echo "$as_me:3961: result: $cf_with_cxx_binding" >&5 +echo "${ECHO_T}$cf_with_cxx_binding" >&6 + +echo "$as_me:3964: checking if you want to build with Ada" >&5 +echo $ECHO_N "checking if you want to build with Ada... $ECHO_C" >&6 +echo "$as_me:3966: result: $cf_with_ada" >&5 +echo "${ECHO_T}$cf_with_ada" >&6 + +echo "$as_me:3969: checking if you want to install terminal database" >&5 +echo $ECHO_N "checking if you want to install terminal database... $ECHO_C" >&6 + +# Check whether --enable-db-install or --disable-db-install was given. +if test "${enable_db_install+set}" = set; then + enableval="$enable_db_install" + cf_with_db_install=$enableval +else + cf_with_db_install=yes +fi; +echo "$as_me:3979: result: $cf_with_db_install" >&5 +echo "${ECHO_T}$cf_with_db_install" >&6 + +echo "$as_me:3982: checking if you want to install manpages" >&5 +echo $ECHO_N "checking if you want to install manpages... $ECHO_C" >&6 + +# Check whether --with-manpages or --without-manpages was given. +if test "${with_manpages+set}" = set; then + withval="$with_manpages" + cf_with_manpages=$withval +else + cf_with_manpages=yes +fi; +echo "$as_me:3992: result: $cf_with_manpages" >&5 +echo "${ECHO_T}$cf_with_manpages" >&6 + +echo "$as_me:3995: checking if you want to build programs such as tic" >&5 +echo $ECHO_N "checking if you want to build programs such as tic... $ECHO_C" >&6 + +# Check whether --with-progs or --without-progs was given. +if test "${with_progs+set}" = set; then + withval="$with_progs" + cf_with_progs=$withval +else + cf_with_progs=yes +fi; +echo "$as_me:4005: result: $cf_with_progs" >&5 +echo "${ECHO_T}$cf_with_progs" >&6 + +echo "$as_me:4008: checking if you want to build test-programs" >&5 +echo $ECHO_N "checking if you want to build test-programs... $ECHO_C" >&6 + +# Check whether --with-tests or --without-tests was given. +if test "${with_tests+set}" = set; then + withval="$with_tests" + cf_with_tests=$withval +else + cf_with_tests=yes +fi; +echo "$as_me:4018: result: $cf_with_tests" >&5 +echo "${ECHO_T}$cf_with_tests" >&6 + +echo "$as_me:4021: checking if you wish to install curses.h" >&5 +echo $ECHO_N "checking if you wish to install curses.h... $ECHO_C" >&6 + +# Check whether --with-curses-h or --without-curses-h was given. +if test "${with_curses_h+set}" = set; then + withval="$with_curses_h" + with_curses_h=$withval +else + with_curses_h=yes +fi; +echo "$as_me:4031: result: $with_curses_h" >&5 +echo "${ECHO_T}$with_curses_h" >&6 + +modules_to_build="ncurses" +test "X$cf_with_progs" != Xno && modules_to_build="$modules_to_build progs" +modules_to_build="$modules_to_build panel menu form" + +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +for ac_prog in mawk gawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:4055: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AWK="$ac_prog" +echo "$as_me:4070: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:4078: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:4081: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +test -z "$AWK" && { { echo "$as_me:4088: error: No awk program found" >&5 +echo "$as_me: error: No awk program found" >&2;} + { (exit 1); exit 1; }; } + +case "$cf_cv_system_name" in +(cygwin*|msys*|mingw32*|mingw64|os2*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER='[a-zA-Z]:[\\/]*' + ;; +(*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER=$GLOB_FULLPATH_POSIX + ;; +esac + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:4115: checking for a BSD compatible install" >&5 +echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_IFS=$IFS; IFS=$ac_path_separator + for ac_dir in $PATH; do + IFS=$ac_save_IFS + # Account for people who put trailing slashes in PATH elements. + case $ac_dir/ in + / | ./ | .// | /cC/* \ + | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ + | /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if $as_executable_p "$ac_dir/$ac_prog"; then + if test $ac_prog = install && + grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:4164: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case x$INSTALL in +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(*) + cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'` + test -z "$cf_dir" && cf_dir=. + INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" + ;; +esac + +for ac_prog in lint cppcheck splint +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:4189: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LINT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LINT"; then + ac_cv_prog_LINT="$LINT" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LINT="$ac_prog" +echo "$as_me:4204: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LINT=$ac_cv_prog_LINT +if test -n "$LINT"; then + echo "$as_me:4212: result: $LINT" >&5 +echo "${ECHO_T}$LINT" >&6 +else + echo "$as_me:4215: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LINT" && break +done + +case "x$LINT" in +(xcppcheck|x*/cppcheck) + test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" + ;; +esac + +echo "$as_me:4228: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:4232: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:4235: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:4239: checking if $LN_S -f options work" >&5 +echo $ECHO_N "checking if $LN_S -f options work... $ECHO_C" >&6 + +rm -f conf$$.src conf$$dst +echo >conf$$.dst +echo first >conf$$.src +if $LN_S -f conf$$.src conf$$.dst 2>/dev/null; then + cf_prog_ln_sf=yes +else + cf_prog_ln_sf=no +fi +rm -f conf$$.dst conf$$src +echo "$as_me:4251: result: $cf_prog_ln_sf" >&5 +echo "${ECHO_T}$cf_prog_ln_sf" >&6 + +test "$cf_prog_ln_sf" = yes && LN_S="$LN_S -f" + +echo "$as_me:4256: checking for long file names" >&5 +echo $ECHO_N "checking for long file names... $ECHO_C" >&6 +if test "${ac_cv_sys_long_file_names+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_sys_long_file_names=yes +# Test for long file names in all the places we know might matter: +# . the current directory, where building will happen +# $prefix/lib where we will be installing things +# $exec_prefix/lib likewise +# eval it to expand exec_prefix. +# $TMPDIR if set, where it might want to write temporary files +# if $TMPDIR is not set: +# /tmp where it might want to write temporary files +# /var/tmp likewise +# /usr/tmp likewise +if test -n "$TMPDIR" && test -d "$TMPDIR" && test -w "$TMPDIR"; then + ac_tmpdirs=$TMPDIR +else + ac_tmpdirs='/tmp /var/tmp /usr/tmp' +fi +for ac_dir in . $ac_tmpdirs `eval echo "$prefix/lib" "$exec_prefix/lib"` ; do + test -d "$ac_dir" || continue + test -w "$ac_dir" || continue # It is less confusing to not echo anything here. + ac_xdir=$ac_dir/cf$$ + (umask 077 && mkdir "$ac_xdir" 2>/dev/null) || continue + ac_tf1=$ac_xdir/conftest9012345 + ac_tf2=$ac_xdir/conftest9012346 + (echo 1 >"$ac_tf1") 2>/dev/null + (echo 2 >"$ac_tf2") 2>/dev/null + ac_val=`cat "$ac_tf1" 2>/dev/null` + if test ! -f "$ac_tf1" || test "$ac_val" != 1; then + ac_cv_sys_long_file_names=no + rm -rf "$ac_xdir" 2>/dev/null + break + fi + rm -rf "$ac_xdir" 2>/dev/null +done +fi +echo "$as_me:4295: result: $ac_cv_sys_long_file_names" >&5 +echo "${ECHO_T}$ac_cv_sys_long_file_names" >&6 +if test "$ac_cv_sys_long_file_names" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LONG_FILE_NAMES 1 +EOF + +fi + +# Provide for renaming "ncurses5-config" to "ncurses5X-config", etc., in case +# of package conflict. +cf_config_suffix= + +# Check whether --with-config-suffix or --without-config-suffix was given. +if test "${with_config_suffix+set}" = set; then + withval="$with_config_suffix" + case "x$withval" in + (xyes|xno) + { echo "$as_me:4314: WARNING: expected a value for config-suffix option" >&5 +echo "$as_me: WARNING: expected a value for config-suffix option" >&2;} + ;; + (*) cf_config_suffix="$withval" + ;; + esac +fi; + +# If we find pkg-config, check if we should install the ".pc" files. + +echo "$as_me:4324: checking if you want to use pkg-config" >&5 +echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6 + +# Check whether --with-pkg-config or --without-pkg-config was given. +if test "${with_pkg_config+set}" = set; then + withval="$with_pkg_config" + cf_pkg_config=$withval +else + cf_pkg_config=yes +fi; +echo "$as_me:4334: result: $cf_pkg_config" >&5 +echo "${ECHO_T}$cf_pkg_config" >&6 + +case "$cf_pkg_config" in +(no) + PKG_CONFIG=none + ;; +(yes) + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +echo "$as_me:4346: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:4363: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG + +if test -n "$PKG_CONFIG"; then + echo "$as_me:4374: result: $PKG_CONFIG" >&5 +echo "${ECHO_T}$PKG_CONFIG" >&6 +else + echo "$as_me:4377: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:4386: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:4403: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none" + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG + +if test -n "$ac_pt_PKG_CONFIG"; then + echo "$as_me:4415: result: $ac_pt_PKG_CONFIG" >&5 +echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 +else + echo "$as_me:4418: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + PKG_CONFIG=$ac_pt_PKG_CONFIG +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$PKG_CONFIG" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval PKG_CONFIG="$PKG_CONFIG" + case "x$PKG_CONFIG" in + (xNONE/*) + PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:4459: error: expected a pathname, not \"$PKG_CONFIG\"" >&5 +echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +elif test "x$cf_pkg_config" != xno ; then + { echo "$as_me:4466: WARNING: pkg-config is not installed" >&5 +echo "$as_me: WARNING: pkg-config is not installed" >&2;} +fi + +case "$PKG_CONFIG" in +(no|none|yes) + echo "$as_me:4472: checking for pkg-config library directory" >&5 +echo $ECHO_N "checking for pkg-config library directory... $ECHO_C" >&6 + ;; +(*) + echo "$as_me:4476: checking for $PKG_CONFIG library directory" >&5 +echo $ECHO_N "checking for $PKG_CONFIG library directory... $ECHO_C" >&6 + ;; +esac + +# if $PKG_CONFIG_LIBDIR is set, try to use that +if test -n "$PKG_CONFIG_PATH"; then + cf_search_path=`echo "$PKG_CONFIG_PATH" | sed -e 's/:/ /g' -e 's,^[ ]*,,' -e 's,[ ]*$,,'` +elif test -n "$PKG_CONFIG_LIBDIR"; then + cf_search_path=`echo "$PKG_CONFIG_LIBDIR" | sed -e 's/:/ /g' -e 's,^[ ]*,,' -e 's,[ ]*$,,'` +else + cf_search_path=auto +fi + +# if the option is used, let that override. otherwise default to "libdir" + +# Check whether --with-pkg-config-libdir or --without-pkg-config-libdir was given. +if test "${with_pkg_config_libdir+set}" = set; then + withval="$with_pkg_config_libdir" + cf_search_path=$withval +else + test "x$PKG_CONFIG" != xnone && test -z "$cf_search_path" && cf_search_path=libdir +fi; + +case "x$cf_search_path" in +(xlibdir) + PKG_CONFIG_LIBDIR='${libdir}/pkgconfig' + echo "$as_me:4503: result: $PKG_CONFIG_LIBDIR" >&5 +echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 + cf_search_path= + ;; +(x) + ;; +(x$GLOB_FULLPATH_POSIX\ *|x$GLOB_FULLPATH_OTHER\ *) + PKG_CONFIG_LIBDIR= + ;; +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + PKG_CONFIG_LIBDIR="$cf_search_path" + echo "$as_me:4514: result: $PKG_CONFIG_LIBDIR" >&5 +echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 + cf_search_path= + ;; +(xyes|xauto) + echo "$as_me:4519: result: auto" >&5 +echo "${ECHO_T}auto" >&6 + cf_search_path= + # Look for the library directory using the same prefix as the executable + echo "$as_me:4523: checking for search-list" >&5 +echo $ECHO_N "checking for search-list... $ECHO_C" >&6 + if test "x$PKG_CONFIG" != xnone + then + # works for pkg-config since version 0.24 (2009) + # works for pkgconf since version 0.8.3 (2012) + for cf_pkg_program in \ + `echo "$PKG_CONFIG" | sed -e 's,^.*/,,'` \ + pkg-config \ + pkgconf + do + cf_raw_search_path=`"$PKG_CONFIG" --variable=pc_path "$cf_pkg_program" 2>/dev/null` + case "$cf_raw_search_path" in + (*\\*) + cf_search_path=`echo "$cf_raw_search_path" | tr ';' ' ' | tr '\' '/'` + ;; + (*/*) + cf_search_path=`echo "$cf_raw_search_path" | tr : ' '` + ;; + esac + test -n "$cf_search_path" && break + done + + # works for pkg-config since import in 2005 of original 2001 HP code. + test -z "$cf_search_path" && \ + cf_search_path=` + "$PKG_CONFIG" --debug --exists no-such-package 2>&1 | $AWK "\ +/^Scanning directory (#[1-9][0-9]* )?'.*'$/{ \ + sub(\"^[^']*'\",\"\"); \ + sub(\"'.*\",\"\"); \ + printf \" %s\", \\$0; } \ +{ next; } \ +"` + fi + + echo "$as_me:4558: result: $cf_search_path" >&5 +echo "${ECHO_T}$cf_search_path" >&6 + ;; +(*) + { { echo "$as_me:4562: error: Unexpected option value: $cf_search_path" >&5 +echo "$as_me: error: Unexpected option value: $cf_search_path" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +if test -n "$cf_search_path" +then + echo "$as_me:4570: checking for first directory" >&5 +echo $ECHO_N "checking for first directory... $ECHO_C" >&6 + cf_pkg_config_path=none + for cf_config in $cf_search_path + do + if test -d "$cf_config" + then + cf_pkg_config_path=$cf_config + break + fi + done + echo "$as_me:4581: result: $cf_pkg_config_path" >&5 +echo "${ECHO_T}$cf_pkg_config_path" >&6 + + if test "x$cf_pkg_config_path" != xnone ; then + # limit this to the first directory found + PKG_CONFIG_LIBDIR="$cf_pkg_config_path" + fi + + if test -z "$PKG_CONFIG_LIBDIR" && test -n "$cf_search_path" + then + echo "$as_me:4591: checking for workaround" >&5 +echo $ECHO_N "checking for workaround... $ECHO_C" >&6 + if test "$prefix" = "NONE" ; then + cf_prefix="$ac_default_prefix" + else + cf_prefix="$prefix" + fi + eval cf_libdir=$libdir + cf_libdir=`echo "$cf_libdir" | sed -e "s,^NONE,$cf_prefix,"` + cf_backup= + for cf_config in $cf_search_path + do + case $cf_config in + $cf_libdir/pkgconfig) + PKG_CONFIG_LIBDIR=$cf_libdir/pkgconfig + break + ;; + *) + test -z "$cf_backup" && cf_backup=$cf_config + ;; + esac + done + test -z "$PKG_CONFIG_LIBDIR" && PKG_CONFIG_LIBDIR=$cf_backup + echo "$as_me:4614: result: $PKG_CONFIG_LIBDIR" >&5 +echo "${ECHO_T}$PKG_CONFIG_LIBDIR" >&6 + fi +fi + +if test "x$PKG_CONFIG" != xnone +then + echo "$as_me:4621: checking if we should install .pc files for $PKG_CONFIG" >&5 +echo $ECHO_N "checking if we should install .pc files for $PKG_CONFIG... $ECHO_C" >&6 +else + echo "$as_me:4624: checking if we should install .pc files" >&5 +echo $ECHO_N "checking if we should install .pc files... $ECHO_C" >&6 +fi + +# Check whether --enable-pc-files or --disable-pc-files was given. +if test "${enable_pc_files+set}" = set; then + enableval="$enable_pc_files" + enable_pc_files=$enableval +else + enable_pc_files=no +fi; +echo "$as_me:4635: result: $enable_pc_files" >&5 +echo "${ECHO_T}$enable_pc_files" >&6 + +if test "x$enable_pc_files" != xno +then + MAKE_PC_FILES= + case "x$PKG_CONFIG_LIBDIR" in + (xno|xnone|xyes|x) + { echo "$as_me:4643: WARNING: no PKG_CONFIG_LIBDIR was found" >&5 +echo "$as_me: WARNING: no PKG_CONFIG_LIBDIR was found" >&2;} + ;; + (*) + cf_pkg_config_libdir="$PKG_CONFIG_LIBDIR" + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_pkg_config_libdir" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_pkg_config_libdir="$cf_pkg_config_libdir" + case "x$cf_pkg_config_libdir" in + (xNONE/*) + cf_pkg_config_libdir=`echo "$cf_pkg_config_libdir" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_pkg_config_libdir=`echo "$cf_pkg_config_libdir" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:4672: error: expected a pathname, not \"$cf_pkg_config_libdir\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_pkg_config_libdir\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + ;; + esac +else + MAKE_PC_FILES="#" +fi + +if test -z "$MAKE_PC_FILES" +then + echo "$as_me:4686: checking for suffix to add to pkg-config files" >&5 +echo $ECHO_N "checking for suffix to add to pkg-config files... $ECHO_C" >&6 + +# Check whether --with-pc-suffix or --without-pc-suffix was given. +if test "${with_pc_suffix+set}" = set; then + withval="$with_pc_suffix" + case "x$withval" in + (xyes|xno) + PC_MODULE_SUFFIX= + ;; + (*) PC_MODULE_SUFFIX="$withval" + ;; + esac +fi; + test -z "$PC_MODULE_SUFFIX" && PC_MODULE_SUFFIX=none + echo "$as_me:4701: result: $PC_MODULE_SUFFIX" >&5 +echo "${ECHO_T}$PC_MODULE_SUFFIX" >&6 + test "$PC_MODULE_SUFFIX" = none && PC_MODULE_SUFFIX= + +fi + +echo "$as_me:4707: checking if we should assume mixed-case filenames" >&5 +echo $ECHO_N "checking if we should assume mixed-case filenames... $ECHO_C" >&6 + +# Check whether --enable-mixed-case or --disable-mixed-case was given. +if test "${enable_mixed_case+set}" = set; then + enableval="$enable_mixed_case" + enable_mixedcase=$enableval +else + enable_mixedcase=auto +fi; +echo "$as_me:4717: result: $enable_mixedcase" >&5 +echo "${ECHO_T}$enable_mixedcase" >&6 +if test "$enable_mixedcase" = "auto" ; then + +echo "$as_me:4721: checking if filesystem supports mixed-case filenames" >&5 +echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6 +if test "${cf_cv_mixedcase+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes ; then + case "$target_alias" in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi + +fi +echo "$as_me:4748: result: $cf_cv_mixedcase" >&5 +echo "${ECHO_T}$cf_cv_mixedcase" >&6 +test "$cf_cv_mixedcase" = yes && +cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + +else + cf_cv_mixedcase=$enable_mixedcase + if test "x$enable_mixedcase" = "xyes" ; then + +cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + + fi +fi + +# do this after mixed-case option (tags/TAGS is not as important as tic). +echo "$as_me:4767: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:4787: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:4791: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +echo "$as_me:4796: checking for \".PHONY\" make-support" >&5 +echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6 +if test "${cf_cv_make_PHONY+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -rf conftest* + ( + mkdir conftest || exit 1 + cd conftest + cat >makefile <<'CF_EOF' +.PHONY: always +DATA=0 +always: always.out + @echo "** making $@ $(DATA)" +once: once.out + @echo "** making $@ $(DATA)" +always.out: + @echo "** making $@ $(DATA)" + echo $(DATA) > $@ +once.out: + @echo "** making $@ $(DATA)" + echo $(DATA) > $@ +CF_EOF + for cf_data in 1 2 3 + do + ${MAKE:-make} always DATA=$cf_data + ${MAKE:-make} once DATA=$cf_data + ${MAKE:-make} -t always once + if test -f always ; then + echo "no (case 1)" > ../conftest.tmp + elif test ! -f always.out ; then + echo "no (case 2)" > ../conftest.tmp + elif test ! -f once.out ; then + echo "no (case 3)" > ../conftest.tmp + elif ! cmp -s always.out once.out ; then + echo "no (case 4)" > ../conftest.tmp + diff always.out once.out + else + cf_check="`cat always.out`" + if test "x$cf_check" != "x$cf_data" ; then + echo "no (case 5)" > ../conftest.tmp + else + echo yes > ../conftest.tmp + rm -f ./*.out + continue + fi + fi + break + done + ) >&5 2>&1 + cf_cv_make_PHONY="`cat conftest.tmp`" + rm -rf conftest* + +fi +echo "$as_me:4851: result: $cf_cv_make_PHONY" >&5 +echo "${ECHO_T}$cf_cv_make_PHONY" >&6 +MAKE_NO_PHONY="#" +MAKE_PHONY="#" +test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY= +test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY= + +for ac_prog in exctags ctags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:4862: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CTAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CTAGS"; then + ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CTAGS="$ac_prog" +echo "$as_me:4877: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CTAGS=$ac_cv_prog_CTAGS +if test -n "$CTAGS"; then + echo "$as_me:4885: result: $CTAGS" >&5 +echo "${ECHO_T}$CTAGS" >&6 +else + echo "$as_me:4888: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CTAGS" && break +done + +for ac_prog in exetags etags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:4899: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ETAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ETAGS"; then + ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ETAGS="$ac_prog" +echo "$as_me:4914: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ETAGS=$ac_cv_prog_ETAGS +if test -n "$ETAGS"; then + echo "$as_me:4922: result: $ETAGS" >&5 +echo "${ECHO_T}$ETAGS" >&6 +else + echo "$as_me:4925: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ETAGS" && break +done + +# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args. +set dummy ${CTAGS:-ctags}; ac_word=$2 +echo "$as_me:4934: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_LOWER_TAGS"; then + ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_LOWER_TAGS="yes" +echo "$as_me:4949: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no" +fi +fi +MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS +if test -n "$MAKE_LOWER_TAGS"; then + echo "$as_me:4958: result: $MAKE_LOWER_TAGS" >&5 +echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 +else + echo "$as_me:4961: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cf_cv_mixedcase" = yes ; then + # Extract the first word of "${ETAGS:-etags}", so it can be a program name with args. +set dummy ${ETAGS:-etags}; ac_word=$2 +echo "$as_me:4968: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_UPPER_TAGS"; then + ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_UPPER_TAGS="yes" +echo "$as_me:4983: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no" +fi +fi +MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS +if test -n "$MAKE_UPPER_TAGS"; then + echo "$as_me:4992: result: $MAKE_UPPER_TAGS" >&5 +echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 +else + echo "$as_me:4995: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +echo "$as_me:5015: checking for makeflags variable" >&5 +echo $ECHO_N "checking for makeflags variable... $ECHO_C" >&6 +if test "${cf_cv_makeflags+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_makeflags='' + for cf_option in '-${MAKEFLAGS}' '${MFLAGS}' + do + cat >cf_makeflags.tmp </dev/null | ${FGREP-fgrep} -v "ing directory" | sed -e 's,[ ]*$,,'` + case "$cf_result" in + (.*k|.*kw) + cf_result="`${MAKE:-make} -k -f cf_makeflags.tmp CC=cc 2>/dev/null`" + case "$cf_result" in + (.*CC=*) cf_cv_makeflags= + ;; + (*) cf_cv_makeflags=$cf_option + ;; + esac + break + ;; + (.-) + ;; + (*) + +echo "${as_me:-configure}:5045: testing given option \"$cf_option\",no match \"$cf_result\" ..." 1>&5 + + ;; + esac + done + rm -f cf_makeflags.tmp + +fi +echo "$as_me:5053: result: $cf_cv_makeflags" >&5 +echo "${ECHO_T}$cf_cv_makeflags" >&6 + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:5059: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" +echo "$as_me:5074: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:5082: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:5085: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:5094: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_RANLIB="ranlib" +echo "$as_me:5109: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB="':'" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:5118: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:5121: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. +set dummy ${ac_tool_prefix}ld; ac_word=$2 +echo "$as_me:5133: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LD"; then + ac_cv_prog_LD="$LD" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LD="${ac_tool_prefix}ld" +echo "$as_me:5148: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LD=$ac_cv_prog_LD +if test -n "$LD"; then + echo "$as_me:5156: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:5159: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_LD"; then + ac_ct_LD=$LD + # Extract the first word of "ld", so it can be a program name with args. +set dummy ld; ac_word=$2 +echo "$as_me:5168: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_LD"; then + ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_LD="ld" +echo "$as_me:5183: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_LD" && ac_cv_prog_ac_ct_LD="ld" +fi +fi +ac_ct_LD=$ac_cv_prog_ac_ct_LD +if test -n "$ac_ct_LD"; then + echo "$as_me:5192: result: $ac_ct_LD" >&5 +echo "${ECHO_T}$ac_ct_LD" >&6 +else + echo "$as_me:5195: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + LD=$ac_ct_LD +else + LD="$ac_cv_prog_LD" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:5207: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AR="${ac_tool_prefix}ar" +echo "$as_me:5222: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:5230: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:5233: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:5242: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_AR="ar" +echo "$as_me:5257: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:5266: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:5269: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. +set dummy ${ac_tool_prefix}nm; ac_word=$2 +echo "$as_me:5281: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + ac_cv_prog_NM="$NM" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_NM="${ac_tool_prefix}nm" +echo "$as_me:5296: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +NM=$ac_cv_prog_NM +if test -n "$NM"; then + echo "$as_me:5304: result: $NM" >&5 +echo "${ECHO_T}$NM" >&6 +else + echo "$as_me:5307: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_NM"; then + ac_ct_NM=$NM + # Extract the first word of "nm", so it can be a program name with args. +set dummy nm; ac_word=$2 +echo "$as_me:5316: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_NM"; then + ac_cv_prog_ac_ct_NM="$ac_ct_NM" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_NM="nm" +echo "$as_me:5331: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_NM" && ac_cv_prog_ac_ct_NM="nm" +fi +fi +ac_ct_NM=$ac_cv_prog_ac_ct_NM +if test -n "$ac_ct_NM"; then + echo "$as_me:5340: result: $ac_ct_NM" >&5 +echo "${ECHO_T}$ac_ct_NM" >&6 +else + echo "$as_me:5343: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + NM=$ac_ct_NM +else + NM="$ac_cv_prog_NM" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +echo "$as_me:5355: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AR="${ac_tool_prefix}ar" +echo "$as_me:5370: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + echo "$as_me:5378: result: $AR" >&5 +echo "${ECHO_T}$AR" >&6 +else + echo "$as_me:5381: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +echo "$as_me:5390: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_AR="ar" +echo "$as_me:5405: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="ar" +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + echo "$as_me:5414: result: $ac_ct_AR" >&5 +echo "${ECHO_T}$ac_ct_AR" >&6 +else + echo "$as_me:5417: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + AR=$ac_ct_AR +else + AR="$ac_cv_prog_AR" +fi + +echo "$as_me:5426: checking for options to update archives" >&5 +echo $ECHO_N "checking for options to update archives... $ECHO_C" >&6 +if test "${cf_cv_ar_flags+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + case "$cf_cv_system_name" in + (*-msvc*) + cf_cv_ar_flags='' + cat >mk_static_lib.sh <<-EOF + #!$SHELL + MSVC_BIN="$AR" + out="\$1" + shift + exec \$MSVC_BIN -out:"\$out" \$@ + EOF + chmod +x mk_static_lib.sh + AR=`pwd`/mk_static_lib.sh + ;; + (*) + cf_cv_ar_flags=unknown + for cf_ar_flags in -curvU -curv curv -crv crv -cqv cqv -rv rv + do + + # check if $ARFLAGS already contains this choice + if test "x$ARFLAGS" != "x" ; then + cf_check_ar_flags=`echo "x$ARFLAGS" | sed -e "s/$cf_ar_flags\$//" -e "s/$cf_ar_flags / /"` + if test "x$ARFLAGS" != "$cf_check_ar_flags" ; then + cf_cv_ar_flags= + break + fi + fi + + rm -f "conftest.$ac_cv_objext" + rm -f conftest.a + + cat >"conftest.$ac_ext" <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5469: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + echo "$AR $ARFLAGS $cf_ar_flags conftest.a conftest.$ac_cv_objext" >&5 + $AR $ARFLAGS "$cf_ar_flags" conftest.a "conftest.$ac_cv_objext" 2>&5 1>/dev/null + if test -f conftest.a ; then + cf_cv_ar_flags="$cf_ar_flags" + break + fi + else + test -n "$verbose" && echo " cannot compile test-program" 1>&6 + +echo "${as_me:-configure}:5480: testing cannot compile test-program ..." 1>&5 + + break + fi + done + rm -f conftest.a "conftest.$ac_ext" "conftest.$ac_cv_objext" + ;; + esac + +fi +echo "$as_me:5490: result: $cf_cv_ar_flags" >&5 +echo "${ECHO_T}$cf_cv_ar_flags" >&6 + +if test -n "$ARFLAGS" ; then + if test -n "$cf_cv_ar_flags" ; then + ARFLAGS="$ARFLAGS $cf_cv_ar_flags" + fi +else + ARFLAGS=$cf_cv_ar_flags +fi + +echo "$as_me:5501: checking for an installation directory prefix" >&5 +echo $ECHO_N "checking for an installation directory prefix... $ECHO_C" >&6 + +# Check whether --with-install-prefix or --without-install-prefix was given. +if test "${with_install_prefix+set}" = set; then + withval="$with_install_prefix" + case "x$withval" in + (xyes|xno) + ;; + (*) DESTDIR="$withval" + ;; + esac +fi; +echo "$as_me:5514: result: ${DESTDIR:-(none)}" >&5 +echo "${ECHO_T}${DESTDIR:-(none)}" >&6 + +echo "$as_me:5517: checking if installation directory prefix should be merged" >&5 +echo $ECHO_N "checking if installation directory prefix should be merged... $ECHO_C" >&6 + +# Check whether --enable-install-prefix or --disable-install-prefix was given. +if test "${enable_install_prefix+set}" = set; then + enableval="$enable_install_prefix" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + cf_install_prefix=yes + else + cf_install_prefix=no + fi +else + enableval=no + cf_install_prefix=no + +fi; +echo "$as_me:5534: result: $cf_install_prefix" >&5 +echo "${ECHO_T}$cf_install_prefix" >&6 + +if test "$cf_install_prefix" = yes ; then + MERGE_PREFIX=':$(prefix)%=%' +else + MERGE_PREFIX='' +fi + +############################################################################### + +# If we're cross-compiling, allow the user to override the tools and their +# options. The configure script is oriented toward identifying the host +# compiler, etc., but we need a build compiler to generate parts of the source. + +case "$cf_cv_system_name" in +(*-msvc*) + LDFLAGS="$LDFLAGS user32.lib" + export LDFLAGS + ;; +esac + +if test "$cross_compiling" = yes ; then + + # defaults that we might want to override + : ${BUILD_CFLAGS:=''} + : ${BUILD_CPPFLAGS:=''} + : ${BUILD_LDFLAGS:=''} + : ${BUILD_LIBS:=''} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} + +# Check whether --with-build-cc or --without-build-cc was given. +if test "${with_build_cc+set}" = set; then + withval="$with_build_cc" + BUILD_CC="$withval" +else + for ac_prog in gcc clang c99 c89 cc cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:5575: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_BUILD_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$BUILD_CC"; then + ac_cv_prog_BUILD_CC="$BUILD_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_BUILD_CC="$ac_prog" +echo "$as_me:5590: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +BUILD_CC=$ac_cv_prog_BUILD_CC +if test -n "$BUILD_CC"; then + echo "$as_me:5598: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 +else + echo "$as_me:5601: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$BUILD_CC" && break +done +test -n "$BUILD_CC" || BUILD_CC="none" + +fi; + echo "$as_me:5610: checking for native build C compiler" >&5 +echo $ECHO_N "checking for native build C compiler... $ECHO_C" >&6 + echo "$as_me:5612: result: $BUILD_CC" >&5 +echo "${ECHO_T}$BUILD_CC" >&6 + + echo "$as_me:5615: checking for native build C preprocessor" >&5 +echo $ECHO_N "checking for native build C preprocessor... $ECHO_C" >&6 + +# Check whether --with-build-cpp or --without-build-cpp was given. +if test "${with_build_cpp+set}" = set; then + withval="$with_build_cpp" + BUILD_CPP="$withval" +else + BUILD_CPP='${BUILD_CC} -E' +fi; + echo "$as_me:5625: result: $BUILD_CPP" >&5 +echo "${ECHO_T}$BUILD_CPP" >&6 + + echo "$as_me:5628: checking for native build C flags" >&5 +echo $ECHO_N "checking for native build C flags... $ECHO_C" >&6 + +# Check whether --with-build-cflags or --without-build-cflags was given. +if test "${with_build_cflags+set}" = set; then + withval="$with_build_cflags" + BUILD_CFLAGS="$withval" +fi; + echo "$as_me:5636: result: $BUILD_CFLAGS" >&5 +echo "${ECHO_T}$BUILD_CFLAGS" >&6 + + echo "$as_me:5639: checking for native build C preprocessor-flags" >&5 +echo $ECHO_N "checking for native build C preprocessor-flags... $ECHO_C" >&6 + +# Check whether --with-build-cppflags or --without-build-cppflags was given. +if test "${with_build_cppflags+set}" = set; then + withval="$with_build_cppflags" + BUILD_CPPFLAGS="$withval" +fi; + echo "$as_me:5647: result: $BUILD_CPPFLAGS" >&5 +echo "${ECHO_T}$BUILD_CPPFLAGS" >&6 + + echo "$as_me:5650: checking for native build linker-flags" >&5 +echo $ECHO_N "checking for native build linker-flags... $ECHO_C" >&6 + +# Check whether --with-build-ldflags or --without-build-ldflags was given. +if test "${with_build_ldflags+set}" = set; then + withval="$with_build_ldflags" + BUILD_LDFLAGS="$withval" +fi; + echo "$as_me:5658: result: $BUILD_LDFLAGS" >&5 +echo "${ECHO_T}$BUILD_LDFLAGS" >&6 + + echo "$as_me:5661: checking for native build linker-libraries" >&5 +echo $ECHO_N "checking for native build linker-libraries... $ECHO_C" >&6 + +# Check whether --with-build-libs or --without-build-libs was given. +if test "${with_build_libs+set}" = set; then + withval="$with_build_libs" + BUILD_LIBS="$withval" +fi; + echo "$as_me:5669: result: $BUILD_LIBS" >&5 +echo "${ECHO_T}$BUILD_LIBS" >&6 + + # this assumes we're on Unix. + BUILD_EXEEXT= + BUILD_OBJEXT=o + + : ${BUILD_CC:='${CC}'} + + echo "$as_me:5678: checking if the build-compiler \"$BUILD_CC\" works" >&5 +echo $ECHO_N "checking if the build-compiler \"$BUILD_CC\" works... $ECHO_C" >&6 + + cf_save_crossed=$cross_compiling + cf_save_ac_link=$ac_link + cross_compiling=no + cf_build_cppflags=$BUILD_CPPFLAGS + test "$cf_build_cppflags" = "#" && cf_build_cppflags= + ac_link='$BUILD_CC -o "conftest$ac_exeext" $BUILD_CFLAGS $cf_build_cppflags $BUILD_LDFLAGS "conftest.$ac_ext" $BUILD_LIBS >&5' + + if test "$cross_compiling" = yes; then + cf_ok_build_cc=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 5692 "configure" +#include "confdefs.h" +#include + int main(int argc, char *argv[]) + { + ${cf_cv_main_return:-return}(argc < 0 || argv == 0 || argv[0] == 0); + } + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:5702: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5705: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:5707: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5710: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_ok_build_cc=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_ok_build_cc=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + + cross_compiling=$cf_save_crossed + ac_link=$cf_save_ac_link + + echo "$as_me:5725: result: $cf_ok_build_cc" >&5 +echo "${ECHO_T}$cf_ok_build_cc" >&6 + + if test "$cf_ok_build_cc" != yes + then + { { echo "$as_me:5730: error: Cross-build requires two compilers. +Use --with-build-cc to specify the native compiler." >&5 +echo "$as_me: error: Cross-build requires two compilers. +Use --with-build-cc to specify the native compiler." >&2;} + { (exit 1); exit 1; }; } + fi + +else + : ${BUILD_CC:='${CC}'} + : ${BUILD_CPP:='${CPP}'} + : ${BUILD_CFLAGS:='${CFLAGS}'} + : ${BUILD_CPPFLAGS:='${CPPFLAGS}'} + : ${BUILD_LDFLAGS:='${LDFLAGS}'} + : ${BUILD_LIBS:='${LIBS}'} + : ${BUILD_EXEEXT:='$x'} + : ${BUILD_OBJEXT:='o'} +fi + +############################################################################### + +### Options to allow the user to specify the set of libraries which are used. +### Use "--without-normal --with-shared" to allow the default model to be +### shared, for example. +cf_list_models="" + +echo "$as_me:5755: checking if libtool -version-number should be used" >&5 +echo $ECHO_N "checking if libtool -version-number should be used... $ECHO_C" >&6 + +# Check whether --enable-libtool-version or --disable-libtool-version was given. +if test "${enable_libtool_version+set}" = set; then + enableval="$enable_libtool_version" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_libtool_version=no + else + cf_libtool_version=yes + fi +else + enableval=yes + cf_libtool_version=yes + +fi; +echo "$as_me:5772: result: $cf_libtool_version" >&5 +echo "${ECHO_T}$cf_libtool_version" >&6 + +if test "$cf_libtool_version" = yes ; then + LIBTOOL_VERSION="-version-number" +else + LIBTOOL_VERSION="-version-info" + case "x$VERSION" in + (x) + { echo "$as_me:5781: WARNING: VERSION was not set" >&5 +echo "$as_me: WARNING: VERSION was not set" >&2;} + ;; + (x*.*.*) + ABI_VERSION="$VERSION" + test -n "$verbose" && echo " ABI_VERSION: $ABI_VERSION" 1>&6 + +echo "${as_me:-configure}:5788: testing ABI_VERSION: $ABI_VERSION ..." 1>&5 + + ;; + (x*:*:*) + ABI_VERSION=`echo "$VERSION" | sed -e 's/:/./g'` + test -n "$verbose" && echo " ABI_VERSION: $ABI_VERSION" 1>&6 + +echo "${as_me:-configure}:5795: testing ABI_VERSION: $ABI_VERSION ..." 1>&5 + + ;; + (*) + { echo "$as_me:5799: WARNING: unexpected VERSION value: $VERSION" >&5 +echo "$as_me: WARNING: unexpected VERSION value: $VERSION" >&2;} + ;; + esac +fi + +LIBTOOL= + +# common library maintenance symbols that are convenient for libtool scripts: +LIB_CREATE='${AR} -cr' +LIB_OBJECT='${OBJECTS}' +LIB_SUFFIX=.a +LIB_PREP="$RANLIB" + +# symbols used to prop libtool up to enable it to determine what it should be +# doing: +LIB_CLEAN= +LIB_COMPILE= +LIB_LINK='${CC}' +LIB_INSTALL= +LIB_UNINSTALL= + +echo "$as_me:5821: checking if you want to build libraries with libtool" >&5 +echo $ECHO_N "checking if you want to build libraries with libtool... $ECHO_C" >&6 + +# Check whether --with-libtool or --without-libtool was given. +if test "${with_libtool+set}" = set; then + withval="$with_libtool" + with_libtool=$withval +else + with_libtool=no +fi; +echo "$as_me:5831: result: $with_libtool" >&5 +echo "${ECHO_T}$with_libtool" >&6 +if test "$with_libtool" != "no"; then + + if test "$with_libtool" != "yes" ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$with_libtool" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval with_libtool="$with_libtool" + case "x$with_libtool" in + (xNONE/*) + with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + with_libtool=`echo "$with_libtool" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:5860: error: expected a pathname, not \"$with_libtool\"" >&5 +echo "$as_me: error: expected a pathname, not \"$with_libtool\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + LIBTOOL=$with_libtool + else + if test -n "$ac_tool_prefix"; then + for ac_prog in libtool glibtool + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:5873: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LIBTOOL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LIBTOOL"; then + ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LIBTOOL="$ac_tool_prefix$ac_prog" +echo "$as_me:5888: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LIBTOOL=$ac_cv_prog_LIBTOOL +if test -n "$LIBTOOL"; then + echo "$as_me:5896: result: $LIBTOOL" >&5 +echo "${ECHO_T}$LIBTOOL" >&6 +else + echo "$as_me:5899: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LIBTOOL" && break + done +fi +if test -z "$LIBTOOL"; then + ac_ct_LIBTOOL=$LIBTOOL + for ac_prog in libtool glibtool +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:5912: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_LIBTOOL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_LIBTOOL"; then + ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_LIBTOOL="$ac_prog" +echo "$as_me:5927: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL +if test -n "$ac_ct_LIBTOOL"; then + echo "$as_me:5935: result: $ac_ct_LIBTOOL" >&5 +echo "${ECHO_T}$ac_ct_LIBTOOL" >&6 +else + echo "$as_me:5938: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_LIBTOOL" && break +done +test -n "$ac_ct_LIBTOOL" || ac_ct_LIBTOOL="none" + + LIBTOOL=$ac_ct_LIBTOOL +fi + +if test -n "$LIBTOOL" && test "$LIBTOOL" != none +then + cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'` +else + cf_cv_libtool_version= +fi +test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version + + if test -z "$cf_cv_libtool_version" && test "$LIBTOOL" = libtool + then + +unset ac_cv_prog_ac_ct_LIBTOOL +unset ac_ct_LIBTOOL +unset LIBTOOL + + if test -n "$ac_tool_prefix"; then + for ac_prog in glibtool + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:5969: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LIBTOOL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LIBTOOL"; then + ac_cv_prog_LIBTOOL="$LIBTOOL" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LIBTOOL="$ac_tool_prefix$ac_prog" +echo "$as_me:5984: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LIBTOOL=$ac_cv_prog_LIBTOOL +if test -n "$LIBTOOL"; then + echo "$as_me:5992: result: $LIBTOOL" >&5 +echo "${ECHO_T}$LIBTOOL" >&6 +else + echo "$as_me:5995: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LIBTOOL" && break + done +fi +if test -z "$LIBTOOL"; then + ac_ct_LIBTOOL=$LIBTOOL + for ac_prog in glibtool +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:6008: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_LIBTOOL+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_LIBTOOL"; then + ac_cv_prog_ac_ct_LIBTOOL="$ac_ct_LIBTOOL" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_LIBTOOL="$ac_prog" +echo "$as_me:6023: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_LIBTOOL=$ac_cv_prog_ac_ct_LIBTOOL +if test -n "$ac_ct_LIBTOOL"; then + echo "$as_me:6031: result: $ac_ct_LIBTOOL" >&5 +echo "${ECHO_T}$ac_ct_LIBTOOL" >&6 +else + echo "$as_me:6034: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_LIBTOOL" && break +done +test -n "$ac_ct_LIBTOOL" || ac_ct_LIBTOOL="none" + + LIBTOOL=$ac_ct_LIBTOOL +fi + +if test -n "$LIBTOOL" && test "$LIBTOOL" != none +then + cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'` +else + cf_cv_libtool_version= +fi +test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version + + fi + fi + if test -z "$LIBTOOL" ; then + { { echo "$as_me:6056: error: Cannot find libtool" >&5 +echo "$as_me: error: Cannot find libtool" >&2;} + { (exit 1); exit 1; }; } + fi + LIB_CREATE='${LIBTOOL} --mode=link ${CC} -rpath ${libdir} ${LIBTOOL_VERSION} `cut -f1 ${top_srcdir}/VERSION` ${LIBTOOL_OPTS} ${LT_UNDEF} $(LIBS) -o' + LIB_OBJECT='${OBJECTS:.o=.lo}' + LIB_SUFFIX=.la + LIB_CLEAN='${LIBTOOL} --mode=clean' + LIB_COMPILE='${LIBTOOL} --mode=compile' + LIB_LINK='${LIBTOOL} --mode=link ${CC} ${LIBTOOL_OPTS}' + LIB_INSTALL='${LIBTOOL} --mode=install' + LIB_UNINSTALL='${LIBTOOL} --mode=uninstall' + LIB_PREP=: + +if test -n "$LIBTOOL" && test "$LIBTOOL" != none +then + echo "$as_me:6072: checking version of $LIBTOOL" >&5 +echo $ECHO_N "checking version of $LIBTOOL... $ECHO_C" >&6 + +if test -n "$LIBTOOL" && test "$LIBTOOL" != none +then + cf_cv_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' |sed -e '2,$d' -e 's/([^)]*)//g' -e 's/^[^1-9]*//' -e 's/[^0-9.].*//'` +else + cf_cv_libtool_version= +fi +test -z "$cf_cv_libtool_version" && unset cf_cv_libtool_version + + echo "$as_me:6083: result: $cf_cv_libtool_version" >&5 +echo "${ECHO_T}$cf_cv_libtool_version" >&6 + + if test -n "$cf_cv_libtool_version" + then + cf_check_libtool_version=`$LIBTOOL --version 2>&1 | sed -e '/^$/d' -e 's,[()],...,g' -e 's,[ ],-,g' -e '2,$d'` + case "x$cf_check_libtool_version" in + (*...GNU-libtool...*) + ;; + (*) + { { echo "$as_me:6093: error: This is not GNU libtool" >&5 +echo "$as_me: error: This is not GNU libtool" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + else + { { echo "$as_me:6099: error: No version found for $LIBTOOL" >&5 +echo "$as_me: error: No version found for $LIBTOOL" >&2;} + { (exit 1); exit 1; }; } + fi + +else + { { echo "$as_me:6105: error: GNU libtool has not been found" >&5 +echo "$as_me: error: GNU libtool has not been found" >&2;} + { (exit 1); exit 1; }; } +fi + + # special hack to add -no-undefined (which libtool should do for itself) + LT_UNDEF= + case "$cf_cv_system_name" in + (cygwin*|msys*|mingw32*|os2*|uwin*|aix[4-7]) + LT_UNDEF=-no-undefined + ;; + esac + + # special hack to add --tag option for C++ compiler + case "$cf_cv_libtool_version" in + (1.[5-9]*|[2-9].[0-9.a-z]*) + LIBTOOL_CXX="$LIBTOOL --tag=CXX" + LIBTOOL="$LIBTOOL --tag=CC" + ;; + (*) + LIBTOOL_CXX="$LIBTOOL" + ;; + esac +else + LIBTOOL="" + LIBTOOL_CXX="" +fi + +test -z "$LIBTOOL" && ECHO_LT= + +if test "$with_libtool" != "no" ; then + +cf_list_models="$cf_list_models libtool" + +else + +echo "$as_me:6141: checking if you want to build shared libraries" >&5 +echo $ECHO_N "checking if you want to build shared libraries... $ECHO_C" >&6 + +# Check whether --with-shared or --without-shared was given. +if test "${with_shared+set}" = set; then + withval="$with_shared" + with_shared=$withval +else + with_shared=no +fi; +echo "$as_me:6151: result: $with_shared" >&5 +echo "${ECHO_T}$with_shared" >&6 +test "x$with_shared" = "xyes" && cf_list_models="$cf_list_models shared" + +echo "$as_me:6155: checking if you want to build static libraries" >&5 +echo $ECHO_N "checking if you want to build static libraries... $ECHO_C" >&6 + +# Check whether --with-normal or --without-normal was given. +if test "${with_normal+set}" = set; then + withval="$with_normal" + with_normal=$withval +else + with_normal=yes +fi; +echo "$as_me:6165: result: $with_normal" >&5 +echo "${ECHO_T}$with_normal" >&6 +test "x$with_normal" = "xyes" && cf_list_models="$cf_list_models normal" + +echo "$as_me:6169: checking if you want to build debug libraries" >&5 +echo $ECHO_N "checking if you want to build debug libraries... $ECHO_C" >&6 + +# Check whether --with-debug or --without-debug was given. +if test "${with_debug+set}" = set; then + withval="$with_debug" + with_debug=$withval +else + with_debug=yes +fi; +echo "$as_me:6179: result: $with_debug" >&5 +echo "${ECHO_T}$with_debug" >&6 +test "x$with_debug" = "xyes" && cf_list_models="$cf_list_models debug" + +echo "$as_me:6183: checking if you want to build profiling libraries" >&5 +echo $ECHO_N "checking if you want to build profiling libraries... $ECHO_C" >&6 + +# Check whether --with-profile or --without-profile was given. +if test "${with_profile+set}" = set; then + withval="$with_profile" + with_profile=$withval +else + with_profile=no +fi; +echo "$as_me:6193: result: $with_profile" >&5 +echo "${ECHO_T}$with_profile" >&6 +test "x$with_profile" = "xyes" && cf_list_models="$cf_list_models profile" + +fi + +if test "X$cf_with_cxx_binding" != Xno; then +if test "x$with_shared" = "xyes"; then +echo "$as_me:6201: checking if you want to build C++ shared libraries" >&5 +echo $ECHO_N "checking if you want to build C++ shared libraries... $ECHO_C" >&6 + +# Check whether --with-cxx-shared or --without-cxx-shared was given. +if test "${with_cxx_shared+set}" = set; then + withval="$with_cxx_shared" + with_shared_cxx=$withval +else + with_shared_cxx=no +fi; +echo "$as_me:6211: result: $with_shared_cxx" >&5 +echo "${ECHO_T}$with_shared_cxx" >&6 +fi +fi + +############################################################################### + +echo "$as_me:6218: checking for specified models" >&5 +echo $ECHO_N "checking for specified models... $ECHO_C" >&6 +test -z "$cf_list_models" && cf_list_models=normal +test "$with_libtool" != "no" && cf_list_models=libtool +echo "$as_me:6222: result: $cf_list_models" >&5 +echo "${ECHO_T}$cf_list_models" >&6 + +### Use the first model as the default, and save its suffix for use in building +### up test-applications. +echo "$as_me:6227: checking for default model" >&5 +echo $ECHO_N "checking for default model... $ECHO_C" >&6 +DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'` +echo "$as_me:6230: result: $DFT_LWR_MODEL" >&5 +echo "${ECHO_T}$DFT_LWR_MODEL" >&6 + +DFT_UPR_MODEL=`echo "$DFT_LWR_MODEL" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +TICS_NAME=tic + +TINFO_NAME=tinfo + +LIB_NAME=ncurses + +LIB_DIR=../lib +LIB_2ND=../../lib + +echo "$as_me:6244: checking if you want to have a library-prefix" >&5 +echo $ECHO_N "checking if you want to have a library-prefix... $ECHO_C" >&6 + +# Check whether --with-lib-prefix or --without-lib-prefix was given. +if test "${with_lib_prefix+set}" = set; then + withval="$with_lib_prefix" + with_lib_prefix=$withval +else + with_lib_prefix=auto +fi; +echo "$as_me:6254: result: $with_lib_prefix" >&5 +echo "${ECHO_T}$with_lib_prefix" >&6 + +if test "$with_lib_prefix" = auto +then + + case "$cf_cv_system_name" in + (OS/2*|os2*) + if test "$DFT_LWR_MODEL" = libtool; then + LIB_PREFIX='lib' + else + LIB_PREFIX='' + fi + ;; + (*-msvc*) + LIB_PREFIX='' + ;; + (*) LIB_PREFIX='lib' + ;; + esac +cf_prefix=$LIB_PREFIX + +elif test "$with_lib_prefix" = no +then + LIB_PREFIX= +else + LIB_PREFIX=$with_lib_prefix +fi + +LIB_SUFFIX= + + echo "$as_me:6285: checking for PATH separator" >&5 +echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6 + case "$cf_cv_system_name" in + (os2*) PATH_SEPARATOR=';' ;; + (*) ${PATH_SEPARATOR:=':'} ;; + esac + + echo "$as_me:6292: result: $PATH_SEPARATOR" >&5 +echo "${ECHO_T}$PATH_SEPARATOR" >&6 + +# headers needed for checks... +echo "$as_me:6296: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6302 "configure" +#include "confdefs.h" +#include +#include +#include +#include + +_ACEOF +if { (eval echo "$as_me:6310: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6316: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_stdc=no +fi +rm -f conftest.err "conftest.$ac_ext" + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >"conftest.$ac_ext" <<_ACEOF +#line 6338 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >"conftest.$ac_ext" <<_ACEOF +#line 6356 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6377 "configure" +#include "confdefs.h" +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main (void) +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + $ac_main_return(2); + $ac_main_return (0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:6403: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6406: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:6408: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6411: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_header_stdc=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +fi +echo "$as_me:6424: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6440: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6446 "configure" +#include "confdefs.h" +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6452: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6455: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6458: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6461: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Header=no" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:6471: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking whether exit is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_exit+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6487 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +#ifndef exit + (void) exit; +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6502: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6505: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6508: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6511: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_have_decl_exit=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_have_decl_exit=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:6521: result: $ac_cv_have_decl_exit" >&5 +echo "${ECHO_T}$ac_cv_have_decl_exit" >&6 + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +echo "$as_me:6527: checking for $ac_hdr that defines DIR" >&5 +echo $ECHO_N "checking for $ac_hdr that defines DIR... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6533 "configure" +#include "confdefs.h" +#include +#include <$ac_hdr> + +int +main (void) +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6548: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6551: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6554: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6557: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Header=no" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:6567: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for opendir in -ldir... $ECHO_C" >&6 +if test "${ac_cv_lib_dir_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldir $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 6588 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (void); +int +main (void) +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6607: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6610: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6613: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6616: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dir_opendir=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dir_opendir=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:6627: result: $ac_cv_lib_dir_opendir" >&5 +echo "${ECHO_T}$ac_cv_lib_dir_opendir" >&6 +if test "$ac_cv_lib_dir_opendir" = yes; then + LIBS="$LIBS -ldir" +fi + +else + echo "$as_me:6634: checking for opendir in -lx" >&5 +echo $ECHO_N "checking for opendir in -lx... $ECHO_C" >&6 +if test "${ac_cv_lib_x_opendir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lx $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 6642 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir (void); +int +main (void) +{ +opendir (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6661: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6664: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6667: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6670: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_x_opendir=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_x_opendir=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:6681: result: $ac_cv_lib_x_opendir" >&5 +echo "${ECHO_T}$ac_cv_lib_x_opendir" >&6 +if test "$ac_cv_lib_x_opendir" = yes; then + LIBS="$LIBS -lx" +fi + +fi + +############################################################################### + +echo "$as_me:6691: checking if you want to build a separate terminfo library" >&5 +echo $ECHO_N "checking if you want to build a separate terminfo library... $ECHO_C" >&6 + +# Check whether --with-termlib or --without-termlib was given. +if test "${with_termlib+set}" = set; then + withval="$with_termlib" + with_termlib=$withval +else + with_termlib=no +fi; +echo "$as_me:6701: result: $with_termlib" >&5 +echo "${ECHO_T}$with_termlib" >&6 + +echo "$as_me:6704: checking if you want to build a separate tic library" >&5 +echo $ECHO_N "checking if you want to build a separate tic library... $ECHO_C" >&6 + +# Check whether --with-ticlib or --without-ticlib was given. +if test "${with_ticlib+set}" = set; then + withval="$with_ticlib" + with_ticlib=$withval +else + with_ticlib=no +fi; +echo "$as_me:6714: result: $with_ticlib" >&5 +echo "${ECHO_T}$with_ticlib" >&6 + +if test X"$CC_G_OPT" = X"" ; then + CC_G_OPT='-g' + test -n "$GCC" && test "x${ac_cv_prog_cc_g}" != xyes && CC_G_OPT='' +fi + +if test X"$CXX_G_OPT" = X"" ; then + CXX_G_OPT='-g' + test -n "$GXX" && test "x${ac_cv_prog_cxx_g}" != xyes && CXX_G_OPT='' +fi + +echo "$as_me:6727: checking for default loader flags" >&5 +echo $ECHO_N "checking for default loader flags... $ECHO_C" >&6 +case "$DFT_LWR_MODEL" in +(libtool) LD_MODEL='' ;; +(normal) LD_MODEL='' ;; +(debug) LD_MODEL=$CC_G_OPT ;; +(profile) LD_MODEL='-pg';; +(shared) LD_MODEL='' ;; +esac +echo "$as_me:6736: result: ${LD_MODEL:-(none)}" >&5 +echo "${ECHO_T}${LD_MODEL:-(none)}" >&6 + +case "$DFT_LWR_MODEL" in +(shared) + +echo "$as_me:6742: checking if rpath option should be used" >&5 +echo $ECHO_N "checking if rpath option should be used... $ECHO_C" >&6 + +# Check whether --enable-rpath or --disable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval="$enable_rpath" + cf_cv_enable_rpath=$enableval +else + cf_cv_enable_rpath=no +fi; +echo "$as_me:6752: result: $cf_cv_enable_rpath" >&5 +echo "${ECHO_T}$cf_cv_enable_rpath" >&6 + +echo "$as_me:6755: checking if shared libraries should be relinked during install" >&5 +echo $ECHO_N "checking if shared libraries should be relinked during install... $ECHO_C" >&6 + +# Check whether --enable-relink or --disable-relink was given. +if test "${enable_relink+set}" = set; then + enableval="$enable_relink" + cf_cv_do_relink=$enableval +else + cf_cv_do_relink=yes +fi; +echo "$as_me:6765: result: $cf_cv_do_relink" >&5 +echo "${ECHO_T}$cf_cv_do_relink" >&6 + ;; +esac + +# we will build libraries one-level down. +rel_builddir=.. + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + echo "$as_me:6776: checking for an rpath option" >&5 +echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6 + case "$cf_cv_system_name" in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[2-9].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + echo "$as_me:6807: result: $LD_RPATH_OPT" >&5 +echo "${ECHO_T}$LD_RPATH_OPT" >&6 + + case "x$LD_RPATH_OPT" in + (x-R*) + echo "$as_me:6812: checking if we need a space after rpath option" >&5 +echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6 + cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 6833 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6845: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6848: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6851: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6854: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_rpath_space=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_rpath_space=yes +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + echo "$as_me:6864: result: $cf_rpath_space" >&5 +echo "${ECHO_T}$cf_rpath_space" >&6 + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi + + RM_SHARED_OPTS= + LOCAL_LDFLAGS= + LOCAL_LDFLAGS2= + LD_SHARED_OPTS= + INSTALL_LIB="-m 644" + : ${rel_builddir:=.} + + shlibdir=$libdir + + MAKE_DLLS="#" + + cf_cv_do_symlinks=no + cf_ld_rpath_opt= + test "$cf_cv_enable_rpath" = yes && cf_ld_rpath_opt="$LD_RPATH_OPT" + + echo "$as_me:6886: checking whether to use release or ABI version in shared library file names" >&5 +echo $ECHO_N "checking whether to use release or ABI version in shared library file names... $ECHO_C" >&6 + +# Check whether --with-shlib-version or --without-shlib-version was given. +if test "${with_shlib_version+set}" = set; then + withval="$with_shlib_version" + test -z "$withval" && withval=auto + case "$withval" in + (yes) + cf_cv_shlib_version=auto + ;; + (rel|abi|auto) + cf_cv_shlib_version=$withval + ;; + (*) + echo "$as_me:6901: result: $withval" >&5 +echo "${ECHO_T}$withval" >&6 + { { echo "$as_me:6903: error: option value must be one of: rel, abi, or auto" >&5 +echo "$as_me: error: option value must be one of: rel, abi, or auto" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + +else + cf_cv_shlib_version=auto +fi; + echo "$as_me:6912: result: $cf_cv_shlib_version" >&5 +echo "${ECHO_T}$cf_cv_shlib_version" >&6 + + cf_cv_rm_so_locs=no + cf_try_cflags= + + # Some less-capable ports of gcc support only -fpic + CC_SHARED_OPTS= + + cf_try_fPIC=no + if test "$GCC" = yes + then + cf_try_fPIC=yes + else + case "$cf_cv_system_name" in + (*linux*) # e.g., PGI compiler + cf_try_fPIC=yes + ;; + esac + fi + + if test "$cf_try_fPIC" = yes + then + echo "$as_me:6935: checking which $CC option to use" >&5 +echo $ECHO_N "checking which $CC option to use... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + for CC_SHARED_OPTS in -fPIC -fpic '' + do + CFLAGS="$cf_save_CFLAGS $CC_SHARED_OPTS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 6942 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +int x = 1; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6954: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6957: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6960: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6963: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done + echo "$as_me:6972: result: $CC_SHARED_OPTS" >&5 +echo "${ECHO_T}$CC_SHARED_OPTS" >&6 + CFLAGS="$cf_save_CFLAGS" + fi + + cf_cv_shlib_version_infix=no + + case "$cf_cv_system_name" in + (aix4.3-9*|aix[5-7]*) + if test "$GCC" = yes; then + CC_SHARED_OPTS='-Wl,-brtl' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@' + else + CC_SHARED_OPTS='-brtl' + # as well as '-qpic=large -G' or perhaps "-bM:SRE -bnoentry -bexpall" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -G -Wl,-brtl -Wl,-blibpath:${RPATH_LIST}:/usr/lib -o $@' + fi + ;; + (beos*) + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -o $@ -Xlinker -soname=`basename $@` -nostart -e 0' + ;; + (cygwin*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=cygdll + cf_cv_shlib_version_infix=cygdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/cyg/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (msys*) + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cf_cv_shlib_version=msysdll + cf_cv_shlib_version_infix=msysdll + shlibdir=$bindir + MAKE_DLLS= + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/msys-/lib/' -e 's/[0-9]*\.dll$/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + exec \$* ${LDFLAGS} -shared -Wl,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (darwin*) + cf_try_cflags="no-cpp-precomp" + CC_SHARED_OPTS="-dynamic" + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dynamiclib -install_name ${libdir}/`basename $@` -compatibility_version ${ABI_VERSION} -current_version ${ABI_VERSION} -o $@' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi + cf_cv_shlib_version_infix=yes + echo "$as_me:7043: checking if ld -search_paths_first works" >&5 +echo $ECHO_N "checking if ld -search_paths_first works... $ECHO_C" >&6 +if test "${cf_cv_ldflags_search_paths_first+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + cat >"conftest.$ac_ext" <<_ACEOF +#line 7052 "configure" +#include "confdefs.h" + +int +main (void) +{ +int i; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7064: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7067: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7070: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7073: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ldflags_search_paths_first=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ldflags_search_paths_first=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LDFLAGS=$cf_save_LDFLAGS +fi +echo "$as_me:7084: result: $cf_cv_ldflags_search_paths_first" >&5 +echo "${ECHO_T}$cf_cv_ldflags_search_paths_first" >&6 + if test "$cf_cv_ldflags_search_paths_first" = yes; then + LDFLAGS="$LDFLAGS -Wl,-search_paths_first" + fi + ;; + (haiku*) + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (hpux[7-8]*) + # HP-UX 8.07 ld lacks "+b" option used for libdir search-list + if test "$GCC" != yes; then + CC_SHARED_OPTS='+Z' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -b -o $@' + INSTALL_LIB="-m 555" + ;; + (hpux*) + # (tested with gcc 2.7.2 -- I don't have c89) + if test "$GCC" = yes; then + LD_SHARED_OPTS='-Xlinker +b -Xlinker ${libdir}' + else + CC_SHARED_OPTS='+Z' + LD_SHARED_OPTS='-Wl,+b,${libdir}' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} +b ${libdir} -b -o $@' + # HP-UX shared libraries must be executable, and should be + # readonly to exploit a quirk in the memory manager. + INSTALL_LIB="-m 555" + ;; + (interix*) + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_shared_soname='`basename $@`' + fi + CC_SHARED_OPTS= + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-rpath,${RPATH_LIST} -Wl,-h,'$cf_shared_soname' -o $@' + ;; + (irix*) + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + # tested with IRIX 5.2 and 'cc'. + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -rdata_shared -soname `basename $@` -o $@' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,`basename $@` -o $@' + fi + cf_cv_rm_so_locs=yes + ;; + (linux*|gnu*|k*bsd*-gnu) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (mingw*msvc*) + cf_cv_shlib_version=msvcdll + cf_cv_shlib_version_infix=msvcdll + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-link -dll" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-link -dll $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${LD} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.lib" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.lib/'\` + shift + my_ld=\$1 + shift + cat <<-EOF + Linking shared library + ** SHARED LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + args=\$(echo \$* | sed -E "s#-l(\w*)#\1.dll.lib#g" | sed -E "s#-L(\w*)#-LIBPATH:\1#g") + exec \$my_ld -DLL -IMPLIB:"\${IMPORT_LIB}" -OUT:"\${SHARED_LIB}" ${LDFLAGS} \$args + mv "\${IMPORT_LIB}" "\${IMPORT_LIB}" +CF_EOF + chmod +x mk_shared_lib.sh + cat >mk_prog.sh <<-CF_EOF + #!$SHELL + shift + # Ignore first argument (compiler) and use LD (link.exe) unconditionally + LD="$LD" + clopts=() + ldopts=("/subsystem:console") + libs=() + isdll=0 + while test \$# -gt 0; do + case "\$1" in + -link) + # ignore -link argument + ;; + -M[TD] | -M[TD]d) + # ignore runtime-library option + ;; + -dll) + isdll=1 + ;; + -W* | -w*) + # ignore warnings + ;; + -D*) + clopts+=("\$1") + ;; + -I*) + clopts+=("\$1") + ;; + -l*) + libs+=("\`echo \"\$1\" | sed \"s/^-l//\"\`") + ;; + -L*) + ldopts+=("\`echo \"\$1\" | sed \"s/^-L/-LIBPATH:/\"\`") + ;; + *.obj | *.o) + ldopts+=("\$1") + ;; + -Wl,*) + for linkarg in \`echo '\$1' | sed -e 's/-Wl,//' -e 's/,/ /'\`; do + ldopts+=("\${linkarg}") + done + ;; + *.lib) + ldopts+=("\$1") + ;; + -o) + shift + ldopts+=("-out:\$1") + ;; + *) + clopts+=("\$1") + ldopts+=("\$1") + ;; + esac + shift + done + if [ "\$isdll" -ne 0 ]; then + for lib in \${libs[*]}; do + ldopts+=("\$lib.dll.lib") + done + else + for lib in \${libs[*]}; do + ldopts+=("\$lib.lib") + done + fi + cat <<-EOF + Creating program + ** ld options: "\${ldopts[@]}" +EOF + exec \$LD \${ldopts[@]} +CF_EOF + chmod +x mk_prog.sh + LINK_PROGS="$SHELL ${rel_builddir}/mk_prog.sh" + LINK_TESTS="$SHELL ${rel_builddir}/mk_prog.sh" + ;; + (mingw*) + cf_cv_shlib_version=mingw + cf_cv_shlib_version_infix=mingw + shlibdir=$bindir + MAKE_DLLS= + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-Wl,--enable-auto-import" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="-Wl,--enable-auto-import $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS= + MK_SHARED_LIB=$SHELL' '$rel_builddir'/mk_shared_lib.sh $@ ${CC} ${CFLAGS}' + RM_SHARED_OPTS="$RM_SHARED_OPTS $rel_builddir/mk_shared_lib.sh *.dll.a" + cat >mk_shared_lib.sh <<-CF_EOF + #!$SHELL + SHARED_LIB=\$1 + IMPORT_LIB=\`echo "\$1" | sed -e 's/[0-9]*\.dll$/.dll.a/'\` + shift + cat <<-EOF + Linking shared library + ** SHARED_LIB \$SHARED_LIB + ** IMPORT_LIB \$IMPORT_LIB +EOF + exec \$* ${LDFLAGS} -shared -Wl,--enable-auto-import,--out-implib=\${IMPORT_LIB} -Wl,--export-all-symbols -o \${SHARED_LIB} +CF_EOF + chmod +x mk_shared_lib.sh + ;; + (openbsd[2-9].*|mirbsd*) + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-Bshareable,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (nskJ*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Weld=-export_all -o $@' + ;; + (nskL*) + CC_SHARED_OPTS= + MK_SHARED_LIB='${LD} -Wshared -Wxld=-export_all -o $@' + ;; + (nto-qnx*|openbsd*|freebsd[12].*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + MK_SHARED_LIB='${LD} ${LDFLAGS} -Bshareable -o $@' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (dragonfly*|freebsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="${cf_ld_rpath_opt}\${RPATH_LIST} $LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname',-stats,-lc -o $@' + ;; + (netbsd*) + CC_SHARED_OPTS="$CC_SHARED_OPTS -DPIC" + if test "$DFT_LWR_MODEL" = "shared" && test "$cf_cv_enable_rpath" = yes ; then + LOCAL_LDFLAGS="${cf_ld_rpath_opt}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + EXTRA_LDFLAGS="${cf_ld_rpath_opt}\${RPATH_LIST} $EXTRA_LDFLAGS" + if test "$cf_cv_shlib_version" = auto; then + if test -f /usr/libexec/ld.elf_so; then + cf_cv_shlib_version=abi + else + cf_cv_shlib_version=rel + fi + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -Wl,-soname,'$cf_cv_shared_soname' -o $@' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -o $@' + fi + ;; + (osf*|mls+*) + # tested with OSF/1 V3.2 and 'cc' + # tested with OSF/1 V3.2 and gcc 2.6.3 (but the c++ demo didn't + # link with shared libs). + MK_SHARED_LIB='${LD} ${LDFLAGS} -set_version ${REL_VERSION}:${ABI_VERSION} -expect_unresolved "*" -shared -soname `basename $@`' + case "$host_os" in + (osf4*) + MK_SHARED_LIB="${MK_SHARED_LIB} -msym" + ;; + esac + MK_SHARED_LIB="${MK_SHARED_LIB}"' -o $@' + if test "$DFT_LWR_MODEL" = "shared" && test -n "$LD_RPATH_OPT" ; then + LOCAL_LDFLAGS="${LD_RPATH_OPT}\$(LOCAL_LIBDIR)" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + cf_cv_rm_so_locs=yes + ;; + (sco3.2v5*) # also uw2* and UW7: hops 13-Apr-98 + # tested with osr5.0.5 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-belf -KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -dy -G -h `basename $@ .${REL_VERSION}`.${ABI_VERSION} -o $@' + if test "$cf_cv_enable_rpath" = yes ; then + # only way is to set LD_RUN_PATH but no switch for it + RUN_PATH=$libdir + fi + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + LINK_PROGS='LD_RUN_PATH=${libdir}' + LINK_TESTS='Pwd=`pwd`;LD_RUN_PATH=`dirname $${Pwd}`/lib' + ;; + (sunos4*) + # tested with SunOS 4.1.1 and gcc 2.7.0 + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -assert pure-text -o $@' + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + ;; + (solaris2*) + # tested with SunOS 5.5.1 (solaris 2.5.1) and gcc 2.7.2 + # tested with SunOS 5.10 (solaris 10) and gcc 3.4.3 + if test "$DFT_LWR_MODEL" = "shared" ; then + LOCAL_LDFLAGS="-R\$(LOCAL_LIBDIR):\${libdir}" + LOCAL_LDFLAGS2="$LOCAL_LDFLAGS" + fi + if test "$cf_cv_enable_rpath" = yes ; then + EXTRA_LDFLAGS="-R\${libdir} $EXTRA_LDFLAGS" + fi + + test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=rel + if test "$cf_cv_shlib_version" = rel; then + cf_cv_shared_soname='`basename $@ .${REL_VERSION}`.${ABI_VERSION}' + else + cf_cv_shared_soname='`basename $@`' + fi + + if test "$GCC" != yes; then + cf_save_CFLAGS="$CFLAGS" + for cf_shared_opts in -xcode=pic32 -xcode=pic13 -KPIC -Kpic -O + do + CFLAGS="$cf_shared_opts $cf_save_CFLAGS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 7434 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:7446: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7449: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:7452: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7455: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done + CFLAGS="$cf_save_CFLAGS" + CC_SHARED_OPTS=$cf_shared_opts + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $@' + else + MK_SHARED_LIB='${CC} ${LDFLAGS} ${CFLAGS} -shared -dy -G -Wl,-h,'$cf_cv_shared_soname' -o $@' + fi + ;; + (sysv5uw7*|unix_sv*) + # tested with UnixWare 7.1.0 (gcc 2.95.2 and cc) + if test "$GCC" != yes; then + CC_SHARED_OPTS='-KPIC' + fi + MK_SHARED_LIB='${LD} ${LDFLAGS} -d y -G -o $@' + ;; + (*) + CC_SHARED_OPTS='unknown' + MK_SHARED_LIB='echo unknown' + ;; + esac + + # This works if the last tokens in $MK_SHARED_LIB are the -o target. + case "$cf_cv_shlib_version" in + (rel|abi) + case "$MK_SHARED_LIB" in + (*'-o $@') + test "$cf_cv_do_symlinks" = no && cf_cv_do_symlinks=yes + ;; + (*) + { echo "$as_me:7492: WARNING: ignored --with-shlib-version" >&5 +echo "$as_me: WARNING: ignored --with-shlib-version" >&2;} + ;; + esac + ;; + esac + + if test -n "$cf_try_cflags" + then +cat > conftest.$ac_ext < +int main(int argc, char *argv[]) +{ + printf("hello\\n"); + return (argv[argc-1] == 0) ; +} +EOF + cf_save_CFLAGS="$CFLAGS" + for cf_opt in $cf_try_cflags + do + CFLAGS="$cf_save_CFLAGS -$cf_opt" + echo "$as_me:7514: checking if CFLAGS option -$cf_opt works" >&5 +echo $ECHO_N "checking if CFLAGS option -$cf_opt works... $ECHO_C" >&6 + if { (eval echo "$as_me:7516: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7519: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + echo "$as_me:7521: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + cf_save_CFLAGS="$CFLAGS" + else + echo "$as_me:7525: result: no" >&5 +echo "${ECHO_T}no" >&6 + fi + done + CFLAGS="$cf_save_CFLAGS" + fi + + # RPATH_LIST is a colon-separated list of directories + test -n "$cf_ld_rpath_opt" && MK_SHARED_LIB="$MK_SHARED_LIB $cf_ld_rpath_opt\${RPATH_LIST}" + test -z "$RPATH_LIST" && RPATH_LIST="\${libdir}" + + test "$cf_cv_rm_so_locs" = yes && RM_SHARED_OPTS="$RM_SHARED_OPTS so_locations" + + test -n "$verbose" && echo " CC_SHARED_OPTS: $CC_SHARED_OPTS" 1>&6 + +echo "${as_me:-configure}:7540: testing CC_SHARED_OPTS: $CC_SHARED_OPTS ..." 1>&5 + + test -n "$verbose" && echo " MK_SHARED_LIB: $MK_SHARED_LIB" 1>&6 + +echo "${as_me:-configure}:7544: testing MK_SHARED_LIB: $MK_SHARED_LIB ..." 1>&5 + +for model in $cf_list_models ; do + case "$model" in + (libtool) + +echo "$as_me:7550: checking for additional libtool options" >&5 +echo $ECHO_N "checking for additional libtool options... $ECHO_C" >&6 + +# Check whether --with-libtool-opts or --without-libtool-opts was given. +if test "${with_libtool_opts+set}" = set; then + withval="$with_libtool_opts" + with_libtool_opts=$withval +else + with_libtool_opts=no +fi; +echo "$as_me:7560: result: $with_libtool_opts" >&5 +echo "${ECHO_T}$with_libtool_opts" >&6 + +case .$with_libtool_opts in +(.yes|.no|.) + ;; +(*) + LIBTOOL_OPTS="$LIBTOOL_OPTS $with_libtool_opts" + ;; +esac + +echo "$as_me:7571: checking if exported-symbols file should be used" >&5 +echo $ECHO_N "checking if exported-symbols file should be used... $ECHO_C" >&6 + +# Check whether --with-export-syms or --without-export-syms was given. +if test "${with_export_syms+set}" = set; then + withval="$with_export_syms" + with_export_syms=$withval +else + with_export_syms=no +fi; +if test "x$with_export_syms" = xyes +then + with_export_syms='${top_srcdir}/package/${PACKAGE}.sym' + +fi +echo "$as_me:7586: result: $with_export_syms" >&5 +echo "${ECHO_T}$with_export_syms" >&6 +if test "x$with_export_syms" != xno +then + EXPORT_SYMS="-export-symbols $with_export_syms" + +fi + + ;; + (shared) + if test "$CC_SHARED_OPTS" = "unknown"; then + { { echo "$as_me:7597: error: Shared libraries are not supported in this version" >&5 +echo "$as_me: error: Shared libraries are not supported in this version" >&2;} + { (exit 1); exit 1; }; } + fi + # workaround for inept transition to PIE vs PIC... + echo "$as_me:7602: checking if current CFLAGS link properly" >&5 +echo $ECHO_N "checking if current CFLAGS link properly... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 7605 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello work\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7617: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7620: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7623: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7626: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cflags_work=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cflags_work=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:7635: result: $cf_cflags_work" >&5 +echo "${ECHO_T}$cf_cflags_work" >&6 + if test "$cf_cflags_work" = no + then + test -n "$verbose" && echo " try to work around by appending shared-options" 1>&6 + +echo "${as_me:-configure}:7641: testing try to work around by appending shared-options ..." 1>&5 + + CFLAGS="$CFLAGS $CC_SHARED_OPTS" + fi + +echo "$as_me:7646: checking if versioned-symbols file should be used" >&5 +echo $ECHO_N "checking if versioned-symbols file should be used... $ECHO_C" >&6 + +# Check whether --with-versioned-syms or --without-versioned-syms was given. +if test "${with_versioned_syms+set}" = set; then + withval="$with_versioned_syms" + with_versioned_syms=$withval +else + with_versioned_syms=no +fi; +case "x$with_versioned_syms" in +(xyes) + with_versioned_syms='${top_srcdir}/package/${PACKAGE}.map' + + ;; +(xno) + ;; +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + test -f "$with_versioned_syms" || { { echo "$as_me:7664: error: expected a filename: $with_versioned_syms" >&5 +echo "$as_me: error: expected a filename: $with_versioned_syms" >&2;} + { (exit 1); exit 1; }; } + ;; +(*) + test -f "$with_versioned_syms" || { { echo "$as_me:7669: error: expected a filename: $with_versioned_syms" >&5 +echo "$as_me: error: expected a filename: $with_versioned_syms" >&2;} + { (exit 1); exit 1; }; } + with_versioned_syms=`pwd`/"$with_versioned_syms" + ;; +esac +echo "$as_me:7675: result: $with_versioned_syms" >&5 +echo "${ECHO_T}$with_versioned_syms" >&6 + +RESULTING_SYMS= +VERSIONED_SYMS= +WILDCARD_SYMS= + +if test "x$with_versioned_syms" != xno +then + RESULTING_SYMS=$with_versioned_syms + case "x$MK_SHARED_LIB" in + (*-Wl,*) + VERSIONED_SYMS="-Wl,--version-script,\${RESULTING_SYMS}" + MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-Wl,%\\${VERSIONED_SYMS} -Wl,%"` + test -n "$verbose" && echo " MK_SHARED_LIB: $MK_SHARED_LIB" 1>&6 + +echo "${as_me:-configure}:7691: testing MK_SHARED_LIB: $MK_SHARED_LIB ..." 1>&5 + + ;; + (*-dy\ *) + VERSIONED_SYMS="-Wl,-M,\${RESULTING_SYMS}" + MK_SHARED_LIB=`echo "$MK_SHARED_LIB" | sed -e "s%-dy%\\${VERSIONED_SYMS} -dy%"` + test -n "$verbose" && echo " MK_SHARED_LIB: $MK_SHARED_LIB" 1>&6 + +echo "${as_me:-configure}:7699: testing MK_SHARED_LIB: $MK_SHARED_LIB ..." 1>&5 + + ;; + (*) + { echo "$as_me:7703: WARNING: this system does not support versioned-symbols" >&5 +echo "$as_me: WARNING: this system does not support versioned-symbols" >&2;} + ;; + esac + + # Linux ld can selectively override scope, e.g., of symbols beginning with + # "_" by first declaring some as global, and then using a wildcard to + # declare the others as local. Some other loaders cannot do this. Check + # by constructing a (very) simple shared library and inspecting its + # symbols. + if test "x$VERSIONED_SYMS" != "x" + then + echo "$as_me:7715: checking if wildcards can be used to selectively omit symbols" >&5 +echo $ECHO_N "checking if wildcards can be used to selectively omit symbols... $ECHO_C" >&6 + WILDCARD_SYMS=no + + # make sources + rm -f conftest.* + + cat >conftest.ver <conftest.$ac_ext <conftest.mk <&5 >/dev/null + then + # test for missing symbol in either Data or Text section + cf_missing="`nm -P conftest.so 2>&5 |${FGREP-fgrep} _ismissing | ${EGREP-egrep} '[ ][DT][ ]'`" + test -n "$cf_missing" && WILDCARD_SYMS=yes + fi + echo "$as_me:7783: result: $WILDCARD_SYMS" >&5 +echo "${ECHO_T}$WILDCARD_SYMS" >&6 + rm -f conftest.* + fi +fi + + ;; + esac +done + +### Checks for special libraries, must be done up-front. +SHLIB_LIST="" + +echo "$as_me:7796: checking if you want to link with the GPM mouse library" >&5 +echo $ECHO_N "checking if you want to link with the GPM mouse library... $ECHO_C" >&6 + +# Check whether --with-gpm or --without-gpm was given. +if test "${with_gpm+set}" = set; then + withval="$with_gpm" + with_gpm=$withval +else + with_gpm=maybe +fi; +echo "$as_me:7806: result: $with_gpm" >&5 +echo "${ECHO_T}$with_gpm" >&6 + +if test "$with_gpm" != no ; then + echo "$as_me:7810: checking for gpm.h" >&5 +echo $ECHO_N "checking for gpm.h... $ECHO_C" >&6 +if test "${ac_cv_header_gpm_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7816 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:7820: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:7826: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_gpm_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_gpm_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:7845: result: $ac_cv_header_gpm_h" >&5 +echo "${ECHO_T}$ac_cv_header_gpm_h" >&6 +if test "$ac_cv_header_gpm_h" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GPM_H 1 +EOF + + if test "$with_gpm" != yes && test "$with_gpm" != maybe ; then + test -n "$verbose" && echo " assuming we really have GPM library" 1>&6 + +echo "${as_me:-configure}:7856: testing assuming we really have GPM library ..." 1>&5 + +cat >>confdefs.h <<\EOF +#define HAVE_LIBGPM 1 +EOF + + with_gpm=yes + else + echo "$as_me:7864: checking for Gpm_Open in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 7872 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Open (void); +int +main (void) +{ +Gpm_Open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7891: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7894: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7897: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7900: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:7911: result: $ac_cv_lib_gpm_Gpm_Open" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6 +if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then + with_gpm=yes +else + + if test "$with_gpm" = maybe; then + { echo "$as_me:7918: WARNING: Cannot link with GPM library" >&5 +echo "$as_me: WARNING: Cannot link with GPM library" >&2;} + with_gpm=no + else + { { echo "$as_me:7922: error: Cannot link with GPM library" >&5 +echo "$as_me: error: Cannot link with GPM library" >&2;} + { (exit 1); exit 1; }; } + fi + +fi + + fi + +else + + test "$with_gpm" != maybe && { echo "$as_me:7933: WARNING: Cannot find GPM header" >&5 +echo "$as_me: WARNING: Cannot find GPM header" >&2;} + with_gpm=no + +fi + +fi + +if test "$with_gpm" != no ; then + echo "$as_me:7942: checking if you want to load GPM dynamically" >&5 +echo $ECHO_N "checking if you want to load GPM dynamically... $ECHO_C" >&6 + +# Check whether --with-dlsym or --without-dlsym was given. +if test "${with_dlsym+set}" = set; then + withval="$with_dlsym" + with_dlsym=$withval +else + with_dlsym=yes +fi; + echo "$as_me:7952: result: $with_dlsym" >&5 +echo "${ECHO_T}$with_dlsym" >&6 + if test "x$with_dlsym" = xyes ; then + +cf_have_dlsym=no +echo "$as_me:7957: checking for dlsym" >&5 +echo $ECHO_N "checking for dlsym... $ECHO_C" >&6 +if test "${ac_cv_func_dlsym+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7963 "configure" +#include "confdefs.h" +#define dlsym autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef dlsym + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlsym (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlsym) || defined (__stub___dlsym) +#error found stub for dlsym +#endif + + return dlsym (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7994: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7997: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8000: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8003: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_dlsym=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_dlsym=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:8013: result: $ac_cv_func_dlsym" >&5 +echo "${ECHO_T}$ac_cv_func_dlsym" >&6 +if test "$ac_cv_func_dlsym" = yes; then + cf_have_dlsym=yes +else + +cf_have_libdl=no +echo "$as_me:8020: checking for dlsym in -ldl" >&5 +echo $ECHO_N "checking for dlsym in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlsym+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 8028 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlsym (void); +int +main (void) +{ +dlsym (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8047: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8050: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8053: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8056: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dl_dlsym=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dl_dlsym=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8067: result: $ac_cv_lib_dl_dlsym" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlsym" >&6 +if test "$ac_cv_lib_dl_dlsym" = yes; then + + cf_have_dlsym=yes + cf_have_libdl=yes +fi + +fi + +if test "$cf_have_dlsym" = yes ; then + test "$cf_have_libdl" = yes && { +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -ldl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + } + + echo "$as_me:8096: checking whether able to link to dl*() functions" >&5 +echo $ECHO_N "checking whether able to link to dl*() functions... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 8099 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + void *obj; + if ((obj = dlopen("filename", 0)) != 0) { + if (dlsym(obj, "symbolname") == 0) { + dlclose(obj); + } + } + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8117: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8120: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8123: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8126: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBDL 1 +EOF + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + { { echo "$as_me:8137: error: Cannot link test program for libdl" >&5 +echo "$as_me: error: Cannot link test program for libdl" >&2;} + { (exit 1); exit 1; }; } +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:8142: result: ok" >&5 +echo "${ECHO_T}ok" >&6 +else + { { echo "$as_me:8145: error: Cannot find dlsym function" >&5 +echo "$as_me: error: Cannot find dlsym function" >&2;} + { (exit 1); exit 1; }; } +fi + + if test "x$with_gpm" != xyes ; then + test -n "$verbose" && echo " assuming soname for gpm is $with_gpm" 1>&6 + +echo "${as_me:-configure}:8153: testing assuming soname for gpm is $with_gpm ..." 1>&5 + + cf_cv_gpm_soname="$with_gpm" + else + +echo "$as_me:8158: checking for soname of gpm library" >&5 +echo $ECHO_N "checking for soname of gpm library... $ECHO_C" >&6 +if test "${cf_cv_gpm_soname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gpm_soname=unknown +if test "$cross_compiling" != yes ; then +cat >conftest.$ac_ext < +int main(void) +{ +if (Gpm_Open(0,0)) Gpm_Close(); + ${cf_cv_main_return:-return}(0); +} +CF_EOF +cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lgpm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + if { (eval echo "$as_me:8192: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8195: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + if { (eval echo "$as_me:8197: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8200: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + cf_cv_gpm_soname="`ldd \"conftest$ac_exeext\" 2>/dev/null | sed -e 's,^.*/,,' -e 's, .*$,,' | ${FGREP-fgrep} libgpm.`" + test -z "$cf_cv_gpm_soname" && cf_cv_gpm_soname=unknown + fi + fi +rm -rf ./conftest* +LIBS="$cf_save_LIBS" +fi + +fi +echo "$as_me:8211: result: $cf_cv_gpm_soname" >&5 +echo "${ECHO_T}$cf_cv_gpm_soname" >&6 + + fi + test "$cf_cv_gpm_soname" != "unknown" && +cat >>confdefs.h <>confdefs.h <<\EOF +#define HAVE_LIBGPM 1 +EOF + +echo "$as_me:8279: checking for Gpm_Wgetch in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Wgetch in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Wgetch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 8287 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Wgetch (void); +int +main (void) +{ +Gpm_Wgetch (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8306: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8309: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8312: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8315: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Wgetch=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Wgetch=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8326: result: $ac_cv_lib_gpm_Gpm_Wgetch" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Wgetch" >&6 +if test "$ac_cv_lib_gpm_Gpm_Wgetch" = yes; then + +echo "$as_me:8330: checking if GPM is weakly bound to curses library" >&5 +echo $ECHO_N "checking if GPM is weakly bound to curses library... $ECHO_C" >&6 +if test "${cf_cv_check_gpm_wgetch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_check_gpm_wgetch=unknown +if test "$cross_compiling" != yes ; then + +cat >conftest.$ac_ext < +int main(void) +{ + Gpm_Wgetch(); + ${cf_cv_main_return:-return}(0); +} +CF_EOF + + cf_save_LIBS="$LIBS" + # This only works if we can look at the symbol table. If a shared + # library is stripped for install, we cannot use that. So we're forced + # to rely on the static library, noting that some packagers may not + # include it. + LIBS="-static -lgpm -dynamic $LIBS" + if { (eval echo "$as_me:8354: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8357: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + if { (eval echo "$as_me:8359: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8362: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + cf_cv_check_gpm_wgetch="`nm \"conftest$ac_exeext\" | ${EGREP-egrep} '\' | ${EGREP-egrep} '\<[vVwW]\>'`" + test -n "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=yes + test -z "$cf_cv_check_gpm_wgetch" && cf_cv_check_gpm_wgetch=no + fi + fi + rm -rf ./conftest* + LIBS="$cf_save_LIBS" +fi + +fi +echo "$as_me:8374: result: $cf_cv_check_gpm_wgetch" >&5 +echo "${ECHO_T}$cf_cv_check_gpm_wgetch" >&6 + +if test "$cf_cv_check_gpm_wgetch" != yes ; then + { echo "$as_me:8378: WARNING: GPM library is already linked with curses - read the FAQ" >&5 +echo "$as_me: WARNING: GPM library is already linked with curses - read the FAQ" >&2;} +fi + +fi + +fi + +echo "$as_me:8386: checking if you want to use PCRE2 for regular-expressions" >&5 +echo $ECHO_N "checking if you want to use PCRE2 for regular-expressions... $ECHO_C" >&6 + +# Check whether --with-pcre2 or --without-pcre2 was given. +if test "${with_pcre2+set}" = set; then + withval="$with_pcre2" + +fi; +test -z "$with_pcre2" && with_pcre2=no +echo "$as_me:8395: result: $with_pcre2" >&5 +echo "${ECHO_T}$with_pcre2" >&6 + +if test "x$with_pcre2" != xno ; then + cf_with_pcre2_ok=no + for cf_with_pcre2 in libpcre2 libpcre2-posix libpcre + do + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$cf_with_pcre2"; then + test -n "$verbose" && echo " found package $cf_with_pcre2" 1>&6 + +echo "${as_me:-configure}:8406: testing found package $cf_with_pcre2 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$cf_with_pcre2" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "$cf_with_pcre2" 2>/dev/null`" + test -n "$verbose" && echo " package $cf_with_pcre2 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:8412: testing package $cf_with_pcre2 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package $cf_with_pcre2 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:8416: testing package $cf_with_pcre2 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_with_pcre2_ok=yes; break +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + : +fi + + done + cf_with_pcre2_ok=yes || { { echo "$as_me:8540: error: Cannot find PCRE2 library" >&5 +echo "$as_me: error: Cannot find PCRE2 library" >&2;} + { (exit 1); exit 1; }; } + +cat >>confdefs.h <<\EOF +#define HAVE_LIB_PCRE2 1 +EOF + + # if pkgconfig gave no results, look for the libraries directly + case "$LIBS" in + (*pcre2-posix*|*pcreposix*) + ;; + (*) + echo "$as_me:8553: checking for regcomp in -lpcre2-posix" >&5 +echo $ECHO_N "checking for regcomp in -lpcre2-posix... $ECHO_C" >&6 +if test "${ac_cv_lib_pcre2_posix_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcre2-posix $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 8561 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8580: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8583: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8586: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8589: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_pcre2_posix_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_pcre2_posix_regcomp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8600: result: $ac_cv_lib_pcre2_posix_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_pcre2_posix_regcomp" >&6 +if test "$ac_cv_lib_pcre2_posix_regcomp" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpcre2-posix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + echo "$as_me:8621: checking for regcomp in -lpcreposix" >&5 +echo $ECHO_N "checking for regcomp in -lpcreposix... $ECHO_C" >&6 +if test "${ac_cv_lib_pcreposix_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcreposix $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 8629 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8648: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8651: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8654: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8657: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_pcreposix_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_pcreposix_regcomp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8668: result: $ac_cv_lib_pcreposix_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_pcreposix_regcomp" >&6 +if test "$ac_cv_lib_pcreposix_regcomp" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpcreposix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + { { echo "$as_me:8689: error: Cannot find PCRE2 POSIX library" >&5 +echo "$as_me: error: Cannot find PCRE2 POSIX library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + ;; + esac + + # either way, check for the library header files + +for ac_header in pcre2posix.h pcreposix.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:8704: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 8710 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:8714: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:8720: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:8739: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 8758 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8789: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8792: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8795: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8798: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:8808: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h </dev/null ; then +echo "$as_me:8822: checking if you want to use sysmouse" >&5 +echo $ECHO_N "checking if you want to use sysmouse... $ECHO_C" >&6 + +# Check whether --with-sysmouse or --without-sysmouse was given. +if test "${with_sysmouse+set}" = set; then + withval="$with_sysmouse" + cf_with_sysmouse=$withval +else + cf_with_sysmouse=maybe +fi; + if test "$cf_with_sysmouse" != no ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 8834 "configure" +#include "confdefs.h" + +#include +#if (__FreeBSD_version >= 400017) +#include +#include +#else +#include +#endif + +int +main (void) +{ + + struct mouse_info the_mouse; + ioctl(0, CONS_MOUSECTL, &the_mouse); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8857: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8860: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8863: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8866: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_with_sysmouse=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_with_sysmouse=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi +echo "$as_me:8876: result: $cf_with_sysmouse" >&5 +echo "${ECHO_T}$cf_with_sysmouse" >&6 +test "$cf_with_sysmouse" = yes && +cat >>confdefs.h <<\EOF +#define USE_SYSMOUSE 1 +EOF + +fi + +# pretend that ncurses==ncursesw==ncursest +echo "$as_me:8886: checking if you want to disable library suffixes" >&5 +echo $ECHO_N "checking if you want to disable library suffixes... $ECHO_C" >&6 + +# Check whether --enable-lib-suffixes or --disable-lib-suffixes was given. +if test "${enable_lib_suffixes+set}" = set; then + enableval="$enable_lib_suffixes" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + disable_lib_suffixes=yes + else + disable_lib_suffixes=no + fi +else + enableval=yes + disable_lib_suffixes=no + +fi; +echo "$as_me:8903: result: $disable_lib_suffixes" >&5 +echo "${ECHO_T}$disable_lib_suffixes" >&6 + +### If we're building with rpath, try to link non-standard libs that way too. +if test "$DFT_LWR_MODEL" = "shared" && test "x$cf_cv_enable_rpath" != xno; then + +echo "$as_me:8909: checking if rpath-hack should be disabled" >&5 +echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6 + +# Check whether --enable-rpath-hack or --disable-rpath-hack was given. +if test "${enable_rpath_hack+set}" = set; then + enableval="$enable_rpath_hack" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_rpath_hack=no + else + enable_rpath_hack=yes + fi +else + enableval=yes + enable_rpath_hack=yes + +fi; +if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi +echo "$as_me:8927: result: $cf_disable_rpath_hack" >&5 +echo "${ECHO_T}$cf_disable_rpath_hack" >&6 + +if test "$enable_rpath_hack" = yes ; then + +echo "$as_me:8932: checking for updated LDFLAGS" >&5 +echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6 +if test -n "$LD_RPATH_OPT" ; then + echo "$as_me:8935: result: maybe" >&5 +echo "${ECHO_T}maybe" >&6 + + for ac_prog in ldd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:8942: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$cf_ldd_prog"; then + ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_cf_ldd_prog="$ac_prog" +echo "$as_me:8957: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +cf_ldd_prog=$ac_cv_prog_cf_ldd_prog +if test -n "$cf_ldd_prog"; then + echo "$as_me:8965: result: $cf_ldd_prog" >&5 +echo "${ECHO_T}$cf_ldd_prog" >&6 +else + echo "$as_me:8968: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$cf_ldd_prog" && break +done +test -n "$cf_ldd_prog" || cf_ldd_prog="no" + + cf_rpath_list="/usr/lib /lib" + if test "$cf_ldd_prog" != no + then + cf_rpath_oops= + +cat >"conftest.$ac_ext" <<_ACEOF +#line 8982 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8994: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8997: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:9000: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9003: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq` + cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq` +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + # If we passed the link-test, but get a "not found" on a given library, + # this could be due to inept reconfiguration of gcc to make it only + # partly honor /usr/local/lib (or whatever). Sometimes this behavior + # is intentional, e.g., installing gcc in /usr/bin and suppressing the + # /usr/local libraries. + if test -n "$cf_rpath_oops" + then + for cf_rpath_src in $cf_rpath_oops + do + for cf_rpath_dir in \ + /usr/local \ + /usr/pkg \ + /opt/sfw + do + if test -f "$cf_rpath_dir/lib/$cf_rpath_src" + then + test -n "$verbose" && echo " ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6 + +echo "${as_me:-configure}:9031: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5 + + LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib" + break + fi + done + done + fi + fi + + test -n "$verbose" && echo " ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 + +echo "${as_me:-configure}:9043: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 + +test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:9047: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5 + +cf_rpath_dst= +for cf_rpath_src in $LDFLAGS +do + case "$cf_rpath_src" in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6 + +echo "${as_me:-configure}:9084: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5 + + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +LDFLAGS=$cf_rpath_dst + +test -n "$verbose" && echo " ...checked LDFLAGS $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:9097: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5 + +test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6 + +echo "${as_me:-configure}:9101: testing ...checking LIBS $LIBS ..." 1>&5 + +cf_rpath_dst= +for cf_rpath_src in $LIBS +do + case "$cf_rpath_src" in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6 + +echo "${as_me:-configure}:9138: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5 + + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +LIBS=$cf_rpath_dst + +test -n "$verbose" && echo " ...checked LIBS $LIBS" 1>&6 + +echo "${as_me:-configure}:9151: testing ...checked LIBS $LIBS ..." 1>&5 + + test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 + +echo "${as_me:-configure}:9155: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 + +else + echo "$as_me:9158: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi + +fi + +### Depending on the system, someone may use rpath to build ncurses but not +# want users of the package to rely upon that feature. Give those people an +# option to suppress that detail from EXTRA_LDFLAGS. +EXTRA_PKG_LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS" +if test -n "$EXTRA_PKG_LDFLAGS" +then + echo "$as_me:9172: checking if you want to disable extra LDFLAGS for package-scripts" >&5 +echo $ECHO_N "checking if you want to disable extra LDFLAGS for package-scripts... $ECHO_C" >&6 + +# Check whether --enable-pkg-ldflags or --disable-pkg-ldflags was given. +if test "${enable_pkg_ldflags+set}" = set; then + enableval="$enable_pkg_ldflags" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + disable_pkg_ldflags=yes + else + disable_pkg_ldflags=no + fi +else + enableval=yes + disable_pkg_ldflags=no + +fi; + echo "$as_me:9189: result: $disable_pkg_ldflags" >&5 +echo "${ECHO_T}$disable_pkg_ldflags" >&6 + test "$disable_pkg_ldflags" = yes && EXTRA_PKG_LDFLAGS= +fi + +############################################################################### + +### use option --with-extra-suffix to append suffix to headers and libraries +echo "$as_me:9197: checking for extra suffix to append to header/library paths" >&5 +echo $ECHO_N "checking for extra suffix to append to header/library paths... $ECHO_C" >&6 +EXTRA_SUFFIX= + +# Check whether --with-extra-suffix or --without-extra-suffix was given. +if test "${with_extra_suffix+set}" = set; then + withval="$with_extra_suffix" + case x$withval in + (xno) + ;; + (xyes|x) + EXTRA_SUFFIX=$cf_cv_abi_version + ;; + (*) + EXTRA_SUFFIX=$withval + ;; + esac + +fi; +echo "$as_me:9216: result: ${EXTRA_SUFFIX:-(none)}" >&5 +echo "${ECHO_T}${EXTRA_SUFFIX:-(none)}" >&6 + +### use option --disable-overwrite to leave out the link to -lcurses +echo "$as_me:9220: checking if you wish to install ncurses overwriting curses" >&5 +echo $ECHO_N "checking if you wish to install ncurses overwriting curses... $ECHO_C" >&6 + +# Check whether --enable-overwrite or --disable-overwrite was given. +if test "${enable_overwrite+set}" = set; then + enableval="$enable_overwrite" + with_overwrite=$enableval +else + if test "$prefix" = "/usr" ; then with_overwrite=yes; else with_overwrite=no; fi +fi; +echo "$as_me:9230: result: $with_overwrite" >&5 +echo "${ECHO_T}$with_overwrite" >&6 + +echo "$as_me:9233: checking if external terminfo-database is used" >&5 +echo $ECHO_N "checking if external terminfo-database is used... $ECHO_C" >&6 + +# Check whether --enable-database or --disable-database was given. +if test "${enable_database+set}" = set; then + enableval="$enable_database" + use_database=$enableval +else + use_database=yes +fi; +echo "$as_me:9243: result: $use_database" >&5 +echo "${ECHO_T}$use_database" >&6 + +case "$host_os" in +(os2*) + TERMINFO_SRC='${top_srcdir}/misc/emx.src' + ;; +(*) + TERMINFO_SRC='${top_srcdir}/misc/terminfo.src' + ;; +esac + +NCURSES_USE_DATABASE=0 +if test "$use_database" != no ; then + NCURSES_USE_DATABASE=1 + + echo "$as_me:9259: checking which terminfo source-file will be installed" >&5 +echo $ECHO_N "checking which terminfo source-file will be installed... $ECHO_C" >&6 + +# Check whether --with-database or --without-database was given. +if test "${with_database+set}" = set; then + withval="$with_database" + TERMINFO_SRC=$withval +fi; + echo "$as_me:9267: result: $TERMINFO_SRC" >&5 +echo "${ECHO_T}$TERMINFO_SRC" >&6 + + echo "$as_me:9270: checking whether to use hashed database instead of directory/tree" >&5 +echo $ECHO_N "checking whether to use hashed database instead of directory/tree... $ECHO_C" >&6 + +# Check whether --with-hashed-db or --without-hashed-db was given. +if test "${with_hashed_db+set}" = set; then + withval="$with_hashed_db" + +else + with_hashed_db=no +fi; + echo "$as_me:9280: result: $with_hashed_db" >&5 +echo "${ECHO_T}$with_hashed_db" >&6 +else + with_hashed_db=no +fi + +echo "$as_me:9286: checking for list of fallback terminal descriptions" >&5 +echo $ECHO_N "checking for list of fallback terminal descriptions... $ECHO_C" >&6 + +# Check whether --with-fallbacks or --without-fallbacks was given. +if test "${with_fallbacks+set}" = set; then + withval="$with_fallbacks" + with_fallback=$withval +else + with_fallback= +fi; +echo "$as_me:9296: result: ${with_fallback:-(none)}" >&5 +echo "${ECHO_T}${with_fallback:-(none)}" >&6 + +case ".$with_fallback" in +(.|.no) + FALLBACK_LIST= + ;; +(.yes) + { echo "$as_me:9304: WARNING: expected a list of terminal descriptions" >&5 +echo "$as_me: WARNING: expected a list of terminal descriptions" >&2;} + ;; +(*) + FALLBACK_LIST=`echo "$with_fallback" | sed -e 's/,/ /g'` + ;; +esac + +# The fallback feature in ncurses relies upon tic/infocmp outside the build +# tree for generating the terminal descriptions that will be compiled into the +# library. If your toolchain is old, it may not handle current terminal +# databases. Use configure-options to point to the tools which will be used, +# rather than the first ones found on the $PATH. +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}tic", so it can be a program name with args. +set dummy ${ac_tool_prefix}tic; ac_word=$2 +echo "$as_me:9320: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_TIC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$TIC"; then + ac_cv_prog_TIC="$TIC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_TIC="${ac_tool_prefix}tic" +echo "$as_me:9335: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +TIC=$ac_cv_prog_TIC +if test -n "$TIC"; then + echo "$as_me:9343: result: $TIC" >&5 +echo "${ECHO_T}$TIC" >&6 +else + echo "$as_me:9346: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_TIC"; then + ac_ct_TIC=$TIC + # Extract the first word of "tic", so it can be a program name with args. +set dummy tic; ac_word=$2 +echo "$as_me:9355: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_TIC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_TIC"; then + ac_cv_prog_ac_ct_TIC="$ac_ct_TIC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_TIC="tic" +echo "$as_me:9370: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_TIC=$ac_cv_prog_ac_ct_TIC +if test -n "$ac_ct_TIC"; then + echo "$as_me:9378: result: $ac_ct_TIC" >&5 +echo "${ECHO_T}$ac_ct_TIC" >&6 +else + echo "$as_me:9381: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + TIC=$ac_ct_TIC +else + TIC="$ac_cv_prog_TIC" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}infocmp", so it can be a program name with args. +set dummy ${ac_tool_prefix}infocmp; ac_word=$2 +echo "$as_me:9393: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_INFOCMP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$INFOCMP"; then + ac_cv_prog_INFOCMP="$INFOCMP" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_INFOCMP="${ac_tool_prefix}infocmp" +echo "$as_me:9408: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +INFOCMP=$ac_cv_prog_INFOCMP +if test -n "$INFOCMP"; then + echo "$as_me:9416: result: $INFOCMP" >&5 +echo "${ECHO_T}$INFOCMP" >&6 +else + echo "$as_me:9419: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_INFOCMP"; then + ac_ct_INFOCMP=$INFOCMP + # Extract the first word of "infocmp", so it can be a program name with args. +set dummy infocmp; ac_word=$2 +echo "$as_me:9428: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_INFOCMP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_INFOCMP"; then + ac_cv_prog_ac_ct_INFOCMP="$ac_ct_INFOCMP" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_INFOCMP="infocmp" +echo "$as_me:9443: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_INFOCMP=$ac_cv_prog_ac_ct_INFOCMP +if test -n "$ac_ct_INFOCMP"; then + echo "$as_me:9451: result: $ac_ct_INFOCMP" >&5 +echo "${ECHO_T}$ac_ct_INFOCMP" >&6 +else + echo "$as_me:9454: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + INFOCMP=$ac_ct_INFOCMP +else + INFOCMP="$ac_cv_prog_INFOCMP" +fi + +if test -n "$FALLBACK_LIST" +then + +# Check whether --with-tic-path or --without-tic-path was given. +if test "${with_tic_path+set}" = set; then + withval="$with_tic_path" + echo "$as_me:9469: checking for tic program for fallbacks" >&5 +echo $ECHO_N "checking for tic program for fallbacks... $ECHO_C" >&6 + TIC=$withval + echo "$as_me:9472: result: $TIC" >&5 +echo "${ECHO_T}$TIC" >&6 + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$TIC" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval TIC="$TIC" + case "x$TIC" in + (xNONE/*) + TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + TIC=`echo "$TIC" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:9498: error: expected a pathname, not \"$TIC\"" >&5 +echo "$as_me: error: expected a pathname, not \"$TIC\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +else + +test -z "$TIC" && TIC="tic" +for ac_prog in $TIC tic +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:9511: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_TIC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $TIC in + [\\/]* | ?:[\\/]*) + ac_cv_path_TIC="$TIC" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH:/usr/local/ncurses/bin" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_TIC="$ac_dir/$ac_word" + echo "$as_me:9528: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +TIC=$ac_cv_path_TIC + +if test -n "$TIC"; then + echo "$as_me:9539: result: $TIC" >&5 +echo "${ECHO_T}$TIC" >&6 +else + echo "$as_me:9542: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$TIC" && break +done +test -n "$TIC" || TIC="$TIC" + +cf_path_prog="" +cf_path_args="" +IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" +for cf_temp in $ac_cv_path_TIC +do + if test -z "$cf_path_prog" ; then + if test "$with_full_paths" = yes ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_temp" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_temp="$cf_temp" + case "x$cf_temp" in + (xNONE/*) + cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + break + ;; +esac + + cf_path_prog="$cf_temp" + else + cf_path_prog="`basename "$cf_temp"`" + fi + elif test -z "$cf_path_args" ; then + cf_path_args="$cf_temp" + else + cf_path_args="$cf_path_args $cf_temp" + fi +done +IFS="$cf_save_ifs" + +if test -n "$cf_path_prog" ; then + +echo "${as_me:-configure}:9599: testing defining path for ${cf_path_prog} ..." 1>&5 + +cat >>confdefs.h <>confdefs.h <&5 +echo "$as_me: WARNING: no tic program found for fallbacks" >&2;} + fi + +fi; + +# Check whether --with-infocmp-path or --without-infocmp-path was given. +if test "${with_infocmp_path+set}" = set; then + withval="$with_infocmp_path" + echo "$as_me:9623: checking for infocmp program for fallbacks" >&5 +echo $ECHO_N "checking for infocmp program for fallbacks... $ECHO_C" >&6 + INFOCMP=$withval + echo "$as_me:9626: result: $INFOCMP" >&5 +echo "${ECHO_T}$INFOCMP" >&6 + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$INFOCMP" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval INFOCMP="$INFOCMP" + case "x$INFOCMP" in + (xNONE/*) + INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + INFOCMP=`echo "$INFOCMP" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:9652: error: expected a pathname, not \"$INFOCMP\"" >&5 +echo "$as_me: error: expected a pathname, not \"$INFOCMP\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +else + +test -z "$INFOCMP" && INFOCMP="infocmp" +for ac_prog in $INFOCMP infocmp +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:9665: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_INFOCMP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $INFOCMP in + [\\/]* | ?:[\\/]*) + ac_cv_path_INFOCMP="$INFOCMP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH:/usr/local/ncurses/bin" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_INFOCMP="$ac_dir/$ac_word" + echo "$as_me:9682: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +INFOCMP=$ac_cv_path_INFOCMP + +if test -n "$INFOCMP"; then + echo "$as_me:9693: result: $INFOCMP" >&5 +echo "${ECHO_T}$INFOCMP" >&6 +else + echo "$as_me:9696: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$INFOCMP" && break +done +test -n "$INFOCMP" || INFOCMP="$INFOCMP" + +cf_path_prog="" +cf_path_args="" +IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" +for cf_temp in $ac_cv_path_INFOCMP +do + if test -z "$cf_path_prog" ; then + if test "$with_full_paths" = yes ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_temp" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_temp="$cf_temp" + case "x$cf_temp" in + (xNONE/*) + cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_temp=`echo "$cf_temp" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + break + ;; +esac + + cf_path_prog="$cf_temp" + else + cf_path_prog="`basename "$cf_temp"`" + fi + elif test -z "$cf_path_args" ; then + cf_path_args="$cf_temp" + else + cf_path_args="$cf_path_args $cf_temp" + fi +done +IFS="$cf_save_ifs" + +if test -n "$cf_path_prog" ; then + +echo "${as_me:-configure}:9753: testing defining path for ${cf_path_prog} ..." 1>&5 + +cat >>confdefs.h <>confdefs.h <&5 +echo "$as_me: WARNING: no infocmp program found for fallbacks" >&2;} + fi + +fi; + + test -z "$TIC" && FALLBACK_LIST= + test -z "$INFOCMP" && FALLBACK_LIST= + if test -z "$FALLBACK_LIST" + then + { echo "$as_me:9778: WARNING: ignoring fallback option because tic/infocmp are not available" >&5 +echo "$as_me: WARNING: ignoring fallback option because tic/infocmp are not available" >&2;} + fi +fi + +USE_FALLBACKS= +test -z "$FALLBACK_LIST" && USE_FALLBACKS="#" + +echo "$as_me:9786: checking if you want modern xterm or antique" >&5 +echo $ECHO_N "checking if you want modern xterm or antique... $ECHO_C" >&6 + +# Check whether --with-xterm-new or --without-xterm-new was given. +if test "${with_xterm_new+set}" = set; then + withval="$with_xterm_new" + with_xterm_new=$withval +else + with_xterm_new=yes +fi; +case "$with_xterm_new" in +(no) with_xterm_new=xterm-old;; +(*) with_xterm_new=xterm-new;; +esac +echo "$as_me:9800: result: $with_xterm_new" >&5 +echo "${ECHO_T}$with_xterm_new" >&6 +WHICH_XTERM=$with_xterm_new + +case $host_os in +(*linux-gnu|*cygwin|*mingw32|*msys) + want_xterm_kbs=DEL + ;; +(*) + want_xterm_kbs=BS + ;; +esac + +echo "$as_me:9813: checking if xterm backspace sends BS or DEL" >&5 +echo $ECHO_N "checking if xterm backspace sends BS or DEL... $ECHO_C" >&6 + +# Check whether --with-xterm-kbs or --without-xterm-kbs was given. +if test "${with_xterm_kbs+set}" = set; then + withval="$with_xterm_kbs" + with_xterm_kbs=$withval +else + with_xterm_kbs=auto +fi; +case x$with_xterm_kbs in +(xyes|xno|xBS|xbs|x8) + with_xterm_kbs=BS + ;; +(xDEL|xdel|x127) + with_xterm_kbs=DEL + ;; +(xauto) + with_xterm_kbs=$want_xterm_kbs + ;; +(*) + with_xterm_kbs=$withval + ;; +esac +echo "$as_me:9837: result: $with_xterm_kbs" >&5 +echo "${ECHO_T}$with_xterm_kbs" >&6 +XTERM_KBS=$with_xterm_kbs + +if test "x$with_xterm_kbs" != "x$want_xterm_kbs" +then + { echo "$as_me:9843: WARNING: expected --with-xterm-kbs=$want_xterm_kbs for $host_os, have $with_xterm_kbs" >&5 +echo "$as_me: WARNING: expected --with-xterm-kbs=$want_xterm_kbs for $host_os, have $with_xterm_kbs" >&2;} +fi + +MAKE_TERMINFO= +if test "$use_database" = no ; then + TERMINFO="${datadir}/terminfo" + MAKE_TERMINFO="#" +else + +echo "$as_me:9853: checking for list of terminfo directories" >&5 +echo $ECHO_N "checking for list of terminfo directories... $ECHO_C" >&6 + +# Check whether --with-terminfo-dirs or --without-terminfo-dirs was given. +if test "${with_terminfo_dirs+set}" = set; then + withval="$with_terminfo_dirs" + +else + withval=${TERMINFO_DIRS:-${datadir}/terminfo} +fi; +IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}" +cf_dst_path= +for cf_src_path in $withval +do + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_src_path" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_src_path="$cf_src_path" + case "x$cf_src_path" in + (xNONE/*) + cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:9891: error: expected a pathname, not \"$cf_src_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_src_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR" + cf_dst_path="${cf_dst_path}${cf_src_path}" +done +IFS="$ac_save_ifs" + +# This may use the prefix/exec_prefix symbols which will only yield "NONE" +# so we have to check/work around. We do prefer the result of "eval"... +eval cf_dst_eval="$cf_dst_path" +case "x$cf_dst_eval" in +(xNONE*) + TERMINFO_DIRS=$cf_dst_path + ;; +(*) + TERMINFO_DIRS="$cf_dst_eval" + ;; +esac + +echo "$as_me:9914: result: $TERMINFO_DIRS" >&5 +echo "${ECHO_T}$TERMINFO_DIRS" >&6 +test -n "$TERMINFO_DIRS" && +cat >>confdefs.h <&5 +echo "$as_me: WARNING: ignoring non-directory/file TERMINFO value" >&2;} + unset TERMINFO + ;; +esac + +echo "$as_me:9929: checking for default terminfo directory" >&5 +echo $ECHO_N "checking for default terminfo directory... $ECHO_C" >&6 + +# Check whether --with-default-terminfo-dir or --without-default-terminfo-dir was given. +if test "${with_default_terminfo_dir+set}" = set; then + withval="$with_default_terminfo_dir" + +else + withval="${TERMINFO:-${datadir}/terminfo}" +fi; if test -n "${datadir}/terminfo" ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:9963: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +eval TERMINFO="$withval" + +echo "$as_me:9972: result: $TERMINFO" >&5 +echo "${ECHO_T}$TERMINFO" >&6 + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if big-core option selected... $ECHO_C" >&6 + +# Check whether --enable-big-core or --disable-big-core was given. +if test "${enable_big_core+set}" = set; then + enableval="$enable_big_core" + with_big_core=$enableval +else + if test "$cross_compiling" = yes; then + with_big_core=no +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 9995 "configure" +#include "confdefs.h" + +#include +#include +int main(void) { + unsigned long n = 6000000L; + char *s = malloc(n); + if (s != 0) + s[0] = s[n-1] = 0; + ${cf_cv_main_return:-return}(s == 0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:10009: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10012: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:10014: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10017: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + with_big_core=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +with_big_core=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi; +echo "$as_me:10029: result: $with_big_core" >&5 +echo "${ECHO_T}$with_big_core" >&6 +test "x$with_big_core" = "xyes" && +cat >>confdefs.h <<\EOF +#define HAVE_BIG_CORE 1 +EOF + +### ISO C only guarantees 512-char strings, we have tables which load faster +### when constructed using "big" strings. More than the C compiler, the awk +### program is a limit on most vendor UNIX systems. Check that we can build. +echo "$as_me:10039: checking if big-strings option selected" >&5 +echo $ECHO_N "checking if big-strings option selected... $ECHO_C" >&6 + +# Check whether --enable-big-strings or --disable-big-strings was given. +if test "${enable_big_strings+set}" = set; then + enableval="$enable_big_strings" + with_big_strings=$enableval +else + + case x$AWK in + (x) + eval with_big_strings=no + ;; + (*) + if ( ${AWK} 'BEGIN { xx = "x"; while (length(xx) < 12000) { xx = xx "x"; }; printf("%s\n", xx); }' 2>/dev/null \ + | $AWK '{ printf "%d\n", length($0); }' 2>/dev/null | $AWK 'BEGIN { eqls=0; recs=0; } { recs++; if ($0 == 12000) eqls++; } END { if (recs != 1 || eqls != 1) exit 1; }' 2>/dev/null >/dev/null ) ; then + eval with_big_strings=yes + else + eval with_big_strings=no + fi + ;; + esac + +fi; +echo "$as_me:10063: result: $with_big_strings" >&5 +echo "${ECHO_T}$with_big_strings" >&6 + +USE_BIG_STRINGS=0 +test "x$with_big_strings" = "xyes" && USE_BIG_STRINGS=1 + +### use option --enable-termcap to compile in the termcap fallback support +echo "$as_me:10070: checking if you want termcap-fallback support" >&5 +echo $ECHO_N "checking if you want termcap-fallback support... $ECHO_C" >&6 + +# Check whether --enable-termcap or --disable-termcap was given. +if test "${enable_termcap+set}" = set; then + enableval="$enable_termcap" + with_termcap=$enableval +else + with_termcap=no +fi; +echo "$as_me:10080: result: $with_termcap" >&5 +echo "${ECHO_T}$with_termcap" >&6 + +NCURSES_USE_TERMCAP=0 +if test "x$with_termcap" != "xyes" ; then + if test "$use_database" = no ; then + if test -z "$with_fallback" ; then + { { echo "$as_me:10087: error: You have disabled the database w/o specifying fallbacks" >&5 +echo "$as_me: error: You have disabled the database w/o specifying fallbacks" >&2;} + { (exit 1); exit 1; }; } + fi + fi + +cat >>confdefs.h <<\EOF +#define PURE_TERMINFO 1 +EOF + +else + + if test "$with_ticlib" != no ; then + { { echo "$as_me:10100: error: Options --with-ticlib and --enable-termcap cannot be combined" >&5 +echo "$as_me: error: Options --with-ticlib and --enable-termcap cannot be combined" >&2;} + { (exit 1); exit 1; }; } + fi + + NCURSES_USE_TERMCAP=1 + echo "$as_me:10106: checking for list of termcap files" >&5 +echo $ECHO_N "checking for list of termcap files... $ECHO_C" >&6 + +# Check whether --with-termpath or --without-termpath was given. +if test "${with_termpath+set}" = set; then + withval="$with_termpath" + +else + withval=${TERMPATH:-/etc/termcap:/usr/share/misc/termcap} +fi; +IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${PATH_SEPARATOR}" +cf_dst_path= +for cf_src_path in $withval +do + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_src_path" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_src_path="$cf_src_path" + case "x$cf_src_path" in + (xNONE/*) + cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_src_path=`echo "$cf_src_path" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:10144: error: expected a pathname, not \"$cf_src_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_src_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + test -n "$cf_dst_path" && cf_dst_path="${cf_dst_path}$PATH_SEPARATOR" + cf_dst_path="${cf_dst_path}${cf_src_path}" +done +IFS="$ac_save_ifs" + +# This may use the prefix/exec_prefix symbols which will only yield "NONE" +# so we have to check/work around. We do prefer the result of "eval"... +eval cf_dst_eval="$cf_dst_path" +case "x$cf_dst_eval" in +(xNONE*) + TERMPATH=$cf_dst_path + ;; +(*) + TERMPATH="$cf_dst_eval" + ;; +esac + + echo "$as_me:10167: result: $TERMPATH" >&5 +echo "${ECHO_T}$TERMPATH" >&6 + test -n "$TERMPATH" && +cat >>confdefs.h <&5 +echo $ECHO_N "checking if fast termcap-loader is needed... $ECHO_C" >&6 + +# Check whether --enable-getcap or --disable-getcap was given. +if test "${enable_getcap+set}" = set; then + enableval="$enable_getcap" + with_getcap=$enableval +else + with_getcap=no +fi; + echo "$as_me:10185: result: $with_getcap" >&5 +echo "${ECHO_T}$with_getcap" >&6 + test "x$with_getcap" = "xyes" && +cat >>confdefs.h <<\EOF +#define USE_GETCAP 1 +EOF + + echo "$as_me:10192: checking if translated termcaps will be cached in ~/.terminfo" >&5 +echo $ECHO_N "checking if translated termcaps will be cached in ~/.terminfo... $ECHO_C" >&6 + +# Check whether --enable-getcap-cache or --disable-getcap-cache was given. +if test "${enable_getcap_cache+set}" = set; then + enableval="$enable_getcap_cache" + with_getcap_cache=$enableval +else + with_getcap_cache=no +fi; + echo "$as_me:10202: result: $with_getcap_cache" >&5 +echo "${ECHO_T}$with_getcap_cache" >&6 + test "x$with_getcap_cache" = "xyes" && +cat >>confdefs.h <<\EOF +#define USE_GETCAP_CACHE 1 +EOF + +fi + +### Use option --disable-home-terminfo to completely remove ~/.terminfo +echo "$as_me:10212: checking if ~/.terminfo is wanted" >&5 +echo $ECHO_N "checking if ~/.terminfo is wanted... $ECHO_C" >&6 + +# Check whether --enable-home-terminfo or --disable-home-terminfo was given. +if test "${enable_home_terminfo+set}" = set; then + enableval="$enable_home_terminfo" + with_home_terminfo=$enableval +else + with_home_terminfo=yes +fi; +echo "$as_me:10222: result: $with_home_terminfo" >&5 +echo "${ECHO_T}$with_home_terminfo" >&6 +test "x$with_home_terminfo" = "xyes" && +cat >>confdefs.h <<\EOF +#define USE_HOME_TERMINFO 1 +EOF + +echo "$as_me:10229: checking if you want to permit root to use ncurses environment variables" >&5 +echo $ECHO_N "checking if you want to permit root to use ncurses environment variables... $ECHO_C" >&6 + +# Check whether --enable-root-environ or --disable-root-environ was given. +if test "${enable_root_environ+set}" = set; then + enableval="$enable_root_environ" + with_root_environ=$enableval +else + with_root_environ=yes +fi; +echo "$as_me:10239: result: $with_root_environ" >&5 +echo "${ECHO_T}$with_root_environ" >&6 +test "x$with_root_environ" = xyes && +cat >>confdefs.h <<\EOF +#define USE_ROOT_ENVIRON 1 +EOF + +echo "$as_me:10246: checking if you want to permit setuid programs to access all files" >&5 +echo $ECHO_N "checking if you want to permit setuid programs to access all files... $ECHO_C" >&6 + +# Check whether --enable-root-access or --disable-root-access was given. +if test "${enable_root_access+set}" = set; then + enableval="$enable_root_access" + with_root_access=$enableval +else + with_root_access=yes +fi; +echo "$as_me:10256: result: $with_root_access" >&5 +echo "${ECHO_T}$with_root_access" >&6 +test "x$with_root_access" = xyes && +cat >>confdefs.h <<\EOF +#define USE_ROOT_ACCESS 1 +EOF + +echo "$as_me:10263: checking if you want to permit setuid use of ncurses environment variables" >&5 +echo $ECHO_N "checking if you want to permit setuid use of ncurses environment variables... $ECHO_C" >&6 + +# Check whether --enable-setuid-environ or --disable-setuid-environ was given. +if test "${enable_setuid_environ+set}" = set; then + enableval="$enable_setuid_environ" + with_setuid_environ=$enableval +else + with_setuid_environ=$with_root_environ +fi; +echo "$as_me:10273: result: $with_setuid_environ" >&5 +echo "${ECHO_T}$with_setuid_environ" >&6 +test "x$with_setuid_environ" = xyes && +cat >>confdefs.h <<\EOF +#define USE_SETUID_ENVIRON 1 +EOF + +### Use option --enable-symlinks to make tic use symlinks, not hard links +### to reduce storage requirements for the terminfo database. + +for ac_header in \ +unistd.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:10288: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10294 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:10298: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:10304: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:10323: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10344 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10375: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10378: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10381: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10384: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:10394: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10417 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10448: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10451: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10454: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10457: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:10467: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if link/symlink functions work... $ECHO_C" >&6 +if test "${cf_cv_link_funcs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_link_funcs= + for cf_func in link symlink ; do + if test "$cross_compiling" = yes; then + + eval 'ac_cv_func_'$cf_func'=error' +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10491 "configure" +#include "confdefs.h" + +$ac_includes_default + +int main(void) +{ + int fail = 0; + char src[] = "conftest.tmp"; + char dst[] = "conftest.chk"; + struct stat src_sb, dst_sb; + FILE *fp = fopen(src, "w"); + if (fp == 0) { fail = 3; } else { + fclose(fp); stat(src, &src_sb); + if ($cf_func(src, dst) < 0) { + fail = 1; + } else if (stat(dst, &dst_sb) < 0) { + fail = 2; + } else { + long diff = (dst_sb.st_mtime - src_sb.st_mtime); + if (diff < 0) diff = -diff; + if (diff > 2) fail = 3; + } + } +#ifdef HAVE_UNLINK + unlink(dst); unlink(src); +#else + remove(dst); remove(src); +#endif + ${cf_cv_main_return:-return} (fail); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:10525: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10528: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:10530: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10533: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_link_funcs="$cf_cv_link_funcs $cf_func" + eval 'ac_cv_func_'$cf_func'=yes' +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + eval 'ac_cv_func_'$cf_func'=no' +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + done + test -z "$cf_cv_link_funcs" && cf_cv_link_funcs=no + +fi +echo "$as_me:10551: result: $cf_cv_link_funcs" >&5 +echo "${ECHO_T}$cf_cv_link_funcs" >&6 + test "$ac_cv_func_link" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_LINK 1 +EOF + + test "$ac_cv_func_symlink" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_SYMLINK 1 +EOF + +fi + +with_links=no +with_symlinks=no + +# soft links (symbolic links) are useful for some systems where hard links do +# not work, or to make it simpler to copy terminfo trees around. +if test "x$ac_cv_func_symlink" = xyes ; then + echo "$as_me:10571: checking if tic should use symbolic links" >&5 +echo $ECHO_N "checking if tic should use symbolic links... $ECHO_C" >&6 + +# Check whether --enable-symlinks or --disable-symlinks was given. +if test "${enable_symlinks+set}" = set; then + enableval="$enable_symlinks" + with_symlinks=$enableval +else + with_symlinks=no +fi; + echo "$as_me:10581: result: $with_symlinks" >&5 +echo "${ECHO_T}$with_symlinks" >&6 +fi + +# If we have hard links and did not choose to use soft links instead, there is +# no reason to make this choice optional - use the hard links. +if test "$with_symlinks" = no ; then + echo "$as_me:10588: checking if tic should use hard links" >&5 +echo $ECHO_N "checking if tic should use hard links... $ECHO_C" >&6 + if test "x$ac_cv_func_link" = xyes ; then + with_links=yes + else + with_links=no + fi + echo "$as_me:10595: result: $with_links" >&5 +echo "${ECHO_T}$with_links" >&6 +fi + +test "x$with_links" = xyes && +cat >>confdefs.h <<\EOF +#define USE_LINKS 1 +EOF + +test "x$with_symlinks" = xyes && +cat >>confdefs.h <<\EOF +#define USE_SYMLINKS 1 +EOF + +### use option --enable-broken-linker to force on use of broken-linker support + +echo "$as_me:10611: checking if you want broken-linker support code" >&5 +echo $ECHO_N "checking if you want broken-linker support code... $ECHO_C" >&6 + +# Check whether --enable-broken_linker or --disable-broken_linker was given. +if test "${enable_broken_linker+set}" = set; then + enableval="$enable_broken_linker" + with_broken_linker=$enableval +else + with_broken_linker=no +fi; +echo "$as_me:10621: result: $with_broken_linker" >&5 +echo "${ECHO_T}$with_broken_linker" >&6 + +: "${BROKEN_LINKER:=0}" +if test "x$with_broken_linker" = xyes ; then + +cat >>confdefs.h <<\EOF +#define BROKEN_LINKER 1 +EOF + + BROKEN_LINKER=1 +fi + +### use option --enable-bsdpad to have tputs process BSD-style prefix padding +echo "$as_me:10635: checking if tputs should process BSD-style prefix padding" >&5 +echo $ECHO_N "checking if tputs should process BSD-style prefix padding... $ECHO_C" >&6 + +# Check whether --enable-bsdpad or --disable-bsdpad was given. +if test "${enable_bsdpad+set}" = set; then + enableval="$enable_bsdpad" + with_bsdpad=$enableval +else + with_bsdpad=no +fi; +echo "$as_me:10645: result: $with_bsdpad" >&5 +echo "${ECHO_T}$with_bsdpad" >&6 +test "x$with_bsdpad" = xyes && +cat >>confdefs.h <<\EOF +#define BSD_TPUTS 1 +EOF + +### use option --enable-widec to turn on use of wide-character support +NCURSES_CH_T=chtype +NCURSES_LIBUTF8=0 + +NEED_WCHAR_H=0 +NCURSES_MBSTATE_T=0 +NCURSES_WCHAR_T=0 +NCURSES_WINT_T=0 + +# Check to define _XOPEN_SOURCE "automatically" +CPPFLAGS_before_XOPEN="$CPPFLAGS" + +echo "$as_me:10664: checking if the POSIX test-macros are already defined" >&5 +echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6 +if test "${cf_cv_posix_visible+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 10671 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10690: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10693: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10696: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10699: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_visible=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_visible=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:10710: result: $cf_cv_posix_visible" >&5 +echo "${ECHO_T}$cf_cv_posix_visible" >&6 + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=600 +cf_POSIX_C_SOURCE=199506L +cf_xopen_source= + +case "$host_os" in +(aix[4-7]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(darwin[0-8].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[56].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin|msys|mingw*|linux*uclibc) + +cf_gnu_xopen_source=$cf_XOPEN_SOURCE + +echo "$as_me:10752: checking if this is the GNU C library" >&5 +echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6 +if test "${cf_cv_gnu_library+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 10759 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10778: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10781: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10784: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10787: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_library=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_library=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:10798: result: $cf_cv_gnu_library" >&5 +echo "${ECHO_T}$cf_cv_gnu_library" >&6 + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + echo "$as_me:10806: checking if _DEFAULT_SOURCE can be used as a basis" >&5 +echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6 +if test "${cf_cv_gnu_library_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 10818 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10837: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10840: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10843: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10846: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_library_219=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_library_219=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +echo "$as_me:10858: result: $cf_cv_gnu_library_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_library_219" >&6 + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + echo "$as_me:10863: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_dftsrc_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >"conftest.$ac_ext" <<_ACEOF +#line 10968 "configure" +#include "confdefs.h" + + #include + #include + +int +main (void) +{ + + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10988: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10991: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10994: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10997: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_dftsrc_219=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_dftsrc_219=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:11008: result: $cf_cv_gnu_dftsrc_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6 + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + echo "$as_me:11017: checking if we must define _GNU_SOURCE" >&5 +echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11024 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11039: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11042: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11045: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11048: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_GNU_SOURCE +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11155 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11170: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11173: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11176: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11179: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_source=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:11194: result: $cf_cv_gnu_source" >&5 +echo "${ECHO_T}$cf_cv_gnu_source" >&6 + + if test "$cf_cv_gnu_source" = yes + then + echo "$as_me:11199: checking if we should also define _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_default_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11209 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11224: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11227: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11230: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11233: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_default_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_default_source=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:11244: result: $cf_cv_default_source" >&5 +echo "${ECHO_T}$cf_cv_default_source" >&6 + if test "$cf_cv_default_source" = yes + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + fi + fi + fi + +fi + + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:11281: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:11287: testing if the symbol is already defined go no further ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11290 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11305: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11308: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11311: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11314: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 11335 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11350: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11353: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11356: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11359: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + +echo "${as_me:-configure}:11370: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:11378: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11381 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11396: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11399: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11402: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11405: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:11421: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[6-9]*) + # OpenBSD 6.x has broken locale support, both compile-time and runtime. + # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + # Abusing the conformance level is a workaround. + { echo "$as_me:11538: WARNING: this system does not provide usable locale support" >&5 +echo "$as_me: WARNING: this system does not provide usable locale support" >&2;} + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=700 + ;; +(openbsd[4-5]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[45]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + +echo "$as_me:11570: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11577 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11595: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11598: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11601: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11604: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11616 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11634: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11637: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11640: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11643: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:11658: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +for cf_add_cflags in $cf_temp_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + + cf_save_xopen_cppflags="$CPPFLAGS" + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:11818: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:11824: testing if the symbol is already defined go no further ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11827 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11842: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11845: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11848: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11851: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 11872 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11887: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11890: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11893: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11896: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + +echo "${as_me:-configure}:11907: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:11915: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11918 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11933: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11936: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11939: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11942: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:11958: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + # Some of these niche implementations use copy/paste, double-check... + if test "$cf_cv_xopen_source" = no ; then + test -n "$verbose" && echo " checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE" 1>&6 + +echo "${as_me:-configure}:12071: testing checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 12074 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12092: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12095: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12098: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12101: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + { echo "$as_me:12108: WARNING: _POSIX_C_SOURCE definition is not usable" >&5 +echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;} + CPPFLAGS="$cf_save_xopen_cppflags" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + ;; +esac + +if test -n "$cf_xopen_source" ; then + +for cf_add_cflags in $cf_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + test -n "$verbose" && echo " removing old option $cf_add_cflags from CFLAGS" 1>&6 + +echo "${as_me:-configure}:12131: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5 + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + test -n "$verbose" && echo " removing old option $cf_add_cflags from CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:12143: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5 + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:12231: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:12241: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:12251: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + echo "$as_me:12263: checking if _XOPEN_SOURCE really is set" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 12266 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12281: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12284: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12287: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12290: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_XOPEN_SOURCE_set=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_XOPEN_SOURCE_set=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:12299: result: $cf_XOPEN_SOURCE_set" >&5 +echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6 + if test "$cf_XOPEN_SOURCE_set" = yes + then + cat >"conftest.$ac_ext" <<_ACEOF +#line 12304 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#error (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12319: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12322: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12325: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12328: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_XOPEN_SOURCE_set_ok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_XOPEN_SOURCE_set_ok=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + if test "$cf_XOPEN_SOURCE_set_ok" = no + then + { echo "$as_me:12339: WARNING: _XOPEN_SOURCE is lower than requested" >&5 +echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} + fi + else + +echo "$as_me:12344: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 12351 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12369: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12372: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12375: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12378: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 12390 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12408: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12411: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12414: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12417: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:12432: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +for cf_add_cflags in $cf_temp_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + + fi +fi +fi # cf_cv_posix_visible + +CPPFLAGS_after_XOPEN="$CPPFLAGS" + +# Work around breakage on OS X + +echo "$as_me:12583: checking if SIGWINCH is defined" >&5 +echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6 +if test "${cf_cv_define_sigwinch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 12590 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12605: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12608: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12611: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12614: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_define_sigwinch=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 12621 "configure" +#include "confdefs.h" + +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include + +int +main (void) +{ +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12639: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12642: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12645: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12648: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_define_sigwinch=maybe +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_define_sigwinch=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:12662: result: $cf_cv_define_sigwinch" >&5 +echo "${ECHO_T}$cf_cv_define_sigwinch" >&6 + +if test "$cf_cv_define_sigwinch" = maybe ; then +echo "$as_me:12666: checking for actual SIGWINCH definition" >&5 +echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6 +if test "${cf_cv_fixup_sigwinch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_fixup_sigwinch=unknown +cf_sigwinch=32 +while test "$cf_sigwinch" != 1 +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 12677 "configure" +#include "confdefs.h" + +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include + +int +main (void) +{ + +#if SIGWINCH != $cf_sigwinch +#error SIGWINCH is not $cf_sigwinch +#endif +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12699: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12702: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12705: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12708: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_fixup_sigwinch=$cf_sigwinch + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +cf_sigwinch="`expr "$cf_sigwinch" - 1`" +done + +fi +echo "$as_me:12722: result: $cf_cv_fixup_sigwinch" >&5 +echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6 + + if test "$cf_cv_fixup_sigwinch" != unknown ; then + CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch" + fi +fi + +# Checks for CODESET support. + +echo "$as_me:12732: checking for nl_langinfo and CODESET" >&5 +echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 +if test "${am_cv_langinfo_codeset+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 12738 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +int +main (void) +{ +char* cs = nl_langinfo(CODESET); (void)cs + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12752: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12755: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12758: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12761: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + am_cv_langinfo_codeset=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +am_cv_langinfo_codeset=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:12772: result: $am_cv_langinfo_codeset" >&5 +echo "${ECHO_T}$am_cv_langinfo_codeset" >&6 + if test "$am_cv_langinfo_codeset" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LANGINFO_CODESET 1 +EOF + + fi + +# use these variables to work around a defect in gcc's fixincludes. +NCURSES_OK_WCHAR_T= +NCURSES_OK_WINT_T= + +echo "$as_me:12786: checking if you want wide-character code" >&5 +echo $ECHO_N "checking if you want wide-character code... $ECHO_C" >&6 + +# Check whether --enable-widec or --disable-widec was given. +if test "${enable_widec+set}" = set; then + enableval="$enable_widec" + with_widec=$enableval +else + with_widec=$cf_dft_widec +fi; +echo "$as_me:12796: result: $with_widec" >&5 +echo "${ECHO_T}$with_widec" >&6 + +NCURSES_WCWIDTH_GRAPHICS=1 + +if test "x$with_widec" = xyes ; then + if test "x$disable_lib_suffixes" = xno ; then + LIB_SUFFIX="w${LIB_SUFFIX}" + fi + +cat >>confdefs.h <<\EOF +#define USE_WIDEC_SUPPORT 1 +EOF + +cat >>confdefs.h <<\EOF +#define NCURSES_WIDECHAR 1 +EOF + + case "$CPPFLAGS" in + (*_XOPEN_SOURCE=*) + ;; + (*) + { echo "$as_me:12818: WARNING: _XOPEN_SOURCE feature test macro appears to be predefined" >&5 +echo "$as_me: WARNING: _XOPEN_SOURCE feature test macro appears to be predefined" >&2;} + # CPPFLAGS="$CPPFLAGS -DNCURSES_WIDECHAR" + CPPFLAGS_after_XOPEN="$CPPFLAGS_after_XOPEN -DNCURSES_WIDECHAR" + ;; + esac + +for ac_header in \ +wchar.h \ +wctype.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:12831: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 12837 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:12841: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:12847: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:12866: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if wchar.h can be used as is... $ECHO_C" >&6 +if test "${cf_cv_wchar_h_okay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 12883 "configure" +#include "confdefs.h" + +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif +#ifdef HAVE_WCTYPE_H +#include +#endif + +int +main (void) +{ + + wint_t foo = 0; + int bar = iswpunct(foo); (void) bar + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12905: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12908: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12911: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12914: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wchar_h_okay=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_wchar_h_okay=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:12924: result: $cf_cv_wchar_h_okay" >&5 +echo "${ECHO_T}$cf_cv_wchar_h_okay" >&6 + +if test "$cf_cv_wchar_h_okay" = no +then + +echo "$as_me:12930: checking if we must define _XOPEN_SOURCE_EXTENDED" >&5 +echo $ECHO_N "checking if we must define _XOPEN_SOURCE_EXTENDED... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 12933 "configure" +#include "confdefs.h" +#include + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE_EXTENDED +#error _XOPEN_SOURCE_EXTENDED is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12949: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12952: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12955: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12958: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:12967: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +if test "$cf_result" = yes ; then + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED" +elif test "x" != "x" ; then + echo "$as_me:12973: checking checking for compatible value versus " >&5 +echo $ECHO_N "checking checking for compatible value versus ... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 12976 "configure" +#include "confdefs.h" +#include + +int +main (void) +{ + +#if _XOPEN_SOURCE_EXTENDED- < 0 +#error _XOPEN_SOURCE_EXTENDED- is negative +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12992: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12995: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12998: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13001: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:13010: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + if test "$cf_result" = no ; then + # perhaps we can override it - try... + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE_EXTENDED=" + fi +fi + +fi + +echo "$as_me:13020: checking if wcwidth agrees graphics are single-width" >&5 +echo $ECHO_N "checking if wcwidth agrees graphics are single-width... $ECHO_C" >&6 +if test "${cf_cv_wcwidth_graphics+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.in <"conftest.$ac_ext" <<_ACEOF +#line 13091 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include +#include + +#define MY_LEN 80 + +int +main(void) +{ + FILE *fp; + unsigned value; + char buffer[MY_LEN + 1]; + char notes[MY_LEN + 1]; + int totals = 0; + int passed = 0; + + if (setlocale(LC_ALL, "en_US.UTF8") || + setlocale(LC_ALL, "en_US.UTF-8") || + setlocale(LC_ALL, "en_US.utf8") || + setlocale(LC_ALL, "en_US.utf-8")) { + if ((fp = fopen("conftest.in", "r")) != 0) { + while (fgets(buffer, MY_LEN, fp) != 0) { + if (*buffer == '-') { + fprintf(stderr, "\\t%s", buffer); + } else if (sscanf(buffer, "%x %s", &value, notes) == 2) { + ++totals; + if (wcwidth((int)value) == 1) + ++passed; + fprintf(stderr, "%d\\t%s", wcwidth((int)value), buffer); + } else { + fprintf(stderr, "?\\t%s", buffer); + } + } + } + } + fprintf(stderr, "%d/%d passed wcwidth/graphics check\\n", passed, totals); + return (totals == passed) ? 0 : 1; +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:13136: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13139: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:13141: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13144: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wcwidth_graphics=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_wcwidth_graphics=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:13157: result: $cf_cv_wcwidth_graphics" >&5 +echo "${ECHO_T}$cf_cv_wcwidth_graphics" >&6 + + test "$cf_cv_wcwidth_graphics" = no && NCURSES_WCWIDTH_GRAPHICS=0 + + # with_overwrite=no + NCURSES_CH_T=cchar_t + +for ac_func in putwc btowc wctob wmemchr mbtowc wctomb mblen mbrlen mbrtowc wcsrtombs mbsrtowcs wcstombs mbstowcs +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:13168: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 13174 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13205: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13208: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13211: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13214: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:13224: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 13245 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:13249: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:13255: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:13274: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6 +if test "${cf_cv_utf8_lib+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LIBS="$LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 13292 "configure" +#include "confdefs.h" + +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif + +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13309: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13312: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13315: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13318: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_utf8_lib=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these +# will be set on completion of the AC_TRY_LINK below. +cf_cv_header_path_utf8= +cf_cv_library_path_utf8= + +echo "${as_me:-configure}:13330: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5 + +cf_save_LIBS="$LIBS" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 13335 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13348: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13351: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13354: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13357: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_find_linkage_utf8=yes + cf_cv_header_path_utf8=/usr/include + cf_cv_library_path_utf8=/usr/lib + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +LIBS="-lutf8 $cf_save_LIBS" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 13371 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13384: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13387: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13390: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13393: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_find_linkage_utf8=yes + cf_cv_header_path_utf8=/usr/include + cf_cv_library_path_utf8=/usr/lib + cf_cv_library_file_utf8="-lutf8" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_find_linkage_utf8=no + LIBS="$cf_save_LIBS" + + test -n "$verbose" && echo " find linkage for utf8 library" 1>&6 + +echo "${as_me:-configure}:13410: testing find linkage for utf8 library ..." 1>&5 + +echo "${as_me:-configure}:13412: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5 + + cf_save_CPPFLAGS="$CPPFLAGS" + cf_test_CPPFLAGS="$CPPFLAGS" + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/utf8" && cf_search="$cf_search $cf_header_path/include/utf8" + test -d "$cf_header_path/include/utf8/include" && cf_search="$cf_search $cf_header_path/include/utf8/include" + test -d "$cf_header_path/utf8/include" && cf_search="$cf_search $cf_header_path/utf8/include" + test -d "$cf_header_path/utf8/include/utf8" && cf_search="$cf_search $cf_header_path/utf8/include/utf8" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/utf8" && cf_search="$cf_search $prefix/include/utf8" + test -d "$prefix/include/utf8/include" && cf_search="$cf_search $prefix/include/utf8/include" + test -d "$prefix/utf8/include" && cf_search="$cf_search $prefix/utf8/include" + test -d "$prefix/utf8/include/utf8" && cf_search="$cf_search $prefix/utf8/include/utf8" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/include/utf8" + test -d "$cf_subdir_prefix/include/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/include/utf8/include" + test -d "$cf_subdir_prefix/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/utf8/include" + test -d "$cf_subdir_prefix/utf8/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8" +} + +cf_search="$cf_search $cf_header_path_list" + + for cf_cv_header_path_utf8 in $cf_search + do + if test -d "$cf_cv_header_path_utf8" ; then + test -n "$verbose" && echo " ... testing $cf_cv_header_path_utf8" 1>&6 + +echo "${as_me:-configure}:13503: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13511 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13524: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13527: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13530: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13533: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " ... found utf8 headers in $cf_cv_header_path_utf8" 1>&6 + +echo "${as_me:-configure}:13538: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5 + + cf_cv_find_linkage_utf8=maybe + cf_test_CPPFLAGS="$CPPFLAGS" + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + done + + if test "$cf_cv_find_linkage_utf8" = maybe ; then + +echo "${as_me:-configure}:13556: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5 + + cf_save_LIBS="$LIBS" + cf_save_LDFLAGS="$LDFLAGS" + + if test "$cf_cv_find_linkage_utf8" != yes ; then + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/utf8" && cf_search="$cf_search $cf_library_path/lib/utf8" + test -d "$cf_library_path/lib/utf8/lib" && cf_search="$cf_search $cf_library_path/lib/utf8/lib" + test -d "$cf_library_path/utf8/lib" && cf_search="$cf_search $cf_library_path/utf8/lib" + test -d "$cf_library_path/utf8/lib/utf8" && cf_search="$cf_search $cf_library_path/utf8/lib/utf8" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/utf8" && cf_search="$cf_search $prefix/lib/utf8" + test -d "$prefix/lib/utf8/lib" && cf_search="$cf_search $prefix/lib/utf8/lib" + test -d "$prefix/utf8/lib" && cf_search="$cf_search $prefix/utf8/lib" + test -d "$prefix/utf8/lib/utf8" && cf_search="$cf_search $prefix/utf8/lib/utf8" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8" + test -d "$cf_subdir_prefix/lib/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib" + test -d "$cf_subdir_prefix/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib" + test -d "$cf_subdir_prefix/utf8/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_cv_library_path_utf8 in $cf_search + do + if test -d "$cf_cv_library_path_utf8" ; then + test -n "$verbose" && echo " ... testing $cf_cv_library_path_utf8" 1>&6 + +echo "${as_me:-configure}:13631: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5 + + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-lutf8 $cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8" + cat >"conftest.$ac_ext" <<_ACEOF +#line 13637 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13650: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13653: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13656: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13659: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " ... found utf8 library in $cf_cv_library_path_utf8" 1>&6 + +echo "${as_me:-configure}:13664: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5 + + cf_cv_find_linkage_utf8=yes + cf_cv_library_file_utf8="-lutf8" + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + fi + done + CPPFLAGS="$cf_save_CPPFLAGS" + LDFLAGS="$cf_save_LDFLAGS" + fi + + else + cf_cv_find_linkage_utf8=no + fi + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +LIBS="$cf_save_LIBS" + +if test "$cf_cv_find_linkage_utf8" = yes ; then +cf_cv_utf8_lib=add-on +else +cf_cv_utf8_lib=no +fi + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:13706: result: $cf_cv_utf8_lib" >&5 +echo "${ECHO_T}$cf_cv_utf8_lib" >&6 + +# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between +# ncurses/ncursesw: +if test "$cf_cv_utf8_lib" = "add-on" ; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBUTF8_H 1 +EOF + +if test -n "$cf_cv_header_path_utf8" ; then + for cf_add_incdir in $cf_cv_header_path_utf8 + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 13744 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13756: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13759: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13762: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13765: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:13782: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +if test -n "$cf_cv_library_path_utf8" ; then + for cf_add_libdir in $cf_cv_library_path_utf8 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:13818: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + if test "$cf_cv_utf8_lib" != no ; then + NCURSES_LIBUTF8=1 + fi + fi + +# This is needed on Tru64 5.0 to declare mbstate_t +echo "$as_me:13850: checking if we must include wchar.h to declare mbstate_t" >&5 +echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6 +if test "${cf_cv_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 13857 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +mbstate_t state; (void)state + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13875: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13878: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13881: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13884: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_mbstate_t=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 13891 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +mbstate_t value; (void) value + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13910: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13913: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13916: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13919: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_mbstate_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_mbstate_t=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:13931: result: $cf_cv_mbstate_t" >&5 +echo "${ECHO_T}$cf_cv_mbstate_t" >&6 + +if test "$cf_cv_mbstate_t" = yes ; then + +cat >>confdefs.h <<\EOF +#define NEED_WCHAR_H 1 +EOF + + NEED_WCHAR_H=1 +fi + +# if we do not find mbstate_t in either place, use substitution to provide a fallback. +if test "$cf_cv_mbstate_t" = unknown ; then + NCURSES_MBSTATE_T=1 +fi + +# This is needed on Tru64 5.0 to declare wchar_t +echo "$as_me:13949: checking if we must include wchar.h to declare wchar_t" >&5 +echo $ECHO_N "checking if we must include wchar.h to declare wchar_t... $ECHO_C" >&6 +if test "${cf_cv_wchar_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 13956 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wchar_t state; (void)state + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:13974: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:13977: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:13980: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13983: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wchar_t=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 13990 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wchar_t value; (void) value + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14009: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14012: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14015: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14018: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wchar_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_wchar_t=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:14030: result: $cf_cv_wchar_t" >&5 +echo "${ECHO_T}$cf_cv_wchar_t" >&6 + +if test "$cf_cv_wchar_t" = yes ; then + +cat >>confdefs.h <<\EOF +#define NEED_WCHAR_H 1 +EOF + + NEED_WCHAR_H=1 +fi + +# if we do not find wchar_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wchar_t" = unknown ; then + NCURSES_WCHAR_T=1 +fi + +# if we find wchar_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wchar_t" != unknown ; then + NCURSES_OK_WCHAR_T=1 +fi + +# This is needed on Tru64 5.0 to declare wint_t +echo "$as_me:14053: checking if we must include wchar.h to declare wint_t" >&5 +echo $ECHO_N "checking if we must include wchar.h to declare wint_t... $ECHO_C" >&6 +if test "${cf_cv_wint_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 14060 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wint_t state; (void)state + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14078: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14081: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14084: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14087: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wint_t=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 14094 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wint_t value; (void) value + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14113: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14116: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14119: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14122: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wint_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_wint_t=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:14134: result: $cf_cv_wint_t" >&5 +echo "${ECHO_T}$cf_cv_wint_t" >&6 + +if test "$cf_cv_wint_t" = yes ; then + +cat >>confdefs.h <<\EOF +#define NEED_WCHAR_H 1 +EOF + + NEED_WCHAR_H=1 +fi + +# if we do not find wint_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wint_t" = unknown ; then + NCURSES_WINT_T=1 +fi + +# if we find wint_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wint_t" != unknown ; then + NCURSES_OK_WINT_T=1 +fi + + if test "$NCURSES_MBSTATE_T" != 0; then + +cat >>confdefs.h <<\EOF +#define NEED_MBSTATE_T_DEF 1 +EOF + + fi +fi + +### use option --disable-lp64 to allow long chtype +echo "$as_me:14166: checking whether to enable _LP64 definition in curses.h" >&5 +echo $ECHO_N "checking whether to enable _LP64 definition in curses.h... $ECHO_C" >&6 + +# Check whether --enable-lp64 or --disable-lp64 was given. +if test "${enable_lp64+set}" = set; then + enableval="$enable_lp64" + with_lp64=$enableval +else + with_lp64=$cf_dft_with_lp64 +fi; +echo "$as_me:14176: result: $with_lp64" >&5 +echo "${ECHO_T}$with_lp64" >&6 + +if test "x$with_lp64" = xyes ; then + cf_cv_enable_lp64=1 +else + cf_cv_enable_lp64=0 +fi + +# Check whether --enable-largefile or --disable-largefile was given. +if test "${enable_largefile+set}" = set; then + enableval="$enable_largefile" + +fi; +if test "$enable_largefile" != no; then + + echo "$as_me:14192: checking for special C compiler options needed for large files" >&5 +echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_largefile_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat >"conftest.$ac_ext" <<_ACEOF +#line 14204 "configure" +#include "confdefs.h" +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14224: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14227: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14230: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14233: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" + CC="$CC -n32" + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14243: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14246: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14249: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14252: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_largefile_CC=' -n32'; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" + break + done + CC=$ac_save_CC + rm -f "conftest.$ac_ext" + fi +fi +echo "$as_me:14266: result: $ac_cv_sys_largefile_CC" >&5 +echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6 + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + echo "$as_me:14272: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_file_offset_bits+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_file_offset_bits=no + cat >"conftest.$ac_ext" <<_ACEOF +#line 14280 "configure" +#include "confdefs.h" +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14300: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14303: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14306: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14309: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 14318 "configure" +#include "confdefs.h" +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14339: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14342: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14345: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14348: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_file_offset_bits=64; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + break +done +fi +echo "$as_me:14359: result: $ac_cv_sys_file_offset_bits" >&5 +echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6 +if test "$ac_cv_sys_file_offset_bits" != no; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_large_files+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_large_files=no + cat >"conftest.$ac_ext" <<_ACEOF +#line 14377 "configure" +#include "confdefs.h" +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14397: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14400: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14403: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14406: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 14415 "configure" +#include "confdefs.h" +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14436: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14439: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14442: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14445: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_large_files=1; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + break +done +fi +echo "$as_me:14456: result: $ac_cv_sys_large_files" >&5 +echo "${ECHO_T}$ac_cv_sys_large_files" >&6 +if test "$ac_cv_sys_large_files" != no; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6 +if test "${ac_cv_sys_largefile_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + while :; do + ac_cv_sys_largefile_source=no + cat >"conftest.$ac_ext" <<_ACEOF +#line 14477 "configure" +#include "confdefs.h" +#include + #include +int +main (void) +{ + + int (*my_fseeko)(FILE *, off_t, int) = fseeko; + return my_fseeko(stdin, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14492: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14495: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14498: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14501: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 14510 "configure" +#include "confdefs.h" +#define _LARGEFILE_SOURCE 1 +#include + #include +int +main (void) +{ + + int (*my_fseeko)(FILE *, off_t, int) = fseeko; + return my_fseeko(stdin, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14526: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14529: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14532: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14535: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sys_largefile_source=1; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + break +done +fi +echo "$as_me:14546: result: $ac_cv_sys_largefile_source" >&5 +echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6 +if test "$ac_cv_sys_largefile_source" != no; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for fseeko... $ECHO_C" >&6 +if test "${ac_cv_func_fseeko+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 14566 "configure" +#include "confdefs.h" +#include + #include +int +main (void) +{ +int (*my_fseeko)(FILE *, off_t, int) = fseeko; + return my_fseeko && my_fseeko (stdin, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:14580: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14583: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:14586: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14589: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_fseeko=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_fseeko=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:14599: result: $ac_cv_func_fseeko" >&5 +echo "${ECHO_T}$ac_cv_func_fseeko" >&6 +if test $ac_cv_func_fseeko = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_FSEEKO 1 +EOF + +fi + + # Normally we would collect these definitions in the config.h, + # but (like _XOPEN_SOURCE), some environments rely on having these + # defined before any of the system headers are included. Another + # case comes up with C++, e.g., on AIX the compiler compiles the + # header files by themselves before looking at the body files it is + # told to compile. For ncurses, those header files do not include + # the config.h + if test "$ac_cv_sys_large_files" != no + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_LARGE_FILES" + + fi + if test "$ac_cv_sys_largefile_source" != no + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_LARGEFILE_SOURCE" + + fi + if test "$ac_cv_sys_file_offset_bits" != no + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" + + fi + + echo "$as_me:14638: checking whether to use struct dirent64" >&5 +echo $ECHO_N "checking whether to use struct dirent64... $ECHO_C" >&6 +if test "${cf_cv_struct_dirent64+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 14645 "configure" +#include "confdefs.h" + +#pragma GCC diagnostic error "-Wincompatible-pointer-types" +#include +#include + +#ifndef __REDIRECT +/* if transitional largefile support is setup, this is true */ +extern struct dirent64 * readdir(DIR *); +#endif + +int +main (void) +{ + + DIR *dp = opendir("."); + struct dirent64 *x = readdir(dp); + struct dirent *y = readdir(dp); + int z = x - y; + (void)z; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14672: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14675: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14678: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14681: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_struct_dirent64=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_struct_dirent64=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:14692: result: $cf_cv_struct_dirent64" >&5 +echo "${ECHO_T}$cf_cv_struct_dirent64" >&6 + test "$cf_cv_struct_dirent64" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_STRUCT_DIRENT64 1 +EOF + + fi + +### use option --disable-tparm-varargs to make tparm() conform to X/Open +echo "$as_me:14702: checking if you want tparm not to use X/Open fixed-parameter list" >&5 +echo $ECHO_N "checking if you want tparm not to use X/Open fixed-parameter list... $ECHO_C" >&6 + +# Check whether --enable-tparm-varargs or --disable-tparm-varargs was given. +if test "${enable_tparm_varargs+set}" = set; then + enableval="$enable_tparm_varargs" + with_tparm_varargs=$enableval +else + with_tparm_varargs=yes +fi; +echo "$as_me:14712: result: $with_tparm_varargs" >&5 +echo "${ECHO_T}$with_tparm_varargs" >&6 +NCURSES_TPARM_VARARGS=0 +test "x$with_tparm_varargs" = xyes && NCURSES_TPARM_VARARGS=1 + +### use option --disable-tic-depends to make libtic not explicitly depend on ncurses/ncursesw +if test "$with_ticlib" != no ; then +echo "$as_me:14719: checking if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library" >&5 +echo $ECHO_N "checking if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library... $ECHO_C" >&6 + +# Check whether --enable-tic-depends or --disable-tic-depends was given. +if test "${enable_tic_depends+set}" = set; then + enableval="$enable_tic_depends" + with_tic_depends=$enableval +else + with_tic_depends=yes +fi; +echo "$as_me:14729: result: $with_tic_depends" >&5 +echo "${ECHO_T}$with_tic_depends" >&6 +else + with_tic_depends=no +fi + +### use option --enable-wattr-macros to enable wattr* macros in curses.h +echo "$as_me:14736: checking if you want to enable wattr* macros" >&5 +echo $ECHO_N "checking if you want to enable wattr* macros... $ECHO_C" >&6 + +# Check whether --enable-wattr-macros or --disable-wattr-macros was given. +if test "${enable_wattr_macros+set}" = set; then + enableval="$enable_wattr_macros" + with_wattr_macros=$enableval +else + with_wattr_macros=no +fi; +if [ "x$with_wattr_macros" != xyes ]; then + NCURSES_WATTR_MACROS=0 + echo "$as_me:14748: result: no" >&5 +echo "${ECHO_T}no" >&6 +else + NCURSES_WATTR_MACROS=1 + echo "$as_me:14752: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +fi + +echo "$as_me:14756: checking for X11 rgb file" >&5 +echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6 + +# Check whether --with-x11-rgb or --without-x11-rgb was given. +if test "${with_x11_rgb+set}" = set; then + withval="$with_x11_rgb" + RGB_PATH=$withval +else + RGB_PATH=auto +fi; + +if test "x$RGB_PATH" = xauto +then + RGB_PATH='${exec_prefix}/lib/X11/rgb.txt' + for cf_path in \ + /opt/local/share/X11/rgb.txt \ + /opt/X11/share/X11/rgb.txt \ + /usr/share/X11/rgb.txt \ + /usr/X11/share/X11/rgb.txt \ + /usr/X11/lib/X11/rgb.txt \ + /usr/lib/X11/rgb.txt \ + /etc/X11/rgb.txt \ + /usr/pkg/lib/X11/rgb.txt \ + /usr/X11R7/lib/X11/rgb.txt \ + /usr/X11R6/lib/X11/rgb.txt \ + /usr/X11R5/lib/X11/rgb.txt \ + /usr/X11R4/lib/X11/rgb.txt \ + /usr/local/lib/X11/rgb.txt \ + /usr/local/share/X11/rgb.txt \ + /usr/lib64/X11/rgb.txt + do + if test -f "$cf_path" ; then + RGB_PATH="$cf_path" + break + fi + done +else + cf_path=$RGB_PATH + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_path" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_path="$cf_path" + case "x$cf_path" in + (xNONE/*) + cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:14818: error: expected a pathname, not \"$cf_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi + +echo "$as_me:14826: result: $RGB_PATH" >&5 +echo "${ECHO_T}$RGB_PATH" >&6 + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for type of bool... $ECHO_C" >&6 + +# Check whether --with-bool or --without-bool was given. +if test "${with_bool+set}" = set; then + withval="$with_bool" + NCURSES_BOOL="$withval" +else + NCURSES_BOOL=auto +fi; +echo "$as_me:14851: result: $NCURSES_BOOL" >&5 +echo "${ECHO_T}$NCURSES_BOOL" >&6 +case x$NCURSES_BOOL in +(x|xyes|xno) + { { echo "$as_me:14855: error: expected a type name for bool" >&5 +echo "$as_me: error: expected a type name for bool" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +echo "$as_me:14861: checking for alternate terminal capabilities file" >&5 +echo $ECHO_N "checking for alternate terminal capabilities file... $ECHO_C" >&6 + +# Check whether --with-caps or --without-caps was given. +if test "${with_caps+set}" = set; then + withval="$with_caps" + TERMINFO_CAPS=Caps.$withval +else + TERMINFO_CAPS=Caps +fi; +if test ! -f "${srcdir}/include/${TERMINFO_CAPS}" +then + { echo "$as_me:14873: WARNING: file not found: \"${srcdir}/include/${TERMINFO_CAPS}\"" >&5 +echo "$as_me: WARNING: file not found: \"${srcdir}/include/${TERMINFO_CAPS}\"" >&2;} + TERMINFO_CAPS=Caps +fi +echo "$as_me:14877: result: $TERMINFO_CAPS" >&5 +echo "${ECHO_T}$TERMINFO_CAPS" >&6 + +### use option --with-chtype to override chtype's type + +echo "$as_me:14882: checking for type of chtype" >&5 +echo $ECHO_N "checking for type of chtype... $ECHO_C" >&6 + +# Check whether --with-chtype or --without-chtype was given. +if test "${with_chtype+set}" = set; then + withval="$with_chtype" + NCURSES_CHTYPE="$withval" +else + NCURSES_CHTYPE=$cf_dft_chtype +fi; +echo "$as_me:14892: result: $NCURSES_CHTYPE" >&5 +echo "${ECHO_T}$NCURSES_CHTYPE" >&6 +case x$NCURSES_CHTYPE in +(x|xyes|xno) + { { echo "$as_me:14896: error: expected a type name for chtype" >&5 +echo "$as_me: error: expected a type name for chtype" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +### use option --with-ospeed to override ospeed's type + +echo "$as_me:14904: checking for type of ospeed" >&5 +echo $ECHO_N "checking for type of ospeed... $ECHO_C" >&6 + +# Check whether --with-ospeed or --without-ospeed was given. +if test "${with_ospeed+set}" = set; then + withval="$with_ospeed" + NCURSES_OSPEED="$withval" +else + NCURSES_OSPEED=short +fi; +echo "$as_me:14914: result: $NCURSES_OSPEED" >&5 +echo "${ECHO_T}$NCURSES_OSPEED" >&6 +case x$NCURSES_OSPEED in +(x|xyes|xno) + { { echo "$as_me:14918: error: expected a type name for ospeed" >&5 +echo "$as_me: error: expected a type name for ospeed" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +### use option --with-mmask-t to override mmask_t's type + +echo "$as_me:14926: checking for type of mmask-t" >&5 +echo $ECHO_N "checking for type of mmask-t... $ECHO_C" >&6 + +# Check whether --with-mmask-t or --without-mmask-t was given. +if test "${with_mmask_t+set}" = set; then + withval="$with_mmask_t" + NCURSES_MMASK_T="$withval" +else + NCURSES_MMASK_T=$cf_dft_mmask_t +fi; +echo "$as_me:14936: result: $NCURSES_MMASK_T" >&5 +echo "${ECHO_T}$NCURSES_MMASK_T" >&6 +case x$NCURSES_MMASK_T in +(x|xyes|xno) + { { echo "$as_me:14940: error: expected a type name for mmask-t" >&5 +echo "$as_me: error: expected a type name for mmask-t" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +### use option --with-ccharw-max to override CCHARW_MAX size +echo "$as_me:14947: checking for size CCHARW_MAX" >&5 +echo $ECHO_N "checking for size CCHARW_MAX... $ECHO_C" >&6 + +# Check whether --with-ccharw-max or --without-ccharw-max was given. +if test "${with_ccharw_max+set}" = set; then + withval="$with_ccharw_max" + NCURSES_CCHARW_MAX="$withval" +else + NCURSES_CCHARW_MAX=$cf_dft_ccharw_max +fi; +echo "$as_me:14957: result: $NCURSES_CCHARW_MAX" >&5 +echo "${ECHO_T}$NCURSES_CCHARW_MAX" >&6 + +echo "$as_me:14960: checking for signed char" >&5 +echo $ECHO_N "checking for signed char... $ECHO_C" >&6 +if test "${ac_cv_type_signed_char+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 14966 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((signed char *) 0) + return 0; +if (sizeof (signed char)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:14981: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14984: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:14987: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14990: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_signed_char=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_signed_char=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:15000: result: $ac_cv_type_signed_char" >&5 +echo "${ECHO_T}$ac_cv_type_signed_char" >&6 + +echo "$as_me:15003: checking size of signed char" >&5 +echo $ECHO_N "checking size of signed char... $ECHO_C" >&6 +if test "${ac_cv_sizeof_signed_char+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$ac_cv_type_signed_char" = yes; then + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >"conftest.$ac_ext" <<_ACEOF +#line 15012 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) >= 0)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15024: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15027: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15030: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15033: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 15038 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15050: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15053: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15056: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15059: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=-1 ac_mid=-1 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 15075 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) >= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15087: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15090: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15093: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15096: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"` + cat >"conftest.$ac_ext" <<_ACEOF +#line 15112 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (signed char)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:15124: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15127: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:15130: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15133: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +ac_cv_sizeof_signed_char=$ac_lo +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:15146: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 15151 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +FILE *f = fopen ("conftest.val", "w"); +if (!f) + $ac_main_return (1); +fprintf (f, "%ld", (long)(sizeof (signed char))); +fclose (f); + ; + return 0; +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:15167: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15170: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:15172: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15175: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sizeof_signed_char=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_signed_char=0 +fi +fi +echo "$as_me:15191: result: $ac_cv_sizeof_signed_char" >&5 +echo "${ECHO_T}$ac_cv_sizeof_signed_char" >&6 +cat >>confdefs.h <&5 +echo $ECHO_N "checking whether to use signed chars for Boolean array in term.h... $ECHO_C" >&6 + +# Check whether --enable-signed-char or --disable-signed-char was given. +if test "${enable_signed_char+set}" = set; then + enableval="$enable_signed_char" + with_signed_char=$enableval +else + with_signed_char=$cf_dft_signed_char +fi; +echo "$as_me:15212: result: $with_signed_char" >&5 +echo "${ECHO_T}$with_signed_char" >&6 +test "x$with_signed_char" != xyes && NCURSES_SBOOL="char" + +### use option --with-tparm-arg to override tparm's argument type + +echo "$as_me:15218: checking for type of tparm-arg" >&5 +echo $ECHO_N "checking for type of tparm-arg... $ECHO_C" >&6 + +# Check whether --with-tparm-arg or --without-tparm-arg was given. +if test "${with_tparm_arg+set}" = set; then + withval="$with_tparm_arg" + NCURSES_TPARM_ARG="$withval" +else + NCURSES_TPARM_ARG=$cf_dft_tparm_arg +fi; +echo "$as_me:15228: result: $NCURSES_TPARM_ARG" >&5 +echo "${ECHO_T}$NCURSES_TPARM_ARG" >&6 +case x$NCURSES_TPARM_ARG in +(x|xyes|xno) + { { echo "$as_me:15232: error: expected a type name for tparm-arg" >&5 +echo "$as_me: error: expected a type name for tparm-arg" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +### Enable compiling-in rcs id's +echo "$as_me:15239: checking if RCS identifiers should be compiled-in" >&5 +echo $ECHO_N "checking if RCS identifiers should be compiled-in... $ECHO_C" >&6 + +# Check whether --with-rcs-ids or --without-rcs-ids was given. +if test "${with_rcs_ids+set}" = set; then + withval="$with_rcs_ids" + with_rcs_ids=$withval +else + with_rcs_ids=no +fi; +echo "$as_me:15249: result: $with_rcs_ids" >&5 +echo "${ECHO_T}$with_rcs_ids" >&6 +test "x$with_rcs_ids" = xyes && +cat >>confdefs.h <<\EOF +#define USE_RCS_IDS 1 +EOF + +############################################################################### + +echo "$as_me:15258: checking format of man-pages" >&5 +echo $ECHO_N "checking format of man-pages... $ECHO_C" >&6 + +# Check whether --with-manpage-format or --without-manpage-format was given. +if test "${with_manpage_format+set}" = set; then + withval="$with_manpage_format" + MANPAGE_FORMAT=$withval +else + MANPAGE_FORMAT=unknown +fi; + +test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=unknown +MANPAGE_FORMAT=`echo "$MANPAGE_FORMAT" | sed -e 's/,/ /g'` + +cf_unknown= + +case "$MANPAGE_FORMAT" in +(unknown) + if test -z "$MANPATH" ; then + MANPATH="/usr/man:/usr/share/man" + fi + + # look for the 'date' man-page (it is most likely to be installed!) + MANPAGE_FORMAT= + cf_preform="no" + cf_catonly="yes" + cf_example="date" + + IFS="${IFS:- }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for cf_dir in $MANPATH; do + test -z "$cf_dir" && cf_dir=/usr/man + for cf_name in $cf_dir/man*/$cf_example.[01]* $cf_dir/cat*/$cf_example.[01]* $cf_dir/man*/$cf_example $cf_dir/cat*/$cf_example + do + cf_test=`echo "$cf_name" | sed -e 's/*//'` + if test "x$cf_test" = "x$cf_name" ; then + + case "$cf_name" in + (*.bz2) MANPAGE_FORMAT="$MANPAGE_FORMAT bzip2";; + (*.xz) MANPAGE_FORMAT="$MANPAGE_FORMAT xz";; + (*.gz) MANPAGE_FORMAT="$MANPAGE_FORMAT gzip";; + (*.Z) MANPAGE_FORMAT="$MANPAGE_FORMAT compress";; + (*.0) MANPAGE_FORMAT="$MANPAGE_FORMAT BSDI";; + (*) MANPAGE_FORMAT="$MANPAGE_FORMAT normal";; + esac + + case "$cf_name" in + ($cf_dir/man*) + cf_catonly=no + ;; + ($cf_dir/cat*) + cf_preform=yes + ;; + esac + break + fi + + # if we found a match in either man* or cat*, stop looking + if test -n "$MANPAGE_FORMAT" ; then + cf_found=no + test "$cf_preform" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT formatted" + test "$cf_catonly" = yes && MANPAGE_FORMAT="$MANPAGE_FORMAT catonly" + case "$cf_name" in + ($cf_dir/cat*) + cf_found=yes + ;; + esac + test "$cf_found" = yes && break + fi + done + # only check the first directory in $MANPATH where we find manpages + if test -n "$MANPAGE_FORMAT" ; then + break + fi + done + # if we did not find the example, just assume it is normal + test -z "$MANPAGE_FORMAT" && MANPAGE_FORMAT=normal + IFS="$ac_save_ifs" + ;; +(*) + for cf_option in $MANPAGE_FORMAT; do + case "$cf_option" in + (xz|bzip2|gzip|compress|BSDI|normal|formatted|catonly) + ;; + (*) + cf_unknown="$cf_unknown $cf_option" + ;; + esac + done + ;; +esac + +echo "$as_me:15349: result: $MANPAGE_FORMAT" >&5 +echo "${ECHO_T}$MANPAGE_FORMAT" >&6 +if test -n "$cf_unknown" ; then + { echo "$as_me:15352: WARNING: Unexpected manpage-format $cf_unknown" >&5 +echo "$as_me: WARNING: Unexpected manpage-format $cf_unknown" >&2;} +fi + +cf_manpage_format=no +cf_manpage_inboth=no +cf_manpage_so_strip= +cf_manpage_compress= +cf_manpage_coptions= + +for cf_item in $MANPAGE_FORMAT +do +case "$cf_item" in +(catonly) + cf_manpage_format=yes + cf_manpage_inboth=no + ;; +(formatted) + cf_manpage_format=yes + cf_manpage_inboth=yes + ;; +(compress) + cf_manpage_so_strip="Z" + cf_manpage_compress=compress + ;; +(gzip) + cf_manpage_so_strip="gz" + cf_manpage_compress=gzip + cf_manpage_coptions=-n + ;; +(bzip2) + cf_manpage_so_strip="bz2" + cf_manpage_compress=bzip2 + ;; +(xz) + cf_manpage_so_strip="xz" + cf_manpage_compress=xz + ;; +esac +done + +echo "$as_me:15393: checking for manpage renaming" >&5 +echo $ECHO_N "checking for manpage renaming... $ECHO_C" >&6 + +# Check whether --with-manpage-renames or --without-manpage-renames was given. +if test "${with_manpage_renames+set}" = set; then + withval="$with_manpage_renames" + MANPAGE_RENAMES=$withval +else + MANPAGE_RENAMES=yes +fi; + +case ".$MANPAGE_RENAMES" in +(.no) + ;; +(.|.yes) + # Debian 'man' program? + if test -f /etc/debian_version ; then + MANPAGE_RENAMES=man/man_db.renames + else + MANPAGE_RENAMES=no + fi + ;; +esac + +if test "$MANPAGE_RENAMES" = man/man_db.renames ; then + MANPAGE_RENAMES=`pwd`/$MANPAGE_RENAMES +elif test "$MANPAGE_RENAMES" = no ; then + : +elif test ! -f "$MANPAGE_RENAMES" ; then + { { echo "$as_me:15422: error: not a filename: $MANPAGE_RENAMES" >&5 +echo "$as_me: error: not a filename: $MANPAGE_RENAMES" >&2;} + { (exit 1); exit 1; }; } +fi + +echo "$as_me:15427: result: $MANPAGE_RENAMES" >&5 +echo "${ECHO_T}$MANPAGE_RENAMES" >&6 + +echo "$as_me:15430: checking if manpage aliases will be installed" >&5 +echo $ECHO_N "checking if manpage aliases will be installed... $ECHO_C" >&6 + +# Check whether --with-manpage-aliases or --without-manpage-aliases was given. +if test "${with_manpage_aliases+set}" = set; then + withval="$with_manpage_aliases" + MANPAGE_ALIASES=$withval +else + MANPAGE_ALIASES=yes +fi; + +echo "$as_me:15441: result: $MANPAGE_ALIASES" >&5 +echo "${ECHO_T}$MANPAGE_ALIASES" >&6 + +case "x$LN_S" in +(xln*) + cf_use_symlinks=yes + ;; +(*) + cf_use_symlinks=no + ;; +esac + +MANPAGE_SYMLINKS=no +if test "$MANPAGE_ALIASES" = yes ; then +echo "$as_me:15455: checking if manpage symlinks should be used" >&5 +echo $ECHO_N "checking if manpage symlinks should be used... $ECHO_C" >&6 + +# Check whether --with-manpage-symlinks or --without-manpage-symlinks was given. +if test "${with_manpage_symlinks+set}" = set; then + withval="$with_manpage_symlinks" + MANPAGE_SYMLINKS=$withval +else + MANPAGE_SYMLINKS=$cf_use_symlinks +fi; + +if test "$cf_use_symlinks" = no; then +if test "$MANPAGE_SYMLINKS" = yes ; then + { echo "$as_me:15468: WARNING: cannot make symlinks" >&5 +echo "$as_me: WARNING: cannot make symlinks" >&2;} + MANPAGE_SYMLINKS=no +fi +fi + +echo "$as_me:15474: result: $MANPAGE_SYMLINKS" >&5 +echo "${ECHO_T}$MANPAGE_SYMLINKS" >&6 +fi + +echo "$as_me:15478: checking for manpage tbl" >&5 +echo $ECHO_N "checking for manpage tbl... $ECHO_C" >&6 + +# Check whether --with-manpage-tbl or --without-manpage-tbl was given. +if test "${with_manpage_tbl+set}" = set; then + withval="$with_manpage_tbl" + MANPAGE_TBL=$withval +else + MANPAGE_TBL=no +fi; + +echo "$as_me:15489: result: $MANPAGE_TBL" >&5 +echo "${ECHO_T}$MANPAGE_TBL" >&6 + +if test "$prefix" = "NONE" ; then + cf_prefix="$ac_default_prefix" +else + cf_prefix="$prefix" +fi + +test ! -d man && mkdir man + +cf_edit_man=./edit_man.sh +cf_man_alias=`pwd`/man_alias.sed + +cat >$cf_edit_man <>$cf_man_alias <<-CF_EOF2 + s,@DATADIR@,\$datadir,g + s,@TERMINFO@,\${TERMINFO:="no default value"},g + s,@TERMINFO_DIRS@,\${TERMINFO_DIRS:="no default value"},g + s,@NCURSES_MAJOR@,\${NCURSES_MAJOR:="no default value"},g + s,@NCURSES_MINOR@,\${NCURSES_MINOR:="no default value"},g + s,@NCURSES_PATCH@,\${NCURSES_PATCH:="no default value"},g + s,@NCURSES_OSPEED@,\${NCURSES_OSPEED:="no default value"},g +CF_EOF + + for cf_name in captoinfo clear infocmp infotocap reset tabs tic toe tput tset + do + cf_NAME=`echo "$cf_name" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + cf_name=`echo "$cf_name" | sed "$program_transform_name"` +cat >>$cf_edit_man <<-CF_EOF + s,@$cf_NAME@,$cf_name,g +CF_EOF + done + +cat >>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <\$TMP +CF_EOF +else +cat >>$cf_edit_man <\$TMP +CF_EOF +fi + +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP +fi +CF_EOF + +if test "$with_overwrite" != yes ; then +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP +CF_EOF +fi + +if test "$with_curses_h" != yes ; then +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP +CF_EOF +fi + +cat >>$cf_edit_man <\$TMP.out + mv \$TMP.out \$TMP + fi +CF_EOF + +if test -n "$cf_manpage_compress" ; then +cat >>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <>$cf_edit_man <\$TMP +CF_EOF +if test -n "$cf_manpage_compress" ; then +cat >>$cf_edit_man <>$cf_edit_man <&5 +echo $ECHO_N "checking if you want to build with function extensions... $ECHO_C" >&6 + +# Check whether --enable-ext-funcs or --disable-ext-funcs was given. +if test "${enable_ext_funcs+set}" = set; then + enableval="$enable_ext_funcs" + with_ext_funcs=$enableval +else + with_ext_funcs=yes +fi; +echo "$as_me:15817: result: $with_ext_funcs" >&5 +echo "${ECHO_T}$with_ext_funcs" >&6 +if test "x$with_ext_funcs" = xyes ; then + NCURSES_EXT_FUNCS=1 + +cat >>confdefs.h <<\EOF +#define NCURSES_EXT_FUNCS 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_ASSUME_DEFAULT_COLORS 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_CURSES_VERSION 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_HAS_KEY 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_RESIZETERM 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_RESIZE_TERM 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_ENTRY_H 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_USE_DEFAULT_COLORS 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_USE_SCREEN 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_USE_WINDOW 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_WRESIZE 1 +EOF + + GENERATED_EXT_FUNCS=generated +else + cf_dft_ext_spfuncs=no + cf_dft_ext_colors=no + NCURSES_EXT_FUNCS=0 + GENERATED_EXT_FUNCS= +fi + +echo "$as_me:15874: checking if you want to build with SCREEN extensions" >&5 +echo $ECHO_N "checking if you want to build with SCREEN extensions... $ECHO_C" >&6 + +# Check whether --enable-sp-funcs or --disable-sp-funcs was given. +if test "${enable_sp_funcs+set}" = set; then + enableval="$enable_sp_funcs" + with_sp_funcs=$enableval +else + with_sp_funcs=$cf_dft_ext_spfuncs +fi; +echo "$as_me:15884: result: $with_sp_funcs" >&5 +echo "${ECHO_T}$with_sp_funcs" >&6 +if test "x$with_sp_funcs" = xyes ; then + NCURSES_SP_FUNCS=1 + +cat >>confdefs.h <<\EOF +#define NCURSES_SP_FUNCS 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_TPUTS_SP 1 +EOF + + GENERATED_SP_FUNCS=generated +else + NCURSES_SP_FUNCS=0 + GENERATED_SP_FUNCS= +fi + +echo "$as_me:15903: checking if you want to build with terminal-driver" >&5 +echo $ECHO_N "checking if you want to build with terminal-driver... $ECHO_C" >&6 + +# Check whether --enable-term-driver or --disable-term-driver was given. +if test "${enable_term_driver+set}" = set; then + enableval="$enable_term_driver" + with_term_driver=$enableval +else + with_term_driver=no +fi; +echo "$as_me:15913: result: $with_term_driver" >&5 +echo "${ECHO_T}$with_term_driver" >&6 +if test "x$with_term_driver" = xyes ; then + +cat >>confdefs.h <<\EOF +#define USE_TERM_DRIVER 1 +EOF + + if test "x$with_termlib" != xno ; then + { { echo "$as_me:15922: error: The term-driver option conflicts with the termlib option" >&5 +echo "$as_me: error: The term-driver option conflicts with the termlib option" >&2;} + { (exit 1); exit 1; }; } + fi + if test "x$with_sp_funcs" != xyes ; then + { { echo "$as_me:15927: error: The term-driver option relies upon sp-funcs" >&5 +echo "$as_me: error: The term-driver option relies upon sp-funcs" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +### use option --enable-const to turn on use of const beyond that in XSI. +echo "$as_me:15934: checking for extended use of const keyword" >&5 +echo $ECHO_N "checking for extended use of const keyword... $ECHO_C" >&6 + +# Check whether --enable-const or --disable-const was given. +if test "${enable_const+set}" = set; then + enableval="$enable_const" + with_ext_const=$enableval +else + with_ext_const=$cf_dft_ext_const +fi; +echo "$as_me:15944: result: $with_ext_const" >&5 +echo "${ECHO_T}$with_ext_const" >&6 +NCURSES_CONST='/*nothing*/' +if test "x$with_ext_const" = xyes ; then + NCURSES_CONST=const +fi + +### use option --enable-ext-colors to turn on use of colors beyond 16. +echo "$as_me:15952: checking if you want to use extended colors" >&5 +echo $ECHO_N "checking if you want to use extended colors... $ECHO_C" >&6 + +# Check whether --enable-ext-colors or --disable-ext-colors was given. +if test "${enable_ext_colors+set}" = set; then + enableval="$enable_ext_colors" + with_ext_colors=$enableval +else + with_ext_colors=$cf_dft_ext_colors +fi; +echo "$as_me:15962: result: $with_ext_colors" >&5 +echo "${ECHO_T}$with_ext_colors" >&6 +NCURSES_EXT_COLORS=0 +if test "x$with_ext_colors" = xyes ; then + if test "x$with_widec" != xyes ; then + { echo "$as_me:15967: WARNING: This option applies only to wide-character library" >&5 +echo "$as_me: WARNING: This option applies only to wide-character library" >&2;} + else + # cannot be ABI 5 since it changes sizeof(cchar_t) + +if test "${with_abi_version+set}" != set; then + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=6.0 + cf_cv_abi_version=6 + cf_cv_abi_default=6 + { echo "$as_me:15978: WARNING: overriding ABI version to $cf_cv_abi_default" >&5 +echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_default" >&2;} + ;; + esac +fi + + NCURSES_EXT_COLORS=1 + +cat >>confdefs.h <<\EOF +#define NCURSES_EXT_COLORS 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_ALLOC_PAIR 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_INIT_EXTENDED_COLOR 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE_RESET_COLOR_PAIRS 1 +EOF + + fi +fi + +### use option --enable-ext-mouse to modify coding to support 5-button mice +echo "$as_me:16006: checking if you want to use extended mouse encoding" >&5 +echo $ECHO_N "checking if you want to use extended mouse encoding... $ECHO_C" >&6 + +# Check whether --enable-ext-mouse or --disable-ext-mouse was given. +if test "${enable_ext_mouse+set}" = set; then + enableval="$enable_ext_mouse" + with_ext_mouse=$enableval +else + with_ext_mouse=$cf_dft_ext_mouse +fi; +echo "$as_me:16016: result: $with_ext_mouse" >&5 +echo "${ECHO_T}$with_ext_mouse" >&6 +if test "x$with_ext_mouse" = xyes ; then + +if test "${with_abi_version+set}" != set; then + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=6.0 + cf_cv_abi_version=6 + cf_cv_abi_default=6 + { echo "$as_me:16026: WARNING: overriding ABI version to $cf_cv_abi_default" >&5 +echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_default" >&2;} + ;; + esac +fi + +fi + +if test $cf_cv_abi_default -le 5 ; then + NCURSES_MOUSE_VERSION=1 +elif test $cf_cv_abi_default -le 6 ; then + NCURSES_MOUSE_VERSION=2 +else + NCURSES_MOUSE_VERSION=3 +fi + +### use option --enable-ext-putwin to turn on extended screendumps +echo "$as_me:16043: checking if you want to use extended putwin/screendump" >&5 +echo $ECHO_N "checking if you want to use extended putwin/screendump... $ECHO_C" >&6 + +# Check whether --enable-ext-putwin or --disable-ext-putwin was given. +if test "${enable_ext_putwin+set}" = set; then + enableval="$enable_ext_putwin" + with_ext_putwin=$enableval +else + with_ext_putwin=$cf_dft_ext_putwin +fi; +echo "$as_me:16053: result: $with_ext_putwin" >&5 +echo "${ECHO_T}$with_ext_putwin" >&6 +if test "x$with_ext_putwin" = xyes ; then + +cat >>confdefs.h <<\EOF +#define NCURSES_EXT_PUTWIN 1 +EOF + +fi + +echo "$as_me:16063: checking if you want \$NCURSES_NO_PADDING code" >&5 +echo $ECHO_N "checking if you want \$NCURSES_NO_PADDING code... $ECHO_C" >&6 + +# Check whether --enable-no-padding or --disable-no-padding was given. +if test "${enable_no_padding+set}" = set; then + enableval="$enable_no_padding" + with_no_padding=$enableval +else + with_no_padding=$with_ext_funcs +fi; +echo "$as_me:16073: result: $with_no_padding" >&5 +echo "${ECHO_T}$with_no_padding" >&6 +test "x$with_no_padding" = xyes && +cat >>confdefs.h <<\EOF +#define NCURSES_NO_PADDING 1 +EOF + +### use option --enable-sigwinch to turn on use of SIGWINCH logic +echo "$as_me:16081: checking if you want SIGWINCH handler" >&5 +echo $ECHO_N "checking if you want SIGWINCH handler... $ECHO_C" >&6 + +# Check whether --enable-sigwinch or --disable-sigwinch was given. +if test "${enable_sigwinch+set}" = set; then + enableval="$enable_sigwinch" + with_sigwinch=$enableval +else + with_sigwinch=$with_ext_funcs +fi; +echo "$as_me:16091: result: $with_sigwinch" >&5 +echo "${ECHO_T}$with_sigwinch" >&6 +if test "x$with_sigwinch" = xyes +then + +cat >>confdefs.h <<\EOF +#define USE_SIGWINCH 1 +EOF + + cf_cv_enable_sigwinch=1 +else + cf_cv_enable_sigwinch=0 +fi + +### use option --enable-tcap-names to allow user to define new capabilities +echo "$as_me:16106: checking if you want user-definable terminal capabilities like termcap" >&5 +echo $ECHO_N "checking if you want user-definable terminal capabilities like termcap... $ECHO_C" >&6 + +# Check whether --enable-tcap-names or --disable-tcap-names was given. +if test "${enable_tcap_names+set}" = set; then + enableval="$enable_tcap_names" + with_tcap_names=$enableval +else + with_tcap_names=$with_ext_funcs +fi; +echo "$as_me:16116: result: $with_tcap_names" >&5 +echo "${ECHO_T}$with_tcap_names" >&6 +NCURSES_XNAMES=0 +if test "x$with_tcap_names" = xyes; then + NCURSES_XNAMES=1 + +cat >>confdefs.h <<\EOF +#define NCURSES_XNAMES 1 +EOF + +fi + +############################################################################## + +echo "$as_me:16130: checking if you want to link with the pthread library" >&5 +echo $ECHO_N "checking if you want to link with the pthread library... $ECHO_C" >&6 + +# Check whether --with-pthread or --without-pthread was given. +if test "${with_pthread+set}" = set; then + withval="$with_pthread" + with_pthread=$withval +else + with_pthread=no +fi; +echo "$as_me:16140: result: $with_pthread" >&5 +echo "${ECHO_T}$with_pthread" >&6 + +if test "$with_pthread" != no ; then + echo "$as_me:16144: checking for pthread.h" >&5 +echo $ECHO_N "checking for pthread.h... $ECHO_C" >&6 +if test "${ac_cv_header_pthread_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 16150 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:16154: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:16160: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_pthread_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_pthread_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:16179: result: $ac_cv_header_pthread_h" >&5 +echo "${ECHO_T}$ac_cv_header_pthread_h" >&6 +if test "$ac_cv_header_pthread_h" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_PTHREADS_H 1 +EOF + + for cf_lib_pthread in pthread c_r + do + echo "$as_me:16189: checking if we can link with the $cf_lib_pthread library" >&5 +echo $ECHO_N "checking if we can link with the $cf_lib_pthread library... $ECHO_C" >&6 + cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 16210 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + int rc = pthread_create(0,0,0,0); + int r2 = pthread_mutexattr_settype(0, 0); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16227: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16230: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16233: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16236: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + with_pthread=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +with_pthread=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + echo "$as_me:16246: result: $with_pthread" >&5 +echo "${ECHO_T}$with_pthread" >&6 + test "$with_pthread" = yes && break + done + + if test "$with_pthread" = yes ; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_lib_pthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cat >>confdefs.h <<\EOF +#define HAVE_LIBPTHREADS 1 +EOF + + else + { { echo "$as_me:16274: error: Cannot link with pthread library" >&5 +echo "$as_me: error: Cannot link with pthread library" >&2;} + { (exit 1); exit 1; }; } + fi + +fi + +fi + +if test "x$with_pthread" != xno; then + echo "$as_me:16284: checking for pthread_kill" >&5 +echo $ECHO_N "checking for pthread_kill... $ECHO_C" >&6 +if test "${ac_cv_func_pthread_kill+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 16290 "configure" +#include "confdefs.h" +#define pthread_kill autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef pthread_kill + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_kill (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_pthread_kill) || defined (__stub___pthread_kill) +#error found stub for pthread_kill +#endif + + return pthread_kill (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16321: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16324: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16327: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16330: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_pthread_kill=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_pthread_kill=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:16340: result: $ac_cv_func_pthread_kill" >&5 +echo "${ECHO_T}$ac_cv_func_pthread_kill" >&6 +if test "$ac_cv_func_pthread_kill" = yes; then + + echo "$as_me:16344: checking if you want to allow EINTR in wgetch with pthreads" >&5 +echo $ECHO_N "checking if you want to allow EINTR in wgetch with pthreads... $ECHO_C" >&6 + +# Check whether --enable-pthreads-eintr or --disable-pthreads-eintr was given. +if test "${enable_pthreads_eintr+set}" = set; then + enableval="$enable_pthreads_eintr" + use_pthreads_eintr=$enableval +else + use_pthreads_eintr=no +fi; + echo "$as_me:16354: result: $use_pthreads_eintr" >&5 +echo "${ECHO_T}$use_pthreads_eintr" >&6 + if test "x$use_pthreads_eintr" = xyes ; then + +cat >>confdefs.h <<\EOF +#define USE_PTHREADS_EINTR 1 +EOF + + fi +fi + + echo "$as_me:16365: checking if you want to use weak-symbols for pthreads" >&5 +echo $ECHO_N "checking if you want to use weak-symbols for pthreads... $ECHO_C" >&6 + +# Check whether --enable-weak-symbols or --disable-weak-symbols was given. +if test "${enable_weak_symbols+set}" = set; then + enableval="$enable_weak_symbols" + use_weak_symbols=$enableval +else + use_weak_symbols=no +fi; + echo "$as_me:16375: result: $use_weak_symbols" >&5 +echo "${ECHO_T}$use_weak_symbols" >&6 + if test "x$use_weak_symbols" = xyes ; then + +echo "$as_me:16379: checking if $CC supports weak symbols" >&5 +echo $ECHO_N "checking if $CC supports weak symbols... $ECHO_C" >&6 +if test "${cf_cv_weak_symbols+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 16386 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ + +#if defined(__GNUC__) +# if defined __USE_ISOC99 +# define _cat_pragma(exp) _Pragma(#exp) +# define _weak_pragma(exp) _cat_pragma(weak name) +# else +# define _weak_pragma(exp) +# endif +# define _declare(name) __extension__ extern __typeof__(name) name +# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) +#endif + +weak_symbol(fopen); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:16412: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16415: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:16418: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16421: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_weak_symbols=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_weak_symbols=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:16432: result: $cf_cv_weak_symbols" >&5 +echo "${ECHO_T}$cf_cv_weak_symbols" >&6 + + else + cf_cv_weak_symbols=no + fi + + if test "x$cf_cv_weak_symbols" = xyes ; then + +cat >>confdefs.h <<\EOF +#define USE_WEAK_SYMBOLS 1 +EOF + + fi +fi + +PTHREAD= +if test "x$with_pthread" = "xyes" ; then + +cat >>confdefs.h <<\EOF +#define USE_PTHREADS 1 +EOF + + enable_reentrant=yes + if test "x$cf_cv_weak_symbols" = xyes ; then + PTHREAD=-lpthread + +cf_add_libs="$PRIVATE_LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +PRIVATE_LIBS="$cf_add_libs" + + fi +fi + +# Reentrant code has to be opaque; there's little advantage to making ncurses +# opaque outside of that, so there is no --enable-opaque option. We can use +# this option without --with-pthreads, but this will be always set for +# pthreads. +echo "$as_me:16482: checking if you want reentrant code" >&5 +echo $ECHO_N "checking if you want reentrant code... $ECHO_C" >&6 + +# Check whether --enable-reentrant or --disable-reentrant was given. +if test "${enable_reentrant+set}" = set; then + enableval="$enable_reentrant" + with_reentrant=$enableval +else + with_reentrant=no +fi; +echo "$as_me:16492: result: $with_reentrant" >&5 +echo "${ECHO_T}$with_reentrant" >&6 +if test "x$with_reentrant" = xyes ; then + cf_cv_enable_reentrant=1 + cf_cv_enable_opaque="NCURSES_INTERNALS" + NCURSES_SIZE_T=int + if test "x$cf_cv_weak_symbols" = xyes ; then + +# remove pthread library from $LIBS +LIBS=`echo "$LIBS" | sed -e 's/-lpthread[ ]//g' -e 's/-lpthread$//'` + +cf_add_libs="$TEST_LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +TEST_LIBS="$cf_add_libs" + +cf_add_libs="$TEST_LIBS2" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +TEST_LIBS2="$cf_add_libs" + +cf_add_libs="$PRIVATE_LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +PRIVATE_LIBS="$cf_add_libs" + + else + # when not using weak symbols but with_reentrant, + # add 't' to the library suffix on all platforms + # except cygwin, where we only do that if ALSO + # compiling with full thread support. + case "$host" in + (*cygwin* | *msys*) + if test "$with_pthread" = "yes" ; then + if test "x$disable_lib_suffixes" = "xno" ; then + LIB_SUFFIX="t${LIB_SUFFIX}" + fi + fi ;; + (*) + if test "x$disable_lib_suffixes" = "xno" ; then + LIB_SUFFIX="t${LIB_SUFFIX}" + fi + ;; + esac + fi + +cat >>confdefs.h <<\EOF +#define USE_REENTRANT 1 +EOF + +if test "${with_abi_version+set}" != set; then + case "$cf_cv_rel_version" in + (5.*) + cf_cv_rel_version=6.0 + cf_cv_abi_version=6 + cf_cv_abi_default=6 + { echo "$as_me:16581: WARNING: overriding ABI version to $cf_cv_abi_default" >&5 +echo "$as_me: WARNING: overriding ABI version to $cf_cv_abi_default" >&2;} + ;; + esac +fi + +else + cf_cv_enable_reentrant=0 + cf_cv_enable_opaque="NCURSES_OPAQUE" + NCURSES_SIZE_T=$cf_dft_ordinate_type +fi + +echo "$as_me:16593: checking whether curses library structures should be opaque" >&5 +echo $ECHO_N "checking whether curses library structures should be opaque... $ECHO_C" >&6 + +# Check whether --enable-opaque-curses or --disable-opaque-curses was given. +if test "${enable_opaque_curses+set}" = set; then + enableval="$enable_opaque_curses" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_opaque_curses=no + else + + test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes + test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses + + fi +else + enableval=yes + + test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes + test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses + +fi; +echo "$as_me:16615: result: $enable_opaque_curses" >&5 +echo "${ECHO_T}$enable_opaque_curses" >&6 + +test "$cf_cv_enable_reentrant" = 1 && \ +test "$enable_opaque_curses" = no && \ +{ { echo "$as_me:16620: error: reentrant configuration requires opaque library" >&5 +echo "$as_me: error: reentrant configuration requires opaque library" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:16624: checking whether form library structures should be opaque" >&5 +echo $ECHO_N "checking whether form library structures should be opaque... $ECHO_C" >&6 + +# Check whether --enable-opaque-form or --disable-opaque-form was given. +if test "${enable_opaque_form+set}" = set; then + enableval="$enable_opaque_form" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_opaque_form=no + else + enable_opaque_form=$cf_dft_opaque_curses + fi +else + enableval=yes + enable_opaque_form=$cf_dft_opaque_curses + +fi; +echo "$as_me:16641: result: $enable_opaque_form" >&5 +echo "${ECHO_T}$enable_opaque_form" >&6 + +echo "$as_me:16644: checking whether menu library structures should be opaque" >&5 +echo $ECHO_N "checking whether menu library structures should be opaque... $ECHO_C" >&6 + +# Check whether --enable-opaque-menu or --disable-opaque-menu was given. +if test "${enable_opaque_menu+set}" = set; then + enableval="$enable_opaque_menu" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_opaque_menu=no + else + enable_opaque_menu=$cf_dft_opaque_curses + fi +else + enableval=yes + enable_opaque_menu=$cf_dft_opaque_curses + +fi; +echo "$as_me:16661: result: $enable_opaque_menu" >&5 +echo "${ECHO_T}$enable_opaque_menu" >&6 + +echo "$as_me:16664: checking whether panel library structures should be opaque" >&5 +echo $ECHO_N "checking whether panel library structures should be opaque... $ECHO_C" >&6 + +# Check whether --enable-opaque-panel or --disable-opaque-panel was given. +if test "${enable_opaque_panel+set}" = set; then + enableval="$enable_opaque_panel" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_opaque_panel=no + else + enable_opaque_panel=$cf_dft_opaque_curses + fi +else + enableval=yes + enable_opaque_panel=$cf_dft_opaque_curses + +fi; +echo "$as_me:16681: result: $enable_opaque_panel" >&5 +echo "${ECHO_T}$enable_opaque_panel" >&6 + +NCURSES_OPAQUE=0; test "$enable_opaque_curses" = yes && NCURSES_OPAQUE=1 +NCURSES_OPAQUE_FORM=0; test "$enable_opaque_form" = yes && NCURSES_OPAQUE_FORM=1 +NCURSES_OPAQUE_MENU=0; test "$enable_opaque_menu" = yes && NCURSES_OPAQUE_MENU=1 +NCURSES_OPAQUE_PANEL=0; test "$enable_opaque_panel" = yes && NCURSES_OPAQUE_PANEL=1 + +### Allow using a different wrap-prefix +if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then + echo "$as_me:16691: checking for prefix used to wrap public variables" >&5 +echo $ECHO_N "checking for prefix used to wrap public variables... $ECHO_C" >&6 + +# Check whether --with-wrap-prefix or --without-wrap-prefix was given. +if test "${with_wrap_prefix+set}" = set; then + withval="$with_wrap_prefix" + NCURSES_WRAP_PREFIX=$withval +else + NCURSES_WRAP_PREFIX=_nc_ +fi; + echo "$as_me:16701: result: $NCURSES_WRAP_PREFIX" >&5 +echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6 +else + NCURSES_WRAP_PREFIX=_nc_ +fi + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want all development code... $ECHO_C" >&6 + +# Check whether --with-develop or --without-develop was given. +if test "${with_develop+set}" = set; then + withval="$with_develop" + with_develop=$withval +else + with_develop=no +fi; +echo "$as_me:16724: result: $with_develop" >&5 +echo "${ECHO_T}$with_develop" >&6 + +### use option --enable-check-size to detect screensize with CPR +echo "$as_me:16728: checking if you want to check screensize of serial terminals" >&5 +echo $ECHO_N "checking if you want to check screensize of serial terminals... $ECHO_C" >&6 + +# Check whether --enable-check-size or --disable-check-size was given. +if test "${enable_check_size+set}" = set; then + enableval="$enable_check_size" + +else + enable_check_size=$with_develop +fi; +echo "$as_me:16738: result: $enable_check_size" >&5 +echo "${ECHO_T}$enable_check_size" >&6 +test "x$enable_check_size" = xyes && +cat >>confdefs.h <<\EOF +#define USE_CHECK_SIZE 1 +EOF + +### use option --enable-hard-tabs to turn on use of hard-tabs optimize +echo "$as_me:16746: checking if you want hard-tabs code" >&5 +echo $ECHO_N "checking if you want hard-tabs code... $ECHO_C" >&6 + +# Check whether --enable-hard-tabs or --disable-hard-tabs was given. +if test "${enable_hard_tabs+set}" = set; then + enableval="$enable_hard_tabs" + +else + enable_hard_tabs=$with_develop +fi; +echo "$as_me:16756: result: $enable_hard_tabs" >&5 +echo "${ECHO_T}$enable_hard_tabs" >&6 +test "x$enable_hard_tabs" = xyes && +cat >>confdefs.h <<\EOF +#define USE_HARD_TABS 1 +EOF + +### use option --enable-xmc-glitch to turn on use of magic-cookie optimize +echo "$as_me:16764: checking if you want limited support for xmc" >&5 +echo $ECHO_N "checking if you want limited support for xmc... $ECHO_C" >&6 + +# Check whether --enable-xmc-glitch or --disable-xmc-glitch was given. +if test "${enable_xmc_glitch+set}" = set; then + enableval="$enable_xmc_glitch" + +else + enable_xmc_glitch=$with_develop +fi; +echo "$as_me:16774: result: $enable_xmc_glitch" >&5 +echo "${ECHO_T}$enable_xmc_glitch" >&6 +test "x$enable_xmc_glitch" = xyes && +cat >>confdefs.h <<\EOF +#define USE_XMC_SUPPORT 1 +EOF + +############################################################################### +# These are just experimental, probably should not be in a package: + +echo "$as_me:16784: checking if you do not want to assume colors are white-on-black" >&5 +echo $ECHO_N "checking if you do not want to assume colors are white-on-black... $ECHO_C" >&6 + +# Check whether --enable-assumed-color or --disable-assumed-color was given. +if test "${enable_assumed_color+set}" = set; then + enableval="$enable_assumed_color" + with_assumed_color=$enableval +else + with_assumed_color=yes +fi; +echo "$as_me:16794: result: $with_assumed_color" >&5 +echo "${ECHO_T}$with_assumed_color" >&6 +test "x$with_assumed_color" = xyes && +cat >>confdefs.h <<\EOF +#define USE_ASSUMED_COLOR 1 +EOF + +### use option --enable-hashmap to turn on use of hashmap scrolling logic +echo "$as_me:16802: checking if you want hashmap scrolling-optimization code" >&5 +echo $ECHO_N "checking if you want hashmap scrolling-optimization code... $ECHO_C" >&6 + +# Check whether --enable-hashmap or --disable-hashmap was given. +if test "${enable_hashmap+set}" = set; then + enableval="$enable_hashmap" + with_hashmap=$enableval +else + with_hashmap=yes +fi; +echo "$as_me:16812: result: $with_hashmap" >&5 +echo "${ECHO_T}$with_hashmap" >&6 +test "x$with_hashmap" = xyes && +cat >>confdefs.h <<\EOF +#define USE_HASHMAP 1 +EOF + +### use option --enable-colorfgbg to turn on use of $COLORFGBG environment +echo "$as_me:16820: checking if you want colorfgbg code" >&5 +echo $ECHO_N "checking if you want colorfgbg code... $ECHO_C" >&6 + +# Check whether --enable-colorfgbg or --disable-colorfgbg was given. +if test "${enable_colorfgbg+set}" = set; then + enableval="$enable_colorfgbg" + with_colorfgbg=$enableval +else + with_colorfgbg=no +fi; +echo "$as_me:16830: result: $with_colorfgbg" >&5 +echo "${ECHO_T}$with_colorfgbg" >&6 +test "x$with_colorfgbg" = xyes && +cat >>confdefs.h <<\EOF +#define USE_COLORFGBG 1 +EOF + +### use option --enable-fvisibility to turn on use of gcc-specific feature +echo "$as_me:16838: checking if you want to use gcc -fvisibility option" >&5 +echo $ECHO_N "checking if you want to use gcc -fvisibility option... $ECHO_C" >&6 + +# Check whether --enable-fvisibility or --disable-fvisibility was given. +if test "${enable_fvisibility+set}" = set; then + enableval="$enable_fvisibility" + cf_with_fvisibility=$enableval +else + cf_with_fvisibility=no +fi; +echo "$as_me:16848: result: $cf_with_fvisibility" >&5 +echo "${ECHO_T}$cf_with_fvisibility" >&6 + +NCURSES_IMPEXP= +NCURSES_CXX_IMPEXP= +if test "x$cf_with_fvisibility" = xyes; then + +echo "$as_me:16855: checking if $CC -fvisibility=hidden option works" >&5 +echo $ECHO_N "checking if $CC -fvisibility=hidden option works... $ECHO_C" >&6 +if test "${cf_cv_fvisibility_hidden+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_cflags="$CFLAGS" + CFLAGS="$CFLAGS -fvisibility=hidden" + cat >"conftest.$ac_ext" <<_ACEOF +#line 16864 "configure" +#include "confdefs.h" + +__attribute__ ((visibility("default"))) int somefunc() {return 42;} + +int +main (void) +{ + + if (somefunc()) return 1; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16880: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16883: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16886: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16889: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_fvisibility_hidden=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_fvisibility_hidden=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + CFLAGS=$cf_save_cflags + +fi +echo "$as_me:16901: result: $cf_cv_fvisibility_hidden" >&5 +echo "${ECHO_T}$cf_cv_fvisibility_hidden" >&6 + + if test "x$cf_cv_fvisibility_hidden" = xyes + then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -fvisibility=hidden +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + NCURSES_IMPEXP="__attribute__ ((visibility(\"default\")))" + fi + if test -n "$CXX" + then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +echo "$as_me:17016: checking if $CXX -fvisibility=hidden option works" >&5 +echo $ECHO_N "checking if $CXX -fvisibility=hidden option works... $ECHO_C" >&6 +if test "${cf_cv_fvisibility_hidden2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_cflags="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -fvisibility=hidden" + cat >"conftest.$ac_ext" <<_ACEOF +#line 17025 "configure" +#include "confdefs.h" + +__attribute__ ((visibility("default"))) int somefunc() {return 42;} + +int +main (void) +{ + + if (somefunc()) return 1; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17041: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17044: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17047: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17050: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_fvisibility_hidden2=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_fvisibility_hidden2=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + CXXFLAGS=$cf_save_cflags + +fi +echo "$as_me:17062: result: $cf_cv_fvisibility_hidden2" >&5 +echo "${ECHO_T}$cf_cv_fvisibility_hidden2" >&6 + + if test "x$cf_cv_fvisibility_hidden2" = xyes + then + +cf_save_CXXFLAGS="$CFLAGS" +CFLAGS="$CXXFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -fvisibility=hidden +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +CXXFLAGS="$CFLAGS" +CFLAGS="$cf_save_CXXFLAGS" + + NCURSES_CXX_IMPEXP="__attribute__ ((visibility(\"default\")))" + fi + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + + fi +fi + +### use option --enable-interop to turn on use of bindings used for interop +echo "$as_me:17185: checking if you want interop bindings" >&5 +echo $ECHO_N "checking if you want interop bindings... $ECHO_C" >&6 + +# Check whether --enable-interop or --disable-interop was given. +if test "${enable_interop+set}" = set; then + enableval="$enable_interop" + with_exp_interop=$enableval +else + with_exp_interop=$cf_dft_interop +fi; +echo "$as_me:17195: result: $with_exp_interop" >&5 +echo "${ECHO_T}$with_exp_interop" >&6 + +NCURSES_INTEROP_FUNCS=0 +test "x$with_exp_interop" = xyes && NCURSES_INTEROP_FUNCS=1 + +echo "$as_me:17201: checking if you want experimental safe-sprintf code" >&5 +echo $ECHO_N "checking if you want experimental safe-sprintf code... $ECHO_C" >&6 + +# Check whether --enable-safe-sprintf or --disable-safe-sprintf was given. +if test "${enable_safe_sprintf+set}" = set; then + enableval="$enable_safe_sprintf" + with_safe_sprintf=$enableval +else + with_safe_sprintf=no +fi; +echo "$as_me:17211: result: $with_safe_sprintf" >&5 +echo "${ECHO_T}$with_safe_sprintf" >&6 + +### use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic +# when hashmap is used scroll hints are useless +if test "$with_hashmap" = no ; then +echo "$as_me:17217: checking if you want to experiment without scrolling-hints code" >&5 +echo $ECHO_N "checking if you want to experiment without scrolling-hints code... $ECHO_C" >&6 + +# Check whether --enable-scroll-hints or --disable-scroll-hints was given. +if test "${enable_scroll_hints+set}" = set; then + enableval="$enable_scroll_hints" + with_scroll_hints=$enableval +else + with_scroll_hints=yes +fi; +echo "$as_me:17227: result: $with_scroll_hints" >&5 +echo "${ECHO_T}$with_scroll_hints" >&6 +test "x$with_scroll_hints" = xyes && +cat >>confdefs.h <<\EOF +#define USE_SCROLL_HINTS 1 +EOF + +fi + +echo "$as_me:17236: checking if you want wgetch-events code" >&5 +echo $ECHO_N "checking if you want wgetch-events code... $ECHO_C" >&6 + +# Check whether --enable-wgetch-events or --disable-wgetch-events was given. +if test "${enable_wgetch_events+set}" = set; then + enableval="$enable_wgetch_events" + with_wgetch_events=$enableval +else + with_wgetch_events=no +fi; +echo "$as_me:17246: result: $with_wgetch_events" >&5 +echo "${ECHO_T}$with_wgetch_events" >&6 +if test "x$with_wgetch_events" = xyes ; then + +cat >>confdefs.h <<\EOF +#define NCURSES_WGETCH_EVENTS 1 +EOF + + NCURSES_WGETCH_EVENTS=1 +else + NCURSES_WGETCH_EVENTS=0 +fi + +case "$cf_cv_system_name" in +(*mingw32*|*mingw64*|*-msvc*) + echo "$as_me:17261: checking if you want experimental-Windows driver" >&5 +echo $ECHO_N "checking if you want experimental-Windows driver... $ECHO_C" >&6 + +# Check whether --enable-exp-win32 or --disable-exp-win32 was given. +if test "${enable_exp_win32+set}" = set; then + enableval="$enable_exp_win32" + with_exp_win32=$enableval +else + with_exp_win32=no +fi; + echo "$as_me:17271: result: $with_exp_win32" >&5 +echo "${ECHO_T}$with_exp_win32" >&6 + if test "x$with_exp_win32" = xyes + then + +cat >>confdefs.h <<\EOF +#define EXP_WIN32_DRIVER 1 +EOF + + EXP_WIN32_DRIVER=1 + INTERNALS_HDR='$(INCDIR)/nc_win32.h' + else + INTERNALS_HDR='$(INCDIR)/nc_mingw.h' + EXP_WIN32_DRIVER=0 + fi + ;; +(*) + EXP_WIN32_DRIVER=0 + INTERNALS_HDR= + ;; +esac + +############################################################################### + +### use option --disable-echo to suppress full display compiling commands + +echo "$as_me:17297: checking if you want to see long compiling messages" >&5 +echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6 + +# Check whether --enable-echo or --disable-echo was given. +if test "${enable_echo+set}" = set; then + enableval="$enable_echo" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + + ECHO_LT='--silent' + ECHO_LD='@echo linking $@;' + RULE_CC='@echo compiling $<' + SHOW_CC='@echo compiling $@' + ECHO_CC='@' + + else + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + + fi +else + enableval=yes + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + +fi; +echo "$as_me:17331: result: $enableval" >&5 +echo "${ECHO_T}$enableval" >&6 + +if test "x$enable_echo" = xyes; then + ECHO_LINK= +else + ECHO_LINK='@ echo linking $@ ... ;' + test -n "$LIBTOOL" && LIBTOOL="$LIBTOOL --silent" + test -n "$LIBTOOL_CXX" && LIBTOOL_CXX="$LIBTOOL_CXX --silent" +fi + +# --disable-stripping is used for debugging + +echo "$as_me:17344: checking if you want to install stripped executables" >&5 +echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6 + +# Check whether --enable-stripping or --disable-stripping was given. +if test "${enable_stripping+set}" = set; then + enableval="$enable_stripping" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_stripping=no + else + enable_stripping=yes + fi +else + enableval=yes + enable_stripping=yes + +fi; +echo "$as_me:17361: result: $enable_stripping" >&5 +echo "${ECHO_T}$enable_stripping" >&6 + +if test "$enable_stripping" = yes +then + INSTALL_OPT_S="-s" +else + INSTALL_OPT_S= +fi + +: "${INSTALL:=install}" +echo "$as_me:17372: checking if install accepts -p option" >&5 +echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6 +if test "${cf_cv_install_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -rf ./conftest* + date >conftest.in + mkdir conftest.out + sleep 3 + if $INSTALL -p conftest.in conftest.out 2>/dev/null + then + if test -f conftest.out/conftest.in + then + test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \ + test conftest.out/conftest.in -nt conftest.in 2>conftest.err + if test -s conftest.err + then + cf_cv_install_p=no + else + cf_cv_install_p=yes + fi + else + cf_cv_install_p=no + fi + else + cf_cv_install_p=no + fi + rm -rf ./conftest* + +fi +echo "$as_me:17403: result: $cf_cv_install_p" >&5 +echo "${ECHO_T}$cf_cv_install_p" >&6 + +echo "$as_me:17406: checking if install needs to be told about ownership" >&5 +echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6 +case `$ac_config_guess` in +(*minix) + with_install_o=yes + ;; +(*) + with_install_o=no + ;; +esac + +echo "$as_me:17417: result: $with_install_o" >&5 +echo "${ECHO_T}$with_install_o" >&6 +if test "x$with_install_o" = xyes +then + INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`" +else + INSTALL_OPT_O= +fi + +if test -n "$INSTALL_OPT_S" +then + echo "$as_me:17428: checking if you want to specify strip-program" >&5 +echo $ECHO_N "checking if you want to specify strip-program... $ECHO_C" >&6 + +# Check whether --with-strip-program or --without-strip-program was given. +if test "${with_strip_program+set}" = set; then + withval="$with_strip_program" + with_strip_program=$withval +else + with_strip_program=no +fi; + echo "$as_me:17438: result: $with_strip_program" >&5 +echo "${ECHO_T}$with_strip_program" >&6 + if test "$with_strip_program" != no + then + echo "$as_me:17442: checking if strip-program is supported with this installer" >&5 +echo $ECHO_N "checking if strip-program is supported with this installer... $ECHO_C" >&6 + cf_install_program=`echo "$INSTALL" | sed -e 's%[ ]*[ ]-.%%'` + check_install_strip=no + if test -f "$cf_install_program" + then + check_install_version=`"$cf_install_program" --version 2>/dev/null | head -n 1 | grep coreutils` + if test -n "$check_install_version" + then + check_install_strip="option" + else + for check_strip_variable in STRIPBIN STRIP + do + if strings "$cf_install_program" | grep "^$check_strip_variable$" >/dev/null + then + check_install_strip="environ" + break + fi + done + fi + fi + echo "$as_me:17463: result: $check_install_strip" >&5 +echo "${ECHO_T}$check_install_strip" >&6 + case "$check_install_strip" in + (no) + { echo "$as_me:17467: WARNING: $cf_install_program does not support strip program option" >&5 +echo "$as_me: WARNING: $cf_install_program does not support strip program option" >&2;} + with_strip_program=no + ;; + (environ) + cat >install.tmp <<-CF_EOF + #! $SHELL + STRIPBIN="$with_strip_program" \\ + STRIP="$with_strip_program" \\ + $INSTALL "$@" + CF_EOF + INSTALL="`pwd`/install.tmp" + chmod +x "$INSTALL" + test -n "$verbose" && echo " created $INSTALL" 1>&6 + +echo "${as_me:-configure}:17482: testing created $INSTALL ..." 1>&5 + + ;; + (option) + INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" + ;; + esac + fi +fi + +# If we're avoiding relinking of shared libraries during install, that is to +# avoid modifying the build-tree. For the same reason, avoid doing ranlib if +# the install program has "-p" (for preserving timestamps). +cf_cv_do_reranlib=yes +if test "x$cf_cv_install_p" = xyes +then + if test "x$cf_cv_do_relink" != xyes + then + cf_cv_do_reranlib=no + INSTALL_OPT_P="-p" + INSTALL_LIB="$INSTALL_LIB $INSTALL_OPT_P" + fi +fi + +### use option --enable-warnings to turn on all gcc warnings + +echo "$as_me:17508: checking if you want to use C11 _Noreturn feature" >&5 +echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6 + +# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given. +if test "${enable_stdnoreturn+set}" = set; then + enableval="$enable_stdnoreturn" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_stdnoreturn=yes + else + enable_stdnoreturn=no + fi +else + enableval=no + enable_stdnoreturn=no + +fi; +echo "$as_me:17525: result: $enable_stdnoreturn" >&5 +echo "${ECHO_T}$enable_stdnoreturn" >&6 + +if test $enable_stdnoreturn = yes; then +echo "$as_me:17529: checking for C11 _Noreturn feature" >&5 +echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6 +if test "${cf_cv_c11_noreturn+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17535 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +static _Noreturn void giveup(void) { exit(0); } + +int +main (void) +{ +if (feof(stdin)) giveup() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17551: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17554: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17557: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17560: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_c11_noreturn=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_c11_noreturn=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:17571: result: $cf_cv_c11_noreturn" >&5 +echo "${ECHO_T}$cf_cv_c11_noreturn" >&6 +else + cf_cv_c11_noreturn=no, +fi + +if test "$cf_cv_c11_noreturn" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_STDNORETURN_H 1 +EOF + +cat >>confdefs.h <&6 + +echo "${as_me:-configure}:17627: testing repairing CFLAGS: $CFLAGS ..." 1>&5 + + CFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6 + +echo "${as_me:-configure}:17632: testing ... fixed $CFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:17636: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + case $CPPFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $CPPFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$CPPFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing CPPFLAGS: $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:17675: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5 + + CPPFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:17680: testing ... fixed $CPPFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:17684: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + case $LDFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $LDFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$LDFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing LDFLAGS: $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:17723: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5 + + LDFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:17728: testing ... fixed $LDFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:17732: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +echo "$as_me:17739: checking if you want to turn on gcc warnings" >&5 +echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6 + +# Check whether --enable-warnings or --disable-warnings was given. +if test "${enable_warnings+set}" = set; then + enableval="$enable_warnings" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_warnings=yes + else + enable_warnings=no + fi +else + enableval=no + enable_warnings=no + +fi; +echo "$as_me:17756: result: $enable_warnings" >&5 +echo "${ECHO_T}$enable_warnings" >&6 +if test "$enable_warnings" = "yes" +then + +if test "x$have_x" = xyes; then + +cf_save_LIBS_CF_CONST_X_STRING="$LIBS" +cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS" +cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + +cat >"conftest.$ac_ext" <<_ACEOF +#line 17780 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +String foo = malloc(1); free((void*)foo) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17795: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17798: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17801: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17804: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + +echo "$as_me:17807: checking for X11/Xt const-feature" >&5 +echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6 +if test "${cf_cv_const_x_string+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 17814 "configure" +#include "confdefs.h" + +#undef _CONST_X_STRING +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + +int +main (void) +{ +String foo = malloc(1); *foo = 0 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17832: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17835: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17838: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17841: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_const_x_string=no + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_const_x_string=yes + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:17856: result: $cf_cv_const_x_string" >&5 +echo "${ECHO_T}$cf_cv_const_x_string" >&6 + +LIBS="$cf_save_LIBS_CF_CONST_X_STRING" +CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING" +CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING" + +case "$cf_cv_const_x_string" in +(no) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES" + + ;; +(*) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING" + + ;; +esac + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi +cat > "conftest.$ac_ext" <&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall" + for cf_opt in \ + wd1419 \ + wd1683 \ + wd1684 \ + wd193 \ + wd593 \ + wd279 \ + wd810 \ + wd869 \ + wd981 + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:17917: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17920: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:17922: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown" +then + { echo "$as_me:17930: checking for $CC warning options..." >&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + cf_warn_CONST="" + test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings" + cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs" + test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings= + for cf_opt in W Wall \ + Wbad-function-cast \ + Wcast-align \ + Wcast-qual \ + Wdeclaration-after-statement \ + Wextra \ + Winline \ + Wmissing-declarations \ + Wmissing-prototypes \ + Wnested-externs \ + Wpointer-arith \ + Wshadow \ + Wstrict-prototypes \ + Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas Wswitch-enum + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:17953: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17956: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:17958: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + case "$cf_opt" in + (Winline) + case "$GCC_VERSION" in + ([34].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:17966: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + (Wpointer-arith) + case "$GCC_VERSION" in + ([12].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:17976: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + esac + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +fi +rm -rf ./conftest* + +fi + +if test "$GCC" = yes || test "$GXX" = yes +then +cat > conftest.i <&5 +echo "$as_me: checking for $CC __attribute__ directives..." >&6;} +cat > "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + +cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&5 + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18065: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:18067: result: ... $cf_attribute" >&5 +echo "${ECHO_T}... $cf_attribute" >&6 + cat conftest.h >>confdefs.h + case "$cf_attribute" in + (noreturn) + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_PRINTF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_SCANF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf ./conftest* +fi + +fi + +if test "x$enable_warnings" = "xyes"; then + + ADAFLAGS="$ADAFLAGS -gnatwa -gnatyg" + + if test "x$cf_with_cxx" = xyes ; then + +INTEL_CPLUSPLUS=no + +if test "$GCC" = yes ; then + case "$host_os" in + (linux*|gnu*) + echo "$as_me:18139: checking if this is really Intel C++ compiler" >&5 +echo $ECHO_N "checking if this is really Intel C++ compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -no-gcc" + cat >"conftest.$ac_ext" <<_ACEOF +#line 18144 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:18161: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18164: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:18167: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18170: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + INTEL_CPLUSPLUS=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CXXFLAGS="$cf_save_CFLAGS" + echo "$as_me:18181: result: $INTEL_CPLUSPLUS" >&5 +echo "${ECHO_T}$INTEL_CPLUSPLUS" >&6 + ;; + esac +fi + +CLANG_CPLUSPLUS=no + +if test "$GCC" = yes ; then + echo "$as_me:18190: checking if this is really Clang C++ compiler" >&5 +echo $ECHO_N "checking if this is really Clang C++ compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CXXFLAGS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 18194 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:18211: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18214: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:18217: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18220: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + CLANG_CPLUSPLUS=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CXXFLAGS="$cf_save_CFLAGS" + echo "$as_me:18230: result: $CLANG_CPLUSPLUS" >&5 +echo "${ECHO_T}$CLANG_CPLUSPLUS" >&6 +fi + +CLANG_VERSION=none + +if test "x$CLANG_CPLUSPLUS" = "xyes" ; then + case "$CC" in + (c[1-9][0-9]|*/c[1-9][0-9]) + { echo "$as_me:18239: WARNING: replacing broken compiler alias $CC" >&5 +echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;} + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + echo "$as_me:18246: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + echo "$as_me:18250: result: $CLANG_VERSION" >&5 +echo "${ECHO_T}$CLANG_VERSION" >&6 + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + echo "$as_me:18257: checking if option $cf_clang_opt works" >&5 +echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + cat >"conftest.$ac_ext" <<_ACEOF +#line 18262 "configure" +#include "confdefs.h" + + #include +int +main (void) +{ + + printf("hello!\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18276: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18279: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18282: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18285: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_clang_optok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_clang_optok=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:18296: result: $cf_clang_optok" >&5 +echo "${ECHO_T}$cf_clang_optok" >&6 + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + test -n "$verbose" && echo " adding option $cf_clang_opt" 1>&6 + +echo "${as_me:-configure}:18302: testing adding option $cf_clang_opt ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_clang_opt" + + fi + done +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +cat > conftest.$ac_ext <&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CXXFLAGS="$CXXFLAGS" + EXTRA_CXXFLAGS="-Wall" + for cf_opt in \ + wd1419 \ + wd1682 \ + wd1683 \ + wd1684 \ + wd193 \ + wd279 \ + wd593 \ + wd810 \ + wd869 \ + wd981 + do + CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -$cf_opt" + if { (eval echo "$as_me:18354: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18357: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:18359: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt" + fi + done + CXXFLAGS="$cf_save_CXXFLAGS" + +elif test "$GXX" = yes +then + { echo "$as_me:18368: checking for $CXX warning options..." >&5 +echo "$as_me: checking for $CXX warning options..." >&6;} + cf_save_CXXFLAGS="$CXXFLAGS" + EXTRA_CXXFLAGS="-W -Wall" + cf_gxx_extra_warnings="" + test "$with_ext_const" = yes && cf_gxx_extra_warnings="Wwrite-strings" + case "$GXX_VERSION" in + ([1-2].*) + ;; + (*) + cf_gxx_extra_warnings="$cf_gxx_extra_warnings Weffc++" + ;; + esac + for cf_opt in \ + Wabi \ + fabi-version=0 \ + Wextra \ + Wignored-qualifiers \ + Wlogical-op \ + Woverloaded-virtual \ + Wsign-promo \ + Wsynth \ + Wold-style-cast \ + Wcast-align \ + Wcast-qual \ + Wpointer-arith \ + Wshadow \ + Wundef $cf_gxx_extra_warnings Wno-unused + do + CXXFLAGS="$cf_save_CXXFLAGS $EXTRA_CXXFLAGS -Werror -$cf_opt" + if { (eval echo "$as_me:18398: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18401: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:18403: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -$cf_opt" + else + test -n "$verbose" && echo "$as_me:18407: result: ... no -$cf_opt" >&5 +echo "${ECHO_T}... no -$cf_opt" >&6 + fi + done + CXXFLAGS="$cf_save_CXXFLAGS" +fi + +rm -rf ./conftest* +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + + fi +fi + +echo "$as_me:18425: checking if you want to work around bogus compiler/loader warnings" >&5 +echo $ECHO_N "checking if you want to work around bogus compiler/loader warnings... $ECHO_C" >&6 + +# Check whether --enable-string-hacks or --disable-string-hacks was given. +if test "${enable_string_hacks+set}" = set; then + enableval="$enable_string_hacks" + enable_string_hacks=$enableval +else + enable_string_hacks=no +fi; +echo "$as_me:18435: result: $enable_string_hacks" >&5 +echo "${ECHO_T}$enable_string_hacks" >&6 + +if test "x$enable_string_hacks" = "xyes"; then + +cat >>confdefs.h <<\EOF +#define USE_STRING_HACKS 1 +EOF + + { echo "$as_me:18444: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&5 +echo "$as_me: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&2;} + echo "$as_me:18446: checking for strlcat" >&5 +echo $ECHO_N "checking for strlcat... $ECHO_C" >&6 +if test "${ac_cv_func_strlcat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18452 "configure" +#include "confdefs.h" +#define strlcat autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef strlcat + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strlcat (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strlcat) || defined (__stub___strlcat) +#error found stub for strlcat +#endif + + return strlcat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18483: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18486: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18489: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18492: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_strlcat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_strlcat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:18502: result: $ac_cv_func_strlcat" >&5 +echo "${ECHO_T}$ac_cv_func_strlcat" >&6 +if test "$ac_cv_func_strlcat" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_STRLCAT 1 +EOF + +else + + echo "$as_me:18512: checking for strlcat in -lbsd" >&5 +echo $ECHO_N "checking for strlcat in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_strlcat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 18520 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strlcat (void); +int +main (void) +{ +strlcat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18539: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18542: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18545: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18548: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_strlcat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_strlcat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:18559: result: $ac_cv_lib_bsd_strlcat" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_strlcat" >&6 +if test "$ac_cv_lib_bsd_strlcat" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +for ac_header in bsd/string.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:18582: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18588 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:18592: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:18598: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:18617: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define HAVE_STRLCAT 1 +EOF + +fi + +fi + +for ac_func in strlcpy snprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:18638: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18644 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18675: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18678: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18681: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18684: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:18694: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to enable runtime assertions... $ECHO_C" >&6 + +# Check whether --enable-assertions or --disable-assertions was given. +if test "${enable_assertions+set}" = set; then + enableval="$enable_assertions" + with_assertions=$enableval +else + with_assertions=no +fi; +echo "$as_me:18717: result: $with_assertions" >&5 +echo "${ECHO_T}$with_assertions" >&6 +if test -n "$GCC" +then + if test "$with_assertions" = no + then + CPPFLAGS="$CPPFLAGS -DNDEBUG" + else + + ADAFLAGS="$ADAFLAGS -gnata" + + fi +fi + +### use option --disable-leaks to suppress "permanent" leaks, for testing + +echo "$as_me:18733: checking if you want to use dmalloc for testing" >&5 +echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dmalloc or --without-dmalloc was given. +if test "${with_dmalloc+set}" = set; then + withval="$with_dmalloc" + case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_dmalloc=yes + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_dmalloc:-no}" >&6 + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +if test "$with_dmalloc" = yes ; then + echo "$as_me:18869: checking for dmalloc.h" >&5 +echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18875 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:18879: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:18885: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_dmalloc_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:18904: result: $ac_cv_header_dmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6 +if test "$ac_cv_header_dmalloc_h" = yes; then + +echo "$as_me:18908: checking for dmalloc_debug in -ldmalloc" >&5 +echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldmalloc $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 18916 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dmalloc_debug (void); +int +main (void) +{ +dmalloc_debug (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18935: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18938: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18941: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18944: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dmalloc_dmalloc_debug=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dmalloc_dmalloc_debug=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:18955: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5 +echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6 +if test "$ac_cv_lib_dmalloc_dmalloc_debug" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dbmalloc or --without-dbmalloc was given. +if test "${with_dbmalloc+set}" = set; then + withval="$with_dbmalloc" + case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_dbmalloc=yes + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_dbmalloc:-no}" >&6 + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +if test "$with_dbmalloc" = yes ; then + echo "$as_me:19106: checking for dbmalloc.h" >&5 +echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dbmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 19112 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:19116: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:19122: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dbmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_dbmalloc_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:19141: result: $ac_cv_header_dbmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6 +if test "$ac_cv_header_dbmalloc_h" = yes; then + +echo "$as_me:19145: checking for debug_malloc in -ldbmalloc" >&5 +echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldbmalloc $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 19153 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char debug_malloc (void); +int +main (void) +{ +debug_malloc (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19172: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19175: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19178: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19181: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dbmalloc_debug_malloc=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dbmalloc_debug_malloc=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:19192: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5 +echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6 +if test "$ac_cv_lib_dbmalloc_debug_malloc" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6 + +# Check whether --with-valgrind or --without-valgrind was given. +if test "${with_valgrind+set}" = set; then + withval="$with_valgrind" + case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_valgrind=yes + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_valgrind:-no}" >&6 + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +echo "$as_me:19342: checking if you want to perform memory-leak testing" >&5 +echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6 + +# Check whether --enable-leaks or --disable-leaks was given. +if test "${enable_leaks+set}" = set; then + enableval="$enable_leaks" + enable_leaks=$enableval +else + enable_leaks=yes +fi; +if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi +echo "$as_me:19353: result: $with_no_leaks" >&5 +echo "${ECHO_T}$with_no_leaks" >&6 + +if test "$enable_leaks" = no ; then + +cat >>confdefs.h <<\EOF +#define NO_LEAKS 1 +EOF + +cat >>confdefs.h <<\EOF +#define YY_NO_LEAKS 1 +EOF + +fi + +cat >>confdefs.h <<\EOF +#define HAVE_NC_ALLOC_H 1 +EOF + +### use option --enable-expanded to generate certain macros as functions + +# Check whether --enable-expanded or --disable-expanded was given. +if test "${enable_expanded+set}" = set; then + enableval="$enable_expanded" + test "x$enableval" = xyes && +cat >>confdefs.h <<\EOF +#define NCURSES_EXPANDED 1 +EOF + +fi; + +### use option --disable-macros to suppress macros in favor of functions + +# Check whether --enable-macros or --disable-macros was given. +if test "${enable_macros+set}" = set; then + enableval="$enable_macros" + test "$enableval" = no && +cat >>confdefs.h <<\EOF +#define NCURSES_NOMACROS 1 +EOF + +fi; + +# Normally we only add trace() to the debug-library. Allow this to be +# extended to all models of the ncurses library: +cf_all_traces=no +case "$CFLAGS $CPPFLAGS" in +(*-DTRACE*) + cf_all_traces=yes + ;; +esac + +echo "$as_me:19405: checking whether to add trace feature to all models" >&5 +echo $ECHO_N "checking whether to add trace feature to all models... $ECHO_C" >&6 + +# Check whether --with-trace or --without-trace was given. +if test "${with_trace+set}" = set; then + withval="$with_trace" + cf_with_trace=$withval +else + cf_with_trace=$cf_all_traces +fi; +echo "$as_me:19415: result: $cf_with_trace" >&5 +echo "${ECHO_T}$cf_with_trace" >&6 + +if test "x$cf_with_trace" = xyes ; then + LIB_TRACING=all + ADA_TRACE=TRUE + +cat >>confdefs.h <<\EOF +#define TRACE 1 +EOF + +cat >>confdefs.h <<\EOF +#define HAVE__TRACEF 1 +EOF + +else + LIB_TRACING=DEBUG + ADA_TRACE=FALSE +fi + +echo "$as_me:19435: checking if we want to use GNAT projects" >&5 +echo $ECHO_N "checking if we want to use GNAT projects... $ECHO_C" >&6 + +# Check whether --enable-gnat-projects or --disable-gnat-projects was given. +if test "${enable_gnat_projects+set}" = set; then + enableval="$enable_gnat_projects" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_gnat_projects=no + else + enable_gnat_projects=yes + fi +else + enableval=yes + enable_gnat_projects=yes + +fi; +echo "$as_me:19452: result: $enable_gnat_projects" >&5 +echo "${ECHO_T}$enable_gnat_projects" >&6 + +### Checks for libraries. +case "$cf_cv_system_name" in +(*mingw32*|*mingw64*) + # Note: WINVER may be a problem with Windows 10 + if test "x$with_exp_win32" = xyes ; then + CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -DWIN32_LEAN_AND_MEAN" + else + CPPFLAGS="$CPPFLAGS -DWINVER=0x0501 -DWIN32_LEAN_AND_MEAN" + fi + +echo "$as_me:19465: checking if ssp library is needed" >&5 +echo $ECHO_N "checking if ssp library is needed... $ECHO_C" >&6 +if test "${cf_cv_need_libssp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 19472 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + + DIR *dp = opendir("."); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19489: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19492: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19495: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19498: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_libssp=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lssp" + cat >"conftest.$ac_ext" <<_ACEOF +#line 19508 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + + DIR *dp = opendir("."); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19525: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19528: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19531: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19534: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_libssp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_need_libssp=maybe +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:19548: result: $cf_cv_need_libssp" >&5 +echo "${ECHO_T}$cf_cv_need_libssp" >&6 + +if test "x$cf_cv_need_libssp" = xyes +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lssp; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + ;; +(*) + ;; +esac + +echo "$as_me:19577: checking if -lm needed for math functions" >&5 +echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6 +if test "${cf_cv_need_libm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 19584 "configure" +#include "confdefs.h" + + #include + #include + #include + +int +main (void) +{ +double x = rand(); printf("result = %g\\n", pow(sin(x),x)) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19600: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19603: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19606: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19609: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_libm=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_need_libm=yes +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:19619: result: $cf_cv_need_libm" >&5 +echo "${ECHO_T}$cf_cv_need_libm" >&6 + +if test "$cf_cv_need_libm" = yes +then + + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lm" + echo "$as_me:19627: checking if -lm is available for math functions" >&5 +echo $ECHO_N "checking if -lm is available for math functions... $ECHO_C" >&6 +if test "${cf_cv_have_libm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 19634 "configure" +#include "confdefs.h" + + #include + #include + #include + +int +main (void) +{ +double x = rand(); printf("result = %g\\n", pow(sin(x),x)) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19650: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19653: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19656: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19659: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_libm=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_libm=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:19669: result: $cf_cv_have_libm" >&5 +echo "${ECHO_T}$cf_cv_have_libm" >&6 + LIBS="$cf_save_LIBS" + + if test "$cf_cv_have_libm" = yes + then + MATH_LIB=-lm + fi +else + cf_cv_have_libm=yes +fi + +if test "$cf_cv_have_libm" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_MATH_FUNCS 1 +EOF + +fi + +### Checks for header files. +echo "$as_me:19691: checking whether time.h and sys/time.h may both be included" >&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 19697 "configure" +#include "confdefs.h" +#include +#include +#include + +int +main (void) +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19713: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19716: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19719: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19722: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_header_time=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:19732: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +cf_regex_func=no +cf_regex_libs= +case "$host_os" in +(mingw*) + # -lsystre -ltre -lintl -liconv + echo "$as_me:19747: checking for regcomp in -lsystre" >&5 +echo $ECHO_N "checking for regcomp in -lsystre... $ECHO_C" >&6 +if test "${ac_cv_lib_systre_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsystre $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 19755 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19774: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19777: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19780: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19783: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_systre_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_systre_regcomp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:19794: result: $ac_cv_lib_systre_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_systre_regcomp" >&6 +if test "$ac_cv_lib_systre_regcomp" = yes; then + + echo "$as_me:19798: checking for libiconv_open in -liconv" >&5 +echo $ECHO_N "checking for libiconv_open in -liconv... $ECHO_C" >&6 +if test "${ac_cv_lib_iconv_libiconv_open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-liconv $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 19806 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv_open (void); +int +main (void) +{ +libiconv_open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19825: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19828: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19831: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19834: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_iconv_libiconv_open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_iconv_libiconv_open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:19845: result: $ac_cv_lib_iconv_libiconv_open" >&5 +echo "${ECHO_T}$ac_cv_lib_iconv_libiconv_open" >&6 +if test "$ac_cv_lib_iconv_libiconv_open" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -liconv; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + echo "$as_me:19867: checking for libintl_gettext in -lintl" >&5 +echo $ECHO_N "checking for libintl_gettext in -lintl... $ECHO_C" >&6 +if test "${ac_cv_lib_intl_libintl_gettext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lintl $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 19875 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libintl_gettext (void); +int +main (void) +{ +libintl_gettext (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19894: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19897: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19900: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19903: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_intl_libintl_gettext=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_intl_libintl_gettext=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:19914: result: $ac_cv_lib_intl_libintl_gettext" >&5 +echo "${ECHO_T}$ac_cv_lib_intl_libintl_gettext" >&6 +if test "$ac_cv_lib_intl_libintl_gettext" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lintl; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + echo "$as_me:19936: checking for tre_regcomp in -ltre" >&5 +echo $ECHO_N "checking for tre_regcomp in -ltre... $ECHO_C" >&6 +if test "${ac_cv_lib_tre_tre_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltre $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 19944 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tre_regcomp (void); +int +main (void) +{ +tre_regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19963: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19966: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19969: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19972: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_tre_tre_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_tre_tre_regcomp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:19983: result: $ac_cv_lib_tre_tre_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_tre_tre_regcomp" >&6 +if test "$ac_cv_lib_tre_tre_regcomp" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -ltre; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lsystre; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_regex_func=regcomp + +else + + echo "$as_me:20025: checking for regcomp in -lgnurx" >&5 +echo $ECHO_N "checking for regcomp in -lgnurx... $ECHO_C" >&6 +if test "${ac_cv_lib_gnurx_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgnurx $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 20033 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20052: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20055: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20058: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20061: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gnurx_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gnurx_regcomp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20072: result: $ac_cv_lib_gnurx_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_gnurx_regcomp" >&6 +if test "$ac_cv_lib_gnurx_regcomp" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lgnurx; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_regex_func=regcomp +fi + +fi + + ;; +(*) + cf_regex_libs="regex re" + echo "$as_me:20100: checking for regcomp" >&5 +echo $ECHO_N "checking for regcomp... $ECHO_C" >&6 +if test "${ac_cv_func_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20106 "configure" +#include "confdefs.h" +#define regcomp autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef regcomp + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_regcomp) || defined (__stub___regcomp) +#error found stub for regcomp +#endif + + return regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20137: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20140: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20143: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20146: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_regcomp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:20156: result: $ac_cv_func_regcomp" >&5 +echo "${ECHO_T}$ac_cv_func_regcomp" >&6 +if test "$ac_cv_func_regcomp" = yes; then + cf_regex_func=regcomp +else + + for cf_regex_lib in $cf_regex_libs + do + as_ac_Lib=`echo "ac_cv_lib_$cf_regex_lib''_regcomp" | $as_tr_sh` +echo "$as_me:20165: checking for regcomp in -l$cf_regex_lib" >&5 +echo $ECHO_N "checking for regcomp in -l$cf_regex_lib... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$cf_regex_lib $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 20173 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20192: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20195: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20198: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20201: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Lib=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20212: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_regex_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_regex_func=regcomp + break +fi + + done + +fi + + ;; +esac + +if test "$cf_regex_func" = no ; then + echo "$as_me:20244: checking for compile" >&5 +echo $ECHO_N "checking for compile... $ECHO_C" >&6 +if test "${ac_cv_func_compile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20250 "configure" +#include "confdefs.h" +#define compile autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef compile + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char compile (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_compile) || defined (__stub___compile) +#error found stub for compile +#endif + + return compile (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20281: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20284: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20287: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20290: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_compile=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_compile=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:20300: result: $ac_cv_func_compile" >&5 +echo "${ECHO_T}$ac_cv_func_compile" >&6 +if test "$ac_cv_func_compile" = yes; then + cf_regex_func=compile +else + + echo "$as_me:20306: checking for compile in -lgen" >&5 +echo $ECHO_N "checking for compile in -lgen... $ECHO_C" >&6 +if test "${ac_cv_lib_gen_compile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgen $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 20314 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char compile (void); +int +main (void) +{ +compile (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20333: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20336: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20339: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20342: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gen_compile=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gen_compile=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20353: result: $ac_cv_lib_gen_compile" >&5 +echo "${ECHO_T}$ac_cv_lib_gen_compile" >&6 +if test "$ac_cv_lib_gen_compile" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lgen; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_regex_func=compile +fi + +fi + +fi + +if test "$cf_regex_func" = no ; then + { echo "$as_me:20381: WARNING: cannot find regular expression library" >&5 +echo "$as_me: WARNING: cannot find regular expression library" >&2;} +fi + +echo "$as_me:20385: checking for regular-expression headers" >&5 +echo $ECHO_N "checking for regular-expression headers... $ECHO_C" >&6 +if test "${cf_cv_regex_hdrs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_regex_hdrs=no +case "$cf_regex_func" in +(compile) + for cf_regex_hdr in regexp.h regexpr.h + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 20397 "configure" +#include "confdefs.h" +#include <$cf_regex_hdr> +int +main (void) +{ + + char *p = compile("", "", "", 0); + int x = step("", ""); + (void)p; + (void)x; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20414: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20417: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20420: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20423: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_regex_hdrs=$cf_regex_hdr + break + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + ;; +(*) + for cf_regex_hdr in regex.h + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 20440 "configure" +#include "confdefs.h" +#include +#include <$cf_regex_hdr> +int +main (void) +{ + + regex_t *p = 0; + int x = regcomp(p, "", 0); + int y = regexec(p, "", 0, 0, 0); + (void)x; + (void)y; + regfree(p); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20460: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20463: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20466: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20469: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_regex_hdrs=$cf_regex_hdr + break + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + ;; +esac + +fi +echo "$as_me:20485: result: $cf_cv_regex_hdrs" >&5 +echo "${ECHO_T}$cf_cv_regex_hdrs" >&6 + +case "$cf_cv_regex_hdrs" in + (no) { echo "$as_me:20489: WARNING: no regular expression header found" >&5 +echo "$as_me: WARNING: no regular expression header found" >&2;} ;; + (regex.h) +cat >>confdefs.h <<\EOF +#define HAVE_REGEX_H_FUNCS 1 +EOF + ;; + (regexp.h) +cat >>confdefs.h <<\EOF +#define HAVE_REGEXP_H_FUNCS 1 +EOF + ;; + (regexpr.h) +cat >>confdefs.h <<\EOF +#define HAVE_REGEXPR_H_FUNCS 1 +EOF + ;; +esac + +for ac_header in \ +fcntl.h \ +getopt.h \ +limits.h \ +locale.h \ +math.h \ +poll.h \ +sys/auxv.h \ +sys/ioctl.h \ +sys/param.h \ +sys/poll.h \ +sys/select.h \ +sys/time.h \ +sys/times.h \ +unistd.h \ +wctype.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:20527: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20533 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:20537: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:20543: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:20562: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20581 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:20585: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:20591: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:20610: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for header declaring getopt variables... $ECHO_C" >&6 +if test "${cf_cv_getopt_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_getopt_header=none +for cf_header in stdio.h stdlib.h unistd.h getopt.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 20630 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ +int x = optind; char *y = optarg; (void)x; (void)y + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20643: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20646: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20649: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20652: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_getopt_header=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:20664: result: $cf_cv_getopt_header" >&5 +echo "${ECHO_T}$cf_cv_getopt_header" >&6 +if test "$cf_cv_getopt_header" != none ; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETOPT_HEADER 1 +EOF + +fi +if test "$cf_cv_getopt_header" = getopt.h ; then + +cat >>confdefs.h <<\EOF +#define NEED_GETOPT_H 1 +EOF + +fi + +echo "$as_me:20681: checking if external environ is declared" >&5 +echo $ECHO_N "checking if external environ is declared... $ECHO_C" >&6 +if test "${cf_cv_dcl_environ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 20688 "configure" +#include "confdefs.h" + +$ac_includes_default +int +main (void) +{ +void* x = (void*) environ; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20701: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20704: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20707: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20710: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_dcl_environ=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_dcl_environ=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:20721: result: $cf_cv_dcl_environ" >&5 +echo "${ECHO_T}$cf_cv_dcl_environ" >&6 + +if test "$cf_cv_dcl_environ" = no ; then + +cf_result=`echo "decl_environ" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if external environ exists... $ECHO_C" >&6 +if test "${cf_cv_have_environ+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 20743 "configure" +#include "confdefs.h" + +#undef environ +extern int environ; + +int +main (void) +{ +environ = 2 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20758: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20761: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20764: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20767: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_environ=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_environ=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:20778: result: $cf_cv_have_environ" >&5 +echo "${ECHO_T}$cf_cv_have_environ" >&6 + +if test "$cf_cv_have_environ" = yes ; then + +cf_result=`echo "have_environ" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for getenv... $ECHO_C" >&6 +if test "${ac_cv_func_getenv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20797 "configure" +#include "confdefs.h" +#define getenv autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef getenv + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char getenv (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_getenv) || defined (__stub___getenv) +#error found stub for getenv +#endif + + return getenv (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20828: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20831: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20834: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20837: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_getenv=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_getenv=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:20847: result: $ac_cv_func_getenv" >&5 +echo "${ECHO_T}$ac_cv_func_getenv" >&6 + +for ac_func in putenv setenv strdup +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:20853: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20859 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20890: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20893: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20896: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20899: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:20909: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if getenv returns consistent values... $ECHO_C" >&6 +if test "${cf_cv_consistent_getenv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes; then + cf_cv_consistent_getenv=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20929 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(HAVE_ENVIRON) && defined(DECL_ENVIRON) && !defined(environ) +extern char **environ; /* POSIX, but some systems are not... */ +#endif + +#if defined(HAVE_STRDUP) +#define str_alloc(s) strdup(s) +#else +#define str_alloc(s) strcpy(malloc(strlen(s) + 1, s)) +#endif + +static void set_value(const char *name, const char *value) +{ +#if defined(HAVE_SETENV) + setenv(name, value, 1); +#elif defined(HAVE_PUTENV) + char buffer[1024]; + sprintf(buffer, "%s=%s", name, value); + putenv(str_alloc(buffer)); +#else +#error neither putenv/setenv found +#endif +} +int main(void) +{ + int pass; + size_t numenv, limit, j; + char **mynames; + char **myvalues; + char **mypointer; + char *equals; + for (numenv = 0; environ[numenv]; ++numenv) ; + limit = numenv + 10; + mynames = (char **) calloc(limit + 1, sizeof(char *)); + myvalues = (char **) calloc(limit + 1, sizeof(char *)); + mypointer = (char **) calloc(limit + 1, sizeof(char *)); +#if defined(HAVE_ENVIRON) + for (j = 0; environ[j]; ++j) { + mynames[j] = str_alloc(environ[j]); + equals = strchr(mynames[j], '='); + if (equals != 0) { + *equals++ = '\\0'; + myvalues[j] = str_alloc(equals); + } else { + myvalues[j] = str_alloc(""); + } + } +#endif + for (j = numenv; j < limit; ++j) { + char name[80]; + char value[80]; + size_t found; + size_t k = 0; + do { + size_t jk; + found = 0; + sprintf(name, "TERM%lu", (unsigned long) k); + for (jk = 0; jk < j; ++jk) { + if (!strcmp(name, mynames[jk])) { + found = 1; + ++k; + break; + } + } + } while (found); + sprintf(value, "%lu:%p", (unsigned long) k, (void*)&mynames[j]); + set_value(name, value); + mynames[j] = str_alloc(name); + myvalues[j] = str_alloc(value); + } + for (pass = 0; pass < 3; ++pass) { + for (j = 0; j < limit; ++j) { + char *value = getenv(mynames[j]); + if (pass) { + if (value == 0) { + fprintf(stderr, "getenv returned null for %s\\n", mynames[j]); + ${cf_cv_main_return:-return}(1); + } else if (value != mypointer[j]) { + fprintf(stderr, "getenv returned different pointer for %s\\n", mynames[j]); + ${cf_cv_main_return:-return}(1); + } else if (strcmp(value, myvalues[j])) { + fprintf(stderr, "getenv returned different value for %s\\n", mynames[j]); + ${cf_cv_main_return:-return}(1); + } + } else { + size_t k; + mypointer[j] = value; + for (k = 0; k < j; ++k) { + if (mypointer[j] == mypointer[k]) { + fprintf(stderr, "getenv returned same pointer for %s and %s\\n", mynames[j], mynames[k]); + ${cf_cv_main_return:-return}(1); + } + } + } + } + } + ${cf_cv_main_return:-return}(0); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:21034: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21037: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:21039: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21042: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_consistent_getenv=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_consistent_getenv=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:21055: result: $cf_cv_consistent_getenv" >&5 +echo "${ECHO_T}$cf_cv_consistent_getenv" >&6 + +if test "x$cf_cv_consistent_getenv" = xno +then + +cat >>confdefs.h <<\EOF +#define HAVE_CONSISTENT_GETENV 1 +EOF + +fi + +if test "x$cf_cv_consistent_getenv" = xno && \ + test "x$cf_with_trace" = xyes +then + { echo "$as_me:21070: WARNING: The NCURSES_TRACE environment variable is not supported with this configuration" >&5 +echo "$as_me: WARNING: The NCURSES_TRACE environment variable is not supported with this configuration" >&2;} +fi + +echo "$as_me:21074: checking if sys/time.h works with sys/select.h" >&5 +echo $ECHO_N "checking if sys/time.h works with sys/select.h... $ECHO_C" >&6 +if test "${cf_cv_sys_time_select+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 21081 "configure" +#include "confdefs.h" + +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21101: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21104: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21107: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21110: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_sys_time_select=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_sys_time_select=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi + +echo "$as_me:21122: result: $cf_cv_sys_time_select" >&5 +echo "${ECHO_T}$cf_cv_sys_time_select" >&6 +test "$cf_cv_sys_time_select" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_SYS_TIME_SELECT 1 +EOF + +### checks for compiler characteristics +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +echo "$as_me:21137: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 21143 "configure" +#include "confdefs.h" + +int +main (void) +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset x; (void)x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; (void)zero; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + (void)s; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + (void)foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + (void)p; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + (void)foo; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21205: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21208: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21211: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21214: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_c_const=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:21224: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\EOF +#define const +EOF + +fi + +echo "$as_me:21234: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6 +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 21242 "configure" +#include "confdefs.h" +#ifndef __cplusplus +static $ac_kw int static_foo (void) {return 0; } +$ac_kw int foo (void) {return 0; } +#endif + +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21251: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21254: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21257: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21260: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_c_inline=$ac_kw; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:21271: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6 +case $ac_cv_c_inline in + inline | yes) ;; + no) +cat >>confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >>confdefs.h <&5 +echo $ECHO_N "checking if $CC supports options to tune inlining... $ECHO_C" >&6 +if test "${cf_cv_gcc_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS --param max-inline-insns-single=1200" + cat >"conftest.$ac_ext" <<_ACEOF +#line 21306 "configure" +#include "confdefs.h" +inline int foo(void) { return 1; } +int +main (void) +{ +${cf_cv_main_return:-return} foo() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21318: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21321: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21324: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21327: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gcc_inline=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gcc_inline=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS=$cf_save_CFLAGS + +fi +echo "$as_me:21339: result: $cf_cv_gcc_inline" >&5 +echo "${ECHO_T}$cf_cv_gcc_inline" >&6 + if test "$cf_cv_gcc_inline" = yes ; then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in --param max-inline-insns-single=1200 +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + fi + fi +fi + +echo "$as_me:21445: checking for signal global datatype" >&5 +echo $ECHO_N "checking for signal global datatype... $ECHO_C" >&6 +if test "${cf_cv_sig_atomic_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + for cf_type in \ + "volatile sig_atomic_t" \ + "sig_atomic_t" \ + "int" + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 21457 "configure" +#include "confdefs.h" + +#include +#include +#include + +extern $cf_type x; +$cf_type x; +static void handler(int sig) +{ + (void)sig; + x = 5; +} +int +main (void) +{ +signal(SIGINT, handler); + x = 1 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21481: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21484: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21487: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21490: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_sig_atomic_t=$cf_type +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_sig_atomic_t=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_sig_atomic_t" != no && break + done + +fi + +echo "$as_me:21504: result: $cf_cv_sig_atomic_t" >&5 +echo "${ECHO_T}$cf_cv_sig_atomic_t" >&6 +test "$cf_cv_sig_atomic_t" != no && +cat >>confdefs.h <&5 +echo $ECHO_N "checking for type of chtype... $ECHO_C" >&6 +if test "${cf_cv_typeof_chtype+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "$cross_compiling" = yes; then + cf_cv_typeof_chtype=long +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 21523 "configure" +#include "confdefs.h" + +$ac_includes_default +#define WANT_BITS 31 +int main(void) +{ + FILE *fp = fopen("cf_test.out", "w"); + if (fp != 0) { + char *result = "long"; + if (sizeof(unsigned long) > sizeof(unsigned int)) { + int n; + unsigned int x, y; + for (n = 0; n < WANT_BITS; n++) { + x = (1 << n); + y = (x >> n); + if (y != 1 || x == 0) { + x = 0; + break; + } + } + /* + * If x is nonzero, an int is big enough for the bits + * that we want. + */ + result = (x != 0) ? "int" : "long"; + } + fputs(result, fp); + fclose(fp); + } + ${cf_cv_main_return:-return}(0); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:21558: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21561: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:21563: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21566: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_typeof_chtype=`cat cf_test.out` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_typeof_chtype=long +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f cf_test.out + +fi + +echo "$as_me:21581: result: $cf_cv_typeof_chtype" >&5 +echo "${ECHO_T}$cf_cv_typeof_chtype" >&6 + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if unsigned literals are legal... $ECHO_C" >&6 +if test "${cf_cv_unsigned_literals+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 21600 "configure" +#include "confdefs.h" + +int +main (void) +{ +long x = 1L + 1UL + 1U + 1; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21612: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21615: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21618: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21621: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_unsigned_literals=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_unsigned_literals=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi + +echo "$as_me:21633: result: $cf_cv_unsigned_literals" >&5 +echo "${ECHO_T}$cf_cv_unsigned_literals" >&6 + +cf_cv_1UL="1" +test ".$cf_cv_unsigned_literals" = .yes && cf_cv_1UL="${cf_cv_1UL}U" +test ".$cf_cv_typeof_chtype" = .long && cf_cv_1UL="${cf_cv_1UL}L" + +if test "$NCURSES_MMASK_T" = auto ; then + cf_cv_typeof_mmask_t=long +else + cf_cv_typeof_mmask_t=$NCURSES_MMASK_T +fi +test "$cf_cv_typeof_mmask_t" = unsigned && cf_cv_typeof_mmask_t="" + +### Checks for external-data + +echo "$as_me:21649: checking if external errno is declared" >&5 +echo $ECHO_N "checking if external errno is declared... $ECHO_C" >&6 +if test "${cf_cv_dcl_errno+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 21656 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +int +main (void) +{ +int x = (int) errno; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21670: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21673: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21676: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21679: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_dcl_errno=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_dcl_errno=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:21690: result: $cf_cv_dcl_errno" >&5 +echo "${ECHO_T}$cf_cv_dcl_errno" >&6 + +if test "$cf_cv_dcl_errno" = no ; then + +cf_result=`echo "decl_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if external errno exists... $ECHO_C" >&6 +if test "${cf_cv_have_errno+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 21712 "configure" +#include "confdefs.h" + +#undef errno +extern int errno; + +int +main (void) +{ +errno = 2 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21727: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21730: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21733: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21736: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_errno=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_errno=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:21747: result: $cf_cv_have_errno" >&5 +echo "${ECHO_T}$cf_cv_have_errno" >&6 + +if test "$cf_cv_have_errno" = yes ; then + +cf_result=`echo "have_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if data-only library module links... $ECHO_C" >&6 +if test "${cf_cv_link_dataonly+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -f conftest.a + cat >conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21774: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + mv conftest.o data.o && \ + ( $AR $ARFLAGS conftest.a data.o ) 2>&5 1>/dev/null + fi + rm -f conftest.$ac_ext data.o + cat >conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21801: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + mv conftest.o func.o && \ + ( $AR $ARFLAGS conftest.a func.o ) 2>&5 1>/dev/null + fi + rm -f conftest.$ac_ext func.o + ( eval $RANLIB conftest.a ) 2>&5 >/dev/null + cf_saveLIBS="$LIBS" + LIBS="conftest.a $LIBS" + if test "$cross_compiling" = yes; then + cf_cv_link_dataonly=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 21814 "configure" +#include "confdefs.h" + + extern int testfunc(void); + int main(void) + { + ${cf_cv_main_return:-return} (!testfunc()); + } + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:21825: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21828: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:21830: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21833: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_link_dataonly=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_link_dataonly=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + LIBS="$cf_saveLIBS" + +fi + +echo "$as_me:21848: result: $cf_cv_link_dataonly" >&5 +echo "${ECHO_T}$cf_cv_link_dataonly" >&6 + +if test "$cf_cv_link_dataonly" = no ; then + +cat >>confdefs.h <<\EOF +#define BROKEN_LINKER 1 +EOF + + BROKEN_LINKER=1 +fi + +### Checks for library functions. + +cf_save_libs="$LIBS" +echo "$as_me:21863: checking for clock_gettime" >&5 +echo $ECHO_N "checking for clock_gettime... $ECHO_C" >&6 +if test "${ac_cv_func_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 21869 "configure" +#include "confdefs.h" +#define clock_gettime autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef clock_gettime + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char clock_gettime (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_clock_gettime) || defined (__stub___clock_gettime) +#error found stub for clock_gettime +#endif + + return clock_gettime (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21900: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21903: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21906: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21909: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:21919: result: $ac_cv_func_clock_gettime" >&5 +echo "${ECHO_T}$ac_cv_func_clock_gettime" >&6 +if test "$ac_cv_func_clock_gettime" = yes; then + cf_cv_test_clock_gettime=yes +else + echo "$as_me:21924: checking for clock_gettime in -lrt" >&5 +echo $ECHO_N "checking for clock_gettime in -lrt... $ECHO_C" >&6 +if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 21932 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char clock_gettime (void); +int +main (void) +{ +clock_gettime (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21951: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21954: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21957: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21960: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_rt_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_rt_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:21971: result: $ac_cv_lib_rt_clock_gettime" >&5 +echo "${ECHO_T}$ac_cv_lib_rt_clock_gettime" >&6 +if test "$ac_cv_lib_rt_clock_gettime" = yes; then + LIBS="-lrt $LIBS" + cf_cv_test_clock_gettime=yes +else + cf_cv_test_clock_gettime=no +fi + +fi + +if test "$cf_cv_test_clock_gettime" = yes ; then +echo "$as_me:21983: checking if clock_gettime links" >&5 +echo $ECHO_N "checking if clock_gettime links... $ECHO_C" >&6 +if test "${cf_cv_func_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 21990 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ +struct timespec ts; + int rc = clock_gettime(CLOCK_REALTIME, &ts) + + clock_gettime(CLOCK_MONOTONIC, &ts); + (void) rc; (void)ts + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22008: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22011: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22014: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22017: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:22028: result: $cf_cv_func_clock_gettime" >&5 +echo "${ECHO_T}$cf_cv_func_clock_gettime" >&6 +else + cf_cv_func_clock_gettime=no +fi + +if test "$cf_cv_func_clock_gettime" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_CLOCK_GETTIME 1 +EOF + +else +echo "$as_me:22042: checking for gettimeofday" >&5 +echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6 +if test "${ac_cv_func_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22048 "configure" +#include "confdefs.h" +#define gettimeofday autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef gettimeofday + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday) +#error found stub for gettimeofday +#endif + + return gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22079: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22082: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22085: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22088: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_gettimeofday=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22098: result: $ac_cv_func_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6 +if test "$ac_cv_func_gettimeofday" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + +else + +echo "$as_me:22108: checking for gettimeofday in -lbsd" >&5 +echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22116 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (void); +int +main (void) +{ +gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22135: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22138: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22141: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22144: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_gettimeofday=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22155: result: $ac_cv_lib_bsd_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6 +if test "$ac_cv_lib_bsd_gettimeofday" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi +fi + +for ac_func in \ +fpathconf \ +getcwd \ +getauxval \ +getegid \ +geteuid \ +getopt \ +getuid \ +issetugid \ +localeconv \ +poll \ +remove \ +select \ +setbuf \ +setbuffer \ +setfsuid \ +setvbuf \ +sigaction \ +sigvec \ +snprintf \ +strdup \ +strstr \ +sysconf \ +tcgetpgrp \ +times \ +tsearch \ +vsnprintf \ + +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:22214: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22220 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22251: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22254: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22257: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22260: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22270: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if _PATH_TTYS is defined in ttyent.h... $ECHO_C" >&6 +if test "${cf_cv_PATH_TTYS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22287 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ + +FILE *fp = fopen(_PATH_TTYS, "r"); (void)fp + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22302: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22305: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22308: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22311: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_PATH_TTYS=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_PATH_TTYS=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:22321: result: $cf_cv_PATH_TTYS" >&5 +echo "${ECHO_T}$cf_cv_PATH_TTYS" >&6 + +if test $cf_cv_PATH_TTYS = no +then + for cf_ttys in /etc/ttytype /etc/ttys + do + if test -f $cf_ttys + then + cf_cv_PATH_TTYS=maybe + +cat >>confdefs.h <<\EOF +#define _PATH_TTYS $cf_ttys +EOF + + break + fi + done +fi + +if test $cf_cv_PATH_TTYS != no +then + echo "$as_me:22343: checking if _PATH_TTYS file exists" >&5 +echo $ECHO_N "checking if _PATH_TTYS file exists... $ECHO_C" >&6 +if test "${cf_cv_have_PATH_TTYS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "$cross_compiling" = yes; then + cf_cv_have_PATH_TTYS=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22353 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include + +int main(void) { + FILE *fp = fopen(_PATH_TTYS, "r"); + ${cf_cv_main_return:-return} (fp == 0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:22366: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22369: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:22371: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22374: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_PATH_TTYS=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_PATH_TTYS=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +echo "$as_me:22386: result: $cf_cv_have_PATH_TTYS" >&5 +echo "${ECHO_T}$cf_cv_have_PATH_TTYS" >&6 + test "$cf_cv_have_PATH_TTYS" = no && cf_cv_PATH_TTYS=no +fi + +if test $cf_cv_PATH_TTYS != no +then + +cat >>confdefs.h <<\EOF +#define HAVE_PATH_TTYS 1 +EOF + + echo "$as_me:22398: checking for getttynam" >&5 +echo $ECHO_N "checking for getttynam... $ECHO_C" >&6 +if test "${cf_cv_func_getttynam+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 22405 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +struct ttyent *fp = getttynam("/dev/tty"); (void)fp + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22417: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22420: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22423: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22426: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_getttynam=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_getttynam=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22436: result: $cf_cv_func_getttynam" >&5 +echo "${ECHO_T}$cf_cv_func_getttynam" >&6 + test "$cf_cv_func_getttynam" = yes && cat >>confdefs.h <<\EOF +#define HAVE_GETTTYNAM 1 +EOF + +fi + +if test "x$ac_cv_func_getopt" = xno && \ + test "x$cf_with_progs$cf_with_tests" != xnono; then + { { echo "$as_me:22446: error: getopt is required for building programs" >&5 +echo "$as_me: error: getopt is required for building programs" >&2;} + { (exit 1); exit 1; }; } +fi + +if test "x$with_safe_sprintf" = xyes +then + if test "x$ac_cv_func_vsnprintf" = xyes + then + { echo "$as_me:22455: WARNING: will use vsnprintf instead of safe-sprintf option" >&5 +echo "$as_me: WARNING: will use vsnprintf instead of safe-sprintf option" >&2;} + else + +cat >>confdefs.h <<\EOF +#define USE_SAFE_SPRINTF 1 +EOF + + fi +fi + +if test "x$with_getcap" = "xyes" ; then + +echo "$as_me:22468: checking for terminal-capability database functions" >&5 +echo $ECHO_N "checking for terminal-capability database functions... $ECHO_C" >&6 +if test "${cf_cv_cgetent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22475 "configure" +#include "confdefs.h" + +$ac_includes_default +int +main (void) +{ + + char temp[128]; + char *buf = temp; + char *db_array = temp; + cgetent(&buf, &db_array, "vt100"); + cgetcap(buf, "tc", '='); + cgetmatch(buf, "tc"); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22495: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22498: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22501: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22504: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_cgetent=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_cgetent=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:22515: result: $cf_cv_cgetent" >&5 +echo "${ECHO_T}$cf_cv_cgetent" >&6 + +if test "$cf_cv_cgetent" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_BSD_CGETENT 1 +EOF + +echo "$as_me:22525: checking if cgetent uses const parameter" >&5 +echo $ECHO_N "checking if cgetent uses const parameter... $ECHO_C" >&6 +if test "${cf_cv_cgetent_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22532 "configure" +#include "confdefs.h" + +#pragma GCC diagnostic error "-Wincompatible-pointer-types-discards-qualifiers" +$ac_includes_default +int +main (void) +{ + + char temp[128]; + char *buf = temp; +#ifndef _NETBSD_SOURCE /* given, since April 2004 in stdlib.h */ + const char *db_array = temp; + cgetent(&buf, &db_array, "vt100"); +#endif + cgetcap(buf, "tc", '='); + cgetmatch(buf, "tc"); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22555: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22558: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22561: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22564: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_cgetent_const=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_cgetent_const=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:22575: result: $cf_cv_cgetent_const" >&5 +echo "${ECHO_T}$cf_cv_cgetent_const" >&6 + if test "$cf_cv_cgetent_const" = yes + then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for isascii... $ECHO_C" >&6 +if test "${cf_cv_have_isascii+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 22596 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +int x = isascii(' '); (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22608: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22611: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22614: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22617: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_isascii=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_isascii=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:22628: result: $cf_cv_have_isascii" >&5 +echo "${ECHO_T}$cf_cv_have_isascii" >&6 +test "$cf_cv_have_isascii" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_ISASCII 1 +EOF + +if test "$ac_cv_func_sigaction" = yes; then +echo "$as_me:22636: checking whether sigaction needs _POSIX_SOURCE" >&5 +echo $ECHO_N "checking whether sigaction needs _POSIX_SOURCE... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 22639 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ +struct sigaction act; (void)act + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22653: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22656: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22659: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22662: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + sigact_bad=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22670 "configure" +#include "confdefs.h" + +#define _POSIX_SOURCE +#include +#include +int +main (void) +{ +struct sigaction act; (void)act + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22685: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22688: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22691: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22694: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + sigact_bad=yes + +cat >>confdefs.h <<\EOF +#define _POSIX_SOURCE 1 +EOF + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +sigact_bad=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:22710: result: $sigact_bad" >&5 +echo "${ECHO_T}$sigact_bad" >&6 +fi + +echo "$as_me:22714: checking if nanosleep really works" >&5 +echo $ECHO_N "checking if nanosleep really works... $ECHO_C" >&6 +if test "${cf_cv_func_nanosleep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes; then + cf_cv_func_nanosleep=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22724 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include +#include + +#ifdef HAVE_SYS_TIME_H +#include +#endif + +int main(void) { + struct timespec ts1, ts2; + int code; + ts1.tv_sec = 0; + ts1.tv_nsec = 750000000; + ts2.tv_sec = 0; + ts2.tv_nsec = 0; + errno = 0; + code = nanosleep(&ts1, &ts2); /* on failure errno is ENOSYS. */ + ${cf_cv_main_return:-return}(code != 0); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:22750: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22753: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:22755: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22758: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_nanosleep=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_nanosleep=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +echo "$as_me:22770: result: $cf_cv_func_nanosleep" >&5 +echo "${ECHO_T}$cf_cv_func_nanosleep" >&6 + +test "$cf_cv_func_nanosleep" = "yes" && +cat >>confdefs.h <<\EOF +#define HAVE_NANOSLEEP 1 +EOF + +for ac_header in \ +termio.h \ +termios.h \ +unistd.h \ +sys/ioctl.h \ +sys/termio.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:22787: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22793 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:22797: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:22803: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:22822: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking whether termios.h needs _POSIX_SOURCE... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 22842 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +struct termios foo; int x = (int)(foo.c_iflag = 1); (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22854: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22857: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22860: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22863: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + termios_bad=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 22871 "configure" +#include "confdefs.h" + +#define _POSIX_SOURCE +#include +int +main (void) +{ +struct termios foo; int x = (int)(foo.c_iflag = 2); (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22885: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22888: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22891: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22894: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + termios_bad=unknown +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +termios_bad=yes +cat >>confdefs.h <<\EOF +#define _POSIX_SOURCE 1 +EOF + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:22910: result: $termios_bad" >&5 +echo "${ECHO_T}$termios_bad" >&6 + fi +fi + +echo "$as_me:22915: checking for tcgetattr" >&5 +echo $ECHO_N "checking for tcgetattr... $ECHO_C" >&6 +if test "${cf_cv_have_tcgetattr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22922 "configure" +#include "confdefs.h" + +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_TERMIOS_H +#include +#define TTY struct termios +#else +#ifdef HAVE_TERMIO_H +#include +#define TTY struct termio +#endif +#endif + +int +main (void) +{ + +TTY foo; +tcgetattr(1, &foo); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22950: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22953: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22956: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22959: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_tcgetattr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_tcgetattr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22969: result: $cf_cv_have_tcgetattr" >&5 +echo "${ECHO_T}$cf_cv_have_tcgetattr" >&6 +test "$cf_cv_have_tcgetattr" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_TCGETATTR 1 +EOF + +echo "$as_me:22976: checking for vsscanf function or workaround" >&5 +echo $ECHO_N "checking for vsscanf function or workaround... $ECHO_C" >&6 +if test "${cf_cv_func_vsscanf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22983 "configure" +#include "confdefs.h" + +#include +#include + +static void +myfunc(const char *str, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + vsscanf(str, fmt, ap); + va_end(ap); +} + +int +main (void) +{ + + myfunc("55", "%d"); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23009: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23012: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23015: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23018: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_vsscanf=vsscanf +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +cat >"conftest.$ac_ext" <<_ACEOF +#line 23026 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ + + FILE strbuf; + char *str = "from"; + + strbuf._flag = _IOREAD; + strbuf._ptr = strbuf._base = (unsigned char *) str; + strbuf._cnt = strlen(str); + strbuf._file = _NFILE; + return (vfscanf(&strbuf, "%d", ap)) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23048: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23051: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23054: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23057: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_vsscanf=vfscanf +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +cat >"conftest.$ac_ext" <<_ACEOF +#line 23065 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ + + FILE strbuf; + char *str = "from"; + + strbuf._flag = _IOREAD; + strbuf._ptr = strbuf._base = (unsigned char *) str; + strbuf._cnt = strlen(str); + strbuf._file = _NFILE; + return (_doscan(&strbuf, "%d", ap)) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23087: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23090: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23093: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23096: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_vsscanf=_doscan +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +cf_cv_func_vsscanf=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:23111: result: $cf_cv_func_vsscanf" >&5 +echo "${ECHO_T}$cf_cv_func_vsscanf" >&6 + +case "$cf_cv_func_vsscanf" in +(vsscanf) +cat >>confdefs.h <<\EOF +#define HAVE_VSSCANF 1 +EOF +;; +(vfscanf) +cat >>confdefs.h <<\EOF +#define HAVE_VFSCANF 1 +EOF +;; +(_doscan) +cat >>confdefs.h <<\EOF +#define HAVE__DOSCAN 1 +EOF +;; +esac + +for ac_header in \ +unistd.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:23137: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23143 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:23147: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:23153: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:23172: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for working mkstemp... $ECHO_C" >&6 +if test "${cf_cv_func_mkstemp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +rm -rf ./conftest* +if test "$cross_compiling" = yes; then + cf_cv_func_mkstemp=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23193 "configure" +#include "confdefs.h" + +$ac_includes_default + +int main(void) +{ + static char tmpl[] = "conftestXXXXXX"; + char name[2][80]; + int n; + int result = 0; + int fd; + struct stat sb; + + umask(077); + for (n = 0; n < 2; ++n) { + strcpy(name[n], tmpl); + if ((fd = mkstemp(name[n])) >= 0) { + if (!strcmp(name[n], tmpl) + || stat(name[n], &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG + || (sb.st_mode & 077) != 0) { + result = 1; + } + close(fd); + } + } + if (result == 0 + && !strcmp(name[0], name[1])) + result = 1; + ${cf_cv_main_return:-return}(result); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:23228: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23231: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:23233: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23236: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_mkstemp=yes + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_mkstemp=no + +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:23251: result: $cf_cv_func_mkstemp" >&5 +echo "${ECHO_T}$cf_cv_func_mkstemp" >&6 +if test "x$cf_cv_func_mkstemp" = xmaybe ; then + echo "$as_me:23254: checking for mkstemp" >&5 +echo $ECHO_N "checking for mkstemp... $ECHO_C" >&6 +if test "${ac_cv_func_mkstemp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23260 "configure" +#include "confdefs.h" +#define mkstemp autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef mkstemp + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char mkstemp (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_mkstemp) || defined (__stub___mkstemp) +#error found stub for mkstemp +#endif + + return mkstemp (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23291: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23294: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23297: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23300: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_mkstemp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_mkstemp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:23310: result: $ac_cv_func_mkstemp" >&5 +echo "${ECHO_T}$ac_cv_func_mkstemp" >&6 + +fi +if test "x$cf_cv_func_mkstemp" = xyes || test "x$ac_cv_func_mkstemp" = xyes ; then + +cat >>confdefs.h <<\EOF +#define HAVE_MKSTEMP 1 +EOF + +fi + +# setup for prototype of fallback for vsscanf() + +if test "$cf_cv_func_vsscanf" = vsscanf ; then + HAVE_VSSCANF=1 +else + HAVE_VSSCANF=0 +fi + +if test "x$cross_compiling" = xyes ; then + { echo "$as_me:23331: WARNING: cross compiling: assume setvbuf params not reversed" >&5 +echo "$as_me: WARNING: cross compiling: assume setvbuf params not reversed" >&2;} +else + echo "$as_me:23334: checking whether setvbuf arguments are reversed" >&5 +echo $ECHO_N "checking whether setvbuf arguments are reversed... $ECHO_C" >&6 +if test "${ac_cv_func_setvbuf_reversed+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:23340: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23345 "configure" +#include "confdefs.h" +#include +/* If setvbuf has the reversed format, exit 0. */ +int +main (void) +{ + /* This call has the arguments reversed. + A reversed system may check and see that the address of main + is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ + if (setvbuf(stdout, _IOLBF, (char *) main, BUFSIZ) != 0) + $ac_main_return(1); + putc('\r', stdout); + $ac_main_return(0); /* Non-reversed systems segv here. */ +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:23362: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23365: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:23367: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23370: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_setvbuf_reversed=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_setvbuf_reversed=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f core ./core.* ./*.core +fi +echo "$as_me:23383: result: $ac_cv_func_setvbuf_reversed" >&5 +echo "${ECHO_T}$ac_cv_func_setvbuf_reversed" >&6 +if test $ac_cv_func_setvbuf_reversed = yes; then + +cat >>confdefs.h <<\EOF +#define SETVBUF_REVERSED 1 +EOF + +fi + +fi +echo "$as_me:23394: checking for intptr_t" >&5 +echo $ECHO_N "checking for intptr_t... $ECHO_C" >&6 +if test "${ac_cv_type_intptr_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23400 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((intptr_t *) 0) + return 0; +if (sizeof (intptr_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:23415: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23418: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:23421: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23424: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_intptr_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_intptr_t=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:23434: result: $ac_cv_type_intptr_t" >&5 +echo "${ECHO_T}$ac_cv_type_intptr_t" >&6 +if test "$ac_cv_type_intptr_t" = yes; then + : +else + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for ssize_t... $ECHO_C" >&6 +if test "${ac_cv_type_ssize_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23452 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((ssize_t *) 0) + return 0; +if (sizeof (ssize_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:23467: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23470: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:23473: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23476: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_ssize_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_ssize_t=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:23486: result: $ac_cv_type_ssize_t" >&5 +echo "${ECHO_T}$ac_cv_type_ssize_t" >&6 +if test "$ac_cv_type_ssize_t" = yes; then + : +else + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for type sigaction_t... $ECHO_C" >&6 +if test "${cf_cv_type_sigaction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 23505 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +sigaction_t x; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:23518: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23521: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:23524: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23527: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_type_sigaction=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_type_sigaction=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi + +echo "$as_me:23538: result: $cf_cv_type_sigaction" >&5 +echo "${ECHO_T}$cf_cv_type_sigaction" >&6 +test "$cf_cv_type_sigaction" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_TYPE_SIGACTION 1 +EOF + +echo "$as_me:23545: checking declaration of size-change" >&5 +echo $ECHO_N "checking declaration of size-change... $ECHO_C" >&6 +if test "${cf_cv_sizechange+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_sizechange=unknown + cf_save_CPPFLAGS="$CPPFLAGS" + +for cf_opts in "" "NEED_PTEM_H" +do + + CPPFLAGS="$cf_save_CPPFLAGS" + if test -n "$cf_opts" + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D$cf_opts" + + fi + cat >"conftest.$ac_ext" <<_ACEOF +#line 23566 "configure" +#include "confdefs.h" +#include +#ifdef HAVE_TERMIOS_H +#include +#else +#ifdef HAVE_TERMIO_H +#include +#endif +#endif + +#ifdef NEED_PTEM_H +/* This is a workaround for SCO: they neglected to define struct winsize in + * termios.h -- it is only in termio.h and ptem.h + */ +#include +#include +#endif + +#ifdef HAVE_SYS_IOCTL_H +#include +#endif + +int +main (void) +{ + +#ifdef TIOCGSIZE + struct ttysize win; /* SunOS 3.0... */ + int y = win.ts_lines = 2; + int x = win.ts_cols = 1; + (void)y; + (void)x; +#else +#ifdef TIOCGWINSZ + struct winsize win; /* everything else */ + int y = win.ws_row = 2; + int x = win.ws_col = 1; + (void)y; + (void)x; +#else + no TIOCGSIZE or TIOCGWINSZ +#endif /* TIOCGWINSZ */ +#endif /* TIOCGSIZE */ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:23616: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23619: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:23622: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23625: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_sizechange=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_sizechange=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + CPPFLAGS="$cf_save_CPPFLAGS" + if test "$cf_cv_sizechange" = yes ; then + echo "size-change succeeded ($cf_opts)" >&5 + test -n "$cf_opts" && cf_cv_sizechange="$cf_opts" + break + fi +done + +fi +echo "$as_me:23644: result: $cf_cv_sizechange" >&5 +echo "${ECHO_T}$cf_cv_sizechange" >&6 +if test "$cf_cv_sizechange" != no ; then + +cat >>confdefs.h <<\EOF +#define HAVE_SIZECHANGE 1 +EOF + + case "$cf_cv_sizechange" in + (NEED*) + cat >>confdefs.h <&5 +echo $ECHO_N "checking for memmove... $ECHO_C" >&6 +if test "${ac_cv_func_memmove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23668 "configure" +#include "confdefs.h" +#define memmove autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef memmove + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char memmove (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_memmove) || defined (__stub___memmove) +#error found stub for memmove +#endif + + return memmove (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23699: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23702: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23705: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23708: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_memmove=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_memmove=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:23718: result: $ac_cv_func_memmove" >&5 +echo "${ECHO_T}$ac_cv_func_memmove" >&6 +if test "$ac_cv_func_memmove" = yes; then + : +else + +echo "$as_me:23724: checking for bcopy" >&5 +echo $ECHO_N "checking for bcopy... $ECHO_C" >&6 +if test "${ac_cv_func_bcopy+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23730 "configure" +#include "confdefs.h" +#define bcopy autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef bcopy + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char bcopy (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_bcopy) || defined (__stub___bcopy) +#error found stub for bcopy +#endif + + return bcopy (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23761: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23764: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23767: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23770: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_bcopy=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_bcopy=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:23780: result: $ac_cv_func_bcopy" >&5 +echo "${ECHO_T}$ac_cv_func_bcopy" >&6 +if test "$ac_cv_func_bcopy" = yes; then + + echo "$as_me:23784: checking if bcopy does overlapping moves" >&5 +echo $ECHO_N "checking if bcopy does overlapping moves... $ECHO_C" >&6 +if test "${cf_cv_good_bcopy+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "$cross_compiling" = yes; then + cf_cv_good_bcopy=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23794 "configure" +#include "confdefs.h" + +$ac_includes_default + +int main(void) { + static char data[] = "abcdefghijklmnopqrstuwwxyz"; + char temp[40]; + bcopy(data, temp, sizeof(data)); + bcopy(temp+10, temp, 15); + bcopy(temp+5, temp+15, 10); + ${cf_cv_main_return:-return} (strcmp(temp, "klmnopqrstuwwxypqrstuwwxyz")); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:23810: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23813: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:23815: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23818: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_good_bcopy=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_good_bcopy=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:23831: result: $cf_cv_good_bcopy" >&5 +echo "${ECHO_T}$cf_cv_good_bcopy" >&6 + +else + cf_cv_good_bcopy=no +fi + + if test "$cf_cv_good_bcopy" = yes ; then + +cat >>confdefs.h <<\EOF +#define USE_OK_BCOPY 1 +EOF + + else + +cat >>confdefs.h <<\EOF +#define USE_MY_MEMMOVE 1 +EOF + + fi + +fi + +tty >/dev/null 2>&1 || { +for ac_func in posix_openpt +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:23858: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23864 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23895: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23898: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23901: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23904: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:23914: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if poll really works... $ECHO_C" >&6 +if test "${cf_cv_working_poll+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes; then + cf_cv_working_poll=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23934 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include + +#ifdef HAVE_POLL_H +#include +#else +#include +#endif + +int main(void) { + struct pollfd myfds; + int ret; + + /* check for Darwin bug with respect to "devices" */ + myfds.fd = open("/dev/null", 1); /* O_WRONLY */ + if (myfds.fd < 0) + myfds.fd = 0; + myfds.events = POLLIN; + myfds.revents = 0; + + ret = poll(&myfds, 1, 100); + + if (ret < 0 || (myfds.revents & POLLNVAL)) { + ret = -1; + } else { + int fd = 0; + if (!isatty(fd)) { + fd = open("/dev/tty", 2); /* O_RDWR */ + } +#ifdef HAVE_POSIX_OPENPT + if (fd < 0) { + fd = posix_openpt(O_RDWR); + } +#endif + + if (fd >= 0) { + /* also check with standard input */ + myfds.fd = fd; + myfds.events = POLLIN; + myfds.revents = 0; + ret = poll(&myfds, 1, 100); + } else { + ret = -1; + } + } + ${cf_cv_main_return:-return}(ret < 0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:23987: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23990: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:23992: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23995: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_working_poll=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_working_poll=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +echo "$as_me:24007: result: $cf_cv_working_poll" >&5 +echo "${ECHO_T}$cf_cv_working_poll" >&6 +test "$cf_cv_working_poll" = "yes" && +cat >>confdefs.h <<\EOF +#define HAVE_WORKING_POLL 1 +EOF + +echo "$as_me:24014: checking if MB_LEN_MAX is usable" >&5 +echo $ECHO_N "checking if MB_LEN_MAX is usable... $ECHO_C" >&6 +if test "${cf_cv_mb_len_max+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 24021 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +int +main (void) +{ + +#if defined(MB_LEN_MAX) && MB_LEN_MAX >= 6 + ${cf_cv_main_return:-return}(0); +#else +#error MB_LEN_MAX is not usable +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:24041: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:24044: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:24047: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24050: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_mb_len_max=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_mb_len_max=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:24060: result: $cf_cv_mb_len_max" >&5 +echo "${ECHO_T}$cf_cv_mb_len_max" >&6 +if test "$cf_cv_mb_len_max" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_CONSISTENT_MB_LEN_MAX 1 +EOF + +else + { echo "$as_me:24070: WARNING: MB_LEN_MAX is missing/inconsistent in system headers" >&5 +echo "$as_me: WARNING: MB_LEN_MAX is missing/inconsistent in system headers" >&2;} +fi + +echo "$as_me:24074: checking for va_copy" >&5 +echo $ECHO_N "checking for va_copy... $ECHO_C" >&6 +if test "${cf_cv_have_va_copy+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 24081 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + static va_list dst; + static va_list src; + va_copy(dst, src) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24098: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24101: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24104: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24107: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_va_copy=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_va_copy=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:24117: result: $cf_cv_have_va_copy" >&5 +echo "${ECHO_T}$cf_cv_have_va_copy" >&6 + +if test "$cf_cv_have_va_copy" = yes; +then + +cat >>confdefs.h <<\EOF +#define HAVE_VA_COPY 1 +EOF + +else # !cf_cv_have_va_copy + +echo "$as_me:24129: checking for __va_copy" >&5 +echo $ECHO_N "checking for __va_copy... $ECHO_C" >&6 +if test "${cf_cv_have___va_copy+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 24136 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + static va_list dst; + static va_list src; + __va_copy(dst, src) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24153: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24156: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24159: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24162: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have___va_copy=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have___va_copy=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:24172: result: $cf_cv_have___va_copy" >&5 +echo "${ECHO_T}$cf_cv_have___va_copy" >&6 + +if test "$cf_cv_have___va_copy" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE___VA_COPY 1 +EOF + +else # !cf_cv_have___va_copy + +echo "$as_me:24184: checking for __builtin_va_copy" >&5 +echo $ECHO_N "checking for __builtin_va_copy... $ECHO_C" >&6 +if test "${cf_cv_have___builtin_va_copy+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 24191 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + static va_list dst; + static va_list src; + __builtin_va_copy(dst, src) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24208: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24211: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24214: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24217: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have___builtin_va_copy=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have___builtin_va_copy=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:24227: result: $cf_cv_have___builtin_va_copy" >&5 +echo "${ECHO_T}$cf_cv_have___builtin_va_copy" >&6 + +test "$cf_cv_have___builtin_va_copy" = yes && + +cat >>confdefs.h <<\EOF +#define HAVE___BUILTIN_VA_COPY 1 +EOF + +fi # cf_cv_have___va_copy + +fi # cf_cv_have_va_copy + +case "${cf_cv_have_va_copy}${cf_cv_have___va_copy}${cf_cv_have___builtin_va_copy}" in +(*yes*) + ;; + +(*) + echo "$as_me:24245: checking if we can simply copy va_list" >&5 +echo $ECHO_N "checking if we can simply copy va_list... $ECHO_C" >&6 +if test "${cf_cv_pointer_va_list+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 24252 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + va_list dst; + va_list src; + dst = src + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24269: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24272: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24275: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24278: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_pointer_va_list=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_pointer_va_list=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:24288: result: $cf_cv_pointer_va_list" >&5 +echo "${ECHO_T}$cf_cv_pointer_va_list" >&6 + + if test "$cf_cv_pointer_va_list" = no + then + echo "$as_me:24293: checking if we can copy va_list indirectly" >&5 +echo $ECHO_N "checking if we can copy va_list indirectly... $ECHO_C" >&6 +if test "${cf_cv_array_va_list+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 24300 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + va_list dst; + va_list src; + *dst = *src + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24317: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24320: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24323: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24326: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_array_va_list=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_array_va_list=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:24336: result: $cf_cv_array_va_list" >&5 +echo "${ECHO_T}$cf_cv_array_va_list" >&6 + test "$cf_cv_array_va_list" = yes && +cat >>confdefs.h <<\EOF +#define ARRAY_VA_LIST 1 +EOF + + fi + ;; +esac + +echo "$as_me:24347: checking for pid_t" >&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6 +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 24353 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((pid_t *) 0) + return 0; +if (sizeof (pid_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:24368: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:24371: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:24374: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24377: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_pid_t=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:24387: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6 +if test "$ac_cv_type_pid_t" = yes; then + : +else + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 24408 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:24412: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:24418: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:24437: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 24456 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24487: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24490: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24493: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24496: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:24506: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for working fork... $ECHO_C" >&6 +if test "${ac_cv_func_fork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_fork_works=cross +else + cat >"conftest.$ac_ext" <<_ACEOF +/* By Rüdiger Kuhlmann. */ + #include + #if HAVE_UNISTD_H + # include + #endif + /* Some systems only have a dummy stub for fork() */ + int main (void) + { + if (fork() < 0) + $ac_main_return (1); + $ac_main_return (0); + } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:24541: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24544: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:24546: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24549: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_fork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_fork_works=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +echo "$as_me:24561: result: $ac_cv_func_fork_works" >&5 +echo "${ECHO_T}$ac_cv_func_fork_works" >&6 + +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { echo "$as_me:24575: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&5 +echo "$as_me: WARNING: CROSS: Result $ac_cv_func_fork_works guessed due to cross-compiling." >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + echo "$as_me:24580: checking for working vfork" >&5 +echo $ECHO_N "checking for working vfork... $ECHO_C" >&6 +if test "${ac_cv_func_vfork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_vfork_works=cross +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 24589 "configure" +#include "confdefs.h" +/* Thanks to Paul Eggert for this test. */ +#include +#include +#include +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static +sparc_address_test (int arg) +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main (void) +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + $ac_main_return( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:24682: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24685: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:24687: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24690: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_vfork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_vfork_works=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +echo "$as_me:24702: result: $ac_cv_func_vfork_works" >&5 +echo "${ECHO_T}$ac_cv_func_vfork_works" >&6 + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=ac_cv_func_vfork + { echo "$as_me:24708: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&5 +echo "$as_me: WARNING: CROSS: Result $ac_cv_func_vfork_works guessed due to cross-compiling." >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +cat >>confdefs.h <<\EOF +#define HAVE_WORKING_VFORK 1 +EOF + +else + +cat >>confdefs.h <<\EOF +#define vfork fork +EOF + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +cat >>confdefs.h <<\EOF +#define HAVE_WORKING_FORK 1 +EOF + +fi + +echo "$as_me:24733: checking if fopen accepts explicit binary mode" >&5 +echo $ECHO_N "checking if fopen accepts explicit binary mode... $ECHO_C" >&6 +if test "${cf_cv_fopen_bin_r+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test "$cross_compiling" = yes; then + cf_cv_fopen_bin_r=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 24743 "configure" +#include "confdefs.h" + +$ac_includes_default + +int main(void) +{ + FILE *fp = fopen("conftest.tmp", "wb"); + int rc = 0; + if (fp != 0) { + int p, q; + for (p = 0; p < 256; ++p) { + fputc(p, fp); + } + fclose(fp); + fp = fopen("conftest.tmp", "rb"); + if (fp != 0) { + for (p = 0; p < 256; ++p) { + q = fgetc(fp); + if (q != p) { + rc = 1; + break; + } + } + } else { + rc = 1; + } + } else { + rc = 1; + } + ${cf_cv_main_return:-return} (rc); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:24778: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24781: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:24783: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24786: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_fopen_bin_r=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_fopen_bin_r=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:24799: result: $cf_cv_fopen_bin_r" >&5 +echo "${ECHO_T}$cf_cv_fopen_bin_r" >&6 +test "x$cf_cv_fopen_bin_r" != xno && +cat >>confdefs.h <<\EOF +#define USE_FOPEN_BIN_R 1 +EOF + +# special check for test/ditto.c + +echo "$as_me:24808: checking for openpty in -lutil" >&5 +echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6 +if test "${ac_cv_lib_util_openpty+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 24816 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char openpty (void); +int +main (void) +{ +openpty (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24835: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24838: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24841: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24844: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_util_openpty=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_util_openpty=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:24855: result: $ac_cv_lib_util_openpty" >&5 +echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6 +if test "$ac_cv_lib_util_openpty" = yes; then + cf_cv_lib_util=yes +else + cf_cv_lib_util=no +fi + +echo "$as_me:24863: checking for openpty header" >&5 +echo $ECHO_N "checking for openpty header... $ECHO_C" >&6 +if test "${cf_cv_func_openpty+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LIBS="$LIBS" + test "$cf_cv_lib_util" = yes && { +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + } + for cf_header in pty.h libutil.h util.h + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 24890 "configure" +#include "confdefs.h" + +#include <$cf_header> + +int +main (void) +{ + + int x = openpty((int *)0, (int *)0, (char *)0, + (struct termios *)0, (struct winsize *)0); + (void)x; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:24908: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:24911: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:24914: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:24917: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_func_openpty=$cf_header + break + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_func_openpty=no + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + LIBS="$cf_save_LIBS" + +fi +echo "$as_me:24935: result: $cf_cv_func_openpty" >&5 +echo "${ECHO_T}$cf_cv_func_openpty" >&6 + +if test "$cf_cv_func_openpty" != no ; then + +cat >>confdefs.h < +EOF + +cat >>confdefs.h <<\EOF +#define USE_XTERM_PTY 1 +EOF + + if test "x$cf_cv_lib_util" = xyes ; then + +cf_add_libs="$TEST_LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +TEST_LIBS="$cf_add_libs" + + fi +fi + +if test "$with_hashed_db" != no ; then + +cat >>confdefs.h <<\EOF +#define USE_HASHED_DB 1 +EOF + +case $with_hashed_db in +(yes|*able*) + ;; +(*) + if test -d "$with_hashed_db" ; then + +if test -n "$with_hashed_db/include" ; then + for cf_add_incdir in $with_hashed_db/include + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25008 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:25020: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:25023: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:25026: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25029: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:25046: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +if test -n "$with_hashed_db/lib" ; then + for cf_add_libdir in $with_hashed_db/lib + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:25082: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + else + case "$with_hashed_db" in + (./*|../*|/*) + { echo "$as_me:25093: WARNING: no such directory $with_hashed_db" >&5 +echo "$as_me: WARNING: no such directory $with_hashed_db" >&2;} + ;; + (*) + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/$with_hashed_db" && cf_search="$cf_search $prefix/include/$with_hashed_db" + test -d "$prefix/include/$with_hashed_db/include" && cf_search="$cf_search $prefix/include/$with_hashed_db/include" + test -d "$prefix/$with_hashed_db/include" && cf_search="$cf_search $prefix/$with_hashed_db/include" + test -d "$prefix/$with_hashed_db/include/$with_hashed_db" && cf_search="$cf_search $prefix/$with_hashed_db/include/$with_hashed_db" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/$with_hashed_db" && cf_search="$cf_search $cf_subdir_prefix/include/$with_hashed_db" + test -d "$cf_subdir_prefix/include/$with_hashed_db/include" && cf_search="$cf_search $cf_subdir_prefix/include/$with_hashed_db/include" + test -d "$cf_subdir_prefix/$with_hashed_db/include" && cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/include" + test -d "$cf_subdir_prefix/$with_hashed_db/include/$with_hashed_db" && cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/include/$with_hashed_db" +} + +done + + for cf_item in $cf_search + do + case "$cf_item" in + (*/$with_hashed_db) + +if test -n "$cf_item" ; then + for cf_add_incdir in $cf_item + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25165 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:25177: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:25180: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:25183: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25186: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:25203: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + + ;; + esac + done + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/$with_hashed_db" && cf_search="$cf_search $prefix/lib/$with_hashed_db" + test -d "$prefix/lib/$with_hashed_db/lib" && cf_search="$cf_search $prefix/lib/$with_hashed_db/lib" + test -d "$prefix/$with_hashed_db/lib" && cf_search="$cf_search $prefix/$with_hashed_db/lib" + test -d "$prefix/$with_hashed_db/lib/$with_hashed_db" && cf_search="$cf_search $prefix/$with_hashed_db/lib/$with_hashed_db" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/$with_hashed_db" && cf_search="$cf_search $cf_subdir_prefix/lib/$with_hashed_db" + test -d "$cf_subdir_prefix/lib/$with_hashed_db/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$with_hashed_db/lib" + test -d "$cf_subdir_prefix/$with_hashed_db/lib" && cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/lib" + test -d "$cf_subdir_prefix/$with_hashed_db/lib/$with_hashed_db" && cf_search="$cf_search $cf_subdir_prefix/$with_hashed_db/lib/$with_hashed_db" +} + +done + + for cf_item in $cf_search + do + case "$cf_item" in + (*/$with_hashed_db) + +if test -n "$cf_item" ; then + for cf_add_libdir in $cf_item + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:25283: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + ;; + esac + done + + ;; + esac + fi +esac + +echo "$as_me:25300: checking for db.h" >&5 +echo $ECHO_N "checking for db.h... $ECHO_C" >&6 +if test "${ac_cv_header_db_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 25306 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:25310: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:25316: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_db_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_db_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:25335: result: $ac_cv_header_db_h" >&5 +echo "${ECHO_T}$ac_cv_header_db_h" >&6 +if test "$ac_cv_header_db_h" = yes; then + +echo "$as_me:25339: checking for version of db" >&5 +echo $ECHO_N "checking for version of db... $ECHO_C" >&6 +if test "${cf_cv_hashed_db_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_hashed_db_version=unknown + +for cf_db_version in 1 2 3 4 5 6 +do + +echo "${as_me:-configure}:25350: testing checking for db version $cf_db_version ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25353 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +#ifdef DB_VERSION_MAJOR + /* db2 (DB_VERSION_MAJOR=2) has also DB_VERSION_MINOR, tested with 7 */ +#if $cf_db_version == DB_VERSION_MAJOR + /* ok */ +#else + #error $cf_db_version is not DB_VERSION_MAJOR +#endif +#else +#if $cf_db_version == 1 + /* ok: assuming this is DB 1.8.5 */ +#else + #error $cf_db_version is not 1 +#endif +#endif + +int +main (void) +{ +DBT *foo = 0 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:25383: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:25386: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:25389: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25392: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_hashed_db_version=$cf_db_version + break + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:25406: result: $cf_cv_hashed_db_version" >&5 +echo "${ECHO_T}$cf_cv_hashed_db_version" >&6 + +if test "$cf_cv_hashed_db_version" = unknown ; then + { { echo "$as_me:25410: error: Cannot determine version of db" >&5 +echo "$as_me: error: Cannot determine version of db" >&2;} + { (exit 1); exit 1; }; } +else + +echo "$as_me:25415: checking for db libraries" >&5 +echo $ECHO_N "checking for db libraries... $ECHO_C" >&6 +if test "${cf_cv_hashed_db_libs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_hashed_db_libs=unknown +for cf_db_libs in "" db$cf_cv_hashed_db_version db-$cf_cv_hashed_db_version db '' +do + cf_save_libs="$LIBS" + if test -n "$cf_db_libs"; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_db_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + fi + +echo "${as_me:-configure}:25445: testing checking for library $cf_db_libs ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25448 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ + + char *path = "/tmp/foo"; +#ifdef DB_VERSION_MAJOR +#if DB_VERSION_MAJOR >= 4 + DB *result = 0; + db_create(&result, NULL, 0); + result->open(result, + NULL, + path, + path, + DB_HASH, + DB_CREATE, + 0644); +#elif DB_VERSION_MAJOR >= 3 + DB *result = 0; + db_create(&result, NULL, 0); + result->open(result, + path, + path, + DB_HASH, + DB_CREATE, + 0644); +#elif DB_VERSION_MAJOR >= 2 + DB *result = 0; + db_open(path, + DB_HASH, + DB_CREATE, + 0644, + (DB_ENV *) 0, + (DB_INFO *) 0, + &result); +#endif /* DB_VERSION_MAJOR */ +#else + DB *result = dbopen(path, + 2, + 0644, + DB_HASH, + 0); +#endif + ${cf_cv_main_return:-return}(result != 0) + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:25503: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:25506: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:25509: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25512: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + if test -n "$cf_db_libs" ; then + cf_cv_hashed_db_libs=$cf_db_libs + else + cf_cv_hashed_db_libs=default + fi + LIBS="$cf_save_libs" + break + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_libs" +done + +fi +echo "$as_me:25532: result: $cf_cv_hashed_db_libs" >&5 +echo "${ECHO_T}$cf_cv_hashed_db_libs" >&6 + + if test "$cf_cv_hashed_db_libs" = unknown ; then + { { echo "$as_me:25536: error: Cannot determine library for db" >&5 +echo "$as_me: error: Cannot determine library for db" >&2;} + { (exit 1); exit 1; }; } + elif test "$cf_cv_hashed_db_libs" != default ; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_cv_hashed_db_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + fi +fi + +else + + { { echo "$as_me:25562: error: Cannot find db.h" >&5 +echo "$as_me: error: Cannot find db.h" >&2;} + { (exit 1); exit 1; }; } + +fi + +fi + +if test -z "$cf_user_CFLAGS" && test "$enable_leaks" = yes ; then + CFLAGS=`echo "${CFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'` + CXXFLAGS=`echo "${CXXFLAGS}" | sed -e 's%-g %%' -e 's%-g$%%' -e 's%[ ]% %g' -e 's% [ ]*% %g' -e 's%^ %%' -e 's% $%%'` +fi + +# Just in case, check if the C compiler has a bool type. + +echo "$as_me:25577: checking if we should include stdbool.h" >&5 +echo $ECHO_N "checking if we should include stdbool.h... $ECHO_C" >&6 + +if test "${cf_cv_header_stdbool_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25585 "configure" +#include "confdefs.h" + +int +main (void) +{ +bool foo = false; (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:25597: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:25600: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:25603: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25606: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_header_stdbool_h=0 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 25613 "configure" +#include "confdefs.h" + +#ifndef __BEOS__ +#include +#endif + +int +main (void) +{ +bool foo = false; (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:25629: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:25632: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:25635: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25638: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_header_stdbool_h=1 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_header_stdbool_h=0 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi + +if test "$cf_cv_header_stdbool_h" = 1 +then echo "$as_me:25652: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else echo "$as_me:25654: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:25658: checking for builtin bool type" >&5 +echo $ECHO_N "checking for builtin bool type... $ECHO_C" >&6 + +if test "${cf_cv_cc_bool_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25666 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +bool x = false; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:25681: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:25684: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:25687: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25690: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_cc_bool_type=1 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_cc_bool_type=0 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi + +if test "$cf_cv_cc_bool_type" = 1 +then echo "$as_me:25703: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else echo "$as_me:25705: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +# Check for C++ compiler characteristics (and ensure that it's there!) +if test -n "$CXX" ; then + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +if test -n "$GXX" ; then + + cf_save="$LIBS" + LIBS="$LIBS $CXXLIBS" + echo "$as_me:25722: checking if we already have C++ library" >&5 +echo $ECHO_N "checking if we already have C++ library... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 25725 "configure" +#include "confdefs.h" + + #include +int +main (void) +{ + + std::cout << "Hello World!" << std::endl; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:25739: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:25742: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:25745: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25748: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_libstdcpp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_libstdcpp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:25757: result: $cf_have_libstdcpp" >&5 +echo "${ECHO_T}$cf_have_libstdcpp" >&6 + LIBS="$cf_save" + + if test "$cf_have_libstdcpp" != yes + then + case "$cf_cv_system_name" in + (os2*) + if test -z "`g++ -dM -E - < /dev/null | grep __KLIBC__`"; then + cf_stdcpp_libname=stdcpp + else + cf_stdcpp_libname=stdc++ + fi + ;; + (*) + cf_stdcpp_libname=stdc++ + ;; + esac + + echo "$as_me:25776: checking for library $cf_stdcpp_libname" >&5 +echo $ECHO_N "checking for library $cf_stdcpp_libname... $ECHO_C" >&6 +if test "${cf_cv_libstdcpp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save="$LIBS" + LIBS="$LIBS $CXXLIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_stdcpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25802 "configure" +#include "confdefs.h" + + #include +int +main (void) +{ + + std::cout << "Hello World!" << std::endl; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:25816: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:25819: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:25822: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25825: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_libstdcpp=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_libstdcpp=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save" + +fi +echo "$as_me:25837: result: $cf_cv_libstdcpp" >&5 +echo "${ECHO_T}$cf_cv_libstdcpp" >&6 + test "$cf_cv_libstdcpp" = yes && { +cf_add_libs="$CXXLIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_stdcpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +CXXLIBS="$cf_add_libs" + } + fi +fi + + echo "$as_me:25859: checking whether $CXX understands -c and -o together" >&5 +echo $ECHO_N "checking whether $CXX understands -c and -o together... $ECHO_C" >&6 +if test "${cf_cv_prog_CXX_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat > conftest.$ac_ext <&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25877: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + test -f conftest2.$ac_objext && { (eval echo "$as_me:25879: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25882: \$? = $ac_status" >&5 + (exit "$ac_status"); }; +then + eval cf_cv_prog_CXX_c_o=yes +else + eval cf_cv_prog_CXX_c_o=no +fi +rm -rf ./conftest* + +fi +if test "$cf_cv_prog_CXX_c_o" = yes; then + echo "$as_me:25893: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:25896: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + case "$GXX_VERSION" in + (1.*|2.[0-6]*|[1-9][0-9].*) + cf_cxx_library=yes + ;; + (*-2.7*|2.7*) + +cf_cxx_library=unknown +case "$cf_cv_system_name" in +(os2*) + cf_gpp_libname=gpp + ;; +(*) + cf_gpp_libname=g++ + ;; +esac +if test "$GXX" = yes; then + echo "$as_me:25916: checking for lib$cf_gpp_libname" >&5 +echo $ECHO_N "checking for lib$cf_gpp_libname... $ECHO_C" >&6 + cf_save="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 25937 "configure" +#include "confdefs.h" + +#include <$cf_gpp_libname/builtin.h> + +int +main (void) +{ +two_arg_error_handler_t foo2 = lib_error_handler + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:25951: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:25954: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:25957: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:25960: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cxx_library=yes + +cf_add_libs="$CXXLIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +CXXLIBS="$cf_add_libs" + + if test "$cf_gpp_libname" = cpp ; then + +cat >>confdefs.h <<\EOF +#define HAVE_GPP_BUILTIN_H 1 +EOF + + else + +cat >>confdefs.h <<\EOF +#define HAVE_GXX_BUILTIN_H 1 +EOF + + fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 25997 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ +two_arg_error_handler_t foo2 = lib_error_handler + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:26011: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:26014: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:26017: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26020: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cxx_library=yes + +cf_add_libs="$CXXLIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_gpp_libname; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +CXXLIBS="$cf_add_libs" + +cat >>confdefs.h <<\EOF +#define HAVE_BUILTIN_H 1 +EOF + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cxx_library=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save" + echo "$as_me:26053: result: $cf_cxx_library" >&5 +echo "${ECHO_T}$cf_cxx_library" >&6 +fi + + ;; + (*) + cf_cxx_library=no + ;; + esac + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" +echo "$as_me:26069: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 26086 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:26091: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:26097: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 26120 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:26124: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:26130: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:26167: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 26177 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:26182: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:26188: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 26211 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:26215: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:26221: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + : +else + { { echo "$as_me:26249: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +for ac_header in typeinfo +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:26264: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 26270 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:26274: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:26280: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:26299: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 26318 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:26322: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:26328: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:26347: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if iostream uses std-namespace... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 26361 "configure" +#include "confdefs.h" + +#include +using std::endl; +using std::cerr; +int +main (void) +{ + +cerr << "testing" << endl; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26378: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26381: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26384: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26387: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_iostream_namespace=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_iostream_namespace=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:26396: result: $cf_iostream_namespace" >&5 +echo "${ECHO_T}$cf_iostream_namespace" >&6 + if test "$cf_iostream_namespace" = yes ; then + +cat >>confdefs.h <<\EOF +#define IOSTREAM_NAMESPACE 1 +EOF + + fi +fi + +echo "$as_me:26407: checking if we should include stdbool.h" >&5 +echo $ECHO_N "checking if we should include stdbool.h... $ECHO_C" >&6 + +if test "${cf_cv_header_stdbool_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 26415 "configure" +#include "confdefs.h" + +int +main (void) +{ +bool foo = false; (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26427: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26430: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26433: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26436: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_header_stdbool_h=0 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 26443 "configure" +#include "confdefs.h" + +#ifndef __BEOS__ +#include +#endif + +int +main (void) +{ +bool foo = false; (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26459: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26462: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26465: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26468: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_header_stdbool_h=1 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_header_stdbool_h=0 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi + +if test "$cf_cv_header_stdbool_h" = 1 +then echo "$as_me:26482: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else echo "$as_me:26484: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:26488: checking for builtin bool type" >&5 +echo $ECHO_N "checking for builtin bool type... $ECHO_C" >&6 + +if test "${cf_cv_builtin_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 26496 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +bool x = false; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26511: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26514: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26517: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26520: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_builtin_bool=1 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_builtin_bool=0 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi + +if test "$cf_cv_builtin_bool" = 1 +then echo "$as_me:26533: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else echo "$as_me:26535: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:26539: checking for bool" >&5 +echo $ECHO_N "checking for bool... $ECHO_C" >&6 +if test "${ac_cv_type_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 26545 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +if ((bool *) 0) + return 0; +if (sizeof (bool)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26580: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26583: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26586: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26589: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_bool=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_bool=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:26599: result: $ac_cv_type_bool" >&5 +echo "${ECHO_T}$ac_cv_type_bool" >&6 + +echo "$as_me:26602: checking size of bool" >&5 +echo $ECHO_N "checking size of bool... $ECHO_C" >&6 +if test "${ac_cv_sizeof_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$ac_cv_type_bool" = yes; then + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >"conftest.$ac_ext" <<_ACEOF +#line 26611 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) >= 0)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26643: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26646: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26649: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26652: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 26657 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26689: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26692: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26695: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26698: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=-1 ac_mid=-1 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 26714 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) >= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26746: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26749: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26752: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26755: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"` + cat >"conftest.$ac_ext" <<_ACEOF +#line 26771 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:26803: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:26806: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:26809: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26812: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +ac_cv_sizeof_bool=$ac_lo +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:26825: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 26830 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +FILE *f = fopen ("conftest.val", "w"); +if (!f) + $ac_main_return (1); +fprintf (f, "%ld", (long)(sizeof (bool))); +fclose (f); + ; + return 0; +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:26866: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:26869: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:26871: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26874: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sizeof_bool=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_bool=0 +fi +fi +echo "$as_me:26890: result: $ac_cv_sizeof_bool" >&5 +echo "${ECHO_T}$ac_cv_sizeof_bool" >&6 +cat >>confdefs.h <&5 +echo $ECHO_N "checking for type of bool... $ECHO_C" >&6 +if test "${cf_cv_type_of_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -f cf_test.out + if test "$cross_compiling" = yes; then + + case x$ac_cv_sizeof_bool in + (x1) cf_cv_type_of_bool="unsigned char";; + (x2) cf_cv_type_of_bool="unsigned short";; + (x4) cf_cv_type_of_bool="unsigned int";; + (x8) cf_cv_type_of_bool="unsigned long";; + (*) cf_cv_type_of_bool=unknown;; + esac + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 26915 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int main(void) +{ + FILE *fp = fopen("cf_test.out", "w"); + if (fp != 0) { + bool x = true; + if ((bool)(-x) >= 0) + fputs("unsigned ", fp); + if (sizeof(x) == sizeof(int)) fputs("int", fp); + else if (sizeof(x) == sizeof(char)) fputs("char", fp); + else if (sizeof(x) == sizeof(short))fputs("short",fp); + else if (sizeof(x) == sizeof(long)) fputs("long", fp); + fclose(fp); + } + ${cf_cv_main_return:-return}(0); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:26956: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:26959: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:26961: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:26964: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_type_of_bool=`cat cf_test.out` + if test -z "$cf_cv_type_of_bool"; then + cf_cv_type_of_bool=unknown + fi +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_type_of_bool=unknown +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f cf_test.out + +fi +echo "$as_me:26981: result: $cf_cv_type_of_bool" >&5 +echo "${ECHO_T}$cf_cv_type_of_bool" >&6 + +if test "$cf_cv_type_of_bool" = unknown ; then + case .$NCURSES_BOOL in + (.auto|.) NCURSES_BOOL=unsigned;; + esac + { echo "$as_me:26988: WARNING: Assuming $NCURSES_BOOL for type of bool" >&5 +echo "$as_me: WARNING: Assuming $NCURSES_BOOL for type of bool" >&2;} + cf_cv_type_of_bool=$NCURSES_BOOL +fi + +echo "$as_me:26993: checking for special defines needed for etip.h" >&5 +echo $ECHO_N "checking for special defines needed for etip.h... $ECHO_C" >&6 +cf_save_CXXFLAGS="$CXXFLAGS" +cf_result="none" + +# etip.h includes ncurses.h which includes ncurses_dll.h +# But ncurses_dll.h is generated - fix here. +test -d include || mkdir include +test -f include/ncurses_dll.h || sed -e 's/@NCURSES_WRAP_PREFIX@/'$NCURSES_WRAP_PREFIX'/g' "${srcdir}/include/ncurses_dll.h.in" >include/ncurses_dll.h + +for cf_math in "" MATH_H +do +for cf_excp in "" MATH_EXCEPTION +do + CXXFLAGS="$cf_save_CXXFLAGS -I${srcdir}/c++ -I${srcdir}/menu -Iinclude -I${srcdir}/include" + test -n "$cf_math" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_math}" + test -n "$cf_excp" && CXXFLAGS="$CXXFLAGS -DETIP_NEEDS_${cf_excp}" +cat >"conftest.$ac_ext" <<_ACEOF +#line 27011 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27025: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27028: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27031: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27034: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$cf_math" && cat >>confdefs.h <>confdefs.h <&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +done +echo "$as_me:27055: result: ${cf_result:-(none)}" >&5 +echo "${ECHO_T}${cf_result:-(none)}" >&6 +CXXFLAGS="$cf_save_CXXFLAGS" + +if test -n "$CXX"; then +echo "$as_me:27060: checking if $CXX accepts override keyword" >&5 +echo $ECHO_N "checking if $CXX accepts override keyword... $ECHO_C" >&6 +if test "${cf_cv_cpp_override+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + + if test "$cross_compiling" = yes; then + cf_cv_cpp_override=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 27077 "configure" +#include "confdefs.h" + +class base +{ +public: + virtual int foo(float x) = 0; +}; + +class derived: public base +{ +public: + int foo(float x) override { return x != 0.0 ? 1 : 0; } +}; + +int main(void) { } + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:27096: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:27099: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:27101: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27104: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_cpp_override=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_cpp_override=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +fi +echo "$as_me:27123: result: $cf_cv_cpp_override" >&5 +echo "${ECHO_T}$cf_cv_cpp_override" >&6 +fi +test "$cf_cv_cpp_override" = yes && +cat >>confdefs.h <<\EOF +#define CPP_HAS_OVERRIDE 1 +EOF + +if test -n "$CXX"; then +echo "$as_me:27132: checking if $CXX accepts parameter initialization" >&5 +echo $ECHO_N "checking if $CXX accepts parameter initialization... $ECHO_C" >&6 +if test "${cf_cv_cpp_param_init+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + + if test "$cross_compiling" = yes; then + cf_cv_cpp_param_init=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 27149 "configure" +#include "confdefs.h" + +class TEST { +private: + int value; +public: + TEST(int x = 1); + ~TEST(); +}; + +TEST::TEST(int x = 1) // some compilers do not like second initializer +{ + value = x; +} +int main(void) { } + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:27168: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:27171: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:27173: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27176: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_cpp_param_init=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_cpp_param_init=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +fi +echo "$as_me:27195: result: $cf_cv_cpp_param_init" >&5 +echo "${ECHO_T}$cf_cv_cpp_param_init" >&6 +fi +test "$cf_cv_cpp_param_init" = yes && +cat >>confdefs.h <<\EOF +#define CPP_HAS_PARAM_INIT 1 +EOF + +if test -n "$CXX"; then + +echo "$as_me:27205: checking if $CXX accepts static_cast" >&5 +echo $ECHO_N "checking if $CXX accepts static_cast... $ECHO_C" >&6 +if test "${cf_cv_cpp_static_cast+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 27219 "configure" +#include "confdefs.h" + +class NCursesPanel +{ +public: + NCursesPanel(int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0) + { + } + NCursesPanel(); + ~NCursesPanel(); +}; + +template class NCursesUserPanel : public NCursesPanel +{ +public: + NCursesUserPanel (int nlines, + int ncols, + int begin_y = 0, + int begin_x = 0, + const T* p_UserData = static_cast(0)) + : NCursesPanel (nlines, ncols, begin_y, begin_x) + { + }; + NCursesUserPanel(const T* p_UserData = static_cast(0)) : NCursesPanel() + { + }; + + virtual ~NCursesUserPanel() {}; +}; + +int +main (void) +{ + + const char* p_UserData = static_cast(0) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27263: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27266: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27269: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27272: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_cpp_static_cast=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_cpp_static_cast=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CXX -o "conftest$ac_exeext" $CXXFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +ac_main_return="return" + +fi +echo "$as_me:27290: result: $cf_cv_cpp_static_cast" >&5 +echo "${ECHO_T}$cf_cv_cpp_static_cast" >&6 + +fi + +test "$cf_cv_cpp_static_cast" = yes && +cat >>confdefs.h <<\EOF +#define CPP_HAS_STATIC_CAST 1 +EOF + + CXX_AR='$(AR)' + CXX_ARFLAGS='$(ARFLAGS)' + case "$cf_cv_system_name" in + (irix*) + if test "$GXX" != yes ; then + CXX_AR='$(CXX)' + CXX_ARFLAGS='-ar -o' + fi + ;; + (sco3.2v5*) + CXXLDFLAGS="-u main" + ;; + (solaris2*) + if test "$GXX" != yes ; then + CXX_AR='$(CXX)' + CXX_ARFLAGS='-xar -o' + fi + ;; + esac + +else + cf_cxx_library=no + cf_cv_builtin_bool=1 + + # Just because we are not configuring against C++ right now does not + # mean that a user will not want to use C++. Some distributors disable + # the C++ portion of this configuration as a shortcut (or just to avoid + # compiling the demo in the c++ directory). So we need a reasonable + # default for the 'bool' type. + # + # Caveat: since the storage of the bool type is not standardized, it + # may change. + + if test "$NCURSES_BOOL" != auto ; then + cf_cv_type_of_bool=$NCURSES_BOOL + cf_cv_header_stdbool_h=0 + else + if test "$cf_cv_header_stdbool_h" = 1 ; then + +echo "$as_me:27339: checking for bool" >&5 +echo $ECHO_N "checking for bool... $ECHO_C" >&6 +if test "${ac_cv_type_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 27345 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +if ((bool *) 0) + return 0; +if (sizeof (bool)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27380: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27383: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27386: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27389: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_bool=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_bool=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:27399: result: $ac_cv_type_bool" >&5 +echo "${ECHO_T}$ac_cv_type_bool" >&6 + +echo "$as_me:27402: checking size of bool" >&5 +echo $ECHO_N "checking size of bool... $ECHO_C" >&6 +if test "${ac_cv_sizeof_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$ac_cv_type_bool" = yes; then + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >"conftest.$ac_ext" <<_ACEOF +#line 27411 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) >= 0)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27443: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27446: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27449: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27452: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 27457 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27489: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27492: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27495: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27498: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=-1 ac_mid=-1 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 27514 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) >= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27546: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27549: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27552: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27555: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"` + cat >"conftest.$ac_ext" <<_ACEOF +#line 27571 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (bool)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:27603: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:27606: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:27609: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27612: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +ac_cv_sizeof_bool=$ac_lo +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:27625: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 27630 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int +main (void) +{ +FILE *f = fopen ("conftest.val", "w"); +if (!f) + $ac_main_return (1); +fprintf (f, "%ld", (long)(sizeof (bool))); +fclose (f); + ; + return 0; +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:27666: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:27669: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:27671: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27674: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sizeof_bool=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_bool=0 +fi +fi +echo "$as_me:27690: result: $ac_cv_sizeof_bool" >&5 +echo "${ECHO_T}$ac_cv_sizeof_bool" >&6 +cat >>confdefs.h <&5 +echo $ECHO_N "checking for type of bool... $ECHO_C" >&6 +if test "${cf_cv_type_of_bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -f cf_test.out + if test "$cross_compiling" = yes; then + + case x$ac_cv_sizeof_bool in + (x1) cf_cv_type_of_bool="unsigned char";; + (x2) cf_cv_type_of_bool="unsigned short";; + (x4) cf_cv_type_of_bool="unsigned int";; + (x8) cf_cv_type_of_bool="unsigned long";; + (*) cf_cv_type_of_bool=unknown;; + esac + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 27715 "configure" +#include "confdefs.h" + +$ac_includes_default + +#if defined(__cplusplus) + +#ifdef HAVE_GXX_BUILTIN_H +#include +#elif HAVE_GPP_BUILTIN_H +#include +#elif HAVE_BUILTIN_H +#include +#endif + +#else + +#if $cf_cv_header_stdbool_h +#include +#endif + +#endif + +int main(void) +{ + FILE *fp = fopen("cf_test.out", "w"); + if (fp != 0) { + bool x = true; + if ((bool)(-x) >= 0) + fputs("unsigned ", fp); + if (sizeof(x) == sizeof(int)) fputs("int", fp); + else if (sizeof(x) == sizeof(char)) fputs("char", fp); + else if (sizeof(x) == sizeof(short))fputs("short",fp); + else if (sizeof(x) == sizeof(long)) fputs("long", fp); + fclose(fp); + } + ${cf_cv_main_return:-return}(0); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:27756: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:27759: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:27761: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:27764: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_type_of_bool=`cat cf_test.out` + if test -z "$cf_cv_type_of_bool"; then + cf_cv_type_of_bool=unknown + fi +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_type_of_bool=unknown +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f cf_test.out + +fi +echo "$as_me:27781: result: $cf_cv_type_of_bool" >&5 +echo "${ECHO_T}$cf_cv_type_of_bool" >&6 + +if test "$cf_cv_type_of_bool" = unknown ; then + case .$NCURSES_BOOL in + (.auto|.) NCURSES_BOOL=unsigned;; + esac + { echo "$as_me:27788: WARNING: Assuming $NCURSES_BOOL for type of bool" >&5 +echo "$as_me: WARNING: Assuming $NCURSES_BOOL for type of bool" >&2;} + cf_cv_type_of_bool=$NCURSES_BOOL +fi + + else + echo "$as_me:27794: checking for fallback type of bool" >&5 +echo $ECHO_N "checking for fallback type of bool... $ECHO_C" >&6 + case "$host_cpu" in + (i?86) cf_cv_type_of_bool=char ;; + (*) cf_cv_type_of_bool=int ;; + esac + echo "$as_me:27800: result: $cf_cv_type_of_bool" >&5 +echo "${ECHO_T}$cf_cv_type_of_bool" >&6 + fi + fi +fi + +# If the C compiler did not declare bool, and we did not determine that the C++ +# compiler does not declare bool, turn on an ifdef in curses.h that makes the +# ncurses library use the same type as C++ bool. Note that this allows one to +# specify the type of bool in a configure-script option and postpone +# integration with the C++ compiler provided that the types are compatible. +USE_CXX_BOOL=1 +if test "$cf_cv_cc_bool_type" = 1 +then + # oops: C has a bool. Unlikely, but C++ could differ. + USE_CXX_BOOL=0 +elif test "$cf_cv_builtin_bool" = 0 +then + # C++ has no bool + USE_CXX_BOOL=0 +else + # this is the normal case + USE_CXX_BOOL='defined(__cplusplus)' +fi + +if test -f "${srcdir}/Ada95/Makefile.in" ; then + + if test "$cf_with_ada" != "no" ; then + if test "$with_libtool" != "no"; then + { echo "$as_me:27829: WARNING: libtool does not support Ada - disabling feature" >&5 +echo "$as_me: WARNING: libtool does not support Ada - disabling feature" >&2;} + cf_with_ada=no + fi + fi + + if test "$cf_with_ada" != "no" ; then + if test "x$cf_cv_prog_gnat_correct" = xyes; then + + ADAFLAGS="$ADAFLAGS -gnatpn" + + echo "$as_me:27840: checking optimization options for ADAFLAGS" >&5 +echo $ECHO_N "checking optimization options for ADAFLAGS... $ECHO_C" >&6 + case "$CFLAGS" in + (*-g*) + + ADAFLAGS="$ADAFLAGS -g" + + ;; + esac + case "$CFLAGS" in + (*-O*) + cf_O_flag=`echo "$CFLAGS" |sed -e 's/^.*-O/-O/' -e 's/[ ].*//'` + + ADAFLAGS="$ADAFLAGS $cf_O_flag" + + ;; + esac + echo "$as_me:27857: result: $ADAFLAGS" >&5 +echo "${ECHO_T}$ADAFLAGS" >&6 + +echo "$as_me:27860: checking if GNATPREP supports -T option" >&5 +echo $ECHO_N "checking if GNATPREP supports -T option... $ECHO_C" >&6 +if test "${cf_cv_gnatprep_opt_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_gnatprep_opt_t=no +gnatprep -T 2>/dev/null >/dev/null && cf_cv_gnatprep_opt_t=yes + +fi +echo "$as_me:27870: result: $cf_cv_gnatprep_opt_t" >&5 +echo "${ECHO_T}$cf_cv_gnatprep_opt_t" >&6 +test "$cf_cv_gnatprep_opt_t" = yes && GNATPREP_OPTS="-T $GNATPREP_OPTS" + +echo "$as_me:27874: checking if GNAT supports generics" >&5 +echo $ECHO_N "checking if GNAT supports generics... $ECHO_C" >&6 +case "$cf_cv_gnat_version" in +(3.1[1-9]*|3.[2-9]*|[4-9].*|[1-9][0-9].[0-9]*|20[0-9][0-9]) + cf_gnat_generics=yes + ;; +(*) + cf_gnat_generics=no + ;; +esac +echo "$as_me:27884: result: $cf_gnat_generics" >&5 +echo "${ECHO_T}$cf_gnat_generics" >&6 + +if test "$cf_gnat_generics" = yes +then + cf_compile_generics=generics + cf_generic_objects="\${GENOBJS}" +else + cf_compile_generics= + cf_generic_objects= +fi + +echo "$as_me:27896: checking if GNAT supports SIGINT" >&5 +echo $ECHO_N "checking if GNAT supports SIGINT... $ECHO_C" >&6 +if test "${cf_cv_gnat_sigint+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +rm -rf ./conftest* ./*~conftest* +cat >>conftest.ads <>conftest.adb <&5 2>&1 ) ; then + cf_cv_gnat_sigint=yes +else + cf_cv_gnat_sigint=no +fi +rm -rf ./conftest* ./*~conftest* + +fi +echo "$as_me:27944: result: $cf_cv_gnat_sigint" >&5 +echo "${ECHO_T}$cf_cv_gnat_sigint" >&6 + +if test "$cf_cv_gnat_sigint" = yes ; then + USE_GNAT_SIGINT="" +else + USE_GNAT_SIGINT="#" +fi + +cf_gnat_libraries=no +cf_gnat_projects=no + +if test "$enable_gnat_projects" != no ; then +echo "$as_me:27957: checking if GNAT supports project files" >&5 +echo $ECHO_N "checking if GNAT supports project files... $ECHO_C" >&6 +case "$cf_cv_gnat_version" in +(3.[0-9]*) + ;; +(*) + case "$cf_cv_system_name" in + (cygwin*|msys*) + ;; + (*) + rm -rf ./conftest* ./*~conftest* + if mkdir conftest.src conftest.bin conftest.lib + then + cd conftest.src + rm -rf ./conftest* ./*~conftest* + cat >>library.gpr <>confpackage.ads <>confpackage.adb <&5 2>&1 ) ; then + cf_gnat_projects=yes + fi + cd .. + fi + if test -f conftest.lib/confpackage.ali + then + cf_gnat_libraries=yes + fi + rm -rf ./conftest* ./*~conftest* + ;; + esac + ;; +esac +echo "$as_me:28020: result: $cf_gnat_projects" >&5 +echo "${ECHO_T}$cf_gnat_projects" >&6 +fi # enable_gnat_projects + +if test "$cf_gnat_projects" = yes +then + echo "$as_me:28026: checking if GNAT supports libraries" >&5 +echo $ECHO_N "checking if GNAT supports libraries... $ECHO_C" >&6 + echo "$as_me:28028: result: $cf_gnat_libraries" >&5 +echo "${ECHO_T}$cf_gnat_libraries" >&6 +fi + +USE_OLD_MAKERULES="" +USE_GNAT_PROJECTS="#" +USE_GNAT_MAKE_GPR="#" +USE_GNAT_GPRBUILD="#" + +if test "$cf_gnat_projects" = yes +then + USE_OLD_MAKERULES="#" + USE_GNAT_PROJECTS="" + if test "$cf_cv_VERSION_GPRBUILD" != no + then + USE_GNAT_GPRBUILD="" + elif test "$cf_cv_VERSION_GNATMAKE" != no + then + USE_GNAT_MAKE_GPR="" + else + { echo "$as_me:28048: WARNING: use old makefile rules since tools are missing" >&5 +echo "$as_me: WARNING: use old makefile rules since tools are missing" >&2;} + fi +fi + +if test "$cf_gnat_libraries" = yes +then + USE_GNAT_LIBRARIES="" +else + USE_GNAT_LIBRARIES="#" +fi + +echo "$as_me:28060: checking for Ada95 compiler" >&5 +echo $ECHO_N "checking for Ada95 compiler... $ECHO_C" >&6 + +# Check whether --with-ada-compiler or --without-ada-compiler was given. +if test "${with_ada_compiler+set}" = set; then + withval="$with_ada_compiler" + cf_ada_compiler=$withval +else + cf_ada_compiler=gnatmake +fi; + +echo "$as_me:28071: result: $cf_ada_compiler" >&5 +echo "${ECHO_T}$cf_ada_compiler" >&6 + + cf_ada_package=terminal_interface + +echo "$as_me:28076: checking for Ada95 include directory" >&5 +echo $ECHO_N "checking for Ada95 include directory... $ECHO_C" >&6 + +# Check whether --with-ada-include or --without-ada-include was given. +if test "${with_ada_include+set}" = set; then + withval="$with_ada_include" + +else + withval="${ADA_INCLUDE:-$prefix/share/ada/adainclude}" +fi; if test -n "$prefix/share/ada/adainclude" ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:28110: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +eval ADA_INCLUDE="$withval" + +echo "$as_me:28119: result: $ADA_INCLUDE" >&5 +echo "${ECHO_T}$ADA_INCLUDE" >&6 + +echo "$as_me:28122: checking for Ada95 object directory" >&5 +echo $ECHO_N "checking for Ada95 object directory... $ECHO_C" >&6 + +# Check whether --with-ada-objects or --without-ada-objects was given. +if test "${with_ada_objects+set}" = set; then + withval="$with_ada_objects" + +else + withval="${ADA_OBJECTS:-$prefix/lib/ada/adalib}" +fi; if test -n "$prefix/lib/ada/adalib" ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:28156: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +eval ADA_OBJECTS="$withval" + +echo "$as_me:28165: result: $ADA_OBJECTS" >&5 +echo "${ECHO_T}$ADA_OBJECTS" >&6 + +echo "$as_me:28168: checking whether to build an Ada95 shared library" >&5 +echo $ECHO_N "checking whether to build an Ada95 shared library... $ECHO_C" >&6 + +# Check whether --with-ada-sharedlib or --without-ada-sharedlib was given. +if test "${with_ada_sharedlib+set}" = set; then + withval="$with_ada_sharedlib" + with_ada_sharedlib=$withval +else + with_ada_sharedlib=no +fi; +cf_ada_sharedlib_warn=no + +if test "x$with_ada_sharedlib" != xno +then + if test "x$cf_gnat_projects" != xyes + then + with_ada_sharedlib=no + cf_ada_sharedlib_warn=yes + fi +fi + +echo "$as_me:28189: result: $with_ada_sharedlib" >&5 +echo "${ECHO_T}$with_ada_sharedlib" >&6 +if test "x$cf_ada_sharedlib_warn" != xno +then + { echo "$as_me:28193: WARNING: disabling Ada95 shared library since GNAT projects are not supported" >&5 +echo "$as_me: WARNING: disabling Ada95 shared library since GNAT projects are not supported" >&2;} +fi + +ADA_SHAREDLIB='lib$(LIB_NAME).so.1' +MAKE_ADA_SHAREDLIB="#" + +if test "x$with_ada_sharedlib" != xno +then + MAKE_ADA_SHAREDLIB= + if test "x$with_ada_sharedlib" != xyes + then + ADA_SHAREDLIB="$with_ada_sharedlib" + fi +fi + + # allow the Ada binding to be renamed + +echo "$as_me:28211: checking for Ada95 curses library name" >&5 +echo $ECHO_N "checking for Ada95 curses library name... $ECHO_C" >&6 + +# Check whether --with-ada-libname or --without-ada-libname was given. +if test "${with_ada_libname+set}" = set; then + withval="$with_ada_libname" + ADA_LIBNAME=$withval +else + ADA_LIBNAME=AdaCurses +fi; +case "x$ADA_LIBNAME" in +(x|xyes|xno) + ADA_LIBNAME=AdaCurses + ;; +esac + +echo "$as_me:28227: result: $ADA_LIBNAME" >&5 +echo "${ECHO_T}$ADA_LIBNAME" >&6 + + fi + fi +else + cf_with_ada=no +fi + +# do this "late" to avoid conflict with header-checks +if test "x$with_widec" = xyes ; then + echo "$as_me:28238: checking for wchar_t" >&5 +echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6 +if test "${ac_cv_type_wchar_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 28244 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((wchar_t *) 0) + return 0; +if (sizeof (wchar_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:28259: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:28262: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:28265: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:28268: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_type_wchar_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_type_wchar_t=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:28278: result: $ac_cv_type_wchar_t" >&5 +echo "${ECHO_T}$ac_cv_type_wchar_t" >&6 + +echo "$as_me:28281: checking size of wchar_t" >&5 +echo $ECHO_N "checking size of wchar_t... $ECHO_C" >&6 +if test "${ac_cv_sizeof_wchar_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$ac_cv_type_wchar_t" = yes; then + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >"conftest.$ac_ext" <<_ACEOF +#line 28290 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (wchar_t)) >= 0)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:28302: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:28305: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:28308: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:28311: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=0 ac_mid=0 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 28316 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (wchar_t)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:28328: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:28331: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:28334: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:28337: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1`; ac_mid=`expr 2 '*' "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=-1 ac_mid=-1 + while :; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 28353 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (wchar_t)) >= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:28365: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:28368: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:28371: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:28374: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_lo=$ac_mid; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_hi=`expr "$ac_mid" - 1`; ac_mid=`expr 2 '*' "$ac_mid"` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' "$ac_hi" - "$ac_lo" ')' / 2 + "$ac_lo"` + cat >"conftest.$ac_ext" <<_ACEOF +#line 28390 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +int _array_ [1 - 2 * !((sizeof (wchar_t)) <= $ac_mid)] + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:28402: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:28405: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:28408: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:28411: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_hi=$ac_mid +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_lo=`expr "$ac_mid" + 1` +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +ac_cv_sizeof_wchar_t=$ac_lo +else + if test "$cross_compiling" = yes; then + { { echo "$as_me:28424: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 28429 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +FILE *f = fopen ("conftest.val", "w"); +if (!f) + $ac_main_return (1); +fprintf (f, "%ld", (long)(sizeof (wchar_t))); +fclose (f); + ; + return 0; +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:28445: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:28448: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:28450: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:28453: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_sizeof_wchar_t=`cat conftest.val` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +rm -f conftest.val +else + ac_cv_sizeof_wchar_t=0 +fi +fi +echo "$as_me:28469: result: $ac_cv_sizeof_wchar_t" >&5 +echo "${ECHO_T}$ac_cv_sizeof_wchar_t" >&6 +cat >>confdefs.h <&6 + +echo "${as_me:-configure}:28482: testing test failed (assume 2) ..." 1>&5 + + sed /SIZEOF_WCHAR_T/d confdefs.h >confdefs.tmp + mv confdefs.tmp confdefs.h + echo "#define SIZEOF_WCHAR_T 2" >>confdefs.h + fi +fi + +### Construct the ncurses library-subsets, if any, from this set of keywords: +### none, base, ext_funcs, ext_tinfo, ticlib, termlib, widechar +### +### ticlib modules may be a separate library, otherwise contained in termlib. +### termlib modules may be a separate library, otherwise contained in ncurses. +### +### The of "+" or " " between the tokens controls the way the script +### chooses to split module lists into libraries. +### +### (see CF_LIB_RULES). +echo "$as_me:28500: checking for library subsets" >&5 +echo $ECHO_N "checking for library subsets... $ECHO_C" >&6 +LIB_SUBSETS= + +if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then + LIB_SUBSETS="${LIB_SUBSETS}ticlib" + if test "$with_ticlib" != no ; then + LIB_SUBSETS="${LIB_SUBSETS} " + else + LIB_SUBSETS="${LIB_SUBSETS}+" + fi +fi + +LIB_SUBSETS="${LIB_SUBSETS}termlib" +test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo" + +if test "$with_termlib" != no ; then + LIB_SUBSETS="${LIB_SUBSETS} " +else + LIB_SUBSETS="${LIB_SUBSETS}+" +fi + +LIB_SUBSETS="${LIB_SUBSETS}base" + +# Most term-driver calls are to tinfo, but some like init_pair are to the +# base library (so it resides in base). +if test "$with_term_driver" != no ; then + LIB_SUBSETS="${LIB_SUBSETS}+port_drivers" + case "$cf_cv_system_name" in + (*mingw32*|*mingw64*|*msys*|*cygwin*) + if test "x$with_exp_win32" = xyes ; then + LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32" + else + LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con" + fi + CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER" + ;; + (*) + LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo" + ;; + esac +elif test "x$with_exp_win32" = xyes ; then + case "$cf_cv_system_name" in + (*mingw32*|*mingw64*) + LIB_SUBSETS="${LIB_SUBSETS}+port_win32" + ;; + (*) + ;; + esac +fi + +test "x$with_widec" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar" +test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs" + +echo "$as_me:28554: result: $LIB_SUBSETS" >&5 +echo "${ECHO_T}$LIB_SUBSETS" >&6 + +### Construct the list of include-directories to be generated + +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir}/../include $CPPFLAGS" +fi +CPPFLAGS="-I../include $CPPFLAGS" +if test "$srcdir" != "."; then + CPPFLAGS="-I\${srcdir} $CPPFLAGS" +fi +CPPFLAGS="-I. $CPPFLAGS" + +ACPPFLAGS="-I. -I../include -I../../include $ACPPFLAGS" +if test "$srcdir" != "."; then + ACPPFLAGS="-I\${srcdir}/../../include $ACPPFLAGS" +fi +if test "$GCC" != yes; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" +elif test "$includedir" != "/usr/include"; then + if test "$includedir" = '${prefix}/include' ; then + if test x$prefix != x/usr ; then + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi + else + ACPPFLAGS="$ACPPFLAGS -I\${includedir}" + fi +fi + +### Build up pieces for makefile rules +echo "$as_me:28585: checking default library suffix" >&5 +echo $ECHO_N "checking default library suffix... $ECHO_C" >&6 + + case $DFT_LWR_MODEL in + (libtool) DFT_ARG_SUFFIX='' ;; + (normal) DFT_ARG_SUFFIX='' ;; + (debug) DFT_ARG_SUFFIX='_g' ;; + (profile) DFT_ARG_SUFFIX='_p' ;; + (shared) DFT_ARG_SUFFIX='' ;; + esac + test -n "$LIB_SUFFIX" && DFT_ARG_SUFFIX="${LIB_SUFFIX}${DFT_ARG_SUFFIX}" +echo "$as_me:28596: result: $DFT_ARG_SUFFIX" >&5 +echo "${ECHO_T}$DFT_ARG_SUFFIX" >&6 + +echo "$as_me:28599: checking default library-dependency suffix" >&5 +echo $ECHO_N "checking default library-dependency suffix... $ECHO_C" >&6 + + case X$DFT_LWR_MODEL in + (Xlibtool) + DFT_LIB_SUFFIX='.la' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + DFT_LIB_SUFFIX='_g.lib' + ;; + (*) + DFT_LIB_SUFFIX='_g.a' + ;; + esac + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + DFT_LIB_SUFFIX='_p.lib' + ;; + (*) + DFT_LIB_SUFFIX='_p.a' + ;; + esac + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[5-7]*) + DFT_LIB_SUFFIX='.so' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (*-msvc*) + DFT_LIB_SUFFIX='.dll' + DFT_DEP_SUFFIX='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + DFT_LIB_SUFFIX='.dll' + DFT_DEP_SUFFIX='.dll.a' + ;; + (darwin*) + DFT_LIB_SUFFIX='.dylib' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (hpux*) + case "$target" in + (ia64*) + DFT_LIB_SUFFIX='.so' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + (*) + DFT_LIB_SUFFIX='.sl' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + esac + ;; + (*) + DFT_LIB_SUFFIX='.so' + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + DFT_LIB_SUFFIX='.lib' + ;; + (*) + DFT_LIB_SUFFIX='.a' + ;; + esac + DFT_DEP_SUFFIX=$DFT_LIB_SUFFIX + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + DFT_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_LIB_SUFFIX}" + DFT_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${DFT_DEP_SUFFIX}" + fi +echo "$as_me:28682: result: $DFT_DEP_SUFFIX" >&5 +echo "${ECHO_T}$DFT_DEP_SUFFIX" >&6 + +echo "$as_me:28685: checking default object directory" >&5 +echo $ECHO_N "checking default object directory... $ECHO_C" >&6 + + case $DFT_LWR_MODEL in + (libtool) DFT_OBJ_SUBDIR='obj_lo' ;; + (normal) DFT_OBJ_SUBDIR='objects' ;; + (debug) DFT_OBJ_SUBDIR='obj_g' ;; + (profile) DFT_OBJ_SUBDIR='obj_p' ;; + (shared) + case "$cf_cv_system_name" in + (cygwin|msys) + DFT_OBJ_SUBDIR='objects' ;; + (*) + DFT_OBJ_SUBDIR='obj_s' ;; + esac + esac +echo "$as_me:28701: result: $DFT_OBJ_SUBDIR" >&5 +echo "${ECHO_T}$DFT_OBJ_SUBDIR" >&6 + +if test "x$cf_with_cxx" = xyes ; then +echo "$as_me:28705: checking c++ library-dependency suffix" >&5 +echo $ECHO_N "checking c++ library-dependency suffix... $ECHO_C" >&6 +if test "$with_libtool" != "no"; then + # libtool thinks it can make c++ shared libraries (perhaps only g++) + CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX +elif test "$with_shared_cxx" != "no"; then + # also for g++ users... + CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX +else + # we normally make a static library because C/C++ library rules differ + + case Xnormal in + (Xlibtool) + CXX_LIB_SUFFIX='.la' + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + CXX_LIB_SUFFIX='_g.lib' + ;; + (*) + CXX_LIB_SUFFIX='_g.a' + ;; + esac + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + CXX_LIB_SUFFIX='_p.lib' + ;; + (*) + CXX_LIB_SUFFIX='_p.a' + ;; + esac + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[5-7]*) + CXX_LIB_SUFFIX='.so' + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + (*-msvc*) + CXX_LIB_SUFFIX='.dll' + CXX_DEP_SUFFIX='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + CXX_LIB_SUFFIX='.dll' + CXX_DEP_SUFFIX='.dll.a' + ;; + (darwin*) + CXX_LIB_SUFFIX='.dylib' + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + (hpux*) + case "$target" in + (ia64*) + CXX_LIB_SUFFIX='.so' + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + (*) + CXX_LIB_SUFFIX='.sl' + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + esac + ;; + (*) + CXX_LIB_SUFFIX='.so' + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + CXX_LIB_SUFFIX='.lib' + ;; + (*) + CXX_LIB_SUFFIX='.a' + ;; + esac + CXX_DEP_SUFFIX=$CXX_LIB_SUFFIX + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + CXX_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${CXX_LIB_SUFFIX}" + CXX_DEP_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}${CXX_DEP_SUFFIX}" + fi + +fi +echo "$as_me:28798: result: $CXX_LIB_SUFFIX" >&5 +echo "${ECHO_T}$CXX_LIB_SUFFIX" >&6 + +fi + +# do not want -ldl in build except as needed for -lncurses dependency +if test "x$with_dlsym" = xyes ; then +if test "$DFT_LWR_MODEL" = shared || \ + test "$DFT_LWR_MODEL" = libtool ; then + +# remove dl library from $LIBS +LIBS=`echo "$LIBS" | sed -e 's/-ldl[ ]//g' -e 's/-ldl$//'` + +fi +fi +### Set up low-level terminfo dependencies for makefiles. + +# TICS_LIST and TINFO_LIST are needed to build libtic.so and libterm.so, but +# do not need libdl +TICS_LIST= +if test "x$with_dlsym" = xyes ; then + +# remove dl library from $SHLIB_LIST +TINFO_LIST=`echo "$SHLIB_LIST" | sed -e 's/-ldl[ ]//g' -e 's/-ldl$//'` + +fi + +USE_ARG_SUFFIX="${DFT_ARG_SUFFIX}${EXTRA_SUFFIX}" +USE_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}" +USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}${cf_cv_abi_version} +if test -n "$EXTRA_SUFFIX" && test "x$EXTRA_SUFFIX" != "x${cf_cv_abi_version}" +then + USE_CFG_SUFFIX="${USE_CFG_SUFFIX}${EXTRA_SUFFIX}" +fi + +if test "$with_ticlib" != no ; then + + if test "x$with_ticlib" != xyes ; then + TICS_NAME=$with_ticlib + TICS_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`" + TICS_ARG_SUFFIX="${with_ticlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TICS_DEP_SUFFIX="${with_ticlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TICS_LIB_SUFFIX="${with_ticlib}" + else + TICS_SUFFIX=${DFT_LIB_SUFFIX} + TICS_ARG_SUFFIX="${TICS_NAME}${USE_ARG_SUFFIX}" + TICS_DEP_SUFFIX="${TICS_NAME}${DFT_DEP_SUFFIX}" + TICS_LIB_SUFFIX="${TICS_NAME}${USE_LIB_SUFFIX}" + fi + TICS_LDFLAGS="-L${LIB_DIR}" + TICS_LIBS="-l${TICS_ARG_SUFFIX}" +else + TICS_SUFFIX=${DFT_LIB_SUFFIX} + TICS_LDFLAGS="-L${LIB_DIR}" + TICS_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}" +fi + +if test "$with_termlib" != no ; then + + if test "x$with_termlib" != xyes ; then + TINFO_NAME=$with_termlib + TINFO_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`" + TINFO_ARG_SUFFIX="${with_termlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TINFO_DEP_SUFFIX="${with_termlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TINFO_LIB_SUFFIX="${with_termlib}" + else + TINFO_SUFFIX=${DFT_LIB_SUFFIX} + TINFO_ARG_SUFFIX="${TINFO_NAME}${USE_ARG_SUFFIX}" + TINFO_DEP_SUFFIX="${TINFO_NAME}${DFT_DEP_SUFFIX}" + TINFO_LIB_SUFFIX="${TINFO_NAME}${USE_LIB_SUFFIX}" + fi + + TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}" + TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}" + if test "$DFT_LWR_MODEL" = "libtool"; then + TEST_ARGS="${TEST_DEPS}" + TEST_ARG2="${TEST_DEP2}" + TINFO_LDFLAGS="-L${LIB_DIR}" + TINFO_LIBS="$TEST_ARGS" + TICS_LIST="$SHLIB_LIST $TEST_ARGS" + SHLIB_LIST="${SHLIB_LIST} $TEST_ARGS" + else + TEST_ARGS="-l${TINFO_ARG_SUFFIX}" + TEST_ARG2="-l${TINFO_ARG_SUFFIX}" + if test "x$with_term_driver" != xno ; then + TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}" + TICS_LIBS="$TICS_LIBS -l${LIB_NAME}${USE_ARG_SUFFIX}" + TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS" + else + TICS_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}" + TINFO_LIBS="$TEST_ARGS" + fi + TINFO_LDFLAGS="-L${LIB_DIR}" + SHLIB_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}" + fi +else + # the next lines are needed for linking libtic over libncurses + TINFO_NAME=${LIB_NAME} + TINFO_SUFFIX=${DFT_LIB_SUFFIX} + TINFO_ARG_SUFFIX=${LIB_NAME}${USE_ARG_SUFFIX} + if test "x$with_tic_depends" = xyes ; then + TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}" + else + TICS_LIST="$SHLIB_LIST" + fi + + TINFO_LDFLAGS="-L${LIB_DIR}" + TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}" +fi + +if test "$DFT_LWR_MODEL" = shared ; then + case "$cf_cv_system_name" in + (cygwin*|msys*) + # "lib" files have ".dll.a" suffix, "cyg"or "msys-" files have ".dll" + TINFO_SUFFIX=.dll + ;; + esac +fi + +if test "x$with_dlsym" = xyes ; then + +# remove dl library from $TICS_LIST +TICS_LIST=`echo "$TICS_LIST" | sed -e 's/-ldl[ ]//g' -e 's/-ldl$//'` + +fi + +if test "$DFT_LWR_MODEL" = "libtool"; then + OBJEXT=lo +fi + +# needed for Ada95 +TINFO_LDFLAGS2=`echo "$TINFO_LDFLAGS" | sed -e 's,-L\.\./,-L../../,'` + +case "$DFT_LWR_MODEL" in +(normal|debug|profile) + +if test "$GCC" = yes ; then + case "$cf_cv_system_name" in + (OS/2*|os2*|aix[4]*|solaris2.1[0-9]|darwin*) + LDFLAGS_STATIC= + LDFLAGS_SHARED= + ;; + (*) # normally, except when broken + LDFLAGS_STATIC=-static + LDFLAGS_SHARED=-dynamic + ;; + esac +else + case "$cf_cv_system_name" in + (aix[4-7]*) # from ld manpage + LDFLAGS_STATIC=-bstatic + LDFLAGS_SHARED=-bdynamic + ;; + (hpux*) # from ld manpage for hpux10.20, hpux11.11 + # We could also use just "archive" and "shared". + LDFLAGS_STATIC=-Wl,-a,archive_shared + LDFLAGS_SHARED=-Wl,-a,shared_archive + ;; + (irix*) # from ld manpage IRIX64 + LDFLAGS_STATIC=-Bstatic + LDFLAGS_SHARED=-Bdynamic + ;; + (osf[45]*) # from ld manpage osf4.0d, osf5.1 + # alternative "-oldstyle_liblookup" (not in cc manpage) + LDFLAGS_STATIC=-noso + LDFLAGS_SHARED=-so_archive + ;; + (solaris2*) + LDFLAGS_STATIC=-Bstatic + LDFLAGS_SHARED=-Bdynamic + ;; + esac +fi + +if test -n "$LDFLAGS_STATIC" && test -n "$LDFLAGS_SHARED" +then + echo "$as_me:28974: checking if linker supports switching between static/dynamic" >&5 +echo $ECHO_N "checking if linker supports switching between static/dynamic... $ECHO_C" >&6 + + rm -f libconftest.a + cat >conftest.$ac_ext < +int cf_ldflags_static(FILE *fp) { return fflush(fp); } +EOF + if { (eval echo "$as_me:28983: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:28986: \$? = $ac_status" >&5 + (exit "$ac_status"); } ; then + ( $AR $ARFLAGS libconftest.a conftest.o ) 2>&5 1>/dev/null + ( eval $RANLIB libconftest.a ) 2>&5 >/dev/null + fi + rm -f conftest.* + + cf_save_LIBS="$LIBS" + + LIBS="$LDFLAGS_STATIC -L`pwd` -lconftest $LDFLAGS_DYNAMIC $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 28997 "configure" +#include "confdefs.h" + +#line 29000 "configure" +#include +int cf_ldflags_static(FILE *fp); + +int +main (void) +{ + + return cf_ldflags_static(stdin); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:29015: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:29018: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:29021: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:29024: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + # some linkers simply ignore the -dynamic + case x`file "conftest$ac_exeext" 2>/dev/null` in + (*static*) + cf_ldflags_static=no + ;; + (*) + cf_ldflags_static=yes + ;; + esac + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_ldflags_static=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + rm -f libconftest.* + LIBS="$cf_save_LIBS" + + echo "$as_me:29047: result: $cf_ldflags_static" >&5 +echo "${ECHO_T}$cf_ldflags_static" >&6 + + if test "$cf_ldflags_static" != yes + then + LDFLAGS_STATIC= + LDFLAGS_SHARED= + fi +else + LDFLAGS_STATIC= + LDFLAGS_SHARED= +fi + + ;; +esac + +echo "$as_me:29063: checking where we will install curses.h" >&5 +echo $ECHO_N "checking where we will install curses.h... $ECHO_C" >&6 + +includesubdir= +if test "$with_overwrite" = no && \ + { test "x$includedir" = 'x${prefix}/include' || \ + test "x$includedir" = "x${prefix}/include"; } +then + includesubdir="/ncurses${USE_LIB_SUFFIX}" +fi +echo "$as_me:29073: result: ${includedir}${includesubdir}" >&5 +echo "${ECHO_T}${includedir}${includesubdir}" >&6 + +### Resolve a conflict between normal and wide-curses by forcing applications +### that will need libutf8 to add it to their configure script. +if test "$with_overwrite" != no ; then +if test "$NCURSES_LIBUTF8" = 1 ; then + NCURSES_LIBUTF8='defined(HAVE_LIBUTF8_H)' + { echo "$as_me:29081: WARNING: Wide-character applications must define HAVE_LIBUTF8_H to include curses.h" >&5 +echo "$as_me: WARNING: Wide-character applications must define HAVE_LIBUTF8_H to include curses.h" >&2;} +fi +fi +WITH_OVERWRITE=$with_overwrite + +### At least on MinGW a shared library build without libtool +### requires adding the additional libs to the link list. +case "$cf_cv_system_name" in +(*mingw32*|*mingw64*) + if test "$DFT_LWR_MODEL" != "libtool"; then + SHLIB_LIST="$SHLIB_LIST ${LIBS}" + fi + ;; +*) ;; +esac + +### predefined stuff for the test programs + +cat >>confdefs.h <<\EOF +#define HAVE_SLK_COLOR 1 +EOF + +# pkgsrc uses these + +echo "$as_me:29106: checking for desired basename for form library" >&5 +echo $ECHO_N "checking for desired basename for form library... $ECHO_C" >&6 + +# Check whether --with-form-libname or --without-form-libname was given. +if test "${with_form_libname+set}" = set; then + withval="$with_form_libname" + with_lib_basename=$withval +else + with_lib_basename=form +fi; +FORM_NAME="$with_lib_basename" + +case "x$FORM_NAME" in +(x|xno|xnone|xyes) + FORM_NAME=form + ;; +(*) + ;; +esac + +echo "$as_me:29126: result: $FORM_NAME" >&5 +echo "${ECHO_T}$FORM_NAME" >&6 + +echo "$as_me:29129: checking for desired basename for menu library" >&5 +echo $ECHO_N "checking for desired basename for menu library... $ECHO_C" >&6 + +# Check whether --with-menu-libname or --without-menu-libname was given. +if test "${with_menu_libname+set}" = set; then + withval="$with_menu_libname" + with_lib_basename=$withval +else + with_lib_basename=menu +fi; +MENU_NAME="$with_lib_basename" + +case "x$MENU_NAME" in +(x|xno|xnone|xyes) + MENU_NAME=menu + ;; +(*) + ;; +esac + +echo "$as_me:29149: result: $MENU_NAME" >&5 +echo "${ECHO_T}$MENU_NAME" >&6 + +echo "$as_me:29152: checking for desired basename for panel library" >&5 +echo $ECHO_N "checking for desired basename for panel library... $ECHO_C" >&6 + +# Check whether --with-panel-libname or --without-panel-libname was given. +if test "${with_panel_libname+set}" = set; then + withval="$with_panel_libname" + with_lib_basename=$withval +else + with_lib_basename=panel +fi; +PANEL_NAME="$with_lib_basename" + +case "x$PANEL_NAME" in +(x|xno|xnone|xyes) + PANEL_NAME=panel + ;; +(*) + ;; +esac + +echo "$as_me:29172: result: $PANEL_NAME" >&5 +echo "${ECHO_T}$PANEL_NAME" >&6 + +echo "$as_me:29175: checking for desired basename for cxx library" >&5 +echo $ECHO_N "checking for desired basename for cxx library... $ECHO_C" >&6 + +# Check whether --with-cxx-libname or --without-cxx-libname was given. +if test "${with_cxx_libname+set}" = set; then + withval="$with_cxx_libname" + with_lib_basename=$withval +else + with_lib_basename=ncurses++ +fi; +CXX_NAME="$with_lib_basename" + +case "x$CXX_NAME" in +(x|xno|xnone|xyes) + CXX_NAME=ncurses++ + ;; +(*) + ;; +esac + +echo "$as_me:29195: result: $CXX_NAME" >&5 +echo "${ECHO_T}$CXX_NAME" >&6 + +### Construct the list of subdirectories for which we'll customize makefiles +### with the appropriate compile-rules. + +echo "$as_me:29201: checking for src modules" >&5 +echo $ECHO_N "checking for src modules... $ECHO_C" >&6 + +# dependencies and linker-arguments for test-programs +TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEPS" +TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${LIB_NAME}${DFT_DEP_SUFFIX} $TEST_DEP2" +if test "$DFT_LWR_MODEL" = "libtool"; then + TEST_ARGS="${TEST_DEPS}" + TEST_ARG2="${TEST_DEP2}" +else + TEST_ARGS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS" + TEST_ARG2="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARG2" +fi + +PC_MODULES_TO_MAKE="ncurses${USE_ARG_SUFFIX}" +cf_cv_src_modules= +for cf_dir in $modules_to_build +do + if test -f "$srcdir/$cf_dir/modules" ; then + + if test -z "$cf_cv_src_modules"; then + cf_cv_src_modules=$cf_dir + else + cf_cv_src_modules="$cf_cv_src_modules $cf_dir" + fi + + # Make the ncurses_cfg.h file record the library interface files as + # well. These are header files that are the same name as their + # directory. Ncurses is the only library that does not follow + # that pattern. + if test -f "$srcdir/${cf_dir}/${cf_dir}.h" ; then + +cf_have_include=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <>confdefs.h <&5 +echo "${ECHO_T}$cf_cv_src_modules" >&6 + +TEST_ARGS="-L${LIB_DIR} $TEST_ARGS" +TEST_ARG2="-L${LIB_2ND} $TEST_ARG2" + +SRC_SUBDIRS= +if test "x$cf_with_manpages" != xno ; then + SRC_SUBDIRS="$SRC_SUBDIRS man" +fi +SRC_SUBDIRS="$SRC_SUBDIRS include" +for cf_dir in $cf_cv_src_modules +do + SRC_SUBDIRS="$SRC_SUBDIRS $cf_dir" +done +if test "x$cf_with_tests" != "xno" ; then + SRC_SUBDIRS="$SRC_SUBDIRS test" +fi +# always make this, to install the ncurses-config script +SRC_SUBDIRS="$SRC_SUBDIRS misc" +if test "$cf_with_cxx_binding" != no; then + PC_MODULES_TO_MAKE="${PC_MODULES_TO_MAKE} ncurses++${USE_ARG_SUFFIX}" + SRC_SUBDIRS="$SRC_SUBDIRS c++" +fi + +test "x$with_termlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TINFO_ARG_SUFFIX" +test "x$with_ticlib" != xno && PC_MODULES_TO_MAKE="$PC_MODULES_TO_MAKE $TICS_ARG_SUFFIX" + +ADA_SUBDIRS= +if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = xyes && test -f "$srcdir/Ada95/Makefile.in" ; then + SRC_SUBDIRS="$SRC_SUBDIRS Ada95" + ADA_SUBDIRS="gen src" + if test "x$cf_with_tests" != "xno" ; then + ADA_SUBDIRS="$ADA_SUBDIRS samples" + fi +fi + +SUB_MAKEFILES= +for cf_dir in $SRC_SUBDIRS +do + SUB_MAKEFILES="$SUB_MAKEFILES $cf_dir/Makefile" +done + +if test -n "$ADA_SUBDIRS"; then + for cf_dir in $ADA_SUBDIRS + do + SUB_MAKEFILES="$SUB_MAKEFILES Ada95/$cf_dir/Makefile" + done + +fi + +if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then + SUB_MAKEFILES="$SUB_MAKEFILES Ada95/src/library.gpr:Ada95/src/library.gpr.in" + SUB_MAKEFILES="$SUB_MAKEFILES Ada95/gen/adacurses${USE_CFG_SUFFIX}-config:Ada95/gen/adacurses-config.in" + SUB_MAKEFILES="$SUB_MAKEFILES man/adacurses${USE_CFG_SUFFIX}-config.1:man/MKada_config.in" +fi + +DIRS_TO_MAKE="lib" +for cf_item in $cf_list_models +do + + case $cf_item in + (libtool) cf_subdir='obj_lo' ;; + (normal) cf_subdir='objects' ;; + (debug) cf_subdir='obj_g' ;; + (profile) cf_subdir='obj_p' ;; + (shared) + case "$cf_cv_system_name" in + (cygwin|msys) + cf_subdir='objects' ;; + (*) + cf_subdir='obj_s' ;; + esac + esac + + for cf_item2 in $DIRS_TO_MAKE + do + test "$cf_item2" = "$cf_subdir" && break + done + test ".$cf_item2" != ".$cf_subdir" && DIRS_TO_MAKE="$DIRS_TO_MAKE $cf_subdir" +done +for cf_dir in $DIRS_TO_MAKE +do + test ! -d "$cf_dir" && mkdir "$cf_dir" +done + +# symbols that differ when compiling Ada95 by itself. +NCURSES_SHLIB2=$SHELL' $(top_srcdir)/misc/shlib' + +# values to use as strings + +cat >>confdefs.h <>confdefs.h <&6 + +echo "${as_me:-configure}:29421: testing moving _XOPEN_SOURCE_EXTENDED to work around g++ problem ..." 1>&5 + + CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED" + CPPFLAGS=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/-D_XOPEN_SOURCE_EXTENDED//'` + ;; + esac + ;; +esac + +# Help to automatically enable the extended curses features when using either +# the *-config or the ".pc" files by adding defines. +echo "$as_me:29432: checking for defines to add to ncurses${USE_CFG_SUFFIX}${cf_config_suffix}-config script" >&5 +echo $ECHO_N "checking for defines to add to ncurses${USE_CFG_SUFFIX}${cf_config_suffix}-config script... $ECHO_C" >&6 +PKG_CFLAGS= +for cf_loop1 in $CPPFLAGS_after_XOPEN +do + cf_found=no + for cf_loop2 in $CPPFLAGS_before_XOPEN + do + if test "x$cf_loop1" = "x$cf_loop2" + then + cf_found=yes + break + fi + done + test "$cf_found" = no && PKG_CFLAGS="$PKG_CFLAGS $cf_loop1" +done +echo "$as_me:29448: result: $PKG_CFLAGS" >&5 +echo "${ECHO_T}$PKG_CFLAGS" >&6 + +case "$cf_cv_system_name" in +(cygwin*|msys*|mingw32*|mingw64|os2*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER='[a-zA-Z]:[\\/]*' + ;; +(*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER=$GLOB_FULLPATH_POSIX + ;; +esac + +# AC_CHECK_SIZEOF demands a literal parameter, no variables. So we do this. +case "x$NCURSES_OSPEED" in +(*short*) + cf_compatible=1 + ;; +(*) + cf_compatible=0 + ;; +esac + +cat >>confdefs.h <&6 + +echo "${as_me:-configure}:29520: testing will map symbols to ABI=$cf_cv_abi_default ..." 1>&5 + +fi + +if test "x$WILDCARD_SYMS" = xno +then + cf_filter_syms=yes +fi + +test "x$cf_with_trace" = xyes && NCURSES_INLINE= + +UNALTERED_SYMS=`echo "$RESULTING_SYMS" | sed -e 's/\\$/\\\\$/g'` +if test "$cf_filter_syms" = yes +then + RESULTING_SYMS=resulting.map +fi + +if test "x$cross_compiling" = xyes ; then + ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)' + CHECK_BUILD="#" +else + ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)' + CHECK_BUILD= +fi + +# This is used for the *-config script and *.pc data files. + +echo "$as_me:29547: checking for linker search path" >&5 +echo $ECHO_N "checking for linker search path... $ECHO_C" >&6 +if test "${cf_cv_ld_searchpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" != yes ; then + +# GNU binutils' ld does not involve permissions which may stop ldconfig. +cf_pathlist=`${LD:-ld} --verbose 2>/dev/null | grep SEARCH_DIR | sed -e 's,SEARCH_DIR[("=][("=]*,,g' -e 's/"[)];//gp' | sort -u` + +# The -NX options tell newer versions of Linux ldconfig to not attempt to +# update the cache, which makes it run faster. +test -z "$cf_pathlist" && \ + cf_pathlist=`(ldconfig -NX -v) 2>/dev/null | sed -e '/^[ ]/d' -e 's/:$//' | sort -u` + +test -z "$cf_pathlist" && + cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e '/^[ ]/d' -e 's/:$//p' | sort -u` + +# This works with OpenBSD 6.5, which lists only filenames +test -z "$cf_pathlist" && + cf_pathlist=`(ldconfig -v) 2>/dev/null | sed -n -e 's,^Adding \(.*\)/.*$,\1,p' | sort -u` + +if test -z "$cf_pathlist" +then + # dyld default path with MacOS + if test -f /usr/bin/otool && test "x`uname -s`" = xDarwin + then + # do this to bypass check + cf_cv_ld_searchpath='$HOME/lib' + cf_pathlist="/usr/local/lib /lib /usr/lib" + fi +fi + +if test -z "$cf_pathlist" +then + # Solaris is "SunOS" + if test -f /usr/bin/isainfo && test "x`uname -s`" = xSunOS + then + case x`(isainfo -b)` in + (x64) + cf_pathlist="$cf_pathlist /lib/64 /usr/lib/64" + ;; + (x32) + test -d /usr/ccs/lib && cf_pathlist="$cf_pathlist /usr/ccs/lib" + cf_pathlist="$cf_pathlist /lib /usr/lib" + ;; + (*) + { echo "$as_me:29595: WARNING: problem with Solaris architecture" >&5 +echo "$as_me: WARNING: problem with Solaris architecture" >&2;} + ;; + esac + fi +fi + +if test -z "$cf_pathlist" +then + # HP-UX + if test x"`uname -s`" = xHP-UX + then + case x`getconf LONG_BIT` in + (x64) + cf_pathlist="/usr/lib/hpux64" + ;; + (x*) + cf_pathlist="/usr/lib/hpux32" + ;; + esac + fi +fi + +fi + +# If nothing else, assume it is conventional +test -z "$cf_pathlist" && cf_pathlist="/usr/lib /lib" + +# Finally, check that this is only directories +for cf_path in $0 $cf_pathlist +do + if test -d "$cf_path"; then + test -n "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath="${cf_cv_ld_searchpath} " + cf_cv_ld_searchpath="${cf_cv_ld_searchpath}${cf_path}" + fi +done + +# Ensure that it is nonempty +test -z "$cf_cv_ld_searchpath" && cf_cv_ld_searchpath=/usr/lib + +fi +echo "$as_me:29636: result: $cf_cv_ld_searchpath" >&5 +echo "${ECHO_T}$cf_cv_ld_searchpath" >&6 + +LD_SEARCHPATH=`echo "$cf_cv_ld_searchpath"|sed -e 's/ /|/g'` + +ac_config_files="$ac_config_files include/MKterm.h.awk include/curses.head:include/curses.h.in include/ncurses_dll.h include/termcap.h include/unctrl.h man/man_db.renames $SUB_MAKEFILES Makefile" +ac_config_commands="$ac_config_commands default" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +: "${CONFIG_STATUS=./config.status}" +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:29722: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >"$CONFIG_STATUS" <<_ACEOF +#! $SHELL +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +me=\`echo "\$0" | sed -e 's,.*\\/,,'\` + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +ac_cs_invocation="\$0 \$@" + +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS +_ACEOF + +cat >>"$CONFIG_STATUS" <<\_ACEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr="expr" +else + as_expr="false" +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln' +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset="unset" +else + as_unset="false" +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +exec 6>&1 + +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS" +fi + +cat >>"$CONFIG_STATUS" <<\EOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +EOF + +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +EOF +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:29903: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:29922: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +exec 5>>config.log +cat >&5 << _ACEOF + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by $as_me 2.52.20240618, executed with + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + > "$ac_cs_invocation" +on `(hostname || uname -n) 2>/dev/null | sed 1q` + +_ACEOF +EOF + +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "include/MKterm.h.awk" ) CONFIG_FILES="$CONFIG_FILES include/MKterm.h.awk" ;; + "include/curses.head" ) CONFIG_FILES="$CONFIG_FILES include/curses.head:include/curses.h.in" ;; + "include/ncurses_dll.h" ) CONFIG_FILES="$CONFIG_FILES include/ncurses_dll.h" ;; + "include/termcap.h" ) CONFIG_FILES="$CONFIG_FILES include/termcap.h" ;; + "include/unctrl.h" ) CONFIG_FILES="$CONFIG_FILES include/unctrl.h" ;; + "man/man_db.renames" ) CONFIG_FILES="$CONFIG_FILES man/man_db.renames" ;; + "$SUB_MAKEFILES" ) CONFIG_FILES="$CONFIG_FILES $SUB_MAKEFILES" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + "include/ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/ncurses_cfg.h:include/ncurses_cfg.hin" ;; + *) { { echo "$as_me:30054: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if "$ac_need_defaults"; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: "${TMPDIR=/tmp}" +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +EOF + +cat >>"$CONFIG_STATUS" <"\$tmp"/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datarootdir@,$datarootdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@runstatedir@,$runstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@DEFS@,$DEFS,;t t +s,@LIBS@,$LIBS,;t t +s,@top_builddir@,$top_builddir,;t t +s,@GREP@,$GREP,;t t +s,@EGREP@,$EGREP,;t t +s,@NCURSES_MAJOR@,$NCURSES_MAJOR,;t t +s,@NCURSES_MINOR@,$NCURSES_MINOR,;t t +s,@NCURSES_PATCH@,$NCURSES_PATCH,;t t +s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t +s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t +s,@cf_cv_abi_default@,$cf_cv_abi_default,;t t +s,@cf_cv_builtin_bool@,$cf_cv_builtin_bool,;t t +s,@cf_cv_header_stdbool_h@,$cf_cv_header_stdbool_h,;t t +s,@cf_cv_type_of_bool@,$cf_cv_type_of_bool,;t t +s,@VERSION@,$VERSION,;t t +s,@VERSION_MAJOR@,$VERSION_MAJOR,;t t +s,@VERSION_MINOR@,$VERSION_MINOR,;t t +s,@VERSION_PATCH@,$VERSION_PATCH,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@FGREP@,$FGREP,;t t +s,@cf_TEMP_gnat@,$cf_TEMP_gnat,;t t +s,@M4_exists@,$M4_exists,;t t +s,@cf_ada_make@,$cf_ada_make,;t t +s,@cf_ada_config@,$cf_ada_config,;t t +s,@cf_ada_config_Ada@,$cf_ada_config_Ada,;t t +s,@cf_ada_config_C@,$cf_ada_config_C,;t t +s,@cf_cv_path_gnatgcc@,$cf_cv_path_gnatgcc,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t +s,@CPP@,$CPP,;t t +s,@LDCONFIG@,$LDCONFIG,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@AWK@,$AWK,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@GLOB_FULLPATH_POSIX@,$GLOB_FULLPATH_POSIX,;t t +s,@GLOB_FULLPATH_OTHER@,$GLOB_FULLPATH_OTHER,;t t +s,@LINT@,$LINT,;t t +s,@LINT_OPTS@,$LINT_OPTS,;t t +s,@LINT_LIBS@,$LINT_LIBS,;t t +s,@LN_S@,$LN_S,;t t +s,@cf_config_suffix@,$cf_config_suffix,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t +s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t +s,@PKG_CONFIG_LIBDIR@,$PKG_CONFIG_LIBDIR,;t t +s,@MAKE_PC_FILES@,$MAKE_PC_FILES,;t t +s,@PC_MODULE_SUFFIX@,$PC_MODULE_SUFFIX,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t +s,@MAKE_PHONY@,$MAKE_PHONY,;t t +s,@CTAGS@,$CTAGS,;t t +s,@ETAGS@,$ETAGS,;t t +s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t +s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t +s,@cf_cv_makeflags@,$cf_cv_makeflags,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@LD@,$LD,;t t +s,@ac_ct_LD@,$ac_ct_LD,;t t +s,@AR@,$AR,;t t +s,@ac_ct_AR@,$ac_ct_AR,;t t +s,@NM@,$NM,;t t +s,@ac_ct_NM@,$ac_ct_NM,;t t +s,@ARFLAGS@,$ARFLAGS,;t t +s,@DESTDIR@,$DESTDIR,;t t +s,@MERGE_PREFIX@,$MERGE_PREFIX,;t t +s,@BUILD_CC@,$BUILD_CC,;t t +s,@BUILD_CPP@,$BUILD_CPP,;t t +s,@BUILD_CFLAGS@,$BUILD_CFLAGS,;t t +s,@BUILD_CPPFLAGS@,$BUILD_CPPFLAGS,;t t +s,@BUILD_LDFLAGS@,$BUILD_LDFLAGS,;t t +s,@BUILD_LIBS@,$BUILD_LIBS,;t t +s,@BUILD_EXEEXT@,$BUILD_EXEEXT,;t t +s,@BUILD_OBJEXT@,$BUILD_OBJEXT,;t t +s,@cf_list_models@,$cf_list_models,;t t +s,@ABI_VERSION@,$ABI_VERSION,;t t +s,@LIBTOOL_VERSION@,$LIBTOOL_VERSION,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@ac_ct_LIBTOOL@,$ac_ct_LIBTOOL,;t t +s,@LT_UNDEF@,$LT_UNDEF,;t t +s,@LIBTOOL_CXX@,$LIBTOOL_CXX,;t t +s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t +s,@LIB_CREATE@,$LIB_CREATE,;t t +s,@LIB_OBJECT@,$LIB_OBJECT,;t t +s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t +s,@LIB_PREP@,$LIB_PREP,;t t +s,@LIB_CLEAN@,$LIB_CLEAN,;t t +s,@LIB_COMPILE@,$LIB_COMPILE,;t t +s,@LIB_LINK@,$LIB_LINK,;t t +s,@LIB_INSTALL@,$LIB_INSTALL,;t t +s,@LIB_UNINSTALL@,$LIB_UNINSTALL,;t t +s,@DFT_LWR_MODEL@,$DFT_LWR_MODEL,;t t +s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t +s,@TICS_NAME@,$TICS_NAME,;t t +s,@TINFO_NAME@,$TINFO_NAME,;t t +s,@LIB_NAME@,$LIB_NAME,;t t +s,@LIB_PREFIX@,$LIB_PREFIX,;t t +s,@CC_G_OPT@,$CC_G_OPT,;t t +s,@CXX_G_OPT@,$CXX_G_OPT,;t t +s,@LD_MODEL@,$LD_MODEL,;t t +s,@shlibdir@,$shlibdir,;t t +s,@MAKE_DLLS@,$MAKE_DLLS,;t t +s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t +s,@LD_RPATH_OPT@,$LD_RPATH_OPT,;t t +s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t +s,@MK_SHARED_LIB@,$MK_SHARED_LIB,;t t +s,@RM_SHARED_OPTS@,$RM_SHARED_OPTS,;t t +s,@LINK_PROGS@,$LINK_PROGS,;t t +s,@LINK_TESTS@,$LINK_TESTS,;t t +s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t +s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t +s,@LOCAL_LDFLAGS2@,$LOCAL_LDFLAGS2,;t t +s,@INSTALL_LIB@,$INSTALL_LIB,;t t +s,@RPATH_LIST@,$RPATH_LIST,;t t +s,@EXPORT_SYMS@,$EXPORT_SYMS,;t t +s,@RESULTING_SYMS@,$RESULTING_SYMS,;t t +s,@VERSIONED_SYMS@,$VERSIONED_SYMS,;t t +s,@WILDCARD_SYMS@,$WILDCARD_SYMS,;t t +s,@cf_ldd_prog@,$cf_ldd_prog,;t t +s,@EXTRA_PKG_LDFLAGS@,$EXTRA_PKG_LDFLAGS,;t t +s,@EXTRA_SUFFIX@,$EXTRA_SUFFIX,;t t +s,@TERMINFO_SRC@,$TERMINFO_SRC,;t t +s,@NCURSES_USE_DATABASE@,$NCURSES_USE_DATABASE,;t t +s,@TIC@,$TIC,;t t +s,@ac_ct_TIC@,$ac_ct_TIC,;t t +s,@INFOCMP@,$INFOCMP,;t t +s,@ac_ct_INFOCMP@,$ac_ct_INFOCMP,;t t +s,@FALLBACK_LIST@,$FALLBACK_LIST,;t t +s,@USE_FALLBACKS@,$USE_FALLBACKS,;t t +s,@WHICH_XTERM@,$WHICH_XTERM,;t t +s,@XTERM_KBS@,$XTERM_KBS,;t t +s,@TERMINFO_DIRS@,$TERMINFO_DIRS,;t t +s,@TERMINFO@,$TERMINFO,;t t +s,@MAKE_TERMINFO@,$MAKE_TERMINFO,;t t +s,@USE_BIG_STRINGS@,$USE_BIG_STRINGS,;t t +s,@TERMPATH@,$TERMPATH,;t t +s,@NCURSES_USE_TERMCAP@,$NCURSES_USE_TERMCAP,;t t +s,@BROKEN_LINKER@,$BROKEN_LINKER,;t t +s,@NCURSES_WCWIDTH_GRAPHICS@,$NCURSES_WCWIDTH_GRAPHICS,;t t +s,@NCURSES_CH_T@,$NCURSES_CH_T,;t t +s,@NCURSES_LIBUTF8@,$NCURSES_LIBUTF8,;t t +s,@NEED_WCHAR_H@,$NEED_WCHAR_H,;t t +s,@NCURSES_MBSTATE_T@,$NCURSES_MBSTATE_T,;t t +s,@NCURSES_WCHAR_T@,$NCURSES_WCHAR_T,;t t +s,@NCURSES_WINT_T@,$NCURSES_WINT_T,;t t +s,@NCURSES_OK_WCHAR_T@,$NCURSES_OK_WCHAR_T,;t t +s,@NCURSES_OK_WINT_T@,$NCURSES_OK_WINT_T,;t t +s,@cf_cv_enable_lp64@,$cf_cv_enable_lp64,;t t +s,@NCURSES_TPARM_VARARGS@,$NCURSES_TPARM_VARARGS,;t t +s,@NCURSES_WATTR_MACROS@,$NCURSES_WATTR_MACROS,;t t +s,@RGB_PATH@,$RGB_PATH,;t t +s,@no_x11_rgb@,$no_x11_rgb,;t t +s,@NCURSES_BOOL@,$NCURSES_BOOL,;t t +s,@TERMINFO_CAPS@,$TERMINFO_CAPS,;t t +s,@NCURSES_CHTYPE@,$NCURSES_CHTYPE,;t t +s,@NCURSES_OSPEED@,$NCURSES_OSPEED,;t t +s,@NCURSES_MMASK_T@,$NCURSES_MMASK_T,;t t +s,@NCURSES_CCHARW_MAX@,$NCURSES_CCHARW_MAX,;t t +s,@NCURSES_SBOOL@,$NCURSES_SBOOL,;t t +s,@NCURSES_TPARM_ARG@,$NCURSES_TPARM_ARG,;t t +s,@cf_manpage_format@,$cf_manpage_format,;t t +s,@cf_manpage_inboth@,$cf_manpage_inboth,;t t +s,@cf_manpage_so_strip@,$cf_manpage_so_strip,;t t +s,@cf_manpage_compress@,$cf_manpage_compress,;t t +s,@cf_manpage_coptions@,$cf_manpage_coptions,;t t +s,@MANPAGE_RENAMES@,$MANPAGE_RENAMES,;t t +s,@NCURSES_EXT_FUNCS@,$NCURSES_EXT_FUNCS,;t t +s,@GENERATED_EXT_FUNCS@,$GENERATED_EXT_FUNCS,;t t +s,@NCURSES_SP_FUNCS@,$NCURSES_SP_FUNCS,;t t +s,@GENERATED_SP_FUNCS@,$GENERATED_SP_FUNCS,;t t +s,@NCURSES_CONST@,$NCURSES_CONST,;t t +s,@NCURSES_EXT_COLORS@,$NCURSES_EXT_COLORS,;t t +s,@NCURSES_MOUSE_VERSION@,$NCURSES_MOUSE_VERSION,;t t +s,@cf_cv_enable_sigwinch@,$cf_cv_enable_sigwinch,;t t +s,@NCURSES_XNAMES@,$NCURSES_XNAMES,;t t +s,@PTHREAD@,$PTHREAD,;t t +s,@cf_cv_enable_reentrant@,$cf_cv_enable_reentrant,;t t +s,@cf_cv_enable_opaque@,$cf_cv_enable_opaque,;t t +s,@NCURSES_SIZE_T@,$NCURSES_SIZE_T,;t t +s,@NCURSES_OPAQUE@,$NCURSES_OPAQUE,;t t +s,@NCURSES_OPAQUE_FORM@,$NCURSES_OPAQUE_FORM,;t t +s,@NCURSES_OPAQUE_MENU@,$NCURSES_OPAQUE_MENU,;t t +s,@NCURSES_OPAQUE_PANEL@,$NCURSES_OPAQUE_PANEL,;t t +s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t +s,@NCURSES_IMPEXP@,$NCURSES_IMPEXP,;t t +s,@NCURSES_CXX_IMPEXP@,$NCURSES_CXX_IMPEXP,;t t +s,@NCURSES_INTEROP_FUNCS@,$NCURSES_INTEROP_FUNCS,;t t +s,@NCURSES_WGETCH_EVENTS@,$NCURSES_WGETCH_EVENTS,;t t +s,@EXP_WIN32_DRIVER@,$EXP_WIN32_DRIVER,;t t +s,@INTERNALS_HDR@,$INTERNALS_HDR,;t t +s,@ECHO_LT@,$ECHO_LT,;t t +s,@ECHO_LD@,$ECHO_LD,;t t +s,@RULE_CC@,$RULE_CC,;t t +s,@SHOW_CC@,$SHOW_CC,;t t +s,@ECHO_CC@,$ECHO_CC,;t t +s,@ECHO_LINK@,$ECHO_LINK,;t t +s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t +s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t +s,@INSTALL_OPT_P@,$INSTALL_OPT_P,;t t +s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t +s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t +s,@STDC_NORETURN@,$STDC_NORETURN,;t t +s,@ADAFLAGS@,$ADAFLAGS,;t t +s,@EXTRA_CXXFLAGS@,$EXTRA_CXXFLAGS,;t t +s,@ADA_TRACE@,$ADA_TRACE,;t t +s,@MATH_LIB@,$MATH_LIB,;t t +s,@NCURSES_INLINE@,$NCURSES_INLINE,;t t +s,@cf_cv_typeof_chtype@,$cf_cv_typeof_chtype,;t t +s,@cf_cv_1UL@,$cf_cv_1UL,;t t +s,@cf_cv_typeof_mmask_t@,$cf_cv_typeof_mmask_t,;t t +s,@HAVE_VSSCANF@,$HAVE_VSSCANF,;t t +s,@TEST_LIBS@,$TEST_LIBS,;t t +s,@TEST_LIBS2@,$TEST_LIBS2,;t t +s,@CXXCPP@,$CXXCPP,;t t +s,@CXXLDFLAGS@,$CXXLDFLAGS,;t t +s,@CXX_AR@,$CXX_AR,;t t +s,@CXX_ARFLAGS@,$CXX_ARFLAGS,;t t +s,@CXXLIBS@,$CXXLIBS,;t t +s,@USE_CXX_BOOL@,$USE_CXX_BOOL,;t t +s,@GNATPREP_OPTS@,$GNATPREP_OPTS,;t t +s,@cf_compile_generics@,$cf_compile_generics,;t t +s,@cf_generic_objects@,$cf_generic_objects,;t t +s,@USE_GNAT_SIGINT@,$USE_GNAT_SIGINT,;t t +s,@USE_OLD_MAKERULES@,$USE_OLD_MAKERULES,;t t +s,@USE_GNAT_PROJECTS@,$USE_GNAT_PROJECTS,;t t +s,@USE_GNAT_LIBRARIES@,$USE_GNAT_LIBRARIES,;t t +s,@USE_GNAT_MAKE_GPR@,$USE_GNAT_MAKE_GPR,;t t +s,@USE_GNAT_GPRBUILD@,$USE_GNAT_GPRBUILD,;t t +s,@cf_ada_compiler@,$cf_ada_compiler,;t t +s,@cf_ada_package@,$cf_ada_package,;t t +s,@ADA_INCLUDE@,$ADA_INCLUDE,;t t +s,@ADA_OBJECTS@,$ADA_OBJECTS,;t t +s,@ADA_SHAREDLIB@,$ADA_SHAREDLIB,;t t +s,@MAKE_ADA_SHAREDLIB@,$MAKE_ADA_SHAREDLIB,;t t +s,@ADA_LIBNAME@,$ADA_LIBNAME,;t t +s,@ACPPFLAGS@,$ACPPFLAGS,;t t +s,@DFT_ARG_SUFFIX@,$DFT_ARG_SUFFIX,;t t +s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t +s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t +s,@CXX_LIB_SUFFIX@,$CXX_LIB_SUFFIX,;t t +s,@USE_ARG_SUFFIX@,$USE_ARG_SUFFIX,;t t +s,@USE_CFG_SUFFIX@,$USE_CFG_SUFFIX,;t t +s,@USE_LIB_SUFFIX@,$USE_LIB_SUFFIX,;t t +s,@TICS_ARG_SUFFIX@,$TICS_ARG_SUFFIX,;t t +s,@TICS_DEP_SUFFIX@,$TICS_DEP_SUFFIX,;t t +s,@TICS_LIB_SUFFIX@,$TICS_LIB_SUFFIX,;t t +s,@TICS_LDFLAGS@,$TICS_LDFLAGS,;t t +s,@TICS_LIBS@,$TICS_LIBS,;t t +s,@TINFO_ARG_SUFFIX@,$TINFO_ARG_SUFFIX,;t t +s,@TINFO_DEP_SUFFIX@,$TINFO_DEP_SUFFIX,;t t +s,@TINFO_LIB_SUFFIX@,$TINFO_LIB_SUFFIX,;t t +s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t +s,@TINFO_LIBS@,$TINFO_LIBS,;t t +s,@TINFO_LDFLAGS2@,$TINFO_LDFLAGS2,;t t +s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t +s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t +s,@includesubdir@,$includesubdir,;t t +s,@WITH_OVERWRITE@,$WITH_OVERWRITE,;t t +s,@TICS_LIST@,$TICS_LIST,;t t +s,@TINFO_LIST@,$TINFO_LIST,;t t +s,@SHLIB_LIST@,$SHLIB_LIST,;t t +s,@FORM_NAME@,$FORM_NAME,;t t +s,@MENU_NAME@,$MENU_NAME,;t t +s,@PANEL_NAME@,$PANEL_NAME,;t t +s,@CXX_NAME@,$CXX_NAME,;t t +s,@TEST_ARGS@,$TEST_ARGS,;t t +s,@TEST_DEPS@,$TEST_DEPS,;t t +s,@TEST_ARG2@,$TEST_ARG2,;t t +s,@TEST_DEP2@,$TEST_DEP2,;t t +s,@PC_MODULES_TO_MAKE@,$PC_MODULES_TO_MAKE,;t t +s,@ADA_SUBDIRS@,$ADA_SUBDIRS,;t t +s,@DIRS_TO_MAKE@,$DIRS_TO_MAKE,;t t +s,@NCURSES_SHLIB2@,$NCURSES_SHLIB2,;t t +s,@HAVE_TCGETATTR@,$HAVE_TCGETATTR,;t t +s,@HAVE_STDINT_H@,$HAVE_STDINT_H,;t t +s,@HAVE_TERMIO_H@,$HAVE_TERMIO_H,;t t +s,@HAVE_TERMIOS_H@,$HAVE_TERMIOS_H,;t t +s,@cross_compiling@,$cross_compiling,;t t +s,@MAKE_TESTS@,$MAKE_TESTS,;t t +s,@ADAHTML_DIR@,$ADAHTML_DIR,;t t +s,@LIBTOOL_OPTS_CXX@,$LIBTOOL_OPTS_CXX,;t t +s,@PKG_CFLAGS@,$PKG_CFLAGS,;t t +s,@MISC_INSTALL_DATA@,$MISC_INSTALL_DATA,;t t +s,@MISC_UNINSTALL_DATA@,$MISC_UNINSTALL_DATA,;t t +s,@MAKE_DATABASE@,$MAKE_DATABASE,;t t +s,@UNALTERED_SYMS@,$UNALTERED_SYMS,;t t +s,@ADAGEN_LDFLAGS@,$ADAGEN_LDFLAGS,;t t +s,@CHECK_BUILD@,$CHECK_BUILD,;t t +s,@PRIVATE_LIBS@,$PRIVATE_LIBS,;t t +s,@LD_SEARCHPATH@,$LD_SEARCHPATH,;t t +CEOF + +EOF + + cat >>"$CONFIG_STATUS" <<\EOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while "$ac_more_lines"; do + if test "$ac_beg" -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag + else + sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag + fi + if test ! -s "$tmp"/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && sed -e 's/\\\\*$//g' -e 's/$/\\/' -e 's/;t t\\/;t t/' -e 't' -e '3,'$ac_max_sed_lines's/$/\\/' "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed + # It is possible to make a multiline substitution using escaped newlines. + # Ensure that we do not split the substitution between script fragments. + ac_BEG=$ac_end + ac_END=`expr "$ac_end" + "$ac_max_sed_lines"` + sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next + if test -s "$tmp"/subs.next; then + grep '^s,@[^@,][^@,]*@,.*$' "$tmp"/subs.next | grep -v '^s,@.*;t t$' >"$tmp"/subs.edit + if test ! -s "$tmp"/subs.edit; then + grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit + if test ! -s "$tmp"/subs.edit; then + if test "$ac_beg" -gt 1; then + ac_end=`expr "$ac_end" - 1` + continue + fi + fi + fi + fi + + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr "$ac_sed_frag" + 1` + ac_beg=$ac_end + ac_end=`expr "$ac_end" + "$ac_max_sed_lines"` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="cat" + fi +fi # test -n "$CONFIG_FILES" + +EOF +cat >>"$CONFIG_STATUS" <<\EOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + - | *:- | *:-:* ) # input from stdin + cat >"$tmp"/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$srcdir" in + .) ac_srcdir=. + if test -z "$ac_dots"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) + ac_srcdir="$srcdir$ac_dir_suffix"; + ac_top_srcdir="$srcdir" ;; + *) # Relative path. + ac_srcdir="$ac_dots$srcdir$ac_dir_suffix" + ac_top_srcdir="$ac_dots$srcdir" ;; + esac + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_dots$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:30579: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + configure_input="Generated automatically from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo "$tmp"/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:30597: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:30610: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +EOF +cat >>"$CONFIG_STATUS" <<\EOF + ac_warn_datarootdir=no + if test x"$ac_file" != x-; then + for ac_item in $ac_file_inputs + do + ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"` + if test -n "$ac_seen"; then + ac_used=`grep '@datarootdir@' "$ac_item"` + if test -z "$ac_used"; then + { echo "$as_me:30626: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + fi + ac_seen=`grep '${datarootdir}' "$ac_item"` + if test -n "$ac_seen"; then + { echo "$as_me:30635: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + done + fi + +if test "x$ac_warn_datarootdir" = xyes; then + ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'" +fi + +EOF +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out + rm -f "$tmp"/stdin +EOF +test -n "${FGREP}" || FGREP="grep -F" +test -n "${EGREP}" || EGREP="grep -E" +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF + if test x"$ac_file" != x-; then + cp "$tmp/out" "$ac_file" + + for ac_name in prefix exec_prefix datarootdir + do + ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"` + if test -n "$ac_seen"; then + ac_init=`$EGREP '[ ]*'$ac_name'[ ]*=' "$ac_file"` + if test -z "$ac_init"; then + ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'` + { echo "$as_me:30680: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&5 +echo "$as_me: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&2;} + fi + fi + done + $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out + $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out + if test -s "$tmp"/out; then + ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out` + { echo "$as_me:30691: WARNING: Some variables may not be substituted: +$ac_seen" >&5 +echo "$as_me: WARNING: Some variables may not be substituted: +$ac_seen" >&2;} + fi + else + cat "$tmp"/out + fi + rm -f "$tmp"/out + +done +EOF +cat >>"$CONFIG_STATUS" <<\EOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_iB='\([ ]\),\1#\2define\3' +ac_iC=' ' +ac_iD='\4,;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + - | *:- | *:-:* ) # input from stdin + cat >"$tmp"/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:30740: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo "$tmp"/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:30751: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:30764: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >"$tmp"/in + +EOF + +# Transform confdefs.h into a list of #define's. We won't use it as a sed +# script, but as data to insert where we see @DEFS@. We expect AC_SAVE_DEFS to +# be either 'cat' or 'sort'. +cat confdefs.h | uniq >conftest.vals + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +echo ' rm -f conftest.frag' >> "$CONFIG_STATUS" +while grep . conftest.vals >/dev/null +do + # Write chunks of a limited-size here document to conftest.frag. + echo ' cat >> conftest.frag <> "$CONFIG_STATUS" + sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS" + echo 'CEOF' >> "$CONFIG_STATUS" + sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +# Run sed to substitute the contents of conftest.frag into $tmp/in at the +# marker @DEFS@. +echo ' cat >> conftest.edit < "$tmp"/out +rm -f "$tmp"/in +mv "$tmp"/out "$tmp"/in +rm -f conftest.edit conftest.frag +' >> "$CONFIG_STATUS" + +cat >>"$CONFIG_STATUS" <<\EOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated automatically by configure. */" >"$tmp"/config.h + else + echo "/* $ac_file. Generated automatically by configure. */" >"$tmp"/config.h + fi + cat "$tmp"/in >>"$tmp"/config.h + rm -f "$tmp"/in + if test x"$ac_file" != x-; then + if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then + { echo "$as_me:30822: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + fi + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" + fi + else + cat "$tmp"/config.h + rm -f "$tmp"/config.h + fi +done +EOF +cat >>"$CONFIG_STATUS" <<\EOF +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + + case "$ac_dest" in + default ) +if test "x$cf_with_tests" != xno ; then + +for cf_dir in test +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + elif test -f "$srcdir/$cf_dir/programs" ; then + $AWK -f "$srcdir/test/mk-test.awk" INSTALL=no ECHO_LINK="$ECHO_LD" "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile + fi +done + +fi + +cf_prefix=$LIB_PREFIX + +case "$cf_cv_shlib_version" in +(cygdll|msysdll|mingw|msvcdll) + TINFO_NAME=$TINFO_ARG_SUFFIX + TINFO_SUFFIX=.dll + ;; +esac + +if test -n "$TINFO_SUFFIX" ; then + case "$TINFO_SUFFIX" in + (tw*) + TINFO_NAME="${TINFO_NAME}tw${EXTRA_SUFFIX}" + TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^tw'$EXTRA_SUFFIX'//'` + ;; + (t*) + TINFO_NAME="${TINFO_NAME}t${EXTRA_SUFFIX}" + TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^t'$EXTRA_SUFFIX'//'` + ;; + (w*) + TINFO_NAME="${TINFO_NAME}w${EXTRA_SUFFIX}" + TINFO_SUFFIX=`echo "$TINFO_SUFFIX" | sed 's/^w'$EXTRA_SUFFIX'//'` + ;; + esac +fi + +for cf_dir in $SRC_SUBDIRS +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + elif test -f "$srcdir/$cf_dir/modules" ; then + + SHARED_LIB= + Libs_To_Make= + cf_awk_program= + if test -n "${cf_cv_abi_default}" && test "x${cf_cv_abi_default}" != "x5" + then + cf_awk_program="$cf_awk_program\ +/deprecated in ABI${cf_cv_abi_default}/ { next; }\ +{ sub(\"NCURSES([WT]+)?\", \"&${cf_cv_abi_default}\"); }\ +" + fi + + if test "x$WILDCARD_SYMS" = xno + then + cf_awk_program="$cf_awk_program\ +/[ ]_\\*;/ { skip=1; next; }\ +" + fi + + if test "x$cf_awk_program" != "x" + then + cat >>$cf_dir/Makefile <\$@ + +distclean:: + rm -f resulting.map +CF_EOF + fi + + for cf_item in $cf_LIST_MODELS + do + + case X$cf_item in + (Xlibtool) + cf_suffix='.la' + cf_depsuf=$cf_suffix + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + cf_suffix='_g.lib' + ;; + (*) + cf_suffix='_g.a' + ;; + esac + cf_depsuf=$cf_suffix + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + cf_suffix='_p.lib' + ;; + (*) + cf_suffix='_p.a' + ;; + esac + cf_depsuf=$cf_suffix + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[5-7]*) + cf_suffix='.so' + cf_depsuf=$cf_suffix + ;; + (*-msvc*) + cf_suffix='.dll' + cf_depsuf='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + cf_suffix='.dll' + cf_depsuf='.dll.a' + ;; + (darwin*) + cf_suffix='.dylib' + cf_depsuf=$cf_suffix + ;; + (hpux*) + case "$target" in + (ia64*) + cf_suffix='.so' + cf_depsuf=$cf_suffix + ;; + (*) + cf_suffix='.sl' + cf_depsuf=$cf_suffix + ;; + esac + ;; + (*) + cf_suffix='.so' + cf_depsuf=$cf_suffix + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + cf_suffix='.lib' + ;; + (*) + cf_suffix='.a' + ;; + esac + cf_depsuf=$cf_suffix + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + cf_suffix="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_suffix}" + cf_depsuf="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_depsuf}" + fi + + if test "$cf_dir" = "c++" + then + +cf_map_lib_basename=`echo "cxx" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +eval cf_libname="\$${cf_map_lib_basename}_NAME" + + else + +cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +eval cf_libname="\$${cf_map_lib_basename}_NAME" + + fi + test -z "$cf_libname" && cf_libname="$cf_dir" + if test "$cf_item" = shared ; then + if test -n "${LIB_SUFFIX}" + then + cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'` + else + cf_shared_suffix="$cf_suffix" + fi + if test "$cf_cv_do_symlinks" = yes ; then + cf_version_name= + + case "$cf_cv_shlib_version" in + (rel) + cf_version_name=REL_VERSION + ;; + (abi) + cf_version_name=ABI_VERSION + ;; + esac + + if test -n "$cf_version_name" + then + case "$cf_cv_system_name" in + (darwin*) + # "w", etc? + cf_suffix="${USE_LIB_SUFFIX}"'.${'$cf_version_name'}'"$cf_shared_suffix" + ;; + (*) + cf_suffix="$cf_suffix"'.${'$cf_version_name'}' + ;; + esac + fi + if test -n "${USE_LIB_SUFFIX}" + then + cf_shared_suffix=`echo "$cf_suffix" | sed 's/^'"${USE_LIB_SUFFIX}"'//'` + else + cf_shared_suffix="$cf_suffix" + fi + fi + # cygwin needs import library, and has unique naming convention + # use autodetected ${cf_prefix} for import lib and static lib, but + # use 'cyg' prefix for shared lib. + case "$cf_cv_shlib_version" in + (cygdll) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/cyg${cf_libname}${cf_cygsuf}" + ;; + (msysdll) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/msys-${cf_libname}${cf_cygsuf}" + ;; + (mingw) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/lib${cf_libname}${cf_cygsuf}" + ;; + (msvcdll) + cf_cygsuf=`echo "$cf_suffix" | sed -e 's/\.dll/\${ABI_VERSION}.dll/'` + cf_add_lib="../lib/${cf_libname}${cf_cygsuf}" + ;; + (*) + cf_add_lib= + ;; + esac + if test -n "$cf_add_lib" + then + Libs_To_Make="$Libs_To_Make $cf_add_lib" + continue + fi + fi + cf_add_lib="../lib/${cf_prefix}${cf_libname}${cf_suffix}" + Libs_To_Make="$Libs_To_Make $cf_add_lib" + done + + if test "$cf_dir" = ncurses ; then + cf_subsets="$LIB_SUBSETS" + cf_r_parts="$cf_subsets" + cf_liblist="$Libs_To_Make" + + while test -n "$cf_r_parts" + do + cf_l_parts=`echo "$cf_r_parts" |sed -e 's/ .*$//'` + cf_r_parts=`echo "$cf_r_parts" |sed -e 's/^[^ ]* //'` + if test "$cf_l_parts" != "$cf_r_parts" ; then + cf_add_lib= + case "$cf_l_parts" in + (*termlib*) + cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TINFO_LIB_SUFFIX}%g` + ;; + (*ticlib*) + cf_add_lib=`echo "$cf_liblist" |sed -e s%${LIB_NAME}${USE_LIB_SUFFIX}%${TICS_LIB_SUFFIX}%g` + ;; + (*) + break + ;; + esac + if test -n "$cf_add_lib"; then + Libs_To_Make="$cf_add_lib $Libs_To_Make" + fi + else + break + fi + done + else + cf_subsets=`echo "$LIB_SUBSETS" | sed -e 's/^termlib.* //'` + fi + + if test "$cf_dir" = c++; then + if test "x$with_shared_cxx" != xyes && test -n "$cf_shared_suffix"; then + cf_list= + for cf_item in $Libs_To_Make + do + case "$cf_item" in + (*.a) + ;; + (*) + cf_item=`echo "$cf_item" | sed -e "s,"$cf_shared_suffix",.a,"` + ;; + esac + for cf_test in $cf_list + do + if test "$cf_test" = "$cf_item" + then + cf_LIST_MODELS=`echo "$cf_LIST_MODELS" | sed -e 's/normal//'` + cf_item= + break + fi + done + test -n "$cf_item" && cf_list="$cf_list $cf_item" + done + Libs_To_Make="$cf_list" + fi + fi + + sed -e "s%@Libs_To_Make@%$Libs_To_Make%" \ + -e "s%@SHARED_LIB@%$SHARED_LIB%" \ + "$cf_dir/Makefile" >$cf_dir/Makefile.out + mv "$cf_dir/Makefile.out" "$cf_dir/Makefile" + + $AWK -f "$srcdir/mk-0th.awk" \ + libname="${cf_dir}${LIB_SUFFIX}" subsets="$LIB_SUBSETS" ticlib="$TICS_LIB_SUFFIX" termlib="$TINFO_LIB_SUFFIX" \ + "$srcdir/$cf_dir/modules" >>$cf_dir/Makefile + + for cf_subset in $cf_subsets + do + cf_subdirs= + for cf_item in $cf_LIST_MODELS + do + + echo "Appending rules for ${cf_item} model (${cf_dir}: ${cf_subset})" + +cf_ITEM=`echo "$cf_item" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + CXX_MODEL=$cf_ITEM + if test "$CXX_MODEL" = SHARED; then + case "$cf_cv_shlib_version" in + (cygdll|msysdll|mingw|msvcdll) + test "x$with_shared_cxx" = xno && test -n "$verbose" && echo " overriding CXX_MODEL to SHARED" 1>&6 + +echo "${as_me:-configure}:31209: testing overriding CXX_MODEL to SHARED ..." 1>&5 + + with_shared_cxx=yes + ;; + (*) + test "x$with_shared_cxx" = xno && CXX_MODEL=NORMAL + ;; + esac + fi + + case X$cf_item in + (Xlibtool) + cf_suffix='.la' + cf_depsuf=$cf_suffix + ;; + (Xdebug) + case "$cf_cv_system_name" in + (*-msvc*) + cf_suffix='_g.lib' + ;; + (*) + cf_suffix='_g.a' + ;; + esac + cf_depsuf=$cf_suffix + ;; + (Xprofile) + case "$cf_cv_system_name" in + (*-msvc*) + cf_suffix='_p.lib' + ;; + (*) + cf_suffix='_p.a' + ;; + esac + cf_depsuf=$cf_suffix + ;; + (Xshared) + case "$cf_cv_system_name" in + (aix[5-7]*) + cf_suffix='.so' + cf_depsuf=$cf_suffix + ;; + (*-msvc*) + cf_suffix='.dll' + cf_depsuf='.dll.lib' + ;; + (cygwin*|msys*|mingw*) + cf_suffix='.dll' + cf_depsuf='.dll.a' + ;; + (darwin*) + cf_suffix='.dylib' + cf_depsuf=$cf_suffix + ;; + (hpux*) + case "$target" in + (ia64*) + cf_suffix='.so' + cf_depsuf=$cf_suffix + ;; + (*) + cf_suffix='.sl' + cf_depsuf=$cf_suffix + ;; + esac + ;; + (*) + cf_suffix='.so' + cf_depsuf=$cf_suffix + ;; + esac + ;; + (*) + case "$target" in + (*-msvc*) + cf_suffix='.lib' + ;; + (*) + cf_suffix='.a' + ;; + esac + cf_depsuf=$cf_suffix + ;; + esac + if test -n "${LIB_SUFFIX}${EXTRA_SUFFIX}" + then + cf_suffix="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_suffix}" + cf_depsuf="${LIB_SUFFIX}${EXTRA_SUFFIX}${cf_depsuf}" + fi + + case $cf_item in + (libtool) cf_subdir='obj_lo' ;; + (normal) cf_subdir='objects' ;; + (debug) cf_subdir='obj_g' ;; + (profile) cf_subdir='obj_p' ;; + (shared) + case "$cf_cv_system_name" in + (cygwin|msys) + cf_subdir='objects' ;; + (*) + cf_subdir='obj_s' ;; + esac + esac + + # Test for case where we build libtinfo with a different name. + cf_libname=$cf_dir + if test "$cf_dir" = ncurses ; then + case "$cf_subset" in + (*base*) + cf_libname=${cf_libname}$USE_LIB_SUFFIX + ;; + (*termlib*) + cf_libname=$TINFO_LIB_SUFFIX + ;; + (ticlib*) + cf_libname=$TICS_LIB_SUFFIX + ;; + esac + elif test "$cf_dir" = c++ ; then + +cf_map_lib_basename=`echo "cxx" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +eval cf_libname="\$${cf_map_lib_basename}_NAME" + + cf_libname=${cf_libname}$USE_LIB_SUFFIX + else + +cf_map_lib_basename=`echo "$cf_dir" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +eval cf_libname="\$${cf_map_lib_basename}_NAME" + + cf_libname=${cf_libname}$USE_LIB_SUFFIX + fi + if test -n "${USE_ARG_SUFFIX}" ; then + # undo $USE_LIB_SUFFIX add-on in CF_LIB_SUFFIX + cf_suffix=`echo "$cf_suffix" |sed -e "s%^${USE_LIB_SUFFIX}%%"` + fi + + # These dependencies really are for development, not + # builds, but they are useful in porting, too. + cf_depend="../include/ncurses_cfg.h" + if test "$srcdir" = "."; then + cf_reldir="." + else + cf_reldir="\${srcdir}" + fi + + if test -f "$srcdir/$cf_dir/$cf_dir.priv.h" ; then + cf_depend="$cf_depend $cf_reldir/$cf_dir.priv.h" + elif test -f "$srcdir/$cf_dir/curses.priv.h" ; then + cf_depend="$cf_depend $cf_reldir/curses.priv.h" + fi + + cf_dir_suffix= + old_cf_suffix="$cf_suffix" + if test "$cf_cv_shlib_version_infix" = yes ; then + if test -n "$USE_LIB_SUFFIX" ; then + case "$USE_LIB_SUFFIX" in + (tw*) + cf_libname=`echo "$cf_libname" | sed 's/tw'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^tw'$EXTRA_SUFFIX'//'` + cf_dir_suffix=tw$EXTRA_SUFFIX + ;; + (t*) + cf_libname=`echo "$cf_libname" | sed 's/t'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^t'$EXTRA_SUFFIX'//'` + cf_dir_suffix=t$EXTRA_SUFFIX + ;; + (w*) + cf_libname=`echo "$cf_libname" | sed 's/w'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^w'$EXTRA_SUFFIX'//'` + cf_dir_suffix=w$EXTRA_SUFFIX + ;; + (*) + cf_libname=`echo "$cf_libname" | sed 's/'$EXTRA_SUFFIX'$//'` + cf_suffix=`echo "$cf_suffix" | sed 's/^'$EXTRA_SUFFIX'//'` + cf_dir_suffix=$EXTRA_SUFFIX + ;; + esac + fi + fi + + $AWK -f "$srcdir/mk-1st.awk" \ + name=${cf_libname}${cf_dir_suffix} \ + traces=$LIB_TRACING \ + MODEL=$cf_ITEM \ + CXX_MODEL=$CXX_MODEL \ + LIB_SUFFIX=$LIB_SUFFIX \ + USE_LIB_SUFFIX=$USE_LIB_SUFFIX \ + make_phony="${cf_cv_make_PHONY:-no}" \ + model=$cf_subdir \ + prefix=$cf_prefix \ + suffix=$cf_suffix \ + subset=$cf_subset \ + driver=$cf_cv_term_driver \ + SymLink="$LN_S" \ + TermlibRoot=$TINFO_NAME \ + TermlibSuffix=$TINFO_SUFFIX \ + ShlibVer=$cf_cv_shlib_version \ + ShlibVerInfix=$cf_cv_shlib_version_infix \ + ReLink=${cf_cv_do_relink:-no} \ + ReRanlib=${cf_cv_do_reranlib:-yes} \ + DoLinks=$cf_cv_do_symlinks \ + rmSoLocs=$cf_cv_rm_so_locs \ + ldconfig="$LDCONFIG" \ + overwrite=$WITH_OVERWRITE \ + depend="$cf_depend" \ + host="$host" \ + libtool_version="$LIBTOOL_VERSION" \ + "$srcdir/$cf_dir/modules" >>$cf_dir/Makefile + + cf_suffix="$old_cf_suffix" + + for cf_subdir2 in $cf_subdirs lib + do + test "$cf_subdir" = "$cf_subdir2" && break + done + test "${cf_subset}.${cf_subdir2}" != "${cf_subset}.${cf_subdir}" && \ + $AWK -f "$srcdir/mk-2nd.awk" \ + name=$cf_dir \ + traces=$LIB_TRACING \ + MODEL=$cf_ITEM \ + model=$cf_subdir \ + subset=$cf_subset \ + srcdir=$srcdir \ + echo=$WITH_ECHO \ + crenames=$cf_cv_prog_CC_c_o \ + cxxrenames=$cf_cv_prog_CXX_c_o \ + "$srcdir/$cf_dir/modules" >>$cf_dir/Makefile + cf_subdirs="$cf_subdirs $cf_subdir" + done + done + fi + + echo ' ( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} $@ )' >>Makefile +done + +echo >> Makefile +echo '# generated by CF_LIB_RULES' >> Makefile + +if test "x$cf_cv_make_PHONY" = xyes ; then + cat >> Makefile <<-CF_EOF + + .PHONY : libs + .PHONY : lintlib + .PHONY : install.includes + .PHONY : uninstall.includes + .PHONY : install.libs + .PHONY : uninstall.libs +CF_EOF +fi + +for cf_dir in $SRC_SUBDIRS +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + fi + + if test -f "$cf_dir/Makefile" ; then + case "$cf_dir" in + (Ada95) + echo 'libs \' >> Makefile + echo 'install.libs \' >> Makefile + echo 'uninstall.libs ::' >> Makefile + echo ' ( cd '$cf_dir' && ${MAKE} ${TOP_MFLAGS} $@ )' >> Makefile + ;; + esac + fi + + if test -f "$srcdir/$cf_dir/modules" ; then + + if test "x$cf_cv_make_PHONY" = xyes ; then + cat >> Makefile <<-CF_EOF + + .PHONY : install.$cf_dir + .PHONY : uninstall.$cf_dir +CF_EOF + fi + + echo >> Makefile + if test -f "$srcdir/$cf_dir/headers" ; then +cat >> Makefile <> Makefile <> Makefile <> Makefile <<-CF_EOF + + .PHONY : install.data + .PHONY : uninstall.data +CF_EOF +fi + +if test "x$cf_with_db_install" = xyes; then +cat >> Makefile <> Makefile <> Makefile <<-CF_EOF + + .PHONY : install.man + .PHONY : uninstall.man +CF_EOF +fi + +cat >> Makefile <> Makefile <headers.sh <>headers.sh </<\$END\/\$NAME>/" >> \$TMPSED + done + ;; +(*) + echo "" >> \$TMPSED + ;; +esac +CF_EOF + +else + cat >>headers.sh <//" >> \$TMPSED + NAME=ncurses.h + fi + echo "s/<\$NAME>/<\$END\/\$NAME>/" >> \$TMPSED + done + ;; +(*) + echo "s///" >> \$TMPSED + ;; +esac +CF_EOF +fi +cat >>headers.sh < \$TMPSRC +NAME=\`basename \$SRC\` +CF_EOF +if test "$WITH_CURSES_H" != yes; then + cat >>headers.sh <>headers.sh <>$cf_dir/Makefile + fi + + if test -f "$srcdir/$cf_dir/modules" ; then + if test "$cf_dir" != "c++" ; then + if test "x$cf_cv_make_PHONY" = xyes ; then + cat >> $cf_dir/Makefile <<-CF_EOF + + .PHONY : depend +CF_EOF + fi + + cat >>$cf_dir/Makefile <<"CF_EOF" +depend : ${AUTO_SRC} + makedepend -- ${CPPFLAGS} -- ${C_SRC} + +# DO NOT DELETE THIS LINE -- make depend depends on it. +CF_EOF + fi + fi +done + +if test "$MANPAGE_RENAMES" != no ; then + # Construct a sed-script to perform renaming within man-pages + test -n "$verbose" && echo "creating edit_man.sed" + test ! -d man && mkdir man + FGREP="${FGREP-grep -F}" $SHELL "$srcdir/man/make_sed.sh" "$MANPAGE_RENAMES" >./edit_man.sed +fi + +if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then +if test -z "$USE_OLD_MAKERULES" ; then + $AWK -f "$srcdir/Ada95/mk-1st.awk" <"$srcdir/Ada95/src/modules" >>Ada95/src/Makefile +fi +fi + ;; + esac +done +EOF + +cat >>"$CONFIG_STATUS" <<\EOF + +{ (exit 0); exit 0; } +EOF +chmod +x "$CONFIG_STATUS" +ac_clean_files=$ac_clean_files_save + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL "$CONFIG_STATUS" || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + "$ac_cs_success" || { (exit 1); exit 1; } +fi +${MAKE:-make} preinstall diff --git a/contrib/ncurses/configure-dj64 b/contrib/ncurses/configure-dj64 new file mode 100755 index 00000000..0497f2d1 --- /dev/null +++ b/contrib/ncurses/configure-dj64 @@ -0,0 +1,14 @@ +export CPPFLAGS="`pkg-config --variable=xcppflags dj64`" +export CFLAGS="`pkg-config --cflags dj64` -g3" +export LIBS="`pkg-config --libs-only-L --libs-only-l dj64`" +export LDFLAGS="-Wl,-rpath=/usr/local/i386-pc-dj64/lib64 \ + -Wl,-rpath=/usr/i386-pc-dj64/lib64 \ + -nostdlib `pkg-config --libs-only-other dj64`" +./configure --host=x86_64-pc-linux-gnu \ + --prefix=`pkg-config --variable=dj64prefix dj64` \ + --libdir=`pkg-config --variable=libdir dj64` \ + --without-manpages \ + --without-cxx \ + --without-debug \ + --with-fallbacks=vt100,ansi,cygwin,linux,djgpp,djgpp203,djgpp204 \ + --disable-database diff --git a/contrib/ncurses/configure.in b/contrib/ncurses/configure.in new file mode 100644 index 00000000..05f3fdf7 --- /dev/null +++ b/contrib/ncurses/configure.in @@ -0,0 +1,2613 @@ +dnl*************************************************************************** +dnl Copyright 2018-2023,2024 Thomas E. Dickey * +dnl Copyright 1998-2017,2018 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl Author: Thomas E. Dickey 1995-on +dnl +dnl $Id: configure.in,v 1.786 2024/08/31 10:46:01 Rafael.Kitover Exp $ +dnl Process this file with autoconf to produce a configure script. +dnl +dnl For additional information, see +dnl https://invisible-island.net/autoconf/ +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl +dnl --------------------------------------------------------------------------- +AC_PREREQ(2.52.20210101) +AC_REVISION($Revision: 1.786 $) +AC_INIT(ncurses/base/lib_initscr.c) +AC_CONFIG_HEADER(include/ncurses_cfg.h:include/ncurses_cfg.hin) + +AC_DEFUN([AC_PATH_XTRA],[])dnl ignore dependencies on this + +CF_TOP_BUILDDIR +CF_SUBST_NCURSES_VERSION +CF_VERSION_INFO(NCURSES,ncurses) + +CF_WITH_REL_VERSION(NCURSES) +CF_NCURSES_WITH_ABI_VERSION + +CF_WITH_SYSTYPE + +### Save the given $CFLAGS to allow user-override. +cf_user_CFLAGS="$CFLAGS" + +### Default install-location +CF_CFG_DEFAULTS +### Defaults for ncurses ABI +CF_ABI_DEFAULTS + +### override ABI version, e.g., packagers +CF_WITH_ABI_ALTERED + +### Checks for programs. +CF_WITH_ADA +AC_PROG_CPP +AC_PROG_GCC_TRADITIONAL +CF_PROG_CC_C_O(CC,[$CFLAGS $CPPFLAGS]) +CF_PROG_LDCONFIG + +dnl DEFECT in autoconf 2.12: an attempt to set policy, this breaks the +dnl configure script by not letting us test if C++ +dnl is present, making this option necessary. +AC_MSG_CHECKING(if you want to ensure bool is consistent with C++) +AC_ARG_WITH(cxx, + [ --without-cxx do not adjust ncurses bool to match C++], + [cf_with_cxx=$withval], + [cf_with_cxx=yes]) +AC_MSG_RESULT($cf_with_cxx) +if test "X$cf_with_cxx" = Xno ; then + CXX="" + GXX="" +else + # with autoconf 2.13, we can change the error to a warning: + pushdef([AC_MSG_ERROR], + [AC_MSG_RESULT(no) + AC_MSG_WARN([You don't have any C++ compiler, too bad]) + cf_with_cxx=no; CXX=""; GXX="";])dnl + AC_PROG_CXX + popdef([AC_MSG_ERROR])dnl + + AC_LANG_PUSH(C++) + if test "x$cf_with_cxx" != xno + then + # Several of the C++ configurations do not work, particularly when + # cross-compiling (20140913 -TD) + AC_MSG_CHECKING(if $CXX works) + + save_CPPFLAGS="$CPPFLAGS" + eval cf_includedir=${includedir} + CPPFLAGS="$CPPFLAGS -I${cf_includedir}" + AC_TRY_COMPILE([ +#include +#include +], + [ + printf("Hello world!\n") + ], + [cf_cxx_works=yes], + [cf_cxx_works=no]) + CPPFLAGS="$save_CPPFLAGS" + + AC_MSG_RESULT($cf_cxx_works) + if test "x$cf_cxx_works" = xno + then + AC_MSG_WARN([Ignore $CXX, since it cannot compile hello-world.]) + cf_with_cxx=no; CXX=""; GXX=""; + fi + fi + AC_LANG_POP + + # autoconf 2.5x removed the error (hardcoding it to g++, or just blank) + if test "$CXX" = "g++" ; then + AC_PATH_PROG(CXX,g++) + fi + case "x$CXX" in + (x|xg++) + AC_MSG_WARN([You don't have any C++ compiler, too bad]) + cf_with_cxx=no; CXX=""; GXX=""; + ;; + esac +fi + +CF_GXX_VERSION +case "$GXX_VERSION" in +([[1-9]][[0-9]].*) + ;; +(1.*|2.[[0-6]]*) + AC_MSG_WARN(templates do not work) + ;; +esac + +AC_MSG_CHECKING(if you want to build C++ binding and demo) +AC_ARG_WITH(cxx-binding, + [ --without-cxx-binding do not build C++ binding and demo], + [cf_with_cxx_binding=$withval], + [cf_with_cxx_binding=$cf_with_cxx]) +AC_MSG_RESULT($cf_with_cxx_binding) + +AC_MSG_CHECKING(if you want to build with Ada) +AC_MSG_RESULT($cf_with_ada) + +AC_MSG_CHECKING(if you want to install terminal database) +AC_ARG_ENABLE(db-install, + [ --disable-db-install suppress install of terminal database], + [cf_with_db_install=$enableval], + [cf_with_db_install=yes]) +AC_MSG_RESULT($cf_with_db_install) + +AC_MSG_CHECKING(if you want to install manpages) +AC_ARG_WITH(manpages, + [ --without-manpages suppress install of manpages], + [cf_with_manpages=$withval], + [cf_with_manpages=yes]) +AC_MSG_RESULT($cf_with_manpages) + +AC_MSG_CHECKING(if you want to build programs such as tic) +AC_ARG_WITH(progs, + [ --without-progs suppress build/install with programs (e.g., tic)], + [cf_with_progs=$withval], + [cf_with_progs=yes]) +AC_MSG_RESULT($cf_with_progs) + +AC_MSG_CHECKING(if you want to build test-programs) +AC_ARG_WITH(tests, + [ --without-tests suppress build/install with test-programs], + [cf_with_tests=$withval], + [cf_with_tests=yes]) +AC_MSG_RESULT($cf_with_tests) + +AC_MSG_CHECKING(if you wish to install curses.h) +AC_ARG_WITH(curses-h, + [ --without-curses-h install curses.h as ncurses.h only], + [with_curses_h=$withval], + [with_curses_h=yes]) +AC_MSG_RESULT($with_curses_h) + +modules_to_build="ncurses" +test "X$cf_with_progs" != Xno && modules_to_build="$modules_to_build progs" +modules_to_build="$modules_to_build panel menu form" + +AC_ARG_PROGRAM + +CF_PROG_AWK +CF_PROG_INSTALL +CF_PROG_LINT +CF_PROG_LN_S + +AC_SYS_LONG_FILE_NAMES + +# Provide for renaming "ncurses5-config" to "ncurses5X-config", etc., in case +# of package conflict. +cf_config_suffix= +AC_ARG_WITH(config-suffix, + [ --with-config-suffix=X name ncurses*X-config file with X], + [case "x$withval" in + (xyes|xno) + AC_MSG_WARN(expected a value for config-suffix option) + ;; + (*) cf_config_suffix="$withval" + ;; + esac]) +AC_SUBST(cf_config_suffix) + +# If we find pkg-config, check if we should install the ".pc" files. +CF_PKG_CONFIG +CF_WITH_PKG_CONFIG_LIBDIR +CF_ENABLE_PC_FILES +if test -z "$MAKE_PC_FILES" +then + AC_MSG_CHECKING(for suffix to add to pkg-config files) +AC_ARG_WITH(pc-suffix, + [[ --with-pc-suffix[=XXX] suffix pkg-config files with XXX]], + [case "x$withval" in + (xyes|xno) + PC_MODULE_SUFFIX= + ;; + (*) PC_MODULE_SUFFIX="$withval" + ;; + esac]) + test -z "$PC_MODULE_SUFFIX" && PC_MODULE_SUFFIX=none + AC_MSG_RESULT($PC_MODULE_SUFFIX) + test "$PC_MODULE_SUFFIX" = none && PC_MODULE_SUFFIX= + AC_SUBST(PC_MODULE_SUFFIX) +fi + +AC_MSG_CHECKING(if we should assume mixed-case filenames) +AC_ARG_ENABLE(mixed-case, + [ --enable-mixed-case tic should assume mixed-case filenames], + [enable_mixedcase=$enableval], + [enable_mixedcase=auto]) +AC_MSG_RESULT($enable_mixedcase) +if test "$enable_mixedcase" = "auto" ; then + CF_MIXEDCASE_FILENAMES +else + cf_cv_mixedcase=$enable_mixedcase + if test "x$enable_mixedcase" = "xyes" ; then + AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if tic should assume mixed-case filenames]) + fi +fi + +# do this after mixed-case option (tags/TAGS is not as important as tic). +AC_PROG_MAKE_SET +CF_MAKE_PHONY +CF_MAKE_TAGS +CF_MAKEFLAGS + +dnl These are standard among *NIX systems, but not when cross-compiling +AC_CHECK_TOOL(RANLIB, ranlib, ':') +AC_CHECK_TOOL(LD, ld, ld) +AC_CHECK_TOOL(AR, ar, ar) +AC_CHECK_TOOL(NM, nm, nm) +CF_AR_FLAGS + +CF_INSTALL_PREFIX + +############################################################################### +CF_HELP_MESSAGE(Build-Tools Needed to Compile Temporary Applications for Cross-compiling:) +# If we're cross-compiling, allow the user to override the tools and their +# options. The configure script is oriented toward identifying the host +# compiler, etc., but we need a build compiler to generate parts of the source. + +case "$cf_cv_system_name" in +(*-msvc*) + LDFLAGS="$LDFLAGS user32.lib" + export LDFLAGS + ;; +esac + +CF_BUILD_CC + +############################################################################### +CF_HELP_MESSAGE(Options to Specify the Libraries Built/Used:) + +### Options to allow the user to specify the set of libraries which are used. +### Use "--without-normal --with-shared" to allow the default model to be +### shared, for example. +cf_list_models="" +AC_SUBST(cf_list_models)dnl the complete list of models ("normal debug") + +CF_WITH_LIBTOOL +if test "$with_libtool" != "no" ; then + +cf_list_models="$cf_list_models libtool" + +else + +AC_MSG_CHECKING(if you want to build shared libraries) +AC_ARG_WITH(shared, + [ --with-shared generate shared-libraries], + [with_shared=$withval], + [with_shared=no]) +AC_MSG_RESULT($with_shared) +test "x$with_shared" = "xyes" && cf_list_models="$cf_list_models shared" + +AC_MSG_CHECKING(if you want to build static libraries) +AC_ARG_WITH(normal, + [ --with-normal generate normal-libraries (default)], + [with_normal=$withval], + [with_normal=yes]) +AC_MSG_RESULT($with_normal) +test "x$with_normal" = "xyes" && cf_list_models="$cf_list_models normal" + +AC_MSG_CHECKING(if you want to build debug libraries) +AC_ARG_WITH(debug, + [ --with-debug generate debug-libraries (default)], + [with_debug=$withval], + [with_debug=yes]) +AC_MSG_RESULT($with_debug) +test "x$with_debug" = "xyes" && cf_list_models="$cf_list_models debug" + +AC_MSG_CHECKING(if you want to build profiling libraries) +AC_ARG_WITH(profile, + [ --with-profile generate profile-libraries], + [with_profile=$withval], + [with_profile=no]) +AC_MSG_RESULT($with_profile) +test "x$with_profile" = "xyes" && cf_list_models="$cf_list_models profile" + +fi + +if test "X$cf_with_cxx_binding" != Xno; then +if test "x$with_shared" = "xyes"; then +AC_MSG_CHECKING(if you want to build C++ shared libraries) +AC_ARG_WITH(cxx-shared, + [ --with-cxx-shared generate C++ shared-libraries], + [with_shared_cxx=$withval], + [with_shared_cxx=no]) +AC_MSG_RESULT($with_shared_cxx) +fi +fi + +############################################################################### + +AC_MSG_CHECKING(for specified models) +test -z "$cf_list_models" && cf_list_models=normal +dnl If we use libtool to generate libraries, then it must be the only +dnl specified model. +test "$with_libtool" != "no" && cf_list_models=libtool +AC_MSG_RESULT($cf_list_models) + +### Use the first model as the default, and save its suffix for use in building +### up test-applications. +AC_MSG_CHECKING(for default model) +DFT_LWR_MODEL=`echo "$cf_list_models" | $AWK '{print $1}'` +AC_MSG_RESULT($DFT_LWR_MODEL) + +CF_UPPER(DFT_UPR_MODEL,$DFT_LWR_MODEL)dnl + +AC_SUBST(DFT_LWR_MODEL)dnl the default model ("normal") +AC_SUBST(DFT_UPR_MODEL)dnl the default model ("NORMAL") + +TICS_NAME=tic +AC_SUBST(TICS_NAME) + +TINFO_NAME=tinfo +AC_SUBST(TINFO_NAME) + +LIB_NAME=ncurses +AC_SUBST(LIB_NAME) + +LIB_DIR=../lib +LIB_2ND=../../lib + +CF_WITH_LIB_PREFIX(cf_prefix) + +LIB_SUFFIX= +AC_SUBST(LIB_SUFFIX) +CF_PATHSEP + +# headers needed for checks... +AC_CHECK_DECL(exit) +AC_HEADER_DIRENT + +############################################################################### + +AC_MSG_CHECKING(if you want to build a separate terminfo library) +AC_ARG_WITH(termlib, + [ --with-termlib generate separate terminfo library], + [with_termlib=$withval], + [with_termlib=no]) +AC_MSG_RESULT($with_termlib) + +AC_MSG_CHECKING(if you want to build a separate tic library) +AC_ARG_WITH(ticlib, + [ --with-ticlib generate separate tic library], + [with_ticlib=$withval], + [with_ticlib=no]) +AC_MSG_RESULT($with_ticlib) + +dnl Not all ports of gcc support the -g option + +if test X"$CC_G_OPT" = X"" ; then + CC_G_OPT='-g' + test -n "$GCC" && test "x${ac_cv_prog_cc_g}" != xyes && CC_G_OPT='' +fi +AC_SUBST(CC_G_OPT) + +if test X"$CXX_G_OPT" = X"" ; then + CXX_G_OPT='-g' + test -n "$GXX" && test "x${ac_cv_prog_cxx_g}" != xyes && CXX_G_OPT='' +fi +AC_SUBST(CXX_G_OPT) + +AC_MSG_CHECKING(for default loader flags) +case "$DFT_LWR_MODEL" in +(libtool) LD_MODEL='' ;; +(normal) LD_MODEL='' ;; +(debug) LD_MODEL=$CC_G_OPT ;; +(profile) LD_MODEL='-pg';; +(shared) LD_MODEL='' ;; +esac +AC_SUBST(LD_MODEL)dnl the type of link (e.g., -g or -pg) +AC_MSG_RESULT([${LD_MODEL:-(none)}]) + +case "$DFT_LWR_MODEL" in +(shared) +CF_ENABLE_RPATH +AC_MSG_CHECKING(if shared libraries should be relinked during install) +AC_ARG_ENABLE(relink, +[ --disable-relink relink shared libraries during install], +[cf_cv_do_relink=$enableval], +[cf_cv_do_relink=yes]) +AC_MSG_RESULT($cf_cv_do_relink) + ;; +esac + +# we will build libraries one-level down. +rel_builddir=.. +CF_SHARED_OPTS +for model in $cf_list_models ; do + case "$model" in + (libtool) + CF_WITH_LIBTOOL_OPTS + CF_WITH_EXPORT_SYMS + ;; + (shared) + if test "$CC_SHARED_OPTS" = "unknown"; then + AC_ERROR(Shared libraries are not supported in this version) + fi + # workaround for inept transition to PIE vs PIC... + AC_MSG_CHECKING(if current CFLAGS link properly) + AC_TRY_LINK( + [#include ], + [printf("Hello work\\n");], + [cf_cflags_work=yes], + [cf_cflags_work=no]) + AC_MSG_RESULT($cf_cflags_work) + if test "$cf_cflags_work" = no + then + CF_VERBOSE(try to work around by appending shared-options) + CFLAGS="$CFLAGS $CC_SHARED_OPTS" + fi + CF_WITH_VERSIONED_SYMS + ;; + esac +done + +### Checks for special libraries, must be done up-front. +SHLIB_LIST="" +CF_WITH_GPM +if test "$with_gpm" != no ; then + AC_MSG_CHECKING(if you want to load GPM dynamically) + AC_ARG_WITH(dlsym, + [ --without-dlsym do not use dlsym() to load GPM dynamically], + [with_dlsym=$withval], + [with_dlsym=yes]) + AC_MSG_RESULT($with_dlsym) + if test "x$with_dlsym" = xyes ; then + CF_FUNC_DLSYM + if test "x$with_gpm" != xyes ; then + CF_VERBOSE(assuming soname for gpm is $with_gpm) + cf_cv_gpm_soname="$with_gpm" + else + CF_LIB_SONAME([#include ],[if (Gpm_Open(0,0)) Gpm_Close();],gpm) + fi + test "$cf_cv_gpm_soname" != "unknown" && AC_DEFINE_UNQUOTED(LIBGPM_SONAME,"$cf_cv_gpm_soname",[Define as needed to set the gpm share library soname]) + SHLIB_LIST="-ldl $SHLIB_LIST" + CF_ADD_LIB(dl,PRIVATE_LIBS) + else + SHLIB_LIST="-lgpm $SHLIB_LIST" + CF_ADD_LIB(gpm,TEST_LIBS) + CF_ADD_LIB(gpm,PRIVATE_LIBS) + fi + AC_DEFINE(HAVE_LIBGPM,1,[Define to 1 if we have the gpm library]) + CF_CHECK_GPM_WGETCH +fi + +CF_WITH_PCRE2 +CF_WITH_SYSMOUSE + +# pretend that ncurses==ncursesw==ncursest +AC_MSG_CHECKING(if you want to disable library suffixes) +CF_ARG_DISABLE(lib-suffixes, + [ --disable-lib-suffixes disable library suffixes], + [disable_lib_suffixes=yes], + [disable_lib_suffixes=no], + no) +AC_MSG_RESULT($disable_lib_suffixes) + +### If we're building with rpath, try to link non-standard libs that way too. +if test "$DFT_LWR_MODEL" = "shared" && test "x$cf_cv_enable_rpath" != xno; then + CF_DISABLE_RPATH_HACK +fi + +### Depending on the system, someone may use rpath to build ncurses but not +# want users of the package to rely upon that feature. Give those people an +# option to suppress that detail from EXTRA_LDFLAGS. +EXTRA_PKG_LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS" +if test -n "$EXTRA_PKG_LDFLAGS" +then + AC_MSG_CHECKING(if you want to disable extra LDFLAGS for package-scripts) + CF_ARG_DISABLE(pkg-ldflags, + [ --disable-pkg-ldflags disable extra LDFLAGS for package-scripts], + [disable_pkg_ldflags=yes], + [disable_pkg_ldflags=no], + no) + AC_MSG_RESULT($disable_pkg_ldflags) + test "$disable_pkg_ldflags" = yes && EXTRA_PKG_LDFLAGS= +fi +AC_SUBST(EXTRA_PKG_LDFLAGS) + +############################################################################### +CF_HELP_MESSAGE(Fine-Tuning Your Configuration:) + +### use option --with-extra-suffix to append suffix to headers and libraries +AC_MSG_CHECKING(for extra suffix to append to header/library paths) +EXTRA_SUFFIX= +AC_ARG_WITH(extra-suffix, + [[ --with-extra-suffix[=X] append extra suffix X to header/library paths]], + [case x$withval in + (xno) + ;; + (xyes|x) + EXTRA_SUFFIX=$cf_cv_abi_version + ;; + (*) + EXTRA_SUFFIX=$withval + ;; + esac + ]) +AC_MSG_RESULT([${EXTRA_SUFFIX:-(none)}]) +AC_SUBST(EXTRA_SUFFIX) + +### use option --disable-overwrite to leave out the link to -lcurses +AC_MSG_CHECKING(if you wish to install ncurses overwriting curses) +AC_ARG_ENABLE(overwrite, + [ --disable-overwrite put headers in subdir, omit link to -lcurses], + [with_overwrite=$enableval], + [if test "$prefix" = "/usr" ; then with_overwrite=yes; else with_overwrite=no; fi]) +AC_MSG_RESULT($with_overwrite) + +AC_MSG_CHECKING(if external terminfo-database is used) +AC_ARG_ENABLE(database, + [ --disable-database do not use terminfo, only fallbacks/termcap], + [use_database=$enableval], + [use_database=yes]) +AC_MSG_RESULT($use_database) + +case "$host_os" in +(os2*) + TERMINFO_SRC='${top_srcdir}/misc/emx.src' + ;; +(*) + TERMINFO_SRC='${top_srcdir}/misc/terminfo.src' + ;; +esac +AC_SUBST(TERMINFO_SRC) + +NCURSES_USE_DATABASE=0 +if test "$use_database" != no ; then + NCURSES_USE_DATABASE=1 + + AC_MSG_CHECKING(which terminfo source-file will be installed) + AC_ARG_WITH(database, + [ --with-database=XXX specify terminfo source to install], + [TERMINFO_SRC=$withval]) + AC_MSG_RESULT($TERMINFO_SRC) + + AC_MSG_CHECKING(whether to use hashed database instead of directory/tree) + AC_ARG_WITH(hashed-db, + [ --with-hashed-db specify hashed-database library],, + [with_hashed_db=no]) + AC_MSG_RESULT($with_hashed_db) +else + with_hashed_db=no +fi +AC_SUBST(NCURSES_USE_DATABASE) + +AC_MSG_CHECKING(for list of fallback terminal descriptions) +AC_ARG_WITH(fallbacks, + [ --with-fallbacks=XXX specify list of fallback terminal descriptions], + [with_fallback=$withval], + [with_fallback=]) +AC_MSG_RESULT([${with_fallback:-(none)}]) + +case ".$with_fallback" in +(.|.no) + FALLBACK_LIST= + ;; +(.yes) + AC_MSG_WARN(expected a list of terminal descriptions) + ;; +(*) + FALLBACK_LIST=`echo "$with_fallback" | sed -e 's/,/ /g'` + ;; +esac + +# The fallback feature in ncurses relies upon tic/infocmp outside the build +# tree for generating the terminal descriptions that will be compiled into the +# library. If your toolchain is old, it may not handle current terminal +# databases. Use configure-options to point to the tools which will be used, +# rather than the first ones found on the $PATH. +AC_CHECK_TOOL(TIC, tic) +AC_CHECK_TOOL(INFOCMP, infocmp) +if test -n "$FALLBACK_LIST" +then + CF_WITH_PATH_PROG(TIC, tic, [for fallbacks], $PATH:/usr/local/ncurses/bin) + CF_WITH_PATH_PROG(INFOCMP, infocmp, [for fallbacks], $PATH:/usr/local/ncurses/bin) + test -z "$TIC" && FALLBACK_LIST= + test -z "$INFOCMP" && FALLBACK_LIST= + if test -z "$FALLBACK_LIST" + then + AC_MSG_WARN(ignoring fallback option because tic/infocmp are not available) + fi +fi +AC_SUBST(TIC) +AC_SUBST(INFOCMP) + +USE_FALLBACKS= +test -z "$FALLBACK_LIST" && USE_FALLBACKS="#" +AC_SUBST(FALLBACK_LIST) +AC_SUBST(USE_FALLBACKS) + +AC_MSG_CHECKING(if you want modern xterm or antique) +AC_ARG_WITH(xterm-new, + [ --without-xterm-new specify if xterm terminfo should be old version], + [with_xterm_new=$withval], + [with_xterm_new=yes]) +case "$with_xterm_new" in +(no) with_xterm_new=xterm-old;; +(*) with_xterm_new=xterm-new;; +esac +AC_MSG_RESULT($with_xterm_new) +WHICH_XTERM=$with_xterm_new +AC_SUBST(WHICH_XTERM) + +case $host_os in +(*linux-gnu|*cygwin|*mingw32|*msys) + want_xterm_kbs=DEL + ;; +(*) + want_xterm_kbs=BS + ;; +esac + +AC_MSG_CHECKING(if xterm backspace sends BS or DEL) +AC_ARG_WITH(xterm-kbs, + [[ --with-xterm-kbs[=XXX] specify if xterm backspace sends BS or DEL]], + [with_xterm_kbs=$withval], + [with_xterm_kbs=auto]) +case x$with_xterm_kbs in +(xyes|xno|xBS|xbs|x8) + with_xterm_kbs=BS + ;; +(xDEL|xdel|x127) + with_xterm_kbs=DEL + ;; +(xauto) + with_xterm_kbs=$want_xterm_kbs + ;; +(*) + with_xterm_kbs=$withval + ;; +esac +AC_MSG_RESULT($with_xterm_kbs) +XTERM_KBS=$with_xterm_kbs +AC_SUBST(XTERM_KBS) + +if test "x$with_xterm_kbs" != "x$want_xterm_kbs" +then + AC_MSG_WARN([expected --with-xterm-kbs=$want_xterm_kbs for $host_os, have $with_xterm_kbs]) +fi + +MAKE_TERMINFO= +if test "$use_database" = no ; then + TERMINFO="${datadir}/terminfo" + MAKE_TERMINFO="#" +else + +AC_MSG_CHECKING(for list of terminfo directories) +CF_WITH_PATHLIST(terminfo-dirs, + [ --with-terminfo-dirs=XXX specify list of terminfo directories], + TERMINFO_DIRS, + DATADIR/terminfo, + ${datadir}/terminfo) +AC_MSG_RESULT($TERMINFO_DIRS) +test -n "$TERMINFO_DIRS" && AC_DEFINE_UNQUOTED(TERMINFO_DIRS,"$TERMINFO_DIRS",[Define as needed to predefine the TERMINFO_DIR searchlist]) + +case "x$TERMINFO" in +x???:*) + AC_MSG_WARN(ignoring non-directory/file TERMINFO value) + unset TERMINFO + ;; +esac + +AC_MSG_CHECKING(for default terminfo directory) +CF_WITH_PATH(default-terminfo-dir, + [ --with-default-terminfo-dir=DIR default terminfo directory], + TERMINFO, + DATADIR/terminfo, + ${datadir}/terminfo) +AC_MSG_RESULT($TERMINFO) +AC_DEFINE_UNQUOTED(TERMINFO,"$TERMINFO",[Define to set the default terminal database path]) + +fi + +AC_SUBST(TERMINFO) +AC_SUBST(MAKE_TERMINFO) + +### use option --disable-big-core to make tic run on small machines +### We need 4Mb, check if we can allocate 50% more than that. +AC_MSG_CHECKING(if big-core option selected) +AC_ARG_ENABLE(big-core, + [ --disable-big-core assume machine has little memory], + [with_big_core=$enableval], + [AC_TRY_RUN([ +#include +#include +int main(void) { + unsigned long n = 6000000L; + char *s = malloc(n); + if (s != 0) + s[0] = s[n-1] = 0; + ${cf_cv_main_return:-return}(s == 0); +}], + [with_big_core=yes], + [with_big_core=no], + [with_big_core=no])]) +AC_MSG_RESULT($with_big_core) +test "x$with_big_core" = "xyes" && AC_DEFINE(HAVE_BIG_CORE,1,[Define to 1 if machine has ample memory for tic]) + +### ISO C only guarantees 512-char strings, we have tables which load faster +### when constructed using "big" strings. More than the C compiler, the awk +### program is a limit on most vendor UNIX systems. Check that we can build. +AC_MSG_CHECKING(if big-strings option selected) +AC_ARG_ENABLE(big-strings, + [ --disable-big-strings assume compiler has only standard-size strings], + [with_big_strings=$enableval], + [CF_AWK_BIG_PRINTF(12000,with_big_strings)]) +AC_MSG_RESULT($with_big_strings) + +USE_BIG_STRINGS=0 +test "x$with_big_strings" = "xyes" && USE_BIG_STRINGS=1 +AC_SUBST(USE_BIG_STRINGS) + +### use option --enable-termcap to compile in the termcap fallback support +AC_MSG_CHECKING(if you want termcap-fallback support) +AC_ARG_ENABLE(termcap, + [ --enable-termcap compile in termcap fallback support], + [with_termcap=$enableval], + [with_termcap=no]) +AC_MSG_RESULT($with_termcap) + +NCURSES_USE_TERMCAP=0 +if test "x$with_termcap" != "xyes" ; then + if test "$use_database" = no ; then + if test -z "$with_fallback" ; then + AC_ERROR(You have disabled the database w/o specifying fallbacks) + fi + fi + AC_DEFINE(PURE_TERMINFO,1,[Define to 1 if we should support only terminfo]) +else + + if test "$with_ticlib" != no ; then + AC_ERROR(Options --with-ticlib and --enable-termcap cannot be combined) + fi + + NCURSES_USE_TERMCAP=1 + AC_MSG_CHECKING(for list of termcap files) + CF_WITH_PATHLIST(termpath, + [ --with-termpath=XXX specify list of termcap files], + TERMPATH, + /etc/termcap:/usr/share/misc/termcap) + AC_MSG_RESULT($TERMPATH) + test -n "$TERMPATH" && AC_DEFINE_UNQUOTED(TERMPATH,"$TERMPATH",[Define to set the termcap searchlist]) + + ### use option --enable-getcap to use a hacked getcap for reading termcaps + AC_MSG_CHECKING(if fast termcap-loader is needed) + AC_ARG_ENABLE(getcap, + [ --enable-getcap fast termcap load, no xrefs to terminfo], + [with_getcap=$enableval], + [with_getcap=no]) + AC_MSG_RESULT($with_getcap) + test "x$with_getcap" = "xyes" && AC_DEFINE(USE_GETCAP,1,[Define to 1 to use fast termcap-loader]) + + AC_MSG_CHECKING(if translated termcaps will be cached in ~/.terminfo) + AC_ARG_ENABLE(getcap-cache, + [ --enable-getcap-cache cache translated termcaps in ~/.terminfo], + [with_getcap_cache=$enableval], + [with_getcap_cache=no]) + AC_MSG_RESULT($with_getcap_cache) + test "x$with_getcap_cache" = "xyes" && AC_DEFINE(USE_GETCAP_CACHE,1,[Define to 1 if translated termcap should be stored in $HOME/.terminfo]) + +fi +AC_SUBST(NCURSES_USE_TERMCAP) + +### Use option --disable-home-terminfo to completely remove ~/.terminfo +AC_MSG_CHECKING(if ~/.terminfo is wanted) +AC_ARG_ENABLE(home-terminfo, + [ --disable-home-terminfo drop ~/.terminfo from terminfo search-path], + [with_home_terminfo=$enableval], + [with_home_terminfo=yes]) +AC_MSG_RESULT($with_home_terminfo) +test "x$with_home_terminfo" = "xyes" && AC_DEFINE(USE_HOME_TERMINFO,1,[Define to 1 if $HOME/.terminfo feature is wanted]) + +AC_MSG_CHECKING(if you want to permit root to use ncurses environment variables) +AC_ARG_ENABLE(root-environ, + [ --disable-root-environ restrict root use of ncurses environment variables], + [with_root_environ=$enableval], + [with_root_environ=yes]) +AC_MSG_RESULT($with_root_environ) +test "x$with_root_environ" = xyes && AC_DEFINE(USE_ROOT_ENVIRON,1,[Define to 1 if root/setuid application is allowed to use ncurses environment]) + +AC_MSG_CHECKING(if you want to permit setuid programs to access all files) +AC_ARG_ENABLE(root-access, + [ --disable-root-access restrict file-access when running setuid], + [with_root_access=$enableval], + [with_root_access=yes]) +AC_MSG_RESULT($with_root_access) +test "x$with_root_access" = xyes && AC_DEFINE(USE_ROOT_ACCESS,1,[Define to 1 if setuid is allowed all file-access]) + +AC_MSG_CHECKING(if you want to permit setuid use of ncurses environment variables) +AC_ARG_ENABLE(setuid-environ, + [ --disable-setuid-environ restrict setuid use of ncurses environment variables], + [with_setuid_environ=$enableval], + [with_setuid_environ=$with_root_environ]) +AC_MSG_RESULT($with_setuid_environ) +test "x$with_setuid_environ" = xyes && AC_DEFINE(USE_SETUID_ENVIRON,1,[Define to 1 if setuid/setgid application is allowed to use ncurses environment]) + +### Use option --enable-symlinks to make tic use symlinks, not hard links +### to reduce storage requirements for the terminfo database. +CF_LINK_FUNCS + +with_links=no +with_symlinks=no + +# soft links (symbolic links) are useful for some systems where hard links do +# not work, or to make it simpler to copy terminfo trees around. +if test "x$ac_cv_func_symlink" = xyes ; then + AC_MSG_CHECKING(if tic should use symbolic links) + AC_ARG_ENABLE(symlinks, + [ --enable-symlinks make tic use symbolic links not hard links], + [with_symlinks=$enableval], + [with_symlinks=no]) + AC_MSG_RESULT($with_symlinks) +fi + +# If we have hard links and did not choose to use soft links instead, there is +# no reason to make this choice optional - use the hard links. +if test "$with_symlinks" = no ; then + AC_MSG_CHECKING(if tic should use hard links) + if test "x$ac_cv_func_link" = xyes ; then + with_links=yes + else + with_links=no + fi + AC_MSG_RESULT($with_links) +fi + +test "x$with_links" = xyes && AC_DEFINE(USE_LINKS,1,[Define to 1 if hardlinks should be used in terminfo database]) +test "x$with_symlinks" = xyes && AC_DEFINE(USE_SYMLINKS,1,[Define to 1 if symbolic links should be used in terminfo database]) + +### use option --enable-broken-linker to force on use of broken-linker support +CF_ENABLE_BROKEN_LINKER + +### use option --enable-bsdpad to have tputs process BSD-style prefix padding +AC_MSG_CHECKING(if tputs should process BSD-style prefix padding) +AC_ARG_ENABLE(bsdpad, + [ --enable-bsdpad recognize BSD-style prefix padding], + [with_bsdpad=$enableval], + [with_bsdpad=no]) +AC_MSG_RESULT($with_bsdpad) +test "x$with_bsdpad" = xyes && AC_DEFINE(BSD_TPUTS,1,[Define to 1 to recognize BSD-style prefix padding]) + +### use option --enable-widec to turn on use of wide-character support +NCURSES_CH_T=chtype +NCURSES_LIBUTF8=0 + +NEED_WCHAR_H=0 +NCURSES_MBSTATE_T=0 +NCURSES_WCHAR_T=0 +NCURSES_WINT_T=0 + +# Check to define _XOPEN_SOURCE "automatically" +CPPFLAGS_before_XOPEN="$CPPFLAGS" +CF_XOPEN_SOURCE(600) +CPPFLAGS_after_XOPEN="$CPPFLAGS" + +# Work around breakage on OS X +CF_SIGWINCH + +# Checks for CODESET support. +AM_LANGINFO_CODESET + +# use these variables to work around a defect in gcc's fixincludes. +NCURSES_OK_WCHAR_T= +NCURSES_OK_WINT_T= + +AC_MSG_CHECKING(if you want wide-character code) +AC_ARG_ENABLE(widec, + [ --disable-widec compile without wide character and UTF-8 support], + [with_widec=$enableval], + [with_widec=$cf_dft_widec]) +AC_MSG_RESULT($with_widec) + +NCURSES_WCWIDTH_GRAPHICS=1 +AC_SUBST(NCURSES_WCWIDTH_GRAPHICS) + +if test "x$with_widec" = xyes ; then + if test "x$disable_lib_suffixes" = xno ; then + LIB_SUFFIX="w${LIB_SUFFIX}" + fi + AC_DEFINE(USE_WIDEC_SUPPORT,1,[Define to 1 to compile with wide character and UTF-8 support]) + AC_DEFINE(NCURSES_WIDECHAR,1,[Define to 1 to compile with wide character and UTF-8 support]) + case "$CPPFLAGS" in + (*_XOPEN_SOURCE=*) + ;; + (*) + AC_MSG_WARN(_XOPEN_SOURCE feature test macro appears to be predefined) + # CPPFLAGS="$CPPFLAGS -DNCURSES_WIDECHAR" + CPPFLAGS_after_XOPEN="$CPPFLAGS_after_XOPEN -DNCURSES_WIDECHAR" + ;; + esac + + CF_CHECK_WCHAR_H + CF_CHECK_WCWIDTH_GRAPHICS + test "$cf_cv_wcwidth_graphics" = no && NCURSES_WCWIDTH_GRAPHICS=0 + + # with_overwrite=no + NCURSES_CH_T=cchar_t + AC_CHECK_FUNCS(putwc btowc wctob wmemchr mbtowc wctomb mblen mbrlen mbrtowc wcsrtombs mbsrtowcs wcstombs mbstowcs) + if test "x$ac_cv_func_putwc" != xyes ; then + CF_UTF8_LIB + if test "$cf_cv_utf8_lib" != no ; then + NCURSES_LIBUTF8=1 + fi + fi + CF_WCHAR_TYPE(mbstate_t, NCURSES_MBSTATE_T) + CF_WCHAR_TYPE(wchar_t, NCURSES_WCHAR_T, NCURSES_OK_WCHAR_T) + CF_WCHAR_TYPE(wint_t, NCURSES_WINT_T, NCURSES_OK_WINT_T) + + if test "$NCURSES_MBSTATE_T" != 0; then + AC_DEFINE(NEED_MBSTATE_T_DEF,1,[Define to 1 if we must declare mbstate_t]) + fi +fi +AC_SUBST(NCURSES_CH_T) +AC_SUBST(NCURSES_LIBUTF8) + +AC_SUBST(NEED_WCHAR_H) +AC_SUBST(NCURSES_MBSTATE_T) +AC_SUBST(NCURSES_WCHAR_T) +AC_SUBST(NCURSES_WINT_T) + +AC_SUBST(NCURSES_OK_WCHAR_T) +AC_SUBST(NCURSES_OK_WINT_T) + +### use option --disable-lp64 to allow long chtype +AC_MSG_CHECKING(whether to enable _LP64 definition in curses.h) +AC_ARG_ENABLE(lp64, + [ --disable-lp64 allow chtype to be long (ignore _LP64)], + [with_lp64=$enableval], + [with_lp64=$cf_dft_with_lp64]) +AC_MSG_RESULT($with_lp64) + +if test "x$with_lp64" = xyes ; then + cf_cv_enable_lp64=1 +else + cf_cv_enable_lp64=0 +fi +AC_SUBST(cf_cv_enable_lp64) + +CF_LARGEFILE + +### use option --disable-tparm-varargs to make tparm() conform to X/Open +AC_MSG_CHECKING(if you want tparm not to use X/Open fixed-parameter list) +AC_ARG_ENABLE(tparm-varargs, + [ --disable-tparm-varargs compile tparm() without varargs interface], + [with_tparm_varargs=$enableval], + [with_tparm_varargs=yes]) +AC_MSG_RESULT($with_tparm_varargs) +NCURSES_TPARM_VARARGS=0 +test "x$with_tparm_varargs" = xyes && NCURSES_TPARM_VARARGS=1 +AC_SUBST(NCURSES_TPARM_VARARGS) + +### use option --disable-tic-depends to make libtic not explicitly depend on ncurses/ncursesw +if test "$with_ticlib" != no ; then +AC_MSG_CHECKING(if you want tic library to use explicit dependency on ncurses$LIB_SUFFIX library) +AC_ARG_ENABLE(tic-depends, + [ --disable-tic-depends link tic library without explicit dependency on ncurses library], + [with_tic_depends=$enableval], + [with_tic_depends=yes]) +AC_MSG_RESULT($with_tic_depends) +else + with_tic_depends=no +fi + +### use option --enable-wattr-macros to enable wattr* macros in curses.h +AC_MSG_CHECKING(if you want to enable wattr* macros) +AC_ARG_ENABLE(wattr-macros, + [ --enable-wattr-macros enable wattr* macros], + [with_wattr_macros=$enableval], + [with_wattr_macros=no]) +if [[ "x$with_wattr_macros" != xyes ]]; then + NCURSES_WATTR_MACROS=0 + AC_MSG_RESULT(no) +else + NCURSES_WATTR_MACROS=1 + AC_MSG_RESULT(yes) +fi +AC_SUBST(NCURSES_WATTR_MACROS) + +CF_WITH_X11_RGB + +### use option --with-bool to override bool's type +CF_WITH_TYPE(bool, + [ --with-bool=TYPE fall back to TYPE for curses 'bool' typedef], + NCURSES_BOOL, + auto) + +AC_MSG_CHECKING(for alternate terminal capabilities file) +AC_ARG_WITH(caps, + [ --with-caps=alt compile with alternate Caps file], + [TERMINFO_CAPS=Caps.$withval], + [TERMINFO_CAPS=Caps]) +if test ! -f "${srcdir}/include/${TERMINFO_CAPS}" +then + AC_MSG_WARN(file not found: "${srcdir}/include/${TERMINFO_CAPS}") + TERMINFO_CAPS=Caps +fi +AC_MSG_RESULT($TERMINFO_CAPS) +AC_SUBST(TERMINFO_CAPS) + +### use option --with-chtype to override chtype's type +CF_WITH_TYPE(chtype, + [ --with-chtype=TYPE override type of chtype], + NCURSES_CHTYPE, + $cf_dft_chtype) + +### use option --with-ospeed to override ospeed's type +CF_WITH_TYPE(ospeed, + [ --with-ospeed=TYPE override type of ospeed variable], + NCURSES_OSPEED, + short) + +### use option --with-mmask-t to override mmask_t's type +CF_WITH_TYPE(mmask-t, + [ --with-mmask-t=TYPE override type of mmask_t], + NCURSES_MMASK_T, + $cf_dft_mmask_t) + +### use option --with-ccharw-max to override CCHARW_MAX size +AC_MSG_CHECKING(for size CCHARW_MAX) +AC_ARG_WITH(ccharw-max, + [ --with-ccharw-max=XXX override size CCHARW_MAX], + [NCURSES_CCHARW_MAX="$withval"], + [NCURSES_CCHARW_MAX=$cf_dft_ccharw_max]) +AC_MSG_RESULT($NCURSES_CCHARW_MAX) +AC_SUBST(NCURSES_CCHARW_MAX) + +AC_CHECK_SIZEOF([signed char]) +if test "$ac_cv_sizeof_signed_char" = 1 ; then + NCURSES_SBOOL="signed char" +else + NCURSES_SBOOL="char" +fi +AC_MSG_CHECKING(whether to use signed chars for Boolean array in term.h) +AC_ARG_ENABLE(signed-char, + [ --enable-signed-char use signed chars for Boolean array in term.h], + [with_signed_char=$enableval], + [with_signed_char=$cf_dft_signed_char]) +AC_MSG_RESULT($with_signed_char) +test "x$with_signed_char" != xyes && NCURSES_SBOOL="char" +AC_SUBST(NCURSES_SBOOL) + +### use option --with-tparm-arg to override tparm's argument type +CF_WITH_TYPE(tparm-arg, + [ --with-tparm-arg=TYPE override parameter type of tparm], + NCURSES_TPARM_ARG, + $cf_dft_tparm_arg) + +### Enable compiling-in rcs id's +AC_MSG_CHECKING(if RCS identifiers should be compiled-in) +AC_ARG_WITH(rcs-ids, + [ --with-rcs-ids compile-in RCS identifiers], + [with_rcs_ids=$withval], + [with_rcs_ids=no]) +AC_MSG_RESULT($with_rcs_ids) +test "x$with_rcs_ids" = xyes && AC_DEFINE(USE_RCS_IDS,1,[Define to 1 to compile-in RCS identifiers]) + +############################################################################### +CF_MAN_PAGES([ captoinfo clear infocmp infotocap reset tabs tic toe tput tset ]) + +############################################################################### +CF_HELP_MESSAGE(Extensions:) + +### Note that some functions (such as const) are normally disabled anyway. +AC_MSG_CHECKING(if you want to build with function extensions) +AC_ARG_ENABLE(ext-funcs, + [ --disable-ext-funcs disable function-extensions], + [with_ext_funcs=$enableval], + [with_ext_funcs=yes]) +AC_MSG_RESULT($with_ext_funcs) +if test "x$with_ext_funcs" = xyes ; then + NCURSES_EXT_FUNCS=1 + AC_DEFINE(NCURSES_EXT_FUNCS,1,[Define to 1 to enable ncurses extended functions]) + AC_DEFINE(HAVE_ASSUME_DEFAULT_COLORS,1,[Define to 1 to enable assume_default_colors() function in test-programs]) + AC_DEFINE(HAVE_CURSES_VERSION,1,[Define to 1 to enable curses_version() function in test-programs]) + AC_DEFINE(HAVE_HAS_KEY,1,[Define to 1 to enable has_key() function in test-programs]) + AC_DEFINE(HAVE_RESIZETERM,1,[Define to 1 to enable resizeterm() function in test-programs]) + AC_DEFINE(HAVE_RESIZE_TERM,1,[Define to 1 to enable resize_term() function in test-programs]) + AC_DEFINE(HAVE_TERM_ENTRY_H,1,[Define to 1 to enable term_entry() function in test-programs]) + AC_DEFINE(HAVE_USE_DEFAULT_COLORS,1,[Define to 1 to enable use_default_colors() function in test-programs]) + AC_DEFINE(HAVE_USE_SCREEN,1,[Define to 1 to enable use_screen() function in test-programs]) + AC_DEFINE(HAVE_USE_WINDOW,1,[Define to 1 to enable use_window() function in test-programs]) + AC_DEFINE(HAVE_WRESIZE,1,[Define to 1 to enable wresize() function in test-programs]) + GENERATED_EXT_FUNCS=generated +else + cf_dft_ext_spfuncs=no + cf_dft_ext_colors=no + NCURSES_EXT_FUNCS=0 + GENERATED_EXT_FUNCS= +fi +AC_SUBST(NCURSES_EXT_FUNCS) +AC_SUBST(GENERATED_EXT_FUNCS) + +AC_MSG_CHECKING(if you want to build with SCREEN extensions) +AC_ARG_ENABLE(sp-funcs, + [ --enable-sp-funcs enable SCREEN-extensions], + [with_sp_funcs=$enableval], + [with_sp_funcs=$cf_dft_ext_spfuncs]) +AC_MSG_RESULT($with_sp_funcs) +if test "x$with_sp_funcs" = xyes ; then + NCURSES_SP_FUNCS=1 + AC_DEFINE(NCURSES_SP_FUNCS,1,[Define to 1 to enable SCREEN-extensions]) + AC_DEFINE(HAVE_TPUTS_SP,1,[Define to 1 to enable tputs_sp() function in test-programs]) + GENERATED_SP_FUNCS=generated +else + NCURSES_SP_FUNCS=0 + GENERATED_SP_FUNCS= +fi +AC_SUBST(NCURSES_SP_FUNCS) +AC_SUBST(GENERATED_SP_FUNCS) + +AC_MSG_CHECKING(if you want to build with terminal-driver) +AC_ARG_ENABLE(term-driver, + [ --enable-term-driver enable terminal-driver], + [with_term_driver=$enableval], + [with_term_driver=no]) +AC_MSG_RESULT($with_term_driver) +if test "x$with_term_driver" = xyes ; then + AC_DEFINE(USE_TERM_DRIVER,1,[Define to 1 to enable terminal-driver]) + if test "x$with_termlib" != xno ; then + AC_MSG_ERROR(The term-driver option conflicts with the termlib option) + fi + if test "x$with_sp_funcs" != xyes ; then + AC_MSG_ERROR(The term-driver option relies upon sp-funcs) + fi +fi + +### use option --enable-const to turn on use of const beyond that in XSI. +AC_MSG_CHECKING(for extended use of const keyword) +AC_ARG_ENABLE(const, + [ --enable-const compile with extra/non-standard const], + [with_ext_const=$enableval], + [with_ext_const=$cf_dft_ext_const]) +AC_MSG_RESULT($with_ext_const) +NCURSES_CONST='/*nothing*/' +if test "x$with_ext_const" = xyes ; then + NCURSES_CONST=const +fi +AC_SUBST(NCURSES_CONST) + +### use option --enable-ext-colors to turn on use of colors beyond 16. +AC_MSG_CHECKING(if you want to use extended colors) +AC_ARG_ENABLE(ext-colors, + [ --enable-ext-colors compile for 256-color support], + [with_ext_colors=$enableval], + [with_ext_colors=$cf_dft_ext_colors]) +AC_MSG_RESULT($with_ext_colors) +NCURSES_EXT_COLORS=0 +if test "x$with_ext_colors" = xyes ; then + if test "x$with_widec" != xyes ; then + AC_MSG_WARN(This option applies only to wide-character library) + else + # cannot be ABI 5 since it changes sizeof(cchar_t) + CF_NCURSES_ABI_6 + NCURSES_EXT_COLORS=1 + AC_DEFINE(NCURSES_EXT_COLORS,1,[Define to 1 to compile for 256-color support]) + AC_DEFINE(HAVE_ALLOC_PAIR,1,[Define to 1 to enable alloc_pair() function]) + AC_DEFINE(HAVE_INIT_EXTENDED_COLOR,1,[Define to 1 to enable init_extended_color() function in test-programs]) + AC_DEFINE(HAVE_RESET_COLOR_PAIRS,1,[Define to 1 to enable reset_color_pairs() function in test-programs]) + fi +fi +AC_SUBST(NCURSES_EXT_COLORS) + +### use option --enable-ext-mouse to modify coding to support 5-button mice +AC_MSG_CHECKING(if you want to use extended mouse encoding) +AC_ARG_ENABLE(ext-mouse, + [ --enable-ext-mouse compile for extended mouse-encoding], + [with_ext_mouse=$enableval], + [with_ext_mouse=$cf_dft_ext_mouse]) +AC_MSG_RESULT($with_ext_mouse) +if test "x$with_ext_mouse" = xyes ; then + CF_NCURSES_ABI_6 +fi + +if test $cf_cv_abi_default -le 5 ; then + NCURSES_MOUSE_VERSION=1 +elif test $cf_cv_abi_default -le 6 ; then + NCURSES_MOUSE_VERSION=2 +else + NCURSES_MOUSE_VERSION=3 +fi + +AC_SUBST(NCURSES_MOUSE_VERSION) + +### use option --enable-ext-putwin to turn on extended screendumps +AC_MSG_CHECKING(if you want to use extended putwin/screendump) +AC_ARG_ENABLE(ext-putwin, + [ --enable-ext-putwin compile with extended putwin/screendump], + [with_ext_putwin=$enableval], + [with_ext_putwin=$cf_dft_ext_putwin]) +AC_MSG_RESULT($with_ext_putwin) +if test "x$with_ext_putwin" = xyes ; then + AC_DEFINE(NCURSES_EXT_PUTWIN,1,[Define to 1 to compile with extended putwin/screendump]) +fi + +AC_MSG_CHECKING(if you want \$NCURSES_NO_PADDING code) +AC_ARG_ENABLE(no-padding, + [ --enable-no-padding compile with $NCURSES_NO_PADDING code], + [with_no_padding=$enableval], + [with_no_padding=$with_ext_funcs]) +AC_MSG_RESULT($with_no_padding) +test "x$with_no_padding" = xyes && AC_DEFINE(NCURSES_NO_PADDING,1,[Define to 1 to compile with $NCURSES_NO_PADDING code]) + +### use option --enable-sigwinch to turn on use of SIGWINCH logic +AC_MSG_CHECKING(if you want SIGWINCH handler) +AC_ARG_ENABLE(sigwinch, + [ --enable-sigwinch compile with SIGWINCH handler], + [with_sigwinch=$enableval], + [with_sigwinch=$with_ext_funcs]) +AC_MSG_RESULT($with_sigwinch) +if test "x$with_sigwinch" = xyes +then + AC_DEFINE(USE_SIGWINCH,1,[Define to 1 to compile with SIGWINCH handler]) + cf_cv_enable_sigwinch=1 +else + cf_cv_enable_sigwinch=0 +fi +AC_SUBST(cf_cv_enable_sigwinch) + +### use option --enable-tcap-names to allow user to define new capabilities +AC_MSG_CHECKING(if you want user-definable terminal capabilities like termcap) +AC_ARG_ENABLE(tcap-names, + [ --enable-tcap-names compile with user-definable terminal capabilities], + [with_tcap_names=$enableval], + [with_tcap_names=$with_ext_funcs]) +AC_MSG_RESULT($with_tcap_names) +NCURSES_XNAMES=0 +if test "x$with_tcap_names" = xyes; then + NCURSES_XNAMES=1 + AC_DEFINE(NCURSES_XNAMES,1,[Define to 1 to compile with user-definable terminal capabilities]) +fi +AC_SUBST(NCURSES_XNAMES) + +############################################################################## +CF_HELP_MESSAGE(Reentrant Code:) +CF_WITH_PTHREAD + +if test "x$with_pthread" != xno; then + AC_CHECK_FUNC(pthread_kill,[ + AC_MSG_CHECKING(if you want to allow EINTR in wgetch with pthreads) + AC_ARG_ENABLE(pthreads-eintr, + [ --enable-pthreads-eintr enable EINTR in wgetch with pthreads], + [use_pthreads_eintr=$enableval], + [use_pthreads_eintr=no]) + AC_MSG_RESULT($use_pthreads_eintr) + if test "x$use_pthreads_eintr" = xyes ; then + AC_DEFINE(USE_PTHREADS_EINTR,1,[Define to 1 to enable EINTR in wgetch with pthreads]) + fi]) + + AC_MSG_CHECKING(if you want to use weak-symbols for pthreads) + AC_ARG_ENABLE(weak-symbols, + [ --enable-weak-symbols enable weak-symbols for pthreads], + [use_weak_symbols=$enableval], + [use_weak_symbols=no]) + AC_MSG_RESULT($use_weak_symbols) + if test "x$use_weak_symbols" = xyes ; then + CF_WEAK_SYMBOLS + else + cf_cv_weak_symbols=no + fi + + if test "x$cf_cv_weak_symbols" = xyes ; then + AC_DEFINE(USE_WEAK_SYMBOLS,1,[Define to 1 to enable weak-symbols for pthreads]) + fi +fi + +PTHREAD= +if test "x$with_pthread" = "xyes" ; then + AC_DEFINE(USE_PTHREADS,1,[Define to 1 to use pthreads feature]) + enable_reentrant=yes + if test "x$cf_cv_weak_symbols" = xyes ; then + PTHREAD=-lpthread + CF_ADD_LIB(pthread,PRIVATE_LIBS) + fi +fi +AC_SUBST(PTHREAD) + +# Reentrant code has to be opaque; there's little advantage to making ncurses +# opaque outside of that, so there is no --enable-opaque option. We can use +# this option without --with-pthreads, but this will be always set for +# pthreads. +AC_MSG_CHECKING(if you want reentrant code) +AC_ARG_ENABLE(reentrant, + [ --enable-reentrant compile with reentrant code], + [with_reentrant=$enableval], + [with_reentrant=no]) +AC_MSG_RESULT($with_reentrant) +if test "x$with_reentrant" = xyes ; then + cf_cv_enable_reentrant=1 + cf_cv_enable_opaque="NCURSES_INTERNALS" + NCURSES_SIZE_T=int + if test "x$cf_cv_weak_symbols" = xyes ; then + CF_REMOVE_LIB(LIBS,$LIBS,pthread) + CF_ADD_LIB(pthread,TEST_LIBS) + CF_ADD_LIB(pthread,TEST_LIBS2) + CF_ADD_LIB(pthread,PRIVATE_LIBS) + else + # when not using weak symbols but with_reentrant, + # add 't' to the library suffix on all platforms + # except cygwin, where we only do that if ALSO + # compiling with full thread support. + case "$host" in + (*cygwin* | *msys*) + if test "$with_pthread" = "yes" ; then + if test "x$disable_lib_suffixes" = "xno" ; then + LIB_SUFFIX="t${LIB_SUFFIX}" + fi + fi ;; + (*) + if test "x$disable_lib_suffixes" = "xno" ; then + LIB_SUFFIX="t${LIB_SUFFIX}" + fi + ;; + esac + fi + AC_DEFINE(USE_REENTRANT,1,[Define to 1 to use reentrant feature]) + CF_NCURSES_ABI_6 +else + cf_cv_enable_reentrant=0 + cf_cv_enable_opaque="NCURSES_OPAQUE" + NCURSES_SIZE_T=$cf_dft_ordinate_type +fi +AC_SUBST(cf_cv_enable_reentrant) +AC_SUBST(cf_cv_enable_opaque) + +AC_SUBST(NCURSES_SIZE_T) + +AC_MSG_CHECKING(whether curses library structures should be opaque) +CF_ARG_DISABLE(opaque-curses, + [ --disable-opaque-curses do not make WINDOW, etc., structures opaque], + [enable_opaque_curses=no],[ + test "$cf_cv_enable_reentrant" = 1 && enable_opaque_curses=yes + test "$cf_cv_enable_reentrant" = 1 || enable_opaque_curses=$cf_dft_opaque_curses + ]) +AC_MSG_RESULT($enable_opaque_curses) + +test "$cf_cv_enable_reentrant" = 1 && \ +test "$enable_opaque_curses" = no && \ +AC_MSG_ERROR(reentrant configuration requires opaque library) + +AC_MSG_CHECKING(whether form library structures should be opaque) +CF_ARG_DISABLE(opaque-form, + [ --disable-opaque-form do not make form library structures opaque], + [enable_opaque_form=no],[enable_opaque_form=$cf_dft_opaque_curses]) +AC_MSG_RESULT($enable_opaque_form) + +AC_MSG_CHECKING(whether menu library structures should be opaque) +CF_ARG_DISABLE(opaque-menu, + [ --disable-opaque-menu do not make menu library structures opaque], + [enable_opaque_menu=no],[enable_opaque_menu=$cf_dft_opaque_curses]) +AC_MSG_RESULT($enable_opaque_menu) + +AC_MSG_CHECKING(whether panel library structures should be opaque) +CF_ARG_DISABLE(opaque-panel, + [ --disable-opaque-panel do not make panel library structures opaque], + [enable_opaque_panel=no],[enable_opaque_panel=$cf_dft_opaque_curses]) +AC_MSG_RESULT($enable_opaque_panel) + +NCURSES_OPAQUE=0; test "$enable_opaque_curses" = yes && NCURSES_OPAQUE=1 +NCURSES_OPAQUE_FORM=0; test "$enable_opaque_form" = yes && NCURSES_OPAQUE_FORM=1 +NCURSES_OPAQUE_MENU=0; test "$enable_opaque_menu" = yes && NCURSES_OPAQUE_MENU=1 +NCURSES_OPAQUE_PANEL=0; test "$enable_opaque_panel" = yes && NCURSES_OPAQUE_PANEL=1 + +AC_SUBST(NCURSES_OPAQUE) +AC_SUBST(NCURSES_OPAQUE_FORM) +AC_SUBST(NCURSES_OPAQUE_MENU) +AC_SUBST(NCURSES_OPAQUE_PANEL) + +### Allow using a different wrap-prefix +if test "$cf_cv_enable_reentrant" != 0 || test "$BROKEN_LINKER" = 1 ; then + AC_MSG_CHECKING(for prefix used to wrap public variables) + AC_ARG_WITH(wrap-prefix, + [ --with-wrap-prefix=XXX override prefix used for public variables], + [NCURSES_WRAP_PREFIX=$withval], + [NCURSES_WRAP_PREFIX=_nc_]) + AC_MSG_RESULT($NCURSES_WRAP_PREFIX) +else + NCURSES_WRAP_PREFIX=_nc_ +fi +AC_SUBST(NCURSES_WRAP_PREFIX) +AC_DEFINE_UNQUOTED(NCURSES_WRAP_PREFIX,"$NCURSES_WRAP_PREFIX",[Define to override _nc_ prefix]) + +############################################################################### +# These options are relatively safe to experiment with. +CF_HELP_MESSAGE(Development Code:) +AC_MSG_CHECKING(if you want all development code) +AC_ARG_WITH(develop, + [ --without-develop disable development options], + [with_develop=$withval], + [with_develop=no]) +AC_MSG_RESULT($with_develop) + +### use option --enable-check-size to detect screensize with CPR +AC_MSG_CHECKING(if you want to check screensize of serial terminals) +AC_ARG_ENABLE(check-size, + [ --enable-check-size compile-in code to detect screensize of serial terminals],, + [enable_check_size=$with_develop]) +AC_MSG_RESULT($enable_check_size) +test "x$enable_check_size" = xyes && AC_DEFINE(USE_CHECK_SIZE,1,[Define to 1 to compile-in code to detect screensize]) + +### use option --enable-hard-tabs to turn on use of hard-tabs optimize +AC_MSG_CHECKING(if you want hard-tabs code) +AC_ARG_ENABLE(hard-tabs, + [ --enable-hard-tabs compile with hard-tabs code],, + [enable_hard_tabs=$with_develop]) +AC_MSG_RESULT($enable_hard_tabs) +test "x$enable_hard_tabs" = xyes && AC_DEFINE(USE_HARD_TABS,1,[Define to 1 to compile with hard-tabs code]) + +### use option --enable-xmc-glitch to turn on use of magic-cookie optimize +AC_MSG_CHECKING(if you want limited support for xmc) +AC_ARG_ENABLE(xmc-glitch, + [ --enable-xmc-glitch compile with support for xmc (magic-cookie)],, + [enable_xmc_glitch=$with_develop]) +AC_MSG_RESULT($enable_xmc_glitch) +test "x$enable_xmc_glitch" = xyes && AC_DEFINE(USE_XMC_SUPPORT,1,[Define to 1 to compile with support for xmc (magic-cookie)]) + +############################################################################### +# These are just experimental, probably should not be in a package: +CF_HELP_MESSAGE(Experimental Code:) + +AC_MSG_CHECKING(if you do not want to assume colors are white-on-black) +AC_ARG_ENABLE(assumed-color, + [ --disable-assumed-color do not assume anything about default-colors], + [with_assumed_color=$enableval], + [with_assumed_color=yes]) +AC_MSG_RESULT($with_assumed_color) +test "x$with_assumed_color" = xyes && AC_DEFINE(USE_ASSUMED_COLOR,1,[Define to 1 to assume things about default-colors]) + +### use option --enable-hashmap to turn on use of hashmap scrolling logic +AC_MSG_CHECKING(if you want hashmap scrolling-optimization code) +AC_ARG_ENABLE(hashmap, + [ --disable-hashmap compile without hashmap scrolling-optimization], + [with_hashmap=$enableval], + [with_hashmap=yes]) +AC_MSG_RESULT($with_hashmap) +test "x$with_hashmap" = xyes && AC_DEFINE(USE_HASHMAP,1,[Define to 1 to compile with hashmap scrolling-optimization]) + +### use option --enable-colorfgbg to turn on use of $COLORFGBG environment +AC_MSG_CHECKING(if you want colorfgbg code) +AC_ARG_ENABLE(colorfgbg, + [ --enable-colorfgbg compile-in experimental $COLORFGBG code], + [with_colorfgbg=$enableval], + [with_colorfgbg=no]) +AC_MSG_RESULT($with_colorfgbg) +test "x$with_colorfgbg" = xyes && AC_DEFINE(USE_COLORFGBG,1,[Define to 1 to compile-in experimental $COLORFGBG code]) + +### use option --enable-fvisibility to turn on use of gcc-specific feature +AC_MSG_CHECKING(if you want to use gcc -fvisibility option) +AC_ARG_ENABLE(fvisibility, + [ --enable-fvisibility compile with -fvisibility=hidden], + [cf_with_fvisibility=$enableval], + [cf_with_fvisibility=no]) +AC_MSG_RESULT($cf_with_fvisibility) + +NCURSES_IMPEXP= +NCURSES_CXX_IMPEXP= +if test "x$cf_with_fvisibility" = xyes; then + CF_CHECK_FVISIBILITY($CC,CFLAGS,cf_cv_fvisibility_hidden) + if test "x$cf_cv_fvisibility_hidden" = xyes + then + CF_ADD_CFLAGS([-fvisibility=hidden]) + NCURSES_IMPEXP="__attribute__ ((visibility(\"default\")))" + fi + if test -n "$CXX" + then + AC_LANG_PUSH(C++) + CF_CHECK_FVISIBILITY($CXX,CXXFLAGS,cf_cv_fvisibility_hidden2) + if test "x$cf_cv_fvisibility_hidden2" = xyes + then + CF_ADD_CXXFLAGS([-fvisibility=hidden]) + NCURSES_CXX_IMPEXP="__attribute__ ((visibility(\"default\")))" + fi + AC_LANG_POP + fi +fi +AC_SUBST(NCURSES_IMPEXP) +AC_SUBST(NCURSES_CXX_IMPEXP) + +### use option --enable-interop to turn on use of bindings used for interop +AC_MSG_CHECKING(if you want interop bindings) +AC_ARG_ENABLE(interop, + [ --enable-interop compile-in interop bindings], + [with_exp_interop=$enableval], + [with_exp_interop=$cf_dft_interop]) +AC_MSG_RESULT($with_exp_interop) + +NCURSES_INTEROP_FUNCS=0 +test "x$with_exp_interop" = xyes && NCURSES_INTEROP_FUNCS=1 +AC_SUBST(NCURSES_INTEROP_FUNCS) + + +AC_MSG_CHECKING(if you want experimental safe-sprintf code) +AC_ARG_ENABLE(safe-sprintf, + [ --enable-safe-sprintf compile with experimental safe-sprintf code], + [with_safe_sprintf=$enableval], + [with_safe_sprintf=no]) +AC_MSG_RESULT($with_safe_sprintf) + +### use option --disable-scroll-hints to turn off use of scroll-hints scrolling logic +# when hashmap is used scroll hints are useless +if test "$with_hashmap" = no ; then +AC_MSG_CHECKING(if you want to experiment without scrolling-hints code) +AC_ARG_ENABLE(scroll-hints, + [ --disable-scroll-hints compile without scroll-hints code], + [with_scroll_hints=$enableval], + [with_scroll_hints=yes]) +AC_MSG_RESULT($with_scroll_hints) +test "x$with_scroll_hints" = xyes && AC_DEFINE(USE_SCROLL_HINTS,1,[Define to 1 to compile without scroll-hints code]) +fi + +AC_MSG_CHECKING(if you want wgetch-events code) +AC_ARG_ENABLE(wgetch-events, + [ --enable-wgetch-events compile with wgetch-events code], + [with_wgetch_events=$enableval], + [with_wgetch_events=no]) +AC_MSG_RESULT($with_wgetch_events) +if test "x$with_wgetch_events" = xyes ; then + AC_DEFINE(NCURSES_WGETCH_EVENTS,1,[Define to 1 to compile with wgetch-events code]) + NCURSES_WGETCH_EVENTS=1 +else + NCURSES_WGETCH_EVENTS=0 +fi +AC_SUBST(NCURSES_WGETCH_EVENTS) + +case "$cf_cv_system_name" in +(*mingw32*|*mingw64*|*-msvc*) + AC_MSG_CHECKING(if you want experimental-Windows driver) + AC_ARG_ENABLE(exp-win32, + [ --enable-exp-win32 compile with experimental-Windows driver], + [with_exp_win32=$enableval], + [with_exp_win32=no]) + AC_MSG_RESULT($with_exp_win32) + if test "x$with_exp_win32" = xyes + then + AC_DEFINE(EXP_WIN32_DRIVER,1,[Define to 1 to compile with experimental win32 driver]) + EXP_WIN32_DRIVER=1 + INTERNALS_HDR='[$](INCDIR)/nc_win32.h' + else + INTERNALS_HDR='[$](INCDIR)/nc_mingw.h' + EXP_WIN32_DRIVER=0 + fi + ;; +(*) + EXP_WIN32_DRIVER=0 + INTERNALS_HDR= + ;; +esac +AC_SUBST(EXP_WIN32_DRIVER) +AC_SUBST(INTERNALS_HDR) + +############################################################################### +CF_HELP_MESSAGE(Testing/development Options:) + +### use option --disable-echo to suppress full display compiling commands +CF_DISABLE_ECHO +if test "x$enable_echo" = xyes; then + ECHO_LINK= +else + ECHO_LINK='@ echo linking $@ ... ;' + test -n "$LIBTOOL" && LIBTOOL="$LIBTOOL --silent" + test -n "$LIBTOOL_CXX" && LIBTOOL_CXX="$LIBTOOL_CXX --silent" +fi +AC_SUBST(ECHO_LINK) + +# --disable-stripping is used for debugging +CF_INSTALL_OPTS + +# If we're avoiding relinking of shared libraries during install, that is to +# avoid modifying the build-tree. For the same reason, avoid doing ranlib if +# the install program has "-p" (for preserving timestamps). +cf_cv_do_reranlib=yes +if test "x$cf_cv_install_p" = xyes +then + if test "x$cf_cv_do_relink" != xyes + then + cf_cv_do_reranlib=no + INSTALL_OPT_P="-p" + INSTALL_LIB="$INSTALL_LIB $INSTALL_OPT_P" + fi +fi +AC_SUBST(INSTALL_OPT_P) + +### use option --enable-warnings to turn on all gcc warnings +CF_ENABLE_WARNINGS(Wno-unknown-pragmas Wswitch-enum,yes) + +if test "x$enable_warnings" = "xyes"; then + CF_ADD_ADAFLAGS(-gnatwa -gnatyg) + if test "x$cf_with_cxx" = xyes ; then + CF_GXX_WARNINGS(Wno-unused) + fi +fi +CF_ENABLE_STRING_HACKS + +### use option --enable-assertions to turn on generation of assertion code +AC_MSG_CHECKING(if you want to enable runtime assertions) +AC_ARG_ENABLE(assertions, + [ --enable-assertions test: turn on generation of assertion code], + [with_assertions=$enableval], + [with_assertions=no]) +AC_MSG_RESULT($with_assertions) +if test -n "$GCC" +then + if test "$with_assertions" = no + then + CPPFLAGS="$CPPFLAGS -DNDEBUG" + else + CF_ADD_ADAFLAGS(-gnata) + fi +fi + +### use option --disable-leaks to suppress "permanent" leaks, for testing +CF_DISABLE_LEAKS +AC_DEFINE(HAVE_NC_ALLOC_H,1,[Define to 1 if we have nc_alloc.h header]) + +### use option --enable-expanded to generate certain macros as functions +AC_ARG_ENABLE(expanded, + [ --enable-expanded test: generate functions for certain macros], + [test "x$enableval" = xyes && AC_DEFINE(NCURSES_EXPANDED,1,[Define to 1 to generate functions for certain macros])]) + +### use option --disable-macros to suppress macros in favor of functions +AC_ARG_ENABLE(macros, + [ --disable-macros test: use functions rather than macros], + [test "$enableval" = no && AC_DEFINE(NCURSES_NOMACROS,1,[Define to 1 to use functions rather than macros])]) + +# Normally we only add trace() to the debug-library. Allow this to be +# extended to all models of the ncurses library: +cf_all_traces=no +case "$CFLAGS $CPPFLAGS" in +(*-DTRACE*) + cf_all_traces=yes + ;; +esac + +AC_MSG_CHECKING(whether to add trace feature to all models) +AC_ARG_WITH(trace, +[ --with-trace test: add trace() function to all models of ncurses], +[cf_with_trace=$withval], +[cf_with_trace=$cf_all_traces]) +AC_MSG_RESULT($cf_with_trace) + +if test "x$cf_with_trace" = xyes ; then + LIB_TRACING=all + ADA_TRACE=TRUE + AC_DEFINE(TRACE,1,[Define to 1 if we have support trace functions]) + AC_DEFINE(HAVE__TRACEF,1,[Define to 1 if we have _tracef function]) +else + LIB_TRACING=DEBUG + ADA_TRACE=FALSE +fi + +AC_SUBST(ADA_TRACE) + +CF_DISABLE_GNAT_PROJECTS + +### Checks for libraries. +case "$cf_cv_system_name" in +(*mingw32*|*mingw64*) + # Note: WINVER may be a problem with Windows 10 + if test "x$with_exp_win32" = xyes ; then + CPPFLAGS="$CPPFLAGS -DWINVER=0x0600 -DWIN32_LEAN_AND_MEAN" + else + CPPFLAGS="$CPPFLAGS -DWINVER=0x0501 -DWIN32_LEAN_AND_MEAN" + fi + CF_CHECK_LIBSSP + ;; +(*) + ;; +esac + +CF_MATH_LIB(MATH_LIB,pow(sin(x),x)) +AC_SUBST(MATH_LIB) + +### Checks for header files. +AC_HEADER_TIME +CF_REGEX + +dnl These are some other potentially nonportable headers. +AC_CHECK_HEADERS( \ +fcntl.h \ +getopt.h \ +limits.h \ +locale.h \ +math.h \ +poll.h \ +sys/auxv.h \ +sys/ioctl.h \ +sys/param.h \ +sys/poll.h \ +sys/select.h \ +sys/time.h \ +sys/times.h \ +unistd.h \ +wctype.h \ +) + +CF_GETOPT_HEADER + +CF_CHECK_ENVIRON(environ) +CF_CHECK_GETENV +if test "x$cf_cv_consistent_getenv" = xno && \ + test "x$cf_with_trace" = xyes +then + AC_MSG_WARN(The NCURSES_TRACE environment variable is not supported with this configuration) +fi + +CF_SYS_TIME_SELECT + +### checks for compiler characteristics +AC_LANG_C +AC_C_CONST +CF_C_INLINE(NCURSES_INLINE,1200) +CF_SIG_ATOMIC_T + +if test "$NCURSES_CHTYPE" = auto ; then + CF_TYPEOF_CHTYPE +else + cf_cv_typeof_chtype=$NCURSES_CHTYPE +fi +test "$cf_cv_typeof_chtype" = unsigned && cf_cv_typeof_chtype="" +AC_SUBST(cf_cv_typeof_chtype) + +CF_UNSIGNED_LITERALS +cf_cv_1UL="1" +test ".$cf_cv_unsigned_literals" = .yes && cf_cv_1UL="${cf_cv_1UL}U" +test ".$cf_cv_typeof_chtype" = .long && cf_cv_1UL="${cf_cv_1UL}L" +AC_SUBST(cf_cv_1UL) + +if test "$NCURSES_MMASK_T" = auto ; then + cf_cv_typeof_mmask_t=long +else + cf_cv_typeof_mmask_t=$NCURSES_MMASK_T +fi +test "$cf_cv_typeof_mmask_t" = unsigned && cf_cv_typeof_mmask_t="" +AC_SUBST(cf_cv_typeof_mmask_t) + +### Checks for external-data +CF_ERRNO +CF_LINK_DATAONLY + +### Checks for library functions. +CF_FUNC_GETTIME +AC_CHECK_FUNCS( \ +fpathconf \ +getcwd \ +getauxval \ +getegid \ +geteuid \ +getopt \ +getuid \ +issetugid \ +localeconv \ +poll \ +remove \ +select \ +setbuf \ +setbuffer \ +setfsuid \ +setvbuf \ +sigaction \ +sigvec \ +snprintf \ +strdup \ +strstr \ +sysconf \ +tcgetpgrp \ +times \ +tsearch \ +vsnprintf \ +) + +CF_FUNC_GETTTYNAM + +if test "x$ac_cv_func_getopt" = xno && \ + test "x$cf_with_progs$cf_with_tests" != xnono; then + AC_MSG_ERROR(getopt is required for building programs) +fi + +if test "x$with_safe_sprintf" = xyes +then + if test "x$ac_cv_func_vsnprintf" = xyes + then + AC_MSG_WARN(will use vsnprintf instead of safe-sprintf option) + else + AC_DEFINE(USE_SAFE_SPRINTF,1,[Define to 1 to compile with experimental safe-sprintf code]) + fi +fi + +if test "x$with_getcap" = "xyes" ; then + CF_CGETENT +fi + +CF_ISASCII +CF_STRUCT_SIGACTION +CF_FUNC_NANOSLEEP +CF_FUNC_TERMIOS +CF_FUNC_VSSCANF +CF_MKSTEMP + +# setup for prototype of fallback for vsscanf() +CF_SUBST_IF(["$cf_cv_func_vsscanf" = vsscanf], HAVE_VSSCANF, 1, 0) + +dnl FIXME (may need this) AC_SYS_RESTARTABLE_SYSCALLS +if test "x$cross_compiling" = xyes ; then + AC_MSG_WARN(cross compiling: assume setvbuf params not reversed) +else + AC_FUNC_SETVBUF_REVERSED +fi +AC_CHECK_TYPE(intptr_t, long) +AC_CHECK_TYPE(ssize_t, int) +CF_TYPE_SIGACTION +CF_SIZECHANGE +CF_FUNC_MEMMOVE +CF_FUNC_POLL +CF_MB_LEN_MAX +CF_VA_COPY +AC_FUNC_VFORK +CF_FOPEN_BIN_R + +# special check for test/ditto.c +CF_FUNC_OPENPTY +if test "$cf_cv_func_openpty" != no ; then + AC_DEFINE_UNQUOTED(USE_OPENPTY_HEADER,<$cf_cv_func_openpty>,[Define to actual header for openpty function]) + AC_DEFINE(USE_XTERM_PTY,1,[Define to 1 if we should assume xterm pseudoterminal interface]) + if test "x$cf_cv_lib_util" = xyes ; then + CF_ADD_LIB(util,TEST_LIBS) + fi +fi +AC_SUBST(TEST_LIBS) +AC_SUBST(TEST_LIBS2) + +if test "$with_hashed_db" != no ; then + AC_DEFINE(USE_HASHED_DB,1,[Define to 1 if we should build terminfo in hashed database]) + CF_HASHED_DB($with_hashed_db) +fi + +dnl We'll do our own -g libraries, unless the user's overridden via $CFLAGS +if test -z "$cf_user_CFLAGS" && test "$enable_leaks" = yes ; then + CF_STRIP_G_OPT(CFLAGS) + CF_STRIP_G_OPT(CXXFLAGS) +fi + +# Just in case, check if the C compiler has a bool type. +CF_BOOL_DECL(cf_cv_cc_bool_type) + +# Check for C++ compiler characteristics (and ensure that it's there!) +if test -n "$CXX" ; then + AC_LANG_CPLUSPLUS + CF_STDCPP_LIBRARY + CF_PROG_CC_C_O(CXX,[$CXXFLAGS $CPPFLAGS]) + + case "$GXX_VERSION" in + (1.*|2.[[0-6]]*|[[1-9]][[0-9]].*) + cf_cxx_library=yes + ;; + (*-2.7*|2.7*) + CF_GPP_LIBRARY + ;; + (*) + cf_cxx_library=no + ;; + esac + + AC_CHECK_HEADERS(typeinfo) + CF_CXX_IOSTREAM_NAMESPACE + CF_BOOL_DECL + CF_BOOL_SIZE + CF_ETIP_DEFINES + CF_CPP_OVERRIDE + CF_CPP_PARAM_INIT + CF_CPP_STATIC_CAST + CF_CXX_AR_FLAGS +else + cf_cxx_library=no + cf_cv_builtin_bool=1 + + # Just because we are not configuring against C++ right now does not + # mean that a user will not want to use C++. Some distributors disable + # the C++ portion of this configuration as a shortcut (or just to avoid + # compiling the demo in the c++ directory). So we need a reasonable + # default for the 'bool' type. + # + # Caveat: since the storage of the bool type is not standardized, it + # may change. + + if test "$NCURSES_BOOL" != auto ; then + cf_cv_type_of_bool=$NCURSES_BOOL + cf_cv_header_stdbool_h=0 + else + if test "$cf_cv_header_stdbool_h" = 1 ; then + CF_BOOL_SIZE + else + AC_MSG_CHECKING(for fallback type of bool) + case "$host_cpu" in + (i?86) cf_cv_type_of_bool=char ;; + (*) cf_cv_type_of_bool=int ;; + esac + AC_MSG_RESULT($cf_cv_type_of_bool) + fi + fi +fi +AC_SUBST(CXXLIBS) + +# If the C compiler did not declare bool, and we did not determine that the C++ +# compiler does not declare bool, turn on an ifdef in curses.h that makes the +# ncurses library use the same type as C++ bool. Note that this allows one to +# specify the type of bool in a configure-script option and postpone +# integration with the C++ compiler provided that the types are compatible. +USE_CXX_BOOL=1 +if test "$cf_cv_cc_bool_type" = 1 +then + # oops: C has a bool. Unlikely, but C++ could differ. + USE_CXX_BOOL=0 +elif test "$cf_cv_builtin_bool" = 0 +then + # C++ has no bool + USE_CXX_BOOL=0 +else + # this is the normal case + USE_CXX_BOOL='defined(__cplusplus)' +fi +AC_SUBST(USE_CXX_BOOL) + +CF_HELP_MESSAGE(Ada Binding Options:) + +dnl If the Ada95 source-tree is present, add that to the build unless it will +dnl not work, or was not requested. +if test -f "${srcdir}/Ada95/Makefile.in" ; then + +dnl libtool does not know anything about GNAT, though a change made in 1998 +dnl provided for it "someday". Disable the ada subtree if we are using +dnl libtool -TD 20070714 + if test "$cf_with_ada" != "no" ; then + if test "$with_libtool" != "no"; then + AC_MSG_WARN(libtool does not support Ada - disabling feature) + cf_with_ada=no + fi + fi + +dnl Check for availability of GNU Ada Translator (GNAT). +dnl At the moment we support no other Ada compiler. + if test "$cf_with_ada" != "no" ; then + if test "x$cf_cv_prog_gnat_correct" = xyes; then + CF_ADD_ADAFLAGS(-gnatpn) + CF_FIXUP_ADAFLAGS + + CF_GNATPREP_OPT_T + + CF_GNAT_GENERICS + CF_GNAT_SIGINT + CF_GNAT_PROJECTS + + CF_WITH_ADA_COMPILER + + cf_ada_package=terminal_interface + AC_SUBST(cf_ada_package) + + CF_WITH_ADA_INCLUDE + CF_WITH_ADA_OBJECTS + CF_WITH_ADA_SHAREDLIB + + # allow the Ada binding to be renamed + CF_WITH_ADA_LIBNAME(AdaCurses) + fi + fi +else + cf_with_ada=no +fi + +# do this "late" to avoid conflict with header-checks +if test "x$with_widec" = xyes ; then + AC_CHECK_SIZEOF(wchar_t) + # cross-compiling to mingw can run into the problem that attempting to + # link with the regex library fails, causing the test to not set this to + # a number. "recent" autoconf does not address this problem either -TD + if test -z "$ac_cv_sizeof_wchar_t" + then + CF_VERBOSE(test failed (assume 2)) + sed /SIZEOF_WCHAR_T/d confdefs.h >confdefs.tmp + mv confdefs.tmp confdefs.h + echo "#define SIZEOF_WCHAR_T 2" >>confdefs.h + fi +fi + +### Construct the ncurses library-subsets, if any, from this set of keywords: +### none, base, ext_funcs, ext_tinfo, ticlib, termlib, widechar +### +### ticlib modules may be a separate library, otherwise contained in termlib. +### termlib modules may be a separate library, otherwise contained in ncurses. +### +### The of "+" or " " between the tokens controls the way the script +### chooses to split module lists into libraries. +### +### (see CF_LIB_RULES). +AC_MSG_CHECKING(for library subsets) +LIB_SUBSETS= + +if test "x$cf_with_progs" = xyes || test "$with_ticlib" != no || test "$with_termcap" != no; then + LIB_SUBSETS="${LIB_SUBSETS}ticlib" + if test "$with_ticlib" != no ; then + LIB_SUBSETS="${LIB_SUBSETS} " + else + LIB_SUBSETS="${LIB_SUBSETS}+" + fi +fi + +LIB_SUBSETS="${LIB_SUBSETS}termlib" +test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_tinfo" + +if test "$with_termlib" != no ; then + LIB_SUBSETS="${LIB_SUBSETS} " +else + LIB_SUBSETS="${LIB_SUBSETS}+" +fi + +LIB_SUBSETS="${LIB_SUBSETS}base" + +# Most term-driver calls are to tinfo, but some like init_pair are to the +# base library (so it resides in base). +if test "$with_term_driver" != no ; then + LIB_SUBSETS="${LIB_SUBSETS}+port_drivers" + case "$cf_cv_system_name" in + (*mingw32*|*mingw64*|*msys*|*cygwin*) + if test "x$with_exp_win32" = xyes ; then + LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32" + else + LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo+port_win32con" + fi + CPPFLAGS="$CPPFLAGS -DUSE_WIN32CON_DRIVER" + ;; + (*) + LIB_SUBSETS="${LIB_SUBSETS}+port_tinfo" + ;; + esac +elif test "x$with_exp_win32" = xyes ; then + case "$cf_cv_system_name" in + (*mingw32*|*mingw64*) + LIB_SUBSETS="${LIB_SUBSETS}+port_win32" + ;; + (*) + ;; + esac +fi + +test "x$with_widec" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+widechar" +test "x$with_ext_funcs" = xyes && LIB_SUBSETS="${LIB_SUBSETS}+ext_funcs" + +AC_MSG_RESULT($LIB_SUBSETS) + +### Construct the list of include-directories to be generated +CF_INCLUDE_DIRS +CF_ADA_INCLUDE_DIRS + +### Build up pieces for makefile rules +AC_MSG_CHECKING(default library suffix) +CF_LIB_TYPE($DFT_LWR_MODEL,DFT_ARG_SUFFIX)dnl +AC_SUBST(DFT_ARG_SUFFIX)dnl the string to append to "-lncurses" ("") +AC_MSG_RESULT($DFT_ARG_SUFFIX) + +AC_MSG_CHECKING(default library-dependency suffix) +CF_LIB_SUFFIX($DFT_LWR_MODEL,DFT_LIB_SUFFIX,DFT_DEP_SUFFIX)dnl +AC_SUBST(DFT_DEP_SUFFIX)dnl the corresponding library-suffix (".a") +AC_MSG_RESULT($DFT_DEP_SUFFIX) + +AC_MSG_CHECKING(default object directory) +CF_OBJ_SUBDIR($DFT_LWR_MODEL,DFT_OBJ_SUBDIR)dnl +AC_SUBST(DFT_OBJ_SUBDIR)dnl the default object-directory ("obj") +AC_MSG_RESULT($DFT_OBJ_SUBDIR) + +if test "x$cf_with_cxx" = xyes ; then +AC_MSG_CHECKING(c++ library-dependency suffix) +if test "$with_libtool" != "no"; then + # libtool thinks it can make c++ shared libraries (perhaps only g++) + CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX +elif test "$with_shared_cxx" != "no"; then + # also for g++ users... + CXX_LIB_SUFFIX=$DFT_DEP_SUFFIX +else + # we normally make a static library because C/C++ library rules differ + CF_LIB_SUFFIX(normal,CXX_LIB_SUFFIX,CXX_DEP_SUFFIX) +fi +AC_MSG_RESULT($CXX_LIB_SUFFIX) +AC_SUBST(CXX_LIB_SUFFIX) +fi + +# do not want -ldl in build except as needed for -lncurses dependency +if test "x$with_dlsym" = xyes ; then +if test "$DFT_LWR_MODEL" = shared || \ + test "$DFT_LWR_MODEL" = libtool ; then + CF_REMOVE_LIB(LIBS,$LIBS,dl) +fi +fi +### Set up low-level terminfo dependencies for makefiles. + +# TICS_LIST and TINFO_LIST are needed to build libtic.so and libterm.so, but +# do not need libdl +TICS_LIST= +if test "x$with_dlsym" = xyes ; then + CF_REMOVE_LIB(TINFO_LIST,$SHLIB_LIST,dl) +fi + +USE_ARG_SUFFIX="${DFT_ARG_SUFFIX}${EXTRA_SUFFIX}" +USE_LIB_SUFFIX="${LIB_SUFFIX}${EXTRA_SUFFIX}" +USE_CFG_SUFFIX=${DFT_ARG_SUFFIX}${cf_cv_abi_version} +if test -n "$EXTRA_SUFFIX" && test "x$EXTRA_SUFFIX" != "x${cf_cv_abi_version}" +then + USE_CFG_SUFFIX="${USE_CFG_SUFFIX}${EXTRA_SUFFIX}" +fi +AC_SUBST(USE_ARG_SUFFIX) +AC_SUBST(USE_CFG_SUFFIX) +AC_SUBST(USE_LIB_SUFFIX) + +if test "$with_ticlib" != no ; then + + if test "x$with_ticlib" != xyes ; then + TICS_NAME=$with_ticlib + TICS_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`" + TICS_ARG_SUFFIX="${with_ticlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TICS_DEP_SUFFIX="${with_ticlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TICS_LIB_SUFFIX="${with_ticlib}" + else + TICS_SUFFIX=${DFT_LIB_SUFFIX} + TICS_ARG_SUFFIX="${TICS_NAME}${USE_ARG_SUFFIX}" + TICS_DEP_SUFFIX="${TICS_NAME}${DFT_DEP_SUFFIX}" + TICS_LIB_SUFFIX="${TICS_NAME}${USE_LIB_SUFFIX}" + fi + TICS_LDFLAGS="-L${LIB_DIR}" + TICS_LIBS="-l${TICS_ARG_SUFFIX}" +else + TICS_SUFFIX=${DFT_LIB_SUFFIX} + TICS_LDFLAGS="-L${LIB_DIR}" + TICS_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}" +fi +AC_SUBST(TICS_ARG_SUFFIX) +AC_SUBST(TICS_DEP_SUFFIX) +AC_SUBST(TICS_LIB_SUFFIX) +AC_SUBST(TICS_LDFLAGS) +AC_SUBST(TICS_LIBS) + +if test "$with_termlib" != no ; then + + if test "x$with_termlib" != xyes ; then + TINFO_NAME=$with_termlib + TINFO_SUFFIX="`echo "${DFT_LIB_SUFFIX}" |sed -e "s/^${USE_LIB_SUFFIX}//"`" + TINFO_ARG_SUFFIX="${with_termlib}`echo "${USE_ARG_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TINFO_DEP_SUFFIX="${with_termlib}`echo "${DFT_DEP_SUFFIX}" |sed -e "s/^${LIB_SUFFIX}//"`" + TINFO_LIB_SUFFIX="${with_termlib}" + else + TINFO_SUFFIX=${DFT_LIB_SUFFIX} + TINFO_ARG_SUFFIX="${TINFO_NAME}${USE_ARG_SUFFIX}" + TINFO_DEP_SUFFIX="${TINFO_NAME}${DFT_DEP_SUFFIX}" + TINFO_LIB_SUFFIX="${TINFO_NAME}${USE_LIB_SUFFIX}" + fi + + TEST_DEPS="${LIB_DIR}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}" + TEST_DEP2="${LIB_2ND}/${LIB_PREFIX}${TINFO_DEP_SUFFIX}" + if test "$DFT_LWR_MODEL" = "libtool"; then + TEST_ARGS="${TEST_DEPS}" + TEST_ARG2="${TEST_DEP2}" + TINFO_LDFLAGS="-L${LIB_DIR}" + TINFO_LIBS="$TEST_ARGS" + TICS_LIST="$SHLIB_LIST $TEST_ARGS" + SHLIB_LIST="${SHLIB_LIST} $TEST_ARGS" + else + TEST_ARGS="-l${TINFO_ARG_SUFFIX}" + TEST_ARG2="-l${TINFO_ARG_SUFFIX}" + if test "x$with_term_driver" != xno ; then + TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}" + TICS_LIBS="$TICS_LIBS -l${LIB_NAME}${USE_ARG_SUFFIX}" + TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX} $TEST_ARGS" + else + TICS_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}" + TINFO_LIBS="$TEST_ARGS" + fi + TINFO_LDFLAGS="-L${LIB_DIR}" + SHLIB_LIST="$SHLIB_LIST -l${TINFO_LIB_SUFFIX}" + fi +else + # the next lines are needed for linking libtic over libncurses + TINFO_NAME=${LIB_NAME} + TINFO_SUFFIX=${DFT_LIB_SUFFIX} + TINFO_ARG_SUFFIX=${LIB_NAME}${USE_ARG_SUFFIX} + if test "x$with_tic_depends" = xyes ; then + TICS_LIST="$SHLIB_LIST -l${LIB_NAME}${USE_ARG_SUFFIX}" + else + TICS_LIST="$SHLIB_LIST" + fi + + TINFO_LDFLAGS="-L${LIB_DIR}" + TINFO_LIBS="-l${LIB_NAME}${USE_ARG_SUFFIX}" +fi + +if test "$DFT_LWR_MODEL" = shared ; then + case "$cf_cv_system_name" in + (cygwin*|msys*) + # "lib" files have ".dll.a" suffix, "cyg"or "msys-" files have ".dll" + TINFO_SUFFIX=.dll + ;; + esac +fi + +AC_SUBST(TINFO_ARG_SUFFIX) +AC_SUBST(TINFO_DEP_SUFFIX) +AC_SUBST(TINFO_LIB_SUFFIX) +AC_SUBST(TINFO_LDFLAGS) +AC_SUBST(TINFO_LIBS) + +if test "x$with_dlsym" = xyes ; then + CF_REMOVE_LIB(TICS_LIST,$TICS_LIST,dl) +fi + +if test "$DFT_LWR_MODEL" = "libtool"; then + OBJEXT=lo +fi + +# needed for Ada95 +TINFO_LDFLAGS2=`echo "$TINFO_LDFLAGS" | sed -e 's,-L\.\./,-L../../,'` +AC_SUBST(TINFO_LDFLAGS2) + +case "$DFT_LWR_MODEL" in +(normal|debug|profile) + CF_LDFLAGS_STATIC + ;; +esac + +AC_MSG_CHECKING(where we will install curses.h) +AC_SUBST(includesubdir) +includesubdir= +if test "$with_overwrite" = no && \ + { test "x$includedir" = 'x${prefix}/include' || \ + test "x$includedir" = "x${prefix}/include"; } +then + includesubdir="/ncurses${USE_LIB_SUFFIX}" +fi +AC_MSG_RESULT(${includedir}${includesubdir}) + +### Resolve a conflict between normal and wide-curses by forcing applications +### that will need libutf8 to add it to their configure script. +if test "$with_overwrite" != no ; then +if test "$NCURSES_LIBUTF8" = 1 ; then + NCURSES_LIBUTF8='defined(HAVE_LIBUTF8_H)' + AC_MSG_WARN(Wide-character applications must define HAVE_LIBUTF8_H to include curses.h) +fi +fi +WITH_OVERWRITE=$with_overwrite + +### At least on MinGW a shared library build without libtool +### requires adding the additional libs to the link list. +case "$cf_cv_system_name" in +(*mingw32*|*mingw64*) + if test "$DFT_LWR_MODEL" != "libtool"; then + SHLIB_LIST="$SHLIB_LIST ${LIBS}" + fi + ;; +*) ;; +esac + +AC_SUBST(WITH_OVERWRITE) +AC_SUBST(TICS_LIST) +AC_SUBST(TINFO_LIST) +AC_SUBST(SHLIB_LIST) + +### predefined stuff for the test programs +AC_DEFINE(HAVE_SLK_COLOR,1,[Define to 1 if we have slk_color for test-programs]) + +# pkgsrc uses these +CF_HELP_MESSAGE(Library basenames for pkgsrc:) +CF_WITH_LIB_BASENAME(FORM_NAME,form) +CF_WITH_LIB_BASENAME(MENU_NAME,menu) +CF_WITH_LIB_BASENAME(PANEL_NAME,panel) +CF_WITH_LIB_BASENAME(CXX_NAME,cxx,ncurses++) + +### Construct the list of subdirectories for which we'll customize makefiles +### with the appropriate compile-rules. + +CF_SRC_MODULES($modules_to_build) + +if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then + SUB_MAKEFILES="$SUB_MAKEFILES Ada95/src/library.gpr:Ada95/src/library.gpr.in" + SUB_MAKEFILES="$SUB_MAKEFILES Ada95/gen/adacurses${USE_CFG_SUFFIX}-config:Ada95/gen/adacurses-config.in" + SUB_MAKEFILES="$SUB_MAKEFILES man/adacurses${USE_CFG_SUFFIX}-config.1:man/MKada_config.in" +fi + +CF_DIRS_TO_MAKE + +# symbols that differ when compiling Ada95 by itself. +NCURSES_SHLIB2=$SHELL' $(top_srcdir)/misc/shlib' +AC_SUBST(NCURSES_SHLIB2) + +# values to use as strings +AC_DEFINE_UNQUOTED(NCURSES_PATHSEP,'$PATH_SEPARATOR',[Define to override ':' as library path-separator]) + +AC_DEFINE_UNQUOTED(NCURSES_VERSION_STRING, "${NCURSES_MAJOR}.${NCURSES_MINOR}.${NCURSES_PATCH}",[Define to 1 if machine has ample memory for tic]) + +### Define substitutions for header files to avoid name-pollution +CF_SUBST_IF(["x$cf_cv_have_tcgetattr" = xyes], HAVE_TCGETATTR, 1, 0) +CF_SUBST_IF(["x$ac_cv_header_stdint_h" = xyes], HAVE_STDINT_H, 1, 0) +CF_SUBST_IF(["x$ac_cv_header_termio_h" = xyes], HAVE_TERMIO_H, 1, 0) +CF_SUBST_IF(["x$ac_cv_header_termios_h" = xyes], HAVE_TERMIOS_H, 1, 0) + +################################################################################ +test "x$use_database" = xyes && \ +SUB_MAKEFILES="$SUB_MAKEFILES misc/run_tic.sh:misc/run_tic.in" + +SUB_MAKEFILES="$SUB_MAKEFILES misc/ncurses-config:misc/ncurses-config.in" +SUB_MAKEFILES="$SUB_MAKEFILES man/ncurses${USE_CFG_SUFFIX}-config.1:man/MKncu_config.in" + +if test "x$enable_pc_files" = xyes && test -z "$MAKE_PC_FILES" ; then +SUB_MAKEFILES="$SUB_MAKEFILES misc/gen-pkgconfig:misc/gen-pkgconfig.in" +fi +AC_SUBST(cross_compiling) + +if test "x$cf_with_tests" != xno ; then + MAKE_TESTS= +else + MAKE_TESTS="#" +fi +AC_SUBST(MAKE_TESTS) + +ADAHTML_DIR=../../doc/html/ada +AC_SUBST(ADAHTML_DIR) + +# workaround for OS/2 (20151017) +case "$cf_cv_system_name" in +(os2*) + LIBTOOL_OPTS_CXX="-os2dllname ncurs++" + ;; +(*) + LIBTOOL_OPTS_CXX= + ;; +esac +AC_SUBST(LIBTOOL_OPTS_CXX) + +# workaround for g++ versus Solaris (20131116) +case "$cf_cv_system_name" in +(solaris2*) + case "x$CPPFLAGS" in + (*-D_XOPEN_SOURCE_EXTENDED*) + CF_VERBOSE(moving _XOPEN_SOURCE_EXTENDED to work around g++ problem) + CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED" + CPPFLAGS=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/-D_XOPEN_SOURCE_EXTENDED//'` + ;; + esac + ;; +esac + +# Help to automatically enable the extended curses features when using either +# the *-config or the ".pc" files by adding defines. +AC_MSG_CHECKING(for defines to add to ncurses${USE_CFG_SUFFIX}${cf_config_suffix}-config script) +PKG_CFLAGS= +for cf_loop1 in $CPPFLAGS_after_XOPEN +do + cf_found=no + for cf_loop2 in $CPPFLAGS_before_XOPEN + do + if test "x$cf_loop1" = "x$cf_loop2" + then + cf_found=yes + break + fi + done + test "$cf_found" = no && PKG_CFLAGS="$PKG_CFLAGS $cf_loop1" +done +AC_MSG_RESULT($PKG_CFLAGS) +AC_SUBST(PKG_CFLAGS) +CF_GLOB_FULLPATH + +# AC_CHECK_SIZEOF demands a literal parameter, no variables. So we do this. +case "x$NCURSES_OSPEED" in +(*short*) + cf_compatible=1 + ;; +(*) + cf_compatible=0 + ;; +esac +AC_DEFINE_UNQUOTED(NCURSES_OSPEED_COMPAT,$cf_compatible,[Define to 1 if termcap variable ospeed is short]) + +case "x$cf_cv_typeof_chtype" in +(xshort|xint|xlong) + cf_cv_typeof_chtype="unsigned $cf_cv_typeof_chtype" + ;; +esac + +case "x$cf_cv_typeof_mmask_t" in +(xshort|xint|xlong) + cf_cv_typeof_mmask_t="unsigned $cf_cv_typeof_mmask_t" + ;; +esac + +# substitute into misc/Makefile to suppress +# (un)install.data from the +# (un)install rules. +if test "x$cf_with_db_install" = "xno"; then + MISC_INSTALL_DATA= + MISC_UNINSTALL_DATA= +else + MISC_INSTALL_DATA=install.data + MISC_UNINSTALL_DATA=uninstall.data +fi +AC_SUBST(MISC_INSTALL_DATA) +AC_SUBST(MISC_UNINSTALL_DATA) + +if test "x$cf_with_db_install" = "xno" || test "x$TERMINFO_SRC" = "xno"; then + MAKE_DATABASE="#" +else + MAKE_DATABASE="$MAKE_TERMINFO" +fi +AC_SUBST(MAKE_DATABASE) + +dnl Override the package used for exported symbols +if test -n "$PACKAGE" +then + PACKAGE="${PACKAGE}${DFT_ARG_SUFFIX}" + export PACKAGE + echo "package: $PACKAGE" +fi + +UNALTERED_SYMS= +cf_filter_syms=no + +if test -n "$RESULTING_SYMS" +then + cf_filter_syms=$cf_dft_filter_syms + CF_VERBOSE(will map symbols to ABI=$cf_cv_abi_default) +fi + +if test "x$WILDCARD_SYMS" = xno +then + cf_filter_syms=yes +fi + +test "x$cf_with_trace" = xyes && NCURSES_INLINE= + +UNALTERED_SYMS=`echo "$RESULTING_SYMS" | sed -e 's/\\$/\\\\$/g'` +if test "$cf_filter_syms" = yes +then + RESULTING_SYMS=resulting.map +fi +AC_SUBST(UNALTERED_SYMS) + +if test "x$cross_compiling" = xyes ; then + ADAGEN_LDFLAGS='$(CROSS_LDFLAGS)' + CHECK_BUILD="#" +else + ADAGEN_LDFLAGS='$(NATIVE_LDFLAGS)' + CHECK_BUILD= +fi +AC_SUBST(ADAGEN_LDFLAGS) +AC_SUBST(CHECK_BUILD) +AC_SUBST(PRIVATE_LIBS) + +# This is used for the *-config script and *.pc data files. +CF_LD_SEARCHPATH + +AC_OUTPUT( \ + include/MKterm.h.awk \ + include/curses.head:include/curses.h.in \ + include/ncurses_dll.h \ + include/termcap.h \ + include/unctrl.h \ + man/man_db.renames \ + $SUB_MAKEFILES \ + Makefile,[ +if test "x$cf_with_tests" != xno ; then + CF_PRG_RULES(["$srcdir/test/mk-test.awk" INSTALL=no ECHO_LINK="$ECHO_LD"], test) +fi +CF_LIB_RULES($SRC_SUBDIRS) +CF_OUTPUT_MANPAGE_RENAMES + +if test "x$cf_with_ada" = "xyes" && test "x$cf_cv_prog_gnat_correct" = "xyes"; then +if test -z "$USE_OLD_MAKERULES" ; then + $AWK -f "$srcdir/Ada95/mk-1st.awk" <"$srcdir/Ada95/src/modules" >>Ada95/src/Makefile +fi +fi +],[ +### Special initialization commands, used to pass information from the +### configuration-run into config.status + +ALTERNATE_SYMS="$ALTERNATE_SYMS" +AWK="$AWK" +CXX_NAME="$CXX_NAME" +DFT_ARG_SUFFIX="$DFT_ARG_SUFFIX" +DFT_LWR_MODEL="$DFT_LWR_MODEL" +ECHO_LD="$ECHO_LD" +EXTRA_SUFFIX="$EXTRA_SUFFIX" +FORM_NAME="$FORM_NAME" +GLOB_FULLPATH_OTHER="$GLOB_FULLPATH_OTHER" +GLOB_FULLPATH_POSIX="$GLOB_FULLPATH_POSIX" +LDCONFIG="$LDCONFIG" +LIBTOOL_VERSION="$LIBTOOL_VERSION" +LIB_NAME="$LIB_NAME" +LIB_PREFIX="$LIB_PREFIX" +LIB_SUBSETS="$LIB_SUBSETS" +LIB_SUFFIX="$LIB_SUFFIX" +LIB_TRACING="$LIB_TRACING" +LN_S="$LN_S" +MAKE_TERMINFO="$MAKE_TERMINFO" +MANPAGE_RENAMES="$MANPAGE_RENAMES" +MENU_NAME="$MENU_NAME" +NCURSES_MAJOR="$NCURSES_MAJOR" +NCURSES_MINOR="$NCURSES_MINOR" +NCURSES_OSPEED="$NCURSES_OSPEED" +NCURSES_PATCH="$NCURSES_PATCH" +PANEL_NAME="$PANEL_NAME" +SRC_SUBDIRS="$SRC_SUBDIRS" +TERMINFO="$TERMINFO" +TICS_ARG_SUFFIX="$TICS_ARG_SUFFIX" +TICS_LIB_SUFFIX="$TICS_LIB_SUFFIX" +TICS_NAME="$TICS_NAME" +TICS_SUFFIX="$TICS_SUFFIX" +TIC_PATH="$TIC_PATH" +TINFO_ARG_SUFFIX="$TINFO_ARG_SUFFIX" +TINFO_LIB_SUFFIX="$TINFO_LIB_SUFFIX" +TINFO_NAME="$TINFO_NAME" +TINFO_SUFFIX="$TINFO_SUFFIX" +UNALTERED_SYMS="$UNALTERED_SYMS" +USE_ARG_SUFFIX="$USE_ARG_SUFFIX" +USE_CFG_SUFFIX="$USE_CFG_SUFFIX" +USE_LIB_SUFFIX="$USE_LIB_SUFFIX" +USE_OLD_MAKERULES="$USE_OLD_MAKERULES" +WILDCARD_SYMS="$WILDCARD_SYMS" +WITH_CURSES_H="$with_curses_h" +WITH_ECHO="${enable_echo:=yes}" +WITH_OVERWRITE="$with_overwrite" +cf_LIST_MODELS="$cf_list_models" +cf_cv_VERSION_GNATMAKE=$cf_cv_VERSION_GNATMAKE +cf_cv_VERSION_GPRBUILD=$cf_cv_VERSION_GPRBUILD +cf_cv_abi_default="$cf_cv_abi_default" +cf_cv_abi_version="$cf_cv_abi_version" +cf_cv_do_relink="$cf_cv_do_relink" +cf_cv_do_reranlib="$cf_cv_do_reranlib" +cf_cv_do_symlinks="$cf_cv_do_symlinks" +cf_cv_enable_lp64="$cf_cv_enable_lp64" +cf_cv_enable_opaque="$cf_cv_enable_opaque" +cf_cv_make_PHONY="$cf_cv_make_PHONY" +cf_cv_prog_CC_c_o=$cf_cv_prog_CC_c_o +cf_cv_prog_CXX_c_o=$cf_cv_prog_CXX_c_o +cf_cv_prog_gnat_correct=$cf_cv_prog_gnat_correct +cf_cv_rel_version="$cf_cv_rel_version" +cf_cv_rm_so_locs="$cf_cv_rm_so_locs" +cf_cv_shared_soname='$cf_cv_shared_soname' +cf_cv_shlib_version="$cf_cv_shlib_version" +cf_cv_shlib_version_infix="$cf_cv_shlib_version_infix" +cf_cv_system_name="$cf_cv_system_name" +cf_cv_term_driver="$with_term_driver" +cf_with_ada="$cf_with_ada" +cf_with_cxx_binding="$cf_with_cxx_binding" +cf_with_db_install="$cf_with_db_install" +cf_with_manpages="$cf_with_manpages" +cf_with_tests="$cf_with_tests" +host="$host" +target="$target" +verbose="$verbose" +with_shared_cxx="$with_shared_cxx" + +],cat)dnl +${MAKE:-make} preinstall diff --git a/contrib/ncurses/dist.mk b/contrib/ncurses/dist.mk new file mode 100644 index 00000000..d786ef99 --- /dev/null +++ b/contrib/ncurses/dist.mk @@ -0,0 +1,178 @@ +############################################################################## +# Copyright 2018-2023,2024 Thomas E. Dickey # +# Copyright 1998-2017,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: dist.mk,v 1.1639 2024/11/02 09:59:53 tom Exp $ +# Makefile for creating ncurses distributions. +# +# This only needs to be used directly as a makefile by developers, but +# configure mines the current version number out of here. To move +# to a new version number, just edit this file and run configure. +# +SHELL = /bin/sh + +# These define the major/minor/patch versions of ncurses. +NCURSES_MAJOR = 6 +NCURSES_MINOR = 5 +NCURSES_PATCH = 20241102 + +# We don't append the patch to the version, since this only applies to releases +VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR) + +WEBSITE = https://invisible-island.net +HOMEPAGE = $(WEBSITE)/ncurses + +# The most recent html files were generated with lynx 2.8.6 (or later), using +# ncurses configured with +# --without-manpage-renames +# on Debian/testing. The -scrollbar and -width options are used to make lynx +# use 79 columns as it did in 2.8.5 and before. +DUMP = lynx -dump -scrollbar=0 -width=79 -display_charset=US-ASCII +DUMP2 = $(DUMP) -nolist + +# gcc's file is "gnathtml.pl" +GNATHTML= gnathtml + +# man2html is a Perl script which assumes that pages are fixed size. +# Not all man programs agree with this assumption; some use half-spacing, which +# has the effect of lengthening the text portion of the page -- so man2html +# would remove some text. The man program on Redhat 6.1 appears to work with +# man2html if we set the top/bottom margins to 6 (the default is 7). Newer +# versions of 'man' leave no margin (and make it harder to sync with pages). +MAN2HTML= man2html -botm=0 -topm=0 -cgiurl '$$title.$$section$$subsection.html' -index -mixsecs + +ALL = ANNOUNCE doc/html/announce.html doc/ncurses-intro.doc doc/hackguide.doc manhtml adahtml + +all : $(ALL) + +dist: $(ALL) + (cd ..; tar cvf ncurses-$(VERSION).tar `sed $@ + +ANNOUNCE : doc/html/announce.html + $(DUMP2) doc/html/announce.html > $@ + +doc/ncurses-intro.doc: doc/html/ncurses-intro.html + $(DUMP2) doc/html/ncurses-intro.html > $@ +doc/hackguide.doc: doc/html/hackguide.html + $(DUMP2) doc/html/hackguide.html > $@ + +# The distributed html files are formatted using +# configure --without-manpage-renames +# +# The edit_man.sed script is built as a side-effect of installing the manpages. +# If that conflicts with the --without-manpage-renames, you can install those +# in a different location using the --with-install-prefix option of the +# configure script. +MANPROG = tbl | nroff -mandoc -rHY=0 -rLL=78n -rLT=78n -Tascii + +manhtml: + @for f in doc/html/man/*.html; do \ + test -f $$f || continue; \ + case $$f in \ + */index.html) ;; \ + *) rm -f $$f ;; \ + esac; \ + done + @mkdir -p doc/html/man + @rm -f subst.tmp ; + @for f in man/*.[0-9]*; do \ + m=`basename $$f` ;\ + x=`echo $$m | awk -F. '{print $$2;}'` ;\ + xu=`echo $$x | dd conv=ucase 2>/dev/null` ;\ + if [ "$${x}" != "$${xu}" ]; then \ + echo "s/$${xu}/$${x}/g" >> subst.tmp ;\ + fi ;\ + done + # change some things to make weblint happy: + @cat man_alias.sed >> subst.tmp + @echo 's///g' >> subst.tmp + @echo 's/<\/B>/<\/STRONG>/g' >> subst.tmp + @echo 's///g' >> subst.tmp + @echo 's/<\/I>/<\/EM>/g' >> subst.tmp + @misc/csort < subst.tmp | uniq > subst.sed + @echo 's%[_-]*_-[_-]*%_%g' >> subst.sed + @echo '/<\/TITLE>/a\\' >> subst.sed + @echo '\\' >> subst.sed + @rm -f subst.tmp + @for f in man/*.[0-9]* ; do \ + m=`basename $$f` ;\ + T=`$${EGREP-grep -E} '^.TH' $$f|sed -e 's/^.TH //' -e s'/"//g' -e 's/[ ]\+$$//'` ; \ + g=$${m}.html ;\ + if [ -f doc/html/$$g ]; then chmod +w doc/html/$$g; fi;\ + echo "Converting $$m to HTML" ;\ + echo '' >> doc/html/man/$$g ;\ + ./edit_man.sh normal editing /usr/man man $$f | \ + $(MANPROG) | \ + tr '\255' '-' | \ + $(MAN2HTML) \ + -title "$$T" \ + -aliases man/manhtml.aliases \ + -externs man/manhtml.externs | \ + sed -f subst.sed |\ + sed -e 's/"curses.3x.html"/"ncurses.3x.html"/g' \ + >> doc/html/man/$$g ;\ + done + @rm -f subst.sed + +# +# Please note that this target can only be properly built if the build of the +# Ada95 subdir has been done. The reason is, that the gnathtml tool uses the +# .ali files generated by the Ada95 compiler during the build process. These +# .ali files contain cross referencing information required by gnathtml. +adahtml: + if [ ! -z "$(GNATHTML)" ]; then \ + (cd ./Ada95/gen ; make html GNATHTML=$(GNATHTML) ) ;\ + fi + +# This only works on a clean source tree, of course. +MANIFEST: + -rm -f $@ + touch $@ + find . -type f -print |misc/csort | fgrep -v .lsm |fgrep -v .spec >$@ + +TAGS: + etags */*.[ch] + +# Makefile ends here diff --git a/contrib/ncurses/doc/hackguide.doc b/contrib/ncurses/doc/hackguide.doc new file mode 100644 index 00000000..a464d033 --- /dev/null +++ b/contrib/ncurses/doc/hackguide.doc @@ -0,0 +1,685 @@ + A Hacker's Guide to NCURSES + +A Hacker's Guide to NCURSES + +Contents + + * Abstract + * Objective of the Package + + Why System V Curses? + + How to Design Extensions + * Portability and Configuration + * Documentation Conventions + * How to Report Bugs + * A Tour of the Ncurses Library + + Library Overview + + The Engine Room + + Keyboard Input + + Mouse Events + + Output and Screen Updating + * The Forms and Menu Libraries + * A Tour of the Terminfo Compiler + + Translation of Non-use Capabilities + + Use Capability Resolution + + Source-Form Translation + * Other Utilities + * Style Tips for Developers + * Porting Hints + +Abstract + + This document is a hacker's tour of the ncurses library and utilities. + It discusses design philosophy, implementation methods, and the + conventions used for coding and documentation. It is recommended + reading for anyone who is interested in porting, extending or + improving the package. + +Objective of the Package + + The objective of the ncurses package is to provide a free software API + for character-cell terminals and terminal emulators with the following + characteristics: + * Source-compatible with historical curses implementations + (including the original BSD curses and System V curses. + * Conformant with the XSI Curses standard issued as part of XPG4 by + X/Open. + * High-quality -- stable and reliable code, wide portability, good + packaging, superior documentation. + * Featureful -- should eliminate as much of the drudgery of C + interface programming as possible, freeing programmers to think at + a higher level of design. + + These objectives are in priority order. So, for example, source + compatibility with older version must trump featurefulness -- we + cannot add features if it means breaking the portion of the API + corresponding to historical curses versions. + + Why System V Curses? + + We used System V curses as a model, reverse-engineering their API, in + order to fulfill the first two objectives. + + System V curses implementations can support BSD curses programs with + just a recompilation, so by capturing the System V API we also capture + BSD's. + + More importantly for the future, the XSI Curses standard issued by + X/Open is explicitly and closely modeled on System V. So conformance + with System V took us most of the way to base-level XSI conformance. + + How to Design Extensions + + The third objective (standards conformance) requires that it be easy + to condition source code using ncurses so that the absence of + nonstandard extensions does not break the code. + + Accordingly, we have a policy of associating with each nonstandard + extension a feature macro, so that ncurses client code can use this + macro to condition in or out the code that requires the ncurses + extension. + + For example, there is a macro NCURSES_MOUSE_VERSION which XSI Curses + does not define, but which is defined in the ncurses library header. + You can use this to condition the calls to the mouse API calls. + +Portability and Configuration + + Code written for ncurses may assume an ANSI-standard C compiler and + POSIX-compatible OS interface. It may also assume the presence of a + System-V-compatible select(2) call. + + We encourage (but do not require) developers to make the code friendly + to less-capable UNIX environments wherever possible. + + We encourage developers to support OS-specific optimizations and + methods not available under POSIX/ANSI, provided only that: + * All such code is properly conditioned so the build process does + not attempt to compile it under a plain ANSI/POSIX environment. + * Adding such implementation methods does not introduce + incompatibilities in the ncurses API between platforms. + + We use GNU autoconf(1) as a tool to deal with portability issues. The + right way to leverage an OS-specific feature is to modify the autoconf + specification files (configure.in and aclocal.m4) to set up a new + feature macro, which you then use to condition your code. + +Documentation Conventions + + There are three kinds of documentation associated with this package. + Each has a different preferred format: + * Package-internal files (README, INSTALL, TO-DO etc.) + * Manual pages. + * Everything else (i.e., narrative documentation). + + Our conventions are simple: + 1. Maintain package-internal files in plain text. The expected viewer + for them is more(1) or an editor window; there is no point in + elaborate mark-up. + 2. Mark up manual pages in the man macros. These have to be viewable + through traditional man(1) programs. + 3. Write everything else in HTML. + + When in doubt, HTMLize a master and use lynx(1) to generate plain + ASCII (as we do for the announcement document). + + The reason for choosing HTML is that it is (a) well-adapted for + on-line browsing through viewers that are everywhere; (b) more easily + readable as plain text than most other mark-ups, if you do not have a + viewer; and (c) carries enough information that you can generate a + nice-looking printed version from it. Also, of course, it make + exporting things like the announcement document to WWW pretty trivial. + +How to Report Bugs + + The reporting address for bugs is bug-ncurses@gnu.org. This is a + majordomo list; to join, write to bug-ncurses-request@gnu.org with a + message containing the line: + subscribe @ + + The ncurses code is maintained by a small group of volunteers. While + we try our best to fix bugs promptly, we simply do not have a lot of + hours to spend on elementary hand-holding. We rely on intelligent + cooperation from our users. If you think you have found a bug in + ncurses, there are some steps you can take before contacting us that + will help get the bug fixed quickly. + + In order to use our bug-fixing time efficiently, we put people who + show us they have taken these steps at the head of our queue. This + means that if you do not, you will probably end up at the tail end and + have to wait a while. + 1. Develop a recipe to reproduce the bug. + Bugs we can reproduce are likely to be fixed very quickly, often + within days. The most effective single thing you can do to get a + quick fix is develop a way we can duplicate the bad behavior -- + ideally, by giving us source for a small, portable test program + that breaks the library. (Even better is a keystroke recipe using + one of the test programs provided with the distribution.) + 2. Try to reproduce the bug on a different terminal type. + In our experience, most of the behaviors people report as library + bugs are actually due to subtle problems in terminal descriptions. + This is especially likely to be true if you are using a + traditional asynchronous terminal or PC-based terminal emulator, + rather than xterm or a UNIX console entry. + It is therefore extremely helpful if you can tell us whether or + not your problem reproduces on other terminal types. Usually you + will have both a console type and xterm available; please tell us + whether or not your bug reproduces on both. + If you have xterm available, it is also good to collect xterm + reports for different window sizes. This is especially true if you + normally use an unusual xterm window size -- a surprising number + of the bugs we have seen are either triggered or masked by these. + 3. Generate and examine a trace file for the broken behavior. + Recompile your program with the debugging versions of the + libraries. Insert a trace() call with the argument set to + TRACE_UPDATE. (See "Writing Programs with NCURSES" for details on + trace levels.) Reproduce your bug, then look at the trace file to + see what the library was actually doing. + Another frequent cause of apparent bugs is application coding + errors that cause the wrong things to be put on the virtual + screen. Looking at the virtual-screen dumps in the trace file will + tell you immediately if this is happening, and save you from the + possible embarrassment of being told that the bug is in your code + and is your problem rather than ours. + If the virtual-screen dumps look correct but the bug persists, it + is possible to crank up the trace level to give more and more + information about the library's update actions and the control + sequences it issues to perform them. The test directory of the + distribution contains a tool for digesting these logs to make them + less tedious to wade through. + Often you will find terminfo problems at this stage by noticing + that the escape sequences put out for various capabilities are + wrong. If not, you are likely to learn enough to be able to + characterize any bug in the screen-update logic quite exactly. + 4. Report details and symptoms, not just interpretations. + If you do the preceding two steps, it is very likely that you will + discover the nature of the problem yourself and be able to send us + a fix. This will create happy feelings all around and earn you + good karma for the first time you run into a bug you really cannot + characterize and fix yourself. + If you are still stuck, at least you will know what to tell us. + Remember, we need details. If you guess about what is safe to + leave out, you are too likely to be wrong. + If your bug produces a bad update, include a trace file. Try to + make the trace at the least voluminous level that pins down the + bug. Logs that have been through tracemunch are OK, it does not + throw away any information (actually they are better than + un-munched ones because they are easier to read). + If your bug produces a core-dump, please include a symbolic stack + trace generated by gdb(1) or your local equivalent. + Tell us about every terminal on which you have reproduced the bug + -- and every terminal on which you cannot. Ideally, send us + terminfo sources for all of these (yours might differ from ours). + Include your ncurses version and your OS/machine type, of course! + You can find your ncurses version in the curses.h file. + + If your problem smells like a logic error or in cursor movement or + scrolling or a bad capability, there are a couple of tiny test frames + for the library algorithms in the progs directory that may help you + isolate it. These are not part of the normal build, but do have their + own make productions. + + The most important of these is mvcur, a test frame for the + cursor-movement optimization code. With this program, you can see + directly what control sequences will be emitted for any given cursor + movement or scroll/insert/delete operations. If you think you have got + a bad capability identified, you can disable it and test again. The + program is command-driven and has on-line help. + + If you think the vertical-scroll optimization is broken, or just want + to understand how it works better, build hashmap and read the header + comments of hardscroll.c and hashmap.c; then try it out. You can also + test the hardware-scrolling optimization separately with hardscroll. + +A Tour of the Ncurses Library + + Library Overview + + Most of the library is superstructure -- fairly trivial convenience + interfaces to a small set of basic functions and data structures used + to manipulate the virtual screen (in particular, none of this code + does any I/O except through calls to more fundamental modules + described below). The files + + lib_addch.c lib_bkgd.c lib_box.c lib_chgat.c lib_clear.c + lib_clearok.c lib_clrbot.c lib_clreol.c lib_colorset.c lib_data.c + lib_delch.c lib_delwin.c lib_echo.c lib_erase.c lib_gen.c + lib_getstr.c lib_hline.c lib_immedok.c lib_inchstr.c lib_insch.c + lib_insdel.c lib_insstr.c lib_instr.c lib_isendwin.c lib_keyname.c + lib_leaveok.c lib_move.c lib_mvwin.c lib_overlay.c lib_pad.c + lib_printw.c lib_redrawln.c lib_scanw.c lib_screen.c lib_scroll.c + lib_scrollok.c lib_scrreg.c lib_set_term.c lib_slk.c + lib_slkatr_set.c lib_slkatrof.c lib_slkatron.c lib_slkatrset.c + lib_slkattr.c lib_slkclear.c lib_slkcolor.c lib_slkinit.c + lib_slklab.c lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c + lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c lib_window.c + + are all in this category. They are very unlikely to need change, + barring bugs or some fundamental reorganization in the underlying data + structures. + + These files are used only for debugging support: + + lib_trace.c lib_traceatr.c lib_tracebits.c lib_tracechr.c + lib_tracedmp.c lib_tracemse.c trace_buf.c + + It is rather unlikely you will ever need to change these, unless you + want to introduce a new debug trace level for some reason. + + There is another group of files that do direct I/O via tputs(), + computations on the terminal capabilities, or queries to the OS + environment, but nevertheless have only fairly low complexity. These + include: + + lib_acs.c lib_beep.c lib_color.c lib_endwin.c lib_initscr.c + lib_longname.c lib_newterm.c lib_options.c lib_termcap.c lib_ti.c + lib_tparm.c lib_tputs.c lib_vidattr.c read_entry.c. + + They are likely to need revision only if ncurses is being ported to an + environment without an underlying terminfo capability representation. + + These files have serious hooks into the tty driver and signal + facilities: + + lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c lib_twait.c + + If you run into porting snafus moving the package to another UNIX, the + problem is likely to be in one of these files. The file lib_print.c + uses sleep(2) and also falls in this category. + + Almost all of the real work is done in the files + + hardscroll.c hashmap.c lib_addch.c lib_doupdate.c lib_getch.c + lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c lib_vidattr.c + + Most of the algorithmic complexity in the library lives in these + files. If there is a real bug in ncurses itself, it is probably here. + We will tour some of these files in detail below (see The Engine + Room). + + Finally, there is a group of files that is actually most of the + terminfo compiler. The reason this code lives in the ncurses library + is to support fallback to /etc/termcap. These files include + + alloc_entry.c captoinfo.c comp_captab.c comp_error.c comp_hash.c + comp_parse.c comp_scan.c parse_entry.c read_termcap.c write_entry.c + + We will discuss these in the compiler tour. + + The Engine Room + + Keyboard Input + + All ncurses input funnels through the function wgetch(), defined in + lib_getch.c. This function is tricky; it has to poll for keyboard and + mouse events and do a running match of incoming input against the set + of defined special keys. + + The central data structure in this module is a FIFO queue, used to + match multiple-character input sequences against special-key + capabilities; also to implement pushback via ungetch(). + + The wgetch() code distinguishes between function key sequences and the + same sequences typed manually by doing a timed wait after each input + character that could lead a function key sequence. If the entire + sequence takes less than 1 second, it is assumed to have been + generated by a function key press. + + Hackers bruised by previous encounters with variant select(2) calls + may find the code in lib_twait.c interesting. It deals with the + problem that some BSD selects do not return a reliable time-left + value. The function timed_wait() effectively simulates a System V + select. + + Mouse Events + + If the mouse interface is active, wgetch() polls for mouse events each + call, before it goes to the keyboard for input. It is up to + lib_mouse.c how the polling is accomplished; it may vary for different + devices. + + Under xterm, however, mouse event notifications come in via the + keyboard input stream. They are recognized by having the kmous + capability as a prefix. This is kind of klugey, but trying to wire in + recognition of a mouse key prefix without going through the + function-key machinery would be just too painful, and this turns out + to imply having the prefix somewhere in the function-key capabilities + at terminal-type initialization. + + This kluge only works because kmous is not actually used by any + historic terminal type or curses implementation we know of. Best guess + is it is a relic of some forgotten experiment in-house at Bell Labs + that did not leave any traces in the publicly-distributed System V + terminfo files. If System V or XPG4 ever gets serious about using it + again, this kluge may have to change. + + Here are some more details about mouse event handling: + + The lib_mouse() code is logically split into a lower level that + accepts event reports in a device-dependent format and an upper level + that parses mouse gestures and filters events. The mediating data + structure is a circular queue of event structures. + + Functionally, the lower level's job is to pick up primitive events and + put them on the circular queue. This can happen in one of two ways: + either (a) _nc_mouse_event() detects a series of incoming mouse + reports and queues them, or (b) code in lib_getch.c detects the kmous + prefix in the keyboard input stream and calls _nc_mouse_inline to + queue up a series of adjacent mouse reports. + + In either case, _nc_mouse_parse() should be called after the series is + accepted to parse the digested mouse reports (low-level events) into a + gesture (a high-level or composite event). + + Output and Screen Updating + + With the single exception of character echoes during a wgetnstr() call + (which simulates cooked-mode line editing in an ncurses window), the + library normally does all its output at refresh time. + + The main job is to go from the current state of the screen (as + represented in the curscr window structure) to the desired new state + (as represented in the newscr window structure), while doing as little + I/O as possible. + + The brains of this operation are the modules hashmap.c, hardscroll.c + and lib_doupdate.c; the latter two use lib_mvcur.c. Essentially, what + happens looks like this: + * The hashmap.c module tries to detect vertical motion changes + between the real and virtual screens. This information is + represented by the oldindex members in the newscr structure. These + are modified by vertical-motion and clear operations, and both are + re-initialized after each update. To this change-journalling + information, the hashmap code adds deductions made using a + modified Heckel algorithm on hash values generated from the line + contents. + * The hardscroll.c module computes an optimum set of scroll, + insertion, and deletion operations to make the indices match. It + calls _nc_mvcur_scrolln() in lib_mvcur.c to do those motions. + * Then lib_doupdate.c goes to work. Its job is to do line-by-line + transformations of curscr lines to newscr lines. Its main tool is + the routine mvcur() in lib_mvcur.c. This routine does + cursor-movement optimization, attempting to get from given screen + location A to given location B in the fewest output characters + possible. + + If you want to work on screen optimizations, you should use the fact + that (in the trace-enabled version of the library) enabling the + TRACE_TIMES trace level causes a report to be emitted after each + screen update giving the elapsed time and a count of characters + emitted during the update. You can use this to tell when an update + optimization improves efficiency. + + In the trace-enabled version of the library, it is also possible to + disable and re-enable various optimizations at runtime by tweaking the + variable _nc_optimize_enable. See the file include/curses.h.in for + mask values, near the end. + +The Forms and Menu Libraries + + The forms and menu libraries should work reliably in any environment + you can port ncurses to. The only portability issue anywhere in them + is what flavor of regular expressions the built-in form field type + TYPE_REGEXP will recognize. + + The configuration code prefers the POSIX regex facility, modeled on + System V's, but will settle for BSD regexps if the former is not + available. + + Historical note: the panels code was written primarily to assist in + porting u386mon 2.0 (comp.sources.misc v14i001-4) to systems lacking + panels support; u386mon 2.10 and beyond use it. This version has been + slightly cleaned up for ncurses. + +A Tour of the Terminfo Compiler + + The ncurses implementation of tic is rather complex internally; it has + to do a trying combination of missions. This starts with the fact + that, in addition to its normal duty of compiling terminfo sources + into loadable terminfo binaries, it has to be able to handle termcap + syntax and compile that too into terminfo entries. + + The implementation therefore starts with a table-driven, dual-mode + lexical analyzer (in comp_scan.c). The lexer chooses its mode (termcap + or terminfo) based on the first "," or ":" it finds in each entry. The + lexer does all the work of recognizing capability names and values; + the grammar above it is trivial, just "parse entries till you run out + of file". + + Translation of Non-use Capabilities + + Translation of most things besides use capabilities is pretty + straightforward. The lexical analyzer's tokenizer hands each + capability name to a hash function, which drives a table lookup. The + table entry yields an index which is used to look up the token type in + another table, and controls interpretation of the value. + + One possibly interesting aspect of the implementation is the way the + compiler tables are initialized. All the tables are generated by + various awk/sed/sh scripts from a master table include/Caps; these + scripts actually write C initializers which are linked to the + compiler. Furthermore, the hash table is generated in the same way, so + it doesn't have to be generated at compiler startup time (another + benefit of this organization is that the hash table can be in + shareable text space). + + Thus, adding a new capability is usually pretty trivial, just a matter + of adding one line to the include/Caps file. We will have more to say + about this in the section on Source-Form Translation. + + Use Capability Resolution + + The background problem that makes tic tricky is not the capability + translation itself, it is the resolution of use capabilities. Older + versions would not handle forward use references for this reason (that + is, a using terminal always had to follow its use target in the source + file). By doing this, they got away with a simple implementation + tactic; compile everything as it blows by, then resolve uses from + compiled entries. + + This will not do for ncurses. The problem is that that the whole + compilation process has to be embeddable in the ncurses library so + that it can be called by the startup code to translate termcap entries + on the fly. The embedded version cannot go promiscuously writing + everything it translates out to disk -- for one thing, it will + typically be running with non-root permissions. + + So our tic is designed to parse an entire terminfo file into a + doubly-linked circular list of entry structures in-core, and then do + use resolution in-memory before writing everything out. This design + has other advantages: it makes forward and back use-references equally + easy (so we get the latter for free), and it makes checking for name + collisions before they are written out easy to do. + + And this is exactly how the embedded version works. But the + stand-alone user-accessible version of tic partly reverts to the + historical strategy; it writes to disk (not keeping in core) any entry + with no use references. + + This is strictly a core-economy kluge, implemented because the + terminfo master file is large enough that some core-poor systems swap + like crazy when you compile it all in memory...there have been reports + of this process taking three hours, rather than the twenty seconds or + less typical on the author's development box. + + So. The executable tic passes the entry-parser a hook that immediately + writes out the referenced entry if it has no use capabilities. The + compiler main loop refrains from adding the entry to the in-core list + when this hook fires. If some other entry later needs to reference an + entry that got written immediately, that is OK; the resolution code + will fetch it off disk when it cannot find it in core. + + Name collisions will still be detected, just not as cleanly. The + write_entry() code complains before overwriting an entry that + postdates the time of tic's first call to write_entry(), Thus it will + complain about overwriting entries newly made during the tic run, but + not about overwriting ones that predate it. + + Source-Form Translation + + Another use of tic is to do source translation between various termcap + and terminfo formats. There are more variants out there than you might + think; the ones we know about are described in the captoinfo(1) manual + page. + + The translation output code (dump_entry() in ncurses/dump_entry.c) is + shared with the infocmp(1) utility. It takes the same internal + representation used to generate the binary form and dumps it to + standard output in a specified format. + + The include/Caps file has a header comment describing ways you can + specify source translations for nonstandard capabilities just by + altering the master table. It is possible to set up capability + aliasing or tell the compiler to plain ignore a given capability + without writing any C code at all. + + For circumstances where you need to do algorithmic translation, there + are functions in parse_entry.c called after the parse of each entry + that are specifically intended to encapsulate such translations. This, + for example, is where the AIX box1 capability get translated to an + acsc string. + +Other Utilities + + The infocmp utility is just a wrapper around the same entry-dumping + code used by tic for source translation. Perhaps the one interesting + aspect of the code is the use of a predicate function passed in to + dump_entry() to control which capabilities are dumped. This is + necessary in order to handle both the ordinary De-compilation case and + entry difference reporting. + + The tput and clear utilities just do an entry load followed by a + tputs() of a selected capability. + +Style Tips for Developers + + See the TO-DO file in the top-level directory of the source + distribution for additions that would be particularly useful. + + The prefix _nc_ should be used on library public functions that are + not part of the curses API in order to prevent pollution of the + application namespace. If you have to add to or modify the function + prototypes in curses.h.in, read ncurses/MKlib_gen.sh first so you can + avoid breaking XSI conformance. Please join the ncurses mailing list. + See the INSTALL file in the top level of the distribution for details + on the list. + + Look for the string FIXME in source files to tag minor bugs and + potential problems that could use fixing. + + Do not try to auto-detect OS features in the main body of the C code. + That is the job of the configuration system. + + To hold down complexity, do make your code data-driven. Especially, if + you can drive logic from a table filtered out of include/Caps, do it. + If you find you need to augment the data in that file in order to + generate the proper table, that is still preferable to ad-hoc code -- + that is why the fifth field (flags) is there. + + Have fun! + +Porting Hints + + The following notes are intended to be a first step towards DOS and + Macintosh ports of the ncurses libraries. + + The following library modules are "pure curses"; they operate only on + the curses internal structures, do all output through other curses + calls (not including tputs() and putp()) and do not call any other + UNIX routines such as signal(2) or the stdio library. Thus, they + should not need to be modified for single-terminal ports. + + lib_addch.c lib_addstr.c lib_bkgd.c lib_box.c lib_clear.c + lib_clrbot.c lib_clreol.c lib_delch.c lib_delwin.c lib_erase.c + lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c lib_keyname.c + lib_move.c lib_mvwin.c lib_newwin.c lib_overlay.c lib_pad.c + lib_printw.c lib_refresh.c lib_scanw.c lib_scroll.c lib_scrreg.c + lib_set_term.c lib_touch.c lib_tparm.c lib_tputs.c lib_unctrl.c + lib_window.c panel.c + + This module is pure curses, but calls outstr(): + + lib_getstr.c + + These modules are pure curses, except that they use tputs() and + putp(): + + lib_beep.c lib_color.c lib_endwin.c lib_options.c lib_slk.c + lib_vidattr.c + + This modules assist in POSIX emulation on non-POSIX systems: + + sigaction.c + signal calls + + The following source files will not be needed for a + single-terminal-type port. + + alloc_entry.c captoinfo.c clear.c comp_captab.c comp_error.c + comp_hash.c comp_main.c comp_parse.c comp_scan.c dump_entry.c + infocmp.c parse_entry.c read_entry.c tput.c write_entry.c + + The following modules will use open()/read()/write()/close()/lseek() + on files, but no other OS calls. + + lib_screen.c + used to read/write screen dumps + + lib_trace.c + used to write trace data to the logfile + + Modules that would have to be modified for a port start here: + + The following modules are "pure curses" but contain assumptions + inappropriate for a memory-mapped port. + + lib_longname.c + assumes there may be multiple terminals + + lib_acs.c + assumes acs_map as a double indirection + + lib_mvcur.c + assumes cursor moves have variable cost + + lib_termcap.c + assumes there may be multiple terminals + + lib_ti.c + assumes there may be multiple terminals + + The following modules use UNIX-specific calls: + + lib_doupdate.c + input checking + + lib_getch.c + read() + + lib_initscr.c + getenv() + + lib_newterm.c + lib_baudrate.c + lib_kernel.c + various tty-manipulation and system calls + + lib_raw.c + various tty-manipulation calls + + lib_setup.c + various tty-manipulation calls + + lib_restart.c + various tty-manipulation calls + + lib_tstp.c + signal-manipulation calls + + lib_twait.c + gettimeofday(), select(). + _________________________________________________________________ + + + Eric S. Raymond + + (Note: This is not the bug address!) diff --git a/contrib/ncurses/doc/html/Ada95.html b/contrib/ncurses/doc/html/Ada95.html new file mode 100644 index 00000000..1affa3fb --- /dev/null +++ b/contrib/ncurses/doc/html/Ada95.html @@ -0,0 +1,344 @@ + + + + + + + + Ada95 Binding for ncurses + + + + + +

Ada95 Binding for ncurses

+ +

by Jürgen Pfeifer.

+
+ +

General Remarks

+ +
    +
  • This document describes Version 01.00 of the binding.
  • + +
  • The functionality is modeled to be compatible with the + ncurses package, a clone of the SVr4 curses model.
    + I did the development on an Intel box running the latest stable + release of Linux, ncurses + and the most recent released GNU + Ada Translator gnat versions. For any older versions of + ncurses and gnat it is not guaranteed to work.
  • + +
  • You must have the m4 macroprocessor to build this package. + If you don't have this program, you can get the FSF version + here.
  • + +
  • Ada programs are supposed to be readable. One of my + favorite methods to make code readable is to use expressive + names for the identifiers. You can find a list of a mapping of + the cryptic curses names to the Ada names in this table.
  • + +
  • This is not a typical one-to-one interface mapping. It is + close to one-to-one on the functional level. Each (n)curses + function has its counterpart with a more or less similar + formal parameter list in the binding. It is not one-to-one with + respect to the datatypes. I tried to make records out of the + flat chtype and similar structures, so you don't have to do bit + operations to mark an attributed character as bold. Just make + the boolean member bold of the record true. + The binding also hides the structures like WINDOW, PANEL, MENU, + FORM etc. ! It is a pure functional API.
  • + +
  • I try to do as much error checking as possible and feasible + in the binding. I will raise an Ada exception when something + went wrong in the low-level curses. This has the effect that - + at least first time in my life - (n)curses programs have now a + very rigid error checking, but - thanks to Ada - you don't have + to code the orgiastic error checking style of C.
  • + +
  • Support for wide characters is currently not in the + binding, as it is not really in ncurses at this point in + time.
  • +
+ +

Limitations

+ +
    +
  • I provide no SCREEN datatype and functions to set a new + screen. If you need this (mostly for debugging I guess), write + a small C routine doing all this and import it into your Ada + program.
  • + +
  • I provide no functions to switch on/off curses tracing + options. Same suggestion as above.
  • + +
  • Although Ada95 is an OO Language, this binding doesn't + provide an OO abstraction of the (n)curses functionality. As + mentioned above it is a thin binding for the (n)curses + functions. But without any doubt it would be nice to build on + top of this an OO abstraction of (n)curses functionality.
    + The only exception is the method how fieldtypes are represented + in this Binding. We provide an abstract tagged type Field_Type + from which the various fieldtypes are derived.
  • + +
  • I currently do not support the link_fieldtype functionality + of the forms subsystem.
  • + +
  • The *_IO packages are currently output only.
  • +
+ +

Hierarchy of packages

+ + + +

If you want to navigate through the html pages of the package + specs, click here.

+ +

Implementation Details

+ +

Behind the abstraction

+ +

All the new types like Window, + Panel, Menu, + Form etc. are just opaque representations of the + pointers to the corresponding low level (n)curses structures like + WINDOW *, PANEL *, MENU + * or FORM *. So you can safely pass + them to C routines that expect a pointer to one of those + structures.

+ +

Extended ripoffline() usage

+ +

The official documentation of (n)curses says, that the line + parameter determines only whether or not exactly + one line is stolen from the top or bottom of the + screen. So essentially only the sign of the parameter is + evaluated. ncurses has internally implemented it in a way, that + uses the line parameter also to control the amount of lines to + steal. This mechanism is used in the + Rip_Off_Lines routine of the binding.

+ +

How user defined field + types work

+ +

TBD

+ +

Enumeration fields handling

+ +

The (n)curses documentation says, that the String arrays to be + passed to an TYPE_ENUM fieldtype must not be automatic variables. + This is not true in this binding, because it is internally + arranged to safely copy these values.

+ +

Using other Ada + compilers

+ +

This should basically not be a problem.

+ +

Port to other curses implementations

+ +

Basically it should not be too hard to make all this run on a + regular SVr4 implementation of curses. The problems are probably + these:

+ +
    +
  • ncurses has some additional features which are presented in + this binding. You have two choices to deal with this: + +
      +
    • Emulate the feature in this binding
    • + +
    • Raise an exception for non implemented features
    • +
    + +

    Most likely you will follow a mixed approach. Some + features are easy to simulate, others will be hard if not + impossible.

    +
  • +
+ +

I'm quite sure I forgot something.

+ + diff --git a/contrib/ncurses/doc/html/NCURSES-Programming-HOWTO.html b/contrib/ncurses/doc/html/NCURSES-Programming-HOWTO.html new file mode 100644 index 00000000..cc6127d9 --- /dev/null +++ b/contrib/ncurses/doc/html/NCURSES-Programming-HOWTO.html @@ -0,0 +1,7501 @@ + + + + + NCURSES Programming HOWTO + + + +
+
+

NCURSES + Programming HOWTO

+ + + +

v2.1, 2024-09-08

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Revision + History +
Revision 2.12024-09-08Revised by: dickey
Fixes for the sample + programs. Remove obsolete mailing addresses. Update + publication date.
Revision 2.02022-12-03Revised by: dickey
Fixes for the sample + programs, Correct documentation errata.
Revision 1.92005-06-20Revised by: ppadala
The license has been + changed to the MIT-style license used by NCURSES. Note + that the programs are also re-licensed under this.
Revision 1.82005-06-17Revised by: ppadala
Lots of updates. Added + references and perl examples. Changes to examples. Many + grammatical and stylistic changes to the content. + Changes to NCURSES history.
Revision 1.7.12002-06-25Revised by: ppadala
Added a README file for + building and instructions for building from + source.
Revision 1.72002-06-25Revised by: ppadala
Added "Other formats" + section and made a lot of fancy changes to the + programs. Inlining of programs is gone.
Revision 1.6.12002-02-24Revised by: ppadala
Removed the old Changelog + section, cleaned the makefiles
Revision 1.62002-02-16Revised by: ppadala
Corrected a lot of + spelling mistakes, added ACS variables section
Revision 1.52002-01-05Revised by: ppadala
Changed structure to + present proper TOC
Revision 1.3.12001-07-26Revised by: ppadala
Corrected maintainers + paragraph, Corrected stable release number
Revision 1.32001-07-24Revised by: ppadala
Added copyright notices to + main document (LDP license) and programs (GPL), + Corrected printw_example.
Revision 1.22001-06-05Revised by: ppadala
Incorporated ravi's + changes. Mainly to introduction, menu, form, justforfun + sections
Revision 1.12001-05-22Revised by: ppadala
Added "a word about + window" section, Added scanw_example.
+
+ +
+
+ +

This + document is intended to be an "All in One" guide for + programming with ncurses and its sister libraries. We + graduate from a simple "Hello World" program to more + complex form manipulation. No prior experience in ncurses + is assumed. Send comments to this + address +

+
+
+ +
+
+ +
+
+
Table of Contents +
+ +
1. Introduction
+ +
+
+
1.1. What is NCURSES?
+ +
1.2. What we can do with + NCURSES
+ +
1.3. Where to get + it
+ +
1.4. Purpose/Scope of the + document
+ +
1.5. About the + Programs
+ +
1.6. Other Formats of the + document
+ +
+
+
1.6.1. Alternative + formats
+ +
1.6.2. Building from + source
+
+
+ +
1.7. Credits
+ +
1.8. Wish List
+ +
1.9. Copyright
+
+
+ +
2. Hello World !!!
+ +
+
+
2.1. Compiling With the + NCURSES Library
+ +
2.2. Dissection
+ +
+
+
2.2.1. About + initscr()
+ +
2.2.2. The mysterious + refresh()
+ +
2.2.3. About + endwin()
+
+
+
+
+ +
3. The Gory Details
+ +
4. Initialization
+ +
+
+
4.1. Initialization + functions
+ +
4.2. raw() and + cbreak()
+ +
4.3. echo() and + noecho()
+ +
4.4. keypad()
+ +
4.5. halfdelay()
+ +
4.6. Miscellaneous + Initialization functions
+ +
4.7. An Example
+
+
+ +
5. A Word about + Windows
+ +
6. Output functions
+ +
+
+
6.1. addch() class of + functions
+ +
6.2. mvaddch(), waddch() and + mvwaddch()
+ +
6.3. printw() class of + functions
+ +
+
+
6.3.1. printw() and + mvprintw
+ +
6.3.2. wprintw() + and mvwprintw
+ +
6.3.3. vw_printw()
+ +
6.3.4. A Simple + printw example
+
+
+ +
6.4. addstr() class of + functions
+ +
6.5. A word of caution
+
+
+ +
7. Input functions
+ +
+
+
7.1. getch() class of + functions
+ +
7.2. scanw() class of + functions
+ +
+
+
7.2.1. scanw() and + mvscanw
+ +
7.2.2. wscanw() and + mvwscanw()
+ +
7.2.3. vw_scanw()
+
+
+ +
7.3. getstr() class of + functions
+ +
7.4. Some examples
+
+
+ +
8. Attributes
+ +
+
+
8.1. The details
+ +
8.2. attron() vs + attrset()
+ +
8.3. attr_get()
+ +
8.4. attr_ functions
+ +
8.5. wattr functions
+ +
8.6. chgat() functions
+
+
+ +
9. Windows
+ +
+
+
9.1. The basics
+ +
9.2. Let there be a Window + !!!
+ +
9.3. Explanation
+ +
9.4. The other stuff in the + example
+ +
9.5. Other Border + functions
+
+
+ +
10. Colors
+ +
+
+
10.1. The basics
+ +
10.2. Changing Color + Definitions
+ +
10.3. Color + Content
+
+
+ +
11. Interfacing with the key + board
+ +
+
+
11.1. The Basics
+ +
11.2. A Simple Key Usage + example
+
+
+ +
12. Interfacing with the + mouse
+ +
+
+
12.1. The Basics
+ +
12.2. Getting the + events
+ +
12.3. Putting it all + Together
+ +
12.4. Miscellaneous + Functions
+
+
+ +
13. Screen Manipulation
+ +
+
+
13.1. getyx() functions
+ +
13.2. Screen Dumping
+ +
13.3. Window Dumping
+
+
+ +
14. Miscellaneous features
+ +
+
+
14.1. curs_set()
+ +
14.2. Temporarily Leaving + Curses mode
+ +
14.3. ACS_ variables
+
+
+ +
15. Other libraries
+ +
16. Panel Library
+ +
+
+
16.1. The Basics
+ +
16.2. Compiling With the + Panels Library
+ +
16.3. Panel Window + Browsing
+ +
16.4. Using User + Pointers
+ +
16.5. Moving and + Resizing Panels
+ +
16.6. Hiding and Showing + Panels
+ +
16.7. panel_above() and + panel_below() Functions
+
+
+ +
17. Menus Library
+ +
+
+
17.1. The Basics
+ +
17.2. Compiling With the + Menu Library
+ +
17.3. Menu Driver: The work + horse of the menu system
+ +
17.4. Menu Windows
+ +
17.5. Scrolling + Menus
+ +
17.6. Multi Columnar + Menus
+ +
17.7. Multi Valued + Menus
+ +
17.8. Menu Options
+ +
17.9. The useful User + Pointer
+
+
+ +
18. Forms Library
+ +
+
+
18.1. The Basics
+ +
18.2. Compiling With the + Forms Library
+ +
18.3. Playing with + Fields
+ +
+
+
18.3.1. Fetching Size and + Location of Field
+ +
18.3.2. Moving the + field
+ +
18.3.3. Field + Justification
+ +
18.3.4. Field + Display Attributes
+ +
18.3.5. Field Option + Bits
+ +
18.3.6. Field + Status
+ +
18.3.7. Field User + Pointer
+ +
18.3.8. Variable-Sized + Fields
+
+
+ +
18.4. Form Windows
+ +
18.5. Field + Validation
+ +
18.6. Form Driver: The work + horse of the forms system
+ +
+
+
18.6.1. Page Navigation + Requests
+ +
18.6.2. Inter-Field + Navigation Requests
+ +
18.6.3. Intra-Field + Navigation Requests
+ +
18.6.4. Scrolling + Requests
+ +
18.6.5. Editing + Requests
+ +
18.6.6. Order + Requests
+ +
18.6.7. Application + Commands
+
+
+
+
+ +
19. Tools and Widget + Libraries
+ +
+
+
19.1. CDK (Curses Development + Kit)
+ +
+
+
19.1.1. Widget + List
+ +
19.1.2. Some Attractive + Features
+ +
19.1.3. Conclusion
+
+
+ +
19.2. The dialog
+ +
19.3. Perl Curses Modules + CURSES::FORM and CURSES::WIDGETS
+
+
+ +
20. Just For Fun !!!
+ +
+
+
20.1. The Game of + Life
+ +
20.2. Magic Square
+ +
20.3. Towers of Hanoi
+ +
20.4. Queens Puzzle
+ +
20.5. Shuffle
+ +
20.6. Typing Tutor
+
+
+ +
21. References
+
+
+ +
+

1. + Introduction

+ +

In the olden days of teletype terminals, terminals were + away from computers and were connected to them through serial + cables. The terminals could be configured by sending a series + of bytes. All the capabilities (such as moving the cursor to + a new location, erasing part of the screen, scrolling the + screen, changing modes, etc.) of terminals could be accessed + through these series of bytes. These control sequences are + usually called escape sequences, because they start with an + escape(0x1B) character. Even today, with proper emulation, we + can send escape sequences to the emulator and achieve the + same effect on a terminal window.

+ +

Suppose you wanted to print a line in color. Try typing + this on your console.

+ +
echo "^[[0;31;40mIn Color"
+

The first character is an escape character, which looks + like two characters ^ and [. To be able to print it, you have + to press CTRL+V and then the ESC key. All the others are + normal printable characters. You should be able to see the + string "In Color" in red. It stays that way and to revert + back to the original mode type this.

+ +
echo "^[[0;37;40m"
+

Now, what do these magic characters mean? Difficult to + comprehend? They might even be different for different + terminals. So the designers of UNIX invented a mechanism + named termcap. It is a file that + lists all the capabilities of a particular terminal, along + with the escape sequences needed to achieve a particular + effect. In the later years, this was replaced by terminfo. Without delving too much into + details, this mechanism allows application programs to query + the terminfo database and obtain the control characters to be + sent to a terminal or terminal emulator.

+ +
+
+ +

1.1. What is + NCURSES?

+ +

You might be wondering, what the import of all this + technical gibberish is. In the above scenario, every + application program is supposed to query the terminfo and + perform the necessary stuff (sending control characters, + etc.). It soon became difficult to manage this complexity + and this gave birth to 'CURSES'. Curses is a pun on the + name "cursor optimization". The Curses library forms a + wrapper over working with raw terminal codes, and provides + highly flexible and efficient API (Application Programming + Interface). It provides functions to move the cursor, + create windows, produce colors, play with mouse, etc. The + application programs need not worry about the underlying + terminal capabilities.

+ +

So what is NCURSES? NCURSES is a clone of the original + System V Release 4.0 (SVr4) curses. It is a freely + distributable library, fully compatible with older version + of curses. In short, it is a library of functions that + manages an application's display on character-cell + terminals. In the remainder of the document, the terms + curses and ncurses are used interchangeably.

+ +

A detailed history of NCURSES can be found in the NEWS + file from the source distribution. The current package is + maintained by Thomas Dickey. You can contact the + maintainers at bug-ncurses@gnu.org.

+
+ +
+
+ +

1.2. What we can do with NCURSES

+ +

NCURSES not only creates a wrapper over terminal + capabilities, but also gives a robust framework to create + nice looking UI (User Interface)s in text mode. It provides + functions to create windows, etc. Its sister libraries + panel, menu and form provide an extension to the basic + curses library. These libraries usually come along with + curses. One can create applications that contain multiple + windows, menus, panels and forms. Windows can be managed + independently, can provide 'scrollability' and even can be + hidden.

+ +

Menus provide the user with an easy command selection + option. Forms allow the creation of easy-to-use data entry + and display windows. Panels extend the capabilities of + ncurses to deal with overlapping and stacked windows.

+ +

These are just some of the basic things we can do with + ncurses. As we move along, We will see all the capabilities + of these libraries.

+
+ +
+
+ +

1.3. Where to get it

+ +

All right, now that you know what you can do with + ncurses, you must be rearing to get started. NCURSES is + usually shipped with your installation. In case you don't + have the library or want to compile it on your own, read + on.

+ +

Compiling the + package +

+ +

NCURSES can be obtained from

+ + + +

Read the README and INSTALL files for details on to how to install + it. It usually involves the following operations.

+ +
    tar zxvf ncurses<version>.tar.gz  # unzip and untar the archive
+    cd ncurses<version>               # cd to the directory
+    ./configure                       # configure the build according to your
+                                      # environment
+    make                              # make it
+    su root                           # become root
+    make install                      # install it
+
+ +
+
+ +

1.4. + Purpose/Scope of the document

+ +

This document is intended to be a "All in One" guide for + programming with ncurses and its sister libraries. We + graduate from a simple "Hello World" program to more + complex form manipulation. No prior experience in ncurses + is assumed. The writing is informal, but a lot of detail is + provided for each of the examples.

+
+ +
+
+ +

1.5. About the Programs

+ +

All the programs in the document are available in + gzipped form here. Ungzip and untar it. The directory + structure looks like this.

+ +
ncurses
+   |
+   |----> JustForFun     -- just for fun programs
+   |----> basics         -- basic programs
+   |----> demo           -- output files go into this directory after make
+   |          |
+   |          |----> exe -- exe files of all example programs
+   |----> forms          -- programs related to form library
+   |----> menus          -- programs related to menus library
+   |----> panels         -- programs related to panels library
+   |----> perl           -- perl equivalents of the examples (contributed
+   |                            by Anuradha Ratnaweera)
+   |----> Makefile       -- the top level Makefile
+   |----> README         -- the top level README file. contains instructions
+   |----> COPYING        -- copyright notice
+

The individual directories contain the following + files.

+ +
Description of files in each directory
+--------------------------------------
+JustForFun
+    |
+    |----> hanoi.c   -- The Towers of Hanoi Solver
+    |----> life.c    -- The Game of Life demo
+    |----> magic.c   -- An Odd Order Magic Square builder
+    |----> queens.c  -- The famous N-Queens Solver
+    |----> shuffle.c -- A fun game, if you have time to kill
+    |----> tt.c      -- A very trivial typing tutor
+
+  basics
+    |
+    |----> acs_vars.c            -- ACS_ variables example
+    |----> hello_world.c         -- Simple "Hello World" Program
+    |----> init_func_example.c   -- Initialization functions example
+    |----> key_code.c            -- Shows the scan code of the key pressed
+    |----> mouse_menu.c          -- A menu accessible by mouse
+    |----> other_border.c        -- Shows usage of other border functions apa
+    |                               -- rt from box()
+    |----> printw_example.c      -- A very simple printw() example
+    |----> scanw_example.c       -- A very simple getstr() example
+    |----> simple_attr.c         -- A program that can print a c file with
+    |                               -- comments in attribute
+    |----> simple_color.c        -- A simple example demonstrating colors
+    |----> simple_key.c          -- A menu accessible with keyboard UP, DOWN
+    |                               -- arrows
+    |----> temp_leave.c          -- Demonstrates temporarily leaving curses mode
+    |----> win_border.c          -- Shows Creation of windows and borders
+    |----> with_chgat.c          -- chgat() usage example
+
+  forms
+    |
+    |----> form_attrib.c     -- Usage of field attributes
+    |----> form_options.c    -- Usage of field options
+    |----> form_simple.c     -- A simple form example
+    |----> form_win.c        -- Demo of windows associated with forms
+
+  menus
+    |
+    |----> menu_attrib.c     -- Usage of menu attributes
+    |----> menu_item_data.c  -- Usage of item_name(), etc. functions
+    |----> menu_multi_column.c    -- Creates multi columnar menus
+    |----> menu_scroll.c     -- Demonstrates scrolling capability of menus
+    |----> menu_simple.c     -- A simple menu accessed by arrow keys
+    |----> menu_toggle.c     -- Creates multi valued menus and explains
+    |                           -- REQ_TOGGLE_ITEM
+    |----> menu_userptr.c    -- Usage of user pointer
+    |----> menu_win.c        -- Demo of windows associated with menus
+
+  panels
+    |
+    |----> panel_browse.c    -- Panel browsing through tab. Usage of user
+    |                           -- pointer
+    |----> panel_hide.c      -- Hiding and Un hiding of panels
+    |----> panel_resize.c    -- Moving and resizing of panels
+    |----> panel_simple.c    -- A simple panel example
+
+  perl
+    |----> 01-10.pl          -- Perl equivalents of first ten example programs
+

There is a top level Makefile included in the main + directory. It builds all the files and puts the + ready-to-use exes in demo/exe directory. You can also do + selective make by going into the corresponding directory. + Each directory contains a README file explaining the + purpose of each c file in the directory.

+ +

For every example, I have included path name for the + file relative to the examples directory.

+ +

All the programs are released under the same license + that is used by ncurses (MIT-style). This gives you the + ability to do pretty much anything other than claiming them + as yours. Feel free to use them in your programs as + appropriate.

+
+ +
+
+ +

1.6. Other Formats of the document

+ +

This howto is also available in other formats. Here are + the links to other formats of this document.

+ + + +
+
+ +

1.6.2. Building from source

+ +

The sources for this HOWTO can be retrieved from

+ + + +

These tools were used to format the HOWTO and build + the examples:

+ +
    +
  • +

    docbook-utils (a Debian package)

    +
  • + +
  • +

    gcc

    +
  • +
+
+
+ +
+
+ +

1.7. + Credits

+ +

I thank Sharath and Emre Akbas for + helping me with few sections. The introduction was + initially written by Sharath. I rewrote it with few + excerpts taken from his initial work. Emre helped in + writing printw and scanw sections.

+ +

Perl equivalents of the example programs were + contributed by Anuradha Ratnaweera.

+ +

Then comes Ravi Parimi, my dearest friend, who + has been on this project before even one line was written. + He constantly bombarded me with suggestions and patiently + reviewed the whole text. He also checked each program on + Linux and Solaris.

+
+ +
+
+ +

1.8. + Wish List

+ +

This is the wish list, in the order of priority. If you + have a wish or you want to work on completing the wish, + mail me.

+ +
    +
  • +

    Add examples to last parts of forms section.

    +
  • + +
  • +

    Prepare a Demo showing all the programs and allow + the user to browse through description of each program. + Let the user compile and see the program in action. A + dialog based interface is preferred.

    +
  • + +
  • +

    Add debug info. _tracef, _tracemouse stuff.

    +
  • + +
  • +

    Accessing termcap, terminfo using functions provided + by ncurses package.

    +
  • + +
  • +

    Working on two terminals simultaneously.

    +
  • + +
  • +

    Add more stuff to miscellaneous section.

    +
  • +
+
+ +
+
+ +

1.9. + Copyright

+ +

Copyright © 2001 by Pradeep Padala.

+ +

Permission is hereby granted, free of charge, to any + person obtaining a copy of this software and associated + documentation files (the "Software"), to deal in the + Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, + and/or sell copies of the Software, and to permit persons + to whom the Software is furnished to do so, subject to the + following conditions:

+ +

The above copyright notice and this permission notice + shall be included in all copies or substantial portions of + the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ +

Except as contained in this notice, the name(s) of the + above copyright holders shall not be used in advertising or + otherwise to promote the sale, use or other dealings in + this Software without prior written authorization.

+
+
+ +
+
+ +

2. + Hello World !!!

+ +

Welcome to the world of curses. Before we plunge into the + library and look into its various features, let's write a + simple program and say hello to the world.

+ +
+
+ +

2.1. Compiling With the NCURSES Library

+ +

To use ncurses library functions, you have to include + ncurses.h in your programs. To link the program with + ncurses the flag -lncurses should be added.

+ +
    #include <ncurses.h>
+    .
+    .
+    .
+
+    compile and link: gcc <program file> -lncurses
+
+ +

Example 1. The Hello World !!! Program +

+ +
#include <curses.h>
+
+int
+main(void)
+{
+    initscr();                  /* Start curses mode              */
+    printw("Hello World !!!");  /* Print Hello World              */
+    refresh();                  /* Print it on to the real screen */
+    getch();                    /* Wait for user input */
+    endwin();                   /* End curses mode                */
+
+    return 0;
+}
+
+
+ +
+
+ +

2.2. + Dissection

+ +

The above program prints "Hello World !!!" to the screen + and exits. This program shows how to initialize curses and + do screen manipulation and end curses mode. Let's dissect + it line by line.

+ +
+
+ +

2.2.1. About initscr()

+ +

The function initscr() initializes the terminal in + curses mode. In some implementations, it clears the + screen and presents a blank screen. To do any screen + manipulation using curses package this has to be called + first. This function initializes the curses system and + allocates memory for our present window (called + stdscr) and some other + data-structures. Under extreme cases this function might + fail due to insufficient memory to allocate memory for + curses library's data structures.

+ +

After this is done, we can do a variety of + initializations to customize our curses settings. These + details will be explained later .

+
+ +
+
+ +

2.2.2. The mysterious refresh()

+ +

The next line printw prints the string "Hello World + !!!" on to the screen. This function is analogous to + normal printf in all respects except that it prints the + data on a window called stdscr at the current (y,x) + co-ordinates. Since our present co-ordinates are at 0,0 + the string is printed at the left hand corner of the + window.

+ +

This brings us to that mysterious refresh(). Well, + when we called printw the data is actually written to an + imaginary window, which is not updated on the screen yet. + The job of printw is to update a few flags and data + structures and write the data to a buffer corresponding + to stdscr. In order to show it on the screen, we need to + call refresh() and tell the curses system to dump the + contents on the screen.

+ +

The philosophy behind all this is to allow the + programmer to do multiple updates on the imaginary screen + or windows and do a refresh once all his screen update is + done. refresh() checks the window and updates only the + portion which has been changed. This improves performance + and offers greater flexibility too. But, it is sometimes + frustrating to beginners. A common mistake committed by + beginners is to forget to call refresh() after they did + some update through printw() class of functions. I still + forget to add it sometimes :-)

+
+ +
+
+ +

2.2.3. About endwin()

+ +

And finally don't forget to end the curses mode. + Otherwise your terminal might behave strangely after the + program quits. endwin() frees the memory taken by curses + sub-system and its data structures and puts the terminal + in normal mode. This function must be called after you + are done with the curses mode.

+
+
+
+ +
+
+ +

3. The Gory + Details

+ +

Now that we have seen how to write a simple curses program + let's get into the details. There are many functions that + help customize what you see on screen and many features which + can be put to full use.

+ +

Here we go...

+
+ +
+
+ +

4. + Initialization

+ +

We now know that to initialize curses system the function + initscr() has to be called. There are functions which can be + called after this initialization to customize our curses + session. We may ask the curses system to set the terminal in + raw mode or initialize color or initialize the mouse, etc. + Let's discuss some of the functions that are normally called + immediately after initscr();

+ + + +
+
+ +

4.2. + raw() and cbreak()

+ +

Normally the terminal driver buffers the characters a + user types until a new line or carriage return is + encountered. But most programs require that the characters + be available as soon as the user types them. The above two + functions are used to disable line buffering. The + difference between these two functions is in the way + control characters like suspend (CTRL-Z), interrupt and + quit (CTRL-C) are passed to the program. In the raw() mode + these characters are directly passed to the program without + generating a signal. In the cbreak() mode these control characters are + interpreted as any other character by the terminal driver. + I personally prefer to use raw() as I can exercise greater + control over what the user does.

+
+ +
+
+ +

4.3. + echo() and noecho()

+ +

These functions control the echoing of characters typed + by the user to the terminal. noecho() switches off echoing. The reason + you might want to do this is to gain more control over + echoing or to suppress unnecessary echoing while taking + input from the user through the getch(), etc. functions. + Most of the interactive programs call noecho() at initialization and do the + echoing of characters in a controlled manner. It gives the + programmer the flexibility of echoing characters at any + place in the window without updating current (y,x) + co-ordinates.

+
+ +
+
+ +

4.4. + keypad()

+ +

This is my favorite initialization function. It enables + the reading of function keys like F1, F2, arrow keys, etc. + Almost every interactive program enables this, as arrow + keys are a major part of any User Interface. Do keypad(stdscr, TRUE) to enable this feature + for the regular screen (stdscr). You will learn more about + key management in later sections of this document.

+
+ +
+
+ +

4.5. + halfdelay()

+ +

This function, though not used very often, is a useful + one at times. halfdelay()is called to enable the half-delay + mode, which is similar to the cbreak() mode in that + characters typed are immediately available to program. + However, it waits for 'X' tenths of a second for input and + then returns ERR, if no input is available. 'X' is the + timeout value passed to the function halfdelay(). This + function is useful when you want to ask the user for input, + and if he doesn't respond with in certain time, we can do + some thing else. One possible example is a timeout at the + password prompt.

+
+ +
+
+ +

4.6. + Miscellaneous Initialization functions

+ +

There are few more functions which are called at + initialization to customize curses behavior. They are not + used as extensively as those mentioned above. Some of them + are explained where appropriate.

+
+ +
+
+ +

4.7. An + Example

+ +

Let's write a program which will clarify the usage of + these functions.

+ +
+ +

Example 2. Initialization Function Usage + example +

+ +
#include <curses.h>
+
+int
+main(void)
+{
+    int ch;
+
+    initscr();                  /* Start curses mode            */
+    raw();                      /* Line buffering disabled      */
+    keypad(stdscr, TRUE);       /* We get F1, F2 etc..          */
+    noecho();                   /* Don't echo() while we do getch */
+
+    printw("Type any character to see it in bold\n");
+    ch = getch();               /* If raw() hadn't been called
+                                 * we have to press enter before it
+                                 * gets to the program          */
+    if (ch == KEY_F(1))         /* Without keypad enabled this will */
+        printw("F1 Key pressed"); /*  not get to us either       */
+                                /* Without noecho() some ugly escape
+                                 * characters might have been printed
+                                 * on screen                    */
+    else {
+        printw("The pressed key is ");
+        attron(A_BOLD);
+        printw("%c", ch);
+        attroff(A_BOLD);
+    }
+    refresh();                  /* Print it on to the real screen */
+    getch();                    /* Wait for user input */
+    endwin();                   /* End curses mode                */
+
+    return 0;
+}
+
+ +

This program is self-explanatory. But I used functions + which aren't explained yet. The function getch() is used to get a character from + user. It is equivalent to normal getchar() except that we can disable the + line buffering to avoid <enter> after input. Look for + more about getch()and reading keys + in the key management section . The + functions attron and attroff are used to switch some + attributes on and off respectively. In the example I used + them to print the character in bold. These functions are + explained in detail later.

+
+
+ +
+
+ +

5. + A Word about Windows

+ +

Before we plunge into the myriad ncurses functions, let me + clear few things about windows. Windows are explained in + detail in following sections

+ +

A Window is an imaginary screen defined by curses system. + A window does not mean a bordered window which you usually + see on Win9X platforms. When curses is initialized, it + creates a default window named stdscr which represents your 80x25 (or the + size of window in which you are running) screen. If you are + doing simple tasks like printing few strings, reading input, + etc., you can safely use this single window for all of your + purposes. You can also create windows and call functions + which explicitly work on the specified window.

+ +

For example, if you call

+ +
    printw("Hi There !!!");
+    refresh();
+

It prints the string on stdscr at the present cursor + position. Similarly the call to refresh(), works on stdscr + only.

+ +

Say you have created windows then + you have to call a function with a 'w' added to the usual + function.

+ +
    wprintw(win, "Hi There !!!");
+    wrefresh(win);
+

As you will see in the rest of the document, naming of + functions follow the same convention. For each function there + usually are three more functions.

+ +
    printw(string);        /* Print on stdscr at present cursor position */
+    mvprintw(y, x, string);/* Move to (y, x) then print string     */
+    wprintw(win, string);  /* Print on window win at present cursor position */
+                           /* in the window */
+    mvwprintw(win, y, x, string);   /* Move to (y, x) relative to window */
+                                    /* co-ordinates and then print         */
+

Usually the w-less functions are macros which expand to + corresponding w-function with stdscr as the window + parameter.

+
+ +
+
+ +

6. Output + functions

+ +

I guess you can't wait any more to see some action. Back + to our odyssey of curses functions. Now that curses is + initialized, let's interact with world.

+ +

There are three classes of functions which you can use to + do output on screen.

+ +
    +
  1. +

    addch() class: Print single character with + attributes

    +
  2. + +
  3. +

    printw() class: Print formatted output similar to + printf()

    +
  4. + +
  5. +

    addstr() class: Print strings

    +
  6. +
+ +

These functions can be used interchangeably and it is a + matter of style as to which class is used. Let's see each one + in detail.

+ +
+
+ +

6.1. + addch() class of functions

+ +

These functions put a single character into the current + cursor location and advance the position of the cursor. You + can give the character to be printed but they usually are + used to print a character with some attributes. Attributes + are explained in detail in later sections of the document. If a character is + associated with an attribute(bold, reverse video etc.), + when curses prints the character, it is printed in that + attribute.

+ +

In order to combine a character with some attributes, + you have two options:

+ +
    +
  • +

    By OR'ing a single character with the desired + attribute macros. These attribute macros could be found + in the header file ncurses.h. + For example, you want to print a character ch(of type + char) bold and underlined, you would call addch() as + below.

    + +
        addch(ch | A_BOLD | A_UNDERLINE);
    +
  • + +
  • +

    By using functions like attrset(),attron(),attroff(). These + functions are explained in the Attributes section. Briefly, they + manipulate the current attributes of the given window. + Once set, the character printed in the window are + associated with the attributes until it is turned + off.

    +
  • +
+ +

Additionally, curses provides + some special characters for character-based graphics. You + can draw tables, horizontal or vertical lines, etc. You can + find all available characters in the header file ncurses.h. Try looking for macros beginning + with ACS_ in this file.

+
+ +
+
+ +

6.2. + mvaddch(), waddch() and mvwaddch()

+ +

mvaddch() is used to move the + cursor to a given point, and then print. Thus, the + calls:

+ +
    move(row,col);    /* moves the cursor to rowth row and colth column */
+    addch(ch);
can be replaced by + +
    mvaddch(row,col,ch);
+

waddch() is similar to + addch(), except that it adds a + character into the given window. (Note that addch() adds a character into the window + stdscr.)

+ +

In a similar fashion mvwaddch() + function is used to add a character into the given window + at the given coordinates.

+ +

Now, we are familiar with the basic output function + addch(). But, if we want to print + a string, it would be very annoying to print it character + by character. Fortunately, ncurses + provides printf-like or + puts-like + functions.

+
+ +
+
+ +

6.3. printw() class of functions

+ +

These functions are similar to printf() with the added capability of + printing at any position on the screen.

+ +
+
+ +

6.3.1. printw() and mvprintw

+ +

These two functions work much like printf(). mvprintw() can be used to move the cursor + to a position and then print. If you want to move the + cursor first and then print using printw() function, use move() first and then use printw() though I see no point why one + should avoid using mvprintw(), + you have the flexibility to manipulate.

+
+ +
+
+ +

6.3.2. wprintw() and mvwprintw

+ +

These two functions are similar to above two except + that they print in the corresponding window given as + argument.

+
+ +
+
+ +

6.3.3. + vw_printw()

+ +

This function is similar to vprintf(). This can be used when variable + number of arguments are to be printed.

+
+ +
+
+ +

6.3.4. A Simple printw example

+ +
+ +

Example 3. A Simple printw example +

+ +
#include <curses.h>
+#include <string.h>
+
+int
+main(void)
+{
+    char mesg[] = "Just a string";      /* message to be appeared on the screen */
+    int row, col;               /* to store the number of rows and *
+                                 * the number of columns of the screen */
+    initscr();                  /* start the curses mode */
+    getmaxyx(stdscr, row, col); /* get the number of rows and columns */
+    mvprintw(row / 2, (col - (int) strlen(mesg)) / 2, "%s", mesg);
+    /* print the message at the center of the screen */
+    mvprintw(row - 2, 0, "This screen has %d rows and %d columns\n", row, col);
+    printw("Try resizing your window(if possible) and then run this program again");
+    refresh();
+    getch();
+    endwin();
+
+    return 0;
+}
+
+ +

Above program demonstrates how easy it is to use + printw. You just feed the + coordinates and the message to be appeared on the screen, + then it does what you want.

+ +

The above program introduces us to a new function + getmaxyx(), a macro defined in + ncurses.h. It gives the number + of columns and the number of rows in a given window. + getmaxyx() does this by updating + the variables given to it. Since getmaxyx() is not a function we don't pass + pointers to it, we just give two integer variables.

+
+
+ +
+
+ +

6.4. addstr() class of functions

+ +

addstr() is used to put a + character string into a given window. This function is + similar to calling addch() once + for each character in a given string. This is true for all + output functions. There are other functions from this + family such as mvaddstr(),mvwaddstr() and waddstr(), which obey the naming convention + of curses.(e.g. mvaddstr() is similar to the respective + calls move() and then addstr().) Another function of this + family is addnstr(), which takes an integer parameter(say + n) additionally. This function puts at most n characters + into the screen. If n is negative, then the entire string + will be added.

+
+ +
+
+ +

6.5. A + word of caution

+ +

All these functions take y co-ordinate first and then x + in their arguments. A common mistake by beginners is to + pass x,y in that order. If you are doing too many + manipulations of (y,x) co-ordinates, think of dividing the + screen into windows and manipulate each one separately. + Windows are explained in the windows + section.

+
+
+ +
+
+ +

7. Input + functions

+ +

Well, printing without taking input, is boring. Let's see + functions which allow us to get input from user. These + functions also can be divided into three categories.

+ +
    +
  1. +

    getch() class: Get a character

    +
  2. + +
  3. +

    scanw() class: Get formatted input

    +
  4. + +
  5. +

    getstr() class: Get strings

    +
  6. +
+ +
+
+ +

7.1. + getch() class of functions

+ +

These functions read a single character from the + terminal. But there are several subtle facts to consider. + For example if you don't use the function cbreak(), curses + will not read your input characters contiguously but will + begin read them only after a new line or an EOF is + encountered. In order to avoid this, the cbreak() function + must used so that characters are immediately available to + your program. Another widely used function is noecho(). As + the name suggests, when this function is set (used), the + characters that are keyed in by the user will not show up + on the screen. The two functions cbreak() and noecho() are + typical examples of key management. Functions of this genre + are explained in the key management + section .

+
+ +
+
+ +

7.2. + scanw() class of functions

+ +

These functions are similar to scanf() with the added capability of getting + the input from any location on the screen.

+ +
+
+ +

7.2.1. scanw() and mvscanw

+ +

The usage of these functions is similar to that of + sscanf(), where the line to be + scanned is provided by wgetstr() + function. That is, these functions call to wgetstr() function(explained below) and + uses the resulting line for a scan.

+
+ +
+
+ +

7.2.2. wscanw() and mvwscanw()

+ +

These are similar to above two functions except that + they read from a window, which is supplied as one of the + arguments to these functions.

+
+ +
+
+ +

7.2.3. + vw_scanw()

+ +

This function is similar to vscanf(). This can be used when a variable + number of arguments are to be scanned.

+
+
+ +
+
+ +

7.3. getstr() class of functions

+ +

These functions are used to get strings from the + terminal. In essence, this function performs the same task + as would be achieved by a series of calls to getch() until a newline, carriage return, or + end-of-file is received. The resulting string of characters + are pointed to by str, which is a + character pointer provided by the user.

+
+ +
+
+ +

7.4. + Some examples

+ +
+ +

Example 4. A Simple scanw example +

+ +
#include <curses.h>
+#include <string.h>
+
+int
+main(void)
+{
+    char mesg[] = "Enter a string: ";   /* message to be appeared on the screen */
+    char str[80];
+    int row, col;               /* to store the number of rows and *
+                                 * the number of columns of the screen */
+    initscr();                  /* start the curses mode */
+    getmaxyx(stdscr, row, col); /* get the number of rows and columns */
+    mvprintw(row / 2, (col - (int) strlen(mesg)) / 2, "%s", mesg);
+    /* print the message at the center of the screen */
+    getstr(str);
+    mvprintw(LINES - 2, 0, "You Entered: %s", str);
+    getch();
+    endwin();
+
+    return 0;
+}
+
+
+
+ +
+
+ +

8. + Attributes

+ +

We have seen an example of how attributes can be used to + print characters with some special effects. Attributes, when + set prudently, can present information in an easy, + understandable manner. The following program takes a C file + as input and prints the file with comments in bold. Scan + through the code.

+ +
+ +

Example 5. A Simple Attributes example +

+ +
/* pager functionality by Joseph Spainhour" <spainhou@bellsouth.net> */
+#include <curses.h>
+#include <stdlib.h>
+
+int
+main(int argc, char *argv[])
+{
+    int ch, prev, row, col;
+    prev = EOF;
+    FILE *fp;
+    int y, x;
+
+    if (argc != 2) {
+        printf("Usage: %s <a c file name>\n", argv[0]);
+        exit(1);
+    }
+    fp = fopen(argv[1], "r");
+    if (fp == NULL) {
+        perror("Cannot open input file");
+        exit(1);
+    }
+    initscr();                          /* Start curses mode */
+    getmaxyx(stdscr, row, col);         /* find the boundaries of the screeen */
+    (void) col;
+    while ((ch = fgetc(fp)) != EOF)     /* read the file till we reach the end */
+    {
+        getyx(stdscr, y, x);            /* get the current cursor position */
+        if (y == (row - 1))             /* are we are at the end of the screen */
+        {
+            printw("<-Press Any Key->"); /* tell the user to press a key */
+            getch();
+            clear();                    /* clear the screen */
+            move(0, 0);                 /* start at the beginning of the screen */
+        }
+        if (prev == '/' && ch == '*')   /* If it is / and * then only
+                                         * switch bold on */
+        {
+            attron(A_BOLD);             /* cut bold on */
+            getyx(stdscr, y, x);        /* get the current cursor position */
+            move(y, x - 1);             /* back up one space */
+            printw("%c%c", '/', ch);    /* The actual printing is done here */
+        } else
+            printw("%c", ch);
+        refresh();
+        if (prev == '*' && ch == '/')
+            attroff(A_BOLD);    /* Switch it off once we got *
+                                 * and then / */
+        prev = ch;
+    }
+    endwin();                   /* End curses mode */
+    fclose(fp);
+    return 0;
+}
+
+ +

Don't worry about all those initialization and other crap. + Concentrate on the while loop. It reads each character in the + file and searches for the pattern /*. Once it spots the + pattern, it switches the BOLD attribute on with attron() . When we get the pattern */ it is + switched off by attroff() .

+ +

The above program also introduces us to two useful + functions getyx() and move(). The first function gets the + co-ordinates of the present cursor into the variables y, x. + Since getyx() is a macro we don't have to pass pointers to + variables. The function move() moves + the cursor to the co-ordinates given to it.

+ +

The above program is really a simple one which doesn't do + much. On these lines one could write a more useful program + which reads a C file, parses it and prints it in different + colors. One could even extend it to other languages as + well.

+ +
+
+ +

8.1. The details

+ +

Let's get into more details of attributes. The functions + attron(), attroff(), attrset() , + and their sister functions attr_get(), etc. can be used to switch + attributes on/off , get attributes and produce a colorful + display.

+ +

The functions attron and attroff take a bit-mask of + attributes and switch them on or off, respectively. The + following video attributes, which are defined in + <curses.h> can be passed to these functions.

+ +

    A_NORMAL        Normal display (no highlight)
+    A_STANDOUT      Best highlighting mode of the terminal.
+    A_UNDERLINE     Underlining
+    A_REVERSE       Reverse video
+    A_BLINK         Blinking
+    A_DIM           Half bright
+    A_BOLD          Extra bright or bold
+    A_PROTECT       Protected mode
+    A_INVIS         Invisible or blank mode
+    A_ALTCHARSET    Alternate character set
+    A_CHARTEXT      Bit-mask to extract a character
+    COLOR_PAIR(n)   Color-pair number n
+

The last one is the most colorful one :-) Colors are + explained in the next + sections.

+ +

We can OR(|) any number of above attributes to get a + combined effect. If you wanted reverse video with blinking + characters you can use

+ +
    attron(A_REVERSE | A_BLINK);
+
+ +
+
+ +

8.2. attron() vs attrset()

+ +

Then what is the difference between attron() and + attrset()? attrset sets the attributes of window whereas + attron just switches on the attribute given to it. So + attrset() fully overrides whatever attributes the window + previously had and sets it to the new attribute(s). + Similarly attroff() just switches off the attribute(s) + given to it as an argument. This gives us the flexibility + of managing attributes easily.But if you use them + carelessly you may loose track of what attributes the + window has and garble the display. This is especially true + while managing menus with colors and highlighting. So + decide on a consistent policy and stick to it. You can + always use standend() which is + equivalent to attrset(A_NORMAL) + which turns off all attributes and brings you to normal + mode.

+
+ +
+
+ +

8.3. + attr_get()

+ +

The function attr_get() gets the current attributes and + color pair of the window. Though we might not use this as + often as the above functions, this is useful in scanning + areas of screen. Say we wanted to do some complex update on + screen and we are not sure what attribute each character is + associated with. Then this function can be used with either + attrset or attron to produce the desired effect.

+
+ +
+
+ +

8.4. + attr_ functions

+ +

There are series of functions like attr_set(), attr_on, + etc. These are similar to above functions except that they + take parameters of type attr_t.

+
+ +
+
+ +

8.5. + wattr functions

+ +

For each of the above functions we have a corresponding + function with 'w' which operates on a particular window. + The above functions operate on stdscr.

+
+ +
+
+ +

8.6. chgat() + functions

+ +

The function chgat() is listed in the end of the man + page curs_attr. It actually is a useful one. This function + can be used to set attributes for a group of characters + without moving. I mean it !!! without moving the cursor :-) + It changes the attributes of a given number of characters + starting at the current cursor location.

+ +

We can give -1 as the character count to update till end + of line. If you want to change attributes of characters + from current position to end of line, just use this.

+ +
    chgat(-1, A_REVERSE, 0, NULL);
+

This function is useful when changing attributes for + characters that are already on the screen. Move to the + character from which you want to change and change the + attribute.

+ +

Other functions wchgat(), mvchgat(), wchgat() behave + similarly except that the w functions operate on the + particular window. The mv functions first move the cursor + then perform the work given to them. Actually chgat is a + macro which is replaced by a wchgat() with stdscr as the + window. Most of the "w-less" functions are macros.

+ +
+ +

Example 6. Chgat() Usage example +

+ +
#include <curses.h>
+
+int
+main(void)
+{
+    initscr();                  /* Start curses mode            */
+    start_color();              /* Start color functionality    */
+
+    init_pair(1, COLOR_CYAN, COLOR_BLACK);
+    printw("A Big string which i didn't care to type fully ");
+    mvchgat(0, 0, -1, A_BLINK, 1, NULL);
+    /* 
+     * First two parameters specify the position at which to start 
+     * Third parameter number of characters to update. -1 means till 
+     * end of line
+     * Forth parameter is the normal attribute you wanted to give 
+     * to the character
+     * Fifth is the color index. It is the index given during init_pair()
+     * use 0 if you didn't want color
+     * Sixth one is always NULL 
+     */
+    refresh();
+    getch();
+    endwin();                   /* End curses mode                */
+    return 0;
+}
+
+ +

This example also introduces us to the color world of + curses. Colors will be explained in detail later. Use 0 for + no color.

+
+
+ +
+
+ +

9. + Windows

+ +

Windows form the most important concept in curses. You + have seen the standard window stdscr above where all the + functions implicitly operated on this window. Now to make + design even a simplest GUI, you need to resort to windows. + The main reason you may want to use windows is to manipulate + parts of the screen separately, for better efficiency, by + updating only the windows that need to be changed and for a + better design. I would say the last reason is the most + important in going for windows. You should always strive for + a better and easy-to-manage design in your programs. If you + are writing big, complex GUIs this is of pivotal importance + before you start doing anything.

+ +
+
+ +

9.1. The basics

+ +

A Window can be created by calling the function + newwin(). It doesn't create any + thing on the screen actually. It allocates memory for a + structure to manipulate the window and updates the + structure with data regarding the window such as its size, + beginy, beginx, etc. Hence in curses, a window is just an + abstraction of an imaginary window, which can be + manipulated independent of other parts of screen. The + function newwin() returns a pointer to structure WINDOW, + which can be passed to window related functions such as + wprintw(), etc. Finally the window can be destroyed with + delwin(). It will deallocate the memory associated with the + window structure.

+
+ +
+
+ +

9.2. Let there be a Window !!!

+ +

What fun is it, if a window is created and we can't see + it. So the fun part begins by displaying the window. The + function box() can be used to draw + a border around the window. Let's explore these functions + in more detail in this example.

+ +
+ +

Example 7. Window Border example +

+ +
#include <curses.h>
+
+WINDOW *create_newwin(int height, int width, int starty, int startx);
+void destroy_win(WINDOW *local_win);
+
+int
+main(void)
+{
+    WINDOW *my_win;
+    int startx, starty, width, height;
+    int ch;
+
+    initscr();                  /* Start curses mode            */
+    cbreak();                   /* Line buffering disabled, Pass on
+                                 * every thing to me            */
+    keypad(stdscr, TRUE);       /* I need that nifty F1         */
+
+    height = 3;
+    width = 10;
+    starty = (LINES - height) / 2;      /* Calculating for a center placement */
+    startx = (COLS - width) / 2;        /* of the window                */
+    printw("Press F1 to exit");
+    refresh();
+    my_win = create_newwin(height, width, starty, startx);
+
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case KEY_LEFT:
+            destroy_win(my_win);
+            my_win = create_newwin(height, width, starty, --startx);
+            break;
+        case KEY_RIGHT:
+            destroy_win(my_win);
+            my_win = create_newwin(height, width, starty, ++startx);
+            break;
+        case KEY_UP:
+            destroy_win(my_win);
+            my_win = create_newwin(height, width, --starty, startx);
+            break;
+        case KEY_DOWN:
+            destroy_win(my_win);
+            my_win = create_newwin(height, width, ++starty, startx);
+            break;
+        }
+    }
+
+    endwin();                   /* End curses mode                */
+    return 0;
+}
+
+WINDOW *
+create_newwin(int height, int width, int starty, int startx)
+{
+    WINDOW *local_win;
+
+    local_win = newwin(height, width, starty, startx);
+    box(local_win, 0, 0);       /* 0, 0 gives default characters 
+                                 * for the vertical and horizontal
+                                 * lines                        */
+    wrefresh(local_win);        /* Show that box                */
+
+    return local_win;
+}
+
+void
+destroy_win(WINDOW *local_win)
+{
+    /* box(local_win, ' ', ' '); : This won't produce the desired
+     * result of erasing the window. It will leave its four corners 
+     * and so an ugly remnant of window. 
+     */
+    wborder(local_win, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
+    /* The parameters taken are 
+     * 1. win: the window on which to operate
+     * 2. ls: character to be used for the left side of the window 
+     * 3. rs: character to be used for the right side of the window 
+     * 4. ts: character to be used for the top side of the window 
+     * 5. bs: character to be used for the bottom side of the window 
+     * 6. tl: character to be used for the top left corner of the window 
+     * 7. tr: character to be used for the top right corner of the window 
+     * 8. bl: character to be used for the bottom left corner of the window 
+     * 9. br: character to be used for the bottom right corner of the window
+     */
+    wrefresh(local_win);
+    delwin(local_win);
+}
+
+
+ +
+
+ +

9.3. Explanation

+ +

Don't scream. I know it is a big example. But I have to + explain some important things here :-). This program + creates a rectangular window that can be moved with left, + right, up, down arrow keys. It repeatedly creates and + destroys windows as user press a key. Don't go beyond the + screen limits. Checking for those limits is left as an + exercise for the reader. Let's dissect it by line by + line.

+ +

The create_newwin() function + creates a window with newwin() and + displays a border around it with box. The function + destroy_win() first erases the + window from screen by painting a border with ' ' character + and then calling delwin() to + deallocate memory related to it. Depending on the key the + user presses, starty or startx is changed and a new window + is created.

+ +

In the destroy_win, as you can see, I used wborder + instead of box. The reason is written in the comments (You + missed it. I know. Read the code :-)). wborder draws a + border around the window with the characters given to it as + the 4 corner points and the 4 lines. To put it clearly, if + you have called wborder as below:

+ +
    wborder(win, '|', '|', '-', '-', '+', '+', '+', '+');
+

it produces something like

+ +
    +------------+
+    |            |
+    |            |
+    |            |
+    |            |
+    |            |
+    |            |
+    +------------+
+
+ +
+
+ +

9.4. + The other stuff in the example

+ +

You can also see in the above examples, that I have used + the variables COLS, LINES which are initialized to the + screen sizes after initscr(). They can be useful in finding + screen dimensions and finding the center co-ordinate of the + screen as above. The function getch() as usual gets the key from keyboard + and according to the key it does the corresponding work. + This type of switch- case is very common in any GUI based + programs.

+
+ +
+
+ +

9.5. Other Border functions

+ +

Above program is grossly inefficient in that with each + press of a key, a window is destroyed and another is + created. So let's write a more efficient program which uses + other border related functions.

+ +

The following program uses mvhline() and mvvline() to achieve similar effect. These + two functions are simple. They create a horizontal or + vertical line of the specified length at the specified + position.

+ +
+ +

Example 8. More border functions +

+ +
#include <curses.h>
+
+typedef struct _win_border_struct {
+    chtype ls, rs, ts, bs, tl, tr, bl, br;
+} WIN_BORDER;
+
+typedef struct _WIN_struct {
+
+    int startx, starty;
+    int height, width;
+    WIN_BORDER border;
+} WIN;
+
+void init_win_params(WIN * p_win);
+void print_win_params(WIN * p_win);
+void create_box(WIN * win, bool flag);
+
+int
+main(void)
+{
+    WIN win;
+    int ch;
+
+    initscr();                  /* Start curses mode            */
+    start_color();              /* Start the color functionality */
+    cbreak();                   /* Line buffering disabled, Pass on
+                                 * everty thing to me                 */
+    keypad(stdscr, TRUE);       /* I need that nifty F1         */
+    noecho();
+    init_pair(1, COLOR_CYAN, COLOR_BLACK);
+
+    /* Initialize the window parameters */
+    init_win_params(&win);
+    print_win_params(&win);
+
+    attron(COLOR_PAIR(1));
+    printw("Press F1 to exit");
+    refresh();
+    attroff(COLOR_PAIR(1));
+
+    create_box(&win, TRUE);
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case KEY_LEFT:
+            create_box(&win, FALSE);
+            --win.startx;
+            create_box(&win, TRUE);
+            break;
+        case KEY_RIGHT:
+            create_box(&win, FALSE);
+            ++win.startx;
+            create_box(&win, TRUE);
+            break;
+        case KEY_UP:
+            create_box(&win, FALSE);
+            --win.starty;
+            create_box(&win, TRUE);
+            break;
+        case KEY_DOWN:
+            create_box(&win, FALSE);
+            ++win.starty;
+            create_box(&win, TRUE);
+            break;
+        }
+    }
+    endwin();                   /* End curses mode                */
+    return 0;
+}
+void
+init_win_params(WIN * p_win)
+{
+    p_win->height = 3;
+    p_win->width = 10;
+    p_win->starty = (LINES - p_win->height) / 2;
+    p_win->startx = (COLS - p_win->width) / 2;
+
+    p_win->border.ls = '|';
+    p_win->border.rs = '|';
+    p_win->border.ts = '-';
+    p_win->border.bs = '-';
+    p_win->border.tl = '+';
+    p_win->border.tr = '+';
+    p_win->border.bl = '+';
+    p_win->border.br = '+';
+
+}
+
+void
+print_win_params(WIN * p_win)
+{
+#ifdef _DEBUG
+    mvprintw(25, 0, "%d %d %d %d", p_win->startx, p_win->starty,
+             p_win->width, p_win->height);
+    refresh();
+#else
+    (void) p_win;
+#endif
+}
+
+void
+create_box(WIN * p_win, bool flag)
+{
+    int i, j;
+    int x, y, w, h;
+
+    x = p_win->startx;
+    y = p_win->starty;
+    w = p_win->width;
+    h = p_win->height;
+
+    if (flag == TRUE) {
+        mvaddch(y, x, p_win->border.tl);
+        mvaddch(y, x + w, p_win->border.tr);
+        mvaddch(y + h, x, p_win->border.bl);
+        mvaddch(y + h, x + w, p_win->border.br);
+        mvhline(y, x + 1, p_win->border.ts, w - 1);
+        mvhline(y + h, x + 1, p_win->border.bs, w - 1);
+        mvvline(y + 1, x, p_win->border.ls, h - 1);
+        mvvline(y + 1, x + w, p_win->border.rs, h - 1);
+
+    } else
+        for (j = y; j <= y + h; ++j)
+            for (i = x; i <= x + w; ++i)
+                mvaddch(j, i, ' ');
+
+    refresh();
+}
+
+
+
+ +
+
+ +

10. Colors

+ +
+

10.1. The basics

+ +

Life seems dull with no colors. Curses has a nice + mechanism to handle colors. Let's get into the thick of the + things with a small program.

+ +
+ +

Example 9. A Simple Color example +

+ +
#include <stdlib.h>
+#include <string.h>
+#include <curses.h>
+
+void print_in_middle(WINDOW *win, int starty, int startx, int width, const char *string);
+
+int
+main(void)
+{
+    initscr();                  /* Start curses mode            */
+    if (has_colors() == FALSE) {
+        endwin();
+        printf("Your terminal does not support color\n");
+        exit(1);
+    }
+    start_color();              /* Start color                  */
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+
+    attron(COLOR_PAIR(1));
+    print_in_middle(stdscr, LINES / 2, 0, 0, "Viola !!! In color ...");
+    attroff(COLOR_PAIR(1));
+    getch();
+    endwin();
+}
+void
+print_in_middle(WINDOW *win, int starty, int startx, int width, const char *string)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    mvwprintw(win, y, x, "%s", string);
+    refresh();
+}
+
+ +

As you can see, to start using color, you should first + call the function start_color(). + After that, you can use color capabilities of your + terminals using various functions. To find out whether a + terminal has color capabilities or not, you can use + has_colors() function, which + returns FALSE if the terminal does not support color.

+ +

Curses initializes all the colors supported by terminal + when start_color() is called. These can be accessed by the + define constants like COLOR_BLACK + , etc. Now to actually start using colors, you have to + define pairs. Colors are always used in pairs. That means + you have to use the function init_pair() to define the foreground and + background for the pair number you give. After that that + pair number can be used as a normal attribute with + COLOR_PAIR()function. This may + seem to be cumbersome at first. But this elegant solution + allows us to manage color pairs very easily. To appreciate + it, you have to look into the the source code of "dialog", + a utility for displaying dialog boxes from shell scripts. + The developers have defined foreground and background + combinations for all the colors they might need and + initialized at the beginning. This makes it very easy to + set attributes just by accessing a pair which we already + have defined as a constant.

+ +

The following colors are defined in curses.h. You can use these as parameters + for various color functions.

+ +
        COLOR_BLACK   0
+        COLOR_RED     1
+        COLOR_GREEN   2
+        COLOR_YELLOW  3
+        COLOR_BLUE    4
+        COLOR_MAGENTA 5
+        COLOR_CYAN    6
+        COLOR_WHITE   7
+
+ +
+
+ +

10.2. Changing Color Definitions

+ +

The function init_color()can be + used to change the rgb values for the colors defined by + curses initially. Say you wanted to lighten the intensity + of red color by a minuscule. Then you can use this function + as

+ +
    init_color(COLOR_RED, 700, 0, 0);
+    /* param 1     : color name
+     * param 2, 3, 4 : rgb content min = 0, max = 1000 */
+

If your terminal cannot change the color definitions, + the function returns ERR. The function can_change_color() can be used to find out + whether the terminal has the capability of changing color + content or not. The rgb content is scaled from 0 to 1000. + Initially RED color is defined with content 1000(r), 0(g), + 0(b).

+
+ +
+
+ +

10.3. Color Content

+ +

The functions color_content() + and pair_content() can be used to + find the color content and foreground, background + combination for the pair.

+
+
+ +
+
+ +

11. Interfacing + with the key board

+ +
+

11.1. The Basics

+ +

No GUI is complete without a strong user interface and + to interact with the user, a curses program should be + sensitive to key presses or the mouse actions done by the + user. Let's deal with the keys first.

+ +

As you have seen in almost all of the above examples, it + is very easy to get key input from the user. A simple way + of getting key presses is to use getch() function. The cbreak mode should be + enabled to read keys when you are interested in reading + individual key hits rather than complete lines of text + (which usually end with a carriage return). keypad should + be enabled to get the Functions keys, arrow keys, etc. See + the initialization section for details.

+ +

getch() returns an integer + corresponding to the key pressed. If it is a normal + character, the integer value will be equivalent to the + character. Otherwise it returns a number which can be + matched with the constants defined in curses.h. For example if the user presses + F1, the integer returned is 265. This can be checked using + the macro KEY_F() defined in curses.h. This makes reading + keys portable and easy to manage.

+ +

For example, if you call getch() like this

+ +
    int ch;
+
+    ch = getch();
+

getch() will wait for the user to press a key, (unless + you specified a timeout) and when user presses a key, the + corresponding integer is returned. Then you can check the + value returned with the constants defined in curses.h to + match against the keys you want.

+ +

The following code piece will do that job.

+ +
    if(ch == KEY_LEFT)
+        printw("Left arrow is pressed\n");
+

Let's write a small program which creates a menu which + can be navigated by up and down arrows.

+
+ +
+
+ +

11.2. A Simple Key Usage example

+ +
+ +

Example 10. A Simple Key Usage example +

+ +
#include <curses.h>
+
+#define WIDTH 30
+#define HEIGHT 10
+
+int startx = 0;
+int starty = 0;
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Exit",
+};
+int n_choices = sizeof(choices) / sizeof(char *);
+void print_menu(WINDOW *menu_win, int highlight);
+
+int
+main(void)
+{
+    WINDOW *menu_win;
+    int highlight = 1;
+    int choice = 0;
+    int c;
+
+    initscr();
+    clear();
+    noecho();
+    cbreak();                   /* Line buffering disabled. pass on everything */
+    startx = (80 - WIDTH) / 2;
+    starty = (24 - HEIGHT) / 2;
+
+    menu_win = newwin(HEIGHT, WIDTH, starty, startx);
+    keypad(menu_win, TRUE);
+    mvprintw(0, 0,
+             "Use arrow keys to go up and down, Press enter to select a choice");
+    refresh();
+    print_menu(menu_win, highlight);
+    while (1) {
+        c = wgetch(menu_win);
+        switch (c) {
+        case KEY_UP:
+            if (highlight == 1)
+                highlight = n_choices;
+            else
+                --highlight;
+            break;
+        case KEY_DOWN:
+            if (highlight == n_choices)
+                highlight = 1;
+            else
+                ++highlight;
+            break;
+        case 10:
+            choice = highlight;
+            break;
+        default:
+            mvprintw(24, 0,
+                     "Character pressed is = %3d Hopefully it can be printed as '%c'",
+                     c, c);
+            refresh();
+            break;
+        }
+        print_menu(menu_win, highlight);
+        if (choice != 0)        /* User did a choice come out of the infinite loop */
+            break;
+    }
+    mvprintw(23, 0, "You chose choice %d with choice string %s\n", choice,
+             choices[choice - 1]);
+    clrtoeol();
+    refresh();
+    endwin();
+    return 0;
+}
+
+void
+print_menu(WINDOW *menu_win, int highlight)
+{
+    int x, y, i;
+
+    x = 2;
+    y = 2;
+    box(menu_win, 0, 0);
+    for (i = 0; i < n_choices; ++i) {
+        if (highlight == i + 1) /* Highlight the present choice */
+        {
+            wattron(menu_win, A_REVERSE);
+            mvwprintw(menu_win, y, x, "%s", choices[i]);
+            wattroff(menu_win, A_REVERSE);
+        } else
+            mvwprintw(menu_win, y, x, "%s", choices[i]);
+        ++y;
+    }
+    wrefresh(menu_win);
+}
+
+
+
+ +
+
+ +

12. Interfacing + with the mouse

+ +

Now that you have seen how to get keys, lets do the same + thing from mouse. Usually each UI allows the user to interact + with both keyboard and mouse.

+ +
+
+ +

12.1. The Basics

+ +

Before you do any thing else, the events you want to + receive have to be enabled with mousemask().

+ +
    mousemask(  mmask_t newmask,    /* The events you want to listen to */
+                mmask_t *oldmask)    /* The old events mask                */
+

The first parameter to above function is a bit mask of + events you would like to listen. By default, all the events + are turned off. The bit mask ALL_MOUSE_EVENTS can be used to get all the + events.

+ +

The following are all the event masks:

+ +
    Name            Description
+       ---------------------------------------------------------------------
+       BUTTON1_PRESSED          mouse button 1 down
+       BUTTON1_RELEASED         mouse button 1 up
+       BUTTON1_CLICKED          mouse button 1 clicked
+       BUTTON1_DOUBLE_CLICKED   mouse button 1 double clicked
+       BUTTON1_TRIPLE_CLICKED   mouse button 1 triple clicked
+       BUTTON2_PRESSED          mouse button 2 down
+       BUTTON2_RELEASED         mouse button 2 up
+       BUTTON2_CLICKED          mouse button 2 clicked
+       BUTTON2_DOUBLE_CLICKED   mouse button 2 double clicked
+       BUTTON2_TRIPLE_CLICKED   mouse button 2 triple clicked
+       BUTTON3_PRESSED          mouse button 3 down
+       BUTTON3_RELEASED         mouse button 3 up
+       BUTTON3_CLICKED          mouse button 3 clicked
+       BUTTON3_DOUBLE_CLICKED   mouse button 3 double clicked
+       BUTTON3_TRIPLE_CLICKED   mouse button 3 triple clicked
+       BUTTON4_PRESSED          mouse button 4 down
+       BUTTON4_RELEASED         mouse button 4 up
+       BUTTON4_CLICKED          mouse button 4 clicked
+       BUTTON4_DOUBLE_CLICKED   mouse button 4 double clicked
+       BUTTON4_TRIPLE_CLICKED   mouse button 4 triple clicked
+       BUTTON_SHIFT             shift was down during button state change
+       BUTTON_CTRL              control was down during button state change
+       BUTTON_ALT               alt was down during button state change
+       ALL_MOUSE_EVENTS         report all button state changes
+       REPORT_MOUSE_POSITION    report mouse movement
+
+ +
+
+ +

12.2. Getting the events

+ +

Once a class of mouse events have been enabled, getch() + class of functions return KEY_MOUSE every time some mouse + event happens. Then the mouse event can be retrieved with + getmouse().

+ +

The code approximately looks like this:

+ +
    MEVENT event;
+
+    ch = getch();
+    if(ch == KEY_MOUSE)
+        if(getmouse(&event) == OK)
+            .    /* Do some thing with the event */
+            .
+            .
+

getmouse() returns the event into the pointer given to + it. It is a structure which contains

+ +
    typedef struct
+    {
+        short id;         /* ID to distinguish multiple devices */
+        int x, y, z;      /* event coordinates */
+        mmask_t bstate;   /* button state bits */
+    }
+

The bstate is the main variable + we are interested in. It tells the button state of the + mouse.

+ +

Then with a code snippet like the following, we can find + out what happened.

+ +
    if(event.bstate & BUTTON1_PRESSED)
+        printw("Left Button Pressed");
+
+ +
+
+ +

12.3. Putting it all Together

+ +

That's pretty much interfacing with mouse. Let's create + the same menu and enable mouse interaction. To make things + simpler, key handling is removed.

+ +
+ +

Example 11. Access the menu with mouse !!! +

+ +
#include <string.h>
+#include <curses.h>
+
+#define WIDTH 30
+#define HEIGHT 10
+
+int startx = 0;
+int starty = 0;
+
+const char *choices[] =
+{"Choice 1",
+ "Choice 2",
+ "Choice 3",
+ "Choice 4",
+ "Exit",
+};
+
+int n_choices = sizeof(choices) / sizeof(char *);
+
+void print_menu(WINDOW *menu_win, int highlight);
+void report_choice(int mouse_x, int mouse_y, int *p_choice);
+
+int
+main(void)
+{
+    int c, choice = 0;
+    WINDOW *menu_win;
+    MEVENT event;
+
+    /* Initialize curses */
+    initscr();
+    clear();
+    noecho();
+    cbreak();                   /* Line buffering disabled. pass everything */
+
+    /* Try to put the window in the middle of screen */
+    startx = (80 - WIDTH) / 2;
+    starty = (24 - HEIGHT) / 2;
+
+    attron(A_REVERSE);
+    mvprintw(23, 1,
+             "Click on Exit to quit (Works best in a virtual console)");
+    refresh();
+    attroff(A_REVERSE);
+
+    /* Print the menu for the first time */
+    menu_win = newwin(HEIGHT, WIDTH, starty, startx);
+    keypad(menu_win, TRUE);
+    print_menu(menu_win, 1);
+    /* Get all the mouse events */
+    mousemask(ALL_MOUSE_EVENTS, NULL);
+
+    while (1) {
+        c = wgetch(menu_win);
+        switch (c) {
+        case KEY_MOUSE:
+            if (getmouse(&event) == OK) {       /* When the user clicks left mouse button */
+                if (event.bstate & BUTTON1_PRESSED) {
+                    report_choice(event.x + 1, event.y + 1, &choice);
+                    if (choice == -1)   /* Exit chosen */
+                        goto end;
+                    mvprintw(22, 1,
+                             "Choice made is : %d String Chosen is \"%10s\"",
+                             choice, choices[choice - 1]);
+                    refresh();
+                }
+            }
+            print_menu(menu_win, choice);
+            break;
+        }
+    }
+  end:
+    endwin();
+    return 0;
+}
+
+void
+print_menu(WINDOW *menu_win, int highlight)
+{
+    int x, y, i;
+
+    x = 2;
+    y = 2;
+    box(menu_win, 0, 0);
+    for (i = 0; i < n_choices; ++i) {
+        if (highlight == i + 1) {
+            wattron(menu_win, A_REVERSE);
+            mvwprintw(menu_win, y, x, "%s", choices[i]);
+            wattroff(menu_win, A_REVERSE);
+        } else
+            mvwprintw(menu_win, y, x, "%s", choices[i]);
+        ++y;
+    }
+    wrefresh(menu_win);
+}
+
+/* Report the choice according to mouse position */
+void
+report_choice(int mouse_x, int mouse_y, int *p_choice)
+{
+    int i, j, choice;
+
+    i = startx + 2;
+    j = starty + 3;
+
+    for (choice = 0; choice < n_choices; ++choice)
+        if (mouse_y == j + choice
+            && mouse_x >= i
+            && mouse_x <= i + (int) strlen(choices[choice])) {
+            if (choice == n_choices - 1)
+                *p_choice = -1;
+            else
+                *p_choice = choice + 1;
+            break;
+        }
+}
+
+
+ +
+
+ +

12.4. Miscellaneous Functions

+ +

The functions mouse_trafo() and wmouse_trafo() can be + used to convert to mouse co-ordinates to screen relative + co-ordinates. See curs_mouse(3X) man page for details.

+ +

The mouseinterval function sets the maximum time (in + thousands of a second) that can elapse between press and + release events in order for them to be recognized as a + click. This function returns the previous interval value. + The default is one fifth of a second.

+
+
+ +
+
+ +

13. Screen + Manipulation

+ +

In this section, we will look into some functions, which + allow us to manage the screen efficiently and to write some + fancy programs. This is especially important in writing + games.

+ +
+
+ +

13.1. getyx() + functions

+ +

The function getyx() can be + used to find out the present cursor co-ordinates. It will + fill the values of x and y co-ordinates in the arguments + given to it. Since getyx() is a macro you don't have to + pass the address of the variables. It can be called as

+ +
    getyx(win, y, x);
+    /* win: window pointer
+     *   y, x: y, x co-ordinates will be put into this variables
+     */
+

The function getparyx() gets the beginning co-ordinates + of the sub window relative to the main window. This is some + times useful to update a sub window. When designing fancy + stuff like writing multiple menus, it becomes difficult to + store the menu positions, their first option co-ordinates, + etc. A simple solution to this problem, is to create menus + in sub windows and later find the starting co-ordinates of + the menus by using getparyx().

+ +

The functions getbegyx() and getmaxyx() store current + window's beginning and maximum co-ordinates. These + functions are useful in the same way as above in managing + the windows and sub windows effectively.

+
+ +
+
+ +

13.2. Screen Dumping

+ +

While writing games, some times it becomes necessary to + store the state of the screen and restore it back to the + same state. The function scr_dump() can be used to dump the + screen contents to a file given as an argument. Later it + can be restored by scr_restore function. These two simple + functions can be used effectively to maintain a fast moving + game with changing scenarios.

+
+ +
+
+ +

13.3. Window Dumping

+ +

To store and restore windows, the functions putwin() and getwin() can be used. putwin() puts the present window state into + a file, which can be later restored by getwin().

+ +

The function copywin() can be + used to copy a window completely onto another window. It + takes the source and destination windows as parameters and + according to the rectangle specified, it copies the + rectangular region from source to destination window. Its + last parameter specifies whether to overwrite or just + overlay the contents on to the destination window. If this + argument is true, then the copying is non-destructive.

+
+
+ +
+
+ +

14. Miscellaneous + features

+ +

Now you know enough features to write a good curses + program, with all bells and whistles. There are some + miscellaneous functions which are useful in various cases. + Let's go headlong into some of those.

+ +
+
+ +

14.1. + curs_set()

+ +

This function can be used to make the cursor invisible. + The parameter to this function should be

+ +
    0 : invisible      or
+    1 : normal    or
+    2 : very visible.
+
+ +
+
+ +

14.2. + Temporarily Leaving Curses mode

+ +

Some times you may want to get back to cooked mode + (normal line buffering mode) temporarily. In such a case + you will first need to save the tty modes with a call to + def_prog_mode() and then call + endwin() to end the curses mode. + This will leave you in the original tty mode. To get back + to curses once you are done, call reset_prog_mode() . This function returns + the tty to the state stored by def_prog_mode(). Then do refresh(), and you + are back to the curses mode. Here is an example showing the + sequence of things to be done.

+ +
+ +

Example 12. Temporarily Leaving Curses Mode +

+ +
#include <stdlib.h>
+#include <curses.h>
+
+int
+main(void)
+{
+    initscr();                  /* Start curses mode              */
+    printw("Hello World !!!\n");        /* Print Hello World              */
+    refresh();                  /* Print it on to the real screen */
+    def_prog_mode();            /* Save the tty modes             */
+    endwin();                   /* End curses mode temporarily    */
+    system("/bin/sh");          /* Do whatever you like in cooked mode */
+    reset_prog_mode();          /* Return to the previous tty mode */
+    /* stored by def_prog_mode()      */
+    refresh();                  /* Do refresh() to restore the    */
+    /* Screen contents                */
+    printw("Another String\n"); /* Back to curses use the full    */
+    refresh();                  /* capabilities of curses         */
+    endwin();                   /* End curses mode                */
+
+    return 0;
+}
+
+
+ +
+
+ +

14.3. ACS_ + variables

+ +

If you have ever programmed in DOS, you know about those + nifty characters in extended character set. They are + printable only on some terminals. NCURSES functions like + box() use these characters. All + these variables start with ACS meaning alternative + character set. You might have noticed me using these + characters in some of the programs above. Here is an + example showing all the characters.

+ +
+ +

Example 13. ACS Variables Example +

+ +
#include <curses.h>
+
+int main(void)
+{
+    initscr();
+
+    printw("Upper left corner           "); addch(ACS_ULCORNER); printw("\n"); 
+    printw("Lower left corner           "); addch(ACS_LLCORNER); printw("\n");
+    printw("Lower right corner          "); addch(ACS_LRCORNER); printw("\n");
+    printw("Tee pointing right          "); addch(ACS_LTEE); printw("\n");
+    printw("Tee pointing left           "); addch(ACS_RTEE); printw("\n");
+    printw("Tee pointing up             "); addch(ACS_BTEE); printw("\n");
+    printw("Tee pointing down           "); addch(ACS_TTEE); printw("\n");
+    printw("Horizontal line             "); addch(ACS_HLINE); printw("\n");
+    printw("Vertical line               "); addch(ACS_VLINE); printw("\n");
+    printw("Large Plus or cross over    "); addch(ACS_PLUS); printw("\n");
+    printw("Scan Line 1                 "); addch(ACS_S1); printw("\n");
+    printw("Scan Line 3                 "); addch(ACS_S3); printw("\n");
+    printw("Scan Line 7                 "); addch(ACS_S7); printw("\n");
+    printw("Scan Line 9                 "); addch(ACS_S9); printw("\n");
+    printw("Diamond                     "); addch(ACS_DIAMOND); printw("\n");
+    printw("Checker board (stipple)     "); addch(ACS_CKBOARD); printw("\n");
+    printw("Degree Symbol               "); addch(ACS_DEGREE); printw("\n");
+    printw("Plus/Minus Symbol           "); addch(ACS_PLMINUS); printw("\n");
+    printw("Bullet                      "); addch(ACS_BULLET); printw("\n");
+    printw("Arrow Pointing Left         "); addch(ACS_LARROW); printw("\n");
+    printw("Arrow Pointing Right        "); addch(ACS_RARROW); printw("\n");
+    printw("Arrow Pointing Down         "); addch(ACS_DARROW); printw("\n");
+    printw("Arrow Pointing Up           "); addch(ACS_UARROW); printw("\n");
+    printw("Board of squares            "); addch(ACS_BOARD); printw("\n");
+    printw("Lantern Symbol              "); addch(ACS_LANTERN); printw("\n");
+    printw("Solid Square Block          "); addch(ACS_BLOCK); printw("\n");
+    printw("Less/Equal sign             "); addch(ACS_LEQUAL); printw("\n");
+    printw("Greater/Equal sign          "); addch(ACS_GEQUAL); printw("\n");
+    printw("Pi                          "); addch(ACS_PI); printw("\n");
+    printw("Not equal                   "); addch(ACS_NEQUAL); printw("\n");
+    printw("UK pound sign               "); addch(ACS_STERLING); printw("\n");
+
+    refresh();
+    getch();
+    endwin();
+
+    return 0;
+}
+
+
+
+ +
+
+ +

15. Other + libraries

+ +

Apart from the curses library, there are few text mode + libraries, which provide more functionality and a lot of + features. The following sections explain three standard + libraries which are usually distributed along with + curses.

+
+ +
+
+ +

16. Panel + Library

+ +

Now that you are proficient in curses, you wanted to do + some thing big. You created a lot of overlapping windows to + give a professional windows-type look. Unfortunately, it soon + becomes difficult to manage these. The multiple refreshes, + updates plunge you into a nightmare. The overlapping windows + create blotches, whenever you forget to refresh the windows + in the proper order.

+ +

Don't despair. There is an elegant solution provided in + panels library. In the words of developers of ncurses

+ +

When your + interface design is such that windows may dive deeper into + the visibility stack or pop to the top at runtime, the + resulting book-keeping can be tedious and difficult to get + right. Hence the panels library. +

+ +

If you have lot of overlapping windows, then panels + library is the way to go. It obviates the need of doing + series of wnoutrefresh(), doupdate() and relieves the burden + of doing it correctly(bottom up). The library maintains + information about the order of windows, their overlapping and + update the screen properly. So why wait? Let's take a close + peek into panels.

+ +
+
+ +

16.1. The Basics

+ +

Panel object is a window that is implicitly treated as + part of a deck including all other panel objects. The deck + is treated as a stack with the top panel being completely + visible and the other panels may or may not be obscured + according to their positions. So the basic idea is to + create a stack of overlapping panels and use panels library + to display them correctly. There is a function similar to + refresh() which, when called , displays panels in the + correct order. Functions are provided to hide or show + panels, move panels, change its size, etc. The overlapping + problem is managed by the panels library during all the + calls to these functions.

+ +

The general flow of a panel program goes like this:

+ +
    +
  1. +

    Create the windows (with newwin()) to be attached to + the panels.

    +
  2. + +
  3. +

    Create panels with the chosen visibility order. + Stack them up according to the desired visibility. The + function new_panel() is used to created panels.

    +
  4. + +
  5. +

    Call update_panels() to write the panels to the + virtual screen in correct visibility order. Do a + doupdate() to show it on the screen.

    +
  6. + +
  7. +

    Mainpulate the panels with show_panel(), + hide_panel(), move_panel(), etc. Make use of helper + functions like panel_hidden() and panel_window(). Make + use of user pointer to store custom data for a panel. + Use the functions set_panel_userptr() and + panel_userptr() to set and get the user pointer for a + panel.

    +
  8. + +
  9. +

    When you are done with the panel use del_panel() to + delete the panel.

    +
  10. +
+ +

Let's make the concepts clear, with some programs. The + following is a simple program which creates 3 overlapping + panels and shows them on the screen.

+
+ +
+
+ +

16.2. Compiling With the Panels Library

+ +

To use panels library functions, you have to include + panel.h and to link the program with panels library the + flag -lpanel should be added along with -lncurses in that + order.

+ +
    #include <panel.h>
+    .
+    .
+    .
+
+    compile and link: gcc <program file> -lpanel -lncurses
+
+ +

Example 14. Panel basics +

+ +
#include <panel.h>
+
+int
+main(void)
+{
+    WINDOW *my_wins[3];
+    PANEL *my_panels[3];
+    int lines = 10, cols = 40, y = 2, x = 4, i;
+
+    initscr();
+    cbreak();
+    noecho();
+
+    /* Create windows for the panels */
+    my_wins[0] = newwin(lines, cols, y, x);
+    my_wins[1] = newwin(lines, cols, y + 1, x + 5);
+    my_wins[2] = newwin(lines, cols, y + 2, x + 10);
+
+    /* 
+     * Create borders around the windows so that you can see the effect
+     * of panels
+     */
+    for (i = 0; i < 3; ++i)
+        box(my_wins[i], 0, 0);
+
+    /* Attach a panel to each window */
+    /* Order is bottom up */
+    my_panels[0] = new_panel(my_wins[0]);       /* Push 0, order: stdscr-0 */
+    my_panels[1] = new_panel(my_wins[1]);       /* Push 1, order: stdscr-0-1 */
+    my_panels[2] = new_panel(my_wins[2]);       /* Push 2, order: stdscr-0-1-2 */
+
+    /* Update the stacking order. 2nd panel will be on top */
+    update_panels();
+
+    /* Show it on the screen */
+    doupdate();
+
+    getch();
+    endwin();
+    return 0;
+}
+
+ +

As you can see, above program follows a simple flow as + explained. The windows are created with newwin() and then + they are attached to panels with new_panel(). As we attach + one panel after another, the stack of panels gets updated. + To put them on screen update_panels() and doupdate() are + called.

+
+ +
+
+ +

16.3. Panel Window Browsing

+ +

A slightly complicated example is given below. This + program creates 3 windows which can be cycled through using + tab. Have a look at the code.

+ +
+ +

Example 15. Panel Window Browsing Example +

+ +
#include <string.h>
+#include <panel.h>
+
+#define NLINES 10
+#define NCOLS 40
+
+void init_wins(WINDOW **wins, int n);
+void win_show(WINDOW *win, const char *label, int label_color);
+void print_in_middle(WINDOW *win, int starty, int startx,
+                     int width, const char *string, chtype color);
+
+int
+main(void)
+{
+    WINDOW *my_wins[3];
+    PANEL *my_panels[3];
+    PANEL *top;
+    int ch;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize all the colors */
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_GREEN, COLOR_BLACK);
+    init_pair(3, COLOR_BLUE, COLOR_BLACK);
+    init_pair(4, COLOR_CYAN, COLOR_BLACK);
+
+    init_wins(my_wins, 3);
+
+    /* Attach a panel to each window */
+    /* Order is bottom up */
+    my_panels[0] = new_panel(my_wins[0]);       /* Push 0, order: stdscr-0 */
+    my_panels[1] = new_panel(my_wins[1]);       /* Push 1, order: stdscr-0-1 */
+    my_panels[2] = new_panel(my_wins[2]);       /* Push 2, order: stdscr-0-1-2 */
+
+    /* Set up the user pointers to the next panel */
+    set_panel_userptr(my_panels[0], my_panels[1]);
+    set_panel_userptr(my_panels[1], my_panels[2]);
+    set_panel_userptr(my_panels[2], my_panels[0]);
+
+    /* Update the stacking order. 2nd panel will be on top */
+    update_panels();
+
+    /* Show it on the screen */
+    attron(COLOR_PAIR(4));
+    mvprintw(LINES - 2, 0,
+             "Use tab to browse through the windows (F1 to Exit)");
+    attroff(COLOR_PAIR(4));
+    doupdate();
+
+    top = my_panels[2];
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case 9:
+            top = (PANEL *) panel_userptr(top);
+            top_panel(top);
+            break;
+        }
+        update_panels();
+        doupdate();
+    }
+    endwin();
+    return 0;
+}
+
+/* Put all the windows */
+void
+init_wins(WINDOW **wins, int n)
+{
+    int x, y, i;
+    char label[80];
+
+    y = 2;
+    x = 10;
+    for (i = 0; i < n; ++i) {
+        wins[i] = newwin(NLINES, NCOLS, y, x);
+        sprintf(label, "Window Number %d", i + 1);
+        win_show(wins[i], label, i + 1);
+        y += 3;
+        x += 7;
+    }
+}
+
+/* Show the window with a border and a label */
+void
+win_show(WINDOW *win, const char *label, int label_color)
+{
+    int height, width;
+
+    getmaxyx(win, height, width);
+    (void) height;
+
+    box(win, 0, 0);
+    mvwaddch(win, 2, 0, ACS_LTEE);
+    mvwhline(win, 2, 1, ACS_HLINE, width - 2);
+    mvwaddch(win, 2, width - 1, ACS_RTEE);
+
+    print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
+}
+
+void
+print_in_middle(WINDOW *win, int starty, int startx,
+                int width, const char *string, chtype color)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    wattron(win, color);
+    mvwprintw(win, y, x, "%s", string);
+    wattroff(win, color);
+    refresh();
+}
+
+
+ +
+
+ +

16.4. Using User Pointers

+ +

In the above example I used user pointers to find out + the next window in the cycle. We can attach custom + information to the panel by specifying a user pointer, + which can point to any information you want to store. In + this case I stored the pointer to the next panel in the + cycle. User pointer for a panel can be set with the + function set_panel_userptr(). It + can be accessed using the function panel_userptr() which will return the user + pointer for the panel given as argument. After finding the + next panel in the cycle, it is brought to the top by the + function top_panel(). This function brings the panel given + as argument to the top of the panel stack.

+
+ +
+
+ +

16.5. Moving and Resizing Panels

+ +

The function move_panel() can + be used to move a panel to the desired location. It does + not change the position of the panel in the stack. Make + sure that you use move_panel() instead mvwin() on the + window associated with the panel.

+ +

Resizing a panel is slightly complex. There is no + straight forward function just to resize the window + associated with a panel. A solution to resize a panel is to + create a new window with the desired sizes, change the + window associated with the panel using replace_panel(). + Don't forget to delete the old window. The window + associated with a panel can be found by using the function + panel_window().

+ +

The following program shows these concepts, in + supposedly simple program. You can cycle through the window + with <TAB> as usual. To resize or move the active + panel press 'r' for resize 'm' for moving. Then use arrow + keys to resize or move it to the desired way and press + enter to end your resizing or moving. This example makes + use of user data to get the required data to do the + operations.

+ +
+ +

Example 16. Panel Moving and Resizing example +

+ +
#include <stdlib.h>
+#include <string.h>
+#include <panel.h>
+
+typedef struct _PANEL_DATA {
+    int x, y, w, h;
+    char label[80];
+    int label_color;
+    PANEL *next;
+} PANEL_DATA;
+
+#define NLINES 10
+#define NCOLS 40
+
+void init_wins(WINDOW **wins, int n);
+void win_show(WINDOW *win, const char *label, int label_color);
+void print_in_middle(WINDOW *win, int starty, int startx,
+                     int width, const char *string, chtype color);
+void set_user_ptrs(PANEL **panels, int n);
+
+int
+main(void)
+{
+    WINDOW *my_wins[3];
+    PANEL *my_panels[3];
+    PANEL_DATA *top;
+    PANEL *stack_top;
+    WINDOW *temp_win, *old_win;
+    int ch;
+    int newx, newy, neww, newh;
+    int size = FALSE, move = FALSE;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize all the colors */
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_GREEN, COLOR_BLACK);
+    init_pair(3, COLOR_BLUE, COLOR_BLACK);
+    init_pair(4, COLOR_CYAN, COLOR_BLACK);
+
+    init_wins(my_wins, 3);
+
+    /* Attach a panel to each window */
+    /* Order is bottom up */
+    my_panels[0] = new_panel(my_wins[0]);       /* Push 0, order: stdscr-0 */
+    my_panels[1] = new_panel(my_wins[1]);       /* Push 1, order: stdscr-0-1 */
+    my_panels[2] = new_panel(my_wins[2]);       /* Push 2, order: stdscr-0-1-2 */
+
+    set_user_ptrs(my_panels, 3);
+    /* Update the stacking order. 2nd panel will be on top */
+    update_panels();
+
+    /* Show it on the screen */
+    attron(COLOR_PAIR(4));
+    mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");
+    mvprintw(LINES - 2, 0,
+             "Use tab to browse through the windows (F1 to Exit)");
+    attroff(COLOR_PAIR(4));
+    doupdate();
+
+    stack_top = my_panels[2];
+    top = (PANEL_DATA *) panel_userptr(stack_top);
+    newx = top->x;
+    newy = top->y;
+    neww = top->w;
+    newh = top->h;
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case 9:         /* Tab */
+            top = (PANEL_DATA *) panel_userptr(stack_top);
+            top_panel(top->next);
+            stack_top = top->next;
+            top = (PANEL_DATA *) panel_userptr(stack_top);
+            newx = top->x;
+            newy = top->y;
+            neww = top->w;
+            newh = top->h;
+            break;
+        case 'r':               /* Re-Size */
+            size = TRUE;
+            attron(COLOR_PAIR(4));
+            mvprintw(LINES - 4, 0,
+                     "Entered Resizing :Use Arrow Keys to resize and press <ENTER> to end resizing");
+            refresh();
+            attroff(COLOR_PAIR(4));
+            break;
+        case 'm':               /* Move */
+            attron(COLOR_PAIR(4));
+            mvprintw(LINES - 4, 0,
+                     "Entered Moving: Use Arrow Keys to Move and press <ENTER> to end moving");
+            refresh();
+            attroff(COLOR_PAIR(4));
+            move = TRUE;
+            break;
+        case KEY_LEFT:
+            if (size == TRUE) {
+                --newx;
+                ++neww;
+            }
+            if (move == TRUE)
+                --newx;
+            break;
+        case KEY_RIGHT:
+            if (size == TRUE) {
+                ++newx;
+                --neww;
+            }
+            if (move == TRUE)
+                ++newx;
+            break;
+        case KEY_UP:
+            if (size == TRUE) {
+                --newy;
+                ++newh;
+            }
+            if (move == TRUE)
+                --newy;
+            break;
+        case KEY_DOWN:
+            if (size == TRUE) {
+                ++newy;
+                --newh;
+            }
+            if (move == TRUE)
+                ++newy;
+            break;
+        case 10:                /* Enter */
+            move(LINES - 4, 0);
+            clrtoeol();
+            refresh();
+            if (size == TRUE) {
+                old_win = panel_window(stack_top);
+                temp_win = newwin(newh, neww, newy, newx);
+                replace_panel(stack_top, temp_win);
+                win_show(temp_win, top->label, top->label_color);
+                delwin(old_win);
+                size = FALSE;
+            }
+            if (move == TRUE) {
+                move_panel(stack_top, newy, newx);
+                move = FALSE;
+            }
+            break;
+
+        }
+        attron(COLOR_PAIR(4));
+        mvprintw(LINES - 3, 0, "Use 'm' for moving, 'r' for resizing");
+        mvprintw(LINES - 2, 0,
+                 "Use tab to browse through the windows (F1 to Exit)");
+        attroff(COLOR_PAIR(4));
+        refresh();
+        update_panels();
+        doupdate();
+    }
+    endwin();
+    return 0;
+}
+
+/* Put all the windows */
+void
+init_wins(WINDOW **wins, int n)
+{
+    int x, y, i;
+    char label[80];
+
+    y = 2;
+    x = 10;
+    for (i = 0; i < n; ++i) {
+        wins[i] = newwin(NLINES, NCOLS, y, x);
+        sprintf(label, "Window Number %d", i + 1);
+        win_show(wins[i], label, i + 1);
+        y += 3;
+        x += 7;
+    }
+}
+
+/* Set the PANEL_DATA structures for individual panels */
+void
+set_user_ptrs(PANEL **panels, int n)
+{
+    PANEL_DATA *ptrs;
+    WINDOW *win;
+    int x, y, w, h, i;
+    char temp[80];
+
+    ptrs = (PANEL_DATA *) calloc((size_t) n, sizeof(PANEL_DATA));
+
+    for (i = 0; i < n; ++i) {
+        win = panel_window(panels[i]);
+        getbegyx(win, y, x);
+        getmaxyx(win, h, w);
+        ptrs[i].x = x;
+        ptrs[i].y = y;
+        ptrs[i].w = w;
+        ptrs[i].h = h;
+        sprintf(temp, "Window Number %d", i + 1);
+        strcpy(ptrs[i].label, temp);
+        ptrs[i].label_color = i + 1;
+        if (i + 1 == n)
+            ptrs[i].next = panels[0];
+        else
+            ptrs[i].next = panels[i + 1];
+        set_panel_userptr(panels[i], &ptrs[i]);
+    }
+}
+
+/* Show the window with a border and a label */
+void
+win_show(WINDOW *win, const char *label, int label_color)
+{
+    int height, width;
+
+    getmaxyx(win, height, width);
+    (void) height;
+
+    box(win, 0, 0);
+    mvwaddch(win, 2, 0, ACS_LTEE);
+    mvwhline(win, 2, 1, ACS_HLINE, width - 2);
+    mvwaddch(win, 2, width - 1, ACS_RTEE);
+
+    print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
+}
+
+void
+print_in_middle(WINDOW *win, int starty, int startx,
+                int width, const char *string, chtype color)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    wattron(win, color);
+    mvwprintw(win, y, x, "%s", string);
+    wattroff(win, color);
+    refresh();
+}
+
+ +

Concentrate on the main while loop. Once it finds out + the type of key pressed, it takes appropriate action. If + 'r' is pressed resizing mode is started. After this the new + sizes are updated as the user presses the arrow keys. When + the user presses <ENTER> present selection ends and + panel is resized by using the concept explained. While in + resizing mode the program doesn't show how the window is + getting resized. It is left as an exercise to the reader to + print a dotted border while it gets resized to a new + position.

+ +

When the user presses 'm' the move mode starts. This is + a bit simpler than resizing. As the arrow keys are pressed + the new position is updated and pressing of <ENTER> + causes the panel to be moved by calling the function + move_panel().

+ +

In this program the user data which is represented as + PANEL_DATA, plays very important role in finding the + associated information with a panel. As written in the + comments, the PANEL_DATA stores the panel sizes, label, + label color and a pointer to the next panel in the + cycle.

+
+ +
+
+ +

16.6. Hiding and Showing Panels

+ +

A Panel can be hidden by using the function + hide_panel(). This function merely removes it form the + stack of panels, thus hiding it on the screen once you do + update_panels() and doupdate(). It doesn't destroy the + PANEL structure associated with the hidden panel. It can be + shown again by using the show_panel() function.

+ +

The following program shows the hiding of panels. Press + 'a' or 'b' or 'c' to show or hide first, second and third + windows respectively. It uses a user data with a small + variable hide, which keeps track of whether the window is + hidden or not. For some reason the function panel_hidden() which tells whether a panel + is hidden or not is not working. A bug report was also + presented by Michael Andres here

+ +
+ +

Example 17. Panel Hiding and Showing example +

+ +
#include <string.h>
+#include <panel.h>
+
+typedef struct _PANEL_DATA {
+    int hide;                   /* TRUE if panel is hidden */
+} PANEL_DATA;
+
+#define NLINES 10
+#define NCOLS 40
+
+void init_wins(WINDOW **wins, int n);
+void win_show(WINDOW *win, const char *label, int label_color);
+void print_in_middle(WINDOW *win, int starty, int startx,
+                     int width, const char *string, chtype color);
+
+int
+main(void)
+{
+    WINDOW *my_wins[3];
+    PANEL *my_panels[3];
+    PANEL_DATA panel_datas[3];
+    PANEL_DATA *temp;
+    int ch;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize all the colors */
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_GREEN, COLOR_BLACK);
+    init_pair(3, COLOR_BLUE, COLOR_BLACK);
+    init_pair(4, COLOR_CYAN, COLOR_BLACK);
+
+    init_wins(my_wins, 3);
+
+    /* Attach a panel to each window */
+    /* Order is bottom up */
+    my_panels[0] = new_panel(my_wins[0]);       /* Push 0, order: stdscr-0 */
+    my_panels[1] = new_panel(my_wins[1]);       /* Push 1, order: stdscr-0-1 */
+    my_panels[2] = new_panel(my_wins[2]);       /* Push 2, order: stdscr-0-1-2 */
+
+    /* Initialize panel data saying that nothing is hidden */
+    panel_datas[0].hide = FALSE;
+    panel_datas[1].hide = FALSE;
+    panel_datas[2].hide = FALSE;
+
+    set_panel_userptr(my_panels[0], &panel_datas[0]);
+    set_panel_userptr(my_panels[1], &panel_datas[1]);
+    set_panel_userptr(my_panels[2], &panel_datas[2]);
+
+    /* Update the stacking order. 2nd panel will be on top */
+    update_panels();
+
+    /* Show it on the screen */
+    attron(COLOR_PAIR(4));
+    mvprintw(LINES - 3, 0,
+             "Show or Hide a window with 'a'(first window)  'b'(Second Window)  'c'(Third Window)");
+    mvprintw(LINES - 2, 0, "F1 to Exit");
+
+    attroff(COLOR_PAIR(4));
+    doupdate();
+
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case 'a':
+            temp = (PANEL_DATA *) panel_userptr(my_panels[0]);
+            if (temp->hide == FALSE) {
+                hide_panel(my_panels[0]);
+                temp->hide = TRUE;
+            } else {
+                show_panel(my_panels[0]);
+                temp->hide = FALSE;
+            }
+            break;
+        case 'b':
+            temp = (PANEL_DATA *) panel_userptr(my_panels[1]);
+            if (temp->hide == FALSE) {
+                hide_panel(my_panels[1]);
+                temp->hide = TRUE;
+            } else {
+                show_panel(my_panels[1]);
+                temp->hide = FALSE;
+            }
+            break;
+        case 'c':
+            temp = (PANEL_DATA *) panel_userptr(my_panels[2]);
+            if (temp->hide == FALSE) {
+                hide_panel(my_panels[2]);
+                temp->hide = TRUE;
+            } else {
+                show_panel(my_panels[2]);
+                temp->hide = FALSE;
+            }
+            break;
+        }
+        update_panels();
+        doupdate();
+    }
+    endwin();
+    return 0;
+}
+
+/* Put all the windows */
+void
+init_wins(WINDOW **wins, int n)
+{
+    int x, y, i;
+    char label[80];
+
+    y = 2;
+    x = 10;
+    for (i = 0; i < n; ++i) {
+        wins[i] = newwin(NLINES, NCOLS, y, x);
+        sprintf(label, "Window Number %d", i + 1);
+        win_show(wins[i], label, i + 1);
+        y += 3;
+        x += 7;
+    }
+}
+
+/* Show the window with a border and a label */
+void
+win_show(WINDOW *win, const char *label, int label_color)
+{
+    int height, width;
+
+    getmaxyx(win, height, width);
+    (void) height;
+
+    box(win, 0, 0);
+    mvwaddch(win, 2, 0, ACS_LTEE);
+    mvwhline(win, 2, 1, ACS_HLINE, width - 2);
+    mvwaddch(win, 2, width - 1, ACS_RTEE);
+
+    print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color));
+}
+
+void
+print_in_middle(WINDOW *win, int starty, int startx,
+                int width, const char *string, chtype color)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    wattron(win, color);
+    mvwprintw(win, y, x, "%s", string);
+    wattroff(win, color);
+    refresh();
+}
+
+
+ +
+
+ +

16.7. panel_above() and panel_below() + Functions

+ +

The functions panel_above() and + panel_below() can be used to find + out the panel above and below a panel. If the argument to + these functions is NULL, then they return a pointer to + bottom panel and top panel respectively.

+
+
+ +
+
+ +

17. Menus + Library

+ +

The menus library provides a nice extension to basic + curses, through which you can create menus. It provides a set + of functions to create menus. But they have to be customized + to give a nicer look, with colors, etc. Let's get into the + details.

+ +

A menu is a screen display that assists the user to choose + some subset of a given set of items. To put it simple, a menu + is a collection of items from which one or more items can be + chosen. Some readers might not be aware of multiple item + selection capability. Menu library provides functionality to + write menus from which the user can chose more than one item + as the preferred choice. This is dealt with in a later + section. Now it is time for some rudiments.

+ +
+
+ +

17.1. The Basics

+ +

To create menus, you first create items, and then post + the menu to the display. After that, all the processing of + user responses is done in an elegant function menu_driver() + which is the work horse of any menu program.

+ +

The general flow of control of a menu program looks like + this.

+ +
    +
  1. +

    Initialize curses

    +
  2. + +
  3. +

    Create items using new_item(). You can specify a + name and description for the items.

    +
  4. + +
  5. +

    Create the menu with new_menu() by specifying the + items to be attached with.

    +
  6. + +
  7. +

    Post the menu with menu_post() and refresh the + screen.

    +
  8. + +
  9. +

    Process the user requests with a loop and do + necessary updates to menu with menu_driver.

    +
  10. + +
  11. +

    Unpost the menu with menu_unpost()

    +
  12. + +
  13. +

    Free the memory allocated to menu by free_menu()

    +
  14. + +
  15. +

    Free the memory allocated to the items with + free_item()

    +
  16. + +
  17. +

    End curses

    +
  18. +
+ +

Let's see a program which prints a simple menu and + updates the current selection with up, down arrows.

+
+ +
+
+ +

17.2. Compiling With the Menu Library

+ +

To use menu library functions, you have to include + menu.h and to link the program with menu library the flag + -lmenu should be added along with -lncurses in that + order.

+ +
    #include <menu.h>
+    .
+    .
+    .
+
+    compile and link: gcc <program file> -lmenu -lncurses
+
+ +

Example 18. Menu Basics +

+ +
#include <stdlib.h>
+#include <curses.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Exit",
+};
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    int n_choices, i;
+
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) (n_choices + 1), sizeof(ITEM *));
+
+    for (i = 0; i < n_choices; ++i)
+        my_items[i] = new_item(choices[i], choices[i]);
+    my_items[n_choices] = (ITEM *) NULL;
+
+    my_menu = new_menu((ITEM **) my_items);
+    mvprintw(LINES - 2, 0, "F1 to Exit");
+    post_menu(my_menu);
+    refresh();
+
+    while ((c = getch()) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        }
+    }
+
+    free_item(my_items[0]);
+    free_item(my_items[1]);
+    free_menu(my_menu);
+    endwin();
+}
+
+ +

This program demonstrates the basic concepts involved in + creating a menu using menus library. First we create the + items using new_item() and then attach them to the menu + with new_menu() function. After posting the menu and + refreshing the screen, the main processing loop starts. It + reads user input and takes corresponding action. The + function menu_driver() is the main work horse of the menu + system. The second parameter to this function tells what's + to be done with the menu. According to the parameter, + menu_driver() does the corresponding task. The value can be + either a menu navigational request, an ascii character, or + a KEY_MOUSE special key associated with a mouse event.

+ +

The menu_driver accepts following navigational + requests.

+ +

     REQ_LEFT_ITEM      Move left to an item.
+     REQ_RIGHT_ITEM     Move right to an item.
+     REQ_UP_ITEM        Move up to an item.
+     REQ_DOWN_ITEM      Move down to an item.
+     REQ_SCR_ULINE      Scroll up a line.
+     REQ_SCR_DLINE      Scroll down a line.
+     REQ_SCR_DPAGE      Scroll down a page.
+     REQ_SCR_UPAGE      Scroll up a page.
+     REQ_FIRST_ITEM     Move to the first item.
+     REQ_LAST_ITEM      Move to the last item.
+     REQ_NEXT_ITEM      Move to the next item.
+     REQ_PREV_ITEM      Move to the previous item.
+     REQ_TOGGLE_ITEM    Select/deselect an item.
+     REQ_CLEAR_PATTERN  Clear the menu pattern buffer.
+     REQ_BACK_PATTERN   Delete the previous character from the pattern buffer.
+     REQ_NEXT_MATCH     Move to the next item matching the pattern match.
+     REQ_PREV_MATCH     Move to the previous item matching the pattern match.
+

Don't get overwhelmed by the number of options. We will + see them slowly one after another. The options of interest + in this example are REQ_UP_ITEM and REQ_DOWN_ITEM. These + two options when passed to menu_driver, menu driver updates + the current item to one item up or down respectively.

+
+ +
+
+ +

17.3. Menu Driver: The work horse of the menu + system

+ +

As you have seen in the above example, menu_driver plays + an important role in updating the menu. It is very + important to understand various options it takes and what + they do. As explained above, the second parameter to + menu_driver() can be either a navigational request, a + printable character or a KEY_MOUSE key. Let's dissect the + different navigational requests.

+ +
    +
  • +

    REQ_LEFT_ITEM and REQ_RIGHT_ITEM +

    + +

    A Menu can be displayed with multiple columns for + more than one item. This can be done by using the + menu_format()function. When a + multi columnar menu is displayed these requests cause + the menu driver to move the current selection to left + or right.

    +
  • + +
  • +

    REQ_UP_ITEM and REQ_DOWN_ITEM +

    + +

    These two options you have seen in the above + example. These options when given, makes the + menu_driver to move the current selection to an item up + or down.

    +
  • + +
  • +

    REQ_SCR_* + options +

    + +

    The four options REQ_SCR_ULINE, REQ_SCR_DLINE, + REQ_SCR_DPAGE, REQ_SCR_UPAGE are related to scrolling. + If all the items in the menu cannot be displayed in the + menu sub window, then the menu is scrollable. These + requests can be given to the menu_driver to do the + scrolling either one line up, down or one page down or + up respectively.

    +
  • + +
  • +

    REQ_FIRST_ITEM, REQ_LAST_ITEM, REQ_NEXT_ITEM + and REQ_PREV_ITEM +

    + +

    These requests are self explanatory.

    +
  • + +
  • +

    REQ_TOGGLE_ITEM +

    + +

    This request when given, toggles the present + selection. This option is to be used only in a multi + valued menu. So to use this request the option + O_ONEVALUE must be off. This option can be made off or + on with set_menu_opts().

    +
  • + +
  • +

    Pattern + Requests +

    + +

    Every menu has an associated pattern buffer, which + is used to find the nearest match to the ascii + characters entered by the user. Whenever ascii + characters are given to menu_driver, it puts in to the + pattern buffer. It also tries to find the nearest match + to the pattern in the items list and moves current + selection to that item. The request REQ_CLEAR_PATTERN + clears the pattern buffer. The request REQ_BACK_PATTERN + deletes the previous character in the pattern buffer. + In case the pattern matches more than one item then the + matched items can be cycled through REQ_NEXT_MATCH and + REQ_PREV_MATCH which move the current selection to the + next and previous matches respectively.

    +
  • + +
  • +

    Mouse + Requests +

    + +

    In case of KEY_MOUSE requests, according to the + mouse position an action is taken accordingly. The + action to be taken is explained in the man page as,

    + +
           If  the  second argument is the KEY_MOUSE special key, the
    +       associated mouse event is translated into one of the above
    +       pre-defined  requests.   Currently only clicks in the user
    +       window (e.g. inside the menu display area or  the  decora­
    +       tion  window)  are handled. If you click above the display
    +       region of the menu, a REQ_SCR_ULINE is generated,  if  you
    +       doubleclick  a  REQ_SCR_UPAGE  is  generated  and  if  you
    +       tripleclick a REQ_FIRST_ITEM is generated.  If  you  click
    +       below  the  display region of the menu, a REQ_SCR_DLINE is
    +       generated, if you doubleclick a REQ_SCR_DPAGE is generated
    +       and  if  you  tripleclick a REQ_LAST_ITEM is generated. If
    +       you click at an item inside the display area of the  menu,
    +       the menu cursor is positioned to that item.
    +
  • +
+ +

Each of the above requests will be explained in the + following lines with several examples whenever + appropriate.

+
+ +
+
+ +

17.4. Menu Windows

+ +

Every menu created is associated with a window and a sub + window. The menu window displays any title or border + associated with the menu. The menu sub window displays the + menu items currently available for selection. But we didn't + specify any window or sub window in the simple example. + When a window is not specified, stdscr is taken as the main + window, and then menu system calculates the sub window size + required for the display of items. Then items are displayed + in the calculated sub window. So let's play with these + windows and display a menu with a border and a title.

+ +
+ +

Example 19. Menu Windows Usage example +

+ +
#include <stdlib.h>
+#include <string.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Exit",
+    (char *) NULL,
+};
+
+void print_in_middle(WINDOW *win, int starty, int startx,
+                     int width, const char *string, chtype color);
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    WINDOW *my_menu_win;
+    int n_choices, i;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+
+    /* Create items */
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) n_choices, sizeof(ITEM *));
+    for (i = 0; i < n_choices; ++i)
+        my_items[i] = new_item(choices[i], choices[i]);
+
+    /* Create menu */
+    my_menu = new_menu((ITEM **) my_items);
+
+    /* Create the window to be associated with the menu */
+    my_menu_win = newwin(10, 40, 4, 4);
+    keypad(my_menu_win, TRUE);
+
+    /* Set main window and sub window */
+    set_menu_win(my_menu, my_menu_win);
+    set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));
+
+    /* Set menu mark to the string " * " */
+    set_menu_mark(my_menu, " * ");
+
+    /* Print a border around the main window and print a title */
+    box(my_menu_win, 0, 0);
+    print_in_middle(my_menu_win, 1, 0, 40, "My Menu", COLOR_PAIR(1));
+    mvwaddch(my_menu_win, 2, 0, ACS_LTEE);
+    mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);
+    mvwaddch(my_menu_win, 2, 39, ACS_RTEE);
+    mvprintw(LINES - 2, 0, "F1 to exit");
+    refresh();
+
+    /* Post the menu */
+    post_menu(my_menu);
+    wrefresh(my_menu_win);
+
+    while ((c = wgetch(my_menu_win)) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        }
+        wrefresh(my_menu_win);
+    }
+
+    /* Unpost and free all the memory taken up */
+    unpost_menu(my_menu);
+    free_menu(my_menu);
+    for (i = 0; i < n_choices; ++i)
+        free_item(my_items[i]);
+    endwin();
+}
+
+void
+print_in_middle(WINDOW *win, int starty, int startx,
+                int width, const char *string, chtype color)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    wattron(win, color);
+    mvwprintw(win, y, x, "%s", string);
+    wattroff(win, color);
+    refresh();
+}
+
+ +

This example creates a menu with a title, border, a + fancy line separating title and the items. As you can see, + in order to attach a window to a menu the function + set_menu_win() has to be used. Then we attach the sub + window also. This displays the items in the sub window. You + can also set the mark string which gets displayed to the + left of the selected item with set_menu_mark().

+
+ +
+
+ +

17.5. Scrolling Menus

+ +

If the sub window given for a window is not big enough + to show all the items, then the menu will be scrollable. + When you are on the last item in the present list, if you + send REQ_DOWN_ITEM, it gets translated into REQ_SCR_DLINE + and the menu scrolls by one item. You can manually give + REQ_SCR_ operations to do scrolling. Let's see how it can + be done.

+ +
+ +

Example 20. Scrolling Menus example +

+ +
#include <stdlib.h>
+#include <string.h>
+#include <curses.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Choice 5",
+    "Choice 6",
+    "Choice 7",
+    "Choice 8",
+    "Choice 9",
+    "Choice 10",
+    "Exit",
+    (char *) NULL,
+};
+
+void print_in_middle(WINDOW *win, int starty, int startx,
+                     int width, const char *string, chtype color);
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    WINDOW *my_menu_win;
+    int n_choices, i;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_CYAN, COLOR_BLACK);
+
+    /* Create items */
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) n_choices, sizeof(ITEM *));
+    for (i = 0; i < n_choices; ++i)
+        my_items[i] = new_item(choices[i], choices[i]);
+
+    /* Create menu */
+    my_menu = new_menu((ITEM **) my_items);
+
+    /* Create the window to be associated with the menu */
+    my_menu_win = newwin(10, 40, 4, 4);
+    keypad(my_menu_win, TRUE);
+
+    /* Set main window and sub window */
+    set_menu_win(my_menu, my_menu_win);
+    set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));
+    set_menu_format(my_menu, 5, 1);
+
+    /* Set menu mark to the string " * " */
+    set_menu_mark(my_menu, " * ");
+
+    /* Print a border around the main window and print a title */
+    box(my_menu_win, 0, 0);
+    print_in_middle(my_menu_win, 1, 0, 40, "My Menu", COLOR_PAIR(1));
+    mvwaddch(my_menu_win, 2, 0, ACS_LTEE);
+    mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);
+    mvwaddch(my_menu_win, 2, 39, ACS_RTEE);
+
+    /* Post the menu */
+    post_menu(my_menu);
+    wrefresh(my_menu_win);
+
+    attron(COLOR_PAIR(2));
+    mvprintw(LINES - 2, 0,
+             "Use PageUp and PageDown to scroll down or up a page of items");
+    mvprintw(LINES - 1, 0, "Arrow Keys to navigate (F1 to Exit)");
+    attroff(COLOR_PAIR(2));
+    refresh();
+
+    while ((c = wgetch(my_menu_win)) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        case KEY_NPAGE:
+            menu_driver(my_menu, REQ_SCR_DPAGE);
+            break;
+        case KEY_PPAGE:
+            menu_driver(my_menu, REQ_SCR_UPAGE);
+            break;
+        }
+        wrefresh(my_menu_win);
+    }
+
+    /* Unpost and free all the memory taken up */
+    unpost_menu(my_menu);
+    free_menu(my_menu);
+    for (i = 0; i < n_choices; ++i)
+        free_item(my_items[i]);
+    endwin();
+}
+
+void
+print_in_middle(WINDOW *win, int starty, int startx,
+                int width, const char *string, chtype color)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    wattron(win, color);
+    mvwprintw(win, y, x, "%s", string);
+    wattroff(win, color);
+    refresh();
+}
+
+ +

This program is self-explanatory. In this example the + number of choices has been increased to ten, which is + larger than our sub window size which can hold 6 items. + This message has to be explicitly conveyed to the menu + system with the function set_menu_format(). In here we + specify the number of rows and columns we want to be + displayed for a single page. We can specify any number of + items to be shown, in the rows variables, if it is less + than the height of the sub window. If the key pressed by + the user is a PAGE UP or PAGE DOWN, the menu is scrolled a + page due to the requests (REQ_SCR_DPAGE and REQ_SCR_UPAGE) + given to menu_driver().

+
+ +
+
+ +

17.6. Multi Columnar Menus

+ +

In the above example you have seen how to use the + function set_menu_format(). I didn't mention what the cols + variable (third parameter) does. Well, If your sub window + is wide enough, you can opt to display more than one item + per row. This can be specified in the cols variable. To + make things simpler, the following example doesn't show + descriptions for the items.

+ +
+ +

Example 21. Milt Columnar Menus Example +

+ +
#include <stdlib.h>
+#include <curses.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Choice 5",
+    "Choice 6", "Choice 7", "Choice 8", "Choice 9", "Choice 10",
+    "Choice 11", "Choice 12", "Choice 13", "Choice 14", "Choice 15",
+    "Choice 16", "Choice 17", "Choice 18", "Choice 19", "Choice 20",
+    "Exit",
+    (char *) NULL,
+};
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    WINDOW *my_menu_win;
+    int n_choices, i;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_CYAN, COLOR_BLACK);
+
+    /* Create items */
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) n_choices, sizeof(ITEM *));
+    for (i = 0; i < n_choices; ++i)
+        my_items[i] = new_item(choices[i], choices[i]);
+
+    /* Create menu */
+    my_menu = new_menu((ITEM **) my_items);
+
+    /* Set menu option not to show the description */
+    menu_opts_off(my_menu, O_SHOWDESC);
+
+    /* Create the window to be associated with the menu */
+    my_menu_win = newwin(10, 70, 4, 4);
+    keypad(my_menu_win, TRUE);
+
+    /* Set main window and sub window */
+    set_menu_win(my_menu, my_menu_win);
+    set_menu_sub(my_menu, derwin(my_menu_win, 6, 68, 3, 1));
+    set_menu_format(my_menu, 5, 3);
+    set_menu_mark(my_menu, " * ");
+
+    /* Print a border around the main window and print a title */
+    box(my_menu_win, 0, 0);
+
+    attron(COLOR_PAIR(2));
+    mvprintw(LINES - 3, 0, "Use PageUp and PageDown to scroll");
+    mvprintw(LINES - 2, 0, "Use Arrow Keys to navigate (F1 to Exit)");
+    attroff(COLOR_PAIR(2));
+    refresh();
+
+    /* Post the menu */
+    post_menu(my_menu);
+    wrefresh(my_menu_win);
+
+    while ((c = wgetch(my_menu_win)) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        case KEY_LEFT:
+            menu_driver(my_menu, REQ_LEFT_ITEM);
+            break;
+        case KEY_RIGHT:
+            menu_driver(my_menu, REQ_RIGHT_ITEM);
+            break;
+        case KEY_NPAGE:
+            menu_driver(my_menu, REQ_SCR_DPAGE);
+            break;
+        case KEY_PPAGE:
+            menu_driver(my_menu, REQ_SCR_UPAGE);
+            break;
+        }
+        wrefresh(my_menu_win);
+    }
+
+    /* Unpost and free all the memory taken up */
+    unpost_menu(my_menu);
+    free_menu(my_menu);
+    for (i = 0; i < n_choices; ++i)
+        free_item(my_items[i]);
+    endwin();
+}
+
+ +

Watch the function call to set_menu_format(). It + specifies the number of columns to be 3, thus displaying 3 + items per row. We have also switched off the showing + descriptions with the function menu_opts_off(). There are + couple of functions set_menu_opts(), menu_opts_on() and + menu_opts() which can be used to manipulate menu options. + The following menu options can be specified.

+ +
       O_ONEVALUE
+            Only one item can be selected for this menu.
+
+       O_SHOWDESC
+            Display  the  item  descriptions  when  the  menu  is
+            posted.
+
+       O_ROWMAJOR
+            Display the menu in row-major order.
+
+       O_IGNORECASE
+            Ignore the case when pattern-matching.
+
+       O_SHOWMATCH
+            Move the cursor to within the item  name  while  pat­
+            tern-matching.
+
+       O_NONCYCLIC
+            Don't   wrap   around  next-item  and  previous-item,
+            requests to the other end of the menu.
+

All options are on by default. You can switch specific + attributes on or off with menu_opts_on() and + menu_opts_off() functions. You can also use set_menu_opts() + to directly specify the options. The argument to this + function should be a OR ed value of some of those above + constants. The function menu_opts() can be used to find out + a menu's present options.

+
+ +
+
+ +

17.7. Multi Valued Menus

+ +

You might be wondering what if you switch off the option + O_ONEVALUE. Then the menu becomes multi-valued. That means + you can select more than one item. This brings us to the + request REQ_TOGGLE_ITEM. Let's see it in action.

+ +
+ +

Example 22. Multi Valued Menus example +

+ +
#include <stdlib.h>
+#include <string.h>
+#include <curses.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Choice 5",
+    "Choice 6",
+    "Choice 7",
+    "Exit",
+};
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    int n_choices, i;
+
+    /* Initialize curses */
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize items */
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) (n_choices + 1), sizeof(ITEM *));
+    for (i = 0; i < n_choices; ++i)
+        my_items[i] = new_item(choices[i], choices[i]);
+    my_items[n_choices] = (ITEM *) NULL;
+
+    my_menu = new_menu((ITEM **) my_items);
+
+    /* Make the menu multi valued */
+    menu_opts_off(my_menu, O_ONEVALUE);
+
+    mvprintw(LINES - 3, 0, "Use <SPACE> to select or unselect an item.");
+    mvprintw(LINES - 2, 0,
+             "<ENTER> to see presently selected items(F1 to Exit)");
+    post_menu(my_menu);
+    refresh();
+
+    while ((c = getch()) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        case ' ':
+            menu_driver(my_menu, REQ_TOGGLE_ITEM);
+            break;
+        case 10:                /* Enter */
+            {
+                char temp[200];
+                ITEM **items;
+
+                items = menu_items(my_menu);
+                temp[0] = '\0';
+                for (i = 0; i < item_count(my_menu); ++i)
+                    if (item_value(items[i]) == TRUE) {
+                        strcat(temp, item_name(items[i]));
+                        strcat(temp, " ");
+                    }
+                move(20, 0);
+                clrtoeol();
+                mvaddstr(20, 0, temp);
+                refresh();
+            }
+            break;
+        }
+    }
+
+    free_item(my_items[0]);
+    free_item(my_items[1]);
+    free_menu(my_menu);
+    endwin();
+}
+
+ +

Whew, A lot of new functions. Let's take them one after + another. Firstly, the REQ_TOGGLE_ITEM. In a multi-valued + menu, the user should be allowed to select or un select + more than one item. The request REQ_TOGGLE_ITEM toggles the + present selection. In this case when space is pressed + REQ_TOGGLE_ITEM request is sent to menu_driver to achieve + the result.

+ +

Now when the user presses <ENTER> we show the + items he presently selected. First we find out the items + associated with the menu using the function menu_items(). + Then we loop through the items to find out if the item is + selected or not. The function item_value() returns TRUE if + an item is selected. The function item_count() returns the + number of items in the menu. The item name can be found + with item_name(). You can also find the description + associated with an item using item_description().

+
+ +
+
+ +

17.8. Menu + Options

+ +

Well, by this time you must be itching for some + difference in your menu, with lots of functionality. I + know. You want Colors !!!. You want to create nice menus + similar to those text mode dos + games. The functions set_menu_fore() and + set_menu_back() can be used to change the attribute of the + selected item and unselected item. The names are + misleading. They don't change menu's foreground or + background which would have been useless.

+ +

The function set_menu_grey() can be used to set the + display attribute for the non-selectable items in the menu. + This brings us to the interesting option for an item the + one and only O_SELECTABLE. We can turn it off by the + function item_opts_off() and after that that item is not + selectable. It is like a grayed item in those fancy windows + menus. Let's put these concepts in practice with this + example

+ +
+ +

Example 23. Menu Options example +

+ +
#include <stdlib.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Choice 5",
+    "Choice 6",
+    "Choice 7",
+    "Exit",
+};
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    int n_choices, i;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_GREEN, COLOR_BLACK);
+    init_pair(3, COLOR_MAGENTA, COLOR_BLACK);
+
+    /* Initialize items */
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) (n_choices + 1), sizeof(ITEM *));
+    for (i = 0; i < n_choices; ++i)
+        my_items[i] = new_item(choices[i], choices[i]);
+    my_items[n_choices] = (ITEM *) NULL;
+    item_opts_off(my_items[3], O_SELECTABLE);
+    item_opts_off(my_items[6], O_SELECTABLE);
+
+    /* Create menu */
+    my_menu = new_menu((ITEM **) my_items);
+
+    /* Set fore ground and back ground of the menu */
+    set_menu_fore(my_menu, COLOR_PAIR(1) | A_REVERSE);
+    set_menu_back(my_menu, COLOR_PAIR(2));
+    set_menu_grey(my_menu, COLOR_PAIR(3));
+
+    /* Post the menu */
+    mvprintw(LINES - 3, 0, "Press <ENTER> to see the option selected");
+    mvprintw(LINES - 2, 0, "Up and Down arrow keys to navigate (F1 to Exit)");
+    post_menu(my_menu);
+    refresh();
+
+    while ((c = getch()) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        case 10:                /* Enter */
+            move(20, 0);
+            clrtoeol();
+            mvprintw(20, 0, "Item selected is : %s",
+                     item_name(current_item(my_menu)));
+            pos_menu_cursor(my_menu);
+            break;
+        }
+    }
+    unpost_menu(my_menu);
+    for (i = 0; i < n_choices; ++i)
+        free_item(my_items[i]);
+    free_menu(my_menu);
+    endwin();
+}
+
+
+ +
+
+ +

17.9. The useful User Pointer

+ +

We can associate a user pointer with each item in the + menu. It works the same way as user pointer in panels. It + is not touched by menu system. You can store any thing you + like in that. I usually use it to store the function to be + executed when the menu option is chosen (It is selected and + may be the user pressed <ENTER>);

+ +
+ +

Example 24. Menu User Pointer Usage +

+ +
#include <stdlib.h>
+#include <curses.h>
+#include <menu.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+#define CTRLD   4
+
+const char *choices[] =
+{
+    "Choice 1",
+    "Choice 2",
+    "Choice 3",
+    "Choice 4",
+    "Choice 5",
+    "Choice 6",
+    "Choice 7",
+    "Exit",
+};
+
+typedef union {
+    void (*my_func) (const char *);
+    void *data;
+} MY_DATA;
+
+void func(const char *name);
+
+int
+main(void)
+{
+    ITEM **my_items;
+    int c;
+    MENU *my_menu;
+    int n_choices, i;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+    init_pair(2, COLOR_GREEN, COLOR_BLACK);
+    init_pair(3, COLOR_MAGENTA, COLOR_BLACK);
+
+    /* Initialize items */
+    n_choices = ARRAY_SIZE(choices);
+    my_items = (ITEM **) calloc((size_t) (n_choices + 1), sizeof(ITEM *));
+    for (i = 0; i < n_choices; ++i) {
+        MY_DATA data = { func };
+        my_items[i] = new_item(choices[i], choices[i]);
+        /* Set the user pointer */
+        set_item_userptr(my_items[i], (void *) &data);
+    }
+    my_items[n_choices] = (ITEM *) NULL;
+
+    /* Create menu */
+    my_menu = new_menu((ITEM **) my_items);
+
+    /* Post the menu */
+    mvprintw(LINES - 3, 0, "Press <ENTER> to see the option selected");
+    mvprintw(LINES - 2, 0, "Up and Down arrow keys to navigate (F1 to Exit)");
+    post_menu(my_menu);
+    refresh();
+
+    while ((c = getch()) != KEY_F(1)) {
+        switch (c) {
+        case KEY_DOWN:
+            menu_driver(my_menu, REQ_DOWN_ITEM);
+            break;
+        case KEY_UP:
+            menu_driver(my_menu, REQ_UP_ITEM);
+            break;
+        case 10:                /* Enter */
+            {
+                ITEM *cur;
+                const MY_DATA *data;
+
+                cur = current_item(my_menu);
+                data = item_userptr(cur);
+                data->my_func(item_name(cur));
+                pos_menu_cursor(my_menu);
+                break;
+            }
+            break;
+        }
+    }
+    unpost_menu(my_menu);
+    for (i = 0; i < n_choices; ++i)
+        free_item(my_items[i]);
+    free_menu(my_menu);
+    endwin();
+}
+
+void
+func(const char *name)
+{
+    move(20, 0);
+    clrtoeol();
+    mvprintw(20, 0, "Item selected is : %s", name);
+}
+
+
+
+ +
+
+ +

18. Forms + Library

+ +

Well. If you have seen those forms on web pages which take + input from users and do various kinds of things, you might be + wondering how would any one create such forms in text mode + display. It is quite difficult to write those nifty forms in + plain ncurses. Forms library tries to provide a basic frame + work to build and maintain forms with ease. It has lot of + features(functions) which manage validation, dynamic + expansion of fields, etc. Let's see it in full flow.

+ +

A form is a collection of fields; each field can be either + a label(static text) or a data-entry location. The forms also + library provides functions to divide forms into multiple + pages.

+ +
+
+ +

18.1. The Basics

+ +

Forms are created in much the same way as menus. First + the fields related to the form are created with + new_field(). You can set options for the fields, so that + they can be displayed with some fancy attributes, validated + before the field looses focus, etc. Then the fields are + attached to form. After this, the form can be posted to + display and is ready to receive inputs. On the similar + lines to menu_driver(), the form is manipulated with + form_driver(). We can send requests to form_driver to move + focus to a certain field, move cursor to end of the field + etc. After the user enters values in the fields and + validation done, form can be unposted and memory allocated + can be freed.

+ +

The general flow of control of a forms program looks + like this.

+ +
    +
  1. +

    Initialize curses

    +
  2. + +
  3. +

    Create fields using new_field(). You can specify the + height and width of the field, and its position on the + form.

    +
  4. + +
  5. +

    Create the forms with new_form() by specifying the + fields to be attached with.

    +
  6. + +
  7. +

    Post the form with form_post() and refresh the + screen.

    +
  8. + +
  9. +

    Process the user requests with a loop and do + necessary updates to form with form_driver.

    +
  10. + +
  11. +

    Unpost the menu with form_unpost()

    +
  12. + +
  13. +

    Free the memory allocated to menu by free_form()

    +
  14. + +
  15. +

    Free the memory allocated to the items with + free_field()

    +
  16. + +
  17. +

    End curses

    +
  18. +
+ +

As you can see, working with forms library is much + similar to handling menu library. The following examples + will explore various aspects of form processing. Let's + start the journey with a simple example. first.

+
+ +
+
+ +

18.2. Compiling With the Forms Library

+ +

To use forms library functions, you have to include + form.h and to link the program with forms library the flag + -lform should be added along with -lncurses in that + order.

+ +
    #include <form.h>
+    .
+    .
+    .
+
+    compile and link: gcc <program file> -lform -lncurses
+
+ +

Example 25. Forms Basics +

+ +
#include <form.h>
+
+int
+main(void)
+{
+    FIELD *field[3];
+    FORM *my_form;
+    int ch;
+
+    /* Initialize curses */
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize the fields */
+    field[0] = new_field(1, 10, 4, 18, 0, 0);
+    field[1] = new_field(1, 10, 6, 18, 0, 0);
+    field[2] = NULL;
+
+    /* Set field options */
+    set_field_back(field[0], A_UNDERLINE);      /* Print a line for the option  */
+    field_opts_off(field[0], O_AUTOSKIP);       /* Don't go to next field when this */
+                                                /* Field is filled up           */
+    set_field_back(field[1], A_UNDERLINE);
+    field_opts_off(field[1], O_AUTOSKIP);
+
+    /* Create the form and post it */
+    my_form = new_form(field);
+    post_form(my_form);
+    refresh();
+
+    mvprintw(4, 10, "Value 1:");
+    mvprintw(6, 10, "Value 2:");
+    refresh();
+
+    /* Loop through to get user requests */
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case KEY_DOWN:
+            /* Go to next field */
+            form_driver(my_form, REQ_NEXT_FIELD);
+            /* Go to the end of the present buffer */
+            /* Leaves nicely at the last character */
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        case KEY_UP:
+            /* Go to previous field */
+            form_driver(my_form, REQ_PREV_FIELD);
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        default:
+            /* If this is a normal character, it gets */
+            /* Printed                                */
+            form_driver(my_form, ch);
+            break;
+        }
+    }
+
+    /* Un post form and free the memory */
+    unpost_form(my_form);
+    free_form(my_form);
+    free_field(field[0]);
+    free_field(field[1]);
+
+    endwin();
+    return 0;
+}
+
+ +

Above example is pretty straight forward. It creates two + fields with new_field(). + new_field() takes height, width, starty, startx, number of + offscreen rows and number of additional working buffers. + The fifth argument number of offscreen rows specifies how + much of the field to be shown. If it is zero, the entire + field is always displayed otherwise the form will be + scrollable when the user accesses not displayed parts of + the field. The forms library allocates one buffer per field + to store the data user enters. Using the last parameter to + new_field() we can specify it to allocate some additional + buffers. These can be used for any purpose you like.

+ +

After creating the fields, back ground attribute of both + of them is set to an underscore with set_field_back(). The + AUTOSKIP option is turned off using field_opts_off(). If + this option is turned on, focus will move to the next field + in the form once the active field is filled up + completely.

+ +

After attaching the fields to the form, it is posted. + Here on, user inputs are processed in the while loop, by + making corresponding requests to form_driver. The details + of all the requests to the form_driver() are explained + later.

+
+ +
+
+ +

18.3. Playing with Fields

+ +

Each form field is associated with a lot of attributes. + They can be manipulated to get the required effect and to + have fun !!!. So why wait?

+ +
+
+ +

18.3.1. Fetching Size and Location of + Field

+ +

The parameters we have given at the time of creation + of a field can be retrieved with field_info(). It returns + height, width, starty, startx, number of offscreen rows, + and number of additional buffers into the parameters + given to it. It is a sort of inverse of new_field().

+ +
int field_info(     FIELD *field,              /* field from which to fetch */
+                    int *height, *int width,   /* field size */
+                    int *top, int *left,       /* upper left corner */
+                    int *offscreen,            /* number of offscreen rows */
+                    int *nbuf);                /* number of working buffers */
+
+ +
+
+ +

18.3.2. Moving the field

+ +

The location of the field can be moved to a different + position with move_field().

+ +
int move_field(    FIELD *field,              /* field to alter */
+                   int top, int left);        /* new upper-left corner */
+

As usual, the changed position can be queried with + field_infor().

+
+ +
+
+ +

18.3.3. Field Justification

+ +

The justification to be done for the field can be + fixed using the function set_field_just().

+ +
    int set_field_just(FIELD *field,          /* field to alter */
+               int justmode);         /* mode to set */
+    int field_just(FIELD *field);          /* fetch justify mode of field */
+

The justification mode valued accepted and returned by + these functions are NO_JUSTIFICATION, JUSTIFY_RIGHT, + JUSTIFY_LEFT, or JUSTIFY_CENTER.

+
+ +
+
+ +

18.3.4. Field Display Attributes

+ +

As you have seen, in the above example, display + attribute for the fields can be set with set_field_fore() + and setfield_back(). These functions set foreground and + background attribute of the fields. You can also specify + a pad character which will be filled in the unfilled + portion of the field. The pad character is set with a + call to set_field_pad(). Default pad value is a space. + The functions field_fore(), field_back, field_pad() can + be used to query the present foreground, background + attributes and pad character for the field. The following + list gives the usage of functions.

+ +

int set_field_fore(FIELD *field,        /* field to alter */
+                   chtype attr);        /* attribute to set */
+
+chtype field_fore(FIELD *field);        /* field to query */
+                                        /* returns foreground attribute */
+
+int set_field_back(FIELD *field,        /* field to alter */
+                   chtype attr);        /* attribute to set */
+
+chtype field_back(FIELD *field);        /* field to query */
+                                        /* returns background attribute */
+
+int set_field_pad(FIELD *field,         /* field to alter */
+                  int pad);             /* pad character to set */
+
+chtype field_pad(FIELD *field);         /* field to query */
+                                        /* returns present pad character */
+

Though above functions seem quite simple, using colors + with set_field_fore() may be frustrating in the + beginning. Let me first explain about foreground and + background attributes of a field. The foreground + attribute is associated with the character. That means a + character in the field is printed with the attribute you + have set with set_field_fore(). Background attribute is + the attribute used to fill background of field, whether + any character is there or not. So what about colors? + Since colors are always defined in pairs, what is the + right way to display colored fields? Here's an example + clarifying color attributes.

+ +
+ +

Example 26. Form Attributes example +

+ +
#include <form.h>
+
+int
+main(void)
+{
+    FIELD *field[3];
+    FORM *my_form;
+    int ch;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize few color pairs */
+    init_pair(1, COLOR_WHITE, COLOR_BLUE);
+    init_pair(2, COLOR_WHITE, COLOR_BLUE);
+
+    /* Initialize the fields */
+    field[0] = new_field(1, 10, 4, 18, 0, 0);
+    field[1] = new_field(1, 10, 6, 18, 0, 0);
+    field[2] = NULL;
+
+    /* Set field options */
+    set_field_fore(field[0], COLOR_PAIR(1));    /* Put the field with blue background */
+    set_field_back(field[0], COLOR_PAIR(2));    /* and white foreground (characters */
+                                                /* are printed in white         */
+    field_opts_off(field[0], O_AUTOSKIP);       /* Don't go to next field when this */
+                                                /* Field is filled up           */
+    set_field_back(field[1], A_UNDERLINE);
+    field_opts_off(field[1], O_AUTOSKIP);
+
+    /* Create the form and post it */
+    my_form = new_form(field);
+    post_form(my_form);
+    refresh();
+
+    set_current_field(my_form, field[0]);       /* Set focus to the colored field */
+    mvprintw(4, 10, "Value 1:");
+    mvprintw(6, 10, "Value 2:");
+    mvprintw(LINES - 2, 0,
+             "Use UP, DOWN arrow keys to switch between fields");
+    refresh();
+
+    /* Loop through to get user requests */
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case KEY_DOWN:
+            /* Go to next field */
+            form_driver(my_form, REQ_NEXT_FIELD);
+            /* Go to the end of the present buffer */
+            /* Leaves nicely at the last character */
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        case KEY_UP:
+            /* Go to previous field */
+            form_driver(my_form, REQ_PREV_FIELD);
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        default:
+            /* If this is a normal character, it gets */
+            /* Printed                                */
+            form_driver(my_form, ch);
+            break;
+        }
+    }
+
+    /* Un post form and free the memory */
+    unpost_form(my_form);
+    free_form(my_form);
+    free_field(field[0]);
+    free_field(field[1]);
+
+    endwin();
+    return 0;
+}
+
+ +

Play with the color pairs and try to understand the + foreground and background attributes. In my programs + using color attributes, I usually set only the background + with set_field_back(). Curses simply doesn't allow + defining individual color attributes.

+
+ +
+
+ +

18.3.5. Field Option Bits

+ +

There is also a large collection of field option bits + you can set to control various aspects of forms + processing. You can manipulate them with these + functions:

+ +
int set_field_opts(FIELD *field,          /* field to alter */
+                   int attr);             /* attribute to set */
+
+int field_opts_on(FIELD *field,           /* field to alter */
+                  int attr);              /* attributes to turn on */
+
+int field_opts_off(FIELD *field,          /* field to alter */
+                  int attr);              /* attributes to turn off */
+
+int field_opts(FIELD *field);             /* field to query */
+

The function set_field_opts() can be used to directly + set attributes of a field or you can choose to switch a + few attributes on and off with field_opts_on() and + field_opts_off() selectively. Anytime you can query the + attributes of a field with field_opts(). The following is + the list of available options. By default, all options + are on.

+ +
+
+
O_VISIBLE
+ +
+

Controls whether the field is visible on the + screen. Can be used during form processing to hide + or pop up fields depending on the value of parent + fields.

+
+ +
O_ACTIVE
+ +
+

Controls whether the field is active during + forms processing (i.e. visited by form navigation + keys). Can be used to make labels or derived fields + with buffer values alterable by the forms + application, not the user.

+
+ +
O_PUBLIC
+ +
+

Controls whether data is displayed during field + entry. If this option is turned off on a field, the + library will accept and edit data in that field, + but it will not be displayed and the visible field + cursor will not move. You can turn off the O_PUBLIC + bit to define password fields.

+
+ +
O_EDIT
+ +
+

Controls whether the field's data can be + modified. When this option is off, all editing + requests except REQ_PREV_CHOICE and REQ_NEXT_CHOICEwill fail. Such + read-only fields may be useful for help + messages.

+
+ +
O_WRAP
+ +
+

Controls word-wrapping in multi-line fields. + Normally, when any character of a (blank-separated) + word reaches the end of the current line, the + entire word is wrapped to the next line (assuming + there is one). When this option is off, the word + will be split across the line break.

+
+ +
O_BLANK
+ +
+

Controls field blanking. When this option is on, + entering a character at the first field position + erases the entire field (except for the + just-entered character).

+
+ +
O_AUTOSKIP
+ +
+

Controls automatic skip to next field when this + one fills. Normally, when the forms user tries to + type more data into a field than will fit, the + editing location jumps to next field. When this + option is off, the user's cursor will hang at the + end of the field. This option is ignored in dynamic + fields that have not reached their size limit.

+
+ +
O_NULLOK
+ +
+

Controls whether validation is applied to blank + fields. Normally, it is not; the user can leave a + field blank without invoking the usual validation + check on exit. If this option is off on a field, + exit from it will invoke a validation check.

+
+ +
O_PASSOK
+ +
+

Controls whether validation occurs on every + exit, or only after the field is modified. Normally + the latter is true. Setting O_PASSOK may be useful + if your field's validation function may change + during forms processing.

+
+ +
O_STATIC
+ +
+

Controls whether the field is fixed to its + initial dimensions. If you turn this off, the field + becomes dynamic and will stretch to fit entered + data.

+
+
+
+ +

A field's options cannot be changed while the field is + currently selected. However, options may be changed on + posted fields that are not current.

+ +

The option values are bit-masks and can be composed + with logical-or in the obvious way. You have seen the + usage of switching off O_AUTOSKIP option. The following + example clarifies usage of some more options. Other + options are explained where appropriate.

+ +
+ +

Example 27. Field Options Usage example +

+ +
#include <form.h>
+
+#define STARTX 15
+#define STARTY 4
+#define WIDTH 25
+
+#define N_FIELDS 3
+
+int
+main(void)
+{
+    FIELD *field[N_FIELDS];
+    FORM *my_form;
+    int ch, i;
+
+    /* Initialize curses */
+    initscr();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize the fields */
+    for (i = 0; i < N_FIELDS - 1; ++i)
+        field[i] = new_field(1, WIDTH, STARTY + i * 2, STARTX, 0, 0);
+    field[N_FIELDS - 1] = NULL;
+
+    /* Set field options */
+    set_field_back(field[1], A_UNDERLINE);      /* Print a line for the option  */
+
+    field_opts_off(field[0], O_ACTIVE);         /* This field is a static label */
+    field_opts_off(field[1], O_PUBLIC);         /* This filed is like a password field */
+    field_opts_off(field[1], O_AUTOSKIP);       /* To avoid entering the same field */
+                                                /* after last character is entered */
+
+    /* Create the form and post it */
+    my_form = new_form(field);
+    post_form(my_form);
+    refresh();
+
+    set_field_just(field[0], JUSTIFY_CENTER);   /* Center Justification */
+    set_field_buffer(field[0], 0, "This is a static Field");
+    /* Initialize the field  */
+    mvprintw(STARTY, STARTX - 10, "Field 1:");
+    mvprintw(STARTY + 2, STARTX - 10, "Field 2:");
+    refresh();
+
+    /* Loop through to get user requests */
+    while ((ch = getch()) != KEY_F(1)) {
+        switch (ch) {
+        case KEY_DOWN:
+            /* Go to next field */
+            form_driver(my_form, REQ_NEXT_FIELD);
+            /* Go to the end of the present buffer */
+            /* Leaves nicely at the last character */
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        case KEY_UP:
+            /* Go to previous field */
+            form_driver(my_form, REQ_PREV_FIELD);
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        default:
+            /* If this is a normal character, it gets */
+            /* Printed                                */
+            form_driver(my_form, ch);
+            break;
+        }
+    }
+
+    /* Un post form and free the memory */
+    unpost_form(my_form);
+    free_form(my_form);
+    free_field(field[0]);
+    free_field(field[1]);
+
+    endwin();
+    return 0;
+}
+
+ +

This example, though useless, shows the usage of + options. If used properly, they can present information + very effectively in a form. The second field being not + O_PUBLIC, does not show the characters you are + typing.

+
+ +
+
+ +

18.3.6. Field Status

+ +

The field status specifies whether the field has got + edited or not. It is initially set to FALSE and when user + enters something and the data buffer gets modified it + becomes TRUE. So a field's status can be queried to find + out whether it has been modified or not. The following + functions can assist in those operations.

+ +
int set_field_status(FIELD *field,      /* field to alter */
+                   int status);         /* status to set */
+
+int field_status(FIELD *field);         /* fetch status of field */
+

It is better to check the field's status only after + after leaving the field, as data buffer might not have + been updated yet as the validation is still due. To + guarantee that right status is returned, call + field_status() either (1) in the field's exit validation + check routine, (2) from the field's or form's + initialization or termination hooks, or (3) just after a + REQ_VALIDATION request has been processed by the forms + driver

+
+ +
+
+ +

18.3.7. Field User Pointer

+ +

Every field structure contains one pointer that can be + used by the user for various purposes. It is not touched + by forms library and can be used for any purpose by the + user. The following functions set and fetch user + pointer.

+ +
int set_field_userptr(FIELD *field,
+           char *userptr);      /* the user pointer you wish to associate */
+                                /* with the field    */
+
+char *field_userptr(FIELD *field);      /* fetch user pointer of the field */
+
+ +
+
+ +

18.3.8. Variable-Sized Fields

+ +

If you want a dynamically changing field with variable + width, this is the feature you want to put to full use. + This will allow the user to enter more data than the + original size of the field and let the field grow. + According to the field orientation it will scroll + horizontally or vertically to incorporate the new + data.

+ +

To make a field dynamically growable, the option + O_STATIC should be turned off. This can be done with + a

+ +
    field_opts_off(field_pointer, O_STATIC);
+

But it is usually not advisable to allow a field to + grow infinitely. You can set a maximum limit to the + growth of the field with

+ +
int set_max_field(FIELD *field,    /* Field on which to operate */
+                  int max_growth); /* maximum growth allowed for the field */
+

The field info for a dynamically growable field can be + retrieved by

+ +
int dynamic_field_info( FIELD *field,     /* Field on which to operate */
+            int   *prows,     /* number of rows will be filled in this */
+            int   *pcols,     /* number of columns will be filled in this*/
+            int   *pmax)      /* maximum allowable growth will be filled */
+                              /* in this */
Though field_info +work as usual, it is advisable to use this function to get the +proper attributes of a dynamically growable field. +

Recall the library routine new_field; a new field + created with height set to one will be defined to be a + one line field. A new field created with height greater + than one will be defined to be a multi line field.

+ +

A one line field with O_STATIC turned off (dynamically + growable field) will contain a single fixed row, but the + number of columns can increase if the user enters more + data than the initial field will hold. The number of + columns displayed will remain fixed and the additional + data will scroll horizontally.

+ +

A multi line field with O_STATIC turned off + (dynamically growable field) will contain a fixed number + of columns, but the number of rows can increase if the + user enters more data than the initial field will hold. + The number of rows displayed will remain fixed and the + additional data will scroll vertically.

+ +

The above two paragraphs pretty much describe a + dynamically growable field's behavior. The way other + parts of forms library behaves is described below:

+ +
    +
  1. +

    The field option O_AUTOSKIP will be ignored if the + option O_STATIC is off and there is no maximum growth + specified for the field. Currently, O_AUTOSKIP + generates an automatic REQ_NEXT_FIELD form driver + request when the user types in the last character + position of a field. On a growable field with no + maximum growth specified, there is no last character + position. If a maximum growth is specified, the + O_AUTOSKIP option will work as normal if the field + has grown to its maximum size.

    +
  2. + +
  3. +

    The field justification will be ignored if the + option O_STATIC is off. Currently, set_field_just can + be used to JUSTIFY_LEFT, JUSTIFY_RIGHT, + JUSTIFY_CENTER the contents of a one line field. A + growable one line field will, by definition, grow and + scroll horizontally and may contain more data than + can be justified. The return from field_just will be + unchanged.

    +
  4. + +
  5. +

    The overloaded form driver request REQ_NEW_LINE + will operate the same way regardless of the + O_NL_OVERLOAD form option if the field option + O_STATIC is off and there is no maximum growth + specified for the field. Currently, if the form + option O_NL_OVERLOAD is on, REQ_NEW_LINE implicitly + generates a REQ_NEXT_FIELD if called from the last + line of a field. If a field can grow without bound, + there is no last line, so REQ_NEW_LINE will never + implicitly generate a REQ_NEXT_FIELD. If a maximum + growth limit is specified and the O_NL_OVERLOAD form + option is on, REQ_NEW_LINE will only implicitly + generate REQ_NEXT_FIELD if the field has grown to its + maximum size and the user is on the last line.

    +
  6. + +
  7. +

    The library call dup_field will work as usual; it + will duplicate the field, including the current + buffer size and contents of the field being + duplicated. Any specified maximum growth will also be + duplicated.

    +
  8. + +
  9. +

    The library call link_field will work as usual; it + will duplicate all field attributes and share buffers + with the field being linked. If the O_STATIC field + option is subsequently changed by a field sharing + buffers, how the system reacts to an attempt to enter + more data into the field than the buffer will + currently hold will depend on the setting of the + option in the current field.

    +
  10. + +
  11. +

    The library call field_info will work as usual; + the variable nrow will contain the value of the + original call to new_field. The user should use + dynamic_field_info, described above, to query the + current size of the buffer.

    +
  12. +
+ +

Some of the above points make sense only after + explaining form driver. We will be looking into that in + next few sections.

+
+
+ +
+
+ +

18.4. Form Windows

+ +

The form windows concept is pretty much similar to menu + windows. Every form is associated with a main window and a + sub window. The form main window displays any title or + border associated or whatever the user wishes. Then the sub + window contains all the fields and displays them according + to their position. This gives the flexibility of + manipulating fancy form displaying very easily.

+ +

Since this is pretty much similar to menu windows, I am + providing an example with out much explanation. The + functions are similar and they work the same way.

+ +
+ +

Example 28. Form Windows Example +

+ +
#include <string.h>
+#include <form.h>
+
+void print_in_middle(WINDOW *win, int starty, int startx,
+                     int width, const char *string, chtype color);
+
+int
+main(void)
+{
+    FIELD *field[3];
+    FORM *my_form;
+    WINDOW *my_form_win;
+    int ch, rows, cols;
+
+    /* Initialize curses */
+    initscr();
+    start_color();
+    cbreak();
+    noecho();
+    keypad(stdscr, TRUE);
+
+    /* Initialize few color pairs */
+    init_pair(1, COLOR_RED, COLOR_BLACK);
+
+    /* Initialize the fields */
+    field[0] = new_field(1, 10, 6, 1, 0, 0);
+    field[1] = new_field(1, 10, 8, 1, 0, 0);
+    field[2] = NULL;
+
+    /* Set field options */
+    set_field_back(field[0], A_UNDERLINE);
+    field_opts_off(field[0], O_AUTOSKIP);
+    /* Don't go to next field when this */
+    /* Field is filled up             */
+    set_field_back(field[1], A_UNDERLINE);
+    field_opts_off(field[1], O_AUTOSKIP);
+
+    /* Create the form and post it */
+    my_form = new_form(field);
+
+    /* Calculate the area required for the form */
+    scale_form(my_form, &rows, &cols);
+
+    /* Create the window to be associated with the form */
+    my_form_win = newwin(rows + 4, cols + 4, 4, 4);
+    keypad(my_form_win, TRUE);
+
+    /* Set main window and sub window */
+    set_form_win(my_form, my_form_win);
+    set_form_sub(my_form, derwin(my_form_win, rows, cols, 2, 2));
+
+    /* Print a border around the main window and print a title */
+    box(my_form_win, 0, 0);
+    print_in_middle(my_form_win, 1, 0, cols + 4, "My Form", COLOR_PAIR(1));
+
+    post_form(my_form);
+    wrefresh(my_form_win);
+
+    mvprintw(LINES - 2, 0,
+             "Use UP, DOWN arrow keys to switch between fields");
+    refresh();
+
+    /* Loop through to get user requests */
+    while ((ch = wgetch(my_form_win)) != KEY_F(1)) {
+        switch (ch) {
+        case KEY_DOWN:
+            /* Go to next field */
+            form_driver(my_form, REQ_NEXT_FIELD);
+            /* Go to the end of the present buffer */
+            /* Leaves nicely at the last character */
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        case KEY_UP:
+            /* Go to previous field */
+            form_driver(my_form, REQ_PREV_FIELD);
+            form_driver(my_form, REQ_END_LINE);
+            break;
+        default:
+            /* If this is a normal character, it gets */
+            /* Printed                                */
+            form_driver(my_form, ch);
+            break;
+        }
+    }
+
+    /* Un post form and free the memory */
+    unpost_form(my_form);
+    free_form(my_form);
+    free_field(field[0]);
+    free_field(field[1]);
+
+    endwin();
+    return 0;
+}
+
+void
+print_in_middle(WINDOW *win, int starty, int startx,
+                int width, const char *string, chtype color)
+{
+    int length, x, y;
+    float temp;
+
+    if (win == NULL)
+        win = stdscr;
+    getyx(win, y, x);
+    if (startx != 0)
+        x = startx;
+    if (starty != 0)
+        y = starty;
+    if (width == 0)
+        width = 80;
+
+    length = (int) strlen(string);
+    temp = (float) (width - length) / 2;
+    x = startx + (int) temp;
+    wattron(win, color);
+    mvwprintw(win, y, x, "%s", string);
+    wattroff(win, color);
+    refresh();
+}
+
+
+ +
+
+ +

18.5. Field Validation

+ +

By default, a field will accept any data input by the + user. It is possible to attach validation to the field. + Then any attempt by the user to leave the field, while it + contains data that doesn't match the validation type will + fail. Some validation types also have a character-validity + check for each time a character is entered in the + field.

+ +

Validation can be attached to a field with the following + function.

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   FIELDTYPE *ftype,      /* type to associate */
+                   ...);                  /* additional arguments*/
Once +set, the validation type for a field can be queried with + +
FIELDTYPE *field_type(FIELD *field);      /* field to query */
+

The form driver validates the data in a field only when + data is entered by the end-user. Validation does not occur + when

+ +
    +
  • +

    the application program changes the field value by + calling set_field_buffer.

    +
  • + +
  • +

    linked field values are changed indirectly -- by + changing the field to which they are linked

    +
  • +
+ +

The following are the pre-defined validation types. You + can also specify custom validation, though it is a bit + tricky and cumbersome.

+ +

TYPE_ALPHA

+ +

This field type accepts alphabetic data; no blanks, no + digits, no special characters (this is checked at + character-entry time). It is set up with:

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALPHA,            /* type to associate */
+                   int width);            /* minimum width of field */
+

The width argument sets a minimum width of data. The + user has to enter at-least width number of characters + before he can leave the field. Typically you'll want to set + this to the field width; if it is greater than the field + width, the validation check will always fail. A minimum + width of zero makes field completion optional.

+ +

TYPE_ALNUM

+ +

This field type accepts alphabetic data and digits; no + blanks, no special characters (this is checked at + character-entry time). It is set up with:

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALNUM,            /* type to associate */
+                   int width);            /* minimum width of field */
+

The width argument sets a minimum width of data. As with + TYPE_ALPHA, typically you'll want to set this to the field + width; if it is greater than the field width, the + validation check will always fail. A minimum width of zero + makes field completion optional.

+ +

TYPE_ENUM

+ +

This type allows you to restrict a field's values to be + among a specified set of string values (for example, the + two-letter postal codes for U.S. states). It is set up + with:

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ENUM,             /* type to associate */
+                   char **valuelist;      /* list of possible values */
+                   int checkcase;         /* case-sensitive? */
+                   int checkunique);      /* must specify uniquely? */
+

The valuelist parameter must point at a NULL-terminated + list of valid strings. The checkcase argument, if true, + makes comparison with the string case-sensitive.

+ +

When the user exits a TYPE_ENUM field, the validation + procedure tries to complete the data in the buffer to a + valid entry. If a complete choice string has been entered, + it is of course valid. But it is also possible to enter a + prefix of a valid string and have it completed for you.

+ +

By default, if you enter such a prefix and it matches + more than one value in the string list, the prefix will be + completed to the first matching value. But the checkunique + argument, if true, requires prefix matches to be unique in + order to be valid.

+ +

The REQ_NEXT_CHOICE and REQ_PREV_CHOICE input requests + can be particularly useful with these fields.

+ +

TYPE_INTEGER

+ +

This field type accepts an integer. It is set up as + follows:

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_INTEGER,          /* type to associate */
+                   int padding,           /* # places to zero-pad to */
+                   int vmin, int vmax);   /* valid range */
+

Valid characters consist of an optional leading minus + and digits. The range check is performed on exit. If the + range maximum is less than or equal to the minimum, the + range is ignored.

+ +

If the value passes its range check, it is padded with + as many leading zero digits as necessary to meet the + padding argument.

+ +

A TYPE_INTEGER value buffer can conveniently be + interpreted with the C library function atoi(3).

+ +

TYPE_NUMERIC

+ +

This field type accepts a decimal number. It is set up + as follows:

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_NUMERIC,          /* type to associate */
+                   int padding,           /* # places of precision */
+                   int vmin, int vmax);   /* valid range */
+

Valid characters consist of an optional leading minus + and digits. possibly including a decimal point. The range + check is performed on exit. If the range maximum is less + than or equal to the minimum, the range is ignored.

+ +

If the value passes its range check, it is padded with + as many trailing zero digits as necessary to meet the + padding argument.

+ +

A TYPE_NUMERIC value buffer can conveniently be + interpreted with the C library function atof(3).

+ +

TYPE_REGEXP

+ +

This field type accepts data matching a regular + expression. It is set up as follows:

+ +
int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_REGEXP,           /* type to associate */
+                   char *regexp);         /* expression to match */
+

The syntax for regular expressions is that of + regcomp(3). The check for regular-expression match is + performed on exit.

+
+ +
+
+ +

18.6. Form Driver: The work horse of the forms + system

+ +

As in the menu system, form_driver() plays a very + important role in forms system. All types of requests to + forms system should be funneled through form_driver().

+ +
int form_driver(FORM *form,     /* form on which to operate     */
+                int request)    /* form request code         */
+

As you have seen some of the examples above, you have to + be in a loop looking for user input and then decide whether + it is a field data or a form request. The form requests are + then passed to form_driver() to do the work.

+ +

The requests roughly can be divided into following + categories. Different requests and their usage is explained + below:

+ +
+
+ +

18.6.1. Page Navigation Requests

+ +

These requests cause page-level moves through the + form, triggering display of a new form screen. A form can + be made of multiple pages. If you have a big form with + lot of fields and logical sections, then you can divide + the form into pages. The function set_new_page() to set a + new page at the field specified.

+ +
int set_new_page(FIELD *field,/* Field at which page break to be set or unset */
+         bool new_page_flag); /* should be TRUE to put a break */
+

The following requests allow you to move to different + pages

+ +
    +
  • +

    REQ_NEXT_PAGE Move to the next + form page.

    +
  • + +
  • +

    REQ_PREV_PAGE Move to the + previous form page.

    +
  • + +
  • +

    REQ_FIRST_PAGE Move to the + first form page.

    +
  • + +
  • +

    REQ_LAST_PAGE Move to the last + form page.

    +
  • +
+ +

These requests treat the list as cyclic; that is, + REQ_NEXT_PAGE from the last page goes to the first, and + REQ_PREV_PAGE from the first page goes to the last.

+
+ +
+
+ +

18.6.2. Inter-Field Navigation + Requests

+ +

These requests handle navigation between fields on the + same page.

+ +
    +
  • +

    REQ_NEXT_FIELD Move to next + field.

    +
  • + +
  • +

    REQ_PREV_FIELD Move to previous + field.

    +
  • + +
  • +

    REQ_FIRST_FIELD Move to the + first field.

    +
  • + +
  • +

    REQ_LAST_FIELD Move to the last + field.

    +
  • + +
  • +

    REQ_SNEXT_FIELD Move to sorted + next field.

    +
  • + +
  • +

    REQ_SPREV_FIELD Move to sorted + previous field.

    +
  • + +
  • +

    REQ_SFIRST_FIELD Move to the + sorted first field.

    +
  • + +
  • +

    REQ_SLAST_FIELD Move to the + sorted last field.

    +
  • + +
  • +

    REQ_LEFT_FIELD Move left to + field.

    +
  • + +
  • +

    REQ_RIGHT_FIELD Move right to + field.

    +
  • + +
  • +

    REQ_UP_FIELD Move up to + field.

    +
  • + +
  • +

    REQ_DOWN_FIELD Move down to + field.

    +
  • +
+ +

These requests treat the list of fields on a page as + cyclic; that is, REQ_NEXT_FIELD from the last field goes + to the first, and REQ_PREV_FIELD from the first field + goes to the last. The order of the fields for these (and + the REQ_FIRST_FIELD and REQ_LAST_FIELD requests) is + simply the order of the field pointers in the form array + (as set up by new_form() or set_form_fields()

+ +

It is also possible to traverse the fields as if they + had been sorted in screen-position order, so the sequence + goes left-to-right and top-to-bottom. To do this, use the + second group of four sorted-movement requests.

+ +

Finally, it is possible to move between fields using + visual directions up, down, right, and left. To + accomplish this, use the third group of four requests. + Note, however, that the position of a form for purposes + of these requests is its upper-left corner.

+ +

For example, suppose you have a multi-line field B, + and two single-line fields A and C on the same line with + B, with A to the left of B and C to the right of B. A + REQ_MOVE_RIGHT from A will go to B only if A, B, and C + all share the same first line; otherwise it will skip + over B to C.

+
+ +
+
+ +

18.6.3. Intra-Field Navigation + Requests

+ +

These requests drive movement of the edit cursor + within the currently selected field.

+ +
    +
  • +

    REQ_NEXT_CHAR Move to next + character.

    +
  • + +
  • +

    REQ_PREV_CHAR Move to previous + character.

    +
  • + +
  • +

    REQ_NEXT_LINE Move to next + line.

    +
  • + +
  • +

    REQ_PREV_LINE Move to previous + line.

    +
  • + +
  • +

    REQ_NEXT_WORD Move to next + word.

    +
  • + +
  • +

    REQ_PREV_WORD Move to previous + word.

    +
  • + +
  • +

    REQ_BEG_FIELD Move to beginning + of field.

    +
  • + +
  • +

    REQ_END_FIELD Move to end of + field.

    +
  • + +
  • +

    REQ_BEG_LINE Move to beginning + of line.

    +
  • + +
  • +

    REQ_END_LINE Move to end of + line.

    +
  • + +
  • +

    REQ_LEFT_CHAR Move left in + field.

    +
  • + +
  • +

    REQ_RIGHT_CHAR Move right in + field.

    +
  • + +
  • +

    REQ_UP_CHAR Move up in + field.

    +
  • + +
  • +

    REQ_DOWN_CHAR Move down in + field.

    +
  • +
+ +

Each word is separated from the previous and next + characters by whitespace. The commands to move to + beginning and end of line or field look for the first or + last non-pad character in their ranges.

+
+ +
+
+ +

18.6.4. Scrolling Requests

+ +

Fields that are dynamic and have grown and fields + explicitly created with offscreen rows are scrollable. + One-line fields scroll horizontally; multi-line fields + scroll vertically. Most scrolling is triggered by editing + and intra-field movement (the library scrolls the field + to keep the cursor visible). It is possible to explicitly + request scrolling with the following requests:

+ +
    +
  • +

    REQ_SCR_FLINE Scroll vertically + forward a line.

    +
  • + +
  • +

    REQ_SCR_BLINE Scroll vertically + backward a line.

    +
  • + +
  • +

    REQ_SCR_FPAGE Scroll vertically + forward a page.

    +
  • + +
  • +

    REQ_SCR_BPAGE Scroll vertically + backward a page.

    +
  • + +
  • +

    REQ_SCR_FHPAGE Scroll + vertically forward half a page.

    +
  • + +
  • +

    REQ_SCR_BHPAGE Scroll + vertically backward half a page.

    +
  • + +
  • +

    REQ_SCR_FCHAR Scroll + horizontally forward a character.

    +
  • + +
  • +

    REQ_SCR_BCHAR Scroll + horizontally backward a character.

    +
  • + +
  • +

    REQ_SCR_HFLINE Scroll + horizontally one field width forward.

    +
  • + +
  • +

    REQ_SCR_HBLINE Scroll + horizontally one field width backward.

    +
  • + +
  • +

    REQ_SCR_HFHALF Scroll + horizontally one half field width forward.

    +
  • + +
  • +

    REQ_SCR_HBHALF Scroll + horizontally one half field width backward.

    +
  • +
+ +

For scrolling purposes, a page of a field is the + height of its visible part.

+
+ +
+
+ +

18.6.5. + Editing Requests

+ +

When you pass the forms driver an ASCII character, it + is treated as a request to add the character to the + field's data buffer. Whether this is an insertion or a + replacement depends on the field's edit mode (insertion + is the default.

+ +

The following requests support editing the field and + changing the edit mode:

+ +
    +
  • +

    REQ_INS_MODE Set insertion + mode.

    +
  • + +
  • +

    REQ_OVL_MODE Set overlay + mode.

    +
  • + +
  • +

    REQ_NEW_LINE New line request + (see below for explanation).

    +
  • + +
  • +

    REQ_INS_CHAR Insert space at + character location.

    +
  • + +
  • +

    REQ_INS_LINE Insert blank line + at character location.

    +
  • + +
  • +

    REQ_DEL_CHAR Delete character + at cursor.

    +
  • + +
  • +

    REQ_DEL_PREV Delete previous + word at cursor.

    +
  • + +
  • +

    REQ_DEL_LINE Delete line at + cursor.

    +
  • + +
  • +

    REQ_DEL_WORD Delete word at + cursor.

    +
  • + +
  • +

    REQ_CLR_EOL Clear to end of + line.

    +
  • + +
  • +

    REQ_CLR_EOF Clear to end of + field.

    +
  • + +
  • +

    REQ_CLR_FIELD Clear entire + field.

    +
  • +
+ +

The behavior of the REQ_NEW_LINE and REQ_DEL_PREV + requests is complicated and partly controlled by a pair + of forms options. The special cases are triggered when + the cursor is at the beginning of a field, or on the last + line of the field.

+ +

First, we consider REQ_NEW_LINE:

+ +

The normal behavior of REQ_NEW_LINE in insert mode is + to break the current line at the position of the edit + cursor, inserting the portion of the current line after + the cursor as a new line following the current and moving + the cursor to the beginning of that new line (you may + think of this as inserting a newline in the field + buffer).

+ +

The normal behavior of REQ_NEW_LINE in overlay mode is + to clear the current line from the position of the edit + cursor to end of line. The cursor is then moved to the + beginning of the next line.

+ +

However, REQ_NEW_LINE at the beginning of a field, or + on the last line of a field, instead does a + REQ_NEXT_FIELD. O_NL_OVERLOAD option is off, this special + action is disabled.

+ +

Now, let us consider REQ_DEL_PREV:

+ +

The normal behavior of REQ_DEL_PREV is to delete the + previous character. If insert mode is on, and the cursor + is at the start of a line, and the text on that line will + fit on the previous one, it instead appends the contents + of the current line to the previous one and deletes the + current line (you may think of this as deleting a newline + from the field buffer).

+ +

However, REQ_DEL_PREV at the beginning of a field is + instead treated as a REQ_PREV_FIELD.

+ +

If the O_BS_OVERLOAD option is off, this special + action is disabled and the forms driver just returns + E_REQUEST_DENIED.

+
+ +
+
+ +

18.6.6. Order Requests

+ +

If the type of your field is ordered, and has + associated functions for getting the next and previous + values of the type from a given value, there are requests + that can fetch that value into the field buffer:

+ +
    +
  • +

    REQ_NEXT_CHOICE Place the + successor value of the current value in the + buffer.

    +
  • + +
  • +

    REQ_PREV_CHOICE Place the + predecessor value of the current value in the + buffer.

    +
  • +
+ +

Of the built-in field types, only TYPE_ENUM has + built-in successor and predecessor functions. When you + define a field type of your own (see Custom Validation + Types), you can associate our own ordering functions.

+
+ +
+
+ +

18.6.7. Application Commands

+ +

Form requests are represented as integers above the + curses value greater than KEY_MAX and less than or equal + to the constant MAX_COMMAND. A value within this range + gets ignored by form_driver(). So this can be used for + any purpose by the application. It can be treated as an + application specific action and take corresponding + action.

+
+
+
+ +
+
+ +

19. Tools and + Widget Libraries

+ +

Now that you have seen the capabilities of ncurses and its + sister libraries, you are rolling your sleeves up and gearing + for a project that heavily manipulates screen. But wait.. It + can be pretty difficult to write and maintain complex GUI + widgets in plain ncurses or even with the additional + libraries. There are some ready-to-use tools and widget + libraries that can be used instead of writing your own + widgets. You can use some of them, get ideas from the code, + or even extend them.

+ +
+
+ +

19.1. CDK (Curses + Development Kit)

+ +

In the author's words

+ +

CDK stands + for 'Curses Development Kit' and it currently contains 21 + ready to use widgets which facilitate the speedy + development of full screen curses programs. +

+ +

The kit provides some useful widgets, which can be used + in your programs directly. It is pretty well written and + the documentation is very good. The examples in the + examples directory can be a good place to start for + beginners. The CDK can be downloaded from https://invisible-island.net/cdk/ . Follow the + instructions in README file to install it.

+ +
+
+ +

19.1.1. Widget List

+ +

The following is the list of widgets provided with cdk + and their description.

+ +
Widget Type           Quick Description
+===========================================================================
+Alphalist             Allows a user to select from a list of words, with
+                      the ability to narrow the search list by typing in a
+                      few characters of the desired word.
+Buttonbox             This creates a multiple button widget.
+Calendar              Creates a little simple calendar widget.
+Dialog                Prompts the user with a message, and the user
+                      can pick an answer from the buttons provided.
+Entry                 Allows the user to enter various types of information.
+File Selector         A file selector built from Cdk base widgets. This
+                      example shows how to create more complicated widgets
+                      using the Cdk widget library.
+Graph                 Draws a graph.
+Histogram             Draws a histogram.
+Item List             Creates a pop up field which allows the user to select
+                      one of several choices in a small field. Very useful
+                      for things like days of the week or month names.
+Label                 Displays messages in a pop up box, or the label can be
+                      considered part of the screen.
+Marquee               Displays a message in a scrolling marquee.
+Matrix                Creates a complex matrix with lots of options.
+Menu                  Creates a pull-down menu interface.
+Multiple Line Entry   A multiple line entry field. Very useful
+                      for long fields. (like a description
+                      field)
+Radio List            Creates a radio button list.
+Scale                 Creates a numeric scale. Used for allowing a user to
+                      pick a numeric value and restrict them to a range of
+                      values.
+Scrolling List        Creates a scrolling list/menu list.
+Scrolling Window      Creates a scrolling log file viewer. Can add
+                      information into the window while its running.
+                      A good widget for displaying the progress of
+                      something. (akin to a console window)
+Selection List        Creates a multiple option selection list.
+Slider                Akin to the scale widget, this widget provides a
+                      visual slide bar to represent the numeric value.
+Template              Creates a entry field with character sensitive
+                      positions. Used for pre-formatted fields like
+                      dates and phone numbers.
+Viewer                This is a file/information viewer. Very useful
+                      when you need to display loads of information.
+===========================================================================
+

A few of the widgets are modified by Thomas Dickey in + recent versions.

+
+ +
+
+ +

19.1.2. Some Attractive Features

+ +

Apart from making our life easier with readily usable + widgets, cdk solves one frustrating problem with printing + multi colored strings, justified strings elegantly. + Special formatting tags can be embedded in the strings + which are passed to CDK functions. For Example

+ +

If the string

+ +
"</B/1>This line should have a yellow foreground and a blue
+background.<!1>"
+

given as a parameter to newCDKLabel(), it prints the + line with yellow foreground and blue background. There + are other tags available for justifying string, embedding + special drawing characters, etc. Please refer to the man + page cdk_display(3X) for details. The man page explains + the usage with nice examples.

+
+ +
+
+ +

19.1.3. Conclusion

+ +

All in all, CDK is a well-written package of widgets, + which if used properly can form a strong frame work for + developing complex GUI.

+
+
+ +
+
+ +

19.2. The + dialog

+ +

Long long ago, in September 1994, when few people knew + linux, Jeff Tranter wrote an article on dialog in Linux Journal. He + starts the article with these words..

+ +

Linux is + based on the Unix operating system, but also features a + number of unique and useful kernel features and application + programs that often go beyond what is available under Unix. + One little-known gem is "dialog", a utility for creating + professional-looking dialog boxes from within shell + scripts. This article presents a tutorial introduction to + the dialog utility, and shows examples of how and where it + can be used +

+ +

As he explains, dialog is a real gem in making + professional-looking dialog boxes with ease. It creates a + variety of dialog boxes, menus, check lists, etc. It is + usually installed by default. If not, you can download it + from Thomas Dickey's site.

+ +

The above-mentioned article gives a very good overview + of its uses and capabilities. The man page has more + details. It can be used in variety of situations. One good + example is building of linux kernel in text mode. Linux + kernel uses a modified version of dialog tailored for its + needs.

+ +

dialog was initially designed to be used with shell + scripts. If you want to use its functionality in a c + program, then you can use libdialog. The documentation + regarding this is sparse. Definitive reference is the + dialog.h header file which comes with the library. You may + need to hack here and there to get the required output. The + source is easily customizable. I have used it on a number + of occasions by modifying the code.

+
+ +
+
+ +

19.3. Perl Curses Modules CURSES::FORM and + CURSES::WIDGETS

+ +

The perl module Curses, Curses::Form and Curses::Widgets + give access to curses from perl. If you have curses and + basic perl is installed, you can get these modules from + CPAN All Modules page. Get the three + zipped modules in the Curses category. Once installed you + can use these modules from perl scripts like any other + module. For more information on perl modules see perlmod + man page. The above modules come with good documentation + and they have some demo scripts to test the functionality. + Though the widgets provided are very rudimentary, these + modules provide good access to curses library from + perl.

+ +

Some of my code examples are converted to perl by + Anuradha Ratnaweera and they are available in the + perl directory.

+ +

For more information see man pages Curses(3) , + Curses::Form(3) and Curses::Widgets(3). These pages are + installed only when the above modules are acquired and + installed.

+
+
+ +
+
+ +

20. + Just For Fun !!!

+ +

This section contains few programs written by me just for + fun. They don't signify a better programming practice or the + best way of using ncurses. They are provided here so as to + allow beginners to get ideas and add more programs to this + section. If you have written a couple of nice, simple + programs in curses and want them to included here, contact + me.

+ +
+
+ +

20.1. The Game of Life

+ +

Game of life is a wonder of math. In Paul Callahan's words

+ +
The Game of Life (or simply Life) is not a game in the conventional sense. There
+are no players, and no winning or losing. Once the "pieces" are placed in the
+starting position, the rules determine everything that happens later.
+Nevertheless, Life is full of surprises! In most cases, it is impossible to look
+at a starting position (or pattern) and see what will happen in the future. The
+only way to find out is to follow the rules of the game.
+

This program starts with a simple inverted U pattern and + shows how wonderful life works. There is a lot of room for + improvement in the program. You can let the user enter + pattern of his choice or even take input from a file. You + can also change rules and play with a lot of variations. + Search on google for interesting information on game of + life.

+ +

File Path: + JustForFun/life.c +

+
+ +
+
+ +

20.2. Magic + Square

+ +

Magic Square, another wonder of math, is very simple to + understand but very difficult to make. In a magic square + sum of the numbers in each row, each column is equal. Even + diagonal sum can be equal. There are many variations which + have special properties.

+ +

This program creates a simple magic square of odd + order.

+ +

File Path: + JustForFun/magic.c +

+
+ +
+
+ +

20.3. Towers + of Hanoi

+ +

The famous towers of hanoi solver. The aim of the game + is to move the disks on the first peg to last peg, using + middle peg as a temporary stay. The catch is not to place a + larger disk over a small disk at any time.

+ +

File Path: + JustForFun/hanoi.c +

+
+ +
+
+ +

20.4. Queens + Puzzle

+ +

The objective of the famous N-Queen puzzle is to put N + queens on a N X N chess board without attacking each + other.

+ +

This program solves it with a simple backtracking + technique.

+ +

File Path: + JustForFun/queens.c +

+
+ +
+
+ +

20.5. + Shuffle

+ +

A fun game, if you have time to kill.

+ +

File Path: + JustForFun/shuffle.c +

+
+ +
+
+ +

20.6. Typing + Tutor

+ +

A simple typing tutor, I created more out of need than + for ease of use. If you know how to put your fingers + correctly on the keyboard, but lack practice, this can be + helpful.

+ +

File Path: + JustForFun/tt.c +

+
+
+ +
+
+ +

21. References

+ + +
+
+ + diff --git a/contrib/ncurses/doc/html/ada/files.htm b/contrib/ncurses/doc/html/ada/files.htm new file mode 100644 index 00000000..d48af038 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/files.htm @@ -0,0 +1,18 @@ + + + + + + + + +

Files

+[T] + diff --git a/contrib/ncurses/doc/html/ada/files/T.htm b/contrib/ncurses/doc/html/ada/files/T.htm new file mode 100644 index 00000000..97305067 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/files/T.htm @@ -0,0 +1,83 @@ + + + +T + + + +

Files - T

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs.htm b/contrib/ncurses/doc/html/ada/funcs.htm new file mode 100644 index 00000000..1ffcef16 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs.htm @@ -0,0 +1,39 @@ + + + + + + + + +

Functions/Procedures

+[A] +[B] +[C] +[D] +[E] +[F] +[G] +[H] +[I] +[K] +[L] +[M] +[N] +[O] +[P] +[Q] +[R] +[S] +[T] +[U] +[V] +[W] + diff --git a/contrib/ncurses/doc/html/ada/funcs/A.htm b/contrib/ncurses/doc/html/ada/funcs/A.htm new file mode 100644 index 00000000..c5520758 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/A.htm @@ -0,0 +1,29 @@ + + + +A + + + +

Functions - A

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/B.htm b/contrib/ncurses/doc/html/ada/funcs/B.htm new file mode 100644 index 00000000..f8ca69b4 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/B.htm @@ -0,0 +1,25 @@ + + + +B + + + +

Functions - B

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/C.htm b/contrib/ncurses/doc/html/ada/funcs/C.htm new file mode 100644 index 00000000..8bfb09c6 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/C.htm @@ -0,0 +1,63 @@ + + + +C + + + +

Functions - C

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/D.htm b/contrib/ncurses/doc/html/ada/funcs/D.htm new file mode 100644 index 00000000..2c16baa4 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/D.htm @@ -0,0 +1,51 @@ + + + +D + + + +

Functions - D

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/E.htm b/contrib/ncurses/doc/html/ada/funcs/E.htm new file mode 100644 index 00000000..b161c064 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/E.htm @@ -0,0 +1,22 @@ + + + +E + + + +

Functions - E

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/F.htm b/contrib/ncurses/doc/html/ada/funcs/F.htm new file mode 100644 index 00000000..9e6bac8f --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/F.htm @@ -0,0 +1,59 @@ + + + +F + + + +

Functions - F

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/G.htm b/contrib/ncurses/doc/html/ada/funcs/G.htm new file mode 100644 index 00000000..166fbc1a --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/G.htm @@ -0,0 +1,100 @@ + + + +G + + + +

Functions - G

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/H.htm b/contrib/ncurses/doc/html/ada/funcs/H.htm new file mode 100644 index 00000000..c8779374 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/H.htm @@ -0,0 +1,26 @@ + + + +H + + + +

Functions - H

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/I.htm b/contrib/ncurses/doc/html/ada/funcs/I.htm new file mode 100644 index 00000000..97c5e524 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/I.htm @@ -0,0 +1,55 @@ + + + +I + + + +

Functions - I

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/K.htm b/contrib/ncurses/doc/html/ada/funcs/K.htm new file mode 100644 index 00000000..47e68353 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/K.htm @@ -0,0 +1,18 @@ + + + +K + + + +

Functions - K

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/L.htm b/contrib/ncurses/doc/html/ada/funcs/L.htm new file mode 100644 index 00000000..b5929e6b --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/L.htm @@ -0,0 +1,25 @@ + + + +L + + + +

Functions - L

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/M.htm b/contrib/ncurses/doc/html/ada/funcs/M.htm new file mode 100644 index 00000000..00d10119 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/M.htm @@ -0,0 +1,55 @@ + + + +M + + + +

Functions - M

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/N.htm b/contrib/ncurses/doc/html/ada/funcs/N.htm new file mode 100644 index 00000000..cf130060 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/N.htm @@ -0,0 +1,39 @@ + + + +N + + + +

Functions - N

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/O.htm b/contrib/ncurses/doc/html/ada/funcs/O.htm new file mode 100644 index 00000000..6ade14a5 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/O.htm @@ -0,0 +1,16 @@ + + + +O + + + +

Functions - O

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/P.htm b/contrib/ncurses/doc/html/ada/funcs/P.htm new file mode 100644 index 00000000..d52c66dc --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/P.htm @@ -0,0 +1,63 @@ + + + +P + + + +

Functions - P

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/Q.htm b/contrib/ncurses/doc/html/ada/funcs/Q.htm new file mode 100644 index 00000000..bcfee70d --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/Q.htm @@ -0,0 +1,12 @@ + + + +Q + + + +

Functions - Q

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/R.htm b/contrib/ncurses/doc/html/ada/funcs/R.htm new file mode 100644 index 00000000..b4af87ec --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/R.htm @@ -0,0 +1,43 @@ + + + +R + + + +

Functions - R

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/S.htm b/contrib/ncurses/doc/html/ada/funcs/S.htm new file mode 100644 index 00000000..86dad7f4 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/S.htm @@ -0,0 +1,195 @@ + + + +S + + + +

Functions - S

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/T.htm b/contrib/ncurses/doc/html/ada/funcs/T.htm new file mode 100644 index 00000000..2534502a --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/T.htm @@ -0,0 +1,43 @@ + + + +T + + + +

Functions - T

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/U.htm b/contrib/ncurses/doc/html/ada/funcs/U.htm new file mode 100644 index 00000000..8a6d40de --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/U.htm @@ -0,0 +1,27 @@ + + + +U + + + +

Functions - U

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/V.htm b/contrib/ncurses/doc/html/ada/funcs/V.htm new file mode 100644 index 00000000..26099734 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/V.htm @@ -0,0 +1,15 @@ + + + +V + + + +

Functions - V

+[index] + diff --git a/contrib/ncurses/doc/html/ada/funcs/W.htm b/contrib/ncurses/doc/html/ada/funcs/W.htm new file mode 100644 index 00000000..8bf0c83f --- /dev/null +++ b/contrib/ncurses/doc/html/ada/funcs/W.htm @@ -0,0 +1,57 @@ + + + +W + + + +

Functions - W

+[index] + diff --git a/contrib/ncurses/doc/html/ada/index.htm b/contrib/ncurses/doc/html/ada/index.htm new file mode 100644 index 00000000..2f7801ef --- /dev/null +++ b/contrib/ncurses/doc/html/ada/index.htm @@ -0,0 +1,42 @@ + + + +Source Browser + + + + +<h2 align="center">Files</h2> +<a href="files/T.htm">[T]</a> +<hr> +<h2 align="center">Functions/Procedures</h2> +<a href="funcs/A.htm">[A]</a> +<a href="funcs/B.htm">[B]</a> +<a href="funcs/C.htm">[C]</a> +<a href="funcs/D.htm">[D]</a> +<a href="funcs/E.htm">[E]</a> +<a href="funcs/F.htm">[F]</a> +<a href="funcs/G.htm">[G]</a> +<a href="funcs/H.htm">[H]</a> +<a href="funcs/I.htm">[I]</a> +<a href="funcs/K.htm">[K]</a> +<a href="funcs/L.htm">[L]</a> +<a href="funcs/M.htm">[M]</a> +<a href="funcs/N.htm">[N]</a> +<a href="funcs/O.htm">[O]</a> +<a href="funcs/P.htm">[P]</a> +<a href="funcs/Q.htm">[Q]</a> +<a href="funcs/R.htm">[R]</a> +<a href="funcs/S.htm">[S]</a> +<a href="funcs/T.htm">[T]</a> +<a href="funcs/U.htm">[U]</a> +<a href="funcs/V.htm">[V]</a> +<a href="funcs/W.htm">[W]</a> + + + + + + + + diff --git a/contrib/ncurses/doc/html/ada/main.htm b/contrib/ncurses/doc/html/ada/main.htm new file mode 100644 index 00000000..43087122 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/main.htm @@ -0,0 +1,82 @@ + + + + + + + + +

[No frame version is here]

Files

+[T] +

Functions/Procedures

+[A] +[B] +[C] +[D] +[E] +[F] +[G] +[H] +[I] +[K] +[L] +[M] +[N] +[O] +[P] +[Q] +[R] +[S] +[T] +[U] +[V] +[W] +
+You should start your browsing with one of these files: + + diff --git a/contrib/ncurses/doc/html/ada/table.html b/contrib/ncurses/doc/html/ada/table.html new file mode 100644 index 00000000..7635427b --- /dev/null +++ b/contrib/ncurses/doc/html/ada/table.html @@ -0,0 +1,340 @@ + + + +Correspondence between ncurses C and Ada functions + + +

Correspondence between ncurses C and Ada functions

+

Sorted by C function name

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
C nameAda nameman page
assume_default_colors()Assume_Default_Colorsdefault_colors.3x
baudrate()Baudratecurs_termattrs.3x
beep()Beepcurs_beep.3x
bottom_panel()Bottompanel.3x
box()Boxcurs_border.3x
can_change_color()Can_Change_Colorcurs_color.3x
cbreak()Set_Cbreak_Modecurs_inopts.3x
clearok()Clear_On_Next_Updatecurs_outopts.3x
color_content()Color_Contentcurs_color.3x
copywin()Copycurs_overlay.3x
current_field()Currentform_page.3x
current_item()Currentmitem_current.3x
curscrCurrent_Windowcurs_initscr.3x
curses_version()Curses_Versioncurs_extend.3x
curs_set()Set_Cursor_Visibilitycurs_kernel.3x
data_ahead()Data_Aheadform_data.3x
data_behind()Data_Behindform_data.3x
define_key()Define_Keydefine_key.3x
def_prog_mode()Save_Curses_Modecurs_kernel.3x
delay_output()Delay_Outputcurs_util.3x
del_panel()Deletepanel.3x
delwin()Deletecurs_window.3x
derwin()Derived_Windowcurs_window.3x
doupdate()Update_Screencurs_refresh.3x
dup_field()Duplicateform_field_new.3x
dupwin()Duplicatecurs_window.3x
dynamic_field_info()Dynamic_Infoform_field_info.3x
echo()Set_Echo_Modecurs_inopts.3x
endwin()End_Windowscurs_initscr.3x
erasechar()Erase_Charactercurs_termattrs.3x
field_back()Backgroundform_field_attributes.3x
field_back()Backgroundform_field_attributes.3x
field_buffer()Get_Bufferform_field_buffer.3x
field_count()Field_Countform_field.3x
field_fore()Foregroundform_field_attributes.3x
field_fore()Foregroundform_field_attributes.3x
field_index()Get_Indexform_page.3x
field_info()Infoform_field_info.3x
field_init()Get_Field_Init_Hookform_hook.3x
field_just()Get_Justificationform_field_just.3x
field_opts_on()Switch_Optionsform_field_opts.3x
field_opts()Get_Optionsform_field_opts.3x
field_opts()Get_Optionsform_field_opts.3x
field_pad()Pad_Characterform_field_attributes.3x
field_status()Changedform_field_buffer.3x
field_term()Get_Field_Term_Hookform_hook.3x
field_type()Get_Typeform_field_validation.3x
field_userptrGet_User_Dataform_field_userptr.3x
field_userptrGet_User_Dataform_field_userptr.3x
flash()Flash_Screencurs_beep.3x
flushinp()Flush_Inputcurs_util.3x
form_driver()Driverform_driver.3x
form_fields()Fieldsform_field.3x
form_init()Get_Form_Init_Hookform_hook.3x
form_opts_on()Switch_Optionsform_opts.3x
form_opts()Get_Optionsform_opts.3x
form_opts()Get_Optionsform_opts.3x
form_page()Pageform_page.3x
form_sub()Get_Sub_Windowform_win.3x
form_term()Get_Form_Term_Hookform_hook.3x
form_userptrGet_User_Dataform_userptr.3x
form_userptrGet_User_Dataform_userptr.3x
form_win()Get_Windowform_win.3x
free_field()Deleteform_field_new.3x
free_form()Deleteform_new.3x
free_item()Deletemitem_new.3x
free_menu()Deletemenu_new.3x
getbegyx()Get_Window_Positioncurs_getyx.3x
getmaxyx()Get_Sizecurs_getyx.3x
getmouse()Get_Mousecurs_mouse.3x
getparyx()Get_Origin_Relative_To_Parentcurs_getyx.3x
getyx()Get_Cursor_Positioncurs_getyx.3x
halfdelay()Half_Delaycurs_inopts.3x
has_colors()Has_Colorscurs_color.3x
has_ic()Has_Insert_Charactercurs_termattrs.3x
has_il()Has_Insert_Linecurs_termattrs.3x
has_key()Has_Keycurs_getch.3x
hide_panel()Hidepanel.3x
idcok()Use_Insert_Delete_Charactercurs_outopts.3x
idlok()Use_Insert_Delete_Linecurs_outopts.3x
immedok()Immediate_Update_Modecurs_outopts.3x
init_color()Init_Colorcurs_color.3x
init_pair()Init_Paircurs_color.3x
initscr()Init_Screencurs_initscr.3x
initscr()Init_Windowscurs_initscr.3x
intrflush()Set_Flush_On_Interrupt_Modecurs_inopts.3x
isendwin()Is_End_Windowcurs_initscr.3x
is_linetouched()Is_Touchedcurs_touch.3x
is_wintouched()Is_Touchedcurs_touch.3x
item_count()Item_Countmenu_items.3x
item_description();Descriptionmitem_name.3x
item_index()Get_Indexmitem_current.3x
item_init()Get_Item_Init_Hookmenu_hook.3x
item_name()Namemitem_name.3x
item_opts_on()Switch_Optionsmitem_opts.3x
item_opts()Get_Optionsmitem_opts.3x
item_opts()Get_Optionsmitem_opts.3x
item_term()Get_Item_Term_Hookmenu_hook.3x
item_userptrGet_User_Datamitem_userptr.3x
item_userptrGet_User_Datamitem_userptr.3x
item_value()Valuemitem_value.3x
item_visible()Visiblemitem_visible.3x
keyname()Key_Namecurs_util.3x
keyname()Key_Namecurs_util.3x
keyok()Enable_Keykeyok.3x
keypad()Set_KeyPad_Modecurs_inopts.3x
killchar()Kill_Charactercurs_termattrs.3x
leaveok()Leave_Cursor_After_Updatecurs_outopts.3x
link_field()Linkform_field_new.3x
longname()Long_Namecurs_termattrs.3x
longname()Long_Namecurs_termattrs.3x
menu_back()Backgroundmenu_attributes.3x
menu_back()Backgroundmenu_attributes.3x
menu_driver()Drivermenu_driver.3x
menu_fore()Foregroundmenu_attributes.3x
menu_fore()Foregroundmenu_attributes.3x
menu_format()Formatmenu_format.3x
menu_grey()Greymenu_attributes.3x
menu_grey()Greymenu_attributes.3x
menu_init()Get_Menu_Init_Hookmenu_hook.3x
menu_items()Itemsmenu_items.3x
menu_mark()Markmenu_mark.3x
menu_opts_on()Switch_Optionsmenu_opts.3x
menu_opts()Get_Optionsmenu_opts.3x
menu_opts()Get_Optionsmenu_opts.3x
menu_pad()Pad_Charactermenu_attributes.3x
menu_pattern()Patternmenu_pattern.3x
menu_requestname.3xmenu_driver.3x
menu_spacing()Spacingmenu_spacing.3x
menu_sub()Get_Sub_Windowmenu_win.3x
menu_term()Get_Menu_Term_Hookmenu_hook.3x
menu_userptrGet_User_Datamenu_userptr.3x
menu_userptrGet_User_Datamenu_userptr.3x
menu_win()Get_Windowmenu_win.3x
meta()Set_Meta_Modecurs_inopts.3x
mouseinterval()Mouse_Intervalcurs_mouse.3x
mousemask()Start_Mousecurs_mouse.3x
move_field()Moveform_field.3x
move_panel()Movepanel.3x
mvderwin()Move_Derived_Windowcurs_window.3x
mvwaddchnstr()Addcurs_addchstr.3x
mvwaddch()Addcurs_addch.3x
mvwaddnstr()Addcurs_addstr.3x
mvwchgat()Change_Attributescurs_attr.3x
mvwdelch()Delete_Charactercurs_delch.3x
mvwgetnstr()Getcurs_getstr.3x
mvwinchnstr()Peekcurs_inchstr.3x
mvwinch()Peekcurs_inch.3x
mvwinnstr()Peekcurs_instr.3x
mvwinsch()Insertcurs_insch.3x
mvwinsnstr()Insertcurs_insstr.3x
mvwin()Move_Windowcurs_window.3x
napms()Nap_Milli_Secondscurs_kernel.3x
_nc_freeall()Curses_Free_Allcurs_trace.3x
new_field()Createform_field_new.3x
new_field()New_Fieldform_field_new.3x
new_form()Createform_new.3x
new_form()New_Formform_new.3x
new_item()Createmitem_new.3x
new_item()New_Itemmitem_new.3x
new_menu()Createmenu_new.3x
newpad()New_Padcurs_pad.3x
new_page()Is_New_Pageform_new_page.3x
new_panel()Createpanel.3x
new_panel()New_Panelpanel.3x
newwin()Createcurs_window.3x
nl()Set_NL_Modecurs_outopts.3x
nodelay()Set_NoDelay_Modecurs_inopts.3x
notimeout()Set_Escape_Time_Modecurs_inopts.3x
overlay()Overlaycurs_overlay.3x
overwrite()Overwritecurs_overlay.3x
pair_content()Pair_Contentcurs_color.3x
panel_above()Abovepanel.3x
panel_below()Belowpanel.3x
panel_hidden()Is_Hiddenpanel.3x
panel_userptrGet_User_Datapanel.3x
panel_userptrGet_User_Datapanel.3x
panel_window()Get_Windowpanel.3x
panel_window()Panel_Windowpanel.3x
pechochar()Add_Character_To_Pad_And_Echo_Itcurs_pad.3x
pnoutrefresh()Refresh_Without_Updatecurs_pad.3x
pos_form_cursor()Position_Cursorform_cursor.3x
pos_menu_cursor()Position_Cursormenu_cursor.3x
post_form()Postform_post.3x
post_menu()Postmenu_post.3x
prefresh()Refreshcurs_pad.3x
qiflush()Set_Queue_Interrupt_Modecurs_inopts.3x
raw()Set_Raw_Modecurs_inopts.3x
redrawwin()Redrawcurs_refresh.3x
replace_panel()Replacepanel.3x
reset_prog_mode()Reset_Curses_Modecurs_kernel.3x
resetty();Reset_Terminal_Statecurs_kernel.3x
ripoffline()Rip_Off_Linescurs_kernel.3x
savetty()Save_Terminal_Statecurs_kernel.3x
scale_form()Scaleform_win.3x
scale_menu()Scalemenu_win.3x
scr_dump()Screen_Dump_To_Filecurs_scr_dump.3x
scr_init()Screen_Init_From_Filecurs_scr_dump.3x
scrollok()Allow_Scrollingcurs_outopts.3x
scr_restore()Screen_Restore_From_Filecurs_scr_dump.3x
scr_set()Screen_Set_Filecurs_scr_dump.3x
set_current_field()Set_Currentform_page.3x
set_current_item()Set_Currentmitem_current.3x
set_field_back()Set_Backgroundform_field_attributes.3x
set_field_buffer()Set_Bufferform_field_buffer.3x
set_field_fore()Set_Foregroundform_field_attributes.3x
set_field_init()Set_Field_Init_Hookform_hook.3x
set_field_just()Set_Justificationform_field_just.3x
set_field_max()Set_Maximum_Sizeform_field_buffer.3x
set_field_opts()Set_Optionsform_field_opts.3x
set_field_pad()Set_Pad_Characterform_field_attributes.3x
set_field_status()Set_Statusform_field_buffer.3x
set_field_term()Set_Field_Term_Hookform_hook.3x
set_field_type()Set_Typeform_fieldtype.3x
set_field_userptrSet_User_Dataform_field_userptr.3x
set_form_fields()Redefineform_field.3x
set_form_fields()Set_Fieldsform_field.3x
set_form_init()Set_Form_Init_Hookform_hook.3x
set_form_opts()Set_Optionsform_opts.3x
set_form_page()Set_Pageform_page.3x
set_form_sub()Set_Sub_Windowform_win.3x
set_form_term()Set_Form_Term_Hookform_hook.3x
set_form_userptrSet_User_Dataform_userptr.3x
set_form_win()Set_Windowform_win.3x
set_item_init()Set_Item_Init_Hookmenu_hook.3x
set_item_opts()Set_Optionsmitem_opts.3x
set_item_term()Set_Item_Term_Hookmenu_hook.3x
set_item_userptrSet_User_Datamitem_userptr.3x
set_item_value()Set_Valuemitem_value.3x
set_menu_back()Set_Backgroundmenu_attributes.3x
set_menu_fore()Set_Foregroundmenu_attributes.3x
set_menu_format()Set_Formatmenu_format.3x
set_menu_grey()Set_Greymenu_attributes.3x
set_menu_init()Set_Menu_Init_Hookmenu_hook.3x
set_menu_items()Redefinemenu_items.3x
set_menu_mark()Set_Markmenu_mark.3x
set_menu_opts()Set_Optionsmenu_opts.3x
set_menu_pad()Set_Pad_Charactermenu_attributes.3x
set_menu_pattern()Set_Patternmenu_pattern.3x
set_menu_spacing()Set_Spacingmenu_spacing.3x
set_menu_sub()Set_Sub_Windowmenu_win.3x
set_menu_term()Set_Menu_Term_Hookmenu_hook.3x
set_menu_userptrSet_User_Datamenu_userptr.3x
set_menu_win()Set_Windowmenu_win.3x
set_new_page()Set_New_Pageform_new_page.3x
set_panel_userptrSet_User_Datapanel.3x
set_top_row()Set_Top_Rowmitem_current.3x
show_panel()Showpanel.3x
slk_attron()Switch_Soft_Label_Key_Attributescurs_slk.3x
slk_attrset()Set_Soft_Label_Key_Attributescurs_slk.3x
slk_attr()Get_Soft_Label_Key_Attributescurs_slk.3x
slk_attr()Get_Soft_Label_Key_Attributescurs_slk.3x
slk_clear()Clear_Soft_Label_Keyscurs_slk.3x
slk_color()Set_Soft_Label_Key_Colorcurs_slk.3x
slk_init()Init_Soft_Label_Keyscurs_slk.3x
slk_label()Get_Soft_Label_Keycurs_slk.3x
slk_label()Get_Soft_Label_Keycurs_slk.3x
slk_noutrefresh()Refresh_Soft_Label_Keys_Without_Updatecurs_slk.3x
slk_refresh()Refresh_Soft_Label_Keycurs_slk.3x
slk_restore()Restore_Soft_Label_Keyscurs_slk.3x
slk_set()Set_Soft_Label_Keycurs_slk.3x
slk_touch()Touch_Soft_Label_Keyscurs_slk.3x
standout()Standoutcurs_attr.3x
start_color()Start_Colorcurs_color.3x
stdscrStandard_Windowcurs_initscr.3x
subpad()Sub_Padcurs_pad.3x
subwin()Sub_Windowcurs_window.3x
syncok()Set_Synch_Modecurs_window.3x
termattrs()Supported_Attributescurs_termattrs.3x
termname()Terminal_Namecurs_termattrs.3x
termname()Terminal_Namecurs_termattrs.3x
top_panel()Toppanel.3x
top_row()Top_Rowmitem_current.3x
touchline()Touchcurs_touch.3x
touchwin()Touchcurs_touch.3x
_tracef()Trace_Putcurs_trace.3x
trace()Trace_oncurs_trace.3x
unctrl()Un_Controlcurs_util.3x
unctrl()Un_Controlcurs_util.3x
ungetch()Undo_Keystrokecurs_getch.3x
ungetmouse()Unget_Mousecurs_mouse.3x
untouchwin()Untouchcurs_touch.3x
update_panels()Update_Panelspanel.3x
use_default_colors()Use_Default_Colorsdefault_colors.3x
use_extended_names()Use_Extended_Namescurs_extend.3x
waddchnstr()Addcurs_addchstr.3x
waddch()Addcurs_addch.3x
waddnstr()Addcurs_addstr.3x
wattr_get()Get_Character_Attributescurs_attr.3x
wattr_get()Get_Character_Attributecurs_attr.3x
wattron()Switch_Character_Attributecurs_attr.3x
wattrset()Set_Character_Attributescurs_attr.3x
wbkgdget()Get_Backgroundcurs_bkgd.3x
wbkgdset()Set_Backgroundcurs_bkgd.3x
wbkgd()Change_Backgroundcurs_bkgd.3x
wborder()Bordercurs_border.3x
wchgat()Change_Attributescurs_attr.3x
wclear()Clearcurs_clear.3x
wclrtobot()Clear_To_End_Of_Screencurs_clear.3x
wclrtoeol()Clear_To_End_Of_Linecurs_clear.3x
wcolor_set()Set_Colorcurs_attr.3x
wdelch()Delete_Charactercurs_delch.3x
wdeleteln()Delete_Linecurs_deleteln.3x
wechochar()Add_With_Immediate_Echocurs_addch.3x
wenclose()Enclosed_In_Windowcurs_mouse.3x
werase()Erasecurs_clear.3x
wgetch()Get_Keystrokecurs_getch.3x
wgetnstr()Getcurs_getstr.3x
whline()Horizontal_Linecurs_border.3x
winchnstr()Peekcurs_inchstr.3x
winch()Peekcurs_inch.3x
winnstr()Peekcurs_instr.3x
winsch()Insertcurs_insch.3x
winsdelln()Insert_Delete_Linescurs_deleteln.3x
winsertln()Insert_Linecurs_deleteln.3x
winsnstr()Insertcurs_insstr.3x
wmove()Move_Cursorcurs_move.3x
wnoutrefresh()Refresh_Without_Updatecurs_refresh.3x
wredrawln()Redrawcurs_refresh.3x
wrefresh()Refreshcurs_refresh.3x
wresize()Resizewresize.3x
wscrl()Scrollcurs_scroll.3x
wsetscrreg()Set_Scroll_Regioncurs_outopts.3x
wsyncdown()Synchronize_Downwardscurs_window.3x
wsyncup()Synchronize_Upwardscurs_window.3x
wtimeout()Set_Timeout_Modecurs_inopts.3x
wtouchln()Change_Line_Statuscurs_touch.3x
wvline()Vertical_Linecurs_border.3x
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__adb.htm new file mode 100644 index 00000000..61ea3de6 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__adb.htm @@ -0,0 +1,135 @@ + + + +terminal_interface-curses-aux.adb + + + + +

File : terminal_interface-curses-aux.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Aux                       --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package body Terminal_Interface.Curses.Aux is
+   --
+   --  Some helpers
+   procedure Fill_String (Cp  : chars_ptr;
+                          Str : out String)
+   is
+      --  Fill the string with the characters referenced by the
+      --  chars_ptr.
+      --
+      Len : Natural;
+   begin
+      if Cp /= Null_Ptr then
+         Len := Natural (Strlen (Cp));
+         if Str'Length < Len then
+            raise Constraint_Error;
+         end if;
+         declare
+            S : String (1 .. Len);
+         begin
+            S := Value (Cp);
+            Str (Str'First .. (Str'First + Len - 1)) := S (S'Range);
+         end;
+      else
+         Len := 0;
+      end if;
+
+      if Len < Str'Length then
+         Str ((Str'First + Len) .. Str'Last) := (others => ' ');
+      end if;
+
+   end Fill_String;
+
+   function Fill_String (Cp : chars_ptr) return String
+   is
+      Len : Natural;
+   begin
+      if Cp /= Null_Ptr then
+         Len := Natural (Strlen (Cp));
+         if Len = 0 then
+            return "";
+         else
+            declare
+               S : String (1 .. Len);
+            begin
+               Fill_String (Cp, S);
+               return S;
+            end;
+         end if;
+      else
+         return "";
+      end if;
+   end Fill_String;
+
+   procedure Eti_Exception (Code : Eti_Error)
+   is
+   begin
+      case Code is
+         when E_Ok              => null;
+         when E_System_Error    => raise Eti_System_Error;
+         when E_Bad_Argument    => raise Eti_Bad_Argument;
+         when E_Posted          => raise Eti_Posted;
+         when E_Connected       => raise Eti_Connected;
+         when E_Bad_State       => raise Eti_Bad_State;
+         when E_No_Room         => raise Eti_No_Room;
+         when E_Not_Posted      => raise Eti_Not_Posted;
+         when E_Unknown_Command => raise Eti_Unknown_Command;
+         when E_No_Match        => raise Eti_No_Match;
+         when E_Not_Selectable  => raise Eti_Not_Selectable;
+         when E_Not_Connected   => raise Eti_Not_Connected;
+         when E_Request_Denied  => raise Eti_Request_Denied;
+         when E_Invalid_Field   => raise Eti_Invalid_Field;
+         when E_Current         => raise Eti_Current;
+      end case;
+   end Eti_Exception;
+
+end Terminal_Interface.Curses.Aux;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__ads.htm new file mode 100644 index 00000000..b5397196 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-aux__ads.htm @@ -0,0 +1,136 @@ + + + +terminal_interface-curses-aux.ads + + + + +

File : terminal_interface-curses-aux.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                       Terminal_Interface.Curses.Aux                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.25 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+with Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+
+package Terminal_Interface.Curses.Aux is
+   pragma Preelaborate (Terminal_Interface.Curses.Aux);
+
+   subtype C_Int      is Interfaces.C.int;
+   subtype C_Short    is Interfaces.C.short;
+   subtype C_Long_Int is Interfaces.C.long;
+   subtype C_Size_T   is Interfaces.C.size_t;
+   subtype C_UInt     is Interfaces.C.unsigned;
+   subtype C_ULong    is Interfaces.C.unsigned_long;
+   subtype C_Char_Ptr is Interfaces.C.Strings.chars_ptr;
+   type    C_Void_Ptr is new System.Address;
+
+   --  This is how those constants are defined in ncurses. I see them also
+   --  exactly like this in all ETI implementations I ever tested. So it
+   --  could be that this is quite general, but please check with your curses.
+   --  This is critical, because curses sometime mixes Boolean returns with
+   --  returning an error status.
+   Curses_Ok    : constant C_Int := Curses_Constants.OK;
+   Curses_Err   : constant C_Int := Curses_Constants.ERR;
+
+   Curses_True  : constant C_Int := Curses_Constants.TRUE;
+   Curses_False : constant C_Int := Curses_Constants.FALSE;
+
+   --  Eti_Error: type for error codes returned by the menu and form subsystem
+   type Eti_Error is
+     (E_Current,
+      E_Invalid_Field,
+      E_Request_Denied,
+      E_Not_Connected,
+      E_Not_Selectable,
+      E_No_Match,
+      E_Unknown_Command,
+      E_Not_Posted,
+      E_No_Room,
+      E_Bad_State,
+      E_Connected,
+      E_Posted,
+      E_Bad_Argument,
+      E_System_Error,
+      E_Ok);
+
+   procedure Eti_Exception (Code : Eti_Error);
+   --  Do nothing if Code = E_Ok.
+   --  Else dispatch the error code and raise the appropriate exception.
+
+   procedure Fill_String (Cp  : chars_ptr;
+                          Str : out String);
+   --  Fill the Str parameter with the string denoted by the chars_ptr
+   --  C-Style string.
+
+   function Fill_String (Cp : chars_ptr) return String;
+   --  Same but as function.
+
+private
+   for Eti_Error'Size use C_Int'Size;
+   pragma Convention (C, Eti_Error);
+   for Eti_Error use
+     (E_Current         => Curses_Constants.E_CURRENT,
+      E_Invalid_Field   => Curses_Constants.E_INVALID_FIELD,
+      E_Request_Denied  => Curses_Constants.E_REQUEST_DENIED,
+      E_Not_Connected   => Curses_Constants.E_NOT_CONNECTED,
+      E_Not_Selectable  => Curses_Constants.E_NOT_SELECTABLE,
+      E_No_Match        => Curses_Constants.E_NO_MATCH,
+      E_Unknown_Command => Curses_Constants.E_UNKNOWN_COMMAND,
+      E_Not_Posted      => Curses_Constants.E_NOT_POSTED,
+      E_No_Room         => Curses_Constants.E_NO_ROOM,
+      E_Bad_State       => Curses_Constants.E_BAD_STATE,
+      E_Connected       => Curses_Constants.E_CONNECTED,
+      E_Posted          => Curses_Constants.E_POSTED,
+      E_Bad_Argument    => Curses_Constants.E_BAD_ARGUMENT,
+      E_System_Error    => Curses_Constants.E_SYSTEM_ERROR,
+      E_Ok              => Curses_Constants.E_OK);
+end Terminal_Interface.Curses.Aux;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm new file mode 100644 index 00000000..6c51ab7d --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm @@ -0,0 +1,77 @@ + + + +terminal_interface-curses-forms-field_types-alpha.adb + + + + +

File : terminal_interface-curses-forms-field_types-alpha.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.Alpha           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.14 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Alpha is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Alpha_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_alpha");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Minimum_Field_Width)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Alpha;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm new file mode 100644 index 00000000..88ad718c --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm @@ -0,0 +1,72 @@ + + + +terminal_interface-curses-forms-field_types-alpha.ads + + + + +

File : terminal_interface-curses-forms-field_types-alpha.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.Alpha           --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.Alpha is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.Alpha);
+
+   type Alpha_Field is new Field_Type
+     with record
+        Minimum_Field_Width : Natural := 0;
+     end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Alpha_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.Alpha;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm new file mode 100644 index 00000000..7e759e6c --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm @@ -0,0 +1,77 @@ + + + +terminal_interface-curses-forms-field_types-alphanumeric.adb + + + + +

File : terminal_interface-curses-forms-field_types-alphanumeric.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric        --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.14 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : AlphaNumeric_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_alnum");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Minimum_Field_Width)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm new file mode 100644 index 00000000..73cdb40e --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm @@ -0,0 +1,73 @@ + + + +terminal_interface-curses-forms-field_types-alphanumeric.ads + + + + +

File : terminal_interface-curses-forms-field_types-alphanumeric.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric);
+
+   type AlphaNumeric_Field is new Field_Type
+     with record
+        Minimum_Field_Width : Natural := 0;
+     end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : AlphaNumeric_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.AlphaNumeric;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm new file mode 100644 index 00000000..acd17292 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm @@ -0,0 +1,100 @@ + + + +terminal_interface-curses-forms-field_types-enumeration-ada.adb + + + + +

File : terminal_interface-curses-forms-field_types-enumeration-ada.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--         Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2004,2011 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Characters.Handling; use Ada.Characters.Handling;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada is
+
+   function Create (Set            : Type_Set := Mixed_Case;
+                    Case_Sensitive : Boolean  := False;
+                    Must_Be_Unique : Boolean  := False)
+                    return Enumeration_Field
+   is
+      I : Enumeration_Info (T'Pos (T'Last) - T'Pos (T'First) + 1);
+      J : Positive := 1;
+   begin
+      I.Case_Sensitive := Case_Sensitive;
+      I.Match_Must_Be_Unique := Must_Be_Unique;
+
+      for E in T'Range loop
+         I.Names (J) := new String'(T'Image (E));
+         --  The Image attribute defaults to upper case, so we have to handle
+         --  only the other ones...
+         if Set /= Upper_Case then
+            I.Names (J).all := To_Lower (I.Names (J).all);
+            if Set = Mixed_Case then
+               I.Names (J).all (I.Names (J).all'First) :=
+                 To_Upper (I.Names (J).all (I.Names (J).all'First));
+            end if;
+         end if;
+         J := J + 1;
+      end loop;
+
+      return Create (I, True);
+   end Create;
+
+   function Value (Fld : Field;
+                   Buf : Buffer_Number := Buffer_Number'First) return T
+   is
+   begin
+      return T'Value (Get_Buffer (Fld, Buf));
+   end Value;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm new file mode 100644 index 00000000..9ec8c265 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm @@ -0,0 +1,78 @@ + + + +terminal_interface-curses-forms-field_types-enumeration-ada.ads + + + + +

File : terminal_interface-curses-forms-field_types-enumeration-ada.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--         Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2002,2003 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type T is (<>);
+
+package Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada);
+
+   function Create (Set            : Type_Set := Mixed_Case;
+                    Case_Sensitive : Boolean  := False;
+                    Must_Be_Unique : Boolean  := False)
+                    return Enumeration_Field;
+
+   function Value (Fld : Field;
+                   Buf : Buffer_Number := Buffer_Number'First) return T;
+   --  Translate the content of the fields buffer - indicated by the
+   --  buffer number - into an enumeration value. If the buffer is empty
+   --  or the content is invalid, a Constraint_Error is raises.
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration.Ada;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm new file mode 100644 index 00000000..1747221a --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm @@ -0,0 +1,131 @@ + + + +terminal_interface-curses-forms-field_types-enumeration.adb + + + + +

File : terminal_interface-curses-forms-field_types-enumeration.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.Enumeration         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Enumeration is
+
+   function Create (Info               : Enumeration_Info;
+                    Auto_Release_Names : Boolean := False)
+                    return Enumeration_Field
+   is
+      procedure Release_String is
+        new Ada.Unchecked_Deallocation (String,
+                                        String_Access);
+      E : Enumeration_Field;
+      L : constant size_t := 1 + size_t (Info.C);
+      S : String_Access;
+   begin
+      E.Case_Sensitive       := Info.Case_Sensitive;
+      E.Match_Must_Be_Unique := Info.Match_Must_Be_Unique;
+      E.Arr := new chars_ptr_array (size_t (1) .. L);
+      for I in 1 .. Positive (L - 1) loop
+         if Info.Names (I) = null then
+            raise Form_Exception;
+         end if;
+         E.Arr.all (size_t (I)) := New_String (Info.Names (I).all);
+         if Auto_Release_Names then
+            S := Info.Names (I);
+            Release_String (S);
+         end if;
+      end loop;
+      E.Arr.all (L) := Null_Ptr;
+      return E;
+   end Create;
+
+   procedure Release (Enum : in out Enumeration_Field)
+   is
+      I : size_t := 0;
+      P : chars_ptr;
+   begin
+      loop
+         P := Enum.Arr.all (I);
+         exit when P = Null_Ptr;
+         Free (P);
+         Enum.Arr.all (I) := Null_Ptr;
+         I := I + 1;
+      end loop;
+      Enum.Arr := null;
+   end Release;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Enumeration_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : chars_ptr_array;
+                             Arg2 : C_Int;
+                             Arg3 : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_enum");
+
+   begin
+      if Typ.Arr = null then
+         raise Form_Exception;
+      end if;
+      Eti_Exception
+        (Set_Fld_Type
+           (Arg1 => Typ.Arr.all,
+            Arg2 => C_Int (Boolean'Pos (Typ.Case_Sensitive)),
+            Arg3 => C_Int (Boolean'Pos (Typ.Match_Must_Be_Unique))));
+      Wrap_Builtin (Fld, Typ, C_Choice_Router);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm new file mode 100644 index 00000000..21719dbd --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm @@ -0,0 +1,117 @@ + + + +terminal_interface-curses-forms-field_types-enumeration.ads + + + + +

File : terminal_interface-curses-forms-field_types-enumeration.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--           Terminal_Interface.Curses.Forms.Field_Types.Enumeration        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C.Strings;
+
+package Terminal_Interface.Curses.Forms.Field_Types.Enumeration is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.Enumeration);
+
+   type String_Access is access String;
+
+   --  Type_Set is used by the child package Ada
+   type Type_Set is (Lower_Case, Upper_Case, Mixed_Case);
+
+   type Enum_Array is array (Positive range <>)
+     of String_Access;
+
+   type Enumeration_Info (C : Positive) is
+      record
+         Case_Sensitive       : Boolean := False;
+         Match_Must_Be_Unique : Boolean := False;
+         Names                : Enum_Array (1 .. C);
+      end record;
+
+   type Enumeration_Field is new Field_Type with private;
+
+   function Create (Info : Enumeration_Info;
+                    Auto_Release_Names : Boolean := False)
+                    return Enumeration_Field;
+   --  Make an fieldtype from the info. Enumerations are special, because
+   --  they normally don't copy the enum values into a private store, so
+   --  we have to care for the lifetime of the info we provide.
+   --  The Auto_Release_Names flag may be used to automatically releases
+   --  the strings in the Names array of the Enumeration_Info.
+
+   function Make_Enumeration_Type (Info : Enumeration_Info;
+                                   Auto_Release_Names : Boolean := False)
+                                   return Enumeration_Field renames Create;
+
+   procedure Release (Enum : in out Enumeration_Field);
+   --  But we may want to release the field to release the memory allocated
+   --  by it internally. After that the Enumeration field is no longer usable.
+
+   --  The next type definitions are all ncurses extensions. They are typically
+   --  not available in other curses implementations.
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Enumeration_Field);
+   pragma Inline (Set_Field_Type);
+
+private
+   type CPA_Access is access Interfaces.C.Strings.chars_ptr_array;
+
+   type Enumeration_Field is new Field_Type with
+      record
+         Case_Sensitive       : Boolean := False;
+         Match_Must_Be_Unique : Boolean := False;
+         Arr                  : CPA_Access := null;
+      end record;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Enumeration;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm new file mode 100644 index 00000000..6ff20e89 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm @@ -0,0 +1,81 @@ + + + +terminal_interface-curses-forms-field_types-intfield.adb + + + + +

File : terminal_interface-curses-forms-field_types-intfield.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--            Terminal_Interface.Curses.Forms.Field_Types.IntField          --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.14 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.IntField is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Integer_Field)
+   is
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int;
+                             Arg2 : C_Long_Int;
+                             Arg3 : C_Long_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_integer");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Precision),
+                                   Arg2 => C_Long_Int (Typ.Lower_Limit),
+                                   Arg3 => C_Long_Int (Typ.Upper_Limit)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.IntField;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm new file mode 100644 index 00000000..91151756 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm @@ -0,0 +1,74 @@ + + + +terminal_interface-curses-forms-field_types-intfield.ads + + + + +

File : terminal_interface-curses-forms-field_types-intfield.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--            Terminal_Interface.Curses.Forms.Field_Types.IntField          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.IntField is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.IntField);
+
+   type Integer_Field is new Field_Type with
+      record
+         Precision   : Natural;
+         Lower_Limit : Integer;
+         Upper_Limit : Integer;
+      end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Integer_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.IntField;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm new file mode 100644 index 00000000..e433d752 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm @@ -0,0 +1,77 @@ + + + +terminal_interface-curses-forms-field_types-ipv4_address.adb + + + + +

File : terminal_interface-curses-forms-field_types-ipv4_address.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address        --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.14 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Internet_V4_Address_Field)
+   is
+      function Set_Fld_Type (F : Field := Fld)
+                             return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_ipv4");
+
+   begin
+      Eti_Exception (Set_Fld_Type);
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm new file mode 100644 index 00000000..5ace0d50 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm @@ -0,0 +1,70 @@ + + + +terminal_interface-curses-forms-field_types-ipv4_address.ads + + + + +

File : terminal_interface-curses-forms-field_types-ipv4_address.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address);
+
+   type Internet_V4_Address_Field is new Field_Type with null record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Internet_V4_Address_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.IPV4_Address;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm new file mode 100644 index 00000000..11b48eb2 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm @@ -0,0 +1,84 @@ + + + +terminal_interface-curses-forms-field_types-numeric.adb + + + + +

File : terminal_interface-curses-forms-field_types-numeric.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--            Terminal_Interface.Curses.Forms.Field_Types.Numeric           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.Numeric is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Numeric_Field)
+   is
+      type Double is new Interfaces.C.double;
+
+      function Set_Fld_Type (F    : Field := Fld;
+                             Arg1 : C_Int;
+                             Arg2 : Double;
+                             Arg3 : Double) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_numeric");
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => C_Int (Typ.Precision),
+                                   Arg2 => Double (Typ.Lower_Limit),
+                                   Arg3 => Double (Typ.Upper_Limit)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.Numeric;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm new file mode 100644 index 00000000..0dddc360 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm @@ -0,0 +1,74 @@ + + + +terminal_interface-curses-forms-field_types-numeric.ads + + + + +

File : terminal_interface-curses-forms-field_types-numeric.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Forms.Field_Types.Numeric          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.Numeric is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.Numeric);
+
+   type Numeric_Field is new Field_Type with
+      record
+         Precision   : Natural;
+         Lower_Limit : Float;
+         Upper_Limit : Float;
+      end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Numeric_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.Numeric;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm new file mode 100644 index 00000000..a8936f5c --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm @@ -0,0 +1,77 @@ + + + +terminal_interface-curses-forms-field_types-regexp.adb + + + + +

File : terminal_interface-curses-forms-field_types-regexp.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Forms.Field_Types.RegExp           --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C; use Interfaces.C;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.RegExp is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Regular_Expression_Field)
+   is
+      function Set_Ftyp (F    : Field := Fld;
+                         Arg1 : char_array) return Eti_Error;
+      pragma Import (C, Set_Ftyp, "set_field_type_regexp");
+
+   begin
+      Eti_Exception (Set_Ftyp (Arg1 => To_C (Typ.Regular_Expression.all)));
+      Wrap_Builtin (Fld, Typ);
+   end Set_Field_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.RegExp;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm new file mode 100644 index 00000000..19f903da --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm @@ -0,0 +1,74 @@ + + + +terminal_interface-curses-forms-field_types-regexp.ads + + + + +

File : terminal_interface-curses-forms-field_types-regexp.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.RegExp          --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface.Curses.Forms.Field_Types.RegExp is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.RegExp);
+
+   type String_Access is access String;
+
+   type Regular_Expression_Field is new Field_Type with
+      record
+         Regular_Expression : String_Access;
+      end record;
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : Regular_Expression_Field);
+   pragma Inline (Set_Field_Type);
+
+end Terminal_Interface.Curses.Forms.Field_Types.RegExp;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm new file mode 100644 index 00000000..b9f797a8 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm @@ -0,0 +1,123 @@ + + + +terminal_interface-curses-forms-field_types-user-choice.adb + + + + +

File : terminal_interface-curses-forms-field_types-user-choice.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--          Terminal_Interface.Curses.Forms.Field_Types.User.Choice         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.21 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System.Address_To_Access_Conversions;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.User.Choice is
+
+   package Argument_Conversions is
+      new System.Address_To_Access_Conversions (Argument);
+
+   function Generic_Next (Fld : Field;
+                          Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_With_Choice_Access :=
+        User_Defined_Field_Type_With_Choice_Access
+        (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Next (Fld, Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Next;
+
+   function Generic_Prev (Fld : Field;
+                          Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_With_Choice_Access :=
+        User_Defined_Field_Type_With_Choice_Access
+        (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Previous (Fld, Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Prev;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Generic_Choice return C_Field_Type
+   is
+      Res : Eti_Error;
+      T   : C_Field_Type;
+   begin
+      if M_Generic_Choice = Null_Field_Type then
+         T := New_Fieldtype (Generic_Field_Check'Access,
+                             Generic_Char_Check'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Res := Set_Fieldtype_Arg (T,
+                                      Make_Arg'Access,
+                                      Copy_Arg'Access,
+                                      Free_Arg'Access);
+            Eti_Exception (Res);
+
+            Res := Set_Fieldtype_Choice (T,
+                                         Generic_Next'Access,
+                                         Generic_Prev'Access);
+            Eti_Exception (Res);
+         end if;
+         M_Generic_Choice := T;
+      end if;
+      pragma Assert (M_Generic_Choice /= Null_Field_Type);
+      return M_Generic_Choice;
+   end C_Generic_Choice;
+
+end Terminal_Interface.Curses.Forms.Field_Types.User.Choice;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm new file mode 100644 index 00000000..74a65889 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm @@ -0,0 +1,113 @@ + + + +terminal_interface-curses-forms-field_types-user-choice.ads + + + + +

File : terminal_interface-curses-forms-field_types-user-choice.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--           Terminal_Interface.Curses.Forms.Field_Types.User.Choice        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2008,2011 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+
+package Terminal_Interface.Curses.Forms.Field_Types.User.Choice is
+   pragma Preelaborate
+     (Terminal_Interface.Curses.Forms.Field_Types.User.Choice);
+
+   subtype C_Int is Interfaces.C.int;
+
+   type User_Defined_Field_Type_With_Choice is abstract new
+     User_Defined_Field_Type with null record;
+   --  This is the root of the mechanism we use to create field types in
+   --  Ada95 that allow the prev/next mechanism. You should your own type
+   --  derive from this one and implement the Field_Check, Character_Check
+   --  Next and Previous functions for your own type.
+
+   type User_Defined_Field_Type_With_Choice_Access is access all
+     User_Defined_Field_Type_With_Choice'Class;
+
+   function Next
+     (Fld : Field;
+      Typ : User_Defined_Field_Type_With_Choice) return Boolean
+      is abstract;
+   --  If True is returned, the function successfully generated a next
+   --  value into the fields buffer.
+
+   function Previous
+     (Fld : Field;
+      Typ : User_Defined_Field_Type_With_Choice) return Boolean
+      is abstract;
+   --  If True is returned, the function successfully generated a previous
+   --  value into the fields buffer.
+
+   --  +----------------------------------------------------------------------
+   --  | Private Part.
+   --  |
+private
+   function C_Generic_Choice return C_Field_Type;
+
+   function Generic_Next (Fld : Field;
+                          Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Next);
+   --  This is the generic next Choice_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Next implementation for the type.
+
+   function Generic_Prev (Fld : Field;
+                          Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Prev);
+   --  This is the generic prev Choice_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Previous implementation for the type.
+
+end Terminal_Interface.Curses.Forms.Field_Types.User.Choice;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm new file mode 100644 index 00000000..066df299 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm @@ -0,0 +1,145 @@ + + + +terminal_interface-curses-forms-field_types-user.adb + + + + +

File : terminal_interface-curses-forms-field_types-user.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--              Terminal_Interface.Curses.Forms.Field_Types.User            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.24 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System.Address_To_Access_Conversions;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Field_Types.User is
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : User_Defined_Field_Type)
+   is
+      function Allocate_Arg (T : User_Defined_Field_Type'Class)
+                             return Argument_Access;
+
+      function Set_Fld_Type (F    : Field := Fld;
+                             Cft  : C_Field_Type := C_Generic_Type;
+                             Arg1 : Argument_Access)
+                             return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_user");
+
+      function Allocate_Arg (T : User_Defined_Field_Type'Class)
+                             return Argument_Access
+      is
+         Ptr : constant Field_Type_Access
+             := new User_Defined_Field_Type'Class'(T);
+      begin
+         return new Argument'(Usr => System.Null_Address,
+                              Typ => Ptr,
+                              Cft => Null_Field_Type);
+      end Allocate_Arg;
+
+   begin
+      Eti_Exception (Set_Fld_Type (Arg1 => Allocate_Arg (Typ)));
+   end Set_Field_Type;
+
+   package Argument_Conversions is
+      new System.Address_To_Access_Conversions (Argument);
+
+   function Generic_Field_Check (Fld : Field;
+                                 Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_Access :=
+        User_Defined_Field_Type_Access
+          (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Field_Check (Fld, Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Field_Check;
+
+   function Generic_Char_Check (Ch  : C_Int;
+                                Usr : System.Address) return Curses_Bool
+   is
+      Result : Boolean;
+      Udf    : constant User_Defined_Field_Type_Access :=
+        User_Defined_Field_Type_Access
+          (Argument_Access (Argument_Conversions.To_Pointer (Usr)).all.Typ);
+   begin
+      Result := Character_Check (Character'Val (Ch), Udf.all);
+      return Curses_Bool (Boolean'Pos (Result));
+   end Generic_Char_Check;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Generic_Type return C_Field_Type
+   is
+      Res : Eti_Error;
+      T   : C_Field_Type;
+   begin
+      if M_Generic_Type = Null_Field_Type then
+         T := New_Fieldtype (Generic_Field_Check'Access,
+                             Generic_Char_Check'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Res := Set_Fieldtype_Arg (T,
+                                      Make_Arg'Access,
+                                      Copy_Arg'Access,
+                                      Free_Arg'Access);
+            Eti_Exception (Res);
+         end if;
+         M_Generic_Type := T;
+      end if;
+      pragma Assert (M_Generic_Type /= Null_Field_Type);
+      return M_Generic_Type;
+   end C_Generic_Type;
+
+end Terminal_Interface.Curses.Forms.Field_Types.User;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm new file mode 100644 index 00000000..71902837 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm @@ -0,0 +1,114 @@ + + + +terminal_interface-curses-forms-field_types-user.ads + + + + +

File : terminal_interface-curses-forms-field_types-user.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Forms.Field_Types.User           --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2009,2011 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.16 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+
+package Terminal_Interface.Curses.Forms.Field_Types.User is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types.User);
+   subtype C_Int is Interfaces.C.int;
+
+   type User_Defined_Field_Type is abstract new Field_Type with null record;
+   --  This is the root of the mechanism we use to create field types in
+   --  Ada95. You should your own type derive from this one and implement
+   --  the Field_Check and Character_Check functions for your own type.
+
+   type User_Defined_Field_Type_Access is access all
+     User_Defined_Field_Type'Class;
+
+   function Field_Check
+     (Fld : Field;
+      Typ : User_Defined_Field_Type) return Boolean
+      is abstract;
+   --  If True is returned, the field is considered valid, otherwise it is
+   --  invalid.
+
+   function Character_Check
+     (Ch  : Character;
+      Typ : User_Defined_Field_Type) return Boolean
+      is abstract;
+   --  If True is returned, the character is considered as valid for the
+   --  field, otherwise as invalid.
+
+   procedure Set_Field_Type (Fld : Field;
+                             Typ : User_Defined_Field_Type);
+   --  This should work for all types derived from User_Defined_Field_Type.
+   --  No need to reimplement it for your derived type.
+
+   --  +----------------------------------------------------------------------
+   --  | Private Part.
+   --  | Used by the Choice child package.
+private
+   function C_Generic_Type   return C_Field_Type;
+
+   function Generic_Field_Check (Fld : Field;
+                                 Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Field_Check);
+   --  This is the generic Field_Check_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Field_Check implementation for the type.
+
+   function Generic_Char_Check (Ch  : C_Int;
+                                Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Generic_Char_Check);
+   --  This is the generic Char_Check_Function for the low-level fieldtype
+   --  representing all the User_Defined_Field_Type derivatives. It routes
+   --  the call to the Character_Check implementation for the type.
+
+end Terminal_Interface.Curses.Forms.Field_Types.User;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm new file mode 100644 index 00000000..c028825d --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm @@ -0,0 +1,288 @@ + + + +terminal_interface-curses-forms-field_types.adb + + + + +

File : terminal_interface-curses-forms-field_types.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Forms.Field_Types              --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.29 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Ada.Unchecked_Deallocation;
+with System.Address_To_Access_Conversions;
+
+--  |
+--  |=====================================================================
+--  | man page form_fieldtype.3x
+--  |=====================================================================
+--  |
+package body Terminal_Interface.Curses.Forms.Field_Types is
+
+   use type System.Address;
+
+   package Argument_Conversions is
+      new System.Address_To_Access_Conversions (Argument);
+
+   function Get_Fieldtype (F : Field) return C_Field_Type;
+   pragma Import (C, Get_Fieldtype, "field_type");
+
+   function Get_Arg (F : Field) return System.Address;
+   pragma Import (C, Get_Arg, "field_arg");
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_validation.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Get_Type (Fld : Field) return Field_Type_Access
+   is
+      Low_Level : constant C_Field_Type := Get_Fieldtype (Fld);
+      Arg : Argument_Access;
+   begin
+      if Low_Level = Null_Field_Type then
+         return null;
+      else
+         if Low_Level = M_Builtin_Router or else
+            Low_Level = M_Generic_Type or else
+            Low_Level = M_Choice_Router or else
+            Low_Level = M_Generic_Choice
+         then
+            Arg := Argument_Access
+         (Argument_Conversions.To_Pointer (Get_Arg (Fld)));
+            if Arg = null then
+               raise Form_Exception;
+            else
+               return Arg.all.Typ;
+            end if;
+         else
+            raise Form_Exception;
+         end if;
+      end if;
+   end Get_Type;
+
+   function Copy_Arg (Usr : System.Address) return System.Address
+   is
+   begin
+      return Usr;
+   end Copy_Arg;
+
+   procedure Free_Arg (Usr : System.Address)
+   is
+      procedure Free_Type is new Ada.Unchecked_Deallocation
+        (Field_Type'Class, Field_Type_Access);
+      procedure Freeargs is new Ada.Unchecked_Deallocation
+        (Argument, Argument_Access);
+
+      To_Be_Free : Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+      Low_Level  : C_Field_Type;
+   begin
+      if To_Be_Free /= null then
+         if To_Be_Free.all.Usr /= System.Null_Address then
+            Low_Level := To_Be_Free.all.Cft;
+            if Low_Level.all.Freearg /= null then
+               Low_Level.all.Freearg (To_Be_Free.all.Usr);
+            end if;
+         end if;
+         if To_Be_Free.all.Typ /= null then
+            Free_Type (To_Be_Free.all.Typ);
+         end if;
+         Freeargs (To_Be_Free);
+      end if;
+   end Free_Arg;
+
+   procedure Wrap_Builtin (Fld : Field;
+                           Typ : Field_Type'Class;
+                           Cft : C_Field_Type := C_Builtin_Router)
+   is
+      Usr_Arg   : constant System.Address := Get_Arg (Fld);
+      Low_Level : constant C_Field_Type := Get_Fieldtype (Fld);
+      Arg : Argument_Access;
+      function Set_Fld_Type (F    : Field := Fld;
+                             Cf   : C_Field_Type := Cft;
+                             Arg1 : Argument_Access) return Eti_Error;
+      pragma Import (C, Set_Fld_Type, "set_field_type_user");
+
+   begin
+      pragma Assert (Low_Level /= Null_Field_Type);
+      if Cft /= C_Builtin_Router and then Cft /= C_Choice_Router then
+         raise Form_Exception;
+      else
+         Arg := new Argument'(Usr => System.Null_Address,
+                              Typ => new Field_Type'Class'(Typ),
+                              Cft => Get_Fieldtype (Fld));
+         if Usr_Arg /= System.Null_Address then
+            if Low_Level.all.Copyarg /= null then
+               Arg.all.Usr := Low_Level.all.Copyarg (Usr_Arg);
+            else
+               Arg.all.Usr := Usr_Arg;
+            end if;
+         end if;
+
+         Eti_Exception (Set_Fld_Type (Arg1 => Arg));
+      end if;
+   end Wrap_Builtin;
+
+   function Field_Check_Router (Fld : Field;
+                                Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Fcheck /= null then
+         return Arg.all.Cft.all.Fcheck (Fld, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Field_Check_Router;
+
+   function Char_Check_Router (Ch  : C_Int;
+                               Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Ccheck /= null then
+         return Arg.all.Cft.all.Ccheck (Ch, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Char_Check_Router;
+
+   function Next_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access
+   := Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Next /= null then
+         return Arg.all.Cft.all.Next (Fld, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Next_Router;
+
+   function Prev_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool
+   is
+      Arg  : constant Argument_Access :=
+               Argument_Access (Argument_Conversions.To_Pointer (Usr));
+   begin
+      pragma Assert (Arg /= null and then Arg.all.Cft /= Null_Field_Type
+                     and then Arg.all.Typ /= null);
+      if Arg.all.Cft.all.Prev /= null then
+         return Arg.all.Cft.all.Prev (Fld, Arg.all.Usr);
+      else
+         return 1;
+      end if;
+   end Prev_Router;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Builtin_Router return C_Field_Type
+   is
+      T   : C_Field_Type;
+   begin
+      if M_Builtin_Router = Null_Field_Type then
+         T := New_Fieldtype (Field_Check_Router'Access,
+                             Char_Check_Router'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Eti_Exception (Set_Fieldtype_Arg (T,
+                                              Make_Arg'Access,
+                                              Copy_Arg'Access,
+                                              Free_Arg'Access));
+         end if;
+         M_Builtin_Router := T;
+      end if;
+      pragma Assert (M_Builtin_Router /= Null_Field_Type);
+      return M_Builtin_Router;
+   end C_Builtin_Router;
+
+   --  -----------------------------------------------------------------------
+   --
+   function C_Choice_Router return C_Field_Type
+   is
+      T   : C_Field_Type;
+   begin
+      if M_Choice_Router = Null_Field_Type then
+         T := New_Fieldtype (Field_Check_Router'Access,
+                             Char_Check_Router'Access);
+         if T = Null_Field_Type then
+            raise Form_Exception;
+         else
+            Eti_Exception (Set_Fieldtype_Arg (T,
+                                              Make_Arg'Access,
+                                              Copy_Arg'Access,
+                                              Free_Arg'Access));
+
+            Eti_Exception (Set_Fieldtype_Choice (T,
+                                                 Next_Router'Access,
+                                                 Prev_Router'Access));
+         end if;
+         M_Choice_Router := T;
+      end if;
+      pragma Assert (M_Choice_Router /= Null_Field_Type);
+      return M_Choice_Router;
+   end C_Choice_Router;
+
+end Terminal_Interface.Curses.Forms.Field_Types;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm new file mode 100644 index 00000000..1970dd4e --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm @@ -0,0 +1,258 @@ + + + +terminal_interface-curses-forms-field_types.ads + + + + +

File : terminal_interface-curses-forms-field_types.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Forms.Field_Types              --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.21 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux;
+
+package Terminal_Interface.Curses.Forms.Field_Types is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_Types);
+   subtype C_Int is Interfaces.C.int;
+
+   --  |=====================================================================
+   --  | Man page form_fieldtype.3x
+   --  |=====================================================================
+
+   type Field_Type is abstract tagged null record;
+   --  Abstract base type for all field types. A concrete field type
+   --  is an extension that adds some data elements describing formats or
+   --  boundary values for the type and validation routines.
+   --  For the builtin low-level fieldtypes, the validation routines are
+   --  already defined by the low-level C library.
+   --  The builtin types like Alpha or AlphaNumeric etc. are defined in
+   --  child packages of this package. You may use one of them as example
+   --  how to create you own child packages for low-level field types that
+   --  you may have already written in C.
+
+   type Field_Type_Access is access all Field_Type'Class;
+
+   --  |
+   procedure Set_Field_Type (Fld      : Field;
+                             Fld_Type : Field_Type) is abstract;
+   --  AKA: set_field_type()
+   --  But: we hide the vararg mechanism of the C interface. You always
+   --       have to pass a single Field_Type parameter.
+
+   --  ---------------------------------------------------------------------
+
+   --  |=====================================================================
+   --  | Man page form_field_validation.3x
+   --  |=====================================================================
+
+   --  |
+   function Get_Type (Fld : Field) return Field_Type_Access;
+   --  AKA: field_type()
+   --  AKA: field_arg()
+   --  In Ada95 we can combine these. If you try to retrieve the field type
+   --  that is not defined as extension of the abstract tagged type above,
+   --  you will raise a Form_Exception.
+   --  This is not inlined
+
+   --  +----------------------------------------------------------------------
+   --  | Private Part.
+   --  | Most of this is used by the implementations of the child packages.
+   --  |
+private
+   type Makearg_Function is access
+     function (Args : System.Address) return System.Address;
+   pragma Convention (C, Makearg_Function);
+
+   type Copyarg_Function is access
+     function (Usr : System.Address) return System.Address;
+   pragma Convention (C, Copyarg_Function);
+
+   type Freearg_Function is access
+     procedure (Usr : System.Address);
+   pragma Convention (C, Freearg_Function);
+
+   type Field_Check_Function is access
+     function (Fld : Field; Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Field_Check_Function);
+
+   type Char_Check_Function is access
+     function (Ch : C_Int; Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Char_Check_Function);
+
+   type Choice_Function is access
+     function (Fld : Field; Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Choice_Function);
+
+   --  +----------------------------------------------------------------------
+   --  | This must be in sync with the FIELDTYPE structure in form.h
+   --  |
+   type Low_Level_Field_Type is
+      record
+         Status :              Interfaces.C.unsigned_short;
+         Ref_Count :           Interfaces.C.long;
+         Left, Right :         System.Address;
+         Makearg :             Makearg_Function;
+         Copyarg :             Copyarg_Function;
+         Freearg :             Freearg_Function;
+         Fcheck :              Field_Check_Function;
+         Ccheck :              Char_Check_Function;
+         Next, Prev :          Choice_Function;
+      end record;
+   pragma Convention (C, Low_Level_Field_Type);
+   type C_Field_Type is access all Low_Level_Field_Type;
+
+   Null_Field_Type   : constant C_Field_Type := null;
+
+   --  +----------------------------------------------------------------------
+   --  | This four low-level fieldtypes are the ones associated with
+   --  | fieldtypes handled by this binding. Any other low-level fieldtype
+   --  | will result in a Form_Exception is function Get_Type.
+   --  |
+   M_Generic_Type   : C_Field_Type := null;
+   M_Generic_Choice : C_Field_Type := null;
+   M_Builtin_Router : C_Field_Type := null;
+   M_Choice_Router  : C_Field_Type := null;
+
+   --  Two wrapper functions to access those low-level fieldtypes defined
+   --  in this package.
+   function C_Builtin_Router return C_Field_Type;
+   function C_Choice_Router  return C_Field_Type;
+
+   procedure Wrap_Builtin (Fld : Field;
+                           Typ : Field_Type'Class;
+                           Cft : C_Field_Type := C_Builtin_Router);
+   --  This procedure has to be called by the Set_Field_Type implementation
+   --  for builtin low-level fieldtypes to replace it by an Ada95
+   --  conformant Field_Type object.
+   --  The parameter Cft must be C_Builtin_Router for regular low-level
+   --  fieldtypes (like TYP_ALPHA or TYP_ALNUM) and C_Choice_Router for
+   --  low-level fieldtypes witch choice functions (like TYP_ENUM).
+   --  Any other value will raise a Form_Exception.
+
+   function Make_Arg (Args : System.Address) return System.Address;
+   pragma Import (C, Make_Arg, "void_star_make_arg");
+   --  This is the Makearg_Function for the internal low-level types
+   --  introduced by this binding.
+
+   function Copy_Arg (Usr : System.Address) return System.Address;
+   pragma Convention (C, Copy_Arg);
+   --  This is the Copyarg_Function for the internal low-level types
+   --  introduced by this binding.
+
+   procedure Free_Arg (Usr : System.Address);
+   pragma Convention (C, Free_Arg);
+   --  This is the Freearg_Function for the internal low-level types
+   --  introduced by this binding.
+
+   function Field_Check_Router (Fld : Field;
+                                Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Field_Check_Router);
+   --  This is the Field_Check_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level validation
+   --  function.
+
+   function Char_Check_Router (Ch : C_Int;
+                               Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Char_Check_Router);
+   --  This is the Char_Check_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level validation
+   --  function.
+
+   function Next_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Next_Router);
+   --  This is the Choice_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level next_choice
+   --  function.
+
+   function Prev_Router (Fld : Field;
+                         Usr : System.Address) return Curses_Bool;
+   pragma Convention (C, Prev_Router);
+   --  This is the Choice_Function for the internal low-level types
+   --  introduced to wrap the low-level types by a Field_Type derived
+   --  type. It routes the call to the corresponding low-level prev_choice
+   --  function.
+
+   --  This is the Argument structure maintained by all low-level field types
+   --  introduced by this binding.
+   type Argument is record
+      Typ : Field_Type_Access;   --  the Field_Type creating this record
+      Usr : System.Address;      --  original arg for builtin low-level types
+      Cft : C_Field_Type;        --  the original low-level type
+   end record;
+   type Argument_Access is access all Argument;
+
+   --  +----------------------------------------------------------------------
+   --  |
+   --  | Some Imports of libform routines to deal with low-level fieldtypes.
+   --  |
+   function New_Fieldtype (Fcheck : Field_Check_Function;
+                           Ccheck : Char_Check_Function)
+     return C_Field_Type;
+   pragma Import (C, New_Fieldtype, "new_fieldtype");
+
+   function Set_Fieldtype_Arg (Cft : C_Field_Type;
+                               Mak : Makearg_Function := Make_Arg'Access;
+                               Cop : Copyarg_Function := Copy_Arg'Access;
+                               Fre : Freearg_Function := Free_Arg'Access)
+     return Aux.Eti_Error;
+   pragma Import (C, Set_Fieldtype_Arg, "set_fieldtype_arg");
+
+   function Set_Fieldtype_Choice (Cft : C_Field_Type;
+                                  Next, Prev : Choice_Function)
+     return Aux.Eti_Error;
+   pragma Import (C, Set_Fieldtype_Choice, "set_fieldtype_choice");
+
+end Terminal_Interface.Curses.Forms.Field_Types;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm new file mode 100644 index 00000000..a0c5a41a --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm @@ -0,0 +1,99 @@ + + + +terminal_interface-curses-forms-field_user_data.adb + + + + +

File : terminal_interface-curses-forms-field_user_data.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Forms.Field_User_Data            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.17 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use  Terminal_Interface.Curses.Aux;
+
+--  |
+--  |=====================================================================
+--  | man page form_field_userptr.3x
+--  |=====================================================================
+--  |
+package body Terminal_Interface.Curses.Forms.Field_User_Data is
+   --  |
+   --  |
+   --  |
+   procedure Set_User_Data (Fld  : Field;
+                            Data : User_Access)
+   is
+      function Set_Field_Userptr (Fld : Field;
+                                  Usr : User_Access) return Eti_Error;
+      pragma Import (C, Set_Field_Userptr, "set_field_userptr");
+
+   begin
+      Eti_Exception (Set_Field_Userptr (Fld, Data));
+   end Set_User_Data;
+   --  |
+   --  |
+   --  |
+   function Get_User_Data (Fld  : Field) return User_Access
+   is
+      function Field_Userptr (Fld : Field) return User_Access;
+      pragma Import (C, Field_Userptr, "field_userptr");
+   begin
+      return Field_Userptr (Fld);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Fld  : Field;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Fld);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Forms.Field_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm new file mode 100644 index 00000000..d1a467cc --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm @@ -0,0 +1,88 @@ + + + +terminal_interface-curses-forms-field_user_data.ads + + + + +

File : terminal_interface-curses-forms-field_user_data.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Forms.Field_User_Data            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.17 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Forms.Field_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Field_User_Data);
+
+   --  |=====================================================================
+   --  | Man page form_field_userptr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_User_Data (Fld  : Field;
+                            Data : User_Access);
+   --  AKA: set_field_userptr
+   pragma Inline (Set_User_Data);
+
+   --  |
+   procedure Get_User_Data (Fld  : Field;
+                            Data : out User_Access);
+   --  AKA: field_userptr
+
+   --  |
+   function Get_User_Data (Fld  : Field) return User_Access;
+   --  AKA: field_userptr
+   --  Sama as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Forms.Field_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm new file mode 100644 index 00000000..fbb0b5c7 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm @@ -0,0 +1,100 @@ + + + +terminal_interface-curses-forms-form_user_data.adb + + + + +

File : terminal_interface-curses-forms-form_user_data.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Forms.Form_User_Data            --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.17 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+--  |
+--  |=====================================================================
+--  | man page form__userptr.3x
+--  |=====================================================================
+--  |
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms.Form_User_Data is
+
+   --  |
+   --  |
+   --  |
+   procedure Set_User_Data (Frm  : Form;
+                            Data : User_Access)
+   is
+      function Set_Form_Userptr (Frm  : Form;
+                                 Data : User_Access)  return Eti_Error;
+      pragma Import (C, Set_Form_Userptr, "set_form_userptr");
+
+   begin
+      Eti_Exception (Set_Form_Userptr (Frm, Data));
+   end Set_User_Data;
+   --  |
+   --  |
+   --  |
+   function Get_User_Data (Frm  : Form) return User_Access
+   is
+      function Form_Userptr (Frm : Form) return User_Access;
+      pragma Import (C, Form_Userptr, "form_userptr");
+   begin
+      return Form_Userptr (Frm);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Frm  : Form;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Frm);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Forms.Form_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm new file mode 100644 index 00000000..c6baf65b --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm @@ -0,0 +1,88 @@ + + + +terminal_interface-curses-forms-form_user_data.ads + + + + +

File : terminal_interface-curses-forms-form_user_data.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Forms.Form_User_Data            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.16 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Forms.Form_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms.Form_User_Data);
+
+   --  |=====================================================================
+   --  | Man page form_userptr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_User_Data (Frm  : Form;
+                            Data : User_Access);
+   --  AKA: set_form_userptr
+   pragma Inline (Set_User_Data);
+
+   --  |
+   procedure Get_User_Data (Frm  : Form;
+                            Data : out User_Access);
+   --  AKA: form_userptr
+
+   --  |
+   function Get_User_Data (Frm  : Form) return User_Access;
+   --  AKA: form_userptr
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Forms.Form_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__adb.htm new file mode 100644 index 00000000..3f22b40d --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__adb.htm @@ -0,0 +1,1050 @@ + + + +terminal_interface-curses-forms.adb + + + + +

File : terminal_interface-curses-forms.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Forms                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.33 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Interfaces.C.Pointers;
+
+with Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Forms is
+
+   use Terminal_Interface.Curses.Aux;
+
+   type C_Field_Array is array (Natural range <>) of aliased Field;
+   package F_Array is new
+     Interfaces.C.Pointers (Natural, Field, C_Field_Array, Null_Field);
+
+------------------------------------------------------------------------------
+   --  |
+   --  |
+   --  |
+   --  subtype chars_ptr is Interfaces.C.Strings.chars_ptr;
+
+   procedure Request_Name (Key  : Form_Request_Code;
+                                Name : out String)
+   is
+      function Form_Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Form_Request_Name, "form_request_name");
+   begin
+      Fill_String (Form_Request_Name (C_Int (Key)), Name);
+   end Request_Name;
+
+   function Request_Name (Key : Form_Request_Code) return String
+   is
+      function Form_Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Form_Request_Name, "form_request_name");
+   begin
+      return Fill_String (Form_Request_Name (C_Int (Key)));
+   end Request_Name;
+------------------------------------------------------------------------------
+   --  |
+   --  |
+   --  |
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_new.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Create (Height       : Line_Count;
+                    Width        : Column_Count;
+                    Top          : Line_Position;
+                    Left         : Column_Position;
+                    Off_Screen   : Natural := 0;
+                    More_Buffers : Buffer_Number := Buffer_Number'First)
+                    return Field
+   is
+      function Newfield (H, W, T, L, O, M : C_Int) return Field;
+      pragma Import (C, Newfield, "new_field");
+      Fld : constant Field := Newfield (C_Int (Height), C_Int (Width),
+                                        C_Int (Top), C_Int (Left),
+                                        C_Int (Off_Screen),
+                                        C_Int (More_Buffers));
+   begin
+      if Fld = Null_Field then
+         raise Form_Exception;
+      end if;
+      return Fld;
+   end Create;
+--  |
+--  |
+--  |
+   procedure Delete (Fld : in out Field)
+   is
+      function Free_Field (Fld : Field) return Eti_Error;
+      pragma Import (C, Free_Field, "free_field");
+
+   begin
+      Eti_Exception (Free_Field (Fld));
+      Fld := Null_Field;
+   end Delete;
+   --  |
+   --  |
+   --  |
+   function Duplicate (Fld  : Field;
+                       Top  : Line_Position;
+                       Left : Column_Position) return Field
+   is
+      function Dup_Field (Fld  : Field;
+                          Top  : C_Int;
+                          Left : C_Int) return Field;
+      pragma Import (C, Dup_Field, "dup_field");
+
+      F : constant Field := Dup_Field (Fld,
+                                       C_Int (Top),
+                                       C_Int (Left));
+   begin
+      if F = Null_Field then
+         raise Form_Exception;
+      end if;
+      return F;
+   end Duplicate;
+   --  |
+   --  |
+   --  |
+   function Link (Fld  : Field;
+                  Top  : Line_Position;
+                  Left : Column_Position) return Field
+   is
+      function Lnk_Field (Fld  : Field;
+                          Top  : C_Int;
+                          Left : C_Int) return Field;
+      pragma Import (C, Lnk_Field, "link_field");
+
+      F : constant Field := Lnk_Field (Fld,
+                                       C_Int (Top),
+                                       C_Int (Left));
+   begin
+      if F = Null_Field then
+         raise Form_Exception;
+      end if;
+      return F;
+   end Link;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_just.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Justification (Fld  : Field;
+                                Just : Field_Justification := None)
+   is
+      function Set_Field_Just (Fld  : Field;
+                               Just : C_Int) return Eti_Error;
+      pragma Import (C, Set_Field_Just, "set_field_just");
+
+   begin
+      Eti_Exception (Set_Field_Just (Fld,
+                                     C_Int (Field_Justification'Pos (Just))));
+   end Set_Justification;
+   --  |
+   --  |
+   --  |
+   function Get_Justification (Fld : Field) return Field_Justification
+   is
+      function Field_Just (Fld : Field) return C_Int;
+      pragma Import (C, Field_Just, "field_just");
+   begin
+      return Field_Justification'Val (Field_Just (Fld));
+   end Get_Justification;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_buffer.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : String)
+   is
+      function Set_Fld_Buffer (Fld    : Field;
+                                 Bufnum : C_Int;
+                                 S      : char_array)
+        return Eti_Error;
+      pragma Import (C, Set_Fld_Buffer, "set_field_buffer");
+
+   begin
+      Eti_Exception (Set_Fld_Buffer (Fld, C_Int (Buffer), To_C (Str)));
+   end Set_Buffer;
+   --  |
+   --  |
+   --  |
+   procedure Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : out String)
+   is
+      function Field_Buffer (Fld : Field;
+                             B   : C_Int) return chars_ptr;
+      pragma Import (C, Field_Buffer, "field_buffer");
+   begin
+      Fill_String (Field_Buffer (Fld, C_Int (Buffer)), Str);
+   end Get_Buffer;
+
+   function Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First) return String
+   is
+      function Field_Buffer (Fld : Field;
+                             B   : C_Int) return chars_ptr;
+      pragma Import (C, Field_Buffer, "field_buffer");
+   begin
+      return Fill_String (Field_Buffer (Fld, C_Int (Buffer)));
+   end Get_Buffer;
+   --  |
+   --  |
+   --  |
+   procedure Set_Status (Fld    : Field;
+                         Status : Boolean := True)
+   is
+      function Set_Fld_Status (Fld : Field;
+                               St  : C_Int) return Eti_Error;
+      pragma Import (C, Set_Fld_Status, "set_field_status");
+
+   begin
+      if Set_Fld_Status (Fld, Boolean'Pos (Status)) /= E_Ok then
+         raise Form_Exception;
+      end if;
+   end Set_Status;
+   --  |
+   --  |
+   --  |
+   function Changed (Fld : Field) return Boolean
+   is
+      function Field_Status (Fld : Field) return C_Int;
+      pragma Import (C, Field_Status, "field_status");
+
+      Res : constant C_Int := Field_Status (Fld);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Changed;
+   --  |
+   --  |
+   --  |
+   procedure Set_Maximum_Size (Fld : Field;
+                               Max : Natural := 0)
+   is
+      function Set_Field_Max (Fld : Field;
+                              M   : C_Int) return Eti_Error;
+      pragma Import (C, Set_Field_Max, "set_max_field");
+
+   begin
+      Eti_Exception (Set_Field_Max (Fld, C_Int (Max)));
+   end Set_Maximum_Size;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_opts.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Options (Fld     : Field;
+                          Options : Field_Option_Set)
+   is
+      function Set_Field_Opts (Fld : Field;
+                               Opt : Field_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Field_Opts, "set_field_opts");
+
+   begin
+      Eti_Exception (Set_Field_Opts (Fld, Options));
+   end Set_Options;
+   --  |
+   --  |
+   --  |
+   procedure Switch_Options (Fld     : Field;
+                             Options : Field_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Field_Opts_On (Fld : Field;
+                              Opt : Field_Option_Set) return Eti_Error;
+      pragma Import (C, Field_Opts_On, "field_opts_on");
+      function Field_Opts_Off (Fld : Field;
+                               Opt : Field_Option_Set) return Eti_Error;
+      pragma Import (C, Field_Opts_Off, "field_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Field_Opts_On (Fld, Options));
+      else
+         Eti_Exception (Field_Opts_Off (Fld, Options));
+      end if;
+   end Switch_Options;
+   --  |
+   --  |
+   --  |
+   procedure Get_Options (Fld     : Field;
+                          Options : out Field_Option_Set)
+   is
+      function Field_Opts (Fld : Field) return Field_Option_Set;
+      pragma Import (C, Field_Opts, "field_opts");
+
+   begin
+      Options := Field_Opts (Fld);
+   end Get_Options;
+   --  |
+   --  |
+   --  |
+   function Get_Options (Fld : Field := Null_Field)
+                         return Field_Option_Set
+   is
+      Fos : Field_Option_Set;
+   begin
+      Get_Options (Fld, Fos);
+      return Fos;
+   end Get_Options;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_attributes.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Foreground
+     (Fld   : Field;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Field_Fore (Fld  : Field;
+                               Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Field_Fore, "set_field_fore");
+
+   begin
+      Eti_Exception (Set_Field_Fore (Fld, (Ch    => Character'First,
+                                           Color => Color,
+                                           Attr  => Fore)));
+   end Set_Foreground;
+   --  |
+   --  |
+   --  |
+   procedure Foreground (Fld  : Field;
+                         Fore : out Character_Attribute_Set)
+   is
+      function Field_Fore (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Fore, "field_fore");
+   begin
+      Fore := Field_Fore (Fld).Attr;
+   end Foreground;
+
+   procedure Foreground (Fld   : Field;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Field_Fore (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Fore, "field_fore");
+   begin
+      Fore  := Field_Fore (Fld).Attr;
+      Color := Field_Fore (Fld).Color;
+   end Foreground;
+   --  |
+   --  |
+   --  |
+   procedure Set_Background
+     (Fld   : Field;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Field_Back (Fld  : Field;
+                               Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Field_Back, "set_field_back");
+
+   begin
+      Eti_Exception (Set_Field_Back (Fld, (Ch    => Character'First,
+                                           Color => Color,
+                                           Attr  => Back)));
+   end Set_Background;
+   --  |
+   --  |
+   --  |
+   procedure Background (Fld  : Field;
+                         Back : out Character_Attribute_Set)
+   is
+      function Field_Back (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Back, "field_back");
+   begin
+      Back := Field_Back (Fld).Attr;
+   end Background;
+
+   procedure Background (Fld   : Field;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Field_Back (Fld : Field) return Attributed_Character;
+      pragma Import (C, Field_Back, "field_back");
+   begin
+      Back  := Field_Back (Fld).Attr;
+      Color := Field_Back (Fld).Color;
+   end Background;
+   --  |
+   --  |
+   --  |
+   procedure Set_Pad_Character (Fld : Field;
+                                Pad : Character := Space)
+   is
+      function Set_Field_Pad (Fld : Field;
+                              Ch  : C_Int) return Eti_Error;
+      pragma Import (C, Set_Field_Pad, "set_field_pad");
+
+   begin
+      Eti_Exception (Set_Field_Pad (Fld,
+                                    C_Int (Character'Pos (Pad))));
+   end Set_Pad_Character;
+   --  |
+   --  |
+   --  |
+   procedure Pad_Character (Fld : Field;
+                            Pad : out Character)
+   is
+      function Field_Pad (Fld : Field) return C_Int;
+      pragma Import (C, Field_Pad, "field_pad");
+   begin
+      Pad := Character'Val (Field_Pad (Fld));
+   end Pad_Character;
+   --  |
+   --  |=====================================================================
+   --  | man page form_field_info.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Info (Fld                : Field;
+                   Lines              : out Line_Count;
+                   Columns            : out Column_Count;
+                   First_Row          : out Line_Position;
+                   First_Column       : out Column_Position;
+                   Off_Screen         : out Natural;
+                   Additional_Buffers : out Buffer_Number)
+   is
+      type C_Int_Access is access all C_Int;
+      function Fld_Info (Fld : Field;
+                         L, C, Fr, Fc, Os, Ab : C_Int_Access)
+                         return Eti_Error;
+      pragma Import (C, Fld_Info, "field_info");
+
+      L, C, Fr, Fc, Os, Ab : aliased C_Int;
+   begin
+      Eti_Exception (Fld_Info (Fld,
+                               L'Access, C'Access,
+                               Fr'Access, Fc'Access,
+                               Os'Access, Ab'Access));
+      Lines              := Line_Count (L);
+      Columns            := Column_Count (C);
+      First_Row          := Line_Position (Fr);
+      First_Column       := Column_Position (Fc);
+      Off_Screen         := Natural (Os);
+      Additional_Buffers := Buffer_Number (Ab);
+   end Info;
+--  |
+--  |
+--  |
+   procedure Dynamic_Info (Fld     : Field;
+                           Lines   : out Line_Count;
+                           Columns : out Column_Count;
+                           Max     : out Natural)
+   is
+      type C_Int_Access is access all C_Int;
+      function Dyn_Info (Fld : Field; L, C, M : C_Int_Access) return Eti_Error;
+      pragma Import (C, Dyn_Info, "dynamic_field_info");
+
+      L, C, M : aliased C_Int;
+   begin
+      Eti_Exception (Dyn_Info (Fld,
+                               L'Access, C'Access,
+                               M'Access));
+      Lines   := Line_Count (L);
+      Columns := Column_Count (C);
+      Max     := Natural (M);
+   end Dynamic_Info;
+   --  |
+   --  |=====================================================================
+   --  | man page form_win.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Window (Frm : Form;
+                         Win : Window)
+   is
+      function Set_Form_Win (Frm : Form;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Form_Win, "set_form_win");
+
+   begin
+      Eti_Exception (Set_Form_Win (Frm, Win));
+   end Set_Window;
+   --  |
+   --  |
+   --  |
+   function Get_Window (Frm : Form) return Window
+   is
+      function Form_Win (Frm : Form) return Window;
+      pragma Import (C, Form_Win, "form_win");
+
+      W : constant Window := Form_Win (Frm);
+   begin
+      return W;
+   end Get_Window;
+   --  |
+   --  |
+   --  |
+   procedure Set_Sub_Window (Frm : Form;
+                             Win : Window)
+   is
+      function Set_Form_Sub (Frm : Form;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Form_Sub, "set_form_sub");
+
+   begin
+      Eti_Exception (Set_Form_Sub (Frm, Win));
+   end Set_Sub_Window;
+   --  |
+   --  |
+   --  |
+   function Get_Sub_Window (Frm : Form) return Window
+   is
+      function Form_Sub (Frm : Form) return Window;
+      pragma Import (C, Form_Sub, "form_sub");
+
+      W : constant Window := Form_Sub (Frm);
+   begin
+      return W;
+   end Get_Sub_Window;
+   --  |
+   --  |
+   --  |
+   procedure Scale (Frm     : Form;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count)
+   is
+      type C_Int_Access is access all C_Int;
+      function M_Scale (Frm : Form; Yp, Xp : C_Int_Access) return Eti_Error;
+      pragma Import (C, M_Scale, "scale_form");
+
+      X, Y : aliased C_Int;
+   begin
+      Eti_Exception (M_Scale (Frm, Y'Access, X'Access));
+      Lines   := Line_Count (Y);
+      Columns := Column_Count (X);
+   end Scale;
+   --  |
+   --  |=====================================================================
+   --  | man page menu_hook.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Field_Init_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function)
+   is
+      function Set_Field_Init (Frm  : Form;
+                               Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Field_Init, "set_field_init");
+
+   begin
+      Eti_Exception (Set_Field_Init (Frm, Proc));
+   end Set_Field_Init_Hook;
+   --  |
+   --  |
+   --  |
+   procedure Set_Field_Term_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function)
+   is
+      function Set_Field_Term (Frm  : Form;
+                               Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Field_Term, "set_field_term");
+
+   begin
+      Eti_Exception (Set_Field_Term (Frm, Proc));
+   end Set_Field_Term_Hook;
+   --  |
+   --  |
+   --  |
+   procedure Set_Form_Init_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function)
+   is
+      function Set_Form_Init (Frm  : Form;
+                              Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Form_Init, "set_form_init");
+
+   begin
+      Eti_Exception (Set_Form_Init (Frm, Proc));
+   end Set_Form_Init_Hook;
+   --  |
+   --  |
+   --  |
+   procedure Set_Form_Term_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function)
+   is
+      function Set_Form_Term (Frm  : Form;
+                              Proc : Form_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Form_Term, "set_form_term");
+
+   begin
+      Eti_Exception (Set_Form_Term (Frm, Proc));
+   end Set_Form_Term_Hook;
+   --  |
+   --  |=====================================================================
+   --  | man page form_fields.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Redefine (Frm  : Form;
+                       Flds : Field_Array_Access)
+   is
+      function Set_Frm_Fields (Frm   : Form;
+                               Items : System.Address) return Eti_Error;
+      pragma Import (C, Set_Frm_Fields, "set_form_fields");
+
+   begin
+      pragma Assert (Flds.all (Flds'Last) = Null_Field);
+      if Flds.all (Flds'Last) /= Null_Field then
+         raise Form_Exception;
+      else
+         Eti_Exception (Set_Frm_Fields (Frm, Flds.all (Flds'First)'Address));
+      end if;
+   end Redefine;
+   --  |
+   --  |
+   --  |
+   function Fields (Frm   : Form;
+                    Index : Positive) return Field
+   is
+      use F_Array;
+
+      function C_Fields (Frm : Form) return Pointer;
+      pragma Import (C, C_Fields, "form_fields");
+
+      P : Pointer := C_Fields (Frm);
+   begin
+      if P = null or else Index > Field_Count (Frm) then
+         raise Form_Exception;
+      else
+         P := P + ptrdiff_t (C_Int (Index) - 1);
+         return P.all;
+      end if;
+   end Fields;
+   --  |
+   --  |
+   --  |
+   function Field_Count (Frm : Form) return Natural
+   is
+      function Count (Frm : Form) return C_Int;
+      pragma Import (C, Count, "field_count");
+   begin
+      return Natural (Count (Frm));
+   end Field_Count;
+   --  |
+   --  |
+   --  |
+   procedure Move (Fld    : Field;
+                   Line   : Line_Position;
+                   Column : Column_Position)
+   is
+      function Move (Fld : Field; L, C : C_Int) return Eti_Error;
+      pragma Import (C, Move, "move_field");
+
+   begin
+      Eti_Exception (Move (Fld, C_Int (Line), C_Int (Column)));
+   end Move;
+   --  |
+   --  |=====================================================================
+   --  | man page form_new.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Create (Fields : Field_Array_Access) return Form
+   is
+      function NewForm (Fields : System.Address) return Form;
+      pragma Import (C, NewForm, "new_form");
+
+      M   : Form;
+   begin
+      pragma Assert (Fields.all (Fields'Last) = Null_Field);
+      if Fields.all (Fields'Last) /= Null_Field then
+         raise Form_Exception;
+      else
+         M := NewForm (Fields.all (Fields'First)'Address);
+         if M = Null_Form then
+            raise Form_Exception;
+         end if;
+         return M;
+      end if;
+   end Create;
+   --  |
+   --  |
+   --  |
+   procedure Delete (Frm : in out Form)
+   is
+      function Free (Frm : Form) return Eti_Error;
+      pragma Import (C, Free, "free_form");
+
+   begin
+      Eti_Exception (Free (Frm));
+      Frm := Null_Form;
+   end Delete;
+   --  |
+   --  |=====================================================================
+   --  | man page form_opts.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Options (Frm     : Form;
+                          Options : Form_Option_Set)
+   is
+      function Set_Form_Opts (Frm : Form;
+                              Opt : Form_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Form_Opts, "set_form_opts");
+
+   begin
+      Eti_Exception (Set_Form_Opts (Frm, Options));
+   end Set_Options;
+   --  |
+   --  |
+   --  |
+   procedure Switch_Options (Frm     : Form;
+                             Options : Form_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Form_Opts_On (Frm : Form;
+                             Opt : Form_Option_Set) return Eti_Error;
+      pragma Import (C, Form_Opts_On, "form_opts_on");
+      function Form_Opts_Off (Frm : Form;
+                              Opt : Form_Option_Set) return Eti_Error;
+      pragma Import (C, Form_Opts_Off, "form_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Form_Opts_On (Frm, Options));
+      else
+         Eti_Exception (Form_Opts_Off (Frm, Options));
+      end if;
+   end Switch_Options;
+   --  |
+   --  |
+   --  |
+   procedure Get_Options (Frm     : Form;
+                          Options : out Form_Option_Set)
+   is
+      function Form_Opts (Frm : Form) return Form_Option_Set;
+      pragma Import (C, Form_Opts, "form_opts");
+
+   begin
+      Options := Form_Opts (Frm);
+   end Get_Options;
+   --  |
+   --  |
+   --  |
+   function Get_Options (Frm : Form := Null_Form) return Form_Option_Set
+   is
+      Fos : Form_Option_Set;
+   begin
+      Get_Options (Frm, Fos);
+      return Fos;
+   end Get_Options;
+   --  |
+   --  |=====================================================================
+   --  | man page form_post.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Post (Frm  : Form;
+                   Post : Boolean := True)
+   is
+      function M_Post (Frm : Form) return Eti_Error;
+      pragma Import (C, M_Post, "post_form");
+      function M_Unpost (Frm : Form) return Eti_Error;
+      pragma Import (C, M_Unpost, "unpost_form");
+
+   begin
+      if Post then
+         Eti_Exception (M_Post (Frm));
+      else
+         Eti_Exception (M_Unpost (Frm));
+      end if;
+   end Post;
+   --  |
+   --  |=====================================================================
+   --  | man page form_cursor.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Position_Cursor (Frm : Form)
+   is
+      function Pos_Form_Cursor (Frm : Form) return Eti_Error;
+      pragma Import (C, Pos_Form_Cursor, "pos_form_cursor");
+
+   begin
+      Eti_Exception (Pos_Form_Cursor (Frm));
+   end Position_Cursor;
+   --  |
+   --  |=====================================================================
+   --  | man page form_data.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Data_Ahead (Frm : Form) return Boolean
+   is
+      function Ahead (Frm : Form) return C_Int;
+      pragma Import (C, Ahead, "data_ahead");
+
+      Res : constant C_Int := Ahead (Frm);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Data_Ahead;
+   --  |
+   --  |
+   --  |
+   function Data_Behind (Frm : Form) return Boolean
+   is
+      function Behind (Frm : Form) return C_Int;
+      pragma Import (C, Behind, "data_behind");
+
+      Res : constant C_Int := Behind (Frm);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Data_Behind;
+   --  |
+   --  |=====================================================================
+   --  | man page form_driver.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   function Driver (Frm : Form;
+                    Key : Key_Code) return Driver_Result
+   is
+      function Frm_Driver (Frm : Form; Key : C_Int) return Eti_Error;
+      pragma Import (C, Frm_Driver, "form_driver");
+
+      R : constant Eti_Error := Frm_Driver (Frm, C_Int (Key));
+   begin
+      case R is
+         when E_Unknown_Command =>
+            return Unknown_Request;
+         when E_Invalid_Field =>
+            return Invalid_Field;
+         when E_Request_Denied =>
+            return Request_Denied;
+         when others =>
+            Eti_Exception (R);
+            return Form_Ok;
+      end case;
+   end Driver;
+   --  |
+   --  |=====================================================================
+   --  | man page form_page.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_Current (Frm : Form;
+                          Fld : Field)
+   is
+      function Set_Current_Fld (Frm : Form; Fld : Field) return Eti_Error;
+      pragma Import (C, Set_Current_Fld, "set_current_field");
+
+   begin
+      Eti_Exception (Set_Current_Fld (Frm, Fld));
+   end Set_Current;
+   --  |
+   --  |
+   --  |
+   function Current (Frm : Form) return Field
+   is
+      function Current_Fld (Frm : Form) return Field;
+      pragma Import (C, Current_Fld, "current_field");
+
+      Fld : constant Field := Current_Fld (Frm);
+   begin
+      if Fld = Null_Field then
+         raise Form_Exception;
+      end if;
+      return Fld;
+   end Current;
+   --  |
+   --  |
+   --  |
+   procedure Set_Page (Frm  : Form;
+                       Page : Page_Number := Page_Number'First)
+   is
+      function Set_Frm_Page (Frm : Form; Pg : C_Int) return Eti_Error;
+      pragma Import (C, Set_Frm_Page, "set_form_page");
+
+   begin
+      Eti_Exception (Set_Frm_Page (Frm, C_Int (Page)));
+   end Set_Page;
+   --  |
+   --  |
+   --  |
+   function Page (Frm : Form) return Page_Number
+   is
+      function Get_Page (Frm : Form) return C_Int;
+      pragma Import (C, Get_Page, "form_page");
+
+      P : constant C_Int := Get_Page (Frm);
+   begin
+      if P < 0 then
+         raise Form_Exception;
+      else
+         return Page_Number (P);
+      end if;
+   end Page;
+
+   function Get_Index (Fld : Field) return Positive
+   is
+      function Get_Fieldindex (Fld : Field) return C_Int;
+      pragma Import (C, Get_Fieldindex, "field_index");
+
+      Res : constant C_Int := Get_Fieldindex (Fld);
+   begin
+      if Res = Curses_Err then
+         raise Form_Exception;
+      end if;
+      return Positive (Natural (Res) + Positive'First);
+   end Get_Index;
+
+   --  |
+   --  |=====================================================================
+   --  | man page form_new_page.3x
+   --  |=====================================================================
+   --  |
+   --  |
+   --  |
+   procedure Set_New_Page (Fld      : Field;
+                           New_Page : Boolean := True)
+   is
+      function Set_Page (Fld : Field; Flg : C_Int) return Eti_Error;
+      pragma Import (C, Set_Page, "set_new_page");
+
+   begin
+      Eti_Exception (Set_Page (Fld, Boolean'Pos (New_Page)));
+   end Set_New_Page;
+   --  |
+   --  |
+   --  |
+   function Is_New_Page (Fld : Field) return Boolean
+   is
+      function Is_New (Fld : Field) return C_Int;
+      pragma Import (C, Is_New, "new_page");
+
+      Res : constant C_Int := Is_New (Fld);
+   begin
+      if Res = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_New_Page;
+
+   procedure Free (FA          : in out Field_Array_Access;
+                   Free_Fields : Boolean := False)
+   is
+      procedure Release is new Ada.Unchecked_Deallocation
+        (Field_Array, Field_Array_Access);
+   begin
+      if FA /= null and then Free_Fields then
+         for I in FA'First .. (FA'Last - 1) loop
+            if FA.all (I) /= Null_Field then
+               Delete (FA.all (I));
+            end if;
+         end loop;
+      end if;
+      Release (FA);
+   end Free;
+
+   --  |=====================================================================
+
+   function Default_Field_Options return Field_Option_Set
+   is
+   begin
+      return Get_Options (Null_Field);
+   end Default_Field_Options;
+
+   function Default_Form_Options return Form_Option_Set
+   is
+   begin
+      return Get_Options (Null_Form);
+   end Default_Form_Options;
+
+end Terminal_Interface.Curses.Forms;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__ads.htm new file mode 100644 index 00000000..22a91e47 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-forms__ads.htm @@ -0,0 +1,800 @@ + + + +terminal_interface-curses-forms.ads + + + + +

File : terminal_interface-curses-forms.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Form                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.34 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+with Ada.Characters.Latin_1;
+
+package Terminal_Interface.Curses.Forms is
+   pragma Preelaborate (Terminal_Interface.Curses.Forms);
+   pragma Linker_Options ("-lform" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   Space : Character renames Ada.Characters.Latin_1.Space;
+
+   type Field        is private;
+   type Form         is private;
+
+   Null_Field        : constant Field;
+   Null_Form         : constant Form;
+
+   type Field_Justification is (None,
+                                Left,
+                                Center,
+                                Right);
+
+   type Field_Option_Set is
+      record
+         Visible   : Boolean;
+         Active    : Boolean;
+         Public    : Boolean;
+         Edit      : Boolean;
+         Wrap      : Boolean;
+         Blank     : Boolean;
+         Auto_Skip : Boolean;
+         Null_Ok   : Boolean;
+         Pass_Ok   : Boolean;
+         Static    : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Field_Option_Set);
+
+   for Field_Option_Set use
+      record
+         Visible   at 0 range Curses_Constants.O_VISIBLE_First
+           .. Curses_Constants.O_VISIBLE_Last;
+         Active    at 0 range Curses_Constants.O_ACTIVE_First
+           .. Curses_Constants.O_ACTIVE_Last;
+         Public    at 0 range Curses_Constants.O_PUBLIC_First
+           .. Curses_Constants.O_PUBLIC_Last;
+         Edit      at 0 range Curses_Constants.O_EDIT_First
+           .. Curses_Constants.O_EDIT_Last;
+         Wrap      at 0 range Curses_Constants.O_WRAP_First
+           .. Curses_Constants.O_WRAP_Last;
+         Blank     at 0 range Curses_Constants.O_BLANK_First
+           .. Curses_Constants.O_BLANK_Last;
+         Auto_Skip at 0 range Curses_Constants.O_AUTOSKIP_First
+           .. Curses_Constants.O_AUTOSKIP_Last;
+         Null_Ok   at 0 range Curses_Constants.O_NULLOK_First
+           .. Curses_Constants.O_NULLOK_Last;
+         Pass_Ok   at 0 range Curses_Constants.O_PASSOK_First
+           .. Curses_Constants.O_PASSOK_Last;
+         Static    at 0 range Curses_Constants.O_STATIC_First
+           .. Curses_Constants.O_STATIC_Last;
+      end record;
+   pragma Warnings (Off);
+   for Field_Option_Set'Size use Curses_Constants.Field_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Field_Options return Field_Option_Set;
+   --  The initial defaults for the field options.
+   pragma Inline (Default_Field_Options);
+
+   type Form_Option_Set is
+      record
+         NL_Overload : Boolean;
+         BS_Overload : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Form_Option_Set);
+
+   for Form_Option_Set use
+      record
+         NL_Overload at 0 range Curses_Constants.O_NL_OVERLOAD_First
+           .. Curses_Constants.O_NL_OVERLOAD_Last;
+         BS_Overload at 0 range Curses_Constants.O_BS_OVERLOAD_First
+           .. Curses_Constants.O_BS_OVERLOAD_Last;
+      end record;
+   pragma Warnings (Off);
+   for Form_Option_Set'Size use Curses_Constants.Field_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Form_Options return Form_Option_Set;
+   --  The initial defaults for the form options.
+   pragma Inline (Default_Form_Options);
+
+   type Buffer_Number is new Natural;
+
+   type Field_Array is array (Positive range <>) of aliased Field;
+   pragma Convention (C, Field_Array);
+
+   type Field_Array_Access is access Field_Array;
+
+   procedure Free (FA          : in out Field_Array_Access;
+                   Free_Fields : Boolean := False);
+   --  Release the memory for an allocated field array
+   --  If Free_Fields is True, call Delete() for all the fields in
+   --  the array.
+
+   subtype Form_Request_Code is Key_Code range (Key_Max + 1) .. (Key_Max + 57);
+
+   --  The prefix F_ stands for "Form Request"
+   F_Next_Page                : constant Form_Request_Code := Key_Max + 1;
+   F_Previous_Page            : constant Form_Request_Code := Key_Max + 2;
+   F_First_Page               : constant Form_Request_Code := Key_Max + 3;
+   F_Last_Page                : constant Form_Request_Code := Key_Max + 4;
+
+   F_Next_Field               : constant Form_Request_Code := Key_Max + 5;
+   F_Previous_Field           : constant Form_Request_Code := Key_Max + 6;
+   F_First_Field              : constant Form_Request_Code := Key_Max + 7;
+   F_Last_Field               : constant Form_Request_Code := Key_Max + 8;
+   F_Sorted_Next_Field        : constant Form_Request_Code := Key_Max + 9;
+   F_Sorted_Previous_Field    : constant Form_Request_Code := Key_Max + 10;
+   F_Sorted_First_Field       : constant Form_Request_Code := Key_Max + 11;
+   F_Sorted_Last_Field        : constant Form_Request_Code := Key_Max + 12;
+   F_Left_Field               : constant Form_Request_Code := Key_Max + 13;
+   F_Right_Field              : constant Form_Request_Code := Key_Max + 14;
+   F_Up_Field                 : constant Form_Request_Code := Key_Max + 15;
+   F_Down_Field               : constant Form_Request_Code := Key_Max + 16;
+
+   F_Next_Char                : constant Form_Request_Code := Key_Max + 17;
+   F_Previous_Char            : constant Form_Request_Code := Key_Max + 18;
+   F_Next_Line                : constant Form_Request_Code := Key_Max + 19;
+   F_Previous_Line            : constant Form_Request_Code := Key_Max + 20;
+   F_Next_Word                : constant Form_Request_Code := Key_Max + 21;
+   F_Previous_Word            : constant Form_Request_Code := Key_Max + 22;
+   F_Begin_Field              : constant Form_Request_Code := Key_Max + 23;
+   F_End_Field                : constant Form_Request_Code := Key_Max + 24;
+   F_Begin_Line               : constant Form_Request_Code := Key_Max + 25;
+   F_End_Line                 : constant Form_Request_Code := Key_Max + 26;
+   F_Left_Char                : constant Form_Request_Code := Key_Max + 27;
+   F_Right_Char               : constant Form_Request_Code := Key_Max + 28;
+   F_Up_Char                  : constant Form_Request_Code := Key_Max + 29;
+   F_Down_Char                : constant Form_Request_Code := Key_Max + 30;
+
+   F_New_Line                 : constant Form_Request_Code := Key_Max + 31;
+   F_Insert_Char              : constant Form_Request_Code := Key_Max + 32;
+   F_Insert_Line              : constant Form_Request_Code := Key_Max + 33;
+   F_Delete_Char              : constant Form_Request_Code := Key_Max + 34;
+   F_Delete_Previous          : constant Form_Request_Code := Key_Max + 35;
+   F_Delete_Line              : constant Form_Request_Code := Key_Max + 36;
+   F_Delete_Word              : constant Form_Request_Code := Key_Max + 37;
+   F_Clear_EOL                : constant Form_Request_Code := Key_Max + 38;
+   F_Clear_EOF                : constant Form_Request_Code := Key_Max + 39;
+   F_Clear_Field              : constant Form_Request_Code := Key_Max + 40;
+   F_Overlay_Mode             : constant Form_Request_Code := Key_Max + 41;
+   F_Insert_Mode              : constant Form_Request_Code := Key_Max + 42;
+
+   --  Vertical Scrolling
+   F_ScrollForward_Line       : constant Form_Request_Code := Key_Max + 43;
+   F_ScrollBackward_Line      : constant Form_Request_Code := Key_Max + 44;
+   F_ScrollForward_Page       : constant Form_Request_Code := Key_Max + 45;
+   F_ScrollBackward_Page      : constant Form_Request_Code := Key_Max + 46;
+   F_ScrollForward_HalfPage   : constant Form_Request_Code := Key_Max + 47;
+   F_ScrollBackward_HalfPage  : constant Form_Request_Code := Key_Max + 48;
+
+   --  Horizontal Scrolling
+   F_HScrollForward_Char      : constant Form_Request_Code := Key_Max + 49;
+   F_HScrollBackward_Char     : constant Form_Request_Code := Key_Max + 50;
+   F_HScrollForward_Line      : constant Form_Request_Code := Key_Max + 51;
+   F_HScrollBackward_Line     : constant Form_Request_Code := Key_Max + 52;
+   F_HScrollForward_HalfLine  : constant Form_Request_Code := Key_Max + 53;
+   F_HScrollBackward_HalfLine : constant Form_Request_Code := Key_Max + 54;
+
+   F_Validate_Field           : constant Form_Request_Code := Key_Max + 55;
+   F_Next_Choice              : constant Form_Request_Code := Key_Max + 56;
+   F_Previous_Choice          : constant Form_Request_Code := Key_Max + 57;
+
+   --  For those who like the old 'C' style request names
+   REQ_NEXT_PAGE    : Form_Request_Code renames F_Next_Page;
+   REQ_PREV_PAGE    : Form_Request_Code renames F_Previous_Page;
+   REQ_FIRST_PAGE   : Form_Request_Code renames F_First_Page;
+   REQ_LAST_PAGE    : Form_Request_Code renames F_Last_Page;
+
+   REQ_NEXT_FIELD   : Form_Request_Code renames F_Next_Field;
+   REQ_PREV_FIELD   : Form_Request_Code renames F_Previous_Field;
+   REQ_FIRST_FIELD  : Form_Request_Code renames F_First_Field;
+   REQ_LAST_FIELD   : Form_Request_Code renames F_Last_Field;
+   REQ_SNEXT_FIELD  : Form_Request_Code renames F_Sorted_Next_Field;
+   REQ_SPREV_FIELD  : Form_Request_Code renames F_Sorted_Previous_Field;
+   REQ_SFIRST_FIELD : Form_Request_Code renames F_Sorted_First_Field;
+   REQ_SLAST_FIELD  : Form_Request_Code renames F_Sorted_Last_Field;
+   REQ_LEFT_FIELD   : Form_Request_Code renames F_Left_Field;
+   REQ_RIGHT_FIELD  : Form_Request_Code renames F_Right_Field;
+   REQ_UP_FIELD     : Form_Request_Code renames F_Up_Field;
+   REQ_DOWN_FIELD   : Form_Request_Code renames F_Down_Field;
+
+   REQ_NEXT_CHAR    : Form_Request_Code renames F_Next_Char;
+   REQ_PREV_CHAR    : Form_Request_Code renames F_Previous_Char;
+   REQ_NEXT_LINE    : Form_Request_Code renames F_Next_Line;
+   REQ_PREV_LINE    : Form_Request_Code renames F_Previous_Line;
+   REQ_NEXT_WORD    : Form_Request_Code renames F_Next_Word;
+   REQ_PREV_WORD    : Form_Request_Code renames F_Previous_Word;
+   REQ_BEG_FIELD    : Form_Request_Code renames F_Begin_Field;
+   REQ_END_FIELD    : Form_Request_Code renames F_End_Field;
+   REQ_BEG_LINE     : Form_Request_Code renames F_Begin_Line;
+   REQ_END_LINE     : Form_Request_Code renames F_End_Line;
+   REQ_LEFT_CHAR    : Form_Request_Code renames F_Left_Char;
+   REQ_RIGHT_CHAR   : Form_Request_Code renames F_Right_Char;
+   REQ_UP_CHAR      : Form_Request_Code renames F_Up_Char;
+   REQ_DOWN_CHAR    : Form_Request_Code renames F_Down_Char;
+
+   REQ_NEW_LINE     : Form_Request_Code renames F_New_Line;
+   REQ_INS_CHAR     : Form_Request_Code renames F_Insert_Char;
+   REQ_INS_LINE     : Form_Request_Code renames F_Insert_Line;
+   REQ_DEL_CHAR     : Form_Request_Code renames F_Delete_Char;
+   REQ_DEL_PREV     : Form_Request_Code renames F_Delete_Previous;
+   REQ_DEL_LINE     : Form_Request_Code renames F_Delete_Line;
+   REQ_DEL_WORD     : Form_Request_Code renames F_Delete_Word;
+   REQ_CLR_EOL      : Form_Request_Code renames F_Clear_EOL;
+   REQ_CLR_EOF      : Form_Request_Code renames F_Clear_EOF;
+   REQ_CLR_FIELD    : Form_Request_Code renames F_Clear_Field;
+   REQ_OVL_MODE     : Form_Request_Code renames F_Overlay_Mode;
+   REQ_INS_MODE     : Form_Request_Code renames F_Insert_Mode;
+
+   REQ_SCR_FLINE    : Form_Request_Code renames F_ScrollForward_Line;
+   REQ_SCR_BLINE    : Form_Request_Code renames F_ScrollBackward_Line;
+   REQ_SCR_FPAGE    : Form_Request_Code renames F_ScrollForward_Page;
+   REQ_SCR_BPAGE    : Form_Request_Code renames F_ScrollBackward_Page;
+   REQ_SCR_FHPAGE   : Form_Request_Code renames F_ScrollForward_HalfPage;
+   REQ_SCR_BHPAGE   : Form_Request_Code renames F_ScrollBackward_HalfPage;
+
+   REQ_SCR_FCHAR    : Form_Request_Code renames F_HScrollForward_Char;
+   REQ_SCR_BCHAR    : Form_Request_Code renames F_HScrollBackward_Char;
+   REQ_SCR_HFLINE   : Form_Request_Code renames F_HScrollForward_Line;
+   REQ_SCR_HBLINE   : Form_Request_Code renames F_HScrollBackward_Line;
+   REQ_SCR_HFHALF   : Form_Request_Code renames F_HScrollForward_HalfLine;
+   REQ_SCR_HBHALF   : Form_Request_Code renames F_HScrollBackward_HalfLine;
+
+   REQ_VALIDATION   : Form_Request_Code renames F_Validate_Field;
+   REQ_NEXT_CHOICE  : Form_Request_Code renames F_Next_Choice;
+   REQ_PREV_CHOICE  : Form_Request_Code renames F_Previous_Choice;
+
+   procedure Request_Name (Key  : Form_Request_Code;
+                           Name : out String);
+
+   function  Request_Name (Key : Form_Request_Code) return String;
+   --  Same as function
+   pragma Inline (Request_Name);
+
+   ------------------
+   --  Exceptions  --
+   ------------------
+   Form_Exception : exception;
+
+   --  |=====================================================================
+   --  | Man page form_field_new.3x
+   --  |=====================================================================
+
+   --  |
+   function Create (Height       : Line_Count;
+                    Width        : Column_Count;
+                    Top          : Line_Position;
+                    Left         : Column_Position;
+                    Off_Screen   : Natural := 0;
+                    More_Buffers : Buffer_Number := Buffer_Number'First)
+                    return Field;
+   --  AKA: new_field()
+   --  An overloaded Create is defined later. Pragma Inline appears there.
+
+   --  |
+   function New_Field (Height       : Line_Count;
+                       Width        : Column_Count;
+                       Top          : Line_Position;
+                       Left         : Column_Position;
+                       Off_Screen   : Natural := 0;
+                       More_Buffers : Buffer_Number := Buffer_Number'First)
+                       return Field renames Create;
+   --  AKA: new_field()
+   pragma Inline (New_Field);
+
+   --  |
+   procedure Delete (Fld : in out Field);
+   --  AKA: free_field()
+   --  Reset Fld to Null_Field
+   --  An overloaded Delete is defined later. Pragma Inline appears there.
+
+   --  |
+   function Duplicate (Fld  : Field;
+                       Top  : Line_Position;
+                       Left : Column_Position) return Field;
+   --  AKA: dup_field()
+   pragma Inline (Duplicate);
+
+   --  |
+   function Link (Fld  : Field;
+                  Top  : Line_Position;
+                  Left : Column_Position) return Field;
+   --  AKA: link_field()
+   pragma Inline (Link);
+
+   --  |=====================================================================
+   --  | Man page form_field_just.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Justification (Fld  : Field;
+                                Just : Field_Justification := None);
+   --  AKA: set_field_just()
+   pragma Inline (Set_Justification);
+
+   --  |
+   function Get_Justification (Fld : Field) return Field_Justification;
+   --  AKA: field_just()
+   pragma Inline (Get_Justification);
+
+   --  |=====================================================================
+   --  | Man page form_field_buffer.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : String);
+   --  AKA: set_field_buffer()
+   --  Not inlined
+
+   --  |
+   procedure Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First;
+      Str    : out String);
+   --  AKA: field_buffer()
+
+   function Get_Buffer
+     (Fld    : Field;
+      Buffer : Buffer_Number := Buffer_Number'First) return String;
+   --  AKA: field_buffer()
+   --  Same but as function
+   pragma Inline (Get_Buffer);
+
+   --  |
+   procedure Set_Status (Fld    : Field;
+                         Status : Boolean := True);
+   --  AKA: set_field_status()
+   pragma Inline (Set_Status);
+
+   --  |
+   function Changed (Fld : Field) return Boolean;
+   --  AKA: field_status()
+   pragma Inline (Changed);
+
+   --  |
+   procedure Set_Maximum_Size (Fld : Field;
+                               Max : Natural := 0);
+   --  AKA: set_field_max()
+   pragma Inline (Set_Maximum_Size);
+
+   --  |=====================================================================
+   --  | Man page form_field_opts.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Options (Fld     : Field;
+                          Options : Field_Option_Set);
+   --  AKA: set_field_opts()
+   --  An overloaded version is defined later. Pragma Inline appears there
+
+   --  |
+   procedure Switch_Options (Fld     : Field;
+                             Options : Field_Option_Set;
+                             On      : Boolean := True);
+   --  AKA: field_opts_on()
+   --  AKA: field_opts_off()
+   --  An overloaded version is defined later. Pragma Inline appears there
+
+   --  |
+   procedure Get_Options (Fld     : Field;
+                          Options : out Field_Option_Set);
+   --  AKA: field_opts()
+
+   --  |
+   function Get_Options (Fld : Field := Null_Field)
+                         return Field_Option_Set;
+   --  AKA: field_opts()
+   --  An overloaded version is defined later. Pragma Inline appears there
+
+   --  |=====================================================================
+   --  | Man page form_field_attributes.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Foreground
+     (Fld   : Field;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: set_field_fore()
+   pragma Inline (Set_Foreground);
+
+   --  |
+   procedure Foreground (Fld  : Field;
+                         Fore : out Character_Attribute_Set);
+   --  AKA: field_fore()
+
+   --  |
+   procedure Foreground (Fld   : Field;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA: field_fore()
+   pragma Inline (Foreground);
+
+   --  |
+   procedure Set_Background
+     (Fld   : Field;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: set_field_back()
+   pragma Inline (Set_Background);
+
+   --  |
+   procedure Background (Fld  : Field;
+                         Back : out Character_Attribute_Set);
+   --  AKA: field_back()
+
+   --  |
+   procedure Background (Fld   : Field;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA: field_back()
+   pragma Inline (Background);
+
+   --  |
+   procedure Set_Pad_Character (Fld : Field;
+                                Pad : Character := Space);
+   --  AKA: set_field_pad()
+   pragma Inline (Set_Pad_Character);
+
+   --  |
+   procedure Pad_Character (Fld : Field;
+                            Pad : out Character);
+   --  AKA: field_pad()
+   pragma Inline (Pad_Character);
+
+   --  |=====================================================================
+   --  | Man page form_field_info.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Info (Fld                : Field;
+                   Lines              : out Line_Count;
+                   Columns            : out Column_Count;
+                   First_Row          : out Line_Position;
+                   First_Column       : out Column_Position;
+                   Off_Screen         : out Natural;
+                   Additional_Buffers : out Buffer_Number);
+   --  AKA: field_info()
+   pragma Inline (Info);
+
+   --  |
+   procedure Dynamic_Info (Fld     : Field;
+                           Lines   : out Line_Count;
+                           Columns : out Column_Count;
+                           Max     : out Natural);
+   --  AKA: dynamic_field_info()
+   pragma Inline (Dynamic_Info);
+
+   --  |=====================================================================
+   --  | Man page form_win.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Window (Frm : Form;
+                         Win : Window);
+   --  AKA: set_form_win()
+   pragma Inline (Set_Window);
+
+   --  |
+   function Get_Window (Frm : Form) return Window;
+   --  AKA: form_win()
+   pragma Inline (Get_Window);
+
+   --  |
+   procedure Set_Sub_Window (Frm : Form;
+                             Win : Window);
+   --  AKA: set_form_sub()
+   pragma Inline (Set_Sub_Window);
+
+   --  |
+   function Get_Sub_Window (Frm : Form) return Window;
+   --  AKA: form_sub()
+   pragma Inline (Get_Sub_Window);
+
+   --  |
+   procedure Scale (Frm     : Form;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count);
+   --  AKA: scale_form()
+   pragma Inline (Scale);
+
+   --  |=====================================================================
+   --  | Man page form_hook.3x
+   --  |=====================================================================
+
+   type Form_Hook_Function is access procedure (Frm : Form);
+   pragma Convention (C, Form_Hook_Function);
+
+   --  |
+   procedure Set_Field_Init_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function);
+   --  AKA: set_field_init()
+   pragma Inline (Set_Field_Init_Hook);
+
+   --  |
+   procedure Set_Field_Term_Hook (Frm  : Form;
+                                  Proc : Form_Hook_Function);
+   --  AKA: set_field_term()
+   pragma Inline (Set_Field_Term_Hook);
+
+   --  |
+   procedure Set_Form_Init_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function);
+   --  AKA: set_form_init()
+   pragma Inline (Set_Form_Init_Hook);
+
+   --  |
+   procedure Set_Form_Term_Hook (Frm  : Form;
+                                 Proc : Form_Hook_Function);
+   --  AKA: set_form_term()
+   pragma Inline (Set_Form_Term_Hook);
+
+   --  |
+   function Get_Field_Init_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA: field_init()
+   pragma Import (C, Get_Field_Init_Hook, "field_init");
+
+   --  |
+   function Get_Field_Term_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA: field_term()
+   pragma Import (C, Get_Field_Term_Hook, "field_term");
+
+   --  |
+   function Get_Form_Init_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA: form_init()
+   pragma Import (C, Get_Form_Init_Hook, "form_init");
+
+   --  |
+   function Get_Form_Term_Hook (Frm : Form) return Form_Hook_Function;
+   --  AKA: form_term()
+   pragma Import (C, Get_Form_Term_Hook, "form_term");
+
+   --  |=====================================================================
+   --  | Man page form_field.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Redefine (Frm  : Form;
+                       Flds : Field_Array_Access);
+   --  AKA: set_form_fields()
+   pragma Inline (Redefine);
+
+   --  |
+   procedure Set_Fields (Frm  : Form;
+                         Flds : Field_Array_Access) renames Redefine;
+   --  AKA: set_form_fields()
+   --  pragma Inline (Set_Fields);
+
+   --  |
+   function Fields (Frm   : Form;
+                    Index : Positive) return Field;
+   --  AKA: form_fields()
+   pragma Inline (Fields);
+
+   --  |
+   function Field_Count (Frm : Form) return Natural;
+   --  AKA: field_count()
+   pragma Inline (Field_Count);
+
+   --  |
+   procedure Move (Fld    : Field;
+                   Line   : Line_Position;
+                   Column : Column_Position);
+   --  AKA: move_field()
+   pragma Inline (Move);
+
+   --  |=====================================================================
+   --  | Man page form_new.3x
+   --  |=====================================================================
+
+   --  |
+   function Create (Fields : Field_Array_Access) return Form;
+   --  AKA: new_form()
+   pragma Inline (Create);
+
+   --  |
+   function New_Form (Fields : Field_Array_Access) return Form
+     renames Create;
+   --  AKA: new_form()
+   --  pragma Inline (New_Form);
+
+   --  |
+   procedure Delete (Frm : in out Form);
+   --  AKA: free_form()
+   --  Reset Frm to Null_Form
+   pragma Inline (Delete);
+
+   --  |=====================================================================
+   --  | Man page form_opts.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Options (Frm     : Form;
+                          Options : Form_Option_Set);
+   --  AKA: set_form_opts()
+   pragma Inline (Set_Options);
+
+   --  |
+   procedure Switch_Options (Frm     : Form;
+                             Options : Form_Option_Set;
+                             On      : Boolean := True);
+   --  AKA: form_opts_on()
+   --  AKA: form_opts_off()
+   pragma Inline (Switch_Options);
+
+   --  |
+   procedure Get_Options (Frm     : Form;
+                          Options : out Form_Option_Set);
+   --  AKA: form_opts()
+
+   --  |
+   function Get_Options (Frm : Form := Null_Form) return Form_Option_Set;
+   --  AKA: form_opts()
+   pragma Inline (Get_Options);
+
+   --  |=====================================================================
+   --  | Man page form_post.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Post (Frm  : Form;
+                   Post : Boolean := True);
+   --  AKA: post_form()
+   --  AKA: unpost_form()
+   pragma Inline (Post);
+
+   --  |=====================================================================
+   --  | Man page form_cursor.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Position_Cursor (Frm : Form);
+   --  AKA: pos_form_cursor()
+   pragma Inline (Position_Cursor);
+
+   --  |=====================================================================
+   --  | Man page form_data.3x
+   --  |=====================================================================
+
+   --  |
+   function Data_Ahead (Frm : Form) return Boolean;
+   --  AKA: data_ahead()
+   pragma Inline (Data_Ahead);
+
+   --  |
+   function Data_Behind (Frm : Form) return Boolean;
+   --  AKA: data_behind()
+   pragma Inline (Data_Behind);
+
+   --  |=====================================================================
+   --  | Man page form_driver.3x
+   --  |=====================================================================
+
+   type Driver_Result is (Form_Ok,
+                          Request_Denied,
+                          Unknown_Request,
+                          Invalid_Field);
+
+   --  |
+   function Driver (Frm : Form;
+                    Key : Key_Code) return Driver_Result;
+   --  AKA: form_driver()
+   --  Driver not inlined
+
+   --  |=====================================================================
+   --  | Man page form_page.3x
+   --  |=====================================================================
+
+   type Page_Number is new Natural;
+
+   --  |
+   procedure Set_Current (Frm : Form;
+                          Fld : Field);
+   --  AKA: set_current_field()
+   pragma Inline (Set_Current);
+
+   --  |
+   function Current (Frm : Form) return Field;
+   --  AKA: current_field()
+   pragma Inline (Current);
+
+   --  |
+   procedure Set_Page (Frm  : Form;
+                       Page : Page_Number := Page_Number'First);
+   --  AKA: set_form_page()
+   pragma Inline (Set_Page);
+
+   --  |
+   function Page (Frm : Form) return Page_Number;
+   --  AKA: form_page()
+   pragma Inline (Page);
+
+   --  |
+   function Get_Index (Fld : Field) return Positive;
+   --  AKA: field_index()
+   --  Please note that in this binding we start the numbering of fields
+   --  with 1. So this is number is one more than you get from the low
+   --  level call.
+   pragma Inline (Get_Index);
+
+   --  |=====================================================================
+   --  | Man page form_new_page.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_New_Page (Fld      : Field;
+                           New_Page : Boolean := True);
+   --  AKA: set_new_page()
+   pragma Inline (Set_New_Page);
+
+   --  |
+   function Is_New_Page (Fld : Field) return Boolean;
+   --  AKA: new_page()
+   pragma Inline (Is_New_Page);
+
+   --  |=====================================================================
+   --  | Man page form_requestname.3x
+   --  |=====================================================================
+   --  Not Implemented: form_request_name, form_request_by_name
+
+------------------------------------------------------------------------------
+private
+   type Field is new System.Storage_Elements.Integer_Address;
+   type Form  is new System.Storage_Elements.Integer_Address;
+
+   Null_Field : constant Field := 0;
+   Null_Form  : constant Form  := 0;
+
+end Terminal_Interface.Curses.Forms;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm new file mode 100644 index 00000000..558bbf6a --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm @@ -0,0 +1,90 @@ + + + +terminal_interface-curses-menus-item_user_data.adb + + + + +

File : terminal_interface-curses-menus-item_user_data.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Item_User_Data             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.16 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Menus.Item_User_Data is
+
+   procedure Set_User_Data (Itm  : Item;
+                            Data : User_Access)
+   is
+      function Set_Item_Userptr (Itm  : Item;
+                                 Addr : User_Access)  return Eti_Error;
+      pragma Import (C, Set_Item_Userptr, "set_item_userptr");
+
+   begin
+      Eti_Exception (Set_Item_Userptr (Itm, Data));
+   end Set_User_Data;
+
+   function Get_User_Data (Itm  : Item) return User_Access
+   is
+      function Item_Userptr (Itm : Item) return User_Access;
+      pragma Import (C, Item_Userptr, "item_userptr");
+   begin
+      return Item_Userptr (Itm);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Itm  : Item;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Itm);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Menus.Item_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm new file mode 100644 index 00000000..44911be9 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm @@ -0,0 +1,93 @@ + + + +terminal_interface-curses-menus-item_user_data.ads + + + + +

File : terminal_interface-curses-menus-item_user_data.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Item_User_Data             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2006,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.18 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Menus.Item_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Menus.Item_User_Data);
+
+   --  The binding uses the same user pointer for menu items
+   --  as the low level C implementation. So you can safely
+   --  read or write the user pointer also with the C routines
+   --
+   --  |=====================================================================
+   --  | Man page mitem_userptr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_User_Data (Itm  : Item;
+                            Data : User_Access);
+   --  AKA: set_item_userptr
+   pragma Inline (Set_User_Data);
+
+   --  |
+   procedure Get_User_Data (Itm  : Item;
+                            Data : out User_Access);
+   --  AKA: item_userptr
+
+   --  |
+   function Get_User_Data (Itm  : Item) return User_Access;
+   --  AKA: item_userptr
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Menus.Item_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm new file mode 100644 index 00000000..12c9eccd --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm @@ -0,0 +1,91 @@ + + + +terminal_interface-curses-menus-menu_user_data.adb + + + + +

File : terminal_interface-curses-menus-menu_user_data.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Menu_User_Data             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.17 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.Menus.Menu_User_Data is
+
+   procedure Set_User_Data (Men  : Menu;
+                            Data : User_Access)
+   is
+      function Set_Menu_Userptr (Men  : Menu;
+                                 Data : User_Access)  return Eti_Error;
+      pragma Import (C, Set_Menu_Userptr, "set_menu_userptr");
+
+   begin
+      Eti_Exception (Set_Menu_Userptr (Men, Data));
+
+   end Set_User_Data;
+
+   function Get_User_Data (Men  : Menu) return User_Access
+   is
+      function Menu_Userptr (Men : Menu) return User_Access;
+      pragma Import (C, Menu_Userptr, "menu_userptr");
+   begin
+      return Menu_Userptr (Men);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Men  : Menu;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Men);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Menus.Menu_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm new file mode 100644 index 00000000..aa398ef7 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm @@ -0,0 +1,88 @@ + + + +terminal_interface-curses-menus-menu_user_data.ads + + + + +

File : terminal_interface-curses-menus-menu_user_data.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Menus.Menu_User_Data             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.16 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access User;
+package Terminal_Interface.Curses.Menus.Menu_User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Menus.Menu_User_Data);
+
+   --  |=====================================================================
+   --  | Man page menu_userptr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_User_Data (Men  : Menu;
+                            Data : User_Access);
+   --  AKA: set_menu_userptr
+   pragma Inline (Set_User_Data);
+
+   --  |
+   procedure Get_User_Data (Men  : Menu;
+                            Data : out User_Access);
+   --  AKA: menu_userptr
+
+   --  |
+   function Get_User_Data (Men  : Menu) return User_Access;
+   --  AKA: menu_userptr
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Menus.Menu_User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__adb.htm new file mode 100644 index 00000000..56027338 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__adb.htm @@ -0,0 +1,922 @@ + + + +terminal_interface-curses-menus.adb + + + + +

File : terminal_interface-curses-menus.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Menus                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.34 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Unchecked_Deallocation;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Interfaces.C.Pointers;
+
+package body Terminal_Interface.Curses.Menus is
+
+   type C_Item_Array is array (Natural range <>) of aliased Item;
+   package I_Array is new
+     Interfaces.C.Pointers (Natural, Item, C_Item_Array, Null_Item);
+
+   subtype chars_ptr is Interfaces.C.Strings.chars_ptr;
+
+------------------------------------------------------------------------------
+   procedure Request_Name (Key  : Menu_Request_Code;
+                           Name : out String)
+   is
+      function Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Request_Name, "menu_request_name");
+   begin
+      Fill_String (Request_Name (C_Int (Key)), Name);
+   end Request_Name;
+
+   function Request_Name (Key : Menu_Request_Code) return String
+   is
+      function Request_Name (Key : C_Int) return chars_ptr;
+      pragma Import (C, Request_Name, "menu_request_name");
+   begin
+      return Fill_String (Request_Name (C_Int (Key)));
+   end Request_Name;
+
+   function Create (Name        : String;
+                    Description : String := "") return Item
+   is
+      type Char_Ptr is access all Interfaces.C.char;
+      function Newitem (Name, Desc : Char_Ptr) return Item;
+      pragma Import (C, Newitem, "new_item");
+
+      type Name_String is new char_array (0 .. Name'Length);
+      type Name_String_Ptr is access Name_String;
+      pragma Controlled (Name_String_Ptr);
+
+      type Desc_String is new char_array (0 .. Description'Length);
+      type Desc_String_Ptr is access Desc_String;
+      pragma Controlled (Desc_String_Ptr);
+
+      Name_Str : constant Name_String_Ptr := new Name_String;
+      Desc_Str : constant Desc_String_Ptr := new Desc_String;
+      Name_Len, Desc_Len : size_t;
+      Result : Item;
+   begin
+      To_C (Name, Name_Str.all, Name_Len);
+      To_C (Description, Desc_Str.all, Desc_Len);
+      Result := Newitem (Name_Str.all (Name_Str.all'First)'Access,
+                         Desc_Str.all (Desc_Str.all'First)'Access);
+      if Result = Null_Item then
+         raise Eti_System_Error;
+      end if;
+      return Result;
+   end Create;
+
+   procedure Delete (Itm : in out Item)
+   is
+      function Descname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Descname, "item_description");
+      function Itemname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Itemname, "item_name");
+
+      function Freeitem (Itm : Item) return Eti_Error;
+      pragma Import (C, Freeitem, "free_item");
+
+      Ptr : chars_ptr;
+   begin
+      Ptr := Descname (Itm);
+      if Ptr /= Null_Ptr then
+         Interfaces.C.Strings.Free (Ptr);
+      end if;
+      Ptr := Itemname (Itm);
+      if Ptr /= Null_Ptr then
+         Interfaces.C.Strings.Free (Ptr);
+      end if;
+      Eti_Exception (Freeitem (Itm));
+      Itm := Null_Item;
+   end Delete;
+-------------------------------------------------------------------------------
+   procedure Set_Value (Itm   : Item;
+                        Value : Boolean := True)
+   is
+      function Set_Item_Val (Itm : Item;
+                             Val : C_Int) return Eti_Error;
+      pragma Import (C, Set_Item_Val, "set_item_value");
+
+   begin
+      Eti_Exception (Set_Item_Val (Itm, Boolean'Pos (Value)));
+   end Set_Value;
+
+   function Value (Itm : Item) return Boolean
+   is
+      function Item_Val (Itm : Item) return C_Int;
+      pragma Import (C, Item_Val, "item_value");
+   begin
+      if Item_Val (Itm) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Value;
+
+-------------------------------------------------------------------------------
+   function Visible (Itm : Item) return Boolean
+   is
+      function Item_Vis (Itm : Item) return C_Int;
+      pragma Import (C, Item_Vis, "item_visible");
+   begin
+      if Item_Vis (Itm) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Visible;
+-------------------------------------------------------------------------------
+   procedure Set_Options (Itm     : Item;
+                          Options : Item_Option_Set)
+   is
+      function Set_Item_Opts (Itm : Item;
+                              Opt : Item_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Item_Opts, "set_item_opts");
+
+   begin
+      Eti_Exception (Set_Item_Opts (Itm, Options));
+   end Set_Options;
+
+   procedure Switch_Options (Itm     : Item;
+                             Options : Item_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Item_Opts_On (Itm : Item;
+                             Opt : Item_Option_Set) return Eti_Error;
+      pragma Import (C, Item_Opts_On, "item_opts_on");
+      function Item_Opts_Off (Itm : Item;
+                              Opt : Item_Option_Set) return Eti_Error;
+      pragma Import (C, Item_Opts_Off, "item_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Item_Opts_On (Itm, Options));
+      else
+         Eti_Exception (Item_Opts_Off (Itm, Options));
+      end if;
+   end Switch_Options;
+
+   procedure Get_Options (Itm     : Item;
+                          Options : out Item_Option_Set)
+   is
+      function Item_Opts (Itm : Item) return Item_Option_Set;
+      pragma Import (C, Item_Opts, "item_opts");
+
+   begin
+      Options := Item_Opts (Itm);
+   end Get_Options;
+
+   function Get_Options (Itm : Item := Null_Item) return Item_Option_Set
+   is
+      Ios : Item_Option_Set;
+   begin
+      Get_Options (Itm, Ios);
+      return Ios;
+   end Get_Options;
+-------------------------------------------------------------------------------
+   procedure Name (Itm  : Item;
+                   Name : out String)
+   is
+      function Itemname (Itm : Item) return chars_ptr;
+      pragma Import (C, Itemname, "item_name");
+   begin
+      Fill_String (Itemname (Itm), Name);
+   end Name;
+
+   function Name (Itm : Item) return String
+   is
+      function Itemname (Itm : Item) return chars_ptr;
+      pragma Import (C, Itemname, "item_name");
+   begin
+      return Fill_String (Itemname (Itm));
+   end Name;
+
+   procedure Description (Itm         : Item;
+                          Description : out String)
+   is
+      function Descname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Descname, "item_description");
+   begin
+      Fill_String (Descname (Itm), Description);
+   end Description;
+
+   function Description (Itm : Item) return String
+   is
+      function Descname (Itm  : Item) return chars_ptr;
+      pragma Import (C, Descname, "item_description");
+   begin
+      return Fill_String (Descname (Itm));
+   end Description;
+-------------------------------------------------------------------------------
+   procedure Set_Current (Men : Menu;
+                          Itm : Item)
+   is
+      function Set_Curr_Item (Men : Menu;
+                              Itm : Item) return Eti_Error;
+      pragma Import (C, Set_Curr_Item, "set_current_item");
+
+   begin
+      Eti_Exception (Set_Curr_Item (Men, Itm));
+   end Set_Current;
+
+   function Current (Men : Menu) return Item
+   is
+      function Curr_Item (Men : Menu) return Item;
+      pragma Import (C, Curr_Item, "current_item");
+
+      Res : constant Item := Curr_Item (Men);
+   begin
+      if Res = Null_Item then
+         raise Menu_Exception;
+      end if;
+      return Res;
+   end Current;
+
+   procedure Set_Top_Row (Men  : Menu;
+                          Line : Line_Position)
+   is
+      function Set_Toprow (Men  : Menu;
+                           Line : C_Int) return Eti_Error;
+      pragma Import (C, Set_Toprow, "set_top_row");
+
+   begin
+      Eti_Exception (Set_Toprow (Men, C_Int (Line)));
+   end Set_Top_Row;
+
+   function Top_Row (Men : Menu) return Line_Position
+   is
+      function Toprow (Men : Menu) return C_Int;
+      pragma Import (C, Toprow, "top_row");
+
+      Res : constant C_Int := Toprow (Men);
+   begin
+      if Res = Curses_Err then
+         raise Menu_Exception;
+      end if;
+      return Line_Position (Res);
+   end Top_Row;
+
+   function Get_Index (Itm : Item) return Positive
+   is
+      function Get_Itemindex (Itm : Item) return C_Int;
+      pragma Import (C, Get_Itemindex, "item_index");
+
+      Res : constant C_Int := Get_Itemindex (Itm);
+   begin
+      if Res = Curses_Err then
+         raise Menu_Exception;
+      end if;
+      return Positive (Natural (Res) + Positive'First);
+   end Get_Index;
+-------------------------------------------------------------------------------
+   procedure Post (Men  : Menu;
+                   Post : Boolean := True)
+   is
+      function M_Post (Men : Menu) return Eti_Error;
+      pragma Import (C, M_Post, "post_menu");
+      function M_Unpost (Men : Menu) return Eti_Error;
+      pragma Import (C, M_Unpost, "unpost_menu");
+
+   begin
+      if Post then
+         Eti_Exception (M_Post (Men));
+      else
+         Eti_Exception (M_Unpost (Men));
+      end if;
+   end Post;
+-------------------------------------------------------------------------------
+   procedure Set_Options (Men     : Menu;
+                          Options : Menu_Option_Set)
+   is
+      function Set_Menu_Opts (Men : Menu;
+                              Opt : Menu_Option_Set) return Eti_Error;
+      pragma Import (C, Set_Menu_Opts, "set_menu_opts");
+
+   begin
+      Eti_Exception (Set_Menu_Opts (Men, Options));
+   end Set_Options;
+
+   procedure Switch_Options (Men     : Menu;
+                             Options : Menu_Option_Set;
+                             On      : Boolean := True)
+   is
+      function Menu_Opts_On (Men : Menu;
+                             Opt : Menu_Option_Set) return Eti_Error;
+      pragma Import (C, Menu_Opts_On, "menu_opts_on");
+      function Menu_Opts_Off (Men : Menu;
+                              Opt : Menu_Option_Set) return Eti_Error;
+      pragma Import (C, Menu_Opts_Off, "menu_opts_off");
+
+   begin
+      if On then
+         Eti_Exception (Menu_Opts_On  (Men, Options));
+      else
+         Eti_Exception (Menu_Opts_Off (Men, Options));
+      end if;
+   end Switch_Options;
+
+   procedure Get_Options (Men     : Menu;
+                          Options : out Menu_Option_Set)
+   is
+      function Menu_Opts (Men : Menu) return Menu_Option_Set;
+      pragma Import (C, Menu_Opts, "menu_opts");
+
+   begin
+      Options := Menu_Opts (Men);
+   end Get_Options;
+
+   function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set
+   is
+      Mos : Menu_Option_Set;
+   begin
+      Get_Options (Men, Mos);
+      return Mos;
+   end Get_Options;
+-------------------------------------------------------------------------------
+   procedure Set_Window (Men : Menu;
+                         Win : Window)
+   is
+      function Set_Menu_Win (Men : Menu;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Menu_Win, "set_menu_win");
+
+   begin
+      Eti_Exception (Set_Menu_Win (Men, Win));
+   end Set_Window;
+
+   function Get_Window (Men : Menu) return Window
+   is
+      function Menu_Win (Men : Menu) return Window;
+      pragma Import (C, Menu_Win, "menu_win");
+
+      W : constant Window := Menu_Win (Men);
+   begin
+      return W;
+   end Get_Window;
+
+   procedure Set_Sub_Window (Men : Menu;
+                             Win : Window)
+   is
+      function Set_Menu_Sub (Men : Menu;
+                             Win : Window) return Eti_Error;
+      pragma Import (C, Set_Menu_Sub, "set_menu_sub");
+
+   begin
+      Eti_Exception (Set_Menu_Sub (Men, Win));
+   end Set_Sub_Window;
+
+   function Get_Sub_Window (Men : Menu) return Window
+   is
+      function Menu_Sub (Men : Menu) return Window;
+      pragma Import (C, Menu_Sub, "menu_sub");
+
+      W : constant Window := Menu_Sub (Men);
+   begin
+      return W;
+   end Get_Sub_Window;
+
+   procedure Scale (Men     : Menu;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count)
+   is
+      type C_Int_Access is access all C_Int;
+      function M_Scale (Men    : Menu;
+                        Yp, Xp : C_Int_Access) return Eti_Error;
+      pragma Import (C, M_Scale, "scale_menu");
+
+      X, Y : aliased C_Int;
+   begin
+      Eti_Exception (M_Scale (Men, Y'Access, X'Access));
+      Lines := Line_Count (Y);
+      Columns := Column_Count (X);
+   end Scale;
+-------------------------------------------------------------------------------
+   procedure Position_Cursor (Men : Menu)
+   is
+      function Pos_Menu_Cursor (Men : Menu) return Eti_Error;
+      pragma Import (C, Pos_Menu_Cursor, "pos_menu_cursor");
+
+   begin
+      Eti_Exception (Pos_Menu_Cursor (Men));
+   end Position_Cursor;
+
+-------------------------------------------------------------------------------
+   procedure Set_Mark (Men  : Menu;
+                       Mark : String)
+   is
+      type Char_Ptr is access all Interfaces.C.char;
+      function Set_Mark (Men  : Menu;
+                         Mark : Char_Ptr) return Eti_Error;
+      pragma Import (C, Set_Mark, "set_menu_mark");
+
+      Txt : char_array (0 .. Mark'Length);
+      Len : size_t;
+   begin
+      To_C (Mark, Txt, Len);
+      Eti_Exception (Set_Mark (Men, Txt (Txt'First)'Access));
+   end Set_Mark;
+
+   procedure Mark (Men  : Menu;
+                   Mark : out String)
+   is
+      function Get_Menu_Mark (Men : Menu) return chars_ptr;
+      pragma Import (C, Get_Menu_Mark, "menu_mark");
+   begin
+      Fill_String (Get_Menu_Mark (Men), Mark);
+   end Mark;
+
+   function Mark (Men : Menu) return String
+   is
+      function Get_Menu_Mark (Men : Menu) return chars_ptr;
+      pragma Import (C, Get_Menu_Mark, "menu_mark");
+   begin
+      return Fill_String (Get_Menu_Mark (Men));
+   end Mark;
+
+-------------------------------------------------------------------------------
+   procedure Set_Foreground
+     (Men   : Menu;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Menu_Fore (Men  : Menu;
+                              Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Menu_Fore, "set_menu_fore");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Color => Color,
+                                             Attr  => Fore);
+   begin
+      Eti_Exception (Set_Menu_Fore (Men, Ch));
+   end Set_Foreground;
+
+   procedure Foreground (Men  : Menu;
+                         Fore : out Character_Attribute_Set)
+   is
+      function Menu_Fore (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Fore, "menu_fore");
+   begin
+      Fore := Menu_Fore (Men).Attr;
+   end Foreground;
+
+   procedure Foreground (Men   : Menu;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Menu_Fore (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Fore, "menu_fore");
+   begin
+      Fore  := Menu_Fore (Men).Attr;
+      Color := Menu_Fore (Men).Color;
+   end Foreground;
+
+   procedure Set_Background
+     (Men   : Menu;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Menu_Back (Men  : Menu;
+                              Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Menu_Back, "set_menu_back");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Color => Color,
+                                             Attr  => Back);
+   begin
+      Eti_Exception (Set_Menu_Back (Men, Ch));
+   end Set_Background;
+
+   procedure Background (Men  : Menu;
+                         Back : out Character_Attribute_Set)
+   is
+      function Menu_Back (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Back, "menu_back");
+   begin
+      Back := Menu_Back (Men).Attr;
+   end Background;
+
+   procedure Background (Men   : Menu;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair)
+   is
+      function Menu_Back (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Back, "menu_back");
+   begin
+      Back  := Menu_Back (Men).Attr;
+      Color := Menu_Back (Men).Color;
+   end Background;
+
+   procedure Set_Grey (Men   : Menu;
+                       Grey  : Character_Attribute_Set := Normal_Video;
+                       Color : Color_Pair := Color_Pair'First)
+   is
+      function Set_Menu_Grey (Men  : Menu;
+                              Attr : Attributed_Character) return Eti_Error;
+      pragma Import (C, Set_Menu_Grey, "set_menu_grey");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Color => Color,
+                                             Attr  => Grey);
+
+   begin
+      Eti_Exception (Set_Menu_Grey (Men, Ch));
+   end Set_Grey;
+
+   procedure Grey (Men  : Menu;
+                   Grey : out Character_Attribute_Set)
+   is
+      function Menu_Grey (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Grey, "menu_grey");
+   begin
+      Grey := Menu_Grey (Men).Attr;
+   end Grey;
+
+   procedure Grey (Men  : Menu;
+                   Grey : out Character_Attribute_Set;
+                   Color : out Color_Pair)
+   is
+      function Menu_Grey (Men : Menu) return Attributed_Character;
+      pragma Import (C, Menu_Grey, "menu_grey");
+   begin
+      Grey  := Menu_Grey (Men).Attr;
+      Color := Menu_Grey (Men).Color;
+   end Grey;
+
+   procedure Set_Pad_Character (Men : Menu;
+                                Pad : Character := Space)
+   is
+      function Set_Menu_Pad (Men : Menu;
+                             Ch  : C_Int) return Eti_Error;
+      pragma Import (C, Set_Menu_Pad, "set_menu_pad");
+
+   begin
+      Eti_Exception (Set_Menu_Pad (Men, C_Int (Character'Pos (Pad))));
+   end Set_Pad_Character;
+
+   procedure Pad_Character (Men : Menu;
+                            Pad : out Character)
+   is
+      function Menu_Pad (Men : Menu) return C_Int;
+      pragma Import (C, Menu_Pad, "menu_pad");
+   begin
+      Pad := Character'Val (Menu_Pad (Men));
+   end Pad_Character;
+-------------------------------------------------------------------------------
+   procedure Set_Spacing (Men   : Menu;
+                          Descr : Column_Position := 0;
+                          Row   : Line_Position   := 0;
+                          Col   : Column_Position := 0)
+   is
+      function Set_Spacing (Men     : Menu;
+                            D, R, C : C_Int) return Eti_Error;
+      pragma Import (C, Set_Spacing, "set_menu_spacing");
+
+   begin
+      Eti_Exception (Set_Spacing (Men,
+                                  C_Int (Descr),
+                                  C_Int (Row),
+                                  C_Int (Col)));
+   end Set_Spacing;
+
+   procedure Spacing (Men   : Menu;
+                      Descr : out Column_Position;
+                      Row   : out Line_Position;
+                      Col   : out Column_Position)
+   is
+      type C_Int_Access is access all C_Int;
+      function Get_Spacing (Men     : Menu;
+                            D, R, C : C_Int_Access) return Eti_Error;
+      pragma Import (C, Get_Spacing, "menu_spacing");
+
+      D, R, C : aliased C_Int;
+   begin
+      Eti_Exception (Get_Spacing (Men,
+                                  D'Access,
+                                  R'Access,
+                                  C'Access));
+      Descr := Column_Position (D);
+      Row   := Line_Position (R);
+      Col   := Column_Position (C);
+   end Spacing;
+-------------------------------------------------------------------------------
+   function Set_Pattern (Men  : Menu;
+                         Text : String) return Boolean
+   is
+      type Char_Ptr is access all Interfaces.C.char;
+      function Set_Pattern (Men     : Menu;
+                            Pattern : Char_Ptr) return Eti_Error;
+      pragma Import (C, Set_Pattern, "set_menu_pattern");
+
+      S   : char_array (0 .. Text'Length);
+      L   : size_t;
+      Res : Eti_Error;
+   begin
+      To_C (Text, S, L);
+      Res := Set_Pattern (Men, S (S'First)'Access);
+      case Res is
+         when E_No_Match =>
+            return False;
+         when others =>
+            Eti_Exception (Res);
+            return True;
+      end case;
+   end Set_Pattern;
+
+   procedure Pattern (Men  : Menu;
+                      Text : out String)
+   is
+      function Get_Pattern (Men : Menu) return chars_ptr;
+      pragma Import (C, Get_Pattern, "menu_pattern");
+   begin
+      Fill_String (Get_Pattern (Men), Text);
+   end Pattern;
+-------------------------------------------------------------------------------
+   procedure Set_Format (Men     : Menu;
+                         Lines   : Line_Count;
+                         Columns : Column_Count)
+   is
+      function Set_Menu_Fmt (Men : Menu;
+                             Lin : C_Int;
+                             Col : C_Int) return Eti_Error;
+      pragma Import (C, Set_Menu_Fmt, "set_menu_format");
+
+   begin
+      Eti_Exception (Set_Menu_Fmt (Men,
+                                   C_Int (Lines),
+                                   C_Int (Columns)));
+
+   end Set_Format;
+
+   procedure Format (Men     : Menu;
+                     Lines   : out Line_Count;
+                     Columns : out Column_Count)
+   is
+      type C_Int_Access is access all C_Int;
+      function Menu_Fmt (Men  : Menu;
+                         Y, X : C_Int_Access) return Eti_Error;
+      pragma Import (C, Menu_Fmt, "menu_format");
+
+      L, C : aliased C_Int;
+   begin
+      Eti_Exception (Menu_Fmt (Men, L'Access, C'Access));
+      Lines   := Line_Count (L);
+      Columns := Column_Count (C);
+   end Format;
+-------------------------------------------------------------------------------
+   procedure Set_Item_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Item_Init (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Item_Init, "set_item_init");
+
+   begin
+      Eti_Exception (Set_Item_Init (Men, Proc));
+   end Set_Item_Init_Hook;
+
+   procedure Set_Item_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Item_Term (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Item_Term, "set_item_term");
+
+   begin
+      Eti_Exception (Set_Item_Term (Men, Proc));
+   end Set_Item_Term_Hook;
+
+   procedure Set_Menu_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Menu_Init (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Menu_Init, "set_menu_init");
+
+   begin
+      Eti_Exception (Set_Menu_Init (Men, Proc));
+   end Set_Menu_Init_Hook;
+
+   procedure Set_Menu_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function)
+   is
+      function Set_Menu_Term (Men  : Menu;
+                              Proc : Menu_Hook_Function) return Eti_Error;
+      pragma Import (C, Set_Menu_Term, "set_menu_term");
+
+   begin
+      Eti_Exception (Set_Menu_Term (Men, Proc));
+   end Set_Menu_Term_Hook;
+
+   function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Item_Init (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Item_Init, "item_init");
+   begin
+      return Item_Init (Men);
+   end Get_Item_Init_Hook;
+
+   function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Item_Term (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Item_Term, "item_term");
+   begin
+      return Item_Term (Men);
+   end Get_Item_Term_Hook;
+
+   function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Menu_Init (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Menu_Init, "menu_init");
+   begin
+      return Menu_Init (Men);
+   end Get_Menu_Init_Hook;
+
+   function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function
+   is
+      function Menu_Term (Men : Menu) return Menu_Hook_Function;
+      pragma Import (C, Menu_Term, "menu_term");
+   begin
+      return Menu_Term (Men);
+   end Get_Menu_Term_Hook;
+-------------------------------------------------------------------------------
+   procedure Redefine (Men   : Menu;
+                       Items : Item_Array_Access)
+   is
+      function Set_Items (Men   : Menu;
+                          Items : System.Address) return Eti_Error;
+      pragma Import (C, Set_Items, "set_menu_items");
+
+   begin
+      pragma Assert (Items.all (Items'Last) = Null_Item);
+      if Items.all (Items'Last) /= Null_Item then
+         raise Menu_Exception;
+      else
+         Eti_Exception (Set_Items (Men, Items.all'Address));
+      end if;
+   end Redefine;
+
+   function Item_Count (Men : Menu) return Natural
+   is
+      function Count (Men : Menu) return C_Int;
+      pragma Import (C, Count, "item_count");
+   begin
+      return Natural (Count (Men));
+   end Item_Count;
+
+   function Items (Men   : Menu;
+                   Index : Positive) return Item
+   is
+      use I_Array;
+
+      function C_Mitems (Men : Menu) return Pointer;
+      pragma Import (C, C_Mitems, "menu_items");
+
+      P : Pointer := C_Mitems (Men);
+   begin
+      if P = null or else Index > Item_Count (Men) then
+         raise Menu_Exception;
+      else
+         P := P + ptrdiff_t (C_Int (Index) - 1);
+         return P.all;
+      end if;
+   end Items;
+
+-------------------------------------------------------------------------------
+   function Create (Items : Item_Array_Access) return Menu
+   is
+      function Newmenu (Items : System.Address) return Menu;
+      pragma Import (C, Newmenu, "new_menu");
+
+      M   : Menu;
+   begin
+      pragma Assert (Items.all (Items'Last) = Null_Item);
+      if Items.all (Items'Last) /= Null_Item then
+         raise Menu_Exception;
+      else
+         M := Newmenu (Items.all'Address);
+         if M = Null_Menu then
+            raise Menu_Exception;
+         end if;
+         return M;
+      end if;
+   end Create;
+
+   procedure Delete (Men : in out Menu)
+   is
+      function Free (Men : Menu) return Eti_Error;
+      pragma Import (C, Free, "free_menu");
+
+   begin
+      Eti_Exception (Free (Men));
+      Men := Null_Menu;
+   end Delete;
+
+------------------------------------------------------------------------------
+   function Driver (Men : Menu;
+                    Key : Key_Code) return Driver_Result
+   is
+      function Driver (Men : Menu;
+                       Key : C_Int) return Eti_Error;
+      pragma Import (C, Driver, "menu_driver");
+
+      R : constant Eti_Error := Driver (Men, C_Int (Key));
+   begin
+      case R is
+         when E_Unknown_Command =>
+            return Unknown_Request;
+         when E_No_Match =>
+            return No_Match;
+         when E_Request_Denied | E_Not_Selectable =>
+            return Request_Denied;
+         when others =>
+            Eti_Exception (R);
+            return Menu_Ok;
+      end case;
+   end Driver;
+
+   procedure Free (IA         : in out Item_Array_Access;
+                   Free_Items : Boolean := False)
+   is
+      procedure Release is new Ada.Unchecked_Deallocation
+        (Item_Array, Item_Array_Access);
+   begin
+      if IA /= null and then Free_Items then
+         for I in IA'First .. (IA'Last - 1) loop
+            if IA.all (I) /= Null_Item then
+               Delete (IA.all (I));
+            end if;
+         end loop;
+      end if;
+      Release (IA);
+   end Free;
+
+-------------------------------------------------------------------------------
+   function Default_Menu_Options return Menu_Option_Set
+   is
+   begin
+      return Get_Options (Null_Menu);
+   end Default_Menu_Options;
+
+   function Default_Item_Options return Item_Option_Set
+   is
+   begin
+      return Get_Options (Null_Item);
+   end Default_Item_Options;
+-------------------------------------------------------------------------------
+
+end Terminal_Interface.Curses.Menus;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__ads.htm new file mode 100644 index 00000000..5f61dacb --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-menus__ads.htm @@ -0,0 +1,692 @@ + + + +terminal_interface-curses-menus.ads + + + + +

File : terminal_interface-curses-menus.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Menu                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.32 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+with Ada.Characters.Latin_1;
+
+package Terminal_Interface.Curses.Menus is
+   pragma Preelaborate (Terminal_Interface.Curses.Menus);
+   pragma Linker_Options ("-lmenu" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   Space : Character renames Ada.Characters.Latin_1.Space;
+
+   type Item is private;
+   type Menu is private;
+
+   ---------------------------
+   --  Interface constants  --
+   ---------------------------
+   Null_Item : constant Item;
+   Null_Menu : constant Menu;
+
+   subtype Menu_Request_Code is Key_Code
+     range (Key_Max + 1) .. (Key_Max + 17);
+
+   --  The prefix M_ stands for "Menu Request"
+   M_Left_Item       : constant Menu_Request_Code := Key_Max + 1;
+   M_Right_Item      : constant Menu_Request_Code := Key_Max + 2;
+   M_Up_Item         : constant Menu_Request_Code := Key_Max + 3;
+   M_Down_Item       : constant Menu_Request_Code := Key_Max + 4;
+   M_ScrollUp_Line   : constant Menu_Request_Code := Key_Max + 5;
+   M_ScrollDown_Line : constant Menu_Request_Code := Key_Max + 6;
+   M_ScrollDown_Page : constant Menu_Request_Code := Key_Max + 7;
+   M_ScrollUp_Page   : constant Menu_Request_Code := Key_Max + 8;
+   M_First_Item      : constant Menu_Request_Code := Key_Max + 9;
+   M_Last_Item       : constant Menu_Request_Code := Key_Max + 10;
+   M_Next_Item       : constant Menu_Request_Code := Key_Max + 11;
+   M_Previous_Item   : constant Menu_Request_Code := Key_Max + 12;
+   M_Toggle_Item     : constant Menu_Request_Code := Key_Max + 13;
+   M_Clear_Pattern   : constant Menu_Request_Code := Key_Max + 14;
+   M_Back_Pattern    : constant Menu_Request_Code := Key_Max + 15;
+   M_Next_Match      : constant Menu_Request_Code := Key_Max + 16;
+   M_Previous_Match  : constant Menu_Request_Code := Key_Max + 17;
+
+   --  For those who like the old 'C' names for the request codes
+   REQ_LEFT_ITEM     : Menu_Request_Code renames M_Left_Item;
+   REQ_RIGHT_ITEM    : Menu_Request_Code renames M_Right_Item;
+   REQ_UP_ITEM       : Menu_Request_Code renames M_Up_Item;
+   REQ_DOWN_ITEM     : Menu_Request_Code renames M_Down_Item;
+   REQ_SCR_ULINE     : Menu_Request_Code renames M_ScrollUp_Line;
+   REQ_SCR_DLINE     : Menu_Request_Code renames M_ScrollDown_Line;
+   REQ_SCR_DPAGE     : Menu_Request_Code renames M_ScrollDown_Page;
+   REQ_SCR_UPAGE     : Menu_Request_Code renames M_ScrollUp_Page;
+   REQ_FIRST_ITEM    : Menu_Request_Code renames M_First_Item;
+   REQ_LAST_ITEM     : Menu_Request_Code renames M_Last_Item;
+   REQ_NEXT_ITEM     : Menu_Request_Code renames M_Next_Item;
+   REQ_PREV_ITEM     : Menu_Request_Code renames M_Previous_Item;
+   REQ_TOGGLE_ITEM   : Menu_Request_Code renames M_Toggle_Item;
+   REQ_CLEAR_PATTERN : Menu_Request_Code renames M_Clear_Pattern;
+   REQ_BACK_PATTERN  : Menu_Request_Code renames M_Back_Pattern;
+   REQ_NEXT_MATCH    : Menu_Request_Code renames M_Next_Match;
+   REQ_PREV_MATCH    : Menu_Request_Code renames M_Previous_Match;
+
+   procedure Request_Name (Key  : Menu_Request_Code;
+                           Name : out String);
+
+   function  Request_Name (Key : Menu_Request_Code) return String;
+   --  Same as function
+
+   ------------------
+   --  Exceptions  --
+   ------------------
+
+   Menu_Exception : exception;
+   --
+   --  Menu options
+   --
+   type Menu_Option_Set is
+      record
+         One_Valued        : Boolean;
+         Show_Descriptions : Boolean;
+         Row_Major_Order   : Boolean;
+         Ignore_Case       : Boolean;
+         Show_Matches      : Boolean;
+         Non_Cyclic        : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Menu_Option_Set);
+
+   for Menu_Option_Set use
+      record
+         One_Valued        at 0 range Curses_Constants.O_ONEVALUE_First
+           .. Curses_Constants.O_ONEVALUE_Last;
+         Show_Descriptions at 0 range Curses_Constants.O_SHOWDESC_First
+           .. Curses_Constants.O_SHOWDESC_Last;
+         Row_Major_Order   at 0 range Curses_Constants.O_ROWMAJOR_First
+           .. Curses_Constants.O_ROWMAJOR_Last;
+         Ignore_Case       at 0 range Curses_Constants.O_IGNORECASE_First
+           .. Curses_Constants.O_IGNORECASE_Last;
+         Show_Matches      at 0 range Curses_Constants.O_SHOWMATCH_First
+           .. Curses_Constants.O_SHOWMATCH_Last;
+         Non_Cyclic        at 0 range Curses_Constants.O_NONCYCLIC_First
+           .. Curses_Constants.O_NONCYCLIC_Last;
+      end record;
+   pragma Warnings (Off);
+   for Menu_Option_Set'Size use Curses_Constants.Menu_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Menu_Options return Menu_Option_Set;
+   --  Initial default options for a menu.
+   pragma Inline (Default_Menu_Options);
+   --
+   --  Item options
+   --
+   type Item_Option_Set is
+      record
+         Selectable : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Item_Option_Set);
+
+   for Item_Option_Set use
+      record
+         Selectable at 0 range Curses_Constants.O_SELECTABLE_First
+           ..  Curses_Constants.O_SELECTABLE_Last;
+      end record;
+   pragma Warnings (Off);
+   for Item_Option_Set'Size use Curses_Constants.Item_Options_Size;
+   pragma Warnings (On);
+
+   function Default_Item_Options return Item_Option_Set;
+   --  Initial default options for an item.
+   pragma Inline (Default_Item_Options);
+
+   --
+   --  Item Array
+   --
+   type Item_Array is array (Positive range <>) of aliased Item;
+   pragma Convention (C, Item_Array);
+
+   type Item_Array_Access is access Item_Array;
+
+   procedure Free (IA         : in out Item_Array_Access;
+                   Free_Items : Boolean := False);
+   --  Release the memory for an allocated item array
+   --  If Free_Items is True, call Delete() for all the items in
+   --  the array.
+
+   --  |=====================================================================
+   --  | Man page mitem_new.3x
+   --  |=====================================================================
+
+   --  |
+   function Create (Name        : String;
+                    Description : String := "") return Item;
+   --  AKA: new_item()
+   --  Not inlined.
+
+   --  |
+   function New_Item (Name        : String;
+                      Description : String := "") return Item
+     renames Create;
+   --  AKA: new_item()
+
+   --  |
+   procedure Delete (Itm : in out Item);
+   --  AKA: free_item()
+   --  Resets Itm to Null_Item
+
+   --  |=====================================================================
+   --  | Man page mitem_value.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Value (Itm   : Item;
+                        Value : Boolean := True);
+   --  AKA: set_item_value()
+   pragma Inline (Set_Value);
+
+   --  |
+   function Value (Itm : Item) return Boolean;
+   --  AKA: item_value()
+   pragma Inline (Value);
+
+   --  |=====================================================================
+   --  | Man page mitem_visible.3x
+   --  |=====================================================================
+
+   --  |
+   function Visible (Itm : Item) return Boolean;
+   --  AKA: item_visible()
+   pragma Inline (Visible);
+
+   --  |=====================================================================
+   --  | Man page mitem_opts.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Options (Itm     : Item;
+                          Options : Item_Option_Set);
+   --  AKA: set_item_opts()
+   --  An overloaded Set_Options is defined later. Pragma Inline appears there
+
+   --  |
+   procedure Switch_Options (Itm     : Item;
+                             Options : Item_Option_Set;
+                             On      : Boolean := True);
+   --  AKA: item_opts_on()
+   --  AKA: item_opts_off()
+   --  An overloaded Switch_Options is defined later.
+   --  Pragma Inline appears there
+
+   --  |
+   procedure Get_Options (Itm     : Item;
+                          Options : out Item_Option_Set);
+   --  AKA: item_opts()
+
+   --  |
+   function Get_Options (Itm : Item := Null_Item) return Item_Option_Set;
+   --  AKA: item_opts()
+   --  An overloaded Get_Options is defined later. Pragma Inline appears there
+
+   --  |=====================================================================
+   --  | Man page mitem_name.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Name (Itm  : Item;
+                   Name : out String);
+   --  AKA: item_name()
+   function  Name (Itm : Item) return String;
+   --  AKA: item_name()
+   --  Implemented as function
+   pragma Inline (Name);
+
+   --  |
+   procedure Description (Itm         : Item;
+                          Description : out String);
+   --  AKA: item_description();
+
+   function  Description (Itm : Item) return String;
+   --  AKA: item_description();
+   --  Implemented as function
+   pragma Inline (Description);
+
+   --  |=====================================================================
+   --  | Man page mitem_current.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Current (Men : Menu;
+                          Itm : Item);
+   --  AKA: set_current_item()
+   pragma Inline (Set_Current);
+
+   --  |
+   function Current (Men : Menu) return Item;
+   --  AKA: current_item()
+   pragma Inline (Current);
+
+   --  |
+   procedure Set_Top_Row (Men  : Menu;
+                          Line : Line_Position);
+   --  AKA: set_top_row()
+   pragma Inline (Set_Top_Row);
+
+   --  |
+   function Top_Row (Men : Menu) return Line_Position;
+   --  AKA: top_row()
+   pragma Inline (Top_Row);
+
+   --  |
+   function Get_Index (Itm : Item) return Positive;
+   --  AKA: item_index()
+   --  Please note that in this binding we start the numbering of items
+   --  with 1. So this is number is one more than you get from the low
+   --  level call.
+   pragma Inline (Get_Index);
+
+   --  |=====================================================================
+   --  | Man page menu_post.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Post (Men  : Menu;
+                   Post : Boolean := True);
+   --  AKA: post_menu()
+   --  AKA: unpost_menu()
+   pragma Inline (Post);
+
+   --  |=====================================================================
+   --  | Man page menu_opts.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Options (Men     : Menu;
+                          Options : Menu_Option_Set);
+   --  AKA: set_menu_opts()
+   pragma Inline (Set_Options);
+
+   --  |
+   procedure Switch_Options (Men     : Menu;
+                             Options : Menu_Option_Set;
+                             On      : Boolean := True);
+   --  AKA: menu_opts_on()
+   --  AKA: menu_opts_off()
+   pragma Inline (Switch_Options);
+
+   --  |
+   procedure Get_Options (Men     : Menu;
+                          Options : out Menu_Option_Set);
+   --  AKA: menu_opts()
+
+   --  |
+   function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set;
+   --  AKA: menu_opts()
+   pragma Inline (Get_Options);
+
+   --  |=====================================================================
+   --  | Man page menu_win.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Window (Men : Menu;
+                         Win : Window);
+   --  AKA: set_menu_win()
+   pragma Inline (Set_Window);
+
+   --  |
+   function Get_Window (Men : Menu) return Window;
+   --  AKA: menu_win()
+   pragma Inline (Get_Window);
+
+   --  |
+   procedure Set_Sub_Window (Men : Menu;
+                             Win : Window);
+   --  AKA: set_menu_sub()
+   pragma Inline (Set_Sub_Window);
+
+   --  |
+   function Get_Sub_Window (Men : Menu) return Window;
+   --  AKA: menu_sub()
+   pragma Inline (Get_Sub_Window);
+
+   --  |
+   procedure Scale (Men     : Menu;
+                    Lines   : out Line_Count;
+                    Columns : out Column_Count);
+   --  AKA: scale_menu()
+   pragma Inline (Scale);
+
+   --  |=====================================================================
+   --  | Man page menu_cursor.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Position_Cursor (Men : Menu);
+   --  AKA: pos_menu_cursor()
+   pragma Inline (Position_Cursor);
+
+   --  |=====================================================================
+   --  | Man page menu_mark.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Mark (Men  : Menu;
+                       Mark : String);
+   --  AKA: set_menu_mark()
+   pragma Inline (Set_Mark);
+
+   --  |
+   procedure Mark (Men  : Menu;
+                   Mark : out String);
+   --  AKA: menu_mark()
+
+   function  Mark (Men : Menu) return String;
+   --  AKA: menu_mark()
+   --  Implemented as function
+   pragma Inline (Mark);
+
+   --  |=====================================================================
+   --  | Man page menu_attributes.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Foreground
+     (Men   : Menu;
+      Fore  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: set_menu_fore()
+   pragma Inline (Set_Foreground);
+
+   --  |
+   procedure Foreground (Men   : Menu;
+                         Fore  : out Character_Attribute_Set);
+   --  AKA: menu_fore()
+
+   --  |
+   procedure Foreground (Men   : Menu;
+                         Fore  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA: menu_fore()
+   pragma Inline (Foreground);
+
+   --  |
+   procedure Set_Background
+     (Men   : Menu;
+      Back  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: set_menu_back()
+   pragma Inline (Set_Background);
+
+   --  |
+   procedure Background (Men  : Menu;
+                         Back : out Character_Attribute_Set);
+   --  AKA: menu_back()
+   --  |
+
+   procedure Background (Men   : Menu;
+                         Back  : out Character_Attribute_Set;
+                         Color : out Color_Pair);
+   --  AKA: menu_back()
+   pragma Inline (Background);
+
+   --  |
+   procedure Set_Grey
+     (Men   : Menu;
+      Grey  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: set_menu_grey()
+   pragma Inline (Set_Grey);
+
+   --  |
+   procedure Grey (Men  : Menu;
+                   Grey : out Character_Attribute_Set);
+   --  AKA: menu_grey()
+
+   --  |
+   procedure Grey
+     (Men   : Menu;
+      Grey  : out Character_Attribute_Set;
+      Color : out Color_Pair);
+   --  AKA: menu_grey()
+   pragma Inline (Grey);
+
+   --  |
+   procedure Set_Pad_Character (Men : Menu;
+                                Pad : Character := Space);
+   --  AKA: set_menu_pad()
+   pragma Inline (Set_Pad_Character);
+
+   --  |
+   procedure Pad_Character (Men : Menu;
+                            Pad : out Character);
+   --  AKA: menu_pad()
+   pragma Inline (Pad_Character);
+
+   --  |=====================================================================
+   --  | Man page menu_spacing.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Spacing (Men   : Menu;
+                          Descr : Column_Position := 0;
+                          Row   : Line_Position   := 0;
+                          Col   : Column_Position := 0);
+   --  AKA: set_menu_spacing()
+   pragma Inline (Set_Spacing);
+
+   --  |
+   procedure Spacing (Men   : Menu;
+                      Descr : out Column_Position;
+                      Row   : out Line_Position;
+                      Col   : out Column_Position);
+   --  AKA: menu_spacing()
+   pragma Inline (Spacing);
+
+   --  |=====================================================================
+   --  | Man page menu_pattern.3x
+   --  |=====================================================================
+
+   --  |
+   function Set_Pattern (Men  : Menu;
+                         Text : String) return Boolean;
+   --  AKA: set_menu_pattern()
+   --  Return TRUE if the pattern matches, FALSE otherwise
+   pragma Inline (Set_Pattern);
+
+   --  |
+   procedure Pattern (Men  : Menu;
+                      Text : out String);
+   --  AKA: menu_pattern()
+   pragma Inline (Pattern);
+
+   --  |=====================================================================
+   --  | Man page menu_format.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_Format (Men     : Menu;
+                         Lines   : Line_Count;
+                         Columns : Column_Count);
+   --  Not implemented: 0 argument for Lines or Columns;
+   --  instead use Format to get the current sizes
+   --      The  default  format  is  16  rows,  1  column.    Calling
+   --      set_menu_format  with a null menu pointer will change this
+   --      default.  A zero row or column argument to set_menu_format
+   --      is  interpreted  as  a  request  not to change the current
+   --      value.
+   --  AKA: set_menu_format()
+   pragma Inline (Set_Format);
+
+   --  |
+   procedure Format (Men     : Menu;
+                     Lines   : out Line_Count;
+                     Columns : out Column_Count);
+   --  AKA: menu_format()
+   pragma Inline (Format);
+
+   --  |=====================================================================
+   --  | Man page menu_hook.3x
+   --  |=====================================================================
+
+   type Menu_Hook_Function is access procedure (Men : Menu);
+   pragma Convention (C, Menu_Hook_Function);
+
+   --  |
+   procedure Set_Item_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA: set_item_init()
+   pragma Inline (Set_Item_Init_Hook);
+
+   --  |
+   procedure Set_Item_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA: set_item_term()
+   pragma Inline (Set_Item_Term_Hook);
+
+   --  |
+   procedure Set_Menu_Init_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA: set_menu_init()
+   pragma Inline (Set_Menu_Init_Hook);
+
+   --  |
+   procedure Set_Menu_Term_Hook (Men  : Menu;
+                                 Proc : Menu_Hook_Function);
+   --  AKA: set_menu_term()
+   pragma Inline (Set_Menu_Term_Hook);
+
+   --  |
+   function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA: item_init()
+   pragma Inline (Get_Item_Init_Hook);
+
+   --  |
+   function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA: item_term()
+   pragma Inline (Get_Item_Term_Hook);
+
+   --  |
+   function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA: menu_init()
+   pragma Inline (Get_Menu_Init_Hook);
+
+   --  |
+   function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function;
+   --  AKA: menu_term()
+   pragma Inline (Get_Menu_Term_Hook);
+
+   --  |=====================================================================
+   --  | Man page menu_items.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Redefine (Men   : Menu;
+                       Items : Item_Array_Access);
+   --  AKA: set_menu_items()
+   pragma Inline (Redefine);
+
+   procedure Set_Items (Men   : Menu;
+                        Items : Item_Array_Access) renames Redefine;
+   --  pragma Inline (Set_Items);
+
+   --  |
+   function Items (Men   : Menu;
+                   Index : Positive) return Item;
+   --  AKA: menu_items()
+   pragma Inline (Items);
+
+   --  |
+   function Item_Count (Men : Menu) return Natural;
+   --  AKA: item_count()
+   pragma Inline (Item_Count);
+
+   --  |=====================================================================
+   --  | Man page menu_new.3x
+   --  |=====================================================================
+
+   --  |
+   function Create (Items : Item_Array_Access) return Menu;
+   --  AKA: new_menu()
+   --  Not inlined
+
+   function New_Menu (Items : Item_Array_Access) return Menu renames Create;
+
+   --  |
+   procedure Delete (Men : in out Menu);
+   --  AKA: free_menu()
+   --  Reset Men to Null_Menu
+   --  Not inlined
+
+   --  |=====================================================================
+   --  | Man page menu_driver.3x
+   --  |=====================================================================
+
+   type Driver_Result is (Menu_Ok,
+                          Request_Denied,
+                          Unknown_Request,
+                          No_Match);
+
+   --  |
+   function Driver (Men : Menu;
+                    Key : Key_Code) return Driver_Result;
+   --  AKA: menu_driver()
+   --  Driver is not inlined
+
+   --  |
+   --  Not Implemented: menu_request_name, menu_request_by_name
+-------------------------------------------------------------------------------
+private
+   type Item   is new System.Storage_Elements.Integer_Address;
+   type Menu   is new System.Storage_Elements.Integer_Address;
+
+   Null_Item : constant Item := 0;
+   Null_Menu : constant Menu := 0;
+
+end Terminal_Interface.Curses.Menus;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__adb.htm new file mode 100644 index 00000000..1a473a79 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__adb.htm @@ -0,0 +1,236 @@ + + + +terminal_interface-curses-mouse.adb + + + + +

File : terminal_interface-curses-mouse.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Mouse                      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018,2020 Thomas E. Dickey                                     --
+-- Copyright 1999-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.28 @
+--  @Date: 2020/06/27 18:50:44 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C; use Interfaces.C;
+use Interfaces;
+
+package body Terminal_Interface.Curses.Mouse is
+
+   function Has_Mouse return Boolean
+   is
+      function Mouse_Avail return C_Int;
+      pragma Import (C, Mouse_Avail, "has_mouse");
+   begin
+      if Has_Key (Key_Mouse) or else Mouse_Avail /= 0 then
+         return True;
+      else
+         return False;
+      end if;
+   end Has_Mouse;
+
+   function Get_Mouse return Mouse_Event
+   is
+      type Event_Access is access all Mouse_Event;
+
+      function Getmouse (Ev : Event_Access) return C_Int;
+      pragma Import (C, Getmouse, "getmouse");
+
+      Event : aliased Mouse_Event;
+   begin
+      if Getmouse (Event'Access) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      return Event;
+   end Get_Mouse;
+
+   procedure Register_Reportable_Event (Button : Mouse_Button;
+                                        State  : Button_State;
+                                        Mask   : in out Event_Mask)
+   is
+      Button_Nr : constant Natural := Mouse_Button'Pos (Button);
+      State_Nr  : constant Natural := Button_State'Pos (State);
+   begin
+      if Button in Modifier_Keys and then State /= Pressed then
+         raise Curses_Exception;
+      else
+         if Button in Real_Buttons then
+            Mask := Mask or ((2 ** (6 * Button_Nr)) ** State_Nr);
+         else
+            Mask := Mask or (BUTTON_CTRL ** (Button_Nr - 4));
+         end if;
+      end if;
+   end Register_Reportable_Event;
+
+   procedure Register_Reportable_Events (Button : Mouse_Button;
+                                         State  : Button_States;
+                                         Mask   : in out Event_Mask)
+   is
+   begin
+      for S in Button_States'Range loop
+         if State (S) then
+            Register_Reportable_Event (Button, S, Mask);
+         end if;
+      end loop;
+   end Register_Reportable_Events;
+
+   function Start_Mouse (Mask : Event_Mask := All_Events)
+                         return Event_Mask
+   is
+      function MMask (M : Event_Mask;
+                      O : access Event_Mask) return Event_Mask;
+      pragma Import (C, MMask, "mousemask");
+      R   : Event_Mask;
+      Old : aliased Event_Mask;
+   begin
+      R := MMask (Mask, Old'Access);
+      if R = No_Events then
+         Beep;
+      end if;
+      return Old;
+   end Start_Mouse;
+
+   procedure End_Mouse (Mask : Event_Mask := No_Events)
+   is
+   begin
+      if Mask /= No_Events then
+         Beep;
+      end if;
+   end End_Mouse;
+
+   procedure Dispatch_Event (Mask   : Event_Mask;
+                             Button : out Mouse_Button;
+                             State  : out Button_State);
+
+   procedure Dispatch_Event (Mask   : Event_Mask;
+                             Button : out Mouse_Button;
+                             State  : out Button_State) is
+      L : Event_Mask;
+   begin
+      Button := Alt;  --  preset to non real button;
+      if (Mask and BUTTON1_EVENTS) /= 0 then
+         Button := Left;
+      elsif (Mask and BUTTON2_EVENTS) /= 0 then
+         Button := Middle;
+      elsif (Mask and BUTTON3_EVENTS) /= 0 then
+         Button := Right;
+      elsif (Mask and BUTTON4_EVENTS) /= 0 then
+         Button := Button4;
+      end if;
+      if Button in Real_Buttons then
+         State := Released;  --  preset to non real button;
+         L := 2 ** (6 * Mouse_Button'Pos (Button));
+         for I in Button_State'Range loop
+            if (Mask and L) /= 0 then
+               State := I;
+               exit;
+            end if;
+            L := 2 * L;
+         end loop;
+      else
+         State := Pressed;
+         if (Mask and BUTTON_CTRL) /= 0 then
+            Button := Control;
+         elsif (Mask and BUTTON_SHIFT) /= 0 then
+            Button := Shift;
+         elsif (Mask and BUTTON_ALT) /= 0 then
+            Button := Alt;
+         end if;
+      end if;
+   end Dispatch_Event;
+
+   procedure Get_Event (Event  : Mouse_Event;
+                        Y      : out Line_Position;
+                        X      : out Column_Position;
+                        Button : out Mouse_Button;
+                        State  : out Button_State)
+   is
+      Mask  : constant Event_Mask := Event.Bstate;
+   begin
+      X := Column_Position (Event.X);
+      Y := Line_Position   (Event.Y);
+      Dispatch_Event (Mask, Button, State);
+   end Get_Event;
+
+   procedure Unget_Mouse (Event : Mouse_Event)
+   is
+      function Ungetmouse (Ev : Mouse_Event) return C_Int;
+      pragma Import (C, Ungetmouse, "ungetmouse");
+   begin
+      if Ungetmouse (Event) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Unget_Mouse;
+
+   function Enclosed_In_Window (Win    : Window := Standard_Window;
+                                Event  : Mouse_Event) return Boolean
+   is
+      function Wenclose (Win : Window; Y : C_Int; X : C_Int)
+                         return Curses_Bool;
+      pragma Import (C, Wenclose, "wenclose");
+   begin
+      if Wenclose (Win, C_Int (Event.Y), C_Int (Event.X))
+        = Curses_Bool_False
+      then
+         return False;
+      else
+         return True;
+      end if;
+   end Enclosed_In_Window;
+
+   function Mouse_Interval (Msec : Natural := 200) return Natural
+   is
+      function Mouseinterval (Msec : C_Int) return C_Int;
+      pragma Import (C, Mouseinterval, "mouseinterval");
+   begin
+      return Natural (Mouseinterval (C_Int (Msec)));
+   end Mouse_Interval;
+
+end Terminal_Interface.Curses.Mouse;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__ads.htm new file mode 100644 index 00000000..5ed20a8c --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-mouse__ads.htm @@ -0,0 +1,223 @@ + + + +terminal_interface-curses-mouse.ads + + + + +

File : terminal_interface-curses-mouse.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Mouse                     --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2014,2015 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.33 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+
+package Terminal_Interface.Curses.Mouse is
+   pragma Preelaborate (Terminal_Interface.Curses.Mouse);
+
+   --  |=====================================================================
+   --  | Man page curs_mouse.3x
+   --  |=====================================================================
+   --  mouse_trafo, wmouse_trafo are implemented as Transform_Coordinates
+   --  in the parent package.
+   --
+   --  Not implemented:
+   --  REPORT_MOUSE_POSITION (i.e. as a parameter to Register_Reportable_Event
+   --  or Start_Mouse)
+   type Event_Mask is private;
+   No_Events  : constant Event_Mask;
+   All_Events : constant Event_Mask;
+
+   type Mouse_Button is (Left,     -- aka: Button 1
+                         Middle,   -- aka: Button 2
+                         Right,    -- aka: Button 3
+                         Button4,  -- aka: Button 4
+                         Control,  -- Control Key
+                         Shift,    -- Shift Key
+                         Alt);     -- ALT Key
+
+   subtype Real_Buttons  is Mouse_Button range Left .. Button4;
+   subtype Modifier_Keys is Mouse_Button range Control .. Alt;
+
+   type Button_State is (Released,
+                         Pressed,
+                         Clicked,
+                         Double_Clicked,
+                         Triple_Clicked);
+
+   type Button_States is array (Button_State) of Boolean;
+   pragma Pack (Button_States);
+
+   All_Clicks : constant Button_States := (Clicked .. Triple_Clicked => True,
+                                           others => False);
+   All_States : constant Button_States := (others => True);
+
+   type Mouse_Event is private;
+
+   --  |=====================================================================
+   --  | Man page curs_mouse.3x
+   --  |=====================================================================
+
+   function Has_Mouse return Boolean;
+   --  Return true if a mouse device is supported, false otherwise.
+
+   procedure Register_Reportable_Event
+     (Button : Mouse_Button;
+      State  : Button_State;
+      Mask   : in out Event_Mask);
+   --  Stores the event described by the button and the state in the mask.
+   --  Before you call this the first time, you should initialize the mask
+   --  with the Empty_Mask constant
+   pragma Inline (Register_Reportable_Event);
+
+   procedure Register_Reportable_Events
+     (Button : Mouse_Button;
+      State  : Button_States;
+      Mask   : in out Event_Mask);
+   --  Register all events described by the Button and the State bitmap.
+   --  Before you call this the first time, you should initialize the mask
+   --  with the Empty_Mask constant
+
+   --  |
+   --  There is one difference to mousmask(): we return the value of the
+   --  old mask, that means the event mask value before this call.
+   --  Not Implemented: The library version
+   --  returns a Mouse_Mask that tells which events are reported.
+   function Start_Mouse (Mask : Event_Mask := All_Events)
+                         return Event_Mask;
+   --  AKA: mousemask()
+   pragma Inline (Start_Mouse);
+
+   procedure End_Mouse (Mask : Event_Mask := No_Events);
+   --  Terminates the mouse, restores the specified event mask
+   pragma Inline (End_Mouse);
+
+   --  |
+   function Get_Mouse return Mouse_Event;
+   --  AKA: getmouse()
+   pragma Inline (Get_Mouse);
+
+   procedure Get_Event (Event  : Mouse_Event;
+                        Y      : out Line_Position;
+                        X      : out Column_Position;
+                        Button : out Mouse_Button;
+                        State  : out Button_State);
+   --  !!! Warning: X and Y are screen coordinates. Due to ripped of lines they
+   --  may not be identical to window coordinates.
+   --  Not Implemented: Get_Event only reports one event, the C library
+   --  version supports multiple events, e.g. {click-1, click-3}
+   pragma Inline (Get_Event);
+
+   --  |
+   procedure Unget_Mouse (Event : Mouse_Event);
+   --  AKA: ungetmouse()
+   pragma Inline (Unget_Mouse);
+
+   --  |
+   function Enclosed_In_Window (Win    : Window := Standard_Window;
+                                Event  : Mouse_Event) return Boolean;
+   --  AKA: wenclose()
+   --  But : use event instead of screen coordinates.
+   pragma Inline (Enclosed_In_Window);
+
+   --  |
+   function Mouse_Interval (Msec : Natural := 200) return Natural;
+   --  AKA: mouseinterval()
+   pragma Inline (Mouse_Interval);
+
+private
+   --  This can be as little as 32 bits (unsigned), or as long as the system's
+   --  unsigned long.  Declare it as the minimum size to handle all valid
+   --  sizes.
+   type Event_Mask is mod 4294967296;
+
+   type Mouse_Event is
+      record
+         Id      : Integer range Integer (Interfaces.C.short'First) ..
+                                 Integer (Interfaces.C.short'Last);
+         X, Y, Z : Integer range Integer (Interfaces.C.int'First) ..
+                                 Integer (Interfaces.C.int'Last);
+         Bstate  : Event_Mask;
+      end record;
+   pragma Convention (C, Mouse_Event);
+
+   for Mouse_Event use
+      record
+         Id     at 0 range Curses_Constants.MEVENT_id_First
+           .. Curses_Constants.MEVENT_id_Last;
+         X      at 0 range Curses_Constants.MEVENT_x_First
+           .. Curses_Constants.MEVENT_x_Last;
+         Y      at 0 range Curses_Constants.MEVENT_y_First
+           .. Curses_Constants.MEVENT_y_Last;
+         Z      at 0 range Curses_Constants.MEVENT_z_First
+           .. Curses_Constants.MEVENT_z_Last;
+         Bstate at 0 range Curses_Constants.MEVENT_bstate_First
+           .. Curses_Constants.MEVENT_bstate_Last;
+      end record;
+   for Mouse_Event'Size use Curses_Constants.MEVENT_Size;
+   Generation_Bit_Order : System.Bit_Order renames Curses_Constants.Bit_Order;
+
+   BUTTON_CTRL      : constant Event_Mask := Curses_Constants.BUTTON_CTRL;
+   BUTTON_SHIFT     : constant Event_Mask := Curses_Constants.BUTTON_SHIFT;
+   BUTTON_ALT       : constant Event_Mask := Curses_Constants.BUTTON_ALT;
+   BUTTON1_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_1;
+   BUTTON2_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_2;
+   BUTTON3_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_3;
+   BUTTON4_EVENTS   : constant Event_Mask
+     := Curses_Constants.all_events_button_4;
+   ALL_MOUSE_EVENTS : constant Event_Mask := Curses_Constants.ALL_MOUSE_EVENTS;
+   No_Events        : constant Event_Mask := 0;
+   All_Events       : constant Event_Mask := ALL_MOUSE_EVENTS;
+
+end Terminal_Interface.Curses.Mouse;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm new file mode 100644 index 00000000..7270d2c8 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm @@ -0,0 +1,97 @@ + + + +terminal_interface-curses-panels-user_data.adb + + + + +

File : terminal_interface-curses-panels-user_data.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Panels.User_Data               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C;
+with Terminal_Interface.Curses.Aux;
+use  Terminal_Interface.Curses.Aux;
+with Terminal_Interface.Curses.Panels;
+use  Terminal_Interface.Curses.Panels;
+
+package body Terminal_Interface.Curses.Panels.User_Data is
+
+   use type Interfaces.C.int;
+
+   procedure Set_User_Data (Pan  : Panel;
+                            Data : User_Access)
+   is
+      function Set_Panel_Userptr (Pan  : Panel;
+                                  Addr : User_Access) return C_Int;
+      pragma Import (C, Set_Panel_Userptr, "set_panel_userptr");
+   begin
+      if Set_Panel_Userptr (Pan, Data) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Set_User_Data;
+
+   function Get_User_Data (Pan  : Panel) return User_Access
+   is
+      function Panel_Userptr (Pan : Panel) return User_Access;
+      pragma Import (C, Panel_Userptr, "panel_userptr");
+   begin
+      return Panel_Userptr (Pan);
+   end Get_User_Data;
+
+   procedure Get_User_Data (Pan  : Panel;
+                            Data : out User_Access)
+   is
+   begin
+      Data := Get_User_Data (Pan);
+   end Get_User_Data;
+
+end Terminal_Interface.Curses.Panels.User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm new file mode 100644 index 00000000..a39d0e48 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm @@ -0,0 +1,88 @@ + + + +terminal_interface-curses-panels-user_data.ads + + + + +

File : terminal_interface-curses-panels-user_data.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                 Terminal_Interface.Curses.Panels.User_Data               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.16 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+generic
+   type User is limited private;
+   type User_Access is access all User;
+package Terminal_Interface.Curses.Panels.User_Data is
+   pragma Preelaborate (Terminal_Interface.Curses.Panels.User_Data);
+
+   --  |=====================================================================
+   --  | Man page panel.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_User_Data (Pan  : Panel;
+                            Data : User_Access);
+   --  AKA: set_panel_userptr
+   pragma Inline (Set_User_Data);
+
+   --  |
+   procedure Get_User_Data (Pan  : Panel;
+                            Data : out User_Access);
+   --  AKA: panel_userptr
+
+   --  |
+   function Get_User_Data (Pan  : Panel) return User_Access;
+   --  AKA: panel_userptr
+   --  Same as function
+   pragma Inline (Get_User_Data);
+
+end Terminal_Interface.Curses.Panels.User_Data;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__adb.htm new file mode 100644 index 00000000..096d7fed --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__adb.htm @@ -0,0 +1,184 @@ + + + +terminal_interface-curses-panels.adb + + + + +

File : terminal_interface-curses-panels.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Panels                    --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2004,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C;
+
+package body Terminal_Interface.Curses.Panels is
+
+   use type Interfaces.C.int;
+
+   function Create (Win : Window) return Panel
+   is
+      function Newpanel (Win : Window) return Panel;
+      pragma Import (C, Newpanel, "new_panel");
+
+      Pan : Panel;
+   begin
+      Pan := Newpanel (Win);
+      if Pan = Null_Panel then
+         raise Panel_Exception;
+      end if;
+      return Pan;
+   end Create;
+
+   procedure Bottom (Pan : Panel)
+   is
+      function Bottompanel (Pan : Panel) return C_Int;
+      pragma Import (C, Bottompanel, "bottom_panel");
+   begin
+      if Bottompanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Bottom;
+
+   procedure Top (Pan : Panel)
+   is
+      function Toppanel (Pan : Panel) return C_Int;
+      pragma Import (C, Toppanel, "top_panel");
+   begin
+      if Toppanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Top;
+
+   procedure Show (Pan : Panel)
+   is
+      function Showpanel (Pan : Panel) return C_Int;
+      pragma Import (C, Showpanel, "show_panel");
+   begin
+      if Showpanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Show;
+
+   procedure Hide (Pan : Panel)
+   is
+      function Hidepanel (Pan : Panel) return C_Int;
+      pragma Import (C, Hidepanel, "hide_panel");
+   begin
+      if Hidepanel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Hide;
+
+   function Get_Window (Pan : Panel) return Window
+   is
+      function Panel_Win (Pan : Panel) return Window;
+      pragma Import (C, Panel_Win, "panel_window");
+
+      Win : constant Window := Panel_Win (Pan);
+   begin
+      if Win = Null_Window then
+         raise Panel_Exception;
+      end if;
+      return Win;
+   end Get_Window;
+
+   procedure Replace (Pan : Panel;
+                      Win : Window)
+   is
+      function Replace_Pan (Pan : Panel;
+                            Win : Window) return C_Int;
+      pragma Import (C, Replace_Pan, "replace_panel");
+   begin
+      if Replace_Pan (Pan, Win) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Replace;
+
+   procedure Move (Pan    : Panel;
+                   Line   : Line_Position;
+                   Column : Column_Position)
+   is
+      function Move (Pan    : Panel;
+                     Line   : C_Int;
+                     Column : C_Int) return C_Int;
+      pragma Import (C, Move, "move_panel");
+   begin
+      if Move (Pan, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+   end Move;
+
+   function Is_Hidden (Pan : Panel) return Boolean
+   is
+      function Panel_Hidden (Pan : Panel) return C_Int;
+      pragma Import (C, Panel_Hidden, "panel_hidden");
+   begin
+      if Panel_Hidden (Pan) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_Hidden;
+
+   procedure Delete (Pan : in out Panel)
+   is
+      function Del_Panel (Pan : Panel) return C_Int;
+      pragma Import (C, Del_Panel, "del_panel");
+   begin
+      if Del_Panel (Pan) = Curses_Err then
+         raise Panel_Exception;
+      end if;
+      Pan := Null_Panel;
+   end Delete;
+
+end Terminal_Interface.Curses.Panels;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__ads.htm new file mode 100644 index 00000000..4cc3178d --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-panels__ads.htm @@ -0,0 +1,165 @@ + + + +terminal_interface-curses-panels.ads + + + + +

File : terminal_interface-curses-panels.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Panels                    --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.23 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+
+package Terminal_Interface.Curses.Panels is
+   pragma Preelaborate (Terminal_Interface.Curses.Panels);
+   pragma Linker_Options ("-lpanel" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   type Panel is private;
+
+   ---------------------------
+   --  Interface constants  --
+   ---------------------------
+   Null_Panel : constant Panel;
+
+   -------------------
+   --  Exceptions   --
+   -------------------
+
+   Panel_Exception : exception;
+
+   --  |=====================================================================
+   --  | Man page panel.3x
+   --  |=====================================================================
+
+   --  |
+   function Create (Win : Window) return Panel;
+   --  AKA: new_panel()
+   pragma Inline (Create);
+
+   --  |
+   function New_Panel (Win : Window) return Panel renames Create;
+   --  AKA: new_panel()
+   --  pragma Inline (New_Panel);
+
+   --  |
+   procedure Bottom (Pan : Panel);
+   --  AKA: bottom_panel()
+   pragma Inline (Bottom);
+
+   --  |
+   procedure Top (Pan : Panel);
+   --  AKA: top_panel()
+   pragma Inline (Top);
+
+   --  |
+   procedure Show (Pan : Panel);
+   --  AKA: show_panel()
+   pragma Inline (Show);
+
+   --  |
+   procedure Update_Panels;
+   --  AKA: update_panels()
+   pragma Import (C, Update_Panels, "update_panels");
+
+   --  |
+   procedure Hide (Pan : Panel);
+   --  AKA: hide_panel()
+   pragma Inline (Hide);
+
+   --  |
+   function Get_Window (Pan : Panel) return Window;
+   --  AKA: panel_window()
+   pragma Inline (Get_Window);
+
+   --  |
+   function Panel_Window (Pan : Panel) return Window renames Get_Window;
+   --  pragma Inline (Panel_Window);
+
+   --  |
+   procedure Replace (Pan : Panel;
+                      Win : Window);
+   --  AKA: replace_panel()
+   pragma Inline (Replace);
+
+   --  |
+   procedure Move (Pan    : Panel;
+                   Line   : Line_Position;
+                   Column : Column_Position);
+   --  AKA: move_panel()
+   pragma Inline (Move);
+
+   --  |
+   function Is_Hidden (Pan : Panel) return Boolean;
+   --  AKA: panel_hidden()
+   pragma Inline (Is_Hidden);
+
+   --  |
+   function Above (Pan : Panel) return Panel;
+   --  AKA: panel_above()
+   pragma Import (C, Above, "panel_above");
+
+   --  |
+   function Below (Pan : Panel) return Panel;
+   --  AKA: panel_below()
+   pragma Import (C, Below, "panel_below");
+
+   --  |
+   procedure Delete (Pan : in out Panel);
+   --  AKA: del_panel()
+   pragma Inline (Delete);
+
+private
+      type Panel is new System.Storage_Elements.Integer_Address;
+      Null_Panel : constant Panel := 0;
+
+end Terminal_Interface.Curses.Panels;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__adb.htm new file mode 100644 index 00000000..4e5073d6 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__adb.htm @@ -0,0 +1,96 @@ + + + +terminal_interface-curses-putwin.adb + + + + +

File : terminal_interface-curses-putwin.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.PutWin                      --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.5 @
+--  Binding Version 01.00
+
+with Ada.Streams.Stream_IO.C_Streams;
+with Interfaces.C_Streams;
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+
+package body Terminal_Interface.Curses.PutWin is
+
+   package ICS renames Interfaces.C_Streams;
+   package ACS renames Ada.Streams.Stream_IO.C_Streams;
+   use type C_Int;
+
+   procedure Put_Window (Win  : Window;
+                         File : Ada.Streams.Stream_IO.File_Type) is
+      function putwin (Win : Window; f : ICS.FILEs) return C_Int;
+      pragma Import (C, putwin, "putwin");
+
+      R : constant C_Int := putwin (Win, ACS.C_Stream (File));
+   begin
+      if R /= Curses_Ok then
+         raise Curses_Exception;
+      end if;
+   end Put_Window;
+
+   function Get_Window (File : Ada.Streams.Stream_IO.File_Type)
+                        return Window is
+      function getwin (f : ICS.FILEs) return Window;
+      pragma Import (C, getwin, "getwin");
+
+      W : constant Window := getwin (ACS.C_Stream (File));
+   begin
+      if W = Null_Window then
+         raise Curses_Exception;
+      else
+         return W;
+      end if;
+   end Get_Window;
+
+end Terminal_Interface.Curses.PutWin;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__ads.htm new file mode 100644 index 00000000..91f26451 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-putwin__ads.htm @@ -0,0 +1,69 @@ + + + +terminal_interface-curses-putwin.ads + + + + +

File : terminal_interface-curses-putwin.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.PutWin                      --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.5 @
+--  Binding Version 01.00
+
+with Ada.Streams.Stream_IO;
+
+package Terminal_Interface.Curses.PutWin is
+
+   procedure Put_Window (Win  : Window;
+                         File : Ada.Streams.Stream_IO.File_Type);
+
+   function Get_Window (File  : Ada.Streams.Stream_IO.File_Type) return Window;
+
+end Terminal_Interface.Curses.PutWin;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__adb.htm new file mode 100644 index 00000000..cef7daf3 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__adb.htm @@ -0,0 +1,182 @@ + + + +terminal_interface-curses-termcap.adb + + + + +

File : terminal_interface-curses-termcap.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.Termcap                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+
+package body Terminal_Interface.Curses.Termcap is
+
+   function Get_Entry (Name : String) return Boolean
+   is
+      function tgetent (name : char_array; val : char_array)
+                        return C_Int;
+      pragma Import (C, tgetent, "tgetent");
+      NameTxt : char_array (0 .. Name'Length);
+      Length  : size_t;
+      ignored : constant char_array (0 .. 0) := (0 => nul);
+      result  : C_Int;
+   begin
+      To_C (Name, NameTxt, Length);
+      result := tgetent (char_array (ignored), NameTxt);
+      if result = -1 then
+         raise Curses_Exception;
+      else
+         return Boolean'Val (result);
+      end if;
+   end Get_Entry;
+
+------------------------------------------------------------------------------
+   function Get_Flag (Name : String) return Boolean
+   is
+      function tgetflag (id : char_array) return C_Int;
+      pragma Import (C, tgetflag, "tgetflag");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      if tgetflag (Txt) = 0 then
+         return False;
+      else
+         return True;
+      end if;
+   end Get_Flag;
+
+------------------------------------------------------------------------------
+   procedure Get_Number (Name   : String;
+                         Value  : out Integer;
+                         Result : out Boolean)
+   is
+      function tgetnum (id : char_array) return C_Int;
+      pragma Import (C, tgetnum, "tgetnum");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      Value := Integer (tgetnum (Txt));
+      if Value = -1 then
+         Result := False;
+      else
+         Result :=  True;
+      end if;
+   end Get_Number;
+
+------------------------------------------------------------------------------
+   procedure Get_String (Name   : String;
+                         Value  : out String;
+                         Result : out Boolean)
+   is
+      function tgetstr (id  : char_array;
+                        buf : char_array) return chars_ptr;
+      pragma Import (C, tgetstr, "tgetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2   : chars_ptr;
+      type t is new char_array (0 .. 1024); --  does it need to be 1024?
+      Return_Buffer : constant t := (others => nul);
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tgetstr (Txt, char_array (Return_Buffer));
+      if Txt2 = Null_Ptr then
+         Result := False;
+      else
+         Value := Fill_String (Txt2);
+         Result := True;
+      end if;
+   end Get_String;
+
+   function Get_String (Name : String) return Boolean
+   is
+      function tgetstr (Id  : char_array;
+                        buf : char_array) return chars_ptr;
+      pragma Import (C, tgetstr, "tgetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2   : chars_ptr;
+      type t is new char_array (0 .. 1024); --  does it need to be 1024?
+      Phony_Txt : constant t := (others => nul);
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tgetstr (Txt, char_array (Phony_Txt));
+      if Txt2 = Null_Ptr then
+         return False;
+      else
+         return True;
+      end if;
+   end Get_String;
+
+------------------------------------------------------------------------------
+   function TGoto (Cap : String;
+                   Col : Column_Position;
+                   Row : Line_Position) return Termcap_String is
+      function tgoto (cap : char_array;
+                      col : C_Int;
+                      row : C_Int) return chars_ptr;
+      pragma Import (C, tgoto);
+      Txt    : char_array (0 .. Cap'Length);
+      Length : size_t;
+   begin
+      To_C (Cap, Txt, Length);
+      return Termcap_String (Fill_String
+                             (tgoto (Txt, C_Int (Col), C_Int (Row))));
+   end TGoto;
+
+end Terminal_Interface.Curses.Termcap;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__ads.htm new file mode 100644 index 00000000..269ee9dd --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-termcap__ads.htm @@ -0,0 +1,99 @@ + + + +terminal_interface-curses-termcap.ads + + + + +

File : terminal_interface-curses-termcap.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Termcap                    --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.5 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+package Terminal_Interface.Curses.Termcap is
+   pragma Preelaborate (Terminal_Interface.Curses.Termcap);
+
+   --  |=====================================================================
+   --  | Man page curs_termcap.3x
+   --  |=====================================================================
+   --  Not implemented:  tputs (see curs_terminfo)
+
+   type Termcap_String is new String;
+
+   --  |
+   function TGoto (Cap : String;
+                   Col : Column_Position;
+                   Row : Line_Position) return Termcap_String;
+   --  AKA: tgoto()
+
+   --  |
+   function Get_Entry (Name : String) return Boolean;
+   --  AKA: tgetent()
+
+   --  |
+   function Get_Flag (Name : String) return Boolean;
+   --  AKA: tgetflag()
+
+   --  |
+   procedure Get_Number (Name   : String;
+                         Value  : out Integer;
+                         Result : out Boolean);
+   --  AKA: tgetnum()
+
+   --  |
+   procedure Get_String (Name   : String;
+                         Value  : out String;
+                         Result : out Boolean);
+   function Get_String (Name : String) return Boolean;
+   --  Returns True if the string is found.
+   --  AKA: tgetstr()
+
+end Terminal_Interface.Curses.Termcap;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__adb.htm new file mode 100644 index 00000000..c84c2035 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__adb.htm @@ -0,0 +1,180 @@ + + + +terminal_interface-curses-terminfo.adb + + + + +

File : terminal_interface-curses-terminfo.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                    Terminal_Interface.Curses.Terminfo                    --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2006,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.7 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
+with Interfaces.C; use Interfaces.C;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with Ada.Unchecked_Conversion;
+
+package body Terminal_Interface.Curses.Terminfo is
+
+   function Is_MinusOne_Pointer (P : chars_ptr) return Boolean;
+
+   function Is_MinusOne_Pointer (P : chars_ptr) return Boolean is
+      type Weird_Address is new System.Storage_Elements.Integer_Address;
+      Invalid_Pointer : constant Weird_Address := -1;
+      function To_Weird is new Ada.Unchecked_Conversion
+        (Source => chars_ptr, Target => Weird_Address);
+   begin
+      if To_Weird (P) = Invalid_Pointer then
+         return True;
+      else
+         return False;
+      end if;
+   end Is_MinusOne_Pointer;
+   pragma Inline (Is_MinusOne_Pointer);
+
+------------------------------------------------------------------------------
+   function Get_Flag (Name : String) return Boolean
+   is
+      function tigetflag (id : char_array) return Curses_Bool;
+      pragma Import (C, tigetflag);
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      if tigetflag (Txt) = Curses_Bool (Curses_True) then
+         return True;
+      else
+         return False;
+      end if;
+   end Get_Flag;
+
+------------------------------------------------------------------------------
+   procedure Get_String (Name   : String;
+                         Value  : out Terminfo_String;
+                         Result : out Boolean)
+   is
+      function tigetstr (id : char_array) return chars_ptr;
+      pragma Import (C, tigetstr, "tigetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2 : chars_ptr;
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tigetstr (Txt);
+      if Txt2 = Null_Ptr then
+         Result := False;
+      elsif Is_MinusOne_Pointer (Txt2) then
+         raise Curses_Exception;
+      else
+         Value  := Terminfo_String (Fill_String (Txt2));
+         Result := True;
+      end if;
+   end Get_String;
+
+------------------------------------------------------------------------------
+   function Has_String (Name : String) return Boolean
+   is
+      function tigetstr (id : char_array) return chars_ptr;
+      pragma Import (C, tigetstr, "tigetstr");
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+      Txt2 : chars_ptr;
+   begin
+      To_C (Name, Txt, Length);
+      Txt2 := tigetstr (Txt);
+      if Txt2 = Null_Ptr then
+         return False;
+      elsif Is_MinusOne_Pointer (Txt2) then
+         raise Curses_Exception;
+      else
+         return True;
+      end if;
+   end Has_String;
+
+------------------------------------------------------------------------------
+   function Get_Number (Name : String) return Integer is
+      function tigetstr (s : char_array) return C_Int;
+      pragma Import (C, tigetstr);
+      Txt    : char_array (0 .. Name'Length);
+      Length : size_t;
+   begin
+      To_C (Name, Txt, Length);
+      return Integer (tigetstr (Txt));
+   end Get_Number;
+
+------------------------------------------------------------------------------
+   procedure Put_String (Str    : Terminfo_String;
+                         affcnt : Natural := 1;
+                         putc   : putctype := null) is
+      function tputs (str    : char_array;
+                      affcnt : C_Int;
+                      putc   : putctype) return C_Int;
+      function putp (str : char_array) return C_Int;
+      pragma Import (C, tputs);
+      pragma Import (C, putp);
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+      Err : C_Int;
+   begin
+      To_C (String (Str), Txt, Length);
+      if putc = null then
+         Err := putp (Txt);
+      else
+         Err := tputs (Txt, C_Int (affcnt), putc);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Put_String;
+
+end Terminal_Interface.Curses.Terminfo;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__ads.htm new file mode 100644 index 00000000..58592807 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-terminfo__ads.htm @@ -0,0 +1,100 @@ + + + +terminal_interface-curses-terminfo.ads + + + + +

File : terminal_interface-curses-terminfo.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Terminfo                   --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000-2002,2003 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.5 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+with Interfaces.C;
+
+package Terminal_Interface.Curses.Terminfo is
+   pragma Preelaborate (Terminal_Interface.Curses.Terminfo);
+
+   --  |=====================================================================
+   --  | Man page curs_terminfo.3x
+   --  |=====================================================================
+   --  Not implemented:  setupterm, setterm, set_curterm, del_curterm,
+   --                    restartterm, tparm, putp, vidputs,  vidattr,
+   --                    mvcur
+
+   type Terminfo_String is new String;
+
+   --  |
+   procedure Get_String (Name   : String;
+                         Value  : out Terminfo_String;
+                         Result : out Boolean);
+   function Has_String (Name : String) return Boolean;
+   --  AKA: tigetstr()
+
+   --  |
+   function Get_Flag (Name : String) return Boolean;
+   --  AKA: tigetflag()
+
+   --  |
+   function Get_Number (Name : String) return Integer;
+   --  AKA: tigetnum()
+
+   type putctype is access function (c : Interfaces.C.int)
+                                    return Interfaces.C.int;
+   pragma Convention (C, putctype);
+
+   --  |
+   procedure Put_String (Str    : Terminfo_String;
+                         affcnt : Natural := 1;
+                         putc   : putctype := null);
+   --  AKA: tputs()
+
+end Terminal_Interface.Curses.Terminfo;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm new file mode 100644 index 00000000..6ce4a43c --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm @@ -0,0 +1,147 @@ + + + +terminal_interface-curses-text_io-aux.adb + + + + +

File : terminal_interface-curses-text_io-aux.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                   Terminal_Interface.Curses.Text_IO.Aux                  --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2006,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.14 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package body Terminal_Interface.Curses.Text_IO.Aux is
+
+   procedure Put_Buf
+     (Win    : Window;
+      Buf    : String;
+      Width  : Field;
+      Signal : Boolean := True;
+      Ljust  : Boolean := False)
+   is
+      L   : Field;
+      Len : Field;
+      W   : Field := Width;
+      LC  : Line_Count;
+      CC  : Column_Count;
+      Y   : Line_Position;
+      X   : Column_Position;
+
+      procedure Output (From, To : Field);
+
+      procedure Output (From, To : Field)
+      is
+      begin
+         if Len > 0 then
+            if W = 0 then
+               W := Len;
+            end if;
+            if Len > W then
+               --  LRM A10.6 (7) says this
+               W := Len;
+            end if;
+
+            pragma Assert (Len <= W);
+            Get_Size (Win, LC, CC);
+            if Column_Count (Len) > CC then
+               if Signal then
+                  raise Layout_Error;
+               else
+                  return;
+               end if;
+            else
+               if Len < W and then not Ljust then
+                  declare
+                     Filler : constant String (1 .. (W - Len))
+                       := (others => ' ');
+                  begin
+                     Put (Win, Filler);
+                  end;
+               end if;
+               Get_Cursor_Position (Win, Y, X);
+               if (X + Column_Position (Len)) > CC then
+                  New_Line (Win);
+               end if;
+               Put (Win, Buf (From .. To));
+               if Len < W and then Ljust then
+                  declare
+                     Filler : constant String (1 .. (W - Len))
+                       := (others => ' ');
+                  begin
+                     Put (Win, Filler);
+                  end;
+               end if;
+            end if;
+         end if;
+      end Output;
+
+   begin
+      pragma Assert (Win /= Null_Window);
+      if Ljust then
+         L := 1;
+         for I in 1 .. Buf'Length loop
+            exit when Buf (L) = ' ';
+            L := L + 1;
+         end loop;
+         Len := L - 1;
+         Output (1, Len);
+      else  -- input buffer is not left justified
+         L := Buf'Length;
+         for I in 1 .. Buf'Length loop
+            exit when Buf (L) = ' ';
+            L := L - 1;
+         end loop;
+         Len := Buf'Length - L;
+         Output (L + 1, Buf'Length);
+      end if;
+   end Put_Buf;
+
+end Terminal_Interface.Curses.Text_IO.Aux;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm new file mode 100644 index 00000000..82589864 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm @@ -0,0 +1,74 @@ + + + +terminal_interface-curses-text_io-aux.ads + + + + +

File : terminal_interface-curses-text_io-aux.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                   Terminal_Interface.Curses.Text_IO.Aux                  --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2006,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+private package Terminal_Interface.Curses.Text_IO.Aux is
+   --  pragma Preelaborate (Aux);
+
+   --  This routine is called from the Text_IO output routines for numeric
+   --  and enumeration types.
+   --
+   procedure Put_Buf
+     (Win    : Window;               -- The output window
+      Buf    : String;               -- The buffer containing the text
+      Width  : Field;                -- The width of the output field
+      Signal : Boolean := True;      -- If true, we raise Layout_Error
+      Ljust  : Boolean := False);    -- The Buf is left justified
+
+end Terminal_Interface.Curses.Text_IO.Aux;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm new file mode 100644 index 00000000..cad3300a --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm @@ -0,0 +1,92 @@ + + + +terminal_interface-curses-text_io-complex_io.adb + + + + +

File : terminal_interface-curses-text_io-complex_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Complex_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Terminal_Interface.Curses.Text_IO.Float_IO;
+
+package body Terminal_Interface.Curses.Text_IO.Complex_IO is
+
+   package FIO is new
+     Terminal_Interface.Curses.Text_IO.Float_IO (Complex_Types.Real'Base);
+
+   procedure Put
+     (Win  : Window;
+      Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+   begin
+      Put (Win, '(');
+      FIO.Put (Win, Item.Re, Fore, Aft, Exp);
+      Put (Win, ',');
+      FIO.Put (Win, Item.Im, Fore, Aft, Exp);
+      Put (Win, ')');
+   end Put;
+
+   procedure Put
+     (Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Complex_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm new file mode 100644 index 00000000..ac7607eb --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm @@ -0,0 +1,89 @@ + + + +terminal_interface-curses-text_io-complex_io.ads + + + + +

File : terminal_interface-curses-text_io-complex_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Complex_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Numerics.Generic_Complex_Types;
+
+generic
+   with package Complex_Types is new Ada.Numerics.Generic_Complex_Types (<>);
+
+package Terminal_Interface.Curses.Text_IO.Complex_IO is
+
+   use Complex_Types;
+
+   Default_Fore : Field := 2;
+   Default_Aft  : Field := Real'Digits - 1;
+   Default_Exp  : Field := 3;
+
+   procedure Put
+     (Win  : Window;
+      Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Complex;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Complex_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm new file mode 100644 index 00000000..7977d76d --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm @@ -0,0 +1,94 @@ + + + +terminal_interface-curses-text_io-decimal_io.adb + + + + +

File : terminal_interface-curses-text_io-decimal_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Decimal_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Decimal_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package DIO is new Ada.Text_IO.Decimal_IO (Num);
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+      Buf : String (1 .. Field'Last);
+      Len : Field := Fore + 1 + Aft;
+   begin
+      if Exp > 0 then
+         Len := Len + 1 + Exp;
+      end if;
+      DIO.Put (Buf, Item, Aft, Exp);
+      Aux.Put_Buf (Win, Buf, Len, False);
+   end Put;
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp) is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Decimal_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm new file mode 100644 index 00000000..727165e0 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm @@ -0,0 +1,85 @@ + + + +terminal_interface-curses-text_io-decimal_io.ads + + + + +

File : terminal_interface-curses-text_io-decimal_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Decimal_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is delta <> digits <>;
+
+package Terminal_Interface.Curses.Text_IO.Decimal_IO is
+
+   Default_Fore : Field := Num'Fore;
+   Default_Aft  : Field := Num'Aft;
+   Default_Exp  : Field := 0;
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Decimal_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm new file mode 100644 index 00000000..9d316057 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm @@ -0,0 +1,99 @@ + + + +terminal_interface-curses-text_io-enumeration_io.adb + + + + +

File : terminal_interface-curses-text_io-enumeration_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Text_IO.Enumeration_IO             --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Ada.Characters.Handling; use Ada.Characters.Handling;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Enumeration_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package EIO is new Ada.Text_IO.Enumeration_IO (Enum);
+
+   procedure Put
+     (Win   : Window;
+      Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting)
+   is
+      Buf  : String (1 .. Field'Last);
+      Tset : Ada.Text_IO.Type_Set;
+   begin
+      if Set /= Mixed_Case then
+         Tset := Ada.Text_IO.Type_Set'Val (Type_Set'Pos (Set));
+      else
+         Tset := Ada.Text_IO.Lower_Case;
+      end if;
+      EIO.Put (Buf, Item, Tset);
+      if Set = Mixed_Case then
+         Buf (Buf'First) := To_Upper (Buf (Buf'First));
+      end if;
+      Aux.Put_Buf (Win, Buf, Width, True, True);
+   end Put;
+
+   procedure Put
+     (Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting)
+   is
+   begin
+      Put (Get_Window, Item, Width, Set);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Enumeration_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm new file mode 100644 index 00000000..4f7bc7fc --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm @@ -0,0 +1,82 @@ + + + +terminal_interface-curses-text_io-enumeration_io.ads + + + + +

File : terminal_interface-curses-text_io-enumeration_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--             Terminal_Interface.Curses.Text_IO.Enumeration_IO             --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Enum is (<>);
+
+package Terminal_Interface.Curses.Text_IO.Enumeration_IO is
+
+   Default_Width : Field := 0;
+   Default_Setting : Type_Set := Mixed_Case;
+
+   procedure Put
+     (Win   : Window;
+      Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting);
+
+   procedure Put
+     (Item  : Enum;
+      Width : Field := Default_Width;
+      Set   : Type_Set := Default_Setting);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Enumeration_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm new file mode 100644 index 00000000..b14e73ec --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm @@ -0,0 +1,94 @@ + + + +terminal_interface-curses-text_io-fixed_io.adb + + + + +

File : terminal_interface-curses-text_io-fixed_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Fixed_IO                --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Fixed_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package FIXIO is new Ada.Text_IO.Fixed_IO (Num);
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+      Buf : String (1 .. Field'Last);
+      Len : Field := Fore + 1 + Aft;
+   begin
+      if Exp > 0 then
+         Len := Len + 1 + Exp;
+      end if;
+      FIXIO.Put (Buf, Item, Aft, Exp);
+      Aux.Put_Buf (Win, Buf, Len, False);
+   end Put;
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp) is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Fixed_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm new file mode 100644 index 00000000..abd2b999 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm @@ -0,0 +1,85 @@ + + + +terminal_interface-curses-text_io-fixed_io.ads + + + + +

File : terminal_interface-curses-text_io-fixed_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Fixed_IO                --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is delta <>;
+
+package Terminal_Interface.Curses.Text_IO.Fixed_IO is
+
+   Default_Fore : Field := Num'Fore;
+   Default_Aft  : Field := Num'Aft;
+   Default_Exp  : Field := 0;
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Fixed_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm new file mode 100644 index 00000000..a0ba64c5 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm @@ -0,0 +1,95 @@ + + + +terminal_interface-curses-text_io-float_io.adb + + + + +

File : terminal_interface-curses-text_io-float_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Float_IO                --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Float_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package FIO is new Ada.Text_IO.Float_IO (Num);
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+      Buf : String (1 .. Field'Last);
+      Len : Field := Fore + 1 + Aft;
+   begin
+      if Exp > 0 then
+         Len := Len + 1 + Exp;
+      end if;
+      FIO.Put (Buf, Item, Aft, Exp);
+      Aux.Put_Buf (Win, Buf, Len, False);
+   end Put;
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp)
+   is
+   begin
+      Put (Get_Window, Item, Fore, Aft, Exp);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Float_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm new file mode 100644 index 00000000..a4382f19 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm @@ -0,0 +1,85 @@ + + + +terminal_interface-curses-text_io-float_io.ads + + + + +

File : terminal_interface-curses-text_io-float_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                Terminal_Interface.Curses.Text_IO.Float_IO                --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is digits <>;
+
+package Terminal_Interface.Curses.Text_IO.Float_IO is
+
+   Default_Fore : Field := 2;
+   Default_Aft  : Field := Num'Digits - 1;
+   Default_Exp  : Field := 3;
+
+   procedure Put
+     (Win  : Window;
+      Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+   procedure Put
+     (Item : Num;
+      Fore : Field := Default_Fore;
+      Aft  : Field := Default_Aft;
+      Exp  : Field := Default_Exp);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Float_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm new file mode 100644 index 00000000..f158e334 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm @@ -0,0 +1,89 @@ + + + +terminal_interface-curses-text_io-integer_io.adb + + + + +

File : terminal_interface-curses-text_io-integer_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Integer_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Integer_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package IIO is new Ada.Text_IO.Integer_IO (Num);
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+      Buf : String (1 .. Field'Last);
+   begin
+      IIO.Put (Buf, Item, Base);
+      Aux.Put_Buf (Win, Buf, Width);
+   end Put;
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+   begin
+      Put (Get_Window, Item, Width, Base);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Integer_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm new file mode 100644 index 00000000..23239f69 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm @@ -0,0 +1,82 @@ + + + +terminal_interface-curses-text_io-integer_io.ads + + + + +

File : terminal_interface-curses-text_io-integer_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Integer_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is range <>;
+
+package Terminal_Interface.Curses.Text_IO.Integer_IO is
+
+   Default_Width : Field := Num'Width;
+   Default_Base  : Number_Base := 10;
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Integer_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm new file mode 100644 index 00000000..0645bb6e --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm @@ -0,0 +1,89 @@ + + + +terminal_interface-curses-text_io-modular_io.adb + + + + +

File : terminal_interface-curses-text_io-modular_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Modular_IO               --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Terminal_Interface.Curses.Text_IO.Aux;
+
+package body Terminal_Interface.Curses.Text_IO.Modular_IO is
+
+   package Aux renames Terminal_Interface.Curses.Text_IO.Aux;
+   package MIO is new Ada.Text_IO.Modular_IO (Num);
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+      Buf : String (1 .. Field'Last);
+   begin
+      MIO.Put (Buf, Item, Base);
+      Aux.Put_Buf (Win, Buf, Width);
+   end Put;
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base)
+   is
+   begin
+      Put (Get_Window, Item, Width, Base);
+   end Put;
+
+end Terminal_Interface.Curses.Text_IO.Modular_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm new file mode 100644 index 00000000..043ac0a3 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm @@ -0,0 +1,82 @@ + + + +terminal_interface-curses-text_io-modular_io.ads + + + + +

File : terminal_interface-curses-text_io-modular_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--               Terminal_Interface.Curses.Text_IO.Modular_IO               --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.13 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+generic
+   type Num is mod <>;
+
+package Terminal_Interface.Curses.Text_IO.Modular_IO is
+
+   Default_Width : Field := Num'Width;
+   Default_Base  : Number_Base := 10;
+
+   procedure Put
+     (Win   : Window;
+      Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+   procedure Put
+     (Item  : Num;
+      Width : Field := Default_Width;
+      Base  : Number_Base := Default_Base);
+
+private
+   pragma Inline (Put);
+
+end Terminal_Interface.Curses.Text_IO.Modular_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__adb.htm new file mode 100644 index 00000000..379760c0 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__adb.htm @@ -0,0 +1,357 @@ + + + +terminal_interface-curses-text_io.adb + + + + +

File : terminal_interface-curses-text_io.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Text_IO                    --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.23 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package body Terminal_Interface.Curses.Text_IO is
+
+   Default_Window : Window := Null_Window;
+
+   procedure Set_Window (Win : Window)
+   is
+   begin
+      Default_Window := Win;
+   end Set_Window;
+
+   function Get_Window return Window
+   is
+   begin
+      if Default_Window = Null_Window then
+         return Standard_Window;
+      else
+         return Default_Window;
+      end if;
+   end Get_Window;
+   pragma Inline (Get_Window);
+
+   procedure Flush (Win : Window)
+   is
+   begin
+      Refresh (Win);
+   end Flush;
+
+   procedure Flush
+   is
+   begin
+      Flush (Get_Window);
+   end Flush;
+
+   --------------------------------------------
+   -- Specification of line and page lengths --
+   --------------------------------------------
+
+   --  There are no set routines in this package. I assume, that you allocate
+   --  the window with an appropriate size.
+   --  A scroll-window is interpreted as an page with unbounded page length,
+   --  i.e. it returns the conventional 0 as page length.
+
+   function Line_Length (Win : Window) return Count
+   is
+      N_Lines : Line_Count;
+      N_Cols  : Column_Count;
+   begin
+      Get_Size (Win, N_Lines, N_Cols);
+      --  if Natural (N_Cols) > Natural (Count'Last) then
+      --     raise Layout_Error;
+      --  end if;
+      return Count (N_Cols);
+   end Line_Length;
+
+   function Line_Length return Count
+   is
+   begin
+      return Line_Length (Get_Window);
+   end Line_Length;
+
+   function Page_Length (Win : Window) return Count
+   is
+      N_Lines : Line_Count;
+      N_Cols  : Column_Count;
+   begin
+      if Scrolling_Allowed (Win) then
+         return 0;
+      else
+         Get_Size (Win, N_Lines, N_Cols);
+         --  if Natural (N_Lines) > Natural (Count'Last) then
+         --     raise Layout_Error;
+         --  end if;
+         return Count (N_Lines);
+      end if;
+   end Page_Length;
+
+   function Page_Length return Count
+   is
+   begin
+      return Page_Length (Get_Window);
+   end Page_Length;
+
+   ------------------------------------
+   -- Column, Line, and Page Control --
+   ------------------------------------
+   procedure New_Line (Win : Window; Spacing : Positive_Count := 1)
+   is
+      P_Size : constant Count := Page_Length (Win);
+   begin
+      if not Spacing'Valid then
+         raise Constraint_Error;
+      end if;
+
+      for I in 1 .. Spacing loop
+         if P_Size > 0 and then Line (Win) >= P_Size then
+            New_Page (Win);
+         else
+            Add (Win, ASCII.LF);
+         end if;
+      end loop;
+   end New_Line;
+
+   procedure New_Line (Spacing : Positive_Count := 1)
+   is
+   begin
+      New_Line (Get_Window, Spacing);
+   end New_Line;
+
+   procedure New_Page (Win : Window)
+   is
+   begin
+      Clear (Win);
+   end New_Page;
+
+   procedure New_Page
+   is
+   begin
+      New_Page (Get_Window);
+   end New_Page;
+
+   procedure Set_Col (Win : Window;  To : Positive_Count)
+   is
+      Y  : Line_Position;
+      X1 : Column_Position;
+      X2 : Column_Position;
+      N  : Natural;
+   begin
+      if not To'Valid then
+         raise Constraint_Error;
+      end if;
+
+      Get_Cursor_Position (Win, Y, X1);
+      N  := Natural (To); N := N - 1;
+      X2 := Column_Position (N);
+      if X1 > X2 then
+         New_Line (Win, 1);
+         X1 := 0;
+      end if;
+      if X1 < X2 then
+         declare
+            Filler : constant String (Integer (X1) .. (Integer (X2) - 1))
+              := (others => ' ');
+         begin
+            Put (Win, Filler);
+         end;
+      end if;
+   end Set_Col;
+
+   procedure Set_Col (To : Positive_Count)
+   is
+   begin
+      Set_Col (Get_Window, To);
+   end Set_Col;
+
+   procedure Set_Line (Win : Window; To : Positive_Count)
+   is
+      Y1 : Line_Position;
+      Y2 : Line_Position;
+      X  : Column_Position;
+      N  : Natural;
+   begin
+      if not To'Valid then
+         raise Constraint_Error;
+      end if;
+
+      Get_Cursor_Position (Win, Y1, X);
+      pragma Warnings (Off, X);         --  unreferenced
+      N  := Natural (To); N := N - 1;
+      Y2 := Line_Position (N);
+      if Y2 < Y1 then
+         New_Page (Win);
+         Y1 := 0;
+      end if;
+      if Y1 < Y2 then
+         New_Line (Win, Positive_Count (Y2 - Y1));
+      end if;
+   end Set_Line;
+
+   procedure Set_Line (To : Positive_Count)
+   is
+   begin
+      Set_Line (Get_Window, To);
+   end Set_Line;
+
+   function Col (Win : Window) return Positive_Count
+   is
+      Y : Line_Position;
+      X : Column_Position;
+      N : Natural;
+   begin
+      Get_Cursor_Position (Win, Y, X);
+      N := Natural (X); N := N + 1;
+      --  if N > Natural (Count'Last) then
+      --     raise Layout_Error;
+      --  end if;
+      return Positive_Count (N);
+   end Col;
+
+   function Col return Positive_Count
+   is
+   begin
+      return Col (Get_Window);
+   end Col;
+
+   function Line (Win : Window) return Positive_Count
+   is
+      Y : Line_Position;
+      X : Column_Position;
+      N : Natural;
+   begin
+      Get_Cursor_Position (Win, Y, X);
+      N := Natural (Y); N := N + 1;
+      --  if N > Natural (Count'Last) then
+      --     raise Layout_Error;
+      --  end if;
+      return Positive_Count (N);
+   end Line;
+
+   function Line return Positive_Count
+   is
+   begin
+      return Line (Get_Window);
+   end Line;
+
+   -----------------------
+   -- Characters Output --
+   -----------------------
+
+   procedure Put (Win  : Window; Item : Character)
+   is
+      P_Size : constant Count := Page_Length (Win);
+      Y : Line_Position;
+      X : Column_Position;
+      L : Line_Count;
+      C : Column_Count;
+   begin
+      if P_Size > 0 then
+         Get_Cursor_Position (Win, Y, X);
+         Get_Size (Win, L, C);
+         if (Y + 1) = L and then (X + 1) = C then
+            New_Page (Win);
+         end if;
+      end if;
+      Add (Win, Item);
+   end Put;
+
+   procedure Put (Item : Character)
+   is
+   begin
+      Put (Get_Window, Item);
+   end Put;
+
+   --------------------
+   -- Strings-Output --
+   --------------------
+
+   procedure Put (Win  : Window; Item : String)
+   is
+      P_Size : constant Count := Page_Length (Win);
+      Y : Line_Position;
+      X : Column_Position;
+      L : Line_Count;
+      C : Column_Count;
+   begin
+      if P_Size > 0 then
+         Get_Cursor_Position (Win, Y, X);
+         Get_Size (Win, L, C);
+         if (Y + 1) = L and then (X + 1 + Item'Length) >= C then
+            New_Page (Win);
+         end if;
+      end if;
+      Add (Win, Item);
+   end Put;
+
+   procedure Put (Item : String)
+   is
+   begin
+      Put (Get_Window, Item);
+   end Put;
+
+   procedure Put_Line
+     (Win  : Window;
+      Item : String)
+   is
+   begin
+      Put (Win, Item);
+      New_Line (Win, 1);
+   end Put_Line;
+
+   procedure Put_Line
+     (Item : String)
+   is
+   begin
+      Put_Line (Get_Window, Item);
+   end Put_Line;
+
+end Terminal_Interface.Curses.Text_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__ads.htm new file mode 100644 index 00000000..580dd824 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-text_io__ads.htm @@ -0,0 +1,155 @@ + + + +terminal_interface-curses-text_io.ads + + + + +

File : terminal_interface-curses-text_io.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                     Terminal_Interface.Curses.Text_IO                    --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2009 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Ada.Text_IO;
+with Ada.IO_Exceptions;
+
+package Terminal_Interface.Curses.Text_IO is
+
+   use type Ada.Text_IO.Count;
+   subtype Count is Ada.Text_IO.Count;
+   subtype Positive_Count is Count range 1 .. Count'Last;
+
+   subtype Field is Ada.Text_IO.Field;
+   subtype Number_Base is Integer range 2 .. 16;
+
+   type Type_Set is (Lower_Case, Upper_Case, Mixed_Case);
+
+   --  For most of the routines you will see a version without a Window
+   --  type parameter. They will operate on a default window, which can
+   --  be set by the user. It is initially equal to Standard_Window.
+
+   procedure Set_Window (Win : Window);
+   --  Set Win as the default window
+
+   function Get_Window return Window;
+   --  Get the current default window
+
+   procedure Flush (Win : Window);
+   procedure Flush;
+
+   --------------------------------------------
+   -- Specification of line and page lengths --
+   --------------------------------------------
+
+   --  There are no set routines in this package. I assume, that you allocate
+   --  the window with an appropriate size.
+   --  A scroll-window is interpreted as an page with unbounded page length,
+   --  i.e. it returns the conventional 0 as page length.
+
+   function Line_Length (Win : Window) return Count;
+   function Line_Length return Count;
+
+   function Page_Length (Win : Window) return Count;
+   function Page_Length return Count;
+
+   ------------------------------------
+   -- Column, Line, and Page Control --
+   ------------------------------------
+   procedure New_Line (Win : Window; Spacing : Positive_Count := 1);
+   procedure New_Line (Spacing : Positive_Count := 1);
+
+   procedure New_Page (Win : Window);
+   procedure New_Page;
+
+   procedure Set_Col (Win : Window;  To : Positive_Count);
+   procedure Set_Col (To : Positive_Count);
+
+   procedure Set_Line (Win : Window; To : Positive_Count);
+   procedure Set_Line (To : Positive_Count);
+
+   function Col (Win : Window) return Positive_Count;
+   function Col return Positive_Count;
+
+   function Line (Win : Window) return Positive_Count;
+   function Line return Positive_Count;
+
+   -----------------------
+   -- Characters-Output --
+   -----------------------
+
+   procedure Put (Win  : Window; Item : Character);
+   procedure Put (Item : Character);
+
+   --------------------
+   -- Strings-Output --
+   --------------------
+
+   procedure Put (Win  : Window; Item : String);
+   procedure Put (Item : String);
+
+   procedure Put_Line
+     (Win  : Window;
+      Item : String);
+
+   procedure Put_Line
+     (Item : String);
+
+   --  Exceptions
+
+   Status_Error : exception renames Ada.IO_Exceptions.Status_Error;
+   Mode_Error   : exception renames Ada.IO_Exceptions.Mode_Error;
+   Name_Error   : exception renames Ada.IO_Exceptions.Name_Error;
+   Use_Error    : exception renames Ada.IO_Exceptions.Use_Error;
+   Device_Error : exception renames Ada.IO_Exceptions.Device_Error;
+   End_Error    : exception renames Ada.IO_Exceptions.End_Error;
+   Data_Error   : exception renames Ada.IO_Exceptions.Data_Error;
+   Layout_Error : exception renames Ada.IO_Exceptions.Layout_Error;
+
+end Terminal_Interface.Curses.Text_IO;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__adb.htm new file mode 100644 index 00000000..05455ee8 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__adb.htm @@ -0,0 +1,79 @@ + + + +terminal_interface-curses-trace.adb + + + + +

File : terminal_interface-curses-trace.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Trace                     --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2001-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.12 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with Interfaces.C; use Interfaces.C;
+
+package body Terminal_Interface.Curses.Trace is
+
+   procedure Trace_On (x : Trace_Attribute_Set) is
+      procedure traceC (y : Trace_Attribute_Set);
+      pragma Import (C, traceC, "trace");
+   begin
+      traceC (x);
+   end Trace_On;
+
+   procedure Trace_Put (str : String) is
+      procedure tracef (format : char_array; s : char_array);
+      pragma Import (C, tracef, "_traces");
+      --  _traces() is defined in c_varargs_to_ada.h
+   begin
+      tracef (To_C ("%s"), To_C (str));
+   end Trace_Put;
+
+end Terminal_Interface.Curses.Trace;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__ads.htm new file mode 100644 index 00000000..43695163 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses-trace__ads.htm @@ -0,0 +1,143 @@ + + + +terminal_interface-curses-trace.ads + + + + +

File : terminal_interface-curses-trace.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                      Terminal_Interface.Curses.Trace                     --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 2000,2014 Free Software Foundation, Inc.                       --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
+--  Version Control:
+--  @Revision: 1.5 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+
+package Terminal_Interface.Curses.Trace is
+   pragma Preelaborate (Terminal_Interface.Curses.Trace);
+
+   type Trace_Attribute_Set is
+      record
+         Times            : Boolean;
+         Tputs            : Boolean;
+         Update           : Boolean;
+         Cursor_Move      : Boolean;
+         Character_Output : Boolean;
+         Calls            : Boolean;
+         Virtual_Puts     : Boolean;
+         Input_Events     : Boolean;
+         TTY_State        : Boolean;
+         Internal_Calls   : Boolean;
+         Character_Calls  : Boolean;
+         Termcap_TermInfo : Boolean;
+         Attribute_Color  : Boolean;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Trace_Attribute_Set);
+
+   for Trace_Attribute_Set use
+      record
+         Times            at 0 range Curses_Constants.TRACE_TIMES_First
+           .. Curses_Constants.TRACE_TIMES_Last;
+         Tputs            at 0 range Curses_Constants.TRACE_TPUTS_First
+           .. Curses_Constants.TRACE_TPUTS_Last;
+         Update           at 0 range Curses_Constants.TRACE_UPDATE_First
+           .. Curses_Constants.TRACE_UPDATE_Last;
+         Cursor_Move      at 0 range Curses_Constants.TRACE_MOVE_First
+           .. Curses_Constants.TRACE_MOVE_Last;
+         Character_Output at 0 range Curses_Constants.TRACE_CHARPUT_First
+           .. Curses_Constants.TRACE_CHARPUT_Last;
+         Calls            at 0 range Curses_Constants.TRACE_CALLS_First
+           .. Curses_Constants.TRACE_CALLS_Last;
+         Virtual_Puts     at 0 range Curses_Constants.TRACE_VIRTPUT_First
+           .. Curses_Constants.TRACE_VIRTPUT_Last;
+         Input_Events     at 0 range Curses_Constants.TRACE_IEVENT_First
+           .. Curses_Constants.TRACE_IEVENT_Last;
+         TTY_State        at 0 range Curses_Constants.TRACE_BITS_First
+           .. Curses_Constants.TRACE_BITS_Last;
+         Internal_Calls   at 0 range Curses_Constants.TRACE_ICALLS_First
+           .. Curses_Constants.TRACE_ICALLS_Last;
+         Character_Calls  at 0 range Curses_Constants.TRACE_CCALLS_First
+           .. Curses_Constants.TRACE_CCALLS_Last;
+         Termcap_TermInfo at 0 range Curses_Constants.TRACE_DATABASE_First
+           .. Curses_Constants.TRACE_DATABASE_Last;
+         Attribute_Color  at 0 range Curses_Constants.TRACE_ATTRS_First
+           .. Curses_Constants.TRACE_ATTRS_Last;
+      end record;
+   pragma Warnings (Off);
+   for Trace_Attribute_Set'Size use Curses_Constants.Trace_Size;
+   pragma Warnings (On);
+
+   Trace_Disable  : constant Trace_Attribute_Set := (others => False);
+
+   Trace_Ordinary : constant Trace_Attribute_Set :=
+     (Times            => True,
+      Tputs            => True,
+      Update           => True,
+      Cursor_Move      => True,
+      Character_Output => True,
+      others           => False);
+   Trace_Maximum : constant Trace_Attribute_Set := (others => True);
+
+------------------------------------------------------------------------------
+
+   --  |=====================================================================
+   --  | Man page curs_trace.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Trace_On (x : Trace_Attribute_Set);
+   --  The debugging library has trace.
+
+   --  |
+   procedure Trace_Put (str : String);
+   --  AKA: _tracef()
+
+   Current_Trace_Setting : Trace_Attribute_Set;
+   pragma Import (C, Current_Trace_Setting, "_nc_tracing");
+
+end Terminal_Interface.Curses.Trace;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses__adb.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses__adb.htm new file mode 100644 index 00000000..1f5e7c3e --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses__adb.htm @@ -0,0 +1,2575 @@ + + + +terminal_interface-curses.adb + + + + +

File : terminal_interface-curses.adb


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                        Terminal_Interface.Curses                         --
+--                                                                          --
+--                                 B O D Y                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2018-2020,2024 Thomas E. Dickey                                --
+-- Copyright 2007-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author: Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.17 @
+--  @Date: 2024/03/30 13:24:07 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System;
+
+with Terminal_Interface.Curses.Aux;
+with Interfaces.C;                  use Interfaces.C;
+with Interfaces.C.Strings;          use Interfaces.C.Strings;
+with Ada.Characters.Handling;       use Ada.Characters.Handling;
+with Ada.Strings.Fixed;
+
+package body Terminal_Interface.Curses is
+
+   use Aux;
+
+   package ASF renames Ada.Strings.Fixed;
+
+   type chtype_array is array (size_t range <>)
+      of aliased Attributed_Character;
+   pragma Convention (C, chtype_array);
+
+------------------------------------------------------------------------------
+   function Key_Name (Key : Real_Key_Code) return String
+   is
+      function Keyname (K : C_Int) return chars_ptr;
+      pragma Import (C, Keyname, "keyname");
+
+      Ch : Character;
+   begin
+      if Key <= Character'Pos (Character'Last) then
+         Ch := Character'Val (Key);
+         if Is_Control (Ch) then
+            return Un_Control (Attributed_Character'(Ch    => Ch,
+                                                     Color => Color_Pair'First,
+                                                     Attr  => Normal_Video));
+         elsif Is_Graphic (Ch) then
+            declare
+               S : String (1 .. 1);
+            begin
+               S (1) := Ch;
+               return S;
+            end;
+         else
+            return "";
+         end if;
+      else
+         return Fill_String (Keyname (C_Int (Key)));
+      end if;
+   end Key_Name;
+
+   procedure Key_Name (Key  :  Real_Key_Code;
+                       Name : out String)
+   is
+   begin
+      ASF.Move (Key_Name (Key), Name);
+   end Key_Name;
+
+------------------------------------------------------------------------------
+   procedure Init_Screen
+   is
+      function Initscr return Window;
+      pragma Import (C, Initscr, "initscr");
+
+      W : Window;
+   begin
+      W := Initscr;
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+   end Init_Screen;
+
+   procedure End_Windows
+   is
+      function Endwin return C_Int;
+      pragma Import (C, Endwin, "endwin");
+   begin
+      if Endwin = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end End_Windows;
+
+   function Is_End_Window return Boolean
+   is
+      function Isendwin return Curses_Bool;
+      pragma Import (C, Isendwin, "isendwin");
+   begin
+      if Isendwin = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_End_Window;
+------------------------------------------------------------------------------
+   procedure Move_Cursor (Win    : Window := Standard_Window;
+                          Line   : Line_Position;
+                          Column : Column_Position)
+   is
+      function Wmove (Win    : Window;
+                      Line   : C_Int;
+                      Column : C_Int
+                     ) return C_Int;
+      pragma Import (C, Wmove, "wmove");
+   begin
+      if Wmove (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Move_Cursor;
+------------------------------------------------------------------------------
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Attributed_Character)
+   is
+      function Waddch (W  : Window;
+                       Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Waddch, "waddch");
+   begin
+      if Waddch (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Character)
+   is
+   begin
+      Add (Win,
+           Attributed_Character'(Ch    => Ch,
+                                 Color => Color_Pair'First,
+                                 Attr  => Normal_Video));
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Attributed_Character)
+   is
+      function mvwaddch (W  : Window;
+                         Y  : C_Int;
+                         X  : C_Int;
+                         Ch : Attributed_Character) return C_Int;
+      pragma Import (C, mvwaddch, "mvwaddch");
+   begin
+      if mvwaddch (Win, C_Int (Line),
+                   C_Int (Column),
+                   Ch) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Character)
+   is
+   begin
+      Add (Win,
+           Line,
+           Column,
+           Attributed_Character'(Ch    => Ch,
+                                 Color => Color_Pair'First,
+                                 Attr  => Normal_Video));
+   end Add;
+
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character)
+   is
+      function Wechochar (W  : Window;
+                          Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Wechochar, "wechochar");
+   begin
+      if Wechochar (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add_With_Immediate_Echo;
+
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Character)
+   is
+   begin
+      Add_With_Immediate_Echo
+        (Win,
+         Attributed_Character'(Ch    => Ch,
+                               Color => Color_Pair'First,
+                               Attr  => Normal_Video));
+   end Add_With_Immediate_Echo;
+------------------------------------------------------------------------------
+   function Create (Number_Of_Lines       : Line_Count;
+                    Number_Of_Columns     : Column_Count;
+                    First_Line_Position   : Line_Position;
+                    First_Column_Position : Column_Position) return Window
+   is
+      function Newwin (Number_Of_Lines       : C_Int;
+                       Number_Of_Columns     : C_Int;
+                       First_Line_Position   : C_Int;
+                       First_Column_Position : C_Int) return Window;
+      pragma Import (C, Newwin, "newwin");
+
+      W : Window;
+   begin
+      W := Newwin (C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Create;
+
+   procedure Delete (Win : in out Window)
+   is
+      function Wdelwin (W : Window) return C_Int;
+      pragma Import (C, Wdelwin, "delwin");
+   begin
+      if Wdelwin (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      Win := Null_Window;
+   end Delete;
+
+   function Sub_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+   is
+      function Subwin
+        (Win                   : Window;
+         Number_Of_Lines       : C_Int;
+         Number_Of_Columns     : C_Int;
+         First_Line_Position   : C_Int;
+         First_Column_Position : C_Int) return Window;
+      pragma Import (C, Subwin, "subwin");
+
+      W : Window;
+   begin
+      W := Subwin (Win,
+                   C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Sub_Window;
+
+   function Derived_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+   is
+      function Derwin
+        (Win                   : Window;
+         Number_Of_Lines       : C_Int;
+         Number_Of_Columns     : C_Int;
+         First_Line_Position   : C_Int;
+         First_Column_Position : C_Int) return Window;
+      pragma Import (C, Derwin, "derwin");
+
+      W : Window;
+   begin
+      W := Derwin (Win,
+                   C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Derived_Window;
+
+   function Duplicate (Win : Window) return Window
+   is
+      function Dupwin (Win : Window) return Window;
+      pragma Import (C, Dupwin, "dupwin");
+
+      W : constant Window := Dupwin (Win);
+   begin
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Duplicate;
+
+   procedure Move_Window (Win    : Window;
+                          Line   : Line_Position;
+                          Column : Column_Position)
+   is
+      function Mvwin (Win    : Window;
+                      Line   : C_Int;
+                      Column : C_Int) return C_Int;
+      pragma Import (C, Mvwin, "mvwin");
+   begin
+      if Mvwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Move_Window;
+
+   procedure Move_Derived_Window (Win    : Window;
+                                  Line   : Line_Position;
+                                  Column : Column_Position)
+   is
+      function Mvderwin (Win    : Window;
+                         Line   : C_Int;
+                         Column : C_Int) return C_Int;
+      pragma Import (C, Mvderwin, "mvderwin");
+   begin
+      if Mvderwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Move_Derived_Window;
+
+   procedure Set_Synch_Mode (Win  : Window  := Standard_Window;
+                             Mode : Boolean := False)
+   is
+      function Syncok (Win  : Window;
+                       Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Syncok, "syncok");
+   begin
+      if Syncok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Synch_Mode;
+------------------------------------------------------------------------------
+   procedure Add (Win : Window := Standard_Window;
+                  Str : String;
+                  Len : Integer := -1)
+   is
+      function Waddnstr (Win : Window;
+                         Str : char_array;
+                         Len : C_Int := -1) return C_Int;
+      pragma Import (C, Waddnstr, "waddnstr");
+
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+   begin
+      To_C (Str, Txt, Length);
+      if Waddnstr (Win, Txt, C_Int (Len)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Str    : String;
+      Len    : Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Add (Win, Str, Len);
+   end Add;
+------------------------------------------------------------------------------
+   procedure Add
+     (Win : Window := Standard_Window;
+      Str : Attributed_String;
+      Len : Integer := -1)
+   is
+      function Waddchnstr (Win : Window;
+                           Str : chtype_array;
+                           Len : C_Int := -1) return C_Int;
+      pragma Import (C, Waddchnstr, "waddchnstr");
+
+      Txt : chtype_array (0 .. Str'Length);
+   begin
+      for Length in 1 .. size_t (Str'Length) loop
+         Txt (Length - 1) := Str (Natural (Length));
+      end loop;
+      Txt (Str'Length) := Default_Character;
+      if Waddchnstr (Win,
+                     Txt,
+                     C_Int (Len)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Add;
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Str    : Attributed_String;
+      Len    : Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Add (Win, Str, Len);
+   end Add;
+------------------------------------------------------------------------------
+   procedure Border
+     (Win                       : Window := Standard_Window;
+      Left_Side_Symbol          : Attributed_Character := Default_Character;
+      Right_Side_Symbol         : Attributed_Character := Default_Character;
+      Top_Side_Symbol           : Attributed_Character := Default_Character;
+      Bottom_Side_Symbol        : Attributed_Character := Default_Character;
+      Upper_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Upper_Right_Corner_Symbol : Attributed_Character := Default_Character;
+      Lower_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Lower_Right_Corner_Symbol : Attributed_Character := Default_Character)
+   is
+      function Wborder (W   : Window;
+                        LS  : Attributed_Character;
+                        RS  : Attributed_Character;
+                        TS  : Attributed_Character;
+                        BS  : Attributed_Character;
+                        ULC : Attributed_Character;
+                        URC : Attributed_Character;
+                        LLC : Attributed_Character;
+                        LRC : Attributed_Character) return C_Int;
+      pragma Import (C, Wborder, "wborder");
+   begin
+      if Wborder (Win,
+                  Left_Side_Symbol,
+                  Right_Side_Symbol,
+                  Top_Side_Symbol,
+                  Bottom_Side_Symbol,
+                  Upper_Left_Corner_Symbol,
+                  Upper_Right_Corner_Symbol,
+                  Lower_Left_Corner_Symbol,
+                  Lower_Right_Corner_Symbol) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Border;
+
+   procedure Box
+     (Win               : Window := Standard_Window;
+      Vertical_Symbol   : Attributed_Character := Default_Character;
+      Horizontal_Symbol : Attributed_Character := Default_Character)
+   is
+   begin
+      Border (Win,
+              Vertical_Symbol, Vertical_Symbol,
+              Horizontal_Symbol, Horizontal_Symbol);
+   end Box;
+
+   procedure Horizontal_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character)
+   is
+      function Whline (W   : Window;
+                       Ch  : Attributed_Character;
+                       Len : C_Int) return C_Int;
+      pragma Import (C, Whline, "whline");
+   begin
+      if Whline (Win,
+                 Line_Symbol,
+                 C_Int (Line_Size)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Horizontal_Line;
+
+   procedure Vertical_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character)
+   is
+      function Wvline (W   : Window;
+                       Ch  : Attributed_Character;
+                       Len : C_Int) return C_Int;
+      pragma Import (C, Wvline, "wvline");
+   begin
+      if Wvline (Win,
+                 Line_Symbol,
+                 C_Int (Line_Size)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Vertical_Line;
+
+------------------------------------------------------------------------------
+   function Get_Keystroke (Win : Window := Standard_Window)
+     return Real_Key_Code
+   is
+      function Wgetch (W : Window) return C_Int;
+      pragma Import (C, Wgetch, "wgetch");
+
+      C : constant C_Int := Wgetch (Win);
+   begin
+      if C = Curses_Err then
+         return Key_None;
+      else
+         return Real_Key_Code (C);
+      end if;
+   end Get_Keystroke;
+
+   procedure Undo_Keystroke (Key : Real_Key_Code)
+   is
+      function Ungetch (Ch : C_Int) return C_Int;
+      pragma Import (C, Ungetch, "ungetch");
+   begin
+      if Ungetch (C_Int (Key)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Undo_Keystroke;
+
+   function Has_Key (Key : Special_Key_Code) return Boolean
+   is
+      function Haskey (Key : C_Int) return C_Int;
+      pragma Import (C, Haskey, "has_key");
+   begin
+      if Haskey (C_Int (Key)) = Curses_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Key;
+
+   function Is_Function_Key (Key : Special_Key_Code) return Boolean
+   is
+      L : constant Special_Key_Code  := Special_Key_Code (Natural (Key_F0) +
+        Natural (Function_Key_Number'Last));
+   begin
+      if Key >= Key_F0 and then Key <= L then
+         return True;
+      else
+         return False;
+      end if;
+   end Is_Function_Key;
+
+   function Function_Key (Key : Real_Key_Code)
+                          return Function_Key_Number
+   is
+   begin
+      if Is_Function_Key (Key) then
+         return Function_Key_Number (Key - Key_F0);
+      else
+         raise Constraint_Error;
+      end if;
+   end Function_Key;
+
+   function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code
+   is
+   begin
+      return Real_Key_Code (Natural (Key_F0) + Natural (Key));
+   end Function_Key_Code;
+------------------------------------------------------------------------------
+   procedure Standout (Win : Window  := Standard_Window;
+                       On  : Boolean := True)
+   is
+      function wstandout (Win : Window) return C_Int;
+      pragma Import (C, wstandout, "wstandout");
+      function wstandend (Win : Window) return C_Int;
+      pragma Import (C, wstandend, "wstandend");
+
+      Err : C_Int;
+   begin
+      if On then
+         Err := wstandout (Win);
+      else
+         Err := wstandend (Win);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Standout;
+
+   procedure Switch_Character_Attribute
+     (Win  : Window := Standard_Window;
+      Attr : Character_Attribute_Set := Normal_Video;
+      On   : Boolean := True)
+   is
+      function Wattron (Win    : Window;
+                        C_Attr : Attributed_Character) return C_Int;
+      pragma Import (C, Wattron, "wattr_on");
+      function Wattroff (Win    : Window;
+                         C_Attr : Attributed_Character) return C_Int;
+      pragma Import (C, Wattroff, "wattr_off");
+      --  In Ada we use the On Boolean to control whether or not we want to
+      --  switch on or off the attributes in the set.
+      Err : C_Int;
+      AC  : constant Attributed_Character := (Ch    => Character'First,
+                                              Color => Color_Pair'First,
+                                              Attr  => Attr);
+   begin
+      if On then
+         Err := Wattron  (Win, AC);
+      else
+         Err := Wattroff (Win, AC);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Switch_Character_Attribute;
+
+   procedure Set_Character_Attributes
+     (Win   : Window := Standard_Window;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Wattrset (Win    : Window;
+                         C_Attr : Attributed_Character) return C_Int;
+      pragma Import (C, Wattrset, "wattrset"); -- ??? wattr_set
+   begin
+      if Wattrset (Win, (Ch => Character'First,
+                         Color => Color,
+                         Attr => Attr)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Character_Attributes;
+
+   function Get_Character_Attribute (Win : Window := Standard_Window)
+                                     return Character_Attribute_Set
+   is
+      function Wattrget (Win : Window;
+                         Atr : access Attributed_Character;
+                         Col : access C_Short;
+                         Opt : System.Address) return C_Int;
+      pragma Import (C, Wattrget, "wattr_get");
+
+      Attr : aliased Attributed_Character;
+      Col  : aliased C_Short;
+      Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
+                                         System.Null_Address);
+   begin
+      if Res = Curses_Ok then
+         return Attr.Attr;
+      else
+         raise Curses_Exception;
+      end if;
+   end Get_Character_Attribute;
+
+   function Get_Character_Attribute (Win : Window := Standard_Window)
+                                     return Color_Pair
+   is
+      function Wattrget (Win : Window;
+                         Atr : access Attributed_Character;
+                         Col : access C_Short;
+                         Opt : System.Address) return C_Int;
+      pragma Import (C, Wattrget, "wattr_get");
+
+      Attr : aliased Attributed_Character;
+      Col  : aliased C_Short;
+      Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
+                                         System.Null_Address);
+   begin
+      if Res = Curses_Ok then
+         return Attr.Color;
+      else
+         raise Curses_Exception;
+      end if;
+   end Get_Character_Attribute;
+
+   procedure Set_Color (Win  : Window := Standard_Window;
+                        Pair : Color_Pair)
+   is
+      function Wset_Color (Win   : Window;
+                           Color : C_Short;
+                           Opts  : C_Void_Ptr) return C_Int;
+      pragma Import (C, Wset_Color, "wcolor_set");
+   begin
+      if Wset_Color (Win,
+                     C_Short (Pair),
+                     C_Void_Ptr (System.Null_Address)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Color;
+
+   procedure Change_Attributes
+     (Win   : Window := Standard_Window;
+      Count : Integer := -1;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Wchgat (Win   : Window;
+                       Cnt   : C_Int;
+                       Attr  : Attributed_Character;
+                       Color : C_Short;
+                       Opts  : System.Address := System.Null_Address)
+                       return C_Int;
+      pragma Import (C, Wchgat, "wchgat");
+   begin
+      if Wchgat (Win,
+                 C_Int (Count),
+                 (Ch => Character'First,
+                  Color => Color_Pair'First,
+                  Attr => Attr),
+                 C_Short (Color)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Change_Attributes;
+
+   procedure Change_Attributes
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position := Line_Position'First;
+      Column : Column_Position := Column_Position'First;
+      Count  : Integer := -1;
+      Attr   : Character_Attribute_Set := Normal_Video;
+      Color  : Color_Pair := Color_Pair'First)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Change_Attributes (Win, Count, Attr, Color);
+   end Change_Attributes;
+------------------------------------------------------------------------------
+   procedure Beep
+   is
+      function Beeper return C_Int;
+      pragma Import (C, Beeper, "beep");
+   begin
+      if Beeper = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Beep;
+
+   procedure Flash_Screen
+   is
+      function Flash return C_Int;
+      pragma Import (C, Flash, "flash");
+   begin
+      if Flash = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Flash_Screen;
+------------------------------------------------------------------------------
+   procedure Set_Cbreak_Mode (SwitchOn : Boolean := True)
+   is
+      function Cbreak return C_Int;
+      pragma Import (C, Cbreak, "cbreak");
+      function NoCbreak return C_Int;
+      pragma Import (C, NoCbreak, "nocbreak");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := Cbreak;
+      else
+         Err := NoCbreak;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Cbreak_Mode;
+
+   procedure Set_Raw_Mode (SwitchOn : Boolean := True)
+   is
+      function Raw return C_Int;
+      pragma Import (C, Raw, "raw");
+      function NoRaw return C_Int;
+      pragma Import (C, NoRaw, "noraw");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := Raw;
+      else
+         Err := NoRaw;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Raw_Mode;
+
+   procedure Set_Echo_Mode (SwitchOn : Boolean := True)
+   is
+      function Echo return C_Int;
+      pragma Import (C, Echo, "echo");
+      function NoEcho return C_Int;
+      pragma Import (C, NoEcho, "noecho");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := Echo;
+      else
+         Err := NoEcho;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Echo_Mode;
+
+   procedure Set_Meta_Mode (Win      : Window := Standard_Window;
+                            SwitchOn : Boolean := True)
+   is
+      function Meta (W : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Meta, "meta");
+   begin
+      if Meta (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Meta_Mode;
+
+   procedure Set_KeyPad_Mode (Win      : Window := Standard_Window;
+                              SwitchOn : Boolean := True)
+   is
+      function Keypad (W : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Keypad, "keypad");
+   begin
+      if Keypad (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_KeyPad_Mode;
+
+   function Get_KeyPad_Mode (Win : Window := Standard_Window)
+                             return Boolean
+   is
+      function Is_Keypad (W : Window) return Curses_Bool;
+      pragma Import (C, Is_Keypad, "is_keypad");
+   begin
+      return (Is_Keypad (Win) /= Curses_Bool_False);
+   end Get_KeyPad_Mode;
+
+   procedure Half_Delay (Amount : Half_Delay_Amount)
+   is
+      function Halfdelay (Amount : C_Int) return C_Int;
+      pragma Import (C, Halfdelay, "halfdelay");
+   begin
+      if Halfdelay (C_Int (Amount)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Half_Delay;
+
+   procedure Set_Flush_On_Interrupt_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := True)
+   is
+      function Intrflush (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Intrflush, "intrflush");
+   begin
+      if Intrflush (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Flush_On_Interrupt_Mode;
+
+   procedure Set_Queue_Interrupt_Mode
+     (Win   : Window := Standard_Window;
+      Flush : Boolean := True)
+   is
+      procedure Qiflush;
+      pragma Import (C, Qiflush, "qiflush");
+      procedure No_Qiflush;
+      pragma Import (C, No_Qiflush, "noqiflush");
+   begin
+      if Win = Null_Window then
+         raise Curses_Exception;
+      end if;
+      if Flush then
+         Qiflush;
+      else
+         No_Qiflush;
+      end if;
+   end Set_Queue_Interrupt_Mode;
+
+   procedure Set_NoDelay_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False)
+   is
+      function Nodelay (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Nodelay, "nodelay");
+   begin
+      if Nodelay (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_NoDelay_Mode;
+
+   procedure Set_Timeout_Mode (Win    : Window := Standard_Window;
+                               Mode   : Timeout_Mode;
+                               Amount : Natural)
+   is
+      procedure Wtimeout (Win : Window; Amount : C_Int);
+      pragma Import (C, Wtimeout, "wtimeout");
+
+      Time : C_Int;
+   begin
+      case Mode is
+         when Blocking     => Time := -1;
+         when Non_Blocking => Time := 0;
+         when Delayed      =>
+            if Amount = 0 then
+               raise Constraint_Error;
+            end if;
+            Time := C_Int (Amount);
+      end case;
+      Wtimeout (Win, Time);
+   end Set_Timeout_Mode;
+
+   procedure Set_Escape_Timer_Mode
+     (Win       : Window := Standard_Window;
+      Timer_Off : Boolean := False)
+   is
+      function Notimeout (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Notimeout, "notimeout");
+   begin
+      if Notimeout (Win, Curses_Bool (Boolean'Pos (Timer_Off)))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Escape_Timer_Mode;
+
+------------------------------------------------------------------------------
+   procedure Set_NL_Mode (SwitchOn : Boolean := True)
+   is
+      function NL return C_Int;
+      pragma Import (C, NL, "nl");
+      function NoNL return C_Int;
+      pragma Import (C, NoNL, "nonl");
+
+      Err : C_Int;
+   begin
+      if SwitchOn then
+         Err := NL;
+      else
+         Err := NoNL;
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_NL_Mode;
+
+   procedure Clear_On_Next_Update
+     (Win      : Window := Standard_Window;
+      Do_Clear : Boolean := True)
+   is
+      function Clear_Ok (W : Window; Flag : Curses_Bool) return C_Int;
+      pragma Import (C, Clear_Ok, "clearok");
+   begin
+      if Clear_Ok (Win, Curses_Bool (Boolean'Pos (Do_Clear))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_On_Next_Update;
+
+   procedure Use_Insert_Delete_Line
+     (Win    : Window := Standard_Window;
+      Do_Idl : Boolean := True)
+   is
+      function IDL_Ok (W : Window; Flag : Curses_Bool) return C_Int;
+      pragma Import (C, IDL_Ok, "idlok");
+   begin
+      if IDL_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idl))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Use_Insert_Delete_Line;
+
+   procedure Use_Insert_Delete_Character
+     (Win    : Window := Standard_Window;
+      Do_Idc : Boolean := True)
+   is
+      procedure IDC_Ok (W : Window; Flag : Curses_Bool);
+      pragma Import (C, IDC_Ok, "idcok");
+   begin
+      IDC_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idc)));
+   end Use_Insert_Delete_Character;
+
+   procedure Leave_Cursor_After_Update
+     (Win      : Window := Standard_Window;
+      Do_Leave : Boolean := True)
+   is
+      function Leave_Ok (W : Window; Flag : Curses_Bool) return C_Int;
+      pragma Import (C, Leave_Ok, "leaveok");
+   begin
+      if Leave_Ok (Win, Curses_Bool (Boolean'Pos (Do_Leave))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Leave_Cursor_After_Update;
+
+   procedure Immediate_Update_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False)
+   is
+      procedure Immedok (Win : Window; Mode : Curses_Bool);
+      pragma Import (C, Immedok, "immedok");
+   begin
+      Immedok (Win, Curses_Bool (Boolean'Pos (Mode)));
+   end Immediate_Update_Mode;
+
+   procedure Allow_Scrolling
+     (Win  : Window  := Standard_Window;
+      Mode : Boolean := False)
+   is
+      function Scrollok (Win : Window; Mode : Curses_Bool) return C_Int;
+      pragma Import (C, Scrollok, "scrollok");
+   begin
+      if Scrollok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Allow_Scrolling;
+
+   function Scrolling_Allowed (Win : Window := Standard_Window)
+                               return Boolean
+   is
+      function Is_Scroll_Ok (W : Window) return Curses_Bool;
+      pragma Import (C, Is_Scroll_Ok, "is_scrollok");
+   begin
+      return (Is_Scroll_Ok (Win) /= Curses_Bool_False);
+   end Scrolling_Allowed;
+
+   procedure Set_Scroll_Region
+     (Win         : Window := Standard_Window;
+      Top_Line    : Line_Position;
+      Bottom_Line : Line_Position)
+   is
+      function Wsetscrreg (Win : Window;
+                           Lin : C_Int;
+                           Col : C_Int) return C_Int;
+      pragma Import (C, Wsetscrreg, "wsetscrreg");
+   begin
+      if Wsetscrreg (Win, C_Int (Top_Line), C_Int (Bottom_Line))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Scroll_Region;
+------------------------------------------------------------------------------
+   procedure Update_Screen
+   is
+      function Do_Update return C_Int;
+      pragma Import (C, Do_Update, "doupdate");
+   begin
+      if Do_Update = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Update_Screen;
+
+   procedure Refresh (Win : Window := Standard_Window)
+   is
+      function Wrefresh (W : Window) return C_Int;
+      pragma Import (C, Wrefresh, "wrefresh");
+   begin
+      if Wrefresh (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh;
+
+   procedure Refresh_Without_Update
+     (Win : Window := Standard_Window)
+   is
+      function Wnoutrefresh (W : Window) return C_Int;
+      pragma Import (C, Wnoutrefresh, "wnoutrefresh");
+   begin
+      if Wnoutrefresh (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Without_Update;
+
+   procedure Redraw (Win : Window := Standard_Window)
+   is
+      function Redrawwin (Win : Window) return C_Int;
+      pragma Import (C, Redrawwin, "redrawwin");
+   begin
+      if Redrawwin (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Redraw;
+
+   procedure Redraw
+     (Win        : Window := Standard_Window;
+      Begin_Line : Line_Position;
+      Line_Count : Positive)
+   is
+      function Wredrawln (Win : Window; First : C_Int; Cnt : C_Int)
+                          return C_Int;
+      pragma Import (C, Wredrawln, "wredrawln");
+   begin
+      if Wredrawln (Win,
+                    C_Int (Begin_Line),
+                    C_Int (Line_Count)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Redraw;
+
+------------------------------------------------------------------------------
+   procedure Erase (Win : Window := Standard_Window)
+   is
+      function Werase (W : Window) return C_Int;
+      pragma Import (C, Werase, "werase");
+   begin
+      if Werase (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Erase;
+
+   procedure Clear (Win : Window := Standard_Window)
+   is
+      function Wclear (W : Window) return C_Int;
+      pragma Import (C, Wclear, "wclear");
+   begin
+      if Wclear (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear;
+
+   procedure Clear_To_End_Of_Screen (Win : Window := Standard_Window)
+   is
+      function Wclearbot (W : Window) return C_Int;
+      pragma Import (C, Wclearbot, "wclrtobot");
+   begin
+      if Wclearbot (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_To_End_Of_Screen;
+
+   procedure Clear_To_End_Of_Line (Win : Window := Standard_Window)
+   is
+      function Wcleareol (W : Window) return C_Int;
+      pragma Import (C, Wcleareol, "wclrtoeol");
+   begin
+      if Wcleareol (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_To_End_Of_Line;
+------------------------------------------------------------------------------
+   procedure Set_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character)
+   is
+      procedure WBackground (W : Window; Ch : Attributed_Character);
+      pragma Import (C, WBackground, "wbkgdset");
+   begin
+      WBackground (Win, Ch);
+   end Set_Background;
+
+   procedure Change_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character)
+   is
+      function WChangeBkgd (W : Window; Ch : Attributed_Character)
+         return C_Int;
+      pragma Import (C, WChangeBkgd, "wbkgd");
+   begin
+      if WChangeBkgd (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Change_Background;
+
+   function Get_Background (Win : Window := Standard_Window)
+     return Attributed_Character
+   is
+      function Wgetbkgd (Win : Window) return Attributed_Character;
+      pragma Import (C, Wgetbkgd, "getbkgd");
+   begin
+      return Wgetbkgd (Win);
+   end Get_Background;
+------------------------------------------------------------------------------
+   procedure Change_Lines_Status (Win   : Window := Standard_Window;
+                                  Start : Line_Position;
+                                  Count : Positive;
+                                  State : Boolean)
+   is
+      function Wtouchln (Win : Window;
+                         Sta : C_Int;
+                         Cnt : C_Int;
+                         Chg : C_Int) return C_Int;
+      pragma Import (C, Wtouchln, "wtouchln");
+   begin
+      if Wtouchln (Win, C_Int (Start), C_Int (Count),
+                   C_Int (Boolean'Pos (State))) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Change_Lines_Status;
+
+   procedure Touch (Win : Window := Standard_Window)
+   is
+      Y : Line_Position;
+      X : Column_Position;
+   begin
+      Get_Size (Win, Y, X);
+      pragma Warnings (Off, X);         --  unreferenced
+      Change_Lines_Status (Win, 0, Positive (Y), True);
+   end Touch;
+
+   procedure Untouch (Win : Window := Standard_Window)
+   is
+      Y : Line_Position;
+      X : Column_Position;
+   begin
+      Get_Size (Win, Y, X);
+      pragma Warnings (Off, X);         --  unreferenced
+      Change_Lines_Status (Win, 0, Positive (Y), False);
+   end Untouch;
+
+   procedure Touch (Win   : Window := Standard_Window;
+                    Start : Line_Position;
+                    Count : Positive)
+   is
+   begin
+      Change_Lines_Status (Win, Start, Count, True);
+   end Touch;
+
+   function Is_Touched
+     (Win  : Window := Standard_Window;
+      Line : Line_Position) return Boolean
+   is
+      function WLineTouched (W : Window; L : C_Int) return Curses_Bool;
+      pragma Import (C, WLineTouched, "is_linetouched");
+   begin
+      if WLineTouched (Win, C_Int (Line)) = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_Touched;
+
+   function Is_Touched
+     (Win : Window := Standard_Window) return Boolean
+   is
+      function WWinTouched (W : Window) return Curses_Bool;
+      pragma Import (C, WWinTouched, "is_wintouched");
+   begin
+      if WWinTouched (Win) = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Is_Touched;
+------------------------------------------------------------------------------
+   procedure Copy
+     (Source_Window            : Window;
+      Destination_Window       : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position;
+      Non_Destructive_Mode     : Boolean := True)
+   is
+      function Copywin (Src : Window;
+                        Dst : Window;
+                        Str : C_Int;
+                        Slc : C_Int;
+                        Dtr : C_Int;
+                        Dlc : C_Int;
+                        Dbr : C_Int;
+                        Drc : C_Int;
+                        Ndm : C_Int) return C_Int;
+      pragma Import (C, Copywin, "copywin");
+   begin
+      if Copywin (Source_Window,
+                  Destination_Window,
+                  C_Int (Source_Top_Row),
+                  C_Int (Source_Left_Column),
+                  C_Int (Destination_Top_Row),
+                  C_Int (Destination_Left_Column),
+                  C_Int (Destination_Bottom_Row),
+                  C_Int (Destination_Right_Column),
+                  Boolean'Pos (Non_Destructive_Mode)
+                 ) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Copy;
+
+   procedure Overwrite
+     (Source_Window      : Window;
+      Destination_Window : Window)
+   is
+      function Overwrite (Src : Window; Dst : Window) return C_Int;
+      pragma Import (C, Overwrite, "overwrite");
+   begin
+      if Overwrite (Source_Window, Destination_Window) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Overwrite;
+
+   procedure Overlay
+     (Source_Window      : Window;
+      Destination_Window : Window)
+   is
+      function Overlay (Src : Window; Dst : Window) return C_Int;
+      pragma Import (C, Overlay, "overlay");
+   begin
+      if Overlay (Source_Window, Destination_Window) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Overlay;
+
+------------------------------------------------------------------------------
+   procedure Insert_Delete_Lines
+     (Win   : Window := Standard_Window;
+      Lines : Integer       := 1) -- default is to insert one line above
+   is
+      function Winsdelln (W : Window; N : C_Int) return C_Int;
+      pragma Import (C, Winsdelln, "winsdelln");
+   begin
+      if Winsdelln (Win, C_Int (Lines)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Insert_Delete_Lines;
+
+   procedure Delete_Line (Win : Window := Standard_Window)
+   is
+   begin
+      Insert_Delete_Lines (Win, -1);
+   end Delete_Line;
+
+   procedure Insert_Line (Win : Window := Standard_Window)
+   is
+   begin
+      Insert_Delete_Lines (Win, 1);
+   end Insert_Line;
+------------------------------------------------------------------------------
+
+   procedure Get_Size
+     (Win               : Window := Standard_Window;
+      Number_Of_Lines   : out Line_Count;
+      Number_Of_Columns : out Column_Count)
+   is
+      function GetMaxY (W : Window) return C_Int;
+      pragma Import (C, GetMaxY, "getmaxy");
+
+      function GetMaxX (W : Window) return C_Int;
+      pragma Import (C, GetMaxX, "getmaxx");
+
+      Y : constant C_Int := GetMaxY (Win);
+      X : constant C_Int := GetMaxX (Win);
+   begin
+      Number_Of_Lines   := Line_Count (Y);
+      Number_Of_Columns := Column_Count (X);
+   end Get_Size;
+
+   procedure Get_Window_Position
+     (Win             : Window := Standard_Window;
+      Top_Left_Line   : out Line_Position;
+      Top_Left_Column : out Column_Position)
+   is
+      function GetBegY (W : Window) return C_Int;
+      pragma Import (C, GetBegY, "getbegy");
+
+      function GetBegX (W : Window) return C_Int;
+      pragma Import (C, GetBegX, "getbegx");
+
+      Y : constant C_Short := C_Short (GetBegY (Win));
+      X : constant C_Short := C_Short (GetBegX (Win));
+   begin
+      Top_Left_Line   := Line_Position (Y);
+      Top_Left_Column := Column_Position (X);
+   end Get_Window_Position;
+
+   procedure Get_Cursor_Position
+     (Win    :  Window := Standard_Window;
+      Line   : out Line_Position;
+      Column : out Column_Position)
+   is
+      function GetCurY (W : Window) return C_Int;
+      pragma Import (C, GetCurY, "getcury");
+
+      function GetCurX (W : Window) return C_Int;
+      pragma Import (C, GetCurX, "getcurx");
+
+      Y : constant C_Short := C_Short (GetCurY (Win));
+      X : constant C_Short := C_Short (GetCurX (Win));
+   begin
+      Line   := Line_Position (Y);
+      Column := Column_Position (X);
+   end Get_Cursor_Position;
+
+   procedure Get_Origin_Relative_To_Parent
+     (Win                :  Window;
+      Top_Left_Line      : out Line_Position;
+      Top_Left_Column    : out Column_Position;
+      Is_Not_A_Subwindow : out Boolean)
+   is
+      function GetParY (W : Window) return C_Int;
+      pragma Import (C, GetParY, "getpary");
+
+      function GetParX (W : Window) return C_Int;
+      pragma Import (C, GetParX, "getparx");
+
+      Y : constant C_Int := GetParY (Win);
+      X : constant C_Int := GetParX (Win);
+   begin
+      if Y = -1 then
+         Top_Left_Line   := Line_Position'Last;
+         Top_Left_Column := Column_Position'Last;
+         Is_Not_A_Subwindow := True;
+      else
+         Top_Left_Line   := Line_Position (Y);
+         Top_Left_Column := Column_Position (X);
+         Is_Not_A_Subwindow := False;
+      end if;
+   end Get_Origin_Relative_To_Parent;
+------------------------------------------------------------------------------
+   function New_Pad (Lines   : Line_Count;
+                     Columns : Column_Count) return Window
+   is
+      function Newpad (Lines : C_Int; Columns : C_Int) return Window;
+      pragma Import (C, Newpad, "newpad");
+
+      W : Window;
+   begin
+      W := Newpad (C_Int (Lines), C_Int (Columns));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end New_Pad;
+
+   function Sub_Pad
+     (Pad                   : Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+   is
+      function Subpad
+        (Pad                   : Window;
+         Number_Of_Lines       : C_Int;
+         Number_Of_Columns     : C_Int;
+         First_Line_Position   : C_Int;
+         First_Column_Position : C_Int) return Window;
+      pragma Import (C, Subpad, "subpad");
+
+      W : Window;
+   begin
+      W := Subpad (Pad,
+                   C_Int (Number_Of_Lines),
+                   C_Int (Number_Of_Columns),
+                   C_Int (First_Line_Position),
+                   C_Int (First_Column_Position));
+      if W = Null_Window then
+         raise Curses_Exception;
+      end if;
+      return W;
+   end Sub_Pad;
+
+   procedure Refresh
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position)
+   is
+      function Prefresh
+        (Pad                      : Window;
+         Source_Top_Row           : C_Int;
+         Source_Left_Column       : C_Int;
+         Destination_Top_Row      : C_Int;
+         Destination_Left_Column  : C_Int;
+         Destination_Bottom_Row   : C_Int;
+         Destination_Right_Column : C_Int) return C_Int;
+      pragma Import (C, Prefresh, "prefresh");
+   begin
+      if Prefresh (Pad,
+                   C_Int (Source_Top_Row),
+                   C_Int (Source_Left_Column),
+                   C_Int (Destination_Top_Row),
+                   C_Int (Destination_Left_Column),
+                   C_Int (Destination_Bottom_Row),
+                   C_Int (Destination_Right_Column)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Refresh;
+
+   procedure Refresh_Without_Update
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position)
+   is
+      function Pnoutrefresh
+        (Pad                      : Window;
+         Source_Top_Row           : C_Int;
+         Source_Left_Column       : C_Int;
+         Destination_Top_Row      : C_Int;
+         Destination_Left_Column  : C_Int;
+         Destination_Bottom_Row   : C_Int;
+         Destination_Right_Column : C_Int) return C_Int;
+      pragma Import (C, Pnoutrefresh, "pnoutrefresh");
+   begin
+      if Pnoutrefresh (Pad,
+                       C_Int (Source_Top_Row),
+                       C_Int (Source_Left_Column),
+                       C_Int (Destination_Top_Row),
+                       C_Int (Destination_Left_Column),
+                       C_Int (Destination_Bottom_Row),
+                       C_Int (Destination_Right_Column)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Without_Update;
+
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Attributed_Character)
+   is
+      function Pechochar (Pad : Window; Ch : Attributed_Character)
+                          return C_Int;
+      pragma Import (C, Pechochar, "pechochar");
+   begin
+      if Pechochar (Pad, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Add_Character_To_Pad_And_Echo_It;
+
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Character)
+   is
+   begin
+      Add_Character_To_Pad_And_Echo_It
+        (Pad,
+         Attributed_Character'(Ch    => Ch,
+                               Color => Color_Pair'First,
+                               Attr  => Normal_Video));
+   end Add_Character_To_Pad_And_Echo_It;
+------------------------------------------------------------------------------
+   procedure Scroll (Win    : Window := Standard_Window;
+                     Amount : Integer := 1)
+   is
+      function Wscrl (Win : Window; N : C_Int) return C_Int;
+      pragma Import (C, Wscrl, "wscrl");
+
+   begin
+      if Wscrl (Win, C_Int (Amount)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Scroll;
+
+------------------------------------------------------------------------------
+   procedure Delete_Character (Win : Window := Standard_Window)
+   is
+      function Wdelch (Win : Window) return C_Int;
+      pragma Import (C, Wdelch, "wdelch");
+   begin
+      if Wdelch (Win) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Delete_Character;
+
+   procedure Delete_Character
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position)
+   is
+      function Mvwdelch (Win : Window;
+                         Lin : C_Int;
+                         Col : C_Int) return C_Int;
+      pragma Import (C, Mvwdelch, "mvwdelch");
+   begin
+      if Mvwdelch (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Delete_Character;
+------------------------------------------------------------------------------
+   function Peek (Win : Window := Standard_Window)
+     return Attributed_Character
+   is
+      function Winch (Win : Window) return Attributed_Character;
+      pragma Import (C, Winch, "winch");
+   begin
+      return Winch (Win);
+   end Peek;
+
+   function Peek
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position) return Attributed_Character
+   is
+      function Mvwinch (Win : Window;
+                        Lin : C_Int;
+                        Col : C_Int) return Attributed_Character;
+      pragma Import (C, Mvwinch, "mvwinch");
+   begin
+      return Mvwinch (Win, C_Int (Line), C_Int (Column));
+   end Peek;
+------------------------------------------------------------------------------
+   procedure Insert (Win : Window := Standard_Window;
+                     Ch  : Attributed_Character)
+   is
+      function Winsch (Win : Window; Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Winsch, "winsch");
+   begin
+      if Winsch (Win, Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+
+   procedure Insert
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Attributed_Character)
+   is
+      function Mvwinsch (Win : Window;
+                         Lin : C_Int;
+                         Col : C_Int;
+                         Ch  : Attributed_Character) return C_Int;
+      pragma Import (C, Mvwinsch, "mvwinsch");
+   begin
+      if Mvwinsch (Win,
+                   C_Int (Line),
+                   C_Int (Column),
+                   Ch) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+------------------------------------------------------------------------------
+   procedure Insert (Win : Window := Standard_Window;
+                     Str : String;
+                     Len : Integer := -1)
+   is
+      function Winsnstr (Win : Window;
+                         Str : char_array;
+                         Len : Integer := -1) return C_Int;
+      pragma Import (C, Winsnstr, "winsnstr");
+
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+   begin
+      To_C (Str, Txt, Length);
+      if Winsnstr (Win, Txt, Len) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+
+   procedure Insert
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Str    : String;
+      Len    : Integer := -1)
+   is
+      function Mvwinsnstr (Win    : Window;
+                           Line   : C_Int;
+                           Column : C_Int;
+                           Str    : char_array;
+                           Len    : C_Int) return C_Int;
+      pragma Import (C, Mvwinsnstr, "mvwinsnstr");
+
+      Txt    : char_array (0 .. Str'Length);
+      Length : size_t;
+   begin
+      To_C (Str, Txt, Length);
+      if Mvwinsnstr (Win, C_Int (Line), C_Int (Column), Txt, C_Int (Len))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Insert;
+------------------------------------------------------------------------------
+   procedure Peek (Win :  Window := Standard_Window;
+                   Str : out String;
+                   Len :  Integer := -1)
+   is
+      function Winnstr (Win : Window;
+                        Str : char_array;
+                        Len : C_Int) return C_Int;
+      pragma Import (C, Winnstr, "winnstr");
+
+      N   : Integer := Len;
+      Txt : char_array (0 .. Str'Length);
+      Cnt : Natural;
+   begin
+      if N < 0 then
+         N := Str'Length;
+      end if;
+      if N > Str'Length then
+         raise Constraint_Error;
+      end if;
+      Txt (0) := Interfaces.C.char'First;
+      if Winnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      To_Ada (Txt, Str, Cnt, True);
+      if Cnt < Str'Length then
+         Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
+      end if;
+   end Peek;
+
+   procedure Peek
+     (Win    :  Window := Standard_Window;
+      Line   :  Line_Position;
+      Column :  Column_Position;
+      Str    : out String;
+      Len    :  Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Peek (Win, Str, Len);
+   end Peek;
+------------------------------------------------------------------------------
+   procedure Peek
+     (Win :  Window := Standard_Window;
+      Str : out Attributed_String;
+      Len :  Integer := -1)
+   is
+      function Winchnstr (Win : Window;
+                          Str : chtype_array;             -- out
+                          Len : C_Int) return C_Int;
+      pragma Import (C, Winchnstr, "winchnstr");
+
+      N   : Integer := Len;
+      Txt : constant chtype_array (0 .. Str'Length)
+          := (0 => Default_Character);
+      Cnt : Natural := 0;
+   begin
+      if N < 0 then
+         N := Str'Length;
+      end if;
+      if N > Str'Length then
+         raise Constraint_Error;
+      end if;
+      if Winchnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      for To in Str'Range loop
+         exit when Txt (size_t (Cnt)) = Default_Character;
+         Str (To) := Txt (size_t (Cnt));
+         Cnt := Cnt + 1;
+      end loop;
+      if Cnt < Str'Length then
+         Str ((Str'First + Cnt) .. Str'Last) :=
+           (others => (Ch => ' ',
+                       Color => Color_Pair'First,
+                       Attr => Normal_Video));
+      end if;
+   end Peek;
+
+   procedure Peek
+     (Win    :  Window := Standard_Window;
+      Line   :  Line_Position;
+      Column :  Column_Position;
+      Str    : out Attributed_String;
+      Len    : Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Peek (Win, Str, Len);
+   end Peek;
+------------------------------------------------------------------------------
+   procedure Get (Win :  Window := Standard_Window;
+                  Str : out String;
+                  Len :  Integer := -1)
+   is
+      function Wgetnstr (Win : Window;
+                         Str : char_array;
+                         Len : C_Int) return C_Int;
+      pragma Import (C, Wgetnstr, "wgetnstr");
+
+      N   : Integer := Len;
+      Txt : char_array (0 .. Str'Length);
+      Cnt : Natural;
+   begin
+      if N < 0 then
+         N := Str'Length;
+      end if;
+      if N > Str'Length then
+         raise Constraint_Error;
+      end if;
+      Txt (0) := Interfaces.C.char'First;
+      if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+      To_Ada (Txt, Str, Cnt, True);
+      if Cnt < Str'Length then
+         Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
+      end if;
+   end Get;
+
+   procedure Get
+     (Win    :  Window := Standard_Window;
+      Line   :  Line_Position;
+      Column :  Column_Position;
+      Str    : out String;
+      Len    :  Integer := -1)
+   is
+   begin
+      Move_Cursor (Win, Line, Column);
+      Get (Win, Str, Len);
+   end Get;
+------------------------------------------------------------------------------
+   procedure Init_Soft_Label_Keys
+     (Format : Soft_Label_Key_Format := Three_Two_Three)
+   is
+      function Slk_Init (Fmt : C_Int) return C_Int;
+      pragma Import (C, Slk_Init, "slk_init");
+   begin
+      if Slk_Init (Soft_Label_Key_Format'Pos (Format)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Init_Soft_Label_Keys;
+
+   procedure Set_Soft_Label_Key (Label : Label_Number;
+                                 Text  : String;
+                                 Fmt   : Label_Justification := Left)
+   is
+      function Slk_Set (Label : C_Int;
+                        Txt   : char_array;
+                        Fmt   : C_Int) return C_Int;
+      pragma Import (C, Slk_Set, "slk_set");
+
+      Txt : char_array (0 .. Text'Length);
+      Len : size_t;
+   begin
+      To_C (Text, Txt, Len);
+      if Slk_Set (C_Int (Label), Txt,
+                  C_Int (Label_Justification'Pos (Fmt))) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Set_Soft_Label_Key;
+
+   procedure Refresh_Soft_Label_Keys
+   is
+      function Slk_Refresh return C_Int;
+      pragma Import (C, Slk_Refresh, "slk_refresh");
+   begin
+      if Slk_Refresh = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Soft_Label_Keys;
+
+   procedure Refresh_Soft_Label_Keys_Without_Update
+   is
+      function Slk_Noutrefresh return C_Int;
+      pragma Import (C, Slk_Noutrefresh, "slk_noutrefresh");
+   begin
+      if Slk_Noutrefresh = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Refresh_Soft_Label_Keys_Without_Update;
+
+   procedure Get_Soft_Label_Key (Label : Label_Number;
+                                 Text  : out String)
+   is
+      function Slk_Label (Label : C_Int) return chars_ptr;
+      pragma Import (C, Slk_Label, "slk_label");
+   begin
+      Fill_String (Slk_Label (C_Int (Label)), Text);
+   end Get_Soft_Label_Key;
+
+   function Get_Soft_Label_Key (Label : Label_Number) return String
+   is
+      function Slk_Label (Label : C_Int) return chars_ptr;
+      pragma Import (C, Slk_Label, "slk_label");
+   begin
+      return Fill_String (Slk_Label (C_Int (Label)));
+   end Get_Soft_Label_Key;
+
+   procedure Clear_Soft_Label_Keys
+   is
+      function Slk_Clear return C_Int;
+      pragma Import (C, Slk_Clear, "slk_clear");
+   begin
+      if Slk_Clear = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Clear_Soft_Label_Keys;
+
+   procedure Restore_Soft_Label_Keys
+   is
+      function Slk_Restore return C_Int;
+      pragma Import (C, Slk_Restore, "slk_restore");
+   begin
+      if Slk_Restore = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Restore_Soft_Label_Keys;
+
+   procedure Touch_Soft_Label_Keys
+   is
+      function Slk_Touch return C_Int;
+      pragma Import (C, Slk_Touch, "slk_touch");
+   begin
+      if Slk_Touch = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Touch_Soft_Label_Keys;
+
+   procedure Switch_Soft_Label_Key_Attributes
+     (Attr : Character_Attribute_Set;
+      On   : Boolean := True)
+   is
+      function Slk_Attron (Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Slk_Attron, "slk_attron");
+      function Slk_Attroff (Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Slk_Attroff, "slk_attroff");
+
+      Err : C_Int;
+      Ch  : constant Attributed_Character := (Ch    => Character'First,
+                                              Attr  => Attr,
+                                              Color => Color_Pair'First);
+   begin
+      if On then
+         Err := Slk_Attron  (Ch);
+      else
+         Err := Slk_Attroff (Ch);
+      end if;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Switch_Soft_Label_Key_Attributes;
+
+   procedure Set_Soft_Label_Key_Attributes
+     (Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First)
+   is
+      function Slk_Attrset (Ch : Attributed_Character) return C_Int;
+      pragma Import (C, Slk_Attrset, "slk_attrset");
+
+      Ch : constant Attributed_Character := (Ch    => Character'First,
+                                             Attr  => Attr,
+                                             Color => Color);
+   begin
+      if Slk_Attrset (Ch) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Soft_Label_Key_Attributes;
+
+   function Get_Soft_Label_Key_Attributes return Character_Attribute_Set
+   is
+      function Slk_Attr return Attributed_Character;
+      pragma Import (C, Slk_Attr, "slk_attr");
+
+      Attr : constant Attributed_Character := Slk_Attr;
+   begin
+      return Attr.Attr;
+   end Get_Soft_Label_Key_Attributes;
+
+   function Get_Soft_Label_Key_Attributes return Color_Pair
+   is
+      function Slk_Attr return Attributed_Character;
+      pragma Import (C, Slk_Attr, "slk_attr");
+
+      Attr : constant Attributed_Character := Slk_Attr;
+   begin
+      return Attr.Color;
+   end Get_Soft_Label_Key_Attributes;
+
+   procedure Set_Soft_Label_Key_Color (Pair : Color_Pair)
+   is
+      function Slk_Color (Color : C_Short) return C_Int;
+      pragma Import (C, Slk_Color, "slk_color");
+   begin
+      if Slk_Color (C_Short (Pair)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Set_Soft_Label_Key_Color;
+
+------------------------------------------------------------------------------
+   procedure Enable_Key (Key    : Special_Key_Code;
+                         Enable : Boolean := True)
+   is
+      function Keyok (Keycode : C_Int;
+                      On_Off  : Curses_Bool) return C_Int;
+      pragma Import (C, Keyok, "keyok");
+   begin
+      if Keyok (C_Int (Key), Curses_Bool (Boolean'Pos (Enable)))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Enable_Key;
+------------------------------------------------------------------------------
+   procedure Define_Key (Definition : String;
+                         Key        : Special_Key_Code)
+   is
+      function Defkey (Def : char_array;
+                       Key : C_Int) return C_Int;
+      pragma Import (C, Defkey, "define_key");
+
+      Txt    : char_array (0 .. Definition'Length);
+      Length : size_t;
+   begin
+      To_C (Definition, Txt, Length);
+      if Defkey (Txt, C_Int (Key)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Define_Key;
+------------------------------------------------------------------------------
+   procedure Un_Control (Ch  : Attributed_Character;
+                         Str : out String)
+   is
+      function Unctrl (Ch : Attributed_Character) return chars_ptr;
+      pragma Import (C, Unctrl, "unctrl");
+   begin
+      Fill_String (Unctrl (Ch), Str);
+   end Un_Control;
+
+   function Un_Control (Ch : Attributed_Character) return String
+   is
+      function Unctrl (Ch : Attributed_Character) return chars_ptr;
+      pragma Import (C, Unctrl, "unctrl");
+   begin
+      return Fill_String (Unctrl (Ch));
+   end Un_Control;
+
+   procedure Delay_Output (Msecs : Natural)
+   is
+      function Delayoutput (Msecs : C_Int) return C_Int;
+      pragma Import (C, Delayoutput, "delay_output");
+   begin
+      if Delayoutput (C_Int (Msecs)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Delay_Output;
+
+   procedure Flush_Input
+   is
+      function Flushinp return C_Int;
+      pragma Import (C, Flushinp, "flushinp");
+   begin
+      if Flushinp = Curses_Err then  -- docu says that never happens, but...
+         raise Curses_Exception;
+      end if;
+   end Flush_Input;
+------------------------------------------------------------------------------
+   function Baudrate return Natural
+   is
+      function Baud return C_Int;
+      pragma Import (C, Baud, "baudrate");
+   begin
+      return Natural (Baud);
+   end Baudrate;
+
+   function Erase_Character return Character
+   is
+      function Erasechar return C_Int;
+      pragma Import (C, Erasechar, "erasechar");
+   begin
+      return Character'Val (Erasechar);
+   end Erase_Character;
+
+   function Kill_Character return Character
+   is
+      function Killchar return C_Int;
+      pragma Import (C, Killchar, "killchar");
+   begin
+      return Character'Val (Killchar);
+   end Kill_Character;
+
+   function Has_Insert_Character return Boolean
+   is
+      function Has_Ic return Curses_Bool;
+      pragma Import (C, Has_Ic, "has_ic");
+   begin
+      if Has_Ic = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Insert_Character;
+
+   function Has_Insert_Line return Boolean
+   is
+      function Has_Il return Curses_Bool;
+      pragma Import (C, Has_Il, "has_il");
+   begin
+      if Has_Il = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Insert_Line;
+
+   function Supported_Attributes return Character_Attribute_Set
+   is
+      function Termattrs return Attributed_Character;
+      pragma Import (C, Termattrs, "termattrs");
+
+      Ch : constant Attributed_Character := Termattrs;
+   begin
+      return Ch.Attr;
+   end Supported_Attributes;
+
+   procedure Long_Name (Name : out String)
+   is
+      function Longname return chars_ptr;
+      pragma Import (C, Longname, "longname");
+   begin
+      Fill_String (Longname, Name);
+   end Long_Name;
+
+   function Long_Name return String
+   is
+      function Longname return chars_ptr;
+      pragma Import (C, Longname, "longname");
+   begin
+      return Fill_String (Longname);
+   end Long_Name;
+
+   procedure Terminal_Name (Name : out String)
+   is
+      function Termname return chars_ptr;
+      pragma Import (C, Termname, "termname");
+   begin
+      Fill_String (Termname, Name);
+   end Terminal_Name;
+
+   function Terminal_Name return String
+   is
+      function Termname return chars_ptr;
+      pragma Import (C, Termname, "termname");
+   begin
+      return Fill_String (Termname);
+   end Terminal_Name;
+------------------------------------------------------------------------------
+   procedure Init_Pair (Pair : Redefinable_Color_Pair;
+                        Fore : Color_Number;
+                        Back : Color_Number)
+   is
+      function Initpair (Pair : C_Short;
+                         Fore : C_Short;
+                         Back : C_Short) return C_Int;
+      pragma Import (C, Initpair, "init_pair");
+   begin
+      if Integer (Pair) >= Number_Of_Color_Pairs then
+         raise Constraint_Error;
+      end if;
+      if Integer (Fore) >= Number_Of_Colors or else
+         Integer (Back) >= Number_Of_Colors
+      then
+         raise Constraint_Error;
+      end if;
+      if Initpair (C_Short (Pair), C_Short (Fore), C_Short (Back))
+        = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Init_Pair;
+
+   procedure Pair_Content (Pair : Color_Pair;
+                           Fore : out Color_Number;
+                           Back : out Color_Number)
+   is
+      type C_Short_Access is access all C_Short;
+      function Paircontent (Pair : C_Short;
+                            Fp   : C_Short_Access;
+                            Bp   : C_Short_Access) return C_Int;
+      pragma Import (C, Paircontent, "pair_content");
+
+      F, B : aliased C_Short;
+   begin
+      if Paircontent (C_Short (Pair), F'Access, B'Access) = Curses_Err then
+         raise Curses_Exception;
+      else
+         Fore := Color_Number (F);
+         Back := Color_Number (B);
+      end if;
+   end Pair_Content;
+
+   function Has_Colors return Boolean
+   is
+      function Hascolors return Curses_Bool;
+      pragma Import (C, Hascolors, "has_colors");
+   begin
+      if Hascolors = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Has_Colors;
+
+   procedure Init_Color (Color : Color_Number;
+                         Red   : RGB_Value;
+                         Green : RGB_Value;
+                         Blue  : RGB_Value)
+   is
+      function Initcolor (Col   : C_Short;
+                          Red   : C_Short;
+                          Green : C_Short;
+                          Blue  : C_Short) return C_Int;
+      pragma Import (C, Initcolor, "init_color");
+   begin
+      if Initcolor (C_Short (Color), C_Short (Red), C_Short (Green),
+                    C_Short (Blue)) = Curses_Err
+      then
+            raise Curses_Exception;
+      end if;
+   end Init_Color;
+
+   function Can_Change_Color return Boolean
+   is
+      function Canchangecolor return Curses_Bool;
+      pragma Import (C, Canchangecolor, "can_change_color");
+   begin
+      if Canchangecolor = Curses_Bool_False then
+         return False;
+      else
+         return True;
+      end if;
+   end Can_Change_Color;
+
+   procedure Color_Content (Color :  Color_Number;
+                            Red   : out RGB_Value;
+                            Green : out RGB_Value;
+                            Blue  : out RGB_Value)
+   is
+      type C_Short_Access is access all C_Short;
+
+      function Colorcontent (Color : C_Short; R, G, B : C_Short_Access)
+                             return C_Int;
+      pragma Import (C, Colorcontent, "color_content");
+
+      R, G, B : aliased C_Short;
+   begin
+      if Colorcontent (C_Short (Color), R'Access, G'Access, B'Access) =
+        Curses_Err
+      then
+         raise Curses_Exception;
+      else
+         Red   := RGB_Value (R);
+         Green := RGB_Value (G);
+         Blue  := RGB_Value (B);
+      end if;
+   end Color_Content;
+
+------------------------------------------------------------------------------
+   procedure Save_Curses_Mode (Mode : Curses_Mode)
+   is
+      function Def_Prog_Mode return C_Int;
+      pragma Import (C, Def_Prog_Mode, "def_prog_mode");
+      function Def_Shell_Mode return C_Int;
+      pragma Import (C, Def_Shell_Mode, "def_shell_mode");
+
+      Err : C_Int;
+   begin
+      case Mode is
+         when Curses => Err := Def_Prog_Mode;
+         when Shell  => Err := Def_Shell_Mode;
+      end case;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Save_Curses_Mode;
+
+   procedure Reset_Curses_Mode (Mode : Curses_Mode)
+   is
+      function Reset_Prog_Mode return C_Int;
+      pragma Import (C, Reset_Prog_Mode, "reset_prog_mode");
+      function Reset_Shell_Mode return C_Int;
+      pragma Import (C, Reset_Shell_Mode, "reset_shell_mode");
+
+      Err : C_Int;
+   begin
+      case Mode is
+         when Curses => Err := Reset_Prog_Mode;
+         when Shell  => Err := Reset_Shell_Mode;
+      end case;
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Reset_Curses_Mode;
+
+   procedure Save_Terminal_State
+   is
+      function Savetty return C_Int;
+      pragma Import (C, Savetty, "savetty");
+   begin
+      if Savetty = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Save_Terminal_State;
+
+   procedure Reset_Terminal_State
+   is
+      function Resetty return C_Int;
+      pragma Import (C, Resetty, "resetty");
+   begin
+      if Resetty = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Reset_Terminal_State;
+
+   procedure Rip_Off_Lines (Lines : Integer;
+                            Proc  : Stdscr_Init_Proc)
+   is
+      function Ripoffline (Lines : C_Int;
+                           Proc  : Stdscr_Init_Proc) return C_Int;
+      pragma Import (C, Ripoffline, "_nc_ripoffline");
+   begin
+      if Ripoffline (C_Int (Lines), Proc) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Rip_Off_Lines;
+
+   procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility)
+   is
+      function Curs_Set (Curs : C_Int) return C_Int;
+      pragma Import (C, Curs_Set, "curs_set");
+
+      Res : C_Int;
+   begin
+      Res := Curs_Set (Cursor_Visibility'Pos (Visibility));
+      if Res /= Curses_Err then
+         Visibility := Cursor_Visibility'Val (Res);
+      end if;
+   end Set_Cursor_Visibility;
+
+   procedure Nap_Milli_Seconds (Ms : Natural)
+   is
+      function Napms (Ms : C_Int) return C_Int;
+      pragma Import (C, Napms, "napms");
+   begin
+      if Napms (C_Int (Ms)) = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Nap_Milli_Seconds;
+------------------------------------------------------------------------------
+   function Lines return Line_Count
+   is
+      function LINES_As_Function return Interfaces.C.int;
+      pragma Import (C, LINES_As_Function, "LINES_as_function");
+   begin
+      return Line_Count (LINES_As_Function);
+   end Lines;
+
+   function Columns return Column_Count
+   is
+      function COLS_As_Function return Interfaces.C.int;
+      pragma Import (C, COLS_As_Function, "COLS_as_function");
+   begin
+      return Column_Count (COLS_As_Function);
+   end Columns;
+
+   function Tab_Size return Natural
+   is
+      function TABSIZE_As_Function return Interfaces.C.int;
+      pragma Import (C, TABSIZE_As_Function, "TABSIZE_as_function");
+
+   begin
+      return Natural (TABSIZE_As_Function);
+   end Tab_Size;
+
+   function Number_Of_Colors return Natural
+   is
+      function COLORS_As_Function return Interfaces.C.int;
+      pragma Import (C, COLORS_As_Function, "COLORS_as_function");
+   begin
+      return Natural (COLORS_As_Function);
+   end Number_Of_Colors;
+
+   function Number_Of_Color_Pairs return Natural
+   is
+      function COLOR_PAIRS_As_Function return Interfaces.C.int;
+      pragma Import (C, COLOR_PAIRS_As_Function, "COLOR_PAIRS_as_function");
+   begin
+      return Natural (COLOR_PAIRS_As_Function);
+   end Number_Of_Color_Pairs;
+------------------------------------------------------------------------------
+   procedure Transform_Coordinates
+     (W      : Window := Standard_Window;
+      Line   : in out Line_Position;
+      Column : in out Column_Position;
+      Dir    : Transform_Direction := From_Screen)
+   is
+      type Int_Access is access all C_Int;
+      function Transform (W    : Window;
+                          Y, X : Int_Access;
+                          Dir  : Curses_Bool) return C_Int;
+      pragma Import (C, Transform, "wmouse_trafo");
+
+      X : aliased C_Int := C_Int (Column);
+      Y : aliased C_Int := C_Int (Line);
+      D : Curses_Bool := Curses_Bool_False;
+      R : C_Int;
+   begin
+      if Dir = To_Screen then
+         D := 1;
+      end if;
+      R := Transform (W, Y'Access, X'Access, D);
+      if R = Curses_False then
+         raise Curses_Exception;
+      else
+         Line   := Line_Position (Y);
+         Column := Column_Position (X);
+      end if;
+   end Transform_Coordinates;
+------------------------------------------------------------------------------
+   procedure Use_Default_Colors is
+      function C_Use_Default_Colors return C_Int;
+      pragma Import (C, C_Use_Default_Colors, "use_default_colors");
+      Err : constant C_Int := C_Use_Default_Colors;
+   begin
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Use_Default_Colors;
+
+   procedure Assume_Default_Colors (Fore : Color_Number := Default_Color;
+                                    Back : Color_Number := Default_Color)
+   is
+      function C_Assume_Default_Colors (Fore : C_Int;
+                                        Back : C_Int) return C_Int;
+      pragma Import (C, C_Assume_Default_Colors, "assume_default_colors");
+
+      Err : constant C_Int := C_Assume_Default_Colors (C_Int (Fore),
+                                                       C_Int (Back));
+   begin
+      if Err = Curses_Err then
+         raise Curses_Exception;
+      end if;
+   end Assume_Default_Colors;
+------------------------------------------------------------------------------
+   function Curses_Version return String
+   is
+      function curses_versionC return chars_ptr;
+      pragma Import (C, curses_versionC, "curses_version");
+      Result : constant chars_ptr := curses_versionC;
+   begin
+      return Fill_String (Result);
+   end Curses_Version;
+------------------------------------------------------------------------------
+   procedure Curses_Free_All is
+      procedure curses_freeall;
+      pragma Import (C, curses_freeall, "_nc_freeall");
+   begin
+      --  Use this only for testing: you cannot use curses after calling it,
+      --  so it has to be the "last" thing done before exiting the program.
+      --  This will not really free ALL of memory used by curses.  That is
+      --  because it cannot free the memory used for stdout's setbuf.  The
+      --  _nc_free_and_exit() procedure can do that, but it can be invoked
+      --  safely only from C - and again, that only as the "last" thing done
+      --  before exiting the program.
+      curses_freeall;
+   end Curses_Free_All;
+------------------------------------------------------------------------------
+   function Use_Extended_Names (Enable : Boolean) return Boolean
+   is
+      function use_extended_namesC (e : Curses_Bool) return C_Int;
+      pragma Import (C, use_extended_namesC, "use_extended_names");
+
+      Res : constant C_Int :=
+         use_extended_namesC (Curses_Bool (Boolean'Pos (Enable)));
+   begin
+      if Res = C_Int (Curses_Bool_False) then
+         return False;
+      else
+         return True;
+      end if;
+   end Use_Extended_Names;
+------------------------------------------------------------------------------
+   procedure Screen_Dump_To_File (Filename : String)
+   is
+      function scr_dump (f : char_array) return C_Int;
+      pragma Import (C, scr_dump, "scr_dump");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_dump (Txt) then
+         raise Curses_Exception;
+      end if;
+   end Screen_Dump_To_File;
+
+   procedure Screen_Restore_From_File (Filename : String)
+   is
+      function scr_restore (f : char_array) return C_Int;
+      pragma Import (C, scr_restore, "scr_restore");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_restore (Txt)  then
+         raise Curses_Exception;
+      end if;
+   end Screen_Restore_From_File;
+
+   procedure Screen_Init_From_File (Filename : String)
+   is
+      function scr_init (f : char_array) return C_Int;
+      pragma Import (C, scr_init, "scr_init");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_init (Txt) then
+         raise Curses_Exception;
+      end if;
+   end Screen_Init_From_File;
+
+   procedure Screen_Set_File (Filename : String)
+   is
+      function scr_set (f : char_array) return C_Int;
+      pragma Import (C, scr_set, "scr_set");
+      Txt    : char_array (0 .. Filename'Length);
+      Length : size_t;
+   begin
+      To_C (Filename, Txt, Length);
+      if Curses_Err = scr_set (Txt) then
+         raise Curses_Exception;
+      end if;
+   end Screen_Set_File;
+------------------------------------------------------------------------------
+   procedure Resize (Win               : Window := Standard_Window;
+                     Number_Of_Lines   : Line_Count;
+                     Number_Of_Columns : Column_Count) is
+      function wresize (win     : Window;
+                        lines   : C_Int;
+                        columns : C_Int) return C_Int;
+      pragma Import (C, wresize);
+   begin
+      if wresize (Win,
+                  C_Int (Number_Of_Lines),
+                  C_Int (Number_Of_Columns)) = Curses_Err
+      then
+         raise Curses_Exception;
+      end if;
+   end Resize;
+------------------------------------------------------------------------------
+
+end Terminal_Interface.Curses;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses__ads.htm new file mode 100644 index 00000000..c506fdd5 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses__ads.htm @@ -0,0 +1,2121 @@ + + + +terminal_interface-curses.ads + + + + +

File : terminal_interface-curses.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                         Terminal_Interface.Curses                        --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020,2024 Thomas E. Dickey                                     --
+-- Copyright 1998-2011,2014 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.49 @
+--  @Date: 2024/01/19 16:51:30 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+with System.Storage_Elements;
+with Interfaces.C;   --  We need this for some assertions.
+
+with Terminal_Interface.Curses_Constants;
+
+package Terminal_Interface.Curses is
+   pragma Preelaborate (Terminal_Interface.Curses);
+   pragma Linker_Options ("-lncurses" & Curses_Constants.DFT_ARG_SUFFIX);
+
+   Major_Version : constant := Curses_Constants.NCURSES_VERSION_MAJOR;
+   Minor_Version : constant := Curses_Constants.NCURSES_VERSION_MINOR;
+   NC_Version : String renames Curses_Constants.Version;
+
+   type Window is private;
+   Null_Window : constant Window;
+
+   type Line_Position   is new Integer; --  line coordinate
+   type Column_Position is new Integer; --  column coordinate
+
+   subtype Line_Count   is Line_Position   range 1 .. Line_Position'Last;
+   --  Type to count lines. We do not allow null windows, so must be positive
+   subtype Column_Count is Column_Position range 1 .. Column_Position'Last;
+   --  Type to count columns. We do not allow null windows, so must be positive
+
+   type Key_Code is new Integer;
+   --  That is anything including real characters, special keys and logical
+   --  request codes.
+
+   --  FIXME: The "-1" should be Curses_Err
+   subtype Real_Key_Code is Key_Code range -1 .. Curses_Constants.KEY_MAX;
+   --  This are the codes that potentially represent a real keystroke.
+   --  Not all codes may be possible on a specific terminal. To check the
+   --  availability of a special key, the Has_Key function is provided.
+
+   subtype Special_Key_Code is Real_Key_Code
+     range Curses_Constants. KEY_MIN - 1 .. Real_Key_Code'Last;
+   --  Type for a function- or special key number
+
+   subtype Normal_Key_Code is Real_Key_Code range
+     Character'Pos (Character'First) .. Character'Pos (Character'Last);
+   --  This are the codes for regular (incl. non-graphical) characters.
+
+   --  For those who like to use the original key names we produce them were
+   --  they differ from the original.
+
+   --  Constants for function- and special keys
+   Key_None                    : constant Special_Key_Code
+     := Curses_Constants.KEY_MIN - 1;
+   Key_Min                     : constant Special_Key_Code
+     := Curses_Constants.KEY_MIN;
+   Key_Break                   : constant Special_Key_Code
+     := Curses_Constants.KEY_BREAK;
+   KEY_DOWN                    : constant Special_Key_Code
+     := Curses_Constants.KEY_DOWN;
+   Key_Cursor_Down             : Special_Key_Code renames KEY_DOWN;
+   KEY_UP                      : constant Special_Key_Code
+     := Curses_Constants.KEY_UP;
+   Key_Cursor_Up               : Special_Key_Code renames KEY_UP;
+   KEY_LEFT                    : constant Special_Key_Code
+     := Curses_Constants.KEY_LEFT;
+   Key_Cursor_Left             : Special_Key_Code renames KEY_LEFT;
+   KEY_RIGHT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_RIGHT;
+   Key_Cursor_Right            : Special_Key_Code renames KEY_RIGHT;
+   Key_Home                    : constant Special_Key_Code
+     := Curses_Constants.KEY_HOME;
+   Key_Backspace               : constant Special_Key_Code
+     := Curses_Constants.KEY_BACKSPACE;
+   Key_F0                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F0;
+   Key_F1                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F1;
+   Key_F2                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F2;
+   Key_F3                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F3;
+   Key_F4                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F4;
+   Key_F5                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F5;
+   Key_F6                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F6;
+   Key_F7                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F7;
+   Key_F8                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F8;
+   Key_F9                      : constant Special_Key_Code
+     := Curses_Constants.KEY_F9;
+   Key_F10                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F10;
+   Key_F11                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F11;
+   Key_F12                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F12;
+   Key_F13                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F13;
+   Key_F14                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F14;
+   Key_F15                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F15;
+   Key_F16                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F16;
+   Key_F17                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F17;
+   Key_F18                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F18;
+   Key_F19                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F19;
+   Key_F20                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F20;
+   Key_F21                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F21;
+   Key_F22                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F22;
+   Key_F23                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F23;
+   Key_F24                     : constant Special_Key_Code
+     := Curses_Constants.KEY_F24;
+   KEY_DL                      : constant Special_Key_Code
+     := Curses_Constants.KEY_DL;
+   Key_Delete_Line             : Special_Key_Code renames KEY_DL;
+   KEY_IL                      : constant Special_Key_Code
+     := Curses_Constants.KEY_IL;
+   Key_Insert_Line             : Special_Key_Code renames KEY_IL;
+   KEY_DC                      : constant Special_Key_Code
+     := Curses_Constants.KEY_DC;
+   Key_Delete_Char             : Special_Key_Code renames KEY_DC;
+   KEY_IC                      : constant Special_Key_Code
+     := Curses_Constants.KEY_IC;
+   Key_Insert_Char             : Special_Key_Code renames KEY_IC;
+   KEY_EIC                     : constant Special_Key_Code
+     := Curses_Constants.KEY_EIC;
+   Key_Exit_Insert_Mode        : Special_Key_Code renames KEY_EIC;
+   KEY_CLEAR                   : constant Special_Key_Code
+     := Curses_Constants.KEY_CLEAR;
+   Key_Clear_Screen            : Special_Key_Code renames KEY_CLEAR;
+   KEY_EOS                     : constant Special_Key_Code
+     := Curses_Constants.KEY_EOS;
+   Key_Clear_End_Of_Screen     : Special_Key_Code renames KEY_EOS;
+   KEY_EOL                     : constant Special_Key_Code
+     := Curses_Constants.KEY_EOL;
+   Key_Clear_End_Of_Line       : Special_Key_Code renames KEY_EOL;
+   KEY_SF                      : constant Special_Key_Code
+     := Curses_Constants.KEY_SF;
+   Key_Scroll_1_Forward        : Special_Key_Code renames KEY_SF;
+   KEY_SR                      : constant Special_Key_Code
+     := Curses_Constants.KEY_SR;
+   Key_Scroll_1_Backward       : Special_Key_Code renames KEY_SR;
+   KEY_NPAGE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_NPAGE;
+   Key_Next_Page               : Special_Key_Code renames KEY_NPAGE;
+   KEY_PPAGE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_PPAGE;
+   Key_Previous_Page           : Special_Key_Code renames KEY_PPAGE;
+   KEY_STAB                    : constant Special_Key_Code
+     := Curses_Constants.KEY_STAB;
+   Key_Set_Tab                 : Special_Key_Code renames KEY_STAB;
+   KEY_CTAB                    : constant Special_Key_Code
+     := Curses_Constants.KEY_CTAB;
+   Key_Clear_Tab               : Special_Key_Code renames KEY_CTAB;
+   KEY_CATAB                   : constant Special_Key_Code
+     := Curses_Constants.KEY_CATAB;
+   Key_Clear_All_Tabs          : Special_Key_Code renames KEY_CATAB;
+   KEY_ENTER                   : constant Special_Key_Code
+     := Curses_Constants.KEY_ENTER;
+   Key_Enter_Or_Send           : Special_Key_Code renames KEY_ENTER;
+   KEY_SRESET                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SRESET;
+   Key_Soft_Reset              : Special_Key_Code renames KEY_SRESET;
+   Key_Reset                   : constant Special_Key_Code
+     := Curses_Constants.KEY_RESET;
+   Key_Print                   : constant Special_Key_Code
+     := Curses_Constants.KEY_PRINT;
+   KEY_LL                      : constant Special_Key_Code
+     := Curses_Constants.KEY_LL;
+   Key_Bottom                  : Special_Key_Code renames KEY_LL;
+   KEY_A1                      : constant Special_Key_Code
+     := Curses_Constants.KEY_A1;
+   Key_Upper_Left_Of_Keypad    : Special_Key_Code renames KEY_A1;
+   KEY_A3                      : constant Special_Key_Code
+     := Curses_Constants.KEY_A3;
+   Key_Upper_Right_Of_Keypad   : Special_Key_Code renames KEY_A3;
+   KEY_B2                      : constant Special_Key_Code
+     := Curses_Constants.KEY_B2;
+   Key_Center_Of_Keypad        : Special_Key_Code renames KEY_B2;
+   KEY_C1                      : constant Special_Key_Code
+     := Curses_Constants.KEY_C1;
+   Key_Lower_Left_Of_Keypad    : Special_Key_Code renames KEY_C1;
+   KEY_C3                      : constant Special_Key_Code
+     := Curses_Constants.KEY_C3;
+   Key_Lower_Right_Of_Keypad   : Special_Key_Code renames KEY_C3;
+   KEY_BTAB                    : constant Special_Key_Code
+     := Curses_Constants.KEY_BTAB;
+   Key_Back_Tab                : Special_Key_Code renames KEY_BTAB;
+   KEY_BEG                     : constant Special_Key_Code
+     := Curses_Constants.KEY_BEG;
+   Key_Beginning               : Special_Key_Code renames KEY_BEG;
+   Key_Cancel                  : constant Special_Key_Code
+     := Curses_Constants.KEY_CANCEL;
+   Key_Close                   : constant Special_Key_Code
+     := Curses_Constants.KEY_CLOSE;
+   Key_Command                 : constant Special_Key_Code
+     := Curses_Constants.KEY_COMMAND;
+   Key_Copy                    : constant Special_Key_Code
+     := Curses_Constants.KEY_COPY;
+   Key_Create                  : constant Special_Key_Code
+     := Curses_Constants.KEY_CREATE;
+   Key_End                     : constant Special_Key_Code
+     := Curses_Constants.KEY_END;
+   Key_Exit                    : constant Special_Key_Code
+     := Curses_Constants.KEY_EXIT;
+   Key_Find                    : constant Special_Key_Code
+     := Curses_Constants.KEY_FIND;
+   Key_Help                    : constant Special_Key_Code
+     := Curses_Constants.KEY_HELP;
+   Key_Mark                    : constant Special_Key_Code
+     := Curses_Constants.KEY_MARK;
+   Key_Message                 : constant Special_Key_Code
+     := Curses_Constants.KEY_MESSAGE;
+   Key_Move                    : constant Special_Key_Code
+     := Curses_Constants.KEY_MOVE;
+   Key_Next                    : constant Special_Key_Code
+     := Curses_Constants.KEY_NEXT;
+   Key_Open                    : constant Special_Key_Code
+     := Curses_Constants.KEY_OPEN;
+   Key_Options                 : constant Special_Key_Code
+     := Curses_Constants.KEY_OPTIONS;
+   Key_Previous                : constant Special_Key_Code
+     := Curses_Constants.KEY_PREVIOUS;
+   Key_Redo                    : constant Special_Key_Code
+     := Curses_Constants.KEY_REDO;
+   Key_Reference               : constant Special_Key_Code
+     := Curses_Constants.KEY_REFERENCE;
+   Key_Refresh                 : constant Special_Key_Code
+     := Curses_Constants.KEY_REFRESH;
+   Key_Replace                 : constant Special_Key_Code
+     := Curses_Constants.KEY_REPLACE;
+   Key_Restart                 : constant Special_Key_Code
+     := Curses_Constants.KEY_RESTART;
+   Key_Resume                  : constant Special_Key_Code
+     := Curses_Constants.KEY_RESUME;
+   Key_Save                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SAVE;
+   KEY_SBEG                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SBEG;
+   Key_Shift_Begin             : Special_Key_Code renames KEY_SBEG;
+   KEY_SCANCEL                 : constant Special_Key_Code
+     := Curses_Constants.KEY_SCANCEL;
+   Key_Shift_Cancel            : Special_Key_Code renames KEY_SCANCEL;
+   KEY_SCOMMAND                : constant Special_Key_Code
+     := Curses_Constants.KEY_SCOMMAND;
+   Key_Shift_Command           : Special_Key_Code renames KEY_SCOMMAND;
+   KEY_SCOPY                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SCOPY;
+   Key_Shift_Copy              : Special_Key_Code renames KEY_SCOPY;
+   KEY_SCREATE                 : constant Special_Key_Code
+     := Curses_Constants.KEY_SCREATE;
+   Key_Shift_Create            : Special_Key_Code renames KEY_SCREATE;
+   KEY_SDC                     : constant Special_Key_Code
+     := Curses_Constants.KEY_SDC;
+   Key_Shift_Delete_Char       : Special_Key_Code renames KEY_SDC;
+   KEY_SDL                     : constant Special_Key_Code
+     := Curses_Constants.KEY_SDL;
+   Key_Shift_Delete_Line       : Special_Key_Code renames KEY_SDL;
+   Key_Select                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SELECT;
+   KEY_SEND                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SEND;
+   Key_Shift_End               : Special_Key_Code renames KEY_SEND;
+   KEY_SEOL                    : constant Special_Key_Code
+     := Curses_Constants.KEY_SEOL;
+   Key_Shift_Clear_End_Of_Line : Special_Key_Code renames KEY_SEOL;
+   KEY_SEXIT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SEXIT;
+   Key_Shift_Exit              : Special_Key_Code renames KEY_SEXIT;
+   KEY_SFIND                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SFIND;
+   Key_Shift_Find              : Special_Key_Code renames KEY_SFIND;
+   KEY_SHELP                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SHELP;
+   Key_Shift_Help              : Special_Key_Code renames KEY_SHELP;
+   KEY_SHOME                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SHOME;
+   Key_Shift_Home              : Special_Key_Code renames KEY_SHOME;
+   KEY_SIC                     : constant Special_Key_Code
+     := Curses_Constants.KEY_SIC;
+   Key_Shift_Insert_Char       : Special_Key_Code renames KEY_SIC;
+   KEY_SLEFT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SLEFT;
+   Key_Shift_Cursor_Left       : Special_Key_Code renames KEY_SLEFT;
+   KEY_SMESSAGE                : constant Special_Key_Code
+     := Curses_Constants.KEY_SMESSAGE;
+   Key_Shift_Message           : Special_Key_Code renames KEY_SMESSAGE;
+   KEY_SMOVE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SMOVE;
+   Key_Shift_Move              : Special_Key_Code renames KEY_SMOVE;
+   KEY_SNEXT                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SNEXT;
+   Key_Shift_Next_Page         : Special_Key_Code renames KEY_SNEXT;
+   KEY_SOPTIONS                : constant Special_Key_Code
+     := Curses_Constants.KEY_SOPTIONS;
+   Key_Shift_Options           : Special_Key_Code renames KEY_SOPTIONS;
+   KEY_SPREVIOUS               : constant Special_Key_Code
+     := Curses_Constants.KEY_SPREVIOUS;
+   Key_Shift_Previous_Page     : Special_Key_Code renames KEY_SPREVIOUS;
+   KEY_SPRINT                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SPRINT;
+   Key_Shift_Print             : Special_Key_Code renames KEY_SPRINT;
+   KEY_SREDO                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SREDO;
+   Key_Shift_Redo              : Special_Key_Code renames KEY_SREDO;
+   KEY_SREPLACE                : constant Special_Key_Code
+     := Curses_Constants.KEY_SREPLACE;
+   Key_Shift_Replace           : Special_Key_Code renames KEY_SREPLACE;
+   KEY_SRIGHT                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SRIGHT;
+   Key_Shift_Cursor_Right      : Special_Key_Code renames KEY_SRIGHT;
+   KEY_SRSUME                  : constant Special_Key_Code
+     := Curses_Constants.KEY_SRSUME;
+   Key_Shift_Resume            : Special_Key_Code renames KEY_SRSUME;
+   KEY_SSAVE                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SSAVE;
+   Key_Shift_Save              : Special_Key_Code renames KEY_SSAVE;
+   KEY_SSUSPEND                : constant Special_Key_Code
+     := Curses_Constants.KEY_SSUSPEND;
+   Key_Shift_Suspend           : Special_Key_Code renames KEY_SSUSPEND;
+   KEY_SUNDO                   : constant Special_Key_Code
+     := Curses_Constants.KEY_SUNDO;
+   Key_Shift_Undo              : Special_Key_Code renames KEY_SUNDO;
+   Key_Suspend                 : constant Special_Key_Code
+     := Curses_Constants.KEY_SUSPEND;
+   Key_Undo                    : constant Special_Key_Code
+     := Curses_Constants.KEY_UNDO;
+   Key_Mouse                   : constant Special_Key_Code
+     := Curses_Constants.KEY_MOUSE;
+   Key_Resize                  : constant Special_Key_Code
+     := Curses_Constants.KEY_RESIZE;
+   Key_Max                     : constant Special_Key_Code
+     := Special_Key_Code'Last;
+
+   subtype User_Key_Code is Key_Code
+     range (Key_Max + 129) .. Key_Code'Last;
+   --  This is reserved for user defined key codes. The range between Key_Max
+   --  and the first user code is reserved for subsystems like menu and forms.
+
+   --------------------------------------------------------------------------
+
+   type Color_Number is range -1 .. Integer (Interfaces.C.short'Last);
+   for Color_Number'Size use Interfaces.C.short'Size;
+   --  (n)curses uses a short for the color index
+   --  The model is, that a Color_Number is an index into an array of
+   --  (potentially) definable colors. Some of those indices are
+   --  predefined (see below), although they may not really exist.
+
+   Black   : constant Color_Number := Curses_Constants.COLOR_BLACK;
+   Red     : constant Color_Number := Curses_Constants.COLOR_RED;
+   Green   : constant Color_Number := Curses_Constants.COLOR_GREEN;
+   Yellow  : constant Color_Number := Curses_Constants.COLOR_YELLOW;
+   Blue    : constant Color_Number := Curses_Constants.COLOR_BLUE;
+   Magenta : constant Color_Number := Curses_Constants.COLOR_MAGENTA;
+   Cyan    : constant Color_Number := Curses_Constants.COLOR_CYAN;
+   White   : constant Color_Number := Curses_Constants.COLOR_WHITE;
+
+   type RGB_Value is range 0 .. Integer (Interfaces.C.short'Last);
+   for RGB_Value'Size use Interfaces.C.short'Size;
+   --  Some system may allow to redefine a color by setting RGB values.
+
+   type Color_Pair is range 0 .. 255;
+   for Color_Pair'Size use 8;
+   subtype Redefinable_Color_Pair is Color_Pair range 1 .. 255;
+   --  (n)curses reserves 1 Byte for the color-pair number. Color Pair 0
+   --  is fixed (Black & White). A color pair is simply a combination of
+   --  two colors described by Color_Numbers, one for the foreground and
+   --  the other for the background
+
+   type Character_Attribute_Set is
+      record
+         Stand_Out               : Boolean;
+         Under_Line              : Boolean;
+         Reverse_Video           : Boolean;
+         Blink                   : Boolean;
+         Dim_Character           : Boolean;
+         Bold_Character          : Boolean;
+         Protected_Character     : Boolean;
+         Invisible_Character     : Boolean;
+         Alternate_Character_Set : Boolean;
+         Horizontal              : Boolean;
+         Left                    : Boolean;
+         Low                     : Boolean;
+         Right                   : Boolean;
+         Top                     : Boolean;
+         Vertical                : Boolean;
+      end record;
+
+   for Character_Attribute_Set use
+      record
+         Stand_Out at 0 range
+           Curses_Constants.A_STANDOUT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_STANDOUT_Last - Curses_Constants.Attr_First;
+         Under_Line at 0 range
+           Curses_Constants.A_UNDERLINE_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_UNDERLINE_Last - Curses_Constants.Attr_First;
+         Reverse_Video at 0 range
+           Curses_Constants.A_REVERSE_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_REVERSE_Last - Curses_Constants.Attr_First;
+         Blink at 0 range
+           Curses_Constants.A_BLINK_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_BLINK_Last - Curses_Constants.Attr_First;
+         Dim_Character at 0 range
+           Curses_Constants.A_DIM_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_DIM_Last - Curses_Constants.Attr_First;
+         Bold_Character at 0 range
+           Curses_Constants.A_BOLD_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_BOLD_Last - Curses_Constants.Attr_First;
+         Protected_Character at 0 range
+           Curses_Constants.A_PROTECT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_PROTECT_Last - Curses_Constants.Attr_First;
+         Invisible_Character at 0 range
+           Curses_Constants.A_INVIS_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_INVIS_Last - Curses_Constants.Attr_First;
+         Alternate_Character_Set at 0 range
+           Curses_Constants.A_ALTCHARSET_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_ALTCHARSET_Last - Curses_Constants.Attr_First;
+         Horizontal at 0 range
+           Curses_Constants.A_HORIZONTAL_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_HORIZONTAL_Last - Curses_Constants.Attr_First;
+         Left at 0 range
+           Curses_Constants.A_LEFT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_LEFT_Last - Curses_Constants.Attr_First;
+         Low at 0 range
+           Curses_Constants.A_LOW_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_LOW_Last - Curses_Constants.Attr_First;
+         Right at 0 range
+           Curses_Constants.A_RIGHT_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_RIGHT_Last - Curses_Constants.Attr_First;
+         Top at 0 range
+           Curses_Constants.A_TOP_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_TOP_Last - Curses_Constants.Attr_First;
+         Vertical at 0 range
+           Curses_Constants.A_VERTICAL_First - Curses_Constants.Attr_First
+           .. Curses_Constants.A_VERTICAL_Last - Curses_Constants.Attr_First;
+      end record;
+
+   Normal_Video : constant Character_Attribute_Set := (others => False);
+
+   type Attributed_Character is
+      record
+         Attr  : Character_Attribute_Set;
+         Color : Color_Pair;
+         Ch    : Character;
+      end record;
+   pragma Convention (C_Pass_By_Copy, Attributed_Character);
+   --  This is the counterpart for the chtype in C.
+
+   for Attributed_Character use
+      record
+         Ch    at 0 range Curses_Constants.A_CHARTEXT_First
+           .. Curses_Constants.A_CHARTEXT_Last;
+         Color at 0 range Curses_Constants.A_COLOR_First
+           .. Curses_Constants.A_COLOR_Last;
+         pragma Warnings (Off);
+         Attr  at 0 range Curses_Constants.Attr_First
+           .. Curses_Constants.Attr_Last;
+         pragma Warnings (On);
+      end record;
+   for Attributed_Character'Size use Curses_Constants.chtype_Size;
+
+   Default_Character : constant Attributed_Character
+     := (Ch    => Character'First,
+         Color => Color_Pair'First,
+         Attr  => (others => False));  --  preelaboratable Normal_Video
+
+   type Attributed_String is array (Positive range <>) of Attributed_Character;
+   pragma Convention (C, Attributed_String);
+   --  In this binding we allow strings of attributed characters.
+
+   ------------------
+   --  Exceptions  --
+   ------------------
+   Curses_Exception     : exception;
+   Wrong_Curses_Version : exception;
+
+   --  Those exceptions are raised by the ETI (Extended Terminal Interface)
+   --  subpackets for Menu and Forms handling.
+   --
+   Eti_System_Error    : exception;
+   Eti_Bad_Argument    : exception;
+   Eti_Posted          : exception;
+   Eti_Connected       : exception;
+   Eti_Bad_State       : exception;
+   Eti_No_Room         : exception;
+   Eti_Not_Posted      : exception;
+   Eti_Unknown_Command : exception;
+   Eti_No_Match        : exception;
+   Eti_Not_Selectable  : exception;
+   Eti_Not_Connected   : exception;
+   Eti_Request_Denied  : exception;
+   Eti_Invalid_Field   : exception;
+   Eti_Current         : exception;
+
+   --------------------------------------------------------------------------
+   --  External C variables
+   --  Conceptually even in C this are kind of constants, but they are
+   --  initialized and sometimes changed by the library routines at runtime
+   --  depending on the type of terminal. I believe the best way to model
+   --  this is to use functions.
+   --------------------------------------------------------------------------
+
+   function Lines            return Line_Count;
+   pragma Inline (Lines);
+
+   function Columns          return Column_Count;
+   pragma Inline (Columns);
+
+   function Tab_Size         return Natural;
+   pragma Inline (Tab_Size);
+
+   function Number_Of_Colors return Natural;
+   pragma Inline (Number_Of_Colors);
+
+   function Number_Of_Color_Pairs return Natural;
+   pragma Inline (Number_Of_Color_Pairs);
+
+   subtype ACS_Index is Character range
+     Character'Val (0) .. Character'Val (127);
+   function ACS_Map (Index : ACS_Index) return Attributed_Character;
+   pragma Import (C, ACS_Map, "acs_map_as_function");
+
+   --  Constants for several characters from the Alternate Character Set
+   --  You must use these constants as indices into the ACS_Map function
+   --  to get the corresponding attributed character at runtime
+   ACS_Upper_Left_Corner  : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_ULCORNER);
+   ACS_Lower_Left_Corner  : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LLCORNER);
+   ACS_Upper_Right_Corner : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_URCORNER);
+   ACS_Lower_Right_Corner : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LRCORNER);
+   ACS_Left_Tee           : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LTEE);
+   ACS_Right_Tee          : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_RTEE);
+   ACS_Bottom_Tee         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BTEE);
+   ACS_Top_Tee            : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_TTEE);
+   ACS_Horizontal_Line    : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_HLINE);
+   ACS_Vertical_Line      : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_VLINE);
+   ACS_Plus_Symbol        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_PLUS);
+   ACS_Scan_Line_1        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S1);
+   ACS_Scan_Line_9        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S9);
+   ACS_Diamond            : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_DIAMOND);
+   ACS_Checker_Board      : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_CKBOARD);
+   ACS_Degree             : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_DEGREE);
+   ACS_Plus_Minus         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_PLMINUS);
+   ACS_Bullet             : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BULLET);
+   ACS_Left_Arrow         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LARROW);
+   ACS_Right_Arrow        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_RARROW);
+   ACS_Down_Arrow         : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_DARROW);
+   ACS_Up_Arrow           : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_UARROW);
+   ACS_Board_Of_Squares   : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BOARD);
+   ACS_Lantern            : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LANTERN);
+   ACS_Solid_Block        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_BLOCK);
+   ACS_Scan_Line_3        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S3);
+   ACS_Scan_Line_7        : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_S7);
+   ACS_Less_Or_Equal      : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_LEQUAL);
+   ACS_Greater_Or_Equal   : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_GEQUAL);
+   ACS_PI                 : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_PI);
+   ACS_Not_Equal          : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_NEQUAL);
+   ACS_Sterling           : constant ACS_Index
+      := Character'Val (Curses_Constants.ACS_STERLING);
+
+   --  |=====================================================================
+   --  | Man page curs_initscr.3x
+   --  |=====================================================================
+   --  | Not implemented: newterm, set_term, delscreen
+
+   --  |
+   function Standard_Window return Window;
+   --  AKA: stdscr
+   pragma Import (C, Standard_Window, "stdscr_as_function");
+   pragma Inline (Standard_Window);
+
+   --  |
+   function Current_Window return Window;
+   --  AKA: curscr
+   pragma Import (C, Current_Window, "curscr_as_function");
+   pragma Inline (Current_Window);
+
+   --  |
+   procedure Init_Screen;
+
+   --  |
+   procedure Init_Windows renames Init_Screen;
+   --  AKA: initscr()
+   pragma Inline (Init_Screen);
+   --  pragma Inline (Init_Windows);
+
+   --  |
+   procedure End_Windows;
+   --  AKA: endwin()
+   procedure End_Screen renames End_Windows;
+   pragma Inline (End_Windows);
+   --  pragma Inline (End_Screen);
+
+   --  |
+   function Is_End_Window return Boolean;
+   --  AKA: isendwin()
+   pragma Inline (Is_End_Window);
+
+   --  |=====================================================================
+   --  | Man page curs_move.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Move_Cursor (Win    : Window := Standard_Window;
+                          Line   : Line_Position;
+                          Column : Column_Position);
+   --  AKA: wmove()
+   --  AKA: move()
+   pragma Inline (Move_Cursor);
+
+   --  |=====================================================================
+   --  | Man page curs_addch.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Attributed_Character);
+   --  AKA: waddch()
+   --  AKA: addch()
+
+   procedure Add (Win : Window := Standard_Window;
+                  Ch  : Character);
+   --  Add a single character at the current logical cursor position to
+   --  the window. Use the current windows attributes.
+
+   --  |
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Attributed_Character);
+   --  AKA: mvwaddch()
+   --  AKA: mvaddch()
+
+   procedure Add
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position;
+      Ch     : Character);
+   --  Move to the position and add a single character into the window
+   --  There are more Add routines, so the Inline pragma follows later
+
+   --  |
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character);
+   --  AKA: wechochar()
+   --  AKA: echochar()
+
+   procedure Add_With_Immediate_Echo
+     (Win : Window := Standard_Window;
+      Ch  : Character);
+   --  Add a character and do an immediate refresh of the screen.
+   pragma Inline (Add_With_Immediate_Echo);
+
+   --  |=====================================================================
+   --  | Man page curs_window.3x
+   --  |=====================================================================
+   --  Not Implemented: wcursyncup
+
+   --  |
+   function Create
+     (Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  Not Implemented: Default Number_Of_Lines, Number_Of_Columns
+   --  the C version lets them be 0, see the man page.
+   --  AKA: newwin()
+   pragma Inline (Create);
+
+   function New_Window
+     (Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window
+     renames Create;
+   --  pragma Inline (New_Window);
+
+   --  |
+   procedure Delete (Win : in out Window);
+   --  AKA: delwin()
+   --  Reset Win to Null_Window
+   pragma Inline (Delete);
+
+   --  |
+   function Sub_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  AKA: subwin()
+   pragma Inline (Sub_Window);
+
+   --  |
+   function Derived_Window
+     (Win                   : Window := Standard_Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  AKA: derwin()
+   pragma Inline (Derived_Window);
+
+   --  |
+   function Duplicate (Win : Window) return Window;
+   --  AKA: dupwin()
+   pragma Inline (Duplicate);
+
+   --  |
+   procedure Move_Window (Win    : Window;
+                          Line   : Line_Position;
+                          Column : Column_Position);
+   --  AKA: mvwin()
+   pragma Inline (Move_Window);
+
+   --  |
+   procedure Move_Derived_Window (Win    : Window;
+                                  Line   : Line_Position;
+                                  Column : Column_Position);
+   --  AKA: mvderwin()
+   pragma Inline (Move_Derived_Window);
+
+   --  |
+   procedure Synchronize_Upwards (Win : Window);
+   --  AKA: wsyncup()
+   pragma Import (C, Synchronize_Upwards, "wsyncup");
+
+   --  |
+   procedure Synchronize_Downwards (Win : Window);
+   --  AKA: wsyncdown()
+   pragma Import (C, Synchronize_Downwards, "wsyncdown");
+
+   --  |
+   procedure Set_Synch_Mode (Win  : Window := Standard_Window;
+                             Mode : Boolean := False);
+   --  AKA: syncok()
+   pragma Inline (Set_Synch_Mode);
+
+   --  |=====================================================================
+   --  | Man page curs_addstr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Add (Win : Window := Standard_Window;
+                  Str : String;
+                  Len : Integer := -1);
+   --  AKA: waddnstr()
+   --  AKA: waddstr()
+   --  AKA: addnstr()
+   --  AKA: addstr()
+
+   --  |
+   procedure Add (Win    : Window := Standard_Window;
+                  Line   : Line_Position;
+                  Column : Column_Position;
+                  Str    : String;
+                  Len    : Integer := -1);
+   --  AKA: mvwaddnstr()
+   --  AKA: mvwaddstr()
+   --  AKA: mvaddnstr()
+   --  AKA: mvaddstr()
+
+   --  |=====================================================================
+   --  | Man page curs_addchstr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Add (Win : Window := Standard_Window;
+                  Str : Attributed_String;
+                  Len : Integer := -1);
+   --  AKA: waddchnstr()
+   --  AKA: waddchstr()
+   --  AKA: addchnstr()
+   --  AKA: addchstr()
+
+   --  |
+   procedure Add (Win    : Window := Standard_Window;
+                  Line   : Line_Position;
+                  Column : Column_Position;
+                  Str    : Attributed_String;
+                  Len    : Integer := -1);
+   --  AKA: mvwaddchnstr()
+   --  AKA: mvwaddchstr()
+   --  AKA: mvaddchnstr()
+   --  AKA: mvaddchstr()
+   pragma Inline (Add);
+
+   --  |=====================================================================
+   --  | Man page curs_border.3x
+   --  |=====================================================================
+   --  | Not implemented: mvhline,  mvwhline, mvvline, mvwvline
+   --  | use Move_Cursor then Horizontal_Line or Vertical_Line
+
+   --  |
+   procedure Border
+     (Win                       : Window := Standard_Window;
+      Left_Side_Symbol          : Attributed_Character := Default_Character;
+      Right_Side_Symbol         : Attributed_Character := Default_Character;
+      Top_Side_Symbol           : Attributed_Character := Default_Character;
+      Bottom_Side_Symbol        : Attributed_Character := Default_Character;
+      Upper_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Upper_Right_Corner_Symbol : Attributed_Character := Default_Character;
+      Lower_Left_Corner_Symbol  : Attributed_Character := Default_Character;
+      Lower_Right_Corner_Symbol : Attributed_Character := Default_Character
+     );
+   --  AKA: wborder()
+   --  AKA: border()
+   pragma Inline (Border);
+
+   --  |
+   procedure Box
+     (Win               : Window := Standard_Window;
+      Vertical_Symbol   : Attributed_Character := Default_Character;
+      Horizontal_Symbol : Attributed_Character := Default_Character);
+   --  AKA: box()
+   pragma Inline (Box);
+
+   --  |
+   procedure Horizontal_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character);
+   --  AKA: whline()
+   --  AKA: hline()
+   pragma Inline (Horizontal_Line);
+
+   --  |
+   procedure Vertical_Line
+     (Win         : Window := Standard_Window;
+      Line_Size   : Natural;
+      Line_Symbol : Attributed_Character := Default_Character);
+   --  AKA: wvline()
+   --  AKA: vline()
+   pragma Inline (Vertical_Line);
+
+   --  |=====================================================================
+   --  | Man page curs_getch.3x
+   --  |=====================================================================
+   --  Not implemented: mvgetch, mvwgetch
+
+   --  |
+   function Get_Keystroke (Win : Window := Standard_Window)
+                           return Real_Key_Code;
+   --  AKA: wgetch()
+   --  AKA: getch()
+   --  Get a character from the keyboard and echo it - if enabled - to the
+   --  window.
+   --  If for any reason (i.e. a timeout) we could not get a character the
+   --  returned keycode is Key_None.
+   pragma Inline (Get_Keystroke);
+
+   --  |
+   procedure Undo_Keystroke (Key : Real_Key_Code);
+   --  AKA: ungetch()
+   pragma Inline (Undo_Keystroke);
+
+   --  |
+   function Has_Key (Key : Special_Key_Code) return Boolean;
+   --  AKA: has_key()
+   pragma Inline (Has_Key);
+
+   --  |
+   --  | Some helper functions
+   --  |
+   function Is_Function_Key (Key : Special_Key_Code) return Boolean;
+   --  Return True if the Key is a function key (i.e. one of F0 .. F63)
+   pragma Inline (Is_Function_Key);
+
+   subtype Function_Key_Number is Integer range 0 .. 63;
+   --  (n)curses allows for 64 function keys.
+
+   function Function_Key (Key : Real_Key_Code) return Function_Key_Number;
+   --  Return the number of the function key. If the code is not a
+   --  function key, a CONSTRAINT_ERROR will be raised.
+   pragma Inline (Function_Key);
+
+   function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code;
+   --  Return the key code for a given function-key number.
+   pragma Inline (Function_Key_Code);
+
+   --  |=====================================================================
+   --  | Man page curs_attr.3x
+   --  |=====================================================================
+   --  | Not implemented attr_off,  wattr_off,
+   --  |  attr_on, wattr_on, attr_set, wattr_set
+
+   --  PAIR_NUMBER
+   --  PAIR_NUMBER(c) is the same as c.Color
+
+   --  |
+   procedure Standout (Win : Window  := Standard_Window;
+                       On  : Boolean := True);
+   --  AKA: wstandout()
+   --  AKA: wstandend()
+
+   --  |
+   procedure Switch_Character_Attribute
+     (Win  : Window := Standard_Window;
+      Attr : Character_Attribute_Set := Normal_Video;
+      On   : Boolean := True); --  if False we switch Off.
+   --  Switches those Attributes set to true in the list.
+   --  AKA: wattron()
+   --  AKA: wattroff()
+   --  AKA: attron()
+   --  AKA: attroff()
+
+   --  |
+   procedure Set_Character_Attributes
+     (Win   : Window := Standard_Window;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: wattrset()
+   --  AKA: attrset()
+   pragma Inline (Set_Character_Attributes);
+
+   --  |
+   function Get_Character_Attribute
+     (Win : Window := Standard_Window) return Character_Attribute_Set;
+   --  AKA: wattr_get()
+   --  AKA: attr_get()
+
+   --  |
+   function Get_Character_Attribute
+     (Win : Window := Standard_Window) return Color_Pair;
+   --  AKA: wattr_get()
+   pragma Inline (Get_Character_Attribute);
+
+   --  |
+   procedure Set_Color (Win  : Window := Standard_Window;
+                        Pair : Color_Pair);
+   --  AKA: wcolor_set()
+   --  AKA: color_set()
+   pragma Inline (Set_Color);
+
+   --  |
+   procedure Change_Attributes
+     (Win   : Window := Standard_Window;
+      Count : Integer := -1;
+      Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: wchgat()
+   --  AKA: chgat()
+
+   --  |
+   procedure Change_Attributes
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position := Line_Position'First;
+      Column : Column_Position := Column_Position'First;
+      Count  : Integer := -1;
+      Attr   : Character_Attribute_Set := Normal_Video;
+      Color  : Color_Pair := Color_Pair'First);
+   --  AKA: mvwchgat()
+   --  AKA: mvchgat()
+   pragma Inline (Change_Attributes);
+
+   --  |=====================================================================
+   --  | Man page curs_beep.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Beep;
+   --  AKA: beep()
+   pragma Inline (Beep);
+
+   --  |
+   procedure Flash_Screen;
+   --  AKA: flash()
+   pragma Inline (Flash_Screen);
+
+   --  |=====================================================================
+   --  | Man page curs_inopts.3x
+   --  |=====================================================================
+
+   --  | Not implemented : typeahead
+   --
+   --  |
+   procedure Set_Cbreak_Mode (SwitchOn : Boolean := True);
+   --  AKA: cbreak()
+   --  AKA: nocbreak()
+   pragma Inline (Set_Cbreak_Mode);
+
+   --  |
+   procedure Set_Raw_Mode (SwitchOn : Boolean := True);
+   --  AKA: raw()
+   --  AKA: noraw()
+   pragma Inline (Set_Raw_Mode);
+
+   --  |
+   procedure Set_Echo_Mode (SwitchOn : Boolean := True);
+   --  AKA: echo()
+   --  AKA: noecho()
+   pragma Inline (Set_Echo_Mode);
+
+   --  |
+   procedure Set_Meta_Mode (Win      : Window := Standard_Window;
+                            SwitchOn : Boolean := True);
+   --  AKA: meta()
+   pragma Inline (Set_Meta_Mode);
+
+   --  |
+   procedure Set_KeyPad_Mode (Win      : Window := Standard_Window;
+                              SwitchOn : Boolean := True);
+   --  AKA: keypad()
+   pragma Inline (Set_KeyPad_Mode);
+
+   function Get_KeyPad_Mode (Win : Window := Standard_Window)
+                             return Boolean;
+   --  This has no pendant in C. There you've to look into the WINDOWS
+   --  structure to get the value. Bad practice, not repeated in Ada.
+
+   type Half_Delay_Amount is range 1 .. 255;
+
+   --  |
+   procedure Half_Delay (Amount : Half_Delay_Amount);
+   --  AKA: halfdelay()
+   pragma Inline (Half_Delay);
+
+   --  |
+   procedure Set_Flush_On_Interrupt_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := True);
+   --  AKA: intrflush()
+   pragma Inline (Set_Flush_On_Interrupt_Mode);
+
+   --  |
+   procedure Set_Queue_Interrupt_Mode
+     (Win   : Window := Standard_Window;
+      Flush : Boolean := True);
+   --  AKA: qiflush()
+   --  AKA: noqiflush()
+   pragma Inline (Set_Queue_Interrupt_Mode);
+
+   --  |
+   procedure Set_NoDelay_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False);
+   --  AKA: nodelay()
+   pragma Inline (Set_NoDelay_Mode);
+
+   type Timeout_Mode is (Blocking, Non_Blocking, Delayed);
+
+   --  |
+   procedure Set_Timeout_Mode (Win    : Window := Standard_Window;
+                               Mode   : Timeout_Mode;
+                               Amount : Natural); --  in Milliseconds
+   --  AKA: wtimeout()
+   --  AKA: timeout()
+   --  Instead of overloading the semantic of the sign of amount, we
+   --  introduce the Timeout_Mode parameter. This should improve
+   --  readability. For Blocking and Non_Blocking, the Amount is not
+   --  evaluated.
+   --  We do not inline this procedure.
+
+   --  |
+   procedure Set_Escape_Timer_Mode
+     (Win       : Window := Standard_Window;
+      Timer_Off : Boolean := False);
+   --  AKA: notimeout()
+   pragma Inline (Set_Escape_Timer_Mode);
+
+   --  |=====================================================================
+   --  | Man page curs_outopts.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Set_NL_Mode (SwitchOn : Boolean := True);
+   --  AKA: nl()
+   --  AKA: nonl()
+   pragma Inline (Set_NL_Mode);
+
+   --  |
+   procedure Clear_On_Next_Update
+     (Win      : Window := Standard_Window;
+      Do_Clear : Boolean := True);
+   --  AKA: clearok()
+   pragma Inline (Clear_On_Next_Update);
+
+   --  |
+   procedure Use_Insert_Delete_Line
+     (Win    : Window := Standard_Window;
+      Do_Idl : Boolean := True);
+   --  AKA: idlok()
+   pragma Inline (Use_Insert_Delete_Line);
+
+   --  |
+   procedure Use_Insert_Delete_Character
+     (Win    : Window := Standard_Window;
+      Do_Idc : Boolean := True);
+   --  AKA: idcok()
+   pragma Inline (Use_Insert_Delete_Character);
+
+   --  |
+   procedure Leave_Cursor_After_Update
+     (Win      : Window := Standard_Window;
+      Do_Leave : Boolean := True);
+   --  AKA: leaveok()
+   pragma Inline (Leave_Cursor_After_Update);
+
+   --  |
+   procedure Immediate_Update_Mode
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False);
+   --  AKA: immedok()
+   pragma Inline (Immediate_Update_Mode);
+
+   --  |
+   procedure Allow_Scrolling
+     (Win  : Window := Standard_Window;
+      Mode : Boolean := False);
+   --  AKA: scrollok()
+   pragma Inline (Allow_Scrolling);
+
+   function Scrolling_Allowed (Win : Window := Standard_Window) return Boolean;
+   --  There is no such function in the C interface.
+   pragma Inline (Scrolling_Allowed);
+
+   --  |
+   procedure Set_Scroll_Region
+     (Win         : Window := Standard_Window;
+      Top_Line    : Line_Position;
+      Bottom_Line : Line_Position);
+   --  AKA: wsetscrreg()
+   --  AKA: setscrreg()
+   pragma Inline (Set_Scroll_Region);
+
+   --  |=====================================================================
+   --  | Man page curs_refresh.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Update_Screen;
+   --  AKA: doupdate()
+   pragma Inline (Update_Screen);
+
+   --  |
+   procedure Refresh (Win : Window := Standard_Window);
+   --  AKA: wrefresh()
+   --  There is an overloaded Refresh for Pads.
+   --  The Inline pragma appears there
+   --  AKA: refresh()
+
+   --  |
+   procedure Refresh_Without_Update
+     (Win : Window := Standard_Window);
+   --  AKA: wnoutrefresh()
+   --  There is an overloaded Refresh_Without_Update for Pads.
+   --  The Inline pragma appears there
+
+   --  |
+   procedure Redraw (Win : Window := Standard_Window);
+   --  AKA: redrawwin()
+
+   --  |
+   procedure Redraw (Win        : Window := Standard_Window;
+                     Begin_Line : Line_Position;
+                     Line_Count : Positive);
+   --  AKA: wredrawln()
+   pragma Inline (Redraw);
+
+   --  |=====================================================================
+   --  | Man page curs_clear.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Erase (Win : Window := Standard_Window);
+   --  AKA: werase()
+   --  AKA: erase()
+   pragma Inline (Erase);
+
+   --  |
+   procedure Clear
+     (Win : Window := Standard_Window);
+   --  AKA: wclear()
+   --  AKA: clear()
+   pragma Inline (Clear);
+
+   --  |
+   procedure Clear_To_End_Of_Screen
+     (Win : Window := Standard_Window);
+   --  AKA: wclrtobot()
+   --  AKA: clrtobot()
+   pragma Inline (Clear_To_End_Of_Screen);
+
+   --  |
+   procedure Clear_To_End_Of_Line
+     (Win : Window := Standard_Window);
+   --  AKA: wclrtoeol()
+   --  AKA: clrtoeol()
+   pragma Inline (Clear_To_End_Of_Line);
+
+   --  |=====================================================================
+   --  | Man page curs_bkgd.3x
+   --  |=====================================================================
+
+   --  |
+   --  TODO: we could have Set_Background(Window; Character_Attribute_Set)
+   --  because in C it is common to see bkgdset(A_BOLD) or
+   --  bkgdset(COLOR_PAIR(n))
+   procedure Set_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character);
+   --  AKA: wbkgdset()
+   --  AKA: bkgdset()
+   pragma Inline (Set_Background);
+
+   --  |
+   procedure Change_Background
+     (Win : Window := Standard_Window;
+      Ch  : Attributed_Character);
+   --  AKA: wbkgd()
+   --  AKA: bkgd()
+   pragma Inline (Change_Background);
+
+   --  |
+   --  ? wbkgdget is not listed in curs_bkgd, getbkgd is thpough.
+   function Get_Background (Win : Window := Standard_Window)
+     return Attributed_Character;
+   --  AKA: wbkgdget()
+   --  AKA: bkgdget()
+   pragma Inline (Get_Background);
+
+   --  |=====================================================================
+   --  | Man page curs_touch.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Untouch (Win : Window := Standard_Window);
+   --  AKA: untouchwin()
+   pragma Inline (Untouch);
+
+   --  |
+   procedure Touch (Win : Window := Standard_Window);
+   --  AKA: touchwin()
+
+   --  |
+   procedure Touch (Win   : Window := Standard_Window;
+                    Start : Line_Position;
+                    Count : Positive);
+   --  AKA: touchline()
+   pragma Inline (Touch);
+
+   --  |
+   procedure Change_Lines_Status (Win   : Window := Standard_Window;
+                                  Start : Line_Position;
+                                  Count : Positive;
+                                  State : Boolean);
+   --  AKA: wtouchln()
+   pragma Inline (Change_Lines_Status);
+
+   --  |
+   function Is_Touched (Win  : Window := Standard_Window;
+                        Line : Line_Position) return Boolean;
+   --  AKA: is_linetouched()
+
+   --  |
+   function Is_Touched (Win : Window := Standard_Window) return Boolean;
+   --  AKA: is_wintouched()
+   pragma Inline (Is_Touched);
+
+   --  |=====================================================================
+   --  | Man page curs_overlay.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Copy
+     (Source_Window            : Window;
+      Destination_Window       : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position;
+      Non_Destructive_Mode     : Boolean := True);
+   --  AKA: copywin()
+   pragma Inline (Copy);
+
+   --  |
+   procedure Overwrite (Source_Window      : Window;
+                        Destination_Window : Window);
+   --  AKA: overwrite()
+   pragma Inline (Overwrite);
+
+   --  |
+   procedure Overlay (Source_Window      : Window;
+                      Destination_Window : Window);
+   --  AKA: overlay()
+   pragma Inline (Overlay);
+
+   --  |=====================================================================
+   --  | Man page curs_deleteln.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Insert_Delete_Lines
+     (Win   : Window  := Standard_Window;
+      Lines : Integer := 1); --  default is to insert one line above
+   --  AKA: winsdelln()
+   --  AKA: insdelln()
+   pragma Inline (Insert_Delete_Lines);
+
+   --  |
+   procedure Delete_Line (Win : Window := Standard_Window);
+   --  AKA: wdeleteln()
+   --  AKA: deleteln()
+   pragma Inline (Delete_Line);
+
+   --  |
+   procedure Insert_Line (Win : Window := Standard_Window);
+   --  AKA: winsertln()
+   --  AKA: insertln()
+   pragma Inline (Insert_Line);
+
+   --  |=====================================================================
+   --  | Man page curs_getyx.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Get_Size
+     (Win               : Window := Standard_Window;
+      Number_Of_Lines   : out Line_Count;
+      Number_Of_Columns : out Column_Count);
+   --  AKA: getmaxyx()
+   pragma Inline (Get_Size);
+
+   --  |
+   procedure Get_Window_Position
+     (Win             : Window := Standard_Window;
+      Top_Left_Line   : out Line_Position;
+      Top_Left_Column : out Column_Position);
+   --  AKA: getbegyx()
+   pragma Inline (Get_Window_Position);
+
+   --  |
+   procedure Get_Cursor_Position
+     (Win    : Window := Standard_Window;
+      Line   : out Line_Position;
+      Column : out Column_Position);
+   --  AKA: getyx()
+   pragma Inline (Get_Cursor_Position);
+
+   --  |
+   procedure Get_Origin_Relative_To_Parent
+     (Win                : Window;
+      Top_Left_Line      : out Line_Position;
+      Top_Left_Column    : out Column_Position;
+      Is_Not_A_Subwindow : out Boolean);
+   --  AKA: getparyx()
+   --  Instead of placing -1 in the coordinates as return, we use a Boolean
+   --  to return the info that the window has no parent.
+   pragma Inline (Get_Origin_Relative_To_Parent);
+
+   --  |=====================================================================
+   --  | Man page curs_pad.3x
+   --  |=====================================================================
+
+   --  |
+   function New_Pad (Lines   : Line_Count;
+                     Columns : Column_Count) return Window;
+   --  AKA: newpad()
+   pragma Inline (New_Pad);
+
+   --  |
+   function Sub_Pad
+     (Pad                   : Window;
+      Number_Of_Lines       : Line_Count;
+      Number_Of_Columns     : Column_Count;
+      First_Line_Position   : Line_Position;
+      First_Column_Position : Column_Position) return Window;
+   --  AKA: subpad()
+   pragma Inline (Sub_Pad);
+
+   --  |
+   procedure Refresh
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position);
+   --  AKA: prefresh()
+   pragma Inline (Refresh);
+
+   --  |
+   procedure Refresh_Without_Update
+     (Pad                      : Window;
+      Source_Top_Row           : Line_Position;
+      Source_Left_Column       : Column_Position;
+      Destination_Top_Row      : Line_Position;
+      Destination_Left_Column  : Column_Position;
+      Destination_Bottom_Row   : Line_Position;
+      Destination_Right_Column : Column_Position);
+   --  AKA: pnoutrefresh()
+   pragma Inline (Refresh_Without_Update);
+
+   --  |
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Attributed_Character);
+   --  AKA: pechochar()
+
+   procedure Add_Character_To_Pad_And_Echo_It
+     (Pad : Window;
+      Ch  : Character);
+   pragma Inline (Add_Character_To_Pad_And_Echo_It);
+
+   --  |=====================================================================
+   --  | Man page curs_scroll.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Scroll (Win    : Window  := Standard_Window;
+                     Amount : Integer := 1);
+   --  AKA: wscrl()
+   --  AKA: scroll()
+   --  AKA: scrl()
+   pragma Inline (Scroll);
+
+   --  |=====================================================================
+   --  | Man page curs_delch.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Delete_Character (Win : Window := Standard_Window);
+   --  AKA: wdelch()
+   --  AKA: delch()
+
+   --  |
+   procedure Delete_Character
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position);
+   --  AKA: mvwdelch()
+   --  AKA: mvdelch()
+   pragma Inline (Delete_Character);
+
+   --  |=====================================================================
+   --  | Man page curs_inch.3x
+   --  |=====================================================================
+
+   --  |
+   function Peek (Win : Window := Standard_Window)
+     return Attributed_Character;
+   --  AKA: inch()
+   --  AKA: winch()
+
+   --  |
+   function Peek
+     (Win    : Window := Standard_Window;
+      Line   : Line_Position;
+      Column : Column_Position) return Attributed_Character;
+   --  AKA: mvwinch()
+   --  AKA: mvinch()
+   --  More Peek's follow, pragma Inline appears later.
+
+   --  |=====================================================================
+   --  | Man page curs_insch.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Insert (Win : Window := Standard_Window;
+                     Ch  : Attributed_Character);
+   --  AKA: winsch()
+   --  AKA: insch()
+
+   --  |
+   procedure Insert (Win    : Window := Standard_Window;
+                     Line   : Line_Position;
+                     Column : Column_Position;
+                     Ch     : Attributed_Character);
+   --  AKA: mvwinsch()
+   --  AKA: mvinsch()
+
+   --  |=====================================================================
+   --  | Man page curs_insstr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Insert (Win : Window := Standard_Window;
+                     Str : String;
+                     Len : Integer := -1);
+   --  AKA: winsnstr()
+   --  AKA: winsstr()
+   --  AKA: insnstr()
+   --  AKA: insstr()
+
+   --  |
+   procedure Insert (Win    : Window := Standard_Window;
+                     Line   : Line_Position;
+                     Column : Column_Position;
+                     Str    : String;
+                     Len    : Integer := -1);
+   --  AKA: mvwinsnstr()
+   --  AKA: mvwinsstr()
+   --  AKA: mvinsnstr()
+   --  AKA: mvinsstr()
+   pragma Inline (Insert);
+
+   --  |=====================================================================
+   --  | Man page curs_instr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Peek (Win : Window := Standard_Window;
+                   Str : out String;
+                   Len : Integer := -1);
+   --  AKA: winnstr()
+   --  AKA: winstr()
+   --  AKA: innstr()
+   --  AKA: instr()
+
+   --  |
+   procedure Peek (Win    : Window := Standard_Window;
+                   Line   : Line_Position;
+                   Column : Column_Position;
+                   Str    : out String;
+                   Len    : Integer := -1);
+   --  AKA: mvwinnstr()
+   --  AKA: mvwinstr()
+   --  AKA: mvinnstr()
+   --  AKA: mvinstr()
+
+   --  |=====================================================================
+   --  | Man page curs_inchstr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Peek (Win : Window := Standard_Window;
+                   Str : out Attributed_String;
+                   Len : Integer := -1);
+   --  AKA: winchnstr()
+   --  AKA: winchstr()
+   --  AKA: inchnstr()
+   --  AKA: inchstr()
+
+   --  |
+   procedure Peek (Win    : Window := Standard_Window;
+                   Line   : Line_Position;
+                   Column : Column_Position;
+                   Str    : out Attributed_String;
+                   Len    : Integer := -1);
+   --  AKA: mvwinchnstr()
+   --  AKA: mvwinchstr()
+   --  AKA: mvinchnstr()
+   --  AKA: mvinchstr()
+   --  We do not inline the Peek procedures
+
+   --  |=====================================================================
+   --  | Man page curs_getstr.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Get (Win : Window := Standard_Window;
+                  Str : out String;
+                  Len : Integer := -1);
+   --  AKA: wgetnstr()
+   --  AKA: wgetstr()
+   --  AKA: getnstr()
+   --  AKA: getstr()
+   --  actually getstr is not supported because that results in buffer
+   --  overflows.
+
+   --  |
+   procedure Get (Win    : Window := Standard_Window;
+                  Line   : Line_Position;
+                  Column : Column_Position;
+                  Str    : out String;
+                  Len    : Integer := -1);
+   --  AKA: mvwgetnstr()
+   --  AKA: mvwgetstr()
+   --  AKA: mvgetnstr()
+   --  AKA: mvgetstr()
+   --  Get is not inlined
+
+   --  |=====================================================================
+   --  | Man page curs_slk.3x
+   --  |=====================================================================
+
+   --  Not Implemented: slk_attr_on, slk_attr_off, slk_attr_set
+
+   type Soft_Label_Key_Format is (Three_Two_Three,
+                                  Four_Four,
+                                  PC_Style,              --  ncurses specific
+                                  PC_Style_With_Index);  --  "
+   type Label_Number is new Positive range 1 .. 12;
+   type Label_Justification is (Left, Centered, Right);
+
+   --  |
+   procedure Init_Soft_Label_Keys
+     (Format : Soft_Label_Key_Format := Three_Two_Three);
+   --  AKA: slk_init()
+   pragma Inline (Init_Soft_Label_Keys);
+
+   --  |
+   procedure Set_Soft_Label_Key (Label : Label_Number;
+                                 Text  : String;
+                                 Fmt   : Label_Justification := Left);
+   --  AKA: slk_set()
+   --  We do not inline this procedure
+
+   --  |
+   procedure Refresh_Soft_Label_Keys;
+   --  AKA: slk_refresh()
+   pragma Inline (Refresh_Soft_Label_Keys);
+
+   --  |
+   procedure Refresh_Soft_Label_Keys_Without_Update;
+   --  AKA: slk_noutrefresh()
+   pragma Inline (Refresh_Soft_Label_Keys_Without_Update);
+
+   --  |
+   procedure Get_Soft_Label_Key (Label : Label_Number;
+                                 Text  : out String);
+   --  AKA: slk_label()
+
+   --  |
+   function Get_Soft_Label_Key (Label : Label_Number) return String;
+   --  AKA: slk_label()
+   --  Same as function
+   pragma Inline (Get_Soft_Label_Key);
+
+   --  |
+   procedure Clear_Soft_Label_Keys;
+   --  AKA: slk_clear()
+   pragma Inline (Clear_Soft_Label_Keys);
+
+   --  |
+   procedure Restore_Soft_Label_Keys;
+   --  AKA: slk_restore()
+   pragma Inline (Restore_Soft_Label_Keys);
+
+   --  |
+   procedure Touch_Soft_Label_Keys;
+   --  AKA: slk_touch()
+   pragma Inline (Touch_Soft_Label_Keys);
+
+   --  |
+   procedure Switch_Soft_Label_Key_Attributes
+     (Attr : Character_Attribute_Set;
+      On   : Boolean := True);
+   --  AKA: slk_attron()
+   --  AKA: slk_attroff()
+   pragma Inline (Switch_Soft_Label_Key_Attributes);
+
+   --  |
+   procedure Set_Soft_Label_Key_Attributes
+     (Attr  : Character_Attribute_Set := Normal_Video;
+      Color : Color_Pair := Color_Pair'First);
+   --  AKA: slk_attrset()
+   pragma Inline (Set_Soft_Label_Key_Attributes);
+
+   --  |
+   function Get_Soft_Label_Key_Attributes return Character_Attribute_Set;
+   --  AKA: slk_attr()
+
+   --  |
+   function Get_Soft_Label_Key_Attributes return Color_Pair;
+   --  AKA: slk_attr()
+   pragma Inline (Get_Soft_Label_Key_Attributes);
+
+   --  |
+   procedure Set_Soft_Label_Key_Color (Pair : Color_Pair);
+   --  AKA: slk_color()
+   pragma Inline (Set_Soft_Label_Key_Color);
+
+   --  |=====================================================================
+   --  | Man page keybound.3x
+   --  |=====================================================================
+   --  Not Implemented: keybound
+
+   --  |=====================================================================
+   --  | Man page keyok.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Enable_Key (Key    : Special_Key_Code;
+                         Enable : Boolean := True);
+   --  AKA: keyok()
+   pragma Inline (Enable_Key);
+
+   --  |=====================================================================
+   --  | Man page define_key.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Define_Key (Definition : String;
+                         Key        : Special_Key_Code);
+   --  AKA: define_key()
+   pragma Inline (Define_Key);
+
+   --  |=====================================================================
+   --  | Man page curs_util.3x
+   --  |=====================================================================
+
+   --  | Not implemented : filter, use_env
+   --  | putwin, getwin are in the child package PutWin
+   --
+
+   --  |
+   procedure Key_Name (Key  : Real_Key_Code;
+                       Name : out String);
+   --  AKA: keyname()
+   --  The external name for a real keystroke.
+
+   --  |
+   function Key_Name (Key  : Real_Key_Code) return String;
+   --  AKA: keyname()
+   --  Same as function
+   --  We do not inline this routine
+
+   --  |
+   procedure Un_Control (Ch  : Attributed_Character;
+                         Str : out String);
+   --  AKA: unctrl()
+
+   --  |
+   function Un_Control (Ch  : Attributed_Character) return String;
+   --  AKA: unctrl()
+   --  Same as function
+   pragma Inline (Un_Control);
+
+   --  |
+   procedure Delay_Output (Msecs : Natural);
+   --  AKA: delay_output()
+   pragma Inline (Delay_Output);
+
+   --  |
+   procedure Flush_Input;
+   --  AKA: flushinp()
+   pragma Inline (Flush_Input);
+
+   --  |=====================================================================
+   --  | Man page curs_termattrs.3x
+   --  |=====================================================================
+
+   --  |
+   function Baudrate return Natural;
+   --  AKA: baudrate()
+   pragma Inline (Baudrate);
+
+   --  |
+   function Erase_Character return Character;
+   --  AKA: erasechar()
+   pragma Inline (Erase_Character);
+
+   --  |
+   function Kill_Character return Character;
+   --  AKA: killchar()
+   pragma Inline (Kill_Character);
+
+   --  |
+   function Has_Insert_Character return Boolean;
+   --  AKA: has_ic()
+   pragma Inline (Has_Insert_Character);
+
+   --  |
+   function Has_Insert_Line return Boolean;
+   --  AKA: has_il()
+   pragma Inline (Has_Insert_Line);
+
+   --  |
+   function Supported_Attributes return Character_Attribute_Set;
+   --  AKA: termattrs()
+   pragma Inline (Supported_Attributes);
+
+   --  |
+   procedure Long_Name (Name : out String);
+   --  AKA: longname()
+
+   --  |
+   function Long_Name return String;
+   --  AKA: longname()
+   --  Same as function
+   pragma Inline (Long_Name);
+
+   --  |
+   procedure Terminal_Name (Name : out String);
+   --  AKA: termname()
+
+   --  |
+   function Terminal_Name return String;
+   --  AKA: termname()
+   --  Same as function
+   pragma Inline (Terminal_Name);
+
+   --  |=====================================================================
+   --  | Man page curs_color.3x
+   --  |=====================================================================
+
+   --  COLOR_PAIR
+   --  COLOR_PAIR(n) in C is the same as
+   --  Attributed_Character(Ch => Nul, Color => n, Attr => Normal_Video)
+   --  In C you often see something like c = c | COLOR_PAIR(n);
+   --  This is equivalent to c.Color := n;
+
+   --  |
+   procedure Start_Color;
+   --  AKA: start_color()
+   pragma Import (C, Start_Color, "start_color");
+
+   --  |
+   procedure Init_Pair (Pair : Redefinable_Color_Pair;
+                        Fore : Color_Number;
+                        Back : Color_Number);
+   --  AKA: init_pair()
+   pragma Inline (Init_Pair);
+
+   --  |
+   procedure Pair_Content (Pair : Color_Pair;
+                           Fore : out Color_Number;
+                           Back : out Color_Number);
+   --  AKA: pair_content()
+   pragma Inline (Pair_Content);
+
+   --  |
+   function Has_Colors return Boolean;
+   --  AKA: has_colors()
+   pragma Inline (Has_Colors);
+
+   --  |
+   procedure Init_Color (Color : Color_Number;
+                         Red   : RGB_Value;
+                         Green : RGB_Value;
+                         Blue  : RGB_Value);
+   --  AKA: init_color()
+   pragma Inline (Init_Color);
+
+   --  |
+   function Can_Change_Color return Boolean;
+   --  AKA: can_change_color()
+   pragma Inline (Can_Change_Color);
+
+   --  |
+   procedure Color_Content (Color : Color_Number;
+                            Red   : out RGB_Value;
+                            Green : out RGB_Value;
+                            Blue  : out RGB_Value);
+   --  AKA: color_content()
+   pragma Inline (Color_Content);
+
+   --  |=====================================================================
+   --  | Man page curs_kernel.3x
+   --  |=====================================================================
+   --  | Not implemented: getsyx, setsyx
+   --
+   type Curses_Mode is (Curses, Shell);
+
+   --  |
+   procedure Save_Curses_Mode (Mode : Curses_Mode);
+   --  AKA: def_prog_mode()
+   --  AKA: def_shell_mode()
+   pragma Inline (Save_Curses_Mode);
+
+   --  |
+   procedure Reset_Curses_Mode (Mode : Curses_Mode);
+   --  AKA: reset_prog_mode()
+   --  AKA: reset_shell_mode()
+   pragma Inline (Reset_Curses_Mode);
+
+   --  |
+   procedure Save_Terminal_State;
+   --  AKA: savetty()
+   pragma Inline (Save_Terminal_State);
+
+   --  |
+   procedure Reset_Terminal_State;
+   --  AKA: resetty();
+   pragma Inline (Reset_Terminal_State);
+
+   type Stdscr_Init_Proc is access
+      function (Win     : Window;
+                Columns : Column_Count) return Integer;
+   pragma Convention (C, Stdscr_Init_Proc);
+   --  N.B.: the return value is actually ignored, but it seems to be
+   --        a good practice to return 0 if you think all went fine
+   --        and -1 otherwise.
+
+   --  |
+   procedure Rip_Off_Lines (Lines : Integer;
+                            Proc  : Stdscr_Init_Proc);
+   --  AKA: ripoffline()
+   --  N.B.: to be more precise, this uses a ncurses specific enhancement of
+   --        ripoffline(), in which the Lines argument absolute value is the
+   --        number of lines to be ripped of. The official ripoffline() only
+   --        uses the sign of Lines to remove a single line from bottom or top.
+   pragma Inline (Rip_Off_Lines);
+
+   type Cursor_Visibility is (Invisible, Normal, Very_Visible);
+
+   --  |
+   procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility);
+   --  AKA: curs_set()
+   pragma Inline (Set_Cursor_Visibility);
+
+   --  |
+   procedure Nap_Milli_Seconds (Ms : Natural);
+   --  AKA: napms()
+   pragma Inline (Nap_Milli_Seconds);
+
+   --  |=====================================================================
+   --  | Some useful helpers.
+   --  |=====================================================================
+   type Transform_Direction is (From_Screen, To_Screen);
+   procedure Transform_Coordinates
+     (W      : Window := Standard_Window;
+      Line   : in out Line_Position;
+      Column : in out Column_Position;
+      Dir    : Transform_Direction := From_Screen);
+   --  This procedure transforms screen coordinates into coordinates relative
+   --  to the window and vice versa, depending on the Dir parameter.
+   --  Screen coordinates are the position information for the physical device.
+   --  An Curses_Exception will be raised if Line and Column are not in the
+   --  Window or if you pass the Null_Window as argument.
+   --  We do not inline this procedure
+
+   --  |=====================================================================
+   --  | Man page default_colors.3x
+   --  |=====================================================================
+
+   Default_Color : constant Color_Number := -1;
+
+   --  |
+   procedure Use_Default_Colors;
+   --  AKA: use_default_colors()
+   pragma Inline (Use_Default_Colors);
+
+   --  |
+   procedure Assume_Default_Colors (Fore : Color_Number := Default_Color;
+                                    Back : Color_Number := Default_Color);
+   --  AKA: assume_default_colors()
+   pragma Inline (Assume_Default_Colors);
+
+   --  |=====================================================================
+   --  | Man page curs_extend.3x
+   --  |=====================================================================
+
+   --  |
+   function Curses_Version return String;
+   --  AKA: curses_version()
+
+   --  |
+   --  The returnvalue is the previous setting of the flag
+   function Use_Extended_Names (Enable : Boolean) return Boolean;
+   --  AKA: use_extended_names()
+
+   --  |=====================================================================
+   --  | Man page curs_trace.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Curses_Free_All;
+   --  AKA: _nc_freeall()
+
+   --  |=====================================================================
+   --  | Man page curs_scr_dump.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Screen_Dump_To_File (Filename : String);
+   --  AKA: scr_dump()
+
+   --  |
+   procedure Screen_Restore_From_File (Filename : String);
+   --  AKA: scr_restore()
+
+   --  |
+   procedure Screen_Init_From_File (Filename : String);
+   --  AKA: scr_init()
+
+   --  |
+   procedure Screen_Set_File (Filename : String);
+   --  AKA: scr_set()
+
+   --  |=====================================================================
+   --  | Man page curs_print.3x
+   --  |=====================================================================
+   --  Not implemented: mcprint
+
+   --  |=====================================================================
+   --  | Man page curs_printw.3x
+   --  |=====================================================================
+   --  Not implemented: printw,  wprintw, mvprintw, mvwprintw, vwprintw,
+   --                   vw_printw
+   --  Please use the Ada style Text_IO child packages for formatted
+   --  printing. It does not make a lot of sense to map the printf style
+   --  C functions to Ada.
+
+   --  |=====================================================================
+   --  | Man page curs_scanw.3x
+   --  |=====================================================================
+   --  Not implemented: scanw, wscanw, mvscanw, mvwscanw, vwscanw, vw_scanw
+
+   --  |=====================================================================
+   --  | Man page resizeterm.3x
+   --  |=====================================================================
+   --  Not Implemented: resizeterm
+
+   --  |=====================================================================
+   --  | Man page wresize.3x
+   --  |=====================================================================
+
+   --  |
+   procedure Resize (Win               : Window := Standard_Window;
+                     Number_Of_Lines   : Line_Count;
+                     Number_Of_Columns : Column_Count);
+   --  AKA: wresize()
+
+private
+   type Window is new System.Storage_Elements.Integer_Address;
+   Null_Window : constant Window := 0;
+
+   --  The next constants are generated and may be different on your
+   --  architecture.
+   --
+
+   Sizeof_Bool : constant := Curses_Constants.Sizeof_Bool;
+
+   type Curses_Bool is mod 2 ** Sizeof_Bool;
+
+   Curses_Bool_False : constant Curses_Bool := 0;
+
+end Terminal_Interface.Curses;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface-curses_constants__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface-curses_constants__ads.htm new file mode 100644 index 00000000..5a10ea48 --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface-curses_constants__ads.htm @@ -0,0 +1,401 @@ + + + +terminal_interface-curses_constants.ads + + + + +

File : terminal_interface-curses_constants.ads


+
+--  Generated by the C program ./generate (source ./gen.c).
+--  Do not edit this file directly.
+--  The values provided here may vary on your system.
+
+with System;
+package Terminal_Interface.Curses_Constants is
+   pragma Pure;
+
+   DFT_ARG_SUFFIX : constant String := "w";
+   Bit_Order : constant System.Bit_Order := System.Low_Order_First;
+   Sizeof_Bool                  : constant := 8;
+   OK                           : constant := 0;
+   ERR                          : constant := -1;
+   pragma Warnings (Off); -- redefinition of Standard.True and False
+   TRUE                         : constant := 1;
+   FALSE                        : constant := 0;
+   pragma Warnings (On);
+
+   --  Version of the ncurses library from extensions(3NCURSES)
+
+   NCURSES_VERSION_MAJOR        : constant := 6;
+   NCURSES_VERSION_MINOR        : constant := 5;
+   Version : constant String := "6.5";
+
+   --  Character non-color attributes from attr(3NCURSES)
+
+   --  attr_t and chtype may be signed in C.
+   type attr_t is mod 2 ** 32;
+   A_CHARTEXT_First             : constant := 0;
+   A_CHARTEXT_Last              : constant := 7;
+   A_COLOR_First                : constant := 8;
+   A_COLOR_Last                 : constant := 15;
+   Attr_First                   : constant := 16;
+   Attr_Last                    : constant := 31;
+   A_STANDOUT_First             : constant := 16;
+   A_STANDOUT_Last              : constant := 16;
+   A_UNDERLINE_First            : constant := 17;
+   A_UNDERLINE_Last             : constant := 17;
+   A_REVERSE_First              : constant := 18;
+   A_REVERSE_Last               : constant := 18;
+   A_BLINK_First                : constant := 19;
+   A_BLINK_Last                 : constant := 19;
+   A_DIM_First                  : constant := 20;
+   A_DIM_Last                   : constant := 20;
+   A_BOLD_First                 : constant := 21;
+   A_BOLD_Last                  : constant := 21;
+   A_PROTECT_First              : constant := 24;
+   A_PROTECT_Last               : constant := 24;
+   A_INVIS_First                : constant := 23;
+   A_INVIS_Last                 : constant := 23;
+   A_ALTCHARSET_First           : constant := 22;
+   A_ALTCHARSET_Last            : constant := 22;
+   A_HORIZONTAL_First           : constant := 25;
+   A_HORIZONTAL_Last            : constant := 25;
+   A_LEFT_First                 : constant := 26;
+   A_LEFT_Last                  : constant := 26;
+   A_LOW_First                  : constant := 27;
+   A_LOW_Last                   : constant := 27;
+   A_RIGHT_First                : constant := 28;
+   A_RIGHT_Last                 : constant := 28;
+   A_TOP_First                  : constant := 29;
+   A_TOP_Last                   : constant := 29;
+   A_VERTICAL_First             : constant := 30;
+   A_VERTICAL_Last              : constant := 30;
+   chtype_Size                  : constant := 32;
+
+   --  predefined color numbers from color(3NCURSES)
+
+   COLOR_BLACK                  : constant := 0;
+   COLOR_RED                    : constant := 1;
+   COLOR_GREEN                  : constant := 2;
+   COLOR_YELLOW                 : constant := 3;
+   COLOR_BLUE                   : constant := 4;
+   COLOR_MAGENTA                : constant := 5;
+   COLOR_CYAN                   : constant := 6;
+   COLOR_WHITE                  : constant := 7;
+
+   --  ETI return codes from ncurses.h
+
+   E_OK                         : constant := 0;
+   E_SYSTEM_ERROR               : constant := -1;
+   E_BAD_ARGUMENT               : constant := -2;
+   E_POSTED                     : constant := -3;
+   E_CONNECTED                  : constant := -4;
+   E_BAD_STATE                  : constant := -5;
+   E_NO_ROOM                    : constant := -6;
+   E_NOT_POSTED                 : constant := -7;
+   E_UNKNOWN_COMMAND            : constant := -8;
+   E_NO_MATCH                   : constant := -9;
+   E_NOT_SELECTABLE             : constant := -10;
+   E_NOT_CONNECTED              : constant := -11;
+   E_REQUEST_DENIED             : constant := -12;
+   E_INVALID_FIELD              : constant := -13;
+   E_CURRENT                    : constant := -14;
+
+   --  Input key codes not defined in any ncurses manpage
+
+   KEY_MIN                      : constant := 257;
+   KEY_MAX                      : constant := 511;
+   KEY_CODE_YES                 : constant := 256;
+
+   --  Input key codes from getch(3NCURSES)
+
+   KEY_BREAK                    : constant := 257;
+   KEY_DOWN                     : constant := 258;
+   KEY_UP                       : constant := 259;
+   KEY_LEFT                     : constant := 260;
+   KEY_RIGHT                    : constant := 261;
+   KEY_HOME                     : constant := 262;
+   KEY_BACKSPACE                : constant := 263;
+   KEY_F0                       : constant := 264;
+   KEY_F1                       : constant := 265;
+   KEY_F2                       : constant := 266;
+   KEY_F3                       : constant := 267;
+   KEY_F4                       : constant := 268;
+   KEY_F5                       : constant := 269;
+   KEY_F6                       : constant := 270;
+   KEY_F7                       : constant := 271;
+   KEY_F8                       : constant := 272;
+   KEY_F9                       : constant := 273;
+   KEY_F10                      : constant := 274;
+   KEY_F11                      : constant := 275;
+   KEY_F12                      : constant := 276;
+   KEY_F13                      : constant := 277;
+   KEY_F14                      : constant := 278;
+   KEY_F15                      : constant := 279;
+   KEY_F16                      : constant := 280;
+   KEY_F17                      : constant := 281;
+   KEY_F18                      : constant := 282;
+   KEY_F19                      : constant := 283;
+   KEY_F20                      : constant := 284;
+   KEY_F21                      : constant := 285;
+   KEY_F22                      : constant := 286;
+   KEY_F23                      : constant := 287;
+   KEY_F24                      : constant := 288;
+   KEY_DL                       : constant := 328;
+   KEY_IL                       : constant := 329;
+   KEY_DC                       : constant := 330;
+   KEY_IC                       : constant := 331;
+   KEY_EIC                      : constant := 332;
+   KEY_CLEAR                    : constant := 333;
+   KEY_EOS                      : constant := 334;
+   KEY_EOL                      : constant := 335;
+   KEY_SF                       : constant := 336;
+   KEY_SR                       : constant := 337;
+   KEY_NPAGE                    : constant := 338;
+   KEY_PPAGE                    : constant := 339;
+   KEY_STAB                     : constant := 340;
+   KEY_CTAB                     : constant := 341;
+   KEY_CATAB                    : constant := 342;
+   KEY_ENTER                    : constant := 343;
+   KEY_SRESET                   : constant := 344;
+   KEY_RESET                    : constant := 345;
+   KEY_PRINT                    : constant := 346;
+   KEY_LL                       : constant := 347;
+   KEY_A1                       : constant := 348;
+   KEY_A3                       : constant := 349;
+   KEY_B2                       : constant := 350;
+   KEY_C1                       : constant := 351;
+   KEY_C3                       : constant := 352;
+   KEY_BTAB                     : constant := 353;
+   KEY_BEG                      : constant := 354;
+   KEY_CANCEL                   : constant := 355;
+   KEY_CLOSE                    : constant := 356;
+   KEY_COMMAND                  : constant := 357;
+   KEY_COPY                     : constant := 358;
+   KEY_CREATE                   : constant := 359;
+   KEY_END                      : constant := 360;
+   KEY_EXIT                     : constant := 361;
+   KEY_FIND                     : constant := 362;
+   KEY_HELP                     : constant := 363;
+   KEY_MARK                     : constant := 364;
+   KEY_MESSAGE                  : constant := 365;
+   KEY_MOVE                     : constant := 366;
+   KEY_NEXT                     : constant := 367;
+   KEY_OPEN                     : constant := 368;
+   KEY_OPTIONS                  : constant := 369;
+   KEY_PREVIOUS                 : constant := 370;
+   KEY_REDO                     : constant := 371;
+   KEY_REFERENCE                : constant := 372;
+   KEY_REFRESH                  : constant := 373;
+   KEY_REPLACE                  : constant := 374;
+   KEY_RESTART                  : constant := 375;
+   KEY_RESUME                   : constant := 376;
+   KEY_SAVE                     : constant := 377;
+   KEY_SBEG                     : constant := 378;
+   KEY_SCANCEL                  : constant := 379;
+   KEY_SCOMMAND                 : constant := 380;
+   KEY_SCOPY                    : constant := 381;
+   KEY_SCREATE                  : constant := 382;
+   KEY_SDC                      : constant := 383;
+   KEY_SDL                      : constant := 384;
+   KEY_SELECT                   : constant := 385;
+   KEY_SEND                     : constant := 386;
+   KEY_SEOL                     : constant := 387;
+   KEY_SEXIT                    : constant := 388;
+   KEY_SFIND                    : constant := 389;
+   KEY_SHELP                    : constant := 390;
+   KEY_SHOME                    : constant := 391;
+   KEY_SIC                      : constant := 392;
+   KEY_SLEFT                    : constant := 393;
+   KEY_SMESSAGE                 : constant := 394;
+   KEY_SMOVE                    : constant := 395;
+   KEY_SNEXT                    : constant := 396;
+   KEY_SOPTIONS                 : constant := 397;
+   KEY_SPREVIOUS                : constant := 398;
+   KEY_SPRINT                   : constant := 399;
+   KEY_SREDO                    : constant := 400;
+   KEY_SREPLACE                 : constant := 401;
+   KEY_SRIGHT                   : constant := 402;
+   KEY_SRSUME                   : constant := 403;
+   KEY_SSAVE                    : constant := 404;
+   KEY_SSUSPEND                 : constant := 405;
+   KEY_SUNDO                    : constant := 406;
+   KEY_SUSPEND                  : constant := 407;
+   KEY_UNDO                     : constant := 408;
+   KEY_MOUSE                    : constant := 409;
+   KEY_RESIZE                   : constant := 410;
+
+   --  alternate character codes (ACS) from addch(3NCURSES)
+
+   ACS_ULCORNER                 : constant := 108;
+   ACS_LLCORNER                 : constant := 109;
+   ACS_URCORNER                 : constant := 107;
+   ACS_LRCORNER                 : constant := 106;
+   ACS_LTEE                     : constant := 116;
+   ACS_RTEE                     : constant := 117;
+   ACS_BTEE                     : constant := 118;
+   ACS_TTEE                     : constant := 119;
+   ACS_HLINE                    : constant := 113;
+   ACS_VLINE                    : constant := 120;
+   ACS_PLUS                     : constant := 110;
+   ACS_S1                       : constant := 111;
+   ACS_S9                       : constant := 115;
+   ACS_DIAMOND                  : constant := 96;
+   ACS_CKBOARD                  : constant := 97;
+   ACS_DEGREE                   : constant := 102;
+   ACS_PLMINUS                  : constant := 103;
+   ACS_BULLET                   : constant := 126;
+   ACS_LARROW                   : constant := 44;
+   ACS_RARROW                   : constant := 43;
+   ACS_DARROW                   : constant := 46;
+   ACS_UARROW                   : constant := 45;
+   ACS_BOARD                    : constant := 104;
+   ACS_LANTERN                  : constant := 105;
+   ACS_BLOCK                    : constant := 48;
+   ACS_S3                       : constant := 112;
+   ACS_S7                       : constant := 114;
+   ACS_LEQUAL                   : constant := 121;
+   ACS_GEQUAL                   : constant := 122;
+   ACS_PI                       : constant := 123;
+   ACS_NEQUAL                   : constant := 124;
+   ACS_STERLING                 : constant := 125;
+
+   --  Menu_Options from opts(3MENU)
+
+   O_ONEVALUE_First             : constant := 0;
+   O_ONEVALUE_Last              : constant := 0;
+   O_SHOWDESC_First             : constant := 1;
+   O_SHOWDESC_Last              : constant := 1;
+   O_ROWMAJOR_First             : constant := 2;
+   O_ROWMAJOR_Last              : constant := 2;
+   O_IGNORECASE_First           : constant := 3;
+   O_IGNORECASE_Last            : constant := 3;
+   O_SHOWMATCH_First            : constant := 4;
+   O_SHOWMATCH_Last             : constant := 4;
+   O_NONCYCLIC_First            : constant := 5;
+   O_NONCYCLIC_Last             : constant := 5;
+   Menu_Options_Size            : constant := 32;
+
+   --  Item_Options from menu_opts(3MENU)
+
+   O_SELECTABLE_First           : constant := 0;
+   O_SELECTABLE_Last            : constant := 0;
+   Item_Options_Size            : constant := 32;
+
+   --  Field_Options from field_opts(3FORM)
+
+   O_VISIBLE_First              : constant := 0;
+   O_VISIBLE_Last               : constant := 0;
+   O_ACTIVE_First               : constant := 1;
+   O_ACTIVE_Last                : constant := 1;
+   O_PUBLIC_First               : constant := 2;
+   O_PUBLIC_Last                : constant := 2;
+   O_EDIT_First                 : constant := 3;
+   O_EDIT_Last                  : constant := 3;
+   O_WRAP_First                 : constant := 4;
+   O_WRAP_Last                  : constant := 4;
+   O_BLANK_First                : constant := 5;
+   O_BLANK_Last                 : constant := 5;
+   O_AUTOSKIP_First             : constant := 6;
+   O_AUTOSKIP_Last              : constant := 6;
+   O_NULLOK_First               : constant := 7;
+   O_NULLOK_Last                : constant := 7;
+   O_PASSOK_First               : constant := 8;
+   O_PASSOK_Last                : constant := 8;
+   O_STATIC_First               : constant := 9;
+   O_STATIC_Last                : constant := 9;
+   Field_Options_Size           : constant := 32;
+
+   --  Field_Options from opts(3FORM)
+
+   O_NL_OVERLOAD_First          : constant := 0;
+   O_NL_OVERLOAD_Last           : constant := 0;
+   O_BS_OVERLOAD_First          : constant := 1;
+   O_BS_OVERLOAD_Last           : constant := 1;
+
+   --  MEVENT structure from mouse(3NCURSES)
+
+   MEVENT_id_First              : constant := 0;
+   MEVENT_id_Last               : constant := 15;
+   MEVENT_x_First               : constant := 32;
+   MEVENT_x_Last                : constant := 63;
+   MEVENT_y_First               : constant := 64;
+   MEVENT_y_Last                : constant := 95;
+   MEVENT_z_First               : constant := 96;
+   MEVENT_z_Last                : constant := 127;
+   MEVENT_bstate_First          : constant := 128;
+   MEVENT_bstate_Last           : constant := 159;
+   MEVENT_Size                  : constant := 160;
+
+   --  mouse events from mouse(3NCURSES)
+
+   BUTTON1_RELEASED             : constant := 1;
+   BUTTON1_PRESSED              : constant := 2;
+   BUTTON1_CLICKED              : constant := 4;
+   BUTTON1_DOUBLE_CLICKED       : constant := 8;
+   BUTTON1_TRIPLE_CLICKED       : constant := 16;
+   all_events_button_1          : constant := 31;
+   BUTTON2_RELEASED             : constant := 32;
+   BUTTON2_PRESSED              : constant := 64;
+   BUTTON2_CLICKED              : constant := 128;
+   BUTTON2_DOUBLE_CLICKED       : constant := 256;
+   BUTTON2_TRIPLE_CLICKED       : constant := 512;
+   all_events_button_2          : constant := 992;
+   BUTTON3_RELEASED             : constant := 1024;
+   BUTTON3_PRESSED              : constant := 2048;
+   BUTTON3_CLICKED              : constant := 4096;
+   BUTTON3_DOUBLE_CLICKED       : constant := 8192;
+   BUTTON3_TRIPLE_CLICKED       : constant := 16384;
+   all_events_button_3          : constant := 31744;
+   BUTTON4_RELEASED             : constant := 32768;
+   BUTTON4_PRESSED              : constant := 65536;
+   BUTTON4_CLICKED              : constant := 131072;
+   BUTTON4_DOUBLE_CLICKED       : constant := 262144;
+   BUTTON4_TRIPLE_CLICKED       : constant := 524288;
+   all_events_button_4          : constant := 1015808;
+   BUTTON_CTRL                  : constant := 33554432;
+   BUTTON_SHIFT                 : constant := 67108864;
+   BUTTON_ALT                   : constant := 134217728;
+   REPORT_MOUSE_POSITION        : constant := 268435456;
+   ALL_MOUSE_EVENTS             : constant := 268435455;
+
+   --  trace selection from trace(3NCURSES)
+
+   TRACE_TIMES_First            : constant := 0;
+   TRACE_TIMES_Last             : constant := 0;
+   TRACE_TPUTS_First            : constant := 1;
+   TRACE_TPUTS_Last             : constant := 1;
+   TRACE_UPDATE_First           : constant := 2;
+   TRACE_UPDATE_Last            : constant := 2;
+   TRACE_MOVE_First             : constant := 3;
+   TRACE_MOVE_Last              : constant := 3;
+   TRACE_CHARPUT_First          : constant := 4;
+   TRACE_CHARPUT_Last           : constant := 4;
+   TRACE_CALLS_First            : constant := 5;
+   TRACE_CALLS_Last             : constant := 5;
+   TRACE_VIRTPUT_First          : constant := 6;
+   TRACE_VIRTPUT_Last           : constant := 6;
+   TRACE_IEVENT_First           : constant := 7;
+   TRACE_IEVENT_Last            : constant := 7;
+   TRACE_BITS_First             : constant := 8;
+   TRACE_BITS_Last              : constant := 8;
+   TRACE_ICALLS_First           : constant := 9;
+   TRACE_ICALLS_Last            : constant := 9;
+   TRACE_CCALLS_First           : constant := 10;
+   TRACE_CCALLS_Last            : constant := 10;
+   TRACE_DATABASE_First         : constant := 11;
+   TRACE_DATABASE_Last          : constant := 11;
+   TRACE_ATTRS_First            : constant := 12;
+   TRACE_ATTRS_Last             : constant := 12;
+   Trace_Size                   : constant := 32;
+end Terminal_Interface.Curses_Constants;
+
diff --git a/contrib/ncurses/doc/html/ada/terminal_interface__ads.htm b/contrib/ncurses/doc/html/ada/terminal_interface__ads.htm new file mode 100644 index 00000000..6876bd0b --- /dev/null +++ b/contrib/ncurses/doc/html/ada/terminal_interface__ads.htm @@ -0,0 +1,66 @@ + + + +terminal_interface.ads + + + + +

File : terminal_interface.ads


+
+------------------------------------------------------------------------------
+--                                                                          --
+--                           GNAT ncurses Binding                           --
+--                                                                          --
+--                            Terminal_Interface                            --
+--                                                                          --
+--                                 S P E C                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+-- Copyright 2020 Thomas E. Dickey                                          --
+-- Copyright 1999-2003,2006 Free Software Foundation, Inc.                  --
+--                                                                          --
+-- Permission is hereby granted, free of charge, to any person obtaining a  --
+-- copy of this software and associated documentation files (the            --
+-- "Software"), to deal in the Software without restriction, including      --
+-- without limitation the rights to use, copy, modify, merge, publish,      --
+-- distribute, distribute with modifications, sublicense, and/or sell       --
+-- copies of the Software, and to permit persons to whom the Software is    --
+-- furnished to do so, subject to the following conditions:                 --
+--                                                                          --
+-- The above copyright notice and this permission notice shall be included  --
+-- in all copies or substantial portions of the Software.                   --
+--                                                                          --
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
+-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
+-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
+-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
+-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
+-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
+-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
+--                                                                          --
+-- Except as contained in this notice, the name(s) of the above copyright   --
+-- holders shall not be used in advertising or otherwise to promote the     --
+-- sale, use or other dealings in this Software without prior written       --
+-- authorization.                                                           --
+------------------------------------------------------------------------------
+--  Author:  Juergen Pfeifer, 1996
+--  Version Control:
+--  @Revision: 1.15 @
+--  @Date: 2020/02/02 23:34:34 @
+--  Binding Version 01.00
+------------------------------------------------------------------------------
+package Terminal_Interface is
+   pragma Pure (Terminal_Interface);
+--
+--  Everything is in the child units
+--
+end Terminal_Interface;
+
diff --git a/contrib/ncurses/doc/html/announce.html b/contrib/ncurses/doc/html/announce.html new file mode 100644 index 00000000..2aa03cfa --- /dev/null +++ b/contrib/ncurses/doc/html/announce.html @@ -0,0 +1,1754 @@ + + + + + + Announcing ncurses 6.5 + + + + + +

Announcing ncurses 6.5

+ +

Overview

+ +

The ncurses (new curses) + library is a free software emulation of curses in System V + Release 4.0 (SVr4), and more. It uses terminfo format, supports + pads and color and multiple highlights and forms characters and + function-key mapping, and has all the other SVr4-curses + enhancements over BSD curses. SVr4 curses became the basis of + X/Open Curses.

+ +

In mid-June 1995, the maintainer of 4.4BSD curses declared + that he considered 4.4BSD curses obsolete, and encouraged the + keepers of unix releases such as + BSD/OS, FreeBSD and NetBSD to switch over to ncurses.

+ +

Since 1995, ncurses has been + ported to many systems:

+ +
    +
  • It is used in almost every system based on the Linux kernel + (aside from some embedded applications).
  • + +
  • It is used as the system curses library on OpenBSD, FreeBSD + and MacOS.
  • + +
  • It is used in environments such as Cygwin and MinGW. The + first of these was EMX on OS/2 Warp.
  • + +
  • It is used (though usually not as the system + curses) on all of the vendor unix systems, e.g., AIX, HP-UX, IRIX64, SCO, + Solaris, Tru64.
  • + +
  • It should work readily on any ANSI/POSIX-conforming + unix.
  • +
+ +

The distribution includes the library and support utilities, + including

+ +
    +
  • captoinfo, a termcap conversion + tool
  • + +
  • clear, utility for clearing the + screen
  • + +
  • infocmp, the terminfo decompiler
  • + +
  • tabs, set tabs on a terminal
  • + +
  • tic, the terminfo compiler
  • + +
  • toe, list (table of) terminfo + entries
  • + +
  • tput, utility for retrieving terminal + capabilities in shell scripts
  • + +
  • tset, to initialize the terminal
  • +
+ +

Full manual pages are provided for the library and tools.

+ +

The ncurses distribution is + available at ncurses' homepage:

+ +
+

https://invisible-island.net/archives/ncurses/ + or
+ https://invisible-mirror.net/archives/ncurses/ .

+
+ +

It is also available at the GNU distribution site

+ +
+

https://ftp.gnu.org/gnu/ncurses/ .

+
+ +

Release + Notes

+ +

These notes are for ncurses + 6.5, released April 27, 2024.

+ +

This release is designed to be source-compatible with + ncurses 5.0 through 6.4; providing + extensions to the application binary interface (ABI). Although + the source can still be configured to support the ncurses 5 ABI, the reason for the release is + to reflect improvements to the ncurses 6 ABI and the supporting utility + programs.

+ +

There are, of course, numerous other improvements, listed in + this announcement.

+ +

The most important + bug-fixes/improvements dealt with robustness issues. The + release notes also mention some other bug-fixes, but are focused + on new features and improvements to existing features since + ncurses 6.4 release.

+ +

Library improvements

+ +

New features

+ +

These are new features:

+ +
    +
  • +

    The low-level terminfo and termcap interfaces are used + both by the higher-level curses library, as well as by many + applications.

    + +

    The functions which convert parameterized terminal + capability strings for output to the terminal + (tiparm and tparm) analyze the + capability string to determine which parameters are strings + (i.e., addresses), versus numbers (not addresses).

    + +

    The library's analysis of a capability string may differ + from the calling application's design if environment + variables are used to point to an invalid terminal database. + This is a longstanding problem with all + implementations of terminfo, dating from the early 1980s.

    + +

    Two new functions address this problem: by providing a + function which allows the calling application to tell ncurses + how many string-parameters to expect:

    + +
      +
    • tiscan_s helps applications check + formatting capabilities that would be passed to + tiparm_s.
    • + +
    • tiparm_s provides applications a way to + tell ncurses what the expected parameters are for a + capability.
    • +
    +
  • + +
  • +

    The ncurses library supports a compile-time feature + (enabled with the configure --enable-check-size + option) which simplifies initialization with terminals which + do not negotiate window (screen) size. This is done in + setupterm, by providing for using ANSI + cursor-position report (in user6/user7 terminfo capabilities) + to obtain the screen size if neither environment variables or + ioctl is used.

    + +

    The ncurses test-program with options + “-E -T” demonstrates this + feature.

    +
  • + +
  • add functions to query tty-flags in + SCREEN
  • +
+ +

This release drops compatibility with obsolete versions of + tack, e.g., pre-1.08

+ +

Other + improvements

+ +

These are improvements to existing features:

+ +
    +
  • +

    In addition to the new, safer function + tiparm_s, ncurses adds checks to make the older + tiparm, tparm and + tgoto functions safer:

    + +
      +
    • +

      the terminfo functions tiparm and + tparm ensure that the capability string + comes from the terminal description which ncurses loads, + rather than from random data which the application + happens to have.

      +
    • + +
    • +

      the tgoto function disallows capabilities + which its analysis shows will attempt to use string + parameters.

      +
    • + +
    • +

      ncurses uses internal functions which correspond to + tiparm, and tgoto which ensure + that the capability strings which are passed to these + functions come from the loaded terminal description.

      +
    • +
    +
  • + +
  • +

    improve check in lib_tparm.c, ensuring that a + char* fits into a TPARM_ARG

    +
  • + +
  • +

    modify _nc_syserr_abort to use + _nc_env_access, rather than only checking root + uid

    +
  • + +
  • +

    improve thread lock in lib_trace.c

    +
  • + +
  • +

    modify flushinp to use file descriptors in + SCREEN, rather than from TERMINAL, + and check if they are for a terminal, like SVr4

    +
  • + +
  • +

    modify mcprint to use file descriptor in + SCREEN, for consistency

    +
  • + +
  • +

    modify internal function _nc_read_file_entry + to show relevant filename in warnings

    +
  • + +
  • +

    improve checks in internal function + convert_string for corrupt terminfo entry

    +
  • + +
  • +

    review/improve handling of out-of-memory conditions

    +
  • + +
  • +

    limit delays to 30 seconds, i.e., padding delays in + terminfo, as well as napms and + delay_output functions

    +
  • + +
  • +

    fix reallocation loop for vsnprintf in + _nc_sprintf_string by copying the va_list + variable

    +
  • + +
  • +

    modify delscreen to limit the windows which + it creates to just those associated with the screen

    +
  • + +
  • +

    modify endwin to return an error if it is + called again without an intervening screen update

    +
  • + +
  • +

    modify wenclose to handle pads

    +
  • + +
  • +

    eliminate use of PATH_MAX in + lib_trace.c

    +
  • + +
  • +

    provide for any CCHARW_MAX greater than 1

    +
  • +
+ +

These are corrections to existing features:

+ +
    +
  • +

    correct loop termination condition in + waddnstr and waddnwstr

    +
  • + +
  • +

    improve parsing in internal function + _nc_msec_cost, allowing a single decimal + point

    +
  • + +
  • +

    amend parameter check for entire string versus specific + length in winsnstr and wins_nwstr + to match Solaris; make similar correction to + wins_nwstr

    +
  • + +
  • +

    correct internal function wadd_wch_literal + when adding a non-spacing character to a double-width + character

    +
  • + +
  • +

    correct definition of Charable macro for + non-wide ncurses library .

    +
  • +
+ +

Program + improvements

+ +

Several improvements were made to the + utility programs. Some were done to make the infocmp + option “-u” option help refactor the + terminal database.

+ +
+
infocmp +
+ +
+
    +
  • +

    add limit checks for processing extended capabilities + with the “-u” option

    +
  • + +
  • +

    correct initial alignment of extended capabilities, so + that the “-u” option can be used + for more than two terminal types

    +
  • + +
  • +

    modify “-u” option to not + report cancels for strings which were already cancelled + in a use'd chunk.

    +
  • + +
  • +

    correct an assignment “-u” + for detecting if a boolean is unset in a base entry and + set in a use'd chunk, i.e., if it was cancelled.

    +
  • +
+
+ +
tic +
+ +
+
    +
  • +

    correct limit-check when dumping tc/use clause via + “-I

    +
  • + +
  • +

    check return value of _nc_save_str, in + special case where extended capabilities are processed + but the terminal description was not initialized

    +
  • + +
  • +

    modify check for multiply defined aliases to report + problems within the current runtime rather than for + conflicts with pre-existing terminal descriptions.

    +
  • + +
  • +

    disallow using $TERMINFO or + $HOME/.terminfo when + “-o” option is used

    +
  • +
+
+ +
tput and tset
+ +
+
    +
  • +

    add “-v” option to tput, to + show warnings

    +
  • + +
  • +

    modify reset command to avoid altering clocal + if the terminal uses a modem

    +
  • + +
  • +

    modify reset feature to avoid 1-second sleep + if running in a pseudo-terminal

    +
  • +
+
+
+ +

Examples

+ +

Along with the library and utilities, improvements were made + to the ncurses-examples:

+ +
    +
  • +

    modify test_tparm to account for extended + capabilities

    +
  • + +
  • +

    corrected mouse mask in test/testcurs.c

    +
  • + +
  • +

    modify test/clip_printw.c to optionally test + non-wrapped updates

    +
  • + +
  • +

    modify test/test_mouse.c to use curses api + for raw/noraw

    +
  • + +
  • +

    modify test/clip_printw.c to optionally test + non-wrapped updates

    +
  • +
+ +

There is one new demo/test programs:

+ +
+
test/test_endwin.c +
+ +
+

This program shows the return-status from + endwin with different combinations of + endwin (repeated), initscr, + newterm.

+
+
+ +

Terminal database

+ +

There are several new terminal descriptions:

+ + + +

There are many changes to existing terminal descriptions. Some + were updates to several descriptions, using the + infocmp-u” option in a + script to determine which building-block entries could + be used to replace multiple capability settings (and trim + redundant information).

+ +

Other changes include:

+ +
    +
  • +

    document + XF, kxIN and kxOUT

    +
  • + +
  • +

    add note on sun + regarding wscons/cmdtool/shelltool

    +
  • + +
  • +

    remove DECCOLM+DECSCLM from foot

    +
  • + +
  • +

    add xterm+focus to foot+base

    +
  • + +
  • +

    add ecma+strikeout to putty

    +
  • + +
  • +

    use CSI 3J in vte-2017

    +
  • + +
  • +

    use oldxterm+sm+1006 in vte-2014

    +
  • + +
  • +

    modify xgterm + to work around line-drawing bug

    +
  • + +
  • +

    add xterm focus mode 1004 to xterm+focus + as fe/fd capabilities, like vim.

    +
  • + +
  • +

    add xterm+focus to alacritty+common

    +
  • + +
  • +

    add XR/xr, to work with vim, and use RV/rv to denote DA2 + and its response

    +
  • + +
  • +

    add XF flag to xterm+focus + so that termcap applications can be aware of terminals which + may support focus in/out

    +
  • + +
  • +

    use xterm+focus in xterm-p370 + and tmux

    +
  • + +
  • +

    remove xterm+sm+1006 from tmux

    +
  • + +
  • +

    NetBSD-related fixes for x68k and + wsvt25

    +
  • +
+ +

Documentation

+ +

As usual, this release

+ +
    +
  • +

    improves documentation by describing new features,

    +
  • + +
  • +

    attempts to improve the description of features which + users have found confusing

    +
  • + +
  • +

    fills in overlooked descriptions of features which were + described in the NEWS file + but treated sketchily in manual pages.

    +
  • +
+ +

In addition to providing background information to explain + these features and show how they evolved, there are corrections, + clarifications, etc.:

+ +
    +
  • +

    Corrections:

    + +
      +
    • +

      add assignment in CF_MAN_PAGES to fill in + value for TERMINFO_DIRS in ncurses, terminfo + and tic manpages.

      +
    • + +
    • +

      clarify interaction of -R option versus + -C, -I and -r in + infocmp manpage.

      +
    • + +
    • +

      correct manpage description of panel_hidden.

      +
    • + +
    • +

      improve manpage description for addch versus unctrl + format used for non-printable characters.

      +
    • + +
    • +

      improve manpages discussing file descriptors in + low-level functions.

      +
    • + +
    • +

      improve description of search rules for terminal + descriptions in terminfo manpage.

      +
    • + +
    • +

      modify dist.mk to avoid passing developer's comments + in manpages into the generated html documentation.

      +
    • + +
    • +

      modify test-package "ncurses6-doc" to use + manpage-aliases, which in turn required a change to the + configure script to factor in the extra-suffix option + when deriving alias names.

      +
    • +
    +
  • + +
  • +

    New/improved history and portability sections:

    + +
      +
    • +

      add information about "ttycap", termcap's forerunner, + to tset.1

      +
    • + +
    • +

      document limitations of tparm, and error-returns in + curs_terminfo.3x

      +
    • + +
    • +

      document limitations of tgoto, and error-returns in + curs_termcap.3x

      +
    • +
    +
  • + +
  • +

    Other improvements:

    + +
      +
    • +

      This release has many changes to improve the + formatting and style of the manpages.

      +
    • + +
    • +

      Manpages now use consistent section-naming, page + headers and footers (including the modification date for + each page).

      +
    • + +
    • +

      Table layout has been revised.

      +
    • +
    +
  • +
+ +

There are no new manual pages (all of the manual page updates + are to existing pages).

+ +

Interesting + bug-fixes

+ +

The changes to tparm, tgoto which improve + the design of the low-level interfaces are interesting, + but are not bug-fixes per se.

+ +

Configuration changes

+ +

Major + changes

+ +

These are the major changes (aside from introducing tiparm_s):

+ +
    +
  • +

    use wide-character (ncursesw) by default

    +
  • + +
  • +

    use opaque typedefs by default

    +
  • +
+ +

However, most of the work on configure scripts was done to + reduce warnings within the configure script:

+ +
    +
  • +

    intrusive warnings from GNU grep regarding fgrep and + egrep

    +
  • + +
  • +

    fatal errors in compile-checks, arising from recent + “Modern C” efforts by some developers which + caused longstanding configure checks to fail.

    + +

    After repairing the configure script, none of that + activity affected ncurses because stricter warnings are used + routinely in development.

    +
  • +
+ +

Other improvements made to configure checks include

+ +
    +
  • +

    use string-hacks + in alloc_entry.c, alloc_type.c and hardscroll.c, overlooked + due to compiler changes in recent OpenBSD releases

    +
  • + +
  • +

    revise progs.priv.h to provide for NC_ISATTY reuse

    +
  • + +
  • +

    configure check for MB_LEN_MAX provides warning as + needed

    +
  • + +
  • +

    trim a space after some "-R" options, fixing builds for + applications built using clang and ncurses on Solaris

    +
  • + +
  • +

    work around misconfiguration of MacPorts gcc13, which + exposes invalid definition of MB_LEN_MAX in gcc's + fallback copy of limits.h

    +
  • + +
  • +

    modified experimental Windows driver works with xterm + mouse protocol

    +
  • +
+ +

Configuration options

+ +

There are a few new configure options:

+ +
+
--disable-setuid-environ +
+ +
+

Compile with environment restriction, so certain + environment variables are not available when running via a + setuid/setgid application. These are (for example + $TERMINFO) those that allow the search path for the + terminfo or termcap entry to be customized.

+ +

A setuid/setgid application inherits its environment + variables from the current user, in contrast to sudo which + may limit the environment variables that ncurses uses.

+
+ +
--enable-check-size +
+ +
+

Compile-in feature to detect screensize for terminals + which do not advertise their screensize, e.g., serial + terminals.

+
+ +
--with-abi-altered=NUM +
+ +
+

Override the displayed (rather than compiled-in) ABI. Only + packagers who have created configurations where the ABI + differs from ncurses should be interested in this option.

+
+ +
--with-strip-program=XXX +
+ +
+

When stripping executables during install, use the + specified program rather than “strip” overriding + program chosen by the install program for stripping + executables.

+
+
+ +

These configure options are modified:

+ +
+
--with-pkg-config-libdir[=DIR] +
+ +
+

The optional DIR parameter can now be + “auto” to automatically use pkg-config's library + directory.

+ +

The default is $(libdir).

+
+ +
--with-xterm-kbs[=XXX] +
+ +
+

The default is “auto” which tells the + configure script to choose BS or DEL according to platform + defaults.

+
+
+ +

Portability

+ +

Many of the portability changes are implemented via the + configure script:

+ +
    +
  • +

    add/use configure check for clock_gettime, to + supersede gettimeofday.

    +
  • + +
  • +

    modify configure script check for pkg-config library + directory to take into account an older version 0.15.0 which + used PKG_CONFIG_PATH but not PKG_CONFIG_LIBDIR

    +
  • + +
  • +

    allow for MinGW32-/64-bit configurations to use + _DEFAULT_SOURCE

    +
  • + +
  • +

    modify CF_XOPEN_SOURCE macro's amend default case to avoid + undefining _XOPEN_SOURCE if _POSIX_C_SOURCE is defined

    +
  • + +
  • +

    updated configure script macro CF_XOPEN_SOURCE, for + uClibc-ng

    +
  • + +
  • +

    modify version-check for gcc/g++, now works for msys2

    +
  • + +
  • +

    build-fixes related to configure-options and/or + platform:

    + +
      +
    • fix for --enable-fvisibility
    • + +
    • fix for unusual values of + --with-rel-version
    • + +
    • fix for unusual values of + --with-abi-version
    • + +
    • fix for --disable-tcap-names
    • + +
    • fix for termcap in nc_access.h
    • +
    +
  • + +
  • +

    other configure-script improvements:

    + +
      +
    • recent msys2 headers work with + _DEFAULT_SOURCE; amend check
    • + +
    • use $ac_includes_default in most cases where + stdlib.h should work
    • + +
    • use #error consistently vs "make an + error"
    • + +
    • add configure macro for gettimeofday vs inline + check
    • +
    +
  • +
+ +

Here are some of the other portability fixes:

+ +
    +
  • +

    modify configure scripts/makefiles to omit + KEY_RESIZE if the corresponding SIGWINCH + feature is disabled

    +
  • + +
  • +

    increase MB_CUR_MAX to 16, matching glibc's + MB_LEN_MAX

    +
  • + +
  • +

    add BSD erase2 to characters handled by + tset/reset

    +
  • + +
  • +

    use getauxval when available, to improve + setuid/setgid checks

    +
  • + +
  • +

    set dwShareMode in calls to + CreateConsoleScreenBuffer

    +
  • + +
  • +

    use CreateFile with "CONIN$", + "CONOUT$" rather than GetStdHandle to + obtain a handle on the actual console, avoiding redirection + in the MinGW/Win32 configurations

    +
  • + +
  • +

    modify MinGW driver to return KEY_BACKSPACE when + an unmodified VK_BACK virtual key is entered

    +
  • + +
  • +

    modify MinGW configuration to provide for running in + MSYS/MSYS2 shells, assuming ConPTY support

    +
  • +
+ +
+ +

Features of + ncurses

+ +

The ncurses package is fully + upward-compatible with SVr4 (System V Release 4) curses:

+ +
    +
  • +

    All of the SVr4 calls have been implemented (and are + documented).

    +
  • + +
  • +

    ncurses supports the + features of SVr4 curses including keyboard mapping, color, + form drawing with ACS characters, and automatic recognition + of keypad and function keys.

    +
  • + +
  • +

    ncurses provides work-alike + replacements of SVr4 supplemental libraries based on curses, + but which were not specified by X/Open Curses:

    + +
      +
    • +

      the panel library, supporting a stack of windows with + backing store

      +
    • + +
    • +

      the menu library, supporting a uniform but flexible + interface for menu programming

      +
    • + +
    • +

      the form library, supporting data collection through + on-screen forms

      +
    • +
    +
  • + +
  • +

    ncurses's terminal database + is fully compatible with that used by SVr4 curses.

    + +
      +
    • +

      ncurses supports + user-defined capabilities that it can see, but which are + hidden from SVr4 curses applications using the + same terminal database.

      +
    • + +
    • +

      It can be optionally configured to match the format + used in related systems such as AIX and Tru64.

      +
    • + +
    • +

      Alternatively, ncurses + can be configured to use hashed databases rather than the + directory of files used by SVr4 curses.

      +
    • +
    +
  • + +
  • +

    The ncurses utilities have + options to allow you to filter terminfo entries for use with + less capable curses/terminfo versions such + as the HP-UX and AIX ports.

    +
  • +
+ +

The ncurses package also has + many useful extensions over SVr4:

+ +
    +
  • +

    The API is 8-bit clean and base-level conformant with the + X/Open Curses specification, XSI curses (that is, it + implements all BASE level features, and almost all + EXTENDED features). It includes many function calls + not supported under SVr4 curses (but portability of all calls + is documented so you can use the SVr4 subset only).

    +
  • + +
  • +

    Unlike SVr3 curses, ncurses + can write to the rightmost-bottommost corner of the screen if + your terminal has an insert-character capability.

    +
  • + +
  • +

    Ada95 and C++ bindings.

    +
  • + +
  • +

    Support for mouse event reporting with X Window xterm and + FreeBSD and OS/2 console windows.

    +
  • + +
  • +

    Extended mouse support via Alessandro Rubini's gpm + package.

    +
  • + +
  • +

    The function wresize allows you to resize + windows, preserving their data.

    +
  • + +
  • +

    The function use_default_colors allows you to + use the terminal's default colors for the default color pair, + achieving the effect of transparent colors.

    +
  • + +
  • +

    The functions keyok and + define_key allow you to better control the use + of function keys, e.g., disabling the ncurses KEY_MOUSE, or by defining more + than one control sequence to map to a given key code.

    +
  • + +
  • +

    Support for direct-color terminals, such as modern + xterm.

    +
  • + +
  • +

    Support for 256-color terminals, such as modern xterm.

    +
  • + +
  • +

    Support for 16-color terminals, such as aixterm + and modern xterm.

    +
  • + +
  • +

    Better cursor-movement optimization. The package now + features a cursor-local-movement computation more efficient + than either BSD's or System V's.

    +
  • + +
  • +

    Super hardware scrolling support. The screen-update code + incorporates a novel, simple, and cheap algorithm that + enables it to make optimal use of hardware scrolling, + line-insertion, and line-deletion for screen-line movements. + This algorithm is more powerful than the 4.4BSD curses + quickch routine.

    +
  • + +
  • +

    Real support for terminals with the magic-cookie glitch. + The screen-update code will refrain from drawing a highlight + if the magic- cookie unattributed spaces required just before + the beginning and after the end would step on a non-space + character. It will automatically shift highlight boundaries + when doing so would make it possible to draw the highlight + without changing the visual appearance of the screen.

    +
  • + +
  • +

    It is possible to generate the library with a list of + pre-loaded fallback entries linked to it so that it can serve + those terminal types even when no terminfo tree or termcap + file is accessible (this may be useful for support of + screen-oriented programs that must run in single-user + mode).

    +
  • + +
  • +

    The tic/captoinfo utility + provided with ncurses has the + ability to translate many termcaps from the XENIX, IBM and + AT&T extension sets.

    +
  • + +
  • +

    A BSD-like tset utility is provided.

    +
  • + +
  • +

    The ncurses library and + utilities will automatically read terminfo entries from + $HOME/.terminfo if it exists, and compile to that directory + if it exists and the user has no write access to the system + directory. This feature makes it easier for users to have + personal terminfo entries without giving up access to the + system terminfo directory.

    +
  • + +
  • +

    You may specify a path of directories to search for + compiled descriptions with the environment variable + TERMINFO_DIRS (this generalizes the feature provided by + TERMINFO under stock System V.)

    +
  • + +
  • +

    In terminfo source files, use capabilities may refer not + just to other entries in the same source file (as in System + V) but also to compiled entries in either the system terminfo + directory or the user's $HOME/.terminfo directory.

    +
  • + +
  • +

    The table-of-entries utility toe makes it easy for users to see + exactly what terminal types are available on the system.

    +
  • + +
  • +

    X/Open Curses permits most functions it specifies to be + made available as macros as well. ncurses does this

    + +
      +
    • to improve performance, e.g., for operations composed + of simpler functions such as cursor movement following by + adding text to the screen,
    • + +
    • to simplify the implementation by reusing functions + which use common parameters, e.g., the standard screen + stdscr, and
    • + +
    • to provide functions that return values via their + parameters
    • +
    + +

    Except for the last case, ncurses provides a non-macro + implementation of the function. If the macro definition is + disabled with #undef, or by defining + NCURSES_NOMACROS the function may be linked (and + its calls will be checked against the prototype).

    +
  • + +
  • +

    Extensive documentation is provided (see the Additional + Reading section of the ncurses FAQ for online + documentation).

    +
  • +
+ +

Applications using + ncurses

+ +

The ncurses distribution + includes a selection of test programs (including a few games). + These are available separately as ncurses-examples

+ +

The ncurses library has been tested with a wide variety of + applications including:

+ +
+
+
aptitude +
+ +
+

FrontEnd to Apt, the debian package manager

+ +

https://wiki.debian.org/Aptitude

+
+ +
cdk +
+ +
+

Curses Development Kit

+ +

https://invisible-island.net/cdk/
+

+
+ +
ded +
+ +
+

directory-editor

+ +

https://invisible-island.net/ded/

+
+ +
dialog +
+ +
+

the underlying application used in Slackware's setup, + and the basis for similar install/configure applications on + many systems.

+ +

https://invisible-island.net/dialog/

+
+ +
lynx +
+ +
+

the text WWW browser

+ +

https://lynx.invisible-island.net/

+
+ +
mutt +
+ +
+

mail utility

+ +

http://www.mutt.org/

+
+ +
ncftp +
+ +
+

file-transfer utility

+ +

https://www.ncftp.com/

+
+ +
nvi +
+ +
+

New vi uses ncurses.

+ +

+ https://sites.google.com/a/bostic.com/keithbostic/the-berkeley-vi-editor-home-page
+ +

+
+ +
ranger +
+ +
+

A console file manager with VI key bindings in + Python.

+ +

https://ranger.github.io/

+
+ +
tin +
+ +
+

newsreader, supporting color, MIME

+ +

http://www.tin.org/

+
+ +
vifm +
+ +
+

File manager with vi like keybindings

+ +

https://vifm.info/

+
+
+
+ +

as well as some that use ncurses for the terminfo support alone:

+ +
+
+
minicom +
+ +
+

terminal emulator for serial modem connections

+ +

https://salsa.debian.org/minicom-team/minicom

+
+ +
mosh +
+ +
+

a replacement for ssh.

+ +

https://mosh.org/

+
+ +
tack +
+ +
+

terminfo action checker

+ +

https://invisible-island.net/ncurses/tack.html

+
+ +
tmux +
+ +
+

terminal multiplexor

+ +

https://github.com/tmux/tmux/wiki

+
+ +
vile +
+ +
+

vi-like-emacs may be built to use the terminfo, + termcap or curses interfaces.

+ +

https://invisible-island.net/vile/

+
+
+
+ +

and finally, those which use only the termcap interface:

+ +
+
+
emacs +
+ +
+

text editor

+ +

https://www.gnu.org/software/emacs/

+
+ +
less +
+ +
+

The most commonly used pager (a program that + displays text files).

+ +

http://www.greenwoodsoftware.com/less/

+
+ +
screen +
+ +
+

terminal multiplexor

+ +

https://www.gnu.org/software/screen/

+
+ +
vim +
+ +
+

text editor

+ +

https://www.vim.org/

+
+
+
+ +

Development + activities

+ +

Zeyd Ben-Halim started ncurses + from a previous package pcurses, written by Pavel Curtis. Eric S. + Raymond continued development. Jürgen Pfeifer wrote most of + the form and menu libraries.

+ +

Ongoing development work is done by Thomas E. Dickey. Thomas + E. Dickey has acted as the maintainer for the Free Software + Foundation, which held a copyright on ncurses for + releases 4.2 through 6.1. Following the release of ncurses 6.1, + effective as of release 6.2, copyright for ncurses reverted to + Thomas E. Dickey (see the ncurses FAQ for + additional information).

+ +

Contact the current maintainers at

+ +
+ bug-ncurses@gnu.org +
+ +

To join the ncurses mailing list, please write email to

+ +
+ bug-ncurses-request@gnu.org +
+ containing the line: +
+

subscribe + <name>@<host.domain>

+
+ +

This list is open to anyone interested in helping with the + development and testing of this package.

+ +

Beta versions of ncurses are + made available at

+ +
+

https://invisible-island.net/archives/ncurses/current/ + and
+ https://invisible-mirror.net/archives/ncurses/current/ .

+
+ +

Patches to the current release are made available at

+ +
+

https://invisible-island.net/archives/ncurses/6.4/ + and
+ https://invisible-mirror.net/archives/ncurses/6.4/ .

+
+ +

There is an archive of the mailing list here:

+ +
+

https://lists.gnu.org/archive/html/bug-ncurses .

+
+ +

Related + resources

+ +

The release notes make scattered references to these pages, + which may be interesting by themselves:

+ + + +

Other + resources

+ +

The distribution provides a newer version of the + terminfo-format terminal description file once maintained by + Eric + Raymond . Unlike the older version, the termcap and + terminfo data are provided in the same file, which also provides + several user-definable extensions beyond the X/Open Curses + specification.

+ +

You can find lots of information on terminal-related topics + not covered in the terminfo file in Richard Shuford's + archive (original). + The collection of computer manuals at bitsavers.org has also been + useful.

+ + + + diff --git a/contrib/ncurses/doc/html/hackguide.html b/contrib/ncurses/doc/html/hackguide.html new file mode 100644 index 00000000..2b944553 --- /dev/null +++ b/contrib/ncurses/doc/html/hackguide.html @@ -0,0 +1,962 @@ + + + + + + A Hacker's Guide to Ncurses Internals + + + + +

A Hacker's Guide to NCURSES

+ +

A Hacker's Guide to NCURSES

+ + + +

Abstract

+ +

This document is a hacker's tour of the + ncurses library and utilities. It discusses + design philosophy, implementation methods, and the conventions + used for coding and documentation. It is recommended reading for + anyone who is interested in porting, extending or improving the + package.

+ +

Objective of the + Package

+ +

The objective of the ncurses package is to + provide a free software API for character-cell terminals and + terminal emulators with the following characteristics:

+ +
    +
  • Source-compatible with historical curses implementations + (including the original BSD curses and System V curses.
  • + +
  • Conformant with the XSI Curses standard issued as part of + XPG4 by X/Open.
  • + +
  • High-quality — stable and reliable code, wide + portability, good packaging, superior documentation.
  • + +
  • Featureful — should eliminate as much of the drudgery + of C interface programming as possible, freeing programmers to + think at a higher level of design.
  • +
+ +

These objectives are in priority order. So, for example, + source compatibility with older version must trump featurefulness + — we cannot add features if it means breaking the portion + of the API corresponding to historical curses versions.

+ +

Why System V Curses?

+ +

We used System V curses as a model, reverse-engineering their + API, in order to fulfill the first two objectives.

+ +

System V curses implementations can support BSD curses + programs with just a recompilation, so by capturing the System V + API we also capture BSD's.

+ +

More importantly for the future, the XSI Curses standard + issued by X/Open is explicitly and closely modeled on System V. + So conformance with System V took us most of the way to + base-level XSI conformance.

+ +

How to Design + Extensions

+ +

The third objective (standards conformance) requires that it + be easy to condition source code using ncurses + so that the absence of nonstandard extensions does not break the + code.

+ +

Accordingly, we have a policy of associating with each + nonstandard extension a feature macro, so that ncurses client + code can use this macro to condition in or out the code that + requires the ncurses extension.

+ +

For example, there is a macro + NCURSES_MOUSE_VERSION which XSI Curses does not + define, but which is defined in the ncurses + library header. You can use this to condition the calls to the + mouse API calls.

+ +

Portability and + Configuration

+ +

Code written for ncurses may assume an + ANSI-standard C compiler and POSIX-compatible OS interface. It + may also assume the presence of a System-V-compatible + select(2) call.

+ +

We encourage (but do not require) developers to make the code + friendly to less-capable UNIX environments wherever possible.

+ +

We encourage developers to support OS-specific optimizations + and methods not available under POSIX/ANSI, provided only + that:

+ +
    +
  • All such code is properly conditioned so the build process + does not attempt to compile it under a plain ANSI/POSIX + environment.
  • + +
  • Adding such implementation methods does not introduce + incompatibilities in the ncurses API between + platforms.
  • +
+ +

We use GNU autoconf(1) as a tool to deal with + portability issues. The right way to leverage an OS-specific + feature is to modify the autoconf specification files + (configure.in and aclocal.m4) to set up a new feature macro, + which you then use to condition your code.

+ +

Documentation + Conventions

+ +

There are three kinds of documentation associated with this + package. Each has a different preferred format:

+ +
    +
  • Package-internal files (README, INSTALL, TO-DO etc.)
  • + +
  • Manual pages.
  • + +
  • Everything else (i.e., narrative documentation).
  • +
+ +

Our conventions are simple:

+ +
    +
  1. Maintain package-internal files in plain + text. The expected viewer for them is more(1) or + an editor window; there is no point in elaborate mark-up.
  2. + +
  3. Mark up manual pages in the man macros. + These have to be viewable through traditional man(1) + programs.
  4. + +
  5. Write everything else in HTML. +
  6. +
+ +

When in doubt, HTMLize a master and use lynx(1) to + generate plain ASCII (as we do for the announcement + document).

+ +

The reason for choosing HTML is that it is (a) well-adapted + for on-line browsing through viewers that are everywhere; (b) + more easily readable as plain text than most other mark-ups, if + you do not have a viewer; and (c) carries enough information that + you can generate a nice-looking printed version from it. Also, of + course, it make exporting things like the announcement document + to WWW pretty trivial.

+ +

How to Report Bugs

+ +

The reporting address for + bugs is bug-ncurses@gnu.org. This is a + majordomo list; to join, write to + bug-ncurses-request@gnu.org with a message + containing the line:

+ +
+             subscribe <name>@<host.domain>
+
+

The ncurses code is maintained by a small group + of volunteers. While we try our best to fix bugs promptly, we + simply do not have a lot of hours to spend on elementary + hand-holding. We rely on intelligent cooperation from our users. + If you think you have found a bug in ncurses, there + are some steps you can take before contacting us that will help + get the bug fixed quickly.

+ +

In order to use our bug-fixing time efficiently, we put people + who show us they have taken these steps at the head of our queue. + This means that if you do not, you will probably end up at the + tail end and have to wait a while.

+ +
    +
  1. Develop a recipe to reproduce the bug. +

    Bugs we can reproduce are likely to be fixed very quickly, + often within days. The most effective single thing you can do + to get a quick fix is develop a way we can duplicate the bad + behavior — ideally, by giving us source for a small, + portable test program that breaks the library. (Even better + is a keystroke recipe using one of the test programs provided + with the distribution.)

    +
  2. + +
  3. Try to reproduce the bug on a different terminal type. +

    In our experience, most of the behaviors people report as + library bugs are actually due to subtle problems in terminal + descriptions. This is especially likely to be true if you are + using a traditional asynchronous terminal or PC-based + terminal emulator, rather than xterm or a UNIX console + entry.

    + +

    It is therefore extremely helpful if you can tell us + whether or not your problem reproduces on other terminal + types. Usually you will have both a console type and xterm + available; please tell us whether or not your bug reproduces + on both.

    + +

    If you have xterm available, it is also good to collect + xterm reports for different window sizes. This is especially + true if you normally use an unusual xterm window size — + a surprising number of the bugs we have seen are either + triggered or masked by these.

    +
  4. + +
  5. Generate and examine a trace file for the broken behavior. +

    Recompile your program with the debugging versions of the + libraries. Insert a trace() call with the + argument set to TRACE_UPDATE. (See "Writing Programs with + NCURSES" for details on trace levels.) Reproduce your + bug, then look at the trace file to see what the library was + actually doing.

    + +

    Another frequent cause of apparent bugs is application + coding errors that cause the wrong things to be put on the + virtual screen. Looking at the virtual-screen dumps in the + trace file will tell you immediately if this is happening, + and save you from the possible embarrassment of being told + that the bug is in your code and is your problem rather than + ours.

    + +

    If the virtual-screen dumps look correct but the bug + persists, it is possible to crank up the trace level to give + more and more information about the library's update actions + and the control sequences it issues to perform them. The test + directory of the distribution contains a tool for digesting + these logs to make them less tedious to wade through.

    + +

    Often you will find terminfo problems at this stage by + noticing that the escape sequences put out for various + capabilities are wrong. If not, you are likely to learn + enough to be able to characterize any bug in the + screen-update logic quite exactly.

    +
  6. + +
  7. Report details and symptoms, not just interpretations. +

    If you do the preceding two steps, it is very likely that + you will discover the nature of the problem yourself and be + able to send us a fix. This will create happy feelings all + around and earn you good karma for the first time you run + into a bug you really cannot characterize and fix + yourself.

    + +

    If you are still stuck, at least you will know what to + tell us. Remember, we need details. If you guess about what + is safe to leave out, you are too likely to be wrong.

    + +

    If your bug produces a bad update, include a trace file. + Try to make the trace at the least voluminous level + that pins down the bug. Logs that have been through + tracemunch are OK, it does not throw away any information + (actually they are better than un-munched ones because they + are easier to read).

    + +

    If your bug produces a core-dump, please include a + symbolic stack trace generated by gdb(1) or your local + equivalent.

    + +

    Tell us about every terminal on which you have reproduced + the bug — and every terminal on which you cannot. + Ideally, send us terminfo sources for all of these (yours + might differ from ours).

    + +

    Include your ncurses version and your OS/machine type, of + course! You can find your ncurses version in the + curses.h file.

    +
  8. +
+ +

If your problem smells like a logic error or in cursor + movement or scrolling or a bad capability, there are a couple of + tiny test frames for the library algorithms in the progs + directory that may help you isolate it. These are not part of the + normal build, but do have their own make productions.

+ +

The most important of these is mvcur, a test + frame for the cursor-movement optimization code. With this + program, you can see directly what control sequences will be + emitted for any given cursor movement or scroll/insert/delete + operations. If you think you have got a bad capability + identified, you can disable it and test again. The program is + command-driven and has on-line help.

+ +

If you think the vertical-scroll optimization is broken, or + just want to understand how it works better, build + hashmap and read the header comments of + hardscroll.c and hashmap.c; then try it + out. You can also test the hardware-scrolling optimization + separately with hardscroll.

+ +

A Tour of the Ncurses + Library

+ +

Library Overview

+ +

Most of the library is superstructure — fairly trivial + convenience interfaces to a small set of basic functions and data + structures used to manipulate the virtual screen (in particular, + none of this code does any I/O except through calls to more + fundamental modules described below). The files

+ +
+ lib_addch.c lib_bkgd.c lib_box.c lib_chgat.c lib_clear.c + lib_clearok.c lib_clrbot.c lib_clreol.c lib_colorset.c + lib_data.c lib_delch.c lib_delwin.c lib_echo.c lib_erase.c + lib_gen.c lib_getstr.c lib_hline.c lib_immedok.c lib_inchstr.c + lib_insch.c lib_insdel.c lib_insstr.c lib_instr.c + lib_isendwin.c lib_keyname.c lib_leaveok.c lib_move.c + lib_mvwin.c lib_overlay.c lib_pad.c lib_printw.c lib_redrawln.c + lib_scanw.c lib_screen.c lib_scroll.c lib_scrollok.c + lib_scrreg.c lib_set_term.c lib_slk.c lib_slkatr_set.c + lib_slkatrof.c lib_slkatron.c lib_slkatrset.c lib_slkattr.c + lib_slkclear.c lib_slkcolor.c lib_slkinit.c lib_slklab.c + lib_slkrefr.c lib_slkset.c lib_slktouch.c lib_touch.c + lib_unctrl.c lib_vline.c lib_wattroff.c lib_wattron.c + lib_window.c +
+ +

are all in this category. They are very unlikely to need + change, barring bugs or some fundamental reorganization in the + underlying data structures.

+ +

These files are used only for debugging support:

+ +
+ lib_trace.c lib_traceatr.c lib_tracebits.c lib_tracechr.c + lib_tracedmp.c lib_tracemse.c trace_buf.c +
+ +

It is rather unlikely you will ever need to change these, + unless you want to introduce a new debug trace level for some + reason.

+ +

There is another group of files that do direct I/O via + tputs(), computations on the terminal capabilities, or + queries to the OS environment, but nevertheless have only fairly + low complexity. These include:

+ +
+ lib_acs.c lib_beep.c lib_color.c lib_endwin.c + lib_initscr.c lib_longname.c lib_newterm.c lib_options.c + lib_termcap.c lib_ti.c lib_tparm.c lib_tputs.c lib_vidattr.c + read_entry.c. +
+ +

They are likely to need revision only if ncurses is being + ported to an environment without an underlying terminfo + capability representation.

+ +

These files have serious hooks into the tty driver and signal + facilities:

+ +
+ lib_kernel.c lib_baudrate.c lib_raw.c lib_tstp.c + lib_twait.c +
+ +

If you run into porting snafus moving the package to another + UNIX, the problem is likely to be in one of these files. The file + lib_print.c uses sleep(2) and also falls in this + category.

+ +

Almost all of the real work is done in the files

+ +
+ hardscroll.c hashmap.c lib_addch.c lib_doupdate.c + lib_getch.c lib_mouse.c lib_mvcur.c lib_refresh.c lib_setup.c + lib_vidattr.c +
+ +

Most of the algorithmic complexity in the library lives in + these files. If there is a real bug in ncurses + itself, it is probably here. We will tour some of these files in + detail below (see The Engine Room).

+ +

Finally, there is a group of files that is actually most of + the terminfo compiler. The reason this code lives in the + ncurses library is to support fallback to + /etc/termcap. These files include

+ +
+ alloc_entry.c captoinfo.c comp_captab.c comp_error.c + comp_hash.c comp_parse.c comp_scan.c parse_entry.c + read_termcap.c write_entry.c +
+ +

We will discuss these in the compiler tour.

+ +

The Engine Room

+ +

Keyboard Input

+ +

All ncurses input funnels through the function + wgetch(), defined in lib_getch.c. This + function is tricky; it has to poll for keyboard and mouse events + and do a running match of incoming input against the set of + defined special keys.

+ +

The central data structure in this module is a FIFO queue, + used to match multiple-character input sequences against + special-key capabilities; also to implement pushback via + ungetch().

+ +

The wgetch() code distinguishes between function + key sequences and the same sequences typed manually by doing a + timed wait after each input character that could lead a function + key sequence. If the entire sequence takes less than 1 second, it + is assumed to have been generated by a function key press.

+ +

Hackers bruised by previous encounters with variant + select(2) calls may find the code in + lib_twait.c interesting. It deals with the problem + that some BSD selects do not return a reliable time-left value. + The function timed_wait() effectively simulates a + System V select.

+ +

Mouse Events

+ +

If the mouse interface is active, wgetch() polls + for mouse events each call, before it goes to the keyboard for + input. It is up to lib_mouse.c how the polling is + accomplished; it may vary for different devices.

+ +

Under xterm, however, mouse event notifications come in via + the keyboard input stream. They are recognized by having the + kmous capability as a prefix. This is kind of + klugey, but trying to wire in recognition of a mouse key prefix + without going through the function-key machinery would be just + too painful, and this turns out to imply having the prefix + somewhere in the function-key capabilities at terminal-type + initialization.

+ +

This kluge only works because kmous is not + actually used by any historic terminal type or curses + implementation we know of. Best guess is it is a relic of some + forgotten experiment in-house at Bell Labs that did not leave any + traces in the publicly-distributed System V terminfo files. If + System V or XPG4 ever gets serious about using it again, this + kluge may have to change.

+ +

Here are some more details about mouse event handling:

+ +

The lib_mouse() code is logically split into a + lower level that accepts event reports in a device-dependent + format and an upper level that parses mouse gestures and filters + events. The mediating data structure is a circular queue of event + structures.

+ +

Functionally, the lower level's job is to pick up primitive + events and put them on the circular queue. This can happen in one + of two ways: either (a) _nc_mouse_event() detects a + series of incoming mouse reports and queues them, or (b) code in + lib_getch.c detects the kmous + prefix in the keyboard input stream and calls _nc_mouse_inline to + queue up a series of adjacent mouse reports.

+ +

In either case, _nc_mouse_parse() should be + called after the series is accepted to parse the digested mouse + reports (low-level events) into a gesture (a high-level or + composite event).

+ +

Output and Screen Updating

+ +

With the single exception of character echoes during a + wgetnstr() call (which simulates cooked-mode line + editing in an ncurses window), the library normally does all its + output at refresh time.

+ +

The main job is to go from the current state of the screen (as + represented in the curscr window structure) to the + desired new state (as represented in the newscr + window structure), while doing as little I/O as possible.

+ +

The brains of this operation are the modules + hashmap.c, hardscroll.c and + lib_doupdate.c; the latter two use + lib_mvcur.c. Essentially, what happens looks like + this:

+ +
    +
  • +

    The hashmap.c module tries to detect vertical + motion changes between the real and virtual screens. This + information is represented by the oldindex members in the + newscr structure. These are modified by vertical-motion and + clear operations, and both are re-initialized after each + update. To this change-journalling information, the hashmap + code adds deductions made using a modified Heckel algorithm + on hash values generated from the line contents.

    +
  • + +
  • +

    The hardscroll.c module computes an optimum + set of scroll, insertion, and deletion operations to make the + indices match. It calls _nc_mvcur_scrolln() in + lib_mvcur.c to do those motions.

    +
  • + +
  • +

    Then lib_doupdate.c goes to work. Its job is + to do line-by-line transformations of curscr + lines to newscr lines. Its main tool is the + routine mvcur() in lib_mvcur.c. + This routine does cursor-movement optimization, attempting to + get from given screen location A to given location B in the + fewest output characters possible.

    +
  • +
+ +

If you want to work on screen optimizations, you should use + the fact that (in the trace-enabled version of the library) + enabling the TRACE_TIMES trace level causes a report + to be emitted after each screen update giving the elapsed time + and a count of characters emitted during the update. You can use + this to tell when an update optimization improves efficiency.

+ +

In the trace-enabled version of the library, it is also + possible to disable and re-enable various optimizations at + runtime by tweaking the variable + _nc_optimize_enable. See the file + include/curses.h.in for mask values, near the + end.

+ +

The Forms and Menu Libraries

+ +

The forms and menu libraries should work reliably in any + environment you can port ncurses to. The only portability issue + anywhere in them is what flavor of regular expressions the + built-in form field type TYPE_REGEXP will recognize.

+ +

The configuration code prefers the POSIX regex facility, + modeled on System V's, but will settle for BSD regexps if the + former is not available.

+ +

Historical note: the panels code was written primarily to + assist in porting u386mon 2.0 (comp.sources.misc v14i001-4) to + systems lacking panels support; u386mon 2.10 and beyond use it. + This version has been slightly cleaned up for + ncurses.

+ +

A Tour of the Terminfo Compiler

+ +

The ncurses implementation of + tic is rather complex internally; it has to do a + trying combination of missions. This starts with the fact that, + in addition to its normal duty of compiling terminfo sources into + loadable terminfo binaries, it has to be able to handle termcap + syntax and compile that too into terminfo entries.

+ +

The implementation therefore starts with a table-driven, + dual-mode lexical analyzer (in comp_scan.c). The + lexer chooses its mode (termcap or terminfo) based on the first + “,” or “:” it finds in each entry. The + lexer does all the work of recognizing capability names and + values; the grammar above it is trivial, just "parse entries till + you run out of file".

+ +

Translation of + Non-use Capabilities

+ +

Translation of most things besides use + capabilities is pretty straightforward. The lexical analyzer's + tokenizer hands each capability name to a hash function, which + drives a table lookup. The table entry yields an index which is + used to look up the token type in another table, and controls + interpretation of the value.

+ +

One possibly interesting aspect of the implementation is the + way the compiler tables are initialized. All the tables are + generated by various awk/sed/sh scripts from a master table + include/Caps; these scripts actually write C + initializers which are linked to the compiler. Furthermore, the + hash table is generated in the same way, so it doesn't have to be + generated at compiler startup time (another benefit of this + organization is that the hash table can be in shareable text + space).

+ +

Thus, adding a new capability is usually pretty trivial, just + a matter of adding one line to the include/Caps + file. We will have more to say about this in the section on + Source-Form Translation.

+ +

Use Capability Resolution

+ +

The background problem that makes tic tricky + is not the capability translation itself, it is the resolution of + use capabilities. Older versions would not + handle forward use references for this reason + (that is, a using terminal always had to follow its use target in + the source file). By doing this, they got away with a simple + implementation tactic; compile everything as it blows by, then + resolve uses from compiled entries.

+ +

This will not do for ncurses. The problem is + that that the whole compilation process has to be embeddable in + the ncurses library so that it can be called by + the startup code to translate termcap entries on the fly. The + embedded version cannot go promiscuously writing everything it + translates out to disk — for one thing, it will typically + be running with non-root permissions.

+ +

So our tic is designed to parse an entire + terminfo file into a doubly-linked circular list of entry + structures in-core, and then do use resolution + in-memory before writing everything out. This design has other + advantages: it makes forward and back use-references equally easy + (so we get the latter for free), and it makes checking for name + collisions before they are written out easy to do.

+ +

And this is exactly how the embedded version works. But the + stand-alone user-accessible version of tic + partly reverts to the historical strategy; it writes to disk (not + keeping in core) any entry with no use + references.

+ +

This is strictly a core-economy kluge, implemented because the + terminfo master file is large enough that some core-poor systems + swap like crazy when you compile it all in memory...there have + been reports of this process taking three hours, + rather than the twenty seconds or less typical on the author's + development box.

+ +

So. The executable tic passes the + entry-parser a hook that immediately writes out the + referenced entry if it has no use capabilities. The compiler main + loop refrains from adding the entry to the in-core list when this + hook fires. If some other entry later needs to reference an entry + that got written immediately, that is OK; the resolution code + will fetch it off disk when it cannot find it in core.

+ +

Name collisions will still be detected, just not as cleanly. + The write_entry() code complains before overwriting + an entry that postdates the time of tic's first + call to write_entry(), Thus it will complain about + overwriting entries newly made during the tic + run, but not about overwriting ones that predate it.

+ +

Source-Form + Translation

+ +

Another use of tic is to do source + translation between various termcap and terminfo formats. There + are more variants out there than you might think; the ones we + know about are described in the captoinfo(1) + manual page.

+ +

The translation output code (dump_entry() in + ncurses/dump_entry.c) is shared with the + infocmp(1) utility. It takes the same internal + representation used to generate the binary form and dumps it to + standard output in a specified format.

+ +

The include/Caps file has a header comment + describing ways you can specify source translations for + nonstandard capabilities just by altering the master table. It is + possible to set up capability aliasing or tell the compiler to + plain ignore a given capability without writing any C code at + all.

+ +

For circumstances where you need to do algorithmic + translation, there are functions in parse_entry.c + called after the parse of each entry that are specifically + intended to encapsulate such translations. This, for example, is + where the AIX box1 capability get translated to + an acsc string.

+ +

Other Utilities

+ +

The infocmp utility is just a wrapper around + the same entry-dumping code used by tic for + source translation. Perhaps the one interesting aspect of the + code is the use of a predicate function passed in to + dump_entry() to control which capabilities are + dumped. This is necessary in order to handle both the ordinary + De-compilation case and entry difference reporting.

+ +

The tput and clear utilities + just do an entry load followed by a tputs() of a + selected capability.

+ +

Style Tips for Developers

+ +

See the TO-DO file in the top-level directory of the source + distribution for additions that would be particularly useful.

+ +

The prefix _nc_ should be used on library public + functions that are not part of the curses API in order to prevent + pollution of the application namespace. If you have to add to or + modify the function prototypes in curses.h.in, read + ncurses/MKlib_gen.sh first so you can avoid breaking XSI + conformance. Please join the ncurses mailing list. See the + INSTALL file in the top level of the distribution for details on + the list.

+ +

Look for the string FIXME in source files to tag + minor bugs and potential problems that could use fixing.

+ +

Do not try to auto-detect OS features in the main body of the + C code. That is the job of the configuration system.

+ +

To hold down complexity, do make your code data-driven. + Especially, if you can drive logic from a table filtered out of + include/Caps, do it. If you find you need to augment + the data in that file in order to generate the proper table, that + is still preferable to ad-hoc code — that is why the fifth + field (flags) is there.

+ +

Have fun!

+ +

Porting Hints

+ +

The following notes are intended to be a first step towards + DOS and Macintosh ports of the ncurses libraries.

+ +

The following library modules are “pure curses”; + they operate only on the curses internal structures, do all + output through other curses calls (not including + tputs() and putp()) and do not call any + other UNIX routines such as signal(2) or the stdio library. Thus, + they should not need to be modified for single-terminal + ports.

+ +
+ lib_addch.c lib_addstr.c lib_bkgd.c lib_box.c lib_clear.c + lib_clrbot.c lib_clreol.c lib_delch.c lib_delwin.c lib_erase.c + lib_inchstr.c lib_insch.c lib_insdel.c lib_insstr.c + lib_keyname.c lib_move.c lib_mvwin.c lib_newwin.c lib_overlay.c + lib_pad.c lib_printw.c lib_refresh.c lib_scanw.c lib_scroll.c + lib_scrreg.c lib_set_term.c lib_touch.c lib_tparm.c lib_tputs.c + lib_unctrl.c lib_window.c panel.c +
+ +

This module is pure curses, but calls outstr():

+ +
+ lib_getstr.c +
+ +

These modules are pure curses, except that they use + tputs() and putp():

+ +
+ lib_beep.c lib_color.c lib_endwin.c lib_options.c + lib_slk.c lib_vidattr.c +
+ +

This modules assist in POSIX emulation on non-POSIX + systems:

+ +
+
sigaction.c
+ +
signal calls
+
+ +

The following source files will not be needed for a + single-terminal-type port.

+ +
+ alloc_entry.c captoinfo.c clear.c comp_captab.c + comp_error.c comp_hash.c comp_main.c comp_parse.c comp_scan.c + dump_entry.c infocmp.c parse_entry.c read_entry.c tput.c + write_entry.c +
+ +

The following modules will use + open()/read()/write()/close()/lseek() on files, but no other OS + calls.

+ +
+
lib_screen.c
+ +
used to read/write screen dumps
+ +
lib_trace.c
+ +
used to write trace data to the logfile
+
+ +

Modules that would have to be modified for a port start + here:

+ +

The following modules are “pure curses” but + contain assumptions inappropriate for a memory-mapped port.

+ +
+
lib_longname.c
+ +
assumes there may be multiple terminals
+ +
lib_acs.c
+ +
assumes acs_map as a double indirection
+ +
lib_mvcur.c
+ +
assumes cursor moves have variable cost
+ +
lib_termcap.c
+ +
assumes there may be multiple terminals
+ +
lib_ti.c
+ +
assumes there may be multiple terminals
+
+ +

The following modules use UNIX-specific calls:

+ +
+
lib_doupdate.c
+ +
input checking
+ +
lib_getch.c
+ +
read()
+ +
lib_initscr.c
+ +
getenv()
+ +
lib_newterm.c
+ +
lib_baudrate.c
+ +
lib_kernel.c
+ +
various tty-manipulation and system calls
+ +
lib_raw.c
+ +
various tty-manipulation calls
+ +
lib_setup.c
+ +
various tty-manipulation calls
+ +
lib_restart.c
+ +
various tty-manipulation calls
+ +
lib_tstp.c
+ +
signal-manipulation calls
+ +
lib_twait.c
+ +
gettimeofday(), select().
+
+ +
+ +
+ Eric S. Raymond <esr@snark.thyrsus.com> +
+ (Note: This is not the bug + address!) + + diff --git a/contrib/ncurses/doc/html/index.html b/contrib/ncurses/doc/html/index.html new file mode 100644 index 00000000..3f35122d --- /dev/null +++ b/contrib/ncurses/doc/html/index.html @@ -0,0 +1,68 @@ + + + + + + Welcome to ncurses + + + + +

Welcome to ncurses

+ +

From this index page you have access to these further + documents

+ + + +

We also have HTML versions of all the ncurses manpages.

+ + diff --git a/contrib/ncurses/doc/html/man/adacursesw6-config.1.html b/contrib/ncurses/doc/html/man/adacursesw6-config.1.html new file mode 100644 index 00000000..3ded34ae --- /dev/null +++ b/contrib/ncurses/doc/html/man/adacursesw6-config.1.html @@ -0,0 +1,144 @@ + + + + + + +adacursesw6\-config 1 2024-04-20 ncurses 6.5 User commands + + + + +

adacursesw6\-config 1 2024-04-20 ncurses 6.5 User commands

+
+adacursesw6-config(1)            User commands           adacursesw6-config(1)
+
+
+
+
+

NAME

+       adacursesw6-config - configuration helper for AdaCurses libraries
+
+
+

SYNOPSIS

+       adacursesw6-config [--cflags] [--libs]
+
+       adacursesw6-config --version
+
+       adacursesw6-config --help
+
+
+

DESCRIPTION

+       This  program  development  aid  simplifies  the process of configuring
+       applications to use the AdaCurses library binding to ncurses.
+
+
+

OPTIONS

+       --cflags   reports the GNAT (Ada compiler) flags needed to compile with
+                  AdaCurses.
+
+       --libs     reports the GNAT libraries needed to link with AdaCurses.
+
+       --version  reports  the  release  and  patch  date  information  of the
+                  ncurses libraries used to configure and build AdaCurses  and
+                  exits successfully.
+
+       --help     issues a usage message and exits successfully.
+
+       Omitting options implies "--cflags --libs".
+
+
+

EXAMPLES

+       Consider a program using AdaCurses to write the message "Hello, world!"
+       in the center of the screen and wait for the user to press the "q"  key
+       before exiting.  Populate a file hello.adb with the following.
+
+           with Terminal_Interface.Curses; use Terminal_Interface.Curses;
+
+           procedure Hello is
+              Visibility : Cursor_Visibility := Invisible;
+              Message : constant String := "Hello, World!";
+              done : Boolean := False;
+              c : Key_Code;
+           begin
+              Init_Screen;
+              Set_Echo_Mode (False);
+              Set_Cursor_Visibility (Visibility);
+              Set_Timeout_Mode (Standard_Window, Non_Blocking, 0);
+
+              Move_Cursor (Line => Lines / 2,
+                           Column => (Columns - Message'Length) / 2);
+              Add (Str => Message);
+
+              while not done loop
+                 c := Get_Keystroke (Standard_Window);
+
+                 case c is
+                     when Character'Pos ('q') => done := True;
+                     when others => null;
+                 end case;
+
+                 Nap_Milli_Seconds (50);
+              end loop;
+
+              End_Windows;
+
+           end Hello;
+
+       Then, using
+           gnatmake `adacursesw6-config --cflags` hello \
+               -largs `adacursesw6-config --libs`
+       or, more simply,
+           gnatmake hello `adacursesw6-config`
+       you can compile and link the program.
+
+
+

SEE ALSO

+       curses(3x)
+
+
+
+ncurses 6.5                       2024-04-20             adacursesw6-config(1)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/captoinfo.1m.html b/contrib/ncurses/doc/html/man/captoinfo.1m.html new file mode 100644 index 00000000..889505ed --- /dev/null +++ b/contrib/ncurses/doc/html/man/captoinfo.1m.html @@ -0,0 +1,214 @@ + + + + + + +captoinfo 1m 2024-09-13 ncurses 6.5 User commands + + + + +

captoinfo 1m 2024-09-13 ncurses 6.5 User commands

+
+captoinfo(1m)                    User commands                   captoinfo(1m)
+
+
+
+
+

NAME

+       captoinfo - convert a termcap description into a terminfo description
+
+
+

SYNOPSIS

+       captoinfo [tic-option] [file ...]
+
+       captoinfo -V
+
+
+

DESCRIPTION

+       captoinfo  translates  terminal  descriptions.   It looks in each given
+       text file for termcap entries  and,  for  each  one  found,  writes  an
+       equivalent terminfo description to the standard output stream.  termcap
+       tc capabilities translate to terminfo "use" capabilities.
+
+       If no files are specified, captoinfo  interprets  the  content  of  the
+       environment  variable  TERMCAP  as  a  file name, and extracts only the
+       entry for the terminal named in the environment variable TERM from  it.
+       If  the  environment  variable  TERMCAP  is  not  set,  captoinfo reads
+       /etc/termcap.
+
+       This utility is implemented as a link to tic(1m), with the latter's  -I
+       option  implied.  You can use other tic options such as -1, -f, -v, -w,
+       and -x.  The -V option reports the version of ncurses  associated  with
+       this program and exits with a successful status.
+
+
+

Translations from Nonstandard Capabilities

+       captoinfo  translates  some  obsolete,  nonstandard  capabilities  into
+       standard terminfo capabilities.  It issues a diagnostic to the standard
+       error  stream  for  each,  inviting  the  user to check that it has not
+       mistakenly translated an unknown or mistyped capability name.
+
+                 termcap Code
+              Obsolete   Standard    Origin      terminfo capability
+              ---------------------------------------------------------
+                 BO         mr        AT&T      enter_reverse_mode
+                 CI         vi        AT&T      cursor_invisible
+                 CV         ve        AT&T      cursor_normal
+                 DS         mh        AT&T      enter_dim_mode
+                 EE         me        AT&T      exit_attribute_mode
+                 FE         LF        AT&T      label_on
+                 FL         LO        AT&T      label_off
+                 XS         mk        AT&T      enter_secure_mode
+                 EN         @7        XENIX     key_end
+                 GE         ae        XENIX     exit_alt_charset_mode
+                 GS         as        XENIX     enter_alt_charset_mode
+                 HM         kh        XENIX     key_home
+                 LD         kL        XENIX     key_dl
+                 PD         kN        XENIX     key_npage
+                 PN         po        XENIX     prtr_off
+                 PS         pf        XENIX     prtr_on
+                 PU         kP        XENIX     key_ppage
+                 RT         @8        XENIX     kent
+                 UP         ku        XENIX     kcuu1
+                 KA         k;      Tektronix   key_f10
+                 KB         F1      Tektronix   key_f11
+                 KC         F2      Tektronix   key_f12
+                 KD         F3      Tektronix   key_f13
+                 KE         F4      Tektronix   key_f14
+                 KF         F5      Tektronix   key_f15
+                 BC         Sb      Tektronix   set_background
+                 FC         Sf      Tektronix   set_foreground
+
+                 HS         mh        IRIX      enter_dim_mode
+
+       XENIX termcap had a set of extension capabilities, corresponding to box
+       drawing characters of CCSID ("code page") 437, as follows.
+
+                      termcap Code            Graphic
+                      -----------------------------------------
+                           G2        upper left corner
+                           G3        lower left corner
+                           G1        upper right corner
+                           G4        lower right corner
+                           GR        tee pointing right
+                           GL        tee pointing left
+                           GU        tee pointing up
+                           GD        tee pointing down
+                           GH        horizontal line
+                           GV        vertical line
+                           GC        intersection
+                           G6        double upper left corner
+                           G7        double lower left corner
+                           G5        double upper right corner
+                           G8        double lower right corner
+                           Gr        double tee pointing right
+                           Gr        double tee pointing left
+                           Gu        double tee pointing up
+                           Gd        double tee pointing down
+                           Gh        double horizontal line
+                           Gv        double vertical line
+                           Gc        double intersection
+                           GG        ACS magic cookie count
+
+       captoinfo  composes  single-line  capabilities into an acsc string, and
+       discards GG and double-line capabilities with a warning diagnostic.
+
+       IBM's AIX has a terminfo facility descended  from  SVr1  terminfo,  but
+       which  is  incompatible with the SVr4 format.  captoinfo translates the
+       following AIX extensions.
+
+                                    IBM    X/Open
+                                   ---------------
+                                   ksel    kslt
+                                   kbtab   kcbt
+                                   font0   s0ds
+                                   font1   s1ds
+                                   font2   s2ds
+                                   font3   s3ds
+
+       Additionally, this program translates the AIX  box1  capability  to  an
+       acsc string.
+
+       The   HP-UX   terminfo   library   supports  two  nonstandard  terminfo
+       capabilities, meml (memory lock) and memu (memory  unlock).   captoinfo
+       discards these with a warning message.
+
+
+

FILES

+       /etc/termcap
+              default termcap terminal capability database
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  7  (2009) describes tic briefly, but omits this
+       program.
+
+       SVr4 systems provide captoinfo as a separate application from tic.  Its
+       -v  option  does not accept a trace level argument n; repeat -v n times
+       instead.
+
+       NetBSD does not provide this application.
+
+
+

AUTHORS

+       Eric S. Raymond <esr@snark.thyrsus.com> and
+       Thomas E. Dickey <dickey@invisible-island.net>
+
+
+

SEE ALSO

+       infocmp(1m), tic(1m), curses(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-09-13                     captoinfo(1m)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/clear.1.html b/contrib/ncurses/doc/html/man/clear.1.html new file mode 100644 index 00000000..e7da4da4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/clear.1.html @@ -0,0 +1,165 @@ + + + + + + +clear 1 2024-03-16 ncurses 6.5 User commands + + + + +

clear 1 2024-03-16 ncurses 6.5 User commands

+
+clear(1)                         User commands                        clear(1)
+
+
+
+
+

NAME

+       clear - clear the terminal screen
+
+
+

SYNOPSIS

+       clear [-x] [-T terminal-type]
+
+       clear -V
+
+
+

DESCRIPTION

+       clear  clears your terminal's screen and its scrollback buffer, if any.
+       clear retrieves the terminal type from the environment  variable  TERM,
+       then  consults the terminfo terminal capability database entry for that
+       type to determine how to perform these actions.
+
+       The capabilities to clear the screen and scrollback  buffer  are  named
+       "clear"   and   "E3",  respectively.   The  latter  is  a  user-defined
+       capability, applying an extension mechanism introduced in  ncurses  5.0
+       (1999).
+
+
+

OPTIONS

+       clear recognizes the following options.
+
+       -T type  produces   instructions   suitable   for  the  terminal  type.
+                Normally, this option is  unnecessary,  because  the  terminal
+                type  is inferred from the environment variable TERM.  If this
+                option is specified, clear ignores the  environment  variables
+                LINES and COLUMNS as well.
+
+       -V       reports  the  version  of ncurses associated with this program
+                and exits with a successful status.
+
+       -x       prevents clear from attempting to clear the scrollback buffer.
+
+
+

PORTABILITY

+       Neither IEEE Std 1003.1/The Open  Group  Base  Specifications  Issue  7
+       (POSIX.1-2008) nor X/Open Curses Issue 7 documents clear.
+
+       The  latter documents tput, which could be used to replace this utility
+       either via a shell script or by an alias (such as a symbolic  link)  to
+       run tput as clear.
+
+
+

HISTORY

+       A clear command using the termcap database and library appeared in 2BSD
+       (1979).  Eighth Edition Unix (1985) later included it.
+
+       The commercial Unix arm of AT&T adapted a different BSD program  (tset)
+       to  make  a  new  command,  tput, and replaced the clear program with a
+       shell script that called "tput clear".
+
+           /usr/bin/tput ${1:+-T$1} clear 2> /dev/null
+           exit
+
+       In 1989, when Keith Bostic revised the BSD  tput  command  to  make  it
+       similar to AT&T's tput, he added a clear shell script as well.
+
+           exec tput clear
+
+       The remainder of the script in each case is a copyright notice.
+
+       In 1995, ncurses's clear began by adapting BSD's original clear command
+       to use terminfo.  The E3 extension came later.
+
+       o   In June 1999, xterm provided an extension to the  standard  control
+           sequence  for  clearing  the screen.  Rather than clearing just the
+           visible part of the screen using
+
+               printf '\033[2J'
+
+           one could clear the scrollback buffer as well by using
+
+               printf '\033[3J'
+
+           instead.  "XTerm  Control  Sequences"  documents  this  feature  as
+           originating with xterm.
+
+       o   A few other terminal emulators adopted it, such as PuTTY in 2006.
+
+       o   In  April  2011, a Red Hat developer submitted a patch to the Linux
+           kernel,  modifying  its  console  driver  to  do  the  same  thing.
+           Documentation  of  this  change,  appearing  in  Linux 3.0, did not
+           mention xterm, although that program was cited in the Red  Hat  bug
+           report (#683733) motivating the feature.
+
+       o   Subsequently,  more  terminal  developers adopted the feature.  The
+           next relevant step was to change the ncurses clear program in  2013
+           to incorporate this extension.
+
+       o   In 2013, the E3 capability was not exercised by "tput clear".  That
+           oversight was addressed in 2016 by reorganizing tput to  share  its
+           logic with clear and tset.
+
+
+

SEE ALSO

+       tput(1), xterm(1), terminfo(5)
+
+
+
+ncurses 6.5                       2024-03-16                          clear(1)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_add_wch.3x.html b/contrib/ncurses/doc/html/man/curs_add_wch.3x.html new file mode 100644 index 00000000..1f4d9d56 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_add_wch.3x.html @@ -0,0 +1,397 @@ + + + + + + +curs_add_wch 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_add_wch 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_add_wch(3x)                 Library calls                curs_add_wch(3x)
+
+
+
+
+

NAME

+       add_wch, wadd_wch, mvadd_wch, mvwadd_wch, echo_wchar, wecho_wchar - add
+       a curses complex character to a window, possibly advancing the cursor
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int add_wch(const cchar_t *wch);
+       int wadd_wch(WINDOW *win, const cchar_t *wch);
+       int mvadd_wch(int y, int x, const cchar_t *wch);
+       int mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch);
+
+       int echo_wchar(const cchar_t *wch);
+       int wecho_wchar(WINDOW *win, const cchar_t *wch);
+
+
+

DESCRIPTION

+
+

wadd_wch

+       wadd_wch writes the complex character wch to the window win,  then  may
+       advance  the  cursor  position, analogously to the standard C library's
+       putwchar(3).  ncurses(3x) describes the variants of this function.
+
+       Much behavior depends on whether the wide characters in wch are spacing
+       or non-spacing; see subsection "Complex Characters" below.
+
+       o   If  wch  contains  a  spacing  character, then any character at the
+           cursor is first removed.   The  complex  character  wch,  with  its
+           attributes  and  color  pair  identifier,  becomes  the base of the
+           active complex character.
+
+       o   If wch contains only non-spacing characters, they are combined with
+           the  active  complex  character.  curses ignores its attributes and
+           color pair identifier, and does not advance the cursor.
+
+       Further non-spacing characters added with wadd_wch are not  written  at
+       the  new  cursor position but combine with the active complex character
+       until another spacing character is written to the window or the  cursor
+       is moved.
+
+       If advancement occurs at the right margin,
+
+       o   the  cursor  automatically wraps to the beginning of the next line,
+           then,
+
+       o   if  it  was  at  the  bottom  of  the  scrolling  region,  and   if
+           scrollok(3x)  is  enabled  for win, the scrolling region scrolls up
+           one line.
+
+       If wch is a backspace, carriage return, line feed, or tab,  the  cursor
+       moves appropriately within the window.
+
+       o   Backspace  moves  the cursor one character left; at the left margin
+           of a window, it does nothing.
+
+       o   Carriage return moves the cursor to the left  margin  on  the  same
+           line of the window.
+
+       o   Line  feed  does a clrtoeol(3x), then advances as if from the right
+           margin.
+
+       o   Tab advances the cursor to the next tab stop (possibly on the  next
+           line);  these  are placed at every eighth column by default.  Alter
+           the   tab   interval    with    the    TABSIZE    extension;    see
+           curs_variables(3x).
+
+       If  wch  is  any other nonprintable character, it is drawn in printable
+       form using the same convention as wunctrl(3x).  Calling win_wch(3x)  on
+       the  location of a nonprintable character does not return the character
+       itself, but its wunctrl(3x) representation.
+
+       A cchar_t can be copied from  place  to  place  using  win_wch(3x)  and
+       wadd_wch.
+
+
+

wecho_wchar

+       echo_wchar   and  wecho_wchar  are  equivalent  to  calling  (w)add_wch
+       followed by (w)refresh.  curses interprets these functions  as  a  hint
+       that only a single (complex) character is being output; for non-control
+       characters, a considerable performance gain may be enjoyed by employing
+       them.
+
+
+

Forms-Drawing Characters

+       curses  defines  macros  starting  with  WACS_  that  can  be used with
+       wadd_wch to write line-drawing and  other  special  characters  to  the
+       screen.  ncurses terms these forms-drawing characters.  The ACS default
+       listed below is used if the acs_chars (acsc) terminfo  capability  does
+       not  define  a terminal-specific replacement for it, or if the terminal
+       and locale configuration requires Unicode to  access  these  characters
+       but  the  library  is  unable  to  use Unicode.  The "acsc char" column
+       corresponds to how the characters are specified in the acs_chars (acsc)
+       string capability, and the characters in it may appear on the screen if
+       the terminal type's database entry incorrectly advertises ACS  support.
+       The name "ACS" originates in the Alternate Character Set feature of the
+       DEC VT100 terminal.
+
+                       Unicode   ACS       acsc
+       Symbol          Default   Default   char   Glyph Name
+       ------------------------------------------------------------------------
+       WACS_BLOCK      0x25ae    #         0      solid square block
+       WACS_BOARD      0x2592    #         h      board of squares
+       WACS_BTEE       0x2534    +         v      bottom tee
+       WACS_BULLET     0x00b7    o         ~      bullet
+       WACS_CKBOARD    0x2592    :         a      checker board (stipple)
+       WACS_DARROW     0x2193    v         .      arrow pointing down
+       WACS_DEGREE     0x00b0    '         f      degree symbol
+       WACS_DIAMOND    0x25c6    +         `      diamond
+       WACS_GEQUAL     0x2265    >         >      greater-than-or-equal-to
+       WACS_HLINE      0x2500    -         q      horizontal line
+       WACS_LANTERN    0x2603    #         i      lantern symbol
+       WACS_LARROW     0x2190    <         ,      arrow pointing left
+       WACS_LEQUAL     0x2264    <         y      less-than-or-equal-to
+       WACS_LLCORNER   0x2514    +         m      lower left-hand corner
+       WACS_LRCORNER   0x2518    +         j      lower right-hand corner
+       WACS_LTEE       0x2524    +         t      left tee
+       WACS_NEQUAL     0x2260    !         |      not-equal
+       WACS_PI         0x03c0    *         {      greek pi
+       WACS_PLMINUS    0x00b1    #         g      plus/minus
+       WACS_PLUS       0x253c    +         n      plus
+       WACS_RARROW     0x2192    >         +      arrow pointing right
+       WACS_RTEE       0x251c    +         u      right tee
+       WACS_S1         0x23ba    -         o      scan line 1
+       WACS_S3         0x23bb    -         p      scan line 3
+       WACS_S7         0x23bc    -         r      scan line 7
+       WACS_S9         0x23bd    _         s      scan line 9
+       WACS_STERLING   0x00a3    f         }      pound-sterling symbol
+       WACS_TTEE       0x252c    +         w      top tee
+       WACS_UARROW     0x2191    ^         -      arrow pointing up
+       WACS_ULCORNER   0x250c    +         l      upper left-hand corner
+       WACS_URCORNER   0x2510    +         k      upper right-hand corner
+
+       WACS_VLINE      0x2502    |         x      vertical line
+
+       The wide-character configuration of ncurses also  defines  symbols  for
+       thick lines (acsc "J" to "V"):
+
+                         Unicode   ASCII     acsc
+       ACS Name          Default   Default   Char   Glyph Name
+       ------------------------------------------------------------------------
+       WACS_T_BTEE       0x253b    +         V      thick tee pointing up
+       WACS_T_HLINE      0x2501    -         Q      thick horizontal line
+       WACS_T_LLCORNER   0x2517    +         M      thick lower left corner
+       WACS_T_LRCORNER   0x251b    +         J      thick lower right corner
+       WACS_T_LTEE       0x252b    +         T      thick tee pointing right
+       WACS_T_PLUS       0x254b    +         N      thick large plus
+       WACS_T_RTEE       0x2523    +         U      thick tee pointing left
+       WACS_T_TTEE       0x2533    +         W      thick tee pointing down
+       WACS_T_ULCORNER   0x250f    +         L      thick upper left corner
+       WACS_T_URCORNER   0x2513    +         K      thick upper right corner
+       WACS_T_VLINE      0x2503    |         X      thick vertical line
+
+       and for double-lines (acsc "A" to "I"):
+
+                         Unicode   ASCII     acsc
+       ACS Name          Default   Default   Char   Glyph Name
+       ------------------------------------------------------------------------
+       WACS_D_BTEE       0x2569    +         H      double tee pointing up
+       WACS_D_HLINE      0x2550    -         R      double horizontal line
+       WACS_D_LLCORNER   0x255a    +         D      double lower left corner
+       WACS_D_LRCORNER   0x255d    +         A      double lower right corner
+       WACS_D_LTEE       0x2560    +         F      double tee pointing right
+       WACS_D_PLUS       0x256c    +         E      double large plus
+       WACS_D_RTEE       0x2563    +         G      double tee pointing left
+       WACS_D_TTEE       0x2566    +         I      double tee pointing down
+       WACS_D_ULCORNER   0x2554    +         C      double upper left corner
+       WACS_D_URCORNER   0x2557    +         B      double upper right corner
+       WACS_D_VLINE      0x2551    |         Y      double vertical line
+
+       Unicode's  descriptions  for  these  characters  differs  slightly from
+       ncurses, by introducing the term "light"  (along  with  less  important
+       details).   Here are its descriptions for the normal, thick, and double
+       horizontal lines:
+
+       o   U+2500 BOX DRAWINGS LIGHT HORIZONTAL
+
+       o   U+2501 BOX DRAWINGS HEAVY HORIZONTAL
+
+       o   U+2550 BOX DRAWINGS DOUBLE HORIZONTAL
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.   In  ncurses,
+       wadd_wch returns ERR if
+
+       o   win is NULL,
+
+       o   wrapping  to  a new line is impossible because scrollok(3x) has not
+           been called on win when writing to its  bottom  right  location  is
+           attempted, or
+
+       o   it  is  not  possible  to  add  a  complete character at the cursor
+           position.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       add_wch,  mvadd_wch,  mvwadd_wch,  and echo_wchar may be implemented as
+       macros.
+
+
+

EXTENSIONS

+
+

TABSIZE

+       The TABSIZE variable is implemented  in  SVr4  and  other  versions  of
+       curses, but is not specified by X/Open Curses (see curs_variables(3x)).
+
+
+

PORTABILITY

+       These  functions are described in X/Open Curses, Issue 4.  It specifies
+       no error conditions for them.
+
+       The defaults specified for forms-drawing characters apply in the  POSIX
+       locale.   X/Open Curses makes it clear that the WACS_ symbols should be
+       defined as a pointer to  cchar_t  data,  e.g.,  in  the  discussion  of
+       border_set.  A few implementations are problematic:
+
+       o   NetBSD curses defines the symbols as a wchar_t within a cchar_t.
+
+       o   HP-UX  curses  equates  some  of  the ACS_ symbols to the analogous
+           WACS_ symbols as if the ACS_ symbols  were  wide  characters.   The
+           misdefined  symbols  are the arrows and other symbols which are not
+           used for line-drawing.
+
+       X/Open Curses does not specify  symbols  for  thick-  or  double-lines.
+       SVr4 curses implementations defined their line-drawing symbols in terms
+       of intermediate symbols.  This implementation  extends  those  symbols,
+       providing new definitions which are not in the SVr4 implementations.
+
+       Not  all  Unicode-capable  terminals  provide  support  for VT100-style
+       alternate character  sets  (i.e.,  the  acsc  capability),  with  their
+       corresponding  line-drawing  characters.  X/Open Curses did not address
+       the  aspect  of  integrating  Unicode  with  line-drawing   characters.
+       Existing  implementations of Unix curses (AIX, HP-UX, Solaris) use only
+       the acsc character-mapping to provide this feature.  As a result, those
+       implementations  can  only  use  single-byte  line-drawing  characters.
+       ncurses 5.3 (2002) provided a table of Unicode values  to  solve  these
+       problems.  NetBSD curses incorporated that table in 2010.
+
+       In  this  implementation,  the  Unicode  values are used instead of the
+       terminal description's acsc mapping as discussed in ncurses(3x) for the
+       environment  variable  NCURSES_NO_UTF8_ACS.   In contrast, for the same
+       cases, the line-drawing characters described in addch(3x) will use only
+       the ASCII default values.
+
+       Having  Unicode available does not solve all of the problems with line-
+       drawing for curses:
+
+       o   The closest Unicode equivalents to the VT100 graphics  S1,  S3,  S7
+           and  S9 frequently are not displayed at the regular intervals which
+           the terminal used.
+
+       o   The lantern is a special case.  It originated with  the  AT&T  4410
+           terminal  in the early 1980s.  There is no accessible documentation
+           depicting the lantern symbol on the AT&T terminal.
+
+           Lacking documentation, most readers assume that a storm lantern was
+           intended.  But there are several possibilities, all with problems.
+
+           Unicode  6.0  (2010)  does provide two lantern symbols: U+1F383 and
+           U+1F3EE.  Those were not available  in  2002,  and  are  irrelevant
+           since  they  lie  outside the BMP and as a result are not generally
+           available in terminals.  They are not storm lanterns, in any case.
+
+           Most storm lanterns have a tapering glass chimney (to guard against
+           tipping); some have a wire grid protecting the chimney.
+
+           For  the  tapering  appearance,   U+2603 was adequate.  In use on a
+           terminal, no one can tell what the image represents.  Unicode calls
+           it a snowman.
+
+           Others have suggested these alternatives: <section> U+00A7 (section
+           mark), <Theta> U+0398 (theta), <Phi> U+03A6 (phi),  <delta>  U+03B4
+           (delta),  U+2327 (x in a rectangle),  U+256C (forms double vertical
+           and horizontal), and  U+2612 (ballot box with x).
+
+
+

Complex Characters

+       The complex character  type  cchar_t  can  store  more  than  one  wide
+       character  (wchar_t).  X/Open Curses does not mention this possibility,
+       specifying behavior only  where  wch  is  a  single  character,  either
+       spacing or non-spacing.
+
+       ncurses assumes that wch is constructed using setcchar(3x), and in turn
+       that the result
+
+       o   contains at most one spacing character at the beginning of its list
+           of wide characters, and zero or more non-spacing characters, or
+
+       o   holds one non-spacing character.
+
+       In  the  latter  case,  ncurses  adds  the non-spacing character to the
+       active complex character.
+
+
+

HISTORY

+       These functions were initially specified by  X/Open  Curses,  Issue  4.
+       The   System V   Interface  Definition,  Version  4  (1995),  specified
+       functions named waddwch and wechowchar (and the usual variants).  These
+       were later additions to SVr4.x, not appearing in the first SVr4 (1989).
+       They differed from X/Open's later wadd_wch and wecho_wchar in that they
+       each took an argument of type wchar_t instead of cchar_t.
+
+
+

SEE ALSO

+       curs_addch(3x) describes comparable functions of the ncurses library in
+       its non-wide-character configuration.
+
+       curses(3x),   curs_addwstr(3x),   curs_add_wchstr(3x),   curs_attr(3x),
+       curs_clear(3x),  curs_getcchar(3x), curs_outopts(3x), curs_refresh(3x),
+       curs_variables(3x), putwc(3)
+
+
+
+ncurses 6.5                       2024-07-27                  curs_add_wch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_add_wchstr.3x.html b/contrib/ncurses/doc/html/man/curs_add_wchstr.3x.html new file mode 100644 index 00000000..1d0e9798 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_add_wchstr.3x.html @@ -0,0 +1,148 @@ + + + + + + +curs_add_wchstr 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_add_wchstr 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_add_wchstr(3x)              Library calls             curs_add_wchstr(3x)
+
+
+
+
+

NAME

+       add_wchstr,   wadd_wchstr,  mvadd_wchstr,  mvwadd_wchstr,  add_wchnstr,
+       wadd_wchnstr, mvadd_wchnstr, mvwadd_wchnstr  -  add  a  curses  complex
+       character string to a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int add_wchstr(const cchar_t * wchstr);
+       int wadd_wchstr(WINDOW *  win, const cchar_t * wchstr);
+       int mvadd_wchstr(int y, int x, const cchar_t * wchstr);
+       int mvwadd_wchstr(WINDOW * win, int y, int x, const cchar_t * wchstr);
+
+       int add_wchnstr(const cchar_t * wchstr, int n);
+       int wadd_wchnstr(WINDOW *  win, const cchar_t * wchstr, int n);
+       int mvadd_wchnstr(int y, int x, const cchar_t * wchstr, int n);
+       int mvwadd_wchnstr(WINDOW * win, int y, int x, const cchar_t * wchstr, int n);
+
+
+

DESCRIPTION

+       wadd_wchstr  copies  the  string  of  complex  characters wchstr to the
+       window win.  A null complex character  terminates  the  string.   If  a
+       complex  character  does  not  completely  fit  at the end of the line,
+       curses fills the remaining columns  with  the  window  background;  see
+       bkgrnd(3x).    wadd_wchnstr  does  the  same,  but  copies  at  most  n
+       characters, or as many as possible if n is -1.   ncurses(3x)  describes
+       the variants of these functions.
+
+       Because  these  functions do not call wadd_wch(3x) internally, they are
+       faster than waddwstr(3x) and waddnwstr(3x).  On the other hand, they
+
+       o   do  not  treat  the  backspace,  carriage  return,  or  line   feed
+           characters specially;
+
+       o   do not represent unprintable characters with wunctrl(3x);
+
+       o   do  not  update  the  cursor  position to follow the last character
+           written;
+
+       o   truncate the string at  the  window's  right  margin,  rather  than
+           wrapping it to the next line and potentially scrolling.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL or
+
+       o   wchstr is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these  functions  except  wadd_wchnstr  may  be  implemented  as
+       macros.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+
+

HISTORY

+       These functions were initially specified by  X/Open  Curses,  Issue  4.
+       The   System V   Interface  Definition,  Version  4  (1995),  specified
+       functions named waddwchstr and waddwchnstr (and  the  usual  variants).
+       These  were  later additions to SVr4.x, not appearing in the first SVr4
+       (1989).  They differed from X/Open's later wadd_wchstr and wadd_wchnstr
+       in that they each took an argument of type wchar_t instead of cchar_t.
+
+
+

SEE ALSO

+       curs_addchstr(3x) describes comparable functions of the ncurses library
+       in its non-wide-character configuration.
+
+       curses(3x), curs_addwstr(3x), curs_add_wch(3x)
+
+
+
+ncurses 6.5                       2024-07-27               curs_add_wchstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_addch.3x.html b/contrib/ncurses/doc/html/man/curs_addch.3x.html new file mode 100644 index 00000000..157e46d3 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_addch.3x.html @@ -0,0 +1,351 @@ + + + + + + +curs_addch 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_addch 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_addch(3x)                   Library calls                  curs_addch(3x)
+
+
+
+
+

NAME

+       addch,  waddch,  mvaddch,  mvwaddch, echochar, wechochar - add a curses
+       character to a window and advance the cursor
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int addch(const chtype ch);
+       int waddch(WINDOW *win, const chtype ch);
+       int mvaddch(int y, int x, const chtype ch);
+       int mvwaddch(WINDOW *win, int y, int x, const chtype ch);
+
+       int echochar(const chtype ch);
+       int wechochar(WINDOW *win, const chtype ch);
+
+
+

DESCRIPTION

+
+

waddch

+       waddch writes the curses character ch to the window win, then  advances
+       the   cursor   position,   analogously  to  the  standard  C  library's
+       putchar(3).  ncurses(3x) describes the variants of this function.
+
+       If advancement occurs at the right margin,
+
+       o   the cursor automatically wraps to the beginning of the  next  line,
+           then,
+
+       o   if   it  was  at  the  bottom  of  the  scrolling  region,  and  if
+           scrollok(3x) is enabled for win, the scrolling  region  scrolls  up
+           one line.
+
+       If  ch  is  a backspace, carriage return, line feed, or tab, the cursor
+       moves appropriately within the window.
+
+       o   Backspace moves the cursor one character left; at the  left  margin
+           of a window, it does nothing.
+
+       o   Carriage  return  moves  the  cursor to the left margin on the same
+           line of the window.
+
+       o   Line feed does a clrtoeol(3x), then advances as if from  the  right
+           margin.
+
+       o   Tab  advances the cursor to the next tab stop (possibly on the next
+           line); these are placed at every eighth column by  default.   Alter
+           the    tab    interval    with    the    TABSIZE   extension;   see
+           curs_variables(3x).
+
+       If ch is any other nonprintable character, it  is  drawn  in  printable
+       form using the same convention as unctrl(3x).  Calling winch(3x) on the
+       location of a nonprintable character  does  not  return  the  character
+       itself, but its unctrl(3x) representation.
+
+       The  object or expression ch may contain attributes and/or a color pair
+       identifier.  (A  chtype  can  be  copied  from  place  to  place  using
+       winch(3x)  and  waddch.)   See  curs_attr(3x)  for values of predefined
+       constants that can be usefully "or"ed with characters.
+
+
+

wechochar

+       echochar and wechochar are equivalent to calling (w)addch  followed  by
+       (w)refresh.   curses  interprets  these  functions  as  a  hint  to its
+       optimizer that only a single character cell  in  the  window  is  being
+       altered  between  refreshes; for non-control characters, a considerable
+       performance gain may be enjoyed by employing them.
+
+
+

Forms-Drawing Characters

+       curses defines macros starting with ACS_ that can be used  with  waddch
+       to  write  line-drawing  and  other  special  characters to the screen.
+       ncurses terms these forms-drawing characters.  The ACS  default  listed
+       below  is  used  if  the  acs_chars (acsc) terminfo capability does not
+       define a terminal-specific replacement for it, or if the  terminal  and
+       locale  configuration  requires  Unicode to access these characters but
+       the  library  is  unable  to  use  Unicode.   The  "acsc  char"  column
+       corresponds to how the characters are specified in the acs_chars (acsc)
+       string capability, and the characters in it may appear on the screen if
+       the  terminal type's database entry incorrectly advertises ACS support.
+       The name "ACS" originates in the Alternate Character Set feature of the
+       DEC VT100 terminal.
+
+                      ACS       acsc
+       Symbol         Default   char   Glyph Name
+       ------------------------------------------------------------------------
+       ACS_BLOCK      #         0      solid square block
+       ACS_BOARD      #         h      board of squares
+       ACS_BTEE       +         v      bottom tee
+       ACS_BULLET     o         ~      bullet
+       ACS_CKBOARD    :         a      checker board (stipple)
+       ACS_DARROW     v         .      arrow pointing down
+       ACS_DEGREE     '         f      degree symbol
+       ACS_DIAMOND    +         `      diamond
+       ACS_GEQUAL     >         >      greater-than-or-equal-to
+       ACS_HLINE      -         q      horizontal line
+       ACS_LANTERN    #         i      lantern symbol
+       ACS_LARROW     <         ,      arrow pointing left
+       ACS_LEQUAL     <         y      less-than-or-equal-to
+       ACS_LLCORNER   +         m      lower left-hand corner
+       ACS_LRCORNER   +         j      lower right-hand corner
+       ACS_LTEE       +         t      left tee
+       ACS_NEQUAL     !         |      not-equal
+       ACS_PI         *         {      greek pi
+       ACS_PLMINUS    #         g      plus/minus
+       ACS_PLUS       +         n      plus
+       ACS_RARROW     >         +      arrow pointing right
+       ACS_RTEE       +         u      right tee
+       ACS_S1         -         o      scan line 1
+       ACS_S3         -         p      scan line 3
+       ACS_S7         -         r      scan line 7
+       ACS_S9         _         s      scan line 9
+       ACS_STERLING   f         }      pound-sterling symbol
+       ACS_TTEE       +         w      top tee
+       ACS_UARROW     ^         -      arrow pointing up
+       ACS_ULCORNER   +         l      upper left-hand corner
+       ACS_URCORNER   +         k      upper right-hand corner
+       ACS_VLINE      |         x      vertical line
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, waddch returns ERR if
+
+       o   win is NULL,
+
+       o   wrapping  to  a new line is impossible because scrollok(3x) has not
+           been called on win when a write to its  bottom  right  location  is
+           attempted, or
+
+       o   it  is  not  possible  to  add  a  complete character at the cursor
+           position.
+
+       The last may be due to different causes:
+
+       o   conversion of a wide character to a  multibyte  character  sequence
+           can fail, or
+
+       o   at  least one of the bytes resulting from wide character conversion
+           to a multibyte character sequence cannot be added  to  the  window.
+           See  section  "PORTABILITY"  below regarding the use of waddch with
+           wide characters.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       addch, mvaddch, mvwaddch, and echochar may be implemented as macros.
+
+
+

EXTENSIONS

+
+

TABSIZE

+       SVr4  and  other versions of curses implement the TABSIZE variable, but
+       X/Open Curses does not specify it; see curs_variables(3x).
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       SVr4 curses describes a successful return value  only  as  "an  integer
+       value other than ERR".
+
+       The  defaults specified for forms-drawing characters apply in the POSIX
+       locale.
+
+
+

ACS Symbols

+       X/Open Curses states that the  ACS_  definitions  are  char  constants.
+       Some implementations are problematic.
+
+       o   Solaris  curses, for example, defines the ACS symbols as constants;
+           others define them as elements of an array.
+
+           This implementation uses an array, acs_map,  as  did  SVr4  curses.
+           NetBSD also uses an array, actually named _acs_char, with a #define
+           for compatibility.
+
+       o   HP-UX curses equates some of the  ACS_  symbols  to  the  analogous
+           WACS_  symbols  as  if  the  ACS_ symbols were wide characters (see
+           curs_add_wch(3x)).  The  misdefined  symbols  are  the  arrows  and
+           others that are not used for line drawing.
+
+       o   X/Open  Curses  (Issues  2 through 7) has a typographical error for
+           the ACS_LANTERN symbol, equating  its  "VT100+  Character"  to  "I"
+           (capital  I),  while  the  header  files  for SVr4 curses and other
+           implementations use "i" (small i).
+
+           None of the terminal descriptions on Unix platforms  use  uppercase
+           I,  except  for  Solaris  (in  its  terminfo  entry  for screen(1),
+           apparently based on the X/Open documentation around 1995).  On  the
+           other  hand,  its gs6300 (AT&T PC6300 with EMOTS Terminal Emulator)
+           description uses lowercase i.
+
+       Some ACS  symbols  (ACS_S3,  ACS_S7,  ACS_LEQUAL,  ACS_GEQUAL,  ACS_PI,
+       ACS_NEQUAL,  and  ACS_STERLING)  were  not  documented  in any publicly
+       released System V.  However, many publicly available  terminfo  entries
+       include  acsc  capabilities in which their key characters (pryz{|}) are
+       embedded, and a second-hand list of their  character  descriptions  has
+       come  to light.  The ncurses developers invented ACS-prefixed names for
+       them.
+
+       The displayed values of ACS_ constants depend on
+
+       o   the  ncurses  ABI--for  example,  wide-character  versus  non-wide-
+           character  configurations  (the  former  is  capable  of displaying
+           Unicode while the latter is not), and
+
+       o   whether the locale uses UTF-8 encoding.
+
+       In certain cases, the  terminal  is  unable  to  display  forms-drawing
+       characters   except   by   using  UTF-8;  see  the  discussion  of  the
+       NCURSES_NO_UTF8_ACS environment variable in ncurses(3x).
+
+
+

Character Set

+       X/Open Curses assumes that the parameter passed to  waddch  contains  a
+       single  character.   That  character may have been more than eight bits
+       wide in an SVr3 or SVr4 implementation, but X/Open  Curses  leaves  the
+       width  of  a non-wide character code unspecified.  The standard further
+       does not specify the internal structure of a chtype, though the use  of
+       bit  operations  to  combine  the  character code with attributes and a
+       color pair identifier into a chtype for passage to waddch is common.  A
+       portable application uses only the macros discussed in curs_attr(3x) to
+       manipulate a chtype.
+
+       In ncurses, chtype holds an eight-bit character, but the library allows
+       a  multibyte  character sequence to be passed via a succession of calls
+       to waddch.  Other implementations  do  not;  a  waddch  call  transmits
+       exactly  one  character,  which  may  be rendered in one or more screen
+       locations depending  on  whether  it  is  printable  (see  unctrl(3x)).
+       Depending  on  the  locale,  ncurses  inspects  the byte passed in each
+       waddch call and checks whether the latest call  continues  a  multibyte
+       character.    When  a  character  is  complete,  ncurses  displays  the
+       character  and  advances  the  cursor.   If  the  calling   application
+       interrupts the succession of bytes in a multibyte character sequence by
+       changing the current  location--for  example,  with  wmove(3x)--ncurses
+       discards the incomplete character.
+
+       For  portability  to  other  implementations,  do  not  rely  upon  the
+       foregoing behavior.  Check whether a character can be represented as  a
+       single byte in the current locale.
+
+       o   If it can, call either waddch or wadd_wch.
+
+       o   If it cannot, use only wadd_wch.
+
+
+

HISTORY

+       4BSD (1980) curses introduced waddch.
+
+       SVr3 (1987) added wechochar.
+
+
+

SEE ALSO

+       curs_add_wch(3x)  describes comparable functions of the ncurses library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x),    curs_addchstr(3x),    curs_addstr(3x),    curs_attr(3x),
+       curs_clear(3x),   curs_inch(3x),   curs_outopts(3x),  curs_refresh(3x),
+       curs_variables(3x), putchar(3)
+
+
+
+ncurses 6.5                       2024-09-21                    curs_addch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_addchstr.3x.html b/contrib/ncurses/doc/html/man/curs_addchstr.3x.html new file mode 100644 index 00000000..07c9c457 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_addchstr.3x.html @@ -0,0 +1,138 @@ + + + + + + +curs_addchstr 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_addchstr 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_addchstr(3x)                Library calls               curs_addchstr(3x)
+
+
+
+
+

NAME

+       addchstr,  waddchstr,  mvaddchstr,  mvwaddchstr, addchnstr, waddchnstr,
+       mvaddchnstr, mvwaddchnstr - add a curses character string to a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int addchstr(const chtype * chstr);
+       int waddchstr(WINDOW * win, const chtype * chstr);
+       int mvaddchstr(int y, int x, const chtype * chstr);
+       int mvwaddchstr(WINDOW * win, int y, int x, const chtype * chstr);
+
+       int addchnstr(const chtype * chstr, int n);
+       int waddchnstr(WINDOW * win, const chtype * chstr, int n);
+       int mvaddchnstr(int y, int x, const chtype * chstr, int n);
+       int mvwaddchnstr(WINDOW * win, int y, int x, const chtype * chstr, int n);
+
+
+

DESCRIPTION

+       waddchstr copies the string of curses characters chstr  to  the  window
+       win.   A  null curses character terminates the string.  waddchnstr does
+       the same, but copies at most n characters, or as many as possible if  n
+       is -1.  ncurses(3x) describes the variants of these functions.
+
+       Because  these  functions  do  not call waddch(3x) internally, they are
+       faster than waddstr(3x) and waddnstr(3x).  On the other hand, they
+
+       o   do  not  treat  the  backspace,  carriage  return,  or  line   feed
+           characters specially;
+
+       o   do not represent unprintable characters with unctrl(3x);
+
+       o   do  not  update  the  cursor  position to follow the last character
+           written;
+
+       o   truncate the string at  the  window's  right  margin,  rather  than
+           wrapping it to the next line and potentially scrolling.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL or
+
+       o   chstr is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except waddchnstr may be implemented as macros.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+
+

HISTORY

+       SVr3.1 (1987) introduced waddchstr and waddchnstr.
+
+
+

SEE ALSO

+       curs_add_wchstr(3x)  describes  comparable  functions  of  the  ncurses
+       library in its wide-character configuration (ncursesw).
+
+       curses(3x), curs_addch(3x), curs_addstr(3x)
+
+
+
+ncurses 6.5                       2024-07-27                 curs_addchstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_addstr.3x.html b/contrib/ncurses/doc/html/man/curs_addstr.3x.html new file mode 100644 index 00000000..550d1d7f --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_addstr.3x.html @@ -0,0 +1,133 @@ + + + + + + +curs_addstr 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_addstr 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_addstr(3x)                  Library calls                 curs_addstr(3x)
+
+
+
+
+

NAME

+       addstr,  waddstr,  mvaddstr,  mvwaddstr,  addnstr, waddnstr, mvaddnstr,
+       mvwaddnstr - add a string to a curses window and advance the cursor
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int addstr(const char * str);
+       int waddstr(WINDOW * win, const char * str);
+       int mvaddstr(int y, int x, const char * str);
+       int mvwaddstr(WINDOW * win, int y, int x, const char * str);
+
+       int addnstr(const char * str, int n);
+       int waddnstr(WINDOW * win, const char * str, int n);
+       int mvaddnstr(int y, int x, const char * str, int n);
+       int mvwaddnstr(WINDOW * win, int y, int x, const char * str, int n);
+
+
+

DESCRIPTION

+       waddstr writes the characters of the (null-terminated)  string  str  to
+       the window win, as if by calling waddch(3x) for each char in str.
+
+       waddnstr  is  similar,  but  writes  at most n characters.  If n is -1,
+       waddnstr writes the entire string.
+
+       ncurses(3x) describes the variants of these functions.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL,
+
+       o   str is NULL, or
+
+       o   an internal waddch(3x) call returns ERR.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except waddnstr may be macros.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+
+

HISTORY

+       4BSD (1980) curses introduced waddstr  along  with  its  variants,  the
+       latter defined as macros.
+
+       SVr3.1 (1987) added waddnstr (and its variants) redefining waddstr as a
+       macro wrapping it.
+
+
+

SEE ALSO

+       curs_addwstr(3x) describes comparable functions of the ncurses  library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x), curs_addch(3x), curs_addchstr(3x)
+
+
+
+ncurses 6.5                       2024-07-27                   curs_addstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_addwstr.3x.html b/contrib/ncurses/doc/html/man/curs_addwstr.3x.html new file mode 100644 index 00000000..0254d9e2 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_addwstr.3x.html @@ -0,0 +1,134 @@ + + + + + + +curs_addwstr 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_addwstr 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_addwstr(3x)                 Library calls                curs_addwstr(3x)
+
+
+
+
+

NAME

+       addwstr,   waddwstr,   mvaddwstr,   mvwaddwstr,   addnwstr,  waddnwstr,
+       mvaddnwstr, mvwaddnwstr - add  a  wide-character  string  to  a  curses
+       window and advance the cursor
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int addwstr(const wchar_t * wstr);
+       int waddwstr(WINDOW * win, const wchar_t * wstr);
+       int mvaddwstr(int y, int x, const wchar_t * wstr);
+       int mvwaddwstr(WINDOW * win, int y, int x, const wchar_t * wstr);
+
+       int addnwstr(const wchar_t * wstr, int n);
+       int waddnwstr(WINDOW * win, const wchar_t * wstr, int n);
+       int mvaddnwstr(int y, int x, const wchar_t * wstr, int n);
+       int mvwaddnwstr(WINDOW * win, int y, int x, const wchar_t * wstr, int n);
+
+
+

DESCRIPTION

+       waddwstr  writes  the  characters  of  the (wide-null-terminated) wide-
+       character string wstr to the  window  win,  as  if  by  constructing  a
+       cchar_t  for  each  wchar_t in wstr, then calling wadd_wch(3x) with the
+       resulting cchar_t.  curses processes spacing and non-spacing characters
+       in wstr one at a time.
+
+       waddnwstr  is  similar,  but writes at most n wide characters.  If n is
+       -1, waddnwstr writes the entire wide string.
+
+       ncurses(3x) describes the variants of these functions.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL,
+
+       o   wstr is NULL, or
+
+       o   an internal wadd_wch(3x) call returns ERR.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except waddnwstr may be implemented as macros.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.
+
+
+

HISTORY

+       The System V Interface Definition, Version 4 (1995), specified waddwstr
+       and waddnwstr (and the usual variants).  These were later additions  to
+       SVr4.x, not appearing in the first SVr4 (1989).
+
+
+

SEE ALSO

+       curs_addstr(3x)  describes  comparable functions of the ncurses library
+       in its non-wide-character configuration.
+
+       curses(3x), curs_add_wch(3x), curs_add_wchstr(3x)
+
+
+
+ncurses 6.5                       2024-07-27                  curs_addwstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_attr.3x.html b/contrib/ncurses/doc/html/man/curs_attr.3x.html new file mode 100644 index 00000000..4a302dc3 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_attr.3x.html @@ -0,0 +1,525 @@ + + + + + + +curs_attr 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_attr 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_attr(3x)                    Library calls                   curs_attr(3x)
+
+
+
+
+

NAME

+       attr_get, wattr_get, attr_set, wattr_set, attr_off, wattr_off, attr_on,
+       wattr_on, attroff, wattroff, attron, wattron, attrset, wattrset, chgat,
+       wchgat,  mvchgat, mvwchgat, color_set, wcolor_set, standend, wstandend,
+       standout, wstandout -  manipulate  attributes  of  character  cells  in
+       curses windows
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int attr_get(attr_t *attrs, short *pair, void *opts);
+       int wattr_get(WINDOW *win, attr_t *attrs, short *pair, void *opts);
+       int attr_set(attr_t attrs, short pair, void *opts);
+       int wattr_set(WINDOW *win, attr_t attrs, short pair, void *opts);
+
+       int attr_off(attr_t attrs, void *opts);
+       int wattr_off(WINDOW *win, attr_t attrs, void *opts);
+       int attr_on(attr_t attrs, void *opts);
+       int wattr_on(WINDOW *win, attr_t attrs, void *opts);
+
+       int attroff(int attrs);
+       int wattroff(WINDOW *win, int attrs);
+       int attron(int attrs);
+       int wattron(WINDOW *win, int attrs);
+       int attrset(int attrs);
+       int wattrset(WINDOW *win, int attrs);
+
+       int chgat(int n, attr_t attr, short pair, const void *opts);
+       int wchgat(WINDOW *win,
+             int n, attr_t attr, short pair, const void *opts);
+       int mvchgat(int y, int x,
+             int n, attr_t attr, short pair, const void *opts);
+       int mvwchgat(WINDOW *win, int y, int x,
+             int n, attr_t attr, short pair, const void *opts);
+
+       int color_set(short pair, void* opts);
+       int wcolor_set(WINDOW *win, short pair, void* opts);
+
+       int standend(void);
+       int wstandend(WINDOW *win);
+       int standout(void);
+       int wstandout(WINDOW *win);
+
+
+

DESCRIPTION

+       These  routines  manipulate the current attributes of the named window,
+       which then apply to all characters that are  written  into  the  window
+       with  waddch,  waddstr  and  wprintw.  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.
+
+       These  routines do not affect the attributes used when erasing portions
+       of the window.   See  curs_bkgd(3x)  for  functions  which  modify  the
+       attributes used for erasing and clearing.
+
+
+

Window Attributes

+       There are two sets of functions:
+
+       o   functions   for  manipulating  the  window  attributes  and  color:
+           wattr_set and wattr_get.
+
+       o   functions for manipulating only the window attributes (not  color):
+           wattr_on and wattr_off.
+
+       The  wattr_set function sets the current attributes of the given window
+       to attrs, with color specified by pair.
+
+       Use wattr_get to retrieve attributes for the given window.
+
+       Use attr_on and wattr_on to turn on  window  attributes,  i.e.,  values
+       OR'd  together  in  attr,  without  affecting  other  attributes.   Use
+       attr_off and wattr_off to turn off window attributes, again values OR'd
+       together in attr, without affecting other attributes.
+
+
+

Legacy Window Attributes

+       The  X/Open  window attribute routines which set or get, turn on or off
+       are extensions of older routines which assume that color pairs are OR'd
+       into  the attribute parameter.  These newer routines use similar names,
+       because X/Open simply added an underscore (_) for the newer names.
+
+       The int datatype used in the legacy routines is treated as if it is the
+       same  size  as  chtype  (used by addch(3x)).  It holds the common video
+       attributes (such as bold, reverse), as well as a few  bits  for  color.
+       Those  bits  correspond  to  the  A_COLOR symbol.  The COLOR_PAIR macro
+       provides a value which can be OR'd into the attribute  parameter.   For
+       example,  as  long as that value fits into the A_COLOR mask, then these
+       calls produce similar results:
+
+           attrset(A_BOLD | COLOR_PAIR(pair));
+           attr_set(A_BOLD, pair, NULL);
+
+       However, if the value does not fit, then the COLOR_PAIR macro uses only
+       the  bits  that fit.  For example, because in ncurses A_COLOR has eight
+       (8) bits, then COLOR_PAIR(259) is 4 (i.e., 259 is 4 more than the limit
+       255).
+
+       The  PAIR_NUMBER  macro extracts a pair number from an int (or chtype).
+       For example, the input and output values in these statements  would  be
+       the same:
+
+           int value = A_BOLD | COLOR_PAIR(input);
+           int output = PAIR_NUMBER(value);
+
+       The  attrset routine is a legacy feature predating SVr4 curses but kept
+       in X/Open Curses  for  the  same  reason  that  SVr4  curses  kept  it:
+       compatibility.
+
+       The  remaining  attr*  functions operate exactly like the corresponding
+       attr_* functions, except that they take arguments of  type  int  rather
+       than attr_t.
+
+       There  is  no  corresponding attrget function as such in X/Open Curses,
+       although ncurses provides getattrs (see curs_legacy(3x)).
+
+
+

Change Character Rendition

+       The  routine  chgat  changes  the  attributes  of  a  given  number  of
+       characters  starting at the current cursor location of stdscr.  It does
+       not update the cursor and does not perform wrapping.  A character count
+       of  -1  or  greater  than  the  remaining  window width means to change
+       attributes all the way to the end of  the  current  line.   The  wchgat
+       function  generalizes  this to any window; the mvwchgat function does a
+       cursor move before acting.
+
+       In these functions, the color pair argument is a color pair  index  (as
+       in the first argument of init_pair, see curs_color(3x)).
+
+
+

Change Window Color

+       The routine color_set sets the current color of the given window to the
+       foreground/background  combination  described   by   the   color   pair
+       parameter.
+
+
+

Standout

+       The  routine  standout  is the same as attron(A_STANDOUT).  The routine
+       standend is the same as attrset(A_NORMAL) or attrset(0),  that  is,  it
+       turns off all attributes.
+
+       X/Open Curses does not mark these "restricted", because
+
+       o   they have well established legacy use, and
+
+       o   there  is  no  ambiguity  about  the  way  the  attributes might be
+           combined with a color pair.
+
+
+

Video Attributes

+       The following video attributes, defined in <curses.h>, can be passed to
+       the  routines attron, attroff, and attrset, or OR'd with the characters
+       passed to addch (see curs_addch(3x)).
+
+              Name           Description
+              -----------------------------------------------------------------
+              A_NORMAL       Normal display (no highlight)
+              A_STANDOUT     Best highlighting mode of the terminal
+              A_UNDERLINE    Underlining
+              A_REVERSE      Reverse video
+              A_BLINK        Blinking
+              A_DIM          Half bright
+              A_BOLD         Extra bright or bold
+              A_PROTECT      Protected mode
+              A_INVIS        Invisible or blank mode
+              A_ALTCHARSET   Alternate character set
+              A_ITALIC       Italics (non-X/Open extension)
+              A_CHARTEXT     Bit-mask to extract a character
+              A_COLOR        Bit-mask to extract a color (legacy routines)
+
+       You can thus use A_CHARTEXT to extract the  character  from  a  chtype,
+       A_ATTRIBUTES  to  obtain  its rendering attributes, and A_COLOR to find
+       the color pair it uses.
+
+       These video attributes are supported by attr_on and  related  functions
+       (which also support the attributes recognized by attron, etc.):
+
+              Name            Description
+              -----------------------------------------------------------------
+              WA_HORIZONTAL   Horizontal highlight
+              WA_LEFT         Left highlight
+              WA_LOW          Low highlight
+              WA_RIGHT        Right highlight
+              WA_TOP          Top highlight
+              WA_VERTICAL     Vertical highlight
+
+       The  return  values  of many of these routines are not meaningful (they
+       are implemented as macro-expanded assignments and simply  return  their
+       argument).   The  SVr4 manual page claims (falsely) that these routines
+       always return 1.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if win is NULL.
+
+       wcolor_set returns ERR if pair is outside the range 0..COLOR_PAIRS-1.
+
+       wattr_get does not fail if its attrs or pair parameter is NULL.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       These functions may be macros:
+
+              attroff,  wattroff, attron, wattron, attrset, wattrset, standend
+              and standout.
+
+       Color pair values can only be OR'd with attributes if the  pair  number
+       is less than 256.  The alternate functions such as color_set can pass a
+       color pair value directly.  However, ncurses ABI 4 and 5 simply OR this
+       value  within  the  alternate functions.  You must use ncurses ABI 6 to
+       support more than 256 color pairs.
+
+
+

EXTENSIONS

+       This implementation provides the A_ITALIC attribute for terminals which
+       have   the   enter_italics_mode  (sitm)  and  exit_italics_mode  (ritm)
+       capabilities.  Italics are not mentioned in X/Open Curses.  Unlike  the
+       other  video  attributes,  A_ITALIC  is unrelated to the set_attributes
+       capabilities.   This   implementation   makes   the   assumption   that
+       exit_attribute_mode may also reset italics.
+
+       Each  of  the functions added by XSI Curses has a parameter opts, which
+       X/Open Curses  still  (after  more  than  twenty  years)  documents  as
+       reserved  for  future  use,  saying  that  it  should  be  NULL.   This
+       implementation uses that parameter in ABI 6  for  the  functions  which
+       have a color pair parameter to support extended color pairs:
+
+       o   For functions which modify the color, e.g., wattr_set and wattr_on,
+           if opts is set it is treated as a pointer to int, and used  to  set
+           the color pair instead of the short pair parameter.
+
+       o   For functions which retrieve the color, e.g., wattr_get, if opts is
+           set it is treated as a pointer to int, and  used  to  retrieve  the
+           color  pair  as  an int value, in addition to retrieving it via the
+           standard pointer to short parameter.
+
+       o   For functions which turn attributes off, e.g., wattr_off, the  opts
+           parameter is ignored except except to check that it is NULL.
+
+
+

PORTABILITY

+       These  functions are described in X/Open Curses, Issue 4.  It specifies
+       no error conditions for them.
+
+       The standard defined the dedicated type for highlights,  attr_t,  which
+       was  not defined in SVr4 curses.  The functions taking attr_t arguments
+       were not supported under SVr4.
+
+       Very old versions of this library did not force an update of the screen
+       when  changing  the  attributes.   Use  touchwin to force the screen to
+       match the updated attributes.
+
+       X/Open  Curses  states   that   whether   the   traditional   functions
+       attron/attroff/attrset  can  manipulate  attributes other than A_BLINK,
+       A_BOLD, A_DIM, A_REVERSE, A_STANDOUT, or A_UNDERLINE is  "unspecified".
+       Under  this  implementation  as  well  as  SVr4 curses, these functions
+       correctly manipulate all other highlights (specifically,  A_ALTCHARSET,
+       A_PROTECT, and A_INVIS).
+
+       X/Open Curses added these entry points:
+
+              attr_get,  attr_on,  attr_off,  attr_set,  wattr_on,  wattr_off,
+              wattr_get, wattr_set
+
+       The new functions are intended to work with a new series  of  highlight
+       macros prefixed with WA_.  The older macros have direct counterparts in
+       the newer set of names:
+
+              Name            Description
+              -----------------------------------------------------------------
+              WA_NORMAL       Normal display (no highlight)
+              WA_STANDOUT     Best highlighting mode of the terminal
+              WA_UNDERLINE    Underlining
+              WA_REVERSE      Reverse video
+              WA_BLINK        Blinking
+              WA_DIM          Half bright
+              WA_BOLD         Extra bright or bold
+
+              WA_ALTCHARSET   Alternate character set
+
+       X/Open Curses does not assign values to  these  symbols,  nor  does  it
+       state  whether or not they are related to the similarly-named A_NORMAL,
+       etc.:
+
+       o   X/Open Curses specifies that each  pair  of  corresponding  A_  and
+           WA_-using   functions   operates   on  the  same  current-highlight
+           information.
+
+       o   However, in some  implementations,  those  symbols  have  unrelated
+           values.
+
+           For example, the Solaris xpg4 (X/Open) curses declares attr_t to be
+           an unsigned short integer (16-bits), while  chtype  is  a  unsigned
+           integer (32-bits).  The WA_ symbols in this case are different from
+           the A_ symbols because they are used for a smaller  datatype  which
+           does not represent A_CHARTEXT or A_COLOR.
+
+           In this implementation (as in many others), the values happen to be
+           the same because it simplifies copying information  between  chtype
+           and cchar_t variables.
+
+       o   Because  ncurses's  attr_t  can  hold  a color pair (in the A_COLOR
+           field), a call to wattr_on, wattr_off, or wattr_set may  alter  the
+           window's  color.   If  the  color pair information in the attribute
+           parameter is zero, no change is made to the window's color.
+
+           This is consistent with SVr4 curses; X/Open Curses does not specify
+           this.
+
+       The  X/Open  Curses  extended  conformance  level  adds  new highlights
+       A_HORIZONTAL,  A_LEFT,   A_LOW,   A_RIGHT,   A_TOP,   A_VERTICAL   (and
+       corresponding  WA_  macros  for  each).   As  of  August 2013, no known
+       terminal provides these highlights (i.e., via the sgr1 capability).
+
+
+

HISTORY

+       X/Open Curses is largely based  on  SVr4  curses,  adding  support  for
+       "wide-characters"  (not  specific  to  Unicode).   Some  of  the X/Open
+       differences from SVr4 curses address the way video  attributes  can  be
+       applied  to wide-characters.  But aside from that, attrset and attr_set
+       are similar.  SVr4 curses provided the basic features for  manipulating
+       video  attributes.  However, earlier versions of curses provided a part
+       of these features.
+
+       As seen in 2.8BSD, curses assumed 7-bit characters,  using  the  eighth
+       bit  of  a byte to represent the standout feature (often implemented as
+       bold and/or reverse video).  The BSD curses library provided  functions
+       standout  and  standend which were carried along into X/Open Curses due
+       to their pervasive use in legacy applications.
+
+       Some  terminals  in  the  1980s  could  support  a  variety  of   video
+       attributes,  although  the  BSD  curses  library  could do nothing with
+       those.  System V  (1983)  provided  an  improved  curses  library.   It
+       defined  the A_ symbols for use by applications to manipulate the other
+       attributes.  There are few useful references for the chronology.
+
+       Goodheart's book UNIX Curses Explained (1991)  describes  SVr3  (1987),
+       commenting on several functions:
+
+       o   the  attron,  attroff, attrset functions (and most of the functions
+           found in SVr4 but not in BSD curses) were introduced by System V,
+
+       o   the alternate character set feature with A_ALTCHARSET was added  in
+           SVr2 and improved in SVr3 (by adding acs_map[]),
+
+       o   start_color  and  related color-functions were introduced by System
+           V.3.2,
+
+       o   pads, soft-keys were added in SVr3, and
+
+       Goodheart did not mention the background character or the cchar_t type.
+       Those  are respectively SVr3.1 and X/Open features.  He did mention the
+       A_ constants, but did not indicate their values.  Those  were  not  the
+       same in different systems, even for those marked as System V.
+
+       Different  Unix  systems  used  different  sizes  for the bit-fields in
+       chtype for characters and colors, and took into account  the  different
+       integer sizes (32-bit versus 64-bit).
+
+       This  table  showing  the number of bits for A_COLOR and A_CHARTEXT was
+       gleaned from the curses header files for various operating systems  and
+       architectures.   The inferred architecture and notes reflect the format
+       and size of the  defined  constants  as  well  as  clues  such  as  the
+       alternate  character  set implementation.  A 32-bit library can be used
+       on a 64-bit system, but not necessarily the reverse.
+
+                                     Bits
+       Year  System        Arch   Color  Char  Notes
+       ------------------------------------------------------------------------
+       1992  Solaris 5.2   32     6      17    SVr4 curses
+       1992  HP-UX 9       32     no     8     SVr2 curses
+       1992  AIX 3.2       32     no     23    SVr2 curses
+       1994  OSF/1 r3      32     no     23    SVr2 curses
+       1995  HP-UX 10.00   32     6      16    SVr3 curses_colr
+       1995  HP-UX 10.00   32     6      8     SVr4, X/Open curses
+       1995  Solaris 5.4   32/64  7      16    X/Open curses
+       1996  AIX 4.2       32     7      16    X/Open curses
+       1996  OSF/1 r4      32     6      16    X/Open curses
+       1997  HP-UX 11.00   32     6      8     X/Open curses
+       2000  U/Win         32/64  7/31   16    uses chtype
+
+       Notes:
+
+          Regarding HP-UX,
+
+          o   HP-UX 10.20 (1996) added support for 64-bit  PA-RISC  processors
+              in 1996.
+
+          o   HP-UX  10.30 (1997) marked "curses_colr" obsolete.  That version
+              of curses was dropped with HP-UX 11.30 in 2006.
+
+          Regarding OSF/1 (and Tru64),
+
+          o   These used 64-bit hardware.   Like  ncurses,  the  OSF/1  curses
+              interface is not customized for 32-bit and 64-bit versions.
+
+          o   Unlike  other  systems  which  evolved  from  AT&T  code,  OSF/1
+              provided a new implementation for X/Open Curses.
+
+          Regarding Solaris,
+
+          o   The initial release of Solaris was in 1992.
+
+          o   The xpg4 (X/Open) Curses was developed by MKS from 1990 to 1995.
+              Sun's copyright began in 1996.
+
+          o   Sun updated the X/Open Curses interface after 64-bit support was
+              introduced  in  1997,  but  did  not  modify  the  SVr4   curses
+              interface.
+
+          Regarding U/Win,
+
+          o   Development  of  the  curses  library  began in 1991, stopped in
+              2000.
+
+          o   Color support was added in 1998.
+
+          o   The library uses only chtype (no cchar_t).
+
+       Once X/Open Curses was adopted in the mid-1990s, the  constraint  of  a
+       32-bit interface with many colors and wide-characters for chtype became
+       a moot point.  The cchar_t structure (whose size and  members  are  not
+       specified in X/Open Curses) could be extended as needed.
+
+       Other interfaces are rarely used now:
+
+       o   BSD  curses was improved slightly in 1993/1994 using Keith Bostic's
+           modification to make the library 8-bit clean for nvi(1).  He  moved
+           standout attribute to a structure member.
+
+           The  resulting  4.4BSD curses was replaced by ncurses over the next
+           ten years.
+
+       o   U/Win is rarely used now.
+
+
+

SEE ALSO

+       curses(3x),     curs_addch(3x),     curs_addstr(3x),     curs_bkgd(3x),
+       curs_printw(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-21                     curs_attr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_beep.3x.html b/contrib/ncurses/doc/html/man/curs_beep.3x.html new file mode 100644 index 00000000..a75d5d4b --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_beep.3x.html @@ -0,0 +1,116 @@ + + + + + + +curs_beep 3x 2024-07-20 ncurses 6.5 Library calls + + + + +

curs_beep 3x 2024-07-20 ncurses 6.5 Library calls

+
+curs_beep(3x)                    Library calls                   curs_beep(3x)
+
+
+
+
+

NAME

+       beep, flash - ring the (visual) bell of the terminal with curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int beep(void);
+       int flash(void);
+
+
+

DESCRIPTION

+       beep  and  flash  alert  the  terminal user: the former by sounding the
+       terminal's  audible  alarm,  and  the  latter  by  visibly   attracting
+       attention.    Commonly,   a   terminal  implements  a  visual  bell  by
+       momentarily reversing the character foreground and background colors on
+       the  entire  display;  even  a  monochrome  device  can do this.  These
+       functions each attempt the other alert type if  the  one  requested  is
+       unavailable.   If  neither  is  available,  curses  performs no action.
+       Nearly all terminals have an audible alert mechanism such as a bell  or
+       piezoelectric buzzer, but only some can flash the screen.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In  ncurses, beep and flash return OK if the terminal type supports the
+       corresponding capability: bell (bel) for beep and flash_screen  (flash)
+       for flash.  Otherwise they return ERR.
+
+
+

EXTENSIONS

+       In ncurses, these functions can return ERR.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       On SVr4 curses, they always return OK, and X/Open Curses specifies them
+       as doing so.
+
+
+

HISTORY

+       beep and flash appeared in SVr2 (1984).
+
+
+

SEE ALSO

+       curses(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-07-20                     curs_beep(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_bkgd.3x.html b/contrib/ncurses/doc/html/man/curs_bkgd.3x.html new file mode 100644 index 00000000..725c0a78 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_bkgd.3x.html @@ -0,0 +1,217 @@ + + + + + + +curs_bkgd 3x 2024-09-22 ncurses 6.5 Library calls + + + + +

curs_bkgd 3x 2024-09-22 ncurses 6.5 Library calls

+
+curs_bkgd(3x)                    Library calls                   curs_bkgd(3x)
+
+
+
+
+

NAME

+       bkgdset,  wbkgdset,  bkgd,  wbkgd, getbkgd - manipulate background of a
+       curses window of characters
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int bkgd(chtype ch);
+       int wbkgd(WINDOW *win, chtype ch);
+
+       void bkgdset(chtype ch);
+       void wbkgdset(WINDOW *win, chtype ch);
+
+       chtype getbkgd(WINDOW *win);
+
+
+

DESCRIPTION

+       Every curses window has a background property.  In the  library's  non-
+       wide  configuration,  this property is a chtype which combines a set of
+       attributes with the  background  character  (see  curs_attr(3x)).   The
+       background character is a spacing character.
+
+       When  erasing  parts  of  the  screen,  curses fills the cells with the
+       background character.  curses also  uses  the  window  background  when
+       writing characters to the screen:
+
+       o   The attribute part of the background is combined with all non-blank
+           characters that are written into the window, as with the waddch(3x)
+           and winsch(3x) families of functions.
+
+       o   Both  the  character  and  attribute  parts  of  the background are
+           combined with blank characters that are written into the window.
+
+       The background becomes a property of the character and  moves  with  it
+       through any scrolling and insert/delete line/character operations.
+
+       To  the  extent possible on a given terminal, the attribute part of the
+       background is displayed as the graphic rendition of the  character  put
+       on the screen.
+
+
+

bkgd, wbkgd

+       bkgd  and  wbkgd set the background property of stdscr or the specified
+       window and then apply this setting to  every  character  cell  in  that
+       window.
+
+       o   The  rendition  of every character in the window changes to the new
+           background rendition.
+
+       o   Wherever the former background character appears, it changes to the
+           new background character.
+
+       ncurses  updates  the rendition of each character cell by comparing the
+       character, non-color attributes, and colors.  The  library  applies  to
+       following  procedure  to  each cell in the window, whether or not it is
+       blank.
+
+       o   ncurses first compares  the  cell's  character  to  the  previously
+           specified  background  character; if they match, ncurses writes the
+           new background character to the cell.
+
+       o   ncurses then checks if the cell uses color, that is, its color pair
+           value  is  nonzero.   If not, it simply replaces the attributes and
+           color  pair  in  the  cell  with  those  from  the  new  background
+           character.
+
+       o   If  the  cell  uses color, and its background color matches that of
+           the current window background, ncurses removes attributes that  may
+           have  come  from the current background and adds those from the new
+           background.  It finishes by setting the cell's  background  to  use
+           the new window background color.
+
+       o   If  the  cell  uses  color, and its background color does not match
+           that of the current window background,  ncurses  updates  only  the
+           non-color  attributes, first removing those that may have come from
+           the current background, and then adding  attributes  from  the  new
+           background.
+
+       If the new background's character is nonspacing, ncurses reuses the old
+       background character, except for one special  case:  ncurses  treats  a
+       background character value of zero (0) as a space.
+
+       If  the  terminal  does  not  support  color,  or if color has not been
+       initialized with start_color(3x), ncurses ignores  the  new  background
+       character's color attribute.
+
+
+

bkgdset, wbkgdset

+       bkgdset  and  wbkgdset  manipulate  the  background  of  the applicable
+       window, without updating the character cells as bkgd and wbkgd do; only
+       future writes reflect the updated background.
+
+
+

getbkgd

+       getbkgd  obtains  the given window's background character and attribute
+       combination.
+
+
+

RETURN VALUE

+       Functions returning an int return OK on success.  bkgd returns  ERR  if
+       the  library has not been initialized.  wbkgd and getbkgd return ERR if
+       a WINDOW pointer argument is null.
+
+       bkgdset and wbkgdset do not return a value.
+
+       getbkgd  returns  a  window's  background   character   and   attribute
+       combination.
+
+
+

NOTES

+       Unusually,  there is no wgetbkgd function; getbkgd behaves as one would
+       expect wgetbkgd to, accepting a WINDOW pointer argument.
+
+       bkgd and bkgdset may be implemented as macros.
+
+       X/Open Curses mentions that the character part of the  background  must
+       be  a  single-byte  value.  ncurses, like SVr4 curses, checks to ensure
+       that, and will reuse the old background character if the check fails.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.   It  specifies  that
+       bkgd,  wbkgd,  and  getbkgd  return  ERR on failure (in the case of the
+       last,  this  value  is  cast  to  chtype),  but  describes  no  failure
+       conditions.
+
+       The  SVr4.0  manual  says  that bkgd and wbkgd may return OK "or a non-
+       negative integer if immedok is set", which refers to the  return  value
+       from  wrefresh(3x),  used  to implement the immediate repainting.  SVr4
+       curses's wrefresh returns the  number  of  characters  written  to  the
+       screen during the refresh.  ncurses does not do that.
+
+       Neither  X/Open  Curses  nor  the  SVr4  manual  pages  detail  how the
+       rendition of characters on  the  screen  updates  when  bkgd  or  wbkgd
+       changes  the background character.  ncurses, like SVr4 curses, does not
+       (in  its  non-wide  configuration)  store  the  background  and  window
+       attribute contributions to each character cell separately.
+
+
+

SEE ALSO

+       curs_bkgrnd(3x)  describes  the  corresponding  functions  in  the wide
+       configuration of ncurses.
+
+       curses(3x), curs_addch(3x), curs_attr(3x)
+
+
+
+ncurses 6.5                       2024-09-22                     curs_bkgd(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_bkgrnd.3x.html b/contrib/ncurses/doc/html/man/curs_bkgrnd.3x.html new file mode 100644 index 00000000..8214dfed --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_bkgrnd.3x.html @@ -0,0 +1,205 @@ + + + + + + +curs_bkgrnd 3x 2024-09-22 ncurses 6.5 Library calls + + + + +

curs_bkgrnd 3x 2024-09-22 ncurses 6.5 Library calls

+
+curs_bkgrnd(3x)                  Library calls                 curs_bkgrnd(3x)
+
+
+
+
+

NAME

+       bkgrnd,   wbkgrnd,   bkgrndset,  wbkgrndset,  getbkgrnd,  wgetbkgrnd  -
+       manipulate background of a curses window of wide characters
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int bkgrnd(const cchar_t *wch);
+       int wbkgrnd(WINDOW *win, const cchar_t *wch);
+
+       void bkgrndset(const cchar_t *wch);
+       void wbkgrndset(WINDOW *win, const cchar_t *wch);
+
+       int getbkgrnd(cchar_t *wch);
+       int wgetbkgrnd(WINDOW *win, cchar_t *wch);
+
+
+

DESCRIPTION

+       Every curses window has a background property.  In the  library's  wide
+       configuration,  this  property  is  a  cchar_t  which combines a set of
+       attributes  with  the  background  character  (see  curs_attr(3x))  The
+       background character is a spacing character.
+
+       When  erasing  parts  of  the  screen,  curses fills the cells with the
+       background character.  curses also  uses  the  window  background  when
+       writing characters to the screen:
+
+       o   The attribute part of the background is combined with all non-blank
+           characters  that  are  written  into  the  window,  as   with   the
+           wadd_wch(3x) and wins_wch(3x) families of functions.
+
+       o   Both  the  character  and  attribute  parts  of  the background are
+           combined with blank characters that are written into the window.
+
+       The background becomes a property of the character and  moves  with  it
+       through any scrolling and insert/delete line/character operations.
+
+       To  the  extent possible on a given terminal, the attribute part of the
+       background is displayed as the graphic rendition of the  character  put
+       on the screen.
+
+
+

bkgrnd, wbkgrnd

+       bkgrnd  and  wbkgrnd  set  the  background  property  of  stdscr or the
+       specified window and then apply this setting to every character cell in
+       that window.
+
+       o   The  rendition  of every character in the window changes to the new
+           background rendition.
+
+       o   Wherever the former background character appears, it changes to the
+           new background character.
+
+       ncurses  updates  the rendition of each character cell by comparing the
+       character, non-color attributes, and colors.  The  library  applies  to
+       following  procedure  to  each cell in the window, whether or not it is
+       blank.
+
+       o   ncurses first compares  the  cell's  character  to  the  previously
+           specified  background  character; if they match, ncurses writes the
+           new background character to the cell.
+
+       o   ncurses then checks if the cell uses color, that is, its color pair
+           value  is  nonzero.   If not, it simply replaces the attributes and
+           color  pair  in  the  cell  with  those  from  the  new  background
+           character.
+
+       o   If  the  cell  uses color, and its background color matches that of
+           the current window background, ncurses removes attributes that  may
+           have  come  from the current background and adds those from the new
+           background.  It finishes by setting the cell's  background  to  use
+           the new window background color.
+
+       o   If  the  cell  uses  color, and its background color does not match
+           that of the current window background,  ncurses  updates  only  the
+           non-color  attributes, first removing those that may have come from
+           the current background, and then adding  attributes  from  the  new
+           background.
+
+       If the new background's character is nonspacing, ncurses reuses the old
+       background character, except for one special  case:  ncurses  treats  a
+       background character value of zero (0) as a space.
+
+       If  the  terminal  does  not  support  color,  or if color has not been
+       initialized with start_color(3x), ncurses ignores  the  new  background
+       character's color attribute.
+
+
+

bkgrndset, wbkgrndset

+       bkgrndset  and  wbkgrndset  manipulate the background of the applicable
+       window, without updating the character cells as bkgrnd and wbkgrnd  do;
+       only future writes reflect the updated background.
+
+
+

getbkgrnd, wgetbkgrnd

+       The  getbkgrnd and wgetbkgrnd functions obtain the background character
+       and attribute pair of stdscr or the specified window and store  it  via
+       the wch pointer.
+
+
+

RETURN VALUE

+       bkgrndset and wbkgrndset do not return a value.
+
+       The  other  functions  return ERR upon failure and OK upon success.  In
+       ncurses, failure occurs if
+
+       o   a WINDOW pointer win is null, or
+
+       o   a cchar_t pointer wch is null.
+
+
+

NOTES

+       bkgrnd, bkgrndset, and getbkgrnd may be implemented as macros.
+
+       Unlike their counterparts in the  non-wide  configuration  of  ncurses,
+       getbkgrnd  and wgetbkgrnd supply the background character and attribute
+       in a modifiable cchar_t parameter, not as the return value.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       X/Open Curses does not provide details of how the rendition is updated.
+       This implementation follows the approach used in SVr4 curses.
+
+
+

SEE ALSO

+       curs_bkgd(3x) describes the corresponding  functions  in  the  non-wide
+       configuration of ncurses.
+
+       curses(3x), curs_add_wch(3x), curs_attr(3x)
+
+
+
+ncurses 6.5                       2024-09-22                   curs_bkgrnd(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_border.3x.html b/contrib/ncurses/doc/html/man/curs_border.3x.html new file mode 100644 index 00000000..53dc4d8e --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_border.3x.html @@ -0,0 +1,158 @@ + + + + + + +curs_border 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_border 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_border(3x)                  Library calls                 curs_border(3x)
+
+
+
+
+

NAME

+       border,  wborder, box, hline, whline, vline, wvline, mvhline, mvwhline,
+       mvvline, mvwvline - draw borders  and  lines  in  a  curses  window  of
+       characters
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int border(chtype ls, chtype rs, chtype ts, chtype bs,
+                  chtype tl, chtype tr, chtype bl, chtype br);
+       int wborder(WINDOW *win, chtype ls, chtype rs,
+                   chtype ts, chtype bs, chtype tl, chtype tr,
+                   chtype bl, chtype br);
+
+       int box(WINDOW *win, chtype verch, chtype horch);
+
+       int hline(chtype ch, int n);
+       int whline(WINDOW *win, chtype ch, int n);
+       int vline(chtype ch, int n);
+       int wvline(WINDOW *win, chtype ch, int n);
+
+       int mvhline(int y, int x, chtype ch, int n);
+       int mvwhline(WINDOW *win, int y, int x, chtype ch, int n);
+       int mvvline(int y, int x, chtype ch, int n);
+       int mvwvline(WINDOW *win, int y, int x, chtype ch, int n);
+
+
+

DESCRIPTION

+       The  border,  wborder and box routines draw a box around the edges of a
+       window.  Other than the window,  each  argument  is  a  character  with
+       attributes:
+
+              ls - left side,
+              rs - right side,
+              ts - top side,
+              bs - bottom side,
+              tl - top left-hand corner,
+              tr - top right-hand corner,
+              bl - bottom left-hand corner, and
+              br - bottom right-hand corner.
+
+       If  any  of  these  arguments  is  zero, then the corresponding default
+       values (defined in curses.h) are used instead:
+
+              ACS_VLINE,
+              ACS_VLINE,
+              ACS_HLINE,
+              ACS_HLINE,
+              ACS_ULCORNER,
+              ACS_URCORNER,
+              ACS_LLCORNER,
+              ACS_LRCORNER.
+
+       box(win,  verch,  horch)  is  a  shorthand  for  the  following   call:
+       wborder(win, verch, verch, horch, horch, 0, 0, 0, 0).
+
+       The  hline  and whline functions draw a horizontal (left to right) line
+       using ch starting at the current cursor position in  the  window.   The
+       current  cursor  position  is  not  changed.   The  line  is  at most n
+       characters long, or as many as fit into the window.
+
+       The vline and wvline functions draw a vertical  (top  to  bottom)  line
+       using  ch  starting  at the current cursor position in the window.  The
+       current cursor position  is  not  changed.   The  line  is  at  most  n
+       characters long, or as many as fit into the window.
+
+
+

RETURN VALUE

+       All  routines return the integer OK.  The SVr4.0 manual says "or a non-
+       negative integer if immedok is set", but this appears to be an error.
+
+       This implementation returns ERR if the window pointer is null.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       The  borders  generated  by these functions are inside borders (this is
+       also true of SVr4 curses, though the fact is not documented).
+
+       Note that border and box may be macros.
+
+
+

PORTABILITY

+       These functions are described in X/Open Curses, Issue 4.  It  specifies
+       no error conditions for them.
+
+
+

SEE ALSO

+       curses(3x), curs_outopts(3x)
+
+
+
+ncurses 6.5                       2024-07-27                   curs_border(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_border_set.3x.html b/contrib/ncurses/doc/html/man/curs_border_set.3x.html new file mode 100644 index 00000000..9b7fb55d --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_border_set.3x.html @@ -0,0 +1,181 @@ + + + + + + +curs_border_set 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_border_set 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_border_set(3x)              Library calls             curs_border_set(3x)
+
+
+
+
+

NAME

+       border_set,  wborder_set,  box_set, hline_set, whline_set, mvhline_set,
+       mvwhline_set, vline_set, wvline_set, mvvline_set, mvwvline_set  -  draw
+       borders and lines in a curses window of wide characters
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int border_set(
+          const cchar_t *ls, const cchar_t *rs,
+          const cchar_t *ts, const cchar_t *bs,
+          const cchar_t *tl, const cchar_t *tr,
+          const cchar_t *bl, const cchar_t *br);
+       int wborder_set(
+          WINDOW *win,
+          const cchar_t *ls, const cchar_t *rs,
+          const cchar_t *ts, const cchar_t *bs,
+          const cchar_t *tl, const cchar_t *tr,
+          const cchar_t *bl, const cchar_t *br);
+       int box_set(
+          WINDOW *win,
+          const cchar_t *verch,
+          const cchar_t *horch);
+       int hline_set(
+          const cchar_t *wch, int n);
+       int whline_set(
+          WINDOW *win,
+          const cchar_t *wch, int n);
+       int mvhline_set(
+          int y, int x,
+          const cchar_t *wch, int n);
+       int mvwhline_set(
+          WINDOW *win,
+          int y, int x,
+          const cchar_t *wch, int n);
+       int vline_set(
+          const cchar_t *wch, int n);
+       int wvline_set(
+          WINDOW *win,
+          const cchar_t *wch, int n);
+       int mvvline_set(
+          int y, int x,
+          const cchar_t *wch, int n);
+       int mvwvline_set(
+          WINDOW *win,
+          int y, int x,
+          const cchar_t *wch, int n);
+
+
+

DESCRIPTION

+       The border_set and wborder_set functions draw a border around the edges
+       of the current or specified window.  These functions do not change  the
+       cursor position, and do not wrap.
+
+       Other  than  the  window,  each  argument  is  a complex character with
+       attributes:
+              ls - left side,
+              rs - right side,
+              ts - top side,
+              bs - bottom side,
+              tl - top left-hand corner,
+              tr - top right-hand corner,
+              bl - bottom left-hand corner, and
+              br - bottom right-hand corner.
+
+       If any of these arguments  is  zero,  then  the  corresponding  default
+       values (defined in curses.h) are used instead:
+              WACS_VLINE,
+              WACS_VLINE,
+              WACS_HLINE,
+              WACS_HLINE,
+              WACS_ULCORNER,
+              WACS_URCORNER,
+              WACS_LLCORNER, and
+              WACS_LRCORNER.
+
+       box_set(win, verch, horch); is a shorthand for the following call:
+
+       wborder_set(win, verch, verch,
+           horch, horch, NULL, NULL, NULL, NULL);
+
+       The  *line_set functions use wch to draw a line starting at the current
+       cursor position in the window.  The line is at most n  characters  long
+       or  as many as fit into the window.  The current cursor position is not
+       changed.
+
+       The hline_set, mvhline_set, mvwhline_set, and whline_set functions draw
+       a line proceeding toward the last column of the same line.
+
+       The vline_set, mvvline_set, mvwvline_set, and wvline_set functions draw
+       a line proceeding toward the last line of the window.
+
+
+

RETURN VALUE

+       Upon successful completion, these functions return OK.  Otherwise, they
+       return ERR.
+
+       Functions using a window parameter return ERR if it is null.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       Note   that   border_set,    hline_set,    mvhline_set,    mvvline_set,
+       mvwhline_set, mvwvline_set, and vline_set may be macros.
+
+
+

PORTABILITY

+       These functions are described in X/Open Curses, Issue 4.
+
+
+

SEE ALSO

+       curses(3x), curs_add_wch(3x), curs_border(3x), curs_outopts(3x)
+
+
+
+ncurses 6.5                       2024-05-25               curs_border_set(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_clear.3x.html b/contrib/ncurses/doc/html/man/curs_clear.3x.html new file mode 100644 index 00000000..6b5874e7 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_clear.3x.html @@ -0,0 +1,161 @@ + + + + + + +curs_clear 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_clear 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_clear(3x)                   Library calls                  curs_clear(3x)
+
+
+
+
+

NAME

+       erase,  werase, clear, wclear, clrtobot, wclrtobot, clrtoeol, wclrtoeol
+       - clear all or part of a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int erase(void);
+       int werase(WINDOW *win);
+
+       int clear(void);
+       int wclear(WINDOW *win);
+
+       int clrtobot(void);
+       int wclrtobot(WINDOW *win);
+
+       int clrtoeol(void);
+       int wclrtoeol(WINDOW *win);
+
+
+

DESCRIPTION

+
+

erase, werase

+       The erase and werase routines copy blanks  to  every  position  in  the
+       window, clearing the screen.
+
+       Blanks created by erasure have the current background rendition (as set
+       by wbkgdset(3x)) merged into them.
+
+
+

clear, wclear

+       The clear and wclear routines are like erase and werase, but they  also
+       call  clearok(3x), so that the screen is cleared completely on the next
+       call to wrefresh for that window and repainted from scratch.
+
+
+

clrtobot, wclrtobot

+       The clrtobot and wclrtobot 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.
+
+
+

clrtoeol, wclrtoeol

+       The clrtoeol and wclrtoeol routines erase the current line to the right
+       of the cursor, inclusive, to the end of the current line.
+
+
+

RETURN VALUE

+       All routines return the integer OK on success and ERR on failure.
+
+       X/Open defines no error conditions.  In this implementation,
+
+       o   functions using a window pointer parameter return ERR if it is null
+
+       o   wclrtoeol returns an error if the cursor position is about to wrap.
+
+
+

NOTES

+       Note that erase, werase, clear, wclear, clrtobot, and clrtoeol  may  be
+       macros.
+
+
+

PORTABILITY

+       These functions are described in X/Open Curses, Issue 4.
+
+       The  SVr4.0  manual  says  that these functions could return "or a non-
+       negative integer if immedok is set", referring to the  return-value  of
+       wrefresh.  In that implementation, wrefresh would return a count of the
+       number of characters written to the terminal.
+
+       Some historic curses implementations had, as an  undocumented  feature,
+       the  ability  to  do  the  equivalent  of  clearok(...,  1)  by  saying
+       touchwin(stdscr) or clear(stdscr).  This will not work under ncurses.
+
+       This implementation, and others  such  as  Solaris,  sets  the  current
+       position  to 0,0 after erasing via werase and wclear.  That fact is not
+       documented  in  other  implementations,  and  may  not   be   true   of
+       implementations which were not derived from SVr4 source.
+
+       Not obvious from the description, most implementations clear the screen
+       after wclear even for a subwindow or derived window.   If  you  do  not
+       want to clear the screen during the next wrefresh, use werase instead.
+
+
+

SEE ALSO

+       curses(3x), curs_outopts(3x), curs_refresh(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-05-25                    curs_clear(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_color.3x.html b/contrib/ncurses/doc/html/man/curs_color.3x.html new file mode 100644 index 00000000..4a0f5872 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_color.3x.html @@ -0,0 +1,588 @@ + + + + + + +curs_color 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_color 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_color(3x)                   Library calls                  curs_color(3x)
+
+
+
+
+

NAME

+       start_color,   has_colors,   can_change_color,  init_pair,  init_color,
+       init_extended_pair, init_extended_color,  color_content,  pair_content,
+       extended_color_content,    extended_pair_content,    reset_color_pairs,
+       COLOR_PAIR, PAIR_NUMBER, COLORS, COLOR_PAIRS,  COLOR_BLACK,  COLOR_RED,
+       COLOR_GREEN,   COLOR_YELLOW,   COLOR_BLUE,  COLOR_MAGENTA,  COLOR_CYAN,
+       COLOR_WHITE - manipulate terminal colors with curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       /* variables */
+       int COLOR_PAIRS;
+       int COLORS;
+
+       int start_color(void);
+
+       bool has_colors(void);
+       bool can_change_color(void);
+
+       int init_pair(short pair, short f, short b);
+       int init_color(short color, short r, short g, short b);
+       /* extensions */
+       int init_extended_pair(int pair, int f, int b);
+       int init_extended_color(int color, int r, int g, int b);
+
+       int color_content(short color, short *r, short *g, short *b);
+       int pair_content(short pair, short *f, short *b);
+       /* extensions */
+       int extended_color_content(int color, int *r, int *g, int *b);
+       int extended_pair_content(int pair, int *f, int *b);
+
+       /* extension */
+       void reset_color_pairs(void);
+
+       int COLOR_PAIR(int n);
+       PAIR_NUMBER(int attr);
+
+
+

DESCRIPTION

+
+

Overview

+       curses supports color attributes on  terminals  with  that  capability.
+       Call  start_color  (typically  right  after initscr(3x)) to enable this
+       feature.  Colors are always used in pairs.   A  color  pair  couples  a
+       foreground  color  for characters with a background color for the blank
+       field on which characters are rendered.  init_pair initializes a  color
+       pair.   The  macro  COLOR_PAIR(n)  can then convert the pair to a video
+       attribute.
+
+       If  a  terminal  has  the  relevant  capability,   init_color   permits
+       (re)definition of a color.  has_colors and can_change_color return TRUE
+       or FALSE, depending on whether the terminal has  color  capability  and
+       whether  the  programmer  can change the colors.  color_content permits
+       extraction of the red, green, and blue  components  of  an  initialized
+       color.   pair_content  permits  discovery  of  a  color  pair's current
+       definition.
+
+
+

Rendering

+       curses combines the following data to render a character cell.  Any  of
+       them can include color information.
+
+       o   curses character attributes, as from waddch(3x) or wadd_wch(3x)
+
+       o   window attributes, as from wattrset(3x) or wattr_set(3x)
+
+       o   window  background  character  attributes,  as from wbkgdset(3x) or
+           wbkgrndset(3x)
+
+       Per-character and window attributes are usually set through a  function
+       parameter  containing  attributes  including  a color pair value.  Some
+       functions,  such  as  wattr_set,  use  a  separate  color  pair  number
+       parameter.
+
+       The  background  character  is  a special case: it includes a character
+       code, just as if it were passed to waddch.
+
+       The curses library does the actual work of combining these color  pairs
+       in an internal function called from waddch:
+
+       o   If the parameter passed to waddch is blank, and it uses the special
+           color pair 0,
+
+           o   curses next checks the window attribute.
+
+           o   If the window attribute does not use color pair 0, curses  uses
+               the color pair from the window attribute.
+
+           o   Otherwise, curses uses the background character.
+
+       o   If  the parameter passed to waddch is not blank, or it does not use
+           the special color pair 0, curses prefers the color  pair  from  the
+           parameter,  if  it  is  nonzero.   Otherwise,  it  tries the window
+           attribute next, and finally the background character.
+
+       Some curses functions such  as  wprintw  call  waddch.   Those  do  not
+       combine  its parameter with a color pair.  Consequently those calls use
+       only the window attribute or the background character.
+
+
+

CONSTANTS

+       In <curses.h> the following macros are defined.  These are the standard
+       colors (ISO-6429).  curses also assumes that COLOR_BLACK is the default
+       background color for all terminals.
+
+             COLOR_BLACK
+             COLOR_RED
+             COLOR_GREEN
+             COLOR_YELLOW
+             COLOR_BLUE
+             COLOR_MAGENTA
+             COLOR_CYAN
+             COLOR_WHITE
+
+       Some terminals support more than the eight (8)  "ANSI"  colors.   There
+       are no standard names for those additional colors.
+
+
+

VARIABLES

+
+

COLORS

+       is  initialized  by  start_color  to  the  maximum number of colors the
+       terminal can support.
+
+
+

COLOR_PAIRS

+       is initialized by start_color to the maximum number of color pairs  the
+       terminal can support.  Often, its value is the product COLORS x COLORS,
+       but this is not always true.
+
+       o   A few terminals use the HLS color space  (see  start_color  below),
+           ignoring this rule; and
+
+       o   terminals  supporting  a  large number of colors are limited to the
+           number of color pairs that a signed short value can represent.
+
+
+

FUNCTIONS

+
+

start_color

+       The start_color 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 initscr.  start_color does this:
+
+       o   It   initializes  two  global  variables,  COLORS  and  COLOR_PAIRS
+           (respectively defining the maximum number of colors and color pairs
+           the terminal can support).
+
+       o   It  initializes  the special color pair 0 to the default foreground
+           and background colors.  No other color pairs are initialized.
+
+       o   It restores the colors on the terminal to the values they had  when
+           the terminal was just turned on.
+
+       o   If  the  terminal supports the initc (initialize_color) capability,
+           start_color initializes its internal table  representing  the  red,
+           green, and blue components of the color palette.
+
+           The components depend on whether the terminal uses CGA (aka "ANSI")
+           or HLS (i.e.,  the  hls  (hue_lightness_saturation)  capability  is
+           set).   The  table  is  initialized  first  for  eight basic colors
+           (black, red, green, yellow, blue, magenta, cyan, and white),  using
+           weights that depend upon the CGA/HLS choice.  For "ANSI" colors the
+           weights are 680 or 0 depending on whether  the  corresponding  red,
+           green,  or  blue component is used or not.  That permits using 1000
+           to represent bold/bright colors.  After the  initial  eight  colors
+           (if  the  terminal  supports more than eight colors) the components
+           are initialized using the same pattern, but with weights  of  1000.
+           SVr4 uses a similar scheme, but uses 1000 for the components of the
+           initial eight colors.
+
+           start_color does not attempt to set the terminal's color palette to
+           match  its  built-in  table.   An application may use init_color to
+           alter the internal table along with the terminal's color.
+
+       These limits apply to color values and  color  pairs.   Values  outside
+       these limits are not valid, and may result in a runtime error:
+
+       o   COLORS   corresponds   to   the   terminal   database's  max_colors
+           capability, (see terminfo(5)).
+
+       o   color values are expected  to  be  in  the  range  0  to  COLORS-1,
+           inclusive (including 0 and COLORS-1).
+
+       o   a  special  color value -1 is used in certain extended functions to
+           denote the default color (see use_default_colors(3x)).
+
+       o   COLOR_PAIRS  corresponds  to  the  terminal  database's   max_pairs
+           capability, (see terminfo(5)).
+
+       o   valid  color  pair  values  are  in  the  range 1 to COLOR_PAIRS-1,
+           inclusive.
+
+       o   color pair 0 is special; it denotes "no color".
+
+           Color pair 0 is assumed to be  white  on  black,  but  is  actually
+           whatever  the  terminal implements before color is initialized.  It
+           cannot be modified by the application.
+
+
+

has_colors

+       The has_colors routine requires no arguments.  It returns TRUE  if  the
+       terminal  can  manipulate  colors;  otherwise,  it returns FALSE.  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.
+
+
+

can_change_color

+       The can_change_color routine requires no arguments.  It returns TRUE if
+       the  terminal  supports colors and can change their definitions; other,
+       it  returns  FALSE.   This  routine   facilitates   writing   terminal-
+       independent programs.
+
+
+

init_pair

+       The init_pair routine changes the definition of a color pair.  It takes
+       three arguments: the number of  the  color  pair  to  be  changed,  the
+       foreground color number, and the background color number.  For portable
+       applications:
+
+       o   The first argument must be a valid color pair  value.   If  default
+           colors  are  used  (see  use_default_colors(3x)) the upper limit is
+           adjusted to allow for extra pairs which  use  a  default  color  in
+           foreground and/or background.
+
+       o   The second and third arguments must be valid color values.
+
+       If  the  color pair was previously initialized, the screen is refreshed
+       and all  occurrences  of  that  color  pair  are  changed  to  the  new
+       definition.
+
+       As  an  extension,  ncurses  allows  you  to  set  color pair 0 via the
+       assume_default_colors(3x) routine, or to specify  the  use  of  default
+       colors (color number -1) if you first invoke the use_default_colors(3x)
+       routine.
+
+
+

init_extended_pair

+       Because init_pair uses signed shorts for its  parameters,  that  limits
+       color  pairs  and  color-values  to  32767  on  modern  hardware.   The
+       extension init_extended_pair uses ints for the color  pair  and  color-
+       value, allowing a larger number of colors to be supported.
+
+
+

init_color

+       The  init_color  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).
+
+       o   The  first argument must be a valid color value; default colors are
+           not allowed here.  (See the section Colors for  the  default  color
+           index.)
+
+       o   Each  of  the  last  three arguments must be a value in the range 0
+           through 1000.
+
+       When init_color is used, all occurrences of that color  on  the  screen
+       immediately change to the new definition.
+
+
+

init_extended_color

+       Because  init_color  uses signed shorts for its parameters, that limits
+       color-values and their red, green, and  blue  components  to  32767  on
+       modern  hardware.   The extension init_extended_color uses ints for the
+       color value and for  setting  the  red,  green,  and  blue  components,
+       allowing a larger number of colors to be supported.
+
+
+

color_content

+       The color_content 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 shorts for
+       storing the information about the  amounts  of  red,  green,  and  blue
+       components in the given color.
+
+       o   The  first  argument  must  be a valid color value, i.e., 0 through
+           COLORS-1, inclusive.
+
+       o   The values that are stored at the addresses pointed to by the  last
+           three  arguments  are  in  the  range 0 (no component) through 1000
+           (maximum amount of component), inclusive.
+
+
+

extended_color_content

+       Because color_content uses  signed  shorts  for  its  parameters,  that
+       limits  color-values and their red, green, and blue components to 32767
+       on modern hardware.  The extension extended_color_content uses ints for
+       the  color value and for returning the red, green, and blue components,
+       allowing a larger number of colors to be supported.
+
+
+

pair_content

+       The pair_content 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 shorts for storing the foreground and
+       the background color numbers.
+
+       o   The  first argument must be a valid color value, i.e., in the range
+           1 through COLOR_PAIRS-1, inclusive.
+
+       o   The values that are stored at  the  addresses  pointed  to  by  the
+           second  and  third  arguments  are  in  the range 0 through COLORS,
+           inclusive.
+
+
+

extended_pair_content

+       Because pair_content uses signed shorts for its parameters, that limits
+       color pair and color-values to 32767 on modern hardware.  The extension
+       extended_pair_content uses ints for the color pair  and  for  returning
+       the  foreground  and  background  colors,  allowing  a larger number of
+       colors to be supported.
+
+
+

reset_color_pairs

+       The extension reset_color_pairs tells ncurses to  discard  all  of  the
+       color  pair  information which was set with init_pair.  It also touches
+       the current- and standard-screens, allowing an  application  to  switch
+       color palettes rapidly.
+
+
+

COLOR_PAIR

+       COLOR_PAIR(n) converts a color pair number to an attribute.  Attributes
+       can hold color pairs in the range 0 to 255.  If you need a  color  pair
+       larger  than  that, you must use functions such as attr_set (which pass
+       the color  pair  as  a  separate  parameter)  rather  than  the  legacy
+       functions such as attrset.
+
+
+

PAIR_NUMBER

+       PAIR_NUMBER(attr)   extracts   the  color  information  from  its  attr
+       parameter and returns it as a color pair  number;  it  is  the  inverse
+       operation of COLOR_PAIR.
+
+
+

RETURN VALUE

+       The routines can_change_color and has_colors return TRUE or FALSE.
+
+       All  other routines return the integer ERR upon failure and an OK (SVr4
+       specifies only "an integer  value  other  than  ERR")  upon  successful
+       completion.
+
+       X/Open  defines  no  error  conditions.   SVr4 does document some error
+       conditions which apply in general:
+
+       o   This implementation will return ERR on attempts to use color values
+           outside  the  range  0  to  COLORS-1 (except for the default colors
+           extension),  or  use  color  pairs   outside   the   range   0   to
+           COLOR_PAIRS-1.
+
+           Color values used in init_color must be in the range 0 to 1000.
+
+           An  error  is  returned  from all functions if the terminal has not
+           been initialized.
+
+           An error is returned from secondary functions such as init_pair  if
+           start_color was not called.
+
+       o   SVr4   does  much  the  same,  except  that  it  returns  ERR  from
+           pair_content if the pair was not initialized using  init_pairs  and
+           it  returns ERR from color_content if the terminal does not support
+           changing colors.
+
+           This implementation does not return ERR for either case.
+
+       Specific functions make additional checks:
+
+          init_color
+               returns ERR if the terminal  does  not  support  this  feature,
+               e.g.,  if  the  initialize_color  capability is absent from the
+               terminal description.
+
+          start_color
+               returns an error if the color table cannot be allocated.
+
+
+

NOTES

+       In the ncurses implementation, there is  a  separate  color  activation
+       flag,  color  palette,  color  pairs  table,  and associated COLORS and
+       COLOR_PAIRS counts for  each  screen;  the  start_color  function  only
+       affects  the  current  screen.   The  SVr4/XSI  interface is not really
+       designed with this in mind, and historical implementations  may  use  a
+       single shared color palette.
+
+       Setting  an  implicit  background  color  via a color pair affects only
+       character cells that a character write  operation  explicitly  touches.
+       To  change the background color used when parts of a window are blanked
+       by erasing or scrolling operations, see curs_bkgd(3x).
+
+       Several caveats apply on older x86 machines  (e.g.,  i386,  i486)  with
+       VGA-compatible graphics:
+
+       o   COLOR_YELLOW  is  actually  brown.  To get yellow, use COLOR_YELLOW
+           combined with the A_BOLD attribute.
+
+       o   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).
+
+       o   Color RGB values are not settable.
+
+
+

EXTENSIONS

+       The functions marked as extensions were designed for  ncurses(3x),  and
+       are  not  found  in  SVr4  curses, 4.4BSD curses, or any other previous
+       curses implementation.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       This  implementation  satisfies  X/Open  Curses's  minimum maximums for
+       COLORS and COLOR_PAIRS.
+
+       The  init_pair  routine  accepts  negative  values  of  foreground  and
+       background  color  to support the use_default_colors(3x) extension, but
+       only if that routine has been first invoked.
+
+       The assumption that COLOR_BLACK is the default background color for all
+       terminals   can   be   modified   using  the  assume_default_colors(3x)
+       extension.
+
+       This implementation checks the pointers, e.g., for the values  returned
+       by  color_content  and  pair_content,  and will treat those as optional
+       parameters when null.
+
+       X/Open Curses does not specify a limit for the  number  of  colors  and
+       color pairs which a terminal can support.  However, in its use of short
+       for the parameters, it carries over SVr4's  implementation  detail  for
+       the compiled terminfo database, which uses signed 16-bit numbers.  This
+       implementation provides extended versions of those functions which  use
+       short  parameters, allowing applications to use larger color- and pair-
+       numbers.
+
+       The reset_color_pairs function is an extension of ncurses.
+
+
+

HISTORY

+       SVr3.2 introduced color support to curses in 1987.
+
+       SVr4 made internal changes, e.g., moving  the  storage  for  the  color
+       state  from  SP  (the  SCREEN  structure)  to  cur_term  (the  TERMINAL
+       structure), but provided the same set of library functions.
+
+       SVr4 curses limits the number of color pairs  to  64,  reserving  color
+       pair  zero  (0)  as the terminal's initial uncolored state.  This limit
+       arises because the color pair information is a bitfield in  the  chtype
+       data type (denoted by A_COLOR).
+
+       Other implementations of curses had different limits:
+
+       o   PCCurses (1987-1990) provided for only eight (8) colors.
+
+       o   PDCurses  (1992-present)  inherited  the  8-color  limitation  from
+           PCCurses, but changed this to 256 in version 2.5 (2001), along with
+           changing chtype from 16-bits to 32-bits.
+
+       o   X/Open Curses (1992-present) added a new structure cchar_t to store
+           the character, attributes and color pair values, allowing increased
+           range  of  color  pairs.   Both color pairs and color-values used a
+           signed short, limiting values to 15 bits.
+
+       o   ncurses (1992-present)  uses  eight  bits  for  A_COLOR  in  chtype
+           values.
+
+           Version  5.3  provided  a wide-character interface (2002), but left
+           color pairs as part of the attributes-field.
+
+           Since version 6 (2015), ncurses uses a separate int for color pairs
+           in the cchar_t values.  When those color pair values fit in 8 bits,
+           ncurses allows color pairs to  be  manipulated  via  the  functions
+           using chtype values.
+
+       o   NetBSD  curses  used  6  bits  from  2000  (when  colors were first
+           supported) until 2004.  At that point, NetBSD  changed  to  use  10
+           bits.   As  of  2021,  that size is unchanged.  Like ncurses before
+           version 6, the NetBSD color  pair  information  is  stored  in  the
+           attributes  field of cchar_t, limiting the number of color pairs by
+           the size of the bitfield.
+
+
+

SEE ALSO

+       curses(3x),   curs_attr(3x),   curs_initscr(3x),    curs_variables(3x),
+       default_colors(3x)
+
+
+
+ncurses 6.5                       2024-05-25                    curs_color(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_delch.3x.html b/contrib/ncurses/doc/html/man/curs_delch.3x.html new file mode 100644 index 00000000..43b2e41d --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_delch.3x.html @@ -0,0 +1,121 @@ + + + + + + +curs_delch 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_delch 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_delch(3x)                   Library calls                  curs_delch(3x)
+
+
+
+
+

NAME

+       delch,  wdelch,  mvdelch,  mvwdelch  - delete a character from a curses
+       window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int delch(void);
+       int wdelch(WINDOW * win);
+       int mvdelch(int y, int x);
+       int mvwdelch(WINDOW * win, int y, int x);
+
+
+

DESCRIPTION

+       wdelch deletes the character at the cursor position in win.   It  moves
+       all  characters to the right of the cursor on the same line to the left
+       one position and replaces the contents of the rightmost position on the
+       line  with  the  window's  background  character;  see  bkgd(3x) (wide-
+       character API users: bkgrnd(3x)).  The cursor position does not  change
+       (after  moving  to  (y,  x),  if specified).  ncurses(3x) describes the
+       variants of this function.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if win is NULL.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       delch, mvdelch, and mvwdelch may be implemented as macros.
+
+       A  terminal's  delete_character  (dch1)  capability  is not necessarily
+       employed.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       SVr4  curses  describes  a  successful return value only as "an integer
+       value other than ERR".
+
+
+

HISTORY

+       SVr2 (1984) introduced delch.
+
+
+

SEE ALSO

+       curses(3x)
+
+
+
+ncurses 6.5                       2024-09-21                    curs_delch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_deleteln.3x.html b/contrib/ncurses/doc/html/man/curs_deleteln.3x.html new file mode 100644 index 00000000..68bbb4cf --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_deleteln.3x.html @@ -0,0 +1,133 @@ + + + + + + +curs_deleteln 3x 2024-09-22 ncurses 6.5 Library calls + + + + +

curs_deleteln 3x 2024-09-22 ncurses 6.5 Library calls

+
+curs_deleteln(3x)                Library calls               curs_deleteln(3x)
+
+
+
+
+

NAME

+       deleteln,  wdeleteln, insertln, winsertln, insdelln, winsdelln - delete
+       or insert lines in a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int deleteln(void);
+       int wdeleteln(WINDOW * win);
+
+       int insertln(void);
+       int winsertln(WINDOW * win);
+
+       int insdelln(int n);
+       int winsdelln(WINDOW * win, int n);
+
+
+

DESCRIPTION

+       wdeleteln deletes the line at the cursor in win;  all  lines  below  it
+       move  up  one  line.  curses then fills the bottom line of win with the
+       background character configured  by  wbkgdset(3x)  (wide-character  API
+       users: wbkgrndset(3x)).  The cursor position does not change.
+
+       winsertln inserts a new, empty line of characters above the line at the
+       cursor in win, shifting the existing lines down by one.  The content of
+       the  window's  bottom  line is lost; curses fills the new line with the
+       background character.  The cursor position does not change.
+
+       winsdelln inserts or deletes  n lines  in  win  as  n  is  positive  or
+       negative,  respectively,  as  if  by  repeatedly  calling  winsertln or
+       wdeleteln.
+
+       ncurses(3x) describes the variants of these functions.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they fail if win is NULL.
+
+
+

NOTES

+       All of these functions except winsdelln may be implemented as macros.
+
+       These functions do not require the terminal to  possess  hardware  line
+       deletion  or  insertion  capabilities.   Even  if available, by default
+       curses does not use them; see idlok(3x).
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       SVr4  curses  describes  a  successful return value only as "an integer
+       value other than ERR".
+
+
+

HISTORY

+       4BSD (1980) curses introduced wdeleteln and winsertln.
+
+       SVr3.1 (1987) added winsdelln.
+
+
+

SEE ALSO

+       curses(3x)
+
+
+
+ncurses 6.5                       2024-09-22                 curs_deleteln(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_extend.3x.html b/contrib/ncurses/doc/html/man/curs_extend.3x.html new file mode 100644 index 00000000..e2a9234f --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_extend.3x.html @@ -0,0 +1,140 @@ + + + + + + +curs_extend 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_extend 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_extend(3x)                  Library calls                 curs_extend(3x)
+
+
+
+
+

NAME

+       curses_version, use_extended_names - miscellaneous curses extensions
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       const char * curses_version(void);
+       int use_extended_names(bool bf);
+
+
+

DESCRIPTION

+       These  ncurses  extensions to the curses library do not fit easily into
+       other functional categories.
+
+
+

curses_version

+       curses_version returns a pointer to a string containing  the  library's
+       name  and  version  number,  including  its  patch  level,  for example
+       "ncurses 6.5.20240720".
+
+
+

use_extended_names

+       use_extended_names configures  whether  the  library  recognizes  user-
+       defined  or  nonstandard terminfo capability names that may be compiled
+       into  terminal  type  descriptions   via   the   curs_terminfo(3x)   or
+       curs_termcap(3x)  interfaces.   Normally  these names are available for
+       use, since the essential decision is made through use  of  tic(1)'s  -x
+       option  to  include  such  extensions  in  terminal  type descriptions.
+       use_extended_names  can  prevent   ncurses   from   recognizing   these
+       capabilities  to  ensure  compatibility  with  other implementations of
+       curses.
+
+
+

RETURN VALUE

+       curses_version returns a constant string.
+
+       use_extended_names returns the previous state  of  extended  capability
+       name recognition, allowing you to save this property and restore it.
+
+
+

NOTES

+       The  pointer  returned  by  curses_version  corresponds  to  statically
+       allocated memory; do not attempt to free(3) it.
+
+
+

EXTENSIONS

+       These functions are ncurses(3x) extensions, and are not found  in  SVr4
+       curses, 4.4BSD curses, or any other previous curses implementation.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       ncurses offers several other extensions to the X/Open Curses API.
+
+       curs_getch(3x),   curs_inopts(3x),   curs_mouse(3x),    curs_print(3x),
+       curs_util(3x),    default_colors(3x),   define_key(3x),   keybound(3x),
+       keyok(3x), new_pair(3x), resizeterm(3x), wresize(3x)
+
+
+
+ncurses 6.5                       2024-09-14                   curs_extend(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_get_wch.3x.html b/contrib/ncurses/doc/html/man/curs_get_wch.3x.html new file mode 100644 index 00000000..e2ce5a98 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_get_wch.3x.html @@ -0,0 +1,195 @@ + + + + + + +curs_get_wch 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_get_wch 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_get_wch(3x)                 Library calls                curs_get_wch(3x)
+
+
+
+
+

NAME

+       get_wch,  wget_wch,  mvget_wch,  mvwget_wch,  unget_wch  - get (or push
+       back) a wide character from curses terminal keyboard buffer
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int get_wch(wint_t * wch);
+       int wget_wch(WINDOW * win, wint_t * wch);
+       int mvget_wch(int y, int x, wint_t * wch);
+       int mvwget_wch(WINDOW * win, int y, int x, wint_t * wch);
+
+       int unget_wch(const wchar_t wc);
+
+
+

DESCRIPTION

+
+

Reading Characters

+       wget_wch gathers a key event from the terminal keyboard associated with
+       a  curses  window  win,  returning  OK  if  a  wide  character is read,
+       KEY_CODE_YES if a function key is read, and ERR  if  no  key  event  is
+       available.  ncurses(3x) describes the variants of this function.
+
+       When  input  is pending, wget_wch stores an integer identifying the key
+       event in  wch;  for  alphanumeric  and  punctuation  keys,  this  value
+       corresponds to the character encoding used by the terminal.  Use of the
+       control key as a modifier,  by  holding  it  down  while  pressing  and
+       releasing  another key, often results in a distinct code.  The behavior
+       of other keys depends on whether win is in keypad mode; see subsections
+       "Keypad Mode" and "Predefined Key Codes" in getch(3x).
+
+       If  no input is pending, then if the no-delay flag is set in the window
+       (see nodelay(3x)), the function returns ERR;  otherwise,  curses  waits
+       until  the  terminal  has  input.   If cbreak(3x) has been called, this
+       happens after one character is read.  If nocbreak(3x) or noraw(3x)  has
+       been  called,  it  occurs  when the next newline is read.  (Because the
+       terminal's normal or "cooked" mode is line-buffered, multiple  wget_wch
+       calls   may   then   be  necessary  to  empty  the  input  queue.)   If
+       halfdelay(3x) has been called, curses waits until input is available or
+       the specified delay elapses.
+
+       If echo(3x) has been called, and the window is not a pad, curses writes
+       the wide character from the input queue to the window  (at  the  cursor
+       position) per the following rules.
+
+       o   If  the  wide character matches the terminal's erase character (see
+           erasewchar(3x)), the cursor moves leftward one position and the new
+           position is erased as if wmove(3x) and then wdelch(3x) were called.
+           When the window's keypad mode is enabled (see below), KEY_LEFT  and
+           KEY_BACKSPACE are handled the same way.
+
+       o   curses  writes  any  other  wide  character  to the window, as with
+           wecho_wchar(3x).
+
+       o   If the window win has been moved or modified since the last call to
+           wrefresh(3x), curses calls wrefresh on it.
+
+       If  the wide character is a carriage return and nl(3x) has been called,
+       wgetch stores the the wide character code for line feed in wch instead.
+
+
+

Ungetting Characters

+       unget_wch places wc into the input queue to be retrieved  by  the  next
+       call  to  wget_wch.  A single input queue serves all windows associated
+       with the terminal.
+
+
+

RETURN VALUE

+       wget_wch returns OK when it reads a wide character,  KEY_CODE_YES  when
+       it reads a function key code, and ERR on failure.  wget_wch fails if
+
+       o   its timeout expires without any data arriving, or
+
+       o   execution  was  interrupted by a signal, in which case errno is set
+           to EINTR.
+
+       Functions taking a WINDOW pointer argument fail if the pointer is NULL.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+       unget_wch returns OK on success and ERR if there is no more room in the
+       input queue.
+
+
+

NOTES

+       See the "NOTES" section of wgetch(3x).
+
+       All of these functions except wget_wch and unget_wch may be implemented
+       as macros.
+
+       Unlike  wgetch(3x),  wget_wch  and  its variants store the value of the
+       input character in an additional wch parameter instead  of  the  return
+       value.
+
+       Unlike  ungetch,  unget_wch  cannot distinguish function key codes from
+       conventional  character  codes.   An  application  can  overcome   this
+       limitation  by pushing function key codes with ungetch and subsequently
+       checking the return value of wget_wch for a match with KEY_CODE_YES.
+
+
+

EXTENSIONS

+       See the "EXTENSIONS" section of wgetch(3x).
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       See the "PORTABILITY" section of wgetch(3x) regarding  the  interaction
+       of wget_wch with signal handlers.
+
+
+

SEE ALSO

+       curs_getch(3x) describes comparable functions of the ncurses library in
+       its non-wide-character configuration.
+
+       curses(3x),    curs_add_wch(3x),    curs_inopts(3x),     curs_move(3x),
+       curs_refresh(3x)
+
+
+
+ncurses 6.5                       2024-09-14                  curs_get_wch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_get_wstr.3x.html b/contrib/ncurses/doc/html/man/curs_get_wstr.3x.html new file mode 100644 index 00000000..b4ec79d4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_get_wstr.3x.html @@ -0,0 +1,206 @@ + + + + + + +curs_get_wstr 3x 2024-06-22 ncurses 6.5 Library calls + + + + +

curs_get_wstr 3x 2024-06-22 ncurses 6.5 Library calls

+
+curs_get_wstr(3x)                Library calls               curs_get_wstr(3x)
+
+
+
+
+

NAME

+       get_wstr,  getn_wstr,  wget_wstr,  wgetn_wstr, mvget_wstr, mvgetn_wstr,
+       mvwget_wstr, mvwgetn_wstr - get a wide-character string from  a  curses
+       terminal keyboard
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int get_wstr(wint_t * wstr);
+       int wget_wstr(WINDOW * win, wint_t * wstr);
+       int mvget_wstr(int y, int x, wint_t * wstr);
+       int mvwget_wstr(WINDOW * win, int y, int x, wint_t * wstr);
+
+       int getn_wstr(wint_t * wstr, int n);
+       int wgetn_wstr(WINDOW * win, wint_t * wstr, int n);
+       int mvgetn_wstr(int y, int x, wint_t * wstr, int n);
+       int mvwgetn_wstr(WINDOW * win, int y, int x, wint_t * wstr, int n);
+
+
+

DESCRIPTION

+       The  function  wgetn_wstr  is  equivalent  to  a  series  of  calls  to
+       wget_wch(3x) until a newline or carriage return terminates the series:
+
+       o   The terminating character is not included in the returned string.
+
+       o   An end-of-file condition is represented  by  WEOF,  as  defined  in
+           <wchar.h>.
+
+       o   In  all  instances,  the  end of the string is terminated by a null
+           wchar_t.
+
+       o   The function stores the result in the area pointed to by  the  wstr
+           parameter.
+
+       o   The function reads at most n characters, thus preventing a possible
+           overflow of the input buffer.
+
+           Any attempt to enter more characters (other  than  the  terminating
+           newline or carriage return) causes a beep.
+
+           Function keys also cause a beep and are ignored.
+
+       The user's erase and kill characters are interpreted:
+
+       o   The  erase  character (e.g., ^H) erases the character at the end of
+           the buffer, moving the cursor to the left.
+
+           If keypad mode is on for the window, KEY_LEFT and KEY_BACKSPACE are
+           both considered equivalent to the user's erase character.
+
+       o   The kill character (e.g., ^U) erases the entire buffer, leaving the
+           cursor at the beginning of the buffer.
+
+       Characters input are echoed only if echo  is  currently  on.   In  that
+       case,  backspace  is  echoed  as  deletion  of  the  previous character
+       (typically a left motion).
+
+       The getn_wstr, mvgetn_wstr, mvwgetn_wstr, and wgetn_wstr functions  are
+       identical  to  the  get_wstr,  mvget_wstr,  mvwget_wstr,  and wget_wstr
+       functions, respectively, except that the *n_* versions read at  most  n
+       characters,  letting  the  application  prevent  overflow  of the input
+       buffer.
+
+
+

RETURN VALUE

+       All  of  these  functions  return  the  integer  OK   upon   successful
+       completion.  If unsuccessful, they return ERR.
+
+       X/Open defines no error conditions.
+
+       In this implementation, these functions return ERR
+
+       o   if the window pointer is null,
+
+       o   if its timeout expires without having any data, or
+
+       o   if the associated call to wget_wch failed.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       Any of these functions other than wgetn_wstr may be macros.
+
+       Using get_wstr, mvget_wstr, mvwget_wstr, or wget_wstr to  read  a  line
+       that  overflows  the array pointed to by wstr causes undefined results.
+       The  use  of  getn_wstr,  mvgetn_wstr,  mvwgetn_wstr,  or   wgetn_wstr,
+       respectively, is recommended.
+
+       These  functions  cannot  return KEY_ values because there is no way to
+       distinguish a KEY_ value from a valid wchar_t value.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       This  implementation  returns  ERR if the window pointer is null, or if
+       the lower-level wget_wch call returns an ERR.  In the latter  case,  an
+       ERR  return  without other data is treated as an end-of-file condition,
+       and the returned array contains a WEOF followed by a null wchar_t.
+
+       X/Open curses documented these functions to pass an array of wchar_t in
+       1997, but that was an error because of this part of the description:
+
+              The effect of get_wstr is as though a series of calls to get_wch
+              were made, until a newline character, end-of-line character,  or
+              end-of-file character is processed.
+
+       The  latter function get_wch can return a negative value, while wchar_t
+       is a unsigned type.  All of the vendors implement  this  using  wint_t,
+       following the standard.
+
+       X/Open  Curses,  Issue  7  (2009)  is  unclear  regarding  whether  the
+       terminating null wchar_t value is counted in the  length  parameter  n.
+       X/Open  Curses,  Issue  7  revised  the  corresponding  description  of
+       wgetnstr  to  address  this  issue.   The  unrevised   description   of
+       wget_nwstr  can  be interpreted either way.  This implementation counts
+       the terminator in the length.
+
+       X/Open Curses does  not  specify  what  happens  if  the  length  n  is
+       negative.
+
+       o   For  analogy  with  wgetnstr,  ncurses  6.2  uses a limit (based on
+           LINE_MAX).
+
+       o   Some other implementations (such as Solaris xcurses) do  the  same,
+           while others (PDCurses) do not allow this.
+
+       o   NetBSD  7 curses imitates ncurses 6.1 in this regard, treating a -1
+           as an indefinite number of characters.
+
+
+

SEE ALSO

+       curs_getstr(3x) describes comparable functions of the  ncurses  library
+       in its non-wide-character configuration.
+
+       curses(3x), curs_get_wch(3x)
+
+
+
+ncurses 6.5                       2024-06-22                 curs_get_wstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_getcchar.3x.html b/contrib/ncurses/doc/html/man/curs_getcchar.3x.html new file mode 100644 index 00000000..c1edf284 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_getcchar.3x.html @@ -0,0 +1,219 @@ + + + + + + +curs_getcchar 3x 2024-04-20 ncurses 6.5 Library calls + + + + +

curs_getcchar 3x 2024-04-20 ncurses 6.5 Library calls

+
+curs_getcchar(3x)                Library calls               curs_getcchar(3x)
+
+
+
+
+

NAME

+       getcchar,  setcchar  -  convert  between  a wide-character string and a
+       curses complex character
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int getcchar(
+               const cchar_t *wch,
+               wchar_t *wc,
+               attr_t *attrs,
+               short *color_pair,
+               void *opts );
+
+       int setcchar(
+               cchar_t *wch,
+               const wchar_t *wc,
+               const attr_t attrs,
+               short color_pair,
+               const void *opts );
+
+
+

DESCRIPTION

+
+

getcchar

+       The getcchar function gets a wide-character string and rendition from a
+       cchar_t argument.  When wc is not a null pointer, the getcchar function
+       does the following:
+
+       o   Extracts information from a cchar_t value wch
+
+       o   Stores the character attributes in the location pointed to by attrs
+
+       o   Stores the color pair in the location pointed to by color_pair
+
+       o   Stores the wide-character string,  characters  referenced  by  wch,
+           into the array pointed to by wc.
+
+       When wc is a null pointer, the getcchar function does the following:
+
+       o   Obtains the number of wide characters pointed to by wch
+
+       o   Does not change the data referenced by attrs or color_pair
+
+
+

setcchar

+       The  setcchar  function  initializes  the location pointed to by wch by
+       using:
+
+       o   The character attributes in attrs
+
+       o   The color pair in color_pair
+
+       o   The wide-character string pointed to by wc.   The  string  must  be
+           L'\0' terminated, contain at most one spacing character, which must
+           be the first.
+
+           Up to CCHARW_MAX-1 non-spacing characters may  follow.   Additional
+           non-spacing characters are ignored.
+
+           The string may contain a single control character instead.  In that
+           case, no non-spacing characters are allowed.
+
+
+

RETURN VALUE

+       When wc is  a  null  pointer,  getcchar  returns  the  number  of  wide
+       characters referenced by wch, including one for a trailing null.
+
+       When  wc  is  not  a  null pointer, getcchar returns OK upon successful
+       completion, and ERR otherwise.
+
+       Upon successful completion, setcchar returns OK.  Otherwise, it returns
+       ERR.
+
+
+

NOTES

+       The wch argument may be a value generated by a call to setcchar or by a
+       function that has a cchar_t output argument.  If wch is constructed  by
+       any other means, the effect is unspecified.
+
+
+

EXTENSIONS

+       X/Open  Curses  documents the opts argument as reserved for future use,
+       saying that it must be null.  This implementation uses  that  parameter
+       in ABI 6 for the functions which have a color pair parameter to support
+       extended color pairs:
+
+       o   For  functions  which modify the color, e.g., setcchar, if opts  is
+           set it is treated as a pointer to int, and used to  set  the  color
+           pair instead of the short pair parameter.
+
+       o   For functions which retrieve the color, e.g., getcchar, if opts  is
+           set it is treated as a pointer to int, and  used  to  retrieve  the
+           color pair as an int value,  in  addition  retrieving  it  via  the
+           standard pointer to short parameter.
+
+
+

PORTABILITY

+       The  CCHARW_MAX  symbol is specific to ncurses.  X/Open Curses does not
+       provide details for the layout of the cchar_t structure.  It tells what
+       data are stored in it:
+
+       o   a spacing character (wchar_t, i.e., 32-bits).
+
+       o   non-spacing characters (again, wchar_t's).
+
+       o   attributes  (at  least  16 bits, inferred from the various ACS- and
+           WACS-flags).
+
+       o   color pair (at least 16 bits,  inferred  from  the  unsigned  short
+           type).
+
+       The non-spacing characters are optional, in the sense that zero or more
+       may be stored in a cchar_t.  XOpen/Curses specifies a limit:
+
+           Implementations may limit the number of non-spacing characters that
+           can  be  associated with a spacing character, provided any limit is
+           at least 5.
+
+       The Unix implementations at the time follow that limit:
+
+       o   AIX 4 and OSF1 4 use the same declaration with an array of  5  non-
+           spacing characters z and a single spacing character c.
+
+       o   HP-UX 10  uses  an  opaque  structure with 28 bytes, which is large
+           enough for the 6 wchar_t values.
+
+       o   Solaris xpg4 curses uses a single array of 6 wchar_t values.
+
+       This implementation's cchar_t was defined in 1995 using 5 for the total
+       of  spacing and non-spacing characters (CCHARW_MAX).  That was probably
+       due to a misreading of the  AIX 4  header  files,  because  the  X/Open
+       Curses  document  was  not generally available at that time.  Later (in
+       2002), this detail was  overlooked  when  beginning  to  implement  the
+       functions using the structure.
+
+       In  practice, even four non-spacing characters may seem enough.  X/Open
+       Curses documents possible uses for  non-spacing  characters,  including
+       using  them  for ligatures between characters (a feature apparently not
+       supported by any curses implementation).  Unicode does  not  limit  the
+       (analogous) number of combining characters, so some applications may be
+       affected.
+
+
+

SEE ALSO

+       curses(3x), curs_attr(3x), curs_color(3x), wcwidth(3)
+
+
+
+ncurses 6.5                       2024-04-20                 curs_getcchar(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_getch.3x.html b/contrib/ncurses/doc/html/man/curs_getch.3x.html new file mode 100644 index 00000000..f017ec8f --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_getch.3x.html @@ -0,0 +1,454 @@ + + + + + + +curs_getch 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_getch 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_getch(3x)                   Library calls                  curs_getch(3x)
+
+
+
+
+

NAME

+       getch, wgetch, mvgetch, mvwgetch, ungetch, has_key - get (or push back)
+       characters from curses terminal keyboard buffer
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int getch(void);
+       int wgetch(WINDOW * win);
+       int mvgetch(int y, int x);
+       int mvwgetch(WINDOW * win, int y, int x);
+
+       int ungetch(int c);
+
+       /* extension */
+       int has_key(int c);
+
+
+

DESCRIPTION

+
+

Reading Characters

+       wgetch gathers a key event from the terminal keyboard associated with a
+       curses   window  win.   ncurses(3x)  describes  the  variants  of  this
+       function.
+
+       When input is pending, wgetch returns an integer  identifying  the  key
+       event; for alphanumeric and punctuation keys, this value corresponds to
+       the character encoding used by the terminal.  Use of the control key as
+       a  modifier,  by  holding  it down while pressing and releasing another
+       key, often results in a distinct code.   The  behavior  of  other  keys
+       depends  on whether win is in keypad mode; see subsection "Keypad Mode"
+       below.
+
+       If no input is pending, then if the no-delay flag is set in the  window
+       (see  nodelay(3x)),  the  function returns ERR; otherwise, curses waits
+       until the terminal has input.  If  cbreak(3x)  has  been  called,  this
+       happens  after one character is read.  If nocbreak(3x) or noraw(3x) has
+       been called, it occurs when the next newline  is  read.   (Because  the
+       terminal's  normal  or  "cooked" mode is line-buffered, multiple wgetch
+       calls  may  then  be  necessary  to  empty  the   input   queue.)    If
+       halfdelay(3x) has been called, curses waits until input is available or
+       the specified delay elapses.
+
+       If echo(3x) has been called, and the window is not a pad, curses writes
+       the returned character c to the window (at the cursor position) per the
+       following rules.
+
+       o   If c matches the terminal's erase  character  (see  erasechar(3x)),
+           the  cursor  moves  leftward  one  position and the new position is
+           erased as if wmove(3x) and then wdelch(3x) were called.   When  the
+           window's   keypad   mode  is  enabled  (see  below),  KEY_LEFT  and
+           KEY_BACKSPACE are handled the same way.
+
+       o   curses writes any other c to the window, as with wechochar(3x).
+
+       o   If the window win has been moved or modified since the last call to
+           wrefresh(3x), curses calls wrefresh on it.
+
+       If  c  is  a carriage return and nl(3x) has been called, wgetch returns
+       the character code for line feed instead.
+
+
+

Keypad Mode

+       To curses, key strokes not from the alphabetic section of the  keyboard
+       (those    corresponding    to    the    ECMA-6    character    set--see
+       ascii(7)--optionally modified by either the control or shift keys)  are
+       treated as function keys.  (In curses, the term "function key" includes
+       but is not limited to keycaps engraved with "F1", "PF1",  and  so  on.)
+       If  the  window  is  in  keypad  mode,  these  produce  a  numeric code
+       corresponding to the KEY_ symbols listed in subsection "Predefined  Key
+       Codes"  below;  otherwise,  they transmit a sequence of codes typically
+       starting with the escape character, and which must  be  collected  with
+       multiple wgetch calls.
+
+       o   The  curses.h  header  file  declares many predefined function keys
+           whose names begin with KEY_; these object-like macros  have  values
+           outside the range of eight-bit character codes.
+
+       o   In   ncurses,   user-defined  function  keys  are  configured  with
+           define_key(3x); they have no names, but are also expected  to  have
+           values outside the range of eight-bit codes.
+
+       A  variable  intended  to hold a function key code must thus be of type
+       short or larger.
+
+       Most terminals one encounters follow the ECMA-48  standard  insofar  as
+       their  function  keys  produce  character  sequences  prefixed with the
+       escape character ESC.  This fact implies that curses cannot distinguish
+       a  user's  press  of  the  escape  key (assuming it sends ESC) from the
+       beginning of a function key's character sequence without waiting to see
+       if,  and  how  soon,  further input arrives.  When curses reads such an
+       ambiguous character, it sets a timer.  If the remainder of the sequence
+       does  not  arrive within the designated time, wgetch returns the prefix
+       character; otherwise, it returns the function key code corresponding to
+       the unique sequence defined by the terminal.  Consequently, a user of a
+       curses application may experience a  delay  after  the  escape  key  is
+       pressed  while curses disambiguates the input; see section "EXTENSIONS"
+       below.  If the window is in "no time-out"  mode,  the  timer  does  not
+       expire;  it  is  an infinite (or very large) value.  See notimeout(3x).
+       Because function key sequences usually begin with ESC, the terminal may
+       appear  to  hang  in no time-out mode after the user presses the escape
+       key.  Generally, further typing "awakens" curses.
+
+
+

Ungetting Characters

+       ungetch places c into the input queue to be returned by the  next  call
+       to wgetch.  A single input queue serves all windows associated with the
+       terminal.
+
+
+

Predefined Key Codes

+       The header file curses.h defines the following function key codes.
+
+       o   Except for the special case of KEY_RESIZE, a window's  keypad  mode
+           must be enabled for wgetch to read these codes from it.
+
+       o   Not  all  of  these  are  necessarily  supported  on any particular
+           terminal.
+
+       o   The  naming  convention  may  seem  obscure,  with  some   apparent
+           misspellings  (such  as "RSUME" for "resume"); the names correspond
+           to  the  terminfo  capability  names  for  the   keys,   and   were
+           standardized  before  the  IBM  PC/AT  keyboard  layout  achieved a
+           dominant position in industry.
+
+              Symbol          Key name
+              -----------------------------------------------------------------
+              KEY_BREAK       Break key
+              KEY_DOWN
+              KEY_UP          Arrow keys
+              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(n)        Function key n where 0 <= n <= 63
+              KEY_DL          Delete line
+              KEY_IL          Insert line
+              KEY_DC          Delete character
+              KEY_IC          Insert character/Enter insert mode
+              KEY_EIC         Exit insert character mode
+              KEY_CLEAR       Clear screen
+              KEY_EOS         Clear to end of screen
+              KEY_EOL         Clear to end of line
+              KEY_SF          Scroll one line forward
+              KEY_SR          Scroll one line backward (reverse)
+              KEY_NPAGE       Next page/Page up
+              KEY_PPAGE       Previous page/Page down
+              KEY_STAB        Set tab
+              KEY_CTAB        Clear tab
+              KEY_CATAB       Clear all tabs
+              KEY_ENTER       Enter/Send
+              KEY_SRESET      Soft (partial) reset
+              KEY_RESET       (Hard) reset
+              KEY_PRINT       Print/Copy
+              KEY_LL          Home down/Bottom (lower left)
+              KEY_A1          Upper left of keypad
+              KEY_A3          Upper right of keypad
+              KEY_B2          Center of keypad
+              KEY_C1          Lower left of keypad
+              KEY_C3          Lower right of keypad
+              KEY_BTAB        Back tab key
+              KEY_BEG         Beg(inning) key
+              KEY_CANCEL      Cancel key
+              KEY_CLOSE       Close key
+              KEY_COMMAND     Cmd (command) key
+              KEY_COPY        Copy key
+              KEY_CREATE      Create key
+              KEY_END         End key
+              KEY_EXIT        Exit key
+              KEY_FIND        Find key
+              KEY_HELP        Help key
+              KEY_MARK        Mark key
+              KEY_MESSAGE     Message key
+              KEY_MOUSE       Mouse event occurred
+              KEY_MOVE        Move key
+              KEY_NEXT        Next object key
+              KEY_OPEN        Open key
+              KEY_OPTIONS     Options key
+              KEY_PREVIOUS    Previous object key
+              KEY_REDO        Redo key
+              KEY_REFERENCE   Ref(erence) key
+              KEY_REFRESH     Refresh key
+              KEY_REPLACE     Replace key
+              KEY_RESIZE      Screen resized
+              KEY_RESTART     Restart key
+              KEY_RESUME      Resume key
+              KEY_SAVE        Save key
+              KEY_SELECT      Select key
+              KEY_SUSPEND     Suspend key
+              KEY_UNDO        Undo 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 character key
+              KEY_SDL         Shifted delete line key
+              KEY_SEND        Shifted end key
+              KEY_SEOL        Shifted clear line key
+              KEY_SEXIT       Shifted exit key
+              KEY_SFIND       Shifted find key
+              KEY_SHELP       Shifted help key
+              KEY_SHOME       Shifted home key
+              KEY_SIC         Shifted insert key
+              KEY_SLEFT       Shifted left arrow key
+              KEY_SMESSAGE    Shifted message key
+              KEY_SMOVE       Shifted move key
+              KEY_SNEXT       Shifted next object key
+              KEY_SOPTIONS    Shifted options key
+              KEY_SPREVIOUS   Shifted previous object key
+              KEY_SPRINT      Shifted print key
+              KEY_SREDO       Shifted redo key
+              KEY_SREPLACE    Shifted replace key
+              KEY_SRIGHT      Shifted right arrow key
+              KEY_SRSUME      Shifted resume key
+              KEY_SSAVE       Shifted save key
+              KEY_SSUSPEND    Shifted suspend key
+              KEY_SUNDO       Shifted undo key
+
+       Many keyboards feature a nine-key directional pad.
+
+                                   +-----+------+-------+
+                                   | A1  |  up  |  A3   |
+                                   +-----+------+-------+
+                                   |left |  B2  | right |
+                                   +-----+------+-------+
+                                   | C1  | down |  C3   |
+                                   +-----+------+-------+
+       Two of the symbols in the list above do not correspond  to  a  physical
+       key.
+
+       o   wgetch  returns  KEY_RESIZE,  even  if  the window's keypad mode is
+           disabled, if ncurses has handled a SIGWINCH signal since wgetch was
+           called; see initscr(3x) and resizeterm(3x).
+
+       o   wgetch  returns KEY_MOUSE to indicate that a mouse event is pending
+           collection; see curs_mouse(3x).  Receipt of this  code  requires  a
+           window's  keypad  mode  to  be  enabled, because to interpret mouse
+           input (as with with xterm(1)'s mouse protocol), ncurses  must  read
+           an escape sequence, as with a function key.
+
+
+

Testing Key Codes

+       In  ncurses,  has_key  returns  a  Boolean value indicating whether the
+       terminal type recognizes its parameter as a key code value.   See  also
+       define_key(3x) and key_defined(3x).
+
+
+

RETURN VALUE

+       wgetch returns a key code identifying the key event as described above,
+       which may include KEY_RESIZE or KEY_MOUSE indicating non-key events, or
+       ERR on failure.  wgetch fails if
+
+       o   its timeout expires without any data arriving, or
+
+       o   execution  was  interrupted by a signal, in which case errno is set
+           to EINTR.
+
+       ungetch returns OK on success and ERR on  failure.   ungetch  fails  if
+       there is no more room in the input queue.
+
+       has_key returns TRUE or FALSE.
+
+       Functions taking a WINDOW pointer argument fail if the pointer is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       getch, mvgetch, and mvwgetch may be implemented as macros.
+
+       curses discourages assignment of the ESC key to a discrete function  by
+       the programmer because the library requires a delay while it awaits the
+       potential remainder of a terminal escape sequence.
+
+       Some key strokes are indistinguishable  from  control  characters;  for
+       example,  KEY_ENTER may be the same as ^M, and KEY_BACKSPACE may be the
+       same as ^H or ^?.  Consult the terminfo entry for the terminal type  to
+       determine  whether  this  is  the  case;  see  infocmp(1).  Some curses
+       implementations, including ncurses, honor the terminfo key definitions;
+       others treat such control characters specially.
+
+       curses  distinguishes  the  Enter  keys  in  the alphabetic and numeric
+       keypad sections of a keyboard because (most) terminals  do.   KEY_ENTER
+       refers  to the key on the numeric keypad and, like other function keys,
+       is reliably recognized only if the window's keypad mode is enabled.
+
+       o   The terminfo key_enter (kent) capability  describes  the  character
+           (sequence)  sent  by  the  Enter  key  of  a terminal's numeric (or
+           similar) keypad.
+
+       o   "Enter or send" is X/Open Curses's description of this key.
+
+       curses treats the Enter or Return key in the alphabetic section of  the
+       keyboard differently.
+
+       o   It usually produces a control code for carriage return (^M) or line
+           feed (^J).
+
+       o   Depending on the terminal mode  (raw,  cbreak,  or  "cooked"),  and
+           whether  nl(3x)  or  nonl(3x)  has  been  called, wgetch may return
+           either a carriage return or line feed upon an Enter or  Return  key
+           stroke.
+
+       Use  of  wgetch with echo(3x) and neither cbreak(3x) nor raw(3x) is not
+       well-defined.
+
+       Historically, the list of key code macros above was influenced  by  the
+       keyboard  of  the AT&T 7300 (also known variously as the "3B1", "Safari
+       4", and "UNIX PC"), a 1985 machine  rich  in  function  keys.   Today's
+       computer  keyboards are based on that of the IBM PC/AT and tend to have
+       fewer.  A curses application can expect such a keyboard to transmit key
+       codes   KEY_UP,   KEY_DOWN,  KEY_LEFT,  KEY_RIGHT,  KEY_HOME,  KEY_END,
+       KEY_PPAGE (Page Up), KEY_NPAGE (Page  Down),  KEY_IC  (Insert),  KEY_DC
+       (Delete), KEY_A1, KEY_A3, KEY_B2, KEY_C1, KEY_C3, and KEY_F(n) for 1 <=
+       n <= 12.
+
+
+

EXTENSIONS

+       In ncurses, when a window's "no time-out" mode is not set, the ESCDELAY
+       variable  configures  the  duration of the timer used to disambiguate a
+       function key character sequence from a series of key strokes  beginning
+       with ESC typed by the user; see curs_variables(3x).
+
+       has_key  was  designed  for  ncurses,  and is not found in SVr4 curses,
+       4.4BSD curses, or any other previous curses implementation.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       Except  as  noted in section "EXTENSIONS" above, X/Open Curses, Issue 4
+       describes these functions.  It specifies no error conditions for them.
+
+       wgetch reads only single-byte characters.
+
+       The echo behavior of these functions on  input  of  KEY_  or  backspace
+       characters is not documented in SVr4 curses.
+
+       The  behavior  of  wgetch  in  the  presence  of signal handlers is not
+       documented in SVr4 curses and is  unspecified  by  X/Open  Curses.   In
+       historical  curses  implementations, it varied depending on whether the
+       operating system's dispatch of a signal  to  a  handler  interrupted  a
+       read(2) call in progress, and also (in some implementations) whether an
+       input timeout or non-blocking mode had been  set.   A  portable  curses
+       application  prepares  for  two  cases:  (a)  signal  receipt  does not
+       interrupt wgetch; or (b) signal receipt interrupts wgetch and causes it
+       to return ERR with errno set to EINTR.
+
+       KEY_MOUSE is mentioned in X/Open Curses, along with a few related term-
+       info capabilities, but no higher-level functions use the feature.   The
+       implementation in ncurses is an extension.
+
+       KEY_RESIZE  and  has_key  are extensions first implemented for ncurses.
+       By  2022,  PDCurses  and  NetBSD  curses  had  added  them  along  with
+       KEY_MOUSE.
+
+
+

SEE ALSO

+       ECMA-6  "7-bit  coded  Character  Set" <https://ecma-international.org/
+       publications-and-standards/standards/ecma-6/>
+
+       ECMA-48  "Control  Functions  for  Coded  Character   Sets"   <https://
+       ecma-international.org/publications-and-standards/standards/ecma-48/>
+
+       curs_get_wch(3x)  describes comparable functions of the ncurses library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x),    curs_addch(3x),     curs_inopts(3x),     curs_mouse(3x),
+       curs_move(3x),  curs_outopts(3x), curs_refresh(3x), curs_variables(3x),
+       resizeterm(3x), ascii(7)
+
+
+
+ncurses 6.5                       2024-09-14                    curs_getch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_getstr.3x.html b/contrib/ncurses/doc/html/man/curs_getstr.3x.html new file mode 100644 index 00000000..226514a4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_getstr.3x.html @@ -0,0 +1,277 @@ + + + + + + +curs_getstr 3x 2024-06-22 ncurses 6.5 Library calls + + + + +

curs_getstr 3x 2024-06-22 ncurses 6.5 Library calls

+
+curs_getstr(3x)                  Library calls                 curs_getstr(3x)
+
+
+
+
+

NAME

+       getstr,  getnstr,  wgetstr,  wgetnstr,  mvgetstr, mvgetnstr, mvwgetstr,
+       mvwgetnstr - accept character strings from curses terminal keyboard
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int getstr(char * str);
+       int wgetstr(WINDOW * win, char * str);
+       int mvgetstr(int y, int x, char * str);
+       int mvwgetstr(WINDOW * win, int y, int x, char * str);
+
+       int getnstr(char * str, int n);
+       int wgetnstr(WINDOW * win, char * str, int n);
+       int mvgetnstr(int y, int x, char * str, int n);
+       int mvwgetnstr(WINDOW * win, int y, int x, char * str, int n);
+
+
+

DESCRIPTION

+       wgetstr populates a  user-supplied  string  buffer  str  by  repeatedly
+       calling  wgetch(3x) with the win argument until a line feed or carriage
+       return character is input.  The function
+
+       o   does not copy the terminating character to str;
+
+       o   always terminates str with a null character;
+
+       o   interprets  the   screen's   erase   and   kill   characters   (see
+           erasechar(3x) and killchar(3x));
+
+       o   recognizes  function  keys  only  if  the screen's keypad option is
+           enabled (see keypad(3x));
+
+       o   treats the function keys KEY_LEFT and KEY_BACKSPACE the same as the
+           erase character; and
+
+       o   discards  function key inputs other than those treated as the erase
+           character, calling beep(3x).
+
+       The erase character replaces the character at the  end  of  the  buffer
+       with  a  null character, while the kill character does the same for the
+       entire buffer.
+
+       If the screen's echo option is enabled (see echo(3x)), wgetstr  updates
+       win with wechochar(3x).  Further,
+
+       o   the  erase  character and its function key synonyms move the cursor
+           to the left, and
+
+       o   the kill character returns the cursor to where it was located  when
+           wgetstr was called.
+
+       wgetnstr  is  similar,  but  reads  at  most  n  characters, aiding the
+       application to avoid overrunning the buffer to which  str  points.   An
+       attempt  to  input  more  than n characters (other than the terminating
+       line feed or carriage return) is ignored with a beep.
+
+       ncurses(3x) describes the variants of these functions.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL, or
+
+       o   if an internal wgetch call fails.
+
+       Further, in ncurses, these functions return KEY_RESIZE  if  a  SIGWINCH
+       event interrupts the function.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except wgetnstr may be implemented as macros.
+
+       Use of getstr, mvgetstr, mvwgetstr,  or  wgetstr  to  read  input  that
+       overruns  the  buffer  pointed to by str causes undefined results.  Use
+       their n-infixed counterpart functions instead.
+
+       While wgetnstr is conceptually a series of calls  to  wgetch,  it  also
+       temporarily  changes  properties  of the curses screen to permit simple
+       editing of the input buffer.  It saves  the  screen's  state  and  then
+       calls  nl(3x)  and,  if  the  screen  was  in  normal  ("cooked") mode,
+       cbreak(3x).  Before returning, it  restores  the  saved  screen  state.
+       Other   implementations  differ  in  detail,  affecting  which  control
+       characters they can accept in the  buffer;  see  section  "PORTABILITY"
+       below.
+
+
+

EXTENSIONS

+       The return value KEY_RESIZE is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       X/Open Curses Issue 4 describes these functions.  It specifies no error
+       conditions  for them, but indicates that wgetnstr and its variants read
+       "the entire multi-byte sequence associated with a character" and "fail"
+       if n and str together do not describe a buffer "large enough to contain
+       any complete characters".   In  ncurses,  however,  wgetch  reads  only
+       single-byte characters, so this scenario does not arise.
+
+       SVr4  curses  describes  a  successful return value only as "an integer
+       value other than ERR".
+
+       SVr3 and early SVr4 curses  implementations  did  not  reject  function
+       keys; the SVr4 documentation asserted that, like the screen's erase and
+       kill characters, they were
+
+              interpreted, as well as any special keys (such as function keys,
+              "home" key, "clear" key, etc.)
+
+       without  further  detail.   It  lied.   In  fact, the "character" value
+       appended to the string by those implementations was predictable but not
+       useful  --  being,  in fact, the low-order eight bits of the key code's
+       KEY_ constant value.  (The same language, unchanged except for styling,
+       survived into X/Open Curses Issue 4, but disappeared from Issue 7.)
+
+       X/Open  Curses Issue 5 (2007) stated that these functions "read at most
+       n bytes" but did not  state  whether  the  terminating  null  character
+       counted  toward  that limit.  X/Open Curses Issue 7 (2009) changed that
+       to say they "read at most n-1 bytes" to allow for the terminating  null
+       character.  As of 2018, some implementations count it, some do not.
+
+       o   ncurses 6.1 and PDCurses do not count the null character toward the
+           limit, while Solaris and NetBSD curses do.
+
+       o   Solaris  xcurses  offers   both   behaviors:   its   wide-character
+           wgetn_wstr  reserves  room  for a wide null character, but its non-
+           wide wgetnstr does not consistently count a null  character  toward
+           the limit.
+
+       In SVr4 curses, a negative n tells wgetnstr to assume that the caller's
+       buffer is large enough to hold the result; that is, the  function  then
+       acts  like  wgetstr.   X/Open Curses does not mention this behavior (or
+       anything  related  to  nonpositive  n  values),  however  most   curses
+       libraries  implement  it.  Most implementations nevertheless enforce an
+       upper limit on the count of bytes they write to the destination  buffer
+       str.
+
+       o   BSD   curses   lacked  wgetnstr,  and  its  wgetstr  wrote  to  str
+           unboundedly, as did that in SVr2.
+
+       o   PDCurses, and SVr3.1, SVr4, and Solaris curses limit both functions
+           to  writing  256  bytes.  Other System V-based platforms likely use
+           the same limit.
+
+       o   Solaris xcurses limits the write to LINE_MAX bytes.
+
+       o   NetBSD 7 curses imposes no particular limit on the  length  of  the
+           write,  but does validate n to ensure that it is greater than zero.
+           A comment in NetBSD's source  code  asserts  that  SUSv2  specifies
+           this.
+
+       o   ncurses  prior  to 6.2 (2020) imposes no limit on the length of the
+           write, and treats wgetnstr's n parameter as SVr4 curses does.
+
+       o   ncurses 6.2 uses LINE_MAX  or  a  larger  (system-dependent)  value
+           provided  by  sysconf(3).   If  neither  LINE_MAX  nor  sysconf  is
+           available, ncurses  uses  the  POSIX  minimum  value  for  LINE_MAX
+           (2048).   In  either  case,  it reserves a byte for the terminating
+           null character.
+
+       Implementations vary in their handling of input control characters.
+
+       o   While they may enable the screen's echo option, some do not take it
+           out  of  raw  mode,  and  may  take  cbreak  mode into account when
+           deciding whether to handle echoing within wgetnstr or to rely on it
+           as a side effect of calling wgetch.
+
+       o   Originally,  ncurses, like its progenitor pcurses, had its wgetnstr
+           call noraw and cbreak before accepting input.  That may  have  been
+           done  to  make  function keys work; it is not necessary with modern
+           ncurses.
+
+           Since 1995, ncurses has provided handlers for SIGINTR  and  SIGQUIT
+           events,  which  are typically generated at the keyboard with ^C and
+           ^\ respectively.  In cbreak mode, those handlers catch a signal and
+           stop   the  program,  whereas  other  implementations  write  those
+           characters into the buffer.
+
+       o   Starting with ncurses 6.3 (2021), wgetnstr preserves  raw  mode  if
+           the  screen  was  already  in that state, allowing one to enter the
+           characters the terminal interprets as  interrupt  and  quit  events
+           into the buffer, for better compatibility with SVr4 curses.
+
+
+

HISTORY

+       4BSD (1980) curses introduced wgetstr along with its variants.
+
+       SVr3.1 (1987) added wgetnstr, but none of its variants.
+
+       X/Open  Curses  Issue  4  (1995)  specified  getnstr,  mvwgetnstr,  and
+       mvgetnstr.
+
+
+

SEE ALSO

+       curs_get_wstr(3x) describes comparable functions of the ncurses library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x),     curs_addch(3x),     curs_getch(3x),    curs_inopts(3x),
+       curs_termattrs(3x),
+
+
+
+ncurses 6.5                       2024-06-22                   curs_getstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_getyx.3x.html b/contrib/ncurses/doc/html/man/curs_getyx.3x.html new file mode 100644 index 00000000..f12c587b --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_getyx.3x.html @@ -0,0 +1,126 @@ + + + + + + +curs_getyx 3x 2024-06-08 ncurses 6.5 Library calls + + + + +

curs_getyx 3x 2024-06-08 ncurses 6.5 Library calls

+
+curs_getyx(3x)                   Library calls                  curs_getyx(3x)
+
+
+
+
+

NAME

+       getyx,  getparyx,  getbegyx,  getmaxyx  -  get curses cursor and window
+       coordinates
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       void getyx(WINDOW *win, int y, int x);
+       void getbegyx(WINDOW *win, int y, int x);
+       void getmaxyx(WINDOW *win, int y, int x);
+
+       void getparyx(WINDOW *win, int y, int x);
+
+
+

DESCRIPTION

+       These macros obtain the cursor position and  bounds  information  of  a
+       curses window win.  getyx stores win's cursor position in the variables
+       y and x.  getmaxyx stores win's maximum valid line and  column  numbers
+       in  y  and  x, respectively.  getbegyx similarly stores the position of
+       win's origin  relative  to  that  of  the  screen  (for  stdscr,  these
+       coordinates are always 0).
+
+       If  win  is a subwindow (see subwin(3x)), the getparyx macro places the
+       coordinates of its origin relative to its parent window into y  and  x,
+       and -1 into both if it is not.
+
+
+

RETURN VALUE

+       No return values are defined for macros.  Do not use them as the right-
+       hand side of assignment statements.
+
+
+

NOTES

+       All of these interfaces are implemented as macros.  An "&" operator  is
+       not necessary before the variables y and x.
+
+
+

PORTABILITY

+       These macros are described in X/Open Curses, Issue 4.
+
+       ncurses  also  provides  functions  getbegx, getbegy, getcurx, getcury,
+       getmaxx, getmaxy, getparx, and getpary  for  compatibility  with  older
+       versions of curses; see curs_legacy(3x).
+
+       Although X/Open Curses does not address the issue, many implementations
+       expose members of the WINDOW structure containing values  corresponding
+       to   these   macros.    Do   not   rely  on  their  availability;  some
+       implementations make WINDOW opaque (that is, they do not  allow  direct
+       access to its members).
+
+       Besides the problem of opaque structures, the data stored in like-named
+       members  may  not  have  values   of   the   same   meaning   different
+       implementations.    For   example,   the  values  of  WINDOW._maxx  and
+       WINDOW._maxy in ncurses have long  differed  by  one  from  some  other
+       implementations.  The getmaxyx macro hides this difference.
+
+
+

SEE ALSO

+       curses(3x), curs_legacy(3x), curs_opaque(3x)
+
+
+
+ncurses 6.5                       2024-06-08                    curs_getyx(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_in_wch.3x.html b/contrib/ncurses/doc/html/man/curs_in_wch.3x.html new file mode 100644 index 00000000..2078aecf --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_in_wch.3x.html @@ -0,0 +1,124 @@ + + + + + + +curs_in_wch 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_in_wch 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_in_wch(3x)                  Library calls                 curs_in_wch(3x)
+
+
+
+
+

NAME

+       in_wch,  win_wch,  mvin_wch, mvwin_wch - get a curses complex character
+       from a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int in_wch(cchar_t * wch);
+       int win_wch(WINDOW * win, cchar_t * wch);
+       int mvin_wch(int y, int x, cchar_t * wch);
+       int mvwin_wch(WINDOW * win, int y, int x, cchar_t * wch);
+
+
+

DESCRIPTION

+       win_wch copies the curses complex character at the cursor  position  in
+       win  into  wch.   Use  getcchar(3x)  to  extract  its  character  code,
+       attributes, and  color  pair  identifier.   ncurses(3x)  describes  the
+       variants of this function.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if win is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       in_wch, mvin_wch, and mvwin_wch may be implemented as macros.
+
+       Unlike winch(3x), win_wch and its  variants  store  the  value  of  the
+       retrieved  character  in  an  additional  wch  parameter instead of the
+       return value.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+
+

HISTORY

+       These  functions  were  initially  specified by X/Open Curses, Issue 4.
+       The System V  Interface  Definition,  Version  4  (1995),  specified  a
+       function  named  winwch  (and  the  usual  variants).  This was a later
+       addition to SVr4.x,  not  appearing  in  the  first  SVr4  (1989).   It
+       differed  from  X/Open's  later  win_wch in that it returned a value of
+       type chtype instead of cchar_t.
+
+
+

SEE ALSO

+       curs_inch(3x) describes comparable functions of the ncurses library  in
+       its non-wide-character configuration.
+
+       curses(3x), curs_inwstr(3x)
+
+
+
+ncurses 6.5                       2024-07-27                   curs_in_wch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_in_wchstr.3x.html b/contrib/ncurses/doc/html/man/curs_in_wchstr.3x.html new file mode 100644 index 00000000..74a3b4bf --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_in_wchstr.3x.html @@ -0,0 +1,135 @@ + + + + + + +curs_in_wchstr 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_in_wchstr 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_in_wchstr(3x)               Library calls              curs_in_wchstr(3x)
+
+
+
+
+

NAME

+       in_wchstr,    in_wchnstr,    win_wchstr,    win_wchnstr,   mvin_wchstr,
+       mvin_wchnstr,  mvwin_wchstr,  mvwin_wchnstr  -  get  a  curses  complex
+       character string from a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int in_wchstr(cchar_t *wchstr);
+       int win_wchstr(WINDOW *win, cchar_t *wchstr);
+       int mvin_wchstr(int y, int x, cchar_t *wchstr);
+       int mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wchstr);
+
+       int in_wchnstr(cchar_t *wchstr, int n);
+       int win_wchnstr(WINDOW *win, cchar_t *wchstr, int n);
+       int mvin_wchnstr(int y, int x, cchar_t *wchstr, int n);
+       int mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wchstr, int n);
+
+
+

DESCRIPTION

+       These  functions  return  an  array  of  complex  characters in wchstr,
+       starting  at  the  current  cursor  position  in  the   named   window.
+       Attributes (rendition) are stored with the characters.
+
+       The  four  functions  with  n  as  the  last  argument return a leading
+       substring at most n characters long (exclusive of the  trailing  zeroed
+       cchar_t.   Transfer  stops  at  the  end of the current line, or when n
+       characters have been stored at the location referenced by wchstr.
+
+       Constants defined in <curses.h> can be used with the  &  (logical  AND)
+       operator  to  extract  the  character  or  the attribute alone from any
+       position in the wchstr [see getcchar(3x)].
+
+
+

RETURN VALUE

+       Upon successful completion, these functions return OK.  Otherwise, they
+       return ERR.
+
+       X/Open Curses defines no error conditions.  This implementation returns
+       ERR
+
+       o   if the win parameter is null or
+
+       o   if the wchstr parameter is null.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All routines except win_wchnstr may be macros.
+
+       Reading  a  line  that  overflows  the  array pointed to by wchstr with
+       in_wchstr, mvin_wchstr, mvwin_wchstr  or  win_wchstr  causes  undefined
+       results.     Therefore,    the   use   of   in_wchnstr,   mvin_wchnstr,
+       mvwin_wchnstr, or win_wchnstr is recommended.
+
+
+

PORTABILITY

+       X/Open Curses defines no error conditions.  This implementation  checks
+       for null pointers, returning ERR in that case.
+
+
+

SEE ALSO

+       curs_inchstr(3x)  describes comparable functions of the ncurses library
+       in its non-wide-character configuration.
+
+       curses(3x), curs_inwstr(3x), curs_in_wch(3x)
+
+
+
+ncurses 6.5                       2024-05-25                curs_in_wchstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_inch.3x.html b/contrib/ncurses/doc/html/man/curs_inch.3x.html new file mode 100644 index 00000000..8a0eab01 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_inch.3x.html @@ -0,0 +1,136 @@ + + + + + + +curs_inch 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_inch 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_inch(3x)                    Library calls                   curs_inch(3x)
+
+
+
+
+

NAME

+       inch, winch, mvinch, mvwinch - get a curses character from a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       chtype inch(void);
+       chtype winch(WINDOW * win);
+       chtype mvinch(int y, int x);
+       chtype mvwinch(WINDOW * win, int y, int x);
+
+
+

DESCRIPTION

+       winch  returns the curses character, including its attributes and color
+       pair identifier, at the cursor position in the window win.   Subsection
+       "Video  Attributes"  of  attron(3x)  explains how to extract these data
+       from a chtype.  ncurses(3x) describes the variants of this function.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return return ERR if win is NULL.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       inch, mvinch, and mvwinch may be implemented as macros.
+
+       These  functions  do  not  fail  if the window contains cells of curses
+       complex characters; that is, if  they  contain  characters  with  codes
+       wider  than  eight  bits  (or  greater  than 255 as an unsigned decimal
+       integer).  They instead extract only the low-order eight  bits  of  the
+       character code from the cell.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+
+

HISTORY

+       The original curses in 4BSD (1980) defined winch as a  macro  accessing
+       the  WINDOW  structure member representing character cell data, at that
+       time a char, containing  only  a  7-bit  ASCII  character  code  and  a
+       "standout" attribute bit, the only one the library supported.
+
+       SVr2  curses (1984) extended this approach, widening the character code
+       to eight bits and permitting several attributes to be combined with  it
+       by  storing  them  together  in  a  chtype, an alias of unsigned short.
+       Because a macro was used, its value was not type-checked as a  function
+       return  value  could have been.  Goodheart documented SVr3 (1987) winch
+       as returning an  int.   SVr3.1's  (1987)  chtype  became  an  alias  of
+       unsigned  long,  using  16 bits for the character code and widening the
+       type in practical terms to 32 bits, as 64-bit Unix systems were not yet
+       in wide use, and fixed-width integral types would not be standard until
+       ISO C99.  SVr3.2 (1988) added a 6-bit color pair  identifier  alongside
+       the attributes.
+
+
+

SEE ALSO

+       curs_in_wch(3x)  describes  comparable functions of the ncurses library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x), curs_instr(3x)
+
+
+
+ncurses 6.5                       2024-07-27                     curs_inch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_inchstr.3x.html b/contrib/ncurses/doc/html/man/curs_inchstr.3x.html new file mode 100644 index 00000000..87c2c2f4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_inchstr.3x.html @@ -0,0 +1,137 @@ + + + + + + +curs_inchstr 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_inchstr 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_inchstr(3x)                 Library calls                curs_inchstr(3x)
+
+
+
+
+

NAME

+       inchstr,   inchnstr,   winchstr,   winchnstr,   mvinchstr,  mvinchnstr,
+       mvwinchstr, mvwinchnstr - get a curses character string from a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int inchstr(chtype *chstr);
+       int inchnstr(chtype *chstr, int n);
+       int winchstr(WINDOW *win, chtype *chstr);
+       int winchnstr(WINDOW *win, chtype *chstr, int n);
+
+       int mvinchstr(int y, int x, chtype *chstr);
+       int mvinchnstr(int y, int x, chtype *chstr, int n);
+       int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr);
+       int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n);
+
+
+

DESCRIPTION

+       These routines return a NULL-terminated  array  of  chtype  quantities,
+       starting  at the current cursor position in the named window and ending
+       at the right margin of the window.
+
+       The four functions with n  as  the  last  argument,  return  a  leading
+       substring  at  most  n  characters  long  (exclusive  of  the  trailing
+       (chtype)0).  Transfer stops at the end of the current line, or  when  n
+       characters have been stored at the location referenced by chstr.
+
+       Constants  defined  in  <curses.h> can be used with the & (logical AND)
+       operator to extract the character  or  the  attribute  alone  from  any
+       position in the chstr [see curs_inch(3x)].
+
+
+

RETURN VALUE

+       All  routines  return the integer ERR upon failure and an integer value
+       other than ERR upon successful completion  (the  number  of  characters
+       retrieved, exclusive of the trailing 0).
+
+       X/Open Curses defines no error conditions.  This implementation returns
+       ERR
+
+       o   if the win parameter is null or
+
+       o   if the chstr parameter is null.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All routines except winchnstr may be macros.
+
+       SVr4 does not document whether the result string is zero-terminated; it
+       does not document whether a length limit argument includes any trailing
+       0; and it does not document the meaning of the return value.
+
+       Reading  a  line  that  overflows  the  array  pointed to by chstr with
+       inchstr, mvinchstr, mvwinchstr or winchstr  causes  undefined  results.
+       Therefore,  the  use of inchnstr, mvinchnstr, mvwinchnstr, or winchnstr
+       is recommended.
+
+
+

PORTABILITY

+       These functions are described in X/Open Curses, Issue 4.  It is no more
+       specific  than  the  SVr4  documentation  on  the  trailing 0.  It does
+       specify that the successful return of the functions is OK.
+
+
+

SEE ALSO

+       curses(3x), curs_inch(3x), curs_inwstr(3x), curs_in_wchstr(3x)
+
+
+
+ncurses 6.5                       2024-05-25                  curs_inchstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_initscr.3x.html b/contrib/ncurses/doc/html/man/curs_initscr.3x.html new file mode 100644 index 00000000..456765d2 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_initscr.3x.html @@ -0,0 +1,350 @@ + + + + + + +curs_initscr 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_initscr 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_initscr(3x)                 Library calls                curs_initscr(3x)
+
+
+
+
+

NAME

+       initscr,  newterm,  endwin, isendwin, set_term, delscreen - initialize,
+       manipulate, or tear down curses terminal interface
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       WINDOW * initscr(void);
+       int endwin(void);
+
+       bool isendwin(void);
+
+       SCREEN * newterm(const char * type, FILE * outf, FILE * inf);
+       SCREEN * set_term(SCREEN * new);
+       void delscreen(SCREEN * sp);
+
+
+

DESCRIPTION

+
+

initscr

+       initscr determines the terminal  type  and  initializes  the  library's
+       SCREEN,  WINDOW,  and  other data structures.  It is normally the first
+       curses function call a program performs.  However, an application  with
+       unusual needs might employ a few other curses functions beforehand:
+
+       o   slk_init(3x) to set up soft-label keys;
+
+       o   filter(3x)  if  the  program  is  designed  to operate in a process
+           pipeline;
+
+       o   ripoffline(3x) to reserve up to five lines at the top and/or bottom
+           of  the  screen  from  management  by  stdscr,  the standard curses
+           window; and
+
+       o   use_env(3x) and/or use_tioctl(3x) to configure use of  the  process
+           environment  and  operating system's terminal driver, respectively,
+           when determining the dimensions of the terminal display.
+
+       Further, a curses program might call newterm prior  to  or  instead  of
+       initscr in two specialized cases described in its subsection below.
+
+       initscr  causes  the  first  refresh(3x)  call to clear the screen.  If
+       errors occur, initscr writes an appropriate diagnostic message  to  the
+       standard  error  stream  and  exits; otherwise, it returns a pointer to
+       stdscr.
+
+
+

newterm

+       An application that manages multiple terminals should call newterm once
+       for each such device instead of initscr.  newterm's arguments are
+
+       o   the  type  of  the  associated  terminal,  or  NULL to use the TERM
+           environment variable;
+
+       o   an output stream outf connected to the terminal; and
+
+       o   an input stream inf  connected  to  the  terminal.   It  returns  a
+           variable  of  structure  type  SCREEN  *, which should be saved for
+           later use with set_term and delscreen.
+
+       newterm passes the file descriptor of the output stream to the terminfo
+       function setupterm(3x), which returns a pointer to a TERMINAL structure
+       that newterm stores in the SCREEN it returns to the application.
+
+       An application that needs to inspect a terminal type's capabilities, so
+       that  it  can  continue  to run in a line-oriented mode if the terminal
+       cannot support a screen-oriented program, would also use  newterm.   If
+       at most one terminal connection is needed, the programmer could perform
+       such a capability test, decide which mode in  which  to  operate,  then
+       call  delscreen  on  the  pointer returned by newterm, and proceed with
+       either initscr or a non-curses interface.
+
+
+

endwin

+       The program must also call endwin for each terminal being  used  before
+       exiting  from curses.  If newterm is called more than once for the same
+       terminal, the first terminal referred to must be the last one for which
+       endwin is called.
+
+       A  program  should always call endwin before exiting the application or
+       temporarily suspending curses's management of the terminal.  endwin:
+
+       o   resets colors to correspond with the default color pair 0,
+
+       o   moves the cursor to the lower left-hand corner of the screen,
+
+       o   clears the remainder of the  line  so  that  it  uses  the  default
+           colors,
+
+       o   sets the cursor to normal visibility (see curs_set(3x)),
+
+       o   if  applicable, stops cursor-addressing mode using the exit_ca_mode
+           (rmcup) terminal capability, and
+
+       o   restores terminal modes (see reset_shell_mode(3x)).
+
+       Calling refresh(3x) or doupdate(3x) after  a  temporary  escape  causes
+       curses to resume managing the terminal.
+
+
+

isendwin

+       isendwin  returns TRUE if endwin has been called without any subsequent
+       calls to wrefresh(3x), and FALSE otherwise.
+
+
+

set_term

+       set_term re-orients the curses library's operations to another terminal
+       when the application has arranged to manage more than one with newterm.
+       set_term expects a SCREEN pointer previously returned by newterm as  an
+       argument,  and  returns  the previous one.  set_term is the only curses
+       API function that manipulates SCREEN pointers; all others  affect  only
+       the current terminal.
+
+
+

delscreen

+       delscreen  frees  the  storage  backing  the  supplied  SCREEN  pointer
+       argument.  endwin does not, so that an application can resume  managing
+       a  terminal  with  curses  after  a (possibly conditional or temporary)
+       suspension; see curs_kernel(3x).  Call delscreen after  endwin  when  a
+       particular SCREEN structure is no longer needed.
+
+
+

RETURN VALUE

+       endwin returns OK on success and ERR on failure.
+
+       In ncurses,
+
+       o   endwin returns ERR if
+
+           o   the terminal was not initialized,
+
+           o   endwin is called more than once without updating the screen, or
+
+           o   reset_shell_mode(3x) returns ERR.
+
+       o   newterm  returns  ERR  if it cannot allocate storage for the SCREEN
+           data structure or the top-level windows  thereof:  curscr,  newscr,
+           and stdscr.
+
+       Functions  that  return  pointers  return  NULL  on error.  In ncurses,
+       set_term does not fail.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+
+

Differences

+       X/Open  Curses  specifies  that  portable  applications  must  not call
+       initscr more than once:
+
+       o   The portable way to use initscr is once only, using refresh(3x)  to
+           restore the screen after endwin.
+
+       o   This implementation allows using initscr after endwin.
+
+       Old versions of curses, e.g., BSD 4.4, would return a null pointer from
+       initscr when an error is detected, rather than exiting.  It is safe but
+       redundant to check the return value of initscr in X/Open Curses.
+
+       Calling  endwin  does not dispose of the memory allocated in initscr or
+       newterm.  Deleting a SCREEN provides a way to do this:
+
+       o   X/Open Curses does not say what happens to WINDOWs  when  delscreen
+           "frees  storage  associated  with  the  SCREEN"  nor  does the SVr4
+           documentation help, adding that it should be called after endwin if
+           a SCREEN is no longer needed.
+
+       o   However,  WINDOWs are implicitly associated with a SCREEN.  so that
+           it is reasonable to expect delscreen to deal with these.
+
+       o   SVr4 curses deletes  the  standard  WINDOW  structures  stdscr  and
+           curscr  as  well  as a work area newscr.  SVr4 curses ignores other
+           windows.
+
+       o   Since version 4.0 (1996), ncurses has  maintained  a  list  of  all
+           windows  for  each  screen,  using that information to delete those
+           windows when delscreen is called.
+
+       o   NetBSD copied this feature of ncurses in  2001.   PDCurses  follows
+           the SVr4 model, deleting only the standard WINDOW structures.
+
+
+

High-level versus Low-level

+       Different  implementations  may  disagree  regarding  the level of some
+       functions.  For example, SCREEN  (returned  by  newterm)  and  TERMINAL
+       (returned  by  setupterm(3x))  hold  file  descriptors  for  the output
+       stream.  If an application switches screens using set_term, or switches
+       terminals using set_curterm(3x), applications which use the output file
+       descriptor can have different behavior  depending  on  which  structure
+       holds the corresponding descriptor.
+
+       o   NetBSD's   baudrate  function  uses  the  descriptor  in  TERMINAL.
+           ncurses and SVr4 curses use the descriptor in SCREEN.
+
+       o   NetBSD and ncurses use the descriptor in TERMINAL for terminal  I/O
+           modes,  e.g.,  def_shell_mode(3x),  def_prog_mode(3x).  SVr4 curses
+           uses the descriptor in SCREEN.
+
+   Unset TERM Variable
+       If the TERM variable is  missing  or  empty,  initscr  uses  the  value
+       "unknown",  which  normally  corresponds  to  a terminal entry with the
+       generic (gn) capability.  Generic entries are detected by setupterm(3x)
+       and  cannot  be  used for full-screen operation.  Other implementations
+       may handle a missing/empty TERM variable differently.
+
+
+

Signal Handlers

+       Quoting from X/Open Curses Issue 7, section 3.1.1:
+
+            Curses implementations may provide for  special  handling  of  the
+            SIGINT,  SIGQUIT,  and  SIGTSTP  signals  if  their disposition is
+            SIG_DFL at the time initscr is called...
+
+            Any special handling for these signals may remain  in  effect  for
+            the  life  of  the  process  or  until  the  process  changes  the
+            disposition of the signal.
+
+            None of the Curses functions are required to be safe with  respect
+            to signals...
+
+       This  implementation establishes signal handlers during initialization,
+       e.g., initscr or newterm.  Applications which must handle these signals
+       should  set  up  the  corresponding  handlers  after  initializing  the
+       library:
+
+       SIGINT
+            The handler attempts to clean up the screen on exit.  Although  it
+            usually works as expected, there are limitations:
+
+            o   Walking  the  SCREEN list is unsafe, since all list management
+                is done without any signal blocking.
+
+            o   On systems which  have  REENTRANT  turned  on,  set_term  uses
+                functions which could deadlock or misbehave in other ways.
+
+            o   endwin  calls  other  functions, many of which use stdio(3) or
+                other library functions which are clearly unsafe.
+
+       SIGTERM
+            This uses the same handler as SIGINT, with the  same  limitations.
+            It  is  not  mentioned  in X/Open Curses, but is more suitable for
+            this purpose than SIGQUIT (which is used in debugging).
+
+       SIGTSTP
+            This handles the stop signal, used in job control.  When  resuming
+            the  process,  this  implementation  discards  pending  input with
+            flushinp(3x), and repaints the screen assuming that  it  has  been
+            completely altered.  It also updates the saved terminal modes with
+            def_shell_mode(3x).
+
+       SIGWINCH
+            This handles the window-size changes which  were  ignored  in  the
+            standardization   efforts.    The  handler  sets  a  (signal-safe)
+            variable that is later tested by wgetch(3x) and wget_wch(3x).
+
+            o   wgetch returns the key code KEY_RESIZE.
+
+            o   wget_wch returns KEY_CODE_YES and sets its  wch  parameter  to
+                KEY_RESIZE.
+
+            At  the same time, ncurses calls resizeterm to adjust the standard
+            screen stdscr, and update other data such as LINES and COLS.
+
+
+

SEE ALSO

+       curses(3x),    curs_kernel(3x),     curs_refresh(3x),     curs_slk(3x),
+       curs_terminfo(3x), curs_util(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-21                  curs_initscr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_inopts.3x.html b/contrib/ncurses/doc/html/man/curs_inopts.3x.html new file mode 100644 index 00000000..ffb08c4c --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_inopts.3x.html @@ -0,0 +1,417 @@ + + + + + + +curs_inopts 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_inopts 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_inopts(3x)                  Library calls                 curs_inopts(3x)
+
+
+
+
+

NAME

+       cbreak,  echo, halfdelay, intrflush, is_cbreak, is_echo, is_nl, is_raw,
+       keypad, meta, nl, nocbreak, nodelay, noecho,  nonl,  noqiflush,  noraw,
+       notimeout,  qiflush,  raw,  timeout,  wtimeout, typeahead - get and set
+       curses terminal input options
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int cbreak(void);
+       int nocbreak(void);
+
+       int echo(void);
+       int noecho(void);
+
+       int intrflush(WINDOW * win /* ignored */, bool bf);
+       int keypad(WINDOW * win, bool bf);
+       int meta(WINDOW * win /* ignored */, bool bf);
+       int nodelay(WINDOW * win, bool bf);
+       int notimeout(WINDOW * win, bool bf);
+
+       int nl(void);
+       int nonl(void);
+
+       void qiflush(void);
+       void noqiflush(void);
+
+       int raw(void);
+       int noraw(void);
+
+       int halfdelay(int tenths);
+       void timeout(int delay);
+       void wtimeout(WINDOW * win, int delay);
+
+       int typeahead(int fd);
+
+       /* extensions */
+       int is_cbreak(void);
+       int is_echo(void);
+       int is_nl(void);
+       int is_raw(void);
+
+
+

DESCRIPTION

+       curses offers configurable  parameters  permitting  an  application  to
+       control  the  handling  of  input  from the terminal.  Some are global,
+       applying to all windows; others apply only to a specific  window.   The
+       library  does not automatically apply such parameters to new or derived
+       windows; an application must configure  each  window  for  the  desired
+       behavior.
+
+       Some  descriptions  below  make reference to an input character reading
+       function: this is wgetch(3x) in the non-wide character curses  API  and
+       wget_wch(3x)  in  the  wide  character API.  In addition to the variant
+       forms  of  these  described  in  ncurses(3x),  the   curses   functions
+       wgetstr(3x)   and   wget_wstr(3x)  and  their  own  variants  call  the
+       appropriate input character reading function.
+
+
+

cbreak, nocbreak

+       Normally, the terminal driver buffers typed characters, not  delivering
+       them  to  an application until a line feed or carriage return is typed.
+       cbreak configures the terminal in  cbreak  mode,  which  disables  line
+       buffering and erase and kill character processing (the interrupt, quit,
+       suspend,  and  flow  control  characters  are  unaffected)  and   makes
+       characters  typed  by  the  user  immediately available to the program.
+       nocbreak restores the terminal's normal ("cooked") line discipline.
+
+       The state of the terminal is unknown to a curses  application  when  it
+       starts; therefore, a program should call cbreak or nocbreak explicitly.
+       Most interactive programs using curses set cbreak mode.  Calling cbreak
+       overrides  raw.   The man page for the input character reading function
+       discusses how cbreak and nocbreak interact with echo and noecho.
+
+
+

echo, noecho

+       echo and noecho determine whether characters  typed  by  the  user  are
+       written to the curses window by the input character reading function as
+       they are typed.  curses  always  disables  the  terminal  driver's  own
+       echoing.  By default, a curses screen's echo option is set.  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 call
+       noecho.   The  man  page  for  the  input  character  reading  function
+       discusses how echo and noecho interact with cbreak and nocbreak.
+
+
+

halfdelay

+       halfdelay  configures  half-delay mode, which is similar to cbreak mode
+       in that characters typed by the user are immediately available  to  the
+       program.   However,  after  blocking  for  tenths tenths of seconds, an
+       input character reading function returns ERR if no  input  is  pending.
+       The  value  of tenths must be between 1 and 255.  Use nocbreak to leave
+       half-delay mode.
+
+
+

intrflush

+       intrflush calls qiflush (see below) if bf is TRUE, and noqiflush if  bf
+       is FALSE.  It ignores its win argument.
+
+
+

keypad

+       keypad  enables  recognition of a terminal's function keys.  If enabled
+       (bf is TRUE), the input character  reading  function  returns  a  value
+       representing  the  function key, such as KEY_LEFT.  (Wide-character API
+       users: wget_wch(3x) returns KEY_CODE_YES to indicate  the  availability
+       of  a  function  key  code  in  its wch parameter.)  If disabled (bf is
+       FALSE), curses does not treat function keys specially and  the  program
+       has to interpret escape sequences itself.  If the terminal's keypad can
+       be turned on (made to transmit) and off (made to work locally),  keypad
+       configures  it  consistently  with  the  bf  parameter.   By default, a
+       window's keypad mode is off.
+
+
+

meta

+       Initially, whether the terminal returns 7- or 8-bit character codes  on
+       input  depends  on  the  configuration of the terminal driver; on POSIX
+       systems, see  termios(3).   To  force  8  bits  to  be  returned,  call
+       meta(...,  TRUE);  this is equivalent, on POSIX systems, to setting the
+       CS8 flag on the terminal.   To  force  7  bits  to  be  returned,  call
+       meta(...,  FALSE); this is equivalent, on POSIX systems, to setting the
+       CS7 flag on the terminal.  The window argument, win, is always ignored.
+       If  the  terminfo  string capabilities meta_on (smm) and meta_off (rmm)
+       are defined for the terminal type, enabling meta mode sends smm to  the
+       terminal and disabling it sends rmm to the terminal.
+
+
+

nl, nonl

+       Initially,  whether  the  terminal  reports a carriage return using the
+       character code for a line feed in cbreak or raw modes  depends  on  the
+       configuration  of  the  terminal driver; see termios(3).  nl configures
+       the terminal to perform this translation.  nonl disables it.  Under its
+       normal   ("cooked")   line   discipline,  the  terminal  driver  always
+       translates carriage returns to line feeds.
+
+
+

nodelay

+       nodelay configures the input character  reading  function  to  be  non-
+       blocking  for  window  win.  If no input is ready, the reading function
+       returns ERR.  If disabled (bf is FALSE), the reading function does  not
+       return until it has input.
+
+
+

notimeout

+       When  the  input  character reading function reads an ESC character, it
+       sets a timer while waiting  for  the  next  character.   notimeout(win,
+       TRUE)   disables  this  timer.   The  purpose  of  the  timeout  is  to
+       distinguish sequences produced by a function key from those typed by  a
+       user.   To configure the timeout rather than disabling it, see wtimeout
+       below.
+
+
+

qiflush, noqiflush

+       qiflush and noqiflush configure the terminal driver's treatment of  its
+       input and output queues when it handles the interrupt, suspend, or quit
+       characters under the normal ("cooked") or cbreak  line  disciplines  on
+       POSIX  systems; see termios(3).  The default behavior is inherited from
+       the terminal driver settings.  Calling qiflush configures the  terminal
+       to  flush  the  queues  when  any  of  these  events occurs, giving the
+       impression of faster response to user input, but making  the  library's
+       model  of  the  screen  contents incorrect.  Calling noqiflush prevents
+       such flushing, but might frustrate impatient users on slow  connections
+       if  a curses update of the screen is in progress when the event occurs;
+       see typeahead below for a mitigation of this problem.  You may want  to
+       call noqiflush in a signal handler if you want output to continue after
+       the handler exits as though the interrupt had not occurred.
+
+
+

raw, noraw

+       raw configures the terminal to read input in raw mode, which is similar
+       to  cbreak  mode  (see  cbreak above) except that it furthermore passes
+       through the terminal's configured interrupt, quit,  suspend,  and  flow
+       control   characters  uninterpreted  to  the  application,  instead  of
+       generating a signal or  acting  on  I/O  flow.   The  behavior  of  the
+       terminal's   "Break"   key   (if   any)   depends  on  terminal  driver
+       configuration parameters that curses does not handle.   noraw  restores
+       the terminal's normal ("cooked") line discipline.
+
+
+

timeout, wtimeout

+       wtimeout  configures  whether a curses input character reading function
+       called on window win uses blocking or non-blocking reads.  If delay  is
+       negative,  a blocking read is used, waiting indefinitely for input.  If
+       delay is zero, a non-blocking read is used; an input character  reading
+       function  returns ERR if no input is pending.  If delay is positive, an
+       input character reading function blocks  for  delay  milliseconds,  and
+       returns  ERR  if the delay elapses and there is still no input pending.
+       timeout calls wtimeout on stdscr.
+
+
+

typeahead

+       Normally, a curses library checks the terminal for input while updating
+       the  screen.   If  any is found, the update is postponed until the next
+       wrefresh(3x) or doupdate(3x) call, allowing faster response to user key
+       strokes.   The  library  tests the file descriptor corresponding to the
+       FILE stream pointer passed to newterm(3x) (or stdin if initscr(3x)  was
+       called),  for  pending  input.  typeahead instructs curses to test file
+       descriptor fd instead.  An fd of -1 disables the check.
+
+
+

RETURN VALUE

+       timeout and wtimeout return no value.
+
+       cbreak, nocbreak, echo, noecho,  halfdelay,  intrflush,  keypad,  meta,
+       nodelay,  notimeout,  nl,  nonl, raw, noraw, and typeahead return OK on
+       success and ERR on failure.
+
+       In ncurses, the functions in the previous paragraph return ERR if
+
+       o   the terminal is not initialized or
+
+       o   win is NULL (except  for  intrflush  and  meta,  which  ignore  its
+           value).
+
+       Further, halfdelay returns ERR if delay is outside the range 1..255.
+
+       See  section  "EXTENSIONS"  below  for  the return values of is_cbreak,
+       is_echo, is_nl, and is_raw.
+
+
+

NOTES

+       echo, noecho, halfdelay, intrflush, meta, nl, nonl, nodelay, notimeout,
+       noqiflush, qiflush, timeout, and wtimeout may be implemented as macros.
+
+       noraw  and  nocbreak follow historical practice in that they attempt to
+       restore the terminal's normal ("cooked") line discipline from  raw  and
+       cbreak,  respectively.   Mixing  raw/noraw  calls  with cbreak/nocbreak
+       calls leads to terminal driver control states that are hard to  predict
+       or understand; doing so is not recommended.
+
+
+

EXTENSIONS

+       ncurses  provides  four  "is_" functions corresponding to cbreak, echo,
+       nl, and raw, permitting their states to be queried by the application.
+
+                            Query       Set      Reset
+                            ------------------------------
+                            is_cbreak   cbreak   nocbreak
+                            is_echo     echo     noecho
+                            is_nl       nl       nonl
+                            is_raw      raw      noraw
+
+       In each case, the function returns
+
+       1    if the option is set,
+
+       0    if the option is reset, or
+
+       -1   if the library is not initialized.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       Except  as  noted in section "EXTENSIONS" above, X/Open Curses, Issue 4
+       describes these functions.  It specifies no error conditions for them.
+
+       SVr4 curses describes a successful return value  only  as  "an  integer
+       value other than ERR".
+
+       ncurses  follows  X/Open Curses and the historical practice of System V
+       curses, clearing the terminal driver's "echo"  flag  when  initializing
+       the  screen.  BSD curses did not, but its raw function turned it off as
+       a side effect.  For best portability, call echo  or  noecho  explicitly
+       just  after initialization, even if your program retains the terminal's
+       normal ("cooked") line discipline.
+
+       X/Open Curses is ambiguous regarding whether  raw  should  disable  the
+       carriage  return and line feed translation feature controlled by nl and
+       nonl.  BSD curses did turn off these translations; System V curses  did
+       not.   ncurses  does so, on the assumption that a programmer requesting
+       raw input wants a clean (ideally,  8-bit  clean)  connection  that  the
+       operating system will not alter.
+
+       When keypad is first enabled, ncurses loads the key definitions for the
+       current terminal description.  If  the  terminal  description  includes
+       extended  string  capabilities,  for example, by using the -x option of
+       tic(1), then ncurses also defines keys for the capabilities whose names
+       begin  with  "k".  Corresponding key codes are generated and (depending
+       on previous  loads  of  terminal  descriptions)  may  differ  from  one
+       execution  of  a  program  to  the  next.   The generated key codes are
+       recognized by keyname(3x), which then returns a name beginning with "k"
+       denoting  the terminfo capability name rather than "K", used for curses
+       key names.  On the other hand, an application can use define_key(3x) to
+       bind  a  specific  key  to  a  string of the programmer's choice.  This
+       feature  enables  an  application  to  check  for  its  presence   with
+       tigetstr(3x), and reassign the key code to match its own needs.
+
+       Low-level applications can use tigetstr(3x) to obtain the definition of
+       any string capability.  curses applications  use  the  input  character
+       reading function to obtain key codes from input and rely upon the order
+       in which the string capabilities are loaded.  Multiple  key  capability
+       strings  can  have  the  same  value,  but  the input character reading
+       function can report only one key  code.   Most  curses  implementations
+       (including  ncurses)  load  key definitions in the order they appear in
+       the strfnames array of string capability names; see term_variables(3x).
+       The  last  capability read using a particular definition determines the
+       key code to be reported.  In  ncurses,  extended  capabilities  can  be
+       interpreted  as key definitions.  These are loaded after the predefined
+       keys, and if a capability's value is the same as  a  previously  loaded
+       key definition, the later definition is the one used.
+
+
+

HISTORY

+       4BSD curses (1980) introduced echo, noecho, nl, nonl, raw, and noraw.
+
+       SVr2 (1984) featured a new terminal driver, extending the curses API to
+       support it with cbreak, nocbreak, intrflush, keypad, meta, nodelay, and
+       typeahead.
+
+       SVr3  (1987)  added  halfdelay,  notimeout,  and wtimeout.  qiflush and
+       noqiflush appeared in SVr3.1 (1987), at which point intrflush became  a
+       wrapper  for  either  of these functions, depending on the value of its
+       Boolean argument.  SVr3.1 also added timeout.
+
+       ncurses 6.5 (2024) introduced is_cbreak, is_echo, is_nl, and is_raw.
+
+       Formerly, ncurses used  nl  and  nonl  to  control  the  conversion  of
+       newlines  to  carriage  return/line  feed  on  output as well as input.
+       X/Open Curses documents the use of  these  functions  only  for  input.
+       This  difference arose from converting the pcurses source (1986), which
+       used ioctl(2) calls and the sgttyb structure,  to  termios  (the  POSIX
+       terminal  API).   In  the former, both input and output were controlled
+       via a single option "CRMOD", while the latter separates these features.
+       Because  that  conversion  interferes with output optimization, ncurses
+       6.2 (2020) amended nl and nonl to eliminate their effect on output.
+
+
+

SEE ALSO

+       curses(3x),    curs_getch(3x),     curs_initscr(3x),     curs_util(3x),
+       define_key(3x), termios(3), term_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-21                   curs_inopts(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_ins_wch.3x.html b/contrib/ncurses/doc/html/man/curs_ins_wch.3x.html new file mode 100644 index 00000000..187c3b76 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_ins_wch.3x.html @@ -0,0 +1,126 @@ + + + + + + +curs_ins_wch 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_ins_wch 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_ins_wch(3x)                 Library calls                curs_ins_wch(3x)
+
+
+
+
+

NAME

+       ins_wch,  wins_wch,  mvins_wch,  mvwins_wch  -  insert a curses complex
+       character in a window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int ins_wch(const cchar_t * wch);
+       int wins_wch(WINDOW * win, const cchar_t * wch);
+       int mvins_wch(int y, int x, const cchar_t * wch);
+       int mvwins_wch(WINDOW * win, int y, int x, const cchar_t * wch);
+
+
+

DESCRIPTION

+       These functions insert the curses complex character wch at  the  cursor
+       in  the  specified window win (or stdscr).  The character previously at
+       the cursor and any to its  right  move  one  cell  to  the  right;  the
+       rightmost  character  on  the  line  is discarded.  The cursor does not
+       advance.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       Functions taking a WINDOW pointer argument fail if the pointer is NULL.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       ins_wch, mvins_wch, and mvwins_wch may be implemented as macros.
+
+       A  terminal's  insert_character  (ich1)  capability  is not necessarily
+       employed.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.
+
+       SVr4 describes successful return values only as "an integer value other
+       than ERR".
+
+
+

HISTORY

+       These  functions  were  initially  specified by X/Open Curses, Issue 4.
+       The System V  Interface  Definition,  Version  4  (1995),  specified  a
+       function  named  winswch  (and  the  usual variants).  This was a later
+       addition to SVr4.x,  not  appearing  in  the  first  SVr4  (1989).   It
+       differed  from  X/Open's  later wins_wch in that it took an argument of
+       type chtype instead of cchar_t.
+
+
+

SEE ALSO

+       curs_insch(3x) describes comparable functions in the non-wide-character
+       curses configuration.
+
+       curses(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-07-27                  curs_ins_wch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_ins_wstr.3x.html b/contrib/ncurses/doc/html/man/curs_ins_wstr.3x.html new file mode 100644 index 00000000..53bcf476 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_ins_wstr.3x.html @@ -0,0 +1,149 @@ + + + + + + +curs_ins_wstr 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_ins_wstr 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_ins_wstr(3x)                Library calls               curs_ins_wstr(3x)
+
+
+
+
+

NAME

+       ins_wstr,  wins_wstr,  mvins_wstr,  mvwins_wstr, ins_nwstr, wins_nwstr,
+       mvins_nwstr, mvwins_nwstr - insert a wide-character string in a  curses
+       window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int ins_wstr(const wchar_t * wstr);
+       int wins_wstr(WINDOW * win, const wchar_t * wstr);
+       int mvins_wstr(int y, int x, const wchar_t * wstr);
+       int mvwins_wstr(WINDOW * win, int y, int x, const wchar_t * wstr);
+
+       int ins_nwstr(const wchar_t * wstr, int n);
+       int wins_nwstr(WINDOW * win, const wchar_t * wstr, int n);
+       int mvins_nwstr(int y, int x, const wchar_t * wstr, int n);
+       int mvwins_nwstr(WINDOW * win, int y, int x, const wchar_t * wstr, int n);
+
+
+

DESCRIPTION

+       wins_wstr  inserts a wide-character string wstr before the character at
+       the cursor in window win as if by calling wins_wch(3x) for each wchar_t
+       in  wstr.   No  line wrapping is performed.  Characters to the right of
+       the cursor are shifted right; those at the right edge of the window may
+       be  lost.   wins_wstr  stops  inserting if it would have to wrap to the
+       next line to write the next wchar_t in wstr.  The cursor position  does
+       not change (after moving to (y, x), if specified).  wins_nwstr does the
+       same, but inserts at most n characters, or as many as possible  (up  to
+       the end of the line) if n is -1.  ncurses(3x) describes the variants of
+       these functions.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL,
+
+       o   wstr is NULL,
+
+       o   the first wide character in wstr is a non-spacing character, or
+
+       o   an internal wins_wch(3x) call returns ERR.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except wins_nwstr may be implemented as macros.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       X/Open Curses does not specify what happens if a non-spacing  character
+       follows a control character.
+
+       Issue  4 states that the entire string is inserted if n is less than 1.
+       This is probably an  error,  because  it  is  inconsistent  with  other
+       functions  such  as  waddwstr(3x), and differs from the SVr4 curses and
+       Solaris xcurses implementations.  Nevertheless,  Issue  7  retains  the
+       language.
+
+
+

HISTORY

+       These  functions  were  initially  specified by X/Open Curses, Issue 4.
+       The  System V  Interface  Definition,  Version  4   (1995),   specified
+       functions named winswstr and winsnwstr (and the usual variants).  These
+       were later additions to SVr4.x, not appearing in the first SVr4 (1989).
+       They  differ from X/Open's later wins_wstr and wins_nwstr in that their
+       wstr parameters are not const-qualified.
+
+
+

SEE ALSO

+       curs_insstr(3x) describes comparable functions of the  ncurses  library
+       in its non-wide-character configuration.
+
+       curses(3x), curs_ins_wch(3x), curs_in_wch(3x)
+
+
+
+ncurses 6.5                       2024-09-14                 curs_ins_wstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_insch.3x.html b/contrib/ncurses/doc/html/man/curs_insch.3x.html new file mode 100644 index 00000000..9e36e424 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_insch.3x.html @@ -0,0 +1,120 @@ + + + + + + +curs_insch 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_insch 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_insch(3x)                   Library calls                  curs_insch(3x)
+
+
+
+
+

NAME

+       insch,  winsch,  mvinsch,  mvwinsch  -  insert  a curses character in a
+       window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int insch(chtype ch);
+       int winsch(WINDOW * win, chtype ch);
+       int mvinsch(int y, int x, chtype ch);
+       int mvwinsch(WINDOW * win, int y, int x, chtype ch);
+
+
+

DESCRIPTION

+       These functions insert the curses character ch at  the  cursor  in  the
+       specified  window  win  (or  stdscr).   The character previously at the
+       cursor and any to its right move one cell to the right;  the  rightmost
+       character on the line is discarded.  The cursor does not advance.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       Functions taking a WINDOW pointer argument fail if the pointer is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       insch, mvinsch, and mvwinsch may be implemented as macros.
+
+       A terminal's insert_character  (ich1)  capability  is  not  necessarily
+       employed.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.
+
+       SVr4  curses  describes  a  successful return value only as "an integer
+       value other than ERR".
+
+
+

HISTORY

+       SVr2 (1984) introduced winsch.
+
+
+

SEE ALSO

+       curs_ins_wch(3x) describes comparable functions in  the  wide-character
+       curses configuration.
+
+       curses(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-07-27                    curs_insch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_insstr.3x.html b/contrib/ncurses/doc/html/man/curs_insstr.3x.html new file mode 100644 index 00000000..34b9c28d --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_insstr.3x.html @@ -0,0 +1,143 @@ + + + + + + +curs_insstr 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_insstr 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_insstr(3x)                  Library calls                 curs_insstr(3x)
+
+
+
+
+

NAME

+       insstr,  winsstr,  mvinsstr,  mvinsnstr,  insnstr, winsnstr, mvwinsstr,
+       mvwinsnstr - insert a string in a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int insstr(const char * str);
+       int winsstr(WINDOW * win, const char * str);
+       int mvinsstr(int y, int x, const char * str);
+       int mvwinsstr(WINDOW * win, int y, int x, const char * str);
+
+       int insnstr(const char * str, int n);
+       int winsnstr(WINDOW * win, const char * str, int n);
+       int mvinsnstr(int y, int x, const char * str, int n);
+       int mvwinsnstr(WINDOW * win, int y, int x, const char * str, int n);
+
+
+

DESCRIPTION

+       winsstr inserts a string str before the  character  at  the  cursor  in
+       window  win  as if by calling winsch(3x) for each char in str.  No line
+       wrapping is performed.  Characters to  the  right  of  the  cursor  are
+       shifted  right;  those  at  the  right  edge of the window may be lost.
+       winsstr stops inserting if it would have to wrap to the  next  line  to
+       write the next char in str.  The cursor position does not change (after
+       moving to (y, x), if specified).  insnstr does the same, but inserts at
+       most  n  characters, or as many as possible (up to the end of the line)
+       if n is -1.  ncurses(3x) describes the variants of these functions.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL,
+
+       o   str is NULL, or
+
+       o   an internal winsch(3x) call returns ERR.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except winsnstr may be implemented as macros.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       Issue 4 distinguished insnstr and winsnstr  from  the  other  functions
+       documented  above  by stating they "do not perform wrapping".  This was
+       probably an error, since it makes this group of functions inconsistent.
+       No  implementation  of curses documents this inconsistency, and Issue 7
+       removed it.
+
+       Issue 4 states that the entire string is inserted if n is less than  1.
+       This  is  probably  an  error,  because  it  is inconsistent with other
+       functions such as waddstr(3x), and differs from  the  SVr4  curses  and
+       Solaris  xcurses  implementations.   Nevertheless,  Issue 7 retains the
+       language.
+
+
+

HISTORY

+       SVr3.1 (1987) introduced winsstr and winsnstr.
+
+
+

SEE ALSO

+       curs_ins_wstr(3x) describes comparable functions of the ncurses library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x), curs_inch(3x), curs_ins_wstr(3x), curs_util(3x)
+
+
+
+ncurses 6.5                       2024-07-27                   curs_insstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_instr.3x.html b/contrib/ncurses/doc/html/man/curs_instr.3x.html new file mode 100644 index 00000000..037a6e1f --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_instr.3x.html @@ -0,0 +1,157 @@ + + + + + + +curs_instr 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_instr 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_instr(3x)                   Library calls                  curs_instr(3x)
+
+
+
+
+

NAME

+       instr,  winstr, mvinstr, mvwinstr, innstr, winnstr, mvinnstr, mvwinnstr
+       - get a string from a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int instr(char * str);
+       int winstr(WINDOW * win, char * str);
+       int mvinstr(int y, int x, char * str);
+       int mvwinstr(WINDOW * win, int y, int x, char * str);
+
+       int innstr(char * str, int n);
+       int winnstr(WINDOW * win, char * str, int n);
+       int mvinnstr(int y, int x, char * str, int n);
+       int mvwinnstr(WINDOW * win, int y, int x, char * str, int n);
+
+
+

DESCRIPTION

+       winstr extracts a string from a curses  window  win,  starting  at  the
+       cursor  and  stopping  at  the  end  of the line, and stores it in str,
+       terminating it with a null character and omitting  any  attributes  and
+       color  pair  identifier  that  curses  associates  with each character.
+       winnstr does the same, but copies at most n characters from win.  An  n
+       of  -1  implies  no limit; winnstr then works like winstr.  ncurses(3x)
+       describes the variants of these functions.
+
+
+

RETURN VALUE

+       These functions return the count of characters copied from win to  str,
+       or ERR upon failure.
+
+       In ncurses, they return ERR if
+
+       o   win is NULL or
+
+       o   str is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except winnstr may be implemented as macros.
+
+       Reading a line that overflows the array pointed to by str  with  instr,
+       winstr,  mvinstr, or mvwinstr causes undefined results.  Use of innstr,
+       winnstr, mvinnstr, and mvwinnstr is recommended instead.
+
+
+

EXTENSIONS

+       innstr, winnstr, mvinnstr, and mvwinnstr's treatment of -1 as  a  valid
+       value of n is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       X/Open  Curses  Issues  4 and 7 both state that instr, winstr, mvinstr,
+       and mvwinstr return OK rather than a character count.  This  is  likely
+       an erratum.
+
+       o   SVr3.1  and  SVr4  implemented  winstr as a wrapper around winnstr,
+           returning the latter's return value.  X/Open Curses's specification
+           thus  may  have  been  an editorial solecism copied from System V's
+           documentation (see below) by X/Open,  rather  than  an  intentional
+           change.
+
+       o   ncurses retains compatibility with System V curses behavior.
+
+       SVr4  documents no return values apart from OK and ERR for any of these
+       functions.  SVr4 does not document whether n counts the null terminator
+       that these functions write to str.
+
+
+

HISTORY

+       SVr3.1 (1987) introduced these functions.
+
+
+

SEE ALSO

+       curs_inwstr(3x)  describes  comparable functions of the ncurses library
+       in its wide-character configuration (ncursesw).
+
+       curses(3x), curs_inch(3x), curs_inchstr(3x)
+
+
+
+ncurses 6.5                       2024-09-14                    curs_instr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_inwstr.3x.html b/contrib/ncurses/doc/html/man/curs_inwstr.3x.html new file mode 100644 index 00000000..673ca4ca --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_inwstr.3x.html @@ -0,0 +1,153 @@ + + + + + + +curs_inwstr 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_inwstr 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_inwstr(3x)                  Library calls                 curs_inwstr(3x)
+
+
+
+
+

NAME

+       inwstr,  winwstr,  mvinwstr,  mvwinwstr,  innwstr, winnwstr, mvinnwstr,
+       mvwinnwstr - get a wide-character string from a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int inwstr(wchar_t * wstr);
+       int winwstr(WINDOW * win, wchar_t * wstr);
+       int mvinwstr(int y, int x, wchar_t * wstr);
+       int mvwinwstr(WINDOW * win, int y, int x, wchar_t * wstr);
+
+       int innwstr(wchar_t * wstr, int n);
+       int winnwstr(WINDOW * win, wchar_t * wstr, int n);
+       int mvinnwstr(int y, int x, wchar_t * wstr, int n);
+       int mvwinnwstr(WINDOW * win, int y, int x, wchar_t * wstr, int n);
+
+
+

DESCRIPTION

+       winwstr extracts a wide-character string  from  a  curses  window  win,
+       starting  at the cursor and stopping at the end of the line, and stores
+       it in wstr, terminating it with a wide null character and omitting  any
+       attributes  and  color pair identifier that curses associates with each
+       character.   winnwstr  does  the  same,  but  copies  at  most  n  wide
+       characters  from win.  An n of -1 implies no limit; winnwstr then works
+       like winwstr.  ncurses(3x) describes the variants of these functions.
+
+
+

RETURN VALUE

+       On successful operation, these  functions  return  the  count  of  wide
+       characters  copied  from  win  to  wstr.  They return ERR upon failure.
+       innwstr, winnwstr,  mvinnwstr,  and  mvwinnwstr  return  ERR  if  n  is
+       insufficiently  large  to  store  a  complete  wide  character  string.
+       (Recall that a curses  complex  character  can  contain  multiple  wide
+       characters, some of which may be non-spacing.)
+
+       In ncurses, these functions return ERR if
+
+       o   win is NULL or
+
+       o   wstr is NULL.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       All of these functions except winnwstr may be implemented as macros.
+
+       Reading a line that overflows the array pointed to by str with  inwstr,
+       winwstr,  mvinwstr,  or  mvwinwstr  causes  undefined  results.  Use of
+       innwstr, winnwstr, mvinnwstr, and mvwinnwstr is recommended instead.
+
+
+

EXTENSIONS

+       innwstr, winnwstr, mvinnwstr, and mvwinnwstr's treatment  of  -1  as  a
+       valid value of n is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       Notwithstanding  the foregoing, X/Open Curses Issues 4 and 7 both state
+       that innwstr, winnwstr, mvinnwstr, and mvwinnwstr "fail  ...  [i]f  the
+       array  is  not  large  enough  to  contain  any  complete  characters".
+       Strictly interpreted, this means  that  a  caller  of  these  functions
+       cannot use their return values to detect truncation of a wide-character
+       string copied from more  than  one  character  cell  in  win.   ncurses
+       reports any truncation with ERR.
+
+       X/Open  Curses  specifies  inwstr,  winwstr, mvinwstr, and mvwinwstr as
+       returning OK rather than a (wide) character count,  unlike  their  non-
+       wide  counterparts  instr,  winstr,  mvinstr,  and  mvwinstr.   ncurses
+       regards this inconsistency as an error in the standard.
+
+
+

SEE ALSO

+       curs_instr(3x) describes comparable functions of the ncurses library in
+       its non-wide-character configuration.
+
+       curses(3x), curs_in_wch(3x), curs_in_wchstr(3x)
+
+
+
+ncurses 6.5                       2024-09-14                   curs_inwstr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_kernel.3x.html b/contrib/ncurses/doc/html/man/curs_kernel.3x.html new file mode 100644 index 00000000..0102f43b --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_kernel.3x.html @@ -0,0 +1,292 @@ + + + + + + +curs_kernel 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_kernel 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_kernel(3x)                  Library calls                 curs_kernel(3x)
+
+
+
+
+

NAME

+       def_prog_mode,   def_shell_mode,   reset_prog_mode,   reset_shell_mode,
+       resetty, savetty, getsyx, setsyx, curs_set, mvcur, napms, ripoffline  -
+       low-level curses routines
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int def_prog_mode(void);
+       int def_shell_mode(void);
+
+       int reset_prog_mode(void);
+       int reset_shell_mode(void);
+
+       int resetty(void);
+       int savetty(void);
+
+       void getsyx(int y, int x);
+       void setsyx(int y, int x);
+
+       int curs_set(int visibility);
+       int mvcur(int oldrow, int oldcol, int newrow, int newcol);
+       int napms(int ms);
+       int ripoffline(int line, int (*init)(WINDOW *, int));
+
+
+

DESCRIPTION

+       The   following  routines  give  low-level  access  to  various  curses
+       capabilities.   These  routines  typically  are  used  inside   library
+       routines.
+
+
+

def_prog_mode, def_shell_mode

+       The def_prog_mode and def_shell_mode routines save the current terminal
+       modes as the "program" (in curses) or "shell" (not in curses) state for
+       use by the reset_prog_mode and reset_shell_mode routines.  This is done
+       automatically by initscr.  There is one such save area for each  screen
+       context allocated by newterm.
+
+
+

reset_prog_mode, reset_shell_mode

+       The  reset_prog_mode and reset_shell_mode routines restore the terminal
+       to "program" (in curses) or "shell" (out of curses) state.   These  are
+       done  automatically by endwin(3x) and, after an endwin, by doupdate, so
+       they normally are not called.
+
+
+

resetty, savetty

+       The resetty and savetty routines save and  restore  the  state  of  the
+       terminal  modes.   savetty  saves  the  current  state  in a buffer and
+       resetty restores the state to what it was at the last call to savetty.
+
+
+

getsyx

+       getsyx stores the coordinates of virtual screen (newscr)  cursor  in  y
+       and x.  If newscr's leaveok(3x) output option is TRUE, getsyx stores -1
+       in both y and x.  If lines have been removed from the top of the screen
+       using  ripoffline, y includes these lines; therefore, y and x populated
+       by getsyx should be used only as arguments for setsyx.
+
+       Few applications use this feature; most call getyx(3x) instead.
+
+
+

setsyx

+       setsyx sets the virtual screen (newscr)  cursor  location  to  (y,  x).
+       setsyx(-1, -1) is equivalent to leaveok(newscr, TRUE).
+
+       getsyx  and  setsyx  are  designed  to  be  used  by  a  function  that
+       manipulates curses windows but  seeks  to  avoid  changing  the  cursor
+       position.  Such a function would first call getsyx, modify its windows'
+       content,  call  wnoutrefresh(3x)  on  them,  call  setsyx,  then   call
+       doupdate(3x).
+
+       Few applications use this feature; most call wmove(3x) instead.
+
+
+

curs_set

+       curs_set adjusts the cursor visibility to "invisible", "visible", "very
+       visible", as its argument is 0, 1, or 2, respectively.  It returns  the
+       previous  visibility  if  the  requested  one  is  supported,  and  ERR
+       otherwise.
+
+
+

mvcur

+       mvcur provides low-level cursor motion.  It takes  effect  immediately,
+       rather  than  at  the  next refresh.  Unlike the other low-level output
+       functions, which either write to the  standard  output  stream  or  are
+       passed  a  function  pointer  to  perform  output,  mvcur  uses  a file
+       descriptor derived from the output stream parameter of newterm(3x).
+
+       One application of mvcur  accompanies  the  temporary  use  of  another
+       program  to  write  to  the  terminal  screen.  For example, first call
+       refresh(3x) to ensure that the screen and the library's model of it  is
+       up  to  date;  then call reset_shell_mode; write to the screen with the
+       external application; call reset_prog_mode; and finally call mvcur(...,
+       ...,  -1, -1) to move the terminal cursor to where curses thinks it is,
+       since the library has no knowledge  of  how  the  external  application
+       moved it.
+
+
+

napms

+       napms  sleeps  for  ms  milliseconds.   If  ms  exceeds  30,000 (thirty
+       seconds), it is capped at that value.
+
+
+

ripoffline

+       ripoffline provides access to the same facility that slk_init(3x)  uses
+       to  reduce  the  size  of the screen.  ripoffline must be called before
+       initscr or newterm is called, to prepare these initial actions:
+
+       o   If line is positive, a line is removed from the top of stdscr.
+
+       o   if line is negative, a line is removed from the bottom.
+
+       When the resulting initialization is done inside initscr,  the  routine
+       init (supplied by the user) is called with two arguments:
+
+       o   a window pointer to the one-line window that has been allocated and
+
+       o   an integer with the number of columns in the window.
+
+       Inside  this  initialization  routine,  the integer variables LINES and
+       COLS (defined in <curses.h>) are not  guaranteed  to  be  accurate  and
+       wrefresh  or  doupdate  must  not  be  called.  It is allowable to call
+       wnoutrefresh during the initialization routine.
+
+       ripoffline can be called up to five times  before  calling  initscr  or
+       newterm.
+
+
+

RETURN VALUE

+       Except  for  curs_set,  these functions return OK on success and ERR on
+       failure.
+
+       curs_set returns the previous cursor visibility, and returns ERR if the
+       terminal type does not support the requested visibility.
+
+       napms always succeeds.
+
+       mvcur  fails  if  the  position  (newrow, newcol) is outside the screen
+       boundaries.
+
+       In ncurses,
+
+       o   def_prog_mode,      def_shell_mode,      reset_prog_mode,       and
+           reset_shell_mode return ERR if the terminal was not initialized, or
+           if the operating system's function for obtaining terminal  settings
+           fails.
+
+       o   ripoffline  returns  ERR  if the accumulated quantity of ripped-off
+           lines would exceed the maximum (5).
+
+
+

NOTES

+       getsyx is a macro; use of  the  &  operator  before  its  arguments  is
+       unnecessary.
+
+       The  endwin  function of both ncurses and SVr4 curses calls curs_set if
+       the latter has previously been called to set the cursor visiblility  to
+       a  value  other than normal; that is, either invisible or very visible.
+       There is no way for ncurses to determine the initial cursor  visibility
+       to restore it.
+
+
+

EXTENSIONS

+       In  ncurses, mvcur accepts -1 for either or both old coordinates.  This
+       value tells ncurses that the old location is unknown, and that it  must
+       use  only absolute motion, as with the cursor_address (cup) capability,
+       rather than the least  costly  combination  of  absolute  and  relative
+       motion.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       The virtual screen functions setsyx and getsyx  are  not  described  in
+       X/Open  Curses  Issue 4.   SVr4  documents each of them as returning an
+       int.  This is  misleading,  as  they  are  macros  with  no  documented
+       semantics for returning values.
+
+       All other functions are as described in X/Open Curses.  It specifies no
+       error conditions for them, except as described for curs_set in  section
+       "RETURN VALUE" above.
+
+       Older  SVr4  man  pages  warn  that  the  return  value of curs_set "is
+       currently incorrect".  This implementation gets it right, but  counting
+       on its correctness anywhere else may be unwise.
+
+       X/Open  Curses specifies ripoffline as returning OK with no possibility
+       of failure ("[c]alls to ripoffline above this limit [five  lines]  have
+       no effect but report success").
+
+       X/Open Curses notes:
+
+              After use of mvcur(), the model Curses maintains of the state of
+              the terminal might not match the actual state of  the  terminal.
+              An  application  should  touch  and  refresh  the  window before
+              resuming conventional use of Curses.
+
+       Both ncurses and SVr4 curses implement mvcur using  the  SCREEN  object
+       allocated  in  either initscr(3x) or newterm(3x).  X/Open Curses states
+       that the old location must be given for mvcur to accommodate  terminals
+       that lack absolute cursor positioning.
+
+       If  interrupted  by  a  signal,  ncurses restarts napms.  That, and the
+       limitation to 30 seconds, differ from other implementations.
+
+
+

SEE ALSO

+       curses(3x),   curs_initscr(3x),   curs_outopts(3x),   curs_refresh(3x),
+       curs_scr_dump(3x), curs_slk(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-21                   curs_kernel(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_legacy.3x.html b/contrib/ncurses/doc/html/man/curs_legacy.3x.html new file mode 100644 index 00000000..9d8d8d9c --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_legacy.3x.html @@ -0,0 +1,132 @@ + + + + + + +curs_legacy 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_legacy 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_legacy(3x)                  Library calls                 curs_legacy(3x)
+
+
+
+
+

NAME

+       getattrs,   getbegx,   getbegy,  getcurx,  getcury,  getmaxx,  getmaxy,
+       getparx,  getpary  -  get  curses  cursor  and  window  coordinates  or
+       attributes (legacy)
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int getattrs(const WINDOW *win);
+
+       int getbegx(const WINDOW *win);
+       int getbegy(const WINDOW *win);
+
+       int getcurx(const WINDOW *win);
+       int getcury(const WINDOW *win);
+
+       int getmaxx(const WINDOW *win);
+       int getmaxy(const WINDOW *win);
+
+       int getparx(const WINDOW *win);
+       int getpary(const WINDOW *win);
+
+
+

DESCRIPTION

+       These  legacy  functions  are  simpler  to  use  than the X/Open curses
+       functions:
+
+       o   The getattrs function returns the same attribute data as wattr_get.
+
+           However, getattrs returns an integer  (actually  a  chtype),  while
+           wattr_get  returns  the current color pair in a separate parameter.
+           In the wide-character library configuration, color  pairs  may  not
+           fit into a chtype, so wattr_get is the only way to obtain the color
+           information.
+
+           Because getattrs returns the attributes in a single  parameter,  it
+           would  not  be possible for an application to distinguish that from
+           ERR (a -1).  If the window  parameter  is  null,  getattrs  returns
+           A_NORMAL (zero).
+
+       o   The getbegy and getbegx functions return the same data as getbegyx.
+
+       o   The getcury and getcurx functions return the same data as getyx.
+
+       o   The getmaxy and getmaxx functions return the same data as getmaxyx.
+
+       o   The getpary and getparx functions return the same data as getparyx.
+
+
+

RETURN VALUE

+       Except  as  noted,  these  functions  return  an integer, or ERR if the
+       window parameter is null.
+
+
+

PORTABILITY

+       These  functions  were  supported  on  Version  7,  BSD  or  System   V
+       implementations.   None  of  those  implementations  checked the window
+       parameter.
+
+       The getattrs function and  macro  are  defined  to  return  a  (signed)
+       integer  for  compatibility  with  those  implementations  although  an
+       unsigned type would have been more appropriate.
+
+
+

SEE ALSO

+       curses(3x), curs_getyx(3x), curs_opaque(3x)
+
+
+
+ncurses 6.5                       2024-05-25                   curs_legacy(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_memleaks.3x.html b/contrib/ncurses/doc/html/man/curs_memleaks.3x.html new file mode 100644 index 00000000..085e3aba --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_memleaks.3x.html @@ -0,0 +1,148 @@ + + + + + + +curs_memleaks 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

curs_memleaks 3x 2024-03-16 ncurses 6.5 Library calls

+
+curs_memleaks(3x)                Library calls               curs_memleaks(3x)
+
+
+
+
+

NAME

+       exit_curses, exit_terminfo - check for memory leaks in curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+       void exit_curses(int code);
+
+       #include <term.h>
+       void exit_terminfo(int code);
+
+       /* deprecated (intentionally not declared in curses.h or term.h) */
+       void _nc_freeall(void);
+       void _nc_free_and_exit(int code);
+       void _nc_free_tinfo(int code);
+
+
+

DESCRIPTION

+       These  functions  are  used to simplify analysis of memory leaks in the
+       ncurses library.
+
+       Any implementation of curses must not free the memory associated with a
+       screen, since (even after calling endwin(3x)), it must be available for
+       use in the next call to refresh(3x).  There are also chunks  of  memory
+       held  for  performance  reasons.   That makes it hard to analyze curses
+       applications for memory leaks.  When  using  the  specially  configured
+       debugging  version  of  the  ncurses  library,  applications  can  call
+       functions which free those chunks of memory, simplifying the process of
+       memory-leak checking.
+
+       Some  of  the functions are named with a "_nc_" prefix because they are
+       not intended for use in the non-debugging library:
+
+       _nc_freeall
+            This frees (almost) all of the memory allocated by ncurses.
+
+       _nc_free_and_exit
+            This frees the memory allocated by ncurses (like _nc_freeall), and
+            exits the program.  It is preferred over _nc_freeall since some of
+            that memory may be  required  to  keep  the  application  running.
+            Simply exiting (with the given exit-code) is safer.
+
+       _nc_free_tinfo
+            Use  this  function  if only the low-level terminfo functions (and
+            corresponding library) are used.  Like _nc_free_and_exit, it exits
+            the program after freeing memory.
+
+       The  functions  prefixed "_nc" are normally not available; they must be
+       configured into the library at build  time  using  the  --disable-leaks
+       option.   That  compiles-in  code that frees memory that normally would
+       not be freed.
+
+       The exit_curses and exit_terminfo functions call _nc_free_and_exit  and
+       _nc_free_tinfo  if  the  library  is  configured to support memory-leak
+       checking.  If the library is  not  configured  to  support  memory-leak
+       checking, they simply call exit.
+
+
+

RETURN VALUE

+       These functions do not return a value.
+
+
+

PORTABILITY

+       These   functions   are  not  part  of  X/Open  Curses;  nor  do  other
+       implementations of curses provide a similar feature.
+
+       In any implementation of X/Open Curses, an application can free part of
+       the memory allocated by curses:
+
+       o   The  portable  part  of  exit_curses  can be freed using delscreen,
+           passing the SCREEN pointer returned by newterm.
+
+           In some implementations, there is a global variable sp which  could
+           be used, e.g., if the screen were only initialized using initscr.
+
+       o   The portable part of exit_terminfo can be freed using del_curterm.
+
+           In this case, there is a global variable cur_term which can be used
+           as parameter.
+
+
+

SEE ALSO

+       curses(3x), curs_initscr(3x), curs_terminfo(3x)
+
+
+
+ncurses 6.5                       2024-03-16                 curs_memleaks(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_mouse.3x.html b/contrib/ncurses/doc/html/man/curs_mouse.3x.html new file mode 100644 index 00000000..04a1f35a --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_mouse.3x.html @@ -0,0 +1,425 @@ + + + + + + +curs_mouse 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_mouse 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_mouse(3x)                   Library calls                  curs_mouse(3x)
+
+
+
+
+

NAME

+       has_mouse,  getmouse,  ungetmouse,  mousemask,  wenclose,  mouse_trafo,
+       wmouse_trafo, mouseinterval - get mouse events in curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       typedef unsigned long mmask_t;
+
+       typedef struct {
+           short id;         /* ID to distinguish multiple devices */
+           int x, y, z;      /* event coordinates */
+           mmask_t bstate;   /* button state bits */
+       } MEVENT;
+
+       bool has_mouse(void);
+
+       mmask_t mousemask(mmask_t newmask, mmask_t *oldmask);
+
+       int getmouse(MEVENT *event);
+       int ungetmouse(MEVENT *event);
+
+       bool wenclose(const WINDOW *win, int y, int x);
+
+       bool mouse_trafo(int* pY, int* pX, bool to_screen);
+       bool wmouse_trafo(const WINDOW* win,
+                         int* pY, int* pX, bool to_screen);
+
+       int mouseinterval(int erval);
+
+
+

DESCRIPTION

+       These functions provide an interface to mouse events from  ncurses(3x).
+       Mouse  events  are  represented  by  KEY_MOUSE pseudo-key values in the
+       wgetch(3x) input stream.
+
+
+

has_mouse

+       The has_mouse function returns  TRUE  if  the  mouse  driver  has  been
+       successfully initialized, and FALSE otherwise.
+
+       Mouse  events  are  ignored  when input is in cooked mode, and cause an
+       error beep when cooked mode  is  being  simulated  in  a  window  by  a
+       function  such  as  getstr  that  expects  a  linefeed  for  input-loop
+       termination.
+
+
+

mousemask

+       To make mouse events visible, use the mousemask  function.   This  sets
+       the  mouse  events  to  be  reported.   By default, no mouse events are
+       reported.
+
+       o   The function returns an updated copy of newmask to  indicate  which
+           of the specified mouse events can be reported.
+
+           If the screen has not been initialized, or if the terminal does not
+           support mouse-events, this function returns 0.
+
+       o   If oldmask is non-NULL, this function fills the indicated  location
+           with the previous value of the current screen's mouse event mask.
+
+       As  a  side  effect,  setting  a zero mouse mask may turn off the mouse
+       pointer; setting a nonzero mask may turn it on.  Whether  this  happens
+       is device-dependent.
+
+
+

Mouse Events

+       Here are the mouse event type masks which may be defined:
+
+       Name                     Description
+       ------------------------------------------------------------------------
+       BUTTON1_PRESSED          mouse button 1 down
+       BUTTON1_RELEASED         mouse button 1 up
+       BUTTON1_CLICKED          mouse button 1 clicked
+       BUTTON1_DOUBLE_CLICKED   mouse button 1 double clicked
+       BUTTON1_TRIPLE_CLICKED   mouse button 1 triple clicked
+       ------------------------------------------------------------------------
+       BUTTON2_PRESSED          mouse button 2 down
+       BUTTON2_RELEASED         mouse button 2 up
+       BUTTON2_CLICKED          mouse button 2 clicked
+       BUTTON2_DOUBLE_CLICKED   mouse button 2 double clicked
+       BUTTON2_TRIPLE_CLICKED   mouse button 2 triple clicked
+       ------------------------------------------------------------------------
+       BUTTON3_PRESSED          mouse button 3 down
+       BUTTON3_RELEASED         mouse button 3 up
+       BUTTON3_CLICKED          mouse button 3 clicked
+       BUTTON3_DOUBLE_CLICKED   mouse button 3 double clicked
+       BUTTON3_TRIPLE_CLICKED   mouse button 3 triple clicked
+       ------------------------------------------------------------------------
+       BUTTON4_PRESSED          mouse button 4 down
+       BUTTON4_RELEASED         mouse button 4 up
+       BUTTON4_CLICKED          mouse button 4 clicked
+       BUTTON4_DOUBLE_CLICKED   mouse button 4 double clicked
+       BUTTON4_TRIPLE_CLICKED   mouse button 4 triple clicked
+       ------------------------------------------------------------------------
+       BUTTON5_PRESSED          mouse button 5 down
+       BUTTON5_RELEASED         mouse button 5 up
+       BUTTON5_CLICKED          mouse button 5 clicked
+       BUTTON5_DOUBLE_CLICKED   mouse button 5 double clicked
+       BUTTON5_TRIPLE_CLICKED   mouse button 5 triple clicked
+       ------------------------------------------------------------------------
+       BUTTON_SHIFT             shift was down during button state change
+       BUTTON_CTRL              control was down during button state change
+       BUTTON_ALT               alt was down during button state change
+       ALL_MOUSE_EVENTS         report all button state changes
+       REPORT_MOUSE_POSITION    report mouse movement
+       ------------------------------------------------------------------------
+
+
+

getmouse

+       Once a class of mouse events has been made visible in a window, calling
+       the wgetch function on that window may return KEY_MOUSE as an indicator
+       that a mouse event has been queued.  To read the event data and pop the
+       event off the queue, call getmouse.  This function will return OK if  a
+       mouse  event  is  actually  visible in the given window, ERR otherwise.
+       When getmouse returns OK, the data deposited as y and x  in  the  event
+       structure    coordinates   will   be   screen-relative   character-cell
+       coordinates.  The returned state mask will have exactly one bit set  to
+       indicate the event type.  The corresponding data in the queue is marked
+       invalid.  A subsequent call to getmouse will retrieve  the  next  older
+       item from the queue.
+
+
+

ungetmouse

+       The  ungetmouse  function  behaves analogously to ungetch.  It pushes a
+       KEY_MOUSE event onto the input queue, and associates  with  that  event
+       the given state data and screen-relative character-cell coordinates.
+
+
+

wenclose

+       The  wenclose  function  tests  whether a given pair of screen-relative
+       character-cell coordinates is enclosed by  a  given  window,  returning
+       TRUE  if  it is and FALSE otherwise.  It is useful for determining what
+       subset of the screen windows enclose the location of a mouse event.
+
+       If the parameter is  a  pad,  wenclose  uses  the  most  recent  screen
+       coordinates used for this pad in prefresh(3x) or pnoutrefresh(3x).
+
+
+

wmouse_trafo

+       The  wmouse_trafo  function transforms a given pair of coordinates from
+       stdscr-relative coordinates to coordinates relative to the given window
+       or  vice  versa.   The  resulting  stdscr-relative  coordinates are not
+       always identical to screen coordinates due to the mechanism to  reserve
+       lines  on  top  or  bottom  of  the  screen for other purposes (see the
+       ripoffline(3x) and slk_init(3x) calls, for example).
+
+       o   If the parameter to_screen  is  TRUE,  the  pointers  pY,  pX  must
+           reference  the  coordinates  of  a  location inside the window win.
+           They are converted  to  stdscr-relative  coordinates  and  returned
+           through  the  pointers.   If  the  conversion  was  successful, the
+           function returns TRUE.
+
+           If one of the parameters was NULL or the location is not inside the
+           window, FALSE is returned.
+
+       o   If   to_screen  is  FALSE,  the  pointers  pY,  pX  must  reference
+           stdscr-relative coordinates.  They are converted to window-relative
+           coordinates  if  the  window win encloses this point.  In this case
+           the function returns TRUE.
+
+           If one of the parameters is NULL or the point  is  not  inside  the
+           window, FALSE is returned.
+
+       The   referenced   coordinates  are  only  replaced  by  the  converted
+       coordinates if the transformation was successful.
+
+
+

mouse_trafo

+       The mouse_trafo function performs the same translation as wmouse_trafo,
+       using stdscr for win.
+
+
+

mouseinterval

+       The  mouseinterval  function sets the maximum time (in thousandths of a
+       second) that can elapse between press and release events for them to be
+       resolved  as  a click.  An application might interpret button press and
+       release events separated by more than the mouse  interval  as  a  "long
+       press", or, with motion, as a "drag".
+
+       Calling  mouseinterval(0)  disables  click  resolution.   When  ncurses
+       detects a mouse event, it awaits further  input  activity  up  to  this
+       interval,  and  then  checks  for a subsequent mouse event which can be
+       combined with the first event.  If the timeout  expires  without  input
+       activity  (which  would  happen  with  a  zero interval), then no click
+       resolution will occur.
+
+       This   function   returns   the   previous   interval    value.     Use
+       mouseinterval(-1) to obtain the interval without altering it.
+
+       The  mouse  interval  is  set  to  one  sixth  of  a  second  when  the
+       corresponding  screen  is  initialized,   e.g.,   in   initscr(3x)   or
+       setupterm(3x).
+
+
+

RETURN VALUE

+       has_mouse, wenclose, mouse_trafo, and wmouse_trafo return TRUE or FALSE
+       as noted above.
+
+       getmouse and ungetmouse return ERR upon failure and OK upon success.
+
+       getmouse fails if:
+
+       o   no mouse driver was initialized,
+
+       o   the mask of reportable events is zero,
+
+       o   a mouse event was detected that does not match the mask,
+
+       o   or if no more events remain in the queue.
+
+       ungetmouse returns ERR if the event queue is full.
+
+       mousemask returns the mask of reportable events.
+
+       mouseinterval returns the previous interval value, unless the  terminal
+       was  not  initialized.   In  that case, it returns the maximum interval
+       value (166).
+
+
+

NOTES

+       The  order  of  the  MEVENT  structure  members  is   not   guaranteed.
+       Additional fields may be added to the structure in the future.
+
+       Under  ncurses, these calls are implemented using either xterm's built-
+       in mouse-tracking API or platform-specific drivers including
+
+          o   Alessandro Rubini's gpm server
+
+          o   FreeBSD sysmouse
+
+          o   OS/2 EMX
+
+       If you are using an unsupported configuration, mouse events will not be
+       visible to ncurses (and the mousemask function will always return 0).
+
+       If  the  terminfo entry contains a XM string, this is used in the xterm
+       mouse driver to control the way the terminal is initialized  for  mouse
+       operation.   The  default,  if  XM is not found, corresponds to private
+       mode 1000 of xterm:
+
+          \E[?1000%?%p1%{1}%=%th%el%;
+
+       The mouse driver also recognizes a newer xterm private mode 1006, e.g.,
+
+          \E[?1006;1000%?%p1%{1}%=%th%el%;
+
+       The z member in the event structure  is  not  presently  used.   It  is
+       intended  for  use with touch screens (which may be pressure-sensitive)
+       or with 3D-mice/trackballs/power gloves.
+
+       The ALL_MOUSE_EVENTS  class  does  not  include  REPORT_MOUSE_POSITION.
+       They  are  distinct.   For example, in xterm, wheel/scrolling mice send
+       position reports as a sequence of presses of buttons  4  or  5  without
+       matching button-releases.
+
+
+

EXTENSIONS

+       These  functions  were  designed  for ncurses(3x), and are not found in
+       SVr4  curses,   4.4BSD   curses,   or   any   other   previous   curses
+       implementation.   (SVr4 curses did have a getmouse function, which took
+       no argument and returned a different type.)
+
+
+

PORTABILITY

+       Applications employing the ncurses mouse extension should condition its
+       use  on the visibility of the NCURSES_MOUSE_VERSION preprocessor macro.
+       When the interface changes, the  macro's  value  increments.   Multiple
+       versions   are  available  when  ncurses  is  configured;  see  section
+       "ALTERNATE CONFIGURATIONS" of ncurses(3x).  The following values may be
+       specified.
+
+          1  has definitions for reserved events.  The mask uses 28 bits.
+
+          2  adds  definitions  for  button  5,  removes  the  definitions for
+             reserved events.  The mask uses 29 bits.
+
+       SVr4 curses had support for the mouse in a variant of xterm(1).  It  is
+       mentioned in a few places, with little supporting documentation.
+
+       o   Its  "libcurses"  manual  page  lists  functions  for  this feature
+           prototyped in curses.h.
+
+               extern int mouse_set(long int);
+               extern int mouse_on(long int);
+               extern int mouse_off(long int);
+               extern int request_mouse_pos(void);
+               extern int map_button(unsigned long);
+               extern void wmouse_position(WINDOW *, int *, int *);
+               extern unsigned long getmouse(void), getbmap(void);
+
+       o   Its "terminfo" manual page lists capabilities for the feature.
+
+               buttons         btns    BT   Number of buttons on the mouse
+               get_mouse       getm    Gm   Curses should get button events
+               key_mouse       kmous   Km   0631, Mouse event has occurred
+               mouse_info      minfo   Mi   Mouse status information
+               req_mouse_pos   reqmp   RQ   Request mouse position report
+
+       o   The interface made assumptions (as does ncurses) about  the  escape
+           sequences sent to and received from the terminal.
+
+           For instance, the SVr4 curses library used the get_mouse capability
+           to tell the terminal which mouse  button  events  it  should  send,
+           passing  the mouse-button bit mask to the terminal.  Also, it could
+           ask the terminal  where  the  mouse  was  using  the  req_mouse_pos
+           capability.
+
+           Those  features  required a terminal program that had been modified
+           to work with SVr4 curses.  They were not part of the X Consortium's
+           xterm.
+
+       When  developing the xterm mouse support for ncurses in September 1995,
+       Eric Raymond was uninterested in using the same interface  due  to  its
+       lack of documentation.  Later, in 1998, Mark Hesseling provided support
+       in PDCurses 2.3 using the SVr4 interface.  PDCurses, however, does  not
+       use  video  terminals,  making  it  unnecessary  to  be concerned about
+       compatibility with the escape sequences.
+
+
+

BUGS

+       Mouse events from xterm are not ignored in cooked  mode  if  they  have
+       been  enabled  by  mousemask.  Instead, the xterm mouse report sequence
+       appears in the string read.
+
+       An ncurses window must enable keypad(3x)  to  correctly  receive  mouse
+       event  reports  from  xterm  since they are encoded like function keys.
+       Set the terminal's terminfo capability kmous to "\E[M"  (the  beginning
+       of  the  response  from xterm for mouse clicks).  Other values of kmous
+       are permitted under the same assumption, that  is,  the  report  begins
+       with that sequence.
+
+       Because there are no standard response sequences that serve to identify
+       terminals supporting the xterm mouse protocol, ncurses assumes that  if
+       kmous is defined in the terminal description, or if the terminal type's
+       primary name or aliases contain the string "xterm", then  the  terminal
+       may send mouse events.  The kmous capability is checked first, allowing
+       use of newer xterm mouse protocols, such as its private mode 1006.
+
+
+

SEE ALSO

+       curses(3x),     curs_inopts(3x),     curs_kernel(3x),     curs_pad(3x),
+       curs_slk(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-05-25                    curs_mouse(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_move.3x.html b/contrib/ncurses/doc/html/man/curs_move.3x.html new file mode 100644 index 00000000..23fe50d8 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_move.3x.html @@ -0,0 +1,111 @@ + + + + + + +curs_move 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_move 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_move(3x)                    Library calls                   curs_move(3x)
+
+
+
+
+

NAME

+       move, wmove - move cursor in a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int move(int y, int x);
+       int wmove(WINDOW * win, int y, int x);
+
+
+

DESCRIPTION

+       wmove  relocates  the  cursor  associated with the curses window win to
+       line y and column  x.   The  terminal's  cursor  does  not  move  until
+       refresh(3x)  is  called.   The position (y, x) is relative to the upper
+       left-hand  corner  of  the  window,  which  has   coordinates   (0, 0).
+       ncurses(3x) describes the move variant of this function.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       They fail if the position (y, x) is outside the window boundaries.
+
+       In ncurses, wmove fails if win is NULL.
+
+
+

NOTES

+       move may be implemented as a macro.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.
+
+       SVr4  curses  describes  a  successful return value only as "an integer
+       value other than ERR".
+
+
+

HISTORY

+       4BSD (1980) curses introduced wmove.
+
+
+

SEE ALSO

+       curses(3x), curs_refresh(3x)
+
+
+
+ncurses 6.5                       2024-09-21                     curs_move(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_opaque.3x.html b/contrib/ncurses/doc/html/man/curs_opaque.3x.html new file mode 100644 index 00000000..50bb9ee6 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_opaque.3x.html @@ -0,0 +1,172 @@ + + + + + + +curs_opaque 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

curs_opaque 3x 2024-03-16 ncurses 6.5 Library calls

+
+curs_opaque(3x)                  Library calls                 curs_opaque(3x)
+
+
+
+
+

NAME

+       is_cleared,  is_idlok,  is_idcok,  is_immedok,  is_keypad,  is_leaveok,
+       is_nodelay, is_notimeout, is_pad,  is_scrollok,  is_subwin,  is_syncok,
+       wgetdelay, wgetparent, wgetscrreg - obtain curses window properties
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       bool is_cleared(const WINDOW *win);
+       bool is_idcok(const WINDOW *win);
+       bool is_idlok(const WINDOW *win);
+       bool is_immedok(const WINDOW *win);
+       bool is_keypad(const WINDOW *win);
+       bool is_leaveok(const WINDOW *win);
+       bool is_nodelay(const WINDOW *win);
+       bool is_notimeout(const WINDOW *win);
+       bool is_pad(const WINDOW *win);
+       bool is_scrollok(const WINDOW *win);
+       bool is_subwin(const WINDOW *win);
+       bool is_syncok(const WINDOW *win);
+
+       WINDOW * wgetparent(const WINDOW *win);
+       int wgetdelay(const WINDOW *win);
+       int wgetscrreg(const WINDOW *win, int *top, int *bottom);
+
+
+

DESCRIPTION

+       ncurses  provides functions returning properties of a WINDOW structure,
+       allowing  it  to  be  "opaque"   if   the   application   defines   the
+       NCURSES_OPAQUE  preprocessor  symbol.  Opacity in this sense means that
+       the members of struct data  types  are  not  directly  accessible  (for
+       instance,  through  "." or "->" operators), but instead must be queried
+       and/or set  via  library  functions.   Advantages  of  opacity  include
+       greater  abstraction  and improved management of concurrent accesses to
+       data structures, keeping object states coherent.
+
+       is_cleared
+              returns the value set by clearok(3x).
+
+       is_idcok
+              returns the value set by idcok(3x).
+
+       is_idlok
+              returns the value set by idlok(3x).
+
+       is_immedok
+              returns the value set by immedok(3x).
+
+       is_keypad
+              returns the value set by keypad(3x).
+
+       is_leaveok
+              returns the value set by leaveok(3x).
+
+       is_nodelay
+              returns the value set by nodelay(3x).
+
+       is_notimeout
+              returns the value set by notimeout(3x).
+
+       is_pad returns TRUE if the window is a pad; that is, it was created  by
+              newpad(3x).
+
+       is_scrollok
+              returns the value set by scrollok(3x).
+
+       is_subwin
+              returns  TRUE  if  the  window  is  a subwindow, that is, it was
+              created by subwin(3x) or derwin(3x).
+
+       is_syncok
+              returns the value set by syncok(3x).
+
+       wgetdelay
+              returns the delay timeout set by wtimeout(3x).
+
+       wgetparent
+              returns the parent WINDOW pointer for subwindows,  or  NULL  for
+              windows having no parent.
+
+       wgetscrreg
+              stores  the the top and bottom rows for the scrolling margin set
+              by wsetscrreg(3x) in the corresponding arguments, returning  ERR
+              upon failure and OK upon successful completion.
+
+
+

RETURN VALUE

+       These functions return TRUE or FALSE except as noted.
+
+
+

NOTES

+       ncurses  provides  both  a C function and a preprocessor macro for each
+       function documented in this page.
+
+
+

PORTABILITY

+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code   depending   on   ncurses   extensions   be   conditioned   using
+       NCURSES_VERSION.
+
+
+

SEE ALSO

+       curses(3x),    curs_inopts(3x),   curs_outopts(3x),   curs_threads(3x),
+       curs_window(3x)
+
+
+
+ncurses 6.5                       2024-03-16                   curs_opaque(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_outopts.3x.html b/contrib/ncurses/doc/html/man/curs_outopts.3x.html new file mode 100644 index 00000000..0fd6b471 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_outopts.3x.html @@ -0,0 +1,223 @@ + + + + + + +curs_outopts 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_outopts 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_outopts(3x)                 Library calls                curs_outopts(3x)
+
+
+
+
+

NAME

+       clearok,   idcok,   idlok,   immedok,   leaveok,  scrollok,  setscrreg,
+       wsetscrreg - set curses output options
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int clearok(WINDOW *win, bool bf);
+       void idcok(WINDOW *win, bool bf);
+       int idlok(WINDOW *win, bool bf);
+       void immedok(WINDOW *win, bool bf);
+       int leaveok(WINDOW *win, bool bf);
+       int scrollok(WINDOW *win, bool bf);
+
+       int setscrreg(int top, int bot);
+       int wsetscrreg(WINDOW *win, int top, int bot);
+
+
+

DESCRIPTION

+       These routines set options that  change  the  style  of  output  within
+       curses.   All options are initially FALSE, unless otherwise stated.  It
+       is not necessary to turn these options off before calling endwin(3x).
+
+
+

clearok

+       If clearok is called with TRUE as argument, the next call  to  wrefresh
+       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 win argument to clearok is the global  variable  curscr,  the  next
+       call  to  wrefresh  with any window causes the screen to be cleared and
+       repainted from scratch.
+
+
+

idcok

+       If idcok is called with FALSE as  second  argument,  curses  no  longer
+       considers   using  the  hardware  insert/delete  character  feature  of
+       terminals so equipped.  Use of character insert/delete  is  enabled  by
+       default.   Calling idcok with TRUE as second argument re-enables use of
+       character insertion and deletion.
+
+
+

idlok

+       If idlok is called with TRUE as second argument, curses considers using
+       the  hardware  insert/delete  line  feature  of  terminals so equipped.
+       Calling idlok with FALSE  as  second  argument  disables  use  of  line
+       insertion  and  deletion.   This  option  should be enabled only if the
+       application needs insert/delete line, for example, for a screen editor.
+       It  is  disabled  by  default  because  insert/delete  line tends to be
+       visually annoying when used in applications  where  it  is  not  really
+       needed.   If  insert/delete  line  cannot  be  used, curses redraws the
+       changed portions of all lines.
+
+
+

immedok

+       If immedok is called with TRUE as second argument, any  change  in  the
+       window  image,  such  as  the  ones caused by waddch, wclrtobot, wscrl,
+       etc., automatically causes a call to wrefresh.  However, it may degrade
+       performance  considerably,  due to repeated calls to wrefresh.  Calling
+       immedok with FALSE as second argument restores  the  default  behavior,
+       i.e., deferring screen updates until a refresh is needed.
+
+
+

leaveok

+       Normally,  the  hardware  cursor  is left at the location of the window
+       cursor being refreshed.  The leaveok 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.
+
+
+

scrollok

+       The  scrollok  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, (bf is FALSE), the cursor  is
+       left  on  the  bottom  line.   If  enabled, (bf is TRUE), the window is
+       scrolled up one line (Note that to get the physical scrolling effect on
+       the terminal, it is also necessary to call idlok).
+
+
+

setscrreg, wsetscrreg

+       The  setscrreg and wsetscrreg routines allow the application programmer
+       to set a software scrolling region  in  a  window.   The  top  and  bot
+       parameters  are  the  line  numbers of the top and bottom margin of the
+       scrolling region.  (Line 0 is the top line of  the  window.)   If  this
+       option  and  scrollok  are  enabled,  an attempt to move off the bottom
+       margin line causes all lines in the scrolling region to scroll one line
+       in  the  direction  of  the first line.  Only the text of the window is
+       scrolled.  (Note that this has nothing to do with the use of a physical
+       scrolling  region  capability  in the terminal, like that in the VT100.
+       If idlok is enabled and the terminal has either a scrolling  region  or
+       insert/delete line capability, they will probably be used by the output
+       routines.)
+
+
+

RETURN VALUE

+       The functions setscrreg and wsetscrreg return OK upon success  and  ERR
+       upon  failure.  All other routines that return an integer always return
+       OK.
+
+       In this implementation,
+
+       o   those functions that have a window pointer will return ERR  if  the
+           window pointer is null
+
+       o   wsetscrreg  returns  ERR  if  the  scrolling  region  limits extend
+           outside the window boundaries.
+
+
+

NOTES

+       Note that clearok, leaveok,  scrollok,  idcok,  and  setscrreg  may  be
+       macros.
+
+       The  immedok  routine  is  useful for windows that are used as terminal
+       emulators.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       Some  historic  curses implementations, as an undocumented feature, did
+       the  equivalent  of  "clearok(...,   1)"   when   touchwin(stdstr)   or
+       clear(stdstr) were used.  This trick does not work with ncurses.
+
+       Early  System V  curses  implementations  specified  that with scrollok
+       enabled, any window modification triggering  a  scroll  also  forced  a
+       physical  refresh.   X/Open  Curses  does not require this, and ncurses
+       avoids  doing  so  to  better  optimize   vertical   motions   upon   a
+       wrefresh(3x).
+
+       X/Open Curses does not mention that the cursor should be made invisible
+       as a side-effect of leaveok.  SVr4 curses documentation notes this, but
+       the code neglects it.  Use curs_set(3x) to make the cursor invisible.
+
+
+

HISTORY

+       ncurses  formerly  treated nl(3x) and nonl(3x) as both input and output
+       options, but no longer; see curs_inopts(3x).
+
+
+

SEE ALSO

+       curses(3x),    curs_addch(3x),    curs_clear(3x),     curs_initscr(3x),
+       curs_refresh(3x), curs_scroll(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-14                  curs_outopts(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_overlay.3x.html b/contrib/ncurses/doc/html/man/curs_overlay.3x.html new file mode 100644 index 00000000..6c60a7cc --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_overlay.3x.html @@ -0,0 +1,128 @@ + + + + + + +curs_overlay 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

curs_overlay 3x 2024-05-25 ncurses 6.5 Library calls

+
+curs_overlay(3x)                 Library calls                curs_overlay(3x)
+
+
+
+
+

NAME

+       overlay,  overwrite,  copywin  -  overlay curses windows and manipulate
+       them
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int overlay(const WINDOW *srcwin, WINDOW *dstwin);
+       int overwrite(const WINDOW *srcwin, WINDOW *dstwin);
+       int copywin(const WINDOW *srcwin, WINDOW *dstwin, int sminrow,
+             int smincol, int dminrow, int dmincol, int dmaxrow,
+             int dmaxcol, int overlay);
+
+
+

DESCRIPTION

+
+

overlay, overwrite

+       The overlay and overwrite routines overlay srcwin  on  top  of  dstwin.
+       scrwin and dstwin are not required to be the same size; only text where
+       the two windows overlap is copied.  The difference is that  overlay  is
+       non-destructive   (blanks   are   not   copied)  whereas  overwrite  is
+       destructive.
+
+
+

copywin

+       The copywin routine provides a finer granularity of  control  over  the
+       overlay  and  overwrite  routines.   As  in  the  prefresh  routine,  a
+       rectangle is specified in the destination  window,  (dminrow,  dmincol)
+       and  (dmaxrow,  dmaxcol),  and the upper-left-corner coordinates of the
+       source window, (sminrow, smincol).  If the argument  overlay  is  true,
+       then copying is non-destructive, as in overlay.
+
+
+

RETURN VALUE

+       These  routines  return  the  integer  ERR upon failure and an OK (SVr4
+       specifies only "an integer  value  other  than  ERR")  upon  successful
+       completion.
+
+       X/Open  defines  no error conditions.  In this implementation, copywin,
+       overlay and overwrite return ERR if either of the window  pointers  are
+       null, or if some part of the window would be placed off-screen.
+
+
+

NOTES

+       Note that overlay and overwrite may be macros.
+
+
+

PORTABILITY

+       These  functions  are  described  in X/Open Curses, Issue 4, which adds
+       const qualifiers to the arguments.  It further specifies their behavior
+       in  the  presence  of  characters  with  multibyte  renditions (not yet
+       supported in this implementation).
+
+
+

SEE ALSO

+       curses(3x), curs_pad(3x), curs_refresh(3x)
+
+
+
+ncurses 6.5                       2024-05-25                  curs_overlay(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_pad.3x.html b/contrib/ncurses/doc/html/man/curs_pad.3x.html new file mode 100644 index 00000000..2ff10686 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_pad.3x.html @@ -0,0 +1,253 @@ + + + + + + +curs_pad 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_pad 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_pad(3x)                     Library calls                    curs_pad(3x)
+
+
+
+
+

NAME

+       newpad, subpad, prefresh, pnoutrefresh, pechochar, pecho_wchar - create
+       and display curses pads
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       WINDOW *newpad(int nlines, int ncols);
+       WINDOW *subpad(WINDOW *parent, int nlines, int ncols,
+             int begin_y, int begin_x);
+
+       int prefresh(WINDOW *pad, int pminrow, int pmincol,
+             int sminrow, int smincol, int smaxrow, int smaxcol);
+       int pnoutrefresh(WINDOW *pad, int pminrow, int pmincol,
+             int sminrow, int smincol, int smaxrow, int smaxcol);
+
+       int pechochar(WINDOW *pad, chtype ch);
+       int pecho_wchar(WINDOW *pad, const cchar_t *wch);
+
+
+

DESCRIPTION

+       A curses 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,  only
+       part  of  which  is  to  be  visible  on  the  screen.   Pads  are  not
+       automatically refreshed by scrolling or input-echoing operations.
+
+       Pads  cannot  be  refreshed  with   wrefresh(3x);   use   prefresh   or
+       pnoutrefresh instead.
+
+
+

newpad

+       newpad  creates  and returns a pointer to a new pad data structure with
+       the given number of lines, nlines, and columns, ncols.
+
+
+

subpad

+       subpad creates and returns a pointer to a subwindow within a  pad  with
+       the  given  number  of  lines,  nlines,  and  columns,  ncols.   Unlike
+       subwin(3x), which uses screen coordinates, the new  pad  is  placed  at
+       position (begin_y, begin_x) relative to its parent.  Thus, changes made
+       to one pad can affect both.  When operating on a subpad,  it  is  often
+       necessary  to  call  touchwin(3x)  or  touchline(3x)  on  parent before
+       calling prefresh.
+
+
+

prefresh, pnoutrefresh

+       prefresh  and  pnoutrefresh   are   analogous   to   wrefresh(3x)   and
+       wnoutrefresh(3x)  except that they operate on pads rather than windows.
+       They require additional parameters are needed to indicate what portions
+       of the pad and screen are involved.
+
+       o   pminrow  and  pmincol  specify  the  upper  left-hand  corner  of a
+           rectangular view of the pad.
+
+       o   sminrow, smincol, smaxrow, and smaxcol specify the vertices 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.  curses treats negative values of any  of  these
+       parameters as zero.
+
+
+

pechochar

+       pechochar  is functionally equivalent to calling waddch(3x) followed by
+       prefresh.  It suggests to the  curses  optimizer  that  only  a  single
+       character  is  being  output; a considerable performance benefit may be
+       thus enjoyed.  The location of the character ch written to the  pad  is
+       used to populate the arguments to prefresh.
+
+
+

pecho_wchar

+       pecho_wchar is functionally equivalent to calling wadd_wch(3x) followed
+       by prefresh.  It suggests to the curses optimizer that  only  a  single
+       wide  character is being output; a considerable performance benefit may
+       be thus enjoyed.  The location of the character wch written to the  pad
+       is used to populate the arguments to prefresh.
+
+
+

RETURN VALUE

+       Functions  that  return an integer return ERR upon failure and OK (SVr4
+       specifies only "an integer  value  other  than  ERR")  upon  successful
+       completion.
+
+       Functions  that  return pointers return NULL on error, and set errno to
+       ENOMEM.
+
+       In this implementation
+
+          prefresh and pnoutrefresh
+               return ERR if the window pointer is null, or if the  window  is
+               not  really  a pad or if the area to refresh extends off-screen
+               or if the minimum coordinates are greater than the maximum.
+
+          pechochar
+               returns ERR if  the  window  is  not  really  a  pad,  and  the
+               associated call to wechochar returns ERR.
+
+          pecho_wchar
+               returns  ERR  if  the  window  is  not  really  a  pad, and the
+               associated call to wecho_wchar returns ERR.
+
+
+

NOTES

+       pechochar may be a macro.
+
+
+

PORTABILITY

+       BSD curses has no pad feature.
+
+       SVr2  curses  (1986)  provided  the  newpad  and   related   functions,
+       documenting  them  in  a  single  line each.  SVr3 (1987) provided more
+       extensive documentation.
+
+       The documentation does not explain the term pad.  However,  the  Apollo
+       Aegis workstation operating system supported a graphical pad feature:
+
+       o   These  graphical  pads  could  be  much  larger than the computer's
+           display.
+
+       o   The read-only output from a  command  could  be  scrolled  back  to
+           inspect, and select text from the pad.
+
+       The two uses may be related.
+
+       X/Open  Curses,  Issue 4 describes these functions, without significant
+       change from the SVr3 documentation.  It specifies no  error  conditions
+       for  them.  The behavior of subpad if the parent window is not a pad is
+       undocumented, and is not checked by the vendor Unix implementations:
+
+       o   SVr4 curses sets a flag in the WINDOW  structure  in  newpad  which
+           tells if the window is a pad.
+
+           However,  it  uses this information only in waddch (to decide if it
+           should call wrefresh) and wscrl (to avoid  scrolling  a  pad),  and
+           does  not  check  in  wrefresh  to ensure that the pad is refreshed
+           properly.
+
+       o   Solaris xcurses checks whether a window is a pad  in  wnoutrefresh,
+           returning ERR in that case.
+
+           However,  it only sets the flag for subwindows if the parent window
+           is a pad.  Its newpad  function  does  not  set  this  information.
+           Consequently, the check will never fail.
+
+           It  makes no comparable check in pnoutrefresh, though interestingly
+           enough, a comment in the source code states  that  the  lack  of  a
+           check was an MKS extension.
+
+       o   NetBSD  7 curses sets a flag in the WINDOW structure for newpad and
+           subpad,  using  this  to  help   with   the   distinction   between
+           wnoutrefresh and pnoutrefresh.
+
+           It  does  not  check for the case where a subwindow is created in a
+           pad using subwin or derwin.
+
+           The dupwin function returns a regular  window  when  duplicating  a
+           pad.   Likewise,  getwin always returns a window, even if the saved
+           data was from a pad.
+
+       This implementation
+
+       o   sets a flag in the WINDOW structure for newpad and subpad,
+
+       o   allows a subwin or derwin call to succeed having a  pad  parent  by
+           forcing the subwindow to be a pad,
+
+       o   checks  in  both  wnoutrefresh and pnoutrefresh to ensure that pads
+           and windows are handled distinctly, and
+
+       o   ensures  that  dupwin  and  getwin  treat   pads   versus   windows
+           consistently.
+
+
+

SEE ALSO

+       curses(3x), curs_addch(3x), curs_refresh(3x), curs_touch(3x)
+
+
+
+ncurses 6.5                       2024-07-27                      curs_pad(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_print.3x.html b/contrib/ncurses/doc/html/man/curs_print.3x.html new file mode 100644 index 00000000..133e8f79 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_print.3x.html @@ -0,0 +1,130 @@ + + + + + + +curs_print 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_print 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_print(3x)                   Library calls                  curs_print(3x)
+
+
+
+
+

NAME

+       mcprint - write binary data to printer using terminfo capabilities
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int mcprint(char * data, int len);
+
+
+

DESCRIPTION

+       mcprint,   an  ncurses  extension  to  the  curses  library,  uses  the
+       terminal's prtr_non (mc5p) or prtr_on (mc5) and  prtr_off  (mc4)  media
+       copy  capabilities,  if  defined, to send len bytes of the given string
+       data to a printer attached to the terminal.
+
+       mcprint has no means of flow control to the printer nor of knowing  how
+       much buffering it has.  Your application is responsible for keeping the
+       rate of writes to the printer below  its  continuous  throughput  rate,
+       typically about half of its nominal characters-per-second (cps) rating.
+       Dot-matrix printers and 6-page-per-minute laser printers can  typically
+       handle  80  cps,  so  a  conservative rule of thumb is to sleep for one
+       second after sending an 80-character line.
+
+
+

RETURN VALUE

+       On success, mcprint returns  the  number  of  characters  sent  to  the
+       printer.
+
+       mcprint  returns  ERR  if the write operation fails for any reason.  In
+       that event, errno contains either a value set by write(2),  or  one  of
+       the following.
+
+       ENODEV
+            The terminal lacks relevant media copy capabilities.
+
+       ENOMEM
+            ncurses  could  not allocate sufficient memory to buffer the write
+            operation.
+
+
+

EXTENSIONS

+       mcprint is an ncurses(3x) extension, and is not found in  SVr4  curses,
+       4.4BSD curses, or any other previous curses implementation.
+
+
+

PORTABILITY

+       Applications  employing this ncurses extension should condition its use
+       on the visibility of the NCURSES_VERSION preprocessor macro.
+
+
+

HISTORY

+       ncurses introduced mcprint prior to version 1.9.9g (1996).
+
+
+

BUGS

+       Padding in the prtr_non  (mc5p),  prtr_on  (mc5),  and  prtr_off  (mc4)
+       capabilities is not interpreted.
+
+
+

SEE ALSO

+       curses(3x)
+
+
+
+ncurses 6.5                       2024-07-27                    curs_print(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_printw.3x.html b/contrib/ncurses/doc/html/man/curs_printw.3x.html new file mode 100644 index 00000000..259b5612 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_printw.3x.html @@ -0,0 +1,165 @@ + + + + + + +curs_printw 3x 2024-04-20 ncurses 6.5 Library calls + + + + +

curs_printw 3x 2024-04-20 ncurses 6.5 Library calls

+
+curs_printw(3x)                  Library calls                 curs_printw(3x)
+
+
+
+
+

NAME

+       printw,  wprintw,  mvprintw,  mvwprintw,  vwprintw,  vw_printw  - write
+       formatted output to a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int printw(const char *fmt, ...);
+       int wprintw(WINDOW *win, const char *fmt, ...);
+       int mvprintw(int y, int x, const char *fmt, ...);
+       int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...);
+
+       int vw_printw(WINDOW *win, const char *fmt, va_list varglist);
+
+       /* obsolete */
+       int vwprintw(WINDOW *win, const char *fmt, va_list varglist);
+
+
+

DESCRIPTION

+       printw, wprintw, mvprintw, and mvwprintw are  analogous  to  printf(3).
+       In  effect,  the  string  that  would be output by printf(3) is instead
+       output as though waddstr(3x) were used with  win  (or  stdscr)  as  its
+       first argument.
+
+       vwprintw  and  vw_printw  are  analogous  to  vprintf(3), and perform a
+       wprintw using a variable  argument  list.   The  third  argument  is  a
+       va_list, a pointer to a list of arguments, as defined in stdarg.h.
+
+
+

RETURN VALUE

+       These functions return ERR upon failure and OK upon success.
+
+       In ncurses, failure occurs if the library cannot allocate enough memory
+       for the buffer into which the output is formatted,  or  if  the  window
+       pointer win is null.
+
+       Functions  prefixed with "mv" first perform cursor movement and fail if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       No wide character counterpart  functions  are  defined  by  the  "wide"
+       ncurses configuration nor by any standard.  To format and write a wide-
+       character string to a curses window,  consider  using  swprintf(3)  and
+       waddwstr(3x) or similar.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       ncurses defines vw_printw and vwprintw identically  to  support  legacy
+       applications.  However, the latter is obsolete.
+
+       o   X/Open  Curses,  Issue  4  Version  2  (1996),  marked  vwprintw as
+           requiring varargs.h and "TO BE WITHDRAWN", and specified  vw_printw
+           using the stdarg.h interface.
+
+       o   X/Open  Curses,  Issue  5,  Draft 2 (December 2007) marked vwprintw
+           (along with vwscanw and the termcap interface) as withdrawn.  After
+           incorporating  review  comments, this became X/Open Curses, Issue 7
+           (2009).
+
+       o   ncurses provides vwprintw, but marks it as deprecated.
+
+
+

HISTORY

+       While printw was implemented in 4BSD (November  1980),  it  was  unused
+       until  4.2BSD  (August  1983), which employed it for games.  That early
+       version of curses preceded the ANSI C standard of 1989.  It did not use
+       varargs.h,  though  that  had been available since Seventh Edition Unix
+       (1979).  In 1991 (a couple of years after SVr4 was generally available,
+       and  after  the C standard was published), other developers updated the
+       library, using stdarg.h internally in 4.4BSD curses.   Even  with  this
+       improvement,  BSD  curses  did  not  use  function prototypes (nor even
+       declare functions) in curses.h until 1992.
+
+       SVr2 (1984) documented printw and wprintw tersely as "printf on stdscr"
+       and "printf on win", respectively.
+
+       SVr3  (1987)  added  mvprintw  and mvwprintw, with a three-line summary
+       asserting that they were analogous to printf(3),  explaining  that  the
+       string  that  printf(3) would write to the standard output stream would
+       instead be output  using  waddstr  to  the  given  window.   SVr3  also
+       implemented  vwprintw,  describing  its  third  parameter as a va_list,
+       defined in varargs.h, and referred the reader to the manual  pages  for
+       varargs and vprintf for detailed descriptions.
+
+       SVr4  (1989)  introduced  no new variations of printw, but provided for
+       using either varargs.h or stdarg.h to define the va_list type.
+
+       X/Open Curses, Issue 4 (1995), defined vw_printw to  replace  vwprintw,
+       stating that its va_list type is defined in stdarg.h.
+
+
+

SEE ALSO

+       curses(3x), curs_addstr(3x), curs_scanw(3x), printf(3), vprintf(3)
+
+
+
+ncurses 6.5                       2024-04-20                   curs_printw(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_refresh.3x.html b/contrib/ncurses/doc/html/man/curs_refresh.3x.html new file mode 100644 index 00000000..629f6821 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_refresh.3x.html @@ -0,0 +1,182 @@ + + + + + + +curs_refresh 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_refresh 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_refresh(3x)                 Library calls                curs_refresh(3x)
+
+
+
+
+

NAME

+       doupdate,  redrawwin,  refresh,  wnoutrefresh,  wredrawln,  wrefresh  -
+       refresh curses windows or lines thereupon
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int refresh(void);
+       int wrefresh(WINDOW *win);
+       int wnoutrefresh(WINDOW *win);
+       int doupdate(void);
+
+       int redrawwin(WINDOW *win);
+       int wredrawln(WINDOW *win, int beg_line, int num_lines);
+
+
+

DESCRIPTION

+
+

refresh, wrefresh

+       The refresh and wrefresh routines (or wnoutrefresh and  doupdate)  must
+       be  called  to  get  actual  output  to the terminal, as other routines
+       merely manipulate data structures.  The  routine  wrefresh  copies  the
+       named  window  to  the  physical  screen,  taking  into account what is
+       already there to do optimizations.  The refresh routine  is  the  same,
+       using  stdscr  as  the  default  window.   Unless  leaveok(3x) has been
+       enabled, the physical cursor of the terminal is left at the location of
+       the cursor for that window.
+
+
+

wnoutrefresh, doupdate

+       The wnoutrefresh and doupdate routines allow multiple updates with more
+       efficiency  than  wrefresh  alone.   In  addition  to  all  the  window
+       structures,  curses keeps two data structures representing the terminal
+       screen:
+
+       o   a physical screen, describing what is actually on the screen, and
+
+       o   a virtual screen, describing what the programmer wants to  have  on
+           the screen.
+
+       The routine wrefresh works by
+
+       o   first  calling  wnoutrefresh,  which copies the named window to the
+           virtual screen, and
+
+       o   then calling doupdate, 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 wrefresh results in  alternating  calls  to  wnoutrefresh  and
+       doupdate,  causing  several  bursts  of output to the screen.  By first
+       calling wnoutrefresh for each window,  it  is  then  possible  to  call
+       doupdate  once, resulting in only one burst of output, with fewer total
+       characters transmitted and less CPU time used.
+
+       If the win argument to wrefresh  is  the  physical  screen  (i.e.,  the
+       global   variable  curscr),  the  screen  is  immediately  cleared  and
+       repainted from scratch.
+
+       The phrase "copies the named window to the  virtual  screen"  above  is
+       ambiguous.   What  actually happens is that all touched (changed) lines
+       in the window are copied to the virtual screen.  This affects  programs
+       that use overlapping windows; it means that if two windows overlap, you
+       can refresh them in  either  order  and  the  overlap  region  will  be
+       modified  only  when it is explicitly changed.  (But see the section on
+       PORTABILITY below for a warning about exploiting this behavior.)
+
+
+

wredrawln, redrawwin

+       The wredrawln routine indicates to curses that some  screen  lines  are
+       corrupted  and  should  be  thrown away before anything is written over
+       them.  It touches the indicated  lines  (marking  them  changed).   The
+       routine redrawwin touches the entire window.
+
+
+

RETURN VALUE

+       These  routines  return  the  integer  ERR  upon  failure  and OK (SVr4
+       specifies only "an integer  value  other  than  ERR")  upon  successful
+       completion.
+
+       In this implementation
+
+          wnoutrefresh
+               returns  ERR if the window pointer is null, or if the window is
+               really a pad.
+
+          wredrawln
+               return ERR if the associated call to touchln returns ERR.
+
+
+

NOTES

+       Note that refresh and redrawwin may be macros.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       Whether  wnoutrefresh  copies to the virtual screen the entire contents
+       of a window or just its changed portions has never been well-documented
+       in  historic  curses  versions (including SVr4).  It might be unwise to
+       rely on either behavior in programs that might have to be  linked  with
+       other curses implementations.  Instead, you can do an explicit touchwin
+       before the wnoutrefresh  call  to  guarantee  an  entire-contents  copy
+       anywhere.
+
+
+

SEE ALSO

+       curses(3x), curs_outopts(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-14                  curs_refresh(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_scanw.3x.html b/contrib/ncurses/doc/html/man/curs_scanw.3x.html new file mode 100644 index 00000000..d0b9b794 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_scanw.3x.html @@ -0,0 +1,197 @@ + + + + + + +curs_scanw 3x 2024-04-20 ncurses 6.5 Library calls + + + + +

curs_scanw 3x 2024-04-20 ncurses 6.5 Library calls

+
+curs_scanw(3x)                   Library calls                  curs_scanw(3x)
+
+
+
+
+

NAME

+       scanw,  wscanw,  mvscanw,  mvwscanw, vwscanw, vw_scanw - read formatted
+       input from a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int scanw(const char *fmt, ...);
+       int wscanw(WINDOW *win, const char *fmt, ...);
+       int mvscanw(int y, int x, const char *fmt, ...);
+       int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...);
+
+       int vw_scanw(WINDOW *win, const char *fmt, va_list varglist);
+
+       /* obsolete */
+       int vwscanw(WINDOW *win, const char *fmt, va_list varglist);
+
+
+

DESCRIPTION

+       scanw, wscanw, mvscanw, and mvwscanw are  analogous  to  scanf(3).   In
+       effect,  they  call  wgetstr(3x)  with  win  (or  stdscr)  as its first
+       argument,  then  attempt  conversion  of  the  resulting  string   with
+       vsscanf(3).   Fields in the string that do not map to a variable in the
+       fmt parameter are discarded.
+
+       vwscanw and vw_scanw are analogous to vscanf(3), and perform  a  wscanw
+       using  a  variable  argument  list.  The third argument is a va_list, a
+       pointer to a list of arguments, as defined in stdarg.h.
+
+
+

RETURN VALUE

+       These functions return ERR  upon  failure  and  otherwise  a  count  of
+       successful conversions; this quantity may be zero.
+
+       In  ncurses, failure occurs if vsscanf(3) returns EOF, or if the window
+       pointer win is null.
+
+       Functions prefixed with "mv" first perform cursor movement and fail  if
+       the position (y, x) is outside the window boundaries.
+
+
+

NOTES

+       No  wide  character  counterpart  functions  are  defined by the "wide"
+       ncurses configuration nor by any standard.  They  are  unnecessary:  to
+       retrieve  and  convert  a  wide-character string from a curses terminal
+       keyboard, use these functions with the scanf(3) conversions  "%lc"  and
+       "%ls" for wide characters and strings, respectively.
+
+       ncurses  implements vsscanf(3) internally if it is unavailable when the
+       library is configured.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+       ncurses  defines  vw_scanw  and  vwscanw  identically to support legacy
+       applications.  However, the latter is obsolete.
+
+       o   X/Open  Curses,  Issue  4  Version  2  (1996),  marked  vwscanw  as
+           requiring  varargs.h  and "TO BE WITHDRAWN", and specified vw_scanw
+           using the stdarg.h interface.
+
+       o   X/Open Curses, Issue 5, Draft  2  (December  2007)  marked  vwscanw
+           (along with vwscanw and the termcap interface) as withdrawn.  After
+           incorporating review comments, this became X/Open Curses,  Issue  7
+           (2009).
+
+       o   ncurses provides vwscanw, but marks it as deprecated.
+
+       X/Open Curses Issues 4 and 7 both state that these functions return ERR
+       or OK.  This is likely an erratum.
+
+       o   Since the underlying scanf(3)  returns  the  number  of  successful
+           conversions,  and  SVr4  curses was documented to use this feature,
+           this may have been an  editorial  solecism  introduced  by  X/Open,
+           rather than an intentional change.
+
+       o   This  implementation retains compatibility with SVr4 curses.  As of
+           2018,  NetBSD  curses  also  returns  the  number   of   successful
+           conversions.   Both  ncurses  and  NetBSD curses call vsscanf(3) to
+           scan the string, which returns EOF on error.
+
+       o   Portable applications should test only if the return value is  ERR,
+           and  not  compare  it  to  OK,  since  that  value  (zero) might be
+           misleading.
+
+           One portable way to get useful results  would  be  to  use  a  "%n"
+           conversion  at the end of the format string, and check the value of
+           the  corresponding  variable  to  determine  how  many  conversions
+           succeeded.
+
+
+

HISTORY

+       scanw  was  implemented  in 4BSD (November 1980); that early version of
+       curses preceded the ANSI C standard of 1989.  The function  was  unused
+       in  Berkeley  distributions  for  over  ten  years, until 4.4BSD, which
+       employed it in a game.  The 4BSD scanw did not  use  varargs.h,  though
+       that  had been available since Seventh Edition Unix (1979).  In 1991 (a
+       couple of years after SVr4 was generally available,  and  after  the  C
+       standard  was  published),  other developers updated the library, using
+       stdarg.h internally in 4.4BSD curses.  Even with this improvement,  BSD
+       curses  did not use function prototypes (nor even declare functions) in
+       curses.h until 1992.
+
+       SVr2 (1984) documented scanw  and  wscanw  tersely  as  "scanf  through
+       stdscr" and "scanf through win", respectively.
+
+       SVr3 (1987) added mvscanw, and mvwscanw, stating
+
+              "[t]hese routines correspond to scanf(3S), as do their arguments
+              and return values.  wgetstr() is called on the window,  and  the
+              resulting line is used as input for the scan."
+
+       SVr3  also  implemented  vwscanw,  describing  its third parameter as a
+       va_list, defined in varargs.h, and referred the reader  to  the  manual
+       pages  for varargs and vprintf for detailed descriptions.  (Because the
+       SVr3 documentation does not mention vscanf, the  reference  to  vprintf
+       might not be an error).
+
+       SVr4  (1989)  introduced  no  new variations of scanw, but provided for
+       using either varargs.h or stdarg.h to define the va_list type.
+
+       X/Open Curses, Issue 4 (1995), defined  vw_scanw  to  replace  vwscanw,
+       stating that its va_list type is defined in stdarg.h.
+
+
+

SEE ALSO

+       curses(3x), curs_getstr(3x), curs_printw(3x), scanf(3), vscanf(3)
+
+
+
+ncurses 6.5                       2024-04-20                    curs_scanw(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_scr_dump.3x.html b/contrib/ncurses/doc/html/man/curs_scr_dump.3x.html new file mode 100644 index 00000000..748a6f61 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_scr_dump.3x.html @@ -0,0 +1,187 @@ + + + + + + +curs_scr_dump 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_scr_dump 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_scr_dump(3x)                Library calls               curs_scr_dump(3x)
+
+
+
+
+

NAME

+       scr_dump,  scr_restore,  scr_init, scr_set - read/write a curses screen
+       from/to a file
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int scr_dump(const char * filename);
+       int scr_restore(const char * filename);
+       int scr_init(const char * filename);
+       int scr_set(const char * filename);
+
+
+

DESCRIPTION

+       curses provides applications the ability to write the contents  of  the
+       screen  to  a  file and read them back.  To read/write a window (rather
+       than the whole screen) from/to a file, use getwin(3x)  and  putwin(3x),
+       respectively.
+
+
+

scr_dump

+       scr_dump  writes  to  filename  the contents of the virtual screen; see
+       curscr(3x).
+
+
+

scr_restore

+       scr_restore updates  the  virtual  screen  to  match  the  contents  of
+       filename (if validly written with scr_dump).  curses does not perform a
+       refresh;  after  making  any  desired  changes,  call  doupdate(3x)  or
+       similar.
+
+
+

scr_init

+       scr_init  reads filename, using it to initialize curses data structures
+       describing the state of  the  terminal  screen.   curses  then,  if  it
+       decides  the  terminal  state  is  valid,  bases its next update of the
+       screen on this information rather than clearing it  and  starting  from
+       scratch.
+
+       curses  regards  the terminal as in an invalid state for computation of
+       updates based on the contents of filename if
+
+       o   curses knows that the  terminal  has  been  written  to  since  the
+           preceding scr_dump call, or
+
+       o   the  terminal  type supports the terminfo capabilities exit_ca_mode
+           (rmcup) or non_rev_rmcup (nrrmc).
+
+       Either of the foregoing conditions means that curses cannot assume that
+       the  terminal's  contents  match their representation in filename.  The
+       former is due to  terminal  features  (such  as  xterm(1)'s  "alternate
+       screen")  that  couple  cursor-positioning  mode  with a local cache of
+       screen contents.  curses cannot know whether the terminal is displaying
+       from that local cache at the time the application calls scr_init, so it
+       makes a pessimistic assumption that a  full  redraw  is  required;  see
+       subsection "Cursor Motions" of terminfo(5).
+
+       scr_init  could  be  used  after  initscr(3x) or system(3) to share the
+       screen with another process that has done a scr_dump after  endwin(3x).
+       An   application  that  supports  suspending  its  state  on  exit  and
+       subsequent resumption upon  later  execution  might  use  scr_dump  and
+       scr_init thus.
+
+
+

scr_set

+       scr_set  combines  scr_restore and scr_init, synchronizing the contents
+       of filename with the virtual screen.  It can be regarded  as  a  screen
+       inheritance function; consider a real-time screen-sharing application.
+
+
+

RETURN VALUE

+       These functions return OK on success and ERR on failure.
+
+       In  ncurses,  each  function  returns  ERR  if it cannot open filename.
+       scr_init, scr_restore, and  scr_set  return  ERR  if  the  contents  of
+       filename are invalid.
+
+
+

NOTES

+       scr_init, scr_restore, and scr_set may be implemented as macros.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.
+
+       SVr4 omitted the const qualifiers.
+
+       SVr4 documentation describes scr_init such that the dump data  is  also
+       considered  invalid  "if the time-stamp of the tty is old" but does not
+       define "old".
+
+       As of 2024, PDCurses provides these functions.  NetBSD curses does  not
+       provide these functions, although it provides getwin.
+
+       Other  implementations  of curses store the window in binary form.  One
+       drawback to binary form is that this makes the dump dependent upon  the
+       curses  library's  internal  data  structures.   Rather  than  do that,
+       ncurses stores the dump in textual form, allowing more flexible use  of
+       the  data.   For  instance,  SVr4  curses scr_restore requires that the
+       dumped window have the same dimensions as the restored window.  ncurses
+       uses wresize to adjust the restored window size.
+
+
+

HISTORY

+       SVr3  (1987)  introduced  scr_dump,  scr_init, and scr_restore.  SVr3.1
+       added scr_set.
+
+
+

SEE ALSO

+       curses(3x), curs_initscr(3x), curs_refresh(3x), curs_util(3x),
+       system(3), scr_dump(5), terminfo(5), wresize(3x)
+
+
+
+ncurses 6.5                       2024-09-21                 curs_scr_dump(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_scroll.3x.html b/contrib/ncurses/doc/html/man/curs_scroll.3x.html new file mode 100644 index 00000000..fd30c47a --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_scroll.3x.html @@ -0,0 +1,134 @@ + + + + + + +curs_scroll 3x 2024-09-22 ncurses 6.5 Library calls + + + + +

curs_scroll 3x 2024-09-22 ncurses 6.5 Library calls

+
+curs_scroll(3x)                  Library calls                 curs_scroll(3x)
+
+
+
+
+

NAME

+       scroll, scrl, wscrl - scroll a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int scroll(WINDOW * win);
+
+       int scrl(int n);
+       int wscrl(WINDOW * win, int n);
+
+
+

DESCRIPTION

+       scroll  scrolls  the  given window up one line.  That is, every visible
+       line we might number i becomes line i-1.  The text of the top  line  in
+       the  window  disappears  and  the  bottom  line  is  populated with the
+       background  character;  see   bkgd(3x)   (wide-character   API   users:
+       bkgrnd(3x)).  As an optimization, if the scrolling region of the window
+       is the entire screen, the physical screen may be scrolled at  the  same
+       time; see curscr(3x).
+
+       scrl and wscrl scrolls the specified window win up or down per the sign
+       of n.
+
+       o   For positive n, line i+n becomes i (scrolling up);
+
+       o   for negative n, line i-n becomes i (scrolling  down).   ncurses(3x)
+           describes the scrl variant of this function.
+
+       The  cursor does not move.  These functions perform no operation unless
+       scrolling is enabled for the window via scrollok(3x).
+
+
+

RETURN VALUE

+       These functions return ERR upon failure and OK upon success.
+
+       ncurses returns ERR if scrolling is not  enabled  in  the  window,  for
+       example with scrollok(3x), or if the WINDOW pointer is null.
+
+
+

NOTES

+       scrl and wscrl may be implemented as macros.
+
+       Unusually,  there  is  no wscroll function; scroll behaves as one would
+       expect wscroll to, accepting a WINDOW pointer argument.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.  It defines no  error
+       conditions.
+
+       SVr4  specifies  only "an integer value other than ERR" as a successful
+       return value.
+
+       SVr4  indicates  that  the   optimization   of   physically   scrolling
+       immediately  if  the scroll region is the entire screen "is" performed,
+       not "may be" performed.  ncurses deliberately does not  guarantee  that
+       this  occurs,  to  leave open the possibility of better optimization of
+       multiple scroll actions on the next update.
+
+       Neither SVr4 curses nor X/Open Curses specify whether  these  functions
+       zero  the  attributes  or  color  pair  identifier  of  the  background
+       character.  In ncurses, they do not.
+
+
+

SEE ALSO

+       curses(3x), curs_outopts(3x)
+
+
+
+ncurses 6.5                       2024-09-22                   curs_scroll(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_slk.3x.html b/contrib/ncurses/doc/html/man/curs_slk.3x.html new file mode 100644 index 00000000..5802ec28 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_slk.3x.html @@ -0,0 +1,339 @@ + + + + + + +curs_slk 3x 2024-06-22 ncurses 6.5 Library calls + + + + +

curs_slk 3x 2024-06-22 ncurses 6.5 Library calls

+
+curs_slk(3x)                     Library calls                    curs_slk(3x)
+
+
+
+
+

NAME

+       slk_init,  slk_set,  slk_wset, slk_refresh, slk_noutrefresh, slk_label,
+       slk_clear,    slk_restore,    slk_touch,    slk_attron,    slk_attrset,
+       slk_attroff,   slk_attr_on,   slk_attr_set,   slk_attr_off,   slk_attr,
+       slk_color, extended_slk_color - curses soft label key routines
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int slk_init(int fmt);
+
+       int slk_set(int labnum, const char *label, int align);
+       int slk_wset(int labnum, const wchar_t *label, int align);
+
+       char *slk_label(int labnum);
+
+       int slk_refresh(void);
+       int slk_noutrefresh(void);
+       int slk_clear(void);
+       int slk_restore(void);
+       int slk_touch(void);
+
+       int slk_attron(const chtype attrs);
+       int slk_attroff(const chtype attrs);
+       int slk_attrset(const chtype attrs);
+       int slk_attr_on(attr_t attrs, void *opts);
+       int slk_attr_off(const attr_t attrs, void *opts);
+       int slk_attr_set(const attr_t attrs, short pair, void*opts);
+       /* extension */
+       attr_t slk_attr(void);
+
+       int slk_color(short pair);
+       /* extension */
+       int extended_slk_color(int pair);
+
+
+

DESCRIPTION

+       These functions manipulate the  soft  function  key  labels  that  some
+       hardware  terminals support.  For those terminals that do not have soft
+       labels, curses takes over the  bottom  line  of  stdscr,  reducing  its
+       vertical  size  and the value of LINES by one.  By default, curses uses
+       eight labels of up to eight characters each.
+
+       ncurses furthermore supports a mode comprising twelve labels of  up  to
+       five  characters  each,  following a convention associated with the IBM
+       PC/AT keyboard.  ncurses simulates this mode by taking over up  to  two
+       lines  at the bottom of the screen; it does not try to use any hardware
+       support for this mode.
+
+
+

Initialization

+       slk_init  must  be  called  before  initscr  or  newterm.   If  initscr
+       eventually uses a line from stdscr to emulate the soft labels, then fmt
+       determines how the labels are arranged on the screen.
+
+       0  indicates a 3-2-3 arrangement of the labels.
+
+       1  indicates a 4-4 arrangement
+
+       2  indicates the PC-like 4-4-4 mode.
+
+       3  is again the PC-like 4-4-4 mode, but in addition an  index  line  is
+          generated,  helping  the  user  to  associate  each  label  with its
+          numbered function key.  LINES and the vertical size  of  stdscr  are
+          further reduced.
+
+
+

Labels

+       Populate  the  labels  with  normal strings (slk_set) or wide-character
+       strings (slk_wset).  Each function takes three parameters.
+
+       labnum  is the label number, from 1 to 8 (12 if fmt in slk_init is 2 or
+               3);
+
+       label   is  be the string to put on the label, up to eight (five if fmt
+               in slk_init is 2 or 3) characters in length.  A empty string or
+               a null pointer sets up a blank label.
+
+       align   is  0,  1,  or 2, aligning label to the left, center, or right,
+               respectively, within the 8 (5) character cells housing it.
+
+       slk_label obtains the string assigned to label number labnum, with  any
+       leading and trailing blanks stripped.
+
+
+

Screen Updates

+       slk_refresh  and  slk_noutrefresh  affect  the  soft key label lines as
+       wrefresh and wnoutrefresh do the curses window.
+
+       The slk_clear routine clears the soft labels from the screen.
+
+       The slk_restore routine restores the soft labels to the screen after  a
+       slk_clear has been performed.
+
+       The  slk_touch routine forces all the soft labels to be output the next
+       time a slk_noutrefresh is performed.
+
+
+

Video Attributes

+       The  slk_attron,  slk_attrset,  slk_attroff,  and   slk_attr   routines
+       correspond  to  attron,  attrset,  attroff, and attr_get, respectively.
+       They have an effect only if soft labels are  simulated  on  the  bottom
+       line  of  the  screen.   The  default  highlight for soft key labels is
+       A_STANDOUT (as in System V curses, which does not document this fact).
+
+
+

Colors

+       The slk_color routine corresponds to color_set.  It has an effect  only
+       if soft labels are simulated on the bottom line of the screen.
+
+       Because  slk_color  accepts  only short (signed 16-bit integer) values,
+       this implementation provides extended_slk_color, which accepts  an  int
+       value of at least 32 bits.
+
+
+

RETURN VALUE

+       Routines  that  return  an integer return ERR upon failure and OK (SVr4
+       specifies only "an integer  value  other  than  ERR")  upon  successful
+       completion.
+
+       X/Open Curses defines no error conditions.
+
+       In this implementation
+
+          slk_attr
+               returns the attribute used for the soft keys.
+
+          slk_attroff,  slk_attron,  slk_clear,  slk_noutrefresh, slk_refresh,
+          slk_touch
+               return  ERR  if  the  terminal  or  the   softkeys   were   not
+               initialized.
+
+          slk_attrset
+               returns   ERR   if  the  terminal  or  the  softkeys  were  not
+               initialized.
+
+          slk_attr_set
+               returns  ERR  if  the  terminal  or  the  softkeys   were   not
+               initialized,   or   the   color   pair  is  outside  the  range
+               0..COLOR_PAIRS-1.
+
+          slk_color
+               returns  ERR  if  the  terminal  or  the  softkeys   were   not
+               initialized,   or   the   color   pair  is  outside  the  range
+               0..COLOR_PAIRS-1.
+
+          slk_init
+               returns ERR if the format parameter is outside the range 0..3.
+
+          slk_label
+               returns NULL on error.
+
+          slk_set
+               returns  ERR  if  the  terminal  or  the  softkeys   were   not
+               initialized,  or  the  labnum parameter is outside the range of
+               label counts, or if the format parameter is outside  the  range
+               0..2, or if memory for the labels cannot be allocated.
+
+
+

NOTES

+       Most  applications  would  use  slk_noutrefresh  because  a wrefresh is
+       likely to follow soon.
+
+
+

EXTENSIONS

+       X/Open Curses documents the opts argument as reserved for  future  use,
+       saying  that  it must be null.  This implementation uses that parameter
+       in ABI 6 for the functions which have a color pair parameter to support
+       extended color pairs.
+
+       For  functions  which  modify the color, e.g., slk_attr_set, if opts is
+       set it is treated as a pointer to int, and used to set the  color  pair
+       instead of the short pair parameter.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions, with some differences
+       from SVr4 curses:
+
+       o   X/Open  added  functions  like  the   SVr4   attribute-manipulation
+           functions  slk_attron,  slk_attroff, and slk_attrset, but which use
+           attr_t parameters (rather than chtype), along with a reserved  opts
+           parameter.
+
+           Two  of  these  new  functions  (unlike the SVr4 functions) have no
+           provision for color: slk_attr_on and slk_attr_off.
+
+           The third function (slk_attr_set) has a color pair parameter.
+
+       o   It added const qualifiers to parameters (unnecessarily), and
+
+       o   It added slk_color.
+
+       Although slk_start is declared in the curses header file,  it  was  not
+       documented by SVr4 other than its presence in a list of libtermlib.so.1
+       symbols.  Reading the source code (i.e., Illumos):
+
+       o   slk_start has two parameters:
+
+           o   ng (number of groups) and
+
+           o   gp (group pointer).
+
+       o   Soft-key groups are an array of ng integers.
+
+       o   In SVr4, slk_init calls slk_start passing a null for gp.  For  this
+           case,  slk_start  uses  the  number  of  groups ng (3 for the 3-2-3
+           layout, 2 for the 4-4 layout) which slk_init provided.
+
+           If ng is  neither  2  or  3,  slk_start  checks  the  terminfo  fln
+           (label_format)  capability,  interpreting that as a comma-separated
+           list of numbers, e.g., "3,2,3" for the 3-2-3 layout.
+
+           Finally, if there is no fln capability, slk_start returns ERR.
+
+       o   If slk_start is given a non-null gp, it copies the ng  elements  of
+           the group of soft-keys, up to 16.
+
+           If there are more than 16 elements, slk_start returns ERR.
+
+       o   The  format  codes  2  and  3 for slk_init were added by ncurses in
+           1996.  PDCurses 2.4 added this feature in 2001.
+
+       The function slk_attr was added by ncurses in 1996.
+
+       X/Open Curses does not specify a limit for the  number  of  colors  and
+       color pairs which a terminal can support.  However, in its use of short
+       for the parameters, it carries over SVr4's  implementation  detail  for
+       the compiled terminfo database, which uses signed 16-bit numbers.  This
+       implementation provides extended versions of those functions which  use
+       int  parameters,  allowing  applications to use larger color- and pair-
+       numbers.
+
+
+

HISTORY

+       SVr3 introduced these functions:
+         slk_clear
+         slk_init
+         slk_label
+         slk_noutrefresh
+         slk_refresh
+         slk_restore
+         slk_set
+         slk_touch
+
+       SVr4 added these functions:
+         slk_attroff
+         slk_attron
+         slk_attrset
+         slk_start
+
+       X/Open Curses added these:
+         slk_attr_off
+         slk_attr_on
+         slk_attr_set
+         slk_color
+         slk_wset
+
+
+

SEE ALSO

+       curses(3x),    curs_attr(3x),    curs_initscr(3x),    curs_refresh(3x),
+       curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-06-22                      curs_slk(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_sp_funcs.3x.html b/contrib/ncurses/doc/html/man/curs_sp_funcs.3x.html new file mode 100644 index 00000000..4b84cd78 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_sp_funcs.3x.html @@ -0,0 +1,315 @@ + + + + + + +curs_sp_funcs 3x 2024-05-11 ncurses 6.5 Library calls + + + + +

curs_sp_funcs 3x 2024-05-11 ncurses 6.5 Library calls

+
+curs_sp_funcs(3x)                Library calls               curs_sp_funcs(3x)
+
+
+
+
+

NAME

+       curs_sp_funcs - curses screen-pointer extension
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int alloc_pair_sp(SCREEN* sp, int fg, int bg);
+       int assume_default_colors_sp(SCREEN* sp, int fg, int bg);
+       int baudrate_sp(SCREEN* sp);
+       int beep_sp(SCREEN* sp);
+       bool can_change_color_sp(SCREEN* sp);
+       int cbreak_sp(SCREEN* sp);
+       int color_content_sp(SCREEN* sp, short color, short* r, short* g, short* b);
+       int curs_set_sp(SCREEN* sp, int visibility);
+       int def_prog_mode_sp(SCREEN* sp);
+       int def_shell_mode_sp(SCREEN* sp);
+
+       int define_key_sp(SCREEN* sp, const char * definition, int keycode);
+       int delay_output_sp(SCREEN* sp, int ms);
+       int doupdate_sp(SCREEN* sp);
+       int echo_sp(SCREEN* sp);
+       int endwin_sp(SCREEN* sp);
+       char erasechar_sp(SCREEN* sp);
+       int erasewchar_sp(SCREEN* sp, wchar_t *wc);
+       int extended_color_content_sp(SCREEN * sp, int color, int * r, int * g, int * b);
+       int extended_pair_content_sp(SCREEN* sp, int pair, int * fg, int * bg);
+       int extended_slk_color_sp(SCREEN* sp, int pair);
+
+       void filter_sp(SCREEN* sp);
+       int find_pair_sp(SCREEN* sp, int fg, int bg);
+       int flash_sp(SCREEN* sp);
+       int flushinp_sp(SCREEN* sp);
+       int free_pair_sp(SCREEN* sp, int pair);
+       int get_escdelay_sp(SCREEN* sp);
+       int getmouse_sp(SCREEN* sp, MEVENT* event);
+       WINDOW* getwin_sp(SCREEN* sp, FILE* filep);
+       int halfdelay_sp(SCREEN* sp, int tenths);
+       bool has_colors_sp(SCREEN* sp);
+
+       bool has_ic_sp(SCREEN* sp);
+       bool has_il_sp(SCREEN* sp);
+       int has_key_sp(SCREEN* sp, int c);
+       bool has_mouse_sp(SCREEN* sp);
+       int init_color_sp(SCREEN* sp, short color, short r, short g, short b);
+       int init_extended_color_sp(SCREEN* sp, int color, int r, int g, int b);
+       int init_extended_pair_sp(SCREEN* sp, int pair, int fg, int bg);
+       int init_pair_sp(SCREEN* sp, short pair, short fg, short bg);
+       int intrflush_sp(SCREEN* sp, WINDOW* win, bool bf);
+       int is_cbreak_sp(SCREEN* sp);
+
+       int is_echo_sp(SCREEN* sp);
+       int is_nl_sp(SCREEN* sp);
+       int is_raw_sp(SCREEN* sp);
+       bool is_term_resized_sp(SCREEN* sp, int lines, int columns);
+       bool isendwin_sp(SCREEN* sp);
+       int key_defined_sp(SCREEN* sp, const char *definition);
+       char* keybound_sp(SCREEN* sp, int keycode, int count);
+       NCURSES_CONST char* keyname_sp(SCREEN* sp, int c);
+       int keyok_sp(SCREEN* sp, int keycode, bool enable);
+       char killchar_sp(SCREEN* sp);
+
+       int killwchar_sp(SCREEN* sp, wchar_t *wc);
+       char* longname_sp(SCREEN* sp);
+       int mcprint_sp(SCREEN* sp, char *data, int len);
+       int mouseinterval_sp(SCREEN* sp, int erval);
+       mmask_t mousemask_sp(SCREEN* sp, mmask_t newmask, mmask_t *oldmask);
+       int mvcur_sp(SCREEN* sp, int oldrow, int oldcol, int newrow, int newcol);
+       int napms_sp(SCREEN* sp, int ms);
+       WINDOW* newpad_sp(SCREEN* sp, int nrows, int ncols);
+       SCREEN* new_prescr(void);
+       SCREEN* newterm_sp(SCREEN* sp, const char *type, FILE *outfd, FILE *infd);
+
+       WINDOW* newwin_sp(SCREEN* sp, int nlines, int ncols, int begin_y, int begin_x);
+       int nl_sp(SCREEN* sp);
+       int nocbreak_sp(SCREEN* sp);
+       int noecho_sp(SCREEN* sp);
+       void nofilter_sp(SCREEN* sp);
+       int nonl_sp(SCREEN* sp);
+       void noqiflush_sp(SCREEN* sp);
+       int noraw_sp(SCREEN* sp);
+       int pair_content_sp(SCREEN* sp, short pair, short* fg, short* bg);
+       void qiflush_sp(SCREEN* sp);
+
+       int raw_sp(SCREEN* sp);
+       void reset_color_pairs_sp(SCREEN* sp);
+       int reset_prog_mode_sp(SCREEN* sp);
+       int reset_shell_mode_sp(SCREEN* sp);
+       int resetty_sp(SCREEN* sp);
+       int resize_term_sp(SCREEN* sp, int lines, int columns);
+       int resizeterm_sp(SCREEN* sp, int lines, int columns);
+       int ripoffline_sp(SCREEN* sp, int line, int (*init)(WINDOW* win, int fmt));
+       int savetty_sp(SCREEN* sp);
+       int scr_init_sp(SCREEN* sp, const char *filename);
+
+       int scr_restore_sp(SCREEN* sp, const char *filename);
+       int scr_set_sp(SCREEN* sp, const char *filename);
+       int set_escdelay_sp(SCREEN* sp, int ms);
+       int set_tabsize_sp(SCREEN* sp, int cols);
+       int slk_attrset_sp(SCREEN* sp, const chtype a);
+       int slk_attr_set_sp(SCREEN* sp, const attr_t attrs, short pair, void*opts);
+       int slk_attroff_sp(SCREEN* sp, const chtype a);
+       int slk_attron_sp(SCREEN* sp, const chtype a);
+       attr_t slk_attr_sp(SCREEN* sp);
+       int slk_clear_sp(SCREEN* sp);
+
+       int slk_color_sp(SCREEN* sp, short pair);
+       int slk_init_sp(SCREEN* sp, int fmt);
+       char* slk_label_sp(SCREEN* sp, int labnum);
+       int slk_noutrefresh_sp(SCREEN* sp);
+       int slk_refresh_sp(SCREEN* sp);
+       int slk_restore_sp(SCREEN* sp);
+       int slk_set_sp(SCREEN* sp, int labnum, const char * label, int fmt);
+       int slk_touch_sp(SCREEN* sp);
+       int start_color_sp(SCREEN* sp);
+       attr_t term_attrs_sp(SCREEN* sp);
+
+       chtype termattrs_sp(SCREEN* sp);
+       char* termname_sp(SCREEN* sp);
+       int typeahead_sp(SCREEN* sp, int fd);
+       int unget_wch_sp(SCREEN* sp, const wchar_t wc);
+       int ungetch_sp(SCREEN* sp, int c);
+       int ungetmouse_sp(SCREEN* sp, MEVENT* event);
+       int use_default_colors_sp(SCREEN* sp);
+       void use_env_sp(SCREEN* sp, bool bf);
+       int use_legacy_coding_sp(SCREEN* sp, int level);
+       void use_tioctl_sp(SCREEN *sp, bool bf);
+
+       int vid_attr_sp(SCREEN* sp, attr_t attrs, short pair, void * opts);
+       int vid_puts_sp(SCREEN* sp, attr_t attrs, short pair, void * opts, NCURSES_SP_OUTC putc);
+       int vidattr_sp(SCREEN* sp, chtype attrs);
+       int vidputs_sp(SCREEN* sp, chtype attrs, NCURSES_SP_OUTC putc);
+       wchar_t* wunctrl_sp(SCREEN* sp, cchar_t *wch);
+
+       #include <form.h>
+
+       FORM* new_form_sp(SCREEN* sp, FIELD **fields);
+
+       #include <menu.h>
+
+       MENU* new_menu_sp(SCREEN* sp, ITEM **items);
+
+       #include <panel.h>
+
+       PANEL* ceiling_panel(SCREEN* sp);
+       PANEL* ground_panel(SCREEN* sp);
+       void update_panels_sp(SCREEN* sp);
+
+       #include <term.h>
+
+       int del_curterm_sp(SCREEN* sp, TERMINAL *oterm);
+       int putp_sp(SCREEN* sp, const char *str);
+       int restartterm_sp(SCREEN* sp, NCURSES_CONST char*term, int filedes, int *errret);
+       TERMINAL* set_curterm_sp(SCREEN* sp, TERMINAL*nterm);
+       int tgetent_sp(SCREEN* sp, char *bp, const char *name);
+       int tgetflag_sp(SCREEN* sp, const char *capname);
+       int tgetnum_sp(SCREEN* sp, const char *capname);
+       char* tgetstr_sp(SCREEN* sp, const char *capname, char **area);
+       char* tgoto_sp(SCREEN* sp, const char *capname, int col, int row);
+       int tigetflag_sp(SCREEN* sp, const char *capname);
+
+       int tigetnum_sp(SCREEN* sp, const char *capname);
+       char* tigetstr_sp(SCREEN* sp, const char *capname);
+       /* tparm_sp may use 9 long parameters rather than being variadic */
+       char* tparm_sp(SCREEN* sp, const char *str, ...);
+       int tputs_sp(SCREEN* sp, const char *str, int affcnt, NCURSES_SP_OUTC putc);
+
+       #include <unctrl.h>
+
+       NCURSES_CONST char* unctrl_sp(SCREEN* sp, chtype ch);
+
+
+

DESCRIPTION

+       This  implementation  can  be  configured to provide a set of functions
+       which improve the ability to manage multiple screens.  This feature can
+       be added to any of the configurations supported by ncurses; it adds new
+       symbols without changing the meaning of any of the existing ones.
+
+
+

Improved Functions

+       Most of the functions  are  new  versions  of  existing  functions.   A
+       parameter  is added at the front of the parameter list.  It is a SCREEN
+       pointer.
+
+       The existing functions all use the current screen, which  is  a  static
+       variable.   The  extended  functions  use the specified screen, thereby
+       reducing the number of variables  which  must  be  modified  to  update
+       multiple screens.
+
+
+

New Functions

+       Here are the new functions:
+
+       ceiling_panel
+            this returns a pointer to the topmost panel in the given screen.
+
+       ground_panel
+            this returns a pointer to the lowest panel in the given screen.
+
+       new_prescr
+            when  creating  a  new  screen,  the library uses static variables
+            which have been preset, e.g.,  by  use_env(3x),  filter(3x),  etc.
+            With  the  screen-pointer extension, there are situations where it
+            must create a current screen before the unextended  library  does.
+            The  new_prescr function is used internally to handle these cases.
+            It is also provided to allow  applications  to  customize  library
+            initialization.
+
+
+

NOTES

+       This extension introduces some new names:
+
+       NCURSES_SP_FUNCS
+            This  is set to the library patch-level number.  In the unextended
+            library, this is zero (0), to make it useful for checking  if  the
+            extension is provided.
+
+       NCURSES_SP_NAME
+            The new functions are named using the macro NCURSES_SP_NAME, which
+            hides the actual implementation.   Currently  this  adds  a  "_sp"
+            suffix  to  the name of the unextended function.  This manual page
+            indexes the extensions showing the full name.  However the  proper
+            usage  of  these  functions  uses  the  macro,  to provide for the
+            possibility of changing the naming convention for specific library
+            configurations.
+
+       NCURSES_SP_OUTC
+            This  is  a new function-pointer type to use in the screen-pointer
+            functions where an NCURSES_OUTC is used in the unextended library.
+
+       NCURSES_OUTC
+            This is a  function-pointer  type  used  for  the  cases  where  a
+            function   passes   characters   to   the   output  stream,  e.g.,
+            vidputs(3x).
+
+
+

PORTABILITY

+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code   depending   on   ncurses   extensions   be   conditioned   using
+       NCURSES_SP_FUNCS.
+
+
+

SEE ALSO

+       curses(3x), curs_opaque(3x), curs_threads(3x)
+
+
+
+ncurses 6.5                       2024-05-11                 curs_sp_funcs(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_termattrs.3x.html b/contrib/ncurses/doc/html/man/curs_termattrs.3x.html new file mode 100644 index 00000000..681a1a1a --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_termattrs.3x.html @@ -0,0 +1,176 @@ + + + + + + +curs_termattrs 3x 2024-05-11 ncurses 6.5 Library calls + + + + +

curs_termattrs 3x 2024-05-11 ncurses 6.5 Library calls

+
+curs_termattrs(3x)               Library calls              curs_termattrs(3x)
+
+
+
+
+

NAME

+       baudrate,  erasechar,  erasewchar, has_ic, has_il, killchar, killwchar,
+       longname, term_attrs,  termattrs,  termname  -  get  and  set  terminal
+       attributes with curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int baudrate(void);
+       char erasechar(void);
+       int erasewchar(wchar_t *wc);
+       bool has_ic(void);
+       bool has_il(void);
+       char killchar(void);
+       int killwchar(wchar_t *wc);
+       char *longname(void);
+       attr_t term_attrs(void);
+       chtype termattrs(void);
+       char *termname(void);
+
+
+

DESCRIPTION

+
+

baudrate

+       The  baudrate  routine  returns  the output speed of the terminal.  The
+       number returned is in bits per second, for  example  9600,  and  is  an
+       integer.
+
+
+

erasechar, erasewchar

+       The erasechar routine returns the user's current erase character.
+
+       The  erasewchar  routine  stores  the  current  erase  character in the
+       location referenced by wc.  If no erase character has been defined, the
+       routine fails and the location referenced by wc is not changed.
+
+
+

has_ic, has_il

+       The  has_ic  routine  is  true  if the terminal has insert- and delete-
+       character capabilities.
+
+       The has_il 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 scrollok(3x).
+
+
+

killchar, killwchar

+       The killchar routine returns the user's current line kill character.
+
+       The  killwchar  routine  stores  the current line-kill character in the
+       location referenced by wc.  If no line-kill character has been defined,
+       the routine fails and the location referenced by wc is not changed.
+
+
+

longname

+       The  longname  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 initscr or newterm.  The area is overwritten by  each  call  to
+       newterm  and  is not restored by set_term, so the value should be saved
+       between calls to newterm if longname is going to be used with  multiple
+       terminals.
+
+
+

termattrs, term_attrs

+       If  a  given  terminal  does  not  support  a  video  attribute that an
+       application program is trying to use, curses may substitute a different
+       video  attribute for it.  The termattrs and term_attrs functions return
+       a logical OR of all video attributes supported by the terminal using A_
+       and  WA_  constants  respectively.   This  information is useful when a
+       curses program needs  complete  control  over  the  appearance  of  the
+       screen.
+
+
+

termname

+       The termname routine returns the terminal name used by setupterm.
+
+
+

RETURN VALUE

+       longname and termname return NULL on error.
+
+       Routines  that  return  an integer return ERR upon failure and OK (SVr4
+       only specifies "an integer  value  other  than  ERR")  upon  successful
+       completion.
+
+
+

NOTES

+       Note that termattrs may be a macro.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue  4  describes  these  functions.  It changes the
+       return type of termattrs to the new  type  attr_t.   Most  versions  of
+       curses truncate the result returned by termname to 14 characters.
+
+
+

SEE ALSO

+       curses(3x), curs_initscr(3x), curs_outopts(3x)
+
+
+
+ncurses 6.5                       2024-05-11                curs_termattrs(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_termcap.3x.html b/contrib/ncurses/doc/html/man/curs_termcap.3x.html new file mode 100644 index 00000000..5150c786 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_termcap.3x.html @@ -0,0 +1,403 @@ + + + + + + +curs_termcap 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_termcap 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_termcap(3x)                 Library calls                curs_termcap(3x)
+
+
+
+
+

NAME

+       PC, UP, BC, ospeed, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs -
+       curses emulation of termcap
+
+
+

SYNOPSIS

+       #include <curses.h>
+       #include <term.h>
+
+       char PC;
+       char * UP;
+       char * BC;
+       short ospeed;
+
+       int tgetent(char *bp, const char *name);
+       int tgetflag(const char *id);
+       int tgetnum(const char *id);
+       char *tgetstr(const char *id, char **area);
+       char *tgoto(const char *cap, int col, int row);
+       int tputs(const char *str, int affcnt, int (*putc)(int));
+
+
+

DESCRIPTION

+       ncurses  provides  the  foregoing  variables   and   functions   as   a
+       compatibility layer for programs that use the termcap library.  The API
+       is the same, but behavior is  emulated  using  the  terminfo  database.
+       Thus,  it  can  be  used  only  to  query  the capabilities of terminal
+       database entries for which a terminfo entry has been compiled.
+
+
+

Initialization

+       tgetent loads the terminal database entry for name; see term(7).   This
+       must be done before calling any of the other functions.  It returns
+
+          1    on success,
+
+          0    if there is no such entry (or if the matching entry describes a
+               generic terminal, having  too  little  information  for  curses
+               applications to run), and
+
+          -1   if the terminfo database could not be found.
+
+       This implementation differs from those of historical termcap libraries.
+
+          o   ncurses  ignores  the  buffer  pointer  bp,  as do other termcap
+              implementations conforming to  portions  of  X/Open  Curses  now
+              withdrawn.   The  BSD  termcap library would store a copy of the
+              terminal  type  description  in  the  area  referenced  by  this
+              pointer.  terminfo stores terminal type descriptions in compiled
+              form, which is not the same thing.
+
+          o   The meanings of the  return  values  differ.   The  BSD  termcap
+              library  does  not  check  whether the terminal type description
+              includes the generic (gn) capability, nor whether  the  terminal
+              type  description  supports  an  addressable  cursor, a property
+              essential for any curses implementation to operate.
+
+
+

Retrieving Capability Values

+       tgetflag reports the Boolean entry  for  id,  or  zero  if  it  is  not
+       available.
+
+       tgetnum obtains the numeric entry for id, or -1 if it is not available.
+
+       tgetstr  returns  the  string  entry  for  id,  or  NULL  if  it is not
+       available.   Use  tputs  to  output  the  string  returned.   The  area
+       parameter is used as follows.
+
+          o   It is assumed to be the address of a pointer to a buffer managed
+              by the calling application.
+
+          o   However, ncurses checks to ensure that area  is  not  NULL,  and
+              also  that  the resulting buffer pointer is not NULL.  If either
+              check fails, area is ignored.
+
+          o   If the checks succeed, ncurses also copies the return  value  to
+              the  buffer  pointed to by area, and the library updates area to
+              point past the null character terminating this value.
+
+          o   The return value itself is  an  address  in  the  terminal  type
+              description loaded into memory.
+
+
+

Applying String Capabilities

+       String capabilities can be parameterized; see subsection "Parameterized
+       Strings" in  terminfo(5).  tgoto applies its second and third arguments
+       to  the  parametric  placeholders in the capability stored in the first
+       argument.
+
+       o   The capability may contain padding specifications;  see  subsection
+           "Delays  and  Padding"  of terminfo(5).  The output of tgoto should
+           thus be passed to tputs rather than some other output function such
+           as printf(3).
+
+       o   While  tgoto  is  assumed  to  be used for the two-parameter cursor
+           positioning  capability,  termcap  applications  also  use  it  for
+           single-parameter capabilities.
+
+           Doing  so  reveals  a  quirk  in tgoto: most hardware terminals use
+           cursor addressing with row first, but the  original  developers  of
+           the  termcap  interface  chose  to  put  the col (column) parameter
+           first.  The tgoto function swaps the order of its  parameters.   It
+           does  this  even  for  calls requiring only a single parameter.  In
+           that case, the first parameter is merely a placeholder.
+
+       o   Normally the ncurses  library  is  compiled  without  full  termcap
+           support.  In that case, tgoto uses an internal version of tparm(3x)
+           (a more capable function).
+
+           Because it uses tparm internally, tgoto is able to use  some  term-
+           info  features, but not all.  In particular, it allows only numeric
+           parameters; tparm supports string parameters.
+
+           However, tparm is not  a  termcap  feature,  and  portable  termcap
+           applications should not rely upon its availability.
+
+       tputs  is described in curs_terminfo(3x).  It can retrieve capabilities
+       by either termcap or terminfo code.
+
+
+

Global Variables

+       The variables PC, UP and BC are set by tgetent to the terminfo  entry's
+       data for pad_char, cursor_up and backspace_if_not_bs, respectively.  UP
+       is not used by ncurses.  PC is used by delay_output(3x).  BC is used by
+       tgoto emulation.  The variable ospeed is set by ncurses using a system-
+       specific encoding to indicate the terminal's data rate.
+
+
+

Releasing Memory

+       The termcap functions provide  no  means  of  freeing  memory,  because
+       legacy  termcap  implementations used only the buffer areas provided by
+       the caller via tgetent and tgetstr.  Those buffers are unused in  term-
+       info.
+
+       By  contrast,  terminfo  allocates  memory.   It  uses setupterm(3x) to
+       obtain the data  used  by  tgetent  and  the  functions  that  retrieve
+       capability values.  One could use
+              del_curterm(cur_term);
+       to  free  this  memory,  but  there  is an additional complication with
+       ncurses.  It uses a fixed-size pool of storage locations, one per value
+       of the terminal name parameter given to tgetent.  The screen(1) program
+       relies upon this arrangement to improve its performance.
+
+       An application that uses only the termcap  functions,  not  the  higher
+       level  curses  API,  could  release  the  memory using del_curterm(3x),
+       because the pool is freed using other functions; see curs_memleaks(3x).
+
+
+

RETURN VALUE

+       The return values of  tgetent,  tgetflag,  tgetname,  and  tgetstr  are
+       documented above.
+
+       tgoto returns NULL on error.  Error conditions include:
+
+       o   uninitialized state (tgetent was not called successfully),
+
+       o   cap being a null pointer,
+
+       o   cap referring to a canceled capability,
+
+       o   cap  being  a  capability  with  string-valued  parameters (a term-
+           info-only feature), and
+
+       o   cap being a capability with more than two parameters.
+
+       See curs_terminfo(3x) regarding tputs.
+
+
+

NOTES

+       ncurses compares only the first two characters of the id  parameter  of
+       tgetflag, tgetnum, and tgetstr to the capability names in the database.
+
+
+

PORTABILITY

+       These  functions  are  no  longer standardized (and the variables never
+       were); ncurses provides them  to  support  legacy  applications.   They
+       should not be used in new programs.
+
+
+

Standards

+       o   X/Open   Curses,   Issue  4,  Version  2  (1996),  describes  these
+           functions, marking them as "TO BE WITHDRAWN".
+
+       o   X/Open Curses, Issue 7 (2009) withdrew the termcap interface (along
+           with the vwprintw and vwscanw functions).
+
+       Neither  X/Open  Curses  nor  the  SVr4 man pages documented the return
+       values of tgetent correctly, though all three shown here were  in  fact
+       returned  ever  since  SVr1.   In particular, an omission in the X/Open
+       Curses specification has  been  misinterpreted  to  mean  that  tgetent
+       returns  OK  or  ERR.   Because  the  purpose  of these functions is to
+       provide compatibility with the termcap library, that  is  a  defect  in
+       X/Open Curses, Issue 4, Version 2 rather than in ncurses.
+
+   Compatibility with BSD termcap
+       ncurses  provides  externally  visible  variables  to  support  certain
+       termcap  applications.   However,  their  correct   usage   is   poorly
+       documented; for example, it is unclear when reading and writing them is
+       meaningful.  In particular, some applications are reported  to  declare
+       and/or modify ospeed.
+
+       The  constraint  that only the first two characters of the id parameter
+       are looked  up  in  the  terminal  database  escapes  many  application
+       developers.   The  BSD  termcap library did not require a trailing null
+       character after the capability identifier passed to  tgetstr,  tgetnum,
+       and tgetflag.  Some applications thus assume that the termcap interface
+       does not  require  the  trailing  null  character  for  the  capability
+       identifier.
+
+       ncurses  disallows  matches  by  the termcap interface against extended
+       capability names that are longer than two characters; see user_caps(5).
+
+       The BSD termcap function tgetent returns the text of a termcap entry in
+       the  buffer  passed  as an argument.  This library, like other terminfo
+       implementations, does not store terminal type descriptions as text.  It
+       sets the buffer contents to a null-terminated string.
+
+
+

Header File

+       This  library  includes  a termcap.h header file for compatibility with
+       other  implementations,  but  it  is  rarely  used  because  the  other
+       implementations are not mutually compatible; see below.
+
+
+

HISTORY

+       Bill  Joy  originated  a  forerunner  of termcap called "ttycap", dated
+       September 1977, and released in 1BSD (March 1978).  It used many of the
+       same  function  names  as the later termcap, such as tgetent, tgetflag,
+       tgetnum, and tgetstr.
+
+       A clear descendant, the termlib library, followed in 2BSD  (May  1979),
+       adding tgoto and tputs.  The former applied at that time only to cursor
+       positioning  capabilities,  thus  the  overly  specific  name.   Little
+       changed  in 3BSD (late 1979) except the addition of test programs and a
+       termlib man page, which documented the API shown in section  "SYNOPSIS"
+       above.
+
+       4BSD  (November 1980) renamed termlib to termcap and added another test
+       program.  The library remained  much  the  same  through  4.3BSD  (June
+       1986).    4.4BSD-Lite  (June  1994)  refactored  it,  leaving  the  API
+       unchanged.
+
+       Function prototypes were a feature of ANSI C (1989).  The library  long
+       antedated the standard and thus provided no header file declaring them.
+       Nevertheless, the BSD sources included two different  termcap.h  header
+       files over time.
+
+       o   One was used internally by jove(1) from 4.3BSD onward.  It declared
+           global symbols for the termcap variables that it used.
+
+       o   The other appeared in 4.4BSD-Lite Release 2 (June 1995) as part  of
+           libedit  (also known as the editline library).  CSRG source history
+           shows that this was added in mid-1992.  The libedit header file was
+           used  internally  as  a  convenience  for  compiling  the  editline
+           library.  It declared function prototypes, but no global variables.
+           NetBSD's termcap library added this header file in mid-1994.
+
+       Meanwhile,  GNU  termcap  began development in 1990.  Its first release
+       (1.0) in 1991 included a  termcap.h  header  file.   Its  second  (1.1)
+       release  in  September  1992  modified  the  file  to use const for the
+       function prototypes in the header where one would expect parameters  to
+       be  read-only.   BSD  termcap  did  not.   The prototype for tputs also
+       differed, but in that instance, it was libedit that differed  from  BSD
+       termcap.
+
+       GNU  bash(1)  has bundled GNU termcap 1.3 since mid-1993 to support its
+       readline(3) library, and continues to use it if configured to do so.
+
+       ncurses 1.8.1 (November 1993) provided a termcap.h file.  It  reflected
+       influence   from  GNU  termcap  and  emacs(1)  (rather  than  jove(1)),
+       providing the following interface:
+
+       o   global symbols used by emacs,
+
+       o   const-qualified function prototypes, and
+
+       o   a prototype for tparam, a GNU termcap feature.
+
+       Later (in mid-1996) the tparam function was removed from ncurses.   Any
+       two  of  the four implementations thus differ, and programs that intend
+       to work with all termcap library interfaces must account for that fact.
+
+
+

BUGS

+       If  you  call  tgetstr  to  fetch  column_address  (ch)  or  any  other
+       parameterized  string capability, be aware that it is returned in term-
+       info notation, not the older and not-quite-compatible termcap notation.
+       This  does  not  cause  problems if all you do with it is call tgoto or
+       tparm,  which  both   parametrically   expand   terminfo-style   string
+       capabilities  as  terminfo  does.  (If ncurses is configured to support
+       termcap, tgoto checks whether the string is terminfo-style  by  looking
+       for  "%p"  parameters  or  "<...>"  delays, and invokes a termcap-style
+       parser if the string appears not to use terminfo syntax.)
+
+       Because terminfo's syntax for padding in  string  capabilities  differs
+       from termcap's, users can be surprised.
+
+       o   tputs("50")  in  a terminfo system transmits "50" rather than busy-
+           waiting for 50 milliseconds.
+
+       o   However, if ncurses is configured to support termcap, it  may  also
+           have been configured to support BSD-style padding.
+
+           In  that  case,  tputs  inspects  strings passed to it, looking for
+           digits at the beginning of the string.
+
+           tputs("50") in a termcap system may busy-wait for  50  milliseconds
+           rather than transmitting "50".
+
+       termcap  has  nothing  analogous  to  terminfo's  set_attributes  (sgr)
+       capability.  One consequence is that termcap applications  assume  that
+       "me"  (equivalent  to terminfo's exit_attribute_mode (sgr0) capability)
+       does not reset the alternate character set.  ncurses  checks  for,  and
+       modifies the data shared with, the termcap interface to accommodate the
+       latter's limitation in this respect.
+
+
+

SEE ALSO

+       TCTEST -- A Termcap Test Utility <https://invisible-island.net/ncurses/
+       tctest.html>
+
+       curses(3x), curs_terminfo(3x), putc(3), term_variables(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-09-21                  curs_termcap(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_terminfo.3x.html b/contrib/ncurses/doc/html/man/curs_terminfo.3x.html new file mode 100644 index 00000000..ed9d1cf4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_terminfo.3x.html @@ -0,0 +1,697 @@ + + + + + + +curs_terminfo 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_terminfo 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_terminfo(3x)                Library calls               curs_terminfo(3x)
+
+
+
+
+

NAME

+       del_curterm,  putp,  restartterm,  set_curterm,  setupterm,  tigetflag,
+       tigetnum, tigetstr, tiparm, tiparm_s, tiscan_s, tparm, tputs, vid_attr,
+       vid_puts, vidattr, vidputs - curses interfaces to terminfo database
+
+
+

SYNOPSIS

+       #include <curses.h>
+       #include <term.h>
+
+       TERMINAL *cur_term;
+
+       const char * const boolnames[];
+       const char * const boolcodes[];
+       const char * const boolfnames[];
+       const char * const numnames[];
+       const char * const numcodes[];
+       const char * const numfnames[];
+       const char * const strnames[];
+       const char * const strcodes[];
+       const char * const strfnames[];
+
+       int setupterm(const char *term, int filedes, int *errret);
+       TERMINAL *set_curterm(TERMINAL *nterm);
+       int del_curterm(TERMINAL *oterm);
+       int restartterm(const char *term, int filedes, int *errret);
+
+       char *tparm(const char *str, ...);
+            /* or */
+       char *tparm(const char *str, long p1 ... long p9);
+
+       int tputs(const char *str, int affcnt, int (*putc)(int));
+       int putp(const char *str);
+
+       int vidputs(chtype attrs, int (*putc)(int));
+       int vidattr(chtype attrs);
+       int vid_puts(attr_t attrs, short pair, void *opts, int (*putc)(int));
+       int vid_attr(attr_t attrs, short pair, void *opts);
+
+       int tigetflag(const char *cap-code);
+       int tigetnum(const char *cap-code);
+       char *tigetstr(const char *cap-code);
+
+       char *tiparm(const char *str, ...);
+
+       /* extensions */
+       char *tiparm_s(int expected, int mask, const char *str, ...);
+       int tiscan_s(int *expected, int *mask, const char *str);
+
+       /* deprecated */
+       int setterm(const char *term);
+
+
+

DESCRIPTION

+       These low-level functions must be called by programs that deal directly
+       with the terminfo database to  handle  certain  terminal  capabilities,
+       such as programming function keys.  For all other functionality, curses
+       functions are more suitable and their use is recommended.
+
+       None of these functions use  (or  are  aware  of)  multibyte  character
+       strings such as UTF-8.
+
+       o   Capability names and codes use the POSIX portable character set.
+
+       o   Capability  string  values  have  no  associated encoding; they are
+           strings of 8-bit characters.
+
+
+

Initialization

+       Initially, setupterm should be called.  The high-level curses functions
+       initscr  and  newterm call setupterm to initialize the low-level set of
+       terminal-dependent variables listed in term_variables(3x).
+
+       Applications can use the terminal  capabilities  either  directly  (via
+       header  definitions),  or  by  special  functions.   The  header  files
+       curses.h and term.h should be included  (in  that  order)  to  get  the
+       definitions for these strings, numbers, and flags.
+
+       The  terminfo  variables lines and columns are initialized by setupterm
+       as follows.
+
+       o   If use_env(FALSE) has been called, values  for  lines  and  columns
+           specified in terminfo are used.
+
+       o   Otherwise,  if  the  environment variables LINES and COLUMNS 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 lines and columns specified in the terminfo database are
+           used.
+
+       Parameterized strings should be passed  through  tparm  to  instantiate
+       them.   All  terminfo strings (including the output of tparm) should be
+       sent to the terminal device with tputs or putp.  Call  reset_shell_mode
+       to restore the terminal modes before exiting; see curs_kernel(3x).
+
+       Programs that use cursor addressing should
+
+       o   output enter_ca_mode upon startup and
+
+       o   output exit_ca_mode before exiting.
+
+       Programs that execute shell subprocesses should
+
+       o   call  reset_shell_mode  and output exit_ca_mode before the shell is
+           called and
+
+       o   output enter_ca_mode and call reset_prog_mode after returning  from
+           the shell.
+
+       setupterm  reads  in  the  terminfo database, initializing the terminfo
+       structures, but does not set up the  output  virtualization  structures
+       used by curses.  Its parameters follow.
+
+          term is the terminal type, a character string.  If term is null, the
+               environment variable TERM is read.
+
+          filedes
+               is the file descriptor used for getting  and  setting  terminal
+               I/O modes.
+
+               Higher-level  applications  use  newterm(3x)  to initialize the
+               terminal, passing an output stream rather  than  a  descriptor.
+               In   curses,  the  two  are  the  same  because  newterm  calls
+               setupterm, passing the file descriptor derived from its  output
+               stream parameter.
+
+          errret
+               points  to  an  optional  location where an error status can be
+               returned to the caller.  If errret is not null, then  setupterm
+               returns  OK  or  ERR  and  stores a status value in the integer
+               pointed to by errret.  A  return  value  of  OK  combined  with
+               status of 1 in errret is normal.
+
+               If ERR is returned, examine errret:
+
+               1    means  that  the  terminal is hardcopy, and cannot be used
+                    for curses applications.
+
+                    setupterm determines if the entry is a  hardcopy  type  by
+                    checking the hardcopy (hc) capability.
+
+               0    means  that the terminal could not be found, or that it is
+                    a generic type, having too little information  for  curses
+                    applications to run.
+
+                    setupterm  determines  if  the  entry is a generic type by
+                    checking the generic_type (gn) capability.
+
+               -1   means that the terminfo database could not be found.
+
+               If errret is null, setupterm  reports  an  error  message  upon
+               finding an error and exits.  Thus, the simplest call is:
+
+                      setupterm((char *)0, 1, (int *)0);
+
+               which uses all the defaults and sends the output to stdout.
+
+
+

The Terminal State

+       setupterm  stores  its  information  about  the  terminal in a TERMINAL
+       structure pointed to by the global variable cur_term.  If it detects an
+       error,  or  decides  that  the  terminal  is  unsuitable  (hardcopy  or
+       generic), it  discards  this  information,  making  it  unavailable  to
+       applications.
+
+       If setupterm is called repeatedly for the same terminal type, it reuses
+       the information.   It  maintains  only  one  copy  of  a  given  type's
+       capabilities  in  memory.   If  called  for  different types, setupterm
+       allocates new storage for each set of terminal capabilities.
+
+       set_curterm sets cur_term to nterm, making all of the terminfo Boolean,
+       numeric, and string capabilities use the values from nterm.  It returns
+       the old value of cur_term.
+
+       del_curterm frees the memory pointed to by oterm, making  it  available
+       for  further  use.  If oterm is the same as cur_term, references to any
+       of the terminfo Boolean, numeric, and  string  capabilities  thereafter
+       may refer to invalid memory locations until setupterm is called again.
+
+       restartterm  is  similar  to  setupterm,  but is intended for use after
+       restoring program  memory  to  a  previous  state  (for  example,  when
+       reloading  an  application  that  has  been suspended from one terminal
+       session and restored in another).  restartterm assumes that the display
+       dimensions and the input and output options are the same as when memory
+       was  saved,  but  the  terminal  type  and  line  speed   may   differ.
+       Accordingly,   restartterm   saves   relevant   terminal  state,  calls
+       setupterm, then restores that state.
+
+
+

Formatting Output

+       tparm instantiates the string str with parameters  pi.   A  pointer  is
+       returned to the result of str with the parameters applied.  Application
+       developers should keep in mind these quirks of the interface:
+
+       o   Although tparm's actual parameters may be integers or strings,  the
+           prototype expects long (integer) values.
+
+       o   Aside  from  the  set_attributes  (sgr)  capability,  most terminal
+           capabilities require no more than one or two parameters.
+
+       o   Padding information is ignored  by  tparm;  it  is  interpreted  by
+           tputs.
+
+       o   The  capability  string  is  null-terminated.   Use "\200" where an
+           ASCII NUL is needed in the output.
+
+       tiparm is a newer form of tparm  which  uses  stdarg.h  rather  than  a
+       fixed-parameter  list.   Its  numeric  parameters  are ints rather than
+       longs.
+
+       Both tparm and tiparm assume that  the  application  passes  parameters
+       consistent  with the terminal description.  Two extensions are provided
+       as alternatives to deal with untrusted data.
+
+       o   tiparm_s is an extension which is a safer formatting function  than
+           tparm or tiparm, because it allows the developer to tell the curses
+           library how many parameters to expect in the  parameter  list,  and
+           which may be string parameters.
+
+           The  mask  parameter has one bit set for each of the parameters (up
+           to 9) passed as char pointers rather than numbers.
+
+       o   The  extension  tiscan_s  allows  the  application  to  inspect   a
+           formatting capability to see what the curses library would assume.
+
+
+

Output Functions

+       String  capabilities  can  contain  padding  information,  a time delay
+       (accommodating performance limitations of hardware terminals) expressed
+       as $<n>, where n is a nonnegative integral count of milliseconds.  If n
+       exceeds 30,000 (thirty seconds), it is capped at that value.
+
+       tputs interprets time-delay information in the string str  and  outputs
+       it, executing the delays:
+
+       o   The  str parameter must be a terminfo string variable or the return
+           value of tparm or tiparm.
+
+       o   affcnt is the number of lines affected, or 1 if not applicable.
+
+       o   putc is a putchar-like function to which the characters are passed,
+           one at a time.
+
+           If  tputs  processes  a  time-delay,  it  uses the delay_output(3x)
+           function, routing any resulting  padding  characters  through  this
+           function.
+
+       putp calls "tputs(str, 1, putchar)".  The output of putp always goes to
+       stdout, rather than the filedes specified in setupterm.
+
+       vidputs displays the string on the terminal in the video attribute mode
+       attrs, which is any combination of the attributes listed in curses(3x).
+       The characters are passed to the putchar-like function putc.
+
+       vidattr is like vidputs, except that it outputs through putchar(3).
+
+       vid_attr and vid_puts correspond to vidattr and vidputs,  respectively.
+       They  use multiple parameters to represent the character attributes and
+       color; namely,
+
+       o   attrs, of type attr_t, for the attributes and
+
+       o   pair, of type short, for the color pair number.
+
+       Use the attribute constants  prefixed  with  "WA_"  with  vid_attr  and
+       vid_puts.
+
+       X/Open  Curses  reserves  the opts argument for future use, saying that
+       applications must provide a null pointer for  that  argument;  but  see
+       section "EXTENSIONS" below.
+
+       While  putp is a low-level function that does not use high-level curses
+       state, ncurses declares it in curses.h because System V did  this  (see
+       section "HISTORY" below).
+
+
+

Terminal Capability Functions

+       tigetflag,  tigetnum,  and  tigetstr return the value of the capability
+       corresponding to the terminfo cap-code, such as xenl, passed  to  them.
+       The  cap-code for each capability is given in the table column entitled
+       cap-code code in the capabilities section of terminfo(5).
+
+       These functions return special values to denote errors.
+
+       tigetflag returns
+
+       -1     if cap-code is not a Boolean capability, or
+
+       0      if it is canceled or absent from the terminal description.
+
+       tigetnum returns
+
+       -2     if cap-code is not a numeric capability, or
+
+       -1     if it is canceled or absent from the terminal description.
+
+       tigetstr returns
+
+       (char *)-1
+              if cap-code is not a string capability, or
+
+       0      if it is canceled or absent from the terminal description.
+
+
+

Terminal Capability Names

+       These null-terminated arrays contain
+
+       o   the short terminfo names ("codes"),
+
+       o   the termcap names ("names"), and
+
+       o   the long terminfo names ("fnames")
+
+       for each of the predefined terminfo variables:
+
+              const char *boolnames[], *boolcodes[], *boolfnames[]
+              const char *numnames[], *numcodes[], *numfnames[]
+              const char *strnames[], *strcodes[], *strfnames[]
+
+
+

Releasing Memory

+       Each successful call to setupterm allocates memory to hold the terminal
+       description.   As  a  side  effect,  it  sets cur_term to point to this
+       memory.  If an application calls
+
+              del_curterm(cur_term);
+
+       the memory will be freed.
+
+       The formatting functions tparm and tiparm extend the storage  allocated
+       by setupterm as follows.
+
+       o   They  add  the  "static"  terminfo variables [a-z].  Before ncurses
+           6.3, those were shared by all screens.  With ncurses 6.3, those are
+           allocated per screen.  See terminfo(5).
+
+       o   To  improve performance, ncurses 6.3 caches the result of analyzing
+           terminfo strings for their parameter types.  That is  stored  as  a
+           binary tree referenced from the TERMINAL structure.
+
+       The higher-level initscr and newterm functions use setupterm.  Normally
+       they do not free this memory, but it is possible to do that  using  the
+       delscreen(3x) function.
+
+
+

RETURN VALUE

+       X/Open Curses defines no failure conditions.  In ncurses,
+
+       del_curtem
+            fails if its terminal parameter is null.
+
+       putp calls tputs, returning the same error codes.
+
+       restartterm
+            fails if the associated call to setupterm returns ERR.
+
+       setupterm
+            fails  if  it cannot allocate enough memory, or create the initial
+            windows (stdscr, curscr, and newscr) Other  error  conditions  are
+            documented above.
+
+       tparm
+            returns  a null pointer if the capability would require unexpected
+            parameters; that  is,  too  many,  too  few,  or  incorrect  types
+            (strings where integers are expected, or vice versa).
+
+       tputs
+            fails  if  the  string  parameter is null.  It does not detect I/O
+            errors: X/Open Curses states that tputs ignores the  return  value
+            of the output function putc.
+
+
+

NOTES

+       The  vid_attr function in ncurses is a special case.  It was originally
+       implemented based on a draft of X/Open Curses, as a macro, before other
+       parts  of the ncurses wide-character API were developed, and unlike the
+       other wide-character functions,  is  also  provided  in  the  non-wide-
+       character configuration.
+
+
+

EXTENSIONS

+       The  functions  marked as extensions were designed for ncurses, and are
+       not found in SVr4 curses, 4.4BSD curses, or any other  previous  curses
+       implementation.
+
+       ncurses  allows  opts  to be a pointer to int, which overrides the pair
+       (short) argument.
+
+
+

PORTABILITY

+       setterm is not described by X/Open and must be considered non-portable.
+       All other functions are as described by X/Open.
+
+
+

Compatibility Macros

+       This  implementation  provides  a  few  macros  for  compatibility with
+       systems before  SVr4  (see  section  "HISTORY"  below).   They  include
+       Bcrmode,  Bfixterm,  Bgettmode,  Bnocrmode,  Bresetterm, Bsaveterm, and
+       Bsetterm.
+
+       In SVr4, these are found in  curses.h,  but  except  for  setterm,  are
+       likewise macros.  The one function, setterm, is mentioned in the manual
+       page.  It further notes that setterm was replaced by setupterm, stating
+       that the call
+              setupterm(term, 1, (int *)0)
+
+       provides  the  same  functionality  as  setterm(term), discouraging the
+       latter for new programs.  ncurses implements each of these  symbols  as
+       macros for BSD curses compatibility.
+
+
+

Legacy Data

+       setupterm  copies  the terminal name to the array ttytype.  This is not
+       part of X/Open Curses, but is assumed by some applications.
+
+       Other implementions may not declare the capability name  arrays.   Some
+       provide  them  without  declaring them.  X/Open Curses does not specify
+       them.
+
+       Extended terminal capability names, as defined by  "tic  -x",  are  not
+       stored in the arrays described here.
+
+
+

Output Buffering

+       Older  versions  of  ncurses assumed that the file descriptor passed to
+       setupterm from initscr or newterm uses buffered I/O, and would write to
+       the  corresponding  stream.   In  addition  to  the limitation that the
+       terminal was  left  in  block-buffered  mode  on  exit  (like  System V
+       curses),  it  was  problematic because ncurses did not allow a reliable
+       way to clean up on receiving SIGTSTP.
+
+       The current version (ncurses6) uses output buffers managed directly  by
+       ncurses.  Some of the low-level functions described in this manual page
+       write to the standard output.  They are  not  signal-safe.   The  high-
+       level functions in ncurses employ alternate versions of these functions
+       using the more reliable buffering scheme.
+
+
+

Function Prototypes

+       The X/Open Curses prototypes  are  based  on  the  SVr4  curses  header
+       declarations,  which  were  defined at the same time the C language was
+       first standardized in the late 1980s.
+
+       o   X/Open Curses uses const  less  effectively  than  a  later  design
+           might,  sometimes applying it needlessly to values that are already
+           constant, and in most cases overlooking  parameters  that  normally
+           would  use  const.  Passing const-qualified parameters to functions
+           that do not  declare  them  const  may  prevent  the  program  from
+           compiling.    On   the   other  hand,  "writable  strings"  are  an
+           obsolescent feature.
+
+           As an extension, this implementation can be  configured  to  change
+           the  function prototypes to use the const keyword.  The ncurses ABI
+           6 enables this feature by default.
+
+       o   X/Open Curses prototypes tparm with a fixed number  of  parameters,
+           rather than a variable argument list.
+
+           This  implementation  uses  a  variable  argument  list, but can be
+           configured to use the fixed-parameter list.  Portable  applications
+           should  provide  nine  parameters after the format; zeroes are fine
+           for this purpose.
+
+           In response to review comments by Thomas E. Dickey,  X/Open  Curses
+           Issue 7 proposed the tiparm function in mid-2009.
+
+           While  tiparm is always provided in ncurses, the older form is only
+           available as a build-time configuration option.  If  not  specially
+           configured, tparm is the same as tiparm.
+
+       Both forms of tparm have drawbacks:
+
+       o   Most of the calls to tparm use only one or two parameters.  Passing
+           nine on each call is awkward.
+
+           Using long for the numeric parameter type is a workaround  to  make
+           the  parameter  use  the  same  amount of stack as a pointer.  That
+           approach dates back to the mid-1980s, before  C  was  standardized.
+           Since  then,  there is a standard (and pointers are not required to
+           fit in a long).
+
+       o   Providing the right number of parameters for  a  variadic  function
+           such  as  tiparm  can  be  a  problem,  in  particular  for  string
+           parameters.  However, only a few terminfo capabilities  use  string
+           parameters  (for  instance, the ones used for programmable function
+           keys).
+
+           The ncurses library checks usage of these capabilities, and returns
+           ERR  if the capability mishandles string parameters.  But it cannot
+           check if a calling program provides strings in the right places for
+           the tparm calls.
+
+           The  tput(1)  program  checks  its use of these capabilities with a
+           table, so that it calls tparm correctly.
+
+   Special TERM treatment
+       If configured to use the terminal driver, as with the MinGW port,
+
+       o   setupterm interprets a missing/empty TERM variable as  the  special
+           value "unknown".
+
+           SVr4 curses uses the special value "dumb".
+
+           The  difference  between  the  two  is  that  the  former  uses the
+           generic_type (gn) terminfo capability, while the latter  does  not.
+           A generic terminal is unsuitable for full-screen applications.
+
+       o   setupterm  allows explicit use of the the windows console driver by
+           checking if $TERM is set to "#win32con" or an abbreviation of  that
+           string.
+
+
+

Other Portability Issues

+       In  SVr4,  set_curterm  returns  an  int, OK or ERR.  We have chosen to
+       implement the X/Open Curses semantics.
+
+       In SVr4, the third argument of tputs has the type "int (*putc)(char)".
+
+       At least one implementation of X/Open Curses (Solaris) returns a  value
+       other  than OK or ERR from tputs.  It instead returns the length of the
+       string, and does no error checking.
+
+
+

HISTORY

+       SVr2 (1984) introduced the terminfo feature.   Its  programming  manual
+       mentioned the following low-level functions.
+
+       Function    Description
+       ------------------------------------------------------------------------
+       fixterm     restore terminal to "in curses" state
+       gettmode    establish current terminal modes
+       mvcur       low level cursor motion
+       putp        use tputs to send characters via putchar
+       resetterm   set terminal modes to "out of curses" state
+       resetty     reset terminal flags to stored value
+       saveterm    save current modes as "in curses" state
+       savetty     store current terminal flags
+       setterm     establish terminal with given type
+       setupterm   establish terminal with given type
+       tparm       interpolate parameters into string capability
+       tputs       apply padding information to a string
+       vidattr     like vidputs, but output through putchar
+       vidputs     write string to terminal, applying specified attributes
+
+       The  programming  manual  also mentioned functions provided for termcap
+       compatibility (commenting that they "may go away at a later date").
+
+       Function   Description
+       ------------------------------------------------------------------------
+       tgetent    look up termcap entry for given name
+       tgetflag   get Boolean entry for given id
+       tgetnum    get numeric entry for given id
+       tgetstr    get string entry for given id
+       tgoto      apply parameters to given capability
+       tputs      write characters via a function parameter, applying padding
+
+       Early terminfo programs obtained capability values  from  the  TERMINAL
+       structure initialized by setupterm.
+
+       SVr3   (1987)   extended  terminfo  by  adding  functions  to  retrieve
+       capability values (like the termcap interface), and reusing  tgoto  and
+       tputs.
+
+       Function    Description
+       ------------------------------------------------------------------------
+       tigetflag   get Boolean entry for given id
+       tigetnum    get numeric entry for given id
+       tigetstr    get string entry for given id
+
+       SVr3  also  replaced several of the SVr2 terminfo functions that had no
+       counterpart in the termcap interface, documenting them as obsolete.
+
+       Function    Replaced by
+       ------------------------------------------------------------------------
+       crmode      cbreak
+       fixterm     reset_prog_mode
+       gettmode    n/a
+       nocrmode    nocbreak
+       resetterm   reset_shell_mode
+       saveterm    def_prog_mode
+       setterm     setupterm
+
+       SVr3 kept the mvcur, vidattr, and vidputs functions, along  with  putp,
+       tparm,  and  tputs.   The latter were needed to support padding, and to
+       handle capabilities accessed by functions such as vidattr  (which  used
+       more than the two parameters supported by tgoto).
+
+       SVr3   introduced   the   functions   for  switching  between  terminal
+       descriptions;  for  example,  set_curterm.   Some   changes   reflected
+       incremental improvements to the SVr2 library.
+
+       o   The  TERMINAL  type  definition  was introduced in SVr3.01, for the
+           term structure provided in SVr2.
+
+       o   Various global variables such as boolnames were  mentioned  in  the
+           programming  manual  at  this  point, though the variables had been
+           provided in SVr2.
+
+       SVr4 (1989) added the vid_attr and vid_puts functions.
+
+       Other low-level functions are declared in the curses  header  files  of
+       Unix  systems,  but  none are documented.  Those noted as "obsolete" by
+       SVr3 remained in use by System V's vi(1) editor.
+
+
+

SEE ALSO

+       curses(3x),   curs_initscr(3x),   curs_kernel(3x),   curs_memleaks(3x),
+       curs_termcap(3x),   curs_variables(3x),   putc(3),  term_variables(3x),
+       terminfo(5)
+
+
+
+ncurses 6.5                       2024-09-14                 curs_terminfo(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_threads.3x.html b/contrib/ncurses/doc/html/man/curs_threads.3x.html new file mode 100644 index 00000000..8681a8fe --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_threads.3x.html @@ -0,0 +1,638 @@ + + + + + + +curs_threads 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

curs_threads 3x 2024-03-16 ncurses 6.5 Library calls

+
+curs_threads(3x)                 Library calls                curs_threads(3x)
+
+
+
+
+

NAME

+       NCURSES_WINDOW_CB,   NCURSES_SCREEN_CB,   get_escdelay,   set_escdelay,
+       set_tabsize, use_screen, use_window - curses support for multi-threaded
+       applications
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       /* data types */
+       typedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *);
+       typedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *);
+
+       int get_escdelay(void);
+       int set_escdelay(int ms);
+       int set_tabsize(int cols);
+
+       int use_screen(SCREEN *scr, NCURSES_SCREEN_CB func, void *data);
+       int use_window(WINDOW *win, NCURSES_WINDOW_CB func, void *data);
+
+
+

DESCRIPTION

+       The  ncurses  library  can  be  configured  to  support  multi-threaded
+       applications in a  rudimentary  way.   Such  configuration  produces  a
+       different set of libraries, named libncursest, for example, since doing
+       so alters ncurses's application binary interface (ABI).
+
+       Instead of modifying the programming interface (API)  to  make  ncurses
+       functions  expect  an  additional  argument  specifying  a  thread, the
+       library adds functions, usable in  any  configuration,  that  hide  the
+       mutexes (mutual exclusion locks) needed to prevent concurrent access to
+       variables shared by multiple threads of execution.
+
+       ncurses threading support requires  the  use  of  functions  to  access
+       members  of  the  WINDOW  structure  (see curs_opaque(3x)).  It further
+       makes functions of the common  global  variables  COLORS,  COLOR_PAIRS,
+       COLS,   ESCDELAY,   LINES,   TABSIZE,   curscr,  newscr,  and  ttytype,
+       maintaining them as as read-only values in the SCREEN structure.
+
+       Even this is not enough to make an  application  using  curses  thread-
+       safe.   We  would  expect  a multi-threaded application to have threads
+       updating separate windows (on the same device),  and  separate  screens
+       (on  different  devices).   Further,  applications  expect a few of the
+       global variables to be writable.  The functions described here  address
+       these special situations.
+
+       The  ESCDELAY  and  TABSIZE  global  variables  are  modified  by  some
+       applications.   To  modify  them  in   any   configuration,   use   the
+       set_escdelay  or set_tabsize functions.  Other global variables are not
+       modifiable.  get_escdelay retrieves ESCDELAY's value.
+
+       The use_window and use_screen functions provide coarse-grained  mutexes
+       for  their  respective  WINDOW and SCREEN parameters; they call a user-
+       supplied function, pass it a data parameter, and return the value  from
+       the user-supplied function to the application.
+
+
+

Usage

+       All  ncurses  library  functions  assume that the locale is not altered
+       during operation.  In addition, they use data that is maintained within
+       a hierarchy of scopes.
+
+       o   global data used in the low-level terminfo or termcap interfaces
+
+       o   terminal data associated with a call to set_curterm(3x)
+
+           Terminal data are initialized when screens are created.
+
+       o   screen data associated with a call to newterm(3x) or initscr(3x)
+
+       o   window data associated with a call to newwin(3x) or subwin(3x)
+
+           Windows  are  associated  with  screens.   Pads are not necessarily
+           associated with any particular screen.
+
+           Most curses applications operate on one or more  windows  within  a
+           single screen.
+
+       o   reentrant  data  associated  with  "pure"  functions  that alter no
+           shared variables
+
+       The following table lists the scope  of  each  symbol  in  the  ncurses
+       library when configured to support multi-threaded applications.
+
+       Symbol                 Scope
+       ------------------------------------------------------------------------
+       BC                     global
+       COLORS                 screen (read-only)
+       COLOR_PAIR             reentrant
+       COLOR_PAIRS            screen (read-only)
+       COLS                   screen (read-only)
+       ESCDELAY               screen (read-only; see set_escdelay)
+       LINES                  screen (read-only)
+       PAIR_NUMBER            reentrant
+       PC                     global
+       SP                     global
+       TABSIZE                screen (read-only; see set_tabsize)
+       UP                     global
+       acs_map                screen (read-only)
+       add_wch                window (stdscr)
+       add_wchnstr            window (stdscr)
+       add_wchstr             window (stdscr)
+       addch                  window (stdscr)
+       addchnstr              window (stdscr)
+       addchstr               window (stdscr)
+       addnstr                window (stdscr)
+       addnwstr               window (stdscr)
+       addstr                 window (stdscr)
+       addwstr                window (stdscr)
+       assume_default_colors  screen
+       attr_get               window (stdscr)
+       attr_off               window (stdscr)
+       attr_on                window (stdscr)
+       attr_set               window (stdscr)
+       attroff                window (stdscr)
+       attron                 window (stdscr)
+       attrset                window (stdscr)
+       baudrate               screen
+       beep                   screen
+       bkgd                   window (stdscr)
+       bkgdset                window (stdscr)
+       bkgrnd                 window (stdscr)
+       bkgrndset              window (stdscr)
+       boolcodes              global (read-only)
+       boolfnames             global (read-only)
+       boolnames              global (read-only)
+       border                 window (stdscr)
+       border_set             window (stdscr)
+       box                    window (stdscr)
+       box_set                window (stdscr)
+       can_change_color       terminal
+       cbreak                 screen
+
+       chgat                  window (stdscr)
+       clear                  window (stdscr)
+       clearok                window
+       clrtobot               window (stdscr)
+       clrtoeol               window (stdscr)
+       color_content          screen
+       color_set              window (stdscr)
+       copywin                window (locks source, target)
+       cur_term               terminal
+       curs_set               screen
+       curscr                 screen (read-only)
+       curses_version         global (read-only)
+       def_prog_mode          terminal
+       def_shell_mode         terminal
+       define_key             screen
+       del_curterm            screen
+       delay_output           screen
+       delch                  window (stdscr)
+       deleteln               window (stdscr)
+       delscreen              global (locks screen list, screen)
+       delwin                 global (locks window list)
+       derwin                 screen
+       doupdate               screen
+       dupwin                 screen (locks window)
+       echo                   screen
+       echo_wchar             window (stdscr)
+       echochar               window (stdscr)
+       endwin                 screen
+       erase                  window (stdscr)
+       erasechar              window (stdscr)
+       erasewchar             window (stdscr)
+       filter                 global
+       flash                  terminal
+       flushinp               screen
+       get_wch                screen (input operation)
+       get_wstr               screen (input operation)
+       getattrs               window
+       getbegx                window
+       getbegy                window
+       getbkgd                window
+       getbkgrnd              window
+       getcchar               reentrant
+       getch                  screen (input operation)
+       getcurx                window
+       getcury                window
+       getmaxx                window
+       getmaxy                window
+       getmouse               screen (input operation)
+       getn_wstr              screen (input operation)
+       getnstr                screen (input operation)
+       getparx                window
+       getpary                window
+       getstr                 screen (input operation)
+       getwin                 screen (input operation)
+       halfdelay              screen
+       has_colors             terminal
+       has_ic                 terminal
+       has_il                 terminal
+       has_key                screen
+       hline                  window (stdscr)
+       hline_set              window (stdscr)
+       idcok                  window
+       idlok                  window
+       immedok                window
+       in_wch                 window (stdscr)
+       in_wchnstr             window (stdscr)
+
+       in_wchstr              window (stdscr)
+       inch                   window (stdscr)
+       inchnstr               window (stdscr)
+       inchstr                window (stdscr)
+       init_color             screen
+       init_pair              screen
+       initscr                global (locks screen list)
+       innstr                 window (stdscr)
+       innwstr                window (stdscr)
+       ins_nwstr              window (stdscr)
+       ins_wch                window (stdscr)
+       ins_wstr               window (stdscr)
+       insch                  window (stdscr)
+       insdelln               window (stdscr)
+       insertln               window (stdscr)
+       insnstr                window (stdscr)
+       insstr                 window (stdscr)
+       instr                  window (stdscr)
+       intrflush              terminal
+       inwstr                 window (stdscr)
+       is_cleared             window
+       is_idcok               window
+       is_idlok               window
+       is_immedok             window
+       is_keypad              window
+       is_leaveok             window
+       is_linetouched         window
+       is_nodelay             window
+       is_notimeout           window
+       is_scrollok            window
+       is_syncok              window
+       is_term_resized        terminal
+       is_wintouched          window
+       isendwin               screen
+       key_defined            screen
+       key_name               global (static data)
+       keybound               screen
+       keyname                global (static data)
+       keyok                  screen
+       keypad                 window
+       killchar               terminal
+       killwchar              terminal
+       leaveok                window
+       longname               screen
+       mcprint                terminal
+       meta                   screen
+       mouse_trafo            window (stdscr)
+       mouseinterval          screen
+       mousemask              screen
+       move                   window (stdscr)
+       mvadd_wch              window (stdscr)
+       mvadd_wchnstr          window (stdscr)
+       mvadd_wchstr           window (stdscr)
+       mvaddch                window (stdscr)
+       mvaddchnstr            window (stdscr)
+       mvaddchstr             window (stdscr)
+       mvaddnstr              window (stdscr)
+       mvaddnwstr             window (stdscr)
+       mvaddstr               window (stdscr)
+       mvaddwstr              window (stdscr)
+       mvchgat                window (stdscr)
+       mvcur                  screen
+       mvdelch                window (stdscr)
+       mvderwin               window (stdscr)
+       mvget_wch              screen (input operation)
+       mvget_wstr             screen (input operation)
+
+       mvgetch                screen (input operation)
+       mvgetn_wstr            screen (input operation)
+       mvgetnstr              screen (input operation)
+       mvgetstr               screen (input operation)
+       mvhline                window (stdscr)
+       mvhline_set            window (stdscr)
+       mvin_wch               window (stdscr)
+       mvin_wchnstr           window (stdscr)
+       mvin_wchstr            window (stdscr)
+       mvinch                 window (stdscr)
+       mvinchnstr             window (stdscr)
+       mvinchstr              window (stdscr)
+       mvinnstr               window (stdscr)
+       mvinnwstr              window (stdscr)
+       mvins_nwstr            window (stdscr)
+       mvins_wch              window (stdscr)
+       mvins_wstr             window (stdscr)
+       mvinsch                window (stdscr)
+       mvinsnstr              window (stdscr)
+       mvinsstr               window (stdscr)
+       mvinstr                window (stdscr)
+       mvinwstr               window (stdscr)
+       mvprintw               window (stdscr)
+       mvscanw                screen
+       mvvline                window (stdscr)
+       mvvline_set            window (stdscr)
+       mvwadd_wch             window
+       mvwadd_wchnstr         window
+       mvwadd_wchstr          window
+       mvwaddch               window
+       mvwaddchnstr           window
+       mvwaddchstr            window
+       mvwaddnstr             window
+       mvwaddnwstr            window
+       mvwaddstr              window
+       mvwaddwstr             window
+       mvwchgat               window
+       mvwdelch               window
+       mvwget_wch             screen (input operation)
+       mvwget_wstr            screen (input operation)
+       mvwgetch               screen (input operation)
+       mvwgetn_wstr           screen (input operation)
+       mvwgetnstr             screen (input operation)
+       mvwgetstr              screen (input operation)
+       mvwhline               window
+       mvwhline_set           window
+       mvwin                  window
+       mvwin_wch              window
+       mvwin_wchnstr          window
+       mvwin_wchstr           window
+       mvwinch                window
+       mvwinchnstr            window
+       mvwinchstr             window
+       mvwinnstr              window
+       mvwinnwstr             window
+       mvwins_nwstr           window
+       mvwins_wch             window
+       mvwins_wstr            window
+       mvwinsch               window
+       mvwinsnstr             window
+       mvwinsstr              window
+       mvwinstr               window
+       mvwinwstr              window
+       mvwprintw              window
+       mvwscanw               screen
+       mvwvline               window
+
+       mvwvline_set           window
+       napms                  reentrant
+       newpad                 global (locks window list)
+       newscr                 screen (read-only)
+       newterm                global (locks screen list)
+       newwin                 global (locks window list)
+       nl                     screen
+       nocbreak               screen
+       nodelay                window
+       noecho                 screen
+       nofilter               global
+       nonl                   screen
+       noqiflush              terminal
+       noraw                  screen
+       notimeout              window
+       numcodes               global (read-only)
+       numfnames              global (read-only)
+       numnames               global (read-only)
+       ospeed                 global
+       overlay                window (locks source, target)
+       overwrite              window (locks source, target)
+       pair_content           screen
+       pecho_wchar            screen
+       pechochar              screen
+       pnoutrefresh           screen
+       prefresh               screen
+       printw                 window
+       putp                   global
+       putwin                 window
+       qiflush                terminal
+       raw                    screen
+       redrawwin              window
+       refresh                screen
+       reset_prog_mode        screen
+       reset_shell_mode       screen
+       resetty                terminal
+       resize_term            screen (locks window list)
+       resizeterm             screen
+       restartterm            screen
+       ripoffline             global (static data)
+       savetty                terminal
+       scanw                  screen
+       scr_dump               screen
+       scr_init               screen
+       scr_restore            screen
+       scr_set                screen
+       scrl                   window (stdscr)
+       scroll                 window
+       scrollok               window
+       set_curterm            screen
+       set_escdelay           screen
+       set_tabsize            screen
+       set_term               global (locks screen list, screen)
+       setcchar               reentrant
+       setscrreg              window (stdscr)
+       setupterm              global
+       slk_attr               screen
+       slk_attr_off           screen
+       slk_attr_on            screen
+       slk_attr_set           screen
+       slk_attroff            screen
+       slk_attron             screen
+       slk_attrset            screen
+       slk_clear              screen
+       slk_color              screen
+       slk_init               screen
+
+       slk_label              screen
+       slk_noutrefresh        screen
+       slk_refresh            screen
+       slk_restore            screen
+       slk_set                screen
+       slk_touch              screen
+       slk_wset               screen
+       standend               window
+       standout               window
+       start_color            screen
+       stdscr                 screen (read-only)
+       strcodes               global (read-only)
+       strfnames              global (read-only)
+       strnames               global (read-only)
+       subpad                 window
+       subwin                 window
+       syncok                 window
+       term_attrs             screen
+       termattrs              screen
+       termname               terminal
+       tgetent                global
+       tgetflag               global
+       tgetnum                global
+       tgetstr                global
+       tgoto                  global
+       tigetflag              terminal
+       tigetnum               terminal
+       tigetstr               terminal
+       timeout                window (stdscr)
+       touchline              window
+       touchwin               window
+       tparm                  global (static data)
+       tputs                  screen
+       trace                  global (static data)
+       ttytype                screen (read-only)
+       typeahead              screen
+       unctrl                 screen
+       unget_wch              screen (input operation)
+       ungetch                screen (input operation)
+       ungetmouse             screen (input operation)
+       untouchwin             window
+       use_default_colors     screen
+       use_env                global (static data)
+       use_extended_names     global (static data)
+       use_legacy_coding      screen
+       use_screen             global (locks screen list, screen)
+       use_window             global (locks window list, window)
+       vid_attr               screen
+       vid_puts               screen
+       vidattr                screen
+       vidputs                screen
+       vline                  window (stdscr)
+       vline_set              window (stdscr)
+       vw_printw              window
+       vw_scanw               screen
+       vwprintw               window
+       vwscanw                screen
+       wadd_wch               window
+       wadd_wchnstr           window
+       wadd_wchstr            window
+       waddch                 window
+       waddchnstr             window
+       waddchstr              window
+       waddnstr               window
+       waddnwstr              window
+       waddstr                window
+
+       waddwstr               window
+       wattr_get              window
+       wattr_off              window
+       wattr_on               window
+       wattr_set              window
+       wattroff               window
+       wattron                window
+       wattrset               window
+       wbkgd                  window
+       wbkgdset               window
+       wbkgrnd                window
+       wbkgrndset             window
+       wborder                window
+       wborder_set            window
+       wchgat                 window
+       wclear                 window
+       wclrtobot              window
+       wclrtoeol              window
+       wcolor_set             window
+       wcursyncup             screen (affects window plus parents)
+       wdelch                 window
+       wdeleteln              window
+       wecho_wchar            window
+       wechochar              window
+       wenclose               window
+       werase                 window
+       wget_wch               screen (input operation)
+       wget_wstr              screen (input operation)
+       wgetbkgrnd             window
+       wgetch                 screen (input operation)
+       wgetdelay              window
+       wgetn_wstr             screen (input operation)
+       wgetnstr               screen (input operation)
+       wgetparent             window
+       wgetscrreg             window
+       wgetstr                screen (input operation)
+       whline                 window
+       whline_set             window
+       win_wch                window
+       win_wchnstr            window
+       win_wchstr             window
+       winch                  window
+       winchnstr              window
+       winchstr               window
+       winnstr                window
+       winnwstr               window
+       wins_nwstr             window
+       wins_wch               window
+       wins_wstr              window
+       winsch                 window
+       winsdelln              window
+       winsertln              window
+       winsnstr               window
+       winsstr                window
+       winstr                 window
+       winwstr                window
+       wmouse_trafo           window
+       wmove                  window
+       wnoutrefresh           screen
+       wprintw                window
+       wredrawln              window
+       wrefresh               screen
+       wresize                window (locks window list)
+       wscanw                 screen
+       wscrl                  window
+       wsetscrreg             window
+
+       wstandend              window
+       wstandout              window
+       wsyncdown              screen (affects window plus parents)
+       wsyncup                screen (affects window plus parents)
+       wtimeout               window
+       wtouchln               window
+       wunctrl                global (static data)
+       wvline                 window
+       wvline_set             window
+
+
+

RETURN VALUE

+       get_escdelay   returns   the   value  of  ESCDELAY.   set_escdelay  and
+       set_tabsize return ERR upon failure and OK upon successful  completion.
+       use_screen  and use_window return the int returned by the user-supplied
+       function they are called with.
+
+
+

NOTES

+       ncurses provides both a C function and a preprocessor  macro  for  each
+       function documented in this page.
+
+
+

PORTABILITY

+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code   depending   on   ncurses   extensions   be   conditioned   using
+       NCURSES_VERSION.
+
+
+

SEE ALSO

+       curses(3x), curs_opaque(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-03-16                  curs_threads(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_touch.3x.html b/contrib/ncurses/doc/html/man/curs_touch.3x.html new file mode 100644 index 00000000..8351b568 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_touch.3x.html @@ -0,0 +1,150 @@ + + + + + + +curs_touch 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

curs_touch 3x 2024-07-27 ncurses 6.5 Library calls

+
+curs_touch(3x)                   Library calls                  curs_touch(3x)
+
+
+
+
+

NAME

+       touchwin,     touchline,    untouchwin,    wtouchln,    is_linetouched,
+       is_wintouched - control terminal output refresh in a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int touchline(WINDOW *win, int start, int count);
+
+       int touchwin(WINDOW *win);
+       int wtouchln(WINDOW *win, int y, int n, int changed);
+
+       int untouchwin(WINDOW *win);
+
+       bool is_linetouched(WINDOW *win, int line);
+       bool is_wintouched(WINDOW *win);
+
+
+

DESCRIPTION

+       The  touchwin  and  touchline  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
+       touchline only pretends that count lines have been  changed,  beginning
+       with line start.
+
+       The untouchwin routine marks all lines in the window as unchanged since
+       the last call to wrefresh.
+
+       The wtouchln routine makes n lines in the window, starting at  line  y,
+       look  as  if they have (changed=1) or have not (changed=0) been changed
+       since the last call to wrefresh.
+
+       The is_linetouched  and  is_wintouched  routines  return  TRUE  if  the
+       specified  line/window  was  modified  since the last call to wrefresh;
+       otherwise they return FALSE.  In addition, is_linetouched  returns  ERR
+       if line is not valid for the given window.
+
+
+

RETURN VALUE

+       All  routines  return the integer ERR upon failure and an integer value
+       other than ERR upon successful completion, unless  otherwise  noted  in
+       the preceding routine descriptions.
+
+       In this implementation
+
+          is_linetouched
+               returns  ERR  if  the  window  pointer  is null, or if the line
+               number is outside the window boundaries.
+
+               The constant ERR is distinct from TRUE and FALSE, which are the
+               normal  return  values  of this function.  Because the function
+               returns a bool, returning ERR (which is neither TRUE nor FALSE)
+               may not be supported by the compiler.
+
+               To  provide  error-checking  and also match the X/Open function
+               prototype, the ERR is provided by a macro named is_linetouched.
+               The actual function returns FALSE when it detects an error.
+
+          wtouchln
+               returns  ERR  if  the  window  pointer  is null, or if the line
+               number is outside the window boundaries.
+
+
+

NOTES

+       All of these routines except wtouchln may be macros.
+
+
+

PORTABILITY

+       These functions were introduced by SVr4.   The  Solaris  curses  header
+       file, for instance, defines both an actual function and macro for each.
+       The macros give the same result as the actual functions.   SVr4  curses
+       does  not check the window parameter win to ensure that it is not NULL;
+       otherwise this implementation behaves the same as SVr4.
+
+       X/Open Curses, Issue 4 describes  these  functions.   It  specifies  no
+       error conditions for them.
+
+
+

SEE ALSO

+       curses(3x), curs_refresh(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-07-27                    curs_touch(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_trace.3x.html b/contrib/ncurses/doc/html/man/curs_trace.3x.html new file mode 100644 index 00000000..c1ea937f --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_trace.3x.html @@ -0,0 +1,288 @@ + + + + + + +curs_trace 3x 2024-04-20 ncurses 6.5 Library calls + + + + +

curs_trace 3x 2024-04-20 ncurses 6.5 Library calls

+
+curs_trace(3x)                   Library calls                  curs_trace(3x)
+
+
+
+
+

NAME

+       curses_trace,  trace,  _tracef, _traceattr, _traceattr2, _tracecchar_t,
+       _tracecchar_t2, _tracechar, _tracechtype, _tracechtype2, _nc_tracebits,
+       _tracedump, _tracemouse - curses debugging routines
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       unsigned curses_trace(const unsigned trace-mask);
+
+       void _tracef(const char *format, ...);
+
+       char *_traceattr(attr_t attr);
+       char *_traceattr2(int buffer, chtype ch);
+       char *_tracecchar_t(const cchar_t *string);
+       char *_tracecchar_t2(int buffer, const cchar_t *string);
+       char *_tracechar(int c);
+       char *_tracechtype(chtype ch);
+       char *_tracechtype2(int buffer, chtype ch);
+
+       void _tracedump(const char *label, WINDOW *win);
+       char *_nc_tracebits(void);
+       char *_tracemouse(const MEVENT *event);
+
+       /* deprecated */
+       void trace(const unsigned int trace-mask);
+
+
+

DESCRIPTION

+       The curses trace routines are used for debugging the ncurses libraries,
+       as  well  as  applications  which  use  the  ncurses  libraries.   Some
+       limitations apply:
+
+       o   Aside from curses_trace, the other functions are normally available
+           only with the debugging library e.g., libncurses_g.a.
+
+           All of the trace functions may be compiled into any model  (shared,
+           static, profile) by defining the symbol TRACE.
+
+       o   Additionally,  the  functions  which use cchar_t are only available
+           with the wide-character configuration of the libraries.
+
+
+

Functions

+       The principal parts of this interface are
+
+       o   curses_trace, which selectively enables different tracing features,
+           and
+
+       o   _tracef, which writes formatted data to the trace file.
+
+           The  other  functions  either  return  a  pointer  to a string-area
+           (allocated by the corresponding function), or return no value (such
+           as  _tracedump, which implements the screen dump for TRACE_UPDATE).
+           The caller should not free these strings, since the  allocation  is
+           reused on successive calls.  To work around the problem of a single
+           string-area per  function,  some  use  a  buffer-number  parameter,
+           telling the library to allocate additional string-areas.
+
+       The curses_trace function is always available, whether or not the other
+       trace functions are available:
+
+       o   If tracing  is  available,  calling  curses_trace  with  a  nonzero
+           parameter  updates  the  trace mask, and returns the previous trace
+           mask.
+
+           When the trace mask is nonzero, ncurses creates the file "trace" in
+           the  current  directory for output.  If the file already exists, no
+           tracing is done.
+
+       o   If tracing is not available, curses_trace returns zero (0).
+
+
+

Trace Parameter

+       The trace parameter is  formed  by  OR'ing  values  from  the  list  of
+       TRACE_xxx definitions in <curses.h>.  These include:
+
+       TRACE_DISABLE
+            turn off tracing by passing a zero parameter.
+
+            The  library  flushes  the  output file, but retains an open file-
+            descriptor to the trace file so that it can resume  tracing  later
+            if a nonzero parameter is passed to the curses_trace function.
+
+       TRACE_TIMES
+            trace user and system times of updates.
+
+       TRACE_TPUTS
+            trace tputs(3x) calls.
+
+       TRACE_UPDATE
+            trace update actions, old & new screens.
+
+       TRACE_MOVE
+            trace cursor movement and scrolling.
+
+       TRACE_CHARPUT
+            trace all character outputs.
+
+       TRACE_ORDINARY
+            trace  all  update  actions.   The old and new screen contents are
+            written to the trace file for each refresh.
+
+       TRACE_CALLS
+            trace all curses calls.  The parameters for each call are  traced,
+            as well as return values.
+
+       TRACE_VIRTPUT
+            trace virtual character puts, i.e., calls to addch.
+
+       TRACE_IEVENT
+            trace low-level input processing, including timeouts.
+
+       TRACE_BITS
+            trace state of TTY control bits.
+
+       TRACE_ICALLS
+            trace internal/nested calls.
+
+       TRACE_CCALLS
+            trace per-character calls.
+
+       TRACE_DATABASE
+            trace read/write of terminfo/termcap data.
+
+       TRACE_ATTRS
+            trace changes to video attributes and colors.
+
+       TRACE_MAXIMUM
+            maximum trace level, enables all of the separate trace features.
+
+       Some  tracing  features are enabled whenever the curses_trace parameter
+       is nonzero.  Some features overlap.  The specific names are used  as  a
+       guideline.
+
+
+

Command-line Utilities

+       The  command-line  utilities  such  as  tic(1) provide a verbose option
+       which extends the  set  of  messages  written  using  the  curses_trace
+       function.   Both  of  these (-v and curses_trace) use the same variable
+       (_nc_tracing), which determines the messages which are written.
+
+       Because the command-line utilities may  call  initialization  functions
+       such  as  setupterm,  tgetent  or  use_extended_names,  some  of  their
+       debugging output may be directed to the trace file if the NCURSES_TRACE
+       environment variable is set:
+
+       o   messages produced in the utility are written to the standard error.
+
+       o   messages produced by the underlying library are written to trace.
+
+       If  ncurses  is built without tracing, none of the latter are produced,
+       and fewer diagnostics are provided by the command-line utilities.
+
+
+

RETURN VALUE

+       Routines which return a value are designed to be used as parameters  to
+       the _tracef routine.
+
+
+

ENVIRONMENT

+
+

NCURSES_TRACE

+       A  positive integral value stored in this variable causes the following
+       functions to enable the tracing feature as if curses_trace were called.
+
+           filter, initscr, new_prescr, newterm, nofilter, restartterm,
+           ripoffline, setupterm, slk_init, tgetent, use_env,
+           use_extended_names, use_tioctl
+
+
+

PORTABILITY

+       These functions are not part of  the  X/Open  Curses  interface.   Some
+       other  curses  implementations  are known to have similar features, but
+       they are not compatible with ncurses:
+
+       o   SVr4 provided traceon and traceoff, to  control  whether  debugging
+           information  was  written to the "trace" file.  While the functions
+           were always available, this feature was only enabled if  DEBUG  was
+           defined when building the library.
+
+           The SVr4 tracing feature is undocumented.
+
+       o   PDCurses  provides  traceon  and  traceoff,  which  (like SVr4) are
+           always available, and enable tracing to the "trace" file only  when
+           a debug-library is built.
+
+           PDCurses  has  a  short description of these functions, with a note
+           that they are not present in X/Open Curses, ncurses or NetBSD.   It
+           does  not  mention  SVr4,  but the functions' inclusion in a header
+           file section labeled "Quasi-standard" hints at the origin.
+
+       o   NetBSD does not provide functions  for  enabling/disabling  traces.
+           It     uses    environment    variables    CURSES_TRACE_MASK    and
+           CURSES_TRACE_FILE to  determine  what  is  traced,  and  where  the
+           results  are  written.  This is available only when a debug-library
+           is built.
+
+           The NetBSD tracing feature is undocumented.
+
+       A few ncurses functions are not  provided  when  symbol  versioning  is
+       used:
+
+           _nc_tracebits, _tracedump, _tracemouse
+
+       The  original  trace routine was deprecated because it often conflicted
+       with application names.
+
+
+

SEE ALSO

+       curses(3x)
+
+
+
+ncurses 6.5                       2024-04-20                    curs_trace(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_util.3x.html b/contrib/ncurses/doc/html/man/curs_util.3x.html new file mode 100644 index 00000000..dfb73712 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_util.3x.html @@ -0,0 +1,443 @@ + + + + + + +curs_util 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_util 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_util(3x)                    Library calls                   curs_util(3x)
+
+
+
+
+

NAME

+       delay_output,  filter,  flushinp,  getwin, key_name, keyname, nofilter,
+       putwin, unctrl, use_env, use_tioctl,  wunctrl  -  miscellaneous  curses
+       utility routines
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       const char *unctrl(chtype ch);
+       wchar_t *wunctrl(cchar_t *wch);
+
+       const char *keyname(int c);
+       const char *key_name(wchar_t wc);
+
+       void filter(void);
+
+       void use_env(bool bf);
+
+       int putwin(WINDOW *win, FILE *filep);
+       WINDOW *getwin(FILE *filep);
+
+       int delay_output(int ms);
+       int flushinp(void);
+
+       /* extensions */
+       void nofilter(void);
+       void use_tioctl(bool bf);
+
+
+

DESCRIPTION

+
+

unctrl

+       The   unctrl   routine  returns  a  character  string  as  a  printable
+       representation of the character ch:
+
+       o   Printable characters are displayed  as  themselves,  e.g.,  a  one-
+           character string containing the key.
+
+       o   Control characters are displayed in the ^X notation.
+
+       o   Printing characters are displayed as is.
+
+       o   DEL (character 127) is displayed as ^?.
+
+       o   Values  above 128 are either meta characters (if the screen has not
+           been initialized, or if  meta(3x)  has  been  called  with  a  TRUE
+           parameter),  shown  in  the  M-X  notation,  or  are  displayed  as
+           themselves.  In the latter case, the values may not  be  printable;
+           this follows the X/Open specification.
+
+       The  corresponding  wunctrl  returns  a  printable  representation of a
+       complex character wch.
+
+       In both unctrl and wunctrl the attributes and color associated with the
+       character parameter are ignored.
+
+
+

keyname, key_name

+       The keyname routine returns a character string corresponding to the key
+       c.  Key codes are different from character codes.
+
+       o   Key codes below 256  are  characters.   They  are  displayed  using
+           unctrl.
+
+       o   Values  above 256 may be the codes for function keys.  The function
+           key name is displayed.
+
+       o   Otherwise (if there is no corresponding name and the key is  not  a
+           character)  the  function returns null, to denote an error.  X/Open
+           also  lists   an   "UNKNOWN   KEY"   return   value,   which   some
+           implementations return rather than null.
+
+       The   corresponding  key_name  returns  a  multibyte  character  string
+       corresponding to  the  wide-character  value  wc.   The  two  functions
+       (keyname and key_name) do not return the same set of strings:
+
+       o   keyname returns null where key_name would display a meta character.
+
+       o   key_name does not return the name of a function key.
+
+
+

filter, nofilter

+       The  filter  routine, if used, must be called before initscr or newterm
+       are called.  Calling filter causes these changes in initialization:
+
+       o   LINES is set to 1;
+
+       o   the  capabilities  clear,  cud1,  cud,  cup,  cuu1,  cuu,  vpa  are
+           disabled;
+
+       o   the capability ed is disabled if bce is set;
+
+       o   and the home string is set to the value of cr.
+
+       The  nofilter  routine  cancels  the effect of a preceding filter call.
+       That allows the caller to initialize a screen on  a  different  device,
+       using  a  different  value of $TERM.  The limitation arises because the
+       filter routine modifies the in-memory copy of the terminal information.
+
+
+

use_env

+       The use_env routine, if  used,  should  be  called  before  initscr  or
+       newterm  are  called  (because  those  compute  the  screen  size).  It
+       modifies the way ncurses treats environment variables when  determining
+       the screen size.
+
+       o   Normally  ncurses  looks  first  at  the  terminal database for the
+           screen size.
+
+           If use_env was called with  FALSE  for  parameter,  it  stops  here
+           unless use_tioctl was also called with TRUE for parameter.
+
+       o   Then  it  asks  for the screen size via operating system calls.  If
+           successful, it overrides the values from the terminal database.
+
+       o   Finally (unless use_env was called with FALSE  parameter),  ncurses
+           examines  the LINES or COLUMNS environment variables, using a value
+           in those to override the  results  from  the  operating  system  or
+           terminal database.
+
+           curses also updates the screen size in response to SIGWINCH, unless
+           overridden by the LINES or COLUMNS environment variables,
+
+
+

use_tioctl

+       The use_tioctl routine, if used, should be  called  before  initscr  or
+       newterm  are  called  (because  those  compute the screen size).  After
+       use_tioctl is called with TRUE as an  argument,  ncurses  modifies  the
+       last step in its computation of screen size as follows:
+
+       o   checks  if the LINES and COLUMNS environment variables are set to a
+           number greater than zero.
+
+       o   for each, ncurses updates the  corresponding  environment  variable
+           with  the  value  that it has obtained via operating system call or
+           from the terminal database.
+
+       o   ncurses re-fetches the value of the environment variables  so  that
+           it is still the environment variables that set the screen size.
+
+       The use_env and use_tioctl routines combine as follows.
+
+              use_env   use_tioctl   Summary
+              -----------------------------------------------------------------
+              TRUE      FALSE        ncurses   uses   operating  system  calls
+                                     unless overridden  by  LINES  or  COLUMNS
+                                     environment variables; default.
+              TRUE      TRUE         ncurses  updates  LINES and COLUMNS based
+                                     on operating system calls.
+              FALSE     TRUE         ncurses ignores LINES and COLUMNS,  using
+                                     operating system calls to obtain size.
+
+
+

putwin, getwin

+       The  putwin routine writes all data associated with window (or pad) win
+       into the file to which filep points.  This  information  can  be  later
+       retrieved using the getwin function.
+
+       The  getwin  routine  reads  window  related data stored in the file by
+       putwin.  The routine then creates and initializes a  new  window  using
+       that  data.   It  returns a pointer to the new window.  There are a few
+       caveats:
+
+       o   the data written is  a  copy  of  the  WINDOW  structure,  and  its
+           associated  character  cells.  The format differs between the wide-
+           character (ncursesw) and non-wide  (ncurses)  libraries.   You  can
+           transfer data between the two, however.
+
+       o   the  retrieved  window  is always created as a top-level window (or
+           pad), rather than a subwindow.
+
+       o   the window's character cells contain the color pair value, but  not
+           the  actual  color  numbers.   If cells in the retrieved window use
+           color pairs that have not been created  in  the  application  using
+           init_pair, they will not be colored when the window is refreshed.
+
+
+

delay_output

+       The  delay_output  routine  inserts  an ms millisecond pause in output.
+       Employ this function judiciously when  terminal  output  uses  padding,
+       because  ncurses  transmits  null  characters  (consuming  CPU  and I/O
+       resources) instead of  sleeping  and  requesting  resumption  from  the
+       operating system.  Padding is used unless:
+
+       o   the terminal description has npc (no_pad_char) capability, or
+
+       o   the environment variable NCURSES_NO_PADDING is set.
+
+       If  padding is not in use, ncurses uses napms to perform the delay.  If
+       the value of ms exceeds 30,000 (thirty seconds), it is capped  at  that
+       value.
+
+
+

flushinp

+       The  flushinp  routine throws away any typeahead that has been typed by
+       the user and has not yet been read by the program.
+
+
+

RETURN VALUE

+       Except for flushinp, routines that return an integer  return  ERR  upon
+       failure  and OK (SVr4 specifies only "an integer value other than ERR")
+       upon successful completion.
+
+       Routines that return pointers return NULL on error.
+
+       In this implementation
+
+          flushinp
+               returns ERR if the terminal was not initialized.
+
+          putwin
+               returns ERR if the associated write(2) calls return ERR.
+
+
+

PORTABILITY

+
+

filter

+       The SVr4 documentation describes the  action  of  filter  only  in  the
+       vaguest  terms.   The  description  here  is adapted from X/Open Curses
+       (which erroneously fails to describe the disabling of cuu).
+
+
+

delay_output padding

+       The limitation to 30 seconds and the use of  napms  differ  from  other
+       implementations.
+
+       o   SVr4 curses does not delay if no padding character is available.
+
+       o   NetBSD  curses  uses  napms when no padding character is available,
+           but does not take  timing  into  account  when  using  the  padding
+           character.
+
+       Neither limits the delay.
+
+
+

keyname

+       The  keyname  function  may  return  the  names  of user-defined string
+       capabilities that are defined in the terminfo entry via the  -x  option
+       of  tic.   This  implementation  automatically  assigns at run-time key
+       codes to user-defined strings that begin with "k".  The key codes start
+       at  KEY_MAX,  but are not guaranteed to be the same value for different
+       runs  because  user-defined  codes  are  merged   from   all   terminal
+       descriptions   that   have  been  loaded.   The  use_extended_names(3x)
+       function controls  whether  this  data  is  loaded  when  the  terminal
+       description is read by the library.
+
+
+

nofilter, use_tioctl

+       The  nofilter  and  use_tioctl  routines are specific to ncurses.  They
+       were not supported on Version 7, BSD or System V  implementations.   It
+       is  recommended  that  any  code  depending  on  ncurses  extensions be
+       conditioned using NCURSES_VERSION.
+
+
+

putwin/getwin file-format

+       The putwin and getwin functions have several issues with portability:
+
+       o   The  files  written  and   read   by   these   functions   use   an
+           implementation-specific  format.  Although the format is an obvious
+           target for standardization, it has been overlooked.
+
+           Interestingly enough, according to the copyright dates  in  Solaris
+           source,  the  functions (along with scr_init, etc.) originated with
+           the University of California, Berkeley (in 1982) and were later (in
+           1988)  incorporated  into SVr4.  Oddly, there are no such functions
+           in the 4.3BSD curses sources.
+
+       o   Most implementations simply dump the binary WINDOW structure to the
+           file.   These  include SVr4 curses, NetBSD and PDCurses, as well as
+           older ncurses versions.  This implementation (as well as the X/Open
+           variant of Solaris curses, dated 1995) uses textual dumps.
+
+           The  implementations  that use binary dumps use block-I/O (write(2)
+           and read(2) functions).  Those that use textual dumps use buffered-
+           I/O.  A few applications may happen to write extra data in the file
+           using these functions.  Doing that can  run  into  problems  mixing
+           block-  and  buffered-I/O.  This implementation reduces the problem
+           on writes by flushing the output.  However,  reading  from  a  file
+           written using mixed schemes may not be successful.
+
+
+

unctrl, wunctrl

+       X/Open  Curses,  Issue  4  describes  these functions.  It specifies no
+       error conditions for them.  It states  that  unctrl  and  wunctrl  will
+       return  a null pointer if unsuccessful.  This implementation checks for
+       three cases:
+
+       o   the parameter is a 7-bit US-ASCII code.   This  is  the  case  that
+           X/Open Curses documented.
+
+       o   the parameter is in the range 128-159, i.e., a C1 control code.  If
+           use_legacy_coding(3x) has been called with a  2  parameter,  unctrl
+           returns  the  parameter,  i.e.,  a  one-character  string  with the
+           parameter as the first  character.   Otherwise,  it  returns  "~@",
+           "~A", etc., analogous to "^@", "^A", C0 controls.
+
+           X/Open Curses does not document whether unctrl can be called before
+           initializing curses.  This implementation permits that, and returns
+           the "~@", etc., values in that case.
+
+       o   parameter values outside the 0 to 255 range.  unctrl returns a null
+           pointer.
+
+       The strings returned by unctrl in this implementation are determined at
+       compile  time,  showing C1 controls from the upper-128 codes with a "~"
+       prefix  rather  than  "^".   Other   implementations   have   different
+       conventions.    For  example,  they  may  show  both  sets  of  control
+       characters with "^", and strip the parameter to 7 bits.   Or  they  may
+       ignore  C1  controls and treat all of the upper-128 codes as printable.
+       This implementation uses 8 bits but  does  not  modify  the  string  to
+       reflect  locale.   The use_legacy_coding(3x) function allows the caller
+       to change the output of unctrl.
+
+       Likewise, the meta(3x) function allows the caller to change the  output
+       of  keyname,  i.e.,  it  determines  whether to use the "M-" prefix for
+       "meta"   keys   (codes   in   the   range   128    to    255).     Both
+       use_legacy_coding(3x)   and  meta(3x)  succeed  only  after  curses  is
+       initialized.  X/Open Curses does not document the  treatment  of  codes
+       128 to 159.  When treating them as "meta" keys (or if keyname is called
+       before  initializing  curses),  this  implementation  returns   strings
+       "M-^@", "M-^A", etc.
+
+       X/Open Curses documents unctrl as declared in <unctrl.h>, which ncurses
+       does.  However, ncurses' <curses.h> includes <unctrl.h>,  matching  the
+       behavior of SVr4 curses.  Other implementations may not do that.
+
+
+

use_env, use_tioctl

+       If  ncurses  is  configured  to provide the sp-functions extension, the
+       state of use_env and use_tioctl may be  updated  before  creating  each
+       screen  rather  than  once  only  (curs_sp_funcs(3x)).  This feature of
+       use_env is not provided by other implementations of curses.
+
+
+

HISTORY

+       4BSD (1980) defined unctrl (as a macro, in unctrl.h).
+
+       SVr2 (1984) introduced delay_output, flushinp, and keyname.
+
+       SVr3 (1987) added filter.  Later that year, SVr3.1 brought  getwin  and
+       putwin,  reading  and writing window dumps with fread(3) and fwrite(3),
+       respectively.
+
+       SVr4 (1989) supplied use_env.
+
+       X/Open Curses Issue 4 (1995) specified key_name and wunctrl.
+
+       ncurses 5.6 (2006) added nofilter, and 6.0 (2015) use_tioctl.
+
+
+

SEE ALSO

+       curses(3x), curs_initscr(3x), curs_inopts(3x), curs_kernel(3x),
+       curs_scr_dump(3x), curs_sp_funcs(3x), curs_variables(3x),
+       legacy_coding(3x)
+
+
+
+ncurses 6.5                       2024-09-21                     curs_util(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_variables.3x.html b/contrib/ncurses/doc/html/man/curs_variables.3x.html new file mode 100644 index 00000000..8728ded7 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_variables.3x.html @@ -0,0 +1,307 @@ + + + + + + +curs_variables 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

curs_variables 3x 2024-09-21 ncurses 6.5 Library calls

+
+curs_variables(3x)               Library calls              curs_variables(3x)
+
+
+
+
+

NAME

+       bool,  chtype,  cchar_t,  attr_t, SCREEN, WINDOW, TRUE, FALSE, ERR, OK,
+       curscr, newscr, stdscr, COLORS,  COLOR_PAIRS,  COLS,  LINES,  ESCDELAY,
+       TABSIZE - curses data types, constants, and global variables
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       /* data types */
+       typedef /* ... */ bool;
+       typedef /* ... */ chtype;
+       typedef /* ... */ cchar_t;
+       typedef /* ... */ attr_t;
+       typedef /* ... */ SCREEN;
+       typedef /* ... */ WINDOW;
+
+       /* constants */
+       const bool TRUE;
+       const bool FALSE;
+
+       const /* ... */ ERR;
+       const /* ... */ OK;
+
+       /* variables */
+       int COLORS;
+       int COLOR_PAIRS;
+       int COLS;
+       int LINES;
+       WINDOW * curscr;
+       WINDOW * stdscr;
+
+       /* extensions */
+       int ESCDELAY;
+       int TABSIZE;
+       WINDOW * newscr;
+
+
+

DESCRIPTION

+       This  page  summarizes data types, constants, and variables provided by
+       the curses library.  Locate further discussion in curses(3x).
+
+       Depending on ncurses's  build-time  configuration,  the  variables  may
+       instead  be  macros  (see  curs_threads(3x)  and  curs_opaque(3x)) that
+       provide read-only access to  the  library's  state.   In  either  case,
+       applications  should  treat  them  as  read-only to avoid confusing the
+       library.
+
+
+

CONSTANTS

+
+

TRUE, FALSE

+       The curses library defines TRUE and FALSE to represent  the  values  of
+       the Boolean data type.
+
+
+

ERR, OK

+       curses  and terminfo routines frequently return these constant integral
+       values indicating failure and success, respectively.
+
+
+

PREDEFINED TYPES

+
+

bool

+       X/Open Issue 4 curses  (1996)  preceded  the  ISO  C99  and  ISO  C++98
+       standards,  each of which also defined a Boolean data type.  The curses
+       library requires an integral type bool.
+
+       ncurses' configure script attempts to discover the data  type  used  by
+       the system's C and C++ compilers, to reuse for the curses bool.
+
+
+

chtype

+       The  chtype  integral  type combines a ("narrow", 8-bit) character with
+       attributes encoding the character's rendition, such as the  styling  of
+       its  typeface  and/or  foreground  and  background  colors.   See,  for
+       example, addch(3x), attron(3x), and inch(3x).
+
+
+

cchar_t, attr_t

+       chtype is too small for the standard C library's  wide-character  type,
+       wchar_t.   cchar_t  is a type that can accommodate an attr_t and enough
+       wide characters to store what  Unicode  terms  a  grapheme  cluster  (a
+       "user-perceived  character"  [UAX  #29], which may nevertheless require
+       several character encoding units to represent).  attr_t is an  integral
+       type  storing  "wide"  attributes  that  apply  to  cchar_ts.  See, for
+       example, add_wch(3x), attr_on(3x), and in_wch(3x).
+
+
+

SCREEN

+       curses  manages  a  terminal  device  with  this  structure  type;  see
+       initscr(3x).
+
+
+

WINDOW

+       curses  represents rectangular portions of the terminal screen with the
+       WINDOW structure type; see subsection "Overview" of ncurses(3x).
+
+
+

VARIABLES

+
+

curscr, stdscr, newscr

+       The library records updates to the terminal screen in  a  window  named
+       curscr.   This  object  is  referred  to  as  the  "physical screen" in
+       curs_refresh(3x) and curs_outopts(3x).
+
+       ncurses collects pending updates to the terminal  screen  in  a  window
+       named  newscr.   This  object is referred to as the "virtual screen" in
+       the curs_kernel(3x), curs_refresh(3x), and curs_outopts(3x).  When  the
+       screen  is  refreshed, curses determines a minimal set of updates using
+       the terminal's capabilities to make curscr look like newscr.
+
+       Once curses is initialized, it creates a window named  stdscr.   It  is
+       the  same size as the terminal screen and is the default window used by
+       routines that do not take a parameter  identifying  one.   Many  curses
+       functions use this window.
+
+
+

COLORS

+       Once  curses  is  initialized,  COLORS  contains  the  number of colors
+       supported by the terminal; see curs_color(3x).
+
+
+

COLOR_PAIRS

+       Once curses is initialized, COLOR_PAIRS contains the  number  of  color
+       pairs supported by the terminal; see curs_color(3x).
+
+
+

COLS, LINES

+       Once  curses  is initialized, COLS and LINES contain the screen's width
+       and height in character cells, respectively; that  is,  the  number  of
+       columns and lines.
+
+
+

ESCDELAY

+       For  curses  to  distinguish  the ESC character resulting from a user's
+       press of the "Escape" key on the input device  from  one  beginning  an
+       escape sequence (as commonly produced by function keys), it waits after
+       the escape character to see if further characters are available on  the
+       input stream within a short interval.  ESCDELAY stores this interval in
+       milliseconds.
+
+       If keypad(3x) is disabled for the  curses  window  receiving  input,  a
+       program must disambiguate escape sequences itself.
+
+
+

TABSIZE

+       The curses library converts a tab character to this number of spaces as
+       it adds a tab to a window; see curs_addch(3x).
+
+
+

NOTES

+       Either initscr(3x) or newterm(3x) initializes curses.
+
+       If  ncurses  is  configured  to  provide  separate  curses  and   tinfo
+       libraries, most of these variables reside in the former.
+
+
+

PORTABILITY

+       The  X/Open  Curses  standard  documents all of the foregoing types and
+       symbols except for newscr, TABSIZE, and ESCDELAY.
+
+       X/Open Curses describes curscr only as "an  internal  data  structure";
+       SVr4   gave  more  details,  noting  its  use  "for  certain  low-level
+       operations like clearing and redrawing a  screen  containing  garbage".
+       Neither specified its interaction with the rest of the interface beyond
+       use as an argument to clearok(3x) and wrefresh(3x).
+
+       newscr is a feature of SVr4 curses.  When refreshing the screen, it  is
+       used  as  a  working area for combining the standard window stdscr with
+       any others the application may have created with newwin(3x).  When  the
+       update of newscr is complete, curses modifies curscr to match newscr.
+
+       TABSIZE is a feature of SVr4 curses.
+
+       o   SVr4   initially  sets  TABSIZE  from  the  terminal  description's
+           init_tabs  capability.   After  that,  it   can   be   altered   by
+           applications using SVr4 curses.
+
+       o   SVr4  curses  uses  the value of TABSIZE to compute the position of
+           tab stops when updating both the virtual screen with addch(3x)  and
+           the physical screen with mvcur(3x).
+
+       o   ncurses  uses  the  value  of  TABSIZE  only  to update the virtual
+           screen.   It  uses  the  terminal  description's  "it"  (init_tabs)
+           capability  for  computing hardware tabs (that is, tab stops on the
+           physical screen).
+
+       o   Other implementations differ.  For instance, NetBSD  curses  allows
+           TABSIZE  to  be  set through an environment variable.  ncurses does
+           not.
+
+           NetBSD curses does not support hardware tabs; it uses the init_tabs
+           capability  and  the TABSIZE variable only for updating the virtual
+           screen.
+
+       ESCDELAY is a feature of AIX curses.
+
+       o   In AIX, the units for ESCDELAY are fifths of milliseconds.
+
+       o   The default value for AIX's ESCDELAY equals 0.1 seconds.
+
+       o   AIX also enforces a limit of 10,000 seconds for  ESCDELAY;  ncurses
+           does not enforce any upper limit.
+
+       ncurses  has  long  used ESCDELAY with units of milliseconds, making it
+       impossible to be completely compatible with  AIX.   Consequently,  most
+       users  have  decided  either to override the value, or to rely upon its
+       default.
+
+
+

SEE ALSO

+       [UAX #29] "Unicode  Standard  Annex  #29:  Unicode  Text  Segmentation"
+       <https://unicode.org/reports/tr29/>
+
+       curses(3x),    curs_color(3x),    curs_opaque(3x),   curs_terminfo(3x),
+       curs_threads(3x), term_variables(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-09-21                curs_variables(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/curs_window.3x.html b/contrib/ncurses/doc/html/man/curs_window.3x.html new file mode 100644 index 00000000..03292a19 --- /dev/null +++ b/contrib/ncurses/doc/html/man/curs_window.3x.html @@ -0,0 +1,278 @@ + + + + + + +curs_window 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

curs_window 3x 2024-09-14 ncurses 6.5 Library calls

+
+curs_window(3x)                  Library calls                 curs_window(3x)
+
+
+
+
+

NAME

+       newwin,  delwin,  mvwin,  subwin,  derwin,  mvderwin,  dupwin, wsyncup,
+       syncok, wcursyncup, wsyncdown - create and manipulate curses windows
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       WINDOW * newwin(
+            int nlines, int ncols,
+            int begin_y, int begin_x);
+       int delwin(WINDOW * win);
+       int mvwin(WINDOW * win, int y, int x);
+       WINDOW * subwin(WINDOW * orig,
+            int nlines, int ncols,
+            int begin_y, int begin_x);
+       WINDOW * derwin(WINDOW * orig,
+            int nlines, int ncols,
+            int begin_y, int begin_x);
+       int mvderwin(WINDOW * win, int par_y, int par_x);
+       WINDOW * dupwin(WINDOW * win);
+       void wsyncup(WINDOW * win);
+       int syncok(WINDOW * win, bool bf);
+       void wcursyncup(WINDOW * win);
+       void wsyncdown(WINDOW * win);
+
+
+

DESCRIPTION

+
+

newwin

+       Calling newwin 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 begin_y,
+              column begin_x
+
+       If either nlines or ncols is zero, they default to
+              LINES - begin_y and
+              COLS - begin_x.
+
+       A new full-screen window is created by calling newwin(0,0,0,0).
+
+       Regardless of the function  used  for  creating  a  new  window  (e.g.,
+       newwin, subwin, derwin, newpad), rather than a duplicate (with dupwin),
+       all of the window modes are initialized to the default  values.   These
+       functions set window modes after a window is created:
+
+              idcok  idlok  immedok  keypad leaveok nodelay scrollok setscrreg
+              syncok wbkgdset wbkgrndset and wtimeout.
+
+
+

delwin

+       Calling delwin 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.
+
+
+

mvwin

+       Calling mvwin moves the window so that the upper left-hand corner is at
+       position  (x,  y).   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.
+
+
+

subwin

+       Calling  subwin  creates and returns a pointer to a new window with the
+       given number of lines, nlines, and columns, ncols.  The  window  is  at
+       position (begin_y, begin_x) on the screen.  The subwindow shares memory
+       with the window orig, its ancestor, so that changes made to one  window
+       will  affect both windows.  When using this routine, it is necessary to
+       call touchwin or touchline on  orig  before  calling  wrefresh  on  the
+       subwindow.
+
+
+

derwin

+       Calling  derwin  is the same as calling subwin, except that begin_y and
+       begin_x are relative to the origin of the window orig rather  than  the
+       screen.   There is no difference between the subwindows and the derived
+       windows.
+
+
+

mvderwin

+       Calling mvderwin 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.
+
+
+

dupwin

+       Calling dupwin creates an exact duplicate of the window win.
+
+
+

wsyncup

+       Calling  wsyncup  touches  all  locations  in ancestors of win that are
+       changed in win.  If syncok is called with  second  argument  TRUE  then
+       wsyncup  is  called  automatically  whenever  there  is a change in the
+       window.
+
+
+

wsyncdown

+       The wsyncdown routine touches  each  location  in  win  that  has  been
+       touched  in  any  of  its  ancestor windows.  This routine is called by
+       wrefresh, so it should almost never be necessary to call it manually.
+
+
+

wcursyncup

+       The routine wcursyncup updates the current cursor position of  all  the
+       ancestors  of  the window to reflect the current cursor position of the
+       window.
+
+
+

RETURN VALUE

+       Routines that return an integer return the integer ERR upon failure and
+       OK  (SVr4  only  specifies  "an  integer  value  other  than ERR") upon
+       successful completion.
+
+       Routines that return pointers return NULL on error.
+
+       X/Open defines no error conditions.  In this implementation
+
+       delwin
+            returns ERR if the window pointer is null, or if the window is the
+            parent of another window.
+
+       derwin
+            returns ERR if the parent window pointer is null, or if any of its
+            ordinates or dimensions is negative, or if  the  resulting  window
+            does not fit inside the parent window.
+
+       dupwin
+            returns ERR if the window pointer is null.
+
+            This  implementation  also maintains a list of windows, and checks
+            that the  pointer  passed  to  delwin  is  one  that  it  created,
+            returning an error if it was not..
+
+       mvderwin
+            returns  ERR if the window pointer is null, or if some part of the
+            window would be placed off-screen.
+
+       mvwin
+            returns ERR if the window pointer is null, or  if  the  window  is
+            really  a  pad, or if some part of the window would be placed off-
+            screen.
+
+       newwin
+            will fail if either of its beginning ordinates is negative, or  if
+            either the number of lines or columns is negative.
+
+       syncok
+            returns ERR if the window pointer is null.
+
+       subwin
+            returns ERR if the parent window pointer is null, or if any of its
+            ordinates or dimensions is negative, or if  the  resulting  window
+            does not fit inside the parent window.
+
+       The  functions  which return a window pointer may also fail if there is
+       insufficient memory for its data structures.  Any  of  these  functions
+       will fail if the screen has not been initialized, i.e., with initscr or
+       newterm.
+
+
+

NOTES

+       If many small changes are made to the window, the wsyncup option  could
+       degrade performance.
+
+       Note that syncok may be a macro.
+
+
+

PORTABILITY

+       X/Open Curses, Issue 4 describes these functions.
+
+       Regarding delwin, X/Open Curses states that
+
+              [t]he  application  must  delete  subwindows before deleting the
+              main window.
+
+       If delwin is asked to delete a parent window, it can  succeed  only  if
+       the  curses library keeps a list of its subwindows.  SVr4 curses kept a
+       count of the number of  subwindows  rather  than  a  list.   It  simply
+       returned  ERR  when asked to delete a subwindow.  Solaris X/Open curses
+       (xcurses) does not make even that  check,  and  will  delete  a  parent
+       window that still has subwindows.  PDCurses also behaves this way.
+
+       ncurses  4.0  (1996)  and  later  maintains  a list of windows for each
+       screen to ensure that a window has no subwindows  before  allowing  its
+       deletion.  NetBSD curses has followed suit since 2003.
+
+       SVr4  curses  documentation is unclear about what wsyncup and wsyncdown
+       actually do.  It seems to imply that they are supposed  to  touch  only
+       those  lines that are affected by changes to a window's ancestors.  The
+       description and behavior of these functions in ncurses is patterned  on
+       the X/Open Curses standard; this approach may result in slower updates.
+
+
+

SEE ALSO

+       curses(3x),    curs_initscr(3x),    curs_refresh(3x),   curs_touch(3x),
+       curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-09-14                   curs_window(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/default_colors.3x.html b/contrib/ncurses/doc/html/man/default_colors.3x.html new file mode 100644 index 00000000..14a0f8e3 --- /dev/null +++ b/contrib/ncurses/doc/html/man/default_colors.3x.html @@ -0,0 +1,167 @@ + + + + + + +default_colors 3x 2024-04-13 ncurses 6.5 Library calls + + + + +

default_colors 3x 2024-04-13 ncurses 6.5 Library calls

+
+default_colors(3x)               Library calls              default_colors(3x)
+
+
+
+
+

NAME

+       use_default_colors,  assume_default_colors  -  use  terminal's  default
+       colors in curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int use_default_colors(void);
+       int assume_default_colors(int fg, int bg);
+
+
+

DESCRIPTION

+       The  use_default_colors   and   assume_default_colors   functions   are
+       extensions  to  the  curses library.  They are used with terminals that
+       support ISO 6429 color,  or  equivalent.   These  terminals  allow  the
+       application  to reset color to an unspecified default value (e.g., with
+       SGR 39 or SGR 49).
+
+       Applications that paint a colored background over the whole  screen  do
+       not  take  advantage  of  SGR  39  and  SGR  49.  Some applications are
+       designed to work with the default background,  using  colors  only  for
+       text.  For example, there are several implementations of the ls program
+       which use colors to denote different file types or permissions.   These
+       "color  ls"  programs  do  not necessarily modify the background color,
+       typically  using  only  the  setaf  terminfo  capability  to  set   the
+       foreground color.  Full-screen applications that use default colors can
+       achieve similar visual effects.
+
+       The first function, use_default_colors  tells  the  curses  library  to
+       assign  terminal  default  foreground/background colors to color number
+       -1.  So init_pair(x,COLOR_RED,-1) will initialize  pair  x  as  red  on
+       default  background and init_pair(x,-1,COLOR_BLUE) will initialize pair
+       x as default foreground on blue.
+
+       The other, assume_default_colors is  a  refinement  which  tells  which
+       colors  to  paint for color pair 0.  This function recognizes a special
+       color number -1, which denotes the default terminal color.
+
+       The following are equivalent:
+              use_default_colors();
+              assume_default_colors(-1,-1);
+
+       These are ncurses extensions.  For other curses implementations,  color
+       number  -1  does  not  mean  anything,  just  as  for  ncurses before a
+       successful call of use_default_colors or assume_default_colors.
+
+       Other curses implementations do not  allow  an  application  to  modify
+       color  pair  0.  They assume that the background is COLOR_BLACK, but do
+       not ensure that the color pair 0 is painted to  match  the  assumption.
+       If   your   application  does  not  use  either  use_default_colors  or
+       assume_default_colors ncurses will paint a white foreground (text) with
+       black background for color pair 0.
+
+
+

RETURN VALUE

+       These  functions return the integer ERR upon failure and OK on success.
+       They will fail if either the terminal does not support the orig_pair or
+       orig_colors  capability.   If  the  initialize_pair  capability  is not
+       found, this causes an error as well.
+
+
+

NOTES

+       Associated with this extension, the init_pair function accepts negative
+       arguments to specify default foreground or background colors.
+
+       The  use_default_colors  function  was added to support ded.  This is a
+       full-screen application which uses curses to manage only  part  of  the
+       screen.  The bottom portion of the screen, which is of adjustable size,
+       is left uncolored to display the results from shell commands.  The  top
+       portion  of  the screen colors filenames using a scheme like the "color
+       ls" programs.  Attempting to manage the background color of the  screen
+       for this application would give unsatisfactory results for a variety of
+       reasons.  This extension was devised after noting that color xterm (and
+       similar   programs)   provides   a  background  color  which  does  not
+       necessarily correspond to any of the  ANSI  colors.   While  a  special
+       terminfo  entry  could  be  constructed using nine colors, there was no
+       mechanism provided within curses to account for the  related  orig_pair
+       and back_color_erase capabilities.
+
+       The  assume_default_colors  function  was  added  to  solve a different
+       problem: support for applications which would use environment variables
+       and  other  configuration  to  bypass  curses' notion of the terminal's
+       default colors, setting specific values.
+
+
+

PORTABILITY

+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+

AUTHORS

+       Thomas Dickey (from an analysis of the requirements for color xterm for
+       XFree86 3.1.2C, February 1996).
+
+
+

SEE ALSO

+       ded(1), curs_color(3x)
+
+
+
+ncurses 6.5                       2024-04-13                default_colors(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/define_key.3x.html b/contrib/ncurses/doc/html/man/define_key.3x.html new file mode 100644 index 00000000..29cf51ac --- /dev/null +++ b/contrib/ncurses/doc/html/man/define_key.3x.html @@ -0,0 +1,118 @@ + + + + + + +define_key 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

define_key 3x 2024-07-27 ncurses 6.5 Library calls

+
+define_key(3x)                   Library calls                  define_key(3x)
+
+
+
+
+

NAME

+       define_key - define a curses function key code
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int define_key(const char * definition, int key-code);
+
+
+

DESCRIPTION

+       The define_key ncurses extension permits a curses application to bind a
+       string definition to the function key key-code returned  by  wgetch(3x)
+       (wide-character  API users: wget_wch(3x)) when keypad(3x) is enabled in
+       a window and a function key is  pressed.   ncurses  interprets  such  a
+       binding  as  it  does  those  in  the  terminfo  database entry for the
+       terminal type.
+
+       A definition of  NULL  removes  any  existing  binding  from  key-code.
+       Similarly,  a  non-positive  key-code  removes  an existing binding for
+       definition, if any.
+
+
+

RETURN VALUE

+       define_key returns ERR if
+
+       o   definition is NULL and key-code is nonpositive, or
+
+       o   insufficient memory is available to bind definition to key-code.
+
+       Otherwise, define_key returns OK.
+
+
+

EXTENSIONS

+       define_key is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       NetBSD curses since 2.0 (2004) supports define_key.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       curses(3x), keybound(3x), keyok(3x), key_defined(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-07-27                    define_key(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form.3x.html b/contrib/ncurses/doc/html/man/form.3x.html new file mode 100644 index 00000000..5ebc1275 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form.3x.html @@ -0,0 +1,268 @@ + + + + + + +form 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

form 3x 2024-05-25 ncurses 6.5 Library calls

+
+form(3x)                         Library calls                        form(3x)
+
+
+
+
+

NAME

+       form - present user-fillable forms in curses windows
+
+
+

SYNOPSIS

+       #include <form.h>
+
+
+

DESCRIPTION

+       The form library provides terminal-independent facilities for composing
+       form screens on character-cell terminals.  The library includes:  field
+       routines, which create and modify form fields; and form routines, which
+       group fields into forms,  display  forms  on  the  screen,  and  handle
+       interaction with the user.
+
+       The  form  library uses the curses libraries.  To use the form library,
+       link with the options -lform -lcurses.
+
+       Your program should set up the locale, e.g.,
+
+            setlocale(LC_ALL, "");
+
+       so that input/output processing will work.
+
+       A curses initialization routine such as initscr must be  called  before
+       using any of these functions.
+
+
+

Current Default Values for Field Attributes

+       The  form  library maintains a default value for field attributes.  You
+       can get or  set  this  default  by  calling  the  appropriate  set_  or
+       retrieval  routine  with  a  NULL field pointer.  Changing this default
+       with a set_ function affects  future  field  creations,  but  does  not
+       change the rendering of fields already created.
+
+
+

Routine Name Index

+       The  following table lists each form routine and the name of the manual
+       page  on  which  it  is  described.   Routines  flagged  with  "*"  are
+       ncurses-specific, not present in SVr4.
+
+       curses Routine Name     Manual Page Name
+       --------------------------------------------------
+       current_field           form_page(3x)
+       data_ahead              form_data(3x)
+       data_behind             form_data(3x)
+       dup_field               form_field_new(3x)
+       dynamic_field_info      form_field_info(3x)
+       field_arg               form_field_validation(3x)
+       field_back              form_field_attributes(3x)
+       field_buffer            form_field_buffer(3x)
+       field_count             form_field(3x)
+       field_fore              form_field_attributes(3x)
+       field_index             form_page(3x)
+       field_info              form_field_info(3x)
+       field_init              form_hook(3x)
+       field_just              form_field_just(3x)
+       field_opts              form_field_opts(3x)
+       field_opts_off          form_field_opts(3x)
+       field_opts_on           form_field_opts(3x)
+       field_pad               form_field_attributes(3x)
+       field_status            form_field_buffer(3x)
+       field_term              form_hook(3x)
+       field_type              form_field_validation(3x)
+       field_userptr           form_field_userptr(3x)
+
+       form_driver             form_driver(3x)
+       form_driver_w           form_driver(3x)*
+       form_fields             form_field(3x)
+       form_init               form_hook(3x)
+       form_opts               form_opts(3x)
+       form_opts_off           form_opts(3x)
+       form_opts_on            form_opts(3x)
+       form_page               form_page(3x)
+       form_request_by_name    form_requestname(3x)*
+       form_request_name       form_requestname(3x)*
+       form_sub                form_win(3x)
+       form_term               form_hook(3x)
+       form_userptr            form_userptr(3x)
+       form_win                form_win(3x)
+       free_field              form_field_new(3x)
+       free_fieldtype          form_fieldtype(3x)
+       free_form               form_new(3x)
+       link_field              form_field_new(3x)
+       link_fieldtype          form_fieldtype(3x)
+       move_field              form_field(3x)
+       new_field               form_field_new(3x)
+       new_fieldtype           form_fieldtype(3x)
+       new_form                form_new(3x)
+       new_page                form_new_page(3x)
+       pos_form_cursor         form_cursor(3x)
+       post_form               form_post(3x)
+       scale_form              form_win(3x)
+       set_current_field       form_page(3x)
+       set_field_back          form_field_attributes(3x)
+       set_field_buffer        form_field_buffer(3x)
+       set_field_fore          form_field_attributes(3x)
+       set_field_init          form_hook(3x)
+       set_field_just          form_field_just(3x)
+       set_field_opts          form_field_opts(3x)
+       set_field_pad           form_field_attributes(3x)
+       set_field_status        form_field_buffer(3x)
+       set_field_term          form_hook(3x)
+       set_field_type          form_field_validation(3x)
+       set_field_userptr       form_field_userptr(3x)
+       set_fieldtype_arg       form_fieldtype(3x)
+       set_fieldtype_choice    form_fieldtype(3x)
+       set_form_fields         form_field(3x)
+       set_form_init           form_hook(3x)
+       set_form_opts           form_field_opts(3x)
+       set_form_page           form_page(3x)
+       set_form_sub            form_win(3x)
+       set_form_term           form_hook(3x)
+       set_form_userptr        form_userptr(3x)
+       set_form_win            form_win(3x)
+       set_max_field           form_field_buffer(3x)
+       set_new_page            form_new_page(3x)
+       unfocus_current_field   form_page(3x)*
+       unpost_form             form_post(3x)
+
+
+

RETURN VALUE

+       Routines  that  return  pointers return NULL on error, and set errno to
+       the  corresponding  error-code  returned  by  functions  returning   an
+       integer.   Routines  that return an integer return one of the following
+       error codes:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_CONNECTED
+            The field is already connected to a form.
+
+       E_INVALID_FIELD
+            Contents of a field are not valid.
+
+       E_NOT_CONNECTED
+            No fields are connected to the form.
+
+       E_NOT_POSTED
+            The form has not been posted.
+
+       E_NO_ROOM
+            Form is too large for its window.
+
+       E_POSTED
+            The form is already posted.
+
+       E_REQUEST_DENIED
+            The form driver could not process the request.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_UNKNOWN_COMMAND
+            The form driver code saw an unknown request code.
+
+
+

NOTES

+       The header file form.h itself includes curses.h.
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       A  form  facility  was  documented in SVr4.2's Character User Interface
+       Programming document.
+
+       It is not part of X/Open Curses.
+
+       Aside from ncurses, there are few implementations:
+
+       o   systems based on SVr4 source code, e.g., Solaris.
+
+       o   NetBSD curses.
+
+       A few  functions  in  this  implementation  are  extensions  added  for
+       ncurses,   but   not   provided   by   other   implementations,   e.g.,
+       form_driver_w, unfocus_current_field.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for ncurses  by  Eric  S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-05-25                          form(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_cursor.3x.html b/contrib/ncurses/doc/html/man/form_cursor.3x.html new file mode 100644 index 00000000..5844dd58 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_cursor.3x.html @@ -0,0 +1,111 @@ + + + + + + +form_cursor 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_cursor 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_cursor(3x)                  Library calls                 form_cursor(3x)
+
+
+
+
+

NAME

+       pos_form_cursor - position a form window cursor
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int pos_form_cursor(FORM *form);
+
+
+

DESCRIPTION

+       The  function  pos_form_cursor  restores  the  cursor  to  the position
+       required for the forms driver to continue processing requests.  This is
+       useful  after curses routines have been called to do screen-painting in
+       response to a form operation.
+
+
+

RETURN VALUE

+       This routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_NOT_POSTED
+            The form has not been posted.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                   form_cursor(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_data.3x.html b/contrib/ncurses/doc/html/man/form_data.3x.html new file mode 100644 index 00000000..2f1dc3b9 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_data.3x.html @@ -0,0 +1,97 @@ + + + + + + +form_data 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_data 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_data(3x)                    Library calls                   form_data(3x)
+
+
+
+
+

NAME

+       data_ahead, data_behind - test for off-screen data in given forms
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       bool data_ahead(const FORM *form);
+       bool data_behind(const FORM *form);
+
+
+

DESCRIPTION

+       The function data_ahead tests whether there is off-screen data ahead in
+       the given form.  It returns TRUE (1) or FALSE (0).
+
+       The function data_behind tests whether there is off-screen data  behind
+       in the given form.  It returns TRUE (1) or FALSE (0).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     form_data(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_driver.3x.html b/contrib/ncurses/doc/html/man/form_driver.3x.html new file mode 100644 index 00000000..859c291a --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_driver.3x.html @@ -0,0 +1,301 @@ + + + + + + +form_driver 3x 2024-04-20 ncurses 6.5 Library calls + + + + +

form_driver 3x 2024-04-20 ncurses 6.5 Library calls

+
+form_driver(3x)                  Library calls                 form_driver(3x)
+
+
+
+
+

NAME

+       form_driver, form_driver_w - command-processing loop of the form system
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int form_driver(FORM *form, int c);
+       int form_driver_w(FORM *form, int c, wchar_t wc);
+
+
+

DESCRIPTION

+
+

form_driver

+       Once a form has been posted (displayed), you should funnel input events
+       to it through form_driver.  This routine has three major input cases:
+
+       o   The input is a form navigation request.  Navigation  request  codes
+           are constants defined in <form.h>, which are distinct from the key-
+           and character codes returned by wgetch(3x).
+
+       o   The input is a printable character.   Printable  characters  (which
+           must  be  positive,  less  than  256)  are checked according to the
+           program's locale settings.
+
+       o   The input is the KEY_MOUSE special key  associated  with  an  mouse
+           event.
+
+
+

form_driver_w

+       This  extension  simplifies  the  use  of  the forms library using wide
+       characters.  The input is either a key  code  (a  request)  or  a  wide
+       character returned by get_wch(3x).  The type must be passed as well, to
+       enable the library  to  determine  whether  the  parameter  is  a  wide
+       character or a request.
+
+
+

Form Driver Requests

+       The form driver requests are as follows:
+
+       Name               Description
+       ------------------------------------------------------------------------
+       REQ_BEG_FIELD      Move to beginning of field.
+       REQ_BEG_LINE       Move to beginning of the line.
+       REQ_CLR_EOF        Clear to end of field from cursor.
+       REQ_CLR_EOL        Clear to end of line from cursor.
+       REQ_CLR_FIELD      Clear the entire field.
+       REQ_DEL_CHAR       Delete character at the cursor.
+       REQ_DEL_LINE       Delete line at the cursor.
+       REQ_DEL_PREV       Delete character before the cursor.
+       REQ_DEL_WORD       Delete blank-delimited word at cursor.
+       REQ_DOWN_CHAR      Move down in field.
+       REQ_DOWN_FIELD     Move down to a field.
+       REQ_END_FIELD      Move to the end of field.
+       REQ_END_LINE       Move to the end of the line.
+       REQ_FIRST_FIELD    Move to the first field.
+       REQ_FIRST_PAGE     Move to the first page.
+       REQ_INS_CHAR       Insert a blank at the cursor.
+       REQ_INS_LINE       Insert a blank line at the cursor.
+       REQ_INS_MODE       Enter insert mode.
+       REQ_LAST_FIELD     Move to the last field.
+       REQ_LAST_PAGE      Move to the last field.
+       REQ_LEFT_CHAR      Move left in field.
+       REQ_LEFT_FIELD     Move left to a field.
+       REQ_NEW_LINE       Insert or overlay a new line.
+       REQ_NEXT_CHAR      Move to the next char.
+
+       REQ_NEXT_CHOICE    Display next field choice.
+       REQ_NEXT_FIELD     Move to the next field.
+       REQ_NEXT_LINE      Move to the next line.
+       REQ_NEXT_PAGE      Move to the next page.
+       REQ_NEXT_PAGE      Move to the next page.
+       REQ_NEXT_WORD      Move to the next word.
+       REQ_OVL_MODE       Enter overlay mode.
+       REQ_PREV_CHAR      Move to the previous char.
+       REQ_PREV_CHOICE    Display previous field choice.
+       REQ_PREV_FIELD     Move to the previous field.
+       REQ_PREV_LINE      Move to the previous line.
+       REQ_PREV_PAGE      Move to the previous page.
+       REQ_PREV_WORD      Move to the previous word.
+       REQ_RIGHT_CHAR     Move right in field.
+       REQ_RIGHT_FIELD    Move right to a field.
+       REQ_SCR_BCHAR      Scroll field backward 1 character.
+       REQ_SCR_BHPAGE     Scroll field backward 1/2 page.
+       REQ_SCR_BLINE      Scroll field backward 1 line.
+       REQ_SCR_BPAGE      Scroll field backward 1 page.
+       REQ_SCR_FCHAR      Scroll field forward 1 character.
+       REQ_SCR_FHPAGE     Scroll field forward 1/2 page.
+       REQ_SCR_FLINE      Scroll field forward 1 line.
+       REQ_SCR_FPAGE      Scroll field forward 1 page.
+       REQ_SCR_HBHALF     Horizontal scroll field backward 1/2 line.
+       REQ_SCR_HBLINE     Horizontal scroll field backward 1 line.
+       REQ_SCR_HFHALF     Horizontal scroll field forward 1/2 line.
+       REQ_SCR_HFLINE     Horizontal scroll field forward 1 line.
+       REQ_SFIRST_FIELD   Move to the sorted first field.
+       REQ_SLAST_FIELD    Move to the sorted last field.
+       REQ_SNEXT_FIELD    Move to the sorted next field.
+       REQ_SPREV_FIELD    Move to the sorted previous field.
+       REQ_UP_CHAR        Move up in field.
+       REQ_UP_FIELD       Move up to a field.
+       REQ_VALIDATION     Validate field.
+
+       If  the  second argument is a printable character, the driver places it
+       in the current position in the current field.  If  it  is  one  of  the
+       forms requests listed above, that request is executed.
+
+
+

Field Validation

+       The  form  library  makes  updates  to  the window associated with form
+       fields rather than directly to the field buffers.
+
+       The form driver provides low-level control over  updates  to  the  form
+       fields.   The  form driver also provides for validating modified fields
+       to ensure that the contents meet whatever  constraints  an  application
+       may attach using set_field_type.
+
+       You  can  validate  a  field  without  making  any  changes to it using
+       REQ_VALIDATION.  The form driver also validates a field in these cases:
+
+       o   a call to set_current_field attempts to move to a different field.
+
+       o   a call to set_current_page attempts to move to a different page  of
+           the form.
+
+       o   a request attempts to move to a different field.
+
+       o   a request attempts to move to a different page of the form.
+
+       In each case, the move fails if the field is invalid.
+
+       If  the  modified  field  is valid, the form driver copies the modified
+       data from the window associated with the field to the field buffer.
+
+
+

Mouse Handling

+       If the second argument is the KEY_MOUSE  special  key,  the  associated
+       mouse  event  is translated into one of the above pre-defined requests.
+       Currently only clicks in the user window (e.g., inside the form display
+       area or the decoration window) are handled.
+
+       If you click above the display region of the form:
+
+          a REQ_PREV_FIELD is generated for a single click,
+
+          a REQ_PREV_PAGE is generated for a double-click and
+
+          a REQ_FIRST_FIELD is generated for a triple-click.
+
+       If you click below the display region of the form:
+
+          a REQ_NEXT_FIELD is generated for a single click,
+
+          a REQ_NEXT_PAGE is generated for a double-click and
+
+          a REQ_LAST_FIELD is generated for a triple-click.
+
+       If you click at an field inside the display area of the form:
+
+          o   the form cursor is positioned to that field.
+
+          o   If  you  double-click  a field, the form cursor is positioned to
+              that field and E_UNKNOWN_COMMAND is returned.  This return value
+              makes sense, because a double click usually means that an field-
+              specific action should be returned.  It is exactly  the  purpose
+              of  this  return  value  to  signal that an application specific
+              command should be executed.
+
+          o   If a translation into a request was  done,  form_driver  returns
+              the result of this request.
+
+       If  you clicked outside the user window or the mouse event could not be
+       translated into a form request an E_REQUEST_DENIED is returned.
+
+
+

Application-defined Commands

+       If the second argument is neither printable nor one of the  above  pre-
+       defined form requests, the driver assumes it is an application-specific
+       command and returns  E_UNKNOWN_COMMAND.   Application-defined  commands
+       should  be  defined relative to MAX_COMMAND, the maximum value of these
+       pre-defined requests.
+
+
+

RETURN VALUE

+       form_driver returns one of the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NOT_POSTED
+            The form has not been posted.
+
+       E_INVALID_FIELD
+            Contents of field is invalid.
+
+       E_NOT_CONNECTED
+            No fields are connected to the form.
+
+       E_REQUEST_DENIED
+            The form driver could not process the request.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_UNKNOWN_COMMAND
+            The form driver code saw an unknown request code.
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x),   form(3x),   form_fieldtype(3x),    form_field_buffer(3x),
+       form_field_validation(3x), form_variables(3x), getch(3x)
+
+
+
+ncurses 6.5                       2024-04-20                   form_driver(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field.3x.html b/contrib/ncurses/doc/html/man/form_field.3x.html new file mode 100644 index 00000000..8eb58d4c --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field.3x.html @@ -0,0 +1,131 @@ + + + + + + +form_field 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field(3x)                   Library calls                  form_field(3x)
+
+
+
+
+

NAME

+       form_field - make and break connections between fields and forms
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_form_fields(FORM *form, FIELD **fields);
+       FIELD **form_fields(const FORM *form);
+       int field_count(const FORM *form);
+       int move_field(FIELD *field, int frow, int fcol);
+
+
+

DESCRIPTION

+       The  function  set_form_fields  changes  the field pointer array of the
+       given form.  The array must be terminated by a NULL.
+
+       The function form_fields returns the field array of the given form.
+
+       The function field_count returns the count of fields in form.
+
+       The  function  move_field  moves  the  given  field  (which   must   be
+       disconnected) to a specified location on the screen.
+
+
+

RETURN VALUE

+       The  function  form_fields  returns  a pointer (which may be NULL).  It
+       does not set errno.
+
+       The function field_count returns ERR if the form parameter is NULL.
+
+       The  functions  set_form_fields  and  move_field  return  one  of   the
+       following codes on error:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_CONNECTED
+            The field is already connected to a form.
+
+       E_POSTED
+            The form is already posted.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The SVr4 forms library documentation specifies  the  field_count  error
+       value as -1 (which is the value of ERR).
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                    form_field(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_attributes.3x.html b/contrib/ncurses/doc/html/man/form_field_attributes.3x.html new file mode 100644 index 00000000..22afdc67 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_attributes.3x.html @@ -0,0 +1,125 @@ + + + + + + +form_field_attributes 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_attributes 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_attributes(3x)        Library calls       form_field_attributes(3x)
+
+
+
+
+

NAME

+       form_field_attributes - color and attribute control for form fields
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_field_fore(FIELD *field, chtype attr);
+       chtype field_fore(const FIELD *field);
+
+       int set_field_back(FIELD *field, chtype attr);
+       chtype field_back(const FIELD *field);
+
+       int set_field_pad(FIELD *field, int pad);
+       int field_pad(const FIELD *field);
+
+
+

DESCRIPTION

+       The  function  set_field_fore  sets  the foreground attribute of field.
+       This is the highlight used to display the field contents.  The function
+       field_fore   returns   the   foreground   attribute.   The  default  is
+       A_STANDOUT.
+
+       The function set_field_back sets the background attribute of form. This
+       is  the  highlight  used to display the extent fields in the form.  The
+       function field_back returns the background attribute.  The  default  is
+       A_NORMAL.
+
+       The  function  set_field_pad sets the character used to fill the field.
+       The function field_pad returns the given  form's  pad  character.   The
+       default is a blank.
+
+
+

RETURN VALUE

+       These routines return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-03-16         form_field_attributes(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_buffer.3x.html b/contrib/ncurses/doc/html/man/form_field_buffer.3x.html new file mode 100644 index 00000000..47d6c8b3 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_buffer.3x.html @@ -0,0 +1,170 @@ + + + + + + +form_field_buffer 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_buffer 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_buffer(3x)            Library calls           form_field_buffer(3x)
+
+
+
+
+

NAME

+       form_field_buffer - field buffer control
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_field_buffer(FIELD *field, int buf, const char *value);
+       char *field_buffer(const FIELD *field, int buffer);
+
+       int set_field_status(FIELD *field, bool status);
+       bool field_status(const FIELD *field);
+
+       int set_max_field(FIELD *field, int max);
+
+
+

DESCRIPTION

+       The  function  set_field_buffer  sets  the numbered buffer of the given
+       field to contain a given string:
+
+          o   Buffer 0 is the displayed value of the field.
+
+          o   Other numbered buffers may be allocated by applications  through
+              the  nbuf  argument  of  (see  form_field_new(3x))  but  are not
+              manipulated by the forms library.
+
+       The function field_buffer returns a pointer  to  the  contents  of  the
+       given numbered buffer:
+
+          o   The  buffer contents always have the same length, and are padded
+              with trailing spaces as needed to  ensure  this  length  is  the
+              same.
+
+          o   The  buffer  may contain leading spaces, depending on how it was
+              set.
+
+          o   The buffer contents are set with set_field_buffer, or as a  side
+              effect of any editing operations on the corresponding field.
+
+          o   Editing  operations  are  based on the window which displays the
+              field, rather than a string.  The window contains only printable
+              characters,  and  is  filled  with  blanks.  If you want the raw
+              data, you must write your own routine that copies the value  out
+              of the buffer and removes the leading and trailing spaces.
+
+          o   Because  editing  operations change the content of the buffer to
+              correspond to the window, you should not rely on  using  buffers
+              for long-term storage of form data.
+
+       The function set_field_status sets the associated status flag of field;
+       field_status gets the current value.  The  status  flag  is  set  to  a
+       nonzero value whenever the field changes.
+
+       The  function  set_max_field sets the maximum size for a dynamic field.
+       An argument of 0 turns off any maximum size threshold for that field.
+
+
+

RETURN VALUE

+       The field_buffer  function  returns  NULL  on  error.   It  sets  errno
+       according to their success:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       The field_status function returns TRUE or FALSE.
+
+       The remaining routines return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+
+

NOTES

+       When  configured for wide characters, field_buffer returns a pointer to
+       temporary  storage  (allocated  and  freed  by   the   library).    The
+       application should not attempt to modify the data.  It will be freed on
+       the next call to field_buffer to return the same buffer.
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The   set_max_field   function   checks   for   an   ncurses  extension
+       O_INPUT_FIELD which allows a dynamic field to shrink if the  new  limit
+       is smaller than the current field size.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x) and related pages whose names  begin  "form_"  for  detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-03-16             form_field_buffer(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_info.3x.html b/contrib/ncurses/doc/html/man/form_field_info.3x.html new file mode 100644 index 00000000..2090ab66 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_info.3x.html @@ -0,0 +1,123 @@ + + + + + + +form_field_info 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_info 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_info(3x)              Library calls             form_field_info(3x)
+
+
+
+
+

NAME

+       dynamic_field_info, field_info - retrieve field characteristics
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int field_info(const FIELD *field,
+                      int *rows, int *cols,
+                      int *frow, int *fcol,
+                      int *nrow, int *nbuf);
+
+       int dynamic_field_info(const FIELD *field,
+                              int *rows, int *cols, int *max);
+
+
+

DESCRIPTION

+       The  function  field_info returns the sizes and other attributes passed
+       in to the field at its creation  time.   The  attributes  are:  height,
+       width,  row  of  upper-left corner, column of upper-left corner, number
+       off-screen rows, and number of working buffers.
+
+       The function dynamic_field_info returns the actual size of  the  field,
+       and  its  maximum  possible  size.  If the field has no size limit, the
+       location addressed by the third argument will be set to 0.  A field can
+       be made dynamic by turning off the O_STATIC option with field_opts_off.
+
+
+

RETURN VALUE

+       These routines return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       A null (zero pointer) is accepted for any  of  the  return  values,  to
+       ignore  that  value.  Not all implementations allow this, e.g., Solaris
+       2.7 does not.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-03-16               form_field_info(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_just.3x.html b/contrib/ncurses/doc/html/man/form_field_just.3x.html new file mode 100644 index 00000000..f0bc457f --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_just.3x.html @@ -0,0 +1,112 @@ + + + + + + +form_field_just 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_just 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_just(3x)              Library calls             form_field_just(3x)
+
+
+
+
+

NAME

+       set_field_just, field_just - retrieve field characteristics
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_field_just(FIELD *field, int justification);
+       int field_just(const FIELD *field);
+
+
+

DESCRIPTION

+       The  function  set_field_just  sets  the  justification  attribute of a
+       field; field_just  returns  a  field's  justification  attribute.   The
+       attribute  may be one of NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT,
+       or JUSTIFY_CENTER.
+
+
+

RETURN VALUE

+       The   function   field_just   returns   one    of:    NO_JUSTIFICATION,
+       JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER.
+
+       The function set_field_just returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-03-16               form_field_just(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_new.3x.html b/contrib/ncurses/doc/html/man/form_field_new.3x.html new file mode 100644 index 00000000..c7bedd9a --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_new.3x.html @@ -0,0 +1,139 @@ + + + + + + +form_field_new 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_new 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_new(3x)               Library calls              form_field_new(3x)
+
+
+
+
+

NAME

+       new_field,  dup_field, link_field, free_field - create and destroy form
+       fields
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       FIELD *new_field(int height, int width,
+                        int toprow, int leftcol,
+                        int offscreen, int nbuffers);
+       FIELD *dup_field(FIELD *field, int toprow, int leftcol);
+       FIELD *link_field(FIELD *field, int toprow, int leftcol);
+       int free_field(FIELD *field);
+
+
+

DESCRIPTION

+       The function new_field allocates a new field and  initializes  it  from
+       the  parameters  given: height, width, row of upper-left corner, column
+       of upper-left corner, number off-screen rows, and number of  additional
+       working buffers.
+
+       The  function  dup_field  duplicates  a  field at a new location.  Most
+       attributes (including current contents, size, validation  type,  buffer
+       count,  growth  threshold,  justification,  foreground, background, pad
+       character, options, and user pointer) are copied.  Field status and the
+       field page bit are not copied.
+
+       The  function  link_field acts like dup_field, but the new field shares
+       buffers with its parent.  Attribute data is separate.
+
+       The function free_field de-allocates storage associated with a field.
+
+
+

RETURN VALUE

+       The functions new_field, dup_field, link_field return  NULL  on  error.
+       They set errno according to their success:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_SYSTEM_ERROR
+            System error occurred, e.g., malloc failure.
+
+       The function free_field returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_CONNECTED
+            field is connected.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       It may be unwise to count on the set of attributes copied by  dup_field
+       being  portable;  the  System  V  forms  library documents are not very
+       explicit about what gets copied and what does not.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                form_field_new(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_opts.3x.html b/contrib/ncurses/doc/html/man/form_field_opts.3x.html new file mode 100644 index 00000000..52fca0a5 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_opts.3x.html @@ -0,0 +1,181 @@ + + + + + + +form_field_opts 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_opts 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_opts(3x)              Library calls             form_field_opts(3x)
+
+
+
+
+

NAME

+       set_field_opts, field_opts_on, field_opts_off, field_opts - set and get
+       field options
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_field_opts(FIELD *field, Field_Options opts);
+       Field_Options field_opts(const FIELD *field);
+
+       int field_opts_on(FIELD *field, Field_Options opts);
+       int field_opts_off(FIELD *field, Field_Options opts);
+
+
+

DESCRIPTION

+       The function set_field_opts sets all  the  given  field's  option  bits
+       (field option bits may be logically-OR'ed together).
+
+       The  function  field_opts_on turns on the given option bits, and leaves
+       others alone.
+
+       The function field_opts_off turns off the given option bits, and leaves
+       others alone.
+
+       The function field_opts returns the field's current option bits.
+
+       The following standard options are defined (all are on by default):
+
+       O_ACTIVE
+            The  field  is  visited during processing.  If this option is off,
+            the field will not be reachable by navigation keys.  Please notice
+            that an invisible field appears to be inactive also.
+
+       O_AUTOSKIP
+            Skip to the next field when this one fills.
+
+       O_BLANK
+            The  field is cleared whenever a character is entered at the first
+            position.
+
+       O_EDIT
+            The field can be edited.
+
+       O_NULLOK
+            Allow a blank field.
+
+       O_PASSOK
+            Validate field only if modified by user.
+
+       O_PUBLIC
+            The field contents are displayed as data is entered.
+
+       O_STATIC
+            Field buffers are fixed  to  field's  original  size.   Turn  this
+            option off to create a dynamic field.
+
+       O_VISIBLE
+            The  field  is  displayed.   If this option is off, display of the
+            field is suppressed.
+
+       O_WRAP
+            Words that do not fit on a line are  wrapped  to  the  next  line.
+            Words are blank-separated.
+
+       These extension options are defined (extensions are off by default):
+
+       O_DYNAMIC_JUSTIFY
+            Permit dynamic fields to be justified, like static fields.
+
+       O_NO_LEFT_STRIP
+            Preserve leading whitespace in the field buffer, which is normally
+            discarded.
+
+       O_EDGE_INSERT_STAY
+            When  inserting  into  a  field  up  to  the  boundary   position,
+            optionally   delay  the  scrolling,  so  that  the  last  inserted
+            character remains visible, but advance the cursor to  reflect  the
+            insertion.   This  allows the form library to display the inserted
+            character in one-character fields as well as allowing the  library
+            to maintain consistent state.
+
+       O_INPUT_FIELD
+            The set_max_field function checks for this extension, which allows
+            a dynamic field to shrink if the new limit  is  smaller  than  the
+            current field size.
+
+
+

RETURN VALUE

+       Except for field_opts, each routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_CURRENT
+            The field is the current field.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x), form_field_just(3x)
+
+
+
+ncurses 6.5                       2024-03-16               form_field_opts(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_userptr.3x.html b/contrib/ncurses/doc/html/man/form_field_userptr.3x.html new file mode 100644 index 00000000..128698ed --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_userptr.3x.html @@ -0,0 +1,106 @@ + + + + + + +form_field_userptr 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_userptr 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_userptr(3x)           Library calls          form_field_userptr(3x)
+
+
+
+
+

NAME

+       set_field_userptr,  field_userptr  -  associate application data with a
+       form field
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_field_userptr(FIELD *field, void *userptr);
+       void *field_userptr(const FIELD *field);
+
+
+

DESCRIPTION

+       Every form field has a field that can  be  used  to  hold  application-
+       specific  data  (that is, the form-driver code leaves it alone).  These
+       functions get and set that field.
+
+
+

RETURN VALUE

+       The function field_userptr returns a pointer (which may be  NULL).   It
+       does not set errno.
+
+       The function set_field_userptr returns E_OK (success).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16            form_field_userptr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_field_validation.3x.html b/contrib/ncurses/doc/html/man/form_field_validation.3x.html new file mode 100644 index 00000000..e66d71c2 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_field_validation.3x.html @@ -0,0 +1,255 @@ + + + + + + +form_field_validation 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_field_validation 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_field_validation(3x)        Library calls       form_field_validation(3x)
+
+
+
+
+

NAME

+       form_field_validation - data type validation for fields
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       void *field_arg(const FIELD *field);
+       FIELDTYPE *field_type(const FIELD *field);
+       int set_field_type(FIELD *field, FIELDTYPE *type, ...);
+
+       /* predefined field types */
+       FIELDTYPE *TYPE_ALNUM;
+       FIELDTYPE *TYPE_ALPHA;
+       FIELDTYPE *TYPE_ENUM;
+       FIELDTYPE *TYPE_INTEGER;
+       FIELDTYPE *TYPE_NUMERIC;
+       FIELDTYPE *TYPE_REGEXP;
+       FIELDTYPE *TYPE_IPV4;
+
+
+

DESCRIPTION

+       By  default, no validation is done on form fields.  You can associate a
+       form with with a field type, making the form library validate input.
+
+
+

field_arg

+       Returns a pointer to the field's argument block.  The argument block is
+       an  opaque  structure  containing a copy of the arguments provided in a
+       set_field_type call.
+
+
+

field_type

+       Returns a pointer to the field type associated  with  the  form  field,
+       i.e., by calling set_field_type.
+
+
+

set_field_type

+       The  function  set_field_type associates a field type with a given form
+       field.  This is the type checked by validation functions.   Most  field
+       types  are  configurable,  via arguments which the caller provides when
+       calling set_field_type.
+
+       Several field types are predefined by the form library.
+
+
+

PREDEFINED TYPES

+       It is possible to set up new  programmer-defined  field  types.   Field
+       types  are implemented via the FIELDTYPE data structure, which contains
+       several pointers to functions.
+
+       See the form_fieldtype(3x) manual page, which describes functions which
+       can be used to construct a field-type dynamically.
+
+       The predefined types are as follows:
+
+
+

TYPE_ALNUM

+       Alphanumeric data.  Required parameter:
+
+       o   a third int argument, a minimum field width.
+
+
+

TYPE_ALPHA

+       Character data.  Required parameter:
+
+       o   a third int argument, a minimum field width.
+
+
+

TYPE_ENUM

+       Accept one of a specified set of strings.  Required parameters:
+
+       o   a third (char **) argument pointing to a string list;
+
+       o   a fourth int flag argument to enable case-sensitivity;
+
+       o   a  fifth  int flag argument specifying whether a partial match must
+           be a unique one.  If this flag is off, a prefix matches  the  first
+           of any set of more than one list elements with that prefix.
+
+       The library copies the string list, so you may use a list that lives in
+       automatic variables on the stack.
+
+
+

TYPE_INTEGER

+       Integer data, parsable to an integer by atoi(3).  Required parameters:
+
+       o   a third int argument controlling the precision,
+
+       o   a fourth long argument constraining minimum value,
+
+       o   a fifth long constraining maximum value.  If the maximum  value  is
+           less  than  or  equal  to  the  minimum  value, the range is simply
+           ignored.
+
+       On return, the field buffer is formatted according to the printf format
+       specification  ".*ld",  where  the  "*"  is  replaced  by the precision
+       argument.
+
+       For details of the precision handling see printf(3).
+
+
+

TYPE_NUMERIC

+       Numeric data (may have a decimal-point part).  Required parameters:
+
+       o   a third int argument controlling the precision,
+
+       o   a fourth double argument constraining minimum value,
+
+       o   and a fifth double constraining  maximum  value.   If  your  system
+           supports  locales,  the  decimal  point  character  must be the one
+           specified by your locale.  If the maximum value  is  less  than  or
+           equal to the minimum value, the range is simply ignored.
+
+       On return, the field buffer is formatted according to the printf format
+       specification ".*f",  where  the  "*"  is  replaced  by  the  precision
+       argument.
+
+       For details of the precision handling see printf(3).
+
+
+

TYPE_REGEXP

+       Regular expression data.  Required parameter:
+
+       o   a  third  argument, a regular expression (char *) string.  The data
+           is valid if the regular expression matches it.
+
+       Regular expressions are in the format of regcomp and regexec.
+
+       The regular expression must match the whole field.   If  you  have  for
+       example, an eight character wide field, a regular expression "^[0-9]*$"
+       always means that you have to fill all eight positions with digits.  If
+       you  want  to  allow fewer digits, you may use for example "^[0-9]* *$"
+       which is good for trailing spaces (up to an empty field), or "^ *[0-9]*
+       *$" which is good for leading and trailing spaces around the digits.
+
+
+

TYPE_IPV4

+       An Internet Protocol Version 4 address.  Required parameter:
+
+       o   none
+
+       The form library checks whether or not the buffer has the form a.b.c.d,
+       where a, b, c, and d are numbers in  the  range  0  to  255.   Trailing
+       blanks in the buffer are ignored.  The address itself is not validated.
+
+       This  is  an ncurses extension; this field type may not be available in
+       other curses implementations.
+
+
+

RETURN VALUE

+       The functions field_type and  field_arg  return  NULL  on  error.   The
+       function set_field_type returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x), form_fieldtype(3x), form_variables(3x)
+
+
+
+ncurses 6.5                       2024-03-16         form_field_validation(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_fieldtype.3x.html b/contrib/ncurses/doc/html/man/form_fieldtype.3x.html new file mode 100644 index 00000000..369f25c5 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_fieldtype.3x.html @@ -0,0 +1,208 @@ + + + + + + +form_fieldtype 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_fieldtype 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_fieldtype(3x)               Library calls              form_fieldtype(3x)
+
+
+
+
+

NAME

+       form_fieldtype - define validation-field types
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       FIELDTYPE *new_fieldtype(
+           bool (* const field_check)(FIELD *, const void *),
+           bool (* const char_check)(int, const void *));
+       int free_fieldtype(FIELDTYPE *fieldtype);
+
+       int set_fieldtype_arg(
+           FIELDTYPE *fieldtype,
+           void *(* const make_arg)(va_list *),
+           void *(* const copy_arg)(const void *),
+           void  (* const free_arg)(void *));
+       int set_fieldtype_choice(
+           FIELDTYPE *fieldtype,
+           bool (* const next_choice)(FIELD *, const void *),
+           bool (* const prev_choice)(FIELD *, const void *));
+
+       FIELDTYPE *link_fieldtype(FIELDTYPE *type1,
+                                 FIELDTYPE *type2);
+
+
+

DESCRIPTION

+
+

new_fieldtype

+       The  function  new_fieldtype  creates  a new field type usable for data
+       validation.  Its parameters are function pointers:
+
+       field_check
+            This function checks  the  validity  of  an  entered  data  string
+            whenever  the  user  attempts  to  leave  a  field.   It  has  two
+            arguments:
+
+            o   The  (FIELD  *)  argument  is  passed  in  so  the  validation
+                predicate   can  see  the  field's  buffer,  sizes  and  other
+                attributes.
+
+            o   The second argument  is  an  argument-block  structure,  about
+                which more below.
+
+       char_check
+            This function validates input characters as they are entered.  The
+            form library passes it the character to be checked and  a  pointer
+            to an argument-block structure.
+
+
+

free_fieldtype

+       The  free_fieldtype  function  frees  the  space  allocated for a given
+       validation type by new_fieldtype.
+
+
+

set_fieldtype_arg

+       The  function  set_fieldtype_arg  associates  three  storage-management
+       functions with a field type:
+
+       make_arg
+            This  function  is  automatically applied to the list of arguments
+            you give set_field_type when attaching validation to a field.   It
+            stores  the  arguments in an allocated argument-block object which
+            is used when validating input.
+
+       copy_arg
+            This function may be used by applications to copy argument-blocks.
+
+       free_arg
+            Frees an argument-block structure.
+
+       You must supply the make_arg function.  The other two are optional: you
+       may  supply NULL for them.  In this case, the form library assumes that
+       make_arg does not allocate memory but simply loads the argument into  a
+       single scalar value.
+
+
+

set_fieldtype_choice

+       The  form  driver  requests  REQ_NEXT_CHOICE and REQ_PREV_CHOICE assume
+       that the possible values of a field form an ordered  set,  and  provide
+       the forms user with a way to move through the set.
+
+       The  set_fieldtype_choice  function  allows forms programmers to define
+       successor  and  predecessor  functions  for  the  field  type.    These
+       functions  take  the  field  pointer and an argument-block structure as
+       arguments.
+
+
+

link_fieldtype

+       The function link_fieldtype creates a new field type from the two given
+       types.  They are connected by an logical 'OR'.
+
+
+

RETURN VALUE

+       The  pointer-valued  routines  return  NULL  on  error.  They set errno
+       according to their success:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_SYSTEM_ERROR
+            System error occurred, e.g., malloc failure.
+
+       The integer-valued routines return one of the following codes on error:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_CONNECTED
+            The field is already connected to a form.
+
+       E_CURRENT
+            The field is the current field.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x), form_field_validation(3x)
+
+
+
+ncurses 6.5                       2024-03-16                form_fieldtype(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_hook.3x.html b/contrib/ncurses/doc/html/man/form_hook.3x.html new file mode 100644 index 00000000..4845771f --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_hook.3x.html @@ -0,0 +1,165 @@ + + + + + + +form_hook 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_hook 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_hook(3x)                    Library calls                   form_hook(3x)
+
+
+
+
+

NAME

+       form_hook - set hooks for automatic invocation by applications
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_field_init(FORM *form, Form_Hook func);
+       Form_Hook field_init(const FORM *form);
+
+       int set_field_term(FORM *form, Form_Hook func);
+       Form_Hook field_term(const FORM *form);
+
+       int set_form_init(FORM *form, Form_Hook func);
+       Form_Hook form_init(const FORM *form);
+
+       int set_form_term(FORM *form, Form_Hook func);
+       Form_Hook form_term(const FORM *form);
+
+
+

DESCRIPTION

+       These  functions make it possible to set hook functions to be called at
+       various points in the automatic processing  of  input  event  codes  by
+       form_driver.
+
+
+

set_field_init

+       sets  a  hook to be called at form-post time and each time the selected
+       field changes (after the change).
+
+
+

field_init

+       returns the current field init hook, if any (NULL if there is  no  such
+       hook).
+
+
+

set_field_term

+       sets a hook to be called at form-unpost time and each time the selected
+       field changes (before the change).
+
+
+

field_term

+       returns the current field term hook, if any (NULL if there is  no  such
+       hook).
+
+
+

set_form_init

+       sets a hook to be called at form-post time and just after a page change
+       once it is posted.
+
+
+

form_init

+       returns the current form init hook, if any (NULL if there  is  no  such
+       hook).
+
+
+

set_form_term

+       sets  a  hook  to  be called at form-unpost time and just before a page
+       change once it is posted.
+
+
+

form_term

+       returns the current form term hook, if any (NULL if there  is  no  such
+       hook).
+
+
+

RETURN VALUE

+       Routines  that  return  pointers  return NULL on error.  Other routines
+       return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     form_hook(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_new.3x.html b/contrib/ncurses/doc/html/man/form_new.3x.html new file mode 100644 index 00000000..7a1877ca --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_new.3x.html @@ -0,0 +1,123 @@ + + + + + + +form_new 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_new 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_new(3x)                     Library calls                    form_new(3x)
+
+
+
+
+

NAME

+       new_form, free_form - create and destroy forms
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       FORM *new_form(FIELD **fields);
+       int free_form(FORM *form);
+
+
+

DESCRIPTION

+       The function new_form creates a new form connected to a specified field
+       pointer array (which must be NULL-terminated).
+
+       The function free_form disconnects form from its field array and  frees
+       the storage allocated for the form.
+
+
+

RETURN VALUE

+       The  function  new_form returns NULL on error.  It sets errno according
+       to the function's success:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_CONNECTED
+            The field is already connected to a form.
+
+       E_SYSTEM_ERROR
+            System error occurred, e.g., malloc failure.
+
+       The function free_form returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_POSTED
+            The form has already been posted.
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                      form_new(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_new_page.3x.html b/contrib/ncurses/doc/html/man/form_new_page.3x.html new file mode 100644 index 00000000..e8a18df4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_new_page.3x.html @@ -0,0 +1,109 @@ + + + + + + +form_new_page 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_new_page 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_new_page(3x)                Library calls               form_new_page(3x)
+
+
+
+
+

NAME

+       set_new_page, new_page - form pagination functions
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_new_page(FIELD *field, bool new_page_flag);
+       bool new_page(const FIELD *field);
+
+
+

DESCRIPTION

+       The function set_new_page sets or resets a flag marking the given field
+       as the beginning of a new page on its form.
+
+       The function new_page is a predicate which tests if a given field marks
+       a page beginning on its form.
+
+
+

RETURN VALUE

+       The function new_page returns TRUE or FALSE.
+
+       The function set_new_page returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_CONNECTED
+            The given field is already connected to a form.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "form_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-03-16                 form_new_page(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_opts.3x.html b/contrib/ncurses/doc/html/man/form_opts.3x.html new file mode 100644 index 00000000..63a9437f --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_opts.3x.html @@ -0,0 +1,125 @@ + + + + + + +form_opts 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_opts 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_opts(3x)                    Library calls                   form_opts(3x)
+
+
+
+
+

NAME

+       set_form_opts,  form_opts_on,  form_opts_off,  form_opts  - set and get
+       form options
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_form_opts(FORM *form, Field_Options opts);
+       Field_Options form_opts(const FORM *form);
+
+       int form_opts_on(FORM *form, Field_Options opts);
+       int form_opts_off(FORM *form, Field_Options opts);
+
+
+

DESCRIPTION

+       The function set_form_opts sets all the given form's option bits  (form
+       option bits may be logically-OR'ed together).
+
+       The  function  form_opts_on  turns on the given option bits, and leaves
+       others alone.
+
+       The function form_opts_off turns off the given option bits, and  leaves
+       others alone.
+
+       The function form_opts returns the form's current option bits.
+
+       The following options are defined (all are on by default):
+
+       O_NL_OVERLOAD
+            Overload  the REQ_NEW_LINE forms driver request so that calling it
+            at the end of a field goes to the next field.
+
+       O_BS_OVERLOAD
+            Overload the REQ_DEL_PREV forms driver request so that calling  it
+            at the beginning of a field goes to the previous field.
+
+
+

RETURN VALUE

+       Except for form_opts, each routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     form_opts(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_page.3x.html b/contrib/ncurses/doc/html/man/form_page.3x.html new file mode 100644 index 00000000..b882db2b --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_page.3x.html @@ -0,0 +1,137 @@ + + + + + + +form_page 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_page 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_page(3x)                    Library calls                   form_page(3x)
+
+
+
+
+

NAME

+       form_page - set and get form page number
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_current_field(FORM *form, FIELD *field);
+       FIELD *current_field(const FORM *form);
+
+       int unfocus_current_field(FORM *form);
+
+       int set_form_page(FORM *form, int n);
+       int form_page(const FORM *form);
+
+       int field_index(const FIELD *field);
+
+
+

DESCRIPTION

+       The  function  set_current_field  sets  the  current field of the given
+       form; current_field returns the current field of the given form.
+
+       The function unfocus_current_field removes the focus from  the  current
+       field  of  the  form.  In such state, inquiries via current_field shall
+       return a NULL pointer.
+
+       The function set_form_page sets the form's page number (goes to page  n
+       of the form).
+
+       The function form_page returns the form's current page number.
+
+       The  function  field_index  returns the index of the field in the field
+       array of the form it is connected to.  It returns ERR if  the  argument
+       is the null pointer or the field is not connected.
+
+
+

RETURN VALUE

+       Except for form_page, each routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_INVALID_FIELD
+            Contents of a field are not valid.
+
+       E_REQUEST_DENIED
+            The form driver could not process the request.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The unfocus_current_field function is an ncurses extension.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     form_page(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_post.3x.html b/contrib/ncurses/doc/html/man/form_post.3x.html new file mode 100644 index 00000000..9f97d3e5 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_post.3x.html @@ -0,0 +1,126 @@ + + + + + + +form_post 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_post 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_post(3x)                    Library calls                   form_post(3x)
+
+
+
+
+

NAME

+       post_form,   unpost_form   -  write  or  erase  forms  from  associated
+       subwindows
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int post_form(FORM *form);
+       int unpost_form(FORM *form);
+
+
+

DESCRIPTION

+       The function post_form displays a form to its associated subwindow.  To
+       trigger  physical  display  of  the  subwindow, use refresh(3x) or some
+       equivalent curses routine (the implicit doupdate triggered by an curses
+       input request will do).
+
+       The function unpost_form erases form from its associated subwindow.
+
+
+

RETURN VALUE

+       These routines return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NOT_POSTED
+            The form has not been posted.
+
+       E_NOT_CONNECTED
+            No items are connected to the form.
+
+       E_NO_ROOM
+            Form is too large for its window.
+
+       E_POSTED
+            The form has already been posted.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     form_post(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_requestname.3x.html b/contrib/ncurses/doc/html/man/form_requestname.3x.html new file mode 100644 index 00000000..ecb5992d --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_requestname.3x.html @@ -0,0 +1,106 @@ + + + + + + +form_requestname 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_requestname 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_requestname(3x)             Library calls            form_requestname(3x)
+
+
+
+
+

NAME

+       form_request_by_name, form_request_name - handle printable form request
+       names
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       const char *form_request_name(int request);
+       int form_request_by_name(const char *name);
+
+
+

DESCRIPTION

+       The function form_request_name returns the printable  name  of  a  form
+       request  code.  The function form_request_by_name searches in the name-
+       table for a request with the given name and returns its  request  code.
+       Otherwise E_NO_MATCH is returned.
+
+
+

RETURN VALUE

+       form_request_name   returns   NULL   on   error   and   sets  errno  to
+       E_BAD_ARGUMENT.
+
+       form_request_by_name returns E_NO_MATCH on  error.   It  does  not  set
+       errno.
+
+
+

PORTABILITY

+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16              form_requestname(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_userptr.3x.html b/contrib/ncurses/doc/html/man/form_userptr.3x.html new file mode 100644 index 00000000..db79de20 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_userptr.3x.html @@ -0,0 +1,106 @@ + + + + + + +form_userptr 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_userptr 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_userptr(3x)                 Library calls                form_userptr(3x)
+
+
+
+
+

NAME

+       set_form_userptr, form_userptr - associate application data with a form
+       item
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_form_userptr(FORM *form, void *userptr);
+       void* form_userptr(const FORM *form);
+
+
+

DESCRIPTION

+       Every form and every form item has a field that can  be  used  to  hold
+       application-specific  data  (that  is,  the  form-driver code leaves it
+       alone).  These functions get and set the form user pointer field.
+
+
+

RETURN VALUE

+       The function form_userptr returns a pointer (which may  be  NULL).   It
+       does not set errno.
+
+       The function set_form_userptr returns E_OK (success).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  forms library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                  form_userptr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_variables.3x.html b/contrib/ncurses/doc/html/man/form_variables.3x.html new file mode 100644 index 00000000..68c8e563 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_variables.3x.html @@ -0,0 +1,133 @@ + + + + + + +form_variables 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_variables 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_variables(3x)               Library calls              form_variables(3x)
+
+
+
+
+

NAME

+       TYPE_ALNUM,    TYPE_ALPHA,    TYPE_ENUM,    TYPE_INTEGER,    TYPE_IPV4,
+       TYPE_NUMERIC, TYPE_REGEXP - form system global variables
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       FIELDTYPE * TYPE_ALNUM;
+       FIELDTYPE * TYPE_ALPHA;
+       FIELDTYPE * TYPE_ENUM;
+       FIELDTYPE * TYPE_INTEGER;
+       FIELDTYPE * TYPE_IPV4;
+       FIELDTYPE * TYPE_NUMERIC;
+       FIELDTYPE * TYPE_REGEXP;
+
+
+

DESCRIPTION

+       These are building blocks for the form library,  defining  fields  that
+       can  be  created using the form_fieldtype(3x) functions.  Each provides
+       functions for field- and character-validation, according to  the  given
+       datatype.
+
+
+

TYPE_ALNUM

+       This holds alphanumeric data.
+
+
+

TYPE_ALPHA

+       This holds alphabetic data.
+
+
+

TYPE_ENUM

+       This holds an enumerated type.
+
+
+

TYPE_INTEGER

+       This holds a decimal integer.
+
+
+

TYPE_IPV4

+       This holds an IPv4 internet address, e.g., "127.0.0.1".
+
+
+

TYPE_NUMERIC

+       This holds a decimal number, with optional sign and decimal point.
+
+
+

TYPE_REGEXP

+       This holds a regular expression.
+
+
+

PORTABILITY

+       The   TYPE_IPV4   variable  is  an  extension  not  provided  by  older
+       implementations of the form library.
+
+
+

SEE ALSO

+       form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                form_variables(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/form_win.3x.html b/contrib/ncurses/doc/html/man/form_win.3x.html new file mode 100644 index 00000000..976ef271 --- /dev/null +++ b/contrib/ncurses/doc/html/man/form_win.3x.html @@ -0,0 +1,131 @@ + + + + + + +form_win 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

form_win 3x 2024-03-16 ncurses 6.5 Library calls

+
+form_win(3x)                     Library calls                    form_win(3x)
+
+
+
+
+

NAME

+       form_win - make and break form window and subwindow associations
+
+
+

SYNOPSIS

+       #include <form.h>
+
+       int set_form_win(FORM *form, WINDOW *win);
+       WINDOW *form_win(const FORM *form);
+
+       int set_form_sub(FORM *form, WINDOW *sub);
+       WINDOW *form_sub(const FORM *form);
+
+       int scale_form(const FORM *form, int *rows, int *columns);
+
+
+

DESCRIPTION

+       Every  form  has an associated pair of curses windows.  The form window
+       displays any title and border associated  with  the  window;  the  form
+       subwindow  displays  the items of the form that are currently available
+       for selection.
+
+       The first four  functions  get  and  set  those  windows.   It  is  not
+       necessary to set either window; by default, the driver code uses stdscr
+       for both.
+
+       In the set_ functions, window argument of NULL is treated as though  it
+       were stsdcr.  A form argument of NULL is treated as a request to change
+       the system default form window or subwindow.
+
+       The function scale_form returns  the  minimum  size  required  for  the
+       subwindow of form.
+
+
+

RETURN VALUE

+       Routines  that  return  pointers  return  NULL on error.  Routines that
+       return an integer return one of the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_POSTED
+            The form has already been posted.
+
+       E_NOT_CONNECTED
+            No items are connected to the form.
+
+
+

PORTABILITY

+       These routines emulate the System  V  forms  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), curs_variables(3x), form(3x)
+
+
+
+ncurses 6.5                       2024-03-16                      form_win(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/index.html b/contrib/ncurses/doc/html/man/index.html new file mode 100644 index 00000000..e50cd2f9 --- /dev/null +++ b/contrib/ncurses/doc/html/man/index.html @@ -0,0 +1,127 @@ + + + + + + NCURSES – Manual Pages + + + + + + + diff --git a/contrib/ncurses/doc/html/man/infocmp.1m.html b/contrib/ncurses/doc/html/man/infocmp.1m.html new file mode 100644 index 00000000..5877cf6a --- /dev/null +++ b/contrib/ncurses/doc/html/man/infocmp.1m.html @@ -0,0 +1,557 @@ + + + + + + +infocmp 1m 2024-09-21 ncurses 6.5 User commands + + + + +

infocmp 1m 2024-09-21 ncurses 6.5 User commands

+
+infocmp(1m)                      User commands                     infocmp(1m)
+
+
+
+
+

NAME

+       infocmp - compare or print out terminfo descriptions
+
+
+

SYNOPSIS

+       infocmp   [-1cCdDeEFgGiIKlLnpqrtTuUVWx]  [-A directory]  [-B directory]
+              [-Q encoding]   [-R subset]   [-s key]   [-v level]   [-w width]
+              [terminal-type ... ]
+
+
+

DESCRIPTION

+       infocmp  can  be  used  to  compare  a binary terminfo entry with other
+       terminfo entries, rewrite a terminfo description to take  advantage  of
+       the  use=  terminfo field, or print out a terminfo description from the
+       binary file (term) in a variety of formats.  In all cases, the  Boolean
+       fields  will be printed first, followed by the numeric fields, followed
+       by the string fields.
+
+
+

Default Options

+       If no  options  are  specified  and  zero  or  one  terminal-types  are
+       specified,  the  -I option will be assumed.  If more than one terminal-
+       type is specified, the -d option will be assumed.
+
+
+

Comparison Options [-d] [-c] [-n]

+       infocmp  compares  the  terminfo  description  of  the  first  terminal
+       terminal-type  with  each  of the descriptions given by the entries for
+       the other terminal's terminal-types.  If a capability  is  defined  for
+       only  one  of  the terminals, the value returned depends on the type of
+       the capability:
+
+       o   F for missing Boolean variables
+
+       o   NULL for missing integer or string variables
+
+       Use the -q option to show the distinction between absent  and  canceled
+       capabilities.
+
+       These  options  produce a list which you can use to compare two or more
+       terminal descriptions:
+
+       -d   produces a list of each capability that is different  between  two
+            entries.   Each  item  in  the list shows ":" after the capability
+            name, followed by the capability values, separated by a comma.
+
+       -c   produces a list of each capability that is common between  two  or
+            more entries.  Missing capabilities are ignored.  Each item in the
+            list  shows  "="  after  the  capability  name,  followed  by  the
+            capability value.
+
+            The  -u  option  provides  a  related  output,  showing  the first
+            terminal description rewritten to use the  second  as  a  building
+            block via the "use=" clause.
+
+       -n   produces  a  list  of each capability that is in none of the given
+            entries.  Each item in the list shows "!"  before  the  capability
+            name.
+
+            Normally only the conventional capabilities are shown.  Use the -x
+            option to add the BSD-compatibility capabilities  (names  prefixed
+            with "OT").
+
+            If  no  terminal-types  are  given,  infocmp  uses the environment
+            variable TERM for each of the terminal-types.
+
+
+

Source Listing Options [-I] [-L] [-C] [-r]

+       The -I, -L, and -C options will  produce  a  source  listing  for  each
+       terminal named.
+
+                   -I   use terminfo capability codes
+                   -L   use "long" capability names
+                   -C   use termcap capability codes
+                   -r   with -C, include nonstandard capabilities
+                   -K   with -C, improve BSD compatibility
+
+       If  no  terminal-types are given, the environment variable TERM will be
+       used for the terminal name.
+
+       The source produced by the -C option may be used directly as a  termcap
+       entry,  but not all parameterized strings can be changed to the termcap
+       format.  infocmp will attempt to  convert  most  of  the  parameterized
+       information,  and  anything not converted will be plainly marked in the
+       output and commented out.  These should be edited by hand.
+
+       For best results when converting to termcap format, you should use both
+       -C  and  -r.   Normally a termcap description is limited to 1023 bytes.
+       infocmp trims away less essential parts to make it  fit.   If  you  are
+       converting to one of the (rare) termcap implementations which accept an
+       unlimited size of termcap, you may want to add  the  -T  option.   More
+       often  however,  you  must  help  the  termcap implementation, and trim
+       excess whitespace (use the -0 option for that).
+
+       All padding information for strings  will  be  collected  together  and
+       placed  at  the  beginning  of  the  string  where  termcap expects it.
+       Mandatory padding (padding information with a trailing "/") will become
+       optional.
+
+       All  termcap  variables  no longer supported by terminfo, but which are
+       derivable from other terminfo  variables,  will  be  output.   Not  all
+       terminfo  capabilities  will  be translated; only those variables which
+       were part of termcap will normally be output.  Specifying the -r option
+       will  take off this restriction, allowing all capabilities to be output
+       in termcap form.  Normally you would use both the -C  and  -r  options.
+       The  actual  format  used  incorporates  some  improvements for escaped
+       characters  from  terminfo  format.   For  a  stricter   BSD-compatible
+       translation, use the -K option rather than -C.
+
+       Note  that  because  padding  is  collected  to  the  beginning  of the
+       capability, not all capabilities are output.  Mandatory padding is  not
+       supported.   Because  termcap  strings  are  not as flexible, it is not
+       always possible  to  convert  a  terminfo  string  capability  into  an
+       equivalent termcap format.  A subsequent conversion of the termcap file
+       back into terminfo format will not necessarily reproduce  the  original
+       terminfo source.
+
+       Some  common  terminfo  parameter sequences, their termcap equivalents,
+       and some terminal types which commonly have such sequences, are:
+
+                 terminfo                   termcap   Terminal Types
+                 ----------------------------------------------------
+                 %p1%c                      %.        ansi-m
+                 %p1%d                      %d        ansi, vt100
+                 %p1%' '%+%c                %+x       vt52
+                 %i                         %iq       ansi, vt100
+                 %p1%?%'x'%>%t%p1%'y'%+%;   %>xy      annarbor4080
+                 %p2...%p1                  %r        hpgeneric
+
+
+

Use= Option [-u]

+       The -u option produces a  terminfo  source  description  of  the  first
+       terminal terminal-type which is relative to the sum of the descriptions
+       given by the entries for the other terminal-types.   It  does  this  by
+       analyzing  the  differences  between  the  first terminal-types and the
+       other terminal-types and producing a description with use=  fields  for
+       the  other  terminals.   In  this  manner,  it  is possible to retrofit
+       generic terminfo entries into a terminal's  description.   Or,  if  two
+       similar  terminals  exist,  but  were  coded  at  different times or by
+       different people so that each description is a full description,  using
+       infocmp  will  show  what  can  be done to change one description to be
+       relative to the other.
+
+       A capability will be printed with an at-sign (@) if it no longer exists
+       in  the first terminal-type, but one of the other terminal-type entries
+       contains a value for it.  A capability's value will be printed  if  the
+       value  in  the  first  terminal-type  is  not found in any of the other
+       terminal-type entries, or if  the  first  of  the  other  terminal-type
+       entries  that  has  this  capability  gives  a  different value for the
+       capability than that in the first terminal-type.
+
+       The order of the other terminal-type entries is significant.  Since the
+       terminfo  compiler  tic  does a left-to-right scan of the capabilities,
+       specifying two use= entries that contain differing entries for the same
+       capabilities will produce different results depending on the order that
+       the entries are given in.  infocmp will flag any  such  inconsistencies
+       between the other terminal-type entries as they are found.
+
+       Alternatively, specifying a capability after a use= entry that contains
+       that capability will cause the  second  specification  to  be  ignored.
+       Using  infocmp  to recreate a description can be a useful check to make
+       sure that everything was specified correctly  in  the  original  source
+       description.
+
+       Another  error  that  does not cause incorrect compiled files, but will
+       slow down the compilation time, is specifying extra  use=  fields  that
+       are superfluous.  infocmp will flag any other terminal-type use= fields
+       that were not needed.
+
+   Changing Databases [-A directory] [-B directory]
+       Like  other  ncurses  utilities,  infocmp  looks   for   the   terminal
+       descriptions   in  several  places.   You  can  use  the  TERMINFO  and
+       TERMINFO_DIRS environment variables to override the compiled-in default
+       list  of  places  to  search.   See curses(3x), as well as the Fetching
+       Compiled Descriptions section in terminfo(5).
+
+       You can also use the options -A and -B to override the list  of  places
+       to search when comparing terminal descriptions:
+
+       o   The -A option sets the location for the first terminal-type
+
+       o   The -B option sets the location for the other terminal-types.
+
+       Using  these  options,  it  is  possible  to compare descriptions for a
+       terminal with the same name located in two  different  databases.   For
+       instance,  you  can use this feature for comparing descriptions for the
+       same terminal created by different people.
+
+
+

Other Options

+       -0   causes the fields to be printed on one line, without wrapping.
+
+       -1   causes the fields to be printed out one to a line.  Otherwise, the
+            fields  will be printed several to a line to a maximum width of 60
+            characters.
+
+       -a   tells infocmp to retain  commented-out  capabilities  rather  than
+            discarding  them.   Capabilities  are  commented by prefixing them
+            with a period.
+
+       -D   tells infocmp to print the database locations that it knows about,
+            and exit.
+
+       -E   Dump  the  capabilities of the given terminal as tables, needed in
+            the  C  initializer  for  a  TERMTYPE  structure   (the   terminal
+            capability  structure in the <term.h>).  This option is useful for
+            preparing versions of the curses library  hardwired  for  a  given
+            terminal  type.  The tables are all declared static, and are named
+            according to the type and the name of the  corresponding  terminal
+            entry.
+
+            Before  ncurses  5.0,  the split between the -e and -E options was
+            not needed; but support for extended  names  required  making  the
+            arrays   of  terminal  capabilities  separate  from  the  TERMTYPE
+            structure.
+
+       -e   Dump the capabilities of the given terminal as a C initializer for
+            a  TERMTYPE  structure  (the  terminal capability structure in the
+            <term.h>).  This option is useful for preparing  versions  of  the
+            curses library hardwired for a given terminal type.
+
+       -F   compare terminfo files.  This assumes that two following arguments
+            are filenames.   The  files  are  searched  for  pairwise  matches
+            between  entries,  with  two entries considered to match if any of
+            their names do.  The  report  printed  to  standard  output  lists
+            entries  with  no matches in the other file, and entries with more
+            than one match.  For entries with exactly one match it includes  a
+            difference  report.  Normally, to reduce the volume of the report,
+            use references are not resolved before  looking  for  differences,
+            but resolution can be forced by also specifying -r.
+
+       -f   Display  complex terminfo strings which contain if/then/else/endif
+            expressions indented for readability.
+
+       -G   Display constant  literals  in  decimal  form  rather  than  their
+            character equivalents.
+
+       -g   Display  constant  character  literals  in quoted form rather than
+            their decimal equivalents.
+
+       -i   Analyze the initialization (is1, is2, is3), and reset  (rs1,  rs2,
+            rs3),   strings   in   the  entry,  as  well  as  those  used  for
+            starting/stopping cursor-positioning mode (smcup, rmcup)  as  well
+            as starting/stopping keymap mode (smkx, rmkx).
+
+            For  each  string,  the  code  tries to analyze it into actions in
+            terms of the other capabilities in the  entry,  certain  X3.64/ISO
+            6429/ECMA-48 capabilities, and certain DEC VT-series private modes
+            (the set of recognized special sequences  has  been  selected  for
+            completeness  over  the  existing terminfo database).  Each report
+            line consists of the capability name,  followed  by  a  colon  and
+            space,  followed by a printable expansion of the capability string
+            with  sections  matching  recognized   actions   translated   into
+            {}-bracketed descriptions.
+
+            Here is a list of the DEC/ANSI special sequences recognized:
+
+                      Action        Meaning
+                      -----------------------------------------
+                      RIS           full reset
+                      SC            save cursor
+                      RC            restore cursor
+                      LL            home-down
+                      RSR           reset scroll region
+                      -----------------------------------------
+                      DECSTR        soft reset (VT320)
+                      S7C1T         7-bit controls (VT220)
+                      -----------------------------------------
+
+                      ISO DEC G0    enable DEC graphics for G0
+                      ISO UK G0     enable UK chars for G0
+                      ISO US G0     enable US chars for G0
+                      ISO DEC G1    enable DEC graphics for G1
+                      ISO UK G1     enable UK chars for G1
+                      ISO US G1     enable US chars for G1
+                      -----------------------------------------
+                      DECPAM        application keypad mode
+                      DECPNM        normal keypad mode
+                      DECANSI       enter ANSI mode
+                      -----------------------------------------
+                      ECMA[+-]AM    keyboard action mode
+                      ECMA[+-]IRM   insert replace mode
+                      ECMA[+-]SRM   send receive mode
+                      ECMA[+-]LNM   linefeed mode
+                      -----------------------------------------
+                      DEC[+-]CKM    application cursor keys
+                      DEC[+-]ANM    set VT52 mode
+                      DEC[+-]COLM   132-column mode
+                      DEC[+-]SCLM   smooth scroll
+                      DEC[+-]SCNM   reverse video mode
+                      DEC[+-]OM     origin mode
+                      DEC[+-]AWM    wraparound mode
+                      DEC[+-]ARM    auto-repeat mode
+
+       It also recognizes a SGR action corresponding to ANSI/ISO 6429/ECMA Set
+       Graphics Rendition, with the values NORMAL, BOLD, UNDERLINE, BLINK, and
+       REVERSE.  All but NORMAL may be prefixed with
+
+              o   "+" (turn on) or
+
+              o   "-" (turn off).
+
+              An  SGR0  designates  an empty highlight sequence (equivalent to
+              {SGR:NORMAL}).
+
+       -l   Set output format to terminfo.
+
+       -p   Ignore padding specifications when comparing strings.
+
+       -Q n Rather than show source  in  terminfo  (text)  format,  print  the
+            compiled  (binary) format in hexadecimal or base64 form, depending
+            on the option's value:
+
+               1  hexadecimal
+
+               2  base64
+
+               3  hexadecimal and base64
+
+            For example, this prints the compiled terminfo value as  a  string
+            which could be assigned to the TERMINFO environment variable:
+
+                infocmp -0 -q -Q2
+
+       -q   This makes the output a little shorter:
+
+            o   Make  the  comparison listing shorter by omitting subheadings,
+                and using "-" for absent capabilities, "@" for canceled rather
+                than "NULL".
+
+            o   However,   show   differences   between  absent  and  canceled
+                capabilities.
+
+            o   Omit the "Reconstructed from" comment for source listings.
+
+       -Rsubset
+            Restrict output to a given subset.  This option is  for  use  with
+            archaic  versions of terminfo like those on SVr1, Ultrix, or HP-UX
+            that do not support the full set of SVR4/XSI Curses terminfo;  and
+            variants  such  as AIX that have their own extensions incompatible
+            with SVr4/XSI.
+
+            o   Available terminfo subsets are  "SVr1",  "Ultrix",  "HP",  and
+                "AIX"; see terminfo(5) for details.
+
+            o   You  can  also  choose  the  subset  "BSD"  which selects only
+                capabilities with termcap equivalents recognized by 4.4BSD.
+
+            o   If you select any other value for -R, it is  the  same  as  no
+                subset, i.e., all capabilities are used.
+
+            A  few  options  override the subset selected with -R, if they are
+            processed later in the command parameters:
+
+            -C   sets the "BSD" subset as a side-effect.
+
+            -I   sets the subset to all capabilities.
+
+            -r   sets the subset to all capabilities.
+
+       -s [d|i|l|c]
+            The -s option sorts the fields within each type according  to  the
+            argument below:
+
+            d    leave  fields  in  the  order  that  they  are  stored in the
+                 terminfo database.
+
+            i    sort by terminfo name.
+
+            l    sort by the long C variable name.
+
+            c    sort by the termcap name.
+
+            If the -s option is not given, the  fields  printed  out  will  be
+            sorted  alphabetically  by  the  terminfo  name  within each type,
+            except in the case of the -C or the -L options,  which  cause  the
+            sorting  to  be  done  by  the termcap name or the long C variable
+            name, respectively.
+
+       -T   eliminates size-restrictions  on  the  generated  text.   This  is
+            mainly  useful  for  testing  and  analysis,  since  the  compiled
+            descriptions  are  limited  (e.g.,  1023  for  termcap,  4096  for
+            terminfo).
+
+       -t   tells  tic  to  discard commented-out capabilities.  Normally when
+            translating from terminfo to termcap, untranslatable  capabilities
+            are commented-out.
+
+       -U   tells  infocmp  to  not  post-process  the  data after parsing the
+            source  file.   This  feature  helps  when  comparing  the  actual
+            contents  of  two  source  files, since it excludes the inferences
+            that infocmp makes to fill in missing data.
+
+       -V   reports the version of ncurses which was used in this program, and
+            exits.
+
+       -v n prints  out  tracing  information on standard error as the program
+            runs.
+
+            The optional parameter n is a number  from  1  to  10,  inclusive,
+            indicating the desired level of detail of information.  If ncurses
+            is built  without  tracing  support,  the  optional  parameter  is
+            ignored.
+
+       -W   By  itself,  the  -w  option  will  not  force  long strings to be
+            wrapped.  Use the -W option to do this.
+
+       -w width
+            changes the output to width characters.
+
+       -x   print information for user-defined capabilities (see user_caps(5).
+            These  are  extensions  to  the  terminfo  repertoire which can be
+            loaded using the -x option of tic.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database
+
+
+

EXTENSIONS

+       The -0, -1, -a, -e, -E, -f, -F, -g, -G, -i, -l, -p, -q, -Q, -R, -t, -T,
+       and -V options are ncurses extensions.
+
+
+

PORTABILITY

+       X/Open  Curses,  Issue 7 (2009) specifies infocmp.  It does not mention
+       options for producing descriptions in termcap format.
+
+       SVr4  infocmp  does  not  distinguish  between  absent   and   canceled
+       capabilities.   It  furthermore reports missing integer capabilities as
+       -1 (its internal representation).  ncurses shows these  as  "NULL"  for
+       consistency with missing string capabilities.
+
+       The  -r  option  of  ncurses infocmp uses SVr4's notion of of "termcap"
+       capabilities.  BSD curses had a more restricted set.  To see only those
+       present in 4.4BSD, use "-r -RBSD".
+
+
+

HISTORY

+       Although  System  V  Release  2  provided a terminfo library, it had no
+       documented tool for decompiling the terminal descriptions.  Tony Hansen
+       (AT&T) wrote the first infocmp in early 1984, for System V Release 3.
+
+       Eric  Raymond  used  the  AT&T  documentation  in  1995  to  provide an
+       equivalent infocmp for ncurses.   In  addition,  he  added  a  few  new
+       features such as:
+
+       o   the   -e   option,   to  support  fallback  (compiled-in)  terminal
+           descriptions
+
+       o   the -i option, to help with analysis
+
+       Later, Thomas Dickey added the -x (user-defined  capabilities)  option,
+       and  the  -E  option  to  support  fallback  entries  with user-defined
+       capabilities.
+
+       For a complete list, see the EXTENSIONS section.
+
+       In 2010, Roy Marples provided an infocmp program  for  NetBSD.   It  is
+       less  capable  than  the  SVr4  or ncurses versions (e.g., it lacks the
+       sorting options documented in X/Open), but does include the  -x  option
+       adapted from ncurses.
+
+
+

BUGS

+       The -F option of infocmp(1m) should be a toe(1m) mode.
+
+
+

AUTHORS

+       Eric S. Raymond <esr@snark.thyrsus.com> and
+       Thomas E. Dickey <dickey@invisible-island.net>
+
+
+

SEE ALSO

+       captoinfo(1m),    infotocap(1m),    tic(1m),    toe(1m),    curses(3x),
+       terminfo(5), user_caps(5)
+
+       https://invisible-island.net/ncurses/tctest.html
+
+
+
+ncurses 6.5                       2024-09-21                       infocmp(1m)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/infotocap.1m.html b/contrib/ncurses/doc/html/man/infotocap.1m.html new file mode 100644 index 00000000..8831caf5 --- /dev/null +++ b/contrib/ncurses/doc/html/man/infotocap.1m.html @@ -0,0 +1,107 @@ + + + + + + +infotocap 1m 2024-07-27 ncurses 6.5 User commands + + + + +

infotocap 1m 2024-07-27 ncurses 6.5 User commands

+
+infotocap(1m)                    User commands                   infotocap(1m)
+
+
+
+
+

NAME

+       infotocap - convert a terminfo description into a termcap description
+
+
+

SYNOPSIS

+       infotocap [tic-option] file ...
+
+       infotocap -V
+
+
+

DESCRIPTION

+       infotocap  translates  terminal  descriptions.   It looks in each given
+       text file for terminfo entries and, for each one found,  it  writes  an
+       analogous  termcap description to the standard output stream.  terminfo
+       "use" capabilities  translate  to  termcap  tc  capabilities.   Because
+       termcap  is  a  less expressive format than terminfo, some capabilities
+       cannot be translated.
+
+       This utility is implemented as a link to tic(1m), with the latter's  -C
+       option  implied.  You can use other tic options such as -1, -f, -v, -w,
+       and -x.  The -V option reports the version of ncurses  associated  with
+       this program and exits with a successful status.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database
+
+
+

PORTABILITY

+       None  of  X/Open  Curses, Issue 7 (2009), SVr4, or NetBSD document this
+       application.
+
+
+

AUTHORS

+       Eric S. Raymond <esr@snark.thyrsus.com> and
+       Thomas E. Dickey <dickey@invisible-island.net>
+
+
+

SEE ALSO

+       infocmp(1m), tic(1m), curses(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-07-27                     infotocap(1m)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/key_defined.3x.html b/contrib/ncurses/doc/html/man/key_defined.3x.html new file mode 100644 index 00000000..5b0c30fe --- /dev/null +++ b/contrib/ncurses/doc/html/man/key_defined.3x.html @@ -0,0 +1,105 @@ + + + + + + +key_defined 3x 2024-06-08 ncurses 6.5 Library calls + + + + +

key_defined 3x 2024-06-08 ncurses 6.5 Library calls

+
+key_defined(3x)                  Library calls                 key_defined(3x)
+
+
+
+
+

NAME

+       key_defined - test whether a curses function key code is defined
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int key_defined(const char * definition);
+
+
+

DESCRIPTION

+       The  key_defined  ncurses  extension  permits  a  curses application to
+       determine the function key code, if any, to which the string definition
+       is bound.
+
+
+

RETURN VALUE

+       key_defined  returns the first key code to which definition is bound if
+       any exists.  If none does, it returns 0.  If definition is a prefix  of
+       another binding, key_defined returns -1.
+
+
+

EXTENSIONS

+       define_key is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       curses(3x), define_key(3x), keybound(3x), keyok(3x)
+
+
+
+ncurses 6.5                       2024-06-08                   key_defined(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/keybound.3x.html b/contrib/ncurses/doc/html/man/keybound.3x.html new file mode 100644 index 00000000..cc3ae3a1 --- /dev/null +++ b/contrib/ncurses/doc/html/man/keybound.3x.html @@ -0,0 +1,112 @@ + + + + + + +keybound 3x 2024-06-08 ncurses 6.5 Library calls + + + + +

keybound 3x 2024-06-08 ncurses 6.5 Library calls

+
+keybound(3x)                     Library calls                    keybound(3x)
+
+
+
+
+

NAME

+       keybound - get definition of a curses function key code
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       char * keybound(int key-code, int count);
+
+
+

DESCRIPTION

+       The  keybound  ncurses extension permits a curses application to obtain
+       the value of the  string  bound  to  the  function  key  key-code;  see
+       wgetch(3x)  (wide-character API users: wget_wch(3x)).  By default, such
+       bindings are string  capabilities  from  the  terminfo  database  entry
+       corresponding   to   the  terminal  type.   The  application  can  non-
+       destructively   and   repeatedly   override   such   definitions   with
+       define_key(3x),  as  if  by  pushing new definitions onto a stack.  The
+       count parameter accesses the  nth  most  recently  defined  binding;  0
+       selects the binding that is used on input.
+
+
+

RETURN VALUE

+       If key-code corresponds to a function key defined by the application or
+       the terminal type in use, keybound allocates and returns a string  that
+       must be freed by the application.  keybound returns NULL if key-code is
+       not positive or if it does not correspond to a key code definition.
+
+
+

EXTENSIONS

+       keybound is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       curses(3x), define_key(3x), keyok(3x), key_defined(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-06-08                      keybound(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/keyok.3x.html b/contrib/ncurses/doc/html/man/keyok.3x.html new file mode 100644 index 00000000..42f0187d --- /dev/null +++ b/contrib/ncurses/doc/html/man/keyok.3x.html @@ -0,0 +1,115 @@ + + + + + + +keyok 3x 2024-07-27 ncurses 6.5 Library calls + + + + +

keyok 3x 2024-07-27 ncurses 6.5 Library calls

+
+keyok(3x)                        Library calls                       keyok(3x)
+
+
+
+
+

NAME

+       keyok - enable or disable a curses function key code
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int keyok(int key-code, bool bf);
+
+
+

DESCRIPTION

+       The  keyok  ncurses extension permits a curses application to disable a
+       function key key-code returned by wgetch(3x) (wide-character API users:
+       wget_wch(3x)).   Key  codes  that have been disabled can be re-enabled.
+       bf selects the desired enablement status.  This operation is more fine-
+       grained than calling keypad(3x), which affects all function keys.
+
+
+

RETURN VALUE

+       keyok returns ERR if
+
+       o   key-code is nonpositive,
+
+       o   key-code is not a recognized value, or
+
+       o   enablement of key-code is already in the desired state.
+
+       Otherwise, keyok returns OK.
+
+
+

EXTENSIONS

+       keyok is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       NetBSD curses since 2.0 (2004) supports keyok.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       curses(3x), define_key(3x), keybound(3x), keyok(3x), key_defined(3x)
+
+
+
+ncurses 6.5                       2024-07-27                         keyok(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/legacy_coding.3x.html b/contrib/ncurses/doc/html/man/legacy_coding.3x.html new file mode 100644 index 00000000..bb72afed --- /dev/null +++ b/contrib/ncurses/doc/html/man/legacy_coding.3x.html @@ -0,0 +1,124 @@ + + + + + + +legacy_coding 3x 2024-09-14 ncurses 6.5 Library calls + + + + +

legacy_coding 3x 2024-09-14 ncurses 6.5 Library calls

+
+legacy_coding(3x)                Library calls               legacy_coding(3x)
+
+
+
+
+

NAME

+       use_legacy_coding - override curses locale encoding checks
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int use_legacy_coding(int level);
+
+
+

DESCRIPTION

+       use_legacy_coding,  an ncurses extension to the curses library, permits
+       customiztion  of  unctrl(3x)  behavior,  suppressing   isprint(3)-based
+       checks  within  the  library  that  would  normally  cause  nonprinting
+       characters to be rendered in visible form.  The alteration affects only
+       byte-wide characters with the most significant bit set.
+
+       The level parameter controls the result.
+
+              0    The   library  functions  normally,  rendering  nonprinting
+                   characters as described in unctrl(3x),
+
+              1    the library ignores isprint for codes in the range 160-255.
+
+              2    the library ignores isprint for codes in the range 128-255.
+                   It also modifies the output of unctrl(3x), showing codes in
+                   the range 128-159 as is.
+
+
+

RETURN VALUE

+       If the curses screen has not been initialized, or the  level  parameter
+       is  out of range, use_legacy_coding returns ERR.  Otherwise, it returns
+       the previous level.
+
+
+

EXTENSIONS

+       use_legacy_coding is an ncurses extension.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+
+

HISTORY

+       ncurses  5.6  (2006)  introduced use_legacy_coding to support lynx(1)'s
+       font-switching feature.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       unctrl(3x)
+
+
+
+ncurses 6.5                       2024-09-14                 legacy_coding(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu.3x.html b/contrib/ncurses/doc/html/man/menu.3x.html new file mode 100644 index 00000000..a5d29e43 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu.3x.html @@ -0,0 +1,243 @@ + + + + + + +menu 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

menu 3x 2024-05-25 ncurses 6.5 Library calls

+
+menu(3x)                         Library calls                        menu(3x)
+
+
+
+
+

NAME

+       menu - present menus in curses windows
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+
+

DESCRIPTION

+       The menu library provides terminal-independent facilities for composing
+       menu systems on character-cell terminals.  The library  includes:  item
+       routines,  which create and modify menu items; and menu routines, which
+       group items into  menus,  display  menus  on  the  screen,  and  handle
+       interaction with the user.
+
+       The menu library uses the curses libraries, and a curses initialization
+       routine such as initscr must  be  called  before  using  any  of  these
+       functions.   To  use  the  menu  library,  link with the options -lmenu
+       -lcurses.
+
+
+

Current Default Values for Item Attributes

+       The menu library maintains a default value for  item  attributes.   You
+       can  get  or  set  this default by calling the appropriate get_ or set_
+       routine with a NULL item pointer.  Changing this default  with  a  set_
+       function  affects  future  item  creations,  but  does  not  change the
+       rendering of items already created.
+
+
+

Routine Name Index

+       The following table lists each menu routine and the name of the  manual
+       page on which it is described.
+
+       curses Routine Name    Manual Page Name
+       --------------------------------------------
+       current_item           mitem_current(3x)
+       free_item              mitem_new(3x)
+       free_menu              menu_new(3x)
+       item_count             menu_items(3x)
+       item_description       mitem_name(3x)
+       item_index             mitem_current(3x)
+       item_init              menu_hook(3x)
+       item_name              mitem_name(3x)
+       item_opts              mitem_opts(3x)
+       item_opts_off          mitem_opts(3x)
+       item_opts_on           mitem_opts(3x)
+       item_term              menu_hook(3x)
+       item_userptr           mitem_userptr(3x)
+       item_value             mitem_value(3x)
+       item_visible           mitem_visible(3x)
+       menu_back              menu_attributes(3x)
+       menu_driver            menu_driver(3x)
+       menu_fore              menu_attributes(3x)
+       menu_format            menu_format(3x)
+       menu_grey              menu_attributes(3x)
+       menu_init              menu_hook(3x)
+       menu_items             menu_items(3x)
+       menu_mark              menu_mark(3x)
+       menu_opts              menu_opts(3x)
+       menu_opts_off          menu_opts(3x)
+       menu_opts_on           menu_opts(3x)
+       menu_pad               menu_attributes(3x)
+       menu_pattern           menu_pattern(3x)
+       menu_request_by_name   menu_requestname(3x)
+       menu_request_name      menu_requestname(3x)
+
+       menu_spacing           menu_spacing(3x)
+       menu_sub               menu_win(3x)
+       menu_term              menu_hook(3x)
+       menu_userptr           menu_userptr(3x)
+       menu_win               menu_win(3x)
+       new_item               mitem_new(3x)
+       new_menu               menu_new(3x)
+       pos_menu_cursor        menu_cursor(3x)
+       post_menu              menu_post(3x)
+       scale_menu             menu_win(3x)
+       set_current_item       mitem_current(3x)
+       set_item_init          menu_hook(3x)
+       set_item_opts          mitem_opts(3x)
+       set_item_term          menu_hook(3x)
+       set_item_userptr       mitem_userptr(3x)
+       set_item_value         mitem_value(3x)
+       set_menu_back          menu_attributes(3x)
+       set_menu_fore          menu_attributes(3x)
+       set_menu_format        menu_format(3x)
+       set_menu_grey          menu_attributes(3x)
+       set_menu_init          menu_hook(3x)
+       set_menu_items         menu_items(3x)
+       set_menu_mark          menu_mark(3x)
+       set_menu_opts          mitem_opts(3x)
+       set_menu_pad           menu_attributes(3x)
+       set_menu_pattern       menu_pattern(3x)
+       set_menu_spacing       menu_spacing(3x)
+       set_menu_sub           menu_win(3x)
+       set_menu_term          menu_hook(3x)
+       set_menu_userptr       menu_userptr(3x)
+       set_menu_win           menu_win(3x)
+       set_top_row            mitem_current(3x)
+       top_row                mitem_current(3x)
+       unpost_menu            menu_post(3x)
+
+
+

RETURN VALUE

+       Routines  that  return  pointers  return  NULL on error.  Routines that
+       return an integer return one of the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NO_MATCH
+            Character failed to match.
+
+       E_NO_ROOM
+            Menu is too large for its window.
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+       E_NOT_POSTED
+            The menu has not been posted.
+
+       E_NOT_SELECTABLE
+            The designated item cannot be selected.
+
+       E_POSTED
+            The menu is already posted.
+
+       E_REQUEST_DENIED
+            The menu driver could not process the request.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_UNKNOWN_COMMAND
+            The menu driver code saw an unknown request code.
+
+
+

NOTES

+       The header file menu.h itself includes the header file curses.h.
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       A  menu  facility  was  documented in SVr4.2's Character User Interface
+       Programming document.
+
+       It is not part of X/Open Curses.
+
+       Aside from ncurses, there are few implementations:
+
+       o   systems based on SVr4 source code, e.g., Solaris.
+
+       o   NetBSD curses.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for ncurses  by  Eric  S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "menu_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-05-25                          menu(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_attributes.3x.html b/contrib/ncurses/doc/html/man/menu_attributes.3x.html new file mode 100644 index 00000000..3b3f6ea5 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_attributes.3x.html @@ -0,0 +1,133 @@ + + + + + + +menu_attributes 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_attributes 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_attributes(3x)              Library calls             menu_attributes(3x)
+
+
+
+
+

NAME

+       menu_back,     menu_fore,     menu_grey,    menu_pad,    set_menu_back,
+       set_menu_fore,  set_menu_grey,  set_menu_pad  -  color  and   attribute
+       control for menus
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_fore(MENU *menu, chtype attr);
+       chtype menu_fore(const MENU *menu);
+
+       int set_menu_back(MENU *menu, chtype attr);
+       chtype menu_back(const MENU *menu);
+
+       int set_menu_grey(MENU *menu, chtype attr);
+       chtype menu_grey(const MENU *menu);
+
+       int set_menu_pad(MENU *menu, int pad);
+       int menu_pad(const MENU *menu);
+
+
+

DESCRIPTION

+       The  function set_menu_fore sets the foreground attribute of menu. This
+       is the highlight used for selected menu items.  menu_fore  returns  the
+       foreground attribute.  The default is A_REVERSE.
+
+       The  function set_menu_back sets the background attribute of menu. This
+       is the highlight used for selectable (but not currently selected)  menu
+       items.   The  function menu_back returns the background attribute.  The
+       default is A_NORMAL.
+
+       The function set_menu_grey sets the grey attribute of menu. This is the
+       highlight  used  for un-selectable menu items in menus that permit more
+       than one selection.  The function menu_grey returns the grey attribute.
+       The default is A_UNDERLINE.
+
+       The  function  set_menu_pad  sets  the character used to fill the space
+       between the name and  description  parts  of  a  menu  item.   menu_pad
+       returns the given menu's pad character.  The default is a blank.
+
+
+

RETURN VALUE

+       These routines return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x)  and  related  pages  whose names begin "menu_" for detailed
+       descriptions of the entry points.
+
+
+
+ncurses 6.5                       2024-03-16               menu_attributes(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_cursor.3x.html b/contrib/ncurses/doc/html/man/menu_cursor.3x.html new file mode 100644 index 00000000..0003bcdb --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_cursor.3x.html @@ -0,0 +1,110 @@ + + + + + + +menu_cursor 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_cursor 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_cursor(3x)                  Library calls                 menu_cursor(3x)
+
+
+
+
+

NAME

+       pos_menu_cursor - position a menu's cursor
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int pos_menu_cursor(const MENU *menu);
+
+
+

DESCRIPTION

+       The  function  pos_menu_cursor  restores  the  cursor  to  the  current
+       position associated with the menu's  selected  item.   This  is  useful
+       after  curses  routines  have  been  called  to  do  screen-painting in
+       response to a menu select.
+
+
+

RETURN VALUE

+       This routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_NOT_POSTED
+            The menu has not been posted.
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                   menu_cursor(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_driver.3x.html b/contrib/ncurses/doc/html/man/menu_driver.3x.html new file mode 100644 index 00000000..d82a7f5c --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_driver.3x.html @@ -0,0 +1,245 @@ + + + + + + +menu_driver 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_driver 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_driver(3x)                  Library calls                 menu_driver(3x)
+
+
+
+
+

NAME

+       menu_driver - command-processing loop of the menu system
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int menu_driver(MENU *menu, int c);
+
+
+

DESCRIPTION

+       Once a menu has been posted (displayed), you should funnel input events
+       to it through menu_driver.  This routine has three major input cases:
+
+       o   The input is a form navigation request.  Navigation  request  codes
+           are constants defined in <form.h>, which are distinct from the key-
+           and character codes returned by wgetch(3x).
+
+       o   The input is a printable character.   Printable  characters  (which
+           must  be  positive,  less  than  256)  are checked according to the
+           program's locale settings.
+
+       o   The input is the KEY_MOUSE special key  associated  with  an  mouse
+           event.
+
+       The menu driver requests are as follows:
+
+       REQ_LEFT_ITEM
+            Move left to an item.
+
+       REQ_RIGHT_ITEM
+            Move right to an item.
+
+       REQ_UP_ITEM
+            Move up to an item.
+
+       REQ_DOWN_ITEM
+            Move down to an item.
+
+       REQ_SCR_ULINE
+            Scroll up a line.
+
+       REQ_SCR_DLINE
+            Scroll down a line.
+
+       REQ_SCR_DPAGE
+            Scroll down a page.
+
+       REQ_SCR_UPAGE
+            Scroll up a page.
+
+       REQ_FIRST_ITEM
+            Move to the first item.
+
+       REQ_LAST_ITEM
+            Move to the last item.
+
+       REQ_NEXT_ITEM
+            Move to the next item.
+
+       REQ_PREV_ITEM
+            Move to the previous item.
+
+       REQ_TOGGLE_ITEM
+            Select/deselect an item.
+
+       REQ_CLEAR_PATTERN
+            Clear the menu pattern buffer.
+
+       REQ_BACK_PATTERN
+            Delete the previous character from the pattern buffer.
+
+       REQ_NEXT_MATCH
+            Move to the next item matching the pattern match.
+
+       REQ_PREV_MATCH
+            Move to the previous item matching the pattern match.
+
+       If the second argument is a printable character, the code appends it to
+       the pattern buffer and attempts to move to the next item  matching  the
+       new pattern.  If there is no such match, menu_driver returns E_NO_MATCH
+       and deletes the appended character from the buffer.
+
+       If the second argument is one of the above  pre-defined  requests,  the
+       corresponding action is performed.
+
+
+

Mouse Handling

+       If  the  second  argument  is the KEY_MOUSE special key, the associated
+       mouse event is translated into one of the above  pre-defined  requests.
+       Currently only clicks in the user window (e.g., inside the menu display
+       area or the decoration window) are handled.
+
+       If you click above the display region of the menu:
+
+       o   a REQ_SCR_ULINE is generated for a single click,
+
+       o   a REQ_SCR_UPAGE is generated for a double-click and
+
+       o   a REQ_FIRST_ITEM is generated for a triple-click.
+
+       If you click below the display region of the menu:
+
+       o   a REQ_SCR_DLINE is generated for a single click,
+
+       o   a REQ_SCR_DPAGE is generated for a double-click and
+
+       o   a REQ_LAST_ITEM is generated for a triple-click.
+
+       If you click at an item inside the display area of the menu:
+
+       o   the menu cursor is positioned to that item.
+
+       o   If you double-click an item  a  REQ_TOGGLE_ITEM  is  generated  and
+           E_UNKNOWN_COMMAND  is  returned.   This  return  value makes sense,
+           because a double click usually means that an  item-specific  action
+           should be returned.  It is exactly the purpose of this return value
+           to signal that an application specific command should be executed.
+
+       o   If a translation into a request was done, menu_driver  returns  the
+           result of this request.
+
+       If  you clicked outside the user window or the mouse event could not be
+       translated into a menu request an E_REQUEST_DENIED is returned.
+
+
+

Application-defined Commands

+       If the second argument is neither printable nor one of the  above  pre-
+       defined  menu  requests  or  KEY_MOUSE,  the  drive  assumes  it  is an
+       application-specific    command    and    returns    E_UNKNOWN_COMMAND.
+       Application-defined commands should be defined relative to MAX_COMMAND,
+       the maximum value of these pre-defined requests.
+
+
+

RETURN VALUE

+       menu_driver return one of the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NOT_POSTED
+            The menu has not been posted.
+
+       E_UNKNOWN_COMMAND
+            The menu driver code saw an unknown request code.
+
+       E_NO_MATCH
+            Character failed to match.
+
+       E_REQUEST_DENIED
+            The menu driver could not process the request.
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported  on  Version 7 or BSD versions.  The support for mouse events
+       is ncurses specific.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), getch(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                   menu_driver(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_format.3x.html b/contrib/ncurses/doc/html/man/menu_format.3x.html new file mode 100644 index 00000000..ddd934cf --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_format.3x.html @@ -0,0 +1,123 @@ + + + + + + +menu_format 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_format 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_format(3x)                  Library calls                 menu_format(3x)
+
+
+
+
+

NAME

+       set_menu_format, menu_format - set and get menu sizes
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_format(MENU *menu, int rows, int cols);
+       void menu_format(const MENU *menu, int *rows, int *cols);
+
+
+

DESCRIPTION

+       The function set_menu_format sets the maximum display size of the given
+       menu.  If this size is too small to display all menu  items,  the  menu
+       will  be  made  scrollable.   If  this  size  is  larger than the menus
+       subwindow and the subwindow is too small to  display  all  menu  items,
+       post_menu will fail.
+
+       The  default format is 16 rows, 1 column.  Calling set_menu_format with
+       a null menu pointer will change this default.  A  zero  row  or  column
+       argument  to  set_menu_format is interpreted as a request not to change
+       the current value.
+
+       The function menu_format returns the maximum-size constraints  for  the
+       given menu into the storage addressed by rows and cols.
+
+
+

RETURN VALUE

+       These routines returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_POSTED
+            The menu is already posted.
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                   menu_format(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_hook.3x.html b/contrib/ncurses/doc/html/man/menu_hook.3x.html new file mode 100644 index 00000000..ca1810c2 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_hook.3x.html @@ -0,0 +1,134 @@ + + + + + + +menu_hook 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_hook 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_hook(3x)                    Library calls                   menu_hook(3x)
+
+
+
+
+

NAME

+       menu_hook - set hooks for automatic invocation by applications
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_item_init(MENU *menu, Menu_Hook func);
+       Menu_Hook item_init(const MENU *menu);
+
+       int set_item_term(MENU *menu, Menu_Hook func);
+       Menu_Hook item_term(const MENU *menu);
+
+       int set_menu_init(MENU *menu, Menu_Hook func);
+       Menu_Hook menu_init(const MENU *menu);
+
+       int set_menu_term(MENU *menu, Menu_Hook func);
+       Menu_Hook menu_term(const MENU *menu);
+
+
+

DESCRIPTION

+       These  functions make it possible to set hook functions to be called at
+       various points in the automatic processing  of  input  event  codes  by
+       menu_driver.
+
+       The  function  set_item_init sets a hook to be called at menu-post time
+       and each time the selected item changes (after the change).   item_init
+       returns  the  current  item init hook, if any (NULL if there is no such
+       hook).
+
+       The function set_item_term sets a hook to be called at menu-unpost time
+       and each time the selected item changes (before the change).  item_term
+       returns the current item term hook, if any (NULL if there  is  no  such
+       hook).
+
+       The  function  set_menu_init sets a hook to be called at menu-post time
+       and just after the top row on the  menu  changes  once  it  is  posted.
+       menu_init  returns the current menu init hook, if any (NULL if there is
+       no such hook).
+
+       The function set_menu_term sets a hook to be called at menu-unpost time
+       and  just  before  the  top  row on the menu changes once it is posted.
+       menu_term returns the current menu term hook, if any (NULL if there  is
+       no such hook).
+
+
+

RETURN VALUE

+       Routines  that  return  pointers  return NULL on error.  Other routines
+       return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     menu_hook(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_items.3x.html b/contrib/ncurses/doc/html/man/menu_items.3x.html new file mode 100644 index 00000000..7f1c0824 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_items.3x.html @@ -0,0 +1,128 @@ + + + + + + +menu_items 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_items 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_items(3x)                   Library calls                  menu_items(3x)
+
+
+
+
+

NAME

+       set_menu_items,  menu_items,  item_count  -  make and break connections
+       between items and menus
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_items(MENU *menu, ITEM **items);
+       ITEM **menu_items(const MENU *menu);
+       int item_count(const MENU *menu);
+
+
+

DESCRIPTION

+       The function set_menu_items changes the item pointer array of the given
+       menu.  The array must be terminated by a NULL.
+
+       The function menu_items returns the item array of the given menu.
+
+       The function item_count returns the count of items in menu.
+
+
+

RETURN VALUE

+       The function menu_items returns a pointer (which may be NULL).  It does
+       not set errno.
+
+       The function item_count returns ERR (the general  curses  error  return
+       value) if its menu parameter is NULL.
+
+       The  function  set_menu_items  returns  one  of  the following codes on
+       error:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+       E_POSTED
+            The menu is already posted.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The  SVr4  menu  library  documentation  specifies the item_count error
+       value as -1 (which is the value of ERR).
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                    menu_items(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_mark.3x.html b/contrib/ncurses/doc/html/man/menu_mark.3x.html new file mode 100644 index 00000000..1cdb2b05 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_mark.3x.html @@ -0,0 +1,121 @@ + + + + + + +menu_mark 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_mark 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_mark(3x)                    Library calls                   menu_mark(3x)
+
+
+
+
+

NAME

+       set_menu_mark, menu_mark - get and set the menu mark string
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_mark(MENU *menu, const char *mark);
+       const char *menu_mark(const MENU *menu);
+
+
+

DESCRIPTION

+       In  order  to  make  menu selections visible on older terminals without
+       highlighting or color capability, the menu library marks selected items
+       in a menu with a prefix string.
+
+       The  function  set_menu_mark  sets  the mark string for the given menu.
+       Calling set_menu_mark with a null  menu  item  will  abolish  the  mark
+       string.   Note  that  changing the length of the mark string for a menu
+       while the menu is posted is likely to produce unhelpful behavior.
+
+       The default string is "-" (a dash).  Calling set_menu_mark with a  non-
+       NULL menu argument will change this default.
+
+       The function menu_mark returns the menu's mark string (or NULL if there
+       is none).
+
+
+

RETURN VALUE

+       The function menu_mark returns a pointer (which may be NULL).  It  does
+       not set errno.
+
+       The function set_menu_mark may return the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     menu_mark(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_new.3x.html b/contrib/ncurses/doc/html/man/menu_new.3x.html new file mode 100644 index 00000000..e53eacb6 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_new.3x.html @@ -0,0 +1,121 @@ + + + + + + +menu_new 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_new 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_new(3x)                     Library calls                    menu_new(3x)
+
+
+
+
+

NAME

+       new_menu, free_menu - create and destroy menus
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       MENU *new_menu(ITEM **items);
+       int free_menu(MENU *menu);
+
+
+

DESCRIPTION

+       The  function new_menu creates a new menu connected to a specified item
+       pointer array (which must be NULL-terminated).
+
+       The function free_menu disconnects menu from its item array  and  frees
+       the storage allocated for the menu.
+
+
+

RETURN VALUE

+       The  function  new_menu returns NULL on error.  It sets errno according
+       to the function's failure:
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+       E_SYSTEM_ERROR
+            System error occurred, e.g., malloc failure.
+
+       The function free_menu returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_POSTED
+            The menu has already been posted.
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                      menu_new(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_opts.3x.html b/contrib/ncurses/doc/html/man/menu_opts.3x.html new file mode 100644 index 00000000..453526ab --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_opts.3x.html @@ -0,0 +1,145 @@ + + + + + + +menu_opts 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_opts 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_opts(3x)                    Library calls                   menu_opts(3x)
+
+
+
+
+

NAME

+       set_menu_opts,  menu_opts_on,  menu_opts_off,  menu_opts  - set and get
+       menu options
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_opts(MENU *menu, Menu_Options opts);
+       Menu_Options menu_opts(const MENU *menu);
+
+       int menu_opts_on(MENU *menu, Menu_Options opts);
+       int menu_opts_off(MENU *menu, Menu_Options opts);
+
+
+

DESCRIPTION

+       The function set_menu_opts sets all the given menu's option bits  (menu
+       option bits may be logically-OR'ed together).
+
+       The  function  menu_opts_on  turns on the given option bits, and leaves
+       others alone.
+
+       The function menu_opts_off turns off the given option bits, and  leaves
+       others alone.
+
+       The function menu_opts returns the menu's current option bits.
+
+       The following options are defined (all are on by default):
+
+       O_ONEVALUE
+            Only one item can be selected for this menu.
+
+       O_SHOWDESC
+            Display the item descriptions when the menu is posted.
+
+       O_ROWMAJOR
+            Display the menu in row-major order.
+
+       O_IGNORECASE
+            Ignore the case when pattern-matching.
+
+       O_SHOWMATCH
+            Move the cursor to within the item name while pattern-matching.
+
+       O_NONCYCLIC
+            Don't  wrap  around  next-item  and previous-item, requests to the
+            other end of the menu.
+
+       O_MOUSE_MENU
+            If user clicks with  the  mouse  and  it  does  not  fall  on  the
+            currently  active menu, push KEY_MOUSE and the MEVENT data back on
+            the queue to allow processing  in  another  part  of  the  calling
+            program.
+
+
+

RETURN VALUE

+       Except for menu_opts, each routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_POSTED
+            The menu is already posted.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     menu_opts(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_pattern.3x.html b/contrib/ncurses/doc/html/man/menu_pattern.3x.html new file mode 100644 index 00000000..34d6f98d --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_pattern.3x.html @@ -0,0 +1,126 @@ + + + + + + +menu_pattern 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_pattern 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_pattern(3x)                 Library calls                menu_pattern(3x)
+
+
+
+
+

NAME

+       set_menu_pattern, menu_pattern - set and get a menu's pattern buffer
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_pattern(MENU *menu, const char *pattern);
+       char *menu_pattern(const MENU *menu);
+
+
+

DESCRIPTION

+       Every  menu  has  an  associated pattern match buffer.  As input events
+       that are printable characters come in, they are appended to this  match
+       buffer and tested for a match, as described in menu_driver(3x).
+
+       The  function  set_menu_pattern  sets  the pattern buffer for the given
+       menu and tries to find the first matching item.  If it  succeeds,  that
+       item becomes current; if not, the current item does not change.
+
+       The function menu_pattern returns the pattern buffer of the given menu.
+
+
+

RETURN VALUE

+       The  function menu_pattern returns a pointer, which is NULL if the menu
+       parameter is NULL.  Otherwise, it is a pointer to  a  string  which  is
+       empty if no pattern has been set.  It does not set errno.
+
+       The function set_menu_pattern may return the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NOT_CONNECTED
+            No items are connected to menu.
+
+       E_NO_MATCH
+            Character failed to match.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                  menu_pattern(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_post.3x.html b/contrib/ncurses/doc/html/man/menu_post.3x.html new file mode 100644 index 00000000..6d48f77b --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_post.3x.html @@ -0,0 +1,128 @@ + + + + + + +menu_post 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_post 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_post(3x)                    Library calls                   menu_post(3x)
+
+
+
+
+

NAME

+       post_menu,   unpost_menu   -  write  or  erase  menus  from  associated
+       subwindows
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int post_menu(MENU *menu);
+       int unpost_menu(MENU *menu);
+
+
+

DESCRIPTION

+       The function post_menu displays a menu to its associated subwindow.  To
+       trigger  physical  display  of  the  subwindow, use refresh(3x) or some
+       equivalent curses routine (the implicit doupdate triggered by an curses
+       input  request  will do).  post_menu resets the selection status of all
+       items.
+
+       The function unpost_menu erases menu from its associated subwindow.
+
+
+

RETURN VALUE

+       These routines return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_POSTED
+            The menu has already been posted.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NO_ROOM
+            Menu is too large for  its  window.   You  should  consider  using
+            set_menu_format to solve the problem.
+
+       E_NOT_POSTED
+            The menu has not been posted.
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     menu_post(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_requestname.3x.html b/contrib/ncurses/doc/html/man/menu_requestname.3x.html new file mode 100644 index 00000000..0a06ada4 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_requestname.3x.html @@ -0,0 +1,106 @@ + + + + + + +menu_requestname 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_requestname 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_requestname(3x)             Library calls            menu_requestname(3x)
+
+
+
+
+

NAME

+       menu_request_by_name, menu_request_name - handle printable menu request
+       names
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       const char *menu_request_name(int request);
+       int menu_request_by_name(const char *name);
+
+
+

DESCRIPTION

+       The function menu_request_name returns the printable  name  of  a  menu
+       request code.
+       The  function  menu_request_by_name  searches  in  the name-table for a
+       request with the given name and returns its  request  code.   Otherwise
+       E_NO_MATCH is returned.
+
+
+

RETURN VALUE

+       menu_request_name   returns   NULL   on   error   and   sets  errno  to
+       E_BAD_ARGUMENT.
+       menu_request_by_name returns E_NO_MATCH on  error.   It  does  not  set
+       errno.
+
+
+

PORTABILITY

+       These  routines  are  specific  to ncurses.  They were not supported on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16              menu_requestname(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_spacing.3x.html b/contrib/ncurses/doc/html/man/menu_spacing.3x.html new file mode 100644 index 00000000..5526b4de --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_spacing.3x.html @@ -0,0 +1,130 @@ + + + + + + +menu_spacing 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_spacing 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_spacing(3x)                 Library calls                menu_spacing(3x)
+
+
+
+
+

NAME

+       set_menu_spacing,  menu_spacing  -  set  and  get  spacing between menu
+       items.
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_spacing(MENU *menu,
+                            int spc_description,
+                            int spc_rows,
+                            int spc_columns);
+       int menu_spacing(const MENU *menu,
+                        int* spc_description,
+                        int* spc_rows,
+                        int* spc_columns);
+
+
+

DESCRIPTION

+       The function set_menu_spacing sets  the  spacing  information  for  the
+       menu.  Its parameters provide the description and the size (in rows and
+       columns).
+
+       spc_description
+              controls the number of spaces between an item name and  an  item
+              description.   It  must  not  be  larger than TABSIZE.  The menu
+              system  puts  in  the  middle  of  this  spacing  area  the  pad
+              character.  The remaining parts are filled with spaces.
+
+       spc_rows
+              controls  the number of rows that are used for an item.  It must
+              not be larger than 3.  The menu system inserts the  blank  lines
+              between item rows, these lines will contain the pad character in
+              the appropriate positions.
+
+       spc_columns
+              controls the number of blanks between columns of items.  It must
+              not  be  larger  than TABSIZE.  A value of 0 for all the spacing
+              values resets them to the default, which is 1 for all of them.
+
+       The function menu_spacing returns the spacing information for the menu.
+       If  a  pointer  is  NULL,  the  corresponding information is simply not
+       returned.
+
+
+

RETURN VALUE

+       Both routines return E_OK  on  success.   set_menu_spacing  may  return
+       E_POSTED if the menu is posted, or E_BAD_ARGUMENT if one of the spacing
+       values is out of range.
+
+
+

PORTABILITY

+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), curs_variables(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                  menu_spacing(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_userptr.3x.html b/contrib/ncurses/doc/html/man/menu_userptr.3x.html new file mode 100644 index 00000000..d2b52f1d --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_userptr.3x.html @@ -0,0 +1,106 @@ + + + + + + +menu_userptr 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_userptr 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_userptr(3x)                 Library calls                menu_userptr(3x)
+
+
+
+
+

NAME

+       set_menu_userptr, menu_userptr - associate application data with a menu
+       item
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_userptr(MENU *menu, void *userptr);
+       void *menu_userptr(const MENU *menu);
+
+
+

DESCRIPTION

+       Every menu and every menu item has a field that can  be  used  to  hold
+       application-specific  data  (that  is,  the  menu-driver code leaves it
+       alone).  These functions get and set the menu user pointer field.
+
+
+

RETURN VALUE

+       menu_userptr returns a pointer (which may be NULL).  It  does  not  set
+       errno.
+
+       set_menu_userptr returns E_OK (success).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                  menu_userptr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/menu_win.3x.html b/contrib/ncurses/doc/html/man/menu_win.3x.html new file mode 100644 index 00000000..9688e0f5 --- /dev/null +++ b/contrib/ncurses/doc/html/man/menu_win.3x.html @@ -0,0 +1,131 @@ + + + + + + +menu_win 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

menu_win 3x 2024-03-16 ncurses 6.5 Library calls

+
+menu_win(3x)                     Library calls                    menu_win(3x)
+
+
+
+
+

NAME

+       menu_win - make and break menu window and subwindow associations
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_menu_win(MENU *menu, WINDOW *win);
+       WINDOW *menu_win(const MENU *menu);
+
+       int set_menu_sub(MENU *menu, WINDOW *sub);
+       WINDOW *menu_sub(const MENU *menu);
+
+       int scale_menu(const MENU *menu, int *rows, int *columns);
+
+
+

DESCRIPTION

+       Every  menu  has an associated pair of curses windows.  The menu window
+       displays any title and border associated  with  the  window;  the  menu
+       subwindow  displays  the items of the menu that are currently available
+       for selection.
+
+       The first four  functions  get  and  set  those  windows.   It  is  not
+       necessary to set either window; by default, the driver code uses stdscr
+       for both.
+
+       In the set_ functions, window argument of NULL is treated as though  it
+       were stsdcr.  A menu argument of NULL is treated as a request to change
+       the system default menu window or subwindow.
+
+       The function scale_menu returns  the  minimum  size  required  for  the
+       subwindow of menu.
+
+
+

RETURN VALUE

+       Routines  that  return  pointers  return  NULL on error.  Routines that
+       return an integer return one of the following error codes:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_POSTED
+            The menu has already been posted.
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), curs_variables(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                      menu_win(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_current.3x.html b/contrib/ncurses/doc/html/man/mitem_current.3x.html new file mode 100644 index 00000000..ea8a33f7 --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_current.3x.html @@ -0,0 +1,136 @@ + + + + + + +mitem_current 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_current 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_current(3x)                Library calls               mitem_current(3x)
+
+
+
+
+

NAME

+       mitem_current - set and get current_menu_item
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_current_item(MENU *menu, ITEM *item);
+       ITEM *current_item(const MENU *menu);
+
+       int set_top_row(MENU *menu, int row);
+       int top_row(const MENU *menu);
+
+       int item_index(const ITEM *item);
+
+
+

DESCRIPTION

+       The  function set_current_item sets the current item (the item on which
+       the menu cursor is positioned).  current_item returns a pointer to  the
+       current item in the given menu.
+
+       The function set_top_row sets the top row of the menu to show the given
+       row (the top row is initially 0, and is reset to  this  value  whenever
+       the  O_ROWMAJOR option is toggled).  The item leftmost on the given row
+       becomes current.  The function top_row returns the number  of  the  top
+       menu row being displayed.
+
+       The  function item_index returns the (zero-origin) index of item in the
+       menu's item pointer list.
+
+
+

RETURN VALUE

+       current_item returns a pointer (which may be NULL).  It  does  not  set
+       errno.
+
+       top_row  and  item_index return ERR (the general curses error value) if
+       their menu parameter is NULL.
+
+       set_current_item and set_top_row return one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_BAD_STATE
+            Routine was called from an initialization or termination function.
+
+       E_NOT_CONNECTED
+            No items are connected to the menu.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+       The   SVr4   menu  library  documentation  specifies  the  top_row  and
+       index_item error value as -1 (which is the value of ERR).
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                 mitem_current(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_name.3x.html b/contrib/ncurses/doc/html/man/mitem_name.3x.html new file mode 100644 index 00000000..1ff53c8a --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_name.3x.html @@ -0,0 +1,100 @@ + + + + + + +mitem_name 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_name 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_name(3x)                   Library calls                  mitem_name(3x)
+
+
+
+
+

NAME

+       item_name, item_description - get menu item name and description fields
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       const char *item_name(const ITEM *item);
+       const char *item_description(const ITEM *item);
+
+
+

DESCRIPTION

+       The function item_name returns the name part of the given item.
+       The function item_description returns the description part of the given
+       item.
+
+
+

RETURN VALUE

+       These routines return a pointer (which may be NULL).  They do  not  set
+       errno.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                    mitem_name(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_new.3x.html b/contrib/ncurses/doc/html/man/mitem_new.3x.html new file mode 100644 index 00000000..b4ed6676 --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_new.3x.html @@ -0,0 +1,124 @@ + + + + + + +mitem_new 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_new 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_new(3x)                    Library calls                   mitem_new(3x)
+
+
+
+
+

NAME

+       new_item, free_item - create and destroy menu items
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       ITEM *new_item(const char *name, const char *description);
+       int free_item(ITEM *item);
+
+
+

DESCRIPTION

+       The  function new_item allocates a new item and initializes it from the
+       name and description pointers.  Please notice that the item stores only
+       the pointers to the name and description.  Those pointers must be valid
+       during the lifetime of the item.  So you should be  very  careful  with
+       names or descriptions allocated on the stack of some routines.
+       The  function free_item de-allocates an item.  Please notice that it is
+       the responsibility of the application to release  the  memory  for  the
+       name or the description of the item.
+
+
+

RETURN VALUE

+       The  function  new_item returns NULL on error.  It sets errno according
+       to the function's failure:
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_SYSTEM_ERROR
+            System error occurred, e.g., malloc failure.
+
+       The function free_item returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_BAD_ARGUMENT
+            Routine detected an incorrect or out-of-range argument.
+
+       E_CONNECTED
+            Item is connected to a menu.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These routines emulate the  System  V  menu  library.   They  were  not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                     mitem_new(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_opts.3x.html b/contrib/ncurses/doc/html/man/mitem_opts.3x.html new file mode 100644 index 00000000..537a9130 --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_opts.3x.html @@ -0,0 +1,119 @@ + + + + + + +mitem_opts 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_opts 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_opts(3x)                   Library calls                  mitem_opts(3x)
+
+
+
+
+

NAME

+       set_item_opts,  item_opts_on,  item_opts_off,  item_opts  - set and get
+       menu item options
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_item_opts(ITEM *item, Item_Options opts);
+       Item_Options item_opts(const ITEM *item);
+
+       int item_opts_on(ITEM *item, Item_Options opts);
+       int item_opts_off(ITEM *item, Item_Options opts);
+
+
+

DESCRIPTION

+       The function set_item_opts sets all the given item's option bits  (menu
+       option bits may be logically-OR'ed together).
+
+       The  function  item_opts_on  turns on the given option bits, and leaves
+       others alone.
+
+       The function item_opts_off turns off the given option bits, and  leaves
+       others alone.
+
+       The function item_opts returns the item's current option bits.
+
+       There  is only one defined option bit mask, O_SELECTABLE.  When this is
+       on, the item may be  selected  during  menu  processing.   This  option
+       defaults to on.
+
+
+

RETURN VALUE

+       Except for item_opts, each routine returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                    mitem_opts(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_userptr.3x.html b/contrib/ncurses/doc/html/man/mitem_userptr.3x.html new file mode 100644 index 00000000..afb442d8 --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_userptr.3x.html @@ -0,0 +1,106 @@ + + + + + + +mitem_userptr 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_userptr 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_userptr(3x)                Library calls               mitem_userptr(3x)
+
+
+
+
+

NAME

+       set_item_userptr, item_userptr - associate application data with a menu
+       item
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_item_userptr(ITEM *item, void *userptr);
+       void *item_userptr(const ITEM *item);
+
+
+

DESCRIPTION

+       Every menu item has a field that  can  be  used  to  hold  application-
+       specific  data  (that is, the menu-driver code leaves it alone).  These
+       functions get and set that field.
+
+
+

RETURN VALUE

+       The function item_userptr returns a pointer (possibly NULL).   It  does
+       not set errno.
+
+       The set_item_userptr always returns E_OK (success).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+       The user pointer is a void pointer.  We chose not to leave it as a char
+       pointer for SVr4 compatibility.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                 mitem_userptr(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_value.3x.html b/contrib/ncurses/doc/html/man/mitem_value.3x.html new file mode 100644 index 00000000..01ce5d50 --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_value.3x.html @@ -0,0 +1,111 @@ + + + + + + +mitem_value 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_value 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_value(3x)                  Library calls                 mitem_value(3x)
+
+
+
+
+

NAME

+       set_item_value, item_value - set and get menu item values
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       int set_item_value(ITEM *item, bool value);
+       bool item_value(const ITEM *item);
+
+
+

DESCRIPTION

+       If you turn off the menu option O_ONEVALUE (e.g., with set_menu_opts or
+       menu_opts_off; see menu_opts(3x)), the menu becomes multi-valued;  that
+       is, more than one item may simultaneously be selected.
+
+       In a multi_valued menu, you can used set_item_value to select the given
+       menu item (second  argument  TRUE)  or  deselect  it  (second  argument
+       FALSE).
+
+
+

RETURN VALUE

+       The function set_item_value returns one of the following:
+
+       E_OK The routine succeeded.
+
+       E_SYSTEM_ERROR
+            System error occurred (see errno(3)).
+
+       E_REQUEST_DENIED
+            The menu driver could not process the request.
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                   mitem_value(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/mitem_visible.3x.html b/contrib/ncurses/doc/html/man/mitem_visible.3x.html new file mode 100644 index 00000000..8224323f --- /dev/null +++ b/contrib/ncurses/doc/html/man/mitem_visible.3x.html @@ -0,0 +1,93 @@ + + + + + + +mitem_visible 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

mitem_visible 3x 2024-03-16 ncurses 6.5 Library calls

+
+mitem_visible(3x)                Library calls               mitem_visible(3x)
+
+
+
+
+

NAME

+       item_visible - check visibility of a menu item
+
+
+

SYNOPSIS

+       #include <menu.h>
+
+       bool item_visible(const ITEM *item);
+
+
+

DESCRIPTION

+       A  menu item is visible when it is in the portion of a posted menu that
+       is mapped onto the screen (if the menu is  scrollable,  in  particular,
+       this portion will be smaller than the whole menu).
+
+
+

PORTABILITY

+       These  routines  emulate  the  System  V  menu  library.  They were not
+       supported on Version 7 or BSD versions.
+
+
+

AUTHORS

+       Juergen Pfeifer.  Manual pages and adaptation for new curses by Eric S.
+       Raymond.
+
+
+

SEE ALSO

+       curses(3x), menu(3x)
+
+
+
+ncurses 6.5                       2024-03-16                 mitem_visible(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/ncurses.3x.html b/contrib/ncurses/doc/html/man/ncurses.3x.html new file mode 100644 index 00000000..a0a6aa8c --- /dev/null +++ b/contrib/ncurses/doc/html/man/ncurses.3x.html @@ -0,0 +1,1559 @@ + + + + + + +ncurses 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

ncurses 3x 2024-09-21 ncurses 6.5 Library calls

+
+ncurses(3x)                      Library calls                     ncurses(3x)
+
+
+
+
+

NAME

+       ncurses - character-cell terminal interface with optimized output
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+
+

DESCRIPTION

+       The  "new  curses" library offers the programmer a terminal-independent
+       means of reading keyboard and mouse input and writing to character-cell
+       displays  with  output  optimized  to minimize screen updates.  ncurses
+       replaces the curses libraries from System V Release 4 Unix ("SVr4") and
+       4.4BSD  Unix,  the  development  of  which  ceased  in the 1990s.  This
+       document describes ncurses version 6.5 (patch 20240921).
+
+       ncurses permits control of the terminal screen's contents;  abstraction
+       and  subdivision thereof with windows and pads; acquisition of keyboard
+       and mouse events; selection of color and rendering attributes (such  as
+       bold  or  underline); the definition and use of soft label keys; access
+       to the terminfo terminal capability database; a  termcap  compatibility
+       interface;  and an abstraction of the system's API for manipulating the
+       terminal (such as termios(3)).
+
+       ncurses implements the interface described by  X/Open  Curses  Issue 7.
+       In many behavioral details not standardized by X/Open, ncurses emulates
+       the curses library of SVr4 and provides numerous useful extensions.
+
+       ncurses man pages employ several sections to clarify matters  of  usage
+       and interoperability with other curses implementations.
+
+       o   "NOTES"  describes  issues  and  caveats  of  which any user of the
+           ncurses API should be aware, such as limitations on the size of  an
+           underlying  integral  type  or  the  availability of a preprocessor
+           macro exclusive  of  a  function  definition  (which  prevents  its
+           address   from   being   taken).    This   section  also  describes
+           implementation details of significance to the programmer but  which
+           are not standardized.
+
+       o   "EXTENSIONS"  presents ncurses innovations beyond the X/Open Curses
+           standard and/or the SVr4 curses implementation.   They  are  termed
+           extensions  to  indicate  that they cannot be implemented solely by
+           using the library API, but require access to the library's internal
+           state.
+
+       o   "PORTABILITY" discusses matters (beyond the exercise of extensions)
+           that should be considered when writing to a curses standard, or for
+           multiple implementations.
+
+       o   "HISTORY"  examines  points  of  detail in ncurses and other curses
+           implementations over the decades of their development, particularly
+           where precedent or inertia have frustrated better design (and, in a
+           few cases, where such inertia has been overcome).
+
+       A curses application must be linked with the library; use the -lncurses
+       option  to your compiler or linker.  A debugging version of the library
+       may be available; if so, link with it using -lncurses_g.  (Your  system
+       integrator may have installed these libraries such that you can use the
+       options -lcurses and -lcurses_g, respectively.)  The ncurses_g  library
+       logs  events  describing  ncurses actions to a file called trace in the
+       current directory.  See section "ALTERNATE CONFIGURATIONS" below.
+
+
+

Application Structure

+       A  curses  application  uses  information  from  the   system   locale;
+       setlocale(3) prepares it for curses library calls.
+
+           setlocale(LC_ALL, "");
+
+       If  the  locale  is  not  thus  initialized,  the  library assumes that
+       characters are printable as in ISO 8859-1, to work with certain  legacy
+       programs.   You  should initialize the locale; do not expect consistent
+       behavior from the library when the locale has not been set up.
+
+       initscr(3x) or newterm(3x) must be called to initialize  curses  before
+       use of any functions that access or manipulate windows or screens.
+
+       To  get  character-at-a-time  input  without echoing--most interactive,
+       screen-oriented programs want this--use the following sequence.
+
+           initscr(); cbreak(); noecho();
+
+       Most applications would perform further setup as follows.
+
+           noqiflush();
+           keypad(stdscr, TRUE);
+
+       A curses program then often enters an event loop of  some  sort.   Call
+       endwin(3x) before exiting.
+
+
+

Overview

+       A  curses  library abstracts the terminal with a SCREEN data structure,
+       and represents all or part  of  its  display  with  WINDOW  structures.
+       Distinct  properties apply to each; for example, the line discipline of
+       a typical Unix terminal driver is in one of three modes:  raw,  cbreak,
+       or  normal ("cooked").  In curses, the line discipline is a property of
+       the screen, applying identically to all windows associated with it.
+
+       A window is a rectangular grid of character cells,  addressed  by  line
+       and column coordinates (y, x), with the upper left corner as (0, 0).  A
+       window called stdscr, the same size as the terminal screen,  is  always
+       available.  Create others with newwin(3x).
+
+       A  curses  library does not manage overlapping windows (but see below).
+       You can either use stdscr to manage one screen-filling window, or  tile
+       the  screen  into  non-overlapping  windows  and not use stdscr at all.
+       Mixing the two approaches will result in  unpredictable  and  undesired
+       effects.
+
+       Functions  permit  manipulation  of a window and the cursor identifying
+       the cell within it at which  the  next  operation  will  occur.   Among
+       those,  the  most  basic  are  move(3x)  and addch(3x): these place the
+       cursor within and write a character to stdscr, respectively.
+
+       Frequent changes to the terminal screen can cause unpleasant flicker or
+       inefficient  use  of  the  communication channel to the device, so as a
+       rule the library does not update it  automatically.   Therefore,  after
+       using curses functions to accumulate a set of desired updates that make
+       sense to present together, call refresh(3x) to tell the library to make
+       the  user's  screen look like stdscr.  The library optimizes its output
+       by computing a minimal volume of operations to mutate the  screen  from
+       its   state  at  the  previous  refresh  to  the  new  one.   Effective
+       optimization demands accurate information about  the  terminal  device:
+       the  management of such information is the province of the terminfo(3x)
+       API, a feature of every standard curses implementation.
+
+       Special windows called pads may also be  manipulated.   These  are  not
+       constrained  to the size of the terminal screen and their contents need
+       not be completely displayed.  See curs_pad(3x).
+
+       Many terminals support configuration of character cell  foreground  and
+       background  colors  as  well  as  attributes, which cause characters to
+       render in such modes as boldfaced, underlined,  or  in  reverse  video.
+       See curs_attr(3x).
+
+       curses  predefines  constants for a small set of forms-drawing graphics
+       corresponding to the DEC Alternate Character Set (ACS),  a  feature  of
+       VT100 and other terminals.  See addch(3x).
+
+       curses is implemented using the operating system's terminal driver; key
+       events are received not as scan  codes  but  as  byte  sequences.   The
+       driver  reports  graphical  keycaps (alphanumeric and punctuation keys,
+       and  the  space)  as-is.    Everything   else,   including   the   tab,
+       enter/return,  keypad, arrow, and function keys, appears to curses as a
+       control character or a multibyte escape sequence.  curses can translate
+       the latter into unique key codes.  See keypad(3x) and getch(3x).
+
+       ncurses provides reimplementations of the SVr4 panel(3x), form(3x), and
+       menu(3x)  libraries;  they  permit   overlapping   windows   and   ease
+       construction of user interfaces with curses.
+
+
+

Initialization

+       The   selection  of  an  appropriate  value  of  TERM  in  the  process
+       environment  is  essential  to  correct  curses  and  terminfo  library
+       operation.   A  well-configured  system  selects  a  correct TERM value
+       automatically;  tset(1)  may   assist   with   troubleshooting   exotic
+       situations.
+
+       If you change the terminal type, export the shell's TERM variable, then
+       run tset(1) or the "tput  init"  command.   See  subsection  "Tabs  and
+       Initialization" of terminfo(5).
+
+       If  the  environment  variables  LINES  and  COLUMNS are set, or if the
+       curses program is executing in a graphical windowing  environment,  the
+       information  obtained  thence  overrides that obtained by terminfo.  An
+       ncurses extension supports resizable terminals; see wresize(3x).
+
+       If the environment variable  TERMINFO  is  defined,  a  curses  program
+       checks  first  for  a  terminal  type  description  in  the location it
+       identifies.  TERMINFO is useful for  developing  type  descriptions  or
+       when write permission to /usr/share/terminfo is not available.
+
+       See section "ENVIRONMENT" below.
+
+
+

Naming Conventions

+       curses  offers  many  functions in variant forms using a regular set of
+       alternatives to the name of an elemental one.  Those prefixed with  "w"
+       require  a  WINDOW  pointer  argument;  those  with a "mv" prefix first
+       perform cursor movement using wmove(3x); a "mvw" prefix indicates both.
+       The  "w"  function  is typically the elemental one; the removal of this
+       prefix usually indicates operation on stdscr.
+
+       Four functions prefixed with "p" require a pad argument; see below.
+
+       In function synopses, ncurses man pages apply the  following  names  to
+       parameters.  We introduce the character types in the next subsection.
+
+                       bf    a bool (TRUE or FALSE)
+                       c     a char or int
+                       ch    a chtype
+                       wc    a wchar_t or wint_t
+                       wch   a cchar_t
+                       win   pointer to a WINDOW
+                       pad   pointer to a WINDOW that is a pad
+
+
+

Wide and Non-wide Character Configurations

+       This   man   page  primarily  surveys  functions  that  appear  in  any
+       configuration of the library.  There are two common configurations; see
+       section "ALTERNATE CONFIGURATIONS" below.
+
+       ncurses   is the library in its "non-wide" configuration, handling only
+                 eight-bit characters.  It stores a  character  combined  with
+                 attributes  and  a  color  pair identifier in a chtype datum,
+                 which  is  often  an  alias  of  int.   A  string  of  curses
+                 characters  is  similar  to  a C char string; a chtype string
+                 ends with an integral 0, the null curses character.
+
+                 Attributes and a color pair identifier (with no corresponding
+                 character)  can  be  stored  in variables of chtype or attr_t
+                 type.  In either case, they are accessed via an integral  bit
+                 mask.
+
+                 Each  cell  of a WINDOW is stored as a chtype.  X/Open Curses
+                 does not specify the sizes of the  character  code  or  color
+                 pair  identifier,  nor  the  quantity  of  attribute bits, in
+                 chtype; these  are  implementation-dependent.   ncurses  uses
+                 eight  bits for the character code.  An application requiring
+                 a wider character type, for instance  to  represent  Unicode,
+                 should use the wide-character API.
+
+       ncursesw  is  the  library  in  its "wide" configuration, which handles
+                 character encodings requiring a larger data type than char (a
+                 byte-sized  type)  can  represent.   It  provides  additional
+                 functions that complement those in the non-wide library where
+                 the  size of the underlying character type is significant.  A
+                 somewhat regular naming convention relates many of  the  wide
+                 variants  to  their  non-wide  counterparts; where a non-wide
+                 function name contains "ch" or "str", prefix it with "_w"  to
+                 obtain  the  wide  counterpart.   For example, waddch becomes
+                 wadd_wch.  Another exception is ins_nwstr (and its variants),
+                 spelled  thus  instead  of "insn_wstr".  (Exceptions that add
+                 only "w" comprise addwstr, inwstr, and their variants.)
+
+                 This convention is inapplicable  to  some  non-wide  function
+                 names,  so  other  transformations  are  used  for  the  wide
+                 configuration:  the  window  background  management  function
+                 "bkgd"   becomes  "bkgrnd";  the  window  border-drawing  and
+                 -clearing functions are suffixed with "_set";  and  character
+                 attribute   manipulation   functions   like  "attron"  become
+                 "attr_on".
+
+                 cchar_t  is a curses complex character and corresponds to the
+                          non-wide  configuration's chtype.  It is a structure
+                          type  because  it  requires  more  storage  than   a
+                          standard  scalar  type offers.  A character code may
+                          not be representable as a char,  and  moreover  more
+                          than one character may occupy a cell (as with accent
+                          marks and other diacritics).  Each character  is  of
+                          type  wchar_t;  a  complex  character  contains  one
+                          spacing  character  and  zero  or  more  non-spacing
+                          characters   (see   below).   A  string  of  complex
+                          characters ends with a cchar_t whose wchar_t  member
+                          is  the null wide character.  Attributes and a color
+                          pair identifier are stored in separate fields of the
+                          structure,  not  combined  into  an  integer  as  in
+                          chtype.
+
+                 Each cell of a WINDOW is stored as a  cchar_t.   setcchar(3x)
+                 and getcchar(3x) store and retrieve cchar_t data.
+
+                 The  wide  library  API  of ncurses depends on two data types
+                 standardized by ISO C95.
+
+                 wchar_t  stores a wide character.  Like chtype, it may be  an
+                          alias  of int.  Depending on the character encoding,
+                          a wide character may be  spacing,  meaning  that  it
+                          occupies  a  character  cell by itself and typically
+                          accompanies  cursor  advancement,  or   non-spacing,
+                          meaning  that it occupies the same cell as a spacing
+                          character, is often regarded as a "modifier" of  the
+                          base  glyph  with  which  it combines, and typically
+                          does not advance the cursor.
+
+                 wint_t   can  store  a  wchar_t   or   the   constant   WEOF,
+                          analogously  to the int-sized character manipulation
+                          functions of ISO C and its constant EOF.
+
+
+

Function Name Index

+       The following table lists the curses functions provided in the non-wide
+       and  wide  APIs  and  the  corresponding  man pages that describe them.
+       Those flagged with  "*"  are  ncurses-specific,  neither  described  by
+       X/Open Curses nor present in SVr4.
+
+                    curses Function Name     Man Page
+                    ---------------------------------------------
+                    COLOR_PAIR               curs_color(3x)
+                    PAIR_NUMBER              curs_color(3x)
+                    add_wch                  curs_add_wch(3x)
+                    add_wchnstr              curs_add_wchstr(3x)
+                    add_wchstr               curs_add_wchstr(3x)
+                    addch                    curs_addch(3x)
+                    addchnstr                curs_addchstr(3x)
+                    addchstr                 curs_addchstr(3x)
+                    addnstr                  curs_addstr(3x)
+                    addnwstr                 curs_addwstr(3x)
+                    addstr                   curs_addstr(3x)
+                    addwstr                  curs_addwstr(3x)
+                    alloc_pair               new_pair(3x)*
+                    assume_default_colors    default_colors(3x)*
+                    attr_get                 curs_attr(3x)
+                    attr_off                 curs_attr(3x)
+                    attr_on                  curs_attr(3x)
+                    attr_set                 curs_attr(3x)
+                    attroff                  curs_attr(3x)
+                    attron                   curs_attr(3x)
+                    attrset                  curs_attr(3x)
+                    baudrate                 curs_termattrs(3x)
+                    beep                     curs_beep(3x)
+                    bkgd                     curs_bkgd(3x)
+                    bkgdset                  curs_bkgd(3x)
+                    bkgrnd                   curs_bkgrnd(3x)
+                    bkgrndset                curs_bkgrnd(3x)
+                    border                   curs_border(3x)
+                    border_set               curs_border_set(3x)
+                    box                      curs_border(3x)
+                    box_set                  curs_border_set(3x)
+                    can_change_color         curs_color(3x)
+                    cbreak                   curs_inopts(3x)
+                    chgat                    curs_attr(3x)
+                    clear                    curs_clear(3x)
+                    clearok                  curs_outopts(3x)
+                    clrtobot                 curs_clear(3x)
+                    clrtoeol                 curs_clear(3x)
+                    color_content            curs_color(3x)
+                    color_set                curs_attr(3x)
+                    copywin                  curs_overlay(3x)
+                    curs_set                 curs_kernel(3x)
+                    curses_trace             curs_trace(3x)*
+                    curses_version           curs_extend(3x)*
+                    def_prog_mode            curs_kernel(3x)
+                    def_shell_mode           curs_kernel(3x)
+                    define_key               define_key(3x)*
+                    del_curterm              curs_terminfo(3x)
+
+                    delay_output             curs_util(3x)
+                    delch                    curs_delch(3x)
+                    deleteln                 curs_deleteln(3x)
+                    delscreen                curs_initscr(3x)
+                    delwin                   curs_window(3x)
+                    derwin                   curs_window(3x)
+                    doupdate                 curs_refresh(3x)
+                    dupwin                   curs_window(3x)
+                    echo                     curs_inopts(3x)
+                    echo_wchar               curs_add_wch(3x)
+                    echochar                 curs_addch(3x)
+                    endwin                   curs_initscr(3x)
+                    erase                    curs_clear(3x)
+                    erasechar                curs_termattrs(3x)
+                    erasewchar               curs_termattrs(3x)
+                    exit_curses              curs_memleaks(3x)*
+                    exit_terminfo            curs_memleaks(3x)*
+                    extended_color_content   curs_color(3x)*
+                    extended_pair_content    curs_color(3x)*
+                    extended_slk_color       curs_slk(3x)*
+                    filter                   curs_util(3x)
+                    find_pair                new_pair(3x)*
+                    flash                    curs_beep(3x)
+                    flushinp                 curs_util(3x)
+                    free_pair                new_pair(3x)*
+                    get_escdelay             curs_threads(3x)*
+                    get_wch                  curs_get_wch(3x)
+                    get_wstr                 curs_get_wstr(3x)
+                    getattrs                 curs_attr(3x)
+                    getbegx                  curs_legacy(3x)*
+                    getbegy                  curs_legacy(3x)*
+                    getbegyx                 curs_getyx(3x)
+                    getbkgd                  curs_bkgd(3x)
+                    getbkgrnd                curs_bkgrnd(3x)
+                    getcchar                 curs_getcchar(3x)
+                    getch                    curs_getch(3x)
+                    getcurx                  curs_legacy(3x)*
+                    getcury                  curs_legacy(3x)*
+                    getmaxx                  curs_legacy(3x)*
+                    getmaxy                  curs_legacy(3x)*
+                    getmaxyx                 curs_getyx(3x)
+                    getmouse                 curs_mouse(3x)*
+                    getn_wstr                curs_get_wstr(3x)
+                    getnstr                  curs_getstr(3x)
+                    getparx                  curs_legacy(3x)*
+                    getpary                  curs_legacy(3x)*
+                    getparyx                 curs_getyx(3x)
+                    getstr                   curs_getstr(3x)
+                    getsyx                   curs_kernel(3x)
+                    getwin                   curs_util(3x)
+                    getyx                    curs_getyx(3x)
+                    halfdelay                curs_inopts(3x)
+                    has_colors               curs_color(3x)
+                    has_ic                   curs_termattrs(3x)
+                    has_il                   curs_termattrs(3x)
+                    has_key                  curs_getch(3x)*
+                    has_mouse                curs_mouse(3x)*
+                    hline                    curs_border(3x)
+                    hline_set                curs_border_set(3x)
+                    idcok                    curs_outopts(3x)
+                    idlok                    curs_outopts(3x)
+                    immedok                  curs_outopts(3x)
+                    in_wch                   curs_in_wch(3x)
+                    in_wchnstr               curs_in_wchstr(3x)
+                    in_wchstr                curs_in_wchstr(3x)
+                    inch                     curs_inch(3x)
+
+                    inchnstr                 curs_inchstr(3x)
+                    inchstr                  curs_inchstr(3x)
+                    init_color               curs_color(3x)
+                    init_extended_color      curs_color(3x)*
+                    init_extended_pair       curs_color(3x)*
+                    init_pair                curs_color(3x)
+                    initscr                  curs_initscr(3x)
+                    innstr                   curs_instr(3x)
+                    innwstr                  curs_inwstr(3x)
+                    ins_nwstr                curs_ins_wstr(3x)
+                    ins_wch                  curs_ins_wch(3x)
+                    ins_wstr                 curs_ins_wstr(3x)
+                    insch                    curs_insch(3x)
+                    insdelln                 curs_deleteln(3x)
+                    insertln                 curs_deleteln(3x)
+                    insnstr                  curs_insstr(3x)
+                    insstr                   curs_insstr(3x)
+                    instr                    curs_instr(3x)
+                    intrflush                curs_inopts(3x)
+                    inwstr                   curs_inwstr(3x)
+                    is_cbreak                curs_inopts(3x)*
+                    is_cleared               curs_opaque(3x)*
+                    is_echo                  curs_inopts(3x)*
+                    is_idcok                 curs_opaque(3x)*
+                    is_idlok                 curs_opaque(3x)*
+                    is_immedok               curs_opaque(3x)*
+                    is_keypad                curs_opaque(3x)*
+                    is_leaveok               curs_opaque(3x)*
+                    is_linetouched           curs_touch(3x)
+                    is_nl                    curs_inopts(3x)*
+                    is_nodelay               curs_opaque(3x)*
+                    is_notimeout             curs_opaque(3x)*
+                    is_pad                   curs_opaque(3x)*
+                    is_raw                   curs_inopts(3x)*
+                    is_scrollok              curs_opaque(3x)*
+                    is_subwin                curs_opaque(3x)*
+                    is_syncok                curs_opaque(3x)*
+                    is_term_resized          resizeterm(3x)*
+                    is_wintouched            curs_touch(3x)
+                    isendwin                 curs_initscr(3x)
+                    key_defined              key_defined(3x)*
+                    key_name                 curs_util(3x)
+                    keybound                 keybound(3x)*
+                    keyname                  curs_util(3x)
+                    keyok                    keyok(3x)*
+                    keypad                   curs_inopts(3x)
+                    killchar                 curs_termattrs(3x)
+                    killwchar                curs_termattrs(3x)
+                    leaveok                  curs_outopts(3x)
+                    longname                 curs_termattrs(3x)
+                    mcprint                  curs_print(3x)*
+                    meta                     curs_inopts(3x)
+                    mouse_trafo              curs_mouse(3x)*
+                    mouseinterval            curs_mouse(3x)*
+                    mousemask                curs_mouse(3x)*
+                    move                     curs_move(3x)
+                    mvadd_wch                curs_add_wch(3x)
+                    mvadd_wchnstr            curs_add_wchstr(3x)
+                    mvadd_wchstr             curs_add_wchstr(3x)
+                    mvaddch                  curs_addch(3x)
+                    mvaddchnstr              curs_addchstr(3x)
+                    mvaddchstr               curs_addchstr(3x)
+                    mvaddnstr                curs_addstr(3x)
+                    mvaddnwstr               curs_addwstr(3x)
+                    mvaddstr                 curs_addstr(3x)
+                    mvaddwstr                curs_addwstr(3x)
+
+                    mvchgat                  curs_attr(3x)
+                    mvcur                    curs_kernel(3x)
+                    mvdelch                  curs_delch(3x)
+                    mvderwin                 curs_window(3x)
+                    mvget_wch                curs_get_wch(3x)
+                    mvget_wstr               curs_get_wstr(3x)
+                    mvgetch                  curs_getch(3x)
+                    mvgetn_wstr              curs_get_wstr(3x)
+                    mvgetnstr                curs_getstr(3x)
+                    mvgetstr                 curs_getstr(3x)
+                    mvhline                  curs_border(3x)
+                    mvhline_set              curs_border_set(3x)
+                    mvin_wch                 curs_in_wch(3x)
+                    mvin_wchnstr             curs_in_wchstr(3x)
+                    mvin_wchstr              curs_in_wchstr(3x)
+                    mvinch                   curs_inch(3x)
+                    mvinchnstr               curs_inchstr(3x)
+                    mvinchstr                curs_inchstr(3x)
+                    mvinnstr                 curs_instr(3x)
+                    mvinnwstr                curs_inwstr(3x)
+                    mvins_nwstr              curs_ins_wstr(3x)
+                    mvins_wch                curs_ins_wch(3x)
+                    mvins_wstr               curs_ins_wstr(3x)
+                    mvinsch                  curs_insch(3x)
+                    mvinsnstr                curs_insstr(3x)
+                    mvinsstr                 curs_insstr(3x)
+                    mvinstr                  curs_instr(3x)
+                    mvinwstr                 curs_inwstr(3x)
+                    mvprintw                 curs_printw(3x)
+                    mvscanw                  curs_scanw(3x)
+                    mvvline                  curs_border(3x)
+                    mvvline_set              curs_border_set(3x)
+                    mvwadd_wch               curs_add_wch(3x)
+                    mvwadd_wchnstr           curs_add_wchstr(3x)
+                    mvwadd_wchstr            curs_add_wchstr(3x)
+                    mvwaddch                 curs_addch(3x)
+                    mvwaddchnstr             curs_addchstr(3x)
+                    mvwaddchstr              curs_addchstr(3x)
+                    mvwaddnstr               curs_addstr(3x)
+                    mvwaddnwstr              curs_addwstr(3x)
+                    mvwaddstr                curs_addstr(3x)
+                    mvwaddwstr               curs_addwstr(3x)
+                    mvwchgat                 curs_attr(3x)
+                    mvwdelch                 curs_delch(3x)
+                    mvwget_wch               curs_get_wch(3x)
+                    mvwget_wstr              curs_get_wstr(3x)
+                    mvwgetch                 curs_getch(3x)
+                    mvwgetn_wstr             curs_get_wstr(3x)
+                    mvwgetnstr               curs_getstr(3x)
+                    mvwgetstr                curs_getstr(3x)
+                    mvwhline                 curs_border(3x)
+                    mvwhline_set             curs_border_set(3x)
+                    mvwin                    curs_window(3x)
+                    mvwin_wch                curs_in_wch(3x)
+                    mvwin_wchnstr            curs_in_wchstr(3x)
+                    mvwin_wchstr             curs_in_wchstr(3x)
+                    mvwinch                  curs_inch(3x)
+                    mvwinchnstr              curs_inchstr(3x)
+                    mvwinchstr               curs_inchstr(3x)
+                    mvwinnstr                curs_instr(3x)
+                    mvwinnwstr               curs_inwstr(3x)
+                    mvwins_nwstr             curs_ins_wstr(3x)
+                    mvwins_wch               curs_ins_wch(3x)
+                    mvwins_wstr              curs_ins_wstr(3x)
+                    mvwinsch                 curs_insch(3x)
+                    mvwinsnstr               curs_insstr(3x)
+
+                    mvwinsstr                curs_insstr(3x)
+                    mvwinstr                 curs_instr(3x)
+                    mvwinwstr                curs_inwstr(3x)
+                    mvwprintw                curs_printw(3x)
+                    mvwscanw                 curs_scanw(3x)
+                    mvwvline                 curs_border(3x)
+                    mvwvline_set             curs_border_set(3x)
+                    napms                    curs_kernel(3x)
+                    newpad                   curs_pad(3x)
+                    newterm                  curs_initscr(3x)
+                    newwin                   curs_window(3x)
+                    nl                       curs_inopts(3x)
+                    nocbreak                 curs_inopts(3x)
+                    nodelay                  curs_inopts(3x)
+                    noecho                   curs_inopts(3x)
+                    nofilter                 curs_util(3x)*
+                    nonl                     curs_inopts(3x)
+                    noqiflush                curs_inopts(3x)
+                    noraw                    curs_inopts(3x)
+                    notimeout                curs_inopts(3x)
+                    overlay                  curs_overlay(3x)
+                    overwrite                curs_overlay(3x)
+                    pair_content             curs_color(3x)
+                    pecho_wchar              curs_pad(3x)
+                    pechochar                curs_pad(3x)
+                    pnoutrefresh             curs_pad(3x)
+                    prefresh                 curs_pad(3x)
+                    printw                   curs_printw(3x)
+                    putp                     curs_terminfo(3x)
+                    putwin                   curs_util(3x)
+                    qiflush                  curs_inopts(3x)
+                    raw                      curs_inopts(3x)
+                    redrawwin                curs_refresh(3x)
+                    refresh                  curs_refresh(3x)
+                    reset_color_pairs        curs_color(3x)*
+                    reset_prog_mode          curs_kernel(3x)
+                    reset_shell_mode         curs_kernel(3x)
+                    resetty                  curs_kernel(3x)
+                    resize_term              resizeterm(3x)*
+                    resizeterm               resizeterm(3x)*
+                    restartterm              curs_terminfo(3x)
+                    ripoffline               curs_kernel(3x)
+                    savetty                  curs_kernel(3x)
+                    scanw                    curs_scanw(3x)
+                    scr_dump                 curs_scr_dump(3x)
+                    scr_init                 curs_scr_dump(3x)
+                    scr_restore              curs_scr_dump(3x)
+                    scr_set                  curs_scr_dump(3x)
+                    scrl                     curs_scroll(3x)
+                    scroll                   curs_scroll(3x)
+                    scrollok                 curs_outopts(3x)
+                    set_curterm              curs_terminfo(3x)
+                    set_escdelay             curs_threads(3x)*
+                    set_tabsize              curs_threads(3x)*
+                    set_term                 curs_initscr(3x)
+                    setcchar                 curs_getcchar(3x)
+                    setscrreg                curs_outopts(3x)
+                    setsyx                   curs_kernel(3x)
+                    setupterm                curs_terminfo(3x)
+                    slk_attr                 curs_slk(3x)*
+                    slk_attr_off             curs_slk(3x)
+                    slk_attr_on              curs_slk(3x)
+                    slk_attr_set             curs_slk(3x)
+                    slk_attroff              curs_slk(3x)
+                    slk_attron               curs_slk(3x)
+                    slk_attrset              curs_slk(3x)
+
+                    slk_clear                curs_slk(3x)
+                    slk_color                curs_slk(3x)
+                    slk_init                 curs_slk(3x)
+                    slk_label                curs_slk(3x)
+                    slk_noutrefresh          curs_slk(3x)
+                    slk_refresh              curs_slk(3x)
+                    slk_restore              curs_slk(3x)
+                    slk_set                  curs_slk(3x)
+                    slk_touch                curs_slk(3x)
+                    slk_wset                 curs_slk(3x)
+                    standend                 curs_attr(3x)
+                    standout                 curs_attr(3x)
+                    start_color              curs_color(3x)
+                    subpad                   curs_pad(3x)
+                    subwin                   curs_window(3x)
+                    syncok                   curs_window(3x)
+                    term_attrs               curs_termattrs(3x)
+                    termattrs                curs_termattrs(3x)
+                    termname                 curs_termattrs(3x)
+                    tgetent                  curs_termcap(3x)
+                    tgetflag                 curs_termcap(3x)
+                    tgetnum                  curs_termcap(3x)
+                    tgetstr                  curs_termcap(3x)
+                    tgoto                    curs_termcap(3x)
+                    tigetflag                curs_terminfo(3x)
+                    tigetnum                 curs_terminfo(3x)
+                    tigetstr                 curs_terminfo(3x)
+                    timeout                  curs_inopts(3x)
+                    tiparm                   curs_terminfo(3x)
+                    tiparm_s                 curs_terminfo(3x)*
+                    tiscan_s                 curs_terminfo(3x)*
+                    touchline                curs_touch(3x)
+                    touchwin                 curs_touch(3x)
+                    tparm                    curs_terminfo(3x)
+                    tputs                    curs_termcap(3x)
+                    tputs                    curs_terminfo(3x)
+                    trace                    curs_trace(3x)*
+                    typeahead                curs_inopts(3x)
+                    unctrl                   curs_util(3x)
+                    unget_wch                curs_get_wch(3x)
+                    ungetch                  curs_getch(3x)
+                    ungetmouse               curs_mouse(3x)*
+                    untouchwin               curs_touch(3x)
+                    use_default_colors       default_colors(3x)*
+                    use_env                  curs_util(3x)
+                    use_extended_names       curs_extend(3x)*
+                    use_legacy_coding        legacy_coding(3x)*
+                    use_screen               curs_threads(3x)*
+                    use_tioctl               curs_util(3x)*
+                    use_window               curs_threads(3x)*
+                    vid_attr                 curs_terminfo(3x)
+                    vid_puts                 curs_terminfo(3x)
+                    vidattr                  curs_terminfo(3x)
+                    vidputs                  curs_terminfo(3x)
+                    vline                    curs_border(3x)
+                    vline_set                curs_border_set(3x)
+                    vw_printw                curs_printw(3x)
+                    vw_scanw                 curs_scanw(3x)
+                    vwprintw                 curs_printw(3x)
+                    vwscanw                  curs_scanw(3x)
+                    wadd_wch                 curs_add_wch(3x)
+                    wadd_wchnstr             curs_add_wchstr(3x)
+                    wadd_wchstr              curs_add_wchstr(3x)
+                    waddch                   curs_addch(3x)
+                    waddchnstr               curs_addchstr(3x)
+                    waddchstr                curs_addchstr(3x)
+
+                    waddnstr                 curs_addstr(3x)
+                    waddnwstr                curs_addwstr(3x)
+                    waddstr                  curs_addstr(3x)
+                    waddwstr                 curs_addwstr(3x)
+                    wattr_get                curs_attr(3x)
+                    wattr_off                curs_attr(3x)
+                    wattr_on                 curs_attr(3x)
+                    wattr_set                curs_attr(3x)
+                    wattroff                 curs_attr(3x)
+                    wattron                  curs_attr(3x)
+                    wattrset                 curs_attr(3x)
+                    wbkgd                    curs_bkgd(3x)
+                    wbkgdset                 curs_bkgd(3x)
+                    wbkgrnd                  curs_bkgrnd(3x)
+                    wbkgrndset               curs_bkgrnd(3x)
+                    wborder                  curs_border(3x)
+                    wborder_set              curs_border_set(3x)
+                    wchgat                   curs_attr(3x)
+                    wclear                   curs_clear(3x)
+                    wclrtobot                curs_clear(3x)
+                    wclrtoeol                curs_clear(3x)
+                    wcolor_set               curs_attr(3x)
+                    wcursyncup               curs_window(3x)
+                    wdelch                   curs_delch(3x)
+                    wdeleteln                curs_deleteln(3x)
+                    wecho_wchar              curs_add_wch(3x)
+                    wechochar                curs_addch(3x)
+                    wenclose                 curs_mouse(3x)*
+                    werase                   curs_clear(3x)
+                    wget_wch                 curs_get_wch(3x)
+                    wget_wstr                curs_get_wstr(3x)
+                    wgetbkgrnd               curs_bkgrnd(3x)
+                    wgetch                   curs_getch(3x)
+                    wgetdelay                curs_opaque(3x)*
+                    wgetn_wstr               curs_get_wstr(3x)
+                    wgetnstr                 curs_getstr(3x)
+                    wgetparent               curs_opaque(3x)*
+                    wgetscrreg               curs_opaque(3x)*
+                    wgetstr                  curs_getstr(3x)
+                    whline                   curs_border(3x)
+                    whline_set               curs_border_set(3x)
+                    win_wch                  curs_in_wch(3x)
+                    win_wchnstr              curs_in_wchstr(3x)
+                    win_wchstr               curs_in_wchstr(3x)
+                    winch                    curs_inch(3x)
+                    winchnstr                curs_inchstr(3x)
+                    winchstr                 curs_inchstr(3x)
+                    winnstr                  curs_instr(3x)
+                    winnwstr                 curs_inwstr(3x)
+                    wins_nwstr               curs_ins_wstr(3x)
+                    wins_wch                 curs_ins_wch(3x)
+                    wins_wstr                curs_ins_wstr(3x)
+                    winsch                   curs_insch(3x)
+                    winsdelln                curs_deleteln(3x)
+                    winsertln                curs_deleteln(3x)
+                    winsnstr                 curs_insstr(3x)
+                    winsstr                  curs_insstr(3x)
+                    winstr                   curs_instr(3x)
+                    winwstr                  curs_inwstr(3x)
+                    wmouse_trafo             curs_mouse(3x)*
+                    wmove                    curs_move(3x)
+                    wnoutrefresh             curs_refresh(3x)
+                    wprintw                  curs_printw(3x)
+                    wredrawln                curs_refresh(3x)
+                    wrefresh                 curs_refresh(3x)
+                    wresize                  wresize(3x)*
+
+                    wscanw                   curs_scanw(3x)
+                    wscrl                    curs_scroll(3x)
+                    wsetscrreg               curs_outopts(3x)
+                    wstandend                curs_attr(3x)
+                    wstandout                curs_attr(3x)
+                    wsyncdown                curs_window(3x)
+                    wsyncup                  curs_window(3x)
+                    wtimeout                 curs_inopts(3x)
+                    wtouchln                 curs_touch(3x)
+                    wunctrl                  curs_util(3x)
+                    wvline                   curs_border(3x)
+                    wvline_set               curs_border_set(3x)
+
+       ncurses's    screen-pointer   extension   adds   additional   functions
+       corresponding to many of the above, each  with  an  "_sp"  suffix;  see
+       curs_sp_funcs(3x).
+
+       The  availability  of  some  extensions is configurable when ncurses is
+       compiled; see  sections  "ALTERNATE  CONFIGURATIONS"  and  "EXTENSIONS"
+       below.
+
+
+

RETURN VALUE

+       Unless  otherwise  noted,  functions  that  return  integers return the
+       constants OK on success and ERR  on  failure;  see  curs_variables(3x).
+       Functions  that  return  pointers  return  NULL on failure.  Typically,
+       ncurses treats a null pointer passed  as  a  function  parameter  as  a
+       failure.   Functions  prefixed  with "mv" first perform cursor movement
+       and fail if the position (y, x) is outside the window boundaries.
+
+
+

ENVIRONMENT

+       The following  symbols  from  the  process  environment  customize  the
+       runtime   behavior   of  ncurses  applications.   The  library  may  be
+       configured  to  disregard  the   variables   TERMINFO,   TERMINFO_DIRS,
+       TERMPATH,  and  HOME,  if  the  user  is  the  superuser (root), or the
+       application uses setuid(2) or setgid(2).
+
+
+

BAUDRATE

+       The debugging library checks this variable  when  the  application  has
+       redirected  output to a file.  ncurses interprets its integral value as
+       the terminal's line speed in bits per second.  If that value is  absent
+       or  invalid,  ncurses  uses  9600.   This  feature allows developers to
+       construct repeatable test cases that  take  into  account  optimization
+       decisions that depend on the terminal's line speed.
+
+
+

CC (command character)

+       When  set,  the  command_character  (cmdch)  capability value of loaded
+       terminfo entries changes to the value of this variable.  Very few term-
+       info entries provide this feature.
+
+       Because this name is also used in development environments to store the
+       C compiler's name, ncurses ignores its value if it is not one character
+       in length.
+
+
+

COLUMNS

+       This  variable  specifies  the  width  of  the  screen  in  characters.
+       Applications running in a windowing environment  usually  are  able  to
+       obtain  the  width  of the window in which they are executing.  ncurses
+       enforces an upper limit of 512 when reading the value.  If  COLUMNS  is
+       not  defined  and  the terminal's screen size is not available from the
+       terminal driver, ncurses uses the size specified by the columns  (cols)
+       capability  of  the  terminal type's entry in the terminfo database, if
+       any.
+
+       It is important that your application  use  the  correct  screen  size.
+       Automatic   detection   thereof  is  not  always  possible  because  an
+       application may  be  running  on  a  host  that  does  not  honor  NAWS
+       (Negotiations  About  Window  Size)  or as a different user ID than the
+       owner of the  terminal  device  file.   Setting  COLUMNS  and/or  LINES
+       overrides  the  library's  use  of  the  screen  size obtained from the
+       operating system.
+
+       The COLUMNS and LINES variables may be specified  independently.   This
+       property  is  useful  to circumvent misfeatures of legacy terminal type
+       descriptions; xterm(1)  descriptions  specifying  65  lines  were  once
+       notorious.    For   best  results,  avoid  specifying  cols  and  lines
+       capability codes in terminfo descriptions of terminal emulators.
+
+       use_env(3x) can disable use of the process environment  in  determining
+       the  screen size.  use_tioctl(3x) can update COLUMNS and LINES to match
+       the screen size obtained from system calls or the terminal database.
+
+
+

ESCDELAY

+       For curses to distinguish the ESC character  resulting  from  a  user's
+       press  of  the  "Escape"  key on the input device from one beginning an
+       escape sequence (as commonly produced by function keys), it waits after
+       receiving  the  escape  character  to  see  if  further  characters are
+       available on the input  stream  within  a  short  interval.   A  global
+       variable  ESCDELAY  stores  this interval in milliseconds.  The default
+       value of 1000 (one second) is adequate for most uses.  This environment
+       variable  overrides  it;  ncurses enforces an upper limit of 30,000 (30
+       seconds) when reading the value.
+
+       The most common instance where you may wish to change this value is  to
+       work with a remote host over a slow communication channel.  If the host
+       running a curses application does not  receive  the  characters  of  an
+       escape  sequence  in a timely manner, the library can interpret them as
+       multiple key stroke events.
+
+       xterm(1) mouse events are a form of escape sequence; therefore, if your
+       application  makes  heavy  use  of  multiple-clicking,  you may wish to
+       lengthen the default value because the delay applies to  the  composite
+       multi-click event as well as the individual clicks.
+
+       Portable  applications should not rely upon the presence of ESCDELAY in
+       either form, but setting  the  environment  variable  rather  than  the
+       global variable does not create problems when compiling an application.
+
+       If  keypad(3x)  is  disabled  for  the curses window receiving input, a
+       program must disambiguate escape sequences itself.
+
+
+

HOME

+       ncurses may read and write auxiliary terminal descriptions in  .termcap
+       and .terminfo files in the user's home directory.
+
+
+

LINES

+       This  counterpart  to  COLUMNS  specifies  the  height of the screen in
+       characters.  The corresponding terminfo capability and code  is  lines.
+       See the description of the COLUMNS variable above.
+
+
+

MOUSE_BUTTONS_123

+       (OS/2  EMX  port only) OS/2 numbers a three-button mouse inconsistently
+       with other platforms, such that 1 is the left button, 2 the right,  and
+       3  the  middle.   This  variable customizes the mouse button numbering.
+       Its value must be three digits 1-3 in any order.  By  default,  ncurses
+       assumes a numbering of "132".
+
+
+

NCURSES_ASSUMED_COLORS

+       If  set,  this  variable  overrides  the  ncurses library's compiled-in
+       assumption that the terminal's default colors are white on  black;  see
+       default_colors(3x).   Set  the  foreground  and background color values
+       with this environment variable  by  assigning  it  two  integer  values
+       separated  by  a  comma,  indicating  foregound  and  background  color
+       numbers, respectively.
+
+       For example, to tell ncurses not to assume anything about  the  colors,
+       use  a  value  of  "-1,-1".   To make the default color scheme green on
+       black, use "2,0".  ncurses accepts integral values from -1  up  to  the
+       value of the terminfo max_colors (colors) capability.
+
+
+

NCURSES_CONSOLE2

+       (MinGW   port  only)  The  Console2  program  defectively  handles  the
+       Microsoft Console  API  call  CreateConsoleScreenBuffer.   Applications
+       that  use it will hang.  However, it is possible to simulate the action
+       of this call by mapping coordinates, explicitly  saving  and  restoring
+       the  original  screen contents.  Setting the environment variable NCGDB
+       has the same effect.
+
+
+

NCURSES_GPM_TERMS

+       (Linux only) When ncurses is configured to use the GPM interface,  this
+       variable  may  list  one  or  more  terminal  type  names, delimited by
+       vertical bars (|) or colons (:), against which the TERM  variable  (see
+       below)  is  matched.   An empty value disables the GPM interface, using
+       ncurses's built-in support for xterm(1) mouse  protocols  instead.   If
+       the  variable  is absent, ncurses attempts to open GPM if TERM contains
+       "linux".
+
+
+

NCURSES_NO_HARD_TABS

+       ncurses may use tab characters in  cursor  movement  optimization.   In
+       some  cases,  your  terminal  driver may not handle them properly.  Set
+       this environment variable to any value to disable the feature.  You can
+       also adjust your stty(1) settings to avoid the problem.
+
+
+

NCURSES_NO_MAGIC_COOKIE

+       Many  terminals  store  video  attributes  as a property of a character
+       cell, as curses does.  Historically, some  recorded  changes  in  video
+       attributes  as  data  that  logically  occupies  character cells on the
+       display, switching attributes on or off, similarly to tags in a  markup
+       language;  these  are  termed "magic cookies", and must be subsequently
+       overprinted.  If the terminfo entry for your  terminal  type  does  not
+       adequately describe its handling of magic cookies, set this variable to
+       any value to instruct ncurses to disable attributes entirely.
+
+
+

NCURSES_NO_PADDING

+       Most  terminal  type  descriptions  in  the  terminfo  database  detail
+       hardware   devices.   Many  people  use  curses-based  applications  in
+       terminal emulator programs that run in a windowing environment.   These
+       programs  can  duplicate  all  of  the important features of a hardware
+       terminal, but often lack their limitations.  Chief among  these  absent
+       drawbacks is the problem of data flow management; that is, limiting the
+       speed of communication to what the hardware  could  handle.   Unless  a
+       hardware  terminal  is  interfaced  into a terminal concentrator (which
+       does flow control), an application must manage flow itself  to  prevent
+       overruns and data loss.
+
+       A  solution  that  comes  at  no hardware cost is for an application to
+       pause after directing a  terminal  to  execute  an  operation  that  it
+       performs  slowly,  such  as  clearing  the display.  Many terminal type
+       descriptions, including that for the VT100, embed delay  specifications
+       in  capabilities.   You  may  wish  to  use these terminal descriptions
+       without paying the performance penalty.  Set NCURSES_NO_PADDING to  any
+       value  to disable all but mandatory padding.  Mandatory padding is used
+       by such terminal capabilities as flash_screen (flash).
+
+
+

NCURSES_NO_SETBUF

+       (Obsolete) Prior to internal changes developed in ncurses 5.9  (patches
+       20120825  through 20130126), the library used setbuf(3) to enable fully
+       buffered output when initializing the terminal.  This was done,  as  in
+       SVr4  curses,  to  increase performance.  For testing purposes, both of
+       ncurses and of certain applications, this feature  was  made  optional.
+       Setting  this  variable  disabled  output buffering, leaving the output
+       stream in the original (usually line-buffered) mode.
+
+       Nowadays, ncurses performs its own buffering and does not require  this
+       workaround;  it  does  not  modify the buffering of the standard output
+       stream.  This approach makes signal handling, as for  interrupts,  more
+       robust.   A  drawback  is  that  certain  unconventional programs mixed
+       stdio(3) calls with ncurses calls and (usually) got the  behavior  they
+       expected.   This  is  no longer the case; ncurses does not write to the
+       standard output file descriptor through a stdio-buffered stream.
+
+       As a special case, low-level API calls such as putp(3x) still  use  the
+       standard  output stream.  High-level curses calls such as printw(3x) do
+       not.
+
+
+

NCURSES_NO_UTF8_ACS

+       At initialization, ncurses inspects the TERM environment  variable  for
+       special   cases   where   VT100   forms-drawing   characters  (and  the
+       corresponding alternate character set terminfo capabilities) are  known
+       to  be  unsupported  by  terminal  types  that  otherwise  claim  VT100
+       compatibility.  Specifically, when running in a UTF-8 locale, the Linux
+       virtual  console device and the GNU screen(1) program ignore them.  Set
+       this  variable  to  a  nonzero  value  to  instruct  ncurses  that  the
+       terminal's ACS support is broken; the library then outputs Unicode code
+       points that correspond to the forms-drawing characters.  Set it to zero
+       (or a non-integer) to disable the special check for terminal type names
+       matching "linux" or "screen", directing ncurses to assume that the  ACS
+       feature works if the terminal type description advertises it.
+
+       As  an  alternative  to  use  of  this  variable, ncurses checks for an
+       extended terminfo numeric capability U8 that can be compiled using "tic
+       -x".  Examples follow.
+
+          # linux console, if patched to provide working
+          # VT100 shift-in/shift-out, with corresponding font.
+          linux-vt100|linux console with VT100 line-graphics,
+                  U8#0, use=linux,
+
+          # uxterm with vt100Graphics resource set to false
+          xterm-utf8|xterm relying on UTF-8 line-graphics,
+                  U8#1, use=xterm,
+
+       The  two-character name "U8" was chosen to permit its use via ncurses's
+       termcap interface.
+
+
+

NCURSES_TRACE

+       At initialization, ncurses (in its debugging configuration) checks  for
+       this  variable's  presence.   If  defined  with  an integral value, the
+       library calls curses_trace(3x) with that value as the argument.
+
+
+

TERM

+       The TERM variable denotes the terminal type.  Each is distinct,  though
+       many  are  similar.   It  is commonly set by terminal emulators to help
+       applications find a  workable  terminal  description.   Some  choose  a
+       popular  approximation  such as "ansi", "vt100", or "xterm" rather than
+       an exact fit to their capabilities.  Not infrequently,  an  application
+       will  have  problems  with that approach; for example, a key stroke may
+       not operate  correctly,  or  produce  no  effect  but  seeming  garbage
+       characters on the screen.
+
+       Setting  TERM  has  no effect on hardware operation; it affects the way
+       applications communicate with the terminal.   Likewise,  as  a  general
+       rule  (xterm(1)  being a rare exception), terminal emulators that allow
+       you to specify TERM as a parameter or configuration value do not change
+       their behavior to match that setting.
+
+
+

TERMCAP

+       If ncurses is configured with termcap support, it checks for a terminal
+       type description in termcap format if one in  terminfo  format  is  not
+       available.   Setting  this variable directs ncurses to ignore the usual
+       termcap database location, /etc/termcap; see TERMPATH  below.   TERMCAP
+       should  contain  either  a terminal description (with newlines stripped
+       out), or a file name indicating where the information required  by  the
+       TERM environment variable is stored.
+
+
+

TERMINFO

+       ncurses  can  be configured to read terminal type description databases
+       in various locations using different formats.  This variable  overrides
+       the default location.
+
+       o   Descriptions  in terminfo format are normally stored in a directory
+           tree using subdirectories named for the common first letters of the
+           terminal types named therein.  This is the scheme used in System V.
+
+       o   If ncurses is configured to use hashed databases, then TERMINFO may
+           name its location,  such  as  /usr/share/terminfo.db,  rather  than
+           /usr/share/terminfo/.
+
+       The  hashed  database  uses less disk space and is a little faster than
+       the directory tree.  However, some applications assume the existence of
+       the directory tree, and read it directly rather than using the terminfo
+       API.
+
+       o   If ncurses is configured with termcap support,  this  variable  may
+           contain the location of a termcap file.
+
+       o   If the value of TERMINFO begins with "hex:" or "b64:", ncurses uses
+           the remainder of the value as a compiled terminfo description.  You
+           might produce the base64 format using infocmp(1m).
+
+                  TERMINFO=$(infocmp -0 -Q2 -q)
+                  export TERMINFO
+
+           The  compiled  description  is  used  only if it corresponds to the
+           terminal type identified by TERM.
+
+       Setting TERMINFO is the simplest, but  not  the  only,  way  to  direct
+       ncurses to a terminal database.  The search path is as follows.
+
+       o   the last terminal database to which the running ncurses application
+           wrote, if any
+
+       o   the location specified by the TERMINFO environment variable
+
+       o   $HOME/.terminfo
+
+       o   locations listed in the TERMINFO_DIRS environment variable
+
+       o   location(s) configured and compiled into ncurses
+
+           o   /usr/share/terminfo
+
+
+

TERMINFO_DIRS

+       This variable specifies a list of locations, akin  to  PATH,  in  which
+       ncurses  searches  for  the  terminal  type  descriptions  described by
+       TERMINFO above.  The list items are separated by  colons  on  Unix  and
+       semicolons  on  OS/2  EMX.   System V  terminfo  lacks  a corresponding
+       feature; TERMINFO_DIRS is an ncurses extension.
+
+
+

TERMPATH

+       If TERMCAP does not hold a terminal type description or file name, then
+       ncurses  checks  the contents of TERMPATH, a list of locations, akin to
+       PATH, in which it searches for termcap terminal type descriptions.  The
+       list items are separated by colons on Unix and semicolons on OS/2 EMX.
+
+       If both TERMCAP and TERMPATH are unset or invalid, ncurses searches for
+       the files /etc/termcap, /usr/share/misc/termcap, and $HOME/.termcap, in
+       that order.
+
+
+

ALTERNATE CONFIGURATIONS

+       Many  different  ncurses configurations are possible, determined by the
+       options given to the configure script when building the  library.   Run
+       the  script  with  the  --help option to peruse them all.  A few are of
+       particular significance to the application developer employing ncurses.
+
+       --disable-overwrite
+            The standard C preprocessor inclusion for the curses library is as
+            follows.
+
+                #include <curses.h>
+
+            This  option  is used to avoid file name conflicts between ncurses
+            and an existing curses installation on the system.  If ncurses  is
+            installed  disabling  overwrite,  it  puts  its  header files in a
+            subdirectory.  Here is an example.
+
+                #include <ncurses/curses.h>
+
+            Installation also omits a  symbolic  link  that  would  cause  the
+            compiler's  -lcurses  option  to  link  object  files with ncurses
+            instead of the system curses library.
+
+            The directory used by this configuration of ncurses  is  shown  in
+            section "SYNOPSIS" above.
+
+       --enable-widec
+            The   configure   script   renames   the   library   and  (if  the
+            --disable-overwrite option is used) puts the  header  files  in  a
+            different  subdirectory.   All  of  the  library  names have a "w"
+            appended to them, i.e., instead of
+
+                -lncurses
+
+            you link with
+
+                -lncursesw
+
+            You must also enable the wide-character  features  in  the  header
+            file  when  compiling  for  the  wide-character library to use the
+            extended (wide-character) functions.   The  symbol  which  enables
+            these features has changed since X/Open Curses, Issue 4:
+
+            o   Originally,  the  wide-character  feature  required the symbol
+                _XOPEN_SOURCE_EXTENDED  but  that  was  only  valid  for  XPG4
+                (1996).
+
+            o   Later,  that was deemed conflicting with _XOPEN_SOURCE defined
+                to 500.
+
+            o   As of mid-2018, none of the features  in  this  implementation
+                require  a  _XOPEN_SOURCE  feature greater than 600.  However,
+                X/Open Curses, Issue 7 (2009) recommends defining it to 700.
+
+            o   Alternatively,  you  can  enable  the  feature   by   defining
+                NCURSES_WIDECHAR  with  the caveat that some other header file
+                than curses.h may require a specific value  for  _XOPEN_SOURCE
+                (or a system-specific symbol).
+
+            The  curses.h header file installed for the wide-character library
+            is designed to be compatible with the non-wide  library's  header.
+            Only  the  size  of the WINDOW structure differs; few applications
+            require more than pointers to WINDOWs.
+
+            If  the  headers  are  installed  allowing  overwrite,  the  wide-
+            character  library's  headers  should  be installed last, to allow
+            applications to be built using either library from the same set of
+            headers.
+
+       --with-pthread
+            The  configure  script  renames  the  library.  All of the library
+            names have a "t"  appended  to  them  (before  any  "w"  added  by
+            --enable-widec).
+
+            The global variables such as LINES are replaced by macros to allow
+            read-only access.  At the same time, setter-functions are provided
+            to  set  these  values.   Some applications (very few) may require
+            changes to work with this convention.
+
+       --with-shared
+       --with-normal
+       --with-debug
+       --with-profile
+            The shared and normal  (static)  library  names  differ  by  their
+            suffixes,  e.g.,  libncurses.so  and  libncurses.a.  The debug and
+            profiling libraries add a "_g"  and  a  "_p"  to  the  root  names
+            respectively, e.g., libncurses_g.a and libncurses_p.a.
+
+       --with-termlib
+            Low-level  functions  which do not depend upon whether the library
+            supports wide-characters, are provided in the tinfo library.
+
+            By doing this, it is possible to share the tinfo  library  between
+            wide/normal  configurations  as  well  as  reduce  the size of the
+            library when only low-level functions are needed.
+
+            Those functions are described in these pages:
+
+            o   curs_extend(3x) - miscellaneous curses extensions
+
+            o   curs_inopts(3x) - curses input options
+
+            o   curs_kernel(3x) - low-level curses routines
+
+            o   curs_termattrs(3x) - curses environment query routines
+
+            o   curs_termcap(3x) - curses emulation of termcap
+
+            o   curs_terminfo(3x) - curses interface to terminfo database
+
+            o   curs_util(3x) - miscellaneous curses utility routines
+
+       --with-trace
+            The trace function normally resides in the debug library,  but  it
+            is  sometimes  useful  to  configure  this  in the shared library.
+            Configure scripts should check for the function's existence rather
+            than assuming it is always in the debug library.
+
+
+

FILES

+       /usr/share/tabset
+              tab stop initialization database
+
+       /usr/share/terminfo
+              compiled terminal capability database
+
+
+

NOTES

+       X/Open  Curses permits most functions it specifies to be made available
+       as macros as well.  ncurses does so
+
+       o   for functions that return values via their parameters,
+
+       o   to support obsolete features,
+
+       o   to reuse functions (for example, those that move the cursor  before
+           another operation), and
+
+       o   in a few special cases.
+
+       If  the  standard  output  file  descriptor  of  an  ncurses program is
+       redirected to something that is not  a  terminal  device,  the  library
+       writes  screen updates to the standard error file descriptor.  This was
+       an undocumented feature of SVr3 curses.
+
+       See subsection  "Header  Files"  below  regarding  symbols  exposed  by
+       inclusion of curses.h.
+
+
+

EXTENSIONS

+       ncurses  enables  an  application  to  capture  mouse events on certain
+       terminals, including xterm(1); see curs_mouse(3x).
+
+       ncurses provides a means of responding to window  resizing  events,  as
+       when  running in a GUI terminal emulator application such as xterm; see
+       resizeterm(3x) and wresize(3x).
+
+       ncurses allows an application to query the terminal for the presence of
+       a wide variety of special keys; see has_key(3x).
+
+       ncurses extends the fixed set of function key capabilities specified by
+       X/Open  Curses  by  allowing  the  application  programmer  to   define
+       additional  key events at runtime; see define_key(3x), key_defined(3x),
+       keybound(3x), and keyok(3x).
+
+       ncurses  can  exploit  the  capabilities  of   terminals   implementing
+       ISO 6429/ECMA-48   SGR 39   and   SGR 49   sequences,  which  allow  an
+       application to reset  the  terminal  to  its  original  foreground  and
+       background  colors.  From a user's perspective, the application is able
+       to draw colored text on a background whose color is set  independently,
+       providing better control over color contrasts.  See default_colors(3x).
+
+       An  ncurses  application  can  eschew  knowledge  of  SCREEN and WINDOW
+       structure  internals,  instead  using  accessor   functions   such   as
+       is_cbreak(3x) and is_scrollok(3x).
+
+       ncurses  enables  an  application  to  direct  its  output to a printer
+       attached to the terminal device; see curs_print(3x).
+
+       ncurses offers slk_attr(3x) as a counterpart of attr_get(3x) for  soft-
+       label  key lines, and extended_slk_color(3x) as a form of slk_color(3x)
+       that can gather color  information  from  them  when  many  colors  are
+       supported.
+
+       ncurses    permits   modification   of   unctrl(3x)'s   behavior;   see
+       use_legacy_coding(3x).
+
+       Rudimentary support for multi-threaded applications may  be  available;
+       see curs_threads(3x).
+
+       Functions  that ease the management of multiple screens can be exposed;
+       see curs_sp_funcs(3x).
+
+       To aid applications to debug their  memory  usage,  ncurses  optionally
+       offers  functions  to  more  aggressively  free  memory  it dynamically
+       allocates itself; see curs_memleaks(3x).
+
+       The library facilitates auditing and troubleshooting of  its  behavior;
+       see curs_trace(3x).
+
+       Compiling  ncurses  with the option -DUSE_GETCAP causes it to fall back
+       to reading /etc/termcap if the terminal setup code cannot find a  term-
+       info  entry  corresponding  to  TERM.   Use  of  this  feature  is  not
+       recommended, as it essentially includes an entire termcap  compiler  in
+       the  ncurses  startup  code,  at a cost in memory usage and application
+       launch latency.
+
+       PDCurses  and  NetBSD  curses  incorporate  some  ncurses   extensions.
+       Individual man pages indicate where this is the case.
+
+
+

PORTABILITY

+       X/Open Curses defines two levels of conformance, "base" and "enhanced".
+       The latter includes several additional features, such as wide-character
+       and  color support.  ncurses intends base-level conformance with X/Open
+       Curses, and supports all features of  its  enhanced  level  except  the
+       untic utility.
+
+       Differences  between  X/Open  Curses  and ncurses are documented in the
+       "PORTABILITY" sections of applicable man pages.
+
+
+

Error Checking

+       In many cases, X/Open Curses is vague about error conditions,  omitting
+       some of the SVr4 documentation.
+
+       Unlike  other  implementations, ncurses checks pointer parameters, such
+       as those to WINDOW structures, to ensure that they are not null.   This
+       is  done  primarily  to  guard  against programmer error.  The standard
+       interface does not provide a way for the library to tell an application
+       which  of several possible errors occurred.  An application that relies
+       on ncurses to check its function parameters  for  validity  limits  its
+       portability and robustness.
+
+
+

Padding Differences

+       In  historical  curses implementations, delays embedded in the terminfo
+       capabilities carriage_return (cr),  scroll_forward  (ind),  cursor_left
+       (cub1), form_feed (ff), and tab (ht) activated corresponding delay bits
+       in the Unix terminal driver.  ncurses performs all padding  by  sending
+       NUL  bytes  to the device.  This method is slightly more expensive, but
+       narrows  the  interface  to   the   Unix   kernel   significantly   and
+       correspondingly increases the package's portability.
+
+
+

Header Files

+       The  header  file curses.h itself includes the header files stdio.h and
+       unctrl.h.
+
+       X/Open Curses has more to say,
+
+           The inclusion of curses.h may make visible  all  symbols  from  the
+           headers stdio.h, term.h, termios.h, and wchar.h.
+
+       but does not finish the story.  A more complete account follows.
+
+       o   The first curses, in 4BSD, provided a curses.h file.
+
+           BSD  curses  code  included  curses.h and unctrl.h from an internal
+           header file curses.ext, where "ext" abbreviated "externs".
+
+           The implementations of printw and scanw used undocumented  internal
+           functions  of  the  standard I/O library (_doprnt and _doscan), but
+           nothing in curses.h itself relied upon stdio.h.
+
+       o   SVr2 curses added newterm, which relies upon  stdio.h  because  its
+           function prototype employs the FILE type.
+
+           SVr4 curses added putwin and getwin, which also use stdio.h.
+
+           X/Open Curses specifies all three of these functions.
+
+           SVr4  curses  and  X/Open  Curses  do  not require the developer to
+           include stdio.h before curses.h.  Both document use  of  curses  as
+           requiring only curses.h.
+
+           As a result, standard curses.h always includes stdio.h.
+
+       o   X/Open  Curses  and  SVr4  curses  are inconsistent with respect to
+           unctrl.h.
+
+           As noted in curs_util(3x), ncurses includes unctrl.h from  curses.h
+           (as SVr4 does).
+
+       o   X/Open  Curses's  comments  about term.h and termios.h may refer to
+           HP-UX and AIX.
+
+           HP-UX curses includes term.h from curses.h to declare setupterm  in
+           curses.h, but ncurses and Solaris curses do not.
+
+           AIX  curses  includes  term.h  and  termios.h.   Again, ncurses and
+           Solaris curses do not.
+
+       o   X/Open Curses says that curses.h may include term.h, but  does  not
+           require it to do so.
+
+           Some  programs  use functions declared in both curses.h and term.h,
+           and must include both header files in the same  module.   Very  old
+           versions  of  AIX  curses  required  inclusion  of  curses.h before
+           term.h.
+
+           The header files supplied by ncurses include the  standard  library
+           headers  required  for  its  declarations,  so ncurses's own header
+           files can be included in any order.  For portability  even  to  old
+           AIX systems, include curses.h before term.h.
+
+       o   X/Open  Curses  says  "may make visible" because including a header
+           file does not necessarily make visible all of  the  symbols  in  it
+           (consider #ifdef and similar).
+
+           For  instance, ncurses's curses.h may include wchar.h if the proper
+           symbol is defined, and if ncurses is configured for  wide-character
+           support.   If  wchar.h is included, its symbols may be made visible
+           depending on the value of the _XOPEN_SOURCE feature test macro.
+
+       o   X/Open Curses mandates an application's inclusion of one standard C
+           library  header  in  a  special  case:  stdarg.h before curses.h to
+           prototype the functions vw_printw and  vw_scanw  (as  well  as  the
+           obsolete  vwprintw  and  vwscanw).   Each of these takes a variadic
+           argument list, a va_list parameter, like that of printf(3).
+
+           SVr3 curses introduced  the  two  obsolete  functions,  and  X/Open
+           Curses  the  others.   In  between,  SVr4  curses  provided for the
+           possibility that an application might include either  varargs.h  or
+           stdarg.h.   These  represented  contrasting  approaches to handling
+           variadic argument lists.  The older interface,  varargs.h,  used  a
+           pointer  to char for variadic functions' va_list parameter.  Later,
+           the list acquired its own standard data type, va_list,  defined  in
+           stdarg.h,  empowering the compiler to check the types of a function
+           call's actual parameters against the formal ones  declared  in  its
+           prototype.
+
+           No   conforming   implementations   of  X/Open  Curses  require  an
+           application to include stdarg.h before curses.h because they either
+           have  allowed  for  a  special type, or, like ncurses, they include
+           stdarg.h themselves to provide a portable interface.
+
+
+

AUTHORS

+       Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.  Based on pcurses
+       by Pavel Curtis.
+
+
+

SEE ALSO

+       curs_variables(3x), terminfo(5), user_caps(5)
+
+
+
+ncurses 6.5                       2024-09-21                       ncurses(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/ncursesw6-config.1.html b/contrib/ncurses/doc/html/man/ncursesw6-config.1.html new file mode 100644 index 00000000..61748865 --- /dev/null +++ b/contrib/ncurses/doc/html/man/ncursesw6-config.1.html @@ -0,0 +1,127 @@ + + + + + + +ncursesw6\-config 1 2024-05-11 ncurses 6.5 User commands + + + + +

ncursesw6\-config 1 2024-05-11 ncurses 6.5 User commands

+
+ncursesw6-config(1)              User commands             ncursesw6-config(1)
+
+
+
+
+

NAME

+       ncursesw6-config - configuration helper for ncurses libraries
+
+
+

SYNOPSIS

+       ncursesw6-config option ...
+
+       ncursesw6-config --version
+
+       ncursesw6-config --help
+
+
+

DESCRIPTION

+       This  program  development  aid  simplifies  the process of configuring
+       applications against a particular set of ncurses libraries.
+
+
+

OPTIONS

+       --prefix          reports the package prefix of ncurses.
+
+       --exec-prefix     reports the executable prefix of ncurses.
+
+       --cflags          reports the C compiler flags needed to  compile  with
+                         ncurses.
+
+       --libs            reports the libraries needed to link with ncurses.
+
+       --abi-version     reports the ABI version of ncurses.
+
+       --mouse-version   reports the mouse-interface version of ncurses.
+
+       --bindir          reports the directory containing ncurses programs.
+
+       --datadir         reports the directory containing ncurses data.
+
+       --includedir      reports   the  directory  containing  ncurses  header
+                         files.
+
+       --libdir          reports the directory containing ncurses libraries.
+
+       --mandir          reports the directory containing ncurses man pages.
+
+       --terminfo        reports the  TERMINFO  terminfo  database  path,  for
+                         example /usr/share/terminfo.
+
+       --terminfo-dirs   reports  the  TERMINFO_DIRS  supplemental search path
+                         for    the    terminfo    database,    for    example
+                         /usr/share/terminfo.
+
+       --termpath        reports the TERMPATH supplemental search path for the
+                         termcap  database,  if   support   for   termcap   is
+                         configured.
+
+       The following options cause all others to be ignored.
+
+       --help     issues a usage message and exits successfully.
+
+       --version  issues the release and patch date information of ncurses and
+                  exits successfully.
+
+
+

SEE ALSO

+       curses(3x)
+
+
+
+ncurses 6.5                       2024-05-11               ncursesw6-config(1)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/new_pair.3x.html b/contrib/ncurses/doc/html/man/new_pair.3x.html new file mode 100644 index 00000000..3cc73d6f --- /dev/null +++ b/contrib/ncurses/doc/html/man/new_pair.3x.html @@ -0,0 +1,188 @@ + + + + + + +new_pair 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

new_pair 3x 2024-03-16 ncurses 6.5 Library calls

+
+new_pair(3x)                     Library calls                    new_pair(3x)
+
+
+
+
+

NAME

+       alloc_pair,  find_pair,  free_pair  - dynamically allocate curses color
+       pairs
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int alloc_pair(int fg, int bg);
+       int find_pair(int fg, int bg);
+       int free_pair(int pair);
+
+
+

DESCRIPTION

+       These functions are an extension to the curses library.  They permit an
+       application   to   dynamically   allocate   a   color  pair  using  the
+       foreground/background colors rather than  assign  a  fixed  color  pair
+       number, and return an unused pair to the pool.
+
+       The  number  of  colors  may be related to the number of possible color
+       pairs for a given terminal, or it may not:
+
+       o   While almost all  terminals  allow  setting  the  color  attributes
+           independently,  it  is  unlikely  that  your terminal allows you to
+           modify the attributes of a given character cell  without  rewriting
+           it.  That is, the foreground and background colors are applied as a
+           pair.
+
+       o   Color pairs are the  curses  library's  way  of  managing  a  color
+           palette  on  a terminal.  If the library does not keep track of the
+           combinations of colors which are displayed, it will be inefficient.
+
+       o   For  simple  terminal  emulators  with  only  a  few  dozen   color
+           combinations,  it  is  convenient  to  use  the  maximum  number of
+           combinations as the limit on color pairs:
+
+               COLORS * COLORS
+
+       o   Terminals which support default colors distinct from "ANSI  colors"
+           add to the possible combinations, producing this total:
+
+               ( COLORS + 1 ) * ( COLORS + 1 )
+
+       o   An application might use up to a few dozen color pairs to implement
+           a predefined color scheme.
+
+           Beyond that lies in the realm of programs using the foreground  and
+           background  colors  for  "ASCII  art"  (or  some  other non-textual
+           application).
+
+           Also beyond those few dozen pairs, the required size for a table to
+           represent  the combinations grows rapidly with an increasing number
+           of colors.
+
+           These functions allow a developer to let the screen library  manage
+           color pairs.
+
+
+

alloc_pair

+       The   alloc_pair   function   accepts  parameters  for  foreground  and
+       background color, and checks  if  that  color  combination  is  already
+       associated with a color pair.
+
+       o   If  the combination already exists, alloc_pair returns the existing
+           pair.
+
+       o   If the combination does not exist, alloc_pair allocates a new color
+           pair and returns that.
+
+       o   If  the  table  fills  up,  alloc_pair  discards the least-recently
+           allocated entry using free_pair and allocates a new color pair.
+
+       All of the color pairs are allocated from a  table  of  possible  color
+       pairs.   The  size  of  the  table  is determined by the terminfo pairs
+       capability.  The table is shared with  init_pair;  in  fact  alloc_pair
+       calls  init_pair after updating the ncurses library's fast index to the
+       colors versus color pairs.
+
+
+

find_pair

+       The find_pair function accepts parameters for foreground and background
+       color,  and checks if that color combination is already associated with
+       a color pair, returning the pair  number  if  it  has  been  allocated.
+       Otherwise it returns -1.
+
+
+

free_pair

+       Marks the given color pair as unused, i.e., like color pair 0.
+
+
+

RETURN VALUE

+       The  alloc_pair  function  returns  a  color pair number in the range 1
+       through COLOR_PAIRS-1, unless it encounters an error updating its  fast
+       index  to  the color pair values, preventing it from allocating a color
+       pair.  In that case, it returns -1.
+
+       The find_pair function returns a color pair number if the  given  color
+       combination has been associated with a color pair, or -1 if not.
+
+       Likewise,  free_pair  returns OK unless it encounters an error updating
+       the fast index or if no such color pair is in use.
+
+
+

PORTABILITY

+       These routines are specific to ncurses.  They  were  not  supported  on
+       Version 7, BSD or System V implementations.  It is recommended that any
+       code depending on them be conditioned using NCURSES_VERSION.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       curs_color(3x)
+
+
+
+ncurses 6.5                       2024-03-16                      new_pair(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/panel.3x.html b/contrib/ncurses/doc/html/man/panel.3x.html new file mode 100644 index 00000000..791ae717 --- /dev/null +++ b/contrib/ncurses/doc/html/man/panel.3x.html @@ -0,0 +1,306 @@ + + + + + + +panel 3x 2024-05-25 ncurses 6.5 Library calls + + + + +

panel 3x 2024-05-25 ncurses 6.5 Library calls

+
+panel(3x)                        Library calls                       panel(3x)
+
+
+
+
+

NAME

+       panel - manage overlapping curses windows
+
+
+

SYNOPSIS

+       #include <panel.h>
+
+       PANEL *new_panel(WINDOW *win);
+
+       int bottom_panel(PANEL *pan);
+       int top_panel(PANEL *pan);
+       int show_panel(PANEL *pan);
+       void update_panels(void);
+       int hide_panel(PANEL *pan);
+
+       WINDOW *panel_window(const PANEL *pan);
+       int replace_panel(PANEL *pan, WINDOW *window);
+       int move_panel(PANEL *pan, int starty, int startx);
+       int panel_hidden(const PANEL *pan);
+
+       PANEL *panel_above(const PANEL *pan);
+       PANEL *panel_below(const PANEL *pan);
+
+       int set_panel_userptr(PANEL *pan, const void *ptr);
+       const void *panel_userptr(const PANEL *pan);
+
+       int del_panel(PANEL *pan);
+
+       /* ncurses extensions */
+       PANEL *ground_panel(SCREEN *sp);
+       PANEL *ceiling_panel(SCREEN *sp);
+
+
+

DESCRIPTION

+       Panels  are curses(3x) windows with the added property of depth.  Panel
+       functions allow the use of stacked windows and ensure that  the  proper
+       portions  of  each  window  and  the curses stdscr window are hidden or
+       displayed when panels are added, moved, modified, or removed.  The  set
+       of  currently visible panels is the stack of panels.  The stdscr window
+       is beneath all panels, and is not considered part of the stack.
+
+       A window is associated with each panel.  The panel routines enable  you
+       to  create,  move,  hide, and show panels.  You can relocate a panel to
+       any desired position in the stack.
+
+       Panel routines are a functional layer added to curses, make only  high-
+       level curses calls, and work anywhere curses does.
+
+
+

FUNCTIONS

+
+

bottom_panel

+       bottom_panel(pan) puts panel pan at the bottom of all panels.
+
+
+

ceiling_panel

+       ceiling_panel(sp) acts like panel_below(NULL) for the given SCREEN sp.
+
+
+

del_panel

+       del_panel(pan)   removes  the  given  panel  pan  from  the  stack  and
+       deallocates the PANEL structure (but not its associated window).
+
+
+

ground_panel

+       ground_panel(sp) acts like panel_above(NULL) for the given SCREEN sp.
+
+
+

hide_panel

+       hide_panel(pan) removes the given panel pan from the  panel  stack  and
+       thus  hides  it  from  view.   The  PANEL structure is not lost, merely
+       removed from the stack.
+
+
+

move_panel

+       move_panel(pan, starty, startx) moves the given panel pan's  window  so
+       that  its  upper-left  corner is at starty, startx.  It does not change
+       the position of the panel in the stack.  Be sure to use this  function,
+       not mvwin(3x), to move a panel window.
+
+
+

new_panel

+       new_panel(win)  allocates  a  PANEL  structure, associates it with win,
+       places the panel on the top of the stack (causes  it  to  be  displayed
+       above any other panel) and returns a pointer to the new panel.
+
+
+

panel_above

+       panel_above(pan)  returns  a  pointer  to  the panel above pan.  If the
+       panel argument is "(PANEL *)0", it returns  a  pointer  to  the  bottom
+       panel in the stack.
+
+
+

panel_below

+       panel_below(pan) returns a pointer to the panel just below pan.  If the
+       panel argument is "(PANEL *)0", it returns a pointer to the  top  panel
+       in the stack.
+
+
+

panel_hidden

+       panel_hidden(pan) returns FALSE if the panel pan is in the panel stack,
+       and TRUE if it is not.  If the panel is a null pointer, it returns ERR.
+
+
+

panel_userptr

+       panel_userptr(pan) returns the user pointer for a given panel pan.
+
+
+

panel_window

+       panel_window(pan) returns a pointer to the window of  the  given  panel
+       pan.
+
+
+

replace_panel

+       replace_panel(pan,  window)  replaces  the  current window of panel pan
+       with window This is useful if, for example, you want to resize a panel.
+       In ncurses, you can call replace_panel to resize a panel using a window
+       resized with wresize(3x).  It does not change the position of the panel
+       in the stack.
+
+
+

set_panel_userptr

+       set_panel_userptr(pan, ptr) sets the panel's user pointer.
+
+
+

show_panel

+       show_panel(pan)  makes  a  hidden panel visible by placing it on top of
+       the panels in the panel stack.  See "PORTABILITY" below.
+
+
+

top_panel

+       top_panel(pan) puts the given visible panel pan on top of all panels in
+       the stack.  See "PORTABILITY" below.
+
+
+

update_panels

+       update_panels()  refreshes  the virtual screen to reflect the relations
+       between the panels in the stack, but  does  not  call  doupdate(3x)  to
+       refresh the physical screen.  Use this function and not wrefresh(3x) or
+       wnoutrefresh(3x).
+
+       update_panels may be called more than once before a call  to  doupdate,
+       but  doupdate  is  the  function  responsible for updating the physical
+       screen.
+
+
+

RETURN VALUE

+       Each routine that returns a pointer returns NULL if  an  error  occurs.
+       Each  routine  that  returns  an  int  value  returns OK if it executes
+       successfully and ERR if not.
+
+       Except as noted, the pan and window parameters must  be  non-null.   If
+       either is null, an error is returned.
+
+       The  move_panel  function  uses  mvwin(3x),  and  returns  ERR if mvwin
+       returns ERR.
+
+
+

NOTES

+       The header file panel.h itself includes the header file curses.h.
+
+
+

PORTABILITY

+       Reasonable care has been taken to ensure compatibility with the  native
+       panel  facility  introduced  in System V; inspection of the SVr4 manual
+       pages suggests the programming interface never changed.  The PANEL data
+       structures  are  merely  similar.   The  programmer is cautioned not to
+       directly use PANEL fields.
+
+       The  functions  show_panel  and  top_panel  are   identical   in   this
+       implementation,  and work equally well with displayed or hidden panels.
+       In the System V implementation, show_panel is  intended  for  making  a
+       hidden  panel  visible  (at  the  top  of  the  stack) and top_panel is
+       intended for making an already-visible panel move to  the  top  of  the
+       stack.   You  are  cautioned  to  use  the  correct  function to ensure
+       compatibility with System V panel libraries.
+
+
+

HISTORY

+       A panel facility was documented in SVr4.2's  Character  User  Interface
+       Programming document.
+
+       It is not part of X/Open Curses.
+
+       A few implementations exist:
+
+       o   Systems  based  on  SVr4 source code, such as Solaris, provide this
+           library.
+
+       o   ncurses (since version 0.6 in 1993) and PDCurses (since version 2.2
+           in  1995) provide a panel library whose common ancestor is a public
+           domain implementation by Warren Tucker published  in  u386mon  2.20
+           (1990).
+
+           According  to Tucker, the System V panel library was first released
+           in SVr3.2 (1988), and his implementation  helped  with  a  port  to
+           SVr3.1 (1987).
+
+           Several  developers have improved each of these; they are no longer
+           the same as Tucker's implementation.
+
+       o   NetBSD 8 (2018) has a panel library  begun  by  Valery  Ushakov  in
+           2015, based on the System V documentation.
+
+
+

AUTHORS

+       Warren   Tucker   <wht@n4hgf.mt-park.ga.us>   originally   wrote   this
+       implementation, primarily to  assist  in  porting  u386mon  to  systems
+       without a native panel library.
+
+       Zeyd ben-Halim repackaged it for ncurses.
+
+       Juergen Pfeifer and Thomas E. Dickey revised and improved the library.
+
+
+

SEE ALSO

+       curses(3x), curs_variables(3x)
+
+
+
+ncurses 6.5                       2024-05-25                         panel(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/resizeterm.3x.html b/contrib/ncurses/doc/html/man/resizeterm.3x.html new file mode 100644 index 00000000..23491462 --- /dev/null +++ b/contrib/ncurses/doc/html/man/resizeterm.3x.html @@ -0,0 +1,217 @@ + + + + + + +resizeterm 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

resizeterm 3x 2024-03-16 ncurses 6.5 Library calls

+
+resizeterm(3x)                   Library calls                  resizeterm(3x)
+
+
+
+
+

NAME

+       is_term_resized,   resize_term,   resizeterm   -  manage  the  terminal
+       dimensions understood by curses
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       bool is_term_resized(int lines, int columns);
+       int resize_term(int lines, int columns);
+       int resizeterm(int lines, int columns);
+
+
+

DESCRIPTION

+       This is an extension to the curses library.  It provides callers with a
+       hook  into  the  ncurses  data  to resize windows, primarily for use by
+       programs running in  an  X  Window  terminal  (e.g.,  xterm)  when  the
+       terminal's screen size is changed by the user:
+
+       o   curses  windows  cannot extend outside the screen.  If the terminal
+           is shrunk, curses windows must be shrunk to fit.
+
+       o   If the terminal is stretched, rows and/or columns can be  added  to
+           existing  windows.   The  added  cells  should  match  the  current
+           attributes of the windows.
+
+       If the calling program has not set up a handler for  SIGWINCH  when  it
+       initializes  ncurses  (e.g.,  using  initscr(3x)  or newterm(3x)), then
+       ncurses sets a handler for SIGWINCH which notifies the library  when  a
+       window-size   event   has   occurred.   The  library  checks  for  this
+       notification
+
+       o   when reading input data,
+
+       o   when implicitly resuming program mode (e.g., between endwin(3x) and
+           wrefresh(3x)), and
+
+       o   when explicitly resuming program mode in restartterm(3x).
+
+       When the library has found that the terminal's window-size has changed,
+       it calls resizeterm to update its data structures.
+
+       An application which establishes its  own  SIGWINCH  handler  can  call
+       resizeterm,  but  in  that case, the library will not see SIGWINCH, and
+       proper layout will rely upon the application.
+
+
+

FUNCTIONS

+
+

resizeterm

+       The function resizeterm resizes the standard and current windows (i.e.,
+       stdscr  and  curscr)  to  the  specified  dimensions, and adjusts other
+       bookkeeping data used by the ncurses library  that  record  the  window
+       dimensions such as the LINES and COLS variables.
+
+
+

resize_term

+       Most  of  the  work  for  resizeterm  is  done  by  the  inner function
+       resize_term.  The outer function resizeterm adds  bookkeeping  for  the
+       SIGWINCH  handler,  as  well  as  repainting  the  soft-key  area  (see
+       slk_touch(3x)).
+
+       The resize_term function attempts to resize all  windows.   This  helps
+       with simple applications.  However:
+
+       o   It is not possible to automatically resize pads.
+
+       o   Applications  which  have  complicated  layouts  should  check  for
+           KEY_RESIZE returned from wgetch, and  adjust  their  layout,  e.g.,
+           using wresize and mvwin, or by recreating the windows.
+
+       When  resizing  windows,  resize_term  recursively  adjusts subwindows,
+       keeping them within the updated parent window's limits.  If a top-level
+       window  happens  to extend to the screen's limits, then on resizing the
+       window, resize_term will keep the window extending to the corresponding
+       limit, regardless of whether the screen has shrunk or grown.
+
+
+

is_term_resized

+       A support function is_term_resized is provided so that applications can
+       check if the resize_term function would modify the  window  structures.
+       It returns TRUE if the windows would be modified, and FALSE otherwise.
+
+
+

RETURN VALUE

+       Except  as  noted,  these functions return the integer ERR upon failure
+       and OK on success.  They will fail if either of the dimensions are less
+       than  or  equal  to  zero,  or  if an error occurs while (re)allocating
+       memory for the windows.
+
+
+

NOTES

+       While these functions are intended to  be  used  to  support  a  signal
+       handler  (i.e.,  for  SIGWINCH), care should be taken to avoid invoking
+       them in a context where malloc or realloc may  have  been  interrupted,
+       since it uses those functions.
+
+       If ncurses is configured to supply its own SIGWINCH handler,
+
+       o   on receipt of a SIGWINCH, the handler sets a flag
+
+       o   which is tested in wgetch(3x), doupdate(3x) and restartterm(3x),
+
+       o   in turn, calling the resizeterm function,
+
+       o   which ungetch's a KEY_RESIZE which will be read on the next call to
+           wgetch.
+
+           The KEY_RESIZE alerts an  application  that  the  screen  size  has
+           changed,  and  that it should repaint special features such as pads
+           that cannot be done automatically.
+
+           Calling resizeterm or resize_term directly from a signal handler is
+           unsafe.   This  indirect  method  is  used to provide a safe way to
+           resize the ncurses data structures.
+
+       If the environment variables LINES or COLUMNS are set,  this  overrides
+       the  library's  use  of  the  window  size  obtained from the operating
+       system.  Thus, even if a SIGWINCH is received, no  screen  size  change
+       may be recorded.
+
+
+

PORTABILITY

+       It is possible to resize the screen with SVr4 curses, by
+
+       o   exiting curses with endwin(3x) and
+
+       o   resuming using refresh(3x).
+
+       Doing that clears the screen and is visually distracting.
+
+       This  extension  of ncurses was introduced in mid-1995.  It was adopted
+       in NetBSD curses (2001) and PDCurses (2003).
+
+
+

AUTHORS

+       Thomas Dickey (from an equivalent function  written  in  1988  for  BSD
+       curses)
+
+
+

SEE ALSO

+       curs_getch(3x), curs_variables(3x), wresize(3x)
+
+
+
+ncurses 6.5                       2024-03-16                    resizeterm(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/scr_dump.5.html b/contrib/ncurses/doc/html/man/scr_dump.5.html new file mode 100644 index 00000000..a9634255 --- /dev/null +++ b/contrib/ncurses/doc/html/man/scr_dump.5.html @@ -0,0 +1,419 @@ + + + + + + +scr_dump 5 2024-03-23 ncurses 6.5 File formats + + + + +

scr_dump 5 2024-03-23 ncurses 6.5 File formats

+
+scr_dump(5)                      File formats                      scr_dump(5)
+
+
+
+
+

NAME

+       scr_dump - curses screen dump
+
+
+

DESCRIPTION

+       The  curses library provides applications with the ability to write the
+       contents of a window to an external file using scr_dump or putwin,  and
+       read it back using scr_restore or getwin.
+
+       The  putwin  and  getwin  functions  do  the  work;  while scr_dump and
+       scr_restore conveniently save  and  restore  the  whole  screen,  i.e.,
+       stdscr.
+
+
+

ncurses6

+       A  longstanding implementation of screen-dump was revised with ncurses6
+       to remedy problems with the earlier approach:
+
+       o   A "magic number" is written to the  beginning  of  the  dump  file,
+           allowing  applications  (such  as file(1)) to recognize curses dump
+           files.
+
+           Because ncurses6 uses a new  format,  that  requires  a  new  magic
+           number  was  unused  by other applications.  This 16-bit number was
+           unused:
+
+               0x8888 (octal "\210\210")
+
+           but to be more certain, this 32-bit number was chosen:
+
+               0x88888888 (octal "\210\210\210\210")
+
+           This is the pattern  submitted  to  the  maintainers  of  the  file
+           program:
+
+               #
+               # ncurses5 (and before) did not use a magic number,
+               # making screen dumps "data".
+               #
+               # ncurses6 (2015) uses this format, ignoring byte-order
+               0    string    \210\210\210\210ncurses    ncurses6 screen image
+               #
+
+       o   The screen dumps are written in textual form, so that internal data
+           sizes are not directly related to the dump-format, and enabling the
+           library  to  read  dumps  from  either  narrow-  or wide-character-
+           configurations.
+
+           The  narrow  library  configuration  holds  characters  and   video
+           attributes  in  a  32-bit  chtype, while the wide-character library
+           stores this information in the cchar_t  structure,  which  is  much
+           larger than 32-bits.
+
+       o   It  is  possible  to  read  a  screen  dump  into a terminal with a
+           different screen-size, because the library truncates or  fills  the
+           screen as necessary.
+
+       o   The ncurses6 getwin reads the legacy screen dumps from ncurses5.
+
+
+

ncurses5 (Legacy)

+       The screen-dump feature was added to ncurses in June 1995.  While there
+       were fixes and improvements in succeeding years, the basic  scheme  was
+       unchanged:
+
+       o   The WINDOW structure was written in binary form.
+
+       o   The WINDOW structure refers to lines of data, which were written as
+           an array of binary data following the WINDOW.
+
+       o   When getwin restored the window, it would  keep  track  of  offsets
+           into  the  array of line-data and adjust the WINDOW structure which
+           was read back into memory.
+
+       This is similar to Unix System V, but does not write a  "magic  number"
+       to identify the file format.
+
+
+

PORTABILITY

+       There is no standard format for curses screen dumps.  A brief survey of
+       the existing implementations follows.
+
+
+

X/Open Curses

+       X/Open Curses, Issue 7 specifies little.  It  says  (boldface  emphasis
+       added)
+
+          "[t]he  getwin()  function  reads  window-related data stored in the
+          file by putwin().  The function then creates and initializes  a  new
+          window using that data.
+
+          The  putwin()  function writes all data associated with win into the
+          stdio stream to which filep points,  using  an  unspecified  format.
+          This information can be retrieved later using getwin()."
+
+       In  the  mid-1990s  when  the X/Open Curses document was written, there
+       were still System V systems using older, less capable curses libraries.
+       BSD  curses  was  not  relevant  to  X/Open because it did not meet the
+       criteria for base-level conformance; see ncurses(3x).
+
+
+

System V

+       System V curses identified the file format by writing a "magic  number"
+       at  the  beginning  of the dump.  The WINDOW data and the lines of text
+       follow, all in binary form.
+
+       Solaris curses has the following definitions.
+
+           /* terminfo magic number */
+           #define MAGNUM  0432
+
+           /* curses screen dump magic number */
+           #define SVR2_DUMP_MAGIC_NUMBER  0433
+           #define SVR3_DUMP_MAGIC_NUMBER  0434
+
+       That is, the feature was likely introduced in SVr2 (1984), and improved
+       in  SVr3  (1987).   Solaris curses has no magic number for SVr4 (1989).
+       Other System V operating systems (AIX and HP-UX)  use  a  magic  number
+       that would correspond to the following.
+
+           /* curses screen dump magic number */
+           #define SVR4_DUMP_MAGIC_NUMBER  0435
+
+       That  octal  number in bytes is 001, 035.  Because most Unix vendors at
+       the time used big-endian hardware, the magic number is written with the
+       high-order byte first.
+
+           \001\035
+
+       After  the magic number, the WINDOW structure and line data are written
+       in binary format.  While the magic number used by these systems can  be
+       observed  with od(1), none of them documents the format used for screen
+       dumps.
+
+       Nor do they use an identical format, even  with  the  System V  family.
+       The ncurses savescreen test program was used to collect information for
+       this manual page.  It produced dumps of different size (all  on  64-bit
+       hardware, on 40x80 screens):
+
+       o   AIX (51817 bytes)
+
+       o   HP-UX (90093 bytes)
+
+       o   Solaris 10 (13273 bytes)
+
+       o   ncurses5 (12888 bytes)
+
+
+

Solaris

+       As  noted  above,  Solaris  curses has no magic number corresponding to
+       SVr4 curses.  This is odd, since Solaris was the first operating system
+       to meet the SVr4 guidelines.  Solaris furthermore supplies two versions
+       of curses.
+
+       o   The default curses library uses the SVr3 magic number.
+
+       o   An alternate curses library (which we term xcurses),  available  in
+           /usr/xpg4, uses a textual format with no magic number.
+
+           According  to  its  copyright  notice,  this  xcurses  library  was
+           developed by MKS (Mortice Kern Systems) from 1990 to 1995.
+
+           Like ncurses6,  it  includes  a  header  with  parameters.   Unlike
+           ncurses6,  the  contents  of the window are written piecemeal, with
+           coordinates and attributes for  each  chunk  of  text  rather  than
+           writing the whole window from top to bottom.
+
+
+

PDCurses

+       PDCurses  added  support  for screen dumps in version 2.7 (2005).  Like
+       System V and ncurses5, it writes the WINDOW structure  in  binary,  but
+       begins  the  file  with  its three-byte identifier "PDC", followed by a
+       single-byte version number.
+
+                "PDC\001"
+
+
+

NetBSD

+       As  of  April  2017,  NetBSD  curses  does  not  support  scr_dump  and
+       scr_restore (or scr_init, scr_set), although it has putwin and getwin.
+
+       Like  ncurses5, NetBSD putwin does not identify its dumps with a useful
+       magic number.  It writes
+
+       o   the curses shared library major and minor versions as the first two
+           bytes (for example, 7 and 1),
+
+       o   followed by a binary dump of the WINDOW,
+
+       o   some  data  for wide characters referenced by the WINDOW structure,
+           and
+
+       o   finally, lines as done by other implementations.
+
+
+

EXAMPLES

+       Given a simple program which writes text to the  screen  (and  for  the
+       sake of example, limiting the screen-size to 10x20):
+
+           #include <curses.h>
+
+           int
+           main(void)
+           {
+               putenv("LINES=10");
+               putenv("COLUMNS=20");
+               initscr();
+               start_color();
+               init_pair(1, COLOR_WHITE, COLOR_BLUE);
+               init_pair(2, COLOR_RED, COLOR_BLACK);
+               bkgd(COLOR_PAIR(1));
+               move(4, 5);
+               attron(A_BOLD);
+               addstr("Hello");
+               move(5, 5);
+               attroff(A_BOLD);
+               attrset(A_REVERSE | COLOR_PAIR(2));
+               addstr("World!");
+               refresh();
+               scr_dump("foo.out");
+               endwin();
+               return 0;
+           }
+
+       When run using ncurses6, the output looks like this:
+
+           \210\210\210\210ncurses 6.0.20170415
+           _cury=5
+           _curx=11
+           _maxy=9
+           _maxx=19
+           _flags=14
+           _attrs=\{REVERSE|C2}
+           flag=_idcok
+           _delay=-1
+           _regbottom=9
+           _bkgrnd=\{NORMAL|C1}\s
+           rows:
+           1:\{NORMAL|C1}\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           2:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           3:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           4:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           5:\s\s\s\s\s\{BOLD}Hello\{NORMAL}\s\s\s\s\s\s\s\s\s\s
+           6:\s\s\s\s\s\{REVERSE|C2}World!\{NORMAL|C1}\s\s\s\s\s\s\s\s\s
+           7:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           8:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           9:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+           10:\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s
+
+       The first four octal escapes are actually nonprinting characters, while
+       the remainder of the file is printable text.  You may notice:
+
+       o   The actual color pair values are not written to the file.
+
+       o   All characters are shown in printable  form;  spaces  are  "\s"  to
+           ensure they are not overlooked.
+
+       o   Attributes  are  written  in escaped curly braces, e.g., "\{BOLD}",
+           and may include a color pair (C1 or C2 in this example).
+
+       o   The parameters in the header are  written  out  only  if  they  are
+           nonzero.  When reading back, order does not matter.
+
+       Running the same program with Solaris xpg4 curses gives this dump:
+
+           MAX=10,20
+           BEG=0,0
+           SCROLL=0,10
+           VMIN=1
+           VTIME=0
+           FLAGS=0x1000
+           FG=0,0
+           BG=0,0,
+           0,0,0,1,
+           0,19,0,0,
+           1,0,0,1,
+           1,19,0,0,
+           2,0,0,1,
+           2,19,0,0,
+           3,0,0,1,
+           3,19,0,0,
+           4,0,0,1,
+           4,5,0x20,0,Hello
+           4,10,0,1,
+           4,19,0,0,
+           5,0,0,1,
+           5,5,0x4,2,World!
+           5,11,0,1,
+           5,19,0,0,
+           6,0,0,1,
+           6,19,0,0,
+           7,0,0,1,
+           7,19,0,0,
+           8,0,0,1,
+           8,19,0,0,
+           9,0,0,1,
+           9,19,0,0,
+           CUR=11,5
+
+       Solaris  getwin  requires  that  all parameters are present, and in the
+       same order.  The xpg4 curses library does not know about the bce  (back
+       color erase) capability, and does not color the window background.
+
+       On  the  other  hand,  the  SVr4  curses  library  does  know about the
+       background color.  However, its screen dumps are in  binary.   Here  is
+       the corresponding dump (using "od -t x1"):
+
+           0000000 1c 01 c3 d6 f3 58 05 00 0b 00 0a 00 14 00 00 00
+           0000020 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00
+           0000040 00 00 b8 1a 06 08 cc 1a 06 08 00 00 09 00 10 00
+           0000060 00 00 00 80 00 00 20 00 00 00 ff ff ff ff 00 00
+           0000100 ff ff ff ff 00 00 00 00 20 80 00 00 20 80 00 00
+           0000120 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+           *
+           0000620 20 80 00 00 20 80 00 00 20 80 00 00 48 80 00 04
+           0000640 65 80 00 04 6c 80 00 04 6c 80 00 04 6f 80 00 04
+           0000660 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+           *
+           0000740 20 80 00 00 20 80 00 00 20 80 00 00 57 00 81 00
+           0000760 6f 00 81 00 72 00 81 00 6c 00 81 00 64 00 81 00
+           0001000 21 00 81 00 20 80 00 00 20 80 00 00 20 80 00 00
+           0001020 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00
+           *
+           0001540 20 80 00 00 20 80 00 00 00 00 f6 d1 01 00 f6 d1
+           0001560 08 00 00 00 40 00 00 00 00 00 00 00 00 00 00 07
+           0001600 00 04 00 01 00 01 00 00 00 01 00 00 00 00 00 00
+           0001620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+           *
+           0002371
+
+
+

AUTHORS

+       Thomas E. Dickey
+       extended screen-dump format for ncurses 6.0 (2015)
+
+       Eric S. Raymond
+       screen dump feature in ncurses 1.9.2d (1995)
+
+
+

SEE ALSO

+       curs_scr_dump(3x), curs_util(3x)
+
+
+
+ncurses 6.5                       2024-03-23                       scr_dump(5)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/tabs.1.html b/contrib/ncurses/doc/html/man/tabs.1.html new file mode 100644 index 00000000..7d6b42c6 --- /dev/null +++ b/contrib/ncurses/doc/html/man/tabs.1.html @@ -0,0 +1,283 @@ + + + + + + +tabs 1 2024-09-21 ncurses 6.5 User commands + + + + +

tabs 1 2024-09-21 ncurses 6.5 User commands

+
+tabs(1)                          User commands                         tabs(1)
+
+
+
+
+

NAME

+       tabs - set terminal tab stops
+
+
+

SYNOPSIS

+       tabs [options] [tabstop-list]
+
+
+

DESCRIPTION

+       The  tabs program clears and sets tab-stops on the terminal.  This uses
+       the terminfo clear_all_tabs and set_tab  capabilities.   If  either  is
+       absent,  tabs is unable to clear/set tab-stops.  The terminal should be
+       configured to use hard tabs, e.g.,
+
+           stty tab0
+
+       Like clear(1), tabs writes to the standard output.   You  can  redirect
+       the  standard  output  to  a  file  (which  prevents tabs from actually
+       changing the tabstops), and later cat the file to the  screen,  setting
+       tabstops at that point.
+
+       These   are   hardware   tabs,  which  cannot  be  queried  rapidly  by
+       applications running in the terminal, if  at  all.   Curses  and  other
+       full-screen  applications  may  use  hardware  tabs in optimizing their
+       output to the terminal.  If  the  hardware  tabstops  differ  from  the
+       information  in  the  terminal  database,  the result is unpredictable.
+       Before running curses programs, you should either  reset  tab-stops  to
+       the standard interval
+
+           tabs -8
+
+       or  use the reset program, since the normal initialization sequences do
+       not ensure that tab-stops are reset.
+
+
+

OPTIONS

+
+

General Options

+       -Tname
+            Tell tabs which terminal type to  use.   If  this  option  is  not
+            given,  tabs  will use the $TERM environment variable.  If that is
+            not set, it will use the ansi+tabs entry.
+
+       -d   The debugging option shows a ruler  line,  followed  by  two  data
+            lines.   The  first  data line shows the expected tab-stops marked
+            with asterisks.  The second data line shows the actual  tab-stops,
+            marked with asterisks.
+
+       -n   This  option tells tabs to check the options and run any debugging
+            option, but not to modify the terminal settings.
+
+       -V   reports the version of ncurses which was used in this program, and
+            exits.
+
+       The tabs program processes a single list of tab stops.  The last option
+       to be processed which defines a list is the  one  that  determines  the
+       list to be processed.
+
+
+

Implicit Lists

+       Use  a  single number as an option, e.g., "-5" to set tabs at the given
+       interval (in this case 1, 6, 11, 16, 21, etc.).  Tabs are  repeated  up
+       to the right margin of the screen.
+
+       Use "-0" to clear all tabs.
+
+       Use "-8" to set tabs to the standard interval.
+
+
+

Explicit Lists

+       An  explicit list can be defined after the options (this does not use a
+       "-").  The values in the list must be in increasing numeric order,  and
+       greater  than  zero.   They  are  separated  by a comma or a blank, for
+       example,
+
+           tabs 1,6,11,16,21
+           tabs 1 6 11 16 21
+
+       Use a "+" to treat a number as an increment relative  to  the  previous
+       value, e.g.,
+
+           tabs 1,+5,+5,+5,+5
+
+       which is equivalent to the 1,6,11,16,21 example.
+
+
+

Predefined Tab Stops

+       POSIX defines several predefined lists of tab stops.
+
+       -a   Assembler, IBM S/370, first format
+            1,10,16,36,72
+
+       -a2  Assembler, IBM S/370, second format
+            1,10,16,40,72
+
+       -c   COBOL, normal format
+            1,8,12,16,20,55
+
+       -c2  COBOL compact format
+            1,6,10,14,49
+
+       -c3  COBOL compact format extended
+            1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67
+
+       -f   FORTRAN
+            1,7,11,15,19,23
+
+       -p   PL/I
+            1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61
+
+       -s   SNOBOL
+            1,10,55
+
+       -u   UNIVAC 1100 Assembler
+            1,12,20,44
+
+
+

Margins

+       A  few  terminals  expose  a  means  of  changing  their left and right
+       margins.  tabs supports this feature with an option.
+
+       +m margin
+            The  effect  depends  on  whether  the  terminal  has  the  margin
+            capabilities:
+
+            o   If  the  terminal provides the capability for setting the left
+                margin, tabs uses this, and adjusts  the  available  tab  stop
+                widths.
+
+            o   If the terminal does not provide the margin capabilities, tabs
+                imitates their effect, putting tab stops at appropriate places
+                on each line.  The terminal's left margin is not modified.
+
+            If the margin parameter is omitted, the default is 10.  Use +m0 to
+            reset the left margin, that is, to make it the left  edge  of  the
+            terminal's display.  Before setting a left margin, tabs resets the
+            margin to reduce problems that might arise from moving the  cursor
+            to the left of the current left margin.
+
+       When  setting  or  resetting  the  left margin, tabs may also reset the
+       right margin.
+
+
+

FILES

+       /usr/share/tabset
+              tab stop initialization database
+
+
+

PORTABILITY

+       IEEE  Std   1003.1/The   Open   Group   Base   Specifications   Issue 7
+       (POSIX.1-2008) describes a tabs utility.  However,
+
+       o   this  standard  describes  a  +m  option  to  set a terminal's left
+           margin.  Very few of the entries in the terminal  database  provide
+           the   set_left_margin   (smgl)   or   set_left_margin_parm  (smglp)
+           capabilities needed to support the feature.
+
+       o   Unlike tput, tabs has no specification in X/Open Curses Issue 7.
+
+       The -d (debug) and  -n  (no-op)  options  are  ncurses  extensions  not
+       provided by other implementations.
+
+
+

HISTORY

+       A  tabs  utility  appeared  in  PWB/Unix 1.0 (1977).  A reduced version
+       shipped in Seventh Edition Unix (early 1979) and  in  3BSD  (later  the
+       same  year);  it  supported an option "-n" to set the first tab stop at
+       the left margin.  That option is not specified by POSIX.
+
+       The PWB/Unix tabs utility returned  in  System  III  (1980),  and  used
+       built-in  tables  to  support  a half-dozen hardcopy terminal (printer)
+       types.  It also had logic to support setting the left margin,  as  well
+       as a feature for copying the tab settings from a file.
+
+       Versions  of  the program in later releases of AT&T Unix, such as SVr4,
+       added support for the terminal database, but  retained  the  tables  to
+       support the printers.  By this time, System V tput had incorporated the
+       tab stop initialization feature of BSD's tset from 1982,  but  employed
+       the terminfo database to do so.
+
+       The  +m  option was documented in the POSIX Base Specifications Issue 5
+       (Unix98, 1997), then omitted in Issue 6 (Unix03, 2004) without  express
+       motivation,  though an introductory comment "and optionally adjusts the
+       margin"  remains,  overlooked  in  the  removal.   The   tabs   utility
+       documented  in Issues 6 and later has no mechanism for setting margins.
+       The +m option in ncurses's implementation differs from the SVr4 feature
+       by using terminal capabilities rather than built-in tables.
+
+       POSIX   documents   no  limit  on  the  number  of  tab  stops.   Other
+       implementations impose one; the limit is 20 in PWB/Unix's tabs utility.
+       While  some  terminals may not accept an arbitrary number of tab stops,
+       ncurses attempts to set tab stops up to the right margin  if  the  list
+       thereof is sufficiently long.
+
+       The  "Rationale" section of the Issue 6 tabs reference page details how
+       the committee considered  redesigning  the  tabs  and  tput  utilities,
+       without settling on an improved solution.  It claims that
+
+           no  known  historical  version  of  tabs supports the capability of
+           setting arbitrary tab stops.
+
+       The  feature  described  in  subsection  "Explicit  Lists"  above   was
+       implemented  in  PWB/Unix,  and  permitted  the setting of abitrary tab
+       stops nevertheless.
+
+
+

SEE ALSO

+       infocmp(1m), tset(1), curses(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-09-21                           tabs(1)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/term.5.html b/contrib/ncurses/doc/html/man/term.5.html new file mode 100644 index 00000000..192bf039 --- /dev/null +++ b/contrib/ncurses/doc/html/man/term.5.html @@ -0,0 +1,429 @@ + + + + + + +term 5 2024-06-15 ncurses 6.5 File formats + + + + +

term 5 2024-06-15 ncurses 6.5 File formats

+
+term(5)                          File formats                          term(5)
+
+
+
+
+

NAME

+       term - compiled terminfo terminal description
+
+
+

DESCRIPTION

+       tic(1) compiles a terminfo terminal type description, and setupterm(3x)
+       reads it.  A compiled description may be stored  in  a  file  or  in  a
+       database  of, potentially, many such descriptions.  Further, a compiled
+       description may be in one of two formats: one similar to that  used  by
+       System V,  and  a  newer,  extensible  format  employed  exclusively by
+       ncurses.
+
+
+

Storage Location

+       Compiled  terminfo  descriptions  are  placed   under   the   directory
+       /usr/share/terminfo.   One  of  two  configurations  is  selected  when
+       building the ncurses libraries.
+
+       directory tree
+            A two-level scheme is used to avoid a linear search of a huge Unix
+            system  directory:  /usr/share/terminfo/c/name  where  name is the
+            name of the terminal, and c is the first character of name.  Thus,
+            the  compiled  description of terminal type "act4" is found in the
+            file /usr/share/terminfo/a/act4.  Synonyms for the  same  terminal
+            are implemented by multiple links to the same compiled file.
+
+       hashed database
+            Using  the Berkeley database API, two types of records are stored:
+            the terminfo data in the same format as that stored in a directory
+            tree  with  the terminal's primary type name as a key, and records
+            containing only aliases pointing to the primary name.
+
+            If built to write hashed databases, ncurses can still  read  term-
+            info  databases  organized  as  a directory tree, but cannot write
+            entries into the  directory  tree.   It  can  write  (or  rewrite)
+            entries in the hashed database.
+
+            ncurses   distinguishes   the   two  cases  in  the  TERMINFO  and
+            TERMINFO_DIRS environment variable by assuming  a  directory  tree
+            for entries that correspond to an existing directory, and a hashed
+            database otherwise.
+
+
+

Legacy Storage Format

+       The format has been chosen so that it will be the same on all hardware.
+       A  byte  of  at  least eight bits' width is assumed, but no assumptions
+       about bit ordering or sign extension are made.
+
+       The file is divided into six parts:
+
+            (a) header,
+
+            (b) terminal names,
+
+            (c) Boolean flags,
+
+            (d) numbers,
+
+            (e) strings, and
+
+            (f) a string table.
+
+       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 terminal names section;
+
+            (3) the number of bytes in the Boolean flags 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.
+
+       The  capabilities  in  the Boolean flags, numbers, and strings sections
+       are in the same order as in the header file term.h.
+
+       Short integers are signed, in the range -32768 to 32767, and stored  in
+       little-endian format.
+
+       Numbers  in  a  terminal  description,  whether they are entries in the
+       numbers or strings table, are positive  integers.   Boolean  flags  are
+       treated  as  positive  one-byte integers.  In each case, those positive
+       integers represent a terminal capability.  The  terminal  compiler  tic
+       uses  negative  integers  to handle the cases where a capability is not
+       available:
+
+       o   If a capability is absent from this terminal, tic stores  a  -1  in
+           the corresponding table.
+
+           The integer value -1 is represented by two bytes 0377, 0377.
+           Absent Boolean values are represented by the byte 0 (false).
+
+       o   If  a capability has been canceled from this terminal, tic stores a
+           -2 in the corresponding table.
+
+           The integer value -2 is represented by two bytes 0377, 0376.
+           The Boolean value -2 is represented by the byte 0376.
+
+       o   Other negative values are illegal.
+
+       The terminal names section comes after the  header.   It  contains  the
+       first  line  of the terminfo description, listing the various names for
+       the terminal, separated by  the  "|"  character.   The  terminal  names
+       section is terminated with an ASCII NUL character.
+
+       The  Boolean  flags  section  has  one  byte  for  each  flag.  Boolean
+       capabilities are either 1 or 0 (true or false) according to whether the
+       terminal supports the given capability or not.
+
+       Between  the  Boolean flags section and the number section, a null byte
+       will be inserted, if necessary,  to  ensure  that  the  number  section
+       begins  on  an even byte This is a relic of the PDP-11's word-addressed
+       architecture, originally designed to avoid traps induced by  addressing
+       a  word  on  an odd byte boundary.  All short integers are aligned on a
+       short word boundary.
+
+       The numbers section is similar to  the  Boolean  flags  section.   Each
+       capability  takes  up two bytes, and is stored as a little-endian short
+       integer.
+
+       The strings section is also similar.  Each capability is  stored  as  a
+       short integer.  The capability value is an index into the string table.
+
+       The string table is the last section.  It contains all of the values of
+       string capabilities referenced in the strings section.  Each string  is
+       null-terminated.  Special characters in ^X or \c notation are stored in
+       their interpreted  form,  not  the  printing  representation.   Padding
+       information  $<nn>  and  parameter  information %x are stored intact in
+       uninterpreted form.
+
+
+

Extended Storage Format

+       The previous section describes the conventional terminfo binary format.
+       With  some  minor variations of the offsets (see PORTABILITY), the same
+       binary format is used in all modern Unix systems.  Each system  uses  a
+       predefined set of Boolean, number or string capabilities.
+
+       The ncurses libraries and applications support extended terminfo binary
+       format, allowing users  to  define  capabilities  that  are  loaded  at
+       runtime.   This  extension  is made possible by using the fact that the
+       other implementations stop reading the terminfo data  when  they  reach
+       the  end of the size given in the header.  ncurses checks the size, and
+       if it exceeds that due to  the  predefined  data,  continues  to  parse
+       according to its own scheme.
+
+       First, it reads the extended header (5 short integers):
+
+            (1)  count of extended Boolean capabilities
+
+            (2)  count of extended numeric capabilities
+
+            (3)  count of extended string capabilities
+
+            (4)  count of the items in extended string table
+
+            (5)  size of the extended string table in bytes
+
+       The  count-  and  size-values for the extended string table include the
+       extended capability names as well as extended capability values.
+
+       Using the counts and sizes, ncurses allocates arrays and reads data for
+       the extended capabilities in the same order as the header information.
+
+       The  extended  string  table  contains  values for string capabilities.
+       After the end of these values, it contains the names for  each  of  the
+       extended capabilities in order: Boolean, numeric, and string.
+
+       By  storing  terminal  descriptions  in  this  way,  ncurses is able to
+       provide  a  database  useful  with  legacy  applications,  as  well  as
+       providing  data  for applications that require more information about a
+       terminal type than was anticipated by X/Open Curses.  See  user_caps(5)
+       for an overview of the way ncurses uses this extended information.
+
+       Applications  that  manipulate  terminal  data  can use the definitions
+       described in term_variables(3x) associating the long  capability  names
+       with members of a TERMTYPE structure.
+
+
+

Extended Number Format

+       On  occasion, 16-bit signed integers are not large enough.  ncurses 6.1
+       introduced a new format by making a few changes to the legacy format:
+
+       o   a different magic number (octal 01036)
+
+       o   changing the type for the number array from signed 16-bit  integers
+           to signed 32-bit integers.
+
+       To   maintain   compatibility,  the  library  presents  the  same  data
+       structures to direct users of the TERMTYPE  structure  as  in  previous
+       formats.   However,  that  cannot  provide  callers  with  the extended
+       numbers.   The  library  uses  a  similar  but  hidden  data  structure
+       TERMTYPE2 to provide data for the terminfo functions.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database
+
+
+

PORTABILITY

+
+

setupterm

+       Note  that  it  is  possible for setupterm to expect a different set of
+       capabilities than  are  actually  present  in  the  file.   Either  the
+       database   may   have  been  updated  since  setupterm  was  recompiled
+       (resulting in extra unrecognized entries in the file)  or  the  program
+       may  have  been  recompiled more recently than the database was updated
+       (resulting in missing entries).  The routine 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.
+
+
+

Binary Format

+       X/Open  Curses  does  not  specify  a format for the terminfo database.
+       System V curses used a directory-tree of binary files, one per terminal
+       description.
+
+       Despite  the  consistent use of little-endian numbers and the otherwise
+       self-describing format, it is not  wise  to  count  on  portability  of
+       binary  terminfo entries between commercial Unix versions.  The problem
+       is that there are at least three versions  of  terminfo  (under  HP-UX,
+       AIX,  and  OSF/1)  each  of which diverged from System V terminfo after
+       SVr1, and added extension capabilities to the string table that (in the
+       binary format) collide with System V and X/Open Curses extensions.  See
+       terminfo(5) for detailed discussion of  terminfo  source  compatibility
+       issues.
+
+       This  implementation  is by default compatible with the binary terminfo
+       format used by Solaris curses, except in a few less-used details  where
+       it  was  found that the latter did not match X/Open Curses.  The format
+       used by the other Unix versions can be matched by building ncurses with
+       different configuration options.
+
+
+

Magic Codes

+       The  magic  number  in a binary terminfo file is the first 16 bits (two
+       bytes).  Besides making it more reliable for the library to check  that
+       a  file  is  terminfo,  utilities such as file(1) also use that to tell
+       what the file-format is.  System V defined more than one magic  number,
+       with 0433, 0435 as screen-dumps (see scr_dump(5)).  This implementation
+       uses 01036 as a continuation of that sequence,  but  with  a  different
+       high-order byte to avoid confusion.
+
+   The TERMTYPE Structure
+       Direct  access  to  the  TERMTYPE  structure  is  provided  for  legacy
+       applications.   Portable  applications  should  use  tigetflag(3x)  and
+       related functions to read terminal capabilities.
+
+
+

Mixed-case Terminal Names

+       A  small  number  of  terminal descriptions use uppercase characters in
+       their names.  If the underlying  file  system  ignores  the  difference
+       between   uppercase   and  lowercase,  ncurses  represents  the  "first
+       character" of the terminal name used as the  intermediate  level  of  a
+       directory tree in (two-character) hexadecimal form.
+
+
+

Limits

+       ncurses stores compiled terminal descriptions in three related formats,
+       described in the subsections
+
+       o   Legacy Storage Format, and
+
+       o   Extended Storage Format, and
+
+       o   Extended Number Format.
+
+       The legacy storage format and the extended number format differ by  the
+       types  of  numeric  capability  that  they  can store (for example, 16-
+       versus 32-bit integers).  The extended  storage  format  introduced  by
+       ncurses 5.0 adds data to either of these formats.
+
+       Some limitations apply:
+
+       o   total  compiled  entries  cannot  exceed  4096  bytes in the legacy
+           format.
+
+       o   total compiled entries cannot exceed 32768 bytes  in  the  extended
+           format.
+
+       o   the name field cannot exceed 128 bytes.
+
+       Compiled  entries  are  limited to 32768 bytes because offsets into the
+       strings table use two-byte integers.   The  legacy  format  could  have
+       supported  32768-byte  entries,  but  was  limited  to a virtual memory
+       page's 4096 bytes.
+
+
+

EXAMPLES

+       Here is a terminfo description of the  Lear-Siegler  ADM-3,  a  popular
+       though rather stupid early terminal.
+
+       adm3a|lsi adm3a,
+               am,
+               cols#80, lines#24,
+               bel=^G, clear=\032$<1>, cr=^M, cub1=^H, cud1=^J,
+               cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K,
+               home=^^, ind=^J,
+
+       A  hexadecimal  dump  of  its  compiled terminal description (in legacy
+       format) follows.
+
+       0000  1a 01 10 00 02 00 03 00  82 00 31 00 61 64 6d 33  ........ ..1.adm3
+       0010  61 7c 6c 73 69 20 61 64  6d 33 61 00 00 01 50 00  a|lsi ad m3a...P.
+       0020  ff ff 18 00 ff ff 00 00  02 00 ff ff ff ff 04 00  ........ ........
+       0030  ff ff ff ff ff ff ff ff  0a 00 25 00 27 00 ff ff  ........ ..%.'...
+       0040  29 00 ff ff ff ff 2b 00  ff ff 2d 00 ff ff ff ff  ).....+. ..-.....
+       0050  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0060  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0070  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0080  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0090  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       00a0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       00b0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       00c0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       00d0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       00e0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       00f0  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0100  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0110  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  ........ ........
+       0120  ff ff ff ff ff ff 2f 00  07 00 0d 00 1a 24 3c 31  ....../. .....$<1
+       0130  3e 00 1b 3d 25 70 31 25  7b 33 32 7d 25 2b 25 63  >..=%p1% {32}%+%c
+       0140  25 70 32 25 7b 33 32 7d  25 2b 25 63 00 0a 00 1e  %p2%{32} %+%c....
+       0150  00 08 00 0c 00 0b 00 0a  00                       ........ .
+
+
+

AUTHORS

+       Thomas E. Dickey
+       extended terminfo format for ncurses 5.0
+       hashed database support for ncurses 5.6
+       extended number support for ncurses 6.1
+
+       Eric S. Raymond
+       documented legacy terminfo format (that used by pcurses).
+
+
+

SEE ALSO

+       curses(3x), curs_terminfo(3x), terminfo(5), user_caps(5)
+
+
+
+ncurses 6.5                       2024-06-15                           term(5)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/term.7.html b/contrib/ncurses/doc/html/man/term.7.html new file mode 100644 index 00000000..f19821b1 --- /dev/null +++ b/contrib/ncurses/doc/html/man/term.7.html @@ -0,0 +1,231 @@ + + + + + + +term 7 2024-05-11 ncurses 6.5 Miscellaneous + + + + +

term 7 2024-05-11 ncurses 6.5 Miscellaneous

+
+term(7)                          Miscellaneous                         term(7)
+
+
+
+
+

NAME

+       term - conventions for naming terminal types
+
+
+

DESCRIPTION

+       The  environment variable TERM should normally contain the type name of
+       the terminal, console or  display-device  type  you  are  using.   This
+       information  is  critical  for  all screen-oriented programs, including
+       your editor and mailer.
+
+       A default TERM value  will  be  set  on  a  per-line  basis  by  either
+       /etc/inittab  (e.g.,  System-V-like  Unices) or /etc/ttys (BSD Unices).
+       This will nearly  always  suffice  for  workstation  and  microcomputer
+       consoles.
+
+       If  you  use a dialup line, the type of device attached to it may vary.
+       Older Unix systems pre-set a very dumb terminal  type  like  "dumb"  or
+       "dialup"  on  dialup lines.  Newer ones may pre-set "vt100", reflecting
+       the prevalence of DEC VT100-compatible terminals and  personal-computer
+       emulators.
+
+       Modern  telnets pass your TERM environment variable from the local side
+       to the remote one.  There can be problems if  the  remote  terminfo  or
+       termcap  entry  for  your  type  is not compatible with yours, but this
+       situation is rare and  can  almost  always  be  avoided  by  explicitly
+       exporting  "vt100"  (assuming  you  are  in fact using a VT100-superset
+       console, terminal, or terminal emulator).
+
+       In any case, you are free to override the system TERM setting  to  your
+       taste in your shell profile.  The tset(1) utility may be of assistance;
+       you can give it a set of rules for deducing or  requesting  a  terminal
+       type based on the tty device and baud rate.
+
+       Setting  your  own  TERM value may also be useful if you have created a
+       custom entry incorporating options (such as  visual  bell  or  reverse-
+       video)  which  you  wish  to  override the system default type for your
+       line.
+
+       Terminal type descriptions are  stored  as  files  of  capability  data
+       underneath /usr/share/terminfo.  To browse a list of all terminal names
+       recognized by the system, do
+
+               toe | more
+
+       from your shell.   These  capability  files  are  in  a  binary  format
+       optimized for retrieval speed (unlike the old text-based termcap format
+       they replace); to examine  an  entry,  you  must  use  the  infocmp(1m)
+       command.  Invoke it as follows:
+
+               infocmp entry_name
+
+       where  entry_name  is the name of the type you wish to examine (and the
+       name of its capability file  the  subdirectory  of  /usr/share/terminfo
+       named  for  its first letter).  This command dumps a capability file in
+       the text format described by terminfo(5).
+
+       The first line of a terminfo(5) description gives the  names  by  which
+       terminfo  knows a terminal, separated by "|" (pipe-bar) characters with
+       the last name field terminated by a comma.  The first name field is the
+       type's primary name, and is the one to use when setting TERM.  The last
+       name field (if distinct from the first) is actually  a  description  of
+       the  terminal  type  (it  may contain blanks; the others must be single
+       words).  Name fields between  the  first  and  last  (if  present)  are
+       aliases  for  the  terminal,  usually  historical  names  retained  for
+       compatibility.
+
+       There are some conventions for how to  choose  terminal  primary  names
+       that  help  keep  them  informative and unique.  Here is a step-by-step
+       guide to naming terminals that also explains how to parse them:
+
+       First, choose a root name.  The  root  will  consist  of  a  lower-case
+       letter  followed by up to seven lower-case letters or digits.  You need
+       to avoid using punctuation characters in root names, because  they  are
+       used and interpreted as filenames and shell meta-characters (such as !,
+       $, *, ?, etc.) embedded in them may cause odd and  unhelpful  behavior.
+       The  slash  (/),  or  any  other  character  that may be interpreted by
+       anyone's file system (\, $, [, ]), is especially dangerous (terminfo is
+       platform-independent,  and choosing names with special characters could
+       someday make life difficult for users of a future port).  The  dot  (.)
+       character  is  relatively safe as long as there is at most one per root
+       name; some historical terminfo names use it.
+
+       The root name for a terminal or workstation console type should  almost
+       always  begin  with a vendor prefix (such as hp for Hewlett-Packard, wy
+       for Wyse, or att for AT&T terminals), or a common name of the  terminal
+       line  (vt  for  the  VT  series  of  terminals from DEC, or sun for Sun
+       Microsystems workstation  consoles,  or  regent  for  the  ADDS  Regent
+       series.   You  can  list  the  terminfo  tree  to see what prefixes are
+       already in common use.  The root name prefix should  be  followed  when
+       appropriate by a model number; thus vt100, hp2621, wy50.
+
+       The  root  name for a PC-Unix console type should be the OS name, i.e.,
+       linux, bsdos, freebsd, netbsd.  It should not be console or  any  other
+       generic that might cause confusion in a multi-platform environment!  If
+       a model number follows, it should indicate either the OS release  level
+       or the console driver release level.
+
+       The  root name for a terminal emulator (assuming it does not fit one of
+       the standard ANSI or vt100 types) should  be  the  program  name  or  a
+       readily recognizable abbreviation of it (i.e., versaterm, ctrm).
+
+       Following  the  root name, you may add any reasonable number of hyphen-
+       separated feature suffixes.
+
+       2p   Has two pages of memory.  Likewise 4p, 8p, etc.
+
+       mc   Magic-cookie.  Some  terminals  (notably  older  Wyses)  can  only
+            support  one  attribute  without magic-cookie lossage.  Their base
+            entry is usually paired with another that has this suffix and uses
+            magic cookies to support multiple attributes.
+
+       -am  Enable auto-margin (right-margin wraparound).
+
+       -m   Mono mode - suppress color support.
+
+       -na  No  arrow  keys  -  termcap  ignores arrow keys which are actually
+            there on the terminal, so the user can use the arrow keys locally.
+
+       -nam No auto-margin - suppress am capability.
+
+       -nl  No labels - suppress soft labels.
+
+       -nsl No status line - suppress status line.
+
+       -pp  Has a printer port which is used.
+
+       -rv  Terminal in reverse video mode (black on white).
+
+       -s   Enable status line.
+
+       -vb  Use visible bell (flash) rather than beep.
+
+       -w   Wide; terminal is in 132-column mode.
+
+       Conventionally, if your terminal type is a variant intended to  specify
+       a  line  height,  that  suffix should go first.  So, for a hypothetical
+       FuBarCo model 2317 terminal in 30-line mode with  reverse  video,  best
+       form would be fubar-30-rv (rather than, say, "fubar-rv-30").
+
+       Terminal  types  that are written not as standalone entries, but rather
+       as components to be plugged into other entries  via  use  capabilities,
+       are distinguished by using embedded plus signs rather than dashes.
+
+       Commands which use a terminal type to control display often accept a -T
+       option that accepts a terminal name  argument.   Such  programs  should
+       fall  back  on  the  TERM  environment  variable  when  no -T option is
+       specified.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database
+
+       /etc/inittab
+              tty line initialization (AT&T-like Unices)
+
+       /etc/ttys
+              tty line initialization (BSD-like Unices)
+
+
+

PORTABILITY

+       For maximum compatibility with older System V Unices, names and aliases
+       should be unique within the first 14 characters.
+
+
+

SEE ALSO

+       curses(3x), term(5), terminfo(5)
+
+
+
+ncurses 6.5                       2024-05-11                           term(7)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/term_variables.3x.html b/contrib/ncurses/doc/html/man/term_variables.3x.html new file mode 100644 index 00000000..99b6786b --- /dev/null +++ b/contrib/ncurses/doc/html/man/term_variables.3x.html @@ -0,0 +1,200 @@ + + + + + + +term_variables 3x 2024-03-16 ncurses 6.5 Library calls + + + + +

term_variables 3x 2024-03-16 ncurses 6.5 Library calls

+
+term_variables(3x)               Library calls              term_variables(3x)
+
+
+
+
+

NAME

+       SP,  acs_map,  boolcodes,  boolfnames,  boolnames,  cur_term, numcodes,
+       numfnames, numnames, strcodes, strfnames, strnames, ttytype -  terminfo
+       global variables
+
+
+

SYNOPSIS

+       #include <curses.h>
+       #include <term.h>
+
+       chtype acs_map[];
+
+       SCREEN * SP;
+
+       TERMINAL * cur_term;
+
+       char ttytype[];
+
+       NCURSES_CONST char * const boolcodes[];
+       NCURSES_CONST char * const boolfnames[];
+       NCURSES_CONST char * const boolnames[];
+
+       NCURSES_CONST char * const numcodes[];
+       NCURSES_CONST char * const numfnames[];
+       NCURSES_CONST char * const numnames[];
+
+       NCURSES_CONST char * const strcodes[];
+       NCURSES_CONST char * const strfnames[];
+       NCURSES_CONST char * const strnames[];
+
+
+

DESCRIPTION

+       This  page  summarizes  variables provided by the curses library's low-
+       level terminfo interface.  A more complete description is given in  the
+       curs_terminfo(3x) manual page.
+
+       Depending  on  the  configuration,  these  may  be actual variables, or
+       macros  (see  curs_threads(3x))  which  provide  read-only  access   to
+       curses's  state.   In  either  case,  applications should treat them as
+       read-only to avoid confusing the library.
+
+
+

Alternate Character Set Mapping

+       After initializing the curses or terminfo interfaces, the acs_map array
+       holds  information  used to translate cells with the A_ALTCHARSET video
+       attribute into line-drawing characters.
+
+       The encoding of the information in this array has changed periodically.
+       Application  developers  need  only know that it is used for the "ACS_"
+       constants in <curses.h>.
+
+       The comparable  data  for  the  wide-character  library  is  a  private
+       variable.
+
+
+

Current Terminal Data

+       After  initializing  the  curses  or  terminfo interfaces, the cur_term
+       contains data describing the current terminal.  This variable  is  also
+       set as a side-effect of set_term(3x) and delscreen(3x).
+
+       It  is  possible  to  save  a value of cur_term for subsequent use as a
+       parameter to set_term, for switching between  screens.   Alternatively,
+       one can save the return value from newterm or setupterm(3x) to reuse in
+       set_term.
+
+
+

terminfo Lookup Tables

+       The tic(1) and infocmp(1) programs use lookup tables for the  long  and
+       short  names  of  terminfo  capabilities,  as well as the corresponding
+       names  for  termcap  capabilities.   These  are  available   to   other
+       applications, although the hash-tables used by the terminfo and termcap
+       functions are not available.
+
+       The long terminfo capability names use a  "f"  (eff)  in  their  names:
+       boolfnames, numfnames, and strfnames.
+
+       These  are  the  short  names  for  terminfo  capabilities:  boolnames,
+       numnames, and strnames.
+
+       These are  the  corresponding  names  used  for  termcap  descriptions:
+       boolcodes, numcodes, and strcodes.
+
+
+

Terminal Type

+       A terminal description begins with one or more terminal names separated
+       by "|" (vertical bars).  On initialization of the  curses  or  terminfo
+       interfaces,  setupterm(3x)  copies  the  terminal  names  to  the array
+       ttytype.
+
+
+

terminfo Names

+       In addition to the variables, <term.h> also defines a symbol  for  each
+       terminfo  capability  long name.  These are in terms of the symbol CUR,
+       which is defined
+
+       #define CUR ((TERMTYPE *)(cur_term))->
+
+       These  symbols  provide  a  faster   method   of   accessing   terminfo
+       capabilities than using tigetstr(3x), etc.
+
+       The  actual definition of CUR depends upon the implementation, but each
+       terminfo library provides these long names defined to  point  into  the
+       current terminal description loaded into memory.
+
+
+

NOTES

+       The  low-level  terminfo  interface is initialized using setupterm(3x).
+       The upper-level curses interface uses the low-level terminfo interface,
+       internally.
+
+
+

PORTABILITY

+       X/Open Curses does not describe any of these except for cur_term.  (The
+       inclusion  of  cur_term  appears  to  be  an  oversight,  since   other
+       comparable low-level information is omitted by X/Open).
+
+       Other    implementations   may   have   comparable   variables.    Some
+       implementations provide the variables in their libraries, but omit them
+       from the header files.
+
+       All  implementations  which provide terminfo interfaces add definitions
+       as described in the Terminfo Names section.  Most, but  not  all,  base
+       the definition upon the cur_term variable.
+
+
+

SEE ALSO

+       curses(3x), curs_terminfo(3x), curs_threads(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-03-16                term_variables(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/terminfo.5.html b/contrib/ncurses/doc/html/man/terminfo.5.html new file mode 100644 index 00000000..b8644d32 --- /dev/null +++ b/contrib/ncurses/doc/html/man/terminfo.5.html @@ -0,0 +1,2534 @@ + + + + + + +terminfo 5 2024-05-11 ncurses 6.5 File formats + + + + +

terminfo 5 2024-05-11 ncurses 6.5 File formats

+
+terminfo(5)                      File formats                      terminfo(5)
+
+
+
+
+

NAME

+       terminfo - terminal capability database
+
+
+

SYNOPSIS

+       /usr/share/terminfo/*/*
+
+
+

DESCRIPTION

+       Terminfo  is  a  database describing terminals, used by screen-oriented
+       programs  such  as  nvi(1),  lynx(1),   mutt(1),   and   other   curses
+       applications,  using  high-level calls to libraries such as curses(3x).
+       It is also used via low-level calls by  non-curses  applications  which
+       may  be  screen-oriented  (such  as  clear(1))  or  non-screen (such as
+       tabs(1)).
+
+       Terminfo describes terminals by giving a set of capabilities which they
+       have, by specifying how to perform screen operations, and by specifying
+       padding requirements and initialization sequences.
+
+       This document describes ncurses version 6.5 (patch 20240921).
+
+
+

terminfo Entry Syntax

+       Entries in terminfo consist of a sequence of fields:
+
+       o   Each field ends with a comma "," (embedded commas  may  be  escaped
+           with a backslash or written as "\054").
+
+       o   White space between fields is ignored.
+
+       o   The first field in a terminfo entry begins in the first column.
+
+       o   Newlines  and  leading  whitespace (spaces or tabs) may be used for
+           formatting entries for readability.  These are removed from  parsed
+           entries.
+
+           The  infocmp  -f and -W options rely on this to format if-then-else
+           expressions, or  to  enforce  maximum  line-width.   The  resulting
+           formatted terminal description can be read by tic.
+
+       o   The  first  field for each terminal gives the names which are known
+           for the terminal, separated by "|" characters.
+
+           The first name given  is  the  most  common  abbreviation  for  the
+           terminal  (its  primary name), the last name given should be a long
+           name fully identifying the terminal  (see  longname(3x)),  and  all
+           others  are  treated as synonyms (aliases) for the primary terminal
+           name.
+
+           X/Open Curses advises that all names but  the  last  should  be  in
+           lower  case  and  contain no blanks; the last name may well contain
+           upper case and blanks for readability.
+
+           This implementation is not so strict; it allows mixed case  in  the
+           primary name and aliases.  If the last name has no embedded blanks,
+           it allows that to be both an alias and a  verbose  name  (but  will
+           warn about this ambiguity).
+
+       o   Lines  beginning  with  a  "#"  in  the first column are treated as
+           comments.
+
+           While comment lines are valid at any point, the output of captoinfo
+           and  infotocap  (aliases  for tic) will move comments so they occur
+           only between entries.
+
+       Terminal names (except for the last, verbose entry)  should  be  chosen
+       using  the  following  conventions.   The  particular piece of hardware
+       making up the terminal should have a root name,  thus  "hp2621".   This
+       name should not contain hyphens.  Modes that the hardware can be in, or
+       user preferences, should be indicated by appending a hyphen and a  mode
+       suffix.   Thus,  a  vt100  in  132-column  mode  would be vt100-w.  The
+       following suffixes should be used where possible:
+
+       Suffix   Example     Meaning
+       ------------------------------------------------------------------------
+       -nn      aaa-60      Number of lines on the screen
+       -np      c100-4p     Number of pages of memory
+       -am      vt100-am    With automargins (usually the default)
+       -m       ansi-m      Mono mode; suppress color
+       -mc      wy30-mc     Magic cookie; spaces when highlighting
+       -na      c100-na     No arrow keys (leave them in local)
+       -nam     vt100-nam   Without automatic margins
+       -nl      hp2621-nl   No status line
+       -ns      hp2626-ns   No status line
+       -rv      c100-rv     Reverse video
+       -s       vt100-s     Enable status line
+       -vb      wy370-vb    Use visible bell instead of beep
+       -w       vt100-w     Wide mode (> 80 columns, usually 132)
+
+       For more on terminal naming conventions, see the term(7) manual page.
+
+
+

terminfo Capabilities Syntax

+       The terminfo entry consists of  several  capabilities,  i.e.,  features
+       that  the  terminal  has,  or  methods  for  exercising  the terminal's
+       features.
+
+       After the first field (giving the name(s) of the terminal entry), there
+       should be one or more capability fields.  These are Boolean, numeric or
+       string names with corresponding values:
+
+       o   Boolean capabilities are true  when  present,  false  when  absent.
+           There is no explicit value for Boolean capabilities.
+
+       o   Numeric  capabilities  have  a  "#"  following  the  name,  then an
+           unsigned decimal integer value.
+
+       o   String capabilities have a "=" following the name, then  an  string
+           of characters making up the capability value.
+
+           String  capabilities  can be split into multiple lines, just as the
+           fields comprising a terminal  entry  can  be  split  into  multiple
+           lines.   While  blanks  between fields are ignored, blanks embedded
+           within a string value are retained, except for leading blanks on  a
+           line.
+
+       Any  capability  can  be  canceled,  i.e., suppressed from the terminal
+       entry, by following its name with "@" rather than a capability value.
+
+
+

Similar Terminals

+       If there are two very similar  terminals,  one  (the  variant)  can  be
+       defined   as  being  just  like  the  other  (the  base)  with  certain
+       exceptions.  In the definition of the variant,  the  string  capability
+       use can be given with the name of the base terminal:
+
+       o   The  capabilities  given before use override those in the base type
+           named by use.
+
+       o   If there are multiple use capabilities, they are merged in  reverse
+           order.   That  is,  the rightmost use reference is processed first,
+           then the one to its left, and so forth.
+
+       o   Capabilities given explicitly in the entry override  those  brought
+           in by use references.
+
+       A  capability  can  be  canceled  by placing xx@ to the left of the use
+       reference that imports it, where xx is the  capability.   For  example,
+       the entry
+
+              2621-nl, smkx@, rmkx@, use=2621,
+
+       defines a 2621-nl that does not have the smkx or rmkx capabilities, and
+       hence does not turn on the function key labels  when  in  visual  mode.
+       This  is  useful  for  different modes for a terminal, or for different
+       user preferences.
+
+       An entry included via use can contain canceled capabilities, which have
+       the  same  effect as if those cancels were inline in the using terminal
+       entry.
+
+
+

Predefined Capabilities

+       Tables of capabilities ncurses recognizes in a terminfo  terminal  type
+       description and available to terminfo-using code follow.
+
+       o   The  capability  name identifies the symbol by which the programmer
+           using the terminfo API accesses the capability.
+
+       o   The TI (terminfo) code is the short name used by a person composing
+           or updating a terminal type entry.
+
+           Whenever  possible, these codes are the same as or similar to those
+           of the ANSI X3.64-1979 standard (now superseded by  ECMA-48,  which
+           uses identical or very similar names).  Semantics are also intended
+           to match those of the specification.
+
+           terminfo codes have no hard length limit, but ncurses maintains  an
+           informal  one  of  5 characters to keep them short and to allow the
+           tabs in the source file Caps to line  up  nicely.   (Some  standard
+           codes exceed this limit regardless.)
+
+       o   The  TC  (termcap)  code  is  that used by the corresponding API of
+           ncurses.  (Some capabilities are  new,  and  have  names  that  BSD
+           termcap did not originate.)
+
+       o   The   description   field   attempts  to  convey  the  capability's
+           semantics.
+
+       The description field employs a handful of notations.
+
+       (P)    indicates that padding may be specified.
+
+       (P*)   indicates that padding may vary in proportion to the  number  of
+              output lines affected.
+
+       #i     indicates   the  ith  parameter  of  a  string  capability;  the
+              programmer  should  pass  the  string  to  tparm(3x)  with   the
+              parameters listed.
+
+              If  the  description  lists no parameters, passing the string to
+              tparm(3x) may produce unexpected behavior, for instance  if  the
+              string contains percent signs.
+
+                                      Code
+       Boolean Capability Name    TI        TC  Description
+       ------------------------------------------------------------------------
+
+
+       auto_left_margin           bw        bw  cub1 wraps from column 0 to
+                                                last column
+       auto_right_margin          am        am  terminal has automatic margins
+       no_esc_ctlc                xsb       xb  beehive (f1=escape, f2=ctrl C)
+       ceol_standout_glitch       xhp       xs  standout not erased by
+                                                overwriting (hp)
+       eat_newline_glitch         xenl      xn  newline ignored after 80 cols
+                                                (concept)
+       erase_overstrike           eo        eo  can erase overstrikes with a
+                                                blank
+       generic_type               gn        gn  generic line type
+       hard_copy                  hc        hc  hardcopy terminal
+       has_meta_key               km        km  Has a meta key (i.e., sets
+                                                8th-bit)
+       has_status_line            hs        hs  has extra status line
+       insert_null_glitch         in        in  insert mode distinguishes
+                                                nulls
+       memory_above               da        da  display may be retained above
+                                                the screen
+       memory_below               db        db  display may be retained below
+                                                the screen
+       move_insert_mode           mir       mi  safe to move while in insert
+                                                mode
+       move_standout_mode         msgr      ms  safe to move while in standout
+                                                mode
+       over_strike                os        os  terminal can overstrike
+       status_line_esc_ok         eslok     es  escape can be used on the
+                                                status line
+       dest_tabs_magic_smso       xt        xt  tabs destructive, magic so
+                                                char (t1061)
+       tilde_glitch               hz        hz  cannot print ~'s (Hazeltine)
+       transparent_underline      ul        ul  underline character
+                                                overstrikes
+       xon_xoff                   xon       xo  terminal uses xon/xoff
+                                                handshaking
+       needs_xon_xoff             nxon      nx  padding will not work,
+                                                xon/xoff required
+       prtr_silent                mc5i      5i  printer will not echo on
+                                                screen
+       hard_cursor                chts      HC  cursor is hard to see
+       non_rev_rmcup              nrrmc     NR  smcup does not reverse rmcup
+       no_pad_char                npc       NP  pad character does not exist
+       non_dest_scroll_region     ndscr     ND  scrolling region is non-
+                                                destructive
+       can_change                 ccc       cc  terminal can re-define
+                                                existing colors
+       back_color_erase           bce       ut  screen erased with background
+                                                color
+       hue_lightness_saturation   hls       hl  terminal uses only HLS color
+                                                notation (Tektronix)
+       col_addr_glitch            xhpa      YA  only positive motion for
+                                                hpa/mhpa caps
+       cr_cancels_micro_mode      crxm      YB  using cr turns off micro mode
+       has_print_wheel            daisy     YC  printer needs operator to
+                                                change character set
+       row_addr_glitch            xvpa      YD  only positive motion for
+                                                vpa/mvpa caps
+       semi_auto_right_margin     sam       YE  printing in last column causes
+                                                cr
+       cpi_changes_res            cpix      YF  changing character pitch
+                                                changes resolution
+       lpi_changes_res            lpix      YG  changing line pitch changes
+                                                resolution
+
+                                      Code
+
+       Numeric Capability Name    TI        TC  Description
+       ------------------------------------------------------------------------
+       columns                    cols      co  number of columns in a line
+       init_tabs                  it        it  tabs initially every # spaces
+       lines                      lines     li  number of lines on screen or
+                                                page
+       lines_of_memory            lm        lm  lines of memory if > line. 0
+                                                means varies
+       magic_cookie_glitch        xmc       sg  number of blank characters
+                                                left by smso or rmso
+       padding_baud_rate          pb        pb  lowest baud rate where padding
+                                                needed
+       virtual_terminal           vt        vt  virtual terminal number
+                                                (CB/unix)
+       width_status_line          wsl       ws  number of columns in status
+                                                line
+       num_labels                 nlab      Nl  number of labels on screen
+       label_height               lh        lh  rows in each label
+       label_width                lw        lw  columns in each label
+       max_attributes             ma        ma  maximum combined attributes
+                                                terminal can handle
+       maximum_windows            wnum      MW  maximum number of definable
+                                                windows
+       max_colors                 colors    Co  maximum number of colors on
+                                                screen
+       max_pairs                  pairs     pa  maximum number of color-pairs
+                                                on the screen
+       no_color_video             ncv       NC  video attributes that cannot
+                                                be used with colors
+
+       The following numeric capabilities  are  present  in  the  SVr4.0  term
+       structure,  but  are  not yet documented in the man page.  They came in
+       with SVr4's printer support.
+
+                                      Code
+       Numeric Capability Name    TI        TC  Description
+       ------------------------------------------------------------------------
+       buffer_capacity            bufsz     Ya  numbers of bytes buffered
+                                                before printing
+       dot_vert_spacing           spinv     Yb  spacing of pins vertically in
+                                                pins per inch
+       dot_horz_spacing           spinh     Yc  spacing of dots horizontally
+                                                in dots per inch
+       max_micro_address          maddr     Yd  maximum value in
+                                                micro_..._address
+       max_micro_jump             mjump     Ye  maximum value in
+                                                parm_..._micro
+       micro_col_size             mcs       Yf  character step size when in
+                                                micro mode
+       micro_line_size            mls       Yg  line step size when in micro
+                                                mode
+       number_of_pins             npins     Yh  numbers of pins in print-head
+       output_res_char            orc       Yi  horizontal resolution in units
+                                                per line
+       output_res_line            orl       Yj  vertical resolution in units
+                                                per line
+       output_res_horz_inch       orhi      Yk  horizontal resolution in units
+                                                per inch
+       output_res_vert_inch       orvi      Yl  vertical resolution in units
+                                                per inch
+       print_rate                 cps       Ym  print rate in characters per
+                                                second
+       wide_char_size             widcs     Yn  character step size when in
+                                                double wide mode
+       buttons                    btns      BT  number of buttons on mouse
+
+       bit_image_entwining        bitwin    Yo  number of passes for each bit-
+                                                image row
+       bit_image_type             bitype    Yp  type of bit-image device
+
+                                      Code
+       String Capability Name     TI        TC  Description
+       ------------------------------------------------------------------------
+       back_tab                   cbt       bt  back tab (P)
+       bell                       bel       bl  audible signal (bell) (P)
+       carriage_return            cr        cr  carriage return (P*) (P*)
+       change_scroll_region       csr       cs  change region to line #1 to
+                                                line #2 (P)
+       clear_all_tabs             tbc       ct  clear all tab stops (P)
+       clear_screen               clear     cl  clear screen and home cursor
+                                                (P*)
+       clr_eol                    el        ce  clear to end of line (P)
+       clr_eos                    ed        cd  clear to end of screen (P*)
+       column_address             hpa       ch  horizontal position #1,
+                                                absolute (P)
+       command_character          cmdch     CC  terminal settable cmd
+                                                character in prototype !?
+       cursor_address             cup       cm  move to row #1 columns #2
+       cursor_down                cud1      do  down one line
+       cursor_home                home      ho  home cursor (if no cup)
+       cursor_invisible           civis     vi  make cursor invisible
+       cursor_left                cub1      le  move left one space
+       cursor_mem_address         mrcup     CM  memory relative cursor
+                                                addressing, move to row #1
+                                                columns #2
+       cursor_normal              cnorm     ve  make cursor appear normal
+                                                (undo civis/cvvis)
+       cursor_right               cuf1      nd  non-destructive space (move
+                                                right one space)
+       cursor_to_ll               ll        ll  last line, first column (if no
+                                                cup)
+       cursor_up                  cuu1      up  up one line
+       cursor_visible             cvvis     vs  make cursor very visible
+       delete_character           dch1      dc  delete character (P*)
+       delete_line                dl1       dl  delete line (P*)
+       dis_status_line            dsl       ds  disable status line
+       down_half_line             hd        hd  half a line down
+       enter_alt_charset_mode     smacs     as  start alternate character set
+                                                (P)
+       enter_blink_mode           blink     mb  turn on blinking
+       enter_bold_mode            bold      md  turn on bold (extra bright)
+                                                mode
+       enter_ca_mode              smcup     ti  string to start programs using
+                                                cup
+       enter_delete_mode          smdc      dm  enter delete mode
+       enter_dim_mode             dim       mh  turn on half-bright mode
+       enter_insert_mode          smir      im  enter insert mode
+       enter_secure_mode          invis     mk  turn on blank mode (characters
+                                                invisible)
+       enter_protected_mode       prot      mp  turn on protected mode
+       enter_reverse_mode         rev       mr  turn on reverse video mode
+       enter_standout_mode        smso      so  begin standout mode
+       enter_underline_mode       smul      us  begin underline mode
+       erase_chars                ech       ec  erase #1 characters (P)
+       exit_alt_charset_mode      rmacs     ae  end alternate character set
+                                                (P)
+       exit_attribute_mode        sgr0      me  turn off all attributes
+       exit_ca_mode               rmcup     te  strings to end programs using
+                                                cup
+       exit_delete_mode           rmdc      ed  end delete mode
+       exit_insert_mode           rmir      ei  exit insert mode
+
+       exit_standout_mode         rmso      se  exit standout mode
+       exit_underline_mode        rmul      ue  exit underline mode
+       flash_screen               flash     vb  visible bell (may not move
+                                                cursor)
+       form_feed                  ff        ff  hardcopy terminal page eject
+                                                (P*)
+       from_status_line           fsl       fs  return from status line
+       init_1string               is1       i1  initialization string
+       init_2string               is2       is  initialization string
+       init_3string               is3       i3  initialization string
+       init_file                  if        if  name of initialization file
+       insert_character           ich1      ic  insert character (P)
+       insert_line                il1       al  insert line (P*)
+       insert_padding             ip        ip  insert padding after inserted
+                                                character
+       key_backspace              kbs       kb  backspace key
+       key_catab                  ktbc      ka  clear-all-tabs key
+       key_clear                  kclr      kC  clear-screen or erase key
+       key_ctab                   kctab     kt  clear-tab key
+       key_dc                     kdch1     kD  delete-character key
+       key_dl                     kdl1      kL  delete-line key
+       key_down                   kcud1     kd  down-arrow key
+
+       key_eic                    krmir     kM  sent by rmir or smir in insert
+                                                mode
+       key_eol                    kel       kE  clear-to-end-of-line key
+       key_eos                    ked       kS  clear-to-end-of-screen key
+       key_f0                     kf0       k0  F0 function key
+       key_f1                     kf1       k1  F1 function key
+       key_f10                    kf10      k;  F10 function key
+       key_f2                     kf2       k2  F2 function key
+       key_f3                     kf3       k3  F3 function key
+       key_f4                     kf4       k4  F4 function key
+       key_f5                     kf5       k5  F5 function key
+       key_f6                     kf6       k6  F6 function key
+       key_f7                     kf7       k7  F7 function key
+       key_f8                     kf8       k8  F8 function key
+       key_f9                     kf9       k9  F9 function key
+       key_home                   khome     kh  home key
+       key_ic                     kich1     kI  insert-character key
+       key_il                     kil1      kA  insert-line key
+       key_left                   kcub1     kl  left-arrow key
+       key_ll                     kll       kH  lower-left key (home down)
+       key_npage                  knp       kN  next-page key
+       key_ppage                  kpp       kP  previous-page key
+       key_right                  kcuf1     kr  right-arrow key
+       key_sf                     kind      kF  scroll-forward key
+       key_sr                     kri       kR  scroll-backward key
+       key_stab                   khts      kT  set-tab key
+       key_up                     kcuu1     ku  up-arrow key
+       keypad_local               rmkx      ke  leave keyboard transmit mode
+       keypad_xmit                smkx      ks  enter keyboard transmit mode
+       lab_f0                     lf0       l0  label on function key f0 if
+                                                not f0
+       lab_f1                     lf1       l1  label on function key f1 if
+                                                not f1
+       lab_f10                    lf10      la  label on function key f10 if
+                                                not f10
+       lab_f2                     lf2       l2  label on function key f2 if
+                                                not f2
+       lab_f3                     lf3       l3  label on function key f3 if
+                                                not f3
+       lab_f4                     lf4       l4  label on function key f4 if
+                                                not f4
+
+
+       lab_f5                     lf5       l5  label on function key f5 if
+                                                not f5
+       lab_f6                     lf6       l6  label on function key f6 if
+                                                not f6
+       lab_f7                     lf7       l7  label on function key f7 if
+                                                not f7
+       lab_f8                     lf8       l8  label on function key f8 if
+                                                not f8
+       lab_f9                     lf9       l9  label on function key f9 if
+                                                not f9
+       meta_off                   rmm       mo  turn off meta mode
+       meta_on                    smm       mm  turn on meta mode (8th-bit on)
+       newline                    nel       nw  newline (behave like cr
+                                                followed by lf)
+       pad_char                   pad       pc  padding char (instead of null)
+       parm_dch                   dch       DC  delete #1 characters (P*)
+       parm_delete_line           dl        DL  delete #1 lines (P*)
+       parm_down_cursor           cud       DO  down #1 lines (P*)
+       parm_ich                   ich       IC  insert #1 characters (P*)
+       parm_index                 indn      SF  scroll forward #1 lines (P)
+       parm_insert_line           il        AL  insert #1 lines (P*)
+       parm_left_cursor           cub       LE  move #1 characters to the left
+                                                (P)
+       parm_right_cursor          cuf       RI  move #1 characters to the
+                                                right (P*)
+       parm_rindex                rin       SR  scroll back #1 lines (P)
+       parm_up_cursor             cuu       UP  up #1 lines (P*)
+       pkey_key                   pfkey     pk  program function key #1 to
+                                                type string #2
+       pkey_local                 pfloc     pl  program function key #1 to
+                                                execute string #2
+       pkey_xmit                  pfx       px  program function key #1 to
+                                                transmit string #2
+       print_screen               mc0       ps  print contents of screen
+       prtr_off                   mc4       pf  turn off printer
+       prtr_on                    mc5       po  turn on printer
+       repeat_char                rep       rp  repeat char #1 #2 times (P*)
+       reset_1string              rs1       r1  reset string
+       reset_2string              rs2       r2  reset string
+
+       reset_3string              rs3       r3  reset string
+       reset_file                 rf        rf  name of reset file
+       restore_cursor             rc        rc  restore cursor to position of
+                                                last save_cursor
+       row_address                vpa       cv  vertical position #1 absolute
+                                                (P)
+       save_cursor                sc        sc  save current cursor position
+                                                (P)
+       scroll_forward             ind       sf  scroll text up (P)
+       scroll_reverse             ri        sr  scroll text down (P)
+       set_attributes             sgr       sa  define video attributes #1-#9
+                                                (PG9)
+       set_tab                    hts       st  set a tab in every row,
+                                                current columns
+       set_window                 wind      wi  current window is lines #1-#2
+                                                cols #3-#4
+       tab                        ht        ta  tab to next 8-space hardware
+                                                tab stop
+       to_status_line             tsl       ts  move to status line, column #1
+       underline_char             uc        uc  underline char and move past
+                                                it
+       up_half_line               hu        hu  half a line up
+       init_prog                  iprog     iP  path name of program for
+                                                initialization
+       key_a1                     ka1       K1  upper left of keypad
+
+       key_a3                     ka3       K3  upper right of keypad
+       key_b2                     kb2       K2  center of keypad
+       key_c1                     kc1       K4  lower left of keypad
+       key_c3                     kc3       K5  lower right of keypad
+       prtr_non                   mc5p      pO  turn on printer for #1 bytes
+       char_padding               rmp       rP  like ip but when in insert
+                                                mode
+       acs_chars                  acsc      ac  graphics charset pairs, based
+                                                on vt100
+       plab_norm                  pln       pn  program label #1 to show
+                                                string #2
+       key_btab                   kcbt      kB  back-tab key
+       enter_xon_mode             smxon     SX  turn on xon/xoff handshaking
+       exit_xon_mode              rmxon     RX  turn off xon/xoff handshaking
+       enter_am_mode              smam      SA  turn on automatic margins
+       exit_am_mode               rmam      RA  turn off automatic margins
+       xon_character              xonc      XN  XON character
+       xoff_character             xoffc     XF  XOFF character
+       ena_acs                    enacs     eA  enable alternate char set
+       label_on                   smln      LO  turn on soft labels
+       label_off                  rmln      LF  turn off soft labels
+       key_beg                    kbeg      @1  begin key
+       key_cancel                 kcan      @2  cancel key
+       key_close                  kclo      @3  close key
+       key_command                kcmd      @4  command key
+       key_copy                   kcpy      @5  copy key
+       key_create                 kcrt      @6  create key
+       key_end                    kend      @7  end key
+       key_enter                  kent      @8  enter/send key
+       key_exit                   kext      @9  exit key
+       key_find                   kfnd      @0  find key
+       key_help                   khlp      %1  help key
+       key_mark                   kmrk      %2  mark key
+       key_message                kmsg      %3  message key
+       key_move                   kmov      %4  move key
+       key_next                   knxt      %5  next key
+       key_open                   kopn      %6  open key
+       key_options                kopt      %7  options key
+       key_previous               kprv      %8  previous key
+       key_print                  kprt      %9  print key
+       key_redo                   krdo      %0  redo key
+       key_reference              kref      &1  reference key
+       key_refresh                krfr      &2  refresh key
+       key_replace                krpl      &3  replace key
+       key_restart                krst      &4  restart key
+       key_resume                 kres      &5  resume key
+       key_save                   ksav      &6  save key
+       key_suspend                kspd      &7  suspend key
+       key_undo                   kund      &8  undo key
+
+       key_sbeg                   kBEG      &9  shifted begin key
+       key_scancel                kCAN      &0  shifted cancel key
+       key_scommand               kCMD      *1  shifted command key
+       key_scopy                  kCPY      *2  shifted copy key
+       key_screate                kCRT      *3  shifted create key
+       key_sdc                    kDC       *4  shifted delete-character key
+       key_sdl                    kDL       *5  shifted delete-line key
+       key_select                 kslt      *6  select key
+       key_send                   kEND      *7  shifted end key
+       key_seol                   kEOL      *8  shifted clear-to-end-of-line
+                                                key
+       key_sexit                  kEXT      *9  shifted exit key
+       key_sfind                  kFND      *0  shifted find key
+       key_shelp                  kHLP      #1  shifted help key
+       key_shome                  kHOM      #2  shifted home key
+
+       key_sic                    kIC       #3  shifted insert-character key
+       key_sleft                  kLFT      #4  shifted left-arrow key
+       key_smessage               kMSG      %a  shifted message key
+       key_smove                  kMOV      %b  shifted move key
+       key_snext                  kNXT      %c  shifted next key
+       key_soptions               kOPT      %d  shifted options key
+       key_sprevious              kPRV      %e  shifted previous key
+       key_sprint                 kPRT      %f  shifted print key
+       key_sredo                  kRDO      %g  shifted redo key
+       key_sreplace               kRPL      %h  shifted replace key
+       key_sright                 kRIT      %i  shifted right-arrow key
+       key_srsume                 kRES      %j  shifted resume key
+       key_ssave                  kSAV      !1  shifted save key
+       key_ssuspend               kSPD      !2  shifted suspend key
+       key_sundo                  kUND      !3  shifted undo key
+       req_for_input              rfi       RF  send next input char (for
+                                                ptys)
+       key_f11                    kf11      F1  F11 function key
+       key_f12                    kf12      F2  F12 function key
+       key_f13                    kf13      F3  F13 function key
+       key_f14                    kf14      F4  F14 function key
+       key_f15                    kf15      F5  F15 function key
+       key_f16                    kf16      F6  F16 function key
+       key_f17                    kf17      F7  F17 function key
+       key_f18                    kf18      F8  F18 function key
+       key_f19                    kf19      F9  F19 function key
+       key_f20                    kf20      FA  F20 function key
+       key_f21                    kf21      FB  F21 function key
+       key_f22                    kf22      FC  F22 function key
+       key_f23                    kf23      FD  F23 function key
+       key_f24                    kf24      FE  F24 function key
+       key_f25                    kf25      FF  F25 function key
+       key_f26                    kf26      FG  F26 function key
+       key_f27                    kf27      FH  F27 function key
+       key_f28                    kf28      FI  F28 function key
+       key_f29                    kf29      FJ  F29 function key
+       key_f30                    kf30      FK  F30 function key
+       key_f31                    kf31      FL  F31 function key
+       key_f32                    kf32      FM  F32 function key
+       key_f33                    kf33      FN  F33 function key
+       key_f34                    kf34      FO  F34 function key
+       key_f35                    kf35      FP  F35 function key
+       key_f36                    kf36      FQ  F36 function key
+       key_f37                    kf37      FR  F37 function key
+       key_f38                    kf38      FS  F38 function key
+       key_f39                    kf39      FT  F39 function key
+       key_f40                    kf40      FU  F40 function key
+       key_f41                    kf41      FV  F41 function key
+       key_f42                    kf42      FW  F42 function key
+
+       key_f43                    kf43      FX  F43 function key
+       key_f44                    kf44      FY  F44 function key
+       key_f45                    kf45      FZ  F45 function key
+       key_f46                    kf46      Fa  F46 function key
+       key_f47                    kf47      Fb  F47 function key
+       key_f48                    kf48      Fc  F48 function key
+       key_f49                    kf49      Fd  F49 function key
+       key_f50                    kf50      Fe  F50 function key
+       key_f51                    kf51      Ff  F51 function key
+       key_f52                    kf52      Fg  F52 function key
+       key_f53                    kf53      Fh  F53 function key
+       key_f54                    kf54      Fi  F54 function key
+       key_f55                    kf55      Fj  F55 function key
+       key_f56                    kf56      Fk  F56 function key
+       key_f57                    kf57      Fl  F57 function key
+
+       key_f58                    kf58      Fm  F58 function key
+       key_f59                    kf59      Fn  F59 function key
+       key_f60                    kf60      Fo  F60 function key
+       key_f61                    kf61      Fp  F61 function key
+       key_f62                    kf62      Fq  F62 function key
+       key_f63                    kf63      Fr  F63 function key
+       clr_bol                    el1       cb  Clear to beginning of line
+       clear_margins              mgc       MC  clear right and left soft
+                                                margins
+       set_left_margin            smgl      ML  set left soft margin at
+                                                current column (not in BSD
+                                                termcap)
+       set_right_margin           smgr      MR  set right soft margin at
+                                                current column
+       label_format               fln       Lf  label format
+       set_clock                  sclk      SC  set clock, #1 hrs #2 mins #3
+                                                secs
+       display_clock              dclk      DK  display clock
+       remove_clock               rmclk     RC  remove clock
+       create_window              cwin      CW  define a window #1 from #2,#3
+                                                to #4,#5
+       goto_window                wingo     WG  go to window #1
+       hangup                     hup       HU  hang-up phone
+       dial_phone                 dial      DI  dial number #1
+       quick_dial                 qdial     QD  dial number #1 without
+                                                checking
+       tone                       tone      TO  select touch tone dialing
+       pulse                      pulse     PU  select pulse dialing
+       flash_hook                 hook      fh  flash switch hook
+       fixed_pause                pause     PA  pause for 2-3 seconds
+       wait_tone                  wait      WA  wait for dial-tone
+       user0                      u0        u0  User string #0
+       user1                      u1        u1  User string #1
+       user2                      u2        u2  User string #2
+       user3                      u3        u3  User string #3
+       user4                      u4        u4  User string #4
+       user5                      u5        u5  User string #5
+       user6                      u6        u6  User string #6
+       user7                      u7        u7  User string #7
+       user8                      u8        u8  User string #8
+       user9                      u9        u9  User string #9
+       orig_pair                  op        op  Set default pair to its
+                                                original value
+       orig_colors                oc        oc  Set all color pairs to the
+                                                original ones
+       initialize_color           initc     Ic  initialize color #1 to
+                                                (#2,#3,#4)
+       initialize_pair            initp     Ip  Initialize color pair #1 to
+                                                fg=(#2,#3,#4), bg=(#5,#6,#7)
+       set_color_pair             scp       sp  Set current color pair to #1
+       set_foreground             setf      Sf  Set foreground color #1
+       set_background             setb      Sb  Set background color #1
+       change_char_pitch          cpi       ZA  Change number of characters
+                                                per inch to #1
+       change_line_pitch          lpi       ZB  Change number of lines per
+                                                inch to #1
+       change_res_horz            chr       ZC  Change horizontal resolution
+                                                to #1
+       change_res_vert            cvr       ZD  Change vertical resolution to
+                                                #1
+       define_char                defc      ZE  Define a character #1, #2 dots
+                                                wide, descender #3
+       enter_doublewide_mode      swidm     ZF  Enter double-wide mode
+
+       enter_draft_quality        sdrfq     ZG  Enter draft-quality mode
+
+       enter_italics_mode         sitm      ZH  Enter italic mode
+       enter_leftward_mode        slm       ZI  Start leftward carriage motion
+       enter_micro_mode           smicm     ZJ  Start micro-motion mode
+       enter_near_letter_quality  snlq      ZK  Enter NLQ mode
+       enter_normal_quality       snrmq     ZL  Enter normal-quality mode
+       enter_shadow_mode          sshm      ZM  Enter shadow-print mode
+       enter_subscript_mode       ssubm     ZN  Enter subscript mode
+       enter_superscript_mode     ssupm     ZO  Enter superscript mode
+       enter_upward_mode          sum       ZP  Start upward carriage motion
+       exit_doublewide_mode       rwidm     ZQ  End double-wide mode
+       exit_italics_mode          ritm      ZR  End italic mode
+       exit_leftward_mode         rlm       ZS  End left-motion mode
+       exit_micro_mode            rmicm     ZT  End micro-motion mode
+       exit_shadow_mode           rshm      ZU  End shadow-print mode
+       exit_subscript_mode        rsubm     ZV  End subscript mode
+       exit_superscript_mode      rsupm     ZW  End superscript mode
+       exit_upward_mode           rum       ZX  End reverse character motion
+       micro_column_address       mhpa      ZY  Like column_address in micro
+                                                mode
+       micro_down                 mcud1     ZZ  Like cursor_down in micro mode
+       micro_left                 mcub1     Za  Like cursor_left in micro mode
+       micro_right                mcuf1     Zb  Like cursor_right in micro
+                                                mode
+       micro_row_address          mvpa      Zc  Like row_address #1 in micro
+                                                mode
+       micro_up                   mcuu1     Zd  Like cursor_up in micro mode
+       order_of_pins              porder    Ze  Match software bits to print-
+                                                head pins
+       parm_down_micro            mcud      Zf  Like parm_down_cursor in micro
+                                                mode
+       parm_left_micro            mcub      Zg  Like parm_left_cursor in micro
+                                                mode
+       parm_right_micro           mcuf      Zh  Like parm_right_cursor in
+                                                micro mode
+       parm_up_micro              mcuu      Zi  Like parm_up_cursor in micro
+                                                mode
+       select_char_set            scs       Zj  Select character set, #1
+       set_bottom_margin          smgb      Zk  Set bottom margin at current
+                                                line
+       set_bottom_margin_parm     smgbp     Zl  Set bottom margin at line #1
+                                                or (if smgtp is not given) #2
+                                                lines from bottom
+       set_left_margin_parm       smglp     Zm  Set left (right) margin at
+                                                column #1
+       set_right_margin_parm      smgrp     Zn  Set right margin at column #1
+       set_top_margin             smgt      Zo  Set top margin at current line
+       set_top_margin_parm        smgtp     Zp  Set top (bottom) margin at row
+                                                #1
+       start_bit_image            sbim      Zq  Start printing bit image
+                                                graphics
+       start_char_set_def         scsd      Zr  Start character set definition
+                                                #1, with #2 characters in the
+                                                set
+       stop_bit_image             rbim      Zs  Stop printing bit image
+                                                graphics
+       stop_char_set_def          rcsd      Zt  End definition of character
+                                                set #1
+       subscript_characters       subcs     Zu  List of subscriptable
+                                                characters
+       superscript_characters     supcs     Zv  List of superscriptable
+                                                characters
+       these_cause_cr             docr      Zw  Printing any of these
+                                                characters causes CR
+       zero_motion                zerom     Zx  No motion for subsequent
+                                                character
+
+       The following string  capabilities  are  present  in  the  SVr4.0  term
+       structure, but were originally not documented in the man page.
+
+                                      Code
+       String Capability Name     TI        TC  Description
+       ------------------------------------------------------------------------
+       char_set_names             csnm      Zy  Produce #1'th item from list
+                                                of character set names
+       key_mouse                  kmous     Km  Mouse event has occurred
+       mouse_info                 minfo     Mi  Mouse status information
+       req_mouse_pos              reqmp     RQ  Request mouse position
+       get_mouse                  getm      Gm  Curses should get button
+                                                events, parameter #1 not
+                                                documented.
+       set_a_foreground           setaf     AF  Set foreground color to #1,
+                                                using ANSI escape
+       set_a_background           setab     AB  Set background color to #1,
+                                                using ANSI escape
+       pkey_plab                  pfxl      xl  Program function key #1 to
+                                                type string #2 and show string
+                                                #3
+       device_type                devt      dv  Indicate language, codeset
+                                                support
+       code_set_init              csin      ci  Init sequence for multiple
+                                                codesets
+       set0_des_seq               s0ds      s0  Shift to codeset 0 (EUC set 0,
+                                                ASCII)
+       set1_des_seq               s1ds      s1  Shift to codeset 1
+       set2_des_seq               s2ds      s2  Shift to codeset 2
+       set3_des_seq               s3ds      s3  Shift to codeset 3
+       set_lr_margin              smglr     ML  Set both left and right
+                                                margins to #1, #2.  (ML is not
+                                                in BSD termcap).
+       set_tb_margin              smgtb     MT  Sets both top and bottom
+                                                margins to #1, #2
+       bit_image_repeat           birep     Xy  Repeat bit image cell #1 #2
+                                                times
+       bit_image_newline          binel     Zz  Move to next row of the bit
+                                                image
+       bit_image_carriage_return  bicr      Yv  Move to beginning of same row
+       color_names                colornm   Yw  Give name for color #1
+       define_bit_image_region    defbi     Yx  Define rectangular bit image
+                                                region
+       end_bit_image_region       endbi     Yy  End a bit-image region
+       set_color_band             setcolor  Yz  Change to ribbon color #1
+       set_page_length            slines    YZ  Set page length to #1 lines
+       display_pc_char            dispc     S1  Display PC character #1
+       enter_pc_charset_mode      smpch     S2  Enter PC character display
+                                                mode
+       exit_pc_charset_mode       rmpch     S3  Exit PC character display mode
+       enter_scancode_mode        smsc      S4  Enter PC scancode mode
+       exit_scancode_mode         rmsc      S5  Exit PC scancode mode
+       pc_term_options            pctrm     S6  PC terminal options
+       scancode_escape            scesc     S7  Escape for scancode emulation
+       alt_scancode_esc           scesa     S8  Alternate escape for scancode
+                                                emulation
+
+       The  XSI  Curses standard added these hardcopy capabilities.  They were
+       used in some post-4.1 versions of System V curses,  e.g.,  Solaris  2.5
+       and  IRIX  6.x.   Except for YI, the ncurses termcap names for them are
+       invented.  According to the XSI Curses standard, they have  no  termcap
+       names.   If  your  compiled terminfo entries use these, they may not be
+       binary-compatible with System V terminfo entries after SVr4.1; beware!
+
+                                      Code
+
+       String Capability Name     TI        TC  Description
+       ------------------------------------------------------------------------
+       enter_horizontal_hl_mode   ehhlm     Xh  Enter horizontal highlight
+                                                mode
+       enter_left_hl_mode         elhlm     Xl  Enter left highlight mode
+       enter_low_hl_mode          elohlm    Xo  Enter low highlight mode
+       enter_right_hl_mode        erhlm     Xr  Enter right highlight mode
+       enter_top_hl_mode          ethlm     Xt  Enter top highlight mode
+       enter_vertical_hl_mode     evhlm     Xv  Enter vertical highlight mode
+       set_a_attributes           sgr1      sA  Define second set of video
+                                                attributes #1-#6
+       set_pglen_inch             slength   YI  Set page length to #1
+                                                hundredth of an inch (some
+                                                implementations use sL for
+                                                termcap).
+
+
+

User-Defined Capabilities

+       The  preceding  section  listed the predefined capabilities.  They deal
+       with some special features for terminals no longer (or possibly  never)
+       produced.   Occasionally  there are special features of newer terminals
+       which are awkward or impossible to represent by reusing the  predefined
+       capabilities.
+
+       ncurses    addresses   this   limitation   by   allowing   user-defined
+       capabilities.  The tic and infocmp programs provide the -x  option  for
+       this purpose.  When -x is set, tic treats unknown capabilities as user-
+       defined.  That is, if tic encounters a capability name  which  it  does
+       not  recognize, it infers its type (Boolean, number or string) from the
+       syntax and makes an extended table  entry  for  that  capability.   The
+       use_extended_names(3x)  function  makes  this information conditionally
+       available to applications.   The  ncurses  library  provides  the  data
+       leaving most of the behavior to applications:
+
+       o   User-defined  capability  strings  whose  name  begins with "k" are
+           treated as function keys.
+
+       o   The types (Boolean,  number,  string)  determined  by  tic  can  be
+           inferred by successful calls on tigetflag, etc.
+
+       o   If the capability name happens to be two characters, the capability
+           is also available through the termcap interface.
+
+       While termcap is said to be  extensible  because  it  does  not  use  a
+       predefined  set of capabilities, in practice it has been limited to the
+       capabilities defined by terminfo implementations.   As  a  rule,  user-
+       defined capabilities intended for use by termcap applications should be
+       limited to Booleans and numbers to avoid running  past  the  1023  byte
+       limit  assumed  by  termcap implementations and their applications.  In
+       particular, providing extended sets  of  function  keys  (past  the  60
+       numbered keys and the handful of special named keys) is best done using
+       the longer names available using terminfo.
+
+       The ncurses library uses a few of these user-defined  capabilities,  as
+       described  in user_caps(5).  Other user-defined capabilities (including
+       function keys) are described in the terminal database, in  the  section
+       on NCURSES USER-DEFINABLE CAPABILITIES
+
+
+

A Sample Entry

+       The   following   entry,   describing  an  ANSI-standard  terminal,  is
+       representative of what a terminfo entry for a modern terminal typically
+       looks like.
+
+       ansi|ansi/pc-term compatible with color,
+               am, mc5i, mir, msgr,
+               colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
+               acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260
+                    j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303
+                    u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
+               bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
+               cr=^M, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
+               cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
+               cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
+               dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
+               el1=\E[1K, home=\E[H, hpa=\E[%i%p1%dG, ht=\E[I, hts=\EH,
+               ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=^J,
+               indn=\E[%p1%dS, invis=\E[8m, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
+               kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kich1=\E[L,
+               mc4=\E[4i, mc5=\E[5i, nel=\r\E[S, op=\E[39;49m,
+               rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, rin=\E[%p1%dT,
+               rmacs=\E[10m, rmpch=\E[10m, rmso=\E[m, rmul=\E[m,
+               s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B,
+               setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
+               sgr=\E[0;10%?%p1%t;7%;
+                          %?%p2%t;4%;
+                          %?%p3%t;7%;
+                          %?%p4%t;5%;
+                          %?%p6%t;1%;
+                          %?%p7%t;8%;
+                          %?%p9%t;11%;m,
+               sgr0=\E[0;10m, smacs=\E[11m, smpch=\E[11m, smso=\E[7m,
+               smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
+               u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,
+
+       Entries  may continue onto multiple lines by placing white space at the
+       beginning of each line except the first.  Comments may be  included  on
+       lines beginning with "#".  Capabilities in terminfo are of three types:
+
+       o   Boolean  capabilities  which  indicate  that  the terminal has some
+           particular feature,
+
+       o   numeric capabilities giving the size of the terminal or the size of
+           particular delays, and
+
+       o   string  capabilities,  which  give  a sequence which can be used to
+           perform particular terminal operations.
+
+
+

Types of Capabilities

+       All capabilities have names.  For instance, the fact that ANSI-standard
+       terminals  have  automatic margins (i.e., an automatic return and line-
+       feed when the end of a line is reached) is indicated by the  capability
+       am.   Hence  the description of ansi includes am.  Numeric capabilities
+       are followed by the character "#" and  then  a  positive  value.   Thus
+       cols, which indicates the number of columns the terminal has, gives the
+       value "80" for ansi.  Values for numeric capabilities may be  specified
+       in  decimal,  octal,  or  hexadecimal, using the C programming language
+       conventions (e.g., 255, 0377 and 0xff or 0xFF).
+
+       Finally, string valued capabilities, such as el (clear to end  of  line
+       sequence)  are  given  by  the  two-character  code, an "=", and then a
+       string ending at the next following ",".
+
+       A number  of  escape  sequences  are  provided  in  the  string  valued
+       capabilities for easy encoding of characters there:
+
+       o   Both \E and \e map to an ESCAPE character,
+
+       o   ^x maps to a control-x for any appropriate x, and
+
+       o   the sequences
+
+             \n, \l, \r, \t, \b, \f, and \s
+
+           produce
+
+             newline, line-feed, return, tab, backspace, form-feed, and space,
+
+           respectively.
+
+       X/Open Curses does not say what "appropriate x" might be.  In practice,
+       that is a printable ASCII graphic character.  The special case "^?"  is
+       interpreted  as  DEL (127).  In all other cases, the character value is
+       AND'd with 0x1f, mapping to ASCII control codes in the range 0  through
+       31.
+
+       Other escapes include
+
+       o   \^ for ^,
+
+       o   \\ for \,
+
+       o   \, for comma,
+
+       o   \: for :,
+
+       o   and \0 for null.
+
+           \0 will produce \200, which does not terminate a string but behaves
+           as a null character on most terminals, providing CS7 is  specified.
+           See stty(1).
+
+           The  reason  for  this quirk is to maintain binary compatibility of
+           the compiled terminfo files with other implementations,  e.g.,  the
+           SVr4  systems,  which  document  this.  Compiled terminfo files use
+           null-terminated strings, with no  lengths.   Modifying  this  would
+           require  a  new  binary  format,  which  would  not work with other
+           implementations.
+
+       Finally, characters may be given as three octal digits after a \.
+
+       A delay in milliseconds may appear anywhere  in  a  string  capability,
+       enclosed  in  $<..>  brackets, as in el=\EK$<5>, and padding characters
+       are supplied by tputs(3x) to provide this delay.
+
+       o   The delay must be a number  with  at  most  one  decimal  place  of
+           precision; it may be followed by suffixes "*" or "/" or both.
+
+       o   A  "*"  indicates  that the padding required is proportional to the
+           number of lines affected by the operation, and the amount given  is
+           the  per-affected-unit  padding  required.   (In the case of insert
+           character, the factor is still the number of lines affected.)
+
+           Normally, padding is advisory if the device has the xon capability;
+           it is used for cost computation but does not trigger delays.
+
+       o   A  "/"  suffix indicates that the padding is mandatory and forces a
+           delay of the given number of milliseconds even on devices for which
+           xon is present to indicate flow control.
+
+       Sometimes  individual  capabilities must be commented out.  To do this,
+       put a period before the capability name.  For example, see  the  second
+       ind in the example above.
+
+
+

Fetching Compiled Descriptions

+       Terminal  descriptions  in  ncurses  are  stored in terminal databases.
+       These databases, which are found by their pathname, may  be  configured
+       either as directory trees or hashed databases (see term(5)),
+
+       The  library  uses  a  compiled-in  list  of  pathnames,  which  can be
+       overridden  by  environment  variables.   Before  starting  to  search,
+       ncurses  checks  the  search list, eliminating duplicates and pathnames
+       where no terminal database is found.  The  ncurses  library  reads  the
+       first description which passes its consistency checks.
+
+       o   The  environment variable TERMINFO is checked first, for a terminal
+           database containing the terminal description.
+
+       o   Next, ncurses looks in $HOME/.terminfo for a compiled description.
+
+           This is an optional feature which may be omitted entirely from  the
+           library,  or  limited  to  prevent  accidental  use  by  privileged
+           applications.
+
+       o   Next, if the environment variable  TERMINFO_DIRS  is  set,  ncurses
+           interprets  the  contents  of  that  variable  as  a list of colon-
+           separated pathnames of terminal databases to be searched.
+
+           An empty pathname (i.e., if the variable  begins  or  ends  with  a
+           colon,  or  contains  adjacent colons) is interpreted as the system
+           location /usr/share/terminfo.
+
+       o   Finally, ncurses searches these compiled-in locations:
+
+           o   a list of directories (/usr/share/terminfo), and
+
+           o   the system terminfo directory, /usr/share/terminfo
+
+       The TERMINFO variable can contain a terminal description instead of the
+       pathname  of  a terminal database.  If this variable begins with "hex:"
+       or "b64:" then ncurses reads a terminal description  from  hexadecimal-
+       or  base64-encoded  data,  and  if  that  description  matches the name
+       sought, will use that.  This encoded data can be  set  using  the  "-Q"
+       option of tic or infocmp.
+
+       The  preceding addresses the usual configuration of ncurses, which uses
+       terminal descriptions prepared in terminfo format.   While  termcap  is
+       less  expressive,  ncurses  can  also  be  configured  to  read termcap
+       descriptions.   In  that  configuration,  it  checks  the  TERMCAP  and
+       TERMPATH  variables  (for  content and search path, respectively) after
+       the system terminal database.
+
+
+

Preparing Descriptions

+       We now outline how to prepare  descriptions  of  terminals.   The  most
+       effective  way  to  prepare  a terminal description is by imitating the
+       description of a similar  terminal  in  terminfo  and  to  build  up  a
+       description gradually, using partial descriptions with vi or some other
+       screen-oriented program to check that they are correct.  Be aware  that
+       a  very  unusual terminal may expose deficiencies in the ability of the
+       terminfo file to describe it or bugs in the screen-handling code of the
+       test program.
+
+       To  get the padding for insert line right (if the terminal manufacturer
+       did not document it) a severe test is to edit  a  large  file  at  9600
+       baud, delete 16 or so lines from the middle of the screen, then hit the
+       "u" key several times quickly.  If the terminal messes up, more padding
+       is usually needed.  A similar test can be used for insert character.
+
+
+

Basic Capabilities

+       The  number  of  columns  on each line for the terminal is given by the
+       cols numeric capability.  If the terminal is a CRT, then the number  of
+       lines  on the screen is given by the lines capability.  If the terminal
+       wraps around to the beginning of the next  line  when  it  reaches  the
+       right  margin,  then it should have the am capability.  If the terminal
+       can clear its screen, leaving the cursor in  the  home  position,  then
+       this  is  given  by  the  clear  string  capability.   If  the terminal
+       overstrikes (rather than clearing a position when a character is struck
+       over)  then  it  should  have  the os capability.  If the terminal is a
+       printing terminal, with no soft copy unit, give it both hc and os.  (os
+       applies  to  storage scope terminals, such as TEKTRONIX 4010 series, as
+       well as hard copy and APL terminals.)  If there is a code to  move  the
+       cursor  to  the  left  edge  of  the  current  line,  give  this as cr.
+       (Normally this will be carriage return, control/M.)  If there is a code
+       to produce an audible signal (bell, beep, etc) give this as bel.
+
+       If there is a code to move the cursor one position to the left (such as
+       backspace) that capability should be given as cub1.   Similarly,  codes
+       to  move  to the right, up, and down should be given as cuf1, cuu1, and
+       cud1.  These local cursor motions should not alter the text  they  pass
+       over,  for  example,  you  would  not normally use "cuf1= " because the
+       space would erase the character moved over.
+
+       A very important point here is that the local cursor motions encoded in
+       terminfo  are  undefined  at  the left and top edges of a CRT terminal.
+       Programs should never attempt to backspace around the left edge, unless
+       bw  is given, and never attempt to go up locally off the top.  In order
+       to scroll text up, a program will go to the bottom left corner  of  the
+       screen and send the ind (index) string.
+
+       To  scroll  text  down,  a  program  goes to the top left corner of the
+       screen and sends the ri (reverse index) string.  The strings ind and ri
+       are undefined when not on their respective corners of the screen.
+
+       Parameterized  versions  of  the  scrolling  sequences are indn and rin
+       which have the same semantics as ind and ri except that they  take  one
+       parameter,  and scroll that many lines.  They are also undefined except
+       at the appropriate edge of the screen.
+
+       The am capability tells whether the cursor sticks at the right edge  of
+       the  screen when text is output, but this does not necessarily apply to
+       a cuf1 from the last column.  The only local motion  which  is  defined
+       from  the  left  edge is if bw is given, then a cub1 from the left edge
+       will move to the right edge of the previous line.  If bw is not  given,
+       the  effect  is undefined.  This is useful for drawing a box around the
+       edge of the screen, for example.  If the terminal has switch selectable
+       automatic  margins,  the terminfo file usually assumes that this is on;
+       i.e., am.  If the terminal has a  command  which  moves  to  the  first
+       column  of  the  next line, that command can be given as nel (newline).
+       It does not matter if the command clears the remainder of  the  current
+       line,  so  if the terminal has no cr and lf it may still be possible to
+       craft a working nel out of one or both of them.
+
+       These  capabilities  suffice  to  describe  hard-copy  and  "glass-tty"
+       terminals.  Thus the model 33 teletype is described as
+
+       33|tty33|tty|model 33 teletype,
+               bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,
+
+       while the Lear Siegler ADM-3 is described as
+
+       adm3|3|lsi adm3,
+               am, bel=^G, clear=^Z, cols#80, cr=^M, cub1=^H, cud1=^J,
+               ind=^J, lines#24,
+
+
+

Parameterized Strings

+       Cursor  addressing  and  other  strings  requiring  parameters  in  the
+       terminal are described  by  a  parameterized  string  capability,  with
+       printf-like  escapes  such  as  %x  in it.  For example, to address the
+       cursor, the cup capability is given, using two parameters: the line and
+       column  to  address  to.  (Lines and columns are numbered from zero and
+       refer to the physical screen visible to the user,  not  to  any  unseen
+       memory.)   If  the terminal has memory relative cursor addressing, that
+       can be indicated by mrcup.
+
+       The parameter mechanism uses a stack and special % codes to  manipulate
+       it.   Typically  a  sequence  will  push one of the parameters onto the
+       stack and then print it in  some  format.   Print  (e.g.,  "%d")  is  a
+       special  case.  Other operations, including "%t" pop their operand from
+       the stack.   It  is  noted  that  more  complex  operations  are  often
+       necessary, e.g., in the sgr string.
+
+       The % encodings have the following meanings:
+
+       %%   outputs "%"
+
+       %[[:]flags][width[.precision]][doxXs]
+            as  in  printf(3),  flags are [-+#] and space.  Use a ":" to allow
+            the next character to be a "-" flag, avoiding interpreting "%-" as
+            an operator.
+
+       %c   print pop() like %c in printf
+
+       %s   print pop() like %s in printf
+
+       %p[1-9]
+            push i'th parameter
+
+       %P[a-z]
+            set dynamic variable [a-z] to pop()
+
+       %g[a-z]
+            get dynamic variable [a-z] and push it
+
+       %P[A-Z]
+            set static variable [a-z] to pop()
+
+       %g[A-Z]
+            get static variable [a-z] and push it
+
+            The  terms  "static"  and "dynamic" are misleading.  Historically,
+            these are simply two different sets of variables, whose values are
+            not  reset  between calls to tparm(3x).  However, that fact is not
+            documented in other implementations.  Relying on it will adversely
+            impact portability to other implementations:
+
+            o   SVr2  curses  supported dynamic variables.  Those are set only
+                by a %P operator.  A %g for a  given  variable  without  first
+                setting  it  with  %P will give unpredictable results, because
+                dynamic variables are an  uninitialized  local  array  on  the
+                stack in the tparm function.
+
+            o   SVr3.2  curses supported static variables.  Those are an array
+                in the TERMINAL structure (declared in term.h), and are zeroed
+                automatically when the setupterm function allocates the data.
+
+            o   SVr4 curses made no further improvements to the dynamic/static
+                variable feature.
+
+            o   Solaris XPG4 curses does not distinguish between  dynamic  and
+                static  variables.  They are the same.  Like SVr4 curses, XPG4
+                curses does not initialize these explicitly.
+
+            o   Before version 6.3, ncurses stores  both  dynamic  and  static
+                variables in persistent storage, initialized to zeros.
+
+            o   Beginning  with version 6.3, ncurses stores static and dynamic
+                variables in the same manner as SVr4.
+
+                o   Unlike  other  implementations,  ncurses   zeros   dynamic
+                    variables before the first %g or %P operator.
+
+                o   Like  SVr2,  the  scope of dynamic variables in ncurses is
+                    within the current call to tparm.  Use static variables if
+                    persistent storage is needed.
+
+       %'c' char constant c
+
+       %{nn}
+            integer constant nn
+
+       %l   push strlen(pop)
+
+       %+, %-, %*, %/, %m
+            arithmetic (%m is mod): push(pop() op pop())
+
+       %&, %|, %^
+            bit operations (AND, OR and exclusive-OR): push(pop() op pop())
+
+       %=, %>, %<
+            logical operations: push(pop() op pop())
+
+       %A, %O
+            logical AND and OR operations (for conditionals)
+
+       %!, %~
+            unary operations (logical and bit complement): push(op pop())
+
+       %i   add 1 to first two parameters (for ANSI terminals)
+
+       %? expr %t thenpart %e elsepart %;
+            This forms an if-then-else.  The %e elsepart is optional.  Usually
+            the %? expr part pushes a value onto the stack,  and  %t  pops  it
+            from  the  stack,  testing if it is nonzero (true).  If it is zero
+            (false), control passes to the %e (else) part.
+
+            It is possible to form else-if's a la Algol 68:
+            %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e %;
+
+            where ci are conditions, bi are bodies.
+
+            Use the -f option of tic or infocmp to see the  structure  of  if-
+            then-else's.  Some strings, e.g., sgr can be very complicated when
+            written on one line.  The -f option splits the string  into  lines
+            with the parts indented.
+
+       Binary  operations  are  in postfix form with the operands in the usual
+       order.  That is, to get x-5 one  would  use  "%gx%{5}%-".   %P  and  %g
+       variables are persistent across escape-string evaluations.
+
+       Consider the HP2645, which, to get to line 3 and column 12, needs to be
+       sent \E&a12c03Y padded for 6 milliseconds.  The order of the lines  and
+       columns  is  inverted here, and the lines and column are printed as two
+       digits.  The corresponding terminal description is expressed thus:
+              cup=\E&a%p2%dc%p1%dY$<6>,
+
+       The Microterm ACT-IV needs the current line and column sent preceded by
+       a ^T, with the line and column simply encoded in binary,
+              cup=^T%p1%c%p2%c
+
+       Terminals  which  use  "%c"  need  to  be  able to backspace the cursor
+       (cub1), and to move the cursor up one line on the screen (cuu1).   This
+       is necessary because it is not always safe to transmit \n ^D and \r, as
+       the system may change or discard them.  (The library  routines  dealing
+       with  terminfo  set tty modes so that tabs are never expanded, so \t is
+       safe to send.  This turns out to be essential for the Ann Arbor 4080.)
+
+       A final example is the LSI ADM-3a, which uses line and column offset by
+       a blank character, thus
+              cup=\E=%p1%' '%+%c%p2%' '%+%c
+
+       After  sending "\E=", this pushes the first parameter, pushes the ASCII
+       value for a space (32), adds them (pushing the  sum  on  the  stack  in
+       place  of  the  two  previous  values)  and  outputs  that  value  as a
+       character.  Then the same is  done  for  the  second  parameter.   More
+       complex arithmetic is possible using the stack.
+
+
+

Cursor Motions

+       If  the  terminal has a fast way to home the cursor (to very upper left
+       corner of screen) then this can be given as home; similarly a fast  way
+       of  getting  to the lower left-hand corner can be given as ll; this may
+       involve going up with cuu1 from the home position, but a program should
+       never do this itself (unless ll does) because it can make no assumption
+       about the effect of moving up from the home position.   Note  that  the
+       home  position  is  the  same  as  addressing to (0,0): to the top left
+       corner of the screen, not of memory.  (Thus, the  \EH  sequence  on  HP
+       terminals cannot be used for home.)
+
+       If  the  terminal  has line or column absolute cursor addressing, these
+       can be given as single parameter capabilities hpa (horizontal  position
+       absolute)  and  vpa  (vertical position absolute).  Sometimes these are
+       shorter than the more general  two  parameter  sequence  (as  with  the
+       hp2645)   and  can  be  used  in  preference  to  cup.   If  there  are
+       parameterized local motions (e.g., move n spaces to  the  right)  these
+       can  be  given  as  cud,  cub,  cuf,  and  cuu  with a single parameter
+       indicating how many spaces to move.  These are primarily useful if  the
+       terminal does not have cup, such as the TEKTRONIX 4025.
+
+       If  the  terminal  needs to be in a special mode when running a program
+       that uses these capabilities, the codes to enter and exit this mode can
+       be  given as smcup and rmcup.  This arises, for example, from terminals
+       like the Concept with more than one page of memory.   If  the  terminal
+       has  only  memory  relative  cursor  addressing and not screen relative
+       cursor addressing, a one screen-sized window must  be  fixed  into  the
+       terminal for cursor addressing to work properly.  This is also used for
+       the TEKTRONIX 4025, where smcup sets the command character  to  be  the
+       one  used  by  terminfo.   If  the  smcup sequence will not restore the
+       screen after an rmcup  sequence  is  output  (to  the  state  prior  to
+       outputting rmcup), specify nrrmc.
+
+
+

Margins

+       SVr4  (and  X/Open Curses) list several string capabilities for setting
+       margins.  Two were intended for use with  terminals,  and  another  six
+       were intended for use with printers.
+
+       o   The two terminal capabilities assume that the terminal may have the
+           capability of setting the left and/or right margin at  the  current
+           cursor column position.
+
+       o   The printer capabilities assume that the printer may have two types
+           of capability:
+
+           o   the ability to set a top and/or bottom margin using the current
+               line position, and
+
+           o   parameterized  capabilities  for setting the top, bottom, left,
+               right margins given the number of lines or columns.
+
+       In practice, the categorization into "terminal" and  "printer"  is  not
+       suitable:
+
+       o   The  AT&T  SVr4  terminal  database  uses smgl four times, for AT&T
+           hardware.
+
+           Three of the four are printers.   They  lack  the  ability  to  set
+           left/right margins by specifying the column.
+
+       o   Other  (non-AT&T) terminals may support margins but using different
+           assumptions from AT&T.
+
+           For instance, the DEC VT420 supports left/right margins,  but  only
+           using a column parameter.  As an added complication, the VT420 uses
+           two settings to fully enable left/right margins (left/right  margin
+           mode,  and  origin  mode).   The  former enables the margins, which
+           causes printed text to wrap  within  margins,  but  the  latter  is
+           needed to prevent cursor-addressing outside those margins.
+
+       o   Both  DEC  VT420  left/right  margins are set with a single control
+           sequence.  If either is omitted, the corresponding margin is set to
+           the  left  or  right  edge  of the display (rather than leaving the
+           margin unmodified).
+
+       These are the margin-related capabilities:
+
+                 Name    Description
+                 ---------------------------------------------------
+                 smgl    Set left margin at current column
+                 smgr    Set right margin at current column
+                 smgb    Set bottom margin at current line
+                 smgt    Set top margin at current line
+                 smgbp   Set bottom margin at line N
+                 smglp   Set left margin at column N
+                 smgrp   Set right margin at column N
+                 smgtp   Set top margin at line N
+                 smglr   Set both left and right margins to L and R
+                 smgtb   Set both top and bottom margins to T and B
+
+       When writing an application that uses these  string  capabilities,  the
+       pairs  should be first checked to see if each capability in the pair is
+       set or only one is set:
+
+       o   If both smglp and smgrp  are  set,  each  is  used  with  a  single
+           argument,  N,  that  gives  the column number of the left and right
+           margin, respectively.
+
+       o   If both smgtp and smgbp are set, each is used to set  the  top  and
+           bottom margin, respectively:
+
+           o   smgtp is used with a single argument, N, the line number of the
+               top margin.
+
+           o   smgbp is used with two arguments, N and M, that give  the  line
+               number of the bottom margin, the first counting from the top of
+               the page  and  the  second  counting  from  the  bottom.   This
+               accommodates  the two styles of specifying the bottom margin in
+               different manufacturers' printers.
+
+           When designing a terminfo entry for a printer that has  a  settable
+           bottom  margin,  only  the first or second argument should be used,
+           depending on the printer.  When developing an application that uses
+           smgbp to set the bottom margin, both arguments must be given.
+
+       Conversely, when only one capability in the pair is set:
+
+       o   If  only  one  of  smglp and smgrp is set, then it is used with two
+           arguments, the column number of the left and right margins, in that
+           order.
+
+       o   Likewise,  if  only  one of smgtp and smgbp is set, then it is used
+           with two arguments that give the top and bottom  margins,  in  that
+           order, counting from the top of the page.
+
+           When designing a terminfo entry for a printer that requires setting
+           both left and right or top and bottom margins simultaneously,  only
+           one  capability  in  the  pairs  smglp and smgrp or smgtp and smgbp
+           should be defined, leaving the other unset.
+
+       Except for very old terminal descriptions, e.g.,  those  developed  for
+       SVr4,  the  scheme  just  described  should be considered obsolete.  An
+       improved set of capabilities was added late in the SVr4 releases (smglr
+       and  smgtb),  which  explicitly  use  two  parameters  for  setting the
+       left/right or top/bottom margins.
+
+       When setting margins, the line- and column-values are zero-based.
+
+       The mgc string capability should  be  defined.   Applications  such  as
+       tabs(1) rely upon this to reset all margins.
+
+
+

Area Clears

+       If  the  terminal can clear from the current position to the end of the
+       line, leaving the cursor where it is, this should be given as  el.   If
+       the  terminal  can  clear from the beginning of the line to the current
+       position inclusive, leaving the cursor where  it  is,  this  should  be
+       given  as  el1.  If the terminal can clear from the current position to
+       the end of the display, then this should be given as ed.   Ed  is  only
+       defined from the first column of a line.  (Thus, it can be simulated by
+       a request to delete a large number of  lines,  if  a  true  ed  is  not
+       available.)
+
+
+

Insert/Delete Line and Vertical Motions

+       If  the  terminal  can  open a new blank line before the line where the
+       cursor is, this should be given as il1; this  is  done  only  from  the
+       first  position  of  a  line.  The cursor must then appear on the newly
+       blank line.  If the terminal can delete the line which  the  cursor  is
+       on,  then this should be given as dl1; this is done only from the first
+       position on the line to be deleted.  Versions of il1 and dl1 which take
+       a single parameter and insert or delete that many lines can be given as
+       il and dl.
+
+       If the terminal has a settable scrolling region (like  the  vt100)  the
+       command  to  set  this  can be described with the csr capability, which
+       takes two parameters: the top and bottom lines of the scrolling region.
+       The cursor position is, alas, undefined after using this command.
+
+       It  is possible to get the effect of insert or delete line using csr on
+       a properly chosen region; the sc  and  rc  (save  and  restore  cursor)
+       commands may be useful for ensuring that your synthesized insert/delete
+       string does not move the cursor.  (Note that  the  ncurses(3x)  library
+       does   this   synthesis   automatically,   so   you  need  not  compose
+       insert/delete strings for an entry with csr).
+
+       Yet another way to construct insert  and  delete  might  be  to  use  a
+       combination  of  index  with  the  memory-lock  feature  found  on some
+       terminals  (like  the  HP-700/90  series,  which   however   also   has
+       insert/delete).
+
+       Inserting  lines  at  the  top or bottom of the screen can also be done
+       using ri or ind on many terminals without a  true  insert/delete  line,
+       and is often faster even on terminals with those features.
+
+       The  Boolean  non_dest_scroll_region  should  be  set if each scrolling
+       window is effectively a view port on a screen-sized  canvas.   To  test
+       for  this  capability,  create  a scrolling region in the middle of the
+       screen, write something to the bottom line, move the cursor to the  top
+       of  the region, and do ri followed by dl1 or ind.  If the data scrolled
+       off the bottom of the region by the ri re-appears,  then  scrolling  is
+       non-destructive.  System V and X/Open Curses expect that ind, ri, indn,
+       and  rin  will  simulate  destructive  scrolling;  their  documentation
+       cautions  you  not  to  define  csr  unless  this is true.  This curses
+       implementation is more  liberal  and  will  do  explicit  erases  after
+       scrolling if ndsrc is defined.
+
+       If  the  terminal has the ability to define a window as part of memory,
+       which all commands affect, it should  be  given  as  the  parameterized
+       string  wind.  The four parameters are the starting and ending lines in
+       memory and the starting and ending columns in memory, in that order.
+
+       If the terminal can retain display memory above, then the da capability
+       should  be  given;  if  display  memory  can be retained below, then db
+       should be given.  These indicate that deleting a line or scrolling  may
+       bring  non-blank lines up from below or that scrolling back with ri may
+       bring down non-blank lines.
+
+
+

Insert/Delete Character

+       There are two basic kinds of  intelligent  terminals  with  respect  to
+       insert/delete  character  which  can  be described using terminfo.  The
+       most  common  insert/delete  character  operations  affect   only   the
+       characters  on the current line and shift characters off the end of the
+       line rigidly.  Other terminals, such as the Concept 100 and the  Perkin
+       Elmer  Owl,  make a distinction between typed and untyped blanks on the
+       screen, shifting upon an insert or delete only to an untyped  blank  on
+       the  screen  which  is  either  eliminated,  or expanded to two untyped
+       blanks.
+
+       You can determine the kind of terminal you have by clearing the  screen
+       and  then  typing  text separated by cursor motions.  Type "abc    def"
+       using local cursor motions (not  spaces)  between  the  "abc"  and  the
+       "def".   Then position the cursor before the "abc" and put the terminal
+       in insert mode.  If typing characters causes the rest of  the  line  to
+       shift  rigidly  and  characters to fall off the end, then your terminal
+       does not distinguish between blanks  and  untyped  positions.   If  the
+       "abc"  shifts over to the "def" which then move together around the end
+       of the current line and onto the next  as  you  insert,  you  have  the
+       second  type  of  terminal,  and  should  give the capability in, which
+       stands for "insert null".
+
+       While these are two logically  separate  attributes  (one  line  versus
+       multi-line  insert  mode,  and  special treatment of untyped spaces) we
+       have seen no terminals whose insert mode cannot be described  with  the
+       single attribute.
+
+       Terminfo  can  describe  both  terminals which have an insert mode, and
+       terminals which send a simple sequence to open a blank position on  the
+       current line.  Give as smir the sequence to get into insert mode.  Give
+       as rmir the sequence to leave  insert  mode.   Now  give  as  ich1  any
+       sequence  needed  to  be  sent  just before sending the character to be
+       inserted.  Most terminals with a true insert mode will not  give  ich1;
+       terminals  which  send a sequence to open a screen position should give
+       it here.
+
+       If your terminal has both, insert mode is usually preferable  to  ich1.
+       Technically,  you  should  not  give  both unless the terminal actually
+       requires both to be used in combination.  Accordingly, some  non-curses
+       applications  get  confused if both are present; the symptom is doubled
+       characters in an update using insert.  This requirement  is  now  rare;
+       most  ich  sequences do not require previous smir, and most smir insert
+       modes do not require ich1 before each character.   Therefore,  the  new
+       curses  actually  assumes this is the case and uses either rmir/smir or
+       ich/ich1 as appropriate (but not both).  If you have to write an  entry
+       to  be  used  under  new curses for a terminal old enough to need both,
+       include the rmir/smir sequences in ich1.
+
+       If post insert padding is needed, give this as a number of milliseconds
+       in  ip (a string option).  Any other sequence which may need to be sent
+       after an insert of a single character may also be given in ip.  If your
+       terminal  needs  both  to be placed into an "insert mode" and a special
+       code to precede each inserted character, then both smir/rmir  and  ich1
+       can  be  given,  and  both  will be used.  The ich capability, with one
+       parameter, n, will repeat the effects of ich1 n times.
+
+       If padding is necessary between characters typed while  not  in  insert
+       mode, give this as a number of milliseconds padding in rmp.
+
+       It  is  occasionally  necessary  to move around while in insert mode to
+       delete characters on the same line (e.g., if there is a tab  after  the
+       insertion  position).   If  your terminal allows motion while in insert
+       mode you can give the capability mir to  speed  up  inserting  in  this
+       case.   Omitting  mir  will affect only speed.  Some terminals (notably
+       Datamedia's) must not have mir because of the  way  their  insert  mode
+       works.
+
+       Finally,  you  can  specify dch1 to delete a single character, dch with
+       one parameter, n, to delete ncharacters, and delete mode by giving smdc
+       and  rmdc to enter and exit delete mode (any mode the terminal needs to
+       be placed in for dch1 to work).
+
+       A command to erase n characters  (equivalent  to  outputting  n  blanks
+       without moving the cursor) can be given as ech with one parameter.
+
+
+

Highlighting, Underlining, and Visible Bells

+       If your terminal has one or more kinds of display attributes, these can
+       be represented in a number of different ways.  You  should  choose  one
+       display  form  as  standout  mode,  representing a good, high contrast,
+       easy-on-the-eyes, format for  highlighting  error  messages  and  other
+       attention  getters.   (If  you  have a choice, reverse video plus half-
+       bright is good, or reverse video alone.)  The sequences  to  enter  and
+       exit  standout  mode  are given as smso and rmso, respectively.  If the
+       code to change into or out of standout mode  leaves  one  or  even  two
+       blank  spaces  on  the screen, as the TVI 912 and Teleray 1061 do, then
+       xmc should be given to tell how many spaces are left.
+
+       Codes to begin underlining and end underlining can be given as smul and
+       rmul respectively.  If the terminal has a code to underline the current
+       character and move the cursor one space  to  the  right,  such  as  the
+       Microterm Mime, this can be given as uc.
+
+       Other  capabilities  to  enter various highlighting modes include blink
+       (blinking) bold (bold or extra bright) dim (dim or  half-bright)  invis
+       (blanking  or invisible text) prot (protected) rev (reverse video) sgr0
+       (turn off all attribute modes) smacs  (enter  alternate  character  set
+       mode) and rmacs (exit alternate character set mode).  Turning on any of
+       these modes singly may or may not turn off other modes.
+
+       If there is a sequence to set arbitrary  combinations  of  modes,  this
+       should  be  given  as  sgr (set attributes), taking 9 parameters.  Each
+       parameter is either zero (0) or nonzero, as the corresponding attribute
+       is  on  or  off.   The 9 parameters are, in order: standout, underline,
+       reverse, blink, dim, bold, blank,  protect,  alternate  character  set.
+       Not  all  modes  need  be  supported  by  sgr,  only  those  for  which
+       corresponding separate attribute commands exist.
+
+       For example, the DEC vt220 supports most of the modes:
+
+                   tparm Parameter   Attribute    Escape Sequence
+                   ------------------------------------------------
+                   none              none         \E[0m
+                   p1                standout     \E[0;1;7m
+                   p2                underline    \E[0;4m
+                   p3                reverse      \E[0;7m
+                   p4                blink        \E[0;5m
+                   p5                dim          not available
+                   p6                bold         \E[0;1m
+                   p7                invis        \E[0;8m
+                   p8                protect      not used
+                   p9                altcharset   ^O (off) ^N (on)
+
+       We begin each escape sequence by turning off any existing modes,  since
+       there  is  no quick way to determine whether they are active.  Standout
+       is set up to be  the  combination  of  reverse  and  bold.   The  vt220
+       terminal  has  a  protect  mode,  though it is not commonly used in sgr
+       because it protects characters on the screen from the host's  erasures.
+       The  altcharset  mode  also is different in that it is either ^O or ^N,
+       depending on whether it is off or on.  If all modes are turned on,  the
+       resulting sequence is \E[0;1;4;5;7;8m^N.
+
+       Some  sequences  are  common  to  different  modes.  For example, ;7 is
+       output when either p1 or p3 is true, that is,  if  either  standout  or
+       reverse modes are turned on.
+
+       Writing out the above sequences, along with their dependencies yields
+
+                 Sequence   When to Output      terminfo Translation
+                 ----------------------------------------------------
+                 \E[0       always              \E[0
+                 ;1         if p1 or p6         %?%p1%p6%|%t;1%;
+                 ;4         if p2               %?%p2%|%t;4%;
+                 ;5         if p4               %?%p4%|%t;5%;
+                 ;7         if p1 or p3         %?%p1%p3%|%t;7%;
+                 ;8         if p7               %?%p7%|%t;8%;
+                 m          always              m
+                 ^N or ^O   if p9 ^N, else ^O   %?%p9%t^N%e^O%;
+
+       Putting this all together into the sgr sequence gives:
+
+           sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p4%t;5%;
+               %?%p1%p3%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
+
+       Remember  that  if  you specify sgr, you must also specify sgr0.  Also,
+       some implementations rely on sgr  being  given  if  sgr0  is,  Not  all
+       terminfo  entries  necessarily  have  an  sgr  string,  however.   Many
+       terminfo entries are derived from termcap entries  which  have  no  sgr
+       string.  The only drawback to adding an sgr string is that termcap also
+       assumes that sgr0 does not exit alternate character set mode.
+
+       Terminals  with  the  "magic  cookie"  glitch  (xmc)  deposit   special
+       "cookies"  when  they  receive mode-setting sequences, which affect the
+       display algorithm rather than having extra  bits  for  each  character.
+       Some  terminals, such as the HP 2621, automatically leave standout mode
+       when they move to a new line or  the  cursor  is  addressed.   Programs
+       using  standout mode should exit standout mode before moving the cursor
+       or sending a newline, unless the msgr capability, asserting that it  is
+       safe to move in standout mode, is present.
+
+       If  the  terminal has a way of flashing the screen to indicate an error
+       quietly (a bell replacement) then this can be given as flash;  it  must
+       not move the cursor.
+
+       If  the cursor needs to be made more visible than normal when it is not
+       on the bottom line (to make, for example, a non-blinking underline into
+       an  easier  to  find block or blinking underline) give this sequence as
+       cvvis.  If there is a way to make the cursor completely invisible, give
+       that  as  civis.  The capability cnorm should be given which undoes the
+       effects of both of these modes.
+
+       If your terminal correctly generates  underlined  characters  (with  no
+       special  codes  needed)  even  though  it does not overstrike, then you
+       should give the capability ul.  If  a  character  overstriking  another
+       leaves  both  characters  on the screen, specify the capability os.  If
+       overstrikes are erasable with a blank, then this should be indicated by
+       giving eo.
+
+
+

Keypad and Function Keys

+       If  the  terminal  has  a keypad that transmits codes when the keys are
+       pressed, this information can be given.  Note that it is  not  possible
+       to handle terminals where the keypad only works in local (this applies,
+       for example, to the unshifted HP 2621 keys).  If the keypad can be  set
+       to  transmit  or  not  transmit,  give  these  codes  as smkx and rmkx.
+       Otherwise the keypad is assumed to always transmit.
+
+       The codes sent by the left arrow, right arrow, up  arrow,  down  arrow,
+       and  home  keys  can  be given as kcub1, kcuf1, kcuu1, kcud1, and khome
+       respectively.  If there are function keys such as f0, f1, ..., f10, the
+       codes  they  send  can  be given as kf0, kf1, ..., kf10.  If these keys
+       have labels other than the default f0 through f10, the  labels  can  be
+       given as lf0, lf1, ..., lf10.
+
+       The codes transmitted by certain other special keys can be given:
+
+       o   kll (home down),
+
+       o   kbs (backspace),
+
+       o   ktbc (clear all tabs),
+
+       o   kctab (clear the tab stop in this column),
+
+       o   kclr (clear screen or erase key),
+
+       o   kdch1 (delete character),
+
+       o   kdl1 (delete line),
+
+       o   krmir (exit insert mode),
+
+       o   kel (clear to end of line),
+
+       o   ked (clear to end of screen),
+
+       o   kich1 (insert character or enter insert mode),
+
+       o   kil1 (insert line),
+
+       o   knp (next page),
+
+       o   kpp (previous page),
+
+       o   kind (scroll forward/down),
+
+       o   kri (scroll backward/up),
+
+       o   khts (set a tab stop in this column).
+
+       In  addition,  if  the  keypad has a 3 by 3 array of keys including the
+       four arrow keys, the other five keys can be given  as  ka1,  ka3,  kb2,
+       kc1,  and  kc3.   These  keys  are  useful when the effects of a 3 by 3
+       directional pad are needed.
+
+       Strings to program function keys can be given as pfkey, pfloc, and pfx.
+       A  string to program screen labels should be specified as pln.  Each of
+       these strings takes two parameters: the function key number to  program
+       (from 0 to 10) and the string to program it with.  Function key numbers
+       out of this range may program undefined keys in  a  terminal  dependent
+       manner.   The  difference between the capabilities is that pfkey causes
+       pressing the given key to be the same as  the  user  typing  the  given
+       string;  pfloc  causes  the  string  to  be executed by the terminal in
+       local; and pfx causes the string to be transmitted to the computer.
+
+       The capabilities nlab, lw and lh  define  the  number  of  programmable
+       screen  labels  and  their  width and height.  If there are commands to
+       turn the labels on and off, give  them  in  smln  and  rmln.   smln  is
+       normally  output  after one or more pln sequences to make sure that the
+       change becomes visible.
+
+
+

Tabs and Initialization

+       A few capabilities are used only for tabs:
+
+       o   If the terminal has hardware tabs, the command to  advance  to  the
+           next tab stop can be given as ht (usually control/I).
+
+       o   A "back-tab" command which moves leftward to the preceding tab stop
+           can be given as cbt.
+
+           By convention, if the teletype modes indicate that tabs  are  being
+           expanded  by  the  computer rather than being sent to the terminal,
+           programs should not use ht or cbt even if they are  present,  since
+           the user may not have the tab stops properly set.
+
+       o   If  the  terminal has hardware tabs which are initially set every n
+           spaces when the terminal is powered up, the numeric parameter it is
+           given, showing the number of spaces the tabs are set to.
+
+           The it capability is normally used by the tset command to determine
+           whether to set the mode for hardware tab expansion, and whether  to
+           set the tab stops.  If the terminal has tab stops that can be saved
+           in non-volatile memory, the terminfo description  can  assume  that
+           they are properly set.
+
+       Other capabilities include
+
+       o   is1, is2, and is3, initialization strings for the terminal,
+
+       o   iprog,  the  path  name  of  a  program to be run to initialize the
+           terminal,
+
+       o   and if, the name of a file containing long initialization strings.
+
+       These strings are expected to set the terminal  into  modes  consistent
+       with  the  rest of the terminfo description.  They are normally sent to
+       the terminal, by the init option of the tput  program,  each  time  the
+       user logs in.  They will be printed in the following order:
+
+              run the program
+                     iprog
+
+              output
+                     is1 and
+                     is2
+
+              set the margins using
+                     mgc or
+                     smglp and smgrp or
+                     smgl and smgr
+
+              set tabs using
+                     tbc and hts
+
+              print the file
+                     if
+
+              and finally output
+                     is3.
+
+       Most  initialization  is  done with is2.  Special terminal modes can be
+       set up without duplicating strings by putting the common  sequences  in
+       is2 and special cases in is1 and is3.
+
+       A  set  of  sequences  that  does a harder reset from a totally unknown
+       state can be given as rs1, rs2, rf and rs3, analogous to is1 , is2 , if
+       and  is3  respectively.   These  strings  are output by reset option of
+       tput, or by the reset program (an alias of tset), which  is  used  when
+       the terminal gets into a wedged state.  Commands are normally placed in
+       rs1, rs2 rs3 and rf only if they produce annoying effects on the screen
+       and are not necessary when logging in.  For example, the command to set
+       the vt100 into 80-column mode would normally be part  of  is2,  but  it
+       causes  an  annoying  glitch  of  the screen and is not normally needed
+       since the terminal is usually already in 80-column mode.
+
+       The reset program writes strings including iprog,  etc.,  in  the  same
+       order  as  the  init program, using rs1, etc., instead of is1, etc.  If
+       any of rs1, rs2, rs3, or rf reset capability strings are  missing,  the
+       reset   program   falls  back  upon  the  corresponding  initialization
+       capability string.
+
+       If there are commands to set and clear tab stops, they can be given  as
+       tbc (clear all tab stops) and hts (set a tab stop in the current column
+       of every line).  If a more complex sequence is needed to set  the  tabs
+       than can be described by this, the sequence can be placed in is2 or if.
+
+       The  tput  reset  command uses the same capability strings as the reset
+       command, although the two programs (tput and reset)  provide  different
+       command-line options.
+
+       In  practice,  these  terminfo  capabilities  are  not  often  used  in
+       initialization of tabs (though they are required for the tabs program):
+
+       o   Almost all hardware terminals (at least those which supported tabs)
+           initialized those to every eight columns:
+
+           The  only  exception  was  the  AT&T 2300 series, which set tabs to
+           every five columns.
+
+       o   In particular, developers  of  the  hardware  terminals  which  are
+           commonly  used  as  models  for  modern terminal emulators provided
+           documentation demonstrating that eight columns were the standard.
+
+       o   Because of this, the terminal initialization programs tput and tset
+           use   the  tbc  (clear_all_tabs)  and  hts  (set_tab)  capabilities
+           directly only when the it (init_tabs) capability is set to a  value
+           other than eight.
+
+
+

Delays and Padding

+       Many  older  and slower terminals do not support either XON/XOFF or DTR
+       handshaking, including hard copy terminals and some very  archaic  CRTs
+       (including,  for  example,  DEC  VT100s).   These  may  require padding
+       characters after certain cursor motions and screen changes.
+
+       If the terminal uses xon/xoff handshaking for flow control (that is, it
+       automatically  emits  ^S  back  to  the host when its input buffers are
+       close to full), set xon.  This capability suppresses  the  emission  of
+       padding.   You  can  also  set  it  for  memory-mapped  console devices
+       effectively that do not have a speed limit.  Padding information should
+       still  be  included  so  that  routines can make better decisions about
+       relative costs, but actual pad characters will not be transmitted.
+
+       If pb (padding baud rate) is given, padding is suppressed at baud rates
+       below  the  value  of  pb.  If the entry has no padding baud rate, then
+       whether padding is emitted or not is completely controlled by xon.
+
+       If the terminal requires other than a null (zero) character as  a  pad,
+       then  this  can  be  given as pad.  Only the first character of the pad
+       string is used.
+
+
+

Status Lines

+       Some terminals have an extra "status line" which is not  normally  used
+       by software (and thus not counted in the terminal's lines capability).
+
+       The  simplest case is a status line which is cursor-addressable but not
+       part of the main scrolling region on the screen; the Heathkit H19 has a
+       status  line  of  this  kind,  as  would a 24-line VT100 with a 23-line
+       scrolling region set up on initialization.  This situation is indicated
+       by the hs capability.
+
+       Some  terminals  with status lines need special sequences to access the
+       status line.  These may be expressed as a string with single  parameter
+       tsl  which takes the cursor to a given zero-origin column on the status
+       line.  The  capability  fsl  must  return  to  the  main-screen  cursor
+       positions before the last tsl.  You may need to embed the string values
+       of sc (save  cursor)  and  rc  (restore  cursor)  in  tsl  and  fsl  to
+       accomplish this.
+
+       The  status  line is normally assumed to be the same width as the width
+       of the terminal.  If this is  untrue,  you  can  specify  it  with  the
+       numeric capability wsl.
+
+       A command to erase or blank the status line may be specified as dsl.
+
+       The  Boolean  capability  eslok  specifies that escape sequences, tabs,
+       etc., work ordinarily in the status line.
+
+       The ncurses implementation does not yet use any of these  capabilities.
+       They are documented here in case they ever become important.
+
+
+

Line Graphics

+       Many  terminals have alternate character sets useful for forms-drawing.
+       Terminfo and curses have built-in  support  for  most  of  the  drawing
+       characters  supported  by the VT100, with some characters from the AT&T
+       4410v1 added.  This alternate character set may  be  specified  by  the
+       acsc capability.
+
+                          acsc
+       ACS Name      Value   Symbol   ASCII Fallback / Glyph Name
+       ------------------------------------------------------------------------
+       ACS_RARROW    0x2b      +      >  arrow pointing right
+       ACS_LARROW    0x2c      ,      <  arrow pointing left
+       ACS_UARROW    0x2d      -      ^  arrow pointing up
+       ACS_DARROW    0x2e      .      v  arrow pointing down
+       ACS_BLOCK     0x30      0      #  solid square block
+       ACS_DIAMOND   0x60      `      +  diamond
+       ACS_CKBOARD   0x61      a      :  checker board (stipple)
+       ACS_DEGREE    0x66      f      \  degree symbol
+       ACS_PLMINUS   0x67      g      #  plus/minus
+       ACS_BOARD     0x68      h      #  board of squares
+       ACS_LANTERN   0x69      i      #  lantern symbol
+       ACS_LRCORNER  0x6a      j      +  lower right corner
+
+       ACS_URCORNER  0x6b      k      +  upper right corner
+       ACS_ULCORNER  0x6c      l      +  upper left corner
+       ACS_LLCORNER  0x6d      m      +  lower left corner
+       ACS_PLUS      0x6e      n      +  large plus or crossover
+       ACS_S1        0x6f      o      ~  scan line 1
+       ACS_S3        0x70      p      -  scan line 3
+       ACS_HLINE     0x71      q      -  horizontal line
+       ACS_S7        0x72      r      -  scan line 7
+       ACS_S9        0x73      s      _  scan line 9
+       ACS_LTEE      0x74      t      +  tee pointing right
+       ACS_RTEE      0x75      u      +  tee pointing left
+       ACS_BTEE      0x76      v      +  tee pointing up
+       ACS_TTEE      0x77      w      +  tee pointing down
+       ACS_VLINE     0x78      x      |  vertical line
+       ACS_LEQUAL    0x79      y      <  less-than-or-equal-to
+       ACS_GEQUAL    0x7a      z      >  greater-than-or-equal-to
+       ACS_PI        0x7b      {      *  greek pi
+       ACS_NEQUAL    0x7c      |      !  not-equal
+       ACS_STERLING  0x7d      }      f  UK pound sign
+       ACS_BULLET    0x7e      ~      o  bullet
+
+       A few notes apply to the table itself:
+
+       o   X/Open  Curses  incorrectly  states that the mapping for lantern is
+           uppercase "I" although Unix implementations use the  lowercase  "i"
+           mapping.
+
+       o   The  DEC  VT100  implemented graphics using the alternate character
+           set feature, temporarily switching modes and sending characters  in
+           the  range  0x60  (96)  to 0x7e (126) (the acsc Value column in the
+           table).
+
+       o   The AT&T terminal added graphics characters outside that range.
+
+           Some of the characters within the range do  not  match  the  VT100;
+           presumably  they  were  used in the AT&T terminal: board of squares
+           replaces the VT100 newline symbol, while  lantern  symbol  replaces
+           the VT100 vertical tab symbol.  The other VT100 symbols for control
+           characters (horizontal tab, carriage return and line-feed) are  not
+           (re)used in curses.
+
+       The  best  way to define a new device's graphics set is to add a column
+       to a copy of this table for your terminal, giving the  character  which
+       (when  emitted  between  smacs/rmacs  switches) will be rendered as the
+       corresponding graphic.  Then read off the VT100/your terminal character
+       pairs right to left in sequence; these become the ACSC string.
+
+
+

Color Handling

+       The  curses  library  functions init_pair and init_color manipulate the
+       color  pairs  and  color  values  discussed  in   this   section   (see
+       curs_color(3x) for details on these and related functions).
+
+       Most color terminals are either "Tektronix-like" or "HP-like":
+
+       o   Tektronix-like terminals have a predefined set of N colors (where N
+           is usually 8), and can set character-cell foreground and background
+           colors independently, mixing them into N * N color pairs.
+
+       o   On  HP-like  terminals,  the  user  must  set  each  color  pair up
+           separately  (foreground  and  background  are   not   independently
+           settable).   Up  to  M color pairs may be set up from 2*M different
+           colors.  ANSI-compatible terminals are Tektronix-like.
+
+       Some basic color capabilities are independent of the color method.  The
+       numeric  capabilities  colors  and pairs specify the maximum numbers of
+       colors and color pairs that can be displayed  simultaneously.   The  op
+       (original pair) string resets foreground and background colors to their
+       default values for the terminal.  The oc string resets  all  colors  or
+       color  pairs  to their default values for the terminal.  Some terminals
+       (including many PC terminal emulators)  erase  screen  areas  with  the
+       current  background  color rather than the power-up default background;
+       these should have the Boolean capability bce.
+
+       While the  curses  library  works  with  color  pairs  (reflecting  the
+       inability  of  some  devices  to  set  foreground and background colors
+       independently), there  are  separate  capabilities  for  setting  these
+       features:
+
+       o   To   change  the  current  foreground  or  background  color  on  a
+           Tektronix-type terminal, use setaf (set ANSI foreground) and  setab
+           (set  ANSI  background)  or  setf  (set  foreground)  and setb (set
+           background).  These take one parameter, the color number.  The SVr4
+           documentation  describes only setaf/setab; the XPG4 draft says that
+           "If the terminal supports ANSI escape sequences to  set  background
+           and   foreground,   they  should  be  coded  as  setaf  and  setab,
+           respectively.
+
+       o   If the terminal supports other escape sequences to  set  background
+           and   foreground,   they   should   be  coded  as  setf  and  setb,
+           respectively.  The vidputs and the refresh(3x)  functions  use  the
+           setaf and setab capabilities if they are defined.
+
+       The  setaf/setab  and  setf/setb  capabilities  take  a  single numeric
+       argument each.  Argument values 0-7 of setaf/setab are portably defined
+       as  follows (the middle column is the symbolic #define available in the
+       header for the curses or ncurses libraries).  The terminal hardware  is
+       free  to  map  these  as  it  likes, but the RGB values indicate normal
+       locations in color space.
+
+                    Color      #define       Value        RGB
+                   ------------------------------------------------
+                   black     COLOR_BLACK       0     0,   0,   0
+                   red       COLOR_RED         1     max, 0,   0
+                   green     COLOR_GREEN       2     0,   max, 0
+                   yellow    COLOR_YELLOW      3     max, max, 0
+                   blue      COLOR_BLUE        4     0,   0,   max
+                   magenta   COLOR_MAGENTA     5     max, 0,   max
+                   cyan      COLOR_CYAN        6     0,   max, max
+                   white     COLOR_WHITE       7     max, max, max
+
+       The argument values of setf/setb historically correspond to a different
+       mapping, i.e.,
+
+                    Color      #define       Value        RGB
+                   ------------------------------------------------
+                   black     COLOR_BLACK       0     0,   0,   0
+                   blue      COLOR_BLUE        1     0,   0,   max
+                   green     COLOR_GREEN       2     0,   max, 0
+                   cyan      COLOR_CYAN        3     0,   max, max
+                   red       COLOR_RED         4     max, 0,   0
+                   magenta   COLOR_MAGENTA     5     max, 0,   max
+                   yellow    COLOR_YELLOW      6     max, max, 0
+                   white     COLOR_WHITE       7     max, max, max
+
+       It  is  important  to  not  confuse the two sets of color capabilities;
+       otherwise red/blue will be interchanged on the display.
+
+       On an HP-like terminal, use scp with a color pair number  parameter  to
+       set which color pair is current.
+
+       Some terminals allow the color values to be modified:
+
+       o   On  a Tektronix-like terminal, the capability ccc may be present to
+           indicate that colors can be modified.  If so, the initc  capability
+           will take a color number (0 to colors - 1)and three more parameters
+           which describe the color.  These three parameters default to  being
+           interpreted  as  RGB  (Red,  Green,  Blue)  values.  If the Boolean
+           capability hls is present, they are instead as HLS (Hue, Lightness,
+           Saturation) indices.  The ranges are terminal-dependent.
+
+       o   On  an HP-like terminal, initp may give a capability for changing a
+           color pair value.  It will take  seven  parameters;  a  color  pair
+           number  (0  to  max_pairs  -  1),  and two triples describing first
+           background and then foreground colors.  These  parameters  must  be
+           (Red,  Green,  Blue)  or  (Hue, Lightness, Saturation) depending on
+           hls.
+
+       On some color terminals,  colors  collide  with  highlights.   You  can
+       register  these collisions with the ncv capability.  This is a bit mask
+       of  attributes  not  to  be  used  when  colors   are   enabled.    The
+       correspondence with the attributes understood by curses is as follows:
+
+                         Attribute     Bit   Decimal   Set by
+                        --------------------------------------
+                        A_STANDOUT      0         1    sgr
+                        A_UNDERLINE     1         2    sgr
+                        A_REVERSE       2         4    sgr
+                        A_BLINK         3         8    sgr
+                        A_DIM           4        16    sgr
+                        A_BOLD          5        32    sgr
+                        A_INVIS         6        64    sgr
+                        A_PROTECT       7       128    sgr
+                        A_ALTCHARSET    8       256    sgr
+                        A_HORIZONTAL    9       512    sgr1
+                        A_LEFT         10      1024    sgr1
+                        A_LOW          11      2048    sgr1
+                        A_RIGHT        12      4096    sgr1
+                        A_TOP          13      8192    sgr1
+                        A_VERTICAL     14     16384    sgr1
+                        A_ITALIC       15     32768    sitm
+
+       For  example, on many IBM PC consoles, the underline attribute collides
+       with the foreground color blue and is  not  available  in  color  mode.
+       These should have an ncv capability of 2.
+
+       SVr4  curses does nothing with ncv, ncurses recognizes it and optimizes
+       the output in favor of colors.
+
+
+

Miscellaneous

+       If the terminal requires other than a null (zero) character as  a  pad,
+       then  this  can  be  given as pad.  Only the first character of the pad
+       string is used.  If the terminal does not have a pad character, specify
+       npc.   Note that ncurses implements the termcap-compatible PC variable;
+       though the application may set this value to  something  other  than  a
+       null,  ncurses will test npc first and use napms if the terminal has no
+       pad character.
+
+       If the terminal can move up or down half a line, this can be  indicated
+       with  hu  (half-line  up)  and  hd (half-line down).  This is primarily
+       useful for superscripts and subscripts on hard-copy  terminals.   If  a
+       hard-copy terminal can eject to the next page (form feed), give this as
+       ff (usually control/L).
+
+       If there is a command to repeat a given character  a  given  number  of
+       times   (to   save  time  transmitting  a  large  number  of  identical
+       characters) this can be indicated with the  parameterized  string  rep.
+       The  first  parameter is the character to be repeated and the second is
+       the number of times to repeat it.  Thus, tparm(repeat_char, 'x', 10) is
+       the same as "xxxxxxxxxx".
+
+       If the terminal has a settable command character, such as the TEKTRONIX
+       4025, this can be indicated with cmdch.  A prototype command  character
+       is  chosen  which is used in all capabilities.  This character is given
+       in the cmdch capability to identify it.  The  following  convention  is
+       supported on some Unix systems: The environment is to be searched for a
+       CC variable, and if found, all occurrences of the  prototype  character
+       are replaced with the character in the environment variable.
+
+       Terminal  descriptions  that  do not represent a specific kind of known
+       terminal, such as switch, dialup, patch, and  network,  should  include
+       the  gn (generic) capability so that programs can complain that they do
+       not know how to talk to the terminal.  (This capability does not  apply
+       to  virtual  terminal  descriptions  for which the escape sequences are
+       known.)
+
+       If the terminal has a "meta key" which acts as a shift key, setting the
+       8th  bit  of any character transmitted, this fact can be indicated with
+       km.  Otherwise, software will assume that the 8th bit is parity and  it
+       will  usually be cleared.  If strings exist to turn this "meta mode" on
+       and off, they can be given as smm and rmm.
+
+       If the terminal has more lines of memory than will fit on the screen at
+       once,  the number of lines of memory can be indicated with lm.  A value
+       of lm#0 indicates that the number of lines is not fixed, but that there
+       is still more memory than fits on the screen.
+
+       If  the terminal is one of those supported by the Unix virtual terminal
+       protocol, the terminal number can be given as vt.
+
+       Media copy strings which control an auxiliary printer connected to  the
+       terminal  can  be  given as mc0: print the contents of the screen, mc4:
+       turn off the printer, and mc5: turn on the printer.  When  the  printer
+       is  on,  all text sent to the terminal will be sent to the printer.  It
+       is undefined whether the text is also displayed on the terminal  screen
+       when  the  printer  is  on.   A variation mc5p takes one parameter, and
+       leaves the printer on for as  many  characters  as  the  value  of  the
+       parameter, then turns the printer off.  The parameter should not exceed
+       255.  All text, including mc4, is transparently passed to  the  printer
+       while an mc5p is in effect.
+
+
+

Glitches and Brain Damage

+       Hazeltine  terminals, which do not allow "~" characters to be displayed
+       should indicate hz.
+
+       Terminals which ignore a line-feed immediately after an am  wrap,  such
+       as the Concept and vt100, should indicate xenl.
+
+       If  el  is  required  to get rid of standout (instead of merely writing
+       normal text on top of it), xhp should be given.
+
+       Teleray terminals, where tabs turn all characters moved over to blanks,
+       should  indicate  xt (destructive tabs).  Note: the variable indicating
+       this  is  now  "dest_tabs_magic_smso";  in  older  versions,   it   was
+       teleray_glitch.   This  glitch  is  also  taken  to mean that it is not
+       possible to position the cursor on top of a  "magic  cookie",  that  to
+       erase  standout  mode  it is instead necessary to use delete and insert
+       line.  The ncurses implementation ignores this glitch.
+
+       The Beehive Superbee, which is unable to correctly transmit the  escape
+       or  control/C  characters,  has xsb, indicating that the f1 key is used
+       for escape and f2 for control/C.  (Only  certain  Superbees  have  this
+       problem,  depending on the ROM.)  Note that in older terminfo versions,
+       this capability was called "beehive_glitch"; it is now "no_esc_ctl_c".
+
+       Other specific terminal  problems  may  be  corrected  by  adding  more
+       capabilities of the form xx.
+
+
+

Pitfalls of Long Entries

+       Long  terminfo  entries are unlikely to be a problem; to date, no entry
+       has  even  approached  terminfo's   4096-byte   string-table   maximum.
+       Unfortunately,  the termcap translations are much more strictly limited
+       (to 1023 bytes), thus termcap translations of long terminfo entries can
+       cause problems.
+
+       The  man  pages  for  4.3BSD and older versions of tgetent instruct the
+       user to allocate a 1024-byte buffer for the termcap entry.   The  entry
+       gets  null-terminated by the termcap library, so that makes the maximum
+       safe length for a termcap entry 1k-1 (1023) bytes.  Depending  on  what
+       the  application  and the termcap library being used does, and where in
+       the termcap file the terminal type that tgetent is  searching  for  is,
+       several bad things can happen:
+
+       o   some termcap libraries print a warning message,
+
+       o   some exit if they find an entry that's longer than 1023 bytes,
+
+       o   some neither exit nor warn, doing nothing useful, and
+
+       o   some simply truncate the entries to 1023 bytes.
+
+       Some application programs allocate more than the recommended 1K for the
+       termcap entry; others do not.
+
+       Each termcap entry has two important sizes associated with  it:  before
+       "tc"  expansion, and after "tc" expansion.  "tc" is the capability that
+       tacks on another termcap entry to the end of the current one, to add on
+       its capabilities.  If a termcap entry does not use the "tc" capability,
+       then of course the two lengths are the same.
+
+       The "before tc expansion" length is the most important one, because  it
+       affects  more than just users of that particular terminal.  This is the
+       length of the entry as it exists in /etc/termcap, minus the  backslash-
+       newline pairs, which tgetent strips out while reading it.  Some termcap
+       libraries strip off the final newline, too (GNU termcap does not).  Now
+       suppose:
+
+       o   a termcap entry before expansion is more than 1023 bytes long,
+
+       o   and the application has only allocated a 1k buffer,
+
+       o   and  the termcap library (like the one in BSD/OS 1.1 and GNU) reads
+           the whole entry into the buffer, no matter what its length, to  see
+           if it is the entry it wants,
+
+       o   and  tgetent  is  searching  for a terminal type that either is the
+           long entry, appears in the termcap file after the  long  entry,  or
+           does  not  appear in the file at all (so that tgetent has to search
+           the whole termcap file).
+
+       Then tgetent will overwrite memory, perhaps  its  stack,  and  probably
+       core   dump   the  program.   Programs  like  telnet  are  particularly
+       vulnerable; modern telnets pass along values  like  the  terminal  type
+       automatically.   The  results  are almost as undesirable with a termcap
+       library, like SunOS 4.1.3 and Ultrix 4.4, that prints warning  messages
+       when  it  reads  an  overly  long  termcap entry.  If a termcap library
+       truncates long entries, like OSF/1 3.0, it is immune to dying here  but
+       will return incorrect data for the terminal.
+
+       The  "after  tc  expansion"  length  will  have a similar effect to the
+       above, but only for people who actually set TERM to that terminal type,
+       since  tgetent  only  does "tc" expansion once it is found the terminal
+       type it was looking for, not while searching.
+
+       In summary, a termcap entry that is longer than 1023 bytes  can  cause,
+       on  various  combinations of termcap libraries and applications, a core
+       dump, warnings, or incorrect operation.  If it is too long even  before
+       "tc"  expansion,  it will have this effect even for users of some other
+       terminal types and users whose TERM variable does not  have  a  termcap
+       entry.
+
+       When  in  -C (translate to termcap) mode, the ncurses implementation of
+       tic(1m) issues warning messages when the pre-tc  length  of  a  termcap
+       translation  is  too  long.  The -c (check) option also checks resolved
+       (after tc expansion) lengths.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database directory
+
+
+

EXTENSIONS

+       Searching   for   terminal   descriptions   in   $HOME/.terminfo    and
+       TERMINFO_DIRS is not supported by older implementations.
+
+       Some  SVr4  curses  implementations,  and  all previous to SVr4, do not
+       interpret the %A and %O operators in parameter strings.
+
+       SVr4/XPG4 do not specify whether msgr licenses  movement  while  in  an
+       alternate-character-set  mode  (such modes may, among other things, map
+       CR and NL to characters  that  do  not  trigger  local  motions).   The
+       ncurses  implementation  ignores  msgr in ALTCHARSET mode.  This raises
+       the  possibility  that  an  XPG4  implementation  making  the  opposite
+       interpretation  may need terminfo entries made for ncurses to have msgr
+       turned off.
+
+       The ncurses library handles insert-character and insert-character modes
+       in  a  slightly  non-standard way to get better update efficiency.  See
+       the Insert/Delete Character subsection above.
+
+       The parameter substitutions for set_clock  and  display_clock  are  not
+       documented  in  SVr4  or  X/Open  Curses.   They  are  deduced from the
+       documentation for the AT&T 505 terminal.
+
+       Be careful assigning the kmous capability.  The ncurses  library  wants
+       to  interpret  it as KEY_MOUSE, for use by terminals and emulators like
+       xterm that can return mouse-tracking information in the  keyboard-input
+       stream.
+
+       X/Open  Curses  does  not  mention italics.  Portable applications must
+       assume that  numeric  capabilities  are  signed  16-bit  values.   This
+       includes  the  no_color_video  (ncv)  capability.  The 32768 mask value
+       used for italics with ncv can be confused with an  absent  or  canceled
+       ncv.   If  italics  should work with colors, then the ncv value must be
+       specified, even if it is zero.
+
+       Different commercial ports of terminfo  and  curses  support  different
+       subsets  of  X/Open  Curses  and  (in some cases) different extensions.
+       Here is a summary,  accurate  as  of  October  1995,  after  which  the
+       commercial Unix market contracted and lost diversity.
+
+       o   SVr4, Solaris, and ncurses support all SVr4 capabilities.
+
+       o   IRIX  supports  the  SVr4  set  and  adds one undocumented extended
+           string capability (set_pglen).
+
+       o   SVr1  and  Ultrix  support  a   restricted   subset   of   terminfo
+           capabilities.   The  Booleans  end with xon_xoff; the numerics with
+           width_status_line; and the strings with prtr_non.
+
+       o   HP/UX  supports  the  SVr1  subset,  plus  the  SVr[234]   numerics
+           num_labels,   label_height,  label_width,  plus  function  keys  11
+           through 63, plus plab_norm, label_on, and label_off, plus a  number
+           of incompatible string table extensions.
+
+       o   AIX  supports  the  SVr1  subset, plus function keys 11 through 63,
+           plus a number of incompatible string table extensions.
+
+       o   OSF/1 supports both the SVr4 set and the AIX extensions.
+
+
+

PORTABILITY

+       Do not count on  compiled  (binary)  terminfo  entries  being  portable
+       between  commercial  Unix  systems.   At  least  two implementations of
+       terminfo (those of HP-UX and AIX) diverged from those of other System V
+       Unices  after  SVr1,  adding extension capabilities to the string table
+       that (in the binary format) collide with subsequent System V and X/Open
+       Curses extensions.
+
+
+

AUTHORS

+       Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey.  Based on pcurses
+       by Pavel Curtis.
+
+
+

SEE ALSO

+       infocmp(1m),    tabs(1),    tic(1m),    curses(3x),     curs_color(3x),
+       curs_terminfo(3x),  curs_variables(3x),  printf(3), term_variables(3x),
+       term(5), user_caps(5)
+
+
+
+ncurses 6.5                       2024-05-11                       terminfo(5)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/tic.1m.html b/contrib/ncurses/doc/html/man/tic.1m.html new file mode 100644 index 00000000..3af79916 --- /dev/null +++ b/contrib/ncurses/doc/html/man/tic.1m.html @@ -0,0 +1,512 @@ + + + + + + +tic 1m 2024-09-14 ncurses 6.5 User commands + + + + +

tic 1m 2024-09-14 ncurses 6.5 User commands

+
+tic(1m)                          User commands                         tic(1m)
+
+
+
+
+

NAME

+       tic - compile terminal descriptions for terminfo or termcap
+
+
+

SYNOPSIS

+       tic  [-01acCDfgGIKLNqrstTUVWx] [-e terminal-type-list] [-o dir] [-Q[n]]
+       [-R subset] [-v[n]] [-w[n]] file
+
+
+

DESCRIPTION

+       The tic command translates a terminfo  file  from  source  format  into
+       compiled  format.   The  compiled  format is necessary for use with the
+       library routines in ncurses(3x).
+
+       As described in term(5), the database may be either  a  directory  tree
+       (one  file  per  terminal  entry)  or a hashed database (one record per
+       entry).  The tic command writes only one type of  entry,  depending  on
+       how it was built:
+
+       o   For    directory    trees,    the    top-level   directory,   e.g.,
+           /usr/share/terminfo, specifies the location of the database.
+
+       o   For hashed databases, a filename is needed.  If the given  file  is
+           not  found  by  that  name,  but  can be found by adding the suffix
+           ".db", then that is used.
+
+           The default name for the hashed database is the same as the default
+           directory name (only adding a ".db" suffix).
+
+       In  either  case  (directory  or  hashed database), tic will create the
+       container if it does not exist.  For a directory,  this  would  be  the
+       "terminfo" leaf, versus a "terminfo.db" file.
+
+       The  results  are  normally  placed  in  the  system  terminfo database
+       /usr/share/terminfo.  The compiled terminal description can  be  placed
+       in a different terminfo database.  There are two ways to achieve this:
+
+       o   First,  you  may override the system default either by using the -o
+           option,  or  by  setting  the  variable  TERMINFO  in  your   shell
+           environment to a valid database location.
+
+       o   Secondly,  if  tic  cannot  write  in  /usr/share/terminfo  or  the
+           location specified using your TERMINFO variable, it looks  for  the
+           directory  $HOME/.terminfo (or hashed database $HOME/.terminfo.db);
+           if that location exists, the entry is placed there.
+
+       Libraries  that  read  terminfo  entries  are  expected  to  check   in
+       succession
+
+       o   a location specified with the TERMINFO environment variable,
+
+       o   $HOME/.terminfo,
+
+       o   directories listed in the TERMINFO_DIRS environment variable,
+
+       o   a compiled-in list of directories (/usr/share/terminfo), and
+
+       o   the system terminfo database (/usr/share/terminfo).
+
+       The  Fetching  Compiled  Descriptions section in the terminfo(5) manual
+       goes into further detail.
+
+
+

Aliases

+       This is the same program as infotocap and captoinfo; usually those  are
+       linked to, or copied from this program:
+
+       o   When invoked as infotocap, tic sets the -I option.
+
+       o   When invoked as captoinfo, tic sets the -C option.
+
+
+

OPTIONS

+       -0     restricts the output to a single line
+
+       -1     restricts the output to a single column
+
+       -a     tells  tic  to  retain  commented-out  capabilities  rather than
+              discarding them.  Capabilities are commented by  prefixing  them
+              with  a  period.  This sets the -x option, because it treats the
+              commented-out entries as user-defined names.  If the  source  is
+              termcap,  accept  the  2-character  names required by version 6.
+              Otherwise these are ignored.
+
+       -C     Force source translation to termcap format.  Note: this  differs
+              from  the  -C  option  of infocmp(1m) in that it does not merely
+              translate capability names, but also translates terminfo strings
+              to  termcap  format.  Capabilities that are not translatable are
+              left in the entry under their terminfo names but  commented  out
+              with  two  preceding  dots.  The actual format used incorporates
+              some improvements for escaped characters from  terminfo  format.
+              For a stricter BSD-compatible translation, add the -K option.
+
+              If  this  is  combined  with  -c, tic makes additional checks to
+              report cases where the terminfo values  do  not  have  an  exact
+              equivalent in termcap form.  For example:
+
+              o   sgr  usually  will  not  convert,  because termcap lacks the
+                  ability to work with more than two parameters,  and  because
+                  termcap  lacks many of the arithmetic/logical operators used
+                  in terminfo.
+
+              o   capabilities with more than one delay or with delays  before
+                  the end of the string will not convert completely.
+
+       -c     tells  tic  to  only  check  file  for  errors, including syntax
+              problems and bad use-links.  If you specify -C  (-I)  with  this
+              option,  the code will print warnings about entries which, after
+              use resolution, are more than 1023 (4096) bytes long.  Due to  a
+              fixed buffer length in older termcap libraries, as well as buggy
+              checking for the  buffer  length  (and  a  documented  limit  in
+              terminfo),  these  entries  may  cause  core  dumps  with  other
+              implementations.
+
+              tic  checks  string  capabilities  to  ensure  that  those  with
+              parameters  will  be valid expressions.  It does this check only
+              for the predefined string capabilities; those which are  defined
+              with the -x option are ignored.
+
+       -D     tells  tic  to print the database locations that it knows about,
+              and exit.  The first location shown is the one to which it would
+              write  compiled  terminal  descriptions.   If tic is not able to
+              find  a  writable  database  location  according  to  the  rules
+              summarized  above,  it  will print a diagnostic and exit with an
+              error rather than printing a list of database locations.
+
+       -e list
+              Limit writes and translations to  the  comma-separated  list  of
+              terminal  types.  If any name or alias of a terminal matches one
+              of the  names  in  the  list,  the  entry  will  be  written  or
+              translated as normal.  Otherwise no output will be generated for
+              it.  The option value is interpreted as a  file  containing  the
+              list  if  it  contains  a  '/'.  (Note: depending on how tic was
+              compiled, this option may require -I or -C.)
+
+       -f     Display    complex    terminfo     strings     which     contain
+              if/then/else/endif expressions indented for readability.
+
+       -G     Display  constant  literals  in  decimal  form rather than their
+              character equivalents.
+
+       -g     Display constant character literals in quoted form  rather  than
+              their decimal equivalents.
+
+       -I     Force source translation to terminfo format.
+
+       -K     Suppress some longstanding ncurses extensions to termcap format,
+              e.g., "\s" for space.
+
+       -L     Force source translation to terminfo format  using  the  long  C
+              variable names listed in <term.h>
+
+       -N     Disable smart defaults.  Normally, when translating from termcap
+              to terminfo, the compiler makes a number  of  assumptions  about
+              the    defaults    of    string    capabilities   reset1_string,
+              carriage_return, cursor_left, cursor_down, scroll_forward,  tab,
+              newline, key_backspace, key_left, and key_down, then attempts to
+              use obsolete termcap capabilities to deduce correct values.   It
+              also normally suppresses output of obsolete termcap capabilities
+              such as bs.  This option forces a more literal translation  that
+              also preserves the obsolete capabilities.
+
+       -odir  Write  compiled  entries  to given database location.  Overrides
+              the TERMINFO environment variable.
+
+       -Qn    Rather than show source in terminfo  (text)  format,  print  the
+              compiled   (binary)   format  in  hexadecimal  or  base64  form,
+              depending on the option's value:
+
+               1  hexadecimal
+
+               2  base64
+
+               3  hexadecimal and base64
+
+       -q     Suppress  comments  and  blank  lines  when  showing  translated
+              source.
+
+       -Rsubset
+              Restrict  output to a given subset.  This option is for use with
+              archaic versions of terminfo like those on SVr1, Ultrix, or  HP-
+              UX that do not support the full set of SVR4/XSI Curses terminfo;
+              and outright broken ports like  AIX  3.x  that  have  their  own
+              extensions incompatible with SVr4/XSI.
+
+              Available subsets are
+              "SVr1", "Ultrix", "HP", "BSD", and "AIX"
+
+              See terminfo(5) for details.
+
+       -r     Force   entry   resolution   (so   there  are  no  remaining  tc
+              capabilities) even when doing  translation  to  termcap  format.
+              This  may  be  needed  if you are preparing a termcap file for a
+              termcap library (such as GNU termcap through version 1.3 or  BSD
+              termcap  through  4.3BSD)  that  does  not  handle  multiple  tc
+              capabilities per entry.
+
+       -s     Summarize the compile by  showing  the  database  location  into
+              which  entries  are written, and the number of entries which are
+              compiled.
+
+       -T     eliminates size-restrictions on the  generated  text.   This  is
+              mainly  useful  for  testing  and  analysis,  since the compiled
+              descriptions are limited  (e.g.,  1023  for  termcap,  4096  for
+              terminfo).
+
+       -t     tells  tic to discard commented-out capabilities.  Normally when
+              translating   from   terminfo   to    termcap,    untranslatable
+              capabilities are commented-out.
+
+       -U     tells  tic to not post-process the data after parsing the source
+              file.  Normally, it infers data which  is  commonly  missing  in
+              older terminfo data, or in termcaps.
+
+       -V     reports  the  version of ncurses which was used in this program,
+              and exits.
+
+       -vn    specifies that (verbose) output be  written  to  standard  error
+              trace information showing tic's progress.
+
+              The  optional  parameter  n  is a number from 1 to 9, inclusive,
+              indicating the desired level of detail of information.
+
+              o   If ncurses is built without tracing  support,  the  optional
+                  parameter is ignored.
+
+              o   If n is omitted, the default level is 1.
+
+              o   If n is specified and greater than 1, the level of detail is
+                  increased,  and  the  output  is   written   (with   tracing
+                  information) to the "trace" file.
+
+              The debug flag levels are as follows:
+
+              1   Names of files created and linked
+
+              2   Information related to the "use" facility
+
+              3   Statistics from the hashing algorithm
+
+              4   Details of extended capabilities
+
+              5   (unused)
+
+              6   (unused)
+
+              7   Entries into the string-table
+
+              8   List of tokens encountered by scanner
+
+              9   All values computed in construction of the hash table
+
+       -W     By  itself,  the  -w  option  will  not force long strings to be
+              wrapped.  Use the -W option to do this.
+
+              If you specify both -f and -W options,  the  latter  is  ignored
+              when -f has already split the line.
+
+       -wn    specifies  the  width of the output.  The parameter is optional.
+              If it is omitted, it defaults to 60.
+
+       -x     Treat unknown capabilities as user-defined  (see  user_caps(5)).
+              That  is,  if  you  supply  a capability name which tic does not
+              recognize, it will infer its type (Boolean,  number  or  string)
+              from  the  syntax  and  make  an  extended table entry for that.
+              User-defined capability strings whose name begins with  "k"  are
+              treated as function keys.
+
+
+

Parameters

+       file   contains  one  or  more terminfo terminal descriptions in source
+              format  [see  terminfo(5)].   Each  description  in   the   file
+              describes the capabilities of a particular terminal.
+
+              If  file  is "-", then the data is read from the standard input.
+              The file parameter may also be the path of a character-device.
+
+
+

Processing

+       All but one of the capabilities recognized by  tic  are  documented  in
+       terminfo(5).  The exception is the use capability.
+
+       When a use=entry-name field is discovered in a terminal entry currently
+       being compiled, tic reads in the  binary  from  /usr/share/terminfo  to
+       complete  the  entry.   (Entries  created from file will be used first.
+       tic duplicates the capabilities in entry-name for  the  current  entry,
+       with the exception of those capabilities that explicitly are defined in
+       the current entry.
+
+       When an entry, e.g., entry_name_1, contains a  use=entry_name_2  field,
+       any   canceled   capabilities  in  entry_name_2  must  also  appear  in
+       entry_name_1 before use= for  these  capabilities  to  be  canceled  in
+       entry_name_1.
+
+       Total  compiled  entries cannot exceed 4096 bytes in the legacy storage
+       format, or 32768 using the extended  number  format.   The  name  field
+       cannot  exceed  512  bytes.  Terminal names exceeding the maximum alias
+       length (32 characters on systems with  long  filenames,  14  characters
+       otherwise)  will be truncated to the maximum alias length and a warning
+       message will be printed.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database
+
+
+

NOTES

+       There is  some  evidence  that  historic  tic  implementations  treated
+       description  fields with no whitespace in them as additional aliases or
+       short names.  This tic  does  not  do  that,  but  it  does  warn  when
+       description fields may be treated that way and check them for dangerous
+       characters.
+
+
+

EXTENSIONS

+       Unlike the SVr4 tic command, this implementation can  actually  compile
+       termcap  sources.   In fact, entries in terminfo and termcap syntax can
+       be mixed in a single source file.  See  terminfo(5)  for  the  list  of
+       termcap names taken to be equivalent to terminfo names.
+
+       The  SVr4  manual  pages  are not clear on the resolution rules for use
+       capabilities.   This  implementation  of  tic  will  find  use  targets
+       anywhere  in  the  source  file, or anywhere in the file tree rooted at
+       TERMINFO (if TERMINFO is defined), or  in  the  user's  $HOME/.terminfo
+       database  (if  it  exists),  or (finally) anywhere in the system's file
+       tree of compiled entries.
+
+       The error messages from this tic have the same format as  GNU  C  error
+       messages, and can be parsed by GNU Emacs's compile facility.
+
+       Aside from -c and -v, options are not portable:
+
+       o   Most of tic's options are not supported by SVr4 tic:
+
+           -0 -1 -C -G -I -N -R -T -V -a -e -f -g -o -r -s -t -x
+
+       o   The NetBSD tic supports a few of the ncurses options
+
+           -a -o -x
+
+           and  adds  -S  (a feature which does the same thing as infocmp's -e
+           and -E options).
+
+       The SVr4 -c mode does not report bad "use=" links.
+
+       System V does  not  compile  entries  to  or  read  entries  from  your
+       $HOME/.terminfo database unless TERMINFO is explicitly set to it.
+
+
+

PORTABILITY

+       X/Open  Curses, Issue 7 (2009) provides a brief description of tic.  It
+       lists one option: -c.  The omission of -v is  unexpected.   The  change
+       history  states  that the description is derived from Tru64.  According
+       to its manual pages, that system also supported the -v option.
+
+       Shortly after Issue 7 was released,  Tru64  was  discontinued.   As  of
+       2019,  the  surviving  implementations  of tic are SVr4 (AIX, HP-UX and
+       Solaris), ncurses and NetBSD curses.  The SVr4 tic programs all support
+       the  -v option.  The NetBSD tic program follows X/Open's documentation,
+       omitting the -v option.
+
+       The X/Open rationale states  that  some  implementations  of  tic  read
+       terminal  descriptions from the standard input if the file parameter is
+       omitted.  None of these implementations do that.  Further, it  comments
+       that  some  may  choose  to  read  from  "./terminfo.src"  but  that is
+       obsolescent behavior from SVr2, and is not (for example)  a  documented
+       feature of SVr3.
+
+
+

HISTORY

+       System  V  Release  2  provided  a  tic  utility.  It accepted a single
+       option: -v (optionally  followed  by  a  number).   According  to  Ross
+       Ridge's comment in mytinfo, this version of tic was unable to represent
+       canceled capabilities.
+
+       System V Release 3 provided a different tic utility, written  by  Pavel
+       Curtis,  (originally named "compile" in pcurses).  This added an option
+       -c to check the file for errors, with the caveat that errors in  "use="
+       links  would  not  be  reported.   System  V Release 3 documented a few
+       warning messages which did not appear in pcurses.   While  the  program
+       itself  was  changed  little  as  development  continued  with System V
+       Release 4, the table of capabilities grew from  180  (pcurses)  to  464
+       (Solaris).
+
+       In  early  development of ncurses (1993), Zeyd Ben-Halim used the table
+       from mytinfo to extend the  pcurses  table  to  469  capabilities  (456
+       matched  SVr4, 8 were only in SVr4, 13 were not in SVr4).  Of those 13,
+       11 were ultimately discarded (perhaps to  match  the  draft  of  X/Open
+       Curses).   The exceptions were memory_lock_above and memory_unlock (see
+       user_caps(5)).
+
+       Eric Raymond incorporated parts of mytinfo into  ncurses  to  implement
+       the  termcap-to-terminfo  source conversion, and extended that to begin
+       development of the corresponding terminfo-to-termcap source conversion,
+       Thomas  Dickey  completed  that  development over the course of several
+       years.
+
+       In 1999, Thomas Dickey added the  -x  option  to  support  user-defined
+       capabilities.
+
+       In  2010,  Roy  Marples provided a tic program and terminfo library for
+       NetBSD.  That implementation  adapts  several  features  from  ncurses,
+       including tic's -x option.
+
+       The  -c  option  tells tic to check for problems in the terminfo source
+       file.  Continued development provides additional checks:
+
+       o   pcurses had 8 warnings
+
+       o   ncurses in 1996 had 16 warnings
+
+       o   Solaris (SVr4) curses has 28 warnings
+
+       o   NetBSD tic in 2019 has 19 warnings.
+
+       o   ncurses in 2019 has 96 warnings
+
+       The checking done in ncurses' tic helps with the conversion to termcap,
+       as well as pointing out errors and inconsistencies.  It is also used to
+       ensure consistency with the user-defined capabilities.  There  are  527
+       distinct  capabilities  in ncurses' terminal database; 128 of those are
+       user-defined.
+
+
+

AUTHORS

+       Eric S. Raymond <esr@snark.thyrsus.com> and
+       Thomas E. Dickey <dickey@invisible-island.net>
+
+
+

SEE ALSO

+       captoinfo(1m),   infocmp(1m),   infotocap(1m),   toe(1m),   curses(3x),
+       term(5), terminfo(5), user_caps(5)
+
+
+
+ncurses 6.5                       2024-09-14                           tic(1m)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/toe.1m.html b/contrib/ncurses/doc/html/man/toe.1m.html new file mode 100644 index 00000000..85daf55c --- /dev/null +++ b/contrib/ncurses/doc/html/man/toe.1m.html @@ -0,0 +1,204 @@ + + + + + + +toe 1m 2024-05-11 ncurses 6.5 User commands + + + + +

toe 1m 2024-05-11 ncurses 6.5 User commands

+
+toe(1m)                          User commands                         toe(1m)
+
+
+
+
+

NAME

+       toe - list table of entries of terminfo terminal types
+
+
+

SYNOPSIS

+       toe [-ahs] [-v [n]] [directory ...]
+
+       toe [-u|-U] file
+
+       toe -V
+
+
+

DESCRIPTION

+       toe  reports  to  the  standard  output  stream the (primary) names and
+       descriptions of the terminal types available to the  terminfo  library.
+       Each  directory  is  scanned;  if none are given, toe scans the default
+       terminfo directory.
+
+
+

OPTIONS

+       The -h option can be helpful  to  observe  where  toe  is  looking  for
+       terminal  descriptions.   Other options support maintainers of terminfo
+       terminal descriptions.
+
+       -a       lists entries from  all  terminal  database  directories  that
+                terminfo  would  search,  instead  of  only  the first that it
+                finds.
+
+                If  -s  is  also  given,  toe   additionally   reports,   like
+                conflict(1),  which  entries  correspond  to  a given terminal
+                database.  An "*" marks entries that  differ,  and  "+"  marks
+                equivalent entries.
+
+                Without   the  -s  option,  toe  does  not  attempt  to  merge
+                duplicates in its report.
+
+       -h       writes a heading naming each each directory as it is accessed.
+
+       -s       sorts the output by the entry names.
+
+       -u file  lists terminal type dependencies in  file,  a  terminfo  entry
+                source  or  termcap  database file.  The report summarizes the
+                "use"  (terminfo)  and  tc  (termcap)  relations:  each   line
+                comprises the primary name of a terminal type employing use/tc
+                capabilities, a colon, a  space-  and  tab-separated  list  of
+                primary names of terminal types thus named, and a newline.
+
+       -U file  lists  terminal  type reverse dependencies in file, a terminfo
+                entry source or termcap database file.  The report  summarizes
+                the  "use" (terminfo) and tc (termcap) reverse relations: each
+                line comprises the primary name of a terminal  type  occurring
+                in  use/tc  capabilities,  a colon, a space- and tab-separated
+                list of primary names of terminal types naming them thus,  and
+                a newline.
+
+       -v [n]   reports  verbose  status  information  to  the  standard error
+                stream, showing toe's progress.
+
+                The optional parameter n  is  an  integer  between  1  and  10
+                inclusive,  interpreted  as  for tic(1m).  If ncurses is built
+                without tracing support, n is ignored.
+
+       -V       reports the version of ncurses associated  with  this  program
+                and exits with a successful status.
+
+
+

FILES

+       /usr/share/terminfo
+              compiled terminal description database
+
+
+

PORTABILITY

+       toe  is  not provided by other implementations.  There is no applicable
+       X/Open or POSIX standard for it.
+
+
+

HISTORY

+       toe replaces a -T option that was  briefly  supported  by  the  ncurses
+       infocmp utility in 1995.
+
+       The -a and -s options were added in 2006 and 2011, respectively.
+
+       The program's name originates with a developer's pun:
+
+       o   tic,
+
+       o   tac (now tack),
+
+       o   toe.
+
+
+

EXAMPLES

+       When  not  sorting with the -s option, the -a option reports all of the
+       names found in all of the terminal database directories  named  in  the
+       TERMINFO and TERMINFO_DIRS environment variables.
+
+           xterm-color     generic color xterm
+           xterm-xfree86   xterm terminal emulator (XFree86)
+           xterm-vt220     xterm emulating vt220
+           xterm-256color  xterm with 256 colors
+           xterm-r6        xterm X11R6 version
+           xterm-r5        xterm R5 version
+           xterm-mono      monochrome xterm
+           xterm           xterm terminal emulator (X Window System)
+           vt220           dec vt220
+           vt102           dec vt102
+           vt100           dec vt100 (w/advanced video)
+           vt52            dec vt52
+           ...
+
+       Use  the  -a  and  -s  options  together  to  show  where each terminal
+       description was found.
+
+           --> /etc/terminfo
+           ----> /lib/terminfo
+           ------> /usr/share/terminfo
+
+           --*---: vt100           dec vt100 (w/advanced video)
+           --*---: vt102           dec vt102
+           --*---: vt220           dec vt220
+           --*---: vt52            dec vt52
+           --*---: xterm           xterm terminal emulator (X Window System)
+           --*---: xterm-256color  xterm with 256 colors
+           --*---: xterm-color     generic color xterm
+           --*---: xterm-mono      monochrome xterm
+           --*---: xterm-r5        xterm R5 version
+           --*---: xterm-r6        xterm X11R6 version
+           --*---: xterm-vt220     xterm emulating vt220
+           --*---: xterm-xfree86   xterm terminal emulator (XFree86)
+           ...
+
+
+

SEE ALSO

+       captoinfo(1m),   infocmp(1m),   infotocap(1m),   tic(1m),   curses(3x),
+       terminfo(5)
+
+
+
+ncurses 6.5                       2024-05-11                           toe(1m)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/tput.1.html b/contrib/ncurses/doc/html/man/tput.1.html new file mode 100644 index 00000000..14a3a0aa --- /dev/null +++ b/contrib/ncurses/doc/html/man/tput.1.html @@ -0,0 +1,586 @@ + + + + + + +tput 1 2024-09-14 ncurses 6.5 User commands + + + + +

tput 1 2024-09-14 ncurses 6.5 User commands

+
+tput(1)                          User commands                         tput(1)
+
+
+
+
+

NAME

+       tput - initialize a terminal, exercise its capabilities, or query term-
+       info database
+
+
+

SYNOPSIS

+       tput [-v] [-T terminal-type] {cap-code [parameter ...]} ...
+
+       tput [-v] [-T terminal-type] [-x] clear
+
+       tput [-v] [-T terminal-type] init
+
+       tput [-v] [-T terminal-type] reset
+
+       tput [-v] [-T terminal-type] longname
+
+       tput [-v] -S
+
+       tput [-v] -V
+
+
+

DESCRIPTION

+       tput uses the terminfo library and database to  make  terminal-specific
+       capabilities  and  information available to the shell, to initialize or
+       reset the terminal, or to report  a  description  of  the  current  (or
+       specified)  terminal  type.  Terminal capabilities are accessed by cap-
+       code.
+
+       terminfo(5) discusses terminal capabilities at length  and  presents  a
+       complete list of cap-codes.
+
+       When   retrieving  capability  values,  the  result  depends  upon  the
+       capability's type.
+
+       Boolean  tput sets its exit status to 0 if the terminal possesses  cap-
+                code, and 1 if it does not.
+
+       numeric  tput  writes  cap-code's  decimal value to the standard output
+                stream if defined (-1 if it is not) followed by a newline.
+
+       string   tput writes cap-code's value to the standard output stream  if
+                defined, without a trailing newline.
+
+       Before  using  a value returned on the standard output, the application
+       should test tput's exit status to be sure it is 0;  see  section  "EXIT
+       STATUS" below.
+
+
+

Operands

+       Generally,  an  operand  is  a  cap-code,  a  capability  code from the
+       terminal database, or a parameter thereto.  Three others are  specially
+       recognized by tput: init, reset, and longname.  Although these resemble
+       capability codes, they in fact receive special handling; we  term  them
+       "pseudo-capabilities".
+
+       cap-code   indicates a capability from the terminal database.
+
+                  If  cap-code  is  of  string type and takes parameters, tput
+                  interprets arguments following cap-code as  the  parameters,
+                  up to the (fixed) quantity the capability requires.
+
+                  Most   parameters   are   numeric.    Only  a  few  terminal
+                  capabilities require string parameters; tput uses a table to
+                  decide  which  to  pass  as  strings.   Normally  tput  uses
+                  tparm(3x) to perform the substitution.  If no parameters are
+                  given  for  the  capability,  tput writes the string without
+                  performing the substitution.
+
+       init       initializes the  terminal.   If  the  terminal  database  is
+                  present  and  an  entry for the user's terminal type exists,
+                  the following occur.
+
+                  (1)  tput  retrieves  the  terminal's  mode  settings.    It
+                       successively  tests  the file descriptors corresponding
+                       to
+
+                       o   the standard error stream,
+
+                       o   the standard output stream,
+
+                       o   the standard input stream, and
+
+                       o   /dev/tty
+
+                       to obtain terminal settings.   Having  retrieved  them,
+                       tput  remembers  which  descriptor  to  use for further
+                       updates.
+
+                  (2)  If the terminal dimensions cannot be obtained from  the
+                       operating  system, but the environment or terminal type
+                       database  entry  describes  them,  tput   updates   the
+                       operating system's notion of them.
+
+                  (3)  tput updates the terminal modes.
+
+                       o   Any  delays  specified  in  the entry (for example,
+                           when a newline is sent) are  set  in  the  terminal
+                           driver.
+
+                       o   Tab   expansion   is  turned  on  or  off  per  the
+                           specification in the entry, and
+
+                       o   if tabs are not expanded, standard  tabs  (every  8
+                           spaces) are set.
+
+                  (4)  If  initialization capabilities, detailed in subsection
+                       "Tabs and Initialization" of terminfo(5), are  present,
+                       tput writes them to the standard output stream.
+
+                  (5)  tput flushes the standard output stream.
+
+                  If  an  entry  lacks  the information needed for an activity
+                  above, that activity is silently skipped.
+
+       reset      re-initializes  the  terminal.    A   reset   differs   from
+                  initialization in two ways.
+
+                  (1)  tput sets the the terminal modes to a "sane" state,
+
+                       o   enabling cooked and echo modes,
+
+                       o   disabling cbreak and raw modes,
+
+                       o   enabling newline translation, and
+
+                       o   setting  any  unset  special  characters  to  their
+                           default values.
+
+                  (2)  If any reset capabilities are defined for the  terminal
+                       type,   tput   writes   them   to  the  output  stream.
+                       Otherwise,  tput  uses   any   defined   initialization
+                       capabilities.    Reset  capabilities  are  detailed  in
+                       subsection "Tabs and Initialization" of terminfo(5).
+
+       longname   A terminfo entry begins with one or more names by  which  an
+                  application  can  refer  to  the  entry,  before the list of
+                  terminal capabilities.   The  names  are  separated  by  "|"
+                  characters.   X/Open  Curses  terms  the last name the "long
+                  name", and indicates that it may include blanks.
+
+                  tic warns if the last  name  does  not  include  blanks,  to
+                  accommodate  old terminfo entries that treated the long name
+                  as an optional feature.  The long name is often referred  to
+                  as the description field.
+
+                  If  the  terminal  database  is present and an entry for the
+                  user's terminal type exists, tput reports its description to
+                  the standard output stream, without a trailing newline.  See
+                  terminfo(5).
+
+       Note: Redirecting the output of "tput init" or "tput reset" to  a  file
+       will capture only part of their actions.  Changes to the terminal modes
+       are not affected by file descriptor  redirection,  since  the  terminal
+       modes are altered via ioctl(2).
+
+
+

Aliases

+       If  tput  is  invoked  via  link  with any of the names clear, init, or
+       reset, it operates as if run with the corresponding (pseudo-)capability
+       operand.  For example, executing a link named reset that points to tput
+       has the same effect as "tput reset".
+
+       This feature was introduced by ncurses 5.2 in 2000.  It is rarely used:
+
+       clear  is a separate program, which is both smaller and more frequently
+              executed.
+
+       init   has the same name as another program in widespread use.
+
+       reset  is  provided  by  the  tset(1)  utility  (also  via a link named
+              reset).
+
+
+

Terminal Size

+       Besides the pseudo-capabilities (such as init), tput treats  the  lines
+       and  cols  cap-codes specially: it may call setupterm(3x) to obtain the
+       terminal size.
+
+       o   First, tput attempts to obtain these capabilities from the terminal
+           database.   This generally fails for terminal emulators, which lack
+           a fixed window size and thus omit the capabilities.
+
+       o   It then asks the operating system for the  terminal's  size,  which
+           generally  works,  unless  the connection is via a serial line that
+           does not support "NAWS": negotiations about window size.
+
+       o   Finally, it inspects the environment variables LINES  and  COLUMNS,
+           which may override the terminal size.
+
+       If  the  -T  option is given, tput ignores the environment variables by
+       calling  use_tioctl(TRUE),  relying  upon  the  operating  system  (or,
+       ultimately, the terminal database).
+
+
+

OPTIONS

+       -S       retrieves  more  than  one  capability per invocation of tput.
+                The capabilities must be passed  to  tput  from  the  standard
+                input  stream  instead  of  from the command line (see section
+                "EXAMPLES" below).  Only one cap-code  is  allowed  per  line.
+                The  -S  option  changes  the  meanings  of  the  0 and 1 exit
+                statuses (see section "EXIT STATUS" below).
+
+                Some capabilities use string parameters  rather  than  numeric
+                ones.   tput  employs  a  built-in  table  and the presence of
+                parameters in its input to decide how to interpret  them,  and
+                whether to use tparm(3x).
+
+       -T type  indicates  the  terminal's  type.   Normally  this  option  is
+                unnecessary,  because  a  default  is  taken  from  the   TERM
+                environment variable.  If specified, the environment variables
+                LINES and COLUMNS are also ignored.
+
+       -v       causes tput to operate verbosely, reporting warnings.
+
+       -V       reports the version of ncurses associated with tput, and exits
+                with a successful status.
+
+       -x       prevents  "tput clear" from attempting to clear the scrollback
+                buffer.
+
+
+

EXIT STATUS

+       Normally, one should interpret tput's exit statuses as follows.
+
+       Status   Meaning When -S Not Specified
+       ------------------------------------------------------------------------
+       0        Boolean or string capability present
+       1        Boolean or numeric capability absent
+       2        usage error or no terminal type specified
+       3        unrecognized terminal type
+       4        unrecognized capability code
+       >4       system error (4 + errno)
+
+       When the -S option is used, some statuses change meanings.
+
+       Status   Meaning When -S Specified
+       ------------------------------------------------------------------------
+       0        all operands interpreted
+       1        unused
+       4        some operands not interpreted
+
+
+

ENVIRONMENT

+       tput reads one environment variable.
+
+       TERM    denotes the terminal type.  Each  terminal  type  is  distinct,
+               though many are similar.  The -T option overrides its value.
+
+
+

FILES

+       /usr/share/tabset
+              tab stop initialization database
+
+       /usr/share/terminfo
+              compiled terminal description database
+
+
+

PORTABILITY

+       Over  time  ncurses  tput  has  differed  from  that of System V in two
+       important respects, one now mostly historical.
+
+       o   "tput cap-code" writes to the standard output, which need not be  a
+           terminal  device.   However,  the operands that manipulate terminal
+           modes might not use the standard output.
+
+           System V tput's init and reset  operands  use  logic  from  4.1cBSD
+           tset,  manipulating  terminal  modes.   It  checks  the  same  file
+           descriptors (and /dev/tty) for association with a  terminal  device
+           as  ncurses  now does, and if none are, finally assumes a 1200 baud
+           terminal.  When updating terminal modes, it ignores errors.
+
+           Until ncurses 6.1 (see  section  "HISTORY"  below),  tput  did  not
+           modify  terminal  modes.   It  now  employs  a  scheme  similar  to
+           System V, using functions shared with tset (and ultimately based on
+           4.4BSD  tset).  If it is not able to open a terminal (for instance,
+           when run by cron(1)), tput exits with an error status.
+
+       o   System V tput assumes that  the  type  of  a  cap-code  operand  is
+           numeric  if all the characters of its value are decimal numbers; if
+           they are not, it treats cap-code as a string capability.
+
+           Most implementations that provide support for cap-code operands use
+           the  tparm(3x)  function  to  expand its parameters.  That function
+           expects a mixture of numeric and string parameters, requiring  tput
+           to know which type to use.
+
+           ncurses  tput uses a table to determine the parameter types for the
+           standard cap-code operands, and an  internal  function  to  analyze
+           nonstandard cap-code operands.
+
+           While  more reliable than System V's utility, a portability problem
+           is introduced by this analysis.  An OpenBSD developer  adapted  the
+           internal  library  function  from ncurses to port NetBSD's termcap-
+           based tput to terminfo, and modified it to interpret multiple  cap-
+           codes  (and parameters) on the command line.  Portable applications
+           should not rely upon this feature; ncurses  offers  it  to  support
+           applications written specifically for OpenBSD.
+
+       This  implementation,  unlike others, accepts both termcap and terminfo
+       cap-codes if termcap support is compiled in.  In  that  case,  however,
+       the predefined termcap and terminfo codes have two ambiguities; ncurses
+       assumes the terminfo code.
+
+       o   The cap-code dl means delete_line to termcap  but  parm_delete_line
+           to terminfo.  termcap uses the code DL for parm_delete_line.  term-
+           info uses the code dl1 for delete_line.
+
+       o   The cap-code ed means exit_delete_mode to termcap  but  clr_eos  to
+           terminfo.  termcap uses the code cd for clr_eos.  terminfo uses the
+           code rmdc for exit_delete_mode.
+
+       The  longname  operand,  -S  option,  and  the   parameter-substitution
+       features  used in the cup example below, were not supported in AT&T/USL
+       curses before SVr4 (1989).  Later, 4.3BSD-Reno (1990) added support for
+       longname,  and  in  1994,  NetBSD  added  support  for  the  parameter-
+       substitution features.
+
+       IEEE  Std  1003.1/The  Open   Group   Base   Specifications   Issue   7
+       (POSIX.1-2008)  documents  only the clear, init, and reset operands.  A
+       few observations of interest arise from that selection.
+
+       o   ncurses supports clear as it does any other standard cap-code.  The
+           others   (init   and   longname)  do  not  correspond  to  terminal
+           capabilities.
+
+       o   The tput on SVr4-based systems such as Solaris, IRIX64, and  HP-UX,
+           as well as others such as AIX and Tru64, also support standard cap-
+           code operands.
+
+       o   A few platforms such as FreeBSD recognize termcap codes rather than
+           terminfo capability codes in their respective tput commands.  Since
+           2010, NetBSD's tput uses terminfo codes.   Before  that,  it  (like
+           FreeBSD) recognized termcap codes.
+
+           Beginning  in  2021, FreeBSD uses ncurses tput, configured for both
+           terminfo (tested first) and termcap (as a fallback).
+
+       Because (apparently) all certified Unix systems support the full set of
+       capability  codes,  the  reason  for  documenting only a few may not be
+       apparent.
+
+       o   X/Open Curses Issue 7 documents tput differently, with cap-code and
+           the other features used in this implementation.
+
+       o   That  is,  there  are  two standards for tput: POSIX (a subset) and
+           X/Open Curses (the full implementation).  POSIX documents a  subset
+           to  avoid  the  complication  of  including  X/Open  Curses and the
+           terminal capability database.
+
+       o   While it is certainly possible to  write  a  tput  program  without
+           using  curses,  no  system  with a curses implementation provides a
+           tput utility that does not also support standard cap-codes.
+
+       X/Open  Curses  Issue  7  (2009)  is  the  first  version  to  document
+       utilities.  However that part of X/Open Curses does not follow existing
+       practice (that is, System V curses behavior).
+
+       o   It assigns exit status 4 to "invalid operand", which may  have  the
+           same  meaning  as  "unknown  capability".  For instance, the source
+           code for Solaris xcurses uses the term "invalid" in this case.
+
+       o   It assigns exit status 255  to  a  numeric  variable  that  is  not
+           specified in the terminfo database.  That likely is a documentation
+           error, mistaking  the  "-1"  written  to  the  standard  output  to
+           indicate an absent or canceled numeric capability for an (unsigned)
+           exit status.
+
+       The various System V implementations (AIX, HP-UX, Solaris) use the same
+       exit statuses as ncurses.
+
+       NetBSD  curses  documents  exit  statuses  that  correspond  to neither
+       ncurses nor X/Open Curses.
+
+
+

HISTORY

+       Bill Joy wrote a tput command during development  of  4BSD  in  October
+       1980.   This  initial version only cleared the screen, and did not ship
+       with official distributions.
+
+       System V developed a different tput command.
+
+       o   SVr2 (1984) provided a rudimentary tput that checked the  parameter
+           against  each  predefined capability and returned the corresponding
+           value.   This  version  of  tput  did   not   use   tparm(3x)   for
+           parameterized capabilities.
+
+       o   SVr3  (1987)  replaced  that  with  a  more extensive program whose
+           support for init and reset operands (more than  half  the  program)
+           incorporated the reset feature of BSD tset written by Eric Allman.
+
+       o   SVr4  (1989)  added  color  initialization by using the orig_colors
+           (oc) and orig_pair (op) capabilities in its init logic.
+
+       Keith Bostic refactored BSD tput for shipment in  4.3BSD-Tahoe  (1988),
+       then  replaced  it  the  next  year  with a new implementation based on
+       System V tput.  Bostic's version  similarly  accepted  some  parameters
+       named  for  terminfo  (pseudo-)capabilities: clear, init, longname, and
+       reset.  However, because he had only  termcap  available,  it  accepted
+       termcap  codes for other capabilities.  Also, Bostic's BSD tput did not
+       modify the terminal modes as the earlier BSD tset had done.
+
+       At the same time, Bostic added a shell script named "clear"  that  used
+       tput  to  clear the screen.  Both of these appeared in 4.4BSD, becoming
+       the "modern" BSD implementation of tput.
+
+       The origin of ncurses tput lies outside both System V and BSD, in  Ross
+       Ridge's  mytinfo  package,  published  on comp.sources.unix in December
+       1992.  Ridge's program made more  sophisticated  use  of  the  terminal
+       capabilities than the BSD program.  Eric Raymond used that tput program
+       (and other parts of mytinfo) in ncurses in  June  1995.   Incorporating
+       the  portions dealing with terminal capabilities almost without change,
+       Raymond made improvements  to  the  way  command-line  parameters  were
+       handled.
+
+       Before ncurses 6.1 (2018), its tset and tput utilities differed.
+
+       o   tset  was  more effective, resetting the terminal modes and special
+           characters.
+
+       o   On the other hand, tset's repertoire of terminal  capabilities  for
+           resetting the terminal was more limited; it had only equivalents of
+           reset_1string (rs1), reset_2string (rs2), and reset_file (rf),  and
+           not the tab stop and margin update features of tput.
+
+       The reset program is traditionally an alias for tset due to its ability
+       to reset terminal modes and special characters.
+
+       As of ncurses 6.1,  the  "reset"  features  of  the  two  programs  are
+       (mostly) the same.  Two minor differences remain.
+
+       o   When  issuing  a  reset, the tset program checks whether the device
+           appears to be a pseudoterminal (as might  be  used  by  a  terminal
+           emulator program), and, if it does not, waits one second in case it
+           is communicating with a hardware terminal.
+
+       o   The two programs  write  the  terminal  initialization  strings  to
+           different  streams;  that  is, standard error for tset and standard
+           output for tput.
+
+
+

EXAMPLES

+       tput init
+              Initialize the terminal according to the type of terminal in the
+              TERM  environment  variable.   If  the  system does not reliably
+              initialize the terminal upon login, this command can be included
+              in $HOME/.profile after exporting the TERM environment variable.
+
+       tput -T5620 reset
+              Reset an AT&T 5620 terminal, overriding the terminal type in the
+              TERM environment variable.
+
+       tput cnorm
+              Set cursor to normal visibility.
+
+       tput home
+              Move the cursor to line 0, column 0: the upper  left  corner  of
+              the screen, usually known as the "home" cursor position.
+
+       tput clear
+              Clear  the  screen: write the clear_screen capability's value to
+              the standard output stream.
+
+       tput cols
+              Report the number of columns used by the current terminal type.
+
+       tput -Tadm3a cols
+              Report the number of columns used by an ADM-3A terminal.
+
+       strong=`tput smso` normal=`tput rmso`
+              Set shell variables to capability values: strong and normal,  to
+              begin  and  end,  respectively, stand-out mode for the terminal.
+              One might use these to present a prompt.
+
+                     printf "${strong}Username:${normal} "
+
+       tput hc
+              Indicate via exit status whether the terminal  is  a  hard  copy
+              device.
+
+       tput cup 23 4
+              Move the cursor to line 23, column 4.
+
+       tput cup
+              Report  the  value  of the cursor_address (cup) capability (used
+              for cursor movement), with no parameters substituted.
+
+       tput longname
+              Report the terminfo database's description of the terminal  type
+              specified in the TERM environment variable.
+
+       tput -S
+              Process  multiple capabilities.  The -S option can be profitably
+              used with a shell "here document".
+
+              $ tput -S <<!
+              > clear
+              > cup 10 10
+              > bold
+              > !
+
+              The foregoing clears the screen, moves the  cursor  to  position
+              (10, 10) and turns on bold (extra bright) mode.
+
+       tput clear cup 10 10 bold
+              Perform the same actions as the foregoing "tput -S" example.
+
+
+

SEE ALSO

+       clear(1), stty(1), tabs(1), tset(1), curs_termcap(3x), terminfo(5)
+
+
+
+ncurses 6.5                       2024-09-14                           tput(1)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/tset.1.html b/contrib/ncurses/doc/html/man/tset.1.html new file mode 100644 index 00000000..cbec400c --- /dev/null +++ b/contrib/ncurses/doc/html/man/tset.1.html @@ -0,0 +1,421 @@ + + + + + + +tset 1 2024-06-08 ncurses 6.5 User commands + + + + +

tset 1 2024-06-08 ncurses 6.5 User commands

+
+tset(1)                          User commands                         tset(1)
+
+
+
+
+

NAME

+       tset, reset - initialize or reset terminal state
+
+
+

SYNOPSIS

+       tset  [-IQVcqrsw]  [-]  [-e ch] [-i ch] [-k ch] [-m mapping] [terminal-
+       type]
+       reset [-IQVcqrsw] [-] [-e ch] [-i ch] [-k ch] [-m  mapping]  [terminal-
+       type]
+
+
+

DESCRIPTION

+
+

tset -- initialization

+       This program initializes terminals.
+
+       First,  tset  retrieves  the  current  terminal  mode settings for your
+       terminal.  It does this by successively testing
+
+       o   the standard error,
+
+       o   standard output,
+
+       o   standard input and
+
+       o   ultimately "/dev/tty"
+
+       to obtain terminal settings.  Having  retrieved  these  settings,  tset
+       remembers which file descriptor to use when updating settings.
+
+       Next,  tset  determines  the type of terminal that you are using.  This
+       determination is done as follows, using the first terminal type found.
+
+       1. The terminal argument specified on the command line.
+
+       2. The value of the TERM environment variable.
+
+       3. (BSD systems only.) The terminal type associated with  the  standard
+       error  output  device  in  the  /etc/ttys file.  (On System V hosts and
+       systems using that convention, getty(8) does this job by  setting  TERM
+       according to the type passed to it by /etc/inittab.)
+
+       4.  The  default  terminal  type, "unknown", is not suitable for curses
+       applications.
+
+       If the terminal type was not specified  on  the  command-line,  the  -m
+       option  mappings  are  then  applied;  see  subsection  "Terminal  Type
+       Mapping".  Then, if the terminal  type  begins  with  a  question  mark
+       ("?"),  the user is prompted for confirmation of the terminal type.  An
+       empty response confirms the type, or, another type can  be  entered  to
+       specify  a  new  type.  Once the terminal type has been determined, the
+       terminal description for the terminal is  retrieved.   If  no  terminal
+       description  is  found  for  the type, the user is prompted for another
+       terminal type.
+
+       Once the terminal description is retrieved,
+
+       o   if the "-w" option is  enabled,  tset  may  update  the  terminal's
+           window size.
+
+           If  the  window  size cannot be obtained from the operating system,
+           but the terminal  description  (or  environment,  e.g.,  LINES  and
+           COLUMNS  variables  specify  this),  use  this to set the operating
+           system's notion of the window size.
+
+       o   if the "-c" option is enabled, the backspace,  interrupt  and  line
+           kill characters (among many other things) are set
+
+       o   unless   the   "-I"   option  is  enabled,  the  terminal  and  tab
+           initialization strings are sent to the standard error output,  and,
+           if  the  terminal device does not appear to be a pseudoterminal (as
+           might be used by a  terminal  emulator  program),  tset  waits  one
+           second in case a hardware reset was issued.
+
+       o   Finally,  if  the  erase,  interrupt  and line kill characters have
+           changed, or are not set to their default values, their  values  are
+           displayed to the standard error output.
+
+
+

reset -- reinitialization

+       When invoked as reset, tset sets the terminal modes to "sane" values:
+
+       o   sets cooked and echo modes,
+
+       o   turns off cbreak and raw modes,
+
+       o   turns on newline translation and
+
+       o   resets any unset special characters to their default values
+
+       before doing the terminal initialization described above.  Also, rather
+       than using the terminal initialization strings, it  uses  the  terminal
+       reset strings.
+
+       The  reset command is useful after a program dies leaving a terminal in
+       an abnormal state:
+
+       o   you may have to type
+
+               <LF>reset<LF>
+
+           (the line-feed character is normally control-J) to get the terminal
+           to  work,  as  carriage-return  may  no longer work in the abnormal
+           state.
+
+       o   Also, the terminal will often not echo the command.
+
+
+

Setting the Environment

+       It is often desirable to enter the terminal type and information  about
+       the terminal's capabilities into the shell's environment.  This is done
+       using the -s option.
+
+       When the -s option is specified, the commands to enter the  information
+       into  the  shell's  environment are written to the standard output.  If
+       the SHELL environment variable ends in  "csh",  the  commands  are  for
+       csh(1),  otherwise, they are for sh(1).  The csh commands set and unset
+       the shell variable noglob, leaving it unset.  The following line in the
+       .login or .profile files will initialize the environment correctly:
+
+           eval `tset -s options ... `
+
+
+

Terminal Type Mapping

+       When  the  terminal  is  not  hardwired into the system (or the current
+       system information is incorrect) the terminal  type  derived  from  the
+       /etc/ttys  file  or  the  TERM  environment variable is often something
+       generic like network, dialup, or unknown.   When  tset  is  used  in  a
+       startup  script  it is often desirable to provide information about the
+       type of terminal used on such ports.
+
+       The -m options maps from some set of conditions  to  a  terminal  type,
+       that is, to tell tset "If I'm on this port at a particular speed, guess
+       that I'm on that kind of terminal".
+
+       The argument to the -m option consists of an  optional  port  type,  an
+       optional  operator,  an  optional  baud rate specification, an optional
+       colon (":") character and a terminal type.  The port type is  a  string
+       (delimited  by  either  the  operator  or  the  colon  character).  The
+       operator may be any combination of ">", "<", "@", and  "!";  ">"  means
+       greater  than,  "<" means less than, "@" means equal to and "!" inverts
+       the sense of the test.  The baud rate is specified as a number  and  is
+       compared  with  the speed of the standard error output (which should be
+       the control terminal).  The terminal type is a string.
+
+       If the terminal type is not specified  on  the  command  line,  the  -m
+       mappings  are  applied to the terminal type.  If the port type and baud
+       rate match the mapping, the terminal  type  specified  in  the  mapping
+       replaces  the current type.  If more than one mapping is specified, the
+       first applicable mapping is used.
+
+       For example, consider the following  mapping:  dialup>9600:vt100.   The
+       port type is dialup , the operator is >, the baud rate specification is
+       9600, and the terminal type is vt100.  The result of this mapping is to
+       specify  that  if  the  terminal  type  is dialup, and the baud rate is
+       greater than 9600 baud, a terminal type of vt100 will be used.
+
+       If no baud rate is specified, the terminal type  will  match  any  baud
+       rate.   If  no port type is specified, the terminal type will match any
+       port type.  For example, -m dialup:vt100  -m  :?xterm  will  cause  any
+       dialup port, regardless of baud rate, to match the terminal type vt100,
+       and any non-dialup port type to match the terminal type ?xterm.   Note,
+       because  of  the  leading  question mark, the user will be queried on a
+       default port as to whether they are actually using an xterm terminal.
+
+       No whitespace characters are  permitted  in  the  -m  option  argument.
+       Also,  to avoid problems with meta-characters, it is suggested that the
+       entire -m option argument be placed within single quote characters, and
+       that   csh   users  insert  a  backslash  character  ("\")  before  any
+       exclamation marks ("!").
+
+
+

OPTIONS

+       The options are as follows:
+
+       -c   Set control characters and modes.
+
+       -e ch
+            Set the erase character to ch.
+
+       -I   Do not send the terminal or  tab  initialization  strings  to  the
+            terminal.
+
+       -i ch
+            Set the interrupt character to ch.
+
+       -k ch
+            Set the line kill character to ch.
+
+       -m mapping
+            Specify  a  mapping from a port type to a terminal; see subsection
+            "Terminal Type Mapping".
+
+       -Q   Do not display any values for the erase, interrupt and  line  kill
+            characters.    Normally  tset  displays  the  values  for  control
+            characters which differ from the system's default values.
+
+       -q   The terminal type is displayed to the  standard  output,  and  the
+            terminal  is not initialized in any way.  The option "-" by itself
+            is equivalent but archaic.
+
+       -r   Print the terminal type to the standard error output.
+
+       -s   Print the sequence of shell commands to initialize the environment
+            variable  TERM to the standard output; see subsection "Setting the
+            Environment".
+
+       -V   reports the version of ncurses which was used in this program, and
+            exits.
+
+       -w   Resize  the  window  to  match the size deduced via setupterm(3x).
+            Normally this has no effect,  unless  setupterm  is  not  able  to
+            detect the window size.
+
+       The  arguments  for the -e, -i, and -k options may either be entered as
+       actual characters or by using the "hat" notation, i.e.,  control-h  may
+       be specified as "^H" or "^h".
+
+       If neither -c or -w is given, both options are assumed.
+
+
+

ENVIRONMENT

+       The tset command uses these environment variables:
+
+       SHELL
+            tells  tset  whether  to  initialize  TERM  using  sh(1) or csh(1)
+            syntax.
+
+       TERM Denotes your terminal  type.   Each  terminal  type  is  distinct,
+            though many are similar.
+
+       TERMCAP
+            may  denote  the  location of a termcap database.  If it is not an
+            absolute pathname, e.g., begins  with  a  "/",  tset  removes  the
+            variable  from  the  environment  before  looking for the terminal
+            description.
+
+
+

FILES

+       /etc/ttys
+              system port name to terminal type mapping database (BSD versions
+              only).
+
+       /usr/share/terminfo
+              compiled terminal description database directory
+
+
+

PORTABILITY

+       Neither  IEEE  Std  1003.1/The  Open  Group Base Specifications Issue 7
+       (POSIX.1-2008) nor X/Open Curses Issue 7 documents tset or reset.
+
+       The AT&T tput utility (AIX, HP-UX, Solaris) incorporated the  terminal-
+       mode  manipulation  as well as termcap-based features such as resetting
+       tabstops from tset in BSD (4.1c),  presumably  with  the  intention  of
+       making  tset  obsolete.   However, each of those systems still provides
+       tset.  In fact, the commonly-used reset utility is always an alias  for
+       tset.
+
+       The tset utility provides backward compatibility with BSD environments;
+       under most modern  Unices,  /etc/inittab  and  getty(8)  can  set  TERM
+       appropriately  for  each  dial-up  line, obviating what was tset's most
+       important use.  This implementation behaves like 4.4BSD  tset,  with  a
+       few exceptions we shall consider now.
+
+       A  few  options are different because the TERMCAP variable is no longer
+       supported under terminfo-based ncurses:
+
+       o   The -S option of BSD tset no  longer  works;  it  prints  an  error
+           message to the standard error and dies.
+
+       o   The -s option only sets TERM, not TERMCAP.
+
+       There  was an undocumented 4.4BSD feature that invoking tset via a link
+       named "TSET" (or via  any  other  name  beginning  with  an  upper-case
+       letter) set the terminal to use upper-case only.  This feature has been
+       omitted.
+
+       The -A, -E, -h, -u and -v options were deleted from the tset utility in
+       4.4BSD.   None of them were documented in 4.3BSD and all are of limited
+       utility at best.   The  -a,  -d,  and  -p  options  are  similarly  not
+       documented  or  useful,  but  were  retained  as  they  appear to be in
+       widespread use.  It is strongly recommended that  any  usage  of  these
+       three options be changed to use the -m option instead.  The -a, -d, and
+       -p options are therefore omitted from the usage summary above.
+
+       Very old systems, e.g., 3BSD, used a different  terminal  driver  which
+       was  replaced  in  4BSD in the early 1980s.  To accommodate these older
+       systems, the 4BSD tset provided a -n option to  specify  that  the  new
+       terminal  driver  should be used.  This implementation does not provide
+       that choice.
+
+       It is still permissible to specify the -e, -i, and -k  options  without
+       arguments, although it is strongly recommended that such usage be fixed
+       to explicitly specify the character.
+
+       As of 4.4BSD, executing tset as reset no longer implies the -Q  option.
+       Also, the interaction between the - option and the terminal argument in
+       some historic implementations of tset has been removed.
+
+       The -c and  -w  options  are  not  found  in  earlier  implementations.
+       However, a different window size-change feature was provided in 4.4BSD.
+
+       o   In  4.4BSD,  tset uses the window size from the termcap description
+           to set the window size if tset is not able  to  obtain  the  window
+           size from the operating system.
+
+       o   In ncurses, tset obtains the window size using setupterm(3x), which
+           may be from the operating system, the LINES and COLUMNS environment
+           variables or the terminal description.
+
+       Obtaining  the window size from a terminal's type description is common
+       to  both  implementations,  but  considered  obsolescent.    Its   only
+       practical  use  is  for hardware terminals.  Generally, the window size
+       will remain uninitialized only if there were a  problem  obtaining  the
+       value  from the operating system (and setupterm would still fail).  The
+       LINES and COLUMNS environment variables may thus be useful for  working
+       around  window-size  problems, but have the drawback that if the window
+       is resized, their  values  must  be  recomputed  and  reassigned.   The
+       resize(1) program distributed with xterm(1) assists this activity.
+
+
+

HISTORY

+       A  reset  command written by Kurt Shoens appeared in 1BSD (March 1978).
+       It  set  the  erase  and  kill  characters  to  ^H  (backspace)  and  @
+       respectively.   Mark Horton improved this reset in 3BSD (October 1979),
+       adding intr, quit, start/stop, and eof characters as well  as  changing
+       the  program  to  avoid  modifying  any user settings.  That version of
+       reset did not use termcap.
+
+       Eric Allman wrote a distinct tset command for 1BSD, using a  forerunner
+       of  termcap  called  ttycap.   Allman's  comments  in  the  source code
+       indicate that he began work in  October  1977,  continuing  development
+       over  the next few years.  By late 1979, it had migrated to termcap and
+       handled the TERMCAP variable.  Later comments indicate  that  tset  was
+       modified  in  September  1980 to use logic copied from the 3BSD "reset"
+       program when it  was  invoked  as  reset.   This  version  appeared  in
+       4.1cBSD,  late  in 1982.  Other developers such as Keith Bostic and Jim
+       Bloom continued to modify tset until 4.4BSD was released in 1993.
+
+       The ncurses implementation was lightly adapted from the 4.4BSD  sources
+       to use the terminfo API by Eric S. Raymond <esr@snark.thyrsus.com>.
+
+
+

SEE ALSO

+       csh(1),   sh(1),   stty(1),   curs_terminfo(3x),  tty(4),  terminfo(5),
+       ttys(5), environ(7)
+
+
+
+ncurses 6.5                       2024-06-08                           tset(1)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/user_caps.5.html b/contrib/ncurses/doc/html/man/user_caps.5.html new file mode 100644 index 00000000..61e2de80 --- /dev/null +++ b/contrib/ncurses/doc/html/man/user_caps.5.html @@ -0,0 +1,425 @@ + + + + + + +user_caps 5 2024-06-08 ncurses 6.5 File formats + + + + +

user_caps 5 2024-06-08 ncurses 6.5 File formats

+
+user_caps(5)                     File formats                     user_caps(5)
+
+
+
+
+

NAME

+       user_caps - user-defined terminfo capability format
+
+
+

SYNOPSIS

+       infocmp -x
+
+       tic -x
+
+
+

DESCRIPTION

+
+

Background

+       Before  ncurses  5.0,  terminfo  databases  used  a fixed repertoire of
+       terminal capabilities designed for the SVr2 terminal database in  1984,
+       and  extended in stages through SVr4 (1989), and standardized in X/Open
+       Curses starting in 1995.
+
+       Most of the extensions in this fixed repertoire were additions  to  the
+       tables of Boolean, numeric and string capabilities.  Rather than change
+       the meaning of an existing capability,  a  new  name  was  added.   The
+       terminfo  database  uses  a  binary  format;  binary  compatibility was
+       ensured by using a header which gave the number of items in the  tables
+       for each type of capability.  The standardization was incomplete:
+
+       o   The  binary  format  itself  is  not described in the X/Open Curses
+           documentation.  Only the source format is described.
+
+           Library developers rely upon the SVr4 documentation,  and  reverse-
+           engineering the compiled terminfo files to match the binary format.
+
+       o   Lacking a standard for the binary format, most implementations copy
+           the SVr2 binary format, which uses 16-bit signed integers,  and  is
+           limited to 4096-byte entries.
+
+           The  format  cannot  represent very large numeric capabilities, nor
+           can it represent large numbers of special keyboard definitions.
+
+       o   The tables of capability names differ between implementations.
+
+           Although they may provide all of the standard capability names, the
+           position  in the tables differs because some features were added as
+           needed, while others were added  (out  of  order)  to  comply  with
+           X/Open Curses.
+
+           While  ncurses' repertoire of predefined capabilities is closest to
+           Solaris, Solaris's terminfo database has a few differences from the
+           list  published  by  X/Open  Curses.   For  example, ncurses can be
+           configured with tables which match the terminal databases for  AIX,
+           HP-UX or OSF/1, rather than the default Solaris-like configuration.
+
+       o   In  SVr4  curses  and  ncurses, the terminal database is defined at
+           compile-time using a text file which lists the  different  terminal
+           capabilities.
+
+           In  principle,  the  text-file  can  be  extended,  but  doing this
+           requires recompiling and reinstalling the library.   The  text-file
+           used  in  ncurses  for  terminal  capabilities includes details for
+           various systems past the documented X/Open  Curses  features.   For
+           example, ncurses supports these capabilities in each configuration:
+
+               memory_lock
+                    (meml) lock memory above cursor
+
+               memory_unlock
+                    (memu) unlock memory
+
+               box_chars_1
+                    (box1) box characters primary set
+
+           The memory lock/unlock capabilities were included because they were
+           used in the X11R6 terminal  description  for  xterm(1).   The  box1
+           capability  is  used  in  tic  to  help  with terminal descriptions
+           written for AIX.
+
+       During the 1990s, some users were reluctant to use terminfo in spite of
+       its performance advantages over termcap:
+
+       o   The  fixed  repertoire  prevented  users  from  adding features for
+           unanticipated terminal improvements  (or  required  them  to  reuse
+           existing capabilities as a workaround).
+
+       o   The  limitation  to  16-bit  signed  integers  was  also mentioned.
+           Because termcap stores everything as a string, it  could  represent
+           larger numbers.
+
+       Although  termcap's  extensibility  was  rarely  used (it was never the
+       speaker who had actually used the feature), the criticism had a  point.
+       ncurses   5.0  provided  a  way  to  detect  nonstandard  capabilities,
+       determine their type and optionally store and retrieve them  in  a  way
+       which did not interfere with other applications.  These are referred to
+       as user-defined capabilities because no modifications to the  toolset's
+       predefined capability names are needed.
+
+       The  ncurses  utilities tic and infocmp have a command-line option "-x"
+       to  control  whether  the  nonstandard  capabilities  are   stored   or
+       retrieved.   A  library function use_extended_names is provided for the
+       same purpose.
+
+       When compiling a terminal database, if "-x" is set, tic  will  store  a
+       user-defined  capability  if  the  capability  name  is  not one of the
+       predefined names.
+
+       Because ncurses provides  a  termcap  library  interface,  these  user-
+       defined capabilities may be visible to termcap applications:
+
+       o   The   termcap  interface  (like  all  implementations  of  termcap)
+           requires that the capability names are 2-characters.
+
+           When  the  capability  is  simple  enough  for  use  in  a  termcap
+           application, it is provided as a 2-character name.
+
+       o   There  are  other user-defined capabilities which refer to features
+           not usable in termcap, e.g., parameterized strings  that  use  more
+           than two parameters or use more than the trivial expression support
+           provided by termcap.  For these, the terminfo database should  have
+           only capability names with 3 or more characters.
+
+       o   Some terminals can send distinct strings for special keys (cursor-,
+           keypad-  or  function-keys)  depending  on  modifier  keys  (shift,
+           control,  etc.).   While  terminfo  and  termcap  have  a set of 60
+           predefined function-key names, to which a series  of  keys  can  be
+           assigned,   that  is  insufficient  for  more  than  a  dozen  keys
+           multiplied by more than a couple  of  modifier  combinations.   The
+           ncurses  database  uses  a  convention based on xterm(1) to provide
+           extended special-key names.
+
+           Fitting that into termcap's limitation of 2-character  names  would
+           be   pointless.   These  extended  keys  are  available  only  with
+           terminfo.
+
+
+

Recognized Capabilities

+       The ncurses library uses the user-definable  capabilities.   While  the
+       terminfo  database  may  have  other extensions, ncurses makes explicit
+       checks for these:
+
+          AX Boolean, asserts that the terminal interprets SGR 39 and  SGR  49
+             by  resetting  the foreground and background color, respectively,
+             to the default.
+
+             This is a feature recognized by the screen program as well.
+
+          E3 string, tells how to  clear  the  terminal's  scrollback  buffer.
+             When present, the clear(1) program sends this before clearing the
+             terminal.
+
+             The command "tput clear" does the same thing.
+
+          NQ Boolean, used to suppress a consistency  check  in  tic  for  the
+             ncurses  capabilities  in user6 through user9 (u6, u7, u8 and u9)
+             which tell how to query the terminal's cursor  position  and  its
+             device attributes.
+
+          RGB
+             Boolean,   number   or   string,   used   to   assert   that  the
+             set_a_foreground and set_a_background capabilities correspond  to
+             direct  colors,  using  an RGB (red/green/blue) convention.  This
+             capability  allows   the   color_content   function   to   return
+             appropriate   values   without   requiring   the  application  to
+             initialize colors using init_color.
+
+             The capability type determines the values which ncurses sees:
+
+             Boolean
+                implies that the number of bits for red, green  and  blue  are
+                the  same.   Using  the maximum number of colors, ncurses adds
+                two, divides that sum by three, and assigns the result to red,
+                green and blue in that order.
+
+                If the number of bits needed for the number of colors is not a
+                multiple of three, the blue (and  green)  components  lose  in
+                comparison to red.
+
+             number
+                tells  ncurses  what result to add to red, green and blue.  If
+                ncurses runs out of bits, blue (and green) lose just as in the
+                Boolean case.
+
+             string
+                explicitly  list  the  number  of bits used for red, green and
+                blue components as a slash-separated list of decimal integers.
+
+             Because there are several  RGB  encodings  in  use,  applications
+             which  make  assumptions  about  the number of bits per color are
+             unlikely to work reliably.  As a trivial case, for  example,  one
+             could  define  RGB#1 to represent the standard eight ANSI colors,
+             i.e., one bit per color.
+
+          U8 number, asserts that ncurses must use Unicode  values  for  line-
+             drawing  characters,  and  that  it  should  ignore the alternate
+             character set capabilities when the locale uses  UTF-8  encoding.
+             For  more  information, see the discussion of NCURSES_NO_UTF8_ACS
+             in ncurses(3x).
+
+             Set this capability to a nonzero value to enable it.
+
+          XM string, override ncurses's built-in string which enables/disables
+             xterm(1) mouse mode.
+
+             ncurses  sends a character sequence to the terminal to initialize
+             mouse mode, and when the user clicks the  mouse  buttons  or  (in
+             certain  modes) moves the mouse, handles the characters sent back
+             by the terminal to tell it what was done with the mouse.
+
+             The mouse protocol  is  enabled  when  the  mask  passed  in  the
+             mousemask  function  is nonzero.  By default, ncurses handles the
+             responses for the X11 xterm mouse protocol.  It also knows  about
+             the  SGR  1006  xterm mouse protocol, but must to be told to look
+             for this specifically.  It will not be able to guess  which  mode
+             is  used,  because  the  responses  are  enough  alike  that only
+             confusion would result.
+
+             The XM capability has a single parameter.  If nonzero, the  mouse
+             protocol  should  be enabled.  If zero, the mouse protocol should
+             be disabled.  ncurses inspects this capability if it is  present,
+             to  see whether the 1006 protocol is used.  If so, it expects the
+             responses to use the SGR 1006 xterm mouse protocol.
+
+             The xterm mouse protocol is used  by  other  terminal  emulators.
+             The  terminal database uses building-blocks for the various xterm
+             mouse  protocols  which  can  be  used  in  customized   terminal
+             descriptions.
+
+             The terminal database building blocks for this mouse feature also
+             have  an  experimental  capability  xm.   The   "xm"   capability
+             describes  the mouse response.  Currently there is no interpreter
+             which would use  this  information  to  make  the  mouse  support
+             completely data-driven.
+
+             xm shows the format of the mouse responses.  In this experimental
+             capability, the parameters are
+
+               p1   y-ordinate
+
+               p2   x-ordinate
+
+               p3   button
+
+               p4   state, e.g., pressed or released
+
+               p5   y-ordinate starting region
+
+               p6   x-ordinate starting region
+
+               p7   y-ordinate ending region
+
+               p8   x-ordinate ending region
+
+             Here are  examples  from  the  terminal  database  for  the  most
+             commonly used xterm mouse protocols:
+
+               xterm+x11mouse|X11 xterm mouse protocol,
+                       kmous=\E[M, XM=\E[?1000%?%p1%{1}%=%th%el%;,
+                       xm=\E[M
+                          %?%p4%t%p3%e%{3}%;%' '%+%c
+                          %p2%'!'%+%c
+                          %p1%'!'%+%c,
+
+               xterm+sm+1006|xterm SGR-mouse,
+                       kmous=\E[<, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;,
+                       xm=\E[<%i%p3%d;
+                          %p1%d;
+                          %p2%d;
+                          %?%p4%tM%em%;,
+
+
+

Extended Key Definitions

+       Several  terminals  provide  the  ability  to send distinct strings for
+       combinations of modified special keys.  There is no standard  for  what
+       those keys can send.
+
+       Since  1999,  xterm(1)  has  supported  shift,  control,  alt, and meta
+       modifiers which produce distinct special-key strings.   In  a  terminal
+       description,  ncurses  has  no special knowledge of the modifiers used.
+       Applications can use the naming convention  established  for  xterm  to
+       find these special keys in the terminal description.
+
+       Starting  with  the  curses convention that capability codes describing
+       the input generated by a terminal's key caps begin with "k",  and  that
+       shifted  special  keys  use uppercase letters in their names, ncurses's
+       terminal database defines the following names  and  codes  to  which  a
+       suffix is added.
+
+            Code   Description
+            -------------------------------------------------------------------
+            kDC    shifted kdch1 (delete character)
+            kDN    shifted kcud1 (cursor down)
+            kEND   shifted kend (end)
+            kHOM   shifted khome (home)
+            kLFT   shifted kcub1 (cursor back)
+            kNXT   shifted knext (next)
+            kPRV   shifted kprev (previous)
+            kRIT   shifted kcuf1 (cursor forward)
+            kUP    shifted kcuu1 (cursor up)
+
+       Keycap  nomenclature on the Unix systems for which curses was developed
+       differs from today's ubiquitous descendants of the IBM  PC/AT  keyboard
+       layout.  In the foregoing, interpret "backward" as "left", "forward" as
+       "right", "next" as "page down", and "prev(ious)" as "page up".
+
+       These are the suffixes used to denote the modifiers:
+
+            Value   Description
+            ----------------------------------
+            2       Shift
+            3       Alt
+            4       Shift + Alt
+            5       Control
+            6       Shift + Control
+            7       Alt + Control
+            8       Shift + Alt + Control
+            9       Meta
+            10      Meta + Shift
+            11      Meta + Alt
+            12      Meta + Alt + Shift
+            13      Meta + Ctrl
+            14      Meta + Ctrl + Shift
+            15      Meta + Ctrl + Alt
+            16      Meta + Ctrl + Alt + Shift
+
+       None of these are predefined; terminal descriptions can refer to  names
+       which ncurses will allocate at runtime to key-codes.  To use these keys
+       in an ncurses program, an application could do this:
+
+       o   using a list of extended key  names,  ask  tigetstr(3x)  for  their
+           values, and
+
+       o   given  the  list  of  values,  ask key_defined(3x) for the key-code
+           which would be returned for those keys by wgetch(3x).
+
+
+

PORTABILITY

+       The "-x" extension feature of tic  and  infocmp  has  been  adopted  in
+       NetBSD  curses.   That implementation stores user-defined capabilities,
+       but makes no use of these capabilities itself.
+
+
+

AUTHORS

+       Thomas E. Dickey
+       beginning with ncurses 5.0 (1999)
+
+
+

SEE ALSO

+       infocmp(1m), tic(1m)
+
+       The  terminal  database  section  NCURSES  USER-DEFINABLE  CAPABILITIES
+       summarizes  commonly-used  user-defined  capabilities which are used in
+       the terminal descriptions.  Some of those  features  are  mentioned  in
+       screen(1) or tmux(1).
+
+       XTerm  Control  Sequences  provides further information on the xterm(1)
+       features that are used in these extended capabilities.
+
+
+
+ncurses 6.5                       2024-06-08                      user_caps(5)
+
+ + + diff --git a/contrib/ncurses/doc/html/man/wresize.3x.html b/contrib/ncurses/doc/html/man/wresize.3x.html new file mode 100644 index 00000000..047b853f --- /dev/null +++ b/contrib/ncurses/doc/html/man/wresize.3x.html @@ -0,0 +1,129 @@ + + + + + + +wresize 3x 2024-09-21 ncurses 6.5 Library calls + + + + +

wresize 3x 2024-09-21 ncurses 6.5 Library calls

+
+wresize(3x)                      Library calls                     wresize(3x)
+
+
+
+
+

NAME

+       wresize - resize a curses window
+
+
+

SYNOPSIS

+       #include <curses.h>
+
+       int wresize(WINDOW * win, int lines, int columns);
+
+
+

DESCRIPTION

+       wresize,  an  ncurses  extension  to  the  curses  library, reallocates
+       storage for win, adjusting its dimensions to  lines  and  columns.   If
+       either dimension is larger than its current value, ncurses the expanded
+       part of the window is filled with blanks merged with current background
+       rendition  (configured  by  wbkgdset(3x),  or  by  wide-character  API:
+       wbkgrndset(3x)).
+
+
+

RETURN VALUE

+       wresize returns OK on success and ERR on failure.  It fails  if  either
+       lines  or  columns is less than or equal to zero, or if an error occurs
+       while (re)allocating memory for win.
+
+
+

NOTES

+       The only restriction placed on the values of lines and columns is  that
+       they  be greater than zero.  They are not compared to the dimensions of
+       the curses screen; this keeps the logic of resizeterm(3x) simple.   The
+       caller  must  ensure  that  win's  dimensions  fit  within those of the
+       screen.
+
+
+

EXTENSIONS

+       wresize is an ncurses(3x) extension, and is not found in  SVr4  curses,
+       4.4BSD curses, or any other previous curses implementation.
+
+
+

PORTABILITY

+       Applications employing ncurses extensions should condition their use on
+       the visibility of the NCURSES_VERSION preprocessor macro.
+
+       NetBSD curses adopted wresize in 2001 (release 1.5.3), and PDCurses  in
+       2004 (version 2.7).
+
+       It is not possible to resize windows with SVr4 curses.
+
+
+

HISTORY

+       Thomas  Dickey developed wresize as an extension to BSD curses in 1988,
+       and brought it to ncurses in mid-1995.
+
+
+

AUTHORS

+       Thomas Dickey
+
+
+

SEE ALSO

+       resizeterm(3x)
+
+
+
+ncurses 6.5                       2024-09-21                       wresize(3x)
+
+ + + diff --git a/contrib/ncurses/doc/html/ncurses-intro.html b/contrib/ncurses/doc/html/ncurses-intro.html new file mode 100644 index 00000000..d07f6f25 --- /dev/null +++ b/contrib/ncurses/doc/html/ncurses-intro.html @@ -0,0 +1,3390 @@ + + + + + + Writing Programs with NCURSES + + + + +

Writing Programs with NCURSES

+ +

Writing Programs with NCURSES

+ +
+ by Eric S. Raymond and Zeyd M. Ben-Halim
+ updates since release 1.9.9e by Thomas Dickey +
+ + + +
+ +

Introduction

+ +

This document is an introduction to programming with + curses. It is not an exhaustive reference for the + curses Application Programming Interface (API); that role is + filled by the curses manual pages. Rather, it is + intended to help C programmers ease into using the package.

+ +

This document is aimed at C applications programmers not yet + specifically familiar with ncurses. If you are already an + experienced curses programmer, you should + nevertheless read the sections on Mouse + Interfacing, Debugging, Compatibility with Older Versions, and Hints, Tips, and Tricks. These will bring you up to + speed on the special features and quirks of the + ncurses implementation. If you are not so + experienced, keep reading.

+ +

The curses package is a subroutine library for + terminal-independent screen-painting and input-event handling + which presents a high level screen model to the programmer, + hiding differences between terminal types and doing automatic + optimization of output to change one screen full of text into + another. Curses uses terminfo, which is a database + format that can describe the capabilities of thousands of + different terminals.

+ +

The curses API may seem something of an archaism + on UNIX desktops increasingly dominated by X, Motif, and Tcl/Tk. + Nevertheless, UNIX still supports tty lines and X supports + xterm(1); the curses API has the advantage + of (a) back-portability to character-cell terminals, and (b) + simplicity. For an application that does not require bit-mapped + graphics and multiple fonts, an interface implementation using + curses will typically be a great deal simpler and + less expensive than one using an X toolkit.

+ +

A Brief History of Curses

+ +

Historically, the first ancestor of curses was + the routines written to provide screen-handling for the + vi editor; these used the termcap + database facility (both released in 3BSD) for describing terminal + capabilities. These routines were abstracted into a documented + library and first released with the early BSD UNIX versions. All + of this work was done by students at the University of California + (Berkeley campus). The curses library was first published in + 4.0BSD, a year after 3BSD (i.e., late 1980).

+ +

After graduation, one of those students went to work at + AT&T Bell Labs, and made an improved termcap + library called terminfo (i.e., + “libterm”), and adapted the curses library to use + this. That was subsequently released in System V Release 2 (early + 1984). Thereafter, other developers added to the curses and + terminfo libraries. For instance, a student at Cornell University + wrote an improved terminfo library as well as a tool + (tic) to compile the terminal descriptions. As a + general rule, AT&T did not identify the developers in the + source-code or documentation; the tic and + infocmp programs are the exceptions.

+ +

System V Release 3 from Bell Labs featured a rewritten and + much-improved curses library, along with the + tic program (late 1986).

+ +

To recap, terminfo is based on Berkeley's termcap database, + but contains a number of improvements and extensions. + Parameterized capabilities strings were introduced, making it + possible to describe multiple video attributes, and colors and to + handle far more unusual terminals than possible with termcap. In + the later AT&T System V releases, curses evolved + to use more facilities and offer more capabilities, going far + beyond BSD curses in power and flexibility.

+ +

Scope of This Document

+ +

This document describes ncurses, a free + implementation of the System V curses API with some + clearly marked extensions. It includes the following System V + curses features:

+ +
    +
  • Support for multiple screen highlights (BSD curses could + only handle one “standout” highlight, usually + reverse-video).
  • + +
  • Support for line- and box-drawing using forms + characters.
  • + +
  • Recognition of function keys on input.
  • + +
  • Color support.
  • + +
  • Support for pads (windows of larger than screen size on + which the screen or a subwindow defines a viewport).
  • +
+ +

Also, this package makes use of the insert and delete line and + character features of terminals so equipped, and determines how + to optimally use these features with no help from the programmer. + It allows arbitrary combinations of video attributes to be + displayed, even on terminals that leave “magic + cookies” on the screen to mark changes in attributes.

+ +

The ncurses package can also capture and use + event reports from a mouse in some environments (notably, xterm + under the X window system). This document includes tips for using + the mouse.

+ +

The ncurses package was originated by Pavel + Curtis. The original maintainer of this package is Zeyd Ben-Halim + <zmbenhal@netcom.com>. Eric S. Raymond + <esr@snark.thyrsus.com> wrote many of the new features in + versions after 1.8.1 and wrote most of this introduction. + Jürgen Pfeifer wrote all of the menu and forms code as well + as the Ada95 binding. + Ongoing work is being done by Thomas Dickey + (maintainer). Contact the current maintainers at bug-ncurses@gnu.org.

+ +

This document also describes the panels + extension library, similarly modeled on the SVr4 panels facility. + This library allows you to associate backing store with each of a + stack or deck of overlapping windows, and provides operations for + moving windows around in the stack that change their visibility + in the natural way (handling window overlaps).

+ +

Finally, this document describes in detail the menus and forms extension + libraries, also cloned from System V, which support easy + construction and sequences of menus and fill-in forms.

+ +

Terminology

+ +

In this document, the following terminology is used with + reasonable consistency:

+ +
+
window
+ +
A data structure describing a sub-rectangle of the screen + (possibly the entire screen). You can write to a window as + though it were a miniature screen, scrolling independently of + other windows on the physical screen.
+ +
screens
+ +
A subset of windows which are as large as the terminal + screen, i.e., they start at the upper left hand corner and + encompass the lower right hand corner. One of these, + stdscr, is automatically provided for the + programmer.
+ +
terminal screen
+ +
The package's idea of what the terminal display currently + looks like, i.e., what the user sees now. This is a special + screen.
+
+ +

The Curses Library

+ +

An Overview of Curses

+ +

Compiling Programs using + Curses

+ +

In order to use the library, it is necessary to have certain + types and variables defined. Therefore, the programmer must have + a line:

+ +
+          #include <curses.h>
+
+

at the top of the program source. The screen package uses the + Standard I/O library, so <curses.h> includes + <stdio.h>. <curses.h> also + includes <termios.h>, + <termio.h>, or <sgtty.h> + depending on your system. It is redundant (but harmless) for the + programmer to do these includes, too. In linking with + curses you need to have -lncurses in + your LDFLAGS or on the command line. There is no need for any + other libraries.

+ +

Updating the Screen

+ +

In order to update the screen optimally, it is necessary for + the routines to know what the screen currently looks like and + what the programmer wants it to look like next. For this purpose, + a data type (structure) named WINDOW is defined which describes a + window image to the routines, including its starting position on + the screen (the (y, x) coordinates of the upper left hand corner) + and its size. One of these (called curscr, for + current screen) is a screen image of what the terminal currently + looks like. Another screen (called stdscr, for + standard screen) is provided by default to make changes on.

+ +

A window is a purely internal representation. It is used to + build and store a potential image of a portion of the terminal. + It does not bear any necessary relation to what is really on the + terminal screen; it is more like a scratchpad or write + buffer.

+ +

To make the section of physical screen corresponding to a + window reflect the contents of the window structure, the routine + refresh() (or wrefresh() if the window + is not stdscr) is called.

+ +

A given physical screen section may be within the scope of any + number of overlapping windows. Also, changes can be made to + windows in any order, without regard to motion efficiency. Then, + at will, the programmer can effectively say “make it look + like this,” and let the package implementation determine + the most efficient way to repaint the screen.

+ +

Standard Windows and Function + Naming Conventions

+ +

As hinted above, the routines can use several windows, but two + are automatically given: curscr, which knows what + the terminal looks like, and stdscr, which is what + the programmer wants the terminal to look like next. The user + should never actually access curscr directly. + Changes should be made to through the API, and then the routine + refresh() (or wrefresh()) called.

+ +

Many functions are defined to use stdscr as a + default screen. For example, to add a character to + stdscr, one calls addch() with the + desired character as argument. To write to a different window. + use the routine waddch() (for + window-specific addch()) is provided. This + convention of prepending function names with a “w” + when they are to be applied to specific windows is consistent. + The only routines which do not follow it are those for which a + window must always be specified.

+ +

In order to move the current (y, x) coordinates from one point + to another, the routines move() and + wmove() are provided. However, it is often desirable + to first move and then perform some I/O operation. In order to + avoid clumsiness, most I/O routines can be preceded by the prefix + “mv” and the desired (y, x) coordinates prepended to + the arguments to the function. For example, the calls

+ +
+          move(y, x);
+          addch(ch);
+
+

can be replaced by

+ +
+          mvaddch(y, x, ch);
+
+

and

+ +
+          wmove(win, y, x);
+          waddch(win, ch);
+
+

can be replaced by

+ +
+          mvwaddch(win, y, x, ch);
+
+

Note that the window description pointer (win) comes before + the added (y, x) coordinates. If a function requires a window + pointer, it is always the first parameter passed.

+ +

Variables

+ +

The curses library sets some variables describing + the terminal capabilities.

+ +
+      type   name      description
+      ------------------------------------------------------------------
+      int    LINES     number of lines on the terminal
+      int    COLS      number of columns on the terminal
+
+

The curses.h also introduces some + #define constants and types of general + usefulness:

+ +
+
bool +
+ +
boolean type, actually a “char” (e.g., + bool doneit;)
+ +
TRUE +
+ +
boolean “true” flag (1).
+ +
FALSE +
+ +
boolean “false” flag (0).
+ +
ERR +
+ +
error flag returned by routines on a failure (-1).
+ +
OK +
+ +
error flag returned by routines when things go right.
+
+ +

Using the Library

+ +

Now we describe how to actually use the screen package. In it, + we assume all updating, reading, etc. is applied to + stdscr. These instructions will work on any window, + providing you change the function names and parameters as + mentioned above.

+ +

Here is a sample program to motivate the discussion:

+ +
+#include <stdlib.h>
+#include <curses.h>
+#include <signal.h>
+
+static void finish(int sig);
+
+int
+main(int argc, char *argv[])
+{
+    int num = 0;
+
+    /* initialize your non-curses data structures here */
+
+    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */
+
+    (void) initscr();      /* initialize the curses library */
+    keypad(stdscr, TRUE);  /* enable keyboard mapping */
+    (void) nonl();         /* tell curses not to do NL->CR/NL on output */
+    (void) cbreak();       /* take input chars one at a time, no wait for \n */
+    (void) echo();         /* echo input - in color */
+
+    if (has_colors())
+    {
+        start_color();
+
+        /*
+         * Simple color assignment, often all we need.  Color pair 0 cannot
+         * be redefined.  This example uses the same value for the color
+         * pair as for the foreground color, though of course that is not
+         * necessary:
+         */
+        init_pair(1, COLOR_RED,     COLOR_BLACK);
+        init_pair(2, COLOR_GREEN,   COLOR_BLACK);
+        init_pair(3, COLOR_YELLOW,  COLOR_BLACK);
+        init_pair(4, COLOR_BLUE,    COLOR_BLACK);
+        init_pair(5, COLOR_CYAN,    COLOR_BLACK);
+        init_pair(6, COLOR_MAGENTA, COLOR_BLACK);
+        init_pair(7, COLOR_WHITE,   COLOR_BLACK);
+    }
+
+    for (;;)
+    {
+        int c = getch();     /* refresh, accept single keystroke of input */
+        attrset(COLOR_PAIR(num % 8));
+        num++;
+
+        /* process the command keystroke */
+    }
+
+    finish(0);               /* we are done */
+}
+
+static void finish(int sig)
+{
+    endwin();
+
+    /* do your non-curses wrapup here */
+
+    exit(0);
+}
+
+

Starting up

+ +

In order to use the screen package, the routines must know + about terminal characteristics, and the space for + curscr and stdscr must be allocated. + These function initscr() does both these things. + Since it must allocate space for the windows, it can overflow + memory when attempting to do so. On the rare occasions this + happens, initscr() will terminate the program with + an error message. initscr() must always be called + before any of the routines which affect windows are used. If it + is not, the program will core dump as soon as either + curscr or stdscr are referenced. + However, it is usually best to wait to call it until after you + are sure you will need it, like after checking for startup + errors. Terminal status changing routines like nl() + and cbreak() should be called after + initscr().

+ +

Once the screen windows have been allocated, you can set them + up for your program. If you want to, say, allow a screen to + scroll, use scrollok(). If you want the cursor to be + left in place after the last change, use leaveok(). + If this is not done, refresh() will move the cursor + to the window's current (y, x) coordinates after updating it.

+ +

You can create new windows of your own using the functions + newwin(), derwin(), and + subwin(). The routine delwin() will + allow you to get rid of old windows. All the options described + above can be applied to any window.

+ +

Output

+ +

Now that we have set things up, we will want to actually + update the terminal. The basic functions used to change what will + go on a window are addch() and move(). + addch() adds a character at the current (y, x) + coordinates. move() changes the current (y, x) + coordinates to whatever you want them to be. It returns + ERR if you try to move off the window. As mentioned + above, you can combine the two into mvaddch() to do + both things at once.

+ +

The other output functions, such as addstr() and + printw(), all call addch() to add + characters to the window.

+ +

After you have put on the window what you want there, when you + want the portion of the terminal covered by the window to be made + to look like it, you must call refresh(). In order + to optimize finding changes, refresh() assumes that + any part of the window not changed since the last + refresh() of that window has not been changed on the + terminal, i.e., that you have not refreshed a portion of the + terminal with an overlapping window. If this is not the case, the + routine touchwin() is provided to make it look like + the entire window has been changed, thus making + refresh() check the whole subsection of the terminal + for changes.

+ +

If you call wrefresh() with curscr + as its argument, it will make the screen look like + curscr thinks it looks like. This is useful for + implementing a command which would redraw the screen in case it + get messed up.

+ +

Input

+ +

The complementary function to addch() is + getch() which, if echo is set, will call + addch() to echo the character. Since the screen + package needs to know what is on the terminal at all times, if + characters are to be echoed, the tty must be in raw or cbreak + mode. Since initially the terminal has echoing enabled and is in + ordinary “cooked” mode, one or the other has to + changed before calling getch(); otherwise, the + program's output will be unpredictable.

+ +

When you need to accept line-oriented input in a window, the + functions wgetstr() and friends are available. There + is even a wscanw() function that can do + scanf()(3)-style multi-field parsing on window + input. These pseudo-line-oriented functions turn on echoing while + they execute.

+ +

The example code above uses the call keypad(stdscr, + TRUE) to enable support for function-key mapping. With + this feature, the getch() code watches the input + stream for character sequences that correspond to arrow and + function keys. These sequences are returned as pseudo-character + values. The #define values returned are listed in + the curses.h The mapping from sequences to + #define values is determined by key_ + capabilities in the terminal's terminfo entry.

+ +

Using Forms + Characters

+ +

The addch() function (and some others, including + box() and border()) can accept some + pseudo-character arguments which are specially defined by + ncurses. These are #define values set + up in the curses.h header; see there for a complete + list (look for the prefix ACS_).

+ +

The most useful of the ACS defines are the forms-drawing + characters. You can use these to draw boxes and simple graphs on + the screen. If the terminal does not have such characters, + curses.h will map them to a recognizable (though + ugly) set of ASCII defaults.

+ +

Character Attributes and + Color

+ +

The ncurses package supports screen highlights + including standout, reverse-video, underline, and blink. It also + supports color, which is treated as another kind of + highlight.

+ +

Highlights are encoded, internally, as high bits of the + pseudo-character type (chtype) that + curses.h uses to represent the contents of a screen + cell. See the curses.h header file for a complete + list of highlight mask values (look for the prefix + A_).

+ +

There are two ways to make highlights. One is to logical-or + the value of the highlights you want into the character argument + of an addch() call, or any other output call that + takes a chtype argument.

+ +

The other is to set the current-highlight value. This is + logical-ORed with any highlight you specify the first + way. You do this with the functions attron(), + attroff(), and attrset(); see the + manual pages for details. Color is a special kind of highlight. + The package actually thinks in terms of color pairs, combinations + of foreground and background colors. The sample code above sets + up eight color pairs, all of the guaranteed-available colors on + black. Note that each color pair is, in effect, given the name of + its foreground color. Any other range of eight non-conflicting + values could have been used as the first arguments of the + init_pair() values.

+ +

Once you have done an init_pair() that creates + color-pair N, you can use COLOR_PAIR(N) as a + highlight that invokes that particular color combination. Note + that COLOR_PAIR(N), for constant N, is itself a + compile-time constant and can be used in initializers.

+ +

Mouse Interfacing

+ +

The ncurses library also provides a mouse + interface.

+ +
+ NOTE: this facility is specific to + ncurses, it is not part of either the XSI Curses + standard, nor of System V Release 4, nor BSD curses. System V + Release 4 curses contains code with similar interface + definitions, however it is not documented. Other than by + disassembling the library, we have no way to determine exactly + how that mouse code works. Thus, we recommend that you wrap + mouse-related code in an #ifdef using the feature macro + NCURSES_MOUSE_VERSION so it will not be compiled and linked on + non-ncurses systems. +
+ +

Presently, mouse event reporting works in the following + environments:

+ +
    +
  • xterm and similar programs such as rxvt.
  • + +
  • Linux console, when configured with gpm(1), + Alessandro Rubini's mouse server.
  • + +
  • FreeBSD sysmouse (console)
  • + +
  • OS/2 EMX
  • +
+ +

The mouse interface is very simple. To activate it, you use + the function mousemask(), passing it as first + argument a bit-mask that specifies what kinds of events you want + your program to be able to see. It will return the bit-mask of + events that actually become visible, which may differ from the + argument if the mouse device is not capable of reporting some of + the event types you specify.

+ +

Once the mouse is active, your application's command loop + should watch for a return value of KEY_MOUSE from + wgetch(). When you see this, a mouse event report + has been queued. To pick it off the queue, use the function + getmouse() (you must do this before the next + wgetch(), otherwise another mouse event might come + in and make the first one inaccessible).

+ +

Each call to getmouse() fills a structure (the + address of which you will pass it) with mouse event data. The + event data includes zero-origin, screen-relative character-cell + coordinates of the mouse pointer. It also includes an event mask. + Bits in this mask will be set, corresponding to the event type + being reported.

+ +

The mouse structure contains two additional fields which may + be significant in the future as ncurses interfaces to new kinds + of pointing device. In addition to x and y coordinates, there is + a slot for a z coordinate; this might be useful with + touch-screens that can return a pressure or duration parameter. + There is also a device ID field, which could be used to + distinguish between multiple pointing devices.

+ +

The class of visible events may be changed at any time via + mousemask(). Events that can be reported include + presses, releases, single-, double- and triple-clicks (you can + set the maximum button-down time for clicks). If you do not make + clicks visible, they will be reported as press-release pairs. In + some environments, the event mask may include bits reporting the + state of shift, alt, and ctrl keys on the keyboard during the + event.

+ +

A function to check whether a mouse event fell within a given + window is also supplied. You can use this to see whether a given + window should consider a mouse event relevant to it.

+ +

Because mouse event reporting will not be available in all + environments, it would be unwise to build ncurses + applications that require the use of a mouse. Rather, + you should use the mouse as a shortcut for point-and-shoot + commands your application would normally accept from the + keyboard. Two of the test games in the ncurses + distribution (bs and knight) contain + code that illustrates how this can be done.

+ +

See the manual page curs_mouse(3X) for full + details of the mouse-interface functions.

+ +

Finishing Up

+ +

In order to clean up after the ncurses routines, + the routine endwin() is provided. It restores tty + modes to what they were when initscr() was first + called, and moves the cursor down to the lower-left corner. Thus, + anytime after the call to initscr, endwin() should + be called before exiting.

+ +

Function Descriptions

+ +

We describe the detailed behavior of some important curses + functions here, as a supplement to the manual page + descriptions.

+ +

Initialization and Wrapup

+ +
+
initscr() +
+ +
The first function called should almost always be + initscr(). This will determine the terminal type + and initialize curses data structures. initscr() + also arranges that the first call to refresh() + will clear the screen. If an error occurs a message is written + to standard error and the program exits. Otherwise it returns a + pointer to stdscr. A few functions may be called before initscr + (slk_init(), filter(), + ripoffline(), use_env(), and, if you + are using multiple terminals, newterm().)
+ +
endwin() +
+ +
Your program should always call endwin() + before exiting or shelling out of the program. This function + will restore tty modes, move the cursor to the lower left + corner of the screen, reset the terminal into the proper + non-visual mode. Calling refresh() or + doupdate() after a temporary escape from the + program will restore the ncurses screen from before the + escape.
+ +
newterm(type, ofp, ifp) +
+ +
A program which outputs to more than one terminal should + use newterm() instead of initscr(). + newterm() should be called once for each terminal. + It returns a variable of type SCREEN * which + should be saved as a reference to that terminal. (NOTE: a + SCREEN variable is not a screen in the sense we are + describing in this introduction, but a collection of parameters + used to assist in optimizing the display.) The arguments are + the type of the terminal (a string) and FILE + pointers for the output and input of the terminal. If type is + NULL then the environment variable $TERM is used. + endwin() should called once at wrapup time for + each terminal opened using this function.
+ +
set_term(new) +
+ +
This function is used to switch to a different terminal + previously opened by newterm(). The screen + reference for the new terminal is passed as the parameter. The + previous terminal is returned by the function. All other calls + affect only the current terminal.
+ +
delscreen(sp) +
+ +
The inverse of newterm(); deallocates the data + structures associated with a given SCREEN + reference.
+
+ +

Causing Output to the Terminal

+ +
+
refresh() and wrefresh(win)
+ +
These functions must be called to actually get any output + on the terminal, as other routines merely manipulate data + structures. wrefresh() copies the named window to + the physical terminal screen, taking into account what is + already there in order to do optimizations. + refresh() does a refresh of stdscr. + Unless leaveok() has been enabled, the physical + cursor of the terminal is left at the location of the window's + cursor.
+ +
doupdate() and + wnoutrefresh(win)
+ +
These two functions allow multiple updates with more + efficiency than wrefresh. To use them, it is important to + understand how curses works. In addition to all the window + structures, curses keeps two data structures representing the + terminal screen: a physical screen, describing what is actually + on the screen, and a virtual screen, describing what the + programmer wants to have on the screen. wrefresh works by first + copying the named window to the virtual screen + (wnoutrefresh()), and then calling the routine to + update the screen (doupdate()). If the programmer + wishes to output several windows at once, a series of calls to + wrefresh will result in alternating calls to + wnoutrefresh() and doupdate(), + causing several bursts of output to the screen. By calling + wnoutrefresh() for each window, it is then + possible to call doupdate() once, resulting in + only one burst of output, with fewer total characters + transmitted (this also avoids a visually annoying flicker at + each update).
+
+ +

Low-Level Capability + Access

+ +
+
setupterm(term, filenum, errret) +
+ +
+ This routine is called to initialize a terminal's + description, without setting up the curses screen structures + or changing the tty-driver mode bits. term is + the character string representing the name of the terminal + being used. filenum is the UNIX file descriptor + of the terminal to be used for output. errret is + a pointer to an integer, in which a success or failure + indication is returned. The values returned can be 1 (all is + well), 0 (no such terminal), or -1 (some problem locating the + terminfo database). +

The value of term can be given as NULL, which + will cause the value of TERM in the environment + to be used. The errret pointer can also be given + as NULL, meaning no error code is wanted. If + errret is defaulted, and something goes wrong, + setupterm() will print an appropriate error + message and exit, rather than returning. Thus, a simple + program can call setupterm(0, 1, 0) and not worry about + initialization errors.

+ +

After the call to setupterm(), the global + variable cur_term is set to point to the current + structure of terminal capabilities. By calling + setupterm() for each terminal, and saving and + restoring cur_term, it is possible for a program + to use two or more terminals at once. + Setupterm() also stores the names section of the + terminal description in the global character array + ttytype[]. Subsequent calls to + setupterm() will overwrite this array, so you + will have to save it yourself if need be.

+
+
+ +

Debugging

+ +
+ NOTE: These functions are not part of the + standard curses API! +
+ +
+
trace() +
+ +
This function can be used to explicitly set a trace level. + If the trace level is nonzero, execution of your program will + generate a file called “trace” in the current + working directory containing a report on the library's actions. + Higher trace levels enable more detailed (and verbose) + reporting -- see comments attached to TRACE_ + defines in the curses.h file for details. (It is + also possible to set a trace level by assigning a trace level + value to the environment variable + NCURSES_TRACE).
+ +
_tracef() +
+ +
This function can be used to output your own debugging + information. It is only available only if you link with + -lncurses_g. It can be used the same way as + printf(), only it outputs a newline after the end + of arguments. The output goes to a file called + trace in the current directory.
+
+ +

Trace logs can be difficult to interpret due to the sheer + volume of data dumped in them. There is a script called + tracemunch included with the + ncurses distribution that can alleviate this problem + somewhat; it compacts long sequences of similar operations into + more succinct single-line pseudo-operations. These pseudo-ops can + be distinguished by the fact that they are named in capital + letters.

+ +

Hints, Tips, and Tricks

+ +

The ncurses manual pages are a complete reference + for this library. In the remainder of this document, we discuss + various useful methods that may not be obvious from the manual + page descriptions.

+ +

Some Notes of Caution

+ +

If you find yourself thinking you need to use + noraw() or nocbreak(), think again and + move carefully. It is probably better design to use + getstr() or one of its relatives to simulate cooked + mode. The noraw() and nocbreak() + functions try to restore cooked mode, but they may end up + clobbering some control bits set before you started your + application. Also, they have always been poorly documented, and + are likely to hurt your application's usability with other curses + libraries.

+ +

Bear in mind that refresh() is a synonym for + wrefresh(stdscr). Do not try to mix use of + stdscr with use of windows declared by + newwin(); a refresh() call will blow + them off the screen. The right way to handle this is to use + subwin(), or not touch stdscr at all + and tile your screen with declared windows which you then + wnoutrefresh() somewhere in your program event loop, + with a single doupdate() call to trigger actual + repainting.

+ +

You are much less likely to run into problems if you design + your screen layouts to use tiled rather than overlapping windows. + Historically, curses support for overlapping windows has been + weak, fragile, and poorly documented. The ncurses + library is not yet an exception to this rule.

+ +

There is a panels library included in the ncurses + distribution that does a pretty good job of strengthening the + overlapping-windows facilities.

+ +

Try to avoid using the global variables LINES and COLS. Use + getmaxyx() on the stdscr context + instead. Reason: your code may be ported to run in an environment + with window resizes, in which case several screens could be open + with different sizes.

+ +

Temporarily Leaving NCURSES + Mode

+ +

Sometimes you will want to write a program that spends most of + its time in screen mode, but occasionally returns to ordinary + “cooked” mode. A common reason for this is to support + shell-out. This behavior is simple to arrange in + ncurses.

+ +

To leave ncurses mode, call endwin() + as you would if you were intending to terminate the program. This + will take the screen back to cooked mode; you can do your + shell-out. When you want to return to ncurses mode, + simply call refresh() or doupdate(). + This will repaint the screen.

+ +

There is a boolean function, isendwin(), which + code can use to test whether ncurses screen mode is + active. It returns TRUE in the interval between an + endwin() call and the following + refresh(), FALSE otherwise.

+ +

Here is some sample code for shellout:

+ +
+    addstr("Shelling out...");
+    def_prog_mode();           /* save current tty modes */
+    endwin();                  /* restore original tty modes */
+    system("sh");              /* run shell */
+    addstr("returned.\n");     /* prepare return message */
+    refresh();                 /* restore save modes, repaint screen */
+
+

Using NCURSES under XTERM

+ +

A resize operation in X sends SIGWINCH to the + application running under xterm. The easiest way to handle + SIGWINCH is to do an endwin, followed + by an refresh and a screen repaint you code + yourself. The refresh will pick up the new screen + size from the xterm's environment.

+ +

That is the standard way, of course (it even works with some + vendor's curses implementations). Its drawback is that it clears + the screen to reinitialize the display, and does not resize + subwindows which must be shrunk. Ncurses provides an + extension which works better, the resizeterm + function. That function ensures that all windows are limited to + the new screen dimensions, and pads stdscr with + blanks if the screen is larger.

+ +

The ncurses library provides a SIGWINCH signal + handler, which pushes a KEY_RESIZE via the wgetch() + calls. When ncurses returns that code, it calls + resizeterm to update the size of the standard + screen's window, repainting that (filling with blanks or + truncating as needed). It also resizes other windows, but its + effect may be less satisfactory because it cannot know how you + want the screen re-painted. You will usually have to write + special-purpose code to handle KEY_RESIZE + yourself.

+ +

Handling Multiple Terminal + Screens

+ +

The initscr() function actually calls a function + named newterm() to do most of its work. If you are + writing a program that opens multiple terminals, use + newterm() directly.

+ +

For each call, you will have to specify a terminal type and a + pair of file pointers; each call will return a screen reference, + and stdscr will be set to the last one allocated. + You will switch between screens with the set_term + call. Note that you will also have to call + def_shell_mode and def_prog_mode on + each tty yourself.

+ +

Testing for Terminal + Capabilities

+ +

Sometimes you may want to write programs that test for the + presence of various capabilities before deciding whether to go + into ncurses mode. An easy way to do this is to call + setupterm(), then use the functions + tigetflag(), tigetnum(), and + tigetstr() to do your testing.

+ +

A particularly useful case of this often comes up when you + want to test whether a given terminal type should be treated as + “smart” (cursor-addressable) or “stupid”. + The right way to test this is to see if the return value of + tigetstr("cup") is non-NULL. Alternatively, you can + include the term.h file and test the value of the + macro cursor_address.

+ +

Tuning for Speed

+ +

Use the addchstr() family of functions for fast + screen-painting of text when you know the text does not contain + any control characters. Try to make attribute changes infrequent + on your screens. Do not use the immedok() + option!

+ +

Special Features of + NCURSES

+ +

The wresize() function allows you to resize a + window in place. The associated resizeterm() + function simplifies the construction of SIGWINCH handlers, for resizing all windows.

+ +

The define_key() function allows you to define at + runtime function-key control sequences which are not in the + terminal description. The keyok() function allows + you to temporarily enable or disable interpretation of any + function-key control sequence.

+ +

The use_default_colors() function allows you to + construct applications which can use the terminal's default + foreground and background colors as an additional "default" + color. Several terminal emulators support this feature, which is + based on ISO 6429.

+ +

Ncurses supports up 16 colors, unlike SVr4 curses which + defines only 8. While most terminals which provide color allow + only 8 colors, about a quarter (including XFree86 xterm) support + 16 colors.

+ +

Compatibility with Older + Versions

+ +

Despite our best efforts, there are some differences between + ncurses and the (undocumented!) behavior of older + curses implementations. These arise from ambiguities or omissions + in the documentation of the API.

+ +

Refresh of Overlapping + Windows

+ +

If you define two windows A and B that overlap, and then + alternately scribble on and refresh them, the changes made to the + overlapping region under historic curses versions + were often not documented precisely.

+ +

To understand why this is a problem, remember that screen + updates are calculated between two representations of the + entire display. The documentation says that when you + refresh a window, it is first copied to the virtual screen, and + then changes are calculated to update the physical screen (and + applied to the terminal). But "copied to" is not very specific, + and subtle differences in how copying works can produce different + behaviors in the case where two overlapping windows are each + being refreshed at unpredictable intervals.

+ +

What happens to the overlapping region depends on what + wnoutrefresh() does with its argument -- what + portions of the argument window it copies to the virtual screen. + Some implementations do "change copy", copying down only + locations in the window that have changed (or been marked changed + with wtouchln() and friends). Some implementations + do "entire copy", copying all window locations to the + virtual screen whether or not they have changed.

+ +

The ncurses library itself has not always been + consistent on this score. Due to a bug, versions 1.8.7 to 1.9.8a + did entire copy. Versions 1.8.6 and older, and versions 1.9.9 and + newer, do change copy.

+ +

For most commercial curses implementations, it is not + documented and not known for sure (at least not to the + ncurses maintainers) whether they do change copy or + entire copy. We know that System V release 3 curses has logic in + it that looks like an attempt to do change copy, but the + surrounding logic and data representations are sufficiently + complex, and our knowledge sufficiently indirect, that it is hard + to know whether this is reliable. It is not clear what the SVr4 + documentation and XSI standard intend. The XSI Curses standard + barely mentions wnoutrefresh(); the SVr4 documents seem to be + describing entire-copy, but it is possible with some effort and + straining to read them the other way.

+ +

It might therefore be unwise to rely on either behavior in + programs that might have to be linked with other curses + implementations. Instead, you can do an explicit + touchwin() before the wnoutrefresh() + call to guarantee an entire-contents copy anywhere.

+ +

The really clean way to handle this is to use the panels + library. If, when you want a screen update, you do + update_panels(), it will do all the necessary + wnoutrefresh() calls for whatever panel stacking + order you have defined. Then you can do one + doupdate() and there will be a single burst + of physical I/O that will do all your updates.

+ +

Background Erase

+ +

If you have been using a very old versions of + ncurses (1.8.7 or older) you may be surprised by the + behavior of the erase functions. In older versions, erased areas + of a window were filled with a blank modified by the window's + current attribute (as set by wattrset(), + wattron(), wattroff() and + friends).

+ +

In newer versions, this is not so. Instead, the attribute of + erased blanks is normal unless and until it is modified by the + functions bkgdset() or wbkgdset().

+ +

This change in behavior conforms ncurses to + System V Release 4 and the XSI Curses standard.

+ +

XSI Curses Conformance

+ +

The ncurses library is intended to be base-level + conformant with the XSI Curses standard from X/Open. Many + extended-level features (in fact, almost all features not + directly concerned with wide characters and internationalization) + are also supported.

+ +

One effect of XSI conformance is the change in behavior + described under "Background Erase -- + Compatibility with Old Versions".

+ +

Also, ncurses meets the XSI requirement that + every macro entry point have a corresponding function which may + be linked (and will be prototype-checked) if the macro definition + is disabled with #undef.

+ +

The Panels Library

+ +

The ncurses library by itself provides good + support for screen displays in which the windows are tiled + (non-overlapping). In the more general case that windows may + overlap, you have to use a series of wnoutrefresh() + calls followed by a doupdate(), and be careful about + the order you do the window refreshes in. It has to be + bottom-upwards, otherwise parts of windows that should be + obscured will show through.

+ +

When your interface design is such that windows may dive + deeper into the visibility stack or pop to the top at runtime, + the resulting book-keeping can be tedious and difficult to get + right. Hence the panels library.

+ +

The panel library first appeared in AT&T + System V. The version documented here is the panel + code distributed with ncurses.

+ +

Compiling With the Panels + Library

+ +

Your panels-using modules must import the panels library + declarations with

+ +
+          #include <panel.h>
+
+

and must be linked explicitly with the panels library using an + -lpanel argument. Note that they must also link the + ncurses library with -lncurses. Many + linkers are two-pass and will accept either order, but it is + still good practice to put -lpanel first and + -lncurses second.

+ +

Overview of Panels

+ +

A panel object is a window that is implicitly treated as part + of a deck including all other panel objects. The deck + has an implicit bottom-to-top visibility order. The panels + library includes an update function (analogous to + refresh()) that displays all panels in the deck in + the proper order to resolve overlaps. The standard window, + stdscr, is considered below all panels.

+ +

Details on the panels functions are available in the man + pages. We will just hit the highlights here.

+ +

You create a panel from a window by calling + new_panel() on a window pointer. It then becomes the + top of the deck. The panel's window is available as the value of + panel_window() called with the panel pointer as + argument.

+ +

You can delete a panel (removing it from the deck) with + del_panel. This will not deallocate the associated + window; you have to do that yourself. You can replace a panel's + window with a different window by calling + replace_window. The new window may be of different + size; the panel code will re-compute all overlaps. This operation + does not change the panel's position in the deck.

+ +

To move a panel's window, use move_panel(). The + mvwin() function on the panel's window is not + sufficient because it does not update the panels library's + representation of where the windows are. This operation leaves + the panel's depth, contents, and size unchanged.

+ +

Two functions (top_panel(), + bottom_panel()) are provided for rearranging the + deck. The first pops its argument window to the top of the deck; + the second sends it to the bottom. Either operation leaves the + panel's screen location, contents, and size unchanged.

+ +

The function update_panels() does all the + wnoutrefresh() calls needed to prepare for + doupdate() (which you must call yourself, + afterwards).

+ +

Typically, you will want to call update_panels() + and doupdate() just before accepting command input, + once in each cycle of interaction with the user. If you call + update_panels() after each and every panel write, + you will generate a lot of unnecessary refresh activity and + screen flicker.

+ +

Panels, Input, and the + Standard Screen

+ +

You should not mix wnoutrefresh() or + wrefresh() operations with panels code; this will + work only if the argument window is either in the top panel or + unobscured by any other panels.

+ +

The stsdcr window is a special case. It is + considered below all panels. Because changes to panels may + obscure parts of stdscr, though, you should call + update_panels() before doupdate() even + when you only change stdscr.

+ +

Note that wgetch automatically calls + wrefresh. Therefore, before requesting input from a + panel window, you need to be sure that the panel is totally + unobscured.

+ +

There is presently no way to display changes to one obscured + panel without repainting all panels.

+ +

Hiding Panels

+ +

It is possible to remove a panel from the deck temporarily; + use hide_panel for this. Use + show_panel() to render it visible again. The + predicate function panel_hidden tests whether or not + a panel is hidden.

+ +

The panel_update code ignores hidden panels. You + cannot do top_panel() or bottom_panel + on a hidden panel(). Other panels operations are applicable.

+ +

Miscellaneous Other Facilities

+ +

It is possible to navigate the deck using the functions + panel_above() and panel_below. Handed a + panel pointer, they return the panel above or below that panel. + Handed NULL, they return the bottom-most or top-most + panel.

+ +

Every panel has an associated user pointer, not used by the + panel code, to which you can attach application data. See the man + page documentation of set_panel_userptr() and + panel_userptr for details.

+ +

The Menu Library

+ +

A menu is a screen display that assists the user to choose + some subset of a given set of items. The menu + library is a curses extension that supports easy programming of + menu hierarchies with a uniform but flexible interface.

+ +

The menu library first appeared in AT&T + System V. The version documented here is the menu + code distributed with ncurses.

+ +

Compiling With the menu + Library

+ +

Your menu-using modules must import the menu library + declarations with

+ +
+          #include <menu.h>
+
+

and must be linked explicitly with the menus library using an + -lmenu argument. Note that they must also link the + ncurses library with -lncurses. Many + linkers are two-pass and will accept either order, but it is + still good practice to put -lmenu first and + -lncurses second.

+ +

Overview of Menus

+ +

The menus created by this library consist of collections of + items including a name string part and a description + string part. To make menus, you create groups of these items and + connect them with menu frame objects.

+ +

The menu can then by posted, that is written to an + associated window. Actually, each menu has two associated + windows; a containing window in which the programmer can scribble + titles or borders, and a subwindow in which the menu items proper + are displayed. If this subwindow is too small to display all the + items, it will be a scrollable viewport on the collection of + items.

+ +

A menu may also be unposted (that is, undisplayed), + and finally freed to make the storage associated with it and its + items available for re-use.

+ +

The general flow of control of a menu program looks like + this:

+ +
    +
  1. Initialize curses.
  2. + +
  3. Create the menu items, using new_item().
  4. + +
  5. Create the menu using new_menu().
  6. + +
  7. Post the menu using post_menu().
  8. + +
  9. Refresh the screen.
  10. + +
  11. Process user requests via an input loop.
  12. + +
  13. Unpost the menu using unpost_menu().
  14. + +
  15. Free the menu, using free_menu().
  16. + +
  17. Free the items using free_item().
  18. + +
  19. Terminate curses.
  20. +
+ +

Selecting items

+ +

Menus may be multi-valued or (the default) single-valued (see + the manual page menu_opts(3x) to see how to change + the default). Both types always have a current + item.

+ +

From a single-valued menu you can read the selected value + simply by looking at the current item. From a multi-valued menu, + you get the selected set by looping through the items applying + the item_value() predicate function. Your + menu-processing code can use the function + set_item_value() to flag the items in the select + set.

+ +

Menu items can be made unselectable using + set_item_opts() or item_opts_off() with + the O_SELECTABLE argument. This is the only option + so far defined for menus, but it is good practice to code as + though other option bits might be on.

+ +

Menu Display

+ +

The menu library calculates a minimum display size for your + window, based on the following variables:

+ +
    +
  • The number and maximum length of the menu items
  • + +
  • Whether the O_ROWMAJOR option is enabled
  • + +
  • Whether display of descriptions is enabled
  • + +
  • Whatever menu format may have been set by the + programmer
  • + +
  • The length of the menu mark string used for highlighting + selected items
  • +
+ +

The function set_menu_format() allows you to set + the maximum size of the viewport or menu page that + will be used to display menu items. You can retrieve any format + associated with a menu with menu_format(). The + default format is rows=16, columns=1.

+ +

The actual menu page may be smaller than the format size. This + depends on the item number and size and whether O_ROWMAJOR is on. + This option (on by default) causes menu items to be displayed in + a “raster-scan” pattern, so that if more than one + item will fit horizontally the first couple of items are + side-by-side in the top row. The alternative is column-major + display, which tries to put the first several items in the first + column.

+ +

As mentioned above, a menu format not large enough to allow + all items to fit on-screen will result in a menu display that is + vertically scrollable.

+ +

You can scroll it with requests to the menu driver, which will + be described in the section on menu input + handling.

+ +

Each menu has a mark string used to visually tag + selected items; see the menu_mark(3x) manual page + for details. The mark string length also influences the menu page + size.

+ +

The function scale_menu() returns the minimum + display size that the menu code computes from all these factors. + There are other menu display attributes including a select + attribute, an attribute for selectable items, an attribute for + unselectable items, and a pad character used to separate item + name text from description text. These have reasonable defaults + which the library allows you to change (see the + menu_attribs(3x) manual page.

+ +

Menu Windows

+ +

Each menu has, as mentioned previously, a pair of associated + windows. Both these windows are painted when the menu is posted + and erased when the menu is unposted.

+ +

The outer or frame window is not otherwise touched by the menu + routines. It exists so the programmer can associate a title, a + border, or perhaps help text with the menu and have it properly + refreshed or erased at post/unpost time. The inner window or + subwindow is where the current menu page is + displayed.

+ +

By default, both windows are stdscr. You can set + them with the functions in menu_win(3x).

+ +

When you call post_menu(), you write the menu to + its subwindow. When you call unpost_menu(), you + erase the subwindow, However, neither of these actually modifies + the screen. To do that, call wrefresh() or some + equivalent.

+ +

Processing Menu Input

+ +

The main loop of your menu-processing code should call + menu_driver() repeatedly. The first argument of this + routine is a menu pointer; the second is a menu command code. You + should write an input-fetching routine that maps input characters + to menu command codes, and pass its output to + menu_driver(). The menu command codes are fully + documented in menu_driver(3x).

+ +

The simplest group of command codes is + REQ_NEXT_ITEM, REQ_PREV_ITEM, + REQ_FIRST_ITEM, REQ_LAST_ITEM, + REQ_UP_ITEM, REQ_DOWN_ITEM, + REQ_LEFT_ITEM, REQ_RIGHT_ITEM. These + change the currently selected item. These requests may cause + scrolling of the menu page if it only partially displayed.

+ +

There are explicit requests for scrolling which also change + the current item (because the select location does not change, + but the item there does). These are REQ_SCR_DLINE, + REQ_SCR_ULINE, REQ_SCR_DPAGE, and + REQ_SCR_UPAGE.

+ +

The REQ_TOGGLE_ITEM selects or deselects the + current item. It is for use in multi-valued menus; if you use it + with O_ONEVALUE on, you will get an error return + (E_REQUEST_DENIED).

+ +

Each menu has an associated pattern buffer. The + menu_driver() logic tries to accumulate printable + ASCII characters passed in in that buffer; when it matches a + prefix of an item name, that item (or the next matching item) is + selected. If appending a character yields no new match, that + character is deleted from the pattern buffer, and + menu_driver() returns E_NO_MATCH.

+ +

Some requests change the pattern buffer directly: + REQ_CLEAR_PATTERN, REQ_BACK_PATTERN, + REQ_NEXT_MATCH, REQ_PREV_MATCH. The + latter two are useful when pattern buffer input matches more than + one item in a multi-valued menu.

+ +

Each successful scroll or item navigation request clears the + pattern buffer. It is also possible to set the pattern buffer + explicitly with set_menu_pattern().

+ +

Finally, menu driver requests above the constant + MAX_COMMAND are considered application-specific + commands. The menu_driver() code ignores them and + returns E_UNKNOWN_COMMAND.

+ +

Miscellaneous Other Features

+ +

Various menu options can affect the processing and visual + appearance and input processing of menus. See menu_opts(3x) + for details.

+ +

It is possible to change the current item from application + code; this is useful if you want to write your own navigation + requests. It is also possible to explicitly set the top row of + the menu display. See mitem_current(3x). If your + application needs to change the menu subwindow cursor for any + reason, pos_menu_cursor() will restore it to the + correct location for continuing menu driver processing.

+ +

It is possible to set hooks to be called at menu + initialization and wrapup time, and whenever the selected item + changes. See menu_hook(3x).

+ +

Each item, and each menu, has an associated user pointer on + which you can hang application data. See + mitem_userptr(3x) and + menu_userptr(3x).

+ +

The Forms Library

+ +

The form library is a curses extension that + supports easy programming of on-screen forms for data entry and + program control.

+ +

The form library first appeared in AT&T + System V. The version documented here is the form + code distributed with ncurses.

+ +

Compiling With the form + Library

+ +

Your form-using modules must import the form library + declarations with

+ +
+          #include <form.h>
+
+

and must be linked explicitly with the forms library using an + -lform argument. Note that they must also link the + ncurses library with -lncurses. Many + linkers are two-pass and will accept either order, but it is + still good practice to put -lform first and + -lncurses second.

+ +

Overview of Forms

+ +

A form is a collection of fields; each field may be either a + label (explanatory text) or a data-entry location. Long forms may + be segmented into pages; each entry to a new page clears the + screen.

+ +

To make forms, you create groups of fields and connect them + with form frame objects; the form library makes this relatively + simple.

+ +

Once defined, a form can be posted, that is written + to an associated window. Actually, each form has two associated + windows; a containing window in which the programmer can scribble + titles or borders, and a subwindow in which the form fields + proper are displayed.

+ +

As the form user fills out the posted form, navigation and + editing keys support movement between fields, editing keys + support modifying field, and plain text adds to or changes data + in a current field. The form library allows you (the forms + designer) to bind each navigation and editing key to any + keystroke accepted by curses Fields may have + validation conditions on them, so that they check input data for + type and value. The form library supplies a rich set of + pre-defined field types, and makes it relatively easy to define + new ones.

+ +

Once its transaction is completed (or aborted), a form may be + unposted (that is, undisplayed), and finally freed to + make the storage associated with it and its items available for + re-use.

+ +

The general flow of control of a form program looks like + this:

+ +
    +
  1. Initialize curses.
  2. + +
  3. Create the form fields, using + new_field().
  4. + +
  5. Create the form using new_form().
  6. + +
  7. Post the form using post_form().
  8. + +
  9. Refresh the screen.
  10. + +
  11. Process user requests via an input loop.
  12. + +
  13. Unpost the form using unpost_form().
  14. + +
  15. Free the form, using free_form().
  16. + +
  17. Free the fields using free_field().
  18. + +
  19. Terminate curses.
  20. +
+ +

Note that this looks much like a menu program; the form + library handles tasks which are in many ways similar, and its + interface was obviously designed to resemble that of the menu library wherever possible.

+ +

In forms programs, however, the “process user + requests” is somewhat more complicated than for menus. + Besides menu-like navigation operations, the menu driver loop has + to support field editing and data validation.

+ +

Creating and Freeing Fields + and Forms

+ +

The basic function for creating fields is + new_field():

+ +
+FIELD *new_field(int height, int width,   /* new field size */
+                 int top, int left,       /* upper left corner */
+                 int offscreen,           /* number of offscreen rows */
+                 int nbuf);               /* number of working buffers */
+
+

Menu items always occupy a single row, but forms fields may + have multiple rows. So new_field() requires you to + specify a width and height (the first two arguments, which mist + both be greater than zero).

+ +

You must also specify the location of the field's upper left + corner on the screen (the third and fourth arguments, which must + be zero or greater). Note that these coordinates are relative to + the form subwindow, which will coincide with stdscr + by default but need not be stdscr if you have done + an explicit set_form_win() call.

+ +

The fifth argument allows you to specify a number of + off-screen rows. If this is zero, the entire field will always be + displayed. If it is nonzero, the form will be scrollable, with + only one screen-full (initially the top part) displayed at any + given time. If you make a field dynamic and grow it so it will no + longer fit on the screen, the form will become scrollable even if + the offscreen argument was initially zero.

+ +

The forms library allocates one working buffer per field; the + size of each buffer is ((height + offscreen)*width + + 1, one character for each position in the field plus a NUL + terminator. The sixth argument is the number of additional data + buffers to allocate for the field; your application can use them + for its own purposes.

+ +
+FIELD *dup_field(FIELD *field,            /* field to copy */
+                 int top, int left);      /* location of new copy */
+
+

The function dup_field() duplicates an existing + field at a new location. Size and buffering information are + copied; some attribute flags and status bits are not (see the + form_field_new(3X) for details).

+ +
+FIELD *link_field(FIELD *field,           /* field to copy */
+                  int top, int left);     /* location of new copy */
+
+

The function link_field() also duplicates an + existing field at a new location. The difference from + dup_field() is that it arranges for the new field's + buffer to be shared with the old one.

+ +

Besides the obvious use in making a field editable from two + different form pages, linked fields give you a way to hack in + dynamic labels. If you declare several fields linked to an + original, and then make them inactive, changes from the original + will still be propagated to the linked fields.

+ +

As with duplicated fields, linked fields have attribute bits + separate from the original.

+ +

As you might guess, all these field-allocations return + NULL if the field allocation is not possible due to + an out-of-memory error or out-of-bounds arguments.

+ +

To connect fields to a form, use

+ +
+FORM *new_form(FIELD **fields);
+
+

This function expects to see a NULL-terminated array of field + pointers. Said fields are connected to a newly-allocated form + object; its address is returned (or else NULL if the allocation + fails).

+ +

Note that new_field() does not copy the + pointer array into private storage; if you modify the contents of + the pointer array during forms processing, all manner of bizarre + things might happen. Also note that any given field may only be + connected to one form.

+ +

The functions free_field() and + free_form are available to free field and form + objects. It is an error to attempt to free a field connected to a + form, but not vice-versa; thus, you will generally free your form + objects first.

+ +

Fetching and Changing + Field Attributes

+ +

Each form field has a number of location and size attributes + associated with it. There are other field attributes used to + control display and editing of the field. Some (for example, the + O_STATIC bit) involve sufficient complications to be + covered in sections of their own later on. We cover the functions + used to get and set several basic attributes here.

+ +

When a field is created, the attributes not specified by the + new_field function are copied from an invisible + system default field. In attribute-setting and -fetching + functions, the argument NULL is taken to mean this field. Changes + to it persist as defaults until your forms application + terminates.

+ +

Fetching Size and Location + Data

+ +

You can retrieve field sizes and locations through:

+ +
+int field_info(FIELD *field,              /* field from which to fetch */
+               int *height, *int width,   /* field size */
+               int *top, int *left,       /* upper left corner */
+               int *offscreen,            /* number of offscreen rows */
+               int *nbuf);                /* number of working buffers */
+
+

This function is a sort of inverse of + new_field(); instead of setting size and location + attributes of a new field, it fetches them from an existing + one.

+ +

Changing the Field + Location

+ +

It is possible to move a field's location on the screen:

+ +
+int move_field(FIELD *field,              /* field to alter */
+               int top, int left);        /* new upper-left corner */
+
+

You can, of course. query the current location through + field_info().

+ +

The Justification Attribute

+ +

One-line fields may be unjustified, justified right, justified + left, or centered. Here is how you manipulate this attribute:

+ +
+int set_field_just(FIELD *field,          /* field to alter */
+                   int justmode);         /* mode to set */
+
+int field_just(FIELD *field);             /* fetch mode of field */
+
+

The mode values accepted and returned by this functions are + preprocessor macros NO_JUSTIFICATION, + JUSTIFY_RIGHT, JUSTIFY_LEFT, or + JUSTIFY_CENTER.

+ +

Field Display + Attributes

+ +

For each field, you can set a foreground attribute for entered + characters, a background attribute for the entire field, and a + pad character for the unfilled portion of the field. You can also + control pagination of the form.

+ +

This group of four field attributes controls the visual + appearance of the field on the screen, without affecting in any + way the data in the field buffer.

+ +
+int set_field_fore(FIELD *field,          /* field to alter */
+                   chtype attr);          /* attribute to set */
+
+chtype field_fore(FIELD *field);          /* field to query */
+
+int set_field_back(FIELD *field,          /* field to alter */
+                   chtype attr);          /* attribute to set */
+
+chtype field_back(FIELD *field);          /* field to query */
+
+int set_field_pad(FIELD *field,           /* field to alter */
+                 int pad);                /* pad character to set */
+
+chtype field_pad(FIELD *field);
+
+int set_new_page(FIELD *field,            /* field to alter */
+                 int flag);               /* TRUE to force new page */
+
+chtype new_page(FIELD *field);            /* field to query */
+
+

The attributes set and returned by the first four functions + are normal curses(3x) display attribute values + (A_STANDOUT, A_BOLD, + A_REVERSE etc). The page bit of a field controls + whether it is displayed at the start of a new form screen.

+ +

Field Option Bits

+ +

There is also a large collection of field option bits you can + set to control various aspects of forms processing. You can + manipulate them with these functions:

+ +
+int set_field_opts(FIELD *field,          /* field to alter */
+                   int attr);             /* attribute to set */
+
+int field_opts_on(FIELD *field,           /* field to alter */
+                  int attr);              /* attributes to turn on */
+
+int field_opts_off(FIELD *field,          /* field to alter */
+                   int attr);             /* attributes to turn off */
+
+int field_opts(FIELD *field);             /* field to query */
+
+

By default, all options are on. Here are the available option + bits:

+ +
+
O_VISIBLE
+ +
Controls whether the field is visible on the screen. Can be + used during form processing to hide or pop up fields depending + on the value of parent fields.
+ +
O_ACTIVE
+ +
Controls whether the field is active during forms + processing (i.e. visited by form navigation keys). Can be used + to make labels or derived fields with buffer values alterable + by the forms application, not the user.
+ +
O_PUBLIC
+ +
Controls whether data is displayed during field entry. If + this option is turned off on a field, the library will accept + and edit data in that field, but it will not be displayed and + the visible field cursor will not move. You can turn off the + O_PUBLIC bit to define password fields.
+ +
O_EDIT
+ +
Controls whether the field's data can be modified. When + this option is off, all editing requests except + REQ_PREV_CHOICE and REQ_NEXT_CHOICE + will fail. Such read-only fields may be useful for help + messages.
+ +
O_WRAP
+ +
Controls word-wrapping in multi-line fields. Normally, when + any character of a (blank-separated) word reaches the end of + the current line, the entire word is wrapped to the next line + (assuming there is one). When this option is off, the word will + be split across the line break.
+ +
O_BLANK
+ +
Controls field blanking. When this option is on, entering a + character at the first field position erases the entire field + (except for the just-entered character).
+ +
O_AUTOSKIP
+ +
Controls automatic skip to next field when this one fills. + Normally, when the forms user tries to type more data into a + field than will fit, the editing location jumps to next field. + When this option is off, the user's cursor will hang at the end + of the field. This option is ignored in dynamic fields that + have not reached their size limit.
+ +
O_NULLOK
+ +
Controls whether validation is + applied to blank fields. Normally, it is not; the user can + leave a field blank without invoking the usual validation check + on exit. If this option is off on a field, exit from it will + invoke a validation check.
+ +
O_PASSOK
+ +
Controls whether validation occurs on every exit, or only + after the field is modified. Normally the latter is true. + Setting O_PASSOK may be useful if your field's validation + function may change during forms processing.
+ +
O_STATIC
+ +
Controls whether the field is fixed to its initial + dimensions. If you turn this off, the field becomes dynamic and will stretch to fit entered + data.
+
+ +

A field's options cannot be changed while the field is + currently selected. However, options may be changed on posted + fields that are not current.

+ +

The option values are bit-masks and can be composed with + logical-or in the obvious way.

+ +

Field Status

+ +

Every field has a status flag, which is set to FALSE when the + field is created and TRUE when the value in field buffer 0 + changes. This flag can be queried and set directly:

+ +
+int set_field_status(FIELD *field,      /* field to alter */
+                   int status);         /* mode to set */
+
+int field_status(FIELD *field);         /* fetch mode of field */
+
+

Setting this flag under program control can be useful if you + use the same form repeatedly, looking for modified fields each + time.

+ +

Calling field_status() on a field not currently + selected for input will return a correct value. Calling + field_status() on a field that is currently selected + for input may not necessarily give a correct field status value, + because entered data is not necessarily copied to buffer zero + before the exit validation check. To guarantee that the returned + status value reflects reality, call field_status() + either (1) in the field's exit validation check routine, (2) from + the field's or form's initialization or termination hooks, or (3) + just after a REQ_VALIDATION request has been + processed by the forms driver.

+ +

Field User Pointer

+ +

Each field structure contains one character pointer slot that + is not used by the forms library. It is intended to be used by + applications to store private per-field data. You can manipulate + it with:

+ +
+int set_field_userptr(FIELD *field,       /* field to alter */
+                   char *userptr);        /* mode to set */
+
+char *field_userptr(FIELD *field);        /* fetch mode of field */
+
(Properly, this user pointer field ought to have (void +*) type. The (char *) type is retained for +System V compatibility.) +

It is valid to set the user pointer of the default field (with + a set_field_userptr() call passed a NULL field + pointer.) When a new field is created, the default-field user + pointer is copied to initialize the new field's user pointer.

+ +

Variable-Sized Fields

+ +

Normally, a field is fixed at the size specified for it at + creation time. If, however, you turn off its O_STATIC bit, it + becomes dynamic and will automatically resize itself + to accommodate data as it is entered. If the field has extra + buffers associated with it, they will grow right along with the + main input buffer.

+ +

A one-line dynamic field will have a fixed height (1) but + variable width, scrolling horizontally to display data within the + field area as originally dimensioned and located. A multi-line + dynamic field will have a fixed width, but variable height + (number of rows), scrolling vertically to display data within the + field area as originally dimensioned and located.

+ +

Normally, a dynamic field is allowed to grow without limit. + But it is possible to set an upper limit on the size of a dynamic + field. You do it with this function:

+ +
+int set_max_field(FIELD *field,     /* field to alter (may not be NULL) */
+                   int max_size);   /* upper limit on field size */
+
+

If the field is one-line, max_size is taken to be + a column size limit; if it is multi-line, it is taken to be a + line size limit. To disable any limit, use an argument of zero. + The growth limit can be changed whether or not the O_STATIC bit + is on, but has no effect until it is.

+ +

The following properties of a field change when it becomes + dynamic:

+ +
    +
  • If there is no growth limit, there is no final position of + the field; therefore O_AUTOSKIP and + O_NL_OVERLOAD are ignored.
  • + +
  • Field justification will be ignored (though whatever + justification is set up will be retained internally and can be + queried).
  • + +
  • The dup_field() and link_field() + calls copy dynamic-buffer sizes. If the O_STATIC + option is set on one of a collection of links, buffer resizing + will occur only when the field is edited through that + link.
  • + +
  • The call field_info() will retrieve the + original static size of the field; use + dynamic_field_info() to get the actual dynamic + size.
  • +
+ +

Field Validation

+ +

By default, a field will accept any data that will fit in its + input buffer. However, it is possible to attach a validation type + to a field. If you do this, any attempt to leave the field while + it contains data that does not match the validation type will + fail. Some validation types also have a character-validity check + for each time a character is entered in the field.

+ +

A field's validation check (if any) is not called when + set_field_buffer() modifies the input buffer, nor + when that buffer is changed through a linked field.

+ +

The form library provides a rich set of + pre-defined validation types, and gives you the capability to + define custom ones of your own. You can examine and change field + validation attributes with the following functions:

+ +
+int set_field_type(FIELD *field,          /* field to alter */
+                   FIELDTYPE *ftype,      /* type to associate */
+                   ...);                  /* additional arguments*/
+
+FIELDTYPE *field_type(FIELD *field);      /* field to query */
+
+

The validation type of a field is considered an attribute of + the field. As with other field attributes, Also, doing + set_field_type() with a NULL field + default will change the system default for validation of + newly-created fields.

+ +

Here are the pre-defined validation types:

+ +

TYPE_ALPHA

+ +

This field type accepts alphabetic data; no blanks, no digits, + no special characters (this is checked at character-entry time). + It is set up with:

+ +
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALPHA,            /* type to associate */
+                   int width);            /* maximum width of field */
+
+

The width argument sets a minimum width of data. + Typically you will want to set this to the field width; if it is + greater than the field width, the validation check will always + fail. A minimum width of zero makes field completion + optional.

+ +

TYPE_ALNUM

+ +

This field type accepts alphabetic data and digits; no blanks, + no special characters (this is checked at character-entry time). + It is set up with:

+ +
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ALNUM,            /* type to associate */
+                   int width);            /* maximum width of field */
+
+

The width argument sets a minimum width of data. + As with TYPE_ALPHA, typically you will want to set this to the + field width; if it is greater than the field width, the + validation check will always fail. A minimum width of zero makes + field completion optional.

+ +

TYPE_ENUM

+ +

This type allows you to restrict a field's values to be among + a specified set of string values (for example, the two-letter + postal codes for U.S. states). It is set up with:

+ +
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_ENUM,             /* type to associate */
+                   char **valuelist;      /* list of possible values */
+                   int checkcase;         /* case-sensitive? */
+                   int checkunique);      /* must specify uniquely? */
+
+

The valuelist parameter must point at a + NULL-terminated list of valid strings. The checkcase + argument, if true, makes comparison with the string + case-sensitive.

+ +

When the user exits a TYPE_ENUM field, the validation + procedure tries to complete the data in the buffer to a valid + entry. If a complete choice string has been entered, it is of + course valid. But it is also possible to enter a prefix of a + valid string and have it completed for you.

+ +

By default, if you enter such a prefix and it matches more + than one value in the string list, the prefix will be completed + to the first matching value. But the checkunique + argument, if true, requires prefix matches to be unique in order + to be valid.

+ +

The REQ_NEXT_CHOICE and + REQ_PREV_CHOICE input requests can be particularly + useful with these fields.

+ +

TYPE_INTEGER

+ +

This field type accepts an integer. It is set up as + follows:

+ +
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_INTEGER,          /* type to associate */
+                   int padding,           /* # places to zero-pad to */
+                   int vmin, int vmax);   /* valid range */
+
+

Valid characters consist of an optional leading minus and + digits. The range check is performed on exit. If the range + maximum is less than or equal to the minimum, the range is + ignored.

+ +

If the value passes its range check, it is padded with as many + leading zero digits as necessary to meet the padding + argument.

+ +

A TYPE_INTEGER value buffer can conveniently be + interpreted with the C library function atoi(3).

+ +

TYPE_NUMERIC

+ +

This field type accepts a decimal number. It is set up as + follows:

+ +
+int set_field_type(FIELD *field,              /* field to alter */
+                   TYPE_NUMERIC,              /* type to associate */
+                   int padding,               /* # places of precision */
+                   double vmin, double vmax); /* valid range */
+
+

Valid characters consist of an optional leading minus and + digits. possibly including a decimal point. If your system + supports locale's, the decimal point character used must be the + one defined by your locale. The range check is performed on exit. + If the range maximum is less than or equal to the minimum, the + range is ignored.

+ +

If the value passes its range check, it is padded with as many + trailing zero digits as necessary to meet the padding + argument.

+ +

A TYPE_NUMERIC value buffer can conveniently be + interpreted with the C library function atof(3).

+ +

TYPE_REGEXP

+ +

This field type accepts data matching a regular expression. It + is set up as follows:

+ +
+int set_field_type(FIELD *field,          /* field to alter */
+                   TYPE_REGEXP,           /* type to associate */
+                   char *regexp);         /* expression to match */
+
+

The syntax for regular expressions is that of + regcomp(3). The check for regular-expression match + is performed on exit.

+ +

Direct Field Buffer + Manipulation

+ +

The chief attribute of a field is its buffer contents. When a + form has been completed, your application usually needs to know + the state of each field buffer. You can find this out with:

+ +
+char *field_buffer(FIELD *field,          /* field to query */
+                   int bufindex);         /* number of buffer to query */
+
+

Normally, the state of the zero-numbered buffer for each field + is set by the user's editing actions on that field. It is + sometimes useful to be able to set the value of the zero-numbered + (or some other) buffer from your application:

+ +
+int set_field_buffer(FIELD *field,        /* field to alter */
+                   int bufindex,          /* number of buffer to alter */
+                   char *value);          /* string value to set */
+
+

If the field is not large enough and cannot be resized to a + sufficiently large size to contain the specified value, the value + will be truncated to fit.

+ +

Calling field_buffer() with a null field pointer + will raise an error. Calling field_buffer() on a + field not currently selected for input will return a correct + value. Calling field_buffer() on a field that is + currently selected for input may not necessarily give a correct + field buffer value, because entered data is not necessarily + copied to buffer zero before the exit validation check. To + guarantee that the returned buffer value reflects on-screen + reality, call field_buffer() either (1) in the + field's exit validation check routine, (2) from the field's or + form's initialization or termination hooks, or (3) just after a + REQ_VALIDATION request has been processed by the + forms driver.

+ +

Attributes of Forms

+ +

As with field attributes, form attributes inherit a default + from a system default form structure. These defaults can be + queried or set by of these functions using a form-pointer + argument of NULL.

+ +

The principal attribute of a form is its field list. You can + query and change this list with:

+ +
+int set_form_fields(FORM *form,           /* form to alter */
+                    FIELD **fields);      /* fields to connect */
+
+char *form_fields(FORM *form);            /* fetch fields of form */
+
+int field_count(FORM *form);              /* count connect fields */
+
+

The second argument of set_form_fields() may be a + NULL-terminated field pointer array like the one required by + new_form(). In that case, the old fields of the form + are disconnected but not freed (and eligible to be connected to + other forms), then the new fields are connected.

+ +

It may also be null, in which case the old fields are + disconnected (and not freed) but no new ones are connected.

+ +

The field_count() function simply counts the + number of fields connected to a given from. It returns -1 if the + form-pointer argument is NULL.

+ +

Control of Form Display

+ +

In the overview section, you saw that to display a form you + normally start by defining its size (and fields), posting it, and + refreshing the screen. There is an hidden step before posting, + which is the association of the form with a frame window + (actually, a pair of windows) within which it will be displayed. + By default, the forms library associates every form with the + full-screen window stdscr.

+ +

By making this step explicit, you can associate a form with a + declared frame window on your screen display. This can be useful + if you want to adapt the form display to different screen sizes, + dynamically tile forms on the screen, or use a form as part of an + interface layout managed by panels.

+ +

The two windows associated with each form have the same + functions as their analogues in the menu + library. Both these windows are painted when the form is + posted and erased when the form is unposted.

+ +

The outer or frame window is not otherwise touched by the form + routines. It exists so the programmer can associate a title, a + border, or perhaps help text with the form and have it properly + refreshed or erased at post/unpost time. The inner window or + subwindow is where the current form page is actually + displayed.

+ +

In order to declare your own frame window for a form, you will + need to know the size of the form's bounding rectangle. You can + get this information with:

+ +
+int scale_form(FORM *form,                /* form to query */
+               int *rows,                 /* form rows */
+               int *cols);                /* form cols */
+
+

The form dimensions are passed back in the locations pointed + to by the arguments. Once you have this information, you can use + it to declare of windows, then use one of these functions:

+ +
+int set_form_win(FORM *form,              /* form to alter */
+                 WINDOW *win);            /* frame window to connect */
+
+WINDOW *form_win(FORM *form);             /* fetch frame window of form */
+
+int set_form_sub(FORM *form,              /* form to alter */
+                 WINDOW *win);            /* form subwindow to connect */
+
+WINDOW *form_sub(FORM *form);             /* fetch form subwindow of form */
+
+

Note that curses operations, including refresh(), + on the form, should be done on the frame window, not the form + subwindow.

+ +

It is possible to check from your application whether all of a + scrollable field is actually displayed within the menu subwindow. + Use these functions:

+ +
+int data_ahead(FORM *form);               /* form to be queried */
+
+int data_behind(FORM *form);              /* form to be queried */
+
+

The function data_ahead() returns TRUE if (a) the + current field is one-line and has undisplayed data off to the + right, (b) the current field is multi-line and there is data + off-screen below it.

+ +

The function data_behind() returns TRUE if the + first (upper left hand) character position is off-screen (not + being displayed).

+ +

Finally, there is a function to restore the form window's + cursor to the value expected by the forms driver:

+ +
+int pos_form_cursor(FORM *)               /* form to be queried */
+
+

If your application changes the form window cursor, call this + function before handing control back to the forms driver in order + to re-synchronize it.

+ +

Input Processing in the Forms + Driver

+ +

The function form_driver() handles virtualized + input requests for form navigation, editing, and validation + requests, just as menu_driver does for menus (see + the section on menu input handling).

+ +
+int form_driver(FORM *form,               /* form to pass input to */
+                int request);             /* form request code */
+
+

Your input virtualization function needs to take input and + then convert it to either an alphanumeric character (which is + treated as data to be entered in the currently-selected field), + or a forms processing request.

+ +

The forms driver provides hooks (through input-validation and + field-termination functions) with which your application code can + check that the input taken by the driver matched what was + expected.

+ +

Page Navigation Requests

+ +

These requests cause page-level moves through the form, + triggering display of a new form screen.

+ +
+
REQ_NEXT_PAGE +
+ +
Move to the next form page.
+ +
REQ_PREV_PAGE +
+ +
Move to the previous form page.
+ +
REQ_FIRST_PAGE +
+ +
Move to the first form page.
+ +
REQ_LAST_PAGE +
+ +
Move to the last form page.
+
+ +

These requests treat the list as cyclic; that is, + REQ_NEXT_PAGE from the last page goes to the first, + and REQ_PREV_PAGE from the first page goes to the + last.

+ +

Inter-Field Navigation + Requests

+ +

These requests handle navigation between fields on the same + page.

+ +
+
REQ_NEXT_FIELD +
+ +
Move to next field.
+ +
REQ_PREV_FIELD +
+ +
Move to previous field.
+ +
REQ_FIRST_FIELD +
+ +
Move to the first field.
+ +
REQ_LAST_FIELD +
+ +
Move to the last field.
+ +
REQ_SNEXT_FIELD +
+ +
Move to sorted next field.
+ +
REQ_SPREV_FIELD +
+ +
Move to sorted previous field.
+ +
REQ_SFIRST_FIELD +
+ +
Move to the sorted first field.
+ +
REQ_SLAST_FIELD +
+ +
Move to the sorted last field.
+ +
REQ_LEFT_FIELD +
+ +
Move left to field.
+ +
REQ_RIGHT_FIELD +
+ +
Move right to field.
+ +
REQ_UP_FIELD +
+ +
Move up to field.
+ +
REQ_DOWN_FIELD +
+ +
Move down to field.
+
+ +

These requests treat the list of fields on a page as cyclic; + that is, REQ_NEXT_FIELD from the last field goes to + the first, and REQ_PREV_FIELD from the first field + goes to the last. The order of the fields for these (and the + REQ_FIRST_FIELD and REQ_LAST_FIELD + requests) is simply the order of the field pointers in the form + array (as set up by new_form() or + set_form_fields()

+ +

It is also possible to traverse the fields as if they had been + sorted in screen-position order, so the sequence goes + left-to-right and top-to-bottom. To do this, use the second group + of four sorted-movement requests.

+ +

Finally, it is possible to move between fields using visual + directions up, down, right, and left. To accomplish this, use the + third group of four requests. Note, however, that the position of + a form for purposes of these requests is its upper-left + corner.

+ +

For example, suppose you have a multi-line field B, and two + single-line fields A and C on the same line with B, with A to the + left of B and C to the right of B. A REQ_MOVE_RIGHT + from A will go to B only if A, B, and C all share the + same first line; otherwise it will skip over B to C.

+ +

Intra-Field Navigation + Requests

+ +

These requests drive movement of the edit cursor within the + currently selected field.

+ +
+
REQ_NEXT_CHAR +
+ +
Move to next character.
+ +
REQ_PREV_CHAR +
+ +
Move to previous character.
+ +
REQ_NEXT_LINE +
+ +
Move to next line.
+ +
REQ_PREV_LINE +
+ +
Move to previous line.
+ +
REQ_NEXT_WORD +
+ +
Move to next word.
+ +
REQ_PREV_WORD +
+ +
Move to previous word.
+ +
REQ_BEG_FIELD +
+ +
Move to beginning of field.
+ +
REQ_END_FIELD +
+ +
Move to end of field.
+ +
REQ_BEG_LINE +
+ +
Move to beginning of line.
+ +
REQ_END_LINE +
+ +
Move to end of line.
+ +
REQ_LEFT_CHAR +
+ +
Move left in field.
+ +
REQ_RIGHT_CHAR +
+ +
Move right in field.
+ +
REQ_UP_CHAR +
+ +
Move up in field.
+ +
REQ_DOWN_CHAR +
+ +
Move down in field.
+
+ +

Each word is separated from the previous and next + characters by whitespace. The commands to move to beginning and + end of line or field look for the first or last non-pad character + in their ranges.

+ +

Scrolling Requests

+ +

Fields that are dynamic and have grown and fields explicitly + created with offscreen rows are scrollable. One-line fields + scroll horizontally; multi-line fields scroll vertically. Most + scrolling is triggered by editing and intra-field movement (the + library scrolls the field to keep the cursor visible). It is + possible to explicitly request scrolling with the following + requests:

+ +
+
REQ_SCR_FLINE +
+ +
Scroll vertically forward a line.
+ +
REQ_SCR_BLINE +
+ +
Scroll vertically backward a line.
+ +
REQ_SCR_FPAGE +
+ +
Scroll vertically forward a page.
+ +
REQ_SCR_BPAGE +
+ +
Scroll vertically backward a page.
+ +
REQ_SCR_FHPAGE +
+ +
Scroll vertically forward half a page.
+ +
REQ_SCR_BHPAGE +
+ +
Scroll vertically backward half a page.
+ +
REQ_SCR_FCHAR +
+ +
Scroll horizontally forward a character.
+ +
REQ_SCR_BCHAR +
+ +
Scroll horizontally backward a character.
+ +
REQ_SCR_HFLINE +
+ +
Scroll horizontally one field width forward.
+ +
REQ_SCR_HBLINE +
+ +
Scroll horizontally one field width backward.
+ +
REQ_SCR_HFHALF +
+ +
Scroll horizontally one half field width forward.
+ +
REQ_SCR_HBHALF +
+ +
Scroll horizontally one half field width backward.
+
+ +

For scrolling purposes, a page of a field is the + height of its visible part.

+ +

Editing Requests

+ +

When you pass the forms driver an ASCII character, it is + treated as a request to add the character to the field's data + buffer. Whether this is an insertion or a replacement depends on + the field's edit mode (insertion is the default.

+ +

The following requests support editing the field and changing + the edit mode:

+ +
+
REQ_INS_MODE +
+ +
Set insertion mode.
+ +
REQ_OVL_MODE +
+ +
Set overlay mode.
+ +
REQ_NEW_LINE +
+ +
New line request (see below for explanation).
+ +
REQ_INS_CHAR +
+ +
Insert space at character location.
+ +
REQ_INS_LINE +
+ +
Insert blank line at character location.
+ +
REQ_DEL_CHAR +
+ +
Delete character at cursor.
+ +
REQ_DEL_PREV +
+ +
Delete previous word at cursor.
+ +
REQ_DEL_LINE +
+ +
Delete line at cursor.
+ +
REQ_DEL_WORD +
+ +
Delete word at cursor.
+ +
REQ_CLR_EOL +
+ +
Clear to end of line.
+ +
REQ_CLR_EOF +
+ +
Clear to end of field.
+ +
REQ_CLEAR_FIELD +
+ +
Clear entire field.
+
+ +

The behavior of the REQ_NEW_LINE and + REQ_DEL_PREV requests is complicated and partly + controlled by a pair of forms options. The special cases are + triggered when the cursor is at the beginning of a field, or on + the last line of the field.

+ +

First, we consider REQ_NEW_LINE:

+ +

The normal behavior of REQ_NEW_LINE in insert + mode is to break the current line at the position of the edit + cursor, inserting the portion of the current line after the + cursor as a new line following the current and moving the cursor + to the beginning of that new line (you may think of this as + inserting a newline in the field buffer).

+ +

The normal behavior of REQ_NEW_LINE in overlay + mode is to clear the current line from the position of the edit + cursor to end of line. The cursor is then moved to the beginning + of the next line.

+ +

However, REQ_NEW_LINE at the beginning of a + field, or on the last line of a field, instead does a + REQ_NEXT_FIELD. O_NL_OVERLOAD option is + off, this special action is disabled.

+ +

Now, let us consider REQ_DEL_PREV:

+ +

The normal behavior of REQ_DEL_PREV is to delete + the previous character. If insert mode is on, and the cursor is + at the start of a line, and the text on that line will fit on the + previous one, it instead appends the contents of the current line + to the previous one and deletes the current line (you may think + of this as deleting a newline from the field buffer).

+ +

However, REQ_DEL_PREV at the beginning of a field + is instead treated as a REQ_PREV_FIELD.

+ +

If the O_BS_OVERLOAD option is off, this special + action is disabled and the forms driver just returns + E_REQUEST_DENIED.

+ +

See Form Options for discussion of + how to set and clear the overload options.

+ +

Order Requests

+ +

If the type of your field is ordered, and has associated + functions for getting the next and previous values of the type + from a given value, there are requests that can fetch that value + into the field buffer:

+ +
+
REQ_NEXT_CHOICE +
+ +
Place the successor value of the current value in the + buffer.
+ +
REQ_PREV_CHOICE +
+ +
Place the predecessor value of the current value in the + buffer.
+
+ +

Of the built-in field types, only TYPE_ENUM has + built-in successor and predecessor functions. When you define a + field type of your own (see Custom Validation + Types), you can associate our own ordering functions.

+ +

Application Commands

+ +

Form requests are represented as integers above the + curses value greater than KEY_MAX and + less than or equal to the constant MAX_COMMAND. If + your input-virtualization routine returns a value above + MAX_COMMAND, the forms driver will ignore it.

+ +

Field Change Hooks

+ +

It is possible to set function hooks to be executed whenever + the current field or form changes. Here are the functions that + support this:

+ +
+typedef void    (*HOOK)();       /* pointer to function returning void */
+
+int set_form_init(FORM *form,    /* form to alter */
+                  HOOK hook);    /* initialization hook */
+
+HOOK form_init(FORM *form);      /* form to query */
+
+int set_form_term(FORM *form,    /* form to alter */
+                  HOOK hook);    /* termination hook */
+
+HOOK form_term(FORM *form);      /* form to query */
+
+int set_field_init(FORM *form,   /* form to alter */
+                  HOOK hook);    /* initialization hook */
+
+HOOK field_init(FORM *form);     /* form to query */
+
+int set_field_term(FORM *form,   /* form to alter */
+                  HOOK hook);    /* termination hook */
+
+HOOK field_term(FORM *form);     /* form to query */
+
+

These functions allow you to either set or query four + different hooks. In each of the set functions, the second + argument should be the address of a hook function. These + functions differ only in the timing of the hook call.

+ +
+
form_init
+ +
This hook is called when the form is posted; also, just + after each page change operation.
+ +
field_init
+ +
This hook is called when the form is posted; also, just + after each field change
+ +
field_term
+ +
This hook is called just after field validation; that is, + just before the field is altered. It is also called when the + form is unposted.
+ +
form_term
+ +
This hook is called when the form is unposted; also, just + before each page change operation.
+
+ +

Calls to these hooks may be triggered

+ +
    +
  1. When user editing requests are processed by the forms + driver
  2. + +
  3. When the current page is changed by + set_current_field() call
  4. + +
  5. When the current field is changed by a + set_form_page() call
  6. +
+ +

See Field Change Commands for + discussion of the latter two cases.

+ +

You can set a default hook for all fields by passing one of + the set functions a NULL first argument.

+ +

You can disable any of these hooks by (re)setting them to + NULL, the default value.

+ +

Field Change Commands

+ +

Normally, navigation through the form will be driven by the + user's input requests. But sometimes it is useful to be able to + move the focus for editing and viewing under control of your + application, or ask which field it currently is in. The following + functions help you accomplish this:

+ +
+int set_current_field(FORM *form,         /* form to alter */
+                      FIELD *field);      /* field to shift to */
+
+FIELD *current_field(FORM *form);         /* form to query */
+
+int field_index(FORM *form,               /* form to query */
+                FIELD *field);            /* field to get index of */
+
+

The function field_index() returns the index of + the given field in the given form's field array (the array passed + to new_form() or + set_form_fields()).

+ +

The initial current field of a form is the first active field + on the first page. The function set_form_fields() + resets this.

+ +

It is also possible to move around by pages.

+ +
+int set_form_page(FORM *form,             /* form to alter */
+                  int page);              /* page to go to (0-origin) */
+
+int form_page(FORM *form);                /* return form's current page */
+
+

The initial page of a newly-created form is 0. The function + set_form_fields() resets this.

+ +

Form Options

+ +

Like fields, forms may have control option bits. They can be + changed or queried with these functions:

+ +
+int set_form_opts(FORM *form,             /* form to alter */
+                  int attr);              /* attribute to set */
+
+int form_opts_on(FORM *form,              /* form to alter */
+                 int attr);               /* attributes to turn on */
+
+int form_opts_off(FORM *form,             /* form to alter */
+                  int attr);              /* attributes to turn off */
+
+int form_opts(FORM *form);                /* form to query */
+
+

By default, all options are on. Here are the available option + bits:

+ +
+
O_NL_OVERLOAD
+ +
Enable overloading of REQ_NEW_LINE as + described in Editing Requests. The value + of this option is ignored on dynamic fields that have not + reached their size limit; these have no last line, so the + circumstances for triggering a REQ_NEXT_FIELD + never arise.
+ +
O_BS_OVERLOAD
+ +
Enable overloading of REQ_DEL_PREV as + described in Editing Requests.
+
+ +

The option values are bit-masks and can be composed with + logical-or in the obvious way.

+ +

Custom Validation Types

+ +

The form library gives you the capability to + define custom validation types of your own. Further, the optional + additional arguments of set_field_type effectively + allow you to parameterize validation types. Most of the + complications in the validation-type interface have to do with + the handling of the additional arguments within custom validation + functions.

+ +

Union Types

+ +

The simplest way to create a custom data type is to compose it + from two preexisting ones:

+ +
+FIELD *link_fieldtype(FIELDTYPE *type1,
+                      FIELDTYPE *type2);
+
+

This function creates a field type that will accept any of the + values legal for either of its argument field types (which may be + either predefined or programmer-defined). If a + set_field_type() call later requires arguments, the + new composite type expects all arguments for the first type, than + all arguments for the second. Order functions (see Order Requests) associated with the component types + will work on the composite; what it does is check the validation + function for the first type, then for the second, to figure what + type the buffer contents should be treated as.

+ +

New Field Types

+ +

To create a field type from scratch, you need to specify one + or both of the following things:

+ +
    +
  • A character-validation function, to check each character as + it is entered.
  • + +
  • A field-validation function to be applied on exit from the + field.
  • +
+ +

Here is how you do that:

+ +
+typedef int     (*HOOK)();       /* pointer to function returning int */
+
+FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */
+                         HOOK c_validate) /* character validator */
+
+int free_fieldtype(FIELDTYPE *ftype);     /* type to free */
+
+

At least one of the arguments of new_fieldtype() + must be non-NULL. The forms driver will automatically call the + new type's validation functions at appropriate points in + processing a field of the new type.

+ +

The function free_fieldtype() deallocates the + argument fieldtype, freeing all storage associated with it.

+ +

Normally, a field validator is called when the user attempts + to leave the field. Its first argument is a field pointer, from + which it can get to field buffer 0 and test it. If the function + returns TRUE, the operation succeeds; if it returns FALSE, the + edit cursor stays in the field.

+ +

A character validator gets the character passed in as a first + argument. It too should return TRUE if the character is valid, + FALSE otherwise.

+ +

Validation Function + Arguments

+ +

Your field- and character- validation functions will be passed + a second argument as well. This second argument is the address of + a structure (which we will call a pile) built from any + of the field-type-specific arguments passed to + set_field_type(). If no such arguments are defined + for the field type, this pile pointer argument will be NULL.

+ +

In order to arrange for such arguments to be passed to your + validation functions, you must associate a small set of + storage-management functions with the type. The forms driver will + use these to synthesize a pile from the trailing arguments of + each set_field_type() argument, and a pointer to the + pile will be passed to the validation functions.

+ +

Here is how you make the association:

+ +
+typedef char    *(*PTRHOOK)();    /* pointer to function returning (char *) */
+typedef void    (*VOIDHOOK)();    /* pointer to function returning void */
+
+int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
+                      PTRHOOK make_str,   /* make structure from args */
+                      PTRHOOK copy_str,   /* make copy of structure */
+                      VOIDHOOK free_str); /* free structure storage */
+
+

Here is how the storage-management hooks are used:

+ +
+
make_str +
+ +
This function is called by set_field_type(). + It gets one argument, a va_list of the + type-specific arguments passed to + set_field_type(). It is expected to return a pile + pointer to a data structure that encapsulates those + arguments.
+ +
copy_str +
+ +
This function is called by form library functions that + allocate new field instances. It is expected to take a pile + pointer, copy the pile to allocated storage, and return the + address of the pile copy.
+ +
free_str +
+ +
This function is called by field- and type-deallocation + routines in the library. It takes a pile pointer argument, and + is expected to free the storage of that pile.
+
+ +

The make_str and copy_str functions + may return NULL to signal allocation failure. The library + routines will that call them will return error indication when + this happens. Thus, your validation functions should never see a + NULL file pointer and need not check specially for it.

+ +

Order Functions For + Custom Types

+ +

Some custom field types are simply ordered in the same + well-defined way that TYPE_ENUM is. For such types, + it is possible to define successor and predecessor functions to + support the REQ_NEXT_CHOICE and + REQ_PREV_CHOICE requests. Here is how:

+ +
+typedef int     (*INTHOOK)();     /* pointer to function returning int */
+
+int set_fieldtype_arg(FIELDTYPE *type,    /* type to alter */
+                      INTHOOK succ,       /* get successor value */
+                      INTHOOK pred);      /* get predecessor value */
+
+

The successor and predecessor arguments will each be passed + two arguments; a field pointer, and a pile pointer (as for the + validation functions). They are expected to use the function + field_buffer() to read the current value, and + set_field_buffer() on buffer 0 to set the next or + previous value. Either hook may return TRUE to indicate success + (a legal next or previous value was set) or FALSE to indicate + failure.

+ +

Avoiding Problems

+ +

The interface for defining custom types is complicated and + tricky. Rather than attempting to create a custom type entirely + from scratch, you should start by studying the library source + code for whichever of the pre-defined types seems to be closest + to what you want.

+ +

Use that code as a model, and evolve it towards what you + really want. You will avoid many problems and annoyances that + way. The code in the ncurses library has been + specifically exempted from the package copyright to support + this.

+ +

If your custom type defines order functions, have do something + intuitive with a blank field. A useful convention is to make the + successor of a blank field the types minimum value, and its + predecessor the maximum.

+ + diff --git a/contrib/ncurses/doc/ncurses-intro.doc b/contrib/ncurses/doc/ncurses-intro.doc new file mode 100644 index 00000000..87f092d1 --- /dev/null +++ b/contrib/ncurses/doc/ncurses-intro.doc @@ -0,0 +1,2518 @@ + Writing Programs with NCURSES + +Writing Programs with NCURSES + + by Eric S. Raymond and Zeyd M. Ben-Halim + updates since release 1.9.9e by Thomas Dickey + +Contents + + * Introduction + + A Brief History of Curses + + Scope of This Document + + Terminology + * The Curses Library + + An Overview of Curses + o Compiling Programs using Curses + o Updating the Screen + o Standard Windows and Function Naming Conventions + o Variables + + Using the Library + o Starting up + o Output + o Input + o Using Forms Characters + o Character Attributes and Color + o Mouse Interfacing + o Finishing Up + + Function Descriptions + o Initialization and Wrapup + o Causing Output to the Terminal + o Low-Level Capability Access + o Debugging + + Hints, Tips, and Tricks + o Some Notes of Caution + o Temporarily Leaving ncurses Mode + o Using ncurses under xterm + o Handling Multiple Terminal Screens + o Testing for Terminal Capabilities + o Tuning for Speed + o Special Features of ncurses + + Compatibility with Older Versions + o Refresh of Overlapping Windows + o Background Erase + + XSI Curses Conformance + * The Panels Library + + Compiling With the Panels Library + + Overview of Panels + + Panels, Input, and the Standard Screen + + Hiding Panels + + Miscellaneous Other Facilities + * The Menu Library + + Compiling with the menu Library + + Overview of Menus + + Selecting items + + Menu Display + + Menu Windows + + Processing Menu Input + + Miscellaneous Other Features + * The Forms Library + + Compiling with the forms Library + + Overview of Forms + + Creating and Freeing Fields and Forms + + Fetching and Changing Field Attributes + o Fetching Size and Location Data + o Changing the Field Location + o The Justification Attribute + o Field Display Attributes + o Field Option Bits + o Field Status + o Field User Pointer + + Variable-Sized Fields + + Field Validation + o TYPE_ALPHA + o TYPE_ALNUM + o TYPE_ENUM + o TYPE_INTEGER + o TYPE_NUMERIC + o TYPE_REGEXP + + Direct Field Buffer Manipulation + + Attributes of Forms + + Control of Form Display + + Input Processing in the Forms Driver + o Page Navigation Requests + o Inter-Field Navigation Requests + o Intra-Field Navigation Requests + o Scrolling Requests + o Field Editing Requests + o Order Requests + o Application Commands + + Field Change Hooks + + Field Change Commands + + Form Options + + Custom Validation Types + o Union Types + o New Field Types + o Validation Function Arguments + o Order Functions For Custom Types + o Avoiding Problems + _________________________________________________________________ + +Introduction + + This document is an introduction to programming with curses. It is not + an exhaustive reference for the curses Application Programming + Interface (API); that role is filled by the curses manual pages. + Rather, it is intended to help C programmers ease into using the + package. + + This document is aimed at C applications programmers not yet + specifically familiar with ncurses. If you are already an experienced + curses programmer, you should nevertheless read the sections on Mouse + Interfacing, Debugging, Compatibility with Older Versions, and Hints, + Tips, and Tricks. These will bring you up to speed on the special + features and quirks of the ncurses implementation. If you are not so + experienced, keep reading. + + The curses package is a subroutine library for terminal-independent + screen-painting and input-event handling which presents a high level + screen model to the programmer, hiding differences between terminal + types and doing automatic optimization of output to change one screen + full of text into another. Curses uses terminfo, which is a database + format that can describe the capabilities of thousands of different + terminals. + + The curses API may seem something of an archaism on UNIX desktops + increasingly dominated by X, Motif, and Tcl/Tk. Nevertheless, UNIX + still supports tty lines and X supports xterm(1); the curses API has + the advantage of (a) back-portability to character-cell terminals, and + (b) simplicity. For an application that does not require bit-mapped + graphics and multiple fonts, an interface implementation using curses + will typically be a great deal simpler and less expensive than one + using an X toolkit. + + A Brief History of Curses + + Historically, the first ancestor of curses was the routines written to + provide screen-handling for the vi editor; these used the termcap + database facility (both released in 3BSD) for describing terminal + capabilities. These routines were abstracted into a documented library + and first released with the early BSD UNIX versions. All of this work + was done by students at the University of California (Berkeley + campus). The curses library was first published in 4.0BSD, a year + after 3BSD (i.e., late 1980). + + After graduation, one of those students went to work at AT&T Bell + Labs, and made an improved termcap library called terminfo (i.e., + "libterm"), and adapted the curses library to use this. That was + subsequently released in System V Release 2 (early 1984). Thereafter, + other developers added to the curses and terminfo libraries. For + instance, a student at Cornell University wrote an improved terminfo + library as well as a tool (tic) to compile the terminal descriptions. + As a general rule, AT&T did not identify the developers in the + source-code or documentation; the tic and infocmp programs are the + exceptions. + + System V Release 3 from Bell Labs featured a rewritten and + much-improved curses library, along with the tic program (late 1986). + + To recap, terminfo is based on Berkeley's termcap database, but + contains a number of improvements and extensions. Parameterized + capabilities strings were introduced, making it possible to describe + multiple video attributes, and colors and to handle far more unusual + terminals than possible with termcap. In the later AT&T System V + releases, curses evolved to use more facilities and offer more + capabilities, going far beyond BSD curses in power and flexibility. + + Scope of This Document + + This document describes ncurses, a free implementation of the System V + curses API with some clearly marked extensions. It includes the + following System V curses features: + * Support for multiple screen highlights (BSD curses could only + handle one "standout" highlight, usually reverse-video). + * Support for line- and box-drawing using forms characters. + * Recognition of function keys on input. + * Color support. + * Support for pads (windows of larger than screen size on which the + screen or a subwindow defines a viewport). + + Also, this package makes use of the insert and delete line and + character features of terminals so equipped, and determines how to + optimally use these features with no help from the programmer. It + allows arbitrary combinations of video attributes to be displayed, + even on terminals that leave "magic cookies" on the screen to mark + changes in attributes. + + The ncurses package can also capture and use event reports from a + mouse in some environments (notably, xterm under the X window system). + This document includes tips for using the mouse. + + The ncurses package was originated by Pavel Curtis. The original + maintainer of this package is Zeyd Ben-Halim . + Eric S. Raymond wrote many of the new features + in versions after 1.8.1 and wrote most of this introduction. Juergen + Pfeifer wrote all of the menu and forms code as well as the Ada95 + binding. Ongoing work is being done by Thomas Dickey (maintainer). + Contact the current maintainers at bug-ncurses@gnu.org. + + This document also describes the panels extension library, similarly + modeled on the SVr4 panels facility. This library allows you to + associate backing store with each of a stack or deck of overlapping + windows, and provides operations for moving windows around in the + stack that change their visibility in the natural way (handling window + overlaps). + + Finally, this document describes in detail the menus and forms + extension libraries, also cloned from System V, which support easy + construction and sequences of menus and fill-in forms. + + Terminology + + In this document, the following terminology is used with reasonable + consistency: + + window + A data structure describing a sub-rectangle of the screen + (possibly the entire screen). You can write to a window as + though it were a miniature screen, scrolling independently of + other windows on the physical screen. + + screens + A subset of windows which are as large as the terminal screen, + i.e., they start at the upper left hand corner and encompass + the lower right hand corner. One of these, stdscr, is + automatically provided for the programmer. + + terminal screen + The package's idea of what the terminal display currently looks + like, i.e., what the user sees now. This is a special screen. + +The Curses Library + + An Overview of Curses + + Compiling Programs using Curses + + In order to use the library, it is necessary to have certain types and + variables defined. Therefore, the programmer must have a line: + #include + + at the top of the program source. The screen package uses the Standard + I/O library, so includes . also + includes , , or depending on your + system. It is redundant (but harmless) for the programmer to do these + includes, too. In linking with curses you need to have -lncurses in + your LDFLAGS or on the command line. There is no need for any other + libraries. + + Updating the Screen + + In order to update the screen optimally, it is necessary for the + routines to know what the screen currently looks like and what the + programmer wants it to look like next. For this purpose, a data type + (structure) named WINDOW is defined which describes a window image to + the routines, including its starting position on the screen (the (y, + x) coordinates of the upper left hand corner) and its size. One of + these (called curscr, for current screen) is a screen image of what + the terminal currently looks like. Another screen (called stdscr, for + standard screen) is provided by default to make changes on. + + A window is a purely internal representation. It is used to build and + store a potential image of a portion of the terminal. It does not bear + any necessary relation to what is really on the terminal screen; it is + more like a scratchpad or write buffer. + + To make the section of physical screen corresponding to a window + reflect the contents of the window structure, the routine refresh() + (or wrefresh() if the window is not stdscr) is called. + + A given physical screen section may be within the scope of any number + of overlapping windows. Also, changes can be made to windows in any + order, without regard to motion efficiency. Then, at will, the + programmer can effectively say "make it look like this," and let the + package implementation determine the most efficient way to repaint the + screen. + + Standard Windows and Function Naming Conventions + + As hinted above, the routines can use several windows, but two are + automatically given: curscr, which knows what the terminal looks like, + and stdscr, which is what the programmer wants the terminal to look + like next. The user should never actually access curscr directly. + Changes should be made to through the API, and then the routine + refresh() (or wrefresh()) called. + + Many functions are defined to use stdscr as a default screen. For + example, to add a character to stdscr, one calls addch() with the + desired character as argument. To write to a different window. use the + routine waddch() (for window-specific addch()) is provided. This + convention of prepending function names with a "w" when they are to be + applied to specific windows is consistent. The only routines which do + not follow it are those for which a window must always be specified. + + In order to move the current (y, x) coordinates from one point to + another, the routines move() and wmove() are provided. However, it is + often desirable to first move and then perform some I/O operation. In + order to avoid clumsiness, most I/O routines can be preceded by the + prefix "mv" and the desired (y, x) coordinates prepended to the + arguments to the function. For example, the calls + move(y, x); + addch(ch); + + can be replaced by + mvaddch(y, x, ch); + + and + wmove(win, y, x); + waddch(win, ch); + + can be replaced by + mvwaddch(win, y, x, ch); + + Note that the window description pointer (win) comes before the added + (y, x) coordinates. If a function requires a window pointer, it is + always the first parameter passed. + + Variables + + The curses library sets some variables describing the terminal + capabilities. + type name description + ------------------------------------------------------------------ + int LINES number of lines on the terminal + int COLS number of columns on the terminal + + The curses.h also introduces some #define constants and types of + general usefulness: + + bool + boolean type, actually a "char" (e.g., bool doneit;) + + TRUE + boolean "true" flag (1). + + FALSE + boolean "false" flag (0). + + ERR + error flag returned by routines on a failure (-1). + + OK + error flag returned by routines when things go right. + + Using the Library + + Now we describe how to actually use the screen package. In it, we + assume all updating, reading, etc. is applied to stdscr. These + instructions will work on any window, providing you change the + function names and parameters as mentioned above. + + Here is a sample program to motivate the discussion: +#include +#include +#include + +static void finish(int sig); + +int +main(int argc, char *argv[]) +{ + int num = 0; + + /* initialize your non-curses data structures here */ + + (void) signal(SIGINT, finish); /* arrange interrupts to terminate */ + + (void) initscr(); /* initialize the curses library */ + keypad(stdscr, TRUE); /* enable keyboard mapping */ + (void) nonl(); /* tell curses not to do NL->CR/NL on output */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) echo(); /* echo input - in color */ + + if (has_colors()) + { + start_color(); + + /* + * Simple color assignment, often all we need. Color pair 0 cannot + * be redefined. This example uses the same value for the color + * pair as for the foreground color, though of course that is not + * necessary: + */ + init_pair(1, COLOR_RED, COLOR_BLACK); + init_pair(2, COLOR_GREEN, COLOR_BLACK); + init_pair(3, COLOR_YELLOW, COLOR_BLACK); + init_pair(4, COLOR_BLUE, COLOR_BLACK); + init_pair(5, COLOR_CYAN, COLOR_BLACK); + init_pair(6, COLOR_MAGENTA, COLOR_BLACK); + init_pair(7, COLOR_WHITE, COLOR_BLACK); + } + + for (;;) + { + int c = getch(); /* refresh, accept single keystroke of input */ + attrset(COLOR_PAIR(num % 8)); + num++; + + /* process the command keystroke */ + } + + finish(0); /* we are done */ +} + +static void finish(int sig) +{ + endwin(); + + /* do your non-curses wrapup here */ + + exit(0); +} + + Starting up + + In order to use the screen package, the routines must know about + terminal characteristics, and the space for curscr and stdscr must be + allocated. These function initscr() does both these things. Since it + must allocate space for the windows, it can overflow memory when + attempting to do so. On the rare occasions this happens, initscr() + will terminate the program with an error message. initscr() must + always be called before any of the routines which affect windows are + used. If it is not, the program will core dump as soon as either + curscr or stdscr are referenced. However, it is usually best to wait + to call it until after you are sure you will need it, like after + checking for startup errors. Terminal status changing routines like + nl() and cbreak() should be called after initscr(). + + Once the screen windows have been allocated, you can set them up for + your program. If you want to, say, allow a screen to scroll, use + scrollok(). If you want the cursor to be left in place after the last + change, use leaveok(). If this is not done, refresh() will move the + cursor to the window's current (y, x) coordinates after updating it. + + You can create new windows of your own using the functions newwin(), + derwin(), and subwin(). The routine delwin() will allow you to get rid + of old windows. All the options described above can be applied to any + window. + + Output + + Now that we have set things up, we will want to actually update the + terminal. The basic functions used to change what will go on a window + are addch() and move(). addch() adds a character at the current (y, x) + coordinates. move() changes the current (y, x) coordinates to whatever + you want them to be. It returns ERR if you try to move off the window. + As mentioned above, you can combine the two into mvaddch() to do both + things at once. + + The other output functions, such as addstr() and printw(), all call + addch() to add characters to the window. + + After you have put on the window what you want there, when you want + the portion of the terminal covered by the window to be made to look + like it, you must call refresh(). In order to optimize finding + changes, refresh() assumes that any part of the window not changed + since the last refresh() of that window has not been changed on the + terminal, i.e., that you have not refreshed a portion of the terminal + with an overlapping window. If this is not the case, the routine + touchwin() is provided to make it look like the entire window has been + changed, thus making refresh() check the whole subsection of the + terminal for changes. + + If you call wrefresh() with curscr as its argument, it will make the + screen look like curscr thinks it looks like. This is useful for + implementing a command which would redraw the screen in case it get + messed up. + + Input + + The complementary function to addch() is getch() which, if echo is + set, will call addch() to echo the character. Since the screen package + needs to know what is on the terminal at all times, if characters are + to be echoed, the tty must be in raw or cbreak mode. Since initially + the terminal has echoing enabled and is in ordinary "cooked" mode, one + or the other has to changed before calling getch(); otherwise, the + program's output will be unpredictable. + + When you need to accept line-oriented input in a window, the functions + wgetstr() and friends are available. There is even a wscanw() function + that can do scanf()(3)-style multi-field parsing on window input. + These pseudo-line-oriented functions turn on echoing while they + execute. + + The example code above uses the call keypad(stdscr, TRUE) to enable + support for function-key mapping. With this feature, the getch() code + watches the input stream for character sequences that correspond to + arrow and function keys. These sequences are returned as + pseudo-character values. The #define values returned are listed in the + curses.h The mapping from sequences to #define values is determined by + key_ capabilities in the terminal's terminfo entry. + + Using Forms Characters + + The addch() function (and some others, including box() and border()) + can accept some pseudo-character arguments which are specially defined + by ncurses. These are #define values set up in the curses.h header; + see there for a complete list (look for the prefix ACS_). + + The most useful of the ACS defines are the forms-drawing characters. + You can use these to draw boxes and simple graphs on the screen. If + the terminal does not have such characters, curses.h will map them to + a recognizable (though ugly) set of ASCII defaults. + + Character Attributes and Color + + The ncurses package supports screen highlights including standout, + reverse-video, underline, and blink. It also supports color, which is + treated as another kind of highlight. + + Highlights are encoded, internally, as high bits of the + pseudo-character type (chtype) that curses.h uses to represent the + contents of a screen cell. See the curses.h header file for a complete + list of highlight mask values (look for the prefix A_). + + There are two ways to make highlights. One is to logical-or the value + of the highlights you want into the character argument of an addch() + call, or any other output call that takes a chtype argument. + + The other is to set the current-highlight value. This is logical-ORed + with any highlight you specify the first way. You do this with the + functions attron(), attroff(), and attrset(); see the manual pages for + details. Color is a special kind of highlight. The package actually + thinks in terms of color pairs, combinations of foreground and + background colors. The sample code above sets up eight color pairs, + all of the guaranteed-available colors on black. Note that each color + pair is, in effect, given the name of its foreground color. Any other + range of eight non-conflicting values could have been used as the + first arguments of the init_pair() values. + + Once you have done an init_pair() that creates color-pair N, you can + use COLOR_PAIR(N) as a highlight that invokes that particular color + combination. Note that COLOR_PAIR(N), for constant N, is itself a + compile-time constant and can be used in initializers. + + Mouse Interfacing + + The ncurses library also provides a mouse interface. + + NOTE: this facility is specific to ncurses, it is not part of + either the XSI Curses standard, nor of System V Release 4, nor BSD + curses. System V Release 4 curses contains code with similar + interface definitions, however it is not documented. Other than by + disassembling the library, we have no way to determine exactly how + that mouse code works. Thus, we recommend that you wrap + mouse-related code in an #ifdef using the feature macro + NCURSES_MOUSE_VERSION so it will not be compiled and linked on + non-ncurses systems. + + Presently, mouse event reporting works in the following environments: + * xterm and similar programs such as rxvt. + * Linux console, when configured with gpm(1), Alessandro Rubini's + mouse server. + * FreeBSD sysmouse (console) + * OS/2 EMX + + The mouse interface is very simple. To activate it, you use the + function mousemask(), passing it as first argument a bit-mask that + specifies what kinds of events you want your program to be able to + see. It will return the bit-mask of events that actually become + visible, which may differ from the argument if the mouse device is not + capable of reporting some of the event types you specify. + + Once the mouse is active, your application's command loop should watch + for a return value of KEY_MOUSE from wgetch(). When you see this, a + mouse event report has been queued. To pick it off the queue, use the + function getmouse() (you must do this before the next wgetch(), + otherwise another mouse event might come in and make the first one + inaccessible). + + Each call to getmouse() fills a structure (the address of which you + will pass it) with mouse event data. The event data includes + zero-origin, screen-relative character-cell coordinates of the mouse + pointer. It also includes an event mask. Bits in this mask will be + set, corresponding to the event type being reported. + + The mouse structure contains two additional fields which may be + significant in the future as ncurses interfaces to new kinds of + pointing device. In addition to x and y coordinates, there is a slot + for a z coordinate; this might be useful with touch-screens that can + return a pressure or duration parameter. There is also a device ID + field, which could be used to distinguish between multiple pointing + devices. + + The class of visible events may be changed at any time via + mousemask(). Events that can be reported include presses, releases, + single-, double- and triple-clicks (you can set the maximum + button-down time for clicks). If you do not make clicks visible, they + will be reported as press-release pairs. In some environments, the + event mask may include bits reporting the state of shift, alt, and + ctrl keys on the keyboard during the event. + + A function to check whether a mouse event fell within a given window + is also supplied. You can use this to see whether a given window + should consider a mouse event relevant to it. + + Because mouse event reporting will not be available in all + environments, it would be unwise to build ncurses applications that + require the use of a mouse. Rather, you should use the mouse as a + shortcut for point-and-shoot commands your application would normally + accept from the keyboard. Two of the test games in the ncurses + distribution (bs and knight) contain code that illustrates how this + can be done. + + See the manual page curs_mouse(3X) for full details of the + mouse-interface functions. + + Finishing Up + + In order to clean up after the ncurses routines, the routine endwin() + is provided. It restores tty modes to what they were when initscr() + was first called, and moves the cursor down to the lower-left corner. + Thus, anytime after the call to initscr, endwin() should be called + before exiting. + + Function Descriptions + + We describe the detailed behavior of some important curses functions + here, as a supplement to the manual page descriptions. + + Initialization and Wrapup + + initscr() + The first function called should almost always be initscr(). + This will determine the terminal type and initialize curses + data structures. initscr() also arranges that the first call to + refresh() will clear the screen. If an error occurs a message + is written to standard error and the program exits. Otherwise + it returns a pointer to stdscr. A few functions may be called + before initscr (slk_init(), filter(), ripoffline(), use_env(), + and, if you are using multiple terminals, newterm().) + + endwin() + Your program should always call endwin() before exiting or + shelling out of the program. This function will restore tty + modes, move the cursor to the lower left corner of the screen, + reset the terminal into the proper non-visual mode. Calling + refresh() or doupdate() after a temporary escape from the + program will restore the ncurses screen from before the escape. + + newterm(type, ofp, ifp) + A program which outputs to more than one terminal should use + newterm() instead of initscr(). newterm() should be called once + for each terminal. It returns a variable of type SCREEN * which + should be saved as a reference to that terminal. (NOTE: a + SCREEN variable is not a screen in the sense we are describing + in this introduction, but a collection of parameters used to + assist in optimizing the display.) The arguments are the type + of the terminal (a string) and FILE pointers for the output and + input of the terminal. If type is NULL then the environment + variable $TERM is used. endwin() should called once at wrapup + time for each terminal opened using this function. + + set_term(new) + This function is used to switch to a different terminal + previously opened by newterm(). The screen reference for the + new terminal is passed as the parameter. The previous terminal + is returned by the function. All other calls affect only the + current terminal. + + delscreen(sp) + The inverse of newterm(); deallocates the data structures + associated with a given SCREEN reference. + + Causing Output to the Terminal + + refresh() and wrefresh(win) + These functions must be called to actually get any output on + the terminal, as other routines merely manipulate data + structures. wrefresh() copies the named window to the physical + terminal screen, taking into account what is already there in + order to do optimizations. refresh() does a refresh of stdscr. + Unless leaveok() has been enabled, the physical cursor of the + terminal is left at the location of the window's cursor. + + doupdate() and wnoutrefresh(win) + These two functions allow multiple updates with more efficiency + than wrefresh. To use them, it is important to understand how + curses works. In addition to all the window structures, curses + keeps two data structures representing the terminal screen: a + physical screen, describing what is actually on the screen, and + a virtual screen, describing what the programmer wants to have + on the screen. wrefresh works by first copying the named window + to the virtual screen (wnoutrefresh()), and then calling the + routine to update the screen (doupdate()). If the programmer + wishes to output several windows at once, a series of calls to + wrefresh will result in alternating calls to wnoutrefresh() and + doupdate(), causing several bursts of output to the screen. By + calling wnoutrefresh() for each window, it is then possible to + call doupdate() once, resulting in only one burst of output, + with fewer total characters transmitted (this also avoids a + visually annoying flicker at each update). + + Low-Level Capability Access + + setupterm(term, filenum, errret) + This routine is called to initialize a terminal's description, + without setting up the curses screen structures or changing the + tty-driver mode bits. term is the character string representing + the name of the terminal being used. filenum is the UNIX file + descriptor of the terminal to be used for output. errret is a + pointer to an integer, in which a success or failure indication + is returned. The values returned can be 1 (all is well), 0 (no + such terminal), or -1 (some problem locating the terminfo + database). + + The value of term can be given as NULL, which will cause the + value of TERM in the environment to be used. The errret pointer + can also be given as NULL, meaning no error code is wanted. If + errret is defaulted, and something goes wrong, setupterm() will + print an appropriate error message and exit, rather than + returning. Thus, a simple program can call setupterm(0, 1, 0) + and not worry about initialization errors. + + After the call to setupterm(), the global variable cur_term is + set to point to the current structure of terminal capabilities. + By calling setupterm() for each terminal, and saving and + restoring cur_term, it is possible for a program to use two or + more terminals at once. Setupterm() also stores the names + section of the terminal description in the global character + array ttytype[]. Subsequent calls to setupterm() will overwrite + this array, so you will have to save it yourself if need be. + + Debugging + + NOTE: These functions are not part of the standard curses API! + + trace() + This function can be used to explicitly set a trace level. If + the trace level is nonzero, execution of your program will + generate a file called "trace" in the current working directory + containing a report on the library's actions. Higher trace + levels enable more detailed (and verbose) reporting -- see + comments attached to TRACE_ defines in the curses.h file for + details. (It is also possible to set a trace level by assigning + a trace level value to the environment variable NCURSES_TRACE). + + _tracef() + This function can be used to output your own debugging + information. It is only available only if you link with + -lncurses_g. It can be used the same way as printf(), only it + outputs a newline after the end of arguments. The output goes + to a file called trace in the current directory. + + Trace logs can be difficult to interpret due to the sheer volume of + data dumped in them. There is a script called tracemunch included with + the ncurses distribution that can alleviate this problem somewhat; it + compacts long sequences of similar operations into more succinct + single-line pseudo-operations. These pseudo-ops can be distinguished + by the fact that they are named in capital letters. + + Hints, Tips, and Tricks + + The ncurses manual pages are a complete reference for this library. In + the remainder of this document, we discuss various useful methods that + may not be obvious from the manual page descriptions. + + Some Notes of Caution + + If you find yourself thinking you need to use noraw() or nocbreak(), + think again and move carefully. It is probably better design to use + getstr() or one of its relatives to simulate cooked mode. The noraw() + and nocbreak() functions try to restore cooked mode, but they may end + up clobbering some control bits set before you started your + application. Also, they have always been poorly documented, and are + likely to hurt your application's usability with other curses + libraries. + + Bear in mind that refresh() is a synonym for wrefresh(stdscr). Do not + try to mix use of stdscr with use of windows declared by newwin(); a + refresh() call will blow them off the screen. The right way to handle + this is to use subwin(), or not touch stdscr at all and tile your + screen with declared windows which you then wnoutrefresh() somewhere + in your program event loop, with a single doupdate() call to trigger + actual repainting. + + You are much less likely to run into problems if you design your + screen layouts to use tiled rather than overlapping windows. + Historically, curses support for overlapping windows has been weak, + fragile, and poorly documented. The ncurses library is not yet an + exception to this rule. + + There is a panels library included in the ncurses distribution that + does a pretty good job of strengthening the overlapping-windows + facilities. + + Try to avoid using the global variables LINES and COLS. Use getmaxyx() + on the stdscr context instead. Reason: your code may be ported to run + in an environment with window resizes, in which case several screens + could be open with different sizes. + + Temporarily Leaving NCURSES Mode + + Sometimes you will want to write a program that spends most of its + time in screen mode, but occasionally returns to ordinary "cooked" + mode. A common reason for this is to support shell-out. This behavior + is simple to arrange in ncurses. + + To leave ncurses mode, call endwin() as you would if you were + intending to terminate the program. This will take the screen back to + cooked mode; you can do your shell-out. When you want to return to + ncurses mode, simply call refresh() or doupdate(). This will repaint + the screen. + + There is a boolean function, isendwin(), which code can use to test + whether ncurses screen mode is active. It returns TRUE in the interval + between an endwin() call and the following refresh(), FALSE otherwise. + + Here is some sample code for shellout: + addstr("Shelling out..."); + def_prog_mode(); /* save current tty modes */ + endwin(); /* restore original tty modes */ + system("sh"); /* run shell */ + addstr("returned.\n"); /* prepare return message */ + refresh(); /* restore save modes, repaint screen */ + + Using NCURSES under XTERM + + A resize operation in X sends SIGWINCH to the application running + under xterm. The easiest way to handle SIGWINCH is to do an endwin, + followed by an refresh and a screen repaint you code yourself. The + refresh will pick up the new screen size from the xterm's environment. + + That is the standard way, of course (it even works with some vendor's + curses implementations). Its drawback is that it clears the screen to + reinitialize the display, and does not resize subwindows which must be + shrunk. Ncurses provides an extension which works better, the + resizeterm function. That function ensures that all windows are + limited to the new screen dimensions, and pads stdscr with blanks if + the screen is larger. + + The ncurses library provides a SIGWINCH signal handler, which pushes a + KEY_RESIZE via the wgetch() calls. When ncurses returns that code, it + calls resizeterm to update the size of the standard screen's window, + repainting that (filling with blanks or truncating as needed). It also + resizes other windows, but its effect may be less satisfactory because + it cannot know how you want the screen re-painted. You will usually + have to write special-purpose code to handle KEY_RESIZE yourself. + + Handling Multiple Terminal Screens + + The initscr() function actually calls a function named newterm() to do + most of its work. If you are writing a program that opens multiple + terminals, use newterm() directly. + + For each call, you will have to specify a terminal type and a pair of + file pointers; each call will return a screen reference, and stdscr + will be set to the last one allocated. You will switch between screens + with the set_term call. Note that you will also have to call + def_shell_mode and def_prog_mode on each tty yourself. + + Testing for Terminal Capabilities + + Sometimes you may want to write programs that test for the presence of + various capabilities before deciding whether to go into ncurses mode. + An easy way to do this is to call setupterm(), then use the functions + tigetflag(), tigetnum(), and tigetstr() to do your testing. + + A particularly useful case of this often comes up when you want to + test whether a given terminal type should be treated as "smart" + (cursor-addressable) or "stupid". The right way to test this is to see + if the return value of tigetstr("cup") is non-NULL. Alternatively, you + can include the term.h file and test the value of the macro + cursor_address. + + Tuning for Speed + + Use the addchstr() family of functions for fast screen-painting of + text when you know the text does not contain any control characters. + Try to make attribute changes infrequent on your screens. Do not use + the immedok() option! + + Special Features of NCURSES + + The wresize() function allows you to resize a window in place. The + associated resizeterm() function simplifies the construction of + SIGWINCH handlers, for resizing all windows. + + The define_key() function allows you to define at runtime function-key + control sequences which are not in the terminal description. The + keyok() function allows you to temporarily enable or disable + interpretation of any function-key control sequence. + + The use_default_colors() function allows you to construct applications + which can use the terminal's default foreground and background colors + as an additional "default" color. Several terminal emulators support + this feature, which is based on ISO 6429. + + Ncurses supports up 16 colors, unlike SVr4 curses which defines only + 8. While most terminals which provide color allow only 8 colors, about + a quarter (including XFree86 xterm) support 16 colors. + + Compatibility with Older Versions + + Despite our best efforts, there are some differences between ncurses + and the (undocumented!) behavior of older curses implementations. + These arise from ambiguities or omissions in the documentation of the + API. + + Refresh of Overlapping Windows + + If you define two windows A and B that overlap, and then alternately + scribble on and refresh them, the changes made to the overlapping + region under historic curses versions were often not documented + precisely. + + To understand why this is a problem, remember that screen updates are + calculated between two representations of the entire display. The + documentation says that when you refresh a window, it is first copied + to the virtual screen, and then changes are calculated to update the + physical screen (and applied to the terminal). But "copied to" is not + very specific, and subtle differences in how copying works can produce + different behaviors in the case where two overlapping windows are each + being refreshed at unpredictable intervals. + + What happens to the overlapping region depends on what wnoutrefresh() + does with its argument -- what portions of the argument window it + copies to the virtual screen. Some implementations do "change copy", + copying down only locations in the window that have changed (or been + marked changed with wtouchln() and friends). Some implementations do + "entire copy", copying all window locations to the virtual screen + whether or not they have changed. + + The ncurses library itself has not always been consistent on this + score. Due to a bug, versions 1.8.7 to 1.9.8a did entire copy. + Versions 1.8.6 and older, and versions 1.9.9 and newer, do change + copy. + + For most commercial curses implementations, it is not documented and + not known for sure (at least not to the ncurses maintainers) whether + they do change copy or entire copy. We know that System V release 3 + curses has logic in it that looks like an attempt to do change copy, + but the surrounding logic and data representations are sufficiently + complex, and our knowledge sufficiently indirect, that it is hard to + know whether this is reliable. It is not clear what the SVr4 + documentation and XSI standard intend. The XSI Curses standard barely + mentions wnoutrefresh(); the SVr4 documents seem to be describing + entire-copy, but it is possible with some effort and straining to read + them the other way. + + It might therefore be unwise to rely on either behavior in programs + that might have to be linked with other curses implementations. + Instead, you can do an explicit touchwin() before the wnoutrefresh() + call to guarantee an entire-contents copy anywhere. + + The really clean way to handle this is to use the panels library. If, + when you want a screen update, you do update_panels(), it will do all + the necessary wnoutrefresh() calls for whatever panel stacking order + you have defined. Then you can do one doupdate() and there will be a + single burst of physical I/O that will do all your updates. + + Background Erase + + If you have been using a very old versions of ncurses (1.8.7 or older) + you may be surprised by the behavior of the erase functions. In older + versions, erased areas of a window were filled with a blank modified + by the window's current attribute (as set by wattrset(), wattron(), + wattroff() and friends). + + In newer versions, this is not so. Instead, the attribute of erased + blanks is normal unless and until it is modified by the functions + bkgdset() or wbkgdset(). + + This change in behavior conforms ncurses to System V Release 4 and the + XSI Curses standard. + + XSI Curses Conformance + + The ncurses library is intended to be base-level conformant with the + XSI Curses standard from X/Open. Many extended-level features (in + fact, almost all features not directly concerned with wide characters + and internationalization) are also supported. + + One effect of XSI conformance is the change in behavior described + under "Background Erase -- Compatibility with Old Versions". + + Also, ncurses meets the XSI requirement that every macro entry point + have a corresponding function which may be linked (and will be + prototype-checked) if the macro definition is disabled with #undef. + +The Panels Library + + The ncurses library by itself provides good support for screen + displays in which the windows are tiled (non-overlapping). In the more + general case that windows may overlap, you have to use a series of + wnoutrefresh() calls followed by a doupdate(), and be careful about + the order you do the window refreshes in. It has to be bottom-upwards, + otherwise parts of windows that should be obscured will show through. + + When your interface design is such that windows may dive deeper into + the visibility stack or pop to the top at runtime, the resulting + book-keeping can be tedious and difficult to get right. Hence the + panels library. + + The panel library first appeared in AT&T System V. The version + documented here is the panel code distributed with ncurses. + + Compiling With the Panels Library + + Your panels-using modules must import the panels library declarations + with + #include + + and must be linked explicitly with the panels library using an -lpanel + argument. Note that they must also link the ncurses library with + -lncurses. Many linkers are two-pass and will accept either order, but + it is still good practice to put -lpanel first and -lncurses second. + + Overview of Panels + + A panel object is a window that is implicitly treated as part of a + deck including all other panel objects. The deck has an implicit + bottom-to-top visibility order. The panels library includes an update + function (analogous to refresh()) that displays all panels in the deck + in the proper order to resolve overlaps. The standard window, stdscr, + is considered below all panels. + + Details on the panels functions are available in the man pages. We + will just hit the highlights here. + + You create a panel from a window by calling new_panel() on a window + pointer. It then becomes the top of the deck. The panel's window is + available as the value of panel_window() called with the panel pointer + as argument. + + You can delete a panel (removing it from the deck) with del_panel. + This will not deallocate the associated window; you have to do that + yourself. You can replace a panel's window with a different window by + calling replace_window. The new window may be of different size; the + panel code will re-compute all overlaps. This operation does not + change the panel's position in the deck. + + To move a panel's window, use move_panel(). The mvwin() function on + the panel's window is not sufficient because it does not update the + panels library's representation of where the windows are. This + operation leaves the panel's depth, contents, and size unchanged. + + Two functions (top_panel(), bottom_panel()) are provided for + rearranging the deck. The first pops its argument window to the top of + the deck; the second sends it to the bottom. Either operation leaves + the panel's screen location, contents, and size unchanged. + + The function update_panels() does all the wnoutrefresh() calls needed + to prepare for doupdate() (which you must call yourself, afterwards). + + Typically, you will want to call update_panels() and doupdate() just + before accepting command input, once in each cycle of interaction with + the user. If you call update_panels() after each and every panel + write, you will generate a lot of unnecessary refresh activity and + screen flicker. + + Panels, Input, and the Standard Screen + + You should not mix wnoutrefresh() or wrefresh() operations with panels + code; this will work only if the argument window is either in the top + panel or unobscured by any other panels. + + The stsdcr window is a special case. It is considered below all + panels. Because changes to panels may obscure parts of stdscr, though, + you should call update_panels() before doupdate() even when you only + change stdscr. + + Note that wgetch automatically calls wrefresh. Therefore, before + requesting input from a panel window, you need to be sure that the + panel is totally unobscured. + + There is presently no way to display changes to one obscured panel + without repainting all panels. + + Hiding Panels + + It is possible to remove a panel from the deck temporarily; use + hide_panel for this. Use show_panel() to render it visible again. The + predicate function panel_hidden tests whether or not a panel is + hidden. + + The panel_update code ignores hidden panels. You cannot do top_panel() + or bottom_panel on a hidden panel(). Other panels operations are + applicable. + + Miscellaneous Other Facilities + + It is possible to navigate the deck using the functions panel_above() + and panel_below. Handed a panel pointer, they return the panel above + or below that panel. Handed NULL, they return the bottom-most or + top-most panel. + + Every panel has an associated user pointer, not used by the panel + code, to which you can attach application data. See the man page + documentation of set_panel_userptr() and panel_userptr for details. + +The Menu Library + + A menu is a screen display that assists the user to choose some subset + of a given set of items. The menu library is a curses extension that + supports easy programming of menu hierarchies with a uniform but + flexible interface. + + The menu library first appeared in AT&T System V. The version + documented here is the menu code distributed with ncurses. + + Compiling With the menu Library + + Your menu-using modules must import the menu library declarations with + #include + + and must be linked explicitly with the menus library using an -lmenu + argument. Note that they must also link the ncurses library with + -lncurses. Many linkers are two-pass and will accept either order, but + it is still good practice to put -lmenu first and -lncurses second. + + Overview of Menus + + The menus created by this library consist of collections of items + including a name string part and a description string part. To make + menus, you create groups of these items and connect them with menu + frame objects. + + The menu can then by posted, that is written to an associated window. + Actually, each menu has two associated windows; a containing window in + which the programmer can scribble titles or borders, and a subwindow + in which the menu items proper are displayed. If this subwindow is too + small to display all the items, it will be a scrollable viewport on + the collection of items. + + A menu may also be unposted (that is, undisplayed), and finally freed + to make the storage associated with it and its items available for + re-use. + + The general flow of control of a menu program looks like this: + 1. Initialize curses. + 2. Create the menu items, using new_item(). + 3. Create the menu using new_menu(). + 4. Post the menu using post_menu(). + 5. Refresh the screen. + 6. Process user requests via an input loop. + 7. Unpost the menu using unpost_menu(). + 8. Free the menu, using free_menu(). + 9. Free the items using free_item(). + 10. Terminate curses. + + Selecting items + + Menus may be multi-valued or (the default) single-valued (see the + manual page menu_opts(3x) to see how to change the default). Both + types always have a current item. + + From a single-valued menu you can read the selected value simply by + looking at the current item. From a multi-valued menu, you get the + selected set by looping through the items applying the item_value() + predicate function. Your menu-processing code can use the function + set_item_value() to flag the items in the select set. + + Menu items can be made unselectable using set_item_opts() or + item_opts_off() with the O_SELECTABLE argument. This is the only + option so far defined for menus, but it is good practice to code as + though other option bits might be on. + + Menu Display + + The menu library calculates a minimum display size for your window, + based on the following variables: + * The number and maximum length of the menu items + * Whether the O_ROWMAJOR option is enabled + * Whether display of descriptions is enabled + * Whatever menu format may have been set by the programmer + * The length of the menu mark string used for highlighting selected + items + + The function set_menu_format() allows you to set the maximum size of + the viewport or menu page that will be used to display menu items. You + can retrieve any format associated with a menu with menu_format(). The + default format is rows=16, columns=1. + + The actual menu page may be smaller than the format size. This depends + on the item number and size and whether O_ROWMAJOR is on. This option + (on by default) causes menu items to be displayed in a "raster-scan" + pattern, so that if more than one item will fit horizontally the first + couple of items are side-by-side in the top row. The alternative is + column-major display, which tries to put the first several items in + the first column. + + As mentioned above, a menu format not large enough to allow all items + to fit on-screen will result in a menu display that is vertically + scrollable. + + You can scroll it with requests to the menu driver, which will be + described in the section on menu input handling. + + Each menu has a mark string used to visually tag selected items; see + the menu_mark(3x) manual page for details. The mark string length also + influences the menu page size. + + The function scale_menu() returns the minimum display size that the + menu code computes from all these factors. There are other menu + display attributes including a select attribute, an attribute for + selectable items, an attribute for unselectable items, and a pad + character used to separate item name text from description text. These + have reasonable defaults which the library allows you to change (see + the menu_attribs(3x) manual page. + + Menu Windows + + Each menu has, as mentioned previously, a pair of associated windows. + Both these windows are painted when the menu is posted and erased when + the menu is unposted. + + The outer or frame window is not otherwise touched by the menu + routines. It exists so the programmer can associate a title, a border, + or perhaps help text with the menu and have it properly refreshed or + erased at post/unpost time. The inner window or subwindow is where the + current menu page is displayed. + + By default, both windows are stdscr. You can set them with the + functions in menu_win(3x). + + When you call post_menu(), you write the menu to its subwindow. When + you call unpost_menu(), you erase the subwindow, However, neither of + these actually modifies the screen. To do that, call wrefresh() or + some equivalent. + + Processing Menu Input + + The main loop of your menu-processing code should call menu_driver() + repeatedly. The first argument of this routine is a menu pointer; the + second is a menu command code. You should write an input-fetching + routine that maps input characters to menu command codes, and pass its + output to menu_driver(). The menu command codes are fully documented + in menu_driver(3x). + + The simplest group of command codes is REQ_NEXT_ITEM, REQ_PREV_ITEM, + REQ_FIRST_ITEM, REQ_LAST_ITEM, REQ_UP_ITEM, REQ_DOWN_ITEM, + REQ_LEFT_ITEM, REQ_RIGHT_ITEM. These change the currently selected + item. These requests may cause scrolling of the menu page if it only + partially displayed. + + There are explicit requests for scrolling which also change the + current item (because the select location does not change, but the + item there does). These are REQ_SCR_DLINE, REQ_SCR_ULINE, + REQ_SCR_DPAGE, and REQ_SCR_UPAGE. + + The REQ_TOGGLE_ITEM selects or deselects the current item. It is for + use in multi-valued menus; if you use it with O_ONEVALUE on, you will + get an error return (E_REQUEST_DENIED). + + Each menu has an associated pattern buffer. The menu_driver() logic + tries to accumulate printable ASCII characters passed in in that + buffer; when it matches a prefix of an item name, that item (or the + next matching item) is selected. If appending a character yields no + new match, that character is deleted from the pattern buffer, and + menu_driver() returns E_NO_MATCH. + + Some requests change the pattern buffer directly: REQ_CLEAR_PATTERN, + REQ_BACK_PATTERN, REQ_NEXT_MATCH, REQ_PREV_MATCH. The latter two are + useful when pattern buffer input matches more than one item in a + multi-valued menu. + + Each successful scroll or item navigation request clears the pattern + buffer. It is also possible to set the pattern buffer explicitly with + set_menu_pattern(). + + Finally, menu driver requests above the constant MAX_COMMAND are + considered application-specific commands. The menu_driver() code + ignores them and returns E_UNKNOWN_COMMAND. + + Miscellaneous Other Features + + Various menu options can affect the processing and visual appearance + and input processing of menus. See menu_opts(3x) for details. + + It is possible to change the current item from application code; this + is useful if you want to write your own navigation requests. It is + also possible to explicitly set the top row of the menu display. See + mitem_current(3x). If your application needs to change the menu + subwindow cursor for any reason, pos_menu_cursor() will restore it to + the correct location for continuing menu driver processing. + + It is possible to set hooks to be called at menu initialization and + wrapup time, and whenever the selected item changes. See + menu_hook(3x). + + Each item, and each menu, has an associated user pointer on which you + can hang application data. See mitem_userptr(3x) and menu_userptr(3x). + +The Forms Library + + The form library is a curses extension that supports easy programming + of on-screen forms for data entry and program control. + + The form library first appeared in AT&T System V. The version + documented here is the form code distributed with ncurses. + + Compiling With the form Library + + Your form-using modules must import the form library declarations with + #include + + and must be linked explicitly with the forms library using an -lform + argument. Note that they must also link the ncurses library with + -lncurses. Many linkers are two-pass and will accept either order, but + it is still good practice to put -lform first and -lncurses second. + + Overview of Forms + + A form is a collection of fields; each field may be either a label + (explanatory text) or a data-entry location. Long forms may be + segmented into pages; each entry to a new page clears the screen. + + To make forms, you create groups of fields and connect them with form + frame objects; the form library makes this relatively simple. + + Once defined, a form can be posted, that is written to an associated + window. Actually, each form has two associated windows; a containing + window in which the programmer can scribble titles or borders, and a + subwindow in which the form fields proper are displayed. + + As the form user fills out the posted form, navigation and editing + keys support movement between fields, editing keys support modifying + field, and plain text adds to or changes data in a current field. The + form library allows you (the forms designer) to bind each navigation + and editing key to any keystroke accepted by curses Fields may have + validation conditions on them, so that they check input data for type + and value. The form library supplies a rich set of pre-defined field + types, and makes it relatively easy to define new ones. + + Once its transaction is completed (or aborted), a form may be unposted + (that is, undisplayed), and finally freed to make the storage + associated with it and its items available for re-use. + + The general flow of control of a form program looks like this: + 1. Initialize curses. + 2. Create the form fields, using new_field(). + 3. Create the form using new_form(). + 4. Post the form using post_form(). + 5. Refresh the screen. + 6. Process user requests via an input loop. + 7. Unpost the form using unpost_form(). + 8. Free the form, using free_form(). + 9. Free the fields using free_field(). + 10. Terminate curses. + + Note that this looks much like a menu program; the form library + handles tasks which are in many ways similar, and its interface was + obviously designed to resemble that of the menu library wherever + possible. + + In forms programs, however, the "process user requests" is somewhat + more complicated than for menus. Besides menu-like navigation + operations, the menu driver loop has to support field editing and data + validation. + + Creating and Freeing Fields and Forms + + The basic function for creating fields is new_field(): +FIELD *new_field(int height, int width, /* new field size */ + int top, int left, /* upper left corner */ + int offscreen, /* number of offscreen rows */ + int nbuf); /* number of working buffers */ + + Menu items always occupy a single row, but forms fields may have + multiple rows. So new_field() requires you to specify a width and + height (the first two arguments, which mist both be greater than + zero). + + You must also specify the location of the field's upper left corner on + the screen (the third and fourth arguments, which must be zero or + greater). Note that these coordinates are relative to the form + subwindow, which will coincide with stdscr by default but need not be + stdscr if you have done an explicit set_form_win() call. + + The fifth argument allows you to specify a number of off-screen rows. + If this is zero, the entire field will always be displayed. If it is + nonzero, the form will be scrollable, with only one screen-full + (initially the top part) displayed at any given time. If you make a + field dynamic and grow it so it will no longer fit on the screen, the + form will become scrollable even if the offscreen argument was + initially zero. + + The forms library allocates one working buffer per field; the size of + each buffer is ((height + offscreen)*width + 1, one character for each + position in the field plus a NUL terminator. The sixth argument is the + number of additional data buffers to allocate for the field; your + application can use them for its own purposes. +FIELD *dup_field(FIELD *field, /* field to copy */ + int top, int left); /* location of new copy */ + + The function dup_field() duplicates an existing field at a new + location. Size and buffering information are copied; some attribute + flags and status bits are not (see the form_field_new(3X) for + details). +FIELD *link_field(FIELD *field, /* field to copy */ + int top, int left); /* location of new copy */ + + The function link_field() also duplicates an existing field at a new + location. The difference from dup_field() is that it arranges for the + new field's buffer to be shared with the old one. + + Besides the obvious use in making a field editable from two different + form pages, linked fields give you a way to hack in dynamic labels. If + you declare several fields linked to an original, and then make them + inactive, changes from the original will still be propagated to the + linked fields. + + As with duplicated fields, linked fields have attribute bits separate + from the original. + + As you might guess, all these field-allocations return NULL if the + field allocation is not possible due to an out-of-memory error or + out-of-bounds arguments. + + To connect fields to a form, use +FORM *new_form(FIELD **fields); + + This function expects to see a NULL-terminated array of field + pointers. Said fields are connected to a newly-allocated form object; + its address is returned (or else NULL if the allocation fails). + + Note that new_field() does not copy the pointer array into private + storage; if you modify the contents of the pointer array during forms + processing, all manner of bizarre things might happen. Also note that + any given field may only be connected to one form. + + The functions free_field() and free_form are available to free field + and form objects. It is an error to attempt to free a field connected + to a form, but not vice-versa; thus, you will generally free your form + objects first. + + Fetching and Changing Field Attributes + + Each form field has a number of location and size attributes + associated with it. There are other field attributes used to control + display and editing of the field. Some (for example, the O_STATIC bit) + involve sufficient complications to be covered in sections of their + own later on. We cover the functions used to get and set several basic + attributes here. + + When a field is created, the attributes not specified by the new_field + function are copied from an invisible system default field. In + attribute-setting and -fetching functions, the argument NULL is taken + to mean this field. Changes to it persist as defaults until your forms + application terminates. + + Fetching Size and Location Data + + You can retrieve field sizes and locations through: +int field_info(FIELD *field, /* field from which to fetch */ + int *height, *int width, /* field size */ + int *top, int *left, /* upper left corner */ + int *offscreen, /* number of offscreen rows */ + int *nbuf); /* number of working buffers */ + + This function is a sort of inverse of new_field(); instead of setting + size and location attributes of a new field, it fetches them from an + existing one. + + Changing the Field Location + + It is possible to move a field's location on the screen: +int move_field(FIELD *field, /* field to alter */ + int top, int left); /* new upper-left corner */ + + You can, of course. query the current location through field_info(). + + The Justification Attribute + + One-line fields may be unjustified, justified right, justified left, + or centered. Here is how you manipulate this attribute: +int set_field_just(FIELD *field, /* field to alter */ + int justmode); /* mode to set */ + +int field_just(FIELD *field); /* fetch mode of field */ + + The mode values accepted and returned by this functions are + preprocessor macros NO_JUSTIFICATION, JUSTIFY_RIGHT, JUSTIFY_LEFT, or + JUSTIFY_CENTER. + + Field Display Attributes + + For each field, you can set a foreground attribute for entered + characters, a background attribute for the entire field, and a pad + character for the unfilled portion of the field. You can also control + pagination of the form. + + This group of four field attributes controls the visual appearance of + the field on the screen, without affecting in any way the data in the + field buffer. +int set_field_fore(FIELD *field, /* field to alter */ + chtype attr); /* attribute to set */ + +chtype field_fore(FIELD *field); /* field to query */ + +int set_field_back(FIELD *field, /* field to alter */ + chtype attr); /* attribute to set */ + +chtype field_back(FIELD *field); /* field to query */ + +int set_field_pad(FIELD *field, /* field to alter */ + int pad); /* pad character to set */ + +chtype field_pad(FIELD *field); + +int set_new_page(FIELD *field, /* field to alter */ + int flag); /* TRUE to force new page */ + +chtype new_page(FIELD *field); /* field to query */ + + The attributes set and returned by the first four functions are normal + curses(3x) display attribute values (A_STANDOUT, A_BOLD, A_REVERSE + etc). The page bit of a field controls whether it is displayed at the + start of a new form screen. + + Field Option Bits + + There is also a large collection of field option bits you can set to + control various aspects of forms processing. You can manipulate them + with these functions: +int set_field_opts(FIELD *field, /* field to alter */ + int attr); /* attribute to set */ + +int field_opts_on(FIELD *field, /* field to alter */ + int attr); /* attributes to turn on */ + +int field_opts_off(FIELD *field, /* field to alter */ + int attr); /* attributes to turn off */ + +int field_opts(FIELD *field); /* field to query */ + + By default, all options are on. Here are the available option bits: + + O_VISIBLE + Controls whether the field is visible on the screen. Can be + used during form processing to hide or pop up fields depending + on the value of parent fields. + + O_ACTIVE + Controls whether the field is active during forms processing + (i.e. visited by form navigation keys). Can be used to make + labels or derived fields with buffer values alterable by the + forms application, not the user. + + O_PUBLIC + Controls whether data is displayed during field entry. If this + option is turned off on a field, the library will accept and + edit data in that field, but it will not be displayed and the + visible field cursor will not move. You can turn off the + O_PUBLIC bit to define password fields. + + O_EDIT + Controls whether the field's data can be modified. When this + option is off, all editing requests except REQ_PREV_CHOICE and + REQ_NEXT_CHOICE will fail. Such read-only fields may be useful + for help messages. + + O_WRAP + Controls word-wrapping in multi-line fields. Normally, when any + character of a (blank-separated) word reaches the end of the + current line, the entire word is wrapped to the next line + (assuming there is one). When this option is off, the word will + be split across the line break. + + O_BLANK + Controls field blanking. When this option is on, entering a + character at the first field position erases the entire field + (except for the just-entered character). + + O_AUTOSKIP + Controls automatic skip to next field when this one fills. + Normally, when the forms user tries to type more data into a + field than will fit, the editing location jumps to next field. + When this option is off, the user's cursor will hang at the end + of the field. This option is ignored in dynamic fields that + have not reached their size limit. + + O_NULLOK + Controls whether validation is applied to blank fields. + Normally, it is not; the user can leave a field blank without + invoking the usual validation check on exit. If this option is + off on a field, exit from it will invoke a validation check. + + O_PASSOK + Controls whether validation occurs on every exit, or only after + the field is modified. Normally the latter is true. Setting + O_PASSOK may be useful if your field's validation function may + change during forms processing. + + O_STATIC + Controls whether the field is fixed to its initial dimensions. + If you turn this off, the field becomes dynamic and will + stretch to fit entered data. + + A field's options cannot be changed while the field is currently + selected. However, options may be changed on posted fields that are + not current. + + The option values are bit-masks and can be composed with logical-or in + the obvious way. + + Field Status + + Every field has a status flag, which is set to FALSE when the field is + created and TRUE when the value in field buffer 0 changes. This flag + can be queried and set directly: +int set_field_status(FIELD *field, /* field to alter */ + int status); /* mode to set */ + +int field_status(FIELD *field); /* fetch mode of field */ + + Setting this flag under program control can be useful if you use the + same form repeatedly, looking for modified fields each time. + + Calling field_status() on a field not currently selected for input + will return a correct value. Calling field_status() on a field that is + currently selected for input may not necessarily give a correct field + status value, because entered data is not necessarily copied to buffer + zero before the exit validation check. To guarantee that the returned + status value reflects reality, call field_status() either (1) in the + field's exit validation check routine, (2) from the field's or form's + initialization or termination hooks, or (3) just after a + REQ_VALIDATION request has been processed by the forms driver. + + Field User Pointer + + Each field structure contains one character pointer slot that is not + used by the forms library. It is intended to be used by applications + to store private per-field data. You can manipulate it with: +int set_field_userptr(FIELD *field, /* field to alter */ + char *userptr); /* mode to set */ + +char *field_userptr(FIELD *field); /* fetch mode of field */ + + (Properly, this user pointer field ought to have (void *) type. The + (char *) type is retained for System V compatibility.) + + It is valid to set the user pointer of the default field (with a + set_field_userptr() call passed a NULL field pointer.) When a new + field is created, the default-field user pointer is copied to + initialize the new field's user pointer. + + Variable-Sized Fields + + Normally, a field is fixed at the size specified for it at creation + time. If, however, you turn off its O_STATIC bit, it becomes dynamic + and will automatically resize itself to accommodate data as it is + entered. If the field has extra buffers associated with it, they will + grow right along with the main input buffer. + + A one-line dynamic field will have a fixed height (1) but variable + width, scrolling horizontally to display data within the field area as + originally dimensioned and located. A multi-line dynamic field will + have a fixed width, but variable height (number of rows), scrolling + vertically to display data within the field area as originally + dimensioned and located. + + Normally, a dynamic field is allowed to grow without limit. But it is + possible to set an upper limit on the size of a dynamic field. You do + it with this function: +int set_max_field(FIELD *field, /* field to alter (may not be NULL) */ + int max_size); /* upper limit on field size */ + + If the field is one-line, max_size is taken to be a column size limit; + if it is multi-line, it is taken to be a line size limit. To disable + any limit, use an argument of zero. The growth limit can be changed + whether or not the O_STATIC bit is on, but has no effect until it is. + + The following properties of a field change when it becomes dynamic: + * If there is no growth limit, there is no final position of the + field; therefore O_AUTOSKIP and O_NL_OVERLOAD are ignored. + * Field justification will be ignored (though whatever justification + is set up will be retained internally and can be queried). + * The dup_field() and link_field() calls copy dynamic-buffer sizes. + If the O_STATIC option is set on one of a collection of links, + buffer resizing will occur only when the field is edited through + that link. + * The call field_info() will retrieve the original static size of + the field; use dynamic_field_info() to get the actual dynamic + size. + + Field Validation + + By default, a field will accept any data that will fit in its input + buffer. However, it is possible to attach a validation type to a + field. If you do this, any attempt to leave the field while it + contains data that does not match the validation type will fail. Some + validation types also have a character-validity check for each time a + character is entered in the field. + + A field's validation check (if any) is not called when + set_field_buffer() modifies the input buffer, nor when that buffer is + changed through a linked field. + + The form library provides a rich set of pre-defined validation types, + and gives you the capability to define custom ones of your own. You + can examine and change field validation attributes with the following + functions: +int set_field_type(FIELD *field, /* field to alter */ + FIELDTYPE *ftype, /* type to associate */ + ...); /* additional arguments*/ + +FIELDTYPE *field_type(FIELD *field); /* field to query */ + + The validation type of a field is considered an attribute of the + field. As with other field attributes, Also, doing set_field_type() + with a NULL field default will change the system default for + validation of newly-created fields. + + Here are the pre-defined validation types: + + TYPE_ALPHA + + This field type accepts alphabetic data; no blanks, no digits, no + special characters (this is checked at character-entry time). It is + set up with: +int set_field_type(FIELD *field, /* field to alter */ + TYPE_ALPHA, /* type to associate */ + int width); /* maximum width of field */ + + The width argument sets a minimum width of data. Typically you will + want to set this to the field width; if it is greater than the field + width, the validation check will always fail. A minimum width of zero + makes field completion optional. + + TYPE_ALNUM + + This field type accepts alphabetic data and digits; no blanks, no + special characters (this is checked at character-entry time). It is + set up with: +int set_field_type(FIELD *field, /* field to alter */ + TYPE_ALNUM, /* type to associate */ + int width); /* maximum width of field */ + + The width argument sets a minimum width of data. As with TYPE_ALPHA, + typically you will want to set this to the field width; if it is + greater than the field width, the validation check will always fail. A + minimum width of zero makes field completion optional. + + TYPE_ENUM + + This type allows you to restrict a field's values to be among a + specified set of string values (for example, the two-letter postal + codes for U.S. states). It is set up with: +int set_field_type(FIELD *field, /* field to alter */ + TYPE_ENUM, /* type to associate */ + char **valuelist; /* list of possible values */ + int checkcase; /* case-sensitive? */ + int checkunique); /* must specify uniquely? */ + + The valuelist parameter must point at a NULL-terminated list of valid + strings. The checkcase argument, if true, makes comparison with the + string case-sensitive. + + When the user exits a TYPE_ENUM field, the validation procedure tries + to complete the data in the buffer to a valid entry. If a complete + choice string has been entered, it is of course valid. But it is also + possible to enter a prefix of a valid string and have it completed for + you. + + By default, if you enter such a prefix and it matches more than one + value in the string list, the prefix will be completed to the first + matching value. But the checkunique argument, if true, requires prefix + matches to be unique in order to be valid. + + The REQ_NEXT_CHOICE and REQ_PREV_CHOICE input requests can be + particularly useful with these fields. + + TYPE_INTEGER + + This field type accepts an integer. It is set up as follows: +int set_field_type(FIELD *field, /* field to alter */ + TYPE_INTEGER, /* type to associate */ + int padding, /* # places to zero-pad to */ + int vmin, int vmax); /* valid range */ + + Valid characters consist of an optional leading minus and digits. The + range check is performed on exit. If the range maximum is less than or + equal to the minimum, the range is ignored. + + If the value passes its range check, it is padded with as many leading + zero digits as necessary to meet the padding argument. + + A TYPE_INTEGER value buffer can conveniently be interpreted with the C + library function atoi(3). + + TYPE_NUMERIC + + This field type accepts a decimal number. It is set up as follows: +int set_field_type(FIELD *field, /* field to alter */ + TYPE_NUMERIC, /* type to associate */ + int padding, /* # places of precision */ + double vmin, double vmax); /* valid range */ + + Valid characters consist of an optional leading minus and digits. + possibly including a decimal point. If your system supports locale's, + the decimal point character used must be the one defined by your + locale. The range check is performed on exit. If the range maximum is + less than or equal to the minimum, the range is ignored. + + If the value passes its range check, it is padded with as many + trailing zero digits as necessary to meet the padding argument. + + A TYPE_NUMERIC value buffer can conveniently be interpreted with the C + library function atof(3). + + TYPE_REGEXP + + This field type accepts data matching a regular expression. It is set + up as follows: +int set_field_type(FIELD *field, /* field to alter */ + TYPE_REGEXP, /* type to associate */ + char *regexp); /* expression to match */ + + The syntax for regular expressions is that of regcomp(3). The check + for regular-expression match is performed on exit. + + Direct Field Buffer Manipulation + + The chief attribute of a field is its buffer contents. When a form has + been completed, your application usually needs to know the state of + each field buffer. You can find this out with: +char *field_buffer(FIELD *field, /* field to query */ + int bufindex); /* number of buffer to query */ + + Normally, the state of the zero-numbered buffer for each field is set + by the user's editing actions on that field. It is sometimes useful to + be able to set the value of the zero-numbered (or some other) buffer + from your application: +int set_field_buffer(FIELD *field, /* field to alter */ + int bufindex, /* number of buffer to alter */ + char *value); /* string value to set */ + + If the field is not large enough and cannot be resized to a + sufficiently large size to contain the specified value, the value will + be truncated to fit. + + Calling field_buffer() with a null field pointer will raise an error. + Calling field_buffer() on a field not currently selected for input + will return a correct value. Calling field_buffer() on a field that is + currently selected for input may not necessarily give a correct field + buffer value, because entered data is not necessarily copied to buffer + zero before the exit validation check. To guarantee that the returned + buffer value reflects on-screen reality, call field_buffer() either + (1) in the field's exit validation check routine, (2) from the field's + or form's initialization or termination hooks, or (3) just after a + REQ_VALIDATION request has been processed by the forms driver. + + Attributes of Forms + + As with field attributes, form attributes inherit a default from a + system default form structure. These defaults can be queried or set by + of these functions using a form-pointer argument of NULL. + + The principal attribute of a form is its field list. You can query and + change this list with: +int set_form_fields(FORM *form, /* form to alter */ + FIELD **fields); /* fields to connect */ + +char *form_fields(FORM *form); /* fetch fields of form */ + +int field_count(FORM *form); /* count connect fields */ + + The second argument of set_form_fields() may be a NULL-terminated + field pointer array like the one required by new_form(). In that case, + the old fields of the form are disconnected but not freed (and + eligible to be connected to other forms), then the new fields are + connected. + + It may also be null, in which case the old fields are disconnected + (and not freed) but no new ones are connected. + + The field_count() function simply counts the number of fields + connected to a given from. It returns -1 if the form-pointer argument + is NULL. + + Control of Form Display + + In the overview section, you saw that to display a form you normally + start by defining its size (and fields), posting it, and refreshing + the screen. There is an hidden step before posting, which is the + association of the form with a frame window (actually, a pair of + windows) within which it will be displayed. By default, the forms + library associates every form with the full-screen window stdscr. + + By making this step explicit, you can associate a form with a declared + frame window on your screen display. This can be useful if you want to + adapt the form display to different screen sizes, dynamically tile + forms on the screen, or use a form as part of an interface layout + managed by panels. + + The two windows associated with each form have the same functions as + their analogues in the menu library. Both these windows are painted + when the form is posted and erased when the form is unposted. + + The outer or frame window is not otherwise touched by the form + routines. It exists so the programmer can associate a title, a border, + or perhaps help text with the form and have it properly refreshed or + erased at post/unpost time. The inner window or subwindow is where the + current form page is actually displayed. + + In order to declare your own frame window for a form, you will need to + know the size of the form's bounding rectangle. You can get this + information with: +int scale_form(FORM *form, /* form to query */ + int *rows, /* form rows */ + int *cols); /* form cols */ + + The form dimensions are passed back in the locations pointed to by the + arguments. Once you have this information, you can use it to declare + of windows, then use one of these functions: +int set_form_win(FORM *form, /* form to alter */ + WINDOW *win); /* frame window to connect */ + +WINDOW *form_win(FORM *form); /* fetch frame window of form */ + +int set_form_sub(FORM *form, /* form to alter */ + WINDOW *win); /* form subwindow to connect */ + +WINDOW *form_sub(FORM *form); /* fetch form subwindow of form */ + + Note that curses operations, including refresh(), on the form, should + be done on the frame window, not the form subwindow. + + It is possible to check from your application whether all of a + scrollable field is actually displayed within the menu subwindow. Use + these functions: +int data_ahead(FORM *form); /* form to be queried */ + +int data_behind(FORM *form); /* form to be queried */ + + The function data_ahead() returns TRUE if (a) the current field is + one-line and has undisplayed data off to the right, (b) the current + field is multi-line and there is data off-screen below it. + + The function data_behind() returns TRUE if the first (upper left hand) + character position is off-screen (not being displayed). + + Finally, there is a function to restore the form window's cursor to + the value expected by the forms driver: +int pos_form_cursor(FORM *) /* form to be queried */ + + If your application changes the form window cursor, call this function + before handing control back to the forms driver in order to + re-synchronize it. + + Input Processing in the Forms Driver + + The function form_driver() handles virtualized input requests for form + navigation, editing, and validation requests, just as menu_driver does + for menus (see the section on menu input handling). +int form_driver(FORM *form, /* form to pass input to */ + int request); /* form request code */ + + Your input virtualization function needs to take input and then + convert it to either an alphanumeric character (which is treated as + data to be entered in the currently-selected field), or a forms + processing request. + + The forms driver provides hooks (through input-validation and + field-termination functions) with which your application code can + check that the input taken by the driver matched what was expected. + + Page Navigation Requests + + These requests cause page-level moves through the form, triggering + display of a new form screen. + + REQ_NEXT_PAGE + Move to the next form page. + + REQ_PREV_PAGE + Move to the previous form page. + + REQ_FIRST_PAGE + Move to the first form page. + + REQ_LAST_PAGE + Move to the last form page. + + These requests treat the list as cyclic; that is, REQ_NEXT_PAGE from + the last page goes to the first, and REQ_PREV_PAGE from the first page + goes to the last. + + Inter-Field Navigation Requests + + These requests handle navigation between fields on the same page. + + REQ_NEXT_FIELD + Move to next field. + + REQ_PREV_FIELD + Move to previous field. + + REQ_FIRST_FIELD + Move to the first field. + + REQ_LAST_FIELD + Move to the last field. + + REQ_SNEXT_FIELD + Move to sorted next field. + + REQ_SPREV_FIELD + Move to sorted previous field. + + REQ_SFIRST_FIELD + Move to the sorted first field. + + REQ_SLAST_FIELD + Move to the sorted last field. + + REQ_LEFT_FIELD + Move left to field. + + REQ_RIGHT_FIELD + Move right to field. + + REQ_UP_FIELD + Move up to field. + + REQ_DOWN_FIELD + Move down to field. + + These requests treat the list of fields on a page as cyclic; that is, + REQ_NEXT_FIELD from the last field goes to the first, and + REQ_PREV_FIELD from the first field goes to the last. The order of the + fields for these (and the REQ_FIRST_FIELD and REQ_LAST_FIELD requests) + is simply the order of the field pointers in the form array (as set up + by new_form() or set_form_fields() + + It is also possible to traverse the fields as if they had been sorted + in screen-position order, so the sequence goes left-to-right and + top-to-bottom. To do this, use the second group of four + sorted-movement requests. + + Finally, it is possible to move between fields using visual directions + up, down, right, and left. To accomplish this, use the third group of + four requests. Note, however, that the position of a form for purposes + of these requests is its upper-left corner. + + For example, suppose you have a multi-line field B, and two + single-line fields A and C on the same line with B, with A to the left + of B and C to the right of B. A REQ_MOVE_RIGHT from A will go to B + only if A, B, and C all share the same first line; otherwise it will + skip over B to C. + + Intra-Field Navigation Requests + + These requests drive movement of the edit cursor within the currently + selected field. + + REQ_NEXT_CHAR + Move to next character. + + REQ_PREV_CHAR + Move to previous character. + + REQ_NEXT_LINE + Move to next line. + + REQ_PREV_LINE + Move to previous line. + + REQ_NEXT_WORD + Move to next word. + + REQ_PREV_WORD + Move to previous word. + + REQ_BEG_FIELD + Move to beginning of field. + + REQ_END_FIELD + Move to end of field. + + REQ_BEG_LINE + Move to beginning of line. + + REQ_END_LINE + Move to end of line. + + REQ_LEFT_CHAR + Move left in field. + + REQ_RIGHT_CHAR + Move right in field. + + REQ_UP_CHAR + Move up in field. + + REQ_DOWN_CHAR + Move down in field. + + Each word is separated from the previous and next characters by + whitespace. The commands to move to beginning and end of line or field + look for the first or last non-pad character in their ranges. + + Scrolling Requests + + Fields that are dynamic and have grown and fields explicitly created + with offscreen rows are scrollable. One-line fields scroll + horizontally; multi-line fields scroll vertically. Most scrolling is + triggered by editing and intra-field movement (the library scrolls the + field to keep the cursor visible). It is possible to explicitly + request scrolling with the following requests: + + REQ_SCR_FLINE + Scroll vertically forward a line. + + REQ_SCR_BLINE + Scroll vertically backward a line. + + REQ_SCR_FPAGE + Scroll vertically forward a page. + + REQ_SCR_BPAGE + Scroll vertically backward a page. + + REQ_SCR_FHPAGE + Scroll vertically forward half a page. + + REQ_SCR_BHPAGE + Scroll vertically backward half a page. + + REQ_SCR_FCHAR + Scroll horizontally forward a character. + + REQ_SCR_BCHAR + Scroll horizontally backward a character. + + REQ_SCR_HFLINE + Scroll horizontally one field width forward. + + REQ_SCR_HBLINE + Scroll horizontally one field width backward. + + REQ_SCR_HFHALF + Scroll horizontally one half field width forward. + + REQ_SCR_HBHALF + Scroll horizontally one half field width backward. + + For scrolling purposes, a page of a field is the height of its visible + part. + + Editing Requests + + When you pass the forms driver an ASCII character, it is treated as a + request to add the character to the field's data buffer. Whether this + is an insertion or a replacement depends on the field's edit mode + (insertion is the default. + + The following requests support editing the field and changing the edit + mode: + + REQ_INS_MODE + Set insertion mode. + + REQ_OVL_MODE + Set overlay mode. + + REQ_NEW_LINE + New line request (see below for explanation). + + REQ_INS_CHAR + Insert space at character location. + + REQ_INS_LINE + Insert blank line at character location. + + REQ_DEL_CHAR + Delete character at cursor. + + REQ_DEL_PREV + Delete previous word at cursor. + + REQ_DEL_LINE + Delete line at cursor. + + REQ_DEL_WORD + Delete word at cursor. + + REQ_CLR_EOL + Clear to end of line. + + REQ_CLR_EOF + Clear to end of field. + + REQ_CLEAR_FIELD + Clear entire field. + + The behavior of the REQ_NEW_LINE and REQ_DEL_PREV requests is + complicated and partly controlled by a pair of forms options. The + special cases are triggered when the cursor is at the beginning of a + field, or on the last line of the field. + + First, we consider REQ_NEW_LINE: + + The normal behavior of REQ_NEW_LINE in insert mode is to break the + current line at the position of the edit cursor, inserting the portion + of the current line after the cursor as a new line following the + current and moving the cursor to the beginning of that new line (you + may think of this as inserting a newline in the field buffer). + + The normal behavior of REQ_NEW_LINE in overlay mode is to clear the + current line from the position of the edit cursor to end of line. The + cursor is then moved to the beginning of the next line. + + However, REQ_NEW_LINE at the beginning of a field, or on the last line + of a field, instead does a REQ_NEXT_FIELD. O_NL_OVERLOAD option is + off, this special action is disabled. + + Now, let us consider REQ_DEL_PREV: + + The normal behavior of REQ_DEL_PREV is to delete the previous + character. If insert mode is on, and the cursor is at the start of a + line, and the text on that line will fit on the previous one, it + instead appends the contents of the current line to the previous one + and deletes the current line (you may think of this as deleting a + newline from the field buffer). + + However, REQ_DEL_PREV at the beginning of a field is instead treated + as a REQ_PREV_FIELD. + + If the O_BS_OVERLOAD option is off, this special action is disabled + and the forms driver just returns E_REQUEST_DENIED. + + See Form Options for discussion of how to set and clear the overload + options. + + Order Requests + + If the type of your field is ordered, and has associated functions for + getting the next and previous values of the type from a given value, + there are requests that can fetch that value into the field buffer: + + REQ_NEXT_CHOICE + Place the successor value of the current value in the buffer. + + REQ_PREV_CHOICE + Place the predecessor value of the current value in the buffer. + + Of the built-in field types, only TYPE_ENUM has built-in successor and + predecessor functions. When you define a field type of your own (see + Custom Validation Types), you can associate our own ordering + functions. + + Application Commands + + Form requests are represented as integers above the curses value + greater than KEY_MAX and less than or equal to the constant + MAX_COMMAND. If your input-virtualization routine returns a value + above MAX_COMMAND, the forms driver will ignore it. + + Field Change Hooks + + It is possible to set function hooks to be executed whenever the + current field or form changes. Here are the functions that support + this: +typedef void (*HOOK)(); /* pointer to function returning void */ + +int set_form_init(FORM *form, /* form to alter */ + HOOK hook); /* initialization hook */ + +HOOK form_init(FORM *form); /* form to query */ + +int set_form_term(FORM *form, /* form to alter */ + HOOK hook); /* termination hook */ + +HOOK form_term(FORM *form); /* form to query */ + +int set_field_init(FORM *form, /* form to alter */ + HOOK hook); /* initialization hook */ + +HOOK field_init(FORM *form); /* form to query */ + +int set_field_term(FORM *form, /* form to alter */ + HOOK hook); /* termination hook */ + +HOOK field_term(FORM *form); /* form to query */ + + These functions allow you to either set or query four different hooks. + In each of the set functions, the second argument should be the + address of a hook function. These functions differ only in the timing + of the hook call. + + form_init + This hook is called when the form is posted; also, just after + each page change operation. + + field_init + This hook is called when the form is posted; also, just after + each field change + + field_term + This hook is called just after field validation; that is, just + before the field is altered. It is also called when the form is + unposted. + + form_term + This hook is called when the form is unposted; also, just + before each page change operation. + + Calls to these hooks may be triggered + 1. When user editing requests are processed by the forms driver + 2. When the current page is changed by set_current_field() call + 3. When the current field is changed by a set_form_page() call + + See Field Change Commands for discussion of the latter two cases. + + You can set a default hook for all fields by passing one of the set + functions a NULL first argument. + + You can disable any of these hooks by (re)setting them to NULL, the + default value. + + Field Change Commands + + Normally, navigation through the form will be driven by the user's + input requests. But sometimes it is useful to be able to move the + focus for editing and viewing under control of your application, or + ask which field it currently is in. The following functions help you + accomplish this: +int set_current_field(FORM *form, /* form to alter */ + FIELD *field); /* field to shift to */ + +FIELD *current_field(FORM *form); /* form to query */ + +int field_index(FORM *form, /* form to query */ + FIELD *field); /* field to get index of */ + + The function field_index() returns the index of the given field in the + given form's field array (the array passed to new_form() or + set_form_fields()). + + The initial current field of a form is the first active field on the + first page. The function set_form_fields() resets this. + + It is also possible to move around by pages. +int set_form_page(FORM *form, /* form to alter */ + int page); /* page to go to (0-origin) */ + +int form_page(FORM *form); /* return form's current page */ + + The initial page of a newly-created form is 0. The function + set_form_fields() resets this. + + Form Options + + Like fields, forms may have control option bits. They can be changed + or queried with these functions: +int set_form_opts(FORM *form, /* form to alter */ + int attr); /* attribute to set */ + +int form_opts_on(FORM *form, /* form to alter */ + int attr); /* attributes to turn on */ + +int form_opts_off(FORM *form, /* form to alter */ + int attr); /* attributes to turn off */ + +int form_opts(FORM *form); /* form to query */ + + By default, all options are on. Here are the available option bits: + + O_NL_OVERLOAD + Enable overloading of REQ_NEW_LINE as described in Editing + Requests. The value of this option is ignored on dynamic fields + that have not reached their size limit; these have no last + line, so the circumstances for triggering a REQ_NEXT_FIELD + never arise. + + O_BS_OVERLOAD + Enable overloading of REQ_DEL_PREV as described in Editing + Requests. + + The option values are bit-masks and can be composed with logical-or in + the obvious way. + + Custom Validation Types + + The form library gives you the capability to define custom validation + types of your own. Further, the optional additional arguments of + set_field_type effectively allow you to parameterize validation types. + Most of the complications in the validation-type interface have to do + with the handling of the additional arguments within custom validation + functions. + + Union Types + + The simplest way to create a custom data type is to compose it from + two preexisting ones: +FIELD *link_fieldtype(FIELDTYPE *type1, + FIELDTYPE *type2); + + This function creates a field type that will accept any of the values + legal for either of its argument field types (which may be either + predefined or programmer-defined). If a set_field_type() call later + requires arguments, the new composite type expects all arguments for + the first type, than all arguments for the second. Order functions + (see Order Requests) associated with the component types will work on + the composite; what it does is check the validation function for the + first type, then for the second, to figure what type the buffer + contents should be treated as. + + New Field Types + + To create a field type from scratch, you need to specify one or both + of the following things: + * A character-validation function, to check each character as it is + entered. + * A field-validation function to be applied on exit from the field. + + Here is how you do that: +typedef int (*HOOK)(); /* pointer to function returning int */ + +FIELDTYPE *new_fieldtype(HOOK f_validate, /* field validator */ + HOOK c_validate) /* character validator */ + +int free_fieldtype(FIELDTYPE *ftype); /* type to free */ + + At least one of the arguments of new_fieldtype() must be non-NULL. The + forms driver will automatically call the new type's validation + functions at appropriate points in processing a field of the new type. + + The function free_fieldtype() deallocates the argument fieldtype, + freeing all storage associated with it. + + Normally, a field validator is called when the user attempts to leave + the field. Its first argument is a field pointer, from which it can + get to field buffer 0 and test it. If the function returns TRUE, the + operation succeeds; if it returns FALSE, the edit cursor stays in the + field. + + A character validator gets the character passed in as a first + argument. It too should return TRUE if the character is valid, FALSE + otherwise. + + Validation Function Arguments + + Your field- and character- validation functions will be passed a + second argument as well. This second argument is the address of a + structure (which we will call a pile) built from any of the + field-type-specific arguments passed to set_field_type(). If no such + arguments are defined for the field type, this pile pointer argument + will be NULL. + + In order to arrange for such arguments to be passed to your validation + functions, you must associate a small set of storage-management + functions with the type. The forms driver will use these to synthesize + a pile from the trailing arguments of each set_field_type() argument, + and a pointer to the pile will be passed to the validation functions. + + Here is how you make the association: +typedef char *(*PTRHOOK)(); /* pointer to function returning (char *) */ +typedef void (*VOIDHOOK)(); /* pointer to function returning void */ + +int set_fieldtype_arg(FIELDTYPE *type, /* type to alter */ + PTRHOOK make_str, /* make structure from args */ + PTRHOOK copy_str, /* make copy of structure */ + VOIDHOOK free_str); /* free structure storage */ + + Here is how the storage-management hooks are used: + + make_str + This function is called by set_field_type(). It gets one + argument, a va_list of the type-specific arguments passed to + set_field_type(). It is expected to return a pile pointer to a + data structure that encapsulates those arguments. + + copy_str + This function is called by form library functions that allocate + new field instances. It is expected to take a pile pointer, + copy the pile to allocated storage, and return the address of + the pile copy. + + free_str + This function is called by field- and type-deallocation + routines in the library. It takes a pile pointer argument, and + is expected to free the storage of that pile. + + The make_str and copy_str functions may return NULL to signal + allocation failure. The library routines will that call them will + return error indication when this happens. Thus, your validation + functions should never see a NULL file pointer and need not check + specially for it. + + Order Functions For Custom Types + + Some custom field types are simply ordered in the same well-defined + way that TYPE_ENUM is. For such types, it is possible to define + successor and predecessor functions to support the REQ_NEXT_CHOICE and + REQ_PREV_CHOICE requests. Here is how: +typedef int (*INTHOOK)(); /* pointer to function returning int */ + +int set_fieldtype_arg(FIELDTYPE *type, /* type to alter */ + INTHOOK succ, /* get successor value */ + INTHOOK pred); /* get predecessor value */ + + The successor and predecessor arguments will each be passed two + arguments; a field pointer, and a pile pointer (as for the validation + functions). They are expected to use the function field_buffer() to + read the current value, and set_field_buffer() on buffer 0 to set the + next or previous value. Either hook may return TRUE to indicate + success (a legal next or previous value was set) or FALSE to indicate + failure. + + Avoiding Problems + + The interface for defining custom types is complicated and tricky. + Rather than attempting to create a custom type entirely from scratch, + you should start by studying the library source code for whichever of + the pre-defined types seems to be closest to what you want. + + Use that code as a model, and evolve it towards what you really want. + You will avoid many problems and annoyances that way. The code in the + ncurses library has been specifically exempted from the package + copyright to support this. + + If your custom type defines order functions, have do something + intuitive with a blank field. A useful convention is to make the + successor of a blank field the types minimum value, and its + predecessor the maximum. diff --git a/contrib/ncurses/form/Makefile.in b/contrib/ncurses/form/Makefile.in new file mode 100644 index 00000000..2216972a --- /dev/null +++ b/contrib/ncurses/form/Makefile.in @@ -0,0 +1,212 @@ +# $Id: Makefile.in,v 1.74 2024/08/11 00:51:41 tom Exp $ +############################################################################## +# Copyright 2020-2021,2024 Thomas E. Dickey # +# Copyright 1998-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for form source code. +# +# This makes the following: +# libraries (normal/debug/profile/shared) +# +# The variable 'srcdir' refers to the source-distribution, and can be set with +# the configure script by "--srcdir=DIR". +# +# The rules are organized to produce the libraries for the configured models, + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +x = @EXEEXT@ +o = .@OBJEXT@ + +MODEL = @DFT_LWR_MODEL@ +DESTDIR = @DESTDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) + +PACKAGE = @PACKAGE@ + +LIBTOOL = @LIBTOOL@ +LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ +LIBTOOL_CLEAN = @LIB_CLEAN@ +LIBTOOL_COMPILE = @LIB_COMPILE@ +LIBTOOL_LINK = @LIB_LINK@ +LIBTOOL_INSTALL = @LIB_INSTALL@ +LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ +LT_UNDEF = @LT_UNDEF@ + +INSTALL = @INSTALL@ +INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ +INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ +INSTALL_DATA = @INSTALL_DATA@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AWK = @AWK@ +LD = @LD@ +LN_S = @LN_S@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +CC = @CC@ +CPP = @CPP@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ + +INCDIR = $(top_srcdir)/include +BASE_DIR = $(top_srcdir)/ncurses +CPPFLAGS = -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_FORM @CPPFLAGS@ + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +CFLAGS_LIBTOOL = $(CCFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +LINK = $(LIBTOOL_LINK) +LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ + +SHLIB_DIRS = -L../lib +SHLIB_LIST = $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ + +RPATH_LIST = @RPATH_LIST@ +RESULTING_SYMS = @RESULTING_SYMS@ +VERSIONED_SYMS = @VERSIONED_SYMS@ +MK_SHARED_LIB = @MK_SHARED_LIB@ + +NCURSES_MAJOR = @NCURSES_MAJOR@ +NCURSES_MINOR = @NCURSES_MINOR@ +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ + +RANLIB = @LIB_PREP@ + +LIBRARIES = @Libs_To_Make@ + +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ +LINT_LIBS = -lform -lncurses @LIBS@ + +AUTO_SRC = \ + ../include/form.h + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs \ +install :: $(AUTO_SRC) $(LIBRARIES) + +sources : $(AUTO_SRC) + +$(BINDIR) \ +$(LIBDIR) : + mkdir -p $@ + +# make copies to simplify include-paths while still keeping form's include +# file in this directory. +../include/form.h : $(srcdir)/form.h + -rm -f $@ + cp $(srcdir)/form.h $@ + +HEADER_DEPS = \ + ../include/curses.h \ + ../include/eti.h \ + ../include/mf_common.h \ + ../include/ncurses_cfg.h \ + ../include/ncurses_def.h \ + ../include/ncurses_dll.h \ + ../include/term.h \ + ../include/unctrl.h \ + $(BASE_DIR)/curses.priv.h \ + $(BASE_DIR)/new_pair.h \ + $(INCDIR)/nc_alloc.h \ + $(INCDIR)/nc_panel.h \ + $(INCDIR)/nc_string.h \ + $(INCDIR)/nc_termios.h \ + $(INCDIR)/nc_tparm.h \ + $(INCDIR)/term_entry.h \ + $(srcdir)/form.h \ + $(srcdir)/form.priv.h + +tags: + $(CTAGS) *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + +clean :: mostlyclean + -rm -f $(AUTO_SRC) + +distclean :: clean + -rm -f Makefile + -rm -rf .libs *.dSYM + +realclean :: distclean + +../include/mf_common.h \ +../include/eti.h : + ( cd ../menu && $(MAKE) $@ ) + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/form/READ.ME b/contrib/ncurses/form/READ.ME new file mode 100644 index 00000000..7c6ad972 --- /dev/null +++ b/contrib/ncurses/form/READ.ME @@ -0,0 +1,43 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-2003,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: READ.ME,v 0.9 2021/06/17 21:20:30 tom Exp $ +------------------------------------------------------------------------------- + +This is a clone of the form library that is available with typical +System V curses implementations (ETI). + +It is modelled after the documentation that comes for this library with +a 386 based SVR4 implementation (ESIX). + +The development environment was and is an ELF based Linux system. + +For things that still need doing, see the TO-DO file in the top-level +directory. + +Juergen Pfeifer diff --git a/contrib/ncurses/form/f_trace.c b/contrib/ncurses/form/f_trace.c new file mode 100644 index 00000000..c8df81a5 --- /dev/null +++ b/contrib/ncurses/form/f_trace.c @@ -0,0 +1,72 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2004-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: f_trace.c,v 1.6 2020/05/24 01:40:20 anonymous.maarten Exp $") + +FORM_EXPORT(FIELD **) +_nc_retrace_field_ptr(FIELD **code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +FORM_EXPORT(FIELD *) +_nc_retrace_field(FIELD *code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +FORM_EXPORT(FIELDTYPE *) +_nc_retrace_field_type(FIELDTYPE *code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +FORM_EXPORT(FORM *) +_nc_retrace_form(FORM *code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +FORM_EXPORT(Form_Hook) +_nc_retrace_form_hook(Form_Hook code) +{ + TR_FUNC_BFR(1); + T((T_RETURN("%s"), TR_FUNC_ARG(0, code))); + return code; +} diff --git a/contrib/ncurses/form/fld_arg.c b/contrib/ncurses/form/fld_arg.c new file mode 100644 index 00000000..2f6c4771 --- /dev/null +++ b/contrib/ncurses/form/fld_arg.c @@ -0,0 +1,104 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_arg.c,v 1.18 2020/12/11 22:05:24 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_fieldtype_arg( +| FIELDTYPE *typ, +| void * (* const make_arg)(va_list *), +| void * (* const copy_arg)(const void *), +| void (* const free_arg)(void *) ) +| +| Description : Connects to the type additional arguments necessary +| for a set_field_type call. The various function pointer +| arguments are: +| make_arg : allocates a structure for the field +| specific parameters. +| copy_arg : duplicate the structure created by +| make_arg +| free_arg : Release the memory allocated by make_arg +| or copy_arg +| +| At least make_arg must be non-NULL. +| You may pass NULL for copy_arg and free_arg if your +| make_arg function doesn't allocate memory and your +| arg fits into the storage for a (void*). +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid argument ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_fieldtype_arg(FIELDTYPE *typ, + void *(*const make_arg)(va_list *), + void *(*const copy_arg)(const void *), + void (*const free_arg) (void *)) +{ + TR_FUNC_BFR(3); + + T((T_CALLED("set_fieldtype_arg(%p,%s,%s,%s)"), + (void *)typ, + TR_FUNC_ARG(0, make_arg), + TR_FUNC_ARG(1, copy_arg), + TR_FUNC_ARG(2, free_arg))); + + if (typ != 0 && make_arg != (void *)0) + { + SetStatus(typ, _HAS_ARGS); + typ->makearg = make_arg; + typ->copyarg = copy_arg; + typ->freearg = free_arg; + RETURN(E_OK); + } + RETURN(E_BAD_ARGUMENT); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : void *field_arg(const FIELD *field) +| +| Description : Retrieve pointer to the field's argument structure. +| +| Return Values : Pointer to structure or NULL if none is defined. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(void *) +field_arg(const FIELD *field) +{ + T((T_CALLED("field_arg(%p)"), (const void *)field)); + returnVoidPtr(Normalize_Field(field)->arg); +} + +/* fld_arg.c ends here */ diff --git a/contrib/ncurses/form/fld_attr.c b/contrib/ncurses/form/fld_attr.c new file mode 100644 index 00000000..4ce6b1c5 --- /dev/null +++ b/contrib/ncurses/form/fld_attr.c @@ -0,0 +1,120 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_attr.c,v 1.15 2020/12/11 22:05:24 tom Exp $") + +/*---------------------------------------------------------------------------- + Field-Attribute manipulation routines + --------------------------------------------------------------------------*/ +/* "Template" macro to generate a function to set a field's attribute */ +#define GEN_FIELD_ATTR_SET_FCT( name ) \ +FORM_IMPEXP int NCURSES_API set_field_ ## name (FIELD * field, chtype attr)\ +{\ + int res = E_BAD_ARGUMENT;\ + T((T_CALLED("set_field_" #name "(%p,%s)"), (void *)field, _traceattr(attr)));\ + if ( attr==A_NORMAL || ((attr & A_ATTRIBUTES)==attr) )\ + {\ + Normalize_Field( field );\ + if (field != 0) \ + { \ + if ((field -> name) != attr)\ + {\ + field -> name = attr;\ + res = _nc_Synchronize_Attributes( field );\ + }\ + else\ + {\ + res = E_OK;\ + }\ + }\ + }\ + RETURN(res);\ +} + +/* "Template" macro to generate a function to get a field's attribute */ +#define GEN_FIELD_ATTR_GET_FCT( name ) \ +FORM_IMPEXP chtype NCURSES_API field_ ## name (const FIELD * field)\ +{\ + T((T_CALLED("field_" #name "(%p)"), (const void *) field));\ + returnAttr( A_ATTRIBUTES & (Normalize_Field( field ) -> name) );\ +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_fore(FIELD *field, chtype attr) +| +| Description : Sets the foreground of the field used to display the +| field contents. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid attributes +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +GEN_FIELD_ATTR_SET_FCT(fore) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : chtype field_fore(const FIELD *) +| +| Description : Retrieve field's foreground attribute +| +| Return Values : The foreground attribute ++--------------------------------------------------------------------------*/ +GEN_FIELD_ATTR_GET_FCT(fore) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_back(FIELD *field, chtype attr) +| +| Description : Sets the background of the field used to display the +| field's extend. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid attributes +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +GEN_FIELD_ATTR_SET_FCT(back) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : chtype field_back(const +| +| Description : Retrieve field's background attribute +| +| Return Values : The background attribute ++--------------------------------------------------------------------------*/ +GEN_FIELD_ATTR_GET_FCT(back) + +/* fld_attr.c ends here */ diff --git a/contrib/ncurses/form/fld_current.c b/contrib/ncurses/form/fld_current.c new file mode 100644 index 00000000..264007ef --- /dev/null +++ b/contrib/ncurses/form/fld_current.c @@ -0,0 +1,164 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_current.c,v 1.16 2020/05/24 01:40:20 anonymous.maarten Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_current_field(FORM * form,FIELD * field) +| +| Description : Set the current field of the form to the specified one. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form or field pointer +| E_REQUEST_DENIED - field not selectable +| E_BAD_STATE - called from a hook routine +| E_INVALID_FIELD - current field can't be left +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_current_field(FORM *form, FIELD *field) +{ + int err = E_OK; + + T((T_CALLED("set_current_field(%p,%p)"), (void *)form, (void *)field)); + if (form == 0 || field == 0) + { + RETURN(E_BAD_ARGUMENT); + } + else if ((form != field->form) || Field_Is_Not_Selectable(field)) + { + RETURN(E_REQUEST_DENIED); + } + else if ((form->status & _POSTED) == 0) + { + form->current = field; + form->curpage = field->page; + } + else + { + if ((form->status & _IN_DRIVER) != 0) + { + err = E_BAD_STATE; + } + else + { + if (form->current != field) + { + if (form->current && !_nc_Internal_Validation(form)) + { + err = E_INVALID_FIELD; + } + else + { + Call_Hook(form, fieldterm); + if (field->page != form->curpage) + { + Call_Hook(form, formterm); + err = _nc_Set_Form_Page(form, (int)field->page, field); + Call_Hook(form, forminit); + } + else + { + err = _nc_Set_Current_Field(form, field); + } + Call_Hook(form, fieldinit); + (void)_nc_Refresh_Current_Field(form); + } + } + } + } + RETURN(err); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int unfocus_current_field(FORM * form) +| +| Description : Removes focus from the current field. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form pointer +| E_REQUEST_DENIED - there is no current field to unfocus ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +unfocus_current_field(FORM *const form) +{ + T((T_CALLED("unfocus_current_field(%p)"), (const void *)form)); + if (form == 0) + { + RETURN(E_BAD_ARGUMENT); + } + else if (form->current == 0) + { + RETURN(E_REQUEST_DENIED); + } + _nc_Unset_Current_Field(form); + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELD *current_field(const FORM * form) +| +| Description : Return the current field. +| +| Return Values : Pointer to the current field. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELD *) +current_field(const FORM *form) +{ + T((T_CALLED("current_field(%p)"), (const void *)form)); + returnField(Normalize_Form(form)->current); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_index(const FIELD * field) +| +| Description : Return the index of the field in the field-array of +| the form. +| +| Return Values : >= 0 : field index +| -1 : fieldpointer invalid or field not connected ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_index(const FIELD *field) +{ + T((T_CALLED("field_index(%p)"), (const void *)field)); + returnCode((field != 0 && field->form != 0) ? (int)field->index : -1); +} + +/* fld_current.c ends here */ diff --git a/contrib/ncurses/form/fld_def.c b/contrib/ncurses/form/fld_def.c new file mode 100644 index 00000000..51bdc648 --- /dev/null +++ b/contrib/ncurses/form/fld_def.c @@ -0,0 +1,399 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_def.c,v 1.44 2021/03/27 23:49:53 tom Exp $") + +/* this can't be readonly */ +static FIELD default_field = +{ + 0, /* status */ + 0, /* rows */ + 0, /* cols */ + 0, /* frow */ + 0, /* fcol */ + 0, /* drows */ + 0, /* dcols */ + 0, /* maxgrow */ + 0, /* nrow */ + 0, /* nbuf */ + NO_JUSTIFICATION, /* just */ + 0, /* page */ + 0, /* index */ + (int)' ', /* pad */ + A_NORMAL, /* fore */ + A_NORMAL, /* back */ + STD_FIELD_OPTS, /* opts */ + (FIELD *)0, /* snext */ + (FIELD *)0, /* sprev */ + (FIELD *)0, /* link */ + (FORM *)0, /* form */ + (FIELDTYPE *)0, /* type */ + (char *)0, /* arg */ + (FIELD_CELL *)0, /* buf */ + (char *)0 /* usrptr */ + NCURSES_FIELD_EXTENSION +}; + +FORM_EXPORT_VAR(FIELD *) _nc_Default_Field = &default_field; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : TypeArgument *_nc_Make_Argument( +| const FIELDTYPE *typ, +| va_list *ap, +| int *err ) +| +| Description : Create an argument structure for the specified type. +| Use the type-dependent argument list to construct +| it. +| +| Return Values : Pointer to argument structure. Maybe NULL. +| In case of an error in *err an error counter is increased. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(TypeArgument *) +_nc_Make_Argument(const FIELDTYPE *typ, va_list *ap, int *err) +{ + TypeArgument *res = (TypeArgument *)0; + + if (typ != 0 && (typ->status & _HAS_ARGS) != 0) + { + assert(err != 0 && ap != (va_list *)0); + if ((typ->status & _LINKED_TYPE) != 0) + { + TypeArgument *p = typeMalloc(TypeArgument, 1); + + if (p != 0) + { + p->left = _nc_Make_Argument(typ->left, ap, err); + p->right = _nc_Make_Argument(typ->right, ap, err); + return p; + } + else + { + *err += 1; + } + } + else + { + assert(typ->makearg != (void *)0); + if (!(res = (TypeArgument *)typ->makearg(ap))) + { + *err += 1; + } + } + } + return res; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : TypeArgument *_nc_Copy_Argument(const FIELDTYPE *typ, +| const TypeArgument *argp, +| int *err ) +| +| Description : Create a copy of an argument structure for the specified +| type. +| +| Return Values : Pointer to argument structure. Maybe NULL. +| In case of an error in *err an error counter is increased. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(TypeArgument *) +_nc_Copy_Argument(const FIELDTYPE *typ, const TypeArgument *argp, int *err) +{ + TypeArgument *res = (TypeArgument *)0; + + if (typ != 0 && (typ->status & _HAS_ARGS) != 0) + { + assert(err != 0 && argp != 0); + if ((typ->status & _LINKED_TYPE) != 0) + { + TypeArgument *p = typeMalloc(TypeArgument, 1); + + if (p != 0) + { + p->left = _nc_Copy_Argument(typ, argp->left, err); + p->right = _nc_Copy_Argument(typ, argp->right, err); + return p; + } + *err += 1; + } + else + { + if (typ->copyarg != (void *)0) + { + if (!(res = (TypeArgument *)(typ->copyarg((const void *)argp)))) + { + *err += 1; + } + } + else + { + res = (TypeArgument *)argp; + } + } + } + return res; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : void _nc_Free_Argument(const FIELDTYPE *typ, +| TypeArgument * argp ) +| +| Description : Release memory associated with the argument structure +| for the given fieldtype. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +FORM_EXPORT(void) +_nc_Free_Argument(const FIELDTYPE *typ, TypeArgument *argp) +{ + if (typ != 0 && (typ->status & _HAS_ARGS) != 0) + { + if ((typ->status & _LINKED_TYPE) != 0) + { + if (argp != 0) + { + _nc_Free_Argument(typ->left, argp->left); + _nc_Free_Argument(typ->right, argp->right); + free(argp); + } + } + else + { + if (typ->freearg != (void *)0) + { + typ->freearg((void *)argp); + } + } + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : bool _nc_Copy_Type( FIELD *dst, FIELD const *src ) +| +| Description : Copy argument structure of field src to field dst +| +| Return Values : TRUE - copy worked +| FALSE - error occurred ++--------------------------------------------------------------------------*/ +FORM_EXPORT(bool) +_nc_Copy_Type(FIELD *dst, FIELD const *src) +{ + int err = 0; + + assert(dst != 0 && src != 0); + + dst->type = src->type; + dst->arg = (void *)_nc_Copy_Argument(src->type, (TypeArgument *)(src->arg), &err); + + if (err != 0) + { + _nc_Free_Argument(dst->type, (TypeArgument *)(dst->arg)); + dst->type = (FIELDTYPE *)0; + dst->arg = (void *)0; + return FALSE; + } + else + { + if (dst->type != 0) + { + dst->type->ref++; + } + return TRUE; + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : void _nc_Free_Type( FIELD *field ) +| +| Description : Release Argument structure for this field +| +| Return Values : - ++--------------------------------------------------------------------------*/ +FORM_EXPORT(void) +_nc_Free_Type(FIELD *field) +{ + assert(field != 0); + if (field->type != 0) + { + field->type->ref--; + _nc_Free_Argument(field->type, (TypeArgument *)(field->arg)); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELD *new_field( int rows, int cols, +| int frow, int fcol, +| int nrow, int nbuf ) +| +| Description : Create a new field with this many 'rows' and 'cols', +| starting at 'frow/fcol' in the subwindow of the form. +| Allocate 'nrow' off-screen rows and 'nbuf' additional +| buffers. If an error occurs, errno is set to +| +| E_BAD_ARGUMENT - invalid argument +| E_SYSTEM_ERROR - system error +| +| Return Values : Pointer to the new field or NULL if failure. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELD *) +new_field(int rows, int cols, int frow, int fcol, int nrow, int nbuf) +{ + static const FIELD_CELL blank = BLANK; + static const FIELD_CELL zeros = ZEROS; + + FIELD *New_Field = (FIELD *)0; + int err = E_BAD_ARGUMENT; + + T((T_CALLED("new_field(%d,%d,%d,%d,%d,%d)"), rows, cols, frow, fcol, nrow, nbuf)); + if (rows > 0 && + cols > 0 && + frow >= 0 && + fcol >= 0 && + nrow >= 0 && + nbuf >= 0 && + ((err = E_SYSTEM_ERROR) != 0) && /* trick: this resets the default error */ + (New_Field = typeMalloc(FIELD, 1)) != 0) + { + T((T_CREATE("field %p"), (void *)New_Field)); + *New_Field = default_field; + New_Field->rows = (short)rows; + New_Field->cols = (short)cols; + New_Field->drows = rows + nrow; + New_Field->dcols = cols; + New_Field->frow = (short)frow; + New_Field->fcol = (short)fcol; + New_Field->nrow = nrow; + New_Field->nbuf = (short)nbuf; + New_Field->link = New_Field; + +#if USE_WIDEC_SUPPORT + New_Field->working = newpad(1, Buffer_Length(New_Field) + 1); + New_Field->expanded = typeCalloc(char *, 1 + (unsigned)nbuf); +#endif + + if (_nc_Copy_Type(New_Field, &default_field)) + { + size_t len; + + len = Total_Buffer_Size(New_Field); + if ((New_Field->buf = (FIELD_CELL *)malloc(len))) + { + /* Prefill buffers with blanks and insert terminating zeroes + between buffers */ + int i, j; + int cells = Buffer_Length(New_Field); + + for (i = 0; i <= New_Field->nbuf; i++) + { + FIELD_CELL *buffer = &(New_Field->buf[(cells + 1) * i]); + + for (j = 0; j < cells; ++j) + { + buffer[j] = blank; + } + buffer[j] = zeros; + } + returnField(New_Field); + } + } + } + + if (New_Field) + free_field(New_Field); + + SET_ERROR(err); + returnField((FIELD *)0); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int free_field( FIELD *field ) +| +| Description : Frees the storage allocated for the field. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer +| E_CONNECTED - field is connected ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +free_field(FIELD *field) +{ + T((T_CALLED("free_field(%p)"), (void *)field)); + if (!field) + { + RETURN(E_BAD_ARGUMENT); + } + else if (field->form != 0) + { + RETURN(E_CONNECTED); + } + else if (field == field->link) + { + if (field->buf != 0) + free(field->buf); + } + else + { + FIELD *f; + + for (f = field; f->link != field; f = f->link) + { + } + f->link = field->link; + } + _nc_Free_Type(field); +#if USE_WIDEC_SUPPORT + if (field->expanded != 0) + { + int n; + + for (n = 0; n <= field->nbuf; ++n) + { + FreeIfNeeded(field->expanded[n]); + } + free(field->expanded); + (void)delwin(field->working); + } +#endif + free(field); + RETURN(E_OK); +} + +/* fld_def.c ends here */ diff --git a/contrib/ncurses/form/fld_dup.c b/contrib/ncurses/form/fld_dup.c new file mode 100644 index 00000000..e195df95 --- /dev/null +++ b/contrib/ncurses/form/fld_dup.c @@ -0,0 +1,101 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_dup.c,v 1.18 2020/05/24 01:40:20 anonymous.maarten Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELD *dup_field(FIELD *field, int frow, int fcol) +| +| Description : Duplicates the field at the specified position. All +| field attributes and the buffers are copied. +| If an error occurs, errno is set to +| +| E_BAD_ARGUMENT - invalid argument +| E_SYSTEM_ERROR - system error +| +| Return Values : Pointer to the new field or NULL if failure ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELD *) +dup_field(FIELD *field, int frow, int fcol) +{ + FIELD *New_Field = (FIELD *)0; + int err = E_BAD_ARGUMENT; + + T((T_CALLED("dup_field(%p,%d,%d)"), (void *)field, frow, fcol)); + if (field && (frow >= 0) && (fcol >= 0) && + ((err = E_SYSTEM_ERROR) != 0) && /* trick : this resets the default error */ + (New_Field = typeMalloc(FIELD, 1))) + { + T((T_CREATE("field %p"), (void *)New_Field)); + *New_Field = *_nc_Default_Field; + New_Field->frow = (short)frow; + New_Field->fcol = (short)fcol; + New_Field->link = New_Field; + New_Field->rows = field->rows; + New_Field->cols = field->cols; + New_Field->nrow = field->nrow; + New_Field->drows = field->drows; + New_Field->dcols = field->dcols; + New_Field->maxgrow = field->maxgrow; + New_Field->nbuf = field->nbuf; + New_Field->just = field->just; + New_Field->fore = field->fore; + New_Field->back = field->back; + New_Field->pad = field->pad; + New_Field->opts = field->opts; + New_Field->usrptr = field->usrptr; + + if (_nc_Copy_Type(New_Field, field)) + { + size_t len; + + len = Total_Buffer_Size(New_Field); + if ((New_Field->buf = (FIELD_CELL *)malloc(len * 20))) + { + memcpy(New_Field->buf, field->buf, len); + returnField(New_Field); + } + } + } + + if (New_Field) + free_field(New_Field); + + SET_ERROR(err); + returnField((FIELD *)0); +} + +/* fld_dup.c ends here */ diff --git a/contrib/ncurses/form/fld_ftchoice.c b/contrib/ncurses/form/fld_ftchoice.c new file mode 100644 index 00000000..dfaca149 --- /dev/null +++ b/contrib/ncurses/form/fld_ftchoice.c @@ -0,0 +1,76 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_ftchoice.c,v 1.18 2021/06/17 21:26:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_fieldtype_choice( +| FIELDTYPE *typ, +| bool (* const next_choice)(FIELD *,const void *), +| bool (* const prev_choice)(FIELD *,const void *)) +| +| Description : Define implementation of enumeration requests. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid arguments ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_fieldtype_choice(FIELDTYPE *typ, + bool (*const next_choice) (FIELD *, const void *), + bool (*const prev_choice) (FIELD *, const void *)) +{ + TR_FUNC_BFR(2); + + T((T_CALLED("set_fieldtype_choice(%p,%s,%s)"), + (void *)typ, + TR_FUNC_ARG(0, next_choice), + TR_FUNC_ARG(1, prev_choice))); + + if (!typ || !next_choice || !prev_choice) + RETURN(E_BAD_ARGUMENT); + + SetStatus(typ, _HAS_CHOICE); +#if NCURSES_INTEROP_FUNCS + typ->enum_next.onext = next_choice; + typ->enum_prev.oprev = prev_choice; +#else + typ->next = next_choice; + typ->prev = prev_choice; +#endif + RETURN(E_OK); +} + +/* fld_ftchoice.c ends here */ diff --git a/contrib/ncurses/form/fld_ftlink.c b/contrib/ncurses/form/fld_ftlink.c new file mode 100644 index 00000000..ed169200 --- /dev/null +++ b/contrib/ncurses/form/fld_ftlink.c @@ -0,0 +1,88 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_ftlink.c,v 1.18 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELDTYPE *link_fieldtype( +| FIELDTYPE *type1, +| FIELDTYPE *type2) +| +| Description : Create a new fieldtype built from the two given types. +| They are connected by an logical 'OR'. +| If an error occurs, errno is set to +| E_BAD_ARGUMENT - invalid arguments +| E_SYSTEM_ERROR - system error (no memory) +| +| Return Values : Fieldtype pointer or NULL if error occurred. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELDTYPE *) +link_fieldtype(FIELDTYPE *type1, FIELDTYPE *type2) +{ + FIELDTYPE *nftyp = (FIELDTYPE *)0; + + T((T_CALLED("link_fieldtype(%p,%p)"), (void *)type1, (void *)type2)); + if (type1 && type2) + { + nftyp = typeMalloc(FIELDTYPE, 1); + + if (nftyp) + { + T((T_CREATE("fieldtype %p"), (void *)nftyp)); + *nftyp = *_nc_Default_FieldType; + SetStatus(nftyp, _LINKED_TYPE); + if ((type1->status & _HAS_ARGS) || (type2->status & _HAS_ARGS)) + SetStatus(nftyp, _HAS_ARGS); + if ((type1->status & _HAS_CHOICE) || (type2->status & _HAS_CHOICE)) + SetStatus(nftyp, _HAS_CHOICE); + nftyp->left = type1; + nftyp->right = type2; + type1->ref++; + type2->ref++; + } + else + { + SET_ERROR(E_SYSTEM_ERROR); + } + } + else + { + SET_ERROR(E_BAD_ARGUMENT); + } + returnFieldType(nftyp); +} + +/* fld_ftlink.c ends here */ diff --git a/contrib/ncurses/form/fld_info.c b/contrib/ncurses/form/fld_info.c new file mode 100644 index 00000000..bc8399dc --- /dev/null +++ b/contrib/ncurses/form/fld_info.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_info.c,v 1.16 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_info(const FIELD *field, +| int *rows, int *cols, +| int *frow, int *fcol, +| int *nrow, int *nbuf) +| +| Description : Retrieve information about the field's creation parameters. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_info(const FIELD *field, + int *rows, int *cols, + int *frow, int *fcol, + int *nrow, int *nbuf) +{ + T((T_CALLED("field_info(%p,%p,%p,%p,%p,%p,%p)"), + (const void *)field, + (void *)rows, (void *)cols, + (void *)frow, (void *)fcol, + (void *)nrow, (void *)nbuf)); + + if (!field) + RETURN(E_BAD_ARGUMENT); + + if (rows) + *rows = field->rows; + if (cols) + *cols = field->cols; + if (frow) + *frow = field->frow; + if (fcol) + *fcol = field->fcol; + if (nrow) + *nrow = field->nrow; + if (nbuf) + *nbuf = field->nbuf; + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int dynamic_field_info(const FIELD *field, +| int *drows, int *dcols, +| int *maxgrow) +| +| Description : Retrieve information about a dynamic field's current +| dynamic parameters. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid argument ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +dynamic_field_info(const FIELD *field, int *drows, int *dcols, int *maxgrow) +{ + T((T_CALLED("dynamic_field_info(%p,%p,%p,%p)"), + (const void *)field, + (void *)drows, + (void *)dcols, + (void *)maxgrow)); + + if (!field) + RETURN(E_BAD_ARGUMENT); + + if (drows) + *drows = field->drows; + if (dcols) + *dcols = field->dcols; + if (maxgrow) + *maxgrow = field->maxgrow; + + RETURN(E_OK); +} + +/* fld_info.c ends here */ diff --git a/contrib/ncurses/form/fld_just.c b/contrib/ncurses/form/fld_just.c new file mode 100644 index 00000000..62253bcf --- /dev/null +++ b/contrib/ncurses/form/fld_just.c @@ -0,0 +1,87 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_just.c,v 1.17 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_just(FIELD *field, int just) +| +| Description : Set the field's type of justification. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - one of the arguments was incorrect +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_just(FIELD *field, int just) +{ + int res = E_BAD_ARGUMENT; + + T((T_CALLED("set_field_just(%p,%d)"), (void *)field, just)); + + if ((just == NO_JUSTIFICATION) || + (just == JUSTIFY_LEFT) || + (just == JUSTIFY_CENTER) || + (just == JUSTIFY_RIGHT)) + { + Normalize_Field(field); + if (field->just != just) + { + field->just = (short)just; + res = _nc_Synchronize_Attributes(field); + } + else + res = E_OK; + } + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_just( const FIELD *field ) +| +| Description : Retrieve the field's type of justification +| +| Return Values : The justification type. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_just(const FIELD *field) +{ + T((T_CALLED("field_just(%p)"), (const void *)field)); + returnCode(Normalize_Field(field)->just); +} + +/* fld_just.c ends here */ diff --git a/contrib/ncurses/form/fld_link.c b/contrib/ncurses/form/fld_link.c new file mode 100644 index 00000000..c0604584 --- /dev/null +++ b/contrib/ncurses/form/fld_link.c @@ -0,0 +1,97 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_link.c,v 1.17 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELD *link_field(FIELD *field, int frow, int fcol) +| +| Description : Duplicates the field at the specified position. The +| new field shares its buffers with the original one, +| the attributes are independent. +| If an error occurs, errno is set to +| +| E_BAD_ARGUMENT - invalid argument +| E_SYSTEM_ERROR - system error +| +| Return Values : Pointer to the new field or NULL if failure ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELD *) +link_field(FIELD *field, int frow, int fcol) +{ + FIELD *New_Field = (FIELD *)0; + int err = E_BAD_ARGUMENT; + + T((T_CALLED("link_field(%p,%d,%d)"), (void *)field, frow, fcol)); + if (field && (frow >= 0) && (fcol >= 0) && + ((err = E_SYSTEM_ERROR) != 0) && /* trick: this resets the default error */ + (New_Field = typeMalloc(FIELD, 1))) + { + T((T_CREATE("field %p"), (void *)New_Field)); + *New_Field = *_nc_Default_Field; + New_Field->frow = (short)frow; + New_Field->fcol = (short)fcol; + + New_Field->link = field->link; + field->link = New_Field; + + New_Field->buf = field->buf; + New_Field->rows = field->rows; + New_Field->cols = field->cols; + New_Field->nrow = field->nrow; + New_Field->nbuf = field->nbuf; + New_Field->drows = field->drows; + New_Field->dcols = field->dcols; + New_Field->maxgrow = field->maxgrow; + New_Field->just = field->just; + New_Field->fore = field->fore; + New_Field->back = field->back; + New_Field->pad = field->pad; + New_Field->opts = field->opts; + New_Field->usrptr = field->usrptr; + + if (_nc_Copy_Type(New_Field, field)) + returnField(New_Field); + } + + if (New_Field) + free_field(New_Field); + + SET_ERROR(err); + returnField((FIELD *)0); +} + +/* fld_link.c ends here */ diff --git a/contrib/ncurses/form/fld_max.c b/contrib/ncurses/form/fld_max.c new file mode 100644 index 00000000..325541a3 --- /dev/null +++ b/contrib/ncurses/form/fld_max.c @@ -0,0 +1,83 @@ +/**************************************************************************** + * Copyright 2019-2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_max.c,v 1.18 2021/06/17 21:26:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_max_field(FIELD *field, int maxgrow) +| +| Description : Set the maximum growth for a dynamic field. If maxgrow=0 +| the field may grow to any possible size. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid argument ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_max_field(FIELD *field, int maxgrow) +{ + T((T_CALLED("set_max_field(%p,%d)"), (void *)field, maxgrow)); + + if (!field || (maxgrow < 0)) + RETURN(E_BAD_ARGUMENT); + else + { + bool single_line_field = Single_Line_Field(field); + + if (maxgrow > 0) + { + if (((single_line_field && (maxgrow < field->dcols)) || + (!single_line_field && (maxgrow < field->drows))) && + !Field_Has_Option(field, O_INPUT_LIMIT)) + RETURN(E_BAD_ARGUMENT); + } + field->maxgrow = maxgrow; + /* shrink */ + if (maxgrow > 0 && Field_Has_Option(field, O_INPUT_LIMIT) && + field->dcols > maxgrow) + field->dcols = maxgrow; + ClrStatus(field, _MAY_GROW); + if (!((unsigned)field->opts & O_STATIC)) + { + if ((maxgrow == 0) || + (single_line_field && (field->dcols < maxgrow)) || + (!single_line_field && (field->drows < maxgrow))) + SetStatus(field, _MAY_GROW); + } + } + RETURN(E_OK); +} + +/* fld_max.c ends here */ diff --git a/contrib/ncurses/form/fld_move.c b/contrib/ncurses/form/fld_move.c new file mode 100644 index 00000000..0d9ac4ae --- /dev/null +++ b/contrib/ncurses/form/fld_move.c @@ -0,0 +1,65 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_move.c,v 1.16 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int move_field(FIELD *field,int frow, int fcol) +| +| Description : Moves the disconnected field to the new location in +| the form's subwindow. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid argument passed +| E_CONNECTED - field is connected ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +move_field(FIELD *field, int frow, int fcol) +{ + T((T_CALLED("move_field(%p,%d,%d)"), (void *)field, frow, fcol)); + + if (!field || (frow < 0) || (fcol < 0)) + RETURN(E_BAD_ARGUMENT); + + if (field->form) + RETURN(E_CONNECTED); + + field->frow = (short)frow; + field->fcol = (short)fcol; + RETURN(E_OK); +} + +/* fld_move.c ends here */ diff --git a/contrib/ncurses/form/fld_newftyp.c b/contrib/ncurses/form/fld_newftyp.c new file mode 100644 index 00000000..c5848d5f --- /dev/null +++ b/contrib/ncurses/form/fld_newftyp.c @@ -0,0 +1,149 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_newftyp.c,v 1.23 2020/05/24 01:40:20 anonymous.maarten Exp $") + +static FIELDTYPE default_fieldtype = +{ + 0, /* status */ + 0L, /* reference count */ + (FIELDTYPE *)0, /* pointer to left operand */ + (FIELDTYPE *)0, /* pointer to right operand */ + NULL, /* makearg function */ + NULL, /* copyarg function */ + NULL, /* freearg function */ + INIT_FT_FUNC(NULL), /* field validation function */ + INIT_FT_FUNC(NULL), /* Character check function */ + INIT_FT_FUNC(NULL), /* enumerate next function */ + INIT_FT_FUNC(NULL), /* enumerate previous function */ +#if NCURSES_INTEROP_FUNCS + NULL /* generic callback alternative to makearg */ +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) + _nc_Default_FieldType = &default_fieldtype; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELDTYPE *new_fieldtype( +| bool (* const field_check)(FIELD *,const void *), +| bool (* const char_check) (int, const void *) ) +| +| Description : Create a new fieldtype. The application programmer must +| write a field_check and a char_check function and give +| them as input to this call. +| If an error occurs, errno is set to +| E_BAD_ARGUMENT - invalid arguments +| E_SYSTEM_ERROR - system error (no memory) +| +| Return Values : Fieldtype pointer or NULL if error occurred ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELDTYPE *) +new_fieldtype(bool (*const field_check) (FIELD *, const void *), + bool (*const char_check) (int, const void *)) +{ + FIELDTYPE *nftyp = (FIELDTYPE *)0; + + TR_FUNC_BFR(2); + + T((T_CALLED("new_fieldtype(%s,%s)"), + TR_FUNC_ARG(0, field_check), + TR_FUNC_ARG(1, char_check))); + + if ((field_check) || (char_check)) + { + nftyp = typeMalloc(FIELDTYPE, 1); + + if (nftyp) + { + T((T_CREATE("fieldtype %p"), (void *)nftyp)); + *nftyp = default_fieldtype; +#if NCURSES_INTEROP_FUNCS + nftyp->fieldcheck.ofcheck = field_check; + nftyp->charcheck.occheck = char_check; +#else + nftyp->fcheck = field_check; + nftyp->ccheck = char_check; +#endif + } + else + { + SET_ERROR(E_SYSTEM_ERROR); + } + } + else + { + SET_ERROR(E_BAD_ARGUMENT); + } + returnFieldType(nftyp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int free_fieldtype(FIELDTYPE *typ) +| +| Description : Release the memory associated with this fieldtype. +| +| Return Values : E_OK - success +| E_CONNECTED - there are fields referencing the type +| E_BAD_ARGUMENT - invalid fieldtype pointer ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +free_fieldtype(FIELDTYPE *typ) +{ + T((T_CALLED("free_fieldtype(%p)"), (void *)typ)); + + if (!typ) + RETURN(E_BAD_ARGUMENT); + + if (typ->ref != 0) + RETURN(E_CONNECTED); + + if (typ->status & _RESIDENT) + RETURN(E_CONNECTED); + + if (typ->status & _LINKED_TYPE) + { + if (typ->left) + typ->left->ref--; + if (typ->right) + typ->right->ref--; + } + free(typ); + RETURN(E_OK); +} + +/* fld_newftyp.c ends here */ diff --git a/contrib/ncurses/form/fld_opts.c b/contrib/ncurses/form/fld_opts.c new file mode 100644 index 00000000..ab4d5594 --- /dev/null +++ b/contrib/ncurses/form/fld_opts.c @@ -0,0 +1,139 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_opts.c,v 1.16 2021/06/17 21:20:30 tom Exp $") + +/*---------------------------------------------------------------------------- + Field-Options manipulation routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_opts(FIELD *field, Field_Options opts) +| +| Description : Turns on the named options for this field and turns +| off all the remaining options. +| +| Return Values : E_OK - success +| E_CURRENT - the field is the current field +| E_BAD_ARGUMENT - invalid options +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_opts(FIELD *field, Field_Options opts) +{ + int res = E_BAD_ARGUMENT; + + T((T_CALLED("set_field_opts(%p,%d)"), (void *)field, opts)); + + opts &= ALL_FIELD_OPTS; + if (!(opts & ~ALL_FIELD_OPTS)) + res = _nc_Synchronize_Options(Normalize_Field(field), opts); + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : Field_Options field_opts(const FIELD *field) +| +| Description : Retrieve the field's options. +| +| Return Values : The options. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(Field_Options) +field_opts(const FIELD *field) +{ + T((T_CALLED("field_opts(%p)"), (const void *)field)); + + returnCode(ALL_FIELD_OPTS & Normalize_Field(field)->opts); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_opts_on(FIELD *field, Field_Options opts) +| +| Description : Turns on the named options for this field and all the +| remaining options are unchanged. +| +| Return Values : E_OK - success +| E_CURRENT - the field is the current field +| E_BAD_ARGUMENT - invalid options +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_opts_on(FIELD *field, Field_Options opts) +{ + int res = E_BAD_ARGUMENT; + + T((T_CALLED("field_opts_on(%p,%d)"), (void *)field, opts)); + + opts &= ALL_FIELD_OPTS; + if (!(opts & ~ALL_FIELD_OPTS)) + { + Normalize_Field(field); + res = _nc_Synchronize_Options(field, field->opts | opts); + } + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_opts_off(FIELD *field, Field_Options opts) +| +| Description : Turns off the named options for this field and all the +| remaining options are unchanged. +| +| Return Values : E_OK - success +| E_CURRENT - the field is the current field +| E_BAD_ARGUMENT - invalid options +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_opts_off(FIELD *field, Field_Options opts) +{ + int res = E_BAD_ARGUMENT; + + T((T_CALLED("field_opts_off(%p,%d)"), (void *)field, opts)); + + opts &= ALL_FIELD_OPTS; + if (!(opts & ~ALL_FIELD_OPTS)) + { + Normalize_Field(field); + res = _nc_Synchronize_Options(field, field->opts & ~opts); + } + RETURN(res); +} + +/* fld_opts.c ends here */ diff --git a/contrib/ncurses/form/fld_pad.c b/contrib/ncurses/form/fld_pad.c new file mode 100644 index 00000000..fdd803fe --- /dev/null +++ b/contrib/ncurses/form/fld_pad.c @@ -0,0 +1,86 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_pad.c,v 1.14 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_pad(FIELD *field, int ch) +| +| Description : Set the pad character used to fill the field. This must +| be a printable character. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer or pad character +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_pad(FIELD *field, int ch) +{ + int res = E_BAD_ARGUMENT; + + T((T_CALLED("set_field_pad(%p,%d)"), (void *)field, ch)); + + Normalize_Field(field); + if (isprint(UChar(ch))) + { + if (field->pad != ch) + { + field->pad = ch; + res = _nc_Synchronize_Attributes(field); + } + else + res = E_OK; + } + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_pad(const FIELD *field) +| +| Description : Retrieve the field's pad character. +| +| Return Values : The pad character. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_pad(const FIELD *field) +{ + T((T_CALLED("field_pad(%p)"), (const void *)field)); + + returnCode(Normalize_Field(field)->pad); +} + +/* fld_pad.c ends here */ diff --git a/contrib/ncurses/form/fld_page.c b/contrib/ncurses/form/fld_page.c new file mode 100644 index 00000000..6972d310 --- /dev/null +++ b/contrib/ncurses/form/fld_page.c @@ -0,0 +1,83 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_page.c,v 1.16 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_new_page(FIELD *field, bool new_page_flag) +| +| Description : Marks the field as the beginning of a new page of +| the form. +| +| Return Values : E_OK - success +| E_CONNECTED - field is connected ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_new_page(FIELD *field, bool new_page_flag) +{ + T((T_CALLED("set_new_page(%p,%d)"), (void *)field, new_page_flag)); + + Normalize_Field(field); + if (field->form) + RETURN(E_CONNECTED); + + if (new_page_flag) + SetStatus(field, _NEWPAGE); + else + ClrStatus(field, _NEWPAGE); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : bool new_page(const FIELD *field) +| +| Description : Retrieve the information whether or not the field starts +| a new page on the form. +| +| Return Values : TRUE - field starts a new page +| FALSE - field doesn't start a new page ++--------------------------------------------------------------------------*/ +FORM_EXPORT(bool) +new_page(const FIELD *field) +{ + T((T_CALLED("new_page(%p)"), (const void *)field)); + + returnBool((Normalize_Field(field)->status & _NEWPAGE) ? TRUE : FALSE); +} + +/* fld_page.c ends here */ diff --git a/contrib/ncurses/form/fld_stat.c b/contrib/ncurses/form/fld_stat.c new file mode 100644 index 00000000..62d782ed --- /dev/null +++ b/contrib/ncurses/form/fld_stat.c @@ -0,0 +1,80 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_stat.c,v 1.18 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_status(FIELD *field, bool status) +| +| Description : Set or clear the 'changed' indication flag for that +| field's primary buffer. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_status(FIELD *field, bool status) +{ + T((T_CALLED("set_field_status(%p,%d)"), (void *)field, status)); + + Normalize_Field(field); + + if (status) + SetStatus(field, _CHANGED); + else + ClrStatus(field, _CHANGED); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : bool field_status(const FIELD *field) +| +| Description : Retrieve the value of the 'changed' indication flag +| for that field's primary buffer. +| +| Return Values : TRUE - buffer has been changed +| FALSE - buffer has not been changed ++--------------------------------------------------------------------------*/ +FORM_EXPORT(bool) +field_status(const FIELD *field) +{ + T((T_CALLED("field_status(%p)"), (const void *)field)); + + returnBool((Normalize_Field(field)->status & _CHANGED) ? TRUE : FALSE); +} + +/* fld_stat.c ends here */ diff --git a/contrib/ncurses/form/fld_type.c b/contrib/ncurses/form/fld_type.c new file mode 100644 index 00000000..c557e053 --- /dev/null +++ b/contrib/ncurses/form/fld_type.c @@ -0,0 +1,98 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_type.c,v 1.20 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_type(FIELD *field, FIELDTYPE *type,...) +| +| Description : Associate the specified fieldtype with the field. +| Certain field types take additional arguments. Look +| at the spec of the field types ! +| +| Return Values : E_OK - success +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_type(FIELD *field, FIELDTYPE *type, ...) +{ + va_list ap; + int res = E_SYSTEM_ERROR; + int err = 0; + + T((T_CALLED("set_field_type(%p,%p)"), (void *)field, (void *)type)); + + va_start(ap, type); + + Normalize_Field(field); + _nc_Free_Type(field); + + field->type = type; + field->arg = (void *)_nc_Make_Argument(field->type, &ap, &err); + + if (err) + { + _nc_Free_Argument(field->type, (TypeArgument *)(field->arg)); + field->type = (FIELDTYPE *)0; + field->arg = (void *)0; + } + else + { + res = E_OK; + if (field->type) + field->type->ref++; + } + + va_end(ap); + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELDTYPE *field_type(const FIELD *field) +| +| Description : Retrieve the associated fieldtype for this field. +| +| Return Values : Pointer to fieldtype of NULL if none is defined. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELDTYPE *) +field_type(const FIELD *field) +{ + T((T_CALLED("field_type(%p)"), (const void *)field)); + returnFieldType(Normalize_Field(field)->type); +} + +/* fld_type.c ends here */ diff --git a/contrib/ncurses/form/fld_user.c b/contrib/ncurses/form/fld_user.c new file mode 100644 index 00000000..1b13e626 --- /dev/null +++ b/contrib/ncurses/form/fld_user.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fld_user.c,v 1.20 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_userptr(FIELD *field, void *usrptr) +| +| Description : Set the pointer that is reserved in any field to store +| application relevant information. +| +| Return Values : E_OK - on success ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_userptr(FIELD *field, void *usrptr) +{ + T((T_CALLED("set_field_userptr(%p,%p)"), (void *)field, (void *)usrptr)); + + Normalize_Field(field)->usrptr = usrptr; + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : void *field_userptr(const FIELD *field) +| +| Description : Return the pointer that is reserved in any field to +| store application relevant information. +| +| Return Values : Value of pointer. If no such pointer has been set, +| NULL is returned ++--------------------------------------------------------------------------*/ +FORM_EXPORT(void *) +field_userptr(const FIELD *field) +{ + T((T_CALLED("field_userptr(%p)"), (const void *)field)); + returnVoidPtr(Normalize_Field(field)->usrptr); +} + +/* fld_user.c ends here */ diff --git a/contrib/ncurses/form/form.h b/contrib/ncurses/form/form.h new file mode 100644 index 00000000..3b62e390 --- /dev/null +++ b/contrib/ncurses/form/form.h @@ -0,0 +1,460 @@ +/**************************************************************************** + * Copyright 2018-2019-2020,2021 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/* $Id: form.h,v 0.32 2021/06/17 21:26:02 tom Exp $ */ + +#ifndef FORM_H +#define FORM_H +/* *INDENT-OFF*/ + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#if defined(BUILDING_FORM) +# define FORM_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT +#else +# define FORM_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT +#endif + +#define FORM_WRAPPED_VAR(type,name) extern FORM_IMPEXP type NCURSES_PUBLIC_VAR(name)(void) + +#define FORM_EXPORT(type) FORM_IMPEXP type NCURSES_API +#define FORM_EXPORT_VAR(type) FORM_IMPEXP type + +#ifndef FORM_PRIV_H +typedef void *FIELD_CELL; +#endif + +#ifndef NCURSES_FIELD_INTERNALS +#define NCURSES_FIELD_INTERNALS /* nothing */ +#endif + +typedef int Form_Options; +typedef int Field_Options; + + /********** + * _PAGE * + **********/ + +typedef struct pagenode +#if !NCURSES_OPAQUE_FORM +{ + short pmin; /* index of first field on page */ + short pmax; /* index of last field on page */ + short smin; /* index of top leftmost field on page */ + short smax; /* index of bottom rightmost field on page */ +} +#endif /* !NCURSES_OPAQUE_FORM */ +_PAGE; + + /********** + * FIELD * + **********/ + +typedef struct fieldnode +#if 1 /* not yet: !NCURSES_OPAQUE_FORM */ +{ + unsigned short status; /* flags */ + short rows; /* size in rows */ + short cols; /* size in cols */ + short frow; /* first row */ + short fcol; /* first col */ + int drows; /* dynamic rows */ + int dcols; /* dynamic cols */ + int maxgrow; /* maximum field growth */ + int nrow; /* off-screen rows */ + short nbuf; /* additional buffers */ + short just; /* justification */ + short page; /* page on form */ + short index; /* into form -> field */ + int pad; /* pad character */ + chtype fore; /* foreground attribute */ + chtype back; /* background attribute */ + Field_Options opts; /* options */ + struct fieldnode * snext; /* sorted order pointer */ + struct fieldnode * sprev; /* sorted order pointer */ + struct fieldnode * link; /* linked field chain */ + struct formnode * form; /* containing form */ + struct typenode * type; /* field type */ + void * arg; /* argument for type */ + FIELD_CELL * buf; /* field buffers */ + void * usrptr; /* user pointer */ + /* + * The wide-character configuration requires extra information. Because + * there are existing applications that manipulate the members of FIELD + * directly, we cannot make the struct opaque, except by changing the ABI. + * Offsets of members up to this point are the same in the narrow- and + * wide-character configuration. But note that the type of buf depends on + * the configuration, and is made opaque for that reason. + */ + NCURSES_FIELD_INTERNALS +} +#endif /* NCURSES_OPAQUE_FORM */ +FIELD; + + + /********* + * FORM * + *********/ + +typedef struct formnode +#if 1 /* not yet: !NCURSES_OPAQUE_FORM */ +{ + unsigned short status; /* flags */ + short rows; /* size in rows */ + short cols; /* size in cols */ + int currow; /* current row in field window */ + int curcol; /* current col in field window */ + int toprow; /* in scrollable field window */ + int begincol; /* in horiz. scrollable field */ + short maxfield; /* number of fields */ + short maxpage; /* number of pages */ + short curpage; /* index into page */ + Form_Options opts; /* options */ + WINDOW * win; /* window */ + WINDOW * sub; /* subwindow */ + WINDOW * w; /* window for current field */ + FIELD ** field; /* field [maxfield] */ + FIELD * current; /* current field */ + _PAGE * page; /* page [maxpage] */ + void * usrptr; /* user pointer */ + + void (*forminit)(struct formnode *); + void (*formterm)(struct formnode *); + void (*fieldinit)(struct formnode *); + void (*fieldterm)(struct formnode *); + +} +#endif /* !NCURSES_OPAQUE_FORM */ +FORM; + + + /************** + * FIELDTYPE * + **************/ + +typedef struct typenode +#if !NCURSES_OPAQUE_FORM +{ + unsigned short status; /* flags */ + long ref; /* reference count */ + struct typenode * left; /* ptr to operand for | */ + struct typenode * right; /* ptr to operand for | */ + + void* (*makearg)(va_list *); /* make fieldtype arg */ + void* (*copyarg)(const void *); /* copy fieldtype arg */ + void (*freearg)(void *); /* free fieldtype arg */ + +#if NCURSES_INTEROP_FUNCS + union { + bool (*ofcheck)(FIELD *,const void *); /* field validation */ + bool (*gfcheck)(FORM*,FIELD *,const void*); /* generic field validation */ + } fieldcheck; + union { + bool (*occheck)(int,const void *); /* character validation */ + bool (*gccheck)(int,FORM*, + FIELD*,const void*); /* generic char validation */ + } charcheck; + union { + bool (*onext)(FIELD *,const void *); /* enumerate next value */ + bool (*gnext)(FORM*,FIELD*,const void*); /* generic enumerate next */ + } enum_next; + union { + bool (*oprev)(FIELD *,const void *); /* enumerate prev value */ + bool (*gprev)(FORM*,FIELD*,const void*); /* generic enumerate prev */ + } enum_prev; + void* (*genericarg)(void*); /* Alternate Arg method */ +#else + bool (*fcheck)(FIELD *,const void *); /* field validation */ + bool (*ccheck)(int,const void *); /* character validation */ + + bool (*next)(FIELD *,const void *); /* enumerate next value */ + bool (*prev)(FIELD *,const void *); /* enumerate prev value */ +#endif +} +#endif /* !NCURSES_OPAQUE_FORM */ +FIELDTYPE; + +typedef void (*Form_Hook)(FORM *); + + /*************************** + * miscellaneous #defines * + ***************************/ + +/* field justification */ +#define NO_JUSTIFICATION (0) +#define JUSTIFY_LEFT (1) +#define JUSTIFY_CENTER (2) +#define JUSTIFY_RIGHT (3) + +/* field options */ +#define O_VISIBLE (0x0001U) +#define O_ACTIVE (0x0002U) +#define O_PUBLIC (0x0004U) +#define O_EDIT (0x0008U) +#define O_WRAP (0x0010U) +#define O_BLANK (0x0020U) +#define O_AUTOSKIP (0x0040U) +#define O_NULLOK (0x0080U) +#define O_PASSOK (0x0100U) +#define O_STATIC (0x0200U) +#define O_DYNAMIC_JUSTIFY (0x0400U) /* ncurses extension */ +#define O_NO_LEFT_STRIP (0x0800U) /* ncurses extension */ +#define O_EDGE_INSERT_STAY (0x1000U) /* ncurses extension */ +#define O_INPUT_LIMIT (0x2000U) /* ncurses extension */ + +/* form options */ +#define O_NL_OVERLOAD (0x0001U) +#define O_BS_OVERLOAD (0x0002U) + +/* form driver commands */ +#define REQ_NEXT_PAGE (KEY_MAX + 1) /* move to next page */ +#define REQ_PREV_PAGE (KEY_MAX + 2) /* move to previous page */ +#define REQ_FIRST_PAGE (KEY_MAX + 3) /* move to first page */ +#define REQ_LAST_PAGE (KEY_MAX + 4) /* move to last page */ + +#define REQ_NEXT_FIELD (KEY_MAX + 5) /* move to next field */ +#define REQ_PREV_FIELD (KEY_MAX + 6) /* move to previous field */ +#define REQ_FIRST_FIELD (KEY_MAX + 7) /* move to first field */ +#define REQ_LAST_FIELD (KEY_MAX + 8) /* move to last field */ +#define REQ_SNEXT_FIELD (KEY_MAX + 9) /* move to sorted next field */ +#define REQ_SPREV_FIELD (KEY_MAX + 10) /* move to sorted prev field */ +#define REQ_SFIRST_FIELD (KEY_MAX + 11) /* move to sorted first field */ +#define REQ_SLAST_FIELD (KEY_MAX + 12) /* move to sorted last field */ +#define REQ_LEFT_FIELD (KEY_MAX + 13) /* move to left to field */ +#define REQ_RIGHT_FIELD (KEY_MAX + 14) /* move to right to field */ +#define REQ_UP_FIELD (KEY_MAX + 15) /* move to up to field */ +#define REQ_DOWN_FIELD (KEY_MAX + 16) /* move to down to field */ + +#define REQ_NEXT_CHAR (KEY_MAX + 17) /* move to next char in field */ +#define REQ_PREV_CHAR (KEY_MAX + 18) /* move to prev char in field */ +#define REQ_NEXT_LINE (KEY_MAX + 19) /* move to next line in field */ +#define REQ_PREV_LINE (KEY_MAX + 20) /* move to prev line in field */ +#define REQ_NEXT_WORD (KEY_MAX + 21) /* move to next word in field */ +#define REQ_PREV_WORD (KEY_MAX + 22) /* move to prev word in field */ +#define REQ_BEG_FIELD (KEY_MAX + 23) /* move to first char in field */ +#define REQ_END_FIELD (KEY_MAX + 24) /* move after last char in fld */ +#define REQ_BEG_LINE (KEY_MAX + 25) /* move to beginning of line */ +#define REQ_END_LINE (KEY_MAX + 26) /* move after last char in line */ +#define REQ_LEFT_CHAR (KEY_MAX + 27) /* move left in field */ +#define REQ_RIGHT_CHAR (KEY_MAX + 28) /* move right in field */ +#define REQ_UP_CHAR (KEY_MAX + 29) /* move up in field */ +#define REQ_DOWN_CHAR (KEY_MAX + 30) /* move down in field */ + +#define REQ_NEW_LINE (KEY_MAX + 31) /* insert/overlay new line */ +#define REQ_INS_CHAR (KEY_MAX + 32) /* insert blank char at cursor */ +#define REQ_INS_LINE (KEY_MAX + 33) /* insert blank line at cursor */ +#define REQ_DEL_CHAR (KEY_MAX + 34) /* delete char at cursor */ +#define REQ_DEL_PREV (KEY_MAX + 35) /* delete char before cursor */ +#define REQ_DEL_LINE (KEY_MAX + 36) /* delete line at cursor */ +#define REQ_DEL_WORD (KEY_MAX + 37) /* delete word at cursor */ +#define REQ_CLR_EOL (KEY_MAX + 38) /* clear to end of line */ +#define REQ_CLR_EOF (KEY_MAX + 39) /* clear to end of field */ +#define REQ_CLR_FIELD (KEY_MAX + 40) /* clear entire field */ +#define REQ_OVL_MODE (KEY_MAX + 41) /* begin overlay mode */ +#define REQ_INS_MODE (KEY_MAX + 42) /* begin insert mode */ +#define REQ_SCR_FLINE (KEY_MAX + 43) /* scroll field forward a line */ +#define REQ_SCR_BLINE (KEY_MAX + 44) /* scroll field backward a line */ +#define REQ_SCR_FPAGE (KEY_MAX + 45) /* scroll field forward a page */ +#define REQ_SCR_BPAGE (KEY_MAX + 46) /* scroll field backward a page */ +#define REQ_SCR_FHPAGE (KEY_MAX + 47) /* scroll field forward half page */ +#define REQ_SCR_BHPAGE (KEY_MAX + 48) /* scroll field backward half page */ +#define REQ_SCR_FCHAR (KEY_MAX + 49) /* horizontal scroll char */ +#define REQ_SCR_BCHAR (KEY_MAX + 50) /* horizontal scroll char */ +#define REQ_SCR_HFLINE (KEY_MAX + 51) /* horizontal scroll line */ +#define REQ_SCR_HBLINE (KEY_MAX + 52) /* horizontal scroll line */ +#define REQ_SCR_HFHALF (KEY_MAX + 53) /* horizontal scroll half line */ +#define REQ_SCR_HBHALF (KEY_MAX + 54) /* horizontal scroll half line */ + +#define REQ_VALIDATION (KEY_MAX + 55) /* validate field */ +#define REQ_NEXT_CHOICE (KEY_MAX + 56) /* display next field choice */ +#define REQ_PREV_CHOICE (KEY_MAX + 57) /* display prev field choice */ + +#define MIN_FORM_COMMAND (KEY_MAX + 1) /* used by form_driver */ +#define MAX_FORM_COMMAND (KEY_MAX + 57) /* used by form_driver */ + +#if defined(MAX_COMMAND) +# if (MAX_FORM_COMMAND > MAX_COMMAND) +# error Something is wrong -- MAX_FORM_COMMAND is greater than MAX_COMMAND +# elif (MAX_COMMAND != (KEY_MAX + 128)) +# error Something is wrong -- MAX_COMMAND is already inconsistently defined. +# endif +#else +# define MAX_COMMAND (KEY_MAX + 128) +#endif + + /************************* + * standard field types * + *************************/ +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALPHA; +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALNUM; +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ENUM; +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_INTEGER; +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_NUMERIC; +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_REGEXP; + + /************************************ + * built-in additional field types * + * They are not defined in SVr4 * + ************************************/ +extern FORM_EXPORT_VAR(FIELDTYPE *) TYPE_IPV4; /* Internet IP Version 4 address */ + + /*********************** + * FIELDTYPE routines * + ***********************/ +extern FORM_EXPORT(FIELDTYPE *) new_fieldtype ( + bool (* const field_check)(FIELD *,const void *), + bool (* const char_check)(int,const void *)); +extern FORM_EXPORT(FIELDTYPE *) link_fieldtype( + FIELDTYPE *, FIELDTYPE *); + +extern FORM_EXPORT(int) free_fieldtype (FIELDTYPE *); +extern FORM_EXPORT(int) set_fieldtype_arg (FIELDTYPE *, + void * (* const make_arg)(va_list *), + void * (* const copy_arg)(const void *), + void (* const free_arg)(void *)); +extern FORM_EXPORT(int) set_fieldtype_choice (FIELDTYPE *, + bool (* const next_choice)(FIELD *,const void *), + bool (* const prev_choice)(FIELD *,const void *)); + + /******************* + * FIELD routines * + *******************/ +extern FORM_EXPORT(FIELD *) new_field (int,int,int,int,int,int); +extern FORM_EXPORT(FIELD *) dup_field (FIELD *,int,int); +extern FORM_EXPORT(FIELD *) link_field (FIELD *,int,int); + +extern FORM_EXPORT(int) free_field (FIELD *); +extern FORM_EXPORT(int) field_info (const FIELD *,int *,int *,int *,int *,int *,int *); +extern FORM_EXPORT(int) dynamic_field_info (const FIELD *,int *,int *,int *); +extern FORM_EXPORT(int) set_max_field ( FIELD *,int); +extern FORM_EXPORT(int) move_field (FIELD *,int,int); +extern FORM_EXPORT(int) set_field_type (FIELD *,FIELDTYPE *,...); +extern FORM_EXPORT(int) set_new_page (FIELD *,bool); +extern FORM_EXPORT(int) set_field_just (FIELD *,int); +extern FORM_EXPORT(int) field_just (const FIELD *); +extern FORM_EXPORT(int) set_field_fore (FIELD *,chtype); +extern FORM_EXPORT(int) set_field_back (FIELD *,chtype); +extern FORM_EXPORT(int) set_field_pad (FIELD *,int); +extern FORM_EXPORT(int) field_pad (const FIELD *); +extern FORM_EXPORT(int) set_field_buffer (FIELD *,int,const char *); +extern FORM_EXPORT(int) set_field_status (FIELD *,bool); +extern FORM_EXPORT(int) set_field_userptr (FIELD *, void *); +extern FORM_EXPORT(int) set_field_opts (FIELD *,Field_Options); +extern FORM_EXPORT(int) field_opts_on (FIELD *,Field_Options); +extern FORM_EXPORT(int) field_opts_off (FIELD *,Field_Options); + +extern FORM_EXPORT(chtype) field_fore (const FIELD *); +extern FORM_EXPORT(chtype) field_back (const FIELD *); + +extern FORM_EXPORT(bool) new_page (const FIELD *); +extern FORM_EXPORT(bool) field_status (const FIELD *); + +extern FORM_EXPORT(void *) field_arg (const FIELD *); + +extern FORM_EXPORT(void *) field_userptr (const FIELD *); + +extern FORM_EXPORT(FIELDTYPE *) field_type (const FIELD *); + +extern FORM_EXPORT(char *) field_buffer (const FIELD *,int); + +extern FORM_EXPORT(Field_Options) field_opts (const FIELD *); + + /****************** + * FORM routines * + ******************/ + +extern FORM_EXPORT(FORM *) new_form (FIELD **); + +extern FORM_EXPORT(FIELD **) form_fields (const FORM *); +extern FORM_EXPORT(FIELD *) current_field (const FORM *); + +extern FORM_EXPORT(WINDOW *) form_win (const FORM *); +extern FORM_EXPORT(WINDOW *) form_sub (const FORM *); + +extern FORM_EXPORT(Form_Hook) form_init (const FORM *); +extern FORM_EXPORT(Form_Hook) form_term (const FORM *); +extern FORM_EXPORT(Form_Hook) field_init (const FORM *); +extern FORM_EXPORT(Form_Hook) field_term (const FORM *); + +extern FORM_EXPORT(int) free_form (FORM *); +extern FORM_EXPORT(int) set_form_fields (FORM *,FIELD **); +extern FORM_EXPORT(int) field_count (const FORM *); +extern FORM_EXPORT(int) set_form_win (FORM *,WINDOW *); +extern FORM_EXPORT(int) set_form_sub (FORM *,WINDOW *); +extern FORM_EXPORT(int) set_current_field (FORM *,FIELD *); +extern FORM_EXPORT(int) unfocus_current_field (FORM *); +extern FORM_EXPORT(int) field_index (const FIELD *); +extern FORM_EXPORT(int) set_form_page (FORM *,int); +extern FORM_EXPORT(int) form_page (const FORM *); +extern FORM_EXPORT(int) scale_form (const FORM *,int *,int *); +extern FORM_EXPORT(int) set_form_init (FORM *,Form_Hook); +extern FORM_EXPORT(int) set_form_term (FORM *,Form_Hook); +extern FORM_EXPORT(int) set_field_init (FORM *,Form_Hook); +extern FORM_EXPORT(int) set_field_term (FORM *,Form_Hook); +extern FORM_EXPORT(int) post_form (FORM *); +extern FORM_EXPORT(int) unpost_form (FORM *); +extern FORM_EXPORT(int) pos_form_cursor (FORM *); +extern FORM_EXPORT(int) form_driver (FORM *,int); +# if NCURSES_WIDECHAR +extern FORM_EXPORT(int) form_driver_w (FORM *,int,wchar_t); +# endif +extern FORM_EXPORT(int) set_form_userptr (FORM *,void *); +extern FORM_EXPORT(int) set_form_opts (FORM *,Form_Options); +extern FORM_EXPORT(int) form_opts_on (FORM *,Form_Options); +extern FORM_EXPORT(int) form_opts_off (FORM *,Form_Options); +extern FORM_EXPORT(int) form_request_by_name (const char *); + +extern FORM_EXPORT(const char *) form_request_name (int); + +extern FORM_EXPORT(void *) form_userptr (const FORM *); + +extern FORM_EXPORT(Form_Options) form_opts (const FORM *); + +extern FORM_EXPORT(bool) data_ahead (const FORM *); +extern FORM_EXPORT(bool) data_behind (const FORM *); + +#if NCURSES_SP_FUNCS +extern FORM_EXPORT(FORM *) NCURSES_SP_NAME(new_form) (SCREEN*, FIELD **); +#endif + +#ifdef __cplusplus + } +#endif +/* *INDENT-ON*/ + +#endif /* FORM_H */ diff --git a/contrib/ncurses/form/form.priv.h b/contrib/ncurses/form/form.priv.h new file mode 100644 index 00000000..ad5af63a --- /dev/null +++ b/contrib/ncurses/form/form.priv.h @@ -0,0 +1,308 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/* $Id: form.priv.h,v 0.49 2024/02/24 12:17:31 tom Exp $ */ + +#ifndef FORM_PRIV_H +#define FORM_PRIV_H 1 +/* *INDENT-OFF*/ +#include "curses.priv.h" + +#define NCURSES_OPAQUE_FORM 0 + +#include "mf_common.h" + +#if USE_WIDEC_SUPPORT +#if HAVE_WCTYPE_H +#include +#endif + +#define FIELD_CELL NCURSES_CH_T + +#define NCURSES_FIELD_INTERNALS char** expanded; WINDOW *working; +#define NCURSES_FIELD_EXTENSION , (char **)0, (WINDOW *)0 + +#else + +#define FIELD_CELL char + +#define NCURSES_FIELD_EXTENSION /* nothing */ + +#endif + +#include "form.h" + + /*********************** + * Default objects * + ***********************/ +extern FORM_EXPORT_VAR(FORM *) _nc_Default_Form; +extern FORM_EXPORT_VAR(FIELD *) _nc_Default_Field; +extern FORM_EXPORT_VAR(FIELDTYPE *) _nc_Default_FieldType; + +/* form status values */ +#define _OVLMODE (0x04U) /* Form is in overlay mode */ +#define _WINDOW_MODIFIED (0x10U) /* Current field window has been modified */ +#define _FCHECK_REQUIRED (0x20U) /* Current field needs validation */ + +/* field status values */ +#define _CHANGED (0x01U) /* Field has been changed */ +#define _NEWTOP (0x02U) /* Vertical scrolling occurred */ +#define _NEWPAGE (0x04U) /* field begins new page of form */ +#define _MAY_GROW (0x08U) /* dynamic field may still grow */ + +/* fieldtype status values */ +#define _LINKED_TYPE (0x01U) /* Type is a linked type */ +#define _HAS_ARGS (0x02U) /* Type has arguments */ +#define _HAS_CHOICE (0x04U) /* Type has choice methods */ +#define _RESIDENT (0x08U) /* Type is built-in */ +#define _GENERIC (0x10U) /* A generic field type */ + +/* This are the field options required to be a selectable field in field + navigation requests */ +#define O_SELECTABLE (O_ACTIVE | O_VISIBLE) + +/* If form is NULL replace form argument by default-form */ +#define Normalize_Form(form) \ + ((form) = (form != 0) ? (form) : _nc_Default_Form) + +/* If field is NULL replace field argument by default-field */ +#define Normalize_Field(field) \ + ((field) = (field != 0) ? (field) : _nc_Default_Field) + +#if NCURSES_SP_FUNCS +#define Get_Form_Screen(form) \ + ((form)->win ? _nc_screen_of((form->win)):CURRENT_SCREEN) +#else +#define Get_Form_Screen(form) CURRENT_SCREEN +#endif + +/* Retrieve form's window */ +#define Get_Form_Window(form) \ + ((form)->sub \ + ? (form)->sub \ + : ((form)->win \ + ? (form)->win \ + : StdScreen(Get_Form_Screen(form)))) + +/* Calculate the size for a single buffer for this field */ +#define Buffer_Length(field) ((field)->drows * (field)->dcols) + +/* Calculate the total size of all buffers for this field */ +#define Total_Buffer_Size(field) \ + ( (size_t)(Buffer_Length(field) + 1) * (size_t)(1+(field)->nbuf) * sizeof(FIELD_CELL) ) + +/* Logic to determine whether or not a field is single lined */ +#define Single_Line_Field(field) \ + (((field)->rows + (field)->nrow) == 1) + +#define Field_Has_Option(f,o) ((((unsigned)(f)->opts) & o) != 0) + +/* Logic to determine whether or not a field is selectable */ +#define Field_Is_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)==O_SELECTABLE) +#define Field_Is_Not_Selectable(f) (((unsigned)((f)->opts) & O_SELECTABLE)!=O_SELECTABLE) + +typedef struct typearg + { + struct typearg *left; + struct typearg *right; + } +TypeArgument; + +/* This is a dummy request code (normally invalid) to be used internally + with the form_driver() routine to position to the first active field + on the form +*/ +#define FIRST_ACTIVE_MAGIC (-291056) + +#define ALL_FORM_OPTS ( \ + O_NL_OVERLOAD |\ + O_BS_OVERLOAD ) + +#define STD_FIELD_OPTS (Field_Options)( \ + O_VISIBLE |\ + O_ACTIVE |\ + O_PUBLIC |\ + O_EDIT |\ + O_WRAP |\ + O_BLANK |\ + O_AUTOSKIP|\ + O_NULLOK |\ + O_PASSOK |\ + O_STATIC) + +#define ALL_FIELD_OPTS (Field_Options)( \ + STD_FIELD_OPTS |\ + O_DYNAMIC_JUSTIFY |\ + O_NO_LEFT_STRIP |\ + O_EDGE_INSERT_STAY |\ + O_INPUT_LIMIT) + +#define C_BLANK ' ' +#define is_blank(c) ((c)==C_BLANK) + +#define C_ZEROS '\0' + +extern FORM_EXPORT(TypeArgument *) _nc_Make_Argument (const FIELDTYPE*, va_list*, int*); +extern FORM_EXPORT(TypeArgument *) _nc_Copy_Argument (const FIELDTYPE*, const TypeArgument*, int*); +extern FORM_EXPORT(void) _nc_Free_Argument (const FIELDTYPE*, TypeArgument*); +extern FORM_EXPORT(bool) _nc_Copy_Type (FIELD*, FIELD const *); +extern FORM_EXPORT(void) _nc_Free_Type (FIELD *); + +extern FORM_EXPORT(int) _nc_Synchronize_Attributes (FIELD*); +extern FORM_EXPORT(int) _nc_Synchronize_Options (FIELD*, Field_Options); +extern FORM_EXPORT(int) _nc_Set_Form_Page (FORM*, int, FIELD*); +extern FORM_EXPORT(int) _nc_Refresh_Current_Field (FORM*); +extern FORM_EXPORT(FIELD *) _nc_First_Active_Field (FORM*); +extern FORM_EXPORT(bool) _nc_Internal_Validation (FORM*); +extern FORM_EXPORT(int) _nc_Set_Current_Field (FORM*, FIELD*); +extern FORM_EXPORT(int) _nc_Position_Form_Cursor (FORM*); +extern FORM_EXPORT(void) _nc_Unset_Current_Field(FORM *form); + +#if NCURSES_INTEROP_FUNCS +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_INTEGER(void); +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALNUM(void); +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ALPHA(void); +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_ENUM(void); +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_NUMERIC(void); +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_REGEXP(void); +extern FORM_EXPORT(FIELDTYPE *) _nc_TYPE_IPV4(void); + +extern FORM_EXPORT(FIELDTYPE *) +_nc_generic_fieldtype(bool (*const field_check) (FORM*, + FIELD *, + const void *), + bool (*const char_check) (int, + FORM*, + FIELD*, + const void *), + bool (*const next)(FORM*,FIELD*,const void*), + bool (*const prev)(FORM*,FIELD*,const void*), + void (*freecallback)(void*)); +extern FORM_EXPORT(int) _nc_set_generic_fieldtype(FIELD*, FIELDTYPE*, int (*)(void**)); +extern FORM_EXPORT(WINDOW*) _nc_form_cursor(const FORM* , int* , int* ); + +#define INIT_FT_FUNC(func) {func} +#else +#define INIT_FT_FUNC(func) func +#endif + +extern FORM_EXPORT(void) _nc_get_fieldbuffer(FORM*, FIELD*, FIELD_CELL*); + +#if USE_WIDEC_SUPPORT +extern FORM_EXPORT(wchar_t *) _nc_Widen_String(char *, int *); +#endif + +#ifdef TRACE + +#define returnField(code) TRACE_RETURN1(code,field) +#define returnFieldPtr(code) TRACE_RETURN1(code,field_ptr) +#define returnForm(code) TRACE_RETURN1(code,form) +#define returnFieldType(code) TRACE_RETURN1(code,field_type) +#define returnFormHook(code) TRACE_RETURN1(code,form_hook) + +extern FORM_EXPORT(FIELD **) _nc_retrace_field_ptr (FIELD **); +extern FORM_EXPORT(FIELD *) _nc_retrace_field (FIELD *); +extern FORM_EXPORT(FIELDTYPE *) _nc_retrace_field_type (FIELDTYPE *); +extern FORM_EXPORT(FORM *) _nc_retrace_form (FORM *); +extern FORM_EXPORT(Form_Hook) _nc_retrace_form_hook (Form_Hook); + +#else /* !TRACE */ + +#define returnFieldPtr(code) return code +#define returnFieldType(code) return code +#define returnField(code) return code +#define returnForm(code) return code +#define returnFormHook(code) return code + +#endif /* TRACE/!TRACE */ + +/* + * Use Check_CTYPE_Field() to simplify FIELDTYPE's that use only the ccheck() + * function. + */ +#if USE_WIDEC_SUPPORT +#define Check_CTYPE_Field(result, buffer, width, ccheck) \ + while (*buffer && *buffer == ' ') \ + buffer++; \ + if (*buffer) \ + { \ + bool blank = FALSE; \ + int len; \ + int n; \ + wchar_t *list = _nc_Widen_String((char *)buffer, &len); \ + if (list != 0) \ + { \ + result = TRUE; \ + for (n = 0; n < len; ++n) \ + { \ + if (blank) \ + { \ + if (list[n] != ' ') \ + { \ + result = FALSE; \ + break; \ + } \ + } \ + else if (list[n] == ' ') \ + { \ + blank = TRUE; \ + result = (n + 1 >= width); \ + } \ + else if (!ccheck(list[n], NULL)) \ + { \ + result = FALSE; \ + break; \ + } \ + } \ + free(list); \ + } \ + } +#else +#define Check_CTYPE_Field(result, buffer, width, ccheck) \ + while (*buffer && *buffer == ' ') \ + buffer++; \ + if (*buffer) \ + { \ + unsigned char *s = buffer; \ + int l = -1; \ + while (*buffer && ccheck(*buffer, NULL)) \ + buffer++; \ + l = (int)(buffer - s); \ + while (*buffer && *buffer == ' ') \ + buffer++; \ + result = ((*buffer || (l < width)) ? FALSE : TRUE); \ + } +#endif +/* *INDENT-ON*/ + +#endif /* FORM_PRIV_H */ diff --git a/contrib/ncurses/form/frm_cursor.c b/contrib/ncurses/form/frm_cursor.c new file mode 100644 index 00000000..a54b4837 --- /dev/null +++ b/contrib/ncurses/form/frm_cursor.c @@ -0,0 +1,71 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_cursor.c,v 1.13 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int pos_form_cursor(FORM * form) +| +| Description : Moves the form window cursor to the location required +| by the form driver to resume form processing. This may +| be needed after the application calls a curses library +| I/O routine that modifies the cursor position. +| +| Return Values : E_OK - Success +| E_SYSTEM_ERROR - System error. +| E_BAD_ARGUMENT - Invalid form pointer +| E_NOT_POSTED - Form is not posted ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +pos_form_cursor(FORM *form) +{ + int res; + + T((T_CALLED("pos_form_cursor(%p)"), (void *)form)); + + if (!form) + res = E_BAD_ARGUMENT; + else + { + if (!(form->status & _POSTED)) + res = E_NOT_POSTED; + else + res = _nc_Position_Form_Cursor(form); + } + RETURN(res); +} + +/* frm_cursor.c ends here */ diff --git a/contrib/ncurses/form/frm_data.c b/contrib/ncurses/form/frm_data.c new file mode 100644 index 00000000..1fcb59fc --- /dev/null +++ b/contrib/ncurses/form/frm_data.c @@ -0,0 +1,193 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2010,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_data.c,v 1.22 2024/07/27 18:35:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : bool data_behind(const FORM *form) +| +| Description : Check for off-screen data behind. This is nearly trivial +| because the beginning of a field is fixed. +| +| Return Values : TRUE - there are off-screen data behind +| FALSE - there are no off-screen data behind ++--------------------------------------------------------------------------*/ +FORM_EXPORT(bool) +data_behind(const FORM *form) +{ + bool result = FALSE; + + T((T_CALLED("data_behind(%p)"), (const void *)form)); + + if (form && (form->status & _POSTED) && form->current) + { + const FIELD *field; + + field = form->current; + if (!Single_Line_Field(field)) + { + result = (form->toprow == 0) ? FALSE : TRUE; + } + else + { + result = (form->begincol == 0) ? FALSE : TRUE; + } + } + returnBool(result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static char * Only_Padding( +| WINDOW *w, +| int len, +| int pad) +| +| Description : Test if 'length' cells starting at the current position +| contain a padding character. +| +| Return Values : true if only padding cells are found ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static bool +Only_Padding(WINDOW *w, int len, int pad) +{ + bool result = TRUE; + int y, x, j; + FIELD_CELL cell; + + getyx(w, y, x); + for (j = 0; j < len; ++j) + { + if (wmove(w, y, x + j) != ERR) + { +#if USE_WIDEC_SUPPORT + if (win_wch(w, &cell) != ERR) + { + if ((chtype)CharOf(cell) != ChCharOf(pad) + || cell.chars[1] != 0) + { + result = FALSE; + break; + } + } +#else + cell = (FIELD_CELL)winch(w); + if (ChCharOf(cell) != ChCharOf(pad)) + { + result = FALSE; + break; + } +#endif + } + else + { + /* if an error, return true: no non-padding text found */ + break; + } + } + /* no need to reset the cursor position; caller does this */ + return result; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : bool data_ahead(const FORM *form) +| +| Description : Check for off-screen data ahead. This is more difficult +| because a dynamic field has a variable end. +| +| Return Values : TRUE - there are off-screen data ahead +| FALSE - there are no off-screen data ahead ++--------------------------------------------------------------------------*/ +FORM_EXPORT(bool) +data_ahead(const FORM *form) +{ + bool result = FALSE; + + T((T_CALLED("data_ahead(%p)"), (const void *)form)); + + if (form && (form->status & _POSTED) && form->current) + { + const FIELD *field; + bool cursor_moved = FALSE; + int pos; + + field = form->current; + assert(form->w); + + if (Single_Line_Field(field)) + { + pos = form->begincol + field->cols; + while (pos < field->dcols) + { + int check_len = field->dcols - pos; + + if (check_len >= field->cols) + check_len = field->cols; + cursor_moved = TRUE; + wmove(form->w, 0, pos); + if (Only_Padding(form->w, check_len, field->pad)) + pos += field->cols; + else + { + result = TRUE; + break; + } + } + } + else + { + pos = form->toprow + field->rows; + while (pos < field->drows) + { + cursor_moved = TRUE; + wmove(form->w, pos, 0); + pos++; + if (!Only_Padding(form->w, field->cols, field->pad)) + { + result = TRUE; + break; + } + } + } + + if (cursor_moved) + wmove(form->w, form->currow, form->curcol); + } + returnBool(result); +} + +/* frm_data.c ends here */ diff --git a/contrib/ncurses/form/frm_def.c b/contrib/ncurses/form/frm_def.c new file mode 100644 index 00000000..a9f21f28 --- /dev/null +++ b/contrib/ncurses/form/frm_def.c @@ -0,0 +1,451 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_def.c,v 1.30 2021/03/27 23:49:58 tom Exp $") + +/* this can't be readonly */ +static FORM default_form = +{ + 0, /* status */ + 0, /* rows */ + 0, /* cols */ + 0, /* currow */ + 0, /* curcol */ + 0, /* toprow */ + 0, /* begincol */ + -1, /* maxfield */ + -1, /* maxpage */ + -1, /* curpage */ + ALL_FORM_OPTS, /* opts */ + (WINDOW *)0, /* win */ + (WINDOW *)0, /* sub */ + (WINDOW *)0, /* w */ + (FIELD **)0, /* field */ + (FIELD *)0, /* current */ + (_PAGE *) 0, /* page */ + (char *)0, /* usrptr */ + NULL, /* forminit */ + NULL, /* formterm */ + NULL, /* fieldinit */ + NULL /* fieldterm */ +}; + +FORM_EXPORT_VAR(FORM *) _nc_Default_Form = &default_form; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Insert_Field_By_Position( +| FIELD *new_field, +| FIELD *head ) +| +| Description : Insert new_field into sorted fieldlist with head "head" +| and return new head of sorted fieldlist. Sorting +| criteria is (row,column). This is a circular list. +| +| Return Values : New head of sorted fieldlist ++--------------------------------------------------------------------------*/ +static FIELD * +Insert_Field_By_Position(FIELD *newfield, FIELD *head) +{ + FIELD *current, *newhead; + + assert(newfield); + + if (!head) + { /* empty list is trivial */ + newhead = newfield->snext = newfield->sprev = newfield; + } + else + { + newhead = current = head; + while ((current->frow < newfield->frow) || + ((current->frow == newfield->frow) && + (current->fcol < newfield->fcol))) + { + current = current->snext; + if (current == head) + { /* We cycled through. Reset head to indicate that */ + head = (FIELD *)0; + break; + } + } + /* we leave the loop with current pointing to the field after newfield */ + newfield->snext = current; + newfield->sprev = current->sprev; + newfield->snext->sprev = newfield; + newfield->sprev->snext = newfield; + if (current == head) + newhead = newfield; + } + return (newhead); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Disconnect_Fields(FORM *form) +| +| Description : Break association between form and array of fields. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Disconnect_Fields(FORM *form) +{ + if (form->field) + { + FIELD **fields; + + for (fields = form->field; *fields; fields++) + { + if (form == (*fields)->form) + (*fields)->form = (FORM *)0; + } + + form->rows = form->cols = 0; + form->maxfield = form->maxpage = -1; + form->field = (FIELD **)0; + if (form->page) + free(form->page); + form->page = (_PAGE *) 0; + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Connect_Fields(FORM *form, FIELD **fields) +| +| Description : Set association between form and array of fields. +| +| Return Values : E_OK - no error +| E_CONNECTED - a field is already connected +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_SYSTEM_ERROR - not enough memory ++--------------------------------------------------------------------------*/ +static int +Connect_Fields(FORM *form, FIELD **fields) +{ + int field_cnt, j; + int page_nr; + _PAGE *pg; + + T((T_CALLED("Connect_Fields(%p,%p)"), (void *)form, (void *)fields)); + + assert(form); + + form->field = fields; + form->maxfield = 0; + form->maxpage = 0; + + if (!fields) + RETURN(E_OK); + + page_nr = 0; + /* store formpointer in fields and count pages */ + for (field_cnt = 0; fields[field_cnt]; field_cnt++) + { + if (fields[field_cnt]->form) + RETURN(E_CONNECTED); + if (field_cnt == 0 || + (fields[field_cnt]->status & _NEWPAGE)) + page_nr++; + fields[field_cnt]->form = form; + } + if (field_cnt == 0 || (short)field_cnt < 0) + RETURN(E_BAD_ARGUMENT); + + /* allocate page structures */ + if ((pg = typeMalloc(_PAGE, page_nr)) != (_PAGE *) 0) + { + T((T_CREATE("_PAGE %p"), (void *)pg)); + form->page = pg; + } + else + RETURN(E_SYSTEM_ERROR); + + /* Cycle through fields and calculate page boundaries as well as + size of the form */ + for (j = 0; j < field_cnt; j++) + { + int maximum_row_in_field; + int maximum_col_in_field; + + if (j == 0) + pg->pmin = (short)j; + else + { + if (fields[j]->status & _NEWPAGE) + { + pg->pmax = (short)(j - 1); + pg++; + pg->pmin = (short)j; + } + } + + maximum_row_in_field = fields[j]->frow + fields[j]->rows; + maximum_col_in_field = fields[j]->fcol + fields[j]->cols; + + if (form->rows < maximum_row_in_field) + form->rows = (short)maximum_row_in_field; + if (form->cols < maximum_col_in_field) + form->cols = (short)maximum_col_in_field; + } + + pg->pmax = (short)(field_cnt - 1); + form->maxfield = (short)field_cnt; + form->maxpage = (short)page_nr; + + /* Sort fields on form pages */ + for (page_nr = 0; page_nr < form->maxpage; page_nr++) + { + FIELD *fld = (FIELD *)0; + + for (j = form->page[page_nr].pmin; j <= form->page[page_nr].pmax; j++) + { + fields[j]->index = (short)j; + fields[j]->page = (short)page_nr; + fld = Insert_Field_By_Position(fields[j], fld); + } + if (fld) + { + form->page[page_nr].smin = fld->index; + form->page[page_nr].smax = fld->sprev->index; + } + else + { + form->page[page_nr].smin = 0; + form->page[page_nr].smax = 0; + } + } + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Associate_Fields(FORM *form, FIELD **fields) +| +| Description : Set association between form and array of fields. +| If there are fields, position to first active field. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_SYSTEM_ERROR - not enough memory ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static int +Associate_Fields(FORM *form, FIELD **fields) +{ + int res = Connect_Fields(form, fields); + + if (res == E_OK) + { + if (form->maxpage > 0) + { + form->curpage = 0; + form_driver(form, FIRST_ACTIVE_MAGIC); + } + else + { + form->curpage = -1; + form->current = (FIELD *)0; + } + } + return (res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FORM *new_form_sp(SCREEN* sp, FIELD** fields ) +| +| Description : Create new form with given array of fields. +| +| Return Values : Pointer to form. NULL if error occurred. +! Set errno: +| E_OK - success +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_SYSTEM_ERROR - not enough memory ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FORM *) +NCURSES_SP_NAME(new_form) (NCURSES_SP_DCLx FIELD **fields) +{ + int err = E_SYSTEM_ERROR; + FORM *form = (FORM *)0; + + T((T_CALLED("new_form(%p,%p)"), (void *)SP_PARM, (void *)fields)); + + if (IsValidScreen(SP_PARM)) + { + form = typeMalloc(FORM, 1); + + if (form) + { + T((T_CREATE("form %p"), (void *)form)); + *form = *_nc_Default_Form; + /* This ensures win and sub are always non-null, + so we can derive always the SCREEN that this form is + running on. */ + form->win = StdScreen(SP_PARM); + form->sub = StdScreen(SP_PARM); + if ((err = Associate_Fields(form, fields)) != E_OK) + { + free_form(form); + form = (FORM *)0; + } + } + } + + if (!form) + SET_ERROR(err); + + returnForm(form); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FORM* new_form(FIELD** fields ) +| +| Description : Create new form with given array of fields. +| +| Return Values : Pointer to form. NULL if error occurred. +! Set errno: +| E_OK - success +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_SYSTEM_ERROR - not enough memory ++--------------------------------------------------------------------------*/ +#if NCURSES_SP_FUNCS +FORM_EXPORT(FORM *) +new_form(FIELD **fields) +{ + return NCURSES_SP_NAME(new_form) (CURRENT_SCREEN, fields); +} +#endif + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int free_form( FORM *form ) +| +| Description : Release internal memory associated with form. +| +| Return Values : E_OK - no error +| E_BAD_ARGUMENT - invalid form pointer +| E_POSTED - form is posted ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +free_form(FORM *form) +{ + T((T_CALLED("free_form(%p)"), (void *)form)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (form->status & _POSTED) + RETURN(E_POSTED); + + Disconnect_Fields(form); + if (form->page) + free(form->page); + free(form); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_fields( FORM *form, FIELD **fields ) +| +| Description : Set a new association of an array of fields to a form +| +| Return Values : E_OK - no error +| E_BAD_ARGUMENT - Invalid form pointer or field array +| E_CONNECTED - a field is already connected +| E_POSTED - form is posted +| E_SYSTEM_ERROR - not enough memory ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_form_fields(FORM *form, FIELD **fields) +{ + FIELD **old; + int res; + + T((T_CALLED("set_form_fields(%p,%p)"), (void *)form, (void *)fields)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (form->status & _POSTED) + RETURN(E_POSTED); + + old = form->field; + Disconnect_Fields(form); + + if ((res = Associate_Fields(form, fields)) != E_OK) + Connect_Fields(form, old); + + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELD **form_fields( const FORM *form ) +| +| Description : Retrieve array of fields +| +| Return Values : Pointer to field array ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELD **) +form_fields(const FORM *form) +{ + T((T_CALLED("form_field(%p)"), (const void *)form)); + returnFieldPtr(Normalize_Form(form)->field); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int field_count( const FORM *form ) +| +| Description : Retrieve number of fields +| +| Return Values : Number of fields, -1 if none are defined ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +field_count(const FORM *form) +{ + T((T_CALLED("field_count(%p)"), (const void *)form)); + + returnCode(Normalize_Form(form)->maxfield); +} + +/* frm_def.c ends here */ diff --git a/contrib/ncurses/form/frm_driver.c b/contrib/ncurses/form/frm_driver.c new file mode 100644 index 00000000..179e403c --- /dev/null +++ b/contrib/ncurses/form/frm_driver.c @@ -0,0 +1,5011 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_driver.c,v 1.136 2024/07/27 18:49:18 tom Exp $") + +/*---------------------------------------------------------------------------- + This is the core module of the form library. It contains the majority + of the driver routines as well as the form_driver function. + + Essentially this module is nearly the whole library. This is because + all the functions in this module depends on some others in the module, + so it makes no sense to split them into separate files because they + will always be linked together. The only acceptable concern is turnaround + time for this module, but now we have all Pentiums or RISCs, so what! + + The driver routines are grouped into nine generic categories: + + a) Page Navigation ( all functions prefixed by PN_ ) + The current page of the form is left and some new page is + entered. + b) Inter-Field Navigation ( all functions prefixed by FN_ ) + The current field of the form is left and some new field is + entered. + c) Intra-Field Navigation ( all functions prefixed by IFN_ ) + The current position in the current field is changed. + d) Vertical Scrolling ( all functions prefixed by VSC_ ) + Essentially this is a specialization of Intra-Field navigation. + It has to check for a multi-line field. + e) Horizontal Scrolling ( all functions prefixed by HSC_ ) + Essentially this is a specialization of Intra-Field navigation. + It has to check for a single-line field. + f) Field Editing ( all functions prefixed by FE_ ) + The content of the current field is changed + g) Edit Mode requests ( all functions prefixed by EM_ ) + Switching between insert and overlay mode + h) Field-Validation requests ( all functions prefixed by FV_ ) + Perform verifications of the field. + i) Choice requests ( all functions prefixed by CR_ ) + Requests to enumerate possible field values + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Some remarks on the placements of assert() macros : + I use them only on "strategic" places, i.e. top level entries where + I want to make sure that things are set correctly. Throughout subordinate + routines I omit them mostly. + --------------------------------------------------------------------------*/ + +/* +Some options that may effect compatibility in behavior to SVr4 forms, +but they are here to allow a more intuitive and user friendly behavior of +our form implementation. This doesn't affect the API, so we feel it is +uncritical. + +The initial implementation tries to stay very close with the behavior +of the original SVr4 implementation, although in some areas it is quite +clear that this isn't the most appropriate way. As far as possible this +sources will allow you to build a forms lib that behaves quite similar +to SVr4, but now and in the future we will give you better options. +Perhaps at some time we will make this configurable at runtime. +*/ + +/* Implement a more user-friendly previous/next word behavior */ +#define FRIENDLY_PREV_NEXT_WORD (1) +/* Fix the wrong behavior for forms with all fields inactive */ +#define FIX_FORM_INACTIVE_BUG (1) +/* Allow dynamic field growth also when navigating past the end */ +#define GROW_IF_NAVIGATE (1) + +#if USE_WIDEC_SUPPORT +#define myADDNSTR(w, s, n) wide_waddnstr(w, s, n) +#define myINSNSTR(w, s, n) wide_winsnstr(w, s, n) +#define myINNSTR(w, s, n) wide_winnstr(w, s, n) +#define myWCWIDTH(w, y, x) cell_width(w, y, x) +#else +#define myADDNSTR(w, s, n) waddnstr(w, s, n) +#define myINSNSTR(w, s, n) winsnstr(w, s, n) +#define myINNSTR(w, s, n) winnstr(w, s, n) +#define myWCWIDTH(w, y, x) 1 +#endif + +/*---------------------------------------------------------------------------- + Forward references to some internally used static functions + --------------------------------------------------------------------------*/ +static int Inter_Field_Navigation(int (*const fct) (FORM *), FORM *form); +static int FN_Next_Field(FORM *form); +static int FN_Previous_Field(FORM *form); +static int FE_New_Line(FORM *); +static int FE_Delete_Previous(FORM *); + +/*---------------------------------------------------------------------------- + Macro Definitions. + + Some Remarks on that: I use the convention to use UPPERCASE for constants + defined by Macros. If I provide a macro as a kind of inline routine to + provide some logic, I use my Upper_Lower case style. + --------------------------------------------------------------------------*/ + +/* Calculate the position of a single row in a field buffer */ +#define Position_Of_Row_In_Buffer(field,row) ((row)*(field)->dcols) + +/* Calculate start address for the field's buffer# N */ +#define Address_Of_Nth_Buffer(field,N) \ + ((field)->buf + (N)*(1+Buffer_Length(field))) + +/* Calculate the start address of the row in the field's specified buffer# N */ +#define Address_Of_Row_In_Nth_Buffer(field,N,row) \ + (Address_Of_Nth_Buffer(field,N) + Position_Of_Row_In_Buffer(field,row)) + +/* Calculate the start address of the row in the field's primary buffer */ +#define Address_Of_Row_In_Buffer(field,row) \ + Address_Of_Row_In_Nth_Buffer(field,0,row) + +/* Calculate the start address of the row in the form's current field + buffer# N */ +#define Address_Of_Current_Row_In_Nth_Buffer(form,N) \ + Address_Of_Row_In_Nth_Buffer((form)->current,N,(form)->currow) + +/* Calculate the start address of the row in the form's current field + primary buffer */ +#define Address_Of_Current_Row_In_Buffer(form) \ + Address_Of_Current_Row_In_Nth_Buffer(form,0) + +/* Calculate the address of the cursor in the form's current field + primary buffer */ +#define Address_Of_Current_Position_In_Nth_Buffer(form,N) \ + (Address_Of_Current_Row_In_Nth_Buffer(form,N) + (form)->curcol) + +/* Calculate the address of the cursor in the form's current field + buffer# N */ +#define Address_Of_Current_Position_In_Buffer(form) \ + Address_Of_Current_Position_In_Nth_Buffer(form,0) + +/* Logic to decide whether or not a field is actually a field with + vertical or horizontal scrolling */ +#define Is_Scroll_Field(field) \ + (((field)->drows > (field)->rows) || \ + ((field)->dcols > (field)->cols)) + +/* Logic to decide whether or not a field needs to have an individual window + instead of a derived window because it contains invisible parts. + This is true for non-public fields and for scrollable fields. */ +#define Has_Invisible_Parts(field) \ + (!(Field_Has_Option(field, O_PUBLIC)) || \ + Is_Scroll_Field(field)) + +/* Logic to decide whether or not a field needs justification */ +#define Justification_Allowed(field) \ + (((field)->just != NO_JUSTIFICATION) && \ + (Single_Line_Field(field)) && \ + ((Field_Has_Option(field, O_STATIC) && \ + ((field)->dcols == (field)->cols)) || \ + Field_Has_Option(field, O_DYNAMIC_JUSTIFY))) + +/* Logic to determine whether or not a dynamic field may still grow */ +#define Growable(field) ((field)->status & _MAY_GROW) + +/* Macro to set the attributes for a field's window */ +#define Set_Field_Window_Attributes(field,win) \ +( wbkgdset((win),(chtype)((chtype)((field)->pad) | (field)->back)), \ + (void) wattrset((win), (int)(field)->fore) ) + +/* Logic to decide whether or not a field really appears on the form */ +#define Field_Really_Appears(field) \ + ((field->form) &&\ + (field->form->status & _POSTED) &&\ + (Field_Has_Option(field, O_VISIBLE)) &&\ + (field->page == field->form->curpage)) + +/* Logic to determine whether or not we are on the first position in the + current field */ +#define First_Position_In_Current_Field(form) \ + (((form)->currow==0) && ((form)->curcol==0)) + +#define Minimum(a,b) (((a)<=(b)) ? (a) : (b)) +#define Maximum(a,b) (((a)>=(b)) ? (a) : (b)) + +/*---------------------------------------------------------------------------- + Useful constants + --------------------------------------------------------------------------*/ +static FIELD_CELL myBLANK = BLANK; +static FIELD_CELL myZEROS; + +#ifdef TRACE +static void +check_pos(FORM *form, int lineno) +{ + if (form && form->w) + { + int y, x; + + getyx(form->w, y, x); + if (y != form->currow || x != form->curcol) + { + T(("CHECKPOS %s@%d have position %d,%d vs want %d,%d", + __FILE__, lineno, + y, x, + form->currow, form->curcol)); + } + } +} +#define CHECKPOS(form) check_pos(form, __LINE__) +#else +#define CHECKPOS(form) /* nothing */ +#endif + +/*---------------------------------------------------------------------------- + Wide-character special functions + --------------------------------------------------------------------------*/ +#if USE_WIDEC_SUPPORT +/* add like waddnstr, but using cchar_t* rather than char* + */ +static int +wide_waddnstr(WINDOW *w, const cchar_t *s, int n) +{ + int rc = OK; + + while (n-- > 0) + { + if ((rc = wadd_wch(w, s)) != OK) + break; + ++s; + } + return rc; +} + +/* insert like winsnstr, but using cchar_t* rather than char* + * + * X/Open Curses has no close equivalent; inserts are done only with wchar_t + * strings. + */ +static int +wide_winsnstr(WINDOW *w, const cchar_t *s, int n) +{ + int code = ERR; + + while (n-- > 0) + { + int y, x; + + getyx(w, y, x); + if ((code = wins_wch(w, s++)) != OK) + break; + if ((code = wmove(w, y, x + 1)) != OK) + break; + } + return code; +} + +/* retrieve like winnstr, but using cchar_t*, rather than char*. + * + * X/Open Curses' closest equivalent, win_wchnstr(), is inconsistent with + * winnstr(), since it returns OK rather than the number of items transferred. + */ +static int +wide_winnstr(WINDOW *w, cchar_t *s, int n) +{ + int x; + + win_wchnstr(w, s, n); + /* + * This function is used to extract the text only from the window. + * Strip attributes and color from the string so they will not be added + * back when copying the string to the window. + */ + for (x = 0; x < n; ++x) + { + RemAttr(s[x], A_ATTRIBUTES); + SetPair(s[x], 0); + } + return n; +} + +/* + * Returns the column of the base of the given cell. + */ +static int +cell_base(WINDOW *win, int y, int x) +{ + int result = x; + + while (LEGALYX(win, y, x)) + { + const cchar_t *data = &(win->_line[y].text[x]); + + if (isWidecBase(CHDEREF(data)) || !isWidecExt(CHDEREF(data))) + { + result = x; + break; + } + --x; + } + return result; +} + +/* + * Returns the number of columns needed for the given cell in a window. + */ +static int +cell_width(WINDOW *win, int y, int x) +{ + int result = 1; + + if (LEGALYX(win, y, x)) + { + cchar_t *data = &(win->_line[y].text[x]); + + if (isWidecExt(CHDEREF(data))) + { + /* recur, providing the number of columns to the next character */ + result = cell_width(win, y, x - 1); + } + else + { + result = wcwidth(CharOf(CHDEREF(data))); + } + } + return result; +} + +/* + * There is no wide-character function such as wdel_wch(), so we must find + * all of the cells that comprise a multi-column character and delete them + * one-by-one. + */ +static void +delete_char(FORM *form) +{ + int cells = cell_width(form->w, form->currow, form->curcol); + + form->curcol = cell_base(form->w, form->currow, form->curcol); + wmove(form->w, form->currow, form->curcol); + while (cells-- > 0) + { + wdelch(form->w); + } +} +#define DeleteChar(form) delete_char(form) +#else +#define DeleteChar(form) \ + wmove((form)->w, (form)->currow, (form)->curcol), \ + wdelch((form)->w) +#endif + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static char *Get_Start_Of_Data(char * buf, int blen) +| +| Description : Return pointer to first non-blank position in buffer. +| If buffer is empty return pointer to buffer itself. +| +| Return Values : Pointer to first non-blank position in buffer ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD_CELL * +Get_Start_Of_Data(FIELD_CELL *buf, int blen) +{ + FIELD_CELL *p = buf; + const FIELD_CELL *end = &buf[blen]; + + assert(buf && blen >= 0); + while ((p < end) && ISBLANK(*p)) + p++; + return ((p == end) ? buf : p); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static char *After_End_Of_Data(char * buf, int blen) +| +| Description : Return pointer after last non-blank position in buffer. +| If buffer is empty, return pointer to buffer itself. +| +| Return Values : Pointer to position after last non-blank position in +| buffer. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD_CELL * +After_End_Of_Data(FIELD_CELL *buf, int blen) +{ + FIELD_CELL *p = &buf[blen]; + + assert(buf && blen >= 0); + while ((p > buf) && ISBLANK(p[-1])) + p--; + return (p); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static char *Get_First_Whitespace_Character( +| char * buf, int blen) +| +| Description : Position to the first whitespace character. +| +| Return Values : Pointer to first whitespace character in buffer. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD_CELL * +Get_First_Whitespace_Character(FIELD_CELL *buf, int blen) +{ + FIELD_CELL *p = buf; + const FIELD_CELL *end = &p[blen]; + + assert(buf && blen >= 0); + while ((p < end) && !ISBLANK(*p)) + p++; + return ((p == end) ? buf : p); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static char *After_Last_Whitespace_Character( +| char * buf, int blen) +| +| Description : Get the position after the last whitespace character. +| +| Return Values : Pointer to position after last whitespace character in +| buffer. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD_CELL * +After_Last_Whitespace_Character(FIELD_CELL *buf, int blen) +{ + FIELD_CELL *p = &buf[blen]; + + assert(buf && blen >= 0); + while ((p > buf) && !ISBLANK(p[-1])) + p--; + return (p); +} + +/* Set this to 1 to use the div_t version. This is a good idea if your + compiler has an intrinsic div() support. Unfortunately GNU-C has it + not yet. + N.B.: This only works if form->curcol follows immediately form->currow + and both are of type int. +*/ +#define USE_DIV_T (0) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Adjust_Cursor_Position( +| FORM * form, const char * pos) +| +| Description : Set current row and column of the form to values +| corresponding to the buffer position. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static void +Adjust_Cursor_Position(FORM *form, const FIELD_CELL *pos) +{ + const FIELD *field; + int idx; + + field = form->current; + assert(pos >= field->buf && field->dcols > 0); + idx = (int)(pos - field->buf); +#if USE_DIV_T + *((div_t *) & (form->currow)) = div(idx, field->dcols); +#else + form->currow = idx / field->dcols; + form->curcol = idx - field->cols * form->currow; +#endif + if (field->drows < form->currow) + form->currow = 0; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Buffer_To_Window( +| const FIELD * field, +| WINDOW * win) +| +| Description : Copy the buffer to the window. If it is a multi-line +| field, the buffer is split to the lines of the +| window without any editing. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Buffer_To_Window(const FIELD *field, WINDOW *win) +{ + int width, height; + int y, x; + int row; + FIELD_CELL *pBuffer; + + assert(win && field); + + getyx(win, y, x); + width = getmaxx(win); + height = getmaxy(win); + + for (row = 0, pBuffer = field->buf; + row < height; + row++, pBuffer += width) + { + int len; + + if ((len = (int)(After_End_Of_Data(pBuffer, width) - pBuffer)) > 0) + { + wmove(win, row, 0); + myADDNSTR(win, pBuffer, len); + } + } + wmove(win, y, x); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : void _nc_get_fieldbuffer( +| WINDOW * win, +| FIELD * field, +| FIELD_CELL * buf) +| +| Description : Copy the content of the window into the buffer. +| The multiple lines of a window are simply +| concatenated into the buffer. Pad characters in +| the window will be replaced by blanks in the buffer. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +FORM_EXPORT(void) +_nc_get_fieldbuffer(FORM *form, FIELD *field, FIELD_CELL *buf) +{ + int pad; + int len = 0; + FIELD_CELL *p; + int row, height; + WINDOW *win; + + assert(form && field && buf); + + win = form->w; + assert(win); + + pad = field->pad; + p = buf; + height = getmaxy(win); + + for (row = 0; (row < height) && (row < field->drows); row++) + { + wmove(win, row, 0); + len += myINNSTR(win, p + len, field->dcols); + } + p[len] = myZEROS; + + /* replace visual padding character by blanks in buffer */ + if (pad != C_BLANK) + { + int i; + + for (i = 0; i < len; i++, p++) + { + if ((unsigned long)CharOf(*p) == ChCharOf(pad) +#if USE_WIDEC_SUPPORT + && p->chars[1] == 0 +#endif + ) + *p = myBLANK; + } + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Window_To_Buffer( +| FORM * form, +| FIELD * field) +| +| Description : Copy the content of the window into the buffer. +| The multiple lines of a window are simply +| concatenated into the buffer. Pad characters in +| the window will be replaced by blanks in the buffer. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Window_To_Buffer(FORM *form, FIELD *field) +{ + _nc_get_fieldbuffer(form, field, field->buf); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Synchronize_Buffer(FORM * form) +| +| Description : If there was a change, copy the content of the +| window into the buffer, so the buffer is synchronized +| with the windows content. We have to indicate that the +| buffer needs validation due to the change. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static void +Synchronize_Buffer(FORM *form) +{ + if (form->status & _WINDOW_MODIFIED) + { + ClrStatus(form, _WINDOW_MODIFIED); + SetStatus(form, _FCHECK_REQUIRED); + Window_To_Buffer(form, form->current); + wmove(form->w, form->currow, form->curcol); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Field_Grown( FIELD *field, int amount) +| +| Description : This function is called for growable dynamic fields +| only. It has to increase the buffers and to allocate +| a new window for this field. +| This function has the side effect to set a new +| field-buffer pointer, the dcols and drows values +| as well as a new current Window for the field. +| +| Return Values : TRUE - field successfully increased +| FALSE - there was some error ++--------------------------------------------------------------------------*/ +static bool +Field_Grown(FIELD *field, int amount) +{ + bool result = FALSE; + + if (field && Growable(field)) + { + bool single_line_field = Single_Line_Field(field); + int old_buflen = Buffer_Length(field); + int new_buflen; + int old_dcols = field->dcols; + int old_drows = field->drows; + FIELD_CELL *oldbuf = field->buf; + FIELD_CELL *newbuf; + + int growth; + FORM *form = field->form; + bool need_visual_update = ((form != (FORM *)0) && + (form->status & _POSTED) && + (form->current == field)); + + if (need_visual_update) + Synchronize_Buffer(form); + + if (single_line_field) + { + growth = field->cols * amount; + if (field->maxgrow) + growth = Minimum(field->maxgrow - field->dcols, growth); + field->dcols += growth; + if (field->dcols == field->maxgrow) + ClrStatus(field, _MAY_GROW); + } + else + { + growth = (field->rows + field->nrow) * amount; + if (field->maxgrow) + growth = Minimum(field->maxgrow - field->drows, growth); + field->drows += growth; + if (field->drows == field->maxgrow) + ClrStatus(field, _MAY_GROW); + } + /* drows, dcols changed, so we get really the new buffer length */ + new_buflen = Buffer_Length(field); + newbuf = (FIELD_CELL *)malloc(Total_Buffer_Size(field)); + if (!newbuf) + { + /* restore to previous state */ + field->dcols = old_dcols; + field->drows = old_drows; + if ((single_line_field && (field->dcols != field->maxgrow)) || + (!single_line_field && (field->drows != field->maxgrow))) + SetStatus(field, _MAY_GROW); + } + else + { + /* Copy all the buffers. This is the reason why we can't just use + * realloc(). + */ + int i, j; + + result = TRUE; /* allow sharing of recovery on failure */ + + T((T_CREATE("fieldcell %p"), (void *)newbuf)); + field->buf = newbuf; + for (i = 0; i <= field->nbuf; i++) + { + FIELD_CELL *new_bp = Address_Of_Nth_Buffer(field, i); + const FIELD_CELL *old_bp = oldbuf + i * (1 + old_buflen); + + for (j = 0; j < old_buflen; ++j) + new_bp[j] = old_bp[j]; + while (j < new_buflen) + new_bp[j++] = myBLANK; + new_bp[new_buflen] = myZEROS; + } + +#if USE_WIDEC_SUPPORT && NCURSES_EXT_FUNCS + if (wresize(field->working, 1, Buffer_Length(field) + 1) == ERR) + result = FALSE; +#endif + + if (need_visual_update && result) + { + WINDOW *new_window = newpad(field->drows, field->dcols); + + if (new_window != 0) + { + assert(form != (FORM *)0); + if (form->w) + delwin(form->w); + form->w = new_window; + Set_Field_Window_Attributes(field, form->w); + werase(form->w); + Buffer_To_Window(field, form->w); + untouchwin(form->w); + wmove(form->w, form->currow, form->curcol); + } + else + result = FALSE; + } + + if (result) + { + free(oldbuf); + /* reflect changes in linked fields */ + if (field != field->link) + { + FIELD *linked_field; + + for (linked_field = field->link; + linked_field != field; + linked_field = linked_field->link) + { + linked_field->buf = field->buf; + linked_field->drows = field->drows; + linked_field->dcols = field->dcols; + } + } + } + else + { + /* restore old state */ + field->dcols = old_dcols; + field->drows = old_drows; + field->buf = oldbuf; + if ((single_line_field && + (field->dcols != field->maxgrow)) || + (!single_line_field && + (field->drows != field->maxgrow))) + SetStatus(field, _MAY_GROW); + free(newbuf); + } + } + } + return (result); +} + +#ifdef NCURSES_MOUSE_VERSION +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int Field_encloses(FIELD *field, int ry, int rx) +| +| Description : Check if the given coordinates lie within the given field. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form pointer +| E_SYSTEM_ERROR - form has no current field or +| field-window ++--------------------------------------------------------------------------*/ +static int +Field_encloses(FIELD *field, int ry, int rx) +{ + T((T_CALLED("Field_encloses(%p)"), (void *)field)); + if (field != 0 + && field->frow <= ry + && (field->frow + field->rows) > ry + && field->fcol <= rx + && (field->fcol + field->cols) > rx) + { + RETURN(E_OK); + } + RETURN(E_INVALID_FIELD); +} +#endif + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_Position_Form_Cursor(FORM * form) +| +| Description : Position the cursor in the window for the current +| field to be in sync. with the currow and curcol +| values. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form pointer +| E_SYSTEM_ERROR - form has no current field or +| field-window ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +_nc_Position_Form_Cursor(FORM *form) +{ + const FIELD *field; + WINDOW *formwin; + + if (!form) + return (E_BAD_ARGUMENT); + + if (!form->w || !form->current) + return (E_SYSTEM_ERROR); + + field = form->current; + formwin = Get_Form_Window(form); + + wmove(form->w, form->currow, form->curcol); + if (Has_Invisible_Parts(field)) + { + /* in this case fieldwin isn't derived from formwin, so we have + to move the cursor in formwin by hand... */ + wmove(formwin, + field->frow + form->currow - form->toprow, + field->fcol + form->curcol - form->begincol); + wcursyncup(formwin); + } + else + wcursyncup(form->w); + return (E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_Refresh_Current_Field(FORM * form) +| +| Description : Propagate the changes in the field's window to the +| window of the form. +| +| Return Values : E_OK - on success +| E_BAD_ARGUMENT - invalid form pointer +| E_SYSTEM_ERROR - general error ++--------------------------------------------------------------------------*/ +static bool move_after_insert = TRUE; +FORM_EXPORT(int) +_nc_Refresh_Current_Field(FORM *form) +{ + WINDOW *formwin; + FIELD *field; + bool is_public; + + T((T_CALLED("_nc_Refresh_Current_Field(%p)"), (void *)form)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (!form->w || !form->current) + RETURN(E_SYSTEM_ERROR); + + field = form->current; + formwin = Get_Form_Window(form); + + is_public = Field_Has_Option(field, O_PUBLIC); + + if (Is_Scroll_Field(field)) + { + /* Again, in this case the fieldwin isn't derived from formwin, + so we have to perform a copy operation. */ + if (Single_Line_Field(field)) + { + /* horizontal scrolling */ + if (form->curcol < form->begincol) + form->begincol = form->curcol; + else + { + if (form->curcol >= (form->begincol + field->cols)) + form->begincol = form->curcol - field->cols + + (move_after_insert ? 1 : 0); + } + if (is_public) + copywin(form->w, + formwin, + 0, + form->begincol, + field->frow, + field->fcol, + field->frow, + field->cols + field->fcol - 1, + 0); + } + else + { + /* A multi-line, i.e. vertical scrolling field */ + int first_modified_row, first_unmodified_row; + + if (field->drows > field->rows) + { + int row_after_bottom = form->toprow + field->rows; + + if (form->currow < form->toprow) + { + form->toprow = form->currow; + SetStatus(field, _NEWTOP); + } + if (form->currow >= row_after_bottom) + { + form->toprow = form->currow - field->rows + 1; + SetStatus(field, _NEWTOP); + } + if (field->status & _NEWTOP) + { + /* means we have to copy whole range */ + first_modified_row = form->toprow; + first_unmodified_row = first_modified_row + field->rows; + ClrStatus(field, _NEWTOP); + } + else + { + /* we try to optimize : finding the range of touched + lines */ + first_modified_row = form->toprow; + while (first_modified_row < row_after_bottom) + { + if (is_linetouched(form->w, first_modified_row)) + break; + first_modified_row++; + } + first_unmodified_row = first_modified_row; + while (first_unmodified_row < row_after_bottom) + { + if (!is_linetouched(form->w, first_unmodified_row)) + break; + first_unmodified_row++; + } + } + } + else + { + first_modified_row = form->toprow; + first_unmodified_row = first_modified_row + field->rows; + } + if (first_unmodified_row != first_modified_row && is_public) + copywin(form->w, + formwin, + first_modified_row, + 0, + field->frow + first_modified_row - form->toprow, + field->fcol, + field->frow + first_unmodified_row - form->toprow - 1, + field->cols + field->fcol - 1, + 0); + } + if (is_public) + wsyncup(formwin); + } + else + { + /* if the field-window is simply a derived window, i.e. contains no + * invisible parts, the whole thing is trivial + */ + if (is_public) + wsyncup(form->w); + } + untouchwin(form->w); + returnCode(_nc_Position_Form_Cursor(form)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Perform_Justification( +| FIELD * field, +| WINDOW * win) +| +| Description : Output field with requested justification +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Perform_Justification(FIELD *field, WINDOW *win) +{ + const FIELD_CELL *bp; + int len; + + bp = (Field_Has_Option(field, O_NO_LEFT_STRIP) + ? field->buf + : Get_Start_Of_Data(field->buf, Buffer_Length(field))); + len = (int)(After_End_Of_Data(field->buf, Buffer_Length(field)) - bp); + + if (len > 0) + { + int col = 0; + + assert(win && (field->drows == 1)); + + if (field->cols - len >= 0) + switch (field->just) + { + case JUSTIFY_LEFT: + break; + case JUSTIFY_CENTER: + col = (field->cols - len) / 2; + break; + case JUSTIFY_RIGHT: + col = field->cols - len; + break; + default: + break; + } + + wmove(win, 0, col); + myADDNSTR(win, bp, len); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Undo_Justification( +| FIELD * field, +| WINDOW * win) +| +| Description : Display field without any justification, i.e. +| left justified +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Undo_Justification(FIELD *field, WINDOW *win) +{ + const FIELD_CELL *bp; + int y, x; + int len; + + getyx(win, y, x); + + bp = (Field_Has_Option(field, O_NO_LEFT_STRIP) + ? field->buf + : Get_Start_Of_Data(field->buf, Buffer_Length(field))); + len = (int)(After_End_Of_Data(field->buf, Buffer_Length(field)) - bp); + + if (len > 0) + { + assert(win); + wmove(win, 0, 0); + myADDNSTR(win, bp, len); + } + wmove(win, y, x); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_Char(FORM *form, +| FIELD *field, +| FIELDTYPE * typ, +| int ch, +| TypeArgument *argp) +| +| Description : Perform a single character check for character ch +| according to the fieldtype instance. +| +| Return Values : TRUE - Character is valid +| FALSE - Character is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_Char(FORM *form, + FIELD *field, + FIELDTYPE *typ, + int ch, + TypeArgument *argp) +{ + if (typ) + { + if (typ->status & _LINKED_TYPE) + { + assert(argp); + return ( + Check_Char(form, field, typ->left, ch, argp->left) || + Check_Char(form, field, typ->right, ch, argp->right)); + } + else + { +#if NCURSES_INTEROP_FUNCS + if (typ->charcheck.occheck) + { + if (typ->status & _GENERIC) + return typ->charcheck.gccheck(ch, form, field, (void *)argp); + else + return typ->charcheck.occheck(ch, (void *)argp); + } +#else + if (typ->ccheck) + return typ->ccheck(ch, (void *)argp); +#endif + } + } + return (!iscntrl(UChar(ch)) ? TRUE : FALSE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Display_Or_Erase_Field( +| FIELD * field, +| bool bEraseFlag) +| +| Description : Create a subwindow for the field and display the +| buffer contents (apply justification if required) +| or simply erase the field. +| +| Return Values : E_OK - on success +| E_SYSTEM_ERROR - some error (typical no memory) ++--------------------------------------------------------------------------*/ +static int +Display_Or_Erase_Field(FIELD *field, bool bEraseFlag) +{ + WINDOW *win; + WINDOW *fwin; + + if (!field) + return E_SYSTEM_ERROR; + + fwin = Get_Form_Window(field->form); + win = derwin(fwin, + field->rows, field->cols, field->frow, field->fcol); + + if (!win) + return E_SYSTEM_ERROR; + else + { + if (Field_Has_Option(field, O_VISIBLE)) + { + Set_Field_Window_Attributes(field, win); + } + else + { + (void)wattrset(win, (int)WINDOW_ATTRS(fwin)); + } + werase(win); + } + + if (!bEraseFlag) + { + if (Field_Has_Option(field, O_PUBLIC)) + { + if (Justification_Allowed(field)) + Perform_Justification(field, win); + else + Buffer_To_Window(field, win); + } + ClrStatus(field, _NEWTOP); + } + wsyncup(win); + delwin(win); + return E_OK; +} + +/* Macros to preset the bEraseFlag */ +#define Display_Field(field) Display_Or_Erase_Field(field,FALSE) +#define Erase_Field(field) Display_Or_Erase_Field(field,TRUE) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Synchronize_Field(FIELD * field) +| +| Description : Synchronize the windows content with the value in +| the buffer. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer +| E_SYSTEM_ERROR - some severe basic error ++--------------------------------------------------------------------------*/ +static int +Synchronize_Field(FIELD *field) +{ + FORM *form; + int res = E_OK; + + if (!field) + return (E_BAD_ARGUMENT); + + if (((form = field->form) != (FORM *)0) + && Field_Really_Appears(field)) + { + if (field == form->current) + { + form->currow = form->curcol = form->toprow = form->begincol = 0; + werase(form->w); + + if ((Field_Has_Option(field, O_PUBLIC)) && Justification_Allowed(field)) + Undo_Justification(field, form->w); + else + Buffer_To_Window(field, form->w); + + SetStatus(field, _NEWTOP); + res = _nc_Refresh_Current_Field(form); + } + else + res = Display_Field(field); + } + SetStatus(field, _CHANGED); + return (res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Synchronize_Linked_Fields(FIELD * field) +| +| Description : Propagate the Synchronize_Field function to all linked +| fields. The first error that occurs in the sequence +| of updates is the return value. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer +| E_SYSTEM_ERROR - some severe basic error ++--------------------------------------------------------------------------*/ +static int +Synchronize_Linked_Fields(FIELD *field) +{ + FIELD *linked_field; + int res = E_OK; + + if (!field) + return (E_BAD_ARGUMENT); + + if (!field->link) + return (E_SYSTEM_ERROR); + + for (linked_field = field->link; + (linked_field != field) && (linked_field != 0); + linked_field = linked_field->link) + { + int syncres; + + if (((syncres = Synchronize_Field(linked_field)) != E_OK) && + (res == E_OK)) + res = syncres; + } + return (res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_Synchronize_Attributes(FIELD * field) +| +| Description : If a field's visual attributes have changed, this +| routine is called to propagate those changes to the +| screen. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer +| E_SYSTEM_ERROR - some severe basic error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +_nc_Synchronize_Attributes(FIELD *field) +{ + FORM *form; + int res = E_OK; + + T((T_CALLED("_nc_Synchronize_Attributes(%p)"), (void *)field)); + + if (!field) + returnCode(E_BAD_ARGUMENT); + + CHECKPOS(field->form); + if (((form = field->form) != (FORM *)0) + && Field_Really_Appears(field)) + { + if (form->current == field) + { + Synchronize_Buffer(form); + Set_Field_Window_Attributes(field, form->w); + werase(form->w); + wmove(form->w, form->currow, form->curcol); + + if (Field_Has_Option(field, O_PUBLIC)) + { + if (Justification_Allowed(field)) + Undo_Justification(field, form->w); + else + Buffer_To_Window(field, form->w); + } + else + { + WINDOW *formwin = Get_Form_Window(form); + + copywin(form->w, formwin, + 0, 0, + field->frow, field->fcol, + field->frow + field->rows - 1, + field->fcol + field->cols - 1, 0); + wsyncup(formwin); + Buffer_To_Window(field, form->w); + SetStatus(field, _NEWTOP); /* fake refresh to paint all */ + _nc_Refresh_Current_Field(form); + } + } + else + { + res = Display_Field(field); + } + } + CHECKPOS(form); + returnCode(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_Synchronize_Options(FIELD * field, +| Field_Options newopts) +| +| Description : If a field's options have changed, this routine is +| called to propagate these changes to the screen and +| to really change the behavior of the field. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid field pointer +| E_CURRENT - field is the current one +| E_SYSTEM_ERROR - some severe basic error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +_nc_Synchronize_Options(FIELD *field, Field_Options newopts) +{ + Field_Options oldopts; + Field_Options changed_opts; + FORM *form; + int res = E_OK; + + T((T_CALLED("_nc_Synchronize_Options(%p,%#x)"), (void *)field, newopts)); + + if (!field) + returnCode(E_BAD_ARGUMENT); + + oldopts = field->opts; + changed_opts = oldopts ^ newopts; + field->opts = newopts; + form = field->form; + + if (form) + { + if (form->status & _POSTED) + { + if (form->current == field) + { + field->opts = oldopts; + returnCode(E_CURRENT); + } + if (form->curpage == field->page) + { + if ((unsigned)changed_opts & O_VISIBLE) + { + if ((unsigned)newopts & O_VISIBLE) + res = Display_Field(field); + else + res = Erase_Field(field); + } + else + { + if (((unsigned)changed_opts & O_PUBLIC) && + ((unsigned)newopts & O_VISIBLE)) + res = Display_Field(field); + } + } + } + } + + if ((unsigned)changed_opts & O_STATIC) + { + bool single_line_field = Single_Line_Field(field); + int res2 = E_OK; + + if ((unsigned)newopts & O_STATIC) + { + /* the field becomes now static */ + ClrStatus(field, _MAY_GROW); + /* if actually we have no hidden columns, justification may + occur again */ + if (single_line_field && + (field->cols == field->dcols) && + (field->just != NO_JUSTIFICATION) && + Field_Really_Appears(field)) + { + res2 = Display_Field(field); + } + } + else + { + /* field is no longer static */ + if ((field->maxgrow == 0) || + (single_line_field && (field->dcols < field->maxgrow)) || + (!single_line_field && (field->drows < field->maxgrow))) + { + SetStatus(field, _MAY_GROW); + /* a field with justification now changes its behavior, + so we must redisplay it */ + if (single_line_field && + (field->just != NO_JUSTIFICATION) && + Field_Really_Appears(field)) + { + res2 = Display_Field(field); + } + } + } + if (res2 != E_OK) + res = res2; + } + + returnCode(res); +} + +/* + * Removes the focus from the current field of the form. + */ +void +_nc_Unset_Current_Field(FORM *form) +{ + FIELD *field = form->current; + + _nc_Refresh_Current_Field(form); + if (Field_Has_Option(field, O_PUBLIC)) + { + if (field->drows > field->rows) + { + if (form->toprow == 0) + ClrStatus(field, _NEWTOP); + else + SetStatus(field, _NEWTOP); + } + else + { + if (Justification_Allowed(field)) + { + Window_To_Buffer(form, field); + werase(form->w); + Perform_Justification(field, form->w); + if (Field_Has_Option(field, O_DYNAMIC_JUSTIFY) && + (form->w->_parent == 0)) + { + copywin(form->w, + Get_Form_Window(form), + 0, + 0, + field->frow, + field->fcol, + field->frow, + field->cols + field->fcol - 1, + 0); + wsyncup(Get_Form_Window(form)); + } + else + { + wsyncup(form->w); + } + } + } + } + delwin(form->w); + form->w = (WINDOW *)0; + form->current = 0; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_Set_Current_Field(FORM * form, +| FIELD * newfield) +| +| Description : Make the newfield the new current field. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form or field pointer +| E_SYSTEM_ERROR - some severe basic error +| E_NOT_CONNECTED - no fields are connected to the form ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +_nc_Set_Current_Field(FORM *form, FIELD *newfield) +{ + FIELD *field; + WINDOW *new_window; + + T((T_CALLED("_nc_Set_Current_Field(%p,%p)"), (void *)form, (void *)newfield)); + + if (!form || !newfield || (newfield->form != form)) + returnCode(E_BAD_ARGUMENT); + + if ((form->status & _IN_DRIVER)) + returnCode(E_BAD_STATE); + + if (!(form->field)) + returnCode(E_NOT_CONNECTED); + + field = form->current; + + if ((field != newfield) || + !(form->status & _POSTED)) + { + if (field && (form->w) && + (Field_Has_Option(field, O_VISIBLE)) && + (field->form->curpage == field->page)) + _nc_Unset_Current_Field(form); + + field = newfield; + + if (Has_Invisible_Parts(field)) + new_window = newpad(field->drows, field->dcols); + else + new_window = derwin(Get_Form_Window(form), + field->rows, field->cols, field->frow, field->fcol); + + if (!new_window) + returnCode(E_SYSTEM_ERROR); + + form->current = field; + + if (form->w) + delwin(form->w); + form->w = new_window; + + ClrStatus(form, _WINDOW_MODIFIED); + Set_Field_Window_Attributes(field, form->w); + + if (Has_Invisible_Parts(field)) + { + werase(form->w); + Buffer_To_Window(field, form->w); + } + else + { + if (Justification_Allowed(field)) + { + werase(form->w); + Undo_Justification(field, form->w); + wsyncup(form->w); + } + } + + untouchwin(form->w); + } + + form->currow = form->curcol = form->toprow = form->begincol = 0; + returnCode(E_OK); +} + +/*---------------------------------------------------------------------------- + Intra-Field Navigation routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Next_Character(FORM * form) +| +| Description : Move to the next character in the field. In a multi-line +| field this wraps at the end of the line. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - at the rightmost position ++--------------------------------------------------------------------------*/ +static int +IFN_Next_Character(FORM *form) +{ + FIELD *field = form->current; + int step = myWCWIDTH(form->w, form->currow, form->curcol); + + T((T_CALLED("IFN_Next_Character(%p)"), (void *)form)); + if ((form->curcol += step) == field->dcols) + { + if ((++(form->currow)) == field->drows) + { +#if GROW_IF_NAVIGATE + if (!Single_Line_Field(field) && Field_Grown(field, 1)) + { + form->curcol = 0; + returnCode(E_OK); + } +#endif + form->currow--; +#if GROW_IF_NAVIGATE + if (Single_Line_Field(field) && Field_Grown(field, 1)) + returnCode(E_OK); +#endif + form->curcol -= step; + returnCode(E_REQUEST_DENIED); + } + form->curcol = 0; + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Previous_Character(FORM * form) +| +| Description : Move to the previous character in the field. In a +| multi-line field this wraps and the beginning of the +| line. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - at the leftmost position ++--------------------------------------------------------------------------*/ +static int +IFN_Previous_Character(FORM *form) +{ + int amount = myWCWIDTH(form->w, form->currow, form->curcol - 1); + int oldcol = form->curcol; + + T((T_CALLED("IFN_Previous_Character(%p)"), (void *)form)); + if ((form->curcol -= amount) < 0) + { + if ((--(form->currow)) < 0) + { + form->currow++; + form->curcol = oldcol; + returnCode(E_REQUEST_DENIED); + } + form->curcol = form->current->dcols - 1; + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Next_Line(FORM * form) +| +| Description : Move to the beginning of the next line in the field +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - at the last line ++--------------------------------------------------------------------------*/ +static int +IFN_Next_Line(FORM *form) +{ + FIELD *field = form->current; + + T((T_CALLED("IFN_Next_Line(%p)"), (void *)form)); + if ((++(form->currow)) == field->drows) + { +#if GROW_IF_NAVIGATE + if (!Single_Line_Field(field) && Field_Grown(field, 1)) + returnCode(E_OK); +#endif + form->currow--; + returnCode(E_REQUEST_DENIED); + } + form->curcol = 0; + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Previous_Line(FORM * form) +| +| Description : Move to the beginning of the previous line in the field +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - at the first line ++--------------------------------------------------------------------------*/ +static int +IFN_Previous_Line(FORM *form) +{ + T((T_CALLED("IFN_Previous_Line(%p)"), (void *)form)); + if ((--(form->currow)) < 0) + { + form->currow++; + returnCode(E_REQUEST_DENIED); + } + form->curcol = 0; + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Next_Word(FORM * form) +| +| Description : Move to the beginning of the next word in the field. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - there is no next word ++--------------------------------------------------------------------------*/ +static int +IFN_Next_Word(FORM *form) +{ + const FIELD *field = form->current; + FIELD_CELL *bp = Address_Of_Current_Position_In_Buffer(form); + FIELD_CELL *s; + const FIELD_CELL *t; + + T((T_CALLED("IFN_Next_Word(%p)"), (void *)form)); + + /* We really need access to the data, so we have to synchronize */ + Synchronize_Buffer(form); + + /* Go to the first whitespace after the current position (including + current position). This is then the starting point to look for the + next non-blank data */ + s = Get_First_Whitespace_Character(bp, Buffer_Length(field) - + (int)(bp - field->buf)); + + /* Find the start of the next word */ + t = Get_Start_Of_Data(s, Buffer_Length(field) - + (int)(s - field->buf)); +#if !FRIENDLY_PREV_NEXT_WORD + if (s == t) + returnCode(E_REQUEST_DENIED); + else +#endif + { + Adjust_Cursor_Position(form, t); + returnCode(E_OK); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Previous_Word(FORM * form) +| +| Description : Move to the beginning of the previous word in the field. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - there is no previous word ++--------------------------------------------------------------------------*/ +static int +IFN_Previous_Word(FORM *form) +{ + FIELD *field = form->current; + const FIELD_CELL *bp = Address_Of_Current_Position_In_Buffer(form); + const FIELD_CELL *s; + const FIELD_CELL *t; + bool again = FALSE; + + T((T_CALLED("IFN_Previous_Word(%p)"), (void *)form)); + + /* We really need access to the data, so we have to synchronize */ + Synchronize_Buffer(form); + + s = After_End_Of_Data(field->buf, (int)(bp - field->buf)); + /* s points now right after the last non-blank in the buffer before bp. + If bp was in a word, s equals bp. In this case we must find the last + whitespace in the buffer before bp and repeat the game to really find + the previous word! */ + if (s == bp) + again = TRUE; + + /* And next call now goes backward to look for the last whitespace + before that, pointing right after this, so it points to the begin + of the previous word. + */ + t = After_Last_Whitespace_Character(field->buf, (int)(s - field->buf)); +#if !FRIENDLY_PREV_NEXT_WORD + if (s == t) + returnCode(E_REQUEST_DENIED); +#endif + if (again) + { + /* and do it again, replacing bp by t */ + s = After_End_Of_Data(field->buf, (int)(t - field->buf)); + t = After_Last_Whitespace_Character(field->buf, (int)(s - field->buf)); +#if !FRIENDLY_PREV_NEXT_WORD + if (s == t) + returnCode(E_REQUEST_DENIED); +#endif + } + Adjust_Cursor_Position(form, t); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Beginning_Of_Field(FORM * form) +| +| Description : Place the cursor at the first non-pad character in +| the field. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +IFN_Beginning_Of_Field(FORM *form) +{ + FIELD *field = form->current; + + T((T_CALLED("IFN_Beginning_Of_Field(%p)"), (void *)form)); + Synchronize_Buffer(form); + Adjust_Cursor_Position(form, + Get_Start_Of_Data(field->buf, Buffer_Length(field))); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_End_Of_Field(FORM * form) +| +| Description : Place the cursor after the last non-pad character in +| the field. If the field occupies the last position in +| the buffer, the cursor is positioned on the last +| character. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +IFN_End_Of_Field(FORM *form) +{ + FIELD *field = form->current; + FIELD_CELL *pos; + + T((T_CALLED("IFN_End_Of_Field(%p)"), (void *)form)); + Synchronize_Buffer(form); + pos = After_End_Of_Data(field->buf, Buffer_Length(field)); + if (pos == (field->buf + Buffer_Length(field))) + pos--; + Adjust_Cursor_Position(form, pos); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Beginning_Of_Line(FORM * form) +| +| Description : Place the cursor on the first non-pad character in +| the current line of the field. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +IFN_Beginning_Of_Line(FORM *form) +{ + const FIELD *field = form->current; + + T((T_CALLED("IFN_Beginning_Of_Line(%p)"), (void *)form)); + Synchronize_Buffer(form); + Adjust_Cursor_Position(form, + Get_Start_Of_Data(Address_Of_Current_Row_In_Buffer(form), + field->dcols)); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_End_Of_Line(FORM * form) +| +| Description : Place the cursor after the last non-pad character in the +| current line of the field. If the field occupies the +| last column in the line, the cursor is positioned on the +| last character of the line. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +IFN_End_Of_Line(FORM *form) +{ + const FIELD *field = form->current; + FIELD_CELL *pos; + FIELD_CELL *bp; + + T((T_CALLED("IFN_End_Of_Line(%p)"), (void *)form)); + Synchronize_Buffer(form); + bp = Address_Of_Current_Row_In_Buffer(form); + pos = After_End_Of_Data(bp, field->dcols); + if (pos == (bp + field->dcols)) + pos--; + Adjust_Cursor_Position(form, pos); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Left_Character(FORM * form) +| +| Description : Move one character to the left in the current line. +| This doesn't cycle. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - already in first column ++--------------------------------------------------------------------------*/ +static int +IFN_Left_Character(FORM *form) +{ + int amount = myWCWIDTH(form->w, form->currow, form->curcol - 1); + int oldcol = form->curcol; + + T((T_CALLED("IFN_Left_Character(%p)"), (void *)form)); + if ((form->curcol -= amount) < 0) + { + form->curcol = oldcol; + returnCode(E_REQUEST_DENIED); + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Right_Character(FORM * form) +| +| Description : Move one character to the right in the current line. +| This doesn't cycle. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - already in last column ++--------------------------------------------------------------------------*/ +static int +IFN_Right_Character(FORM *form) +{ + int amount = myWCWIDTH(form->w, form->currow, form->curcol); + int oldcol = form->curcol; + + T((T_CALLED("IFN_Right_Character(%p)"), (void *)form)); + if ((form->curcol += amount) >= form->current->dcols) + { +#if GROW_IF_NAVIGATE + FIELD *field = form->current; + + if (Single_Line_Field(field) && Field_Grown(field, 1)) + returnCode(E_OK); +#endif + form->curcol = oldcol; + returnCode(E_REQUEST_DENIED); + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Up_Character(FORM * form) +| +| Description : Move one line up. This doesn't cycle through the lines +| of the field. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - already in last column ++--------------------------------------------------------------------------*/ +static int +IFN_Up_Character(FORM *form) +{ + T((T_CALLED("IFN_Up_Character(%p)"), (void *)form)); + if ((--(form->currow)) < 0) + { + form->currow++; + returnCode(E_REQUEST_DENIED); + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int IFN_Down_Character(FORM * form) +| +| Description : Move one line down. This doesn't cycle through the +| lines of the field. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - already in last column ++--------------------------------------------------------------------------*/ +static int +IFN_Down_Character(FORM *form) +{ + FIELD *field = form->current; + + T((T_CALLED("IFN_Down_Character(%p)"), (void *)form)); + if ((++(form->currow)) == field->drows) + { +#if GROW_IF_NAVIGATE + if (!Single_Line_Field(field) && Field_Grown(field, 1)) + returnCode(E_OK); +#endif + --(form->currow); + returnCode(E_REQUEST_DENIED); + } + returnCode(E_OK); +} +/*---------------------------------------------------------------------------- + END of Intra-Field Navigation routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Vertical scrolling helper routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Generic(FORM *form, int nlines) +| +| Description : Scroll multi-line field forward (nlines>0) or +| backward (nlines<0) this many lines. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - can't scroll ++--------------------------------------------------------------------------*/ +static int +VSC_Generic(FORM *form, int nlines) +{ + const FIELD *field = form->current; + int res = E_REQUEST_DENIED; + int rows_to_go = (nlines > 0 ? nlines : -nlines); + + if (nlines > 0) + { + if ((rows_to_go + form->toprow) > (field->drows - field->rows)) + rows_to_go = (field->drows - field->rows - form->toprow); + + if (rows_to_go > 0) + { + form->currow += rows_to_go; + form->toprow += rows_to_go; + res = E_OK; + } + } + else + { + if (rows_to_go > form->toprow) + rows_to_go = form->toprow; + + if (rows_to_go > 0) + { + form->currow -= rows_to_go; + form->toprow -= rows_to_go; + res = E_OK; + } + } + return (res); +} +/*---------------------------------------------------------------------------- + End of Vertical scrolling helper routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Vertical scrolling routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Vertical_Scrolling( +| int (* const fct) (FORM *), +| FORM * form) +| +| Description : Performs the generic vertical scrolling routines. +| This has to check for a multi-line field and to set +| the _NEWTOP flag if scrolling really occurred. +| +| Return Values : Propagated error code from low-level driver calls ++--------------------------------------------------------------------------*/ +static int +Vertical_Scrolling(int (*const fct) (FORM *), FORM *form) +{ + int res = E_REQUEST_DENIED; + + if (!Single_Line_Field(form->current)) + { + res = fct(form); + if (res == E_OK) + SetStatus(form->current, _NEWTOP); + } + return (res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Scroll_Line_Forward(FORM * form) +| +| Description : Scroll multi-line field forward a line +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data ahead ++--------------------------------------------------------------------------*/ +static int +VSC_Scroll_Line_Forward(FORM *form) +{ + T((T_CALLED("VSC_Scroll_Line_Forward(%p)"), (void *)form)); + returnCode(VSC_Generic(form, 1)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Scroll_Line_Backward(FORM * form) +| +| Description : Scroll multi-line field backward a line +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data behind ++--------------------------------------------------------------------------*/ +static int +VSC_Scroll_Line_Backward(FORM *form) +{ + T((T_CALLED("VSC_Scroll_Line_Backward(%p)"), (void *)form)); + returnCode(VSC_Generic(form, -1)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Scroll_Page_Forward(FORM * form) +| +| Description : Scroll a multi-line field forward a page +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data ahead ++--------------------------------------------------------------------------*/ +static int +VSC_Scroll_Page_Forward(FORM *form) +{ + T((T_CALLED("VSC_Scroll_Page_Forward(%p)"), (void *)form)); + returnCode(VSC_Generic(form, form->current->rows)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Scroll_Half_Page_Forward(FORM * form) +| +| Description : Scroll a multi-line field forward half a page +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data ahead ++--------------------------------------------------------------------------*/ +static int +VSC_Scroll_Half_Page_Forward(FORM *form) +{ + T((T_CALLED("VSC_Scroll_Half_Page_Forward(%p)"), (void *)form)); + returnCode(VSC_Generic(form, (form->current->rows + 1) / 2)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Scroll_Page_Backward(FORM * form) +| +| Description : Scroll a multi-line field backward a page +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data behind ++--------------------------------------------------------------------------*/ +static int +VSC_Scroll_Page_Backward(FORM *form) +{ + T((T_CALLED("VSC_Scroll_Page_Backward(%p)"), (void *)form)); + returnCode(VSC_Generic(form, -(form->current->rows))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int VSC_Scroll_Half_Page_Backward(FORM * form) +| +| Description : Scroll a multi-line field backward half a page +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data behind ++--------------------------------------------------------------------------*/ +static int +VSC_Scroll_Half_Page_Backward(FORM *form) +{ + T((T_CALLED("VSC_Scroll_Half_Page_Backward(%p)"), (void *)form)); + returnCode(VSC_Generic(form, -((form->current->rows + 1) / 2))); +} +/*---------------------------------------------------------------------------- + End of Vertical scrolling routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Horizontal scrolling helper routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Generic(FORM *form, int ncolumns) +| +| Description : Scroll single-line field forward (ncolumns>0) or +| backward (ncolumns<0) this many columns. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - can't scroll ++--------------------------------------------------------------------------*/ +static int +HSC_Generic(FORM *form, int ncolumns) +{ + const FIELD *field = form->current; + int res = E_REQUEST_DENIED; + int cols_to_go = (ncolumns > 0 ? ncolumns : -ncolumns); + + if (ncolumns > 0) + { + if ((cols_to_go + form->begincol) > (field->dcols - field->cols)) + cols_to_go = field->dcols - field->cols - form->begincol; + + if (cols_to_go > 0) + { + form->curcol += cols_to_go; + form->begincol += cols_to_go; + res = E_OK; + } + } + else + { + if (cols_to_go > form->begincol) + cols_to_go = form->begincol; + + if (cols_to_go > 0) + { + form->curcol -= cols_to_go; + form->begincol -= cols_to_go; + res = E_OK; + } + } + return (res); +} +/*---------------------------------------------------------------------------- + End of Horizontal scrolling helper routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Horizontal scrolling routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Horizontal_Scrolling( +| int (* const fct) (FORM *), +| FORM * form) +| +| Description : Performs the generic horizontal scrolling routines. +| This has to check for a single-line field. +| +| Return Values : Propagated error code from low-level driver calls ++--------------------------------------------------------------------------*/ +static int +Horizontal_Scrolling(int (*const fct) (FORM *), FORM *form) +{ + if (Single_Line_Field(form->current)) + return fct(form); + else + return (E_REQUEST_DENIED); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Scroll_Char_Forward(FORM * form) +| +| Description : Scroll single-line field forward a character +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data ahead ++--------------------------------------------------------------------------*/ +static int +HSC_Scroll_Char_Forward(FORM *form) +{ + T((T_CALLED("HSC_Scroll_Char_Forward(%p)"), (void *)form)); + returnCode(HSC_Generic(form, 1)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Scroll_Char_Backward(FORM * form) +| +| Description : Scroll single-line field backward a character +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data behind ++--------------------------------------------------------------------------*/ +static int +HSC_Scroll_Char_Backward(FORM *form) +{ + T((T_CALLED("HSC_Scroll_Char_Backward(%p)"), (void *)form)); + returnCode(HSC_Generic(form, -1)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Horizontal_Line_Forward(FORM* form) +| +| Description : Scroll single-line field forward a line +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data ahead ++--------------------------------------------------------------------------*/ +static int +HSC_Horizontal_Line_Forward(FORM *form) +{ + T((T_CALLED("HSC_Horizontal_Line_Forward(%p)"), (void *)form)); + returnCode(HSC_Generic(form, form->current->cols)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Horizontal_Half_Line_Forward(FORM* form) +| +| Description : Scroll single-line field forward half a line +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data ahead ++--------------------------------------------------------------------------*/ +static int +HSC_Horizontal_Half_Line_Forward(FORM *form) +{ + T((T_CALLED("HSC_Horizontal_Half_Line_Forward(%p)"), (void *)form)); + returnCode(HSC_Generic(form, (form->current->cols + 1) / 2)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Horizontal_Line_Backward(FORM* form) +| +| Description : Scroll single-line field backward a line +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data behind ++--------------------------------------------------------------------------*/ +static int +HSC_Horizontal_Line_Backward(FORM *form) +{ + T((T_CALLED("HSC_Horizontal_Line_Backward(%p)"), (void *)form)); + returnCode(HSC_Generic(form, -(form->current->cols))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int HSC_Horizontal_Half_Line_Backward(FORM* form) +| +| Description : Scroll single-line field backward half a line +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - no data behind ++--------------------------------------------------------------------------*/ +static int +HSC_Horizontal_Half_Line_Backward(FORM *form) +{ + T((T_CALLED("HSC_Horizontal_Half_Line_Backward(%p)"), (void *)form)); + returnCode(HSC_Generic(form, -((form->current->cols + 1) / 2))); +} + +/*---------------------------------------------------------------------------- + End of Horizontal scrolling routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Helper routines for Field Editing + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Is_There_Room_For_A_Line(FORM * form) +| +| Description : Check whether or not there is enough room in the +| buffer to enter a whole line. +| +| Return Values : TRUE - there is enough space +| FALSE - there is not enough space ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static bool +Is_There_Room_For_A_Line(FORM *form) +{ + FIELD *field = form->current; + FIELD_CELL *begin_of_last_line; + const FIELD_CELL *s; + + Synchronize_Buffer(form); + begin_of_last_line = Address_Of_Row_In_Buffer(field, (field->drows - 1)); + s = After_End_Of_Data(begin_of_last_line, field->dcols); + return ((s == begin_of_last_line) ? TRUE : FALSE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Is_There_Room_For_A_Char_In_Line(FORM * form) +| +| Description : Checks whether or not there is room for a new character +| in the current line. +| +| Return Values : TRUE - there is room +| FALSE - there is not enough room (line full) ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static bool +Is_There_Room_For_A_Char_In_Line(FORM *form) +{ + int last_char_in_line; + + wmove(form->w, form->currow, form->current->dcols - 1); + last_char_in_line = (int)(winch(form->w) & A_CHARTEXT); + wmove(form->w, form->currow, form->curcol); + return (((last_char_in_line == form->current->pad) || + is_blank(last_char_in_line)) ? TRUE : FALSE); +} + +#define There_Is_No_Room_For_A_Char_In_Line(f) \ + !Is_There_Room_For_A_Char_In_Line(f) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Insert_String( +| FORM * form, +| int row, +| char *txt, +| int len ) +| +| Description : Insert the 'len' characters beginning at pointer 'txt' +| into the 'row' of the 'form'. The insertion occurs +| on the beginning of the row, all other characters are +| moved to the right. After the text a pad character will +| be inserted to separate the text from the rest. If +| necessary the insertion moves characters on the next +| line to make place for the requested insertion string. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +static int +Insert_String(FORM *form, int row, const FIELD_CELL *txt, int len) +{ + FIELD *field = form->current; + FIELD_CELL *bp = Address_Of_Row_In_Buffer(field, row); + int datalen = (int)(After_End_Of_Data(bp, field->dcols) - bp); + int freelen = field->dcols - datalen; + int requiredlen = len + 1; + int result = E_REQUEST_DENIED; + + if (freelen >= requiredlen) + { + wmove(form->w, row, 0); + myINSNSTR(form->w, txt, len); + wmove(form->w, row, len); + myINSNSTR(form->w, &myBLANK, 1); + result = E_OK; + } + else + { + /* we have to move characters on the next line. If we are on the + last line this may work, if the field is growable */ + if ((row == (field->drows - 1)) && Growable(field)) + { + if (!Field_Grown(field, 1)) + return (E_SYSTEM_ERROR); + /* !!!Side-Effect : might be changed due to growth!!! */ + bp = Address_Of_Row_In_Buffer(field, row); + } + + if (row < (field->drows - 1)) + { + const FIELD_CELL *split; + + split = + After_Last_Whitespace_Character(bp, + (int)(Get_Start_Of_Data(bp + + field->dcols + - requiredlen, + requiredlen) + - bp)); + /* split points now to the first character of the portion of the + line that must be moved to the next line */ + datalen = (int)(split - bp); /* + freelen has to stay on this line */ + freelen = field->dcols - (datalen + freelen); /* for the next line */ + + if ((result = Insert_String(form, row + 1, split, freelen)) == E_OK) + { + wmove(form->w, row, datalen); + wclrtoeol(form->w); + wmove(form->w, row, 0); + myINSNSTR(form->w, txt, len); + wmove(form->w, row, len); + myINSNSTR(form->w, &myBLANK, 1); + return E_OK; + } + } + } + return (result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Wrapping_Not_Necessary_Or_Wrapping_Ok( +| FORM * form) +| +| Description : If a character has been entered into a field, it may +| be that wrapping has to occur. This routine checks +| whether or not wrapping is required and if so, performs +| the wrapping. +| +| Return Values : E_OK - no wrapping required or wrapping +| was successful +| E_REQUEST_DENIED - +| E_SYSTEM_ERROR - some system error ++--------------------------------------------------------------------------*/ +static int +Wrapping_Not_Necessary_Or_Wrapping_Ok(FORM *form) +{ + FIELD *field = form->current; + int result = E_REQUEST_DENIED; + bool Last_Row = ((field->drows - 1) == form->currow); + + if ((Field_Has_Option(field, O_WRAP)) && /* wrapping wanted */ + (!Single_Line_Field(field)) && /* must be multi-line */ + (There_Is_No_Room_For_A_Char_In_Line(form)) && /* line is full */ + (!Last_Row || Growable(field))) /* there are more lines */ + { + FIELD_CELL *bp; + const FIELD_CELL *split; + int chars_to_be_wrapped; + int chars_to_remain_on_line; + + if (Last_Row) + { + /* the above logic already ensures, that in this case the field + is growable */ + if (!Field_Grown(field, 1)) + return E_SYSTEM_ERROR; + } + bp = Address_Of_Current_Row_In_Buffer(form); + Window_To_Buffer(form, field); + split = After_Last_Whitespace_Character(bp, field->dcols); + /* split points to the first character of the sequence to be brought + on the next line */ + chars_to_remain_on_line = (int)(split - bp); + chars_to_be_wrapped = field->dcols - chars_to_remain_on_line; + if (chars_to_remain_on_line > 0) + { + if ((result = Insert_String(form, form->currow + 1, split, + chars_to_be_wrapped)) == E_OK) + { + wmove(form->w, form->currow, chars_to_remain_on_line); + wclrtoeol(form->w); + if (form->curcol >= chars_to_remain_on_line) + { + form->currow++; + form->curcol -= chars_to_remain_on_line; + } + return E_OK; + } + } + else + return E_OK; + if (result != E_OK) + { + DeleteChar(form); + Window_To_Buffer(form, field); + result = E_REQUEST_DENIED; + } + } + else + result = E_OK; /* wrapping was not necessary */ + return (result); +} + +/*---------------------------------------------------------------------------- + Field Editing routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Field_Editing( +| int (* const fct) (FORM *), +| FORM * form) +| +| Description : Generic routine for field editing requests. The driver +| routines are only called for editable fields, the +| _WINDOW_MODIFIED flag is set if editing occurred. +| This is somewhat special due to the overload semantics +| of the NEW_LINE and DEL_PREV requests. +| +| Return Values : Error code from low level drivers. ++--------------------------------------------------------------------------*/ +static int +Field_Editing(int (*const fct) (FORM *), FORM *form) +{ + int res = E_REQUEST_DENIED; + + /* We have to deal here with the specific case of the overloaded + behavior of New_Line and Delete_Previous requests. + They may end up in navigational requests if we are on the first + character in a field. But navigation is also allowed on non- + editable fields. + */ + if ((fct == FE_Delete_Previous) && + ((unsigned)form->opts & O_BS_OVERLOAD) && + First_Position_In_Current_Field(form)) + { + res = Inter_Field_Navigation(FN_Previous_Field, form); + } + else + { + if (fct == FE_New_Line) + { + if (((unsigned)form->opts & O_NL_OVERLOAD) && + First_Position_In_Current_Field(form)) + { + res = Inter_Field_Navigation(FN_Next_Field, form); + } + else + /* FE_New_Line deals itself with the _WINDOW_MODIFIED flag */ + res = fct(form); + } + else + { + /* From now on, everything must be editable */ + if ((unsigned)form->current->opts & O_EDIT) + { + res = fct(form); + if (res == E_OK) + SetStatus(form, _WINDOW_MODIFIED); + } + } + } + return res; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_New_Line(FORM * form) +| +| Description : Perform a new line request. This is rather complex +| compared to other routines in this code due to the +| rather difficult to understand description in the +| manuals. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - new line not allowed +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +static int +FE_New_Line(FORM *form) +{ + FIELD *field = form->current; + FIELD_CELL *bp; + bool Last_Row = ((field->drows - 1) == form->currow); + + T((T_CALLED("FE_New_Line(%p)"), (void *)form)); + if (form->status & _OVLMODE) + { + if (Last_Row && + (!(Growable(field) && !Single_Line_Field(field)))) + { + if (!((unsigned)form->opts & O_NL_OVERLOAD)) + returnCode(E_REQUEST_DENIED); + wmove(form->w, form->currow, form->curcol); + wclrtoeol(form->w); + /* we have to set this here, although it is also + handled in the generic routine. The reason is, + that FN_Next_Field may fail, but the form is + definitively changed */ + SetStatus(form, _WINDOW_MODIFIED); + returnCode(Inter_Field_Navigation(FN_Next_Field, form)); + } + else + { + if (Last_Row && !Field_Grown(field, 1)) + { + /* N.B.: due to the logic in the 'if', LastRow==TRUE + means here that the field is growable and not + a single-line field */ + returnCode(E_SYSTEM_ERROR); + } + wmove(form->w, form->currow, form->curcol); + wclrtoeol(form->w); + form->currow++; + form->curcol = 0; + SetStatus(form, _WINDOW_MODIFIED); + returnCode(E_OK); + } + } + else + { + /* Insert Mode */ + if (Last_Row && + !(Growable(field) && !Single_Line_Field(field))) + { + if (!((unsigned)form->opts & O_NL_OVERLOAD)) + returnCode(E_REQUEST_DENIED); + returnCode(Inter_Field_Navigation(FN_Next_Field, form)); + } + else + { + const FIELD_CELL *t; + bool May_Do_It = !Last_Row && Is_There_Room_For_A_Line(form); + + if (!(May_Do_It || Growable(field))) + returnCode(E_REQUEST_DENIED); + if (!May_Do_It && !Field_Grown(field, 1)) + returnCode(E_SYSTEM_ERROR); + + bp = Address_Of_Current_Position_In_Buffer(form); + t = After_End_Of_Data(bp, field->dcols - form->curcol); + wmove(form->w, form->currow, form->curcol); + wclrtoeol(form->w); + form->currow++; + form->curcol = 0; + wmove(form->w, form->currow, form->curcol); + winsertln(form->w); + myADDNSTR(form->w, bp, (int)(t - bp)); + SetStatus(form, _WINDOW_MODIFIED); + returnCode(E_OK); + } + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Insert_Character(FORM * form) +| +| Description : Insert blank character at the cursor position +| +| Return Values : E_OK +| E_REQUEST_DENIED ++--------------------------------------------------------------------------*/ +static int +FE_Insert_Character(FORM *form) +{ + FIELD *field = form->current; + int result = E_REQUEST_DENIED; + + T((T_CALLED("FE_Insert_Character(%p)"), (void *)form)); + if (Check_Char(form, field, field->type, (int)C_BLANK, + (TypeArgument *)(field->arg))) + { + bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form); + + if (There_Is_Room || + ((Single_Line_Field(field) && Growable(field)))) + { + if (!There_Is_Room && !Field_Grown(field, 1)) + result = E_SYSTEM_ERROR; + else + { + winsch(form->w, (chtype)C_BLANK); + result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form); + } + } + } + returnCode(result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Insert_Line(FORM * form) +| +| Description : Insert a blank line at the cursor position +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - line can not be inserted ++--------------------------------------------------------------------------*/ +static int +FE_Insert_Line(FORM *form) +{ + FIELD *field = form->current; + int result = E_REQUEST_DENIED; + + T((T_CALLED("FE_Insert_Line(%p)"), (void *)form)); + if (Check_Char(form, field, + field->type, (int)C_BLANK, (TypeArgument *)(field->arg))) + { + bool Maybe_Done = (form->currow != (field->drows - 1)) && + Is_There_Room_For_A_Line(form); + + if (!Single_Line_Field(field) && + (Maybe_Done || Growable(field))) + { + if (!Maybe_Done && !Field_Grown(field, 1)) + result = E_SYSTEM_ERROR; + else + { + form->curcol = 0; + winsertln(form->w); + result = E_OK; + } + } + } + returnCode(result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Delete_Character(FORM * form) +| +| Description : Delete character at the cursor position +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +FE_Delete_Character(FORM *form) +{ + T((T_CALLED("FE_Delete_Character(%p)"), (void *)form)); + DeleteChar(form); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Delete_Previous(FORM * form) +| +| Description : Delete character before cursor. Again this is a rather +| difficult piece compared to others due to the overloading +| semantics of backspace. +| N.B.: The case of overloaded BS on first field position +| is already handled in the generic routine. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - Character can't be deleted ++--------------------------------------------------------------------------*/ +static int +FE_Delete_Previous(FORM *form) +{ + const FIELD *field = form->current; + + T((T_CALLED("FE_Delete_Previous(%p)"), (void *)form)); + if (First_Position_In_Current_Field(form)) + returnCode(E_REQUEST_DENIED); + + if ((--(form->curcol)) < 0) + { + FIELD_CELL *this_line, *prev_line; + const FIELD_CELL *prev_end, *this_end; + int this_row = form->currow; + + form->curcol++; + if (form->status & _OVLMODE) + returnCode(E_REQUEST_DENIED); + + prev_line = Address_Of_Row_In_Buffer(field, (form->currow - 1)); + this_line = Address_Of_Row_In_Buffer(field, (form->currow)); + Synchronize_Buffer(form); + prev_end = After_End_Of_Data(prev_line, field->dcols); + this_end = After_End_Of_Data(this_line, field->dcols); + if ((int)(this_end - this_line) > + (field->cols - (int)(prev_end - prev_line))) + returnCode(E_REQUEST_DENIED); + wmove(form->w, form->currow, form->curcol); + wdeleteln(form->w); + Adjust_Cursor_Position(form, prev_end); + /* + * If we did not really move to the previous line, help the user a + * little. It is however a little inconsistent. Normally, when + * backspacing around the point where text wraps to a new line in a + * multi-line form, we absorb one keystroke for the wrapping point. That + * is consistent with SVr4 forms. However, SVr4 does not allow typing + * into the last column of the field, and requires the user to enter a + * newline to move to the next line. Therefore it can consistently eat + * that keystroke. Since ncurses allows the last column, it wraps + * automatically (given the proper options). But we cannot eat the + * keystroke to back over the wrapping point, since that would put the + * cursor past the end of the form field. In this case, just delete the + * character at the end of the field. + */ + if (form->currow == this_row && this_row > 0) + { + form->currow -= 1; + form->curcol = field->dcols - 1; + DeleteChar(form); + } + else + { + wmove(form->w, form->currow, form->curcol); + myADDNSTR(form->w, this_line, (int)(this_end - this_line)); + } + } + else + { + DeleteChar(form); + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Delete_Line(FORM * form) +| +| Description : Delete line at cursor position. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +FE_Delete_Line(FORM *form) +{ + T((T_CALLED("FE_Delete_Line(%p)"), (void *)form)); + form->curcol = 0; + wdeleteln(form->w); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Delete_Word(FORM * form) +| +| Description : Delete word at cursor position +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - failure ++--------------------------------------------------------------------------*/ +static int +FE_Delete_Word(FORM *form) +{ + const FIELD *field = form->current; + FIELD_CELL *bp = Address_Of_Current_Row_In_Buffer(form); + const FIELD_CELL *ep = bp + field->dcols; + FIELD_CELL *cp = bp + form->curcol; + FIELD_CELL *s; + + T((T_CALLED("FE_Delete_Word(%p)"), (void *)form)); + Synchronize_Buffer(form); + if (ISBLANK(*cp)) + returnCode(E_REQUEST_DENIED); /* not in word */ + + /* move cursor to begin of word and erase to end of screen-line */ + Adjust_Cursor_Position(form, + After_Last_Whitespace_Character(bp, form->curcol)); + wmove(form->w, form->currow, form->curcol); + wclrtoeol(form->w); + + /* skip over word in buffer */ + s = Get_First_Whitespace_Character(cp, (int)(ep - cp)); + /* to begin of next word */ + s = Get_Start_Of_Data(s, (int)(ep - s)); + if ((s != cp) && !ISBLANK(*s)) + { + /* copy remaining line to window */ + myADDNSTR(form->w, s, (int)(s - After_End_Of_Data(s, (int)(ep - s)))); + } + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Clear_To_End_Of_Line(FORM * form) +| +| Description : Clear to end of current line. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +FE_Clear_To_End_Of_Line(FORM *form) +{ + T((T_CALLED("FE_Clear_To_End_Of_Line(%p)"), (void *)form)); + wmove(form->w, form->currow, form->curcol); + wclrtoeol(form->w); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Clear_To_End_Of_Field(FORM * form) +| +| Description : Clear to end of field. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +FE_Clear_To_End_Of_Field(FORM *form) +{ + T((T_CALLED("FE_Clear_To_End_Of_Field(%p)"), (void *)form)); + wmove(form->w, form->currow, form->curcol); + wclrtobot(form->w); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FE_Clear_Field(FORM * form) +| +| Description : Clear entire field. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +FE_Clear_Field(FORM *form) +{ + T((T_CALLED("FE_Clear_Field(%p)"), (void *)form)); + form->currow = form->curcol = 0; + werase(form->w); + returnCode(E_OK); +} +/*---------------------------------------------------------------------------- + END of Field Editing routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Edit Mode routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int EM_Overlay_Mode(FORM * form) +| +| Description : Switch to overlay mode. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +EM_Overlay_Mode(FORM *form) +{ + T((T_CALLED("EM_Overlay_Mode(%p)"), (void *)form)); + SetStatus(form, _OVLMODE); + returnCode(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int EM_Insert_Mode(FORM * form) +| +| Description : Switch to insert mode +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +static int +EM_Insert_Mode(FORM *form) +{ + T((T_CALLED("EM_Insert_Mode(%p)"), (void *)form)); + ClrStatus(form, _OVLMODE); + returnCode(E_OK); +} + +/*---------------------------------------------------------------------------- + END of Edit Mode routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Helper routines for Choice Requests + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Next_Choice(FORM * form, +| FIELDTYPE * typ, +| FIELD * field, +| TypeArgument *argp) +| +| Description : Get the next field choice. For linked types this is +| done recursively. +| +| Return Values : TRUE - next choice successfully retrieved +| FALSE - couldn't retrieve next choice ++--------------------------------------------------------------------------*/ +static bool +Next_Choice(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp) +{ + if (!typ || !(typ->status & _HAS_CHOICE)) + return FALSE; + + if (typ->status & _LINKED_TYPE) + { + assert(argp); + return ( + Next_Choice(form, typ->left, field, argp->left) || + Next_Choice(form, typ->right, field, argp->right)); + } + else + { +#if NCURSES_INTEROP_FUNCS + assert(typ->enum_next.onext); + if (typ->status & _GENERIC) + return typ->enum_next.gnext(form, field, (void *)argp); + else + return typ->enum_next.onext(field, (void *)argp); +#else + assert(typ->next); + return typ->next(field, (void *)argp); +#endif + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Previous_Choice(FORM * form, +| FIELDTYPE * typ, +| FIELD * field, +| TypeArgument *argp) +| +| Description : Get the previous field choice. For linked types this +| is done recursively. +| +| Return Values : TRUE - previous choice successfully retrieved +| FALSE - couldn't retrieve previous choice ++--------------------------------------------------------------------------*/ +static bool +Previous_Choice(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp) +{ + if (!typ || !(typ->status & _HAS_CHOICE)) + return FALSE; + + if (typ->status & _LINKED_TYPE) + { + assert(argp); + return ( + Previous_Choice(form, typ->left, field, argp->left) || + Previous_Choice(form, typ->right, field, argp->right)); + } + else + { +#if NCURSES_INTEROP_FUNCS + assert(typ->enum_prev.oprev); + if (typ->status & _GENERIC) + return typ->enum_prev.gprev(form, field, (void *)argp); + else + return typ->enum_prev.oprev(field, (void *)argp); +#else + assert(typ->prev); + return typ->prev(field, (void *)argp); +#endif + } +} +/*---------------------------------------------------------------------------- + End of Helper routines for Choice Requests + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Routines for Choice Requests + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int CR_Next_Choice(FORM * form) +| +| Description : Get the next field choice. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - next choice couldn't be retrieved ++--------------------------------------------------------------------------*/ +static int +CR_Next_Choice(FORM *form) +{ + FIELD *field = form->current; + + T((T_CALLED("CR_Next_Choice(%p)"), (void *)form)); + Synchronize_Buffer(form); + returnCode((Next_Choice(form, field->type, field, (TypeArgument *)(field->arg))) + ? E_OK + : E_REQUEST_DENIED); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int CR_Previous_Choice(FORM * form) +| +| Description : Get the previous field choice. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - prev. choice couldn't be retrieved ++--------------------------------------------------------------------------*/ +static int +CR_Previous_Choice(FORM *form) +{ + FIELD *field = form->current; + + T((T_CALLED("CR_Previous_Choice(%p)"), (void *)form)); + Synchronize_Buffer(form); + returnCode((Previous_Choice(form, field->type, field, (TypeArgument *)(field->arg))) + ? E_OK + : E_REQUEST_DENIED); +} +/*---------------------------------------------------------------------------- + End of Routines for Choice Requests + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Helper routines for Field Validations. + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_Field(FORM* form, +| FIELDTYPE * typ, +| FIELD * field, +| TypeArgument * argp) +| +| Description : Check the field according to its fieldtype and its +| actual arguments. For linked fieldtypes this is done +| recursively. +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid. ++--------------------------------------------------------------------------*/ +static bool +Check_Field(FORM *form, FIELDTYPE *typ, FIELD *field, TypeArgument *argp) +{ + if (typ) + { + if (Field_Has_Option(field, O_NULLOK)) + { + FIELD_CELL *bp = field->buf; + + assert(bp); + while (ISBLANK(*bp)) + { + bp++; + } + if (CharOf(*bp) == 0) + return TRUE; + } + + if (typ->status & _LINKED_TYPE) + { + assert(argp); + return ( + Check_Field(form, typ->left, field, argp->left) || + Check_Field(form, typ->right, field, argp->right)); + } + else + { +#if NCURSES_INTEROP_FUNCS + if (typ->fieldcheck.ofcheck) + { + if (typ->status & _GENERIC) + return typ->fieldcheck.gfcheck(form, field, (void *)argp); + else + return typ->fieldcheck.ofcheck(field, (void *)argp); + } +#else + if (typ->fcheck) + return typ->fcheck(field, (void *)argp); +#endif + } + } + return TRUE; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : bool _nc_Internal_Validation(FORM * form ) +| +| Description : Validate the current field of the form. +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +FORM_EXPORT(bool) +_nc_Internal_Validation(FORM *form) +{ + FIELD *field; + + field = form->current; + + Synchronize_Buffer(form); + if ((form->status & _FCHECK_REQUIRED) || + (!(Field_Has_Option(field, O_PASSOK)))) + { + if (!Check_Field(form, field->type, field, (TypeArgument *)(field->arg))) + return FALSE; + ClrStatus(form, _FCHECK_REQUIRED); + SetStatus(field, _CHANGED); + Synchronize_Linked_Fields(field); + } + return TRUE; +} +/*---------------------------------------------------------------------------- + End of Helper routines for Field Validations. + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Routines for Field Validation. + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FV_Validation(FORM * form) +| +| Description : Validate the current field of the form. +| +| Return Values : E_OK - field valid +| E_INVALID_FIELD - field not valid ++--------------------------------------------------------------------------*/ +static int +FV_Validation(FORM *form) +{ + T((T_CALLED("FV_Validation(%p)"), (void *)form)); + if (_nc_Internal_Validation(form)) + returnCode(E_OK); + else + returnCode(E_INVALID_FIELD); +} +/*---------------------------------------------------------------------------- + End of routines for Field Validation. + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Helper routines for Inter-Field Navigation + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Next_Field_On_Page(FIELD * field) +| +| Description : Get the next field after the given field on the current +| page. The order of fields is the one defined by the +| field's array. Only visible and active fields are +| counted. +| +| Return Values : Pointer to the next field. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD * +Next_Field_On_Page(FIELD *field) +{ + FORM *form = field->form; + FIELD **field_on_page = &form->field[field->index]; + FIELD **first_on_page = &form->field[form->page[form->curpage].pmin]; + FIELD **last_on_page = &form->field[form->page[form->curpage].pmax]; + + do + { + field_on_page = + (field_on_page == last_on_page) ? first_on_page : field_on_page + 1; + if (Field_Is_Selectable(*field_on_page)) + break; + } + while (field != (*field_on_page)); + return (*field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELD* _nc_First_Active_Field(FORM * form) +| +| Description : Get the first active field on the current page, +| if there are such. If there are none, get the first +| visible field on the page. If there are also none, +| we return the first field on page and hope the best. +| +| Return Values : Pointer to calculated field. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELD *) +_nc_First_Active_Field(FORM *form) +{ + FIELD **last_on_page = &form->field[form->page[form->curpage].pmax]; + FIELD *proposed = Next_Field_On_Page(*last_on_page); + + if (proposed == *last_on_page) + { + /* there might be the special situation, where there is no + active and visible field on the current page. We then select + the first visible field on this readonly page + */ + if (Field_Is_Not_Selectable(proposed)) + { + FIELD **field = &form->field[proposed->index]; + FIELD **first = &form->field[form->page[form->curpage].pmin]; + + do + { + field = (field == last_on_page) ? first : field + 1; + if (Field_Has_Option(*field, O_VISIBLE)) + break; + } + while (proposed != (*field)); + + proposed = *field; + + if ((proposed == *last_on_page) && + !((unsigned)proposed->opts & O_VISIBLE)) + { + /* This means, there is also no visible field on the page. + So we propose the first one and hope the very best... + Some very clever user has designed a readonly and invisible + page on this form. + */ + proposed = *first; + } + } + } + return (proposed); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Previous_Field_On_Page(FIELD * field) +| +| Description : Get the previous field before the given field on the +| current page. The order of fields is the one defined by +| the field's array. Only visible and active fields are +| counted. +| +| Return Values : Pointer to the previous field. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD * +Previous_Field_On_Page(FIELD *field) +{ + FORM *form = field->form; + FIELD **field_on_page = &form->field[field->index]; + FIELD **first_on_page = &form->field[form->page[form->curpage].pmin]; + FIELD **last_on_page = &form->field[form->page[form->curpage].pmax]; + + do + { + field_on_page = + (field_on_page == first_on_page) ? last_on_page : field_on_page - 1; + if (Field_Is_Selectable(*field_on_page)) + break; + } + while (field != (*field_on_page)); + + return (*field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Sorted_Next_Field(FIELD * field) +| +| Description : Get the next field after the given field on the current +| page. The order of fields is the one defined by the +| (row,column) geometry, rows are major. +| +| Return Values : Pointer to the next field. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD * +Sorted_Next_Field(FIELD *field) +{ + FIELD *field_on_page = field; + + do + { + field_on_page = field_on_page->snext; + if (Field_Is_Selectable(field_on_page)) + break; + } + while (field_on_page != field); + + return (field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Sorted_Previous_Field(FIELD * field) +| +| Description : Get the previous field before the given field on the +| current page. The order of fields is the one defined +| by the (row,column) geometry, rows are major. +| +| Return Values : Pointer to the previous field. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD * +Sorted_Previous_Field(FIELD *field) +{ + FIELD *field_on_page = field; + + do + { + field_on_page = field_on_page->sprev; + if (Field_Is_Selectable(field_on_page)) + break; + } + while (field_on_page != field); + + return (field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Left_Neighbor_Field(FIELD * field) +| +| Description : Get the left neighbor of the field on the same line +| and the same page. Cycles through the line. +| +| Return Values : Pointer to left neighbor field. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD * +Left_Neighbor_Field(FIELD *field) +{ + FIELD *field_on_page = field; + + /* For a field that has really a left neighbor, the while clause + immediately fails and the loop is left, positioned at the right + neighbor. Otherwise we cycle backwards through the sorted field list + until we enter the same line (from the right end). + */ + do + { + field_on_page = Sorted_Previous_Field(field_on_page); + } + while (field_on_page->frow != field->frow); + + return (field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Right_Neighbor_Field(FIELD * field) +| +| Description : Get the right neighbor of the field on the same line +| and the same page. +| +| Return Values : Pointer to right neighbor field. ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static FIELD * +Right_Neighbor_Field(FIELD *field) +{ + FIELD *field_on_page = field; + + /* See the comments on Left_Neighbor_Field to understand how it works */ + do + { + field_on_page = Sorted_Next_Field(field_on_page); + } + while (field_on_page->frow != field->frow); + + return (field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Upper_Neighbor_Field(FIELD * field) +| +| Description : Because of the row-major nature of sorting the fields, +| it is more difficult to define what the upper neighbor +| field really means. We define that it must be on a +| 'previous' line (cyclic order!) and is the rightmost +| field lying on the left side of the given field. If +| this set is empty, we take the first field on the line. +| +| Return Values : Pointer to the upper neighbor field. ++--------------------------------------------------------------------------*/ +static FIELD * +Upper_Neighbor_Field(FIELD *field) +{ + FIELD *field_on_page = field; + int frow = field->frow; + int fcol = field->fcol; + + /* Walk back to the 'previous' line. The second term in the while clause + just guarantees that we stop if we cycled through the line because + there might be no 'previous' line if the page has just one line. + */ + do + { + field_on_page = Sorted_Previous_Field(field_on_page); + } + while (field_on_page->frow == frow && field_on_page->fcol != fcol); + + if (field_on_page->frow != frow) + { + /* We really found a 'previous' line. We are positioned at the + rightmost field on this line */ + frow = field_on_page->frow; + + /* We walk to the left as long as we are really right of the + field. */ + while (field_on_page->frow == frow && field_on_page->fcol > fcol) + field_on_page = Sorted_Previous_Field(field_on_page); + + /* If we wrapped, just go to the right which is the first field on + the row */ + if (field_on_page->frow != frow) + field_on_page = Sorted_Next_Field(field_on_page); + } + + return (field_on_page); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static FIELD *Down_Neighbor_Field(FIELD * field) +| +| Description : Because of the row-major nature of sorting the fields, +| it is more difficult to define what the down neighbor +| field really means. We define that it must be on a +| 'next' line (cyclic order!) and is the leftmost +| field laying on the right side of the given field. If +| this set is empty, we take the last field on the line. +| +| Return Values : Pointer to the upper neighbor field. ++--------------------------------------------------------------------------*/ +static FIELD * +Down_Neighbor_Field(FIELD *field) +{ + FIELD *field_on_page = field; + int frow = field->frow; + int fcol = field->fcol; + + /* Walk forward to the 'next' line. The second term in the while clause + just guarantees that we stop if we cycled through the line because + there might be no 'next' line if the page has just one line. + */ + do + { + field_on_page = Sorted_Next_Field(field_on_page); + } + while (field_on_page->frow == frow && field_on_page->fcol != fcol); + + if (field_on_page->frow != frow) + { + /* We really found a 'next' line. We are positioned at the rightmost + field on this line */ + frow = field_on_page->frow; + + /* We walk to the right as long as we are really left of the + field. */ + while (field_on_page->frow == frow && field_on_page->fcol < fcol) + field_on_page = Sorted_Next_Field(field_on_page); + + /* If we wrapped, just go to the left which is the last field on + the row */ + if (field_on_page->frow != frow) + field_on_page = Sorted_Previous_Field(field_on_page); + } + + return (field_on_page); +} + +/*---------------------------------------------------------------------------- + Inter-Field Navigation routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Inter_Field_Navigation( +| int (* const fct) (FORM *), +| FORM * form) +| +| Description : Generic behavior for changing the current field, the +| field is left and a new field is entered. So the field +| must be validated and the field init/term hooks must +| be called. +| +| Return Values : E_OK - success +| E_INVALID_FIELD - field is invalid +| some other - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +Inter_Field_Navigation(int (*const fct) (FORM *), FORM *form) +{ + int res; + + if (!_nc_Internal_Validation(form)) + res = E_INVALID_FIELD; + else + { + Call_Hook(form, fieldterm); + res = fct(form); + Call_Hook(form, fieldinit); + } + return res; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Next_Field(FORM * form) +| +| Description : Move to the next field on the current page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Next_Field(FORM *form) +{ + T((T_CALLED("FN_Next_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Next_Field_On_Page(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Previous_Field(FORM * form) +| +| Description : Move to the previous field on the current page of the +| form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Previous_Field(FORM *form) +{ + T((T_CALLED("FN_Previous_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Previous_Field_On_Page(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_First_Field(FORM * form) +| +| Description : Move to the first field on the current page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_First_Field(FORM *form) +{ + T((T_CALLED("FN_First_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Next_Field_On_Page(form->field[form->page[form->curpage].pmax]))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Last_Field(FORM * form) +| +| Description : Move to the last field on the current page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Last_Field(FORM *form) +{ + T((T_CALLED("FN_Last_Field(%p)"), (void *)form)); + returnCode( + _nc_Set_Current_Field(form, + Previous_Field_On_Page(form->field[form->page[form->curpage].pmin]))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Sorted_Next_Field(FORM * form) +| +| Description : Move to the sorted next field on the current page +| of the form. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Sorted_Next_Field(FORM *form) +{ + T((T_CALLED("FN_Sorted_Next_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Sorted_Next_Field(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Sorted_Previous_Field(FORM * form) +| +| Description : Move to the sorted previous field on the current page +| of the form. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Sorted_Previous_Field(FORM *form) +{ + T((T_CALLED("FN_Sorted_Previous_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Sorted_Previous_Field(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Sorted_First_Field(FORM * form) +| +| Description : Move to the sorted first field on the current page +| of the form. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Sorted_First_Field(FORM *form) +{ + T((T_CALLED("FN_Sorted_First_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Sorted_Next_Field(form->field[form->page[form->curpage].smax]))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Sorted_Last_Field(FORM * form) +| +| Description : Move to the sorted last field on the current page +| of the form. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Sorted_Last_Field(FORM *form) +{ + T((T_CALLED("FN_Sorted_Last_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Sorted_Previous_Field(form->field[form->page[form->curpage].smin]))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Left_Field(FORM * form) +| +| Description : Get the field on the left of the current field on the +| same line and the same page. Cycles through the line. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Left_Field(FORM *form) +{ + T((T_CALLED("FN_Left_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Left_Neighbor_Field(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Right_Field(FORM * form) +| +| Description : Get the field on the right of the current field on the +| same line and the same page. Cycles through the line. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Right_Field(FORM *form) +{ + T((T_CALLED("FN_Right_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Right_Neighbor_Field(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Up_Field(FORM * form) +| +| Description : Get the upper neighbor of the current field. This +| cycles through the page. See the comments of the +| Upper_Neighbor_Field function to understand how +| 'upper' is defined. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Up_Field(FORM *form) +{ + T((T_CALLED("FN_Up_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Upper_Neighbor_Field(form->current))); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int FN_Down_Field(FORM * form) +| +| Description : Get the down neighbor of the current field. This +| cycles through the page. See the comments of the +| Down_Neighbor_Field function to understand how +| 'down' is defined. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +FN_Down_Field(FORM *form) +{ + T((T_CALLED("FN_Down_Field(%p)"), (void *)form)); + returnCode(_nc_Set_Current_Field(form, + Down_Neighbor_Field(form->current))); +} +/*---------------------------------------------------------------------------- + END of Field Navigation routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Helper routines for Page Navigation + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_Set_Form_Page(FORM * form, +| int page, +| FIELD * field) +| +| Description : Make the given page number the current page and make +| the given field the current field on the page. If +| for the field NULL is given, make the first field on +| the page the current field. The routine acts only +| if the requested page is not the current page. +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call +| E_BAD_ARGUMENT - invalid field pointer +| E_SYSTEM_ERROR - some severe basic error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +_nc_Set_Form_Page(FORM *form, int page, FIELD *field) +{ + int res = E_OK; + + if ((form->curpage != page)) + { + FIELD *last_field, *field_on_page; + + werase(Get_Form_Window(form)); + form->curpage = (short)page; + last_field = field_on_page = form->field[form->page[page].smin]; + do + { + if ((unsigned)field_on_page->opts & O_VISIBLE) + if ((res = Display_Field(field_on_page)) != E_OK) + return (res); + field_on_page = field_on_page->snext; + } + while (field_on_page != last_field); + + if (field) + res = _nc_Set_Current_Field(form, field); + else + /* N.B.: we don't encapsulate this by Inter_Field_Navigation(), + because this is already executed in a page navigation + context that contains field navigation + */ + res = FN_First_Field(form); + } + return (res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Next_Page_Number(const FORM * form) +| +| Description : Calculate the page number following the current page +| number. This cycles if the highest page number is +| reached. +| +| Return Values : The next page number ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static int +Next_Page_Number(const FORM *form) +{ + return (form->curpage + 1) % form->maxpage; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Previous_Page_Number(const FORM * form) +| +| Description : Calculate the page number before the current page +| number. This cycles if the first page number is +| reached. +| +| Return Values : The previous page number ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static int +Previous_Page_Number(const FORM *form) +{ + return (form->curpage != 0 ? form->curpage - 1 : form->maxpage - 1); +} + +/*---------------------------------------------------------------------------- + Page Navigation routines + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Page_Navigation( +| int (* const fct) (FORM *), +| FORM * form) +| +| Description : Generic behavior for changing a page. This means +| that the field is left and a new field is entered. +| So the field must be validated and the field init/term +| hooks must be called. Because also the page is changed, +| the form's init/term hooks must be called also. +| +| Return Values : E_OK - success +| E_INVALID_FIELD - field is invalid +| some other - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +Page_Navigation(int (*const fct) (FORM *), FORM *form) +{ + int res; + + if (!_nc_Internal_Validation(form)) + res = E_INVALID_FIELD; + else + { + Call_Hook(form, fieldterm); + Call_Hook(form, formterm); + res = fct(form); + Call_Hook(form, forminit); + Call_Hook(form, fieldinit); + } + return res; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int PN_Next_Page(FORM * form) +| +| Description : Move to the next page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +PN_Next_Page(FORM *form) +{ + T((T_CALLED("PN_Next_Page(%p)"), (void *)form)); + returnCode(_nc_Set_Form_Page(form, Next_Page_Number(form), (FIELD *)0)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int PN_Previous_Page(FORM * form) +| +| Description : Move to the previous page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +PN_Previous_Page(FORM *form) +{ + T((T_CALLED("PN_Previous_Page(%p)"), (void *)form)); + returnCode(_nc_Set_Form_Page(form, Previous_Page_Number(form), (FIELD *)0)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int PN_First_Page(FORM * form) +| +| Description : Move to the first page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +PN_First_Page(FORM *form) +{ + T((T_CALLED("PN_First_Page(%p)"), (void *)form)); + returnCode(_nc_Set_Form_Page(form, 0, (FIELD *)0)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int PN_Last_Page(FORM * form) +| +| Description : Move to the last page of the form +| +| Return Values : E_OK - success +| != E_OK - error from subordinate call ++--------------------------------------------------------------------------*/ +static int +PN_Last_Page(FORM *form) +{ + T((T_CALLED("PN_Last_Page(%p)"), (void *)form)); + returnCode(_nc_Set_Form_Page(form, form->maxpage - 1, (FIELD *)0)); +} + +/*---------------------------------------------------------------------------- + END of Field Navigation routines + --------------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------------- + Helper routines for the core form driver. + --------------------------------------------------------------------------*/ + +# if USE_WIDEC_SUPPORT +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Data_Entry_w(FORM * form, wchar_t c) +| +| Description : Enter the wide character c into at the current +| position of the current field of the form. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - driver could not process the request +| E_SYSTEM_ERROR - ++--------------------------------------------------------------------------*/ +static int +Data_Entry_w(FORM *form, wchar_t c) +{ + FIELD *field = form->current; + int result = E_REQUEST_DENIED; + + T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c))); + if ((Field_Has_Option(field, O_EDIT)) +#if FIX_FORM_INACTIVE_BUG + && (Field_Has_Option(field, O_ACTIVE)) +#endif + ) + { + wchar_t given[2]; + cchar_t temp_ch; + + given[0] = c; + given[1] = 0; + setcchar(&temp_ch, given, 0, 0, (void *)0); + if ((Field_Has_Option(field, O_BLANK)) && + First_Position_In_Current_Field(form) && + !(form->status & _FCHECK_REQUIRED) && + !(form->status & _WINDOW_MODIFIED)) + werase(form->w); + + if (form->status & _OVLMODE) + { + wadd_wch(form->w, &temp_ch); + } + else + /* no _OVLMODE */ + { + bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form); + + if (!(There_Is_Room || + ((Single_Line_Field(field) && Growable(field))))) + RETURN(E_REQUEST_DENIED); + + if (!There_Is_Room && !Field_Grown(field, 1)) + RETURN(E_SYSTEM_ERROR); + + wins_wch(form->w, &temp_ch); + } + + if ((result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form)) == E_OK) + { + bool End_Of_Field = (((field->drows - 1) == form->currow) && + ((field->dcols - 1) == form->curcol)); + + form->status |= _WINDOW_MODIFIED; + if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP))) + result = Inter_Field_Navigation(FN_Next_Field, form); + else + { + if (End_Of_Field && Growable(field) && !Field_Grown(field, 1)) + result = E_SYSTEM_ERROR; + else + { + /* + * We have just added a byte to the form field. It may have + * been part of a multibyte character. If it was, the + * addch_used field is nonzero and we should not try to move + * to a new column. + */ + if (WINDOW_EXT(form->w, addch_used) == 0) + IFN_Next_Character(form); + + result = E_OK; + } + } + } + } + RETURN(result); +} +# endif + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Data_Entry(FORM * form,int c) +| +| Description : Enter character c into at the current position of the +| current field of the form. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - driver could not process the request +| E_SYSTEM_ERROR - ++--------------------------------------------------------------------------*/ +static int +Data_Entry(FORM *form, int c) +{ + FIELD *field = form->current; + int result = E_REQUEST_DENIED; + + T((T_CALLED("Data_Entry(%p,%s)"), (void *)form, _tracechtype((chtype)c))); + if ((Field_Has_Option(field, O_EDIT)) +#if FIX_FORM_INACTIVE_BUG + && (Field_Has_Option(field, O_ACTIVE)) +#endif + ) + { + if ((Field_Has_Option(field, O_BLANK)) && + First_Position_In_Current_Field(form) && + !(form->status & _FCHECK_REQUIRED) && + !(form->status & _WINDOW_MODIFIED)) + werase(form->w); + + if (form->status & _OVLMODE) + { + waddch(form->w, (chtype)c); + } + else + /* no _OVLMODE */ + { + bool There_Is_Room = Is_There_Room_For_A_Char_In_Line(form); + + if (!(There_Is_Room || + ((Single_Line_Field(field) && Growable(field))))) + RETURN(E_REQUEST_DENIED); + + if (!There_Is_Room && !Field_Grown(field, 1)) + RETURN(E_SYSTEM_ERROR); + + winsch(form->w, (chtype)c); + } + + if ((result = Wrapping_Not_Necessary_Or_Wrapping_Ok(form)) == E_OK) + { + bool End_Of_Field = (((field->drows - 1) == form->currow) && + ((field->dcols - 1) == form->curcol)); + + if (Field_Has_Option(field, O_EDGE_INSERT_STAY)) + move_after_insert = !!(form->curcol + - form->begincol + - field->cols + + 1); + + SetStatus(form, _WINDOW_MODIFIED); + if (End_Of_Field && !Growable(field) && (Field_Has_Option(field, O_AUTOSKIP))) + result = Inter_Field_Navigation(FN_Next_Field, form); + else + { + if (End_Of_Field && Growable(field) && !Field_Grown(field, 1)) + result = E_SYSTEM_ERROR; + else + { +#if USE_WIDEC_SUPPORT + /* + * We have just added a byte to the form field. It may have + * been part of a multibyte character. If it was, the + * addch_used field is nonzero and we should not try to move + * to a new column. + */ + if (WINDOW_EXT(form->w, addch_used) == 0) + IFN_Next_Character(form); +#else + IFN_Next_Character(form); +#endif + result = E_OK; + } + } + } + } + RETURN(result); +} + +/* Structure to describe the binding of a request code to a function. + The member keycode codes the request value as well as the generic + routine to use for the request. The code for the generic routine + is coded in the upper 16 Bits while the request code is coded in + the lower 16 bits. + + In terms of C++ you might think of a request as a class with a + virtual method "perform". The different types of request are + derived from this base class and overload (or not) the base class + implementation of perform. +*/ +typedef struct +{ + int keycode; /* must be at least 32 bit: hi:mode, lo: key */ + int (*cmd) (FORM *); /* low level driver routine for this key */ +} +Binding_Info; + +/* You may see this is the class-id of the request type class */ +#define ID_PN (0x00000000) /* Page navigation */ +#define ID_FN (0x00010000) /* Inter-Field navigation */ +#define ID_IFN (0x00020000) /* Intra-Field navigation */ +#define ID_VSC (0x00030000) /* Vertical Scrolling */ +#define ID_HSC (0x00040000) /* Horizontal Scrolling */ +#define ID_FE (0x00050000) /* Field Editing */ +#define ID_EM (0x00060000) /* Edit Mode */ +#define ID_FV (0x00070000) /* Field Validation */ +#define ID_CH (0x00080000) /* Choice */ +#define ID_Mask (0xffff0000) +#define Key_Mask (0x0000ffff) +#define ID_Shft (16) + +/* This array holds all the Binding Infos */ +/* *INDENT-OFF* */ +static const Binding_Info bindings[MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1] = +{ + { REQ_NEXT_PAGE |ID_PN ,PN_Next_Page}, + { REQ_PREV_PAGE |ID_PN ,PN_Previous_Page}, + { REQ_FIRST_PAGE |ID_PN ,PN_First_Page}, + { REQ_LAST_PAGE |ID_PN ,PN_Last_Page}, + + { REQ_NEXT_FIELD |ID_FN ,FN_Next_Field}, + { REQ_PREV_FIELD |ID_FN ,FN_Previous_Field}, + { REQ_FIRST_FIELD |ID_FN ,FN_First_Field}, + { REQ_LAST_FIELD |ID_FN ,FN_Last_Field}, + { REQ_SNEXT_FIELD |ID_FN ,FN_Sorted_Next_Field}, + { REQ_SPREV_FIELD |ID_FN ,FN_Sorted_Previous_Field}, + { REQ_SFIRST_FIELD |ID_FN ,FN_Sorted_First_Field}, + { REQ_SLAST_FIELD |ID_FN ,FN_Sorted_Last_Field}, + { REQ_LEFT_FIELD |ID_FN ,FN_Left_Field}, + { REQ_RIGHT_FIELD |ID_FN ,FN_Right_Field}, + { REQ_UP_FIELD |ID_FN ,FN_Up_Field}, + { REQ_DOWN_FIELD |ID_FN ,FN_Down_Field}, + + { REQ_NEXT_CHAR |ID_IFN ,IFN_Next_Character}, + { REQ_PREV_CHAR |ID_IFN ,IFN_Previous_Character}, + { REQ_NEXT_LINE |ID_IFN ,IFN_Next_Line}, + { REQ_PREV_LINE |ID_IFN ,IFN_Previous_Line}, + { REQ_NEXT_WORD |ID_IFN ,IFN_Next_Word}, + { REQ_PREV_WORD |ID_IFN ,IFN_Previous_Word}, + { REQ_BEG_FIELD |ID_IFN ,IFN_Beginning_Of_Field}, + { REQ_END_FIELD |ID_IFN ,IFN_End_Of_Field}, + { REQ_BEG_LINE |ID_IFN ,IFN_Beginning_Of_Line}, + { REQ_END_LINE |ID_IFN ,IFN_End_Of_Line}, + { REQ_LEFT_CHAR |ID_IFN ,IFN_Left_Character}, + { REQ_RIGHT_CHAR |ID_IFN ,IFN_Right_Character}, + { REQ_UP_CHAR |ID_IFN ,IFN_Up_Character}, + { REQ_DOWN_CHAR |ID_IFN ,IFN_Down_Character}, + + { REQ_NEW_LINE |ID_FE ,FE_New_Line}, + { REQ_INS_CHAR |ID_FE ,FE_Insert_Character}, + { REQ_INS_LINE |ID_FE ,FE_Insert_Line}, + { REQ_DEL_CHAR |ID_FE ,FE_Delete_Character}, + { REQ_DEL_PREV |ID_FE ,FE_Delete_Previous}, + { REQ_DEL_LINE |ID_FE ,FE_Delete_Line}, + { REQ_DEL_WORD |ID_FE ,FE_Delete_Word}, + { REQ_CLR_EOL |ID_FE ,FE_Clear_To_End_Of_Line}, + { REQ_CLR_EOF |ID_FE ,FE_Clear_To_End_Of_Field}, + { REQ_CLR_FIELD |ID_FE ,FE_Clear_Field}, + + { REQ_OVL_MODE |ID_EM ,EM_Overlay_Mode}, + { REQ_INS_MODE |ID_EM ,EM_Insert_Mode}, + + { REQ_SCR_FLINE |ID_VSC ,VSC_Scroll_Line_Forward}, + { REQ_SCR_BLINE |ID_VSC ,VSC_Scroll_Line_Backward}, + { REQ_SCR_FPAGE |ID_VSC ,VSC_Scroll_Page_Forward}, + { REQ_SCR_BPAGE |ID_VSC ,VSC_Scroll_Page_Backward}, + { REQ_SCR_FHPAGE |ID_VSC ,VSC_Scroll_Half_Page_Forward}, + { REQ_SCR_BHPAGE |ID_VSC ,VSC_Scroll_Half_Page_Backward}, + + { REQ_SCR_FCHAR |ID_HSC ,HSC_Scroll_Char_Forward}, + { REQ_SCR_BCHAR |ID_HSC ,HSC_Scroll_Char_Backward}, + { REQ_SCR_HFLINE |ID_HSC ,HSC_Horizontal_Line_Forward}, + { REQ_SCR_HBLINE |ID_HSC ,HSC_Horizontal_Line_Backward}, + { REQ_SCR_HFHALF |ID_HSC ,HSC_Horizontal_Half_Line_Forward}, + { REQ_SCR_HBHALF |ID_HSC ,HSC_Horizontal_Half_Line_Backward}, + + { REQ_VALIDATION |ID_FV ,FV_Validation}, + + { REQ_NEXT_CHOICE |ID_CH ,CR_Next_Choice}, + { REQ_PREV_CHOICE |ID_CH ,CR_Previous_Choice} +}; +/* *INDENT-ON* */ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int form_driver(FORM * form,int c) +| +| Description : This is the workhorse of the forms system. It checks +| to determine whether the character c is a request or +| data. If it is a request, the form driver executes +| the request and returns the result. If it is data +| (printable character), it enters the data into the +| current position in the current field. If it is not +| recognized, the form driver assumes it is an application +| defined command and returns E_UNKNOWN_COMMAND. +| Application defined command should be defined relative +| to MAX_FORM_COMMAND, the maximum value of a request. +| +| Return Values : E_OK - success +| E_SYSTEM_ERROR - system error +| E_BAD_ARGUMENT - an argument is incorrect +| E_NOT_POSTED - form is not posted +| E_INVALID_FIELD - field contents are invalid +| E_BAD_STATE - called from inside a hook routine +| E_REQUEST_DENIED - request failed +| E_NOT_CONNECTED - no fields are connected to the form +| E_UNKNOWN_COMMAND - command not known ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +form_driver(FORM *form, int c) +{ + const Binding_Info *BI = (Binding_Info *)0; + int res = E_UNKNOWN_COMMAND; + + move_after_insert = TRUE; + + T((T_CALLED("form_driver(%p,%d)"), (void *)form, c)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (!(form->field) || !(form->current)) + RETURN(E_NOT_CONNECTED); + + assert(form->page); + + if (c == FIRST_ACTIVE_MAGIC) + { + form->current = _nc_First_Active_Field(form); + RETURN(E_OK); + } + + assert(form->current && + form->current->buf && + (form->current->form == form) + ); + + if (form->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + if (!(form->status & _POSTED)) + RETURN(E_NOT_POSTED); + + if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) && + ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c)) + { + TR(TRACE_CALLS, ("form_request %s", form_request_name(c))); + BI = &(bindings[c - MIN_FORM_COMMAND]); + } + + if (BI) + { + typedef int (*Generic_Method) (int (*const) (FORM *), FORM *); + static const Generic_Method Generic_Methods[] = + { + Page_Navigation, /* overloaded to call field&form hooks */ + Inter_Field_Navigation, /* overloaded to call field hooks */ + NULL, /* Intra-Field is generic */ + Vertical_Scrolling, /* Overloaded to check multi-line */ + Horizontal_Scrolling, /* Overloaded to check single-line */ + Field_Editing, /* Overloaded to mark modification */ + NULL, /* Edit Mode is generic */ + NULL, /* Field Validation is generic */ + NULL /* Choice Request is generic */ + }; + size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0])); + size_t method = (size_t)((BI->keycode >> ID_Shft) & 0xffff); /* see ID_Mask */ + + if ((method >= nMethods) || !(BI->cmd)) + res = E_SYSTEM_ERROR; + else + { + Generic_Method fct = Generic_Methods[method]; + + if (fct) + { + res = fct(BI->cmd, form); + } + else + { + res = (BI->cmd) (form); + } + } + } +#ifdef NCURSES_MOUSE_VERSION + else if (KEY_MOUSE == c) + { + MEVENT event; + WINDOW *win = form->win ? form->win : StdScreen(Get_Form_Screen(form)); + const WINDOW *sub = form->sub ? form->sub : win; + + getmouse(&event); + if ((event.bstate & (BUTTON1_CLICKED | + BUTTON1_DOUBLE_CLICKED | + BUTTON1_TRIPLE_CLICKED)) + && wenclose(win, event.y, event.x)) + { /* we react only if the click was in the userwin, that means + * inside the form display area or at the decoration window. + */ + int ry = event.y, rx = event.x; /* screen coordinates */ + + res = E_REQUEST_DENIED; + if (mouse_trafo(&ry, &rx, FALSE)) + { /* rx, ry are now "curses" coordinates */ + if (ry < sub->_begy) + { /* we clicked above the display region; this is + * interpreted as "scroll up" request + */ + if (event.bstate & BUTTON1_CLICKED) + res = form_driver(form, REQ_PREV_FIELD); + else if (event.bstate & BUTTON1_DOUBLE_CLICKED) + res = form_driver(form, REQ_PREV_PAGE); + else if (event.bstate & BUTTON1_TRIPLE_CLICKED) + res = form_driver(form, REQ_FIRST_FIELD); + } + else if (ry > sub->_begy + sub->_maxy) + { /* we clicked below the display region; this is + * interpreted as "scroll down" request + */ + if (event.bstate & BUTTON1_CLICKED) + res = form_driver(form, REQ_NEXT_FIELD); + else if (event.bstate & BUTTON1_DOUBLE_CLICKED) + res = form_driver(form, REQ_NEXT_PAGE); + else if (event.bstate & BUTTON1_TRIPLE_CLICKED) + res = form_driver(form, REQ_LAST_FIELD); + } + else if (wenclose(sub, event.y, event.x)) + { /* Inside the area we try to find the hit item */ + ry = event.y; + rx = event.x; + if (wmouse_trafo(sub, &ry, &rx, FALSE)) + { + int min_field = form->page[form->curpage].pmin; + int max_field = form->page[form->curpage].pmax; + int i; + + for (i = min_field; i <= max_field; ++i) + { + FIELD *field = form->field[i]; + + if (Field_Is_Selectable(field) + && Field_encloses(field, ry, rx) == E_OK) + { + res = _nc_Set_Current_Field(form, field); + if (res == E_OK) + res = _nc_Position_Form_Cursor(form); + if (res == E_OK + && (event.bstate & BUTTON1_DOUBLE_CLICKED)) + res = E_UNKNOWN_COMMAND; + break; + } + } + } + } + } + } + else + res = E_REQUEST_DENIED; + } +#endif /* NCURSES_MOUSE_VERSION */ + else if (!(c & (~(int)MAX_REGULAR_CHARACTER))) + { + /* + * If we're using 8-bit characters, iscntrl+isprint cover the whole set. + * But with multibyte characters, there is a third possibility, i.e., + * parts of characters that build up into printable characters which are + * not considered printable. + * + * FIXME: the wide-character branch should also use Check_Char(). + */ +#if USE_WIDEC_SUPPORT + if (!iscntrl(UChar(c))) +#else + if (isprint(UChar(c)) && + Check_Char(form, form->current, form->current->type, c, + (TypeArgument *)(form->current->arg))) +#endif + res = Data_Entry(form, c); + } + _nc_Refresh_Current_Field(form); + RETURN(res); +} + +# if USE_WIDEC_SUPPORT +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int form_driver_w(FORM * form,int type,wchar_t c) +| +| Description : This is the workhorse of the forms system. +| +| Input is either a key code (request) or a wide char +| returned by e.g. get_wch (). The type must be passed +| as well,so that we are able to determine whether the char +| is a multibyte char or a request. + +| If it is a request, the form driver executes +| the request and returns the result. If it is data +| (printable character), it enters the data into the +| current position in the current field. If it is not +| recognized, the form driver assumes it is an application +| defined command and returns E_UNKNOWN_COMMAND. +| Application defined command should be defined relative +| to MAX_FORM_COMMAND, the maximum value of a request. +| +| Return Values : E_OK - success +| E_SYSTEM_ERROR - system error +| E_BAD_ARGUMENT - an argument is incorrect +| E_NOT_POSTED - form is not posted +| E_INVALID_FIELD - field contents are invalid +| E_BAD_STATE - called from inside a hook routine +| E_REQUEST_DENIED - request failed +| E_NOT_CONNECTED - no fields are connected to the form +| E_UNKNOWN_COMMAND - command not known ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +form_driver_w(FORM *form, int type, wchar_t c) +{ + const Binding_Info *BI = (Binding_Info *)0; + int res = E_UNKNOWN_COMMAND; + + T((T_CALLED("form_driver(%p,%d)"), (void *)form, (int)c)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (!(form->field)) + RETURN(E_NOT_CONNECTED); + + assert(form->page); + + if (c == (wchar_t)FIRST_ACTIVE_MAGIC) + { + form->current = _nc_First_Active_Field(form); + RETURN(E_OK); + } + + assert(form->current && + form->current->buf && + (form->current->form == form) + ); + + if (form->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + if (!(form->status & _POSTED)) + RETURN(E_NOT_POSTED); + + /* check if this is a keycode or a (wide) char */ + if (type == KEY_CODE_YES) + { + if ((c >= MIN_FORM_COMMAND && c <= MAX_FORM_COMMAND) && + ((bindings[c - MIN_FORM_COMMAND].keycode & Key_Mask) == c)) + BI = &(bindings[c - MIN_FORM_COMMAND]); + } + + if (BI) + { + typedef int (*Generic_Method) (int (*const) (FORM *), FORM *); + static const Generic_Method Generic_Methods[] = + { + Page_Navigation, /* overloaded to call field&form hooks */ + Inter_Field_Navigation, /* overloaded to call field hooks */ + NULL, /* Intra-Field is generic */ + Vertical_Scrolling, /* Overloaded to check multi-line */ + Horizontal_Scrolling, /* Overloaded to check single-line */ + Field_Editing, /* Overloaded to mark modification */ + NULL, /* Edit Mode is generic */ + NULL, /* Field Validation is generic */ + NULL /* Choice Request is generic */ + }; + size_t nMethods = (sizeof(Generic_Methods) / sizeof(Generic_Methods[0])); + size_t method = (size_t)(BI->keycode >> ID_Shft) & 0xffff; /* see ID_Mask */ + + if ((method >= nMethods) || !(BI->cmd)) + res = E_SYSTEM_ERROR; + else + { + Generic_Method fct = Generic_Methods[method]; + + if (fct) + res = fct(BI->cmd, form); + else + res = (BI->cmd) (form); + } + } +#ifdef NCURSES_MOUSE_VERSION + else if (KEY_MOUSE == c) + { + MEVENT event; + WINDOW *win = form->win ? form->win : StdScreen(Get_Form_Screen(form)); + const WINDOW *sub = form->sub ? form->sub : win; + + getmouse(&event); + if ((event.bstate & (BUTTON1_CLICKED | + BUTTON1_DOUBLE_CLICKED | + BUTTON1_TRIPLE_CLICKED)) + && wenclose(win, event.y, event.x)) + { /* we react only if the click was in the userwin, that means + * inside the form display area or at the decoration window. + */ + int ry = event.y, rx = event.x; /* screen coordinates */ + + res = E_REQUEST_DENIED; + if (mouse_trafo(&ry, &rx, FALSE)) + { /* rx, ry are now "curses" coordinates */ + if (ry < sub->_begy) + { /* we clicked above the display region; this is + * interpreted as "scroll up" request + */ + if (event.bstate & BUTTON1_CLICKED) + res = form_driver(form, REQ_PREV_FIELD); + else if (event.bstate & BUTTON1_DOUBLE_CLICKED) + res = form_driver(form, REQ_PREV_PAGE); + else if (event.bstate & BUTTON1_TRIPLE_CLICKED) + res = form_driver(form, REQ_FIRST_FIELD); + } + else if (ry > sub->_begy + sub->_maxy) + { /* we clicked below the display region; this is + * interpreted as "scroll down" request + */ + if (event.bstate & BUTTON1_CLICKED) + res = form_driver(form, REQ_NEXT_FIELD); + else if (event.bstate & BUTTON1_DOUBLE_CLICKED) + res = form_driver(form, REQ_NEXT_PAGE); + else if (event.bstate & BUTTON1_TRIPLE_CLICKED) + res = form_driver(form, REQ_LAST_FIELD); + } + else if (wenclose(sub, event.y, event.x)) + { /* Inside the area we try to find the hit item */ + ry = event.y; + rx = event.x; + if (wmouse_trafo(sub, &ry, &rx, FALSE)) + { + int min_field = form->page[form->curpage].pmin; + int max_field = form->page[form->curpage].pmax; + int i; + + for (i = min_field; i <= max_field; ++i) + { + FIELD *field = form->field[i]; + + if (Field_Is_Selectable(field) + && Field_encloses(field, ry, rx) == E_OK) + { + res = _nc_Set_Current_Field(form, field); + if (res == E_OK) + res = _nc_Position_Form_Cursor(form); + if (res == E_OK + && (event.bstate & BUTTON1_DOUBLE_CLICKED)) + res = E_UNKNOWN_COMMAND; + break; + } + } + } + } + } + } + else + res = E_REQUEST_DENIED; + } +#endif /* NCURSES_MOUSE_VERSION */ + else if (type == OK) + { + res = Data_Entry_w(form, c); + } + + _nc_Refresh_Current_Field(form); + RETURN(res); +} +# endif /* USE_WIDEC_SUPPORT */ + +/*---------------------------------------------------------------------------- + Field-Buffer manipulation routines. + The effects of setting a buffer are tightly coupled to the core of the form + driver logic. This is especially true in the case of growable fields. + So I don't separate this into a separate module. + --------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_buffer(FIELD *field, +| int buffer, char *value) +| +| Description : Set the given buffer of the field to the given value. +| Buffer 0 stores the displayed content of the field. +| For dynamic fields this may grow the fieldbuffers if +| the length of the value exceeds the current buffer +| length. For buffer 0 only printable values are allowed. +| For static fields, the value must not be zero terminated. +| It is copied up to the length of the buffer. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid argument +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_field_buffer(FIELD *field, int buffer, const char *value) +{ + FIELD_CELL *p; + int res = E_OK; + int i; + int len; + +#if USE_WIDEC_SUPPORT + FIELD_CELL *widevalue = 0; +#endif + + T((T_CALLED("set_field_buffer(%p,%d,%s)"), (void *)field, buffer, _nc_visbuf(value))); + + if (!field || !value || ((buffer < 0) || (buffer > field->nbuf))) + RETURN(E_BAD_ARGUMENT); + + len = Buffer_Length(field); + + if (Growable(field)) + { + /* for a growable field we must assume zero terminated strings, because + somehow we have to detect the length of what should be copied. + */ + int vlen = (int)strlen(value); + + if (vlen > len) + { + if (!Field_Grown(field, + (int)(1 + (vlen - len) / ((field->rows + field->nrow) + * field->cols)))) + RETURN(E_SYSTEM_ERROR); + +#if !USE_WIDEC_SUPPORT + len = vlen; +#endif + } + } + + p = Address_Of_Nth_Buffer(field, buffer); + +#if USE_WIDEC_SUPPORT + /* + * Use addstr's logic for converting a string to an array of cchar_t's. + * There should be a better way, but this handles nonspacing characters + * and other special cases that we really do not want to handle here. + */ +#if NCURSES_EXT_FUNCS + if (wresize(field->working, 1, Buffer_Length(field) + 1) == ERR) +#endif + { + delwin(field->working); + field->working = newpad(1, Buffer_Length(field) + 1); + } + len = Buffer_Length(field); + wclear(field->working); + (void)mvwaddstr(field->working, 0, 0, value); + + if ((widevalue = typeCalloc(FIELD_CELL, len + 1)) == 0) + { + RETURN(E_SYSTEM_ERROR); + } + else + { + for (i = 0; i < field->drows; ++i) + { + (void)mvwin_wchnstr(field->working, 0, (int)i * field->dcols, + widevalue + ((int)i * field->dcols), + field->dcols); + } + for (i = 0; i < len; ++i) + { + if (CharEq(myZEROS, widevalue[i])) + { + while (i < len) + p[i++] = myBLANK; + break; + } + p[i] = widevalue[i]; + } + free(widevalue); + } +#else + for (i = 0; i < len; ++i) + { + if (value[i] == '\0') + { + while (i < len) + p[i++] = myBLANK; + break; + } + p[i] = value[i]; + } +#endif + + if (buffer == 0) + { + int syncres; + + if (((syncres = Synchronize_Field(field)) != E_OK) && + (res == E_OK)) + res = syncres; + if (((syncres = Synchronize_Linked_Fields(field)) != E_OK) && + (res == E_OK)) + res = syncres; + } + RETURN(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : char *field_buffer(const FIELD *field,int buffer) +| +| Description : Return the address of the buffer for the field. +| +| Return Values : Pointer to buffer or NULL if arguments were invalid. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(char *) +field_buffer(const FIELD *field, int buffer) +{ + char *result = 0; + + T((T_CALLED("field_buffer(%p,%d)"), (const void *)field, buffer)); + + if (field && (buffer >= 0) && (buffer <= field->nbuf)) + { +#if USE_WIDEC_SUPPORT + FIELD_CELL *data = Address_Of_Nth_Buffer(field, buffer); + size_t need = 0; + int size = Buffer_Length(field); + int n; + + /* determine the number of bytes needed to store the expanded string */ + for (n = 0; n < size; ++n) + { + if (!isWidecExt(data[n]) && data[n].chars[0] != L'\0') + { + mbstate_t state; + size_t next; + + init_mb(state); + next = _nc_wcrtomb(0, data[n].chars[0], &state); + if (next > 0) + need += next; + } + } + + /* allocate a place to store the expanded string */ + if (field->expanded[buffer] != 0) + free(field->expanded[buffer]); + field->expanded[buffer] = typeMalloc(char, need + 1); + + /* + * Expand the multibyte data. + * + * It may also be multi-column data. In that case, the data for a row + * may be null-padded to align to the dcols/drows layout (or it may + * contain embedded wide-character extensions). Change the null-padding + * to blanks as needed. + */ + if ((result = field->expanded[buffer]) != 0) + { + wclear(field->working); + wmove(field->working, 0, 0); + for (n = 0; n < size; ++n) + { + if (!isWidecExt(data[n]) && data[n].chars[0] != L'\0') + wadd_wch(field->working, &data[n]); + } + wmove(field->working, 0, 0); + winnstr(field->working, result, (int)need); + } +#else + result = Address_Of_Nth_Buffer(field, buffer); +#endif + } + returnPtr(result); +} + +#if USE_WIDEC_SUPPORT + +/*--------------------------------------------------------------------------- +| Convert a multibyte string to a wide-character string. The result must be +| freed by the caller. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(wchar_t *) +_nc_Widen_String(char *source, int *lengthp) +{ + wchar_t *result = 0; + wchar_t wch = 0; + size_t given = strlen(source); + size_t tries; + int pass; + int status; + +#ifndef state_unused + mbstate_t state; +#endif + + for (pass = 0; pass < 2; ++pass) + { + unsigned need = 0; + size_t passed = 0; + + while (passed < given) + { + bool found = FALSE; + + for (tries = 1, status = 0; tries <= (given - passed); ++tries) + { + int save = source[passed + tries]; + + source[passed + tries] = 0; + reset_mbytes(state); + status = check_mbytes(wch, source + passed, tries, state); + source[passed + tries] = (char)save; + + if (status > 0) + { + found = TRUE; + break; + } + } + if (found) + { + if (pass) + { + result[need] = wch; + } + passed += (size_t)status; + ++need; + } + else + { + if (pass) + { + result[need] = (wchar_t)source[passed]; + } + ++need; + ++passed; + } + } + + if (!pass) + { + if (!need) + break; + result = typeCalloc(wchar_t, need); + + *lengthp = (int)need; + if (result == 0) + break; + } + } + + return result; +} +#endif + +/* frm_driver.c ends here */ diff --git a/contrib/ncurses/form/frm_hook.c b/contrib/ncurses/form/frm_hook.c new file mode 100644 index 00000000..39d4d22f --- /dev/null +++ b/contrib/ncurses/form/frm_hook.c @@ -0,0 +1,144 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_hook.c,v 1.20 2020/05/24 01:40:20 anonymous.maarten Exp $") + +/* "Template" macro to generate function to set application specific hook */ +#define GEN_HOOK_SET_FUNCTION( typ, name ) \ +FORM_IMPEXP int NCURSES_API set_ ## typ ## _ ## name (FORM *form, Form_Hook func)\ +{\ + TR_FUNC_BFR(1); \ + T((T_CALLED("set_" #typ"_"#name"(%p,%s)"), (void *) form, TR_FUNC_ARG(0, func)));\ + (Normalize_Form( form ) -> typ ## name) = func ;\ + RETURN(E_OK);\ +} + +/* "Template" macro to generate function to get application specific hook */ +#define GEN_HOOK_GET_FUNCTION( typ, name ) \ +FORM_IMPEXP Form_Hook NCURSES_API typ ## _ ## name ( const FORM *form )\ +{\ + T((T_CALLED(#typ "_" #name "(%p)"), (const void *) form));\ + returnFormHook( Normalize_Form( form ) -> typ ## name );\ +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_init(FORM *form, Form_Hook f) +| +| Description : Assigns an application defined initialization function +| to be called when the form is posted and just after +| the current field changes. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(field, init) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : Form_Hook field_init(const FORM *form) +| +| Description : Retrieve field initialization routine address. +| +| Return Values : The address or NULL if no hook defined. ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(field, init) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_field_term(FORM *form, Form_Hook f) +| +| Description : Assigns an application defined finalization function +| to be called when the form is unposted and just before +| the current field changes. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(field, term) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : Form_Hook field_term(const FORM *form) +| +| Description : Retrieve field finalization routine address. +| +| Return Values : The address or NULL if no hook defined. ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(field, term) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_init(FORM *form, Form_Hook f) +| +| Description : Assigns an application defined initialization function +| to be called when the form is posted and just after +| a page change. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(form, init) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : Form_Hook form_init(const FORM *form) +| +| Description : Retrieve form initialization routine address. +| +| Return Values : The address or NULL if no hook defined. ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(form, init) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_term(FORM *form, Form_Hook f) +| +| Description : Assigns an application defined finalization function +| to be called when the form is unposted and just before +| a page change. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(form, term) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : Form_Hook form_term(const FORM *form) +| +| Description : Retrieve form finalization routine address. +| +| Return Values : The address or NULL if no hook defined. ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(form, term) + +/* frm_hook.c ends here */ diff --git a/contrib/ncurses/form/frm_opts.c b/contrib/ncurses/form/frm_opts.c new file mode 100644 index 00000000..62e2bebd --- /dev/null +++ b/contrib/ncurses/form/frm_opts.c @@ -0,0 +1,128 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_opts.c,v 1.21 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_opts(FORM *form, Form_Options opts) +| +| Description : Turns on the named options and turns off all the +| remaining options for that form. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid options ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_form_opts(FORM *form, Form_Options opts) +{ + T((T_CALLED("set_form_opts(%p,%d)"), (void *)form, opts)); + + opts &= (Form_Options)ALL_FORM_OPTS; + if ((unsigned)opts & ~ALL_FORM_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Form(form)->opts = opts; + RETURN(E_OK); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : Form_Options form_opts(const FORM *) +| +| Description : Retrieves the current form options. +| +| Return Values : The option flags. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(Form_Options) +form_opts(const FORM *form) +{ + T((T_CALLED("form_opts(%p)"), (const void *)form)); + returnCode((Form_Options)((unsigned)Normalize_Form(form)->opts & ALL_FORM_OPTS)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int form_opts_on(FORM *form, Form_Options opts) +| +| Description : Turns on the named options; no other options are +| changed. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid options ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +form_opts_on(FORM *form, Form_Options opts) +{ + T((T_CALLED("form_opts_on(%p,%d)"), (void *)form, opts)); + + opts &= (Form_Options)ALL_FORM_OPTS; + if ((unsigned)opts & ~ALL_FORM_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Form(form)->opts |= opts; + RETURN(E_OK); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int form_opts_off(FORM *form, Form_Options opts) +| +| Description : Turns off the named options; no other options are +| changed. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid options ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +form_opts_off(FORM *form, Form_Options opts) +{ + T((T_CALLED("form_opts_off(%p,%d)"), (void *)form, opts)); + + opts &= (Form_Options)ALL_FORM_OPTS; + if ((unsigned)opts & ~ALL_FORM_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Form(form)->opts &= ~opts; + RETURN(E_OK); + } +} + +/* frm_opts.c ends here */ diff --git a/contrib/ncurses/form/frm_page.c b/contrib/ncurses/form/frm_page.c new file mode 100644 index 00000000..ee8dd383 --- /dev/null +++ b/contrib/ncurses/form/frm_page.c @@ -0,0 +1,107 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_page.c,v 1.15 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_page(FORM * form,int page) +| +| Description : Set the page number of the form. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form pointer or page number +| E_BAD_STATE - called from a hook routine +| E_INVALID_FIELD - current field can't be left +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_form_page(FORM *form, int page) +{ + int err = E_OK; + + T((T_CALLED("set_form_page(%p,%d)"), (void *)form, page)); + + if (!form || (page < 0) || (page >= form->maxpage)) + RETURN(E_BAD_ARGUMENT); + + if (!(form->status & _POSTED)) + { + form->curpage = (short)page; + form->current = _nc_First_Active_Field(form); + } + else + { + if (form->status & _IN_DRIVER) + err = E_BAD_STATE; + else + { + if (form->curpage != page) + { + if (!_nc_Internal_Validation(form)) + err = E_INVALID_FIELD; + else + { + Call_Hook(form, fieldterm); + Call_Hook(form, formterm); + err = _nc_Set_Form_Page(form, page, (FIELD *)0); + Call_Hook(form, forminit); + Call_Hook(form, fieldinit); + _nc_Refresh_Current_Field(form); + } + } + } + } + RETURN(err); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int form_page(const FORM * form) +| +| Description : Return the current page of the form. +| +| Return Values : >= 0 : current page number +| -1 : invalid form pointer ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +form_page(const FORM *form) +{ + T((T_CALLED("form_page(%p)"), (const void *)form)); + + returnCode(Normalize_Form(form)->curpage); +} + +/* frm_page.c ends here */ diff --git a/contrib/ncurses/form/frm_post.c b/contrib/ncurses/form/frm_post.c new file mode 100644 index 00000000..a4f4f7d3 --- /dev/null +++ b/contrib/ncurses/form/frm_post.c @@ -0,0 +1,125 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_post.c,v 1.15 2024/07/27 18:35:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int post_form(FORM * form) +| +| Description : Writes the form into its associated subwindow. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form pointer +| E_POSTED - form already posted +| E_NOT_CONNECTED - no fields connected to form +| E_NO_ROOM - form doesn't fit into subwindow +| E_SYSTEM_ERROR - system error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +post_form(FORM *form) +{ + const WINDOW *formwin; + int err; + int page; + + T((T_CALLED("post_form(%p)"), (void *)form)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (form->status & _POSTED) + RETURN(E_POSTED); + + if (!(form->field)) + RETURN(E_NOT_CONNECTED); + + formwin = Get_Form_Window(form); + if ((form->cols > getmaxx(formwin)) || (form->rows > getmaxy(formwin))) + RETURN(E_NO_ROOM); + + /* reset form->curpage to an invalid value. This forces Set_Form_Page + to do the page initialization which is required by post_form. + */ + page = form->curpage; + form->curpage = -1; + if ((err = _nc_Set_Form_Page(form, page, form->current)) != E_OK) + RETURN(err); + + SetStatus(form, _POSTED); + + Call_Hook(form, forminit); + Call_Hook(form, fieldinit); + + _nc_Refresh_Current_Field(form); + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int unpost_form(FORM * form) +| +| Description : Erase form from its associated subwindow. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid form pointer +| E_NOT_POSTED - form isn't posted +| E_BAD_STATE - called from a hook routine ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +unpost_form(FORM *form) +{ + T((T_CALLED("unpost_form(%p)"), (void *)form)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (!(form->status & _POSTED)) + RETURN(E_NOT_POSTED); + + if (form->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + Call_Hook(form, fieldterm); + Call_Hook(form, formterm); + + werase(Get_Form_Window(form)); + delwin(form->w); + form->w = (WINDOW *)0; + ClrStatus(form, _POSTED); + RETURN(E_OK); +} + +/* frm_post.c ends here */ diff --git a/contrib/ncurses/form/frm_req_name.c b/contrib/ncurses/form/frm_req_name.c new file mode 100644 index 00000000..8b76a8e4 --- /dev/null +++ b/contrib/ncurses/form/frm_req_name.c @@ -0,0 +1,179 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module form_request_name * +* Routines to handle external names of menu requests * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_req_name.c,v 1.23 2021/06/17 21:11:08 tom Exp $") + +#define DATA(s) { s } + +static const char request_names[MAX_FORM_COMMAND - MIN_FORM_COMMAND + 1][13] = +{ + DATA("NEXT_PAGE"), + DATA("PREV_PAGE"), + DATA("FIRST_PAGE"), + DATA("LAST_PAGE"), + + DATA("NEXT_FIELD"), + DATA("PREV_FIELD"), + DATA("FIRST_FIELD"), + DATA("LAST_FIELD"), + DATA("SNEXT_FIELD"), + DATA("SPREV_FIELD"), + DATA("SFIRST_FIELD"), + DATA("SLAST_FIELD"), + DATA("LEFT_FIELD"), + DATA("RIGHT_FIELD"), + DATA("UP_FIELD"), + DATA("DOWN_FIELD"), + + DATA("NEXT_CHAR"), + DATA("PREV_CHAR"), + DATA("NEXT_LINE"), + DATA("PREV_LINE"), + DATA("NEXT_WORD"), + DATA("PREV_WORD"), + DATA("BEG_FIELD"), + DATA("END_FIELD"), + DATA("BEG_LINE"), + DATA("END_LINE"), + DATA("LEFT_CHAR"), + DATA("RIGHT_CHAR"), + DATA("UP_CHAR"), + DATA("DOWN_CHAR"), + + DATA("NEW_LINE"), + DATA("INS_CHAR"), + DATA("INS_LINE"), + DATA("DEL_CHAR"), + DATA("DEL_PREV"), + DATA("DEL_LINE"), + DATA("DEL_WORD"), + DATA("CLR_EOL"), + DATA("CLR_EOF"), + DATA("CLR_FIELD"), + DATA("OVL_MODE"), + DATA("INS_MODE"), + DATA("SCR_FLINE"), + DATA("SCR_BLINE"), + DATA("SCR_FPAGE"), + DATA("SCR_BPAGE"), + DATA("SCR_FHPAGE"), + DATA("SCR_BHPAGE"), + DATA("SCR_FCHAR"), + DATA("SCR_BCHAR"), + DATA("SCR_HFLINE"), + DATA("SCR_HBLINE"), + DATA("SCR_HFHALF"), + DATA("SCR_HBHALF"), + + DATA("VALIDATION"), + DATA("NEXT_CHOICE"), + DATA("PREV_CHOICE") +}; + +#undef DATA + +#define A_SIZE (sizeof(request_names)/sizeof(request_names[0])) + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : const char * form_request_name (int request); +| +| Description : Get the external name of a form request. +| +| Return Values : Pointer to name - on success +| NULL - on invalid request code ++--------------------------------------------------------------------------*/ +FORM_EXPORT(const char *) +form_request_name(int request) +{ + T((T_CALLED("form_request_name(%d)"), request)); + + if ((request < MIN_FORM_COMMAND) || (request > MAX_FORM_COMMAND)) + { + SET_ERROR(E_BAD_ARGUMENT); + returnCPtr((const char *)0); + } + else + returnCPtr(request_names[request - MIN_FORM_COMMAND]); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int form_request_by_name (const char *str); +| +| Description : Search for a request with this name. +| +| Return Values : Request Id - on success +| E_NO_MATCH - request not found ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +form_request_by_name(const char *str) +{ + /* because the table is so small, it doesn't really hurt + to run sequentially through it. + */ + size_t i = 0; + + T((T_CALLED("form_request_by_name(%s)"), _nc_visbuf(str))); + + if (str != 0 && (i = strlen(str)) != 0) + { + char buf[16]; /* longest name is 10 chars */ + + if (i > sizeof(buf) - 2) + i = sizeof(buf) - 2; + memcpy(buf, str, i); + buf[i] = '\0'; + + for (i = 0; buf[i] != '\0'; ++i) + { + buf[i] = (char)toupper(UChar(buf[i])); + } + + for (i = 0; i < A_SIZE; i++) + { + if (strcmp(request_names[i], buf) == 0) + returnCode(MIN_FORM_COMMAND + (int)i); + } + } + RETURN(E_NO_MATCH); +} + +/* frm_req_name.c ends here */ diff --git a/contrib/ncurses/form/frm_scale.c b/contrib/ncurses/form/frm_scale.c new file mode 100644 index 00000000..d53798e1 --- /dev/null +++ b/contrib/ncurses/form/frm_scale.c @@ -0,0 +1,70 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_scale.c,v 1.13 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int scale_form( const FORM *form, int *rows, int *cols ) +| +| Description : Retrieve size of form +| +| Return Values : E_OK - no error +| E_BAD_ARGUMENT - invalid form pointer +| E_NOT_CONNECTED - no fields connected to form ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +scale_form(const FORM *form, int *rows, int *cols) +{ + T((T_CALLED("scale_form(%p,%p,%p)"), + (const void *)form, + (void *)rows, + (void *)cols)); + + if (!form) + RETURN(E_BAD_ARGUMENT); + + if (!(form->field)) + RETURN(E_NOT_CONNECTED); + + if (rows) + *rows = form->rows; + if (cols) + *cols = form->cols; + + RETURN(E_OK); +} + +/* frm_scale.c ends here */ diff --git a/contrib/ncurses/form/frm_sub.c b/contrib/ncurses/form/frm_sub.c new file mode 100644 index 00000000..4fb00e7a --- /dev/null +++ b/contrib/ncurses/form/frm_sub.c @@ -0,0 +1,84 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995-1997,2009 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_sub.c,v 1.16 2024/07/27 18:35:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_sub(FORM *form, WINDOW *win) +| +| Description : Set the subwindow of the form to win. +| +| Return Values : E_OK - success +| E_POSTED - form is posted ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_form_sub(FORM *form, WINDOW *win) +{ + T((T_CALLED("set_form_sub(%p,%p)"), (void *)form, (void *)win)); + + if (form && (form->status & _POSTED)) + RETURN(E_POSTED); + else + { +#if NCURSES_SP_FUNCS + (void) Normalize_Form(form); + form->sub = win ? win : StdScreen(Get_Form_Screen(form)); + RETURN(E_OK); +#else + Normalize_Form(form)->sub = win; + RETURN(E_OK); +#endif + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : WINDOW *form_sub(const FORM *) +| +| Description : Retrieve the window of the form. +| +| Return Values : The pointer to the Subwindow. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(WINDOW *) +form_sub(const FORM *form) +{ + T((T_CALLED("form_sub(%p)"), (const void *)form)); + + (void) Normalize_Form(form); + returnWin(Get_Form_Window(form)); +} + +/* frm_sub.c ends here */ diff --git a/contrib/ncurses/form/frm_user.c b/contrib/ncurses/form/frm_user.c new file mode 100644 index 00000000..a4a22497 --- /dev/null +++ b/contrib/ncurses/form/frm_user.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_user.c,v 1.19 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_userptr(FORM *form, void *usrptr) +| +| Description : Set the pointer that is reserved in any form to store +| application relevant information. +| +| Return Values : E_OK - on success ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_form_userptr(FORM *form, void *usrptr) +{ + T((T_CALLED("set_form_userptr(%p,%p)"), (void *)form, (void *)usrptr)); + + Normalize_Form(form)->usrptr = usrptr; + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : void *form_userptr(const FORM *form) +| +| Description : Return the pointer that is reserved in any form to +| store application relevant information. +| +| Return Values : Value of pointer. If no such pointer has been set, +| NULL is returned ++--------------------------------------------------------------------------*/ +FORM_EXPORT(void *) +form_userptr(const FORM *form) +{ + T((T_CALLED("form_userptr(%p)"), (const void *)form)); + returnVoidPtr(Normalize_Form(form)->usrptr); +} + +/* frm_user.c ends here */ diff --git a/contrib/ncurses/form/frm_win.c b/contrib/ncurses/form/frm_win.c new file mode 100644 index 00000000..eb498292 --- /dev/null +++ b/contrib/ncurses/form/frm_win.c @@ -0,0 +1,91 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: frm_win.c,v 1.20 2024/07/27 18:35:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int set_form_win(FORM *form,WINDOW *win) +| +| Description : Set the window of the form to win. +| +| Return Values : E_OK - success +| E_POSTED - form is posted ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +set_form_win(FORM *form, WINDOW *win) +{ + T((T_CALLED("set_form_win(%p,%p)"), (void *)form, (void *)win)); + + if (form && (form->status & _POSTED)) + RETURN(E_POSTED); + else + { +#if NCURSES_SP_FUNCS + (void) Normalize_Form(form); + form->win = win ? win : StdScreen(Get_Form_Screen(form)); + RETURN(E_OK); +#else + Normalize_Form(form)->win = win; + RETURN(E_OK); +#endif + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : WINDOW *form_win(const FORM *) +| +| Description : Retrieve the window of the form. +| +| Return Values : The pointer to the Window or stdscr if there is none. ++--------------------------------------------------------------------------*/ +FORM_EXPORT(WINDOW *) +form_win(const FORM *form) +{ + WINDOW *result; + + T((T_CALLED("form_win(%p)"), (const void *)form)); + + (void) Normalize_Form(form); +#if NCURSES_SP_FUNCS + result = (form->win ? form->win : StdScreen(Get_Form_Screen(form))); +#else + result = (form->win ? form->win : stdscr); +#endif + returnWin(result); +} + +/* frm_win.c ends here */ diff --git a/contrib/ncurses/form/fty_alnum.c b/contrib/ncurses/form/fty_alnum.c new file mode 100644 index 00000000..854dc33e --- /dev/null +++ b/contrib/ncurses/form/fty_alnum.c @@ -0,0 +1,203 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_alnum.c,v 1.29 2020/12/12 01:15:37 tom Exp $") + +#define thisARG alnumARG + +typedef struct + { + int width; + } +thisARG; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_This_Type(void *arg) +| +| Description : Allocate structure for alphanumeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Generic_This_Type(void *arg) +{ + thisARG *argp = (thisARG *)0; + + if (arg) + { + argp = typeMalloc(thisARG, 1); + + if (argp) + { + T((T_CREATE("thisARG %p"), (void *)argp)); + argp->width = *((int *)arg); + } + } + return ((void *)argp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_This_Type(va_list *ap) +| +| Description : Allocate structure for alphanumeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_This_Type(va_list *ap) +{ + int w = va_arg(*ap, int); + + return Generic_This_Type((void *)&w); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_ThisType(const void *argp) +| +| Description : Copy structure for alphanumeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error. ++--------------------------------------------------------------------------*/ +static void * +Copy_This_Type(const void *argp) +{ + const thisARG *ap = (const thisARG *)argp; + thisARG *result = typeMalloc(thisARG, 1); + + if (result) + { + T((T_CREATE("thisARG %p"), (void *)result)); + *result = *ap; + } + + return ((void *)result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Free_This_Type(void *argp) +| +| Description : Free structure for alphanumeric type argument. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Free_This_Type(void *argp) +{ + if (argp) + free(argp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Character( +| int c, +| const void *argp) +| +| Description : Check a character for the alphanumeric type. +| +| Return Values : TRUE - character is valid +| FALSE - character is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Character(int c, const void *argp GCC_UNUSED) +{ +#if USE_WIDEC_SUPPORT + if (iswalnum((wint_t)c)) + return TRUE; +#endif + return (isalnum(UChar(c)) ? TRUE : FALSE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Field( +| FIELD *field, +| const void *argp) +| +| Description : Validate buffer content to be a valid alphanumeric value +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Field(FIELD *field, const void *argp) +{ + int width = ((const thisARG *)argp)->width; + unsigned char *bp = (unsigned char *)field_buffer(field, 0); + bool result = (width < 0); + + Check_CTYPE_Field(result, bp, width, Check_This_Character); + return (result); +} + +static FIELDTYPE typeTHIS = +{ + _HAS_ARGS | _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + Make_This_Type, + Copy_This_Type, + Free_This_Type, + INIT_FT_FUNC(Check_This_Field), + INIT_FT_FUNC(Check_This_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_This_Type +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALNUM = &typeTHIS; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_ALNUM(void) +{ + return TYPE_ALNUM; +} +#endif + +/* fty_alnum.c ends here */ diff --git a/contrib/ncurses/form/fty_alpha.c b/contrib/ncurses/form/fty_alpha.c new file mode 100644 index 00000000..a37459a6 --- /dev/null +++ b/contrib/ncurses/form/fty_alpha.c @@ -0,0 +1,203 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_alpha.c,v 1.31 2020/12/12 01:15:37 tom Exp $") + +#define thisARG alphaARG + +typedef struct + { + int width; + } +thisARG; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_This_Type(va_list *ap) +| +| Description : Allocate structure for alpha type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Generic_This_Type(void *arg) +{ + thisARG *argp = (thisARG *)0; + + if (arg) + { + argp = typeMalloc(thisARG, 1); + + if (argp) + { + T((T_CREATE("thisARG %p"), (void *)argp)); + argp->width = *((int *)arg); + } + } + return ((void *)argp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_This_Type(va_list *ap) +| +| Description : Allocate structure for alpha type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_This_Type(va_list *ap) +{ + int w = va_arg(*ap, int); + + return Generic_This_Type((void *)&w); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_This_Type(const void * argp) +| +| Description : Copy structure for alpha type argument. +| +| Return Values : Pointer to argument structure or NULL on error. ++--------------------------------------------------------------------------*/ +static void * +Copy_This_Type(const void *argp) +{ + const thisARG *ap = (const thisARG *)argp; + thisARG *result = typeMalloc(thisARG, 1); + + if (result) + { + T((T_CREATE("thisARG %p"), (void *)result)); + *result = *ap; + } + + return ((void *)result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Free_This_Type(void *argp) +| +| Description : Free structure for alpha type argument. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Free_This_Type(void *argp) +{ + if (argp) + free(argp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Character( +| int c, +| const void *argp) +| +| Description : Check a character for the alpha type. +| +| Return Values : TRUE - character is valid +| FALSE - character is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Character(int c, const void *argp GCC_UNUSED) +{ +#if USE_WIDEC_SUPPORT + if (iswalpha((wint_t)c)) + return TRUE; +#endif + return (isalpha(UChar(c)) ? TRUE : FALSE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Field( +| FIELD *field, +| const void *argp) +| +| Description : Validate buffer content to be a valid alpha value +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Field(FIELD *field, const void *argp) +{ + int width = ((const thisARG *)argp)->width; + unsigned char *bp = (unsigned char *)field_buffer(field, 0); + bool result = (width < 0); + + Check_CTYPE_Field(result, bp, width, Check_This_Character); + return (result); +} + +static FIELDTYPE typeTHIS = +{ + _HAS_ARGS | _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + Make_This_Type, + Copy_This_Type, + Free_This_Type, + INIT_FT_FUNC(Check_This_Field), + INIT_FT_FUNC(Check_This_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_This_Type +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ALPHA = &typeTHIS; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_ALPHA(void) +{ + return TYPE_ALPHA; +} +#endif + +/* fty_alpha.c ends here */ diff --git a/contrib/ncurses/form/fty_enum.c b/contrib/ncurses/form/fty_enum.c new file mode 100644 index 00000000..07a501e8 --- /dev/null +++ b/contrib/ncurses/form/fty_enum.c @@ -0,0 +1,444 @@ +/**************************************************************************** + * Copyright 2020,2021,2024 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_enum.c,v 1.34 2024/07/27 18:50:22 tom Exp $") + +typedef struct + { + char **kwds; + int count; + bool checkcase; + bool checkunique; + } +enumARG; + +typedef struct + { + char **kwds; + int ccase; + int cunique; + } +enumParams; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_Enum_Type(void * arg) +| +| Description : Allocate structure for enumeration type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Generic_Enum_Type(void *arg) +{ + enumARG *argp = (enumARG *)0; + enumParams *params = (enumParams *)arg; + + if (params) + { + argp = typeMalloc(enumARG, 1); + + if (argp) + { + int cnt = 0; + char **kp = (char **)0; + char **kwds = (char **)0; + int ccase, cunique; + + T((T_CREATE("enumARG %p"), (void *)argp)); + kwds = params->kwds; + ccase = params->ccase; + cunique = params->cunique; + + argp->checkcase = ccase ? TRUE : FALSE; + argp->checkunique = cunique ? TRUE : FALSE; + argp->kwds = (char **)0; + + kp = kwds; + while (kp && (*kp++)) + cnt++; + argp->count = cnt; + + if (cnt > 0) + { + char **kptarget; + + /* We copy the keywords, because we can't rely on the fact + that the caller doesn't relocate or free the memory used + for the keywords (maybe he has GC) + */ + argp->kwds = typeMalloc(char *, cnt + 1); + + kp = kwds; + if ((kptarget = argp->kwds) != 0) + { + while (kp && (*kp)) + { + (*kptarget++) = strdup(*kp++); + } + *kptarget = (char *)0; + } + } + } + } + return (void *)argp; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_Enum_Type( va_list * ap ) +| +| Description : Allocate structure for enumeration type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_Enum_Type(va_list *ap) +{ + enumParams params; + + params.kwds = va_arg(*ap, char **); + params.ccase = va_arg(*ap, int); + params.cunique = va_arg(*ap, int); + + return Generic_Enum_Type((void *)¶ms); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_Enum_Type( const void * argp ) +| +| Description : Copy structure for enumeration type argument. +| +| Return Values : Pointer to argument structure or NULL on error. ++--------------------------------------------------------------------------*/ +static void * +Copy_Enum_Type(const void *argp) +{ + enumARG *result = (enumARG *)0; + + if (argp) + { + const enumARG *ap = (const enumARG *)argp; + + result = typeMalloc(enumARG, 1); + + if (result) + { + T((T_CREATE("enumARG %p"), (void *)result)); + *result = *ap; + + if (ap->count > 0) + { + char **kptarget; + char **kp = ap->kwds; + result->kwds = typeMalloc(char *, 1 + ap->count); + + if ((kptarget = result->kwds) != 0) + { + while (kp && (*kp)) + { + (*kptarget++) = strdup(*kp++); + } + *kptarget = (char *)0; + } + } + } + } + return (void *)result; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Free_Enum_Type( void * argp ) +| +| Description : Free structure for enumeration type argument. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Free_Enum_Type(void *argp) +{ + if (argp) + { + const enumARG *ap = (const enumARG *)argp; + + if (ap->kwds && ap->count > 0) + { + char **kp = ap->kwds; + int cnt = 0; + + while (kp && (*kp)) + { + free(*kp++); + cnt++; + } + assert(cnt == ap->count); + free(ap->kwds); + } + free(argp); + } +} + +#define SKIP_SPACE(x) while(((*(x))!='\0') && (is_blank(*(x)))) (x)++ +#define NOMATCH 0 +#define PARTIAL 1 +#define EXACT 2 + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static int Compare(const unsigned char * s, +| const unsigned char * buf, +| bool ccase ) +| +| Description : Check whether or not the text in 'buf' matches the +| text in 's', at least partial. +| +| Return Values : NOMATCH - buffer doesn't match +| PARTIAL - buffer matches partially +| EXACT - buffer matches exactly ++--------------------------------------------------------------------------*/ +static int +Compare(const unsigned char *s, const unsigned char *buf, + bool ccase) +{ + SKIP_SPACE(buf); /* Skip leading spaces in both texts */ + SKIP_SPACE(s); + + if (*buf == '\0') + { + return (((*s) != '\0') ? NOMATCH : EXACT); + } + else + { + if (ccase) + { + while (*s++ == *buf) + { + if (*buf++ == '\0') + return EXACT; + } + } + else + { + while (toupper(*s++) == toupper(*buf)) + { + if (*buf++ == '\0') + return EXACT; + } + } + } + /* At this location buf points to the first character where it no longer + matches with s. So if only blanks are following, we have a partial + match otherwise there is no match */ + SKIP_SPACE(buf); + if (*buf) + return NOMATCH; + + /* If it happens that the reference buffer is at its end, the partial + match is actually an exact match. */ + return ((s[-1] != '\0') ? PARTIAL : EXACT); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_Enum_Field( +| FIELD * field, +| const void * argp) +| +| Description : Validate buffer content to be a valid enumeration value +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_Enum_Field(FIELD *field, const void *argp) +{ + char **kwds = ((const enumARG *)argp)->kwds; + bool ccase = ((const enumARG *)argp)->checkcase; + bool unique = ((const enumARG *)argp)->checkunique; + const unsigned char *bp = (unsigned char *)field_buffer(field, 0); + const char *s, *t, *p; + + while (kwds && (s = (*kwds++))) + { + int res; + + if ((res = Compare((const unsigned char *)s, bp, ccase)) != NOMATCH) + { + p = t = s; /* t is at least a partial match */ + if ((unique && res != EXACT)) + { + while (kwds && (p = *kwds++)) + { + if ((res = Compare((const unsigned char *)p, bp, ccase)) != NOMATCH) + { + if (res == EXACT) + { + t = p; + break; + } + else + t = NULL; + } + } + } + if (t) + { + set_field_buffer(field, 0, t); + return TRUE; + } + if (!p) + break; + } + } + return FALSE; +} + +static const char *dummy[] = +{(char *)0}; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Next_Enum(FIELD * field, +| const void * argp) +| +| Description : Check for the next enumeration value +| +| Return Values : TRUE - next value found and loaded +| FALSE - no next value loaded ++--------------------------------------------------------------------------*/ +static bool +Next_Enum(FIELD *field, const void *argp) +{ + const enumARG *args = (const enumARG *)argp; + char **kwds = args->kwds; + const unsigned char *bp = (const unsigned char *)field_buffer(field, 0); + + if (kwds) + { + int cnt = args->count; + bool ccase = args->checkcase; + + while (cnt--) + { + if (Compare((unsigned char *)(*kwds++), bp, ccase) == EXACT) + break; + } + if (cnt <= 0) + kwds = args->kwds; + if ((cnt >= 0) || (Compare((const unsigned char *)dummy, bp, ccase) == EXACT)) + { + set_field_buffer(field, 0, *kwds); + return TRUE; + } + } + return FALSE; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Previous_Enum( +| FIELD * field, +| const void * argp) +| +| Description : Check for the previous enumeration value +| +| Return Values : TRUE - previous value found and loaded +| FALSE - no previous value loaded ++--------------------------------------------------------------------------*/ +static bool +Previous_Enum(FIELD *field, const void *argp) +{ + const enumARG *args = (const enumARG *)argp; + int cnt = args->count; + char **kwds = &args->kwds[cnt - 1]; + const unsigned char *bp = (const unsigned char *)field_buffer(field, 0); + + bool ccase = args->checkcase; + + while (cnt--) + { + if (Compare((unsigned char *)(*kwds--), bp, ccase) == EXACT) + break; + } + + if (cnt <= 0) + kwds = &args->kwds[args->count - 1]; + + if ((cnt >= 0) || (Compare((const unsigned char *)dummy, bp, ccase) == EXACT)) + { + set_field_buffer(field, 0, *kwds); + return TRUE; + } + + return FALSE; +} + +static FIELDTYPE typeENUM = +{ + _HAS_ARGS | _HAS_CHOICE | _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + Make_Enum_Type, + Copy_Enum_Type, + Free_Enum_Type, + INIT_FT_FUNC(Check_Enum_Field), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(Next_Enum), + INIT_FT_FUNC(Previous_Enum), +#if NCURSES_INTEROP_FUNCS + Generic_Enum_Type +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_ENUM = &typeENUM; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_ENUM(void) +{ + return TYPE_ENUM; +} +#endif + +/* fty_enum.c ends here */ diff --git a/contrib/ncurses/form/fty_generic.c b/contrib/ncurses/form/fty_generic.c new file mode 100644 index 00000000..5914d258 --- /dev/null +++ b/contrib/ncurses/form/fty_generic.c @@ -0,0 +1,305 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 2008-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_generic.c,v 1.16 2024/07/27 18:51:24 tom Exp $") + +/* + * This is not a full implementation of a field type, but adds some + * support for higher level languages with some restrictions to interop + * with C language. In particular, the collection of arguments for the + * various fieldtypes is not based on the vararg C mechanism, but on a + * iterator based callback mechanism that allows the high level language + * to provide the arguments as a structure. Most languages have mechanisms + * to layout structures so that they can be passed to C. + * + * The languages can register a new generic fieldtype dynamically and store + * a handle (key) to the calling object as an argument. Together with that + * it can register a freearg callback, so that the high level language + * remains in control of the memory management of the arguments they pass. + * The design idea is, that the high-level language - typically a OO + * language like C# or Java, uses its own dispatching mechanisms + * (polymorphism) to call the proper check routines responsible for the + * argument type. So these language implement typically only one generic + * fieldtype they register with the forms library using this call. + * + * For that purpose we have extended the fieldtype structure by a new element + * that gets the arguments from a single struct passed by the caller. + * + */ +#if NCURSES_INTEROP_FUNCS + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_This_Type( void * arg ) +| +| Description : We interpret the passed arg just as a handle the +| calling language uses to keep track of its allocated +| argument structures. We can simply copy it back. +| +| Return Values : Pointer to argument structure ++--------------------------------------------------------------------------*/ +static void * +Generic_This_Type(void *arg) +{ + return (arg); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : FIELDTYPE *_nc_generic_fieldtype( +| bool (* const field_check)(FIELD *,const void *), +| bool (* const char_check) (int, const void *), +| bool (*const next)(FORM*,FIELD*,const void*), +| bool (*const prev)(FORM*,FIELD*,const void*), +| void (*freecallback)(void*)) +| +| Description : Create a new fieldtype. The application programmer must +| write a field_check and a char_check function and give +| them as input to this call. A callback to allow the +| release of the allocated memory must also be provided. +| For generic field types, we provide some more +| information about the field as parameters. +| +| If an error occurs, errno is set to +| E_BAD_ARGUMENT - invalid arguments +| E_SYSTEM_ERROR - system error (no memory) +| +| Return Values : Fieldtype pointer or NULL if error occurred ++--------------------------------------------------------------------------*/ +FORM_EXPORT(FIELDTYPE *) +_nc_generic_fieldtype(bool (*const field_check) (FORM *, FIELD *, const void *), + bool (*const char_check) (int, FORM *, FIELD *, const + void *), + bool (*const next) (FORM *, FIELD *, const void *), + bool (*const prev) (FORM *, FIELD *, const void *), + void (*freecallback) (void *)) +{ + int code = E_SYSTEM_ERROR; + FIELDTYPE *res = (FIELDTYPE *)0; + + TR_FUNC_BFR(5); + + T((T_CALLED("_nc_generic_fieldtype(%s,%s,%s,%s,%s)"), + TR_FUNC_ARG(0, field_check), + TR_FUNC_ARG(1, char_check), + TR_FUNC_ARG(2, next), + TR_FUNC_ARG(3, prev), + TR_FUNC_ARG(4, freecallback))); + + if (field_check || char_check) + { + res = typeMalloc(FIELDTYPE, 1); + + if (res) + { + *res = *_nc_Default_FieldType; + SetStatus(res, (_HAS_ARGS | _GENERIC)); + res->fieldcheck.gfcheck = field_check; + res->charcheck.gccheck = char_check; + res->genericarg = Generic_This_Type; + res->freearg = freecallback; + res->enum_next.gnext = next; + res->enum_prev.gprev = prev; + code = E_OK; + } + } + else + code = E_BAD_ARGUMENT; + + if (E_OK != code) + SET_ERROR(code); + + returnFieldType(res); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static TypeArgument *GenericArgument( +| const FIELDTYPE* typ, +| int (*argiterator)(void**), +| int* err) +| +| Description : The iterator callback must browse through all fieldtype +| parameters that have an argument associated with the +| type. The iterator returns 1 if the operation to get +| the next element was successful, 0 otherwise. If the +| iterator could move to the next argument, it fills +| the void* pointer representing the argument into the +| location provided as argument to the iterator. +| The err reference is used to keep track of errors. +| +| Return Values : Pointer to argument structure ++--------------------------------------------------------------------------*/ +static TypeArgument * +GenericArgument(const FIELDTYPE *typ, + int (*argiterator) (void **), int *err) +{ + TypeArgument *res = (TypeArgument *)0; + + if (typ != 0 && (typ->status & _HAS_ARGS) != 0 && err != 0 && argiterator != 0) + { + if (typ->status & _LINKED_TYPE) + { + /* Composite fieldtypes keep track internally of their own memory */ + TypeArgument *p = typeMalloc(TypeArgument, 1); + + if (p) + { + p->left = GenericArgument(typ->left, argiterator, err); + p->right = GenericArgument(typ->right, argiterator, err); + return p; + } + else + *err += 1; + } + else + { + assert(typ->genericarg != (void *)0); + if (typ->genericarg == 0) + *err += 1; + else + { + void *argp; + int valid = argiterator(&argp); + + if (valid == 0 || argp == 0 || + !(res = (TypeArgument *)typ->genericarg(argp))) + { + *err += 1; + } + } + } + } + return res; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : int _nc_set_generic_fieldtype( +| FIELD* field, +| FIELDTYPE* ftyp, +| int (*argiterator)(void**)) +| +| Description : Assign the fieldtype to the field and use the iterator +| mechanism to get the arguments when a check is +| performed. +| +| Return Values : E_OK if all went well +| E_SYSTEM_ERROR if an error occurred ++--------------------------------------------------------------------------*/ +FORM_EXPORT(int) +_nc_set_generic_fieldtype(FIELD *field, + FIELDTYPE *ftyp, + int (*argiterator) (void **)) +{ + int code = E_SYSTEM_ERROR; + int err = 0; + + if (field) + { + if (field->type) + _nc_Free_Type(field); + + field->type = ftyp; + if (ftyp) + { + if (argiterator) + { + /* The precondition is that the iterator is reset */ + field->arg = (void *)GenericArgument(field->type, argiterator, &err); + + if (err) + { + _nc_Free_Argument(field->type, (TypeArgument *)(field->arg)); + field->type = (FIELDTYPE *)0; + field->arg = (void *)0; + } + else + { + code = E_OK; + if (field->type) + field->type->ref++; + } + } + } + else + { + field->arg = (void *)0; + code = E_OK; + } + } + return code; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : WINDOW* _nc_form_cursor( +| FORM* form, +| int *pRow, int *pCol) +| +| Description : Get the current position of the form cursor position +| We also return the field window +| +| Return Values : The field's Window or NULL on error ++--------------------------------------------------------------------------*/ +FORM_EXPORT(WINDOW *) +_nc_form_cursor(const FORM *form, int *pRow, int *pCol) +{ + int code = E_SYSTEM_ERROR; + WINDOW *res = (WINDOW *)0; + + if (form != 0 && pRow != 0 && pCol != 0) + { + *pRow = form->currow; + *pCol = form->curcol; + res = form->w; + code = E_OK; + } + if (code != E_OK) + SET_ERROR(code); + return res; +} + +#else +extern void _nc_fty_generic(void); +void +_nc_fty_generic(void) +{ +} +#endif + +/* fty_generic.c ends here */ diff --git a/contrib/ncurses/form/fty_int.c b/contrib/ncurses/form/fty_int.c new file mode 100644 index 00000000..328780bb --- /dev/null +++ b/contrib/ncurses/form/fty_int.c @@ -0,0 +1,298 @@ +/**************************************************************************** + * Copyright 2020,2021,2024 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_int.c,v 1.34 2024/07/27 18:35:02 tom Exp $") + +#if USE_WIDEC_SUPPORT +#define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c))) +#else +#define isDigit(c) isdigit(UChar(c)) +#endif + +#define thisARG integerARG + +typedef struct + { + int precision; + long low; + long high; + } +thisARG; + +typedef struct + { + int precision; + long low; + long high; + } +integerPARM; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_This_Type( void * arg ) +| +| Description : Allocate structure for integer type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Generic_This_Type(void *arg) +{ + thisARG *argp = (thisARG *)0; + const thisARG *param = (thisARG *)arg; + + if (param) + { + argp = typeMalloc(thisARG, 1); + + if (argp) + { + T((T_CREATE("thisARG %p"), (void *)argp)); + *argp = *param; + } + } + return (void *)argp; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_This_Type( va_list * ap ) +| +| Description : Allocate structure for integer type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_This_Type(va_list *ap) +{ + thisARG arg; + + arg.precision = va_arg(*ap, int); + arg.low = va_arg(*ap, long); + arg.high = va_arg(*ap, long); + + return Generic_This_Type((void *)&arg); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_This_Type(const void * argp) +| +| Description : Copy structure for integer type argument. +| +| Return Values : Pointer to argument structure or NULL on error. ++--------------------------------------------------------------------------*/ +static void * +Copy_This_Type(const void *argp) +{ + const thisARG *ap = (const thisARG *)argp; + thisARG *result = (thisARG *)0; + + if (argp) + { + result = typeMalloc(thisARG, 1); + + if (result) + { + T((T_CREATE("thisARG %p"), (void *)result)); + *result = *ap; + } + } + return (void *)result; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Free_This_Type(void * argp) +| +| Description : Free structure for integer type argument. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Free_This_Type(void *argp) +{ + if (argp) + free(argp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Field( +| FIELD * field, +| const void * argp) +| +| Description : Validate buffer content to be a valid integer value +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Field(FIELD *field, const void *argp) +{ + const thisARG *argi = (const thisARG *)argp; + long low = argi->low; + long high = argi->high; + int prec = argi->precision; + unsigned char *bp = (unsigned char *)field_buffer(field, 0); + const char *s = (char *)bp; + bool result = FALSE; + + while (*bp == ' ') + bp++; + if (*bp) + { + if (*bp == '-') + bp++; +#if USE_WIDEC_SUPPORT + if (*bp) + { + int len; + wchar_t *list = _nc_Widen_String((char *)bp, &len); + + if (list != 0) + { + bool blank = FALSE; + int n; + + result = TRUE; + for (n = 0; n < len; ++n) + { + if (blank) + { + if (list[n] != ' ') + { + result = FALSE; + break; + } + } + else if (list[n] == ' ') + { + blank = TRUE; + } + else if (!isDigit(list[n])) + { + result = FALSE; + break; + } + } + free(list); + } + } +#else + while (*bp) + { + if (!isdigit(UChar(*bp))) + break; + bp++; + } + while (*bp && *bp == ' ') + bp++; + result = (*bp == '\0'); +#endif + if (result) + { + long val = atol(s); + + if (low < high) + { + if (val < low || val > high) + result = FALSE; + } + if (result) + { + char buf[100]; + + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%.*ld", (prec > 0 ? prec : 0), val); + set_field_buffer(field, 0, buf); + } + } + } + return (result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Character( +| int c, +| const void * argp) +| +| Description : Check a character for the integer type. +| +| Return Values : TRUE - character is valid +| FALSE - character is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Character(int c, const void *argp GCC_UNUSED) +{ + return ((isDigit(UChar(c)) || (c == '-')) ? TRUE : FALSE); +} + +static FIELDTYPE typeTHIS = +{ + _HAS_ARGS | _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + Make_This_Type, + Copy_This_Type, + Free_This_Type, + INIT_FT_FUNC(Check_This_Field), + INIT_FT_FUNC(Check_This_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_This_Type +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_INTEGER = &typeTHIS; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_INTEGER(void) +{ + return TYPE_INTEGER; +} +#endif + +/* fty_int.c ends here */ diff --git a/contrib/ncurses/form/fty_ipv4.c b/contrib/ncurses/form/fty_ipv4.c new file mode 100644 index 00000000..108f7b4b --- /dev/null +++ b/contrib/ncurses/form/fty_ipv4.c @@ -0,0 +1,121 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2006,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Per Foreby, perf@efd.lth.se * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_ipv4.c,v 1.16 2021/06/17 21:11:08 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_IPV4_Field( +| FIELD * field, +| const void * argp) +| +| Description : Validate buffer content to be a valid IP number (Ver. 4) +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_IPV4_Field(FIELD *field, const void *argp GCC_UNUSED) +{ + char *bp = field_buffer(field, 0); + int num = 0, len; + unsigned int d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + if (isdigit(UChar(*bp))) /* Must start with digit */ + { + num = sscanf(bp, "%u.%u.%u.%u%n", &d1, &d2, &d3, &d4, &len); + if (num == 4) + { + bp += len; /* Make bp point to what sscanf() left */ + while (isspace(UChar(*bp))) + bp++; /* Allow trailing whitespace */ + } + } + return ((num != 4 || *bp || d1 > 255 || d2 > 255 + || d3 > 255 || d4 > 255) ? FALSE : TRUE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_IPV4_Character( +| int c, +| const void *argp ) +| +| Description : Check a character for unsigned type or period. +| +| Return Values : TRUE - character is valid +| FALSE - character is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_IPV4_Character(int c, const void *argp GCC_UNUSED) +{ + return ((isdigit(UChar(c)) || (c == '.')) ? TRUE : FALSE); +} + +static FIELDTYPE typeIPV4 = +{ + _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + NULL, + NULL, + NULL, + INIT_FT_FUNC(Check_IPV4_Field), + INIT_FT_FUNC(Check_IPV4_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + NULL +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_IPV4 = &typeIPV4; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_IPV4(void) +{ + return TYPE_IPV4; +} +#endif + +/* fty_ipv4.c ends here */ diff --git a/contrib/ncurses/form/fty_num.c b/contrib/ncurses/form/fty_num.c new file mode 100644 index 00000000..c51bca89 --- /dev/null +++ b/contrib/ncurses/form/fty_num.c @@ -0,0 +1,344 @@ +/**************************************************************************** + * Copyright 2019-2021,2024 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_num.c,v 1.38 2024/07/27 18:33:58 tom Exp $") + +#if HAVE_LOCALE_H +#include +#endif + +#if HAVE_LOCALE_H && HAVE_LOCALECONV +#define isDecimalPoint(c) ((c) == ((L && L->decimal_point) ? *(L->decimal_point) : '.')) +#else +#define isDecimalPoint(c) ((c) == '.') +#endif + +#if USE_WIDEC_SUPPORT +#define isDigit(c) (iswdigit((wint_t)(c)) || isdigit(UChar(c))) +#else +#define isDigit(c) isdigit(UChar(c)) +#endif + +#define thisARG numericARG + +typedef struct + { + int precision; + double low; + double high; + struct lconv *L; + } +thisARG; + +typedef struct + { + int precision; + double low; + double high; + } +thisPARM; + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_This_Type(void * arg) +| +| Description : Allocate structure for numeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Generic_This_Type(void *arg) +{ + thisARG *argn = (thisARG *)0; + const thisPARM *args = (thisPARM *)arg; + + if (args) + { + argn = typeMalloc(thisARG, 1); + + if (argn) + { + T((T_CREATE("thisARG %p"), (void *)argn)); + argn->precision = args->precision; + argn->low = args->low; + argn->high = args->high; + +#if HAVE_LOCALE_H && HAVE_LOCALECONV + argn->L = localeconv(); +#else + argn->L = NULL; +#endif + } + } + return (void *)argn; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_This_Type(va_list * ap) +| +| Description : Allocate structure for numeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_This_Type(va_list *ap) +{ + thisPARM arg; + + arg.precision = va_arg(*ap, int); + arg.low = va_arg(*ap, double); + arg.high = va_arg(*ap, double); + + return Generic_This_Type((void *)&arg); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_This_Type(const void * argp) +| +| Description : Copy structure for numeric type argument. +| +| Return Values : Pointer to argument structure or NULL on error. ++--------------------------------------------------------------------------*/ +static void * +Copy_This_Type(const void *argp) +{ + const thisARG *ap = (const thisARG *)argp; + thisARG *result = (thisARG *)0; + + if (argp) + { + result = typeMalloc(thisARG, 1); + + if (result) + { + T((T_CREATE("thisARG %p"), (void *)result)); + *result = *ap; + } + } + return (void *)result; +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Free_This_Type(void * argp) +| +| Description : Free structure for numeric type argument. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Free_This_Type(void *argp) +{ + if (argp) + free(argp); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Field(FIELD * field, +| const void * argp) +| +| Description : Validate buffer content to be a valid numeric value +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Field(FIELD *field, const void *argp) +{ + const thisARG *argn = (const thisARG *)argp; + double low = argn->low; + double high = argn->high; + int prec = argn->precision; + unsigned char *bp = (unsigned char *)field_buffer(field, 0); + const char *s = (char *)bp; + const struct lconv *L = argn->L; + bool result = FALSE; + + while (*bp == ' ') + bp++; + if (*bp) + { + if (*bp == '-' || *bp == '+') + bp++; +#if USE_WIDEC_SUPPORT + if (*bp) + { + int len; + wchar_t *list = _nc_Widen_String((char *)bp, &len); + + if (list != 0) + { + bool blank = FALSE; + int state = 0; + int n; + + result = TRUE; + for (n = 0; n < len; ++n) + { + if (blank) + { + if (list[n] != ' ') + { + result = FALSE; + break; + } + } + else if (list[n] == ' ') + { + blank = TRUE; + } + else if (isDecimalPoint(list[n])) + { + if (++state > 1) + { + result = FALSE; + break; + } + } + else if (!isDigit(list[n])) + { + result = FALSE; + break; + } + } + free(list); + } + } +#else + while (*bp) + { + if (!isdigit(UChar(*bp))) + break; + bp++; + } + if (isDecimalPoint(*bp)) + { + bp++; + while (*bp) + { + if (!isdigit(UChar(*bp))) + break; + bp++; + } + } + while (*bp && *bp == ' ') + bp++; + result = (*bp == '\0'); +#endif + if (result) + { + double val = atof(s); + + if (low < high) + { + if (val < low || val > high) + result = FALSE; + } + if (result) + { + char buf[64]; + + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%.*f", (prec > 0 ? prec : 0), val); + set_field_buffer(field, 0, buf); + } + } + } + return (result); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_This_Character( +| int c, +| const void * argp) +| +| Description : Check a character for the numeric type. +| +| Return Values : TRUE - character is valid +| FALSE - character is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_This_Character(int c, const void *argp) +{ + const thisARG *argn = (const thisARG *)argp; + struct lconv *L = argn->L; + + return ((isDigit(c) || + c == '+' || + c == '-' || + isDecimalPoint(c)) + ? TRUE + : FALSE); +} + +static FIELDTYPE typeTHIS = +{ + _HAS_ARGS | _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + Make_This_Type, + Copy_This_Type, + Free_This_Type, + INIT_FT_FUNC(Check_This_Field), + INIT_FT_FUNC(Check_This_Character), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_This_Type +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_NUMERIC = &typeTHIS; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_NUMERIC(void) +{ + return TYPE_NUMERIC; +} +#endif + +/* fty_num.c ends here */ diff --git a/contrib/ncurses/form/fty_regex.c b/contrib/ncurses/form/fty_regex.c new file mode 100644 index 00000000..62dcab58 --- /dev/null +++ b/contrib/ncurses/form/fty_regex.c @@ -0,0 +1,388 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/*************************************************************************** +* * +* Author : Juergen Pfeifer * +* * +***************************************************************************/ + +#include "form.priv.h" + +MODULE_ID("$Id: fty_regex.c,v 1.33 2021/08/14 15:01:52 tom Exp $") + +#if HAVE_REGEX_H_FUNCS || HAVE_LIB_PCRE2 /* We prefer POSIX regex */ + +#if HAVE_PCRE2POSIX_H +#include + +/* pcre2 used to provide its "POSIX" entrypoints using the same names as the + * standard ones in the C runtime, but that never worked because the linker + * would use the C runtime. Debian patched the library to fix this symbol + * conflict, but overlooked the header file, and Debian's patch was made + * obsolete when pcre2 was changed early in 2019 to provide different names. + * + * Here is a workaround to make the older version of Debian's package work. + */ +#if !defined(PCRE2regcomp) && defined(HAVE_PCRE2REGCOMP) + +#undef regcomp +#undef regexec +#undef regfree + +#ifdef __cplusplus +extern "C" +{ +#endif + PCRE2POSIX_EXP_DECL int PCRE2regcomp(regex_t *, const char *, int); + PCRE2POSIX_EXP_DECL int PCRE2regexec(const regex_t *, const char *, size_t, + regmatch_t *, int); + PCRE2POSIX_EXP_DECL void PCRE2regfree(regex_t *); +#ifdef __cplusplus +} /* extern "C" */ +#endif +#define regcomp(r,s,n) PCRE2regcomp(r,s,n) +#define regexec(r,s,n,m,x) PCRE2regexec(r,s,n,m,x) +#define regfree(r) PCRE2regfree(r) +#endif +/* end workaround... */ +#elif HAVE_PCREPOSIX_H +#include +#else +#include +#endif + +typedef struct + { + regex_t *pRegExp; + unsigned long *refCount; + } +RegExp_Arg; + +#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS +#undef RETURN +static int reg_errno; + +static char * +RegEx_Init(char *instring) +{ + reg_errno = 0; + return instring; +} + +static char * +RegEx_Error(int code) +{ + reg_errno = code; + return 0; +} + +#define INIT register char *sp = RegEx_Init(instring); +#define GETC() (*sp++) +#define PEEKC() (*sp) +#define UNGETC(c) (--sp) +#define RETURN(c) return(c) +#define ERROR(c) return RegEx_Error(c) + +#if HAVE_REGEXP_H_FUNCS +#include +#else +#include +#endif + +typedef struct +{ + char *compiled_expression; + unsigned long *refCount; +} +RegExp_Arg; + +/* Maximum Length we allow for a compiled regular expression */ +#define MAX_RX_LEN (2048) +#define RX_INCREMENT (256) + +#endif + +#if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS +# define MAYBE_UNUSED +#else +# define MAYBE_UNUSED GCC_UNUSED +#endif + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Generic_RegularExpression_Type(void * arg) +| +| Description : Allocate structure for regex type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Generic_RegularExpression_Type(void *arg MAYBE_UNUSED) +{ +#if HAVE_REGEX_H_FUNCS + char *rx = (char *)arg; + RegExp_Arg *preg = (RegExp_Arg *)0; + + if (rx) + { + preg = typeCalloc(RegExp_Arg, 1); + + if (preg) + { + T((T_CREATE("RegExp_Arg %p"), (void *)preg)); + if (((preg->pRegExp = typeMalloc(regex_t, 1)) != 0) + && !regcomp(preg->pRegExp, rx, + (REG_EXTENDED | REG_NOSUB | REG_NEWLINE))) + { + T((T_CREATE("regex_t %p"), (void *)preg->pRegExp)); + if ((preg->refCount = typeMalloc(unsigned long, 1)) != 0) + *(preg->refCount) = 1; + } + else + { + if (preg->pRegExp) + free(preg->pRegExp); + free(preg); + preg = (RegExp_Arg *)0; + } + } + } + return ((void *)preg); +#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS + char *rx = (char *)arg; + RegExp_Arg *pArg = (RegExp_Arg *)0; + + if (rx) + { + pArg = typeMalloc(RegExp_Arg, 1); + + if (pArg) + { + int blen = RX_INCREMENT; + + T((T_CREATE("RegExp_Arg %p"), pArg)); + pArg->compiled_expression = NULL; + if ((pArg->refCount = typeMalloc(unsigned long, 1)) != 0) + *(pArg->refCount) = 1; + + do + { + char *buf = typeMalloc(char, blen); + + if (buf) + { +#if HAVE_REGEXP_H_FUNCS + char *last_pos = compile(rx, buf, &buf[blen], '\0'); + +#else /* HAVE_REGEXPR_H_FUNCS */ + char *last_pos = compile(rx, buf, &buf[blen]); +#endif + if (reg_errno) + { + free(buf); + if (reg_errno == 50) + blen += RX_INCREMENT; + else + { + free(pArg); + pArg = NULL; + break; + } + } + else + { + pArg->compiled_expression = buf; + break; + } + } + } + while (blen <= MAX_RX_LEN); + } + if (pArg && !pArg->compiled_expression) + { + free(pArg); + pArg = NULL; + } + } + return (void *)pArg; +#else + return 0; +#endif +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Make_RegularExpression_Type(va_list * ap) +| +| Description : Allocate structure for regex type argument. +| +| Return Values : Pointer to argument structure or NULL on error ++--------------------------------------------------------------------------*/ +static void * +Make_RegularExpression_Type(va_list *ap) +{ + char *rx = va_arg(*ap, char *); + + return Generic_RegularExpression_Type((void *)rx); +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void *Copy_RegularExpression_Type( +| const void * argp) +| +| Description : Copy structure for regex type argument. +| +| Return Values : Pointer to argument structure or NULL on error. ++--------------------------------------------------------------------------*/ +static void * +Copy_RegularExpression_Type(const void *argp MAYBE_UNUSED) +{ +#if (HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS) + const RegExp_Arg *ap = (const RegExp_Arg *)argp; + const RegExp_Arg *result = (const RegExp_Arg *)0; + + if (ap) + { + *(ap->refCount) += 1; + result = ap; + } + return (void *)result; +#else + return 0; +#endif +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static void Free_RegularExpression_Type(void * argp) +| +| Description : Free structure for regex type argument. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +static void +Free_RegularExpression_Type(void *argp MAYBE_UNUSED) +{ +#if HAVE_REGEX_H_FUNCS | HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS + RegExp_Arg *ap = (RegExp_Arg *)argp; + + if (ap) + { + if (--(*(ap->refCount)) == 0) + { +#if HAVE_REGEX_H_FUNCS + if (ap->pRegExp) + { + free(ap->refCount); + regfree(ap->pRegExp); + free(ap->pRegExp); + } +#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS + if (ap->compiled_expression) + { + free(ap->refCount); + free(ap->compiled_expression); + } +#endif + free(ap); + } + } +#endif +} + +/*--------------------------------------------------------------------------- +| Facility : libnform +| Function : static bool Check_RegularExpression_Field( +| FIELD * field, +| const void * argp) +| +| Description : Validate buffer content to be a valid regular expression +| +| Return Values : TRUE - field is valid +| FALSE - field is invalid ++--------------------------------------------------------------------------*/ +static bool +Check_RegularExpression_Field(FIELD *field MAYBE_UNUSED, + const void *argp MAYBE_UNUSED) +{ + bool match = FALSE; + +#if HAVE_REGEX_H_FUNCS + const RegExp_Arg *ap = (const RegExp_Arg *)argp; + + if (ap && ap->pRegExp) + match = (regexec(ap->pRegExp, field_buffer(field, 0), 0, NULL, 0) + ? FALSE + : TRUE); +#elif HAVE_REGEXP_H_FUNCS | HAVE_REGEXPR_H_FUNCS + RegExp_Arg *ap = (RegExp_Arg *)argp; + + if (ap && ap->compiled_expression) + match = (step(field_buffer(field, 0), ap->compiled_expression) + ? TRUE + : FALSE); +#endif + return match; +} + +static FIELDTYPE typeREGEXP = +{ + _HAS_ARGS | _RESIDENT, + 1, /* this is mutable, so we can't be const */ + (FIELDTYPE *)0, + (FIELDTYPE *)0, + Make_RegularExpression_Type, + Copy_RegularExpression_Type, + Free_RegularExpression_Type, + INIT_FT_FUNC(Check_RegularExpression_Field), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), + INIT_FT_FUNC(NULL), +#if NCURSES_INTEROP_FUNCS + Generic_RegularExpression_Type +#endif +}; + +FORM_EXPORT_VAR(FIELDTYPE *) TYPE_REGEXP = &typeREGEXP; + +#if NCURSES_INTEROP_FUNCS +/* The next routines are to simplify the use of ncurses from + programming languages with restrictions on interop with C level + constructs (e.g. variable access or va_list + ellipsis constructs) +*/ +FORM_EXPORT(FIELDTYPE *) +_nc_TYPE_REGEXP(void) +{ + return TYPE_REGEXP; +} +#endif + +/* fty_regex.c ends here */ diff --git a/contrib/ncurses/form/headers b/contrib/ncurses/form/headers new file mode 100644 index 00000000..0969e3f0 --- /dev/null +++ b/contrib/ncurses/form/headers @@ -0,0 +1,33 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996 +# +$(srcdir)/form.h +# vile:makemode diff --git a/contrib/ncurses/form/llib-lform b/contrib/ncurses/form/llib-lform new file mode 100644 index 00000000..334f8cb1 --- /dev/null +++ b/contrib/ncurses/form/llib-lform @@ -0,0 +1,847 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2015,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./f_trace.c */ + +#include + +#undef _nc_retrace_field_ptr +FIELD **_nc_retrace_field_ptr( + FIELD **code) + { return(*(FIELD ***)0); } + +#undef _nc_retrace_field +FIELD *_nc_retrace_field( + FIELD *code) + { return(*(FIELD **)0); } + +#undef _nc_retrace_field_type +FIELDTYPE *_nc_retrace_field_type( + FIELDTYPE *code) + { return(*(FIELDTYPE **)0); } + +#undef _nc_retrace_form +FORM *_nc_retrace_form( + FORM *code) + { return(*(FORM **)0); } + +#undef _nc_retrace_form_hook +Form_Hook _nc_retrace_form_hook( + Form_Hook code) + { return(*(Form_Hook *)0); } + +/* ./fld_arg.c */ + +#undef set_fieldtype_arg +int set_fieldtype_arg( + FIELDTYPE *typ, + void *(*const make_arg)( + va_list *p1), + void *(*const copy_arg)( + const void *p1), + void (*const free_arg)( + void *p1)) + { return(*(int *)0); } + +#undef field_arg +void *field_arg( + const FIELD *field) + { return(*(void **)0); } + +/* ./fld_attr.c */ + +#undef set_field_fore +int set_field_fore( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_fore +chtype field_fore( + const FIELD *field) + { return(*(chtype *)0); } + +#undef set_field_back +int set_field_back( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_back +chtype field_back( + const FIELD *field) + { return(*(chtype *)0); } + +/* ./fld_current.c */ + +#undef set_current_field +int set_current_field( + FORM *form, + FIELD *field) + { return(*(int *)0); } + +#undef unfocus_current_field +int unfocus_current_field( + FORM *const form) + { return(*(int *)0); } + +#undef current_field +FIELD *current_field( + const FORM *form) + { return(*(FIELD **)0); } + +#undef field_index +int field_index( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_def.c */ + +#undef _nc_Default_Field +FIELD *_nc_Default_Field; + +#undef _nc_Make_Argument +TypeArgument *_nc_Make_Argument( + const FIELDTYPE *typ, + va_list *ap, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Copy_Argument +TypeArgument *_nc_Copy_Argument( + const FIELDTYPE *typ, + const TypeArgument *argp, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Free_Argument +void _nc_Free_Argument( + const FIELDTYPE *typ, + TypeArgument *argp) + { /* void */ } + +#undef _nc_Copy_Type +NCURSES_BOOL _nc_Copy_Type( + FIELD *dst, + FIELD const *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Free_Type +void _nc_Free_Type( + FIELD *field) + { /* void */ } + +#undef new_field +FIELD *new_field( + int rows, + int cols, + int frow, + int fcol, + int nrow, + int nbuf) + { return(*(FIELD **)0); } + +#undef free_field +int free_field( + FIELD *field) + { return(*(int *)0); } + +/* ./fld_dup.c */ + +#undef dup_field +FIELD *dup_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_ftchoice.c */ + +#undef set_fieldtype_choice +int set_fieldtype_choice( + FIELDTYPE *typ, + NCURSES_BOOL (*const next_choice)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const prev_choice)( + FIELD *p1, + const void *p2)) + { return(*(int *)0); } + +/* ./fld_ftlink.c */ + +#undef link_fieldtype +FIELDTYPE *link_fieldtype( + FIELDTYPE *type1, + FIELDTYPE *type2) + { return(*(FIELDTYPE **)0); } + +/* ./fld_info.c */ + +#undef field_info +int field_info( + const FIELD *field, + int *rows, + int *cols, + int *frow, + int *fcol, + int *nrow, + int *nbuf) + { return(*(int *)0); } + +#undef dynamic_field_info +int dynamic_field_info( + const FIELD *field, + int *drows, + int *dcols, + int *maxgrow) + { return(*(int *)0); } + +/* ./fld_just.c */ + +#undef set_field_just +int set_field_just( + FIELD *field, + int just) + { return(*(int *)0); } + +#undef field_just +int field_just( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_link.c */ + +#undef link_field +FIELD *link_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_max.c */ + +#undef set_max_field +int set_max_field( + FIELD *field, + int maxgrow) + { return(*(int *)0); } + +/* ./fld_move.c */ + +#undef move_field +int move_field( + FIELD *field, + int frow, + int fcol) + { return(*(int *)0); } + +/* ./fld_newftyp.c */ + +#undef _nc_Default_FieldType +FIELDTYPE *_nc_Default_FieldType; + +#undef new_fieldtype +FIELDTYPE *new_fieldtype( + NCURSES_BOOL (*const field_check)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const char_check)( + int p1, + const void *p2)) + { return(*(FIELDTYPE **)0); } + +#undef free_fieldtype +int free_fieldtype( + FIELDTYPE *typ) + { return(*(int *)0); } + +/* ./fld_opts.c */ + +#undef set_field_opts +int set_field_opts( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts +Field_Options field_opts( + const FIELD *field) + { return(*(Field_Options *)0); } + +#undef field_opts_on +int field_opts_on( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts_off +int field_opts_off( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +/* ./fld_pad.c */ + +#undef set_field_pad +int set_field_pad( + FIELD *field, + int ch) + { return(*(int *)0); } + +#undef field_pad +int field_pad( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_page.c */ + +#undef set_new_page +int set_new_page( + FIELD *field, + NCURSES_BOOL new_page_flag) + { return(*(int *)0); } + +#undef new_page +NCURSES_BOOL new_page( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_stat.c */ + +#undef set_field_status +int set_field_status( + FIELD *field, + NCURSES_BOOL status) + { return(*(int *)0); } + +#undef field_status +NCURSES_BOOL field_status( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_type.c */ + +#undef set_field_type +int set_field_type( + FIELD *field, + FIELDTYPE *type, + ...) + { return(*(int *)0); } + +#undef field_type +FIELDTYPE *field_type( + const FIELD *field) + { return(*(FIELDTYPE **)0); } + +/* ./fld_user.c */ + +#undef set_field_userptr +int set_field_userptr( + FIELD *field, + void *usrptr) + { return(*(int *)0); } + +#undef field_userptr +void *field_userptr( + const FIELD *field) + { return(*(void **)0); } + +/* ./frm_cursor.c */ + +#undef pos_form_cursor +int pos_form_cursor( + FORM *form) + { return(*(int *)0); } + +/* ./frm_data.c */ + +#undef data_behind +NCURSES_BOOL data_behind( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef data_ahead +NCURSES_BOOL data_ahead( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +/* ./frm_def.c */ + +#undef _nc_Default_Form +FORM *_nc_Default_Form; + +#undef new_form_sp +FORM *new_form_sp( + SCREEN *sp, + FIELD **fields) + { return(*(FORM **)0); } + +#undef new_form +FORM *new_form( + FIELD **fields) + { return(*(FORM **)0); } + +#undef free_form +int free_form( + FORM *form) + { return(*(int *)0); } + +#undef set_form_fields +int set_form_fields( + FORM *form, + FIELD **fields) + { return(*(int *)0); } + +#undef form_fields +FIELD **form_fields( + const FORM *form) + { return(*(FIELD ***)0); } + +#undef field_count +int field_count( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_driver.c */ + +#undef _nc_get_fieldbuffer +void _nc_get_fieldbuffer( + FORM *form, + FIELD *field, + char *buf) + { /* void */ } + +#undef _nc_Position_Form_Cursor +int _nc_Position_Form_Cursor( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Refresh_Current_Field +int _nc_Refresh_Current_Field( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Synchronize_Attributes +int _nc_Synchronize_Attributes( + FIELD *field) + { return(*(int *)0); } + +#undef _nc_Synchronize_Options +int _nc_Synchronize_Options( + FIELD *field, + Field_Options newopts) + { return(*(int *)0); } + +#undef _nc_Unset_Current_Field +void _nc_Unset_Current_Field( + FORM *form) + { /* void */ } + +#undef _nc_Set_Current_Field +int _nc_Set_Current_Field( + FORM *form, + FIELD *newfield) + { return(*(int *)0); } + +#undef _nc_Internal_Validation +NCURSES_BOOL _nc_Internal_Validation( + FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_First_Active_Field +FIELD *_nc_First_Active_Field( + FORM *form) + { return(*(FIELD **)0); } + +#undef _nc_Set_Form_Page +int _nc_Set_Form_Page( + FORM *form, + int page, + FIELD *field) + { return(*(int *)0); } + +typedef struct +{ + int keycode; + int (*cmd) (FORM *); +} +Binding_Info; + +#undef form_driver +int form_driver( + FORM *form, + int c) + { return(*(int *)0); } + +#undef set_field_buffer +int set_field_buffer( + FIELD *field, + int buffer, + const char *value) + { return(*(int *)0); } + +#undef field_buffer +char *field_buffer( + const FIELD *field, + int buffer) + { return(*(char **)0); } + +/* ./frm_hook.c */ + +#undef set_field_init +int set_field_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_init +Form_Hook field_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_field_term +int set_field_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_term +Form_Hook field_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_init +int set_form_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_init +Form_Hook form_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_term +int set_form_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_term +Form_Hook form_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +/* ./frm_opts.c */ + +#undef set_form_opts +int set_form_opts( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts +Form_Options form_opts( + const FORM *form) + { return(*(Form_Options *)0); } + +#undef form_opts_on +int form_opts_on( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts_off +int form_opts_off( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +/* ./frm_page.c */ + +#undef set_form_page +int set_form_page( + FORM *form, + int page) + { return(*(int *)0); } + +#undef form_page +int form_page( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_post.c */ + +#undef post_form +int post_form( + FORM *form) + { return(*(int *)0); } + +#undef unpost_form +int unpost_form( + FORM *form) + { return(*(int *)0); } + +/* ./frm_req_name.c */ + +#undef form_request_name +const char *form_request_name( + int request) + { return(*(const char **)0); } + +#undef form_request_by_name +int form_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./frm_scale.c */ + +#undef scale_form +int scale_form( + const FORM *form, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./frm_sub.c */ + +#undef set_form_sub +int set_form_sub( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_sub +WINDOW *form_sub( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./frm_user.c */ + +#undef set_form_userptr +int set_form_userptr( + FORM *form, + void *usrptr) + { return(*(int *)0); } + +#undef form_userptr +void *form_userptr( + const FORM *form) + { return(*(void **)0); } + +/* ./frm_win.c */ + +#undef set_form_win +int set_form_win( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_win +WINDOW *form_win( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./fty_alnum.c */ + +typedef struct + { + int width; + } +alnumARG; + +#undef TYPE_ALNUM +FIELDTYPE *TYPE_ALNUM; + +#undef _nc_TYPE_ALNUM +FIELDTYPE *_nc_TYPE_ALNUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_alpha.c */ + +typedef struct + { + int width; + } +alphaARG; + +#undef TYPE_ALPHA +FIELDTYPE *TYPE_ALPHA; + +#undef _nc_TYPE_ALPHA +FIELDTYPE *_nc_TYPE_ALPHA(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_enum.c */ + +typedef struct + { + char **kwds; + int count; + NCURSES_BOOL checkcase; + NCURSES_BOOL checkunique; + } +enumARG; + +typedef struct + { + char **kwds; + int ccase; + int cunique; + } +enumParams; + +#undef TYPE_ENUM +FIELDTYPE *TYPE_ENUM; + +#undef _nc_TYPE_ENUM +FIELDTYPE *_nc_TYPE_ENUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_generic.c */ + +#undef _nc_generic_fieldtype +FIELDTYPE *_nc_generic_fieldtype( + NCURSES_BOOL (*const field_check)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const char_check)( + int p1, + FORM *p2, + FIELD *p3, + const void *p4), + NCURSES_BOOL (*const next)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const prev)( + FORM *p1, + FIELD *p2, + const void *p3), + void (*freecallback)( + void *p1)) + { return(*(FIELDTYPE **)0); } + +#undef _nc_set_generic_fieldtype +int _nc_set_generic_fieldtype( + FIELD *field, + FIELDTYPE *ftyp, + int (*argiterator)( + void **p1)) + { return(*(int *)0); } + +#undef _nc_form_cursor +WINDOW *_nc_form_cursor( + const FORM *form, + int *pRow, + int *pCol) + { return(*(WINDOW **)0); } + +/* ./fty_int.c */ + +typedef struct + { + int precision; + long low; + long high; + } +integerARG; + +typedef struct + { + int precision; + long low; + long high; + } +integerPARM; + +#undef TYPE_INTEGER +FIELDTYPE *TYPE_INTEGER; + +#undef _nc_TYPE_INTEGER +FIELDTYPE *_nc_TYPE_INTEGER(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_ipv4.c */ + +#undef TYPE_IPV4 +FIELDTYPE *TYPE_IPV4; + +#undef _nc_TYPE_IPV4 +FIELDTYPE *_nc_TYPE_IPV4(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_num.c */ + +typedef struct + { + int precision; + double low; + double high; + struct lconv *L; + } +numericARG; + +typedef struct + { + int precision; + double low; + double high; + } +thisPARM; + +#undef TYPE_NUMERIC +FIELDTYPE *TYPE_NUMERIC; + +#undef _nc_TYPE_NUMERIC +FIELDTYPE *_nc_TYPE_NUMERIC(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_regex.c */ + +typedef struct + { + regex_t *pRegExp; + unsigned long *refCount; + } +RegExp_Arg; + +#undef TYPE_REGEXP +FIELDTYPE *TYPE_REGEXP; + +#undef _nc_TYPE_REGEXP +FIELDTYPE *_nc_TYPE_REGEXP(void) + { return(*(FIELDTYPE **)0); } diff --git a/contrib/ncurses/form/llib-lformt b/contrib/ncurses/form/llib-lformt new file mode 100644 index 00000000..d91b3f07 --- /dev/null +++ b/contrib/ncurses/form/llib-lformt @@ -0,0 +1,847 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2010-2015,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./f_trace.c */ + +#include + +#undef _nc_retrace_field_ptr +FIELD **_nc_retrace_field_ptr( + FIELD **code) + { return(*(FIELD ***)0); } + +#undef _nc_retrace_field +FIELD *_nc_retrace_field( + FIELD *code) + { return(*(FIELD **)0); } + +#undef _nc_retrace_field_type +FIELDTYPE *_nc_retrace_field_type( + FIELDTYPE *code) + { return(*(FIELDTYPE **)0); } + +#undef _nc_retrace_form +FORM *_nc_retrace_form( + FORM *code) + { return(*(FORM **)0); } + +#undef _nc_retrace_form_hook +Form_Hook _nc_retrace_form_hook( + Form_Hook code) + { return(*(Form_Hook *)0); } + +/* ./fld_arg.c */ + +#undef set_fieldtype_arg +int set_fieldtype_arg( + FIELDTYPE *typ, + void *(*const make_arg)( + va_list *p1), + void *(*const copy_arg)( + const void *p1), + void (*const free_arg)( + void *p1)) + { return(*(int *)0); } + +#undef field_arg +void *field_arg( + const FIELD *field) + { return(*(void **)0); } + +/* ./fld_attr.c */ + +#undef set_field_fore +int set_field_fore( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_fore +chtype field_fore( + const FIELD *field) + { return(*(chtype *)0); } + +#undef set_field_back +int set_field_back( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_back +chtype field_back( + const FIELD *field) + { return(*(chtype *)0); } + +/* ./fld_current.c */ + +#undef set_current_field +int set_current_field( + FORM *form, + FIELD *field) + { return(*(int *)0); } + +#undef unfocus_current_field +int unfocus_current_field( + FORM *const form) + { return(*(int *)0); } + +#undef current_field +FIELD *current_field( + const FORM *form) + { return(*(FIELD **)0); } + +#undef field_index +int field_index( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_def.c */ + +#undef _nc_Default_Field +FIELD *_nc_Default_Field; + +#undef _nc_Make_Argument +TypeArgument *_nc_Make_Argument( + const FIELDTYPE *typ, + va_list *ap, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Copy_Argument +TypeArgument *_nc_Copy_Argument( + const FIELDTYPE *typ, + const TypeArgument *argp, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Free_Argument +void _nc_Free_Argument( + const FIELDTYPE *typ, + TypeArgument *argp) + { /* void */ } + +#undef _nc_Copy_Type +NCURSES_BOOL _nc_Copy_Type( + FIELD *dst, + FIELD const *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Free_Type +void _nc_Free_Type( + FIELD *field) + { /* void */ } + +#undef new_field +FIELD *new_field( + int rows, + int cols, + int frow, + int fcol, + int nrow, + int nbuf) + { return(*(FIELD **)0); } + +#undef free_field +int free_field( + FIELD *field) + { return(*(int *)0); } + +/* ./fld_dup.c */ + +#undef dup_field +FIELD *dup_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_ftchoice.c */ + +#undef set_fieldtype_choice +int set_fieldtype_choice( + FIELDTYPE *typ, + NCURSES_BOOL (*const next_choice)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const prev_choice)( + FIELD *p1, + const void *p2)) + { return(*(int *)0); } + +/* ./fld_ftlink.c */ + +#undef link_fieldtype +FIELDTYPE *link_fieldtype( + FIELDTYPE *type1, + FIELDTYPE *type2) + { return(*(FIELDTYPE **)0); } + +/* ./fld_info.c */ + +#undef field_info +int field_info( + const FIELD *field, + int *rows, + int *cols, + int *frow, + int *fcol, + int *nrow, + int *nbuf) + { return(*(int *)0); } + +#undef dynamic_field_info +int dynamic_field_info( + const FIELD *field, + int *drows, + int *dcols, + int *maxgrow) + { return(*(int *)0); } + +/* ./fld_just.c */ + +#undef set_field_just +int set_field_just( + FIELD *field, + int just) + { return(*(int *)0); } + +#undef field_just +int field_just( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_link.c */ + +#undef link_field +FIELD *link_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_max.c */ + +#undef set_max_field +int set_max_field( + FIELD *field, + int maxgrow) + { return(*(int *)0); } + +/* ./fld_move.c */ + +#undef move_field +int move_field( + FIELD *field, + int frow, + int fcol) + { return(*(int *)0); } + +/* ./fld_newftyp.c */ + +#undef _nc_Default_FieldType +FIELDTYPE *_nc_Default_FieldType; + +#undef new_fieldtype +FIELDTYPE *new_fieldtype( + NCURSES_BOOL (*const field_check)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const char_check)( + int p1, + const void *p2)) + { return(*(FIELDTYPE **)0); } + +#undef free_fieldtype +int free_fieldtype( + FIELDTYPE *typ) + { return(*(int *)0); } + +/* ./fld_opts.c */ + +#undef set_field_opts +int set_field_opts( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts +Field_Options field_opts( + const FIELD *field) + { return(*(Field_Options *)0); } + +#undef field_opts_on +int field_opts_on( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts_off +int field_opts_off( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +/* ./fld_pad.c */ + +#undef set_field_pad +int set_field_pad( + FIELD *field, + int ch) + { return(*(int *)0); } + +#undef field_pad +int field_pad( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_page.c */ + +#undef set_new_page +int set_new_page( + FIELD *field, + NCURSES_BOOL new_page_flag) + { return(*(int *)0); } + +#undef new_page +NCURSES_BOOL new_page( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_stat.c */ + +#undef set_field_status +int set_field_status( + FIELD *field, + NCURSES_BOOL status) + { return(*(int *)0); } + +#undef field_status +NCURSES_BOOL field_status( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_type.c */ + +#undef set_field_type +int set_field_type( + FIELD *field, + FIELDTYPE *type, + ...) + { return(*(int *)0); } + +#undef field_type +FIELDTYPE *field_type( + const FIELD *field) + { return(*(FIELDTYPE **)0); } + +/* ./fld_user.c */ + +#undef set_field_userptr +int set_field_userptr( + FIELD *field, + void *usrptr) + { return(*(int *)0); } + +#undef field_userptr +void *field_userptr( + const FIELD *field) + { return(*(void **)0); } + +/* ./frm_cursor.c */ + +#undef pos_form_cursor +int pos_form_cursor( + FORM *form) + { return(*(int *)0); } + +/* ./frm_data.c */ + +#undef data_behind +NCURSES_BOOL data_behind( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef data_ahead +NCURSES_BOOL data_ahead( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +/* ./frm_def.c */ + +#undef _nc_Default_Form +FORM *_nc_Default_Form; + +#undef new_form_sp +FORM *new_form_sp( + SCREEN *sp, + FIELD **fields) + { return(*(FORM **)0); } + +#undef new_form +FORM *new_form( + FIELD **fields) + { return(*(FORM **)0); } + +#undef free_form +int free_form( + FORM *form) + { return(*(int *)0); } + +#undef set_form_fields +int set_form_fields( + FORM *form, + FIELD **fields) + { return(*(int *)0); } + +#undef form_fields +FIELD **form_fields( + const FORM *form) + { return(*(FIELD ***)0); } + +#undef field_count +int field_count( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_driver.c */ + +#undef _nc_get_fieldbuffer +void _nc_get_fieldbuffer( + FORM *form, + FIELD *field, + char *buf) + { /* void */ } + +#undef _nc_Position_Form_Cursor +int _nc_Position_Form_Cursor( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Refresh_Current_Field +int _nc_Refresh_Current_Field( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Synchronize_Attributes +int _nc_Synchronize_Attributes( + FIELD *field) + { return(*(int *)0); } + +#undef _nc_Synchronize_Options +int _nc_Synchronize_Options( + FIELD *field, + Field_Options newopts) + { return(*(int *)0); } + +#undef _nc_Unset_Current_Field +void _nc_Unset_Current_Field( + FORM *form) + { /* void */ } + +#undef _nc_Set_Current_Field +int _nc_Set_Current_Field( + FORM *form, + FIELD *newfield) + { return(*(int *)0); } + +#undef _nc_Internal_Validation +NCURSES_BOOL _nc_Internal_Validation( + FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_First_Active_Field +FIELD *_nc_First_Active_Field( + FORM *form) + { return(*(FIELD **)0); } + +#undef _nc_Set_Form_Page +int _nc_Set_Form_Page( + FORM *form, + int page, + FIELD *field) + { return(*(int *)0); } + +typedef struct +{ + int keycode; + int (*cmd) (FORM *); +} +Binding_Info; + +#undef form_driver +int form_driver( + FORM *form, + int c) + { return(*(int *)0); } + +#undef set_field_buffer +int set_field_buffer( + FIELD *field, + int buffer, + const char *value) + { return(*(int *)0); } + +#undef field_buffer +char *field_buffer( + const FIELD *field, + int buffer) + { return(*(char **)0); } + +/* ./frm_hook.c */ + +#undef set_field_init +int set_field_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_init +Form_Hook field_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_field_term +int set_field_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_term +Form_Hook field_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_init +int set_form_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_init +Form_Hook form_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_term +int set_form_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_term +Form_Hook form_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +/* ./frm_opts.c */ + +#undef set_form_opts +int set_form_opts( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts +Form_Options form_opts( + const FORM *form) + { return(*(Form_Options *)0); } + +#undef form_opts_on +int form_opts_on( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts_off +int form_opts_off( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +/* ./frm_page.c */ + +#undef set_form_page +int set_form_page( + FORM *form, + int page) + { return(*(int *)0); } + +#undef form_page +int form_page( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_post.c */ + +#undef post_form +int post_form( + FORM *form) + { return(*(int *)0); } + +#undef unpost_form +int unpost_form( + FORM *form) + { return(*(int *)0); } + +/* ./frm_req_name.c */ + +#undef form_request_name +const char *form_request_name( + int request) + { return(*(const char **)0); } + +#undef form_request_by_name +int form_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./frm_scale.c */ + +#undef scale_form +int scale_form( + const FORM *form, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./frm_sub.c */ + +#undef set_form_sub +int set_form_sub( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_sub +WINDOW *form_sub( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./frm_user.c */ + +#undef set_form_userptr +int set_form_userptr( + FORM *form, + void *usrptr) + { return(*(int *)0); } + +#undef form_userptr +void *form_userptr( + const FORM *form) + { return(*(void **)0); } + +/* ./frm_win.c */ + +#undef set_form_win +int set_form_win( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_win +WINDOW *form_win( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./fty_alnum.c */ + +typedef struct + { + int width; + } +alnumARG; + +#undef TYPE_ALNUM +FIELDTYPE *TYPE_ALNUM; + +#undef _nc_TYPE_ALNUM +FIELDTYPE *_nc_TYPE_ALNUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_alpha.c */ + +typedef struct + { + int width; + } +alphaARG; + +#undef TYPE_ALPHA +FIELDTYPE *TYPE_ALPHA; + +#undef _nc_TYPE_ALPHA +FIELDTYPE *_nc_TYPE_ALPHA(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_enum.c */ + +typedef struct + { + char **kwds; + int count; + NCURSES_BOOL checkcase; + NCURSES_BOOL checkunique; + } +enumARG; + +typedef struct + { + char **kwds; + int ccase; + int cunique; + } +enumParams; + +#undef TYPE_ENUM +FIELDTYPE *TYPE_ENUM; + +#undef _nc_TYPE_ENUM +FIELDTYPE *_nc_TYPE_ENUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_generic.c */ + +#undef _nc_generic_fieldtype +FIELDTYPE *_nc_generic_fieldtype( + NCURSES_BOOL (*const field_check)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const char_check)( + int p1, + FORM *p2, + FIELD *p3, + const void *p4), + NCURSES_BOOL (*const next)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const prev)( + FORM *p1, + FIELD *p2, + const void *p3), + void (*freecallback)( + void *p1)) + { return(*(FIELDTYPE **)0); } + +#undef _nc_set_generic_fieldtype +int _nc_set_generic_fieldtype( + FIELD *field, + FIELDTYPE *ftyp, + int (*argiterator)( + void **p1)) + { return(*(int *)0); } + +#undef _nc_form_cursor +WINDOW *_nc_form_cursor( + const FORM *form, + int *pRow, + int *pCol) + { return(*(WINDOW **)0); } + +/* ./fty_int.c */ + +typedef struct + { + int precision; + long low; + long high; + } +integerARG; + +typedef struct + { + int precision; + long low; + long high; + } +integerPARM; + +#undef TYPE_INTEGER +FIELDTYPE *TYPE_INTEGER; + +#undef _nc_TYPE_INTEGER +FIELDTYPE *_nc_TYPE_INTEGER(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_ipv4.c */ + +#undef TYPE_IPV4 +FIELDTYPE *TYPE_IPV4; + +#undef _nc_TYPE_IPV4 +FIELDTYPE *_nc_TYPE_IPV4(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_num.c */ + +typedef struct + { + int precision; + double low; + double high; + struct lconv *L; + } +numericARG; + +typedef struct + { + int precision; + double low; + double high; + } +thisPARM; + +#undef TYPE_NUMERIC +FIELDTYPE *TYPE_NUMERIC; + +#undef _nc_TYPE_NUMERIC +FIELDTYPE *_nc_TYPE_NUMERIC(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_regex.c */ + +typedef struct + { + regex_t *pRegExp; + unsigned long *refCount; + } +RegExp_Arg; + +#undef TYPE_REGEXP +FIELDTYPE *TYPE_REGEXP; + +#undef _nc_TYPE_REGEXP +FIELDTYPE *_nc_TYPE_REGEXP(void) + { return(*(FIELDTYPE **)0); } diff --git a/contrib/ncurses/form/llib-lformtw b/contrib/ncurses/form/llib-lformtw new file mode 100644 index 00000000..340bf59c --- /dev/null +++ b/contrib/ncurses/form/llib-lformtw @@ -0,0 +1,860 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2010-2015,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./f_trace.c */ + +#include + +#undef _nc_retrace_field_ptr +FIELD **_nc_retrace_field_ptr( + FIELD **code) + { return(*(FIELD ***)0); } + +#undef _nc_retrace_field +FIELD *_nc_retrace_field( + FIELD *code) + { return(*(FIELD **)0); } + +#undef _nc_retrace_field_type +FIELDTYPE *_nc_retrace_field_type( + FIELDTYPE *code) + { return(*(FIELDTYPE **)0); } + +#undef _nc_retrace_form +FORM *_nc_retrace_form( + FORM *code) + { return(*(FORM **)0); } + +#undef _nc_retrace_form_hook +Form_Hook _nc_retrace_form_hook( + Form_Hook code) + { return(*(Form_Hook *)0); } + +/* ./fld_arg.c */ + +#undef set_fieldtype_arg +int set_fieldtype_arg( + FIELDTYPE *typ, + void *(*const make_arg)( + va_list *p1), + void *(*const copy_arg)( + const void *p1), + void (*const free_arg)( + void *p1)) + { return(*(int *)0); } + +#undef field_arg +void *field_arg( + const FIELD *field) + { return(*(void **)0); } + +/* ./fld_attr.c */ + +#undef set_field_fore +int set_field_fore( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_fore +chtype field_fore( + const FIELD *field) + { return(*(chtype *)0); } + +#undef set_field_back +int set_field_back( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_back +chtype field_back( + const FIELD *field) + { return(*(chtype *)0); } + +/* ./fld_current.c */ + +#undef set_current_field +int set_current_field( + FORM *form, + FIELD *field) + { return(*(int *)0); } + +#undef unfocus_current_field +int unfocus_current_field( + FORM *const form) + { return(*(int *)0); } + +#undef current_field +FIELD *current_field( + const FORM *form) + { return(*(FIELD **)0); } + +#undef field_index +int field_index( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_def.c */ + +#undef _nc_Default_Field +FIELD *_nc_Default_Field; + +#undef _nc_Make_Argument +TypeArgument *_nc_Make_Argument( + const FIELDTYPE *typ, + va_list *ap, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Copy_Argument +TypeArgument *_nc_Copy_Argument( + const FIELDTYPE *typ, + const TypeArgument *argp, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Free_Argument +void _nc_Free_Argument( + const FIELDTYPE *typ, + TypeArgument *argp) + { /* void */ } + +#undef _nc_Copy_Type +NCURSES_BOOL _nc_Copy_Type( + FIELD *dst, + FIELD const *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Free_Type +void _nc_Free_Type( + FIELD *field) + { /* void */ } + +#undef new_field +FIELD *new_field( + int rows, + int cols, + int frow, + int fcol, + int nrow, + int nbuf) + { return(*(FIELD **)0); } + +#undef free_field +int free_field( + FIELD *field) + { return(*(int *)0); } + +/* ./fld_dup.c */ + +#undef dup_field +FIELD *dup_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_ftchoice.c */ + +#undef set_fieldtype_choice +int set_fieldtype_choice( + FIELDTYPE *typ, + NCURSES_BOOL (*const next_choice)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const prev_choice)( + FIELD *p1, + const void *p2)) + { return(*(int *)0); } + +/* ./fld_ftlink.c */ + +#undef link_fieldtype +FIELDTYPE *link_fieldtype( + FIELDTYPE *type1, + FIELDTYPE *type2) + { return(*(FIELDTYPE **)0); } + +/* ./fld_info.c */ + +#undef field_info +int field_info( + const FIELD *field, + int *rows, + int *cols, + int *frow, + int *fcol, + int *nrow, + int *nbuf) + { return(*(int *)0); } + +#undef dynamic_field_info +int dynamic_field_info( + const FIELD *field, + int *drows, + int *dcols, + int *maxgrow) + { return(*(int *)0); } + +/* ./fld_just.c */ + +#undef set_field_just +int set_field_just( + FIELD *field, + int just) + { return(*(int *)0); } + +#undef field_just +int field_just( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_link.c */ + +#undef link_field +FIELD *link_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_max.c */ + +#undef set_max_field +int set_max_field( + FIELD *field, + int maxgrow) + { return(*(int *)0); } + +/* ./fld_move.c */ + +#undef move_field +int move_field( + FIELD *field, + int frow, + int fcol) + { return(*(int *)0); } + +/* ./fld_newftyp.c */ + +#undef _nc_Default_FieldType +FIELDTYPE *_nc_Default_FieldType; + +#undef new_fieldtype +FIELDTYPE *new_fieldtype( + NCURSES_BOOL (*const field_check)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const char_check)( + int p1, + const void *p2)) + { return(*(FIELDTYPE **)0); } + +#undef free_fieldtype +int free_fieldtype( + FIELDTYPE *typ) + { return(*(int *)0); } + +/* ./fld_opts.c */ + +#undef set_field_opts +int set_field_opts( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts +Field_Options field_opts( + const FIELD *field) + { return(*(Field_Options *)0); } + +#undef field_opts_on +int field_opts_on( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts_off +int field_opts_off( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +/* ./fld_pad.c */ + +#undef set_field_pad +int set_field_pad( + FIELD *field, + int ch) + { return(*(int *)0); } + +#undef field_pad +int field_pad( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_page.c */ + +#undef set_new_page +int set_new_page( + FIELD *field, + NCURSES_BOOL new_page_flag) + { return(*(int *)0); } + +#undef new_page +NCURSES_BOOL new_page( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_stat.c */ + +#undef set_field_status +int set_field_status( + FIELD *field, + NCURSES_BOOL status) + { return(*(int *)0); } + +#undef field_status +NCURSES_BOOL field_status( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_type.c */ + +#undef set_field_type +int set_field_type( + FIELD *field, + FIELDTYPE *type, + ...) + { return(*(int *)0); } + +#undef field_type +FIELDTYPE *field_type( + const FIELD *field) + { return(*(FIELDTYPE **)0); } + +/* ./fld_user.c */ + +#undef set_field_userptr +int set_field_userptr( + FIELD *field, + void *usrptr) + { return(*(int *)0); } + +#undef field_userptr +void *field_userptr( + const FIELD *field) + { return(*(void **)0); } + +/* ./frm_cursor.c */ + +#undef pos_form_cursor +int pos_form_cursor( + FORM *form) + { return(*(int *)0); } + +/* ./frm_data.c */ + +#undef data_behind +NCURSES_BOOL data_behind( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef data_ahead +NCURSES_BOOL data_ahead( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +/* ./frm_def.c */ + +#undef _nc_Default_Form +FORM *_nc_Default_Form; + +#undef new_form_sp +FORM *new_form_sp( + SCREEN *sp, + FIELD **fields) + { return(*(FORM **)0); } + +#undef new_form +FORM *new_form( + FIELD **fields) + { return(*(FORM **)0); } + +#undef free_form +int free_form( + FORM *form) + { return(*(int *)0); } + +#undef set_form_fields +int set_form_fields( + FORM *form, + FIELD **fields) + { return(*(int *)0); } + +#undef form_fields +FIELD **form_fields( + const FORM *form) + { return(*(FIELD ***)0); } + +#undef field_count +int field_count( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_driver.c */ + +#undef _nc_get_fieldbuffer +void _nc_get_fieldbuffer( + FORM *form, + FIELD *field, + cchar_t *buf) + { /* void */ } + +#undef _nc_Position_Form_Cursor +int _nc_Position_Form_Cursor( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Refresh_Current_Field +int _nc_Refresh_Current_Field( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Synchronize_Attributes +int _nc_Synchronize_Attributes( + FIELD *field) + { return(*(int *)0); } + +#undef _nc_Synchronize_Options +int _nc_Synchronize_Options( + FIELD *field, + Field_Options newopts) + { return(*(int *)0); } + +#undef _nc_Unset_Current_Field +void _nc_Unset_Current_Field( + FORM *form) + { /* void */ } + +#undef _nc_Set_Current_Field +int _nc_Set_Current_Field( + FORM *form, + FIELD *newfield) + { return(*(int *)0); } + +#undef _nc_Internal_Validation +NCURSES_BOOL _nc_Internal_Validation( + FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_First_Active_Field +FIELD *_nc_First_Active_Field( + FORM *form) + { return(*(FIELD **)0); } + +#undef _nc_Set_Form_Page +int _nc_Set_Form_Page( + FORM *form, + int page, + FIELD *field) + { return(*(int *)0); } + +typedef struct +{ + int keycode; + int (*cmd) (FORM *); +} +Binding_Info; + +#undef form_driver +int form_driver( + FORM *form, + int c) + { return(*(int *)0); } + +#undef form_driver_w +int form_driver_w( + FORM *form, + int type, + wchar_t c) + { return(*(int *)0); } + +#undef set_field_buffer +int set_field_buffer( + FIELD *field, + int buffer, + const char *value) + { return(*(int *)0); } + +#undef field_buffer +char *field_buffer( + const FIELD *field, + int buffer) + { return(*(char **)0); } + +#undef _nc_Widen_String +wchar_t *_nc_Widen_String( + char *source, + int *lengthp) + { return(*(wchar_t **)0); } + +/* ./frm_hook.c */ + +#undef set_field_init +int set_field_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_init +Form_Hook field_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_field_term +int set_field_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_term +Form_Hook field_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_init +int set_form_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_init +Form_Hook form_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_term +int set_form_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_term +Form_Hook form_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +/* ./frm_opts.c */ + +#undef set_form_opts +int set_form_opts( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts +Form_Options form_opts( + const FORM *form) + { return(*(Form_Options *)0); } + +#undef form_opts_on +int form_opts_on( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts_off +int form_opts_off( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +/* ./frm_page.c */ + +#undef set_form_page +int set_form_page( + FORM *form, + int page) + { return(*(int *)0); } + +#undef form_page +int form_page( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_post.c */ + +#undef post_form +int post_form( + FORM *form) + { return(*(int *)0); } + +#undef unpost_form +int unpost_form( + FORM *form) + { return(*(int *)0); } + +/* ./frm_req_name.c */ + +#undef form_request_name +const char *form_request_name( + int request) + { return(*(const char **)0); } + +#undef form_request_by_name +int form_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./frm_scale.c */ + +#undef scale_form +int scale_form( + const FORM *form, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./frm_sub.c */ + +#undef set_form_sub +int set_form_sub( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_sub +WINDOW *form_sub( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./frm_user.c */ + +#undef set_form_userptr +int set_form_userptr( + FORM *form, + void *usrptr) + { return(*(int *)0); } + +#undef form_userptr +void *form_userptr( + const FORM *form) + { return(*(void **)0); } + +/* ./frm_win.c */ + +#undef set_form_win +int set_form_win( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_win +WINDOW *form_win( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./fty_alnum.c */ + +typedef struct + { + int width; + } +alnumARG; + +#undef TYPE_ALNUM +FIELDTYPE *TYPE_ALNUM; + +#undef _nc_TYPE_ALNUM +FIELDTYPE *_nc_TYPE_ALNUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_alpha.c */ + +typedef struct + { + int width; + } +alphaARG; + +#undef TYPE_ALPHA +FIELDTYPE *TYPE_ALPHA; + +#undef _nc_TYPE_ALPHA +FIELDTYPE *_nc_TYPE_ALPHA(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_enum.c */ + +typedef struct + { + char **kwds; + int count; + NCURSES_BOOL checkcase; + NCURSES_BOOL checkunique; + } +enumARG; + +typedef struct + { + char **kwds; + int ccase; + int cunique; + } +enumParams; + +#undef TYPE_ENUM +FIELDTYPE *TYPE_ENUM; + +#undef _nc_TYPE_ENUM +FIELDTYPE *_nc_TYPE_ENUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_generic.c */ + +#undef _nc_generic_fieldtype +FIELDTYPE *_nc_generic_fieldtype( + NCURSES_BOOL (*const field_check)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const char_check)( + int p1, + FORM *p2, + FIELD *p3, + const void *p4), + NCURSES_BOOL (*const next)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const prev)( + FORM *p1, + FIELD *p2, + const void *p3), + void (*freecallback)( + void *p1)) + { return(*(FIELDTYPE **)0); } + +#undef _nc_set_generic_fieldtype +int _nc_set_generic_fieldtype( + FIELD *field, + FIELDTYPE *ftyp, + int (*argiterator)( + void **p1)) + { return(*(int *)0); } + +#undef _nc_form_cursor +WINDOW *_nc_form_cursor( + const FORM *form, + int *pRow, + int *pCol) + { return(*(WINDOW **)0); } + +/* ./fty_int.c */ + +typedef struct + { + int precision; + long low; + long high; + } +integerARG; + +typedef struct + { + int precision; + long low; + long high; + } +integerPARM; + +#undef TYPE_INTEGER +FIELDTYPE *TYPE_INTEGER; + +#undef _nc_TYPE_INTEGER +FIELDTYPE *_nc_TYPE_INTEGER(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_ipv4.c */ + +#undef TYPE_IPV4 +FIELDTYPE *TYPE_IPV4; + +#undef _nc_TYPE_IPV4 +FIELDTYPE *_nc_TYPE_IPV4(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_num.c */ + +typedef struct + { + int precision; + double low; + double high; + struct lconv *L; + } +numericARG; + +typedef struct + { + int precision; + double low; + double high; + } +thisPARM; + +#undef TYPE_NUMERIC +FIELDTYPE *TYPE_NUMERIC; + +#undef _nc_TYPE_NUMERIC +FIELDTYPE *_nc_TYPE_NUMERIC(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_regex.c */ + +typedef struct + { + regex_t *pRegExp; + unsigned long *refCount; + } +RegExp_Arg; + +#undef TYPE_REGEXP +FIELDTYPE *TYPE_REGEXP; + +#undef _nc_TYPE_REGEXP +FIELDTYPE *_nc_TYPE_REGEXP(void) + { return(*(FIELDTYPE **)0); } diff --git a/contrib/ncurses/form/llib-lformw b/contrib/ncurses/form/llib-lformw new file mode 100644 index 00000000..199e26c3 --- /dev/null +++ b/contrib/ncurses/form/llib-lformw @@ -0,0 +1,860 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2002-2015,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2002-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./f_trace.c */ + +#include + +#undef _nc_retrace_field_ptr +FIELD **_nc_retrace_field_ptr( + FIELD **code) + { return(*(FIELD ***)0); } + +#undef _nc_retrace_field +FIELD *_nc_retrace_field( + FIELD *code) + { return(*(FIELD **)0); } + +#undef _nc_retrace_field_type +FIELDTYPE *_nc_retrace_field_type( + FIELDTYPE *code) + { return(*(FIELDTYPE **)0); } + +#undef _nc_retrace_form +FORM *_nc_retrace_form( + FORM *code) + { return(*(FORM **)0); } + +#undef _nc_retrace_form_hook +Form_Hook _nc_retrace_form_hook( + Form_Hook code) + { return(*(Form_Hook *)0); } + +/* ./fld_arg.c */ + +#undef set_fieldtype_arg +int set_fieldtype_arg( + FIELDTYPE *typ, + void *(*const make_arg)( + va_list *p1), + void *(*const copy_arg)( + const void *p1), + void (*const free_arg)( + void *p1)) + { return(*(int *)0); } + +#undef field_arg +void *field_arg( + const FIELD *field) + { return(*(void **)0); } + +/* ./fld_attr.c */ + +#undef set_field_fore +int set_field_fore( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_fore +chtype field_fore( + const FIELD *field) + { return(*(chtype *)0); } + +#undef set_field_back +int set_field_back( + FIELD *field, + chtype attr) + { return(*(int *)0); } + +#undef field_back +chtype field_back( + const FIELD *field) + { return(*(chtype *)0); } + +/* ./fld_current.c */ + +#undef set_current_field +int set_current_field( + FORM *form, + FIELD *field) + { return(*(int *)0); } + +#undef unfocus_current_field +int unfocus_current_field( + FORM *const form) + { return(*(int *)0); } + +#undef current_field +FIELD *current_field( + const FORM *form) + { return(*(FIELD **)0); } + +#undef field_index +int field_index( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_def.c */ + +#undef _nc_Default_Field +FIELD *_nc_Default_Field; + +#undef _nc_Make_Argument +TypeArgument *_nc_Make_Argument( + const FIELDTYPE *typ, + va_list *ap, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Copy_Argument +TypeArgument *_nc_Copy_Argument( + const FIELDTYPE *typ, + const TypeArgument *argp, + int *err) + { return(*(TypeArgument **)0); } + +#undef _nc_Free_Argument +void _nc_Free_Argument( + const FIELDTYPE *typ, + TypeArgument *argp) + { /* void */ } + +#undef _nc_Copy_Type +NCURSES_BOOL _nc_Copy_Type( + FIELD *dst, + FIELD const *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Free_Type +void _nc_Free_Type( + FIELD *field) + { /* void */ } + +#undef new_field +FIELD *new_field( + int rows, + int cols, + int frow, + int fcol, + int nrow, + int nbuf) + { return(*(FIELD **)0); } + +#undef free_field +int free_field( + FIELD *field) + { return(*(int *)0); } + +/* ./fld_dup.c */ + +#undef dup_field +FIELD *dup_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_ftchoice.c */ + +#undef set_fieldtype_choice +int set_fieldtype_choice( + FIELDTYPE *typ, + NCURSES_BOOL (*const next_choice)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const prev_choice)( + FIELD *p1, + const void *p2)) + { return(*(int *)0); } + +/* ./fld_ftlink.c */ + +#undef link_fieldtype +FIELDTYPE *link_fieldtype( + FIELDTYPE *type1, + FIELDTYPE *type2) + { return(*(FIELDTYPE **)0); } + +/* ./fld_info.c */ + +#undef field_info +int field_info( + const FIELD *field, + int *rows, + int *cols, + int *frow, + int *fcol, + int *nrow, + int *nbuf) + { return(*(int *)0); } + +#undef dynamic_field_info +int dynamic_field_info( + const FIELD *field, + int *drows, + int *dcols, + int *maxgrow) + { return(*(int *)0); } + +/* ./fld_just.c */ + +#undef set_field_just +int set_field_just( + FIELD *field, + int just) + { return(*(int *)0); } + +#undef field_just +int field_just( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_link.c */ + +#undef link_field +FIELD *link_field( + FIELD *field, + int frow, + int fcol) + { return(*(FIELD **)0); } + +/* ./fld_max.c */ + +#undef set_max_field +int set_max_field( + FIELD *field, + int maxgrow) + { return(*(int *)0); } + +/* ./fld_move.c */ + +#undef move_field +int move_field( + FIELD *field, + int frow, + int fcol) + { return(*(int *)0); } + +/* ./fld_newftyp.c */ + +#undef _nc_Default_FieldType +FIELDTYPE *_nc_Default_FieldType; + +#undef new_fieldtype +FIELDTYPE *new_fieldtype( + NCURSES_BOOL (*const field_check)( + FIELD *p1, + const void *p2), + NCURSES_BOOL (*const char_check)( + int p1, + const void *p2)) + { return(*(FIELDTYPE **)0); } + +#undef free_fieldtype +int free_fieldtype( + FIELDTYPE *typ) + { return(*(int *)0); } + +/* ./fld_opts.c */ + +#undef set_field_opts +int set_field_opts( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts +Field_Options field_opts( + const FIELD *field) + { return(*(Field_Options *)0); } + +#undef field_opts_on +int field_opts_on( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +#undef field_opts_off +int field_opts_off( + FIELD *field, + Field_Options opts) + { return(*(int *)0); } + +/* ./fld_pad.c */ + +#undef set_field_pad +int set_field_pad( + FIELD *field, + int ch) + { return(*(int *)0); } + +#undef field_pad +int field_pad( + const FIELD *field) + { return(*(int *)0); } + +/* ./fld_page.c */ + +#undef set_new_page +int set_new_page( + FIELD *field, + NCURSES_BOOL new_page_flag) + { return(*(int *)0); } + +#undef new_page +NCURSES_BOOL new_page( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_stat.c */ + +#undef set_field_status +int set_field_status( + FIELD *field, + NCURSES_BOOL status) + { return(*(int *)0); } + +#undef field_status +NCURSES_BOOL field_status( + const FIELD *field) + { return(*(NCURSES_BOOL *)0); } + +/* ./fld_type.c */ + +#undef set_field_type +int set_field_type( + FIELD *field, + FIELDTYPE *type, + ...) + { return(*(int *)0); } + +#undef field_type +FIELDTYPE *field_type( + const FIELD *field) + { return(*(FIELDTYPE **)0); } + +/* ./fld_user.c */ + +#undef set_field_userptr +int set_field_userptr( + FIELD *field, + void *usrptr) + { return(*(int *)0); } + +#undef field_userptr +void *field_userptr( + const FIELD *field) + { return(*(void **)0); } + +/* ./frm_cursor.c */ + +#undef pos_form_cursor +int pos_form_cursor( + FORM *form) + { return(*(int *)0); } + +/* ./frm_data.c */ + +#undef data_behind +NCURSES_BOOL data_behind( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef data_ahead +NCURSES_BOOL data_ahead( + const FORM *form) + { return(*(NCURSES_BOOL *)0); } + +/* ./frm_def.c */ + +#undef _nc_Default_Form +FORM *_nc_Default_Form; + +#undef new_form_sp +FORM *new_form_sp( + SCREEN *sp, + FIELD **fields) + { return(*(FORM **)0); } + +#undef new_form +FORM *new_form( + FIELD **fields) + { return(*(FORM **)0); } + +#undef free_form +int free_form( + FORM *form) + { return(*(int *)0); } + +#undef set_form_fields +int set_form_fields( + FORM *form, + FIELD **fields) + { return(*(int *)0); } + +#undef form_fields +FIELD **form_fields( + const FORM *form) + { return(*(FIELD ***)0); } + +#undef field_count +int field_count( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_driver.c */ + +#undef _nc_get_fieldbuffer +void _nc_get_fieldbuffer( + FORM *form, + FIELD *field, + cchar_t *buf) + { /* void */ } + +#undef _nc_Position_Form_Cursor +int _nc_Position_Form_Cursor( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Refresh_Current_Field +int _nc_Refresh_Current_Field( + FORM *form) + { return(*(int *)0); } + +#undef _nc_Synchronize_Attributes +int _nc_Synchronize_Attributes( + FIELD *field) + { return(*(int *)0); } + +#undef _nc_Synchronize_Options +int _nc_Synchronize_Options( + FIELD *field, + Field_Options newopts) + { return(*(int *)0); } + +#undef _nc_Unset_Current_Field +void _nc_Unset_Current_Field( + FORM *form) + { /* void */ } + +#undef _nc_Set_Current_Field +int _nc_Set_Current_Field( + FORM *form, + FIELD *newfield) + { return(*(int *)0); } + +#undef _nc_Internal_Validation +NCURSES_BOOL _nc_Internal_Validation( + FORM *form) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_First_Active_Field +FIELD *_nc_First_Active_Field( + FORM *form) + { return(*(FIELD **)0); } + +#undef _nc_Set_Form_Page +int _nc_Set_Form_Page( + FORM *form, + int page, + FIELD *field) + { return(*(int *)0); } + +typedef struct +{ + int keycode; + int (*cmd) (FORM *); +} +Binding_Info; + +#undef form_driver +int form_driver( + FORM *form, + int c) + { return(*(int *)0); } + +#undef form_driver_w +int form_driver_w( + FORM *form, + int type, + wchar_t c) + { return(*(int *)0); } + +#undef set_field_buffer +int set_field_buffer( + FIELD *field, + int buffer, + const char *value) + { return(*(int *)0); } + +#undef field_buffer +char *field_buffer( + const FIELD *field, + int buffer) + { return(*(char **)0); } + +#undef _nc_Widen_String +wchar_t *_nc_Widen_String( + char *source, + int *lengthp) + { return(*(wchar_t **)0); } + +/* ./frm_hook.c */ + +#undef set_field_init +int set_field_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_init +Form_Hook field_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_field_term +int set_field_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef field_term +Form_Hook field_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_init +int set_form_init( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_init +Form_Hook form_init( + const FORM *form) + { return(*(Form_Hook *)0); } + +#undef set_form_term +int set_form_term( + FORM *form, + Form_Hook func) + { return(*(int *)0); } + +#undef form_term +Form_Hook form_term( + const FORM *form) + { return(*(Form_Hook *)0); } + +/* ./frm_opts.c */ + +#undef set_form_opts +int set_form_opts( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts +Form_Options form_opts( + const FORM *form) + { return(*(Form_Options *)0); } + +#undef form_opts_on +int form_opts_on( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +#undef form_opts_off +int form_opts_off( + FORM *form, + Form_Options opts) + { return(*(int *)0); } + +/* ./frm_page.c */ + +#undef set_form_page +int set_form_page( + FORM *form, + int page) + { return(*(int *)0); } + +#undef form_page +int form_page( + const FORM *form) + { return(*(int *)0); } + +/* ./frm_post.c */ + +#undef post_form +int post_form( + FORM *form) + { return(*(int *)0); } + +#undef unpost_form +int unpost_form( + FORM *form) + { return(*(int *)0); } + +/* ./frm_req_name.c */ + +#undef form_request_name +const char *form_request_name( + int request) + { return(*(const char **)0); } + +#undef form_request_by_name +int form_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./frm_scale.c */ + +#undef scale_form +int scale_form( + const FORM *form, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./frm_sub.c */ + +#undef set_form_sub +int set_form_sub( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_sub +WINDOW *form_sub( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./frm_user.c */ + +#undef set_form_userptr +int set_form_userptr( + FORM *form, + void *usrptr) + { return(*(int *)0); } + +#undef form_userptr +void *form_userptr( + const FORM *form) + { return(*(void **)0); } + +/* ./frm_win.c */ + +#undef set_form_win +int set_form_win( + FORM *form, + WINDOW *win) + { return(*(int *)0); } + +#undef form_win +WINDOW *form_win( + const FORM *form) + { return(*(WINDOW **)0); } + +/* ./fty_alnum.c */ + +typedef struct + { + int width; + } +alnumARG; + +#undef TYPE_ALNUM +FIELDTYPE *TYPE_ALNUM; + +#undef _nc_TYPE_ALNUM +FIELDTYPE *_nc_TYPE_ALNUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_alpha.c */ + +typedef struct + { + int width; + } +alphaARG; + +#undef TYPE_ALPHA +FIELDTYPE *TYPE_ALPHA; + +#undef _nc_TYPE_ALPHA +FIELDTYPE *_nc_TYPE_ALPHA(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_enum.c */ + +typedef struct + { + char **kwds; + int count; + NCURSES_BOOL checkcase; + NCURSES_BOOL checkunique; + } +enumARG; + +typedef struct + { + char **kwds; + int ccase; + int cunique; + } +enumParams; + +#undef TYPE_ENUM +FIELDTYPE *TYPE_ENUM; + +#undef _nc_TYPE_ENUM +FIELDTYPE *_nc_TYPE_ENUM(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_generic.c */ + +#undef _nc_generic_fieldtype +FIELDTYPE *_nc_generic_fieldtype( + NCURSES_BOOL (*const field_check)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const char_check)( + int p1, + FORM *p2, + FIELD *p3, + const void *p4), + NCURSES_BOOL (*const next)( + FORM *p1, + FIELD *p2, + const void *p3), + NCURSES_BOOL (*const prev)( + FORM *p1, + FIELD *p2, + const void *p3), + void (*freecallback)( + void *p1)) + { return(*(FIELDTYPE **)0); } + +#undef _nc_set_generic_fieldtype +int _nc_set_generic_fieldtype( + FIELD *field, + FIELDTYPE *ftyp, + int (*argiterator)( + void **p1)) + { return(*(int *)0); } + +#undef _nc_form_cursor +WINDOW *_nc_form_cursor( + const FORM *form, + int *pRow, + int *pCol) + { return(*(WINDOW **)0); } + +/* ./fty_int.c */ + +typedef struct + { + int precision; + long low; + long high; + } +integerARG; + +typedef struct + { + int precision; + long low; + long high; + } +integerPARM; + +#undef TYPE_INTEGER +FIELDTYPE *TYPE_INTEGER; + +#undef _nc_TYPE_INTEGER +FIELDTYPE *_nc_TYPE_INTEGER(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_ipv4.c */ + +#undef TYPE_IPV4 +FIELDTYPE *TYPE_IPV4; + +#undef _nc_TYPE_IPV4 +FIELDTYPE *_nc_TYPE_IPV4(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_num.c */ + +typedef struct + { + int precision; + double low; + double high; + struct lconv *L; + } +numericARG; + +typedef struct + { + int precision; + double low; + double high; + } +thisPARM; + +#undef TYPE_NUMERIC +FIELDTYPE *TYPE_NUMERIC; + +#undef _nc_TYPE_NUMERIC +FIELDTYPE *_nc_TYPE_NUMERIC(void) + { return(*(FIELDTYPE **)0); } + +/* ./fty_regex.c */ + +typedef struct + { + regex_t *pRegExp; + unsigned long *refCount; + } +RegExp_Arg; + +#undef TYPE_REGEXP +FIELDTYPE *TYPE_REGEXP; + +#undef _nc_TYPE_REGEXP +FIELDTYPE *_nc_TYPE_REGEXP(void) + { return(*(FIELDTYPE **)0); } diff --git a/contrib/ncurses/form/modules b/contrib/ncurses/form/modules new file mode 100644 index 00000000..47a3ddf4 --- /dev/null +++ b/contrib/ncurses/form/modules @@ -0,0 +1,79 @@ +# $Id: modules,v 1.18 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998-2008,2010 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1995-on +# and: Juergen Pfeifer 2008 +# + +@ base +# Library objects +f_trace lib $(srcdir) $(HEADER_DEPS) +fld_arg lib $(srcdir) $(HEADER_DEPS) +fld_attr lib $(srcdir) $(HEADER_DEPS) +fld_current lib $(srcdir) $(HEADER_DEPS) +fld_def lib $(srcdir) $(HEADER_DEPS) +fld_dup lib $(srcdir) $(HEADER_DEPS) +fld_ftchoice lib $(srcdir) $(HEADER_DEPS) +fld_ftlink lib $(srcdir) $(HEADER_DEPS) +fld_info lib $(srcdir) $(HEADER_DEPS) +fld_just lib $(srcdir) $(HEADER_DEPS) +fld_link lib $(srcdir) $(HEADER_DEPS) +fld_max lib $(srcdir) $(HEADER_DEPS) +fld_move lib $(srcdir) $(HEADER_DEPS) +fld_newftyp lib $(srcdir) $(HEADER_DEPS) +fld_opts lib $(srcdir) $(HEADER_DEPS) +fld_pad lib $(srcdir) $(HEADER_DEPS) +fld_page lib $(srcdir) $(HEADER_DEPS) +fld_stat lib $(srcdir) $(HEADER_DEPS) +fld_type lib $(srcdir) $(HEADER_DEPS) +fld_user lib $(srcdir) $(HEADER_DEPS) +frm_cursor lib $(srcdir) $(HEADER_DEPS) +frm_data lib $(srcdir) $(HEADER_DEPS) +frm_def lib $(srcdir) $(HEADER_DEPS) +frm_driver lib $(srcdir) $(HEADER_DEPS) +frm_hook lib $(srcdir) $(HEADER_DEPS) +frm_opts lib $(srcdir) $(HEADER_DEPS) +frm_page lib $(srcdir) $(HEADER_DEPS) +frm_post lib $(srcdir) $(HEADER_DEPS) +frm_req_name lib $(srcdir) $(HEADER_DEPS) +frm_scale lib $(srcdir) $(HEADER_DEPS) +frm_sub lib $(srcdir) $(HEADER_DEPS) +frm_user lib $(srcdir) $(HEADER_DEPS) +frm_win lib $(srcdir) $(HEADER_DEPS) +fty_alnum lib $(srcdir) $(HEADER_DEPS) +fty_alpha lib $(srcdir) $(HEADER_DEPS) +fty_enum lib $(srcdir) $(HEADER_DEPS) +fty_generic lib $(srcdir) $(HEADER_DEPS) +fty_int lib $(srcdir) $(HEADER_DEPS) +fty_ipv4 lib $(srcdir) $(HEADER_DEPS) +fty_num lib $(srcdir) $(HEADER_DEPS) +fty_regex lib $(srcdir) $(HEADER_DEPS) + +# vile:makemode diff --git a/contrib/ncurses/include/Caps b/contrib/ncurses/include/Caps new file mode 100644 index 00000000..cd077b96 --- /dev/null +++ b/contrib/ncurses/include/Caps @@ -0,0 +1,1024 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 1998-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Zeyd M. Ben-Halim 1992,1995 +# and: Eric S. Raymond +# +# $Id: Caps,v 1.56 2024/04/20 21:05:02 tom Exp $ +# +# This is the master termcap/terminfo capability table. +# +# This table is used to generate initializers for tables that drive tic, +# infocmp, and the library compilation code used to support the termcap +# compatibility hack. It is also used to generate the tabular portion of the +# terminfo(5) man page; lines beginning with `#%' are passed through to become +# the terminfo table. +# +# This file has three major sections; a standard-capabilities table, two +# extension-capability tables, and a section of aliases declarations. +# The first two have the same format, as follows: +# +# FILE FORMAT +# +# Column 1: terminfo variable name +# Column 2: terminfo capability name +# Column 3: capability type (Boolean, numeric, or string) +# Column 4: termcap capability name +# Column 5: KEY_xxx name, if any, `-' otherwise +# Column 6: value for KEY_xxx name, if any, `-' otherwise +# Column 7: Lead with `Y' if capability should be emitted in termcap +# translations, `-' otherwise +# Column 8: capability description +# +# The codes following [Y-] in column 7 describe the versions of termcap which +# use the given capability. This information is not used by the curses library +# proper; rather, it is there to help the terminfo maintainer avoid emitting +# termcap entry translations that are more than 1023 bytes long (and tank a +# lot of old termcap-using programs). The codes read as follows: +# B = mentioned in the BSD man page for 4.4BSD curses +# C = used by the 4.4BSD curses library +# G = mentioned in the documentation for GNU termcap +# E = used by GNU Emacs +# K = remove this terminfo capability when translating to standard format +# The important codes are C and E. A cap with C or E should be preserved in +# translation if possible. The problem is that preserving all such caps may +# lead to some termcap translations being too long. The termcap maintainer +# has a bit of a juggling act to do...potential problem cases are marked with +# an asterisk (*). +# +# The aliases section has the following format: +# +# Column 1: either `capalias' or `infoalias' +# Column 2: name to be aliased +# Column 3: what name it should translate to. The name IGNORE means it +# should be discarded with a warning message. +# Column 4: name of the extension set (used for compiler warning messages) +# Column 5: capability description (usually an associated terminfo variable) +# +# HANDLING TERMCAP AND TERMINFO EXTENSIONS +# +# There are basically five different ways to handle termcap and terminfo +# extensions: +# +# 1. Don't list the capname here, or list it but comment it out (the latter +# is preferable; someone might want to handle it in the future). If you do +# this, the capability will be treated as unknown and raise a warning from +# the compiler. +# +# 2. Alias it. This is appropriate if the capability has the same meaning +# as an already-supported one. The compiler will handle aliasing, emitting +# an appropriate informational message whenever an alias fires. +# +# 3. List it in the standard table. You almost certainly do *not* want +# to do this -- the capabilities in that one, and their order, have been +# carefully chosen to be SVr4-binary-compatible when they're written out +# as a terminfo object, and breaking this would be bad. It is up to the ncurses +# library what to do with the terminfo data after it is read in. +# +# 4. List it in the aliases table with an IGNORE target field. If you +# do this, the capability will be ignored on input (though the user will +# get a warning message about it). +# +# 5. List it in the extensions table. If you do this, the compiler will +# silently accept the capability, but the curses library proper will never +# see it (because it won't be written out as part of the terminfo object +# format). It is up to you what you have the compiler do with it. +# +# There are two opposite reasons to choose option 5. One is when you want +# to eat the capability silently and discard it when doing translations +# to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are +# in this class. Nothing will ever use them again. +# +# More usually, you want the compiler to try to deduce something from the +# capability value that it can use to translate it into your output format. +# You'll need to write custom code, probably in postprocess_termcap() or +# postprocess_terminfo(), to handle the translation. +# +# CONTROLLING ENTRY LENGTH +# +# Notes on specific elisions made to fit translations within 1023 bytes: +# +# Machines with IBM PC-like keyboards want to be able to define the following +# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- +# only environments for End or Home-Down), key_dc, and key_ic. This is also +# the set of keys the `joe' editor will be upset if it can't see. So don't +# trim those out of the set to be translated to termcap, or various users of +# the termcap file will become irate. +# +# It might look tempting to leave those long init strings out of translations. +# We can't do it (yet); 4.4BSD tput and tset use them. +# +# We retain the sgr capability in translation in spite of the fact that neither +# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are +# hard to understand without it, and (b) the entries in which it is long tend +# to be older types that don't use up a lot of string space on function keys. +# The tic(1) translation code will complain and elide it if it makes a critical +# difference (there is special code in tic to recognize this situation). +# +# Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion +# optimizer in BSD curses didn't use them. This omission seems to be the +# single most effective one, it shortened the resolved length of all thirteen +# problem entries in the 9.9.0 version of the terminfo master below critical. +# +# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap +# translations go back over critical if we do this. As 4.4BSD curses fades +# into history and GNU termcap's application base shrinks towards being GNU +# Emacs only, we'll probably elide out some BSD-only capabilities in order +# to buy space for non-essentials Emacs is still using. Capabilities high +# on that hit list: rc, sc, uc. +# +# FORMATTING THE TABLES +# +# We manually specify a (minimum) column width for the capability name +# and terminfo code columns in the tables to achieve a consistent +# arrangement; as used here, tbl(1) cannot know the width required by +# one table's data while formatting another's. +# +# The longest capability names (C variables) are +# "enter_near_letter_quality" and "bit_image_carriage_return" (tied at +# 25n), and the longest terminfo code is "setcolor" (8n). +# +# The tables are a tight fit on traditional man(7) implementations that +# use a line length of 65n, and the "Description" column has little room +# within which the formatter can make breaking or adjustment decisions. +# Words like "micro_..._address" and "parm_..._micro" don't break. +# Reducing the inter-column gaps to 2 ens gives them enough room. --GBR +# +############################################################################# +# +# STANDARD CAPABILITIES +# +#%Tables of capabilities +#%.I \%ncurses +#%recognizes in a +#%.I \%term\%info +#%terminal type description and available to +#%.IR \%term\%info -using +#%code follow. +#%.bP +#%The capability name identifies the symbol by which the programmer +#%using the +#%.I \%term\%info +#%API accesses the capability. +#%.bP +#%The TI +#%.RI ( \%term\%info ) +#%code is the short name used by a person composing or updating a +#%terminal type entry. +#%.IP +#%Whenever possible, +#%these codes are the same as or similar to those of the ANSI X3.64-1979 +#%standard +#%(now superseded by ECMA-48, +#%which uses identical or very similar names). +#%Semantics are also intended to match those of the specification. +#%.IP +#%.I \%term\%info +#%codes have no hard length limit, +#%but +#%.I \%ncurses +#%maintains an informal one of 5 characters to keep them short and to +#%allow the tabs in the source file +#%.I Caps +#%to line up nicely. +#%(Some standard codes exceed this limit regardless.) +#%.bP +#%The TC +#%.RI ( termcap ) +#%code is that used by the corresponding API of +#%.IR \%ncurses . +#%(Some capabilities are new, +#%and have names that BSD +#%.I termcap +#%did not originate.) +#%.bP +#%The description field attempts to convey the capability's semantics. +#%.PP +#%The description field employs a handful of notations. +#%.TP +#%.B (P) +#%indicates that padding may be specified. +#%.TP +#%.B (P*) +#%indicates that padding may vary in proportion to the number of output +#%lines affected. +#%.TP +#%.BI # i +#%indicates the +#%.IR i th +#%parameter of a string capability; +#%the programmer should pass the string to \fB\%tparm\fP(3X) with the +#%parameters listed. +#%.IP +#%If the description lists no parameters, +#%passing the string to \fB\%tparm\fP(3X) may produce unexpected +#%behavior, +#%for instance if the string contains percent signs. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Boolean Capability Name TI TC Description +#%_ +auto_left_margin bw bool bw - - YB-G- cub1 wraps from column 0 to last column +auto_right_margin am bool am - - YBCGE terminal has automatic margins +no_esc_ctlc xsb bool xb - - YBCG- beehive (f1=escape, f2=ctrl C) +ceol_standout_glitch xhp bool xs - - YBCGE standout not erased by overwriting (hp) +eat_newline_glitch xenl bool xn - - YBCGE newline ignored after 80 cols (concept) +erase_overstrike eo bool eo - - YBCG- can erase overstrikes with a blank +generic_type gn bool gn - - YB-G- generic line type +hard_copy hc bool hc - - YBCG- hardcopy terminal +has_meta_key km bool km - - YB-GE Has a meta key (i.e., sets 8th-bit) +has_status_line hs bool hs - - YB-G- has extra status line +insert_null_glitch in bool in - - YBCGE insert mode distinguishes nulls +memory_above da bool da - - YBCG- display may be retained above the screen +memory_below db bool db - - YB-GE display may be retained below the screen +move_insert_mode mir bool mi - - YBCGE safe to move while in insert mode +move_standout_mode msgr bool ms - - YBCGE safe to move while in standout mode +over_strike os bool os - - YBCG- terminal can overstrike +status_line_esc_ok eslok bool es - - YB-G- escape can be used on the status line +dest_tabs_magic_smso xt bool xt - - YBCGE tabs destructive, magic so char (t1061) +tilde_glitch hz bool hz - - YB-GE cannot print ~'s (Hazeltine) +transparent_underline ul bool ul - - YBCGE underline character overstrikes +xon_xoff xon bool xo - - YB--- terminal uses xon/xoff handshaking +needs_xon_xoff nxon bool nx - - ----- padding will not work, xon/xoff required +prtr_silent mc5i bool 5i - - ----- printer will not echo on screen +hard_cursor chts bool HC - - ----- cursor is hard to see +non_rev_rmcup nrrmc bool NR - - ----- smcup does not reverse rmcup +no_pad_char npc bool NP - - ----- pad character does not exist +non_dest_scroll_region ndscr bool ND - - ----- scrolling region is non-destructive +can_change ccc bool cc - - ----- terminal can re-define existing colors +back_color_erase bce bool ut - - ----- screen erased with background color +hue_lightness_saturation hls bool hl - - ----- terminal uses only HLS color notation (Tektronix) +col_addr_glitch xhpa bool YA - - ----- only positive motion for hpa/mhpa caps +cr_cancels_micro_mode crxm bool YB - - ----- using cr turns off micro mode +has_print_wheel daisy bool YC - - ----- printer needs operator to change character set +row_addr_glitch xvpa bool YD - - ----- only positive motion for vpa/mvpa caps +semi_auto_right_margin sam bool YE - - ----- printing in last column causes cr +cpi_changes_res cpix bool YF - - ----- changing character pitch changes resolution +lpi_changes_res lpix bool YG - - ----- changing line pitch changes resolution +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +columns cols num co - - YBCGE number of columns in a line +init_tabs it num it - - YB-G- tabs initially every # spaces +lines lines num li - - YBCGE number of lines on screen or page +lines_of_memory lm num lm - - YB-G- lines of memory if > line. 0 means varies +magic_cookie_glitch xmc num sg - - YBCGE number of blank characters left by smso or rmso +padding_baud_rate pb num pb - - YB-GE lowest baud rate where padding needed +virtual_terminal vt num vt - - YB--- virtual terminal number (CB/unix) +width_status_line wsl num ws - - YB-G- number of columns in status line +num_labels nlab num Nl - - ----- number of labels on screen +label_height lh num lh - - ----- rows in each label +label_width lw num lw - - ----- columns in each label +max_attributes ma num ma - - YBC-- maximum combined attributes terminal can handle +maximum_windows wnum num MW - - ----- maximum number of definable windows +# These came in with SVr4's color support +max_colors colors num Co - - ----- maximum number of colors on screen +max_pairs pairs num pa - - ----- maximum number of color-pairs on the screen +no_color_video ncv num NC - - ----- video attributes that cannot be used with colors +#%.TE +#%.PP +#%. +#%The following numeric capabilities are present in the SVr4.0 term structure, +#%but are not yet documented in the man page. +#%They came in with SVr4's printer support. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +buffer_capacity bufsz num Ya - - ----- numbers of bytes buffered before printing +dot_vert_spacing spinv num Yb - - ----- spacing of pins vertically in pins per inch +dot_horz_spacing spinh num Yc - - ----- spacing of dots horizontally in dots per inch +max_micro_address maddr num Yd - - ----- maximum value in micro_..._address +max_micro_jump mjump num Ye - - ----- maximum value in parm_..._micro +micro_col_size mcs num Yf - - ----- character step size when in micro mode +micro_line_size mls num Yg - - ----- line step size when in micro mode +number_of_pins npins num Yh - - ----- numbers of pins in print-head +output_res_char orc num Yi - - ----- horizontal resolution in units per line +output_res_line orl num Yj - - ----- vertical resolution in units per line +output_res_horz_inch orhi num Yk - - ----- horizontal resolution in units per inch +output_res_vert_inch orvi num Yl - - ----- vertical resolution in units per inch +print_rate cps num Ym - - ----- print rate in characters per second +wide_char_size widcs num Yn - - ----- character step size when in double wide mode +buttons btns num BT - - ----- number of buttons on mouse +bit_image_entwining bitwin num Yo - - ----- number of passes for each bit-image row +bit_image_type bitype num Yp - - ----- type of bit-image device +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +back_tab cbt str bt - - YBCGE back tab (P) +bell bel str bl - - YB-GE audible signal (bell) (P) +carriage_return cr str cr - - YBCGE carriage return (P*) (P*) +change_scroll_region csr str cs - - YBCGE change region to line #1 to line #2 (P) +clear_all_tabs tbc str ct - - YB-G- clear all tab stops (P) +clear_screen clear str cl - - YBCGE clear screen and home cursor (P*) +clr_eol el str ce - - YBCGE clear to end of line (P) +clr_eos ed str cd - - YBCGE clear to end of screen (P*) +column_address hpa str ch - - -B-GE* horizontal position #1, absolute (P) +command_character cmdch str CC - - YB-G- terminal settable cmd character in prototype !? +cursor_address cup str cm - - YBCGE move to row #1 columns #2 +cursor_down cud1 str do - - YBCGE down one line +cursor_home home str ho - - YBCGE home cursor (if no cup) +cursor_invisible civis str vi - - YB-G- make cursor invisible +cursor_left cub1 str le - - YBCGE move left one space +cursor_mem_address mrcup str CM - - YB-G- memory relative cursor addressing, move to row #1 columns #2 +cursor_normal cnorm str ve - - YBCGE make cursor appear normal (undo civis/cvvis) +cursor_right cuf1 str nd - - YBCGE non-destructive space (move right one space) +cursor_to_ll ll str ll - - YBCGE last line, first column (if no cup) +cursor_up cuu1 str up - - YBCGE up one line +cursor_visible cvvis str vs - - YBCGE make cursor very visible +delete_character dch1 str dc - - YBCGE delete character (P*) +delete_line dl1 str dl - - YBCGE delete line (P*) +dis_status_line dsl str ds - - YB-G- disable status line +down_half_line hd str hd - - YB-G- half a line down +enter_alt_charset_mode smacs str as - - YB-G- start alternate character set (P) +enter_blink_mode blink str mb - - YB-G- turn on blinking +enter_bold_mode bold str md - - YB-G- turn on bold (extra bright) mode +enter_ca_mode smcup str ti - - YBCGE string to start programs using cup +enter_delete_mode smdc str dm - - YBCGE enter delete mode +enter_dim_mode dim str mh - - YB-G- turn on half-bright mode +enter_insert_mode smir str im - - YBCGE enter insert mode +enter_secure_mode invis str mk - - -B-G-* turn on blank mode (characters invisible) +enter_protected_mode prot str mp - - -B-G-* turn on protected mode +enter_reverse_mode rev str mr - - YB-G- turn on reverse video mode +enter_standout_mode smso str so - - YBCGE begin standout mode +enter_underline_mode smul str us - - YBCGE begin underline mode +erase_chars ech str ec - - YB-G- erase #1 characters (P) +exit_alt_charset_mode rmacs str ae - - YB-G- end alternate character set (P) +exit_attribute_mode sgr0 str me - - YB-GE turn off all attributes +exit_ca_mode rmcup str te - - YBCGE strings to end programs using cup +exit_delete_mode rmdc str ed - - YBCGE end delete mode +exit_insert_mode rmir str ei - - YBCGE exit insert mode +exit_standout_mode rmso str se - - YBCGE exit standout mode +exit_underline_mode rmul str ue - - YBCGE exit underline mode +flash_screen flash str vb - - YBCGE visible bell (may not move cursor) +form_feed ff str ff - - YB-G- hardcopy terminal page eject (P*) +from_status_line fsl str fs - - YB-G- return from status line +init_1string is1 str i1 - - YB-G- initialization string +init_2string is2 str is - - YB-G- initialization string +init_3string is3 str i3 - - YB-G- initialization string +init_file if str if - - YB-G- name of initialization file +insert_character ich1 str ic - - YBCGE insert character (P) +insert_line il1 str al - - YBCGE insert line (P*) +insert_padding ip str ip - - YBCGE insert padding after inserted character +key_backspace kbs str kb KEY_BACKSPACE 0407 YB-G- backspace key +key_catab ktbc str ka KEY_CATAB 0526 -B-G-* clear-all-tabs key +key_clear kclr str kC KEY_CLEAR 0515 -B-G-* clear-screen or erase key +key_ctab kctab str kt KEY_CTAB 0525 -B-G-* clear-tab key +key_dc kdch1 str kD KEY_DC 0512 YB-G- delete-character key +key_dl kdl1 str kL KEY_DL 0510 -B-G-* delete-line key +key_down kcud1 str kd KEY_DOWN 0402 YBCGE down-arrow key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode +key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key +key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key +key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key +key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key +key_f10 kf10 str k; KEY_F(10) - ----E F10 function key +key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key +key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key +key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key +key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key +key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key +key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key +key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key +key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key +key_home khome str kh KEY_HOME 0406 YBCGE home key +key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key +key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key +key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key +key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) +key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key +key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key +key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key +key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key +key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key +key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key +key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key +keypad_local rmkx str ke - - YBCGE leave keyboard transmit mode +keypad_xmit smkx str ks - - YBCGE enter keyboard transmit mode +lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 +lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 +lab_f10 lf10 str la - - ----- label on function key f10 if not f10 +lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 +lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 +lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 +lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 +lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 +lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 +lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 +lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 +meta_off rmm str mo - - YB-G-* turn off meta mode +meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) +newline nel str nw - - YB-G-* newline (behave like cr followed by lf) +pad_char pad str pc - - YBCGE padding char (instead of null) +parm_dch dch str DC - - YB-GE delete #1 characters (P*) +parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) +parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) +parm_ich ich str IC - - YB-GE insert #1 characters (P*) +parm_index indn str SF - - YBCG- scroll forward #1 lines (P) +parm_insert_line il str AL - - YBCGE insert #1 lines (P*) +parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) +parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) +parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) +parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) +pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 +pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 +pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 +print_screen mc0 str ps - - -B-G-* print contents of screen +prtr_off mc4 str pf - - -B-G-* turn off printer +prtr_on mc5 str po - - -B-G-* turn on printer +repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) +reset_1string rs1 str r1 - - -B--- reset string +reset_2string rs2 str r2 - - -B--- reset string +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +reset_3string rs3 str r3 - - -B--- reset string +reset_file rf str rf - - -B--- name of reset file +restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor +row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) +save_cursor sc str sc - - YBCG- save current cursor position (P) +scroll_forward ind str sf - - YBCGE scroll text up (P) +scroll_reverse ri str sr - - YBCGE scroll text down (P) +set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) +set_tab hts str st - - YB-G- set a tab in every row, current columns +set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 +tab ht str ta - - YBCGE tab to next 8-space hardware tab stop +to_status_line tsl str ts - - YB-G- move to status line, column #1 +underline_char uc str uc - - YBCG- underline char and move past it +up_half_line hu str hu - - YB-G- half a line up +init_prog iprog str iP - - -B--- path name of program for initialization +key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad +key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad +key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad +key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad +key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad +prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes +# +# SVr1 capabilities stop here. IBM's version of terminfo is the same as +# SVr4 up to this point, but has a different set afterwards. +# +char_padding rmp str rP - - ----- like ip but when in insert mode +acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 +plab_norm pln str pn - - ----- program label #1 to show string #2 +key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key +enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking +exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking +enter_am_mode smam str SA - - ----- turn on automatic margins +exit_am_mode rmam str RA - - ----- turn off automatic margins +xon_character xonc str XN - - ----- XON character +xoff_character xoffc str XF - - ----- XOFF character +ena_acs enacs str eA - - ----- enable alternate char set +label_on smln str LO - - ----- turn on soft labels +label_off rmln str LF - - ----- turn off soft labels +key_beg kbeg str @1 KEY_BEG 0542 ----- begin key +key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key +key_close kclo str @3 KEY_CLOSE 0544 ----- close key +key_command kcmd str @4 KEY_COMMAND 0545 ----- command key +key_copy kcpy str @5 KEY_COPY 0546 ----- copy key +key_create kcrt str @6 KEY_CREATE 0547 ----- create key +key_end kend str @7 KEY_END 0550 ----- end key +key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key +key_exit kext str @9 KEY_EXIT 0551 ----- exit key +key_find kfnd str @0 KEY_FIND 0552 ----- find key +key_help khlp str %1 KEY_HELP 0553 ----- help key +key_mark kmrk str %2 KEY_MARK 0554 ----- mark key +key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key +key_move kmov str %4 KEY_MOVE 0556 ----- move key +key_next knxt str %5 KEY_NEXT 0557 ----- next key +key_open kopn str %6 KEY_OPEN 0560 ----- open key +key_options kopt str %7 KEY_OPTIONS 0561 ----- options key +key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key +key_print kprt str %9 KEY_PRINT 0532 ----- print key +key_redo krdo str %0 KEY_REDO 0563 ----- redo key +key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key +key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key +key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key +key_restart krst str &4 KEY_RESTART 0567 ----- restart key +key_resume kres str &5 KEY_RESUME 0570 ----- resume key +key_save ksav str &6 KEY_SAVE 0571 ----- save key +key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key +key_undo kund str &8 KEY_UNDO 0630 ----- undo key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key +key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key +key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key +key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key +key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key +key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key +key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key +key_select kslt str *6 KEY_SELECT 0601 ----- select key +key_send kEND str *7 KEY_SEND 0602 ----- shifted end key +key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key +key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key +key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key +key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key +key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key +key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key +key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key +key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key +key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key +key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key +key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key +key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key +key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key +key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key +key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key +key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key +key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key +key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key +key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key +key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key +req_for_input rfi str RF - - ----- send next input char (for ptys) +key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key +key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key +key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key +key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key +key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key +key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key +key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key +key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key +key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key +key_f20 kf20 str FA KEY_F(20) - ----E F20 function key +key_f21 kf21 str FB KEY_F(21) - ----E F21 function key +key_f22 kf22 str FC KEY_F(22) - ----E F22 function key +key_f23 kf23 str FD KEY_F(23) - ----E F23 function key +key_f24 kf24 str FE KEY_F(24) - ----E F24 function key +key_f25 kf25 str FF KEY_F(25) - ----E F25 function key +key_f26 kf26 str FG KEY_F(26) - ----E F26 function key +key_f27 kf27 str FH KEY_F(27) - ----E F27 function key +key_f28 kf28 str FI KEY_F(28) - ----E F28 function key +key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key +key_f30 kf30 str FK KEY_F(30) - ----E F30 function key +key_f31 kf31 str FL KEY_F(31) - ----E F31 function key +key_f32 kf32 str FM KEY_F(32) - ----E F32 function key +key_f33 kf33 str FN KEY_F(33) - ----E F33 function key +key_f34 kf34 str FO KEY_F(34) - ----E F34 function key +key_f35 kf35 str FP KEY_F(35) - ----E F35 function key +key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key +key_f37 kf37 str FR KEY_F(37) - ----E F37 function key +key_f38 kf38 str FS KEY_F(38) - ----E F38 function key +key_f39 kf39 str FT KEY_F(39) - ----E F39 function key +key_f40 kf40 str FU KEY_F(40) - ----E F40 function key +key_f41 kf41 str FV KEY_F(41) - ----E F41 function key +key_f42 kf42 str FW KEY_F(42) - ----E F42 function key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_f43 kf43 str FX KEY_F(43) - ----E F43 function key +key_f44 kf44 str FY KEY_F(44) - ----E F44 function key +key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key +key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key +key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key +key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key +key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key +key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key +key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key +key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key +key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key +key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key +key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key +key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key +key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key +key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key +key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key +key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key +key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key +key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key +key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key +clr_bol el1 str cb - - ----- Clear to beginning of line +clear_margins mgc str MC - - ----- clear right and left soft margins +set_left_margin smgl str ML - - ----- set left soft margin at current column (not in BSD \fItermcap\fP) +set_right_margin smgr str MR - - ----- set right soft margin at current column +label_format fln str Lf - - ----- label format +set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs +display_clock dclk str DK - - ----- display clock +remove_clock rmclk str RC - - ----- remove clock +create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 +goto_window wingo str WG - - ----- go to window #1 +hangup hup str HU - - ----- hang-up phone +dial_phone dial str DI - - ----- dial number #1 +quick_dial qdial str QD - - ----- dial number #1 without checking +tone tone str TO - - ----- select touch tone dialing +pulse pulse str PU - - ----- select pulse dialing +flash_hook hook str fh - - ----- flash switch hook +fixed_pause pause str PA - - ----- pause for 2-3 seconds +wait_tone wait str WA - - ----- wait for dial-tone +user0 u0 str u0 - - ----- User string #0 +user1 u1 str u1 - - ----- User string #1 +user2 u2 str u2 - - ----- User string #2 +user3 u3 str u3 - - ----- User string #3 +user4 u4 str u4 - - ----- User string #4 +user5 u5 str u5 - - ----- User string #5 +user6 u6 str u6 - - ----- User string #6 +user7 u7 str u7 - - ----- User string #7 +user8 u8 str u8 - - ----- User string #8 +user9 u9 str u9 - - ----- User string #9 +# +# SVr4 added these capabilities to support color +# +orig_pair op str op - - ----- Set default pair to its original value +orig_colors oc str oc - - ----- Set all color pairs to the original ones +initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) +initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) +set_color_pair scp str sp - - ----- Set current color pair to #1 +set_foreground setf str Sf - - ----- Set foreground color #1 +set_background setb str Sb - - ----- Set background color #1 +# +# SVr4 added these capabilities to support printers +# +change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 +change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 +change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 +change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 +define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 +enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode +enter_italics_mode sitm str ZH - - ----- Enter italic mode +enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion +enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode +enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode +enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode +enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode +enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode +enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode +enter_upward_mode sum str ZP - - ----- Start upward carriage motion +exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode +exit_italics_mode ritm str ZR - - ----- End italic mode +exit_leftward_mode rlm str ZS - - ----- End left-motion mode +exit_micro_mode rmicm str ZT - - ----- End micro-motion mode +exit_shadow_mode rshm str ZU - - ----- End shadow-print mode +exit_subscript_mode rsubm str ZV - - ----- End subscript mode +exit_superscript_mode rsupm str ZW - - ----- End superscript mode +exit_upward_mode rum str ZX - - ----- End reverse character motion +micro_column_address mhpa str ZY - - ----- Like column_address in micro mode +micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode +micro_left mcub1 str Za - - ----- Like cursor_left in micro mode +micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode +micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode +micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode +order_of_pins porder str Ze - - ----- Match software bits to print-head pins +parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode +parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode +parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode +parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode +select_char_set scs str Zj - - ----- Select character set, #1 +set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line +set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom +set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 +set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 +set_top_margin smgt str Zo - - ----- Set top margin at current line +set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 +start_bit_image sbim str Zq - - ----- Start printing bit image graphics +start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set +stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics +stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 +subscript_characters subcs str Zu - - ----- List of subscriptable characters +superscript_characters supcs str Zv - - ----- List of superscriptable characters +these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR +zero_motion zerom str Zx - - ----- No motion for subsequent character +#%.TE +#%.PP +#%. +#%The following string capabilities are present in the SVr4.0 term structure, +#%but were originally not documented in the man page. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +char_set_names csnm str Zy - - ----- Produce #1'th item from list of character set names +key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred +mouse_info minfo str Mi - - ----- Mouse status information +req_mouse_pos reqmp str RQ - - ----- Request mouse position +get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. +set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape +set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape +pkey_plab pfxl str xl - - ----- Program function key #1 to type string #2 and show string #3 +device_type devt str dv - - ----- Indicate language, codeset support +code_set_init csin str ci - - ----- Init sequence for multiple codesets +set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) +set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 +set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 +set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 +set_lr_margin smglr str ML - - ----- Set both left and right margins to #1, #2. (ML is not in BSD termcap). +set_tb_margin smgtb str MT - - ----- Sets both top and bottom margins to #1, #2 +bit_image_repeat birep str Xy - - ----- Repeat bit image cell #1 #2 times +bit_image_newline binel str Zz - - ----- Move to next row of the bit image +bit_image_carriage_return bicr str Yv - - ----- Move to beginning of same row +color_names colornm str Yw - - ----- Give name for color #1 +define_bit_image_region defbi str Yx - - ----- Define rectangular bit image region +end_bit_image_region endbi str Yy - - ----- End a bit-image region +set_color_band setcolor str Yz - - ----- Change to ribbon color #1 +set_page_length slines str YZ - - ----- Set page length to #1 lines +# +# SVr4 added these capabilities for direct PC-clone support +# +display_pc_char dispc str S1 - - ----- Display PC character #1 +enter_pc_charset_mode smpch str S2 - - ----- Enter PC character display mode +exit_pc_charset_mode rmpch str S3 - - ----- Exit PC character display mode +enter_scancode_mode smsc str S4 - - ----- Enter PC scancode mode +exit_scancode_mode rmsc str S5 - - ----- Exit PC scancode mode +pc_term_options pctrm str S6 - - ----- PC terminal options +scancode_escape scesc str S7 - - ----- Escape for scancode emulation +alt_scancode_esc scesa str S8 - - ----- Alternate escape for scancode emulation +#%.TE +#%.PP +#%. +#%The XSI Curses standard added these hardcopy capabilities. +#%They were used in some post-4.1 versions of System V curses, +#%e.g., Solaris 2.5 and IRIX 6.x. +#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented. +#%According to the XSI Curses standard, they have no termcap names. +#%If your compiled terminfo entries use these, +#%they may not be binary-compatible with System V terminfo +#%entries after SVr4.1; beware! +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +enter_horizontal_hl_mode ehhlm str Xh - - ----- Enter horizontal highlight mode +enter_left_hl_mode elhlm str Xl - - ----- Enter left highlight mode +enter_low_hl_mode elohlm str Xo - - ----- Enter low highlight mode +enter_right_hl_mode erhlm str Xr - - ----- Enter right highlight mode +enter_top_hl_mode ethlm str Xt - - ----- Enter top highlight mode +enter_vertical_hl_mode evhlm str Xv - - ----- Enter vertical highlight mode +set_a_attributes sgr1 str sA - - ----- Define second set of video attributes #1-#6 +set_pglen_inch slength str YI - - ----- Set page length to #1 hundredth of an inch (some implementations use sL for termcap). +#%.TE +# +# The magic token below tells the tic compiler-generator code that all the caps +# past it should be ignored (not written out) when dumping terminfo objects. It +# also tells the man page table generator not to pass through following lines +# This means we can have obsolete capabilities and pseudo-capabilities that are +# recognized for termcap or terminfo compilation, but not output. +# +# %%-STOP-HERE-%% +# +# Don't move this casually! In fact, don't move it at all unless you're +# either doing it to add System V or XPG4 extensions, or have decided you +# don't care about SVr4 binary compatibility. +# +############################################################################# +# +# TERMCAP EXTENSION CAPABILITIES +# +# The capabilities below are either obsolete or extensions on certain systems. +# They are not used by SVR4 terminfo. Some are used by captoinfo to translate +# termcap sources; the rest are listed for completeness, and in case somebody +# cares about them enough to hack in code that will translate them into +# terminfo capabilities. +# +# The first part of the list is from Ross Ridge's `mytinfo' package +# (comp.sources.unix, volume 26); the variable names and terminfo names (as +# well as the termcap codes) match his list. +# +# This group of codes is not marked obsolete in 4.4BSD, but have no direct +# terminfo equivalents. The rs capability is specially translated to terminfo +# r2, and vice versa, if an entry does not already have an r2. Similarly, +# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). +# The ug capability is thrown away, but assumed to be whatever sg is if the +# latter is nonzero and we're dumping in termcap format. +# +termcap_init2 OTi2 str i2 - - YB--- secondary initialization string +termcap_reset OTrs str rs - - YB-G- terminal reset string +magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul +# +# Obsolete termcap capabilities. Some are used for termcap translation. The +# code uses the 'OT' prefix we put on obsolete capabilities to suppress +# printing them in terminfo source dumps of compiled entries. +# +backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left +crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll +no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line +carriage_return_delay OTdC num dC - - YB-G- pad needed for CR +new_line_delay OTdN num dN - - YB-G- pad needed for LF +linefeed_if_not_lf OTnl str nl - - YBCGE use to move down +backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H +# +# GNU termcap library extensions. The GNU termcap file distributed with +# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the +# BSD termcap file. The name clash with terminfo MT is resolved by type +# info; MT is converted to km. +# +gnu_has_meta_key OTMT bool MT - - ----E has meta key +# gnu_tab_width OTtw num tw - - ----E tab width in spaces +# +# GNU termcap *does* include the following extended capability, Only the +# now-obsolete Ann Arbor terminals used it. +# +# gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region +# +# The following comments describe capnames so ancient that I believe no +# software uses them any longer. Some of these have to go because they +# clash with terminfo names in ways that cannot be resolved by type +# information. +# +# These mytinfo codes are not used in the 4.4BSD curses code. They are +# marked obsolete in the 4.4BSD manual pages. +# +# There is one conflict with terminfo; ma is in both. This conflict is +# resolved by type information. +# +# The `ko' capability is translated by special code. It should contain a +# comma-separated list of capabilities for which there are corresponding keys. +# The `kn' code is accepted but ignored. +# +# The `ma' capability was a 4.0BSD feature used by vi version 2. +# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. +# Besides being obsolete, that interpretation conflicts with max_attributes. +# +# Here is a description of memory_lock_above and memory_unlock: +# "You can 'freeze' data on the screen by turning on Memory Lock in a line of +# text. All lines above the cursor's current line become locked in place on +# the screen. Then enter data normally. When the screen fills up, any +# further data entered forces the first line of unfrozen line text to scroll +# under the frozen data. Lines scrolled off the screen are inserted into +# memory immediately preceding the first frozen line." (from the HP 700/96 +# User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. +# +# Applications that use terminfo are supposed to behave as though xr is +# always true. +# +linefeed_is_newline OTNL bool NL - - YB--- move down with \n +# even_parity OTEP bool EP - - -B--- terminal requires even parity +# odd_parity OTOP bool OP - - -B--- terminal requires odd parity +# half_duplex OTHD bool HD - - -B--- terminal is half-duplex +# lower_case_only OTLC bool LC - - -B--- terminal has only lower case +# upper_case_only OTUC bool UC - - -B--- terminal has only upper case +backspace_delay OTdB num dB - - YB-G- padding required for ^H +# form_feed_delay OTdF num dF - - -B-G- padding required for ^L +horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I +# vertical_tab_delay OTdV num dV - - -B--- padding required for ^V +number_of_function_keys OTkn num kn - - -B-G- count of function keys +other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps +arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 +# memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line +# memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line +has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I +return_does_clr_eol OTxr bool xr - - YB--- return clears the line +# tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch +# +# mytinfo described this as a termcap capability, but it is not listed in the +# 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses +# package, like System V, behaves as though it is always true. +# +# rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line +# +# University of Waterloo termcap extensions (as described in mytinfo). +# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot +# be resolved by a type check. The descriptions are guesses from what was +# in the mytinfo tables. +# +# key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) +# key_kill_char OTkk str kk - - ----- string set by kill key (?) +# key_suspend_char OTkz str kz - - ----- string set by suspend key (?) +# initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) +# ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return +# +# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. +# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type +# check. +# +# scroll_left OTsl1 str Sl - - ----- scroll screen leftward +# scroll_right OTsr1 str Sr - - ----- scroll screen rightward +# parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters +# parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters +# +# The mytinfo capabilities end here. +# +# XENIX extensions: +# +# Xenix defined its own set of forms-drawing capabilities: +# +# cap IBM ASCII description ACS ASCII +# --- ----------- -------------------- ------------- ------ +# G1 191 \277 M-? single upper right ACS_URCORNER +# G2 218 \332 M-Z single upper left ACS_ULCORNER +# G3 192 \300 M-@ single lower left ACS_LLCORNER +# G4 217 \331 M-Y single lower right ACS_LRCORNER +# G5 187 \273 M-; double upper right +# G6 201 \311 M-I double upper left +# G7 200 \310 M-H double lower left +# G8 188 \274 M-< double lower right +# GC 197 \305 M-E single intersection ACS_PLUS _ _ +# GD 194 \302 M-B single down-tick ACS_TTEE | +# GH 196 \304 M-D single horizontal line ACS_HLINE +# GL 180 \264 M-4 single left tick ACS_RTEE -| +# GR 195 \303 M-C single right tick ACS_LTEE |- +# GU 193 \301 M-A single up tick ACS_BTEE _|_ +# GV 179 \263 M-3 single vertical line ACS_VLINE +# Gc 206 \316 M-N double intersection +# Gd 203 \313 M-K double down tick +# Gh 205 \315 M-M double horizontal line +# Gl 204 \204 M-L double left tick +# Gr 185 \271 M-9 double right tick +# Gu 202 \312 M-J double up tick +# Gv 186 \272 M-: double vertical line +# +# The compiler will translate the single-line caps and discard the others +# (via IGNORE aliases further down). We don't want to do normal pad +# translation on these, they're often single-character printable ASCII +# strings that happen to be numerics. There's awk code in parametrized.sh +# that detects the acs_ prefix and uses it to suppress pad translation. +# These terminfo names are invented. +# +acs_ulcorner OTG2 str G2 - - ----- single upper left +acs_llcorner OTG3 str G3 - - ----- single lower left +acs_urcorner OTG1 str G1 - - ----- single upper right +acs_lrcorner OTG4 str G4 - - ----- single lower right +acs_ltee OTGR str GR - - ----- tee pointing right +acs_rtee OTGL str GL - - ----- tee pointing left +acs_btee OTGU str GU - - ----- tee pointing up +acs_ttee OTGD str GD - - ----- tee pointing down +acs_hline OTGH str GH - - ----- single horizontal line +acs_vline OTGV str GV - - ----- single vertical line +acs_plus OTGC str GC - - ----- single intersection +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# (see Caps-ncurses for the complete set of comments) +# +memory_lock meml str ml - - ----K lock memory above cursor +memory_unlock memu str mu - - ----K unlock memory +box_chars_1 box1 str bx - - ----K box characters primary set +############################################################################# diff --git a/contrib/ncurses/include/Caps-ncurses b/contrib/ncurses/include/Caps-ncurses new file mode 100644 index 00000000..f9a5da06 --- /dev/null +++ b/contrib/ncurses/include/Caps-ncurses @@ -0,0 +1,478 @@ +############################################################################## +# Copyright 2019-2022,2023 Thomas E. Dickey # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# $Id: Caps-ncurses,v 1.15 2023/10/28 21:55:47 tom Exp $ +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# This section is all comments (selected lines are copied/uncommented into +# specific "Caps" files). The section describes what capabilities need to be +# squeezed out to get down to the XSI Curses standard set. They are flagged +# with K. +# +# HP extensions +# +# These extensions follow ptr_non (replacing everything after it) in HP +# terminfo files. Except for memory_lock and memory_unlock, they are +# functionally identical to SVr4 extensions, but they make the binary format +# different. Grrr.... +# +#memory_lock meml str ml - - ----K lock memory above cursor +#memory_unlock memu str mu - - ----K unlock memory +#plab_norm pln str pn - - ----- program label #1 to show string #2 +#label_on smln str LO - - ----- turn on soft labels +#label_off rmln str LF - - ----- turn off soft labels +#key_f11 kf11 str F1 - - ----- F11 function key +#key_f12 kf12 str F2 - - ----- F12 function key +#key_f13 kf13 str F3 - - ----- F13 function key +#key_f14 kf14 str F4 - - ----- F14 function key +#key_f15 kf15 str F5 - - ----- F15 function key +#key_f16 kf16 str F6 - - ----- F16 function key +#key_f17 kf17 str F7 - - ----- F17 function key +#key_f18 kf18 str F8 - - ----- F18 function key +#key_f19 kf19 str F9 - - ----- F19 function key +#key_f20 kf20 str FA - - ----- F20 function key +#key_f21 kf21 str FB - - ----- F21 function key +#key_f22 kf22 str FC - - ----- F22 function key +#key_f23 kf23 str FD - - ----- F23 function key +#key_f24 kf24 str FE - - ----- F24 function key +#key_f25 kf25 str FF - - ----- F25 function key +#key_f26 kf26 str FG - - ----- F26 function key +#key_f27 kf27 str FH - - ----- F27 function key +#key_f28 kf28 str FI - - ----- F28 function key +#key_f29 kf29 str FJ - - ----- F29 function key +#key_f30 kf30 str FK - - ----- F30 function key +#key_f31 kf31 str FL - - ----- F31 function key +#key_f32 kf32 str FM - - ----- F32 function key +#key_f33 kf33 str FN - - ----- F33 function key +#key_f34 kf34 str FO - - ----- F34 function key +#key_f35 kf35 str FP - - ----- F35 function key +#key_f36 kf36 str FQ - - ----- F36 function key +#key_f37 kf37 str FR - - ----- F37 function key +#key_f38 kf38 str FS - - ----- F38 function key +#key_f39 kf39 str FT - - ----- F39 function key +#key_f40 kf40 str FU - - ----- F40 function key +#key_f41 kf41 str FV - - ----- F41 function key +#key_f42 kf42 str FW - - ----- F42 function key +#key_f43 kf43 str FX - - ----- F43 function key +#key_f44 kf44 str FY - - ----- F44 function key +#key_f45 kf45 str FZ - - ----- F45 function key +#key_f46 kf46 str Fa - - ----- F46 function key +#key_f47 kf47 str Fb - - ----- F47 function key +#key_f48 kf48 str Fc - - ----- F48 function key +#key_f49 kf49 str Fd - - ----- F49 function key +#key_f50 kf50 str Fe - - ----- F50 function key +#key_f51 kf51 str Ff - - ----- F51 function key +#key_f52 kf52 str Fg - - ----- F52 function key +#key_f53 kf53 str Fh - - ----- F53 function key +#key_f54 kf54 str Fi - - ----- F54 function key +#key_f55 kf55 str Fj - - ----- F55 function key +#key_f56 kf56 str Fk - - ----- F56 function key +#key_f57 kf57 str Fl - - ----- F57 function key +#key_f58 kf58 str Fm - - ----- F58 function key +#key_f59 kf59 str Fn - - ----- F59 function key +#key_f60 kf60 str Fo - - ----- F60 function key +#key_f61 kf61 str Fp - - ----- F61 function key +#key_f62 kf62 str Fq - - ----- F62 function key +#key_f63 kf63 str Fr - - ----- F63 function key +# +# IBM extensions +# +# These extensions follow ptr_non (replacing everything after it) in IBM +# terminfo files. +# +# The places in the box[12] capabilities correspond to acsc characters, here is +# the mapping: +# +# box1[0] = ACS_ULCORNER +# box1[1] = ACS_HLINE +# box1[2] = ACS_URCORNER +# box1[3] = ACS_VLINE +# box1[4] = ACS_LRCORNER +# box1[5] = ACS_LLCORNER +# box1[6] = ACS_TTEE +# box1[7] = ACS_RTEE +# box1[8] = ACS_BTEE +# box1[9] = ACS_LTEE +# box1[10] = ACS_PLUS +# +# The box2 characters are the double-line versions of these forms graphics. +# +#box_chars_1 box1 str bx - - ----K box characters primary set +#box_chars_2 box2 str by - - ----K box characters secondary set +#box_attr_1 batt1 str Bx - - ----K attributes for box1 +#box_attr_2 batt2 str By - - ----K attributes for box2 +#color_bg_0 colb0 str d0 - - ----K background color 0 +#color_bg_1 colb1 str d1 - - ----K background color 1 +#color_bg_2 colb2 str d2 - - ----K background color 2 +#color_bg_3 colb3 str d3 - - ----K background color 3 +#color_bg_4 colb4 str d4 - - ----K background color 4 +#color_bg_5 colb5 str d5 - - ----K background color 5 +#color_bg_6 colb6 str d6 - - ----K background color 6 +#color_bg_7 colb7 str d7 - - ----K background color 7 +#color_fg_0 colf0 str c0 - - ----K foreground color 0 +#color_fg_1 colf1 str c1 - - ----K foreground color 1 +#color_fg_2 colf2 str c2 - - ----K foreground color 2 +#color_fg_3 colf3 str c3 - - ----K foreground color 3 +#color_fg_4 colf4 str c4 - - ----K foreground color 4 +#color_fg_5 colf5 str c5 - - ----K foreground color 5 +#color_fg_6 colf6 str c6 - - ----K foreground color 6 +#color_fg_7 colf7 str c7 - - ----K foreground color 7 +#font_0 font0 str f0 - - ----- select font 0 +#font_1 font1 str f1 - - ----- select font 1 +#font_2 font2 str f2 - - ----- select font 2 +#font_3 font3 str f3 - - ----- select font 3 +#font_4 font4 str f4 - - ----K select font 4 +#font_5 font5 str f5 - - ----K select font 5 +#font_6 font6 str f6 - - ----K select font 6 +#font_7 font7 str f7 - - ----K select font 7 +#key_back_tab kbtab str k0 - - ----- backtab key +#key_do kdo str ki - - ----K do request key +#key_command kcmd str kd - - ----K command-request key +#key_command_pane kcpn str kW - - ----K command-pane key +#key_end kend str kw - - ----- end key +#key_help khlp str kq - - ----- help key +#key_newline knl str nl - - ----K newline key +#key_next_pane knpn str kv - - ----K next-pane key +#key_prev_cmd kppn str kp - - ----K previous-command key +#key_prev_pane kppn str kV - - ----K previous-pane key +#key_quit kquit str kQ - - ----K quit key +#key_select ksel str kU - - ----- select key +#key_scroll_left kscl str kz - - ----K scroll left +#key_scroll_right kscr str kZ - - ----K scroll right +#key_tab ktab str ko - - ----K tab key +#key_smap_in1 kmpf1 str Kv - - ----K special mapped key 1 input +#key_smap_out1 kmpt1 str KV - - ----K special mapped key 1 output +#key_smap_in2 kmpf2 str Kw - - ----K special mapped key 2 input +#key_smap_out2 kmpt2 str KW - - ----K special mapped key 2 output +#key_smap_in3 kmpf3 str Kx - - ----K special mapped key 3 input +#key_smap_out3 kmpt3 str KX - - ----K special mapped key 3 output +#key_smap_in4 kmpf4 str Ky - - ----K special mapped key 4 input +#key_smap_out4 kmpt4 str KY - - ----K special mapped key 4 output +#key_smap_in5 kmpf5 str Kz - - ----K special mapped key 5 input +#key_smap_out5 kmpt5 str KZ - - ----K special mapped key 5 output +#appl_defined_str apstr str za - - ----K application-defined string +# The key_smap_in[6789] and key_smap_out[6789] capabilities aren't described in +# the IBM manual pages, so the cap name strings are guesses. The terminfo +# names are almost certainly right, the termcap ones almost certainly wrong. +#key_smap_in6 kmpf6 str k! - - ----K special mapped key 6 input +#key_smap_out6 kmpt6 str K@ - - ----K special mapped key 6 output +#key_smap_in7 kmpf7 str k# - - ----K special mapped key 7 input +#key_smap_out7 kmpt7 str K$ - - ----K special mapped key 7 output +#key_smap_in8 kmpf8 str k% - - ----K special mapped key 8 input +#key_smap_out8 kmpt8 str K^ - - ----K special mapped key 8 output +#key_smap_in9 kmpf9 str k& - - ----K special mapped key 9 input +#key_smap_out9 kmpt9 str K* - - ----K special mapped key 9 output +# Undocumented capabilities end here +#key_sf1 ksf1 str S1 - - ----K special function key 1 +#key_sf2 ksf2 str S2 - - ----K special function key 2 +#key_sf3 ksf3 str S3 - - ----K special function key 3 +#key_sf4 ksf4 str S4 - - ----K special function key 4 +#key_sf5 ksf5 str S5 - - ----K special function key 5 +#key_sf6 ksf6 str S6 - - ----K special function key 6 +#key_sf7 ksf7 str S7 - - ----K special function key 7 +#key_sf8 ksf8 str S8 - - ----K special function key 8 +#key_sf9 ksf9 str S9 - - ----K special function key 9 +#key_sf10 ksf10 str SA - - ----K special function key 10 +# AIX version 3 documents different codes for F11, F12 and does not mention +# F13-F64. AIX version 4 uses the same naming for F0-F63 as above. +#key_f11 kf11 str k< - - ----- function key 11 +#key_f12 kf12 str k> - - ----- function key 12 +# Undocumented capabilities end here. +#key_action kact str kJ - - ----K sent by action key +# The IBM docs say these capabilities are for table-drawing, and are +# valid only for aixterm descriptions. +#enter_topline_mode topl str tp - - ----K start top-line mode +#enter_bottom_mode btml str bm - - ----K start bottom-line mode +#enter_rvert_mode rvert str rv - - ----K start right-vertical mode +#enter_lvert_mode lvert str lv - - ----K start left-vertical mode +# +############################################################################# +# +# ALIAS DECLARATIONS +# +# Here we set up aliases for translating extensions into standard terminfo. +# +#---------------------------------- Termcap aliases ------------------------- +# +# BSD aliases: +# +# This is a common error in many termcap files. We'll get notified during +# translation when this (or any other alias) fires. +# +capalias sb sr BSD scroll text down +# +# AT&T extensions: +# +# The old AT&T 5410, 5420, 5425, pc6300plus, 610, and s4 entries used a set of +# nonstandard capabilities. Its signature is the KM capability, used to name +# some sort of keymap file. EE, BO, CI, CV, XS, DS, FL and FE are in this +# set. Comments in the original, and a little cross-checking with other AT&T +# documentation, seem to establish the following mappings: +# +capalias BO mr AT&T enter_reverse_mode +capalias CI vi AT&T cursor_invisible +capalias CV ve AT&T cursor_normal +capalias DS mh AT&T enter_dim_mode +#capalias EE me AT&T exit_attribute_mode +capalias FE LF AT&T label_on +capalias FL LO AT&T label_off +capalias XS mk AT&T enter_secure_mode +# +# We comment out EE because the conflicting XENIX EE is more common in +# old entries. +# +# XENIX extensions: +# +# These are the ones we know how to translate directly: +# +capalias EE mh XENIX exit_attribute_mode +capalias GE ae XENIX exit_alt_charset_mode +capalias GS as XENIX enter_alt_charset_mode +capalias CF vi XENIX cursor_invis +capalias CO ve XENIX cursor_normal +capalias EN @7 XENIX key_end +capalias HM kh XENIX key_home +capalias LD kL XENIX key_dl +capalias PD kN XENIX key_npage +capalias PN po XENIX prtr_off +capalias PS pf XENIX prtr_on +capalias PU kP XENIX key_ppage +capalias RT @8 XENIX kent +capalias UP ku XENIX kcuu1 +capalias G6 IGNORE XENIX double-ACS_ULCORNER +capalias G7 IGNORE XENIX double-ACS_LLCORNER +capalias G5 IGNORE XENIX double-ACS_URCORNER +capalias G8 IGNORE XENIX double-ACS_LRCORNER +capalias Gr IGNORE XENIX double-ACS_LTEE +capalias Gr IGNORE XENIX double-ACS_RTEE +capalias Gu IGNORE XENIX double-ACS_BTEE +capalias Gd IGNORE XENIX double ACS_TTEE +capalias Gh IGNORE XENIX double-ACS_HLINE +capalias Gv IGNORE XENIX double-ACS_VLINE +capalias Gc IGNORE XENIX double-ACS_PLUS +capalias GG IGNORE XENIX acs-glitch +# +# IBM extensions: +# +capalias kq %1 IBM key_help +# +# Iris extensions: +# +capalias HS mh IRIS enter_dim_mode +# +# Tektronix extensions: +# +capalias KA k; Tek key_f10 +capalias KB F1 Tek key_f11 +capalias KC F2 Tek key_f12 +capalias KD F3 Tek key_f13 +capalias KE F4 Tek key_f14 +capalias KF F5 Tek key_f15 +capalias BC Sb Tek set_background +capalias FC Sf Tek set_foreground +# +# There are also the following: +# +# XENIX XENIX variable name name clash with terminfo? +# ----- ------------------- ------------------------- +# CL key_char_left +# CR key_char_right +# CW key_change_window +# HP ?? +# LF key_linefeed label_off +# NU key_next_unlocked_cell +# PL ?? +# PR ?? +# RC key_recalc remove_clock +# RF key_toggle_ref req_for_input +# WL key_word_left +# WR key_word_right +# +# If you know what any of the question-marked ones mean, please tell us. +# +#--------------------------------- Terminfo aliases ------------------------ +# +# IBM extensions: +# +infoalias font0 s0ds IBM set0_des_seq +infoalias font1 s1ds IBM set1_des_seq +infoalias font2 s2ds IBM set2_des_seq +infoalias font3 s3ds IBM set3_des_seq +infoalias kbtab kcbt IBM key_backtab +infoalias ksel kslt IBM key_select +# +# Some others are identical to SVr4/XPG4 capabilities, in particular: +# kcmd, kend, khlp, and kf11...kf63. +# +############################################################################# +# This is a table of ncurses user-definable capabilities which applications +# developers may have used. ncurses may use the table to check consistency of +# types/parameters. Applications may have defined others (such as screen's +# LP and NF), but where a standard capability is available, those alternatives +# are not listed here. +# +used_by ncurses +userdef CO num n number of indexed colors overlaying RGB space +userdef E3 str - clears the terminal's scrollback buffer. +userdef NQ bool - terminal does not support query/response +userdef RGB bool - use direct colors with 1/3 of color-pair bits per color. +userdef RGB num n use direct colors with given number of bits per color. +userdef RGB str - use direct colors with given bit-layout. +userdef TS str - like "tsl", but uses no parameter. +userdef U8 num n terminal does/does not support VT100 SI/SO when processing UTF-8 encoding. +userdef XM str n initialize alternate xterm mouse mode +userdef grbom str - disable real bold (not intensity bright) mode. +userdef gsbom str - enable real bold (not intensity bright) mode. +userdef xm str - mouse response, no parameters +userdef xm str n mouse response, p1 = y-ordinate +userdef xm str nn mouse response, p2 = x-ordinate +userdef xm str nnn mouse response, p3 = button +userdef xm str nnns mouse response, p4 = state, e.g., pressed or released +userdef xm str nnnsn mouse response, p5 = y-ordinate starting region +userdef xm str nnnsnn mouse response, p6 = x-ordinate starting region +userdef xm str nnnsnnn mouse response, p7 = y-ordinate ending region +userdef xm str nnnsnnnn mouse response, p8 = x-ordinate ending region +# +used_by mintty +userdef Rmol str - remove overline-mode +userdef Smol str - set overline-mode +userdef blink2 str - turn on rapid blinking +userdef norm str - turn off bold and half-bright mode +userdef opaq str - turn off blank mode +userdef setal str n set underline-color +userdef smul2 str - begin double underline mode +# +used_by screen +userdef AN bool - turn on autonuke. +userdef AX bool - understands ANSI set default fg/bg color (\E[39m / \E[49m). +userdef C0 str - use the string as a conversion table for font '0', like acsc. +userdef C8 bool - terminal shows bold as high-intensity colors. +userdef CE str - switch cursor-keys back to normal mode. +userdef CS str - switch cursor-keys to application mode. +userdef E0 str - switch charset 'G0' back to standard charset. Default is '\E(B'. +userdef G0 bool - terminal can deal with ISO 2022 font selection sequences. +userdef KJ str s set the encoding of the terminal. +userdef OL num n set the screen program's output buffer limit. +userdef S0 str s switch charset 'G0' to the specified charset. Default is '\E(%.'. +userdef TF bool - add missing capabilities to screen's termcap/info entry. (Set by default). +userdef WS str nn resize display. This capability has the desired width and height as arguments. SunView(tm) example: '\E[8;%d;%dt'. +userdef XC str s describe a translation of characters to strings depending on the current font. +userdef XT bool - terminal understands special xterm sequences (OSC, mouse tracking). +userdef Z0 str - change width to 132 columns. +userdef Z1 str - change width to 80 columns. +# +used_by tmux +userdef Cr str - restore the default cursor color. +userdef Cs str s set the cursor color. +userdef Csr str n change the cursor style, overriding Ss. +userdef Ms str ss store the current buffer in the host terminal's selection (clipboard). +userdef Se str - reset the cursor style to the terminal initial state. +userdef Smulx str n modify the appearance of underlines in VTE. +userdef Ss str n change the cursor style. +userdef rmxx str - reset ECMA-48 strikeout/crossed-out attributes. +userdef smxx str - set ECMA-48 strikeout/crossed-out attributes. +# +used_by vim +userdef BD str - disables bracketed paste +userdef BE str - enables bracketed paste +userdef PE str - is sent after pasted text +userdef PS str - is sent before pasted text +userdef RV str - report terminal secondary device attributes +userdef XR str - report terminal version as a free-format string. +userdef XF bool - terminal supports xterm focus in/out +userdef fd str - disable xterm focus-events +userdef fe str - enable xterm focus-events +userdef rv str - response to RV, regular expression +userdef xr str - response to XR, regular expression +# +used_by xterm +userdef csl str - clear status line +userdef kDC3 str - alt delete-character +userdef kDC4 str - shift+alt delete-character +userdef kDC5 str - control delete-character +userdef kDC6 str - shift+control delete-character +userdef kDC7 str - alt+control delete-character +userdef kDN str - shift down-cursor +userdef kDN3 str - alt down-cursor +userdef kDN4 str - shift+alt down-cursor +userdef kDN5 str - control down-cursor +userdef kDN6 str - shift+control down-cursor +userdef kDN7 str - alt+control down-cursor +userdef kEND3 str - alt end +userdef kEND4 str - shift+alt end +userdef kEND5 str - control end +userdef kEND6 str - shift+control end +userdef kEND7 str - alt+control end +userdef kHOM3 str - alt home +userdef kHOM4 str - shift+alt home +userdef kHOM5 str - control home +userdef kHOM6 str - shift+control home +userdef kHOM7 str - alt+control home +userdef kIC3 str - alt insert-character +userdef kIC4 str - shift+alt insert-character +userdef kIC5 str - control insert-character +userdef kIC6 str - shift+control insert-character +userdef kIC7 str - alt+control insert-character +userdef kLFT3 str - alt left-cursor +userdef kLFT4 str - shift+alt left-cursor +userdef kLFT5 str - control left-cursor +userdef kLFT6 str - shift+control left-cursor +userdef kLFT7 str - alt+control left-cursor +userdef kNXT3 str - alt next +userdef kNXT4 str - shift+alt next +userdef kNXT5 str - control next +userdef kNXT6 str - shift+control next +userdef kNXT7 str - alt+control next +userdef kPRV3 str - alt previous +userdef kPRV4 str - shift+alt previous +userdef kPRV5 str - control previous +userdef kPRV6 str - shift+control previous +userdef kPRV7 str - alt+control previous +userdef kRIT3 str - alt right-cursor +userdef kRIT4 str - shift+alt right-cursor +userdef kRIT5 str - control right-cursor +userdef kRIT6 str - shift+control right-cursor +userdef kRIT7 str - alt+control right-cursor +userdef kUP str - shift up-cursor +userdef kUP3 str - alt up-cursor +userdef kUP4 str - shift+alt up-cursor +userdef kUP5 str - control up-cursor +userdef kUP6 str - shift+control up-cursor +userdef kUP7 str - alt+control up-cursor +userdef ka2 str - vt220-keypad extensions +userdef kb1 str - vt220-keypad extensions +userdef kb3 str - vt220-keypad extensions +userdef kc2 str - vt220-keypad extensions +userdef kxIN str - mouse response on focus-in +userdef kxOUT str - mouse response on focus-out +############################################################################# diff --git a/contrib/ncurses/include/Caps.aix4 b/contrib/ncurses/include/Caps.aix4 new file mode 100644 index 00000000..1adb848e --- /dev/null +++ b/contrib/ncurses/include/Caps.aix4 @@ -0,0 +1,1126 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 2001-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas Dickey +# +# $Id: Caps.aix4,v 1.28 2024/04/20 21:05:02 tom Exp $ +# +# This is an adaptation of ncurses' termcap/terminfo capability table, which +# is designed to align with AIX 4.x's terminfo. +# +# This table is used to generate initializers for tables that drive tic, +# infocmp, and the library compilation code used to support the termcap +# compatibility hack. It is also used to generate the tabular portion of the +# terminfo(5) man page; lines beginning with `#%' are passed through to become +# the terminfo table. +# +# This file has three major sections; a standard-capabilities table, two +# extension-capability tables, and a section of aliases declarations. +# The first two have the same format, as follows: +# +# FILE FORMAT +# +# Column 1: terminfo variable name +# Column 2: terminfo capability name +# Column 3: capability type (Boolean, numeric, or string) +# Column 4: termcap capability name +# Column 5: KEY_xxx name, if any, `-' otherwise +# Column 6: value for KEY_xxx name, if any, `-' otherwise +# Column 7: Lead with `Y' if capability should be emitted in termcap +# translations, `-' otherwise +# Column 8: capability description +# +# The codes following [Y-] in column 7 describe the versions of termcap which +# use the given capability. This information is not used by the curses library +# proper; rather, it is there to help the terminfo maintainer avoid emitting +# termcap entry translations that are more than 1023 bytes long (and tank a +# lot of old termcap-using programs). The codes read as follows: +# B = mentioned in the BSD man page for 4.4BSD curses +# C = used by the 4.4BSD curses library +# G = mentioned in the documentation for GNU termcap +# E = used by GNU Emacs +# K = remove this terminfo capability when translating to standard format +# The important codes are C and E. A cap with C or E should be preserved in +# translation if possible. The problem is that preserving all such caps may +# lead to some termcap translations being too long. The termcap maintainer +# has a bit of a juggling act to do...potential problem cases are marked with +# an asterisk (*). +# +# The aliases section has the following format: +# +# Column 1: either `capalias' or `infoalias' +# Column 2: name to be aliased +# Column 3: what name it should translate to. The name IGNORE means it +# should be discarded with a warning message. +# Column 4: name of the extension set (used for compiler warning messages) +# Column 5: capability description (usually an associated terminfo variable) +# +# HANDLING TERMCAP AND TERMINFO EXTENSIONS +# +# There are basically five different ways to handle termcap and terminfo +# extensions: +# +# 1. Don't list the capname here, or list it but comment it out (the latter +# is preferable; someone might want to handle it in the future). If you do +# this, the capability will be treated as unknown and raise a warning from +# the compiler. +# +# 2. Alias it. This is appropriate if the capability has the same meaning +# as an already-supported one. The compiler will handle aliasing, emitting +# an appropriate informational message whenever an alias fires. +# +# 3. List it in the standard table. You almost certainly do *not* want +# to do this -- the capabilities in that one, and their order, have been +# carefully chosen to be SVr4-binary-compatible when they're written out +# as a terminfo object, and breaking this would be bad. It is up to the ncurses +# library what to do with the terminfo data after it is read in. +# +# 4. List it in the aliases table with an IGNORE target field. If you +# do this, the capability will be ignored on input (though the user will +# get a warning message about it). +# +# 5. List it in the extensions table. If you do this, the compiler will +# silently accept the capability, but the curses library proper will never +# see it (because it won't be written out as part of the terminfo object +# format). It is up to you what you have the compiler do with it. +# +# There are two opposite reasons to choose option 5. One is when you want +# to eat the capability silently and discard it when doing translations +# to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are +# in this class. Nothing will ever use them again. +# +# More usually, you want the compiler to try to deduce something from the +# capability value that it can use to translate it into your output format. +# You'll need to write custom code, probably in postprocess_termcap() or +# postprocess_terminfo(), to handle the translation. +# +# CONTROLLING ENTRY LENGTH +# +# Notes on specific elisions made to fit translations within 1023 bytes: +# +# Machines with IBM PC-like keyboards want to be able to define the following +# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- +# only environments for End or Home-Down), key_dc, and key_ic. This is also +# the set of keys the `joe' editor will be upset if it can't see. So don't +# trim those out of the set to be translated to termcap, or various users of +# the termcap file will become irate. +# +# It might look tempting to leave those long init strings out of translations. +# We can't do it (yet); 4.4BSD tput and tset use them. +# +# We retain the sgr capability in translation in spite of the fact that neither +# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are +# hard to understand without it, and (b) the entries in which it is long tend +# to be older types that don't use up a lot of string space on function keys. +# The tic(1) translation code will complain and elide it if it makes a critical +# difference (there is special code in tic to recognize this situation). +# +# Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion +# optimizer in BSD curses didn't use them. This omission seems to be the +# single most effective one, it shortened the resolved length of all thirteen +# problem entries in the 9.9.0 version of the terminfo master below critical. +# +# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap +# translations go back over critical if we do this. As 4.4BSD curses fades +# into history and GNU termcap's application base shrinks towards being GNU +# Emacs only, we'll probably elide out some BSD-only capabilities in order +# to buy space for non-essentials Emacs is still using. Capabilities high +# on that hit list: rc, sc, uc. +# +# FORMATTING THE TABLES +# +# We manually specify a (minimum) column width for the capability name +# and terminfo code columns in the tables to achieve a consistent +# arrangement; as used here, tbl(1) cannot know the width required by +# one table's data while formatting another's. +# +# The longest capability names (C variables) are +# "enter_near_letter_quality" and "bit_image_carriage_return" (tied at +# 25n), and the longest terminfo code is "setcolor" (8n). +# +# The tables are a tight fit on traditional man(7) implementations that +# use a line length of 65n, and the "Description" column has little room +# within which the formatter can make breaking or adjustment decisions. +# Words like "micro_..._address" and "parm_..._micro" don't break. +# Reducing the inter-column gaps to 2 ens gives them enough room. --GBR +# +############################################################################# +# +# STANDARD CAPABILITIES +# +#%Tables of capabilities +#%.I \%ncurses +#%recognizes in a +#%.I \%term\%info +#%terminal type description and available to +#%.IR \%term\%info -using +#%code follow. +#%.bP +#%The capability name identifies the symbol by which the programmer +#%using the +#%.I \%term\%info +#%API accesses the capability. +#%.bP +#%The TI +#%.RI ( \%term\%info ) +#%code is the short name used by a person composing or updating a +#%terminal type entry. +#%.IP +#%Whenever possible, +#%these codes are the same as or similar to those of the ANSI X3.64-1979 +#%standard +#%(now superseded by ECMA-48, +#%which uses identical or very similar names). +#%Semantics are also intended to match those of the specification. +#%.IP +#%.I \%term\%info +#%codes have no hard length limit, +#%but +#%.I \%ncurses +#%maintains an informal one of 5 characters to keep them short and to +#%allow the tabs in the source file +#%.I Caps +#%to line up nicely. +#%(Some standard codes exceed this limit regardless.) +#%.bP +#%The TC +#%.RI ( termcap ) +#%code is that used by the corresponding API of +#%.IR \%ncurses . +#%(Some capabilities are new, +#%and have names that BSD +#%.I termcap +#%did not originate.) +#%.bP +#%The description field attempts to convey the capability's semantics. +#%.PP +#%The description field employs a handful of notations. +#%.TP +#%.B (P) +#%indicates that padding may be specified. +#%.TP +#%.B (P*) +#%indicates that padding may vary in proportion to the number of output +#%lines affected. +#%.TP +#%.BI # i +#%indicates the +#%.IR i th +#%parameter of a string capability; +#%the programmer should pass the string to \fB\%tparm\fP(3X) with the +#%parameters listed. +#%.IP +#%If the description lists no parameters, +#%passing the string to \fB\%tparm\fP(3X) may produce unexpected +#%behavior, +#%for instance if the string contains percent signs. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Boolean Capability Name TI TC Description +#%_ +auto_left_margin bw bool bw - - YB-G- cub1 wraps from column 0 to last column +auto_right_margin am bool am - - YBCGE terminal has automatic margins +no_esc_ctlc xsb bool xb - - YBCG- beehive (f1=escape, f2=ctrl C) +ceol_standout_glitch xhp bool xs - - YBCGE standout not erased by overwriting (hp) +eat_newline_glitch xenl bool xn - - YBCGE newline ignored after 80 cols (concept) +erase_overstrike eo bool eo - - YBCG- can erase overstrikes with a blank +generic_type gn bool gn - - YB-G- generic line type +hard_copy hc bool hc - - YBCG- hardcopy terminal +has_meta_key km bool km - - YB-GE Has a meta key (i.e., sets 8th-bit) +has_status_line hs bool hs - - YB-G- has extra status line +insert_null_glitch in bool in - - YBCGE insert mode distinguishes nulls +memory_above da bool da - - YBCG- display may be retained above the screen +memory_below db bool db - - YB-GE display may be retained below the screen +move_insert_mode mir bool mi - - YBCGE safe to move while in insert mode +move_standout_mode msgr bool ms - - YBCGE safe to move while in standout mode +over_strike os bool os - - YBCG- terminal can overstrike +status_line_esc_ok eslok bool es - - YB-G- escape can be used on the status line +dest_tabs_magic_smso xt bool xt - - YBCGE tabs destructive, magic so char (t1061) +tilde_glitch hz bool hz - - YB-GE cannot print ~'s (Hazeltine) +transparent_underline ul bool ul - - YBCGE underline character overstrikes +xon_xoff xon bool xo - - YB--- terminal uses xon/xoff handshaking +needs_xon_xoff nxon bool nx - - ----- padding will not work, xon/xoff required +prtr_silent mc5i bool 5i - - ----- printer will not echo on screen +hard_cursor chts bool HC - - ----- cursor is hard to see +non_rev_rmcup nrrmc bool NR - - ----- smcup does not reverse rmcup +no_pad_char npc bool NP - - ----- pad character does not exist +non_dest_scroll_region ndscr bool ND - - ----- scrolling region is non-destructive +can_change ccc bool cc - - ----- terminal can re-define existing colors +back_color_erase bce bool ut - - ----- screen erased with background color +hue_lightness_saturation hls bool hl - - ----- terminal uses only HLS color notation (Tektronix) +col_addr_glitch xhpa bool YA - - ----- only positive motion for hpa/mhpa caps +cr_cancels_micro_mode crxm bool YB - - ----- using cr turns off micro mode +has_print_wheel daisy bool YC - - ----- printer needs operator to change character set +row_addr_glitch xvpa bool YD - - ----- only positive motion for vpa/mvpa caps +semi_auto_right_margin sam bool YE - - ----- printing in last column causes cr +cpi_changes_res cpix bool YF - - ----- changing character pitch changes resolution +lpi_changes_res lpix bool YG - - ----- changing line pitch changes resolution +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +columns cols num co - - YBCGE number of columns in a line +init_tabs it num it - - YB-G- tabs initially every # spaces +lines lines num li - - YBCGE number of lines on screen or page +lines_of_memory lm num lm - - YB-G- lines of memory if > line. 0 means varies +magic_cookie_glitch xmc num sg - - YBCGE number of blank characters left by smso or rmso +padding_baud_rate pb num pb - - YB-GE lowest baud rate where padding needed +virtual_terminal vt num vt - - YB--- virtual terminal number (CB/unix) +width_status_line wsl num ws - - YB-G- number of columns in status line +num_labels nlab num Nl - - ----- number of labels on screen +label_height lh num lh - - ----- rows in each label +label_width lw num lw - - ----- columns in each label +max_attributes ma num ma - - YBC-- maximum combined attributes terminal can handle +maximum_windows wnum num MW - - ----- maximum number of definable windows +# These came in with SVr4's color support +max_colors colors num Co - - ----- maximum number of colors on screen +max_pairs pairs num pa - - ----- maximum number of color-pairs on the screen +no_color_video ncv num NC - - ----- video attributes that cannot be used with colors +#%.TE +#%.PP +#%. +#%The following numeric capabilities are present in the SVr4.0 term structure, +#%but are not yet documented in the man page. +#%They came in with SVr4's printer support. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +buffer_capacity bufsz num Ya - - ----- numbers of bytes buffered before printing +dot_vert_spacing spinv num Yb - - ----- spacing of pins vertically in pins per inch +dot_horz_spacing spinh num Yc - - ----- spacing of dots horizontally in dots per inch +max_micro_address maddr num Yd - - ----- maximum value in micro_..._address +max_micro_jump mjump num Ye - - ----- maximum value in parm_..._micro +micro_col_size mcs num Yf - - ----- character step size when in micro mode +micro_line_size mls num Yg - - ----- line step size when in micro mode +number_of_pins npins num Yh - - ----- numbers of pins in print-head +output_res_char orc num Yi - - ----- horizontal resolution in units per line +output_res_line orl num Yj - - ----- vertical resolution in units per line +output_res_horz_inch orhi num Yk - - ----- horizontal resolution in units per inch +output_res_vert_inch orvi num Yl - - ----- vertical resolution in units per inch +print_rate cps num Ym - - ----- print rate in characters per second +wide_char_size widcs num Yn - - ----- character step size when in double wide mode +buttons btns num BT - - ----- number of buttons on mouse +bit_image_entwining bitwin num Yo - - ----- number of passes for each bit-image row +bit_image_type bitype num Yp - - ----- type of bit-image device +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +back_tab cbt str bt - - YBCGE back tab (P) +bell bel str bl - - YB-GE audible signal (bell) (P) +carriage_return cr str cr - - YBCGE carriage return (P*) (P*) +change_scroll_region csr str cs - - YBCGE change region to line #1 to line #2 (P) +clear_all_tabs tbc str ct - - YB-G- clear all tab stops (P) +clear_screen clear str cl - - YBCGE clear screen and home cursor (P*) +clr_eol el str ce - - YBCGE clear to end of line (P) +clr_eos ed str cd - - YBCGE clear to end of screen (P*) +column_address hpa str ch - - -B-GE* horizontal position #1, absolute (P) +command_character cmdch str CC - - YB-G- terminal settable cmd character in prototype !? +cursor_address cup str cm - - YBCGE move to row #1 columns #2 +cursor_down cud1 str do - - YBCGE down one line +cursor_home home str ho - - YBCGE home cursor (if no cup) +cursor_invisible civis str vi - - YB-G- make cursor invisible +cursor_left cub1 str le - - YBCGE move left one space +cursor_mem_address mrcup str CM - - YB-G- memory relative cursor addressing, move to row #1 columns #2 +cursor_normal cnorm str ve - - YBCGE make cursor appear normal (undo civis/cvvis) +cursor_right cuf1 str nd - - YBCGE non-destructive space (move right one space) +cursor_to_ll ll str ll - - YBCGE last line, first column (if no cup) +cursor_up cuu1 str up - - YBCGE up one line +cursor_visible cvvis str vs - - YBCGE make cursor very visible +delete_character dch1 str dc - - YBCGE delete character (P*) +delete_line dl1 str dl - - YBCGE delete line (P*) +dis_status_line dsl str ds - - YB-G- disable status line +down_half_line hd str hd - - YB-G- half a line down +enter_alt_charset_mode smacs str as - - YB-G- start alternate character set (P) +enter_blink_mode blink str mb - - YB-G- turn on blinking +enter_bold_mode bold str md - - YB-G- turn on bold (extra bright) mode +enter_ca_mode smcup str ti - - YBCGE string to start programs using cup +enter_delete_mode smdc str dm - - YBCGE enter delete mode +enter_dim_mode dim str mh - - YB-G- turn on half-bright mode +enter_insert_mode smir str im - - YBCGE enter insert mode +enter_secure_mode invis str mk - - -B-G-* turn on blank mode (characters invisible) +enter_protected_mode prot str mp - - -B-G-* turn on protected mode +enter_reverse_mode rev str mr - - YB-G- turn on reverse video mode +enter_standout_mode smso str so - - YBCGE begin standout mode +enter_underline_mode smul str us - - YBCGE begin underline mode +erase_chars ech str ec - - YB-G- erase #1 characters (P) +exit_alt_charset_mode rmacs str ae - - YB-G- end alternate character set (P) +exit_attribute_mode sgr0 str me - - YB-GE turn off all attributes +exit_ca_mode rmcup str te - - YBCGE strings to end programs using cup +exit_delete_mode rmdc str ed - - YBCGE end delete mode +exit_insert_mode rmir str ei - - YBCGE exit insert mode +exit_standout_mode rmso str se - - YBCGE exit standout mode +exit_underline_mode rmul str ue - - YBCGE exit underline mode +flash_screen flash str vb - - YBCGE visible bell (may not move cursor) +form_feed ff str ff - - YB-G- hardcopy terminal page eject (P*) +from_status_line fsl str fs - - YB-G- return from status line +init_1string is1 str i1 - - YB-G- initialization string +init_2string is2 str is - - YB-G- initialization string +init_3string is3 str i3 - - YB-G- initialization string +init_file if str if - - YB-G- name of initialization file +insert_character ich1 str ic - - YBCGE insert character (P) +insert_line il1 str al - - YBCGE insert line (P*) +insert_padding ip str ip - - YBCGE insert padding after inserted character +key_backspace kbs str kb KEY_BACKSPACE 0407 YB-G- backspace key +key_catab ktbc str ka KEY_CATAB 0526 -B-G-* clear-all-tabs key +key_clear kclr str kC KEY_CLEAR 0515 -B-G-* clear-screen or erase key +key_ctab kctab str kt KEY_CTAB 0525 -B-G-* clear-tab key +key_dc kdch1 str kD KEY_DC 0512 YB-G- delete-character key +key_dl kdl1 str kL KEY_DL 0510 -B-G-* delete-line key +key_down kcud1 str kd KEY_DOWN 0402 YBCGE down-arrow key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode +key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key +key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key +key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key +key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key +key_f10 kf10 str k; KEY_F(10) - ----E F10 function key +key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key +key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key +key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key +key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key +key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key +key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key +key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key +key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key +key_home khome str kh KEY_HOME 0406 YBCGE home key +key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key +key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key +key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key +key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) +key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key +key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key +key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key +key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key +key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key +key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key +key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key +keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode +keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode +lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 +lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 +lab_f10 lf10 str la - - ----- label on function key f10 if not f10 +lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 +lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 +lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 +lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 +lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 +lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 +lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 +lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 +meta_off rmm str mo - - YB-G-* turn off meta mode +meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) +newline nel str nw - - YB-G-* newline (behave like cr followed by lf) +pad_char pad str pc - - YBCGE padding char (instead of null) +parm_dch dch str DC - - YB-GE delete #1 characters (P*) +parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) +parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) +parm_ich ich str IC - - YB-GE insert #1 characters (P*) +parm_index indn str SF - - YBCG- scroll forward #1 lines (P) +parm_insert_line il str AL - - YBCGE insert #1 lines (P*) +parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) +parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) +parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) +parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) +pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 +pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 +pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 +print_screen mc0 str ps - - -B-G-* print contents of screen +prtr_off mc4 str pf - - -B-G-* turn off printer +prtr_on mc5 str po - - -B-G-* turn on printer +repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) +reset_1string rs1 str r1 - - -B--- reset string +reset_2string rs2 str r2 - - -B--- reset string +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +reset_3string rs3 str r3 - - -B--- reset string +reset_file rf str rf - - -B--- name of reset file +restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor +row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) +save_cursor sc str sc - - YBCG- save current cursor position (P) +scroll_forward ind str sf - - YBCGE scroll text up (P) +scroll_reverse ri str sr - - YBCGE scroll text down (P) +set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) +set_tab hts str st - - YB-G- set a tab in every row, current columns +set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 +tab ht str ta - - YBCGE tab to next 8-space hardware tab stop +to_status_line tsl str ts - - YB-G- move to status line, column #1 +underline_char uc str uc - - YBCG- underline char and move past it +up_half_line hu str hu - - YB-G- half a line up +init_prog iprog str iP - - -B--- path name of program for initialization +key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad +key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad +key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad +key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad +key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad +prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes +# +# IBM extensions +# +# These extensions follow ptr_non (replacing everything after it) in IBM +# terminfo files. +# +# The places in the box[12] capabilities correspond to acsc characters, here is +# the mapping: +# +# box1[0] = ACS_ULCORNER +# box1[1] = ACS_HLINE +# box1[2] = ACS_URCORNER +# box1[3] = ACS_VLINE +# box1[4] = ACS_LRCORNER +# box1[5] = ACS_LLCORNER +# box1[6] = ACS_TTEE +# box1[7] = ACS_RTEE +# box1[8] = ACS_BTEE +# box1[9] = ACS_LTEE +# box1[10] = ACS_PLUS +# +# The box2 characters are the double-line versions of these forms graphics. +# +box_chars_1 box1 str bx - - ----K box characters primary set +box_chars_2 box2 str by - - ----K box characters secondary set +box_attr_1 batt1 str Bx - - ----K attributes for box1 +box_attr_2 batt2 str By - - ----K attributes for box2 +color_bg_0 colb0 str d0 - - ----K background color 0 +color_bg_1 colb1 str d1 - - ----K background color 1 +color_bg_2 colb2 str d2 - - ----K background color 2 +color_bg_3 colb3 str d3 - - ----K background color 3 +color_bg_4 colb4 str d4 - - ----K background color 4 +color_bg_5 colb5 str d5 - - ----K background color 5 +color_bg_6 colb6 str d6 - - ----K background color 6 +color_bg_7 colb7 str d7 - - ----K background color 7 +color_fg_0 colf0 str c0 - - ----K foreground color 0 +color_fg_1 colf1 str c1 - - ----K foreground color 1 +color_fg_2 colf2 str c2 - - ----K foreground color 2 +color_fg_3 colf3 str c3 - - ----K foreground color 3 +color_fg_4 colf4 str c4 - - ----K foreground color 4 +color_fg_5 colf5 str c5 - - ----K foreground color 5 +color_fg_6 colf6 str c6 - - ----K foreground color 6 +color_fg_7 colf7 str c7 - - ----K foreground color 7 +font_0 font0 str f0 - - ----K select font 0 +font_1 font1 str f1 - - ----K select font 1 +font_2 font2 str f2 - - ----K select font 2 +font_3 font3 str f3 - - ----K select font 3 +font_4 font4 str f4 - - ----K select font 4 +font_5 font5 str f5 - - ----K select font 5 +font_6 font6 str f6 - - ----K select font 6 +font_7 font7 str f7 - - ----K select font 7 +key_back_tab kbtab str kO - - ----K backtab key +key_do kdo str ki - - ----K do request key +key_command kcmd str @4 - - ----K command-request key +key_command_pane kcpn str kW - - ----K command-pane key +key_end kend str @7 KEY_END 0550 ----- end key +key_help khlp str %1 - - ----- help key +key_newline knl str kn - - ----K newline key +key_next_pane knpn str kv - - ----K next-pane key +key_prev_cmd kpcmd str kp - - ----K previous-command key +key_prev_pane kppn str kV - - ----K previous-pane key +key_quit kquit str kQ - - ----K quit key +key_select_aix ksel str kU - - ----- select key +key_scroll_left kscl str kz - - ----K scroll left +key_scroll_right kscr str kZ - - ----K scroll right +key_tab ktab str ko - - ----K tab key +key_smap_in1 kmpf1 str Kv - - ----K special mapped key 1 input +key_smap_out1 kmpt1 str KV - - ----K special mapped key 1 output +key_smap_in2 kmpf2 str Kw - - ----K special mapped key 2 input +key_smap_out2 kmpt2 str KW - - ----K special mapped key 2 output +key_smap_in3 kmpf3 str Kx - - ----K special mapped key 3 input +key_smap_out3 kmpt3 str KX - - ----K special mapped key 3 output +key_smap_in4 kmpf4 str Ky - - ----K special mapped key 4 input +key_smap_out4 kmpt4 str KY - - ----K special mapped key 4 output +key_smap_in5 kmpf5 str Kz - - ----K special mapped key 5 input +key_smap_out5 kmpt5 str KZ - - ----K special mapped key 5 output +appl_defined_str apstr str za - - ----K application-defined string +key_smap_in6 kmpf6 str Kr - - ----K special mapped key 6 input +key_smap_out6 kmpt6 str KR - - ----K special mapped key 6 output +key_smap_in7 kmpf7 str Ks - - ----K special mapped key 7 input +key_smap_out7 kmpt7 str KS - - ----K special mapped key 7 output +key_smap_in8 kmpf8 str Kt - - ----K special mapped key 8 input +key_smap_out8 kmpt8 str KT - - ----K special mapped key 8 output +key_smap_in9 kmpf9 str Ku - - ----K special mapped key 9 input +key_smap_out9 kmpt9 str KU - - ----K special mapped key 9 output +key_sf1 ksf1 str S1 - - ----K special function key 1 +key_sf2 ksf2 str S2 - - ----K special function key 2 +key_sf3 ksf3 str S3 - - ----K special function key 3 +key_sf4 ksf4 str S4 - - ----K special function key 4 +key_sf5 ksf5 str S5 - - ----K special function key 5 +key_sf6 ksf6 str S6 - - ----K special function key 6 +key_sf7 ksf7 str S7 - - ----K special function key 7 +key_sf8 ksf8 str S8 - - ----K special function key 8 +key_sf9 ksf9 str S9 - - ----K special function key 9 +key_sf10 ksf10 str S0 - - ----K special function key 10 +key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key +key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key +key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key +key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key +key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key +key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key +key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key +key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key +key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key +key_f20 kf20 str FA KEY_F(20) - ----E F20 function key +key_f21 kf21 str FB KEY_F(21) - ----E F21 function key +key_f22 kf22 str FC KEY_F(22) - ----E F22 function key +key_f23 kf23 str FD KEY_F(23) - ----E F23 function key +key_f24 kf24 str FE KEY_F(24) - ----E F24 function key +key_f25 kf25 str FF KEY_F(25) - ----E F25 function key +key_f26 kf26 str FG KEY_F(26) - ----E F26 function key +key_f27 kf27 str FH KEY_F(27) - ----E F27 function key +key_f28 kf28 str FI KEY_F(28) - ----E F28 function key +key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key +key_f30 kf30 str FK KEY_F(30) - ----E F30 function key +key_f31 kf31 str FL KEY_F(31) - ----E F31 function key +key_f32 kf32 str FM KEY_F(32) - ----E F32 function key +key_f33 kf33 str FN KEY_F(33) - ----E F33 function key +key_f34 kf34 str FO KEY_F(34) - ----E F34 function key +key_f35 kf35 str FP KEY_F(35) - ----E F35 function key +key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key +key_f37 kf37 str FR KEY_F(37) - ----E F37 function key +key_f38 kf38 str FS KEY_F(38) - ----E F38 function key +key_f39 kf39 str FT KEY_F(39) - ----E F39 function key +key_f40 kf40 str FU KEY_F(40) - ----E F40 function key +key_f41 kf41 str FV KEY_F(41) - ----E F41 function key +key_f42 kf42 str FW KEY_F(42) - ----E F42 function key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_f43 kf43 str FX KEY_F(43) - ----E F43 function key +key_f44 kf44 str FY KEY_F(44) - ----E F44 function key +key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key +key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key +key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key +key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key +key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key +key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key +key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key +key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key +key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key +key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key +key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key +key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key +key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key +key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key +key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key +key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key +key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key +key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key +key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key +key_action kact str kJ - - ----K sent by action key + +# The IBM docs say these capabilities are for table-drawing, and are +# valid only for aixterm descriptions. +enter_topline_mode topl str tp - - ----K start top-line mode +enter_bottom_mode btml str bm - - ----K start bottom-line mode +enter_rvert_mode rvert str rv - - ----K start right-vertical mode +enter_lvert_mode lvert str lv - - ----K start left-vertical mode +# +# SVr4 capabilities resume here. Note that key_end is in the IBM-extensions. +# +char_padding rmp str rP - - ----- like ip but when in insert mode +acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 +plab_norm pln str pn - - ----- program label #1 to show string #2 +key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key +enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking +exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking +enter_am_mode smam str SA - - ----- turn on automatic margins +exit_am_mode rmam str RA - - ----- turn off automatic margins +xon_character xonc str XN - - ----- XON character +xoff_character xoffc str XF - - ----- XOFF character +ena_acs enacs str eA - - ----- enable alternate char set +label_on smln str LO - - ----- turn on soft labels +label_off rmln str LF - - ----- turn off soft labels +key_beg kbeg str @1 KEY_BEG 0542 ----- begin key +key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key +key_close kclo str @3 KEY_CLOSE 0544 ----- close key +#key_command kcmd str @4 KEY_COMMAND 0545 ----- command key +key_copy kcpy str @5 KEY_COPY 0546 ----- copy key +key_create kcrt str @6 KEY_CREATE 0547 ----- create key +#key_end kend str @7 KEY_END 0550 ----- end key +key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key +key_exit kext str @9 KEY_EXIT 0551 ----- exit key +key_find kfnd str @0 KEY_FIND 0552 ----- find key +#key_help khlp str %1 KEY_HELP 0553 ----- help key +key_mark kmrk str %2 KEY_MARK 0554 ----- mark key +key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key +key_move kmov str %4 KEY_MOVE 0556 ----- move key +key_next knxt str %5 KEY_NEXT 0557 ----- next key +key_open kopn str %6 KEY_OPEN 0560 ----- open key +key_options kopt str %7 KEY_OPTIONS 0561 ----- options key +key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key +key_print kprt str %9 KEY_PRINT 0532 ----- print key +key_redo krdo str %0 KEY_REDO 0563 ----- redo key +key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key +key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key +key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key +key_restart krst str &4 KEY_RESTART 0567 ----- restart key +key_resume kres str &5 KEY_RESUME 0570 ----- resume key +key_save ksav str &6 KEY_SAVE 0571 ----- save key +key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key +key_undo kund str &8 KEY_UNDO 0630 ----- undo key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key +key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key +key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key +key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key +key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key +key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key +key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key +key_select kslt str *6 KEY_SELECT 0601 ----- select key +key_send kEND str *7 KEY_SEND 0602 ----- shifted end key +key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key +key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key +key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key +key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key +key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key +key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key +key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key +key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key +key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key +key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key +key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key +key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key +key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key +key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key +key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key +key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key +key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key +key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key +key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key +key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key +req_for_input rfi str RF - - ----- send next input char (for ptys) +clr_bol el1 str cb - - ----- Clear to beginning of line +clear_margins mgc str MC - - ----- clear right and left soft margins +set_left_margin smgl str ML - - ----- set left soft margin at current column (not in BSD \fItermcap\fP) +set_right_margin smgr str MR - - ----- set right soft margin at current column +label_format fln str Lf - - ----- label format +set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs +display_clock dclk str DK - - ----- display clock +remove_clock rmclk str RC - - ----- remove clock +create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 +goto_window wingo str WG - - ----- go to window #1 +hangup hup str HU - - ----- hang-up phone +dial_phone dial str DI - - ----- dial number #1 +quick_dial qdial str QD - - ----- dial number #1 without checking +tone tone str TO - - ----- select touch tone dialing +pulse pulse str PU - - ----- select pulse dialing +flash_hook hook str fh - - ----- flash switch hook +fixed_pause pause str PA - - ----- pause for 2-3 seconds +wait_tone wait str WA - - ----- wait for dial-tone +user0 u0 str u0 - - ----- User string #0 +user1 u1 str u1 - - ----- User string #1 +user2 u2 str u2 - - ----- User string #2 +user3 u3 str u3 - - ----- User string #3 +user4 u4 str u4 - - ----- User string #4 +user5 u5 str u5 - - ----- User string #5 +user6 u6 str u6 - - ----- User string #6 +user7 u7 str u7 - - ----- User string #7 +user8 u8 str u8 - - ----- User string #8 +user9 u9 str u9 - - ----- User string #9 +# +# SVr4 added these capabilities to support color +# +orig_pair op str op - - ----- Set default pair to its original value +orig_colors oc str oc - - ----- Set all color pairs to the original ones +initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) +initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) +set_color_pair scp str sp - - ----- Set current color pair to #1 +set_foreground setf str Sf - - ----- Set foreground color #1 +set_background setb str Sb - - ----- Set background color #1 +# +# SVr4 added these capabilities to support printers +# +change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 +change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 +change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 +change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 +define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 +enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode +enter_italics_mode sitm str ZH - - ----- Enter italic mode +enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion +enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode +enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode +enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode +enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode +enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode +enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode +enter_upward_mode sum str ZP - - ----- Start upward carriage motion +exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode +exit_italics_mode ritm str ZR - - ----- End italic mode +exit_leftward_mode rlm str ZS - - ----- End left-motion mode +exit_micro_mode rmicm str ZT - - ----- End micro-motion mode +exit_shadow_mode rshm str ZU - - ----- End shadow-print mode +exit_subscript_mode rsubm str ZV - - ----- End subscript mode +exit_superscript_mode rsupm str ZW - - ----- End superscript mode +exit_upward_mode rum str ZX - - ----- End reverse character motion +micro_column_address mhpa str ZY - - ----- Like column_address in micro mode +micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode +micro_left mcub1 str Za - - ----- Like cursor_left in micro mode +micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode +micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode +micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode +order_of_pins porder str Ze - - ----- Match software bits to print-head pins +parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode +parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode +parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode +parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode +select_char_set scs str Zj - - ----- Select character set, #1 +set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line +set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom +set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 +set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 +set_top_margin smgt str Zo - - ----- Set top margin at current line +set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 +start_bit_image sbim str Zq - - ----- Start printing bit image graphics +start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set +stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics +stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 +subscript_characters subcs str Zu - - ----- List of subscriptable characters +superscript_characters supcs str Zv - - ----- List of superscriptable characters +these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR +zero_motion zerom str Zx - - ----- No motion for subsequent character +#%.TE +#%.PP +#%. +#%The following string capabilities are present in the SVr4.0 term structure, +#%but were originally not documented in the man page. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +char_set_names csnm str Zy - - ----- Produce #1'th item from list of character set names +key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred +mouse_info minfo str Mi - - ----- Mouse status information +req_mouse_pos reqmp str RQ - - ----- Request mouse position +get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. +set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape +set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape +pkey_plab pfxl str xl - - ----- Program function key #1 to type string #2 and show string #3 +device_type devt str dv - - ----- Indicate language/codeset support +code_set_init csin str ci - - ----- Init sequence for multiple codesets +set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) +set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 +set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 +set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 +set_lr_margin smglr str ML - - ----- Set both left and right margins to #1, #2. (ML is not in BSD termcap). +set_tb_margin smgtb str MT - - ----- Sets both top and bottom margins to #1, #2 +bit_image_repeat birep str Xy - - ----- Repeat bit image cell #1 #2 times +bit_image_newline binel str Zz - - ----- Move to next row of the bit image +bit_image_carriage_return bicr str Yv - - ----- Move to beginning of same row +color_names colornm str Yw - - ----- Give name for color #1 +define_bit_image_region defbi str Yx - - ----- Define rectangular bit image region +end_bit_image_region endbi str Yy - - ----- End a bit-image region +set_color_band setcolor str Yz - - ----- Change to ribbon color #1 +set_page_length slines str YZ - - ----- Set page length to #1 lines +# +# SVr4 added these capabilities for direct PC-clone support +# +display_pc_char dispc str S1 - - ----- Display PC character #1 +enter_pc_charset_mode smpch str S2 - - ----- Enter PC character display mode +exit_pc_charset_mode rmpch str S3 - - ----- Exit PC character display mode +enter_scancode_mode smsc str S4 - - ----- Enter PC scancode mode +exit_scancode_mode rmsc str S5 - - ----- Exit PC scancode mode +pc_term_options pctrm str S6 - - ----- PC terminal options +scancode_escape scesc str S7 - - ----- Escape for scancode emulation +alt_scancode_esc scesa str S8 - - ----- Alternate escape for scancode emulation +#%.TE +#%.PP +#%. +#%The XSI Curses standard added these hardcopy capabilities. +#%They were used in some post-4.1 versions of System V curses, +#%e.g., Solaris 2.5 and IRIX 6.x. +#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented. +#%According to the XSI Curses standard, they have no termcap names. +#%If your compiled terminfo entries use these, +#%they may not be binary-compatible with System V terminfo +#%entries after SVr4.1; beware! +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +#enter_horizontal_hl_mode ehhlm str Xh - - ----- Enter horizontal highlight mode +#enter_left_hl_mode elhlm str Xl - - ----- Enter left highlight mode +#enter_low_hl_mode elohlm str Xo - - ----- Enter low highlight mode +#enter_right_hl_mode erhlm str Xr - - ----- Enter right highlight mode +#enter_top_hl_mode ethlm str Xt - - ----- Enter top highlight mode +#enter_vertical_hl_mode evhlm str Xv - - ----- Enter vertical highlight mode +#set_a_attributes sgr1 str sA - - ----- Define second set of video attributes #1-#6 +set_pglen_inch slength str YI - - ----- Set page length to #1 hundredth of an inch (some implementations use sL for termcap). +#%.TE +# +# The magic token below tells the tic compiler-generator code that all the caps +# past it should be ignored (not written out) when dumping terminfo objects. It +# also tells the man page table generator not to pass through following lines +# This means we can have obsolete capabilities and pseudo-capabilities that are +# recognized for termcap or terminfo compilation, but not output. +# +# %%-STOP-HERE-%% +# +# Don't move this casually! In fact, don't move it at all unless you're +# either doing it to add System V or XPG4 extensions, or have decided you +# don't care about SVr4 binary compatibility. +# +############################################################################# +# +# TERMCAP EXTENSION CAPABILITIES +# +# The capabilities below are either obsolete or extensions on certain systems. +# They are not used by SVR4 terminfo. Some are used by captoinfo to translate +# termcap sources; the rest are listed for completeness, and in case somebody +# cares about them enough to hack in code that will translate them into +# terminfo capabilities. +# +# The first part of the list is from Ross Ridge's `mytinfo' package +# (comp.sources.unix, volume 26); the variable names and terminfo names (as +# well as the termcap codes) match his list. +# +# This group of codes is not marked obsolete in 4.4BSD, but have no direct +# terminfo equivalents. The rs capability is specially translated to terminfo +# r2, and vice versa, if an entry does not already have an r2. Similarly, +# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). +# The ug capability is thrown away, but assumed to be whatever sg is if the +# latter is nonzero and we're dumping in termcap format. +# +termcap_init2 OTi2 str i2 - - YB--- secondary initialization string +termcap_reset OTrs str rs - - YB-G- terminal reset string +magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul +# +# Obsolete termcap capabilities. Some are used for termcap translation. The +# code uses the 'OT' prefix we put on obsolete capabilities to suppress +# printing them in terminfo source dumps of compiled entries. +# +backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left +crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll +no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line +carriage_return_delay OTdC num dC - - YB-G- pad needed for CR +new_line_delay OTdN num dN - - YB-G- pad needed for LF +linefeed_if_not_lf OTnl str nl - - YBCGE use to move down +backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H +# +# GNU termcap library extensions. The GNU termcap file distributed with +# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the +# BSD termcap file. The name clash with terminfo MT is resolved by type +# info; MT is converted to km. +# +gnu_has_meta_key OTMT bool MT - - ----E has meta key +# gnu_tab_width OTtw num tw - - ----E tab width in spaces +# +# GNU termcap *does* include the following extended capability, Only the +# now-obsolete Ann Arbor terminals used it. +# +# gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region +# +# The following comments describe capnames so ancient that I believe no +# software uses them any longer. Some of these have to go because they +# clash with terminfo names in ways that cannot be resolved by type +# information. +# +# These mytinfo codes are not used in the 4.4BSD curses code. They are +# marked obsolete in the 4.4BSD manual pages. +# +# There is one conflict with terminfo; ma is in both. This conflict is +# resolved by type information. +# +# The `ko' capability is translated by special code. It should contain a +# comma-separated list of capabilities for which there are corresponding keys. +# The `kn' code is accepted but ignored. +# +# The `ma' capability was a 4.0BSD feature used by vi version 2. +# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. +# Besides being obsolete, that interpretation conflicts with max_attributes. +# +# Here is a description of memory_lock_above and memory_unlock: +# "You can 'freeze' data on the screen by turning on Memory Lock in a line of +# text. All lines above the cursor's current line become locked in place on +# the screen. Then enter data normally. When the screen fills up, any +# further data entered forces the first line of unfrozen line text to scroll +# under the frozen data. Lines scrolled off the screen are inserted into +# memory immediately preceding the first frozen line." (from the HP 700/96 +# User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. +# +# Applications that use terminfo are supposed to behave as though xr is +# always true. +# +linefeed_is_newline OTNL bool NL - - YB--- move down with \n +# even_parity OTEP bool EP - - -B--- terminal requires even parity +# odd_parity OTOP bool OP - - -B--- terminal requires odd parity +# half_duplex OTHD bool HD - - -B--- terminal is half-duplex +# lower_case_only OTLC bool LC - - -B--- terminal has only lower case +# upper_case_only OTUC bool UC - - -B--- terminal has only upper case +backspace_delay OTdB num dB - - YB-G- padding required for ^H +# form_feed_delay OTdF num dF - - -B-G- padding required for ^L +horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I +# vertical_tab_delay OTdV num dV - - -B--- padding required for ^V +number_of_function_keys OTkn num kn - - -B-G- count of function keys +other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps +arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 +# memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line +# memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line +has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I +return_does_clr_eol OTxr bool xr - - YB--- return clears the line +# tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch +# +# mytinfo described this as a termcap capability, but it is not listed in the +# 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses +# package, like System V, behaves as though it is always true. +# +# rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line +# +# University of Waterloo termcap extensions (as described in mytinfo). +# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot +# be resolved by a type check. The descriptions are guesses from what was +# in the mytinfo tables. +# +# key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) +# key_kill_char OTkk str kk - - ----- string set by kill key (?) +# key_suspend_char OTkz str kz - - ----- string set by suspend key (?) +# initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) +# ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return +# +# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. +# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type +# check. +# +# scroll_left OTsl1 str Sl - - ----- scroll screen leftward +# scroll_right OTsr1 str Sr - - ----- scroll screen rightward +# parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters +# parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters +# +# The mytinfo capabilities end here. +# +# XENIX extensions: +# +# Xenix defined its own set of forms-drawing capabilities: +# +# cap IBM ASCII description ACS ASCII +# --- ----------- -------------------- ------------- ------ +# G1 191 \277 M-? single upper right ACS_URCORNER +# G2 218 \332 M-Z single upper left ACS_ULCORNER +# G3 192 \300 M-@ single lower left ACS_LLCORNER +# G4 217 \331 M-Y single lower right ACS_LRCORNER +# G5 187 \273 M-; double upper right +# G6 201 \311 M-I double upper left +# G7 200 \310 M-H double lower left +# G8 188 \274 M-< double lower right +# GC 197 \305 M-E single intersection ACS_PLUS _ _ +# GD 194 \302 M-B single down-tick ACS_TTEE | +# GH 196 \304 M-D single horizontal line ACS_HLINE +# GL 180 \264 M-4 single left tick ACS_RTEE -| +# GR 195 \303 M-C single right tick ACS_LTEE |- +# GU 193 \301 M-A single up tick ACS_BTEE _|_ +# GV 179 \263 M-3 single vertical line ACS_VLINE +# Gc 206 \316 M-N double intersection +# Gd 203 \313 M-K double down tick +# Gh 205 \315 M-M double horizontal line +# Gl 204 \204 M-L double left tick +# Gr 185 \271 M-9 double right tick +# Gu 202 \312 M-J double up tick +# Gv 186 \272 M-: double vertical line +# +# The compiler will translate the single-line caps and discard the others +# (via IGNORE aliases further down). We don't want to do normal pad +# translation on these, they're often single-character printable ASCII +# strings that happen to be numerics. There's awk code in parametrized.sh +# that detects the acs_ prefix and uses it to suppress pad translation. +# These terminfo names are invented. +# +acs_ulcorner OTG2 str G2 - - ----- single upper left +acs_llcorner OTG3 str G3 - - ----- single lower left +acs_urcorner OTG1 str G1 - - ----- single upper right +acs_lrcorner OTG4 str G4 - - ----- single lower right +acs_ltee OTGR str GR - - ----- tee pointing right +acs_rtee OTGL str GL - - ----- tee pointing left +acs_btee OTGU str GU - - ----- tee pointing up +acs_ttee OTGD str GD - - ----- tee pointing down +acs_hline OTGH str GH - - ----- single horizontal line +acs_vline OTGV str GV - - ----- single vertical line +acs_plus OTGC str GC - - ----- single intersection +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# (see Caps-ncurses for the complete set of comments) +# +memory_lock meml str ml - - ----K lock memory above cursor +memory_unlock memu str mu - - ----K unlock memory +# +############################################################################# diff --git a/contrib/ncurses/include/Caps.hpux11 b/contrib/ncurses/include/Caps.hpux11 new file mode 100644 index 00000000..723556fa --- /dev/null +++ b/contrib/ncurses/include/Caps.hpux11 @@ -0,0 +1,1039 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 2002-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas Dickey +# +# $Id: Caps.hpux11,v 1.26 2024/04/20 21:05:02 tom Exp $ +# +# This is an adaptation of ncurses' termcap/terminfo capability table, which +# is designed to align with HPUX 11.x's terminfo. +# +# This table is used to generate initializers for tables that drive tic, +# infocmp, and the library compilation code used to support the termcap +# compatibility hack. It is also used to generate the tabular portion of the +# terminfo(5) man page; lines beginning with `#%' are passed through to become +# the terminfo table. +# +# This file has three major sections; a standard-capabilities table, two +# extension-capability tables, and a section of aliases declarations. +# The first two have the same format, as follows: +# +# FILE FORMAT +# +# Column 1: terminfo variable name +# Column 2: terminfo capability name +# Column 3: capability type (Boolean, numeric, or string) +# Column 4: termcap capability name +# Column 5: KEY_xxx name, if any, `-' otherwise +# Column 6: value for KEY_xxx name, if any, `-' otherwise +# Column 7: Lead with `Y' if capability should be emitted in termcap +# translations, `-' otherwise +# Column 8: capability description +# +# The codes following [Y-] in column 7 describe the versions of termcap which +# use the given capability. This information is not used by the curses library +# proper; rather, it is there to help the terminfo maintainer avoid emitting +# termcap entry translations that are more than 1023 bytes long (and tank a +# lot of old termcap-using programs). The codes read as follows: +# B = mentioned in the BSD man page for 4.4BSD curses +# C = used by the 4.4BSD curses library +# G = mentioned in the documentation for GNU termcap +# E = used by GNU Emacs +# K = remove this terminfo capability when translating to standard format +# The important codes are C and E. A cap with C or E should be preserved in +# translation if possible. The problem is that preserving all such caps may +# lead to some termcap translations being too long. The termcap maintainer +# has a bit of a juggling act to do...potential problem cases are marked with +# an asterisk (*). +# +# The aliases section has the following format: +# +# Column 1: either `capalias' or `infoalias' +# Column 2: name to be aliased +# Column 3: what name it should translate to. The name IGNORE means it +# should be discarded with a warning message. +# Column 4: name of the extension set (used for compiler warning messages) +# Column 5: capability description (usually an associated terminfo variable) +# +# HANDLING TERMCAP AND TERMINFO EXTENSIONS +# +# There are basically five different ways to handle termcap and terminfo +# extensions: +# +# 1. Don't list the capname here, or list it but comment it out (the latter +# is preferable; someone might want to handle it in the future). If you do +# this, the capability will be treated as unknown and raise a warning from +# the compiler. +# +# 2. Alias it. This is appropriate if the capability has the same meaning +# as an already-supported one. The compiler will handle aliasing, emitting +# an appropriate informational message whenever an alias fires. +# +# 3. List it in the standard table. You almost certainly do *not* want +# to do this -- the capabilities in that one, and their order, have been +# carefully chosen to be SVr4-binary-compatible when they're written out +# as a terminfo object, and breaking this would be bad. It is up to the ncurses +# library what to do with the terminfo data after it is read in. +# +# 4. List it in the aliases table with an IGNORE target field. If you +# do this, the capability will be ignored on input (though the user will +# get a warning message about it). +# +# 5. List it in the extensions table. If you do this, the compiler will +# silently accept the capability, but the curses library proper will never +# see it (because it won't be written out as part of the terminfo object +# format). It is up to you what you have the compiler do with it. +# +# There are two opposite reasons to choose option 5. One is when you want +# to eat the capability silently and discard it when doing translations +# to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are +# in this class. Nothing will ever use them again. +# +# More usually, you want the compiler to try to deduce something from the +# capability value that it can use to translate it into your output format. +# You'll need to write custom code, probably in postprocess_termcap() or +# postprocess_terminfo(), to handle the translation. +# +# CONTROLLING ENTRY LENGTH +# +# Notes on specific elisions made to fit translations within 1023 bytes: +# +# Machines with IBM PC-like keyboards want to be able to define the following +# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- +# only environments for End or Home-Down), key_dc, and key_ic. This is also +# the set of keys the `joe' editor will be upset if it can't see. So don't +# trim those out of the set to be translated to termcap, or various users of +# the termcap file will become irate. +# +# It might look tempting to leave those long init strings out of translations. +# We can't do it (yet); 4.4BSD tput and tset use them. +# +# We retain the sgr capability in translation in spite of the fact that neither +# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are +# hard to understand without it, and (b) the entries in which it is long tend +# to be older types that don't use up a lot of string space on function keys. +# The tic(1) translation code will complain and elide it if it makes a critical +# difference (there is special code in tic to recognize this situation). +# +# Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion +# optimizer in BSD curses didn't use them. This omission seems to be the +# single most effective one, it shortened the resolved length of all thirteen +# problem entries in the 9.9.0 version of the terminfo master below critical. +# +# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap +# translations go back over critical if we do this. As 4.4BSD curses fades +# into history and GNU termcap's application base shrinks towards being GNU +# Emacs only, we'll probably elide out some BSD-only capabilities in order +# to buy space for non-essentials Emacs is still using. Capabilities high +# on that hit list: rc, sc, uc. +# +# FORMATTING THE TABLES +# +# We manually specify a (minimum) column width for the capability name +# and terminfo code columns in the tables to achieve a consistent +# arrangement; as used here, tbl(1) cannot know the width required by +# one table's data while formatting another's. +# +# The longest capability names (C variables) are +# "enter_near_letter_quality" and "bit_image_carriage_return" (tied at +# 25n), and the longest terminfo code is "setcolor" (8n). +# +# The tables are a tight fit on traditional man(7) implementations that +# use a line length of 65n, and the "Description" column has little room +# within which the formatter can make breaking or adjustment decisions. +# Words like "micro_..._address" and "parm_..._micro" don't break. +# Reducing the inter-column gaps to 2 ens gives them enough room. --GBR +# +############################################################################# +# +# STANDARD CAPABILITIES +# +#%Tables of capabilities +#%.I \%ncurses +#%recognizes in a +#%.I \%term\%info +#%terminal type description and available to +#%.IR \%term\%info -using +#%code follow. +#%.bP +#%The capability name identifies the symbol by which the programmer +#%using the +#%.I \%term\%info +#%API accesses the capability. +#%.bP +#%The TI +#%.RI ( \%term\%info ) +#%code is the short name used by a person composing or updating a +#%terminal type entry. +#%.IP +#%Whenever possible, +#%these codes are the same as or similar to those of the ANSI X3.64-1979 +#%standard +#%(now superseded by ECMA-48, +#%which uses identical or very similar names). +#%Semantics are also intended to match those of the specification. +#%.IP +#%.I \%term\%info +#%codes have no hard length limit, +#%but +#%.I \%ncurses +#%maintains an informal one of 5 characters to keep them short and to +#%allow the tabs in the source file +#%.I Caps +#%to line up nicely. +#%(Some standard codes exceed this limit regardless.) +#%.bP +#%The TC +#%.RI ( termcap ) +#%code is that used by the corresponding API of +#%.IR \%ncurses . +#%(Some capabilities are new, +#%and have names that BSD +#%.I termcap +#%did not originate.) +#%.bP +#%The description field attempts to convey the capability's semantics. +#%.PP +#%The description field employs a handful of notations. +#%.TP +#%.B (P) +#%indicates that padding may be specified. +#%.TP +#%.B (P*) +#%indicates that padding may vary in proportion to the number of output +#%lines affected. +#%.TP +#%.BI # i +#%indicates the +#%.IR i th +#%parameter of a string capability; +#%the programmer should pass the string to \fB\%tparm\fP(3X) with the +#%parameters listed. +#%.IP +#%If the description lists no parameters, +#%passing the string to \fB\%tparm\fP(3X) may produce unexpected +#%behavior, +#%for instance if the string contains percent signs. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Boolean Capability Name TI TC Description +#%_ +auto_left_margin bw bool bw - - YB-G- cub1 wraps from column 0 to last column +auto_right_margin am bool am - - YBCGE terminal has automatic margins +no_esc_ctlc xsb bool xb - - YBCG- beehive (f1=escape, f2=ctrl C) +ceol_standout_glitch xhp bool xs - - YBCGE standout not erased by overwriting (hp) +eat_newline_glitch xenl bool xn - - YBCGE newline ignored after 80 cols (concept) +erase_overstrike eo bool eo - - YBCG- can erase overstrikes with a blank +generic_type gn bool gn - - YB-G- generic line type +hard_copy hc bool hc - - YBCG- hardcopy terminal +has_meta_key km bool km - - YB-GE Has a meta key (i.e., sets 8th-bit) +has_status_line hs bool hs - - YB-G- has extra status line +insert_null_glitch in bool in - - YBCGE insert mode distinguishes nulls +memory_above da bool da - - YBCG- display may be retained above the screen +memory_below db bool db - - YB-GE display may be retained below the screen +move_insert_mode mir bool mi - - YBCGE safe to move while in insert mode +move_standout_mode msgr bool ms - - YBCGE safe to move while in standout mode +over_strike os bool os - - YBCG- terminal can overstrike +status_line_esc_ok eslok bool es - - YB-G- escape can be used on the status line +dest_tabs_magic_smso xt bool xt - - YBCGE tabs destructive, magic so char (t1061) +tilde_glitch hz bool hz - - YB-GE cannot print ~'s (Hazeltine) +transparent_underline ul bool ul - - YBCGE underline character overstrikes +xon_xoff xon bool xo - - YB--- terminal uses xon/xoff handshaking +# end Booleans for HPUX 9, 10 (non-color curses) +needs_xon_xoff nxon bool nx - - ----- padding will not work, xon/xoff required +prtr_silent mc5i bool 5i - - ----- printer will not echo on screen +hard_cursor chts bool HC - - ----- cursor is hard to see +non_rev_rmcup nrrmc bool NR - - ----- smcup does not reverse rmcup +no_pad_char npc bool NP - - ----- pad character does not exist +non_dest_scroll_region ndscr bool ND - - ----- scrolling region is non-destructive +can_change ccc bool cc - - ----- terminal can re-define existing colors +back_color_erase bce bool ut - - ----- screen erased with background color +hue_lightness_saturation hls bool hl - - ----- terminal uses only HLS color notation (Tektronix) +col_addr_glitch xhpa bool YA - - ----- only positive motion for hpa/mhpa caps +cr_cancels_micro_mode crxm bool YB - - ----- using cr turns off micro mode +has_print_wheel daisy bool YC - - ----- printer needs operator to change character set +row_addr_glitch xvpa bool YD - - ----- only positive motion for vpa/mvpa caps +semi_auto_right_margin sam bool YE - - ----- printing in last column causes cr +cpi_changes_res cpix bool YF - - ----- changing character pitch changes resolution +lpi_changes_res lpix bool YG - - ----- changing line pitch changes resolution +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +columns cols num co - - YBCGE number of columns in a line +init_tabs it num it - - YB-G- tabs initially every # spaces +lines lines num li - - YBCGE number of lines on screen or page +lines_of_memory lm num lm - - YB-G- lines of memory if > line. 0 means varies +magic_cookie_glitch xmc num sg - - YBCGE number of blank characters left by smso or rmso +padding_baud_rate pb num pb - - YB-GE lowest baud rate where padding needed +virtual_terminal vt num vt - - YB--- virtual terminal number (CB/unix) +width_status_line wsl num ws - - YB-G- number of columns in status line +# end numbers for HPUX 9, 10 (non-color curses) +num_labels nlab num Nl - - ----- number of labels on screen +label_height lh num lh - - ----- rows in each label +label_width lw num lw - - ----- columns in each label +max_attributes ma num ma - - YBC-- maximum combined attributes terminal can handle +maximum_windows wnum num MW - - ----- maximum number of definable windows +# These came in with SVr4's color support +max_colors colors num Co - - ----- maximum number of colors on screen +max_pairs pairs num pa - - ----- maximum number of color-pairs on the screen +no_color_video ncv num NC - - ----- video attributes that cannot be used with colors +#%.TE +#%.PP +#%. +#%The following numeric capabilities are present in the SVr4.0 term structure, +#%but are not yet documented in the man page. +#%They came in with SVr4's printer support. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +buffer_capacity bufsz num Ya - - ----- numbers of bytes buffered before printing +dot_vert_spacing spinv num Yb - - ----- spacing of pins vertically in pins per inch +dot_horz_spacing spinh num Yc - - ----- spacing of dots horizontally in dots per inch +max_micro_address maddr num Yd - - ----- maximum value in micro_..._address +max_micro_jump mjump num Ye - - ----- maximum value in parm_..._micro +micro_char_size mcs num Yf - - ----- character step size when in micro mode +micro_line_size mls num Yg - - ----- line step size when in micro mode +number_of_pins npins num Yh - - ----- numbers of pins in print-head +output_res_char orc num Yi - - ----- horizontal resolution in units per line +output_res_line orl num Yj - - ----- vertical resolution in units per line +output_res_horz_inch orhi num Yk - - ----- horizontal resolution in units per inch +output_res_vert_inch orvi num Yl - - ----- vertical resolution in units per inch +print_rate cps num Ym - - ----- print rate in characters per second +wide_char_size widcs num Yn - - ----- character step size when in double wide mode +buttons btns num BT - - ----- number of buttons on mouse +bit_image_entwining bitwin num Yo - - ----- number of passes for each bit-image row +bit_image_type bitype num Yp - - ----- type of bit-image device +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +back_tab cbt str bt - - YBCGE back tab (P) +bell bel str bl - - YB-GE audible signal (bell) (P) +carriage_return cr str cr - - YBCGE carriage return (P*) (P*) +change_scroll_region csr str cs - - YBCGE change region to line #1 to line #2 (P) +clear_all_tabs tbc str ct - - YB-G- clear all tab stops (P) +clear_screen clear str cl - - YBCGE clear screen and home cursor (P*) +clr_eol el str ce - - YBCGE clear to end of line (P) +clr_eos ed str cd - - YBCGE clear to end of screen (P*) +column_address hpa str ch - - -B-GE* horizontal position #1, absolute (P) +command_character cmdch str CC - - YB-G- terminal settable cmd character in prototype !? +cursor_address cup str cm - - YBCGE move to row #1 columns #2 +cursor_down cud1 str do - - YBCGE down one line +cursor_home home str ho - - YBCGE home cursor (if no cup) +cursor_invisible civis str vi - - YB-G- make cursor invisible +cursor_left cub1 str le - - YBCGE move left one space +cursor_mem_address mrcup str CM - - YB-G- memory relative cursor addressing, move to row #1 columns #2 +cursor_normal cnorm str ve - - YBCGE make cursor appear normal (undo civis/cvvis) +cursor_right cuf1 str nd - - YBCGE non-destructive space (move right one space) +cursor_to_ll ll str ll - - YBCGE last line, first column (if no cup) +cursor_up cuu1 str up - - YBCGE up one line +cursor_visible cvvis str vs - - YBCGE make cursor very visible +delete_character dch1 str dc - - YBCGE delete character (P*) +delete_line dl1 str dl - - YBCGE delete line (P*) +dis_status_line dsl str ds - - YB-G- disable status line +down_half_line hd str hd - - YB-G- half a line down +enter_alt_charset_mode smacs str as - - YB-G- start alternate character set (P) +enter_blink_mode blink str mb - - YB-G- turn on blinking +enter_bold_mode bold str md - - YB-G- turn on bold (extra bright) mode +enter_ca_mode smcup str ti - - YBCGE string to start programs using cup +enter_delete_mode smdc str dm - - YBCGE enter delete mode +enter_dim_mode dim str mh - - YB-G- turn on half-bright mode +enter_insert_mode smir str im - - YBCGE enter insert mode +enter_secure_mode invis str mk - - -B-G-* turn on blank mode (characters invisible) +enter_protected_mode prot str mp - - -B-G-* turn on protected mode +enter_reverse_mode rev str mr - - YB-G- turn on reverse video mode +enter_standout_mode smso str so - - YBCGE begin standout mode +enter_underline_mode smul str us - - YBCGE begin underline mode +erase_chars ech str ec - - YB-G- erase #1 characters (P) +exit_alt_charset_mode rmacs str ae - - YB-G- end alternate character set (P) +exit_attribute_mode sgr0 str me - - YB-GE turn off all attributes +exit_ca_mode rmcup str te - - YBCGE strings to end programs using cup +exit_delete_mode rmdc str ed - - YBCGE end delete mode +exit_insert_mode rmir str ei - - YBCGE exit insert mode +exit_standout_mode rmso str se - - YBCGE exit standout mode +exit_underline_mode rmul str ue - - YBCGE exit underline mode +flash_screen flash str vb - - YBCGE visible bell (may not move cursor) +form_feed ff str ff - - YB-G- hardcopy terminal page eject (P*) +from_status_line fsl str fs - - YB-G- return from status line +init_1string is1 str i1 - - YB-G- initialization string +init_2string is2 str is - - YB-G- initialization string +init_3string is3 str i3 - - YB-G- initialization string +init_file if str if - - YB-G- name of initialization file +insert_character ich1 str ic - - YBCGE insert character (P) +insert_line il1 str al - - YBCGE insert line (P*) +insert_padding ip str ip - - YBCGE insert padding after inserted character +key_backspace kbs str kb KEY_BACKSPACE 0407 YB-G- backspace key +key_catab ktbc str ka KEY_CATAB 0526 -B-G-* clear-all-tabs key +key_clear kclr str kC KEY_CLEAR 0515 -B-G-* clear-screen or erase key +key_ctab kctab str kt KEY_CTAB 0525 -B-G-* clear-tab key +key_dc kdch1 str kD KEY_DC 0512 YB-G- delete-character key +key_dl kdl1 str kL KEY_DL 0510 -B-G-* delete-line key +key_down kcud1 str kd KEY_DOWN 0402 YBCGE down-arrow key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode +key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key +key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key +key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key +key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key +key_f10 kf10 str k; KEY_F(10) - ----E F10 function key +key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key +key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key +key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key +key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key +key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key +key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key +key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key +key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key +key_home khome str kh KEY_HOME 0406 YBCGE home key +key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key +key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key +key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key +key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) +key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key +key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key +key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key +key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key +key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key +key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key +key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key +keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode +keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode +lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 +lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 +lab_f10 lf10 str la - - ----- label on function key f10 if not f10 +lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 +lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 +lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 +lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 +lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 +lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 +lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 +lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 +meta_off rmm str mo - - YB-G-* turn off meta mode +meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) +newline nel str nw - - YB-G-* newline (behave like cr followed by lf) +pad_char pad str pc - - YBCGE padding char (instead of null) +parm_dch dch str DC - - YB-GE delete #1 characters (P*) +parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) +parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) +parm_ich ich str IC - - YB-GE insert #1 characters (P*) +parm_index indn str SF - - YBCG- scroll forward #1 lines (P) +parm_insert_line il str AL - - YBCGE insert #1 lines (P*) +parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) +parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) +parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) +parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) +pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 +pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 +pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 +print_screen mc0 str ps - - -B-G-* print contents of screen +prtr_off mc4 str pf - - -B-G-* turn off printer +prtr_on mc5 str po - - -B-G-* turn on printer +repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) +reset_1string rs1 str r1 - - -B--- reset string +reset_2string rs2 str r2 - - -B--- reset string +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +reset_3string rs3 str r3 - - -B--- reset string +reset_file rf str rf - - -B--- name of reset file +restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor +row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) +save_cursor sc str sc - - YBCG- save current cursor position (P) +scroll_forward ind str sf - - YBCGE scroll text up (P) +scroll_reverse ri str sr - - YBCGE scroll text down (P) +set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) +set_tab hts str st - - YB-G- set a tab in every row, current columns +set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 +tab ht str ta - - YBCGE tab to next 8-space hardware tab stop +to_status_line tsl str ts - - YB-G- move to status line, column #1 +underline_char uc str uc - - YBCG- underline char and move past it +up_half_line hu str hu - - YB-G- half a line up +init_prog iprog str iP - - -B--- path name of program for initialization +key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad +key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad +key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad +key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad +key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad +prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes +# +# SVr1 capabilities stop here. IBM's version of terminfo is the same as +# SVr4 up to this point, but has a different set afterwards. +# +# HPUX defines these if __HP_CURSES_COMPAT is defined: +memory_lock meml str ml - - ----K lock memory above cursor +memory_unlock memu str mu - - ----K unlock memory +# +# +plab_norm pln str pn - - ----- program label #1 to show string #2 +label_on smln str LO - - ----- turn on soft labels +label_off rmln str LF - - ----- turn off soft labels +key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key +key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key +key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key +key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key +key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key +key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key +key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key +key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key +key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key +key_f20 kf20 str FA KEY_F(20) - ----E F20 function key +key_f21 kf21 str FB KEY_F(21) - ----E F21 function key +key_f22 kf22 str FC KEY_F(22) - ----E F22 function key +key_f23 kf23 str FD KEY_F(23) - ----E F23 function key +key_f24 kf24 str FE KEY_F(24) - ----E F24 function key +key_f25 kf25 str FF KEY_F(25) - ----E F25 function key +key_f26 kf26 str FG KEY_F(26) - ----E F26 function key +key_f27 kf27 str FH KEY_F(27) - ----E F27 function key +key_f28 kf28 str FI KEY_F(28) - ----E F28 function key +key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key +key_f30 kf30 str FK KEY_F(30) - ----E F30 function key +key_f31 kf31 str FL KEY_F(31) - ----E F31 function key +key_f32 kf32 str FM KEY_F(32) - ----E F32 function key +key_f33 kf33 str FN KEY_F(33) - ----E F33 function key +key_f34 kf34 str FO KEY_F(34) - ----E F34 function key +key_f35 kf35 str FP KEY_F(35) - ----E F35 function key +key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key +key_f37 kf37 str FR KEY_F(37) - ----E F37 function key +key_f38 kf38 str FS KEY_F(38) - ----E F38 function key +key_f39 kf39 str FT KEY_F(39) - ----E F39 function key +key_f40 kf40 str FU KEY_F(40) - ----E F40 function key +key_f41 kf41 str FV KEY_F(41) - ----E F41 function key +key_f42 kf42 str FW KEY_F(42) - ----E F42 function key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_f43 kf43 str FX KEY_F(43) - ----E F43 function key +key_f44 kf44 str FY KEY_F(44) - ----E F44 function key +key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key +key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key +key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key +key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key +key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key +key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key +key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key +key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key +key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key +key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key +key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key +key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key +key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key +key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key +key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key +key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key +key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key +key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key +key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key +# end of strings in HPUX 9 +char_padding rmp str rP - - ----- like ip but when in insert mode +acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 +key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key +enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking +exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking +enter_am_mode smam str SA - - ----- turn on automatic margins +exit_am_mode rmam str RA - - ----- turn off automatic margins +xon_character xonc str XN - - ----- XON character +xoff_character xoffc str XF - - ----- XOFF character +ena_acs enacs str eA - - ----- enable alternate char set +key_beg kbeg str @1 KEY_BEG 0542 ----- begin key +key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key +key_close kclo str @3 KEY_CLOSE 0544 ----- close key +key_command kcmd str @4 KEY_COMMAND 0545 ----- command key +key_copy kcpy str @5 KEY_COPY 0546 ----- copy key +key_create kcrt str @6 KEY_CREATE 0547 ----- create key +key_end kend str @7 KEY_END 0550 ----- end key +key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key +key_exit kext str @9 KEY_EXIT 0551 ----- exit key +key_find kfnd str @0 KEY_FIND 0552 ----- find key +key_help khlp str %1 KEY_HELP 0553 ----- help key +key_mark kmrk str %2 KEY_MARK 0554 ----- mark key +key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key +key_move kmov str %4 KEY_MOVE 0556 ----- move key +key_next knxt str %5 KEY_NEXT 0557 ----- next key +key_open kopn str %6 KEY_OPEN 0560 ----- open key +key_options kopt str %7 KEY_OPTIONS 0561 ----- options key +key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key +key_print kprt str %9 KEY_PRINT 0532 ----- print key +key_redo krdo str %0 KEY_REDO 0563 ----- redo key +key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key +key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key +key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key +key_restart krst str &4 KEY_RESTART 0567 ----- restart key +key_resume kres str &5 KEY_RESUME 0570 ----- resume key +key_save ksav str &6 KEY_SAVE 0571 ----- save key +key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key +key_undo kund str &8 KEY_UNDO 0630 ----- undo key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key +key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key +key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key +key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key +key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key +key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key +key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key +key_select kslt str *6 KEY_SELECT 0601 ----- select key +key_send kEND str *7 KEY_SEND 0602 ----- shifted end key +key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key +key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key +key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key +key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key +key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key +key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key +key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key +key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key +key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key +key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key +key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key +key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key +key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key +key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key +key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key +key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key +key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key +key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key +key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key +key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key +req_for_input rfi str RF - - ----- send next input char (for ptys) +clr_bol el1 str cb - - ----- Clear to beginning of line +clear_margins mgc str MC - - ----- clear right and left soft margins +set_left_margin smgl str ML - - ----- set left soft margin at current column (not in BSD \fItermcap\fP) +set_right_margin smgr str MR - - ----- set right soft margin at current column +label_format fln str Lf - - ----- label format +set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs +display_clock dclk str DK - - ----- display clock +remove_clock rmclk str RC - - ----- remove clock +create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 +goto_window wingo str WG - - ----- go to window #1 +hangup hup str HU - - ----- hang-up phone +dial_phone dial str DI - - ----- dial number #1 +quick_dial qdial str QD - - ----- dial number #1 without checking +tone tone str TO - - ----- select touch tone dialing +pulse pulse str PU - - ----- select pulse dialing +flash_hook hook str fh - - ----- flash switch hook +fixed_pause pause str PA - - ----- pause for 2-3 seconds +wait_tone wait str WA - - ----- wait for dial-tone +user0 u0 str u0 - - ----- User string #0 +user1 u1 str u1 - - ----- User string #1 +user2 u2 str u2 - - ----- User string #2 +user3 u3 str u3 - - ----- User string #3 +user4 u4 str u4 - - ----- User string #4 +user5 u5 str u5 - - ----- User string #5 +user6 u6 str u6 - - ----- User string #6 +user7 u7 str u7 - - ----- User string #7 +user8 u8 str u8 - - ----- User string #8 +user9 u9 str u9 - - ----- User string #9 +# +# SVr4 added these capabilities to support color +# +orig_pair op str op - - ----- Set default pair to its original value +orig_colors oc str oc - - ----- Set all color pairs to the original ones +initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) +initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) +set_color_pair scp str sp - - ----- Set current color pair to #1 +set_foreground setf str Sf - - ----- Set foreground color #1 +set_background setb str Sb - - ----- Set background color #1 +# +# SVr4 added these capabilities to support printers +# +change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 +change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 +change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 +change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 +define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 +enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode +enter_italics_mode sitm str ZH - - ----- Enter italic mode +enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion +enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode +enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode +enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode +enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode +enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode +enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode +enter_upward_mode sum str ZP - - ----- Start upward carriage motion +exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode +exit_italics_mode ritm str ZR - - ----- End italic mode +exit_leftward_mode rlm str ZS - - ----- End left-motion mode +exit_micro_mode rmicm str ZT - - ----- End micro-motion mode +exit_shadow_mode rshm str ZU - - ----- End shadow-print mode +exit_subscript_mode rsubm str ZV - - ----- End subscript mode +exit_superscript_mode rsupm str ZW - - ----- End superscript mode +exit_upward_mode rum str ZX - - ----- End reverse character motion +micro_column_address mhpa str ZY - - ----- Like column_address in micro mode +micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode +micro_left mcub1 str Za - - ----- Like cursor_left in micro mode +micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode +micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode +micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode +order_of_pins porder str Ze - - ----- Match software bits to print-head pins +parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode +parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode +parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode +parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode +select_char_set scs str Zj - - ----- Select character set, #1 +set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line +set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom +set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 +set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 +set_top_margin smgt str Zo - - ----- Set top margin at current line +set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 +start_bit_image sbim str Zq - - ----- Start printing bit image graphics +start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set +stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics +stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 +subscript_characters subcs str Zu - - ----- List of subscriptable characters +superscript_characters supcs str Zv - - ----- List of superscriptable characters +these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR +zero_motion zerom str Zx - - ----- No motion for subsequent character +#%.TE +#%.PP +#%. +#%The following string capabilities are present in the SVr4.0 term structure, +#%but were originally not documented in the man page. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +char_set_names csnm str Zy - - ----- Produce #1'th item from list of character set names +key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred +mouse_info minfo str Mi - - ----- Mouse status information +req_mouse_pos reqmp str RQ - - ----- Request mouse position +get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. +set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape +set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape +pkey_plab pfxl str xl - - ----- Program function key #1 to type string #2 and show string #3 +device_type devt str dv - - ----- Indicate language/codeset support +code_set_init csin str ci - - ----- Init sequence for multiple codesets +set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) +set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 +set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 +set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 +set_lr_margin smglr str ML - - ----- Set both left and right margins to #1, #2. (ML is not in BSD termcap). +set_tb_margin smgtb str MT - - ----- Sets both top and bottom margins to #1, #2 +bit_image_repeat birep str Xy - - ----- Repeat bit image cell #1 #2 times +bit_image_newline binel str Zz - - ----- Move to next row of the bit image +bit_image_carriage_return bicr str Yv - - ----- Move to beginning of same row +color_names colornm str Yw - - ----- Give name for color #1 +define_bit_image_region defbi str Yx - - ----- Define rectangular bit image region +end_bit_image_region endbi str Yy - - ----- End a bit-image region +set_color_band setcolor str Yz - - ----- Change to ribbon color #1 +set_page_length slines str YZ - - ----- Set page length to #1 lines +# +# SVr4 added these capabilities for direct PC-clone support +# +display_pc_char dispc str S1 - - ----- Display PC character #1 +enter_pc_charset_mode smpch str S2 - - ----- Enter PC character display mode +exit_pc_charset_mode rmpch str S3 - - ----- Exit PC character display mode +enter_scancode_mode smsc str S4 - - ----- Enter PC scancode mode +exit_scancode_mode rmsc str S5 - - ----- Exit PC scancode mode +pc_term_options pctrm str S6 - - ----- PC terminal options +scancode_escape scesc str S7 - - ----- Escape for scancode emulation +alt_scancode_esc scesa str S8 - - ----- Alternate escape for scancode emulation +#%.TE +#%.PP +#%. +#%The XSI Curses standard added these hardcopy capabilities. +#%They were used in some post-4.1 versions of System V curses, +#%e.g., Solaris 2.5 and IRIX 6.x. +#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented. +#%According to the XSI Curses standard, they have no termcap names. +#%If your compiled terminfo entries use these, +#%they may not be binary-compatible with System V terminfo +#%entries after SVr4.1; beware! +#%. +#%AIX and Solaris do not provide termcap names for these; HPUX does. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +set_pglen_inch slength str YI - - ----- Set page length to #1 hundredth of an inch (some implementations use sL for termcap). +enter_horizontal_hl_mode ehhlm str Q1 - - ----- Enter horizontal highlight mode +enter_left_hl_mode elhlm str Q2 - - ----- Enter left highlight mode +enter_low_hl_mode elohlm str Q3 - - ----- Enter low highlight mode +enter_right_hl_mode erhlm str Q4 - - ----- Enter right highlight mode +enter_top_hl_mode ethlm str Q5 - - ----- Enter top highlight mode +enter_vertical_hl_mode evhlm str Q6 - - ----- Enter vertical highlight mode +set_a_attributes sgr1 str Q7 - - ----- Define second set of video attributes #1-#6 +exit_horizontal_hl_mode rmhhlm str Q8 - - ----K Exit horizontal highlight mode +exit_left_hl_mode rmlhlm str Q9 - - ----K Exit left highlight mode +exit_low_hl_mode rmlohlm str Qa - - ----K Exit low highlight mode +exit_right_hl_mode rmrhlm str Qb - - ----K Exit right highlight mode +exit_top_hl_mode rmthlm str Qc - - ----K Exit top highlight mode +exit_vertical_hl_mode rmvhlm str Qd - - ----K Exit vertical highlight mode +#%.TE +# +# The magic token below tells the tic compiler-generator code that all the caps +# past it should be ignored (not written out) when dumping terminfo objects. It +# also tells the man page table generator not to pass through following lines +# This means we can have obsolete capabilities and pseudo-capabilities that are +# recognized for termcap or terminfo compilation, but not output. +# +# %%-STOP-HERE-%% +# +# Don't move this casually! In fact, don't move it at all unless you're +# either doing it to add System V or XPG4 extensions, or have decided you +# don't care about SVr4 binary compatibility. +# +############################################################################# +# +# TERMCAP EXTENSION CAPABILITIES +# +# The capabilities below are either obsolete or extensions on certain systems. +# They are not used by SVR4 terminfo. Some are used by captoinfo to translate +# termcap sources; the rest are listed for completeness, and in case somebody +# cares about them enough to hack in code that will translate them into +# terminfo capabilities. +# +# The first part of the list is from Ross Ridge's `mytinfo' package +# (comp.sources.unix, volume 26); the variable names and terminfo names (as +# well as the termcap codes) match his list. +# +# This group of codes is not marked obsolete in 4.4BSD, but have no direct +# terminfo equivalents. The rs capability is specially translated to terminfo +# r2, and vice versa, if an entry does not already have an r2. Similarly, +# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). +# The ug capability is thrown away, but assumed to be whatever sg is if the +# latter is nonzero and we're dumping in termcap format. +# +termcap_init2 OTi2 str i2 - - YB--- secondary initialization string +termcap_reset OTrs str rs - - YB-G- terminal reset string +magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul +# +# Obsolete termcap capabilities. Some are used for termcap translation. The +# code uses the 'OT' prefix we put on obsolete capabilities to suppress +# printing them in terminfo source dumps of compiled entries. +# +backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left +crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll +no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line +carriage_return_delay OTdC num dC - - YB-G- pad needed for CR +new_line_delay OTdN num dN - - YB-G- pad needed for LF +linefeed_if_not_lf OTnl str nl - - YBCGE use to move down +backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H +# +# GNU termcap library extensions. The GNU termcap file distributed with +# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the +# BSD termcap file. The name clash with terminfo MT is resolved by type +# info; MT is converted to km. +# +gnu_has_meta_key OTMT bool MT - - ----E has meta key +# gnu_tab_width OTtw num tw - - ----E tab width in spaces +# +# GNU termcap *does* include the following extended capability, Only the +# now-obsolete Ann Arbor terminals used it. +# +# gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region +# +# The following comments describe capnames so ancient that I believe no +# software uses them any longer. Some of these have to go because they +# clash with terminfo names in ways that cannot be resolved by type +# information. +# +# These mytinfo codes are not used in the 4.4BSD curses code. They are +# marked obsolete in the 4.4BSD manual pages. +# +# There is one conflict with terminfo; ma is in both. This conflict is +# resolved by type information. +# +# The `ko' capability is translated by special code. It should contain a +# comma-separated list of capabilities for which there are corresponding keys. +# The `kn' code is accepted but ignored. +# +# The `ma' capability was a 4.0BSD feature used by vi version 2. +# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. +# Besides being obsolete, that interpretation conflicts with max_attributes. +# +# Here is a description of memory_lock_above and memory_unlock: +# "You can 'freeze' data on the screen by turning on Memory Lock in a line of +# text. All lines above the cursor's current line become locked in place on +# the screen. Then enter data normally. When the screen fills up, any +# further data entered forces the first line of unfrozen line text to scroll +# under the frozen data. Lines scrolled off the screen are inserted into +# memory immediately preceding the first frozen line." (from the HP 700/96 +# User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. +# +# Applications that use terminfo are supposed to behave as though xr is +# always true. +# +linefeed_is_newline OTNL bool NL - - YB--- move down with \n +# even_parity OTEP bool EP - - -B--- terminal requires even parity +# odd_parity OTOP bool OP - - -B--- terminal requires odd parity +# half_duplex OTHD bool HD - - -B--- terminal is half-duplex +# lower_case_only OTLC bool LC - - -B--- terminal has only lower case +# upper_case_only OTUC bool UC - - -B--- terminal has only upper case +backspace_delay OTdB num dB - - YB-G- padding required for ^H +# form_feed_delay OTdF num dF - - -B-G- padding required for ^L +horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I +# vertical_tab_delay OTdV num dV - - -B--- padding required for ^V +number_of_function_keys OTkn num kn - - -B-G- count of function keys +other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps +arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 +# memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line +# memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line +has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I +return_does_clr_eol OTxr bool xr - - YB--- return clears the line +# tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch +# +# mytinfo described this as a termcap capability, but it is not listed in the +# 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses +# package, like System V, behaves as though it is always true. +# +# rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line +# +# University of Waterloo termcap extensions (as described in mytinfo). +# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot +# be resolved by a type check. The descriptions are guesses from what was +# in the mytinfo tables. +# +# key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) +# key_kill_char OTkk str kk - - ----- string set by kill key (?) +# key_suspend_char OTkz str kz - - ----- string set by suspend key (?) +# initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) +# ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return +# +# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. +# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type +# check. +# +# scroll_left OTsl1 str Sl - - ----- scroll screen leftward +# scroll_right OTsr1 str Sr - - ----- scroll screen rightward +# parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters +# parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters +# +# The mytinfo capabilities end here. +# +# XENIX extensions: +# +# Xenix defined its own set of forms-drawing capabilities: +# +# cap IBM ASCII description ACS ASCII +# --- ----------- -------------------- ------------- ------ +# G1 191 \277 M-? single upper right ACS_URCORNER +# G2 218 \332 M-Z single upper left ACS_ULCORNER +# G3 192 \300 M-@ single lower left ACS_LLCORNER +# G4 217 \331 M-Y single lower right ACS_LRCORNER +# G5 187 \273 M-; double upper right +# G6 201 \311 M-I double upper left +# G7 200 \310 M-H double lower left +# G8 188 \274 M-< double lower right +# GC 197 \305 M-E single intersection ACS_PLUS _ _ +# GD 194 \302 M-B single down-tick ACS_TTEE | +# GH 196 \304 M-D single horizontal line ACS_HLINE +# GL 180 \264 M-4 single left tick ACS_RTEE -| +# GR 195 \303 M-C single right tick ACS_LTEE |- +# GU 193 \301 M-A single up tick ACS_BTEE _|_ +# GV 179 \263 M-3 single vertical line ACS_VLINE +# Gc 206 \316 M-N double intersection +# Gd 203 \313 M-K double down tick +# Gh 205 \315 M-M double horizontal line +# Gl 204 \204 M-L double left tick +# Gr 185 \271 M-9 double right tick +# Gu 202 \312 M-J double up tick +# Gv 186 \272 M-: double vertical line +# +# The compiler will translate the single-line caps and discard the others +# (via IGNORE aliases further down). We don't want to do normal pad +# translation on these, they're often single-character printable ASCII +# strings that happen to be numerics. There's awk code in parametrized.sh +# that detects the acs_ prefix and uses it to suppress pad translation. +# These terminfo names are invented. +# +acs_ulcorner OTG2 str G2 - - ----- single upper left +acs_llcorner OTG3 str G3 - - ----- single lower left +acs_urcorner OTG1 str G1 - - ----- single upper right +acs_lrcorner OTG4 str G4 - - ----- single lower right +acs_ltee OTGR str GR - - ----- tee pointing right +acs_rtee OTGL str GL - - ----- tee pointing left +acs_btee OTGU str GU - - ----- tee pointing up +acs_ttee OTGD str GD - - ----- tee pointing down +acs_hline OTGH str GH - - ----- single horizontal line +acs_vline OTGV str GV - - ----- single vertical line +acs_plus OTGC str GC - - ----- single intersection +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# (see Caps-ncurses for the complete set of comments) +# +box_chars_1 box1 str bx - - ----K box characters primary set +# +############################################################################# diff --git a/contrib/ncurses/include/Caps.keys b/contrib/ncurses/include/Caps.keys new file mode 100644 index 00000000..6f8a84e3 --- /dev/null +++ b/contrib/ncurses/include/Caps.keys @@ -0,0 +1,1116 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 2001-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas Dickey +# and: Ilya Zakharevich +# +# $Id: Caps.keys,v 1.25 2024/04/20 21:05:02 tom Exp $ +# +# This is an adaptation of ncurses' termcap/terminfo capability table, which +# is illustrates an experimental extension to describe alt-, shift- and +# control-modifiers applied to function and normal keys, as done on IBM pc's. +# +# This table is used to generate initializers for tables that drive tic, +# infocmp, and the library compilation code used to support the termcap +# compatibility hack. It is also used to generate the tabular portion of the +# terminfo(5) man page; lines beginning with `#%' are passed through to become +# the terminfo table. +# +# This file has three major sections; a standard-capabilities table, two +# extension-capability tables, and a section of aliases declarations. +# The first two have the same format, as follows: +# +# FILE FORMAT +# +# Column 1: terminfo variable name +# Column 2: terminfo capability name +# Column 3: capability type (Boolean, numeric, or string) +# Column 4: termcap capability name +# Column 5: KEY_xxx name, if any, `-' otherwise +# Column 6: value for KEY_xxx name, if any, `-' otherwise +# Column 7: Lead with `Y' if capability should be emitted in termcap +# translations, `-' otherwise +# Column 8: capability description +# +# The codes following [Y-] in column 7 describe the versions of termcap which +# use the given capability. This information is not used by the curses library +# proper; rather, it is there to help the terminfo maintainer avoid emitting +# termcap entry translations that are more than 1023 bytes long (and tank a +# lot of old termcap-using programs). The codes read as follows: +# B = mentioned in the BSD man page for 4.4BSD curses +# C = used by the 4.4BSD curses library +# G = mentioned in the documentation for GNU termcap +# E = used by GNU Emacs +# K = remove this terminfo capability when translating to standard format +# The important codes are C and E. A cap with C or E should be preserved in +# translation if possible. The problem is that preserving all such caps may +# lead to some termcap translations being too long. The termcap maintainer +# has a bit of a juggling act to do...potential problem cases are marked with +# an asterisk (*). +# +# The aliases section has the following format: +# +# Column 1: either `capalias' or `infoalias' +# Column 2: name to be aliased +# Column 3: what name it should translate to. The name IGNORE means it +# should be discarded with a warning message. +# Column 4: name of the extension set (used for compiler warning messages) +# Column 5: capability description (usually an associated terminfo variable) +# +# HANDLING TERMCAP AND TERMINFO EXTENSIONS +# +# There are basically five different ways to handle termcap and terminfo +# extensions: +# +# 1. Don't list the capname here, or list it but comment it out (the latter +# is preferable; someone might want to handle it in the future). If you do +# this, the capability will be treated as unknown and raise a warning from +# the compiler. +# +# 2. Alias it. This is appropriate if the capability has the same meaning +# as an already-supported one. The compiler will handle aliasing, emitting +# an appropriate informational message whenever an alias fires. +# +# 3. List it in the standard table. You almost certainly do *not* want +# to do this -- the capabilities in that one, and their order, have been +# carefully chosen to be SVr4-binary-compatible when they're written out +# as a terminfo object, and breaking this would be bad. It is up to the ncurses +# library what to do with the terminfo data after it is read in. +# +# 4. List it in the aliases table with an IGNORE target field. If you +# do this, the capability will be ignored on input (though the user will +# get a warning message about it). +# +# 5. List it in the extensions table. If you do this, the compiler will +# silently accept the capability, but the curses library proper will never +# see it (because it won't be written out as part of the terminfo object +# format). It is up to you what you have the compiler do with it. +# +# There are two opposite reasons to choose option 5. One is when you want +# to eat the capability silently and discard it when doing translations +# to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are +# in this class. Nothing will ever use them again. +# +# More usually, you want the compiler to try to deduce something from the +# capability value that it can use to translate it into your output format. +# You'll need to write custom code, probably in postprocess_termcap() or +# postprocess_terminfo(), to handle the translation. +# +# CONTROLLING ENTRY LENGTH +# +# Notes on specific elisions made to fit translations within 1023 bytes: +# +# Machines with IBM PC-like keyboards want to be able to define the following +# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- +# only environments for End or Home-Down), key_dc, and key_ic. This is also +# the set of keys the `joe' editor will be upset if it can't see. So don't +# trim those out of the set to be translated to termcap, or various users of +# the termcap file will become irate. +# +# It might look tempting to leave those long init strings out of translations. +# We can't do it (yet); 4.4BSD tput and tset use them. +# +# We retain the sgr capability in translation in spite of the fact that neither +# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are +# hard to understand without it, and (b) the entries in which it is long tend +# to be older types that don't use up a lot of string space on function keys. +# The tic(1) translation code will complain and elide it if it makes a critical +# difference (there is special code in tic to recognize this situation). +# +# Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion +# optimizer in BSD curses didn't use them. This omission seems to be the +# single most effective one, it shortened the resolved length of all thirteen +# problem entries in the 9.9.0 version of the terminfo master below critical. +# +# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap +# translations go back over critical if we do this. As 4.4BSD curses fades +# into history and GNU termcap's application base shrinks towards being GNU +# Emacs only, we'll probably elide out some BSD-only capabilities in order +# to buy space for non-essentials Emacs is still using. Capabilities high +# on that hit list: rc, sc, uc. +# +# FORMATTING THE TABLES +# +# We manually specify a (minimum) column width for the capability name +# and terminfo code columns in the tables to achieve a consistent +# arrangement; as used here, tbl(1) cannot know the width required by +# one table's data while formatting another's. +# +# The longest capability names (C variables) are +# "enter_near_letter_quality" and "bit_image_carriage_return" (tied at +# 25n), and the longest terminfo codes are "setcolor", "kcdelete", +# "kcinsert", "kadelete", and "kcinsert" (8n). +# +# The tables are a tight fit on traditional man(7) implementations that +# use a line length of 65n, and the "Description" column has little room +# within which the formatter can make breaking or adjustment decisions. +# Words like "micro_..._address" and "parm_..._micro" don't break. +# Reducing the inter-column gaps to 2 ens gives them enough room. --GBR +# +############################################################################# +# +# STANDARD CAPABILITIES +# +#%Tables of capabilities +#%.I \%ncurses +#%recognizes in a +#%.I \%term\%info +#%terminal type description and available to +#%.IR \%term\%info -using +#%code follow. +#%.bP +#%The capability name identifies the symbol by which the programmer +#%using the +#%.I \%term\%info +#%API accesses the capability. +#%.bP +#%The TI +#%.RI ( \%term\%info ) +#%code is the short name used by a person composing or updating a +#%terminal type entry. +#%.IP +#%Whenever possible, +#%these codes are the same as or similar to those of the ANSI X3.64-1979 +#%standard +#%(now superseded by ECMA-48, +#%which uses identical or very similar names). +#%Semantics are also intended to match those of the specification. +#%.IP +#%.I \%term\%info +#%codes have no hard length limit, +#%but +#%.I \%ncurses +#%maintains an informal one of 5 characters to keep them short and to +#%allow the tabs in the source file +#%.I Caps +#%to line up nicely. +#%(Some standard codes exceed this limit regardless.) +#%.bP +#%The TC +#%.RI ( termcap ) +#%code is that used by the corresponding API of +#%.IR \%ncurses . +#%(Some capabilities are new, +#%and have names that BSD +#%.I termcap +#%did not originate.) +#%.bP +#%The description field attempts to convey the capability's semantics. +#%.PP +#%The description field employs a handful of notations. +#%.TP +#%.B (P) +#%indicates that padding may be specified. +#%.TP +#%.B (P*) +#%indicates that padding may vary in proportion to the number of output +#%lines affected. +#%.TP +#%.BI # i +#%indicates the +#%.IR i th +#%parameter of a string capability; +#%the programmer should pass the string to \fB\%tparm\fP(3X) with the +#%parameters listed. +#%.IP +#%If the description lists no parameters, +#%passing the string to \fB\%tparm\fP(3X) may produce unexpected +#%behavior, +#%for instance if the string contains percent signs. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Boolean Capability Name TI TC Description +#%_ +auto_left_margin bw bool bw - - YB-G- cub1 wraps from column 0 to last column +auto_right_margin am bool am - - YBCGE terminal has automatic margins +no_esc_ctlc xsb bool xb - - YBCG- beehive (f1=escape, f2=ctrl C) +ceol_standout_glitch xhp bool xs - - YBCGE standout not erased by overwriting (hp) +eat_newline_glitch xenl bool xn - - YBCGE newline ignored after 80 cols (concept) +erase_overstrike eo bool eo - - YBCG- can erase overstrikes with a blank +generic_type gn bool gn - - YB-G- generic line type +hard_copy hc bool hc - - YBCG- hardcopy terminal +has_meta_key km bool km - - YB-GE Has a meta key (i.e., sets 8th-bit) +has_status_line hs bool hs - - YB-G- has extra status line +insert_null_glitch in bool in - - YBCGE insert mode distinguishes nulls +memory_above da bool da - - YBCG- display may be retained above the screen +memory_below db bool db - - YB-GE display may be retained below the screen +move_insert_mode mir bool mi - - YBCGE safe to move while in insert mode +move_standout_mode msgr bool ms - - YBCGE safe to move while in standout mode +over_strike os bool os - - YBCG- terminal can overstrike +status_line_esc_ok eslok bool es - - YB-G- escape can be used on the status line +dest_tabs_magic_smso xt bool xt - - YBCGE tabs destructive, magic so char (t1061) +tilde_glitch hz bool hz - - YB-GE cannot print ~'s (Hazeltine) +transparent_underline ul bool ul - - YBCGE underline character overstrikes +xon_xoff xon bool xo - - YB--- terminal uses xon/xoff handshaking +needs_xon_xoff nxon bool nx - - ----- padding will not work, xon/xoff required +prtr_silent mc5i bool 5i - - ----- printer will not echo on screen +hard_cursor chts bool HC - - ----- cursor is hard to see +non_rev_rmcup nrrmc bool NR - - ----- smcup does not reverse rmcup +no_pad_char npc bool NP - - ----- pad character does not exist +non_dest_scroll_region ndscr bool ND - - ----- scrolling region is non-destructive +can_change ccc bool cc - - ----- terminal can re-define existing colors +back_color_erase bce bool ut - - ----- screen erased with background color +hue_lightness_saturation hls bool hl - - ----- terminal uses only HLS color notation (Tektronix) +col_addr_glitch xhpa bool YA - - ----- only positive motion for hpa/mhpa caps +cr_cancels_micro_mode crxm bool YB - - ----- using cr turns off micro mode +has_print_wheel daisy bool YC - - ----- printer needs operator to change character set +row_addr_glitch xvpa bool YD - - ----- only positive motion for vpa/mvpa caps +semi_auto_right_margin sam bool YE - - ----- printing in last column causes cr +cpi_changes_res cpix bool YF - - ----- changing character pitch changes resolution +lpi_changes_res lpix bool YG - - ----- changing line pitch changes resolution +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +columns cols num co - - YBCGE number of columns in a line +init_tabs it num it - - YB-G- tabs initially every # spaces +lines lines num li - - YBCGE number of lines on screen or page +lines_of_memory lm num lm - - YB-G- lines of memory if > line. 0 means varies +magic_cookie_glitch xmc num sg - - YBCGE number of blank characters left by smso or rmso +padding_baud_rate pb num pb - - YB-GE lowest baud rate where padding needed +virtual_terminal vt num vt - - YB--- virtual terminal number (CB/unix) +width_status_line wsl num ws - - YB-G- number of columns in status line +num_labels nlab num Nl - - ----- number of labels on screen +label_height lh num lh - - ----- rows in each label +label_width lw num lw - - ----- columns in each label +max_attributes ma num ma - - YBC-- maximum combined attributes terminal can handle +maximum_windows wnum num MW - - ----- maximum number of definable windows +# These came in with SVr4's color support +max_colors colors num Co - - ----- maximum number of colors on screen +max_pairs pairs num pa - - ----- maximum number of color-pairs on the screen +no_color_video ncv num NC - - ----- video attributes that cannot be used with colors +#%.TE +#%.PP +#%. +#%The following numeric capabilities are present in the SVr4.0 term structure, +#%but are not yet documented in the man page. +#%They came in with SVr4's printer support. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +buffer_capacity bufsz num Ya - - ----- numbers of bytes buffered before printing +dot_vert_spacing spinv num Yb - - ----- spacing of pins vertically in pins per inch +dot_horz_spacing spinh num Yc - - ----- spacing of dots horizontally in dots per inch +max_micro_address maddr num Yd - - ----- maximum value in micro_..._address +max_micro_jump mjump num Ye - - ----- maximum value in parm_..._micro +micro_col_size mcs num Yf - - ----- character step size when in micro mode +micro_line_size mls num Yg - - ----- line step size when in micro mode +number_of_pins npins num Yh - - ----- numbers of pins in print-head +output_res_char orc num Yi - - ----- horizontal resolution in units per line +output_res_line orl num Yj - - ----- vertical resolution in units per line +output_res_horz_inch orhi num Yk - - ----- horizontal resolution in units per inch +output_res_vert_inch orvi num Yl - - ----- vertical resolution in units per inch +print_rate cps num Ym - - ----- print rate in characters per second +wide_char_size widcs num Yn - - ----- character step size when in double wide mode +buttons btns num BT - - ----- number of buttons on mouse +bit_image_entwining bitwin num Yo - - ----- number of passes for each bit-image row +bit_image_type bitype num Yp - - ----- type of bit-image device +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +back_tab cbt str bt - - YBCGE back tab (P) +bell bel str bl - - YB-GE audible signal (bell) (P) +carriage_return cr str cr - - YBCGE carriage return (P*) (P*) +change_scroll_region csr str cs - - YBCGE change region to line #1 to line #2 (P) +clear_all_tabs tbc str ct - - YB-G- clear all tab stops (P) +clear_screen clear str cl - - YBCGE clear screen and home cursor (P*) +clr_eol el str ce - - YBCGE clear to end of line (P) +clr_eos ed str cd - - YBCGE clear to end of screen (P*) +column_address hpa str ch - - -B-GE* horizontal position #1, absolute (P) +command_character cmdch str CC - - YB-G- terminal settable cmd character in prototype !? +cursor_address cup str cm - - YBCGE move to row #1 columns #2 +cursor_down cud1 str do - - YBCGE down one line +cursor_home home str ho - - YBCGE home cursor (if no cup) +cursor_invisible civis str vi - - YB-G- make cursor invisible +cursor_left cub1 str le - - YBCGE move left one space +cursor_mem_address mrcup str CM - - YB-G- memory relative cursor addressing, move to row #1 columns #2 +cursor_normal cnorm str ve - - YBCGE make cursor appear normal (undo civis/cvvis) +cursor_right cuf1 str nd - - YBCGE non-destructive space (move right one space) +cursor_to_ll ll str ll - - YBCGE last line, first column (if no cup) +cursor_up cuu1 str up - - YBCGE up one line +cursor_visible cvvis str vs - - YBCGE make cursor very visible +delete_character dch1 str dc - - YBCGE delete character (P*) +delete_line dl1 str dl - - YBCGE delete line (P*) +dis_status_line dsl str ds - - YB-G- disable status line +down_half_line hd str hd - - YB-G- half a line down +enter_alt_charset_mode smacs str as - - YB-G- start alternate character set (P) +enter_blink_mode blink str mb - - YB-G- turn on blinking +enter_bold_mode bold str md - - YB-G- turn on bold (extra bright) mode +enter_ca_mode smcup str ti - - YBCGE string to start programs using cup +enter_delete_mode smdc str dm - - YBCGE enter delete mode +enter_dim_mode dim str mh - - YB-G- turn on half-bright mode +enter_insert_mode smir str im - - YBCGE enter insert mode +enter_secure_mode invis str mk - - -B-G-* turn on blank mode (characters invisible) +enter_protected_mode prot str mp - - -B-G-* turn on protected mode +enter_reverse_mode rev str mr - - YB-G- turn on reverse video mode +enter_standout_mode smso str so - - YBCGE begin standout mode +enter_underline_mode smul str us - - YBCGE begin underline mode +erase_chars ech str ec - - YB-G- erase #1 characters (P) +exit_alt_charset_mode rmacs str ae - - YB-G- end alternate character set (P) +exit_attribute_mode sgr0 str me - - YB-GE turn off all attributes +exit_ca_mode rmcup str te - - YBCGE strings to end programs using cup +exit_delete_mode rmdc str ed - - YBCGE end delete mode +exit_insert_mode rmir str ei - - YBCGE exit insert mode +exit_standout_mode rmso str se - - YBCGE exit standout mode +exit_underline_mode rmul str ue - - YBCGE exit underline mode +flash_screen flash str vb - - YBCGE visible bell (may not move cursor) +form_feed ff str ff - - YB-G- hardcopy terminal page eject (P*) +from_status_line fsl str fs - - YB-G- return from status line +init_1string is1 str i1 - - YB-G- initialization string +init_2string is2 str is - - YB-G- initialization string +init_3string is3 str i3 - - YB-G- initialization string +init_file if str if - - YB-G- name of initialization file +insert_character ich1 str ic - - YBCGE insert character (P) +insert_line il1 str al - - YBCGE insert line (P*) +insert_padding ip str ip - - YBCGE insert padding after inserted character +key_backspace kbs str kb KEY_BACKSPACE 0407 YB-G- backspace key +key_catab ktbc str ka KEY_CATAB 0526 -B-G-* clear-all-tabs key +key_clear kclr str kC KEY_CLEAR 0515 -B-G-* clear-screen or erase key +key_ctab kctab str kt KEY_CTAB 0525 -B-G-* clear-tab key +key_dc kdch1 str kD KEY_DC 0512 YB-G- delete-character key +key_dl kdl1 str kL KEY_DL 0510 -B-G-* delete-line key +key_down kcud1 str kd KEY_DOWN 0402 YBCGE down-arrow key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode +key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key +key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key +key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key +key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key +key_f10 kf10 str k; KEY_F(10) - ----E F10 function key +key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key +key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key +key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key +key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key +key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key +key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key +key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key +key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key +key_home khome str kh KEY_HOME 0406 YBCGE home key +key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key +key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key +key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key +key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) +key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key +key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key +key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key +key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key +key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key +key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key +key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key +keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode +keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode +lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 +lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 +lab_f10 lf10 str la - - ----- label on function key f10 if not f10 +lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 +lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 +lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 +lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 +lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 +lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 +lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 +lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 +meta_off rmm str mo - - YB-G-* turn off meta mode +meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) +newline nel str nw - - YB-G-* newline (behave like cr followed by lf) +pad_char pad str pc - - YBCGE padding char (instead of null) +parm_dch dch str DC - - YB-GE delete #1 characters (P*) +parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) +parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) +parm_ich ich str IC - - YB-GE insert #1 characters (P*) +parm_index indn str SF - - YBCG- scroll forward #1 lines (P) +parm_insert_line il str AL - - YBCGE insert #1 lines (P*) +parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) +parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) +parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) +parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) +pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 +pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 +pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 +print_screen mc0 str ps - - -B-G-* print contents of screen +prtr_off mc4 str pf - - -B-G-* turn off printer +prtr_on mc5 str po - - -B-G-* turn on printer +repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) +reset_1string rs1 str r1 - - -B--- reset string +reset_2string rs2 str r2 - - -B--- reset string +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +reset_3string rs3 str r3 - - -B--- reset string +reset_file rf str rf - - -B--- name of reset file +restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor +row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) +save_cursor sc str sc - - YBCG- save current cursor position (P) +scroll_forward ind str sf - - YBCGE scroll text up (P) +scroll_reverse ri str sr - - YBCGE scroll text down (P) +set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) +set_tab hts str st - - YB-G- set a tab in every row, current columns +set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 +tab ht str ta - - YBCGE tab to next 8-space hardware tab stop +to_status_line tsl str ts - - YB-G- move to status line, column #1 +underline_char uc str uc - - YBCG- underline char and move past it +up_half_line hu str hu - - YB-G- half a line up +init_prog iprog str iP - - -B--- path name of program for initialization +key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad +key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad +key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad +key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad +key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad +prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes +# +# SVr1 capabilities stop here. IBM's version of terminfo is the same as +# SVr4 up to this point, but has a different set afterwards. +# +char_padding rmp str rP - - ----- like ip but when in insert mode +acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 +plab_norm pln str pn - - ----- program label #1 to show string #2 +key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key +enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking +exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking +enter_am_mode smam str SA - - ----- turn on automatic margins +exit_am_mode rmam str RA - - ----- turn off automatic margins +xon_character xonc str XN - - ----- XON character +xoff_character xoffc str XF - - ----- XOFF character +ena_acs enacs str eA - - ----- enable alternate char set +label_on smln str LO - - ----- turn on soft labels +label_off rmln str LF - - ----- turn off soft labels +key_beg kbeg str @1 KEY_BEG 0542 ----- begin key +key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key +key_close kclo str @3 KEY_CLOSE 0544 ----- close key +key_command kcmd str @4 KEY_COMMAND 0545 ----- command key +key_copy kcpy str @5 KEY_COPY 0546 ----- copy key +key_create kcrt str @6 KEY_CREATE 0547 ----- create key +key_end kend str @7 KEY_END 0550 ----- end key +key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key +key_exit kext str @9 KEY_EXIT 0551 ----- exit key +key_find kfnd str @0 KEY_FIND 0552 ----- find key +key_help khlp str %1 KEY_HELP 0553 ----- help key +key_mark kmrk str %2 KEY_MARK 0554 ----- mark key +key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key +key_move kmov str %4 KEY_MOVE 0556 ----- move key +key_next knxt str %5 KEY_NEXT 0557 ----- next key +key_open kopn str %6 KEY_OPEN 0560 ----- open key +key_options kopt str %7 KEY_OPTIONS 0561 ----- options key +key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key +key_print kprt str %9 KEY_PRINT 0532 ----- print key +key_redo krdo str %0 KEY_REDO 0563 ----- redo key +key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key +key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key +key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key +key_restart krst str &4 KEY_RESTART 0567 ----- restart key +key_resume kres str &5 KEY_RESUME 0570 ----- resume key +key_save ksav str &6 KEY_SAVE 0571 ----- save key +key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key +key_undo kund str &8 KEY_UNDO 0630 ----- undo key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key +key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key +key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key +key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key +key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key +key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key +key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key +key_select kslt str *6 KEY_SELECT 0601 ----- select key +key_send kEND str *7 KEY_SEND 0602 ----- shifted end key +key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key +key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key +key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key +key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key +key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key +key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key +key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key +key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key +key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key +key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key +key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key +key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key +key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key +key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key +key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key +key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key +key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key +key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key +key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key +key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key +req_for_input rfi str RF - - ----- send next input char (for ptys) +key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key +key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key +key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key +key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key +key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key +key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key +key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key +key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key +key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key +key_f20 kf20 str FA KEY_F(20) - ----E F20 function key +key_f21 kf21 str FB KEY_F(21) - ----E F21 function key +key_f22 kf22 str FC KEY_F(22) - ----E F22 function key +key_f23 kf23 str FD KEY_F(23) - ----E F23 function key +key_f24 kf24 str FE KEY_F(24) - ----E F24 function key +key_f25 kf25 str FF KEY_F(25) - ----E F25 function key +key_f26 kf26 str FG KEY_F(26) - ----E F26 function key +key_f27 kf27 str FH KEY_F(27) - ----E F27 function key +key_f28 kf28 str FI KEY_F(28) - ----E F28 function key +key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key +key_f30 kf30 str FK KEY_F(30) - ----E F30 function key +key_f31 kf31 str FL KEY_F(31) - ----E F31 function key +key_f32 kf32 str FM KEY_F(32) - ----E F32 function key +key_f33 kf33 str FN KEY_F(33) - ----E F33 function key +key_f34 kf34 str FO KEY_F(34) - ----E F34 function key +key_f35 kf35 str FP KEY_F(35) - ----E F35 function key +key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key +key_f37 kf37 str FR KEY_F(37) - ----E F37 function key +key_f38 kf38 str FS KEY_F(38) - ----E F38 function key +key_f39 kf39 str FT KEY_F(39) - ----E F39 function key +key_f40 kf40 str FU KEY_F(40) - ----E F40 function key +key_f41 kf41 str FV KEY_F(41) - ----E F41 function key +key_f42 kf42 str FW KEY_F(42) - ----E F42 function key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_f43 kf43 str FX KEY_F(43) - ----E F43 function key +key_f44 kf44 str FY KEY_F(44) - ----E F44 function key +key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key +key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key +key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key +key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key +key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key +key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key +key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key +key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key +key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key +key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key +key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key +key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key +key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key +key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key +key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key +key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key +key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key +key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key +key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key +clr_bol el1 str cb - - ----- Clear to beginning of line +clear_margins mgc str MC - - ----- clear right and left soft margins +set_left_margin smgl str ML - - ----- set left soft margin at current column (not in BSD \fItermcap\fP) +set_right_margin smgr str MR - - ----- set right soft margin at current column +label_format fln str Lf - - ----- label format +set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs +display_clock dclk str DK - - ----- display clock +remove_clock rmclk str RC - - ----- remove clock +create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 +goto_window wingo str WG - - ----- go to window #1 +hangup hup str HU - - ----- hang-up phone +dial_phone dial str DI - - ----- dial number #1 +quick_dial qdial str QD - - ----- dial number #1 without checking +tone tone str TO - - ----- select touch tone dialing +pulse pulse str PU - - ----- select pulse dialing +flash_hook hook str fh - - ----- flash switch hook +fixed_pause pause str PA - - ----- pause for 2-3 seconds +wait_tone wait str WA - - ----- wait for dial-tone +user0 u0 str u0 - - ----- User string #0 +user1 u1 str u1 - - ----- User string #1 +user2 u2 str u2 - - ----- User string #2 +user3 u3 str u3 - - ----- User string #3 +user4 u4 str u4 - - ----- User string #4 +user5 u5 str u5 - - ----- User string #5 +user6 u6 str u6 - - ----- User string #6 +user7 u7 str u7 - - ----- User string #7 +user8 u8 str u8 - - ----- User string #8 +user9 u9 str u9 - - ----- User string #9 +# +# NCurses extensions for keys accessible on most PC consoles +# +key_sup kUP str !5 KEY_SUP + ----- shifted up-arrow key +key_sdown kDOWN str !6 KEY_SDOWN + ----- shifted down-arrow key +key_sbackspace kBS str !7 KEY_SBACKSPACE + ----- shifted backspace key +key_c_delete kcdelete str !8 KEY_C_DELETE + ----- control- delete-character key +key_c_end kcend str !9 KEY_C_END + ----- control- end key +key_c_home kchom str !0 KEY_C_HOME + ----- control- home key +key_c_insert kcinsert str !_ KEY_C_INSERT + ----- control- insert-character key +key_c_left kclft str %k KEY_C_LEFT + ----- control- left-arrow key +key_c_next kcnxt str %l KEY_C_NEXT + ----- control- next key +key_c_previous kcprv str %m KEY_C_PREVIOUS + ----- control- previous key +key_c_print kcprt str %n KEY_C_PRINT + ----- control- print key +key_c_right kcrit str %o KEY_C_RIGHT + ----- control- right-arrow key +key_c_backspace kcbs str %p KEY_C_BACKSPACE + ----- control- backspace key +key_c_up kcup str %q KEY_C_UP + ----- control- up-arrow key +key_c_down kcdown str %r KEY_C_DOWN + ----- control- down-arrow key +key_a_delete kadelete str %s KEY_A_DELETE + ----- alt- delete-character key +key_a_end kaend str %t KEY_A_END + ----- alt- end key +key_a_home kahom str %u KEY_A_HOME + ----- alt- home key +key_a_insert kainsert str %v KEY_A_INSERT + ----- alt- insert-character key +key_a_left kalft str %w KEY_A_LEFT + ----- alt- left-arrow key +key_a_next kanxt str %x KEY_A_NEXT + ----- alt- next key +key_a_previous kaprv str %y KEY_A_PREVIOUS + ----- alt- previous key +key_a_print kaprt str %z KEY_A_PRINT + ----- alt- print key +key_a_right karit str %! KEY_A_RIGHT + ----- alt- right-arrow key +key_a_backspace kabs str %@ KEY_A_BACKSPACE + ----- alt- backspace key +key_a_up kaup str %# KEY_A_UP + ----- alt- up-arrow key +key_a_down kadown str %$ KEY_A_DOWN + ----- alt- down-arrow key +key_a_a kaa str $a KEY_A_A + ----- alt- a key +key_a_b kab str $b KEY_A_B + ----- alt- b key +key_a_c kac str $c KEY_A_C + ----- alt- c key +key_a_d kad str $d KEY_A_D + ----- alt- d key +key_a_e kae str $e KEY_A_E + ----- alt- e key +key_a_f kaf str $f KEY_A_F + ----- alt- f key +key_a_g kag str $g KEY_A_G + ----- alt- g key +key_a_h kah str $h KEY_A_H + ----- alt- h key +key_a_i kai str $i KEY_A_I + ----- alt- i key +key_a_j kaj str $j KEY_A_J + ----- alt- j key +key_a_k kak str $k KEY_A_K + ----- alt- k key +key_a_l kal str $l KEY_A_L + ----- alt- l key +key_a_m kam str $m KEY_A_M + ----- alt- m key +key_a_n kan str $n KEY_A_N + ----- alt- n key +key_a_o kao str $o KEY_A_O + ----- alt- o key +key_a_p kap str $p KEY_A_P + ----- alt- p key +key_a_q kaq str $q KEY_A_Q + ----- alt- q key +key_a_r kar str $r KEY_A_R + ----- alt- r key +key_a_s kas str $s KEY_A_S + ----- alt- s key +key_a_t kat str $t KEY_A_T + ----- alt- t key +key_a_u kau str $u KEY_A_U + ----- alt- u key +key_a_v kav str $v KEY_A_V + ----- alt- v key +key_a_w kaw str $w KEY_A_W + ----- alt- w key +key_a_x kax str $x KEY_A_X + ----- alt- x key +key_a_y kay str $y KEY_A_Y + ----- alt- y key +key_a_z kaz str $z KEY_A_Z + ----- alt- z key +key_a_0 ka_0 str $0 KEY_A_0 + ----- alt- 0 key +key_a_1 ka_1 str $1 KEY_A_1 + ----- alt- 1 key +key_a_2 ka_2 str $2 KEY_A_2 + ----- alt- 2 key +key_a_3 ka_3 str $3 KEY_A_3 + ----- alt- 3 key +key_a_4 ka_4 str $4 KEY_A_4 + ----- alt- 4 key +key_a_5 ka_5 str $5 KEY_A_5 + ----- alt- 5 key +key_a_6 ka_6 str $6 KEY_A_6 + ----- alt- 6 key +key_a_7 ka_7 str $7 KEY_A_7 + ----- alt- 7 key +key_a_8 ka_8 str $8 KEY_A_8 + ----- alt- 8 key +key_a_9 ka_9 str $9 KEY_A_9 + ----- alt- 9 key +key_a_backtick ka_bt str $` KEY_A_BACKTICK + ----- alt- ` key +key_a_under ka_und str $_ KEY_A_UNDER + ----- alt- _ key +key_a_equals ka_eq str $= KEY_A_EQUALS + ----- alt- = key +key_a_bar ka_bsl str $| KEY_A_BAR + ----- alt- | key +key_a_lbracker ka_lbr str $[ KEY_A_LBRACKER + ----- alt- [ key +key_a_rbracker ka_rbr str $] KEY_A_RBRACKER + ----- alt- ] key +key_a_semi ka_semi str $; KEY_A_SEMI + ----- alt- ; key +key_a_tick ka_tick str $' KEY_A_TICK + ----- alt- ' key +key_a_comma ka_com str $, KEY_A_COMMA + ----- alt- , key +key_a_dot ka_dot str $. KEY_A_DOT + ----- alt- . key +key_a_question ka_sla str $? KEY_A_QUESTION + ----- alt- ? key +key_a_divide ka_div str $/ KEY_A_DIVIDE + ----- alt- keypad / key +key_a_multiply ka_mul str $* KEY_A_MULTIPLY + ----- alt- keypad * key +key_a_add ka_add str $+ KEY_A_ADD + ----- alt- keypad + key +key_a_subtract ka_sub str $- KEY_A_SUBTRACT + ----- alt- keypad - key +key_a_kenter ka_kent str $< KEY_A_KENTER + ----- alt- keypad enter key +key_a_enter ka_ent str $> KEY_A_ENTER + ----- alt- enter key +key_c_at kcat str %% KEY_C_AT + ----- control- @ key +key_c_divide kcdiv str %/ KEY_C_DIVIDE + ----- control- keypad / key +key_c_multiply kcmul str %* KEY_C_MULTIPLY + ----- control- keypad * key +key_c_add kcadd str %+ KEY_C_ADD + ----- control- keypad + key +key_c_subtract kcsub str %- KEY_C_SUBTRACT + ----- control- keypad - key +# +# SVr4 added these capabilities to support color +# +orig_pair op str op - - ----- Set default pair to its original value +orig_colors oc str oc - - ----- Set all color pairs to the original ones +initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) +initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) +set_color_pair scp str sp - - ----- Set current color pair to #1 +set_foreground setf str Sf - - ----- Set foreground color #1 +set_background setb str Sb - - ----- Set background color #1 +# +# SVr4 added these capabilities to support printers +# +change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 +change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 +change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 +change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 +define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 +enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode +enter_italics_mode sitm str ZH - - ----- Enter italic mode +enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion +enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode +enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode +enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode +enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode +enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode +enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode +enter_upward_mode sum str ZP - - ----- Start upward carriage motion +exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode +exit_italics_mode ritm str ZR - - ----- End italic mode +exit_leftward_mode rlm str ZS - - ----- End left-motion mode +exit_micro_mode rmicm str ZT - - ----- End micro-motion mode +exit_shadow_mode rshm str ZU - - ----- End shadow-print mode +exit_subscript_mode rsubm str ZV - - ----- End subscript mode +exit_superscript_mode rsupm str ZW - - ----- End superscript mode +exit_upward_mode rum str ZX - - ----- End reverse character motion +micro_column_address mhpa str ZY - - ----- Like column_address in micro mode +micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode +micro_left mcub1 str Za - - ----- Like cursor_left in micro mode +micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode +micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode +micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode +order_of_pins porder str Ze - - ----- Match software bits to print-head pins +parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode +parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode +parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode +parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode +select_char_set scs str Zj - - ----- Select character set, #1 +set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line +set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom +set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 +set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 +set_top_margin smgt str Zo - - ----- Set top margin at current line +set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 +start_bit_image sbim str Zq - - ----- Start printing bit image graphics +start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set +stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics +stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 +subscript_characters subcs str Zu - - ----- List of subscriptable characters +superscript_characters supcs str Zv - - ----- List of superscriptable characters +these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR +zero_motion zerom str Zx - - ----- No motion for subsequent character +#%.TE +#%.PP +#%. +#%The following string capabilities are present in the SVr4.0 term structure, +#%but were originally not documented in the man page. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +char_set_names csnm str Zy - - ----- Produce #1'th item from list of character set names +key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred +mouse_info minfo str Mi - - ----- Mouse status information +req_mouse_pos reqmp str RQ - - ----- Request mouse position +get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. +set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape +set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape +pkey_plab pfxl str xl - - ----- Program function key #1 to type string #2 and show string #3 +device_type devt str dv - - ----- Indicate language/codeset support +code_set_init csin str ci - - ----- Init sequence for multiple codesets +set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) +set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 +set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 +set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 +set_lr_margin smglr str ML - - ----- Set both left and right margins to #1, #2. (ML is not in BSD termcap). +set_tb_margin smgtb str MT - - ----- Sets both top and bottom margins to #1, #2 +bit_image_repeat birep str Xy - - ----- Repeat bit image cell #1 #2 times +bit_image_newline binel str Zz - - ----- Move to next row of the bit image +bit_image_carriage_return bicr str Yv - - ----- Move to beginning of same row +color_names colornm str Yw - - ----- Give name for color #1 +define_bit_image_region defbi str Yx - - ----- Define rectangular bit image region +end_bit_image_region endbi str Yy - - ----- End a bit-image region +set_color_band setcolor str Yz - - ----- Change to ribbon color #1 +set_page_length slines str YZ - - ----- Set page length to #1 lines +# +# SVr4 added these capabilities for direct PC-clone support +# +display_pc_char dispc str S1 - - ----- Display PC character #1 +enter_pc_charset_mode smpch str S2 - - ----- Enter PC character display mode +exit_pc_charset_mode rmpch str S3 - - ----- Exit PC character display mode +enter_scancode_mode smsc str S4 - - ----- Enter PC scancode mode +exit_scancode_mode rmsc str S5 - - ----- Exit PC scancode mode +pc_term_options pctrm str S6 - - ----- PC terminal options +scancode_escape scesc str S7 - - ----- Escape for scancode emulation +alt_scancode_esc scesa str S8 - - ----- Alternate escape for scancode emulation +#%.TE +#%.PP +#%. +#%The XSI Curses standard added these hardcopy capabilities. +#%They were used in some post-4.1 versions of System V curses, +#%e.g., Solaris 2.5 and IRIX 6.x. +#%Except for \fBYI\fP, the \fBncurses\fR termcap names for them are invented. +#%According to the XSI Curses standard, they have no termcap names. +#%If your compiled terminfo entries use these, +#%they may not be binary-compatible with System V terminfo +#%entries after SVr4.1; beware! +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +enter_horizontal_hl_mode ehhlm str Xh - - ----- Enter horizontal highlight mode +enter_left_hl_mode elhlm str Xl - - ----- Enter left highlight mode +enter_low_hl_mode elohlm str Xo - - ----- Enter low highlight mode +enter_right_hl_mode erhlm str Xr - - ----- Enter right highlight mode +enter_top_hl_mode ethlm str Xt - - ----- Enter top highlight mode +enter_vertical_hl_mode evhlm str Xv - - ----- Enter vertical highlight mode +set_a_attributes sgr1 str sA - - ----- Define second set of video attributes #1-#6 +set_pglen_inch slength str YI - - ----- Set page length to #1 hundredth of an inch (some implementations use sL for termcap). +#%.TE +# +# The magic token below tells the tic compiler-generator code that all the caps +# past it should be ignored (not written out) when dumping terminfo objects. It +# also tells the man page table generator not to pass through following lines +# This means we can have obsolete capabilities and pseudo-capabilities that are +# recognized for termcap or terminfo compilation, but not output. +# +# %%-STOP-HERE-%% +# +# Don't move this casually! In fact, don't move it at all unless you're +# either doing it to add System V or XPG4 extensions, or have decided you +# don't care about SVr4 binary compatibility. +# +############################################################################# +# +# TERMCAP EXTENSION CAPABILITIES +# +# The capabilities below are either obsolete or extensions on certain systems. +# They are not used by SVR4 terminfo. Some are used by captoinfo to translate +# termcap sources; the rest are listed for completeness, and in case somebody +# cares about them enough to hack in code that will translate them into +# terminfo capabilities. +# +# The first part of the list is from Ross Ridge's `mytinfo' package +# (comp.sources.unix, volume 26); the variable names and terminfo names (as +# well as the termcap codes) match his list. +# +# This group of codes is not marked obsolete in 4.4BSD, but have no direct +# terminfo equivalents. The rs capability is specially translated to terminfo +# r2, and vice versa, if an entry does not already have an r2. Similarly, +# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). +# The ug capability is thrown away, but assumed to be whatever sg is if the +# latter is nonzero and we're dumping in termcap format. +# +termcap_init2 OTi2 str i2 - - YB--- secondary initialization string +termcap_reset OTrs str rs - - YB-G- terminal reset string +magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul +# +# Obsolete termcap capabilities. Some are used for termcap translation. The +# code uses the 'OT' prefix we put on obsolete capabilities to suppress +# printing them in terminfo source dumps of compiled entries. +# +backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left +crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll +no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line +carriage_return_delay OTdC num dC - - YB-G- pad needed for CR +new_line_delay OTdN num dN - - YB-G- pad needed for LF +linefeed_if_not_lf OTnl str nl - - YBCGE use to move down +backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H +# +# GNU termcap library extensions. The GNU termcap file distributed with +# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the +# BSD termcap file. The name clash with terminfo MT is resolved by type +# info; MT is converted to km. +# +gnu_has_meta_key OTMT bool MT - - ----E has meta key +# gnu_tab_width OTtw num tw - - ----E tab width in spaces +# +# GNU termcap *does* include the following extended capability, Only the +# now-obsolete Ann Arbor terminals used it. +# +# gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region +# +# The following comments describe capnames so ancient that I believe no +# software uses them any longer. Some of these have to go because they +# clash with terminfo names in ways that cannot be resolved by type +# information. +# +# These mytinfo codes are not used in the 4.4BSD curses code. They are +# marked obsolete in the 4.4BSD manual pages. +# +# There is one conflict with terminfo; ma is in both. This conflict is +# resolved by type information. +# +# The `ko' capability is translated by special code. It should contain a +# comma-separated list of capabilities for which there are corresponding keys. +# The `kn' code is accepted but ignored. +# +# The `ma' capability was a 4.0BSD feature used by vi version 2. +# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. +# Besides being obsolete, that interpretation conflicts with max_attributes. +# +# Here is a description of memory_lock_above and memory_unlock: +# "You can 'freeze' data on the screen by turning on Memory Lock in a line of +# text. All lines above the cursor's current line become locked in place on +# the screen. Then enter data normally. When the screen fills up, any +# further data entered forces the first line of unfrozen line text to scroll +# under the frozen data. Lines scrolled off the screen are inserted into +# memory immediately preceding the first frozen line." (from the HP 700/96 +# User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. +# +# Applications that use terminfo are supposed to behave as though xr is +# always true. +# +linefeed_is_newline OTNL bool NL - - YB--- move down with \n +# even_parity OTEP bool EP - - -B--- terminal requires even parity +# odd_parity OTOP bool OP - - -B--- terminal requires odd parity +# half_duplex OTHD bool HD - - -B--- terminal is half-duplex +# lower_case_only OTLC bool LC - - -B--- terminal has only lower case +# upper_case_only OTUC bool UC - - -B--- terminal has only upper case +backspace_delay OTdB num dB - - YB-G- padding required for ^H +# form_feed_delay OTdF num dF - - -B-G- padding required for ^L +horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I +# vertical_tab_delay OTdV num dV - - -B--- padding required for ^V +number_of_function_keys OTkn num kn - - -B-G- count of function keys +other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps +arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 +# memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line +# memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line +has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I +return_does_clr_eol OTxr bool xr - - YB--- return clears the line +# tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch +# +# mytinfo described this as a termcap capability, but it is not listed in the +# 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses +# package, like System V, behaves as though it is always true. +# +# rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line +# +# University of Waterloo termcap extensions (as described in mytinfo). +# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot +# be resolved by a type check. The descriptions are guesses from what was +# in the mytinfo tables. +# +# key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) +# key_kill_char OTkk str kk - - ----- string set by kill key (?) +# key_suspend_char OTkz str kz - - ----- string set by suspend key (?) +# initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) +# ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return +# +# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. +# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type +# check. +# +# scroll_left OTsl1 str Sl - - ----- scroll screen leftward +# scroll_right OTsr1 str Sr - - ----- scroll screen rightward +# parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters +# parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters +# +# The mytinfo capabilities end here. +# +# XENIX extensions: +# +# Xenix defined its own set of forms-drawing capabilities: +# +# cap IBM ASCII description ACS ASCII +# --- ----------- -------------------- ------------- ------ +# G1 191 \277 M-? single upper right ACS_URCORNER +# G2 218 \332 M-Z single upper left ACS_ULCORNER +# G3 192 \300 M-@ single lower left ACS_LLCORNER +# G4 217 \331 M-Y single lower right ACS_LRCORNER +# G5 187 \273 M-; double upper right +# G6 201 \311 M-I double upper left +# G7 200 \310 M-H double lower left +# G8 188 \274 M-< double lower right +# GC 197 \305 M-E single intersection ACS_PLUS _ _ +# GD 194 \302 M-B single down-tick ACS_TTEE | +# GH 196 \304 M-D single horizontal line ACS_HLINE +# GL 180 \264 M-4 single left tick ACS_RTEE -| +# GR 195 \303 M-C single right tick ACS_LTEE |- +# GU 193 \301 M-A single up tick ACS_BTEE _|_ +# GV 179 \263 M-3 single vertical line ACS_VLINE +# Gc 206 \316 M-N double intersection +# Gd 203 \313 M-K double down tick +# Gh 205 \315 M-M double horizontal line +# Gl 204 \204 M-L double left tick +# Gr 185 \271 M-9 double right tick +# Gu 202 \312 M-J double up tick +# Gv 186 \272 M-: double vertical line +# +# The compiler will translate the single-line caps and discard the others +# (via IGNORE aliases further down). We don't want to do normal pad +# translation on these, they're often single-character printable ASCII +# strings that happen to be numerics. There's awk code in parametrized.sh +# that detects the acs_ prefix and uses it to suppress pad translation. +# These terminfo names are invented. +# +acs_ulcorner OTG2 str G2 - - ----- single upper left +acs_llcorner OTG3 str G3 - - ----- single lower left +acs_urcorner OTG1 str G1 - - ----- single upper right +acs_lrcorner OTG4 str G4 - - ----- single lower right +acs_ltee OTGR str GR - - ----- tee pointing right +acs_rtee OTGL str GL - - ----- tee pointing left +acs_btee OTGU str GU - - ----- tee pointing up +acs_ttee OTGD str GD - - ----- tee pointing down +acs_hline OTGH str GH - - ----- single horizontal line +acs_vline OTGV str GV - - ----- single vertical line +acs_plus OTGC str GC - - ----- single intersection +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# (see Caps-ncurses for the complete set of comments) +# +memory_lock meml str ml - - ----K lock memory above cursor +memory_unlock memu str mu - - ----K unlock memory +box_chars_1 box1 str bx - - ----K box characters primary set +# +############################################################################# diff --git a/contrib/ncurses/include/Caps.osf1r5 b/contrib/ncurses/include/Caps.osf1r5 new file mode 100644 index 00000000..ece14aef --- /dev/null +++ b/contrib/ncurses/include/Caps.osf1r5 @@ -0,0 +1,1031 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 2002-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas Dickey +# +# $Id: Caps.osf1r5,v 1.24 2024/04/20 21:05:02 tom Exp $ +# +# This is an adaptation of ncurses' termcap/terminfo capability table, which +# is designed to align with OSF/1 version 5 (Tru64) terminfo. +# +# This table is used to generate initializers for tables that drive tic, +# infocmp, and the library compilation code used to support the termcap +# compatibility hack. It is also used to generate the tabular portion of the +# terminfo(5) man page; lines beginning with `#%' are passed through to become +# the terminfo table. +# +# This file has three major sections; a standard-capabilities table, two +# extension-capability tables, and a section of aliases declarations. +# The first two have the same format, as follows: +# +# FILE FORMAT +# +# Column 1: terminfo variable name +# Column 2: terminfo capability name +# Column 3: capability type (Boolean, numeric, or string) +# Column 4: termcap capability name +# Column 5: KEY_xxx name, if any, `-' otherwise +# Column 6: value for KEY_xxx name, if any, `-' otherwise +# Column 7: Lead with `Y' if capability should be emitted in termcap +# translations, `-' otherwise +# Column 8: capability description +# +# The codes following [Y-] in column 7 describe the versions of termcap which +# use the given capability. This information is not used by the curses library +# proper; rather, it is there to help the terminfo maintainer avoid emitting +# termcap entry translations that are more than 1023 bytes long (and tank a +# lot of old termcap-using programs). The codes read as follows: +# B = mentioned in the BSD man page for 4.4BSD curses +# C = used by the 4.4BSD curses library +# G = mentioned in the documentation for GNU termcap +# E = used by GNU Emacs +# K = remove this terminfo capability when translating to standard format +# The important codes are C and E. A cap with C or E should be preserved in +# translation if possible. The problem is that preserving all such caps may +# lead to some termcap translations being too long. The termcap maintainer +# has a bit of a juggling act to do...potential problem cases are marked with +# an asterisk (*). +# +# The aliases section has the following format: +# +# Column 1: either `capalias' or `infoalias' +# Column 2: name to be aliased +# Column 3: what name it should translate to. The name IGNORE means it +# should be discarded with a warning message. +# Column 4: name of the extension set (used for compiler warning messages) +# Column 5: capability description (usually an associated terminfo variable) +# +# HANDLING TERMCAP AND TERMINFO EXTENSIONS +# +# There are basically five different ways to handle termcap and terminfo +# extensions: +# +# 1. Don't list the capname here, or list it but comment it out (the latter +# is preferable; someone might want to handle it in the future). If you do +# this, the capability will be treated as unknown and raise a warning from +# the compiler. +# +# 2. Alias it. This is appropriate if the capability has the same meaning +# as an already-supported one. The compiler will handle aliasing, emitting +# an appropriate informational message whenever an alias fires. +# +# 3. List it in the standard table. You almost certainly do *not* want +# to do this -- the capabilities in that one, and their order, have been +# carefully chosen to be SVr4-binary-compatible when they're written out +# as a terminfo object, and breaking this would be bad. It is up to the ncurses +# library what to do with the terminfo data after it is read in. +# +# 4. List it in the aliases table with an IGNORE target field. If you +# do this, the capability will be ignored on input (though the user will +# get a warning message about it). +# +# 5. List it in the extensions table. If you do this, the compiler will +# silently accept the capability, but the curses library proper will never +# see it (because it won't be written out as part of the terminfo object +# format). It is up to you what you have the compiler do with it. +# +# There are two opposite reasons to choose option 5. One is when you want +# to eat the capability silently and discard it when doing translations +# to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are +# in this class. Nothing will ever use them again. +# +# More usually, you want the compiler to try to deduce something from the +# capability value that it can use to translate it into your output format. +# You'll need to write custom code, probably in postprocess_termcap() or +# postprocess_terminfo(), to handle the translation. +# +# CONTROLLING ENTRY LENGTH +# +# Notes on specific elisions made to fit translations within 1023 bytes: +# +# Machines with IBM PC-like keyboards want to be able to define the following +# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- +# only environments for End or Home-Down), key_dc, and key_ic. This is also +# the set of keys the `joe' editor will be upset if it can't see. So don't +# trim those out of the set to be translated to termcap, or various users of +# the termcap file will become irate. +# +# It might look tempting to leave those long init strings out of translations. +# We can't do it (yet); 4.4BSD tput and tset use them. +# +# We retain the sgr capability in translation in spite of the fact that neither +# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are +# hard to understand without it, and (b) the entries in which it is long tend +# to be older types that don't use up a lot of string space on function keys. +# The tic(1) translation code will complain and elide it if it makes a critical +# difference (there is special code in tic to recognize this situation). +# +# Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion +# optimizer in BSD curses didn't use them. This omission seems to be the +# single most effective one, it shortened the resolved length of all thirteen +# problem entries in the 9.9.0 version of the terminfo master below critical. +# +# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap +# translations go back over critical if we do this. As 4.4BSD curses fades +# into history and GNU termcap's application base shrinks towards being GNU +# Emacs only, we'll probably elide out some BSD-only capabilities in order +# to buy space for non-essentials Emacs is still using. Capabilities high +# on that hit list: rc, sc, uc. +# +# FORMATTING THE TABLES +# +# We manually specify a (minimum) column width for the capability name +# and terminfo code columns in the tables to achieve a consistent +# arrangement; as used here, tbl(1) cannot know the width required by +# one table's data while formatting another's. +# +# The longest capability names (C variables) are +# "enter_near_letter_quality" and "bit_image_carriage_return" (tied at +# 25n), and the longest terminfo code is "setcolor" (8n). +# +# The tables are a tight fit on traditional man(7) implementations that +# use a line length of 65n, and the "Description" column has little room +# within which the formatter can make breaking or adjustment decisions. +# Words like "micro_..._address" and "parm_..._micro" don't break. +# Reducing the inter-column gaps to 2 ens gives them enough room. --GBR +# +############################################################################# +# +# STANDARD CAPABILITIES +# +#%Tables of capabilities +#%.I \%ncurses +#%recognizes in a +#%.I \%term\%info +#%terminal type description and available to +#%.IR \%term\%info -using +#%code follow. +#%.bP +#%The capability name identifies the symbol by which the programmer +#%using the +#%.I \%term\%info +#%API accesses the capability. +#%.bP +#%The TI +#%.RI ( \%term\%info ) +#%code is the short name used by a person composing or updating a +#%terminal type entry. +#%.IP +#%Whenever possible, +#%these codes are the same as or similar to those of the ANSI X3.64-1979 +#%standard +#%(now superseded by ECMA-48, +#%which uses identical or very similar names). +#%Semantics are also intended to match those of the specification. +#%.IP +#%.I \%term\%info +#%codes have no hard length limit, +#%but +#%.I \%ncurses +#%maintains an informal one of 5 characters to keep them short and to +#%allow the tabs in the source file +#%.I Caps +#%to line up nicely. +#%(Some standard codes exceed this limit regardless.) +#%.bP +#%The TC +#%.RI ( termcap ) +#%code is that used by the corresponding API of +#%.IR \%ncurses . +#%(Some capabilities are new, +#%and have names that BSD +#%.I termcap +#%did not originate.) +#%.bP +#%The description field attempts to convey the capability's semantics. +#%.PP +#%The description field employs a handful of notations. +#%.TP +#%.B (P) +#%indicates that padding may be specified. +#%.TP +#%.B (P*) +#%indicates that padding may vary in proportion to the number of output +#%lines affected. +#%.TP +#%.BI # i +#%indicates the +#%.IR i th +#%parameter of a string capability; +#%the programmer should pass the string to \fB\%tparm\fP(3X) with the +#%parameters listed. +#%.IP +#%If the description lists no parameters, +#%passing the string to \fB\%tparm\fP(3X) may produce unexpected +#%behavior, +#%for instance if the string contains percent signs. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Boolean Capability Name TI TC Description +#%_ +auto_left_margin bw bool bw - - YB-G- cub1 wraps from column 0 to last column +auto_right_margin am bool am - - YBCGE terminal has automatic margins +no_esc_ctlc xsb bool xb - - YBCG- beehive (f1=escape, f2=ctrl C) +ceol_standout_glitch xhp bool xs - - YBCGE standout not erased by overwriting (hp) +eat_newline_glitch xenl bool xn - - YBCGE newline ignored after 80 cols (concept) +erase_overstrike eo bool eo - - YBCG- can erase overstrikes with a blank +generic_type gn bool gn - - YB-G- generic line type +hard_copy hc bool hc - - YBCG- hardcopy terminal +has_meta_key km bool km - - YB-GE Has a meta key (i.e., sets 8th-bit) +has_status_line hs bool hs - - YB-G- has extra status line +insert_null_glitch in bool in - - YBCGE insert mode distinguishes nulls +memory_above da bool da - - YBCG- display may be retained above the screen +memory_below db bool db - - YB-GE display may be retained below the screen +move_insert_mode mir bool mi - - YBCGE safe to move while in insert mode +move_standout_mode msgr bool ms - - YBCGE safe to move while in standout mode +over_strike os bool os - - YBCG- terminal can overstrike +status_line_esc_ok eslok bool es - - YB-G- escape can be used on the status line +dest_tabs_magic_smso xt bool xt - - YBCGE tabs destructive, magic so char (t1061) +tilde_glitch hz bool hz - - YB-GE cannot print ~'s (Hazeltine) +transparent_underline ul bool ul - - YBCGE underline character overstrikes +xon_xoff xon bool xo - - YB--- terminal uses xon/xoff handshaking +back_color_erase bce bool ut - - ----- screen erased with background color +can_change ccc bool cc - - ----- terminal can re-define existing colors +col_addr_glitch xhpa bool YA - - ----- only positive motion for hpa/mhpa caps +cpi_changes_res cpix bool YF - - ----- changing character pitch changes resolution +cr_cancels_micro_mode crxm bool YB - - ----- using cr turns off micro mode +hard_cursor chts bool HC - - ----- cursor is hard to see +has_print_wheel daisy bool YC - - ----- printer needs operator to change character set +hue_lightness_saturation hls bool hl - - ----- terminal uses only HLS color notation (Tektronix) +lpi_changes_res lpix bool YG - - ----- changing line pitch changes resolution +needs_xon_xoff nxon bool nx - - ----- padding will not work, xon/xoff required +non_dest_scroll_region ndscr bool ND - - ----- scrolling region is non-destructive +non_rev_rmcup nrrmc bool NR - - ----- smcup does not reverse rmcup +no_pad_char npc bool NP - - ----- pad character does not exist +prtr_silent mc5i bool 5i - - ----- printer will not echo on screen +row_addr_glitch xvpa bool YD - - ----- only positive motion for vpa/mvpa caps +semi_auto_right_margin sam bool YE - - ----- printing in last column causes cr +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +columns cols num co - - YBCGE number of columns in a line +init_tabs it num it - - YB-G- tabs initially every # spaces +lines lines num li - - YBCGE number of lines on screen or page +lines_of_memory lm num lm - - YB-G- lines of memory if > line. 0 means varies +magic_cookie_glitch xmc num sg - - YBCGE number of blank characters left by smso or rmso +padding_baud_rate pb num pb - - YB-GE lowest baud rate where padding needed +virtual_terminal vt num vt - - YB--- virtual terminal number (CB/unix) +width_status_line wsl num ws - - YB-G- number of columns in status line +bit_image_entwining bitwin num Yo - - ----- number of passes for each bit-image row +bit_image_type bitype num Yp - - ----- type of bit-image device +buffer_capacity bufsz num Ya - - ----- numbers of bytes buffered before printing +buttons btns num BT - - ----- number of buttons on mouse +dot_vert_spacing spinv num Yb - - ----- spacing of pins vertically in pins per inch +dot_horz_spacing spinh num Yc - - ----- spacing of dots horizontally in dots per inch +label_height lh num lh - - ----- rows in each label +label_width lw num lw - - ----- columns in each label +max_attributes ma num ma - - YBC-- maximum combined attributes terminal can handle +max_colors colors num Co - - ----- maximum number of colors on screen +max_micro_address maddr num Yd - - ----- maximum value in micro_..._address +max_micro_jump mjump num Ye - - ----- maximum value in parm_..._micro +max_pairs pairs num pa - - ----- maximum number of color-pairs on the screen +maximum_windows wnum num MW - - ----- maximum number of definable windows +micro_col_size mcs num Yf - - ----- character step size when in micro mode +micro_line_size mls num Yg - - ----- line step size when in micro mode +no_color_video ncv num NC - - ----- video attributes that can not be used with colors +number_of_pins npins num Yh - - ----- numbers of pins in print-head +num_labels nlab num Nl - - ----- number of labels on screen +output_res_char orc num Yi - - ----- horizontal resolution in units per line +output_res_line orl num Yj - - ----- vertical resolution in units per line +output_res_horz_inch orhi num Yk - - ----- horizontal resolution in units per inch +output_res_vert_inch orvi num Yl - - ----- vertical resolution in units per inch +print_rate cps num Ym - - ----- print rate in characters per second +wide_char_size widcs num Yn - - ----- character step size when in double wide mode +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +back_tab cbt str bt - - YBCGE back tab (P) +bell bel str bl - - YB-GE audible signal (bell) (P) +carriage_return cr str cr - - YBCGE carriage return (P*) (P*) +change_scroll_region csr str cs - - YBCGE change region to line #1 to line #2 (P) +clear_all_tabs tbc str ct - - YB-G- clear all tab stops (P) +clear_screen clear str cl - - YBCGE clear screen and home cursor (P*) +clr_eol el str ce - - YBCGE clear to end of line (P) +clr_eos ed str cd - - YBCGE clear to end of screen (P*) +column_address hpa str ch - - -B-GE* horizontal position #1, absolute (P) +command_character cmdch str CC - - YB-G- terminal settable cmd character in prototype !? +cursor_address cup str cm - - YBCGE move to row #1 columns #2 +cursor_down cud1 str do - - YBCGE down one line +cursor_home home str ho - - YBCGE home cursor (if no cup) +cursor_invisible civis str vi - - YB-G- make cursor invisible +cursor_left cub1 str le - - YBCGE move left one space +cursor_mem_address mrcup str CM - - YB-G- memory relative cursor addressing, move to row #1 columns #2 +cursor_normal cnorm str ve - - YBCGE make cursor appear normal (undo civis/cvvis) +cursor_right cuf1 str nd - - YBCGE non-destructive space (move right one space) +cursor_to_ll ll str ll - - YBCGE last line, first column (if no cup) +cursor_up cuu1 str up - - YBCGE up one line +cursor_visible cvvis str vs - - YBCGE make cursor very visible +delete_character dch1 str dc - - YBCGE delete character (P*) +delete_line dl1 str dl - - YBCGE delete line (P*) +dis_status_line dsl str ds - - YB-G- disable status line +down_half_line hd str hd - - YB-G- half a line down +enter_alt_charset_mode smacs str as - - YB-G- start alternate character set (P) +enter_blink_mode blink str mb - - YB-G- turn on blinking +enter_bold_mode bold str md - - YB-G- turn on bold (extra bright) mode +enter_ca_mode smcup str ti - - YBCGE string to start programs using cup +enter_delete_mode smdc str dm - - YBCGE enter delete mode +enter_dim_mode dim str mh - - YB-G- turn on half-bright mode +enter_insert_mode smir str im - - YBCGE enter insert mode +enter_secure_mode invis str mk - - -B-G-* turn on blank mode (characters invisible) +enter_protected_mode prot str mp - - -B-G-* turn on protected mode +enter_reverse_mode rev str mr - - YB-G- turn on reverse video mode +enter_standout_mode smso str so - - YBCGE begin standout mode +enter_underline_mode smul str us - - YBCGE begin underline mode +erase_chars ech str ec - - YB-G- erase #1 characters (P) +exit_alt_charset_mode rmacs str ae - - YB-G- end alternate character set (P) +exit_attribute_mode sgr0 str me - - YB-GE turn off all attributes +exit_ca_mode rmcup str te - - YBCGE strings to end programs using cup +exit_delete_mode rmdc str ed - - YBCGE end delete mode +exit_insert_mode rmir str ei - - YBCGE exit insert mode +exit_standout_mode rmso str se - - YBCGE exit standout mode +exit_underline_mode rmul str ue - - YBCGE exit underline mode +flash_screen flash str vb - - YBCGE visible bell (may not move cursor) +form_feed ff str ff - - YB-G- hardcopy terminal page eject (P*) +from_status_line fsl str fs - - YB-G- return from status line +init_1string is1 str i1 - - YB-G- initialization string +init_2string is2 str is - - YB-G- initialization string +init_3string is3 str i3 - - YB-G- initialization string +init_file if str if - - YB-G- name of initialization file +insert_character ich1 str ic - - YBCGE insert character (P) +insert_line il1 str al - - YBCGE insert line (P*) +insert_padding ip str ip - - YBCGE insert padding after inserted character +key_backspace kbs str kb KEY_BACKSPACE 0407 YB-G- backspace key +key_catab ktbc str ka KEY_CATAB 0526 -B-G-* clear-all-tabs key +key_clear kclr str kC KEY_CLEAR 0515 -B-G-* clear-screen or erase key +key_ctab kctab str kt KEY_CTAB 0525 -B-G-* clear-tab key +key_dc kdch1 str kD KEY_DC 0512 YB-G- delete-character key +key_dl kdl1 str kL KEY_DL 0510 -B-G-* delete-line key +key_down kcud1 str kd KEY_DOWN 0402 YBCGE down-arrow key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode +key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key +key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key +key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key +key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key +key_f10 kf10 str k; KEY_F(10) - ----E F10 function key +key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key +key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key +key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key +key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key +key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key +key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key +key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key +key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key +key_home khome str kh KEY_HOME 0406 YBCGE home key +key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key +key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key +key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key +key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) +key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key +key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key +key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key +key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key +key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key +key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key +key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key +keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode +keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode +lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 +lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 +lab_f10 lf10 str la - - ----- label on function key f10 if not f10 +lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 +lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 +lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 +lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 +lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 +lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 +lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 +lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 +meta_off rmm str mo - - YB-G-* turn off meta mode +meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) +newline nel str nw - - YB-G-* newline (behave like cr followed by lf) +pad_char pad str pc - - YBCGE padding char (instead of null) +parm_dch dch str DC - - YB-GE delete #1 characters (P*) +parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) +parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) +parm_ich ich str IC - - YB-GE insert #1 characters (P*) +parm_index indn str SF - - YBCG- scroll forward #1 lines (P) +parm_insert_line il str AL - - YBCGE insert #1 lines (P*) +parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) +parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) +parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) +parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) +pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 +pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 +pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 +print_screen mc0 str ps - - -B-G-* print contents of screen +prtr_off mc4 str pf - - -B-G-* turn off printer +prtr_on mc5 str po - - -B-G-* turn on printer +repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) +reset_1string rs1 str r1 - - -B--- reset string +reset_2string rs2 str r2 - - -B--- reset string +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +reset_3string rs3 str r3 - - -B--- reset string +reset_file rf str rf - - -B--- name of reset file +restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor +row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) +save_cursor sc str sc - - YBCG- save current cursor position (P) +scroll_forward ind str sf - - YBCGE scroll text up (P) +scroll_reverse ri str sr - - YBCGE scroll text down (P) +set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) +set_tab hts str st - - YB-G- set a tab in every row, current columns +set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 +tab ht str ta - - YBCGE tab to next 8-space hardware tab stop +to_status_line tsl str ts - - YB-G- move to status line, column #1 +underline_char uc str uc - - YBCG- underline char and move past it +up_half_line hu str hu - - YB-G- half a line up +init_prog iprog str iP - - -B--- path name of program for initialization +key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad +key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad +key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad +key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad +key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad +prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes +# +# SVr1 capabilities stop here. IBM's version of terminfo is the same as +# SVr4 up to this point, but has a different set afterwards. +# +# OSF1 differences start here, based on IBM version: +# +box_chars_1 box1 str bx - - ----K box characters primary set +box_chars_2 box2 str by - - ----K box characters secondary set +box_attr_1 batt1 str Bx - - ----K attributes for box1 +box_attr_2 batt2 str By - - ----K attributes for box2 +color_bg_0 colb0 str d0 - - ----K background color 0 +color_bg_1 colb1 str d1 - - ----K background color 1 +color_bg_2 colb2 str d2 - - ----K background color 2 +color_bg_3 colb3 str d3 - - ----K background color 3 +color_bg_4 colb4 str d4 - - ----K background color 4 +color_bg_5 colb5 str d5 - - ----K background color 5 +color_bg_6 colb6 str d6 - - ----K background color 6 +color_bg_7 colb7 str d7 - - ----K background color 7 +color_fg_0 colf0 str c0 - - ----K foreground color 0 +color_fg_1 colf1 str c1 - - ----K foreground color 1 +color_fg_2 colf2 str c2 - - ----K foreground color 2 +color_fg_3 colf3 str c3 - - ----K foreground color 3 +color_fg_4 colf4 str c4 - - ----K foreground color 4 +color_fg_5 colf5 str c5 - - ----K foreground color 5 +color_fg_6 colf6 str c6 - - ----K foreground color 6 +color_fg_7 colf7 str c7 - - ----K foreground color 7 +font_0 font0 str f0 - - ----- select font 0 +font_1 font1 str f1 - - ----- select font 1 +font_2 font2 str f2 - - ----- select font 2 +font_3 font3 str f3 - - ----- select font 3 +font_4 font4 str f4 - - ----K select font 4 +font_5 font5 str f5 - - ----K select font 5 +font_6 font6 str f6 - - ----K select font 6 +font_7 font7 str f7 - - ----K select font 7 +key_back_tab kbtab str k0 - - ----- backtab key +key_do kdo str ki - - ----K do request key +key_command kcmd str kc KEY_COMMAND 0545 ----- command key +key_command_pane kcpn str kW - - ----K command-pane key +key_end kend str @7 KEY_END 0550 ----- end key +key_help khlp str %1 KEY_HELP 0553 ----- help key +key_newline knl str nl - - ----K newline key +key_next_pane knpn str kv - - ----K next-pane key +key_prev_cmd kppn str kp - - ----K previous-command key +key_prev_pane kppn str kV - - ----K previous-pane key +key_quit kquit str kQ - - ----K quit key +key_select kslt str *6 KEY_SELECT 0601 ----- select key +key_scroll_left kscl str kz - - ----K scroll left +key_scroll_right kscr str kZ - - ----K scroll right +key_tab ktab str ko - - ----K tab key +key_smap_in1 kmpf1 str Kv - - ----K special mapped key 1 input +key_smap_out1 kmpt1 str KV - - ----K special mapped key 1 output +key_smap_in2 kmpf2 str Kw - - ----K special mapped key 2 input +key_smap_out2 kmpt2 str KW - - ----K special mapped key 2 output +key_smap_in3 kmpf3 str Kx - - ----K special mapped key 3 input +key_smap_out3 kmpt3 str KX - - ----K special mapped key 3 output +key_smap_in4 kmpf4 str Ky - - ----K special mapped key 4 input +key_smap_out4 kmpt4 str KY - - ----K special mapped key 4 output +key_smap_in5 kmpf5 str Kz - - ----K special mapped key 5 input +key_smap_out5 kmpt5 str KZ - - ----K special mapped key 5 output +appl_defined_str apstr str za - - ----K application-defined string +# The key_smap_in[6789] and key_smap_out[6789] capabilities are described in +# the Tru64 manual pages. +key_smap_in6 kmpf6 str Kr - - ----K special mapped key 6 input +key_smap_out6 kmpt6 str KR - - ----K special mapped key 6 output +key_smap_in7 kmpf7 str Ks - - ----K special mapped key 7 input +key_smap_out7 kmpt7 str KS - - ----K special mapped key 7 output +key_smap_in8 kmpf8 str Kt - - ----K special mapped key 8 input +key_smap_out8 kmpt8 str KT - - ----K special mapped key 8 output +key_smap_in9 kmpf9 str Ku - - ----K special mapped key 9 input +key_smap_out9 kmpt9 str KU - - ----K special mapped key 9 output +key_sf1 ksf1 str S1 - - ----K special function key 1 +key_sf2 ksf2 str S2 - - ----K special function key 2 +key_sf3 ksf3 str S3 - - ----K special function key 3 +key_sf4 ksf4 str S4 - - ----K special function key 4 +key_sf5 ksf5 str S5 - - ----K special function key 5 +key_sf6 ksf6 str S6 - - ----K special function key 6 +key_sf7 ksf7 str S7 - - ----K special function key 7 +key_sf8 ksf8 str S8 - - ----K special function key 8 +key_sf9 ksf9 str S9 - - ----K special function key 9 +key_sf10 ksf10 str SA - - ----K special function key 10 +# +key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key +key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key +key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key +key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key +key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key +key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key +key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key +key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key +key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key +key_f20 kf20 str FA KEY_F(20) - ----E F20 function key +key_f21 kf21 str FB KEY_F(21) - ----E F21 function key +key_f22 kf22 str FC KEY_F(22) - ----E F22 function key +key_f23 kf23 str FD KEY_F(23) - ----E F23 function key +key_f24 kf24 str FE KEY_F(24) - ----E F24 function key +key_f25 kf25 str FF KEY_F(25) - ----E F25 function key +key_f26 kf26 str FG KEY_F(26) - ----E F26 function key +key_f27 kf27 str FH KEY_F(27) - ----E F27 function key +key_f28 kf28 str FI KEY_F(28) - ----E F28 function key +key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key +key_f30 kf30 str FK KEY_F(30) - ----E F30 function key +key_f31 kf31 str FL KEY_F(31) - ----E F31 function key +key_f32 kf32 str FM KEY_F(32) - ----E F32 function key +key_f33 kf33 str FN KEY_F(33) - ----E F33 function key +key_f34 kf34 str FO KEY_F(34) - ----E F34 function key +key_f35 kf35 str FP KEY_F(35) - ----E F35 function key +key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key +key_action kact str kJ KEY_ACTION 0541 ----K sent by action key +acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 +alt_scancode_esc scesa str S8 - - ----- Alternate escape for scancode emulation +bit_image_repeat birep str Xy - - ----- Repeat bit image cell #1 #2 times +bit_image_newline binel str Zz - - ----- Move to next row of the bit image +bit_image_carriage_return bicr str Yv - - ----- Move to beginning of same row +change_char_pitch cpi str ZA - - ----- Change number of characters per inch to #1 +change_line_pitch lpi str ZB - - ----- Change number of lines per inch to #1 +change_res_horz chr str ZC - - ----- Change horizontal resolution to #1 +change_res_vert cvr str ZD - - ----- Change vertical resolution to #1 +char_padding rmp str rP - - ----- like ip but when in insert mode +char_set_names csnm str Zy - - ----- Produce #1'th item from list of character set names +clear_margins mgc str MC - - ----- clear right and left soft margins +clr_bol el1 str cb - - ----- Clear to beginning of line +code_set_init csin str ci - - ----- Init sequence for multiple codesets +color_names colornm str Yw - - ----- Give name for color #1 +create_window cwin str CW - - ----- define a window #1 from #2,#3 to #4,#5 +define_bit_image_region defbi str Yx - - ----- Define rectangular bit image region +define_char defc str ZE - - ----- Define a character #1, #2 dots wide, descender #3 +device_type devt str dv - - ----- Indicate language/codeset support +dial_phone dial str DI - - ----- dial number #1 +display_clock dclk str DK - - ----- display clock +display_pc_char dispc str S1 - - ----- Display PC character #1 +ena_acs enacs str eA - - ----- enable alternate char set +end_bit_image_region endbi str Yy - - ----- End a bit-image region +enter_am_mode smam str SA - - ----- turn on automatic margins +enter_doublewide_mode swidm str ZF - - ----- Enter double-wide mode +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +enter_draft_quality sdrfq str ZG - - ----- Enter draft-quality mode +enter_italics_mode sitm str ZH - - ----- Enter italic mode +enter_leftward_mode slm str ZI - - ----- Start leftward carriage motion +enter_micro_mode smicm str ZJ - - ----- Start micro-motion mode +enter_near_letter_quality snlq str ZK - - ----- Enter NLQ mode +enter_normal_quality snrmq str ZL - - ----- Enter normal-quality mode +enter_pc_charset_mode smpch str S2 - - ----- Enter PC character display mode +enter_scancode_mode smsc str S4 - - ----- Enter PC scancode mode +enter_shadow_mode sshm str ZM - - ----- Enter shadow-print mode +enter_subscript_mode ssubm str ZN - - ----- Enter subscript mode +enter_superscript_mode ssupm str ZO - - ----- Enter superscript mode +enter_upward_mode sum str ZP - - ----- Start upward carriage motion +enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking +exit_am_mode rmam str RA - - ----- turn off automatic margins +exit_doublewide_mode rwidm str ZQ - - ----- End double-wide mode +exit_italics_mode ritm str ZR - - ----- End italic mode +exit_leftward_mode rlm str ZS - - ----- End left-motion mode +exit_micro_mode rmicm str ZT - - ----- End micro-motion mode +exit_pc_charset_mode rmpch str S3 - - ----- Exit PC character display mode +exit_scancode_mode rmsc str S5 - - ----- Exit PC scancode mode +exit_shadow_mode rshm str ZU - - ----- End shadow-print mode +exit_subscript_mode rsubm str ZV - - ----- End subscript mode +exit_superscript_mode rsupm str ZW - - ----- End superscript mode +exit_upward_mode rum str ZX - - ----- End reverse character motion +exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking +fixed_pause pause str PA - - ----- pause for 2-3 seconds +flash_hook hook str fh - - ----- flash switch hook +get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. +goto_window wingo str WG - - ----- go to window #1 +hangup hup str HU - - ----- hang-up phone +initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) +initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) +key_beg kbeg str @1 KEY_BEG 0542 ----- begin key +key_btab kcbt str kB KEY_BTAB 0632 ----- back-tab key +key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key +key_close kclo str @3 KEY_CLOSE 0544 ----- close key +key_copy kcpy str @5 KEY_COPY 0546 ----- copy key +key_create kcrt str @6 KEY_CREATE 0547 ----- create key +key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key +key_exit kext str @9 KEY_EXIT 0551 ----- exit key +key_f37 kf37 str FR KEY_F(37) - ----E F37 function key +key_f38 kf38 str FS KEY_F(38) - ----E F38 function key +key_f39 kf39 str FT KEY_F(39) - ----E F39 function key +key_f40 kf40 str FU KEY_F(40) - ----E F40 function key +key_f41 kf41 str FV KEY_F(41) - ----E F41 function key +key_f42 kf42 str FW KEY_F(42) - ----E F42 function key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_f43 kf43 str FX KEY_F(43) - ----E F43 function key +key_f44 kf44 str FY KEY_F(44) - ----E F44 function key +key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key +key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key +key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key +key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key +key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key +key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key +key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key +key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key +key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key +key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key +key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key +key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key +key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key +key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key +key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key +key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key +key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key +key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key +key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key +key_find kfnd str @0 KEY_FIND 0552 ----- find key +key_mark kmrk str %2 KEY_MARK 0554 ----- mark key +key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key +key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred +key_move kmov str %4 KEY_MOVE 0556 ----- move key +key_next knxt str %5 KEY_NEXT 0557 ----- next key +key_open kopn str %6 KEY_OPEN 0560 ----- open key +key_options kopt str %7 KEY_OPTIONS 0561 ----- options key +key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key +key_print kprt str %9 KEY_PRINT 0532 ----- print key +key_redo krdo str %0 KEY_REDO 0563 ----- redo key +key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key +key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key +key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key +key_restart krst str &4 KEY_RESTART 0567 ----- restart key +key_resume kres str &5 KEY_RESUME 0570 ----- resume key +key_save ksav str &6 KEY_SAVE 0571 ----- save key +#%.TE +#%.TS +#%center; +#%Lbw(25n)2 Lbw(8n)2 Lb2 Lx. +key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key +key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key +key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key +key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key +key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key +key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key +key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key +key_send kEND str *7 KEY_SEND 0602 ----- shifted end key +key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key +key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key +key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key +key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key +key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key +key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key +key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key +key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key +key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key +key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key +key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key +key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key +key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key +key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key +key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key +key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key +key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key +key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key +key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key +key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key +key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key +key_undo kund str &8 KEY_UNDO 0630 ----- undo key +label_format fln str Lf - - ----- label format +label_off rmln str LF - - ----- turn off soft labels +label_on smln str LO - - ----- turn on soft labels +micro_column_address mhpa str ZY - - ----- Like column_address in micro mode +micro_down mcud1 str ZZ - - ----- Like cursor_down in micro mode +micro_left mcub1 str Za - - ----- Like cursor_left in micro mode +micro_right mcuf1 str Zb - - ----- Like cursor_right in micro mode +micro_row_address mvpa str Zc - - ----- Like row_address #1 in micro mode +micro_up mcuu1 str Zd - - ----- Like cursor_up in micro mode +mouse_info minfo str Mi - - ----- Mouse status information +order_of_pins porder str Ze - - ----- Match software bits to print-head pins +orig_colors oc str oc - - ----- Set all color pairs to the original ones +orig_pair op str op - - ----- Set default pair to its original value +parm_down_micro mcud str Zf - - ----- Like parm_down_cursor in micro mode +parm_left_micro mcub str Zg - - ----- Like parm_left_cursor in micro mode +parm_right_micro mcuf str Zh - - ----- Like parm_right_cursor in micro mode +parm_up_micro mcuu str Zi - - ----- Like parm_up_cursor in micro mode +pc_term_options pctrm str S6 - - ----- PC terminal options +pkey_plab pfxl str xl - - ----- Program function key #1 to type string #2 and show string #3 +plab_norm pln str pn - - ----- program label #1 to show string #2 +pulse pulse str PU - - ----- select pulse dialing +quick_dial qdial str QD - - ----- dial number #1 without checking +req_for_input rfi str RF - - ----- send next input char (for ptys) +req_mouse_pos reqmp str RQ - - ----- Request mouse position +remove_clock rmclk str RC - - ----- remove clock +scancode_escape scesc str S7 - - ----- Escape for scancode emulation +select_char_set scs str Zj - - ----- Select character set, #1 +set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) +set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 +set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 +set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 +set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape +set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape +set_background setb str Sb - - ----- Set background color #1 +set_bottom_margin smgb str Zk - - ----- Set bottom margin at current line +set_bottom_margin_parm smgbp str Zl - - ----- Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom +set_clock sclk str SC - - ----- set clock, #1 hrs #2 mins #3 secs +set_color_band setcolor str Yz - - ----- Change to ribbon color #1 +set_color_pair scp str sp - - ----- Set current color pair to #1 +set_foreground setf str Sf - - ----- Set foreground color #1 +set_left_margin smgl str ML - - ----- set left soft margin at current column (not in BSD \fItermcap\fP) +set_left_margin_parm smglp str Zm - - ----- Set left (right) margin at column #1 +set_lr_margin smglr str ML - - ----- Set both left and right margins to #1, #2. (ML is not in BSD termcap). +set_page_length slines str YZ - - ----- Set page length to #1 lines +set_right_margin smgr str MR - - ----- set right soft margin at current column +set_right_margin_parm smgrp str Zn - - ----- Set right margin at column #1 +set_tb_margin smgtb str MT - - ----- Sets both top and bottom margins to #1, #2 +set_top_margin smgt str Zo - - ----- Set top margin at current line +set_top_margin_parm smgtp str Zp - - ----- Set top (bottom) margin at row #1 +start_bit_image sbim str Zq - - ----- Start printing bit image graphics +start_char_set_def scsd str Zr - - ----- Start character set definition #1, with #2 characters in the set +stop_bit_image rbim str Zs - - ----- Stop printing bit image graphics +stop_char_set_def rcsd str Zt - - ----- End definition of character set #1 +subscript_characters subcs str Zu - - ----- List of subscriptable characters +superscript_characters supcs str Zv - - ----- List of superscriptable characters +these_cause_cr docr str Zw - - ----- Printing any of these characters causes CR +tone tone str TO - - ----- select touch tone dialing +user0 u0 str u0 - - ----- User string #0 +user1 u1 str u1 - - ----- User string #1 +user2 u2 str u2 - - ----- User string #2 +user3 u3 str u3 - - ----- User string #3 +user4 u4 str u4 - - ----- User string #4 +user5 u5 str u5 - - ----- User string #5 +user6 u6 str u6 - - ----- User string #6 +user7 u7 str u7 - - ----- User string #7 +user8 u8 str u8 - - ----- User string #8 +user9 u9 str u9 - - ----- User string #9 +wait_tone wait str WA - - ----- wait for dial-tone +xoff_character xoffc str XF - - ----- XOFF character +xon_character xonc str XN - - ----- XON character +zero_motion zerom str Zx - - ----- No motion for subsequent character +set_pglen_inch slength str YI - - ----- Set page length to #1 hundredth of an inch (some implementations use sL for termcap). +enter_horizontal_hl_mode ehhlm str Xh - - ----- Enter horizontal highlight mode +enter_left_hl_mode elhlm str Xl - - ----- Enter left highlight mode +enter_low_hl_mode elohlm str Xo - - ----- Enter low highlight mode +enter_right_hl_mode erhlm str Xr - - ----- Enter right highlight mode +enter_top_hl_mode ethlm str Xt - - ----- Enter top highlight mode +enter_vertical_hl_mode evhlm str Xv - - ----- Enter vertical highlight mode +set_a_attributes sgr1 str sA - - ----- Define second set of video attributes #1-#6 +# +# +# +# %%-STOP-HERE-%% +# +# Don't move this casually! In fact, don't move it at all unless you're +# either doing it to add System V or XPG4 extensions, or have decided you +# don't care about SVr4 binary compatibility. +# +############################################################################# +# +# TERMCAP EXTENSION CAPABILITIES +# +# The capabilities below are either obsolete or extensions on certain systems. +# They are not used by SVR4 terminfo. Some are used by captoinfo to translate +# termcap sources; the rest are listed for completeness, and in case somebody +# cares about them enough to hack in code that will translate them into +# terminfo capabilities. +# +# The first part of the list is from Ross Ridge's `mytinfo' package +# (comp.sources.unix, volume 26); the variable names and terminfo names (as +# well as the termcap codes) match his list. +# +# This group of codes is not marked obsolete in 4.4BSD, but have no direct +# terminfo equivalents. The rs capability is specially translated to terminfo +# r2, and vice versa, if an entry does not already have an r2. Similarly, +# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). +# The ug capability is thrown away, but assumed to be whatever sg is if the +# latter is nonzero and we're dumping in termcap format. +# +termcap_init2 OTi2 str i2 - - YB--- secondary initialization string +termcap_reset OTrs str rs - - YB-G- terminal reset string +magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul +# +# Obsolete termcap capabilities. Some are used for termcap translation. The +# code uses the 'OT' prefix we put on obsolete capabilities to suppress +# printing them in terminfo source dumps of compiled entries. +# +backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left +crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll +no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line +carriage_return_delay OTdC num dC - - YB-G- pad needed for CR +new_line_delay OTdN num dN - - YB-G- pad needed for LF +linefeed_if_not_lf OTnl str nl - - YBCGE use to move down +backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H +# +# GNU termcap library extensions. The GNU termcap file distributed with +# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the +# BSD termcap file. The name clash with terminfo MT is resolved by type +# info; MT is converted to km. +# +gnu_has_meta_key OTMT bool MT - - ----E has meta key +# gnu_tab_width OTtw num tw - - ----E tab width in spaces +# +# GNU termcap *does* include the following extended capability, Only the +# now-obsolete Ann Arbor terminals used it. +# +# gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region +# +# The following comments describe capnames so ancient that I believe no +# software uses them any longer. Some of these have to go because they +# clash with terminfo names in ways that cannot be resolved by type +# information. +# +# These mytinfo codes are not used in the 4.4BSD curses code. They are +# marked obsolete in the 4.4BSD manual pages. +# +# There is one conflict with terminfo; ma is in both. This conflict is +# resolved by type information. +# +# The `ko' capability is translated by special code. It should contain a +# comma-separated list of capabilities for which there are corresponding keys. +# The `kn' code is accepted but ignored. +# +# The `ma' capability was a 4.0BSD feature used by vi version 2. +# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. +# Besides being obsolete, that interpretation conflicts with max_attributes. +# +# Here is a description of memory_lock_above and memory_unlock: +# "You can 'freeze' data on the screen by turning on Memory Lock in a line of +# text. All lines above the cursor's current line become locked in place on +# the screen. Then enter data normally. When the screen fills up, any +# further data entered forces the first line of unfrozen line text to scroll +# under the frozen data. Lines scrolled off the screen are inserted into +# memory immediately preceding the first frozen line." (from the HP 700/96 +# User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. +# +# Applications that use terminfo are supposed to behave as though xr is +# always true. +# +linefeed_is_newline OTNL bool NL - - YB--- move down with \n +# even_parity OTEP bool EP - - -B--- terminal requires even parity +# odd_parity OTOP bool OP - - -B--- terminal requires odd parity +# half_duplex OTHD bool HD - - -B--- terminal is half-duplex +# lower_case_only OTLC bool LC - - -B--- terminal has only lower case +# upper_case_only OTUC bool UC - - -B--- terminal has only upper case +backspace_delay OTdB num dB - - YB-G- padding required for ^H +# form_feed_delay OTdF num dF - - -B-G- padding required for ^L +horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I +# vertical_tab_delay OTdV num dV - - -B--- padding required for ^V +number_of_function_keys OTkn num kn - - -B-G- count of function keys +other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps +arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 +# memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line +# memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line +has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I +return_does_clr_eol OTxr bool xr - - YB--- return clears the line +# tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch +# +# mytinfo described this as a termcap capability, but it is not listed in the +# 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses +# package, like System V, behaves as though it is always true. +# +# rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line +# +# University of Waterloo termcap extensions (as described in mytinfo). +# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot +# be resolved by a type check. The descriptions are guesses from what was +# in the mytinfo tables. +# +# key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) +# key_kill_char OTkk str kk - - ----- string set by kill key (?) +# key_suspend_char OTkz str kz - - ----- string set by suspend key (?) +# initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) +# ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return +# +# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. +# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type +# check. +# +# scroll_left OTsl1 str Sl - - ----- scroll screen leftward +# scroll_right OTsr1 str Sr - - ----- scroll screen rightward +# parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters +# parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters +# +# The mytinfo capabilities end here. +# +# XENIX extensions: +# +# Xenix defined its own set of forms-drawing capabilities: +# +# cap IBM ASCII description ACS ASCII +# --- ----------- -------------------- ------------- ------ +# G1 191 \277 M-? single upper right ACS_URCORNER +# G2 218 \332 M-Z single upper left ACS_ULCORNER +# G3 192 \300 M-@ single lower left ACS_LLCORNER +# G4 217 \331 M-Y single lower right ACS_LRCORNER +# G5 187 \273 M-; double upper right +# G6 201 \311 M-I double upper left +# G7 200 \310 M-H double lower left +# G8 188 \274 M-< double lower right +# GC 197 \305 M-E single intersection ACS_PLUS _ _ +# GD 194 \302 M-B single down-tick ACS_TTEE | +# GH 196 \304 M-D single horizontal line ACS_HLINE +# GL 180 \264 M-4 single left tick ACS_RTEE -| +# GR 195 \303 M-C single right tick ACS_LTEE |- +# GU 193 \301 M-A single up tick ACS_BTEE _|_ +# GV 179 \263 M-3 single vertical line ACS_VLINE +# Gc 206 \316 M-N double intersection +# Gd 203 \313 M-K double down tick +# Gh 205 \315 M-M double horizontal line +# Gl 204 \204 M-L double left tick +# Gr 185 \271 M-9 double right tick +# Gu 202 \312 M-J double up tick +# Gv 186 \272 M-: double vertical line +# +# The compiler will translate the single-line caps and discard the others +# (via IGNORE aliases further down). We don't want to do normal pad +# translation on these, they're often single-character printable ASCII +# strings that happen to be numerics. There's awk code in parametrized.sh +# that detects the acs_ prefix and uses it to suppress pad translation. +# These terminfo names are invented. +# +acs_ulcorner OTG2 str G2 - - ----- single upper left +acs_llcorner OTG3 str G3 - - ----- single lower left +acs_urcorner OTG1 str G1 - - ----- single upper right +acs_lrcorner OTG4 str G4 - - ----- single lower right +acs_ltee OTGR str GR - - ----- tee pointing right +acs_rtee OTGL str GL - - ----- tee pointing left +acs_btee OTGU str GU - - ----- tee pointing up +acs_ttee OTGD str GD - - ----- tee pointing down +acs_hline OTGH str GH - - ----- single horizontal line +acs_vline OTGV str GV - - ----- single vertical line +acs_plus OTGC str GC - - ----- single intersection +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# (see Caps-ncurses for the complete set of comments) +# +memory_lock meml str ml - - ----K lock memory above cursor +memory_unlock memu str mu - - ----K unlock memory +# +############################################################################# diff --git a/contrib/ncurses/include/Caps.uwin b/contrib/ncurses/include/Caps.uwin new file mode 100644 index 00000000..a41e9eca --- /dev/null +++ b/contrib/ncurses/include/Caps.uwin @@ -0,0 +1,837 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 2001-2015,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas Dickey +# +# $Id: Caps.uwin,v 1.23 2024/04/20 21:05:02 tom Exp $ +# +# This is an adaptation of ncurses' termcap/terminfo capability table, which +# is designed to align with U/Win's terminfo. +# +# This table is used to generate initializers for tables that drive tic, +# infocmp, and the library compilation code used to support the termcap +# compatibility hack. It is also used to generate the tabular portion of the +# terminfo(5) man page; lines beginning with `#%' are passed through to become +# the terminfo table. +# +# This file has three major sections; a standard-capabilities table, two +# extension-capability tables, and a section of aliases declarations. +# The first two have the same format, as follows: +# +# FILE FORMAT +# +# Column 1: terminfo variable name +# Column 2: terminfo capability name +# Column 3: capability type (Boolean, numeric, or string) +# Column 4: termcap capability name +# Column 5: KEY_xxx name, if any, `-' otherwise +# Column 6: value for KEY_xxx name, if any, `-' otherwise +# Column 7: Lead with `Y' if capability should be emitted in termcap +# translations, `-' otherwise +# Column 8: capability description +# +# The codes following [Y-] in column 7 describe the versions of termcap which +# use the given capability. This information is not used by the curses library +# proper; rather, it is there to help the terminfo maintainer avoid emitting +# termcap entry translations that are more than 1023 bytes long (and tank a +# lot of old termcap-using programs). The codes read as follows: +# B = mentioned in the BSD man page for 4.4BSD curses +# C = used by the 4.4BSD curses library +# G = mentioned in the documentation for GNU termcap +# E = used by GNU Emacs +# K = remove this terminfo capability when translating to standard format +# The important codes are C and E. A cap with C or E should be preserved in +# translation if possible. The problem is that preserving all such caps may +# lead to some termcap translations being too long. The termcap maintainer +# has a bit of a juggling act to do...potential problem cases are marked with +# an asterisk (*). +# +# The aliases section has the following format: +# +# Column 1: either `capalias' or `infoalias' +# Column 2: name to be aliased +# Column 3: what name it should translate to. The name IGNORE means it +# should be discarded with a warning message. +# Column 4: name of the extension set (used for compiler warning messages) +# Column 5: capability description (usually an associated terminfo variable) +# +# HANDLING TERMCAP AND TERMINFO EXTENSIONS +# +# There are basically five different ways to handle termcap and terminfo +# extensions: +# +# 1. Don't list the capname here, or list it but comment it out (the latter +# is preferable; someone might want to handle it in the future). If you do +# this, the capability will be treated as unknown and raise a warning from +# the compiler. +# +# 2. Alias it. This is appropriate if the capability has the same meaning +# as an already-supported one. The compiler will handle aliasing, emitting +# an appropriate informational message whenever an alias fires. +# +# 3. List it in the standard table. You almost certainly do *not* want +# to do this -- the capabilities in that one, and their order, have been +# carefully chosen to be SVr4-binary-compatible when they're written out +# as a terminfo object, and breaking this would be bad. It is up to the ncurses +# library what to do with the terminfo data after it is read in. +# +# 4. List it in the aliases table with an IGNORE target field. If you +# do this, the capability will be ignored on input (though the user will +# get a warning message about it). +# +# 5. List it in the extensions table. If you do this, the compiler will +# silently accept the capability, but the curses library proper will never +# see it (because it won't be written out as part of the terminfo object +# format). It is up to you what you have the compiler do with it. +# +# There are two opposite reasons to choose option 5. One is when you want +# to eat the capability silently and discard it when doing translations +# to terminfo with tic -I. Some very old obsolete BSD caps like :kn: are +# in this class. Nothing will ever use them again. +# +# More usually, you want the compiler to try to deduce something from the +# capability value that it can use to translate it into your output format. +# You'll need to write custom code, probably in postprocess_termcap() or +# postprocess_terminfo(), to handle the translation. +# +# CONTROLLING ENTRY LENGTH +# +# Notes on specific elisions made to fit translations within 1023 bytes: +# +# Machines with IBM PC-like keyboards want to be able to define the following +# keys: key_npage, key_ppage, key_home, key_ll (which is used for in termcap- +# only environments for End or Home-Down), key_dc, and key_ic. This is also +# the set of keys the `joe' editor will be upset if it can't see. So don't +# trim those out of the set to be translated to termcap, or various users of +# the termcap file will become irate. +# +# It might look tempting to leave those long init strings out of translations. +# We can't do it (yet); 4.4BSD tput and tset use them. +# +# We retain the sgr capability in translation in spite of the fact that neither +# 4.4BSD nor GNU Emacs uses it, because (a) some entry naming distinctions are +# hard to understand without it, and (b) the entries in which it is long tend +# to be older types that don't use up a lot of string space on function keys. +# The tic(1) translation code will complain and elide it if it makes a critical +# difference (there is special code in tic to recognize this situation). +# +# Yes, BSD tset(1) uses hpa. We elide hpa/vpa anyway because the motion +# optimizer in BSD curses didn't use them. This omission seems to be the +# single most effective one, it shortened the resolved length of all thirteen +# problem entries in the 9.9.0 version of the terminfo master below critical. +# +# It would be nice to keep f11 and f12 for Emacs use, but a couple of termcap +# translations go back over critical if we do this. As 4.4BSD curses fades +# into history and GNU termcap's application base shrinks towards being GNU +# Emacs only, we'll probably elide out some BSD-only capabilities in order +# to buy space for non-essentials Emacs is still using. Capabilities high +# on that hit list: rc, sc, uc. +# +# FORMATTING THE TABLES +# +# We manually specify a (minimum) column width for the capability name +# and terminfo code columns in the tables to achieve a consistent +# arrangement; as used here, tbl(1) cannot know the width required by +# one table's data while formatting another's. +# +# The longest capability names (C variable) is +# "hue_lightness_saturation" (24n), and the longest terminfo code is +# "colornm" (7n). +# +# The tables are a tight fit on traditional man(7) implementations that +# use a line length of 65n, and the "Description" column has little room +# within which the formatter can make breaking or adjustment decisions. +# Words like "micro_..._address" and "parm_..._micro" don't break. +# Reducing the inter-column gaps to 2 ens gives them enough room. --GBR +# +############################################################################# +# +# STANDARD CAPABILITIES +# +#%Tables of capabilities +#%.I \%ncurses +#%recognizes in a +#%.I \%term\%info +#%terminal type description and available to +#%.IR \%term\%info -using +#%code follow. +#%.bP +#%The capability name identifies the symbol by which the programmer +#%using the +#%.I \%term\%info +#%API accesses the capability. +#%.bP +#%The TI +#%.RI ( \%term\%info ) +#%code is the short name used by a person composing or updating a +#%terminal type entry. +#%.IP +#%Whenever possible, +#%these codes are the same as or similar to those of the ANSI X3.64-1979 +#%standard +#%(now superseded by ECMA-48, +#%which uses identical or very similar names). +#%Semantics are also intended to match those of the specification. +#%.IP +#%.I \%term\%info +#%codes have no hard length limit, +#%but +#%.I \%ncurses +#%maintains an informal one of 5 characters to keep them short and to +#%allow the tabs in the source file +#%.I Caps +#%to line up nicely. +#%(Some standard codes exceed this limit regardless.) +#%.bP +#%The TC +#%.RI ( termcap ) +#%code is that used by the corresponding API of +#%.IR \%ncurses . +#%(Some capabilities are new, +#%and have names that BSD +#%.I termcap +#%did not originate.) +#%.bP +#%The description field attempts to convey the capability's semantics. +#%.PP +#%The description field employs a handful of notations. +#%.TP +#%.B (P) +#%indicates that padding may be specified. +#%.TP +#%.B (P*) +#%indicates that padding may vary in proportion to the number of output +#%lines affected. +#%.TP +#%.BI # i +#%indicates the +#%.IR i th +#%parameter of a string capability; +#%the programmer should pass the string to \fB\%tparm\fP(3X) with the +#%parameters listed. +#%.IP +#%If the description lists no parameters, +#%passing the string to \fB\%tparm\fP(3X) may produce unexpected +#%behavior, +#%for instance if the string contains percent signs. +#%. +#%.PP +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +#%\& Code \& +#%Boolean Capability Name TI TC Description +#%_ +auto_left_margin bw bool bw - - YB-G- cub1 wraps from column 0 to last column +auto_right_margin am bool am - - YBCGE terminal has automatic margins +no_esc_ctlc xsb bool xb - - YBCG- beehive (f1=escape, f2=ctrl C) +ceol_standout_glitch xhp bool xs - - YBCGE standout not erased by overwriting (hp) +eat_newline_glitch xenl bool xn - - YBCGE newline ignored after 80 cols (concept) +erase_overstrike eo bool eo - - YBCG- can erase overstrikes with a blank +generic_type gn bool gn - - YB-G- generic line type +hard_copy hc bool hc - - YBCG- hardcopy terminal +has_meta_key km bool km - - YB-GE Has a meta key (i.e., sets 8th-bit) +has_status_line hs bool hs - - YB-G- has extra status line +insert_null_glitch in bool in - - YBCGE insert mode distinguishes nulls +memory_above da bool da - - YBCG- display may be retained above the screen +memory_below db bool db - - YB-GE display may be retained below the screen +move_insert_mode mir bool mi - - YBCGE safe to move while in insert mode +move_standout_mode msgr bool ms - - YBCGE safe to move while in standout mode +over_strike os bool os - - YBCG- terminal can overstrike +status_line_esc_ok eslok bool es - - YB-G- escape can be used on the status line +dest_tabs_magic_smso xt bool xt - - YBCGE tabs destructive, magic so char (t1061) +tilde_glitch hz bool hz - - YB-GE cannot print ~'s (Hazeltine) +transparent_underline ul bool ul - - YBCGE underline character overstrikes +xon_xoff xon bool xo - - YB--- terminal uses xon/xoff handshaking +needs_xon_xoff nxon bool nx - - ----- padding will not work, xon/xoff required +prtr_silent mc5i bool 5i - - ----- printer will not echo on screen +hard_cursor chts bool HC - - ----- cursor is hard to see +non_rev_rmcup nrrmc bool NR - - ----- smcup does not reverse rmcup +no_pad_char npc bool NP - - ----- pad character does not exist +non_dest_scroll_region ndscr bool ND - - ----- scrolling region is non-destructive +back_color_erase bce bool ut - - ----- screen erased with background color +can_change ccc bool cc - - ----- terminal can re-define existing colors +hue_lightness_saturation hls bool hl - - ----- terminal uses only HLS color notation (Tektronix) +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +#%\& Code \& +#%Numeric Capability Name TI TC Description +#%_ +columns cols num co - - YBCGE number of columns in a line +init_tabs it num it - - YB-G- tabs initially every # spaces +lines lines num li - - YBCGE number of lines on screen or page +lines_of_memory lm num lm - - YB-G- lines of memory if > line. 0 means varies +magic_cookie_glitch xmc num sg - - YBCGE number of blank characters left by smso or rmso +padding_baud_rate pb num pb - - YB-GE lowest baud rate where padding needed +virtual_terminal vt num vt - - YB--- virtual terminal number (CB/unix) +width_status_line wsl num ws - - YB-G- number of columns in status line +num_labels nlab num Nl - - ----- number of labels on screen +label_height lh num lh - - ----- rows in each label +label_width lw num lw - - ----- columns in each label +buttons btns num BT - - ----- number of buttons on mouse +#max_attributes ma num ma - - YBC-- maximum combined attributes terminal can handle +#maximum_windows wnum num MW - - ----- maximum number of defineable windows +# These came in with SVr4's color support +max_colors colors num Co - - ----- maximum number of colors on screen +max_pairs pairs num pa - - ----- maximum number of color-pairs on the screen +no_color_video ncv num NC - - ----- video attributes that cannot be used with colors +#%.TE +#%.PP +#%. +#%.TS +#%center; +#%Lb Cb S Lb +#%Lb Lb Lb Lb +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +#%\& Code \& +#%String Capability Name TI TC Description +#%_ +back_tab cbt str bt - - YBCGE back tab (P) +bell bel str bl - - YB-GE audible signal (bell) (P) +carriage_return cr str cr - - YBCGE carriage return (P*) (P*) +change_scroll_region csr str cs - - YBCGE change region to line #1 to line #2 (P) +clear_all_tabs tbc str ct - - YB-G- clear all tab stops (P) +clear_screen clear str cl - - YBCGE clear screen and home cursor (P*) +clr_eol el str ce - - YBCGE clear to end of line (P) +clr_eos ed str cd - - YBCGE clear to end of screen (P*) +column_address hpa str ch - - -B-GE* horizontal position #1, absolute (P) +command_character cmdch str CC - - YB-G- terminal settable cmd character in prototype !? +cursor_address cup str cm - - YBCGE move to row #1 columns #2 +cursor_down cud1 str do - - YBCGE down one line +cursor_home home str ho - - YBCGE home cursor (if no cup) +cursor_invisible civis str vi - - YB-G- make cursor invisible +cursor_left cub1 str le - - YBCGE move left one space +cursor_mem_address mrcup str CM - - YB-G- memory relative cursor addressing, move to row #1 columns #2 +cursor_normal cnorm str ve - - YBCGE make cursor appear normal (undo civis/cvvis) +cursor_right cuf1 str nd - - YBCGE non-destructive space (move right one space) +cursor_to_ll ll str ll - - YBCGE last line, first column (if no cup) +cursor_up cuu1 str up - - YBCGE up one line +cursor_visible cvvis str vs - - YBCGE make cursor very visible +delete_character dch1 str dc - - YBCGE delete character (P*) +delete_line dl1 str dl - - YBCGE delete line (P*) +dis_status_line dsl str ds - - YB-G- disable status line +down_half_line hd str hd - - YB-G- half a line down +enter_alt_charset_mode smacs str as - - YB-G- start alternate character set (P) +enter_blink_mode blink str mb - - YB-G- turn on blinking +enter_bold_mode bold str md - - YB-G- turn on bold (extra bright) mode +enter_ca_mode smcup str ti - - YBCGE string to start programs using cup +enter_delete_mode smdc str dm - - YBCGE enter delete mode +enter_dim_mode dim str mh - - YB-G- turn on half-bright mode +enter_insert_mode smir str im - - YBCGE enter insert mode +enter_secure_mode invis str mk - - -B-G-* turn on blank mode (characters invisible) +enter_protected_mode prot str mp - - -B-G-* turn on protected mode +enter_reverse_mode rev str mr - - YB-G- turn on reverse video mode +enter_standout_mode smso str so - - YBCGE begin standout mode +enter_underline_mode smul str us - - YBCGE begin underline mode +erase_chars ech str ec - - YB-G- erase #1 characters (P) +exit_alt_charset_mode rmacs str ae - - YB-G- end alternate character set (P) +exit_attribute_mode sgr0 str me - - YB-GE turn off all attributes +exit_ca_mode rmcup str te - - YBCGE strings to end programs using cup +exit_delete_mode rmdc str ed - - YBCGE end delete mode +exit_insert_mode rmir str ei - - YBCGE exit insert mode +exit_standout_mode rmso str se - - YBCGE exit standout mode +exit_underline_mode rmul str ue - - YBCGE exit underline mode +flash_screen flash str vb - - YBCGE visible bell (may not move cursor) +form_feed ff str ff - - YB-G- hardcopy terminal page eject (P*) +from_status_line fsl str fs - - YB-G- return from status line +init_1string is1 str i1 - - YB-G- initialization string +init_2string is2 str is - - YB-G- initialization string +init_3string is3 str i3 - - YB-G- initialization string +init_file if str if - - YB-G- name of initialization file +insert_character ich1 str ic - - YBCGE insert character (P) +insert_line il1 str al - - YBCGE insert line (P*) +insert_padding ip str ip - - YBCGE insert padding after inserted character +key_backspace kbs str kb KEY_BACKSPACE 0407 YB-G- backspace key +key_catab ktbc str ka KEY_CATAB 0526 -B-G-* clear-all-tabs key +key_clear kclr str kC KEY_CLEAR 0515 -B-G-* clear-screen or erase key +key_ctab kctab str kt KEY_CTAB 0525 -B-G-* clear-tab key +key_dc kdch1 str kD KEY_DC 0512 YB-G- delete-character key +key_dl kdl1 str kL KEY_DL 0510 -B-G-* delete-line key +key_down kcud1 str kd KEY_DOWN 0402 YBCGE down-arrow key +#%.TE +#%.TS +#%center; +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +key_eic krmir str kM KEY_EIC 0514 -B-G-* sent by rmir or smir in insert mode +key_eol kel str kE KEY_EOL 0517 -B-G-* clear-to-end-of-line key +key_eos ked str kS KEY_EOS 0516 -B-G-* clear-to-end-of-screen key +key_f0 kf0 str k0 KEY_F(0) 0410 YBCGE F0 function key +key_f1 kf1 str k1 KEY_F(1) - YBCGE F1 function key +key_f10 kf10 str k; KEY_F(10) - ----E F10 function key +key_f2 kf2 str k2 KEY_F(2) - YBCGE F2 function key +key_f3 kf3 str k3 KEY_F(3) - YBCGE F3 function key +key_f4 kf4 str k4 KEY_F(4) - YBCGE F4 function key +key_f5 kf5 str k5 KEY_F(5) - YBCGE F5 function key +key_f6 kf6 str k6 KEY_F(6) - YBCGE F6 function key +key_f7 kf7 str k7 KEY_F(7) - YBCGE F7 function key +key_f8 kf8 str k8 KEY_F(8) - YBCGE F8 function key +key_f9 kf9 str k9 KEY_F(9) - YBCGE F9 function key +key_home khome str kh KEY_HOME 0406 YBCGE home key +key_ic kich1 str kI KEY_IC 0513 YB-GE insert-character key +key_il kil1 str kA KEY_IL 0511 -B-G-* insert-line key +key_left kcub1 str kl KEY_LEFT 0404 YBCGE left-arrow key +key_ll kll str kH KEY_LL 0533 YB-G- lower-left key (home down) +key_npage knp str kN KEY_NPAGE 0522 YB-GE next-page key +key_ppage kpp str kP KEY_PPAGE 0523 YB-GE previous-page key +key_right kcuf1 str kr KEY_RIGHT 0405 YBCGE right-arrow key +key_sf kind str kF KEY_SF 0520 -B-G-* scroll-forward key +key_sr kri str kR KEY_SR 0521 -B-G-* scroll-backward key +key_stab khts str kT KEY_STAB 0524 -B-G-* set-tab key +key_up kcuu1 str ku KEY_UP 0403 YBCGE up-arrow key +keypad_local rmkx str ke - - YBCGE leave 'keyboard_transmit' mode +keypad_xmit smkx str ks - - YBCGE enter 'keyboard_transmit' mode +lab_f0 lf0 str l0 - - -B-G-* label on function key f0 if not f0 +lab_f1 lf1 str l1 - - -B-G-* label on function key f1 if not f1 +lab_f10 lf10 str la - - ----- label on function key f10 if not f10 +lab_f2 lf2 str l2 - - -B-G-* label on function key f2 if not f2 +lab_f3 lf3 str l3 - - -B-G-* label on function key f3 if not f3 +lab_f4 lf4 str l4 - - -B-G-* label on function key f4 if not f4 +lab_f5 lf5 str l5 - - -B-G-* label on function key f5 if not f5 +lab_f6 lf6 str l6 - - -B-G-* label on function key f6 if not f6 +lab_f7 lf7 str l7 - - -B-G-* label on function key f7 if not f7 +lab_f8 lf8 str l8 - - -B-G-* label on function key f8 if not f8 +lab_f9 lf9 str l9 - - -B-G-* label on function key f9 if not f9 +meta_off rmm str mo - - YB-G-* turn off meta mode +meta_on smm str mm - - YB-G-* turn on meta mode (8th-bit on) +newline nel str nw - - YB-G-* newline (behave like cr followed by lf) +pad_char pad str pc - - YBCGE padding char (instead of null) +parm_dch dch str DC - - YB-GE delete #1 characters (P*) +parm_delete_line dl str DL - - YBCGE delete #1 lines (P*) +parm_down_cursor cud str DO - - YBCGE down #1 lines (P*) +parm_ich ich str IC - - YB-GE insert #1 characters (P*) +parm_index indn str SF - - YBCG- scroll forward #1 lines (P) +parm_insert_line il str AL - - YBCGE insert #1 lines (P*) +parm_left_cursor cub str LE - - YBCGE move #1 characters to the left (P) +parm_right_cursor cuf str RI - - YBCGE move #1 characters to the right (P*) +parm_rindex rin str SR - - YBCG- scroll back #1 lines (P) +parm_up_cursor cuu str UP - - YBCGE up #1 lines (P*) +pkey_key pfkey str pk - - -B--- program function key #1 to type string #2 +pkey_local pfloc str pl - - -B--- program function key #1 to execute string #2 +pkey_xmit pfx str px - - -B--- program function key #1 to transmit string #2 +print_screen mc0 str ps - - -B-G-* print contents of screen +prtr_off mc4 str pf - - -B-G-* turn off printer +prtr_on mc5 str po - - -B-G-* turn on printer +repeat_char rep str rp - - YB-GE repeat char #1 #2 times (P*) +reset_1string rs1 str r1 - - -B--- reset string +reset_2string rs2 str r2 - - -B--- reset string +#%.TE +#%.TS +#%center; +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +reset_3string rs3 str r3 - - -B--- reset string +reset_file rf str rf - - -B--- name of reset file +restore_cursor rc str rc - - YBCG- restore cursor to position of last save_cursor +row_address vpa str cv - - -B-GE* vertical position #1 absolute (P) +save_cursor sc str sc - - YBCG- save current cursor position (P) +scroll_forward ind str sf - - YBCGE scroll text up (P) +scroll_reverse ri str sr - - YBCGE scroll text down (P) +set_attributes sgr str sa - - YB-G- define video attributes #1-#9 (PG9) +set_tab hts str st - - YB-G- set a tab in every row, current columns +set_window wind str wi - - -B-GE current window is lines #1-#2 cols #3-#4 +tab ht str ta - - YBCGE tab to next 8-space hardware tab stop +to_status_line tsl str ts - - YB-G- move to status line, column #1 +underline_char uc str uc - - YBCG- underline char and move past it +up_half_line hu str hu - - YB-G- half a line up +init_prog iprog str iP - - -B--- path name of program for initialization +key_a1 ka1 str K1 KEY_A1 0534 YB-GE upper left of keypad +key_a3 ka3 str K3 KEY_A3 0535 YB-GE upper right of keypad +key_b2 kb2 str K2 KEY_B2 0536 YB-GE center of keypad +key_c1 kc1 str K4 KEY_C1 0537 YB-GE lower left of keypad +key_c3 kc3 str K5 KEY_C3 0540 YB-GE lower right of keypad +prtr_non mc5p str pO - - -B-G-* turn on printer for #1 bytes +# +# SVr1 capabilities stop here. IBM's version of terminfo is the same as +# SVr4 up to this point, but has a different set afterwards. +# +char_padding rmp str rP - - ----- like ip but when in insert mode +acs_chars acsc str ac - - ----- graphics charset pairs, based on vt100 +plab_norm pln str pn - - ----- program label #1 to show string #2 +key_btab kcbt str kB KEY_BTAB 0541 ----- back-tab key +enter_xon_mode smxon str SX - - ----- turn on xon/xoff handshaking +exit_xon_mode rmxon str RX - - ----- turn off xon/xoff handshaking +enter_am_mode smam str SA - - ----- turn on automatic margins +exit_am_mode rmam str RA - - ----- turn off automatic margins +xon_character xonc str XN - - ----- XON character +xoff_character xoffc str XF - - ----- XOFF character +ena_acs enacs str eA - - ----- enable alternate char set +label_on smln str LO - - ----- turn on soft labels +label_off rmln str LF - - ----- turn off soft labels +key_beg kbeg str @1 KEY_BEG 0542 ----- begin key +key_cancel kcan str @2 KEY_CANCEL 0543 ----- cancel key +key_close kclo str @3 KEY_CLOSE 0544 ----- close key +key_command kcmd str @4 KEY_COMMAND 0545 ----- command key +key_copy kcpy str @5 KEY_COPY 0546 ----- copy key +key_create kcrt str @6 KEY_CREATE 0547 ----- create key +key_end kend str @7 KEY_END 0550 ----- end key +key_enter kent str @8 KEY_ENTER 0527 ----- enter/send key +key_exit kext str @9 KEY_EXIT 0551 ----- exit key +key_find kfnd str @0 KEY_FIND 0552 ----- find key +key_help khlp str %1 KEY_HELP 0553 ----- help key +key_mark kmrk str %2 KEY_MARK 0554 ----- mark key +key_message kmsg str %3 KEY_MESSAGE 0555 ----- message key +key_move kmov str %4 KEY_MOVE 0556 ----- move key +key_next knxt str %5 KEY_NEXT 0557 ----- next key +key_open kopn str %6 KEY_OPEN 0560 ----- open key +key_options kopt str %7 KEY_OPTIONS 0561 ----- options key +key_previous kprv str %8 KEY_PREVIOUS 0562 ----- previous key +key_print kprt str %9 KEY_PRINT 0532 ----- print key +key_redo krdo str %0 KEY_REDO 0563 ----- redo key +key_reference kref str &1 KEY_REFERENCE 0564 ----- reference key +key_refresh krfr str &2 KEY_REFRESH 0565 ----- refresh key +key_replace krpl str &3 KEY_REPLACE 0566 ----- replace key +key_restart krst str &4 KEY_RESTART 0567 ----- restart key +key_resume kres str &5 KEY_RESUME 0570 ----- resume key +key_save ksav str &6 KEY_SAVE 0571 ----- save key +key_suspend kspd str &7 KEY_SUSPEND 0627 ----- suspend key +key_undo kund str &8 KEY_UNDO 0630 ----- undo key +#%.TE +#%.TS +#%center; +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +key_sbeg kBEG str &9 KEY_SBEG 0572 ----- shifted begin key +key_scancel kCAN str &0 KEY_SCANCEL 0573 ----- shifted cancel key +key_scommand kCMD str *1 KEY_SCOMMAND 0574 ----- shifted command key +key_scopy kCPY str *2 KEY_SCOPY 0575 ----- shifted copy key +key_screate kCRT str *3 KEY_SCREATE 0576 ----- shifted create key +key_sdc kDC str *4 KEY_SDC 0577 ----- shifted delete-character key +key_sdl kDL str *5 KEY_SDL 0600 ----- shifted delete-line key +key_select kslt str *6 KEY_SELECT 0601 ----- select key +key_send kEND str *7 KEY_SEND 0602 ----- shifted end key +key_seol kEOL str *8 KEY_SEOL 0603 ----- shifted clear-to-end-of-line key +key_sexit kEXT str *9 KEY_SEXIT 0604 ----- shifted exit key +key_sfind kFND str *0 KEY_SFIND 0605 ----- shifted find key +key_shelp kHLP str #1 KEY_SHELP 0606 ----- shifted help key +key_shome kHOM str #2 KEY_SHOME 0607 ----- shifted home key +key_sic kIC str #3 KEY_SIC 0610 ----- shifted insert-character key +key_sleft kLFT str #4 KEY_SLEFT 0611 ----- shifted left-arrow key +key_smessage kMSG str %a KEY_SMESSAGE 0612 ----- shifted message key +key_smove kMOV str %b KEY_SMOVE 0613 ----- shifted move key +key_snext kNXT str %c KEY_SNEXT 0614 ----- shifted next key +key_soptions kOPT str %d KEY_SOPTIONS 0615 ----- shifted options key +key_sprevious kPRV str %e KEY_SPREVIOUS 0616 ----- shifted previous key +key_sprint kPRT str %f KEY_SPRINT 0617 ----- shifted print key +key_sredo kRDO str %g KEY_SREDO 0620 ----- shifted redo key +key_sreplace kRPL str %h KEY_SREPLACE 0621 ----- shifted replace key +key_sright kRIT str %i KEY_SRIGHT 0622 ----- shifted right-arrow key +key_srsume kRES str %j KEY_SRSUME 0623 ----- shifted resume key +key_ssave kSAV str !1 KEY_SSAVE 0624 ----- shifted save key +key_ssuspend kSPD str !2 KEY_SSUSPEND 0625 ----- shifted suspend key +key_sundo kUND str !3 KEY_SUNDO 0626 ----- shifted undo key +req_for_input rfi str RF - - ----- send next input char (for ptys) +key_f11 kf11 str F1 KEY_F(11) - ----E F11 function key +key_f12 kf12 str F2 KEY_F(12) - ----E F12 function key +key_f13 kf13 str F3 KEY_F(13) - ----E F13 function key +key_f14 kf14 str F4 KEY_F(14) - ----E F14 function key +key_f15 kf15 str F5 KEY_F(15) - ----E F15 function key +key_f16 kf16 str F6 KEY_F(16) - ----E F16 function key +key_f17 kf17 str F7 KEY_F(17) - ----E F17 function key +key_f18 kf18 str F8 KEY_F(18) - ----E F18 function key +key_f19 kf19 str F9 KEY_F(19) - ----E F19 function key +key_f20 kf20 str FA KEY_F(20) - ----E F20 function key +key_f21 kf21 str FB KEY_F(21) - ----E F21 function key +key_f22 kf22 str FC KEY_F(22) - ----E F22 function key +key_f23 kf23 str FD KEY_F(23) - ----E F23 function key +key_f24 kf24 str FE KEY_F(24) - ----E F24 function key +key_f25 kf25 str FF KEY_F(25) - ----E F25 function key +key_f26 kf26 str FG KEY_F(26) - ----E F26 function key +key_f27 kf27 str FH KEY_F(27) - ----E F27 function key +key_f28 kf28 str FI KEY_F(28) - ----E F28 function key +key_f29 kf29 str FJ KEY_F(29) - ----E F29 function key +key_f30 kf30 str FK KEY_F(30) - ----E F30 function key +key_f31 kf31 str FL KEY_F(31) - ----E F31 function key +key_f32 kf32 str FM KEY_F(32) - ----E F32 function key +key_f33 kf33 str FN KEY_F(33) - ----E F33 function key +key_f34 kf34 str FO KEY_F(34) - ----E F34 function key +key_f35 kf35 str FP KEY_F(35) - ----E F35 function key +key_f36 kf36 str FQ KEY_F(36) - ----E F36 function key +key_f37 kf37 str FR KEY_F(37) - ----E F37 function key +key_f38 kf38 str FS KEY_F(38) - ----E F38 function key +key_f39 kf39 str FT KEY_F(39) - ----E F39 function key +key_f40 kf40 str FU KEY_F(40) - ----E F40 function key +key_f41 kf41 str FV KEY_F(41) - ----E F41 function key +key_f42 kf42 str FW KEY_F(42) - ----E F42 function key +#%.TE +#%.TS +#%center; +#%Lbw(24n)2 Lbw(7n)2 Lb2 Lx. +key_f43 kf43 str FX KEY_F(43) - ----E F43 function key +key_f44 kf44 str FY KEY_F(44) - ----E F44 function key +key_f45 kf45 str FZ KEY_F(45) - ----E F45 function key +key_f46 kf46 str Fa KEY_F(46) - ----E F46 function key +key_f47 kf47 str Fb KEY_F(47) - ----E F47 function key +key_f48 kf48 str Fc KEY_F(48) - ----E F48 function key +key_f49 kf49 str Fd KEY_F(49) - ----E F49 function key +key_f50 kf50 str Fe KEY_F(50) - ----E F50 function key +key_f51 kf51 str Ff KEY_F(51) - ----E F51 function key +key_f52 kf52 str Fg KEY_F(52) - ----E F52 function key +key_f53 kf53 str Fh KEY_F(53) - ----E F53 function key +key_f54 kf54 str Fi KEY_F(54) - ----E F54 function key +key_f55 kf55 str Fj KEY_F(55) - ----E F55 function key +key_f56 kf56 str Fk KEY_F(56) - ----E F56 function key +key_f57 kf57 str Fl KEY_F(57) - ----E F57 function key +key_f58 kf58 str Fm KEY_F(58) - ----E F58 function key +key_f59 kf59 str Fn KEY_F(59) - ----E F59 function key +key_f60 kf60 str Fo KEY_F(60) - ----E F60 function key +key_f61 kf61 str Fp KEY_F(61) - ----E F61 function key +key_f62 kf62 str Fq KEY_F(62) - ----E F62 function key +key_f63 kf63 str Fr KEY_F(63) - ----E F63 function key +clr_bol el1 str cb - - ----- Clear to beginning of line +clear_margins mgc str MC - - ----- clear right and left soft margins +set_left_margin smgl str ML - - ----- set left soft margin at current column (not in BSD \fItermcap\fP) +set_right_margin smgr str MR - - ----- set right soft margin at current column +device_type devt str dv - - ----- Indicate language/codeset support +code_set_init csin str ci - - ----- Init sequence for multiple codesets +set0_des_seq s0ds str s0 - - ----- Shift to codeset 0 (EUC set 0, ASCII) +set1_des_seq s1ds str s1 - - ----- Shift to codeset 1 +set2_des_seq s2ds str s2 - - ----- Shift to codeset 2 +set3_des_seq s3ds str s3 - - ----- Shift to codeset 3 +key_mouse kmous str Km KEY_MOUSE 0631 ----- Mouse event has occurred +mouse_info minfo str Mi - - ----- Mouse status information +req_mouse_pos reqmp str RQ - - ----- Request mouse position +get_mouse getm str Gm - - ----- Curses should get button events, parameter #1 not documented. +release_mouse relm str Rm - - ----- Curses should release the mouse */ +color_names colornm str Yw - - ----- Give name for color #1 +initialize_color initc str Ic - - ----- initialize color #1 to (#2,#3,#4) +initialize_pair initp str Ip - - ----- Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7) +orig_colors oc str oc - - ----- Set all color pairs to the original ones +orig_pair op str op - - ----- Set default pair to its original value +set_a_background setab str AB - - ----- Set background color to #1, using ANSI escape +set_a_foreground setaf str AF - - ----- Set foreground color to #1, using ANSI escape +set_background setb str Sb - - ----- Set background color #1 +set_color_pair scp str sp - - ----- Set current color pair to #1 +set_foreground setf str Sf - - ----- Set foreground color #1 +#%.TE +#% +# The magic token below tells the tic compiler-generator code that all the caps +# past it should be ignored (not written out) when dumping terminfo objects. It +# also tells the man page table generator not to pass through following lines +# This means we can have obsolete capabilities and pseudo-capabilities that are +# recognized for termcap or terminfo compilation, but not output. +# +# %%-STOP-HERE-%% +# +# Don't move this casually! In fact, don't move it at all unless you're +# either doing it to add System V or XPG4 extensions, or have decided you +# don't care about SVr4 binary compatibility. +# +############################################################################# +# +# TERMCAP EXTENSION CAPABILITIES +# +# The capabilities below are either obsolete or extensions on certain systems. +# They are not used by SVR4 terminfo. Some are used by captoinfo to translate +# termcap sources; the rest are listed for completeness, and in case somebody +# cares about them enough to hack in code that will translate them into +# terminfo capabilities. +# +# The first part of the list is from Ross Ridge's `mytinfo' package +# (comp.sources.unix, volume 26); the variable names and terminfo names (as +# well as the termcap codes) match his list. +# +# This group of codes is not marked obsolete in 4.4BSD, but have no direct +# terminfo equivalents. The rs capability is specially translated to terminfo +# r2, and vice versa, if an entry does not already have an r2. Similarly, +# i2 is translated to r3 if there is no r3 (because SV terminfo maps is to i2). +# The ug capability is thrown away, but assumed to be whatever sg is if the +# latter is nonzero and we're dumping in termcap format. +# +termcap_init2 OTi2 str i2 - - YB--- secondary initialization string +termcap_reset OTrs str rs - - YB-G- terminal reset string +magic_cookie_glitch_ul OTug num ug - - YBCGE number of blanks left by ul +# +# Obsolete termcap capabilities. Some are used for termcap translation. The +# code uses the 'OT' prefix we put on obsolete capabilities to suppress +# printing them in terminfo source dumps of compiled entries. +# +backspaces_with_bs OTbs bool bs - - YBCGE uses ^H to move left +crt_no_scrolling OTns bool ns - - YBCG- crt cannot scroll +no_correctly_working_cr OTnc bool nc - - YBCG- no way to go to start of line +carriage_return_delay OTdC num dC - - YB-G- pad needed for CR +new_line_delay OTdN num dN - - YB-G- pad needed for LF +linefeed_if_not_lf OTnl str nl - - YBCGE use to move down +backspace_if_not_bs OTbc str bc - - YBCGE move left, if not ^H +# +# GNU termcap library extensions. The GNU termcap file distributed with +# Emacs no longer uses these, but MT showed up in pre-9.0 versions of the +# BSD termcap file. The name clash with terminfo MT is resolved by type +# info; MT is converted to km. +# +gnu_has_meta_key OTMT bool MT - - ----E has meta key +# gnu_tab_width OTtw num tw - - ----E tab width in spaces +# +# GNU termcap *does* include the following extended capability, Only the +# now-obsolete Ann Arbor terminals used it. +# +# gnu_change_scroll_region OTcS str cS - - ---GE alternate set scrolling region +# +# The following comments describe capnames so ancient that I believe no +# software uses them any longer. Some of these have to go because they +# clash with terminfo names in ways that cannot be resolved by type +# information. +# +# These mytinfo codes are not used in the 4.4BSD curses code. They are +# marked obsolete in the 4.4BSD manual pages. +# +# There is one conflict with terminfo; ma is in both. This conflict is +# resolved by type information. +# +# The `ko' capability is translated by special code. It should contain a +# comma-separated list of capabilities for which there are corresponding keys. +# The `kn' code is accepted but ignored. +# +# The `ma' capability was a 4.0BSD feature used by vi version 2. +# It consists of pairs of characters corresponding to kl, kr, ku, kd, and kh. +# Besides being obsolete, that interpretation conflicts with max_attributes. +# +# Here is a description of memory_lock_above and memory_unlock: +# "You can 'freeze' data on the screen by turning on Memory Lock in a line of +# text. All lines above the cursor's current line become locked in place on +# the screen. Then enter data normally. When the screen fills up, any +# further data entered forces the first line of unfrozen line text to scroll +# under the frozen data. Lines scrolled off the screen are inserted into +# memory immediately preceding the first frozen line." (from the HP 700/96 +# User's manual). VT100/ANSI memory lock set is \E[>2h, reset is \E[>2l. +# +# Applications that use terminfo are supposed to behave as though xr is +# always true. +# +linefeed_is_newline OTNL bool NL - - YB--- move down with \n +# even_parity OTEP bool EP - - -B--- terminal requires even parity +# odd_parity OTOP bool OP - - -B--- terminal requires odd parity +# half_duplex OTHD bool HD - - -B--- terminal is half-duplex +# lower_case_only OTLC bool LC - - -B--- terminal has only lower case +# upper_case_only OTUC bool UC - - -B--- terminal has only upper case +backspace_delay OTdB num dB - - YB-G- padding required for ^H +# form_feed_delay OTdF num dF - - -B-G- padding required for ^L +horizontal_tab_delay OTdT num dT - - YB-G- padding required for ^I +# vertical_tab_delay OTdV num dV - - -B--- padding required for ^V +number_of_function_keys OTkn num kn - - -B-G- count of function keys +other_non_function_keys OTko str ko - - -B-G- list of self-mapped keycaps +arrow_key_map OTma str ma - - YBC-- map motion-keys for vi version 2 +# memory_lock_above OTml str ml - - -B--- lock visible screen memory above the current line +# memory_unlock OTmu str mu - - -B--- unlock visible screen memory above the current line +has_hardware_tabs OTpt bool pt - - YB--- has 8-char tabs invoked with ^I +return_does_clr_eol OTxr bool xr - - YB--- return clears the line +# tek_4025_insert_line OTxx bool xx - - -BC-- Tektronix 4025 insert-line glitch +# +# mytinfo described this as a termcap capability, but it is not listed in the +# 4.4BSD man pages, and not found in the 4.4BSD termcap file. The ncurses +# package, like System V, behaves as though it is always true. +# +# rind_only_at_top OTxq bool xq - - ----- reverse index only works from top line +# +# University of Waterloo termcap extensions (as described in mytinfo). +# The `xl' termcap file clashes with a terminfo name; this ambiguity cannot +# be resolved by a type check. The descriptions are guesses from what was +# in the mytinfo tables. +# +# key_interrupt_char OTki str ki - - ----- string set by interrupt key (?) +# key_kill_char OTkk str kk - - ----- string set by kill key (?) +# key_suspend_char OTkz str kz - - ----- string set by suspend key (?) +# initialization_messy OTxc bool xc - - ----- initialization leaves garbage on the screen (?) +# ind_at_bottom_does_cr OTxl bool xl - - ----- index does a carriage return +# +# Nonstandard capabilities unique to Ross Ridge's `mytinfo' package. +# SR clashes with a terminfo name; this ambiguity cannot be resolved by a type +# check. +# +# scroll_left OTsl1 str Sl - - ----- scroll screen leftward +# scroll_right OTsr1 str Sr - - ----- scroll screen rightward +# parm_scroll_left OTsl str SL - - ----- scroll screen leftward #1 characters +# parm_scroll_right OTsr str SR - - ----- scroll screen rightward #1 characters +# +# The mytinfo capabilities end here. +# +# XENIX extensions: +# +# Xenix defined its own set of forms-drawing capabilities: +# +# cap IBM ASCII description ACS ASCII +# --- ----------- -------------------- ------------- ------ +# G1 191 \277 M-? single upper right ACS_URCORNER +# G2 218 \332 M-Z single upper left ACS_ULCORNER +# G3 192 \300 M-@ single lower left ACS_LLCORNER +# G4 217 \331 M-Y single lower right ACS_LRCORNER +# G5 187 \273 M-; double upper right +# G6 201 \311 M-I double upper left +# G7 200 \310 M-H double lower left +# G8 188 \274 M-< double lower right +# GC 197 \305 M-E single intersection ACS_PLUS _ _ +# GD 194 \302 M-B single down-tick ACS_TTEE | +# GH 196 \304 M-D single horizontal line ACS_HLINE +# GL 180 \264 M-4 single left tick ACS_RTEE -| +# GR 195 \303 M-C single right tick ACS_LTEE |- +# GU 193 \301 M-A single up tick ACS_BTEE _|_ +# GV 179 \263 M-3 single vertical line ACS_VLINE +# Gc 206 \316 M-N double intersection +# Gd 203 \313 M-K double down tick +# Gh 205 \315 M-M double horizontal line +# Gl 204 \204 M-L double left tick +# Gr 185 \271 M-9 double right tick +# Gu 202 \312 M-J double up tick +# Gv 186 \272 M-: double vertical line +# +# The compiler will translate the single-line caps and discard the others +# (via IGNORE aliases further down). We don't want to do normal pad +# translation on these, they're often single-character printable ASCII +# strings that happen to be numerics. There's awk code in parametrized.sh +# that detects the acs_ prefix and uses it to suppress pad translation. +# These terminfo names are invented. +# +acs_ulcorner OTG2 str G2 - - ----- single upper left +acs_llcorner OTG3 str G3 - - ----- single lower left +acs_urcorner OTG1 str G1 - - ----- single upper right +acs_lrcorner OTG4 str G4 - - ----- single lower right +acs_ltee OTGR str GR - - ----- tee pointing right +acs_rtee OTGL str GL - - ----- tee pointing left +acs_btee OTGU str GU - - ----- tee pointing up +acs_ttee OTGD str GD - - ----- tee pointing down +acs_hline OTGH str GH - - ----- single horizontal line +acs_vline OTGV str GV - - ----- single vertical line +acs_plus OTGC str GC - - ----- single intersection +# +############################################################################# +# +# TERMINFO EXTENSION CAPABILITIES +# +# (see Caps-ncurses for the complete set of comments) +# +memory_lock meml str ml - - ----K lock memory above cursor +memory_unlock memu str mu - - ----K unlock memory +box_chars_1 box1 str bx - - ----K box characters primary set +# +############################################################################# diff --git a/contrib/ncurses/include/MKhashsize.sh b/contrib/ncurses/include/MKhashsize.sh new file mode 100755 index 00000000..8a534d49 --- /dev/null +++ b/contrib/ncurses/include/MKhashsize.sh @@ -0,0 +1,43 @@ +#!/bin/sh +############################################################################## +# Copyright 2019,2020 Thomas E. Dickey # +# Copyright 1998,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKhashsize.sh,v 1.9 2020/02/02 23:34:34 tom Exp $ +# +# MKhashsize.sh --- generate size include for hash functions +# +echo "/*" +echo " * hashsize.h -- hash and token table constants" +echo " */" + +test $# = 0 && set Caps +TABSIZE=`cat "$@" | grep -v '^[ #]' | grep -v "^$" | grep -v "^capalias"| grep -v "^infoalias" | grep -v "^userdef" | grep -v "^used_by" | wc -l` + +echo "" +echo "#define CAPTABSIZE ${TABSIZE}" +echo "#define HASHTABSIZE (${TABSIZE} * 2)" diff --git a/contrib/ncurses/include/MKkey_defs.sh b/contrib/ncurses/include/MKkey_defs.sh new file mode 100755 index 00000000..e58ee2b6 --- /dev/null +++ b/contrib/ncurses/include/MKkey_defs.sh @@ -0,0 +1,197 @@ +#! /bin/sh +# $Id: MKkey_defs.sh,v 1.24 2024/01/19 12:26:17 tom Exp $ +############################################################################## +# Copyright 2019-2022,2024 Thomas E. Dickey # +# Copyright 2001-2013,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# MKkey_defs.sh -- generate function-key definitions for curses.h +# +# Author: Thomas E. Dickey 2001 +# +# Extract function-key definitions from the Caps file +# +: "${AWK-awk}" + +test $# = 0 && set Caps + +data=data$$ +pass1=pass1_$$ +pass2=pass2_$$ +pass3=pass3_$$ +pass4=pass4_$$ +trap 'rm -f $data pass[1234]_$$; exit 1' 1 2 3 15 +trap 'rm -f $data pass[1234]_$$' 0 + +# change repeated tabs (used for readability) to single tabs (needed to make +# awk see the right field alignment of the corresponding columns): +if sort -k 6 "$@" >$data 2>/dev/null +then + # POSIX + sed -e 's/[ ][ ]*/ /g' "$@" |sort -n -k 6 >$data +elif sort -n +5 "$@" >$data 2>/dev/null +then + # SunOS (and SVr4, marked as obsolete but still recognized) + sed -e 's/[ ][ ]*/ /g' "$@" |sort -n +5 >$data +else + echo "Your sort utility is broken. Please install one that works." >&2 + exit 1 +fi + +# add keys that we generate automatically: +cat >>$data <$output <$data ' +function print_cols(text,cols) { + printf "%s", text + len = length(text); + while (len < cols) { + printf " " + len += 8; + } +} +function decode(keycode) { + result = 0; + if (substr(keycode, 1, 2) == "0x") { + digits="0123456789abcdef"; + } else if (substr(keycode, 1, 1) == "0") { + digits="01234567"; + } else { + digits="0123456789"; + } + while (length(keycode) != 0) { + digit=substr(keycode, 1, 1); + keycode=substr(keycode, 2); + result = result * length(digits) + index(digits, digit) - 1; + } + return result; +} + +BEGIN { + maxkey='$maxkey'; + pass='$pass'; + key_max=1; + bits=1; + while (key_max < maxkey) { + bits = bits + 1; + key_max = (key_max * 2) + 1; + } + octal_fmt = sprintf ("%%0%do", (bits + 2) / 3 + 1); +} + +/^$/ {next;} +/^#/ {next;} +/^capalias/ {next;} +/^infoalias/ {next;} +/^used_by/ {next;} +/^userdef/ {next;} + +$5 != "-" && $6 != "-" { + if ($6 == "+") { + if (pass == 1 || pass == 2) + next; + thiskey=maxkey + 1; + } else { + if (pass == 3) + next; + thiskey=decode($6); + } + if (thiskey > maxkey) + maxkey = thiskey; + if (pass == 2 || pass == 3) { + showkey=sprintf(octal_fmt, thiskey); + ifdef = 0; + if (index($7,"NCURSES_") == 1) { + ifdef = 1; + printf "\n"; + printf "#if %s\n", $7; + } + if ($5 == "KEY_F(0)" ) { + printf "#define " + print_cols("KEY_F0", 16); + print_cols(showkey, 16); + print "/* Function keys. Space for 64 */"; + printf "#define " + print_cols("KEY_F(n)", 16); + print_cols("(KEY_F0+(n))", 16); + print "/* Value of function key n */" + } else { + printf "#define " + print_cols($5, 16); + print_cols(showkey, 16); + printf "/*" + for (i = 8; i <= NF; i++) + printf " %s", $i + print " */" + } + if (ifdef != 0) { + printf "#endif\n"; + } + } + } +END { + if (pass == 1) { + print maxkey; + } else if (pass == 4) { + print ""; + printf "#define "; + print_cols("KEY_MAX", 16); + result = sprintf (octal_fmt, key_max); + print_cols(result, 16); + printf "/* Maximum key value is "; + printf octal_fmt, maxkey; + print " */"; + } + } +' +if test $pass = 1 ; then + maxkey=`cat $pass1` +fi + +done + +cat $pass2 +cat $pass3 +cat $pass4 diff --git a/contrib/ncurses/include/MKncurses_def.sh b/contrib/ncurses/include/MKncurses_def.sh new file mode 100755 index 00000000..22d80c23 --- /dev/null +++ b/contrib/ncurses/include/MKncurses_def.sh @@ -0,0 +1,81 @@ +#! /bin/sh +# $Id: MKncurses_def.sh,v 1.5 2022/07/16 17:03:59 tom Exp $ +############################################################################## +# Copyright 2020,2022 Thomas E. Dickey # +# Copyright 2000,2003 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# MKncurses_def.sh -- generate fallback definitions for ncurses_cfg.h +# +# Author: Thomas E. Dickey 2000 +# +# Given the choice between constructs such as +# +# #if defined(foo) && foo +# #if foo +# +# we chose the latter. It is guaranteed by the language standard, and there +# appear to be no broken compilers that do not honor that detail. But some +# people want to use gcc's -Wundef option (corresponding to one of the less +# useful features in Watcom's compiler) to check for misspellings. So we +# generate a set of fallback definitions to quiet the warnings without making +# the code ugly. +# +DEFS="${1-ncurses_defs}" +cat < 1992,1995 */" + print "/* and: Eric S. Raymond */" + print "/* and: Thomas E. Dickey 1995-on */" + print "/****************************************************************************/" + print "" + print "/* $Id: MKterm.h.awk.in,v 1.85 2023/04/23 19:15:36 tom Exp $ */" + print "" + print "/*" + print "** term.h -- Definition of struct term" + print "*/" + print "" + print "#ifndef NCURSES_TERM_H_incl" + print "#define NCURSES_TERM_H_incl 1" + print "" + print "#undef NCURSES_VERSION" + print "#define NCURSES_VERSION \"@NCURSES_MAJOR@.@NCURSES_MINOR@\"" + print "" + print "#include " + print "" + print "#ifdef __cplusplus" + printf "extern \"C\" %s\n", lcurl; + print "#endif" + print "" + print "/* Make this file self-contained by providing defaults for the HAVE_TERMIO[S]_H" + print " * definition (based on the system for which this was configured)." + print " */" + print "" + print "#ifndef __NCURSES_H" + print "" + print "typedef struct screen SCREEN;" + print "" + print "#if @NCURSES_SP_FUNCS@" + print "#undef NCURSES_SP_FUNCS" + print "#define NCURSES_SP_FUNCS @NCURSES_PATCH@" + print "#undef NCURSES_SP_NAME" + print "#define NCURSES_SP_NAME(name) name##_sp" + print "" + print "/* Define the sp-funcs helper function */" + print "#undef NCURSES_SP_OUTC" + print "#define NCURSES_SP_OUTC NCURSES_SP_NAME(NCURSES_OUTC)" + print "typedef int (*NCURSES_SP_OUTC)(SCREEN*, int);" + print "#endif" + print "" + print "#endif /* __NCURSES_H */" + print "" + print "#undef NCURSES_CONST" + print "#define NCURSES_CONST @NCURSES_CONST@" + print "" + print "#undef NCURSES_SBOOL" + print "#define NCURSES_SBOOL @NCURSES_SBOOL@" + print "" + print "#undef NCURSES_USE_DATABASE" + print "#define NCURSES_USE_DATABASE @NCURSES_USE_DATABASE@" + print "" + print "#undef NCURSES_USE_TERMCAP" + print "#define NCURSES_USE_TERMCAP @NCURSES_USE_TERMCAP@" + print "" + print "#undef NCURSES_XNAMES" + print "#define NCURSES_XNAMES @NCURSES_XNAMES@" + print "" + print "/* We will use these symbols to hide differences between" + print " * termios/termio/sgttyb interfaces." + print " */" + print "#undef TTY" + print "#undef SET_TTY" + print "#undef GET_TTY" + print "" + print "/* Assume POSIX termio if we have the header and function */" + print "/* #if HAVE_TERMIOS_H && HAVE_TCGETATTR */" + print "#if @HAVE_TERMIOS_H@ && @HAVE_TCGETATTR@" + print "" + print "#undef TERMIOS" + print "#define TERMIOS 1" + print "" + print "#include " + print "#define TTY struct termios" + print "" + print "#else /* !HAVE_TERMIOS_H */" + print "" + print "/* #if HAVE_TERMIO_H */" + print "#if @HAVE_TERMIO_H@" + print "" + print "#undef TERMIOS" + print "#define TERMIOS 1" + print "" + print "#include " + print "#define TTY struct termio" + print "" + print "#else /* !HAVE_TERMIO_H */" + print "" + print "#if (defined(_WIN32) || defined(_WIN64))" + print "#if @EXP_WIN32_DRIVER@" + print "#include " + print "#define TTY struct winconmode" + print "#else" + print "#include " + print "#define TTY struct termios" + print "#endif" + print "#else" + print "#undef TERMIOS" + print "#include " + print "#include " + print "#define TTY struct sgttyb" + print "#endif /* MINGW32 */" + print "#endif /* HAVE_TERMIO_H */" + print "" + print "#endif /* HAVE_TERMIOS_H */" + print "" + print "#ifdef TERMIOS" + print "#define GET_TTY(fd, buf) tcgetattr(fd, buf)" + print "#define SET_TTY(fd, buf) tcsetattr(fd, TCSADRAIN, buf)" + print "#elif @EXP_WIN32_DRIVER@ && (defined(_WIN32) || defined(_WIN64))" + print "#define GET_TTY(fd, buf) _nc_console_getmode(_nc_console_fd2handle(fd),buf)" + print "#define SET_TTY(fd, buf) _nc_console_setmode(_nc_console_fd2handle(fd),buf)" + print "#else" + print "#define GET_TTY(fd, buf) gtty(fd, buf)" + print "#define SET_TTY(fd, buf) stty(fd, buf)" + print "#endif" + print "" + print "#ifndef GCC_NORETURN" + print "#define GCC_NORETURN /* nothing */" + print "#endif" + print "" + print "#define NAMESIZE 256" + print "" + print "/* The cast works because TERMTYPE is the first data in TERMINAL */" + print "#define CUR ((TERMTYPE *)(cur_term))->" + print "" +} + +$2 == "%%-STOP-HERE-%%" { + print "" + printf "#define BOOLWRITE %d\n", BoolCount + printf "#define NUMWRITE %d\n", NumberCount + printf "#define STRWRITE %d\n", StringCount + print "" + print "/* older synonyms for some capabilities */" + print "#define beehive_glitch no_esc_ctlc" + print "#define teleray_glitch dest_tabs_magic_smso" + print "" + print "/* HPUX-11 uses this name rather than the standard one */" + print "#ifndef micro_char_size" + print "#define micro_char_size micro_col_size" + print "#endif" + print "" + print "#ifdef __INTERNAL_CAPS_VISIBLE" +} + +/^#/ { next; } + +/^used_by/ { next ; } +/^userdef/ { next ; } + +$1 == "acs_chars" { + acsindex = StringCount; +} + +$3 == "bool" { + printf "#define %-30s CUR Booleans[%d]\n", $1, BoolCount++ +} + +$3 == "num" { + printf "#define %-30s CUR Numbers[%d]\n", $1, NumberCount++ +} + +$3 == "str" { + printf "#define %-30s CUR Strings[%d]\n", $1, StringCount++ +} + +END { + print "#endif /* __INTERNAL_CAPS_VISIBLE */" + print "" + print "" + print "/*" + print " * Predefined terminfo array sizes" + print " */" + printf "#define BOOLCOUNT %d\n", BoolCount + printf "#define NUMCOUNT %d\n", NumberCount + printf "#define STRCOUNT %d\n", StringCount + print "" + print "/* used by code for comparing entries */" + print "#define acs_chars_index ", acsindex + print "" + declare_termtype("short",""); + print "" + print "/*" + print " * The only reason these structures are visible is for read-only use." + print " * Programs which modify the data are not, never were, portable across" + print " * curses implementations." + print " *" + print " * The first field in TERMINAL is used in macros." + print " * The remaining fields are private." + print " */" + print "#ifdef NCURSES_INTERNALS" + print "" + print "#undef TERMINAL" + print "#define TERMINAL struct term" + print "TERMINAL;" + print "" + if (@NCURSES_EXT_COLORS@) { + declare_termtype("int","2"); + } else { + print "#undef TERMTYPE2" + print "#define TERMTYPE2 TERMTYPE" + } + print "#else" + print "" + print "typedef struct term { /* describe an actual terminal */" + print " TERMTYPE type; /* terminal type description */" + print "} TERMINAL;" + print "" + print "#endif /* NCURSES_INTERNALS */" + print "" + print "" + print "#if @BROKEN_LINKER@ && !@cf_cv_enable_reentrant@" + print "extern NCURSES_EXPORT_VAR(TERMINAL *) cur_term;" + print "#elif @cf_cv_enable_reentrant@" + print "NCURSES_WRAPPED_VAR(TERMINAL *, cur_term);" + print "#define cur_term NCURSES_PUBLIC_VAR(cur_term())" + print "#else" + print "extern NCURSES_EXPORT_VAR(TERMINAL *) cur_term;" + print "#endif" + print "" + print "#if @BROKEN_LINKER@ || @cf_cv_enable_reentrant@" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, boolnames);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, boolcodes);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, boolfnames);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, numnames);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, numcodes);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, numfnames);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, strnames);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, strcodes);" + print "NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, strfnames);" + print "" + print "#define boolnames NCURSES_PUBLIC_VAR(boolnames())" + print "#define boolcodes NCURSES_PUBLIC_VAR(boolcodes())" + print "#define boolfnames NCURSES_PUBLIC_VAR(boolfnames())" + print "#define numnames NCURSES_PUBLIC_VAR(numnames())" + print "#define numcodes NCURSES_PUBLIC_VAR(numcodes())" + print "#define numfnames NCURSES_PUBLIC_VAR(numfnames())" + print "#define strnames NCURSES_PUBLIC_VAR(strnames())" + print "#define strcodes NCURSES_PUBLIC_VAR(strcodes())" + print "#define strfnames NCURSES_PUBLIC_VAR(strfnames())" + print "" + print "#else" + print "" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolnames[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolcodes[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolfnames[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numnames[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numcodes[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numfnames[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strnames[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strcodes[];" + print "extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strfnames[];" + print "" + print "#endif" + print "" + print "/*" + print " * These entrypoints are used only by the ncurses utilities such as tic." + print " */" + print "#ifdef NCURSES_INTERNALS" + print "" + print "extern NCURSES_EXPORT(int) _nc_set_tty_mode (TTY *buf);" + print "extern NCURSES_EXPORT(int) _nc_read_entry2 (const char * const, char * const, TERMTYPE2 *const);" + print "extern NCURSES_EXPORT(int) _nc_read_file_entry (const char *const, TERMTYPE2 *);" + print "extern NCURSES_EXPORT(int) _nc_read_termtype (TERMTYPE2 *, char *, int);" + print "extern NCURSES_EXPORT(char *) _nc_first_name (const char *const);" + print "extern NCURSES_EXPORT(int) _nc_name_match (const char *const, const char *const, const char *const);" + print "extern NCURSES_EXPORT(char *) _nc_tiparm(int, const char *, ...);" + print "extern NCURSES_EXPORT(const TERMTYPE *) _nc_fallback (const char *);" + print "extern NCURSES_EXPORT(int) _nc_read_entry (const char * const, char * const, TERMTYPE *const);" + print "" + print "#endif /* NCURSES_INTERNALS */" + print "" + print "/*" + print " * Normal entry points" + print " */" + print "extern NCURSES_EXPORT(TERMINAL *) set_curterm (TERMINAL *);" + print "extern NCURSES_EXPORT(int) del_curterm (TERMINAL *);" + print "" + print "/* miscellaneous entry points */" + print "extern NCURSES_EXPORT(int) restartterm (NCURSES_CONST char *, int, int *);" + print "extern NCURSES_EXPORT(int) setupterm (const char *,int,int *);" + print "" + print "/* terminfo entry points, also declared in curses.h */" + print "#if !defined(__NCURSES_H)" + print "extern NCURSES_EXPORT(char *) tigetstr (const char *);" + print "extern NCURSES_EXPORT_VAR(char) ttytype[];" + print "extern NCURSES_EXPORT(int) putp (const char *);" + print "extern NCURSES_EXPORT(int) tigetflag (const char *);" + print "extern NCURSES_EXPORT(int) tigetnum (const char *);" + print "" + print "#if @NCURSES_TPARM_VARARGS@ /* NCURSES_TPARM_VARARGS */" + print "extern NCURSES_EXPORT(char *) tparm (const char *, ...); /* special */" + print "#else" + print "extern NCURSES_EXPORT(char *) tparm (const char *, long,long,long,long,long,long,long,long,long); /* special */" + print "#endif" + print "" + print "extern NCURSES_EXPORT(char *) tiparm (const char *, ...); /* special */" + print "extern NCURSES_EXPORT(char *) tiparm_s (int, int, const char *, ...); /* special */" + print "extern NCURSES_EXPORT(int) tiscan_s (int *, int *, const char *); /* special */" + print "" + print "#endif /* __NCURSES_H */" + print "" + print "/* termcap database emulation (XPG4 uses const only for 2nd param of tgetent) */" + print "#if !defined(NCURSES_TERMCAP_H_incl)" + print "extern NCURSES_EXPORT(char *) tgetstr (const char *, char **);" + print "extern NCURSES_EXPORT(char *) tgoto (const char *, int, int);" + print "extern NCURSES_EXPORT(int) tgetent (char *, const char *);" + print "extern NCURSES_EXPORT(int) tgetflag (const char *);" + print "extern NCURSES_EXPORT(int) tgetnum (const char *);" + print "extern NCURSES_EXPORT(int) tputs (const char *, int, int (*)(int));" + print "#endif /* NCURSES_TERMCAP_H_incl */" + print "" + print "/*" + print " * Include curses.h before term.h to enable these extensions." + print " */" + print "#if defined(NCURSES_SP_FUNCS) && (NCURSES_SP_FUNCS != 0)" + print "" + print "extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(tigetstr) (SCREEN*, const char *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(putp) (SCREEN*, const char *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(tigetflag) (SCREEN*, const char *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(tigetnum) (SCREEN*, const char *);" + print "" + print "#if @NCURSES_TPARM_VARARGS@ /* NCURSES_TPARM_VARARGS */" + print "extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(tparm) (SCREEN*, const char *, ...); /* special */" + print "#else" + print "extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(tparm) (SCREEN*, const char *, long,long,long,long,long,long,long,long,long); /* special */" + print "#endif" + print "" + print "/* termcap database emulation (XPG4 uses const only for 2nd param of tgetent) */" + print "extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(tgetstr) (SCREEN*, const char *, char **);" + print "extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(tgoto) (SCREEN*, const char *, int, int);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(tgetent) (SCREEN*, char *, const char *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(tgetflag) (SCREEN*, const char *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(tgetnum) (SCREEN*, const char *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(tputs) (SCREEN*, const char *, int, NCURSES_SP_OUTC);" + print "" + print "extern NCURSES_EXPORT(TERMINAL *) NCURSES_SP_NAME(set_curterm) (SCREEN*, TERMINAL *);" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(del_curterm) (SCREEN*, TERMINAL *);" + print "" + print "extern NCURSES_EXPORT(int) NCURSES_SP_NAME(restartterm) (SCREEN*, NCURSES_CONST char *, int, int *);" + print "#endif /* NCURSES_SP_FUNCS */" + print "" + print "/*" + print " * Debugging features." + print " */" + print "extern GCC_NORETURN NCURSES_EXPORT(void) exit_terminfo(int);" + print "" + print "#ifdef __cplusplus" + printf "%s\n", rcurl; + print "#endif" + print "" + print "#endif /* NCURSES_TERM_H_incl */" +} diff --git a/contrib/ncurses/include/Makefile.in b/contrib/ncurses/include/Makefile.in new file mode 100644 index 00000000..4a46cd22 --- /dev/null +++ b/contrib/ncurses/include/Makefile.in @@ -0,0 +1,177 @@ +# $Id: Makefile.in,v 1.54 2024/08/10 18:19:10 tom Exp $ +############################################################################## +# Copyright 2019-2021,2024 Thomas E. Dickey # +# Copyright 1998-2013,2015 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for ncurses source code. +# +# This makes/installs ncurses include-files +# +# The variable 'srcdir' refers to the source-distribution, and can be set with +# the configure script by "--srcdir=DIR". + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +DESTDIR = @DESTDIR@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +includedir = @includedir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +AWK = @AWK@ +LN_S = @LN_S@ + +CC = @CC@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ +CPPFLAGS = -DHAVE_CONFIG_H -I. @CPPFLAGS@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +VERSION = @cf_cv_rel_version@ + +# The "Caps" file specifies the terminfo database format, as well as the list +# of function keys. +TERMINFO_CAPS = $(srcdir)/@TERMINFO_CAPS@ +CAPLIST = $(TERMINFO_CAPS) \ + $(srcdir)/Caps-ncurses + +# These files are generated by the configure script +CONFIG_SRC = \ + MKterm.h.awk \ + curses.head \ + ncurses_dll.h \ + termcap.h \ + unctrl.h + +# These files are generated by this makefile +AUTO_SRC = \ + curses.h \ + hashsize.h \ + ncurses_def.h \ + parametrized.h \ + config.h \ + term.h + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : depend +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs \ +depend \ +sources \ +install :: $(AUTO_SRC) + +curses.h : $(CAPLIST) \ + curses.head \ + $(srcdir)/curses.tail \ + $(srcdir)/MKkey_defs.sh + cat curses.head >$@ + AWK=$(AWK) $(SHELL) $(srcdir)/MKkey_defs.sh $(CAPLIST) >>$@ + $(SHELL) -c 'if test "@NCURSES_WGETCH_EVENTS@" = "1" ; then cat $(srcdir)/curses.events >>$@ ; fi' + $(SHELL) -c 'if test "@NCURSES_CH_T@" = "cchar_t" ; then cat $(srcdir)/curses.wide >>$@ ; fi' + cat $(srcdir)/curses.tail >>$@ + +term.h: $(CAPLIST) \ + MKterm.h.awk + $(AWK) -f MKterm.h.awk $(CAPLIST) > $@ + $(SHELL) $(srcdir)/edit_cfg.sh ../include/ncurses_cfg.h $@ + +hashsize.h: $(CAPLIST) \ + $(srcdir)/MKhashsize.sh + $(SHELL) $(srcdir)/MKhashsize.sh $(CAPLIST) >$@ + +ncurses_def.h: $(srcdir)/ncurses_defs $(srcdir)/MKncurses_def.sh + AWK=$(AWK) $(SHELL) $(srcdir)/MKncurses_def.sh $(srcdir)/ncurses_defs >$@ + +parametrized.h: $(CAPLIST) \ + $(srcdir)/MKparametrized.sh + AWK=$(AWK) $(SHELL) $(srcdir)/MKparametrized.sh $(CAPLIST) >$@ + +# This is required by pthread.h on MinGW +config.h: + touch $@ + +tags: + $(CTAGS) *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + +clean :: mostlyclean + -rm -f $(AUTO_SRC) + -rm -rf *.dSYM + +distclean :: clean + -rm -f Makefile $(CONFIG_SRC) config.h + +realclean :: distclean + +# Verify that each header-file can be compiled without including another. +check: + @$(SHELL) -c "for header in *.h;\ + do \ + echo \"** testing \$${header}\" ; \ + echo \"#include <\$${header}>\" >headers.c; \ + echo \"int main(void) { return 0; }\" >>headers.c; \ + $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ + done" + -@rm -f headers.* + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/include/capdefaults.c b/contrib/ncurses/include/capdefaults.c new file mode 100644 index 00000000..2405b89a --- /dev/null +++ b/contrib/ncurses/include/capdefaults.c @@ -0,0 +1,87 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2000,2008 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* $Id: capdefaults.c,v 1.17 2024/07/27 19:19:23 tom Exp $ */ + + /* + * Compute obsolete capabilities. The reason this is an include file is + * that the two places where it is needed require the macros to generate + * offsets to different structures. See the file Caps for explanations of + * these conversions. + * + * Note: This code is the functional inverse of the first part of + * postprocess_termcap(). + */ +{ + const char *strp; + short capval; + +#define EXTRACT_DELAY(str) \ + (short) (strp = strchr(str, '*'), strp ? atoi(strp+1) : 0) + + /* current (4.4BSD) capabilities marked obsolete */ + if (VALID_STRING(carriage_return) + && (capval = EXTRACT_DELAY(carriage_return))) + carriage_return_delay = capval; + if (VALID_STRING(newline) && (capval = EXTRACT_DELAY(newline))) + new_line_delay = capval; + + /* current (4.4BSD) capabilities not obsolete */ + if (!VALID_STRING(termcap_init2) && VALID_STRING(init_3string)) { + termcap_init2 = init_3string; + init_3string = ABSENT_STRING; + } + if (!VALID_STRING(termcap_reset) + && VALID_STRING(reset_2string) + && !VALID_STRING(reset_1string) + && !VALID_STRING(reset_3string)) { + termcap_reset = reset_2string; + reset_2string = ABSENT_STRING; + } + if (magic_cookie_glitch_ul == ABSENT_NUMERIC + && magic_cookie_glitch != ABSENT_NUMERIC + && VALID_STRING(enter_underline_mode)) + magic_cookie_glitch_ul = magic_cookie_glitch; + + /* totally obsolete capabilities */ + linefeed_is_newline = (char) (VALID_STRING(newline) + && (strcmp("\n", newline) == 0)); + if (VALID_STRING(cursor_left) + && (capval = EXTRACT_DELAY(cursor_left))) + backspace_delay = capval; + if (VALID_STRING(tab) && (capval = EXTRACT_DELAY(tab))) + horizontal_tab_delay = capval; +#undef EXTRACT_DELAY +} diff --git a/contrib/ncurses/include/curses.events b/contrib/ncurses/include/curses.events new file mode 100644 index 00000000..2509b1bf --- /dev/null +++ b/contrib/ncurses/include/curses.events @@ -0,0 +1,55 @@ +/* $Id: curses.events,v 1.4 2024/01/19 09:24:17 tom Exp $ */ +/* + * vile:cmode: + * This file is part of ncurses, designed to be appended after curses.h.in + * (see that file for the relevant copyright). + */ + +/* + * This is an extension to support events... + */ +#ifdef NCURSES_WGETCH_EVENTS +#if !defined(__BEOS__) || defined(__HAIKU__) + /* Fix _nc_timed_wait() on BEOS... */ +# define NCURSES_EVENT_VERSION 1 +#endif /* !defined(__BEOS__) */ + +/* + * Bits to set in _nc_event.data.flags + */ +# define _NC_EVENT_TIMEOUT_MSEC 1 +# define _NC_EVENT_FILE 2 +# define _NC_EVENT_FILE_READABLE 2 +# if 0 /* Not supported yet... */ +# define _NC_EVENT_FILE_WRITABLE 4 +# define _NC_EVENT_FILE_EXCEPTION 8 +# endif + +typedef struct +{ + int type; + union + { + long timeout_msec; /* _NC_EVENT_TIMEOUT_MSEC */ + struct + { + unsigned int flags; + int fd; + unsigned int result; + } fev; /* _NC_EVENT_FILE */ + } data; +} _nc_event; + +typedef struct +{ + int count; + int result_flags; /* _NC_EVENT_TIMEOUT_MSEC or _NC_EVENT_FILE_READABLE */ + _nc_event *events[1]; +} _nc_eventlist; + +extern NCURSES_EXPORT(int) wgetch_events (WINDOW *, _nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */ +extern NCURSES_EXPORT(int) wgetnstr_events (WINDOW *,char *,int,_nc_eventlist *) GCC_DEPRECATED(experimental option); /* experimental */ + +#define KEY_EVENT 0634 /* We were interrupted by an event */ + +#endif /* NCURSES_WGETCH_EVENTS */ diff --git a/contrib/ncurses/include/curses.h.in b/contrib/ncurses/include/curses.h.in new file mode 100644 index 00000000..8cfa0b9f --- /dev/null +++ b/contrib/ncurses/include/curses.h.in @@ -0,0 +1,1535 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* $Id: curses.h.in,v 1.282 2024/01/19 11:50:07 tom Exp $ */ + +#ifndef __NCURSES_H +#define __NCURSES_H + +/* + The symbols beginning NCURSES_ or USE_ are configuration choices. + A few of the former can be overridden by applications at compile-time. + Most of the others correspond to configure-script options (or checks + by the configure-script for features of the system on which it is built). + + These symbols can be overridden by applications at compile-time: + NCURSES_NOMACROS suppresses macro definitions in favor of functions + NCURSES_WATTR_MACROS suppresses wattr_* macro definitions + NCURSES_WIDECHAR is an alternative for declaring wide-character functions. + + These symbols are used only when building ncurses: + NCURSES_ATTR_T + NCURSES_FIELD_INTERNALS + NCURSES_INTERNALS + + These symbols are set by the configure script: + NCURSES_ENABLE_STDBOOL_H + NCURSES_EXPANDED + NCURSES_EXT_COLORS + NCURSES_EXT_FUNCS + NCURSES_EXT_PUTWIN + NCURSES_NO_PADDING + NCURSES_OSPEED_COMPAT + NCURSES_PATHSEP + NCURSES_REENTRANT + NCURSES_SIGWINCH + */ + +#define CURSES 1 +#define CURSES_H 1 + +/* These are defined only in curses.h, and are used for conditional compiles */ +#define NCURSES_VERSION_MAJOR @NCURSES_MAJOR@ +#define NCURSES_VERSION_MINOR @NCURSES_MINOR@ +#define NCURSES_VERSION_PATCH @NCURSES_PATCH@ + +/* This is defined in more than one ncurses header, for identification */ +#undef NCURSES_VERSION +#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@" + +/* + * Identify the mouse encoding version. + */ +#define NCURSES_MOUSE_VERSION @NCURSES_MOUSE_VERSION@ + +/* + * Definitions to facilitate DLL's. + */ +#include + +/* + * Extra headers. + */ +#if @HAVE_STDINT_H@ +#include +#endif + +#ifdef __cplusplus +#else +#if @HAVE_STDNORETURN_H@ +#include +#undef GCC_NORETURN +#define GCC_NORETURN _Noreturn +#endif +#endif + +/* + * User-definable tweak to disable the include of . + */ +#ifndef NCURSES_ENABLE_STDBOOL_H +#define NCURSES_ENABLE_STDBOOL_H @cf_cv_header_stdbool_h@ +#endif + +/* + * NCURSES_ATTR_T is used to quiet compiler warnings when building ncurses + * configured using --disable-macros. + */ +#ifndef NCURSES_ATTR_T +#define NCURSES_ATTR_T int +#endif + +/* + * Expands to 'const' if ncurses is configured using --enable-const. Note that + * doing so makes it incompatible with other implementations of X/Open Curses. + */ +#undef NCURSES_CONST +#define NCURSES_CONST @NCURSES_CONST@ + +#undef NCURSES_INLINE +#define NCURSES_INLINE @NCURSES_INLINE@ + +/* + * The standard type used for color values, and for color-pairs. The latter + * allows the curses library to enumerate the combinations of foreground and + * background colors used by an application, and is normally the product of the + * total foreground and background colors. + * + * X/Open uses "short" for both of these types, ultimately because they are + * numbers from the SVr4 terminal database, which uses 16-bit signed values. + */ +#undef NCURSES_COLOR_T +#define NCURSES_COLOR_T short + +#undef NCURSES_PAIRS_T +#define NCURSES_PAIRS_T short + +/* + * Definitions used to make WINDOW and similar structs opaque. + */ +#ifndef NCURSES_INTERNALS +#define NCURSES_OPAQUE @NCURSES_OPAQUE@ +#define NCURSES_OPAQUE_FORM @NCURSES_OPAQUE_FORM@ +#define NCURSES_OPAQUE_MENU @NCURSES_OPAQUE_MENU@ +#define NCURSES_OPAQUE_PANEL @NCURSES_OPAQUE_PANEL@ +#endif + +/* + * Definition used to optionally suppress wattr* macros to help with the + * transition from ncurses5 to ncurses6 by allowing the header files to + * be shared across development packages for ncursesw in both ABIs. + */ +#ifndef NCURSES_WATTR_MACROS +#define NCURSES_WATTR_MACROS @NCURSES_WATTR_MACROS@ +#endif + +/* + * The reentrant code relies on the opaque setting, but adds features. + */ +#ifndef NCURSES_REENTRANT +#define NCURSES_REENTRANT @cf_cv_enable_reentrant@ +#endif + +/* + * KEY_RESIZE is an extended feature that relies upon the SIGWINCH handler + * in ncurses. + */ +#if @NCURSES_EXT_FUNCS@ +#ifndef NCURSES_SIGWINCH +#define NCURSES_SIGWINCH @cf_cv_enable_sigwinch@ +#endif +#else +#undef NCURSES_SIGWINCH +#define NCURSES_SIGWINCH 0 +#endif + +/* + * In certain environments, we must work around linker problems for data + */ +#undef NCURSES_BROKEN_LINKER +#if @BROKEN_LINKER@ +#define NCURSES_BROKEN_LINKER 1 +#endif + +/* + * Control whether bindings for interop support are added. + */ +#undef NCURSES_INTEROP_FUNCS +#define NCURSES_INTEROP_FUNCS @NCURSES_INTEROP_FUNCS@ + +/* + * The internal type used for window dimensions. + */ +#undef NCURSES_SIZE_T +#define NCURSES_SIZE_T @NCURSES_SIZE_T@ + +/* + * Control whether tparm() supports varargs or fixed-parameter list. + */ +#undef NCURSES_TPARM_VARARGS +#define NCURSES_TPARM_VARARGS @NCURSES_TPARM_VARARGS@ + +/* + * Control type used for tparm's arguments. While X/Open equates long and + * char* values, this is not always workable for 64-bit platforms. + */ +#undef NCURSES_TPARM_ARG +#define NCURSES_TPARM_ARG @NCURSES_TPARM_ARG@ + +/* + * Control whether ncurses uses wcwidth() for checking width of line-drawing + * characters. + */ +#undef NCURSES_WCWIDTH_GRAPHICS +#define NCURSES_WCWIDTH_GRAPHICS @NCURSES_WCWIDTH_GRAPHICS@ + +/* + * NCURSES_CH_T is used in building the library, but not used otherwise in + * this header file, since that would make the normal/wide-character versions + * of the header incompatible. + */ +#undef NCURSES_CH_T +#define NCURSES_CH_T @NCURSES_CH_T@ + +#if @cf_cv_enable_lp64@ && defined(_LP64) +typedef unsigned chtype; +typedef unsigned mmask_t; +#else +typedef @cf_cv_typeof_chtype@ chtype; +typedef @cf_cv_typeof_mmask_t@ mmask_t; +#endif + +/* + * We need FILE, etc. Include this before checking any feature symbols. + */ +#include + +/* + * With XPG4, you must define _XOPEN_SOURCE_EXTENDED, it is redundant (or + * conflicting) when _XOPEN_SOURCE is 500 or greater. If NCURSES_WIDECHAR is + * not already defined, e.g., if the platform relies upon nonstandard feature + * test macros, define it at this point if the standard feature test macros + * indicate that it should be defined. + */ +#ifndef NCURSES_WIDECHAR +#if defined(_XOPEN_SOURCE_EXTENDED) || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500)) +#define NCURSES_WIDECHAR 1 +#else +#define NCURSES_WIDECHAR 0 +#endif +#endif /* NCURSES_WIDECHAR */ + +#include /* we need va_list */ +#if NCURSES_WIDECHAR +#include /* we want wchar_t */ +#endif + +/* X/Open and SVr4 specify that curses implements 'bool'. However, C++ may also + * implement it. If so, we must use the C++ compiler's type to avoid conflict + * with other interfaces. + * + * A further complication is that may declare 'bool' to be a + * different type, such as an enum which is not necessarily compatible with + * C++. If we have , make 'bool' a macro, so users may #undef it. + * Otherwise, let it remain a typedef to avoid conflicts with other #define's. + * In either case, make a typedef for NCURSES_BOOL which can be used if needed + * from either C or C++. + */ + +#undef TRUE +#define TRUE 1 + +#undef FALSE +#define FALSE 0 + +typedef @cf_cv_type_of_bool@ NCURSES_BOOL; + +#if @USE_CXX_BOOL@ /* __cplusplus, etc. */ + +/* use the C++ compiler's bool type */ +#define NCURSES_BOOL bool + +#else /* c89, c99, etc. */ + +#if NCURSES_ENABLE_STDBOOL_H +#include +/* use whatever the C compiler decides bool really is */ +#define NCURSES_BOOL bool +#else +/* there is no predefined bool - use our own */ +#undef bool +#define bool NCURSES_BOOL +#endif + +#endif /* !__cplusplus, etc. */ + +#ifdef __cplusplus +extern "C" { +#define NCURSES_CAST(type,value) static_cast(value) +#else +#define NCURSES_CAST(type,value) (type)(value) +#endif + +#define NCURSES_OK_ADDR(p) (0 != NCURSES_CAST(const void *, (p))) + +/* + * X/Open attributes. In the ncurses implementation, they are identical to the + * A_ attributes. + */ +#define WA_ATTRIBUTES A_ATTRIBUTES +#define WA_NORMAL A_NORMAL +#define WA_STANDOUT A_STANDOUT +#define WA_UNDERLINE A_UNDERLINE +#define WA_REVERSE A_REVERSE +#define WA_BLINK A_BLINK +#define WA_DIM A_DIM +#define WA_BOLD A_BOLD +#define WA_ALTCHARSET A_ALTCHARSET +#define WA_INVIS A_INVIS +#define WA_PROTECT A_PROTECT +#define WA_HORIZONTAL A_HORIZONTAL +#define WA_LEFT A_LEFT +#define WA_LOW A_LOW +#define WA_RIGHT A_RIGHT +#define WA_TOP A_TOP +#define WA_VERTICAL A_VERTICAL + +#if @NCURSES_EXT_FUNCS@ +#define WA_ITALIC A_ITALIC /* ncurses extension */ +#endif + +/* colors */ +#define COLOR_BLACK 0 +#define COLOR_RED 1 +#define COLOR_GREEN 2 +#define COLOR_YELLOW 3 +#define COLOR_BLUE 4 +#define COLOR_MAGENTA 5 +#define COLOR_CYAN 6 +#define COLOR_WHITE 7 + +/* line graphics */ + +#if @BROKEN_LINKER@ || NCURSES_REENTRANT +NCURSES_WRAPPED_VAR(chtype*, acs_map); +#define acs_map NCURSES_PUBLIC_VAR(acs_map()) +#else +extern NCURSES_EXPORT_VAR(chtype) acs_map[]; +#endif + +#define NCURSES_ACS(c) (acs_map[NCURSES_CAST(unsigned char,(c))]) + +/* VT100 symbols begin here */ +#define ACS_ULCORNER NCURSES_ACS('l') /* upper left corner */ +#define ACS_LLCORNER NCURSES_ACS('m') /* lower left corner */ +#define ACS_URCORNER NCURSES_ACS('k') /* upper right corner */ +#define ACS_LRCORNER NCURSES_ACS('j') /* lower right corner */ +#define ACS_LTEE NCURSES_ACS('t') /* tee pointing right */ +#define ACS_RTEE NCURSES_ACS('u') /* tee pointing left */ +#define ACS_BTEE NCURSES_ACS('v') /* tee pointing up */ +#define ACS_TTEE NCURSES_ACS('w') /* tee pointing down */ +#define ACS_HLINE NCURSES_ACS('q') /* horizontal line */ +#define ACS_VLINE NCURSES_ACS('x') /* vertical line */ +#define ACS_PLUS NCURSES_ACS('n') /* large plus or crossover */ +#define ACS_S1 NCURSES_ACS('o') /* scan line 1 */ +#define ACS_S9 NCURSES_ACS('s') /* scan line 9 */ +#define ACS_DIAMOND NCURSES_ACS('`') /* diamond */ +#define ACS_CKBOARD NCURSES_ACS('a') /* checker board (stipple) */ +#define ACS_DEGREE NCURSES_ACS('f') /* degree symbol */ +#define ACS_PLMINUS NCURSES_ACS('g') /* plus/minus */ +#define ACS_BULLET NCURSES_ACS('~') /* bullet */ +/* Teletype 5410v1 symbols begin here */ +#define ACS_LARROW NCURSES_ACS(',') /* arrow pointing left */ +#define ACS_RARROW NCURSES_ACS('+') /* arrow pointing right */ +#define ACS_DARROW NCURSES_ACS('.') /* arrow pointing down */ +#define ACS_UARROW NCURSES_ACS('-') /* arrow pointing up */ +#define ACS_BOARD NCURSES_ACS('h') /* board of squares */ +#define ACS_LANTERN NCURSES_ACS('i') /* lantern symbol */ +#define ACS_BLOCK NCURSES_ACS('0') /* solid square block */ +/* + * These aren't documented, but a lot of System Vs have them anyway + * (you can spot pprryyzz{{||}} in a lot of AT&T terminfo strings). + * The ACS_names may not match AT&T's, our source didn't know them. + */ +#define ACS_S3 NCURSES_ACS('p') /* scan line 3 */ +#define ACS_S7 NCURSES_ACS('r') /* scan line 7 */ +#define ACS_LEQUAL NCURSES_ACS('y') /* less/equal */ +#define ACS_GEQUAL NCURSES_ACS('z') /* greater/equal */ +#define ACS_PI NCURSES_ACS('{') /* Pi */ +#define ACS_NEQUAL NCURSES_ACS('|') /* not equal */ +#define ACS_STERLING NCURSES_ACS('}') /* UK pound sign */ + +/* + * Line drawing ACS names are of the form ACS_trbl, where t is the top, r + * is the right, b is the bottom, and l is the left. t, r, b, and l might + * be B (blank), S (single), D (double), or T (thick). The subset defined + * here only uses B and S. + */ +#define ACS_BSSB ACS_ULCORNER +#define ACS_SSBB ACS_LLCORNER +#define ACS_BBSS ACS_URCORNER +#define ACS_SBBS ACS_LRCORNER +#define ACS_SBSS ACS_RTEE +#define ACS_SSSB ACS_LTEE +#define ACS_SSBS ACS_BTEE +#define ACS_BSSS ACS_TTEE +#define ACS_BSBS ACS_HLINE +#define ACS_SBSB ACS_VLINE +#define ACS_SSSS ACS_PLUS + +#undef ERR +#define ERR (-1) + +#undef OK +#define OK (0) + +/* values for the _flags member */ +#define _SUBWIN 0x01 /* is this a sub-window? */ +#define _ENDLINE 0x02 /* is the window flush right? */ +#define _FULLWIN 0x04 /* is the window full-screen? */ +#define _SCROLLWIN 0x08 /* bottom edge is at screen bottom? */ +#define _ISPAD 0x10 /* is this window a pad? */ +#define _HASMOVED 0x20 /* has cursor moved since last refresh? */ +#define _WRAPPED 0x40 /* cursor was just wrappped */ + +/* + * this value is used in the firstchar and lastchar fields to mark + * unchanged lines + */ +#define _NOCHANGE -1 + +/* + * this value is used in the oldindex field to mark lines created by insertions + * and scrolls. + */ +#define _NEWINDEX -1 + +#ifdef NCURSES_INTERNALS +#undef SCREEN +#define SCREEN struct screen +SCREEN; +#else +typedef struct screen SCREEN; +#endif + +typedef struct _win_st WINDOW; + +typedef chtype attr_t; /* ...must be at least as wide as chtype */ + +#if NCURSES_WIDECHAR + +#if @NCURSES_LIBUTF8@ +#ifdef mblen /* libutf8.h defines it w/o undefining first */ +#undef mblen +#endif +#include +#endif + +#if @NEED_WCHAR_H@ +#include /* ...to get mbstate_t, etc. */ +#endif + +#if @NCURSES_WCHAR_T@ +typedef unsigned short wchar_t@NCURSES_OK_WCHAR_T@; +#endif + +#if @NCURSES_WINT_T@ +typedef unsigned int wint_t@NCURSES_OK_WCHAR_T@; +#endif + +/* + * cchar_t stores an array of CCHARW_MAX wide characters. The first is + * normally a spacing character. The others are non-spacing. If those + * (spacing and nonspacing) do not fill the array, a null L'\0' follows. + * Otherwise, a null is assumed to follow when extracting via getcchar(). + */ +#define CCHARW_MAX @NCURSES_CCHARW_MAX@ +typedef struct +{ + attr_t attr; + wchar_t chars[CCHARW_MAX]; +#if @NCURSES_EXT_COLORS@ +#undef NCURSES_EXT_COLORS +#define NCURSES_EXT_COLORS @NCURSES_PATCH@ + int ext_color; /* color pair, must be more than 16-bits */ +#endif +} +cchar_t; + +#endif /* NCURSES_WIDECHAR */ + +#if !NCURSES_OPAQUE +struct ldat; + +struct _win_st +{ + NCURSES_SIZE_T _cury, _curx; /* current cursor position */ + + /* window location and size */ + NCURSES_SIZE_T _maxy, _maxx; /* maximums of x and y, NOT window size */ + NCURSES_SIZE_T _begy, _begx; /* screen coords of upper-left-hand corner */ + + short _flags; /* window state flags */ + + /* attribute tracking */ + attr_t _attrs; /* current attribute for non-space character */ + chtype _bkgd; /* current background char/attribute pair */ + + /* option values set by user */ + bool _notimeout; /* no time out on function-key entry? */ + bool _clear; /* consider all data in the window invalid? */ + bool _leaveok; /* OK to not reset cursor on exit? */ + bool _scroll; /* OK to scroll this window? */ + bool _idlok; /* OK to use insert/delete line? */ + bool _idcok; /* OK to use insert/delete char? */ + bool _immed; /* window in immed mode? (not yet used) */ + bool _sync; /* window in sync mode? */ + bool _use_keypad; /* process function keys into KEY_ symbols? */ + int _delay; /* 0 = nodelay, <0 = blocking, >0 = delay */ + + struct ldat *_line; /* the actual line data */ + + /* global screen state */ + NCURSES_SIZE_T _regtop; /* top line of scrolling region */ + NCURSES_SIZE_T _regbottom; /* bottom line of scrolling region */ + + /* these are used only if this is a sub-window */ + int _parx; /* x coordinate of this window in parent */ + int _pary; /* y coordinate of this window in parent */ + WINDOW *_parent; /* pointer to parent if a sub-window */ + + /* these are used only if this is a pad */ + struct pdat + { + NCURSES_SIZE_T _pad_y, _pad_x; + NCURSES_SIZE_T _pad_top, _pad_left; + NCURSES_SIZE_T _pad_bottom, _pad_right; + } _pad; + + NCURSES_SIZE_T _yoffset; /* real begy is _begy + _yoffset */ + +#if NCURSES_WIDECHAR + cchar_t _bkgrnd; /* current background char/attribute pair */ +#if @NCURSES_EXT_COLORS@ + int _color; /* current color-pair for non-space character */ +#endif +#endif +}; +#endif /* NCURSES_OPAQUE */ + +/* + * GCC (and some other compilers) define '__attribute__'; we're using this + * macro to alert the compiler to flag inconsistencies in printf/scanf-like + * function calls. Just in case '__attribute__' isn't defined, make a dummy. + * Old versions of G++ do not accept it anyway, at least not consistently with + * GCC. + */ +#if !(defined(__GNUC__) || defined(__GNUG__) || defined(__attribute__)) +#define __attribute__(p) /* nothing */ +#endif + +/* + * We cannot define these in ncurses_cfg.h, since they require parameters to be + * passed (that is non-portable). + */ +#ifndef GCC_PRINTFLIKE +#ifndef printf +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#endif + +#ifndef GCC_SCANFLIKE +#ifndef scanf +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +#endif + +#ifndef GCC_NORETURN +#define GCC_NORETURN /* nothing */ +#endif + +#ifndef GCC_UNUSED +#define GCC_UNUSED /* nothing */ +#endif + +#undef GCC_DEPRECATED +#if (__GNUC__ - 0 > 3 || (__GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2)) && !defined(NCURSES_INTERNALS) +#define GCC_DEPRECATED(msg) __attribute__((deprecated)) +#else +#define GCC_DEPRECATED(msg) /* nothing */ +#endif + +/* + * Curses uses a helper function. Define our type for this to simplify + * extending it for the sp-funcs feature. + */ +typedef int (*NCURSES_OUTC)(int); + +/* + * Function prototypes. This is the complete X/Open Curses list of required + * functions. Those marked `generated' will have sources generated from the + * macro definitions later in this file, in order to satisfy XPG4.2 + * requirements. + */ + +extern NCURSES_EXPORT(int) addch (const chtype); /* generated */ +extern NCURSES_EXPORT(int) addchnstr (const chtype *, int); /* generated */ +extern NCURSES_EXPORT(int) addchstr (const chtype *); /* generated */ +extern NCURSES_EXPORT(int) addnstr (const char *, int); /* generated */ +extern NCURSES_EXPORT(int) addstr (const char *); /* generated */ +extern NCURSES_EXPORT(int) attroff (NCURSES_ATTR_T); /* generated */ +extern NCURSES_EXPORT(int) attron (NCURSES_ATTR_T); /* generated */ +extern NCURSES_EXPORT(int) attrset (NCURSES_ATTR_T); /* generated */ +extern NCURSES_EXPORT(int) attr_get (attr_t *, NCURSES_PAIRS_T *, void *); /* generated */ +extern NCURSES_EXPORT(int) attr_off (attr_t, void *); /* generated */ +extern NCURSES_EXPORT(int) attr_on (attr_t, void *); /* generated */ +extern NCURSES_EXPORT(int) attr_set (attr_t, NCURSES_PAIRS_T, void *); /* generated */ +extern NCURSES_EXPORT(int) baudrate (void); /* implemented */ +extern NCURSES_EXPORT(int) beep (void); /* implemented */ +extern NCURSES_EXPORT(int) bkgd (chtype); /* generated */ +extern NCURSES_EXPORT(void) bkgdset (chtype); /* generated */ +extern NCURSES_EXPORT(int) border (chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* generated */ +extern NCURSES_EXPORT(int) box (WINDOW *, chtype, chtype); /* generated */ +extern NCURSES_EXPORT(bool) can_change_color (void); /* implemented */ +extern NCURSES_EXPORT(int) cbreak (void); /* implemented */ +extern NCURSES_EXPORT(int) chgat (int, attr_t, NCURSES_PAIRS_T, const void *); /* generated */ +extern NCURSES_EXPORT(int) clear (void); /* generated */ +extern NCURSES_EXPORT(int) clearok (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(int) clrtobot (void); /* generated */ +extern NCURSES_EXPORT(int) clrtoeol (void); /* generated */ +extern NCURSES_EXPORT(int) color_content (NCURSES_COLOR_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*,NCURSES_COLOR_T*); /* implemented */ +extern NCURSES_EXPORT(int) color_set (NCURSES_PAIRS_T,void*); /* generated */ +extern NCURSES_EXPORT(int) COLOR_PAIR (int); /* generated */ +extern NCURSES_EXPORT(int) copywin (const WINDOW*,WINDOW*,int,int,int,int,int,int,int); /* implemented */ +extern NCURSES_EXPORT(int) curs_set (int); /* implemented */ +extern NCURSES_EXPORT(int) def_prog_mode (void); /* implemented */ +extern NCURSES_EXPORT(int) def_shell_mode (void); /* implemented */ +extern NCURSES_EXPORT(int) delay_output (int); /* implemented */ +extern NCURSES_EXPORT(int) delch (void); /* generated */ +extern NCURSES_EXPORT(void) delscreen (SCREEN *); /* implemented */ +extern NCURSES_EXPORT(int) delwin (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) deleteln (void); /* generated */ +extern NCURSES_EXPORT(WINDOW *) derwin (WINDOW *,int,int,int,int); /* implemented */ +extern NCURSES_EXPORT(int) doupdate (void); /* implemented */ +extern NCURSES_EXPORT(WINDOW *) dupwin (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) echo (void); /* implemented */ +extern NCURSES_EXPORT(int) echochar (const chtype); /* generated */ +extern NCURSES_EXPORT(int) erase (void); /* generated */ +extern NCURSES_EXPORT(int) endwin (void); /* implemented */ +extern NCURSES_EXPORT(char) erasechar (void); /* implemented */ +extern NCURSES_EXPORT(void) filter (void); /* implemented */ +extern NCURSES_EXPORT(int) flash (void); /* implemented */ +extern NCURSES_EXPORT(int) flushinp (void); /* implemented */ +extern NCURSES_EXPORT(chtype) getbkgd (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getch (void); /* generated */ +extern NCURSES_EXPORT(int) getnstr (char *, int); /* generated */ +extern NCURSES_EXPORT(int) getstr (char *); /* generated */ +extern NCURSES_EXPORT(WINDOW *) getwin (FILE *); /* implemented */ +extern NCURSES_EXPORT(int) halfdelay (int); /* implemented */ +extern NCURSES_EXPORT(bool) has_colors (void); /* implemented */ +extern NCURSES_EXPORT(bool) has_ic (void); /* implemented */ +extern NCURSES_EXPORT(bool) has_il (void); /* implemented */ +extern NCURSES_EXPORT(int) hline (chtype, int); /* generated */ +extern NCURSES_EXPORT(void) idcok (WINDOW *, bool); /* implemented */ +extern NCURSES_EXPORT(int) idlok (WINDOW *, bool); /* implemented */ +extern NCURSES_EXPORT(void) immedok (WINDOW *, bool); /* implemented */ +extern NCURSES_EXPORT(chtype) inch (void); /* generated */ +extern NCURSES_EXPORT(int) inchnstr (chtype *, int); /* generated */ +extern NCURSES_EXPORT(int) inchstr (chtype *); /* generated */ +extern NCURSES_EXPORT(WINDOW *) initscr (void); /* implemented */ +extern NCURSES_EXPORT(int) init_color (NCURSES_COLOR_T,NCURSES_COLOR_T,NCURSES_COLOR_T,NCURSES_COLOR_T); /* implemented */ +extern NCURSES_EXPORT(int) init_pair (NCURSES_PAIRS_T,NCURSES_COLOR_T,NCURSES_COLOR_T); /* implemented */ +extern NCURSES_EXPORT(int) innstr (char *, int); /* generated */ +extern NCURSES_EXPORT(int) insch (chtype); /* generated */ +extern NCURSES_EXPORT(int) insdelln (int); /* generated */ +extern NCURSES_EXPORT(int) insertln (void); /* generated */ +extern NCURSES_EXPORT(int) insnstr (const char *, int); /* generated */ +extern NCURSES_EXPORT(int) insstr (const char *); /* generated */ +extern NCURSES_EXPORT(int) instr (char *); /* generated */ +extern NCURSES_EXPORT(int) intrflush (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(bool) isendwin (void); /* implemented */ +extern NCURSES_EXPORT(bool) is_linetouched (WINDOW *,int); /* implemented */ +extern NCURSES_EXPORT(bool) is_wintouched (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(NCURSES_CONST char *) keyname (int); /* implemented */ +extern NCURSES_EXPORT(int) keypad (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(char) killchar (void); /* implemented */ +extern NCURSES_EXPORT(int) leaveok (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(char *) longname (void); /* implemented */ +extern NCURSES_EXPORT(int) meta (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(int) move (int, int); /* generated */ +extern NCURSES_EXPORT(int) mvaddch (int, int, const chtype); /* generated */ +extern NCURSES_EXPORT(int) mvaddchnstr (int, int, const chtype *, int); /* generated */ +extern NCURSES_EXPORT(int) mvaddchstr (int, int, const chtype *); /* generated */ +extern NCURSES_EXPORT(int) mvaddnstr (int, int, const char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvaddstr (int, int, const char *); /* generated */ +extern NCURSES_EXPORT(int) mvchgat (int, int, int, attr_t, NCURSES_PAIRS_T, const void *); /* generated */ +extern NCURSES_EXPORT(int) mvcur (int,int,int,int); /* implemented */ +extern NCURSES_EXPORT(int) mvdelch (int, int); /* generated */ +extern NCURSES_EXPORT(int) mvderwin (WINDOW *, int, int); /* implemented */ +extern NCURSES_EXPORT(int) mvgetch (int, int); /* generated */ +extern NCURSES_EXPORT(int) mvgetnstr (int, int, char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvgetstr (int, int, char *); /* generated */ +extern NCURSES_EXPORT(int) mvhline (int, int, chtype, int); /* generated */ +extern NCURSES_EXPORT(chtype) mvinch (int, int); /* generated */ +extern NCURSES_EXPORT(int) mvinchnstr (int, int, chtype *, int); /* generated */ +extern NCURSES_EXPORT(int) mvinchstr (int, int, chtype *); /* generated */ +extern NCURSES_EXPORT(int) mvinnstr (int, int, char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvinsch (int, int, chtype); /* generated */ +extern NCURSES_EXPORT(int) mvinsnstr (int, int, const char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvinsstr (int, int, const char *); /* generated */ +extern NCURSES_EXPORT(int) mvinstr (int, int, char *); /* generated */ +extern NCURSES_EXPORT(int) mvprintw (int,int, const char *,...) /* implemented */ + GCC_PRINTFLIKE(3,4); +extern NCURSES_EXPORT(int) mvscanw (int,int, const char *,...) /* implemented */ + GCC_SCANFLIKE(3,4); +extern NCURSES_EXPORT(int) mvvline (int, int, chtype, int); /* generated */ +extern NCURSES_EXPORT(int) mvwaddch (WINDOW *, int, int, const chtype); /* generated */ +extern NCURSES_EXPORT(int) mvwaddchnstr (WINDOW *, int, int, const chtype *, int);/* generated */ +extern NCURSES_EXPORT(int) mvwaddchstr (WINDOW *, int, int, const chtype *); /* generated */ +extern NCURSES_EXPORT(int) mvwaddnstr (WINDOW *, int, int, const char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvwaddstr (WINDOW *, int, int, const char *); /* generated */ +extern NCURSES_EXPORT(int) mvwchgat (WINDOW *, int, int, int, attr_t, NCURSES_PAIRS_T, const void *);/* generated */ +extern NCURSES_EXPORT(int) mvwdelch (WINDOW *, int, int); /* generated */ +extern NCURSES_EXPORT(int) mvwgetch (WINDOW *, int, int); /* generated */ +extern NCURSES_EXPORT(int) mvwgetnstr (WINDOW *, int, int, char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvwgetstr (WINDOW *, int, int, char *); /* generated */ +extern NCURSES_EXPORT(int) mvwhline (WINDOW *, int, int, chtype, int); /* generated */ +extern NCURSES_EXPORT(int) mvwin (WINDOW *,int,int); /* implemented */ +extern NCURSES_EXPORT(chtype) mvwinch (WINDOW *, int, int); /* generated */ +extern NCURSES_EXPORT(int) mvwinchnstr (WINDOW *, int, int, chtype *, int); /* generated */ +extern NCURSES_EXPORT(int) mvwinchstr (WINDOW *, int, int, chtype *); /* generated */ +extern NCURSES_EXPORT(int) mvwinnstr (WINDOW *, int, int, char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvwinsch (WINDOW *, int, int, chtype); /* generated */ +extern NCURSES_EXPORT(int) mvwinsnstr (WINDOW *, int, int, const char *, int); /* generated */ +extern NCURSES_EXPORT(int) mvwinsstr (WINDOW *, int, int, const char *); /* generated */ +extern NCURSES_EXPORT(int) mvwinstr (WINDOW *, int, int, char *); /* generated */ +extern NCURSES_EXPORT(int) mvwprintw (WINDOW*,int,int, const char *,...) /* implemented */ + GCC_PRINTFLIKE(4,5); +extern NCURSES_EXPORT(int) mvwscanw (WINDOW *,int,int, const char *,...) /* implemented */ + GCC_SCANFLIKE(4,5); +extern NCURSES_EXPORT(int) mvwvline (WINDOW *,int, int, chtype, int); /* generated */ +extern NCURSES_EXPORT(int) napms (int); /* implemented */ +extern NCURSES_EXPORT(WINDOW *) newpad (int,int); /* implemented */ +extern NCURSES_EXPORT(SCREEN *) newterm (const char *,FILE *,FILE *); /* implemented */ +extern NCURSES_EXPORT(WINDOW *) newwin (int,int,int,int); /* implemented */ +extern NCURSES_EXPORT(int) nl (void); /* implemented */ +extern NCURSES_EXPORT(int) nocbreak (void); /* implemented */ +extern NCURSES_EXPORT(int) nodelay (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(int) noecho (void); /* implemented */ +extern NCURSES_EXPORT(int) nonl (void); /* implemented */ +extern NCURSES_EXPORT(void) noqiflush (void); /* implemented */ +extern NCURSES_EXPORT(int) noraw (void); /* implemented */ +extern NCURSES_EXPORT(int) notimeout (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(int) overlay (const WINDOW*,WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) overwrite (const WINDOW*,WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) pair_content (NCURSES_PAIRS_T,NCURSES_COLOR_T*,NCURSES_COLOR_T*); /* implemented */ +extern NCURSES_EXPORT(int) PAIR_NUMBER (int); /* generated */ +extern NCURSES_EXPORT(int) pechochar (WINDOW *, const chtype); /* implemented */ +extern NCURSES_EXPORT(int) pnoutrefresh (WINDOW*,int,int,int,int,int,int);/* implemented */ +extern NCURSES_EXPORT(int) prefresh (WINDOW *,int,int,int,int,int,int); /* implemented */ +extern NCURSES_EXPORT(int) printw (const char *,...) /* implemented */ + GCC_PRINTFLIKE(1,2); +extern NCURSES_EXPORT(int) putwin (WINDOW *, FILE *); /* implemented */ +extern NCURSES_EXPORT(void) qiflush (void); /* implemented */ +extern NCURSES_EXPORT(int) raw (void); /* implemented */ +extern NCURSES_EXPORT(int) redrawwin (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) refresh (void); /* generated */ +extern NCURSES_EXPORT(int) resetty (void); /* implemented */ +extern NCURSES_EXPORT(int) reset_prog_mode (void); /* implemented */ +extern NCURSES_EXPORT(int) reset_shell_mode (void); /* implemented */ +extern NCURSES_EXPORT(int) ripoffline (int, int (*)(WINDOW *, int)); /* implemented */ +extern NCURSES_EXPORT(int) savetty (void); /* implemented */ +extern NCURSES_EXPORT(int) scanw (const char *,...) /* implemented */ + GCC_SCANFLIKE(1,2); +extern NCURSES_EXPORT(int) scr_dump (const char *); /* implemented */ +extern NCURSES_EXPORT(int) scr_init (const char *); /* implemented */ +extern NCURSES_EXPORT(int) scrl (int); /* generated */ +extern NCURSES_EXPORT(int) scroll (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) scrollok (WINDOW *,bool); /* implemented */ +extern NCURSES_EXPORT(int) scr_restore (const char *); /* implemented */ +extern NCURSES_EXPORT(int) scr_set (const char *); /* implemented */ +extern NCURSES_EXPORT(int) setscrreg (int,int); /* generated */ +extern NCURSES_EXPORT(SCREEN *) set_term (SCREEN *); /* implemented */ +extern NCURSES_EXPORT(int) slk_attroff (const chtype); /* implemented */ +extern NCURSES_EXPORT(int) slk_attr_off (const attr_t, void *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) slk_attron (const chtype); /* implemented */ +extern NCURSES_EXPORT(int) slk_attr_on (attr_t,void*); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) slk_attrset (const chtype); /* implemented */ +extern NCURSES_EXPORT(attr_t) slk_attr (void); /* implemented */ +extern NCURSES_EXPORT(int) slk_attr_set (const attr_t,NCURSES_PAIRS_T,void*); /* implemented */ +extern NCURSES_EXPORT(int) slk_clear (void); /* implemented */ +extern NCURSES_EXPORT(int) slk_color (NCURSES_PAIRS_T); /* implemented */ +extern NCURSES_EXPORT(int) slk_init (int); /* implemented */ +extern NCURSES_EXPORT(char *) slk_label (int); /* implemented */ +extern NCURSES_EXPORT(int) slk_noutrefresh (void); /* implemented */ +extern NCURSES_EXPORT(int) slk_refresh (void); /* implemented */ +extern NCURSES_EXPORT(int) slk_restore (void); /* implemented */ +extern NCURSES_EXPORT(int) slk_set (int,const char *,int); /* implemented */ +extern NCURSES_EXPORT(int) slk_touch (void); /* implemented */ +extern NCURSES_EXPORT(int) standout (void); /* generated */ +extern NCURSES_EXPORT(int) standend (void); /* generated */ +extern NCURSES_EXPORT(int) start_color (void); /* implemented */ +extern NCURSES_EXPORT(WINDOW *) subpad (WINDOW *, int, int, int, int); /* implemented */ +extern NCURSES_EXPORT(WINDOW *) subwin (WINDOW *, int, int, int, int); /* implemented */ +extern NCURSES_EXPORT(int) syncok (WINDOW *, bool); /* implemented */ +extern NCURSES_EXPORT(chtype) termattrs (void); /* implemented */ +extern NCURSES_EXPORT(char *) termname (void); /* implemented */ +extern NCURSES_EXPORT(void) timeout (int); /* generated */ +extern NCURSES_EXPORT(int) touchline (WINDOW *, int, int); /* generated */ +extern NCURSES_EXPORT(int) touchwin (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) typeahead (int); /* implemented */ +extern NCURSES_EXPORT(int) ungetch (int); /* implemented */ +extern NCURSES_EXPORT(int) untouchwin (WINDOW *); /* generated */ +extern NCURSES_EXPORT(void) use_env (bool); /* implemented */ +extern NCURSES_EXPORT(void) use_tioctl (bool); /* implemented */ +extern NCURSES_EXPORT(int) vidattr (chtype); /* implemented */ +extern NCURSES_EXPORT(int) vidputs (chtype, NCURSES_OUTC); /* implemented */ +extern NCURSES_EXPORT(int) vline (chtype, int); /* generated */ +extern NCURSES_EXPORT(int) vwprintw (WINDOW *, const char *, va_list) GCC_DEPRECATED(use vw_printw) /* implemented */ + GCC_PRINTFLIKE(2,0); +extern NCURSES_EXPORT(int) vw_printw (WINDOW *, const char *, va_list) /* implemented */ + GCC_PRINTFLIKE(2,0); +extern NCURSES_EXPORT(int) vwscanw (WINDOW *, const char *, va_list) GCC_DEPRECATED(use vw_scanw) /* implemented */ + GCC_SCANFLIKE(2,0); +extern NCURSES_EXPORT(int) vw_scanw (WINDOW *, const char *, va_list) /* implemented */ + GCC_SCANFLIKE(2,0); +extern NCURSES_EXPORT(int) waddch (WINDOW *, const chtype); /* implemented */ +extern NCURSES_EXPORT(int) waddchnstr (WINDOW *,const chtype *,int); /* implemented */ +extern NCURSES_EXPORT(int) waddchstr (WINDOW *,const chtype *); /* generated */ +extern NCURSES_EXPORT(int) waddnstr (WINDOW *,const char *,int); /* implemented */ +extern NCURSES_EXPORT(int) waddstr (WINDOW *,const char *); /* generated */ +extern NCURSES_EXPORT(int) wattron (WINDOW *, int); /* generated */ +extern NCURSES_EXPORT(int) wattroff (WINDOW *, int); /* generated */ +extern NCURSES_EXPORT(int) wattrset (WINDOW *, int); /* generated */ +extern NCURSES_EXPORT(int) wattr_get (WINDOW *, attr_t *, NCURSES_PAIRS_T *, void *); /* generated */ +extern NCURSES_EXPORT(int) wattr_on (WINDOW *, attr_t, void *); /* implemented */ +extern NCURSES_EXPORT(int) wattr_off (WINDOW *, attr_t, void *); /* implemented */ +extern NCURSES_EXPORT(int) wattr_set (WINDOW *, attr_t, NCURSES_PAIRS_T, void *); /* generated */ +extern NCURSES_EXPORT(int) wbkgd (WINDOW *, chtype); /* implemented */ +extern NCURSES_EXPORT(void) wbkgdset (WINDOW *,chtype); /* implemented */ +extern NCURSES_EXPORT(int) wborder (WINDOW *,chtype,chtype,chtype,chtype,chtype,chtype,chtype,chtype); /* implemented */ +extern NCURSES_EXPORT(int) wchgat (WINDOW *, int, attr_t, NCURSES_PAIRS_T, const void *);/* implemented */ +extern NCURSES_EXPORT(int) wclear (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wclrtobot (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wclrtoeol (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wcolor_set (WINDOW*,NCURSES_PAIRS_T,void*); /* implemented */ +extern NCURSES_EXPORT(void) wcursyncup (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wdelch (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wdeleteln (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) wechochar (WINDOW *, const chtype); /* implemented */ +extern NCURSES_EXPORT(int) werase (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wgetch (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wgetnstr (WINDOW *,char *,int); /* implemented */ +extern NCURSES_EXPORT(int) wgetstr (WINDOW *, char *); /* generated */ +extern NCURSES_EXPORT(int) whline (WINDOW *, chtype, int); /* implemented */ +extern NCURSES_EXPORT(chtype) winch (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) winchnstr (WINDOW *, chtype *, int); /* implemented */ +extern NCURSES_EXPORT(int) winchstr (WINDOW *, chtype *); /* generated */ +extern NCURSES_EXPORT(int) winnstr (WINDOW *, char *, int); /* implemented */ +extern NCURSES_EXPORT(int) winsch (WINDOW *, chtype); /* implemented */ +extern NCURSES_EXPORT(int) winsdelln (WINDOW *,int); /* implemented */ +extern NCURSES_EXPORT(int) winsertln (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) winsnstr (WINDOW *, const char *,int); /* implemented */ +extern NCURSES_EXPORT(int) winsstr (WINDOW *, const char *); /* generated */ +extern NCURSES_EXPORT(int) winstr (WINDOW *, char *); /* generated */ +extern NCURSES_EXPORT(int) wmove (WINDOW *,int,int); /* implemented */ +extern NCURSES_EXPORT(int) wnoutrefresh (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wprintw (WINDOW *, const char *,...) /* implemented */ + GCC_PRINTFLIKE(2,3); +extern NCURSES_EXPORT(int) wredrawln (WINDOW *,int,int); /* implemented */ +extern NCURSES_EXPORT(int) wrefresh (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(int) wscanw (WINDOW *, const char *,...) /* implemented */ + GCC_SCANFLIKE(2,3); +extern NCURSES_EXPORT(int) wscrl (WINDOW *,int); /* implemented */ +extern NCURSES_EXPORT(int) wsetscrreg (WINDOW *,int,int); /* implemented */ +extern NCURSES_EXPORT(int) wstandout (WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) wstandend (WINDOW *); /* generated */ +extern NCURSES_EXPORT(void) wsyncdown (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(void) wsyncup (WINDOW *); /* implemented */ +extern NCURSES_EXPORT(void) wtimeout (WINDOW *,int); /* implemented */ +extern NCURSES_EXPORT(int) wtouchln (WINDOW *,int,int,int); /* implemented */ +extern NCURSES_EXPORT(int) wvline (WINDOW *,chtype,int); /* implemented */ + +/* + * These are also declared in : + */ +extern NCURSES_EXPORT(int) tigetflag (const char *); /* implemented */ +extern NCURSES_EXPORT(int) tigetnum (const char *); /* implemented */ +extern NCURSES_EXPORT(char *) tigetstr (const char *); /* implemented */ +extern NCURSES_EXPORT(int) putp (const char *); /* implemented */ + +#if NCURSES_TPARM_VARARGS +extern NCURSES_EXPORT(char *) tparm (const char *, ...); /* special */ +#else +extern NCURSES_EXPORT(char *) tparm (const char *, NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG,NCURSES_TPARM_ARG); /* special */ +#endif + +extern NCURSES_EXPORT(char *) tiparm (const char *, ...); /* special */ +extern NCURSES_EXPORT(char *) tiparm_s (int, int, const char *, ...); /* special */ +extern NCURSES_EXPORT(int) tiscan_s (int *, int *, const char *); /* special */ + +/* + * These functions are not in X/Open, but we use them in macro definitions: + */ +extern NCURSES_EXPORT(int) getattrs (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getcurx (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getcury (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getbegx (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getbegy (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getmaxx (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getmaxy (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getparx (const WINDOW *); /* generated */ +extern NCURSES_EXPORT(int) getpary (const WINDOW *); /* generated */ + +/* + * vid_attr() was implemented originally based on a draft of X/Open curses. + */ +#if !NCURSES_WIDECHAR +#define vid_attr(a,pair,opts) vidattr(a) +#endif + +/* + * These functions are extensions - not in X/Open Curses. + */ +#if @NCURSES_EXT_FUNCS@ +#undef NCURSES_EXT_FUNCS +#define NCURSES_EXT_FUNCS @NCURSES_PATCH@ +typedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *); +typedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *); +extern NCURSES_EXPORT(int) alloc_pair (int, int); +extern NCURSES_EXPORT(int) assume_default_colors (int, int); +extern NCURSES_EXPORT(const char *) curses_version (void); +extern NCURSES_EXPORT(int) define_key (const char *, int); +extern NCURSES_EXPORT(int) extended_color_content(int, int *, int *, int *); +extern NCURSES_EXPORT(int) extended_pair_content(int, int *, int *); +extern NCURSES_EXPORT(int) extended_slk_color(int); +extern NCURSES_EXPORT(int) find_pair (int, int); +extern NCURSES_EXPORT(int) free_pair (int); +extern NCURSES_EXPORT(int) get_escdelay (void); +extern NCURSES_EXPORT(int) init_extended_color(int, int, int, int); +extern NCURSES_EXPORT(int) init_extended_pair(int, int, int); +extern NCURSES_EXPORT(int) is_cbreak(void); +extern NCURSES_EXPORT(int) is_echo(void); +extern NCURSES_EXPORT(int) is_nl(void); +extern NCURSES_EXPORT(int) is_raw(void); +extern NCURSES_EXPORT(bool) is_term_resized (int, int); +extern NCURSES_EXPORT(int) key_defined (const char *); +extern NCURSES_EXPORT(char *) keybound (int, int); +extern NCURSES_EXPORT(int) keyok (int, bool); +extern NCURSES_EXPORT(void) nofilter(void); +extern NCURSES_EXPORT(void) reset_color_pairs (void); +extern NCURSES_EXPORT(int) resize_term (int, int); +extern NCURSES_EXPORT(int) resizeterm (int, int); +extern NCURSES_EXPORT(int) set_escdelay (int); +extern NCURSES_EXPORT(int) set_tabsize (int); +extern NCURSES_EXPORT(int) use_default_colors (void); +extern NCURSES_EXPORT(int) use_legacy_coding (int); +extern NCURSES_EXPORT(int) use_screen (SCREEN *, NCURSES_SCREEN_CB, void *); +extern NCURSES_EXPORT(int) use_window (WINDOW *, NCURSES_WINDOW_CB, void *); +extern NCURSES_EXPORT(int) wresize (WINDOW *, int, int); + +#if @NCURSES_XNAMES@ +#undef NCURSES_XNAMES +#define NCURSES_XNAMES @NCURSES_XNAMES@ +extern NCURSES_EXPORT(int) use_extended_names (bool); +#endif + +/* + * These extensions provide access to information stored in the WINDOW even + * when NCURSES_OPAQUE is set: + */ +extern NCURSES_EXPORT(WINDOW *) wgetparent (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_cleared (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_idcok (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_idlok (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_immedok (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_keypad (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_leaveok (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_nodelay (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_notimeout (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_pad (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_scrollok (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_subwin (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(bool) is_syncok (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(int) wgetdelay (const WINDOW *); /* @GENERATED_EXT_FUNCS@ */ +extern NCURSES_EXPORT(int) wgetscrreg (const WINDOW *, int *, int *); /* @GENERATED_EXT_FUNCS@ */ + +#else +#define curses_version() NCURSES_VERSION +#endif + +/* + * Extra extension-functions, which pass a SCREEN pointer rather than using + * a global variable SP. + */ +#if @NCURSES_SP_FUNCS@ +#undef NCURSES_SP_FUNCS +#define NCURSES_SP_FUNCS @NCURSES_PATCH@ +#define NCURSES_SP_NAME(name) name##_sp + +/* Define the sp-funcs helper function */ +#define NCURSES_SP_OUTC NCURSES_SP_NAME(NCURSES_OUTC) +typedef int (*NCURSES_SP_OUTC)(SCREEN*, int); + +extern NCURSES_EXPORT(SCREEN *) new_prescr (void); /* implemented:SP_FUNC */ + +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(baudrate) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(beep) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(can_change_color) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(cbreak) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(curs_set) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(color_content) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T*, NCURSES_COLOR_T*, NCURSES_COLOR_T*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(def_prog_mode) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(def_shell_mode) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(delay_output) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(doupdate) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(echo) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(endwin) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(char) NCURSES_SP_NAME(erasechar) (SCREEN*);/* implemented:SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(filter) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(flash) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(flushinp) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(getwin) (SCREEN*, FILE *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(halfdelay) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_colors) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_ic) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_il) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_color) (SCREEN*, NCURSES_COLOR_T, NCURSES_COLOR_T, NCURSES_COLOR_T, NCURSES_COLOR_T); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_pair) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T, NCURSES_COLOR_T); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(intrflush) (SCREEN*, WINDOW*, bool); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(isendwin) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(NCURSES_CONST char *) NCURSES_SP_NAME(keyname) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(char) NCURSES_SP_NAME(killchar) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(longname) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mvcur) (SCREEN*, int, int, int, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(napms) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newpad) (SCREEN*, int, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(SCREEN *) NCURSES_SP_NAME(newterm) (SCREEN*, const char *, FILE *, FILE *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(newwin) (SCREEN*, int, int, int, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nl) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nocbreak) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(noecho) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(nonl) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(noqiflush) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(noraw) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(pair_content) (SCREEN*, NCURSES_PAIRS_T, NCURSES_COLOR_T*, NCURSES_COLOR_T*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(qiflush) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(raw) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(reset_prog_mode) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(reset_shell_mode) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resetty) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ripoffline) (SCREEN*, int, int (*)(WINDOW *, int)); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(savetty) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_init) (SCREEN*, const char *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_restore) (SCREEN*, const char *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(scr_set) (SCREEN*, const char *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attroff) (SCREEN*, const chtype); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attron) (SCREEN*, const chtype); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attrset) (SCREEN*, const chtype); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(attr_t) NCURSES_SP_NAME(slk_attr) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_attr_set) (SCREEN*, const attr_t, NCURSES_PAIRS_T, void*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_clear) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_color) (SCREEN*, NCURSES_PAIRS_T); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_init) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(slk_label) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_noutrefresh) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_refresh) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_restore) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_set) (SCREEN*, int, const char *, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(slk_touch) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(start_color) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(chtype) NCURSES_SP_NAME(termattrs) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(termname) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(typeahead) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ungetch) (SCREEN*, int); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(use_env) (SCREEN*, bool); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(use_tioctl) (SCREEN*, bool); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vidattr) (SCREEN*, chtype); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vidputs) (SCREEN*, chtype, NCURSES_SP_OUTC); /* implemented:SP_FUNC */ +#if @NCURSES_EXT_FUNCS@ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(alloc_pair) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(assume_default_colors) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(define_key) (SCREEN*, const char *, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_color_content) (SCREEN*, int, int *, int *, int *); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_pair_content) (SCREEN*, int, int *, int *); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(extended_slk_color) (SCREEN*, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(find_pair) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(free_pair) (SCREEN*, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(get_escdelay) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_color) (SCREEN*, int, int, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(init_extended_pair) (SCREEN*, int, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(is_cbreak) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(is_echo) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(is_nl) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(is_raw) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(is_term_resized) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(key_defined) (SCREEN*, const char *); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(keybound) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(keyok) (SCREEN*, int, bool); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(nofilter) (SCREEN*); /* implemented */ /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(reset_color_pairs) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resize_term) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(resizeterm) (SCREEN*, int, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(set_escdelay) (SCREEN*, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(set_tabsize) (SCREEN*, int); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(use_default_colors) (SCREEN*); /* implemented:EXT_SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(use_legacy_coding) (SCREEN*, int); /* implemented:EXT_SP_FUNC */ +#endif +#else +#undef NCURSES_SP_FUNCS +#define NCURSES_SP_FUNCS 0 +#define NCURSES_SP_NAME(name) name +#define NCURSES_SP_OUTC NCURSES_OUTC +#endif + +/* attributes */ + +#define NCURSES_ATTR_SHIFT 8 +#define NCURSES_BITS(mask,shift) (NCURSES_CAST(chtype,(mask)) << ((shift) + NCURSES_ATTR_SHIFT)) + +#define A_NORMAL (@cf_cv_1UL@ - @cf_cv_1UL@) +#define A_ATTRIBUTES NCURSES_BITS(~(@cf_cv_1UL@ - @cf_cv_1UL@),0) +#define A_CHARTEXT (NCURSES_BITS(@cf_cv_1UL@,0) - @cf_cv_1UL@) +#define A_COLOR NCURSES_BITS(((@cf_cv_1UL@) << 8) - @cf_cv_1UL@,0) +#define A_STANDOUT NCURSES_BITS(@cf_cv_1UL@,8) +#define A_UNDERLINE NCURSES_BITS(@cf_cv_1UL@,9) +#define A_REVERSE NCURSES_BITS(@cf_cv_1UL@,10) +#define A_BLINK NCURSES_BITS(@cf_cv_1UL@,11) +#define A_DIM NCURSES_BITS(@cf_cv_1UL@,12) +#define A_BOLD NCURSES_BITS(@cf_cv_1UL@,13) +#define A_ALTCHARSET NCURSES_BITS(@cf_cv_1UL@,14) +#define A_INVIS NCURSES_BITS(@cf_cv_1UL@,15) +#define A_PROTECT NCURSES_BITS(@cf_cv_1UL@,16) +#define A_HORIZONTAL NCURSES_BITS(@cf_cv_1UL@,17) +#define A_LEFT NCURSES_BITS(@cf_cv_1UL@,18) +#define A_LOW NCURSES_BITS(@cf_cv_1UL@,19) +#define A_RIGHT NCURSES_BITS(@cf_cv_1UL@,20) +#define A_TOP NCURSES_BITS(@cf_cv_1UL@,21) +#define A_VERTICAL NCURSES_BITS(@cf_cv_1UL@,22) + +#if @NCURSES_EXT_FUNCS@ +#define A_ITALIC NCURSES_BITS(@cf_cv_1UL@,23) /* ncurses extension */ +#endif + +/* + * Most of the pseudo functions are macros that either provide compatibility + * with older versions of curses, or provide inline functionality to improve + * performance. + */ + +/* + * These pseudo functions are always implemented as macros: + */ + +#define getyx(win,y,x) (y = getcury(win), x = getcurx(win)) +#define getbegyx(win,y,x) (y = getbegy(win), x = getbegx(win)) +#define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win)) +#define getparyx(win,y,x) (y = getpary(win), x = getparx(win)) + +#define getsyx(y,x) do { if (newscr) { \ + if (is_leaveok(newscr)) \ + (y) = (x) = -1; \ + else \ + getyx(newscr,(y), (x)); \ + } \ + } while(0) + +#define setsyx(y,x) do { if (newscr) { \ + if ((y) == -1 && (x) == -1) \ + leaveok(newscr, TRUE); \ + else { \ + leaveok(newscr, FALSE); \ + wmove(newscr, (y), (x)); \ + } \ + } \ + } while(0) + +#ifndef NCURSES_NOMACROS + +/* + * These miscellaneous pseudo functions are provided for compatibility: + */ + +#define wgetstr(w, s) wgetnstr(w, s, -1) +#define getnstr(s, n) wgetnstr(stdscr, s, (n)) + +#define setterm(term) setupterm(term, 1, (int *)0) + +#define fixterm() reset_prog_mode() +#define resetterm() reset_shell_mode() +#define saveterm() def_prog_mode() +#define crmode() cbreak() +#define nocrmode() nocbreak() +#define gettmode() + +/* It seems older SYSV curses versions define these */ +#if !NCURSES_OPAQUE +#define getattrs(win) NCURSES_CAST(int, NCURSES_OK_ADDR(win) ? (win)->_attrs : A_NORMAL) +#define getcurx(win) (NCURSES_OK_ADDR(win) ? (win)->_curx : ERR) +#define getcury(win) (NCURSES_OK_ADDR(win) ? (win)->_cury : ERR) +#define getbegx(win) (NCURSES_OK_ADDR(win) ? (win)->_begx : ERR) +#define getbegy(win) (NCURSES_OK_ADDR(win) ? (win)->_begy : ERR) +#define getmaxx(win) (NCURSES_OK_ADDR(win) ? ((win)->_maxx + 1) : ERR) +#define getmaxy(win) (NCURSES_OK_ADDR(win) ? ((win)->_maxy + 1) : ERR) +#define getparx(win) (NCURSES_OK_ADDR(win) ? (win)->_parx : ERR) +#define getpary(win) (NCURSES_OK_ADDR(win) ? (win)->_pary : ERR) +#endif /* NCURSES_OPAQUE */ + +#define wstandout(win) (wattrset(win,A_STANDOUT)) +#define wstandend(win) (wattrset(win,A_NORMAL)) + +#define wattron(win,at) wattr_on(win, NCURSES_CAST(attr_t, at), NULL) +#define wattroff(win,at) wattr_off(win, NCURSES_CAST(attr_t, at), NULL) + +#if !NCURSES_OPAQUE +#if NCURSES_WATTR_MACROS +#if NCURSES_WIDECHAR && @NCURSES_EXT_COLORS@ +#define wattrset(win,at) \ + (NCURSES_OK_ADDR(win) \ + ? ((win)->_color = NCURSES_CAST(int, PAIR_NUMBER(at)), \ + (win)->_attrs = NCURSES_CAST(attr_t, at), \ + OK) \ + : ERR) +#else +#define wattrset(win,at) \ + (NCURSES_OK_ADDR(win) \ + ? ((win)->_attrs = NCURSES_CAST(attr_t, at), \ + OK) \ + : ERR) +#endif +#endif /* NCURSES_WATTR_MACROS */ +#endif /* NCURSES_OPAQUE */ + +#define scroll(win) wscrl(win,1) + +#define touchwin(win) wtouchln((win), 0, getmaxy(win), 1) +#define touchline(win, s, c) wtouchln((win), s, c, 1) +#define untouchwin(win) wtouchln((win), 0, getmaxy(win), 0) + +#define box(win, v, h) wborder(win, v, v, h, h, 0, 0, 0, 0) +#define border(ls, rs, ts, bs, tl, tr, bl, br) wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br) +#define hline(ch, n) whline(stdscr, ch, (n)) +#define vline(ch, n) wvline(stdscr, ch, (n)) + +#define winstr(w, s) winnstr(w, s, -1) +#define winchstr(w, s) winchnstr(w, s, -1) +#define winsstr(w, s) winsnstr(w, s, -1) + +#if !NCURSES_OPAQUE +#define redrawwin(win) wredrawln(win, 0, (NCURSES_OK_ADDR(win) ? (win)->_maxy+1 : -1)) +#endif /* NCURSES_OPAQUE */ + +#define waddstr(win,str) waddnstr(win,str,-1) +#define waddchstr(win,str) waddchnstr(win,str,-1) + +/* + * These apply to the first 256 color pairs. + */ +#define COLOR_PAIR(n) (NCURSES_BITS((n), 0) & A_COLOR) +#define PAIR_NUMBER(a) (NCURSES_CAST(int,((NCURSES_CAST(unsigned long,(a)) & A_COLOR) >> NCURSES_ATTR_SHIFT))) + +/* + * pseudo functions for standard screen + */ + +#define addch(ch) waddch(stdscr,(ch)) +#define addchnstr(str,n) waddchnstr(stdscr,(str),(n)) +#define addchstr(str) waddchstr(stdscr,(str)) +#define addnstr(str,n) waddnstr(stdscr,(str),(n)) +#define addstr(str) waddnstr(stdscr,(str),-1) +#define attr_get(ap,cp,o) wattr_get(stdscr,(ap),(cp),(o)) +#define attr_off(a,o) wattr_off(stdscr,(a),(o)) +#define attr_on(a,o) wattr_on(stdscr,(a),(o)) +#define attr_set(a,c,o) wattr_set(stdscr,(a),(c),(o)) +#define attroff(at) wattroff(stdscr,(at)) +#define attron(at) wattron(stdscr,(at)) +#define attrset(at) wattrset(stdscr,(at)) +#define bkgd(ch) wbkgd(stdscr,(ch)) +#define bkgdset(ch) wbkgdset(stdscr,(ch)) +#define chgat(n,a,c,o) wchgat(stdscr,(n),(a),(c),(o)) +#define clear() wclear(stdscr) +#define clrtobot() wclrtobot(stdscr) +#define clrtoeol() wclrtoeol(stdscr) +#define color_set(c,o) wcolor_set(stdscr,(c),(o)) +#define delch() wdelch(stdscr) +#define deleteln() winsdelln(stdscr,-1) +#define echochar(c) wechochar(stdscr,(c)) +#define erase() werase(stdscr) +#define getch() wgetch(stdscr) +#define getstr(str) wgetstr(stdscr,(str)) +#define inch() winch(stdscr) +#define inchnstr(s,n) winchnstr(stdscr,(s),(n)) +#define inchstr(s) winchstr(stdscr,(s)) +#define innstr(s,n) winnstr(stdscr,(s),(n)) +#define insch(c) winsch(stdscr,(c)) +#define insdelln(n) winsdelln(stdscr,(n)) +#define insertln() winsdelln(stdscr,1) +#define insnstr(s,n) winsnstr(stdscr,(s),(n)) +#define insstr(s) winsstr(stdscr,(s)) +#define instr(s) winstr(stdscr,(s)) +#define move(y,x) wmove(stdscr,(y),(x)) +#define refresh() wrefresh(stdscr) +#define scrl(n) wscrl(stdscr,(n)) +#define setscrreg(t,b) wsetscrreg(stdscr,(t),(b)) +#define standend() wstandend(stdscr) +#define standout() wstandout(stdscr) +#define timeout(delay) wtimeout(stdscr,(delay)) +#define wdeleteln(win) winsdelln(win,-1) +#define winsertln(win) winsdelln(win,1) + +/* + * mv functions + */ + +#define mvwaddch(win,y,x,ch) (wmove((win),(y),(x)) == ERR ? ERR : waddch((win),(ch))) +#define mvwaddchnstr(win,y,x,str,n) (wmove((win),(y),(x)) == ERR ? ERR : waddchnstr((win),(str),(n))) +#define mvwaddchstr(win,y,x,str) (wmove((win),(y),(x)) == ERR ? ERR : waddchnstr((win),(str),-1)) +#define mvwaddnstr(win,y,x,str,n) (wmove((win),(y),(x)) == ERR ? ERR : waddnstr((win),(str),(n))) +#define mvwaddstr(win,y,x,str) (wmove((win),(y),(x)) == ERR ? ERR : waddnstr((win),(str),-1)) +#define mvwchgat(win,y,x,n,a,c,o) (wmove((win),(y),(x)) == ERR ? ERR : wchgat((win),(n),(a),(c),(o))) +#define mvwdelch(win,y,x) (wmove((win),(y),(x)) == ERR ? ERR : wdelch(win)) +#define mvwgetch(win,y,x) (wmove((win),(y),(x)) == ERR ? ERR : wgetch(win)) +#define mvwgetnstr(win,y,x,str,n) (wmove((win),(y),(x)) == ERR ? ERR : wgetnstr((win),(str),(n))) +#define mvwgetstr(win,y,x,str) (wmove((win),(y),(x)) == ERR ? ERR : wgetstr((win),(str))) +#define mvwhline(win,y,x,c,n) (wmove((win),(y),(x)) == ERR ? ERR : whline((win),(c),(n))) +#define mvwinch(win,y,x) (wmove((win),(y),(x)) == ERR ? NCURSES_CAST(chtype, ERR) : winch(win)) +#define mvwinchnstr(win,y,x,s,n) (wmove((win),(y),(x)) == ERR ? ERR : winchnstr((win),(s),(n))) +#define mvwinchstr(win,y,x,s) (wmove((win),(y),(x)) == ERR ? ERR : winchstr((win),(s))) +#define mvwinnstr(win,y,x,s,n) (wmove((win),(y),(x)) == ERR ? ERR : winnstr((win),(s),(n))) +#define mvwinsch(win,y,x,c) (wmove((win),(y),(x)) == ERR ? ERR : winsch((win),(c))) +#define mvwinsnstr(win,y,x,s,n) (wmove((win),(y),(x)) == ERR ? ERR : winsnstr((win),(s),(n))) +#define mvwinsstr(win,y,x,s) (wmove((win),(y),(x)) == ERR ? ERR : winsstr((win),(s))) +#define mvwinstr(win,y,x,s) (wmove((win),(y),(x)) == ERR ? ERR : winstr((win),(s))) +#define mvwvline(win,y,x,c,n) (wmove((win),(y),(x)) == ERR ? ERR : wvline((win),(c),(n))) + +#define mvaddch(y,x,ch) mvwaddch(stdscr,(y),(x),(ch)) +#define mvaddchnstr(y,x,str,n) mvwaddchnstr(stdscr,(y),(x),(str),(n)) +#define mvaddchstr(y,x,str) mvwaddchstr(stdscr,(y),(x),(str)) +#define mvaddnstr(y,x,str,n) mvwaddnstr(stdscr,(y),(x),(str),(n)) +#define mvaddstr(y,x,str) mvwaddstr(stdscr,(y),(x),(str)) +#define mvchgat(y,x,n,a,c,o) mvwchgat(stdscr,(y),(x),(n),(a),(c),(o)) +#define mvdelch(y,x) mvwdelch(stdscr,(y),(x)) +#define mvgetch(y,x) mvwgetch(stdscr,(y),(x)) +#define mvgetnstr(y,x,str,n) mvwgetnstr(stdscr,(y),(x),(str),(n)) +#define mvgetstr(y,x,str) mvwgetstr(stdscr,(y),(x),(str)) +#define mvhline(y,x,c,n) mvwhline(stdscr,(y),(x),(c),(n)) +#define mvinch(y,x) mvwinch(stdscr,(y),(x)) +#define mvinchnstr(y,x,s,n) mvwinchnstr(stdscr,(y),(x),(s),(n)) +#define mvinchstr(y,x,s) mvwinchstr(stdscr,(y),(x),(s)) +#define mvinnstr(y,x,s,n) mvwinnstr(stdscr,(y),(x),(s),(n)) +#define mvinsch(y,x,c) mvwinsch(stdscr,(y),(x),(c)) +#define mvinsnstr(y,x,s,n) mvwinsnstr(stdscr,(y),(x),(s),(n)) +#define mvinsstr(y,x,s) mvwinsstr(stdscr,(y),(x),(s)) +#define mvinstr(y,x,s) mvwinstr(stdscr,(y),(x),(s)) +#define mvvline(y,x,c,n) mvwvline(stdscr,(y),(x),(c),(n)) + +/* + * Some wide-character functions can be implemented without the extensions. + */ +#if !NCURSES_OPAQUE +#define getbkgd(win) (NCURSES_OK_ADDR(win) ? ((win)->_bkgd) : 0) +#endif /* NCURSES_OPAQUE */ + +#define slk_attr_off(a,v) ((v) ? ERR : slk_attroff(a)) +#define slk_attr_on(a,v) ((v) ? ERR : slk_attron(a)) + +#if !NCURSES_OPAQUE +#if NCURSES_WATTR_MACROS +#if NCURSES_WIDECHAR && @NCURSES_EXT_COLORS@ +#define wattr_set(win,a,p,opts) \ + (NCURSES_OK_ADDR(win) \ + ? ((void)((win)->_attrs = ((a) & ~A_COLOR), \ + (win)->_color = (opts) ? *(int *)(opts) : (p)), \ + OK) \ + : ERR) +#define wattr_get(win,a,p,opts) \ + (NCURSES_OK_ADDR(win) \ + ? ((void)(NCURSES_OK_ADDR(a) \ + ? (*(a) = (win)->_attrs) \ + : OK), \ + (void)(NCURSES_OK_ADDR(p) \ + ? (*(p) = (NCURSES_PAIRS_T) (win)->_color) \ + : OK), \ + (void)(NCURSES_OK_ADDR(opts) \ + ? (*(int *)(opts) = (win)->_color) \ + : OK), \ + OK) \ + : ERR) +#else /* !(NCURSES_WIDECHAR && NCURSES_EXE_COLORS) */ +#define wattr_set(win,a,p,opts) \ + (NCURSES_OK_ADDR(win) \ + ? ((void)((win)->_attrs = (((a) & ~A_COLOR) | \ + (attr_t)COLOR_PAIR(p))), \ + OK) \ + : ERR) +#define wattr_get(win,a,p,opts) \ + (NCURSES_OK_ADDR(win) \ + ? ((void)(NCURSES_OK_ADDR(a) \ + ? (*(a) = (win)->_attrs) \ + : OK), \ + (void)(NCURSES_OK_ADDR(p) \ + ? (*(p) = (NCURSES_PAIRS_T) PAIR_NUMBER((win)->_attrs)) \ + : OK), \ + OK) \ + : ERR) +#endif /* (NCURSES_WIDECHAR && NCURSES_EXE_COLORS) */ +#endif /* NCURSES_WATTR_MACROS */ +#endif /* NCURSES_OPAQUE */ + +/* + * X/Open curses deprecates SVr4 vwprintw/vwscanw, which are supposed to use + * varargs.h. It adds new calls vw_printw/vw_scanw, which are supposed to + * use POSIX stdarg.h. The ncurses versions of vwprintw/vwscanw already + * use stdarg.h, so... + */ +/* define vw_printw vwprintw */ +/* define vw_scanw vwscanw */ + +/* + * Export fallback function for use in C++ binding. + */ +#if !@HAVE_VSSCANF@ +#define vsscanf(a,b,c) _nc_vsscanf(a,b,c) +NCURSES_EXPORT(int) vsscanf(const char *, const char *, va_list); +#endif + +/* + * These macros are extensions - not in X/Open Curses. + */ +#if @NCURSES_EXT_FUNCS@ +#if !NCURSES_OPAQUE +#define is_cleared(win) (NCURSES_OK_ADDR(win) ? (win)->_clear : FALSE) +#define is_idcok(win) (NCURSES_OK_ADDR(win) ? (win)->_idcok : FALSE) +#define is_idlok(win) (NCURSES_OK_ADDR(win) ? (win)->_idlok : FALSE) +#define is_immedok(win) (NCURSES_OK_ADDR(win) ? (win)->_immed : FALSE) +#define is_keypad(win) (NCURSES_OK_ADDR(win) ? (win)->_use_keypad : FALSE) +#define is_leaveok(win) (NCURSES_OK_ADDR(win) ? (win)->_leaveok : FALSE) +#define is_nodelay(win) (NCURSES_OK_ADDR(win) ? ((win)->_delay == 0) : FALSE) +#define is_notimeout(win) (NCURSES_OK_ADDR(win) ? (win)->_notimeout : FALSE) +#define is_pad(win) (NCURSES_OK_ADDR(win) ? ((win)->_flags & _ISPAD) != 0 : FALSE) +#define is_scrollok(win) (NCURSES_OK_ADDR(win) ? (win)->_scroll : FALSE) +#define is_subwin(win) (NCURSES_OK_ADDR(win) ? ((win)->_flags & _SUBWIN) != 0 : FALSE) +#define is_syncok(win) (NCURSES_OK_ADDR(win) ? (win)->_sync : FALSE) +#define wgetdelay(win) (NCURSES_OK_ADDR(win) ? (win)->_delay : 0) +#define wgetparent(win) (NCURSES_OK_ADDR(win) ? (win)->_parent : 0) +#define wgetscrreg(win,t,b) (NCURSES_OK_ADDR(win) ? (*(t) = (win)->_regtop, *(b) = (win)->_regbottom, OK) : ERR) +#endif +#endif + +/* + * X/Open says this returns a bool; SVr4 also checked for out-of-range line. + * The macro provides compatibility: + */ +#define is_linetouched(w,l) ((!(w) || ((l) > getmaxy(w)) || ((l) < 0)) ? ERR : (is_linetouched)((w),(l))) + +#endif /* NCURSES_NOMACROS */ + +/* + * Public variables. + * + * Notes: + * a. ESCDELAY was an undocumented feature under AIX curses. + * It gives the ESC expire time in milliseconds. + * b. ttytype is needed for backward compatibility + */ +#if NCURSES_REENTRANT + +NCURSES_WRAPPED_VAR(WINDOW *, curscr); +NCURSES_WRAPPED_VAR(WINDOW *, newscr); +NCURSES_WRAPPED_VAR(WINDOW *, stdscr); +NCURSES_WRAPPED_VAR(char *, ttytype); +NCURSES_WRAPPED_VAR(int, COLORS); +NCURSES_WRAPPED_VAR(int, COLOR_PAIRS); +NCURSES_WRAPPED_VAR(int, COLS); +NCURSES_WRAPPED_VAR(int, ESCDELAY); +NCURSES_WRAPPED_VAR(int, LINES); +NCURSES_WRAPPED_VAR(int, TABSIZE); + +#define curscr NCURSES_PUBLIC_VAR(curscr()) +#define newscr NCURSES_PUBLIC_VAR(newscr()) +#define stdscr NCURSES_PUBLIC_VAR(stdscr()) +#define ttytype NCURSES_PUBLIC_VAR(ttytype()) +#define COLORS NCURSES_PUBLIC_VAR(COLORS()) +#define COLOR_PAIRS NCURSES_PUBLIC_VAR(COLOR_PAIRS()) +#define COLS NCURSES_PUBLIC_VAR(COLS()) +#define ESCDELAY NCURSES_PUBLIC_VAR(ESCDELAY()) +#define LINES NCURSES_PUBLIC_VAR(LINES()) +#define TABSIZE NCURSES_PUBLIC_VAR(TABSIZE()) + +#else + +extern NCURSES_EXPORT_VAR(WINDOW *) curscr; +extern NCURSES_EXPORT_VAR(WINDOW *) newscr; +extern NCURSES_EXPORT_VAR(WINDOW *) stdscr; +extern NCURSES_EXPORT_VAR(char) ttytype[]; +extern NCURSES_EXPORT_VAR(int) COLORS; +extern NCURSES_EXPORT_VAR(int) COLOR_PAIRS; +extern NCURSES_EXPORT_VAR(int) COLS; +extern NCURSES_EXPORT_VAR(int) ESCDELAY; +extern NCURSES_EXPORT_VAR(int) LINES; +extern NCURSES_EXPORT_VAR(int) TABSIZE; + +#endif + +/* + * Pseudo-character tokens outside ASCII range. The curses wgetch() function + * will return any given one of these only if the corresponding k- capability + * is defined in your terminal's terminfo entry. + * + * Some keys (KEY_A1, etc) are arranged like this: + * a1 up a3 + * left b2 right + * c1 down c3 + * + * A few key codes do not depend upon the terminfo entry. + */ +#define KEY_CODE_YES 0400 /* A wchar_t contains a key code */ +#define KEY_MIN 0401 /* Minimum curses key */ +#define KEY_BREAK 0401 /* Break key (unreliable) */ +#define KEY_SRESET 0530 /* Soft (partial) reset (unreliable) */ +#define KEY_RESET 0531 /* Reset or hard reset (unreliable) */ diff --git a/contrib/ncurses/include/curses.tail b/contrib/ncurses/include/curses.tail new file mode 100644 index 00000000..9c913565 --- /dev/null +++ b/contrib/ncurses/include/curses.tail @@ -0,0 +1,197 @@ +/* $Id: curses.tail,v 1.27 2023/08/05 19:43:46 tom Exp $ */ +/* + * vile:cmode: + * This file is part of ncurses, designed to be appended after curses.h.in + * (see that file for the relevant copyright). + */ + +/* mouse interface */ + +#if NCURSES_MOUSE_VERSION > 1 +#define NCURSES_MOUSE_MASK(b,m) ((m) << (((b) - 1) * 5)) +#else +#define NCURSES_MOUSE_MASK(b,m) ((m) << (((b) - 1) * 6)) +#endif + +#define NCURSES_BUTTON_RELEASED 001UL +#define NCURSES_BUTTON_PRESSED 002UL +#define NCURSES_BUTTON_CLICKED 004UL +#define NCURSES_DOUBLE_CLICKED 010UL +#define NCURSES_TRIPLE_CLICKED 020UL +#define NCURSES_RESERVED_EVENT 040UL + +/* event masks */ +#define BUTTON1_RELEASED NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_RELEASED) +#define BUTTON1_PRESSED NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_PRESSED) +#define BUTTON1_CLICKED NCURSES_MOUSE_MASK(1, NCURSES_BUTTON_CLICKED) +#define BUTTON1_DOUBLE_CLICKED NCURSES_MOUSE_MASK(1, NCURSES_DOUBLE_CLICKED) +#define BUTTON1_TRIPLE_CLICKED NCURSES_MOUSE_MASK(1, NCURSES_TRIPLE_CLICKED) + +#define BUTTON2_RELEASED NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_RELEASED) +#define BUTTON2_PRESSED NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_PRESSED) +#define BUTTON2_CLICKED NCURSES_MOUSE_MASK(2, NCURSES_BUTTON_CLICKED) +#define BUTTON2_DOUBLE_CLICKED NCURSES_MOUSE_MASK(2, NCURSES_DOUBLE_CLICKED) +#define BUTTON2_TRIPLE_CLICKED NCURSES_MOUSE_MASK(2, NCURSES_TRIPLE_CLICKED) + +#define BUTTON3_RELEASED NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_RELEASED) +#define BUTTON3_PRESSED NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_PRESSED) +#define BUTTON3_CLICKED NCURSES_MOUSE_MASK(3, NCURSES_BUTTON_CLICKED) +#define BUTTON3_DOUBLE_CLICKED NCURSES_MOUSE_MASK(3, NCURSES_DOUBLE_CLICKED) +#define BUTTON3_TRIPLE_CLICKED NCURSES_MOUSE_MASK(3, NCURSES_TRIPLE_CLICKED) + +#define BUTTON4_RELEASED NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_RELEASED) +#define BUTTON4_PRESSED NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_PRESSED) +#define BUTTON4_CLICKED NCURSES_MOUSE_MASK(4, NCURSES_BUTTON_CLICKED) +#define BUTTON4_DOUBLE_CLICKED NCURSES_MOUSE_MASK(4, NCURSES_DOUBLE_CLICKED) +#define BUTTON4_TRIPLE_CLICKED NCURSES_MOUSE_MASK(4, NCURSES_TRIPLE_CLICKED) + +/* + * In 32 bits the version-1 scheme does not provide enough space for a 5th + * button, unless we choose to change the ABI by omitting the reserved-events. + */ +#if NCURSES_MOUSE_VERSION > 1 + +#define BUTTON5_RELEASED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_RELEASED) +#define BUTTON5_PRESSED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_PRESSED) +#define BUTTON5_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_CLICKED) +#define BUTTON5_DOUBLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_DOUBLE_CLICKED) +#define BUTTON5_TRIPLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_TRIPLE_CLICKED) + +#define BUTTON_CTRL NCURSES_MOUSE_MASK(6, 0001L) +#define BUTTON_SHIFT NCURSES_MOUSE_MASK(6, 0002L) +#define BUTTON_ALT NCURSES_MOUSE_MASK(6, 0004L) +#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(6, 0010L) + +#else + +#define BUTTON1_RESERVED_EVENT NCURSES_MOUSE_MASK(1, NCURSES_RESERVED_EVENT) +#define BUTTON2_RESERVED_EVENT NCURSES_MOUSE_MASK(2, NCURSES_RESERVED_EVENT) +#define BUTTON3_RESERVED_EVENT NCURSES_MOUSE_MASK(3, NCURSES_RESERVED_EVENT) +#define BUTTON4_RESERVED_EVENT NCURSES_MOUSE_MASK(4, NCURSES_RESERVED_EVENT) + +#define BUTTON_CTRL NCURSES_MOUSE_MASK(5, 0001L) +#define BUTTON_SHIFT NCURSES_MOUSE_MASK(5, 0002L) +#define BUTTON_ALT NCURSES_MOUSE_MASK(5, 0004L) +#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(5, 0010L) + +#endif + +#define ALL_MOUSE_EVENTS (REPORT_MOUSE_POSITION - 1) + +/* macros to extract single event-bits from masks */ +#define BUTTON_RELEASE(e, x) ((e) & NCURSES_MOUSE_MASK(x, 001)) +#define BUTTON_PRESS(e, x) ((e) & NCURSES_MOUSE_MASK(x, 002)) +#define BUTTON_CLICK(e, x) ((e) & NCURSES_MOUSE_MASK(x, 004)) +#define BUTTON_DOUBLE_CLICK(e, x) ((e) & NCURSES_MOUSE_MASK(x, 010)) +#define BUTTON_TRIPLE_CLICK(e, x) ((e) & NCURSES_MOUSE_MASK(x, 020)) +#define BUTTON_RESERVED_EVENT(e, x) ((e) & NCURSES_MOUSE_MASK(x, 040)) + +typedef struct +{ + short id; /* ID to distinguish multiple devices */ + int x, y, z; /* event coordinates (character-cell) */ + mmask_t bstate; /* button state bits */ +} +MEVENT; + +extern NCURSES_EXPORT(bool) has_mouse(void); +extern NCURSES_EXPORT(int) getmouse (MEVENT *); +extern NCURSES_EXPORT(int) ungetmouse (MEVENT *); +extern NCURSES_EXPORT(mmask_t) mousemask (mmask_t, mmask_t *); +extern NCURSES_EXPORT(bool) wenclose (const WINDOW *, int, int); +extern NCURSES_EXPORT(int) mouseinterval (int); +extern NCURSES_EXPORT(bool) wmouse_trafo (const WINDOW*, int*, int*, bool); +extern NCURSES_EXPORT(bool) mouse_trafo (int*, int*, bool); /* generated */ + +#if NCURSES_SP_FUNCS +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(has_mouse) (SCREEN*); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(getmouse) (SCREEN*, MEVENT *); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(ungetmouse) (SCREEN*,MEVENT *); +extern NCURSES_EXPORT(mmask_t) NCURSES_SP_NAME(mousemask) (SCREEN*, mmask_t, mmask_t *); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mouseinterval) (SCREEN*, int); +#endif + +#ifndef NCURSES_NOMACROS +#define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen) +#endif + +/* other non-XSI functions */ + +extern NCURSES_EXPORT(int) mcprint (char *, int); /* direct data to printer */ +extern NCURSES_EXPORT(int) has_key (int); /* do we have given key? */ + +#if NCURSES_SP_FUNCS +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(has_key) (SCREEN*, int); /* do we have given key? */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(mcprint) (SCREEN*, char *, int); /* direct data to printer */ +#endif + +/* Debugging : use with libncurses_g.a */ + +extern NCURSES_EXPORT(void) _tracef (const char *, ...) GCC_PRINTFLIKE(1,2); +extern NCURSES_EXPORT(char *) _traceattr (attr_t); +extern NCURSES_EXPORT(char *) _traceattr2 (int, chtype); +extern NCURSES_EXPORT(char *) _tracechar (int); +extern NCURSES_EXPORT(char *) _tracechtype (chtype); +extern NCURSES_EXPORT(char *) _tracechtype2 (int, chtype); +#if NCURSES_WIDECHAR +#define _tracech_t _tracecchar_t +extern NCURSES_EXPORT(char *) _tracecchar_t (const cchar_t *); +#define _tracech_t2 _tracecchar_t2 +extern NCURSES_EXPORT(char *) _tracecchar_t2 (int, const cchar_t *); +#else +#define _tracech_t _tracechtype +#define _tracech_t2 _tracechtype2 +#endif +extern NCURSES_EXPORT(void) trace (const unsigned) GCC_DEPRECATED("use curses_trace"); +extern NCURSES_EXPORT(unsigned) curses_trace (const unsigned); + +/* trace masks */ +#define TRACE_DISABLE 0x0000 /* turn off tracing */ +#define TRACE_TIMES 0x0001 /* trace user and system times of updates */ +#define TRACE_TPUTS 0x0002 /* trace tputs calls */ +#define TRACE_UPDATE 0x0004 /* trace update actions, old & new screens */ +#define TRACE_MOVE 0x0008 /* trace cursor moves and scrolls */ +#define TRACE_CHARPUT 0x0010 /* trace all character outputs */ +#define TRACE_ORDINARY 0x001F /* trace all update actions */ +#define TRACE_CALLS 0x0020 /* trace all curses calls */ +#define TRACE_VIRTPUT 0x0040 /* trace virtual character puts */ +#define TRACE_IEVENT 0x0080 /* trace low-level input processing */ +#define TRACE_BITS 0x0100 /* trace state of TTY control bits */ +#define TRACE_ICALLS 0x0200 /* trace internal/nested calls */ +#define TRACE_CCALLS 0x0400 /* trace per-character calls */ +#define TRACE_DATABASE 0x0800 /* trace read/write of terminfo/termcap data */ +#define TRACE_ATTRS 0x1000 /* trace attribute updates */ + +#define TRACE_SHIFT 13 /* number of bits in the trace masks */ +#define TRACE_MAXIMUM ((1 << TRACE_SHIFT) - 1) /* maximum trace level */ + +#if defined(TRACE) || defined(NCURSES_TEST) +extern NCURSES_EXPORT_VAR(int) _nc_optimize_enable; /* enable optimizations */ +extern NCURSES_EXPORT(const char *) _nc_visbuf (const char *); +#define OPTIMIZE_MVCUR 0x01 /* cursor movement optimization */ +#define OPTIMIZE_HASHMAP 0x02 /* diff hashing to detect scrolls */ +#define OPTIMIZE_SCROLL 0x04 /* scroll optimization */ +#define OPTIMIZE_ALL 0xff /* enable all optimizations (dflt) */ +#endif + +extern GCC_NORETURN NCURSES_EXPORT(void) exit_curses (int); + +#include + +#ifdef __cplusplus + +#ifndef NCURSES_NOMACROS + +/* these names conflict with STL */ +#undef box +#undef clear +#undef erase +#undef move +#undef refresh + +#endif /* NCURSES_NOMACROS */ + +} +#endif + +#endif /* __NCURSES_H */ diff --git a/contrib/ncurses/include/curses.wide b/contrib/ncurses/include/curses.wide new file mode 100644 index 00000000..33adb070 --- /dev/null +++ b/contrib/ncurses/include/curses.wide @@ -0,0 +1,314 @@ +/* $Id: curses.wide,v 1.51 2021/05/22 20:28:29 tom Exp $ */ +/* + * vile:cmode: + * This file is part of ncurses, designed to be appended after curses.h.in + * (see that file for the relevant copyright). + */ +#define _XOPEN_CURSES 1 + +#if NCURSES_WIDECHAR + +extern NCURSES_EXPORT_VAR(cchar_t *) _nc_wacs; + +#define NCURSES_WACS(c) (&_nc_wacs[NCURSES_CAST(unsigned char,(c))]) + +#define WACS_BSSB NCURSES_WACS('l') +#define WACS_SSBB NCURSES_WACS('m') +#define WACS_BBSS NCURSES_WACS('k') +#define WACS_SBBS NCURSES_WACS('j') +#define WACS_SBSS NCURSES_WACS('u') +#define WACS_SSSB NCURSES_WACS('t') +#define WACS_SSBS NCURSES_WACS('v') +#define WACS_BSSS NCURSES_WACS('w') +#define WACS_BSBS NCURSES_WACS('q') +#define WACS_SBSB NCURSES_WACS('x') +#define WACS_SSSS NCURSES_WACS('n') + +#define WACS_ULCORNER WACS_BSSB +#define WACS_LLCORNER WACS_SSBB +#define WACS_URCORNER WACS_BBSS +#define WACS_LRCORNER WACS_SBBS +#define WACS_RTEE WACS_SBSS +#define WACS_LTEE WACS_SSSB +#define WACS_BTEE WACS_SSBS +#define WACS_TTEE WACS_BSSS +#define WACS_HLINE WACS_BSBS +#define WACS_VLINE WACS_SBSB +#define WACS_PLUS WACS_SSSS + +#define WACS_S1 NCURSES_WACS('o') /* scan line 1 */ +#define WACS_S9 NCURSES_WACS('s') /* scan line 9 */ +#define WACS_DIAMOND NCURSES_WACS('`') /* diamond */ +#define WACS_CKBOARD NCURSES_WACS('a') /* checker board */ +#define WACS_DEGREE NCURSES_WACS('f') /* degree symbol */ +#define WACS_PLMINUS NCURSES_WACS('g') /* plus/minus */ +#define WACS_BULLET NCURSES_WACS('~') /* bullet */ + + /* Teletype 5410v1 symbols */ +#define WACS_LARROW NCURSES_WACS(',') /* arrow left */ +#define WACS_RARROW NCURSES_WACS('+') /* arrow right */ +#define WACS_DARROW NCURSES_WACS('.') /* arrow down */ +#define WACS_UARROW NCURSES_WACS('-') /* arrow up */ +#define WACS_BOARD NCURSES_WACS('h') /* board of squares */ +#define WACS_LANTERN NCURSES_WACS('i') /* lantern symbol */ +#define WACS_BLOCK NCURSES_WACS('0') /* solid square block */ + + /* ncurses extensions */ +#define WACS_S3 NCURSES_WACS('p') /* scan line 3 */ +#define WACS_S7 NCURSES_WACS('r') /* scan line 7 */ +#define WACS_LEQUAL NCURSES_WACS('y') /* less/equal */ +#define WACS_GEQUAL NCURSES_WACS('z') /* greater/equal */ +#define WACS_PI NCURSES_WACS('{') /* Pi */ +#define WACS_NEQUAL NCURSES_WACS('|') /* not equal */ +#define WACS_STERLING NCURSES_WACS('}') /* UK pound sign */ + + /* double lines */ +#define WACS_BDDB NCURSES_WACS('C') +#define WACS_DDBB NCURSES_WACS('D') +#define WACS_BBDD NCURSES_WACS('B') +#define WACS_DBBD NCURSES_WACS('A') +#define WACS_DBDD NCURSES_WACS('G') +#define WACS_DDDB NCURSES_WACS('F') +#define WACS_DDBD NCURSES_WACS('H') +#define WACS_BDDD NCURSES_WACS('I') +#define WACS_BDBD NCURSES_WACS('R') +#define WACS_DBDB NCURSES_WACS('Y') +#define WACS_DDDD NCURSES_WACS('E') + +#define WACS_D_ULCORNER WACS_BDDB +#define WACS_D_LLCORNER WACS_DDBB +#define WACS_D_URCORNER WACS_BBDD +#define WACS_D_LRCORNER WACS_DBBD +#define WACS_D_RTEE WACS_DBDD +#define WACS_D_LTEE WACS_DDDB +#define WACS_D_BTEE WACS_DDBD +#define WACS_D_TTEE WACS_BDDD +#define WACS_D_HLINE WACS_BDBD +#define WACS_D_VLINE WACS_DBDB +#define WACS_D_PLUS WACS_DDDD + + /* thick lines */ +#define WACS_BTTB NCURSES_WACS('L') +#define WACS_TTBB NCURSES_WACS('M') +#define WACS_BBTT NCURSES_WACS('K') +#define WACS_TBBT NCURSES_WACS('J') +#define WACS_TBTT NCURSES_WACS('U') +#define WACS_TTTB NCURSES_WACS('T') +#define WACS_TTBT NCURSES_WACS('V') +#define WACS_BTTT NCURSES_WACS('W') +#define WACS_BTBT NCURSES_WACS('Q') +#define WACS_TBTB NCURSES_WACS('X') +#define WACS_TTTT NCURSES_WACS('N') + +#define WACS_T_ULCORNER WACS_BTTB +#define WACS_T_LLCORNER WACS_TTBB +#define WACS_T_URCORNER WACS_BBTT +#define WACS_T_LRCORNER WACS_TBBT +#define WACS_T_RTEE WACS_TBTT +#define WACS_T_LTEE WACS_TTTB +#define WACS_T_BTEE WACS_TTBT +#define WACS_T_TTEE WACS_BTTT +#define WACS_T_HLINE WACS_BTBT +#define WACS_T_VLINE WACS_TBTB +#define WACS_T_PLUS WACS_TTTT + +/* + * Function prototypes for wide-character operations. + * + * "generated" comments should include ":WIDEC" to make the corresponding + * functions ifdef'd in lib_gen.c + * + * "implemented" comments do not need this marker. + */ + +extern NCURSES_EXPORT(int) add_wch (const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) add_wchnstr (const cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) add_wchstr (const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) addnwstr (const wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) addwstr (const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) bkgrnd (const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(void) bkgrndset (const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) border_set (const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) box_set (WINDOW *, const cchar_t *, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) echo_wchar (const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) erasewchar (wchar_t*); /* implemented */ +extern NCURSES_EXPORT(int) get_wch (wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) get_wstr (wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) getbkgrnd (cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) getcchar (const cchar_t *, wchar_t*, attr_t*, NCURSES_PAIRS_T*, void*); /* implemented */ +extern NCURSES_EXPORT(int) getn_wstr (wint_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) hline_set (const cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) in_wch (cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) in_wchnstr (cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) in_wchstr (cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) innwstr (wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) ins_nwstr (const wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) ins_wch (const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) ins_wstr (const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) inwstr (wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(NCURSES_CONST char*) key_name (wchar_t); /* implemented */ +extern NCURSES_EXPORT(int) killwchar (wchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) mvadd_wch (int, int, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvadd_wchnstr (int, int, const cchar_t *, int);/* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvadd_wchstr (int, int, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvaddnwstr (int, int, const wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvaddwstr (int, int, const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvget_wch (int, int, wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvget_wstr (int, int, wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvgetn_wstr (int, int, wint_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvhline_set (int, int, const cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvin_wch (int, int, cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvin_wchnstr (int, int, cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvin_wchstr (int, int, cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvinnwstr (int, int, wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvins_nwstr (int, int, const wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvins_wch (int, int, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvins_wstr (int, int, const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvinwstr (int, int, wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvvline_set (int, int, const cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwadd_wch (WINDOW *, int, int, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwadd_wchnstr (WINDOW *, int, int, const cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwadd_wchstr (WINDOW *, int, int, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwaddnwstr (WINDOW *, int, int, const wchar_t *, int);/* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwaddwstr (WINDOW *, int, int, const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwget_wch (WINDOW *, int, int, wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwget_wstr (WINDOW *, int, int, wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwgetn_wstr (WINDOW *, int, int, wint_t *, int);/* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwhline_set (WINDOW *, int, int, const cchar_t *, int);/* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwin_wch (WINDOW *, int, int, cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwin_wchnstr (WINDOW *, int,int, cchar_t *,int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwin_wchstr (WINDOW *, int, int, cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwinnwstr (WINDOW *, int, int, wchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwins_nwstr (WINDOW *, int,int, const wchar_t *,int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwins_wch (WINDOW *, int, int, const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwins_wstr (WINDOW *, int, int, const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwinwstr (WINDOW *, int, int, wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) mvwvline_set (WINDOW *, int,int, const cchar_t *,int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) pecho_wchar (WINDOW *, const cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) setcchar (cchar_t *, const wchar_t *, const attr_t, NCURSES_PAIRS_T, const void *); /* implemented */ +extern NCURSES_EXPORT(int) slk_wset (int, const wchar_t *, int); /* implemented */ +extern NCURSES_EXPORT(attr_t) term_attrs (void); /* implemented */ +extern NCURSES_EXPORT(int) unget_wch (const wchar_t); /* implemented */ +extern NCURSES_EXPORT(int) vid_attr (attr_t, NCURSES_PAIRS_T, void *); /* implemented */ +extern NCURSES_EXPORT(int) vid_puts (attr_t, NCURSES_PAIRS_T, void *, NCURSES_OUTC); /* implemented */ +extern NCURSES_EXPORT(int) vline_set (const cchar_t *, int); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) wadd_wch (WINDOW *,const cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) wadd_wchnstr (WINDOW *,const cchar_t *,int); /* implemented */ +extern NCURSES_EXPORT(int) wadd_wchstr (WINDOW *,const cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) waddnwstr (WINDOW *,const wchar_t *,int); /* implemented */ +extern NCURSES_EXPORT(int) waddwstr (WINDOW *,const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) wbkgrnd (WINDOW *,const cchar_t *); /* implemented */ +extern NCURSES_EXPORT(void) wbkgrndset (WINDOW *,const cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) wborder_set (WINDOW *,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*,const cchar_t*); /* implemented */ +extern NCURSES_EXPORT(int) wecho_wchar (WINDOW *, const cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) wget_wch (WINDOW *, wint_t *); /* implemented */ +extern NCURSES_EXPORT(int) wget_wstr (WINDOW *, wint_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) wgetbkgrnd (WINDOW *, cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) wgetn_wstr (WINDOW *, wint_t *, int); /* implemented */ +extern NCURSES_EXPORT(int) whline_set (WINDOW *, const cchar_t *, int); /* implemented */ +extern NCURSES_EXPORT(int) win_wch (WINDOW *, cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) win_wchnstr (WINDOW *, cchar_t *, int); /* implemented */ +extern NCURSES_EXPORT(int) win_wchstr (WINDOW *, cchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) winnwstr (WINDOW *, wchar_t *, int); /* implemented */ +extern NCURSES_EXPORT(int) wins_nwstr (WINDOW *, const wchar_t *, int); /* implemented */ +extern NCURSES_EXPORT(int) wins_wch (WINDOW *, const cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) wins_wstr (WINDOW *, const wchar_t *); /* generated:WIDEC */ +extern NCURSES_EXPORT(int) winwstr (WINDOW *, wchar_t *); /* implemented */ +extern NCURSES_EXPORT(wchar_t*) wunctrl (cchar_t *); /* implemented */ +extern NCURSES_EXPORT(int) wvline_set (WINDOW *, const cchar_t *, int); /* implemented */ + +#if NCURSES_SP_FUNCS +extern NCURSES_EXPORT(attr_t) NCURSES_SP_NAME(term_attrs) (SCREEN*); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(erasewchar) (SCREEN*, wchar_t *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(killwchar) (SCREEN*, wchar_t *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(unget_wch) (SCREEN*, const wchar_t); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_attr) (SCREEN*, attr_t, NCURSES_PAIRS_T, void *); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(vid_puts) (SCREEN*, attr_t, NCURSES_PAIRS_T, void *, NCURSES_SP_OUTC); /* implemented:SP_FUNC */ +extern NCURSES_EXPORT(wchar_t*) NCURSES_SP_NAME(wunctrl) (SCREEN*, cchar_t *); /* implemented:SP_FUNC */ +#endif + +#ifndef NCURSES_NOMACROS + +/* + * XSI curses macros for XPG4 conformance. + */ +#define add_wch(c) wadd_wch(stdscr,(c)) +#define add_wchnstr(str,n) wadd_wchnstr(stdscr,(str),(n)) +#define add_wchstr(str) wadd_wchstr(stdscr,(str)) +#define addnwstr(wstr,n) waddnwstr(stdscr,(wstr),(n)) +#define addwstr(wstr) waddwstr(stdscr,(wstr)) +#define bkgrnd(c) wbkgrnd(stdscr,(c)) +#define bkgrndset(c) wbkgrndset(stdscr,(c)) +#define border_set(l,r,t,b,tl,tr,bl,br) wborder_set(stdscr,(l),(r),(t),(b),tl,tr,bl,br) +#define box_set(w,v,h) wborder_set((w),(v),(v),(h),(h),0,0,0,0) +#define echo_wchar(c) wecho_wchar(stdscr,(c)) +#define get_wch(c) wget_wch(stdscr,(c)) +#define get_wstr(t) wget_wstr(stdscr,(t)) +#define getbkgrnd(wch) wgetbkgrnd(stdscr,(wch)) +#define getn_wstr(t,n) wgetn_wstr(stdscr,(t),(n)) +#define hline_set(c,n) whline_set(stdscr,(c),(n)) +#define in_wch(c) win_wch(stdscr,(c)) +#define in_wchnstr(c,n) win_wchnstr(stdscr,(c),(n)) +#define in_wchstr(c) win_wchstr(stdscr,(c)) +#define innwstr(c,n) winnwstr(stdscr,(c),(n)) +#define ins_nwstr(t,n) wins_nwstr(stdscr,(t),(n)) +#define ins_wch(c) wins_wch(stdscr,(c)) +#define ins_wstr(t) wins_wstr(stdscr,(t)) +#define inwstr(c) winwstr(stdscr,(c)) +#define vline_set(c,n) wvline_set(stdscr,(c),(n)) +#define wadd_wchstr(win,str) wadd_wchnstr((win),(str),-1) +#define waddwstr(win,wstr) waddnwstr((win),(wstr),-1) +#define wget_wstr(w,t) wgetn_wstr((w),(t),-1) +#define win_wchstr(w,c) win_wchnstr((w),(c),-1) +#define wins_wstr(w,t) wins_nwstr((w),(t),-1) + +#if !NCURSES_OPAQUE +#define wgetbkgrnd(win,wch) (NCURSES_OK_ADDR(wch) ? ((win) ? (*(wch) = (win)->_bkgrnd) : *(wch), OK) : ERR) +#endif + +#define mvadd_wch(y,x,c) mvwadd_wch(stdscr,(y),(x),(c)) +#define mvadd_wchnstr(y,x,s,n) mvwadd_wchnstr(stdscr,(y),(x),(s),(n)) +#define mvadd_wchstr(y,x,s) mvwadd_wchstr(stdscr,(y),(x),(s)) +#define mvaddnwstr(y,x,wstr,n) mvwaddnwstr(stdscr,(y),(x),(wstr),(n)) +#define mvaddwstr(y,x,wstr) mvwaddwstr(stdscr,(y),(x),(wstr)) +#define mvget_wch(y,x,c) mvwget_wch(stdscr,(y),(x),(c)) +#define mvget_wstr(y,x,t) mvwget_wstr(stdscr,(y),(x),(t)) +#define mvgetn_wstr(y,x,t,n) mvwgetn_wstr(stdscr,(y),(x),(t),(n)) +#define mvhline_set(y,x,c,n) mvwhline_set(stdscr,(y),(x),(c),(n)) +#define mvin_wch(y,x,c) mvwin_wch(stdscr,(y),(x),(c)) +#define mvin_wchnstr(y,x,c,n) mvwin_wchnstr(stdscr,(y),(x),(c),(n)) +#define mvin_wchstr(y,x,c) mvwin_wchstr(stdscr,(y),(x),(c)) +#define mvinnwstr(y,x,c,n) mvwinnwstr(stdscr,(y),(x),(c),(n)) +#define mvins_nwstr(y,x,t,n) mvwins_nwstr(stdscr,(y),(x),(t),(n)) +#define mvins_wch(y,x,c) mvwins_wch(stdscr,(y),(x),(c)) +#define mvins_wstr(y,x,t) mvwins_wstr(stdscr,(y),(x),(t)) +#define mvinwstr(y,x,c) mvwinwstr(stdscr,(y),(x),(c)) +#define mvvline_set(y,x,c,n) mvwvline_set(stdscr,(y),(x),(c),(n)) + +#define mvwadd_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : wadd_wch((win),(c))) +#define mvwadd_wchnstr(win,y,x,s,n) (wmove(win,(y),(x)) == ERR ? ERR : wadd_wchnstr((win),(s),(n))) +#define mvwadd_wchstr(win,y,x,s) (wmove(win,(y),(x)) == ERR ? ERR : wadd_wchstr((win),(s))) +#define mvwaddnwstr(win,y,x,wstr,n) (wmove(win,(y),(x)) == ERR ? ERR : waddnwstr((win),(wstr),(n))) +#define mvwaddwstr(win,y,x,wstr) (wmove(win,(y),(x)) == ERR ? ERR : waddwstr((win),(wstr))) +#define mvwget_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : wget_wch((win),(c))) +#define mvwget_wstr(win,y,x,t) (wmove(win,(y),(x)) == ERR ? ERR : wget_wstr((win),(t))) +#define mvwgetn_wstr(win,y,x,t,n) (wmove(win,(y),(x)) == ERR ? ERR : wgetn_wstr((win),(t),(n))) +#define mvwhline_set(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : whline_set((win),(c),(n))) +#define mvwin_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : win_wch((win),(c))) +#define mvwin_wchnstr(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : win_wchnstr((win),(c),(n))) +#define mvwin_wchstr(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : win_wchstr((win),(c))) +#define mvwinnwstr(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : winnwstr((win),(c),(n))) +#define mvwins_nwstr(win,y,x,t,n) (wmove(win,(y),(x)) == ERR ? ERR : wins_nwstr((win),(t),(n))) +#define mvwins_wch(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : wins_wch((win),(c))) +#define mvwins_wstr(win,y,x,t) (wmove(win,(y),(x)) == ERR ? ERR : wins_wstr((win),(t))) +#define mvwinwstr(win,y,x,c) (wmove(win,(y),(x)) == ERR ? ERR : winwstr((win),(c))) +#define mvwvline_set(win,y,x,c,n) (wmove(win,(y),(x)) == ERR ? ERR : wvline_set((win),(c),(n))) + +#endif /* NCURSES_NOMACROS */ + +#if defined(TRACE) || defined(NCURSES_TEST) +extern NCURSES_EXPORT(const char *) _nc_viswbuf(const wchar_t *); +extern NCURSES_EXPORT(const char *) _nc_viswibuf(const wint_t *); +#endif + +#endif /* NCURSES_WIDECHAR */ diff --git a/contrib/ncurses/include/edit_cfg.sh b/contrib/ncurses/include/edit_cfg.sh new file mode 100755 index 00000000..559b1575 --- /dev/null +++ b/contrib/ncurses/include/edit_cfg.sh @@ -0,0 +1,69 @@ +#!/bin/sh +# $Id: edit_cfg.sh,v 1.16 2022/07/16 18:02:32 tom Exp $ +############################################################################## +# Copyright 2020,2022 Thomas E. Dickey # +# Copyright 1998-2001,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996,1997,2000 +# +# Edit the default value of the term.h file based on the autoconf-generated +# values: +# +# $1 = ncurses_cfg.h +# $2 = term.h +# +BAK=save$$ +TMP=edit$$ +trap "rm -f $BAK $TMP; exit 1" 1 2 3 15 +trap "rm -f $BAK $TMP" 0 +for name in \ + HAVE_TCGETATTR \ + HAVE_TERMIOS_H \ + HAVE_TERMIO_H \ + BROKEN_LINKER +do + mv "$2" "$BAK" + if ( grep "[ ]${name}[ ]" "$1" >$TMP 2>&1 ) + then + value=1 + else + value=0 + fi + echo '** edit: '$name $value + sed \ + -e "s@#define ${name}.*\$@#define $name $value@" \ + -e "s@#if $name\$@#if $value /* $name */@" \ + -e "s@#if !$name\$@#if $value /* !$name */@" \ + "$BAK" >"$2" + if (cmp -s "$2" "$BAK") + then + mv "$BAK" "$2" + else + rm -f "$BAK" + fi +done diff --git a/contrib/ncurses/include/hashed_db.h b/contrib/ncurses/include/hashed_db.h new file mode 100644 index 00000000..584fd968 --- /dev/null +++ b/contrib/ncurses/include/hashed_db.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2006-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2006 * + ****************************************************************************/ + +/* + * $Id: hashed_db.h,v 1.9 2020/02/02 23:34:34 tom Exp $ + */ + +#ifndef HASHED_DB_H +#define HASHED_DB_H 1 + +#include + +#include + +#if USE_HASHED_DB + +#define DB_DBM_HSEARCH 0 /* quiet gcc -Wundef with db6 */ + +#include + +#ifndef DBM_SUFFIX +#define DBM_SUFFIX ".db" +#endif + +#ifdef DB_VERSION_MAJOR +#define HASHED_DB_API DB_VERSION_MAJOR +#else +#define HASHED_DB_API 1 /* e.g., db 1.8.5 */ +#endif + +extern NCURSES_EXPORT(DB *) _nc_db_open(const char * /* path */, bool /* modify */); +extern NCURSES_EXPORT(bool) _nc_db_have_data(DBT * /* key */, DBT * /* data */, char ** /* buffer */, int * /* size */); +extern NCURSES_EXPORT(bool) _nc_db_have_index(DBT * /* key */, DBT * /* data */, char ** /* buffer */, int * /* size */); +extern NCURSES_EXPORT(int) _nc_db_close(DB * /* db */); +extern NCURSES_EXPORT(int) _nc_db_first(DB * /* db */, DBT * /* key */, DBT * /* data */); +extern NCURSES_EXPORT(int) _nc_db_next(DB * /* db */, DBT * /* key */, DBT * /* data */); +extern NCURSES_EXPORT(int) _nc_db_get(DB * /* db */, DBT * /* key */, DBT * /* data */); +extern NCURSES_EXPORT(int) _nc_db_put(DB * /* db */, DBT * /* key */, DBT * /* data */); + +#endif + +#endif /* HASHED_DB_H */ diff --git a/contrib/ncurses/include/headers b/contrib/ncurses/include/headers new file mode 100644 index 00000000..e1293b28 --- /dev/null +++ b/contrib/ncurses/include/headers @@ -0,0 +1,53 @@ +# $Id: headers,v 1.16 2023/04/22 12:09:09 tom Exp $ +############################################################################## +# Copyright 2020,2023 Thomas E. Dickey # +# Copyright 1998-2012,2013 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +curses.h +unctrl.h +ncurses_dll.h + +# Support for termcap (and tic, etc.), which can be a separate library +@ termlib +term.h +termcap.h + +# Header used by tack 1.08 +@ ticlib +$(srcdir)/term_entry.h + +# Porting +@ port_win32con +$(srcdir)/ncurses_mingw.h +$(srcdir)/nc_mingw.h +@ port_win32 +$(srcdir)/win32_curses.h + +# vile:makemode diff --git a/contrib/ncurses/include/nc_access.h b/contrib/ncurses/include/nc_access.h new file mode 100644 index 00000000..1d2fb0a4 --- /dev/null +++ b/contrib/ncurses/include/nc_access.h @@ -0,0 +1,80 @@ +/**************************************************************************** + * Copyright 2021,2023 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* $Id: nc_access.h,v 1.6 2023/05/06 10:54:55 tom Exp $ */ + +#ifndef NC_ACCESS_included +#define NC_ACCESS_included 1 +/* *INDENT-OFF* */ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Turn off the 'use_terminfo_vars()' symbol to limit access to environment + * variables when running with privileges. + */ +#if defined(USE_ROOT_ENVIRON) && defined(USE_SETUID_ENVIRON) +#define use_terminfo_vars() 1 +#else +#define use_terminfo_vars() _nc_env_access() +#endif + +extern NCURSES_EXPORT(int) _nc_env_access (void); + +/* + * Turn off this symbol to limit access to files when running setuid. + */ +#ifdef USE_ROOT_ACCESS + +#define safe_fopen(name,mode) fopen(name,mode) +#define safe_open2(name,flags) open(name,flags) +#define safe_open3(name,flags,mode) open(name,flags,mode) + +#else + +#define safe_fopen(name,mode) _nc_safe_fopen(name,mode) +#define safe_open2(name,flags) _nc_safe_open3(name,flags,0) +#define safe_open3(name,flags,mode) _nc_safe_open3(name,flags,mode) +extern NCURSES_EXPORT(FILE *) _nc_safe_fopen (const char *, const char *); +extern NCURSES_EXPORT(int) _nc_safe_open3 (const char *, int, mode_t); + +#endif + +#ifdef __cplusplus +} +#endif + +/* *INDENT-ON* */ + +#endif /* NC_ACCESS_included */ diff --git a/contrib/ncurses/include/nc_alloc.h b/contrib/ncurses/include/nc_alloc.h new file mode 100644 index 00000000..cfea2beb --- /dev/null +++ b/contrib/ncurses/include/nc_alloc.h @@ -0,0 +1,127 @@ +/**************************************************************************** + * Copyright 2019-2020,2021 Thomas E. Dickey * + * Copyright 1998-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ +/* $Id: nc_alloc.h,v 1.30 2021/11/20 23:33:38 tom Exp $ */ + +#ifndef NC_ALLOC_included +#define NC_ALLOC_included 1 +/* *INDENT-OFF* */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(HAVE_LIBDMALLOC) && HAVE_LIBDMALLOC +#include +#undef strndup /* workaround for #define in GLIBC 2.7 */ +#include /* Gray Watson's library */ +#else +#undef HAVE_LIBDMALLOC +#define HAVE_LIBDMALLOC 0 +#endif + +#if defined(HAVE_LIBDBMALLOC) && HAVE_LIBDBMALLOC +#include /* Conor Cahill's library */ +#else +#undef HAVE_LIBDBMALLOC +#define HAVE_LIBDBMALLOC 0 +#endif + +#if defined(HAVE_LIBMPATROL) && HAVE_LIBMPATROL +#include /* Memory-Patrol library */ +#else +#undef HAVE_LIBMPATROL +#define HAVE_LIBMPATROL 0 +#endif + +#ifndef NO_LEAKS +#define NO_LEAKS 0 +#endif + +#if HAVE_LIBDBMALLOC || HAVE_LIBDMALLOC || NO_LEAKS +#define HAVE_NC_FREEALL 1 +struct termtype; +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_tinfo(int) GCC_DEPRECATED("use exit_terminfo"); + +#ifdef NCURSES_INTERNALS +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_tic(int); +extern void _nc_leaks_dump_entry(void); +extern NCURSES_EXPORT(void) _nc_leaks_tic(void); + +#if NCURSES_SP_FUNCS +extern GCC_NORETURN NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit)(SCREEN*, int); +#endif +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_and_exit(int); + +#else /* !NCURSES_INTERNALS */ +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_and_exit(int) GCC_DEPRECATED("use exit_curses"); +#endif + +#define ExitProgram(code) exit_curses(code) + +#else +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_free_and_exit(int) GCC_DEPRECATED("use exit_curses"); +#endif /* NO_LEAKS, etc */ + +#ifndef HAVE_NC_FREEALL +#define HAVE_NC_FREEALL 0 +#endif + +#ifndef ExitProgram +#define ExitProgram(code) exit(code) +#endif + +/* doalloc.c */ +extern NCURSES_EXPORT(void *) _nc_doalloc(void *, size_t); +#if !HAVE_STRDUP +#undef strdup +#define strdup _nc_strdup +extern NCURSES_EXPORT(char *) _nc_strdup(const char *); +#endif + +/* entries.c */ +extern NCURSES_EXPORT(void) _nc_leaks_tinfo(void); + +#define typeMalloc(type,elts) (type *)malloc((size_t)(elts)*sizeof(type)) +#define typeCalloc(type,elts) (type *)calloc((size_t)(elts),sizeof(type)) +#define typeRealloc(type,elts,ptr) (type *)_nc_doalloc(ptr, (size_t)(elts)*sizeof(type)) + +#ifdef __cplusplus +} +#endif + +/* *INDENT-ON* */ + +#endif /* NC_ALLOC_included */ diff --git a/contrib/ncurses/include/nc_mingw.h b/contrib/ncurses/include/nc_mingw.h new file mode 100644 index 00000000..6465e8b1 --- /dev/null +++ b/contrib/ncurses/include/nc_mingw.h @@ -0,0 +1,92 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2008-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey, 2008-on * + ****************************************************************************/ + +/* $Id: nc_mingw.h,v 1.13 2024/08/31 15:50:24 tom Exp $ */ + +#ifndef NC_MINGW_H +#define NC_MINGW_H 1 + +#include + +#if defined(_WIN32) || defined(__MSYS__) || defined(__CYGWIN__) + +#ifdef WINVER +# if WINVER < 0x0501 +# error WINVER must at least be 0x0501 +# endif +#else +# define WINVER 0x0501 +#endif +#include + +#undef sleep +#define sleep(n) Sleep((n) * 1000) + +#if HAVE_SYS_TIME_H +#include /* for struct timeval */ +#endif + +#ifdef _MSC_VER +#include /* for struct timeval */ +#endif + +#include /* for uint32_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if !HAVE_CLOCK_GETTIME && !HAVE_GETTIMEOFDAY +NCURSES_EXPORT(int) _nc_gettimeofday(struct timeval *, void *); +#undef HAVE_GETTIMEOFDAY +#define HAVE_GETTIMEOFDAY 2 +#define gettimeofday(tv,tz) _nc_gettimeofday(tv,tz) +#endif + +#define SIGHUP 1 +#define SIGKILL 9 +#define getlogin() "username" + +#undef wcwidth +#define wcwidth(ucs) _nc_wcwidth((wchar_t)(ucs)) +NCURSES_EXPORT(int) _nc_wcwidth(uint32_t); + +#ifdef __cplusplus +} +#endif + +#endif /* _WIN32|__MSYS__|__CYGWIN__ */ + +#endif /* NC_MINGW_H */ diff --git a/contrib/ncurses/include/nc_panel.h b/contrib/ncurses/include/nc_panel.h new file mode 100644 index 00000000..60eb8112 --- /dev/null +++ b/contrib/ncurses/include/nc_panel.h @@ -0,0 +1,80 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer 1997 * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* + * $Id: nc_panel.h,v 1.10 2020/02/02 23:34:34 tom Exp $ + * + * nc_panel.h + * + * Headerfile to provide an interface for the panel layer into + * the SCREEN structure of the ncurses core. + */ + +#ifndef NC_PANEL_H +#define NC_PANEL_H 1 + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + struct panel; /* Forward Declaration */ + + struct panelhook + { + struct panel *top_panel; + struct panel *bottom_panel; + struct panel *stdscr_pseudo_panel; +#if NO_LEAKS + int (*destroy) (struct panel *); +#endif + }; + + struct screen; /* Forward declaration */ +/* Retrieve the panelhook of the specified screen */ + extern NCURSES_EXPORT(struct panelhook *) + _nc_panelhook (void); +#if NCURSES_SP_FUNCS + extern NCURSES_EXPORT(struct panelhook *) + NCURSES_SP_NAME(_nc_panelhook) (SCREEN *); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* NC_PANEL_H */ diff --git a/contrib/ncurses/include/nc_string.h b/contrib/ncurses/include/nc_string.h new file mode 100644 index 00000000..546aa069 --- /dev/null +++ b/contrib/ncurses/include/nc_string.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2012-2013,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012 * + ****************************************************************************/ + +#ifndef STRING_HACKS_H +#define STRING_HACKS_H 1 + +#include + +#if HAVE_BSD_STRING_H +#include +#endif + +/* + * $Id: nc_string.h,v 1.9 2021/04/25 00:10:43 tom Exp $ + * + * String-hacks. Use these macros to stifle warnings on (presumably) correct + * uses of strcat, strcpy and sprintf. + * + * By the way - + * A fundamental limitation of the interfaces (and frequent issue in bug + * reports using these functions) is that sizes are passed as unsigned values + * (with associated sign-extension problems), limiting their effectiveness + * when checking for buffer overflow. + */ + +#ifdef __cplusplus +#define NCURSES_VOID /* nothing */ +#else +#define NCURSES_VOID (void) +#endif + +#if USE_STRING_HACKS && HAVE_STRLCAT +#define _nc_STRCAT(d,s,n) NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,n)) +#define _nc_STRNCAT(d,s,m,n) NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,m)) +#else +#define _nc_STRCAT(d,s,n) NCURSES_VOID strcat((d),(s)) +#define _nc_STRNCAT(d,s,m,n) NCURSES_VOID strncat((d),(s),(n)) +#endif + +#if USE_STRING_HACKS && HAVE_STRLCPY +#define _nc_STRCPY(d,s,n) NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n)) +#define _nc_STRNCPY(d,s,n) NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n)) +#else +#define _nc_STRCPY(d,s,n) NCURSES_VOID strcpy((d),(s)) +#define _nc_STRNCPY(d,s,n) NCURSES_VOID strncpy((d),(s),(n)) +#endif + +#if USE_STRING_HACKS && HAVE_SNPRINTF +#ifdef __cplusplus +#define _nc_SPRINTF NCURSES_VOID snprintf +#else +#define _nc_SPRINTF NCURSES_VOID (snprintf) +#endif +#define _nc_SLIMIT(n) NCURSES_CAST(size_t,n), +#else +#define _nc_SPRINTF NCURSES_VOID sprintf +#define _nc_SLIMIT(n) /* nothing */ +#endif + +#endif /* STRING_HACKS_H */ diff --git a/contrib/ncurses/include/nc_termios.h b/contrib/ncurses/include/nc_termios.h new file mode 100644 index 00000000..13cc0af7 --- /dev/null +++ b/contrib/ncurses/include/nc_termios.h @@ -0,0 +1,168 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2011-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2011 * + ****************************************************************************/ + +/* $Id: nc_termios.h,v 1.8 2020/08/29 20:53:19 tom Exp $ */ + +#ifndef NC_TERMIOS_included +#define NC_TERMIOS_included 1 + +#include + +#if HAVE_TERMIOS_H && HAVE_TCGETATTR + +#else /* !HAVE_TERMIOS_H */ + +#if HAVE_TERMIO_H + +/* Add definitions to make termio look like termios. + * But ifdef it, since there are some implementations + * that try to do this for us in a fake . + */ +#ifndef TCSADRAIN +#define TCSADRAIN TCSETAW +#endif +#ifndef TCSAFLUSH +#define TCSAFLUSH TCSETAF +#endif +#ifndef tcsetattr +#define tcsetattr(fd, cmd, arg) ioctl(fd, cmd, arg) +#endif +#ifndef tcgetattr +#define tcgetattr(fd, arg) ioctl(fd, TCGETA, arg) +#endif +#ifndef cfgetospeed +#define cfgetospeed(t) ((t)->c_cflag & CBAUD) +#endif +#ifndef TCIFLUSH +#define TCIFLUSH 0 +#endif +#ifndef tcflush +#define tcflush(fd, arg) ioctl(fd, TCFLSH, arg) +#endif + +#if defined(EXP_WIN32_DRIVER) +#undef TERMIOS +#endif + +#else /* !HAVE_TERMIO_H */ + +#if defined(_WIN32) && !defined(EXP_WIN32_DRIVER) + +/* lflag bits */ +#define ISIG 0x0001 +#define ICANON 0x0002 +#define ECHO 0x0004 +#define ECHOE 0x0008 +#define ECHOK 0x0010 +#define ECHONL 0x0020 +#define NOFLSH 0x0040 +#define IEXTEN 0x0100 + +#define VEOF 4 +#define VERASE 5 +#define VINTR 6 +#define VKILL 7 +#define VMIN 9 +#define VQUIT 10 +#define VTIME 16 + +/* iflag bits */ +#define IGNBRK 0x00001 +#define BRKINT 0x00002 +#define IGNPAR 0x00004 +#define INPCK 0x00010 +#define ISTRIP 0x00020 +#define INLCR 0x00040 +#define IGNCR 0x00080 +#define ICRNL 0x00100 +#define IXON 0x00400 +#define IXOFF 0x01000 +#define PARMRK 0x10000 + +/* oflag bits */ +#define OPOST 0x00001 + +/* cflag bits */ +#define CBAUD 0x0100f +#define B0 0x00000 +#define B50 0x00001 +#define B75 0x00002 +#define B110 0x00003 +#define B134 0x00004 +#define B150 0x00005 +#define B200 0x00006 +#define B300 0x00007 +#define B600 0x00008 +#define B1200 0x00009 +#define B1800 0x0000a +#define B2400 0x0000b +#define B4800 0x0000c +#define B9600 0x0000d + +#define CSIZE 0x00030 +#define CS8 0x00030 +#define CSTOPB 0x00040 +#define CREAD 0x00080 +#define PARENB 0x00100 +#define PARODD 0x00200 +#define HUPCL 0x00400 +#define CLOCAL 0x00800 + +#define TCIFLUSH 0 +#define TCSADRAIN 3 + +#ifndef cfgetospeed +#define cfgetospeed(t) ((t)->c_cflag & CBAUD) +#endif + +#ifndef tcsetattr +#define tcsetattr(fd, opt, arg) _nc_mingw_tcsetattr(fd, opt, arg) +#endif + +#ifndef tcgetattr +#define tcgetattr(fd, arg) _nc_mingw_tcgetattr(fd, arg) +#endif + +#ifndef tcflush +#define tcflush(fd, queue) _nc_mingw_tcflush(fd, queue) +#endif + +#undef ttyname +#define ttyname(fd) NULL + +#endif /* _WIN32 */ +#endif /* HAVE_TERMIO_H */ + +#endif /* HAVE_TERMIOS_H */ + +#endif /* NC_TERMIOS_included */ diff --git a/contrib/ncurses/include/nc_tparm.h b/contrib/ncurses/include/nc_tparm.h new file mode 100644 index 00000000..78170993 --- /dev/null +++ b/contrib/ncurses/include/nc_tparm.h @@ -0,0 +1,93 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * Copyright 2006-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2006 * + ****************************************************************************/ + +/* $Id: nc_tparm.h,v 1.12 2023/04/16 17:57:28 tom Exp $ */ + +#ifndef NC_TPARM_included +#define NC_TPARM_included 1 + +#include +#include + +/* + * Cast parameters past the formatting-string for tparm() to match the + * assumption of the varargs code. + */ +#ifndef TPARM_ARG +#ifdef NCURSES_TPARM_ARG +#define TPARM_ARG NCURSES_TPARM_ARG +#else +#define TPARM_ARG long +#endif +#endif /* TPARAM_ARG */ + +#define TPARM_N(n) (TPARM_ARG)(n) + +#define TPARM_9(a,b,c,d,e,f,g,h,i,j) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g),TPARM_N(h),TPARM_N(i),TPARM_N(j)) + +#if NCURSES_TPARM_VARARGS +#define TPARM_8(a,b,c,d,e,f,g,h,i) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g),TPARM_N(h),TPARM_N(i)) +#define TPARM_7(a,b,c,d,e,f,g,h) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g),TPARM_N(h)) +#define TPARM_6(a,b,c,d,e,f,g) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f),TPARM_N(g)) +#define TPARM_5(a,b,c,d,e,f) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e),TPARM_N(f)) +#define TPARM_4(a,b,c,d,e) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d),TPARM_N(e)) +#define TPARM_3(a,b,c,d) tparm(a,TPARM_N(b),TPARM_N(c),TPARM_N(d)) +#define TPARM_2(a,b,c) tparm(a,TPARM_N(b),TPARM_N(c)) +#define TPARM_1(a,b) tparm(a,TPARM_N(b)) +#define TPARM_0(a) tparm(a) +#else +#define TPARM_8(a,b,c,d,e,f,g,h,i) TPARM_9(a,b,c,d,e,f,g,h,i,0) +#define TPARM_7(a,b,c,d,e,f,g,h) TPARM_8(a,b,c,d,e,f,g,h,0) +#define TPARM_6(a,b,c,d,e,f,g) TPARM_7(a,b,c,d,e,f,g,0) +#define TPARM_5(a,b,c,d,e,f) TPARM_6(a,b,c,d,e,f,0) +#define TPARM_4(a,b,c,d,e) TPARM_5(a,b,c,d,e,0) +#define TPARM_3(a,b,c,d) TPARM_4(a,b,c,d,0) +#define TPARM_2(a,b,c) TPARM_3(a,b,c,0) +#define TPARM_1(a,b) TPARM_2(a,b,0) +#define TPARM_0(a) TPARM_1(a,0) +#endif + +#ifdef NCURSES_INTERNALS +#define TIPARM_0(s) _nc_tiparm(0,s) +#define TIPARM_1(s,a) _nc_tiparm(1,s,a) +#define TIPARM_2(s,a,b) _nc_tiparm(2,s,a,b) +#define TIPARM_3(s,a,b,c) _nc_tiparm(3,s,a,b,c) +#define TIPARM_4(s,a,b,c,d) _nc_tiparm(4,s,a,b,c,d) +#define TIPARM_5(s,a,b,c,d,e) _nc_tiparm(5,s,a,b,c,d,e) +#define TIPARM_6(s,a,b,c,d,e,f) _nc_tiparm(6,s,a,b,c,d,e,f) +#define TIPARM_7(s,a,b,c,d,e,f,g) _nc_tiparm(7,s,a,b,c,d,e,f,g) +#define TIPARM_8(s,a,b,c,d,e,f,g,h) _nc_tiparm(8,s,a,b,c,d,e,f,g,h) +#define TIPARM_9(s,a,b,c,d,e,f,g,h,i) _nc_tiparm(9,s,a,b,c,d,e,f,g,h,i) +#endif + +#endif /* NC_TPARM_included */ diff --git a/contrib/ncurses/include/nc_win32.h b/contrib/ncurses/include/nc_win32.h new file mode 100644 index 00000000..d2668c35 --- /dev/null +++ b/contrib/ncurses/include/nc_win32.h @@ -0,0 +1,189 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2008-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey, 2008-on * + ****************************************************************************/ + +/* $Id: nc_win32.h,v 1.14 2024/10/19 21:06:23 tom Exp $ */ + +#ifndef NC_WIN32_H +#define NC_WIN32_H 1 + +#include + +#if defined(_WIN32) || defined(_WIN64) + +#ifndef _NC_WINDOWS_NATIVE +#define _NC_WINDOWS_NATIVE +#endif + +#ifdef TERMIOS +#error TERMIOS must not be defined on Windows +#endif + +/* We no longer support WindowsXP. + Minimum requirement is Windows Vista or Server2008, + aka Windows NT 6.0 +*/ +#ifdef WINVER +# if WINVER < 0x0600 +# error WINVER must at least be 0x0600 +# endif +#else +# define WINVER 0x0600 +#endif + +#undef _NC_CHECK_MINTTY +#if WINVER >= 0x0600 +#define _NC_CHECK_MINTTY +#endif + +#include + +#if HAVE_SYS_TIME_H +#include /* for struct timeval */ +#endif + +#ifdef _NC_MSC +#include /* for struct timeval */ +#endif + +#include /* for uint32_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if !HAVE_CLOCK_GETTIME && !HAVE_GETTIMEOFDAY +#undef HAVE_GETTIMEOFDAY +#define HAVE_GETTIMEOFDAY 2 +extern NCURSES_EXPORT(int) _nc_gettimeofday(struct timeval *, void *); +#endif + +#undef wcwidth +#define wcwidth(ucs) _nc_wcwidth((wchar_t)(ucs)) +extern NCURSES_EXPORT(int) _nc_wcwidth(uint32_t); + +#ifdef EVENTLIST_2nd /* test.priv.h just needs the preceding */ + +extern NCURSES_EXPORT(void) _nc_console_size(int* Lines, int* Cols); +extern NCURSES_EXPORT(HANDLE) _nc_console_handle(int fd); +extern NCURSES_EXPORT(int) _nc_console_isatty(int fd); +extern NCURSES_EXPORT(int) _nc_console_test(int fd); +extern NCURSES_EXPORT(int) _nc_console_read(SCREEN *sp,HANDLE hdl,int *buf); +extern NCURSES_EXPORT(int) _nc_console_twait(SCREEN *, HANDLE,int,int,int * EVENTLIST_2nd(_nc_eventlist * evl)); +extern NCURSES_EXPORT(WORD) _nc_console_MapColor(bool fore, int color); +extern NCURSES_EXPORT(void) _nc_console_selectActiveHandle(void); +extern NCURSES_EXPORT(bool) _nc_console_get_SBI(void); +extern NCURSES_EXPORT(void) _nc_console_set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info); +extern NCURSES_EXPORT(int) _nc_console_testmouse(const SCREEN *,HANDLE,int EVENTLIST_2nd(_nc_eventlist*)); +extern NCURSES_EXPORT(int) _nc_console_keyok(int keycode,int flag); +extern NCURSES_EXPORT(bool) _nc_console_keyExist(int keycode); +extern NCURSES_EXPORT(bool) _nc_console_checkinit(bool initFlag, bool assumeTermInfo); +extern NCURSES_EXPORT(int) _nc_console_vt_supported(void); + +#ifdef _NC_CHECK_MINTTY +extern NCURSES_EXPORT(int) _nc_console_checkmintty(int fd, LPHANDLE pMinTTY); +#endif + +#undef VALID_TERM_ENV +#define MS_TERMINAL "ms-terminal" +#define VALID_TERM_ENV(term_env, no_terminal) \ + (term_env = (NonEmpty(term_env) \ + ? term_env \ + : (_nc_console_vt_supported() \ + ? MS_TERMINAL \ + : no_terminal)), \ + NonEmpty(term_env)) + + /* + * Various Console mode definitions + */ + + /* Flags to enable virtual Terminal processing */ +#define VT_FLAG_OUT ENABLE_VIRTUAL_TERMINAL_PROCESSING +#define VT_FLAG_IN ENABLE_VIRTUAL_TERMINAL_INPUT + + /* Default flags for input/output modes */ +#define CONMODE_IN_DEFAULT (ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT) +#define CONMODE_OUT_DEFAULT (ENABLE_PROCESSED_OUTPUT | DISABLE_NEWLINE_AUTO_RETURN | ENABLE_LVB_GRID_WORLDWIDE) + + /* Flags to reset from RAW/CBREAK */ +#define CONMODE_NORAW (ENABLE_PROCESSED_INPUT|ENABLE_LINE_INPUT) +#define CONMODE_NOCBREAK (ENABLE_LINE_INPUT) + + +#if defined(USE_TERM_DRIVER) && defined(USE_WIN32CON_DRIVER) +extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER; +#endif + +#define CON_NUMPAIRS 64 +typedef struct { + BOOL initialized; + BOOL buffered; + BOOL window_only; + BOOL progMode; + BOOL isMinTTY; + BOOL isTermInfoConsole; + HANDLE out; + HANDLE inp; + HANDLE hdl; + HANDLE lastOut; + int numButtons; + LPDWORD ansi_map; + LPDWORD map; + LPDWORD rmap; + WORD pairs[CON_NUMPAIRS]; + COORD origin; + CHAR_INFO *save_screen; + COORD save_size; + SMALL_RECT save_region; + CONSOLE_SCREEN_BUFFER_INFO SBI; + CONSOLE_SCREEN_BUFFER_INFO save_SBI; + CONSOLE_CURSOR_INFO save_CI; + TTY originalMode; +} ConsoleInfo; + +extern NCURSES_EXPORT_VAR(ConsoleInfo) _nc_CONSOLE; +#define WINCONSOLE _nc_CONSOLE + +#define TypeAlloca(type,count)(type*) _alloca(sizeof(type)*(size_t)(count)) + +#endif /* EVENTLIST_2nd */ + +#ifdef __cplusplus +} +#endif + +#endif /* _WIN32 || _WIN64 */ + +#endif /* NC_WIN32_H */ diff --git a/contrib/ncurses/include/ncurses_cfg.hin b/contrib/ncurses/include/ncurses_cfg.hin new file mode 100644 index 00000000..0744fa0c --- /dev/null +++ b/contrib/ncurses/include/ncurses_cfg.hin @@ -0,0 +1,74 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + ****************************************************************************/ +/* + * $Id: ncurses_cfg.hin,v 1.15 2024/06/08 14:04:14 tom Exp $ + * + * Both ncurses_cfg.h and ncurses_def.h are internal header-files used when + * building ncurses. + * + * This is a template-file used to generate the "ncurses_cfg.h" file. + * + * Rather than list every definition, the configuration script substitutes the + * definitions that it finds using 'sed'. You need a patch (original date + * 971222) to autoconf 2.12 or 2.13 to do this. + * + * See: + * https://invisible-island.net/autoconf/ + * https://invisible-island.net/archives/autoconf/ + */ +#ifndef NC_CONFIG_H +#define NC_CONFIG_H +@DEFS@ + +#include + + /* The C compiler may not treat these properly but C++ has to */ +#ifdef __cplusplus +#undef const +#undef inline +#endif + + /* On HP-UX, the C compiler doesn't grok mbstate_t without + -D_XOPEN_SOURCE=500. However, this causes problems on + IRIX. So, we #define mbstate_t to int in configure.in + only for the C compiler if needed. */ +#ifndef __cplusplus +#ifdef NEED_MBSTATE_T_DEF +#define mbstate_t int +#endif +#endif + +/* + * vile:cmode + */ +#endif /* NC_CONFIG_H */ diff --git a/contrib/ncurses/include/ncurses_defs b/contrib/ncurses/include/ncurses_defs new file mode 100644 index 00000000..bf00f755 --- /dev/null +++ b/contrib/ncurses/include/ncurses_defs @@ -0,0 +1,279 @@ +# $Id: ncurses_defs,v 1.112 2024/05/19 09:02:51 tom Exp $ +############################################################################## +# Copyright 2018-2023,2024 Thomas E. Dickey # +# Copyright 2000-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# See "MKncurses_def.sh" for an explanation. +# +# (hint: don't try to define NDEBUG ;-) + +BROKEN_LINKER +BSD_TPUTS +CGETENT_CONST /* nothing */ +CPP_HAS_PARAM_INIT +CURSES_ACS_ARRAY acs_map +CURSES_WACS_ARRAY _nc_wacs +DECL_ERRNO +ETIP_NEEDS_MATH_H +GCC_NORETURN /* nothing */ +GCC_UNUSED /* nothing */ +HAVE_ALLOC_PAIR +HAVE_ASSUME_DEFAULT_COLORS +HAVE_BIG_CORE +HAVE_BSD_CGETENT +HAVE_BSD_SIGNAL_H +HAVE_BSD_STRING_H +HAVE_BTOWC +HAVE_BUILTIN_H +HAVE_CHGAT 1 +HAVE_CLOCK_GETTIME +HAVE_COLOR_CONTENT 1 +HAVE_COLOR_SET 1 +HAVE_CONSISTENT_GETENV +HAVE_CONSISTENT_MB_LEN_MAX +HAVE_COPYWIN 1 +HAVE_CURSCR 1 +HAVE_CURSES_DATA_TABSIZE 1 +HAVE_CURSES_DATA_TTYTYPE 1 +HAVE_CURSES_TRACE 1 +HAVE_DELSCREEN 1 +HAVE_DERWIN 1 +HAVE_DIRENT_H +HAVE_DUPWIN 1 +HAVE_ERRNO +HAVE_EXIT_CURSES 1 +HAVE_EXIT_TERMINFO 1 +HAVE_FCNTL_H +HAVE_FILTER 1 +HAVE_FORM_H +HAVE_FPATHCONF +HAVE_GETAUXVAL +HAVE_GETBEGX 1 +HAVE_GETCURX 1 +HAVE_GETCWD +HAVE_GETEGID +HAVE_GETEUID +HAVE_GETMAXX 1 +HAVE_GETNSTR +HAVE_GETOPT_H +HAVE_GETPARX 1 +HAVE_GETTIMEOFDAY +HAVE_GETTTYNAM +HAVE_GETUID +HAVE_GETWIN 1 +HAVE_GPM_H +HAVE_GPP_BUILTIN_H +HAVE_GXX_BUILTIN_H +HAVE_HALFDELAY 1 +HAVE_HAS_KEY +HAVE_INIT_EXTENDED_COLOR +HAVE_INTTYPES_H +HAVE_IOSTREAM +HAVE_ISASCII +HAVE_ISSETUGID +HAVE_LANGINFO_CODESET +HAVE_LIBC_H +HAVE_LIBDBMALLOC +HAVE_LIBDMALLOC +HAVE_LIBFORM +HAVE_LIBGPM +HAVE_LIBMENU +HAVE_LIBMPATROL +HAVE_LIBPANEL +HAVE_LIB_PCRE2 +HAVE_LIMITS_H +HAVE_LINK +HAVE_LOCALECONV +HAVE_LOCALE_H +HAVE_LONG_FILE_NAMES +HAVE_MATH_FUNCS +HAVE_MATH_H +HAVE_MBLEN +HAVE_MBRLEN +HAVE_MBRTOWC +HAVE_MBSRTOWCS +HAVE_MBSTOWCS +HAVE_MBTOWC +HAVE_MENU_H +HAVE_MKSTEMP +HAVE_MVDERWIN 1 +HAVE_MVVLINE 1 +HAVE_MVWIN 1 +HAVE_MVWVLINE 1 +HAVE_NANOSLEEP +HAVE_NAPMS 1 +HAVE_NC_ALLOC_H +HAVE_NEWPAD 1 +HAVE_PANEL_H +HAVE_PATH_TTYS +HAVE_PCRE2POSIX_H +HAVE_PCREPOSIX_H +HAVE_POLL +HAVE_POLL_H +HAVE_PURIFY +HAVE_PUTENV +HAVE_PUTWC +HAVE_PUTWIN 1 +HAVE_REGEXPR_H_FUNCS +HAVE_REGEXP_H_FUNCS +HAVE_REGEX_H_FUNCS +HAVE_REMOVE +HAVE_RESET_COLOR_PAIRS +HAVE_RESIZETERM +HAVE_RESIZE_TERM +HAVE_RESTARTTERM 1 +HAVE_RIPOFFLINE 1 +HAVE_SCR_DUMP 1 +HAVE_SELECT +HAVE_SETBUF +HAVE_SETBUFFER +HAVE_SETENV +HAVE_SETFSUID +HAVE_SETUPTERM 1 +HAVE_SETVBUF +HAVE_SGTTY_H +HAVE_SIGACTION +HAVE_SIGVEC +HAVE_SIZECHANGE +HAVE_SLK_COLOR +HAVE_SLK_INIT 1 +HAVE_SNPRINTF +HAVE_STDINT_H +HAVE_STRDUP +HAVE_STRLCAT +HAVE_STRLCPY +HAVE_STRSTR +HAVE_SYMLINK +HAVE_SYSCONF +HAVE_SYS_BSDTYPES_H +HAVE_SYS_AUXV_H +HAVE_SYS_IOCTL_H +HAVE_SYS_PARAM_H +HAVE_SYS_POLL_H +HAVE_SYS_SELECT_H +HAVE_SYS_TERMIO_H +HAVE_SYS_TIMES_H +HAVE_SYS_TIME_H +HAVE_SYS_TIME_SELECT +HAVE_TCGETATTR +HAVE_TCGETPGRP +HAVE_TELL +HAVE_TERMATTRS 1 +HAVE_TERMCAP_H 1 +HAVE_TERMIOS_H +HAVE_TERMIO_H +HAVE_TERMNAME 1 +HAVE_TERM_ENTRY_H 1 +HAVE_TERM_H 1 +HAVE_TGETENT 1 +HAVE_TIGETNUM 1 +HAVE_TIGETSTR 1 +HAVE_TIPARM 1 +HAVE_TIPARM_S 1 +HAVE_TISCAN_S 1 +HAVE_TIMES +HAVE_TPUTS_SP +HAVE_TSEARCH +HAVE_TYPEAHEAD 1 +HAVE_TYPEINFO +HAVE_TYPE_ATTR_T +HAVE_TYPE_SIGACTION +HAVE_UNCTRL_H 1 +HAVE_UNGET_WCH 1 +HAVE_UNISTD_H +HAVE_UNLINK +HAVE_USE_DEFAULT_COLORS +HAVE_USE_ENV 1 +HAVE_USE_EXTENDED_NAMES NCURSES_XNAMES +HAVE_USE_SCREEN +HAVE_USE_WINDOW +HAVE_VFSCANF +HAVE_VIDPUTS 1 +HAVE_VID_PUTS 1 +HAVE_VSNPRINTF +HAVE_VSSCANF +HAVE_VW_PRINTW 1 +HAVE_WCHGAT 1 +HAVE_WCSRTOMBS +HAVE_WCSTOMBS +HAVE_WCTOB +HAVE_WCTOMB +HAVE_WCTYPE_H +HAVE_WINSDELLN 1 +HAVE_WINSSTR 1 +HAVE_WMEMCHR +HAVE_WORKING_POLL +HAVE_WRESIZE +HAVE_WSYNCDOWN 1 +HAVE__DOSCAN +HAVE__TRACEF +HAVE__NC_TPARM_ANALYZE 1 +MIXEDCASE_FILENAMES +NCURSES_CHAR_EQ +NCURSES_EXPANDED +NCURSES_EXT_COLORS +NCURSES_EXT_FUNCS +NCURSES_EXT_PUTWIN +NCURSES_NO_PADDING +NCURSES_OSPEED_COMPAT +NCURSES_PATHSEP ':' +NCURSES_WIDECHAR +NEED_PTEM_H +NO_LEAKS +PURE_TERMINFO +STDC_HEADERS +SVR4_ACTION +SVR4_TERMIO +SYSTEM_NAME "unknown" +TERMINFO "none" +TERMPATH "none" +TIME_WITH_SYS_TIME +TYPEOF_CHTYPE +USE_COLORFGBG +USE_FOPEN_BIN_R +USE_GETCAP +USE_GETCAP_CACHE +USE_HARD_TABS +USE_HASHED_DB +USE_HASHMAP +USE_HOME_TERMINFO +USE_LINKS +USE_MY_MEMMOVE +USE_OK_BCOPY +USE_PTHREADS_EINTR +USE_RCS_IDS +USE_REENTRANT +USE_SAFE_SPRINTF +USE_SCROLL_HINTS +USE_SIGWINCH +USE_STRING_HACKS +USE_SYMLINKS +USE_SYSMOUSE +USE_WEAK_SYMBOLS +USE_WIDEC_SUPPORT +USE_XMC_SUPPORT diff --git a/contrib/ncurses/include/ncurses_dll.h.in b/contrib/ncurses/include/ncurses_dll.h.in new file mode 100644 index 00000000..401d47a8 --- /dev/null +++ b/contrib/ncurses/include/ncurses_dll.h.in @@ -0,0 +1,103 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * Copyright 2009,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* $Id: ncurses_dll.h.in,v 1.18 2023/05/06 20:12:43 tom Exp $ */ + +#ifndef NCURSES_DLL_H_incl +#define NCURSES_DLL_H_incl 1 + +/* + * MinGW gcc (unlike MSYS2 and Cygwin) should define _WIN32 and possibly _WIN64. + */ +#if defined(__MINGW64__) + +#ifndef _WIN64 +#define _WIN64 1 +#endif + +#elif defined(__MINGW32__) + +#ifndef _WIN32 +#define _WIN32 1 +#endif + +/* 2014-08-02 workaround for broken MinGW compiler. + * Oddly, only TRACE is mapped to trace - the other -D's are okay. + * suggest TDM as an alternative. + */ +#if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) + +#ifdef trace +#undef trace +#define TRACE +#endif + +#endif /* broken compiler */ + +#endif /* MingW */ + +/* + * For reentrant code, we map the various global variables into SCREEN by + * using functions to access them. + */ +#define NCURSES_PUBLIC_VAR(name) @NCURSES_WRAP_PREFIX@##name + +#if defined(BUILDING_NCURSES) +# define NCURSES_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT +#else +# define NCURSES_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT +#endif + +#define NCURSES_WRAPPED_VAR(type,name) extern NCURSES_IMPEXP type NCURSES_PUBLIC_VAR(name)(void) + +#define NCURSES_EXPORT(type) NCURSES_IMPEXP type NCURSES_API +#define NCURSES_EXPORT_VAR(type) NCURSES_IMPEXP type + +/* + * These symbols hide dllimport/dllexport, for compilers which care about it. + */ +#if defined(__CYGWIN__) || (defined(_WIN32) || defined(_WIN64)) +# if defined(NCURSES_STATIC) /* "static" here only implies "not-a-DLL" */ +# define NCURSES_EXPORT_GENERAL_IMPORT +# define NCURSES_EXPORT_GENERAL_EXPORT +# else +# define NCURSES_EXPORT_GENERAL_IMPORT __declspec(dllimport) +# define NCURSES_EXPORT_GENERAL_EXPORT __declspec(dllexport) +# endif +# define NCURSES_API __cdecl +#else +# define NCURSES_EXPORT_GENERAL_IMPORT +# if (__GNUC__ >= 4) && !defined(__cplusplus) +# define NCURSES_EXPORT_GENERAL_EXPORT __attribute__((visibility ("default"))) +# else +# define NCURSES_EXPORT_GENERAL_EXPORT +# endif +# define NCURSES_API /* FIXME: __attribute__ ((cdecl)) is only available on x86 */ +#endif + +#endif /* NCURSES_DLL_H_incl */ diff --git a/contrib/ncurses/include/ncurses_mingw.h b/contrib/ncurses/include/ncurses_mingw.h new file mode 100644 index 00000000..8b11272d --- /dev/null +++ b/contrib/ncurses/include/ncurses_mingw.h @@ -0,0 +1,82 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 2008-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 2008-on * + ****************************************************************************/ + +/* $Id: ncurses_mingw.h,v 1.7 2021/06/17 21:26:02 tom Exp $ */ + +/* + * This is a placeholder up to now and describes what needs to be implemented + * to support I/O to external terminals with ncurses on the Windows OS. + */ + +#ifdef _WIN32 +#ifndef _NC_MINGWH +#define _NC_MINGWH + +#define USE_CONSOLE_DRIVER 1 + +#undef TERMIOS +#define TERMIOS 1 + +typedef unsigned char cc_t; +typedef unsigned int tcflag_t; +typedef unsigned int speed_t; +typedef unsigned short otcflag_t; +typedef unsigned char ospeed_t; + +#define NCCS 18 +struct termios +{ + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_cflag; + tcflag_t c_lflag; + char c_line; + cc_t c_cc[NCCS]; + speed_t c_ispeed; + speed_t c_ospeed; +}; + +extern NCURSES_EXPORT(int) _nc_mingw_tcsetattr( + int fd, + int optional_actions, + const struct termios* arg); +extern NCURSES_EXPORT(int) _nc_mingw_tcgetattr( + int fd, + struct termios* arg); +extern NCURSES_EXPORT(int) _nc_mingw_tcflush( + int fd, + int queue); +extern NCURSES_EXPORT(void) _nc_set_term_driver(void* term); + +#endif /* _NC_MINGWH */ +#endif /* _WIN32 */ diff --git a/contrib/ncurses/include/term_entry.h b/contrib/ncurses/include/term_entry.h new file mode 100644 index 00000000..24389ad3 --- /dev/null +++ b/contrib/ncurses/include/term_entry.h @@ -0,0 +1,220 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 1998-2015,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1998-on * + ****************************************************************************/ + +/* $Id: term_entry.h,v 1.64 2023/04/22 13:37:14 tom Exp $ */ + +/* + * term_entry.h -- interface to entry-manipulation code + */ + +#ifndef NCURSES_TERM_ENTRY_H_incl +#define NCURSES_TERM_ENTRY_H_incl 1 +/* *INDENT-OFF* */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* + * These macros may be used by programs that know about TERMTYPE: + */ +#if NCURSES_XNAMES +#define NUM_BOOLEANS(tp) (tp)->num_Booleans +#define NUM_NUMBERS(tp) (tp)->num_Numbers +#define NUM_STRINGS(tp) (tp)->num_Strings +#define EXT_NAMES(tp,i,limit,index,table) (i >= limit) ? tp->ext_Names[index] : table[i] +#else +#define NUM_BOOLEANS(tp) BOOLCOUNT +#define NUM_NUMBERS(tp) NUMCOUNT +#define NUM_STRINGS(tp) STRCOUNT +#define EXT_NAMES(tp,i,limit,index,table) table[i] +#endif + +#define NUM_EXT_NAMES(tp) (unsigned) ((tp)->ext_Booleans + (tp)->ext_Numbers + (tp)->ext_Strings) + +#define for_each_boolean(n,tp) for(n = 0; n < NUM_BOOLEANS(tp); n++) +#define for_each_number(n,tp) for(n = 0; n < NUM_NUMBERS(tp); n++) +#define for_each_string(n,tp) for(n = 0; n < NUM_STRINGS(tp); n++) + +#if NCURSES_XNAMES +#define for_each_ext_boolean(n,tp) for(n = BOOLCOUNT; (int) n < (int) NUM_BOOLEANS(tp); n++) +#define for_each_ext_number(n,tp) for(n = NUMCOUNT; (int) n < (int) NUM_NUMBERS(tp); n++) +#define for_each_ext_string(n,tp) for(n = STRCOUNT; (int) n < (int) NUM_STRINGS(tp); n++) +#endif + +#define ExtBoolname(tp,i,names) EXT_NAMES(tp, i, BOOLCOUNT, (i - (tp->num_Booleans - tp->ext_Booleans)), names) +#define ExtNumname(tp,i,names) EXT_NAMES(tp, i, NUMCOUNT, (i - (tp->num_Numbers - tp->ext_Numbers)) + tp->ext_Booleans, names) +#define ExtStrname(tp,i,names) EXT_NAMES(tp, i, STRCOUNT, (i - (tp->num_Strings - tp->ext_Strings)) + (tp->ext_Numbers + tp->ext_Booleans), names) + +/* + * The remaining type-definitions and macros are used only internally by the + * ncurses utilities. + */ +#ifdef NCURSES_INTERNALS + +/* + * see db_iterator.c - this enumeration lists the places searched for a + * terminal description and defines the order in which they are searched. + */ +typedef enum { + dbdTIC = 0, /* special, used by tic when writing entry */ +#if NCURSES_USE_DATABASE + dbdEnvOnce, /* the $TERMINFO environment variable */ + dbdHome, /* $HOME/.terminfo */ + dbdEnvList, /* the $TERMINFO_DIRS environment variable */ + dbdCfgList, /* the compiled-in TERMINFO_DIRS value */ + dbdCfgOnce, /* the compiled-in TERMINFO value */ +#endif +#if NCURSES_USE_TERMCAP + dbdEnvOnce2, /* the $TERMCAP environment variable */ + dbdEnvList2, /* the $TERMPATH environment variable */ + dbdCfgList2, /* the compiled-in TERMPATH */ +#endif + dbdLAST +} DBDIRS; + +#define MAX_USES 32 +#define MAX_CROSSLINKS 16 + +typedef struct entry ENTRY; + +typedef struct { + char *name; + ENTRY *link; + long line; +} ENTRY_USES; + +struct entry { + TERMTYPE2 tterm; + unsigned nuses; + ENTRY_USES uses[MAX_USES]; + int ncrosslinks; + ENTRY *crosslinks[MAX_CROSSLINKS]; + long cstart; + long cend; + long startline; + ENTRY *next; + ENTRY *last; +}; + +extern NCURSES_EXPORT_VAR(ENTRY *) _nc_head; +extern NCURSES_EXPORT_VAR(ENTRY *) _nc_tail; +#define for_entry_list(qp) for (qp = _nc_head; qp; qp = qp->next) +#define for_entry_list2(qp,q0) for (qp = q0; qp; qp = qp->next) + +#define MAX_LINE 132 + +#define NULLHOOK (bool(*)(ENTRY *))0 + +/* + * Note that WANTED and PRESENT are not simple inverses! If a capability + * has been explicitly cancelled, it is not considered WANTED. + */ +#define WANTED(s) ((s) == ABSENT_STRING) +#define PRESENT(s) (((s) != ABSENT_STRING) && ((s) != CANCELLED_STRING)) + +#define ANDMISSING(p,q) \ + { \ + if (PRESENT(p) && !PRESENT(q)) \ + _nc_warning(#p " but no " #q); \ + } + +#define PAIRED(p,q) \ + { \ + if (PRESENT(q) && !PRESENT(p)) \ + _nc_warning(#q " but no " #p); \ + if (PRESENT(p) && !PRESENT(q)) \ + _nc_warning(#p " but no " #q); \ + } + +/* + * These entrypoints are used only by the ncurses utilities such as tic. + */ + +/* alloc_entry.c: elementary allocation code */ +extern NCURSES_EXPORT(ENTRY *) _nc_copy_entry (ENTRY *oldp); +extern NCURSES_EXPORT(char *) _nc_save_str (const char *const); +extern NCURSES_EXPORT(void) _nc_init_entry (ENTRY *const); +extern NCURSES_EXPORT(void) _nc_merge_entry (ENTRY *const, ENTRY *const); +extern NCURSES_EXPORT(void) _nc_wrap_entry (ENTRY *const, bool); + +/* alloc_ttype.c: elementary allocation code */ +extern NCURSES_EXPORT(void) _nc_align_termtype (TERMTYPE2 *, TERMTYPE2 *); + +/* free_ttype.c: elementary allocation code */ +extern NCURSES_EXPORT(void) _nc_free_termtype (TERMTYPE *); +extern NCURSES_EXPORT(void) _nc_free_termtype1 (TERMTYPE *); +extern NCURSES_EXPORT(void) _nc_free_termtype2 (TERMTYPE2 *); + +/* lib_termcap.c: trim sgr0 string for termcap users */ +extern NCURSES_EXPORT(char *) _nc_trim_sgr0 (TERMTYPE2 *); + +/* parse_entry.c: entry-parsing code */ +#if NCURSES_XNAMES +extern NCURSES_EXPORT_VAR(bool) _nc_user_definable; +extern NCURSES_EXPORT_VAR(bool) _nc_disable_period; +#endif +extern NCURSES_EXPORT(int) _nc_parse_entry (ENTRY *, int, bool); +extern NCURSES_EXPORT(int) _nc_capcmp (const char *, const char *); + +/* write_entry.c: writing an entry to the file system */ +extern NCURSES_EXPORT(void) _nc_set_writedir (const char *); +extern NCURSES_EXPORT(void) _nc_write_entry (TERMTYPE2 *const); +extern NCURSES_EXPORT(int) _nc_write_object (TERMTYPE2 *, char *, unsigned *, unsigned); + +/* comp_parse.c: entry list handling */ +extern NCURSES_EXPORT(void) _nc_read_entry_source (FILE*, char*, int, bool, bool (*)(ENTRY*)); +extern NCURSES_EXPORT(bool) _nc_entry_match (char *, char *); +extern NCURSES_EXPORT(int) _nc_resolve_uses (bool); /* obs 20040705 */ +extern NCURSES_EXPORT(int) _nc_resolve_uses2 (bool, bool); +extern NCURSES_EXPORT(void) _nc_free_entries (ENTRY *); +extern NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype)(TERMTYPE *); /* obs 20040705 */ +extern NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2)(TERMTYPE2 *, bool); + +/* trace_xnames.c */ +extern NCURSES_EXPORT(void) _nc_trace_xnames (TERMTYPE *); + +#endif /* NCURSES_INTERNALS */ + +#ifdef __cplusplus +} +#endif + +/* *INDENT-ON* */ + +#endif /* NCURSES_TERM_ENTRY_H_incl */ diff --git a/contrib/ncurses/include/termcap.h.in b/contrib/ncurses/include/termcap.h.in new file mode 100644 index 00000000..7b7c7037 --- /dev/null +++ b/contrib/ncurses/include/termcap.h.in @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2000,2001 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* $Id: termcap.h.in,v 1.20 2021/06/17 21:26:02 tom Exp $ */ + +#ifndef NCURSES_TERMCAP_H_incl +#define NCURSES_TERMCAP_H_incl 1 + +#undef NCURSES_VERSION +#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@" + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +#include + +#undef NCURSES_OSPEED +#define NCURSES_OSPEED @NCURSES_OSPEED@ + +extern NCURSES_EXPORT_VAR(char) PC; +extern NCURSES_EXPORT_VAR(char *) UP; +extern NCURSES_EXPORT_VAR(char *) BC; +extern NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed; + +#if !defined(NCURSES_TERM_H_incl) +extern NCURSES_EXPORT(char *) tgetstr (const char *, char **); +extern NCURSES_EXPORT(char *) tgoto (const char *, int, int); +extern NCURSES_EXPORT(int) tgetent (char *, const char *); +extern NCURSES_EXPORT(int) tgetflag (const char *); +extern NCURSES_EXPORT(int) tgetnum (const char *); +extern NCURSES_EXPORT(int) tputs (const char *, int, int (*)(int)); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* NCURSES_TERMCAP_H_incl */ diff --git a/contrib/ncurses/include/tic.h b/contrib/ncurses/include/tic.h new file mode 100644 index 00000000..7569aae9 --- /dev/null +++ b/contrib/ncurses/include/tic.h @@ -0,0 +1,379 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 1998-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996 on * + ****************************************************************************/ + +/* + * $Id: tic.h,v 1.87 2023/04/22 13:37:21 tom Exp $ + * tic.h - Global variables and structures for the terminfo compiler. + */ + +#ifndef __TIC_H +#define __TIC_H +/* *INDENT-OFF* */ +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include /* for the _tracef() prototype, ERR/OK, bool defs */ + +/* +** The format of SVr2 compiled terminfo files is as follows: +** +** Header (12 bytes), containing information given below +** Names Section, containing the names of the terminal +** Boolean Section, containing the values of all of the +** boolean capabilities +** A null byte may be inserted here to make +** sure that the Number Section begins on an +** even word boundary. +** Number Section, containing the values of all of the numeric +** capabilities, each as a short integer +** String Section, containing short integer offsets into the +** String Table, one per string capability +** String Table, containing the actual characters of the string +** capabilities. +** +** In the SVr2 format, "short" means signed 16-bit numbers, which is sometimes +** inconvenient. The numbers are signed, to provide for absent and canceled +** values. ncurses6.1 introduced an extension to this compiled format, by +** making the Number Section a list of signed 32-bit integers. +** +** NOTE that all short integers in the file are stored using VAX/PDP-style +** byte-order, i.e., least-significant byte first. +** +** There is no structure definition here because it would only confuse +** matters. Terminfo format is a raw byte layout, not a structure +** dump. If you happen to be on a little-endian machine with 16-bit +** shorts that requires no padding between short members in a struct, +** then there is a natural C structure that captures the header, but +** not very helpfully. +*/ + +#define MAGIC 0432 /* first two bytes of a compiled entry */ +#define MAGIC2 01036 /* first two bytes of a compiled 32-bit entry */ + +#undef BYTE +#define BYTE(p,n) (unsigned char)((p)[n]) + +#define IS_NEG1(p) ((BYTE(p,0) == 0377) && (BYTE(p,1) == 0377)) +#define IS_NEG2(p) ((BYTE(p,0) == 0376) && (BYTE(p,1) == 0377)) +#define LOW_MSB(p) (BYTE(p,0) + 256*BYTE(p,1)) + +#define IS_TIC_MAGIC(p) (LOW_MSB(p) == MAGIC || LOW_MSB(p) == MAGIC2) + +#define quick_prefix(s) (!strncmp((s), "b64:", (size_t)4) || !strncmp((s), "hex:", (size_t)4)) + +/* + * The "maximum" here is misleading; XSI guarantees minimum values, which a + * given implementation may exceed. + */ +#define MAX_NAME_SIZE 512 /* maximum legal name field size (XSI:127) */ +#define MAX_ENTRY_SIZE1 4096 /* maximum legal entry size (SVr2) */ +#define MAX_ENTRY_SIZE2 32768 /* maximum legal entry size (ncurses6.1) */ + +#if NCURSES_EXT_COLORS && HAVE_INIT_EXTENDED_COLOR +#define MAX_ENTRY_SIZE MAX_ENTRY_SIZE2 +#else +#define MAX_ENTRY_SIZE MAX_ENTRY_SIZE1 +#endif + +/* + * The maximum size of individual name or alias is guaranteed in XSI to be at + * least 14, since that corresponds to the older filename lengths. Newer + * systems allow longer aliases, though not many terminal descriptions are + * written to use them. The MAX_ALIAS symbol is used for warnings. + */ +#if HAVE_LONG_FILE_NAMES +#define MAX_ALIAS 32 /* smaller than POSIX minimum for PATH_MAX */ +#else +#define MAX_ALIAS 14 /* SVr3 filename length */ +#endif + +/* location of user's personal info directory */ +#define PRIVATE_INFO "%s/.terminfo" /* plug getenv("HOME") into %s */ + +/* + * Some traces are designed to be used via tic's verbose option (and similar in + * infocmp and toe) rather than the 'trace()' function. So we use the bits + * above the normal trace() parameter as a debug-level. + */ + +#define MAX_DEBUG_LEVEL 15 +#define DEBUG_LEVEL(n) ((n) << TRACE_SHIFT) + +#define set_trace_level(n) \ + _nc_tracing &= TRACE_MAXIMUM, \ + _nc_tracing |= DEBUG_LEVEL(n) + +#ifdef TRACE +#define DEBUG(n, a) if (_nc_tracing >= DEBUG_LEVEL(n)) _tracef a +#else +#define DEBUG(n, a) /*nothing*/ +#endif + +/* + * These are the types of tokens returned by the scanner. The first + * three are also used in the hash table of capability names. The scanner + * returns one of these values after loading the specifics into the global + * structure curr_token. + */ + +#define BOOLEAN 0 /* Boolean capability */ +#define NUMBER 1 /* Numeric capability */ +#define STRING 2 /* String-valued capability */ +#define CANCEL 3 /* Capability to be cancelled in following tc's */ +#define NAMES 4 /* The names for a terminal type */ +#define UNDEF 5 /* Undefined */ + +#define NO_PUSHBACK -1 /* used in pushtype to indicate no pushback */ + +/* + * The global structure in which the specific parts of a + * scanned token are returned. + */ + +struct token +{ + char *tk_name; /* name of capability */ + int tk_valnumber; /* value of capability (if a number) */ + char *tk_valstring; /* value of capability (if a string) */ +}; + +/* + * Offsets to string capabilities, with the corresponding functionkey codes. + */ +struct tinfo_fkeys { + unsigned offset; + chtype code; + }; + +typedef short HashValue; + +/* + * The file comp_captab.c contains an array of these structures, one per + * possible capability. These are indexed by a hash table array of pointers to + * the same structures for use by the parser. + */ +struct name_table_entry +{ + const char *nte_name; /* name to hash on */ + int nte_type; /* BOOLEAN, NUMBER or STRING */ + HashValue nte_index; /* index of associated variable in its array */ + HashValue nte_link; /* index in table of next hash, or -1 */ +}; + +/* + * Use this structure to hide differences between terminfo and termcap tables. + */ +typedef struct { + unsigned table_size; + const HashValue *table_data; + HashValue (*hash_of)(const char *); + int (*compare_names)(const char *, const char *); +} HashData; + +struct alias +{ + const char *from; + const char *to; + const char *source; +}; + +#define NOTFOUND ((struct name_table_entry *) 0) + +/* + * The file comp_userdefs.c contains an array of these structures, one per + * possible capability. These are indexed by a hash table array of pointers to + * the same structures for use by the parser. + */ +struct user_table_entry +{ + const char *ute_name; /* name to hash on */ + int ute_type; /* mask (BOOLEAN, NUMBER, STRING) */ + unsigned ute_argc; /* number of parameters */ + unsigned ute_args; /* bit-mask for string parameters */ + HashValue ute_index; /* index of associated variable in its array */ + HashValue ute_link; /* index in table of next hash, or -1 */ +}; + +/* + * The casts are required for correct sign-propagation with systems such as + * AIX, IRIX64, Solaris which default to unsigned characters. The C standard + * leaves this detail unspecified. + */ + +/* out-of-band values for representing absent capabilities */ +#define ABSENT_BOOLEAN ((signed char)-1) /* 255 */ +#define ABSENT_NUMERIC (-1) +#define ABSENT_STRING (char *)0 + +/* out-of-band values for representing cancels */ +#define CANCELLED_BOOLEAN ((signed char)-2) /* 254 */ +#define CANCELLED_NUMERIC (-2) +#define CANCELLED_STRING (char *)(-1) + +#define VALID_BOOLEAN(s) ((unsigned char)(s) <= 1) /* reject "-1" */ +#define VALID_NUMERIC(s) ((s) >= 0) +#define VALID_STRING(s) ((s) != CANCELLED_STRING && (s) != ABSENT_STRING) + +/* termcap entries longer than this may break old binaries */ +#define MAX_TERMCAP_LENGTH 1023 + +/* this is a documented limitation of terminfo */ +#define MAX_TERMINFO_LENGTH 4096 + +#ifndef TERMINFO +#define TERMINFO "/usr/share/terminfo" +#endif + +#ifdef NCURSES_TERM_ENTRY_H_incl + +/* + * These entrypoints are used only by the ncurses utilities such as tic. + */ +#ifdef NCURSES_INTERNALS +/* access.c */ +extern NCURSES_EXPORT(unsigned) _nc_pathlast (const char *); +extern NCURSES_EXPORT(bool) _nc_is_abs_path (const char *); +extern NCURSES_EXPORT(bool) _nc_is_dir_path (const char *); +extern NCURSES_EXPORT(bool) _nc_is_file_path (const char *); +extern NCURSES_EXPORT(char *) _nc_basename (char *); +extern NCURSES_EXPORT(char *) _nc_rootname (char *); + +/* comp_captab.c */ +extern NCURSES_EXPORT(const struct name_table_entry *) _nc_get_table (bool); +extern NCURSES_EXPORT(const HashData *) _nc_get_hash_info (bool); +extern NCURSES_EXPORT(const struct alias *) _nc_get_alias_table (bool); + +/* comp_hash.c: name lookup */ +extern NCURSES_EXPORT(struct name_table_entry const *) _nc_find_type_entry + (const char *, int, bool); +extern NCURSES_EXPORT(struct user_table_entry const *) _nc_find_user_entry + (const char *); + +/* comp_scan.c: lexical analysis */ +extern NCURSES_EXPORT(int) _nc_get_token (bool); +extern NCURSES_EXPORT(void) _nc_panic_mode (char); +extern NCURSES_EXPORT(void) _nc_push_token (int); +extern NCURSES_EXPORT_VAR(int) _nc_curr_col; +extern NCURSES_EXPORT_VAR(int) _nc_curr_line; +extern NCURSES_EXPORT_VAR(int) _nc_syntax; +extern NCURSES_EXPORT_VAR(int) _nc_strict_bsd; +extern NCURSES_EXPORT_VAR(long) _nc_comment_end; +extern NCURSES_EXPORT_VAR(long) _nc_comment_start; +extern NCURSES_EXPORT_VAR(long) _nc_curr_file_pos; +extern NCURSES_EXPORT_VAR(long) _nc_start_line; +#define SYN_TERMINFO 0 +#define SYN_TERMCAP 1 + +/* comp_error.c: warning & abort messages */ +extern NCURSES_EXPORT(const char *) _nc_get_source (void); +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_err_abort (const char *const,...) GCC_PRINTFLIKE(1,2); +extern NCURSES_EXPORT(void) _nc_get_type (char *name); +extern NCURSES_EXPORT(void) _nc_set_source (const char *const); +extern NCURSES_EXPORT(void) _nc_set_type (const char *const); +extern GCC_NORETURN NCURSES_EXPORT(void) _nc_syserr_abort (const char *const,...) GCC_PRINTFLIKE(1,2); +extern NCURSES_EXPORT(void) _nc_warning (const char *const,...) GCC_PRINTFLIKE(1,2); +extern NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings; + +/* comp_scan.c */ +extern NCURSES_EXPORT_VAR(struct token) _nc_curr_token; + +/* comp_userdefs.c */ +NCURSES_EXPORT(const struct user_table_entry *) _nc_get_userdefs_table (void); +NCURSES_EXPORT(const HashData *) _nc_get_hash_user (void); + +/* captoinfo.c: capability conversion */ +extern NCURSES_EXPORT(char *) _nc_captoinfo (const char *, const char *, int const); +extern NCURSES_EXPORT(char *) _nc_infotocap (const char *, const char *, int const); + +/* home_terminfo.c */ +extern NCURSES_EXPORT(char *) _nc_home_terminfo (void); + +/* init_keytry.c */ +#if BROKEN_LINKER +#define _nc_tinfo_fkeys _nc_tinfo_fkeysf() +extern NCURSES_EXPORT(const struct tinfo_fkeys *) _nc_tinfo_fkeysf (void); +#else +extern NCURSES_EXPORT_VAR(const struct tinfo_fkeys) _nc_tinfo_fkeys[]; +#endif + +/* lib_tparm.c */ +#define NUM_PARM 9 + +extern NCURSES_EXPORT_VAR(int) _nc_tparm_err; + +extern NCURSES_EXPORT(int) _nc_tparm_analyze(TERMINAL *, const char *, char **, int *); +extern NCURSES_EXPORT(void) _nc_reset_tparm(TERMINAL *); + +/* lib_trace.c */ +extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing; +extern NCURSES_EXPORT(const char *) _nc_visbuf (const char *); +extern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *); + +/* lib_tputs.c */ +extern NCURSES_EXPORT_VAR(int) _nc_nulls_sent; /* Add one for every null sent */ + +/* comp_expand.c: expand string into readable form */ +extern NCURSES_EXPORT(char *) _nc_tic_expand (const char *, bool, int); + +/* comp_hash.c: name lookup */ +extern NCURSES_EXPORT(struct name_table_entry const *) _nc_find_entry + (const char *, const HashValue *); +extern NCURSES_EXPORT(const HashValue *) _nc_get_hash_table (bool); + +/* comp_main.c: compiler main */ +extern const char * _nc_progname; + +/* db_iterator.c */ +extern NCURSES_EXPORT(const char *) _nc_next_db(DBDIRS *, int *); +extern NCURSES_EXPORT(const char *) _nc_tic_dir (const char *); +extern NCURSES_EXPORT(void) _nc_first_db(DBDIRS *, int *); +extern NCURSES_EXPORT(void) _nc_last_db(void); + +/* write_entry.c */ +extern NCURSES_EXPORT(int) _nc_tic_written (void); + +#endif /* NCURSES_INTERNALS */ + +#endif /* NCURSES_TERM_ENTRY_H_incl */ + +#ifdef __cplusplus +} +#endif + +/* *INDENT-ON* */ +#endif /* __TIC_H */ diff --git a/contrib/ncurses/include/unctrl.h.in b/contrib/ncurses/include/unctrl.h.in new file mode 100644 index 00000000..f76f4434 --- /dev/null +++ b/contrib/ncurses/include/unctrl.h.in @@ -0,0 +1,68 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2001,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* + * unctrl.h + * + * Display a printable version of a control character. + * Control characters are displayed in caret notation (^x), DELETE is displayed + * as ^?. Printable characters are displayed as is. + */ + +/* $Id: unctrl.h.in,v 1.12 2020/02/02 23:34:34 tom Exp $ */ + +#ifndef NCURSES_UNCTRL_H_incl +#define NCURSES_UNCTRL_H_incl 1 + +#undef NCURSES_VERSION +#define NCURSES_VERSION "@NCURSES_MAJOR@.@NCURSES_MINOR@" + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#undef unctrl +NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype); + +#if @NCURSES_SP_FUNCS@ +NCURSES_EXPORT(NCURSES_CONST char *) NCURSES_SP_NAME(unctrl) (SCREEN*, chtype); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* NCURSES_UNCTRL_H_incl */ diff --git a/contrib/ncurses/include/win32_curses.h b/contrib/ncurses/include/win32_curses.h new file mode 100644 index 00000000..06fb20a6 --- /dev/null +++ b/contrib/ncurses/include/win32_curses.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 2008-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 2008-on * + ****************************************************************************/ + +/* $Id: win32_curses.h,v 1.4 2024/08/31 18:17:44 tom Exp $ */ + +/* + * This is the interface we use on Windows to mimic the control of the settings + * of what acts like the classic TTY - the Windows Console. + */ + +#if (defined(_WIN32) || defined(_WIN64)) +#ifndef _NC_WIN32_CURSES_H +#define _NC_WIN32_CURSES_H 1 + +struct winconmode +{ + unsigned long dwFlagIn; + unsigned long dwFlagOut; +}; + +extern NCURSES_EXPORT(void*) _nc_console_fd2handle(int fd); +extern NCURSES_EXPORT(int) _nc_console_setmode(void* handle, const struct winconmode* arg); +extern NCURSES_EXPORT(int) _nc_console_getmode(void* handle, struct winconmode* arg); +extern NCURSES_EXPORT(int) _nc_console_flush(void* handle); + +/* + A few definitions of Unix functions we need to emulate +*/ +#define SIGHUP 1 +#define SIGKILL 9 + +#undef getlogin +#define getlogin() getenv("USERNAME") + +#undef ttyname +#define ttyname(fd) NULL + +#undef sleep +#define sleep(n) Sleep((n) * 1000) + +#endif /* _NC_WIN32_CURSES_H */ +#endif /* _WIN32||_WIN64 */ diff --git a/contrib/ncurses/install-sh b/contrib/ncurses/install-sh new file mode 100755 index 00000000..ec298b53 --- /dev/null +++ b/contrib/ncurses/install-sh @@ -0,0 +1,541 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2020-11-14.01; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. + -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -p) cpprog="$cpprog -p";; + + -s) stripcmd=$stripprog;; + + -S) backupsuffix="$2" + shift;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/contrib/ncurses/man/MKada_config.in b/contrib/ncurses/man/MKada_config.in new file mode 100644 index 00000000..ee037ff4 --- /dev/null +++ b/contrib/ncurses/man/MKada_config.in @@ -0,0 +1,149 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2010-2014,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: MKada_config.in,v 1.35 2024/04/20 21:13:27 tom Exp $ +.TH adacurses@USE_CFG_SUFFIX@\-config 1 2024-04-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ds C adacurses@USE_CFG_SUFFIX@\-config +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ' \(aq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ie t .ds ' \(aq +.el .ds ' ' +.\} +. +.\" Fix broken EX/EE macros on DWB troff. +.\" Detect it: only DWB sets up a `)Y` register. +.if !\n(.g .if \n()Y \{\ +.\" Revert the undesired changes to indentation. +.am EX +.in -5n +.. +.am EE +.in +5n +.. +.\} +. +.SH NAME +\fB\%adacurses@USE_CFG_SUFFIX@\-config\fP \- +configuration helper for \fI@ADA_LIBNAME@\fP libraries +.SH SYNOPSIS +.B \*C +.RB [ \-\-cflags ] +.RB [ \-\-libs ] +.PP +.B \*C \-\-version +.PP +.B \*C \-\-help +.SH DESCRIPTION +This program development aid simplifies the process of configuring +applications to use the \fI@ADA_LIBNAME@\fP library binding to +\fI\%ncurses\fP. +.SH OPTIONS +.TP 11 \" "--version" + 2n +\fB\-\-cflags\fP +reports the GNAT (Ada compiler) flags needed to compile with +\fI@ADA_LIBNAME@\fP. +.TP +\fB\-\-libs\fP +reports the GNAT libraries needed to link with \fI@ADA_LIBNAME@\fP. +.TP +\fB\-\-version\fP +reports the release and patch date information of the \fI\%ncurses\fP +libraries used to configure and build \fI@ADA_LIBNAME@\fP and exits +successfully. +.TP +\fB\-\-help\fP +issues a usage message and exits successfully. +.PP +Omitting options implies \*(``\fB\-\-cflags \-\-libs\fP\*(''. +.SH EXAMPLES +Consider a program using \fI@ADA_LIBNAME@\fP to write the message +\*(``Hello, world!\*('' in the center of the screen and wait for the +user to press the \*(``q\*('' key before exiting. +Populate a file \fIhello.adb\fP with the following. +.PP +.if \n(LL>67n .RS 4 +.EX +with Terminal_Interface.Curses; use Terminal_Interface.Curses; + +procedure Hello is + Visibility : Cursor_Visibility := Invisible; + Message : constant String := "Hello, World!"; + done : Boolean := False; + c : Key_Code; +begin + Init_Screen; + Set_Echo_Mode (False); + Set_Cursor_Visibility (Visibility); + Set_Timeout_Mode (Standard_Window, Non_Blocking, 0); + + Move_Cursor (Line => Lines / 2, + Column => (Columns \- Message\*'Length) / 2); + Add (Str => Message); + + while not done loop + c := Get_Keystroke (Standard_Window); + + case c is + when Character\*'Pos (\*'q\*') => done := True; + when others => null; + end case; + + Nap_Milli_Seconds (50); + end loop; + + End_Windows; +end Hello; +.EE +.if \n(LL>67n .RE +.ne 2 +.PP +Then, using +.RS 4 +.EX +gnatmake \(gaadacurses@USE_CFG_SUFFIX@\-config \-\-cflags\(ga hello \e + \-largs \(gaadacurses@USE_CFG_SUFFIX@\-config \-\-libs\(ga +.EE +.RE +or, more simply, +.RS 4 +.EX +gnatmake hello \(gaadacurses@USE_CFG_SUFFIX@\-config\(ga +.EE +.RE +you can compile and link the program. +.SH "SEE ALSO" +\fB\%curses\fP(3X) diff --git a/contrib/ncurses/man/MKncu_config.in b/contrib/ncurses/man/MKncu_config.in new file mode 100644 index 00000000..856e64b0 --- /dev/null +++ b/contrib/ncurses/man/MKncu_config.in @@ -0,0 +1,104 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: MKncu_config.in,v 1.25 2024/05/11 20:39:53 tom Exp $ +.TH @LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@\-config 1 2024-05-11 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.SH NAME +\fB\%@LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config\fP \- +configuration helper for \fI\%ncurses\fP libraries +.SH SYNOPSIS +.B @LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config +.I option +\&.\|.\|. +.PP +.B "@LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config \-\-version" +.PP +.B "@LIB_NAME@@DFT_ARG_SUFFIX@@cf_cv_abi_version@-config \-\-help" +.SH DESCRIPTION +This program development aid simplifies the process of configuring +applications against a particular set of \fI\%ncurses\fP libraries. +.SH OPTIONS +.TP 18 \" "--mouse-version" + 2n + adjustment for PDF +\fB\-\-prefix\fP +reports the package prefix of \fI\%ncurses\fP. +.TP +\fB\-\-exec\-prefix\fP +reports the executable prefix of \fI\%ncurses\fP. +.TP +\fB\-\-cflags\fP +reports the C compiler flags needed to compile with \fI\%ncurses\fP. +.TP +\fB\-\-libs\fP +reports the libraries needed to link with \fI\%ncurses\fP. +.TP +\fB\-\-abi\-version\fP +reports the ABI version of \fI\%ncurses\fP. +.TP +\fB\-\-mouse\-version\fP +reports the mouse\-interface version of \fI\%ncurses\fP. +.TP +\fB\-\-bindir\fP +reports the directory containing \fI\%ncurses\fP programs. +.TP +\fB\-\-datadir\fP +reports the directory containing \fI\%ncurses\fP data. +.TP +\fB\-\-includedir\fP +reports the directory containing \fI\%ncurses\fP header files. +.TP +\fB\-\-libdir\fP +reports the directory containing \fI\%ncurses\fP libraries. +.TP +\fB\-\-mandir\fP +reports the directory containing \fI\%ncurses\fP man pages. +.TP +\fB\-\-terminfo\fP +reports the \fI\%TERMINFO\fP \fIterminfo\fP database path, +for example \fI\%@TERMINFO@\fP. +.TP +\fB\-\-terminfo\-dirs\fP +reports the \fI\%TERMINFO_DIRS\fP supplemental search path for the +\fIterminfo\fP database, +for example \fI\%@TERMINFO_DIRS@\fP. +.TP +\fB\-\-termpath\fP +reports the \fI\%TERMPATH\fP supplemental search path for the +\fItermcap\fP database, +if support for \fItermcap\fP is configured. +.PP +The following options cause all others to be ignored. +.TP 11 .\" "--version" + 2n +\fB\-\-help\fP +issues a usage message and exits successfully. +.TP +\fB\-\-version\fP +issues the release and patch date information of \fI\%ncurses\fP and +exits successfully. +.SH "SEE ALSO" +\fB\%curses\fP(3X) diff --git a/contrib/ncurses/man/MKterminfo.sh b/contrib/ncurses/man/MKterminfo.sh new file mode 100755 index 00000000..882ef2ad --- /dev/null +++ b/contrib/ncurses/man/MKterminfo.sh @@ -0,0 +1,123 @@ +#!/bin/sh +# $Id: MKterminfo.sh,v 1.20 2024/01/13 20:37:40 tom Exp $ +# +# MKterminfo.sh -- generate terminfo.5 from Caps tabular data +# +#*************************************************************************** +# Copyright 2018-2020,2022 Thomas E. Dickey * +# Copyright 1998-2003,2017 Free Software Foundation, Inc. * +# * +# Permission is hereby granted, free of charge, to any person obtaining a * +# copy of this software and associated documentation files (the * +# "Software"), to deal in the Software without restriction, including * +# without limitation the rights to use, copy, modify, merge, publish, * +# distribute, distribute with modifications, sublicense, and/or sell * +# copies of the Software, and to permit persons to whom the Software is * +# furnished to do so, subject to the following conditions: * +# * +# The above copyright notice and this permission notice shall be included * +# in all copies or substantial portions of the Software. * +# * +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +# IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +# THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +# * +# Except as contained in this notice, the name(s) of the above copyright * +# holders shall not be used in advertising or otherwise to promote the * +# sale, use or other dealings in this Software without prior written * +# authorization. * +#*************************************************************************** +# +# This script takes terminfo.head and terminfo.tail and splices in between +# them a table derived from the Caps data file. Besides avoiding having +# the docs fall out of sync with the table, this also lets us set up tbl +# commands for better formatting of the table. +# +# NOTE: The s in this script really are control characters. It translates +#  to \n because I couldn't get used to inserting linefeeds directly. There +# had better be no s in the table source text. +# +# keep the order independent of locale: +if test "${LANGUAGE+set}" = set; then LANGUAGE=C; export LANGUAGE; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +if test "${LC_COLLATE+set}" = set; then LC_COLLATE=C; export LC_COLLATE; fi + +# +head="$1" +shift 1 +caps= +while test $# -gt 1 +do + caps="$caps $1" + shift 1 +done +tail="$1" +cat <$unsorted + +rm -f $sorted +rm -f $temp +saved=no +while true +do + data= + read data + test -z "$data" && break + case "$data" in #(vi + **) #(vi + echo "$data" >>$temp + saved=yes + ;; + *) + if test $saved = yes ; then + saved=no + sort $temp >>$sorted + rm -f $temp + fi + echo "$data" >>$sorted + ;; + esac +done <$unsorted +test $saved = yes && sort $temp >>$sorted + +sed -e 's/^\.\.$//' $sorted | tr "\005\006" "\012\134" + +sed -e '/^center expand;/s, expand,,' \ + -e '/^\.TS/,/^\\/s, lw[1-9][0-9]*\., l.,' \ + "$tail" diff --git a/contrib/ncurses/man/Makefile.in b/contrib/ncurses/man/Makefile.in new file mode 100644 index 00000000..87706894 --- /dev/null +++ b/contrib/ncurses/man/Makefile.in @@ -0,0 +1,107 @@ +# $Id: Makefile.in,v 1.55 2024/08/10 18:19:16 tom Exp $ +############################################################################## +# Copyright 2019-2022,2024 Thomas E. Dickey # +# Copyright 1998-2013,2015 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996,1997 +# +# Makefile for ncurses manual pages. +# +# NOTE: When you add or rename a man page, make sure you update both +# the top-level MANIFEST and any man/*.renames files! + +SHELL = @SHELL@ +VPATH = @srcdir@ + +DESTDIR = @DESTDIR@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ +mandir = @mandir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) +MANDIR = $(DESTDIR)$(mandir@MERGE_PREFIX@) + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : depend +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.man +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.man + +all \ +sources : terminfo.5 +depend : +tags : + +$(MANDIR) : + mkdir -p $@ + +EDITARGS = $(MANDIR) $(srcdir) terminfo.5 *-config.1 $(srcdir)/*.[0-9]* + +install install.man : terminfo.5 $(MANDIR) + $(SHELL) ../edit_man.sh normal installing $(EDITARGS) + +uninstall uninstall.man : + -$(SHELL) ../edit_man.sh normal removing $(EDITARGS) + +# We compose terminfo.5 from the real sources... +CAPLIST = \ + $(srcdir)/../include/@TERMINFO_CAPS@ \ + $(srcdir)/../include/Caps-ncurses +terminfo.5: $(srcdir)/terminfo.head \ + $(CAPLIST) \ + $(srcdir)/terminfo.tail \ + Makefile $(srcdir)/MKterminfo.sh + $(SHELL) $(srcdir)/MKterminfo.sh $(srcdir)/terminfo.head $(CAPLIST) $(srcdir)/terminfo.tail >terminfo.5 + +mostlyclean : + -rm -f core tags TAGS *~ *.bak *.ln *.atac trace + +clean: mostlyclean + rm -f terminfo.5 + +../edit_man.sed : make_sed.sh + $(SHELL) $(srcdir)/make_sed.sh @MANPAGE_RENAMES@ >../edit_man.sed + +distclean realclean: clean + -rm -f Makefile *-config.1 ../edit_man.* ../man_alias.* man_db.renames diff --git a/contrib/ncurses/man/captoinfo.1m b/contrib/ncurses/man/captoinfo.1m new file mode 100644 index 00000000..46726082 --- /dev/null +++ b/contrib/ncurses/man/captoinfo.1m @@ -0,0 +1,234 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: captoinfo.1m,v 1.65 2024/09/14 00:39:51 tom Exp $ +.TH @CAPTOINFO@ 1M 2024-09-13 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%@CAPTOINFO@\fP \- +convert a \fItermcap\fP description into a \fI\%term\%info\fP description +.SH SYNOPSIS +.B @CAPTOINFO@ +.RI [ tic-option ] +.RI [ file +\&.\|.\|.] +.P +.B "@CAPTOINFO@ \-V" +.SH DESCRIPTION +\fB\%@CAPTOINFO@\fP translates terminal descriptions. +It looks in each given text \fIfile\fP for \fI\%termcap\fP entries and, +for each one found, +writes an equivalent \fI\%\%term\%info\fP description to the standard +output stream. +\fI\%termcap\fP \fBtc\fP capabilities translate to \fI\%\%term\%info\fP +\*(``\fBuse\fP\*('' capabilities. +.PP +If no \fIfile\fPs are specified, +\fB\%@CAPTOINFO@\fP interprets the content of the environment variable +\fI\%TERMCAP\fP as a file name, +and extracts only the entry for the terminal named in the environment +variable \fITERM\fP from it. +If the environment variable \fI\%TERMCAP\fP is not set, +\fB\%@CAPTOINFO@\fP reads +.IR \%/etc/termcap . +.PP +This utility is implemented as a link to \fB\%@TIC@\fP(1M), +with the latter's +.B \-I +option implied. +You can use other \fB\%@TIC@\fP options such as +.BR \-1 , +.BR \-f , +.BR \-v , +.BR \-w , +and +.BR \-x . +The \fB\-V\fP option reports the version of \fI\%ncurses\fP associated +with this program and exits with a successful status. +.SS "Translations from Nonstandard Capabilities" +\fB\%@CAPTOINFO@\fP translates some obsolete, +nonstandard capabilities into standard +\fI\%\%term\%info\fP capabilities. +It issues a diagnostic to the standard error stream for each, +inviting the user to check that it has not mistakenly translated an +unknown or mistyped capability name. +.PP +.\" DWB 3.3 tbl requires the two junk "L" specifiers in the first row. +.TS +center; +Cb S L L +Cb Cb Cb Cb +Cb Cb C Lb. +\f(BItermcap\fP Code +Obsolete Standard Origin \f(BIterminfo\fP capability +_ +BO mr AT&T enter_reverse_mode +CI vi AT&T cursor_invisible +CV ve AT&T cursor_normal +DS mh AT&T enter_dim_mode +EE me AT&T exit_attribute_mode +FE LF AT&T label_on +FL LO AT&T label_off +XS mk AT&T enter_secure_mode +EN @7 XENIX key_end +GE ae XENIX exit_alt_charset_mode +GS as XENIX enter_alt_charset_mode +HM kh XENIX key_home +LD kL XENIX key_dl +PD kN XENIX key_npage +PN po XENIX prtr_off +PS pf XENIX prtr_on +PU kP XENIX key_ppage +RT @8 XENIX kent +UP ku XENIX kcuu1 +KA k; Tektronix key_f10 +KB F1 Tektronix key_f11 +KC F2 Tektronix key_f12 +KD F3 Tektronix key_f13 +KE F4 Tektronix key_f14 +KF F5 Tektronix key_f15 +BC Sb Tektronix set_background +FC Sf Tektronix set_foreground +HS mh IRIX enter_dim_mode +.TE +.PP +XENIX \fI\%termcap\fP had a set of extension capabilities, +corresponding to box drawing characters of CCSID +(\*(``code page\*('') 437, +as follows. +.PP +.TS +center; +cb cb +cb l . +\f(BItermcap\fP Code Graphic +_ +G2 upper left corner +G3 lower left corner +G1 upper right corner +G4 lower right corner +GR tee pointing right +GL tee pointing left +GU tee pointing up +GD tee pointing down +GH horizontal line +GV vertical line +GC intersection +G6 double upper left corner +G7 double lower left corner +G5 double upper right corner +G8 double lower right corner +Gr double tee pointing right +Gr double tee pointing left +Gu double tee pointing up +Gd double tee pointing down +Gh double horizontal line +Gv double vertical line +Gc double intersection +.\" TODO: There are about 40 box drawing code points in CCSID 437; +.\" were there no XENIX capabilities for the mixed single- and double- +.\" line intersections? +.\" +.\" TODO: GG doesn't seem to fit with the others; explain it. +GG ACS magic cookie count +.TE +.PP +\fB\%@CAPTOINFO@\fP composes single-line capabilities into an \fBacsc\fP +string, +and discards \fBGG\fP and double-line capabilities with a warning +diagnostic. +.PP +IBM's AIX has a \fI\%\%term\%info\fP facility descended from SVr1 +\fI\%\%term\%info\fP, +but which is incompatible with the SVr4 format. +\fB\%@CAPTOINFO@\fP translates the following AIX extensions. +.PP +.TS +center; +cb cb +l l . +IBM X/Open +_ +ksel kslt +kbtab kcbt +font0 s0ds +font1 s1ds +font2 s2ds +font3 s3ds +.TE +.PP +Additionally, +this program translates the AIX \fBbox1\fP capability to an \fBacsc\fP +string. +.PP +The HP-UX \fI\%\%term\%info\fP library supports two nonstandard +\fI\%\%term\%info\fP capabilities, +\fBmeml\fP (memory lock) and \fBmemu\fP (memory unlock). +\fB\%@CAPTOINFO@\fP discards these with a warning message. +.SH FILES +.TP +.I /etc/termcap +default \fI\%termcap\fP terminal capability database +.SH PORTABILITY +X/Open Curses, +Issue 7 (2009) describes \fBtic\fP briefly, +but omits this program. +.PP +SVr4 systems provide \fB\%captoinfo\fP as a separate application from +\fBtic\fP. +Its +.B \-v +option does not accept a trace level argument +.IR n ; +repeat +.B \-v +.I n +times instead. +.PP +NetBSD does not provide this application. +.SH AUTHORS +Eric S. Raymond +and +.br +Thomas E. Dickey +.SH SEE ALSO +\fB\%@INFOCMP@\fP(1M), +\fB\%@TIC@\fP(1M), +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/clear.1 b/contrib/ncurses/man/clear.1 new file mode 100644 index 00000000..a1034db7 --- /dev/null +++ b/contrib/ncurses/man/clear.1 @@ -0,0 +1,186 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: clear.1,v 1.48 2024/03/16 15:35:01 tom Exp $ +.TH @CLEAR@ 1 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ' \(aq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ie t .ds ' \(aq +.el .ds ' ' +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%@CLEAR@\fP \- +clear the terminal screen +.SH SYNOPSIS +.B @CLEAR@ +.RB [ \-x ] +.RB [ \-T\ \c +.IR terminal-type ] +.PP +.B "@CLEAR@ \-V" +.SH DESCRIPTION +\fB\%@CLEAR@\fP clears your terminal's screen and its scrollback buffer, +if any. +\fB\%@CLEAR@\fP retrieves the terminal type from the environment +variable \fITERM\fP, +then consults the \fIterminfo\fP terminal capability database entry for +that type to determine how to perform these actions. +.PP +The capabilities to clear the screen and scrollback buffer are named +\*(``clear\*('' and \*(``E3\*('', respectively. +The latter is a \fIuser-defined capability\fP, +applying an extension mechanism introduced in \fI\%ncurses\fP 5.0 +(1999). +.SH OPTIONS +\fB\%@CLEAR@\fP recognizes the following options. +.TP 9 \" "-T type" + 2n +.B \-T \fItype\fP +produces instructions suitable for the terminal \fItype\fP. +Normally, +this option is unnecessary, +because the terminal type is inferred from the environment variable +\fITERM\fP. +If this option is specified, +\fB\%@CLEAR@\fP ignores the environment variables \fILINES\fP and +\fI\%COLUMNS\fP as well. +.TP +.B \-V +reports the version of \fI\%ncurses\fP associated with this program and +exits with a successful status. +.TP +.B \-x +prevents \fB\%@CLEAR@\fP from attempting to clear the scrollback buffer. +.SH PORTABILITY +Neither IEEE Std 1003.1/The Open Group Base Specifications Issue 7 +(POSIX.1-2008) nor X/Open Curses Issue 7 documents \fB\%@CLEAR@\fP. +.PP +The latter documents \fBtput\fP, +which could be used to replace this utility either via a shell script or +by an alias +(such as a symbolic link) +to run \fB\%@TPUT@\fP as \fB\%@CLEAR@\fP. +.SH HISTORY +A \fBclear\fP command using the \fItermcap\fP database and library +appeared in 2BSD (1979). +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=2BSD/src/clear.c +Eighth Edition Unix (1985) later included it. +.PP +The commercial Unix arm of AT&T adapted a different BSD program +(\fBtset\fP) to make a new command, +\fBtput\fP, +and replaced the \fBclear\fP program with a shell script that called +\*(``\fBtput clear\fP\*(''. +.PP +.RS 4 +.EX +/usr/bin/tput ${1:+\-T$1} clear 2> /dev/null +exit +.EE +.RE +.PP +In 1989, when Keith Bostic revised the BSD \fBtput\fP command +to make it similar to AT&T's \fBtput\fP, +he added a \fBclear\fP shell script as well. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=Net2/usr/src/usr.bin/\ +.\" tput/clear.sh +.PP +.RS 4 +.EX +exec tput clear +.EE +.RE +.PP +The remainder of the script in each case is a copyright notice. +.PP +In 1995, +\fI\%ncurses\fP's \fBclear\fP began by adapting BSD's original +\fBclear\fP command to use \fIterminfo\fP. +The \fBE3\fP extension came later. +.bP +In June 1999, \fIxterm\fP provided an extension to the standard control +sequence for clearing the screen. +Rather than clearing just the visible part of the screen using +.RS 8 +.PP +.EX +printf \*'\e033[2J\*' +.EE +.RE +.IP +one could clear the scrollback buffer as well by using +.RS 8 +.PP +.EX +printf \*'\e033[\fB3\fPJ\*' +.EE +.RE +.IP +instead. +\*(``XTerm Control Sequences\fP\*('' documents this feature as +originating with \fIxterm\fP. +.bP +A few other terminal emulators adopted it, +such as PuTTY in 2006. +.bP +In April 2011, a Red Hat developer submitted a patch to the Linux +kernel, modifying its console driver to do the same thing. +Documentation of this change, +appearing in Linux 3.0, +did not mention \fIxterm\fP, +although that program was cited in the Red Hat bug report (#683733) +motivating the feature. +.bP +Subsequently, +more terminal developers adopted the feature. +The next relevant step was to change the \fI\%ncurses\fP \fBclear\fP +program in 2013 to incorporate this extension. +.bP +In 2013, +the \fBE3\fP capability was not exercised by +\*(``\fB\%@TPUT@ clear\fP\*(''. +That oversight was addressed in 2016 by reorganizing \fB\%@TPUT@\fP to +share its logic with \fB\%@CLEAR@\fP and \fB\%@TSET@\fP. +.SH SEE ALSO +\fB\%@TPUT@\fP(1), +\fB\%xterm\fP(1), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_add_wch.3x b/contrib/ncurses/man/curs_add_wch.3x new file mode 100644 index 00000000..8e293b92 --- /dev/null +++ b/contrib/ncurses/man/curs_add_wch.3x @@ -0,0 +1,563 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2001-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_add_wch.3x,v 1.71 2024/07/27 20:05:18 tom Exp $ +.TH curs_add_wch 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%add_wch\fP, +\fB\%wadd_wch\fP, +\fB\%mvadd_wch\fP, +\fB\%mvwadd_wch\fP, +\fB\%echo_wchar\fP, +\fB\%wecho_wchar\fP \- +add a \fIcurses\fR complex character to a window, possibly advancing the cursor +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint add_wch(const cchar_t *\fIwch\fP); +\fBint wadd_wch(WINDOW *\fIwin\fP, const cchar_t *\fIwch\fP); +\fBint mvadd_wch(int \fIy\fP, int \fIx\fP, const cchar_t *\fIwch\fP); +\fBint mvwadd_wch(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t *\fIwch\fP); +.PP +\fBint echo_wchar(const cchar_t *\fIwch\fP); +\fBint wecho_wchar(WINDOW *\fIwin\fP, const cchar_t *\fIwch\fP); +.fi +.SH DESCRIPTION +.SS wadd_wch +.B \%wadd_wch +writes the complex character +.I wch +to the window +.IR win "," +then may advance the cursor position, +analogously to the standard C library's \fI\%putwchar\fP(3). +\fB\%ncurses\fP(3X) describes the variants of this function. +.PP +Much behavior depends on whether the wide characters in +.I wch +are spacing or non-spacing; +see subsection \*(``Complex Characters\*('' below. +.bP +If +.I wch +contains a spacing character, +then any character at the cursor is first removed. +The complex character +.IR wch "," +with its attributes and color pair identifier, +becomes the +.I base +of the +.IR "active complex character" "." +.bP +If +.I wch +contains only non-spacing characters, +.\" XXX: see wadd_wch_literal (the beginning of the array may be nonspacing) +they are combined with the active complex character. +.I curses +ignores its attributes and color pair identifier, +and does not advance the cursor. +.PP +Further non-spacing characters added with +.B \%wadd_wch +are not written at the new cursor position but combine with the active +complex character until another spacing character is written to the +window or the cursor is moved. +.PP +If advancement occurs at the right margin, +.bP +the cursor automatically wraps to the beginning of the next line, +then, +.bP +if it was at the bottom of the scrolling region, +and if \fB\%scrollok\fP(3X) is enabled for +.IR win , +the scrolling region scrolls up one line. +.PP +If +.I wch +is a +backspace, +carriage return, +line feed, +or +tab, +the cursor moves appropriately within the window. +.bP +Backspace moves the cursor one character left; +at the left margin of a window, +it does nothing. +.bP +Carriage return moves the cursor to the left margin on the same line of +the window. +.bP +Line feed does a \fB\%clrtoeol\fP(3X), +then advances as if from the right margin. +.bP +Tab advances the cursor to the next tab stop +(possibly on the next line); +these are placed at every eighth column by default. +Alter the tab interval with the +.B \%TABSIZE +extension; +see \fB\%curs_variables\fP(3X). +.PP +If +.I wch +is any other nonprintable character, +it is drawn in printable form using the same convention as +\fB\%wunctrl\fP(3X). +Calling \fB\%win_wch\fP(3X) on the location of a nonprintable character +does not return the character itself, +but its \fB\%wunctrl\fP(3X) representation. +.PP +A +.I \%cchar_t +can be copied from place to place using \fB\%win_wch\fP(3X) and +.BR \%wadd_wch "." +.SS wecho_wchar +.B \%echo_wchar +and +.B \%wecho_wchar +are equivalent to calling +.RB \%( w ) add_wch +followed by +.RB \%( w ) refresh . +.I curses +interprets these functions as a hint that only a single (complex) +character is being output; +for non-control characters, +a considerable performance gain may be enjoyed by employing them. +.\" TODO: Combine the following with the "Line Drawing" subsection of +.\" terminfo(5) and replace this with a cross reference there. +.SS "Forms-Drawing Characters" +.I curses +defines macros starting with +.B \%WACS_ +that can be used with +.B \%wadd_wch +to write line-drawing and other special characters to the screen. +.I \%ncurses +terms these +.I "forms-drawing characters." +The ACS default listed below is used if the +.B \%acs_chars +.RB \%( acsc ) +.I \%term\%info +capability does not define a terminal-specific replacement for it, +or if the terminal and locale configuration requires Unicode to access +these characters but the library is unable to use Unicode. +The \*(``acsc char\*('' column corresponds to how the characters are +specified in the +.B \%acs_chars +.RB \%( acsc ) +string capability, +and the characters in it may appear on the screen if the terminal type's +database entry incorrectly advertises ACS support. +The name \*(``ACS\*('' originates in the Alternate Character Set feature +of the DEC VT100 terminal. +.PP +.ie t .ne 4v +.el .ne 5v +.TS +Lb Lb Lb Lb Lb +Lb Lb Lb Lb Lb +Lb L L L Lx. +\& Unicode ACS acsc \& +Symbol Default Default char Glyph Name +_ +WACS_BLOCK 0x25ae # 0 T{ +solid square block +T} +WACS_BOARD 0x2592 # h board of squares +WACS_BTEE 0x2534 + v bottom tee +WACS_BULLET 0x00b7 o ~ bullet +WACS_CKBOARD 0x2592 : a T{ +checker board (stipple) +T} +WACS_DARROW 0x2193 v . T{ +arrow pointing down +T} +WACS_DEGREE 0x00b0 ' f degree symbol +WACS_DIAMOND 0x25c6 + \(ga diamond +WACS_GEQUAL 0x2265 > > T{ +greater-than-or-equal-to +T} +WACS_HLINE 0x2500 \- q horizontal line +WACS_LANTERN 0x2603 # i lantern symbol +WACS_LARROW 0x2190 < , T{ +arrow pointing left +T} +WACS_LEQUAL 0x2264 < y T{ +less-than-or-equal-to +T} +WACS_LLCORNER 0x2514 + m T{ +lower left-hand corner +T} +WACS_LRCORNER 0x2518 + j T{ +lower right-hand corner +T} +WACS_LTEE 0x2524 + t left tee +WACS_NEQUAL 0x2260 ! | not-equal +WACS_PI 0x03c0 * { greek pi +WACS_PLMINUS 0x00b1 # g plus/minus +WACS_PLUS 0x253c + n plus +WACS_RARROW 0x2192 > + T{ +arrow pointing right +T} +WACS_RTEE 0x251c + u right tee +WACS_S1 0x23ba \- o scan line 1 +WACS_S3 0x23bb \- p scan line 3 +WACS_S7 0x23bc \- r scan line 7 +WACS_S9 0x23bd \&_ s scan line 9 +WACS_STERLING 0x00a3 f } T{ +pound-sterling symbol +T} +WACS_TTEE 0x252c + w top tee +WACS_UARROW 0x2191 ^ \- T{ +arrow pointing up +T} +WACS_ULCORNER 0x250c + l T{ +upper left-hand corner +T} +WACS_URCORNER 0x2510 + k T{ +upper right-hand corner +T} +WACS_VLINE 0x2502 | x vertical line +.TE +.PP +The wide-character configuration of \fI\%ncurses\fP also defines symbols +for thick lines (\fBacsc\fP \*(``J\*('' to \*(``V\*(''): +.PP +.TS +Lb Lb Lb Lb Lb +Lb Lb Lb Lb Lb +Lb L L L Lx. +\& Unicode ASCII acsc \& +ACS Name Default Default Char Glyph Name +_ +WACS_T_BTEE 0x253b + V T{ +thick tee pointing up +T} +WACS_T_HLINE 0x2501 - Q T{ +thick horizontal line +T} +WACS_T_LLCORNER 0x2517 + M T{ +thick lower left corner +T} +WACS_T_LRCORNER 0x251b + J T{ +thick lower right corner +T} +WACS_T_LTEE 0x252b + T T{ +thick tee pointing right +T} +WACS_T_PLUS 0x254b + N T{ +thick large plus +T} +WACS_T_RTEE 0x2523 + U T{ +thick tee pointing left +T} +WACS_T_TTEE 0x2533 + W T{ +thick tee pointing down +T} +WACS_T_ULCORNER 0x250f + L T{ +thick upper left corner +T} +WACS_T_URCORNER 0x2513 + K T{ +thick upper right corner +T} +WACS_T_VLINE 0x2503 | X T{ +thick vertical line +T} +.TE +.PP +and for double-lines (\fBacsc\fP \*(``A\*('' to \*(``I\*(''): +.PP +.TS +Lb Lb Lb Lb Lb +Lb Lb Lb Lb Lb +Lb L L L Lx. +\& Unicode ASCII acsc \& +ACS Name Default Default Char Glyph Name +_ +WACS_D_BTEE 0x2569 + H T{ +double tee pointing up +T} +WACS_D_HLINE 0x2550 - R T{ +double horizontal line +T} +WACS_D_LLCORNER 0x255a + D T{ +double lower left corner +T} +WACS_D_LRCORNER 0x255d + A T{ +double lower right corner +T} +WACS_D_LTEE 0x2560 + F T{ +double tee pointing right +T} +WACS_D_PLUS 0x256c + E T{ +double large plus +T} +WACS_D_RTEE 0x2563 + G T{ +double tee pointing left +T} +WACS_D_TTEE 0x2566 + I T{ +double tee pointing down +T} +WACS_D_ULCORNER 0x2554 + C T{ +double upper left corner +T} +WACS_D_URCORNER 0x2557 + B T{ +double upper right corner +T} +WACS_D_VLINE 0x2551 | Y T{ +double vertical line +T} +.TE +.PP +Unicode's descriptions for these characters differs slightly from +\fI\%ncurses\fP, +by introducing the term \*(``light\*('' (along with less important details). +Here are its descriptions for the normal, thick, and double horizontal lines: +.bP +U+2500 BOX DRAWINGS LIGHT HORIZONTAL +.bP +U+2501 BOX DRAWINGS HEAVY HORIZONTAL +.bP +U+2550 BOX DRAWINGS DOUBLE HORIZONTAL +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +In +.IR \%ncurses , +.B \%wadd_wch +returns +.B ERR +if +.bP +.I win +is +.BR NULL "," +.bP +wrapping to a new line is impossible because \fB\%scrollok\fP(3X) has +not been called on +.I win +when writing to its bottom right location is attempted, +or +.bP +it is not possible to add a complete character at the cursor position. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +.BR add_wch "," +.BR mvadd_wch "," +.BR mvwadd_wch "," +and +.B echo_wchar +may be implemented as macros. +.SH EXTENSIONS +.SS TABSIZE +The +.B TABSIZE +variable is implemented in SVr4 and other versions of +.IR curses , +but is not specified by X/Open Curses +(see \fBcurs_variables\fP(3X)). +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4. +It specifies no error conditions for them. +.PP +The defaults specified for forms-drawing characters apply in the POSIX +locale. +X/Open Curses makes it clear that the WACS_ symbols should be defined as +a pointer to \fBcchar_t\fP data, e.g., in the discussion of \fBborder_set\fP. +A few implementations are problematic: +.bP +NetBSD curses defines the symbols as a \fBwchar_t\fP within a \fBcchar_t\fP. +.bP +HP-UX curses equates some of the \fBACS_\fP symbols +to the analogous \fBWACS_\fP symbols as if the \fBACS_\fP symbols were +wide characters. +The misdefined symbols are the arrows +and other symbols which are not used for line-drawing. +.PP +X/Open Curses does not specify symbols for thick- or double-lines. +SVr4 curses implementations defined their line-drawing symbols in +terms of intermediate symbols. +This implementation extends those symbols, providing new definitions +which are not in the SVr4 implementations. +.PP +Not all Unicode-capable terminals provide support for VT100-style +alternate character sets (i.e., the \fBacsc\fP capability), +with their corresponding line-drawing characters. +X/Open Curses did not address the aspect of integrating Unicode with +line-drawing characters. +Existing implementations of Unix curses (AIX, HP-UX, Solaris) +use only the \fBacsc\fP character-mapping to provide this feature. +As a result, those implementations can only use single-byte line-drawing +characters. +\fI\%ncurses\fP 5.3 (2002) provided a table of Unicode values to solve +these problems. +NetBSD curses incorporated that table in 2010. +.PP +In this implementation, the Unicode values are used instead of the +terminal description's \fBacsc\fP mapping as discussed in +\fB\%ncurses\fP(3X) for the environment variable +\fINCURSES_NO_UTF8_ACS\fP. +In contrast, for the same cases, the line-drawing characters +described in \fB\%addch\fP(3X) will use only the ASCII default values. +.PP +Having Unicode available does not solve all of the problems with +line-drawing for curses: +.bP +The closest Unicode equivalents to the +VT100 graphics \fIS1\fP, \fIS3\fP, \fIS7\fP and \fIS9\fP +frequently are not displayed at +the regular intervals which the terminal used. +.bP +The \fIlantern\fP is a special case. +It originated with the AT&T 4410 terminal in the early 1980s. +There is no accessible documentation depicting the lantern symbol +on the AT&T terminal. +.IP +Lacking documentation, most readers assume that a \fIstorm lantern\fP +was intended. +But there are several possibilities, all with problems. +.IP +Unicode 6.0 (2010) does provide two lantern symbols: U+1F383 and U+1F3EE. +Those were not available in 2002, and are irrelevant since +they lie outside the BMP and as a result are not generally available +in terminals. +They are not storm lanterns, in any case. +.IP +Most \fIstorm lanterns\fP have a tapering glass chimney +(to guard against tipping); +some have a wire grid protecting the chimney. +.IP +For the tapering appearance, \[u2603] U+2603 was adequate. +In use on a terminal, no one can tell what the image represents. +Unicode calls it a snowman. +.IP +Others have suggested these alternatives: +\[sc] U+00A7 (section mark), +\[u0398] U+0398 (theta), +\[u03A6] U+03A6 (phi), +\[u03B4] U+03B4 (delta), +\[u2327] U+2327 (x in a rectangle), +\[u256C] U+256C (forms double vertical and horizontal), and +\[u2612] U+2612 (ballot box with x). +.SS "Complex Characters" +The complex character type +.I \%cchar_t +can store more than one wide character +.RI \%( wchar_t ). +X/Open Curses does not mention this possibility, +specifying behavior only where +.I wch +is a single character, +either spacing or non-spacing. +.PP +.I \%ncurses +assumes that +.I wch +is constructed using \fB\%setcchar\fP(3X), +and in turn that the result +.bP +contains at most one spacing character at the beginning of its list of +wide characters, +and zero or more non-spacing characters, +or +.bP +holds one non-spacing character. +.PP +In the latter case, +.I \%ncurses +adds the non-spacing character to the active complex character. +.SH HISTORY +These functions were initially specified by X/Open Curses, +Issue 4. +The System\ V Interface Definition, +Version 4 (1995), +specified functions named +.I \%waddwch +and +.I \%wechowchar +(and the usual variants). +.\" SVID 4, vol 3., p. 475 +These were later additions to +.RI SVr4. x , +not appearing in the first SVr4 (1989). +They differed from X/Open's later +.I \%wadd_wch +and +.I \%wecho_wchar +in that they each took an argument of type +.I \%wchar_t +instead of +.IR \%cchar_t "." +.SH SEE ALSO +\fB\%curs_addch\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_addwstr\fP(3X), +\fB\%curs_add_wchstr\fP(3X), +\fB\%curs_attr\fP(3X), +\fB\%curs_clear\fP(3X), +\fB\%curs_getcchar\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%putwc\fP(3) diff --git a/contrib/ncurses/man/curs_add_wchstr.3x b/contrib/ncurses/man/curs_add_wchstr.3x new file mode 100644 index 00000000..145a270f --- /dev/null +++ b/contrib/ncurses/man/curs_add_wchstr.3x @@ -0,0 +1,172 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_add_wchstr.3x,v 1.44 2024/07/27 20:05:18 tom Exp $ +.TH curs_add_wchstr 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%add_wchstr\fP, +\fB\%wadd_wchstr\fP, +\fB\%mvadd_wchstr\fP, +\fB\%mvwadd_wchstr\fP, +\fB\%add_wchnstr\fP, +\fB\%wadd_wchnstr\fP, +\fB\%mvadd_wchnstr\fP, +\fB\%mvwadd_wchnstr\fP \- +add a \fIcurses\fR complex character string to a window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint add_wchstr(const cchar_t * \fIwchstr\fP); +\fBint wadd_wchstr(WINDOW * \fIwin\fP, const cchar_t * \fIwchstr\fP); +\fBint mvadd_wchstr(int \fIy\fP, int \fIx\fP, const cchar_t * \fIwchstr\fP); +\fBint mvwadd_wchstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t * \fIwchstr\fP); +.PP +\fBint add_wchnstr(const cchar_t * \fIwchstr\fP, int \fIn\fP); +\fBint wadd_wchnstr(WINDOW * \fIwin\fP, const cchar_t * \fIwchstr\fP, int \fIn\fP); +\fBint mvadd_wchnstr(int \fIy\fP, int \fIx\fP, const cchar_t * \fIwchstr\fP, int \fIn\fP); +\fBint mvwadd_wchnstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t * \fIwchstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%wadd_wchstr +copies the string of complex characters +.I \%wchstr +to the window +.IR win "." +A null complex character terminates the string. +If a complex character does not completely fit at the end of the line, +.I curses +fills the remaining columns with the window background; +see \fB\%bkgrnd\fP(3X). +.B \%wadd_wchnstr +does the same, +but copies at most +.I n +characters, +or as many as possible if +.I n +is +.BR \-1 "." +\fB\%ncurses\fP(3X) describes the variants of these functions. +.PP +Because these functions do not call \fB\%wadd_wch\fP(3X) internally, +they are faster than \fB\%waddwstr\fP(3X) and \fB\%waddnwstr\fP(3X). +On the other hand, +they +.bP +do not treat the backspace, +carriage return, +or line feed characters specially; +.bP +do not represent unprintable characters with \fB\%wunctrl\fP(3X); +.bP +do not update the cursor position to follow the last character written; +.bP +truncate the string at the window's right margin, +rather than wrapping it to the next line and potentially scrolling. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.B NULL +or +.bP +.I wchstr +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%wadd_wchnstr +may be implemented as macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.SH HISTORY +These functions were initially specified by X/Open Curses, +Issue 4. +The System\ V Interface Definition, +Version 4 (1995), +specified functions named +.I \%waddwchstr +and +.I \%waddwchnstr +(and the usual variants). +.\" SVID 4, vol 3., p. 477 +These were later additions to +.RI SVr4. x , +not appearing in the first SVr4 (1989). +They differed from X/Open's later +.I \%wadd_wchstr +and +.I \%wadd_wchnstr +in that they each took an argument of type +.I \%wchar_t +instead of +.IR \%cchar_t "." +.SH SEE ALSO +\fB\%curs_addchstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_addwstr\fP(3X), +\fB\%curs_add_wch\fP(3X) diff --git a/contrib/ncurses/man/curs_addch.3x b/contrib/ncurses/man/curs_addch.3x new file mode 100644 index 00000000..c70b8a86 --- /dev/null +++ b/contrib/ncurses/man/curs_addch.3x @@ -0,0 +1,505 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_addch.3x,v 1.100 2024/09/21 18:03:23 tom Exp $ +.TH curs_addch 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ' \(aq +.ds ^ \(ha +.ds ~ \(ti +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ds ' ' +.ds ^ ^ +.ds ~ ~ +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%addch\fP, +\fB\%waddch\fP, +\fB\%mvaddch\fP, +\fB\%mvwaddch\fP, +\fB\%echochar\fP, +\fB\%wechochar\fP \- +add a \fIcurses\fP character to a window and advance the cursor +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint addch(const chtype \fIch\fP); +\fBint waddch(WINDOW *\fIwin\fP, const chtype \fIch\fP); +\fBint mvaddch(int \fIy\fP, int \fIx\fP, const chtype \fIch\fP); +\fBint mvwaddch(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const chtype \fIch\fP); +.PP +\fBint echochar(const chtype \fIch\fP); +\fBint wechochar(WINDOW *\fIwin\fP, const chtype \fIch\fP); +.fi +.SH DESCRIPTION +.SS waddch +.B \%waddch +writes the +.I curses +character +.I ch +to the window +.IR win "," +then advances the cursor position, +analogously to the standard C library's \fI\%putchar\fP(3). +\fB\%ncurses\fP(3X) describes the variants of this function. +.PP +If advancement occurs at the right margin, +.bP +the cursor automatically wraps to the beginning of the next line, +then, +.bP +if it was at the bottom of the scrolling region, +and if \fB\%scrollok\fP(3X) is enabled for +.IR win , +the scrolling region scrolls up one line. +.PP +If +.I ch +is a +backspace, +carriage return, +line feed, +or +tab, +the cursor moves appropriately within the window. +.bP +Backspace moves the cursor one character left; +at the left margin of a window, +it does nothing. +.bP +Carriage return moves the cursor to the left margin on the same line of +the window. +.bP +Line feed does a \fB\%clrtoeol\fP(3X), +then advances as if from the right margin. +.bP +Tab advances the cursor to the next tab stop +(possibly on the next line); +these are placed at every eighth column by default. +Alter the tab interval with the +.B \%TABSIZE +extension; +see \fB\%curs_variables\fP(3X). +.PP +If +.I ch +is any other nonprintable character, +it is drawn in printable form using the same convention as +\fB\%unctrl\fP(3X). +Calling \fB\%winch\fP(3X) on the location of a nonprintable character +does not return the character itself, +but its \fB\%unctrl\fP(3X) representation. +.PP +The object or expression +.I ch +may contain attributes and/or a color pair identifier. +(A +.I \%chtype +can be copied from place to place using \fB\%winch\fP(3X) and +.BR \%waddch .) +See \fB\%curs_attr\fP(3X) for values of predefined constants that can be +usefully \*(``or\*(''ed with characters. +.SS wechochar +.B \%echochar +and +.B \%wechochar +are equivalent to calling +.RB \%( w ) addch +followed by +.RB \%( w ) refresh . +.I curses +interprets these functions as a hint to its optimizer +that only a single character cell in the window +is being altered between refreshes; +for non-control characters, +a considerable performance gain may be enjoyed by employing them. +.\" TODO: Combine the following with the "Line Drawing" subsection of +.\" terminfo(5) and replace this with a cross reference there. +.SS "Forms-Drawing Characters" +.I curses +defines macros starting with +.B \%ACS_ +that can be used with +.B \%waddch +to write line-drawing and other special characters to the screen. +.I \%ncurses +terms these +.I "forms-drawing characters." +The ACS default listed below is used if the +.B \%acs_chars +.RB \%( acsc ) +.I \%term\%info +capability does not define a terminal-specific replacement for it, +or if the terminal and locale configuration requires Unicode to access +these characters but the library is unable to use Unicode. +The \*(``acsc char\*('' column corresponds to how the characters are +specified in the +.B \%acs_chars +.RB \%( acsc ) +string capability, +and the characters in it may appear on the screen if the terminal type's +database entry incorrectly advertises ACS support. +The name \*(``ACS\*('' originates in the Alternate Character Set feature +of the DEC VT100 terminal. +.PP +.ie t .ne 4v +.el .ne 5v +.TS +Lb Lb Lb Lb +Lb Lb Lb Lb +Lb L L Lx. +\& ACS acsc \& +Symbol Default char Glyph Name +_ +ACS_BLOCK # 0 solid square block +ACS_BOARD # h board of squares +ACS_BTEE + v bottom tee +ACS_BULLET o \*~ bullet +ACS_CKBOARD : a checker board (stipple) +ACS_DARROW v . arrow pointing down +ACS_DEGREE \*' f degree symbol +ACS_DIAMOND + \(ga diamond +ACS_GEQUAL > > greater-than-or-equal-to +ACS_HLINE \- q horizontal line +ACS_LANTERN # i lantern symbol +ACS_LARROW < , arrow pointing left +ACS_LEQUAL < y less-than-or-equal-to +ACS_LLCORNER + m lower left-hand corner +ACS_LRCORNER + j lower right-hand corner +ACS_LTEE + t left tee +ACS_NEQUAL ! | not-equal +ACS_PI * { greek pi +ACS_PLMINUS # g plus/minus +ACS_PLUS + n plus +ACS_RARROW > + arrow pointing right +ACS_RTEE + u right tee +ACS_S1 \- o scan line 1 +ACS_S3 \- p scan line 3 +ACS_S7 \- r scan line 7 +ACS_S9 \&_ s scan line 9 +ACS_STERLING f } pound-sterling symbol +ACS_TTEE + w top tee +ACS_UARROW \*^ \- arrow pointing up +ACS_ULCORNER + l upper left-hand corner +ACS_URCORNER + k upper right-hand corner +ACS_VLINE | x vertical line +.TE +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses , +.B \%waddch +returns +.B ERR +if +.bP +.I win +is +.BR NULL "," +.bP +wrapping to a new line is impossible because \fB\%scrollok\fP(3X) has +not been called on +.I win +when a write to its bottom right location is attempted, +or +.bP +it is not possible to add a complete character at the cursor position. +.PP +The last may be due to different causes: +.bP +conversion of a wide character to a multibyte character sequence can +fail, +or +.bP +at least one of the bytes resulting from wide character conversion to a +multibyte character sequence cannot be added to the window. +See section \*(``PORTABILITY\*('' below regarding the use of +.B \%waddch +with wide characters. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +.BR \%addch "," +.BR \%mvaddch "," +.BR \%mvwaddch "," +and +.B \%echochar +may be implemented as macros. +.SH EXTENSIONS +.SS TABSIZE +SVr4 and other versions of +.I curses +implement the +.B \%TABSIZE +variable, +but X/Open Curses does not specify it; +see \fB\%curs_variables\fP(3X). +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.PP +The defaults specified for forms-drawing characters apply in the POSIX +locale. +.SS "ACS Symbols" +X/Open Curses states that the +.B \%ACS_ +definitions are +.I char +constants. +Some implementations are problematic. +.bP +Solaris +.IR curses , +for example, +defines the ACS symbols as constants; +others define them as elements of an array. +.IP +This implementation uses an array, +.BR \%acs_map , +as did SVr4 +.IR curses . +NetBSD also uses an array, +actually named +.BR \%_acs_char , +with a +.B \%#define +for compatibility. +.bP +HP-UX +.I curses +equates some of the +.B \%ACS_ +symbols to the analogous +.B \%WACS_ +symbols as if the +.B \%ACS_ +symbols were wide characters +(see \fB\%curs_add_wch\fP(3X)). +The misdefined symbols are the arrows and others that are not used for +line drawing. +.bP +X/Open Curses +(Issues 2 through 7) +has a typographical error +for the +.B \%ACS_LANTERN +symbol, equating its \*(``VT100+ Character\*('' to \*(``I\*('' +(capital I), +while the header files for SVr4 +.I curses +and other implementations use \*(``i\*('' +(small i). +.IP +None of the terminal descriptions on Unix platforms use uppercase I, +except for Solaris +(in its +.I \%term\%info +entry for \fI\%screen\fP(1), +apparently based on the X/Open documentation around 1995). +On the other hand, +its +.B \%gs6300 +(AT&T PC6300 with EMOTS Terminal Emulator) +description uses lowercase i. +.PP +Some ACS symbols +.RB \%( ACS_S3 , +.BR \%ACS_S7 , +.BR \%ACS_LEQUAL , +.BR \%ACS_GEQUAL , +.BR \%ACS_PI , +.BR \%ACS_NEQUAL , +and +.BR \%ACS_STERLING ) +were not documented in any publicly released System\ V. +.\" And did not exist yet as late as SVr4. +.\" https://github.com/ryanwoodsmall/oldsysv/blob/master/\ +.\" sysvr4/svr4/lib/xlibcurses/screen/curses.ed +However, +many publicly available +.I \%term\%info +entries include +.B \%acsc +capabilities in which their key characters +.RB ( pryz{|} ) +are embedded, +and a second-hand list of their character descriptions has come to +light. +The +.I \%ncurses +developers invented ACS-prefixed names for them. +.PP +The +.I displayed +values of +.B \%ACS_ +constants depend on +.bP +the +.I \%ncurses +ABI\(emfor example, +wide-character versus non-wide-character configurations +(the former is capable of displaying Unicode while the latter is not), +and +.bP +whether the locale uses UTF-8 encoding. +.PP +In certain cases, +the terminal is unable to display forms-drawing characters +.I except +by using UTF-8; +see the discussion of the +.I \%NCURSES_NO_UTF8_ACS +environment variable in \fB\%ncurses\fP(3X). +.SS "Character Set" +X/Open Curses assumes that the parameter passed to +.B \%waddch +contains a single character. +That character may have been more than eight bits wide in an SVr3 or +SVr4 implementation, +but X/Open Curses leaves the width of a non-wide character code +unspecified. +The standard further does not specify the internal structure of a +.IR chtype "," +though the use of bit operations to combine the character code with +attributes and a color pair identifier into a +.I \%chtype +for passage to +.B \%waddch +is common. +A portable application uses only the macros discussed in +\fB\%curs_attr\fP(3X) to manipulate a +.IR \%chtype "." +.PP +In +.IR \%ncurses , +.I \%chtype +holds an eight-bit character, +but the library allows a multibyte character sequence to be passed via a +succession of calls to +.BR \%waddch "." +Other implementations do not; +a +.B \%waddch +call transmits exactly one character, +which may be rendered in one or more screen locations depending on +whether it is printable +(see \fB\%unctrl\fP(3X)). +Depending on the locale, +.I \%ncurses +inspects the byte passed in each +.B \%waddch +call and checks whether the latest call continues a multibyte character. +When a character is +.IR complete "," +.I \%ncurses +displays the character and advances the cursor. +If the calling application interrupts the succession of bytes in +a multibyte character sequence by changing the current location\(emfor +example, +with \fB\%wmove\fP(3X)\(em\c +.I \%ncurses +discards the incomplete character. +.PP +For portability to other implementations, +do not rely upon the foregoing behavior. +Check whether a character can be represented as a single byte in the +current locale. +.bP +If it can, +call either +.I \%waddch +or +.IR \%wadd_wch "." +.bP +If it cannot, +use only +.IR \%wadd_wch "." +.SH HISTORY +4BSD (1980) +.I curses +introduced +.IR \%waddch "." +.PP +SVr3 (1987) +added +.IR \%wechochar "." +.SH SEE ALSO +\fB\%curs_add_wch\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_addchstr\fP(3X), +\fB\%curs_addstr\fP(3X), +\fB\%curs_attr\fP(3X), +\fB\%curs_clear\fP(3X), +\fB\%curs_inch\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%putchar\fP(3) diff --git a/contrib/ncurses/man/curs_addchstr.3x b/contrib/ncurses/man/curs_addchstr.3x new file mode 100644 index 00000000..5d1a5c56 --- /dev/null +++ b/contrib/ncurses/man/curs_addchstr.3x @@ -0,0 +1,157 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_addchstr.3x,v 1.50 2024/07/27 20:05:41 tom Exp $ +.TH curs_addchstr 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%addchstr\fP, +\fB\%waddchstr\fP, +\fB\%mvaddchstr\fP, +\fB\%mvwaddchstr\fP, +\fB\%addchnstr\fP, +\fB\%waddchnstr\fP, +\fB\%mvaddchnstr\fP, +\fB\%mvwaddchnstr\fP \- +add a \fIcurses\fR character string to a window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint addchstr(const chtype * \fIchstr\fP); +\fBint waddchstr(WINDOW * \fIwin\fP, const chtype * \fIchstr\fP); +\fBint mvaddchstr(int \fIy\fP, int \fIx\fP, const chtype * \fIchstr\fP); +\fBint mvwaddchstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const chtype * \fIchstr\fP); +.PP +\fBint addchnstr(const chtype * \fIchstr\fP, int \fIn\fP); +\fBint waddchnstr(WINDOW * \fIwin\fP, const chtype * \fIchstr\fP, int \fIn\fP); +\fBint mvaddchnstr(int \fIy\fP, int \fIx\fP, const chtype * \fIchstr\fP, int \fIn\fP); +\fBint mvwaddchnstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const chtype * \fIchstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%waddchstr +copies the string of +.I curses +characters +.I \%chstr +to the window +.IR win "." +A null +.I curses +character terminates the string. +.B \%waddchnstr +does the same, +but copies at most +.I n +characters, +or as many as possible if +.I n +is +.BR \-1 "." +\fB\%ncurses\fP(3X) describes the variants of these functions. +.PP +Because these functions do not call \fB\%waddch\fP(3X) internally, +they are faster than \fB\%waddstr\fP(3X) and \fB\%waddnstr\fP(3X). +On the other hand, +they +.bP +do not treat the backspace, +carriage return, +or line feed characters specially; +.bP +do not represent unprintable characters with \fB\%unctrl\fP(3X); +.bP +do not update the cursor position to follow the last character written; +.bP +truncate the string at the window's right margin, +rather than wrapping it to the next line and potentially scrolling. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.B NULL +or +.bP +.I chstr +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%waddchnstr +may be implemented as macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.SH HISTORY +SVr3.1 (1987) +introduced +.I \%waddchstr +and +.IR \%waddchnstr "." +.SH SEE ALSO +\fB\%curs_add_wchstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_addstr\fP(3X) diff --git a/contrib/ncurses/man/curs_addstr.3x b/contrib/ncurses/man/curs_addstr.3x new file mode 100644 index 00000000..a213544c --- /dev/null +++ b/contrib/ncurses/man/curs_addstr.3x @@ -0,0 +1,154 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_addstr.3x,v 1.55 2024/07/27 19:48:04 tom Exp $ +.TH curs_addstr 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%addstr\fP, +\fB\%waddstr\fP, +\fB\%mvaddstr\fP, +\fB\%mvwaddstr\fP, +\fB\%addnstr\fP, +\fB\%waddnstr\fP, +\fB\%mvaddnstr\fP, +\fB\%mvwaddnstr\fP \- +add a string to a \fIcurses\fR window and advance the cursor +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint addstr(const char * \fIstr\fP); +\fBint waddstr(WINDOW * \fIwin\fP, const char * \fIstr\fP); +\fBint mvaddstr(int \fIy\fP, int \fIx\fP, const char * \fIstr\fP); +\fBint mvwaddstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const char * \fIstr\fP); +.PP +\fBint addnstr(const char * \fIstr\fP, int \fIn\fP); +\fBint waddnstr(WINDOW * \fIwin\fP, const char * \fIstr\fP, int \fIn\fP); +\fBint mvaddnstr(int \fIy\fP, int \fIx\fP, const char * \fIstr\fP, int \fIn\fP); +\fBint mvwaddnstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const char * \fIstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B waddstr +writes the characters of the (null-terminated) string +.I str +to the window +.IR win , +as if by calling \fB\%waddch\fP(3X) for each +.I char +in +.IR str . +.PP +.B waddnstr +is similar, +but writes at most +.I n +characters. +If +.I n +is \-1, +.B +.B waddnstr +writes the entire string. +.PP +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.BR NULL "," +.bP +.I str +is +.BR NULL "," +or +.bP +an internal \fB\%waddch\fP(3X) call returns +.BR ERR "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except \fBwaddnstr\fP may be macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.SH HISTORY +4BSD (1980) +.I curses +introduced +.I \%waddstr +along with its variants, +the latter defined as macros. +.PP +SVr3.1 (1987) +added +.I \%waddnstr +(and its variants) +redefining +.I \%waddstr +as a macro wrapping it. +.SH SEE ALSO +\fB\%curs_addwstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_addchstr\fP(3X) diff --git a/contrib/ncurses/man/curs_addwstr.3x b/contrib/ncurses/man/curs_addwstr.3x new file mode 100644 index 00000000..c5db7c59 --- /dev/null +++ b/contrib/ncurses/man/curs_addwstr.3x @@ -0,0 +1,161 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_addwstr.3x,v 1.45 2024/07/27 20:05:18 tom Exp $ +.TH curs_addwstr 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%addwstr\fP, +\fB\%waddwstr\fP, +\fB\%mvaddwstr\fP, +\fB\%mvwaddwstr\fP, +\fB\%addnwstr\fP, +\fB\%waddnwstr\fP, +\fB\%mvaddnwstr\fP, +\fB\%mvwaddnwstr\fP \- +add a wide-character string to a \fIcurses\fR window and advance the cursor +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint addwstr(const wchar_t * \fIwstr\fP); +\fBint waddwstr(WINDOW * \fIwin\fP, const wchar_t * \fIwstr\fP); +\fBint mvaddwstr(int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP); +\fBint mvwaddwstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP); +.PP +\fBint addnwstr(const wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint waddnwstr(WINDOW * \fIwin\fP, const wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint mvaddnwstr(int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint mvwaddnwstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B waddwstr +writes the characters of the (wide-null-terminated) wide-character +string +.I wstr +to the window +.IR win , +as if by +constructing a +.I cchar_t +for each +.I wchar_t +in +.IR wstr , +then calling \fB\%wadd_wch\fP(3X) with the resulting +.IR cchar_t . +.I curses +processes spacing and non-spacing characters in +.I wstr +one at a time. +.PP +.B waddnwstr +is similar, +but writes at most +.I n +wide characters. +If +.I n +is \-1, +.B +.B waddnwstr +writes the entire wide string. +.PP +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.BR NULL "," +.bP +.I wstr +is +.BR NULL "," +or +.bP +an internal \fB\%wadd_wch\fP(3X) call returns +.BR ERR "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B waddnwstr +may be implemented as macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +.SH HISTORY +The System\ V Interface Definition, +Version 4 (1995), +specified +.I \%waddwstr +and +.I \%waddnwstr +(and the usual variants). +.\" SVID 4, vol 3., p. 478 +These were later additions to +.RI SVr4. x , +not appearing in the first SVr4 (1989). +.SH SEE ALSO +\fB\%curs_addstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_add_wch\fP(3X), +\fB\%curs_add_wchstr\fP(3X) diff --git a/contrib/ncurses/man/curs_attr.3x b/contrib/ncurses/man/curs_attr.3x new file mode 100644 index 00000000..37a466d9 --- /dev/null +++ b/contrib/ncurses/man/curs_attr.3x @@ -0,0 +1,716 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_attr.3x,v 1.113 2024/09/21 23:39:04 tom Exp $ +.TH curs_attr 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.\" --------------------------------------------------------------------------- +.SH NAME +\fB\%attr_get\fP, +\fB\%wattr_get\fP, +\fB\%attr_set\fP, +\fB\%wattr_set\fP, +\fB\%attr_off\fP, +\fB\%wattr_off\fP, +\fB\%attr_on\fP, +\fB\%wattr_on\fP, +\fB\%attroff\fP, +\fB\%wattroff\fP, +\fB\%attron\fP, +\fB\%wattron\fP, +\fB\%attrset\fP, +\fB\%wattrset\fP, +\fB\%chgat\fP, +\fB\%wchgat\fP, +\fB\%mvchgat\fP, +\fB\%mvwchgat\fP, +\fB\%color_set\fP, +\fB\%wcolor_set\fP, +\fB\%standend\fP, +\fB\%wstandend\fP, +\fB\%standout\fP, +\fB\%wstandout\fP \- +manipulate attributes of character cells in \fIcurses\fR windows +.\" --------------------------------------------------------------------------- +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint attr_get(attr_t *\fIattrs\fP, short *\fIpair\fP, void *\fIopts\fP); +\fBint wattr_get(WINDOW *\fIwin\fP, attr_t *\fIattrs\fP, short *\fIpair\fP,\fR \fPvoid *\fIopts\fP); +\fBint attr_set(attr_t \fIattrs\fP, short \fIpair\fP, void *\fIopts\fP); +\fBint wattr_set(WINDOW *\fIwin\fP, attr_t \fIattrs\fP, short \fIpair\fP, void *\fIopts\fP); +.PP +\fBint attr_off(attr_t \fIattrs\fP, void *\fIopts\fP); +\fBint wattr_off(WINDOW *\fIwin\fP, attr_t \fIattrs\fP, void *\fIopts\fP); +\fBint attr_on(attr_t \fIattrs\fP, void *\fIopts\fP); +\fBint wattr_on(WINDOW *\fIwin\fP, attr_t \fIattrs\fP, void *\fIopts\fP); +.PP +\fBint attroff(int \fIattrs\fP); +\fBint wattroff(WINDOW *\fIwin\fP, int \fIattrs\fP); +\fBint attron(int \fIattrs\fP); +\fBint wattron(WINDOW *\fIwin\fP, int \fIattrs\fP); +\fBint attrset(int \fIattrs\fP); +\fBint wattrset(WINDOW *\fIwin\fP, int \fIattrs\fP); +.PP +\fBint chgat(int \fIn\fP, attr_t \fIattr\fP, short \fIpair\fP,\fR \fPconst void *\fIopts\fP); +\fBint wchgat(WINDOW *\fIwin\fP, + \fBint \fIn\fB, attr_t \fIattr\fB,\fR \fBshort \fIpair\fB, const void *\fIopts\fB);\fR +\fBint mvchgat(int \fIy\fB, int \fIx\fB,\fR + \fBint \fIn\fB, attr_t \fIattr\fB, short \fIpair\fB, const void *\fIopts\fB);\fR +\fBint mvwchgat(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB,\fR + \fBint \fIn\fB, attr_t \fIattr\fB, short \fIpair\fB, const void *\fIopts\fB);\fR +.PP +\fBint color_set(short \fIpair\fB, void* \fIopts\fB);\fR +\fBint wcolor_set(WINDOW *\fIwin\fB, short \fIpair\fB,\fR \fBvoid* \fIopts\fP);\fR +.PP +\fBint standend(void);\fP +\fBint wstandend(WINDOW *\fIwin\fB);\fR +\fBint standout(void);\fP +\fBint wstandout(WINDOW *\fIwin\fB);\fR +.fi +.\" --------------------------------------------------------------------------- +.SH DESCRIPTION +These routines manipulate the current attributes of the named window, +which then apply to all characters that are written into +the window with \fBwaddch\fP, \fBwaddstr\fP and \fBwprintw\fP. +Attributes are +a property of the character, and move with the character through any scrolling +and insert/delete line/character operations. +To the extent possible, they are +displayed as appropriate modifications to the graphic rendition of characters +put on the screen. +.PP +These routines do not affect the attributes used +when erasing portions of the window. +See \fBcurs_bkgd\fP(3X) for functions which modify the attributes used for +erasing and clearing. +.\" --------------------------------------------------------------------------- +.SS "Window Attributes" +There are two sets of functions: +.bP +functions for manipulating the window attributes and color: +\fBwattr_set\fP and \fBwattr_get\fP. +.bP +functions for manipulating only the window attributes (not color): +\fBwattr_on\fP and \fBwattr_off\fP. +.PP +The \fBwattr_set\fP function sets the current attributes +of the given window to \fIattrs\fP, with color specified by \fIpair\fP. +.PP +Use \fBwattr_get\fP to retrieve attributes for the given window. +.PP +Use \fBattr_on\fP and \fBwattr_on\fP to turn on window attributes, i.e., +values OR'd together in \fIattr\fP, +without affecting other attributes. +Use \fBattr_off\fP and \fBwattr_off\fP to turn off window attributes, +again values OR'd together in \fIattr\fP, +without affecting other attributes. +.\" --------------------------------------------------------------------------- +.SS "Legacy Window Attributes" +The X/Open window attribute routines which \fIset\fP or \fIget\fP, +turn \fIon\fP or \fIoff\fP +are extensions of older routines +which assume that color pairs are OR'd into the attribute parameter. +These newer routines use similar names, because +X/Open simply added an underscore (\fB_\fP) for the newer names. +.PP +The +.I int +datatype used in the legacy routines is treated as if +it is the same size as +.I \%chtype +(used by \fBaddch\fP(3X)). +It holds the common video attributes (such as bold, reverse), +as well as a few bits for color. +Those bits correspond to the \fBA_COLOR\fP symbol. +The \fBCOLOR_PAIR\fP macro provides a value which can be OR'd into +the attribute parameter. +For example, +as long as that value fits into the \fBA_COLOR\fP mask, +then these calls produce similar results: +.PP +.RS 4 +.EX +attrset(A_BOLD | COLOR_PAIR(\fIpair\fP)); +attr_set(A_BOLD, \fIpair\fP, NULL); +.EE +.RE +.PP +However, if the value does not fit, then the \fBCOLOR_PAIR\fP macro +uses only the bits that fit. +For example, +because in +.I \%ncurses +\fBA_COLOR\fP has eight (8) bits, +then \fBCOLOR_PAIR(\fI259\fB)\fR is 4 +(i.e., 259 is 4 more than the limit 255). +.PP +The \fBPAIR_NUMBER\fP macro extracts a pair number from an +.I int +(or +.IR \%chtype ")." +For example, the \fIinput\fP and \fIoutput\fP values in these statements +would be the same: +.PP +.RS 4 +.EX +int value = A_BOLD | COLOR_PAIR(\fIinput\fP); +int \fIoutput\fP = PAIR_NUMBER(value); +.EE +.RE +.PP +The \fBattrset\fP routine is a legacy feature predating SVr4 +.I curses +but kept in X/Open Curses for the same reason that SVr4 +.I curses +kept it: +compatibility. +.PP +The remaining \fBattr\fP* functions operate exactly like the corresponding +\fBattr_\fP* functions, except that they take arguments of type +.I int +rather than +.IR \%attr_t "." +.PP +There is no corresponding \fB\%attrget\fP function as such +in X/Open Curses, +although +.I \%ncurses +provides \fB\%getattrs\fP +(see \fB\%curs_legacy\fP(3X)). +.\" --------------------------------------------------------------------------- +.SS "Change Character Rendition" +The routine \fBchgat\fP changes the attributes of a given number of characters +starting at the current cursor location of \fBstdscr\fP. +It does not update +the cursor and does not perform wrapping. +A character count of \-1 or greater +than the remaining window width means to change attributes all the way to the +end of the current line. +The \fBwchgat\fP function generalizes this to any window; +the \fBmvwchgat\fP function does a cursor move before acting. +.PP +In these functions, +the color \fIpair\fP argument is a color pair index +(as in the first argument of \fBinit_pair\fP, see \fBcurs_color\fP(3X)). +.\" --------------------------------------------------------------------------- +.SS "Change Window Color" +The routine \fBcolor_set\fP sets the current color of the given window to the +foreground/background combination described by the color \fIpair\fP parameter. +.\" --------------------------------------------------------------------------- +.SS Standout +The routine \fBstandout\fP is +the same as \fBattron(A_STANDOUT)\fP. +The routine \fBstandend\fP is the same +as \fBattrset(A_NORMAL)\fP or \fBattrset(0)\fP, that is, it turns off all +attributes. +.PP +X/Open Curses does not mark these \*(``restricted\*('', because +.bP +they have well established legacy use, and +.bP +there is no ambiguity about the way the attributes +might be combined with a color pair. +.\" --------------------------------------------------------------------------- +.SS "Video Attributes" +The following video attributes, defined in \fB\fP, can be passed to +the routines \fBattron\fP, \fBattroff\fP, and \fBattrset\fP, or OR'd with the +characters passed to \fBaddch\fP (see \fBcurs_addch\fP(3X)). +.PP +.ne 15 +.RS +.TS +Lb Lb +Lb Lx. +Name Description +_ +A_NORMAL Normal display (no highlight) +A_STANDOUT T{ +Best highlighting mode of the terminal +T} +A_UNDERLINE Underlining +A_REVERSE Reverse video +A_BLINK Blinking +A_DIM Half bright +A_BOLD Extra bright or bold +A_PROTECT Protected mode +A_INVIS Invisible or blank mode +A_ALTCHARSET Alternate character set +A_ITALIC Italics (non-X/Open extension) +A_CHARTEXT Bit-mask to extract a character +A_COLOR T{ +Bit-mask to extract a color (legacy routines) +T} +.TE +.RE +.PP +You can thus use +.B \%A_CHARTEXT +to extract the character from a +.IR chtype "," +.B \%A_ATTRIBUTES +to obtain its rendering attributes, +and +.B \%A_COLOR +to find the color pair it uses. +.PP +These video attributes are supported by \fBattr_on\fP and related functions +(which also support the attributes recognized by \fBattron\fP, etc.): +.PP +.RS +.TS +Lb Lb +Lb Lx. +Name Description +_ +WA_HORIZONTAL Horizontal highlight +WA_LEFT Left highlight +WA_LOW Low highlight +WA_RIGHT Right highlight +WA_TOP Top highlight +WA_VERTICAL Vertical highlight +.TE +.RE +.PP +The return values of many of these routines are not meaningful (they are +implemented as macro-expanded assignments and simply return their argument). +The SVr4 manual page claims (falsely) that these routines always return \fB1\fP. +.\" --------------------------------------------------------------------------- +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.I win +is +.BR NULL "." +.PP +.B \%wcolor_set +returns +.B ERR +if +.I pair +is outside the range +.BR 0 .\|. COLOR_PAIRS\-1 . +.PP +.B \%wattr_get +does +.I not +fail if its +.I \%attrs +or +.I \%pair +parameter is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.\" --------------------------------------------------------------------------- +.SH NOTES +These functions may be macros: +.sp +.RS +\fBattroff\fP, \fBwattroff\fP, \fBattron\fP, \fBwattron\fP, +\fBattrset\fP, \fBwattrset\fP, \fBstandend\fP and \fBstandout\fP. +.RE +.PP +Color pair values can only be OR'd with attributes if the pair +number is less than 256. +The alternate functions such as \fBcolor_set\fP can pass a color pair +value directly. +However, +.I \%ncurses +ABI 4 and 5 simply OR this value +within the alternate functions. +You must use +.I \%ncurses +ABI 6 to support more than 256 color pairs. +.\" --------------------------------------------------------------------------- +.SH EXTENSIONS +This implementation provides the \fBA_ITALIC\fP attribute for terminals +which have the \fBenter_italics_mode\fP (\fBsitm\fP) +and \fBexit_italics_mode\fP (\fBritm\fP) capabilities. +Italics are not mentioned in X/Open Curses. +Unlike the other video attributes, \fBA_ITALIC\fP is unrelated +to the \fBset_attributes\fP capabilities. +This implementation makes the assumption that +\fBexit_attribute_mode\fP may also reset italics. +.PP +Each of the functions added by XSI Curses has a parameter \fIopts\fP, +which X/Open Curses still (after more than twenty years) documents +as reserved for future use, saying that it should be \fBNULL\fP. +This implementation uses that parameter in ABI 6 for the functions which +have a color pair parameter to support \fIextended color pairs\fP: +.bP +For functions which modify the color, e.g., +\fBwattr_set\fP and \fBwattr_on\fP, +if \fIopts\fP is set it is treated as a pointer to +.IR int "," +and used to set the color pair instead of the +.I short +.I pair +parameter. +.bP +For functions which retrieve the color, e.g., +\fBwattr_get\fP, +if \fIopts\fP is set it is treated as a pointer to +.IR int "," +and used to retrieve the color pair as an +.I int +value, +in addition to +retrieving it via the standard pointer to +.I short +parameter. +.bP +For functions which turn attributes off, e.g., +\fBwattr_off\fP, +the \fIopts\fP parameter is ignored except +except to check that it is \fBNULL\fP. +.\" --------------------------------------------------------------------------- +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4. +It specifies no error conditions for them. +.PP +The standard defined the dedicated type for highlights, +.IR \%attr_t "," +which was not defined in SVr4 +.IR curses "." +The functions taking +.I \%attr_t +arguments were not supported under SVr4. +.PP +Very old versions of this library did not force an update of the screen +when changing the attributes. +Use \fBtouchwin\fP to force the screen to match the updated attributes. +.PP +X/Open Curses states that whether the traditional functions +\fBattron\fP/\fBattroff\fP/\fBattrset\fP can manipulate attributes other than +\fBA_BLINK\fP, \fBA_BOLD\fP, \fBA_DIM\fP, \fBA_REVERSE\fP, \fBA_STANDOUT\fP, or +\fBA_UNDERLINE\fP is \*(``unspecified\*(''. +Under this implementation as well as +SVr4 +.IR curses "," +these functions correctly manipulate all other highlights +(specifically, \fBA_ALTCHARSET\fP, \fBA_PROTECT\fP, and \fBA_INVIS\fP). +.PP +X/Open Curses added these entry points: +.sp +.RS +\fBattr_get\fP, \fBattr_on\fP, +\fBattr_off\fP, \fBattr_set\fP, \fBwattr_on\fP, \fBwattr_off\fP, +\fBwattr_get\fP, \fBwattr_set\fP +.RE +.PP +The new functions are intended to work with +a new series of highlight macros prefixed with \fBWA_\fP. +The older macros have direct counterparts in the newer set of names: +.PP +.RS +.ne 9 +.TS +Lb Lb +Lb Lx. +Name Description +_ +WA_NORMAL Normal display (no highlight) +WA_STANDOUT T{ +Best highlighting mode of the terminal +T} +WA_UNDERLINE Underlining +WA_REVERSE Reverse video +WA_BLINK Blinking +WA_DIM Half bright +WA_BOLD Extra bright or bold +WA_ALTCHARSET Alternate character set +.TE +.RE +.PP +X/Open Curses does not assign values to these symbols, +nor does it state whether or not they are related to the +similarly-named A_NORMAL, etc.: +.bP +X/Open Curses specifies that each pair of corresponding \fBA_\fP +and \fBWA_\fP-using functions operates on the same current-highlight +information. +.bP +However, in some implementations, those symbols have unrelated values. +.IP +For example, the Solaris \fIxpg4\fP (X/Open) +.I curses +declares +.I \%attr_t +to be an unsigned short integer (16-bits), +while +.I \%chtype +is a unsigned integer (32-bits). +The \fBWA_\fP symbols in this case are different from the \fBA_\fP symbols +because they are used for a smaller datatype which does not +represent \fBA_CHARTEXT\fP or \fBA_COLOR\fP. +.IP +In this implementation (as in many others), the values happen to be +the same because it simplifies copying information between +.I \%chtype +and +.I \%cchar_t +variables. +.bP +Because +.IR \%ncurses 's +.I \%attr_t +can hold a color pair +(in the \fBA_COLOR\fP field), +a call to +\fBwattr_on\fP, +\fBwattr_off\fP, or +\fBwattr_set\fP +may alter the window's color. +If the color pair information in the attribute parameter is zero, +no change is made to the window's color. +.IP +This is consistent with SVr4 +.IR curses ";" +X/Open Curses does not specify this. +.PP +The X/Open Curses extended conformance level adds new highlights +\fBA_HORIZONTAL\fP, \fBA_LEFT\fP, \fBA_LOW\fP, \fBA_RIGHT\fP, \fBA_TOP\fP, +\fBA_VERTICAL\fP (and corresponding \fBWA_\fP macros for each). +As of August 2013, +no known terminal provides these highlights +(i.e., via the \fBsgr1\fP capability). +.\" --------------------------------------------------------------------------- +.SH HISTORY +X/Open Curses is largely based on SVr4 +.IR curses "," +adding support for \*(``wide-characters\*('' (not specific to Unicode). +Some of the X/Open differences from SVr4 +.I curses +address the way +video attributes can be applied to wide-characters. +But aside from that, \fBattrset\fP and \fBattr_set\fP are similar. +SVr4 +.I curses +provided the basic features for manipulating video attributes. +However, earlier versions of +.I curses +provided a part of these features. +.PP +As seen in 2.8BSD, +.I curses +assumed 7-bit characters, +using the eighth bit of a byte to represent the \fIstandout\fP +feature (often implemented as bold and/or reverse video). +The BSD +.I curses +library provided functions \fBstandout\fP and \fBstandend\fP +which were carried along into X/Open Curses due to their pervasive use +in legacy applications. +.PP +Some terminals in the 1980s could support a variety of video attributes, +although the BSD +.I curses +library could do nothing with those. +System V (1983) provided an improved +.I curses +library. +It defined the \fBA_\fP symbols for use by applications to manipulate the +other attributes. +There are few useful references for the chronology. +.PP +Goodheart's book +\fIUNIX Curses Explained\fP (1991) describes SVr3 (1987), +commenting on several functions: +.bP +the \fBattron\fP, \fBattroff\fP, \fBattrset\fP functions +(and most of the functions found in SVr4 but not in BSD +.IR curses ")" +were +introduced by System V, +.bP +the alternate character set feature with \fBA_ALTCHARSET\fP was +added in SVr2 and improved in SVr3 (by adding \fBacs_map[]\fP), +.bP +\fBstart_color\fP and related color-functions were introduced by System V.3.2, +.bP +pads, soft-keys were added in SVr3, and +.PP +Goodheart did not mention the background character or the +.I \%cchar_t +type. +Those are respectively SVr3.1 and X/Open features. +He did mention the \fBA_\fP constants, but did not indicate their values. +Those were not the same in different systems, +even for those marked as System V. +.PP +Different Unix systems used different sizes for the bit-fields in +.I \%chtype +for \fIcharacters\fP and \fIcolors\fP, and took into account the different +integer sizes (32-bit versus 64-bit). +.PP +This table showing the number of bits for \fBA_COLOR\fP +and \fBA_CHARTEXT\fP +was gleaned from the +.I curses +header files for +various operating systems and architectures. +The inferred architecture and notes reflect +the format and size of the defined constants +as well as clues such as the alternate character set implementation. +A 32-bit library can be used on a 64-bit system, +but not necessarily the reverse. +.PP +.TS +Lb Lb Lb Cb S Lb +Lb2 Lb Lb2 Lb2 Lb2 Lb +L L L L L Lx. +\& \& \& Bits \& +Year System Arch Color Char Notes +_ +1992 Solaris 5.2 32 6 17 SVr4 \fIcurses\fP +1992 HP-UX 9 32 no 8 SVr2 \fIcurses\fP +1992 AIX 3.2 32 no 23 SVr2 \fIcurses\fP +1994 OSF/1 r3 32 no 23 SVr2 \fIcurses\fP +1995 HP-UX 10.00 32 6 16 SVr3 \fIcurses_colr\fP +1995 HP-UX 10.00 32 6 8 SVr4, X/Open \fIcurses\fP +1995 Solaris 5.4 32/64 7 16 X/Open \fIcurses\fP +1996 AIX 4.2 32 7 16 X/Open \fIcurses\fP +1996 OSF/1 r4 32 6 16 X/Open \fIcurses\fP +1997 HP-UX 11.00 32 6 8 X/Open \fIcurses\fP +2000 U/Win 32/64 7/31 16 uses \fIchtype\fP +.TE +.PP +Notes: +.RS 3 +.PP +Regarding HP-UX, +.bP +HP-UX 10.20 (1996) added support for 64-bit PA-RISC processors in 1996. +.bP +HP-UX 10.30 (1997) marked \*(``curses_colr\*('' obsolete. +That version of +.I curses +was dropped with HP-UX 11.30 in 2006. +.PP +Regarding OSF/1 (and Tru64), +.bP +These used 64-bit hardware. +Like +.IR \%ncurses "," +the OSF/1 +.I curses +interface is not customized for 32-bit and 64-bit +versions. +.bP +Unlike other systems which evolved from AT&T code, +OSF/1 provided a new implementation for X/Open Curses. +.PP +Regarding Solaris, +.bP +The initial release of Solaris was in 1992. +.bP +The \fIxpg4\fP (X/Open) Curses was developed by MKS from 1990 to 1995. +Sun's copyright began in 1996. +.bP +Sun updated the X/Open Curses interface +after 64-bit support was introduced in 1997, +but did not modify the SVr4 +.I curses +interface. +.PP +Regarding U/Win, +.bP +Development of the +.I curses +library began in 1991, stopped in 2000. +.bP +Color support was added in 1998. +.bP +The library uses only +.I \%chtype +(no +.IR \%cchar_t ")." +.RE +.PP +Once X/Open Curses was adopted in the mid-1990s, the constraint of +a 32-bit interface with many colors and wide-characters for +.I \%chtype +became a moot point. +The +.I \%cchar_t +structure (whose size and +members are not specified in X/Open Curses) could be extended as needed. +.PP +Other interfaces are rarely used now: +.bP +BSD +.I curses +was improved slightly in 1993/1994 using Keith Bostic's +modification to make the library 8-bit clean for \fBnvi\fP(1). +He moved \fIstandout\fP attribute to a structure member. +.IP +The resulting 4.4BSD +.I curses +was replaced by \fI\%ncurses\fP over the +next ten years. +.bP +U/Win is rarely used now. +.\" --------------------------------------------------------------------------- +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_addstr\fP(3X), +\fB\%curs_bkgd\fP(3X), +\fB\%curs_printw\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_beep.3x b/contrib/ncurses/man/curs_beep.3x new file mode 100644 index 00000000..bc90da91 --- /dev/null +++ b/contrib/ncurses/man/curs_beep.3x @@ -0,0 +1,110 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2005,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_beep.3x,v 1.35 2024/07/20 20:54:51 tom Exp $ +.TH curs_beep 3X 2024-07-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%beep\fP, +\fB\%flash\fP \- +ring the (visual) bell of the terminal with \fIcurses\fR +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint beep(void); +\fBint flash(void); +.fi +.SH DESCRIPTION +.B beep +and +.B flash +alert the terminal user: +the former by sounding the terminal's audible alarm, +and the latter by visibly attracting attention. +Commonly, +a terminal implements a visual bell by momentarily reversing the +character foreground and background colors on the entire display; +even a monochrome device can do this. +These functions each attempt the other alert type if the one requested +is unavailable. +If neither is available, +.I curses +performs no action. +Nearly all terminals have an audible alert mechanism such as a bell or +piezoelectric buzzer, +but only some can flash the screen. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +.B beep +and +.B flash +return +.B OK +if the terminal type supports the corresponding capability: +.B bell +.RB ( bel ) +for +.B beep +and +.B \%flash_screen +.RB ( flash ) +for +.BR flash "." +Otherwise they return +.BR ERR "." +.SH EXTENSIONS +In +.IR \%ncurses "," +these functions can return +.BR ERR "." +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +On SVr4 +.IR curses "," +they always return +.BR OK "," +and X/Open Curses specifies them as doing so. +.SH HISTORY +.I beep +and +.I flash +appeared in SVr2 (1984). +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_bkgd.3x b/contrib/ncurses/man/curs_bkgd.3x new file mode 100644 index 00000000..d7fb06c7 --- /dev/null +++ b/contrib/ncurses/man/curs_bkgd.3x @@ -0,0 +1,233 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_bkgd.3x,v 1.64 2024/09/22 18:16:03 tom Exp $ +.TH curs_bkgd 3X 2024-09-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%bkgdset\fP, +\fB\%wbkgdset\fP, +\fB\%bkgd\fP, +\fB\%wbkgd\fP, +\fB\%getbkgd\fP \- +manipulate background of a \fIcurses\fR window of characters +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint bkgd(chtype \fIch\fP); +\fBint wbkgd(WINDOW *\fIwin\fP, chtype \fIch\fP); +.PP +\fBvoid bkgdset(chtype \fIch\fP); +\fBvoid wbkgdset(WINDOW *\fIwin\fP, chtype \fIch\fP); +.PP +\fBchtype getbkgd(WINDOW *\fIwin\fP); +.fi +.SH DESCRIPTION +Every +.I curses +window has a background property. +In the library's non-wide configuration, +this property is a +.I \%chtype +which combines a set of attributes with the +.I "background character" +(see \fB\%curs_attr\fP(3X)). +The background character is a spacing character. +.PP +When erasing parts of the screen, +.I curses +fills the cells with the background character. +.I curses +also uses the window background when writing characters to the screen: +.bP +The attribute part of the background is combined with all +non-blank characters that are written into the window, +as with the \fB\%waddch\fP(3X) and \fB\%winsch\fP(3X) families of +functions. +.bP +Both the character and attribute parts of the background are combined with +blank characters that are written into the window. +.PP +The background becomes a property of the character and moves with it +through any scrolling and insert/delete line/character operations. +.PP +To the extent possible on a given terminal, +the attribute part of the background is displayed as the graphic +rendition of the character put on the screen. +.SS "bkgd, wbkgd" +\fB\%bkgd\fP and \fB\%wbkgd\fP set the background property of +\fB\%stdscr\fP or the specified window and then apply this setting to +every character cell in that window. +.bP +The rendition of every character in the window changes to the new +background rendition. +.bP +Wherever the former background character appears, +it changes to the new background character. +.PP +.I \%ncurses +updates the rendition of each character cell by comparing the character, +non-color attributes, +and colors. +The library applies to following procedure to each cell in the window, +whether or not it is blank. +.bP +.I \%ncurses +first compares the cell's character to the previously specified +background character; +if they match, +.I \%ncurses +writes the new background character to the cell. +.bP +.I \%ncurses +then checks if the cell uses color, +that is, +its color pair value is nonzero. +If not, +it simply replaces the attributes and color pair in the cell with those +from the new background character. +.bP +If the cell uses color, +and its background color matches that of the current window background, +.I \%ncurses +removes attributes that may have come from the current background and +adds those from the new background. +It finishes by setting the cell's background to use the new window +background color. +.bP +If the cell uses color, +and its background color does not match that of the current window +background, +.I \%ncurses +updates only the non-color attributes, +first removing those that may have come from the current background, +and then adding attributes from the new background. +.PP +If the new background's character is nonspacing, +.I \%ncurses +reuses the old background character, +except for one special case: +.I \%ncurses +treats a background character value of zero (0) as a space. +.PP +If the terminal does not support color, +or if color has not been initialized with \fB\%start_color\fP(3X), +.I \%ncurses +ignores the new background character's color attribute. +.SS "bkgdset, wbkgdset" +\fB\%bkgdset\fP and \fB\%wbkgdset\fP manipulate the background of +the applicable window, +without updating the character cells as \fB\%bkgd\fP and +\fB\%wbkgd\fP do; +only future writes reflect the updated background. +.SS getbkgd +\fB\%getbkgd\fP obtains the given window's background character and +attribute combination. +.SH RETURN VALUE +Functions returning an \fIint\fP return \fBOK\fP on success. +\fB\%bkgd\fP returns \fBERR\fP if the library has not been initialized. +\fB\%wbkgd\fP and \fB\%getbkgd\fP return \fBERR\fP if a \fI\%WINDOW\fP +pointer argument is null. +.PP +\fB\%bkgdset\fP and \fBwbkgdset\fP do not return a value. +.PP +\fB\%getbkgd\fP returns a window's background character and attribute +combination. +.SH NOTES +Unusually, +there is no \fB\%wgetbkgd\fP function; +\fB\%getbkgd\fP behaves as one would expect \fB\%wgetbkgd\fP to, +accepting a \fI\%WINDOW\fP pointer argument. +.PP +\fB\%bkgd\fP and +\fB\%bkgdset\fP +may be implemented as macros. +.PP +X/Open Curses mentions that the character part of the background must +be a single-byte value. +\fI\%ncurses\fP, +like SVr4 \fIcurses\fP, +checks to ensure that, +and will reuse the old background character if the check fails. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies that +\fB\%bkgd\fP, +\fB\%wbkgd\fP, +and +\fB\%getbkgd\fP +return \fBERR\fP on failure +(in the case of the last, +this value is cast to +.IR \%chtype ), +but describes no failure conditions. +.PP +The SVr4.0 manual says that \fB\%bkgd\fP and \fB\%wbkgd\fP may return +\fBOK\fP +\*(``or a non-negative integer if \fB\%immedok\fP is set\*('', +which refers to the return value from \fB\%wrefresh\fP(3X), +used to implement the immediate repainting. +SVr4 \fIcurses\fP's \fB\%wrefresh\fP returns the number of characters +written to the screen during the refresh. +\fI\%ncurses\fP does not do that. +.PP +Neither X/Open Curses nor the SVr4 manual pages detail how the rendition +of characters on the screen updates when \fB\%bkgd\fP or \fB\%wbkgd\fP +changes the background character. +.IR \%ncurses , +like SVr4 +.IR curses , +does not +(in its non-wide configuration) +store the background and window attribute contributions to each +character cell separately. +.SH SEE ALSO +\fB\%curs_bkgrnd\fP(3X) describes the corresponding functions in the +wide configuration of +.IR \%ncurses . +.PP +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_attr\fP(3X) diff --git a/contrib/ncurses/man/curs_bkgrnd.3x b/contrib/ncurses/man/curs_bkgrnd.3x new file mode 100644 index 00000000..41412b9b --- /dev/null +++ b/contrib/ncurses/man/curs_bkgrnd.3x @@ -0,0 +1,223 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_bkgrnd.3x,v 1.46 2024/09/22 18:23:50 tom Exp $ +.TH curs_bkgrnd 3X 2024-09-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%bkgrnd\fP, +\fB\%wbkgrnd\fP, +\fB\%bkgrndset\fP, +\fB\%wbkgrndset\fP, +\fB\%getbkgrnd\fP, +\fB\%wgetbkgrnd\fP \- +manipulate background of a \fIcurses\fP window of wide characters +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint bkgrnd(const cchar_t *\fIwch\fP); +\fBint wbkgrnd(WINDOW *\fIwin\fP, const cchar_t *\fIwch\fP); +.PP +\fBvoid bkgrndset(const cchar_t *\fIwch\fP); +\fBvoid wbkgrndset(WINDOW *\fIwin\fP, const cchar_t *\fIwch\fP); +.PP +\fBint getbkgrnd(cchar_t *\fIwch\fP); +\fBint wgetbkgrnd(WINDOW *\fIwin\fP, cchar_t *\fIwch\fP); +.fi +.SH DESCRIPTION +Every +.I curses +window has a background property. +In the library's wide configuration, +this property is a +.I \%cchar_t +which combines a set of attributes with the +.I "background character" +(see \fB\%curs_attr\fP(3X)) +The background character is a spacing character. +.PP +When erasing parts of the screen, +.I curses +fills the cells with the background character. +.I curses +also uses the window background when writing characters to the screen: +.bP +The attribute part of the background is combined with all +non-blank characters that are written into the window, +as with the \fB\%wadd_wch\fP(3X) and \fB\%wins_wch\fP(3X) families of +functions. +.bP +Both the character and attribute parts of the background are combined with +blank characters that are written into the window. +.PP +The background becomes a property of the character and moves with it +through any scrolling and insert/delete line/character operations. +.PP +To the extent possible on a given terminal, +the attribute part of the background is displayed as the graphic +rendition of the character put on the screen. +.SS "bkgrnd, wbkgrnd" +\fB\%bkgrnd\fP and \fB\%wbkgrnd\fP set the background property of +\fB\%stdscr\fP or the specified window and then apply this setting to +every character cell in that window. +.bP +The rendition of every character in the window changes to the new +background rendition. +.bP +Wherever the former background character appears, +it changes to the new background character. +.PP +.I \%ncurses +updates the rendition of each character cell by comparing the character, +non-color attributes, +and colors. +The library applies to following procedure to each cell in the window, +whether or not it is blank. +.bP +.I \%ncurses +first compares the cell's character to the previously specified +background character; +if they match, +.I \%ncurses +writes the new background character to the cell. +.bP +.I \%ncurses +then checks if the cell uses color, +that is, +its color pair value is nonzero. +If not, +it simply replaces the attributes and color pair in the cell with those +from the new background character. +.bP +If the cell uses color, +and its background color matches that of the current window background, +.I \%ncurses +removes attributes that may have come from the current background and +adds those from the new background. +It finishes by setting the cell's background to use the new window +background color. +.bP +If the cell uses color, +and its background color does not match that of the current window +background, +.I \%ncurses +updates only the non-color attributes, +first removing those that may have come from the current background, +and then adding attributes from the new background. +.PP +If the new background's character is nonspacing, +.I \%ncurses +reuses the old background character, +except for one special case: +.I \%ncurses +treats a background character value of zero (0) as a space. +.PP +If the terminal does not support color, +or if color has not been initialized with \fB\%start_color\fP(3X), +.I \%ncurses +ignores the new background character's color attribute. +.SS "bkgrndset, wbkgrndset" +\fB\%bkgrndset\fP and \fB\%wbkgrndset\fP manipulate the background of +the applicable window, +without updating the character cells as \fB\%bkgrnd\fP and +\fB\%wbkgrnd\fP do; +only future writes reflect the updated background. +.SS "getbkgrnd, wgetbkgrnd" +The \fB\%getbkgrnd\fP and \fB\%wgetbkgrnd\fP functions obtain the +background character and attribute pair of \fB\%stdscr\fP or the +specified window and store it via the +.I wch +pointer. +.SH RETURN VALUE +\fBbkgrndset\fP and \fBwbkgrndset\fP do not return a value. +.PP +The other functions return +.B ERR +upon failure and +.B OK +upon success. +In +.IR \%ncurses , +failure occurs if +.bP +a +.I \%WINDOW +pointer +.I win +is null, or +.bP +a +.I \%cchar_t +pointer +.I wch +is null. +.SH NOTES +\fB\%bkgrnd\fP, +\fB\%bkgrndset\fP, and +\fB\%getbkgrnd\fP +may be implemented as macros. +.PP +Unlike their counterparts in the non-wide configuration of +.IR \%ncurses , +\fB\%getbkgrnd\fP and \fB\%wgetbkgrnd\fP supply the background character +and attribute in a modifiable +.I \%cchar_t +parameter, +not as the return value. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +X/Open Curses does not provide details of how the rendition is updated. +This implementation follows the approach used in SVr4 +.IR curses . +.SH SEE ALSO +\fB\%curs_bkgd\fP(3X) describes the corresponding functions in the +non-wide configuration of +.IR \%ncurses . +.PP +\fB\%curses\fP(3X), +\fB\%curs_add_wch\fP(3X), +\fB\%curs_attr\fP(3X) diff --git a/contrib/ncurses/man/curs_border.3x b/contrib/ncurses/man/curs_border.3x new file mode 100644 index 00000000..4d159f6f --- /dev/null +++ b/contrib/ncurses/man/curs_border.3x @@ -0,0 +1,163 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2007,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_border.3x,v 1.53 2024/07/27 19:55:45 tom Exp $ +.TH curs_border 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%border\fP, +\fB\%wborder\fP, +\fB\%box\fP, +\fB\%hline\fP, +\fB\%whline\fP, +\fB\%vline\fP, +\fB\%wvline\fP, +\fB\%mvhline\fP, +\fB\%mvwhline\fP, +\fB\%mvvline\fP, +\fB\%mvwvline\fP \- +draw borders and lines in a \fIcurses\fR window of characters +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint border(chtype \fIls\fP, chtype \fIrs\fP, chtype \fIts\fP, chtype \fIbs\fP, + \fBchtype \fItl\fB, chtype \fItr\fB, chtype \fIbl\fB, chtype \fIbr\fB);\fR +\fBint wborder(WINDOW *\fIwin\fB, chtype \fIls\fB, chtype \fIrs\fB,\fR + \fBchtype \fIts\fB, chtype \fIbs\fB, chtype \fItl\fB, chtype \fItr\fB,\fR + \fBchtype \fIbl\fB, chtype \fIbr\fB);\fR +.PP +\fBint box(WINDOW *\fIwin\fB, chtype \fIverch\fB, chtype \fIhorch\fB);\fR +.PP +\fBint hline(chtype \fIch\fB, int \fIn\fB);\fR +\fBint whline(WINDOW *\fIwin\fB, chtype \fIch\fB, int \fIn\fB);\fR +\fBint vline(chtype \fIch\fB, int \fIn\fB);\fR +\fBint wvline(WINDOW *\fIwin\fB, chtype \fIch\fB, int \fIn\fB);\fR +.PP +\fBint mvhline(int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR +\fBint mvwhline(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR +\fBint mvvline(int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR +\fBint mvwvline(WINDOW *\fIwin\fB, int \fIy\fB, int \fIx\fB, chtype \fIch\fB, int \fIn\fB);\fR +.fi +.SH DESCRIPTION +The \fBborder\fP, \fBwborder\fP and \fBbox\fP routines +draw a box around the edges of a window. +Other than the window, each argument is a character with attributes: +.sp +.RS +\fIls\fP \- left side, +.br +\fIrs\fP \- right side, +.br +\fIts\fP \- top side, +.br +\fIbs\fP \- bottom side, +.br +\fItl\fP \- top left-hand corner, +.br +\fItr\fP \- top right-hand corner, +.br +\fIbl\fP \- bottom left-hand corner, and +.br +\fIbr\fP \- bottom right-hand corner. +.RE +.PP +If any of these arguments is zero, then the corresponding +default values (defined in \fBcurses.h\fP) are used instead: +.sp +.RS +\fBACS_VLINE\fP, +.br +\fBACS_VLINE\fP, +.br +\fBACS_HLINE\fP, +.br +\fBACS_HLINE\fP, +.br +\fBACS_ULCORNER\fP, +.br +\fBACS_URCORNER\fP, +.br +\fBACS_LLCORNER\fP, +.br +\fBACS_LRCORNER\fP. +.RE +.PP +\fBbox(\fIwin\fB, \fIverch\fB, \fIhorch\fB)\fR is a shorthand +for the following call: \fBwborder(\fIwin\fB,\fR \fIverch\fB,\fR +\fIverch\fB,\fR \fIhorch\fB,\fR \fIhorch\fB, 0, 0, 0, 0)\fR. +.PP +The \fBhline\fP and \fBwhline\fP functions draw a horizontal (left to right) +line using \fIch\fP starting at the current cursor position in the window. +The +current cursor position is not changed. +The line is at most \fIn\fP characters +long, or as many as fit into the window. +.PP +The \fBvline\fP and \fBwvline\fP functions draw a vertical (top to bottom) line +using \fIch\fP starting at the current cursor position in the window. +The +current cursor position is not changed. +The line is at most \fIn\fP characters +long, or as many as fit into the window. +.SH RETURN VALUE +All routines return the integer \fBOK\fP. +The SVr4.0 manual says +\*(``or a non-negative integer if \fB\%immedok\fP is set\*('', +but this appears to be an error. +.PP +This implementation returns +.B ERR +if the window pointer is null. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +The borders generated by these functions are \fIinside\fP borders (this +is also true of SVr4 curses, though the fact is not documented). +.PP +Note that \fBborder\fP and \fBbox\fP may be macros. +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4. +It specifies no error conditions for them. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_outopts\fP(3X) diff --git a/contrib/ncurses/man/curs_border_set.3x b/contrib/ncurses/man/curs_border_set.3x new file mode 100644 index 00000000..6e1acdf5 --- /dev/null +++ b/contrib/ncurses/man/curs_border_set.3x @@ -0,0 +1,205 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2011,2012 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_border_set.3x,v 1.38 2024/05/25 20:10:58 tom Exp $ +.TH curs_border_set 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%border_set\fP, +\fB\%wborder_set\fP, +\fB\%box_set\fP, +\fB\%hline_set\fP, +\fB\%whline_set\fP, +\fB\%mvhline_set\fP, +\fB\%mvwhline_set\fP, +\fB\%vline_set\fP, +\fB\%wvline_set\fP, +\fB\%mvvline_set\fP, +\fB\%mvwvline_set\fP \- +draw borders and lines in a \fIcurses\fR window of wide characters +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint border_set( + \fBconst cchar_t *\fIls\fB, const cchar_t *\fIrs\fP, + \fBconst cchar_t *\fIts\fB, const cchar_t *\fIbs\fP, + \fBconst cchar_t *\fItl\fB, const cchar_t *\fItr\fP, + \fBconst cchar_t *\fIbl\fB, const cchar_t *\fIbr\fB);\fR +.br +\fBint wborder_set(\fP + \fBWINDOW *\fIwin\fP, + \fBconst cchar_t *\fIls\fB, const cchar_t *\fIrs\fP, + \fBconst cchar_t *\fIts\fB, const cchar_t *\fIbs\fP, + \fBconst cchar_t *\fItl\fB, const cchar_t *\fItr\fP, + \fBconst cchar_t *\fIbl\fB, const cchar_t *\fIbr\fB);\fR +\fBint box_set(\fP + \fBWINDOW *\fIwin\fP, + \fBconst cchar_t *\fIverch\fP, + \fBconst cchar_t *\fIhorch\fB);\fR +\fBint hline_set(\fP + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint whline_set(\fP + \fBWINDOW *\fIwin\fP, + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint mvhline_set(\fP + \fBint \fIy\fB, int \fIx\fP, + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint mvwhline_set(\fP + \fBWINDOW *\fIwin\fP, + \fBint \fIy\fB, int \fIx\fP, + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint vline_set(\fP + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint wvline_set(\fP + \fBWINDOW *\fIwin\fP, + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint mvvline_set(\fP + \fBint \fIy\fB, int \fIx\fP, + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +\fBint mvwvline_set(\fP + \fBWINDOW *\fIwin\fP, + \fBint \fIy\fB, int \fIx\fP, + \fBconst cchar_t *\fIwch\fB, int \fIn\fB);\fR +.fi +.SH DESCRIPTION +The +\fBborder_set\fP +and +\fBwborder_set\fP +functions draw a border around the edges of the current or specified window. +These functions do not change the cursor position, and do not wrap. +.PP +Other than the window, each argument is a complex character with attributes: +.RS +\fIls\fP \- left side, +.br +\fIrs\fP \- right side, +.br +\fIts\fP \- top side, +.br +\fIbs\fP \- bottom side, +.br +\fItl\fP \- top left-hand corner, +.br +\fItr\fP \- top right-hand corner, +.br +\fIbl\fP \- bottom left-hand corner, and +.br +\fIbr\fP \- bottom right-hand corner. +.RE +.PP +If any of these arguments is zero, then the corresponding +default values (defined in \fBcurses.h\fP) are used instead: +.RS +\fBWACS_VLINE\fP, +.br +\fBWACS_VLINE\fP, +.br +\fBWACS_HLINE\fP, +.br +\fBWACS_HLINE\fP, +.br +\fBWACS_ULCORNER\fP, +.br +\fBWACS_URCORNER\fP, +.br +\fBWACS_LLCORNER\fP, and +.br +\fBWACS_LRCORNER\fP. +.RE +.PP +\fBbox_set(\fIwin\fR, \fIverch\fB, \fIhorch\fB);\fR +is a shorthand for the following call: +.PP +\fBwborder_set(\fIwin\fB, \fIverch\fB, \fIverch\fB,\fR + \fIhorch\fB, \fIhorch\fB, NULL, NULL, NULL, NULL);\fR +.PP +The +\fB*line_set\fP +functions use +\fIwch\fP +to draw a line starting at the current cursor position in the window. +The line is at most \fIn\fP characters long or as many as fit into the window. +The current cursor position is not changed. +.PP +The +\fBhline_set\fP, +\fBmvhline_set\fP, +\fBmvwhline_set\fP, and +\fBwhline_set\fP +functions draw a line proceeding toward the last column of the same line. +.PP +The +\fBvline_set\fP, +\fBmvvline_set\fP, +\fBmvwvline_set\fP, and +\fBwvline_set\fP +functions draw a line proceeding toward the last line of the window. +.SH RETURN VALUE +Upon successful completion, these functions return +\fBOK\fP. +Otherwise, they return +\fBERR\fP. +.PP +Functions using a window parameter return +.B ERR +if it is null. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +Note that +\fBborder_set\fP, +\fBhline_set\fP, +\fBmvhline_set\fP, +\fBmvvline_set\fP, +\fBmvwhline_set\fP, +\fBmvwvline_set\fP, and +\fBvline_set\fP +may be macros. +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_add_wch\fP(3X), +\fB\%curs_border\fP(3X), +\fB\%curs_outopts\fP(3X) diff --git a/contrib/ncurses/man/curs_clear.3x b/contrib/ncurses/man/curs_clear.3x new file mode 100644 index 00000000..66d84582 --- /dev/null +++ b/contrib/ncurses/man/curs_clear.3x @@ -0,0 +1,139 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_clear.3x,v 1.50 2024/05/25 20:10:58 tom Exp $ +.TH curs_clear 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%erase\fP, +\fB\%werase\fP, +\fB\%clear\fP, +\fB\%wclear\fP, +\fB\%clrtobot\fP, +\fB\%wclrtobot\fP, +\fB\%clrtoeol\fP, +\fB\%wclrtoeol\fP \- +clear all or part of a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint erase(void); +\fBint werase(WINDOW *\fIwin\fP); +.PP +\fBint clear(void); +\fBint wclear(WINDOW *\fIwin\fP); +.PP +\fBint clrtobot(void); +\fBint wclrtobot(WINDOW *\fIwin\fP); +.PP +\fBint clrtoeol(void); +\fBint wclrtoeol(WINDOW *\fIwin\fP); +.fi +.SH DESCRIPTION +.SS "erase, werase" +The \fBerase\fP and \fBwerase\fP routines copy blanks to every +position in the window, clearing the screen. +.PP +Blanks created by erasure have the current background rendition (as set +by \fBwbkgdset\fP(3X)) merged into them. +.SS "clear, wclear" +The \fBclear\fP and \fBwclear\fP routines are like \fBerase\fP and +\fBwerase\fP, but they also call \fBclearok\fP(3X), so that the screen is +cleared completely on the next call to \fBwrefresh\fP for that window +and repainted from scratch. +.SS "clrtobot, wclrtobot" +The \fBclrtobot\fP and \fBwclrtobot\fP routines erase from the cursor to the +end of screen. +That is, they erase all lines below the cursor in the window. +Also, the current line to the right of the cursor, inclusive, is erased. +.SS "clrtoeol, wclrtoeol" +The \fBclrtoeol\fP and \fBwclrtoeol\fP routines erase the current line +to the right of the cursor, inclusive, to the end of the current line. +.SH RETURN VALUE +All routines return the integer \fBOK\fP on success and \fBERR\fP on failure. +.PP +X/Open defines no error conditions. +In this implementation, +.bP +functions using a window pointer parameter return +.B ERR +if it is null +.bP +\fBwclrtoeol\fP returns an error +if the cursor position is about to wrap. +.SH NOTES +Note that \fBerase\fP, \fBwerase\fP, \fBclear\fP, \fBwclear\fP, +\fBclrtobot\fP, and \fBclrtoeol\fP may be macros. +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4. +.PP +The SVr4.0 manual says that these functions could return +\*(``or a non-negative integer if \fB\%immedok\fP is set\*('', +referring to the return-value of \fBwrefresh\fP. +In that implementation, \fBwrefresh\fP would return a count of +the number of characters written to the terminal. +.PP +Some historic curses implementations had, as an undocumented feature, the +ability to do the equivalent of \fBclearok(..., 1)\fP by saying +\fBtouchwin(stdscr)\fP or \fBclear(stdscr)\fP. +This will not work under +\fI\%ncurses\fP. +.PP +This implementation, and others such as Solaris, +sets the current position to 0,0 after erasing +via \fBwerase\fP and \fBwclear\fP. +That fact is not documented in other implementations, +and may not be true of implementations +which were not derived from SVr4 source. +.PP +Not obvious from the description, +most implementations clear the screen after \fBwclear\fP +even for a subwindow or derived window. +If you do not want to clear the screen during the next \fBwrefresh\fP, +use \fBwerase\fP instead. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_color.3x b/contrib/ncurses/man/curs_color.3x new file mode 100644 index 00000000..bf33f6f4 --- /dev/null +++ b/contrib/ncurses/man/curs_color.3x @@ -0,0 +1,591 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_color.3x,v 1.102 2024/05/25 20:10:58 tom Exp $ +.TH curs_color 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%start_color\fP, +\fB\%has_colors\fP, +\fB\%can_change_color\fP, +\fB\%init_pair\fP, +\fB\%init_color\fP, +\fB\%init_extended_pair\fP, +\fB\%init_extended_color\fP, +\fB\%color_content\fP, +\fB\%pair_content\fP, +\fB\%extended_color_content\fP, +\fB\%extended_pair_content\fP, +\fB\%reset_color_pairs\fP, +\fB\%COLOR_PAIR\fP, +\fB\%PAIR_NUMBER\fP, +\fB\%COLORS\fP, +\fB\%COLOR_PAIRS\fP, +\fB\%COLOR_BLACK\fP, +\fB\%COLOR_RED\fP, +\fB\%COLOR_GREEN\fP, +\fB\%COLOR_YELLOW\fP, +\fB\%COLOR_BLUE\fP, +\fB\%COLOR_MAGENTA\fP, +\fB\%COLOR_CYAN\fP, +\fB\%COLOR_WHITE\fP \- +manipulate terminal colors with \fIcurses\fR +.SH SYNOPSIS +.nf +\fB#include +.PP +\fI/* variables */ +\fBint COLOR_PAIRS; +\fBint COLORS; +.PP +\fBint start_color(void); +.PP +\fBbool has_colors(void); +\fBbool can_change_color(void); +.PP +\fBint init_pair(short \fIpair\fP, short \fIf\fP, short \fIb\fP); +\fBint init_color(short \fIcolor\fP, short \fIr\fP, short \fIg\fP, short \fIb\fP); +\fI/* extensions */ +\fBint init_extended_pair(int \fIpair\fP, int \fIf\fP, int \fIb\fP); +\fBint init_extended_color(int \fIcolor\fP, int \fIr\fP, int \fIg\fP, int \fIb\fP); +.PP +\fBint color_content(short \fIcolor\fP, short *\fIr\fP, short *\fIg\fP, short *\fIb\fP); +\fBint pair_content(short \fIpair\fP, short *\fIf\fP, short *\fIb\fP); +\fI/* extensions */ +\fBint extended_color_content(int \fIcolor\fP, int *\fIr\fP, int *\fIg\fP, int *\fIb\fP); +\fBint extended_pair_content(int \fIpair\fP, int *\fIf\fP, int *\fIb\fP); +.PP +\fI/* extension */ +\fBvoid reset_color_pairs(void); +.PP +\fBint COLOR_PAIR(int \fIn\fP); +\fBPAIR_NUMBER(int \fIattr\fP); +.fi +.SH DESCRIPTION +.SS Overview +\fIcurses\fP supports color attributes on terminals with that +capability. +Call \fB\%start_color\fP +(typically right after \fB\%initscr\fP(3X)) +to enable this feature. +Colors are always used in pairs. +A +.I "color pair" +couples a foreground color for characters with a background color for +the blank field on which characters are rendered. +\fB\%init_pair\fP initializes a color pair. +The macro \fB\%COLOR_PAIR\fP(\fIn\fP) can then convert the pair to a +video attribute. +.PP +If a terminal has the relevant capability, +\fB\%init_color\fP permits (re)definition of a color. +\fB\%has_colors\fP and \fB\%can_change_color\fP +return \fBTRUE\fP or \fBFALSE\fP, +depending on whether the terminal has color capability and whether the +programmer can change the colors. +\fB\%color_content\fP permits extraction of the +red, +green, +and blue components of an initialized color. +\fB\%pair_content\fP permits discovery of a color pair's current +definition. +.SS Rendering +.I curses +combines the following data to render a character cell. +Any of them can include color information. +.bP +.I curses +character attributes, +as from \fB\%waddch\fP(3X) or \fB\%wadd_wch\fP(3X) +.bP +window attributes, +as from \fB\%wattrset\fP(3X) or \fB\%wattr_set\fP(3X) +.bP +window background character attributes, +as from \fB\%wbkgdset\fP(3X) or \fB\%wbkgrndset\fP(3X) +.PP +Per-character and window attributes are usually set through a function +parameter containing attributes including a color pair value. +Some functions, +such as \fB\%wattr_set\fP, +use a separate color pair number parameter. +.PP +The background character is a special case: +it includes a character code, +just as if it were passed to \fB\%waddch\fP. +.PP +The \fIcurses\fP library does the actual work of combining these color +pairs in an internal function called from \fB\%waddch\fP: +.bP +If the parameter passed to \fB\%waddch\fP is \fIblank\fP, +and it uses the special color pair 0, +.RS +.bP +\fIcurses\fP next checks the window attribute. +.bP +If the window attribute does not use color pair 0, +\fIcurses\fP uses the color pair from the window attribute. +.bP +Otherwise, \fIcurses\fP uses the background character. +.RE +.bP +If the parameter passed to \fB\%waddch\fP is \fInot blank\fP, +or it does not use the special color pair 0, +\fIcurses\fP prefers the color pair from the parameter, +if it is nonzero. +Otherwise, it tries the window attribute next, and finally the +background character. +.PP +Some \fIcurses\fP functions such as \fB\%wprintw\fP call \fB\%waddch\fP. +Those do not combine its parameter with a color pair. +Consequently those calls use only the window attribute or +the background character. +.SH CONSTANTS +In \fB\%\fP the following macros are defined. +These are the standard colors (ISO-6429). +\fIcurses\fP also assumes that \fB\%COLOR_BLACK\fP is the default +background color for all terminals. +.PP +.nf + \fBCOLOR_BLACK\fP + \fBCOLOR_RED\fP + \fBCOLOR_GREEN\fP + \fBCOLOR_YELLOW\fP + \fBCOLOR_BLUE\fP + \fBCOLOR_MAGENTA\fP + \fBCOLOR_CYAN\fP + \fBCOLOR_WHITE\fP +.fi +.PP +Some terminals support more than the eight (8) \*(``ANSI\*('' colors. +There are no standard names for those additional colors. +.SH VARIABLES +.SS COLORS +is initialized by \fB\%start_color\fP to the maximum number of colors +the terminal can support. +.SS COLOR_PAIRS +is initialized by \fB\%start_color\fP to the maximum number of color +pairs the terminal can support. +Often, +its value is the product \fB\%COLORS\fP \(mu \fB\%COLORS\fP, +but this is not always true. +.bP +A few terminals use the HLS color space +(see \fB\%start_color\fP below), +ignoring this rule; +and +.bP +terminals supporting a large number of colors are limited to the number +of color pairs that a +.I "signed short" +value can represent. +.SH FUNCTIONS +.SS start_color +The \fB\%start_color\fP routine requires no arguments. +It must be called if the programmer wants to use colors, and before any other +color manipulation routine is called. +It is good practice to call this routine right after \fB\%initscr\fP. +\fB\%start_color\fP does this: +.bP +It initializes two global variables, \fB\%COLORS\fP and +\fB\%COLOR_PAIRS\fP (respectively defining the maximum number of colors +and color pairs the terminal can support). +.bP +It initializes the special color pair \fB\%0\fP to the default foreground +and background colors. +No other color pairs are initialized. +.bP +It restores the colors on the terminal to the values +they had when the terminal was just turned on. +.bP +If the terminal supports the \fBinitc\fP \%(\fBinitialize_color\fP) capability, +\fB\%start_color\fP +initializes its internal table representing the +red, green, and blue components of the color palette. +.IP +The components depend on whether the terminal uses +CGA (aka \*(``ANSI\*('') or +HLS (i.e., the \fBhls\fP \%(\fBhue_lightness_saturation\fP) capability is set). +The table is initialized first for eight basic colors +(black, red, green, yellow, blue, magenta, cyan, and white), +using weights that depend upon the CGA/HLS choice. +For \*(``ANSI\*('' colors the weights are \fB680\fP or \fB0\fP +depending on whether the corresponding +red, green, or blue component is used or not. +That permits using \fB1000\fP to represent bold/bright colors. +After the initial eight colors +(if the terminal supports more than eight colors) +the components are initialized using the same pattern, +but with weights of \fB1000\fP. +SVr4 uses a similar scheme, but uses \fB1000\fP +for the components of the initial eight colors. +.IP +\fB\%start_color\fP does not attempt to set the terminal's color palette +to match its built-in table. +An application may use \fB\%init_color\fP to alter the internal table +along with the terminal's color. +.PP +These limits apply to color values and color pairs. +Values outside these limits are not valid, and may result in a runtime error: +.bP +\fBCOLORS\fP corresponds to the terminal database's \fB\%max_colors\fP capability, +(see \fB\%terminfo\fP(5)). +.bP +color values are expected to be in the range \fB0\fP to \fB\%COLORS\-1\fP, +inclusive (including \fB0\fP and \fB\%COLORS\-1\fP). +.bP +a special color value \fB\-1\fP is used in certain extended functions +to denote the \fIdefault color\fP (see \fB\%use_default_colors\fP(3X)). +.bP +\fB\%COLOR_PAIRS\fP corresponds to +the terminal database's \fB\%max_pairs\fP capability, +(see \fB\%terminfo\fP(5)). +.bP +valid color pair values are in the range \fB1\fP to \fB\%COLOR_PAIRS\-1\fP, +inclusive. +.bP +color pair \fB0\fP is special; it denotes \*(``no color\*(''. +.IP +Color pair \fB0\fP is assumed to be white on black, +but is actually whatever the terminal implements before color is initialized. +It cannot be modified by the application. +.SS has_colors +The \fB\%has_colors\fP routine requires no arguments. +It returns \fBTRUE\fP if +the terminal can manipulate colors; otherwise, it returns \fBFALSE\fP. +This routine facilitates writing terminal-independent programs. +For example, a programmer can use it to decide +whether to use color or some other video attribute. +.SS can_change_color +The \fB\%can_change_color\fP routine requires no arguments. +It returns \fBTRUE\fP if the terminal supports colors +and can change their definitions; +other, it returns \fBFALSE\fP. +This routine facilitates writing terminal-independent programs. +.SS init_pair +The \fB\%init_pair\fP routine changes the definition of a color pair. +It takes three arguments: +the number of the color pair to be changed, the foreground +color number, and the background color number. +For portable applications: +.bP +The first argument must be a valid color pair value. +If default colors are used (see \fB\%use_default_colors\fP(3X)) +the upper limit is adjusted to allow for extra pairs which use +a default color in foreground and/or background. +.bP +The second and third arguments must be valid color values. +.PP +If the color pair was previously initialized, +the screen is refreshed and all occurrences of that color pair +are changed to the new definition. +.PP +As an extension, +\fI\%ncurses\fP allows you to set color pair \fB0\fP via the +\fB\%assume_default_colors\fP(3X) routine, or to specify the use of +default colors (color number \fB\-1\fP) if you first invoke the +\fB\%use_default_colors\fP(3X) routine. +.SS init_extended_pair +Because \fB\%init_pair\fP uses signed \fBshort\fPs for its parameters, +that limits color pairs and color-values +to 32767 on modern hardware. +The extension \fB\%init_extended_pair\fP uses \fBint\fPs +for the color pair and color-value, +allowing a larger number of colors to be supported. +.SS init_color +The \fB\%init_color\fP routine changes the definition of a color. +It takes four arguments: +the number of the color to be changed followed by three RGB values +(for the amounts of red, green, and blue components). +.bP +The first argument must be a valid color value; +default colors are not allowed here. +(See the section \fB\%Colors\fP for the default color index.) +.bP +Each of the last three arguments +must be a value in the range \fB0\fP through \fB1000\fP. +.PP +When \fB\%init_color\fP is used, all +occurrences of that color on the screen immediately change to the new +definition. +.SS init_extended_color +Because \fB\%init_color\fP uses signed \fBshort\fPs for its parameters, +that limits color-values and their red, green, and blue components +to 32767 on modern hardware. +The extension \fB\%init_extended_color\fP uses \fBint\fPs +for the color value and +for setting the red, green, and blue components, +allowing a larger number of colors to be supported. +.SS color_content +The \fB\%color_content\fP routine gives programmers a way to find the intensity +of the red, green, and blue (RGB) components in a color. +It requires four arguments: the color number, and three addresses +of \fBshort\fRs for storing +the information about the amounts of red, green, and blue components in the +given color. +.bP +The first argument must be a valid color value, i.e., +\fB0\fP through \fB\%COLORS\-1\fP, inclusive. +.bP +The values that are stored at the addresses pointed to by the +last three arguments are in the range +\fB0\fP (no component) through \fB1000\fP +(maximum amount of component), inclusive. +.SS extended_color_content +Because \fB\%color_content\fP uses signed \fBshort\fPs for its parameters, +that limits color-values and their red, green, and blue components +to 32767 on modern hardware. +The extension \fB\%extended_color_content\fP uses \fBint\fPs +for the color value and +for returning the red, green, and blue components, +allowing a larger number of colors to be supported. +.SS pair_content +The \fB\%pair_content\fP routine allows programmers to find out what colors a +given color pair consists of. +It requires three arguments: the color pair +number, and two addresses of \fBshort\fRs for storing the foreground and the +background color numbers. +.bP +The first argument must be a valid color value, +i.e., in the range \fB1\fP through \fB\%COLOR_PAIRS\-1\fP, inclusive. +.bP +The values that are stored at the addresses pointed +to by the second and third arguments are in the +range \fB0\fP through \fB\%COLORS\fP, inclusive. +.SS extended_pair_content +Because \fB\%pair_content\fP uses signed \fBshort\fPs for its parameters, +that limits color pair and color-values to 32767 on modern hardware. +The extension \fB\%extended_pair_content\fP uses \fBint\fPs +for the color pair and +for returning the foreground and background colors, +allowing a larger number of colors to be supported. +.SS reset_color_pairs +The extension \fB\%reset_color_pairs\fP tells \fI\%ncurses\fP to discard +all of the color pair information which was set with \fB\%init_pair\fP. +It also touches the current- and standard-screens, allowing an application to +switch color palettes rapidly. +.SS COLOR_PAIR +\fB\%COLOR_PAIR(\fIn\fB)\fR converts a color pair number to an +attribute. +Attributes can hold color pairs in the range 0 to 255. +If you need a color pair larger than that, +you must use functions such as \fB\%attr_set\fP +(which pass the color pair as a separate parameter) +rather than the legacy functions such as \fB\%attrset\fP. +.SS PAIR_NUMBER +\fB\%PAIR_NUMBER(\fIattr\fR) extracts the color information from its +\fIattr\fP parameter and returns it as a color pair number; +it is the inverse operation of \fB\%COLOR_PAIR\fP. +.SH RETURN VALUE +The routines \fB\%can_change_color\fP and \fB\%has_colors\fP return \fBTRUE\fP +or \fBFALSE\fP. +.PP +All other routines return the integer \fBERR\fP upon failure and an \fBOK\fP +(SVr4 specifies only \*(``an integer value +other than \fBERR\fP\*('') upon successful completion. +.PP +X/Open defines no error conditions. +SVr4 does document some error conditions which apply in general: +.bP +This implementation will return \fBERR\fP on attempts to +use color values outside the range \fB0\fP to \fB\%COLORS\fP\-1 +(except for the default colors extension), +or use color pairs outside the range \fB0\fP to \fB\%COLOR_PAIRS\-1\fP. +.IP +Color values used in \fB\%init_color\fP must be +in the range \fB0\fP to \fB1000\fP. +.IP +An error is returned from all functions +if the terminal has not been initialized. +.IP +An error is returned from secondary functions such as \fB\%init_pair\fP +if \fB\%start_color\fP was not called. +.bP +SVr4 does much the same, except that +it returns \fBERR\fP from \fB\%pair_content\fP if the pair was not initialized +using \fB\%init_pairs\fP +and +it returns \fBERR\fP from \fB\%color_content\fP +if the terminal does not support changing colors. +.IP +This implementation does not return \fBERR\fP for either case. +.PP +Specific functions make additional checks: +.RS 3 +.TP 5 +\fB\%init_color\fP +returns +.B ERR +if the terminal does not support +this feature, e.g., if the \fB\%initialize_color\fP capability is absent +from the terminal description. +.TP 5 +\fB\%start_color\fP +returns an error if the color table cannot be allocated. +.RE +.SH NOTES +In the \fI\%ncurses\fP implementation, +there is a separate color activation flag, +color palette, color pairs table, +and associated \fB\%COLORS\fP and \fB\%COLOR_PAIRS\fP counts +for each screen; the \fB\%start_color\fP function only affects the current +screen. +The SVr4/XSI interface is not really designed with this in mind, and +historical implementations may use a single shared color palette. +.PP +Setting an implicit background color via a color pair affects only +character cells that a character write operation explicitly touches. +To change +the background color used when parts of a window are blanked by erasing or +scrolling operations, see \fB\%curs_bkgd\fP(3X). +.PP +Several caveats apply on older x86 machines +(e.g., i386, i486) with VGA-compatible graphics: +.bP +COLOR_YELLOW is actually brown. +To get yellow, use COLOR_YELLOW combined with the \fBA_BOLD\fP attribute. +.bP +The A_BLINK attribute should in theory cause the background to go bright. +This often fails to work, and even some cards for which it mostly works +(such as the +Paradise and compatibles) do the wrong thing when you try to set a bright +\*(``yellow\*('' background (you get a blinking yellow foreground instead). +.bP +Color RGB values are not settable. +.SH EXTENSIONS +The functions marked as extensions were designed for +\fB\%ncurses\fP(3X), +and are not found in SVr4 +.IR curses , +4.4BSD +.IR curses , +or any other previous curses implementation. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +This implementation satisfies X/Open Curses's minimum maximums +for \fB\%COLORS\fP and \fB\%COLOR_PAIRS\fP. +.PP +The \fB\%init_pair\fP routine accepts negative values of foreground +and background color to support the \fB\%use_default_colors\fP(3X) extension, +but only if that routine has been first invoked. +.PP +The assumption that \fB\%COLOR_BLACK\fP is the default +background color for all terminals can be modified using the +\fB\%assume_default_colors\fP(3X) extension. +.PP +This implementation checks the pointers, +e.g., for the values returned by +\fB\%color_content\fP and \fB\%pair_content\fP, +and will treat those as optional parameters when null. +.PP +X/Open Curses does not specify a limit for the number of colors and +color pairs which a terminal can support. +However, in its use of \fBshort\fP for the parameters, +it carries over SVr4's implementation detail for the compiled +terminfo database, which uses signed 16-bit numbers. +This implementation provides extended versions of those functions +which use \fBshort\fP parameters, +allowing applications to use larger color- and pair-numbers. +.PP +The \fB\%reset_color_pairs\fP function is an extension of +\fI\%ncurses\fP. +.SH HISTORY +SVr3.2 introduced color support to curses in 1987. +.PP +SVr4 made internal changes, +e.g., moving the storage for the color state +from \fBSP\fP (the \fISCREEN\fP structure) +to \fB\%cur_term\fP (the \fI\%TERMINAL\fP structure), +but provided the same set of library functions. +.PP +SVr4 curses limits the number of color pairs to 64, +reserving color pair zero (0) as the terminal's initial uncolored state. +This limit arises because the color pair information is a bitfield +in the \fB\%chtype\fP data type (denoted by \fB\%A_COLOR\fP). +.PP +Other implementations of curses had different limits: +.bP +PCCurses (1987-1990) provided for only eight (8) colors. +.bP +PDCurses (1992-present) inherited the 8-color limitation from PCCurses, +but changed this to 256 in version 2.5 (2001), +along with changing \fB\%chtype\fP from 16-bits to 32-bits. +.bP +X/Open Curses (1992-present) +added a new structure \fB\%cchar_t\fP to store the character, +attributes and color pair values, allowing increased range of color pairs. +Both color pairs and color-values used a signed \fBshort\fP, +limiting values to 15 bits. +.bP +\fI\%ncurses\fP (1992-present) uses eight bits +for \fB\%A_COLOR\fP in \fB\%chtype\fP values. +.IP +Version 5.3 provided a wide-character interface (2002), +but left color pairs as part of the attributes-field. +.IP +Since version 6 (2015), +ncurses uses a separate \fBint\fP for color pairs in the \fB\%cchar_t\fP values. +When those color pair values fit in 8 bits, +ncurses allows color pairs to be manipulated +via the functions using \fB\%chtype\fP values. +.bP +NetBSD curses used 6 bits from +2000 (when colors were first supported) until 2004. +At that point, NetBSD changed to use 10 bits. +As of 2021, that size is unchanged. +Like \fI\%ncurses\fP before version 6, +the NetBSD color pair information is stored in +the attributes field of \fB\%cchar_t\fP, limiting the number of color pairs +by the size of the bitfield. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_attr\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%default_colors\fP(3X) diff --git a/contrib/ncurses/man/curs_delch.3x b/contrib/ncurses/man/curs_delch.3x new file mode 100644 index 00000000..df6ff230 --- /dev/null +++ b/contrib/ncurses/man/curs_delch.3x @@ -0,0 +1,119 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_delch.3x,v 1.39 2024/09/21 23:43:41 tom Exp $ +.TH curs_delch 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%delch\fP, +\fB\%wdelch\fP, +\fB\%mvdelch\fP, +\fB\%mvwdelch\fP \- +delete a character from a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint delch(void); +\fBint wdelch(WINDOW * \fIwin\fP); +\fBint mvdelch(int \fIy\fP, int \fIx\fP); +\fBint mvwdelch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP); +.fi +.SH DESCRIPTION +.B \%wdelch +deletes the character at the cursor position in +.IR win . +It moves all characters to the right of the cursor on the same line to +the left one position and replaces the contents of the rightmost +position on the line with the window's background character; +see \fB\%bkgd\fP(3X) +(wide-character API users: \fB\%bkgrnd\fP(3X)). +The cursor position does not change +(after moving to +.RI ( y , +.IR x ), +if specified). +\fB\%ncurses\fP(3X) describes the variants of this function. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses , +they return +.B ERR +if +.I win +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +.BR \%delch , +.BR \%mvdelch , +and +.B \%mvwdelch +may be implemented as macros. +.PP +A terminal's +.B \%delete_character +.RB ( dch1 ) +capability +is not necessarily employed. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.SH HISTORY +SVr2 (1984) introduced +.IR \%delch "." +.SH SEE ALSO +\fB\%curses\fP(3X) diff --git a/contrib/ncurses/man/curs_deleteln.3x b/contrib/ncurses/man/curs_deleteln.3x new file mode 100644 index 00000000..b85c30a2 --- /dev/null +++ b/contrib/ncurses/man/curs_deleteln.3x @@ -0,0 +1,148 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2007,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_deleteln.3x,v 1.41 2024/09/22 18:35:00 tom Exp $ +.TH curs_deleteln 3X 2024-09-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.SH NAME +\fB\%deleteln\fP, +\fB\%wdeleteln\fP, +\fB\%insertln\fP, +\fB\%winsertln\fP, +\fB\%insdelln\fP, +\fB\%winsdelln\fP \- +delete or insert lines in a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint deleteln(void); +\fBint wdeleteln(WINDOW * \fIwin\fP); +.PP +\fBint insertln(void); +\fBint winsertln(WINDOW * \fIwin\fP); +.PP +\fBint insdelln(int \fIn\fP); +\fBint winsdelln(WINDOW * \fIwin\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%wdeleteln +deletes the line at the cursor in +.IR win ; +all lines below it move up one line. +.I curses +then fills the bottom line of +.I win +with the background character +configured by \fB\%wbkgdset\fP(3X) +(wide-character API users: \fB\%wbkgrndset\fP(3X)). +The cursor position does not change. +.PP +.B \%winsertln +inserts a new, empty line of characters above the line at the cursor in +.IR win , +shifting the existing lines down by one. +The content of the window's bottom line is lost; +.I curses +fills the new line with the background character. +The cursor position does not change. +.PP +.B \%winsdelln +inserts or deletes +.IR n\ lines +in +.I win +as +.I n +is positive or negative, +respectively, +as if by repeatedly calling +.B \%winsertln +or +.BR \%wdeleteln "." +.PP +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they fail if +.I win +is +.BR NULL "." +.SH NOTES +All of these functions except +.B \%winsdelln +may be implemented as macros. +.PP +These functions do not require the terminal +to possess hardware line deletion or insertion capabilities. +Even if available, +by default +.I curses +does not use them; +see \fB\%idlok\fP(3X). +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.SH HISTORY +4BSD (1980) +.I curses +introduced +.I \%wdeleteln +and +.IR \%winsertln "." +.PP +SVr3.1 (1987) +added +.IR \%winsdelln "." +.SH SEE ALSO +\fB\%curses\fP(3X) diff --git a/contrib/ncurses/man/curs_extend.3x b/contrib/ncurses/man/curs_extend.3x new file mode 100644 index 00000000..740ec14f --- /dev/null +++ b/contrib/ncurses/man/curs_extend.3x @@ -0,0 +1,128 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1999-2010,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1999-on +.\" +.\" $Id: curs_extend.3x,v 1.51 2024/09/14 20:06:50 tom Exp $ +.TH curs_extend 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%curses_version\fP, +\fB\%use_extended_names\fP \- +miscellaneous \fIcurses\fR extensions +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBconst char * curses_version(void); +\fBint use_extended_names(bool \fIbf\fP); +.fi +.SH DESCRIPTION +These +.I \%ncurses +extensions to the +.I curses +library do not fit easily into other functional categories. +.SS curses_version +.B \%curses_version +returns a pointer to a string containing the library's name +and version number, +including its patch level, +for example +\*(``ncurses 6.5.20240720\*(''. +.SS use_extended_names +.B \%use_extended_names +configures whether the library recognizes +user-defined or nonstandard +.I \%term\%info +capability names that may be compiled into terminal type descriptions +via the \fB\%curs_terminfo\fP(3X) or \fB\%curs_termcap\fP(3X) interfaces. +Normally these names are available for use, +since the essential decision +is made through use of \fB\%@TIC@\fP(1)'s +.B \-x +option to include such extensions in terminal type descriptions. +.B \%use_extended_names +can prevent +.I \%ncurses +from recognizing these capabilities +to ensure compatibility with other implementations of +.IR curses . +.SH RETURN VALUE +.B \%curses_version +returns a constant string. +.PP +.B \%use_extended_names +returns the previous state of extended capability name recognition, +allowing you to save this property and restore it. +.SH NOTES +The pointer returned by +.B \%curses_version +corresponds to statically allocated memory; +do not attempt to \fIfree\fP(3) it. +.SH EXTENSIONS +These functions are \fB\%ncurses\fP(3X) extensions, +and are not found in SVr4 +.IR curses , +4.4BSD +.IR curses , +or any other previous curses implementation. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +.I \%ncurses +offers several other extensions to the X/Open Curses API. +.PP +\fB\%curs_getch\fP(3X), +\fB\%curs_inopts\fP(3X), +\fB\%curs_mouse\fP(3X), +\fB\%curs_print\fP(3X), +\fB\%curs_util\fP(3X), +\fB\%default_colors\fP(3X), +\fB\%define_key\fP(3X), +\fB\%keybound\fP(3X), +\fB\%keyok\fP(3X), +\fB\%new_pair\fP(3X), +\fB\%resizeterm\fP(3X), +\fB\%wresize\fP(3X) diff --git a/contrib/ncurses/man/curs_get_wch.3x b/contrib/ncurses/man/curs_get_wch.3x new file mode 100644 index 00000000..56087beb --- /dev/null +++ b/contrib/ncurses/man/curs_get_wch.3x @@ -0,0 +1,263 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_get_wch.3x,v 1.47 2024/09/14 20:06:50 tom Exp $ +.TH curs_get_wch 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%get_wch\fP, +\fB\%wget_wch\fP, +\fB\%mvget_wch\fP, +\fB\%mvwget_wch\fP, +\fB\%unget_wch\fP \- +get (or push back) a wide character from \fIcurses\fR terminal keyboard buffer +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint get_wch(wint_t * \fIwch\fP); +\fBint wget_wch(WINDOW * \fIwin\fP, wint_t * \fIwch\fP); +\fBint mvget_wch(int \fIy\fP, int \fIx\fP, wint_t * \fIwch\fP); +\fBint mvwget_wch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, wint_t * \fIwch\fP); +.PP +\fBint unget_wch(const wchar_t \fIwc\fP); +.fi +.SH DESCRIPTION +.SS "Reading Characters" +.B \%wget_wch +gathers a key event from the terminal keyboard associated with a +.I curses +window +.IR win "," +returning +.B OK +if a wide character is read, +.B \%KEY_CODE_YES +if a function key is read, +and +.B ERR +if no key event is available. +\fB\%ncurses\fP(3X) describes the variants of this function. +.PP +When input is pending, +.B \%wget_wch +stores an integer +identifying the key event in +.IR wch ";" +for alphanumeric and punctuation keys, +this value corresponds to the character encoding used by the terminal. +Use of the control key as a modifier, +by holding it down while pressing and releasing another key, +often results in a distinct code. +The behavior of other keys depends on whether +.I win +is in keypad mode; +see subsections \*(``Keypad Mode\*('' and \*(``Predefined Key Codes\*('' +in \fB\%getch\fP(3X). +.PP +If no input is pending, +then if the no-delay flag is set in the window +(see \fB\%nodelay\fP(3X)), +the function returns +.BR ERR ";" +otherwise, +.I curses +waits until the terminal has input. +If \fB\%cbreak\fP(3X) +has been called, +this happens after one character is read. +If \fB\%nocbreak\fP(3X) or \fB\%noraw\fP(3X) +has been called, +it occurs when the next newline is read. +(Because the terminal's normal or \*(``cooked\*('' mode +is line-buffered, +multiple +.B \%wget_wch +calls may then be necessary to empty the input queue.) +If \fB\%halfdelay\fP(3X) +has been called, +.I curses +waits until input is available or the specified delay elapses. +.PP +If \fB\%echo\fP(3X) has been called, +and the window is not a pad, +.I curses +writes the wide character +from the input queue +to the window +(at the cursor position) +per the following rules. +.bP +If the wide character +matches the terminal's erase character +(see \fB\%erasewchar\fP(3X)), +the cursor moves leftward one position +and the new position is erased +as if \fB\%wmove\fP(3X) and then \fB\%wdelch\fP(3X) were called. +When the window's keypad mode is enabled +(see below), +.B \%KEY_LEFT +and +.B \%KEY_BACKSPACE +are handled the same way. +.bP +.I curses +writes any other +wide character +to the window, +as with \fB\%wecho_wchar\fP(3X). +.bP +If the window +.I win +has been moved or modified since the last call to +\fB\%wrefresh\fP(3X), +.I curses +calls +.B \%wrefresh +on it. +.PP +If the wide character +is a carriage return and \fBnl\fP(3X) has been called, +.B \%wgetch +stores the the wide character code for line feed in +.I wch +instead. +.SS "Ungetting Characters" +.B \%unget_wch +places +.I wc +into the input queue to be retrieved by the next call to +.BR \%wget_wch "." +A single input queue serves all windows associated with the terminal. +.SH RETURN VALUE +.B \%wget_wch +returns +.B OK +when it reads a wide character, +.B \%KEY_CODE_YES +when it reads a function key code, +and +.B ERR +on failure. +.B \%wget_wch +fails if +.bP +its timeout expires without any data arriving, +or +.bP +execution was interrupted by a signal, +in which case +.B \%errno +is set to +.BR \%EINTR "." +.PP +Functions taking a +.I \%WINDOW +pointer argument fail if the pointer is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ")" +is outside the window boundaries. +.PP +.B \%unget_wch +returns +.B OK +on success and +.B ERR +if there is no more room in the input queue. +.SH NOTES +See the \*(``NOTES\*('' section of \fB\%wgetch\fP(3X). +.PP +All of these functions except +.B \%wget_wch +and +.B \%unget_wch +may be implemented as macros. +.PP +Unlike \fB\%wgetch\fP(3X), +.B \%wget_wch +and its variants store the value of the input character in an additional +.I wch +parameter instead of the return value. +.PP +Unlike +.BR \%ungetch "," +.B \%unget_wch +cannot distinguish function key codes from conventional character codes. +An application can overcome this limitation by pushing function key +codes with +.B \%ungetch +and subsequently checking the return value of +.B \%wget_wch +for a match with +.BR \%KEY_CODE_YES "." +.SH EXTENSIONS +See the \*(``EXTENSIONS\*('' section of \fB\%wgetch\fP(3X). +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +See the \*(``PORTABILITY\*('' section of \fB\%wgetch\fP(3X) regarding +the interaction of +.B \%wget_wch +with signal handlers. +.SH SEE ALSO +\fB\%curs_getch\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_add_wch\fP(3X), +\fB\%curs_inopts\fP(3X), +\fB\%curs_move\fP(3X), +\fB\%curs_refresh\fP(3X) diff --git a/contrib/ncurses/man/curs_get_wstr.3x b/contrib/ncurses/man/curs_get_wstr.3x new file mode 100644 index 00000000..3893bb95 --- /dev/null +++ b/contrib/ncurses/man/curs_get_wstr.3x @@ -0,0 +1,228 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_get_wstr.3x,v 1.54 2024/06/22 21:34:19 tom Exp $ +.TH curs_get_wstr 3X 2024-06-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%get_wstr\fP, +\fB\%getn_wstr\fP, +\fB\%wget_wstr\fP, +\fB\%wgetn_wstr\fP, +\fB\%mvget_wstr\fP, +\fB\%mvgetn_wstr\fP, +\fB\%mvwget_wstr\fP, +\fB\%mvwgetn_wstr\fP \- +get a wide-character string from a \fIcurses\fR terminal keyboard +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint get_wstr(wint_t * \fIwstr\fP); +\fBint wget_wstr(WINDOW * \fIwin\fP, wint_t * \fIwstr\fP); +\fBint mvget_wstr(int \fIy\fP, int \fIx\fP, wint_t * \fIwstr\fP); +\fBint mvwget_wstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, wint_t * \fIwstr\fP); +.PP +\fBint getn_wstr(wint_t * \fIwstr\fP, int \fIn\fP); +\fBint wgetn_wstr(WINDOW * \fIwin\fP, wint_t * \fIwstr\fP, int \fIn\fP); +\fBint mvgetn_wstr(int \fIy\fP, int \fIx\fP, wint_t * \fIwstr\fP, int \fIn\fP); +\fBint mvwgetn_wstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, wint_t * \fIwstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +The function +\fBwgetn_wstr\fP +is equivalent to a series of calls to +\fBwget_wch\fP(3X) +until a newline or carriage return terminates the series: +.bP +The terminating character is not included in the returned string. +.bP +An end-of-file condition is represented by \fBWEOF\fP, +as defined in \fB\fP. +.bP +In all instances, the end of the string is terminated +by a null \fBwchar_t\fP. +.bP +The function stores the result in the area pointed to +by the \fIwstr\fP parameter. +.bP +The function reads at most \fIn\fP characters, +thus preventing a possible overflow of the input buffer. +.IP +Any attempt to enter more characters +(other than the terminating newline or carriage return) +causes a beep. +.IP +Function keys also cause a beep and are ignored. +.PP +The user's \fIerase\fP and \fIkill\fP characters are interpreted: +.bP +The \fIerase\fP character (e.g., \fB^H\fP) erases the character +at the end of the buffer, moving the cursor to the left. +.IP +If \fIkeypad\fP mode is on for the window, +\fBKEY_LEFT\fP and \fBKEY_BACKSPACE\fP +are both considered equivalent to the user's \fIerase\fP character. +.bP +The \fIkill\fP character (e.g., \fB^U\fP) erases the entire buffer, +leaving the cursor at the beginning of the buffer. +.PP +Characters input are echoed only if \fBecho\fP is currently on. +In that case, +backspace is echoed as deletion of the previous character +(typically a left motion). +.PP +The +\fBgetn_wstr\fP, +\fBmvgetn_wstr\fP, +\fBmvwgetn_wstr\fP, and +\fBwgetn_wstr\fP +functions are identical +to the +\fBget_wstr\fP, +\fBmvget_wstr\fP, +\fBmvwget_wstr\fP, and +\fBwget_wstr\fP +functions, respectively, +except that the +\fB*n_*\fP +versions read at most +\fIn\fP +characters, letting the application prevent overflow of the +input buffer. +.SH RETURN VALUE +All of these functions return the integer \fBOK\fP upon successful completion. +If unsuccessful, they return \fBERR\fP. +.PP +X/Open defines no error conditions. +.PP +In this implementation, +these functions return +.B ERR +.bP +if the window pointer is null, +.bP +if its timeout expires without having any data, or +.bP +if the associated call to +\fBwget_wch\fP +failed. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +Any of these functions other than +\fBwgetn_wstr\fP +may be macros. +.PP +Using +\fBget_wstr\fP, +\fBmvget_wstr\fP, +\fBmvwget_wstr\fP, or +\fBwget_wstr\fP +to read a line that +overflows the array pointed to by +\fBwstr\fP +causes undefined +results. +The use of +\fBgetn_wstr\fP, +\fBmvgetn_wstr\fP, +\fBmvwgetn_wstr\fP, or +\fBwgetn_wstr\fP, +respectively, is recommended. +.PP +These functions cannot return \fBKEY_\fP values because there +is no way to distinguish a \fBKEY_\fP value from a valid \fBwchar_t\fP value. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +This implementation returns \fBERR\fP if the window pointer is null, +or if the lower-level \fBwget_wch\fP call returns an \fBERR\fP. +In the latter case, +an \fBERR\fP return without other data is treated as an end-of-file condition, +and the returned array contains a \fBWEOF\fP followed by a null \fBwchar_t\fP. +.PP +X/Open curses documented these functions to pass an array of \fBwchar_t\fP +in 1997, but that was an error because of this part of the description: +.RS +.PP +The effect of \fBget_wstr\fP is as though a series of calls to +\fBget_wch\fP were made, until a newline character, end-of-line character, or +end-of-file character is processed. +.RE +.PP +The latter function \fIget_wch\fP can return a negative value, +while \fBwchar_t\fP is a unsigned type. +All of the vendors implement this using \fBwint_t\fP, following the standard. +.PP +X/Open Curses, Issue 7 (2009) is unclear regarding whether +the terminating \fInull \fBwchar_t\fR +value is counted in the length parameter \fIn\fP. +X/Open Curses, Issue 7 revised the corresponding description +of \fBwgetnstr\fP to address this issue. +The unrevised description of \fBwget_nwstr\fP can be interpreted either way. +This implementation counts the terminator in the length. +.PP +X/Open Curses does not specify what happens if the length \fIn\fP is negative. +.bP +For analogy with \fBwgetnstr\fP, +\fI\%ncurses\fP 6.2 uses a limit (based on \fBLINE_MAX\fP). +.bP +Some other implementations (such as Solaris xcurses) do the same, +while others (PDCurses) do not allow this. +.bP +NetBSD 7 curses imitates \fI\%ncurses\fP 6.1 in this regard, +treating a \fB\-1\fP as an indefinite number of characters. +.SH SEE ALSO +\fB\%curs_getstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_get_wch\fP(3X) diff --git a/contrib/ncurses/man/curs_getcchar.3x b/contrib/ncurses/man/curs_getcchar.3x new file mode 100644 index 00000000..523cc99d --- /dev/null +++ b/contrib/ncurses/man/curs_getcchar.3x @@ -0,0 +1,188 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2001-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_getcchar.3x,v 1.49 2024/04/20 18:55:09 tom Exp $ +.TH curs_getcchar 3X 2024-04-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%getcchar\fP, +\fB\%setcchar\fP \- +convert between a wide-character string and a \fIcurses\fR complex character +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint getcchar( +.B " const cchar_t *\fIwch\fP," +.B " wchar_t *\fIwc\fP," +.B " attr_t *\fIattrs\fP," +.B " short *\fIcolor_pair\fP," +.B " void *\fIopts\fP );" +.PP +.B "int setcchar(" +.B " cchar_t *\fIwch\fP," +.B " const wchar_t *\fIwc\fP," +.B " const attr_t \fIattrs\fP," +.B " short \fIcolor_pair\fP," +.B " const void *\fIopts\fP );" +.fi +.SH DESCRIPTION +.SS getcchar +The \fBgetcchar\fP function gets a wide-character string +and rendition from a \fBcchar_t\fP argument. +When \fIwc\fP is not a null pointer, +the \fBgetcchar\fP function does the following: +.bP +Extracts information from a \fBcchar_t\fP value \fIwch\fP +.bP +Stores the character attributes in the location pointed to by \fIattrs\fP +.bP +Stores the color pair in the location pointed to by \fIcolor_pair\fP +.bP +Stores the wide-character string, +characters referenced by \fIwch\fP, into the array pointed to by \fIwc\fP. +.PP +When +\fIwc\fP +is a null pointer, the +\fBgetcchar\fP +function does the following: +.bP +Obtains the number of wide characters pointed to by \fIwch\fP +.bP +Does not change the data referenced by +\fIattrs\fP +or +\fIcolor_pair\fP +.SS setcchar +The \fBsetcchar\fP function initializes the location pointed to by \fIwch\fP +by using: +.bP +The character attributes in +\fIattrs\fP +.bP +The color pair in +\fIcolor_pair\fP +.bP +The wide-character string pointed to by \fIwc\fP. +The string must be L'\e0' terminated, +contain at most one spacing character, +which must be the first. +.IP +Up to \fBCCHARW_MAX\fP\-1 non-spacing characters may follow. +Additional non-spacing characters are ignored. +.IP +The string may contain a single control character instead. +In that case, no non-spacing characters are allowed. +.SH RETURN VALUE +When \fIwc\fP is a null pointer, +\fBgetcchar\fP returns the number of wide characters referenced by +\fIwch\fP, +including one for a trailing null. +.PP +When \fIwc\fP is not a null pointer, +\fBgetcchar\fP returns \fBOK\fP upon successful completion, +and \fBERR\fP otherwise. +.PP +Upon successful completion, \fBsetcchar\fP returns \fBOK\fP. +Otherwise, it returns \fBERR\fP. +.SH NOTES +The \fIwch\fP argument may be a value generated by a call to +\fBsetcchar\fP or by a function that has a \fBcchar_t\fP output argument. +If \fIwch\fP is constructed by any other means, the effect is unspecified. +.SH EXTENSIONS +X/Open Curses documents the \fIopts\fP argument as reserved for future use, +saying that it must be null. +This implementation +uses that parameter in ABI 6 for the functions which have a color pair +parameter to support extended color pairs: +.bP +For functions which modify the color, e.g., \fBsetcchar\fP, +if \fIopts\fP is set it is treated as a pointer to \fBint\fP, +and used to set the color pair instead of the \fBshort\fP pair parameter. +.bP +For functions which retrieve the color, e.g., \fBgetcchar\fP, +if \fIopts\fP is set it is treated as a pointer to \fBint\fP, +and used to retrieve the color pair as an \fBint\fP value, +in addition retrieving it via the standard pointer to \fBshort\fP parameter. +.SH PORTABILITY +The \fBCCHARW_MAX\fP symbol is specific to \fI\%ncurses\fP. +X/Open Curses does not provide details for the layout of the \fBcchar_t\fP +structure. +It tells what data are stored in it: +.bP +a spacing character (\fBwchar_t\fP, i.e., 32-bits). +.bP +non-spacing characters (again, \fBwchar_t\fP's). +.bP +attributes (at least 16 bits, inferred from the various ACS- and WACS-flags). +.bP +color pair (at least 16 bits, inferred from the \fBunsigned short\fP type). +.PP +The non-spacing characters are optional, +in the sense that zero or more may be stored in a \fBcchar_t\fP. +XOpen/Curses specifies a limit: +.RS 4 +.PP +Implementations may limit the number of non-spacing characters that can be +associated with a spacing character, provided any limit is at least 5. +.RE +.PP +The Unix implementations at the time follow that limit: +.bP +AIX\ 4 and OSF1\ 4 use the same declaration with an array of 5 non-spacing +characters \fIz\fP and a single spacing character \fIc\fP. +.bP +HP-UX\ 10 uses an opaque structure with 28 bytes, +which is large enough for the 6 \fBwchar_t\fP values. +.bP +Solaris \fIxpg4\fP curses uses a single array of 6 \fBwchar_t\fP values. +.PP +This implementation's \fBcchar_t\fP was defined in 1995 +using \fB5\fP for the total of spacing and non-spacing characters +(\fBCCHARW_MAX\fP). +That was probably due to a misreading of the AIX\ 4 header files, +because the X/Open Curses document was not generally available at that time. +Later (in 2002), this detail was overlooked when beginning to implement +the functions using the structure. +.PP +In practice, even four non-spacing characters may seem enough. +X/Open Curses documents possible uses for non-spacing characters, +including using them for ligatures between characters +(a feature apparently not supported by any curses implementation). +Unicode does not limit the (analogous) number of combining characters, +so some applications may be affected. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_attr\fP(3X), +\fB\%curs_color\fP(3X), +\fB\%wcwidth\fP(3) diff --git a/contrib/ncurses/man/curs_getch.3x b/contrib/ncurses/man/curs_getch.3x new file mode 100644 index 00000000..0bc36596 --- /dev/null +++ b/contrib/ncurses/man/curs_getch.3x @@ -0,0 +1,726 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_getch.3x,v 1.101 2024/09/14 20:06:50 tom Exp $ +.TH curs_getch 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ^ \(ha +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ds ^ ^ +.\} +. +.ie \n(.g .ds : \: +.el .ds : \" empty +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%getch\fP, +\fB\%wgetch\fP, +\fB\%mvgetch\fP, +\fB\%mvwgetch\fP, +\fB\%ungetch\fP, +\fB\%has_key\fP \- +get (or push back) characters from \fIcurses\fR terminal keyboard buffer +.SH SYNOPSIS +.nf +.B #include +.PP +.B int getch(void); +.B int wgetch(WINDOW * \fIwin\fP); +.B int mvgetch(int \fIy\fP, int \fIx\fP); +.B int mvwgetch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP); +.PP +.B int ungetch(int \fIc\fP); +.PP +.\" XXX: Move has_key into its own page like define_key and key_defined? +\fI/* extension */\fP +.B int has_key(int \fIc\fP); +.fi +.SH DESCRIPTION +.SS "Reading Characters" +.B \%wgetch +gathers a key event from the terminal keyboard associated with a +.I curses +window +.IR win "." +\fB\%ncurses\fP(3X) describes the variants of this function. +.PP +When input is pending, +.B \%wgetch +returns an integer identifying the key event; +for alphanumeric and punctuation keys, +this value corresponds to the character encoding used by the terminal. +Use of the control key as a modifier, +by holding it down while pressing and releasing another key, +often results in a distinct code. +The behavior of other keys depends on whether +.I win +is in keypad mode; +see subsection \*(``Keypad Mode\*('' below. +.PP +If no input is pending, +then if the no-delay flag is set in the window +(see \fB\%nodelay\fP(3X)), +the function returns +.BR ERR ";" +otherwise, +.I curses +waits until the terminal has input. +If \fB\%cbreak\fP(3X) +has been called, +this happens after one character is read. +If \fB\%nocbreak\fP(3X) or \fB\%noraw\fP(3X) +has been called, +it occurs when the next newline is read. +(Because the terminal's normal or \*(``cooked\*('' mode +is line-buffered, +multiple +.B \%wgetch +calls may then be necessary to empty the input queue.) +If \fB\%halfdelay\fP(3X) +has been called, +.I curses +waits until input is available or the specified delay elapses. +.PP +If \fB\%echo\fP(3X) has been called, +and the window is not a pad, +.I curses +writes the returned character +.I c +to the window +(at the cursor position) +per the following rules. +.bP +If +.I c +matches the terminal's erase character +(see \fB\%erasechar\fP(3X)), +the cursor moves leftward one position +and the new position is erased +as if \fB\%wmove\fP(3X) and then \fB\%wdelch\fP(3X) were called. +When the window's keypad mode is enabled +(see below), +.B \%KEY_LEFT +and +.B \%KEY_BACKSPACE +are handled the same way. +.bP +.I curses +writes any other +.I c +to the window, +as with \fB\%wechochar\fP(3X). +.bP +If the window +.I win +has been moved or modified since the last call to +\fB\%wrefresh\fP(3X), +.I curses +calls +.B \%wrefresh +on it. +.PP +If +.I c +is a carriage return and \fBnl\fP(3X) has been called, +.B \%wgetch +returns the character code for line feed instead. +.SS "Keypad Mode" +To +.IR curses "," +key strokes not from the alphabetic section of the keyboard +(those corresponding to the ECMA-6 character set\(emsee +\fI\%ascii\fP(7)\(emoptionally modified by either the control or shift +keys) +are treated as +.I function +keys. +(In +.IR curses "," +the term \*(``function key\*('' includes but is not limited to keycaps +engraved with \*(``F1\*('', +\*(``PF1\*('', +and so on.) +If the window is in keypad mode, +these produce a numeric code corresponding to the +.B KEY_ +symbols listed in subsection \*(``Predefined Key Codes\*('' below; +otherwise, +they transmit a sequence of codes typically starting with the escape +character, +and which must be collected with multiple +.B \%wgetch +calls. +.bP +The +.I \%curses.h +header file declares many +.I "predefined function keys" +whose names begin with +.BR KEY_ ";" +these object-like macros have values outside the range of eight-bit +character codes. +.bP +In +.IR \%ncurses "," +.I "user-defined function keys" +are configured with \fB\%define_key\fP(3X); +they have no names, +but are also expected to have values outside the range of eight-bit +codes. +.PP +A variable intended to hold a function key code must thus be of type +.I short +or larger. +.PP +Most terminals one encounters follow the ECMA-48 standard insofar as +their function keys produce character sequences prefixed with the +escape character ESC. +This fact implies that +.I curses +cannot distinguish a user's press of the escape key +(assuming it sends ESC) +from the beginning of a function key's character sequence without +waiting to see if, +and how soon, +further input arrives. +When +.I curses +reads such an ambiguous character, +it sets a timer. +If the remainder of the sequence does not arrive within the designated +time, +.B \%wgetch +returns the prefix character; +otherwise, +it returns the function key code corresponding to the unique sequence +defined by the terminal. +Consequently, +a user of a +.I curses +application may experience a delay after the escape key is pressed +while +.I curses +disambiguates the input; +see section \*(``EXTENSIONS\*('' below. +If the window is in \*(``no time-out\*('' mode, +the timer does not expire; +it is an infinite +(or very large) +value. +See \fB\%notimeout\fP(3X). +Because function key sequences usually begin with ESC, +the terminal may appear to hang in no time-out mode after the user +presses the escape key. +Generally, +further typing \*(``awakens\*('' +.IR curses "." +.SS "Ungetting Characters" +.B \%ungetch +places +.I c +into the input queue to be returned by the next call to +.BR \%wgetch "." +A single input queue serves all windows associated with the terminal. +.SS "Predefined Key Codes" +The header file +.I \%curses.h +defines the following function key codes. +.bP +Except for the special case of +.BR \%KEY_RESIZE "," +a window's keypad mode must be enabled for +.B \%wgetch +to read these codes from it. +.bP +Not all of these are necessarily supported on any particular terminal. +.bP +The naming convention may seem obscure, +with some apparent misspellings +(such as \*(``RSUME\*('' for \*(``resume\*(''); +the names correspond to the +.I \%term\%info +capability names for the keys, +and were standardized before the IBM PC/AT keyboard layout achieved a +dominant position in industry. +.PP +.RS +.\" XXX: Move this list into ncurses(3X), rather than duplicating it in +.\" get_wch(3X) or having that page cross reference this one? +.TS +Lb Lb +Lb Lx. +Symbol Key name += +KEY_BREAK Break key +KEY_DOWN Arrow keys +KEY_UP \^ +KEY_LEFT \^ +KEY_RIGHT \^ +KEY_HOME Home key (upward+left arrow) +KEY_BACKSPACE Backspace +KEY_F0 T{ +Function keys; space for 64 keys is reserved +T} +KEY_F(\fIn\fP) T{ +Function key \fIn\fP where 0 \(<= \fIn\fP \(<= 63 +T} +KEY_DL Delete line +KEY_IL Insert line +KEY_DC Delete character +KEY_IC Insert character/Enter insert mode +KEY_EIC Exit insert character mode +KEY_CLEAR Clear screen +KEY_EOS Clear to end of screen +KEY_EOL Clear to end of line +KEY_SF Scroll one line forward +KEY_SR Scroll one line backward (reverse) +KEY_NPAGE Next page/Page up +KEY_PPAGE Previous page/Page down +KEY_STAB Set tab +KEY_CTAB Clear tab +KEY_CATAB Clear all tabs +KEY_ENTER Enter/Send +KEY_SRESET Soft (partial) reset +KEY_RESET (Hard) reset +KEY_PRINT Print/Copy +KEY_LL Home down/Bottom (lower left) +KEY_A1 Upper left of keypad +KEY_A3 Upper right of keypad +KEY_B2 Center of keypad +KEY_C1 Lower left of keypad +KEY_C3 Lower right of keypad +KEY_BTAB Back tab key +KEY_BEG Beg(inning) key +KEY_CANCEL Cancel key +KEY_CLOSE Close key +KEY_COMMAND Cmd (command) key +KEY_COPY Copy key +KEY_CREATE Create key +KEY_END End key +KEY_EXIT Exit key +KEY_FIND Find key +KEY_HELP Help key +KEY_MARK Mark key +KEY_MESSAGE Message key +KEY_MOUSE Mouse event occurred +KEY_MOVE Move key +KEY_NEXT Next object key +KEY_OPEN Open key +KEY_OPTIONS Options key +KEY_PREVIOUS Previous object key +KEY_REDO Redo key +KEY_REFERENCE Ref(erence) key +KEY_REFRESH Refresh key +KEY_REPLACE Replace key +KEY_RESIZE Screen resized +KEY_RESTART Restart key +KEY_RESUME Resume key +KEY_SAVE Save key +KEY_SELECT Select key +KEY_SUSPEND Suspend key +KEY_UNDO Undo 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 character key +KEY_SDL Shifted delete line key +KEY_SEND Shifted end key +KEY_SEOL Shifted clear line key +KEY_SEXIT Shifted exit key +KEY_SFIND Shifted find key +KEY_SHELP Shifted help key +KEY_SHOME Shifted home key +KEY_SIC Shifted insert key +KEY_SLEFT Shifted left arrow key +KEY_SMESSAGE Shifted message key +KEY_SMOVE Shifted move key +KEY_SNEXT Shifted next object key +KEY_SOPTIONS Shifted options key +KEY_SPREVIOUS Shifted previous object key +KEY_SPRINT Shifted print key +KEY_SREDO Shifted redo key +KEY_SREPLACE Shifted replace key +KEY_SRIGHT Shifted right arrow key +KEY_SRSUME Shifted resume key +KEY_SSAVE Shifted save key +KEY_SSUSPEND Shifted suspend key +KEY_SUNDO Shifted undo key +.TE +.RE +.PP +Many keyboards feature a nine-key directional pad. +.PP +.RS +.TS +allbox center; +C C C. +A1 up A3 +left B2 right +C1 down C3 +.TE +.RE +.sp +Two of the symbols in the list above do +.I not +correspond to a physical key. +.bP +.B \%wgetch +returns +.BR \%KEY_RESIZE "," +even if the window's keypad mode is disabled, +if +.I \%ncurses +has handled a +.B \%SIGWINCH +signal since +.B \%wgetch +was called; +see \fB\%initscr\fP(3X) and \fB\%resizeterm\fP(3X). +.bP +.B \%wgetch +returns +.B \%KEY_MOUSE +to indicate that a mouse event is pending collection; +see \fB\%curs_mouse\fP(3X). +Receipt of this code requires a window's keypad mode to be enabled, +because to interpret mouse input +(as with with \fI\%xterm\fP(1)'s mouse protocol), +.I \%ncurses +must read an escape sequence, +as with a function key. +.SS "Testing Key Codes" +In +.IR \%ncurses "," +.B \%has_key +returns a Boolean value indicating whether the terminal type recognizes +its parameter as a key code value. +See also +\fB\%define_key\fP(3X) and \fB\%key_defined\fP(3X). +.SH RETURN VALUE +.B \%wgetch +returns a key code identifying the key event as described above, +which may include +.B \%KEY_RESIZE +or +.B \%KEY_MOUSE +indicating non-key events, +or +.B ERR +on failure. +.B \%wgetch +fails if +.bP +its timeout expires without any data arriving, +or +.bP +execution was interrupted by a signal, +in which case +.B \%errno +is set to +.BR \%EINTR "." +.PP +.B \%ungetch +returns +.B OK +on success and +.B ERR +on failure. +.B \%ungetch +fails if there is no more room in the input queue. +.PP +.B \%has_key +returns +.B TRUE +or +.BR FALSE "." +.PP +Functions taking a +.I \%WINDOW +pointer argument fail if the pointer is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ")" +is outside the window boundaries. +.SH NOTES +.BR \%getch "," +.BR \%mvgetch "," +and +.B \%mvwgetch +may be implemented as macros. +.PP +.I curses +discourages assignment of the ESC key to a discrete function by the +programmer because the library requires a delay while it awaits the +potential remainder of a terminal escape sequence. +.PP +Some key strokes are indistinguishable from control characters; +for example, +.B \%KEY_ENTER +may be the same as +.BR \*^M "," +.\" as with att630 or pccon+keys +and +.B \%KEY_BACKSPACE +may be the same as +.B \*^H +.\" as with att505 or vt52-basic +or +.BR \*^? "." +.\" as with pccon+keys or vt320 +Consult the +.I \%term\%info +entry for the terminal type to determine whether this is the case; +see \fB\%infocmp\fP(1). +Some +.I curses +implementations, +including +.IR \%ncurses "," +honor the +.I \%term\%info +key definitions; +others treat such control characters specially. +.PP +.I curses +distinguishes the Enter keys in the alphabetic and numeric keypad +sections of a keyboard because (most) terminals do. +.B \%KEY_ENTER +refers to the key on the numeric keypad and, +like other function keys, +is reliably recognized only if the window's keypad mode is enabled. +.bP +The +.I \%term\%info +.B \%key_enter +.RB ( kent ) +capability describes the character (sequence) sent by the Enter key of +a terminal's numeric +(or similar) +keypad. +.bP +\*(``Enter or send\*('' is X/Open Curses's description of this key. +.PP +.I curses +treats the Enter or Return key in the +.I alphabetic +section of the keyboard differently. +.bP +It usually produces a control code for carriage return +.RB ( \*^M ) +or line feed +.RB ( \*^J ). +.bP +Depending on the terminal mode +(raw, +cbreak, +or +\*(``cooked\*(''), +and whether \fB\%nl\fP(3X) or \fB\%nonl\fP(3X) has been called, +.B \%wgetch +may return either a carriage return or line feed upon an Enter or Return +key stroke. +.PP +Use of +.B \%wgetch +with \fB\%echo\fP(3X) and neither \fB\%cbreak\fP(3X) nor \fB\%raw\fP(3X) +is not well-defined. +.PP +Historically, +the list of key code macros above was influenced by the keyboard of the +AT&T 7300 +(also known variously as the \*(``3B1\*('', \*(``Safari 4\*('', and +\*(``UNIX PC\*(''), +a 1985 machine rich in function keys. +Today's computer keyboards are based on that of the IBM PC/AT +and tend to have fewer. +A +.I curses +application can expect such a keyboard to transmit key codes +.BR \%KEY_UP "," +.BR \%KEY_DOWN "," +.BR \%KEY_LEFT "," +.BR \%KEY_RIGHT "," +.BR \%KEY_HOME "," +.BR \%KEY_END "," +.B \%KEY_PPAGE +(Page Up), +.B \%KEY_NPAGE +(Page Down), +.B \%KEY_IC +(Insert), +.B \%KEY_DC +(Delete), +.BR \%KEY_A1 "," +.BR \%KEY_A3 "," +.BR \%KEY_B2 "," +.BR \%KEY_C1 "," +.BR \%KEY_C3 "," +and +.BI \%KEY_F( n ) +for 1 \(<= +.I n +\(<= 12. +.SH EXTENSIONS +In +.IR \%ncurses "," +when a window's \*(``no time-out\*('' mode is +.I not +set, +the +.B \%ESCDELAY +variable configures the duration of the timer used to disambiguate a +function key character sequence from a series of key strokes beginning +with ESC typed by the user; +see +\fB\%curs_variables\fP(3X). +.PP +.B \%has_key +was designed for +.IR \%ncurses "," +and is not found in SVr4 +.IR curses "," +4.4BSD +.IR curses "," +or any other previous +.I curses +implementation. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +Except as noted in section \*(``EXTENSIONS\*('' above, +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +.B \%wgetch +reads only single-byte characters. +.PP +The echo behavior of these functions on input of +.B KEY_ +or backspace characters is not documented in SVr4 +.IR curses "." +.PP +The behavior of +.B \%wgetch +in the presence of signal handlers is not documented in SVr4 +.I curses +and is unspecified by X/Open Curses. +In historical +.I curses +implementations, +it varied depending on whether the operating system's dispatch of a +signal to a handler interrupted a \fIread\fP(2) call in progress, +and also +(in some implementations) +whether an input timeout or non-blocking mode had been set. +A portable +.I curses +application prepares for two cases: +(a) signal receipt does not interrupt +.BR \%wgetch ";" +or +(b) signal receipt interrupts +.B \%wgetch +and causes it to return +.B ERR +with +.B \%errno +set to +.BR \%EINTR "." +.PP +.B \%KEY_MOUSE +is mentioned in X/Open Curses, +along with a few related +.I \%term\%info +capabilities, +but no higher-level functions use the feature. +The implementation in +.I \%ncurses +is an extension. +.PP +.B \%KEY_RESIZE +and +.B \%has_key +are extensions first implemented for +.IR \%ncurses "." +By 2022, +.I \%PDCurses +.\" https://web.archive.org/web/20220117232009/https://pdcurses.org/docs/MANUAL.html +and +NetBSD +.I curses +.\" https://web.archive.org/web/20200923185647/https://man.netbsd.org/curses_input.3 +had added them along with +.BR \%KEY_MOUSE "." +.SH SEE ALSO +ECMA-6 \*(``7-bit coded Character Set\*('' +\% +.PP +ECMA-48 \*(``Control Functions for Coded Character Sets\*('' +\% +.PP +\fB\%curs_get_wch\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_inopts\fP(3X), +\fB\%curs_mouse\fP(3X), +\fB\%curs_move\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%resizeterm\fP(3X), +\fB\%ascii\fP(7) diff --git a/contrib/ncurses/man/curs_getstr.3x b/contrib/ncurses/man/curs_getstr.3x new file mode 100644 index 00000000..8ad2471f --- /dev/null +++ b/contrib/ncurses/man/curs_getstr.3x @@ -0,0 +1,494 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_getstr.3x,v 1.67 2024/06/22 22:20:56 tom Exp $ +.TH curs_getstr 3X 2024-06-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ^ \(ha +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ds ^ ^ +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%getstr\fP, +\fB\%getnstr\fP, +\fB\%wgetstr\fP, +\fB\%wgetnstr\fP, +\fB\%mvgetstr\fP, +\fB\%mvgetnstr\fP, +\fB\%mvwgetstr\fP, +\fB\%mvwgetnstr\fP \- +accept character strings from \fIcurses\fR terminal keyboard +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint getstr(char * \fIstr\fP); +\fBint wgetstr(WINDOW * \fIwin\fP, char * \fIstr\fP); +\fBint mvgetstr(int \fIy\fP, int \fIx\fP, char * \fIstr\fP); +\fBint mvwgetstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, char * \fIstr\fP); +.PP +\fBint getnstr(char * \fIstr\fP, int \fIn\fP); +\fBint wgetnstr(WINDOW * \fIwin\fP, char * \fIstr\fP, int \fIn\fP); +\fBint mvgetnstr(int \fIy\fP, int \fIx\fP, char * \fIstr\fP, int \fIn\fP); +\fBint mvwgetnstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, char * \fIstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%wgetstr +populates a user-supplied string buffer +.I str +by repeatedly calling \fBwgetch\fP(3X) +with the +.I win +argument +until a line feed or carriage return character is input. +.\" Of the two, because wgetnstr() calls nl(), only a line feed (\n) +.\" will ever be returned by wgetch(). +The function +.bP +does not copy the terminating character to +.IR str ";" +.bP +always terminates +.I str +with a null character; +.bP +interprets the screen's erase and kill characters +(see \fB\%erasechar\fP(3X) and \fB\%killchar\fP(3X)); +.bP +recognizes function keys only if the screen's keypad option is enabled +(see \fB\%keypad\fP(3X)); +.bP +treats the function keys +.B \%KEY_LEFT +and +.B \%KEY_BACKSPACE +the same as the erase character; +and +.bP +discards function key inputs other than those treated as the erase +character, +calling \fBbeep\fP(3X). +.PP +The erase character replaces the character at the end of the buffer with +a null character, +while the kill character does the same for the entire buffer. +.PP +If the screen's echo option is enabled +(see \fBecho\fP(3X)), +.B \%wgetstr +updates +.I win +with \fB\%wechochar\fP(3X). +Further, +.bP +the erase character +and its function key synonyms +move the cursor to the left, +and +.bP +the kill character returns the cursor to where it was located when +.B \%wgetstr +was called. +.PP +.B \%wgetnstr +is similar, +but reads at most +.I n +characters, +aiding the application to avoid overrunning the buffer to which +.I str +points. +An attempt to input more than +.I n +characters +(other than the terminating line feed or carriage return) +is ignored with a beep. +.PP +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.BR NULL "," +or +.bP +if an internal +.B \%wgetch +call fails. +.PP +Further, +in +.IR \%ncurses "," +these functions return +.B \%KEY_RESIZE +if a +.B \%SIGWINCH +event interrupts the function. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%wgetnstr +may be implemented as macros. +.PP +Use of +.BR \%getstr "," +.BR \%mvgetstr "," +.BR \%mvwgetstr "," +or +.B \%wgetstr +to read input that +overruns the buffer pointed to by +.I str +causes undefined results. +Use their +.BR n -infixed +counterpart functions instead. +.PP +While +.B \%wgetnstr +is conceptually a series of calls to +.BR \%wgetch "," +it also temporarily changes properties of the +.I curses +screen to permit simple editing of the input buffer. +It saves the screen's state and then calls \fBnl\fP(3X) and, +if the screen was in normal (\*(``cooked\*('') mode, +\fB\%cbreak\fP(3X). +Before returning, +it restores the saved screen state. +Other implementations differ in detail, +affecting which control characters they can accept in the buffer; +see section \*(``PORTABILITY\*('' below. +.SH EXTENSIONS +The return value +.B \%KEY_RESIZE +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +X/Open Curses Issue 4 describes these functions. +It specifies no error conditions for them, +but indicates that +.I \%wgetnstr +and its variants read +\*(``the entire multi-byte sequence associated with a character\*('' +and \*(``fail\*('' if +.I n +and +.I str +together do not describe a buffer +\*(``large enough to contain any complete characters\*(''. +In +.IR \%ncurses "," +however, +.I \%wgetch +reads only single-byte characters, +so this scenario does not arise. +.\" You can pass ncurses wgetnstr n=0 and it will beep at you with each +.\" key stroke. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.PP +SVr3 and early SVr4 +.I curses +implementations did not reject function keys; +the SVr4 documentation asserted that, +like the screen's erase and kill characters, +they were +.PP +.RS +interpreted, +as well as any special keys +(such as function keys, +\*(``home\*('' key, +\*(``clear\*('' key, +.IR etc. ) +.\" SVID 4, Volume 3, p. 495 +.RE +.PP +without further detail. +It lied. +In fact, +the \*(``character\*('' value +appended to the string +by those implementations +was predictable but not useful \(em +being, +in fact, +the low-order eight bits of the key code's +.B KEY_ +constant value. +(The same language, +unchanged except for styling, +survived into X/Open Curses Issue 4, \" p. 94 (PDF 114) +but disappeared from Issue 7.) \" p. 105 (PDF 119) +.PP +X/Open Curses Issue 5 (2007) stated that these functions +\*(``read at most +.I n +bytes\*('' +but did not state whether the terminating null character +counted toward that limit. +X/Open Curses Issue 7 (2009) changed that to say they +\*(``read at most +.IR n \-1 +bytes\*('' +to allow for the terminating null character. +As of 2018, +some implementations count it, +some do not. +.bP +.I \%ncurses +6.1 and +.I PDCurses +do not count the null character toward the limit, +while Solaris and NetBSD +.I curses +do. +.bP +Solaris +.I xcurses +offers both behaviors: +its wide-character +.I \%wgetn_wstr +reserves room for a wide null character, +but its non-wide +.I \%wgetnstr +does not consistently count a null character toward the limit. +.PP +In SVr4 +.IR curses "," +a negative +.I n +tells +.I \%wgetnstr +to assume that the caller's buffer +is large enough to hold the result; +that is, +the function then acts like +.IR \%wgetstr "." +X/Open Curses does not mention this behavior +(or anything related to nonpositive +.I n +values), +however most +.I curses +libraries implement it. +Most implementations nevertheless enforce an upper limit +on the count of bytes they write to the destination buffer +.IR str "." +.bP +BSD +.I curses +lacked +.IR \%wgetnstr "," +and its +.I \%wgetstr +wrote to +.I str +unboundedly, +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/src/lib/\ +.\" libcurses/getstr.c +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.4BSD/usr/src/lib/\ +.\" libcurses/getstr.c +as did that in SVr2. +.\" https://github.com/ryanwoodsmall/oldsysv/blob/master/sysvr2-vax/\ +.\" src/lib/libcurses/screen/getstr.c +.bP +.IR PDCurses "," +and +SVr3.1, +SVr4, +and +Solaris +.I curses +limit both functions to writing 256 bytes. +Other System\ V-based platforms likely use the same limit. +.\" https://github.com/ryanwoodsmall/oldsysv/blob/master/\ +.\" sysvr3/31/usr/src/lib/libcurses/screen/wgetstr.c#L10 +.\" sysvr4/svr4/lib/xlibcurses/screen/wgetstr.c#L12 +.bP +Solaris +.I xcurses +limits the write to +.B LINE_MAX +bytes. +.bP +NetBSD 7 +.I curses +imposes no particular limit on the length of the write, +but does validate +.I n +to ensure that it is greater than zero. +A comment in NetBSD's source code asserts that SUSv2 specifies this. +.bP +.I \%ncurses +prior to 6.2 (2020) +imposes no limit on the length of the write, +and treats +.IR wgetnstr 's +.I n +parameter as SVr4 +.I curses +does. +.bP +.I \%ncurses +6.2 uses +.B LINE_MAX +or a larger (system-dependent) value +provided by \fI\%sysconf\fP(3). +If neither +.B LINE_MAX +nor +.I \%sysconf +is available, +.I \%ncurses +uses the POSIX minimum value for +.B LINE_MAX +(2048). \" _POSIX2_LINE_MAX +In either case, +it reserves a byte for the terminating null character. +.PP +Implementations vary in their handling of input control characters. +.bP +While they may enable the screen's echo option, +some do not take it out of raw mode, +and may take cbreak mode into account +when deciding whether to handle echoing within +.I \%wgetnstr +or to rely on it as a side effect of calling +.IR \%wgetch "." +.bP +Originally, +.IR \%ncurses "," +like its progenitor +.IR \%pcurses "," +had its +.I \%wgetnstr +call +.I \%noraw +and +.I \%cbreak +before accepting input. +That may have been done to make function keys work; +it is not necessary with modern +.IR \%ncurses "." +.IP +Since 1995, +.I \%ncurses +has provided handlers for +.B SIGINTR +and +.B SIGQUIT +events, +which are typically generated at the keyboard with +.B \*^C +and +.B \*^\e +respectively. +In cbreak mode, +those handlers catch a signal and stop the program, +whereas other implementations write those characters into the buffer. +.bP +Starting with +.I \%ncurses +6.3 (2021), +.I \%wgetnstr +preserves raw mode if the screen was already in that state, +allowing one to enter the characters the terminal interprets +as interrupt and quit events +into the buffer, +for better compatibility with SVr4 +.IR curses "." +.SH HISTORY +4BSD (1980) +.I curses +introduced +.I \%wgetstr +along with its variants. +.PP +SVr3.1 (1987) +added +.IR \%wgetnstr "," +but none of its variants. +.PP +X/Open Curses Issue 4 (1995) specified +.IR \%getnstr "," +.IR \%mvwgetnstr "," +and +.IR \%mvgetnstr "." +.SH SEE ALSO +\fB\%curs_get_wstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_getch\fP(3X), +\fB\%curs_inopts\fP(3X), \" echo(), keypad() +\fB\%curs_termattrs\fP(3X), \" erasechar(), killchar() diff --git a/contrib/ncurses/man/curs_getyx.3x b/contrib/ncurses/man/curs_getyx.3x new file mode 100644 index 00000000..4d7ec469 --- /dev/null +++ b/contrib/ncurses/man/curs_getyx.3x @@ -0,0 +1,160 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2007,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_getyx.3x,v 1.47 2024/06/08 20:42:50 tom Exp $ +.TH curs_getyx 3X 2024-06-08 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.SH NAME +\fB\%getyx\fP, +\fB\%getparyx\fP, +\fB\%getbegyx\fP, +\fB\%getmaxyx\fP \- +get \fIcurses\fR cursor and window coordinates +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBvoid getyx(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP); +\fBvoid getbegyx(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP); +\fBvoid getmaxyx(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP); +.PP +\fBvoid getparyx(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP); +.fi +.SH DESCRIPTION +These macros obtain the cursor position and bounds information of a +.I curses +window +.IR win "." +.B \%getyx +stores +.IR win "'s" +cursor position in the variables +.I y +and +.IR x "." +.B \%getmaxyx +stores +.IR win "'s" +maximum valid line and column numbers in +.I y +and +.IR x "," +respectively. +.B \%getbegyx +similarly stores the position of +.IR win "'s" +origin relative to that of the screen +(for +.BR stdscr "," +these coordinates are always +.BR 0 ")." +.PP +If +.I win +is a subwindow +(see \fB\%subwin\fP(3X)), +the +.B \%getparyx +macro places the coordinates of its origin relative to its parent window +into +.I y +and +.IR x "," +and +.B \-1 +into both if it is not. +.SH RETURN VALUE +No return values are defined for macros. +Do not use them as the right-hand side of assignment statements. +.SH NOTES +All of these interfaces are implemented as macros. +An \*(``&\*('' operator is not necessary before the variables +.I y +and +.IR x "." +.SH PORTABILITY +These macros are described in X/Open Curses, +Issue 4. +.PP +.I \%ncurses +also provides functions +.BR \%getbegx "," +.BR \%getbegy "," +.BR \%getcurx "," +.BR \%getcury "," +.BR \%getmaxx "," +.BR \%getmaxy "," +.BR \%getparx "," +and +.B \%getpary +for compatibility with older versions of +.IR curses ";" +see \fB\%curs_legacy\fP(3X). +.PP +Although X/Open Curses does not address the issue, +many implementations expose members of the +.I \%WINDOW +structure containing values corresponding to these macros. +Do not rely on their availability; +some implementations make +.I \%WINDOW +opaque +(that is, +they do not allow direct access to its members). +.PP +Besides the problem of opaque structures, +the data stored in like-named members may not have values of the same +meaning different implementations. +For example, +the values of +.B \%WINDOW._maxx +and +.B \%WINDOW._maxy +in +.I \%ncurses +have long +.\" (at least since its initial release, 1.8.1) +differed by one from some other implementations. +The +.B \%getmaxyx +macro hides this difference. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_legacy\fP(3X), +\fB\%curs_opaque\fP(3X) diff --git a/contrib/ncurses/man/curs_in_wch.3x b/contrib/ncurses/man/curs_in_wch.3x new file mode 100644 index 00000000..88bf4074 --- /dev/null +++ b/contrib/ncurses/man/curs_in_wch.3x @@ -0,0 +1,131 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_in_wch.3x,v 1.35 2024/07/27 20:06:49 tom Exp $ +.TH curs_in_wch 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%in_wch\fP, +\fB\%win_wch\fP, +\fB\%mvin_wch\fP, +\fB\%mvwin_wch\fP \- +get a \fIcurses\fR complex character from a window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint in_wch(cchar_t * \fIwch\fP); +\fBint win_wch(WINDOW * \fIwin\fP, cchar_t * \fIwch\fP); +\fBint mvin_wch(int \fIy\fP, int \fIx\fP, cchar_t * \fIwch\fP); +\fBint mvwin_wch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, cchar_t * \fIwch\fP); +.fi +.SH DESCRIPTION +.B \%win_wch +copies the +.I curses +complex character at the cursor position in +.I win +into +.IR wch "." +Use \fB\%getcchar\fP(3X) to extract its character code, +attributes, +and color pair identifier. +\fB\%ncurses\fP(3X) describes the variants of this function. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.I win +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +.BR \%in_wch "," +.BR mvin_wch "," +and +.B mvwin_wch +may be implemented as macros. +.PP +Unlike \fB\%winch\fP(3X), +.B \%win_wch +and its variants store the value of the retrieved character in an +additional +.I wch +parameter instead of the return value. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.SH HISTORY +These functions were initially specified by X/Open Curses, +Issue 4. +The System\ V Interface Definition, +Version 4 (1995), +specified a function named +.I \%winwch +(and the usual variants). +.\" SVID 4, vol 3., p. 514 +This was a later addition to +.RI SVr4. x , +not appearing in the first SVr4 (1989). +It differed from X/Open's later +.I \%win_wch +in that it returned a value of type +.I \%chtype +instead of +.IR \%cchar_t "." +.SH SEE ALSO +\fB\%curs_inch\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_inwstr\fP(3X) diff --git a/contrib/ncurses/man/curs_in_wchstr.3x b/contrib/ncurses/man/curs_in_wchstr.3x new file mode 100644 index 00000000..0b821c94 --- /dev/null +++ b/contrib/ncurses/man/curs_in_wchstr.3x @@ -0,0 +1,133 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_in_wchstr.3x,v 1.41 2024/05/25 20:10:58 tom Exp $ +.TH curs_in_wchstr 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%in_wchstr\fP, +\fB\%in_wchnstr\fP, +\fB\%win_wchstr\fP, +\fB\%win_wchnstr\fP, +\fB\%mvin_wchstr\fP, +\fB\%mvin_wchnstr\fP, +\fB\%mvwin_wchstr\fP, +\fB\%mvwin_wchnstr\fP \- +get a \fIcurses\fR complex character string from a window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint in_wchstr(cchar_t *\fIwchstr\fP); +\fBint win_wchstr(WINDOW *\fIwin\fP, cchar_t *\fIwchstr\fP); +\fBint mvin_wchstr(int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\fP); +\fBint mvwin_wchstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\fP); +.PP +\fBint in_wchnstr(cchar_t *\fIwchstr\fP, int \fIn\fP); +\fBint win_wchnstr(WINDOW *\fIwin\fP, cchar_t *\fIwchstr\fP, int \fIn\fP); +\fBint mvin_wchnstr(int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\fP, int \fIn\fP); +\fBint mvwin_wchnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, cchar_t *\fIwchstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +These functions return an array of complex characters in \fIwchstr\fP, +starting at the current cursor position in the named window. +Attributes (rendition) are stored with the characters. +.PP +The four functions with \fIn\fP as the last argument return +a leading substring at most \fIn\fP characters long +(exclusive of the trailing zeroed \fBcchar_t\fR. +Transfer stops at the end of the current line, or when \fIn\fP characters have +been stored at the location referenced by \fIwchstr\fP. +.PP +Constants defined in \fB\fP can be used with the \fB&\fP (logical +AND) operator to extract the character or the attribute alone from any position +in the \fIwchstr\fP [see \fBgetcchar\fP(3X)]. +.SH RETURN VALUE +Upon successful completion, these functions return +\fBOK\fP. +Otherwise, they return +\fBERR\fP. +.PP +X/Open Curses defines no error conditions. +This implementation returns +.B ERR +.bP +if the \fIwin\fP parameter is null or +.bP +if the \fIwchstr\fP parameter is null. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All routines except \fBwin_wchnstr\fP may be macros. +.PP +Reading a line that overflows the array pointed to by +\fIwchstr\fP +with +\fBin_wchstr\fP, +\fBmvin_wchstr\fP, +\fBmvwin_wchstr\fP +or +\fBwin_wchstr\fP +causes undefined results. +Therefore, the use of +\fBin_wchnstr\fP, +\fBmvin_wchnstr\fP, +\fBmvwin_wchnstr\fP, or +\fBwin_wchnstr\fP +is recommended. +.SH PORTABILITY +X/Open Curses defines no error conditions. +This implementation checks for null pointers, +returning \fBERR\fP in that case. +.SH SEE ALSO +\fB\%curs_inchstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_inwstr\fP(3X), +\fB\%curs_in_wch\fP(3X) diff --git a/contrib/ncurses/man/curs_inch.3x b/contrib/ncurses/man/curs_inch.3x new file mode 100644 index 00000000..a281537d --- /dev/null +++ b/contrib/ncurses/man/curs_inch.3x @@ -0,0 +1,170 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_inch.3x,v 1.62 2024/07/27 19:58:17 tom Exp $ +.TH curs_inch 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%inch\fP, +\fB\%winch\fP, +\fB\%mvinch\fP, +\fB\%mvwinch\fP \- +get a \fIcurses\fR character from a window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBchtype inch(void); +\fBchtype winch(WINDOW * \fIwin\fP); +\fBchtype mvinch(int \fIy\fP, int \fIx\fP); +\fBchtype mvwinch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP); +.fi +.SH DESCRIPTION +.B \%winch +returns the +.I curses +character, +including its attributes and color pair identifier, +at the cursor position in the window +.IR win "." +Subsection \*(``Video Attributes\*('' of \fB\%attron\fP(3X) explains +how to extract these data from a +.IR chtype "." +\fB\%ncurses\fP(3X) describes the variants of this function. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +return +.B ERR +if +.I win +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +.BR \%inch , +.BR \%mvinch , +and +.B \%mvwinch +may be implemented as macros. +.PP +These functions do not fail if the window contains cells of +.I curses +complex characters; +that is, +if they contain characters with codes wider than eight bits +(or greater than 255 as an unsigned decimal integer). +They instead extract only the low-order eight bits of the character code +from the cell. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.SH HISTORY +The original +.I curses +in 4BSD (1980) defined +.I \%winch +as a macro accessing the +.I \%WINDOW +structure member representing character cell data, +at that time a +.IR char "," +containing only a 7-bit ASCII character code +and a \*(``standout\*(`` attribute bit, +the only one the library supported. +.PP +SVr2 +.I curses +(1984) +extended this approach, +widening the character code to eight bits +and permitting several attributes to be combined with it +by storing them together in a +.IR \%chtype "," +an alias of +.IR "unsigned short" "." +.\" ...indirectly through a preprocessor macro named CHTYPE, encouraging +.\" builders to change the typedef to `char` or `long` as desired. More +.\" innocent times with respect to ABI compatibility concerns... --GBR +Because a macro was used, +its value was not type-checked +as a function return value could have been. +Goodheart documented SVr3 (1987) +.I \%winch +as returning an +.IR int "." +.\" ...but the implementation remained unchanged. +SVr3.1's (1987) +.I \%chtype +became an alias of +.IR "unsigned long" "," +using 16 bits for the character code and +widening the type in practical terms to 32 bits, +as 64-bit Unix systems were not yet in wide use, +and fixed-width integral types would not be standard until ISO C99. +.\" Cray's UNICOS was 1985 (how many shops had Crays?). DEC OSF/1 for +.\" the Alpha arrived in 1993. --GBR +SVr3.2 (1988) +added a 6-bit color pair identifier alongside the attributes. +.SH SEE ALSO +\fB\%curs_in_wch\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_instr\fP(3X) diff --git a/contrib/ncurses/man/curs_inchstr.3x b/contrib/ncurses/man/curs_inchstr.3x new file mode 100644 index 00000000..a9903e88 --- /dev/null +++ b/contrib/ncurses/man/curs_inchstr.3x @@ -0,0 +1,136 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_inchstr.3x,v 1.47 2024/05/25 20:10:58 tom Exp $ +.TH curs_inchstr 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%inchstr\fP, +\fB\%inchnstr\fP, +\fB\%winchstr\fP, +\fB\%winchnstr\fP, +\fB\%mvinchstr\fP, +\fB\%mvinchnstr\fP, +\fB\%mvwinchstr\fP, +\fB\%mvwinchnstr\fP \- +get a \fIcurses\fR character string from a window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint inchstr(chtype *\fIchstr\fP); +\fBint inchnstr(chtype *\fIchstr\fP, int \fIn\fP); +\fBint winchstr(WINDOW *\fIwin\fP, chtype *\fIchstr\fP); +\fBint winchnstr(WINDOW *\fIwin\fP, chtype *\fIchstr\fP, int \fIn\fP); +.PP +\fBint mvinchstr(int \fIy\fP, int \fIx\fP, chtype *\fIchstr\fP); +\fBint mvinchnstr(int \fIy\fP, int \fIx\fP, chtype *\fIchstr\fP, int \fIn\fP); +\fBint mvwinchstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, chtype *\fIchstr\fP); +\fBint mvwinchnstr(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, chtype *\fIchstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +These routines return a NULL-terminated array of \fBchtype\fP quantities, +starting at the current cursor position in the named window and ending at the +right margin of the window. +.PP +The four functions with \fIn\fP as the last argument, return +a leading substring at most \fIn\fP characters long +(exclusive of the trailing (chtype)0). +Transfer stops at the end of the current line, or when \fIn\fP characters have +been stored at the location referenced by \fIchstr\fP. +.PP +Constants defined in \fB\fP can be used with the \fB&\fP (logical +AND) operator to extract the character or the attribute alone from any position +in the \fIchstr\fP [see \fBcurs_inch\fP(3X)]. +.SH RETURN VALUE +All routines return the integer \fBERR\fP upon failure and an integer value +other than \fBERR\fP upon successful completion (the number of characters +retrieved, exclusive of the trailing 0). +.PP +X/Open Curses defines no error conditions. +This implementation returns +.B ERR +.bP +if the \fIwin\fP parameter is null or +.bP +if the \fIchstr\fP parameter is null. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All routines except \fBwinchnstr\fP may be macros. +.PP +SVr4 does not +document whether the result string is zero-terminated; it does not document +whether a length limit argument includes any trailing 0; and it does not +document the meaning of the return value. +.PP +Reading a line that overflows the array pointed to by +\fIchstr\fP +with +\fBinchstr\fP, +\fBmvinchstr\fP, +\fBmvwinchstr\fP +or +\fBwinchstr\fP +causes undefined results. +Therefore, the use of +\fBinchnstr\fP, +\fBmvinchnstr\fP, +\fBmvwinchnstr\fP, or +\fBwinchnstr\fP +is recommended. +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4. +It is no +more specific than the SVr4 documentation on the trailing 0. +It does specify +that the successful return of the functions is \fBOK\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_inch\fP(3X), +\fB\%curs_inwstr\fP(3X), +\fB\%curs_in_wchstr\fP(3X) diff --git a/contrib/ncurses/man/curs_initscr.3x b/contrib/ncurses/man/curs_initscr.3x new file mode 100644 index 00000000..6ac1f2e9 --- /dev/null +++ b/contrib/ncurses/man/curs_initscr.3x @@ -0,0 +1,489 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_initscr.3x,v 1.79 2024/09/21 17:59:36 tom Exp $ +.TH curs_initscr 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%initscr\fP, +\fB\%newterm\fP, +\fB\%endwin\fP, +\fB\%isendwin\fP, +\fB\%set_term\fP, +\fB\%delscreen\fP \- +initialize, manipulate, or tear down \fIcurses\fR terminal interface +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBWINDOW * initscr(void); +\fBint endwin(void); +.PP +\fBbool isendwin(void); +.PP +\fBSCREEN * newterm(const char * \fItype\fP, FILE * \fIoutf\fP, FILE * \fIinf\fP); +\fBSCREEN * set_term(SCREEN * \fInew\fP); +\fBvoid delscreen(SCREEN * \fIsp\fP); +.fi +.SH DESCRIPTION +.SS initscr +.B \%initscr +determines the terminal type and initializes the library's +.IR SCREEN "," +.IR WINDOW "," +and other data structures. +It is normally the first +.I curses +function call a program performs. +However, +an application with unusual needs might employ a few other +.I curses +functions beforehand: +.bP +\fB\%slk_init\fP(3X) to set up soft-label keys; +.bP +\fB\%filter\fP(3X) if the program is designed to operate in a process +pipeline; +.bP +\fB\%ripoffline\fP(3X) to reserve up to five lines at the top and/or +bottom of the screen from management by +.BR \%stdscr "," +the standard +.I curses +window; +and +.bP +\fB\%use_env\fP(3X) and/or \fB\%use_tioctl\fP(3X) to configure use of +the process environment and operating system's terminal driver, +respectively, +when determining the dimensions of the terminal display. +.PP +Further, +a +.I curses +program might call +.B \%newterm +prior to or instead of +.B \%initscr +in two specialized cases described in its subsection below. +.PP +.B \%initscr +causes the first \fB\%refresh\fP(3X) call to clear the screen. +If errors occur, +.B \%initscr +writes an appropriate diagnostic message to the standard error stream +and exits; +otherwise, +it returns a pointer to +.BR stdscr "." +.SS newterm +An application that manages multiple terminals should call +.B \%newterm +once for each such device +.I instead +of +.BR \%initscr "." +.BR \%newterm 's +arguments are +.bP +the +.I type +of the associated terminal, +or +.I NULL +to use the +.I TERM +environment variable; +.bP +an output stream +.I outf +connected to the terminal; +and +.bP +an input stream +.I inf +connected to the terminal. +It returns a variable of structure type +.I SCREEN +.BR * "," +which should be saved for later use with +.B \%set_term +and +.BR \%delscreen "." +.PP +.B \%newterm +passes the file descriptor of the output stream to the +.I \%term\%info +function \fB\%setupterm\fP(3X), +which returns a pointer to a +.I \%TERMINAL +structure that +.B \%newterm +stores in the +.I SCREEN +it returns to the application. +.PP +An application that needs to inspect a terminal type's capabilities, +so that it can continue to run in a line-oriented mode +if the terminal cannot support a screen-oriented program, +would also use +.BR \%newterm "." +If at most one terminal connection is needed, +the programmer could perform such a capability test, +decide which mode in which to operate, +then call +.B \%delscreen +on the pointer returned by +.BR \%newterm "," +and proceed with either +.B \%initscr +or a +.RI non- curses +interface. +.SS endwin +The program must also call +.B \%endwin +for each terminal being used before exiting from +.IR curses "." +If +.B \%newterm +is called more than once for the same terminal, +the first terminal referred to must be the last one for which +.B \%endwin +is called. +.PP +A program should always call +.B \%endwin +before exiting the application +or temporarily suspending +.IR curses "'s" +management of the terminal. +.BR \%endwin ":" +.bP +resets colors to correspond with the default color pair 0, +.bP +moves the cursor to the lower left-hand corner of the screen, +.bP +clears the remainder of the line so that it uses the default colors, +.bP +sets the cursor to normal visibility +(see \fB\%curs_set\fP(3X)), +.bP +if applicable, +stops cursor-addressing mode using the +.B \%exit_ca_mode +.RB \%( rmcup ) +terminal capability, +and +.bP +restores terminal modes (see \fB\%reset_shell_mode\fP(3X)). +.PP +Calling \fB\%refresh\fP(3X) or \fB\%doupdate\fP(3X) after a +temporary escape causes +.I curses +to resume managing the terminal. +.SS isendwin +.B \%isendwin +returns +.B TRUE +if +.B \%endwin +has been called without any subsequent calls to \fB\%wrefresh\fP(3X), +and +.B FALSE +otherwise. +.SS set_term +.B \%set_term +re-orients the +.I curses +library's operations to another terminal +when the application has arranged to manage more than one with +.BR \%newterm "." +.B \%set_term +expects a +.I SCREEN +pointer previously returned by +.B \%newterm +as an argument, +and returns the previous one. +.B \%set_term +is the only +.I curses +API function that manipulates +.I SCREEN +pointers; +all others affect only the current terminal. +.SS delscreen +.B \%delscreen +frees the storage backing the supplied +.I SCREEN +pointer argument. +.B \%endwin +does not, +so that an application can resume managing a terminal with +.I curses +after a +(possibly conditional or temporary) +suspension; +see \fB\%curs_kernel\fP(3X). +Call +.B \%delscreen +after +.B \%endwin +when a particular +.I SCREEN +structure +is no longer needed. +.SH RETURN VALUE +.B \%endwin +returns +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +.bP +.B \%endwin +returns +.B ERR +if +.RS +.bP +the terminal was not initialized, +.bP +.B \%endwin +is called more than once without updating the screen, +or +.bP +\fB\%reset_shell_mode\fP(3X) returns +.BR ERR "." +.RE +.bP +.B \%newterm +returns +.B ERR +if it cannot allocate storage for the +.I SCREEN +data structure +or the top-level windows thereof: +.BR \%curscr "," +.BR \%newscr "," +and +.BR \%stdscr "." +.PP +Functions that return pointers return +.I NULL +on error. +In +.IR \%ncurses "," +.B \%set_term +does not fail. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.SS Differences +X/Open Curses specifies that portable applications must not +call \fB\%initscr\fP more than once: +.bP +The portable way to use \fB\%initscr\fP is once only, +using \fB\%refresh\fP(3X) +to restore the screen after \fB\%endwin\fP. +.bP +This implementation allows using \fB\%initscr\fP after \fB\%endwin\fP. +.PP +Old versions of curses, e.g., BSD 4.4, would return a null pointer +from \fB\%initscr\fP when an error is detected, rather than exiting. +It is safe but redundant to check the return value of \fB\%initscr\fP +in X/Open Curses. +.PP +Calling \fB\%endwin\fP does not dispose of the memory allocated in +\fB\%initscr\fP or \fB\%newterm\fP. +Deleting a \fISCREEN\fP provides a way to do this: +.bP +X/Open Curses does not say what happens to \fI\%WINDOW\fPs when +\fB\%delscreen\fP +\*(``frees storage associated with the \fISCREEN\fP\*('' +nor does the SVr4 documentation help, +adding that it should be called after \fB\%endwin\fP if a \fISCREEN\fP +is no longer needed. +.bP +However, \fI\%WINDOW\fPs are implicitly associated with a \fISCREEN\fP. +so that it is reasonable to expect \fB\%delscreen\fP to deal with these. +.bP +SVr4 curses deletes the standard \fI\%WINDOW\fP structures +\fB\%stdscr\fP and \fB\%curscr\fP as well as a work area \fB\%newscr\fP. +SVr4 curses ignores other windows. +.bP +Since version 4.0 (1996), +\fI\%ncurses\fP has maintained a list of all windows for each screen, +using that information to delete those windows when \fB\%delscreen\fP is +called. +.bP +NetBSD copied this feature of \fI\%ncurses\fP in 2001. +PDCurses follows the SVr4 model, +deleting only the standard \fI\%WINDOW\fP structures. +.SS "High-level versus Low-level" +Different implementations may disagree regarding the level of some functions. +For example, \fISCREEN\fP (returned by \fB\%newterm\fP) and +\fI\%TERMINAL\fP (returned by \fB\%setupterm\fP(3X)) hold file +descriptors for the output stream. +If an application switches screens using \fB\%set_term\fR, +or switches terminals using \fB\%set_curterm\fP(3X), +applications which use the output file descriptor can have different +behavior depending on which structure holds the corresponding descriptor. +.bP +NetBSD's +.I \%baudrate +function uses the descriptor in +.IR \%TERMINAL "." +.I \%ncurses +and SVr4 +.I curses +use the descriptor in +.IR SCREEN "." +.bP +NetBSD and \fI\%ncurses\fP use the descriptor +in \fI\%TERMINAL\fP +for terminal I/O modes, +e.g., +\fB\%def_shell_mode\fP(3X), +\fB\%def_prog_mode\fP(3X). +SVr4 curses uses the descriptor in \fISCREEN\fP. +.SS "Unset \f(BITERM\fP Variable" +If the \fITERM\fP variable is missing or empty, \fB\%initscr\fP uses the +value \*(``unknown\*('', +which normally corresponds to a terminal entry with the +.B \%generic +.RB ( gn ) +capability. +Generic entries are detected by \fB\%setupterm\fP(3X) +and cannot be used for full-screen operation. +Other implementations may handle +a missing/empty \fITERM\fP variable differently. +.SS "Signal Handlers" +Quoting from X/Open Curses Issue 7, section 3.1.1: +.RS 5 +.PP +Curses implementations may provide for special handling of the +\%SIGINT, +\%SIGQUIT, +and \%SIGTSTP signals if their disposition is \%SIG_DFL at the time +.I \%initscr +is called.\|.\|. +.PP +Any special handling for these signals may remain in effect for the +life of the process or until the process changes the disposition of +the signal. +.PP +None of the Curses functions are required to be safe +with respect to signals.\|.\|. +.RE +.PP +This implementation establishes signal handlers during initialization, +e.g., \fB\%initscr\fP or \fB\%newterm\fP. +Applications which must handle these signals should set up the corresponding +handlers \fIafter\fP initializing the library: +.TP 5 +.B SIGINT +The handler \fIattempts\fP to clean up the screen on exit. +Although it \fIusually\fP works as expected, there are limitations: +.RS 5 +.bP +Walking the \fISCREEN\fP list is unsafe, since all list management +is done without any signal blocking. +.bP +On systems which have \fB\%REENTRANT\fP turned on, \fB\%set_term\fP uses +functions which could deadlock or misbehave in other ways. +.bP +\fB\%endwin\fP calls other functions, +many of which use \fI\%stdio\fP(3) or other library functions which are +clearly unsafe. +.RE +.TP 5 +.B SIGTERM +This uses the same handler as \fB\%SIGINT\fP, with the same limitations. +It is not mentioned in X/Open Curses, but is more suitable for this +purpose than \fB\%SIGQUIT\fP (which is used in debugging). +.TP 5 +.B SIGTSTP +This handles the \fIstop\fP signal, used in job control. +When resuming the process, this implementation discards pending +input with \fB\%flushinp\fP(3X), and repaints the screen +assuming that it has been completely altered. +It also updates the saved terminal modes with +\fB\%def_shell_mode\fP(3X). +.TP 5 +.B SIGWINCH +This handles the window-size changes which were ignored in +the standardization efforts. +The handler sets a (signal-safe) variable +that is later tested by \fB\%wgetch\fP(3X) and \fB\%wget_wch\fP(3X). +.RS +.bP +.B \%wgetch +returns the key code +.BR \%KEY_RESIZE "." +.bP +.B \%wget_wch +returns +.B \%KEY_CODE_YES +and sets its +.I wch +parameter to +.BR \%KEY_RESIZE "." +.RE +.IP +At the same time, \fI\%ncurses\fP calls \fB\%resizeterm\fP to adjust the +standard screen \fB\%stdscr\fP, +and update other data such as \fBLINES\fP and \fBCOLS\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_kernel\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_slk\fP(3X), +\fB\%curs_terminfo\fP(3X), +\fB\%curs_util\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_inopts.3x b/contrib/ncurses/man/curs_inopts.3x new file mode 100644 index 00000000..5ee8e95d --- /dev/null +++ b/contrib/ncurses/man/curs_inopts.3x @@ -0,0 +1,815 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_inopts.3x,v 1.79 2024/09/21 18:05:49 tom Exp $ +.TH curs_inopts 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%cbreak\fP, +\fB\%echo\fP, +\fB\%halfdelay\fP, +\fB\%intrflush\fP, +\fB\%is_cbreak\fP, +\fB\%is_echo\fP, +\fB\%is_nl\fP, +\fB\%is_raw\fP, +\fB\%keypad\fP, +\fB\%meta\fP, +\fB\%nl\fP, +\fB\%nocbreak\fP, +\fB\%nodelay\fP, +\fB\%noecho\fP, +\fB\%nonl\fP, +\fB\%noqiflush\fP, +\fB\%noraw\fP, +\fB\%notimeout\fP, +\fB\%qiflush\fP, +\fB\%raw\fP, +\fB\%timeout\fP, +\fB\%wtimeout\fP, +\fB\%typeahead\fP \- +get and set \fIcurses\fR terminal input options +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint cbreak(void); +\fBint nocbreak(void); +.PP +\fBint echo(void); +\fBint noecho(void); +.PP +\fBint intrflush(WINDOW * \fIwin\fP \fI/* ignored */\fP, bool \fIbf\fP); +\fBint keypad(WINDOW * \fIwin\fP, bool \fIbf\fP); +\fBint meta(WINDOW * \fIwin\fP \fI/* ignored */\fP, bool \fIbf\fP); +\fBint nodelay(WINDOW * \fIwin\fP, bool \fIbf\fP); +\fBint notimeout(WINDOW * \fIwin\fP, bool \fIbf\fP); +.PP +\fBint nl(void); +\fBint nonl(void); +.PP +\fBvoid qiflush(void); +\fBvoid noqiflush(void); +.PP +\fBint raw(void); +\fBint noraw(void); +.PP +\fBint halfdelay(int \fItenths\fP); +\fBvoid timeout(int \fIdelay\fP); +\fBvoid wtimeout(WINDOW * \fIwin\fP, int \fIdelay\fP); +.PP +\fBint typeahead(int \fIfd\fP); +.PP +\fI/* extensions */ +\fBint is_cbreak(void); +\fBint is_echo(void); +\fBint is_nl(void); +\fBint is_raw(void); +.fi +.SH DESCRIPTION +.I curses +offers configurable parameters permitting an application to control the +handling of input from the terminal. +Some are global, +applying to all windows; +others apply only to a specific window. +The library does not automatically apply such parameters to new or +derived windows; +an application must configure each window for the desired behavior. +.PP +Some descriptions below make reference to an +.IR "input character reading function" ":" +this is \fB\%wgetch\fP(3X) in the non-wide character +.I curses +API and \fB\%wget_wch\fP(3X) in the wide character API. +In addition to the variant forms of these described in +\fB\%ncurses\fP(3X), +the +.I curses +functions \fB\%wgetstr\fP(3X) and \fB\%wget_wstr\fP(3X) and their own +variants call the appropriate input character reading function. +.\" +.SS "cbreak, nocbreak" +Normally, +the terminal driver buffers typed characters, +not delivering them to an application +until a line feed or carriage return is typed. +.B \%cbreak +configures the terminal in +.IR "cbreak mode" "," +which disables line buffering +and erase and kill character processing +(the interrupt, +quit, +suspend, +and flow control characters are unaffected) +and makes characters typed by the user immediately available to the +program. +.B \%nocbreak +restores the terminal's normal (\*(``cooked\*('') line discipline. +.PP +The state of the terminal is unknown to a +.I curses +application when it starts; +therefore, +a program should call +.B \%cbreak +or +.B \%nocbreak +explicitly. +Most interactive programs using +.I curses +set \%cbreak +mode. +Calling +.B \%cbreak +overrides +.BR raw "." +The man page for the input character reading function +discusses how +.B \%cbreak +and +.B \%nocbreak +interact with +.B echo +and +.BR \%noecho "." +.\" +.SS "echo, noecho" +.B echo +and +.B \%noecho +determine whether characters typed by the user are written to the +.I curses +window by the input character reading function as they are typed. +.I curses +always disables the terminal driver's own echoing. +By default, +a +.I curses +screen's echo option is set. +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 call +.BR \%noecho "." +The man page for the input character reading function +discusses how +.B echo +and +.B \%noecho +interact with +.B \%cbreak +and +.BR \%nocbreak "." +.\" +.SS halfdelay +.B \%halfdelay +configures +.IR "half-delay mode" "," +which is similar to \%cbreak mode in that characters typed by the user +are immediately available to the program. +However, +after blocking for +.I tenths +tenths of seconds, +an input character reading function returns +.B ERR +if no input is pending. +The value of +.I tenths +must be between 1 and 255. +Use +.B \%nocbreak +to leave half-delay mode. +.\" +.SS intrflush +.B \%intrflush +calls +.B \%qiflush +(see below) +if +.I bf +is +.BR TRUE "," +and +.B \%noqiflush +if +.I bf +is +.BR FALSE "." +It ignores its +.I win +argument. +.\" +.SS keypad +.B keypad +enables recognition of a terminal's function keys. +If +enabled +.RI ( bf +is +.BR TRUE ), +the input character reading function returns a value representing +the function key, +such as +.BR KEY_LEFT "." +(Wide-character API users: +\fB\%wget_wch\fP(3X) returns +.B \%KEY_CODE_YES +to indicate the availability of a function key code in its +.I wch +parameter.) +If disabled +.RI ( bf +is +.BR FALSE ), +.I curses +does not treat function keys specially and the program has to interpret +escape sequences itself. +If the terminal's keypad can be turned on +(made to transmit) +and off +(made to work locally), +.B \%keypad +configures it consistently with the +.I bf +parameter. +By default, +a window's keypad mode is off. +.\" +.SS meta +Initially, +whether the terminal returns 7- or 8-bit character codes on input +depends on the configuration of the terminal driver; +on POSIX systems, +see \fI\%termios\fP(3). +To force 8 bits to be returned, +call +.BR meta( .\|.\|. , +.BR TRUE) ; +this is equivalent, +on POSIX systems, +to setting the CS8 flag on the terminal. +To force 7 bits to be returned, +call +.BR meta( .\|.\|. , +.BR FALSE) ; +this is equivalent, +on POSIX systems, +to setting the CS7 flag on the terminal. +The window argument, +.IR win , +is always ignored. +If the +.I \%term\%info +string capabilities +.B \%meta_on +.RB ( smm ) +and +.B \%meta_off +.RB ( rmm ) +are defined for the terminal type, +enabling meta mode sends +.B smm +to the terminal and disabling it sends +.B rmm +to the terminal. +.\" +.SS "nl, nonl" +Initially, +whether the terminal reports a carriage return +using the character code for a line feed +in cbreak or raw modes +depends on the configuration of the terminal driver; +see \fI\%termios\fP(3). +.B nl +configures the terminal to perform this translation. +.B nonl +disables it. +Under its normal (\*(``cooked\*('') line discipline, +the terminal driver always translates carriage returns to line feeds. +.\" +.SS nodelay +.B \%nodelay +configures the input character reading function to be non-blocking for +window +.IR "win" . +If no input is ready, +the reading function returns +.BR ERR "." +If disabled +.RI ( bf +is +.BR FALSE ), +the reading function does not return until it has input. +.SS notimeout +When the input character reading function reads an ESC character, +it sets a timer while waiting for the next character. +.BI \%notimeout( win , +.B TRUE) +disables this timer. +The purpose of the timeout is to distinguish sequences produced by a +function key from those typed by a user. +To configure the timeout rather than disabling it, +see +.B \%wtimeout +below. +.\" +.SS "qiflush, noqiflush" +.\" +.B \%qiflush +and +.B \%noqiflush +configure the terminal driver's treatment of its input and output queues +when it handles the interrupt, +suspend, +or quit characters under the normal (\*(``cooked\*('') +or cbreak line disciplines on POSIX systems; +see \fI\%termios\fP(3). +The default behavior is inherited from the terminal driver settings. +Calling +.B \%qiflush +configures the terminal to flush the queues when any of these events +occurs, +giving the impression of faster response to user input, +but making the library's model of the screen contents incorrect. +Calling +.B \%noqiflush +prevents such flushing, +but might frustrate impatient users on slow connections if a +.I curses +update of the screen is in progress when the event occurs; +see +.B \%typeahead +below for a mitigation of this problem. +You may want to call +.B \%noqiflush +in a signal handler +if you want output to continue +after the handler exits +as though the interrupt had not occurred. +.\" +.SS "raw, noraw" +.B raw +configures the terminal to read input in +.IR "raw mode" , +which is similar to cbreak mode +(see +.B \%cbreak +above) +except that it furthermore passes through the terminal's configured +interrupt, +quit, +suspend, +and flow control characters +uninterpreted to the application, +instead of generating a signal or acting on I/O flow. +The behavior of the terminal's \*(``Break\*('' key +(if any) +depends on terminal driver configuration parameters that +.I curses +does not handle. +.B \%noraw +restores the terminal's normal (\*(``cooked\*('') line discipline. +.\" +.SS "timeout, wtimeout" +.B \%wtimeout +configures whether a +.I curses +input character reading function called on window +.I win +uses blocking or non-blocking reads. +If +.I delay +is negative, +a blocking read is used, +waiting indefinitely for input. +If +.I delay +is zero, +a non-blocking read is used; +an input character reading function returns +.B ERR +if no input is pending. +If +.I delay +is positive, +an input character reading function +blocks for +.I delay +milliseconds, +and returns +.B ERR +if the delay elapses and there is still no input pending. +.B \%timeout +calls +.B \%wtimeout +on +.BR stdscr "." +.\" +.SS typeahead +Normally, +a +.I curses +library checks the terminal for input while updating the screen. +If any is found, +the update is postponed until the next \fB\%wrefresh\fP(3X) or +\fB\%doupdate\fP(3X) call, +allowing faster response to user key strokes. +The library tests the file descriptor corresponding to the +.I FILE +stream pointer passed to \fB\%newterm\fP(3X) +(or +.I stdin +if \fB\%initscr\fP(3X) was called), +for pending input. +.B \%typeahead +instructs +.I curses +to test file descriptor +.I fd +instead. +An +.I fd +of +.B \-1 +disables the check. +.\" +.SH RETURN VALUE +.B \%timeout +and +.B \%wtimeout +return no value. +.PP +.BR \%cbreak "," +.BR \%nocbreak "," +.BR \%echo "," +.BR \%noecho "," +.BR \%halfdelay "," +.BR \%intrflush "," +.BR \%keypad "," +.BR \%meta "," +.BR \%nodelay "," +.BR \%notimeout "," +.BR \%nl "," +.BR \%nonl "," +.BR \%raw "," +.BR \%noraw "," +and +.B \%typeahead +return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +the functions in the previous paragraph return +.B ERR +if +.bP +the terminal is not initialized or +.bP +.I win +is +.B NULL +(except for +.B \%intrflush +and +.BR meta "," +which ignore its value). +.PP +Further, +.B \%halfdelay +returns +.B ERR +if +.I delay +is outside the range 1..255. +.PP +See section \*(``EXTENSIONS\*('' below for the +return values of +.BR is_cbreak "," +.BR is_echo "," +.BR is_nl "," +and +.BR is_raw "." +.SH NOTES +.BR echo "," +.BR \%noecho "," +.BR \%halfdelay "," +.BR \%intrflush "," +.BR meta "," +.BR nl "," +.BR nonl "," +.BR \%nodelay "," +.BR \%notimeout "," +.BR \%noqiflush "," +.BR \%qiflush "," +.BR \%timeout "," +and +.B \%wtimeout +may be implemented as macros. +.PP +.B \%noraw +and +.B \%nocbreak +follow historical practice in that they attempt to restore +the terminal's normal (\*(``cooked\*('') line discipline +from raw and cbreak, +respectively. +Mixing +.BR \%raw / noraw +calls with +.BR \%cbreak / nocbreak +calls leads to terminal driver control states that are hard to predict +or understand; +doing so is not recommended. +.SH EXTENSIONS +.I \%ncurses +provides four \*(``is_\*('' functions corresponding to +.BR \%cbreak "," +.BR echo "," +.BR nl "," +and +.BR raw "," +permitting their states to be queried by the application. +.PP +.TS +center; +Lb Lb Lb +L L L . +Query Set Reset +_ +is_cbreak cbreak nocbreak +is_echo echo noecho +is_nl nl nonl +is_raw raw noraw +.TE +.PP +In each case, +the function returns +.TP 5 \" "-1" + 2n tag separation + 1n fudge for typesetters like grops +.B 1 +if the option is set, +.TP +.B 0 +if the option is reset, +or +.TP +.B \-1 +if the library is not initialized. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +Except as noted in section \*(``EXTENSIONS\*('' above, +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.PP +.I \%ncurses +follows X/Open Curses +and the historical practice of System\ V +.IR curses "," +clearing the terminal driver's \*(``echo\*('' flag when initializing the +screen. +BSD +.I curses +did not, +but its +.I raw +function turned it off as a side effect. +.\" SGTTY's sg_flags had a "RAW" symbol; termio in SVr1 for the PDP-11 +.\" did not. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/include/curses.h +.\" https://github.com/ryanwoodsmall/oldsysv/blob/master/sysv-pdp11_man/a_man/man7/termio.7 +For best portability, +call +.B echo +or +.B \%noecho +explicitly just after initialization, +even if your program retains the terminal's normal (\*(``cooked\*('') +line discipline. +.PP +X/Open Curses is ambiguous regarding whether +.I raw +should disable the carriage return and line feed translation feature +controlled by +.I nl +and +.IR \%nonl "." +BSD +.I curses +did turn off these translations; +System\ V +.I curses +did not. +.I \%ncurses +does so, +on the assumption that a programmer requesting raw input wants a clean +(ideally, +8-bit clean) +connection that the operating system will not alter. +.PP +When +.B \%keypad +is first enabled, +.I \%ncurses +loads the key definitions for the current terminal description. +If the terminal description includes extended string capabilities, +for example, +by using the +.B \-x +option of \fB\%@TIC@\fP(1), +then +.I \%ncurses +also defines keys for the capabilities whose names begin with +\*(``k\*(''. +Corresponding key codes are generated and +(depending on previous loads of terminal descriptions) +may differ from one execution of a program to the next. +The generated key codes are recognized by \fB\%keyname\fP(3X), +which then returns a name beginning with \*(``k\*('' denoting the +.I \%term\%info +capability name rather than \*(``K\*('', +used for +.I curses +key names. +On the other hand, +an application can use \fB\%define_key\fP(3X) to bind +a specific key to a string of the programmer's choice. +This feature enables an application to check for its presence +with \fB\%tigetstr\fP(3X), +and reassign the key code to match its own needs. +.PP +Low-level applications can use \fB\%tigetstr\fP(3X) to obtain the +definition of any string capability. +.I curses +applications use the input character reading function +to obtain key codes from input +and rely upon the order in which the string capabilities are loaded. +Multiple key capability strings can have the same value, +but the input character reading function can report only one key code. +Most +.I curses +implementations +(including +.IR \%ncurses ) +load key definitions in the order +they appear in the +.B \%strfnames +array of string capability names; +see \fB\%term_variables\fP(3X). +.\" ncurses/tinfo/parse_entry.c:lookup_fullname, I think --GBR +The last capability read using a particular definition determines the +key code to be reported. +In +.IR \%ncurses , +extended capabilities can be interpreted as key definitions. +These are loaded after the predefined keys, +and if a capability's value is the same as a previously loaded +key definition, +the later definition is the one used. +.SH HISTORY +4BSD +.I curses +(1980) +introduced +.IR echo "," +.IR \%noecho "," +.IR nl "," +.IR \%nonl "," +.IR raw "," +and +.IR \%noraw "." \" also crmod and nocrmod, never standardized +.PP +SVr2 (1984) featured a new terminal driver, +extending the +.I curses +API to support it with +.IR \%cbreak "," +.IR \%nocbreak "," +.IR \%intrflush "," +.IR \%keypad "," +.IR \%meta "," +.IR \%nodelay "," +and +.IR \%typeahead "." +.PP +SVr3 (1987) +added +.IR \%halfdelay "," +.IR \%notimeout "," +and +.IR \%wtimeout "." +.I \%qiflush +and +.I \%noqiflush +appeared in SVr3.1 (1987), +at which point +.I \%intrflush +became a wrapper for either of these functions, +depending on the value of its Boolean argument. +SVr3.1 also added +.IR \%timeout "." +.PP +.I \%ncurses +6.5 (2024) introduced +.IR is_cbreak "," +.IR is_echo "," +.IR is_nl "," +and +.IR is_raw "." +.PP +Formerly, +.I \%ncurses +used +.I \%nl +and +.I \%nonl +to control the conversion of newlines to carriage return/line feed +on output as well as input. +X/Open Curses documents the use of these functions only for input. +This difference arose from converting the +.I \%pcurses +source (1986), +which used +\fI\%ioctl\fP(2) calls and the +.I \%sgttyb +structure, +to +.I \%termios +(the POSIX terminal API). +In the former, +both input and output were controlled via a single option +\*(``CRMOD\*('', +while the latter separates these features. +Because that conversion interferes with output optimization, +.I \%ncurses +6.2 (2020) amended +.I \%nl +and +.I \%nonl +to eliminate their effect on output. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_getch\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_util\fP(3X), +\fB\%define_key\fP(3X), +\fB\%termios\fP(3), +\fB\%term_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_ins_wch.3x b/contrib/ncurses/man/curs_ins_wch.3x new file mode 100644 index 00000000..5573a769 --- /dev/null +++ b/contrib/ncurses/man/curs_ins_wch.3x @@ -0,0 +1,126 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_ins_wch.3x,v 1.34 2024/07/27 20:05:18 tom Exp $ +.TH curs_ins_wch 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%ins_wch\fP, +\fB\%wins_wch\fP, +\fB\%mvins_wch\fP, +\fB\%mvwins_wch\fP \- +insert a \fIcurses\fR complex character in a window +.SH SYNOPSIS +.nf +\fB#include \fP +.PP +\fBint ins_wch(const cchar_t * \fIwch\fP); +\fBint wins_wch(WINDOW * \fIwin\fP, const cchar_t * \fIwch\fP); +\fBint mvins_wch(int \fIy\fP, int \fIx\fP, const cchar_t * \fIwch\fP); +\fBint mvwins_wch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const cchar_t * \fIwch\fP); +.fi +.SH DESCRIPTION +These functions insert the +.I curses +complex character +.I wch +at the cursor in the specified window +.I win +(or +.BR \%stdscr ). +The character previously at the cursor and any to its right move one +cell to the right; +the rightmost character on the line is discarded. +The cursor does not advance. +.SH "RETURN VALUE" +These functions return \fBOK\fP on success and \fBERR\fP on failure. +.PP +Functions taking a +.I \%WINDOW +pointer argument fail if the pointer is +.BR NULL . +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +\fB\%ins_wch\fP, +\fB\%mvins_wch\fP, +and +\fB\%mvwins_wch\fP +may be implemented as macros. +.PP +A terminal's +.B \%insert_character +.RB ( ich1 ) +capability +is not necessarily employed. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +.PP +SVr4 describes successful return values only as +\*(``an integer value other than \fBERR\fP\*(''. +.SH HISTORY +These functions were initially specified by X/Open Curses, +Issue 4. +The System\ V Interface Definition, +Version 4 (1995), +specified a function named +.I \%winswch +(and the usual variants). +.\" SVID 4, vol 3., p. 512 +This was a later addition to +.RI SVr4. x , +not appearing in the first SVr4 (1989). +It differed from X/Open's later +.I \%wins_wch +in that it took an argument of type +.I \%chtype +instead of +.IR \%cchar_t "." +.SH "SEE ALSO" +\fB\%curs_insch\fP(3X) describes comparable functions in the +non-wide-character +.I curses +configuration. +.PP +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_ins_wstr.3x b/contrib/ncurses/man/curs_ins_wstr.3x new file mode 100644 index 00000000..a2d49d1a --- /dev/null +++ b/contrib/ncurses/man/curs_ins_wstr.3x @@ -0,0 +1,199 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_ins_wstr.3x,v 1.46 2024/09/14 20:06:50 tom Exp $ +.TH curs_ins_wstr 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%ins_wstr\fP, +\fB\%wins_wstr\fP, +\fB\%mvins_wstr\fP, +\fB\%mvwins_wstr\fP, +\fB\%ins_nwstr\fP, +\fB\%wins_nwstr\fP, +\fB\%mvins_nwstr\fP, +\fB\%mvwins_nwstr\fP \- +insert a wide-character string in a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint ins_wstr(const wchar_t * \fIwstr\fP); +\fBint wins_wstr(WINDOW * \fIwin\fP, const wchar_t * \fIwstr\fP); +\fBint mvins_wstr(int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP); +\fBint mvwins_wstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP); +.PP +\fBint ins_nwstr(const wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint wins_nwstr(WINDOW * \fIwin\fP, const wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint mvins_nwstr(int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint mvwins_nwstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const wchar_t * \fIwstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%wins_wstr +inserts a wide-character string +.I wstr +before the character at the cursor in window +.I win +as if by calling \fBwins_wch\fP(3X) for each +.I \%wchar_t +in +.IR wstr "." +No line wrapping is performed. +Characters to the right of the cursor are shifted right; +those at the right edge of the window may be lost. +.B \%wins_wstr +stops inserting if it would have to wrap to the next line to write the +next +.I \%wchar_t +in +.IR wstr "." +The cursor position does not change +(after moving to +.RI ( y "," +.IR x ")," +if specified). +.B \%wins_nwstr +does the same, +but inserts at most +.I n +characters, +or as many as possible +(up to the end of the line) +if +.I n +is +.BR \-1 "." +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.BR NULL "," +.bP +.I wstr +is +.BR NULL "," +.bP +the first wide character in +.I wstr +is a non-spacing character, +or +.bP +an internal \fB\%wins_wch\fP(3X) call returns +.BR ERR "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%wins_nwstr +may be implemented as macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +X/Open Curses does not specify what happens +if a non-spacing character follows a control character. +.PP +Issue 4 states that the entire string is inserted if +.I n +is less than 1. +This is probably an error, +.\" ...copied from SVID 4, which made the same error; see p. 513. +because it is inconsistent with other functions +such as \fB\%waddwstr\fP(3X), +and differs from the SVr4 +.I curses +and Solaris +.I xcurses +implementations. +Nevertheless, +Issue 7 retains the language. +.SH HISTORY +These functions were initially specified by X/Open Curses, +Issue 4. +The System\ V Interface Definition, +Version 4 (1995), +specified functions named +.I \%winswstr +and +.I \%winsnwstr +(and the usual variants). +.\" SVID 4, vol 3., p. 513 +.\" The prototypes also identify the data type as `wchar`, not +.\" `wchar_t`, but this may be an error since the "DESCRIPTION" section +.\" consistently uses the latter. --GBR +These were later additions to +.RI SVr4. x , +not appearing in the first SVr4 (1989). +They differ from X/Open's later +.I \%wins_wstr +and +.I \%wins_nwstr +in that their +.I wstr +parameters are not +.IR const "-qualified." +.SH SEE ALSO +\fB\%curs_insstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_ins_wch\fP(3X), +\fB\%curs_in_wch\fP(3X) diff --git a/contrib/ncurses/man/curs_insch.3x b/contrib/ncurses/man/curs_insch.3x new file mode 100644 index 00000000..d88a64a9 --- /dev/null +++ b/contrib/ncurses/man/curs_insch.3x @@ -0,0 +1,118 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_insch.3x,v 1.42 2024/07/27 20:08:25 tom Exp $ +.TH curs_insch 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%insch\fP, +\fB\%winsch\fP, +\fB\%mvinsch\fP, +\fB\%mvwinsch\fP \- +insert a \fIcurses\fP character in a window +.SH SYNOPSIS +.nf +\fB#include \fP +.PP +\fBint insch(chtype \fIch\fP); +\fBint winsch(WINDOW * \fIwin\fP, chtype \fIch\fP); +\fBint mvinsch(int \fIy\fP, int \fIx\fP, chtype \fIch\fP); +\fBint mvwinsch(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, chtype \fIch\fP); +.fi +.SH DESCRIPTION +These functions insert the +.I curses +character +.I ch +at the cursor in the specified window +.I win +(or +.BR \%stdscr ). +The character previously at the cursor and any to its right move one +cell to the right; +the rightmost character on the line is discarded. +The cursor does not advance. +.SH "RETURN VALUE" +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +Functions taking a +.I \%WINDOW +pointer argument fail if the pointer is +.BR NULL . +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +.BR \%insch , +.BR \%mvinsch , +and +.B \%mvwinsch +may be implemented as macros. +.PP +A terminal's +.B \%insert_character +.RB ( ich1 ) +capability +is not necessarily employed. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.SH HISTORY +SVr2 (1984) introduced +.IR \%winsch "." +.SH "SEE ALSO" +\fB\%curs_ins_wch\fP(3X) describes comparable functions in the +wide-character +.I curses +configuration. +.PP +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_insstr.3x b/contrib/ncurses/man/curs_insstr.3x new file mode 100644 index 00000000..30c4da20 --- /dev/null +++ b/contrib/ncurses/man/curs_insstr.3x @@ -0,0 +1,188 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_insstr.3x,v 1.57 2024/07/27 20:07:59 tom Exp $ +.TH curs_insstr 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%insstr\fP, +\fB\%winsstr\fP, +\fB\%mvinsstr\fP, +\fB\%mvinsnstr\fP, +\fB\%insnstr\fP, +\fB\%winsnstr\fP, +\fB\%mvwinsstr\fP, +\fB\%mvwinsnstr\fP \- +insert a string in a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint insstr(const char * \fIstr\fP); +\fBint winsstr(WINDOW * \fIwin\fP, const char * \fIstr\fP); +\fBint mvinsstr(int \fIy\fP, int \fIx\fP, const char * \fIstr\fP); +\fBint mvwinsstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const char * \fIstr\fP); +.PP +\fBint insnstr(const char * \fIstr\fP, int \fIn\fP); +\fBint winsnstr(WINDOW * \fIwin\fP, const char * \fIstr\fP, int \fIn\fP); +\fBint mvinsnstr(int \fIy\fP, int \fIx\fP, const char * \fIstr\fP, int \fIn\fP); +\fBint mvwinsnstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, const char * \fIstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%winsstr +inserts a string +.I str +before the character at the cursor in window +.I win +as if by calling \fBwinsch\fP(3X) for each +.I char +in +.IR str "." +No line wrapping is performed. +Characters to the right of the cursor are shifted right; +those at the right edge of the window may be lost. +.B \%winsstr +stops inserting if it would have to wrap to the next line to write the +next +.I \%char +in +.IR str "." +The cursor position does not change +(after moving to +.RI ( y "," +.IR x ")," +if specified). +.B \%insnstr +does the same, +but inserts at most +.I n +characters, +or as many as possible +(up to the end of the line) +if +.I n +is +.BR \-1 "." +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.BR NULL "," +.bP +.I str +is +.BR NULL "," +or +.bP +an internal \fBwinsch\fP(3X) call returns +.BR ERR "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%winsnstr +may be implemented as macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +Issue 4 distinguished +.B \%insnstr +and +.B \%winsnstr +from the other functions documented above +by stating they \*(``do not perform wrapping\*(''. +This was probably an error, +since it makes this group of functions inconsistent. +No implementation of +.I curses +documents this inconsistency, +and Issue 7 removed it. +.PP +Issue 4 states that the entire string is inserted if +.I n +is less than 1. +This is probably an error, +.\" ...copied from SVID 4, which made the same error; see p. 510. +because it is inconsistent with other functions +such as \fB\%waddstr\fP(3X), +and differs from the SVr4 +.I curses +and Solaris +.I xcurses +implementations. +Nevertheless, +Issue 7 retains the language. +.SH HISTORY +SVr3.1 (1987) +introduced +.I \%winsstr +and +.IR \%winsnstr "." +.SH SEE ALSO +\fB\%curs_ins_wstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_inch\fP(3X), +\fB\%curs_ins_wstr\fP(3X), +\fB\%curs_util\fP(3X) diff --git a/contrib/ncurses/man/curs_instr.3x b/contrib/ncurses/man/curs_instr.3x new file mode 100644 index 00000000..9a858fb4 --- /dev/null +++ b/contrib/ncurses/man/curs_instr.3x @@ -0,0 +1,223 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_instr.3x,v 1.59 2024/09/14 20:06:50 tom Exp $ +.TH curs_instr 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%instr\fP, +\fB\%winstr\fP, +\fB\%mvinstr\fP, +\fB\%mvwinstr\fP, +\fB\%innstr\fP, +\fB\%winnstr\fP, +\fB\%mvinnstr\fP, +\fB\%mvwinnstr\fP \- +get a string from a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint instr(char * \fIstr\fP); +\fBint winstr(WINDOW * \fIwin\fP, char * \fIstr\fP); +\fBint mvinstr(int \fIy\fP, int \fIx\fP, char * \fIstr\fP); +\fBint mvwinstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, char * \fIstr\fP); +.PP +\fBint innstr(char * \fIstr\fP, int \fIn\fP); +\fBint winnstr(WINDOW * \fIwin\fP, char * \fIstr\fP, int \fIn\fP); +\fBint mvinnstr(int \fIy\fP, int \fIx\fP, char * \fIstr\fP, int \fIn\fP); +\fBint mvwinnstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, char * \fIstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%winstr +extracts a string from a +.I curses +window +.IR win "," +starting at the cursor and stopping at the end of the line, +and stores it in +.IR str "," +terminating it with a null character +and +omitting any attributes and color pair identifier +that +.I curses +associates with each character. +.B \%winnstr +does the same, +but copies at most +.I n +characters from +.IR win "." +An +.I n +of +.B \-1 +implies no limit; +.B \%winnstr +then works like +.BR \%winstr "." +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +These functions return the count of characters copied from +.I win +to +.IR str "," +or +.B ERR +upon failure. +.PP +In +.IR \%ncurses "," +they return +.B ERR +if +.bP +.I win +is +.B NULL +or +.bP +.I str +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%winnstr +may be implemented as macros. +.PP +Reading a line that overflows the array pointed to by +.I str +with +.BR \%instr "," +.BR \%winstr "," +.BR \%mvinstr "," +or +.B \%mvwinstr +causes undefined results. +Use of +.BR \%innstr "," +.BR \%winnstr "," +.BR \%mvinnstr "," +and +.B \%mvwinnstr +is recommended instead. +.SH EXTENSIONS +.BR \%innstr "," +.BR \%winnstr "," +.BR \%mvinnstr "," +and +.BR \%mvwinnstr "'s" +treatment of +.B \-1 +as a valid value of +.I n +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +X/Open Curses Issues 4 and 7 both state that +.BR \%instr "," +.BR \%winstr "," +.BR \%mvinstr "," +and +.B \%mvwinstr +return +.B OK +rather than a character count. +This is likely an erratum. +.bP +SVr3.1 and SVr4 implemented +.B \%winstr +as a wrapper around +.BR \%winnstr "," +returning the latter's return value. +X/Open Curses's specification thus may have been an editorial solecism +copied from System\ V's documentation +(see below) +by X/Open, +rather than an intentional change. +.bP +.I \%ncurses +retains compatibility with System\ V +.I curses +behavior. +.PP +SVr4 documents no return values apart from +.B OK +and +.B ERR +for any of these functions. +SVr4 does not +document whether +.I n +counts the null terminator that these functions write to +.IR str "." +.SH HISTORY +SVr3.1 (1987) +introduced these functions. +.SH SEE ALSO +\fB\%curs_inwstr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its wide-character configuration +.RI \%( ncursesw ). +.PP +\fB\%curses\fP(3X), +\fB\%curs_inch\fP(3X), +\fB\%curs_inchstr\fP(3X) diff --git a/contrib/ncurses/man/curs_inwstr.3x b/contrib/ncurses/man/curs_inwstr.3x new file mode 100644 index 00000000..f30ea5b9 --- /dev/null +++ b/contrib/ncurses/man/curs_inwstr.3x @@ -0,0 +1,231 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2002-2012,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_inwstr.3x,v 1.47 2024/09/14 20:06:50 tom Exp $ +.TH curs_inwstr 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%inwstr\fP, +\fB\%winwstr\fP, +\fB\%mvinwstr\fP, +\fB\%mvwinwstr\fP, +\fB\%innwstr\fP, +\fB\%winnwstr\fP, +\fB\%mvinnwstr\fP, +\fB\%mvwinnwstr\fP \- +get a wide-character string from a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint inwstr(wchar_t * \fIwstr\fP); +\fBint winwstr(WINDOW * \fIwin\fP, wchar_t * \fIwstr\fP); +\fBint mvinwstr(int \fIy\fP, int \fIx\fP, wchar_t * \fIwstr\fP); +\fBint mvwinwstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, wchar_t * \fIwstr\fP); +.PP +\fBint innwstr(wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint winnwstr(WINDOW * \fIwin\fP, wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint mvinnwstr(int \fIy\fP, int \fIx\fP, wchar_t * \fIwstr\fP, int \fIn\fP); +\fBint mvwinnwstr(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP, wchar_t * \fIwstr\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B \%winwstr +extracts a wide-character string from a +.I curses +window +.IR win "," +starting at the cursor and stopping at the end of the line, +and stores it in +.IR wstr "," +terminating it with a wide null character +and +omitting any attributes and color pair identifier +that +.I curses +associates with each character. +.B \%winnwstr +does the same, +but copies at most +.I n +wide characters from +.IR win "." +An +.I n +of +.B \-1 +implies no limit; +.B \%winnwstr +then works like +.BR \%winwstr "." +\fB\%ncurses\fP(3X) describes the variants of these functions. +.SH RETURN VALUE +On successful operation, +these functions return the count of wide characters copied from +.I win +to +.IR wstr "." +They return +.B ERR +upon failure. +.BR \%innwstr "," +.BR \%winnwstr "," +.BR \%mvinnwstr "," +and +.B \%mvwinnwstr +return +.B ERR +if +.I n +is insufficiently large to store a complete wide character string. +(Recall that a +.I curses +complex character can contain multiple wide characters, +some of which may be non-spacing.) +.PP +In +.IR \%ncurses "," +these functions return +.B ERR +if +.bP +.I win +is +.B NULL +or +.bP +.I wstr +is +.BR NULL "." +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +All of these functions except +.B \%winnwstr +may be implemented as macros. +.PP +Reading a line that overflows the array pointed to by +.I str +with +.BR \%inwstr "," +.BR \%winwstr "," +.BR \%mvinwstr "," +or +.B \%mvwinwstr +causes undefined results. +Use of +.BR \%innwstr "," +.BR \%winnwstr "," +.BR \%mvinnwstr "," +and +.B \%mvwinnwstr +is recommended instead. +.SH EXTENSIONS +.BR \%innwstr "," +.BR \%winnwstr "," +.BR \%mvinnwstr "," +and +.BR \%mvwinnwstr "'s" +treatment of +.B \-1 +as a valid value of +.I n +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +Notwithstanding the foregoing, +X/Open Curses Issues 4 and 7 both state that +.BR \%innwstr "," +.BR \%winnwstr "," +.BR \%mvinnwstr "," +and +.B \%mvwinnwstr +\*(``fail .\|.\|. [i]f the array is not large enough to contain any +complete characters\*(''. +Strictly interpreted, +this means that a caller of these functions cannot use their return +values to detect truncation of a wide-character string copied from more +than one character cell in +.IR win "." +.I \%ncurses +reports any truncation with +.BR ERR "." +.PP +X/Open Curses specifies +.BR \%inwstr "," +.BR \%winwstr "," +.BR \%mvinwstr "," +and +.B \%mvwinwstr +as returning +.B OK +rather than a (wide) character count, +unlike their non-wide counterparts +.BR \%instr "," +.BR \%winstr "," +.BR \%mvinstr "," +and +.BR \%mvwinstr "." +.I \%ncurses +regards this inconsistency as an error in the standard. +.SH SEE ALSO +\fB\%curs_instr\fP(3X) describes comparable functions of the +.I \%ncurses +library in its non-wide-character configuration. +.PP +\fB\%curses\fP(3X), +\fB\%curs_in_wch\fP(3X), +\fB\%curs_in_wchstr\fP(3X) diff --git a/contrib/ncurses/man/curs_kernel.3x b/contrib/ncurses/man/curs_kernel.3x new file mode 100644 index 00000000..c7b1a54d --- /dev/null +++ b/contrib/ncurses/man/curs_kernel.3x @@ -0,0 +1,424 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_kernel.3x,v 1.72 2024/09/21 18:05:20 tom Exp $ +.TH curs_kernel 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%def_prog_mode\fP, +\fB\%def_shell_mode\fP, +\fB\%reset_prog_mode\fP, +\fB\%reset_shell_mode\fP, +\fB\%resetty\fP, +\fB\%savetty\fP, +\fB\%getsyx\fP, +\fB\%setsyx\fP, +\fB\%curs_set\fP, +\fB\%mvcur\fP, +\fB\%napms\fP, +\fB\%ripoffline\fP \- +low-level \fIcurses\fR routines +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint def_prog_mode(void); +\fBint def_shell_mode(void); +.PP +\fBint reset_prog_mode(void); +\fBint reset_shell_mode(void); +.PP +\fBint resetty(void); +\fBint savetty(void); +.PP +\fBvoid getsyx(int \fIy\fP, int \fIx\fP); +\fBvoid setsyx(int \fIy\fP, int \fIx\fP); +.PP +\fBint curs_set(int \fIvisibility\fP); +\fBint mvcur(int \fIoldrow\fP, int \fIoldcol\fP, int \fInewrow\fP, int \fInewcol\fP); +\fBint napms(int \fIms\fP); +\fBint ripoffline(int \fIline\fP, int (*\fIinit\fP)(WINDOW *, int)); +.fi +.SH DESCRIPTION +The following routines give low-level access +to various \fBcurses\fP capabilities. +These routines typically are used inside library routines. +.SS "def_prog_mode, def_shell_mode" +The \fBdef_prog_mode\fP and \fBdef_shell_mode\fP routines save the +current terminal modes as the \*(``program\*('' +(in \fBcurses\fP) or \*(``shell\*('' +(not in \fBcurses\fP) state for use by the \fBreset_prog_mode\fP and +\fBreset_shell_mode\fP routines. +This is done automatically by \fBinitscr\fP. +There is one such save area for each screen context +allocated by \fBnewterm\fP. +.SS "reset_prog_mode, reset_shell_mode" +The \fBreset_prog_mode\fP and \fBreset_shell_mode\fP routines restore +the terminal to \*(``program\*('' (in \fBcurses\fP) or \*(``shell\*('' (out of +\fBcurses\fP) state. +These are done automatically by \fBendwin\fP(3X) and, +after an \fBendwin\fP, by \fBdoupdate\fP, +so they normally are not called. +.SS "resetty, savetty" +The \fBresetty\fP and \fBsavetty\fP routines save and restore the +state of the terminal modes. +\fBsavetty\fP saves the current state in +a buffer and \fBresetty\fP restores the state to what it was at the +last call to \fBsavetty\fP. +.SS getsyx +.B \%getsyx +stores the coordinates of virtual screen +.RB \%( newscr ) +cursor in +.I y +and +.IR x "." +If +.BR \%newscr 's +\fB\%leaveok\fP(3X) output option is +.BR TRUE "," +.B \%getsyx +stores +.B \-1 +in both +.I y +and +.IR x "." +If lines have been removed from the top of the screen using +.BR \%ripoffline "," +.I y +includes these lines; +therefore, +.I y +and +.I x +populated by +.B \%getsyx +should be used only as arguments for +.BR \%setsyx "." +.PP +Few applications use this feature; +most call \fB\%getyx\fP(3X) instead. +.SS setsyx +.B \%setsyx +sets the virtual screen +.RB \%( newscr ) +cursor location to +.RI ( y , +.IR x ")." +.B "\%setsyx(\-1, \-1)" +is equivalent to +.BR "\%leaveok(newscr, TRUE)" "." +.PP +.B \%getsyx +and +.B \%setsyx +are designed to be used by a function that manipulates +.I curses +windows but seeks to avoid changing the cursor position. +Such a function would first call +.BR \%getsyx "," +modify its windows' content, +call \fB\%wnoutrefresh\fP(3X) on them, +call +.BR \%setsyx "," +then call \fB\%doupdate\fP(3X). +.PP +Few applications use this feature; +most call \fB\%wmove\fP(3X) instead. +.SS curs_set +.B \%curs_set +adjusts the cursor visibility to +\*(``invisible\*('', +\*(``visible\*('', +\*(``very visible\*('', +as its argument is +.BR 0 , +.BR 1 , +or +.BR 2 , +respectively. +It returns the previous +.I visibility +if the requested one is supported, +and +.B ERR +otherwise. +.SS mvcur +.B \%mvcur +provides low-level cursor motion. +It takes effect immediately, +rather than at the next refresh. +Unlike the other low-level output functions, +which either write to the standard output stream +or are passed a function pointer to perform output, +.B \%mvcur +uses a file descriptor derived from the output stream parameter of +\fB\%newterm\fP(3X). +.PP +One application of +.B \%mvcur +accompanies the temporary use of another program to write to the +terminal screen. +For example, +first call \fB\%refresh\fP(3X) to ensure that the screen and the +library's model of it is up to date; +then call +.BR \%reset_shell_mode ";" +write to the screen with the external application; +call +.BR \%reset_prog_mode ";" +and finally call +.BR \%mvcur( ".\|.\|." , +.RB .\|.\|. , +.B \-1, \-1) +to move the terminal cursor to where +.I \%curses +thinks it is, +since the library has no knowledge of how the external application +moved it. +.\" https://lists.gnu.org/archive/html/bug-ncurses/2016-10/msg00002.html +.SS napms +.B \%napms +sleeps for +.I ms +milliseconds. +If +.I ms +exceeds 30,000 +(thirty seconds), +it is capped at that value. +.SS ripoffline +.B \%ripoffline +provides access to the same facility that \fB\%slk_init\fP(3X) uses to +reduce the size of the screen. +\fB\%ripoffline\fP must be called before \fBinitscr\fP or +\fBnewterm\fP is called, to prepare these initial actions: +.bP +If \fIline\fP is positive, a line is removed from the top of \fBstdscr\fP. +.bP +if \fIline\fP is negative, a line is removed from the bottom. +.PP +When the resulting initialization is done inside \fBinitscr\fP, the +routine \fBinit\fP (supplied by the user) is called with two +arguments: +.bP +a window pointer to the one-line window that has been +allocated and +.bP +an integer with the number of columns in the window. +.PP +Inside this initialization routine, the integer variables \fBLINES\fP +and \fBCOLS\fP (defined in \fB\fP) are not guaranteed to be +accurate and \fBwrefresh\fP or \fBdoupdate\fP must not be called. +It is allowable to call \fBwnoutrefresh\fP during the initialization routine. +.PP +\fBripoffline\fP can be called up to five times before calling \fBinitscr\fP or +\fBnewterm\fP. +.SH RETURN VALUE +Except for +.BR \%curs_set "," +these functions return +.B OK +on success and +.B ERR +on failure. +.PP +.B \%curs_set +returns the previous cursor visibility, +and returns +.B ERR +if the terminal type does not support the requested +.IR visibility "." +.PP +.B \%napms +always succeeds. +.PP +.B \%mvcur +fails if the position +.RI ( newrow , +.IR newcol ) +is outside the screen boundaries. +.PP +In +.IR \%ncurses "," +.bP +.BR \%def_prog_mode "," +.BR \%def_shell_mode "," +.BR \%reset_prog_mode "," +and +.B \%reset_shell_mode +return +.B ERR +if the terminal was not initialized, +or if the operating system's function for obtaining terminal settings +fails. +.bP +.B \%ripoffline +returns +.B ERR +if the accumulated quantity of ripped-off lines +would exceed the maximum (5). +.SH NOTES +.B \%getsyx +is a macro; +use of the +.B & +operator before its arguments is unnecessary. +.PP +The +.B \%endwin +function of both +.I \%ncurses +and SVr4 +.I curses +calls +.B \%curs_set +if the latter has previously been called to set the cursor visiblility +to a value other than normal; +that is, +either +invisible or very visible. +There is no way for +.I \%ncurses +to determine the initial cursor visibility to restore it. +.SH EXTENSIONS +In +.IR \%ncurses "," +.B \%mvcur +accepts +.B \-1 +for either or both old coordinates. +This value tells +.I \%ncurses +that the old location is unknown, +and that it must use only absolute motion, +as with the +.B \%cursor_address +.RB ( cup ) +capability, +rather than the least costly combination of absolute and relative +motion. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +The +.I "virtual screen" +functions +.I \%setsyx +and +.I \%getsyx +are not described in X/Open Curses Issue\ 4. +SVr4 documents each of them +as returning an +.IR int "." +This is misleading, +as they are macros with no documented semantics for returning values. +.PP +All other functions are as described in X/Open Curses. +It specifies no error conditions for them, +except as described for +.I \%curs_set +in section \*(``RETURN VALUE\*('' above. +.PP +Older SVr4 man pages warn that the return value of +.B \%curs_set +\*(``is currently incorrect\*(''. +This implementation gets it right, +but counting on its correctness anywhere else may be unwise. +.PP +X/Open Curses specifies +.I \%ripoffline +as returning +.B OK +with no possibility of failure +(\*(``[c]alls to +.I \%ripoffline +above this limit +[five lines] +have no effect but report success\*(''). +.PP +X/Open Curses notes: +.RS +.PP +After use of +.IR \%mvcur "()," +the model Curses maintains of the state of the terminal might not +match the actual state of the terminal. +An application should touch and refresh the window before +resuming conventional use of Curses. +.RE +.PP +Both +.I \%ncurses +and SVr4 +.I curses +implement +.B \%mvcur +using the +.I SCREEN +object allocated in either \fB\%initscr\fP(3X) or \fB\%newterm\fP(3X). +X/Open Curses states that the old location must be given for +.I \%mvcur +to accommodate terminals that lack absolute cursor positioning. +.\" X/Open Curses Issue 7, p. 161 +.PP +If interrupted by a signal, +.I \%ncurses +restarts +.IR \%napms "." +That, +and the limitation to 30 seconds, +differ from other implementations. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_scr_dump\fP(3X), +\fB\%curs_slk\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_legacy.3x b/contrib/ncurses/man/curs_legacy.3x new file mode 100644 index 00000000..91831a63 --- /dev/null +++ b/contrib/ncurses/man/curs_legacy.3x @@ -0,0 +1,120 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2007-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_legacy.3x,v 1.34 2024/05/25 20:15:31 tom Exp $ +.TH curs_legacy 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%getattrs\fP, +\fB\%getbegx\fP, +\fB\%getbegy\fP, +\fB\%getcurx\fP, +\fB\%getcury\fP, +\fB\%getmaxx\fP, +\fB\%getmaxy\fP, +\fB\%getparx\fP, +\fB\%getpary\fP \- +get \fIcurses\fR cursor and window coordinates or attributes (legacy) +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint getattrs(const WINDOW *\fIwin\fP); +.PP +\fBint getbegx(const WINDOW *\fIwin\fP); +\fBint getbegy(const WINDOW *\fIwin\fP); +.PP +\fBint getcurx(const WINDOW *\fIwin\fP); +\fBint getcury(const WINDOW *\fIwin\fP); +.PP +\fBint getmaxx(const WINDOW *\fIwin\fP); +\fBint getmaxy(const WINDOW *\fIwin\fP); +.PP +\fBint getparx(const WINDOW *\fIwin\fP); +\fBint getpary(const WINDOW *\fIwin\fP); +.fi +.SH DESCRIPTION +These legacy functions are simpler to use +than the X/Open \fIcurses\fP functions: +.bP +The \fB\%getattrs\fP function returns the same attribute data +as \fB\%wattr_get\fP. +.IP +However, \fB\%getattrs\fP returns an integer (actually a \fB\%chtype\fP), +while \fB\%wattr_get\fP returns the current color pair in a separate parameter. +In the wide-character library configuration, +color pairs may not fit into a \fB\%chtype\fP, +so \fB\%wattr_get\fP is the only way to obtain the color information. +.IP +Because \fB\%getattrs\fP returns the attributes in a single parameter, +it would not be possible for an application to distinguish that from +\fBERR\fP (a \fI-1\fP). +If the window parameter is null, \fB\%getattrs\fP +returns \fB\%A_NORMAL\fP (zero). +.bP +The \fB\%getbegy\fP and \fB\%getbegx\fP functions return the same +data as \fB\%getbegyx\fP. +.bP +The \fB\%getcury\fP and \fB\%getcurx\fP functions return the same +data as \fB\%getyx\fP. +.bP +The \fB\%getmaxy\fP and \fB\%getmaxx\fP functions return the same +data as \fB\%getmaxyx\fP. +.bP +The \fB\%getpary\fP and \fB\%getparx\fP functions return the same +data as \fB\%getparyx\fP. +.SH RETURN VALUE +Except as noted, +these functions return an integer, +or \fBERR\fP if the window parameter is null. +.SH PORTABILITY +These functions were supported on Version 7, BSD or System V implementations. +None of those implementations checked the window parameter. +.PP +The \fB\%getattrs\fP function and macro are defined to return a (signed) integer +for compatibility with those implementations +although an unsigned type would have been more appropriate. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_getyx\fP(3X), +\fB\%curs_opaque\fP(3X) diff --git a/contrib/ncurses/man/curs_memleaks.3x b/contrib/ncurses/man/curs_memleaks.3x new file mode 100644 index 00000000..0626d774 --- /dev/null +++ b/contrib/ncurses/man/curs_memleaks.3x @@ -0,0 +1,131 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2008-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_memleaks.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH curs_memleaks 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%exit_curses\fP, +\fB\%exit_terminfo\fP \- +check for memory leaks in \fIcurses\fR +.SH SYNOPSIS +.nf +\fB#include +\fBvoid exit_curses(int \fIcode\fP); +.PP +\fB#include +\fBvoid exit_terminfo(int \fIcode\fP); +.PP +\fI/* deprecated (intentionally not declared in curses.h or term.h) */ +\fBvoid _nc_freeall(void); +\fBvoid _nc_free_and_exit(int \fIcode\fP); +\fBvoid _nc_free_tinfo(int \fIcode\fP); +.fi +.SH DESCRIPTION +These functions are used to simplify analysis of memory leaks in the +\fI\%ncurses\fP library. +.PP +Any implementation of curses must not free the memory associated with +a screen, since (even after calling \fB\%endwin\fP(3X)), it must be available +for use in the next call to \fB\%refresh\fP(3X). +There are also chunks of memory held for performance reasons. +That makes it hard to analyze curses applications for memory leaks. +When using the specially configured debugging version of the +\fI\%ncurses\fP library, +applications can call functions which free those chunks of memory, +simplifying the process of memory-leak checking. +.PP +Some of the functions are named with a \*(``_nc_\*('' prefix +because they are not intended for use in the non-debugging library: +.TP 5 +\fB\%_nc_freeall\fP +This frees (almost) all of the memory allocated by \fI\%ncurses\fP. +.TP 5 +\fB\%_nc_free_and_exit\fP +This frees the memory allocated by \fI\%ncurses\fP +(like \fB\%_nc_freeall\fP), +and exits the program. +It is preferred over \fB\%_nc_freeall\fP since some of that memory +may be required to keep the application running. +Simply exiting (with the given exit-code) is safer. +.TP 5 +\fB\%_nc_free_tinfo\fP +Use this function if only the low-level terminfo functions (and +corresponding library) are used. +Like \fB\%_nc_free_and_exit\fP, it exits the program after freeing memory. +.PP +The functions prefixed \*(``_nc\*('' are normally not available; +they must be configured into the library +at build time using the \fB\%\-\-disable-leaks\fP option. +That compiles-in code that frees memory that normally would not be freed. +.PP +The \fB\%exit_curses\fP and \fB\%exit_terminfo\fP functions +call \fB\%_nc_free_and_exit\fP and \fB\%_nc_free_tinfo\fP if +the library is configured to support memory-leak checking. +If the library is not configured to support memory-leak checking, +they simply call \fBexit\fP. +.SH RETURN VALUE +These functions do not return a value. +.SH PORTABILITY +These functions are not part of X/Open Curses; +nor do other implementations of curses provide a similar feature. +.PP +In any implementation of X/Open Curses, an application can free part +of the memory allocated by curses: +.bP +The portable part of \fB\%exit_curses\fP can be freed using \fB\%delscreen\fP, +passing the \fISCREEN\fP pointer returned by \fB\%newterm\fP. +.IP +In some implementations, there is a global variable \fBsp\fP +which could be used, e.g., if the screen were only initialized +using \fB\%initscr\fP. +.bP +The portable part of \fB\%exit_terminfo\fP can be freed +using \fB\%del_curterm\fP. +.IP +In this case, there is a global variable \fB\%cur_term\fP which can be +used as parameter. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_terminfo\fP(3X) diff --git a/contrib/ncurses/man/curs_mouse.3x b/contrib/ncurses/man/curs_mouse.3x new file mode 100644 index 00000000..41622522 --- /dev/null +++ b/contrib/ncurses/man/curs_mouse.3x @@ -0,0 +1,528 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_mouse.3x,v 1.103 2024/05/25 20:10:58 tom Exp $ +.TH curs_mouse 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%has_mouse\fP, +\fB\%getmouse\fP, +\fB\%ungetmouse\fP, +\fB\%mousemask\fP, +\fB\%wenclose\fP, +\fB\%mouse_trafo\fP, +\fB\%wmouse_trafo\fP, +\fB\%mouseinterval\fP \- +get mouse events in \fIcurses\fR +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBtypedef unsigned long mmask_t; +.PP +\fBtypedef struct { +\fB short id; \fI/* ID to distinguish multiple devices */ +\fB int x, y, z; \fI/* event coordinates */ +\fB mmask_t bstate; \fI/* button state bits */ +\fB} MEVENT; +.PP +\fBbool has_mouse(void); +.PP +\fBmmask_t mousemask(mmask_t \fInewmask\fP, mmask_t *\fIoldmask\fP); +.PP +\fBint getmouse(MEVENT *\fIevent\fP); +\fBint ungetmouse(MEVENT *\fIevent\fP); +.PP +\fBbool wenclose(const WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP); +.PP +\fBbool mouse_trafo(int* \fIpY\fP, int* \fIpX\fP, bool \fIto_screen\fP); +\fBbool wmouse_trafo(const WINDOW* \fIwin\fP, +.ti +18n \" "bool wmouse_trafo(" +\fBint* \fIpY\fB, int* \fIpX\fB, bool \fIto_screen\fB); +.PP +\fBint mouseinterval(int \fIerval\fB);\fR +.fi +.SH DESCRIPTION +These functions provide an interface to mouse events from +\fB\%ncurses\fP(3X). +Mouse events are represented by \fB\%KEY_MOUSE\fP +pseudo-key values in the \fB\%wgetch\fP(3X) input stream. +.SS has_mouse +The \fB\%has_mouse\fP function returns \fBTRUE\fP if the mouse driver +has been successfully initialized, +and \fBFALSE\fP otherwise. +.PP +Mouse events are ignored when input is in cooked mode, and +cause an error beep when cooked mode is being simulated in a window by a +function such as \fB\%getstr\fP that expects a linefeed for input-loop +termination. +.SS mousemask +To make mouse events visible, use the \fB\%mousemask\fP function. +This sets the mouse events to be reported. +By default, no mouse events are reported. +.bP +The function returns an updated copy of \fInewmask\fP +to indicate which of the specified mouse events can be reported. +.IP +If the screen has not been initialized, +or if the terminal does not support mouse-events, +this function returns 0. +.bP +If \fIoldmask\fP is non-\fBNULL\fP, +this function fills the indicated location with the previous value of the +current screen's mouse event mask. +.PP +As a side effect, setting a zero mouse mask may turn off the mouse pointer; +setting a nonzero mask may turn it on. +Whether this happens is device-dependent. +.SS "Mouse Events" +Here are the mouse event type masks which may be defined: +.PP +.TS +Lb Lb +Lb Lx. +Name Description += +BUTTON1_PRESSED mouse button 1 down +BUTTON1_RELEASED mouse button 1 up +BUTTON1_CLICKED mouse button 1 clicked +BUTTON1_DOUBLE_CLICKED mouse button 1 double clicked +BUTTON1_TRIPLE_CLICKED mouse button 1 triple clicked +_ +BUTTON2_PRESSED mouse button 2 down +BUTTON2_RELEASED mouse button 2 up +BUTTON2_CLICKED mouse button 2 clicked +BUTTON2_DOUBLE_CLICKED mouse button 2 double clicked +BUTTON2_TRIPLE_CLICKED mouse button 2 triple clicked +_ +BUTTON3_PRESSED mouse button 3 down +BUTTON3_RELEASED mouse button 3 up +BUTTON3_CLICKED mouse button 3 clicked +BUTTON3_DOUBLE_CLICKED mouse button 3 double clicked +BUTTON3_TRIPLE_CLICKED mouse button 3 triple clicked +_ +BUTTON4_PRESSED mouse button 4 down +BUTTON4_RELEASED mouse button 4 up +BUTTON4_CLICKED mouse button 4 clicked +BUTTON4_DOUBLE_CLICKED mouse button 4 double clicked +BUTTON4_TRIPLE_CLICKED mouse button 4 triple clicked +_ +BUTTON5_PRESSED mouse button 5 down +BUTTON5_RELEASED mouse button 5 up +BUTTON5_CLICKED mouse button 5 clicked +BUTTON5_DOUBLE_CLICKED mouse button 5 double clicked +BUTTON5_TRIPLE_CLICKED mouse button 5 triple clicked +_ +BUTTON_SHIFT T{ +shift was down during button state change +T} +BUTTON_CTRL T{ +control was down during button state change +T} +BUTTON_ALT T{ +alt was down during button state change +T} +ALL_MOUSE_EVENTS report all button state changes +REPORT_MOUSE_POSITION report mouse movement +_ +.TE +.SS getmouse +Once a class of mouse events has been made visible in a window, +calling the \fB\%wgetch\fP function on that window may return +\fB\%KEY_MOUSE\fP as an indicator that a mouse event has been queued. +To read the event data and pop the event off the queue, call +\fB\%getmouse\fP. +This function will return \fBOK\fP if a mouse event +is actually visible in the given window, \fBERR\fP otherwise. +When \fB\%getmouse\fP returns \fBOK\fP, the data deposited as y and +x in the event structure coordinates will be screen-relative character-cell +coordinates. +The returned state mask will have exactly one bit set to +indicate the event type. +The corresponding data in the queue is marked invalid. +A subsequent call to \fB\%getmouse\fP will retrieve the next older +item from the queue. +.SS ungetmouse +The \fB\%ungetmouse\fP function behaves analogously to \fB\%ungetch\fP. +It pushes +a \fB\%KEY_MOUSE\fP event onto the input queue, and associates with that event +the given state data and screen-relative character-cell coordinates. +.SS wenclose +The \fB\%wenclose\fP function tests whether a given pair of screen-relative +character-cell coordinates is enclosed by a given window, returning \fBTRUE\fP +if it is and \fBFALSE\fP otherwise. +It is useful for determining what subset of +the screen windows enclose the location of a mouse event. +.PP +If the parameter is a pad, +\fB\%wenclose\fP uses the most recent screen coordinates used for +this pad in +\fB\%prefresh\fP(3X) or +\fB\%pnoutrefresh\fP(3X). +.SS wmouse_trafo +The \fB\%wmouse_trafo\fP function transforms a given pair of coordinates +from \fB\%stdscr\fP-relative coordinates +to coordinates relative to the given window or vice versa. +The resulting \fB\%stdscr\fP-relative coordinates are not always +identical to screen coordinates due to the mechanism to reserve +lines on top or bottom of the screen for other purposes +(see the \fB\%ripoffline\fP(3X) and \fB\%slk_init\fP(3X) calls, for example). +.bP +If the parameter \fIto_screen\fP is \fBTRUE\fP, the pointers +\fIpY, pX\fP must reference the coordinates of a location +inside the window \fIwin\fP. +They are converted to \fB\%stdscr\fP-relative coordinates and returned +through the pointers. +If the conversion was successful, the function returns \fBTRUE\fP. +.IP +If one of the parameters was \fBNULL\fP or the location is +not inside the window, \fBFALSE\fP is returned. +.bP +If \fIto_screen\fP is +\fBFALSE\fP, the pointers \fIpY, pX\fP must reference +\fB\%stdscr\fP-relative coordinates. +They are converted to window-relative coordinates if the +window \fIwin\fP encloses this point. +In this case the function returns \fBTRUE\fP. +.IP +If one of the parameters is \fBNULL\fP or the point is not inside the +window, \fBFALSE\fP is returned. +.PP +The referenced coordinates +are only replaced by the converted coordinates if the transformation was +successful. +.SS mouse_trafo +The \fB\%mouse_trafo\fP function performs the same translation +as \fB\%wmouse_trafo\fP, +using \fB\%stdscr\fP for \fIwin\fP. +.SS mouseinterval +The \fB\%mouseinterval\fP function sets the maximum time +(in thousandths of a second) +that can elapse between press and release events for them to +be resolved as a +.IR click . +An application might interpret button press and release events separated +by more than the mouse interval as a \*(``long press\*('', +or, +with motion, +as a \*(``drag\*(''. +.PP +Calling \fB\%mouseinterval(0)\fP disables click resolution. +When +.I \%ncurses +detects a mouse event, +it awaits further input activity up to this interval, +and then checks for a subsequent mouse event which can be combined +with the first event. +If the timeout expires without input activity +(which would happen with a zero interval), +then no click resolution will occur. +.PP +This function returns the previous interval value. +Use \fB\%mouseinterval(\-1)\fP to obtain the interval without altering it. +.PP +The mouse interval is set to one sixth of a second +when the corresponding screen is initialized, +e.g., in \fBinitscr\fP(3X) or \fBsetupterm\fP(3X). +.SH RETURN VALUE +\fB\%has_mouse\fP, +\fB\%wenclose\fP, +\fB\%mouse_trafo\fP, +and +\fB\%wmouse_trafo\fP +return \fBTRUE\fP or \fBFALSE\fP as noted above. +.PP +\fB\%getmouse\fP and \fB\%ungetmouse\fP +return \fBERR\fP upon failure and \fBOK\fP upon success. +.PP +\fB\%getmouse\fP fails if: +.bP +no mouse driver was initialized, +.bP +the mask of reportable events is zero, +.bP +a mouse event was detected that does not match the mask, +.bP +or if no more events remain in the queue. +.PP +\fB\%ungetmouse\fP returns +.B ERR +if the event queue is full. +.PP +\fB\%mousemask\fP +returns the mask of reportable events. +.PP +\fB\%mouseinterval\fP +returns the previous interval value, unless +the terminal was not initialized. +In that case, it returns the maximum interval value (166). +.SH NOTES +The order of the \fB\%MEVENT\fP structure members is not guaranteed. +Additional fields may be added to the structure in the future. +.PP +Under +.IR \%ncurses , +these calls are implemented using either +.IR \%xterm 's +built-in mouse-tracking API or +platform-specific drivers including +.RS 3 +.bP +Alessandro Rubini's gpm server +.bP +FreeBSD sysmouse +.bP +OS/2 EMX +.RE +.PP +If you are using an unsupported configuration, +mouse events will not be visible to +\fI\%ncurses\fP (and the \fB\%mousemask\fP function will always +return \fB0\fP). +.PP +If the +.I \%term\%info +entry contains a \fBXM\fP string, +this is used in the +.I \%xterm +mouse driver to control the +way the terminal is initialized for mouse operation. +The default, if \fBXM\fP is not found, +corresponds to private mode 1000 of +.I \%xterm: +.PP +.RS 3 +\eE[?1000%?%p1%{1}%=%th%el%; +.RE +.PP +The mouse driver also recognizes a newer +.I \%xterm +private mode 1006, +e.g., +.PP +.RS 3 +\eE[?1006;1000%?%p1%{1}%=%th%el%; +.RE +.PP +The \fIz\fP member in the event structure is not presently used. +It is intended +for use with touch screens (which may be pressure-sensitive) or with +3D-mice/trackballs/power gloves. +.PP +The \fB\%ALL_MOUSE_EVENTS\fP class does not +include \fB\%REPORT_MOUSE_POSITION\fP. +They are distinct. +For example, +in +.IR \%xterm , +wheel/scrolling mice send position reports as a sequence of +presses of buttons 4 or 5 without matching button-releases. +.SH EXTENSIONS +These functions were designed for +\fB\%ncurses\fP(3X), +and are not found in SVr4 +.IR curses , +4.4BSD +.IR curses , +or any other previous curses implementation. +(SVr4 +.I curses +did have a +.I \%getmouse +function, +which took no argument and returned a different type.) +.SH PORTABILITY +Applications employing the +.I \%ncurses +mouse extension should condition its use on the visibility of the +.B \%NCURSES_MOUSE_VERSION +preprocessor macro. +When the interface changes, +the macro's value increments. +Multiple versions are available when +.I \%ncurses +is configured; +see section \*(``ALTERNATE CONFIGURATIONS\*('' of \fB\%ncurses\fP(3X). +The following values may be specified. +.RS 3 +.TP 3 +1 +has definitions for reserved events. +The mask uses 28 bits. +.TP 3 +2 +adds definitions for button 5, +removes the definitions for reserved events. +The mask uses 29 bits. +.RE +.PP +SVr4 +.I curses +had support for the mouse in a variant of \fI\%xterm\fP(1). +It is mentioned in a few places, +with little supporting documentation. +.bP +Its \*(``libcurses\*('' manual page lists functions for this feature +prototyped in \fI\%curses.h\fP. +.PP +.RS 8 +.EX +extern int mouse_set(long int); +extern int mouse_on(long int); +extern int mouse_off(long int); +extern int request_mouse_pos(void); +extern int map_button(unsigned long); +extern void wmouse_position(WINDOW *, int *, int *); +extern unsigned long getmouse(void), getbmap(void); +.EE +.RE +.bP +Its \*(``terminfo\*('' manual page lists capabilities for the feature. +.\" These don't appear in in the SVID 4th edition, Volume 3, +.\" terminfo(TI_ENV) man page. They can be found in, e.g., the "z/OS +.\" V1R1.0 C Curses" book, Chapter 17, pp. 179-186 (PDF 213-220). +.RS 8 +.TS +Lb Lb Lb Lx. +buttons btns BT T{ +Number of buttons on the mouse +T} +get_mouse getm Gm T{ +Curses should get button events +T} +key_mouse kmous Km T{ +0631, Mouse event has occurred +T} +mouse_info minfo Mi T{ +Mouse status information +T} +req_mouse_pos reqmp RQ T{ +Request mouse position report +T} +.TE +.RE +.bP +The interface made assumptions +(as does +.IR \%ncurses ) +about the escape sequences sent to and received from the terminal. +.IP +For instance, +the SVr4 +.I curses +library used the \fB\%get_mouse\fP capability to tell the terminal which +mouse button events it should send, +passing the mouse-button bit mask to the terminal. +Also, it could ask the terminal +where the mouse was using the \fB\%req_mouse_pos\fP capability. +.IP +Those features required a terminal program that had been modified +to work with SVr4 +.IR curses . +They were not part of the X Consortium's +.IR \%xterm . +.PP +When developing the +.I \%xterm +mouse support for +.I \%ncurses +in September 1995, +Eric Raymond was uninterested in using the same interface due to its +lack of documentation. +Later, in 1998, Mark Hesseling provided support in +.I \%PDCurses +2.3 using the SVr4 interface. +.IR \%PDCurses , +however, +does not use video terminals, +making it unnecessary to be concerned about compatibility with the +escape sequences. +.SH BUGS +Mouse events from +.I \%xterm +are +.I not +ignored in cooked mode if they have been enabled by \fB\%mousemask\fP. +Instead, +the +.I \%xterm +mouse report sequence appears in the string read. +.PP +An +.I \%ncurses +window must enable \fB\%keypad\fP(3X) to correctly receive mouse event +reports from +.I \%xterm +since they are encoded like function keys. +Set the terminal's +.I \%term\%info +capability \fB\%kmous\fP to \*(``\eE[M\*('' +(the beginning of the response from +.I \%xterm +for mouse clicks). +Other values of \fB\%kmous\fP are permitted under the same assumption, +that is, +the report begins with that sequence. +.PP +Because there are no standard response sequences that serve to identify +terminals supporting the +.I \%xterm +mouse protocol, +.I \%ncurses +assumes that if \fB\%kmous\fP is defined in the terminal description, +or if the terminal type's primary name or aliases contain the string +\%\*(``xterm\*('', +then the terminal may send mouse events. +The \fB\%kmous\fP capability is checked first, +allowing use of newer +.I \%xterm +mouse protocols, +such as its private mode 1006. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_inopts\fP(3X), +\fB\%curs_kernel\fP(3X), +\fB\%curs_pad\fP(3X), +\fB\%curs_slk\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_move.3x b/contrib/ncurses/man/curs_move.3x new file mode 100644 index 00000000..001d5e91 --- /dev/null +++ b/contrib/ncurses/man/curs_move.3x @@ -0,0 +1,111 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_move.3x,v 1.46 2024/09/21 18:03:44 tom Exp $ +.TH curs_move 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%move\fP, +\fB\%wmove\fP \- +move cursor in a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint move(int \fIy\fP, int \fIx\fP); +\fBint wmove(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP); +.fi +.SH DESCRIPTION +.B \%wmove +relocates the cursor associated with the +.I curses +window +.I win +to line +.I y +and column +.IR x . +The terminal's cursor does not move until \fB\%refresh\fP(3X) is called. +The position +.RI ( y , +.IR x ) +is relative to the upper left-hand corner of the window, +which has coordinates +(0,\ 0). +\fB\%ncurses\fP(3X) describes the +.B \%move +variant of this function. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +They fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.PP +In +.IR \%ncurses , +.B \%wmove +fails if +.I win +is +.BR NULL . +.SH NOTES +.B \%move +may be implemented as a macro. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +.PP +SVr4 +.I curses +describes a successful return value only as +\*(``an integer value other than +.BR ERR \*(''. +.SH HISTORY +4BSD (1980) +.I curses +introduced +.IR \%wmove "." +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_refresh\fP(3X) diff --git a/contrib/ncurses/man/curs_opaque.3x b/contrib/ncurses/man/curs_opaque.3x new file mode 100644 index 00000000..fa623eea --- /dev/null +++ b/contrib/ncurses/man/curs_opaque.3x @@ -0,0 +1,161 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 2007-2014,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_opaque.3x,v 1.43 2024/03/16 15:35:01 tom Exp $ +.TH curs_opaque 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%is_cleared\fP, +\fB\%is_idlok\fP, +\fB\%is_idcok\fP, +\fB\%is_immedok\fP, +\fB\%is_keypad\fP, +\fB\%is_leaveok\fP, +\fB\%is_nodelay\fP, +\fB\%is_notimeout\fP, +\fB\%is_pad\fP, +\fB\%is_scrollok\fP, +\fB\%is_subwin\fP, +\fB\%is_syncok\fP, +\fB\%wgetdelay\fP, +\fB\%wgetparent\fP, +\fB\%wgetscrreg\fP \- +obtain \fIcurses\fR window properties +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBbool is_cleared(const WINDOW *\fIwin\fP); +\fBbool is_idcok(const WINDOW *\fIwin\fP); +\fBbool is_idlok(const WINDOW *\fIwin\fP); +\fBbool is_immedok(const WINDOW *\fIwin\fP); +\fBbool is_keypad(const WINDOW *\fIwin\fP); +\fBbool is_leaveok(const WINDOW *\fIwin\fP); +\fBbool is_nodelay(const WINDOW *\fIwin\fP); +\fBbool is_notimeout(const WINDOW *\fIwin\fP); +\fBbool is_pad(const WINDOW *\fIwin\fP); +\fBbool is_scrollok(const WINDOW *\fIwin\fP); +\fBbool is_subwin(const WINDOW *\fIwin\fP); +\fBbool is_syncok(const WINDOW *\fIwin\fP); +.PP +\fBWINDOW * wgetparent(const WINDOW *\fIwin\fP); +\fBint wgetdelay(const WINDOW *\fIwin\fP); +\fBint wgetscrreg(const WINDOW *\fIwin\fP, int *\fItop\fP, int *\fIbottom\fP); +.fi +.SH DESCRIPTION +\fI\%ncurses\fP provides functions returning properties of a +\fI\%WINDOW\fP structure, +allowing it to be \*(``opaque\*('' if +the application defines the \fB\%NCURSES_OPAQUE\fP preprocessor symbol. +\fIOpacity\fP in this sense means that the members of \fIstruct\fP data +types are not directly accessible +(for instance, +through \*(``.\*('' or \*(``\->\*('' operators), +but instead must be queried and/or set via library functions. +Advantages of opacity include greater abstraction and improved +management of concurrent accesses to data structures, +keeping object states coherent. +.TP +\fBis_cleared\fP +returns the value set by \fB\%clearok\fP(3X). +.TP +\fBis_idcok\fP +returns the value set by \fB\%idcok\fP(3X). +.TP +\fBis_idlok\fP +returns the value set by \fB\%idlok\fP(3X). +.TP +\fBis_immedok\fP +returns the value set by \fB\%immedok\fP(3X). +.TP +\fBis_keypad\fP +returns the value set by \fB\%keypad\fP(3X). +.TP +\fBis_leaveok\fP +returns the value set by \fB\%leaveok\fP(3X). +.TP +\fBis_nodelay\fP +returns the value set by \fB\%nodelay\fP(3X). +.TP +\fBis_notimeout\fP +returns the value set by \fB\%notimeout\fP(3X). +.TP +\fBis_pad\fP +returns \fBTRUE\fP if the window is a pad; +that is, +it was created by \fB\%newpad\fP(3X). +.TP +\fBis_scrollok\fP +returns the value set by \fB\%scrollok\fP(3X). +.TP +\fBis_subwin\fP +returns \fBTRUE\fP if the window is a subwindow, +that is, +it was created by \fB\%subwin\fP(3X) or \fB\%derwin\fP(3X). +.TP +\fBis_syncok\fP +returns the value set by \fB\%syncok\fP(3X). +.TP +\fBwgetdelay\fP +returns the delay timeout set by \fB\%wtimeout\fP(3X). +.TP +\fBwgetparent\fP +returns the parent \fI\%WINDOW\fP pointer for subwindows, +or \fBNULL\fP for windows having no parent. +.TP +\fBwgetscrreg\fP +stores the the top and bottom rows for the scrolling margin set by +\fB\%wsetscrreg\fP(3X) in the corresponding arguments, +returning \fBERR\fP upon failure and \fBOK\fP upon successful +completion. +.SH RETURN VALUE +These functions return \fBTRUE\fP or \fBFALSE\fP except as noted. +.SH NOTES +\fI\%ncurses\fP provides both a C function and a preprocessor macro for +each function documented in this page. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on Version 7, BSD or System V implementations. +It is recommended that any code depending on \fI\%ncurses\fP extensions +be conditioned using \fB\%NCURSES_VERSION\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_inopts\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_threads\fP(3X), +\fB\%curs_window\fP(3X) diff --git a/contrib/ncurses/man/curs_outopts.3x b/contrib/ncurses/man/curs_outopts.3x new file mode 100644 index 00000000..920cd1e7 --- /dev/null +++ b/contrib/ncurses/man/curs_outopts.3x @@ -0,0 +1,233 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_outopts.3x,v 1.71 2024/09/14 20:06:50 tom Exp $ +.TH curs_outopts 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%clearok\fP, +\fB\%idcok\fP, +\fB\%idlok\fP, +\fB\%immedok\fP, +\fB\%leaveok\fP, +\fB\%scrollok\fP, +\fB\%setscrreg\fP, +\fB\%wsetscrreg\fP \- +set \fIcurses\fR output options +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint clearok(WINDOW *\fIwin\fP, bool \fIbf\fP); +\fBvoid idcok(WINDOW *\fIwin\fP, bool \fIbf\fP); +\fBint idlok(WINDOW *\fIwin\fP, bool \fIbf\fP); +\fBvoid immedok(WINDOW *\fIwin\fP, bool \fIbf\fP); +\fBint leaveok(WINDOW *\fIwin\fP, bool \fIbf\fP); +\fBint scrollok(WINDOW *\fIwin\fP, bool \fIbf\fP); +.PP +\fBint setscrreg(int \fItop\fP, int \fIbot\fP); +\fBint wsetscrreg(WINDOW *\fIwin\fP, int \fItop\fP, int \fIbot\fP); +.fi +.SH DESCRIPTION +These routines set options that change the style of output within +\fBcurses\fP. +All options are initially \fBFALSE\fP, unless otherwise stated. +It is not necessary to turn these options off before calling \fBendwin\fP(3X). +.SS clearok +If \fBclearok\fP is called with \fBTRUE\fP as argument, the next +call to \fBwrefresh\fP with this window will clear the screen completely and +redraw the entire screen from scratch. +This is useful when the contents of the +screen are uncertain, or in some cases for a more pleasing visual effect. +If +the \fIwin\fP argument to \fBclearok\fP is the global variable \fBcurscr\fP, +the next call to \fBwrefresh\fP with any window causes the screen to be cleared +and repainted from scratch. +.SS idcok +If \fBidcok\fP is called with \fBFALSE\fP as second argument, \fBcurses\fP +no longer considers using the hardware insert/delete character feature of +terminals so equipped. +Use of character insert/delete is enabled by default. +Calling \fBidcok\fP with \fBTRUE\fP as second argument re-enables use +of character insertion and deletion. +.SS idlok +If \fBidlok\fP is called with \fBTRUE\fP as second argument, \fBcurses\fP +considers using the hardware insert/delete line feature of terminals so +equipped. +Calling \fBidlok\fP with \fBFALSE\fP as second argument disables use +of line insertion and deletion. +This option should be enabled only if the +application needs insert/delete line, for example, for a screen editor. +It is +disabled by default because insert/delete line tends to be visually annoying +when used in applications where it is not really needed. +If insert/delete line +cannot be used, \fBcurses\fP redraws the changed portions of all lines. +.SS immedok +If \fBimmedok\fP is called with \fBTRUE\fP as second argument, +any change in the window image, +such as the ones caused by \fBwaddch, wclrtobot, wscrl\fP, +etc., automatically causes a call to \fBwrefresh\fP. +However, it may degrade performance considerably, +due to repeated calls to \fBwrefresh\fP. +Calling \fBimmedok\fP with \fBFALSE\fP as second argument +restores the default behavior, +i.e., deferring screen updates until a refresh is needed. +.SS leaveok +Normally, the hardware cursor is left at the location of the window cursor +being refreshed. +The \fBleaveok\fP option allows the cursor to be left +wherever the update happens to leave it. +It is useful for applications where +the cursor is not used, since it reduces the need for cursor motions. +.SS scrollok +The \fBscrollok\fP option controls what happens when the cursor of a window is +moved off the edge of the window or scrolling region, either as a result of a +newline action on the bottom line, or typing the last character of the last +line. +If disabled, (\fIbf\fP is \fBFALSE\fP), the cursor is left on the bottom +line. +If enabled, (\fIbf\fP is \fBTRUE\fP), the window is scrolled up one line +(Note that to get the physical scrolling effect on the terminal, it is +also necessary to call \fBidlok\fP). +.SS "setscrreg, wsetscrreg" +The \fBsetscrreg\fP and \fBwsetscrreg\fP routines allow the application +programmer to set a software scrolling region in a window. +The \fItop\fP and +\fIbot\fP parameters +are the line numbers of the top and bottom margin of the scrolling +region. +(Line 0 is the top line of the window.) If this option and +\fBscrollok\fP are enabled, an attempt to move off the bottom margin line +causes all lines in the scrolling region to scroll one line in the direction +of the first line. +Only the text of the window is scrolled. +(Note that this +has nothing to do with the use of a physical scrolling region capability in the +terminal, like that in the VT100. +If \fBidlok\fP is enabled and the terminal +has either a scrolling region or insert/delete line capability, they will +probably be used by the output routines.) +.SH RETURN VALUE +The functions \fBsetscrreg\fP and \fBwsetscrreg\fP return \fBOK\fP upon success +and \fBERR\fP upon failure. +All other routines that return an integer always +return \fBOK\fP. +.PP +In this implementation, +.bP +those functions that have a window pointer +will return +.B ERR +if the window pointer is null +.bP +\fBwsetscrreg\fP +returns +.B ERR +if the scrolling region limits extend outside the +window boundaries. +.SH NOTES +Note that +\fBclearok\fP, +\fBleaveok\fP, +\fBscrollok\fP, +\fBidcok\fP, and +\fBsetscrreg\fP may be macros. +.PP +The \fBimmedok\fP routine is useful for windows that are used as terminal +emulators. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +Some historic +.I curses +implementations, +as an undocumented feature, +did the equivalent of +.RB \*(`` \%clearok( .\|.\|. ", 1)" \*('' +when +.B \%touchwin(stdstr) +or +.B \%clear(stdstr) +were used. +This trick does not work with +.IR \%ncurses . +.PP +Early System\ V +.I curses +implementations specified that with +.B \%scrollok +enabled, +any window modification triggering a scroll +also forced a physical refresh. +X/Open Curses does not require this, +and +.I \%ncurses +avoids doing so to better optimize vertical motions upon a +\fB\%wrefresh\fP(3X). +.PP +X/Open Curses does not mention that the cursor should be +made invisible as a side-effect of +.BR \%leaveok . +SVr4 +.I curses +documentation notes this, +but the code neglects it. +Use \fB\%curs_set\fP(3X) to make the cursor invisible. +.SH HISTORY +.I \%ncurses +formerly treated \fBnl\fP(3X) and \fBnonl\fP(3X) as both input +.I and +output options, +but no longer; +see \fB\%curs_inopts\fP(3X). +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_clear\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_scroll\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_overlay.3x b/contrib/ncurses/man/curs_overlay.3x new file mode 100644 index 00000000..c4400637 --- /dev/null +++ b/contrib/ncurses/man/curs_overlay.3x @@ -0,0 +1,99 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2013,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_overlay.3x,v 1.45 2024/05/25 20:10:58 tom Exp $ +.TH curs_overlay 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.SH NAME +\fB\%overlay\fP, +\fB\%overwrite\fP, +\fB\%copywin\fP \- +overlay \fIcurses\fR windows and manipulate them +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint overlay(const WINDOW *\fIsrcwin\fP, WINDOW *\fIdstwin\fP); +\fBint overwrite(const WINDOW *\fIsrcwin\fP, WINDOW *\fIdstwin\fP); +\fBint copywin(const WINDOW *\fIsrcwin\fP, WINDOW *\fIdstwin\fP, int \fIsminrow\fP, + \fBint \fIsmincol\fB, int \fIdminrow\fB, int \fIdmincol\fB, int \fIdmaxrow\fB,\fR + \fBint \fIdmaxcol\fB, int \fIoverlay\fB);\fR +.fi +.SH DESCRIPTION +.SS "overlay, overwrite" +The \fBoverlay\fP and \fBoverwrite\fP routines overlay \fIsrcwin\fP on +top of \fIdstwin\fP. +\fIscrwin\fP and \fIdstwin\fP are not required +to be the same size; only text where the two windows overlap is copied. +The difference is that \fBoverlay\fP is non-destructive +(blanks are not copied) whereas \fBoverwrite\fP is destructive. +.SS copywin +The \fBcopywin\fP routine provides a finer granularity of control over the +\fBoverlay\fP and \fBoverwrite\fP routines. +As in the \fBprefresh\fP routine, +a rectangle is specified in the destination window, (\fIdminrow\fP, +\fIdmincol\fP) and (\fIdmaxrow\fP, \fIdmaxcol\fP), and the upper-left-corner +coordinates of the source window, (\fIsminrow\fP, \fIsmincol\fP). +If the argument \fIoverlay\fP is \fBtrue\fP, +then copying is non-destructive, +as in \fBoverlay\fP. +.SH RETURN VALUE +These routines return the integer \fBERR\fP upon failure and an \fBOK\fP +(SVr4 specifies only +\*(``an integer value other than \fBERR\fP\*('') +upon successful completion. +.PP +X/Open defines no error conditions. +In this implementation, +\fBcopywin\fP, +\fBoverlay\fP and \fBoverwrite\fP return +.B ERR +if either of the window pointers are null, or +if some part of the window would be placed off-screen. +.SH NOTES +Note that \fBoverlay\fP and \fBoverwrite\fP may be macros. +.SH PORTABILITY +These functions are described in X/Open Curses, Issue 4, +which adds \fI\%const\fP qualifiers to the arguments. +It further specifies their behavior in the presence of characters +with multibyte renditions (not yet supported in this implementation). +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_pad\fP(3X), +\fB\%curs_refresh\fP(3X) diff --git a/contrib/ncurses/man/curs_pad.3x b/contrib/ncurses/man/curs_pad.3x new file mode 100644 index 00000000..575722c3 --- /dev/null +++ b/contrib/ncurses/man/curs_pad.3x @@ -0,0 +1,302 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_pad.3x,v 1.67 2024/07/27 19:55:45 tom Exp $ +.TH curs_pad 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%newpad\fP, +\fB\%subpad\fP, +\fB\%prefresh\fP, +\fB\%pnoutrefresh\fP, +\fB\%pechochar\fP, +\fB\%pecho_wchar\fP \- +create and display \fIcurses\fR pads +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBWINDOW *newpad(int \fInlines\fP, int \fIncols\fP); +\fBWINDOW *subpad(WINDOW *\fIparent\fP, int \fInlines\fP, int \fIncols\fP, + \fBint \fIbegin_y\fB, int \fIbegin_x\fB);\fR +.PP +\fBint prefresh(WINDOW *\fIpad\fB, int \fIpminrow\fB, int \fIpmincol\fB,\fR + \fBint \fIsminrow\fB, int \fIsmincol\fB, int \fIsmaxrow\fB, int \fIsmaxcol\fB);\fR +\fBint pnoutrefresh(WINDOW *\fIpad\fB, int \fIpminrow\fB, int \fIpmincol\fB,\fR + \fBint \fIsminrow\fB, int \fIsmincol\fB, int \fIsmaxrow\fB, int \fIsmaxcol\fB);\fR +.PP +\fBint pechochar(WINDOW *\fIpad\fB, chtype \fIch\fB);\fR +\fBint pecho_wchar(WINDOW *\fIpad\fB, const cchar_t *\fIwch\fB);\fR +.fi +.SH DESCRIPTION +A +.I curses +.I 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, +only part of which is to be visible on the screen. +Pads are not automatically refreshed by scrolling or input-echoing +operations. +.PP +Pads cannot be refreshed with \fB\%wrefresh\fP(3X); +use +.B \%prefresh +or +.B \%pnoutrefresh +instead. +.SS newpad +.B \%newpad +creates and returns a pointer to a new pad data structure +with the given number of lines, +.IR nlines , +and columns, +.IR ncols . +.SS subpad +.B \%subpad +creates and returns a pointer to a subwindow within a pad +with the given number of lines, +.IR nlines , +and columns, +.IR ncols . +Unlike \fB\%subwin\fP(3X), +which uses screen coordinates, +the new pad is placed at position +.RI ( begin_y , +.IR begin_x ) +relative to its parent. +Thus, +changes made to one pad can affect both. +When operating on a subpad, +it is often necessary to call \fB\%touchwin\fP(3X) or +\fB\%touchline\fP(3X) on +.I parent +before calling +.BR \%prefresh . +.SS "prefresh, pnoutrefresh" +.B \%prefresh +and +.B \%pnoutrefresh +are analogous to \fB\%wrefresh\fP(3X) and \fB\%wnoutrefresh\fP(3X) +except that they operate on pads rather than windows. +They require additional parameters are needed to indicate what portions +of the pad and screen are involved. +.bP +.I pminrow +and +.I pmincol +specify the upper left-hand corner of a rectangular view of the pad. +.bP +.IR sminrow , +.IR smincol , +.IR smaxrow , +and +.I smaxcol +specify the vertices of the rectangle to be displayed on the screen. +.PP +The lower right-hand corner +of the rectangle to be displayed in the pad +is calculated from the screen coordinates, +since the rectangles must be the same size. +Both rectangles must be entirely contained +within their respective structures. +.I curses +treats +negative values of any of these parameters as zero. +.SS pechochar +.B \%pechochar +is functionally equivalent to calling \fB\%waddch\fP(3X) followed by +.BR \%prefresh . +It suggests to the +.I curses +optimizer that only a single character is being output; +a considerable performance benefit may be thus enjoyed. +The location of the character +.I ch +written to the pad is used to populate the arguments to +.BR \%prefresh . +.SS pecho_wchar +.B \%pecho_wchar +is functionally equivalent to calling \fB\%wadd_wch\fP(3X) followed by +.BR \%prefresh . +It suggests to the +.I curses +optimizer that only a single wide character is being output; +a considerable performance benefit may be thus enjoyed. +The location of the character +.I wch +written to the pad is used to populate the arguments to +.BR \%prefresh . +.SH RETURN VALUE +Functions that return an integer return +.B ERR +upon failure and +.B OK +(SVr4 specifies only +\*(``an integer value other than +.BR ERR \*('') +upon successful completion. +.PP +Functions that return pointers return +.B NULL +on error, +and set +.I \%errno +to +.BR \%ENOMEM "." +.PP +In this implementation +.RS 3 +.TP 5 +.BR prefresh\ and\ pnoutrefresh +return +.B ERR +if the window pointer is null, or +if the window is not really a pad or +if the area to refresh extends off-screen or +if the minimum coordinates are greater than the maximum. +.TP 5 +.B pechochar +returns +.B ERR +if the window is not really a pad, +and the associated call to +.B \%wechochar +returns +.BR ERR "." +.TP 5 +.B pecho_wchar +returns +.B ERR +if the window is not really a pad, +and the associated call to +.B \%wecho_wchar +returns +.BR ERR "." +.RE +.SH NOTES +.B \%pechochar +may be a macro. +.SH PORTABILITY +BSD +.I curses +has no +.I pad +feature. +.PP +SVr2 \fIcurses\fP (1986) provided the \fB\%newpad\fP and related functions, +documenting them in a single line each. +SVr3 (1987) provided more extensive documentation. +.PP +The documentation does not explain the term \fIpad\fP. +However, the Apollo \fIAegis\fP workstation operating system +supported a graphical \fIpad\fP feature: +.bP +These graphical pads could be much larger than the computer's display. +.bP +The read-only output from a command could be scrolled back to inspect, +and select text from the pad. +.PP +The two uses may be related. +.PP +X/Open Curses, Issue 4 describes these functions, +without significant change from the SVr3 documentation. +It specifies no error conditions for them. +The behavior of \fB\%subpad\fP if the parent window is not +a pad is undocumented, +and is not checked by the vendor Unix implementations: +.bP +SVr4 \fIcurses\fP sets a flag in the \fI\%WINDOW\fP structure in +\fB\%newpad\fP which tells if the window is a \fIpad\fP. +.IP +However, it uses this information only in +\fB\%waddch\fP (to decide if it should call \fB\%wrefresh\fP) and +\fB\%wscrl\fP (to avoid scrolling a pad), +and does not check in \fB\%wrefresh\fP to ensure that the pad +is refreshed properly. +.bP +Solaris \fI\%xcurses\fP checks whether a window is a pad in +\fB\%wnoutrefresh\fP, +returning \fBERR\fP in that case. +.IP +However, +it only sets the flag for subwindows if the parent window is a pad. +Its \fB\%newpad\fP function does not set this information. +Consequently, the check will never fail. +.IP +It makes no comparable check in \fB\%pnoutrefresh\fP, +though interestingly enough, a comment in the source code +states that the lack of a check was an MKS extension. +.bP +NetBSD 7 \fIcurses\fP +sets a flag in the \fI\%WINDOW\fP structure +for \fB\%newpad\fP and \fB\%subpad\fP, +using this to help with the distinction between \fB\%wnoutrefresh\fP +and \fB\%pnoutrefresh\fP. +.IP +It does not check for the case where a subwindow is created in +a pad using \fB\%subwin\fP or \fB\%derwin\fP. +.IP +The \fB\%dupwin\fP function returns a regular window when duplicating a pad. +Likewise, \fB\%getwin\fP always returns a window, even if the saved +data was from a pad. +.PP +This implementation +.bP +sets a flag in the \fI\%WINDOW\fP structure +for \fB\%newpad\fP and \fB\%subpad\fP, +.bP +allows a \fB\%subwin\fP or \fB\%derwin\fP call to succeed having a pad parent by +forcing the subwindow to be a pad, +.bP +checks in both \fB\%wnoutrefresh\fP and \fB\%pnoutrefresh\fP to ensure +that pads and windows are handled distinctly, and +.bP +ensures that \fB\%dupwin\fP and \fB\%getwin\fP treat +pads versus windows consistently. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_addch\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_touch\fP(3X) diff --git a/contrib/ncurses/man/curs_print.3x b/contrib/ncurses/man/curs_print.3x new file mode 100644 index 00000000..21f4f841 --- /dev/null +++ b/contrib/ncurses/man/curs_print.3x @@ -0,0 +1,138 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_print.3x,v 1.40 2024/07/27 20:03:57 tom Exp $ +.TH curs_print 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%mcprint\fP \- +write binary data to printer using \fIterminfo\fR capabilities +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint mcprint(char * \fIdata\fP, int \fIlen\fP); +.fi +.SH DESCRIPTION +.BR \%mcprint "," +an +.I \%ncurses +extension to the +.I curses +library, +uses the terminal's +.B \%prtr_non +.RB ( mc5p ) +or +.B \%prtr_on +.RB ( mc5 ) +and +.B \%prtr_off +.RB ( mc4 ) +media copy capabilities, +if defined, +to send +.I len +bytes of the given string +.I data +to a printer attached to the terminal. +.PP +.B \%mcprint +has no means of flow control to the printer +nor of knowing how much buffering it has. +Your application is responsible +for keeping the rate of writes to the printer +below its continuous throughput rate, +typically about half of its nominal characters-per-second (cps) rating. +Dot-matrix printers and +6-page-per-minute laser printers can typically handle 80 cps, +so a conservative rule of thumb +is to sleep for one second after sending an 80-character line. +.SH RETURN VALUE +On success, +.B \%mcprint +returns the number of characters sent to the printer. +.PP +.B \%mcprint +returns +.B ERR +if the write operation fails for any reason. +In that event, +.B errno +contains either a value set by \fIwrite\fP(2), +or one of the following. +.TP 5 +\fBENODEV\fP +The terminal lacks relevant media copy capabilities. +.TP 5 +\fBENOMEM\fP +.I \%ncurses +could not allocate sufficient memory to buffer the write operation. +.SH EXTENSIONS +.B \%mcprint +is an \fB\%ncurses\fP(3X) extension, +and is not found in SVr4 +.IR curses "," +4.4BSD +.IR curses "," +or any other previous +.I curses +implementation. +.SH PORTABILITY +Applications employing this +.I \%ncurses +extension should condition its use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.SH HISTORY +.I \%ncurses +introduced +.I \%mcprint +prior to version 1.9.9g (1996). +.SH BUGS +Padding in the +.B \%prtr_non +.RB ( mc5p ), +.B \%prtr_on +.RB ( mc5 ), +and +.B \%prtr_off +.RB ( mc4 ) +capabilities is not interpreted. +.SH SEE ALSO +\fB\%curses\fP(3X) diff --git a/contrib/ncurses/man/curs_printw.3x b/contrib/ncurses/man/curs_printw.3x new file mode 100644 index 00000000..282536b3 --- /dev/null +++ b/contrib/ncurses/man/curs_printw.3x @@ -0,0 +1,205 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_printw.3x,v 1.53 2024/04/20 19:18:18 tom Exp $ +.TH curs_printw 3X 2024-04-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%printw\fP, +\fB\%wprintw\fP, +\fB\%mvprintw\fP, +\fB\%mvwprintw\fP, +\fB\%vwprintw\fP, +\fB\%vw_printw\fP \- +write formatted output to a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint printw(const char *\fIfmt\fP, ...); +\fBint wprintw(WINDOW *\fIwin\fP, const char *\fIfmt\fP, ...); +\fBint mvprintw(int \fIy\fP, int \fIx\fP, const char *\fIfmt\fP, ...); +\fBint mvwprintw(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const char *\fIfmt\fP, ...); +.PP +\fBint vw_printw(WINDOW *\fIwin\fP, const char *\fIfmt\fP, va_list \fIvarglist\fP); +.PP +\fI/* obsolete */\fP +\fBint vwprintw(WINDOW *\fIwin\fP, const char *\fIfmt\fP, va_list \fIvarglist\fP); +.fi +.SH DESCRIPTION +\fB\%printw\fP, +\fB\%wprintw\fP, +\fB\%mvprintw\fP, +and +\fB\%mvwprintw\fP +are analogous to \fI\%printf\fP(3). +In effect, +the string that would be output by \fI\%printf\fP(3) is instead output +as though \fB\%waddstr\fP(3X) were used with +.I win +(or +.BR \%stdscr ) +as its first argument. +.PP +\fB\%vwprintw\fP +and +\fB\%vw_printw\fP are analogous to \fI\%vprintf\fP(3), +and perform a \fB\%wprintw\fP using a variable argument list. +The third argument is a \fI\%va_list\fP, +a pointer to a list of arguments, +as defined in \fI\%stdarg.h\fP. +.SH RETURN VALUE +These functions return +.B ERR +upon failure and +.B OK +upon success. +.PP +In +.IR \%ncurses , +failure occurs if the library cannot allocate enough memory for the +buffer into which the output is formatted, +or if the window pointer +.I win +is null. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +No wide character counterpart functions are defined by the +\*(``wide\*('' +.I \%ncurses +configuration nor by any standard. +To format and write a wide-character string to a +.I curses +window, +consider using \fI\%swprintf\fP(3) and \fB\%waddwstr\fP(3X) or similar. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +.I \%ncurses +defines \fB\%vw_printw\fP and \fB\%vwprintw\fP identically to support +legacy applications. +However, +the latter is obsolete. +.bP +X/Open Curses, +Issue 4 Version 2 (1996), +marked \fB\%vwprintw\fP as requiring \fI\%varargs.h\fP and +\*(``TO BE WITHDRAWN\*('', +and specified \fB\%vw_printw\fP using the \fI\%stdarg.h\fP interface. +.bP +X/Open Curses, Issue 5, Draft 2 +(December 2007) marked \fBvwprintw\fP (along with +\fBvwscanw\fP and the \fItermcap\fP interface) as withdrawn. +After incorporating review comments, +this became +X/Open Curses, Issue 7 (2009). +.bP +.I \%ncurses +provides \fB\%vwprintw\fP, +but marks it as deprecated. +.SH HISTORY +While \fB\%printw\fP was implemented in 4BSD +(November 1980), +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/src/lib/\ +.\" libcurses/printw.c +it was unused until 4.2BSD +(August 1983), +which employed it for games. +That early version of +.I curses +preceded the ANSI C standard of 1989. +It did not use \fI\%varargs.h\fP, +though that had been available since Seventh Edition Unix (1979). +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/include/\ +.\" varargs.h +In 1991 +(a couple of years after SVr4 was generally available, +and after the C standard was published), +other developers updated the library, +using \fI\%stdarg.h\fP internally in 4.4BSD +.IR curses . +Even with this improvement, +BSD +.I curses +did not use function prototypes +(nor even declare functions) +in \fI\%curses.h\fP until 1992. +.PP +SVr2 (1984) documented \fB\%printw\fP and \fB\%wprintw\fP tersely as +\*(``printf on \fB\%stdscr\fP\*('' and +\*(``printf on \fIwin\fP\*('', +respectively. +.PP +SVr3 (1987) added \fB\%mvprintw\fP and \fB\%mvwprintw\fP, +with a three-line summary asserting that they were analogous to +\fI\%printf\fP(3), +explaining that the string that \fI\%printf\fP(3) would write to the +standard output stream would instead be output using \fB\%waddstr\fP to +the given window. +SVr3 also implemented \fB\%vwprintw\fP, +describing its third parameter as a \fI\%va_list\fP, +defined in \fI\%varargs.h\fP, +and referred the reader to the manual pages for \fI\%varargs\fP and +\fI\%vprintf\fP for detailed descriptions. +.PP +SVr4 (1989) introduced no new variations of \fI\%printw\fP, +but provided for using either \fI\%varargs.h\fP or \fI\%stdarg.h\fP to +define the \fI\%va_list\fP type. +.\" either header declares "va_list", but only one can be used +.PP +X/Open Curses, Issue 4 (1995), +defined \fB\%vw_printw\fP to replace \fB\%vwprintw\fP, +stating that its \fI\%va_list\fP type is defined in \fI\%stdarg.h\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_addstr\fP(3X), +\fB\%curs_scanw\fP(3X), +\fB\%printf\fP(3), +\fB\%vprintf\fP(3) diff --git a/contrib/ncurses/man/curs_refresh.3x b/contrib/ncurses/man/curs_refresh.3x new file mode 100644 index 00000000..cd50712b --- /dev/null +++ b/contrib/ncurses/man/curs_refresh.3x @@ -0,0 +1,168 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_refresh.3x,v 1.52 2024/09/14 20:06:50 tom Exp $ +.TH curs_refresh 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%doupdate\fP, +\fB\%redrawwin\fP, +\fB\%refresh\fP, +\fB\%wnoutrefresh\fP, +\fB\%wredrawln\fP, +\fB\%wrefresh\fP \- +refresh \fIcurses\fR windows or lines thereupon +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint refresh(void); +\fBint wrefresh(WINDOW *\fIwin\fP); +\fBint wnoutrefresh(WINDOW *\fIwin\fP); +\fBint doupdate(void); +.PP +\fBint redrawwin(WINDOW *\fIwin\fP); +\fBint wredrawln(WINDOW *\fIwin\fP, int \fIbeg_line\fP, int \fInum_lines\fP); +.fi +.SH DESCRIPTION +.SS "refresh, wrefresh" +The \fBrefresh\fP and \fBwrefresh\fP routines (or \fBwnoutrefresh\fP and +\fBdoupdate\fP) must be called to get actual output to the terminal, +as other routines merely manipulate data structures. +The routine \fBwrefresh\fP copies +the named window to the \fIphysical screen\fP, +taking into account what is already there to do optimizations. +The \fBrefresh\fP routine is the +same, using \fBstdscr\fP as the default window. +Unless \fBleaveok\fP(3X) has been +enabled, the physical cursor of the terminal is left at the location of the +cursor for that window. +.SS "wnoutrefresh, doupdate" +The \fBwnoutrefresh\fP and \fBdoupdate\fP routines allow multiple updates with +more efficiency than \fBwrefresh\fP alone. +In addition to all the window +structures, \fBcurses\fP keeps two data structures representing the terminal +screen: +.bP +a \fIphysical screen\fP, +describing what is actually on the screen, and +.bP +a \fIvirtual screen\fP, +describing what the programmer wants to have on the screen. +.PP +The routine \fBwrefresh\fP works by +.bP +first calling \fBwnoutrefresh\fP, +which copies the named window to the \fIvirtual screen\fP, and +.bP +then calling \fBdoupdate\fP, which compares +the \fIvirtual screen\fP to the \fIphysical screen\fP +and does the actual update. +.PP +If the programmer wishes to output several windows at once, a series +of calls to \fBwrefresh\fP results in alternating calls to \fBwnoutrefresh\fP +and \fBdoupdate\fP, causing several bursts of output to the screen. +By first +calling \fBwnoutrefresh\fP for each window, it is then possible to call +\fBdoupdate\fP once, resulting in only one burst of output, with fewer total +characters transmitted and less CPU time used. +.PP +If the \fIwin\fP argument to +\fBwrefresh\fP is the \fIphysical screen\fP +(i.e., the global variable \fBcurscr\fP), +the screen is immediately cleared and repainted from scratch. +.PP +The phrase \*(``copies the named window +to the virtual screen\*('' above is ambiguous. +What actually happens is that all \fItouched\fP (changed) lines in the window +are copied to the virtual screen. +This affects programs that use overlapping +windows; it means that if two windows overlap, you can refresh them in either +order and the overlap region will be modified only when it is explicitly +changed. +(But see the section on \fBPORTABILITY\fP below for a warning about +exploiting this behavior.) +.SS "wredrawln, redrawwin" +The \fBwredrawln\fP routine indicates to \fBcurses\fP that some screen lines +are corrupted and should be thrown away before anything is written over them. +It touches the indicated lines (marking them changed). +The routine \fBredrawwin\fP touches the entire window. +.SH RETURN VALUE +These routines return the integer \fBERR\fP upon failure and \fBOK\fP +(SVr4 specifies only +\*(``an integer value other than \fBERR\fP\*('') +upon successful completion. +.PP +In this implementation +.RS 3 +.TP 5 +\fBwnoutrefresh\fP +returns +.B ERR +if the window pointer is null, or +if the window is really a pad. +.TP 5 +\fBwredrawln\fP +return +.B ERR +if the associated call to \fBtouchln\fP returns +.BR ERR "." +.RE +.SH NOTES +Note that \fBrefresh\fP and \fBredrawwin\fP may be macros. +.SH PORTABILITY +X/Open Curses, Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +Whether \fBwnoutrefresh\fP copies to the virtual screen the entire contents +of a window or just its changed portions has never been well-documented in +historic curses versions (including SVr4). +It might be unwise to rely on +either behavior in programs that might have to be linked with other curses +implementations. +Instead, you can do an explicit \fBtouchwin\fP before the +\fBwnoutrefresh\fP call to guarantee an entire-contents copy anywhere. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_outopts\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_scanw.3x b/contrib/ncurses/man/curs_scanw.3x new file mode 100644 index 00000000..409c297f --- /dev/null +++ b/contrib/ncurses/man/curs_scanw.3x @@ -0,0 +1,255 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_scanw.3x,v 1.53 2024/04/20 19:18:18 tom Exp $ +.TH curs_scanw 3X 2024-04-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%scanw\fP, +\fB\%wscanw\fP, +\fB\%mvscanw\fP, +\fB\%mvwscanw\fP, +\fB\%vwscanw\fP, +\fB\%vw_scanw\fP \- +read formatted input from a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint scanw(const char *\fIfmt\fP, ...); +\fBint wscanw(WINDOW *\fIwin\fP, const char *\fIfmt\fP, ...); +\fBint mvscanw(int \fIy\fP, int \fIx\fP, const char *\fIfmt\fP, ...); +\fBint mvwscanw(WINDOW *\fIwin\fP, int \fIy\fP, int \fIx\fP, const char *\fIfmt\fP, ...); +.PP +\fBint vw_scanw(WINDOW *\fIwin\fP, const char *\fIfmt\fP, va_list \fIvarglist\fP); +.PP +\fI/* obsolete */\fP +\fBint vwscanw(WINDOW *\fIwin\fP, const char *\fIfmt\fP, va_list \fIvarglist\fP); +.fi +.SH DESCRIPTION +\fB\%scanw\fP, +\fB\%wscanw\fP, +\fB\%mvscanw\fP, +and +\fB\%mvwscanw\fP +are analogous to \fI\%scanf\fP(3). +In effect, +they call \fB\%wgetstr\fP(3X) with +.I win +(or +.BR \%stdscr ) +as its first argument, +then attempt conversion of the resulting string with \fI\%vsscanf\fP(3). +Fields in the string that do not map to a variable in the \fIfmt\fP +parameter are discarded. +.PP +\fB\%vwscanw\fP +and +\fB\%vw_scanw\fP are analogous to \fI\%vscanf\fP(3), +and perform a \fB\%wscanw\fP using a variable argument list. +The third argument is a \fI\%va_list\fP, +a pointer to a list of arguments, +as defined in \fI\%stdarg.h\fP. +.SH RETURN VALUE +These functions return +.B ERR +upon failure and otherwise a count of successful conversions; +this quantity may be zero. +.PP +In +.IR \%ncurses , +failure occurs if \fI\%vsscanf\fP(3) returns +\fBEOF\fP, +or if the window pointer +.I win +is null. +.PP +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH NOTES +No wide character counterpart functions are defined by the +\*(``wide\*('' +.I \%ncurses +configuration nor by any standard. +They are unnecessary: +to retrieve and convert a wide-character string from a +.I curses +terminal keyboard, +use these functions with the \fI\%scanf\fP(3) conversions \*(``%lc\*('' +and \*(``%ls\*('' for wide characters and strings, +respectively. +.PP +.I \%ncurses +implements \fI\%vsscanf\fP(3) internally if it is unavailable when the +library is configured. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.PP +.I \%ncurses +defines \fB\%vw_scanw\fP and \fB\%vwscanw\fP identically to support +legacy applications. +However, +the latter is obsolete. +.bP +X/Open Curses, +Issue 4 Version 2 (1996), +marked \fB\%vwscanw\fP as requiring \fI\%varargs.h\fP and +\*(``TO BE WITHDRAWN\*('', +and specified \fB\%vw_scanw\fP using the \fI\%stdarg.h\fP interface. +.bP +X/Open Curses, +Issue 5, +Draft 2 (December 2007) marked \fB\%vwscanw\fP (along with +\fB\%vwscanw\fP and the \fItermcap\fP interface) as withdrawn. +After incorporating review comments, +this became +X/Open Curses, Issue 7 (2009). +.bP +.I \%ncurses +provides \fB\%vwscanw\fP, +but marks it as deprecated. +.PP +X/Open Curses Issues 4 and 7 both state that these functions return +\fBERR\fP or \fBOK\fP. +This is likely an erratum. +.bP +Since the underlying \fI\%scanf\fP(3) returns the number of successful +conversions, +and SVr4 +.I curses +was documented to use this feature, +this may have been an editorial solecism introduced by X/Open, +rather than an intentional change. +.bP +This implementation retains compatibility with SVr4 +.IR curses . +As of 2018, +NetBSD +.I curses +also returns the number of successful conversions. +Both +.I \%ncurses\fP +and NetBSD +.I curses +call \fI\%vsscanf\fP(3) to scan the string, +which returns \fBEOF\fP on error. +.bP +Portable applications should test only if the return value is \fBERR\fP, +and not compare it to \fBOK\fP, +since that value (zero) might be misleading. +.IP +One portable way to get useful results would be to use a \*(``%n\*('' +conversion at the end of the format string, +and check the value of the corresponding variable to determine how many +conversions succeeded. +.SH HISTORY +\fB\%scanw\fP was implemented in 4BSD +(November 1980); +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/src/lib/\ +.\" libcurses/scanw.c +that early version of +.I curses +preceded the ANSI C standard of 1989. +The function was unused in Berkeley distributions for over ten years, +until 4.4BSD, +which employed it in a game. +The 4BSD \fB\%scanw\fP did not use \fI\%varargs.h\fP, +though that had been available since Seventh Edition Unix (1979). +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/include/\ +.\" varargs.h +In 1991 +(a couple of years after SVr4 was generally available, +and after the C standard was published), +other developers updated the library, +using \fI\%stdarg.h\fP internally in 4.4BSD +.IR curses . +Even with this improvement, +BSD +.I curses +did not use function prototypes +(nor even declare functions) +in \fI\%curses.h\fP until 1992. +.PP +SVr2 (1984) documented \fB\%scanw\fP and \fB\%wscanw\fP tersely as +\*(``scanf through \fB\%stdscr\fP\*('' and +\*(``scanf through \fIwin\fP\*('', +respectively. +.PP +SVr3 (1987) added +\fB\%mvscanw\fP, and +\fB\%mvwscanw\fP, stating +.RS +.PP +\*(``[t]hese routines correspond to \fIscanf\fP(3S), +as do their arguments and return values. +\fB\%wgetstr\fP() is called on the window, +and the resulting line is used as input for the scan.\*('' +.RE +.PP +SVr3 also implemented \fB\%vwscanw\fP, +describing its third parameter as a \fI\%va_list\fP, +defined in \fI\%varargs.h\fP, +and referred the reader to the manual pages for \fI\%varargs\fP and +\fI\%vprintf\fP for detailed descriptions. +(Because the SVr3 documentation does not mention \fI\%vscanf\fP, +the reference to \fI\%vprintf\fP might not be an error). +.PP +SVr4 (1989) introduced no new variations of \fI\%scanw\fP, +but provided for using either \fI\%varargs.h\fP or \fI\%stdarg.h\fP to +define the \fI\%va_list\fP type. +.\" either header declares "va_list", but only one can be used +.PP +X/Open Curses, Issue 4 (1995), +defined \fI\%vw_scanw\fP to replace \fI\%vwscanw\fP, +stating that its \fI\%va_list\fP type is defined in \fI\%stdarg.h\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_getstr\fP(3X), +\fB\%curs_printw\fP(3X), +\fB\%scanf\fP(3), +\fB\%vscanf\fP(3) diff --git a/contrib/ncurses/man/curs_scr_dump.3x b/contrib/ncurses/man/curs_scr_dump.3x new file mode 100644 index 00000000..0cde3da8 --- /dev/null +++ b/contrib/ncurses/man/curs_scr_dump.3x @@ -0,0 +1,236 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_scr_dump.3x,v 1.49 2024/09/21 09:30:22 tom Exp $ +.TH curs_scr_dump 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%scr_dump\fP, +\fB\%scr_restore\fP, +\fB\%scr_init\fP, +\fB\%scr_set\fP \- +read/write a \fIcurses\fR screen from/to a file +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint scr_dump(const char * \fIfilename\fP); +\fBint scr_restore(const char * \fIfilename\fP); +\fBint scr_init(const char * \fIfilename\fP); +\fBint scr_set(const char * \fIfilename\fP); +.fi +.SH DESCRIPTION +.I curses +provides applications the ability to write the contents of the screen +to a file and read them back. +To read/write a window +(rather than the whole screen) +from/to a file, +use \fB\%getwin\fP(3X) and +\fB\%putwin\fP(3X), +respectively. +.SS scr_dump +.B \%scr_dump +writes to +.I filename +the contents of the virtual screen; +see \fB\%curscr\fP(3X). +.SS scr_restore +.B \%scr_restore +updates the virtual screen to match the contents of +.I filename +(if validly written with +.BR \%scr_dump ")." +.I curses +does not perform a refresh; +after making any desired changes, +call \fB\%doupdate\fP(3X) or similar. +.SS scr_init +.B \%scr_init +reads +.IR filename "," +using it to initialize +.I curses +data structures describing the state of the terminal screen. +.I curses +then, +if it decides the terminal state is valid, +bases its next update of the screen on this information rather than +clearing it and starting from scratch. +.PP +.I curses +regards the terminal as in an invalid state for computation of updates +based on the contents of +.I filename +if +.bP +.I curses +knows that the terminal has been written to since the preceding +.B \%scr_dump +call, +or +.bP +the terminal type supports the +.I \%term\%info +capabilities +.B \%exit_ca_mode +.RB \%( rmcup ) +or +.B \%non_rev_rmcup +.RB \%( nrrmc ). +.PP +Either of the foregoing conditions means that +.I curses +cannot assume that the terminal's contents +match their representation in +.IR filename "." +The former is due to terminal features +(such as \fI\%xterm\fP(1)'s \*(``alternate screen\*('') +that couple cursor-positioning mode with a local cache of screen +contents. +.I curses +cannot know whether the terminal is displaying from that local cache +at the time the application calls +.BR \%scr_init "," +so it makes a pessimistic assumption that a full redraw is required; +see subsection \*(``Cursor Motions\*('' of \fB\%terminfo\fP(5). +.PP +.B \%scr_init +could be used after \fB\%initscr\fP(3X) or \fI\%system\fP(3) to share +the screen with another process that has done a +.B \%scr_dump +after \fB\%endwin\fP(3X). +An application that supports suspending its state on exit and subsequent +resumption upon later execution might use +.B \%scr_dump +and +.B \%scr_init +thus. +.SS scr_set +.B \%scr_set +combines +.B \%scr_restore +and +.BR \%scr_init "," +synchronizing the contents of +.I filename +with the virtual screen. +It can be regarded as a screen inheritance function; +consider a real-time screen-sharing application. +.SH RETURN VALUE +These functions return +.B OK +on success and +.B ERR +on failure. +.PP +In +.IR \%ncurses "," +each function returns +.B ERR +if it cannot open +.IR filename "." +.BR \%scr_init "," +.BR \%scr_restore "," +and +.B \%scr_set +return +.B ERR +if the contents of +.I filename +are invalid. +.SH NOTES +.BR \%scr_init "," +.BR \%scr_restore "," +and +.B \%scr_set +may be implemented as macros. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +.\" Unusually, SVID 4 explicitly indicated "OK" as a possible return +.\" value, rather than the "integer other than ERR" refrain (p. 529). +.PP +.\" SVID 4, p. 529 +SVr4 omitted the +.I \%const +qualifiers. +.PP +SVr4 documentation describes +.B \%scr_init +such that the dump data is also considered invalid +\*(``if the time-stamp of the tty is old\*('' +but does not define \*(``old\*(''. +.PP +As of 2024, PDCurses provides these functions. +NetBSD curses does not provide these functions, +although it provides \fB\%getwin\fP. +.PP +Other implementations of curses store the window in binary form. +One drawback to binary form is that this makes the dump dependent upon +the curses library's internal data structures. +Rather than do that, ncurses stores the dump in textual form, +allowing more flexible use of the data. +For instance, SVr4 curses \fB\%scr_restore\fP requires that the +dumped window have the same dimensions as the restored window. +ncurses uses \fB\%wresize\fP to adjust the restored window size. +.SH HISTORY +SVr3 (1987) introduced +.BR \%scr_dump "," +.BR \%scr_init "," +and +.BR \%scr_restore "." +SVr3.1 added +.BR \%scr_set "." +.SH SEE ALSO +.na +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_util\fP(3X), +\fB\%system\fP(3), +\fB\%scr_dump\fP(5), +\fB\%terminfo\fP(5), +\fB\%wresize\fP(3X) +.ad diff --git a/contrib/ncurses/man/curs_scroll.3x b/contrib/ncurses/man/curs_scroll.3x new file mode 100644 index 00000000..1db9532a --- /dev/null +++ b/contrib/ncurses/man/curs_scroll.3x @@ -0,0 +1,167 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_scroll.3x,v 1.49 2024/09/22 14:08:11 tom Exp $ +.TH curs_scroll 3X 2024-09-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%scroll\fP, +\fB\%scrl\fP, +\fB\%wscrl\fP \- +scroll a \fIcurses\fP window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint scroll(WINDOW * \fIwin\fP); +.PP +\fBint scrl(int \fIn\fP); +\fBint wscrl(WINDOW * \fIwin\fP, int \fIn\fP); +.fi +.SH DESCRIPTION +.B scroll +scrolls the given window up one line. +That is, +every visible line we might number +.I i +becomes line +.IR i "\-1." +The text of the top line in the window disappears and the bottom line +is populated with the background character; +see \fB\%bkgd\fP(3X) +(wide-character API users: \fB\%bkgrnd\fP(3X)). +As an optimization, +if the scrolling region of the window is the entire screen, +the physical screen may be scrolled at the same time; +see \fB\%curscr\fP(3X). +.PP +.B \%scrl +and +.B \%wscrl +scrolls the specified window +.I win +up or down per the sign of +.IR n "." +.bP +For positive +.IR n "," +line +.IR i + n +becomes +.I i +(scrolling up); +.bP +for negative +.IR n "," +line +.IR i \- n +becomes +.I i +(scrolling down). +\fB\%ncurses\fP(3X) describes the +.B \%scrl +variant of this function. +.PP +The cursor does not move. +These functions perform no operation unless scrolling is enabled for the +window via \fB\%scrollok\fP(3X). +.SH "RETURN VALUE" +These functions return +.B ERR +upon failure and +.B OK +upon success. +.PP +.I \%ncurses +returns +.B ERR +if scrolling is not enabled in the window, +for example with \fB\%scrollok\fP(3X), +or if the +.I \%WINDOW +pointer is null. +.SH NOTES +.B \%scrl +and +.B \%wscrl +may be implemented as macros. +.PP +Unusually, +there is no +.B \%wscroll +function; +.B scroll +behaves as one would expect +.B \%wscroll +to, +accepting a +.I \%WINDOW +pointer argument. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions. +It defines no error conditions. +.PP +SVr4 specifies only +\*(``an integer value other than +.BR ERR \*('' +as a successful return value. +.PP +SVr4 indicates that the optimization of physically scrolling immediately +if the scroll region is the entire screen \*(``is\*('' performed, +not \*(``may be\*('' performed. +.I \%ncurses +deliberately does not guarantee that this occurs, +to leave open the possibility of better optimization of multiple scroll +actions on the next update. +.PP +Neither SVr4 +.I curses +nor X/Open Curses specify whether these functions zero the attributes or +color pair identifier of the background character. +In +.IR \%ncurses "," +they do not. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_outopts\fP(3X) diff --git a/contrib/ncurses/man/curs_slk.3x b/contrib/ncurses/man/curs_slk.3x new file mode 100644 index 00000000..e141d7b6 --- /dev/null +++ b/contrib/ncurses/man/curs_slk.3x @@ -0,0 +1,386 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_slk.3x,v 1.75 2024/06/22 21:25:23 tom Exp $ +.TH curs_slk 3X 2024-06-22 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%slk_init\fP, +\fB\%slk_set\fP, +\fB\%slk_wset\fP, +\fB\%slk_refresh\fP, +\fB\%slk_noutrefresh\fP, +\fB\%slk_label\fP, +\fB\%slk_clear\fP, +\fB\%slk_restore\fP, +\fB\%slk_touch\fP, +\fB\%slk_attron\fP, +\fB\%slk_attrset\fP, +\fB\%slk_attroff\fP, +\fB\%slk_attr_on\fP, +\fB\%slk_attr_set\fP, +\fB\%slk_attr_off\fP, +\fB\%slk_attr\fP, +\fB\%slk_color\fP, +\fB\%extended_slk_color\fP \- +\fIcurses\fR soft label key routines +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint slk_init(int \fIfmt\fP); +.PP +\fBint slk_set(int \fIlabnum\fP, const char *\fIlabel\fP, int \fIalign\fP); +\fBint slk_wset(int \fIlabnum\fP, const wchar_t *\fIlabel\fP, int \fIalign\fP); +.PP +\fBchar *slk_label(int \fIlabnum\fP); +.PP +\fBint slk_refresh(void); +\fBint slk_noutrefresh(void); +\fBint slk_clear(void); +\fBint slk_restore(void); +\fBint slk_touch(void); +.PP +\fBint slk_attron(const chtype \fIattrs\fP); +\fBint slk_attroff(const chtype \fIattrs\fP); +\fBint slk_attrset(const chtype \fIattrs\fP); +\fBint slk_attr_on(attr_t \fIattrs\fP, void *\fIopts\fP); +\fBint slk_attr_off(const attr_t \fIattrs\fP, void *\fIopts\fP); +\fBint slk_attr_set(const attr_t \fIattrs\fP, short \fIpair\fP, void*\fIopts\fP); +\fI/* extension */ +\fBattr_t slk_attr(void); +.PP +\fBint slk_color(short \fIpair\fP); +\fI/* extension */ +\fBint extended_slk_color(int \fIpair\fP); +.fi +.SH DESCRIPTION +These functions manipulate the soft function key labels that some +hardware terminals support. +For those terminals that do not have soft labels, +\fIcurses\fP takes over the bottom line of \fB\%stdscr\fP, +reducing its vertical size and the value of \fBLINES\fP by one. +By default, +\fIcurses\fP uses eight labels of up to eight characters each. +.PP +\fI\%ncurses\fP +furthermore supports a mode comprising twelve labels of up to five +characters each, +following a convention associated with the IBM PC/AT keyboard. +\fI\%ncurses\fP simulates this mode by taking over up to two lines at +the bottom of the screen; +it does not try to use any hardware support for this +mode. +.SS Initialization +\fB\%slk_init\fP must be called before \fB\%initscr\fP or +\fB\%newterm\fP. +If \fB\%initscr\fP eventually uses a line from \fB\%stdscr\fP to +emulate the soft labels, +then \fIfmt\fP determines how the labels are arranged on the screen. +.TP 3 +.B 0 +indicates a 3\-2\-3 arrangement of +the labels. +.TP 3 +.B 1 +indicates a 4\-4 arrangement +.TP 3 +.B 2 +indicates the PC-like 4\-4\-4 mode. +.TP 3 +.B 3 +is again the PC-like 4\-4\-4 mode, +but in addition an index line is generated, +helping the user to associate each label with its numbered function key. +\fBLINES\fP and the vertical size of \fB\%stdscr\fP are further reduced. +.SS Labels +Populate the labels with normal strings +\%(\fBslk_set\fP) +or wide-character strings +\%(\fBslk_wset\fP). +Each function takes three parameters. +.TP 8 \" "labnum" + 2n +.I labnum +is the label number, from \fB1\fP to \fB8\fP +(12 if \fIfmt\fP in \fB\%slk_init\fP is \fB2\fP or \fB3\fP); +.TP +.I label +is be the string to put on the label, +up to eight +(five if \fIfmt\fP in \fB\%slk_init\fP is \fB2\fP or \fB3\fP) +characters in length. +A empty string or a null pointer sets up a blank label. +.TP +.I align +is +.BR 0 , +.BR 1 , +or +.BR 2 , +aligning +.I label +to the left, +center, +or right, +respectively, +within the 8 (5) character cells housing it. +.PP +\fB\%slk_label\fP obtains the string assigned to label number +\fIlabnum\fP, +with any leading and trailing blanks stripped. +.SS "Screen Updates" +\fB\%slk_refresh\fP and \fB\%slk_noutrefresh\fP affect the soft key +label lines as \fB\%wrefresh\fP and \fB\%wnoutrefresh\fP do the +.I curses +window. +.PP +The \fB\%slk_clear\fP routine clears the soft labels from the screen. +.PP +The \fB\%slk_restore\fP routine restores the soft labels to the screen +after a \fB\%slk_clear\fP has been performed. +.PP +The \fB\%slk_touch\fP routine forces all the soft labels to be output +the next time a \fB\%slk_noutrefresh\fP is performed. +.SS "Video Attributes" +The +\fB\%slk_attron\fP, +\fB\%slk_attrset\fP, +\fB\%slk_attroff\fP, +and +\fB\%slk_attr\fP +routines correspond to +\fB\%attron\fP, +\fB\%attrset\fP, +\fB\%attroff\fP, +and +\fB\%attr_get\fP, +respectively. +They have an effect only if soft labels are simulated on the bottom line +of the screen. +The default highlight for soft key labels is \fB\%A_STANDOUT\fP +(as in System\ V \fIcurses\fP, +which does not document this fact). +.SS Colors +The \fB\%slk_color\fP routine corresponds to \fB\%color_set\fP. +It has an effect only +if soft labels are simulated on the bottom line of the screen. +.PP +Because \fB\%slk_color\fP accepts +only \fIshort\fP +(signed 16-bit integer) +values, +this implementation provides +\fB\%extended_slk_color\fP, +which accepts an \fIint\fP value of at least 32 bits. +.SH RETURN VALUE +Routines that return an integer return \fBERR\fP upon failure and +\fBOK\fP +(SVr4 specifies only +\*(``an integer value other than \fBERR\fP\*('') +upon successful completion. +.PP +X/Open Curses defines no error conditions. +.PP +In this implementation +.RS 3 +.TP 5 +\fBslk_attr\fP +returns the attribute used for the soft keys. +.TP 5 +\fBslk_attroff\fP, \fBslk_attron\fP, \fBslk_clear\fP, \fBslk_noutrefresh\fP, \fBslk_refresh\fP, \fBslk_touch\fP +return +.B ERR +if the terminal or the softkeys were not initialized. +.TP 5 +\fBslk_attrset\fP +returns +.B ERR +if the terminal or the softkeys were not initialized. +.TP 5 +\fBslk_attr_set\fP +returns +.B ERR +if the terminal or the softkeys were not initialized, or +the color pair is outside the range 0..\fBCOLOR_PAIRS\fP\-1. +.TP 5 +\fBslk_color\fP +returns +.B ERR +if the terminal or the softkeys were not initialized, or +the color pair is outside the range 0..\fBCOLOR_PAIRS\fP\-1. +.TP 5 +\fBslk_init\fP +returns +.B ERR +if the format parameter is outside the range 0..3. +.TP 5 +\fBslk_label\fP +returns \fBNULL\fP on error. +.TP 5 +\fBslk_set\fP +returns +.B ERR +if the terminal or the softkeys were not initialized, or +the \fIlabnum\fP parameter is outside the range of label counts, or +if the format parameter is outside the range 0..2, or if +memory for the labels cannot be allocated. +.RE +.SH NOTES +Most applications would use \fB\%slk_noutrefresh\fP because a +\fB\%wrefresh\fP is likely to follow soon. +.SH EXTENSIONS +X/Open Curses documents the \fIopts\fP argument +as reserved for future use, +saying that it must be null. +This implementation +uses that parameter in ABI 6 for the functions which have a color pair +parameter to support extended color pairs. +.PP +For functions which modify the color, +e.g., +\fB\%slk_attr_set\fP, +if \fIopts\fP is set it is treated as a pointer to \fIint\fP, +and used to set the color pair instead of the \fIshort\fP pair +parameter. +.SH PORTABILITY +X/Open Curses, +Issue 4 describes these functions, +with some differences from SVr4 \fIcurses\fP: +.bP +X/Open added functions like the SVr4 attribute-manipulation functions +\fB\%slk_attron\fP, +\fB\%slk_attroff\fP, +and +\fB\%slk_attrset\fP, +but which use \fI\%attr_t\fP parameters +(rather than \fI\%chtype\fP), +along with a reserved \fIopts\fP parameter. +.IP +Two of these new functions +(unlike the SVr4 functions) +have no provision for color: +\fB\%slk_attr_on\fP and \fB\%slk_attr_off\fP. +.IP +The third function \%(\fBslk_attr_set\fP) has a color pair parameter. +.bP +It added \fIconst\fP qualifiers to parameters (unnecessarily), +and +.bP +It added \fB\%slk_color\fP. +.PP +Although \fB\%slk_start\fP is declared in the \fIcurses\fP header file, +it was not documented by SVr4 other than its presence in a list +of libtermlib.so.1 symbols. +Reading the source code (i.e., Illumos): +.bP +\fB\%slk_start\fP has two parameters: +.RS +.bP +\fIng\fP (number of groups) and +.bP +\fIgp\fP (group pointer). +.RE +.bP +Soft-key groups are an array of \fIng\fP integers. +.bP +In SVr4, \fB\%slk_init\fP calls \fB\%slk_start\fP passing a null for \fIgp\fP. +For this case, \fB\%slk_start\fP uses the number of groups \fIng\fP +(3 for the 3-2-3 layout, 2 for the 4-4 layout) which \fB\%slk_init\fP provided. +.IP +If \fIng\fP is neither 2 or 3, +\fB\%slk_start\fP checks the terminfo \fBfln\fP (label_format) capability, +interpreting that as a comma-separated list of numbers, +e.g., \*(``3,2,3\*('' for the 3-2-3 layout. +.IP +Finally, if there is no \fBfln\fP capability, +\fB\%slk_start\fP returns \fBERR\fP. +.bP +If \fB\%slk_start\fP is given a non-null \fIgp\fP, +it copies the \fIng\fP elements of the group of soft-keys, up to 16. +.IP +If there are more than 16 elements, \fB\%slk_start\fP returns +.BR ERR "." +.bP +The format codes \fB2\fP and \fB3\fP for \fB\%slk_init\fP +were added by \fI\%ncurses\fP in 1996. +PDCurses 2.4 added this feature in 2001. +.PP +The function \fB\%slk_attr\fP was added by \fI\%ncurses\fP in 1996. +.PP +X/Open Curses does not specify a limit for the number of colors and +color pairs which a terminal can support. +However, in its use of \fIshort\fP for the parameters, +it carries over SVr4's implementation detail for the compiled +terminfo database, which uses signed 16-bit numbers. +This implementation provides extended versions of those functions +which use \fIint\fP parameters, +allowing applications to use larger color- and pair-numbers. +.SH HISTORY +SVr3 introduced these functions: + \fBslk_clear\fP + \fBslk_init\fP + \fBslk_label\fP + \fBslk_noutrefresh\fP + \fBslk_refresh\fP + \fBslk_restore\fP + \fBslk_set\fP + \fBslk_touch\fP +.PP +SVr4 added these functions: + \fBslk_attroff\fP + \fBslk_attron\fP + \fBslk_attrset\fP + \fBslk_start\fP +.PP +X/Open Curses added these: + \fBslk_attr_off\fP + \fBslk_attr_on\fP + \fBslk_attr_set\fP + \fBslk_color\fP + \fBslk_wset\fP +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_attr\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_sp_funcs.3x b/contrib/ncurses/man/curs_sp_funcs.3x new file mode 100644 index 00000000..3a1e5fc0 --- /dev/null +++ b/contrib/ncurses/man/curs_sp_funcs.3x @@ -0,0 +1,284 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2010-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_sp_funcs.3x,v 1.51 2024/05/11 20:39:53 tom Exp $ +.TH curs_sp_funcs 3X 2024-05-11 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%curs_sp_funcs\fP \- +\fIcurses\fR screen-pointer extension +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint alloc_pair_sp(SCREEN* \fIsp\fP, int \fIfg\fP, int \fIbg\fP); +\fBint assume_default_colors_sp(SCREEN* \fIsp\fP, int \fIfg\fP, int \fIbg\fP); +\fBint baudrate_sp(SCREEN* \fIsp\fP); +\fBint beep_sp(SCREEN* \fIsp\fP); +\fBbool can_change_color_sp(SCREEN* \fIsp\fP); +\fBint cbreak_sp(SCREEN* \fIsp\fP); +\fBint color_content_sp(SCREEN* \fIsp\fP, short \fIcolor\fP, short* \fIr\fP, short* \fIg\fP, short* \fIb\fP); +\fBint curs_set_sp(SCREEN* \fIsp\fP, int \fIvisibility\fP); +\fBint def_prog_mode_sp(SCREEN* \fIsp\fP); +\fBint def_shell_mode_sp(SCREEN* \fIsp\fP); +.PP +\fBint define_key_sp(SCREEN* \fIsp\fP, const char * \fIdefinition\fP, int \fIkeycode\fP); +\fBint delay_output_sp(SCREEN* \fIsp\fP, int \fIms\fP); +\fBint doupdate_sp(SCREEN* \fIsp\fP); +\fBint echo_sp(SCREEN* \fIsp\fP); +\fBint endwin_sp(SCREEN* \fIsp\fP); +\fBchar erasechar_sp(SCREEN* \fIsp\fP); +\fBint erasewchar_sp(SCREEN* \fIsp\fP, wchar_t *\fIwc\fP); +\fBint extended_color_content_sp(SCREEN * \fIsp\fP, int \fIcolor\fP, int * \fIr\fP, int * \fIg\fP, int * \fIb\fP); +\fBint extended_pair_content_sp(SCREEN* \fIsp\fP, int \fIpair\fP, int * \fIfg\fP, int * \fIbg\fP); +\fBint extended_slk_color_sp(SCREEN* \fIsp\fP, int \fIpair\fP); +.PP +\fBvoid filter_sp(SCREEN* \fIsp\fP); +\fBint find_pair_sp(SCREEN* \fIsp\fP, int \fIfg\fP, int \fIbg\fP); +\fBint flash_sp(SCREEN* \fIsp\fP); +\fBint flushinp_sp(SCREEN* \fIsp\fP); +\fBint free_pair_sp(SCREEN* \fIsp\fP, int \fIpair\fP); +\fBint get_escdelay_sp(SCREEN* \fIsp\fP); +\fBint getmouse_sp(SCREEN* \fIsp\fP, MEVENT* \fIevent\fP); +\fBWINDOW* getwin_sp(SCREEN* \fIsp\fP, FILE* \fIfilep\fP); +\fBint halfdelay_sp(SCREEN* \fIsp\fP, int \fItenths\fP); +\fBbool has_colors_sp(SCREEN* \fIsp\fP); +.PP +\fBbool has_ic_sp(SCREEN* \fIsp\fP); +\fBbool has_il_sp(SCREEN* \fIsp\fP); +\fBint has_key_sp(SCREEN* \fIsp\fP, int \fIc\fP); +\fBbool has_mouse_sp(SCREEN* \fIsp\fP); +\fBint init_color_sp(SCREEN* \fIsp\fP, short \fIcolor\fP, short \fIr\fP, short \fIg\fP, short \fIb\fP); +\fBint init_extended_color_sp(SCREEN* \fIsp\fP, int \fIcolor\fP, int \fIr\fP, int \fIg\fP, int \fIb\fP); +\fBint init_extended_pair_sp(SCREEN* \fIsp\fP, int \fIpair\fP, int \fIfg\fP, int \fIbg\fP); +\fBint init_pair_sp(SCREEN* \fIsp\fP, short \fIpair\fP, short \fIfg\fP, short \fIbg\fP); +\fBint intrflush_sp(SCREEN* \fIsp\fP, WINDOW* \fIwin\fP, bool \fIbf\fP); +\fBint is_cbreak_sp(SCREEN* \fIsp\fP); +.PP +\fBint is_echo_sp(SCREEN* \fIsp\fP); +\fBint is_nl_sp(SCREEN* \fIsp\fP); +\fBint is_raw_sp(SCREEN* \fIsp\fP); +\fBbool is_term_resized_sp(SCREEN* \fIsp\fP, int \fIlines\fP, int \fIcolumns\fP); +\fBbool isendwin_sp(SCREEN* \fIsp\fP); +\fBint key_defined_sp(SCREEN* \fIsp\fP, const char *\fIdefinition\fP); +\fBchar* keybound_sp(SCREEN* \fIsp\fP, int \fIkeycode\fP, int \fIcount\fP); +\fBNCURSES_CONST char* keyname_sp(SCREEN* \fIsp\fP, int \fIc\fP); +\fBint keyok_sp(SCREEN* \fIsp\fP, int \fIkeycode\fP, bool \fIenable\fP); +\fBchar killchar_sp(SCREEN* \fIsp\fP); +.PP +\fBint killwchar_sp(SCREEN* \fIsp\fP, wchar_t *\fIwc\fP); +\fBchar* longname_sp(SCREEN* \fIsp\fP); +\fBint mcprint_sp(SCREEN* \fIsp\fP, char *\fIdata\fP, int \fIlen\fP); +\fBint mouseinterval_sp(SCREEN* \fIsp\fP, int \fIerval\fP); +\fBmmask_t mousemask_sp(SCREEN* \fIsp\fP, mmask_t \fInewmask\fP, mmask_t *\fIoldmask\fP); +\fBint mvcur_sp(SCREEN* \fIsp\fP, int \fIoldrow\fP, int \fIoldcol\fP, int \fInewrow\fP, int \fInewcol\fP); +\fBint napms_sp(SCREEN* \fIsp\fP, int \fIms\fP); +\fBWINDOW* newpad_sp(SCREEN* \fIsp\fP, int \fInrows\fP, int \fIncols\fP); +\fBSCREEN* new_prescr(void); +\fBSCREEN* newterm_sp(SCREEN* \fIsp\fP, const char *\fItype\fP, FILE *\fIoutfd\fP, FILE *\fIinfd\fP); +.PP +\fBWINDOW* newwin_sp(SCREEN* \fIsp\fP, int \fInlines\fP, int \fIncols\fP, int \fIbegin_y\fP, int \fIbegin_x\fP); +\fBint nl_sp(SCREEN* \fIsp\fP); +\fBint nocbreak_sp(SCREEN* \fIsp\fP); +\fBint noecho_sp(SCREEN* \fIsp\fP); +\fBvoid nofilter_sp(SCREEN* \fIsp\fP); +\fBint nonl_sp(SCREEN* \fIsp\fP); +\fBvoid noqiflush_sp(SCREEN* \fIsp\fP); +\fBint noraw_sp(SCREEN* \fIsp\fP); +\fBint pair_content_sp(SCREEN* \fIsp\fP, short \fIpair\fP, short* \fIfg\fP, short* \fIbg\fP); +\fBvoid qiflush_sp(SCREEN* \fIsp\fP); +.PP +\fBint raw_sp(SCREEN* \fIsp\fP); +\fBvoid reset_color_pairs_sp(SCREEN* \fIsp\fP); +\fBint reset_prog_mode_sp(SCREEN* \fIsp\fP); +\fBint reset_shell_mode_sp(SCREEN* \fIsp\fP); +\fBint resetty_sp(SCREEN* \fIsp\fP); +\fBint resize_term_sp(SCREEN* \fIsp\fP, int \fIlines\fP, int \fIcolumns\fP); +\fBint resizeterm_sp(SCREEN* \fIsp\fP, int \fIlines\fP, int \fIcolumns\fP); +\fBint ripoffline_sp(SCREEN* \fIsp\fP, int \fIline\fP, int (*\fIinit\fP)(WINDOW* \fIwin\fP, int \fIfmt\fP)); +\fBint savetty_sp(SCREEN* \fIsp\fP); +\fBint scr_init_sp(SCREEN* \fIsp\fP, const char *\fIfilename\fP); +.PP +\fBint scr_restore_sp(SCREEN* \fIsp\fP, const char *\fIfilename\fP); +\fBint scr_set_sp(SCREEN* \fIsp\fP, const char *\fIfilename\fP); +\fBint set_escdelay_sp(SCREEN* \fIsp\fP, int \fIms\fP); +\fBint set_tabsize_sp(SCREEN* \fIsp\fP, int \fIcols\fP); +\fBint slk_attrset_sp(SCREEN* \fIsp\fP, const chtype \fIa\fP); +\fBint slk_attr_set_sp(SCREEN* \fIsp\fP, const attr_t \fIattrs\fP, short \fIpair\fP, void*\fIopts\fP); +\fBint slk_attroff_sp(SCREEN* \fIsp\fP, const chtype \fIa\fP); +\fBint slk_attron_sp(SCREEN* \fIsp\fP, const chtype \fIa\fP); +\fBattr_t slk_attr_sp(SCREEN* \fIsp\fP); +\fBint slk_clear_sp(SCREEN* \fIsp\fP); +.PP +\fBint slk_color_sp(SCREEN* \fIsp\fP, short \fIpair\fP); +\fBint slk_init_sp(SCREEN* \fIsp\fP, int \fIfmt\fP); +\fBchar* slk_label_sp(SCREEN* \fIsp\fP, int \fIlabnum\fP); +\fBint slk_noutrefresh_sp(SCREEN* \fIsp\fP); +\fBint slk_refresh_sp(SCREEN* \fIsp\fP); +\fBint slk_restore_sp(SCREEN* \fIsp\fP); +\fBint slk_set_sp(SCREEN* \fIsp\fP, int \fIlabnum\fP, const char * \fIlabel\fP, int \fIfmt\fP); +\fBint slk_touch_sp(SCREEN* \fIsp\fP); +\fBint start_color_sp(SCREEN* \fIsp\fP); +\fBattr_t term_attrs_sp(SCREEN* \fIsp\fP); +.PP +\fBchtype termattrs_sp(SCREEN* \fIsp\fP); +\fBchar* termname_sp(SCREEN* \fIsp\fP); +\fBint typeahead_sp(SCREEN* \fIsp\fP, int \fIfd\fP); +\fBint unget_wch_sp(SCREEN* \fIsp\fP, const wchar_t \fIwc\fP); +\fBint ungetch_sp(SCREEN* \fIsp\fP, int \fIc\fP); +\fBint ungetmouse_sp(SCREEN* \fIsp\fP, MEVENT* \fIevent\fP); +\fBint use_default_colors_sp(SCREEN* \fIsp\fP); +\fBvoid use_env_sp(SCREEN* \fIsp\fP, bool \fIbf\fP); +\fBint use_legacy_coding_sp(SCREEN* \fIsp\fP, int \fIlevel\fP); +\fBvoid use_tioctl_sp(SCREEN *\fIsp\fP, bool \fIbf\fP); +.PP +\fBint vid_attr_sp(SCREEN* \fIsp\fP, attr_t \fIattrs\fP, short \fIpair\fP, void * \fIopts\fP); +\fBint vid_puts_sp(SCREEN* \fIsp\fP, attr_t \fIattrs\fP, short \fIpair\fP, void * \fIopts\fP, NCURSES_SP_OUTC \fIputc\fP); +\fBint vidattr_sp(SCREEN* \fIsp\fP, chtype \fIattrs\fP); +\fBint vidputs_sp(SCREEN* \fIsp\fP, chtype \fIattrs\fP, NCURSES_SP_OUTC \fIputc\fP); +\fBwchar_t* wunctrl_sp(SCREEN* \fIsp\fP, cchar_t *\fIwch\fP); +.PP +\fB#include +.PP +\fBFORM* new_form_sp(SCREEN* \fIsp\fP, FIELD **\fIfields\fP); +.PP +\fB#include +.PP +\fBMENU* new_menu_sp(SCREEN* \fIsp\fP, ITEM **\fIitems\fP); +.PP +\fB#include +.PP +\fBPANEL* ceiling_panel(SCREEN* \fIsp\fP); +\fBPANEL* ground_panel(SCREEN* \fIsp\fP); +\fBvoid update_panels_sp(SCREEN* \fIsp\fP); +.PP +\fB#include +.PP +\fBint del_curterm_sp(SCREEN* \fIsp\fP, TERMINAL *\fIoterm\fP); +\fBint putp_sp(SCREEN* \fIsp\fP, const char *\fIstr\fP); +\fBint restartterm_sp(SCREEN* \fIsp\fP, NCURSES_CONST char*\fIterm\fP, int \fIfiledes\fP, int *\fIerrret\fP); +\fBTERMINAL* set_curterm_sp(SCREEN* \fIsp\fP, TERMINAL*\fInterm\fP); +\fBint tgetent_sp(SCREEN* \fIsp\fP, char *\fIbp\fP, const char *\fIname\fP); +\fBint tgetflag_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP); +\fBint tgetnum_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP); +\fBchar* tgetstr_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP, char **\fIarea\fP); +\fBchar* tgoto_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP, int \fIcol\fP, int \fIrow\fP); +\fBint tigetflag_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP); +.PP +\fBint tigetnum_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP); +\fBchar* tigetstr_sp(SCREEN* \fIsp\fP, const char *\fIcapname\fP); +\fI/* tparm_sp may use 9 long parameters rather than being variadic */ +\fBchar* tparm_sp(SCREEN* \fIsp\fP, const char *\fIstr\fP, ...); +\fBint tputs_sp(SCREEN* \fIsp\fP, const char *\fIstr\fP, int \fIaffcnt\fP, NCURSES_SP_OUTC \fIputc\fP); +.PP +\fB#include +.PP +\fBNCURSES_CONST char* unctrl_sp(SCREEN* \fIsp\fP, chtype \fIch\fP); +.fi +.SH DESCRIPTION +This implementation can be configured to provide a set of functions which +improve the ability to manage multiple screens. +This feature can be added to any of the configurations supported by +\fI\%ncurses\fP; +it adds new symbols +without changing the meaning of any of the existing ones. +.\" *************************************************************************** +.SS "Improved Functions" +Most of the functions are new versions of existing functions. +A parameter is added at the front of the parameter list. +It is a \fISCREEN\fP pointer. +.PP +The existing functions all use the current screen, +which is a static variable. +The extended functions use the specified screen, +thereby reducing the number of variables which must be modified +to update multiple screens. +.\" *************************************************************************** +.SS "New Functions" +Here are the new functions: +.TP 5 +ceiling_panel +this returns a pointer to the topmost panel in the given screen. +.TP 5 +ground_panel +this returns a pointer to the lowest panel in the given screen. +.TP 5 +new_prescr +when creating a new screen, the library uses static variables which +have been preset, e.g., by \fBuse_env\fP(3X), \fBfilter\fP(3X), etc. +With the screen-pointer extension, +there are situations where it must create a current screen before +the unextended library does. +The \fBnew_prescr\fP function is used internally to handle these cases. +It is also provided to allow applications to customize library +initialization. +.\" *************************************************************************** +.SH NOTES +This extension introduces some new names: +.TP 5 +NCURSES_SP_FUNCS +This is set to the library patch-level number. +In the unextended library, this is zero (0), +to make it useful for checking if the extension is provided. +.TP 5 +NCURSES_SP_NAME +The new functions are named using the macro \fINCURSES_SP_NAME\fP, +which hides the actual implementation. +Currently this adds a \*(``_sp\*('' suffix +to the name of the unextended function. +This manual page indexes the extensions showing the full name. +However the proper usage of these functions uses the macro, +to provide for the possibility of changing the naming convention +for specific library configurations. +.TP 5 +NCURSES_SP_OUTC +This is a new function-pointer type to use in the screen-pointer functions +where an \fINCURSES_OUTC\fP is used in the unextended library. +.TP 5 +NCURSES_OUTC +This is a function-pointer type used for the cases where a function passes +characters to the output stream, e.g., \fBvidputs\fP(3X). +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on Version 7, BSD or System V implementations. +It is recommended that any code depending on \fI\%ncurses\fP extensions +be conditioned using \fINCURSES_SP_FUNCS\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_opaque\fP(3X), +\fB\%curs_threads\fP(3X) diff --git a/contrib/ncurses/man/curs_termattrs.3x b/contrib/ncurses/man/curs_termattrs.3x new file mode 100644 index 00000000..019522e7 --- /dev/null +++ b/contrib/ncurses/man/curs_termattrs.3x @@ -0,0 +1,129 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_termattrs.3x,v 1.42 2024/05/11 20:39:53 tom Exp $ +.TH curs_termattrs 3X 2024-05-11 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%baudrate\fP, +\fB\%erasechar\fP, +\fB\%erasewchar\fP, +\fB\%has_ic\fP, +\fB\%has_il\fP, +\fB\%killchar\fP, +\fB\%killwchar\fP, +\fB\%longname\fP, +\fB\%term_attrs\fP, +\fB\%termattrs\fP, +\fB\%termname\fP \- +get and set terminal attributes with \fIcurses\fP +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint baudrate(void); +\fBchar erasechar(void); +\fBint erasewchar(wchar_t *\fIwc\fP); +\fBbool has_ic(void); +\fBbool has_il(void); +\fBchar killchar(void); +\fBint killwchar(wchar_t *\fIwc\fP); +\fBchar *longname(void); +\fBattr_t term_attrs(void); +\fBchtype termattrs(void); +\fBchar *termname(void); +.fi +.SH DESCRIPTION +.SS baudrate +The \fBbaudrate\fP routine returns the output speed of the terminal. +The +number returned is in bits per second, for example \fB9600\fP, and is an +integer. +.SS "erasechar, erasewchar" +The \fBerasechar\fP routine returns the user's current erase character. +.PP +The \fBerasewchar\fP routine stores the current erase character +in the location referenced by \fIwc\fP. +If no erase character has been defined, the routine fails +and the location referenced by \fIwc\fP is not changed. +.SS "has_ic, has_il" +The \fBhas_ic\fP routine is true if the terminal has insert- and delete- +character capabilities. +.PP +The \fBhas_il\fP routine is true if the terminal has insert- and delete-line +capabilities, or can simulate them using scrolling regions. +This might +be used to determine if it would be appropriate to turn on physical +scrolling using \fBscrollok\fP(3X). +.SS "killchar, killwchar" +The \fBkillchar\fP routine returns the user's current line kill character. +.PP +The \fBkillwchar\fP routine stores the current line-kill character +in the location referenced by \fIwc\fP. +If no line-kill character has been defined, +the routine fails and the location referenced by \fIwc\fP is not changed. +.SS longname +The \fBlongname\fP routine returns a pointer to a static area +containing a verbose description of the current terminal. +The maximum +length of a verbose description is 128 characters. +It is defined only +after the call to \fBinitscr\fP or \fBnewterm\fP. The area is +overwritten by each call to \fBnewterm\fP and is not restored by +\fBset_term\fP, so the value should be saved between calls to +\fBnewterm\fP if \fBlongname\fP is going to be used with multiple +terminals. +.SS "termattrs, term_attrs" +If a given terminal does not support a video attribute that an +application program is trying to use, \fBcurses\fP may substitute a +different video attribute for it. +The \fBtermattrs\fP and \fBterm_attrs\fP functions +return a logical \fBOR\fP of all video attributes supported by the +terminal using \fBA_\fP and \fBWA_\fP constants respectively. +This information is useful when a \fBcurses\fP program +needs complete control over the appearance of the screen. +.SS termname +The \fBtermname\fP routine returns the terminal name used by \fBsetupterm\fP. +.SH RETURN VALUE +\fBlongname\fP and \fBtermname\fP return \fBNULL\fP on error. +.PP +Routines that return an integer return \fBERR\fP upon failure and \fBOK\fP +(SVr4 only specifies "an integer value other than \fBERR\fP") upon successful +completion. +.SH NOTES +Note that \fBtermattrs\fP may be a macro. +.SH PORTABILITY +X/Open Curses, Issue 4 describes these functions. +It changes the +return type of \fBtermattrs\fP to the new type \fBattr_t\fP. +Most versions of curses truncate the result returned by \fBtermname\fP to +14 characters. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_outopts\fP(3X) diff --git a/contrib/ncurses/man/curs_termcap.3x b/contrib/ncurses/man/curs_termcap.3x new file mode 100644 index 00000000..03215dac --- /dev/null +++ b/contrib/ncurses/man/curs_termcap.3x @@ -0,0 +1,691 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2017,2018 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_termcap.3x,v 1.91 2024/09/21 18:00:03 tom Exp $ +.TH curs_termcap 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.ie \n(.g .ds : \: +.el .ds : \" empty +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.\" URL hyperlink support macros from groff's "an-ext.tmac" +. +.\" Save the automatic hyphenation mode. +.\" +.\" In AT&T troff, there was no register exposing the hyphenation mode, +.\" and no way to save and restore it. Set `mH` to a reasonable value +.\" for your implementation and preference. +.de mY +. ie !\\n(.g \ +. nr mH 14 +. el \ +. do nr mH \\n[.hy] \" groff extension register +.. +. +.\" Prepare link text for mail/web hyperlinks. `MT` and `UR` call this. +.de mV +. ds mU \\$1\" +.. +. +.\" Emit hyperlink. The optional argument supplies trailing punctuation +.\" after link text. `ME` and `UE` call this. +.de mQ +. mY +. nh +<\\*(mU>\\$1 +. hy \\n(mH +. rm mU +.. +. +.\" Start URL. +.\" .UR url +.if !\n(.g \{\ +.de UR +. mV \\$1 +.. +.\} +. +.\" End URL. +.\" .UE [punctuation] +.if !\n(.g \{\ +.de UE +. mQ \\$1 +.. +.\} +. +.SH NAME +\fB\%PC\fP, +\fB\%UP\fP, +\fB\%BC\fP, +\fB\%ospeed\fP, +\fB\%tgetent\fP, +\fB\%tgetflag\fP, +\fB\%tgetnum\fP, +\fB\%tgetstr\fP, +\fB\%tgoto\fP, +\fB\%tputs\fP \- +\fIcurses\fR emulation of \fItermcap\fR +.SH SYNOPSIS +.nf +\fB#include +\fB#include +.PP +\fBchar PC; +\fBchar * UP; +\fBchar * BC; +\fB@NCURSES_OSPEED@ ospeed; +.PP +\fBint tgetent(char *\fIbp\fP, const char *\fIname\fP); +\fBint tgetflag(const char *\fIid\fP); +\fBint tgetnum(const char *\fIid\fP); +\fBchar *tgetstr(const char *\fIid\fP, char **\fIarea\fP); +\fBchar *tgoto(const char *\fIcap\fP, int \fIcol\fP, int \fIrow\fP); +\fBint tputs(const char *\fIstr\fP, int \fIaffcnt\fP, int (*\fIputc\fP)(int)); +.fi +.SH DESCRIPTION +.I \%ncurses +provides the foregoing variables and functions as a compatibility layer +for programs that use the \fItermcap\fP library. +The API is the same, +but behavior is emulated using the \fI\%term\%info\fP database. +Thus, +it can be used only to query the capabilities of terminal database +entries for which a \fI\%term\%info\fP entry has been compiled. +.SS Initialization +\fB\%tgetent\fP loads the terminal database entry for \fIname\fP; +see \fBterm\fP(7). +This must be done before calling any of the other functions. +It returns +.RS 3 +.TP 5 \" "-1" + 2n + adjust for PDF +1 +on success, +.TP +0 +if there is no such entry +(or if the matching entry describes a generic terminal, +having too little information for +.I curses +applications to run), +and +.TP +\-1 +if the \fI\%term\%info\fP database could not be found. +.RE +.PP +This implementation differs from those of historical \fItermcap\fP +libraries. +.RS 3 +.bP +.I \%ncurses +ignores the buffer pointer \fIbp\fP, +as do other \fItermcap\fP implementations conforming to portions of +X/Open Curses now withdrawn. +The BSD \fItermcap\fP library would store a copy of the terminal type +description in the area referenced by this pointer. +\fI\%term\%info\fP stores terminal type descriptions in compiled form, +which is not the same thing. +.bP +The meanings of the return values differ. +The BSD \fItermcap\fP library does not check whether the terminal type +description includes the +.B \%generic +.RB ( gn ) +capability, +nor whether the terminal type description supports an addressable +cursor, +a property essential for any \fIcurses\fP implementation to operate. +.RE +.SS "Retrieving Capability Values" +\fB\%tgetflag\fP reports the Boolean entry for \fIid\fP, +or zero if it is not available. +.PP +\fB\%tgetnum\fP obtains the numeric entry for \fIid\fP, +or \-1 if it is not available. +.PP +\fB\%tgetstr\fP returns the string entry for \fIid\fP, +or +.B NULL +if it is not available. +Use \fB\%tputs\fP to output the string returned. +The +.I area +parameter is used as follows. +.RS 3 +.bP +It is assumed to be the address of a pointer to a buffer managed by the +calling application. +.bP +However, +\fI\%ncurses\fP checks to ensure that +.I area +is not +.BR NULL , +and also that the resulting buffer pointer is not +.BR NULL . +If either check fails, +.I area +is ignored. +.bP +If the checks succeed, +\fI\%ncurses\fP also copies the return value to the buffer pointed to by +\fIarea\fP, +and the library updates +.I area +to point past the null character terminating this value. +.bP +The return value itself is an address in the terminal type description +loaded into memory. +.RE +.SS "Applying String Capabilities" +String capabilities can be parameterized; +see subsection \*(``Parameterized Strings\*('' in \fB\%terminfo\fP(5). +\fB\%tgoto\fP applies its second and third arguments to the parametric +placeholders in the capability stored in the first argument. +.bP +The capability may contain padding specifications; +see subsection \*(``Delays and Padding\*('' of \fB\%terminfo\fP(5). +The output of \fB\%tgoto\fP should thus be passed to \fB\%tputs\fP +rather than some other output function such as \fI\%printf\fP(3). +.bP +While \fB\%tgoto\fP is assumed to be used for the two-parameter +cursor positioning capability, +\fItermcap\fP applications also use it for single-parameter +capabilities. +.IP +Doing so reveals a quirk in \fB\%tgoto\fP: +most hardware terminals use cursor addressing with \fIrow\fP first, +but the original developers of the \fItermcap\fP interface chose to +put the \fIcol\fP (column) parameter first. +The \fB\%tgoto\fP function swaps the order of its parameters. +It does this even for calls requiring only a single parameter. +In that case, +the first parameter is merely a placeholder. +.bP +Normally the \fI\%ncurses\fP library is compiled without +full \fI\%termcap\fP support. +In that case, +\fB\%tgoto\fP uses an internal version of \fB\%tparm\fP(3X) +(a more capable function). +.IP +Because it uses \fB\%tparm\fP internally, +\fB\%tgoto\fP is able to use some \fI\%term\%info\fP features, +but not all. +In particular, +it allows only numeric parameters; +\fB\%tparm\fP supports string parameters. +.IP +However, +\fB\%tparm\fP is not a \fItermcap\fP feature, +and portable \fItermcap\fP applications should not rely upon its +availability. +.PP +\fB\%tputs\fP is described in \fB\%curs_terminfo\fP(3X). +It can retrieve capabilities by either \fItermcap\fP or +\fI\%term\%info\fP code. +.SS "Global Variables" +The variables +\fBPC\fP, +\fBUP\fP and +\fBBC\fP +are set by \fB\%tgetent\fP to the \fI\%term\%info\fP entry's data for +\fB\%pad_char\fP, +\fB\%cursor_up\fP and +\fB\%backspace_if_not_bs\fP, +respectively. +\fBUP\fP is not used by \fI\%ncurses\fP. +\fBPC\fP is used by \fB\%delay_output\fP(3X). +\fBBC\fP is used by \fB\%tgoto\fP emulation. +The variable \fB\%ospeed\fP is set by \fI\%ncurses\fP using a +system-specific encoding to indicate the terminal's data rate. +.SS "Releasing Memory" +The \fItermcap\fP functions provide no means of freeing memory, +because legacy \fItermcap\fP implementations used only the buffer +areas provided by the caller via \fB\%tgetent\fP and \fB\%tgetstr\fP. +Those buffers are unused in \fI\%term\%info\fP. +.PP +By contrast, +\fI\%term\%info\fP allocates memory. +It uses \fB\%setupterm\fP(3X) to obtain the data used by \fB\%tgetent\fP +and the functions that retrieve capability values. +One could use +.RS +.EX +del_curterm(cur_term); +.EE +.RE +to free this memory, +but there is an additional complication with \fI\%ncurses\fP. +It uses a fixed-size pool of storage locations, +one per value of the terminal name parameter given to \fB\%tgetent\fP. +The \fIscreen\fP(1) program relies upon this arrangement to improve its +performance. +.PP +An application that uses only the \fItermcap\fP functions, +not the higher level +.I \%curses +API, +could release the memory using \fB\%del_curterm\fP(3X), +because the pool is freed using other functions; +see \fB\%curs_memleaks\fP(3X). +.SH "RETURN VALUE" +The return values of +\fB\%tgetent\fP, +\fB\%tgetflag\fP, +\fB\%tgetname\fP, +and +\fB\%tgetstr\fP +are documented above. +.PP +\fB\%tgoto\fP returns +.B NULL +on error. +Error conditions include: +.bP +uninitialized state +\%(\fBtgetent\fP was not called successfully), +.bP +.I cap +being a null pointer, +.bP +.I cap +referring to a canceled capability, +.bP +.I cap +being a capability with string-valued parameters +(a \fI\%term\%info\fP-only feature), +and +.bP +.I cap +being a capability with more than two parameters. +.PP +See \fB\%curs_terminfo\fP(3X) regarding \fB\%tputs\fP. +.SH NOTES +\fI\%ncurses\fP compares only the first two characters of the \fIid\fP +parameter of +\fB\%tgetflag\fP, +\fB\%tgetnum\fP, +and +\fB\%tgetstr\fP to the capability names in the database. +.SH PORTABILITY +These functions are no longer standardized +(and the variables never were); +.I \%ncurses +provides them to support legacy applications. +They should not be used in new programs. +.SS Standards +.bP +X/Open Curses, +Issue 4, +Version 2 (1996), +describes these functions, +marking them as +\*(``TO BE WITHDRAWN\*(''. +.bP +X/Open Curses, +Issue 7 (2009) withdrew the +.I termcap +interface +(along with the +.I \%vwprintw +and +.I \%vwscanw +functions). +.PP +Neither X/Open Curses nor the SVr4 man pages documented the return +values of +.I \%tgetent +correctly, +though all three shown here were in fact returned ever since SVr1. +In particular, +an omission in the X/Open Curses specification has been misinterpreted +to mean that +.I \%tgetent +returns +.B OK +or +.BR ERR "." +Because the purpose of these functions is to provide compatibility with +the +.I termcap +library, +that is a defect in X/Open Curses, +Issue 4, +Version 2 +rather than in +.IR \%ncurses "." +.SS "Compatibility with BSD \f(BItermcap\fP" +.I \%ncurses +provides externally visible variables to support certain +.I termcap +applications. +However, +their correct usage is poorly documented; +for example, +it is unclear when reading and writing them is meaningful. +In particular, +some applications are reported to declare and/or modify +.BR \%ospeed "." +.PP +The constraint that only the first two characters of the +.I id +parameter are looked up in the terminal database +escapes many application developers. +The BSD +.I termcap +library did not require a trailing null character +after the capability identifier passed to +.IR \%tgetstr "," +.IR \%tgetnum "," +and +.IR \%tgetflag "." +.\" See . +Some applications thus assume that the +.I termcap +interface does not require the trailing null character +for the capability identifier. +.PP +.I \%ncurses +disallows matches by the +.I termcap +interface against extended capability names +that are longer than two characters; +see \fB\%user_caps\fP(5). +.PP +The BSD +.I termcap +function +.I \%tgetent +returns the text of a +.I termcap +entry in the buffer passed as an argument. +This library, +like other +.I \%term\%info +implementations, +does not store terminal type descriptions as text. +It sets the buffer contents to a null-terminated string. +.SS "Header File" +This library includes a +.I \%termcap.h +header file for compatibility with other implementations, +but it is rarely used because the other implementations +are not mutually compatible; +see below. +.SH HISTORY +.\" See https://www.oreilly.com/openbook/opensources/book/kirkmck.html +.\" for much BSD release history. +Bill Joy originated a forerunner of +.I termcap +called \*(``ttycap\*('', +dated September 1977, +and released in 1BSD +(March 1978). +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=1BSD/s7/ttycap.c +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=1BSD/man7/ttycap.7 +It used many of the same function names as the later +.IR termcap "," +such as +.IR \%tgetent "," +.IR \%tgetflag "," +.IR \%tgetnum "," +and +.IR \%tgetstr "." +.PP +A clear descendant, +the +.I termlib +library, +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=2BSD/src/termlib/ +followed in 2BSD +(May 1979), +adding +.I \%tgoto +and +.IR \%tputs "." +The former applied at that time only to cursor positioning capabilities, +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=2BSD/bin/etc/termcap +thus the overly specific name. +Little changed in 3BSD +(late 1979) +except the addition of test programs and a +.I termlib +man page, +which documented the API shown in section \*(``SYNOPSIS\*('' above. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/src/lib/\ +.\" libtermlib/ +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/man/man3/\ +.\" termlib.3 +.PP +4BSD +(November 1980) +renamed +.I termlib +to +.I termcap +.\" ...except in the source tree... +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD/usr/src/lib/\ +.\" libtermlib/makefile +and added another test program. +The library remained much the same through 4.3BSD +(June 1986). +4.4BSD-Lite +(June 1994) +refactored it, +.\" Observe the `tncktc()`, `tnamatch()`, `tskip()`, and `tdecode()` +.\" entry points disappearing from termcap.c. +leaving the API unchanged. +.PP +Function prototypes were a feature of ANSI C (1989). +The library long antedated the standard and thus provided no header file +declaring them. +Nevertheless, +the BSD sources included two different +.I \%termcap.h +header files over time. +.bP +One was used internally by \fIjove\fP(1) from 4.3BSD onward. +.\" 2BSD became a branch retaining support for non-virtual memory +.\" systems (such as the PDP-11) whereas most BSD development focused on +.\" the VAX and other VM-enabled systems starting with 3BSD. +.\" +.\" This man page previously located a termcap.h in 2BSD, but that may +.\" be confusion arising from its backport to 2.9BSD (and still present +.\" in surviving sources for 2.11BSD, the "end of the line" for that +.\" branch's development). +.\" +.\" Observe the copyright notice in +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=4.3BSD/usr/contrib/\ +.\" jove/Makefile +.\" --much too late for 2BSD (1979). +It declared global symbols for the +.I termcap +variables that it used. +.bP +The other appeared in 4.4BSD-Lite Release 2 +(June 1995) +as part of +.I libedit +(also known as the +.I \%edit\%line +library). +CSRG source history shows that this was added in mid-1992. +The +.I libedit +header file was used internally as a convenience +for compiling the +.I \%edit\%line +library. +It declared function prototypes, +but no global variables. +NetBSD's +.I termcap +library added this header file in mid-1994. +.PP +Meanwhile, +GNU +.I termcap +began development in 1990. +Its first release (1.0) in 1991 included a +.I \%termcap.h +header file. +Its second (1.1) release in September 1992 modified the file to use +.I const +for the function prototypes in the header where one would +expect parameters to be read-only. +BSD +.I termcap +did not. +The prototype for +.I \%tputs +also differed, +but in that instance, +it was +.I libedit +that differed from BSD +.IR termcap "." +.PP +GNU \fIbash\fP(1) has bundled GNU +.I termcap +1.3 since mid-1993 to support its \fI\%readline\fP(3) library, +and continues to use it if configured to do so. +.PP +.I \%ncurses +1.8.1 +(November 1993) +provided a +.I \%termcap.h +file. +It reflected influence from GNU +.I termcap +and \fI\%emacs\fP(1) +(rather than \fIjove\fP(1)), +providing the following interface: +.bP +global symbols used by +.IR \%emacs "," +.bP +.IR const -qualified +function prototypes, +and +.bP +a prototype for +.IR tparam "," +a GNU +.I termcap +feature. +.PP +Later +(in mid-1996) +the +.I tparam +function was removed from +.IR \%ncurses "." +Any two of the four implementations thus differ, +and programs that intend to work with all +.I termcap +library interfaces must account for that fact. +.SH BUGS +If you call \fB\%tgetstr\fP to fetch +.B \%column_address +.RB ( ch ) +or any other parameterized string capability, +be aware that it is returned in \fI\%term\%info\fP notation, +not the older and not-quite-compatible \fItermcap\fP notation. +This does not cause problems if all you do with it is call \fB\%tgoto\fP +or \fB\%tparm\fP, +which both parametrically expand \fI\%term\%info\fP-style string +capabilities as \fI\%term\%info\fP does. +(If +.I \%ncurses +is configured to support \fItermcap,\fP +\fB\%tgoto\fP checks whether the string is \fI\%term\%info\fP-style by +looking for \*(``\fB%p\fP\*('' parameters or +\*(``\fB<\fP.\|.\|.\fB>\fP\*('' delays, +and invokes a \fItermcap\fP-style parser if the string appears not to +use \fI\%term\%info\fP syntax.) +.PP +Because \fI\%term\%info\fP's syntax for padding in string capabilities +differs from \fItermcap\fP's, +users can be surprised. +.IP \(bu 4 +\fB\%tputs("50")\fP in a \fI\%term\%info\fP system transmits +\*(``50\*('' rather than busy-waiting for 50 milliseconds. +.IP \(bu 4 +However, +if \fI\%ncurses\fP is configured to support \fItermcap\fP, +it may also have been configured to support BSD-style padding. +.IP +In that case, +\fB\%tputs\fP inspects strings passed to it, +looking for digits at the beginning of the string. +.IP +\fB\%tputs("50")\fP in a \fItermcap\fP system may busy-wait for 50 +milliseconds rather than transmitting \*(``50\*(''. +.PP +\fItermcap\fP has nothing analogous to \fI\%term\%info\fP's +.B \%set_attributes +.RB ( sgr ) +capability. +One consequence is that \fItermcap\fP applications assume that +.RB \*(`` me \*('' +(equivalent to \fI\%term\%info\fP's +.B \%exit_attribute_mode +.RB ( sgr0 ) +capability) +does not reset the alternate character set. +\fI\%ncurses\fP checks for, +and modifies the data shared with, +the \fItermcap\fP interface to accommodate the latter's limitation in +this respect. +.SH "SEE ALSO" +.UR https://\*:invisible\-\*:island\*:.net/\*:ncurses/\*:tctest\*:.html +.I "TCTEST \(em A Termcap Test Utility" +.UE +.PP +\fB\%curses\fP(3X), +\fB\%curs_terminfo\fP(3X), +\fB\%putc\fP(3), +\fB\%term_variables\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_terminfo.3x b/contrib/ncurses/man/curs_terminfo.3x new file mode 100644 index 00000000..6dcfc8b8 --- /dev/null +++ b/contrib/ncurses/man/curs_terminfo.3x @@ -0,0 +1,1109 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_terminfo.3x,v 1.144 2024/09/14 20:06:50 tom Exp $ +.TH curs_terminfo 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%del_curterm\fP, +\fB\%putp\fP, +\fB\%restartterm\fP, +\fB\%set_curterm\fP, +\fB\%setupterm\fP, +\fB\%tigetflag\fP, +\fB\%tigetnum\fP, +\fB\%tigetstr\fP, +\fB\%tiparm\fP, +\fB\%tiparm_s\fP, +\fB\%tiscan_s\fP, +\fB\%tparm\fP, +\fB\%tputs\fP, +\fB\%vid_attr\fP, +\fB\%vid_puts\fP, +\fB\%vidattr\fP, +\fB\%vidputs\fP \- +\fIcurses\fR interfaces to \fI\%term\%info\fR database +.SH SYNOPSIS +.nf +\fB#include +\fB#include +.PP +\fBTERMINAL *cur_term; +.PP +\fBconst char * const boolnames[]; +\fBconst char * const boolcodes[]; +\fBconst char * const boolfnames[]; +\fBconst char * const numnames[]; +\fBconst char * const numcodes[]; +\fBconst char * const numfnames[]; +\fBconst char * const strnames[]; +\fBconst char * const strcodes[]; +\fBconst char * const strfnames[]; +.PP +\fBint setupterm(const char *\fIterm\fP, int \fIfiledes\fP, int *\fIerrret\fP); +\fBTERMINAL *set_curterm(TERMINAL *\fInterm\fP); +\fBint del_curterm(TERMINAL *\fIoterm\fP); +\fBint restartterm(const char *\fIterm\fP, int \fIfiledes\fP, int *\fIerrret\fP); +.PP +\fBchar *tparm(const char *\fIstr\fP, \fR.\|.\|.\fP); + \fI/* or */ +\fBchar *tparm(const char *\fIstr\fP, long \fIp1\fP \fR.\|.\|.\fP \fBlong\fP \fIp9\fP); +.PP +\fBint tputs(const char *\fIstr\fP, int \fIaffcnt\fP, int (*\fIputc\fP)(int)); +\fBint putp(const char *\fIstr\fP); +.PP +\fBint vidputs(chtype \fIattrs\fP, int (*\fIputc\fP)(int)); +\fBint vidattr(chtype \fIattrs\fP); +\fBint vid_puts(attr_t \fIattrs\fP, short \fIpair\fP, void *\fIopts\fP, int (*\fIputc\fP)(int)); +\fBint vid_attr(attr_t \fIattrs\fP, short \fIpair\fP, void *\fIopts\fP); +.PP +\fBint tigetflag(const char *\fIcap-code\fP); +\fBint tigetnum(const char *\fIcap-code\fP); +\fBchar *tigetstr(const char *\fIcap-code\fP); +.PP +\fBchar *tiparm(const char *\fIstr\fP, \fR.\|.\|.\fP); +.PP +\fI/* extensions */ +\fBchar *tiparm_s(int \fIexpected\fP, int \fImask\fP, const char *\fIstr\fP, ...); +\fBint tiscan_s(int *\fIexpected\fP, int *\fImask\fP, const char *\fIstr\fP); +.PP +\fI/* deprecated */ +\fBint setterm(const char *\fIterm\fP); +.fi +.SH DESCRIPTION +These low-level functions must be called by programs that deal directly +with the +.I \%term\%info +database to handle certain terminal capabilities, +such as programming function keys. +For all other functionality, +.I curses +functions are more suitable and their use is recommended. +.PP +None of these functions use +(or are aware of) +multibyte character strings such as UTF-8. +.bP +Capability names and codes use the POSIX portable character set. +.bP +Capability string values have no associated encoding; +they are strings of 8-bit characters. +.SS Initialization +Initially, +\fB\%setupterm\fP should be called. +The high-level +.I curses +functions \fB\%initscr\fP and \fB\%newterm\fP call \fB\%setupterm\fP to +initialize the low-level set of terminal-dependent variables listed in +\fB\%term_variables\fP(3X). +.PP +Applications can use the terminal capabilities either directly +(via header definitions), +or by special functions. +The header files +.I \%curses.h +and +.I \%term.h +should be included +(in that order) +to get the definitions for these strings, +numbers, +and flags. +.PP +The +.I \%term\%info +variables +.B \%lines +and +.B \%columns +are initialized by \fB\%setupterm\fP as follows. +.bP +If \fB\%use_env(FALSE)\fP has been called, +values for +.B \%lines +and +.B \%columns +specified in +.I \%term\%info +are used. +.bP +Otherwise, +if the environment variables +.I LINES +and +.I \%COLUMNS +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 +.B \%lines +and +.B \%columns +specified in the +.I \%term\%info +database are used. +.PP +Parameterized strings should be passed through \fB\%tparm\fP to +instantiate them. +All +.I \%term\%info +strings +(including the output of \fB\%tparm\fP) +should be sent to the terminal device with \fB\%tputs\fP or +\fB\%putp\fP. +Call \fB\%reset_shell_mode\fP to restore the terminal modes before +exiting; +see \fB\%curs_kernel\fP(3X). +.PP +Programs that use +cursor addressing should +.bP +output \fB\%enter_ca_mode\fP upon startup and +.bP +output \fB\%exit_ca_mode\fP before exiting. +.PP +Programs that execute shell subprocesses should +.bP +call \fB\%reset_shell_mode\fP and +output \fB\%exit_ca_mode\fP before the shell +is called and +.bP +output \fB\%enter_ca_mode\fP and +call \fB\%reset_prog_mode\fP after returning from the shell. +.PP +\fB\%setupterm\fP reads in the +.I \%term\%info +database, +initializing the +.I \%term\%info +structures, +but does not set up the output virtualization structures used by +.IR curses . +Its parameters follow. +.RS 3 +.TP 5 +.I term +is the terminal type, +a character string. +If +.I term +is null, +the environment variable +.I TERM +is read. +.TP 5 +.I filedes +is the file descriptor used for getting and setting terminal I/O modes. +.IP +Higher-level applications use \fB\%newterm\fP(3X) to initialize the +terminal, +passing an output +.I stream +rather than a +.IR descriptor . +In +.IR curses , +the two are the same because \fB\%newterm\fP calls \fB\%setupterm\fP, +passing the file descriptor derived from its output stream parameter. +.TP 5 +.I errret +points to an optional location where an error status can be returned to +the caller. +If +.I errret +is not null, +then \fB\%setupterm\fP returns +.B OK +or +.B ERR +and stores a status value in the integer pointed to by +.IR errret . +A return value of +.B OK +combined with status of +.B 1 +in +.I errret +is normal. +.IP +If +.B ERR +is returned, +examine +.I errret: +.RS +.TP 5 +.B 1 +means that the terminal is hardcopy, +and cannot be used for +.I curses +applications. +.IP +\fB\%setupterm\fP determines if the entry is a hardcopy type by +checking the +.B \%hardcopy +.RB ( hc ) +capability. +.TP 5 +.B 0 +means that the terminal could not be found, +or that it is a generic type, +having too little information for +.I curses +applications to run. +.IP +\fB\%setupterm\fP determines if the entry is a generic type by +checking the +.B \%generic_type +.RB ( gn ) +capability. +.TP 5 +.B \-1 +means that the +.I \%term\%info +database could not be found. +.RE +.IP +If +.I errret +is null, +\fB\%setupterm\fP reports an error message upon finding an error and +exits. +Thus, +the simplest call is: +.RS +.IP +.EX +setupterm((char *)0, 1, (int *)0); +.EE +.RE +.IP +which uses all the defaults and sends the output to +.BR stdout . +.RE +.\" ******************************************************************** +.SS "The Terminal State" +.B \%setupterm +stores its information about the terminal in a +.I \%TERMINAL +structure pointed to by the global variable +.BR \%cur_term "." +If it detects an error, +or decides that the terminal is unsuitable +(hardcopy or generic), +it discards this information, +making it unavailable to applications. +.PP +If +.B \%setupterm +is called repeatedly for the same terminal type, +it reuses the information. +It maintains only one copy of a given type's capabilities in memory. +If called for different types, +.B \%setupterm +allocates new storage for each set of terminal capabilities. +.PP +.B \%set_curterm +sets +.B \%cur_term +to +.IR \%nterm "," +making all of the +.I \%term\%info +Boolean, +numeric, +and string capabilities use the values from +.IR \%nterm "." +It returns the old value of +.BR \%cur_term "." +.PP +.B \%del_curterm +frees the memory pointed to by +.BR \%oterm "," +making it available for further use. +If +.B \%oterm +is +the same as +.BR \%cur_term "," +references to any of the +.I \%term\%info +Boolean, +numeric, +and string capabilities thereafter may refer to invalid memory locations +until +.B \%setupterm +is called again. +.PP +.B \%restartterm +is similar to +.BR \%setupterm "," +but is intended for use after restoring program memory +to a previous state +(for example, +when reloading an application that has been suspended from one terminal +session and restored in another). +.B \%restartterm +assumes that the display dimensions +and the input and output options are the same as when memory was saved, +but the terminal type and line speed may differ. +Accordingly, +.B \%restartterm +saves relevant terminal state, +calls +.BR \%setupterm "," +then restores that state. +.\" ******************************************************************** +.SS "Formatting Output" +\fB\%tparm\fP instantiates the string +.I str +with parameters +.IR pi . +A pointer is returned to the result of +.I str +with the parameters applied. +Application developers should keep in mind these quirks of the +interface: +.bP +Although \fB\%tparm\fP's actual parameters may be integers or strings, +the prototype expects +.I long +(integer) values. +.bP +Aside from the +.B \%set_attributes\fP +.RB ( sgr ) +capability, +most terminal capabilities require no more than one or two parameters. +.bP +Padding information is ignored by \fB\%tparm\fP; +it is interpreted by \fB\%tputs\fP. +.bP +The capability string is null-terminated. +Use \*(``\e200\*('' where an ASCII NUL is needed in the output. +.PP +\fB\%tiparm\fP is a newer form of \fB\%tparm\fP which uses +.I \%stdarg.h +rather than a fixed-parameter list. +Its numeric parameters are +.IR int s +rather than +.IR long "s." +.PP +Both \fB\%tparm\fP and \fB\%tiparm\fP assume that the application passes +parameters consistent with the terminal description. +Two extensions are provided as alternatives to deal with untrusted data. +.bP +\fB\%tiparm_s\fP is an extension which is a safer formatting function +than \fB\%tparm\fR or \fB\%tiparm\fR, +because it allows the developer to tell the +.I curses +library how many parameters to expect in the parameter list, +and which may be string parameters. +.IP +The \fImask\fP parameter has one bit set for each of the parameters +(up to 9) +passed as +.I char +pointers rather than numbers. +.bP +The extension \fB\%tiscan_s\fP allows the application to inspect a +formatting capability to see what the +.I curses +library would assume. +.\" ******************************************************************** +.SS "Output Functions" +String capabilities can contain padding information, +a time delay +(accommodating performance limitations of hardware terminals) +expressed as \fB$<\fIn\fB>\fR, +where \fIn\fP is a nonnegative integral count of milliseconds. +If \fIn\fP exceeds 30,000 +(thirty seconds), +it is capped at that value. +.PP +\fB\%tputs\fP interprets time-delay information in the string +.I str +and outputs it, +executing the delays: +.bP +The +.I str +parameter must be a +.I \%term\%info +string variable or the return value of +.B \%tparm +or +.BR \%tiparm "." +.bP +.I affcnt +is the number of lines affected, +or +.B 1 +if not applicable. +.bP +.I putc +is a +.IR \%putchar -like +function to which the characters are passed, +one at a time. +.IP +If \fB\%tputs\fP processes a time-delay, +it uses the \fB\%delay_output\fP(3X) function, +routing any resulting padding characters through this function. +.PP +\fB\%putp\fR calls +.RB \%\*(`` tputs(\c +.IB str ", 1, putchar)\c" +\*(''. +The output of \fB\%putp\fP always goes to +.BR stdout , +rather than the +.I \%file\%des +specified in \fB\%setupterm\fP. +.PP +\fB\%vidputs\fP displays the string on the terminal in the video +attribute mode +.IR attrs , +which is any combination of the attributes listed in \fB\%curses\fP(3X). +The characters are passed to the +.IR \%putchar -like +function +.IR putc . +.PP +\fB\%vidattr\fP is like \fB\%vidputs\fP, +except that it outputs through \fI\%putchar\fP(3). +.PP +.B \%vid_attr +and +.B \%vid_puts +correspond to +.B \%vidattr +and +.BR \%vidputs , +respectively. +They use multiple parameters to represent the character attributes and +color; +namely, +.bP +.IR \%attrs , +of type +.IR \%attr_t , +for the attributes and +.bP +.IR pair , +of type +.IR short , +for the color pair number. +.PP +Use the attribute constants prefixed with +.RB \*(`` WA_ \*('' +with +.B \%vid_attr +and +.BR \%vid_puts . +.PP +X/Open Curses reserves the +.I opts +argument for future use, +saying that applications must provide a null pointer for that argument; +but see section \*(``EXTENSIONS\*('' below. +.PP +While \fB\%putp\fP is a low-level function that does not use high-level +.I curses +state, +.I \%ncurses +declares it in +.I \%curses.h +because System\ V did this +(see section \*(``HISTORY\*('' below). +.\" ******************************************************************** +.SS "Terminal Capability Functions" +\fB\%tigetflag\fP, +\fB\%tigetnum\fP, +and \fB\%tigetstr\fP return the value of the capability corresponding to +the +.I \%term\%info +.IR cap-code , +such as +.BR xenl , +passed to them. +The +.I cap-code +for each capability is given in the table column entitled +.I cap-code +code in the capabilities section of \fB\%terminfo\fP(5). +.PP +These functions return special values to denote errors. +.PP +\fB\%tigetflag\fP returns +.TP +.B \-1 +if +.I cap-code +is not a Boolean capability, +or +.TP +.B 0 +if it is canceled or absent from the terminal description. +.PP +\fB\%tigetnum\fP returns +.TP +.B \-2 +if +.I cap-code +is not a numeric capability, +or +.TP +.B \-1 +if it is canceled or absent from the terminal description. +.PP +\fB\%tigetstr\fP returns +.TP +.B "(char *)\-1" +if +.I cap-code +is not a string capability, +or +.TP +.B 0 +if it is canceled or absent from the terminal description. +.\" ******************************************************************** +.SS "Terminal Capability Names" +These null-terminated arrays contain +.bP +the short \fI\%term\%info\fP names (\*(``codes\*(''), +.bP +the \fItermcap\fP names (\*(``names\*(''), +and +.bP +the long \fI\%term\%info\fP names (\*(``fnames\*('') +.PP +for each of the predefined +.I \%term\%info +variables: +.PP +.RS +.nf +\fBconst char *boolnames[]\fP, \fB*boolcodes[]\fP, \fB*boolfnames[]\fP +\fBconst char *numnames[]\fP, \fB*numcodes[]\fP, \fB*numfnames[]\fP +\fBconst char *strnames[]\fP, \fB*strcodes[]\fP, \fB*strfnames[]\fP +.fi +.RE +.\" ******************************************************************** +.SS "Releasing Memory" +Each successful call to \fB\%setupterm\fP allocates memory to hold the +terminal description. +As a side effect, +it sets \fB\%cur_term\fP to point to this memory. +If an application calls +.IP +.EX +del_curterm(cur_term); +.EE +.PP +the memory will be freed. +.PP +The formatting functions \fB\%tparm\fP and \fB\%tiparm\fP extend the +storage allocated by \fB\%setupterm\fP as follows. +.bP +They add the \*(``static\*('' +.I \%term\%info +variables [a-z]. +Before +.I \%ncurses +6.3, +those were shared by all screens. +With +.I \%ncurses +6.3, +those are allocated per screen. +See \fB\%terminfo\fP(5). +.bP +To improve performance, +.I \%ncurses +6.3 caches the result of analyzing +.I \%term\%info +strings for their parameter types. +That is stored as a binary tree referenced from the +.I \%TERMINAL +structure. +.PP +The higher-level \fB\%initscr\fP and \fB\%newterm\fP functions use +\fB\%setupterm\fP. +Normally they do not free this memory, +but it is possible to do that using the \fB\%delscreen\fP(3X) function. +.\" ******************************************************************** +.SH RETURN VALUE +X/Open Curses defines no failure conditions. +In +.IR \%ncurses , +.TP 5 +.B del_curtem +fails if its terminal parameter is null. +.TP 5 +.B putp +calls \fB\%tputs\fP, +returning the same error codes. +.TP 5 +.B restartterm +fails if the associated call to \fB\%setupterm\fP returns +.BR ERR "." +.TP 5 +.B setupterm +fails if it cannot allocate enough memory, +or create the initial windows +.RB \%( stdscr , +.BR \%curscr , +and +.BR \%newscr ) +Other error conditions are documented above. +.TP 5 +.B tparm +returns a null pointer if the capability would require unexpected +parameters; +that is, +too many, +too few, +or incorrect types +(strings where integers are expected, +or vice versa). +.TP 5 +.B tputs +fails if the string parameter is null. +It does not detect I/O errors: +X/Open Curses states that \fB\%tputs\fP ignores the return value +of the output function \fI\%putc\fP. +.\" ******************************************************************** +.SH NOTES +The +.B \%vid_attr +function in +.I \%ncurses +is a special case. +It was originally implemented based on a draft of X/Open Curses, +as a macro, +before other parts of the +.I \%ncurses +wide-character API were developed, +and unlike the other wide-character functions, +is also provided in the non-wide-character configuration. +.\" ******************************************************************** +.SH EXTENSIONS +The functions marked as extensions were designed for +.IR \%ncurses , +and are not found in SVr4 +.IR curses , +4.4BSD +.IR curses , +or any other previous +.I curses +implementation. +.PP +.I \%ncurses +allows +.I opts +to be a pointer to +.IR int , +which overrides the +.I pair +.RI ( short ) +argument. +.\" ******************************************************************** +.SH PORTABILITY +\fB\%setterm\fP is not described by X/Open and must be considered +non-portable. +All other functions are as described by X/Open. +.SS "Compatibility Macros" +This implementation provides a few macros for compatibility with systems +before SVr4 +(see section \*(``HISTORY\*('' below). +They include +\fB\%Bcrmode\fP, +\fB\%Bfixterm\fP, +\fB\%Bgettmode\fP, +\fB\%Bnocrmode\fP, +\fB\%Bresetterm\fP, +\fB\%Bsaveterm\fP, +and +\fB\%Bsetterm\fP. +.PP +In SVr4, +these are found in +.IR \%curses.h , +but except for \fB\%setterm\fP, +are likewise macros. +The one function, +\fB\%setterm\fP, +is mentioned in the manual page. +It further notes that \fB\%setterm\fP was replaced by \fB\%setupterm\fP, +stating that the call +.RS +.EX +setupterm(\fIterm\fP, 1, (int *)0) +.EE +.RE +provides the same functionality as \fB\%setterm(\fIterm\fB)\fR, +discouraging the latter for new programs. +.I \%ncurses +implements each of these symbols as macros for BSD +.I curses +compatibility. +.SS "Legacy Data" +\fB\%setupterm\fP copies the terminal name to the array \fB\%ttytype\fP. +This is not part of X/Open Curses, +but is assumed by some applications. +.PP +Other implementions may not declare the capability name arrays. +Some provide them without declaring them. +X/Open Curses does not specify them. +.PP +Extended terminal capability names, +as defined by +.RB \%\*(`` "@TIC@ \-x" \*('', +are not stored in the arrays described here. +.SS "Output Buffering" +Older versions of \fI\%ncurses\fP assumed that the file descriptor +passed to \fB\%setupterm\fP from \fB\%initscr\fP or \fB\%newterm\fP uses +buffered I/O, +and would write to the corresponding stream. +In addition to the limitation that the terminal was left in +block-buffered mode on exit +(like System\ V +.IR curses ), +it was problematic because +.I \%ncurses +did not allow a reliable way to clean up on receiving +.BR SIGTSTP . +.PP +The current version (ncurses6) +uses output buffers managed directly by +.IR \%ncurses . +Some of the low-level functions described in this manual page write +to the standard output. +They are not signal-safe. +The high-level functions in +.I \%ncurses +employ alternate versions of these functions using the more reliable +buffering scheme. +.SS "Function Prototypes" +The X/Open Curses prototypes are based on the SVr4 +.I curses +header declarations, +which were defined at the same time the C language was first +standardized in the late 1980s. +.bP +X/Open Curses uses +.I \%const +less effectively than a later design might, +sometimes applying it needlessly to values that are already constant, +and in most cases overlooking parameters that normally would use +.IR \%const . +Passing +.IR \%const -qualified +parameters to functions that do not declare them +.I \%const +may prevent the program from compiling. +On the other hand, +\*(``writable strings\*('' are an obsolescent feature. +.IP +As an extension, +this implementation can be configured to change the function prototypes +to use the +.I \%const +keyword. +The +.I \%ncurses +ABI 6 enables this feature by default. +.bP +X/Open Curses prototypes \fB\%tparm\fP with a fixed number of +parameters, +rather than a variable argument list. +.IP +This implementation uses a variable argument list, +but can be configured to use the fixed-parameter list. +Portable applications should provide nine parameters after the format; +zeroes are fine for this purpose. +.IP +In response to review comments by Thomas E. Dickey, +X/Open Curses Issue 7 proposed the \fB\%tiparm\fP function in mid-2009. +.IP +While \fB\%tiparm\fP is always provided in \fI\%ncurses\fP, +the older form is only available as a build-time configuration option. +If not specially configured, +\fB\%tparm\fP is the same as \fB\%tiparm\fP. +.PP +Both forms of \fB\%tparm\fP have drawbacks: +.bP +Most of the calls to \fB\%tparm\fP use only one or two parameters. +Passing nine on each call is awkward. +.IP +Using +.I long +for the numeric parameter type is a workaround to make the parameter use +the same amount of stack as a pointer. +That approach dates back to the mid-1980s, +before C was standardized. +Since then, +there is a standard +(and pointers are not required to fit in a +.IR long ). +.bP +Providing the right number of parameters for a variadic function +such as \fB\%tiparm\fP can be a problem, +in particular for string parameters. +However, +only a few +.I \%term\%info +capabilities use string parameters +(for instance, +the ones used for programmable function keys). +.IP +The \fI\%ncurses\fP library checks usage of these capabilities, +and returns +.B ERR +if the capability mishandles string parameters. +But it cannot check if a calling program provides strings in the right +places for the \fB\%tparm\fP calls. +.IP +The \fB\%@TPUT@\fR(1) program checks its use of these capabilities with +a table, +so that it calls \fB\%tparm\fP correctly. +.SS "Special \fITERM\fP treatment" +If configured to use the terminal driver, +.\" XXX: as opposed to the Unix terminal driver, termio(s)? +as with the MinGW port, +.bP +\fB\%setupterm\fP interprets a missing/empty \fITERM\fP variable as the +special value \*(``unknown\*(''. +.IP +SVr4 +.I curses +uses the special value \*(``dumb\*(''. +.IP +The difference between the two is that the former uses the +.B \%generic_type +.RB ( gn ) +.I \%term\%info +capability, +while the latter does not. +A generic terminal is unsuitable for full-screen applications. +.bP +\fB\%setupterm\fP allows explicit use of the +the windows console driver by checking if \fB$TERM\fP is set to +\*(``#win32con\*('' or an abbreviation of that string. +.SS "Other Portability Issues" +In SVr4, +.I \%set_curterm +returns an +.IR int "," +.B OK +or +.BR ERR "." +We have chosen to implement the X/Open Curses semantics. +.PP +In SVr4, +the third argument of +.I \%tputs +has the type +.RB \*(`` "int (*putc)(char)" \*(''. +.PP +At least one implementation of X/Open Curses (Solaris) returns a value +other than +.B OK +or +.B ERR +from +.IR \%tputs "." +It instead returns the length of the string, +and does no error checking. +.\" ******************************************************************** +.SH HISTORY +SVr2 (1984) introduced the +.I \%term\%info +feature. +Its programming manual mentioned the following low-level functions. +.PP +.TS +lB lB +lB lx. +Function Description +_ +fixterm restore terminal to \*(``in \fIcurses\fP\*('' state +gettmode establish current terminal modes +mvcur low level cursor motion +putp use \fBtputs\fP to send characters via \fIputchar\fP +resetterm set terminal modes to \*(``out of \fIcurses\fP\*(''\ + state +resetty reset terminal flags to stored value +saveterm save current modes as \*(``in \fIcurses\fP\*('' state +savetty store current terminal flags +setterm establish terminal with given type +setupterm establish terminal with given type +tparm interpolate parameters into string capability +tputs apply padding information to a string +vidattr like \fBvidputs\fP, but output through \fIputchar\fP +vidputs T{ +write string to terminal, applying specified attributes +T} +.TE +.PP +The programming manual also mentioned +functions provided for +.I termcap +compatibility +(commenting that they \*(``may go away at a later date\*(''). +.PP +.TS +lB lB +lB lx. +Function Description +_ +tgetent look up \fItermcap\fP entry for given \fIname\fP +tgetflag get Boolean entry for given \fIid\fP +tgetnum get numeric entry for given \fIid\fP +tgetstr get string entry for given \fIid\fP +tgoto apply parameters to given capability +tputs T{ +write characters via a function parameter, applying padding +T} +.TE +.PP +Early +.I \%term\%info +programs obtained capability values from the +.I \%TERMINAL +structure initialized by \fB\%setupterm\fP. +.PP +SVr3 (1987) extended +.I \%term\%info +by adding functions to retrieve capability values +(like the +.I termcap +interface), +and reusing \fB\%tgoto\fP and \fB\%tputs\fP. +.PP +.ne 4v +.TS +lB lB +lB lx. +Function Description +_ +tigetflag get Boolean entry for given \fIid\fP +tigetnum get numeric entry for given \fIid\fP +tigetstr get string entry for given \fIid\fP +.TE +.PP +SVr3 also replaced several of the SVr2 +.I \%term\%info +functions that had no counterpart in the +.I termcap +interface, +documenting them as obsolete. +.PP +.TS +lB lB +l lx. +Function Replaced by +_ +crmode cbreak +fixterm reset_prog_mode +gettmode \fIn/a\fP +nocrmode nocbreak +resetterm reset_shell_mode +saveterm def_prog_mode +setterm setupterm +.TE +.PP +SVr3 kept the \fB\%mvcur\fP, +\fB\%vidattr\fP, +and \fB\%vidputs\fP functions, +along with \fB\%putp\fP, +\fB\%tparm\fP, +and \fB\%tputs\fP. +The latter were needed to support padding, +and to handle capabilities accessed by functions such as \fB\%vidattr\fP +(which used more than the two parameters supported by \fB\%tgoto\fP). +.PP +SVr3 introduced the functions for switching between terminal +descriptions; +for example, +\fB\%set_curterm\fP. +Some changes reflected incremental improvements to the SVr2 library. +.bP +The +.I \%TERMINAL +type definition was introduced in SVr3.01, +for the +.I term +structure provided in SVr2. +.bP +Various global variables such as \fB\%boolnames\fP were mentioned +in the programming manual at this point, +though the variables had been provided in SVr2. +.PP +SVr4 (1989) added the \fB\%vid_attr\fP and \fB\%vid_puts\fP functions. +.PP +Other low-level functions are declared in the +.I curses +header files of Unix systems, +but none are documented. +Those noted as \*(``obsolete\*('' by SVr3 remained in use by System\ V's +\fIvi\fP(1) editor. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_kernel\fP(3X), +\fB\%curs_memleaks\fP(3X), +\fB\%curs_termcap\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%putc\fP(3), +\fB\%term_variables\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_threads.3x b/contrib/ncurses/man/curs_threads.3x new file mode 100644 index 00000000..d49c16e7 --- /dev/null +++ b/contrib/ncurses/man/curs_threads.3x @@ -0,0 +1,638 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2021-2023,2024 Thomas E. Dickey * +.\" Copyright 2008-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_threads.3x,v 1.56 2024/03/16 15:35:01 tom Exp $ +.TH curs_threads 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fI\%NCURSES_WINDOW_CB\fP, +\fI\%NCURSES_SCREEN_CB\fP, +\fB\%get_escdelay\fP, +\fB\%set_escdelay\fP, +\fB\%set_tabsize\fP, +\fB\%use_screen\fP, +\fB\%use_window\fP \- +\fIcurses\fR support for multi-threaded applications +.SH SYNOPSIS +.nf +\fB#include +.PP +\fI/* data types */ +\fBtypedef int (*NCURSES_WINDOW_CB)(WINDOW *, void *); +\fBtypedef int (*NCURSES_SCREEN_CB)(SCREEN *, void *); +.PP +\fBint get_escdelay(void); +\fBint set_escdelay(int \fIms\fP); +\fBint set_tabsize(int \fIcols\fP); +.PP +\fBint use_screen(SCREEN *\fIscr\fP, NCURSES_SCREEN_CB \fIfunc\fP, void *\fIdata\fP); +\fBint use_window(WINDOW *\fIwin\fP, NCURSES_WINDOW_CB \fIfunc\fP, void *\fIdata\fP); +.fi +.SH DESCRIPTION +The \fI\%ncurses\fP library can be configured to support multi-threaded +applications in a rudimentary way. +Such configuration produces a different set of libraries, +named \fIlibncursest\fP, +for example, +since doing so alters \fI\%ncurses\fP's application binary interface +(ABI). +.PP +Instead of modifying the programming interface (API) to make +\fI\%ncurses\fP functions expect an additional argument specifying a +thread, +the library adds functions, +usable in any configuration, +that hide the \fImutexes\fP +(mutual exclusion locks) +needed to prevent concurrent access to variables shared by multiple +threads of execution. +.PP +\fI\%ncurses\fP threading support requires the use of functions to +access members of the \fI\%WINDOW\fP structure (see +\fBcurs_opaque\fP(3X)). +It further makes functions of the common global variables +\fB\%COLORS\fP, +\fB\%COLOR_PAIRS\fP, +\fB\%COLS\fP, +\fB\%ESCDELAY\fP, +\fB\%LINES\fP, +\fB\%TABSIZE\fP, +\fB\%curscr\fP, +\fB\%newscr\fP, +and +\fB\%ttytype\fP, +maintaining them as as read-only values in the \fISCREEN\fP structure. +.PP +Even this is not enough to make an application using \fIcurses\fP +thread-safe. +We would expect a multi-threaded application to have threads updating +separate windows (on the same device), +and separate screens (on different devices). +Further, +applications expect a few of the global variables to be writable. +The functions described here address these special situations. +.PP +The \fB\%ESCDELAY\fP and \fB\%TABSIZE\fP global variables are modified +by some applications. +To modify them in any configuration, +use the \fB\%set_escdelay\fP or \fB\%set_tabsize\fP functions. +Other global variables are not modifiable. +\fBget_escdelay\fP retrieves \fB\%ESCDELAY\fP's value. +.PP +The \fBuse_window\fP and \fBuse_screen\fP functions provide +coarse-grained mutexes for their respective \fI\%WINDOW\fP and +\fISCREEN\fP parameters; +they call a user-supplied function, +pass it a \fIdata\fP parameter, +and return the value from the user-supplied function to the application. +.\" *************************************************************************** +.SS Usage +All \fI\%ncurses\fP library functions assume that the locale is not +altered during operation. +In addition, +they use data that is maintained within a hierarchy of scopes. +.bP +global data used in the low-level \fIterminfo\fP or \fItermcap\fP +interfaces +.bP +terminal data associated with a call to \fBset_curterm\fP(3X) +.IP +Terminal data are initialized when screens are created. +.bP +screen data associated with a call to \fBnewterm\fP(3X) or +\fBinitscr\fP(3X) +.bP +window data associated with a call to \fBnewwin\fP(3X) or +\fBsubwin\fP(3X) +.IP +Windows are associated with screens. +Pads are not necessarily associated with any particular screen. +.IP +Most \fIcurses\fP applications operate on one or more windows within a +single screen. +.bP +reentrant data associated with \*(``pure\*('' functions that alter no +shared variables +.PP +The following table lists the scope of each symbol in the +\fI\%ncurses\fP library when configured to support multi-threaded +applications. +.PP +.TS +center; +Lb2 Lb +Lb2 Lx. +Symbol Scope +_ +BC global +COLORS screen (read-only) +COLOR_PAIR reentrant +COLOR_PAIRS screen (read-only) +COLS screen (read-only) +ESCDELAY screen (read-only; see \fBset_escdelay\fP) +LINES screen (read-only) +PAIR_NUMBER reentrant +PC global +SP global +TABSIZE screen (read-only; see \fBset_tabsize\fP) +UP global +acs_map screen (read-only) +add_wch window (\fBstdscr\fP) +add_wchnstr window (\fBstdscr\fP) +add_wchstr window (\fBstdscr\fP) +addch window (\fBstdscr\fP) +addchnstr window (\fBstdscr\fP) +addchstr window (\fBstdscr\fP) +addnstr window (\fBstdscr\fP) +addnwstr window (\fBstdscr\fP) +addstr window (\fBstdscr\fP) +addwstr window (\fBstdscr\fP) +assume_default_colors screen +attr_get window (\fBstdscr\fP) +attr_off window (\fBstdscr\fP) +attr_on window (\fBstdscr\fP) +attr_set window (\fBstdscr\fP) +attroff window (\fBstdscr\fP) +attron window (\fBstdscr\fP) +attrset window (\fBstdscr\fP) +baudrate screen +beep screen +bkgd window (\fBstdscr\fP) +bkgdset window (\fBstdscr\fP) +bkgrnd window (\fBstdscr\fP) +bkgrndset window (\fBstdscr\fP) +boolcodes global (read-only) +boolfnames global (read-only) +boolnames global (read-only) +border window (\fBstdscr\fP) +border_set window (\fBstdscr\fP) +box window (\fBstdscr\fP) +box_set window (\fBstdscr\fP) +can_change_color terminal +cbreak screen +chgat window (\fBstdscr\fP) +clear window (\fBstdscr\fP) +clearok window +clrtobot window (\fBstdscr\fP) +clrtoeol window (\fBstdscr\fP) +color_content screen +color_set window (\fBstdscr\fP) +copywin window (locks source, target) +cur_term terminal +curs_set screen +curscr screen (read-only) +curses_version global (read-only) +def_prog_mode terminal +def_shell_mode terminal +define_key screen +del_curterm screen +delay_output screen +delch window (\fBstdscr\fP) +deleteln window (\fBstdscr\fP) +delscreen global (locks screen list, screen) +delwin global (locks window list) +derwin screen +doupdate screen +dupwin screen (locks window) +echo screen +echo_wchar window (\fBstdscr\fP) +echochar window (\fBstdscr\fP) +endwin screen +erase window (\fBstdscr\fP) +erasechar window (\fBstdscr\fP) +erasewchar window (\fBstdscr\fP) +filter global +flash terminal +flushinp screen +get_wch screen (input operation) +get_wstr screen (input operation) +getattrs window +getbegx window +getbegy window +getbkgd window +getbkgrnd window +getcchar reentrant +getch screen (input operation) +getcurx window +getcury window +getmaxx window +getmaxy window +getmouse screen (input operation) +getn_wstr screen (input operation) +getnstr screen (input operation) +getparx window +getpary window +getstr screen (input operation) +getwin screen (input operation) +halfdelay screen +has_colors terminal +has_ic terminal +has_il terminal +has_key screen +hline window (\fBstdscr\fP) +hline_set window (\fBstdscr\fP) +idcok window +idlok window +immedok window +in_wch window (\fBstdscr\fP) +in_wchnstr window (\fBstdscr\fP) +in_wchstr window (\fBstdscr\fP) +inch window (\fBstdscr\fP) +inchnstr window (\fBstdscr\fP) +inchstr window (\fBstdscr\fP) +init_color screen +init_pair screen +initscr global (locks screen list) +innstr window (\fBstdscr\fP) +innwstr window (\fBstdscr\fP) +ins_nwstr window (\fBstdscr\fP) +ins_wch window (\fBstdscr\fP) +ins_wstr window (\fBstdscr\fP) +insch window (\fBstdscr\fP) +insdelln window (\fBstdscr\fP) +insertln window (\fBstdscr\fP) +insnstr window (\fBstdscr\fP) +insstr window (\fBstdscr\fP) +instr window (\fBstdscr\fP) +intrflush terminal +inwstr window (\fBstdscr\fP) +is_cleared window +is_idcok window +is_idlok window +is_immedok window +is_keypad window +is_leaveok window +is_linetouched window +is_nodelay window +is_notimeout window +is_scrollok window +is_syncok window +is_term_resized terminal +is_wintouched window +isendwin screen +key_defined screen +key_name global (static data) +keybound screen +keyname global (static data) +keyok screen +keypad window +killchar terminal +killwchar terminal +leaveok window +longname screen +mcprint terminal +meta screen +mouse_trafo window (\fBstdscr\fP) +mouseinterval screen +mousemask screen +move window (\fBstdscr\fP) +mvadd_wch window (\fBstdscr\fP) +mvadd_wchnstr window (\fBstdscr\fP) +mvadd_wchstr window (\fBstdscr\fP) +mvaddch window (\fBstdscr\fP) +mvaddchnstr window (\fBstdscr\fP) +mvaddchstr window (\fBstdscr\fP) +mvaddnstr window (\fBstdscr\fP) +mvaddnwstr window (\fBstdscr\fP) +mvaddstr window (\fBstdscr\fP) +mvaddwstr window (\fBstdscr\fP) +mvchgat window (\fBstdscr\fP) +mvcur screen +mvdelch window (\fBstdscr\fP) +mvderwin window (\fBstdscr\fP) +mvget_wch screen (input operation) +mvget_wstr screen (input operation) +mvgetch screen (input operation) +mvgetn_wstr screen (input operation) +mvgetnstr screen (input operation) +mvgetstr screen (input operation) +mvhline window (\fBstdscr\fP) +mvhline_set window (\fBstdscr\fP) +mvin_wch window (\fBstdscr\fP) +mvin_wchnstr window (\fBstdscr\fP) +mvin_wchstr window (\fBstdscr\fP) +mvinch window (\fBstdscr\fP) +mvinchnstr window (\fBstdscr\fP) +mvinchstr window (\fBstdscr\fP) +mvinnstr window (\fBstdscr\fP) +mvinnwstr window (\fBstdscr\fP) +mvins_nwstr window (\fBstdscr\fP) +mvins_wch window (\fBstdscr\fP) +mvins_wstr window (\fBstdscr\fP) +mvinsch window (\fBstdscr\fP) +mvinsnstr window (\fBstdscr\fP) +mvinsstr window (\fBstdscr\fP) +mvinstr window (\fBstdscr\fP) +mvinwstr window (\fBstdscr\fP) +mvprintw window (\fBstdscr\fP) +mvscanw screen +mvvline window (\fBstdscr\fP) +mvvline_set window (\fBstdscr\fP) +mvwadd_wch window +mvwadd_wchnstr window +mvwadd_wchstr window +mvwaddch window +mvwaddchnstr window +mvwaddchstr window +mvwaddnstr window +mvwaddnwstr window +mvwaddstr window +mvwaddwstr window +mvwchgat window +mvwdelch window +mvwget_wch screen (input operation) +mvwget_wstr screen (input operation) +mvwgetch screen (input operation) +mvwgetn_wstr screen (input operation) +mvwgetnstr screen (input operation) +mvwgetstr screen (input operation) +mvwhline window +mvwhline_set window +mvwin window +mvwin_wch window +mvwin_wchnstr window +mvwin_wchstr window +mvwinch window +mvwinchnstr window +mvwinchstr window +mvwinnstr window +mvwinnwstr window +mvwins_nwstr window +mvwins_wch window +mvwins_wstr window +mvwinsch window +mvwinsnstr window +mvwinsstr window +mvwinstr window +mvwinwstr window +mvwprintw window +mvwscanw screen +mvwvline window +mvwvline_set window +napms reentrant +newpad global (locks window list) +newscr screen (read-only) +newterm global (locks screen list) +newwin global (locks window list) +nl screen +nocbreak screen +nodelay window +noecho screen +nofilter global +nonl screen +noqiflush terminal +noraw screen +notimeout window +numcodes global (read-only) +numfnames global (read-only) +numnames global (read-only) +ospeed global +overlay window (locks source, target) +overwrite window (locks source, target) +pair_content screen +pecho_wchar screen +pechochar screen +pnoutrefresh screen +prefresh screen +printw window +putp global +putwin window +qiflush terminal +raw screen +redrawwin window +refresh screen +reset_prog_mode screen +reset_shell_mode screen +resetty terminal +resize_term screen (locks window list) +resizeterm screen +restartterm screen +ripoffline global (static data) +savetty terminal +scanw screen +scr_dump screen +scr_init screen +scr_restore screen +scr_set screen +scrl window (\fBstdscr\fP) +scroll window +scrollok window +set_curterm screen +set_escdelay screen +set_tabsize screen +set_term global (locks screen list, screen) +setcchar reentrant +setscrreg window (\fBstdscr\fP) +setupterm global +slk_attr screen +slk_attr_off screen +slk_attr_on screen +slk_attr_set screen +slk_attroff screen +slk_attron screen +slk_attrset screen +slk_clear screen +slk_color screen +slk_init screen +slk_label screen +slk_noutrefresh screen +slk_refresh screen +slk_restore screen +slk_set screen +slk_touch screen +slk_wset screen +standend window +standout window +start_color screen +\fBstdscr\fP screen (read-only) +strcodes global (read-only) +strfnames global (read-only) +strnames global (read-only) +subpad window +subwin window +syncok window +term_attrs screen +termattrs screen +termname terminal +tgetent global +tgetflag global +tgetnum global +tgetstr global +tgoto global +tigetflag terminal +tigetnum terminal +tigetstr terminal +timeout window (\fBstdscr\fP) +touchline window +touchwin window +tparm global (static data) +tputs screen +trace global (static data) +ttytype screen (read-only) +typeahead screen +unctrl screen +unget_wch screen (input operation) +ungetch screen (input operation) +ungetmouse screen (input operation) +untouchwin window +use_default_colors screen +use_env global (static data) +use_extended_names global (static data) +use_legacy_coding screen +use_screen global (locks screen list, screen) +use_window global (locks window list, window) +vid_attr screen +vid_puts screen +vidattr screen +vidputs screen +vline window (\fBstdscr\fP) +vline_set window (\fBstdscr\fP) +vw_printw window +vw_scanw screen +vwprintw window +vwscanw screen +wadd_wch window +wadd_wchnstr window +wadd_wchstr window +waddch window +waddchnstr window +waddchstr window +waddnstr window +waddnwstr window +waddstr window +waddwstr window +wattr_get window +wattr_off window +wattr_on window +wattr_set window +wattroff window +wattron window +wattrset window +wbkgd window +wbkgdset window +wbkgrnd window +wbkgrndset window +wborder window +wborder_set window +wchgat window +wclear window +wclrtobot window +wclrtoeol window +wcolor_set window +wcursyncup screen (affects window plus parents) +wdelch window +wdeleteln window +wecho_wchar window +wechochar window +wenclose window +werase window +wget_wch screen (input operation) +wget_wstr screen (input operation) +wgetbkgrnd window +wgetch screen (input operation) +wgetdelay window +wgetn_wstr screen (input operation) +wgetnstr screen (input operation) +wgetparent window +wgetscrreg window +wgetstr screen (input operation) +whline window +whline_set window +win_wch window +win_wchnstr window +win_wchstr window +winch window +winchnstr window +winchstr window +winnstr window +winnwstr window +wins_nwstr window +wins_wch window +wins_wstr window +winsch window +winsdelln window +winsertln window +winsnstr window +winsstr window +winstr window +winwstr window +wmouse_trafo window +wmove window +wnoutrefresh screen +wprintw window +wredrawln window +wrefresh screen +wresize window (locks window list) +wscanw screen +wscrl window +wsetscrreg window +wstandend window +wstandout window +wsyncdown screen (affects window plus parents) +wsyncup screen (affects window plus parents) +wtimeout window +wtouchln window +wunctrl global (static data) +wvline window +wvline_set window +.TE +.\" *************************************************************************** +.SH RETURN VALUE +\fB\%get_escdelay\fP returns the value of \fB\%ESCDELAY\fP. +\fB\%set_escdelay\fP and \fB\%set_tabsize\fP return \fBERR\fP upon +failure and \fBOK\fP upon successful completion. +\fB\%use_screen\fP and \fB\%use_window\fP return the \fIint\fP returned +by the user-supplied function they are called with. +.SH NOTES +\fI\%ncurses\fP provides both a C function and a preprocessor macro for +each function documented in this page. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on Version 7, BSD or System V implementations. +It is recommended that any code depending on \fI\%ncurses\fP extensions +be conditioned using \fB\%NCURSES_VERSION\fP. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_opaque\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_touch.3x b/contrib/ncurses/man/curs_touch.3x new file mode 100644 index 00000000..1c8dadbd --- /dev/null +++ b/contrib/ncurses/man/curs_touch.3x @@ -0,0 +1,125 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_touch.3x,v 1.51 2024/07/27 19:55:45 tom Exp $ +.TH curs_touch 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%touchwin\fP, +\fB\%touchline\fP, +\fB\%untouchwin\fP, +\fB\%wtouchln\fP, +\fB\%is_linetouched\fP, +\fB\%is_wintouched\fP \- +control terminal output refresh in a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint touchline(WINDOW *\fIwin\fP, int \fIstart\fP, int \fIcount\fP); +.PP +\fBint touchwin(WINDOW *\fIwin\fP); +\fBint wtouchln(WINDOW *\fIwin\fP, int \fIy\fP, int \fIn\fP, int \fIchanged\fP); +.PP +\fBint untouchwin(WINDOW *\fIwin\fP); +.PP +\fBbool is_linetouched(WINDOW *\fIwin\fP, int \fIline\fP); +\fBbool is_wintouched(WINDOW *\fIwin\fP); +.fi +.SH DESCRIPTION +The \fB\%touchwin\fP and \fB\%touchline\fP routines throw away all +optimization information about which parts of the window have been +touched, by pretending that the entire window has been drawn on. +This +is sometimes necessary when using overlapping windows, since a change +to one window affects the other window, but the records of which lines +have been changed in the other window do not reflect the change. +The +routine \fB\%touchline\fP only pretends that \fIcount\fP lines have been +changed, beginning with line \fIstart\fP. +.PP +The \fB\%untouchwin\fP routine marks all lines in the window as unchanged since +the last call to \fB\%wrefresh\fP. +.PP +The \fB\%wtouchln\fP routine makes \fIn\fP lines in the window, starting +at line \fIy\fR, look as if they have (\fIchanged\fB=1\fR) or have +not (\fIchanged\fB=0\fR) been changed since the last call to +\fB\%wrefresh\fP. +.PP +The \fB\%is_linetouched\fP and \fB\%is_wintouched\fP routines return +\fBTRUE\fP if the specified line/window was modified since the last +call to \fB\%wrefresh\fP; otherwise they return \fBFALSE\fP. In +addition, \fB\%is_linetouched\fP returns \fBERR\fP if \fIline\fP is not +valid for the given window. +.SH RETURN VALUE +All routines return the integer \fBERR\fP upon failure and an integer value +other than \fBERR\fP upon successful completion, unless otherwise noted in the +preceding routine descriptions. +.PP +In this implementation +.RS 3 +.TP 5 +\fBis_linetouched\fP +returns +.B ERR +if the window pointer is null, or +if the line number is outside the window boundaries. +.IP +The constant \fBERR\fP is distinct from \fBTRUE\fP and \fBFALSE\fP, +which are the normal return values of this function. +Because the function returns a \fBbool\fP, +returning \fBERR\fP (which is neither \fBTRUE\fP nor \fBFALSE\fP) +may not be supported by the compiler. +.IP +To provide error-checking and also match the X/Open function prototype, +the \fBERR\fP is provided by a macro named \fB\%is_linetouched\fP. +The actual function returns \fBFALSE\fP when it detects an error. +.TP 5 +\fBwtouchln\fP +returns +.B ERR +if the window pointer is null, or +if the line number is outside the window boundaries. +.RE +.SH NOTES +All of these routines except \fB\%wtouchln\fP may be macros. +.SH PORTABILITY +These functions were introduced by SVr4. +The Solaris \fIcurses\fP header file, +for instance, defines both an actual function and macro for each. +The macros give the same result as the actual functions. +SVr4 \fIcurses\fP does not check the window parameter \fIwin\fP to ensure +that it is not \fBNULL\fP; +otherwise this implementation behaves the same as SVr4. +.PP +X/Open Curses, Issue 4 describes these functions. +It specifies no error conditions for them. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/curs_trace.3x b/contrib/ncurses/man/curs_trace.3x new file mode 100644 index 00000000..ddae7911 --- /dev/null +++ b/contrib/ncurses/man/curs_trace.3x @@ -0,0 +1,301 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2000-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_trace.3x,v 1.50 2024/04/20 21:24:19 tom Exp $ +.TH curs_trace 3X 2024-04-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.de dS \" Start unfilled display. +.nr aD \n(.j +.na +.. +. +.de dE \" End unfilled display. +.ad \n(.j +.rr aD +.. +. +.SH NAME +\fB\%curses_trace\fP, +\fB\%trace\fP, +\fB\%_tracef\fP, +\fB\%_traceattr\fP, +\fB\%_traceattr2\fP, +\fB\%_tracecchar_t\fP, +\fB\%_tracecchar_t2\fP, +\fB\%_tracechar\fP, +\fB\%_tracechtype\fP, +\fB\%_tracechtype2\fP, +\fB\%_nc_tracebits\fP, +\fB\%_tracedump\fP, +\fB\%_tracemouse\fP \- +\fIcurses\fR debugging routines +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBunsigned curses_trace(const unsigned \fItrace-mask\fP); +.PP +\fBvoid _tracef(const char *\fIformat\fP, ...); +.PP +\fBchar *_traceattr(attr_t \fIattr\fP); +\fBchar *_traceattr2(int \fIbuffer\fP, chtype \fIch\fP); +\fBchar *_tracecchar_t(const cchar_t *\fIstring\fP); +\fBchar *_tracecchar_t2(int \fIbuffer\fP, const cchar_t *\fIstring\fP); +\fBchar *_tracechar(int \fIc\fP); +\fBchar *_tracechtype(chtype \fIch\fP); +\fBchar *_tracechtype2(int \fIbuffer\fP, chtype \fIch\fP); +.PP +\fBvoid _tracedump(const char *\fIlabel\fP, WINDOW *\fIwin\fP); +\fBchar *_nc_tracebits(void); +\fBchar *_tracemouse(const MEVENT *\fIevent\fP); +.PP +\fI/* deprecated */\fP +\fBvoid trace(const unsigned int \fItrace-mask\fP); +.fi +.SH DESCRIPTION +The \fIcurses trace\fP routines are used for debugging the +\fI\%ncurses\fP libraries, +as well as applications which use the \fI\%ncurses\fP libraries. +Some limitations apply: +.bP +Aside from \fBcurses_trace\fP, +the other functions are normally available only with the debugging library +e.g., \fBlibncurses_g.a\fP. +.IP +All of the trace functions may be compiled into any model (shared, static, +profile) by defining the symbol \fBTRACE\fP. +.bP +Additionally, the functions which use \fBcchar_t\fP +are only available with the wide-character configuration of the libraries. +.SS Functions +The principal parts of this interface are +.bP +\fBcurses_trace\fP, which selectively enables different tracing features, and +.bP +\fB_tracef\fP, which writes formatted data to the \fItrace\fP file. +.IP +The other functions either return a pointer to a string-area +(allocated by the corresponding function), or return no value +(such as \fB_tracedump\fP, +which implements the screen dump for \fBTRACE_UPDATE\fP). +The caller should not free these strings, +since the allocation is reused on successive calls. +To work around the problem of a single string-area per function, +some use a buffer-number parameter, telling the library to allocate +additional string-areas. +.PP +The \fBcurses_trace\fP function is always available, +whether or not the other trace functions are available: +.bP +If tracing is available, +calling \fBcurses_trace\fP with a nonzero parameter +updates the trace mask, +and returns the previous trace mask. +.IP +When the trace mask is nonzero, +\fI\%ncurses\fP creates the file \*(``trace\*('' in the current directory for output. +If the file already exists, no tracing is done. +.bP +If tracing is not available, \fBcurses_trace\fP returns zero (0). +.SS "Trace Parameter" +The trace parameter is formed by OR'ing +values from the list of \fBTRACE_\fIxxx\fR definitions in \fB\fR. +These include: +.TP 5 +.B TRACE_DISABLE +turn off tracing by passing a zero parameter. +.IP +The library flushes the output file, +but retains an open file-descriptor to the trace file +so that it can resume tracing later if a nonzero parameter is passed +to the \fBcurses_trace\fP function. +.TP 5 +.B TRACE_TIMES +trace user and system times of updates. +.TP 5 +.B TRACE_TPUTS +trace \fBtputs\fP(3X) calls. +.TP 5 +.B TRACE_UPDATE +trace update actions, old & new screens. +.TP 5 +.B TRACE_MOVE +trace cursor movement and scrolling. +.TP 5 +.B TRACE_CHARPUT +trace all character outputs. +.TP 5 +.B TRACE_ORDINARY +trace all update actions. +The old and new screen contents are written to the trace file +for each refresh. +.TP 5 +.B TRACE_CALLS +trace all curses calls. +The parameters for each call are traced, as well as return values. +.TP 5 +.B TRACE_VIRTPUT +trace virtual character puts, i.e., calls to \fBaddch\fP. +.TP 5 +.B TRACE_IEVENT +trace low-level input processing, including timeouts. +.TP 5 +.B TRACE_BITS +trace state of TTY control bits. +.TP 5 +.B TRACE_ICALLS +trace internal/nested calls. +.TP 5 +.B TRACE_CCALLS +trace per-character calls. +.TP 5 +.B TRACE_DATABASE +trace read/write of terminfo/termcap data. +.TP 5 +.B TRACE_ATTRS +trace changes to video attributes and colors. +.TP 5 +.B TRACE_MAXIMUM +maximum trace level, enables all of the separate trace features. +.PP +Some tracing features are enabled whenever the \fBcurses_trace\fP parameter +is nonzero. +Some features overlap. +The specific names are used as a guideline. +.SS "Command-line Utilities" +The command-line utilities such as \fBtic\fP(1) provide a verbose option +which extends the set of messages written using the \fBcurses_trace\fP function. +Both of these (\fB\-v\fP and \fBcurses_trace\fP) +use the same variable (\fB_nc_tracing\fP), +which determines the messages which are written. +.PP +Because the command-line utilities may call initialization functions +such as \fBsetupterm\fP, \fBtgetent\fP or \fBuse_extended_names\fP, +some of their debugging output may be directed to the \fItrace\fP file +if the \fI\%NCURSES_TRACE\fP environment variable is set: +.bP +messages produced in the utility are written to the standard error. +.bP +messages produced by the underlying library are written to \fItrace\fP. +.PP +If \fI\%ncurses\fP is built without tracing, +none of the latter are produced, +and fewer diagnostics are provided by the command-line utilities. +.SH RETURN VALUE +Routines which return a value are designed to be used as parameters +to the \fB_tracef\fP routine. +.SH ENVIRONMENT +.SS NCURSES_TRACE +A positive integral value stored in this variable causes the following +functions to enable the tracing feature as if +.B \%curses_trace +were called. +.PP +.dS +.RS 4 +\fB\%filter\fP, +\fB\%initscr\fP, +\fB\%new_prescr\fP, +\fB\%newterm\fP, +\fB\%nofilter\fP, +\fB\%restartterm\fP, +\fB\%ripoffline\fP, +\fB\%setupterm\fP, +\fB\%slk_init\fP, +\fB\%tgetent\fP, +\fB\%use_env\fP, +\fB\%use_extended_names\fP, +\fB\%use_tioctl\fP +.RE +.dE +.SH PORTABILITY +These functions are not part of the X/Open Curses interface. +Some other curses implementations are known to +have similar features, +but they are not compatible with \fI\%ncurses\fP: +.bP +SVr4 provided \fBtraceon\fP and \fBtraceoff\fP, +to control whether debugging information was written +to the \*(``trace\*('' file. +While the functions were always available, +this feature was only enabled +if \fBDEBUG\fP was defined when building the library. +.IP +The SVr4 tracing feature is undocumented. +.bP +PDCurses provides \fBtraceon\fP and \fBtraceoff\fP, +which (like SVr4) are always available, +and enable tracing +to the \*(``trace\*('' file +only when a debug-library is built. +.IP +PDCurses has a short description of these functions, +with a note that they are not present in X/Open Curses, +\fI\%ncurses\fP or NetBSD. +It does not mention SVr4, +but the functions' inclusion in a header file section +labeled \*(``Quasi-standard\*('' hints at the origin. +.bP +NetBSD does not provide functions for enabling/disabling traces. +It uses environment variables +\fI\%CURSES_TRACE_MASK\fP and +\fI\%CURSES_TRACE_FILE\fP to determine what is traced, +and where the results are written. +This is available only when a debug-library is built. +.IP +The NetBSD tracing feature is undocumented. +.PP +A few \fI\%ncurses\fP functions are not provided when symbol versioning +is used: +.RS 4 +.PP +_nc_tracebits, +_tracedump, +_tracemouse +.RE +.PP +The original \fBtrace\fP routine was deprecated because +it often conflicted with application names. +.SH SEE ALSO +\fB\%curses\fP(3X) diff --git a/contrib/ncurses/man/curs_util.3x b/contrib/ncurses/man/curs_util.3x new file mode 100644 index 00000000..8894f23a --- /dev/null +++ b/contrib/ncurses/man/curs_util.3x @@ -0,0 +1,535 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_util.3x,v 1.118 2024/09/21 09:30:22 tom Exp $ +.TH curs_util 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%delay_output\fP, +\fB\%filter\fP, +\fB\%flushinp\fP, +\fB\%getwin\fP, +\fB\%key_name\fP, +\fB\%keyname\fP, +\fB\%nofilter\fP, +\fB\%putwin\fP, +\fB\%unctrl\fP, +\fB\%use_env\fP, +\fB\%use_tioctl\fP, +\fB\%wunctrl\fP \- +miscellaneous \fIcurses\fR utility routines +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBconst char *unctrl(chtype \fIch\fP); +\fBwchar_t *wunctrl(cchar_t *\fIwch\fP); +.PP +\fBconst char *keyname(int \fIc\fP); +\fBconst char *key_name(wchar_t \fIwc\fP); +.PP +\fBvoid filter(void); +.PP +\fBvoid use_env(bool \fIbf\fP); +.PP +\fBint putwin(WINDOW *\fIwin\fP, FILE *\fIfilep\fP); +\fBWINDOW *getwin(FILE *\fIfilep\fP); +.PP +\fBint delay_output(int \fIms\fP); +\fBint flushinp(void); +.PP +\fI/* extensions */ +\fBvoid nofilter(void); +\fBvoid use_tioctl(bool \fIbf\fP); +.fi +.SH DESCRIPTION +.SS unctrl +The \fBunctrl\fP routine returns a character string as a printable +representation of the character \fIch\fP: +.bP +Printable characters are displayed as themselves, +e.g., +a one-character string containing the key. +.bP +Control characters are displayed in the \fB^\fIX\fR notation. +.bP +Printing characters are displayed as is. +.bP +DEL +(character 127) +is displayed as \fB^?\fP. +.bP +Values above 128 are either meta characters +(if the screen has not been initialized, +or if \fBmeta\fP(3X) has been called with a \fBTRUE\fP parameter), +shown in the \fBM\-\fIX\fR notation, +or are displayed as themselves. +In the latter case, +the values may not be printable; +this follows the X/Open specification. +.PP +The corresponding \fBwunctrl\fP returns a printable representation of +a complex character \fIwch\fP. +.PP +In both \fBunctrl\fP and \fBwunctrl\fP the attributes +and color associated +with the character parameter are ignored. +.SS "keyname, key_name" +The \fBkeyname\fP routine returns a character string +corresponding to the key \fIc\fP. +Key codes are different from character codes. +.bP +Key codes below 256 are characters. +They are displayed using \fBunctrl\fP. +.bP +Values above 256 may be the codes for function keys. +The function key name is displayed. +.bP +Otherwise +(if there is no corresponding name and the key is not a character) +the function returns null, +to denote an error. +X/Open also lists an \*(``UNKNOWN KEY\*('' return value, +which some implementations return rather than null. +.LP +The corresponding \fBkey_name\fP returns +a multibyte character string corresponding +to the wide-character value \fIwc\fP. +The two functions +(\fBkeyname\fP and \fBkey_name\fP) +do not return the same set of strings: +.bP +\fBkeyname\fP returns null where \fBkey_name\fP +would display a meta character. +.bP +\fBkey_name\fP does not return the name of a function key. +.SS "filter, nofilter" +The \fBfilter\fP routine, +if used, +must be called before \fBinitscr\fP or +\fBnewterm\fP are called. +Calling \fBfilter\fP causes these changes in initialization: +.bP +\fBLINES\fP is set to 1; +.bP +the capabilities +\fBclear\fP, +\fBcud1\fP, +\fBcud\fP, +\fBcup\fP, +\fBcuu1\fP, +\fBcuu\fP, +\fBvpa\fP +are disabled; +.bP +the capability \fBed\fP is disabled if \fBbce\fP is set; +.bP +and the \fBhome\fP string is set to the value of \fBcr\fP. +.PP +The \fBnofilter\fP routine cancels the effect +of a preceding \fBfilter\fP call. +That allows the caller to initialize a screen on a different device, +using a different value of \fB$TERM\fP. +The limitation arises because the \fBfilter\fP routine modifies the +in-memory copy of the terminal information. +.SS use_env +The \fBuse_env\fP routine, +if used, +should be called before \fBinitscr\fP or +\fBnewterm\fP are called +(because those compute the screen size). +It modifies the way \fI\%ncurses\fP treats environment variables +when determining the screen size. +.bP +Normally \fI\%ncurses\fP looks first at the terminal database for the +screen size. +.IP +If \fBuse_env\fP was called with \fBFALSE\fP for parameter, +it stops here unless +\fBuse_tioctl\fP was also called with \fBTRUE\fP for parameter. +.bP +Then it asks for the screen size via operating system calls. +If successful, +it overrides the values from the terminal database. +.bP +Finally +(unless \fBuse_env\fP was called with \fBFALSE\fP parameter), +\fI\%ncurses\fP examines the \fILINES\fP or \fI\%COLUMNS\fP environment +variables, +using a value in those to override the results +from the operating system or terminal database. +.IP +\fI\%curses\fP also updates the screen size in response to +\fBSIGWINCH\fP, +unless overridden by the \fILINES\fP or \fI\%COLUMNS\fP environment +variables, +.SS use_tioctl +The \fBuse_tioctl\fP routine, +if used, +should be called before \fBinitscr\fP or \fBnewterm\fP are called +(because those compute the screen size). +After \fBuse_tioctl\fP is called with \fBTRUE\fP as an argument, +\fI\%ncurses\fP modifies the last step in its computation +of screen size as follows: +.bP +checks if the \fILINES\fP and \fI\%COLUMNS\fP environment variables +are set to a number greater than zero. +.bP +for each, +\fI\%ncurses\fP updates the corresponding environment variable +with the value that it has obtained via operating system call +or from the terminal database. +.bP +\fI\%ncurses\fP re-fetches the value of the environment variables so +that it is still the environment variables that set the screen size. +.PP +The \fB\%use_env\fP and \fB\%use_tioctl\fP routines combine as follows. +.IP +.TS +lB lB lB +lB lB lx. +use_env use_tioctl Summary +_ +TRUE FALSE T{ +\fI\%ncurses\fP uses operating system calls +unless overridden by \fILINES\fP or \fI\%COLUMNS\fP environment +variables; +default. +T} +TRUE TRUE T{ +\fI\%ncurses\fP updates \fILINES\fP and \fI\%COLUMNS\fP based on +operating system calls. +T} +FALSE TRUE T{ +\fI\%ncurses\fP ignores \fILINES\fP and \fI\%COLUMNS\fP, +using operating system calls to obtain size. +T} +.TE +.SS "putwin, getwin" +The \fBputwin\fP routine writes all data associated +with window +(or pad) +\fIwin\fP into +the file to which \fIfilep\fP points. +This information can be later retrieved +using the \fBgetwin\fP function. +.PP +The \fBgetwin\fP routine reads window related data stored in the file by +\fBputwin\fP. +The routine then creates and initializes a new window using that +data. +It returns a pointer to the new window. +There are a few caveats: +.bP +the data written is a copy of the \fI\%WINDOW\fP structure, +and its associated character cells. +The format differs between the wide-character \%(\fIncursesw\fP) and +non-wide \%(\fIncurses\fP) libraries. +You can transfer data between the two, +however. +.bP +the retrieved window is always created as a top-level window +(or pad), +rather than a subwindow. +.bP +the window's character cells contain the color pair \fIvalue\fP, +but not the actual color \fInumbers\fP. +If cells in the retrieved window use color pairs that have not been +created in the application using \fBinit_pair\fP, +they will not be colored when the window is refreshed. +.SS delay_output +The \fBdelay_output\fP routine inserts an \fIms\fP millisecond pause +in output. +Employ this function judiciously when terminal output uses padding, +because \fI\%ncurses\fP transmits null characters +(consuming CPU and I/O resources) +instead of sleeping and requesting resumption from the operating system. +Padding is used unless: +.bP +the terminal description has \fBnpc\fP (\fBno_pad_char\fP) capability, +or +.bP +the environment variable \fB\%NCURSES_NO_PADDING\fP is set. +.PP +If padding is not in use, +\fI\%ncurses\fP uses \fBnapms\fP to perform the delay. +If the value of \fIms\fP exceeds 30,000 +(thirty seconds), +it is capped at that value. +.SS flushinp +The \fBflushinp\fP routine throws away any typeahead +that has been typed by the user +and has not yet been read by the program. +.SH RETURN VALUE +Except for \fBflushinp\fP, +routines that return an integer +return \fBERR\fP upon failure and \fBOK\fP +(SVr4 specifies only "an integer value other than \fBERR\fP") +upon successful completion. +.PP +Routines that return pointers return \fBNULL\fP on error. +.PP +In this implementation +.RS 3 +.TP 5 +\fBflushinp\fP +returns +.B ERR +if the terminal was not initialized. +.TP 5 +\fBputwin\fP +returns +.B ERR +if the associated \fIwrite\fP(2) calls return +.BR ERR "." +.RE +.SH PORTABILITY +.SS filter +The SVr4 documentation describes the action of \fBfilter\fP +only in the vaguest terms. +The description here is adapted from X/Open Curses +(which erroneously fails to describe the disabling of \fBcuu\fP). +.SS "delay_output padding" +The limitation to 30 seconds +and the use of \fBnapms\fP +differ from other implementations. +.bP +SVr4 curses does not delay if no padding character is available. +.bP +NetBSD curses uses \fBnapms\fP when no padding character is available, +but does not take timing into account when using the padding character. +.PP +Neither limits the delay. +.SS keyname +The \fBkeyname\fP function may return the names of user-defined +string capabilities that are defined in the terminfo entry +via the \fB\-x\fP +option of \fB@TIC@\fP. +This implementation automatically assigns at run-time key codes to +user-defined strings that begin with \*(``k\*(''. +The key codes start at KEY_MAX, +but are not guaranteed to be the same value for different runs +because user-defined codes are merged +from all terminal descriptions that have been loaded. +The \fBuse_extended_names\fP(3X) function controls whether this data is +loaded when the terminal description is read by the library. +.SS "nofilter, use_tioctl" +The \fBnofilter\fP and \fBuse_tioctl\fP routines are specific to +\fI\%ncurses\fP. +They were not supported on Version 7, +BSD or System V implementations. +It is recommended that any code depending on \fI\%ncurses\fP extensions +be conditioned using \fBNCURSES_VERSION\fP. +.SS "putwin/getwin file-format" +The \fBputwin\fP and \fBgetwin\fP functions have several issues with +portability: +.bP +The files written and read by these functions +use an implementation-specific format. +Although the format is an obvious target for standardization, +it has been overlooked. +.IP +Interestingly enough, +according to the copyright dates in Solaris source, +the functions +(along with \fBscr_init\fP, +etc.\&) +originated with the University of California, +Berkeley +(in 1982) +and were later +(in 1988) +incorporated into SVr4. +Oddly, +there are no such functions in the 4.3BSD curses sources. +.bP +Most implementations simply dump the binary \fI\%WINDOW\fP structure +to the file. +These include SVr4 curses, +NetBSD and PDCurses, +as well as older \fI\%ncurses\fP versions. +This implementation +(as well as the X/Open variant of Solaris curses, +dated 1995) +uses textual dumps. +.IP +The implementations that use binary dumps use block-I/O +(\fIwrite\fP(2) and \fIread\fP(2) functions). +Those that use textual dumps use buffered-I/O. +A few applications may happen to write extra data in the file using +these functions. +Doing that can run into problems mixing block- and buffered-I/O. +This implementation reduces the problem on writes by flushing the +output. +However, +reading from a file written using mixed schemes may not be successful. +.SS "unctrl, wunctrl" +X/Open Curses, +Issue 4 describes these functions. +It specifies no error conditions for them. +It states that \fBunctrl\fP and \fBwunctrl\fP will return a null pointer +if unsuccessful. +This implementation checks for three cases: +.bP +the parameter is a 7-bit US\-ASCII code. +This is the case that X/Open Curses documented. +.bP +the parameter is in the range 128\-159, +i.e., +a C1 control code. +If \fB\%use_legacy_coding\fP(3X) has been called with a \fB2\fP parameter, +\fBunctrl\fP returns the parameter, +i.e., +a one-character string with +the parameter as the first character. +Otherwise, +it returns \*(``~@\*('', +\*(``~A\*('', +etc., +analogous to \*(``^@\*('', +\*(``^A\*('', +C0 controls. +.IP +X/Open Curses does not document whether \fBunctrl\fP can be called +before initializing curses. +This implementation permits that, +and returns the \*(``~@\*('', +etc., +values in that case. +.bP +parameter values outside the 0 to 255 range. +\fBunctrl\fP returns a null pointer. +.PP +The strings returned by \fBunctrl\fP in this implementation +are determined at compile time, +showing C1 controls from the upper-128 codes +with a \*(``~\*('' prefix rather than \*(``^\*(''. +Other implementations have different conventions. +For example, +they may show both sets of control characters with \*(``^\*('', +and strip the parameter to 7 bits. +Or they may ignore C1 controls and treat all of the upper-128 codes as +printable. +This implementation uses 8 bits +but does not modify the string to reflect locale. +The \fB\%use_legacy_coding\fP(3X) function allows the caller to +change the output of \fBunctrl\fP. +.PP +Likewise, +the \fBmeta\fP(3X) function allows the caller to change the output +of \fBkeyname\fP, +i.e., +it determines whether to use the \*(``M\-\*('' prefix +for \*(``meta\*('' keys (codes in the range 128 to 255). +Both \fB\%use_legacy_coding\fP(3X) and \fBmeta\fP(3X) succeed only after +curses is initialized. +X/Open Curses does not document the treatment of codes 128 to 159. +When treating them as \*(``meta\*('' keys +(or if \fBkeyname\fP is called before initializing curses), +this implementation returns strings \*(``M\-^@\*('', +\*(``M\-^A\*('', +etc. +.PP +X/Open Curses documents \fBunctrl\fP as declared in \fB\fP, +which \fI\%ncurses\fP does. +However, +\fI\%ncurses\fP' \fB\fP includes \fB\fP, +matching the behavior of SVr4 curses. +Other implementations may not do that. +.SS "use_env, use_tioctl" +If \fI\%ncurses\fP is configured to provide the sp-functions extension, +the state of \fBuse_env\fP and \fBuse_tioctl\fP may be updated before +creating each \fIscreen\fP rather than once only +(\fBcurs_sp_funcs\fP(3X)). +This feature of \fBuse_env\fP +is not provided by other implementations of curses. +.SH HISTORY +4BSD (1980) +defined +.I \%unctrl +(as a macro, +in +.IR \%unctrl.h ")." +.PP +SVr2 (1984) introduced +.IR \%delay_output "," +.IR \%flushinp "," +and +.IR \%keyname "." +.PP +SVr3 (1987) added +.IR \%filter "." +Later that year, +SVr3.1 brought +.I \%getwin +and +.IR \%putwin "," +reading and writing window dumps +with \fI\%fread\fP(3) and \fI\%fwrite\fP(3), +respectively. +.PP +SVr4 (1989) supplied +.IR \%use_env "." +.PP +X/Open Curses Issue 4 (1995) specified +.I \%key_name +and +.IR \%wunctrl "." +.PP +.I \%ncurses +5.6 (2006) added +.IR \%nofilter "," \" 20060107 +and 6.0 (2015) +.IR \%use_tioctl "." \" 20120714 +.SH SEE ALSO +.na +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_inopts\fP(3X), +\fB\%curs_kernel\fP(3X), +\fB\%curs_scr_dump\fP(3X), +\fB\%curs_sp_funcs\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%legacy_coding\fP(3X) +.ad diff --git a/contrib/ncurses/man/curs_variables.3x b/contrib/ncurses/man/curs_variables.3x new file mode 100644 index 00000000..2c27977d --- /dev/null +++ b/contrib/ncurses/man/curs_variables.3x @@ -0,0 +1,375 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2010-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_variables.3x,v 1.53 2024/09/21 18:01:56 tom Exp $ +.TH curs_variables 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.ie \n(.g .ds : \: +.el .ds : \" empty +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.\" URL hyperlink support macros from groff's "an-ext.tmac" +. +.\" Save the automatic hyphenation mode. +.\" +.\" In AT&T troff, there was no register exposing the hyphenation mode, +.\" and no way to save and restore it. Set `mH` to a reasonable value +.\" for your implementation and preference. +.de mY +. ie !\\n(.g \ +. nr mH 14 +. el \ +. do nr mH \\n[.hy] \" groff extension register +.. +. +.\" Prepare link text for mail/web hyperlinks. `MT` and `UR` call this. +.de mV +. ds mU \\$1\" +.. +. +.\" Emit hyperlink. The optional argument supplies trailing punctuation +.\" after link text. `ME` and `UE` call this. +.de mQ +. mY +. nh +<\\*(mU>\\$1 +. hy \\n(mH +. rm mU +.. +. +.\" Start URL. +.\" .UR url +.if !\n(.g \{\ +.de UR +. mV \\$1 +.. +.\} +. +.\" End URL. +.\" .UE [punctuation] +.if !\n(.g \{\ +.de UE +. mQ \\$1 +.. +.\} +. +.SH NAME +\fI\%bool\fP, +\fI\%chtype\fP, +\fI\%cchar_t\fP, +\fI\%attr_t\fP, +\fI\%SCREEN\fP, +\fI\%WINDOW\fP, +\fB\%TRUE\fP, +\fB\%FALSE\fP, +\fB\%ERR\fP, +\fB\%OK\fP, +\fB\%curscr\fP, +\fB\%newscr\fP, +\fB\%stdscr\fP, +\fB\%COLORS\fP, +\fB\%COLOR_PAIRS\fP, +\fB\%COLS\fP, +\fB\%LINES\fP, +\fB\%ESCDELAY\fP, +\fB\%TABSIZE\fP \- +\fIcurses\fR data types, constants, and global variables +.SH SYNOPSIS +.nf +\fB#include +.PP +\fI/* data types */ +\fBtypedef \fI/*\fP .\|.\|. \fI*/\fP bool; +\fBtypedef \fI/*\fP .\|.\|. \fI*/\fP chtype; +\fBtypedef \fI/*\fP .\|.\|. \fI*/\fP cchar_t; +\fBtypedef \fI/*\fP .\|.\|. \fI*/\fP attr_t; +\fBtypedef \fI/*\fP .\|.\|. \fI*/\fP SCREEN; +\fBtypedef \fI/*\fP .\|.\|. \fI*/\fP WINDOW; +.PP +\fI/* constants */ +\fBconst bool TRUE; +\fBconst bool FALSE; +.PP +\fBconst \fI/*\fP .\|.\|. \fI*/\fP ERR; +\fBconst \fI/*\fP .\|.\|. \fI*/\fP OK; +.PP +\fI/* variables */ +\fBint COLORS; +\fBint COLOR_PAIRS; +\fBint COLS; +\fBint LINES; +\fBWINDOW * curscr; +\fBWINDOW * stdscr; +.PP +\fI/* extensions */ +\fBint ESCDELAY; +\fBint TABSIZE; +\fBWINDOW * newscr; +.fi +.SH DESCRIPTION +This page summarizes data types, +constants, +and variables provided by the \fIcurses\fP library. +Locate further discussion in \fB\%curses\fP(3X). +.PP +Depending on \fI\%ncurses\fP's build-time configuration, +the variables may instead be +macros (see \fB\%curs_threads\fP(3X) and \fB\%curs_opaque\fP(3X)) +that provide read-only access to the library's state. +In either case, +applications should treat them as read-only to avoid +confusing the library. +.SH "CONSTANTS" +.SS "TRUE, FALSE" +The \fIcurses\fP library defines \fBTRUE\fP and \fBFALSE\fP +to represent the values of the Boolean data type. +.SS "ERR, OK" +\fIcurses\fP and \fIterminfo\fP routines frequently return these +constant integral values indicating failure and success, +respectively. +.SH "PREDEFINED TYPES" +.SS "\fIbool\fP" +X/Open Issue 4 \fIcurses\fP (1996) preceded the ISO C99 and ISO C++98 +standards, +each of which also defined a Boolean data type. +The \fIcurses\fP library requires an integral type \fIbool\fP. +.PP +\fB\%ncurses\fP' configure script attempts to discover the +data type used by the system's C and C++ compilers, +to reuse for the \fIcurses\fP \fIbool\fP. +.SS "\fIchtype\fP" +The \fI\%chtype\fP integral type combines a +(\*(``narrow\*('', +8-bit) +character with attributes encoding the character's \fIrendition\fP, +such as the styling of its typeface and/or foreground and background +colors. +See, +for example, +\fB\%addch\fP(3X), +\fB\%attron\fP(3X), +and +\fB\%inch\fP(3X). +.SS "\fIcchar_t\fP, \fIattr_t\fP" +\fI\%chtype\fP is too small for the standard C library's wide-character +type, +\fIwchar_t\fP. +\fI\%cchar_t\fP is a type that can accommodate an \fI\%attr_t\fP and +enough wide characters to store what Unicode terms a \fIgrapheme cluster\fP +(a \*(``user-perceived character\*('' [UAX #29], +which may nevertheless require several character encoding units to +represent). +\fI\%attr_t\fP is an integral type storing \*(``wide\*('' attributes that +apply to \fI\%cchar_t\fPs. +See, +for example, +\fB\%add_wch\fP(3X), +\fB\%attr_on\fP(3X), +and +\fB\%in_wch\fP(3X). +.SS "\fISCREEN\fP" +.I curses +manages a terminal device with this structure type; +see \fB\%initscr\fP(3X). +.SS "\fIWINDOW\fP" +.I curses +represents rectangular portions of the terminal screen with the +.I \%WINDOW +structure type; +see subsection \*(``Overview\*('' of \fB\%ncurses\fP(3X). +.SH "VARIABLES" +.SS "curscr, stdscr, newscr" +The library records updates to the terminal screen in a window named +\fB\%curscr\fP. +This object is referred to as the \*(``physical screen\*('' in +\fB\%curs_refresh\fP(3X) and +\fB\%curs_outopts\fP(3X). +.PP +\fI\%ncurses\fP collects pending updates to the terminal screen in a +window named \fB\%newscr\fP. +This object is referred to as the \*(``virtual screen\*('' in the +\fB\%curs_kernel\fP(3X), +\fB\%curs_refresh\fP(3X), +and +\fB\%curs_outopts\fP(3X). +When the screen is refreshed, +\fIcurses\fP determines a minimal set of updates using the terminal's +capabilities to make \fB\%curscr\fP look like \fB\%newscr\fP. +.PP +Once \fIcurses\fP is initialized, +it creates a window named \fB\%stdscr\fP. +It is the same size as the terminal screen and is the default window +used by routines that do not take a parameter identifying one. +Many \fIcurses\fP functions use this window. +.SS COLORS +Once \fIcurses\fP is initialized, +\fB\%COLORS\fP +contains the number of colors supported by the terminal; +see \fB\%curs_color\fP(3X). +.SS COLOR_PAIRS +Once \fIcurses\fP is initialized, +\fB\%COLOR_PAIRS\fP +contains the number of color pairs supported by the terminal; +see \fB\%curs_color\fP(3X). +.SS "COLS, LINES" +Once \fIcurses\fP is initialized, +.B \%COLS +and +.B LINES +contain the screen's width and height in character cells, +respectively; +that is, +the number of columns and lines. +.SS ESCDELAY +For +.I curses +to distinguish the ESC character resulting from a user's press of the +\*(``Escape\*('' key on the input device from one beginning an +.I "escape sequence" +(as commonly produced by function keys), +it waits after the escape character to see if further characters are +available on the input stream within a short interval. +.B \%ESCDELAY +stores this interval in milliseconds. +.PP +If \fB\%keypad\fP(3X) is disabled for the +.I curses +window receiving input, +a program must disambiguate escape sequences itself. +.SS TABSIZE +The \fIcurses\fP library converts a tab character to this number of +spaces as it adds a tab to a window; +see \fB\%curs_addch\fP(3X). +.SH NOTES +Either \fB\%initscr\fP(3X) or \fB\%newterm\fP(3X) initializes +\fIcurses\fP. +.PP +If +.I \%ncurses +is configured to provide separate +.I curses +and +.I \%tinfo +libraries, +most of these variables reside in the former. +.SH PORTABILITY +The X/Open Curses standard documents all of the foregoing types and +symbols except for \fB\%newscr\fP, +\fB\%TABSIZE\fP, +and \fB\%ESCDELAY\fP. +.PP +X/Open Curses describes \fB\%curscr\fP only as \*(``an internal data +structure\*(''; +SVr4 gave more details, +noting its use \*(``for certain low-level operations like clearing and +redrawing a screen containing garbage\*(''. +.\" SVID 4, Volume 3, p. 408 +Neither specified its interaction with the rest of the interface beyond +use as an argument to \fB\%clearok\fP(3X) and \fB\%wrefresh\fP(3X). +.PP +\fB\%newscr\fP is a feature of SVr4 \fIcurses\fP. +When refreshing the screen, +it is used as a working area for combining the standard window +\fB\%stdscr\fP with any others the application may have created with +\fB\%newwin\fP(3X). +When the update of \fB\%newscr\fP is complete, +\fIcurses\fP modifies \fB\%curscr\fP to match \fB\%newscr\fP. +.PP +\fB\%TABSIZE\fP is a feature of SVr4 \fIcurses\fP. +.bP +SVr4 initially sets \fB\%TABSIZE\fP from the terminal description's +\fB\%init_tabs\fP capability. +After that, +it can be altered by applications using SVr4 \fIcurses\fP. +.bP +SVr4 \fIcurses\fP uses the value of \fB\%TABSIZE\fP to compute the +position of tab stops when updating both +the virtual screen with \fB\%addch\fP(3X) and +the physical screen with \fB\%mvcur\fP(3X). +.bP +\fI\%ncurses\fP uses the value of \fB\%TABSIZE\fP only to update the +virtual screen. +It uses the terminal description's \*(``\fBit\fP\*('' +\%(\fBinit_tabs\fP) capability for computing hardware tabs +(that is, +tab stops on the physical screen). +.bP +Other implementations differ. +For instance, +NetBSD \fIcurses\fP allows \fB\%TABSIZE\fP to be set through an +environment variable. +\fI\%ncurses\fP does not. +.IP +NetBSD \fIcurses\fP does not support hardware tabs; +it uses the \fB\%init_tabs\fP capability and the \fB\%TABSIZE\fP +variable only for updating the virtual screen. +.PP +\fB\%ESCDELAY\fP is a feature of AIX \fIcurses\fP. +.bP +In AIX, +the units for \fB\%ESCDELAY\fP are \fIfifths\fP of milliseconds. +.bP +The default value for AIX's \fB\%ESCDELAY\fP equals 0.1 seconds. +.bP +AIX also enforces a limit of 10,000 seconds for \fB\%ESCDELAY\fP; +\fI\%ncurses\fP does not enforce any upper limit. +.PP +\fI\%ncurses\fP has long used \fB\%ESCDELAY\fP with units of +milliseconds, +making it impossible to be completely compatible with AIX. +Consequently, +most users have decided either to override the value, +or to rely upon its default. +.SH SEE ALSO +.UR https://\*:unicode\*:.org/\*:reports/\*:tr29/ +[UAX #29] \*(``Unicode Standard Annex #29: Unicode Text +Segmentation\*('' +.UE +.PP +\fB\%curses\fP(3X), +\fB\%curs_color\fP(3X), +\fB\%curs_opaque\fP(3X), +\fB\%curs_terminfo\fP(3X), +\fB\%curs_threads\fP(3X), +\fB\%term_variables\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/curs_window.3x b/contrib/ncurses/man/curs_window.3x new file mode 100644 index 00000000..4920de46 --- /dev/null +++ b/contrib/ncurses/man/curs_window.3x @@ -0,0 +1,288 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: curs_window.3x,v 1.54 2024/09/14 20:06:50 tom Exp $ +.TH curs_window 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%newwin\fP, +\fB\%delwin\fP, +\fB\%mvwin\fP, +\fB\%subwin\fP, +\fB\%derwin\fP, +\fB\%mvderwin\fP, +\fB\%dupwin\fP, +\fB\%wsyncup\fP, +\fB\%syncok\fP, +\fB\%wcursyncup\fP, +\fB\%wsyncdown\fP \- +create and manipulate \fIcurses\fR windows +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBWINDOW * newwin( + int \fInlines\fP, int \fIncols\fP, + int \fIbegin_y\fP, int \fIbegin_x\fP); +\fBint delwin(WINDOW * \fIwin\fP); +\fBint mvwin(WINDOW * \fIwin\fP, int \fIy\fP, int \fIx\fP); +\fBWINDOW * subwin(WINDOW * \fIorig\fP, + int \fInlines\fP, int \fIncols\fP, + int \fIbegin_y\fP, int \fIbegin_x\fP); +\fBWINDOW * derwin(WINDOW * \fIorig\fP, + int \fInlines\fP, int \fIncols\fP, + int \fIbegin_y\fP, int \fIbegin_x\fP); +\fBint mvderwin(WINDOW * \fIwin\fP, int \fIpar_y\fP, int \fIpar_x\fP); +\fBWINDOW * dupwin(WINDOW * \fIwin\fP); +\fBvoid wsyncup(WINDOW * \fIwin\fP); +\fBint syncok(WINDOW * \fIwin\fP, bool \fIbf\fP); +\fBvoid wcursyncup(WINDOW * \fIwin\fP); +\fBvoid wsyncdown(WINDOW * \fIwin\fP); +.fi +.SH DESCRIPTION +.SS newwin +Calling \fBnewwin\fP creates and returns a pointer to a new window with the +given number of lines and columns. +The upper left-hand corner of the window is +at +.RS +line \fIbegin\fR_\fIy\fP, +.br +column \fIbegin\fR_\fIx\fP +.RE +.PP +If either +\fInlines\fP or \fIncols\fP is zero, they default to +.RS +\fBLINES \-\fP \fIbegin\fR_\fIy\fP and +.br +\fBCOLS \-\fP \fIbegin\fR_\fIx\fP. +.RE +.PP +A new full-screen window is created by calling \fBnewwin(0,0,0,0)\fP. +.PP +Regardless of the function used for creating a new window +(e.g., \fBnewwin\fP, \fBsubwin\fP, \fBderwin\fP, \fBnewpad\fP), +rather than a duplicate (with \fBdupwin\fP), +all of the window modes are initialized to the default values. +These functions set window modes after a window is created: +.RS +.PP +\fB\%idcok\fP +\fB\%idlok\fP +\fB\%immedok\fP +\fB\%keypad\fP +\fB\%leaveok\fP +\fB\%nodelay\fP +\fB\%scrollok\fP +\fB\%setscrreg\fP +\fB\%syncok\fP +\fB\%wbkgdset\fP +\fB\%wbkgrndset\fP and +\fB\%wtimeout\fP. +.RE +.SS delwin +Calling \fBdelwin\fP deletes the named window, freeing all memory +associated with it (it does not actually erase the window's screen +image). +Subwindows must be deleted before the main window can be deleted. +.SS mvwin +Calling \fBmvwin\fP moves the window so that the upper left-hand +corner is at position (\fIx\fP, \fIy\fP). +If the move would cause the window to be off the screen, +it is an error and the window is not moved. +Moving subwindows is allowed, but should be avoided. +.SS subwin +Calling \fBsubwin\fP creates and returns a pointer to a new window +with the given number of lines, \fInlines\fP, and columns, \fIncols\fP. +The window is at position (\fIbegin\fR_\fIy\fP, +\fIbegin\fR_\fIx\fP) on the screen. +The subwindow shares memory with the window \fIorig\fP, +its \fIancestor\fP, +so that changes made to one window +will affect both windows. +When using this routine, it is necessary to call +\fBtouchwin\fP or \fBtouchline\fP on \fIorig\fP before calling +\fBwrefresh\fP on the subwindow. +.SS derwin +Calling \fBderwin\fP is the same as calling \fBsubwin,\fP except that +\fIbegin\fR_\fIy\fP and \fIbegin\fR_\fIx\fP are relative to the origin +of the window \fIorig\fP rather than the screen. +There is no difference between the subwindows and the derived windows. +.SS mvderwin +Calling \fBmvderwin\fP moves a derived window (or subwindow) +inside its parent window. +The screen-relative parameters of the window are not changed. +This routine is used to display different +parts of the parent window at the same physical position on the +screen. +.SS dupwin +Calling \fBdupwin\fP creates an exact duplicate of the window \fIwin\fP. +.SS wsyncup +Calling \fBwsyncup\fP touches all locations in ancestors of \fIwin\fP that are +changed in \fIwin\fP. +If \fBsyncok\fP is called with second argument +\fBTRUE\fP then \fBwsyncup\fP is called automatically whenever there is a +change in the window. +.SS wsyncdown +The \fBwsyncdown\fP routine touches each location in \fIwin\fP that has been +touched in any of its ancestor windows. +This routine is called by +\fBwrefresh\fP, so it should almost never be necessary to call it manually. +.SS wcursyncup +The routine \fBwcursyncup\fP updates the current cursor position of all the +ancestors of the window to reflect the current cursor position of the +window. +.SH RETURN VALUE +Routines that return an integer return the integer \fBERR\fP upon failure and +\fBOK\fP (SVr4 only specifies "an integer value other than \fBERR\fP") upon +successful completion. +.PP +Routines that return pointers return \fBNULL\fP on error. +.PP +X/Open defines no error conditions. +In this implementation +.TP 5 +\fBdelwin\fP +returns +.B ERR +if the window pointer is null, or +if the window is the parent of another window. +.TP 5 +\fBderwin\fP +returns +.B ERR +if the parent window pointer is null, or +if any of its ordinates or dimensions is negative, or +if the resulting window does not fit inside the parent window. +.TP 5 +\fBdupwin\fP +returns +.B ERR +if the window pointer is null. +.IP +This implementation also maintains a list of windows, +and checks that the pointer passed to \fBdelwin\fP is one that +it created, returning an error if it was not.. +.TP 5 +\fBmvderwin\fP +returns +.B ERR +if the window pointer is null, or +if some part of the window would be placed off-screen. +.TP 5 +\fBmvwin\fP +returns +.B ERR +if the window pointer is null, or +if the window is really a pad, or +if some part of the window would be placed off-screen. +.TP 5 +\fBnewwin\fP +will fail if either of its beginning ordinates is negative, or +if either the number of lines or columns is negative. +.TP 5 +\fBsyncok\fP +returns +.B ERR +if the window pointer is null. +.TP 5 +\fBsubwin\fP +returns +.B ERR +if the parent window pointer is null, or +if any of its ordinates or dimensions is negative, or +if the resulting window does not fit inside the parent window. +.PP +The functions which return a window pointer +may also fail if there is insufficient memory for its data structures. +Any of these functions will fail if the screen has not been initialized, +i.e., with \fBinitscr\fP or \fBnewterm\fP. +.SH NOTES +If many small changes are made to the window, the \fBwsyncup\fP option could +degrade performance. +.PP +Note that \fBsyncok\fP may be a macro. +.SH PORTABILITY +X/Open Curses, Issue 4 describes these functions. +.PP +Regarding +.IR \%delwin "," +X/Open Curses states that +.RS +.PP +[t]he application must delete subwindows before deleting the main +window. +.RE +.PP +If +.I \%delwin +is asked to delete a parent window, +it can succeed only if the +.I curses +library keeps a list of its subwindows. +SVr4 +.I curses +kept a count of the number of subwindows rather than a list. +It simply returned +.B ERR +when asked to delete a subwindow. +Solaris X/Open +.I curses +.RI \%( xcurses ) +does not make even that check, +and will delete a parent window that still has subwindows. +.I \%PDCurses +also behaves this way. +.PP +.I \%ncurses +4.0 (1996) and later maintains a list of windows for each screen +to ensure that a window has no subwindows before allowing its deletion. +NetBSD +.I curses +has followed suit since 2003. +.PP +SVr4 +.I curses +documentation is unclear about what +.I \%wsyncup +and +.I \%wsyncdown +actually do. +It seems to imply that they are supposed to touch only those lines that +are affected by changes to a window's ancestors. +The description and behavior of these functions in +.I \%ncurses +is patterned on the X/Open Curses standard; +this approach may result in slower updates. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_initscr\fP(3X), +\fB\%curs_refresh\fP(3X), +\fB\%curs_touch\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/default_colors.3x b/contrib/ncurses/man/default_colors.3x new file mode 100644 index 00000000..96124147 --- /dev/null +++ b/contrib/ncurses/man/default_colors.3x @@ -0,0 +1,153 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2000-2011,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1997,1999,2000,2005 +.\" +.\" $Id: default_colors.3x,v 1.52 2024/04/13 22:17:22 tom Exp $ +.TH default_colors 3X 2024-04-13 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fB\%use_default_colors\fP, +\fB\%assume_default_colors\fP \- +use terminal's default colors in \fIcurses\fP +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint use_default_colors(void); +\fBint assume_default_colors(int \fIfg\fP, int \fIbg\fP); +.fi +.SH DESCRIPTION +The \fBuse_default_colors\fP and \fBassume_default_colors\fP +functions are extensions to the curses library. +They are used with terminals that support ISO 6429 color, or equivalent. +These terminals allow the application to reset color to an unspecified +default value (e.g., with SGR 39 or SGR 49). +.PP +Applications that paint a colored background over the whole screen +do not take advantage of SGR 39 and SGR 49. +Some applications are designed to work with the default background, +using colors only for text. +For example, there are several implementations of the \fBls\fP program +which use colors to denote different file types or permissions. +These \*(``color ls\*('' programs do not necessarily +modify the background color, +typically using only the \fBsetaf\fP terminfo capability to set the +foreground color. +Full-screen applications that use default colors can achieve similar +visual effects. +.PP +The first function, \fBuse_default_colors\fP +tells the curses library to assign terminal default +foreground/background colors to color number \-1. +So init_pair(x,COLOR_RED,\-1) +will initialize pair x as red on default background +and init_pair(x,\-1,COLOR_BLUE) will +initialize pair x as default foreground on blue. +.PP +The other, \fBassume_default_colors\fP +is a refinement which tells which colors to paint for color pair 0. +This function recognizes a special color number \-1, +which denotes the default terminal color. +.PP +The following are equivalent: +.RS +.br +.I use_default_colors(); +.br +.I assume_default_colors(\-1,\-1); +.RE +.PP +These are \fI\%ncurses\fP extensions. +For other curses implementations, color +number \-1 does not mean anything, just as for \fI\%ncurses\fP before a +successful call of \fBuse_default_colors\fP or \fBassume_default_colors\fP. +.PP +Other curses implementations do not allow an application to modify color pair 0. +They assume that the background is COLOR_BLACK, +but do not ensure that the color pair 0 is painted to match the +assumption. +If your application does not use either +.B use_default_colors +or +.B assume_default_colors +\fI\%ncurses\fP will paint a white foreground (text) with black background +for color pair 0. +.SH RETURN VALUE +These functions return the integer \fBERR\fP upon failure +and \fBOK\fP on success. +They will fail if either the terminal does not support +the \fBorig_pair\fP or \fBorig_colors\fP capability. +If the \fBinitialize_pair\fP capability is not found, this causes an +error as well. +.SH NOTES +Associated with this extension, the \fBinit_pair\fP function accepts +negative arguments to specify default foreground or background colors. +.PP +The \fBuse_default_colors\fP function was added to support \fBded\fP. +This is a full-screen application which uses curses to manage only part +of the screen. +The bottom portion of the screen, which is of adjustable +size, is left uncolored to display the results from shell commands. +The top portion of the screen colors filenames using a scheme like the +\*(``color ls\*('' programs. +Attempting to manage the background color of the screen for this application +would give unsatisfactory results for a variety of reasons. +This extension was devised after +noting that color xterm (and similar programs) provides a background color +which does not necessarily correspond to any of the ANSI colors. +While a special terminfo entry could be constructed using nine colors, +there was no mechanism provided within curses to account for the related +\fBorig_pair\fP and \fBback_color_erase\fP capabilities. +.PP +The \fBassume_default_colors\fP function was added to solve +a different problem: support for applications which would use +environment variables and other configuration to bypass curses' +notion of the terminal's default colors, setting specific values. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on +Version 7, BSD or System V implementations. +It is recommended that +any code depending on them be conditioned using NCURSES_VERSION. +.SH AUTHORS +Thomas Dickey (from an analysis of the requirements for color xterm +for XFree86 3.1.2C, February 1996). +.SH SEE ALSO +\fB\%ded\fP(1), +\fB\%curs_color\fP(3X) diff --git a/contrib/ncurses/man/define_key.3x b/contrib/ncurses/man/define_key.3x new file mode 100644 index 00000000..0042d8de --- /dev/null +++ b/contrib/ncurses/man/define_key.3x @@ -0,0 +1,129 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1997 +.\" +.\" $Id: define_key.3x,v 1.50 2024/07/27 19:43:41 tom Exp $ +.TH define_key 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%define_key\fP \- +define a \fIcurses\fP function key code +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint define_key(const char * \fIdefinition\fP, int \fIkey-code\fP); +.fi +.SH DESCRIPTION +The +.B \%define_key +.I \%ncurses +extension permits a +.I curses +application to +.I bind +a string +.I definition +to the function key +.I key-code +returned by \fB\%wgetch\fP(3X) +(wide-character API users: +\fB\%wget_wch\fP(3X)) +when \fB\%keypad\fP(3X) is enabled in a window and a function key is +pressed. +.I \%ncurses +interprets such a binding as it does those in the +.I \%term\%info +database entry for the terminal type. +.PP +A +.I definition +of +.B NULL +removes any existing binding from +.IR key-code "." +Similarly, +a non-positive +.I key-code +removes an existing binding for +.IR definition "," +if any. +.SH RETURN VALUE +.B \%define_key +returns +.B ERR +if +.bP +.I definition +is +.B NULL +and +.I key-code +is nonpositive, +or +.bP +insufficient memory is available to bind +.I definition +to +.IR key-code "." +.PP +Otherwise, +.B \%define_key +returns +.BR OK "." +.SH EXTENSIONS +.B \%define_key +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +NetBSD +.I curses +since 2.0 (2004) supports +.IR \%define_key "." +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%keybound\fP(3X), +\fB\%keyok\fP(3X), +\fB\%key_defined\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/form.3x b/contrib/ncurses/man/form.3x new file mode 100644 index 00000000..b17e41f7 --- /dev/null +++ b/contrib/ncurses/man/form.3x @@ -0,0 +1,246 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form.3x,v 1.56 2024/05/25 20:52:38 tom Exp $ +.TH form 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBform\fP \- +present user-fillable forms in \fIcurses\fP windows +.SH SYNOPSIS +.nf +\fB#include +.fi +.SH DESCRIPTION +The \fBform\fP library provides terminal-independent facilities for composing +form screens on character-cell terminals. +The library includes: field +routines, which create and modify form fields; and form routines, which group +fields into forms, display forms on the screen, and handle interaction with the +user. +.PP +The \fBform\fP library uses the \fBcurses\fP libraries. +To use the \fBform\fP library, link with the options +\fB\-lform \-lcurses\fP. +.PP +Your program should set up the locale, e.g., +.sp + \fBsetlocale(LC_ALL, "");\fP +.sp +so that input/output processing will work. +.PP +A curses initialization routine such as \fBinitscr\fP must be called +before using any of these functions. +. +.SS "Current Default Values for Field Attributes" +. +The \fBform\fP library maintains a default value for field attributes. +You +can get or set this default by calling the appropriate \fBset_\fP +or retrieval +routine with a \fBNULL\fP field pointer. +Changing this default with a +\fBset_\fP function affects future field creations, but does not change the +rendering of fields already created. +. +.SS "Routine Name Index" +. +The following table lists each \fBform\fP routine and the name of +the manual page on which it is described. +Routines flagged with \*(``*\*('' +are \fI\%ncurses\fP-specific, not present in SVr4. +.PP +.TS +l l +l l . +\fBcurses\fP Routine Name Manual Page Name += +current_field \fBform_page\fP(3X) +data_ahead \fBform_data\fP(3X) +data_behind \fBform_data\fP(3X) +dup_field \fBform_field_new\fP(3X) +dynamic_field_info \fBform_field_info\fP(3X) +field_arg \fBform_field_validation\fP(3X) +field_back \fBform_field_attributes\fP(3X) +field_buffer \fBform_field_buffer\fP(3X) +field_count \fBform_field\fP(3X) +field_fore \fBform_field_attributes\fP(3X) +field_index \fBform_page\fP(3X) +field_info \fBform_field_info\fP(3X) +field_init \fBform_hook\fP(3X) +field_just \fBform_field_just\fP(3X) +field_opts \fBform_field_opts\fP(3X) +field_opts_off \fBform_field_opts\fP(3X) +field_opts_on \fBform_field_opts\fP(3X) +field_pad \fBform_field_attributes\fP(3X) +field_status \fBform_field_buffer\fP(3X) +field_term \fBform_hook\fP(3X) +field_type \fBform_field_validation\fP(3X) +field_userptr \fBform_field_userptr\fP(3X) +form_driver \fBform_driver\fP(3X) +form_driver_w \fBform_driver\fP(3X)* +form_fields \fBform_field\fP(3X) +form_init \fBform_hook\fP(3X) +form_opts \fBform_opts\fP(3X) +form_opts_off \fBform_opts\fP(3X) +form_opts_on \fBform_opts\fP(3X) +form_page \fBform_page\fP(3X) +form_request_by_name \fBform_requestname\fP(3X)* +form_request_name \fBform_requestname\fP(3X)* +form_sub \fBform_win\fP(3X) +form_term \fBform_hook\fP(3X) +form_userptr \fBform_userptr\fP(3X) +form_win \fBform_win\fP(3X) +free_field \fBform_field_new\fP(3X) +free_fieldtype \fBform_fieldtype\fP(3X) +free_form \fBform_new\fP(3X) +link_field \fBform_field_new\fP(3X) +link_fieldtype \fBform_fieldtype\fP(3X) +move_field \fBform_field\fP(3X) +new_field \fBform_field_new\fP(3X) +new_fieldtype \fBform_fieldtype\fP(3X) +new_form \fBform_new\fP(3X) +new_page \fBform_new_page\fP(3X) +pos_form_cursor \fBform_cursor\fP(3X) +post_form \fBform_post\fP(3X) +scale_form \fBform_win\fP(3X) +set_current_field \fBform_page\fP(3X) +set_field_back \fBform_field_attributes\fP(3X) +set_field_buffer \fBform_field_buffer\fP(3X) +set_field_fore \fBform_field_attributes\fP(3X) +set_field_init \fBform_hook\fP(3X) +set_field_just \fBform_field_just\fP(3X) +set_field_opts \fBform_field_opts\fP(3X) +set_field_pad \fBform_field_attributes\fP(3X) +set_field_status \fBform_field_buffer\fP(3X) +set_field_term \fBform_hook\fP(3X) +set_field_type \fBform_field_validation\fP(3X) +set_field_userptr \fBform_field_userptr\fP(3X) +set_fieldtype_arg \fBform_fieldtype\fP(3X) +set_fieldtype_choice \fBform_fieldtype\fP(3X) +set_form_fields \fBform_field\fP(3X) +set_form_init \fBform_hook\fP(3X) +set_form_opts \fBform_field_opts\fP(3X) +set_form_page \fBform_page\fP(3X) +set_form_sub \fBform_win\fP(3X) +set_form_term \fBform_hook\fP(3X) +set_form_userptr \fBform_userptr\fP(3X) +set_form_win \fBform_win\fP(3X) +set_max_field \fBform_field_buffer\fP(3X) +set_new_page \fBform_new_page\fP(3X) +unfocus_current_field \fBform_page\fP(3X)* +unpost_form \fBform_post\fP(3X) +.TE +.SH RETURN VALUE +Routines that return pointers return \fBNULL\fP on error, +and set \fBerrno\fP to the corresponding error-code returned by functions +returning an integer. +Routines that return +an integer return one of the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_CONNECTED +The field is already connected to a form. +.TP 5 +.B E_INVALID_FIELD +Contents of a field are not valid. +.TP 5 +.B E_NOT_CONNECTED +No fields are connected to the form. +.TP 5 +.B E_NOT_POSTED +The form has not been posted. +.TP 5 +.B E_NO_ROOM +Form is too large for its window. +.TP 5 +.B E_POSTED +The form is already posted. +.TP 5 +.B E_REQUEST_DENIED +The form driver could not process the request. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_UNKNOWN_COMMAND +The form driver code saw an unknown request code. +.SH NOTES +The header file \fI\%form.h\fP itself includes \fI\%curses.h\fP. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +A form facility was documented in SVr4.2's +\fICharacter User Interface Programming\fP document. +.PP +It is not part of X/Open Curses. +.PP +Aside from \fI\%ncurses\fP, there are few implementations: +.bP +systems based on SVr4 source code, e.g., Solaris. +.bP +NetBSD curses. +.PP +A few functions in this implementation are extensions added for +\fI\%ncurses\fP, +but not provided by other implementations, e.g., +\fBform_driver_w\fP, +\fBunfocus_current_field\fP. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for \fI\%ncurses\fP by Eric +S. Raymond. +.SH SEE ALSO +\fBcurses\fP(3X) and related pages whose names begin \*(``form_\*('' for +detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/form_cursor.3x b/contrib/ncurses/man/form_cursor.3x new file mode 100644 index 00000000..ed8bab15 --- /dev/null +++ b/contrib/ncurses/man/form_cursor.3x @@ -0,0 +1,71 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_cursor.3x,v 1.31 2024/03/16 15:35:01 tom Exp $ +.TH form_cursor 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBpos_form_cursor\fP \- +position a form window cursor +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint pos_form_cursor(FORM *\fIform\fP); +.fi +.SH DESCRIPTION +The function \fBpos_form_cursor\fP restores the cursor to the position required +for the forms driver to continue processing requests. +This is useful after +\fBcurses\fP routines have been called to do screen-painting in response to a +form operation. +.SH RETURN VALUE +This routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_NOT_POSTED +The form has not been posted. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_data.3x b/contrib/ncurses/man/form_data.3x new file mode 100644 index 00000000..ded82eba --- /dev/null +++ b/contrib/ncurses/man/form_data.3x @@ -0,0 +1,61 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_data.3x,v 1.32 2024/03/16 15:35:01 tom Exp $ +.TH form_data 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBdata_ahead\fP, +\fBdata_behind\fP \- +test for off-screen data in given forms +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBbool data_ahead(const FORM *\fIform\fP); +\fBbool data_behind(const FORM *\fIform\fP); +.fi +.SH DESCRIPTION +The function \fBdata_ahead\fP tests whether there is off-screen data +ahead in the given form. +It returns TRUE (1) or FALSE (0). +.PP +The function \fBdata_behind\fP tests whether there is off-screen data +behind in the given form. +It returns TRUE (1) or FALSE (0). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_driver.3x b/contrib/ncurses/man/form_driver.3x new file mode 100644 index 00000000..882a49dd --- /dev/null +++ b/contrib/ncurses/man/form_driver.3x @@ -0,0 +1,265 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_driver.3x,v 1.61 2024/04/20 18:55:09 tom Exp $ +.TH form_driver 3X 2024-04-20 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBform_driver\fP, +\fBform_driver_w\fP \- +command-processing loop of the form system +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint form_driver(FORM *\fIform\fP, int \fIc\fP); +\fBint form_driver_w(FORM *\fIform\fP, int \fIc\fP, wchar_t \fIwc\fP); +.fi +.SH DESCRIPTION +.SS form_driver +Once a form has been posted (displayed), you should funnel input events to it +through \fBform_driver\fP. This routine has three major input cases: +.bP +The input is a form navigation request. +Navigation request codes are constants defined in \fB\fP, +which are distinct from the key- and character codes returned +by \fBwgetch\fP(3X). +.bP +The input is a printable character. +Printable characters (which must be positive, less than 256) are +checked according to the program's locale settings. +.bP +The input is the KEY_MOUSE special key associated with an mouse event. +.SS form_driver_w +This extension simplifies the use of the forms library using wide characters. +The input is either a key code (a request) or a wide character +returned by \fBget_wch\fP(3X). +The type must be passed as well, +to enable the library to determine whether the parameter +is a wide character or a request. +.SS "Form Driver Requests" +The form driver requests are as follows: +.PP +.TS +Lb Lb +Lb Lx. +Name Description +_ +REQ_BEG_FIELD Move to beginning of field. +REQ_BEG_LINE Move to beginning of the line. +REQ_CLR_EOF Clear to end of field from cursor. +REQ_CLR_EOL Clear to end of line from cursor. +REQ_CLR_FIELD Clear the entire field. +REQ_DEL_CHAR Delete character at the cursor. +REQ_DEL_LINE Delete line at the cursor. +REQ_DEL_PREV Delete character before the cursor. +REQ_DEL_WORD Delete blank-delimited word at cursor. +REQ_DOWN_CHAR Move down in field. +REQ_DOWN_FIELD Move down to a field. +REQ_END_FIELD Move to the end of field. +REQ_END_LINE Move to the end of the line. +REQ_FIRST_FIELD Move to the first field. +REQ_FIRST_PAGE Move to the first page. +REQ_INS_CHAR Insert a blank at the cursor. +REQ_INS_LINE Insert a blank line at the cursor. +REQ_INS_MODE Enter insert mode. +REQ_LAST_FIELD Move to the last field. +REQ_LAST_PAGE Move to the last field. +REQ_LEFT_CHAR Move left in field. +REQ_LEFT_FIELD Move left to a field. +REQ_NEW_LINE Insert or overlay a new line. +REQ_NEXT_CHAR Move to the next char. +REQ_NEXT_CHOICE Display next field choice. +REQ_NEXT_FIELD Move to the next field. +REQ_NEXT_LINE Move to the next line. +REQ_NEXT_PAGE Move to the next page. +REQ_NEXT_PAGE Move to the next page. +REQ_NEXT_WORD Move to the next word. +REQ_OVL_MODE Enter overlay mode. +REQ_PREV_CHAR Move to the previous char. +REQ_PREV_CHOICE Display previous field choice. +REQ_PREV_FIELD Move to the previous field. +REQ_PREV_LINE Move to the previous line. +REQ_PREV_PAGE Move to the previous page. +REQ_PREV_WORD Move to the previous word. +REQ_RIGHT_CHAR Move right in field. +REQ_RIGHT_FIELD Move right to a field. +REQ_SCR_BCHAR Scroll field backward 1 character. +REQ_SCR_BHPAGE Scroll field backward \(12 page. +REQ_SCR_BLINE Scroll field backward 1 line. +REQ_SCR_BPAGE Scroll field backward 1 page. +REQ_SCR_FCHAR Scroll field forward 1 character. +REQ_SCR_FHPAGE Scroll field forward \(12 page. +REQ_SCR_FLINE Scroll field forward 1 line. +REQ_SCR_FPAGE Scroll field forward 1 page. +REQ_SCR_HBHALF Horizontal scroll field backward \(12 line. +REQ_SCR_HBLINE Horizontal scroll field backward 1 line. +REQ_SCR_HFHALF Horizontal scroll field forward \(12 line. +REQ_SCR_HFLINE Horizontal scroll field forward 1 line. +REQ_SFIRST_FIELD Move to the sorted first field. +REQ_SLAST_FIELD Move to the sorted last field. +REQ_SNEXT_FIELD Move to the sorted next field. +REQ_SPREV_FIELD Move to the sorted previous field. +REQ_UP_CHAR Move up in field. +REQ_UP_FIELD Move up to a field. +REQ_VALIDATION Validate field. +.TE +.PP +If the second argument is a printable character, the driver places it +in the current position in the current field. +If it is one of the forms +requests listed above, that request is executed. +.SS "Field Validation" +The form library makes updates to the window associated +with form fields rather than directly to the field buffers. +.PP +The form driver provides low-level control over updates to the form fields. +The form driver also provides for validating modified fields +to ensure that the contents +meet whatever constraints an application may attach using \fBset_field_type\fP. +.PP +You can validate a field without making any changes to it using +\fBREQ_VALIDATION\fP. +The form driver also validates a field in these cases: +.bP +a call to \fBset_current_field\fP attempts to move to a different field. +.bP +a call to \fBset_current_page\fP attempts to move +to a different page of the form. +.bP +a request attempts to move to a different field. +.bP +a request attempts to move to a different page of the form. +.PP +In each case, the move fails if the field is invalid. +.PP +If the modified field is valid, the form driver copies the modified +data from the window associated with the field +to the field buffer. +.SS "Mouse Handling" +If the second argument is the KEY_MOUSE special key, the associated +mouse event is translated into one of the above pre-defined requests. +Currently only clicks in the user window (e.g., inside the form display +area or the decoration window) are handled. +.PP +If you click above the display region of the form: +.RS 3 +.TP +a REQ_PREV_FIELD is generated for a single click, +.TP +a REQ_PREV_PAGE is generated for a double-click and +.TP +a REQ_FIRST_FIELD is generated for a triple-click. +.RE +.PP +If you click below the display region of the form: +.RS 3 +.TP +a REQ_NEXT_FIELD is generated for a single click, +.TP +a REQ_NEXT_PAGE is generated for a double-click and +.TP +a REQ_LAST_FIELD is generated for a triple-click. +.RE +.PP +If you click at an field inside the display area of the form: +.RS 3 +.bP +the form cursor is positioned to that field. +.bP +If you double-click a field, +the form cursor is positioned to that field +and \fBE_UNKNOWN_COMMAND\fP is returned. +This return value makes sense, +because a double click usually means that an field-specific action should +be returned. +It is exactly the purpose of this return value to signal that an +application specific command should be executed. +.bP +If a translation +into a request was done, \fBform_driver\fP returns the result of this request. +.RE +.PP +If you clicked outside the user window +or the mouse event could not be translated +into a form request an \fBE_REQUEST_DENIED\fP is returned. +.SS "Application-defined Commands" +If the second argument is neither printable nor one of the above +pre-defined form requests, the driver assumes it is an application-specific +command and returns \fBE_UNKNOWN_COMMAND\fP. Application-defined commands +should be defined relative to \fBMAX_COMMAND\fP, the maximum value of these +pre-defined requests. +.SH RETURN VALUE +\fBform_driver\fP returns one of the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NOT_POSTED +The form has not been posted. +.TP 5 +.B E_INVALID_FIELD +Contents of field is invalid. +.TP 5 +.B E_NOT_CONNECTED +No fields are connected to the form. +.TP 5 +.B E_REQUEST_DENIED +The form driver could not process the request. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_UNKNOWN_COMMAND +The form driver code saw an unknown request code. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X), +\fB\%form_fieldtype\fP(3X), +\fB\%form_field_buffer\fP(3X), +\fB\%form_field_validation\fP(3X), +\fB\%form_variables\fP(3X), +\fB\%getch\fP(3X) diff --git a/contrib/ncurses/man/form_field.3x b/contrib/ncurses/man/form_field.3x new file mode 100644 index 00000000..9799d0c0 --- /dev/null +++ b/contrib/ncurses/man/form_field.3x @@ -0,0 +1,91 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2012 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field.3x,v 1.34 2024/03/16 15:35:01 tom Exp $ +.TH form_field 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBform_field\fP \- +make and break connections between fields and forms +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_form_fields(FORM *\fIform\fP, FIELD **\fIfields\fP); +\fBFIELD **form_fields(const FORM *\fIform\fP); +\fBint field_count(const FORM *\fIform\fP); +\fBint move_field(FIELD *\fIfield\fP, int \fIfrow\fP, int \fIfcol\fP); +.fi +.SH DESCRIPTION +The function \fBset_form_fields\fP changes the field pointer array of +the given \fIform\fP. The array must be terminated by a \fBNULL\fP. +.PP +The function \fBform_fields\fP returns the field array of the given form. +.PP +The function \fBfield_count\fP returns the count of fields in \fIform\fP. +.PP +The function \fBmove_field\fP moves the given field (which must be disconnected) +to a specified location on the screen. +.SH RETURN VALUE +The function \fBform_fields\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +The function \fBfield_count\fP returns \fBERR\fP if the \fIform\fP parameter +is \fBNULL\fP. +.PP +The functions \fBset_form_fields\fP and \fBmove_field\fP return one of +the following codes on error: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_CONNECTED +The field is already connected to a form. +.TP 5 +.B E_POSTED +The form is already posted. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +The SVr4 forms library documentation specifies the \fBfield_count\fP error value +as \-1 (which is the value of \fBERR\fP). +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_field_attributes.3x b/contrib/ncurses/man/form_field_attributes.3x new file mode 100644 index 00000000..687e909e --- /dev/null +++ b/contrib/ncurses/man/form_field_attributes.3x @@ -0,0 +1,97 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_attributes.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH form_field_attributes 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fBform_field_attributes\fP \- +color and attribute control for form fields +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_field_fore(FIELD *\fIfield\fP, chtype \fIattr\fP); +\fBchtype field_fore(const FIELD *\fIfield\fP); +.PP +\fBint set_field_back(FIELD *\fIfield\fP, chtype \fIattr\fP); +\fBchtype field_back(const FIELD *\fIfield\fP); +.PP +\fBint set_field_pad(FIELD *\fIfield\fP, int \fIpad\fP); +\fBint field_pad(const FIELD *\fIfield\fP); +.fi +.SH DESCRIPTION +The function \fBset_field_fore\fP sets the foreground attribute of +\fIfield\fP. This is the highlight used to display the field contents. The +function \fBfield_fore\fP returns the foreground attribute. +The default is +\fBA_STANDOUT\fP. +.PP +The function \fBset_field_back\fP sets the background attribute of +\fIform\fP. This is the highlight used to display the extent fields in the +form. +The function \fBfield_back\fP returns the background attribute. +The +default is \fBA_NORMAL\fP. +.PP +The function \fBset_field_pad\fP sets the character used to fill the field. +The function \fBfield_pad\fP returns the given form's pad character. +The +default is a blank. +.SH RETURN VALUE +These routines return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``form_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/form_field_buffer.3x b/contrib/ncurses/man/form_field_buffer.3x new file mode 100644 index 00000000..ba176d3e --- /dev/null +++ b/contrib/ncurses/man/form_field_buffer.3x @@ -0,0 +1,147 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_buffer.3x,v 1.45 2024/03/16 15:35:01 tom Exp $ +.TH form_field_buffer 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBform_field_buffer\fP \- +field buffer control +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_field_buffer(FIELD *\fIfield\fP, int \fIbuf\fP, const char *\fIvalue\fP); +\fBchar *field_buffer(const FIELD *\fIfield\fP, int \fIbuffer\fP); +.PP +\fBint set_field_status(FIELD *\fIfield\fP, bool \fIstatus\fP); +\fBbool field_status(const FIELD *\fIfield\fP); +.PP +\fBint set_max_field(FIELD *\fIfield\fP, int \fImax\fP); +.fi +.SH DESCRIPTION +The function \fBset_field_buffer\fP sets the numbered buffer of the given field +to contain a given string: +.RS 3 +.bP +Buffer 0 is the displayed value of the field. +.bP +Other numbered buffers may be allocated by applications through the \fBnbuf\fP +argument of (see \fBform_field_new\fP(3X)) +but are not manipulated by the forms library. +.RE +.PP +The function \fBfield_buffer\fP returns a pointer to +the contents of the given numbered buffer: +.RS 3 +.bP +The buffer contents always have the same length, +and are padded with trailing spaces +as needed to ensure this length is the same. +.bP +The buffer may contain leading spaces, depending on how it was set. +.bP +The buffer contents are set with \fBset_field_buffer\fP, +or as a side effect of any editing operations on the corresponding field. +.bP +Editing operations are based on the \fIwindow\fP which displays the field, +rather than a \fIstring\fP. +The window contains only printable characters, and is filled with blanks. +If you want the raw data, you must write your +own routine that copies the value out of the buffer and removes the leading +and trailing spaces. +.bP +Because editing operations change the content of the buffer to +correspond to the window, you should not rely on using buffers +for long-term storage of form data. +.RE +.PP +The function \fBset_field_status\fP sets the associated status flag of +\fIfield\fP; \fBfield_status\fP gets the current value. +The status flag +is set to a nonzero value whenever the field changes. +.PP +The function \fBset_max_field\fP sets the maximum size for a dynamic field. +An argument of 0 turns off any maximum size threshold for that field. +.SH RETURN VALUE +The \fBfield_buffer\fP function returns NULL on error. +It sets \fBerrno\fP according to their success: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.PP +The \fBfield_status\fP function returns \fBTRUE\fP or \fBFALSE\fP. +.PP +The remaining routines return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.SH NOTES +When configured for wide characters, \fBfield_buffer\fP returns a pointer +to temporary storage (allocated and freed by the library). +The application should not attempt to modify the data. +It will be freed on the next call to \fBfield_buffer\fP to return the +same buffer. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +The \fBset_max_field\fP function checks for an \fI\%ncurses\fP extension +\fBO_INPUT_FIELD\fP which allows a dynamic field to shrink if the new +limit is smaller than the current field size. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``form_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/form_field_info.3x b/contrib/ncurses/man/form_field_info.3x new file mode 100644 index 00000000..84b10d96 --- /dev/null +++ b/contrib/ncurses/man/form_field_info.3x @@ -0,0 +1,95 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_info.3x,v 1.32 2024/03/16 15:35:01 tom Exp $ +.TH form_field_info 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fBdynamic_field_info\fP, +\fBfield_info\fP \- +retrieve field characteristics +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint field_info(const FIELD *\fIfield\fP, + \fBint *\fIrows\fB, int *\fIcols\fB,\fR + \fBint *\fIfrow\fB, int *\fIfcol\fB,\fR + \fBint *\fInrow\fB, int *\fInbuf\fB);\fR +.PP +\fBint dynamic_field_info(const FIELD *\fIfield\fB,\fR + \fBint *\fIrows\fB, int *\fIcols\fB, int *\fImax\fB);\fR +.fi +.SH DESCRIPTION +The function \fBfield_info\fP returns the sizes and other attributes passed in +to the field at its creation time. +The attributes are: height, width, row of +upper-left corner, column of upper-left corner, number off-screen rows, and +number of working buffers. +.PP +The function \fBdynamic_field_info\fP returns the actual size of the field, and +its maximum possible size. +If the field has no size limit, the location +addressed by the third argument will be set to 0. +A field can be made dynamic +by turning off the \fBO_STATIC\fP option with \fBfield_opts_off\fP. +.SH RETURN VALUE +These routines return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +A null (zero pointer) is accepted for any of the return values, +to ignore that value. +Not all implementations allow this, e.g., Solaris 2.7 does not. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``form_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/form_field_just.3x b/contrib/ncurses/man/form_field_just.3x new file mode 100644 index 00000000..c1fd5545 --- /dev/null +++ b/contrib/ncurses/man/form_field_just.3x @@ -0,0 +1,82 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_just.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH form_field_just 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fBset_field_just\fP, +\fBfield_just\fP \- +retrieve field characteristics +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_field_just(FIELD *\fIfield\fP, int \fIjustification\fP); +\fBint field_just(const FIELD *\fIfield\fP); +.fi +.SH DESCRIPTION +The function \fBset_field_just\fP sets the justification attribute of +a field; \fBfield_just\fP returns a field's justification attribute. +The attribute may be one of NO_JUSTIFICATION, JUSTIFY_RIGHT, +JUSTIFY_LEFT, or JUSTIFY_CENTER. +. +.SH RETURN VALUE +The function \fBfield_just\fP returns one of: NO_JUSTIFICATION, +JUSTIFY_RIGHT, JUSTIFY_LEFT, or JUSTIFY_CENTER. +.PP +The function \fBset_field_just\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``form_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/form_field_new.3x b/contrib/ncurses/man/form_field_new.3x new file mode 100644 index 00000000..9cf08adb --- /dev/null +++ b/contrib/ncurses/man/form_field_new.3x @@ -0,0 +1,104 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_new.3x,v 1.41 2024/03/16 15:35:01 tom Exp $ +.TH form_field_new 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBnew_field\fP, +\fBdup_field\fP, +\fBlink_field\fP, +\fBfree_field\fP \- +create and destroy form fields +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBFIELD *new_field(int \fIheight\fP, int \fIwidth\fP, + \fBint \fItoprow\fB, int \fIleftcol\fB,\fR + \fBint \fIoffscreen\fB, int \fInbuffers\fB);\fR +\fBFIELD *dup_field(FIELD *\fIfield\fB, int \fItoprow\fB, int \fIleftcol\fB);\fR +\fBFIELD *link_field(FIELD *\fIfield\fB, int \fItoprow\fB, int \fIleftcol\fB);\fR +\fBint free_field(FIELD *\fIfield\fB);\fR +.fi +.SH DESCRIPTION +The function \fBnew_field\fP allocates a new field and initializes it from the +parameters given: height, width, row of upper-left corner, column of upper-left +corner, number off-screen rows, and number of additional working buffers. +.PP +The function \fBdup_field\fP duplicates a field at a new location. +Most +attributes (including current contents, size, validation type, buffer count, +growth threshold, justification, foreground, background, pad character, +options, and user pointer) are copied. +Field status and the field page bit are +not copied. +.PP +The function \fBlink_field\fP acts like \fBdup_field\fP, but the new field +shares buffers with its parent. +Attribute data is separate. +.PP +The function \fBfree_field\fP de-allocates storage associated with a field. +.SH RETURN VALUE +The functions \fBnew_field\fP, \fBdup_field\fP, \fBlink_field\fP return +\fBNULL\fP on error. +They set \fBerrno\fP according to their success: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred, e.g., malloc failure. +.PP +The function \fBfree_field\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_CONNECTED +field is connected. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +It may be unwise to count on the set of attributes copied by +\fBdup_field\fP being portable; the System V forms library documents are +not very explicit about what gets copied and what does not. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_field_opts.3x b/contrib/ncurses/man/form_field_opts.3x new file mode 100644 index 00000000..9ab3ad0c --- /dev/null +++ b/contrib/ncurses/man/form_field_opts.3x @@ -0,0 +1,146 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2014,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_opts.3x,v 1.44 2024/03/16 15:35:01 tom Exp $ +.TH form_field_opts 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_field_opts\fP, +\fBfield_opts_on\fP, +\fBfield_opts_off\fP, +\fBfield_opts\fP \- +set and get field options +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_field_opts(FIELD *\fIfield\fP, Field_Options \fIopts\fP); +\fBField_Options field_opts(const FIELD *\fIfield\fP); +.PP +\fBint field_opts_on(FIELD *\fIfield\fP, Field_Options \fIopts\fP); +\fBint field_opts_off(FIELD *\fIfield\fP, Field_Options \fIopts\fP); +.fi +.SH DESCRIPTION +The function \fBset_field_opts\fP sets all the given field's option bits (field +option bits may be logically-OR'ed together). +.PP +The function \fBfield_opts_on\fP turns on the given option bits, and leaves +others alone. +.PP +The function \fBfield_opts_off\fP turns off the given option bits, and leaves +others alone. +.PP +The function \fBfield_opts\fP returns the field's current option bits. +.PP +The following standard options are defined (all are on by default): +.TP 5 +O_ACTIVE +The field is visited during processing. +If this option is off, the field will +not be reachable by navigation keys. +Please notice that an invisible field +appears to be inactive also. +.TP 5 +O_AUTOSKIP +Skip to the next field when this one fills. +.TP 5 +O_BLANK +The field is cleared whenever a character is entered at the first position. +.TP 5 +O_EDIT +The field can be edited. +.TP 5 +O_NULLOK +Allow a blank field. +.TP 5 +O_PASSOK +Validate field only if modified by user. +.TP 5 +O_PUBLIC +The field contents are displayed as data is entered. +.TP 5 +O_STATIC +Field buffers are fixed to field's original size. +Turn this option off to create a dynamic field. +.TP 5 +O_VISIBLE +The field is displayed. +If this option is off, display of the field is +suppressed. +.TP 5 +O_WRAP +Words that do not fit on a line are wrapped to the next line. +Words are +blank-separated. +.PP +These extension options are defined (extensions are off by default): +.TP 5 +O_DYNAMIC_JUSTIFY +Permit dynamic fields to be justified, like static fields. +.TP 5 +O_NO_LEFT_STRIP +Preserve leading whitespace in the field buffer, which is normally discarded. +.TP 5 +O_EDGE_INSERT_STAY +When inserting into a field up to the boundary position, +optionally delay the scrolling, +so that the last inserted character remains visible, +but advance the cursor to reflect the insertion. +This allows the form library to display the +inserted character in one-character fields +as well as allowing the library to maintain consistent state. +.TP 5 +O_INPUT_FIELD +The \fBset_max_field\fP function checks for this extension, +which allows a dynamic field to shrink if the new +limit is smaller than the current field size. +.SH RETURN VALUE +Except for \fBfield_opts\fP, each routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_CURRENT +The field is the current field. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X), +\fB\%form_field_just\fP(3X) diff --git a/contrib/ncurses/man/form_field_userptr.3x b/contrib/ncurses/man/form_field_userptr.3x new file mode 100644 index 00000000..6eea0920 --- /dev/null +++ b/contrib/ncurses/man/form_field_userptr.3x @@ -0,0 +1,65 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_userptr.3x,v 1.30 2024/03/16 15:35:01 tom Exp $ +.TH form_field_userptr 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_field_userptr\fP, +\fBfield_userptr\fP \- +associate application data with a form field +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_field_userptr(FIELD *\fIfield\fP, void *\fIuserptr\fP); +\fBvoid *field_userptr(const FIELD *\fIfield\fP); +.fi +.SH DESCRIPTION +Every form field has a field that can be used to hold application-specific data +(that is, the form-driver code leaves it alone). +These functions get and set +that field. +.SH RETURN VALUE +The function \fBfield_userptr\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +The function \fBset_field_userptr\fP returns \fBE_OK\fP (success). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +The user pointer is a void pointer. +We chose not to leave it as a char pointer for SVr4 compatibility. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_field_validation.3x b/contrib/ncurses/man/form_field_validation.3x new file mode 100644 index 00000000..54fa2a72 --- /dev/null +++ b/contrib/ncurses/man/form_field_validation.3x @@ -0,0 +1,209 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_field_validation.3x,v 1.53 2024/03/16 15:35:01 tom Exp $ +.TH form_field_validation 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBform_field_validation\fP \- +data type validation for fields +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBvoid *field_arg(const FIELD *\fIfield\fP); +\fBFIELDTYPE *field_type(const FIELD *\fIfield\fP); +\fBint set_field_type(FIELD *\fIfield\fP, FIELDTYPE *\fItype\fP, ...); +.PP +\fI/* predefined field types */\fP +\fBFIELDTYPE *TYPE_ALNUM; +\fBFIELDTYPE *TYPE_ALPHA; +\fBFIELDTYPE *TYPE_ENUM; +\fBFIELDTYPE *TYPE_INTEGER; +\fBFIELDTYPE *TYPE_NUMERIC; +\fBFIELDTYPE *TYPE_REGEXP; +\fBFIELDTYPE *TYPE_IPV4; +.fi +.SH DESCRIPTION +By default, no validation is done on form fields. +You can associate a form with with a \fIfield type\fP, +making the form library validate input. +.SS field_arg +Returns a pointer to the field's argument block. +The \fIargument block\fP is an opaque structure containing +a copy of the arguments provided in a \fBset_field_type\fP call. +.SS field_type +Returns a pointer to the \fIfield type\fP associated with the form field, +i.e., by calling \fBset_field_type\fP. +.SS set_field_type +The function \fBset_field_type\fP associates +a field type with a given form field. +This is the type checked by validation functions. +Most field types are configurable, +via arguments which the caller provides when calling \fBset_field_type\fP. +.PP +Several field types are predefined by the form library. +.SH PREDEFINED TYPES +It is possible to set up new programmer-defined field types. +Field types are implemented via the \fBFIELDTYPE\fP data +structure, which contains several pointers to functions. +.PP +See the \fBform_fieldtype\fP(3X) manual page, +which describes functions which can be used to construct +a field-type dynamically. +.PP +The predefined types are as follows: +.SS TYPE_ALNUM +Alphanumeric data. +Required parameter: +.bP +a third \fBint\fP argument, a minimum field width. +.SS TYPE_ALPHA +Character data. +Required parameter: +.bP +a third \fBint\fP argument, a minimum field width. +.SS TYPE_ENUM +Accept one of a specified set of strings. +Required parameters: +.bP +a third \fB(char **)\fP argument pointing to a string list; +.bP +a fourth \fBint\fP flag argument to enable case-sensitivity; +.bP +a fifth \fBint\fP flag argument specifying whether a partial +match must be a unique one. +If this flag is off, a prefix matches the first +of any set of more than one list elements with that prefix. +.PP +The library copies the string list, +so you may use a list that lives in automatic variables on the stack. +.SS TYPE_INTEGER +Integer data, parsable to an integer by \fBatoi\fP(3). +Required parameters: +.bP +a third \fBint\fP argument controlling the precision, +.bP +a fourth \fBlong\fP argument constraining minimum value, +.bP +a fifth \fBlong\fP constraining maximum value. +If the maximum value is less than or equal to the minimum value, the range is +simply ignored. +.PP +On return, the field buffer is formatted according to the +\fBprintf\fP format specification \*(``.*ld\*('', +where the \*(``*\*('' is replaced by the precision argument. +.PP +For details of the precision handling see \fBprintf\fP(3). +.SS TYPE_NUMERIC +Numeric data (may have a decimal-point part). +Required parameters: +.bP +a third \fBint\fP argument controlling the precision, +.bP +a fourth \fBdouble\fP argument constraining minimum value, +.bP +and a fifth \fBdouble\fP constraining maximum value. +If your system supports locales, +the decimal point character must be the one specified by your locale. +If the maximum value is less than or equal to the minimum value, +the range is simply ignored. +.PP +On return, the field buffer is formatted according to the +\fBprintf\fP format specification \*(``.*f\*('', +where the \*(``*\*('' is replaced by the precision argument. +.PP +For details of the precision handling see \fBprintf\fP(3). +.SS TYPE_REGEXP +Regular expression data. +Required parameter: +.bP +a third argument, a regular expression \fB(char *)\fP string. +The data is valid if the regular expression matches it. +.PP +Regular expressions +are in the format of \fBregcomp\fP and \fBregexec\fP. +.PP +The regular expression must match the whole field. +If you have for example, an eight character wide field, +a regular expression "^[0\-9]*$" always +means that you have to fill all eight positions with digits. +If you want to allow fewer digits, +you may use for example "^[0\-9]* *$" which is good for +trailing spaces (up to an empty field), +or "^ *[0\-9]* *$" which is good for +leading and trailing spaces around the digits. +.SS TYPE_IPV4 +An Internet Protocol Version 4 address. +Required parameter: +.bP +none +.PP +The form library checks whether or not the buffer has the form \fIa.b.c.d\fP, +where \fIa\fP, \fIb\fP, \fIc\fP, and \fId\fP are numbers in the range 0 to 255. +Trailing blanks in the buffer are ignored. +The address itself is not validated. +.PP +This is an \fI\%ncurses\fP extension; +this field type may not be available in other curses implementations. +.SH RETURN VALUE +The functions \fBfield_type\fP and \fBfield_arg\fP return \fBNULL\fP on error. +The function \fBset_field_type\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X), +\fB\%form_fieldtype\fP(3X), +\fB\%form_variables\fP(3X) diff --git a/contrib/ncurses/man/form_fieldtype.3x b/contrib/ncurses/man/form_fieldtype.3x new file mode 100644 index 00000000..81a58b1d --- /dev/null +++ b/contrib/ncurses/man/form_fieldtype.3x @@ -0,0 +1,163 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_fieldtype.3x,v 1.46 2024/03/16 15:35:01 tom Exp $ +.TH form_fieldtype 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBform_fieldtype\fP \- +define validation-field types +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBFIELDTYPE *new_fieldtype( + \fBbool (* const \fIfield_check\fB)(FIELD *, const void *),\fR + \fBbool (* const \fIchar_check\fB)(int, const void *));\fR +\fBint free_fieldtype(FIELDTYPE *\fIfieldtype\fB);\fR +.PP +\fBint set_fieldtype_arg(\fP + \fBFIELDTYPE *\fIfieldtype\fB,\fR + \fBvoid *(* const \fImake_arg\fB)(va_list *),\fR + \fBvoid *(* const \fIcopy_arg\fB)(const void *),\fR + \fBvoid (* const \fIfree_arg\fB)(void *));\fR +\fBint set_fieldtype_choice(\fP + \fBFIELDTYPE *\fIfieldtype\fB,\fR + \fBbool (* const \fInext_choice\fB)(FIELD *, const void *),\fR + \fBbool (* const \fIprev_choice\fB)(FIELD *, const void *));\fR +.PP +\fBFIELDTYPE *link_fieldtype(FIELDTYPE *\fItype1\fB,\fR + \fBFIELDTYPE *\fItype2\fB);\fR +.fi +.SH DESCRIPTION +.SS new_fieldtype +The function \fBnew_fieldtype\fP creates a new field type usable for data +validation. +Its parameters are function pointers: +.TP 5 +\fIfield_check\fP +This function checks the +validity of an entered data string whenever the user attempts to leave a field. +It has two arguments: +.RS +.bP +The (FIELD *) argument is passed in so the validation predicate can see the +field's buffer, sizes and other attributes. +.bP +The second argument is an +argument-block structure, about which more below. +.RE +.TP 5 +\fIchar_check\fP +This function validates input characters as they are entered. +The form library passes it the character to be checked +and a pointer to an argument-block structure. +.SS free_fieldtype +The \fBfree_fieldtype\fP function +frees the space allocated for a given validation type by \fBnew_fieldtype\fP. +.SS set_fieldtype_arg +The function \fBset_fieldtype_arg\fP associates +three storage-management functions with a field type: +.TP 5 +\fImake_arg\fP +This function is automatically applied to the +list of arguments you give \fBset_field_type\fP when attaching validation +to a field. +It stores the arguments in an allocated argument-block +object which is used when validating input. +.TP 5 +\fIcopy_arg\fP +This function may be used by applications to copy argument-blocks. +.TP 5 +\fIfree_arg\fP +Frees an argument-block structure. +.PP +You must supply the \fImake_arg\fP function. +The other two are optional: you may supply NULL for them. +In this case, the form library assumes +that \fImake_arg\fP does not allocate memory but simply loads the +argument into a single scalar value. +.SS set_fieldtype_choice +The form driver requests \fBREQ_NEXT_CHOICE\fP and \fBREQ_PREV_CHOICE\fP assume +that the possible values of a field form an ordered set, and provide the forms +user with a way to move through the set. +.PP +The \fBset_fieldtype_choice\fP +function allows forms programmers to define successor and predecessor functions +for the field type. +These functions take the field pointer and an +argument-block structure as arguments. +.SS link_fieldtype +The function \fBlink_fieldtype\fP creates +a new field type from the two given types. +They are connected by an logical 'OR'. +.SH RETURN VALUE +The pointer-valued routines return NULL on error. +They set \fBerrno\fP according to their success: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred, e.g., malloc failure. +.PP +The integer-valued routines return one of the following codes on +error: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_CONNECTED +The field is already connected to a form. +.TP 5 +.B E_CURRENT +The field is the current field. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X), +\fB\%form_field_validation\fP(3X) diff --git a/contrib/ncurses/man/form_hook.3x b/contrib/ncurses/man/form_hook.3x new file mode 100644 index 00000000..d93d8d87 --- /dev/null +++ b/contrib/ncurses/man/form_hook.3x @@ -0,0 +1,97 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2007,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_hook.3x,v 1.37 2024/03/16 15:35:01 tom Exp $ +.TH form_hook 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBform_hook\fP \- +set hooks for automatic invocation by applications +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_field_init(FORM *\fIform\fP, Form_Hook \fIfunc\fP); +\fBForm_Hook field_init(const FORM *\fIform\fP); +.PP +\fBint set_field_term(FORM *\fIform\fP, Form_Hook \fIfunc\fP); +\fBForm_Hook field_term(const FORM *\fIform\fP); +.PP +\fBint set_form_init(FORM *\fIform\fP, Form_Hook \fIfunc\fP); +\fBForm_Hook form_init(const FORM *\fIform\fP); +.PP +\fBint set_form_term(FORM *\fIform\fP, Form_Hook \fIfunc\fP); +\fBForm_Hook form_term(const FORM *\fIform\fP); +.fi +.SH DESCRIPTION +These functions make it possible to set hook functions to be called at various +points in the automatic processing of input event codes by \fBform_driver\fP. +.SS set_field_init +sets a hook to be called at form-post time +and each time the selected field changes (after the change). +.SS field_init +returns the current field init hook, if any (\fBNULL\fP if there is no such +hook). +.SS set_field_term +sets a hook to be called at form-unpost time +and each time the selected field changes (before the change). +.SS field_term +returns the current field term hook, if any (\fBNULL\fP if there is no such +hook). +.SS set_form_init +sets a hook to be called at form-post time and +just after a page change once it is posted. +.SS form_init +returns the current form init hook, +if any (\fBNULL\fP if there is no such hook). +.SS set_form_term +sets a hook to be called at form-unpost time +and just before a page change once it is posted. +.SS form_term +returns the current form term hook, if any (\fBNULL\fP if there is no such +hook). +.SH RETURN VALUE +Routines that return pointers return \fBNULL\fP on error. +Other routines +return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_new.3x b/contrib/ncurses/man/form_new.3x new file mode 100644 index 00000000..dc45e183 --- /dev/null +++ b/contrib/ncurses/man/form_new.3x @@ -0,0 +1,84 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_new.3x,v 1.32 2024/03/16 15:35:01 tom Exp $ +.TH form_new 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBnew_form\fP, +\fBfree_form\fP \- +create and destroy forms +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBFORM *new_form(FIELD **\fIfields\fP); +\fBint free_form(FORM *\fIform\fP); +.fi +.SH DESCRIPTION +The function \fBnew_form\fP creates a new form connected to a specified field +pointer array (which must be \fBNULL\fP-terminated). +.PP +The function \fBfree_form\fP disconnects \fIform\fP from its field array +and frees the storage allocated for the form. +.SH RETURN VALUE +The function \fBnew_form\fP returns \fBNULL\fP on error. +It sets \fBerrno\fP according to the function's success: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_CONNECTED +The field is already connected to a form. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred, e.g., malloc failure. +.PP +The function \fBfree_form\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_POSTED +The form has already been posted. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_new_page.3x b/contrib/ncurses/man/form_new_page.3x new file mode 100644 index 00000000..c47a959d --- /dev/null +++ b/contrib/ncurses/man/form_new_page.3x @@ -0,0 +1,78 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_new_page.3x,v 1.34 2024/03/16 15:35:01 tom Exp $ +.TH form_new_page 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fBset_new_page\fP, +\fBnew_page\fP \- +form pagination functions +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_new_page(FIELD *\fIfield\fP, bool \fInew_page_flag\fP); +\fBbool new_page(const FIELD *\fIfield\fP); +.fi +.SH DESCRIPTION +The function \fBset_new_page\fP sets or resets a flag marking the given field +as the beginning of a new page on its form. +.PP +The function \fBnew_page\fP is a predicate which tests if a given field marks +a page beginning on its form. +.SH RETURN VALUE +The function \fBnew_page\fP returns \fBTRUE\fP or \fBFALSE\fP. +.PP +The function \fBset_new_page\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_CONNECTED +The given field is already connected to a form. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``form_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/form_opts.3x b/contrib/ncurses/man/form_opts.3x new file mode 100644 index 00000000..74a36d2b --- /dev/null +++ b/contrib/ncurses/man/form_opts.3x @@ -0,0 +1,86 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_opts.3x,v 1.34 2024/03/16 15:35:01 tom Exp $ +.TH form_opts 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_form_opts\fP, +\fBform_opts_on\fP, +\fBform_opts_off\fP, +\fBform_opts\fP \- +set and get form options +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_form_opts(FORM *\fIform\fP, Field_Options \fIopts\fP); +\fBField_Options form_opts(const FORM *\fIform\fP); +.PP +\fBint form_opts_on(FORM *\fIform\fP, Field_Options \fIopts\fP); +\fBint form_opts_off(FORM *\fIform\fP, Field_Options \fIopts\fP); +.fi +.SH DESCRIPTION +The function \fBset_form_opts\fP sets all the given form's option bits (form +option bits may be logically-OR'ed together). +.PP +The function \fBform_opts_on\fP turns on the given option bits, and leaves +others alone. +.PP +The function \fBform_opts_off\fP turns off the given option bits, and leaves +others alone. +.PP +The function \fBform_opts\fP returns the form's current option bits. +.PP +The following options are defined (all are on by default): +.TP 5 +O_NL_OVERLOAD +Overload the \fBREQ_NEW_LINE\fP forms driver request so that calling it at the +end of a field goes to the next field. +.TP 5 +O_BS_OVERLOAD +Overload the \fBREQ_DEL_PREV\fP forms driver request so that calling it at the +beginning of a field goes to the previous field. +.SH RETURN VALUE +Except for \fBform_opts\fP, each routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_page.3x b/contrib/ncurses/man/form_page.3x new file mode 100644 index 00000000..fa538c62 --- /dev/null +++ b/contrib/ncurses/man/form_page.3x @@ -0,0 +1,98 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_page.3x,v 1.37 2024/03/16 15:35:01 tom Exp $ +.TH form_page 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBform_page\fP \- +set and get form page number +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_current_field(FORM *\fIform\fP, FIELD *\fIfield\fP); +\fBFIELD *current_field(const FORM *\fIform\fP); +.PP +\fBint unfocus_current_field(FORM *\fIform\fP); +.PP +\fBint set_form_page(FORM *\fIform\fP, int \fIn\fP); +\fBint form_page(const FORM *\fIform\fP); +.PP +\fBint field_index(const FIELD *\fIfield\fP); +.fi +.SH DESCRIPTION +The function \fBset_current_field\fP sets the current field of the given +form; \fBcurrent_field\fP returns the current field of the given form. +.PP +The function \fBunfocus_current_field\fP removes the focus from the current +field of the form. +In such state, inquiries via \fBcurrent_field\fP shall return a NULL pointer. +.PP +The function \fBset_form_page\fP sets the form's page number (goes to page +\fIn\fP of the form). +.PP +The function \fBform_page\fP returns the form's current page number. +.PP +The function \fBfield_index\fP returns the index of the field in the +field array of the form it is connected to. +It returns \fBERR\fP if +the argument is the null pointer or the field is not connected. +.SH RETURN VALUE +Except for \fBform_page\fP, each routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_INVALID_FIELD +Contents of a field are not valid. +.TP 5 +.B E_REQUEST_DENIED +The form driver could not process the request. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +The \fBunfocus_current_field\fP function is an \fI\%ncurses\fP +extension. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_post.3x b/contrib/ncurses/man/form_post.3x new file mode 100644 index 00000000..77e086e4 --- /dev/null +++ b/contrib/ncurses/man/form_post.3x @@ -0,0 +1,86 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_post.3x,v 1.33 2024/03/16 15:35:01 tom Exp $ +.TH form_post 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBpost_form\fP, +\fBunpost_form\fP \- +write or erase forms from associated subwindows +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint post_form(FORM *\fIform\fP); +\fBint unpost_form(FORM *\fIform\fP); +.fi +.SH DESCRIPTION +The function \fBpost_form\fP displays a form to its associated subwindow. +To trigger physical display of the subwindow, +use \fBrefresh\fP(3X) or some equivalent +\fBcurses\fP routine (the implicit \fBdoupdate\fP triggered by an \fBcurses\fP +input request will do). +.PP +The function \fBunpost_form\fP erases form from its associated subwindow. +.SH RETURN VALUE +These routines return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NOT_POSTED +The form has not been posted. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the form. +.TP 5 +.B E_NO_ROOM +Form is too large for its window. +.TP 5 +.B E_POSTED +The form has already been posted. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_requestname.3x b/contrib/ncurses/man/form_requestname.3x new file mode 100644 index 00000000..4075ea73 --- /dev/null +++ b/contrib/ncurses/man/form_requestname.3x @@ -0,0 +1,66 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_requestname.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH form_requestname 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBform_request_by_name\fP, +\fBform_request_name\fP \- +handle printable form request names +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBconst char *form_request_name(int \fIrequest\fP); +\fBint form_request_by_name(const char *\fIname\fP); +.fi +.SH DESCRIPTION +The function \fBform_request_name\fP returns the printable name of a form +request code. +The function \fBform_request_by_name\fP searches in the name-table for a request +with the given name and returns its request code. +Otherwise E_NO_MATCH is returned. +.SH RETURN VALUE +\fBform_request_name\fP returns \fBNULL\fP on error and sets \fBerrno\fP +to \fBE_BAD_ARGUMENT\fP. +.PP +\fBform_request_by_name\fP returns \fBE_NO_MATCH\fP on error. +It does not set \fBerrno\fP. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on +Version 7, BSD or System V implementations. +It is recommended that +any code depending on them be conditioned using NCURSES_VERSION. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_userptr.3x b/contrib/ncurses/man/form_userptr.3x new file mode 100644 index 00000000..11c990c0 --- /dev/null +++ b/contrib/ncurses/man/form_userptr.3x @@ -0,0 +1,64 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_userptr.3x,v 1.36 2024/03/16 15:35:01 tom Exp $ +.TH form_userptr 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_form_userptr\fP, +\fBform_userptr\fP \- +associate application data with a form item +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_form_userptr(FORM *\fIform\fP, void *\fIuserptr\fP); +\fBvoid* form_userptr(const FORM *\fIform\fP); +.fi +.SH DESCRIPTION +Every form and every form item has a field that can be used to hold +application-specific data (that is, the form-driver code leaves it alone). +These functions get and set the form user pointer field. +.SH RETURN VALUE +The function \fBform_userptr\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +The function \fBset_form_userptr\fP returns \fBE_OK\fP (success). +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.PP +The user pointer is a void pointer. +We chose not to leave it as a char pointer for SVr4 compatibility. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_variables.3x b/contrib/ncurses/man/form_variables.3x new file mode 100644 index 00000000..7b11a1ab --- /dev/null +++ b/contrib/ncurses/man/form_variables.3x @@ -0,0 +1,77 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 2010-2013,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_variables.3x,v 1.18 2024/03/16 15:35:01 tom Exp $ +.TH form_variables 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%TYPE_ALNUM\fP, +\fB\%TYPE_ALPHA\fP, +\fB\%TYPE_ENUM\fP, +\fB\%TYPE_INTEGER\fP, +\fB\%TYPE_IPV4\fP, +\fB\%TYPE_NUMERIC\fP, +\fB\%TYPE_REGEXP\fP \- +form system global variables +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBFIELDTYPE * TYPE_ALNUM; +\fBFIELDTYPE * TYPE_ALPHA; +\fBFIELDTYPE * TYPE_ENUM; +\fBFIELDTYPE * TYPE_INTEGER; +\fBFIELDTYPE * TYPE_IPV4; +\fBFIELDTYPE * TYPE_NUMERIC; +\fBFIELDTYPE * TYPE_REGEXP; +.fi +.SH DESCRIPTION +These are building blocks for the form library, +defining fields that can be created using +the \fBform_fieldtype\fP(3X) functions. +Each provides functions for field- and character-validation, +according to the given datatype. +.SS TYPE_ALNUM +This holds alphanumeric data. +.SS TYPE_ALPHA +This holds alphabetic data. +.SS TYPE_ENUM +This holds an enumerated type. +.SS TYPE_INTEGER +This holds a decimal integer. +.SS TYPE_IPV4 +This holds an IPv4 internet address, e.g., "127.0.0.1". +.SS TYPE_NUMERIC +This holds a decimal number, with optional sign and decimal point. +.SS TYPE_REGEXP +This holds a regular expression. +.SH PORTABILITY +The \fBTYPE_IPV4\fP variable is an extension not provided by older +implementations of the form library. +.SH SEE ALSO +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/form_win.3x b/contrib/ncurses/man/form_win.3x new file mode 100644 index 00000000..4a75b294 --- /dev/null +++ b/contrib/ncurses/man/form_win.3x @@ -0,0 +1,92 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: form_win.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH form_win 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBform_win\fP \- +make and break form window and subwindow associations +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_form_win(FORM *\fIform\fP, WINDOW *\fIwin\fP); +\fBWINDOW *form_win(const FORM *\fIform\fP); +.PP +\fBint set_form_sub(FORM *\fIform\fP, WINDOW *\fIsub\fP); +\fBWINDOW *form_sub(const FORM *\fIform\fP); +.PP +\fBint scale_form(const FORM *\fIform\fP, int *\fIrows\fP, int *\fIcolumns\fP); +.fi +.SH DESCRIPTION +Every form has an associated pair of \fBcurses\fP windows. +The form window +displays any title and border associated with the window; the form subwindow +displays the items of the form that are currently available for selection. +.PP +The first four functions get and set those windows. +It is not necessary to set +either window; by default, the driver code uses \fBstdscr\fP for both. +.PP +In the \fBset_\fP functions, window argument of \fBNULL\fP is treated as though +it were \fBstsdcr\fP. A form argument of \fBNULL\fP is treated as a request +to change the system default form window or subwindow. +.PP +The function \fBscale_form\fP returns the minimum size required for the +subwindow of \fIform\fP. +.SH RETURN VALUE +Routines that return pointers return \fBNULL\fP on error. +Routines that return +an integer return one of the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_POSTED +The form has already been posted. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the form. +.SH PORTABILITY +These routines emulate the System V forms library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%form\fP(3X) diff --git a/contrib/ncurses/man/infocmp.1m b/contrib/ncurses/man/infocmp.1m new file mode 100644 index 00000000..659a1752 --- /dev/null +++ b/contrib/ncurses/man/infocmp.1m @@ -0,0 +1,700 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2017,2018 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: infocmp.1m,v 1.114 2024/09/21 18:04:29 tom Exp $ +.TH @INFOCMP@ 1M 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ' \(aq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ie t .ds ' \(aq +.el .ds ' ' +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB@INFOCMP@\fP \- +compare or print out \fIterminfo\fP descriptions +.SH SYNOPSIS +.HP +.B @INFOCMP@ +.RB [ \-\ +1\ +c\ +C\ +d\ +D\ +e\ +E\ +F\ +g\ +G\ +i\ +I\ +K\ +l\ +L\ +n\ +p\ +q\ +r\ +t\ +T\ +u\ +U\ +V\ +W\ +x\ +] +.RB [ \-A\ \c +.IR directory ] +.RB [ \-B\ \c +.IR directory ] +.RB [ \-Q\ \c +.IR encoding ] +.RB [ \-R\ \c +.IR subset ] +.RB [ \-s\ \c +.IR key ] +.RB [ \-v\ \c +.IR level ] +.RB [ \-w\ \c +.IR width ] +.RI [ \%terminal\%-type +\&.\|.\|.\& ] +.SH DESCRIPTION +\fB@INFOCMP@\fP can be used to compare a binary \fBterminfo\fP entry with other +terminfo entries, rewrite a \fBterminfo\fP description to take advantage of the +\fBuse=\fP terminfo field, or print out a \fBterminfo\fP description from the +binary file (\fBterm\fP) in a variety of formats. +In all cases, the Boolean +fields will be printed first, followed by the numeric fields, followed by the +string fields. +.SS "Default Options" +If no options are specified and zero or one \fIterminal-types\fP are +specified, +the +\fB\-I\fP option will be assumed. +If more than one \fIterminal-type\fP is specified, +the \fB\-d\fP option will be assumed. +.SS "Comparison Options [\-d] [\-c] [\-n]" +\fB@INFOCMP@\fP compares the \fBterminfo\fP description of the first terminal +\fIterminal-type\fP with each of the descriptions given by the entries +for the other terminal's \fIterminal-types\fP. +If a capability is defined for only one of the +terminals, the value returned depends on the type of the capability: +.bP +\fBF\fP for missing Boolean variables +.bP +\fBNULL\fP for missing integer or string variables +.PP +Use the \fB\-q\fP option to show the distinction between +\fIabsent\fP and \fIcanceled\fP capabilities. +.PP +These options produce a list which you can use to compare two +or more terminal descriptions: +.TP 5 +\fB\-d\fP +produces a list of each capability that is \fIdifferent\fP +between two entries. +Each item in the list shows \*(``:\*('' after the capability name, +followed by the capability values, separated by a comma. +.TP +\fB\-c\fP +produces a list of each capability that is \fIcommon\fP between +two or more entries. +Missing capabilities are ignored. +Each item in the list shows \*(``=\*('' after the capability name, +followed by the capability value. +.IP +The \fB\-u\fP option provides a related output, +showing the first terminal description rewritten to use the second +as a building block via the \*(``use=\*('' clause. +.TP +\fB\-n\fP +produces a list of each capability that is in \fInone\fP of the given entries. +Each item in the list shows \*(``!\*('' before the capability name. +.IP +Normally only the conventional capabilities are shown. +Use the \fB\-x\fP option to add the BSD-compatibility +capabilities (names prefixed with \*(``OT\*(''). +.IP +If no \fIterminal-types\fP are given, +\fB@INFOCMP@\fP uses the environment variable \fITERM\fP +for each of the \fIterminal-types\fP. +.SS "Source Listing Options [\-I] [\-L] [\-C] [\-r]" +The \fB\-I\fP, \fB\-L\fP, and \fB\-C\fP options will produce +a source listing for each terminal named. +.PP +.TS +center; +Lb L. +\-I use \fIterminfo\fP capability codes +\-L use \*(``long\*('' capability names +\-C use \fItermcap\fP capability codes +\-r with \fB\-C\fP, include nonstandard capabilities +\-K with \fB\-C\fP, improve BSD compatibility +.TE +.PP +If no \fIterminal-types\fP are given, +the environment variable \fITERM\fP will be used for the terminal name. +.PP +The source produced by the \fB\-C\fP option may be used directly as a +\fBtermcap\fP entry, but not all parameterized strings can be changed to +the \fBtermcap\fP format. +\fB@INFOCMP@\fP will attempt to convert most of the +parameterized information, and anything not converted will be plainly marked in +the output and commented out. +These should be edited by hand. +.PP +For best results when converting to \fBtermcap\fP format, +you should use both \fB\-C\fP and \fB\-r\fP. +Normally a termcap description is limited to 1023 bytes. +\fB@INFOCMP@\fP trims away less essential parts to make it fit. +If you are converting to one of the (rare) termcap implementations +which accept an unlimited size of termcap, +you may want to add the \fB\-T\fP option. +More often however, you must help the termcap implementation, +and trim excess whitespace (use the \fB\-0\fP option for that). +.PP +All padding information for strings will be collected together and placed +at the beginning of the string where \fBtermcap\fP expects it. +Mandatory +padding (padding information with a trailing \*(``/\*('') will become optional. +.PP +All \fBtermcap\fP variables no longer supported by \fBterminfo\fP, but which +are derivable from other \fBterminfo\fP variables, will be output. +Not all +\fBterminfo\fP capabilities will be translated; only those variables which were +part of \fBtermcap\fP will normally be output. +Specifying the \fB\-r\fP option +will take off this restriction, allowing all capabilities to be output in +\fItermcap\fP form. +Normally you would use both the \fB\-C\fP and \fB\-r\fP options. +The actual format used incorporates some improvements for escaped characters +from terminfo format. +For a stricter BSD-compatible translation, use the \fB\-K\fP option +rather than \fB\-C\fP. +.PP +Note that because padding is collected to the beginning of the capability, not +all capabilities are output. +Mandatory padding is not supported. +Because +\fBtermcap\fP strings are not as flexible, it is not always possible to convert +a \fBterminfo\fP string capability into an equivalent \fBtermcap\fP format. +A subsequent conversion of the \fBtermcap\fP file +back into \fBterminfo\fP format +will not necessarily reproduce the original \fBterminfo\fP source. +.PP +Some common \fBterminfo\fP parameter sequences, their \fBtermcap\fP +equivalents, and some terminal types which commonly have such sequences, are: +.PP +.TS +center; +Lf(BI) Lf(BI) L +Lb Lb L. +terminfo termcap Terminal Types +_ +.\" ansi-m cup (adm3a has other stuff in between, more like concept) +%p1%c %. ansi\-m +.\" ansi cub, vt100 cub +%p1%d %d ansi, vt100 +.\" vt52 cup (via vt52-basic) +%p1%\*' \*'%+%c %+x vt52 +.\" ansi cup, vt100 cup +%i %iq ansi, vt100 +.\" annarbor4080 cup +%p1%?%\*'x\*'%>%t%p1%\*'y\*'%+%; %>xy annarbor4080 +.\" hpgeneric cup +%p2\fR\|.\|.\|.\|\fP%p1 %r hpgeneric +.TE +.SS "Use= Option [\-u]" +The \fB\-u\fP option produces a \fBterminfo\fP source description of the first +terminal \fIterminal-type\fP which is relative to the sum of the +descriptions given by the entries for the other \fIterminal-types\fP. +It does this by +analyzing the differences between the first \fIterminal-types\fP and the +other \fIterminal-types\fP and producing a description with \fBuse=\fP +fields for the other terminals. +In this manner, it is possible to retrofit generic terminfo +entries into a terminal's description. +Or, if two similar terminals exist, but +were coded at different times or by different people so that each description +is a full description, using \fB@INFOCMP@\fP +will show what can be done to change +one description to be relative to the other. +.PP +A capability will be printed with an at-sign (@) if it no longer exists in the +first \fIterminal-type\fP, +but one of the other \fIterminal-type\fP entries contains a value for +it. +A capability's value will be printed if the value in the first +\fIterminal-type\fP is not found in any of the other \fIterminal-type\fP +entries, +or if the first of the other \fIterminal-type\fP entries that has this +capability gives a different value for the capability than that in the +first \fIterminal-type\fP. +.PP +The order of the other \fIterminal-type\fP entries is significant. +Since the +terminfo compiler \fB@TIC@\fP does a left-to-right scan of the capabilities, +specifying two \fBuse=\fP entries that contain differing entries for the same +capabilities will produce different results depending on the order that the +entries are given in. +\fB@INFOCMP@\fP will flag any such inconsistencies between +the other \fIterminal-type\fP entries as they are found. +.PP +Alternatively, specifying a capability \fIafter\fP a \fBuse=\fP entry that +contains that capability will cause the second specification to be ignored. +Using \fB@INFOCMP@\fP to recreate a description can be a useful check to make +sure that everything was specified correctly in the original source +description. +.PP +Another error that does not cause incorrect compiled files, but will slow down +the compilation time, is specifying extra \fBuse=\fP fields that are +superfluous. +\fB@INFOCMP@\fP will flag any other \fIterminal-type use=\fP fields that +were not needed. +.SS "Changing Databases [\-A \f(BIdirectory\fP] [\-B \f(BIdirectory\fP]" +Like other \fI\%ncurses\fP utilities, +\fB@INFOCMP@\fP looks for the terminal descriptions in several places. +You can use the \fI\%TERMINFO\fP and \fI\%TERMINFO_DIRS\fP environment +variables to override the compiled-in default list of places to search. +See \fBcurses\fP(3X), as well as +the \fIFetching Compiled Descriptions\fP section in \fBterminfo\fR(5). +.PP +You can also use the options \fB\-A\fP +and \fB\-B\fP to override the list of places to search +when comparing terminal descriptions: +.bP +The \fB\-A\fP option sets the location for the first \fIterminal-type\fP +.bP +The \fB\-B\fP option sets the location for the other +\fIterminal-types\fP. +.PP +Using these options, it is possible to +compare descriptions for a terminal with the same name located in two different +databases. +For instance, +you can use this feature for comparing descriptions for the same terminal +created by different people. +.SS "Other Options" +.TP 5 +\fB\-0\fP +causes the fields to be printed on one line, without wrapping. +.TP 5 +\fB\-1\fP +causes the fields to be printed out one to a line. +Otherwise, +the fields will be printed several to a line to a maximum width +of 60 characters. +.TP +\fB\-a\fP +tells \fB@INFOCMP@\fP to retain commented-out capabilities +rather than discarding them. +Capabilities are commented by prefixing them with a period. +.TP +\fB\-D\fP +tells \fB@INFOCMP@\fP to print the database locations that it knows about, +and exit. +.TP 5 +\fB\-E\fP +Dump the capabilities of the given terminal as tables, needed in +the C initializer for a +TERMTYPE structure (the terminal capability structure in the \fB\fP). +This option is useful for preparing versions of the curses library hardwired +for a given terminal type. +The tables are all declared static, and are named according to the type +and the name of the corresponding terminal entry. +.sp +Before \fI\%ncurses\fP 5.0, +the split between the \fB\-e\fP and \fB\-E\fP options was not needed; +but support for extended names required making the arrays of terminal +capabilities separate from the TERMTYPE structure. +.TP 5 +\fB\-e\fP +Dump the capabilities of the given terminal as a C initializer for a +TERMTYPE structure (the terminal capability structure in the \fB\fP). +This option is useful for preparing versions of the curses library hardwired +for a given terminal type. +.TP 5 +\fB\-F\fP +compare terminfo files. +This assumes that two following arguments are filenames. +The files are searched for pairwise matches between +entries, with two entries considered to match if any of their names do. +The report printed to standard output lists entries with no matches in +the other file, and entries with more than one match. +For entries +with exactly one match it includes a difference report. +Normally, +to reduce the volume of the report, use references are +not resolved before looking for differences, but resolution can be forced +by also specifying \fB\-r\fP. +.TP 5 +\fB\-f\fP +Display complex terminfo strings which contain if/then/else/endif expressions +indented for readability. +.TP 5 +\fB\-G\fP +Display constant literals in decimal form +rather than their character equivalents. +.TP 5 +\fB\-g\fP +Display constant character literals in quoted form +rather than their decimal equivalents. +.TP 5 +\fB\-i\fP +Analyze the initialization (\fBis1\fP, \fBis2\fP, \fBis3\fP), and reset +(\fBrs1\fP, \fBrs2\fP, \fBrs3\fP), strings in the entry, +as well as those used for starting/stopping cursor-positioning mode +(\fBsmcup\fP, \fBrmcup\fP) as well as starting/stopping keymap mode +(\fBsmkx\fP, \fBrmkx\fP). +.IP +For each string, the +code tries to analyze it into actions in terms of the other capabilities in the +entry, certain X3.64/ISO 6429/ECMA\-48 capabilities, and certain DEC VT-series +private modes (the set of recognized special sequences has been selected for +completeness over the existing terminfo database). +Each report line consists +of the capability name, followed by a colon and space, followed by a printable +expansion of the capability string with sections matching recognized actions +translated into {}-bracketed descriptions. +.IP +Here is a list of the DEC/ANSI +special sequences recognized: +.PP +.TS +center; +L L. +Action Meaning +_ +RIS full reset +SC save cursor +RC restore cursor +LL home-down +RSR reset scroll region +_ +DECSTR soft reset (VT320) +S7C1T 7-bit controls (VT220) +_ +ISO DEC G0 enable DEC graphics for G0 +ISO UK G0 enable UK chars for G0 +ISO US G0 enable US chars for G0 +ISO DEC G1 enable DEC graphics for G1 +ISO UK G1 enable UK chars for G1 +ISO US G1 enable US chars for G1 +_ +DECPAM application keypad mode +DECPNM normal keypad mode +DECANSI enter ANSI mode +_ +ECMA[+\-]AM keyboard action mode +ECMA[+\-]IRM insert replace mode +ECMA[+\-]SRM send receive mode +ECMA[+\-]LNM linefeed mode +_ +DEC[+\-]CKM application cursor keys +DEC[+\-]ANM set VT52 mode +DEC[+\-]COLM 132-column mode +DEC[+\-]SCLM smooth scroll +DEC[+\-]SCNM reverse video mode +DEC[+\-]OM origin mode +DEC[+\-]AWM wraparound mode +DEC[+\-]ARM auto-repeat mode +.TE +.sp +It also recognizes a SGR action corresponding to ANSI/ISO 6429/ECMA Set +Graphics Rendition, with the values NORMAL, BOLD, UNDERLINE, BLINK, and +REVERSE. +All but NORMAL may be prefixed with +.RS +.bP +\*(``+\*('' (turn on) or +.bP +\*(``\-\*('' (turn off). +.RE +.IP +An SGR0 designates an empty highlight sequence (equivalent to {SGR:NORMAL}). +.TP 5 +\fB\-l\fP +Set output format to terminfo. +.TP 5 +\fB\-p\fP +Ignore padding specifications when comparing strings. +.TP 5 +\fB\-Q\fP \fIn\fP +Rather than show source in terminfo (text) format, +print the compiled (binary) format in hexadecimal or base64 form, +depending on the option's value: +.RS 8 +.TP 3 +1 +hexadecimal +.TP 3 +2 +base64 +.TP 3 +3 +hexadecimal and base64 +.RE +.IP +For example, this prints the compiled terminfo value as a string +which could be assigned to the \fI\%TERMINFO\fP environment variable: +.PP +.RS 9 +.EX +@INFOCMP@ \-0 \-q \-Q2 +.EE +.RE +.TP 5 +\fB\-q\fP +This makes the output a little shorter: +.RS +.bP +Make the comparison listing shorter by omitting subheadings, and using +\*(``\-\*('' for absent capabilities, \*(``@\*('' +for canceled rather than \*(``NULL\*(''. +.bP +However, +show differences between absent and canceled capabilities. +.bP +Omit the \*(``Reconstructed from\*('' comment for source listings. +.RE +.TP 5 +\fB\-R\fIsubset\fR +Restrict output to a given subset. +This option is for use with archaic +versions of terminfo like those on SVr1, Ultrix, or HP-UX that do not support +the full set of SVR4/XSI Curses terminfo; and variants such as AIX +that have their own extensions incompatible with SVr4/XSI. +.RS +.bP +Available terminfo +subsets are \*(``SVr1\*('', \*(``Ultrix\*('', \*(``HP\*('', and \*(``AIX\*(''; +see \fBterminfo\fP(5) for details. +.bP +You can also choose the subset \*(``BSD\*('' which selects only capabilities +with termcap equivalents recognized by 4.4BSD. +.bP +If you select any other value for \fB\-R\fP, +it is the same as no subset, i.e., all capabilities are used. +.RE +.IP +A few options override the subset selected with \fB\-R\fP, +if they are processed later in the command parameters: +.RS +.TP 5 +\fB\-C\fP +sets the \*(``BSD\*('' subset as a side-effect. +.TP 5 +\fB\-I\fP +sets the subset to all capabilities. +.TP 5 +\fB\-r\fP +sets the subset to all capabilities. +.RE +.TP +\fB\-s \fI[d|i|l|c]\fR +The \fB\-s\fP option sorts the fields within each type according to the argument +below: +.br +.RS 5 +.TP 5 +\fBd\fP +leave fields in the order that they are stored in the \fIterminfo\fP database. +.TP 5 +\fBi\fP +sort by \fIterminfo\fP name. +.TP 5 +\fBl\fP +sort by the long C variable name. +.TP 5 +\fBc\fP +sort by the \fItermcap\fP name. +.RE +.IP +If the \fB\-s\fP option is not given, the fields printed out will be +sorted alphabetically by the \fBterminfo\fP name within each type, +except in the case of the \fB\-C\fP or the \fB\-L\fP options, which cause the +sorting to be done by the \fBtermcap\fP name or the long C variable +name, respectively. +.TP 5 +\fB\-T\fP +eliminates size-restrictions on the generated text. +This is mainly useful for testing and analysis, since the compiled +descriptions are limited (e.g., 1023 for termcap, 4096 for terminfo). +.TP +\fB\-t\fP +tells \fB@TIC@\fP to discard commented-out capabilities. +Normally when translating from terminfo to termcap, +untranslatable capabilities are commented-out. +.TP 5 +\fB\-U\fP +tells \fB@INFOCMP@\fP to not post-process the data +after parsing the source file. +This feature helps when comparing the actual contents of two source files, +since it excludes the inferences that \fB@INFOCMP@\fP makes to fill in missing +data. +.TP 5 +\fB\-V\fP +reports the version of \fI\%ncurses\fP which was used in this program, +and exits. +.TP 5 +\fB\-v\fP \fIn\fP +prints out tracing information on standard error as the program runs. +.IP +The optional parameter \fIn\fP is a number from 1 to 10, inclusive, +indicating the desired level of detail of information. +If \fI\%ncurses\fP is built without tracing support, +the optional parameter is ignored. +.TP +\fB\-W\fP +By itself, the \fB\-w\fP option will not force long strings to be wrapped. +Use the \fB\-W\fP option to do this. +.TP 5 +\fB\-w\fP \fIwidth\fP +changes the output to \fIwidth\fP characters. +.TP +\fB\-x\fP +print information for user-defined capabilities (see \fBuser_caps\fP(5). +These are extensions to the terminfo repertoire which can be loaded +using the \fB\-x\fP option of \fB@TIC@\fP. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database +.SH EXTENSIONS +The +.BR \-0 "," +.BR \-1 "," +.BR \-a "," +.BR \-e "," +.BR \-E "," +.BR \-f "," +.BR \-F "," +.BR \-g "," +.BR \-G "," +.BR \-i "," +.BR \-l "," +.BR \-p "," +.BR \-q "," +.BR \-Q "," +.BR \-R "," +.BR \-t "," +.BR \-T "," +and +.B \-V +options are +.I \%ncurses +extensions. +.SH PORTABILITY +X/Open Curses, Issue 7 (2009) specifies +.IR \%infocmp "." +It does not mention options for producing descriptions in +.I \%term\%cap +format. +.PP +SVr4 +.I \%infocmp +does not distinguish between absent and canceled capabilities. +It furthermore reports missing integer capabilities as +.B \-1 +(its internal representation). +.I \%ncurses +shows these as \*(``NULL\*('' +for consistency with missing string capabilities. +.PP +The +.B \-r +option +of +.I \%ncurses +.I \%infocmp +uses SVr4's notion of of \*(``termcap\*('' capabilities. +BSD +.I curses +had a more restricted set. +To see only those present in 4.4BSD, +use +.RB \*(`` "\-r \-RBSD" \*(''. +.SH HISTORY +Although System V Release 2 provided a terminfo library, +it had no documented tool for decompiling the terminal descriptions. +Tony Hansen (AT&T) wrote the first \fBinfocmp\fP in early 1984, +for System V Release 3. +.PP +Eric Raymond used the AT&T documentation in 1995 to provide an equivalent +\fB@INFOCMP@\fP for \fI\%ncurses\fP. +In addition, he added a few new features such as: +.bP +the \fB\-e\fP option, to support \fIfallback\fP +(compiled-in) terminal descriptions +.bP +the \fB\-i\fP option, to help with analysis +.PP +Later, Thomas Dickey added the \fB\-x\fP (user-defined capabilities) +option, and the \fB\-E\fP option to support fallback entries with +user-defined capabilities. +.PP +For a complete list, see the \fIEXTENSIONS\fP section. +.PP +In 2010, Roy Marples provided an \fBinfocmp\fP program for NetBSD. +It is less capable than the SVr4 or \fI\%ncurses\fP versions +(e.g., it lacks the sorting options documented in X/Open), +but does include the \fB\-x\fP option adapted from \fI\%ncurses\fP. +.SH BUGS +The \fB\-F\fP option of \fB\%@INFOCMP@\fP(1M) should be a +\fB\%@TOE@\fP(1M) mode. +.SH AUTHORS +Eric S. Raymond +and +.br +Thomas E. Dickey +.SH SEE ALSO +\fB\%@CAPTOINFO@\fP(1M), +\fB\%@INFOTOCAP@\fP(1M), +\fB\%@TIC@\fP(1M), +\fB\%@TOE@\fP(1M), +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5), +\fB\%user_caps\fP(5) +.PP +https://invisible\-island.net/ncurses/tctest.html diff --git a/contrib/ncurses/man/infotocap.1m b/contrib/ncurses/man/infotocap.1m new file mode 100644 index 00000000..4be98f9e --- /dev/null +++ b/contrib/ncurses/man/infotocap.1m @@ -0,0 +1,96 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1999-2010,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: infotocap.1m,v 1.44 2024/07/27 19:43:16 tom Exp $ +.TH @INFOTOCAP@ 1M 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.SH NAME +\fB\%@INFOTOCAP@\fP \- +convert a \fI\%terminfo\fR description into a \fI\%termcap\fR description +.SH SYNOPSIS +.B @INFOTOCAP@ +.RI [ tic-option ] +.I file +\&.\|.\|. +.P +.B "@INFOTOCAP@ \-V" +.SH DESCRIPTION +\fB\%@INFOTOCAP@\fP translates terminal descriptions. +It looks in each given text \fIfile\fP for \fI\%terminfo\fP entries and, +for each one found, +it writes an analogous \fI\%termcap\fP description to the standard +output stream. +\fI\%terminfo\fP \*(``\fBuse\fP\*('' capabilities translate to +\fI\%termcap\fP \fBtc\fP capabilities. +Because \fI\%termcap\fP is a less expressive format than +\fI\%terminfo\fP, +some capabilities cannot be translated. +.PP +This utility is implemented as a link to \fB\%@TIC@\fP(1M), +with the latter's +.B \-C +option implied. +You can use other \fB\%@TIC@\fP options such as +.BR \-1 , +.BR \-f , +.BR \-v , +.BR \-w , +and +.BR \-x . +The \fB\-V\fP option reports the version of \fI\%ncurses\fP associated +with this program and exits with a successful status. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database +.SH PORTABILITY +None of X/Open Curses, +Issue 7 (2009), +SVr4, +or NetBSD document this application. +.SH AUTHORS +Eric S. Raymond +and +.br +Thomas E. Dickey +.SH SEE ALSO +\fB\%@INFOCMP@\fP(1M), +\fB\%@TIC@\fP(1M), +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/key_defined.3x b/contrib/ncurses/man/key_defined.3x new file mode 100644 index 00000000..c1e401ae --- /dev/null +++ b/contrib/ncurses/man/key_defined.3x @@ -0,0 +1,85 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2003-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 2003 +.\" +.\" $Id: key_defined.3x,v 1.38 2024/06/08 23:25:34 tom Exp $ +.TH key_defined 3X 2024-06-08 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%key_defined\fP \- +test whether a \fIcurses\fP function key code is defined +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint key_defined(const char * \fIdefinition\fP); +.fi +.SH DESCRIPTION +The +.B \%key_defined +.I \%ncurses +extension permits a +.I curses +application to determine the function key code, +if any, +to which the string +.I definition +is bound. +.SH RETURN VALUE +.B \%key_defined +returns the first key code to which +.I definition +is bound if any exists. +If none does, +it returns +.BR 0 "." +If +.I definition +is a prefix of another binding, +.B \%key_defined +returns +.BR \-1 "." +.SH EXTENSIONS +.B \%define_key +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%define_key\fP(3X), +\fB\%keybound\fP(3X), +\fB\%keyok\fP(3X) diff --git a/contrib/ncurses/man/keybound.3x b/contrib/ncurses/man/keybound.3x new file mode 100644 index 00000000..03725503 --- /dev/null +++ b/contrib/ncurses/man/keybound.3x @@ -0,0 +1,104 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1999-2008,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1999 +.\" +.\" $Id: keybound.3x,v 1.40 2024/06/08 23:25:57 tom Exp $ +.TH keybound 3X 2024-06-08 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%keybound\fP \- +get definition of a \fIcurses\fP function key code +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBchar * keybound(int \fIkey-code\fP, int \fIcount\fP); +.fi +.SH DESCRIPTION +The +.B \%keybound +.I \%ncurses +extension permits a +.I curses +application to obtain the value of the string +.I bound +to the function key +.IR key-code ";" +see \fB\%wgetch\fP(3X) +(wide-character API users: \fB\%wget_wch\fP(3X)). +By default, +such bindings are string capabilities from the +.I \%term\%info +database entry corresponding to the terminal type. +The application can non-destructively and repeatedly +override such definitions with +\fB\%define_key\fP(3X), +as if by pushing new definitions onto a stack. +The +.I count +parameter accesses the +.IR n th +most recently defined binding; +.B 0 +selects the binding that is used on input. +.SH RETURN VALUE +If +.I key-code +corresponds to a function key defined +by the application +or the terminal type in use, +.B \%keybound +allocates and returns a string +that must be freed by the application. +.B \%keybound +returns +.B NULL +if +.I key-code +is not positive +or if it does not correspond to a key code definition. +.SH EXTENSIONS +.B \%keybound +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%define_key\fP(3X), +\fB\%keyok\fP(3X), +\fB\%key_defined\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/keyok.3x b/contrib/ncurses/man/keyok.3x new file mode 100644 index 00000000..b3a83140 --- /dev/null +++ b/contrib/ncurses/man/keyok.3x @@ -0,0 +1,111 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1997 +.\" +.\" $Id: keyok.3x,v 1.48 2024/07/27 19:42:31 tom Exp $ +.TH keyok 3X 2024-07-27 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%keyok\fP \- +enable or disable a \fIcurses\fP function key code +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint keyok(int \fIkey-code\fP, bool \fIbf\fP); +.fi +.SH DESCRIPTION +The +.B \%keyok +.I \%ncurses +extension permits a +.I curses +application to disable a function key +.I key-code +returned by \fB\%wgetch\fP(3X) +(wide-character API users: +\fB\%wget_wch\fP(3X)). +Key codes that have been disabled can be re-enabled. +.I bf +selects the desired enablement status. +This operation is more fine-grained than calling \fB\%keypad\fP(3X), +which affects +.I all +function keys. +.SH RETURN VALUE +.B \%keyok +returns +.B ERR +if +.bP +.I key-code +is nonpositive, +.bP +.I key-code +is not a recognized value, +or +.bP +enablement of +.I key-code +is already in the desired state. +.PP +Otherwise, +.B \%keyok +returns +.BR OK "." +.SH EXTENSIONS +.B \%keyok +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +NetBSD +.I curses +since 2.0 (2004) supports +.IR \%keyok "." +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%define_key\fP(3X), +\fB\%keybound\fP(3X), +\fB\%keyok\fP(3X), +\fB\%key_defined\fP(3X) diff --git a/contrib/ncurses/man/legacy_coding.3x b/contrib/ncurses/man/legacy_coding.3x new file mode 100644 index 00000000..12b39538 --- /dev/null +++ b/contrib/ncurses/man/legacy_coding.3x @@ -0,0 +1,109 @@ +.\"*************************************************************************** +.\" Copyright 2020-2023,2024 Thomas E. Dickey * +.\" Copyright 2005-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey +.\" +.\" $Id: legacy_coding.3x,v 1.32 2024/09/14 20:06:50 tom Exp $ +.TH legacy_coding 3X 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%use_legacy_coding\fP \- +override \fIcurses\fR locale encoding checks +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint use_legacy_coding(int \fIlevel\fP); +.fi +.SH DESCRIPTION +.BR \%use_legacy_coding "," +an +.I \%ncurses +extension to the +.I curses +library, +permits customiztion of \fB\%unctrl\fP(3X) behavior, +suppressing \fI\%isprint\fP(3)-based checks within the library that +would normally cause nonprinting characters to be rendered in visible +form. +The alteration affects only byte-wide characters with the most +significant bit set. +.PP +The +.I level +parameter controls the result. +.RS +.TP 5 +.B 0 +The library functions normally, +rendering nonprinting characters as described in \fB\%unctrl\fP(3X), +.TP +.B 1 +the library ignores +.I \%isprint +for codes in the range 160-255. +.TP +.B 2 +the library ignores +.I \%isprint +for codes in the range 128-255. +It also modifies the output of \fB\%unctrl\fP(3X), +showing codes in the range 128-159 as is. +.RE +.SH RETURN VALUE +If the +.I curses +screen has not been initialized, +or the +.I level +parameter is out of range, +.B \%use_legacy_coding +returns +.BR ERR . +Otherwise, +it returns the previous level. +.SH EXTENSIONS +.B \%use_legacy_coding +is an +.I \%ncurses +extension. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.SH HISTORY +.I \%ncurses +5.6 (2006) introduced +.I \%use_legacy_coding +to support \fI\%lynx\fP(1)'s font-switching feature. +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%unctrl\fP(3X) diff --git a/contrib/ncurses/man/make_sed.sh b/contrib/ncurses/man/make_sed.sh new file mode 100755 index 00000000..ee7df417 --- /dev/null +++ b/contrib/ncurses/man/make_sed.sh @@ -0,0 +1,95 @@ +#!/bin/sh +# $Id: make_sed.sh,v 1.19 2023/12/07 01:16:43 tom Exp $ +############################################################################## +# Copyright 2020-2022,2023 Thomas E. Dickey # +# Copyright 1998-2005,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1997 +# +# Construct a sed-script to perform renaming within man-pages. Originally +# written in much simpler form, this one accounts for the common cases of +# section-names in man-pages. + +if test $# != 1 ; then + echo '? expected a single filename' + exit 1 +fi + +COL=col$$ +INPUT=input$$ +UPPER=upper$$ +SCRIPT=script$$ +RESULT=result$$ +rm -f $UPPER $SCRIPT $RESULT +trap "rm -f $COL.* $INPUT $UPPER $SCRIPT $RESULT; exit 1" 1 2 3 15 +trap "rm -f $COL.* $INPUT $UPPER $SCRIPT $RESULT" 0 +${FGREP-grep -F} -v \# "$1" | \ +sed -e 's/[ ][ ]*/ /g' >$INPUT + +for F in 1 2 3 4 +do +sed -e 's/\./ /g' $INPUT | \ +cut -f $F > $COL.$F +done +for F in 2 4 +do + tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ <$COL.$F >$UPPER + mv $UPPER $COL.$F +done +paste $COL.* | \ +sed -e 's/^/s\/\\$UPPER + +{ +echo "# This script was generated from '$1' by man/make_sed.sh." +echo "# Do the TH lines" +sed -e 's/\//\/TH /' \ + -e 's/ / /' \ + -e 's/ / \/TH /' \ + -e 's/ / /' \ + -e 's/\/$/ \//' \ + $UPPER + +echo "# Do the embedded references" +sed -e 's/>$RESULT + +# Finally, send the result to standard output +cat $RESULT diff --git a/contrib/ncurses/man/man_db.renames.in b/contrib/ncurses/man/man_db.renames.in new file mode 100644 index 00000000..79fbba2a --- /dev/null +++ b/contrib/ncurses/man/man_db.renames.in @@ -0,0 +1,316 @@ +############################################################################## +# Copyright 2019-2023,2024 Thomas E. Dickey # +# Copyright 1998-2015,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: man_db.renames.in,v 1.78 2024/07/20 20:55:37 tom Exp $ +# Manual-page renamings for the man_db program +# +# Files: +captoinfo.1m captoinfo.1 +clear.1 clear.1 +curs_add_wch.3x add_wch.3ncurses +curs_add_wchstr.3x add_wchstr.3ncurses +curs_addch.3x addch.3ncurses +curs_addchstr.3x addchstr.3ncurses +curs_addstr.3x addstr.3ncurses +curs_addwstr.3x addwstr.3ncurses +curs_attr.3x attr.3ncurses +curs_beep.3x beep.3ncurses +curs_bkgd.3x bkgd.3ncurses +curs_bkgrnd.3x bkgrnd.3ncurses +curs_border.3x border.3ncurses +curs_border_set.3x border_set.3ncurses +curs_clear.3x clear.3ncurses +curs_color.3x color.3ncurses +curs_delch.3x delch.3ncurses +curs_deleteln.3x deleteln.3ncurses +curs_extend.3x extensions.3ncurses +curs_get_wch.3x get_wch.3ncurses +curs_get_wstr.3x get_wstr.3ncurses +curs_getcchar.3x getcchar.3ncurses +curs_getch.3x getch.3ncurses +curs_getstr.3x getstr.3ncurses +curs_getyx.3x getyx.3ncurses +curs_in_wch.3x in_wch.3ncurses +curs_in_wchstr.3x in_wchstr.3ncurses +curs_inch.3x inch.3ncurses +curs_inchstr.3x inchstr.3ncurses +curs_initscr.3x initscr.3ncurses +curs_inopts.3x inopts.3ncurses +curs_ins_wch.3x ins_wch.3ncurses +curs_ins_wstr.3x ins_wstr.3ncurses +curs_insch.3x insch.3ncurses +curs_insstr.3x insstr.3ncurses +curs_instr.3x instr.3ncurses +curs_inwstr.3x inwstr.3ncurses +curs_kernel.3x kernel.3ncurses +curs_legacy.3x legacy.3ncurses +curs_memleaks.3x memleaks.3ncurses +curs_mouse.3x mouse.3ncurses +curs_move.3x move.3ncurses +curs_opaque.3x opaque.3ncurses +curs_outopts.3x outopts.3ncurses +curs_overlay.3x overlay.3ncurses +curs_pad.3x pad.3ncurses +curs_print.3x print.3ncurses +curs_printw.3x printw.3ncurses +curs_refresh.3x refresh.3ncurses +curs_scanw.3x scanw.3ncurses +curs_scr_dump.3x scr_dump.3ncurses +curs_scroll.3x scroll.3ncurses +curs_slk.3x slk.3ncurses +curs_sp_funcs.3x sp_funcs.3ncurses +curs_termattrs.3x termattrs.3ncurses +curs_termcap.3x termcap.3ncurses +curs_terminfo.3x terminfo.3ncurses +curs_threads.3x threads.3ncurses +curs_touch.3x touch.3ncurses +curs_trace.3x trace.3ncurses +curs_util.3x util.3ncurses +curs_variables.3x curses_variables.3ncurses +curs_window.3x window.3ncurses +curses.3x ncurses.3ncurses +default_colors.3x default_colors.3ncurses +define_key.3x define_key.3ncurses +form.3x form.3form +form_cursor.3x cursor.3form +form_data.3x data.3form +form_driver.3x driver.3form +form_field.3x field.3form +form_field_attributes.3x field_attributes.3form +form_field_buffer.3x field_buffer.3form +form_field_info.3x field_info.3form +form_field_just.3x field_just.3form +form_field_new.3x field_new.3form +form_field_opts.3x field_opts.3form +form_field_userptr.3x field_userptr.3form +form_field_validation.3x field_validation.3form +form_fieldtype.3x fieldtype.3form +form_hook.3x hook.3form +form_new.3x new.3form +form_new_page.3x new_page.3form +form_opts.3x opts.3form +form_page.3x page.3form +form_post.3x post.3form +form_requestname.3x requestname.3form +form_userptr.3x userptr.3form +form_variables.3x form_variables.3form +form_win.3x win.3form +infocmp.1m infocmp.1 +infotocap.1m infotocap.1 +key_defined.3x key_defined.3ncurses +keybound.3x keybound.3ncurses +keyok.3x keyok.3ncurses +legacy_coding.3x legacy_coding.3ncurses +menu.3x menu.3menu +menu_attributes.3x attributes.3menu +menu_cursor.3x cursor.3menu +menu_driver.3x driver.3menu +menu_format.3x format.3menu +menu_hook.3x hook.3menu +menu_items.3x items.3menu +menu_mark.3x mark.3menu +menu_new.3x new.3menu +menu_opts.3x opts.3menu +menu_pattern.3x pattern.3menu +menu_post.3x post.3menu +menu_requestname.3x requestname.3menu +menu_spacing.3x spacing.3menu +menu_userptr.3x userptr.3menu +menu_win.3x win.3menu +mitem_current.3x menu_current.3menu +mitem_name.3x menu_name.3menu +mitem_new.3x menu_new.3menu +mitem_opts.3x menu_opts.3menu +mitem_userptr.3x menu_userptr.3menu +mitem_value.3x menu_value.3menu +mitem_visible.3x menu_visible.3menu +ncurses.3x ncurses.3ncurses +new_pair.3x new_pair.3ncurses +panel.3x panel.3ncurses +printf.3s printf.3 +putc.3s putc.3 +resizeterm.3x resizeterm.3ncurses +scanf.3s scanf.3 +scr_dump.5 scr_dump.5 +system.3s system.3 +tabs.1 tabs.1 +term.5 term.5 +term.7 term.7 +term_variables.3x terminfo_variables.3ncurses +terminfo.5 terminfo.5 +tic.1m tic.1 +toe.1m toe.1 +tput.1 tput.1 +tset.1 tset.1 +user_caps.5 user_caps.5 +wresize.3x wresize.3ncurses +# +# Supplementary topics in the foregoing pages: +add_wch.3x add_wch.3ncurses +addch.3x addch.3ncurses +assume_default_colors.3x assume_default_colors.3ncurses +attr_get.3x attr_get.3ncurses +attr_on.3x attr_on.3ncurses +attron.3x attron.3ncurses +baudrate.3x baudrate.3ncurses +beep.3x beep.3ncurses +bkgd.3x bkgd.3ncurses +bkgrnd.3x bkgrnd.3ncurses +cbreak.3x cbreak.3ncurses +clearok.3x clearok.3ncurses +clrtoeol.3x clrtoeol.3ncurses +curs_set.3x curs_set.3ncurses +curscr.3x curscr.3ncurses +curses_trace.3x curses_trace.3ncurses +def_prog_mode.3x def_prog_mode.3ncurses +def_shell_mode.3x def_shell_mode.3ncurses +del_curterm.3x del_curterm.3ncurses +delay_output.3x delay_output.3ncurses +delscreen.3x delscreen.3ncurses +derwin.3x derwin.3ncurses +doupdate.3x doupdate.3ncurses +echo.3x echo.3ncurses +endwin.3x endwin.3ncurses +erasechar.3x erasechar.3ncurses +erasewchar.3x erasewchar.3ncurses +extended_slk_color.3x extended_slk_color.3ncurses +filter.3x filter.3ncurses +flushinp.3x flushinp.3ncurses +get_wch.3x get_wch.3ncurses +getattr.3x getattr.3ncurses +getcchar.3x getcchar.3ncurses +getch.3x getch.3ncurses +getwin.3x getwin.3ncurses +getyx.3x getyx.3ncurses +halfdelay.3x halfdelay.3ncurses +has_key.3x has_key.3ncurses +idcok.3x idcok.3ncurses +idlok.3x idlok.3ncurses +immedok.3x immedok.3ncurses +in_wch.3x in_wch.3ncurses +inch.3x inch.3ncurses +initscr.3x initscr.3ncurses +is_cbreak.3x is_cbreak.3ncurses +is_scrollok.3x is_scrollok.3ncurses +keyname.3x keyname.3ncurses +keypad.3x keypad.3ncurses +killchar.3x killchar.3ncurses +leaveok.3x leaveok.3ncurses +longname.3x longname.3ncurses +meta.3x meta.3ncurses +move.3x move.3ncurses +mvcur.3x mvcur.3ncurses +mvwin.3x mvwin.3ncurses +newpad.3x newpad.3ncurses +newterm.3x newterm.3ncurses +newwin.3x newwin.3ncurses +nl.3x nl.3ncurses +nocbreak.3x nocbreak.3ncurses +nodelay.3x nodelay.3ncurses +nonl.3x nonl.3ncurses +noraw.3x noraw.3ncurses +notimeout.3x notimeout.3ncurses +pnoutrefresh.3x pnoutrefresh.3ncurses +prefresh.3x prefresh.3ncurses +printw.3x printw.3ncurses +putp.3x putp.3ncurses +putwin.3x putwin.3ncurses +raw.3x raw.3ncurses +refresh.3x refresh.3ncurses +reset_shell_mode.3x reset_shell_mode.3ncurses +restartterm.3x restartterm.3ncurses +ripoffline.3x ripoffline.3ncurses +scrollok.3x scrollok.3ncurses +set_curterm.3x set_curterm.3ncurses +set_term.3x set_term.3nses +setcchar.3x setcchar.3ncurses +setupterm.3x setupterm.3ncurses +slk_attr.3x slk_attr.3ncurses +slk_color.3x slk_color.3ncurses +slk_init.3x slk_init.3ncurses +slk_touch.3x slk_touch.3ncurses +start_color.3x start_color.3ncurses +subwin.3x subwin.3ncurses +syncok.3x syncok.3ncurses +terminfo.3x terminfo.3ncurses +tigetflag.3x tigetflag.3ncurses +tigetstr.3x tigetstr.3ncurses +touchline.3x touchline.3ncurses +touchwin.3x touchwin.3ncurses +tparm.3x tparm.3ncurses +tputs.3x tputs.3ncurses +trace.3x trace.3ncurses +unctrl.3x unctrl.3ncurses +use_default_colors.3x use_default_colors.3ncurses +use_env.3x use_env.3ncurses +use_extended_names.3x use_extended_names.3ncurses +use_legacy_coding.3x use_legacy_coding.3ncurses +use_tioctl.3x use_tioctl.3ncurses +vidputs.3x vidputs.3ncurses +wadd_wch.3x wadd_wch.3ncurses +waddch.3x waddch.3ncurses +waddnstr.3x waddnstr.3ncurses +waddnwstr.3x waddnwstr.3ncurses +waddstr.3x waddstr.3ncurses +waddwstr.3x waddwstr.3ncurses +wattr_set.3x wattr_set.3ncurses +wattrset.3x wattrset.3ncurses +wbkgdset.3x wbkgdset.3ncurses +wbkgrndset.3x wbkgrndset.3ncurses +wdelch.3x wdelch.3ncurses +wecho_wchar.3x wecho_wchar.3ncurses +wechochar.3x wechochar.3ncurses +wget_wch.3x wget_wch.3ncurses +wget_wstr.3x wget_wstr.3ncurses +wgetch.3x wgetch.3ncurses +wgetstr.3x wgetstr.3ncurses +win_wch.3x win_wch.3ncurses +winch.3x winch.3ncurses +wins_wch.3x wins_wch.3ncurses +winsch.3x winsch.3ncurses +wmove.3x wmove.3ncurses +wnoutrefresh.3x wnoutrefresh.3ncurses +wrefresh.3x wrefresh.3ncurses +wsetscrreg.3x wsetscrreg.3ncurses +wtimeout.3x wtimeout.3ncurses +wunctrl.3x wunctrl.3ncurses +# +# Other: +getty.8 getty.8 +scanf.3 scanf.3 +ttys.5 ttys.4 +system.3 system.3 +regcomp.3x regcomp.3 +regexec.3x regexec.3 +vprintf.3 vprintf.3 +# +# The following are pages which may be generated depending on configuration: +adacurses@USE_CFG_SUFFIX@-config.1 adacurses@USE_CFG_SUFFIX@-config.1 +ncurses@USE_CFG_SUFFIX@-config.1 ncurses@USE_CFG_SUFFIX@-config.1 +# +# vile:cfgmode diff --git a/contrib/ncurses/man/manhtml.aliases b/contrib/ncurses/man/manhtml.aliases new file mode 100644 index 00000000..fe68cf5b --- /dev/null +++ b/contrib/ncurses/man/manhtml.aliases @@ -0,0 +1,146 @@ +# $Id: manhtml.aliases,v 1.41 2024/06/22 23:03:10 tom Exp $ +#*************************************************************************** +# Copyright 2019-2023,2024 Thomas E. Dickey * +# Copyright 2013,2017 Free Software Foundation, Inc. * +# * +# Permission is hereby granted, free of charge, to any person obtaining a * +# copy of this software and associated documentation files (the * +# "Software"), to deal in the Software without restriction, including * +# without limitation the rights to use, copy, modify, merge, publish, * +# distribute, distribute with modifications, sublicense, and/or sell * +# copies of the Software, and to permit persons to whom the Software is * +# furnished to do so, subject to the following conditions: * +# * +# The above copyright notice and this permission notice shall be included * +# in all copies or substantial portions of the Software. * +# * +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +# IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +# THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +# * +# Except as contained in this notice, the name(s) of the above copyright * +# holders shall not be used in advertising or otherwise to promote the * +# sale, use or other dealings in this Software without prior written * +# authorization. * +#*************************************************************************** +# Items in this list will be linked to the corresponding manpages by man2html +add_wch(3X) curs_add_wch(3X) +addch(3X) curs_addch(3X) +assume_default_colors(3X) default_colors(3X) +attr_get(3X) curs_attr(3X) +attr_on(3X) curs_attr(3X) +attron(3X) curs_attr(3X) +baudrate(3X) curs_termattrs(3X) +beep(3X) curs_beep(3X) +bkgd(3X) curs_bkgd(3X) +bkgrnd(3X) curs_bkgrnd(3X) +cbreak(3X) curs_inopts(3X) +clearok(3X) curs_outopts(3X) +clrtoeol(3X) curs_clear(3X) +curs_set(3X) curs_kernel(3X) +curscr(3X) curs_variables(3X) +curses_trace(3X) curs_trace(3X) +def_prog_mode(3X) curs_kernel(3X) +def_shell_mode(3X) curs_kernel(3X) +del_curterm(3X) curs_terminfo(3X) +delay_output(3X) curs_util(3X) +delscreen(3X) curs_initscr(3X) +doupdate(3X) curs_refresh(3X) +echo(3X) curs_inopts(3X) +endwin(3X) curs_initscr(3X) +erasechar(3X) curs_termattrs(3X) +erasewchar(3X) curs_termattrs(3X) +extended_slk_color(3X) curs_slk(3X) +filter(3X) curs_util(3X) +flushinp(3X) curs_util(3X) +get_wch(3X) curs_get_wch(3X) +getcchar(3X) curs_getcchar(3X) +getch(3X) curs_getch(3X) +getwin(3X) curs_util(3X) +getyx(3X) curs_getyx(3X) +halfdelay(3X) curs_inopts(3X) +has_key(3X) curs_getch(3X) +immedok(3X) curs_outopts(3X) +in_wch(3X) curs_in_wch(3X) +inch(3X) curs_inch(3X) +infocmp(1) infocmp(1M) +initscr(3X) curs_initscr(3X) +is_cbreak(3X) curs_inopts(3X) +is_scrollok(3X) curs_opaque(3X) +killchar(3X) curs_termattrs(3X) +keyname(3X) curs_util(3X) +keypad(3X) curs_inopts(3X) +longname(3X) curs_termattrs(3X) +meta(3X) curs_inopts(3X) +move(3X) curs_move(3X) +mvcur(3X) curs_terminfo(3X) +mvwin(3X) curs_window(3X) +newterm(3X) curs_initscr(3X) +newwin(3X) curs_window(3X) +nl(3X) curs_inopts(3X) +nocbreak(3X) curs_inopts(3X) +nonl(3X) curs_inopts(3X) +noraw(3X) curs_inopts(3X) +pnoutrefresh(3X) curs_pad(3X) +prefresh(3X) curs_pad(3X) +printw(3X) curs_printw(3X) +putp(3X) curs_terminfo(3X) +putwin(3X) curs_util(3X) +raw(3X) curs_inopts(3X) +refresh(3X) curs_refresh(3X) +reset_shell_mode(3X) curs_kernel(3X) +restartterm(3X) curs_terminfo(3X) +ripoffline(3X) curs_kernel(3X) +set_curterm(3X) curs_terminfo(3X) +set_term(3X) curs_initscr(3X) +setcchar(3X) curs_getcchar(3X) +setupterm(3X) curs_terminfo(3X) +slk_attr(3X) curs_slk(3X) +slk_color(3X) curs_slk(3X) +slk_init(3X) curs_slk(3X) +slk_touch(3X) curs_slk(3X) +start_color(3X) curs_color(3X) +terminfo(3X) curs_terminfo(3X) +tic(1) tic(1M) +tigetflag(3X) curs_terminfo(3X) +tigetstr(3X) curs_terminfo(3X) +touchline(3X) curs_touch(3X) +touchwin(3X) curs_touch(3X) +tparm(3X) curs_terminfo(3X) +tputs(3X) curs_terminfo(3X) +use_default_colors(3X) default_colors(3X) +use_env(3X) curs_util(3X) +use_extended_names(3X) curs_extend(3X) +use_legacy_coding(3X) legacy_coding(3X) +use_tioctl(3X) curs_util(3X) +vidputs(3X) curs_terminfo(3X) +wadd_wch(3X) curs_add_wch(3X) +waddch(3X) curs_addch(3X) +waddnstr(3X) curs_addstr(3X) +waddnwstr(3X) curs_addwstr(3X) +waddstr(3X) curs_addstr(3X) +waddwstr(3X) curs_addwstr(3X) +wattr_set(3X) curs_attr(3X) +wattrset(3X) curs_attr(3X) +wbkgdset(3X) curs_bkgd(3X) +wbkgrndset(3X) curs_bkgrnd(3X) +wdelch(3X) curs_delch(3X) +wecho_wchar(3X) curs_add_wch(3X) +wechochar(3X) curs_addch(3X) +wget_wch(3X) curs_get_wch(3X) +wget_wstr(3X) curs_get_wstr(3X) +wgetch(3X) curs_getch(3X) +wgetstr(3X) curs_getstr(3X) +win_wch(3X) curs_in_wch(3X) +winch(3X) curs_inch(3X) +wins_wch(3X) curs_ins_wch(3X) +winsch(3X) curs_insch(3X) +wmove(3X) curs_move(3X) +wnoutrefresh(3X) curs_refresh(3X) +wrefresh(3X) curs_refresh(3X) +wsetscrreg(3X) curs_outopts(3X) +wunctrl(3X) curs_util(3X) diff --git a/contrib/ncurses/man/manhtml.externs b/contrib/ncurses/man/manhtml.externs new file mode 100644 index 00000000..cc4e8210 --- /dev/null +++ b/contrib/ncurses/man/manhtml.externs @@ -0,0 +1,88 @@ +# $Id: manhtml.externs,v 1.29 2024/07/27 20:15:00 tom Exp $ +# Items in this list will not be linked by man2html +#*************************************************************************** +# Copyright 2019-2023,2024 Thomas E. Dickey * +# Copyright 2013,2017 Free Software Foundation, Inc. * +# * +# Permission is hereby granted, free of charge, to any person obtaining a * +# copy of this software and associated documentation files (the * +# "Software"), to deal in the Software without restriction, including * +# without limitation the rights to use, copy, modify, merge, publish, * +# distribute, distribute with modifications, sublicense, and/or sell * +# copies of the Software, and to permit persons to whom the Software is * +# furnished to do so, subject to the following conditions: * +# * +# The above copyright notice and this permission notice shall be included * +# in all copies or substantial portions of the Software. * +# * +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +# IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +# THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +# * +# Except as contained in this notice, the name(s) of the above copyright * +# holders shall not be used in advertising or otherwise to promote the * +# sale, use or other dealings in this Software without prior written * +# authorization. * +#*************************************************************************** +COLOR_PAIR(1) +COLOR_PAIR(2) +ascii(7) +atoi(3) +bash(1) +conflict(1) +cron(1) +csh(1) +ded(1) +emacs(1) +environ(7) +errno(3) +file(1) +fread(3) +free(3) +fwrite(3) +getty(8) +ioctl(2) +isprint(3) +jove(1) +lynx(1) +mutt(1) +nvi(1) +od(1) +printf(3) +profile(5) +putc(3) +putchar(3) +putwc(3) +putwchar(3) +read(2) +readline(3) +resize(1) +scanf(3) +scanf(3S) +screen(1) +setbuf(3) +setgid(2) +setlocale(3) +setuid(2) +sh(1) +sscanf(3) +stdio(3) +stty(1) +swprintf(3) +sysconf(3) +system(3) +termios(3) +tmux(1) +tty(4) +ttys(5) +vi(1) +vprintf(3) +vscanf(3) +vsscanf(3) +wcwidth(3) +write(2) +xterm(1) diff --git a/contrib/ncurses/man/manlinks.sed b/contrib/ncurses/man/manlinks.sed new file mode 100644 index 00000000..01182448 --- /dev/null +++ b/contrib/ncurses/man/manlinks.sed @@ -0,0 +1,118 @@ +# $Id: manlinks.sed,v 1.22 2024/09/14 23:49:39 tom Exp $ +############################################################################## +# Copyright 2020-2023,2024 Thomas E. Dickey # +# Copyright 2000-2003,2008 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# Given a manpage (nroff) as input, writes a list of the names that are +# listed in the "NAME" section, i.e., the names that we would like to use +# as aliases for the manpage -T.Dickey +# +# workaround for manpages without a SYNOPSIS +s/^\.\\"SH/.SH/ +# +# eliminate formatting controls that get in the way +/^'\\"/d +/\.\\"/d +/^\.br/d +/^\.sp/d +/typedef/d +s/^\.IX// +s/\\f.//g +s/\\%//g +s/[:,]/ /g +# +# ignore C-style comments +s%/\*.*\*/%% +# +# Eliminate unnecessary whitespace, convert multiple blanks to single space. +s/^[ ][ ]*// +s/[ ][ ]*$// +s/[ ][ ]*/ /g +/^$/d +/^[<>]/d +# +# convert ".SH" into a more manageable form +s/\.SH[ ][ ]*/.SH_(/ +# +# in ".SH NAME" +# Convert a list of names separated from their description by " \-" to a list +# of names on separate lines. Normally the list is also comma-separated, but +# we ignore that detail here. The description is on a separate line to make +# the nroff source more pleasing to some eyes. +/^\.SH_(NAME/,/ \\-$/{ +s/\\-/-/g +s/ / /g +/ -$/{ +s/ -$// +n +d +} +s/ /\ +/g +} +# +# in ".SH SYNOPSIS" +# For readability, the NAME section may not contain all function names, but we +# still want to make aliases for those. Do this by extracting names from the +# list of function prototypes in the synopsis. +# +# Remove any line that does not contain a '(', since we only want functions. +# then strip off return-type of each function. +# +# Finally, remove the parameter list, which begins with a '('. +/^\.SH_(SYNOPSIS/,/^\.SH_(DESCRIPTION/{ +/^\.ti/d +/^[^(]*$/d +# reduce +# .B "int add_wch( const cchar_t *\fIwch\fB );" +# to +# add_wch( const cchar_t *\fIwch\fB );" +s/^\([^ (]* [^ (]* [*]*\)//g +s/^\([^ (]* [*]*\)//g +# trim blanks in case we have +# void (*) (FORM *) field_init(const FORM *form); +s/) (/)(/g +# reduce stuff like +# void (*)(FORM *) field_init(const FORM *form); +# to +# field_init(const FORM *form); +s/^\(([^)]*)\)\(([^)]*)\)*[ ]*//g +# rename marker temporarily +s/\.SH_(/.SH_/ +# kill lines with ");", and trim off beginning of argument list. +s/[()].*// +# rename marker back +s/\.SH_/.SH_(/ +} +# +# delete ".SH DESCRIPTION" and following lines +/^\.SH_(DESCRIPTION/,${ +d +} +# +# delete any remaining directives +/^\./d diff --git a/contrib/ncurses/man/menu.3x b/contrib/ncurses/man/menu.3x new file mode 100644 index 00000000..99d5c1e6 --- /dev/null +++ b/contrib/ncurses/man/menu.3x @@ -0,0 +1,215 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2014,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu.3x,v 1.47 2024/05/25 20:52:38 tom Exp $ +.TH menu 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBmenu\fP \- +present menus in \fIcurses\fP windows +.SH SYNOPSIS +.nf +\fB#include +.fi +.SH DESCRIPTION +The \fBmenu\fP library provides terminal-independent facilities for composing +menu systems on character-cell terminals. +The library includes: item routines, +which create and modify menu items; and menu routines, which group items into +menus, display menus on the screen, and handle interaction with the user. +.PP +The \fBmenu\fP library uses the \fBcurses\fP libraries, and a curses +initialization routine such as \fBinitscr\fP must be called before using any of +these functions. +To use the \fBmenu\fP library, link with the options +\fB\-lmenu \-lcurses\fP. +. +.SS "Current Default Values for Item Attributes" +. +The \fBmenu\fP library maintains a default value for item attributes. +You can +get or set this default by calling the appropriate \fBget_\fP or \fBset_\fP +routine with a \fBNULL\fP item pointer. +Changing this default with a +\fBset_\fP function affects future item creations, but does not change the +rendering of items already created. +. +.SS "Routine Name Index" +. +The following table lists each \fBmenu\fP routine and the name of +the manual page on which it is described. +.PP +.TS +l l . +\fBcurses\fP Routine Name Manual Page Name += +current_item \fBmitem_current\fP(3X) +free_item \fBmitem_new\fP(3X) +free_menu \fBmenu_new\fP(3X) +item_count \fBmenu_items\fP(3X) +item_description \fBmitem_name\fP(3X) +item_index \fBmitem_current\fP(3X) +item_init \fBmenu_hook\fP(3X) +item_name \fBmitem_name\fP(3X) +item_opts \fBmitem_opts\fP(3X) +item_opts_off \fBmitem_opts\fP(3X) +item_opts_on \fBmitem_opts\fP(3X) +item_term \fBmenu_hook\fP(3X) +item_userptr \fBmitem_userptr\fP(3X) +item_value \fBmitem_value\fP(3X) +item_visible \fBmitem_visible\fP(3X) +menu_back \fBmenu_attributes\fP(3X) +menu_driver \fBmenu_driver\fP(3X) +menu_fore \fBmenu_attributes\fP(3X) +menu_format \fBmenu_format\fP(3X) +menu_grey \fBmenu_attributes\fP(3X) +menu_init \fBmenu_hook\fP(3X) +menu_items \fBmenu_items\fP(3X) +menu_mark \fBmenu_mark\fP(3X) +menu_opts \fBmenu_opts\fP(3X) +menu_opts_off \fBmenu_opts\fP(3X) +menu_opts_on \fBmenu_opts\fP(3X) +menu_pad \fBmenu_attributes\fP(3X) +menu_pattern \fBmenu_pattern\fP(3X) +menu_request_by_name \fBmenu_requestname\fP(3X) +menu_request_name \fBmenu_requestname\fP(3X) +menu_spacing \fBmenu_spacing\fP(3X) +menu_sub \fBmenu_win\fP(3X) +menu_term \fBmenu_hook\fP(3X) +menu_userptr \fBmenu_userptr\fP(3X) +menu_win \fBmenu_win\fP(3X) +new_item \fBmitem_new\fP(3X) +new_menu \fBmenu_new\fP(3X) +pos_menu_cursor \fBmenu_cursor\fP(3X) +post_menu \fBmenu_post\fP(3X) +scale_menu \fBmenu_win\fP(3X) +set_current_item \fBmitem_current\fP(3X) +set_item_init \fBmenu_hook\fP(3X) +set_item_opts \fBmitem_opts\fP(3X) +set_item_term \fBmenu_hook\fP(3X) +set_item_userptr \fBmitem_userptr\fP(3X) +set_item_value \fBmitem_value\fP(3X) +set_menu_back \fBmenu_attributes\fP(3X) +set_menu_fore \fBmenu_attributes\fP(3X) +set_menu_format \fBmenu_format\fP(3X) +set_menu_grey \fBmenu_attributes\fP(3X) +set_menu_init \fBmenu_hook\fP(3X) +set_menu_items \fBmenu_items\fP(3X) +set_menu_mark \fBmenu_mark\fP(3X) +set_menu_opts \fBmitem_opts\fP(3X) +set_menu_pad \fBmenu_attributes\fP(3X) +set_menu_pattern \fBmenu_pattern\fP(3X) +set_menu_spacing \fBmenu_spacing\fP(3X) +set_menu_sub \fBmenu_win\fP(3X) +set_menu_term \fBmenu_hook\fP(3X) +set_menu_userptr \fBmenu_userptr\fP(3X) +set_menu_win \fBmenu_win\fP(3X) +set_top_row \fBmitem_current\fP(3X) +top_row \fBmitem_current\fP(3X) +unpost_menu \fBmenu_post\fP(3X) +.TE +.SH RETURN VALUE +Routines that return pointers return \fBNULL\fP on error. +Routines that return +an integer return one of the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NO_MATCH +Character failed to match. +.TP 5 +.B E_NO_ROOM +Menu is too large for its window. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.TP 5 +.B E_NOT_POSTED +The menu has not been posted. +.TP 5 +.B E_NOT_SELECTABLE +The designated item cannot be selected. +.TP 5 +.B E_POSTED +The menu is already posted. +.TP 5 +.B E_REQUEST_DENIED +The menu driver could not process the request. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_UNKNOWN_COMMAND +The menu driver code saw an unknown request code. +.SH NOTES +The header file \fI\%menu.h\fP itself includes the header file +\fI\%curses.h\fP. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.PP +A menu facility was documented in SVr4.2's +\fICharacter User Interface Programming\fP document. +.PP +It is not part of X/Open Curses. +.PP +Aside from \fI\%ncurses\fP, there are few implementations: +.bP +systems based on SVr4 source code, e.g., Solaris. +.bP +NetBSD curses. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for \fI\%ncurses\fP by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``menu_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/menu_attributes.3x b/contrib/ncurses/man/menu_attributes.3x new file mode 100644 index 00000000..7bce42d2 --- /dev/null +++ b/contrib/ncurses/man/menu_attributes.3x @@ -0,0 +1,113 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_attributes.3x,v 1.36 2024/03/16 15:35:01 tom Exp $ +.TH menu_attributes 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +\fBmenu_back\fP, +\fBmenu_fore\fP, +\fBmenu_grey\fP, +\fBmenu_pad\fP, +\fBset_menu_back\fP, +\fBset_menu_fore\fP, +\fBset_menu_grey\fP, +\fBset_menu_pad\fP \- +color and attribute control for menus +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_fore(MENU *\fImenu\fP, chtype \fIattr\fP); +\fBchtype menu_fore(const MENU *\fImenu\fP); +.PP +\fBint set_menu_back(MENU *\fImenu\fP, chtype \fIattr\fP); +\fBchtype menu_back(const MENU *\fImenu\fP); +.PP +\fBint set_menu_grey(MENU *\fImenu\fP, chtype \fIattr\fP); +\fBchtype menu_grey(const MENU *\fImenu\fP); +.PP +\fBint set_menu_pad(MENU *\fImenu\fP, int \fIpad\fP); +\fBint menu_pad(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +The function \fBset_menu_fore\fP sets the foreground attribute of +\fImenu\fP. This is the highlight used for selected menu items. +\fBmenu_fore\fP returns the foreground attribute. +The default +is \fBA_REVERSE\fP. +.PP +The function \fBset_menu_back\fP sets the background attribute of +\fImenu\fP. This is the highlight used for selectable (but not currently +selected) menu items. +The function \fBmenu_back\fP returns the background +attribute. +The default is \fBA_NORMAL\fP. +.PP +The function \fBset_menu_grey\fP sets the grey attribute of \fImenu\fP. This is +the highlight used for un-selectable menu items in menus that permit more than +one selection. +The function \fBmenu_grey\fP returns the grey attribute. +The default is \fBA_UNDERLINE\fP. +.PP +The function \fBset_menu_pad\fP sets the character used to fill the space +between the name and description parts of a menu item. +\fBmenu_pad\fP returns +the given menu's pad character. +The default is a blank. +.SH RETURN VALUE +These routines return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X) and related pages whose names begin \*(``menu_\*('' +for detailed descriptions of the entry points. diff --git a/contrib/ncurses/man/menu_cursor.3x b/contrib/ncurses/man/menu_cursor.3x new file mode 100644 index 00000000..d92d8c3a --- /dev/null +++ b/contrib/ncurses/man/menu_cursor.3x @@ -0,0 +1,69 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_cursor.3x,v 1.30 2024/03/16 15:35:01 tom Exp $ +.TH menu_cursor 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBpos_menu_cursor\fP \- +position a menu's cursor +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint pos_menu_cursor(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +The function \fBpos_menu_cursor\fP restores the cursor to the current position +associated with the menu's selected item. +This is useful after \fBcurses\fP +routines have been called to do screen-painting in response to a menu select. +.SH RETURN VALUE +This routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_NOT_POSTED +The menu has not been posted. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_driver.3x b/contrib/ncurses/man/menu_driver.3x new file mode 100644 index 00000000..6a117283 --- /dev/null +++ b/contrib/ncurses/man/menu_driver.3x @@ -0,0 +1,205 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_driver.3x,v 1.47 2024/03/16 15:35:01 tom Exp $ +.TH menu_driver 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fBmenu_driver\fP \- +command-processing loop of the menu system +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint menu_driver(MENU *\fImenu\fP, int \fIc\fP); +.fi +.SH DESCRIPTION +Once a menu has been posted (displayed), you should funnel input events to it +through \fBmenu_driver\fP. This routine has three major input cases: +.bP +The input is a form navigation request. +Navigation request codes are constants defined in \fB\fP, +which are distinct from the key- and character codes +returned by \fBwgetch\fP(3X). +.bP +The input is a printable character. +Printable characters (which must be positive, less than 256) are +checked according to the program's locale settings. +.bP +The input is the KEY_MOUSE special key associated with an mouse event. +.PP +The menu driver requests are as follows: +.TP 5 +REQ_LEFT_ITEM +Move left to an item. +.TP 5 +REQ_RIGHT_ITEM +Move right to an item. +.TP 5 +REQ_UP_ITEM +Move up to an item. +.TP 5 +REQ_DOWN_ITEM +Move down to an item. +.TP 5 +REQ_SCR_ULINE +Scroll up a line. +.TP 5 +REQ_SCR_DLINE +Scroll down a line. +.TP 5 +REQ_SCR_DPAGE +Scroll down a page. +.TP 5 +REQ_SCR_UPAGE +Scroll up a page. +.TP 5 +REQ_FIRST_ITEM +Move to the first item. +.TP 5 +REQ_LAST_ITEM +Move to the last item. +.TP 5 +REQ_NEXT_ITEM +Move to the next item. +.TP 5 +REQ_PREV_ITEM +Move to the previous item. +.TP 5 +REQ_TOGGLE_ITEM +Select/deselect an item. +.TP 5 +REQ_CLEAR_PATTERN +Clear the menu pattern buffer. +.TP 5 +REQ_BACK_PATTERN +Delete the previous character from the pattern buffer. +.TP 5 +REQ_NEXT_MATCH +Move to the next item matching the pattern match. +.TP 5 +REQ_PREV_MATCH +Move to the previous item matching the pattern match. +.PP +If the second argument is a printable character, the code appends +it to the pattern buffer and attempts to move to the next item matching +the new pattern. +If there is no such match, \fBmenu_driver\fP returns +\fBE_NO_MATCH\fP and deletes the appended character from the buffer. +.PP +If the second argument is one of the above pre-defined requests, the +corresponding action is performed. +.SS "Mouse Handling" +If the second argument is the KEY_MOUSE special key, the associated +mouse event is translated into one of the above pre-defined requests. +Currently only clicks in the user window (e.g., inside the menu display +area or the decoration window) are handled. +.PP +If you click above the display region of the menu: +.bP +a REQ_SCR_ULINE is generated for a single click, +.bP +a REQ_SCR_UPAGE is generated for a double-click and +.bP +a REQ_FIRST_ITEM is generated for a triple-click. +.PP +If you click below the display region of the menu: +.bP +a REQ_SCR_DLINE is generated for a single click, +.bP +a REQ_SCR_DPAGE is generated for a double-click and +.bP +a REQ_LAST_ITEM is generated for a triple-click. +.PP +If you click at an item inside the display area of the menu: +.bP +the menu cursor is positioned to that item. +.bP +If you double-click an item a REQ_TOGGLE_ITEM +is generated and \fBE_UNKNOWN_COMMAND\fP is returned. +This return value makes sense, +because a double click usually means that an item-specific action should +be returned. +It is exactly the purpose of this return value to signal that an +application specific command should be executed. +.bP +If a translation +into a request was done, \fBmenu_driver\fP returns the result of this request. +.PP +If you clicked outside the user window +or the mouse event could not be translated +into a menu request an \fBE_REQUEST_DENIED\fP is returned. +.SS "Application-defined Commands" +If the second argument is neither printable nor one of the above +pre-defined menu requests or KEY_MOUSE, +the drive assumes it is an application-specific +command and returns \fBE_UNKNOWN_COMMAND\fP. Application-defined commands +should be defined relative to \fBMAX_COMMAND\fP, the maximum value of these +pre-defined requests. +.SH RETURN VALUE +\fBmenu_driver\fP return one of the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NOT_POSTED +The menu has not been posted. +.TP 5 +.B E_UNKNOWN_COMMAND +The menu driver code saw an unknown request code. +.TP 5 +.B E_NO_MATCH +Character failed to match. +.TP 5 +.B E_REQUEST_DENIED +The menu driver could not process the request. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +The support for mouse events is \fI\%ncurses\fP specific. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%getch\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_format.3x b/contrib/ncurses/man/menu_format.3x new file mode 100644 index 00000000..9781878f --- /dev/null +++ b/contrib/ncurses/man/menu_format.3x @@ -0,0 +1,86 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_format.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH menu_format 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_format\fP, +\fBmenu_format\fP \- +set and get menu sizes +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_format(MENU *\fImenu\fP, int \fIrows\fP, int \fIcols\fP); +\fBvoid menu_format(const MENU *\fImenu\fP, int *\fIrows\fP, int *\fIcols\fP); +.fi +.SH DESCRIPTION +The function \fBset_menu_format\fP sets the maximum display size of the given +menu. +If this size is too small to display all menu items, the menu will be +made scrollable. +If this size is larger than the menus subwindow and the +subwindow is too small to display all menu items, \fBpost_menu\fP will fail. +.PP +The default format is 16 rows, 1 column. +Calling \fBset_menu_format\fP with a +null menu pointer will change this default. +A zero row or column argument to +\fBset_menu_format\fP is interpreted as a request not to change the current +value. +.PP +The function \fBmenu_format\fP returns the maximum-size constraints for the +given menu into the storage addressed by \fBrows\fP and \fBcols\fP. +.SH RETURN VALUE +These routines returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_POSTED +The menu is already posted. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_hook.3x b/contrib/ncurses/man/menu_hook.3x new file mode 100644 index 00000000..839e199b --- /dev/null +++ b/contrib/ncurses/man/menu_hook.3x @@ -0,0 +1,97 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2007,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_hook.3x,v 1.32 2024/03/16 15:35:01 tom Exp $ +.TH menu_hook 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBmenu_hook\fP \- +set hooks for automatic invocation by applications +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_item_init(MENU *\fImenu\fP, Menu_Hook \fIfunc\fP); +\fBMenu_Hook item_init(const MENU *\fImenu\fP); +.PP +\fBint set_item_term(MENU *\fImenu\fP, Menu_Hook \fIfunc\fP); +\fBMenu_Hook item_term(const MENU *\fImenu\fP); +.PP +\fBint set_menu_init(MENU *\fImenu\fP, Menu_Hook \fIfunc\fP); +\fBMenu_Hook menu_init(const MENU *\fImenu\fP); +.PP +\fBint set_menu_term(MENU *\fImenu\fP, Menu_Hook \fIfunc\fP); +\fBMenu_Hook menu_term(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +These functions make it possible to set hook functions to be called at various +points in the automatic processing of input event codes by \fBmenu_driver\fP. +.PP +The function \fBset_item_init\fP sets a hook to be called at menu-post time and +each time the selected item changes (after the change). +\fBitem_init\fP +returns the current item init hook, if any (\fBNULL\fP if there is no such +hook). +.PP +The function \fBset_item_term\fP sets a hook to be called at menu-unpost time +and each time the selected item changes (before the change). +\fBitem_term\fP +returns the current item term hook, if any (\fBNULL\fP if there is no such +hook). +.PP +The function \fBset_menu_init\fP sets a hook to be called at menu-post time and +just after the top row on the menu changes once it is posted. +\fBmenu_init\fP +returns the current menu init hook, if any (\fBNULL\fP if there is no such +hook). +.PP +The function \fBset_menu_term\fP sets a hook to be called at menu-unpost time +and just before the top row on the menu changes once it is posted. +\fBmenu_term\fP returns the current menu term hook, if any (\fBNULL\fP if there +is no such hook). +.SH RETURN VALUE +Routines that return pointers return \fBNULL\fP on error. +Other routines +return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric +S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_items.3x b/contrib/ncurses/man/menu_items.3x new file mode 100644 index 00000000..43409fef --- /dev/null +++ b/contrib/ncurses/man/menu_items.3x @@ -0,0 +1,87 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2012,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_items.3x,v 1.34 2024/03/16 15:35:01 tom Exp $ +.TH menu_items 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_items\fP, +\fBmenu_items\fP, +\fBitem_count\fP \- +make and break connections between items and menus +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_items(MENU *\fImenu\fP, ITEM **\fIitems\fP); +\fBITEM **menu_items(const MENU *\fImenu\fP); +\fBint item_count(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +The function \fBset_menu_items\fP changes the item pointer array of the given +\fImenu\fP. The array must be terminated by a \fBNULL\fP. +.PP +The function \fBmenu_items\fP returns the item array of the given menu. +.PP +The function \fBitem_count\fP returns the count of items in \fImenu\fP. +.SH RETURN VALUE +The function \fBmenu_items\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +The function \fBitem_count\fP returns \fBERR\fP (the general \fBcurses\fP error +return value) if its \fImenu\fP parameter is \fBNULL\fP. +.PP +The function \fBset_menu_items\fP returns one of the following codes on error: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.TP 5 +.B E_POSTED +The menu is already posted. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.PP +The SVr4 menu library documentation specifies the \fBitem_count\fP error value +as \-1 (which is the value of \fBERR\fP). +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_mark.3x b/contrib/ncurses/man/menu_mark.3x new file mode 100644 index 00000000..e3f3a928 --- /dev/null +++ b/contrib/ncurses/man/menu_mark.3x @@ -0,0 +1,82 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_mark.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH menu_mark 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_mark\fP, +\fBmenu_mark\fP \- +get and set the menu mark string +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_mark(MENU *\fImenu\fP, const char *\fImark\fP); +\fBconst char *menu_mark(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +In order to make menu selections visible on older terminals without +highlighting or color capability, the menu library marks selected items +in a menu with a prefix string. +.PP +The function \fBset_menu_mark\fP sets the mark string for the given menu. +Calling \fBset_menu_mark\fP with a null menu item will abolish the mark string. +Note that changing the length of the mark string for a menu while the +menu is posted is likely to produce unhelpful behavior. +.PP +The default string is "\-" (a dash). +Calling \fBset_menu_mark\fP with +a non-\fBNULL\fP menu argument will change this default. +.PP +The function \fBmenu_mark\fP returns the menu's mark string (or \fBNULL\fP if +there is none). +.SH RETURN VALUE +The function \fBmenu_mark\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +The function \fBset_menu_mark\fP may return the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_new.3x b/contrib/ncurses/man/menu_new.3x new file mode 100644 index 00000000..1a133745 --- /dev/null +++ b/contrib/ncurses/man/menu_new.3x @@ -0,0 +1,81 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_new.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH menu_new 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBnew_menu\fP, +\fBfree_menu\fP \- +create and destroy menus +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBMENU *new_menu(ITEM **\fIitems\fP); +\fBint free_menu(MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +The function \fBnew_menu\fP creates a new menu connected to a specified item +pointer array (which must be \fBNULL\fP-terminated). +.PP +The function \fBfree_menu\fP disconnects \fImenu\fP from its item array +and frees the storage allocated for the menu. +.SH RETURN VALUE +The function \fBnew_menu\fP returns \fBNULL\fP on error. +It sets \fBerrno\fP according to the function's failure: +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred, e.g., malloc failure. +.PP +The function \fBfree_menu\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_POSTED +The menu has already been posted. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_opts.3x b/contrib/ncurses/man/menu_opts.3x new file mode 100644 index 00000000..ad7fe97f --- /dev/null +++ b/contrib/ncurses/man/menu_opts.3x @@ -0,0 +1,106 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2016 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_opts.3x,v 1.35 2024/03/16 15:35:01 tom Exp $ +.TH menu_opts 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_opts\fP, +\fBmenu_opts_on\fP, +\fBmenu_opts_off\fP, +\fBmenu_opts\fP \- +set and get menu options +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_opts(MENU *\fImenu\fP, Menu_Options \fIopts\fP); +\fBMenu_Options menu_opts(const MENU *\fImenu\fP); +.PP +\fBint menu_opts_on(MENU *\fImenu\fP, Menu_Options \fIopts\fP); +\fBint menu_opts_off(MENU *\fImenu\fP, Menu_Options \fIopts\fP); +.fi +.SH DESCRIPTION +The function \fBset_menu_opts\fP sets all the given menu's option bits (menu +option bits may be logically-OR'ed together). +.PP +The function \fBmenu_opts_on\fP turns on the given option bits, and leaves +others alone. +.PP +The function \fBmenu_opts_off\fP turns off the given option bits, and leaves +others alone. +.PP +The function \fBmenu_opts\fP returns the menu's current option bits. +.PP +The following options are defined (all are on by default): +.TP 5 +O_ONEVALUE +Only one item can be selected for this menu. +.TP 5 +O_SHOWDESC +Display the item descriptions when the menu is posted. +.TP 5 +O_ROWMAJOR +Display the menu in row-major order. +.TP 5 +O_IGNORECASE +Ignore the case when pattern-matching. +.TP 5 +O_SHOWMATCH +Move the cursor to within the item name while pattern-matching. +.TP 5 +O_NONCYCLIC +Don't wrap around next-item and previous-item, +requests to the other end of the menu. +.TP 5 +O_MOUSE_MENU +If user clicks with the mouse +and it does not fall on the currently active menu, +push \fBKEY_MOUSE\fP and the \fBMEVENT\fP data +back on the queue to allow processing in another part of the calling program. +.SH RETURN VALUE +Except for \fBmenu_opts\fP, each routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_POSTED +The menu is already posted. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_pattern.3x b/contrib/ncurses/man/menu_pattern.3x new file mode 100644 index 00000000..a66a368d --- /dev/null +++ b/contrib/ncurses/man/menu_pattern.3x @@ -0,0 +1,91 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_pattern.3x,v 1.38 2024/03/16 15:35:01 tom Exp $ +.TH menu_pattern 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_pattern\fP, +\fBmenu_pattern\fP \- +set and get a menu's pattern buffer +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_pattern(MENU *\fImenu\fP, const char *\fIpattern\fP); +\fBchar *menu_pattern(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +Every menu has an associated pattern match buffer. +As input events that are +printable characters come in, they are appended to this match buffer +and tested for a match, as described in \fBmenu_driver\fP(3X). +.PP +The function \fBset_menu_pattern\fP sets the pattern buffer for the given menu +and tries to find the first matching item. +If it succeeds, that item becomes +current; if not, the current item does not change. +.PP +The function \fBmenu_pattern\fP returns the pattern buffer of the given +\fImenu\fP. +.SH RETURN VALUE +The function \fBmenu_pattern\fP returns a pointer, +which is \fBNULL\fP if the \fImenu\fP parameter is \fBNULL\fP. +Otherwise, it is a pointer to a string which is empty +if no pattern has been set. +It does not set \fBerrno\fP. +.PP +The function \fBset_menu_pattern\fP may return the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to menu. +.TP 5 +.B E_NO_MATCH +Character failed to match. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_post.3x b/contrib/ncurses/man/menu_post.3x new file mode 100644 index 00000000..4a0827a1 --- /dev/null +++ b/contrib/ncurses/man/menu_post.3x @@ -0,0 +1,89 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_post.3x,v 1.36 2024/03/16 15:35:01 tom Exp $ +.TH menu_post 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBpost_menu\fP, +\fBunpost_menu\fP \- +write or erase menus from associated subwindows +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint post_menu(MENU *\fImenu\fP); +\fBint unpost_menu(MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +The function \fBpost_menu\fP displays a menu to its associated subwindow. +To +trigger physical display of the subwindow, +use \fBrefresh\fP(3X) or some equivalent +\fBcurses\fP routine (the implicit \fBdoupdate\fP triggered by an \fBcurses\fP +input request will do). +\fBpost_menu\fP resets the selection status of all items. +.PP +The function \fBunpost_menu\fP erases menu from its associated subwindow. +.SH RETURN VALUE +These routines return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_POSTED +The menu has already been posted. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NO_ROOM +Menu is too large for its window. +You should consider using \fBset_menu_format\fP to solve the problem. +.TP 5 +.B E_NOT_POSTED +The menu has not been posted. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_requestname.3x b/contrib/ncurses/man/menu_requestname.3x new file mode 100644 index 00000000..a0363fb2 --- /dev/null +++ b/contrib/ncurses/man/menu_requestname.3x @@ -0,0 +1,67 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_requestname.3x,v 1.33 2024/03/16 15:35:01 tom Exp $ +.TH menu_requestname 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBmenu_request_by_name\fP, +\fBmenu_request_name\fP \- +handle printable menu request names +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBconst char *menu_request_name(int \fIrequest\fP); +\fBint menu_request_by_name(const char *\fIname\fP); +.fi +.SH DESCRIPTION +The function \fBmenu_request_name\fP returns the printable name of a menu +request code. +.br +The function \fBmenu_request_by_name\fP searches in the name-table for a request +with the given name and returns its request code. +Otherwise E_NO_MATCH is returned. +.SH RETURN VALUE +\fBmenu_request_name\fP returns \fBNULL\fP on error +and sets \fBerrno\fP to \fBE_BAD_ARGUMENT\fP. +.br +\fBmenu_request_by_name\fP returns \fBE_NO_MATCH\fP on error. +It does not set \fBerrno\fP. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on +Version 7, BSD or System V implementations. +It is recommended that +any code depending on them be conditioned using NCURSES_VERSION. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_spacing.3x b/contrib/ncurses/man/menu_spacing.3x new file mode 100644 index 00000000..d15e77d5 --- /dev/null +++ b/contrib/ncurses/man/menu_spacing.3x @@ -0,0 +1,94 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_spacing.3x,v 1.37 2024/03/16 15:35:01 tom Exp $ +.TH menu_spacing 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_spacing\fP, +\fBmenu_spacing\fP \- +set and get spacing between menu items. +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_spacing(MENU *\fImenu\fP, + \fBint \fIspc_description\fB,\fR + \fBint \fIspc_rows\fB,\fR + \fBint \fIspc_columns\fB);\fR +\fBint menu_spacing(const MENU *\fImenu\fB,\fR + \fBint* \fIspc_description\fB,\fR + \fBint* \fIspc_rows\fB,\fR + \fBint* \fIspc_columns\fB);\fR +.fi +.SH DESCRIPTION +The function \fBset_menu_spacing\fP sets the spacing information for the menu. +Its parameters provide the description and the size (in rows and columns). +.TP +\fIspc_description\fP +controls the number of spaces +between an item name and an item description. +It must not be larger than \fBTABSIZE\fP. +The menu system puts in the +middle of this spacing area the pad character. +The remaining parts are filled with +spaces. +.TP +\fIspc_rows\fP +controls the number of rows +that are used for an item. +It must not be larger than 3. +The menu system inserts the blank lines between item rows, these lines +will contain the pad character in the appropriate positions. +.TP +\fIspc_columns\fP +controls the number of blanks between columns of items. +It must not be larger than \fBTABSIZE\fP. +A value of 0 for all the spacing values resets them to the default, +which is 1 for all of them. +.PP +The function \fBmenu_spacing\fP returns the spacing information for the menu. +If a pointer is NULL, the corresponding information is simply not returned. +.SH RETURN VALUE +Both routines return \fBE_OK\fP on success. +\fBset_menu_spacing\fP may return +\fBE_POSTED\fP if the menu is posted, or \fBE_BAD_ARGUMENT\fP if one of the +spacing values is out of range. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on +Version 7, BSD or System V implementations. +It is recommended that +any code depending on them be conditioned using NCURSES_VERSION. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_userptr.3x b/contrib/ncurses/man/menu_userptr.3x new file mode 100644 index 00000000..292bbd6b --- /dev/null +++ b/contrib/ncurses/man/menu_userptr.3x @@ -0,0 +1,64 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_userptr.3x,v 1.33 2024/03/16 15:35:01 tom Exp $ +.TH menu_userptr 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_menu_userptr\fP, +\fBmenu_userptr\fP \- +associate application data with a menu item +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_userptr(MENU *\fImenu\fP, void *\fIuserptr\fP); +\fBvoid *menu_userptr(const MENU *\fImenu\fP); +.fi +.SH DESCRIPTION +Every menu and every menu item has a field that can be used to hold +application-specific data (that is, the menu-driver code leaves it alone). +These functions get and set the menu user pointer field. +.SH RETURN VALUE +\fBmenu_userptr\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +\fBset_menu_userptr\fP returns \fBE_OK\fP (success). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.PP +The user pointer is a void pointer. +We chose not to leave it as a char pointer for SVr4 compatibility. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/menu_win.3x b/contrib/ncurses/man/menu_win.3x new file mode 100644 index 00000000..36f6129d --- /dev/null +++ b/contrib/ncurses/man/menu_win.3x @@ -0,0 +1,92 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: menu_win.3x,v 1.32 2024/03/16 15:35:01 tom Exp $ +.TH menu_win 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBmenu_win\fP \- +make and break menu window and subwindow associations +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_menu_win(MENU *\fImenu\fP, WINDOW *\fIwin\fP); +\fBWINDOW *menu_win(const MENU *\fImenu\fP); +.PP +\fBint set_menu_sub(MENU *\fImenu\fP, WINDOW *\fIsub\fP); +\fBWINDOW *menu_sub(const MENU *\fImenu\fP); +.PP +\fBint scale_menu(const MENU *\fImenu\fP, int *\fIrows\fP, int *\fIcolumns\fP); +.fi +.SH DESCRIPTION +Every menu has an associated pair of \fBcurses\fP windows. +The menu window +displays any title and border associated with the window; the menu subwindow +displays the items of the menu that are currently available for selection. +.PP +The first four functions get and set those windows. +It is not necessary to set +either window; by default, the driver code uses \fBstdscr\fP for both. +.PP +In the \fBset_\fP functions, window argument of \fBNULL\fP is treated as though +it were \fBstsdcr\fP. A menu argument of \fBNULL\fP is treated as a request +to change the system default menu window or subwindow. +.PP +The function \fBscale_menu\fP returns the minimum size required for the +subwindow of \fImenu\fP. +.SH RETURN VALUE +Routines that return pointers return \fBNULL\fP on error. +Routines that return +an integer return one of the following error codes: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_POSTED +The menu has already been posted. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_current.3x b/contrib/ncurses/man/mitem_current.3x new file mode 100644 index 00000000..42d36c39 --- /dev/null +++ b/contrib/ncurses/man/mitem_current.3x @@ -0,0 +1,98 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_current.3x,v 1.37 2024/03/16 15:35:01 tom Exp $ +.TH mitem_current 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBmitem_current\fP \- +set and get current_menu_item +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_current_item(MENU *\fImenu\fP, ITEM *\fIitem\fP); +\fBITEM *current_item(const MENU *\fImenu\fP); +.PP +\fBint set_top_row(MENU *\fImenu\fP, int \fIrow\fP); +\fBint top_row(const MENU *\fImenu\fP); +.PP +\fBint item_index(const ITEM *\fIitem\fP); +.fi +.SH DESCRIPTION +The function \fBset_current_item\fP sets the current item (the item on which +the menu cursor is positioned). +\fBcurrent_item\fP returns a pointer to the +current item in the given menu. +.PP +The function \fBset_top_row\fP sets the top row of the menu to show the given +row (the top row is initially 0, and is reset to this value whenever the +\fBO_ROWMAJOR\fP option is toggled). +The item leftmost on the given row +becomes current. +The function \fBtop_row\fP returns the number of the top menu +row being displayed. +.PP +The function \fBitem_index\fP returns the (zero-origin) index of \fIitem\fP in +the menu's item pointer list. +.SH RETURN VALUE +\fBcurrent_item\fP returns a pointer (which may be \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +\fBtop_row\fP and \fBitem_index\fP return \fBERR\fP (the general \fBcurses\fP +error value) if their \fImenu\fP parameter is \fBNULL\fP. +.PP +\fBset_current_item\fP and \fBset_top_row\fP return one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_BAD_STATE +Routine was called from an initialization or termination function. +.TP 5 +.B E_NOT_CONNECTED +No items are connected to the menu. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.PP +The SVr4 menu library documentation specifies the \fBtop_row\fP and +\fBindex_item\fP error value as \-1 (which is the value of \fBERR\fP). +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_name.3x b/contrib/ncurses/man/mitem_name.3x new file mode 100644 index 00000000..3606bb5d --- /dev/null +++ b/contrib/ncurses/man/mitem_name.3x @@ -0,0 +1,59 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_name.3x,v 1.31 2024/03/16 15:35:01 tom Exp $ +.TH mitem_name 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBitem_name\fP, +\fBitem_description\fP \- +get menu item name and description fields +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBconst char *item_name(const ITEM *\fIitem\fP); +\fBconst char *item_description(const ITEM *\fIitem\fP); +.fi +.SH DESCRIPTION +The function \fBitem_name\fP returns the name part of the given item. +.br +The function \fBitem_description\fP returns the description part of the given +item. +.SH RETURN VALUE +These routines return a pointer (which may be \fBNULL\fP). +They do not set \fBerrno\fP. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_new.3x b/contrib/ncurses/man/mitem_new.3x new file mode 100644 index 00000000..66bd29bc --- /dev/null +++ b/contrib/ncurses/man/mitem_new.3x @@ -0,0 +1,89 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_new.3x,v 1.36 2024/03/16 15:35:01 tom Exp $ +.TH mitem_new 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBnew_item\fP, +\fBfree_item\fP \- +create and destroy menu items +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBITEM *new_item(const char *\fIname\fP, const char *\fIdescription\fP); +\fBint free_item(ITEM *\fIitem\fP); +.fi +.SH DESCRIPTION +The function \fBnew_item\fP allocates a new item and initializes it from the +\fBname\fP and \fBdescription\fP pointers. +Please notice that the item stores +only the pointers to the name and description. +Those pointers must be valid +during the lifetime of the item. +So you should be very careful with names +or descriptions allocated on the stack of some routines. +.br +The function \fBfree_item\fP de-allocates an item. +Please notice that it +is the responsibility of the application to release the memory for the +name or the description of the item. +.SH RETURN VALUE +The function \fBnew_item\fP returns \fBNULL\fP on error. +It sets \fBerrno\fP according to the function's failure: +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred, e.g., malloc failure. +.PP +The function \fBfree_item\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_BAD_ARGUMENT +Routine detected an incorrect or out-of-range argument. +.TP 5 +.B E_CONNECTED +Item is connected to a menu. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_opts.3x b/contrib/ncurses/man/mitem_opts.3x new file mode 100644 index 00000000..5a86516f --- /dev/null +++ b/contrib/ncurses/man/mitem_opts.3x @@ -0,0 +1,81 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_opts.3x,v 1.33 2024/03/16 15:35:01 tom Exp $ +.TH mitem_opts 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_item_opts\fP, +\fBitem_opts_on\fP, +\fBitem_opts_off\fP, +\fBitem_opts\fP \- +set and get menu item options +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_item_opts(ITEM *\fIitem\fP, Item_Options \fIopts\fP); +\fBItem_Options item_opts(const ITEM *\fIitem\fP); +.PP +\fBint item_opts_on(ITEM *\fIitem\fP, Item_Options \fIopts\fP); +\fBint item_opts_off(ITEM *\fIitem\fP, Item_Options \fIopts\fP); +.fi +.SH DESCRIPTION +The function \fBset_item_opts\fP sets all the given item's option bits (menu +option bits may be logically-OR'ed together). +.PP +The function \fBitem_opts_on\fP turns on the given option bits, and leaves +others alone. +.PP +The function \fBitem_opts_off\fP turns off the given option bits, and leaves +others alone. +.PP +The function \fBitem_opts\fP returns the item's current option bits. +.PP +There is only one defined option bit mask, \fBO_SELECTABLE\fP. When this is +on, the item may be selected during menu processing. +This option defaults +to on. +.SH RETURN VALUE +Except for \fBitem_opts\fP, each routine returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_userptr.3x b/contrib/ncurses/man/mitem_userptr.3x new file mode 100644 index 00000000..f0eab8bd --- /dev/null +++ b/contrib/ncurses/man/mitem_userptr.3x @@ -0,0 +1,65 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_userptr.3x,v 1.34 2024/03/16 15:35:01 tom Exp $ +.TH mitem_userptr 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_item_userptr\fP, +\fBitem_userptr\fP \- +associate application data with a menu item +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_item_userptr(ITEM *\fIitem\fP, void *\fIuserptr\fP); +\fBvoid *item_userptr(const ITEM *\fIitem\fP); +.fi +.SH DESCRIPTION +Every menu item has a field that can be used to hold application-specific data +(that is, the menu-driver code leaves it alone). +These functions get and set +that field. +.SH RETURN VALUE +The function \fBitem_userptr\fP returns a pointer (possibly \fBNULL\fP). +It does not set \fBerrno\fP. +.PP +The \fBset_item_userptr\fP always returns \fBE_OK\fP (success). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.PP +The user pointer is a void pointer. +We chose not to leave it as a char pointer for SVr4 compatibility. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_value.3x b/contrib/ncurses/man/mitem_value.3x new file mode 100644 index 00000000..daa383da --- /dev/null +++ b/contrib/ncurses/man/mitem_value.3x @@ -0,0 +1,72 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_value.3x,v 1.32 2024/03/16 15:35:01 tom Exp $ +.TH mitem_value 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBset_item_value\fP, +\fBitem_value\fP \- +set and get menu item values +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint set_item_value(ITEM *\fIitem\fP, bool \fIvalue\fP); +\fBbool item_value(const ITEM *\fIitem\fP); +.fi +.SH DESCRIPTION +If you turn off the menu option \fBO_ONEVALUE\fP (e.g., with +\fBset_menu_opts\fP or \fBmenu_opts_off\fP; see \fBmenu_opts\fP(3X)), the menu +becomes multi-valued; that is, more than one item may simultaneously be +selected. +.PP +In a multi_valued menu, you can used \fBset_item_value\fP to select the +given menu item (second argument \fBTRUE\fP) or deselect it (second argument +\fBFALSE\fP). +.SH RETURN VALUE +The function \fBset_item_value\fP returns one of the following: +.TP 5 +.B E_OK +The routine succeeded. +.TP 5 +.B E_SYSTEM_ERROR +System error occurred (see \fBerrno\fP(3)). +.TP 5 +.B E_REQUEST_DENIED +The menu driver could not process the request. +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/mitem_visible.3x b/contrib/ncurses/man/mitem_visible.3x new file mode 100644 index 00000000..c28c603f --- /dev/null +++ b/contrib/ncurses/man/mitem_visible.3x @@ -0,0 +1,54 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998,2010 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: mitem_visible.3x,v 1.27 2024/03/16 15:35:01 tom Exp $ +.TH mitem_visible 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fBitem_visible\fP \- +check visibility of a menu item +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBbool item_visible(const ITEM *\fIitem\fP); +.fi +.SH DESCRIPTION +A menu item is visible when it is in the portion of a posted menu that +is mapped onto the screen (if the menu is scrollable, in particular, this +portion will be smaller than the whole menu). +.SH PORTABILITY +These routines emulate the System V menu library. +They were not supported on +Version 7 or BSD versions. +.SH AUTHORS +Juergen Pfeifer. +Manual pages and adaptation for new curses by Eric S. Raymond. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%menu\fP(3X) diff --git a/contrib/ncurses/man/ncurses.3x b/contrib/ncurses/man/ncurses.3x new file mode 100644 index 00000000..cb0784ba --- /dev/null +++ b/contrib/ncurses/man/ncurses.3x @@ -0,0 +1,2359 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: ncurses.3x,v 1.233 2024/09/21 18:02:58 tom Exp $ +.TH ncurses 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.\" Add supplementary paragraph tag on its own line after TP. +.\" Adapted from TQ (which would produce mandoc warnings). +.de tQ +. br +. ns +. TP +.. +. +.SH NAME +\fB\%ncurses\fP \- +character-cell terminal interface with optimized output +.SH SYNOPSIS +.nf +\fB#include +.fi +.SH DESCRIPTION +The \*(``new curses\*('' library offers the programmer a +terminal-independent means of reading keyboard and mouse input and +writing to character-cell displays with output optimized to minimize +screen updates. +.I \%ncurses +replaces the +.I curses +libraries from +System V Release 4 Unix (\*(``SVr4\*('') +and +4.4BSD Unix, +the development of which ceased in the 1990s. +This document describes +.I \%ncurses +version @NCURSES_MAJOR@.@NCURSES_MINOR@ +(patch @NCURSES_PATCH@). +.PP +.I \%ncurses +permits control of the terminal screen's contents; +abstraction and subdivision thereof with +.I windows +and +.IR pads ; +acquisition of keyboard and mouse events; +selection of color and rendering attributes +(such as bold or underline); +the definition and use of +.I "soft label" +keys; +access to the +.I \%term\%info +terminal capability database; +a +.I termcap +compatibility interface; +and an abstraction of the system's API for manipulating the terminal +(such as \fI\%termios\fP(3)). +.PP +.I \%ncurses +implements the interface described by X/Open Curses Issue\ 7. +In many behavioral details not standardized by X/Open, +.I \%ncurses +emulates the +.I curses +library of SVr4 and provides numerous useful extensions. +.PP +.I \%ncurses +man pages employ several sections to clarify matters of usage and +interoperability with other +.I curses +implementations. +.bP +\*(``NOTES\*('' describes issues and caveats of which any user of the +.I \%ncurses +API should be aware, +such as limitations on the size of an underlying integral type or the +availability of a preprocessor macro exclusive of a function definition +(which prevents its address from being taken). +This section also describes implementation details +of significance to the programmer but which are not standardized. +.bP +\*(``EXTENSIONS\*('' presents +.I \%ncurses +innovations beyond the X/Open Curses standard and/or the SVr4 +.I curses +implementation. +They are termed +.I extensions +to indicate that they cannot be implemented solely by using the library +API, +but require access to the library's internal state. +.bP +\*(``PORTABILITY\*('' discusses matters +(beyond the exercise of extensions) +that should be considered when writing to a +.I curses +standard, +or for multiple implementations. +.bP +\*(``HISTORY\*('' examines points of detail in +.I \%ncurses +and other +.I curses +implementations over the decades of their development, +particularly where precedent or inertia have frustrated better design +(and, +in a few cases, +where such inertia has been overcome). +.PP +A +.I curses +application must be linked with the library; +use the +.B \-lncurses +option to your compiler or linker. +A debugging version of the library may be available; +if so, +link with it using +.BR \-lncurses_g . +(Your system integrator may have installed these libraries such that you +can use the options +.B \-lcurses +and +.BR \-lcurses_g , +respectively.) +The +.I \%ncurses_g +library logs events describing +.I \%ncurses +actions +to a file called +.I \%trace +in the current directory. +See section \*(``ALTERNATE CONFIGURATIONS\*('' below. +.SS "Application Structure" +A +.I curses +application uses information from the system locale; +\fI\%setlocale\fP(3) prepares it for +.I curses +library calls. +.PP +.RS 4 +.EX +setlocale(LC_ALL, ""); +.EE +.RE +.PP +If the locale is not thus initialized, +the library assumes that characters are printable as in ISO\ 8859-1, +to work with certain legacy programs. +You should initialize the locale; +do not expect consistent behavior from the library when the locale has +not been set up. +.PP +\fB\%initscr\fP(3X) or \fB\%newterm\fP(3X) +must be called to initialize +.I curses +before use of any functions +that access or manipulate windows or screens. +.PP +To get character-at-a-time input without echoing\(emmost interactive, +screen-oriented programs want this\(emuse the following sequence. +.PP +.RS 4 +.EX +initscr(); cbreak(); noecho(); +.EE +.RE +.PP +Most applications would perform further setup as follows. +.PP +.RS 4 +.EX +noqiflush(); +keypad(stdscr, TRUE); +.EE +.RE +.PP +A +.I curses +program then often enters an event loop of some sort. +Call \fB\%endwin\fP(3X) before exiting. +.SS Overview +A +.I curses +library abstracts the terminal with a +.I \%SCREEN +data structure, +and represents all or part of its display +with +.I \%WINDOW +structures. +Distinct properties apply to each; +for example, +the +.I "line discipline" +of a typical Unix terminal driver +is in one of three modes: +raw, +\%cbreak, +or normal (\*(``cooked\*(''). +In +.IR curses "," +the line discipline is a property of the screen, +applying identically to all windows associated with it. +.PP +A +.I window +is a rectangular grid of character cells, +addressed by line and column coordinates +.RI ( y , +.IR x ), +with the upper left corner as (0, 0). +A window called +.BR \%stdscr , +the same size as the terminal screen, +is always available. +Create others with \fB\%newwin\fP(3X). +.PP +A +.I curses +library does not manage overlapping windows +(but see below). +You can either use +.B \%stdscr +to manage one screen-filling window, +or tile the screen into non-overlapping windows and not use +.B \%stdscr +at all. +Mixing the two approaches will result in unpredictable and undesired +effects. +.PP +Functions permit manipulation of a window and the +.I cursor +identifying the cell within it at which the next operation will occur. +Among those, +the most basic are \fB\%move\fP(3X) and \fB\%addch\fP(3X): +these place the cursor within and write a character to +.BR \%stdscr , +respectively. +.PP +Frequent changes to the terminal screen can cause unpleasant flicker or +inefficient use of the communication channel to the device, +so as a rule the library does not update it automatically. +Therefore, +after using +.I curses +functions to accumulate a set of desired updates that make sense to +present together, +call \fB\%refresh\fP(3X) to tell the library to make the user's screen +look like \fBstdscr\fP. +The library +.\" X/Open Curses Issue 7 assumes some optimization will be done, but +.\" does not mandate it in any way. +.I optimizes +its output by computing a minimal volume of operations to mutate the +screen from its state at the previous refresh to the new one. +Effective optimization demands accurate information about the terminal +device: +the management of such information is the province of the +\fB\%terminfo\fP(3X) API, +a feature of every standard +.I curses +implementation. +.PP +Special windows called +.I pads +may also be manipulated. +These are not constrained to the size of the terminal screen and their +contents need not be completely displayed. +See \fB\%curs_pad\fP(3X). +.PP +Many terminals support configuration of character cell foreground and +background colors as well as +.IR attributes "," +which cause characters to render in such modes as +boldfaced, +underlined, +or in reverse video. +See \fB\%curs_attr\fP(3X). +.PP +.I curses +predefines constants for a small set of forms-drawing graphics +corresponding to the DEC Alternate Character Set (ACS), +a feature of VT100 and other terminals. +See \fB\%addch\fP(3X). +.PP +.I curses +is implemented using the operating system's terminal driver; +key events are received not as scan codes but as byte sequences. +The driver reports graphical keycaps +(alphanumeric and punctuation keys, +and the space) +as-is. +Everything else, +including the tab, +enter/return, +keypad, +arrow, +and function keys, +appears to +.I curses +as a control character or a multibyte +.I "escape sequence." +.I curses +can translate the latter into unique +.I "key codes." +See \fB\%keypad\fP(3X) and \fB\%getch\fP(3X). +.PP +.I \%ncurses +provides reimplementations of the SVr4 \fBpanel\fP(3X), \fBform\fP(3X), +and \fBmenu\fP(3X) libraries; +they permit overlapping windows and ease construction of user interfaces +with +.IR curses . +.SS "Initialization" +The selection of an appropriate value of +.I TERM +in the process environment is essential to correct +.I curses +and +.I \%term\%info +library operation. +A well-configured system selects a correct +.I TERM +value automatically; +\fB\%tset\fP(1) may assist with troubleshooting exotic situations. +.PP +If you change the terminal type, +export the shell's +.I TERM +variable, +then run \fB\%tset\fP(1) or the +.RB \*(`` "@TPUT@ init" \*('' +command. +See subsection \*(``Tabs and Initialization\*('' of \fB\%terminfo\fP(5). +.PP +If the environment variables +.I \%LINES +and +.I \%COLUMNS +are set, +or if the +.I curses +program is executing in a graphical windowing environment, +the information obtained thence overrides that obtained by +.IR \%term\%info . +An +.I \%ncurses +extension supports resizable terminals; +see \fB\%wresize\fP(3X). +.PP +If the environment variable +.I \%TERMINFO +is defined, +a +.I curses +program checks first for a terminal type description in the location it +identifies. +.I \%TERMINFO +is useful for developing type descriptions or when write permission to +.I \%@TERMINFO@ +is not available. +.PP +See section \*(``ENVIRONMENT\*('' below. +.SS "Naming Conventions" +.I curses +offers many functions in variant forms using a regular set of +alternatives to the name of an elemental one. +Those prefixed with \*(``w\*('' require a +.I \%WINDOW +pointer argument; +those with a \*(``mv\*('' prefix first perform cursor movement using +\fB\%wmove\fP(3X); +a \*(``mvw\*('' prefix indicates both. +The \*(``w\*('' function is typically the elemental one; +the removal of this prefix usually indicates operation on +.BR \%stdscr . +.PP +Four functions prefixed with \*(``p\*('' require a +.I pad +argument; +see below. +.PP +In function synopses, +.I \%ncurses +man pages apply the following names to parameters. +We introduce the character types in the next subsection. +.PP +.TS +center; +Li L. +bf a \fIbool\fP (\fBTRUE\fP or \fBFALSE\fP) +c a \fIchar\fP or \fIint\fP +ch a \fIchtype\fP +wc a \fIwchar_t\fP or \fIwint_t\fP +wch a \fIcchar_t\fP +win pointer to a \fIWINDOW\fP +pad pointer to a \fIWINDOW\fP that is a pad +.TE +.SS "Wide and Non-wide Character Configurations" +This man page primarily surveys functions that appear in any +configuration of the library. +There are two common configurations; +see section \*(``ALTERNATE CONFIGURATIONS\*('' below. +.TP 10 \" "ncursesw" + 2n +.I \%ncurses +is the library in its \*(``non-wide\*('' configuration, +handling only eight-bit characters. +It stores a character combined with attributes +and a color pair identifier +in a +.I \%chtype +datum, +which is often an alias of +.IR int . +A string of +.I curses +characters is similar to a C +.I char +string; +a +.I chtype +string ends with an integral +.BR 0 "," +the null +.I curses +character. +.IP +Attributes and a color pair identifier +(with no corresponding character) +can be stored in variables of +.I \%chtype +or +.I \%attr_t +type. +In either case, +they are accessed via an integral bit mask. +.IP +Each cell of a +.I \%WINDOW +is stored as a +.IR \%chtype . +X/Open Curses does not specify the sizes of the character code or +color pair identifier, +nor the quantity of attribute bits, +in +.IR chtype ";" +these are implementation-dependent. +.I \%ncurses +uses eight bits for the character code. +An application requiring a wider character type, +for instance to represent Unicode, +should use the wide-character API. +.TP 10 +.I \%ncursesw +is the library in its \*(``wide\*('' configuration, +which handles character encodings requiring a larger data type than +.I \%char +(a byte-sized type) +can represent. +It provides additional functions that complement those in +the non-wide library where the size of the underlying character type is +significant. +A somewhat regular naming convention relates many of the wide variants +to their non-wide counterparts; +where a non-wide function name contains \*(``ch\*('' or \*(``str\*('', +prefix it with \*(``_w\*('' to obtain the wide counterpart. +For example, +\fB\%waddch\fP becomes \fB\%wadd_wch\fP. +Another exception is +.B \%ins_nwstr +(and its variants), +spelled thus instead of \*(``insn_wstr\*(''. +(Exceptions that add only \*(``w\*('' comprise +.BR \%addwstr , +.BR \%inwstr , +and their variants.) +.\" This is because they operate on "plain" wide-character strings +.\" (`wchar_t*`) and not curses complex character strings (`cchar_t*`). +.\" SVID 4 did specify functions like `addwch()` and `inswch()` that +.\" operated on `chtype`s assuming that they were wide enough for a +.\" `wchar_t` plus attribute and color pair bits; X/Open Curses did not +.\" standardize these. +.IP +This convention is inapplicable to some non-wide function names, +so other transformations are used for the wide configuration: +the window background management function \*(``bkgd\*('' becomes +\*(``bkgrnd\*(''; +the window border-drawing and -clearing functions are suffixed with +\*(``_set\*(''; +and character attribute manipulation functions like +\*(``attron\*('' become \*(``attr_on\*(''. +.RS 10 \" same as foregoing tag width +.TP 9 \" "cchar_t" + 2n +.I \%cchar_t +is a +.I "curses complex character" +and corresponds to the non-wide configuration's +.IR \%chtype . +It is a structure type +because it requires more storage than a standard scalar type offers. +A character code may not be representable as a +.IR \%char , +and moreover more than one character may occupy a cell +(as with accent marks and other diacritics). +Each character is of type +.IR \%wchar_t ; +a complex character contains one spacing character and zero or more +non-spacing characters +(see below). +A string of complex characters ends with a +.I \%cchar_t +whose +.I \%wchar_t +member is the null wide character. +Attributes and a color pair identifier are stored in separate fields of +the structure, +not combined into an integer as in +.IR \%chtype . +.PP +Each cell of a +.I \%WINDOW +is stored as a +.IR \%cchar_t . +\fB\%setcchar\fP(3X) and \fB\%getcchar\fP(3X) +store and retrieve +.I \%cchar_t +data. +.PP +The wide library API of +.I \%ncurses +depends on two data types standardized by ISO C95. +.TP 9 +.I \%wchar_t +stores a wide character. +Like +.IR \%chtype , +it may be an alias of +.IR int . +Depending on the character encoding, +a wide character may be +.IR spacing , +meaning that it occupies a character cell by itself and typically +accompanies cursor advancement, +or +.IR non-spacing , +meaning that it occupies the same cell as a spacing character, +is often regarded as a \*(``modifier\*('' of the base glyph with which +it combines, +and typically does not advance the cursor. +.TP 9 +.I \%wint_t +can store a +.I \%wchar_t +or the constant +.IR \%WEOF , +analogously to the +.IR int -sized +character manipulation functions of ISO C and its constant +.IR \%EOF . +.RE +.\" +.SS "Function Name Index" +The following table lists the +.I curses +functions provided in the non-wide and wide APIs and the corresponding +man pages that describe them. +Those flagged with \*(``*\*('' +are +.IR \%ncurses "-specific," +neither described by X/Open Curses nor present in SVr4. +.PP +.TS +center tab(/); +l l . +\f(BIcurses\fP Function Name/Man Page +_ +COLOR_PAIR/\fBcurs_color\fP(3X) +PAIR_NUMBER/\fBcurs_color\fP(3X) +add_wch/\fBcurs_add_wch\fP(3X) +add_wchnstr/\fBcurs_add_wchstr\fP(3X) +add_wchstr/\fBcurs_add_wchstr\fP(3X) +addch/\fBcurs_addch\fP(3X) +addchnstr/\fBcurs_addchstr\fP(3X) +addchstr/\fBcurs_addchstr\fP(3X) +addnstr/\fBcurs_addstr\fP(3X) +addnwstr/\fBcurs_addwstr\fP(3X) +addstr/\fBcurs_addstr\fP(3X) +addwstr/\fBcurs_addwstr\fP(3X) +alloc_pair/\fBnew_pair\fP(3X)* +assume_default_colors/\fBdefault_colors\fP(3X)* +attr_get/\fBcurs_attr\fP(3X) +attr_off/\fBcurs_attr\fP(3X) +attr_on/\fBcurs_attr\fP(3X) +attr_set/\fBcurs_attr\fP(3X) +attroff/\fBcurs_attr\fP(3X) +attron/\fBcurs_attr\fP(3X) +attrset/\fBcurs_attr\fP(3X) +baudrate/\fBcurs_termattrs\fP(3X) +beep/\fBcurs_beep\fP(3X) +bkgd/\fBcurs_bkgd\fP(3X) +bkgdset/\fBcurs_bkgd\fP(3X) +bkgrnd/\fBcurs_bkgrnd\fP(3X) +bkgrndset/\fBcurs_bkgrnd\fP(3X) +border/\fBcurs_border\fP(3X) +border_set/\fBcurs_border_set\fP(3X) +box/\fBcurs_border\fP(3X) +box_set/\fBcurs_border_set\fP(3X) +can_change_color/\fBcurs_color\fP(3X) +cbreak/\fBcurs_inopts\fP(3X) +chgat/\fBcurs_attr\fP(3X) +clear/\fBcurs_clear\fP(3X) +clearok/\fBcurs_outopts\fP(3X) +clrtobot/\fBcurs_clear\fP(3X) +clrtoeol/\fBcurs_clear\fP(3X) +color_content/\fBcurs_color\fP(3X) +color_set/\fBcurs_attr\fP(3X) +copywin/\fBcurs_overlay\fP(3X) +curs_set/\fBcurs_kernel\fP(3X) +curses_trace/\fBcurs_trace\fP(3X)* +curses_version/\fBcurs_extend\fP(3X)* +def_prog_mode/\fBcurs_kernel\fP(3X) +def_shell_mode/\fBcurs_kernel\fP(3X) +define_key/\fBdefine_key\fP(3X)* +del_curterm/\fBcurs_terminfo\fP(3X) +delay_output/\fBcurs_util\fP(3X) +delch/\fBcurs_delch\fP(3X) +deleteln/\fBcurs_deleteln\fP(3X) +delscreen/\fBcurs_initscr\fP(3X) +delwin/\fBcurs_window\fP(3X) +derwin/\fBcurs_window\fP(3X) +doupdate/\fBcurs_refresh\fP(3X) +dupwin/\fBcurs_window\fP(3X) +echo/\fBcurs_inopts\fP(3X) +echo_wchar/\fBcurs_add_wch\fP(3X) +echochar/\fBcurs_addch\fP(3X) +endwin/\fBcurs_initscr\fP(3X) +erase/\fBcurs_clear\fP(3X) +erasechar/\fBcurs_termattrs\fP(3X) +erasewchar/\fBcurs_termattrs\fP(3X) +exit_curses/\fBcurs_memleaks\fP(3X)* +exit_terminfo/\fBcurs_memleaks\fP(3X)* +extended_color_content/\fBcurs_color\fP(3X)* +extended_pair_content/\fBcurs_color\fP(3X)* +extended_slk_color/\fBcurs_slk\fP(3X)* +filter/\fBcurs_util\fP(3X) +find_pair/\fBnew_pair\fP(3X)* +flash/\fBcurs_beep\fP(3X) +flushinp/\fBcurs_util\fP(3X) +free_pair/\fBnew_pair\fP(3X)* +get_escdelay/\fBcurs_threads\fP(3X)* +get_wch/\fBcurs_get_wch\fP(3X) +get_wstr/\fBcurs_get_wstr\fP(3X) +getattrs/\fBcurs_attr\fP(3X) +getbegx/\fBcurs_legacy\fP(3X)* +getbegy/\fBcurs_legacy\fP(3X)* +getbegyx/\fBcurs_getyx\fP(3X) +getbkgd/\fBcurs_bkgd\fP(3X) +getbkgrnd/\fBcurs_bkgrnd\fP(3X) +getcchar/\fBcurs_getcchar\fP(3X) +getch/\fBcurs_getch\fP(3X) +getcurx/\fBcurs_legacy\fP(3X)* +getcury/\fBcurs_legacy\fP(3X)* +getmaxx/\fBcurs_legacy\fP(3X)* +getmaxy/\fBcurs_legacy\fP(3X)* +getmaxyx/\fBcurs_getyx\fP(3X) +getmouse/\fBcurs_mouse\fP(3X)* +getn_wstr/\fBcurs_get_wstr\fP(3X) +getnstr/\fBcurs_getstr\fP(3X) +getparx/\fBcurs_legacy\fP(3X)* +getpary/\fBcurs_legacy\fP(3X)* +getparyx/\fBcurs_getyx\fP(3X) +getstr/\fBcurs_getstr\fP(3X) +getsyx/\fBcurs_kernel\fP(3X) +getwin/\fBcurs_util\fP(3X) +getyx/\fBcurs_getyx\fP(3X) +halfdelay/\fBcurs_inopts\fP(3X) +has_colors/\fBcurs_color\fP(3X) +has_ic/\fBcurs_termattrs\fP(3X) +has_il/\fBcurs_termattrs\fP(3X) +has_key/\fBcurs_getch\fP(3X)* +has_mouse/\fBcurs_mouse\fP(3X)* +hline/\fBcurs_border\fP(3X) +hline_set/\fBcurs_border_set\fP(3X) +idcok/\fBcurs_outopts\fP(3X) +idlok/\fBcurs_outopts\fP(3X) +immedok/\fBcurs_outopts\fP(3X) +in_wch/\fBcurs_in_wch\fP(3X) +in_wchnstr/\fBcurs_in_wchstr\fP(3X) +in_wchstr/\fBcurs_in_wchstr\fP(3X) +inch/\fBcurs_inch\fP(3X) +inchnstr/\fBcurs_inchstr\fP(3X) +inchstr/\fBcurs_inchstr\fP(3X) +init_color/\fBcurs_color\fP(3X) +init_extended_color/\fBcurs_color\fP(3X)* +init_extended_pair/\fBcurs_color\fP(3X)* +init_pair/\fBcurs_color\fP(3X) +initscr/\fBcurs_initscr\fP(3X) +innstr/\fBcurs_instr\fP(3X) +innwstr/\fBcurs_inwstr\fP(3X) +ins_nwstr/\fBcurs_ins_wstr\fP(3X) +ins_wch/\fBcurs_ins_wch\fP(3X) +ins_wstr/\fBcurs_ins_wstr\fP(3X) +insch/\fBcurs_insch\fP(3X) +insdelln/\fBcurs_deleteln\fP(3X) +insertln/\fBcurs_deleteln\fP(3X) +insnstr/\fBcurs_insstr\fP(3X) +insstr/\fBcurs_insstr\fP(3X) +instr/\fBcurs_instr\fP(3X) +intrflush/\fBcurs_inopts\fP(3X) +inwstr/\fBcurs_inwstr\fP(3X) +is_cbreak/\fBcurs_inopts\fP(3X)* +is_cleared/\fBcurs_opaque\fP(3X)* +is_echo/\fBcurs_inopts\fP(3X)* +is_idcok/\fBcurs_opaque\fP(3X)* +is_idlok/\fBcurs_opaque\fP(3X)* +is_immedok/\fBcurs_opaque\fP(3X)* +is_keypad/\fBcurs_opaque\fP(3X)* +is_leaveok/\fBcurs_opaque\fP(3X)* +is_linetouched/\fBcurs_touch\fP(3X) +is_nl/\fBcurs_inopts\fP(3X)* +is_nodelay/\fBcurs_opaque\fP(3X)* +is_notimeout/\fBcurs_opaque\fP(3X)* +is_pad/\fBcurs_opaque\fP(3X)* +is_raw/\fBcurs_inopts\fP(3X)* +is_scrollok/\fBcurs_opaque\fP(3X)* +is_subwin/\fBcurs_opaque\fP(3X)* +is_syncok/\fBcurs_opaque\fP(3X)* +is_term_resized/\fBresizeterm\fP(3X)* +is_wintouched/\fBcurs_touch\fP(3X) +isendwin/\fBcurs_initscr\fP(3X) +key_defined/\fBkey_defined\fP(3X)* +key_name/\fBcurs_util\fP(3X) +keybound/\fBkeybound\fP(3X)* +keyname/\fBcurs_util\fP(3X) +keyok/\fBkeyok\fP(3X)* +keypad/\fBcurs_inopts\fP(3X) +killchar/\fBcurs_termattrs\fP(3X) +killwchar/\fBcurs_termattrs\fP(3X) +leaveok/\fBcurs_outopts\fP(3X) +longname/\fBcurs_termattrs\fP(3X) +mcprint/\fBcurs_print\fP(3X)* +meta/\fBcurs_inopts\fP(3X) +mouse_trafo/\fBcurs_mouse\fP(3X)* +mouseinterval/\fBcurs_mouse\fP(3X)* +mousemask/\fBcurs_mouse\fP(3X)* +move/\fBcurs_move\fP(3X) +mvadd_wch/\fBcurs_add_wch\fP(3X) +mvadd_wchnstr/\fBcurs_add_wchstr\fP(3X) +mvadd_wchstr/\fBcurs_add_wchstr\fP(3X) +mvaddch/\fBcurs_addch\fP(3X) +mvaddchnstr/\fBcurs_addchstr\fP(3X) +mvaddchstr/\fBcurs_addchstr\fP(3X) +mvaddnstr/\fBcurs_addstr\fP(3X) +mvaddnwstr/\fBcurs_addwstr\fP(3X) +mvaddstr/\fBcurs_addstr\fP(3X) +mvaddwstr/\fBcurs_addwstr\fP(3X) +mvchgat/\fBcurs_attr\fP(3X) +mvcur/\fBcurs_kernel\fP(3X) +mvdelch/\fBcurs_delch\fP(3X) +mvderwin/\fBcurs_window\fP(3X) +mvget_wch/\fBcurs_get_wch\fP(3X) +mvget_wstr/\fBcurs_get_wstr\fP(3X) +mvgetch/\fBcurs_getch\fP(3X) +mvgetn_wstr/\fBcurs_get_wstr\fP(3X) +mvgetnstr/\fBcurs_getstr\fP(3X) +mvgetstr/\fBcurs_getstr\fP(3X) +mvhline/\fBcurs_border\fP(3X) +mvhline_set/\fBcurs_border_set\fP(3X) +mvin_wch/\fBcurs_in_wch\fP(3X) +mvin_wchnstr/\fBcurs_in_wchstr\fP(3X) +mvin_wchstr/\fBcurs_in_wchstr\fP(3X) +mvinch/\fBcurs_inch\fP(3X) +mvinchnstr/\fBcurs_inchstr\fP(3X) +mvinchstr/\fBcurs_inchstr\fP(3X) +mvinnstr/\fBcurs_instr\fP(3X) +mvinnwstr/\fBcurs_inwstr\fP(3X) +mvins_nwstr/\fBcurs_ins_wstr\fP(3X) +mvins_wch/\fBcurs_ins_wch\fP(3X) +mvins_wstr/\fBcurs_ins_wstr\fP(3X) +mvinsch/\fBcurs_insch\fP(3X) +mvinsnstr/\fBcurs_insstr\fP(3X) +mvinsstr/\fBcurs_insstr\fP(3X) +mvinstr/\fBcurs_instr\fP(3X) +mvinwstr/\fBcurs_inwstr\fP(3X) +mvprintw/\fBcurs_printw\fP(3X) +mvscanw/\fBcurs_scanw\fP(3X) +mvvline/\fBcurs_border\fP(3X) +mvvline_set/\fBcurs_border_set\fP(3X) +mvwadd_wch/\fBcurs_add_wch\fP(3X) +mvwadd_wchnstr/\fBcurs_add_wchstr\fP(3X) +mvwadd_wchstr/\fBcurs_add_wchstr\fP(3X) +mvwaddch/\fBcurs_addch\fP(3X) +mvwaddchnstr/\fBcurs_addchstr\fP(3X) +mvwaddchstr/\fBcurs_addchstr\fP(3X) +mvwaddnstr/\fBcurs_addstr\fP(3X) +mvwaddnwstr/\fBcurs_addwstr\fP(3X) +mvwaddstr/\fBcurs_addstr\fP(3X) +mvwaddwstr/\fBcurs_addwstr\fP(3X) +mvwchgat/\fBcurs_attr\fP(3X) +mvwdelch/\fBcurs_delch\fP(3X) +mvwget_wch/\fBcurs_get_wch\fP(3X) +mvwget_wstr/\fBcurs_get_wstr\fP(3X) +mvwgetch/\fBcurs_getch\fP(3X) +mvwgetn_wstr/\fBcurs_get_wstr\fP(3X) +mvwgetnstr/\fBcurs_getstr\fP(3X) +mvwgetstr/\fBcurs_getstr\fP(3X) +mvwhline/\fBcurs_border\fP(3X) +mvwhline_set/\fBcurs_border_set\fP(3X) +mvwin/\fBcurs_window\fP(3X) +mvwin_wch/\fBcurs_in_wch\fP(3X) +mvwin_wchnstr/\fBcurs_in_wchstr\fP(3X) +mvwin_wchstr/\fBcurs_in_wchstr\fP(3X) +mvwinch/\fBcurs_inch\fP(3X) +mvwinchnstr/\fBcurs_inchstr\fP(3X) +mvwinchstr/\fBcurs_inchstr\fP(3X) +mvwinnstr/\fBcurs_instr\fP(3X) +mvwinnwstr/\fBcurs_inwstr\fP(3X) +mvwins_nwstr/\fBcurs_ins_wstr\fP(3X) +mvwins_wch/\fBcurs_ins_wch\fP(3X) +mvwins_wstr/\fBcurs_ins_wstr\fP(3X) +mvwinsch/\fBcurs_insch\fP(3X) +mvwinsnstr/\fBcurs_insstr\fP(3X) +mvwinsstr/\fBcurs_insstr\fP(3X) +mvwinstr/\fBcurs_instr\fP(3X) +mvwinwstr/\fBcurs_inwstr\fP(3X) +mvwprintw/\fBcurs_printw\fP(3X) +mvwscanw/\fBcurs_scanw\fP(3X) +mvwvline/\fBcurs_border\fP(3X) +mvwvline_set/\fBcurs_border_set\fP(3X) +napms/\fBcurs_kernel\fP(3X) +newpad/\fBcurs_pad\fP(3X) +newterm/\fBcurs_initscr\fP(3X) +newwin/\fBcurs_window\fP(3X) +nl/\fBcurs_inopts\fP(3X) +nocbreak/\fBcurs_inopts\fP(3X) +nodelay/\fBcurs_inopts\fP(3X) +noecho/\fBcurs_inopts\fP(3X) +nofilter/\fBcurs_util\fP(3X)* +nonl/\fBcurs_inopts\fP(3X) +noqiflush/\fBcurs_inopts\fP(3X) +noraw/\fBcurs_inopts\fP(3X) +notimeout/\fBcurs_inopts\fP(3X) +overlay/\fBcurs_overlay\fP(3X) +overwrite/\fBcurs_overlay\fP(3X) +pair_content/\fBcurs_color\fP(3X) +pecho_wchar/\fBcurs_pad\fP(3X) +pechochar/\fBcurs_pad\fP(3X) +pnoutrefresh/\fBcurs_pad\fP(3X) +prefresh/\fBcurs_pad\fP(3X) +printw/\fBcurs_printw\fP(3X) +putp/\fBcurs_terminfo\fP(3X) +putwin/\fBcurs_util\fP(3X) +qiflush/\fBcurs_inopts\fP(3X) +raw/\fBcurs_inopts\fP(3X) +redrawwin/\fBcurs_refresh\fP(3X) +refresh/\fBcurs_refresh\fP(3X) +reset_color_pairs/\fBcurs_color\fP(3X)* +reset_prog_mode/\fBcurs_kernel\fP(3X) +reset_shell_mode/\fBcurs_kernel\fP(3X) +resetty/\fBcurs_kernel\fP(3X) +resize_term/\fBresizeterm\fP(3X)* +resizeterm/\fBresizeterm\fP(3X)* +restartterm/\fBcurs_terminfo\fP(3X) +ripoffline/\fBcurs_kernel\fP(3X) +savetty/\fBcurs_kernel\fP(3X) +scanw/\fBcurs_scanw\fP(3X) +scr_dump/\fBcurs_scr_dump\fP(3X) +scr_init/\fBcurs_scr_dump\fP(3X) +scr_restore/\fBcurs_scr_dump\fP(3X) +scr_set/\fBcurs_scr_dump\fP(3X) +scrl/\fBcurs_scroll\fP(3X) +scroll/\fBcurs_scroll\fP(3X) +scrollok/\fBcurs_outopts\fP(3X) +set_curterm/\fBcurs_terminfo\fP(3X) +set_escdelay/\fBcurs_threads\fP(3X)* +set_tabsize/\fBcurs_threads\fP(3X)* +set_term/\fBcurs_initscr\fP(3X) +setcchar/\fBcurs_getcchar\fP(3X) +setscrreg/\fBcurs_outopts\fP(3X) +setsyx/\fBcurs_kernel\fP(3X) +setupterm/\fBcurs_terminfo\fP(3X) +slk_attr/\fBcurs_slk\fP(3X)* +slk_attr_off/\fBcurs_slk\fP(3X) +slk_attr_on/\fBcurs_slk\fP(3X) +slk_attr_set/\fBcurs_slk\fP(3X) +slk_attroff/\fBcurs_slk\fP(3X) +slk_attron/\fBcurs_slk\fP(3X) +slk_attrset/\fBcurs_slk\fP(3X) +slk_clear/\fBcurs_slk\fP(3X) +slk_color/\fBcurs_slk\fP(3X) +slk_init/\fBcurs_slk\fP(3X) +slk_label/\fBcurs_slk\fP(3X) +slk_noutrefresh/\fBcurs_slk\fP(3X) +slk_refresh/\fBcurs_slk\fP(3X) +slk_restore/\fBcurs_slk\fP(3X) +slk_set/\fBcurs_slk\fP(3X) +slk_touch/\fBcurs_slk\fP(3X) +slk_wset/\fBcurs_slk\fP(3X) +standend/\fBcurs_attr\fP(3X) +standout/\fBcurs_attr\fP(3X) +start_color/\fBcurs_color\fP(3X) +subpad/\fBcurs_pad\fP(3X) +subwin/\fBcurs_window\fP(3X) +syncok/\fBcurs_window\fP(3X) +term_attrs/\fBcurs_termattrs\fP(3X) +termattrs/\fBcurs_termattrs\fP(3X) +termname/\fBcurs_termattrs\fP(3X) +tgetent/\fBcurs_termcap\fP(3X) +tgetflag/\fBcurs_termcap\fP(3X) +tgetnum/\fBcurs_termcap\fP(3X) +tgetstr/\fBcurs_termcap\fP(3X) +tgoto/\fBcurs_termcap\fP(3X) +tigetflag/\fBcurs_terminfo\fP(3X) +tigetnum/\fBcurs_terminfo\fP(3X) +tigetstr/\fBcurs_terminfo\fP(3X) +timeout/\fBcurs_inopts\fP(3X) +tiparm/\fBcurs_terminfo\fP(3X) +tiparm_s/\fBcurs_terminfo\fP(3X)* +tiscan_s/\fBcurs_terminfo\fP(3X)* +touchline/\fBcurs_touch\fP(3X) +touchwin/\fBcurs_touch\fP(3X) +tparm/\fBcurs_terminfo\fP(3X) +tputs/\fBcurs_termcap\fP(3X) +tputs/\fBcurs_terminfo\fP(3X) +trace/\fBcurs_trace\fP(3X)* +typeahead/\fBcurs_inopts\fP(3X) +unctrl/\fBcurs_util\fP(3X) +unget_wch/\fBcurs_get_wch\fP(3X) +ungetch/\fBcurs_getch\fP(3X) +ungetmouse/\fBcurs_mouse\fP(3X)* +untouchwin/\fBcurs_touch\fP(3X) +use_default_colors/\fBdefault_colors\fP(3X)* +use_env/\fBcurs_util\fP(3X) +use_extended_names/\fBcurs_extend\fP(3X)* +use_legacy_coding/\fBlegacy_coding\fP(3X)* +use_screen/\fBcurs_threads\fP(3X)* +use_tioctl/\fBcurs_util\fP(3X)* +use_window/\fBcurs_threads\fP(3X)* +vid_attr/\fBcurs_terminfo\fP(3X) +vid_puts/\fBcurs_terminfo\fP(3X) +vidattr/\fBcurs_terminfo\fP(3X) +vidputs/\fBcurs_terminfo\fP(3X) +vline/\fBcurs_border\fP(3X) +vline_set/\fBcurs_border_set\fP(3X) +vw_printw/\fBcurs_printw\fP(3X) +vw_scanw/\fBcurs_scanw\fP(3X) +vwprintw/\fBcurs_printw\fP(3X) +vwscanw/\fBcurs_scanw\fP(3X) +wadd_wch/\fBcurs_add_wch\fP(3X) +wadd_wchnstr/\fBcurs_add_wchstr\fP(3X) +wadd_wchstr/\fBcurs_add_wchstr\fP(3X) +waddch/\fBcurs_addch\fP(3X) +waddchnstr/\fBcurs_addchstr\fP(3X) +waddchstr/\fBcurs_addchstr\fP(3X) +waddnstr/\fBcurs_addstr\fP(3X) +waddnwstr/\fBcurs_addwstr\fP(3X) +waddstr/\fBcurs_addstr\fP(3X) +waddwstr/\fBcurs_addwstr\fP(3X) +wattr_get/\fBcurs_attr\fP(3X) +wattr_off/\fBcurs_attr\fP(3X) +wattr_on/\fBcurs_attr\fP(3X) +wattr_set/\fBcurs_attr\fP(3X) +wattroff/\fBcurs_attr\fP(3X) +wattron/\fBcurs_attr\fP(3X) +wattrset/\fBcurs_attr\fP(3X) +wbkgd/\fBcurs_bkgd\fP(3X) +wbkgdset/\fBcurs_bkgd\fP(3X) +wbkgrnd/\fBcurs_bkgrnd\fP(3X) +wbkgrndset/\fBcurs_bkgrnd\fP(3X) +wborder/\fBcurs_border\fP(3X) +wborder_set/\fBcurs_border_set\fP(3X) +wchgat/\fBcurs_attr\fP(3X) +wclear/\fBcurs_clear\fP(3X) +wclrtobot/\fBcurs_clear\fP(3X) +wclrtoeol/\fBcurs_clear\fP(3X) +wcolor_set/\fBcurs_attr\fP(3X) +wcursyncup/\fBcurs_window\fP(3X) +wdelch/\fBcurs_delch\fP(3X) +wdeleteln/\fBcurs_deleteln\fP(3X) +wecho_wchar/\fBcurs_add_wch\fP(3X) +wechochar/\fBcurs_addch\fP(3X) +wenclose/\fBcurs_mouse\fP(3X)* +werase/\fBcurs_clear\fP(3X) +wget_wch/\fBcurs_get_wch\fP(3X) +wget_wstr/\fBcurs_get_wstr\fP(3X) +wgetbkgrnd/\fBcurs_bkgrnd\fP(3X) +wgetch/\fBcurs_getch\fP(3X) +wgetdelay/\fBcurs_opaque\fP(3X)* +wgetn_wstr/\fBcurs_get_wstr\fP(3X) +wgetnstr/\fBcurs_getstr\fP(3X) +wgetparent/\fBcurs_opaque\fP(3X)* +wgetscrreg/\fBcurs_opaque\fP(3X)* +wgetstr/\fBcurs_getstr\fP(3X) +whline/\fBcurs_border\fP(3X) +whline_set/\fBcurs_border_set\fP(3X) +win_wch/\fBcurs_in_wch\fP(3X) +win_wchnstr/\fBcurs_in_wchstr\fP(3X) +win_wchstr/\fBcurs_in_wchstr\fP(3X) +winch/\fBcurs_inch\fP(3X) +winchnstr/\fBcurs_inchstr\fP(3X) +winchstr/\fBcurs_inchstr\fP(3X) +winnstr/\fBcurs_instr\fP(3X) +winnwstr/\fBcurs_inwstr\fP(3X) +wins_nwstr/\fBcurs_ins_wstr\fP(3X) +wins_wch/\fBcurs_ins_wch\fP(3X) +wins_wstr/\fBcurs_ins_wstr\fP(3X) +winsch/\fBcurs_insch\fP(3X) +winsdelln/\fBcurs_deleteln\fP(3X) +winsertln/\fBcurs_deleteln\fP(3X) +winsnstr/\fBcurs_insstr\fP(3X) +winsstr/\fBcurs_insstr\fP(3X) +winstr/\fBcurs_instr\fP(3X) +winwstr/\fBcurs_inwstr\fP(3X) +wmouse_trafo/\fBcurs_mouse\fP(3X)* +wmove/\fBcurs_move\fP(3X) +wnoutrefresh/\fBcurs_refresh\fP(3X) +wprintw/\fBcurs_printw\fP(3X) +wredrawln/\fBcurs_refresh\fP(3X) +wrefresh/\fBcurs_refresh\fP(3X) +wresize/\fBwresize\fP(3X)* +wscanw/\fBcurs_scanw\fP(3X) +wscrl/\fBcurs_scroll\fP(3X) +wsetscrreg/\fBcurs_outopts\fP(3X) +wstandend/\fBcurs_attr\fP(3X) +wstandout/\fBcurs_attr\fP(3X) +wsyncdown/\fBcurs_window\fP(3X) +wsyncup/\fBcurs_window\fP(3X) +wtimeout/\fBcurs_inopts\fP(3X) +wtouchln/\fBcurs_touch\fP(3X) +wunctrl/\fBcurs_util\fP(3X) +wvline/\fBcurs_border\fP(3X) +wvline_set/\fBcurs_border_set\fP(3X) +.TE +.PP +.IR \%ncurses 's +.I "screen-pointer extension" +adds additional functions corresponding to many of the above, +each with an \*(``_sp\*('' suffix; +see \fBcurs_sp_funcs\fP(3X). +.PP +The availability of some extensions is configurable when +.I \%ncurses +is compiled; +see sections \*(``ALTERNATE CONFIGURATIONS\*('' and \*(``EXTENSIONS\*('' +below. +.SH RETURN VALUE +Unless otherwise noted, +functions that return integers return the constants +.B OK +on success and +.B ERR +on failure; +see \fB\%curs_variables\fP(3X). +Functions that return pointers return +.B NULL +on failure. +Typically, +.I \%ncurses +treats a null pointer passed as a function parameter as a failure. +Functions prefixed with \*(``mv\*('' first perform cursor movement and +fail if the position +.RI ( y , +.IR x ) +is outside the window boundaries. +.SH ENVIRONMENT +The following symbols from the process environment customize the +runtime behavior of +.I \%ncurses +applications. +The library may be configured to disregard the variables +.IR \%TERMINFO , +.IR \%TERMINFO_DIRS , +.IR \%TERMPATH , +and +.IR HOME , +if the user is the superuser (root), +or the application uses \fI\%setuid\fP(2) or \fI\%setgid\fP(2). +.SS "\fIBAUDRATE\fP" +The debugging library checks this variable when the application has +redirected output to a file. +.I \%ncurses +interprets its integral value as the terminal's line speed +in bits per second. +If that value is absent or invalid, +.I \%ncurses +uses 9600. +This feature allows developers to construct repeatable test cases +that take into account optimization decisions that depend +on the terminal's line speed. +.SS "\fICC\fP (command character)" +When set, +the +.B \%command_character +.RB \%( cmdch ) +capability value of loaded +.I \%term\%info +entries changes to the value of this variable. +Very few +.I \%term\%info +entries provide this feature. +.PP +Because this name is also used in development environments to store the +C compiler's name, +.I \%ncurses +ignores its value if it is not one character in length. +.SS "\fICOLUMNS\fP" +This variable specifies the width of the screen in characters. +Applications running in a windowing environment usually are able to +obtain the width of the window in which they are executing. +.I \%ncurses +enforces an upper limit of 512 when reading the value. +If +.I \%COLUMNS +is not defined and the terminal's screen size is not available from the +terminal driver, +.I \%ncurses +uses the size specified by the +.B \%columns +.RB \%( cols ) +capability of the terminal type's entry in the +.I \%term\%info +database, +if any. +.PP +It is important that your application use the correct screen size. +Automatic detection thereof is not always possible because an +application may be running on a host that does not honor NAWS +(Negotiations About Window Size) +or as a different user ID than the owner of the terminal device file. +Setting +.I \%COLUMNS +and/or +.I \%LINES +overrides the library's use of the screen size obtained from the +operating system. +.PP +The +.I \%COLUMNS +and +.I \%LINES +variables may be specified independently. +This property is useful to circumvent misfeatures of legacy terminal +type descriptions; +\fI\%xterm\fP(1) descriptions specifying 65 lines were once notorious. +For best results, +avoid specifying +.B cols +and +.B lines +capability codes in +.I \%term\%info +descriptions of terminal emulators. +.PP +\fBuse_env\fP(3X) can disable use of the process environment +in determining the screen size. +\fBuse_tioctl\fP(3X) can update +.I \%COLUMNS +and +.I \%LINES +to match the screen size obtained from system calls or the terminal +database. +.SS "\fIESCDELAY\fP" +For +.I curses +to distinguish the ESC character resulting from a user's press of the +\*(``Escape\*('' key on the input device from one beginning an +.I "escape sequence" +(as commonly produced by function keys), +it waits after receiving the escape character to see if further +characters are available on the input stream within a short interval. +A global variable +.B \%ESCDELAY +stores this interval in milliseconds. +The default value of 1000 +(one second) +is adequate for most uses. +This environment variable overrides it; +.I \%ncurses +enforces an upper limit of 30,000 +(30 seconds) +when reading the value. +.PP +The most common instance where you may wish to change this value +is to work with a remote host over a slow communication channel. +If the host running a +.I curses +application does not receive the characters of an escape sequence in a +timely manner, +the library can interpret them as multiple key stroke events. +.PP +\fI\%xterm\fP(1) mouse events are a form of escape sequence; +therefore, +if your application makes heavy use of multiple-clicking, +you may wish to lengthen the default value because the delay applies +to the composite multi-click event as well as the individual clicks. +.PP +Portable applications should not rely upon the presence of +.B \%ESCDELAY +in either form, +but setting the environment variable rather than the global variable +does not create problems when compiling an application. +.PP +If \fB\%keypad\fP(3X) is disabled for the +.I curses +window receiving input, +a program must disambiguate escape sequences itself. +.SS "\fIHOME\fP" +.I \%ncurses +may read and write auxiliary terminal descriptions in +.I \%.termcap +and +.I \%.terminfo +files in the user's home directory. +.SS "\fILINES\fP" +This counterpart to +.I \%COLUMNS +specifies the height of the screen in characters. +The corresponding +.I \%term\%info +capability and code is +.BR \%lines . +See the description of the +.I \%COLUMNS +variable above. +.SS "\fIMOUSE_BUTTONS_123\fP" +(OS/2 EMX port only) +OS/2 numbers a three-button mouse inconsistently with other platforms, +such that 1 is the left button, +2 the right, +and 3 the middle. +This variable customizes the mouse button numbering. +Its value must be three digits 1\-3 in any order. +By default, +.I \%ncurses +assumes a numbering of \*(``132\*(''. +.SS "\fINCURSES_ASSUMED_COLORS\fP" +If set, +this variable overrides the +.I \%ncurses +library's compiled-in assumption that the terminal's default colors are +white on black; +see \fB\%default_colors\fP(3X). +Set the foreground and background color values with this environment +variable by assigning it two integer values separated by a comma, +indicating foregound and background color numbers, +respectively. +.PP +For example, +to tell +.I \%ncurses +not to assume anything about the colors, +use a value of \*(``\-1,\-1\*(''. +To make the default color scheme green on black, +use \*(``2,0\*(''. +.I \%ncurses +accepts integral values from \-1 up to the value of the +.I \%term\%info +.B \%max_colors +.RB ( colors ) +capability. +.SS "\fINCURSES_CONSOLE2\fP" +(MinGW port only) +The +.I \%Console2 +.\" https://www.hanselman.com/blog/console2-a-better-windows-command-prompt +program defectively handles the Microsoft Console API call +.IR \%Create\%Console\%Screen\%Buffer . +Applications that use it will hang. +However, +it is possible to simulate the action of this call by mapping +coordinates, +explicitly saving and restoring the original screen contents. +Setting the environment variable +.I \%NCGDB +has the same effect. +.SS "\fINCURSES_GPM_TERMS\fP" +(Linux only) +When +.I \%ncurses +is configured to use the GPM interface, +this variable may list one or more terminal type names, +delimited by vertical bars +.RB ( | ) +or colons +.RB ( : ), +against which the +.I TERM +variable +(see below) +is matched. +An empty value disables the GPM interface, +using +.IR \%ncurses 's +built-in support for \fI\%xterm\fP(1) mouse protocols instead. +If the variable is absent, +.I \%ncurses +attempts to open GPM if +.I TERM +contains \*(``linux\*(''. +.SS "\fINCURSES_NO_HARD_TABS\fP" +.I \%ncurses +may use tab characters in cursor movement optimization. +In some cases, +your terminal driver may not handle them properly. +Set this environment variable to any value to disable the feature. +You can also adjust your \fI\%stty\fP(1) settings to avoid the problem. +.SS "\fINCURSES_NO_MAGIC_COOKIE\fP" +Many terminals store video attributes as a property of a character cell, +as +.I curses +does. +Historically, +some recorded changes in video attributes as data that logically +.I occupies +character cells on the display, +switching attributes on or off, +similarly to tags in a markup language; +these are termed \*(``magic cookies\*('', +and must be subsequently overprinted. +If the +.I \%term\%info +entry for your terminal type does not adequately describe its handling +of magic cookies, +set this variable to any value to instruct +.I \%ncurses +to disable attributes entirely. +.SS "\fINCURSES_NO_PADDING\fP" +Most terminal type descriptions in the +.I \%term\%info +database detail hardware devices. +Many people use +.IR curses -based +applications in terminal emulator programs that run in a windowing +environment. +These programs can duplicate all of the important features of a hardware +terminal, +but often lack their limitations. +Chief among these absent drawbacks is the problem of data flow +management; +that is, +limiting the speed of communication to what the hardware could handle. +Unless a hardware terminal is interfaced into a terminal concentrator +(which does flow control), +an application must manage flow itself to prevent overruns and data +loss. +.PP +A solution that comes at no hardware cost is for an application to pause +after directing a terminal to execute an operation that it performs +slowly, +such as clearing the display. +Many terminal type descriptions, +including that for the VT100, +embed delay specifications in capabilities. +You may wish to use these terminal descriptions without paying the +performance penalty. +Set +.I \%NCURSES_NO_PADDING +to any value to disable all but mandatory padding. +Mandatory padding is used by such terminal capabilities as +.B \%flash_screen +.RB ( flash ). +.SS "\fINCURSES_NO_SETBUF\fP" +(Obsolete) +Prior to internal changes developed in +.I \%ncurses +5.9 +(patches 20120825 through 20130126), +the library used \fI\%setbuf\fP(3) to enable fully buffered output when +initializing the terminal. +This was done, +as in SVr4 +.IR curses , +to increase performance. +For testing purposes, +both of +.I \%ncurses +and of certain applications, +this feature was made optional. +Setting this variable disabled output buffering, +leaving the output stream in the original +(usually line-buffered) +mode. +.PP +Nowadays, +.I \%ncurses +performs its own buffering and does not require this workaround; +it does not modify the buffering of the standard output stream. +This approach makes signal handling, +as for interrupts, +more robust. +A drawback is that certain unconventional programs mixed +\fI\%stdio\fP(3) calls with +.I \%ncurses +calls and (usually) +got the behavior they expected. +This is no longer the case; +.I \%ncurses +does not write to the standard output file descriptor through a +.IR stdio -buffered +stream. +.PP +As a special case, +low-level API calls such as \fB\%putp\fP(3X) still use the +standard output stream. +High-level +.I curses +calls such as \fB\%printw\fP(3X) do not. +.SS "\fINCURSES_NO_UTF8_ACS\fP" +At initialization, +.I \%ncurses +inspects the +.I TERM +environment variable for special cases where VT100 forms-drawing +characters +(and the corresponding alternate character set +.I \%term\%info +capabilities) +are known to be unsupported by terminal types that otherwise claim VT100 +compatibility. +Specifically, +when running in a UTF-8 locale, +the Linux virtual console device and the GNU \fI\%screen\fP(1) +program ignore them. +Set this variable to a nonzero value to instruct +.I \%ncurses +that the terminal's ACS support is broken; +the library then outputs Unicode code points that correspond to the +forms-drawing +characters. +Set it to zero +(or a non-integer) +to disable the special check for terminal type names matching +\*(``linux\*('' or \*(``screen\*('', +directing +.I \%ncurses +to assume that the ACS feature works if the terminal type description +advertises it. +.PP +As an alternative to use of this variable, +.I \%ncurses +checks for an extended +.I \%term\%info +numeric capability \fBU8\fP +that can be compiled using +.RB \*(`` "@TIC@ \-x" \*(''. +Examples follow. +.PP +.RS 3 +.EX +# linux console, if patched to provide working +# VT100 shift\-in/shift\-out, with corresponding font. +linux\-vt100|linux console with VT100 line\-graphics, + U8#0, use=linux, +\& +# uxterm with vt100Graphics resource set to false +xterm\-utf8|xterm relying on UTF\-8 line\-graphics, + U8#1, use=xterm, +.EE +.RE +.PP +The two-character name \*(``U8\*('' was chosen to permit its use via +.IR \%ncurses 's +.I termcap +interface. +.SS "\fINCURSES_TRACE\fP" +At initialization, +.I \%ncurses +(in its debugging configuration) +checks for this variable's presence. +If defined with an integral value, +the library calls \fB\%curses_trace\fP(3X) with that value as the +argument. +.SS "\fITERM\fP" +The +.I TERM +variable denotes the terminal type. +Each is distinct, +though many are similar. +It is commonly set by terminal emulators to help applications find a +workable terminal description. +Some choose a popular approximation such as \*(``ansi\*('', +\*(``vt100\*('', or \*(``xterm\*('' rather than an exact fit to their +capabilities. +Not infrequently, +an application will have problems with that approach; +for example, +a key stroke may not operate correctly, +or produce no effect but seeming garbage characters on the screen. +.PP +Setting +.I TERM +has no effect on hardware operation; +it affects the way applications communicate with the terminal. +Likewise, +as a general rule +(\fIxterm\fP(1) being a rare exception), +terminal emulators that allow you to specify +.I TERM +as a parameter or configuration value do not change their behavior to +match that setting. +.SS "\fITERMCAP\fP" +If +.I \%ncurses +is configured with +.I termcap +support, +it checks for a terminal type description in +.I termcap +format if one in +.I \%term\%info +format is not available. +Setting this variable directs +.I \%ncurses +to ignore the usual +.I termcap +database location, +.IR \%/etc/termcap ; +see +.I \%TERMPATH +below. +.I \%TERMCAP +should contain either a terminal description +(with newlines stripped out), +or a file name indicating where the information required by the +.I TERM +environment variable is stored. +.SS "\fITERMINFO\fP" +.I \%ncurses +can be configured to read terminal type description databases in various +locations using different formats. +This variable overrides the default location. +.bP +Descriptions in +.I \%term\%info +format are normally stored in a directory tree using subdirectories +named for the common first letters of the terminal types named therein. +This is the scheme used in System\ V. +.bP +If +.I \%ncurses +is configured to use hashed databases, +then +.I \%TERM\%INFO +may name its location, +such as +.IR \%/usr/share/terminfo.db , +rather than +.IR \%/usr/share/terminfo/ . +.PP +The hashed database uses less disk space and is a little faster than the +directory tree. +However, +some applications assume the existence of the directory tree, +and read it directly +rather than using the +.I \%term\%info +API. +.bP +If +.I \%ncurses +is configured with +.I termcap +support, +this variable may contain the location of a +.I \%termcap +file. +.bP +If the value of +.I \%TERM\%INFO +begins with \*(``hex:\*('' or \*(``b64:\*('', +.I \%ncurses +uses the remainder of the value as a compiled +.I \%term\%info +description. +You might produce the base64 format using \fB\%infocmp\fP(1M). +.RS 4 +.IP +.EX +TERMINFO=$(infocmp \-0 \-Q2 \-q) +export TERMINFO +.EE +.RE +.IP +The compiled description is used only if it corresponds to the terminal +type identified by +.IR TERM . +.PP +Setting +.I \%TERM\%INFO +is the simplest, +but not the only, +way to direct +.I \%ncurses +to a terminal database. +The search path is as follows. +.bP +the last terminal database to which the running +.I \%ncurses +application wrote, +if any +.bP +the location specified by the +.I \%TERM\%INFO +environment variable +.bP +.I $HOME/.terminfo +.bP +locations listed in the +.I \%TERMINFO_DIRS +environment variable +.ds td \" empty +.if !'@TERMINFO_DIRS@'no default value' .as td @TERMINFO_DIRS@ +.if !'@TERMINFO@\*(td'' \{\ +.bP +location(s) configured and compiled into +.I \%ncurses +.RS +.if !'\*(td'' \{\ +.bP +.I \%@TERMINFO_DIRS@ +.\} +.if !'@TERMINFO'' .if !'\*(td'@TERMINFO@' \{\ +.bP +.I \%@TERMINFO@ +.\} +.\} +.RE +.SS "\fITERMINFO_DIRS\fP" +This variable specifies a list of locations, +akin to +.IR PATH , +in which +.I \%ncurses +searches for the terminal type descriptions described by +.I \%TERMINFO +above. +The list items are separated by colons on Unix +and semicolons on OS/2 EMX. +System\ V +.I \%term\%info +lacks a corresponding feature; +.I \%TERMINFO_DIRS +is an +.I \%ncurses +extension. +.SS "\fITERMPATH\fP" +If +.I \%TERMCAP +does not hold a terminal type description or file name, +then +.I \%ncurses +checks the contents of +.IR \%TERMPATH , +a list of locations, +akin to +.IR PATH , +in which it searches for +.I termcap +terminal type descriptions. +The list items are separated by colons on Unix +and semicolons on OS/2 EMX. +.PP +If both +.I \%TERMCAP +and +.I \%TERMPATH +are unset or invalid, +.I \%ncurses +searches for the files +.IR \%/etc/termcap , +.IR \%/usr/share/misc/termcap , +and +.IR \%$HOME/.termcap , +in that order. +.SH "ALTERNATE CONFIGURATIONS" +Many different +.I \%ncurses +configurations are possible, +determined by the options given to the +.I \%configure +script when building the library. +Run the script with the +.B \%\-\-help +option to peruse them all. +A few are of particular significance to the application developer +employing +.IR \%ncurses . +.TP 5 +.B \-\-disable\-overwrite +The standard C preprocessor inclusion for the +.I curses +library is as follows. +.RS 5 +.PP +.RS 4 +.EX +.\" The dummy character prevents undesired rewriting of the next line on +.\" installation of the man page. +\fB#\&include \fP +.EE +.RE +.PP +This option is used to avoid file name conflicts between +.I \%ncurses +and an existing +.I curses +installation on the system. +If +.I \%ncurses +is installed disabling overwrite, +it puts its header files in a subdirectory. +Here is an example. +.PP +.RS 4 +.EX +.\" The dummy character prevents undesired rewriting of the next line on +.\" installation of the man page. +\fB#\&include \fP +.EE +.RE +.PP +Installation also omits a symbolic link that would cause the compiler's +.B \%\-lcurses +option to link object files with +.I \%ncurses +instead of the system +.I curses +library. +.PP +The directory used by this configuration of +.I \%ncurses +is shown in section \*(``SYNOPSIS\*('' above. +.RE +.TP 5 +.B \-\-enable\-widec +The configure script renames the library and +(if the +.B \%\-\-disable\-overwrite +option is used) +puts the header files in a different subdirectory. +All of the library names have a \*(``w\*('' appended to them, +i.e., instead of +.RS 5 +.PP +.RS 4 +.EX +.B \-lncurses +.EE +.RE +.PP +you link with +.PP +.RS 4 +.EX +.B \-lncursesw +.EE +.RE +.PP +You must also enable the wide-character features in the header file +when compiling for the wide-character library +to use the extended (wide-character) functions. +The symbol which enables these features has changed +since X/Open Curses, Issue 4: +.bP +Originally, the wide-character feature required the symbol +\fB_XOPEN_SOURCE_EXTENDED\fP +but that was only valid for XPG4 (1996). +.bP +Later, that was deemed conflicting with \fB_XOPEN_SOURCE\fP defined to 500. +.bP +As of mid-2018, +none of the features in this implementation require a \fB_XOPEN_SOURCE\fP +feature greater than 600. +However, X/Open Curses, Issue 7 (2009) recommends defining it to 700. +.bP +Alternatively, you can enable the feature by defining \fBNCURSES_WIDECHAR\fP +with the caveat that some other header file than \fBcurses.h\fP +may require a specific value for \fB_XOPEN_SOURCE\fP +(or a system-specific symbol). +.PP +The \fI\%curses.h\fP header file installed for the wide-character +library is designed to be compatible with the non-wide library's header. +Only the size of the \fI\%WINDOW\fP structure differs; +few applications require more than pointers to \fI\%WINDOW\fPs. +.PP +If the headers are installed allowing overwrite, +the wide-character library's headers should be installed last, +to allow applications to be built using either library +from the same set of headers. +.RE +.TP 5 +.B \-\-with\-pthread +The configure script renames the library. +All of the library names have a \*(``t\*('' appended to them +(before any \*(``w\*('' added by +.BR \%\-\-enable\-widec ). +.IP +The global variables such as \fBLINES\fP are replaced by macros to +allow read-only access. +At the same time, setter-functions are provided to set these values. +Some applications (very few) may require changes to work with this convention. +.TP 5 +.B \-\-with\-shared +.tQ +.B \-\-with\-normal +.tQ +.B \-\-with\-debug +.tQ +.B \-\-with\-profile +The shared and normal (static) library names differ by their suffixes, +e.g., \fBlibncurses.so\fP and \fBlibncurses.a\fP. +The debug and profiling libraries add a \*(``_g\*('' +and a \*(``_p\*('' to the root names respectively, +e.g., \fBlibncurses_g.a\fP and \fBlibncurses_p.a\fP. +.TP 5 +.B \-\-with\-termlib +Low-level functions which do not depend upon whether the library +supports wide-characters, are provided in the tinfo library. +.IP +By doing this, it is possible to share the tinfo library between +wide/normal configurations as well as reduce the size of the library +when only low-level functions are needed. +.IP +Those functions are described in these pages: +.RS +.bP +\fB\%curs_extend\fP(3X) \- miscellaneous \fIcurses\fP extensions +.bP +\fB\%curs_inopts\fP(3X) \- \fIcurses\fP input options +.bP +\fB\%curs_kernel\fP(3X) \- low-level \fIcurses\fP routines +.bP +\fB\%curs_termattrs\fP(3X) \- \fIcurses\fP environment query routines +.bP +\fB\%curs_termcap\fP(3X) \- \fIcurses\fP emulation of \fItermcap\fP +.bP +\fB\%curs_terminfo\fP(3X) \- \fIcurses\fP interface to \fIterminfo\fP +database +.bP +\fB\%curs_util\fP(3X) \- miscellaneous \fIcurses\fP utility routines +.RE +.TP 5 +.B \-\-with\-trace +The \fBtrace\fP function normally resides in the debug library, +but it is sometimes useful to configure this in the shared library. +Configure scripts should check for the function's existence rather +than assuming it is always in the debug library. +.SH FILES +.TP +.I @DATADIR@/tabset +tab stop initialization database +.TP +.I @TERMINFO@ +compiled terminal capability database +.SH NOTES +X/Open Curses permits most functions it specifies to be made available +as macros as well. +.\" See X/Open Curses Issue 4, Version 2, pp. 227-234. +.\" See X/Open Curses Issue 7, pp. 311-318. +\fI\%ncurses\fP does so +.bP +for functions that return values via their parameters, +.bP +to support obsolete features, +.bP +to reuse functions +(for example, +those that move the cursor before another operation), +and +.bP +in a few special cases. +.PP +If the standard output file descriptor of an +.I \%ncurses +program is redirected to something that is not a terminal device, +the library writes screen updates to the standard error file descriptor. +This was an undocumented feature of SVr3 +.IR curses . +.PP +See subsection \*(``Header Files\*('' below regarding symbols exposed by +inclusion of \fI\%curses.h\fP. +.SH EXTENSIONS +.I \%ncurses +enables an application to capture mouse events on certain terminals, +including \fI\%xterm\fP(1); +see \fB\%curs_mouse\fP(3X). +.PP +.I \%ncurses +provides a means of responding to window resizing events, +as when running in a GUI terminal emulator application such as +.IR \%xterm ; +see \fB\%resizeterm\fP(3X) and \fB\%wresize\fP(3X). +.PP +.I \%ncurses +allows an application to query the terminal for the presence of a wide +variety of special keys; +see \fB\%has_key\fP(3X). +.PP +.I \%ncurses +extends the fixed set of function key capabilities specified by X/Open +Curses by allowing the application programmer to define additional key +events at runtime; +see +\fB\%define_key\fP(3X), +\fB\%key_defined\fP(3X), +\fB\%keybound\fP(3X), +and +\fB\%keyok\fP(3X). +.PP +.I \%ncurses +can exploit the capabilities of terminals implementing ISO\ 6429/ECMA-48 +SGR\ 39 and SGR\ 49 sequences, +which allow an application to reset the terminal to its original +foreground and background colors. +From a user's perspective, +the application is able to draw colored text on a background whose color +is set independently, +providing better control over color contrasts. +See \fB\%default_colors\fP(3X). +.PP +An +.I \%ncurses +application can eschew knowledge of +.I \%SCREEN +and +.I \%WINDOW +structure internals, +instead using accessor functions such as +\fB\%is_cbreak\fP(3X) and +\fB\%is_scrollok\fP(3X). +.PP +.I \%ncurses +enables an application to direct its output to a printer attached to the +terminal device; +see \fB\%curs_print\fP(3X). +.PP +.I \%ncurses +offers \fB\%slk_attr\fP(3X) as a counterpart of \fB\%attr_get\fP(3X) for +soft-label key lines, +and \fB\%extended_slk_color\fP(3X) as a form of \fB\%slk_color\fP(3X) +that can gather color information from them when many colors are +supported. +.PP +.I \%ncurses +permits modification of \fB\%unctrl\fP(3X)'s behavior; +see \fB\%use_legacy_coding\fP(3X). +.PP +Rudimentary support for multi-threaded applications may be available; +see \fBcurs_threads\fP(3X). +.PP +Functions that ease the management of multiple screens can be exposed; +see \fBcurs_sp_funcs\fP(3X). +.PP +To aid applications to debug their memory usage, +.I \%ncurses +optionally offers functions to more aggressively free memory it +dynamically allocates itself; +see \fBcurs_memleaks\fP(3X). +.PP +The library facilitates auditing and troubleshooting of its behavior; +see \fBcurs_trace\fP(3X). +.PP +Compiling +.I \%ncurses +with the option +.B \%\-DUSE_GETCAP +causes it to fall back to reading +.I \%/etc/termcap +if the terminal setup code cannot find a +.I \%term\%info +entry corresponding to +.IR TERM . +Use of this feature is not recommended, +as it essentially includes an entire +.I termcap +compiler in the +.I \%ncurses +startup code, +at a cost in memory usage and application launch latency. +.PP +.I \%PDCurses +and NetBSD +.I curses +incorporate some +.I \%ncurses +extensions. +Individual man pages indicate where this is the case. +.SH PORTABILITY +X/Open Curses defines two levels of conformance, +\*(``base\*('' and \*(``enhanced\*(''. +The latter includes several additional features, +such as wide-character and color support. +.I \%ncurses +intends base-level conformance with X/Open Curses, +and supports all features of its enhanced level +except the +.I \%untic +utility. +.PP +Differences between X/Open Curses and +.I \%ncurses +are documented in the \*(``PORTABILITY\*('' sections of applicable man +pages. +.SS "Error Checking" +In many cases, X/Open Curses is vague about error conditions, +omitting some of the SVr4 documentation. +.PP +Unlike other implementations, +.I \%ncurses +checks pointer parameters, +such as those to +.I \%WINDOW +structures, +to ensure that they are not null. +This is done primarily to guard against programmer error. +The standard interface does not provide a way for the library +to tell an application which of several possible errors occurred. +An application that relies on +.I \%ncurses +to check its function parameters for validity limits its portability and +robustness. +.SS "Padding Differences" +In historical +.I curses +implementations, +delays embedded in the +.I \%term\%info +capabilities +.B \%carriage_return +.RB ( cr ), +.B \%scroll_forward +.RB ( ind ), +.B \%cursor_left +.RB ( cub1 ), +.B \%form_feed +.RB ( ff ), +and +.B \%tab +.RB ( ht ) +activated corresponding delay bits in the Unix terminal driver. +.I \%ncurses +performs all padding by sending NUL bytes to the device. +This method is slightly more expensive, +but narrows the interface to the Unix kernel significantly and +correspondingly increases the package's portability. +.SS "Header Files" +The header file +.I \%curses.h +itself includes the header files +.I \%stdio.h +and +.IR \%unctrl.h . +.PP +X/Open Curses has more to say, +.RS 4 +.PP +The inclusion of +.I \%curses.h +may make visible all symbols from the headers +.IR \%stdio.h , +.IR \%term.h , +.IR \%termios.h , +and +.IR \%wchar.h . +.RE +.PP +but does not finish the story. +A more complete account follows. +.bP +The first +.IR curses "," +in 4BSD, +provided a +.I \%curses.h +file. +.IP +BSD +.I curses +code included +.I \%curses.h +and +.I \%unctrl.h +from an internal header file +.IR \%curses.ext , +where +\*(``ext\*('' abbreviated \*(``externs\*(''. +.IP +The implementations of +.I \%printw +and +.I \%scanw +used undocumented internal functions of the standard I/O library +.RI ( _doprnt +and +.IR _doscan ), +but nothing in +.I \%curses.h +itself relied upon +.IR \%stdio.h . +.bP +SVr2 +.I curses +added +.IR \%newterm , +which relies upon +.I \%stdio.h +because its function prototype employs the +.I FILE +type. +.IP +SVr4 +.I curses +added +.I \%putwin +and +.IR \%getwin , +which also use +.IR \%stdio.h . +.IP +X/Open Curses specifies all three of these functions. +.IP +SVr4 +.I curses +and X/Open Curses do not require the developer to include +.I \%stdio.h +before +.IR \%curses.h . +Both document use of +.I curses +as requiring only +.IR \%curses.h . +.IP +As a result, +standard +.I \%curses.h +always includes +.IR \%stdio.h . +.bP +X/Open Curses and SVr4 +.I curses +are inconsistent with respect to +.IR \%unctrl.h . +.IP +As noted in \fBcurs_util\fP(3X), +.I \%ncurses +includes +.I \%unctrl.h +from +.I \%curses.h +(as SVr4 does). +.bP +X/Open Curses's comments about +.I \%term.h +and +.I \%termios.h +may refer to HP-UX and AIX. +.IP +HP-UX +.I curses +includes +.I \%term.h +from +.I \%curses.h +to declare +.I \%setupterm +in +.IR \%curses.h , +but +.I \%ncurses +and Solaris +.I curses +do not. +.IP +AIX +.I curses +includes +.I \%term.h +and +.IR \%termios.h . +Again, +.I \%ncurses +and Solaris +.I curses +do not. +.bP +X/Open Curses says that +.I \%curses.h +.B may +include +.IR \%term.h , +but does not require it to do so. +.IP +Some programs use functions declared in both +.I \%curses.h +and +.IR \%term.h , +and must include both header files in the same module. +Very old versions of AIX +.I curses +required inclusion of +.I \%curses.h +before +.IR \%term.h . +.IP +The header files supplied by +.I \%ncurses +include the standard library headers required for its declarations, +so +.IR \%ncurses 's +own header files can be included in any order. +For portability even to old AIX systems, +include +.I \%curses.h +before +.IR \%term.h . +.bP +X/Open Curses says \*(``may make visible\*('' because including a header +file does not necessarily make visible all of the symbols in it +(consider +.B \%#ifdef +and similar). +.IP +For instance, +.IR \%ncurses 's +.I \%curses.h +.B may \" bold to contrast with preceding italic +include +.I \%wchar.h +if the proper symbol is defined, +and if +.I \%ncurses +is configured for wide-character support. +If +.I \%wchar.h +is included, +its symbols +.B may \" bold for consistency in this paragraph +be made visible depending on the value of the +.B _XOPEN_SOURCE +feature test macro. +.bP +X/Open Curses mandates an application's inclusion of one standard C +library header in a special case: +.I \%stdarg.h +before +.I \%curses.h +to prototype the functions +.I \%vw_printw +and +.I \%vw_scanw +(as well as the obsolete +.I \%vwprintw +and +.IR \%vwscanw ). +Each of these takes a variadic argument list, +a +.I \%va_list +parameter, +like that of \fI\%printf\fP(3). +.IP +SVr3 +.I curses +introduced +the two obsolete functions, +and X/Open Curses the others. +In between, +SVr4 +.I curses +provided for the possibility that an application might include either +.I \%varargs.h +or +.IR \%stdarg.h . +These represented contrasting approaches to handling variadic +argument lists. +The older interface, +.IR \%varargs.h , +used a pointer to +.I char \" V7, 32V, System III, 3BSD +for variadic functions' +.I \%va_list +parameter. +Later, +the list acquired its own standard data type, +.IR \%va_list , +defined in +.IR \%stdarg.h , +empowering the compiler to check the types of a function call's actual +parameters against the formal ones declared in its prototype. +.IP +No conforming implementations of X/Open Curses require an application +to include +.I \%stdarg.h +before +.I \%curses.h +because they either have allowed for a special type, +or, +like +.IR \%ncurses , +they include +.I \%stdarg.h +themselves to provide a portable interface. +.SH AUTHORS +Zeyd M. Ben-Halim, +Eric S. Raymond, +Thomas E. Dickey. +Based on +.I \%pcurses +by Pavel Curtis. +.SH SEE ALSO +\fB\%curs_variables\fP(3X), +\fB\%terminfo\fP(5), +\fB\%user_caps\fP(5) diff --git a/contrib/ncurses/man/new_pair.3x b/contrib/ncurses/man/new_pair.3x new file mode 100644 index 00000000..5e844bf8 --- /dev/null +++ b/contrib/ncurses/man/new_pair.3x @@ -0,0 +1,166 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey +.\" +.\" $Id: new_pair.3x,v 1.46 2024/03/16 15:35:01 tom Exp $ +.TH new_pair 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%alloc_pair\fP, +\fB\%find_pair\fP, +\fB\%free_pair\fP \- +dynamically allocate \fIcurses\fR color pairs +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint alloc_pair(int \fIfg\fP, int \fIbg\fP); +\fBint find_pair(int \fIfg\fP, int \fIbg\fP); +\fBint free_pair(int \fIpair\fP); +.fi +.SH DESCRIPTION +These functions are an extension to the \fIcurses\fP library. +They permit an application to dynamically allocate a color pair using +the foreground/background colors rather than assign a fixed color pair number, +and return an unused pair to the pool. +.PP +The number of colors may be related to the number of possible color +pairs for a given terminal, or it may not: +.bP +While almost all terminals allow setting the color \fIattributes\fP +independently, +it is unlikely that your terminal allows you to modify the attributes +of a given character cell without rewriting it. +That is, the foreground and background colors are applied as a pair. +.bP +Color pairs are the \fIcurses\fP library's way of managing a color palette +on a terminal. +If the library does not keep track of the \fIcombinations\fP of +colors which are displayed, it will be inefficient. +.IP \(bu 4 +For simple terminal emulators +with only a few dozen color combinations, +it is convenient to use the maximum number of combinations +as the limit on color pairs: +.PP +.RS 8 +.EX +\fBCOLORS\fI * \fBCOLORS\fR +.EE +.RE +.IP \(bu 4 +Terminals which support \fIdefault colors\fP distinct +from \*(``ANSI colors\*('' +add to the possible combinations, producing this total: +.PP +.RS 8 +.EX +\fI( \fBCOLORS\fI + 1 ) * ( \fBCOLORS\fI + 1 )\fR +.EE +.RE +.bP +An application might use up to a few dozen color pairs to +implement a predefined color scheme. +.IP +Beyond that lies in the realm of programs using the foreground +and background colors for \*(``ASCII art\*('' +(or some other non-textual application). +.IP +Also beyond those few dozen pairs, the required size for a table +to represent the combinations grows rapidly with an increasing number of colors. +.IP +These functions allow a developer to let the screen library +manage color pairs. +.SS alloc_pair +The \fBalloc_pair\fP function accepts parameters for +foreground and background color, and +checks if that color combination is already associated with a color pair. +.bP +If the combination already exists, +\fBalloc_pair\fP returns the existing pair. +.bP +If the combination does not exist, +\fBalloc_pair\fP allocates a new color pair and returns that. +.bP +If the table fills up, \fBalloc_pair\fP discards the least-recently +allocated entry using \fBfree_pair\fP and allocates a new color pair. +.PP +All of the color pairs are allocated from a table of possible color pairs. +The size of the table is determined by the terminfo \fBpairs\fP capability. +The table is shared with \fBinit_pair\fP; +in fact \fBalloc_pair\fP calls \fBinit_pair\fP after +updating the \fI\%ncurses\fP library's fast index +to the colors versus color pairs. +.SS find_pair +The \fBfind_pair\fP function accepts parameters for +foreground and background color, and +checks if that color combination is already associated with a color pair, +returning the pair number if it has been allocated. +Otherwise it returns \-1. +.SS free_pair +Marks the given color pair as unused, +i.e., like color pair 0. +.SH RETURN VALUE +The \fBalloc_pair\fP function returns a color pair number in the range +1 through \fBCOLOR_PAIRS\fP\-1, unless it encounters an error updating +its fast index to the color pair values, preventing it from allocating +a color pair. +In that case, it returns \-1. +.PP +The \fBfind_pair\fP function returns a color pair number if the +given color combination has been associated with a color pair, +or \-1 if not. +.PP +Likewise, \fBfree_pair\fP returns \fBOK\fP unless it encounters an +error updating the fast index or if no such color pair is in use. +.SH PORTABILITY +These routines are specific to \fI\%ncurses\fP. +They were not supported on +Version 7, BSD or System V implementations. +It is recommended that +any code depending on them be conditioned using \fB\%NCURSES_VERSION\fP. +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%curs_color\fP(3X) diff --git a/contrib/ncurses/man/panel.3x b/contrib/ncurses/man/panel.3x new file mode 100644 index 00000000..41aca007 --- /dev/null +++ b/contrib/ncurses/man/panel.3x @@ -0,0 +1,293 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: panel.3x,v 1.65 2024/05/25 21:14:41 tom Exp $ +.TH panel 3X 2024-05-25 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +panel \- +manage overlapping \fIcurses\fP windows +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBPANEL *new_panel(WINDOW *\fIwin\fP); +.PP +\fBint bottom_panel(PANEL *\fIpan\fP); +\fBint top_panel(PANEL *\fIpan\fP); +\fBint show_panel(PANEL *\fIpan\fP); +\fBvoid update_panels(void); +\fBint hide_panel(PANEL *\fIpan\fP); +.PP +\fBWINDOW *panel_window(const PANEL *\fIpan\fP); +\fBint replace_panel(PANEL *\fIpan\fP, WINDOW *\fIwindow\fP); +\fBint move_panel(PANEL *\fIpan\fP, int \fIstarty\fP, int \fIstartx\fP); +\fBint panel_hidden(const PANEL *\fIpan\fP); +.PP +\fBPANEL *panel_above(const PANEL *\fIpan\fP); +\fBPANEL *panel_below(const PANEL *\fIpan\fP); +.PP +\fBint set_panel_userptr(PANEL *\fIpan\fP, const void *\fIptr\fP); +\fBconst void *panel_userptr(const PANEL *\fIpan\fP); +.PP +\fBint del_panel(PANEL *\fIpan\fP); +.PP +\fI/* ncurses extensions */\fP +\fBPANEL *ground_panel(SCREEN *\fIsp\fP); +\fBPANEL *ceiling_panel(SCREEN *\fIsp\fP); +.fi +.SH DESCRIPTION +Panels are \fBcurses\fP(3X) windows with the added property of +depth. +Panel functions allow the use of stacked windows and ensure that the +proper portions of each window and the \fIcurses\fP \fB\%stdscr\fP +window are hidden or displayed when panels are added, +moved, +modified, +or removed. +The set of currently visible panels is the stack of panels. +The +\fB\%stdscr\fP window is beneath all panels, +and is not considered part of the stack. +.PP +A window is associated with each panel. +The panel routines enable you to create, +move, +hide, +and show panels. +You can relocate a panel to any desired position in the stack. +.PP +Panel routines are a functional layer added to \fIcurses\fP, +make only high-level \fIcurses\fP calls, +and work anywhere \fIcurses\fP does. +.SH FUNCTIONS +.\" --------- +.SS bottom_panel +\fB\%bottom_panel(\fIpan\fB)\fR +puts panel \fIpan\fP at the bottom of all panels. +.\" --------- +.SS ceiling_panel +\fB\%ceiling_panel(\fIsp\fB)\fR +acts like \fB\%panel_below(NULL)\fP +for the given \fISCREEN\fP \fIsp\fP. +.\" --------- +.SS del_panel +\fB\%del_panel(\fIpan\fB)\fR +removes the given panel \fIpan\fP from the stack and deallocates the +\fI\%PANEL\fP structure (but not its associated window). +.\" --------- +.SS ground_panel +\fB\%ground_panel(\fIsp\fB)\fR +acts like \fB\%panel_above(NULL)\fP +for the given \fISCREEN\fP \fIsp\fP. +.\" --------- +.SS hide_panel +\fB\%hide_panel(\fIpan\fB)\fR +removes the given panel \fIpan\fP from the panel stack +and thus hides it from view. +The \fI\%PANEL\fP structure is not lost, +merely removed from the stack. +.\" --------- +.SS move_panel +\fB\%move_panel(\fIpan\fB, \fIstarty\fB, \fIstartx\fB)\fR +moves the given panel \fIpan\fP's window so that its upper-left corner +is at +\fIstarty\fP, +\fIstartx\fP. +It does not change the position of the panel in the stack. +Be sure to use this function, +not \fB\%mvwin\fP(3X), +to move a panel window. +.\" --------- +.SS new_panel +\fB\%new_panel(\fIwin\fB)\fR allocates a \fI\%PANEL\fR structure, +associates it with \fIwin\fP, +places the panel on the top of the stack +(causes it to be displayed above any other panel) +and returns a pointer to the new panel. +.\" --------- +.SS panel_above +\fB\%panel_above(\fIpan\fB)\fR +returns a pointer to the panel above \fIpan\fP. +If the panel argument is +\*(``\fB(PANEL *)0\fP\*('', +it returns a pointer to the bottom panel in the stack. +.\" --------- +.SS panel_below +\fB\%panel_below(\fIpan\fB)\fR +returns a pointer to the panel just below \fIpan\fP. +If the panel argument is +\*(``\fB(PANEL *)0\fP\*('', +it returns a pointer to the top panel in the stack. +.\" --------- +.SS panel_hidden +\fB\%panel_hidden(\fIpan\fB)\fR +returns \fBFALSE\fP if the panel \fIpan\fP is in the panel stack, +and \fBTRUE\fP if it is not. +If the panel is a null pointer, +it returns \fBERR\fP. +.\" --------- +.SS panel_userptr +\fB\%panel_userptr(\fIpan\fB)\fR +returns the user pointer for a given panel \fIpan\fP. +.\" --------- +.SS panel_window +\fB\%panel_window(\fIpan\fB)\fR +returns a pointer to the window of the given panel \fIpan\fP. +.\" --------- +.SS replace_panel +\fB\%replace_panel(\fIpan\fB, \fIwindow\fB)\fR +replaces the current window of panel \fIpan\fP with \fIwindow\fP +This is useful if, +for example, +you want to resize a panel. +In \fI\%ncurses\fP, +you can call \fB\%replace_panel\fP +to resize a panel using a window resized with \fB\%wresize\fP(3X). +It does not change the position of the panel in the stack. +.\" --------- +.SS set_panel_userptr +\fB\%set_panel_userptr(\fIpan\fB, \fIptr\fB)\fR +sets the panel's user pointer. +.\" --------- +.SS show_panel +\fB\%show_panel(\fIpan\fB)\fR +makes a hidden panel visible by placing it on top of the panels in the +panel stack. +See \*(``PORTABILITY\*('' below. +.\" --------- +.SS top_panel +\fB\%top_panel(\fIpan\fB)\fR +puts the given visible panel \fIpan\fP on top of all panels in the +stack. +See \*(``PORTABILITY\*('' below. +.\" --------- +.SS update_panels +\fB\%update_panels()\fR +refreshes the virtual screen to reflect the relations between the panels +in the stack, +but does not call \fB\%doupdate\fP(3X) to refresh the physical screen. +Use this function and not \fB\%wrefresh\fP(3X) or +\fB\%wnoutrefresh\fP(3X). +.PP +\fB\%update_panels\fP may be called more than once before a call to +\fB\%doupdate\fP, +but \fB\%doupdate\fP is the function responsible for updating +the physical screen. +.SH "RETURN VALUE" +Each routine that returns a pointer returns \fBNULL\fP if an error +occurs. +Each routine that returns an int value returns \fBOK\fP if it +executes successfully and \fBERR\fP if not. +.PP +Except as noted, +the \fIpan\fP and \fIwindow\fP parameters must be non-null. +If either is null, +an error is returned. +.PP +The \fB\%move_panel\fP function uses \fBmvwin\fP(3X), +and returns +.B ERR +if \fB\%mvwin\fP returns +.BR ERR "." +.SH NOTES +The header file \fI\%panel.h\fP itself includes the header file +\fI\%curses.h\fP. +.SH PORTABILITY +Reasonable care has been taken to ensure compatibility +with the native panel facility introduced in System\ V; +inspection of the SVr4 manual pages suggests the programming interface +never changed. +The \fI\%PANEL\fP data structures are merely similar. +The programmer is cautioned not to directly use \fI\%PANEL\fP fields. +.PP +The functions \fB\%show_panel\fP and \fB\%top_panel\fP are identical +in this implementation, +and work equally well with displayed or hidden panels. +In the System\ V implementation, +\fB\%show_panel\fP is intended for making a hidden panel visible +(at the top of the stack) +and \fB\%top_panel\fP is intended for making an already-visible panel +move to the top of the stack. +You are cautioned to use the correct +function to ensure compatibility with System\ V panel libraries. +.SH HISTORY +A panel facility was documented in SVr4.2's +\fICharacter User Interface Programming\fP document. +.PP +It is not part of X/Open Curses. +.PP +A few implementations exist: +.bP +Systems based on SVr4 source code, +such as Solaris, +provide this library. +.bP +\fI\%ncurses\fP (since version 0.6 in 1993) +and \fIPDCurses\fP (since version 2.2 in 1995) +provide a panel library whose common ancestor +is a public domain implementation by Warren Tucker +published in \fIu386mon\fP 2.20 (1990). +.IP +According to Tucker, +the System\ V panel library was first released in SVr3.2 (1988), +and his implementation helped with a port to SVr3.1 (1987). +.IP +Several developers have improved each of these; +they are no longer the same as Tucker's implementation. +.bP +NetBSD 8 (2018) +has a panel library begun by Valery Ushakov in 2015, +based on the System\ V documentation. +.SH AUTHORS +Warren Tucker originally wrote this +implementation, +primarily to assist in porting \fI\%u386mon\fP to systems without a +native panel library. +.PP +Zeyd ben-Halim repackaged it for \fI\%ncurses\fP. +.PP +Juergen Pfeifer and Thomas E. Dickey revised and improved the library. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_variables\fP(3X) diff --git a/contrib/ncurses/man/resizeterm.3x b/contrib/ncurses/man/resizeterm.3x new file mode 100644 index 00000000..5e23d9fb --- /dev/null +++ b/contrib/ncurses/man/resizeterm.3x @@ -0,0 +1,180 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1996-on +.\" +.\" $Id: resizeterm.3x,v 1.56 2024/03/16 15:35:01 tom Exp $ +.TH resizeterm 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%is_term_resized\fP, +\fB\%resize_term\fP, +\fB\%resizeterm\fP \- +manage the terminal dimensions understood by \fIcurses\fR +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBbool is_term_resized(int \fIlines\fP, int \fIcolumns\fP); +\fBint resize_term(int \fIlines\fP, int \fIcolumns\fP); +\fBint resizeterm(int \fIlines\fP, int \fIcolumns\fP); +.fi +.SH DESCRIPTION +This is an extension to the \fIcurses\fP library. +It provides callers with a hook into the \fI\%ncurses\fP data to resize +windows, +primarily for use by programs running in an X Window terminal (e.g., xterm) +when the terminal's screen size is changed by the user: +.bP +\fIcurses\fP windows cannot extend outside the screen. +If the terminal is shrunk, \fIcurses\fP windows must be shrunk to fit. +.bP +If the terminal is stretched, +rows and/or columns can be added to existing windows. +The added cells should match the current attributes of the windows. +.PP +If the calling program has not set up a handler for \fB\%SIGWINCH\fP +when it initializes \fI\%ncurses\fP +(e.g., using \fB\%initscr\fP(3X) or \fB\%newterm\fP(3X)), +then \fI\%ncurses\fP sets a handler for \fB\%SIGWINCH\fP which notifies +the library when a window-size event has occurred. +The library checks for this notification +.bP +when reading input data, +.bP +when implicitly resuming program mode +(e.g., between \fB\%endwin\fP(3X) and \fB\%wrefresh\fP(3X)), +and +.bP +when explicitly resuming program mode in \fB\%restartterm\fP(3X). +.PP +When the library has found that the terminal's window-size has +changed, it calls \fB\%resizeterm\fP to update its data structures. +.PP +An application which establishes its own \fB\%SIGWINCH\fP handler +can call \fB\%resizeterm\fP, but in that case, the library will not +see \fB\%SIGWINCH\fP, and proper layout will rely upon the application. +.SH FUNCTIONS +.SS resizeterm +The function \fB\%resizeterm\fP resizes the standard and current windows +(i.e., \fB\%stdscr\fP and \fB\%curscr\fP) +to the specified dimensions, and adjusts other bookkeeping data used by +the \fI\%ncurses\fP library that record the window dimensions +such as the \fB\%LINES\fP and \fB\%COLS\fP variables. +.SS resize_term +Most of the work for \fB\%resizeterm\fP is +done by the inner function \fB\%resize_term\fP. +The outer function \fB\%resizeterm\fP adds bookkeeping +for the \fB\%SIGWINCH\fP handler, +as well as repainting the soft-key area (see \fB\%slk_touch\fP(3X)). +.PP +The \fB\%resize_term\fP function attempts to resize all windows. +This helps with simple applications. +However: +.bP +It is not possible to automatically resize pads. +.bP +Applications which have complicated layouts should check for +\fB\%KEY_RESIZE\fP returned from \fB\%wgetch\fP, +and adjust their layout, e.g., using \fB\%wresize\fP and \fB\%mvwin\fP, +or by recreating the windows. +.PP +When resizing windows, \fB\%resize_term\fP recursively adjusts subwindows, +keeping them within the updated parent window's limits. +If a top-level window happens to extend to the screen's limits, +then on resizing the window, \fB\%resize_term\fP will keep the window +extending to the corresponding limit, regardless of whether the +screen has shrunk or grown. +.SS is_term_resized +A support function \fB\%is_term_resized\fP is provided so that applications +can check if the \fB\%resize_term\fP function would modify +the window structures. +It returns \fBTRUE\fP if the windows would be modified, +and \fBFALSE\fP otherwise. +.SH RETURN VALUE +Except as noted, these functions return +the integer \fBERR\fP upon failure and \fBOK\fP on success. +They will fail if either of the dimensions are less than or equal to zero, +or if an error occurs while (re)allocating memory for the windows. +.SH NOTES +While these functions are intended to be used to support a signal handler +(i.e., for \fB\%SIGWINCH\fP), care should be taken to avoid invoking them in a +context where \fB\%malloc\fP or \fB\%realloc\fP may have been interrupted, +since it uses those functions. +.PP +If \fI\%ncurses\fP is configured to supply its own \fB\%SIGWINCH\fP +handler, +.bP +on receipt of a \fB\%SIGWINCH\fP, the handler sets a flag +.bP +which is tested in +\fB\%wgetch\fP(3X), +\fB\%doupdate\fP(3X) and +\fB\%restartterm\fP(3X), +.bP +in turn, calling the \fB\%resizeterm\fP function, +.bP +which \fB\%ungetch\fP's a \fB\%KEY_RESIZE\fP which +will be read on the next call to \fB\%wgetch\fP. +.IP +The \fB\%KEY_RESIZE\fP alerts an application that the screen size has changed, +and that it should repaint special features such as pads that cannot +be done automatically. +.IP +Calling \fB\%resizeterm\fP or \fB\%resize_term\fP +directly from a signal handler is unsafe. +This indirect method is used to provide a safe way to resize the +\fI\%ncurses\fP data structures. +.PP +If the environment variables \fILINES\fP or \fI\%COLUMNS\fP are set, +this overrides the library's use of the window size obtained from +the operating system. +Thus, even if a \fB\%SIGWINCH\fP is received, +no screen size change may be recorded. +.SH PORTABILITY +It is possible to resize the screen with SVr4 \fIcurses\fP, +by +.bP +exiting \fIcurses\fP with \fB\%endwin\fP(3X) and +.bP +resuming using \fB\%refresh\fP(3X). +.PP +Doing that clears the screen and is visually distracting. +.PP +This extension of \fI\%ncurses\fP was introduced in mid-1995. +It was adopted in NetBSD \fIcurses\fP (2001) and PDCurses (2003). +.SH AUTHORS +Thomas Dickey (from an equivalent function written in 1988 for BSD \fIcurses\fP) +.SH SEE ALSO +\fB\%curs_getch\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%wresize\fP(3X) diff --git a/contrib/ncurses/man/scr_dump.5 b/contrib/ncurses/man/scr_dump.5 new file mode 100644 index 00000000..95b2142e --- /dev/null +++ b/contrib/ncurses/man/scr_dump.5 @@ -0,0 +1,476 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: scr_dump.5,v 1.46 2024/03/23 20:42:29 tom Exp $ +.TH scr_dump 5 2024-03-23 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "File formats" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +scr_dump \- +\fIcurses\fR screen dump +.\"SH SYNOPSIS +.SH DESCRIPTION +The curses library provides applications with the ability to write the +contents of a window to an external file using \fBscr_dump\fP or \fBputwin\fP, +and read it back using \fBscr_restore\fP or \fBgetwin\fP. +.PP +The \fBputwin\fP and \fBgetwin\fP functions do the work; +while \fBscr_dump\fP and \fBscr_restore\fP conveniently save and restore +the whole screen, i.e., \fBstdscr\fP. +.SS ncurses6 +A longstanding implementation of screen-dump was +revised with ncurses6 to remedy problems with the earlier approach: +.IP \(bu 4 +A \*(``magic number\*('' is written to the beginning of the dump file, +allowing applications (such as \fBfile\fP(1)) to recognize curses dump files. +.IP +Because ncurses6 uses a new format, +that requires a new magic number +was unused by other applications. +This 16-bit number was unused: +.RS 4 +.PP +.RS 4 +.EX +0x8888 (octal \*(``\e210\e210\*('') +.EE +.RE +.PP +but to be more certain, this 32-bit number was chosen: +.PP +.RS 4 +.EX +0x88888888 (octal \*(``\e210\e210\e210\e210\*('') +.EE +.RE +.PP +This is the pattern submitted to the maintainers of the \fBfile\fP program: +.PP +.RS 4 +.EX +# +# ncurses5 (and before) did not use a magic number, +# making screen dumps "data". +# +# ncurses6 (2015) uses this format, ignoring byte-order +0 string \e210\e210\e210\e210ncurses ncurses6 screen image +# +.EE +.RE +.RE +.bP +The screen dumps are written in textual form, +so that internal data sizes are not directly related to the dump-format, and +enabling the library to read dumps from either narrow- or wide-character- +configurations. +.IP +The \fInarrow\fP library configuration holds characters and video attributes +in a 32-bit \fBchtype\fP, while the \fIwide-character\fP library stores +this information in the \fBcchar_t\fP structure, which is much larger than +32-bits. +.bP +It is possible to read a screen dump into a terminal with a different +screen-size, +because the library truncates or fills the screen as necessary. +.bP +The ncurses6 \fBgetwin\fP reads the legacy screen dumps from ncurses5. +.SS "ncurses5 (Legacy)" +The screen-dump feature was added to \fI\%ncurses\fP in June 1995. +While there were fixes and improvements in succeeding years, +the basic scheme was unchanged: +.bP +The \fI\%WINDOW\fP structure was written in binary form. +.bP +The \fI\%WINDOW\fP structure refers to lines of data, +which were written as an array of binary data following the \fI\%WINDOW\fP. +.bP +When \fBgetwin\fP restored the window, +it would keep track of offsets into the array of line-data +and adjust the \fI\%WINDOW\fP structure which was read back into memory. +.PP +This is similar to Unix System\ V, +but does not write a \*(``magic number\*('' to identify the file format. +.SH PORTABILITY +There is no standard format for +.I curses +screen dumps. +A brief survey of the existing implementations follows. +.SS "X/Open Curses" +X/Open Curses, Issue 7 specifies little. +It says +(boldface emphasis added) +.RS 3 +.PP +\*(``[t]he \fI\%getwin()\fP function reads window-related data stored in +the file by \fI\%putwin()\fP. +The function then creates and initializes a new window using that data. +.PP +The \fI\%putwin()\fP function writes all data associated with \fIwin\fP +into the \fI\%stdio\fP stream to which \fIfilep\fP points, +using an \fBunspecified format\fP. +This information can be retrieved later using \fI\%getwin()\fP.\*('' +.RE +.PP +In the mid-1990s when the X/Open Curses document was written, +there were still System\ V systems using older, +less capable +.I curses +libraries. +BSD +.I curses +was not relevant to X/Open because it did not meet the criteria +for base-level conformance; +see \fB\%ncurses\fP(3X). +.SS "System V" +System\ V +.I curses +identified the file format by writing a \*(``magic number\*('' at the +beginning of the dump. +The \fI\%WINDOW\fP data and the lines of text follow, all in binary form. +.PP +Solaris +.I curses +has the following definitions. +.PP +.RS 4 +.EX +/* terminfo magic number */ +#define MAGNUM 0432 + +/* curses screen dump magic number */ +#define SVR2_DUMP_MAGIC_NUMBER 0433 +#define SVR3_DUMP_MAGIC_NUMBER 0434 +.EE +.RE +.PP +That is, the feature was likely introduced in SVr2 (1984), +and improved in SVr3 (1987). +Solaris +.I curses +has no magic number for SVr4 (1989). +Other System\ V operating systems +(AIX and HP-UX) +use a magic number that would correspond to the following. +.PP +.RS 4 +.EX +/* curses screen dump magic number */ +#define SVR4_DUMP_MAGIC_NUMBER 0435 +.EE +.RE +.PP +That octal number in bytes is 001, 035. +Because most Unix vendors at the time used big-endian hardware, +the magic number is written with the high-order byte first. +.PP +.RS 4 +.EX +\e001\e035 +.EE +.RE +.PP +After the magic number, +the \fI\%WINDOW\fP structure and line data are written in binary format. +While the magic number used by these systems can be observed with +\fIod\fP(1), +none of them documents the format used for screen dumps. +.PP +Nor do they use an identical format, +even with the System\ V family. +The +.I \%ncurses +.I \%savescreen +test program was used to collect information for this manual page. +It produced dumps of different size +(all on 64-bit hardware, +on 40x80 screens): +.bP +AIX (51817 bytes) +.bP +HP-UX (90093 bytes) +.bP +Solaris 10 (13273 bytes) +.bP +\fI\%ncurses\fP5 (12888 bytes) +.SS Solaris +As noted above, +Solaris +.I curses +has no magic number corresponding to SVr4 +.IR curses . +This is odd, +since Solaris was the first operating system to meet the SVr4 +guidelines. +Solaris furthermore supplies two versions of +.IR curses . +.bP +The default +.I curses +library uses the SVr3 magic number. +.bP +An alternate +.I curses +library +(which we term +.I \%xcurses), +available in +.IR /usr/xpg4 , +uses a textual format with no magic number. +.IP +According to its copyright notice, +this +.I \%xcurses +library was developed by MKS +(Mortice Kern Systems) from 1990 to 1995. +.IP +Like ncurses6, +it includes a header with parameters. +Unlike ncurses6, +the contents of the window are written piecemeal, +with coordinates and attributes for each chunk of text rather than +writing the whole window from top to bottom. +.SS PDCurses +.I \%PDCurses +added support for screen dumps in version 2.7 (2005). +Like System\ V and ncurses5, +it writes the \fI\%WINDOW\fP structure in binary, +but begins the file with its three-byte identifier \*(``PDC\*('', +followed by a single-byte version number. +.PP +.RS 4 +.EX + \*(``PDC\e001\*('' +.EE +.RE +.SS NetBSD +As of April 2017, +NetBSD +.I curses +does not support \fB\%scr_dump\fP and \fB\%scr_restore\fP +(or \fB\%scr_init\fP, +\fB\%scr_set\fP), +although it has \fB\%putwin\fP and \fB\%getwin\fP. +.PP +Like ncurses5, +NetBSD \fB\%putwin\fP does not identify its dumps with a useful magic +number. +It writes +.bP +the +.I curses +shared library major and minor versions as the first two bytes +(for example, +7 and 1), +.bP +followed by a binary dump of the \fI\%WINDOW\fP, +.bP +some data for wide characters referenced by the \fI\%WINDOW\fP +structure, +and +.bP +finally, +lines as done by other implementations. +.SH EXAMPLES +Given a simple program which writes text to the screen +(and for the sake of example, limiting the screen-size to 10x20): +.PP +.RS 4 +.EX +#include + +int +main(void) +{ + putenv("LINES=10"); + putenv("COLUMNS=20"); + initscr(); + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + init_pair(2, COLOR_RED, COLOR_BLACK); + bkgd(COLOR_PAIR(1)); + move(4, 5); + attron(A_BOLD); + addstr("Hello"); + move(5, 5); + attroff(A_BOLD); + attrset(A_REVERSE | COLOR_PAIR(2)); + addstr("World!"); + refresh(); + scr_dump("foo.out"); + endwin(); + return 0; +} +.EE +.RE +.PP +When run using ncurses6, the output looks like this: +.PP +.RS 4 +.EX +\e210\e210\e210\e210ncurses 6.0.20170415 +_cury=5 +_curx=11 +_maxy=9 +_maxx=19 +_flags=14 +_attrs=\e{REVERSE|C2} +flag=_idcok +_delay=-1 +_regbottom=9 +_bkgrnd=\e{NORMAL|C1}\es +rows: +1:\e{NORMAL|C1}\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +2:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +3:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +4:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +5:\es\es\es\es\es\e{BOLD}Hello\e{NORMAL}\es\es\es\es\es\es\es\es\es\es +6:\es\es\es\es\es\e{REVERSE|C2}World!\e{NORMAL|C1}\es\es\es\es\es\es\es\es\es +7:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +8:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +9:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +10:\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es\es +.EE +.RE +.PP +The first four octal escapes are actually nonprinting characters, +while the remainder of the file is printable text. +You may notice: +.bP +The actual color pair values are not written to the file. +.bP +All characters are shown in printable form; spaces are \*(``\es\*('' to +ensure they are not overlooked. +.bP +Attributes are written in escaped curly braces, e.g., \*(``\e{BOLD}\*('', +and may include a color pair (C1 or C2 in this example). +.bP +The parameters in the header are written out only if they are nonzero. +When reading back, order does not matter. +.ne 10 +.PP +Running the same program with Solaris \fIxpg4\fP curses gives this dump: +.PP +.RS 4 +.EX +MAX=10,20 +BEG=0,0 +SCROLL=0,10 +VMIN=1 +VTIME=0 +FLAGS=0x1000 +FG=0,0 +BG=0,0, +0,0,0,1, +0,19,0,0, +1,0,0,1, +1,19,0,0, +2,0,0,1, +2,19,0,0, +3,0,0,1, +3,19,0,0, +4,0,0,1, +4,5,0x20,0,Hello +4,10,0,1, +4,19,0,0, +5,0,0,1, +5,5,0x4,2,World! +5,11,0,1, +5,19,0,0, +6,0,0,1, +6,19,0,0, +7,0,0,1, +7,19,0,0, +8,0,0,1, +8,19,0,0, +9,0,0,1, +9,19,0,0, +CUR=11,5 +.EE +.RE +.PP +Solaris \fBgetwin\fP requires that all parameters are present, and +in the same order. +The \fIxpg4\fP curses library does not know about the \fBbce\fP +(back color erase) capability, and does not color the window background. +.ne 10 +.PP +On the other hand, the SVr4 curses library does know about the background color. +However, its screen dumps are in binary. +Here is the corresponding dump (using \*(``od \-t x1\*(''): +.PP +.RS 4 +.EX +0000000 1c 01 c3 d6 f3 58 05 00 0b 00 0a 00 14 00 00 00 +0000020 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 +0000040 00 00 b8 1a 06 08 cc 1a 06 08 00 00 09 00 10 00 +0000060 00 00 00 80 00 00 20 00 00 00 ff ff ff ff 00 00 +0000100 ff ff ff ff 00 00 00 00 20 80 00 00 20 80 00 00 +0000120 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00 +* +0000620 20 80 00 00 20 80 00 00 20 80 00 00 48 80 00 04 +0000640 65 80 00 04 6c 80 00 04 6c 80 00 04 6f 80 00 04 +0000660 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00 +* +0000740 20 80 00 00 20 80 00 00 20 80 00 00 57 00 81 00 +0000760 6f 00 81 00 72 00 81 00 6c 00 81 00 64 00 81 00 +0001000 21 00 81 00 20 80 00 00 20 80 00 00 20 80 00 00 +0001020 20 80 00 00 20 80 00 00 20 80 00 00 20 80 00 00 +* +0001540 20 80 00 00 20 80 00 00 00 00 f6 d1 01 00 f6 d1 +0001560 08 00 00 00 40 00 00 00 00 00 00 00 00 00 00 07 +0001600 00 04 00 01 00 01 00 00 00 01 00 00 00 00 00 00 +0001620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +* +0002371 +.EE +.RE +.SH AUTHORS +Thomas E. Dickey +.br +extended screen-dump format for \fI\%ncurses\fP 6.0 (2015) +.sp +Eric S. Raymond +.br +screen dump feature in \fI\%ncurses\fP 1.9.2d (1995) +.SH SEE ALSO +\fB\%curs_scr_dump\fP(3X), +\fB\%curs_util\fP(3X) diff --git a/contrib/ncurses/man/tabs.1 b/contrib/ncurses/man/tabs.1 new file mode 100644 index 00000000..30df4dd6 --- /dev/null +++ b/contrib/ncurses/man/tabs.1 @@ -0,0 +1,360 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2008-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: tabs.1,v 1.65 2024/09/21 18:04:07 tom Exp $ +.TH @TABS@ 1 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%@TABS@\fP \- +set terminal tab stops +.SH SYNOPSIS +\fB@TABS@\fP [\fIoptions\fP] [\fItabstop-list\fP] +.SH DESCRIPTION +The \fB@TABS@\fP program clears and sets tab-stops on the terminal. +This uses the terminfo \fBclear_all_tabs\fP and \fBset_tab\fP capabilities. +If either is absent, \fB@TABS@\fP is unable to clear/set tab-stops. +The terminal should be configured to use hard tabs, e.g., +.PP +.RS 4 +.EX +stty tab0 +.EE +.RE +.PP +Like \fB@CLEAR@\fP(1), \fB@TABS@\fP writes to the standard output. +You can redirect the standard output to a file (which prevents +\fB@TABS@\fP from actually changing the tabstops), +and later \fBcat\fP the file to the screen, setting tabstops at that point. +.PP +These are hardware tabs, which cannot be queried rapidly by applications +running in the terminal, if at all. +Curses and other full-screen applications may use hardware tabs +in optimizing their output to the terminal. +If the hardware tabstops differ from the information in the terminal +database, the result is unpredictable. +Before running curses programs, +you should either reset tab-stops to the standard interval +.PP +.RS 4 +.EX +@TABS@ \-8 +.EE +.RE +.PP +or use the \fB@RESET@\fP program, +since the normal initialization sequences do not ensure that tab-stops +are reset. +.SH OPTIONS +.SS "General Options" +.TP 5 +.BI \-T "name" +Tell \fB@TABS@\fP which terminal type to use. +If this option is not given, \fB@TABS@\fP will use the \fB$TERM\fP +environment variable. +If that is not set, it will use the \fIansi+tabs\fP entry. +.TP 5 +.B \-d +The debugging option shows a ruler line, followed by two data lines. +The first data line shows the expected tab-stops marked with asterisks. +The second data line shows the actual tab-stops, marked with asterisks. +.TP 5 +.B \-n +This option tells \fB@TABS@\fP to check the options and run any debugging +option, but not to modify the terminal settings. +.TP +\fB\-V\fP +reports the version of \fI\%ncurses\fP which was used in this program, +and exits. +.PP +The \fB@TABS@\fP program processes a single list of tab stops. +The last option to be processed which defines a list is the one that +determines the list to be processed. +.SS "Implicit Lists" +Use a single number as an option, +e.g., \*(``\fB\-5\fP\*('' to set tabs at the given +interval (in this case 1, 6, 11, 16, 21, etc.). +Tabs are repeated up to the right margin of the screen. +.PP +Use \*(``\fB\-0\fP\*('' to clear all tabs. +.PP +Use \*(``\fB\-8\fP\*('' to set tabs to the standard interval. +.SS "Explicit Lists" +An explicit list can be defined after the options +(this does not use a \*(``\-\*(''). +The values in the list must be in increasing numeric order, +and greater than zero. +They are separated by a comma or a blank, for example, +.PP +.RS 4 +.EX +@TABS@ 1,6,11,16,21 +@TABS@ 1 6 11 16 21 +.EE +.RE +.PP +Use a \*(``+\*('' to treat a number +as an increment relative to the previous value, +e.g., +.PP +.RS 4 +.EX +@TABS@ 1,+5,+5,+5,+5 +.EE +.RE +.PP +which is equivalent to the 1,6,11,16,21 example. +.SS "Predefined Tab Stops" +POSIX defines several predefined lists of tab stops. +.TP 5 +.B \-a +Assembler, IBM S/370, first format +.br +1,10,16,36,72 +.TP 5 +.B \-a2 +Assembler, IBM S/370, second format +.br +1,10,16,40,72 +.TP 5 +.B \-c +COBOL, normal format +.br +1,8,12,16,20,55 +.TP 5 +.B \-c2 +COBOL compact format +.br +1,6,10,14,49 +.TP 5 +.B \-c3 +COBOL compact format extended +.br +1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67 +.TP 5 +.B \-f +FORTRAN +.br +1,7,11,15,19,23 +.TP 5 +.B \-p +PL/I +.br +1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61 +.TP 5 +.B \-s +SNOBOL +.br +1,10,55 +.TP 5 +.B \-u +UNIVAC 1100 Assembler +.br +1,12,20,44 +.SS Margins +A few terminals expose a means of changing their left and right margins. +\fB@TABS@\fP supports this feature with an option. +.TP 5 +.BI +m \ margin +The effect depends on whether the terminal has the margin capabilities: +.RS +.bP +If the terminal provides the capability for setting the left margin, +\fB@TABS@\fP uses this, +and adjusts the available tab stop widths. +.bP +If the terminal does not provide the margin capabilities, +\fB@TABS@\fP imitates their effect, +putting tab stops at appropriate places on each line. +The terminal's left margin is not modified. +.RE +.IP +If the +.I margin +parameter is omitted, +the default is 10. +Use +.B +m0 +to reset the left margin, +that is, +to make it the left edge of the terminal's display. +Before setting a left margin, +\fB@TABS@\fP resets the margin to reduce problems that might arise +from moving the cursor to the left of the current left margin. +.PP +When setting or resetting the left margin, +\fB@TABS@\fP may also reset the right margin. +.SH FILES +.TP +.I @DATADIR@/tabset +tab stop initialization database +.SH PORTABILITY +IEEE Std 1003.1/The Open Group Base Specifications Issue\ 7 +(POSIX.1-2008) +describes a +.I tabs +utility. +However, +.bP +this standard describes a +.B +m +option to set a terminal's left margin. +Very few of the entries in the terminal database provide the +.B \%set_left_margin +.RB ( smgl ) +or +.B \%set_left_margin_parm +.RB \%( smglp ) +capabilities needed to support the feature. +.bP +Unlike +.IR tput , +.I tabs +has no specification in X/Open Curses Issue\ 7. +.PP +The +.B \-d +(debug) and +.B \-n +(no-op) options are +.I \%ncurses +extensions not provided by other implementations. +.SH HISTORY +A +.I tabs +utility appeared in PWB/Unix 1.0 (1977). +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=PWB1/sys/source/s2/\ +.\" tabs.c +A reduced version shipped in Seventh Edition Unix +(early 1979) +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/tabs.c +and in 3BSD +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/src/cmd/\ +.\" tabs.c +(later the same year); +it supported an option \*(``\-n\*('' to set the first tab stop at the +left margin. +That option is not specified by POSIX. +.PP +The PWB/Unix +.I tabs +utility returned in System III (1980), +and used built-in tables +to support a half-dozen hardcopy terminal (printer) types. +It also had logic to support setting the left margin, +as well as a feature for copying the tab settings from a file. +.PP +Versions of the program in later releases of AT&T Unix, +such as SVr4, +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=SysVR4/cmd/tabs/tabs.c +added support for the terminal database, +but retained the tables to support the printers. +By this time, +System\ V +.I tput +had incorporated the tab stop initialization feature of BSD's +.I tset +from 1982, +but employed the +.I \%term\%info +database to do so. +.PP +The +.B +m +option was documented in the POSIX Base Specifications Issue 5 +(Unix98, 1997), +then omitted in Issue 6 +(Unix03, 2004) +without express motivation, +though an introductory comment +\*(``and optionally adjusts the margin\*('' remains, +overlooked in the removal. +The +.I tabs +utility documented in Issues 6 and later has no mechanism for setting +margins. +The +.B +m +option in +.IR \%ncurses 's +implementation +differs from the SVr4 feature by using terminal capabilities +rather than built-in tables. +.PP +POSIX documents no limit on the number of tab stops. +Other implementations impose one; +the limit is 20 in PWB/Unix's +.I tabs +utility. +While some terminals may not accept an arbitrary number of tab stops, +.I \%ncurses +attempts to set tab stops up to the right margin +if the list thereof is sufficiently long. +.PP +The \*(``Rationale\*('' section of the Issue 6 +.I tabs +reference page +.\" https://pubs.opengroup.org/onlinepubs/009604499/utilities/tabs.html +details how the committee considered redesigning the +.I tabs +and +.I tput +utilities, +without settling on an improved solution. +It claims that +.PP +.RS 4 +no known historical version of +.I tabs +supports the capability of setting arbitrary tab stops. +.RE +.PP +The feature described in subsection \*(``Explicit Lists\*('' above was +implemented in PWB/Unix, +.\" see URL above +and permitted the setting of abitrary tab stops nevertheless. +.SH SEE ALSO +\fB\%@INFOCMP@\fP(1M), +\fB\%@TSET@\fP(1), +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/term.5 b/contrib/ncurses/man/term.5 new file mode 100644 index 00000000..d2568ee9 --- /dev/null +++ b/contrib/ncurses/man/term.5 @@ -0,0 +1,578 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: term.5,v 1.80 2024/06/15 20:23:33 tom Exp $ +.TH term 5 2024-06-15 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "File formats" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ' \(aq +.ds ^ \(ha +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ds ' ' +.ds ^ ^ +.\} +.ie n .ds CW R +.el \{ +.ie \n(.g .ds CW CR +.el .ds CW CW +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +term \- +compiled \fI\%term\%info\fP terminal description +.\"SH SYNOPSIS +.SH DESCRIPTION +\fB\%@TIC@\fP(1) compiles a +.I \%term\%info +terminal type description, +and \fB\%setupterm\fP(3X) reads it. +A compiled description may be stored in a file or in a database of, +potentially, +many such descriptions. +Further, +a compiled description may be in one of two formats: +one similar to that used by System\ V, +and a newer, +extensible format employed exclusively by +.IR \%ncurses . +.SS "Storage Location" +Compiled +.I \%term\%info descriptions are placed +under the directory +.IR \%@TERMINFO@ . +One of two configurations is selected +when building the +.I \%ncurses +libraries. +.TP 5 +.B directory tree +A two-level scheme is used to avoid a linear search +of a huge Unix system directory: +.IR \%@TERMINFO@/ c / name +where +.I name +is the name of the terminal, +and +.I c +is the first character of +.IR name . +Thus, +the compiled description of terminal type \*(``act4\*('' +is found in the file +.IR \%@TERMINFO@/a/act4 . +Synonyms for the same terminal are implemented by multiple +links to the same compiled file. +.TP 5 +.B hashed database +Using the Berkeley database API, +two types of records are stored: +the +.I \%term\%info +data in the same format as that stored in a directory tree with +the terminal's primary type name as a key, +and records containing only aliases pointing to the primary name. +.IP +If built to write hashed databases, +.I \%ncurses +can still read +.I \%term\%info +databases organized as a +directory tree, +but cannot write entries into the directory tree. +It can write +(or rewrite) +entries in the hashed database. +.IP +.I \%ncurses +distinguishes the two cases in the +.I \%TERMINFO +and +.I \%TERMINFO_DIRS +environment variable by assuming a directory tree for entries that +correspond to an existing directory, +and a hashed database otherwise. +.SS "Legacy Storage Format" +The format has been chosen so that it will be the same on all hardware. +A byte of at least eight bits' width is assumed, +but no assumptions about bit ordering +or sign extension are made. +.PP +The file is divided into six parts: +.RS 5 +.IP (a) 4 +.IR header , +.IP (b) +.IR "terminal names" , +.IP (c) +.IR "Boolean flags" , +.IP (d) +.IR numbers , +.IP (e) +.IR strings , +and +.IP (f) +a +.IR "string table" . +.RE +.PP +The \fIheader\fP section begins the file. +This section contains six short integers in the format +described below. +These integers are +.RS 5 +.TP 5 +(1) the \fImagic number\fP +(octal 0432); +.TP 5 +(2) the size, +in bytes, +of the \fIterminal names\fP section; +.TP 5 +(3) the number of bytes in the \fIBoolean flags\fP section; +.TP 5 +(4) the number of short integers in the \fInumbers\fP section; +.TP 5 +(5) the number of offsets +(short integers) +in the \fIstrings\fP section; +.TP 5 +(6) the size, +in bytes, +of the \fIstring table\fP. +.RE +.PP +The capabilities in the +\fIBoolean flags\fP, +\fInumbers\fP, +and +\fIstrings\fP +sections are in the same order as in the header file +.IR term.h . +.PP +Short integers are signed, +in the range \-32768 to 32767, +and stored in little-endian format. +.PP +Numbers in a terminal description, +whether they are entries in the \fInumbers\fP or \fIstrings\fP table, +are positive integers. +Boolean flags are treated as positive one-byte integers. +In each case, +those positive integers represent a terminal capability. +The terminal compiler +.I \%@TIC@ +uses negative integers to handle the cases where a capability is not +available: +.bP +If a capability is absent from this terminal, +.I \%@TIC@ +stores a \-1 in the corresponding table. +.IP +The integer value \-1 is represented by two bytes 0377, +0377. +.br +Absent Boolean values are represented by the byte 0 (false). +.bP +If a capability has been canceled from this terminal, +.I \%@TIC@ +stores a \-2 in the corresponding table. +.IP +The integer value \-2 is represented by two bytes 0377, +0376. +.br +The Boolean value \-2 is represented by the byte 0376. +.br +.bP +Other negative values are illegal. +.PP +The \fIterminal names\fP section comes after the \fIheader\fP. +It contains the first line of the +.I \%term\%info +description, +listing the various names for the terminal, +separated by the \*(``|\*('' character. +The \fIterminal names\fP section is terminated +with an \s-1ASCII NUL\s+1 character. +.PP +The \fIBoolean flags\fP section has one byte for each flag. +Boolean capabilities are either 1 or 0 +(true or false) +according to whether the terminal supports the given capability or not. +.PP +Between the \fIBoolean flags\fP section and the \fInumber\fP section, +a null byte will be inserted, +if necessary, +to ensure that the \fInumber\fP section begins on an even byte +This is a relic of the PDP\-11's word-addressed architecture, +originally designed to avoid traps induced +by addressing a word on an odd byte boundary. +All short integers are aligned on a short word boundary. +.PP +The \fInumbers\fP section is similar to the \fIBoolean flags\fP section. +Each capability takes up two bytes, +and is stored as a little-endian short integer. +.PP +The \fIstrings\fP section is also similar. +Each capability is stored as a short integer. +The capability value is an index into the \fIstring table\fP. +.PP +The \fIstring table\fP is the last section. +It contains all of the values of string capabilities referenced in +the \fIstrings\fP section. +Each string is null-terminated. +Special characters in \*^X or \ec notation are stored in their +interpreted form, +not the printing representation. +Padding information +.BI $< nn > +and parameter information +.B %x +are stored intact in uninterpreted form. +.SS "Extended Storage Format" +The previous section describes the conventional +.I \%term\%info +binary format. +With some minor variations of the offsets +(see PORTABILITY), +the same binary format is used in all modern Unix systems. +Each system uses a predefined set of Boolean, +number or string capabilities. +.PP +The +.I \%ncurses +libraries and applications support extended +.I \%term\%info +binary format, +allowing users to define capabilities that are loaded at runtime. +This extension is made possible by using the fact that the other +implementations stop reading the +.I \%term\%info +data when they reach the end of the size given in the header. +.I \%ncurses +checks the size, +and if it exceeds that due to the predefined data, +continues to parse according to its own scheme. +.PP +First, +it reads the extended header +(5 short integers): +.RS 5 +.TP 5 +(1) +count of extended Boolean capabilities +.TP 5 +(2) +count of extended numeric capabilities +.TP 5 +(3) +count of extended string capabilities +.TP 5 +(4) +count of the items in extended string table +.TP 5 +(5) +size of the extended string table in bytes +.RE +.PP +The count- and size-values for the extended string table +include the extended capability \fInames\fP as well as +extended capability \fIvalues\fP. +.PP +Using the counts and sizes, +.I \%ncurses +allocates arrays and reads data for the extended capabilities in the +same order as the header information. +.PP +The extended string table contains values for string capabilities. +After the end of these values, +it contains the names for each of +the extended capabilities in order: +Boolean, +numeric, +and string. +.PP +By storing terminal descriptions in this way, +.I \%ncurses +is able to provide a database useful with legacy applications, +as well as providing data for applications that require more information +about a terminal type than was anticipated +by X/Open Curses. +See \fB\%user_caps\fP(5) for an overview of the way +.I \%ncurses +uses this extended information. +.PP +Applications that manipulate terminal data can use the definitions +described in \fB\%term_variables\fP(3X) associating the long capability +names with members of a +.I \%TERMTYPE +structure. +. +.SS "Extended Number Format" +On occasion, +16-bit signed integers are not large enough. +.I \%ncurses +6.1 introduced a new format +by making a few changes to the legacy format: +.bP +a different magic number +(octal 01036) +.bP +changing the type for the \fInumber\fP array from signed 16-bit integers +to signed 32-bit integers. +.PP +To maintain compatibility, +the library presents the same data structures +to direct users of the +.I \%TERMTYPE +structure as in previous formats. +However, +that cannot provide callers with the extended numbers. +The library uses a similar but hidden data structure +.I \%TERMTYPE2 +to provide data for the +.I \%term\%info +functions. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database +.SH PORTABILITY +.SS setupterm +Note that it is possible for +.B setupterm +to expect a different set of capabilities +than are actually present in the file. +Either the database may have been updated since +.B setupterm +was recompiled +(resulting in extra unrecognized entries in the file) +or the program may have been recompiled more recently +than the database was updated +(resulting in missing entries). +The routine +.B setupterm +must be prepared for both possibilities \- +this is why the numbers and sizes are included. +Also, +new capabilities must always be added at the end of the lists +of Boolean, +number, +and string capabilities. +.SS "Binary Format" +X/Open Curses does not specify a format for the +.I \%term\%info +database. +System\ V +.I curses +used a directory-tree of binary files, +one per terminal description. +.PP +Despite the consistent use of little-endian numbers and the otherwise +self-describing format, +it is not wise to count on portability of binary +.I \%term\%info +entries between commercial Unix versions. +The problem is that there are at least three versions of +.I \%term\%info +(under HP\-UX, +AIX, +and OSF/1) +each of which diverged from System\ V +.I \%term\%info +after SVr1, +and added extension capabilities to the string table that +(in the binary format) +collide with System\ V and X/Open Curses extensions. +See \fB\%terminfo\fP(5) for detailed +discussion of +.I \%term\%info +source compatibility issues. +.PP +This implementation is by default compatible with the binary +.I \%term\%info +format used by Solaris +.IR curses , +except in a few less-used details +where it was found that the latter did not match X/Open Curses. +The format used by the other Unix versions +can be matched by building +.I \%ncurses +with different configuration options. +.SS "Magic Codes" +The magic number in a binary +.I \%term\%info +file is the first 16 bits +(two bytes). +Besides making it more reliable for the library to check that a file is +.IR \%term\%info , +utilities such as \fIfile\fP(1) also use that to tell what the +file-format is. +System\ V defined more than one magic number, +with 0433, +0435 as screen-dumps +(see \fB\%scr_dump\fP(5)). +This implementation uses 01036 as a continuation of that sequence, +but with a different high-order byte to avoid confusion. +.SS "The \fITERMTYPE\fP Structure" +Direct access to the +.I \%TERMTYPE +structure is provided for legacy applications. +Portable applications should use \fB\%tigetflag\fP(3X) and related +functions to read terminal capabilities. +.SS "Mixed-case Terminal Names" +A small number of terminal descriptions use uppercase characters in +their names. +If the underlying file system ignores the difference between +uppercase and lowercase, +.I \%ncurses +represents the \*(``first character\*('' of the terminal name used as +the intermediate level of a directory tree in (two-character) +hexadecimal form. +.SS Limits +.I \%ncurses +stores compiled terminal descriptions in three related formats, +described in the subsections +.bP +.BR "Legacy Storage Format" , +and +.bP +.BR "Extended Storage Format" , +and +.bP +.BR "Extended Number Format" . +.PP +The legacy storage format and the extended number format differ by +the types of numeric capability that they can store +(for example, +16- versus 32-bit integers). +The extended storage format introduced by +.I \%ncurses +5.0 adds data to either of these formats. +.PP +Some limitations apply: +.bP +total compiled entries cannot exceed 4096 bytes in the legacy format. +.bP +total compiled entries cannot exceed 32768 bytes in the extended format. +.bP +the name field cannot exceed 128 bytes. +.PP +Compiled entries are limited to 32768 bytes because offsets into the +\fIstrings table\fP use two-byte integers. +The legacy format could have supported 32768-byte entries, +but was limited to a virtual memory page's 4096 bytes. +.SH EXAMPLES +Here is a +.I \%term\%info +description of the Lear-Siegler ADM-3, +a popular though rather stupid early terminal. +.PP +.EX +adm3a|lsi adm3a, + am, + cols#80, lines#24, + bel=\*^G, clear=\e032$<1>, cr=\*^M, cub1=\*^H, cud1=\*^J, + cuf1=\*^L, cup=\eE=%p1%{32}%+%c%p2%{32}%+%c, cuu1=\*^K, + home=\*^\*^, ind=\*^J, +.EE +.PP +A hexadecimal dump of its compiled terminal description +(in legacy format) +follows. +.PP +.if t .in +4n +.ft \*(CW +.TS +Lp-1. +0000 1a 01 10 00 02 00 03 00 82 00 31 00 61 64 6d 33 ........ ..1.adm3 +0010 61 7c 6c 73 69 20 61 64 6d 33 61 00 00 01 50 00 a|lsi ad m3a...P. +0020 ff ff 18 00 ff ff 00 00 02 00 ff ff ff ff 04 00 ........ ........ +0030 ff ff ff ff ff ff ff ff 0a 00 25 00 27 00 ff ff ........ ..%.\*'... +0040 29 00 ff ff ff ff 2b 00 ff ff 2d 00 ff ff ff ff ).....+. ..\-..... +0050 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0060 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0070 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0080 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +00a0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +00b0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +00c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +00d0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +00e0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +00f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0100 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0110 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ........ ........ +0120 ff ff ff ff ff ff 2f 00 07 00 0d 00 1a 24 3c 31 ....../. .....$<1 +0130 3e 00 1b 3d 25 70 31 25 7b 33 32 7d 25 2b 25 63 >..=%p1% {32}%+%c +0140 25 70 32 25 7b 33 32 7d 25 2b 25 63 00 0a 00 1e %p2%{32} %+%c.... +0150 00 08 00 0c 00 0b 00 0a 00 ........ . +.TE +.ft +.in +.SH AUTHORS +Thomas E. Dickey +.br +extended +.I \%term\%info +format for +.I \%ncurses +5.0 +.br +hashed database support for +.I \%ncurses +5.6 +.br +extended number support for +.I \%ncurses +6.1 +.sp +Eric S. Raymond +.br +documented legacy +.I \%term\%info +format +(that used by +.IR \%pcurses ). +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_terminfo\fP(3X), +\fB\%terminfo\fP(5), +\fB\%user_caps\fP(5) diff --git a/contrib/ncurses/man/term.7 b/contrib/ncurses/man/term.7 new file mode 100644 index 00000000..ac4ab6cf --- /dev/null +++ b/contrib/ncurses/man/term.7 @@ -0,0 +1,237 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2011,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: term.7,v 1.49 2024/05/11 20:39:53 tom Exp $ +.TH term 7 2024-05-11 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" Miscellaneous +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.SH NAME +term \- +conventions for naming terminal types +.\"SH SYNOPSIS +.SH DESCRIPTION +The environment variable \fITERM\fP should normally contain the type +name of the terminal, +console or display-device type you are using. +This information +is critical for all screen-oriented programs, including your editor and mailer. +.PP +A default \fITERM\fP value will be set on a per-line basis by either +\fB/etc/inittab\fP (e.g., System\-V-like Unices) +or \fB/etc/ttys\fP (BSD Unices). +This will nearly always suffice for workstation and microcomputer consoles. +.PP +If you use a dialup line, the type of device attached to it may vary. +Older Unix systems pre-set a very dumb terminal type +like \*(``dumb\*('' or \*(``dialup\*('' on dialup lines. +Newer ones may pre-set \*(``vt100\*('', reflecting the prevalence of DEC +VT100-compatible terminals and personal-computer emulators. +.PP +Modern telnets pass your \fITERM\fP environment variable from the local +side to the remote one. +There can be problems if the remote terminfo or termcap entry +for your type is not compatible with yours, but this situation is rare and +can almost always be avoided by explicitly exporting \*(``vt100\*('' +(assuming you are in fact using a VT100-superset console, +terminal, or terminal emulator). +.PP +In any case, you are free to override the system \fITERM\fP setting to +your taste in your shell profile. +The \fB@TSET@\fP(1) utility may be of assistance; +you can give it a set of rules for deducing or requesting a terminal type based +on the tty device and baud rate. +.PP +Setting your own \fITERM\fP value may also be useful if you have created +a custom entry incorporating options +(such as visual bell or reverse-video) +which you wish to override the system default type for your line. +.PP +Terminal type descriptions are stored as files of capability data underneath +@TERMINFO@. +To browse a list of all terminal names recognized by the system, do +.sp + @TOE@ | more +.sp +from your shell. +These capability files are in a binary format optimized for +retrieval speed (unlike the old text-based \fBtermcap\fP format they replace); +to examine an entry, you must use the \fB@INFOCMP@\fP(1M) command. +Invoke it as follows: +.sp + @INFOCMP@ \fIentry_name\fP +.sp +where \fIentry_name\fP is the name of the type you wish to examine (and the +name of its capability file the subdirectory of @TERMINFO@ named for its first +letter). +This command dumps a capability file in the text format described by +\fBterminfo\fP(5). +.PP +The first line of a \fBterminfo\fP(5) description gives the names by which +terminfo knows a terminal, +separated by \*(``|\*('' (pipe-bar) characters with the last +name field terminated by a comma. +The first name field is the type's +\fIprimary name\fP, +and is the one to use when setting \fITERM\fP. +The last name field +(if distinct from the first) +is actually a description of the +terminal type (it may contain blanks; the others must be single words). +Name +fields between the first and last (if present) are aliases for the terminal, +usually historical names retained for compatibility. +.PP +There are some conventions for how to choose terminal primary names that help +keep them informative and unique. +Here is a step-by-step guide to naming +terminals that also explains how to parse them: +.PP +First, choose a root name. +The root will consist of a lower-case letter +followed by up to seven lower-case letters or digits. +You need to avoid using +punctuation characters in root names, because they are used and interpreted as +filenames and shell meta-characters (such as !, $, *, ?, etc.) embedded in them +may cause odd and unhelpful behavior. +The slash (/), or any other character +that may be interpreted by anyone's file system (\e, $, [, ]), is especially +dangerous (terminfo is platform-independent, and choosing names with special +characters could someday make life difficult for users of a future port). +The +dot (.) character is relatively safe as long as there is at most one per root +name; some historical terminfo names use it. +.PP +The root name for a terminal or workstation console type should almost always +begin with a vendor prefix (such as \fBhp\fP for Hewlett-Packard, \fBwy\fP for +Wyse, or \fBatt\fP for AT&T terminals), or a common name of the terminal line +(\fBvt\fP for the VT series of terminals from DEC, or \fBsun\fP for Sun +Microsystems workstation consoles, or \fBregent\fP for the ADDS Regent series. +You can list the terminfo tree to see what prefixes are already in common use. +The root name prefix should be followed when appropriate by a model number; +thus \fBvt100\fP, \fBhp2621\fP, \fBwy50\fP. +.PP +The root name for a PC-Unix console type should be the OS name, +i.e., \fBlinux\fP, \fBbsdos\fP, \fBfreebsd\fP, \fBnetbsd\fP. It should +\fInot\fP be \fBconsole\fP or any other generic that might cause confusion in a +multi-platform environment! If a model number follows, it should indicate +either the OS release level or the console driver release level. +.PP +The root name for a terminal emulator (assuming it does not fit one of the +standard ANSI or vt100 types) should be the program name or a readily +recognizable abbreviation of it (i.e., \fBversaterm\fP, \fBctrm\fP). +.PP +Following the root name, you may add any reasonable number of hyphen-separated +feature suffixes. +.TP 5 +2p +Has two pages of memory. +Likewise 4p, 8p, etc. +.TP 5 +mc +Magic-cookie. +Some terminals (notably older Wyses) can only support one +attribute without magic-cookie lossage. +Their base entry is usually paired +with another that has this suffix and uses magic cookies to support multiple +attributes. +.TP 5 +\-am +Enable auto-margin (right-margin wraparound). +.TP 5 +\-m +Mono mode \- suppress color support. +.TP 5 +\-na +No arrow keys \- termcap ignores arrow keys which are actually there on the +terminal, so the user can use the arrow keys locally. +.TP 5 +\-nam +No auto-margin \- suppress am capability. +.TP 5 +\-nl +No labels \- suppress soft labels. +.TP 5 +\-nsl +No status line \- suppress status line. +.TP 5 +\-pp +Has a printer port which is used. +.TP 5 +\-rv +Terminal in reverse video mode (black on white). +.TP 5 +\-s +Enable status line. +.TP 5 +\-vb +Use visible bell (flash) rather than beep. +.TP 5 +\-w +Wide; terminal is in 132-column mode. +.PP +Conventionally, if your terminal type is a variant intended to specify a +line height, that suffix should go first. +So, for a hypothetical FuBarCo +model 2317 terminal in 30-line mode with reverse video, best form would be +\fBfubar\-30\-rv\fP (rather than, say, \*(``fubar\-rv\-30\*(''). +.PP +Terminal types that are written not as standalone entries, but rather as +components to be plugged into other entries via \fBuse\fP capabilities, +are distinguished by using embedded plus signs rather than dashes. +.PP +Commands which use a terminal type to control display often accept a \-T +option that accepts a terminal name argument. +Such programs should fall back +on the \fITERM\fP environment variable when no \-T option is specified. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database +.TP +.I /etc/inittab +tty line initialization (AT&T-like Unices) +.TP +.I /etc/ttys +tty line initialization (BSD-like Unices) +.SH PORTABILITY +For maximum compatibility with older System V Unices, names and aliases +should be unique within the first 14 characters. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%term\fP(5), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/term_variables.3x b/contrib/ncurses/man/term_variables.3x new file mode 100644 index 00000000..6aee63f4 --- /dev/null +++ b/contrib/ncurses/man/term_variables.3x @@ -0,0 +1,181 @@ +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 2010-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: term_variables.3x,v 1.36 2024/03/16 15:35:01 tom Exp $ +.TH term_variables 3X 2024-03-16 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.SH NAME +\fB\%SP\fP, +\fB\%acs_map\fP, +\fB\%boolcodes\fP, +\fB\%boolfnames\fP, +\fB\%boolnames\fP, +\fB\%cur_term\fP, +\fB\%numcodes\fP, +\fB\%numfnames\fP, +\fB\%numnames\fP, +\fB\%strcodes\fP, +\fB\%strfnames\fP, +\fB\%strnames\fP, +\fB\%ttytype\fP \- +\fIterminfo\fR global variables +.SH SYNOPSIS +.nf +\fB#include +\fB#include +.PP +\fBchtype acs_map[]; +.PP +\fBSCREEN * SP; +.PP +\fBTERMINAL * cur_term; +.PP +\fBchar ttytype[]; +.PP +\fBNCURSES_CONST char * const boolcodes[]; +\fBNCURSES_CONST char * const boolfnames[]; +\fBNCURSES_CONST char * const boolnames[]; +.PP +\fBNCURSES_CONST char * const numcodes[]; +\fBNCURSES_CONST char * const numfnames[]; +\fBNCURSES_CONST char * const numnames[]; +.PP +\fBNCURSES_CONST char * const strcodes[]; +\fBNCURSES_CONST char * const strfnames[]; +\fBNCURSES_CONST char * const strnames[]; +.fi +.SH DESCRIPTION +This page summarizes variables provided by the \fBcurses\fP library's +low-level terminfo interface. +A more complete description is given in the \fBcurs_terminfo\fP(3X) manual page. +.PP +Depending on the configuration, these may be actual variables, +or macros (see \fBcurs_threads\fP(3X)) +which provide read-only access to \fIcurses\fP's state. +In either case, applications should treat them as read-only to avoid +confusing the library. +.SS "Alternate Character Set Mapping" +After initializing the curses or terminfo interfaces, +the \fBacs_map\fP array holds information used to translate cells +with the \fBA_ALTCHARSET\fP video attribute into line-drawing characters. +.PP +The encoding of the information in this array has changed periodically. +Application developers need only know that it is used for the \*(``ACS_\*('' +constants in . +.PP +The comparable data for the wide-character library is a private variable. +.SS "Current Terminal Data" +After initializing the curses or terminfo interfaces, +the \fBcur_term\fP contains data describing the current terminal. +This variable is also set as a side-effect of \fBset_term\fP(3X) +and \fBdelscreen\fP(3X). +.PP +It is possible to save a value of \fBcur_term\fP for subsequent +use as a parameter to \fBset_term\fP, for switching between screens. +Alternatively, one can save the return value from \fBnewterm\fP +or \fBsetupterm\fP(3X) to reuse in \fBset_term\fP. +.SS "\fIterminfo\fP Lookup Tables" +The \fB@TIC@\fP(1) and \fB@INFOCMP@\fP(1) programs use lookup tables for +the long and short names of terminfo capabilities, +as well as the corresponding names for termcap capabilities. +These are available to other applications, +although the hash-tables used by +the terminfo and termcap functions are not available. +.PP +The long terminfo capability names use a \*(``f\*('' (eff) in their names: +\fBboolfnames\fP, +\fBnumfnames\fP, and +\fBstrfnames\fP. +.PP +These are the short names for terminfo capabilities: +\fBboolnames\fP, +\fBnumnames\fP, and +\fBstrnames\fP. +.PP +These are the corresponding names used for termcap descriptions: +\fBboolcodes\fP, +\fBnumcodes\fP, and +\fBstrcodes\fP. +.\" +.SS "Terminal Type" +A terminal description begins with one or more terminal names +separated by \*(``|\*('' (vertical bars). +On initialization of the curses or terminfo interfaces, +\fBsetupterm\fP(3X) copies the terminal names to the array \fBttytype\fP. +.\" +.SS "\fIterminfo\fP Names" +In addition to the variables, \fB\fP also defines a symbol for each +terminfo capability \fIlong name\fP. +These are in terms of the symbol \fBCUR\fP, +which is defined +.PP +.EX +#define CUR ((TERMTYPE *)(cur_term))\-> +.EE +.PP +These symbols provide a faster method of accessing terminfo capabilities +than using \fBtigetstr\fP(3X), etc. +.PP +The actual definition of \fBCUR\fP depends upon the implementation, +but each terminfo library provides these long names defined to point +into the current terminal description loaded into memory. +.\" +.SH NOTES +The low-level terminfo interface is initialized using +\fB\%setupterm\fP(3X). +The upper-level curses interface uses the low-level terminfo interface, +internally. +.\" +.SH PORTABILITY +X/Open Curses does not describe any of these except for \fBcur_term\fP. +(The inclusion of \fBcur_term\fP appears to be an oversight, +since other comparable low-level information is omitted by X/Open). +.PP +Other implementations may have comparable variables. +Some implementations provide the variables in their libraries, +but omit them from the header files. +.PP +All implementations which provide terminfo interfaces add definitions +as described in the \fBTerminfo Names\fP section. +Most, but not all, base the definition upon the \fBcur_term\fP variable. +.SH SEE ALSO +\fB\%curses\fP(3X), +\fB\%curs_terminfo\fP(3X), +\fB\%curs_threads\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/terminfo.head b/contrib/ncurses/man/terminfo.head new file mode 100644 index 00000000..1d712ced --- /dev/null +++ b/contrib/ncurses/man/terminfo.head @@ -0,0 +1,226 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: terminfo.head,v 1.66 2024/05/11 20:39:53 tom Exp $ +.TH terminfo 5 2024-05-11 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "File formats" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ' \(aq +.ds ^ \(ha +.ds ~ \(ti +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ds ' ' +.ds ^ ^ +.ds ~ ~ +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%terminfo\fP \- +terminal capability database +.SH SYNOPSIS +@TERMINFO@/*/* +.SH DESCRIPTION +.I Terminfo +is a database describing terminals, +used by screen-oriented programs such as +\fBnvi\fP(1), +\fBlynx\fP(1), +\fBmutt\fP(1), +and other curses applications, +using high-level calls to libraries such as \fBcurses\fP(3X). +It is also used via low-level calls by non-curses applications +which may be screen-oriented (such as \fB@CLEAR@\fP(1)) +or non-screen (such as \fB@TABS@\fP(1)). +.PP +.I Terminfo +describes terminals by giving a set of capabilities which they +have, by specifying how to perform screen operations, and by +specifying padding requirements and initialization sequences. +.PP +This document describes +.I \%ncurses +version @NCURSES_MAJOR@.@NCURSES_MINOR@ +(patch @NCURSES_PATCH@). +.SS "\fIterminfo\fP Entry Syntax" +Entries in +.I terminfo +consist of a sequence of fields: +.bP +Each field ends with a comma \*(``,\*('' +(embedded commas may be +escaped with a backslash or written as \*(``\e054\*(''). +.bP +White space between fields is ignored. +.bP +The first field in a \fIterminfo\fP entry begins in the first column. +.bP +Newlines and leading whitespace (spaces or tabs) +may be used for formatting entries for readability. +These are removed from parsed entries. +.IP +The \fB@INFOCMP@\fP \fB\-f\fP and \fB\-W\fP options rely on this to +format if-then-else expressions, +or to enforce maximum line-width. +The resulting formatted terminal description can be read by \fB@TIC@\fP. +.bP +The first field for each terminal gives the names which are known for the +terminal, separated by \*(``|\*('' characters. +.IP +The first name given is the most common abbreviation for the terminal +(its primary name), +the last name given should be a long name fully identifying the terminal +(see \fBlongname\fP(3X)), +and all others are treated as synonyms (aliases) for the primary terminal name. +.IP +X/Open Curses advises that all names but the last should be in lower case +and contain no blanks; +the last name may well contain upper case and blanks for readability. +.IP +This implementation is not so strict; +it allows mixed case in the primary name and aliases. +If the last name has no embedded blanks, +it allows that to be both an alias and a verbose name +(but will warn about this ambiguity). +.bP +Lines beginning with a \*(``#\*('' in the first column are treated as comments. +.IP +While comment lines are valid at any point, the output of \fB@CAPTOINFO@\fP +and \fB@INFOTOCAP@\fP (aliases for \fB@TIC@\fP) +will move comments so they occur only between entries. +.PP +Terminal names (except for the last, verbose entry) should +be chosen using the following conventions. +The particular piece of hardware making up the terminal should +have a root name, thus \*(``hp2621\*(''. +This name should not contain hyphens. +Modes that the hardware can be in, or user preferences, should +be indicated by appending a hyphen and a mode suffix. +Thus, a vt100 in 132-column mode would be vt100\-w. +The following suffixes should be used where possible: +.PP +.TS +center; +Lb Lb Lb +L L Lx. +Suffix Example Meaning +_ +\-\fInn\fP aaa\-60 Number of lines on the screen +\-\fIn\fPp c100\-4p Number of pages of memory +\-am vt100\-am With automargins (usually the default) +\-m ansi\-m Mono mode; suppress color +\-mc wy30\-mc Magic cookie; spaces when highlighting +\-na c100\-na No arrow keys (leave them in local) +\-nam vt100\-nam Without automatic margins +\-nl hp2621\-nl No status line +\-ns hp2626\-ns No status line +\-rv c100\-rv Reverse video +\-s vt100\-s Enable status line +\-vb wy370\-vb Use visible bell instead of beep +\-w vt100\-w Wide mode (> 80 columns, usually 132) +.TE +.PP +For more on terminal naming conventions, see the \fBterm\fP(7) manual page. +.SS "\fIterminfo\fP Capabilities Syntax" +The terminfo entry consists of several \fIcapabilities\fP, +i.e., features that the terminal has, +or methods for exercising the terminal's features. +.PP +After the first field (giving the name(s) of the terminal entry), +there should be one or more \fIcapability\fP fields. +These are Boolean, numeric or string names with corresponding values: +.bP +Boolean capabilities are true when present, false when absent. +There is no explicit value for Boolean capabilities. +.bP +Numeric capabilities have a \*(``#\*('' following the name, +then an unsigned decimal integer value. +.bP +String capabilities have a \*(``=\*('' following the name, +then an string of characters making up the capability value. +.IP +String capabilities can be split into multiple lines, +just as the fields comprising a terminal entry can be +split into multiple lines. +While blanks between fields are ignored, +blanks embedded within a string value are retained, +except for leading blanks on a line. +.PP +Any capability can be \fIcanceled\fP, +i.e., suppressed from the terminal entry, +by following its name with \*(``@\*('' +rather than a capability value. +.SS "Similar Terminals" +If there are two very similar terminals, one (the variant) can be defined as +being just like the other (the base) with certain exceptions. +In the +definition of the variant, the string capability \fBuse\fP can be given with +the name of the base terminal: +.bP +The capabilities given before +.B use +override those in the base type named by +.BR use . +.bP +If there are multiple \fBuse\fP capabilities, they are merged in reverse order. +That is, the rightmost \fBuse\fP reference is processed first, then the one to +its left, and so forth. +.bP +Capabilities given explicitly in the entry override +those brought in by \fBuse\fP references. +.PP +A capability can be canceled by placing \fBxx@\fP to the left of the +use reference that imports it, where \fIxx\fP is the capability. +For example, the entry +.RS +.PP +2621\-nl, smkx@, rmkx@, use=2621, +.RE +.PP +defines a 2621\-nl that does not have the \fBsmkx\fP or \fBrmkx\fP capabilities, +and hence does not turn on the function key labels when in visual mode. +This is useful for different modes for a terminal, or for different +user preferences. +.PP +An entry included via \fBuse\fP can contain canceled capabilities, +which have the same effect as if those cancels were inline in the +using terminal entry. +.SS "Predefined Capabilities" +.\" Head of terminfo man page ends here +.ps -1 diff --git a/contrib/ncurses/man/terminfo.tail b/contrib/ncurses/man/terminfo.tail new file mode 100644 index 00000000..b47d2326 --- /dev/null +++ b/contrib/ncurses/man/terminfo.tail @@ -0,0 +1,2128 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: terminfo.tail,v 1.153 2024/09/21 17:54:42 Branden.Robinson Exp $ +.ps +1 +.SS "User-Defined Capabilities" +. +The preceding section listed the \fIpredefined\fP capabilities. +They deal with some special features for terminals no longer +(or possibly never) produced. +Occasionally there are special features of newer terminals which +are awkward or impossible to represent by reusing the predefined +capabilities. +.PP +\fI\%ncurses\fP addresses this limitation by allowing user-defined +capabilities. +The \fB@TIC@\fP and \fB@INFOCMP@\fP programs provide +the \fB\-x\fP option for this purpose. +When \fB\-x\fP is set, +\fB@TIC@\fP treats unknown capabilities as user-defined. +That is, if \fB@TIC@\fP encounters a capability name +which it does not recognize, +it infers its type (Boolean, number or string) from the syntax +and makes an extended table entry for that capability. +The \fBuse_extended_names\fP(3X) function makes this information +conditionally available to applications. +The \fI\%ncurses\fP library provides the data leaving most of the +behavior to applications: +.bP +User-defined capability strings whose name begins +with \*(``k\*('' are treated as function keys. +.bP +The types (Boolean, number, string) determined by \fB@TIC@\fP +can be inferred by successful calls on \fBtigetflag\fP, etc. +.bP +If the capability name happens to be two characters, +the capability is also available through the termcap interface. +.PP +While termcap is said to be extensible because it does not use a predefined set +of capabilities, +in practice it has been limited to the capabilities defined by +terminfo implementations. +As a rule, +user-defined capabilities intended for use by termcap applications should +be limited to Booleans and numbers to avoid running past the 1023 byte +limit assumed by termcap implementations and their applications. +In particular, providing extended sets of function keys (past the 60 +numbered keys and the handful of special named keys) is best done using +the longer names available using terminfo. +.PP +The \fI\%ncurses\fP library uses a few of these user-defined +capabilities, +as described in \fBuser_caps\fR(5). +Other user-defined capabilities (including function keys) are +described in the terminal database, in the section on +.I "NCURSES USER-DEFINABLE CAPABILITIES" +. +.SS "A Sample Entry" +. +The following entry, describing an ANSI-standard terminal, is representative +of what a \fBterminfo\fP entry for a modern terminal typically looks like. +.PP +.EX +\s-2ansi|ansi/pc\-term compatible with color, + am, mc5i, mir, msgr, + colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64, + acsc=+\e020\e,\e021\-\e030.\*^Y0\e333\(ga\e004a\e261f\e370g\e361h\e260 + j\e331k\e277l\e332m\e300n\e305o\*~p\e304q\e304r\e304s_t\e303 + u\e264v\e301w\e302x\e263y\e363z\e362{\e343|\e330}\e234\*~\e376, + bel=\*^G, blink=\eE[5m, bold=\eE[1m, cbt=\eE[Z, clear=\eE[H\eE[J, + cr=\*^M, cub=\eE[%p1%dD, cub1=\eE[D, cud=\eE[%p1%dB, cud1=\eE[B, + cuf=\eE[%p1%dC, cuf1=\eE[C, cup=\eE[%i%p1%d;%p2%dH, + cuu=\eE[%p1%dA, cuu1=\eE[A, dch=\eE[%p1%dP, dch1=\eE[P, + dl=\eE[%p1%dM, dl1=\eE[M, ech=\eE[%p1%dX, ed=\eE[J, el=\eE[K, + el1=\eE[1K, home=\eE[H, hpa=\eE[%i%p1%dG, ht=\eE[I, hts=\eEH, + ich=\eE[%p1%d@, il=\eE[%p1%dL, il1=\eE[L, ind=\*^J, + indn=\eE[%p1%dS, invis=\eE[8m, kbs=\*^H, kcbt=\eE[Z, kcub1=\eE[D, + kcud1=\eE[B, kcuf1=\eE[C, kcuu1=\eE[A, khome=\eE[H, kich1=\eE[L, + mc4=\eE[4i, mc5=\eE[5i, nel=\er\eE[S, op=\eE[39;49m, + rep=%p1%c\eE[%p2%{1}%\-%db, rev=\eE[7m, rin=\eE[%p1%dT, + rmacs=\eE[10m, rmpch=\eE[10m, rmso=\eE[m, rmul=\eE[m, + s0ds=\eE(B, s1ds=\eE)B, s2ds=\eE*B, s3ds=\eE+B, + setab=\eE[4%p1%dm, setaf=\eE[3%p1%dm, + sgr=\eE[0;10%?%p1%t;7%; + %?%p2%t;4%; + %?%p3%t;7%; + %?%p4%t;5%; + %?%p6%t;1%; + %?%p7%t;8%; + %?%p9%t;11%;m, + sgr0=\eE[0;10m, smacs=\eE[11m, smpch=\eE[11m, smso=\eE[7m, + smul=\eE[4m, tbc=\eE[3g, u6=\eE[%i%d;%dR, u7=\eE[6n, + u8=\eE[?%[;0123456789]c, u9=\eE[c, vpa=\eE[%i%p1%dd, +.EE +.PP +Entries may continue onto multiple lines by placing white space at +the beginning of each line except the first. +Comments may be included on lines beginning with \*(``#\*(''. +Capabilities in +.I terminfo +are of three types: +.bP +Boolean capabilities which indicate that the terminal has +some particular feature, +.bP +numeric capabilities giving the size of the terminal +or the size of particular delays, and +.bP +string +capabilities, which give a sequence which can be used to perform particular +terminal operations. +.SS "Types of Capabilities" +All capabilities have names. +For instance, the fact that +ANSI-standard terminals have +.I "automatic margins" +(i.e., an automatic return and line-feed +when the end of a line is reached) is indicated by the capability \fBam\fP. +Hence the description of ansi includes \fBam\fP. +Numeric capabilities are followed by the character \*(``#\*('' +and then a positive value. +Thus \fBcols\fP, which indicates the number of columns the terminal has, +gives the value \*(``80\*('' for ansi. +Values for numeric capabilities may be specified in +decimal, +octal, or +hexadecimal, +using the C programming language conventions +(e.g., 255, 0377 and 0xff or 0xFF). +.PP +Finally, string valued capabilities, +such as \fBel\fP (clear to end of line sequence) +are given by the two-character code, +an \*(``=\*('', and then +a string ending at the next following \*(``,\*(''. +.PP +A number of escape sequences are provided in the string valued capabilities +for easy encoding of characters there: +.bP +Both \fB\eE\fP and \fB\ee\fP +map to an \s-1ESCAPE\s0 character, +.bP +\fB\*^\f(BIx\fR maps to a control-\fIx\fP for any appropriate \fIx\fP, +and +.bP +the sequences +.RS 6 +.PP +\fB\en\fP, \fB\el\fP, \fB\er\fP, \fB\et\fP, \fB\eb\fP, \fB\ef\fP, and \fB\es\fP +.RE +.IP +produce +.RS 6 +.PP +\fInewline\fP, \fIline-feed\fP, \fIreturn\fP, \fItab\fP, \fIbackspace\fP, \fIform-feed\fP, and \fIspace\fP, +.RE +.IP +respectively. +.PP +X/Open Curses does not say what \*(``appropriate \fIx\fP\*('' might be. +In practice, that is a printable ASCII graphic character. +The special case \*(``\*^?\*('' is interpreted as DEL (127). +In all other cases, the character value is AND'd with 0x1f, +mapping to ASCII control codes in the range 0 through 31. +.PP +Other escapes include +.bP +\fB\e\*^\fP for \fB\*^\fP, +.bP +\fB\e\e\fP for \fB\e\fP, +.bP +\fB\e\fP, for comma, +.bP +\fB\e:\fP for \fB:\fP, +.bP +and \fB\e0\fP for null. +.IP +\fB\e0\fP will produce \e200, which does not terminate a string but behaves +as a null character on most terminals, providing CS7 is specified. +See \fBstty\fP(1). +.IP +The reason for this quirk is to maintain binary compatibility of the +compiled terminfo files with other implementations, +e.g., the SVr4 systems, which document this. +Compiled terminfo files use null-terminated strings, with no lengths. +Modifying this would require a new binary format, +which would not work with other implementations. +.PP +Finally, characters may be given as three octal digits after a \fB\e\fP. +.PP +A delay in milliseconds may appear anywhere in a string capability, enclosed in +$<..> brackets, as in \fBel\fP=\eEK$<5>, +and padding characters are supplied by \fBtputs\fP(3X) +to provide this delay. +.bP +The delay must be a number with at most one decimal +place of precision; +it may be followed by suffixes \*(``*\*('' or \*(``/\*('' or both. +.bP +A \*(``*\*('' +indicates that the padding required is proportional to the number of lines +affected by the operation, and the amount given is the per-affected-unit +padding required. +(In the case of insert character, the factor is still the +number of \fIlines\fP affected.) +.IP +Normally, padding is advisory if the device has the \fBxon\fP +capability; it is used for cost computation but does not trigger delays. +.bP +A \*(``/\*('' +suffix indicates that the padding is mandatory and forces a delay of the given +number of milliseconds even on devices for which \fBxon\fP is present to +indicate flow control. +.PP +Sometimes individual capabilities must be commented out. +To do this, put a period before the capability name. +For example, see the second +.B ind +in the example above. +.br +.ne 5 +.SS "Fetching Compiled Descriptions" +Terminal descriptions in \fI\%ncurses\fP are stored in terminal +databases. +These databases, which are found by their pathname, +may be configured either as directory trees or hashed databases +(see \fBterm\fR(5)), +.PP +The library uses a compiled-in list of pathnames, +which can be overridden by environment variables. +Before starting to search, +\fI\%ncurses\fP checks the search list, +eliminating duplicates and pathnames where no terminal database is found. +The \fI\%ncurses\fP library reads the first description +which passes its consistency checks. +.bP +The environment variable \fBTERMINFO\fR is checked first, for +a terminal database containing the terminal description. +.bP +Next, +\fI\%ncurses\fP looks in \fI$HOME/.terminfo\fP +for a compiled description. +.IP +This is an optional feature which may be omitted entirely from +the library, or limited to prevent accidental use by privileged applications. +.bP +Next, +if the environment variable \fI\%TERMINFO_DIRS\fP is set, +\fI\%ncurses\fP interprets the contents of that variable +as a list of colon-separated pathnames of terminal databases to be searched. +.IP +An empty pathname (i.e., if the variable begins or ends +with a colon, or contains adjacent colons) +is interpreted as the system location \fI@TERMINFO@\fP. +.bP +Finally, \fI\%ncurses\fP searches these compiled-in locations: +.RS +.bP +a list of directories (@TERMINFO_DIRS@), and +.bP +the system terminfo directory, \fI@TERMINFO@\fP +.RE +.PP +The \fBTERMINFO\fP variable can contain a terminal description instead +of the pathname of a terminal database. +If this variable begins with \*(``hex:\*('' or \*(``b64:\*('' +then \fI\%ncurses\fP reads a terminal description from +hexadecimal- or base64-encoded data, +and if that description matches the name sought, will use that. +This encoded data can be set using the \*(``\-Q\*('' option of +\fB@TIC@\fR or \fB@INFOCMP@\fR. +.PP +The preceding addresses the usual configuration of \fI\%ncurses\fP, +which uses terminal descriptions prepared in \fIterminfo\fP format. +While \fItermcap\fP is less expressive, +\fI\%ncurses\fP can also be configured to read \fItermcap\fP +descriptions. +In that configuration, +it checks the \fI\%TERMCAP\fP and \fI\%TERMPATH\fP variables +(for content and search path, +respectively) +after the system terminal database. +.SS "Preparing Descriptions" +We now outline how to prepare descriptions of terminals. +The most effective way to prepare a terminal description is by imitating +the description of a similar terminal in +.I terminfo +and to build up a description gradually, using partial descriptions +with +.I vi +or some other screen-oriented program to check that they are correct. +Be aware that a very unusual terminal may expose deficiencies in +the ability of the +.I terminfo +file to describe it +or bugs in the screen-handling code of the test program. +.PP +To get the padding for insert line right (if the terminal manufacturer +did not document it) a severe test is to edit a large file at 9600 baud, +delete 16 or so lines from the middle of the screen, then hit the \*(``u\*('' +key several times quickly. +If the terminal messes up, more padding is usually needed. +A similar test can be used for insert character. +.SS "Basic Capabilities" +The number of columns on each line for the terminal is given by the +\fBcols\fP numeric capability. +If the terminal is a \s-1CRT\s0, then the +number of lines on the screen is given by the \fBlines\fP capability. +If the terminal wraps around to the beginning of the next line when +it reaches the right margin, then it should have the \fBam\fP capability. +If the terminal can clear its screen, leaving the cursor in the home +position, then this is given by the \fBclear\fP string capability. +If the terminal overstrikes +(rather than clearing a position when a character is struck over) +then it should have the \fBos\fP capability. +If the terminal is a printing terminal, with no soft copy unit, +give it both +.B hc +and +.BR os . +.RB ( os +applies to storage scope terminals, such as \s-1TEKTRONIX\s+1 4010 +series, as well as hard copy and APL terminals.) +If there is a code to move the cursor to the left edge of the current +line, give this as +.BR cr . +(Normally this will be carriage return, control/M.) +If there is a code to produce an audible signal (bell, beep, etc) +give this as +.BR bel . +.PP +If there is a code to move the cursor one position to the left +(such as backspace) that capability should be given as +.BR cub1 . +Similarly, codes to move to the right, up, and down should be +given as +.BR cuf1 , +.BR cuu1 , +and +.BR cud1 . +These local cursor motions should not alter the text they pass over, +for example, you would not normally use \*(``\fBcuf1\fP=\ \*('' because the +space would erase the character moved over. +.PP +A very important point here is that the local cursor motions encoded +in +.I terminfo +are undefined at the left and top edges of a \s-1CRT\s0 terminal. +Programs should never attempt to backspace around the left edge, +unless +.B bw +is given, +and never attempt to go up locally off the top. +In order to scroll text up, a program will go to the bottom left corner +of the screen and send the +.B ind +(index) string. +.PP +To scroll text down, a program goes to the top left corner +of the screen and sends the +.B ri +(reverse index) string. +The strings +.B ind +and +.B ri +are undefined when not on their respective corners of the screen. +.PP +Parameterized versions of the scrolling sequences are +.B indn +and +.B rin +which have the same semantics as +.B ind +and +.B ri +except that they take one parameter, and scroll that many lines. +They are also undefined except at the appropriate edge of the screen. +.PP +The \fBam\fP capability tells whether the cursor sticks at the right +edge of the screen when text is output, but this does not necessarily +apply to a +.B cuf1 +from the last column. +The only local motion which is defined from the left edge is if +.B bw +is given, then a +.B cub1 +from the left edge will move to the right edge of the previous line. +If +.B bw +is not given, the effect is undefined. +This is useful for drawing a box around the edge of the screen, for example. +If the terminal has switch selectable automatic margins, +the +.I terminfo +file usually assumes that this is on; i.e., \fBam\fP. +If the terminal has a command which moves to the first column of the next +line, that command can be given as +.B nel +(newline). +It does not matter if the command clears the remainder of the current line, +so if the terminal has no +.B cr +and +.B lf +it may still be possible to craft a working +.B nel +out of one or both of them. +.PP +These capabilities suffice to describe +hard-copy and \*(``glass-tty\*('' terminals. +Thus the model 33 teletype is described as +.PP +.EX +.\".in -2 +\s-133\||\|tty33\||\|tty\||\|model 33 teletype, + bel=\*^G, cols#72, cr=\*^M, cud1=\*^J, hc, ind=\*^J, os,\s+1 +.\".in +2 +.EE +.PP +while the Lear Siegler \s-1ADM-3\s0 is described as +.PP +.EX +.\".in -2 +\s-1adm3\||\|3\||\|lsi adm3, + am, bel=\*^G, clear=\*^Z, cols#80, cr=\*^M, cub1=\*^H, cud1=\*^J, + ind=\*^J, lines#24,\s+1 +.\".in +2 +.EE +.SS "Parameterized Strings" +Cursor addressing and other strings requiring parameters +in the terminal are described by a +parameterized string capability, +with \fIprintf\fP-like escapes such as \fI%x\fP in it. +For example, to address the cursor, the +.B cup +capability is given, using two parameters: +the line and column to address to. +(Lines and columns are numbered from zero and refer to the +physical screen visible to the user, not to any unseen memory.) +If the terminal has memory relative cursor addressing, +that can be indicated by +.BR mrcup . +.PP +The parameter mechanism uses a stack and special \fB%\fP codes +to manipulate it. +Typically a sequence will push one of the +parameters onto the stack and then print it in some format. +Print (e.g., \*(``%d\*('') is a special case. +Other operations, including \*(``%t\*('' pop their operand from the stack. +It is noted that more complex operations are often necessary, +e.g., in the \fBsgr\fP string. +.PP +The \fB%\fP encodings have the following meanings: +.TP 5 +\fB%%\fP +outputs \*(``%\*('' +.TP +\fB%\fI[[\fR:\fI]flags][width[.precision]][\fBdoxXs\fI]\fR +as in \fBprintf\fP(3), flags are \fI[\-+#]\fP and \fIspace\fP. +Use a \*(``:\*('' to allow the next character to be a \*(``\-\*('' flag, +avoiding interpreting \*(``%\-\*('' as an operator. +.TP +\fB%c\fP +print \fIpop()\fP like %c in \fBprintf\fP +.TP +\fB%s\fP +print \fIpop()\fP like %s in \fBprintf\fP +.TP +\fB%p\fI[1\-9]\fR +push \fIi\fP'th parameter +.TP +\fB%P\fI[a\-z]\fR +set dynamic variable \fI[a\-z]\fP to \fIpop()\fP +.TP +\fB%g\fI[a\-z]\fR +get dynamic variable \fI[a\-z]\fP and push it +.TP +\fB%P\fI[A\-Z]\fR +set static variable \fI[a\-z]\fP to \fIpop()\fP +.TP +\fB%g\fI[A\-Z]\fR +get static variable \fI[a\-z]\fP and push it +.IP +The terms \*(``static\*('' and \*(``dynamic\*('' are misleading. +Historically, these are simply two different sets of variables, +whose values are not reset between calls to \fBtparm\fP(3X). +However, that fact is not documented in other implementations. +Relying on it will adversely impact portability to other implementations: +.RS +.bP +SVr2 curses supported \fIdynamic\fP variables. +Those are set only by a \fB%P\fP operator. +A \fB%g\fP for a given variable without first setting it with \fB%P\fP +will give unpredictable results, because dynamic variables are +an uninitialized local array on the stack in the \fBtparm\fP function. +.bP +SVr3.2 curses supported \fIstatic\fP variables. +Those are an array in the \fI\%TERMINAL\fP +structure (declared in \fBterm.h\fP), +and are zeroed automatically when the \fBsetupterm\fP function +allocates the data. +.bP +SVr4 curses made no further improvements +to the \fIdynamic/static\fP variable feature. +.bP +Solaris XPG4 curses does not distinguish between \fIdynamic\fP and +\fIstatic\fP variables. +They are the same. +Like SVr4 curses, XPG4 curses does not initialize these explicitly. +.bP +Before version 6.3, +\fI\%ncurses\fP stores both \fIdynamic\fP and \fIstatic\fP +variables in persistent storage, initialized to zeros. +.bP +Beginning with version 6.3, +\fI\%ncurses\fP stores \fIstatic\fP and \fIdynamic\fP +variables in the same manner as SVr4. +.RS +.bP +Unlike other implementations, \fI\%ncurses\fP zeros dynamic variables +before the first \fB%g\fP or \fB%P\fP operator. +.bP +Like SVr2, +the scope of dynamic variables in \fI\%ncurses\fP +is within the current call to +\fBtparm\fP. +Use static variables if persistent storage is needed. +.RE +.RE +.TP +\fB%\*'\fIc\fB\*'\fR +char constant \fIc\fP +.TP +\fB%{\fInn\fB}\fR +integer constant \fInn\fP +.TP +\fB%l\fP +push strlen(pop) +.TP +\fB%+\fP, \fB%\-\fP, \fB%*\fP, \fB%/\fP, \fB%m\fP +arithmetic (%m is \fImod\fP): \fIpush(pop() op pop())\fP +.TP +\fB%&\fP, \fB%|\fP, \fB%\*^\fP +bit operations (AND, OR and exclusive-OR): \fIpush(pop() op pop())\fP +.TP +\fB%=\fP, \fB%>\fP, \fB%<\fP +logical operations: \fIpush(pop() op pop())\fP +.TP +\fB%A\fP, \fB%O\fP +logical AND and OR operations (for conditionals) +.TP +\fB%!\fP, \fB%\*~\fP +unary operations (logical and bit complement): \fIpush(op pop())\fP +.TP +\fB%i\fP +add 1 to first two parameters (for ANSI terminals) +.TP +\fB%?\fP \fIexpr\fP \fB%t\fP \fIthenpart\fP \fB%e\fP \fIelsepart\fP \fB%;\fP +This forms an if-then-else. +The \fB%e\fP \fIelsepart\fP is optional. +Usually the \fB%?\fP \fIexpr\fP part pushes a value onto the stack, +and \fB%t\fP pops it from the stack, testing if it is nonzero (true). +If it is zero (false), control passes to the \fB%e\fP (else) part. +.IP +It is possible to form else-if's a la Algol 68: +.RS +\fB%?\fP c\d1\u \fB%t\fP b\d1\u \fB%e\fP c\d2\u \fB%t\fP b\d2\u \fB%e\fP c\d3\u \fB%t\fP b\d3\u \fB%e\fP c\d4\u \fB%t\fP b\d4\u \fB%e\fP \fB%;\fP +.RE +.IP +where c\di\u are conditions, b\di\u are bodies. +.IP +Use the \fB\-f\fP option of \fB@TIC@\fP or \fB@INFOCMP@\fP to see +the structure of if-then-else's. +Some strings, e.g., \fBsgr\fP can be very complicated when written +on one line. +The \fB\-f\fP option splits the string into lines with the parts indented. +.PP +Binary operations are in postfix form with the operands in the usual order. +That is, to get x\-5 one would use \*(``%gx%{5}%\-\*(''. +\fB%P\fP and \fB%g\fP variables are +persistent across escape-string evaluations. +.PP +Consider the HP2645, which, to get to line 3 and column 12, needs +to be sent \eE&a12c03Y padded for 6 milliseconds. +The order of the lines and columns is inverted here, +and the lines and column are printed as two digits. +The corresponding terminal description is expressed thus: +.RS +cup=\eE&a%p2%dc%p1%dY$<6>, +.RE +.PP +The Microterm \s-1ACT-IV\s0 needs the current line and column sent +preceded by a \fB\*^T\fP, with the line and column simply encoded in binary, +.RS +cup=\*^T%p1%c%p2%c +.RE +.PP +Terminals which use \*(``%c\*('' need to be able to +backspace the cursor (\fBcub1\fP), +and to move the cursor up one line on the screen (\fBcuu1\fP). +This is necessary because it is not always safe to transmit \fB\en\fP +\fB\*^D\fP and \fB\er\fP, as the system may change or discard them. +(The library routines dealing with terminfo set tty modes so that +tabs are never expanded, so \et is safe to send. +This turns out to be essential for the Ann Arbor 4080.) +.PP +A final example is the \s-1LSI ADM\s0-3a, which uses line and column +offset by a blank character, thus +.RS +cup=\eE=%p1%\*' \*'%+%c%p2%\*' \*'%+%c +.RE +.PP +After sending \*(``\eE=\*('', this pushes the first parameter, pushes the +ASCII value for a space (32), adds them (pushing the sum on the stack +in place of the two previous values) and outputs that value as a character. +Then the same is done for the second parameter. +More complex arithmetic is possible using the stack. +.SS "Cursor Motions" +If the terminal has a fast way to home the cursor +(to very upper left corner of screen) then this can be given as +\fBhome\fP; similarly a fast way of getting to the lower left-hand corner +can be given as \fBll\fP; this may involve going up with \fBcuu1\fP +from the home position, +but a program should never do this itself (unless \fBll\fP does) because it +can make no assumption about the effect of moving up from the home position. +Note that the home position is the same as addressing to (0,0): +to the top left corner of the screen, not of memory. +(Thus, the \eEH sequence on HP terminals cannot be used for +.BR home .) +.PP +If the terminal has line or column absolute cursor addressing, +these can be given as single parameter capabilities +.B hpa +(horizontal position absolute) +and +.B vpa +(vertical position absolute). +Sometimes these are shorter than the more general two parameter +sequence (as with the hp2645) and can be used in preference to +.BR cup . +If there are parameterized local motions (e.g., move +.I n +spaces to the right) these can be given as +.BR cud , +.BR cub , +.BR cuf , +and +.B cuu +with a single parameter indicating how many spaces to move. +These are primarily useful if the terminal does not have +.BR cup , +such as the \s-1TEKTRONIX\s+1 4025. +.PP +If the terminal needs to be in a special mode when running +a program that uses these capabilities, +the codes to enter and exit this mode can be given +as \fBsmcup\fP and \fBrmcup\fP. +This arises, for example, from terminals like the Concept with more than +one page of memory. +If the terminal has only memory relative cursor addressing and not screen +relative cursor addressing, a one screen-sized window must be fixed into +the terminal for cursor addressing to work properly. +This is also used for the \s-1TEKTRONIX\s+1 4025, +where +.B smcup +sets the command character to be the one used by terminfo. +If the \fBsmcup\fP sequence will not restore the screen after an +\fBrmcup\fP sequence is output (to the state prior to outputting +\fBrmcup\fP), specify \fBnrrmc\fP. +.SS Margins +SVr4 (and X/Open Curses) +list several string capabilities for setting margins. +Two were intended for use with terminals, +and another six were intended for use with printers. +.bP +The two terminal capabilities assume that the terminal may have +the capability of setting the left and/or right margin at the current +cursor column position. +.bP +The printer capabilities assume that the printer may have +two types of capability: +.RS +.bP +the ability to set a top and/or bottom margin using the current +line position, and +.bP +parameterized capabilities for setting the top, bottom, left, right margins +given the number of lines or columns. +.RE +.PP +In practice, the categorization into \*(``terminal\*('' and \*(``printer\*('' +is not suitable: +.bP +The AT&T SVr4 terminal database uses \fBsmgl\fP four times, +for AT&T hardware. +.IP +Three of the four are printers. +They lack the ability to set left/right margins by specifying the column. +.bP +Other (non-AT&T) terminals may support margins +but using different assumptions from AT&T. +.IP +For instance, the DEC VT420 supports left/right margins, +but only using a column parameter. +As an added complication, the VT420 uses two settings to fully enable +left/right margins (left/right margin mode, and origin mode). +The former enables the margins, which causes printed text +to wrap within margins, but the latter is needed to prevent +cursor-addressing outside those margins. +.bP +Both DEC VT420 left/right margins are set with a single control sequence. +If either is omitted, the corresponding margin is set to the left or +right edge of the display (rather than leaving the margin unmodified). +.PP +These are the margin-related capabilities: +.PP +.TS +center; +lb lb +lb l . +Name Description +_ +smgl Set left margin at current column +smgr Set right margin at current column +smgb Set bottom margin at current line +smgt Set top margin at current line +smgbp Set bottom margin at line \fIN\fP +smglp Set left margin at column \fIN\fP +smgrp Set right margin at column \fIN\fP +smgtp Set top margin at line \fIN\fP +smglr Set both left and right margins to \fIL\fP and \fIR\fP +smgtb Set both top and bottom margins to \fIT\fP and \fIB\fP +.TE +.PP +When writing an application that +uses these string capabilities, +the pairs should be first checked to see +if each capability in the pair is set or only one is set: +.bP +If both \fBsmglp\fP and \fBsmgrp\fP are set, +each is used with a single argument, \fIN\fP, +that gives the column number of the left and right margin, respectively. +.bP +If both \fBsmgtp\fP and \fBsmgbp\fP are set, +each is used to set the top and bottom margin, +respectively: +.RS 4 +.bP +\fBsmgtp\fP is used with a single argument, \fIN\fP, +the line number of the top margin. +.bP +\fBsmgbp\fP is used with two arguments, \fIN\fP and \fIM\fP, +that give the line number of the bottom margin, +the first counting from the top of the +page and the second counting from the bottom. +This accommodates the two styles of specifying +the bottom margin in different manufacturers' printers. +.RE +.IP +When designing a terminfo entry for a +printer that has a settable bottom margin, +only the first or second argument should be used, depending on the printer. +When developing an application that uses \fBsmgbp\fP to set the bottom margin, +both arguments must be given. +.PP +Conversely, when only one capability in the pair is set: +.bP +If only one of \fBsmglp\fP and \fBsmgrp\fP is set, +then it is used with two arguments, +the column number of the left and right margins, in that order. +.bP +Likewise, if only one of \fBsmgtp\fP and \fBsmgbp\fP is set, then it +is used with two arguments that give the top and bottom margins, +in that order, counting from the top of the page. +.IP +When designing a terminfo entry for a printer that requires setting both +left and right or top and bottom margins simultaneously, +only one capability in the pairs +\fBsmglp\fP and \fBsmgrp\fP or +\fBsmgtp\fP and \fBsmgbp\fP should be defined, +leaving the other unset. +.PP +Except for very old terminal descriptions, e.g., those developed for SVr4, +the scheme just described should be considered obsolete. +An improved set of capabilities was added late in the SVr4 releases +(\fBsmglr\fP and \fBsmgtb\fP), +which explicitly use two parameters for setting the left/right or top/bottom +margins. +.PP +When setting margins, the line- and column-values are zero-based. +.PP +The \fBmgc\fP string capability should be defined. +Applications such as \fBtabs\fP(1) rely upon this to reset all margins. +.\" +.SS "Area Clears" +If the terminal can clear from the current position to the end of the +line, leaving the cursor where it is, this should be given as \fBel\fP. +If the terminal can clear from the beginning of the line to the current +position inclusive, leaving +the cursor where it is, this should be given as \fBel1\fP. +If the terminal can clear from the current position to the end of the +display, then this should be given as \fBed\fP. +\fBEd\fP is only defined from the first column of a line. +(Thus, it can be simulated by a request to delete a large number of lines, +if a true +.B ed +is not available.) +.\" +.SS "Insert/Delete Line and Vertical Motions" +If the terminal can open a new blank line before the line where the cursor +is, this should be given as \fBil1\fP; this is done only from the first +position of a line. +The cursor must then appear on the newly blank line. +If the terminal can delete the line which the cursor is on, then this +should be given as \fBdl1\fP; this is done only from the first position on +the line to be deleted. +Versions of +.B il1 +and +.B dl1 +which take a single parameter and insert or delete that many lines can +be given as +.B il +and +.BR dl . +.PP +If the terminal has a settable scrolling region (like the vt100) +the command to set this can be described with the +.B csr +capability, which takes two parameters: +the top and bottom lines of the scrolling region. +The cursor position is, alas, undefined after using this command. +.PP +It is possible to get the effect of insert or delete line using +.B csr +on a properly chosen region; the +.B sc +and +.B rc +(save and restore cursor) commands may be useful for ensuring that +your synthesized insert/delete string does not move the cursor. +(Note that the \fB\%ncurses\fP(3X) library does this synthesis +automatically, so you need not compose insert/delete strings for +an entry with \fBcsr\fP). +.PP +Yet another way to construct insert and delete might be to use a combination of +index with the memory-lock feature found on some terminals (like the HP-700/90 +series, which however also has insert/delete). +.PP +Inserting lines at the top or bottom of the screen can also be +done using +.B ri +or +.B ind +on many terminals without a true insert/delete line, +and is often faster even on terminals with those features. +.PP +The Boolean \fBnon_dest_scroll_region\fP should be set if each scrolling +window is effectively a view port on a screen-sized canvas. +To test for +this capability, create a scrolling region in the middle of the screen, +write something to the bottom line, move the cursor to the top of the region, +and do \fBri\fP followed by \fBdl1\fP or \fBind\fP. +If the data scrolled +off the bottom of the region by the \fBri\fP re-appears, then scrolling +is non-destructive. +System V and X/Open Curses expect that \fBind\fP, \fBri\fP, +\fBindn\fP, and \fBrin\fP will simulate destructive scrolling; their +documentation cautions you not to define \fBcsr\fP unless this is true. +This \fBcurses\fP implementation is more liberal and will do explicit erases +after scrolling if \fBndsrc\fP is defined. +.PP +If the terminal has the ability to define a window as part of +memory, which all commands affect, +it should be given as the parameterized string +.BR wind . +The four parameters are the starting and ending lines in memory +and the starting and ending columns in memory, in that order. +.PP +If the terminal can retain display memory above, then the +\fBda\fP capability should be given; if display memory can be retained +below, then \fBdb\fP should be given. +These indicate +that deleting a line or scrolling may bring non-blank lines up from below +or that scrolling back with \fBri\fP may bring down non-blank lines. +.SS "Insert/Delete Character" +There are two basic kinds of intelligent terminals with respect to +insert/delete character which can be described using +.IR terminfo . +The most common insert/delete character operations affect only the characters +on the current line and shift characters off the end of the line rigidly. +Other terminals, such as the Concept 100 and the Perkin Elmer Owl, make +a distinction between typed and untyped blanks on the screen, shifting +upon an insert or delete only to an untyped blank on the screen which is +either eliminated, or expanded to two untyped blanks. +.PP +You can determine the +kind of terminal you have by clearing the screen and then typing +text separated by cursor motions. +Type \*(``abc\ \ \ \ def\*('' using local +cursor motions (not spaces) between the \*(``abc\*('' and the \*(``def\*(''. +Then position the cursor before the \*(``abc\*('' and put the terminal in insert +mode. +If typing characters causes the rest of the line to shift +rigidly and characters to fall off the end, then your terminal does +not distinguish between blanks and untyped positions. +If the \*(``abc\*('' +shifts over to the \*(``def\*('' which then move together around the end of the +current line and onto the next as you insert, you have the second type of +terminal, and should give the capability \fBin\fP, which stands for +\*(``insert null\*(''. +.PP +While these are two logically separate attributes (one line versus multi-line +insert mode, and special treatment of untyped spaces) we have seen no +terminals whose insert mode cannot be described with the single attribute. +.PP +Terminfo can describe both terminals which have an insert mode, and terminals +which send a simple sequence to open a blank position on the current line. +Give as \fBsmir\fP the sequence to get into insert mode. +Give as \fBrmir\fP the sequence to leave insert mode. +Now give as \fBich1\fP any sequence needed to be sent just before sending +the character to be inserted. +Most terminals with a true insert mode +will not give \fBich1\fP; terminals which send a sequence to open a screen +position should give it here. +.PP +If your terminal has both, insert mode is usually preferable to \fBich1\fP. +Technically, you should not give both unless the terminal actually requires +both to be used in combination. +Accordingly, some non-curses applications get +confused if both are present; the symptom is doubled characters in an update +using insert. +This requirement is now rare; most \fBich\fP sequences do not +require previous smir, and most smir insert modes do not require \fBich1\fP +before each character. +Therefore, the new \fBcurses\fP actually assumes this +is the case and uses either \fBrmir\fP/\fBsmir\fP or \fBich\fP/\fBich1\fP as +appropriate (but not both). +If you have to write an entry to be used under +new curses for a terminal old enough to need both, include the +\fBrmir\fP/\fBsmir\fP sequences in \fBich1\fP. +.PP +If post insert padding is needed, give this as a number of milliseconds +in \fBip\fP (a string option). +Any other sequence which may need to be +sent after an insert of a single character may also be given in \fBip\fP. +If your terminal needs both to be placed into an \*(``insert mode\*('' and +a special code to precede each inserted character, then both +.BR smir / rmir +and +.B ich1 +can be given, and both will be used. +The +.B ich +capability, with one parameter, +.IR n , +will repeat the effects of +.B ich1 +.I n +times. +.PP +If padding is necessary between characters typed while not +in insert mode, give this as a number of milliseconds padding in \fBrmp\fP. +.PP +It is occasionally necessary to move around while in insert mode +to delete characters on the same line (e.g., if there is a tab after +the insertion position). +If your terminal allows motion while in +insert mode you can give the capability \fBmir\fP to speed up inserting +in this case. +Omitting \fBmir\fP will affect only speed. +Some terminals +(notably Datamedia's) must not have \fBmir\fP because of the way their +insert mode works. +.PP +Finally, you can specify +.B dch1 +to delete a single character, +.B dch +with one parameter, +.IR n , +to delete +.IR n "characters," +and delete mode by giving \fBsmdc\fP and \fBrmdc\fP +to enter and exit delete mode (any mode the terminal needs to be placed +in for +.B dch1 +to work). +.PP +A command to erase +.I n +characters (equivalent to outputting +.I n +blanks without moving the cursor) +can be given as +.B ech +with one parameter. +.SS "Highlighting, Underlining, and Visible Bells" +If your terminal has one or more kinds of display attributes, +these can be represented in a number of different ways. +You should choose one display form as +\f2standout mode\fP, +representing a good, high contrast, easy-on-the-eyes, +format for highlighting error messages and other attention getters. +(If you have a choice, reverse video plus half-bright is good, +or reverse video alone.) +The sequences to enter and exit standout mode +are given as \fBsmso\fP and \fBrmso\fP, respectively. +If the code to change into or out of standout +mode leaves one or even two blank spaces on the screen, +as the TVI 912 and Teleray 1061 do, +then \fBxmc\fP should be given to tell how many spaces are left. +.PP +Codes to begin underlining and end underlining can be given as \fBsmul\fP +and \fBrmul\fP respectively. +If the terminal has a code to underline the current character and move +the cursor one space to the right, +such as the Microterm Mime, +this can be given as \fBuc\fP. +.PP +Other capabilities to enter various highlighting modes include +.B blink +(blinking) +.B bold +(bold or extra bright) +.B dim +(dim or half-bright) +.B invis +(blanking or invisible text) +.B prot +(protected) +.B rev +(reverse video) +.B sgr0 +(turn off +.I all +attribute modes) +.B smacs +(enter alternate character set mode) +and +.B rmacs +(exit alternate character set mode). +Turning on any of these modes singly may or may not turn off other modes. +.PP +If there is a sequence to set arbitrary combinations of modes, +this should be given as +.B sgr +(set attributes), +taking 9 parameters. +Each parameter is either zero (0) or nonzero, +as the corresponding attribute is on or off. +The 9 parameters are, in order: +standout, underline, reverse, blink, dim, bold, blank, protect, alternate +character set. +Not all modes need be supported by +.BR sgr , +only those for which corresponding separate attribute commands exist. +.PP +For example, the DEC vt220 supports most of the modes: +.PP +.TS +center; +lb lb lb +l l l . +tparm Parameter Attribute Escape Sequence +_ +none none \eE[0m +p1 standout \eE[0;1;7m +p2 underline \eE[0;4m +p3 reverse \eE[0;7m +p4 blink \eE[0;5m +p5 dim not available +p6 bold \eE[0;1m +p7 invis \eE[0;8m +p8 protect not used +p9 altcharset \*^O (off) \*^N (on) +.TE +.PP +We begin each escape sequence by turning off any existing modes, since +there is no quick way to determine whether they are active. +Standout is set up to be the combination of reverse and bold. +The vt220 terminal has a protect mode, +though it is not commonly used in sgr +because it protects characters on the screen from the host's erasures. +The altcharset mode also is different in that it is either \*^O or \*^N, +depending on whether it is off or on. +If all modes are turned on, the resulting sequence is \eE[0;1;4;5;7;8m\*^N. +.PP +Some sequences are common to different modes. +For example, ;7 is output when either p1 or p3 is true, that is, if +either standout or reverse modes are turned on. +.PP +Writing out the above sequences, along with their dependencies yields +.PP +.ne 11 +.TS +center; +lb lb lb +l l l . +Sequence When to Output terminfo Translation +_ +\eE[0 always \eE[0 +;1 if p1 or p6 %?%p1%p6%|%t;1%; +;4 if p2 %?%p2%|%t;4%; +;5 if p4 %?%p4%|%t;5%; +;7 if p1 or p3 %?%p1%p3%|%t;7%; +;8 if p7 %?%p7%|%t;8%; +m always m +\*^N or \*^O if p9 \*^N, else \*^O %?%p9%t\*^N%e\*^O%; +.TE +.PP +Putting this all together into the sgr sequence gives: +.PP +.EX + sgr=\eE[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p4%t;5%; + %?%p1%p3%|%t;7%;%?%p7%t;8%;m%?%p9%t\e016%e\e017%;, +.EE +.PP +Remember that if you specify sgr, you must also specify sgr0. +Also, some implementations rely on sgr being given if sgr0 is, +Not all terminfo entries necessarily have an sgr string, however. +Many terminfo entries are derived from termcap entries +which have no sgr string. +The only drawback to adding an sgr string is that termcap also +assumes that sgr0 does not exit alternate character set mode. +.PP +Terminals with the \*(``magic cookie\*('' glitch +.RB ( xmc ) +deposit special \*(``cookies\*('' when they receive mode-setting sequences, +which affect the display algorithm rather than having extra bits for +each character. +Some terminals, such as the HP 2621, automatically leave standout +mode when they move to a new line or the cursor is addressed. +Programs using standout mode should exit standout mode before +moving the cursor or sending a newline, +unless the +.B msgr +capability, asserting that it is safe to move in standout mode, is present. +.PP +If the terminal has +a way of flashing the screen to indicate an error quietly (a bell replacement) +then this can be given as \fBflash\fP; it must not move the cursor. +.PP +If the cursor needs to be made more visible than normal when it is +not on the bottom line (to make, for example, a non-blinking underline into an +easier to find block or blinking underline) +give this sequence as +.BR cvvis . +If there is a way to make the cursor completely invisible, give that as +.BR civis . +The capability +.B cnorm +should be given which undoes the effects of both of these modes. +.PP +If your terminal correctly generates underlined characters +(with no special codes needed) +even though it does not overstrike, +then you should give the capability \fBul\fP. +If a character overstriking another leaves both characters on the screen, +specify the capability \fBos\fP. +If overstrikes are erasable with a blank, +then this should be indicated by giving \fBeo\fP. +.SS "Keypad and Function Keys" +If the terminal has a keypad that transmits codes when the keys are pressed, +this information can be given. +Note that it is not possible to handle +terminals where the keypad only works in local (this applies, for example, +to the unshifted HP 2621 keys). +If the keypad can be set to transmit or not transmit, +give these codes as \fBsmkx\fP and \fBrmkx\fP. +Otherwise the keypad is assumed to always transmit. +.PP +The codes sent by the left arrow, right arrow, up arrow, down arrow, +and home keys can be given as +\fBkcub1, kcuf1, kcuu1, kcud1, \fRand\fB khome\fP respectively. +If there are function keys such as f0, f1, ..., f10, the codes they send +can be given as \fBkf0, kf1, ..., kf10\fP. +If these keys have labels other than the default f0 through f10, the labels +can be given as \fBlf0, lf1, ..., lf10\fP. +.PP +The codes transmitted by certain other special keys can be given: +.bP +.B kll +(home down), +.bP +.B kbs +(backspace), +.bP +.B ktbc +(clear all tabs), +.bP +.B kctab +(clear the tab stop in this column), +.bP +.B kclr +(clear screen or erase key), +.bP +.B kdch1 +(delete character), +.bP +.B kdl1 +(delete line), +.bP +.B krmir +(exit insert mode), +.bP +.B kel +(clear to end of line), +.bP +.B ked +(clear to end of screen), +.bP +.B kich1 +(insert character or enter insert mode), +.bP +.B kil1 +(insert line), +.bP +.B knp +(next page), +.bP +.B kpp +(previous page), +.bP +.B kind +(scroll forward/down), +.bP +.B kri +(scroll backward/up), +.bP +.B khts +(set a tab stop in this column). +.PP +In addition, if the keypad has a 3 by 3 array of keys including the four +arrow keys, the other five keys can be given as +.BR ka1 , +.BR ka3 , +.BR kb2 , +.BR kc1 , +and +.BR kc3 . +These keys are useful when the effects of a 3 by 3 directional pad are needed. +.PP +Strings to program function keys can be given as +.BR pfkey , +.BR pfloc , +and +.BR pfx . +A string to program screen labels should be specified as \fBpln\fP. +Each of these strings takes two parameters: the function key number to +program (from 0 to 10) and the string to program it with. +Function key numbers out of this range may program undefined keys in +a terminal dependent manner. +The difference between the capabilities is that +.B pfkey +causes pressing the given key to be the same as the user typing the +given string; +.B pfloc +causes the string to be executed by the terminal in local; and +.B pfx +causes the string to be transmitted to the computer. +.PP +The capabilities \fBnlab\fP, \fBlw\fP and \fBlh\fP +define the number of programmable +screen labels and their width and height. +If there are commands to turn the labels on and off, +give them in \fBsmln\fP and \fBrmln\fP. +\fBsmln\fP is normally output after one or more pln +sequences to make sure that the change becomes visible. +.SS "Tabs and Initialization" +A few capabilities are used only for tabs: +.bP +If the terminal has hardware tabs, the command to advance to the next +tab stop can be given as +.B ht +(usually control/I). +.bP +A \*(``back-tab\*('' command which moves leftward to the preceding tab stop can +be given as +.BR cbt . +.IP +By convention, if the teletype modes indicate that tabs are being +expanded by the computer rather than being sent to the terminal, +programs should not use +.B ht +or +.B cbt +even if they are present, since the user may not have the tab stops +properly set. +.bP +If the terminal has hardware tabs which are initially set every +.I n +spaces when the terminal is powered up, +the numeric parameter +.B it +is given, showing the number of spaces the tabs are set to. +.IP +The \fBit\fP capability is normally used by the \fB@TSET@\fP +command to determine whether to set the mode for hardware tab expansion, +and whether to set the tab stops. +If the terminal has tab stops that can be saved in non-volatile memory, +the terminfo description can assume that they are properly set. +.PP +Other capabilities +include +.bP +.BR is1 , +.BR is2 , +and +.BR is3 , +initialization strings for the terminal, +.bP +.BR iprog , +the path name of a program to be run to initialize the terminal, +.bP +and \fBif\fP, the name of a file containing long initialization strings. +.PP +These strings are expected to set the terminal into modes consistent +with the rest of the terminfo description. +They are normally sent to the terminal, by the +.I init +option of the \fB@TPUT@\fP program, each time the user logs in. +They will be printed in the following order: +.RS +.TP +run the program +.B iprog +.TP +output +.br +\fBis1\fP and +.br +\fBis2\fP +.TP +set the margins using +\fBmgc\fP or +.br +\fBsmglp\fP and \fBsmgrp\fP or +.br +\fBsmgl\fP and \fBsmgr\fP +.TP +set tabs using +.B tbc +and +.B hts +.TP +print the file +\fBif\fP +.TP +and finally output +\fBis3\fP. +.RE +.PP +Most initialization is done with +.BR is2 . +Special terminal modes can be set up without duplicating strings +by putting the common sequences in +.B is2 +and special cases in +.B is1 +and +.BR is3 . +.PP +A set of sequences that does a harder reset from a totally unknown state +can be given as +.BR rs1 , +.BR rs2 , +.B rf +and +.BR rs3 , +analogous to +.B is1 , +.B is2 , +.B if +and +.B is3 +respectively. +These strings are output +by \fIreset\fP option of \fB@TPUT@\fP, +or by the \fB@RESET@\fP program +(an alias of \fB@TSET@\fP), +which is used when the terminal gets into a wedged state. +Commands are normally placed in +.BR rs1 , +.B rs2 +.B rs3 +and +.B rf +only if they produce annoying effects on the screen and are not +necessary when logging in. +For example, the command to set the vt100 into 80-column mode would +normally be part of +.BR is2 , +but it causes an annoying glitch of the screen and is not normally +needed since the terminal is usually already in 80-column mode. +.PP +The \fB@RESET@\fP program writes strings including +.BR iprog , +etc., in the same order as the +.I init +program, using +.BR rs1 , +etc., instead of +.BR is1 , +etc. +If any of +.BR rs1 , +.BR rs2 , +.BR rs3 , +or +.B rf +reset capability strings are missing, +the \fB@RESET@\fP program +falls back upon the corresponding initialization capability string. +.PP +If there are commands to set and clear tab stops, they can be given as +.B tbc +(clear all tab stops) +and +.B hts +(set a tab stop in the current column of every line). +If a more complex sequence is needed to set the tabs than can be +described by this, the sequence can be placed in +.B is2 +or +.BR if . +.PP +The \fB@TPUT@ reset\fP command uses the same capability strings +as the \fB@RESET@\fP command, +although the two programs (\fB@TPUT@\fP and \fB@RESET@\fP) +provide different command-line options. +.PP +In practice, these terminfo capabilities are not often used in +initialization of tabs +(though they are required for the \fB@TABS@\fP program): +.bP +Almost all hardware terminals (at least those which supported tabs) +initialized those to every \fIeight\fP columns: +.IP +The only exception was the AT&T 2300 series, +which set tabs to every \fIfive\fP columns. +.bP +In particular, developers of the hardware terminals which are commonly used +as models for modern terminal emulators provided documentation demonstrating +that \fIeight\fP columns were the standard. +.bP +Because of this, the terminal initialization programs +\fB@TPUT@\fP and \fB@TSET@\fP +use the +\fBtbc\fP (\fBclear_all_tabs\fP) and +\fBhts\fP (\fBset_tab\fP) capabilities directly +only when the \fBit\fP (\fBinit_tabs\fP) capability +is set to a value other than \fIeight\fP. +.SS "Delays and Padding" +Many older and slower terminals do not support either XON/XOFF or DTR +handshaking, including hard copy terminals and some very archaic CRTs +(including, for example, DEC VT100s). +These may require padding characters +after certain cursor motions and screen changes. +.PP +If the terminal uses xon/xoff handshaking for flow control (that is, +it automatically emits \*^S back to the host when its input buffers are +close to full), set +.BR xon . +This capability suppresses the emission of padding. +You can also set it +for memory-mapped console devices effectively that do not have a speed limit. +Padding information should still be included so that routines can +make better decisions about relative costs, but actual pad characters will +not be transmitted. +.PP +If \fBpb\fP (padding baud rate) is given, padding is suppressed at baud rates +below the value of \fBpb\fP. +If the entry has no padding baud rate, then +whether padding is emitted or not is completely controlled by \fBxon\fP. +.PP +If the terminal requires other than a null (zero) character as a pad, +then this can be given as \fBpad\fP. +Only the first character of the +.B pad +string is used. +.SS "Status Lines" +Some terminals have an extra \*(``status line\*('' which is not normally used by +software (and thus not counted in the terminal's \fBlines\fP capability). +.PP +The simplest case is a status line which is cursor-addressable but not +part of the main scrolling region on the screen; the Heathkit H19 has +a status line of this kind, as would a 24-line VT100 with a 23-line +scrolling region set up on initialization. +This situation is indicated +by the \fBhs\fP capability. +.PP +Some terminals with status lines need special sequences to access the +status line. +These may be expressed as a string with single parameter +\fBtsl\fP which takes the cursor to a given zero-origin column on the +status line. +The capability \fBfsl\fP must return to the main-screen +cursor positions before the last \fBtsl\fP. +You may need to embed the +string values of \fBsc\fP (save cursor) and \fBrc\fP (restore cursor) +in \fBtsl\fP and \fBfsl\fP to accomplish this. +.PP +The status line is normally assumed to be the same width as the width +of the terminal. +If this is untrue, you can specify it with the numeric +capability \fBwsl\fP. +.PP +A command to erase or blank the status line may be specified as \fBdsl\fP. +.PP +The Boolean capability \fBeslok\fP specifies that escape sequences, tabs, +etc., work ordinarily in the status line. +.PP +The \fI\%ncurses\fP implementation does not yet use any of these +capabilities. +They are documented here in case they ever become important. +.SS "Line Graphics" +Many terminals have alternate character sets useful for forms-drawing. +Terminfo and \fBcurses\fP have built-in support +for most of the drawing characters +supported by the VT100, with some characters from the AT&T 4410v1 added. +This alternate character set may be specified by the \fBacsc\fP capability. +.PP +.TS +center; +Lb Cb S L Lb +Lb2 Lb2 Lb Lb1 S +Lb L C Lb Lx. +\& acsc \& \& +ACS Name Value Symbol ASCII Fallback / Glyph Name +_ +ACS_RARROW 0x2b + > arrow pointing right +ACS_LARROW 0x2c , < arrow pointing left +ACS_UARROW 0x2d \- \*^ arrow pointing up +ACS_DARROW 0x2e . v arrow pointing down +ACS_BLOCK 0x30 0 # solid square block +ACS_DIAMOND 0x60 \(ga + diamond +ACS_CKBOARD 0x61 a : checker board (stipple) +ACS_DEGREE 0x66 f \e degree symbol +ACS_PLMINUS 0x67 g # plus/minus +ACS_BOARD 0x68 h # board of squares +ACS_LANTERN 0x69 i # lantern symbol +ACS_LRCORNER 0x6a j + lower right corner +ACS_URCORNER 0x6b k + upper right corner +ACS_ULCORNER 0x6c l + upper left corner +ACS_LLCORNER 0x6d m + lower left corner +ACS_PLUS 0x6e n + large plus or crossover +ACS_S1 0x6f o \*~ scan line 1 +ACS_S3 0x70 p \- scan line 3 +ACS_HLINE 0x71 q \- horizontal line +ACS_S7 0x72 r \- scan line 7 +ACS_S9 0x73 s \&_ scan line 9 +ACS_LTEE 0x74 t + tee pointing right +ACS_RTEE 0x75 u + tee pointing left +ACS_BTEE 0x76 v + tee pointing up +ACS_TTEE 0x77 w + tee pointing down +ACS_VLINE 0x78 x | vertical line +ACS_LEQUAL 0x79 y < less-than-or-equal-to +ACS_GEQUAL 0x7a z > greater-than-or-equal-to +ACS_PI 0x7b { * greek pi +ACS_NEQUAL 0x7c | ! not-equal +ACS_STERLING 0x7d } f UK pound sign +ACS_BULLET 0x7e \*~ o bullet +.TE +.PP +A few notes apply to the table itself: +.bP +X/Open Curses incorrectly states that the mapping for \fIlantern\fP is +uppercase \*(``I\*('' although Unix implementations use the +lowercase \*(``i\*('' mapping. +.bP +The DEC VT100 implemented graphics using the alternate character set +feature, temporarily switching \fImodes\fP and sending characters +in the range 0x60 (96) to 0x7e (126) +(the \fBacsc Value\fP column in the table). +.bP +The AT&T terminal added graphics characters outside that range. +.IP +Some of the characters within the range do not match the VT100; +presumably they were used in the AT&T terminal: +\fIboard of squares\fP replaces the VT100 \fInewline\fP symbol, while +\fIlantern symbol\fP replaces the VT100 \fIvertical tab\fP symbol. +The other VT100 symbols for control characters (\fIhorizontal tab\fP, +\fIcarriage return\fP and \fIline-feed\fP) are not (re)used in curses. +.PP +The best way to define a new device's graphics set is to add a column +to a copy of this table for your terminal, giving the character which +(when emitted between \fBsmacs\fP/\fBrmacs\fP switches) will be rendered +as the corresponding graphic. +Then read off the VT100/your terminal +character pairs right to left in sequence; these become the ACSC string. +.SS "Color Handling" +The curses library functions \fBinit_pair\fP and \fBinit_color\fP +manipulate the \fIcolor pairs\fP and \fIcolor values\fP discussed in this +section +(see \fBcurs_color\fP(3X) for details on these and related functions). +.PP +Most color terminals are either \*(``Tektronix-like\*('' or \*(``HP-like\*('': +.bP +Tektronix-like +terminals have a predefined set of \fIN\fP colors +(where \fIN\fP is usually 8), +and can set +character-cell foreground and background colors independently, +mixing them into \fIN\fP\ *\ \fIN\fP color pairs. +.bP +On HP-like terminals, the user must set each color +pair up separately (foreground and background are not independently settable). +Up to \fIM\fP color pairs may be set up from 2*\fIM\fP different colors. +ANSI-compatible terminals are Tektronix-like. +.PP +Some basic color capabilities are independent of the color method. +The numeric +capabilities \fBcolors\fP and \fBpairs\fP specify the maximum numbers of colors +and color pairs that can be displayed simultaneously. +The \fBop\fP (original +pair) string resets foreground and background colors to their default values +for the terminal. +The \fBoc\fP string resets all colors or color pairs to +their default values for the terminal. +Some terminals (including many PC +terminal emulators) erase screen areas with the current background color rather +than the power-up default background; these should have the Boolean capability +\fBbce\fP. +.PP +While the curses library works with \fIcolor pairs\fP +(reflecting the inability of some devices to set foreground +and background colors independently), +there are separate capabilities for setting these features: +.bP +To change the current foreground or background color on a Tektronix-type +terminal, use \fBsetaf\fP (set ANSI foreground) and \fBsetab\fP (set ANSI +background) or \fBsetf\fP (set foreground) and \fBsetb\fP (set background). +These take one parameter, the color number. +The SVr4 documentation describes +only \fBsetaf\fP/\fBsetab\fP; the XPG4 draft says that "If the terminal +supports ANSI escape sequences to set background and foreground, they should +be coded as \fBsetaf\fP and \fBsetab\fP, respectively. +.bP +If the terminal +supports other escape sequences to set background and foreground, they should +be coded as \fBsetf\fP and \fBsetb\fP, respectively. +The \fBvidputs\fP and the \fBrefresh\fP(3X) functions +use the \fBsetaf\fP and \fBsetab\fP capabilities if they are defined. +.PP +The \fBsetaf\fP/\fBsetab\fP and \fBsetf\fP/\fBsetb\fP capabilities take a +single numeric argument each. +Argument values 0-7 of \fBsetaf\fP/\fBsetab\fP are portably defined as +follows (the middle column is the symbolic #define available in the header for +the \fBcurses\fP or \fI\%ncurses\fP libraries). +The terminal hardware is free to +map these as it likes, but the RGB values indicate normal locations in color +space. +.PP +.TS +center; +cb cb cb cb s s +l lb c l1 l1 l . +Color #define Value RGB +_ +black COLOR_BLACK 0 0, 0, 0 +red COLOR_RED 1 max, 0, 0 +green COLOR_GREEN 2 0, max, 0 +yellow COLOR_YELLOW 3 max, max, 0 +blue COLOR_BLUE 4 0, 0, max +magenta COLOR_MAGENTA 5 max, 0, max +cyan COLOR_CYAN 6 0, max, max +white COLOR_WHITE 7 max, max, max +.TE +.br +.if t .ne 6v +.PP +The argument values of \fBsetf\fP/\fBsetb\fP historically correspond to +a different mapping, i.e., +.PP +.TS +center; +cb cb cb cb s s +l lb c l1 l1 l . +Color #define Value RGB +_ +black COLOR_BLACK 0 0, 0, 0 +blue COLOR_BLUE 1 0, 0, max +green COLOR_GREEN 2 0, max, 0 +cyan COLOR_CYAN 3 0, max, max +red COLOR_RED 4 max, 0, 0 +magenta COLOR_MAGENTA 5 max, 0, max +yellow COLOR_YELLOW 6 max, max, 0 +white COLOR_WHITE 7 max, max, max +.TE +.PP +It is important to not confuse the two sets of color capabilities; +otherwise red/blue will be interchanged on the display. +.PP +On an HP-like terminal, use \fBscp\fP with a color pair number parameter to set +which color pair is current. +.PP +Some terminals allow the \fIcolor values\fP to be modified: +.bP +On a Tektronix-like terminal, the capability \fBccc\fP may be present to +indicate that colors can be modified. +If so, the \fBinitc\fP capability will +take a color number (0 to \fBcolors\fP \- 1)and three more parameters which +describe the color. +These three parameters default to being interpreted as RGB +(Red, Green, Blue) values. +If the Boolean capability \fBhls\fP is present, +they are instead as HLS (Hue, Lightness, Saturation) indices. +The ranges are +terminal-dependent. +.bP +On an HP-like terminal, \fBinitp\fP may give a capability for changing a +color pair value. +It will take seven parameters; a color pair number (0 to +\fBmax_pairs\fP \- 1), and two triples describing first background and then +foreground colors. +These parameters must be (Red, Green, Blue) or +(Hue, Lightness, Saturation) depending on \fBhls\fP. +.PP +On some color terminals, colors collide with highlights. +You can register +these collisions with the \fBncv\fP capability. +This is a bit mask of +attributes not to be used when colors are enabled. +The correspondence with the +attributes understood by \fBcurses\fP is as follows: +.PP +.TS +center; +cb cb cb cb +lb n n lb. +Attribute Bit Decimal Set by +_ +A_STANDOUT 0 1 sgr +A_UNDERLINE 1 2 sgr +A_REVERSE 2 4 sgr +A_BLINK 3 8 sgr +A_DIM 4 16 sgr +A_BOLD 5 32 sgr +A_INVIS 6 64 sgr +A_PROTECT 7 128 sgr +A_ALTCHARSET 8 256 sgr +A_HORIZONTAL 9 512 sgr1 +A_LEFT 10 1024 sgr1 +A_LOW 11 2048 sgr1 +A_RIGHT 12 4096 sgr1 +A_TOP 13 8192 sgr1 +A_VERTICAL 14 16384 sgr1 +A_ITALIC 15 32768 sitm +.TE +.PP +For example, on many IBM PC consoles, the underline attribute collides with the +foreground color blue and is not available in color mode. +These should have +an \fBncv\fP capability of 2. +.PP +SVr4 curses does nothing with \fBncv\fP, +\fI\%ncurses\fP recognizes it and optimizes +the output in favor of colors. +.SS Miscellaneous +If the terminal requires other than a null (zero) character as a pad, then this +can be given as pad. +Only the first character of the pad string is used. +If the terminal does not have a pad character, specify npc. +Note that \fI\%ncurses\fP implements the termcap-compatible \fBPC\fP +variable; +though the application may set this value to something other than +a null, +\fI\%ncurses\fP will test \fBnpc\fP first and use napms if the terminal +has no pad character. +.PP +If the terminal can move up or down half a line, +this can be indicated with +.B hu +(half-line up) +and +.B hd +(half-line down). +This is primarily useful for superscripts and subscripts on hard-copy terminals. +If a hard-copy terminal can eject to the next page (form feed), give this as +.B ff +(usually control/L). +.PP +If there is a command to repeat a given character a given number of +times (to save time transmitting a large number of identical characters) +this can be indicated with the parameterized string +.BR rep . +The first parameter is the character to be repeated and the second +is the number of times to repeat it. +Thus, tparm(repeat_char, \*'x\*', 10) is the same as \*(``xxxxxxxxxx\*(''. +.PP +If the terminal has a settable command character, +such as the \s-1TEKTRONIX\s+1 4025, +this can be indicated with +.BR cmdch . +A prototype command character is chosen which is used in all capabilities. +This character is given in the +.B cmdch +capability to identify it. +The following convention is supported on some Unix systems: +The environment is to be searched for a +.B CC +variable, and if found, all +occurrences of the prototype character are replaced with the character +in the environment variable. +.PP +Terminal descriptions that do not represent a specific kind of known +terminal, such as +.IR switch , +.IR dialup , +.IR patch , +and +.IR network , +should include the +.B gn +(generic) capability so that programs can complain that they do not know +how to talk to the terminal. +(This capability does not apply to +.I virtual +terminal descriptions for which the escape sequences are known.) +.PP +If the terminal has a \*(``meta key\*('' which acts as a shift key, +setting the 8th bit of any character transmitted, this fact can +be indicated with +.BR km . +Otherwise, software will assume that the 8th bit is parity and it +will usually be cleared. +If strings exist to turn this \*(``meta mode\*('' on and off, they +can be given as +.B smm +and +.BR rmm . +.PP +If the terminal has more lines of memory than will fit on the screen +at once, the number of lines of memory can be indicated with +.BR lm . +A value of +.BR lm #0 +indicates that the number of lines is not fixed, +but that there is still more memory than fits on the screen. +.PP +If the terminal is one of those supported by the Unix virtual +terminal protocol, the terminal number can be given as +.BR vt . +.PP +Media copy +strings which control an auxiliary printer connected to the terminal +can be given as +.BR mc0 : +print the contents of the screen, +.BR mc4 : +turn off the printer, and +.BR mc5 : +turn on the printer. +When the printer is on, all text sent to the terminal will be sent +to the printer. +It is undefined whether the text is also displayed on the terminal screen +when the printer is on. +A variation +.B mc5p +takes one parameter, and leaves the printer on for as many characters +as the value of the parameter, then turns the printer off. +The parameter should not exceed 255. +All text, including +.BR mc4 , +is transparently passed to the printer while an +.B mc5p +is in effect. +.SS "Glitches and Brain Damage" +Hazeltine terminals, +which do not allow \*(``\*~\*('' characters to be displayed should +indicate \fBhz\fP. +.PP +Terminals which ignore a line-feed immediately after an \fBam\fP wrap, +such as the Concept and vt100, +should indicate \fBxenl\fP. +.PP +If +.B el +is required to get rid of standout +(instead of merely writing normal text on top of it), +\fBxhp\fP should be given. +.PP +Teleray terminals, where tabs turn all characters moved over to blanks, +should indicate \fBxt\fP (destructive tabs). +Note: the variable indicating this is now \*(``dest_tabs_magic_smso\*(''; in +older versions, it was teleray_glitch. +This glitch is also taken to mean that it is not possible to position +the cursor on top of a \*(``magic cookie\*('', +that to erase standout mode it is instead necessary to use +delete and insert line. +The \fI\%ncurses\fP implementation ignores this glitch. +.PP +The Beehive Superbee, which is unable to correctly transmit the escape +or control/C characters, has +.BR xsb , +indicating that the f1 key is used for escape and f2 for control/C. +(Only certain Superbees have this problem, depending on the ROM.) +Note that in older terminfo versions, this capability was called +\*(``beehive_glitch\*(''; it is now \*(``no_esc_ctl_c\*(''. +.PP +Other specific terminal problems may be corrected by adding more +capabilities of the form \fBx\fIx\fR. +.SS "Pitfalls of Long Entries" +Long terminfo entries are unlikely to be a problem; to date, no entry has even +approached terminfo's 4096-byte string-table maximum. +Unfortunately, the termcap +translations are much more strictly limited (to 1023 bytes), +thus termcap translations of long terminfo entries can cause problems. +.PP +The man pages for 4.3BSD +and older versions of \fBtgetent\fP instruct the user to +allocate a 1024-byte buffer for the termcap entry. +The entry gets null-terminated by +the termcap library, so that makes the maximum safe length for a termcap entry +1k\-1 (1023) bytes. +Depending on what the application and the termcap library being used does, +and where in the termcap file the terminal type that \fBtgetent\fP +is searching for is, several bad things can happen: +.bP +some termcap libraries print a warning message, +.bP +some exit if they find an entry that's longer than 1023 bytes, +.bP +some neither exit nor warn, doing nothing useful, and +.bP +some simply truncate the entries to 1023 bytes. +.PP +Some application programs allocate more than +the recommended 1K for the termcap entry; others do not. +.PP +Each termcap entry has two important sizes associated with it: before +\*(``tc\*('' expansion, and after \*(``tc\*('' expansion. +\*(``tc\*('' is the capability that +tacks on another termcap entry to the end of the current one, to add +on its capabilities. +If a termcap entry does not use the \*(``tc\*('' +capability, then of course the two lengths are the same. +.PP +The \*(``before tc expansion\*('' length is the most important one, because it +affects more than just users of that particular terminal. +This is the +length of the entry as it exists in /etc/termcap, minus the +backslash-newline pairs, which \fBtgetent\fP strips out while reading it. +Some termcap libraries strip off the final newline, too (GNU termcap does not). +Now suppose: +.bP +a termcap entry before expansion is more than 1023 bytes long, +.bP +and the application has only allocated a 1k buffer, +.bP +and the termcap library (like the one in BSD/OS 1.1 and GNU) reads +the whole entry into the buffer, no matter what its length, to see +if it is the entry it wants, +.bP +and \fBtgetent\fP is searching for a terminal type that either is the +long entry, appears in the termcap file after the long entry, or +does not appear in the file at all (so that \fBtgetent\fP has to search +the whole termcap file). +.PP +Then \fBtgetent\fP will overwrite memory, +perhaps its stack, +and probably core dump the program. +Programs like telnet are particularly vulnerable; modern telnets +pass along values like the terminal type automatically. +The results are almost +as undesirable with a termcap library, like SunOS 4.1.3 and Ultrix 4.4, that +prints warning messages when it reads an overly long termcap entry. +If a +termcap library truncates long entries, like OSF/1 3.0, it is immune to dying +here but will return incorrect data for the terminal. +.PP +The \*(``after tc expansion\*('' length will have a similar effect to the +above, but only for people who actually set \fITERM\fP to that terminal +type, since \fBtgetent\fP only does \*(``tc\*('' expansion once it is found the +terminal type it was looking for, not while searching. +.PP +In summary, a termcap entry that is longer than 1023 bytes can cause, +on various combinations of termcap libraries and applications, a core +dump, warnings, or incorrect operation. +If it is too long even before +\*(``tc\*('' expansion, it will have this effect even for users of some other +terminal types and users whose \fITERM\fP variable does not have a termcap +entry. +.PP +When in \-C (translate to termcap) mode, +the \fI\%ncurses\fP implementation of +\fB@TIC@\fP(1M) issues warning messages when the pre-tc length of a termcap +translation is too long. +The \-c (check) option also checks resolved (after tc +expansion) lengths. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database directory +.SH EXTENSIONS +Searching for terminal descriptions in +\fI$HOME/.terminfo\fP and \fI\%TERMINFO_DIRS\fP +is not supported by older implementations. +.PP +Some SVr4 \fBcurses\fP implementations, and all previous to SVr4, do not +interpret the %A and %O operators in parameter strings. +.PP +SVr4/XPG4 do not specify whether \fBmsgr\fP licenses movement while in +an alternate-character-set mode (such modes may, among other things, map +CR and NL to characters that do not trigger local motions). +The \fI\%ncurses\fP implementation ignores \fBmsgr\fP in +\fBALTCHARSET\fP mode. +This raises the possibility that an XPG4 +implementation making the opposite interpretation may need terminfo +entries made for \fI\%ncurses\fP to have \fBmsgr\fP turned off. +.PP +The \fI\%ncurses\fP library handles insert-character and +insert-character modes in a slightly non-standard way to get better +update efficiency. +See +the \fBInsert/Delete Character\fP subsection above. +.PP +The parameter substitutions for \fBset_clock\fP and \fBdisplay_clock\fP are +not documented in SVr4 or X/Open Curses. +They are deduced from the +documentation for the AT&T 505 terminal. +.PP +Be careful assigning the \fBkmous\fP capability. +The \fI\%ncurses\fP library wants to interpret it as \fBKEY_MOUSE\fP, +for use by terminals and emulators like xterm +that can return mouse-tracking information in the keyboard-input stream. +.PP +X/Open Curses does not mention italics. +Portable applications must assume that numeric capabilities are +signed 16-bit values. +This includes the \fIno_color_video\fP (\fBncv\fP) capability. +The 32768 mask value used for italics with \fBncv\fP can be confused with +an absent or canceled \fBncv\fP. +If italics should work with colors, +then the \fBncv\fP value must be specified, even if it is zero. +.PP +Different commercial ports of \fI\%terminfo\fP and \fIcurses\fP support +different subsets of X/Open Curses and +(in some cases) +different extensions. +Here is a summary, +accurate as of October 1995, +after which the commercial Unix market contracted and lost diversity. +.bP +SVr4, +Solaris, +and \fI\%ncurses\fP support all SVr4 capabilities. +.bP +IRIX supports the SVr4 set and adds one undocumented extended string +capability \%(\fBset_pglen\fP). +.bP +SVr1 and Ultrix support a restricted subset of \fI\%terminfo\fP +capabilities. +The Booleans end with \fB\%xon_xoff\fP; +the numerics with \fB\%width_status_line\fP; +and the strings with \fB\%prtr_non\fP. +.bP +HP/UX supports the SVr1 subset, +plus the SVr[234] numerics +\fB\%num_labels\fP, +\fB\%label_height\fP, +\fB\%label_width\fP, +plus function keys 11 through 63, +plus +\fB\%plab_norm\fP, +\fB\%label_on\fP, +and +\fB\%label_off\fP, +plus a number of incompatible string table extensions. +.bP +AIX supports the SVr1 subset, +plus function keys 11 through 63, +plus a number of incompatible string table extensions. +.bP +OSF/1 supports both the SVr4 set and the AIX extensions. +.SH PORTABILITY +Do not count on compiled (binary) \fI\%terminfo\fP entries being +portable between commercial Unix systems. +At least two implementations of \fI\%terminfo\fP +(those of HP-UX and AIX) +diverged from those of other System V Unices after SVr1, +adding extension capabilities to the string table that +(in the binary format) +collide with subsequent System V and X/Open Curses extensions. +.SH AUTHORS +Zeyd M. Ben-Halim, Eric S. Raymond, Thomas E. Dickey. +Based on \fIpcurses\fP by Pavel Curtis. +.SH SEE ALSO +\fB\%@INFOCMP@\fP(1M), +\fB\%@TABS@\fP(1), +\fB\%@TIC@\fP(1M), +\fB\%curses\fP(3X), +\fB\%curs_color\fP(3X), +\fB\%curs_terminfo\fP(3X), +\fB\%curs_variables\fP(3X), +\fB\%printf\fP(3), +\fB\%term_variables\fP(3X), +\fB\%term\fP(5), +\fB\%user_caps\fP(5) diff --git a/contrib/ncurses/man/tic.1m b/contrib/ncurses/man/tic.1m new file mode 100644 index 00000000..d58dfa7c --- /dev/null +++ b/contrib/ncurses/man/tic.1m @@ -0,0 +1,622 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: tic.1m,v 1.113 2024/09/14 20:06:50 tom Exp $ +.TH @TIC@ 1M 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%@TIC@\fP \- +compile terminal descriptions for \fIterminfo\fR or \fItermcap\fR +.SH SYNOPSIS +\fB@TIC@\fP +[\fB\-\ +0\ +1\ +a\ +c\ +C\ +D\ +f\ +g\ +G\ +I\ +K\ +L\ +N\ +q\ +r\ +s\ +t\ +T\ +U\ +V\ +W\ +x\ +\fP] +[\fB\-e\fP \fIterminal-type-list\fP] +[\fB\-o\fP \fIdir\fP] +[\fB\-Q\fP[\fIn\fP]] +[\fB\-R\fP \fIsubset\fP] +[\fB\-v\fP[\fIn\fP]] +[\fB\-w\fP[\fIn\fP]] +\fIfile\fP +.SH DESCRIPTION +The \fB@TIC@\fP command translates a \fBterminfo\fP file from source +format into compiled format. +The compiled format is necessary for use with +the library routines in \fB\%ncurses\fP(3X). +.PP +As described in \fBterm\fP(5), the database may be either a directory +tree (one file per terminal entry) or a hashed database (one record per entry). +The \fB@TIC@\fP command writes only one type of entry, +depending on how it was built: +.bP +For directory trees, the top-level directory, e.g., /usr/share/terminfo, +specifies the location of the database. +.bP +For hashed databases, a filename is needed. +If the given file is not found by that name, +but can be found by adding the suffix ".db", +then that is used. +.IP +The default name for the hashed database is the same as the +default directory name (only adding a ".db" suffix). +.PP +In either case (directory or hashed database), +\fB@TIC@\fP will create the container if it does not exist. +For a directory, this would be the \*(``terminfo\*('' leaf, +versus a "terminfo.db" file. +.PP +The results are normally placed +in the system terminfo database \fB@TERMINFO@\fP. +The compiled terminal description can be placed +in a different terminfo database. +There are two ways to achieve this: +.bP +First, you may override the system default either by +using the \fB\-o\fP option, +or by setting the variable \fI\%TERMINFO\fP +in your shell environment to a valid database location. +.bP +Secondly, if \fB@TIC@\fP cannot write in \fI@TERMINFO@\fP +or the location specified using your \fI\%TERMINFO\fP variable, +it looks for the directory \fI$HOME/.terminfo\fP +(or hashed database \fI$HOME/.terminfo.db)\fP; +if that location exists, the entry is placed there. +.PP +Libraries that read terminfo entries are expected to check in succession +.bP +a location specified with the \fI\%TERMINFO\fP environment variable, +.bP +\fI$HOME/.terminfo\fP, +.bP +directories listed in the \fI\%TERMINFO_DIRS\fP environment variable, +.bP +a compiled-in list of directories (@TERMINFO_DIRS@), and +.bP +the system terminfo database (\fI@TERMINFO@\fP). +.PP +The \fIFetching Compiled Descriptions\fP section in the \fBterminfo\fR(5) +manual goes into further detail. +.SS Aliases +This is the same program as @INFOTOCAP@ and @CAPTOINFO@; +usually those are linked to, or copied from this program: +.bP +When invoked as @INFOTOCAP@, @TIC@ sets the \fB\-I\fP option. +.bP +When invoked as @CAPTOINFO@, @TIC@ sets the \fB\-C\fP option. +.SH OPTIONS +.TP +\fB\-0\fP +restricts the output to a single line +.TP +\fB\-1\fP +restricts the output to a single column +.TP +\fB\-a\fP +tells \fB@TIC@\fP to retain commented-out capabilities rather than discarding +them. +Capabilities are commented by prefixing them with a period. +This sets the \fB\-x\fP option, because it treats the commented-out +entries as user-defined names. +If the source is termcap, accept the 2-character names required by version 6. +Otherwise these are ignored. +.TP +\fB\-C\fP +Force source translation to termcap format. +Note: this differs from the \fB\-C\fP +option of \fB@INFOCMP@\fP(1M) in that it does not merely translate capability +names, but also translates terminfo strings to termcap format. +Capabilities +that are not translatable are left in the entry under their terminfo names +but commented out with two preceding dots. +The actual format used incorporates some improvements for escaped characters +from terminfo format. +For a stricter BSD-compatible translation, add the \fB\-K\fP option. +.IP +If this is combined with \fB\-c\fP, \fB@TIC@\fP makes additional checks +to report cases where the terminfo values do not have an exact equivalent +in termcap form. +For example: +.RS +.bP +\fBsgr\fP usually will not convert, because termcap lacks the ability to +work with more than two parameters, and because termcap lacks many of +the arithmetic/logical operators used in terminfo. +.bP +capabilities with more than one delay or with delays before the end of +the string will not convert completely. +.RE +.TP +\fB\-c\fP +tells \fB@TIC@\fP to only check \fIfile\fP for errors, +including syntax problems and bad use-links. +If you specify \fB\-C\fP (\fB\-I\fP) with this option, the code +will print warnings about entries which, after use resolution, are more than +1023 (4096) bytes long. +Due to a fixed buffer length in older termcap libraries, +as well as buggy checking for the buffer length +(and a documented limit in terminfo), +these entries may cause core +dumps with other implementations. +.IP +\fB@TIC@\fP checks string capabilities to ensure that those with parameters +will be valid expressions. +It does this check only for the predefined string capabilities; +those which are defined with the \fB\-x\fP option are ignored. +.TP +\fB\-D\fP +tells \fB@TIC@\fP to print the database locations that it knows about, and exit. +The first location shown is the one to which it would write compiled +terminal descriptions. +If \fB@TIC@\fP is not able to find a writable database location +according to the rules summarized above, +it will print a diagnostic and exit with an error rather than +printing a list of database locations. +.TP +\fB\-e \fIlist\fR +Limit writes and translations to the comma-separated \fIlist\fP of +terminal types. +If any name or alias of a terminal matches one of the names in +the list, the entry will be written or translated as normal. +Otherwise no output will be generated for it. +The option value is interpreted as a file containing the list if it +contains a '/'. +(Note: depending on how @TIC@ was compiled, +this option may require \fB\-I\fP or \fB\-C\fP.) +.TP +\fB\-f\fP +Display complex terminfo strings which contain if/then/else/endif expressions +indented for readability. +.TP +\fB\-G\fP +Display constant literals in decimal form +rather than their character equivalents. +.TP +\fB\-g\fP +Display constant character literals in quoted form +rather than their decimal equivalents. +.TP +\fB\-I\fP +Force source translation to terminfo format. +.TP +\fB\-K\fP +Suppress some longstanding \fI\%ncurses\fP extensions to termcap format, +e.g., "\es" for space. +.TP +\fB\-L\fP +Force source translation to terminfo format +using the long C variable names listed in <\fBterm.h\fP> +.TP +\fB\-N\fP +Disable smart defaults. +Normally, when translating from termcap to terminfo, the compiler makes +a number of assumptions about the defaults of string capabilities +\fBreset1_string\fP, \fBcarriage_return\fP, \fBcursor_left\fP, +\fBcursor_down\fP, \fBscroll_forward\fP, \fBtab\fP, \fBnewline\fP, +\fBkey_backspace\fP, \fBkey_left\fP, and \fBkey_down\fP, then attempts +to use obsolete termcap capabilities to deduce correct values. +It also +normally suppresses output of obsolete termcap capabilities such as \fBbs\fP. +This option forces a more literal translation that also preserves the +obsolete capabilities. +.TP +\fB\-o\fIdir\fR +Write compiled entries to given database location. +Overrides the \fI\%TERMINFO\fP environment variable. +.TP +\fB\-Q\fIn\fR +Rather than show source in terminfo (text) format, +print the compiled (binary) format in hexadecimal or base64 form, +depending on the option's value: +.RS 8 +.TP 3 +1 +hexadecimal +.TP 3 +2 +base64 +.TP 3 +3 +hexadecimal and base64 +.RE +.TP +\fB\-q\fP +Suppress comments and blank lines when showing translated source. +.TP +\fB\-R\fIsubset\fR +Restrict output to a given subset. +This option is for use with archaic +versions of terminfo like those on SVr1, Ultrix, or HP-UX that do not support +the full set of SVR4/XSI Curses terminfo; and outright broken ports like AIX 3.x +that have their own extensions incompatible with SVr4/XSI. +.IP +Available subsets are +.RS +\*(``SVr1\*('', +\*(``Ultrix\*('', +\*(``HP\*('', +\*(``BSD\*('', and +\*(``AIX\*('' +.RE +.IP +See \fBterminfo\fP(5) for details. +.TP +\fB\-r\fP +Force entry resolution (so there are no remaining tc capabilities) even +when doing translation to termcap format. +This may be needed if you are +preparing a termcap file for a termcap library (such as GNU termcap through +version 1.3 or BSD termcap through 4.3BSD) that does not handle multiple +tc capabilities per entry. +.TP +\fB\-s\fP +Summarize the compile by showing the database location into which entries +are written, and the number of entries which are compiled. +.TP +\fB\-T\fP +eliminates size-restrictions on the generated text. +This is mainly useful for testing and analysis, since the compiled +descriptions are limited (e.g., 1023 for termcap, 4096 for terminfo). +.TP +\fB\-t\fP +tells \fB@TIC@\fP to discard commented-out capabilities. +Normally when translating from terminfo to termcap, +untranslatable capabilities are commented-out. +.TP +\fB\-U\fP +tells \fB@TIC@\fP to not post-process the data after parsing the source file. +Normally, it infers data which is commonly missing in older terminfo data, +or in termcaps. +.TP +\fB\-V\fP +reports the version of \fI\%ncurses\fP which was used in this program, +and exits. +.TP +\fB\-v\fIn\fR +specifies that (verbose) output be written to standard error trace +information showing \fB@TIC@\fP's progress. +.IP +The optional parameter \fIn\fP is a number from 1 to 9, inclusive, +indicating the desired level of detail of information. +.RS +.bP +If \fI\%ncurses\fP is built without tracing support, +the optional parameter is ignored. +.bP +If \fIn\fP is omitted, the default level is 1. +.bP +If \fIn\fP is specified and greater than 1, the level of +detail is increased, and the output is written (with tracing information) +to the \*(``trace\*('' file. +.RE +.RS +.PP +The debug flag levels are as follows: +.TP 4 +1 +Names of files created and linked +.TP +2 +Information related to the \*(``use\*('' facility +.TP +3 +Statistics from the hashing algorithm +.TP +4 +Details of extended capabilities +.TP +5 +(unused) +.TP +6 +(unused) +.TP +7 +Entries into the string-table +.TP +8 +List of tokens encountered by scanner +.TP +9 +All values computed in construction of the hash table +.RE +.TP +\fB\-W\fP +By itself, the \fB\-w\fP option will not force long strings to be wrapped. +Use the \fB\-W\fP option to do this. +.IP +If you specify both \fB\-f\fP and \fB\-W\fP options, +the latter is ignored when \fB\-f\fP has already split the line. +.TP +\fB\-w\fIn\fR +specifies the width of the output. +The parameter is optional. +If it is omitted, it defaults to 60. +.TP +\fB\-x\fP +Treat unknown capabilities as user-defined (see \fBuser_caps\fP(5)). +That is, if you supply a capability name which \fB@TIC@\fP does not recognize, +it will infer its type (Boolean, number or string) from the syntax and +make an extended table entry for that. +User-defined capability strings +whose name begins with \*(``k\*('' are treated as function keys. +.SS Parameters +.TP +\fIfile\fP +contains one or more \fBterminfo\fP terminal descriptions in source +format [see \fBterminfo\fP(5)]. +Each description in the file +describes the capabilities of a particular terminal. +.IP +If \fIfile\fP is \*(``-\*('', then the data is read from the standard input. +The \fIfile\fP parameter may also be the path of a character-device. +.SS Processing +All but one of the capabilities recognized by \fB@TIC@\fP are documented +in \fBterminfo\fP(5). +The exception is the \fBuse\fP capability. +.PP +When a \fBuse\fP=\fIentry\fP\-\fIname\fP field is discovered in a +terminal entry currently being compiled, \fB@TIC@\fP reads in the binary +from \fB@TERMINFO@\fP to complete the entry. +(Entries created from +\fIfile\fP will be used first. +\fB@TIC@\fP duplicates the capabilities in +\fIentry\fP\-\fIname\fP for the current entry, with the exception of +those capabilities that explicitly are defined in the current entry. +.PP +When an entry, e.g., \fBentry_name_1\fP, contains a +\fBuse=\fIentry\fR_\fIname\fR_\fI2\fR field, any canceled +capabilities in \fIentry\fR_\fIname\fR_\fI2\fP must also appear in +\fBentry_name_1\fP before \fBuse=\fP for these capabilities to be +canceled in \fBentry_name_1\fP. +.PP +Total compiled entries cannot exceed +4096 bytes in the legacy storage format, or +32768 using the extended number format. +The name field cannot +exceed 512 bytes. +Terminal names exceeding the maximum alias length +(32 characters on systems with long filenames, 14 characters otherwise) +will be truncated to the maximum alias length +and a warning message will be printed. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database +.SH NOTES +There is some evidence that historic \fB@TIC@\fP implementations treated +description fields with no whitespace in them as additional aliases or +short names. +This \fB@TIC@\fP does not do that, but it does warn when +description fields may be treated that way and check them for dangerous +characters. +.SH EXTENSIONS +Unlike the SVr4 \fB@TIC@\fP command, this implementation can actually +compile termcap sources. +In fact, entries in terminfo and termcap syntax can +be mixed in a single source file. +See \fBterminfo\fP(5) for the list of +termcap names taken to be equivalent to terminfo names. +.PP +The SVr4 manual pages are not clear on the resolution rules for \fBuse\fP +capabilities. +This implementation of \fB@TIC@\fP will find \fBuse\fP targets anywhere +in the source file, +or anywhere in the file tree rooted at +\fI\%TERMINFO\fP +(if +\fI\%TERMINFO\fP is defined), +or in the user's \fI$HOME/.terminfo\fP database +(if it exists), +or (finally) anywhere in the system's file tree of +compiled entries. +.PP +The error messages from this \fB@TIC@\fP have the same format as GNU C +error messages, and can be parsed by GNU Emacs's compile facility. +.PP +Aside from \fB\-c\fP and \fB\-v\fP, options are not portable: +.bP +Most of @TIC@'s options +are not supported by SVr4 \fBtic\fP: +.sp +.RS +\fB\-0\fP +\fB\-1\fP +\fB\-C\fP +\fB\-G\fP +\fB\-I\fP +\fB\-N\fP +\fB\-R\fP +\fB\-T\fP +\fB\-V\fP +\fB\-a\fP +\fB\-e\fP +\fB\-f\fP +\fB\-g\fP +\fB\-o\fP +\fB\-r\fP +\fB\-s\fP +\fB\-t\fP +\fB\-x\fP +.RE +.bP +The NetBSD \fBtic\fP supports a few of the \fI\%ncurses\fP options +.sp +.RS +\fB\-a\fP +\fB\-o\fP +\fB\-x\fP +.RE +.IP +and adds \fB\-S\fP +(a feature which does the same thing +as @INFOCMP@'s \fB\-e\fP and \fB\-E\fP options). +.PP +The SVr4 \fB\-c\fP mode does not report bad \*(``use=\*('' links. +.PP +System V does not compile entries to or read entries from your +\fI$HOME/.terminfo\fP database unless \fI\%TERMINFO\fP is explicitly set +to it. +.SH PORTABILITY +X/Open Curses, Issue 7 (2009) provides a brief description of \fBtic\fP. +It lists one option: \fB\-c\fP. +The omission of \fB\-v\fP is unexpected. +The change history states that the description is derived from Tru64. +According to its manual pages, that system also supported the \fB\-v\fP option. +.PP +Shortly after Issue 7 was released, Tru64 was discontinued. +As of 2019, the surviving implementations of \fBtic\fP +are SVr4 (AIX, HP-UX and Solaris), +\fI\%ncurses\fP +and NetBSD curses. +The SVr4 \fBtic\fP programs all support the \fB\-v\fP option. +The NetBSD \fBtic\fP program follows X/Open's documentation, +omitting the \fB\-v\fP option. +.PP +The X/Open rationale states that some implementations of \fBtic\fP +read terminal descriptions from the standard input if the \fIfile\fP +parameter is omitted. +None of these implementations do that. +Further, it comments that some may choose to read from \*(''./terminfo.src\*('' +but that is obsolescent behavior from SVr2, +and is not (for example) a documented feature of SVr3. +.SH HISTORY +System V Release 2 provided a \fBtic\fP utility. +It accepted a single option: \fB\-v\fP (optionally followed by a number). +According to Ross Ridge's comment in \fImytinfo\fP, +this version of \fBtic\fP was +unable to represent canceled capabilities. +.PP +System V Release 3 provided a different \fBtic\fP utility, +written by Pavel Curtis, +(originally named \*(``compile\*('' in \fIpcurses\fP). +This added an option \fB\-c\fP to check the file for +errors, with the caveat that errors in \*(``use=\*('' links +would not be reported. +System V Release 3 documented a few warning messages which +did not appear in \fIpcurses\fP. +While the program itself was changed little as development +continued with System V Release 4, +the table of capabilities grew from 180 (\fIpcurses\fP) to 464 (Solaris). +.PP +In early development of \fI\%ncurses\fP (1993), +Zeyd Ben-Halim used the table from \fImytinfo\fP to +extend the \fIpcurses\fP table to 469 capabilities +(456 matched SVr4, 8 were only in SVr4, 13 were not in SVr4). +Of those 13, 11 were ultimately discarded +(perhaps to match the draft of X/Open Curses). +The exceptions were +\fB\%memory_lock_above\fP and +\fB\%memory_unlock\fP (see \fB\%user_caps\fP(5)). +.PP +Eric Raymond incorporated parts of \fImytinfo\fP into \fI\%ncurses\fP +to implement the termcap-to-terminfo source conversion, +and extended that to begin development of +the corresponding terminfo-to-termcap source conversion, +Thomas Dickey completed that development over the course of several years. +.PP +In 1999, Thomas Dickey added the \fB\-x\fP option +to support user-defined capabilities. +.PP +In 2010, Roy Marples provided a \fBtic\fP program +and terminfo library for NetBSD. +That implementation adapts several features from \fI\%ncurses\fP, +including \fB@TIC@\fP's \fB\-x\fP option. +.PP +The \fB\-c\fP option tells \fB@TIC@\fP to check for problems in the +terminfo source file. +Continued development provides additional checks: +.bP +\fIpcurses\fP had 8 warnings +.bP +\fI\%ncurses\fP in 1996 had 16 warnings +.bP +Solaris (SVr4) curses has 28 warnings +.bP +NetBSD tic in 2019 has 19 warnings. +.bP +\fI\%ncurses\fP in 2019 has 96 warnings +.PP +The checking done in \fI\%ncurses\fP' \fB@TIC@\fP helps with the +conversion to termcap, +as well as pointing out errors and inconsistencies. +It is also used to ensure consistency with the user-defined capabilities. +There are 527 distinct capabilities in \fI\%ncurses\fP' terminal +database; +128 of those are user-defined. +.SH AUTHORS +Eric S. Raymond +and +.br +Thomas E. Dickey +.SH SEE ALSO +\fB\%@CAPTOINFO@\fP(1M), +\fB\%@INFOCMP@\fP(1M), +\fB\%@INFOTOCAP@\fP(1M), +\fB\%@TOE@\fP(1M), +\fB\%curses\fP(3X), +\fB\%term\fP(5), +\fB\%terminfo\fP(5), +\fB\%user_caps\fP(5) diff --git a/contrib/ncurses/man/toe.1m b/contrib/ncurses/man/toe.1m new file mode 100644 index 00000000..891570e4 --- /dev/null +++ b/contrib/ncurses/man/toe.1m @@ -0,0 +1,241 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2019-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2015,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: toe.1m,v 1.69 2024/05/11 20:39:53 tom Exp $ +.TH @TOE@ 1M 2024-05-11 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.ie n .ds CW R +.el \{ +.ie \n(.g .ds CW CR +.el .ds CW CW +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%@TOE@\fP \- +list table of entries of \fIterminfo\fR terminal types +.SH SYNOPSIS +.B @TOE@ +.RB [ \-ahs ] +.RB [ \-v\ \c +.RI [ n ]] +.RI [ directory +\&.\|.\|.] +.PP +.B @TOE@ +.RB [ \-u | \-U ] +.I file +.PP +.B "@TOE@ \-V" +.SH DESCRIPTION +\fB\%@TOE@\fP reports to the standard output stream the (primary) names +and descriptions of the terminal types available to the \fIterminfo\fP +library. +Each \fIdirectory\fP is scanned; +if none are given, +\fB\%@TOE@\fP scans the default \fIterminfo\fP directory. +.SH OPTIONS +The \fB\-h\fP option can be helpful to observe where \fB\%@TOE@\fP is +looking for terminal descriptions. +Other options support maintainers of \fIterminfo\fP terminal +descriptions. +.TP 9 \" "-u file" + 2n +.B \-a +lists entries from all terminal database directories that \fIterminfo\fP +would search, +instead of only the first that it finds. +.IP +If +.B \-s +is also given, +\fB\%@TOE@\fP +additionally reports, +like \fI\%conflict\fP(1), +which entries correspond to a given terminal database. +An \*(``*\*('' marks entries that differ, +and \*(``+\*('' marks equivalent entries. +.IP +Without the \fB\-s\fP option, +\fB\%@TOE@\fP does not attempt to merge duplicates in its report. +.TP +.B \-h +writes a heading naming each each directory as it is accessed. +.TP +.B \-s +sorts the output by the entry names. +.TP +.BI \-u\ file +lists terminal type dependencies in \fIfile\fP, +a \fIterminfo\fP entry source or \fItermcap\fP database file. +The report summarizes the \*(``\fBuse\fP\*('' (\fIterminfo\fP) and +\fBtc\fP (\fItermcap\fP) relations: +each line comprises the primary name of a terminal type employing +\fBuse\fP/\fBtc\fP capabilities, +a colon, +a space- and tab-separated list of primary names of terminal types thus +named, +and a newline. +.TP +.BI \-U\ file +lists terminal type reverse dependencies in \fIfile\fP, +a \fIterminfo\fP entry source or \fItermcap\fP database file. +The report summarizes the \*(``\fBuse\fP\*('' (\fIterminfo\fP) and +\fBtc\fP (\fItermcap\fP) reverse relations: +each line comprises the primary name of a terminal type occurring in +\fBuse\fP/\fBtc\fP capabilities, +a colon, +a space- and tab-separated list of primary names of terminal types +naming them thus, +and a newline. +.TP +.BR \-v\ [\c +.IR n ] +reports verbose status information to the standard error stream, +showing \fB\%@TOE@\fP's progress. +.IP +The optional parameter \fIn\fP is an integer between 1 and 10 inclusive, +interpreted as for \fB\%@TIC@\fP(1M). +If \fI\%ncurses\fP is built without tracing support, +\fIn\fP is ignored. +.TP +\fB\-V\fP +reports the version of \fI\%ncurses\fP associated +with this program and exits with a successful status. +.SH FILES +.TP +.I @TERMINFO@ +compiled terminal description database +.SH PORTABILITY +\fB\%@TOE@\fP is not provided by other implementations. +There is no applicable X/Open or POSIX standard for it. +.SH HISTORY +\fB\%@TOE@\fP replaces a \fB\-T\fP option that was briefly supported by +the \fI\%ncurses\fP \fB\%infocmp\fP utility in 1995. +.PP +The \fB\-a\fP and \fB\-s\fP options were added in 2006 and 2011, +respectively. +.PP +The program's name originates with a developer's pun: +.bP +\fBtic\fP, +.bP +\fBtac\fP (now \fBtack\fP), +.bP +\fBtoe\fP. +.SH EXAMPLES +When not sorting with the \fB\-s\fP option, +the \fB\-a\fP option reports all of the names found in all of the +terminal database directories named in the \fI\%TERMINFO\fP and +\fI\%TERMINFO_DIRS\fP environment variables. +.RS 4 +.PP +.\" toe -a | grep -E '^(xterm|vt)' +.ft \*(CW +.TS +L2 Lx. +xterm\-color generic color xterm +xterm\-xfree86 xterm terminal emulator (XFree86) +xterm\-vt220 xterm emulating vt220 +xterm\-256color xterm with 256 colors +xterm\-r6 xterm X11R6 version +xterm\-r5 xterm R5 version +xterm\-mono monochrome xterm +xterm T{ +.ad l +xterm terminal emulator (X Window System) +T} +vt220 dec vt220 +vt102 dec vt102 +vt100 dec vt100 (w/advanced video) +vt52 dec vt52 +.T& +L. +\&.\|.\|. +.TE +.ft +.RE +.PP +Use the \fB\-a\fP and \fB\-s\fP options together to show where each +terminal description was found. +.RS 4 +.PP +.\" toe -as | grep -E '(^-+>|:.(xterm|vt))' +.ft \*(CW +.TS +Lx. +\-\-> /etc/terminfo +\-\-\-\-> /lib/terminfo +\-\-\-\-\-\-> /usr/share/terminfo +.TE +.TS +L1 L2 Lx. +\-\-*\-\-\-: vt100 dec vt100 (w/advanced video) +\-\-*\-\-\-: vt102 dec vt102 +\-\-*\-\-\-: vt220 dec vt220 +\-\-*\-\-\-: vt52 dec vt52 +\-\-*\-\-\-: xterm T{ +.ad l +xterm terminal emulator (X Window System) +T} +\-\-*\-\-\-: xterm\-256color xterm with 256 colors +\-\-*\-\-\-: xterm\-color generic color xterm +\-\-*\-\-\-: xterm\-mono monochrome xterm +\-\-*\-\-\-: xterm\-r5 xterm R5 version +\-\-*\-\-\-: xterm\-r6 xterm X11R6 version +\-\-*\-\-\-: xterm\-vt220 xterm emulating vt220 +\-\-*\-\-\-: xterm\-xfree86 T{ +.ad l +xterm terminal emulator (XFree86) +T} +.T& +L. +\&.\|.\|. +.TE +.ft +.RE +.SH SEE ALSO +\fB\%@CAPTOINFO@\fP(1M), +\fB\%@INFOCMP@\fP(1M), +\fB\%@INFOTOCAP@\fP(1M), +\fB\%@TIC@\fP(1M), +\fB\%curses\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/tput.1 b/contrib/ncurses/man/tput.1 new file mode 100644 index 00000000..ffc4b1cd --- /dev/null +++ b/contrib/ncurses/man/tput.1 @@ -0,0 +1,1012 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: tput.1,v 1.120 2024/09/14 20:06:50 tom Exp $ +.TH @TPUT@ 1 2024-09-14 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +\fB\%@TPUT@\fP \- +initialize a terminal, exercise its capabilities, or query \fI\%term\%info\fP database +.SH SYNOPSIS +\fB@TPUT@\fP [\fB\-v\fP] [\fB\-T\fP \fIterminal-type\fP] +{\fIcap-code\fP [\fIparameter\fP .\|.\|.\&]} .\|.\|. +.PP +\fB@TPUT@\fP [\fB\-v\fP] [\fB\-T\fP \fIterminal-type\fP] [\fB\-x\fP] \fBclear\fP +.PP +\fB@TPUT@\fP [\fB\-v\fP] [\fB\-T\fP \fIterminal-type\fP] \fBinit\fP +.PP +\fB@TPUT@\fP [\fB\-v\fP] [\fB\-T\fP \fIterminal-type\fP] \fB\%reset\fP +.PP +\fB@TPUT@\fP [\fB\-v\fP] [\fB\-T\fP \fIterminal-type\fP] \fB\%longname\fP +.PP +\fB@TPUT@\fP [\fB\-v\fP] \fB\-S\fP +.PP +\fB@TPUT@\fP [\fB\-v\fP] \fB\-V\fP +.SH DESCRIPTION +\fB\%@TPUT@\fP uses the +.I \%term\%info +library and database to make terminal-specific capabilities and +information available to the shell, +to initialize or reset the terminal, +or +to report a description of the current +(or specified) +terminal type. +Terminal capabilities are accessed by +.IR cap-code . +.PP +\fB\%terminfo\fP(5) discusses terminal capabilities at length +and presents a complete list of +.IR cap-codes . +.PP +When retrieving capability values, +the result depends upon the capability's type. +.TP 9 \" "Boolean" + 2n +Boolean +\fB\%@TPUT@\fP sets its exit status to +.B 0 +if the terminal possesses +.IR cap-code , +and +.B 1 +if it does not. +.TP +numeric +\fB\%@TPUT@\fP writes +.IR cap-code 's +decimal value to the standard output stream if defined +.RB ( \-1 +if it is not) +followed by a newline. +.TP +string +\fB\%@TPUT@\fP writes +.IR cap-code 's +value to the standard output stream if defined, +without a trailing newline. +.PP +Before using a value returned on the standard output, +the application should test \fB\%@TPUT@\fP's exit status +to be sure it is 0; +see section \*(``EXIT STATUS\*('' below. +.SS Operands +Generally, +an operand is a +.IR cap-code , +a capability code from the terminal database, +or a parameter thereto. +Three others are specially recognized by \fB\%@TPUT@\fP: +.BR init , +.BR \%reset , +and +.BR \%longname . +Although these resemble capability codes, +they in fact receive special handling; +we term them \*(``pseudo-capabilities\*(''. +.TP 11n \" "longname" + 2n + adjustment for PDF +.I cap-code +indicates a capability from the terminal database. +.IP +If +.I cap-code +is of string type and takes parameters, +\fB\%@TPUT@\fP interprets arguments following +.I cap-code +as the parameters, +up to the (fixed) quantity the capability requires. +.IP +Most parameters are numeric. +Only a few terminal capabilities require string parameters; +\fB\%@TPUT@\fP uses a table to decide which to pass as strings. +Normally \fB\%@TPUT@\fP uses \fB\%tparm\fP(3X) to perform the +substitution. +If no parameters are given for the capability, +\fB\%@TPUT@\fP writes the string without performing the substitution. +.TP +.B init +initializes the terminal. +If the terminal database is present +and an entry for the user's terminal type exists, +the following occur. +.RS +.TP 5 +(1) +\fB\%@TPUT@\fP retrieves the terminal's mode settings. +It successively tests the file descriptors corresponding to +.RS +.bP +the standard error stream, +.bP +the standard output stream, +.bP +the standard input stream, +and +.bP +.I \%/dev/tty +.RE +.IP +to obtain terminal settings. +Having retrieved them, +\fB\%@TPUT@\fP remembers which descriptor to use for further updates. +.TP +(2) +If the terminal dimensions cannot be obtained from the operating system, +but the environment or terminal type database entry describes them, +\fB\%@TPUT@\fP updates the operating system's notion of them. +.TP +(3) +\fB\%@TPUT@\fP updates the terminal modes. +.RS +.bP +Any delays specified in the entry +(for example, +when a newline is sent) +are set in the terminal driver. +.bP +Tab expansion is turned on or off per the specification in the entry, +and +.bP +if tabs are not expanded, +standard tabs +(every 8 spaces) +are set. +.RE +.TP +(4) +If initialization capabilities, +detailed in subsection \*(``Tabs and Initialization\*('' of +\fB\%terminfo\fP(5), +are present, +\fB\%@TPUT@\fP writes them to the standard output stream. +.TP +(5) +\fB\%@TPUT@\fP flushes the standard output stream. +.RE +.IP +If an entry lacks the information needed for an activity above, +that activity is silently skipped. +.TP +.B reset +re-initializes the terminal. +A reset differs from initialization in two ways. +.RS +.TP 5 +(1) +\fB\%@TPUT@\fP sets the the terminal modes to a \*(``sane\*('' state, +.RS +.bP +enabling cooked and echo modes, +.bP +disabling cbreak and raw modes, +.bP +enabling newline translation, +and +.bP +setting any unset special characters to their default values. +.RE +.TP 5 +(2) +If any reset capabilities are defined for the terminal type, +\fB\%@TPUT@\fP writes them to the output stream. +Otherwise, +\fB\%@TPUT@\fP uses any defined initialization capabilities. +Reset capabilities are detailed in subsection +\*(``Tabs and Initialization\*('' of \fB\%terminfo\fP(5). +.RE +.TP +.B longname +A +.I \%term\%info +entry begins with one or more names by which an application +can refer to the entry, +before the list of terminal capabilities. +The names are separated by \*(``|\*('' characters. +X/Open Curses terms the last name the \*(``long name\*('', +and indicates that it may include blanks. +.IP +\fB\%@TIC@\fP warns if the last name does not include blanks, +to accommodate old +.I \%term\%info +entries that treated the long name as an optional feature. +The long name is often referred to as the description field. +.IP +If the terminal database is present and an entry for the user's terminal +type exists, +\fB\%@TPUT@\fP reports its description to the standard output stream, +without a trailing newline. +See \fB\%terminfo\fP(5). +.PP +.I Note: +Redirecting the output of +.RB \%\*(`` "@TPUT@ init" \*('' +or +.RB \%\*(`` "@TPUT@ reset" \*('' +to a file will capture only part of their actions. +Changes to the terminal modes are not affected by file descriptor +redirection, +since the terminal modes are altered via \fB\%ioctl\fP(2). +.SS Aliases +If \fB\%@TPUT@\fP is invoked via link with any of the names +.BR clear , +.BR init , +or +.BR \%reset , +it operates as if run with the corresponding (pseudo-)capability +operand. +For example, +executing a link named +.B \%reset +that points to \fB\%@TPUT@\fP has the same effect as +.RB \%\*(`` "@TPUT@ \%reset" \*(''. +.PP +This feature was introduced by +.I \%ncurses +5.2 in 2000. +It is rarely used: +.TP +.B \%clear +is a separate program, +which is both smaller and more frequently executed. +.TP +.B init +has the same name as another program in widespread use. +.TP +.B \%reset +is provided +by the \fB\%@TSET@\fP(1) utility (also via a link named +.BR \%reset ")." +.SS "Terminal Size" +Besides the pseudo-capabilities +(such as +.BR init ), +\fB\%@TPUT@\fP treats the +.B lines +and +.B cols +.I cap-codes +specially: +it may call \fB\%setupterm\fP(3X) to obtain the terminal size. +.bP +First, +\fB\%@TPUT@\fP attempts to obtain these capabilities from the terminal +database. +This generally fails for terminal emulators, +which lack a fixed window size and thus omit the capabilities. +.bP +It then asks the operating system for the terminal's size, +which generally works, +unless the connection is via a serial line that +does not support \*(``NAWS\*('': negotiations about window size. +.bP +Finally, +it inspects the environment variables +.I LINES +and +.IR \%COLUMNS , +which may override the terminal size. +.PP +If the +.B \-T +option is given, +\fB\%@TPUT@\fP ignores the environment variables by calling +.BR \%use_tioctl(TRUE) , +relying upon the operating system +(or, +ultimately, +the terminal database). +.SH OPTIONS +.TP 9n \" "-T type" + 2n +.B \-S +retrieves more than one capability per invocation of \fB\%@TPUT@\fP. +The capabilities must be passed to \fB\%@TPUT@\fP from the standard +input stream instead of from the command line +(see section \*(``EXAMPLES\*('' below). +Only one +.I cap-code +is allowed per line. +The +.B \-S +option changes the meanings of the +.B 0 +and +.B 1 +exit statuses +(see section \*(``EXIT STATUS\*('' below). +.IP +Some capabilities use string parameters rather than numeric ones. +\fB\%@TPUT@\fP employs a built-in table and the presence of parameters +in its input to decide how to interpret them, +and whether to use \fB\%tparm\fP(3X). +.TP +.BI \-T\ type +indicates the terminal's +.IR type . +Normally this option is unnecessary, +because a default is taken from the +.I TERM +environment variable. +If specified, +the environment variables +.I LINES +and +.I \%COLUMNS +are also ignored. +.TP +.B \-v +causes \fB\%@TPUT@\fP to operate verbosely, +reporting warnings. +.TP +.B \-V +reports the version of +.I \%ncurses +associated with \fB\%@TPUT@\fP, +and exits with a successful status. +.TP +.B \-x +prevents +.RB \%\*(`` "@TPUT@ clear" \*('' +from attempting to clear the scrollback buffer. +.SH EXIT STATUS +Normally, +one should interpret \fB\%@TPUT@\fP's exit statuses as follows. +.PP +.if n .ne 3 +.if t .ne 2 +.TS +Lb Lb +Lb Lx. +Status Meaning When \-S Not Specified +_ +0 Boolean or string capability present +1 Boolean or numeric capability absent +2 usage error or no terminal type specified +3 unrecognized terminal type +4 unrecognized capability code +>4 system error (4 + \fBerrno\fP) +.TE +.PP +When the +.B \-S +option is used, +some statuses change meanings. +.PP +.if n .ne 4 +.if t .ne 3 +.TS +Lb Lb +Lb Lx. +Status Meaning When \-S Specified +_ +0 all operands interpreted +1 unused +4 some operands not interpreted +.TE +.SH ENVIRONMENT +\fB@TPUT@\fP reads one environment variable. +.TP 8n \" "TERM" + 2n + adjustment for PDF +.I TERM +denotes the terminal type. +Each terminal type is distinct, +though many are similar. +The +.B \-T +option overrides its value. +.SH FILES +.TP +.I @DATADIR@/tabset +tab stop initialization database +.TP +.I @TERMINFO@ +compiled terminal description database +.SH PORTABILITY +Over time +.I \%ncurses +\fB\%@TPUT@\fP +has differed from that of System\ V in two important respects, +one now mostly historical. +.bP +\%\*(``\fB@TPUT@\fP +.IR cap-code \*('' +writes to the standard output, +which need not be a terminal device. +However, +the operands that manipulate terminal modes might not use the standard +output. +.IP +System\ V +.BR tput 's +.B init +and +.B \%reset +operands use logic from 4.1cBSD +.BR tset , +manipulating terminal modes. +It checks the same file descriptors +(and +.IR \%/dev/tty ) +for association with a terminal device as +.I \%ncurses +now does, +and if none are, +finally assumes a 1200 baud terminal. +When updating terminal modes, +it ignores errors. +.IP +Until +.I \%ncurses +6.1 +(see section \*(``HISTORY\*('' below), +\fB\%@TPUT@\fP did not modify terminal modes. +It now employs a scheme similar to System\ V, +using functions shared with \fB\%@TSET@\fP +(and ultimately based on 4.4BSD +.BR tset ). +If it is not able to open a terminal +(for instance, +when run by \fIcron\fP(1)), +\fB\%@TPUT@\fP exits with an error status. +.bP +System\ V +.B tput +assumes that the type of a +.I cap-code +operand is numeric if all the characters of its value are decimal +numbers; +if they are not, +it treats +.I cap-code +as a string capability. +.IP +Most implementations that provide support for +.I cap-code +operands use the \fB\%tparm\fP(3X) function to expand its parameters. +That function expects a mixture of numeric and string parameters, +requiring \fB\%@TPUT@\fP to know which type to use. +.IP +.I \%ncurses +\fB\%@TPUT@\fP +uses a table to determine the parameter types for +the standard +.I cap-code +operands, +and an internal function to analyze nonstandard +.I cap-code +operands. +.IP +While more reliable than System\ V's utility, +a portability problem is introduced by this analysis. +An OpenBSD developer adapted the internal library function from +.I \%ncurses +to port NetBSD's +.IR termcap -based +.B tput +to +.IR \%term\%info , +and modified it to interpret multiple +.I cap-codes +(and parameters) +on the command line. +Portable applications should not rely upon this feature; +.I \%ncurses +offers it to support applications written specifically for OpenBSD. +.PP +This implementation, +unlike others, +accepts both +.I termcap +and +.I \%term\%info +.I cap-codes +if +.I termcap +support is compiled in. +In that case, +however, +the predefined +.I termcap +and +.I \%term\%info +codes have two +ambiguities; +.I \%ncurses +assumes the +.I \%term\%info +code. +.bP +The +.I cap-code +.B dl +means +.B \%delete_line +to +.I termcap +but +.B \%parm_delete_line +to +.IR \%term\%info . +.I termcap +uses the code +.B DL +for +.BR \%parm_delete_line . +.I \%term\%info +uses the code +.B dl1 +for +.BR \%delete_line . +.bP +The +.I cap-code +.B ed +means +.B \%exit_delete_mode +to +.I termcap +but +.B \%clr_eos +to +.IR \%term\%info . +.I termcap +uses the code +.B cd +for +.BR \%clr_eos . +.I \%term\%info +uses the code +.B rmdc +for +.BR \%exit_delete_mode . +.PP +The +.B \%longname +operand, +.B \-S +option, +and the parameter-substitution features used in the +.B cup +example below, +were not supported in +AT&T/USL +.I curses +before SVr4 (1989). +Later, +4.3BSD-Reno (1990) added support for +.BR \%longname , +.\" longname was added in October 1989. +and in 1994, +NetBSD added support for the parameter-substitution features. +.PP +IEEE Std 1003.1/The Open Group Base Specifications Issue 7 +(POSIX.1-2008) +documents only the +.BR clear , +.BR init , +and +.B \%reset +operands. +A few observations of interest arise from that selection. +.bP +.I \%ncurses +supports +.B clear +as it does any other standard +.IR cap-code . +The others +.RB ( init +and +.BR \%longname ) +do not correspond to terminal capabilities. +.bP +The +.B tput +on SVr4-based systems such as Solaris, +IRIX64, +and HP-UX, +as well as others such as AIX and Tru64, +also support standard +.I cap-code +operands. +.bP +A few platforms such as FreeBSD recognize +.I termcap +codes rather than +.I \%term\%info +capability codes in their respective +.B tput +commands. +Since 2010, +NetBSD's +.B tput +uses +.I \%term\%info +codes. +Before that, +it +(like FreeBSD) +recognized +.I termcap +codes. +.IP +Beginning in 2021, +FreeBSD uses +.I \%ncurses +.BR tput , +configured for both +.I \%term\%info +(tested first) +and +.I termcap +(as a fallback). +.PP +Because (apparently) all +.I certified +Unix systems support the full set of capability codes, +the reason for documenting only a few may not be apparent. +.bP +X/Open Curses Issue 7 documents +.B tput +differently, +with +.I cap-code +and the other features used in this implementation. +.bP +That is, +there are two standards for +.BR tput : +POSIX (a subset) and X/Open Curses (the full implementation). +POSIX documents a subset to avoid the complication of including +X/Open Curses and the terminal capability database. +.bP +While it is certainly possible to write a +.B tput +program without using +.IR curses , +no system with a +.I curses +implementation provides a +.B tput +utility that does not also support standard +.IR cap-codes . +.PP +X/Open Curses Issue 7 (2009) is the first version to document utilities. +However that part of X/Open Curses does not follow existing practice +(that is, +System\ V +.I curses +behavior). +.bP +It assigns exit status 4 to \*(``invalid operand\*('', +which may have the same meaning as \*(``unknown capability\*(''. +For instance, +the source code for +Solaris +.I xcurses +uses the term \*(``invalid\*('' in this case. +.bP +It assigns exit status 255 to a numeric variable that is not specified +in the +.I \%term\%info +database. +That likely is a documentation error, +mistaking the \*(``\-1\*('' written to the standard output to indicate +an absent or canceled numeric capability for an (unsigned) exit status. +.PP +The various System\ V implementations +(AIX, +HP-UX, +Solaris) +use the same exit statuses as +.IR \%ncurses . +.PP +NetBSD +.I curses +documents exit statuses that correspond to neither +.I \%ncurses +nor X/Open Curses. +.SH HISTORY +Bill Joy wrote a +.B tput +command during development of 4BSD in October 1980. +This initial version only cleared the screen, +and did not ship with official distributions. +.\" It also exited with backwards exit status (1 on success, 0 on +.\" failure), and was characterized by Bostic in 1988 as "pretty +.\" unreasonable". +.\" See Spinellis's "unix-history-repo" on GitHub. +.PP +System\ V developed a different +.B tput +command. +.bP +SVr2 (1984) provided a rudimentary +.B tput +that checked the parameter against each +predefined capability and returned the corresponding value. +This version of +.B tput +did not use \fB\%tparm\fP(3X) for parameterized capabilities. +.bP +SVr3 (1987) replaced that +.\" SVr3 released in 1987, not 1985. +.\" https://unix.org/what_is_unix/history_timeline.html +with a more extensive program +whose support for +.B init +and +.B \%reset +operands +(more than half the program) +incorporated the +.B \%reset +feature of BSD +.B tset +written by Eric Allman. +.bP +SVr4 (1989) added color initialization by using the +.B \%orig_colors +.RB ( oc ) +and +.B \%orig_pair +.RB ( op ) +capabilities in its +.B init +logic. +.PP +Keith Bostic refactored BSD +.B tput +for shipment in 4.3BSD-Tahoe (1988), +then replaced it the next year with a new implementation based on +System\ V +.BR tput . +Bostic's version similarly accepted some parameters named for +.I \%term\%info +(pseudo-)capabilities: +.BR clear , +.BR init , +.BR \%longname , +and +.BR \%reset . +However, +because he had only +.I termcap +available, +it accepted +.I termcap +codes for other capabilities. +Also, +Bostic's BSD +.B tput +did not modify the terminal modes as the earlier BSD +.B tset +had done. +.PP +At the same time, +Bostic added a shell script named \*(``clear\*('' that used +.B tput +to clear the screen. +Both of these appeared in 4.4BSD, +becoming the \*(``modern\*('' BSD implementation of +.BR tput . +.PP +The origin of +.I \%ncurses +\fB\%@TPUT@\fP lies outside both System\ V and BSD, +in Ross Ridge's +.I \%mytinfo +package, +published on +.I comp.sources.unix +in December 1992. +Ridge's program made more sophisticated use of the terminal capabilities +than the BSD program. +Eric Raymond used that +.B tput +program +(and other parts of +.IR \%mytinfo ) +in +.I \%ncurses +in June 1995. +Incorporating the portions dealing with terminal capabilities +almost without change, +Raymond made improvements to the way command-line parameters +were handled. +.PP +Before +.I \%ncurses +6.1 (2018), +its \fB\%@TSET@\fP and \fB\%@TPUT@\fP utilities differed. +.bP +\fB\%@TSET@\fP was more effective, +resetting the terminal modes and special characters. +.bP +On the other hand, +\fB\%@TSET@\fP's repertoire of terminal capabilities for resetting the +terminal was more limited; +it had only equivalents of +.B \%reset_1string +.RB ( rs1 ), +.B \%reset_2string +.RB ( rs2 ), +and +.B \%reset_file +.RB ( rf ), +and not the tab stop and margin update features of \fB\%@TPUT@\fP. +.PP +The +.B \%reset +program is traditionally an alias for \fB\%@TSET@\fP due to its ability +to reset terminal modes and special characters. +.PP +As of +.I \%ncurses +6.1, +the \*(``reset\*('' features of the two programs are (mostly) the same. +Two minor differences remain. +.bP +When issuing a reset, +the \fB\%@TSET@\fP program +checks whether the device appears to be a pseudoterminal +(as might be used by a terminal emulator program), +and, +if it does not, +waits one second in case it is communicating with a hardware terminal. +.bP +The two programs write the terminal initialization strings +to different streams; +that is, +standard error for \fB\%@TSET@\fP and +standard output for \fB\%@TPUT@\fP. +.SH EXAMPLES +.TP +.B "@TPUT@ init" +Initialize the terminal according to the type of +terminal in the +.I TERM +environment variable. +If the system does not reliably initialize the terminal upon login, +this command can be included in +.I \%$HOME/.profile +after exporting the +.I TERM +environment variable. +.TP +.B "@TPUT@ \-T5620 reset" +Reset an AT&T 5620 terminal, +overriding the terminal type in the +.I TERM +environment variable. +.TP +.B "@TPUT@ cnorm" +Set cursor to normal visibility. +.TP +.B "@TPUT@ home" +Move the cursor to line 0, +column 0: +the upper left corner of the screen, +usually known as the \*(``home\*('' cursor position. +.TP +.B "@TPUT@ clear" +Clear the screen: +write the +.B \%clear_screen +capability's value to the standard output stream. +.TP +.B "@TPUT@ cols" +Report the number of columns used by the current terminal type. +.TP +.B "@TPUT@ \-Tadm3a cols" +Report the number of columns used by an ADM-3A terminal. +.TP +.B "strong=\(ga@TPUT@ smso\(ga normal=\(ga@TPUT@ rmso\(ga" +Set shell variables to capability values: +.B strong +and +.BR normal , +to begin and end, +respectively, +stand-out mode for the terminal. +One might use these to present a prompt. +.IP +.EX +.RS 14 +printf "${strong}Username:${normal} " +.RE +.EE +.TP +.B "@TPUT@ hc" +Indicate via exit status whether the terminal is a hard copy device. +.TP +.B "@TPUT@ cup 23 4" +Move the cursor to line 23, +column 4. +.TP +.B "@TPUT@ cup" +Report the value of the +.B \%cursor_address +.RB ( cup ) +capability +(used for cursor movement), +with no parameters substituted. +.TP +.B "@TPUT@ longname" +Report the +.I \%term\%info +database's description of the terminal type specified in the +.I TERM +environment variable. +.TP +.B "@TPUT@ \-S" +Process multiple capabilities. +The +.B \-S +option can be profitably used with a shell \*(``here document\*(''. +.IP +.EX +.RB $\ "@TPUT@ \-S <\ clear +.RB >\ "cup 10 10" +.RB >\ bold +.RB >\ ! +.EE +.IP +The foregoing +clears the screen, +moves the cursor to position +(10, 10) +and turns on bold +(extra bright) +mode. +.TP +.B "@TPUT@ clear cup 10 10 bold" +Perform the same actions as the foregoing +.RB \%\*(`` "@TPUT@ \-S" \*('' +example. +.SH SEE ALSO +\fB\%@CLEAR@\fP(1), +\fB\%stty\fP(1), +\fB\%@TABS@\fP(1), +\fB\%@TSET@\fP(1), +\fB\%curs_termcap\fP(3X), +\fB\%terminfo\fP(5) diff --git a/contrib/ncurses/man/tset.1 b/contrib/ncurses/man/tset.1 new file mode 100644 index 00000000..8542bba4 --- /dev/null +++ b/contrib/ncurses/man/tset.1 @@ -0,0 +1,466 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2016,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: tset.1,v 1.88 2024/06/08 20:51:12 tom Exp $ +.TH @TSET@ 1 2024-06-08 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "User commands" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.ds ^ \(ha +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.ds ^ ^ +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +. +.SH NAME +\fB\%@TSET@\fP, +\fB\%@RESET@\fP \- +initialize or reset terminal state +.SH SYNOPSIS +\fB@TSET@\fP [\fB\-IQVcqrsw\fP] [\fB\-\fP] [\fB\-e\fP \fIch\fP] [\fB\-i\fP \fIch\fP] [\fB\-k\fP \fIch\fP] [\fB\-m\fP \fImapping\fP] [\fIterminal-type\fP] +.br +\fB@RESET@\fP [\fB\-IQVcqrsw\fP] [\fB\-\fP] [\fB\-e\fP \fIch\fP] [\fB\-i\fP \fIch\fP] [\fB\-k\fP \fIch\fP] [\fB\-m\fP \fImapping\fP] [\fIterminal-type\fP] +.SH DESCRIPTION +.SS "\fItset\fP \(em initialization" +This program initializes terminals. +.PP +First, \fB@TSET@\fP retrieves the current terminal mode settings +for your terminal. +It does this by successively testing +.bP +the standard error, +.bP +standard output, +.bP +standard input and +.bP +ultimately \*(``/dev/tty\*('' +.PP +to obtain terminal settings. +Having retrieved these settings, \fB@TSET@\fP remembers which +file descriptor to use when updating settings. +.PP +Next, \fB@TSET@\fP determines the type of terminal that you are using. +This determination is done as follows, using the first terminal type found. +.PP +1. The \fBterminal\fP argument specified on the command line. +.PP +2. The value of the \fITERM\fP environment variable. +.PP +3. (BSD systems only.) The terminal type associated with the standard +error output device in the \fI/etc/ttys\fP file. +(On System\ V hosts and systems using that convention, +\fI\%getty\fP(8) does this job by setting +\fITERM\fP according to the type passed to it by \fI\%/etc/inittab\fP.) +.PP +4. The default terminal type, \*(``unknown\*('', +is not suitable for curses applications. +.PP +If the terminal type was not specified on the command-line, the \fB\-m\fP +option mappings are then applied; +see subsection \*(``Terminal Type Mapping\*(''. +Then, if the terminal type begins with a question mark (\*(``?\*(''), the +user is prompted for confirmation of the terminal type. +An empty +response confirms the type, or, another type can be entered to specify +a new type. +Once the terminal type has been determined, +the terminal description for the terminal is retrieved. +If no terminal description is found +for the type, the user is prompted for another terminal type. +.PP +Once the terminal description is retrieved, +.bP +if the \*(``\fB\-w\fP\*('' option is enabled, \fB@TSET@\fP may update +the terminal's window size. +.IP +If the window size cannot be obtained from the operating system, +but the terminal description +(or environment, +e.g., +\fILINES\fP and \fI\%COLUMNS\fP variables specify this), +use this to set the operating system's notion of the window size. +.bP +if the \*(``\fB\-c\fP\*('' option is enabled, +the backspace, interrupt and line kill characters +(among many other things) are set +.bP +unless the \*(``\fB\-I\fP\*('' option is enabled, +the terminal +and tab \fIinitialization\fP strings are sent to the standard error output, +and, +if the terminal device does not appear to be a pseudoterminal +(as might be used by a terminal emulator program), +\fB@TSET@\fP waits one second in case a hardware reset was issued. +.bP +Finally, if the erase, interrupt and line kill characters have changed, +or are not set to their default values, their values are displayed to the +standard error output. +.SS "\fIreset\fP \(em reinitialization" +When invoked as \fB@RESET@\fP, \fB@TSET@\fP sets the terminal +modes to \*(``sane\*('' values: +.bP +sets cooked and echo modes, +.bP +turns off cbreak and raw modes, +.bP +turns on newline translation and +.bP +resets any unset special characters to their default values +.PP +before +doing the terminal initialization described above. +Also, rather than using the terminal \fIinitialization\fP strings, +it uses the terminal \fIreset\fP strings. +.PP +The \fB@RESET@\fP command is useful +after a program dies leaving a terminal in an abnormal state: +.bP +you may have to type +.sp + \fI\fB@RESET@\fI\fR +.sp +(the line-feed character is normally control-J) to get the terminal +to work, as carriage-return may no longer work in the abnormal state. +.bP +Also, the terminal will often not echo the command. +.SS "Setting the Environment" +It is often desirable to enter the terminal type and information about +the terminal's capabilities into the shell's environment. +This is done using the \fB\-s\fP option. +.PP +When the \fB\-s\fP option is specified, the commands to enter the information +into the shell's environment are written to the standard output. +If the \fISHELL\fP environment variable ends in \*(``csh\*('', +the commands +are for \fIcsh\fP(1), +otherwise, +they are for \fIsh\fP(1). +The \fIcsh\fP commands set and unset the shell variable \fBnoglob\fP, +leaving it unset. +The following line in the \fB.login\fP +or \fB.profile\fP files will initialize the environment correctly: +.sp + eval \(ga@TSET@ \-s options ... \(ga +. +.SS "Terminal Type Mapping" +When the terminal is not hardwired into the system (or the current +system information is incorrect) the terminal type derived from the +\fI/etc/ttys\fP file or the \fITERM\fP environment variable is often +something generic like \fBnetwork\fP, \fBdialup\fP, or \fBunknown\fP. +When \fB@TSET@\fP is used in a startup script it is often desirable to +provide information about the type of terminal used on such ports. +.PP +The \fB\-m\fP options maps +from some set of conditions to a terminal type, that is, to +tell \fB@TSET@\fP +\*(``If I'm on this port at a particular speed, +guess that I'm on that kind of terminal\*(''. +.PP +The argument to the \fB\-m\fP option consists of an optional port type, an +optional operator, an optional baud rate specification, an optional +colon (\*(``:\*('') character and a terminal type. +The port type is a +string (delimited by either the operator or the colon character). +The operator may be any combination of +\*(``>\*('', +\*(``<\*('', +\*(``@\*('', +and \*(``!\*(''; +\*(``>\*('' means greater than, +\*(``<\*('' means less than, +\*(``@\*('' means equal to and +\*(``!\*('' inverts the sense of the test. +The baud rate is specified as a number and is compared with the speed +of the standard error output (which should be the control terminal). +The terminal type is a string. +.PP +If the terminal type is not specified on the command line, the \fB\-m\fP +mappings are applied to the terminal type. +If the port type and baud +rate match the mapping, the terminal type specified in the mapping +replaces the current type. +If more than one mapping is specified, the +first applicable mapping is used. +.PP +For example, consider the following mapping: \fBdialup>9600:vt100\fP. +The port type is dialup , the operator is >, the baud rate +specification is 9600, and the terminal type is vt100. +The result of +this mapping is to specify that if the terminal type is \fBdialup\fP, +and the baud rate is greater than 9600 baud, a terminal type of +\fBvt100\fP will be used. +.PP +If no baud rate is specified, the terminal type will match any baud rate. +If no port type is specified, the terminal type will match any port type. +For example, \fB\-m dialup:vt100 \-m :?xterm\fP +will cause any dialup port, regardless of baud rate, to match the terminal +type vt100, and any non-dialup port type to match the terminal type ?xterm. +Note, because of the leading question mark, the user will be +queried on a default port as to whether they are actually using an xterm +terminal. +.PP +No whitespace characters are permitted in the \fB\-m\fP option argument. +Also, to avoid problems with meta-characters, it is suggested that the +entire \fB\-m\fP option argument be placed within single quote characters, +and that \fIcsh\fP users insert a backslash character (\*(``\e\*('') +before any exclamation marks (\*(``!\*(''). +.SH OPTIONS +The options are as follows: +.TP 5 +.B \-c +Set control characters and modes. +.TP 5 +.BI \-e\ ch +Set the erase character to \fIch\fP. +.TP +.B \-I +Do not send the terminal or tab initialization strings to the terminal. +.TP +.BI \-i\ ch +Set the interrupt character to \fIch\fP. +.TP +.BI \-k\ ch +Set the line kill character to \fIch\fP. +.TP +.BI \-m\ mapping +Specify a mapping from a port type to a terminal; +see subsection \*(``Terminal Type Mapping\*(''. +.TP +.B \-Q +Do not display any values for the erase, interrupt and line kill characters. +Normally \fB@TSET@\fP displays the values for control characters which +differ from the system's default values. +.TP +.B \-q +The terminal type is displayed to the standard output, and the terminal is +not initialized in any way. +The option \*(``\-\*('' by itself is equivalent but archaic. +.TP +.B \-r +Print the terminal type to the standard error output. +.TP +.B \-s +Print the sequence of shell commands to initialize the environment variable +\fITERM\fP to the standard output; +see subsection \*(``Setting the Environment\*(''. +.TP +.B \-V +reports the version of \fI\%ncurses\fP which was used in this program, +and exits. +.TP +.B \-w +Resize the window to match the size deduced via \fBsetupterm\fP(3X). +Normally this has no effect, +unless \fBsetupterm\fP is not able to detect the window size. +.PP +The arguments for the \fB\-e\fP, \fB\-i\fP, and \fB\-k\fP +options may either be entered as actual characters +or by using the \*(``hat\*('' +notation, i.e., control-h may be specified as \*(``\*^H\*('' or \*(``\*^h\*(''. +.PP +If neither \fB\-c\fP or \fB\-w\fP is given, both options are assumed. +.SH ENVIRONMENT +The \fB@TSET@\fP command uses these environment variables: +.TP 5 +.I SHELL +tells \fB@TSET@\fP whether to initialize \fITERM\fP using \fIsh\fP(1) or +\fIcsh\fP(1) syntax. +.TP 5 +.I TERM +Denotes your terminal type. +Each terminal type is distinct, though many are similar. +.TP 5 +.I TERMCAP +may denote the location of a termcap database. +If it is not an absolute pathname, e.g., begins with a \*(``/\*('', +\fB@TSET@\fP removes the variable from the environment before looking +for the terminal description. +.SH FILES +.TP +.I /etc/ttys +system port name to terminal type mapping database (BSD versions only). +.TP +.I @TERMINFO@ +compiled terminal description database directory +.SH PORTABILITY +Neither IEEE Std 1003.1/The Open Group Base Specifications Issue 7 +(POSIX.1-2008) nor +X/Open Curses Issue 7 documents \fB@TSET@\fP or \fB@RESET@\fP. +.PP +The AT&T \fBtput\fP utility (AIX, HP-UX, Solaris) +incorporated the terminal-mode manipulation as well as termcap-based features +such as resetting tabstops from \fBtset\fP in BSD (4.1c), +presumably with the intention of making \fBtset\fP obsolete. +However, each of those systems still provides \fBtset\fP. +In fact, the commonly-used \fBreset\fP utility +is always an alias for \fBtset\fP. +.PP +The \fB\%@TSET@\fP utility provides backward compatibility with BSD +environments; +under most modern Unices, +\fI\%/etc/inittab\fP and \fI\%getty\fP(8) can set \fITERM\fP +appropriately for each dial-up line, +obviating what was \fB\%@TSET@\fP's most important use. +This implementation behaves like 4.4BSD \fBtset\fP, +with a few exceptions we shall consider now. +.PP +A few options are different +because the \fI\%TERMCAP\fP variable +is no longer supported under terminfo-based \fI\%ncurses\fP: +.bP +The \fB\-S\fP option of BSD \fBtset\fP no longer works; +it prints an error message to the standard error and dies. +.bP +The \fB\-s\fP option only sets \fITERM\fP, +not \fI\%TERMCAP\fP. +.PP +There was an undocumented 4.4BSD feature +that invoking \fBtset\fP via a link named +\*(``TSET\*('' (or via any other name beginning with an upper-case letter) +set the terminal to use upper-case only. +This feature has been omitted. +.PP +The \fB\-A\fP, \fB\-E\fP, \fB\-h\fP, \fB\-u\fP and \fB\-v\fP +options were deleted from the \fB@TSET@\fP +utility in 4.4BSD. +None of them were documented in 4.3BSD and all are +of limited utility at best. +The \fB\-a\fP, \fB\-d\fP, and \fB\-p\fP options are similarly +not documented or useful, but were retained as they appear to be in +widespread use. +It is strongly recommended that any usage of these +three options be changed to use the \fB\-m\fP option instead. +The \fB\-a\fP, \fB\-d\fP, and \fB\-p\fP options +are therefore omitted from the usage summary above. +.PP +Very old systems, e.g., 3BSD, used a different terminal driver which +was replaced in 4BSD in the early 1980s. +To accommodate these older systems, the 4BSD \fB@TSET@\fP provided a +\fB\-n\fP option to specify that the new terminal driver should be used. +This implementation does not provide that choice. +.PP +It is still permissible to specify the \fB\-e\fP, \fB\-i\fP, +and \fB\-k\fP options without arguments, +although it is strongly recommended that such usage be fixed to +explicitly specify the character. +.PP +As of 4.4BSD, +executing \fB@TSET@\fP as \fB@RESET@\fP no longer implies the \fB\-Q\fP option. +Also, the interaction between the \- option and the \fIterminal\fP +argument in some historic implementations of \fB@TSET@\fP has been removed. +.PP +The \fB\-c\fP and \fB\-w\fP options are not found in earlier implementations. +However, a different window size-change feature was provided in 4.4BSD. +.bP +In 4.4BSD, \fBtset\fP uses the window size from the termcap description +to set the window size if \fBtset\fP is not able to obtain the window +size from the operating system. +.bP +In \fI\%ncurses\fP, \fB@TSET@\fP obtains the window size using +\fB\%setupterm\fP(3X), which may be from +the operating system, +the \fILINES\fP and \fICOLUMNS\fP environment variables or +the terminal description. +.PP +Obtaining the window size from a terminal's type description is common +to both implementations, +but considered obsolescent. +Its only practical use is for hardware terminals. +Generally, +the window size will remain uninitialized only if there were a problem +obtaining the value from the operating system +(and \fB\%setupterm\fP would still fail). +The \fILINES\fP and \fI\%COLUMNS\fP environment variables +may thus be useful for working around window-size problems, +but have the drawback that if the window is resized, +their values must be recomputed and reassigned. +The \fI\%resize\fP(1) program distributed with +\fI\%xterm\fP(1) assists this activity. +.SH HISTORY +A \fB\%reset\fP command written by Kurt Shoens appeared in 1BSD +(March 1978). +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=1BSD/s6/reset.c +It set the \fIerase\fP and \fIkill\fP characters +to \fB\*^H\fP (backspace) and \fB@\fP respectively. +Mark Horton improved this \fB\%reset\fP in 3BSD +(October 1979), +adding \fIintr\fP, +\fIquit\fP, +\fIstart\fP/\fIstop\fP, +and \fIeof\fP +characters as well as changing the program to avoid modifying any user +settings. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/src/cmd/\ +.\" reset.c +That version of \fB\%reset\fP did not use \fI\%termcap\fP. +.PP +Eric Allman wrote a distinct \fBtset\fP command for 1BSD, +using a forerunner of \fI\%termcap\fP called \fI\%ttycap\fP. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=1BSD/s6/tset.c +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=1BSD/man7/ttycap.7 +Allman's comments in the source code indicate +that he began work in October 1977, +continuing development over the next few years. +By late 1979, +it had migrated to \fI\%termcap\fP and handled the \fI\%TERMCAP\fP +variable. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/src/cmd/\ +.\" tset/tset.c +Later comments indicate that \fBtset\fP was modified in September 1980 +to use logic copied from the 3BSD \*(``reset\*('' program when it was +invoked as \fB\%reset\fP. +.\" https://minnie.tuhs.org/cgi-bin/utree.pl?file=2.9BSD/usr/src/ucb/\ +.\" tset/tset.c +This version appeared in 4.1cBSD, \" and backported to 2.9BSD +late in 1982. +Other developers such as Keith Bostic and Jim Bloom continued to modify +\fBtset\fP until 4.4BSD was released in 1993. +.PP +The \fI\%ncurses\fP implementation was lightly adapted from the 4.4BSD +sources to use the \fI\%terminfo\fP API by Eric S.\& Raymond +. +.SH SEE ALSO +\fB\%csh\fP(1), +\fB\%sh\fP(1), +\fB\%stty\fP(1), +\fB\%curs_terminfo\fP(3X), +\fB\%tty\fP(4), +\fB\%terminfo\fP(5), +\fB\%ttys\fP(5), +\fB\%environ\fP(7) diff --git a/contrib/ncurses/man/user_caps.5 b/contrib/ncurses/man/user_caps.5 new file mode 100644 index 00000000..cf5fa858 --- /dev/null +++ b/contrib/ncurses/man/user_caps.5 @@ -0,0 +1,469 @@ +'\" t +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: user_caps.5,v 1.51 2024/06/08 21:01:53 tom Exp $ +.TH user_caps 5 2024-06-08 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "File formats" +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +. +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.SH NAME +user_caps \- +user-defined \fIterminfo\fR capability format +.SH SYNOPSIS +.B @INFOCMP@ \-x +.PP +.B @TIC@ \-x +.SH DESCRIPTION +.SS Background +Before \fI\%ncurses\fP 5.0, +terminfo databases used a \fIfixed repertoire\fP of terminal +capabilities designed for the SVr2 terminal database in 1984, +and extended in stages through SVr4 (1989), +and standardized in X/Open Curses starting in 1995. +.\" That date is a surmise based on the capability list appearing in +.\" Issue 4, Version 2 (1996). That list is not in man page format in +.\" the standard, so lacks a "HISTORY" section. However, `tigetstr()` +.\" and `tputs()` are identified in the same document as new to Issue 4, +.\" so GBR conjectures that the list came in at the same time. +.PP +Most of the \fIextensions\fP in this fixed repertoire were additions +to the tables of Boolean, numeric and string capabilities. +Rather than change the meaning of an existing capability, a new name was added. +The terminfo database uses a binary format; binary compatibility was +ensured by using a header which gave the number of items in the +tables for each type of capability. +The standardization was incomplete: +.bP +The \fIbinary format\fP itself is not described +in the X/Open Curses documentation. +Only the \fIsource format\fP is described. +.IP +Library developers rely upon the SVr4 documentation, +and reverse-engineering the compiled terminfo files to match the binary format. +.bP +Lacking a standard for the binary format, most implementations +copy the SVr2 binary format, which uses 16-bit signed integers, +and is limited to 4096-byte entries. +.IP +The format cannot represent very large numeric capabilities, +nor can it represent large numbers of special keyboard definitions. +.bP +The tables of capability names differ between implementations. +.IP +Although they \fImay\fP provide all of the standard capability names, +the position in the tables differs because some features were added as needed, +while others were added (out of order) to comply with X/Open Curses. +.IP +While \fI\%ncurses\fP' repertoire of predefined capabilities is closest +to Solaris, +Solaris's terminfo database has a few differences from +the list published by X/Open Curses. +For example, +\fI\%ncurses\fP can be configured with tables which match the terminal +databases for AIX, HP-UX or OSF/1, +rather than the default Solaris-like configuration. +.bP +In SVr4 curses and \fI\%ncurses\fP, +the terminal database is defined at compile-time using a text file +which lists the different terminal capabilities. +.IP +In principle, the text-file can be extended, +but doing this requires recompiling and reinstalling the library. +The text-file used in \fI\%ncurses\fP for terminal capabilities includes +details for various systems past the documented X/Open Curses features. +For example, \fI\%ncurses\fP supports these capabilities in each configuration: +.RS 8 +.TP 5 +memory_lock +(meml) +lock memory above cursor +.TP 5 +memory_unlock +(memu) +unlock memory +.TP 5 +box_chars_1 +(box1) +box characters primary set +.RE +.IP +The memory lock/unlock capabilities were included because they were used +in the X11R6 terminal description for \fBxterm\fP(1). +The \fIbox1\fP capability is used in @TIC@ to help with terminal descriptions +written for AIX. +.PP +During the 1990s, some users were reluctant to use terminfo +in spite of its performance advantages over termcap: +.bP +The fixed repertoire prevented users from adding features +for unanticipated terminal improvements +(or required them to reuse existing capabilities as a workaround). +.bP +The limitation to 16-bit signed integers was also mentioned. +Because termcap stores everything as a string, +it could represent larger numbers. +.PP +Although termcap's extensibility was rarely used +(it was never the \fIspeaker\fP who had actually used the feature), +the criticism had a point. +\fI\%ncurses\fP 5.0 provided a way to detect nonstandard capabilities, +determine their +type and optionally store and retrieve them in a way which did not interfere +with other applications. +These are referred to as \fIuser-defined capabilities\fP because no +modifications to the toolset's predefined capability names are needed. +.PP +The \fI\%ncurses\fP utilities \fB@TIC@\fP and \fB@INFOCMP@\fP have a +command-line option \*(``\-x\*('' to control whether the nonstandard +capabilities are stored or retrieved. +A library function \fBuse_extended_names\fP +is provided for the same purpose. +.PP +When compiling a terminal database, if \*(``\-x\*('' is set, +\fB@TIC@\fP will store a user-defined capability if the capability name is not +one of the predefined names. +.PP +Because \fI\%ncurses\fP provides a termcap library interface, +these user-defined capabilities may be visible to termcap applications: +.bP +The termcap interface (like all implementations of termcap) +requires that the capability names are 2-characters. +.IP +When the capability is simple enough for use in a termcap application, +it is provided as a 2-character name. +.bP +There are other +user-defined capabilities which refer to features not usable in termcap, +e.g., parameterized strings that use more than two parameters +or use more than the trivial expression support provided by termcap. +For these, the terminfo database should have only capability names with +3 or more characters. +.bP +Some terminals can send distinct strings for special keys (cursor-, +keypad- or function-keys) depending on modifier keys (shift, control, etc.). +While terminfo and termcap have a set of 60 predefined function-key names, +to which a series of keys can be assigned, +that is insufficient for more than a dozen keys multiplied by more than +a couple of modifier combinations. +The \fI\%ncurses\fP database uses a convention based on \fBxterm\fP(1) +to provide extended special-key names. +.IP +Fitting that into termcap's limitation of 2-character names +would be pointless. +These extended keys are available only with terminfo. +.SS "Recognized Capabilities" +The \fI\%ncurses\fP library uses the user-definable capabilities. +While the terminfo database may have other extensions, +\fI\%ncurses\fP makes explicit checks for these: +.RS 3 +.TP 3 +AX +\fIBoolean\fP, asserts that the terminal interprets SGR 39 and SGR 49 +by resetting the foreground and background color, respectively, to the default. +.IP +This is a feature recognized by the \fBscreen\fP program as well. +.TP 3 +E3 +\fIstring\fP, tells how to clear the terminal's scrollback buffer. +When present, the \fBclear\fP(1) program sends this before clearing +the terminal. +.IP +The command \*(``\fBtput clear\fP\*('' does the same thing. +.TP 3 +NQ +\fIBoolean\fP, +used to suppress a consistency check in @TIC@ for the \fI\%ncurses\fP +capabilities +in user6 through user9 (u6, u7, u8 and u9) +which tell how to query the terminal's cursor position +and its device attributes. +.TP 3 +RGB +\fIBoolean\fP, \fInumber\fP \fBor\fP \fIstring\fP, +used to assert that the +\fBset_a_foreground\fP and +\fBset_a_background\fP capabilities correspond to \fIdirect colors\fP, +using an RGB (red/green/blue) convention. +This capability allows the \fBcolor_content\fP function to +return appropriate values without requiring the application +to initialize colors using \fBinit_color\fP. +.IP +The capability type determines the values which \fI\%ncurses\fP sees: +.RS 3 +.TP 3 +\fIBoolean\fP +implies that the number of bits for red, green and blue are the same. +Using the maximum number of colors, +\fI\%ncurses\fP adds two, +divides that sum by three, +and assigns the result to red, +green and blue in that order. +.IP +If the number of bits needed for the number of colors is not a multiple +of three, the blue (and green) components lose in comparison to red. +.TP 3 +\fInumber\fP +tells \fI\%ncurses\fP what result to add to red, green and blue. +If \fI\%ncurses\fP runs out of bits, +blue (and green) lose just as in the \fIBoolean\fP case. +.TP 3 +\fIstring\fP +explicitly list the number of bits used for red, green and blue components +as a slash-separated list of decimal integers. +.RE +.IP +Because there are several RGB encodings in use, +applications which make assumptions about the number of bits per color +are unlikely to work reliably. +As a trivial case, for example, one could define \fBRGB#1\fP +to represent the standard eight ANSI colors, i.e., one bit per color. +.TP 3 +U8 +\fInumber\fP, +asserts that \fI\%ncurses\fP must use Unicode values for line-drawing +characters, +and that it should ignore the alternate character set capabilities +when the locale uses UTF-8 encoding. +For more information, see the discussion of +\fBNCURSES_NO_UTF8_ACS\fP in \fB\%ncurses\fP(3X). +.IP +Set this capability to a nonzero value to enable it. +.TP 3 +XM +\fIstring\fP, +override \fI\%ncurses\fP's built-in string which +enables/disables \fBxterm\fP(1) mouse mode. +.IP +\fI\%ncurses\fP sends a character sequence to the terminal to initialize mouse mode, +and when the user clicks the mouse buttons or (in certain modes) moves the +mouse, handles the characters sent back by the terminal to tell it what +was done with the mouse. +.IP +The mouse protocol is enabled when +the \fImask\fP passed in the \fBmousemask\fP function is nonzero. +By default, +\fI\%ncurses\fP handles the responses for the X11 xterm mouse protocol. +It also knows about the \fISGR 1006\fP xterm mouse protocol, +but must to be told to look for this specifically. +It will not be able to guess which mode is used, +because the responses are enough alike that only confusion would result. +.IP +The \fBXM\fP capability has a single parameter. +If nonzero, the mouse protocol should be enabled. +If zero, the mouse protocol should be disabled. +\fI\%ncurses\fP inspects this capability if it is present, +to see whether the 1006 protocol is used. +If so, it expects the responses to use the \fISGR 1006\fP xterm mouse protocol. +.IP +The xterm mouse protocol is used by other terminal emulators. +The terminal database uses building-blocks for the various xterm mouse +protocols which can be used in customized terminal descriptions. +.IP +The terminal database building blocks for this mouse +feature also have an experimental capability \fIxm\fP. +The \*(``xm\*('' capability describes the mouse response. +Currently there is no interpreter which would use this +information to make the mouse support completely data-driven. +.IP +\fIxm\fP shows the format of the mouse responses. +In this experimental capability, the parameters are +.RS 5 +.TP 5 +.I p1 +y-ordinate +.TP 5 +.I p2 +x-ordinate +.TP 5 +.I p3 +button +.TP 5 +.I p4 +state, e.g., pressed or released +.TP 5 +.I p5 +y-ordinate starting region +.TP 5 +.I p6 +x-ordinate starting region +.TP 5 +.I p7 +y-ordinate ending region +.TP 5 +.I p8 +x-ordinate ending region +.RE +.IP +Here are examples from the terminal database for the most commonly used +xterm mouse protocols: +.IP +.nf + xterm+x11mouse|X11 xterm mouse protocol, + kmous=\eE[M, XM=\eE[?1000%?%p1%{1}%=%th%el%;, + xm=\eE[M + %?%p4%t%p3%e%{3}%;%'\ '%+%c + %p2%'!'%+%c + %p1%'!'%+%c, + + xterm+sm+1006|xterm SGR-mouse, + kmous=\eE[<, XM=\eE[?1006;1000%?%p1%{1}%=%th%el%;, + xm=\eE[<%i%p3%d; + %p1%d; + %p2%d; + %?%p4%tM%em%;, +.fi +. +.SS "Extended Key Definitions" +Several terminals provide the ability to send distinct strings for +combinations of modified special keys. +There is no standard for what those keys can send. +.PP +Since 1999, \fBxterm\fP(1) has supported +\fIshift\fP, \fIcontrol\fP, \fIalt\fP, and \fImeta\fP modifiers which produce +distinct special-key strings. +In a terminal description, +\fI\%ncurses\fP has no special knowledge of the modifiers used. +Applications can use the \fInaming convention\fP established for \fBxterm\fP +to find these special keys in the terminal description. +.PP +Starting with the +.I curses +convention that capability codes describing the input generated by a +terminal's key caps begin with \*(``k\*('', +and that shifted special keys use uppercase letters in their names, +.IR \%ncurses 's +terminal database defines the following names and codes to which a +suffix is added. +.PP +.RS 5 +.TS +Lb Lb +Lb Lx. +Code Description +_ +kDC shifted kdch1 (delete character) +.\" kDC is a standard capability; see X/Open Curses Issue 7, p. 345. +kDN shifted kcud1 (cursor down) +kEND shifted kend (end) +kHOM shifted khome (home) +kLFT shifted kcub1 (cursor back) +kNXT shifted knext (next) +kPRV shifted kprev (previous) +kRIT shifted kcuf1 (cursor forward) +kUP shifted kcuu1 (cursor up) +.TE +.RE +.PP +Keycap nomenclature on the Unix systems for which +.I curses +was developed differs from today's ubiquitous descendants of the IBM +PC/AT keyboard layout. +In the foregoing, +interpret \*(``backward\*('' as \*(``left\*('', +\*(``forward\*('' as \*(``right\*('', +\*(``next\*('' as \*(``page down\*('', +and +\*(``prev(ious)\*('' as \*(``page up\*(''. +.PP +These are the suffixes used to denote the modifiers: +.PP +.RS 5 +.TS +tab(/) ; +l l . +\fBValue\fP/\fBDescription\fP +_ +2/Shift +3/Alt +4/Shift + Alt +5/Control +6/Shift + Control +7/Alt + Control +8/Shift + Alt + Control +9/Meta +10/Meta + Shift +11/Meta + Alt +12/Meta + Alt + Shift +13/Meta + Ctrl +14/Meta + Ctrl + Shift +15/Meta + Ctrl + Alt +16/Meta + Ctrl + Alt + Shift +.TE +.RE +.PP +None of these are predefined; terminal descriptions can refer to \fInames\fP +which \fI\%ncurses\fP will allocate at runtime to \fIkey-codes\fP. +To use these keys in an \fI\%ncurses\fP program, +an application could do this: +.bP +using a list of extended key \fInames\fP, +ask \fBtigetstr\fP(3X) for their values, and +.bP +given the list of values, +ask \fBkey_defined\fP(3X) for the \fIkey-code\fP which +would be returned for those keys by \fBwgetch\fP(3X). +.\" +.SH PORTABILITY +The \*(``\-x\*('' extension feature of \fB@TIC@\fP and \fB@INFOCMP@\fP +has been adopted in NetBSD curses. +That implementation stores user-defined capabilities, +but makes no use of these capabilities itself. +.\" +.SH AUTHORS +Thomas E. Dickey +.br +beginning with \fI\%ncurses\fP 5.0 (1999) +.\" +.SH SEE ALSO +\fB\%@INFOCMP@\fP(1M), +\fB\%@TIC@\fP(1M) +.PP +The terminal database section +.I "NCURSES USER-DEFINABLE CAPABILITIES" +summarizes commonly-used user-defined capabilities +which are used in the terminal descriptions. +Some of those features are mentioned in \fB\%screen\fP(1) or +\fBtmux\fP(1). +.PP +.I "XTerm Control Sequences" +provides further information on the \fB\%xterm\fP(1) features +that are used in these extended capabilities. diff --git a/contrib/ncurses/man/wresize.3x b/contrib/ncurses/man/wresize.3x new file mode 100644 index 00000000..5b50c4d6 --- /dev/null +++ b/contrib/ncurses/man/wresize.3x @@ -0,0 +1,131 @@ +.\"*************************************************************************** +.\" Copyright 2018-2023,2024 Thomas E. Dickey * +.\" Copyright 1998-2010,2015 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" Author: Thomas E. Dickey 1996 +.\" +.\" $Id: wresize.3x,v 1.42 2024/09/21 23:48:27 tom Exp $ +.TH wresize 3X 2024-09-21 "ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" "Library calls" +.SH NAME +\fB\%wresize\fP \- +resize a \fIcurses\fR window +.SH SYNOPSIS +.nf +\fB#include +.PP +\fBint wresize(WINDOW * \fIwin\fP, int \fIlines\fP, int \fIcolumns\fP); +.fi +.SH DESCRIPTION +.BR \%wresize "," +an +.I \%ncurses +extension to the +.I curses +library, +reallocates storage for +.IR win , +adjusting its dimensions to +.I lines +and +.IR columns "." +If either dimension is larger than its current value, +.I \%ncurses +the expanded part of the window is filled with blanks merged with +current background rendition +(configured by \fB\%wbkgdset\fP(3X), +or by wide-character API: \fB\%wbkgrndset\fP(3X)). +.SH RETURN VALUE +.B \%wresize +returns +.B OK +on success and +.B ERR +on failure. +It fails if either +.I lines +or +.I columns +is less than or equal to zero, +or if an error occurs while (re)allocating memory for +.IR win "." +.SH NOTES +The only restriction placed on the values of +.I lines +and +.I columns +is that they be greater than zero. +They are +.I not +compared to the dimensions of the +.I curses +screen; +this keeps the logic of \fB\%resizeterm\fP(3X) simple. +The caller must ensure that +.IR win 's +dimensions fit within those of the screen. +.SH EXTENSIONS +.B \%wresize +is an \fB\%ncurses\fP(3X) extension, +and is not found in SVr4 +.IR curses "," +4.4BSD +.IR curses "," +or any other previous +.I curses +implementation. +.SH PORTABILITY +Applications employing +.I \%ncurses +extensions should condition their use on the visibility of the +.B \%NCURSES_VERSION +preprocessor macro. +.PP +NetBSD +.I curses +adopted +.I \%wresize +in 2001 (release 1.5.3), +and +.I \%PDCurses +in 2004 (version 2.7). +.PP +It is not possible to resize windows with SVr4 +.IR curses "." +.SH HISTORY +Thomas Dickey developed +.I \%wresize +as an extension to BSD +.I curses +in 1988, +and brought it to +.I \%ncurses +in mid-1995. +.SH AUTHORS +Thomas Dickey +.SH SEE ALSO +\fB\%resizeterm\fP(3X) diff --git a/contrib/ncurses/menu/Makefile.in b/contrib/ncurses/menu/Makefile.in new file mode 100644 index 00000000..a91eb400 --- /dev/null +++ b/contrib/ncurses/menu/Makefile.in @@ -0,0 +1,214 @@ +# $Id: Makefile.in,v 1.72 2024/08/11 00:51:30 tom Exp $ +############################################################################## +# Copyright 2020-2021,2024 Thomas E. Dickey # +# Copyright 1998-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for menu source code. +# +# This makes the following: +# libraries (normal/debug/profile/shared) +# +# The variable 'srcdir' refers to the source-distribution, and can be set with +# the configure script by "--srcdir=DIR". +# +# The rules are organized to produce the libraries for the configured models, + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +x = @EXEEXT@ +o = .@OBJEXT@ + +MODEL = @DFT_LWR_MODEL@ +DESTDIR = @DESTDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) + +PACKAGE = @PACKAGE@ + +LIBTOOL = @LIBTOOL@ +LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ +LIBTOOL_CLEAN = @LIB_CLEAN@ +LIBTOOL_COMPILE = @LIB_COMPILE@ +LIBTOOL_LINK = @LIB_LINK@ +LIBTOOL_INSTALL = @LIB_INSTALL@ +LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ +LT_UNDEF = @LT_UNDEF@ + +INSTALL = @INSTALL@ +INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ +INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ +INSTALL_DATA = @INSTALL_DATA@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AWK = @AWK@ +LD = @LD@ +LN_S = @LN_S@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +CC = @CC@ +CPP = @CPP@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ + +INCDIR = $(top_srcdir)/include +BASE_DIR = $(top_srcdir)/ncurses +CPPFLAGS = -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_MENU @CPPFLAGS@ + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +CFLAGS_LIBTOOL = $(CCFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +LINK = $(LIBTOOL_LINK) +LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ + +SHLIB_DIRS = -L../lib +SHLIB_LIST = $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ + +RPATH_LIST = @RPATH_LIST@ +RESULTING_SYMS = @RESULTING_SYMS@ +VERSIONED_SYMS = @VERSIONED_SYMS@ +MK_SHARED_LIB = @MK_SHARED_LIB@ + +NCURSES_MAJOR = @NCURSES_MAJOR@ +NCURSES_MINOR = @NCURSES_MINOR@ +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ + +RANLIB = @LIB_PREP@ + +LIBRARIES = @Libs_To_Make@ + +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ +LINT_LIBS = -lmenu -lncurses @LIBS@ + +AUTO_SRC = \ + ../include/menu.h \ + ../include/eti.h \ + ../include/mf_common.h + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs \ +install :: $(AUTO_SRC) $(LIBRARIES) + +sources : $(AUTO_SRC) + +$(BINDIR) \ +$(LIBDIR) : + mkdir -p $@ + +# make copies to simplify include-paths while still keeping menu's include +# file in this directory. +../include/menu.h : $(srcdir)/menu.h + -rm -f $@ + cp $(srcdir)/menu.h $@ +../include/eti.h : $(srcdir)/eti.h + -rm -f $@ + cp $(srcdir)/eti.h $@ +../include/mf_common.h : $(srcdir)/mf_common.h + -rm -f $@ + cp $(srcdir)/mf_common.h $@ + +HEADER_DEPS = \ + ../include/curses.h \ + ../include/ncurses_cfg.h \ + ../include/ncurses_def.h \ + ../include/ncurses_dll.h \ + ../include/term.h \ + ../include/unctrl.h \ + $(BASE_DIR)/curses.priv.h \ + $(BASE_DIR)/new_pair.h \ + $(INCDIR)/nc_alloc.h \ + $(INCDIR)/nc_panel.h \ + $(INCDIR)/nc_string.h \ + $(INCDIR)/nc_termios.h \ + $(INCDIR)/nc_tparm.h \ + $(INCDIR)/term_entry.h \ + $(srcdir)/menu.priv.h \ + $(AUTO_SRC) + +tags: + $(CTAGS) *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + +clean :: mostlyclean + -rm -f $(AUTO_SRC) + -rm -rf .libs *.dSYM + +distclean :: clean + -rm -f Makefile + +realclean :: distclean + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/menu/READ.ME b/contrib/ncurses/menu/READ.ME new file mode 100644 index 00000000..8c780377 --- /dev/null +++ b/contrib/ncurses/menu/READ.ME @@ -0,0 +1,43 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 1998-2003,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: READ.ME,v 1.11 2021/06/17 21:20:30 tom Exp $ +------------------------------------------------------------------------------- + +This is a clone of the menu library that is available with typical +System V curses implementations (ETI). + +It is modelled after the documentation that comes for this library with +a 386 based SVR4 implementation (ESIX). + +The development environment was and is an ELF based Linux system. + +For things that still need doing, see the TO-DO file in the top-level +directory. + +Juergen Pfeifer diff --git a/contrib/ncurses/menu/eti.h b/contrib/ncurses/menu/eti.h new file mode 100644 index 00000000..3c3302d0 --- /dev/null +++ b/contrib/ncurses/menu/eti.h @@ -0,0 +1,55 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2002,2003 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/* $Id: eti.h,v 1.9 2020/02/02 23:34:34 tom Exp $ */ + +#ifndef NCURSES_ETI_H_incl +#define NCURSES_ETI_H_incl 1 + +#define E_OK (0) +#define E_SYSTEM_ERROR (-1) +#define E_BAD_ARGUMENT (-2) +#define E_POSTED (-3) +#define E_CONNECTED (-4) +#define E_BAD_STATE (-5) +#define E_NO_ROOM (-6) +#define E_NOT_POSTED (-7) +#define E_UNKNOWN_COMMAND (-8) +#define E_NO_MATCH (-9) +#define E_NOT_SELECTABLE (-10) +#define E_NOT_CONNECTED (-11) +#define E_REQUEST_DENIED (-12) +#define E_INVALID_FIELD (-13) +#define E_CURRENT (-14) + +#endif diff --git a/contrib/ncurses/menu/headers b/contrib/ncurses/menu/headers new file mode 100644 index 00000000..2f058aa6 --- /dev/null +++ b/contrib/ncurses/menu/headers @@ -0,0 +1,34 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996 +# +$(srcdir)/eti.h +$(srcdir)/menu.h +# vile:makemode diff --git a/contrib/ncurses/menu/llib-lmenu b/contrib/ncurses/menu/llib-lmenu new file mode 100644 index 00000000..67f68223 --- /dev/null +++ b/contrib/ncurses/menu/llib-lmenu @@ -0,0 +1,552 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./m_attribs.c */ + +#include + +#undef set_menu_fore +int set_menu_fore( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_fore +chtype menu_fore( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_back +int set_menu_back( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_back +chtype menu_back( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_grey +int set_menu_grey( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_grey +chtype menu_grey( + const MENU *menu) + { return(*(chtype *)0); } + +/* ./m_cursor.c */ + +#undef _nc_menu_cursor_pos +int _nc_menu_cursor_pos( + const MENU *menu, + const ITEM *item, + int *pY, + int *pX) + { return(*(int *)0); } + +#undef pos_menu_cursor +int pos_menu_cursor( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_driver.c */ + +#undef _nc_Match_Next_Character_In_Item_Name +int _nc_Match_Next_Character_In_Item_Name( + MENU *menu, + int ch, + ITEM **item) + { return(*(int *)0); } + +#undef menu_driver +int menu_driver( + MENU *menu, + int c) + { return(*(int *)0); } + +/* ./m_format.c */ + +#undef set_menu_format +int set_menu_format( + MENU *menu, + int rows, + int cols) + { return(*(int *)0); } + +#undef menu_format +void menu_format( + const MENU *menu, + int *rows, + int *cols) + { /* void */ } + +/* ./m_global.c */ + +#undef _nc_Default_Menu +MENU _nc_Default_Menu; +#undef _nc_Default_Item +ITEM _nc_Default_Item; + +#undef _nc_Connect_Items +NCURSES_BOOL _nc_Connect_Items( + MENU *menu, + ITEM **items) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Disconnect_Items +void _nc_Disconnect_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Calculate_Text_Width +int _nc_Calculate_Text_Width( + const TEXT *item) + { return(*(int *)0); } + +#undef _nc_Calculate_Item_Length_and_Width +void _nc_Calculate_Item_Length_and_Width( + MENU *menu) + { /* void */ } + +#undef _nc_Link_Items +void _nc_Link_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Show_Menu +void _nc_Show_Menu( + const MENU *menu) + { /* void */ } + +#undef _nc_New_TopRow_and_CurrentItem +void _nc_New_TopRow_and_CurrentItem( + MENU *menu, + int new_toprow, + ITEM *new_current_item) + { /* void */ } + +/* ./m_hook.c */ + +#undef set_menu_init +int set_menu_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_init +Menu_Hook menu_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_menu_term +int set_menu_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_term +Menu_Hook menu_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_init +int set_item_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_init +Menu_Hook item_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_term +int set_item_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_term +Menu_Hook item_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +/* ./m_item_cur.c */ + +#undef set_current_item +int set_current_item( + MENU *menu, + ITEM *item) + { return(*(int *)0); } + +#undef current_item +ITEM *current_item( + const MENU *menu) + { return(*(ITEM **)0); } + +#undef item_index +int item_index( + const ITEM *item) + { return(*(int *)0); } + +/* ./m_item_nam.c */ + +#undef item_name +const char *item_name( + const ITEM *item) + { return(*(const char **)0); } + +#undef item_description +const char *item_description( + const ITEM *item) + { return(*(const char **)0); } + +/* ./m_item_new.c */ + +#undef new_item +ITEM *new_item( + const char *name, + const char *description) + { return(*(ITEM **)0); } + +#undef free_item +int free_item( + ITEM *item) + { return(*(int *)0); } + +#undef set_menu_mark +int set_menu_mark( + MENU *menu, + const char *mark) + { return(*(int *)0); } + +#undef menu_mark +const char *menu_mark( + const MENU *menu) + { return(*(const char **)0); } + +/* ./m_item_opt.c */ + +#undef set_item_opts +int set_item_opts( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_off +int item_opts_off( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_on +int item_opts_on( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts +Item_Options item_opts( + const ITEM *item) + { return(*(Item_Options *)0); } + +/* ./m_item_top.c */ + +#undef set_top_row +int set_top_row( + MENU *menu, + int row) + { return(*(int *)0); } + +#undef top_row +int top_row( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_item_use.c */ + +#undef set_item_userptr +int set_item_userptr( + ITEM *item, + void *userptr) + { return(*(int *)0); } + +#undef item_userptr +void *item_userptr( + const ITEM *item) + { return(*(void **)0); } + +/* ./m_item_val.c */ + +#undef set_item_value +int set_item_value( + ITEM *item, + NCURSES_BOOL value) + { return(*(int *)0); } + +#undef item_value +NCURSES_BOOL item_value( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_item_vis.c */ + +#undef item_visible +NCURSES_BOOL item_visible( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_items.c */ + +#undef set_menu_items +int set_menu_items( + MENU *menu, + ITEM **items) + { return(*(int *)0); } + +#undef menu_items +ITEM **menu_items( + const MENU *menu) + { return(*(ITEM ***)0); } + +#undef item_count +int item_count( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_new.c */ + +#undef new_menu_sp +MENU *new_menu_sp( + SCREEN *sp, + ITEM **items) + { return(*(MENU **)0); } + +#undef new_menu +MENU *new_menu( + ITEM **items) + { return(*(MENU **)0); } + +#undef free_menu +int free_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_opts.c */ + +#undef set_menu_opts +int set_menu_opts( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_off +int menu_opts_off( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_on +int menu_opts_on( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts +Menu_Options menu_opts( + const MENU *menu) + { return(*(Menu_Options *)0); } + +/* ./m_pad.c */ + +#undef set_menu_pad +int set_menu_pad( + MENU *menu, + int pad) + { return(*(int *)0); } + +#undef menu_pad +int menu_pad( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_pattern.c */ + +#undef menu_pattern +char *menu_pattern( + const MENU *menu) + { return(*(char **)0); } + +#undef set_menu_pattern +int set_menu_pattern( + MENU *menu, + const char *p) + { return(*(int *)0); } + +/* ./m_post.c */ + +#undef _nc_Post_Item +void _nc_Post_Item( + const MENU *menu, + const ITEM *item) + { /* void */ } + +#undef _nc_Draw_Menu +void _nc_Draw_Menu( + const MENU *menu) + { /* void */ } + +#undef post_menu +int post_menu( + MENU *menu) + { return(*(int *)0); } + +#undef unpost_menu +int unpost_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_req_name.c */ + +#undef menu_request_name +const char *menu_request_name( + int request) + { return(*(const char **)0); } + +#undef menu_request_by_name +int menu_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./m_scale.c */ + +#undef scale_menu +int scale_menu( + const MENU *menu, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./m_spacing.c */ + +#undef set_menu_spacing +int set_menu_spacing( + MENU *menu, + int s_desc, + int s_row, + int s_col) + { return(*(int *)0); } + +#undef menu_spacing +int menu_spacing( + const MENU *menu, + int *s_desc, + int *s_row, + int *s_col) + { return(*(int *)0); } + +/* ./m_sub.c */ + +#undef set_menu_sub +int set_menu_sub( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_sub +WINDOW *menu_sub( + const MENU *menu) + { return(*(WINDOW **)0); } + +/* ./m_trace.c */ + +#undef _nc_retrace_item +ITEM *_nc_retrace_item( + ITEM *code) + { return(*(ITEM **)0); } + +#undef _nc_retrace_item_ptr +ITEM **_nc_retrace_item_ptr( + ITEM **code) + { return(*(ITEM ***)0); } + +#undef _nc_retrace_item_opts +Item_Options _nc_retrace_item_opts( + Item_Options code) + { return(*(Item_Options *)0); } + +#undef _nc_retrace_menu +MENU *_nc_retrace_menu( + MENU *code) + { return(*(MENU **)0); } + +#undef _nc_retrace_menu_hook +Menu_Hook _nc_retrace_menu_hook( + Menu_Hook code) + { return(*(Menu_Hook *)0); } + +#undef _nc_retrace_menu_opts +Menu_Options _nc_retrace_menu_opts( + Menu_Options code) + { return(*(Menu_Options *)0); } + +/* ./m_userptr.c */ + +#undef set_menu_userptr +int set_menu_userptr( + MENU *menu, + void *userptr) + { return(*(int *)0); } + +#undef menu_userptr +void *menu_userptr( + const MENU *menu) + { return(*(void **)0); } + +/* ./m_win.c */ + +#undef set_menu_win +int set_menu_win( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_win +WINDOW *menu_win( + const MENU *menu) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/menu/llib-lmenut b/contrib/ncurses/menu/llib-lmenut new file mode 100644 index 00000000..0a0d0594 --- /dev/null +++ b/contrib/ncurses/menu/llib-lmenut @@ -0,0 +1,552 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./m_attribs.c */ + +#include + +#undef set_menu_fore +int set_menu_fore( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_fore +chtype menu_fore( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_back +int set_menu_back( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_back +chtype menu_back( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_grey +int set_menu_grey( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_grey +chtype menu_grey( + const MENU *menu) + { return(*(chtype *)0); } + +/* ./m_cursor.c */ + +#undef _nc_menu_cursor_pos +int _nc_menu_cursor_pos( + const MENU *menu, + const ITEM *item, + int *pY, + int *pX) + { return(*(int *)0); } + +#undef pos_menu_cursor +int pos_menu_cursor( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_driver.c */ + +#undef _nc_Match_Next_Character_In_Item_Name +int _nc_Match_Next_Character_In_Item_Name( + MENU *menu, + int ch, + ITEM **item) + { return(*(int *)0); } + +#undef menu_driver +int menu_driver( + MENU *menu, + int c) + { return(*(int *)0); } + +/* ./m_format.c */ + +#undef set_menu_format +int set_menu_format( + MENU *menu, + int rows, + int cols) + { return(*(int *)0); } + +#undef menu_format +void menu_format( + const MENU *menu, + int *rows, + int *cols) + { /* void */ } + +/* ./m_global.c */ + +#undef _nc_Default_Menu +MENU _nc_Default_Menu; +#undef _nc_Default_Item +ITEM _nc_Default_Item; + +#undef _nc_Connect_Items +NCURSES_BOOL _nc_Connect_Items( + MENU *menu, + ITEM **items) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Disconnect_Items +void _nc_Disconnect_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Calculate_Text_Width +int _nc_Calculate_Text_Width( + const TEXT *item) + { return(*(int *)0); } + +#undef _nc_Calculate_Item_Length_and_Width +void _nc_Calculate_Item_Length_and_Width( + MENU *menu) + { /* void */ } + +#undef _nc_Link_Items +void _nc_Link_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Show_Menu +void _nc_Show_Menu( + const MENU *menu) + { /* void */ } + +#undef _nc_New_TopRow_and_CurrentItem +void _nc_New_TopRow_and_CurrentItem( + MENU *menu, + int new_toprow, + ITEM *new_current_item) + { /* void */ } + +/* ./m_hook.c */ + +#undef set_menu_init +int set_menu_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_init +Menu_Hook menu_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_menu_term +int set_menu_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_term +Menu_Hook menu_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_init +int set_item_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_init +Menu_Hook item_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_term +int set_item_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_term +Menu_Hook item_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +/* ./m_item_cur.c */ + +#undef set_current_item +int set_current_item( + MENU *menu, + ITEM *item) + { return(*(int *)0); } + +#undef current_item +ITEM *current_item( + const MENU *menu) + { return(*(ITEM **)0); } + +#undef item_index +int item_index( + const ITEM *item) + { return(*(int *)0); } + +/* ./m_item_nam.c */ + +#undef item_name +const char *item_name( + const ITEM *item) + { return(*(const char **)0); } + +#undef item_description +const char *item_description( + const ITEM *item) + { return(*(const char **)0); } + +/* ./m_item_new.c */ + +#undef new_item +ITEM *new_item( + const char *name, + const char *description) + { return(*(ITEM **)0); } + +#undef free_item +int free_item( + ITEM *item) + { return(*(int *)0); } + +#undef set_menu_mark +int set_menu_mark( + MENU *menu, + const char *mark) + { return(*(int *)0); } + +#undef menu_mark +const char *menu_mark( + const MENU *menu) + { return(*(const char **)0); } + +/* ./m_item_opt.c */ + +#undef set_item_opts +int set_item_opts( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_off +int item_opts_off( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_on +int item_opts_on( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts +Item_Options item_opts( + const ITEM *item) + { return(*(Item_Options *)0); } + +/* ./m_item_top.c */ + +#undef set_top_row +int set_top_row( + MENU *menu, + int row) + { return(*(int *)0); } + +#undef top_row +int top_row( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_item_use.c */ + +#undef set_item_userptr +int set_item_userptr( + ITEM *item, + void *userptr) + { return(*(int *)0); } + +#undef item_userptr +void *item_userptr( + const ITEM *item) + { return(*(void **)0); } + +/* ./m_item_val.c */ + +#undef set_item_value +int set_item_value( + ITEM *item, + NCURSES_BOOL value) + { return(*(int *)0); } + +#undef item_value +NCURSES_BOOL item_value( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_item_vis.c */ + +#undef item_visible +NCURSES_BOOL item_visible( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_items.c */ + +#undef set_menu_items +int set_menu_items( + MENU *menu, + ITEM **items) + { return(*(int *)0); } + +#undef menu_items +ITEM **menu_items( + const MENU *menu) + { return(*(ITEM ***)0); } + +#undef item_count +int item_count( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_new.c */ + +#undef new_menu_sp +MENU *new_menu_sp( + SCREEN *sp, + ITEM **items) + { return(*(MENU **)0); } + +#undef new_menu +MENU *new_menu( + ITEM **items) + { return(*(MENU **)0); } + +#undef free_menu +int free_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_opts.c */ + +#undef set_menu_opts +int set_menu_opts( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_off +int menu_opts_off( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_on +int menu_opts_on( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts +Menu_Options menu_opts( + const MENU *menu) + { return(*(Menu_Options *)0); } + +/* ./m_pad.c */ + +#undef set_menu_pad +int set_menu_pad( + MENU *menu, + int pad) + { return(*(int *)0); } + +#undef menu_pad +int menu_pad( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_pattern.c */ + +#undef menu_pattern +char *menu_pattern( + const MENU *menu) + { return(*(char **)0); } + +#undef set_menu_pattern +int set_menu_pattern( + MENU *menu, + const char *p) + { return(*(int *)0); } + +/* ./m_post.c */ + +#undef _nc_Post_Item +void _nc_Post_Item( + const MENU *menu, + const ITEM *item) + { /* void */ } + +#undef _nc_Draw_Menu +void _nc_Draw_Menu( + const MENU *menu) + { /* void */ } + +#undef post_menu +int post_menu( + MENU *menu) + { return(*(int *)0); } + +#undef unpost_menu +int unpost_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_req_name.c */ + +#undef menu_request_name +const char *menu_request_name( + int request) + { return(*(const char **)0); } + +#undef menu_request_by_name +int menu_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./m_scale.c */ + +#undef scale_menu +int scale_menu( + const MENU *menu, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./m_spacing.c */ + +#undef set_menu_spacing +int set_menu_spacing( + MENU *menu, + int s_desc, + int s_row, + int s_col) + { return(*(int *)0); } + +#undef menu_spacing +int menu_spacing( + const MENU *menu, + int *s_desc, + int *s_row, + int *s_col) + { return(*(int *)0); } + +/* ./m_sub.c */ + +#undef set_menu_sub +int set_menu_sub( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_sub +WINDOW *menu_sub( + const MENU *menu) + { return(*(WINDOW **)0); } + +/* ./m_trace.c */ + +#undef _nc_retrace_item +ITEM *_nc_retrace_item( + ITEM *code) + { return(*(ITEM **)0); } + +#undef _nc_retrace_item_ptr +ITEM **_nc_retrace_item_ptr( + ITEM **code) + { return(*(ITEM ***)0); } + +#undef _nc_retrace_item_opts +Item_Options _nc_retrace_item_opts( + Item_Options code) + { return(*(Item_Options *)0); } + +#undef _nc_retrace_menu +MENU *_nc_retrace_menu( + MENU *code) + { return(*(MENU **)0); } + +#undef _nc_retrace_menu_hook +Menu_Hook _nc_retrace_menu_hook( + Menu_Hook code) + { return(*(Menu_Hook *)0); } + +#undef _nc_retrace_menu_opts +Menu_Options _nc_retrace_menu_opts( + Menu_Options code) + { return(*(Menu_Options *)0); } + +/* ./m_userptr.c */ + +#undef set_menu_userptr +int set_menu_userptr( + MENU *menu, + void *userptr) + { return(*(int *)0); } + +#undef menu_userptr +void *menu_userptr( + const MENU *menu) + { return(*(void **)0); } + +/* ./m_win.c */ + +#undef set_menu_win +int set_menu_win( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_win +WINDOW *menu_win( + const MENU *menu) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/menu/llib-lmenutw b/contrib/ncurses/menu/llib-lmenutw new file mode 100644 index 00000000..0a0d0594 --- /dev/null +++ b/contrib/ncurses/menu/llib-lmenutw @@ -0,0 +1,552 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./m_attribs.c */ + +#include + +#undef set_menu_fore +int set_menu_fore( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_fore +chtype menu_fore( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_back +int set_menu_back( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_back +chtype menu_back( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_grey +int set_menu_grey( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_grey +chtype menu_grey( + const MENU *menu) + { return(*(chtype *)0); } + +/* ./m_cursor.c */ + +#undef _nc_menu_cursor_pos +int _nc_menu_cursor_pos( + const MENU *menu, + const ITEM *item, + int *pY, + int *pX) + { return(*(int *)0); } + +#undef pos_menu_cursor +int pos_menu_cursor( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_driver.c */ + +#undef _nc_Match_Next_Character_In_Item_Name +int _nc_Match_Next_Character_In_Item_Name( + MENU *menu, + int ch, + ITEM **item) + { return(*(int *)0); } + +#undef menu_driver +int menu_driver( + MENU *menu, + int c) + { return(*(int *)0); } + +/* ./m_format.c */ + +#undef set_menu_format +int set_menu_format( + MENU *menu, + int rows, + int cols) + { return(*(int *)0); } + +#undef menu_format +void menu_format( + const MENU *menu, + int *rows, + int *cols) + { /* void */ } + +/* ./m_global.c */ + +#undef _nc_Default_Menu +MENU _nc_Default_Menu; +#undef _nc_Default_Item +ITEM _nc_Default_Item; + +#undef _nc_Connect_Items +NCURSES_BOOL _nc_Connect_Items( + MENU *menu, + ITEM **items) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Disconnect_Items +void _nc_Disconnect_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Calculate_Text_Width +int _nc_Calculate_Text_Width( + const TEXT *item) + { return(*(int *)0); } + +#undef _nc_Calculate_Item_Length_and_Width +void _nc_Calculate_Item_Length_and_Width( + MENU *menu) + { /* void */ } + +#undef _nc_Link_Items +void _nc_Link_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Show_Menu +void _nc_Show_Menu( + const MENU *menu) + { /* void */ } + +#undef _nc_New_TopRow_and_CurrentItem +void _nc_New_TopRow_and_CurrentItem( + MENU *menu, + int new_toprow, + ITEM *new_current_item) + { /* void */ } + +/* ./m_hook.c */ + +#undef set_menu_init +int set_menu_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_init +Menu_Hook menu_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_menu_term +int set_menu_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_term +Menu_Hook menu_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_init +int set_item_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_init +Menu_Hook item_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_term +int set_item_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_term +Menu_Hook item_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +/* ./m_item_cur.c */ + +#undef set_current_item +int set_current_item( + MENU *menu, + ITEM *item) + { return(*(int *)0); } + +#undef current_item +ITEM *current_item( + const MENU *menu) + { return(*(ITEM **)0); } + +#undef item_index +int item_index( + const ITEM *item) + { return(*(int *)0); } + +/* ./m_item_nam.c */ + +#undef item_name +const char *item_name( + const ITEM *item) + { return(*(const char **)0); } + +#undef item_description +const char *item_description( + const ITEM *item) + { return(*(const char **)0); } + +/* ./m_item_new.c */ + +#undef new_item +ITEM *new_item( + const char *name, + const char *description) + { return(*(ITEM **)0); } + +#undef free_item +int free_item( + ITEM *item) + { return(*(int *)0); } + +#undef set_menu_mark +int set_menu_mark( + MENU *menu, + const char *mark) + { return(*(int *)0); } + +#undef menu_mark +const char *menu_mark( + const MENU *menu) + { return(*(const char **)0); } + +/* ./m_item_opt.c */ + +#undef set_item_opts +int set_item_opts( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_off +int item_opts_off( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_on +int item_opts_on( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts +Item_Options item_opts( + const ITEM *item) + { return(*(Item_Options *)0); } + +/* ./m_item_top.c */ + +#undef set_top_row +int set_top_row( + MENU *menu, + int row) + { return(*(int *)0); } + +#undef top_row +int top_row( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_item_use.c */ + +#undef set_item_userptr +int set_item_userptr( + ITEM *item, + void *userptr) + { return(*(int *)0); } + +#undef item_userptr +void *item_userptr( + const ITEM *item) + { return(*(void **)0); } + +/* ./m_item_val.c */ + +#undef set_item_value +int set_item_value( + ITEM *item, + NCURSES_BOOL value) + { return(*(int *)0); } + +#undef item_value +NCURSES_BOOL item_value( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_item_vis.c */ + +#undef item_visible +NCURSES_BOOL item_visible( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_items.c */ + +#undef set_menu_items +int set_menu_items( + MENU *menu, + ITEM **items) + { return(*(int *)0); } + +#undef menu_items +ITEM **menu_items( + const MENU *menu) + { return(*(ITEM ***)0); } + +#undef item_count +int item_count( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_new.c */ + +#undef new_menu_sp +MENU *new_menu_sp( + SCREEN *sp, + ITEM **items) + { return(*(MENU **)0); } + +#undef new_menu +MENU *new_menu( + ITEM **items) + { return(*(MENU **)0); } + +#undef free_menu +int free_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_opts.c */ + +#undef set_menu_opts +int set_menu_opts( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_off +int menu_opts_off( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_on +int menu_opts_on( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts +Menu_Options menu_opts( + const MENU *menu) + { return(*(Menu_Options *)0); } + +/* ./m_pad.c */ + +#undef set_menu_pad +int set_menu_pad( + MENU *menu, + int pad) + { return(*(int *)0); } + +#undef menu_pad +int menu_pad( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_pattern.c */ + +#undef menu_pattern +char *menu_pattern( + const MENU *menu) + { return(*(char **)0); } + +#undef set_menu_pattern +int set_menu_pattern( + MENU *menu, + const char *p) + { return(*(int *)0); } + +/* ./m_post.c */ + +#undef _nc_Post_Item +void _nc_Post_Item( + const MENU *menu, + const ITEM *item) + { /* void */ } + +#undef _nc_Draw_Menu +void _nc_Draw_Menu( + const MENU *menu) + { /* void */ } + +#undef post_menu +int post_menu( + MENU *menu) + { return(*(int *)0); } + +#undef unpost_menu +int unpost_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_req_name.c */ + +#undef menu_request_name +const char *menu_request_name( + int request) + { return(*(const char **)0); } + +#undef menu_request_by_name +int menu_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./m_scale.c */ + +#undef scale_menu +int scale_menu( + const MENU *menu, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./m_spacing.c */ + +#undef set_menu_spacing +int set_menu_spacing( + MENU *menu, + int s_desc, + int s_row, + int s_col) + { return(*(int *)0); } + +#undef menu_spacing +int menu_spacing( + const MENU *menu, + int *s_desc, + int *s_row, + int *s_col) + { return(*(int *)0); } + +/* ./m_sub.c */ + +#undef set_menu_sub +int set_menu_sub( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_sub +WINDOW *menu_sub( + const MENU *menu) + { return(*(WINDOW **)0); } + +/* ./m_trace.c */ + +#undef _nc_retrace_item +ITEM *_nc_retrace_item( + ITEM *code) + { return(*(ITEM **)0); } + +#undef _nc_retrace_item_ptr +ITEM **_nc_retrace_item_ptr( + ITEM **code) + { return(*(ITEM ***)0); } + +#undef _nc_retrace_item_opts +Item_Options _nc_retrace_item_opts( + Item_Options code) + { return(*(Item_Options *)0); } + +#undef _nc_retrace_menu +MENU *_nc_retrace_menu( + MENU *code) + { return(*(MENU **)0); } + +#undef _nc_retrace_menu_hook +Menu_Hook _nc_retrace_menu_hook( + Menu_Hook code) + { return(*(Menu_Hook *)0); } + +#undef _nc_retrace_menu_opts +Menu_Options _nc_retrace_menu_opts( + Menu_Options code) + { return(*(Menu_Options *)0); } + +/* ./m_userptr.c */ + +#undef set_menu_userptr +int set_menu_userptr( + MENU *menu, + void *userptr) + { return(*(int *)0); } + +#undef menu_userptr +void *menu_userptr( + const MENU *menu) + { return(*(void **)0); } + +/* ./m_win.c */ + +#undef set_menu_win +int set_menu_win( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_win +WINDOW *menu_win( + const MENU *menu) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/menu/llib-lmenuw b/contrib/ncurses/menu/llib-lmenuw new file mode 100644 index 00000000..d5566d48 --- /dev/null +++ b/contrib/ncurses/menu/llib-lmenuw @@ -0,0 +1,552 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2002-2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2002-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./m_attribs.c */ + +#include + +#undef set_menu_fore +int set_menu_fore( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_fore +chtype menu_fore( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_back +int set_menu_back( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_back +chtype menu_back( + const MENU *menu) + { return(*(chtype *)0); } + +#undef set_menu_grey +int set_menu_grey( + MENU *menu, + chtype attr) + { return(*(int *)0); } + +#undef menu_grey +chtype menu_grey( + const MENU *menu) + { return(*(chtype *)0); } + +/* ./m_cursor.c */ + +#undef _nc_menu_cursor_pos +int _nc_menu_cursor_pos( + const MENU *menu, + const ITEM *item, + int *pY, + int *pX) + { return(*(int *)0); } + +#undef pos_menu_cursor +int pos_menu_cursor( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_driver.c */ + +#undef _nc_Match_Next_Character_In_Item_Name +int _nc_Match_Next_Character_In_Item_Name( + MENU *menu, + int ch, + ITEM **item) + { return(*(int *)0); } + +#undef menu_driver +int menu_driver( + MENU *menu, + int c) + { return(*(int *)0); } + +/* ./m_format.c */ + +#undef set_menu_format +int set_menu_format( + MENU *menu, + int rows, + int cols) + { return(*(int *)0); } + +#undef menu_format +void menu_format( + const MENU *menu, + int *rows, + int *cols) + { /* void */ } + +/* ./m_global.c */ + +#undef _nc_Default_Menu +MENU _nc_Default_Menu; +#undef _nc_Default_Item +ITEM _nc_Default_Item; + +#undef _nc_Connect_Items +NCURSES_BOOL _nc_Connect_Items( + MENU *menu, + ITEM **items) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_Disconnect_Items +void _nc_Disconnect_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Calculate_Text_Width +int _nc_Calculate_Text_Width( + const TEXT *item) + { return(*(int *)0); } + +#undef _nc_Calculate_Item_Length_and_Width +void _nc_Calculate_Item_Length_and_Width( + MENU *menu) + { /* void */ } + +#undef _nc_Link_Items +void _nc_Link_Items( + MENU *menu) + { /* void */ } + +#undef _nc_Show_Menu +void _nc_Show_Menu( + const MENU *menu) + { /* void */ } + +#undef _nc_New_TopRow_and_CurrentItem +void _nc_New_TopRow_and_CurrentItem( + MENU *menu, + int new_toprow, + ITEM *new_current_item) + { /* void */ } + +/* ./m_hook.c */ + +#undef set_menu_init +int set_menu_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_init +Menu_Hook menu_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_menu_term +int set_menu_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef menu_term +Menu_Hook menu_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_init +int set_item_init( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_init +Menu_Hook item_init( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +#undef set_item_term +int set_item_term( + MENU *menu, + Menu_Hook func) + { return(*(int *)0); } + +#undef item_term +Menu_Hook item_term( + const MENU *menu) + { return(*(Menu_Hook *)0); } + +/* ./m_item_cur.c */ + +#undef set_current_item +int set_current_item( + MENU *menu, + ITEM *item) + { return(*(int *)0); } + +#undef current_item +ITEM *current_item( + const MENU *menu) + { return(*(ITEM **)0); } + +#undef item_index +int item_index( + const ITEM *item) + { return(*(int *)0); } + +/* ./m_item_nam.c */ + +#undef item_name +const char *item_name( + const ITEM *item) + { return(*(const char **)0); } + +#undef item_description +const char *item_description( + const ITEM *item) + { return(*(const char **)0); } + +/* ./m_item_new.c */ + +#undef new_item +ITEM *new_item( + const char *name, + const char *description) + { return(*(ITEM **)0); } + +#undef free_item +int free_item( + ITEM *item) + { return(*(int *)0); } + +#undef set_menu_mark +int set_menu_mark( + MENU *menu, + const char *mark) + { return(*(int *)0); } + +#undef menu_mark +const char *menu_mark( + const MENU *menu) + { return(*(const char **)0); } + +/* ./m_item_opt.c */ + +#undef set_item_opts +int set_item_opts( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_off +int item_opts_off( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts_on +int item_opts_on( + ITEM *item, + Item_Options opts) + { return(*(int *)0); } + +#undef item_opts +Item_Options item_opts( + const ITEM *item) + { return(*(Item_Options *)0); } + +/* ./m_item_top.c */ + +#undef set_top_row +int set_top_row( + MENU *menu, + int row) + { return(*(int *)0); } + +#undef top_row +int top_row( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_item_use.c */ + +#undef set_item_userptr +int set_item_userptr( + ITEM *item, + void *userptr) + { return(*(int *)0); } + +#undef item_userptr +void *item_userptr( + const ITEM *item) + { return(*(void **)0); } + +/* ./m_item_val.c */ + +#undef set_item_value +int set_item_value( + ITEM *item, + NCURSES_BOOL value) + { return(*(int *)0); } + +#undef item_value +NCURSES_BOOL item_value( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_item_vis.c */ + +#undef item_visible +NCURSES_BOOL item_visible( + const ITEM *item) + { return(*(NCURSES_BOOL *)0); } + +/* ./m_items.c */ + +#undef set_menu_items +int set_menu_items( + MENU *menu, + ITEM **items) + { return(*(int *)0); } + +#undef menu_items +ITEM **menu_items( + const MENU *menu) + { return(*(ITEM ***)0); } + +#undef item_count +int item_count( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_new.c */ + +#undef new_menu_sp +MENU *new_menu_sp( + SCREEN *sp, + ITEM **items) + { return(*(MENU **)0); } + +#undef new_menu +MENU *new_menu( + ITEM **items) + { return(*(MENU **)0); } + +#undef free_menu +int free_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_opts.c */ + +#undef set_menu_opts +int set_menu_opts( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_off +int menu_opts_off( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts_on +int menu_opts_on( + MENU *menu, + Menu_Options opts) + { return(*(int *)0); } + +#undef menu_opts +Menu_Options menu_opts( + const MENU *menu) + { return(*(Menu_Options *)0); } + +/* ./m_pad.c */ + +#undef set_menu_pad +int set_menu_pad( + MENU *menu, + int pad) + { return(*(int *)0); } + +#undef menu_pad +int menu_pad( + const MENU *menu) + { return(*(int *)0); } + +/* ./m_pattern.c */ + +#undef menu_pattern +char *menu_pattern( + const MENU *menu) + { return(*(char **)0); } + +#undef set_menu_pattern +int set_menu_pattern( + MENU *menu, + const char *p) + { return(*(int *)0); } + +/* ./m_post.c */ + +#undef _nc_Post_Item +void _nc_Post_Item( + const MENU *menu, + const ITEM *item) + { /* void */ } + +#undef _nc_Draw_Menu +void _nc_Draw_Menu( + const MENU *menu) + { /* void */ } + +#undef post_menu +int post_menu( + MENU *menu) + { return(*(int *)0); } + +#undef unpost_menu +int unpost_menu( + MENU *menu) + { return(*(int *)0); } + +/* ./m_req_name.c */ + +#undef menu_request_name +const char *menu_request_name( + int request) + { return(*(const char **)0); } + +#undef menu_request_by_name +int menu_request_by_name( + const char *str) + { return(*(int *)0); } + +/* ./m_scale.c */ + +#undef scale_menu +int scale_menu( + const MENU *menu, + int *rows, + int *cols) + { return(*(int *)0); } + +/* ./m_spacing.c */ + +#undef set_menu_spacing +int set_menu_spacing( + MENU *menu, + int s_desc, + int s_row, + int s_col) + { return(*(int *)0); } + +#undef menu_spacing +int menu_spacing( + const MENU *menu, + int *s_desc, + int *s_row, + int *s_col) + { return(*(int *)0); } + +/* ./m_sub.c */ + +#undef set_menu_sub +int set_menu_sub( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_sub +WINDOW *menu_sub( + const MENU *menu) + { return(*(WINDOW **)0); } + +/* ./m_trace.c */ + +#undef _nc_retrace_item +ITEM *_nc_retrace_item( + ITEM *code) + { return(*(ITEM **)0); } + +#undef _nc_retrace_item_ptr +ITEM **_nc_retrace_item_ptr( + ITEM **code) + { return(*(ITEM ***)0); } + +#undef _nc_retrace_item_opts +Item_Options _nc_retrace_item_opts( + Item_Options code) + { return(*(Item_Options *)0); } + +#undef _nc_retrace_menu +MENU *_nc_retrace_menu( + MENU *code) + { return(*(MENU **)0); } + +#undef _nc_retrace_menu_hook +Menu_Hook _nc_retrace_menu_hook( + Menu_Hook code) + { return(*(Menu_Hook *)0); } + +#undef _nc_retrace_menu_opts +Menu_Options _nc_retrace_menu_opts( + Menu_Options code) + { return(*(Menu_Options *)0); } + +/* ./m_userptr.c */ + +#undef set_menu_userptr +int set_menu_userptr( + MENU *menu, + void *userptr) + { return(*(int *)0); } + +#undef menu_userptr +void *menu_userptr( + const MENU *menu) + { return(*(void **)0); } + +/* ./m_win.c */ + +#undef set_menu_win +int set_menu_win( + MENU *menu, + WINDOW *win) + { return(*(int *)0); } + +#undef menu_win +WINDOW *menu_win( + const MENU *menu) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/menu/m_attribs.c b/contrib/ncurses/menu/m_attribs.c new file mode 100644 index 00000000..a9275d08 --- /dev/null +++ b/contrib/ncurses/menu/m_attribs.c @@ -0,0 +1,145 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_attribs * +* Control menus display attributes * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_attribs.c,v 1.20 2021/06/17 21:20:30 tom Exp $") + +/* Macro to redraw menu if it is posted and changed */ +#define Refresh_Menu(menu) \ + if ( (menu) && ((menu)->status & _POSTED) )\ + {\ + _nc_Draw_Menu( menu );\ + _nc_Show_Menu( menu );\ + } + +/* "Template" macro to generate a function to set a menus attribute */ +#define GEN_MENU_ATTR_SET_FCT( name ) \ +MENU_EXPORT(int) NCURSES_API set_menu_ ## name (MENU* menu, chtype attr) \ +{\ + T((T_CALLED("set_menu_" #name "(%p,%s)"), (void *) menu, _traceattr(attr))); \ + if (!(attr==A_NORMAL || (attr & A_ATTRIBUTES)==attr))\ + RETURN(E_BAD_ARGUMENT);\ + if (menu && ( menu -> name != attr))\ + {\ + (menu -> name) = attr;\ + Refresh_Menu(menu);\ + }\ + Normalize_Menu( menu ) -> name = attr;\ + RETURN(E_OK);\ +} + +/* "Template" macro to generate a function to get a menu's attribute */ +#define GEN_MENU_ATTR_GET_FCT( name ) \ +MENU_EXPORT(chtype) NCURSES_API menu_ ## name (const MENU * menu)\ +{\ + T((T_CALLED("menu_" #name "(%p)"), (const void *) menu));\ + returnAttr(Normalize_Menu( menu ) -> name);\ +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_fore(MENU *menu, chtype attr) +| +| Description : Set the attribute for selectable items. In single- +| valued menus this is used to highlight the current +| item ((i.e. where the cursor is), in multi-valued +| menus this is used to highlight the selected items. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - an invalid value has been passed ++--------------------------------------------------------------------------*/ +GEN_MENU_ATTR_SET_FCT(fore) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : chtype menu_fore(const MENU* menu) +| +| Description : Return the attribute used for selectable items that +| are current (single-valued menu) or selected (multi- +| valued menu). +| +| Return Values : Attribute value ++--------------------------------------------------------------------------*/ +GEN_MENU_ATTR_GET_FCT(fore) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_back(MENU *menu, chtype attr) +| +| Description : Set the attribute for selectable but not yet selected +| items. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - an invalid value has been passed ++--------------------------------------------------------------------------*/ +GEN_MENU_ATTR_SET_FCT(back) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : chtype menu_back(const MENU *menu) +| +| Description : Return the attribute used for selectable but not yet +| selected items. +| +| Return Values : Attribute value ++--------------------------------------------------------------------------*/ +GEN_MENU_ATTR_GET_FCT(back) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_grey(MENU *menu, chtype attr) +| +| Description : Set the attribute for unselectable items. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - an invalid value has been passed ++--------------------------------------------------------------------------*/ +GEN_MENU_ATTR_SET_FCT(grey) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : chtype menu_grey(const MENU *menu) +| +| Description : Return the attribute used for non-selectable items +| +| Return Values : Attribute value ++--------------------------------------------------------------------------*/ +GEN_MENU_ATTR_GET_FCT(grey) + +/* m_attribs.c ends here */ diff --git a/contrib/ncurses/menu/m_cursor.c b/contrib/ncurses/menu/m_cursor.c new file mode 100644 index 00000000..b9b301d3 --- /dev/null +++ b/contrib/ncurses/menu/m_cursor.c @@ -0,0 +1,113 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_cursor * +* Correctly position a menu's cursor * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_cursor.c,v 1.26 2021/03/27 23:46:29 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : _nc_menu_cursor_pos +| +| Description : Return position of logical cursor to current item +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu +| E_NOT_POSTED - Menu is not posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +_nc_menu_cursor_pos(const MENU *menu, const ITEM *item, int *pY, int *pX) +{ + if (!menu || !pX || !pY) + return (E_BAD_ARGUMENT); + else + { + if ((ITEM *)0 == item) + item = menu->curitem; + assert(item != (ITEM *)0); + + if (!(menu->status & _POSTED)) + return (E_NOT_POSTED); + + *pX = item->x * (menu->spc_cols + menu->itemlen); + *pY = (item->y - menu->toprow) * menu->spc_rows; + } + return (E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : pos_menu_cursor +| +| Description : Position logical cursor to current item in menu +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu +| E_NOT_POSTED - Menu is not posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +pos_menu_cursor(const MENU *menu) +{ + int x = 0, y = 0; + int err = _nc_menu_cursor_pos(menu, (ITEM *)0, &y, &x); + + T((T_CALLED("pos_menu_cursor(%p)"), (const void *)menu)); + + if (E_OK == err) + { + WINDOW *win = Get_Menu_UserWin(menu); + WINDOW *sub = menu->usersub ? menu->usersub : win; + + assert(win && sub); + + if ((menu->opt & O_SHOWMATCH) && (menu->pindex > 0)) + x += (menu->pindex + menu->marklen - 1); + + wmove(sub, y, x); + + if (win != sub) + { + wcursyncup(sub); + wsyncup(sub); + untouchwin(sub); + } + } + RETURN(err); +} + +/* m_cursor.c ends here */ diff --git a/contrib/ncurses/menu/m_driver.c b/contrib/ncurses/menu/m_driver.c new file mode 100644 index 00000000..93882b28 --- /dev/null +++ b/contrib/ncurses/menu/m_driver.c @@ -0,0 +1,571 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_driver * +* Central dispatching routine * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_driver.c,v 1.38 2024/07/27 18:14:20 tom Exp $") + +/* Macros */ + +/* Remove the last character from the match pattern buffer */ +#define Remove_Character_From_Pattern(menu) \ + (menu)->pattern[--((menu)->pindex)] = '\0' + +/* Add a new character to the match pattern buffer */ +#define Add_Character_To_Pattern(menu,ch) \ + { (menu)->pattern[((menu)->pindex)++] = (char) (ch);\ + (menu)->pattern[(menu)->pindex] = '\0'; } + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : static bool Is_Sub_String( +| bool IgnoreCaseFlag, +| const char *part, +| const char *string) +| +| Description : Checks whether or not part is a substring of string. +| +| Return Values : TRUE - if it is a substring +| FALSE - if it is not a substring ++--------------------------------------------------------------------------*/ +static bool +Is_Sub_String( + bool IgnoreCaseFlag, + const char *part, + const char *string +) +{ + assert(part && string); + if (IgnoreCaseFlag) + { + while (*string && *part) + { + if (toupper(UChar(*string++)) != toupper(UChar(*part))) + break; + part++; + } + } + else + { + while (*string && *part) + if (*part != *string++) + break; + part++; + } + return ((*part) ? FALSE : TRUE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int _nc_Match_Next_Character_In_Item_Name( +| MENU *menu, +| int ch, +| ITEM **item) +| +| Description : This internal routine is called for a menu positioned +| at an item with three different classes of characters: +| - a printable character; the character is added to +| the current pattern and the next item matching +| this pattern is searched. +| - NUL; the pattern stays as it is and the next item +| matching the pattern is searched +| - BS; the pattern stays as it is and the previous +| item matching the pattern is searched +| +| The item parameter contains on call a pointer to +| the item where the search starts. On return - if +| a match was found - it contains a pointer to the +| matching item. +| +| Return Values : E_OK - an item matching the pattern was found +| E_NO_MATCH - nothing found ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +_nc_Match_Next_Character_In_Item_Name +(MENU *menu, int ch, ITEM **item) +{ + bool found = FALSE, passed = FALSE; + int idx, last; + + T((T_CALLED("_nc_Match_Next_Character(%p,%d,%p)"), + (void *)menu, ch, (void *)item)); + + assert(menu && item && *item); + idx = (*item)->index; + + if (ch && ch != BS) + { + /* if we become to long, we need no further checking : there can't be + a match ! */ + if ((menu->pindex + 1) > menu->namelen) + RETURN(E_NO_MATCH); + + Add_Character_To_Pattern(menu, ch); + /* we artificially position one item back, because in the do...while + loop we start with the next item. This means, that with a new + pattern search we always start the scan with the actual item. If + we do a NEXT_PATTERN or PREV_PATTERN search, we start with the + one after or before the actual item. */ + if (--idx < 0) + idx = menu->nitems - 1; + } + + last = idx; /* this closes the cycle */ + + do + { + if (ch == BS) + { /* we have to go backward */ + if (--idx < 0) + idx = menu->nitems - 1; + } + else + { /* otherwise we always go forward */ + if (++idx >= menu->nitems) + idx = 0; + } + if (Is_Sub_String((bool)((menu->opt & O_IGNORECASE) != 0), + menu->pattern, + menu->items[idx]->name.str) + ) + found = TRUE; + else + passed = TRUE; + } + while (!found && (idx != last)); + + if (found) + { + if (!((idx == (*item)->index) && passed)) + { + *item = menu->items[idx]; + RETURN(E_OK); + } + /* This point is reached, if we fully cycled through the item list + and the only match we found is the starting item. With a NEXT_PATTERN + or PREV_PATTERN scan this means, that there was no additional match. + If we searched with an expanded new pattern, we should never reach + this point, because if the expanded pattern matches also the actual + item we will find it in the first attempt (passed==FALSE) and we + will never cycle through the whole item array. + */ + assert(ch == 0 || ch == BS); + } + else + { + if (ch && ch != BS && menu->pindex > 0) + { + /* if we had no match with a new pattern, we have to restore it */ + Remove_Character_From_Pattern(menu); + } + } + RETURN(E_NO_MATCH); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int menu_driver(MENU* menu, int c) +| +| Description : Central dispatcher for the menu. Translates the logical +| request 'c' into a menu action. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu pointer +| E_BAD_STATE - menu is in user hook routine +| E_NOT_POSTED - menu is not posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +menu_driver(MENU *menu, int c) +{ +#define NAVIGATE(dir) \ + if (!item->dir)\ + result = E_REQUEST_DENIED;\ + else\ + item = item->dir + + int result = E_OK; + ITEM *item; + int my_top_row; + + T((T_CALLED("menu_driver(%p,%d)"), (void *)menu, c)); + + if (!menu) + RETURN(E_BAD_ARGUMENT); + + if (menu->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + if (!(menu->status & _POSTED)) + RETURN(E_NOT_POSTED); + + item = menu->curitem; + + my_top_row = menu->toprow; + assert(item); + + if ((c > KEY_MAX) && (c <= MAX_MENU_COMMAND)) + { + int rdiff; + + if (!((c == REQ_BACK_PATTERN) + || (c == REQ_NEXT_MATCH) || (c == REQ_PREV_MATCH))) + { + assert(menu->pattern); + Reset_Pattern(menu); + } + + switch (c) + { + case REQ_LEFT_ITEM: + /*=================*/ + NAVIGATE(left); + break; + + case REQ_RIGHT_ITEM: + /*==================*/ + NAVIGATE(right); + break; + + case REQ_UP_ITEM: + /*===============*/ + NAVIGATE(up); + break; + + case REQ_DOWN_ITEM: + /*=================*/ + NAVIGATE(down); + break; + + case REQ_SCR_ULINE: + /*=================*/ + if (my_top_row == 0 || !(item->up)) + result = E_REQUEST_DENIED; + else + { + --my_top_row; + item = item->up; + } + break; + + case REQ_SCR_DLINE: + /*=================*/ + if ((my_top_row + menu->arows >= menu->rows) || !(item->down)) + { + /* only if the menu has less items than rows, we can deny the + request. Otherwise the epilogue of this routine adjusts the + top row if necessary */ + result = E_REQUEST_DENIED; + } + else + { + my_top_row++; + item = item->down; + } + break; + + case REQ_SCR_DPAGE: + /*=================*/ + rdiff = menu->rows - (menu->arows + my_top_row); + if (rdiff > menu->arows) + rdiff = menu->arows; + if (rdiff <= 0) + result = E_REQUEST_DENIED; + else + { + my_top_row += rdiff; + while (rdiff-- > 0 && item != 0 && item->down != 0) + item = item->down; + } + break; + + case REQ_SCR_UPAGE: + /*=================*/ + rdiff = (menu->arows < my_top_row) ? menu->arows : my_top_row; + if (rdiff <= 0) + result = E_REQUEST_DENIED; + else + { + my_top_row -= rdiff; + while (rdiff-- > 0 && item != 0 && item->up != 0) + item = item->up; + } + break; + + case REQ_FIRST_ITEM: + /*==================*/ + item = menu->items[0]; + break; + + case REQ_LAST_ITEM: + /*=================*/ + item = menu->items[menu->nitems - 1]; + break; + + case REQ_NEXT_ITEM: + /*=================*/ + if ((item->index + 1) >= menu->nitems) + { + if (menu->opt & O_NONCYCLIC) + result = E_REQUEST_DENIED; + else + item = menu->items[0]; + } + else + item = menu->items[item->index + 1]; + break; + + case REQ_PREV_ITEM: + /*=================*/ + if (item->index <= 0) + { + if (menu->opt & O_NONCYCLIC) + result = E_REQUEST_DENIED; + else + item = menu->items[menu->nitems - 1]; + } + else + item = menu->items[item->index - 1]; + break; + + case REQ_TOGGLE_ITEM: + /*===================*/ + if (menu->opt & O_ONEVALUE) + { + result = E_REQUEST_DENIED; + } + else + { + if (menu->curitem->opt & O_SELECTABLE) + { + menu->curitem->value = !menu->curitem->value; + Move_And_Post_Item(menu, menu->curitem); + _nc_Show_Menu(menu); + } + else + result = E_NOT_SELECTABLE; + } + break; + + case REQ_CLEAR_PATTERN: + /*=====================*/ + /* already cleared in prologue */ + break; + + case REQ_BACK_PATTERN: + /*====================*/ + if (menu->pindex > 0) + { + assert(menu->pattern); + Remove_Character_From_Pattern(menu); + pos_menu_cursor(menu); + } + else + result = E_REQUEST_DENIED; + break; + + case REQ_NEXT_MATCH: + /*==================*/ + assert(menu->pattern); + if (menu->pattern[0]) + result = _nc_Match_Next_Character_In_Item_Name(menu, 0, &item); + else + { + if ((item->index + 1) < menu->nitems) + item = menu->items[item->index + 1]; + else + { + if (menu->opt & O_NONCYCLIC) + result = E_REQUEST_DENIED; + else + item = menu->items[0]; + } + } + break; + + case REQ_PREV_MATCH: + /*==================*/ + assert(menu->pattern); + if (menu->pattern[0]) + result = _nc_Match_Next_Character_In_Item_Name(menu, BS, &item); + else + { + if (item->index) + item = menu->items[item->index - 1]; + else + { + if (menu->opt & O_NONCYCLIC) + result = E_REQUEST_DENIED; + else + item = menu->items[menu->nitems - 1]; + } + } + break; + + default: + /*======*/ + result = E_UNKNOWN_COMMAND; + break; + } + } + else + { /* not a command */ + if (!(c & ~((int)MAX_REGULAR_CHARACTER)) && isprint(UChar(c))) + result = _nc_Match_Next_Character_In_Item_Name(menu, c, &item); +#ifdef NCURSES_MOUSE_VERSION + else if (KEY_MOUSE == c) + { + MEVENT event; + const WINDOW *uwin = Get_Menu_UserWin(menu); + + getmouse(&event); + if ((event.bstate & (BUTTON1_CLICKED | + BUTTON1_DOUBLE_CLICKED | + BUTTON1_TRIPLE_CLICKED)) + && wenclose(uwin, event.y, event.x)) + { /* we react only if the click was in the userwin, that means + * inside the menu display area or at the decoration window. + */ + const WINDOW *sub = Get_Menu_Window(menu); + int ry = event.y, rx = event.x; /* screen coordinates */ + + result = E_REQUEST_DENIED; + if (mouse_trafo(&ry, &rx, FALSE)) + { /* rx, ry are now "curses" coordinates */ + if (ry < sub->_begy) + { /* we clicked above the display region; this is + * interpreted as "scroll up" request + */ + if (event.bstate & BUTTON1_CLICKED) + result = menu_driver(menu, REQ_SCR_ULINE); + else if (event.bstate & BUTTON1_DOUBLE_CLICKED) + result = menu_driver(menu, REQ_SCR_UPAGE); + else if (event.bstate & BUTTON1_TRIPLE_CLICKED) + result = menu_driver(menu, REQ_FIRST_ITEM); + RETURN(result); + } + else if (ry > sub->_begy + sub->_maxy) + { /* we clicked below the display region; this is + * interpreted as "scroll down" request + */ + if (event.bstate & BUTTON1_CLICKED) + result = menu_driver(menu, REQ_SCR_DLINE); + else if (event.bstate & BUTTON1_DOUBLE_CLICKED) + result = menu_driver(menu, REQ_SCR_DPAGE); + else if (event.bstate & BUTTON1_TRIPLE_CLICKED) + result = menu_driver(menu, REQ_LAST_ITEM); + RETURN(result); + } + else if (wenclose(sub, event.y, event.x)) + { /* Inside the area we try to find the hit item */ + int x, y; + + ry = event.y; + rx = event.x; + if (wmouse_trafo(sub, &ry, &rx, FALSE)) + { + int i; + + for (i = 0; i < menu->nitems; i++) + { + int err = _nc_menu_cursor_pos(menu, + menu->items[i], + &y, &x); + + if (E_OK == err) + { + if ((ry == y) && + (rx >= x) && + (rx < x + menu->itemlen)) + { + item = menu->items[i]; + result = E_OK; + break; + } + } + } + if (E_OK == result) + { /* We found an item, now we can handle the click. + * A single click just positions the menu cursor + * to the clicked item. A double click toggles + * the item. + */ + if (event.bstate & BUTTON1_DOUBLE_CLICKED) + { + _nc_New_TopRow_and_CurrentItem(menu, + my_top_row, + item); + menu_driver(menu, REQ_TOGGLE_ITEM); + result = E_UNKNOWN_COMMAND; + } + } + } + } + } + } + else + { + if (menu->opt & O_MOUSE_MENU) + ungetmouse(&event); /* let someone else handle this */ + result = E_REQUEST_DENIED; + } + } +#endif /* NCURSES_MOUSE_VERSION */ + else + result = E_UNKNOWN_COMMAND; + } + + if (item == 0) + { + result = E_BAD_STATE; + } + else if (E_OK == result) + { + /* Adjust the top row if it turns out that the current item unfortunately + doesn't appear in the menu window */ + if (item->y < my_top_row) + my_top_row = item->y; + else if (item->y >= (my_top_row + menu->arows)) + my_top_row = item->y - menu->arows + 1; + + _nc_New_TopRow_and_CurrentItem(menu, my_top_row, item); + + } + + RETURN(result); +} + +/* m_driver.c ends here */ diff --git a/contrib/ncurses/menu/m_format.c b/contrib/ncurses/menu/m_format.c new file mode 100644 index 00000000..65adfc6b --- /dev/null +++ b/contrib/ncurses/menu/m_format.c @@ -0,0 +1,133 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_format * +* Set and get maximum numbers of rows and columns in menus * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_format.c,v 1.22 2021/03/27 23:46:29 tom Exp $") + +#define minimum(a,b) ((a)<(b) ? (a): (b)) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_format(MENU *menu, int rows, int cols) +| +| Description : Sets the maximum number of rows and columns of items +| that may be displayed at one time on a menu. If the +| menu contains more items than can be displayed at +| once, the menu will be scrollable. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid values passed +| E_NOT_CONNECTED - there are no items connected +| E_POSTED - the menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_format(MENU *menu, int rows, int cols) +{ + + T((T_CALLED("set_menu_format(%p,%d,%d)"), (void *)menu, rows, cols)); + + if (rows < 0 || cols < 0) + RETURN(E_BAD_ARGUMENT); + + if (menu) + { + int total_rows, total_cols; + + if (menu->status & _POSTED) + RETURN(E_POSTED); + + if (!(menu->items)) + RETURN(E_NOT_CONNECTED); + + if (rows == 0) + rows = menu->frows; + if (cols == 0) + cols = menu->fcols; + + if (menu->pattern) + Reset_Pattern(menu); + + menu->frows = (short)rows; + menu->fcols = (short)cols; + + assert(rows > 0 && cols > 0); + total_rows = (menu->nitems - 1) / cols + 1; + total_cols = (menu->opt & O_ROWMAJOR) ? + minimum(menu->nitems, cols) : + (menu->nitems - 1) / total_rows + 1; + + menu->rows = (short)total_rows; + menu->cols = (short)total_cols; + menu->arows = (short)minimum(total_rows, rows); + menu->toprow = 0; + menu->curitem = *(menu->items); + assert(menu->curitem); + SetStatus(menu, _LINK_NEEDED); + _nc_Calculate_Item_Length_and_Width(menu); + } + else + { + if (rows > 0) + _nc_Default_Menu.frows = (short)rows; + if (cols > 0) + _nc_Default_Menu.fcols = (short)cols; + } + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void menu_format(const MENU *menu, int *rows, int *cols) +| +| Description : Returns the maximum number of rows and columns that may +| be displayed at one time on menu. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +menu_format(const MENU *menu, int *rows, int *cols) +{ + if (rows) + *rows = Normalize_Menu(menu)->frows; + if (cols) + *cols = Normalize_Menu(menu)->fcols; +} + +/* m_format.c ends here */ diff --git a/contrib/ncurses/menu/m_global.c b/contrib/ncurses/menu/m_global.c new file mode 100644 index 00000000..4bc8ef8f --- /dev/null +++ b/contrib/ncurses/menu/m_global.c @@ -0,0 +1,601 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_global * +* Globally used internal routines and the default menu and item structures * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_global.c,v 1.34 2023/09/16 16:39:26 tom Exp $") + +static char mark[] = "-"; +/* *INDENT-OFF* */ +MENU_EXPORT_VAR(MENU) _nc_Default_Menu = { + 16, /* Nr. of chars high */ + 1, /* Nr. of chars wide */ + 16, /* Nr. of items high */ + 1, /* Nr. of items wide */ + 16, /* Nr. of formatted items high */ + 1, /* Nr. of formatted items wide */ + 16, /* Nr. of items high (actual) */ + 0, /* length of widest name */ + 0, /* length of widest description */ + 1, /* length of mark */ + 1, /* length of one item */ + 1, /* Spacing for descriptor */ + 1, /* Spacing for columns */ + 1, /* Spacing for rows */ + (char *)0, /* buffer used to store match chars */ + 0, /* Index into pattern buffer */ + (WINDOW *)0, /* Window containing entire menu */ + (WINDOW *)0, /* Portion of menu displayed */ + (WINDOW *)0, /* User's window */ + (WINDOW *)0, /* User's subwindow */ + (ITEM **)0, /* List of items */ + 0, /* Total Nr. of items in menu */ + (ITEM *)0, /* Current item */ + 0, /* Top row of menu */ + (chtype)A_REVERSE, /* Attribute for selection */ + (chtype)A_NORMAL, /* Attribute for nonselection */ + (chtype)A_UNDERLINE, /* Attribute for inactive */ + ' ', /* Pad character */ + (Menu_Hook)0, /* Menu init */ + (Menu_Hook)0, /* Menu term */ + (Menu_Hook)0, /* Item init */ + (Menu_Hook)0, /* Item term */ + (void *)0, /* userptr */ + mark, /* mark */ + ALL_MENU_OPTS, /* options */ + 0 /* status */ +}; + +MENU_EXPORT_VAR(ITEM) _nc_Default_Item = { + { (char *)0, 0 }, /* name */ + { (char *)0, 0 }, /* description */ + (MENU *)0, /* Pointer to parent menu */ + (char *)0, /* Userpointer */ + ALL_ITEM_OPTS, /* options */ + 0, /* Item Nr. */ + 0, /* y */ + 0, /* x */ + FALSE, /* value */ + (ITEM *)0, /* left */ + (ITEM *)0, /* right */ + (ITEM *)0, /* up */ + (ITEM *)0 /* down */ + }; +/* *INDENT-ON* */ + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : static void ComputeMaximum_NameDesc_Lenths(MENU *menu) +| +| Description : Calculates the maximum name and description lengths +| of the items connected to the menu +| +| Return Values : - ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static void +ComputeMaximum_NameDesc_Lengths(MENU *menu) +{ + unsigned MaximumNameLength = 0; + unsigned MaximumDescriptionLength = 0; + ITEM **items; + + assert(menu && menu->items); + for (items = menu->items; *items; items++) + { + unsigned check = (unsigned)_nc_Calculate_Text_Width(&((*items)->name)); + + if (check > MaximumNameLength) + MaximumNameLength = check; + + check = (unsigned)_nc_Calculate_Text_Width(&((*items)->description)); + if (check > MaximumDescriptionLength) + MaximumDescriptionLength = check; + } + + menu->namelen = (short)MaximumNameLength; + menu->desclen = (short)MaximumDescriptionLength; + T(("ComputeMaximum_NameDesc_Lengths %d,%d", menu->namelen, menu->desclen)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : static void ResetConnectionInfo(MENU *, ITEM **) +| +| Description : Reset all information in the menu and the items in +| the item array that indicates a connection +| +| Return Values : - ++--------------------------------------------------------------------------*/ +NCURSES_INLINE static void +ResetConnectionInfo(MENU *menu, ITEM **items) +{ + ITEM **item; + + assert(menu && items); + for (item = items; *item; item++) + { + (*item)->index = 0; + (*item)->imenu = (MENU *)0; + } + if (menu->pattern) + free(menu->pattern); + menu->pattern = (char *)0; + menu->pindex = 0; + menu->items = (ITEM **)0; + menu->nitems = 0; +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : bool _nc_Connect_Items(MENU *menu, ITEM **items) +| +| Description : Connect the items in the item array to the menu. +| Decorate all the items with a number and a backward +| pointer to the menu. +| +| Return Values : TRUE - successful connection +| FALSE - connection failed ++--------------------------------------------------------------------------*/ +MENU_EXPORT(bool) +_nc_Connect_Items(MENU *menu, ITEM **items) +{ + unsigned int ItemCount = 0; + + if (menu && items) + { + ITEM **item; + + for (item = items; *item; item++) + { + if ((*item)->imenu) + { + /* if a item is already connected, reject connection */ + break; + } + } + if (!(*item)) + /* we reached the end, so there was no connected item */ + { + for (item = items; *item; item++) + { + if (menu->opt & O_ONEVALUE) + { + (*item)->value = FALSE; + } + (*item)->index = (short)ItemCount++; + (*item)->imenu = menu; + } + } + } + else + return (FALSE); + + if (ItemCount != 0) + { + menu->items = items; + menu->nitems = (short)ItemCount; + ComputeMaximum_NameDesc_Lengths(menu); + if ((menu->pattern = typeMalloc(char, (unsigned)(1 + menu->namelen)))) + { + Reset_Pattern(menu); + set_menu_format(menu, menu->frows, menu->fcols); + menu->curitem = *items; + menu->toprow = 0; + return (TRUE); + } + } + + /* If we fall through to this point, we have to reset all items connection + and inform about a reject connection */ + ResetConnectionInfo(menu, items); + return (FALSE); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_Disconnect_Items(MENU *menu) +| +| Description : Disconnect the menus item array from the menu +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_Disconnect_Items(MENU *menu) +{ + if (menu && menu->items) + ResetConnectionInfo(menu, menu->items); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int _nc_Calculate_Text_Width(const TEXT * item) +| +| Description : Calculate the number of columns for a TEXT. +| +| Return Values : the width ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +_nc_Calculate_Text_Width(const TEXT *item /*FIXME: limit length */ ) +{ +#if USE_WIDEC_SUPPORT + int result = item->length; + + T((T_CALLED("_nc_menu_text_width(%p)"), (const void *)item)); + if (result != 0 && item->str != 0) + { + int count = (int)mbstowcs(0, item->str, 0); + wchar_t *temp = 0; + + if (count > 0 + && (temp = typeMalloc(wchar_t, 2 + count)) != 0) + { + int n; + + result = 0; + mbstowcs(temp, item->str, (unsigned)count); + for (n = 0; n < count; ++n) + { + int test = wcwidth(temp[n]); + + if (test <= 0) + test = 1; + result += test; + } + free(temp); + } + } + returnCode(result); +#else + return item->length; +#endif +} + +/* + * Calculate the actual width of a menu entry for wide-characters. + */ +#if USE_WIDEC_SUPPORT +static int +calculate_actual_width(MENU *menu, bool name) +{ + int width = 0; + + assert(menu && menu->items); + + if (menu->items != 0) + { + ITEM **items; + + for (items = menu->items; *items; items++) + { + int check = (name + ? _nc_Calculate_Text_Width(&((*items)->name)) + : _nc_Calculate_Text_Width(&((*items)->description))); + + if (check > width) + width = check; + } + } + else + { + width = (name ? menu->namelen : menu->desclen); + } + + T(("calculate_actual_width %s = %d/%d", + name ? "name" : "desc", + width, + name ? menu->namelen : menu->desclen)); + return width; +} +#else +#define calculate_actual_width(menu, name) (name ? menu->namelen : menu->desclen) +#endif + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_Calculate_Item_Length_and_Width(MENU *menu) +| +| Description : Calculate the length of an item and the width of the +| whole menu. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_Calculate_Item_Length_and_Width(MENU *menu) +{ + int l; + + assert(menu); + + menu->height = (short)(1 + menu->spc_rows * (menu->arows - 1)); + + l = calculate_actual_width(menu, TRUE); + l += menu->marklen; + + if ((menu->opt & O_SHOWDESC) && (menu->desclen > 0)) + { + l += calculate_actual_width(menu, FALSE); + l += menu->spc_desc; + } + + menu->itemlen = (short)l; + l *= menu->cols; + l += (menu->cols - 1) * menu->spc_cols; /* for the padding between the columns */ + menu->width = (short)l; + + T(("_nc_CalculateItem_Length_and_Width columns %d, item %d, width %d", + menu->cols, + menu->itemlen, + menu->width)); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_Link_Item(MENU *menu) +| +| Description : Statically calculate for every item its four neighbors. +| This depends on the orientation of the menu. This +| static approach simplifies navigation in the menu a lot. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_Link_Items(MENU *menu) +{ + if (menu && menu->items && *(menu->items)) + { + int i; + ITEM *item; + int Number_Of_Items = menu->nitems; + int col = 0, row = 0; + int Last_in_Row; + int Last_in_Column; + bool cycle = (menu->opt & O_NONCYCLIC) ? FALSE : TRUE; + + ClrStatus(menu, _LINK_NEEDED); + + if (menu->opt & O_ROWMAJOR) + { + int Number_Of_Columns = menu->cols; + + for (i = 0; i < Number_Of_Items; i++) + { + item = menu->items[i]; + + Last_in_Row = row * Number_Of_Columns + (Number_Of_Columns - 1); + + item->left = (col) ? + /* if we are not in the leftmost column, we can use the + predecessor in the items array */ + menu->items[i - 1] : + (cycle ? menu->items[(Last_in_Row >= Number_Of_Items) ? + Number_Of_Items - 1 : + Last_in_Row] : + (ITEM *)0); + + item->right = ((col < (Number_Of_Columns - 1)) && + ((i + 1) < Number_Of_Items) + )? + menu->items[i + 1] : + (cycle ? menu->items[row * Number_Of_Columns] : + (ITEM *)0 + ); + + Last_in_Column = (menu->rows - 1) * Number_Of_Columns + col; + + item->up = (row) ? menu->items[i - Number_Of_Columns] : + (cycle ? menu->items[(Last_in_Column >= Number_Of_Items) ? + Number_Of_Items - 1 : + Last_in_Column] : + (ITEM *)0); + + item->down = ((i + Number_Of_Columns) < Number_Of_Items) + ? + menu->items[i + Number_Of_Columns] : + (cycle ? menu->items[(row + 1) < menu->rows ? + Number_Of_Items - 1 : col] : + (ITEM *)0); + item->x = (short)col; + item->y = (short)row; + if (++col == Number_Of_Columns) + { + row++; + col = 0; + } + } + } + else + { + int Number_Of_Rows = menu->rows; + int j; + + for (j = 0; j < Number_Of_Items; j++) + { + item = menu->items[i = (col * Number_Of_Rows + row)]; + + Last_in_Column = (menu->cols - 1) * Number_Of_Rows + row; + + item->left = (col) ? + menu->items[i - Number_Of_Rows] : + (cycle ? (Last_in_Column >= Number_Of_Items) ? + menu->items[Last_in_Column - Number_Of_Rows] : + menu->items[Last_in_Column] : + (ITEM *)0); + + item->right = ((i + Number_Of_Rows) < Number_Of_Items) + ? + menu->items[i + Number_Of_Rows] : + (cycle ? menu->items[row] : (ITEM *)0); + + Last_in_Row = col * Number_Of_Rows + (Number_Of_Rows - 1); + + item->up = (row) ? + menu->items[i - 1] : + (cycle ? + menu->items[(Last_in_Row >= Number_Of_Items) ? + Number_Of_Items - 1 : + Last_in_Row] : + (ITEM *)0); + + item->down = (row < (Number_Of_Rows - 1)) + ? + (menu->items[((i + 1) < Number_Of_Items) ? + i + 1 : + (col - 1) * Number_Of_Rows + row + 1]) : + (cycle ? + menu->items[col * Number_Of_Rows] : + (ITEM *)0 + ); + + item->x = (short)col; + item->y = (short)row; + if ((++row) == Number_Of_Rows) + { + col++; + row = 0; + } + } + } + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_Show_Menu(const MENU* menu) +| +| Description : Update the window that is associated with the menu +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_Show_Menu(const MENU *menu) +{ + assert(menu); + if ((menu->status & _POSTED) && !(menu->status & _IN_DRIVER)) + { + WINDOW *win; + int maxy, maxx; + + /* adjust the internal subwindow to start on the current top */ + assert(menu->sub); + mvderwin(menu->sub, menu->spc_rows * menu->toprow, 0); + win = Get_Menu_Window(menu); + + maxy = getmaxy(win); + maxx = getmaxx(win); + + if (menu->height < maxy) + maxy = menu->height; + if (menu->width < maxx) + maxx = menu->width; + + copywin(menu->sub, win, 0, 0, 0, 0, maxy - 1, maxx - 1, 0); + pos_menu_cursor(menu); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_New_TopRow_and_CurrentItem( +| MENU *menu, +| int new_toprow, +| ITEM *new_current_item) +| +| Description : Redisplay the menu so that the given row becomes the +| top row and the given item becomes the new current +| item. +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_New_TopRow_and_CurrentItem( + MENU *menu, + int new_toprow, + ITEM *new_current_item) +{ + assert(menu); + if (menu->status & _POSTED) + { + ITEM *cur_item; + bool mterm_called = FALSE; + bool iterm_called = FALSE; + + if (new_current_item != menu->curitem) + { + Call_Hook(menu, itemterm); + iterm_called = TRUE; + } + if (new_toprow != menu->toprow) + { + Call_Hook(menu, menuterm); + mterm_called = TRUE; + } + + cur_item = menu->curitem; + assert(cur_item); + menu->toprow = (short)(((menu->rows - menu->frows) >= 0) + ? Min(menu->rows - menu->frows, new_toprow) + : 0); + menu->curitem = new_current_item; + + if (mterm_called) + { + Call_Hook(menu, menuinit); + } + if (iterm_called) + { + /* this means, move from the old current_item to the new one... */ + Move_To_Current_Item(menu, cur_item); + Call_Hook(menu, iteminit); + } + if (mterm_called || iterm_called) + { + _nc_Show_Menu(menu); + } + else + pos_menu_cursor(menu); + } + else + { /* if we are not posted, this is quite simple */ + menu->toprow = (short)(((menu->rows - menu->frows) >= 0) + ? Min(menu->rows - menu->frows, new_toprow) + : 0); + menu->curitem = new_current_item; + } +} + +/* m_global.c ends here */ diff --git a/contrib/ncurses/menu/m_hook.c b/contrib/ncurses/menu/m_hook.c new file mode 100644 index 00000000..c7d9fe91 --- /dev/null +++ b/contrib/ncurses/menu/m_hook.c @@ -0,0 +1,153 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_hook * +* Assign application specific routines for automatic invocation by menus * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_hook.c,v 1.21 2021/06/17 21:26:02 tom Exp $") + +/* "Template" macro to generate function to set application specific hook */ +#define GEN_HOOK_SET_FUNCTION( typ, name ) \ +MENU_EXPORT(int) NCURSES_API set_ ## typ ## _ ## name (MENU *menu, Menu_Hook func )\ +{\ + TR_FUNC_BFR(1);\ + T((T_CALLED("set_" #typ "_" #name "(%p,%s)"), (void *) menu, TR_FUNC_ARG(0, func)));\ + (Normalize_Menu(menu) -> typ ## name = func );\ + RETURN(E_OK);\ +} + +/* "Template" macro to generate function to get application specific hook */ +#define GEN_HOOK_GET_FUNCTION( typ, name ) \ +MENU_EXPORT(Menu_Hook) NCURSES_API typ ## _ ## name ( const MENU *menu )\ +{\ + T((T_CALLED(#typ "_" #name "(%p)"), (const void *) menu));\ + returnMenuHook(Normalize_Menu(menu) -> typ ## name);\ +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_init(MENU *menu, void (*f)(MENU *)) +| +| Description : Set user-exit which is called when menu is posted +| or just after the top row changes. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(menu, init) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void (*)(MENU *) menu_init(const MENU *menu) +| +| Description : Return address of user-exit function which is called +| when a menu is posted or just after the top row +| changes. +| +| Return Values : Menu init function address or NULL ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(menu, init) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_term (MENU *menu, void (*f)(MENU *)) +| +| Description : Set user-exit which is called when menu is unposted +| or just before the top row changes. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(menu, term) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void (*)(MENU *) menu_term(const MENU *menu) +| +| Description : Return address of user-exit function which is called +| when a menu is unposted or just before the top row +| changes. +| +| Return Values : Menu finalization function address or NULL ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(menu, term) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_item_init (MENU *menu, void (*f)(MENU *)) +| +| Description : Set user-exit which is called when menu is posted +| or just after the current item changes. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(item, init) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void (*)(MENU *) item_init (const MENU *menu) +| +| Description : Return address of user-exit function which is called +| when a menu is posted or just after the current item +| changes. +| +| Return Values : Item init function address or NULL ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(item, init) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_item_term (MENU *menu, void (*f)(MENU *)) +| +| Description : Set user-exit which is called when menu is unposted +| or just before the current item changes. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +GEN_HOOK_SET_FUNCTION(item, term) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void (*)(MENU *) item_init (const MENU *menu) +| +| Description : Return address of user-exit function which is called +| when a menu is unposted or just before the current item +| changes. +| +| Return Values : Item finalization function address or NULL ++--------------------------------------------------------------------------*/ +GEN_HOOK_GET_FUNCTION(item, term) + +/* m_hook.c ends here */ diff --git a/contrib/ncurses/menu/m_item_cur.c b/contrib/ncurses/menu/m_item_cur.c new file mode 100644 index 00000000..ed765182 --- /dev/null +++ b/contrib/ncurses/menu/m_item_cur.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_cur * +* Set and get current menus item * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_cur.c,v 1.22 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_current_item(MENU *menu, const ITEM *item) +| +| Description : Make the item the current item +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_current_item(MENU *menu, ITEM *item) +{ + T((T_CALLED("set_current_item(%p,%p)"), (void *)menu, (void *)item)); + + if (menu && item && (item->imenu == menu)) + { + if (menu->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + assert(menu->curitem); + if (item != menu->curitem) + { + if (menu->status & _LINK_NEEDED) + { + /* + * Items are available, but they are not linked together. + * So we have to link here. + */ + _nc_Link_Items(menu); + } + assert(menu->pattern); + Reset_Pattern(menu); + /* adjust the window to make item visible and update the menu */ + Adjust_Current_Item(menu, menu->toprow, item); + } + } + else + RETURN(E_BAD_ARGUMENT); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : ITEM *current_item(const MENU *menu) +| +| Description : Return the menus current item +| +| Return Values : Item pointer or NULL if failure ++--------------------------------------------------------------------------*/ +MENU_EXPORT(ITEM *) +current_item(const MENU *menu) +{ + T((T_CALLED("current_item(%p)"), (const void *)menu)); + returnItem((menu && menu->items) ? menu->curitem : (ITEM *)0); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int item_index(const ITEM *) +| +| Description : Return the logical index of this item. +| +| Return Values : The index or ERR if this is an invalid item pointer ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +item_index(const ITEM *item) +{ + T((T_CALLED("item_index(%p)"), (const void *)item)); + returnCode((item && item->imenu) ? item->index : ERR); +} + +/* m_item_cur.c ends here */ diff --git a/contrib/ncurses/menu/m_item_nam.c b/contrib/ncurses/menu/m_item_nam.c new file mode 100644 index 00000000..ce74531f --- /dev/null +++ b/contrib/ncurses/menu/m_item_nam.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_nam * +* Get menus item name and description * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_nam.c,v 1.19 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : char *item_name(const ITEM *item) +| +| Description : Return name of menu item +| +| Return Values : See above; returns NULL if item is invalid ++--------------------------------------------------------------------------*/ +MENU_EXPORT(const char *) +item_name(const ITEM *item) +{ + T((T_CALLED("item_name(%p)"), (const void *)item)); + returnCPtr((item) ? item->name.str : (char *)0); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : char *item_description(const ITEM *item) +| +| Description : Returns description of item +| +| Return Values : See above; Returns NULL if item is invalid ++--------------------------------------------------------------------------*/ +MENU_EXPORT(const char *) +item_description(const ITEM *item) +{ + T((T_CALLED("item_description(%p)"), (const void *)item)); + returnCPtr((item) ? item->description.str : (char *)0); +} + +/* m_item_nam.c ends here */ diff --git a/contrib/ncurses/menu/m_item_new.c b/contrib/ncurses/menu/m_item_new.c new file mode 100644 index 00000000..28b71caf --- /dev/null +++ b/contrib/ncurses/menu/m_item_new.c @@ -0,0 +1,277 @@ +/**************************************************************************** + * Copyright 2020-2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_new * +* Create and destroy menu items * +* Set and get marker string for menu * +***************************************************************************/ + +#include "menu.priv.h" + +#if USE_WIDEC_SUPPORT +#if HAVE_WCTYPE_H +#include +#endif +#endif + +MODULE_ID("$Id: m_item_new.c,v 1.38 2021/06/17 21:26:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : bool Is_Printable_String(const char *s) +| +| Description : Checks whether or not the string contains only printable +| characters. +| +| Return Values : TRUE - if string is printable +| FALSE - if string contains non-printable characters ++--------------------------------------------------------------------------*/ +static bool +Is_Printable_String(const char *s) +{ + int result = TRUE; + +#if USE_WIDEC_SUPPORT + int count = (int)mbstowcs(0, s, 0); + wchar_t *temp = 0; + + assert(s); + + if (count > 0 + && (temp = typeCalloc(wchar_t, (2 + (unsigned)count))) != 0) + { + int n; + + mbstowcs(temp, s, (unsigned)count); + for (n = 0; n < count; ++n) + if (!iswprint((wint_t)temp[n])) + { + result = FALSE; + break; + } + free(temp); + } +#else + assert(s); + while (*s) + { + if (!isprint(UChar(*s))) + { + result = FALSE; + break; + } + s++; + } +#endif + return result; +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : ITEM *new_item(char *name, char *description) +| +| Description : Create a new item with name and description. Return +| a pointer to this new item. +| N.B.: an item must(!) have a name. +| +| Return Values : The item pointer or NULL if creation failed. ++--------------------------------------------------------------------------*/ +MENU_EXPORT(ITEM *) +new_item(const char *name, const char *description) +{ + ITEM *item; + + T((T_CALLED("new_item(\"%s\", \"%s\")"), + name ? name : "", + description ? description : "")); + + if (!name || (*name == '\0') || !Is_Printable_String(name)) + { + item = (ITEM *)0; + SET_ERROR(E_BAD_ARGUMENT); + } + else + { + item = typeCalloc(ITEM, 1); + + if (item) + { + T((T_CREATE("item %p"), (void *)item)); + *item = _nc_Default_Item; /* hope we have struct assignment */ + + item->name.length = (unsigned short)strlen(name); + item->name.str = name; + + if (description && (*description != '\0') && + Is_Printable_String(description)) + { + item->description.length = (unsigned short)strlen(description); + item->description.str = description; + } + else + { + item->description.length = 0; + item->description.str = (char *)0; + } + } + else + SET_ERROR(E_SYSTEM_ERROR); + } + returnItem(item); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int free_item(ITEM *item) +| +| Description : Free the allocated storage for this item. +| N.B.: a connected item can't be freed. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid value has been passed +| E_CONNECTED - item is still connected to a menu ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +free_item(ITEM *item) +{ + T((T_CALLED("free_item(%p)"), (void *)item)); + + if (!item) + RETURN(E_BAD_ARGUMENT); + + if (item->imenu) + RETURN(E_CONNECTED); + + free(item); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_mark( MENU *menu, const char *mark ) +| +| Description : Set the mark string used to indicate the current +| item (single-valued menu) or the selected items +| (multi-valued menu). +| The mark argument may be NULL, in which case no +| marker is used. +| This might be a little bit tricky, because this may +| affect the geometry of the menu, which we don't allow +| if it is already posted. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - an invalid value has been passed +| E_SYSTEM_ERROR - no memory to store mark ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_mark(MENU *menu, const char *mark) +{ + short l; + + T((T_CALLED("set_menu_mark(%p,%s)"), (void *)menu, _nc_visbuf(mark))); + + if (mark && (*mark != '\0') && Is_Printable_String(mark)) + l = (short)strlen(mark); + else + l = 0; + + if (menu) + { + char *old_mark = menu->mark; + unsigned short old_status = menu->status; + + if (menu->status & _POSTED) + { + /* If the menu is already posted, the geometry is fixed. Then + we can only accept a mark with exactly the same length */ + if (menu->marklen != l) + RETURN(E_BAD_ARGUMENT); + } + menu->marklen = l; + if (l) + { + menu->mark = strdup(mark); + if (menu->mark) + { + if (menu != &_nc_Default_Menu) + SetStatus(menu, _MARK_ALLOCATED); + } + else + { + menu->mark = old_mark; + menu->marklen = (short)((old_mark != 0) ? strlen(old_mark) : 0); + RETURN(E_SYSTEM_ERROR); + } + } + else + menu->mark = (char *)0; + + if ((old_status & _MARK_ALLOCATED) && old_mark) + free(old_mark); + + if (menu->status & _POSTED) + { + _nc_Draw_Menu(menu); + _nc_Show_Menu(menu); + } + else + { + /* Recalculate the geometry */ + _nc_Calculate_Item_Length_and_Width(menu); + } + } + else + { + returnCode(set_menu_mark(&_nc_Default_Menu, mark)); + } + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : char *menu_mark(const MENU *menu) +| +| Description : Return a pointer to the marker string +| +| Return Values : The marker string pointer or NULL if no marker defined ++--------------------------------------------------------------------------*/ +MENU_EXPORT(const char *) +menu_mark(const MENU *menu) +{ + T((T_CALLED("menu_mark(%p)"), (const void *)menu)); + returnPtr(Normalize_Menu(menu)->mark); +} + +/* m_item_new.c */ diff --git a/contrib/ncurses/menu/m_item_opt.c b/contrib/ncurses/menu/m_item_opt.c new file mode 100644 index 00000000..495e409b --- /dev/null +++ b/contrib/ncurses/menu/m_item_opt.c @@ -0,0 +1,160 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_opt * +* Menus item option routines * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_opt.c,v 1.22 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_item_opts(ITEM *item, Item_Options opts) +| +| Description : Set the options of the item. If there are relevant +| changes, the item is connected and the menu is posted, +| the menu will be redisplayed. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid item options ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_item_opts(ITEM *item, Item_Options opts) +{ + T((T_CALLED("set_menu_opts(%p,%d)"), (void *)item, opts)); + + opts &= ALL_ITEM_OPTS; + + if (opts & ~ALL_ITEM_OPTS) + RETURN(E_BAD_ARGUMENT); + + if (item) + { + if (item->opt != opts) + { + MENU *menu = item->imenu; + + item->opt = opts; + + if ((!(opts & O_SELECTABLE)) && item->value) + item->value = FALSE; + + if (menu && (menu->status & _POSTED)) + { + Move_And_Post_Item(menu, item); + _nc_Show_Menu(menu); + } + } + } + else + _nc_Default_Item.opt = opts; + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int item_opts_off(ITEM *item, Item_Options opts) +| +| Description : Switch of the options for this item. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid options ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +item_opts_off(ITEM *item, Item_Options opts) +{ + ITEM *citem = item; /* use a copy because set_item_opts must detect + + NULL item itself to adjust its behavior */ + + T((T_CALLED("item_opts_off(%p,%d)"), (void *)item, opts)); + + if (opts & ~ALL_ITEM_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Item(citem); + opts = citem->opt & ~(opts & ALL_ITEM_OPTS); + returnCode(set_item_opts(item, opts)); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int item_opts_on(ITEM *item, Item_Options opts) +| +| Description : Switch on the options for this item. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid options ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +item_opts_on(ITEM *item, Item_Options opts) +{ + ITEM *citem = item; /* use a copy because set_item_opts must detect + + NULL item itself to adjust its behavior */ + + T((T_CALLED("item_opts_on(%p,%d)"), (void *)item, opts)); + + opts &= ALL_ITEM_OPTS; + if (opts & ~ALL_ITEM_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Item(citem); + opts = citem->opt | opts; + returnCode(set_item_opts(item, opts)); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : Item_Options item_opts(const ITEM *item) +| +| Description : Switch of the options for this item. +| +| Return Values : Items options ++--------------------------------------------------------------------------*/ +MENU_EXPORT(Item_Options) +item_opts(const ITEM *item) +{ + T((T_CALLED("item_opts(%p)"), (const void *)item)); + returnItemOpts(ALL_ITEM_OPTS & Normalize_Item(item)->opt); +} + +/* m_item_opt.c ends here */ diff --git a/contrib/ncurses/menu/m_item_top.c b/contrib/ncurses/menu/m_item_top.c new file mode 100644 index 00000000..68303c76 --- /dev/null +++ b/contrib/ncurses/menu/m_item_top.c @@ -0,0 +1,108 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_top * +* Set and get top menus item * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_top.c,v 1.16 2021/06/17 21:11:08 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_top_row(MENU *menu, int row) +| +| Description : Makes the specified row the top row in the menu +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - not a menu pointer or invalid row +| E_NOT_CONNECTED - there are no items for the menu ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_top_row(MENU *menu, int row) +{ + T((T_CALLED("set_top_row(%p,%d)"), (void *)menu, row)); + + if (menu) + { + if (menu->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + if (menu->items == (ITEM **)0) + RETURN(E_NOT_CONNECTED); + + if ((row < 0) || (row > (menu->rows - menu->arows))) + RETURN(E_BAD_ARGUMENT); + } + else + RETURN(E_BAD_ARGUMENT); + + if (row != menu->toprow) + { + ITEM *item; + + if (menu->status & _LINK_NEEDED) + _nc_Link_Items(menu); + + item = menu->items[(menu->opt & O_ROWMAJOR) ? (row * menu->cols) : row]; + assert(menu->pattern); + Reset_Pattern(menu); + _nc_New_TopRow_and_CurrentItem(menu, row, item); + } + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int top_row(const MENU *) +| +| Description : Return the top row of the menu +| +| Return Values : The row number or ERR if there is no row ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +top_row(const MENU *menu) +{ + T((T_CALLED("top_row(%p)"), (const void *)menu)); + if (menu && menu->items && *(menu->items)) + { + assert((menu->toprow >= 0) && (menu->toprow < menu->rows)); + returnCode(menu->toprow); + } + else + returnCode(ERR); +} + +/* m_item_top.c ends here */ diff --git a/contrib/ncurses/menu/m_item_use.c b/contrib/ncurses/menu/m_item_use.c new file mode 100644 index 00000000..52d087e9 --- /dev/null +++ b/contrib/ncurses/menu/m_item_use.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_use * +* Associate application data with menu items * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_use.c,v 1.21 2020/12/12 00:38:08 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_item_userptr(ITEM *item, void *userptr) +| +| Description : Set the pointer that is reserved in any item to store +| application relevant information. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_item_userptr(ITEM *item, void *userptr) +{ + T((T_CALLED("set_item_userptr(%p,%p)"), (void *)item, (void *)userptr)); + Normalize_Item(item)->userptr = userptr; + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void *item_userptr(const ITEM *item) +| +| Description : Return the pointer that is reserved in any item to store +| application relevant information. +| +| Return Values : Value of the pointer. If no such pointer has been set, +| NULL is returned. ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void *) +item_userptr(const ITEM *item) +{ + T((T_CALLED("item_userptr(%p)"), (const void *)item)); + returnVoidPtr(Normalize_Item(item)->userptr); +} + +/* m_item_use.c */ diff --git a/contrib/ncurses/menu/m_item_val.c b/contrib/ncurses/menu/m_item_val.c new file mode 100644 index 00000000..3163f4b7 --- /dev/null +++ b/contrib/ncurses/menu/m_item_val.c @@ -0,0 +1,103 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_val * +* Set and get menus item values * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_val.c,v 1.20 2021/06/17 21:11:08 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_item_value(ITEM *item, int value) +| +| Description : Programmatically set the item's selection value. This is +| only allowed if the item is selectable at all and if +| it is not connected to a single-valued menu. +| If the item is connected to a posted menu, the menu +| will be redisplayed. +| +| Return Values : E_OK - success +| E_REQUEST_DENIED - not selectable or single valued menu ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_item_value(ITEM *item, bool value) +{ + T((T_CALLED("set_item_value(%p,%d)"), (void *)item, value)); + if (item) + { + MENU *menu = item->imenu; + + if ((!(item->opt & O_SELECTABLE)) || + (menu && (menu->opt & O_ONEVALUE))) + RETURN(E_REQUEST_DENIED); + + if (item->value ^ value) + { + item->value = value ? TRUE : FALSE; + if (menu) + { + if (menu->status & _POSTED) + { + Move_And_Post_Item(menu, item); + _nc_Show_Menu(menu); + } + } + } + } + else + _nc_Default_Item.value = value; + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : bool item_value(const ITEM *item) +| +| Description : Return the selection value of the item +| +| Return Values : TRUE - if item is selected +| FALSE - if item is not selected ++--------------------------------------------------------------------------*/ +MENU_EXPORT(bool) +item_value(const ITEM *item) +{ + T((T_CALLED("item_value(%p)"), (const void *)item)); + returnBool((Normalize_Item(item)->value) ? TRUE : FALSE); +} + +/* m_item_val.c ends here */ diff --git a/contrib/ncurses/menu/m_item_vis.c b/contrib/ncurses/menu/m_item_vis.c new file mode 100644 index 00000000..5471cad9 --- /dev/null +++ b/contrib/ncurses/menu/m_item_vis.c @@ -0,0 +1,69 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_item_vis * +* Tell if menu item is visible * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_item_vis.c,v 1.21 2024/07/27 18:14:09 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : bool item_visible(const ITEM *item) +| +| Description : A item is visible if it currently appears in the +| subwindow of a posted menu. +| +| Return Values : TRUE if visible +| FALSE if invisible ++--------------------------------------------------------------------------*/ +MENU_EXPORT(bool) +item_visible(const ITEM *item) +{ + const MENU *menu; + + T((T_CALLED("item_visible(%p)"), (const void *)item)); + if (item && + (menu = item->imenu) && + (menu->status & _POSTED) && + ((menu->toprow + menu->arows) > (item->y)) && + (item->y >= menu->toprow)) + returnBool(TRUE); + else + returnBool(FALSE); +} + +/* m_item_vis.c ends here */ diff --git a/contrib/ncurses/menu/m_items.c b/contrib/ncurses/menu/m_items.c new file mode 100644 index 00000000..ecc5e2f0 --- /dev/null +++ b/contrib/ncurses/menu/m_items.c @@ -0,0 +1,111 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2005,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_items * +* Connect and disconnect items to and from menus * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_items.c,v 1.21 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_items(MENU *menu, ITEM **items) +| +| Description : Sets the item pointer array connected to menu. +| +| Return Values : E_OK - success +| E_POSTED - menu is already posted +| E_CONNECTED - one or more items are already connected +| to another menu. +| E_BAD_ARGUMENT - An incorrect menu or item array was +| passed to the function ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_items(MENU *menu, ITEM **items) +{ + T((T_CALLED("set_menu_items(%p,%p)"), (void *)menu, (void *)items)); + + if (!menu || (items && !(*items))) + RETURN(E_BAD_ARGUMENT); + + if (menu->status & _POSTED) + RETURN(E_POSTED); + + if (menu->items) + _nc_Disconnect_Items(menu); + + if (items) + { + if (!_nc_Connect_Items(menu, items)) + RETURN(E_CONNECTED); + } + + menu->items = items; + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : ITEM **menu_items(const MENU *menu) +| +| Description : Returns a pointer to the item pointer array of the menu +| +| Return Values : NULL on error ++--------------------------------------------------------------------------*/ +MENU_EXPORT(ITEM **) +menu_items(const MENU *menu) +{ + T((T_CALLED("menu_items(%p)"), (const void *)menu)); + returnItemPtr(menu ? menu->items : (ITEM **)0); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int item_count(const MENU *menu) +| +| Description : Get the number of items connected to the menu. If the +| menu pointer is NULL we return -1. +| +| Return Values : Number of items or -1 to indicate error. ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +item_count(const MENU *menu) +{ + T((T_CALLED("item_count(%p)"), (const void *)menu)); + returnCode(menu ? menu->nitems : -1); +} + +/* m_items.c ends here */ diff --git a/contrib/ncurses/menu/m_new.c b/contrib/ncurses/menu/m_new.c new file mode 100644 index 00000000..be175581 --- /dev/null +++ b/contrib/ncurses/menu/m_new.c @@ -0,0 +1,144 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_new * +* Creation and destruction of new menus * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_new.c,v 1.27 2021/06/17 21:26:02 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : MENU* _nc_new_menu(SCREEN*, ITEM **items) +| +| Description : Creates a new menu connected to the item pointer +| array items and returns a pointer to the new menu. +| The new menu is initialized with the values from the +| default menu. +| +| Return Values : NULL on error ++--------------------------------------------------------------------------*/ +MENU_EXPORT(MENU *) +NCURSES_SP_NAME(new_menu) (NCURSES_SP_DCLx ITEM **items) +{ + int err = E_SYSTEM_ERROR; + MENU *menu = typeCalloc(MENU, 1); + + T((T_CALLED("new_menu(%p,%p)"), (void *)SP_PARM, (void *)items)); + if (menu) + { + T((T_CREATE("menu %p"), (void *)menu)); + *menu = _nc_Default_Menu; + menu->status = 0; + menu->rows = menu->frows; + menu->cols = menu->fcols; +#if NCURSES_SP_FUNCS + /* This ensures userwin and usersub are always non-null, + so we can derive always the SCREEN that this menu is + running on. */ + menu->userwin = SP_PARM->_stdscr; + menu->usersub = SP_PARM->_stdscr; +#endif + if (items && *items) + { + if (!_nc_Connect_Items(menu, items)) + { + err = E_NOT_CONNECTED; + free(menu); + menu = (MENU *)0; + } + else + err = E_OK; + } + } + + if (!menu) + SET_ERROR(err); + + returnMenu(menu); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : MENU *new_menu(ITEM **items) +| +| Description : Creates a new menu connected to the item pointer +| array items and returns a pointer to the new menu. +| The new menu is initialized with the values from the +| default menu. +| +| Return Values : NULL on error ++--------------------------------------------------------------------------*/ +#if NCURSES_SP_FUNCS +MENU_EXPORT(MENU *) +new_menu(ITEM **items) +{ + return NCURSES_SP_NAME(new_menu) (CURRENT_SCREEN, items); +} +#endif + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int free_menu(MENU *menu) +| +| Description : Disconnects menu from its associated item pointer +| array and frees the storage allocated for the menu. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - Invalid menu pointer passed +| E_POSTED - Menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +free_menu(MENU *menu) +{ + T((T_CALLED("free_menu(%p)"), (void *)menu)); + if (!menu) + RETURN(E_BAD_ARGUMENT); + + if (menu->status & _POSTED) + RETURN(E_POSTED); + + if (menu->items) + _nc_Disconnect_Items(menu); + + if ((menu->status & _MARK_ALLOCATED) && menu->mark) + free(menu->mark); + + free(menu); + RETURN(E_OK); +} + +/* m_new.c ends here */ diff --git a/contrib/ncurses/menu/m_opts.c b/contrib/ncurses/menu/m_opts.c new file mode 100644 index 00000000..bbf9459c --- /dev/null +++ b/contrib/ncurses/menu/m_opts.c @@ -0,0 +1,184 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_opts * +* Menus option routines * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_opts.c,v 1.23 2020/12/12 00:38:08 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_opts(MENU *menu, Menu_Options opts) +| +| Description : Set the options for this menu. If the new settings +| end up in a change of the geometry of the menu, it +| will be recalculated. This operation is forbidden if +| the menu is already posted. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu options +| E_POSTED - menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_opts(MENU *menu, Menu_Options opts) +{ + T((T_CALLED("set_menu_opts(%p,%d)"), (void *)menu, opts)); + + opts &= ALL_MENU_OPTS; + + if (opts & ~ALL_MENU_OPTS) + RETURN(E_BAD_ARGUMENT); + + if (menu) + { + if (menu->status & _POSTED) + RETURN(E_POSTED); + + if ((opts & O_ROWMAJOR) != (menu->opt & O_ROWMAJOR)) + { + /* we need this only if the layout really changed ... */ + if (menu->items && menu->items[0]) + { + menu->toprow = 0; + menu->curitem = menu->items[0]; + assert(menu->curitem); + set_menu_format(menu, menu->frows, menu->fcols); + } + } + + menu->opt = opts; + + if (opts & O_ONEVALUE) + { + ITEM **item; + + if (((item = menu->items) != (ITEM **)0)) + for (; *item; item++) + (*item)->value = FALSE; + } + + if (opts & O_SHOWDESC) /* this also changes the geometry */ + _nc_Calculate_Item_Length_and_Width(menu); + } + else + _nc_Default_Menu.opt = opts; + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int menu_opts_off(MENU *menu, Menu_Options opts) +| +| Description : Switch off the options for this menu. If the new settings +| end up in a change of the geometry of the menu, it +| will be recalculated. This operation is forbidden if +| the menu is already posted. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid options +| E_POSTED - menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +menu_opts_off(MENU *menu, Menu_Options opts) +{ + MENU *cmenu = menu; /* use a copy because set_menu_opts must detect + + NULL menu itself to adjust its behavior */ + + T((T_CALLED("menu_opts_off(%p,%d)"), (void *)menu, opts)); + + opts &= ALL_MENU_OPTS; + if (opts & ~ALL_MENU_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Menu(cmenu); + opts = cmenu->opt & ~opts; + returnCode(set_menu_opts(menu, opts)); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int menu_opts_on(MENU *menu, Menu_Options opts) +| +| Description : Switch on the options for this menu. If the new settings +| end up in a change of the geometry of the menu, it +| will be recalculated. This operation is forbidden if +| the menu is already posted. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu options +| E_POSTED - menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +menu_opts_on(MENU *menu, Menu_Options opts) +{ + MENU *cmenu = menu; /* use a copy because set_menu_opts must detect + + NULL menu itself to adjust its behavior */ + + T((T_CALLED("menu_opts_on(%p,%d)"), (void *)menu, opts)); + + opts &= ALL_MENU_OPTS; + if (opts & ~ALL_MENU_OPTS) + RETURN(E_BAD_ARGUMENT); + else + { + Normalize_Menu(cmenu); + opts = cmenu->opt | opts; + returnCode(set_menu_opts(menu, opts)); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : Menu_Options menu_opts(const MENU *menu) +| +| Description : Return the options for this menu. +| +| Return Values : Menu options ++--------------------------------------------------------------------------*/ +MENU_EXPORT(Menu_Options) +menu_opts(const MENU *menu) +{ + T((T_CALLED("menu_opts(%p)"), (const void *)menu)); + returnMenuOpts(ALL_MENU_OPTS & Normalize_Menu(menu)->opt); +} + +/* m_opts.c ends here */ diff --git a/contrib/ncurses/menu/m_pad.c b/contrib/ncurses/menu/m_pad.c new file mode 100644 index 00000000..008e19a7 --- /dev/null +++ b/contrib/ncurses/menu/m_pad.c @@ -0,0 +1,96 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_pad * +* Control menus padding character * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_pad.c,v 1.17 2021/06/17 21:20:30 tom Exp $") + +/* Macro to redraw menu if it is posted and changed */ +#define Refresh_Menu(menu) \ + if ( (menu) && ((menu)->status & _POSTED) )\ + {\ + _nc_Draw_Menu( menu );\ + _nc_Show_Menu( menu ); \ + } + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_pad(MENU* menu, int pad) +| +| Description : Set the character to be used to separate the item name +| from its description. This must be a printable +| character. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - an invalid value has been passed ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_pad(MENU *menu, int pad) +{ + bool do_refresh = (menu != (MENU *)0); + + T((T_CALLED("set_menu_pad(%p,%d)"), (void *)menu, pad)); + + if (!isprint(UChar(pad))) + RETURN(E_BAD_ARGUMENT); + + Normalize_Menu(menu); + menu->pad = (unsigned char)pad; + + if (do_refresh) + Refresh_Menu(menu); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int menu_pad(const MENU *menu) +| +| Description : Return the value of the padding character +| +| Return Values : The pad character ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +menu_pad(const MENU *menu) +{ + T((T_CALLED("menu_pad(%p)"), (const void *)menu)); + returnCode(Normalize_Menu(menu)->pad); +} + +/* m_pad.c ends here */ diff --git a/contrib/ncurses/menu/m_pattern.c b/contrib/ncurses/menu/m_pattern.c new file mode 100644 index 00000000..6fbef236 --- /dev/null +++ b/contrib/ncurses/menu/m_pattern.c @@ -0,0 +1,125 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2006,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_pattern * +* Pattern matching handling * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_pattern.c,v 1.20 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : char *menu_pattern(const MENU *menu) +| +| Description : Return the value of the pattern buffer. +| +| Return Values : NULL - if there is no pattern buffer allocated +| EmptyString - if there is a pattern buffer but no +| pattern is stored +| PatternString - as expected ++--------------------------------------------------------------------------*/ +MENU_EXPORT(char *) +menu_pattern(const MENU *menu) +{ + static char empty[] = ""; + + T((T_CALLED("menu_pattern(%p)"), (const void *)menu)); + returnPtr(menu ? (menu->pattern ? menu->pattern : empty) : 0); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_pattern(MENU *menu, const char *p) +| +| Description : Set the match pattern for a menu and position to the +| first item that matches. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu or pattern pointer +| E_BAD_STATE - menu in user hook routine +| E_NOT_CONNECTED - no items connected to menu +| E_NO_MATCH - no item matches pattern ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_pattern(MENU *menu, const char *p) +{ + ITEM *matchitem; + int matchpos; + + T((T_CALLED("set_menu_pattern(%p,%s)"), (void *)menu, _nc_visbuf(p))); + + if (!menu || !p) + RETURN(E_BAD_ARGUMENT); + + if (!(menu->items)) + RETURN(E_NOT_CONNECTED); + + if (menu->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + Reset_Pattern(menu); + + if (!(*p)) + { + pos_menu_cursor(menu); + RETURN(E_OK); + } + + if (menu->status & _LINK_NEEDED) + _nc_Link_Items(menu); + + matchpos = menu->toprow; + matchitem = menu->curitem; + assert(matchitem); + + while (*p) + { + if (!isprint(UChar(*p)) || + (_nc_Match_Next_Character_In_Item_Name(menu, *p, &matchitem) != E_OK)) + { + Reset_Pattern(menu); + pos_menu_cursor(menu); + RETURN(E_NO_MATCH); + } + p++; + } + + /* This is reached if there was a match. So we position to the new item */ + Adjust_Current_Item(menu, matchpos, matchitem); + RETURN(E_OK); +} + +/* m_pattern.c ends here */ diff --git a/contrib/ncurses/menu/m_post.c b/contrib/ncurses/menu/m_post.c new file mode 100644 index 00000000..1e4ce7cf --- /dev/null +++ b/contrib/ncurses/menu/m_post.c @@ -0,0 +1,384 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_post * +* Write or erase menus from associated subwindows * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_post.c,v 1.41 2024/07/27 18:08:59 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_Post_Item(MENU *menu, ITEM *item) +| +| Description : Draw the item in the menus window at the current +| window position +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_Post_Item(const MENU *menu, const ITEM *item) +{ + int i; + chtype ch; + int item_x, item_y; + int count = 0; + bool isfore = FALSE, isback = FALSE, isgrey = FALSE; + int name_len; + + assert(menu->win); + + getyx(menu->win, item_y, item_x); + + /* We need a marker iff + - it is a onevalued menu and it is the current item + - or it has a selection value + */ + wattr_on(menu->win, menu->back, NULL); + if (item->value || (item == menu->curitem)) + { + if (menu->marklen) + { + /* In a multi selection menu we use the fore attribute + for a selected marker that is not the current one. + This improves visualization of the menu, because now + always the 'normal' marker denotes the current + item. */ + if (!(menu->opt & O_ONEVALUE) && item->value && item != menu->curitem) + { + wattr_on(menu->win, menu->fore, NULL); + isfore = TRUE; + } + waddstr(menu->win, menu->mark); + if (isfore) + { + wattr_on(menu->win, menu->fore, NULL); + isfore = FALSE; + } + } + } + else /* otherwise we have to wipe out the marker area */ + for (ch = ' ', i = menu->marklen; i > 0; i--) + waddch(menu->win, ch); + wattr_off(menu->win, menu->back, NULL); + count += menu->marklen; + + /* First we have to calculate the attribute depending on selectability + and selection status + */ + if (!(item->opt & O_SELECTABLE)) + { + wattr_on(menu->win, menu->grey, NULL); + isgrey = TRUE; + } + else + { + if (item->value || item == menu->curitem) + { + wattr_on(menu->win, menu->fore, NULL); + isfore = TRUE; + } + else + { + wattr_on(menu->win, menu->back, NULL); + isback = TRUE; + } + } + + waddnstr(menu->win, item->name.str, item->name.length); + name_len = _nc_Calculate_Text_Width(&(item->name)); + for (ch = ' ', i = menu->namelen - name_len; i > 0; i--) + { + waddch(menu->win, ch); + } + count += menu->namelen; + + /* Show description if required and available */ + if ((menu->opt & O_SHOWDESC) && menu->desclen > 0) + { + int m = menu->spc_desc / 2; + int cy = -1, cx = -1; + int desc_len; + + for (ch = ' ', i = 0; i < menu->spc_desc; i++) + { + if (i == m) + { + waddch(menu->win, menu->pad); + getyx(menu->win, cy, cx); + } + else + waddch(menu->win, ch); + } + if (item->description.length) + waddnstr(menu->win, item->description.str, item->description.length); + desc_len = _nc_Calculate_Text_Width(&(item->description)); + for (ch = ' ', i = menu->desclen - desc_len; i > 0; i--) + { + waddch(menu->win, ch); + } + count += menu->desclen + menu->spc_desc; + + if (menu->spc_rows > 1) + { + int j, k, ncy, ncx; + + assert(cx >= 0 && cy >= 0); + getyx(menu->win, ncy, ncx); + if (isgrey) + wattr_off(menu->win, menu->grey, NULL); + else if (isfore) + wattr_off(menu->win, menu->fore, NULL); + wattr_on(menu->win, menu->back, NULL); + for (j = 1; j < menu->spc_rows; j++) + { + if ((item_y + j) < getmaxy(menu->win)) + { + wmove(menu->win, item_y + j, item_x); + for (k = 0; k < count; k++) + waddch(menu->win, ' '); + } + if ((cy + j) < getmaxy(menu->win)) + (void)mvwaddch(menu->win, cy + j, cx - 1, menu->pad); + } + wmove(menu->win, ncy, ncx); + if (!isback) + wattr_off(menu->win, menu->back, NULL); + } + } + + /* Remove attributes */ + if (isfore) + wattr_off(menu->win, menu->fore, NULL); + if (isback) + wattr_off(menu->win, menu->back, NULL); + if (isgrey) + wattr_off(menu->win, menu->grey, NULL); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void _nc_Draw_Menu(const MENU *) +| +| Description : Display the menu in its windows +| +| Return Values : - ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void) +_nc_Draw_Menu(const MENU *menu) +{ + ITEM *item = menu->items[0]; + const ITEM *lastvert; + ITEM *hitem; + chtype s_bkgd; + + assert(item && menu->win); + + s_bkgd = getbkgd(menu->win); + wbkgdset(menu->win, menu->back); + werase(menu->win); + wbkgdset(menu->win, s_bkgd); + + lastvert = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : item; + + if (item != NULL) + { + int y = 0; + + do + { + const ITEM *lasthor; + + wmove(menu->win, y, 0); + + hitem = item; + lasthor = (menu->opt & O_NONCYCLIC) ? (ITEM *)0 : hitem; + + do + { + _nc_Post_Item(menu, hitem); + + wattr_on(menu->win, menu->back, NULL); + if (((hitem = hitem->right) != lasthor) && hitem) + { + int i, j, cy, cx; + chtype ch = ' '; + + getyx(menu->win, cy, cx); + for (j = 0; j < menu->spc_rows; j++) + { + wmove(menu->win, cy + j, cx); + for (i = 0; i < menu->spc_cols; i++) + { + waddch(menu->win, ch); + } + } + wmove(menu->win, cy, cx + menu->spc_cols); + } + } + while (hitem && (hitem != lasthor)); + wattr_off(menu->win, menu->back, NULL); + + item = item->down; + y += menu->spc_rows; + + } + while (item && (item != lastvert)); + } +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int post_menu(MENU* menu) +| +| Description : Post a menu to the screen. This makes it visible. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - not a valid menu pointer +| E_SYSTEM_ERROR - error in lower layers +| E_NOT_CONNECTED - No items connected to menu +| E_BAD_STATE - Menu in userexit routine +| E_POSTED - Menu already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +post_menu(MENU *menu) +{ + T((T_CALLED("post_menu(%p)"), (void *)menu)); + + if (!menu) + RETURN(E_BAD_ARGUMENT); + + if (menu->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + if (menu->status & _POSTED) + RETURN(E_POSTED); + + if (menu->items && *(menu->items)) + { + int h = 1 + menu->spc_rows * (menu->rows - 1); + + const WINDOW *win = Get_Menu_Window(menu); + int maxy = getmaxy(win); + + if ((menu->win = newpad(h, menu->width))) + { + int y = (maxy >= h) ? h : maxy; + + if (y >= menu->height) + y = menu->height; + if (!(menu->sub = subpad(menu->win, y, menu->width, 0, 0))) + RETURN(E_SYSTEM_ERROR); + } + else + RETURN(E_SYSTEM_ERROR); + + if (menu->status & _LINK_NEEDED) + _nc_Link_Items(menu); + } + else + RETURN(E_NOT_CONNECTED); + + SetStatus(menu, _POSTED); + + if (!(menu->opt & O_ONEVALUE)) + { + ITEM **items; + + for (items = menu->items; *items; items++) + { + (*items)->value = FALSE; + } + } + + _nc_Draw_Menu(menu); + + Call_Hook(menu, menuinit); + Call_Hook(menu, iteminit); + + _nc_Show_Menu(menu); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int unpost_menu(MENU*) +| +| Description : Detach menu from screen +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - not a valid menu pointer +| E_BAD_STATE - menu in userexit routine +| E_NOT_POSTED - menu is not posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +unpost_menu(MENU *menu) +{ + WINDOW *win; + + T((T_CALLED("unpost_menu(%p)"), (void *)menu)); + + if (!menu) + RETURN(E_BAD_ARGUMENT); + + if (menu->status & _IN_DRIVER) + RETURN(E_BAD_STATE); + + if (!(menu->status & _POSTED)) + RETURN(E_NOT_POSTED); + + Call_Hook(menu, itemterm); + Call_Hook(menu, menuterm); + + win = Get_Menu_Window(menu); + werase(win); + wsyncup(win); + + assert(menu->sub); + delwin(menu->sub); + menu->sub = (WINDOW *)0; + + assert(menu->win); + delwin(menu->win); + menu->win = (WINDOW *)0; + + ClrStatus(menu, _POSTED); + + RETURN(E_OK); +} + +/* m_post.c ends here */ diff --git a/contrib/ncurses/menu/m_req_name.c b/contrib/ncurses/menu/m_req_name.c new file mode 100644 index 00000000..c72116fa --- /dev/null +++ b/contrib/ncurses/menu/m_req_name.c @@ -0,0 +1,132 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_request_name * +* Routines to handle external names of menu requests * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_req_name.c,v 1.27 2021/06/17 21:11:08 tom Exp $") + +#define DATA(s) { s } + +static const char request_names[MAX_MENU_COMMAND - MIN_MENU_COMMAND + 1][14] = +{ + DATA("LEFT_ITEM"), + DATA("RIGHT_ITEM"), + DATA("UP_ITEM"), + DATA("DOWN_ITEM"), + DATA("SCR_ULINE"), + DATA("SCR_DLINE"), + DATA("SCR_DPAGE"), + DATA("SCR_UPAGE"), + DATA("FIRST_ITEM"), + DATA("LAST_ITEM"), + DATA("NEXT_ITEM"), + DATA("PREV_ITEM"), + DATA("TOGGLE_ITEM"), + DATA("CLEAR_PATTERN"), + DATA("BACK_PATTERN"), + DATA("NEXT_MATCH"), + DATA("PREV_MATCH") +}; + +#define A_SIZE (sizeof(request_names)/sizeof(request_names[0])) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : const char * menu_request_name (int request); +| +| Description : Get the external name of a menu request. +| +| Return Values : Pointer to name - on success +| NULL - on invalid request code ++--------------------------------------------------------------------------*/ +MENU_EXPORT(const char *) +menu_request_name(int request) +{ + T((T_CALLED("menu_request_name(%d)"), request)); + if ((request < MIN_MENU_COMMAND) || (request > MAX_MENU_COMMAND)) + { + SET_ERROR(E_BAD_ARGUMENT); + returnCPtr((const char *)0); + } + else + returnCPtr(request_names[request - MIN_MENU_COMMAND]); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int menu_request_by_name (const char *str); +| +| Description : Search for a request with this name. +| +| Return Values : Request Id - on success +| E_NO_MATCH - request not found ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +menu_request_by_name(const char *str) +{ + /* because the table is so small, it doesn't really hurt + to run sequentially through it. + */ + size_t i = 0; + + T((T_CALLED("menu_request_by_name(%s)"), _nc_visbuf(str))); + + if (str != 0 && (i = strlen(str)) != 0) + { + char buf[16]; + + if (i > sizeof(buf) - 2) + i = sizeof(buf) - 2; + memcpy(buf, str, i); + buf[i] = '\0'; + + for (i = 0; buf[i] != '\0'; ++i) + { + buf[i] = (char)toupper(UChar(buf[i])); + } + + for (i = 0; i < A_SIZE; i++) + { + if (strcmp(request_names[i], buf) == 0) + returnCode(MIN_MENU_COMMAND + (int)i); + } + } + RETURN(E_NO_MATCH); +} + +/* m_req_name.c ends here */ diff --git a/contrib/ncurses/menu/m_scale.c b/contrib/ncurses/menu/m_scale.c new file mode 100644 index 00000000..9e7f81d5 --- /dev/null +++ b/contrib/ncurses/menu/m_scale.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_scale * +* Menu scaling routine * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_scale.c,v 1.14 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int scale_menu(const MENU *menu) +| +| Description : Returns the minimum window size necessary for the +| subwindow of menu. +| +| Return Values : E_OK - success +| E_BAD_ARGUMENT - invalid menu pointer +| E_NOT_CONNECTED - no items are connected to menu ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +scale_menu(const MENU *menu, int *rows, int *cols) +{ + T((T_CALLED("scale_menu(%p,%p,%p)"), + (const void *)menu, + (void *)rows, + (void *)cols)); + + if (!menu) + RETURN(E_BAD_ARGUMENT); + + if (menu->items && *(menu->items)) + { + if (rows) + *rows = menu->height; + if (cols) + *cols = menu->width; + RETURN(E_OK); + } + else + RETURN(E_NOT_CONNECTED); +} + +/* m_scale.c ends here */ diff --git a/contrib/ncurses/menu/m_spacing.c b/contrib/ncurses/menu/m_spacing.c new file mode 100644 index 00000000..76f8d5ca --- /dev/null +++ b/contrib/ncurses/menu/m_spacing.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_spacing * +* Routines to handle spacing between entries * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_spacing.c,v 1.22 2020/12/12 00:38:14 tom Exp $") + +#define MAX_SPC_DESC ((TABSIZE) ? (TABSIZE) : 8) +#define MAX_SPC_COLS ((TABSIZE) ? (TABSIZE) : 8) +#define MAX_SPC_ROWS (3) + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_spacing(MENU *menu,int desc, int r, int c); +| +| Description : Set the spacing between entries +| +| Return Values : E_OK - on success ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_spacing(MENU *menu, int s_desc, int s_row, int s_col) +{ + MENU *m; /* split for ATAC workaround */ + + T((T_CALLED("set_menu_spacing(%p,%d,%d,%d)"), + (void *)menu, s_desc, s_row, s_col)); + + m = Normalize_Menu(menu); + + assert(m); + if (m->status & _POSTED) + RETURN(E_POSTED); + + if (((s_desc < 0) || (s_desc > MAX_SPC_DESC)) || + ((s_row < 0) || (s_row > MAX_SPC_ROWS)) || + ((s_col < 0) || (s_col > MAX_SPC_COLS))) + RETURN(E_BAD_ARGUMENT); + + m->spc_desc = (short)(s_desc ? s_desc : 1); + m->spc_rows = (short)(s_row ? s_row : 1); + m->spc_cols = (short)(s_col ? s_col : 1); + _nc_Calculate_Item_Length_and_Width(m); + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int menu_spacing (const MENU *,int *,int *,int *); +| +| Description : Retrieve info about spacing between the entries +| +| Return Values : E_OK - on success ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +menu_spacing(const MENU *menu, int *s_desc, int *s_row, int *s_col) +{ + const MENU *m; /* split for ATAC workaround */ + + T((T_CALLED("menu_spacing(%p,%p,%p,%p)"), + (const void *)menu, + (void *)s_desc, + (void *)s_row, + (void *)s_col)); + + m = Normalize_Menu(menu); + + assert(m); + if (s_desc) + *s_desc = m->spc_desc; + if (s_row) + *s_row = m->spc_rows; + if (s_col) + *s_col = m->spc_cols; + + RETURN(E_OK); +} + +/* m_spacing.c ends here */ diff --git a/contrib/ncurses/menu/m_sub.c b/contrib/ncurses/menu/m_sub.c new file mode 100644 index 00000000..a055245b --- /dev/null +++ b/contrib/ncurses/menu/m_sub.c @@ -0,0 +1,101 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_sub * +* Menus subwindow association routines * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_sub.c,v 1.16 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_sub(MENU *menu, WINDOW *win) +| +| Description : Sets the subwindow of the menu. +| +| Return Values : E_OK - success +| E_POSTED - menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_sub(MENU *menu, WINDOW *win) +{ + T((T_CALLED("set_menu_sub(%p,%p)"), (void *)menu, (void *)win)); + + if (menu) + { + if (menu->status & _POSTED) + RETURN(E_POSTED); + else +#if NCURSES_SP_FUNCS + { + /* We ensure that usersub is never null. So even if a null + WINDOW parameter is passed, we store the SCREENS stdscr. + The only MENU that can have a null usersub is the static + _nc_default_Menu. + */ + SCREEN *sp = _nc_screen_of(menu->usersub); + + menu->usersub = win ? win : sp->_stdscr; + _nc_Calculate_Item_Length_and_Width(menu); + } +#else + menu->usersub = win; +#endif + } + else + _nc_Default_Menu.usersub = win; + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : WINDOW* menu_sub(const MENU *menu) +| +| Description : Returns a pointer to the subwindow of the menu +| +| Return Values : NULL on error, otherwise a pointer to the window ++--------------------------------------------------------------------------*/ +MENU_EXPORT(WINDOW *) +menu_sub(const MENU *menu) +{ + const MENU *m = Normalize_Menu(menu); + + T((T_CALLED("menu_sub(%p)"), (const void *)menu)); + returnWin(Get_Menu_Window(m)); +} + +/* m_sub.c ends here */ diff --git a/contrib/ncurses/menu/m_trace.c b/contrib/ncurses/menu/m_trace.c new file mode 100644 index 00000000..331236c5 --- /dev/null +++ b/contrib/ncurses/menu/m_trace.c @@ -0,0 +1,79 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2004-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_trace.c,v 1.9 2020/12/12 00:38:14 tom Exp $") + +MENU_EXPORT(ITEM *) +_nc_retrace_item(ITEM *code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +MENU_EXPORT(ITEM **) +_nc_retrace_item_ptr(ITEM **code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +MENU_EXPORT(Item_Options) +_nc_retrace_item_opts(Item_Options code) +{ + T((T_RETURN("%d"), code)); + return code; +} + +MENU_EXPORT(MENU *) +_nc_retrace_menu(MENU *code) +{ + T((T_RETURN("%p"), (void *)code)); + return code; +} + +MENU_EXPORT(Menu_Hook) +_nc_retrace_menu_hook(Menu_Hook code) +{ + TR_FUNC_BFR(1); + T((T_RETURN("%s"), TR_FUNC_ARG(0, code))); + return code; +} + +MENU_EXPORT(Menu_Options) +_nc_retrace_menu_opts(Menu_Options code) +{ + T((T_RETURN("%d"), code)); + return code; +} diff --git a/contrib/ncurses/menu/m_userptr.c b/contrib/ncurses/menu/m_userptr.c new file mode 100644 index 00000000..72f2d4ca --- /dev/null +++ b/contrib/ncurses/menu/m_userptr.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2004,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_userptr * +* Associate application data with menus * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_userptr.c,v 1.21 2020/12/12 00:38:14 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_userptr(MENU *menu, void *userptr) +| +| Description : Set the pointer that is reserved in any menu to store +| application relevant information. +| +| Return Values : E_OK - success ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_userptr(MENU *menu, void *userptr) +{ + T((T_CALLED("set_menu_userptr(%p,%p)"), (void *)menu, (void *)userptr)); + Normalize_Menu(menu)->userptr = userptr; + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : void *menu_userptr(const MENU *menu) +| +| Description : Return the pointer that is reserved in any menu to +| store application relevant information. +| +| Return Values : Value of the pointer. If no such pointer has been set, +| NULL is returned ++--------------------------------------------------------------------------*/ +MENU_EXPORT(void *) +menu_userptr(const MENU *menu) +{ + T((T_CALLED("menu_userptr(%p)"), (const void *)menu)); + returnVoidPtr(Normalize_Menu(menu)->userptr); +} + +/* m_userptr.c ends here */ diff --git a/contrib/ncurses/menu/m_win.c b/contrib/ncurses/menu/m_win.c new file mode 100644 index 00000000..4bb64e6a --- /dev/null +++ b/contrib/ncurses/menu/m_win.c @@ -0,0 +1,101 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/*************************************************************************** +* Module m_win * +* Menus window association routines * +***************************************************************************/ + +#include "menu.priv.h" + +MODULE_ID("$Id: m_win.c,v 1.21 2021/06/17 21:20:30 tom Exp $") + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : int set_menu_win(MENU *menu, WINDOW *win) +| +| Description : Sets the window of the menu. +| +| Return Values : E_OK - success +| E_POSTED - menu is already posted ++--------------------------------------------------------------------------*/ +MENU_EXPORT(int) +set_menu_win(MENU *menu, WINDOW *win) +{ + T((T_CALLED("set_menu_win(%p,%p)"), (void *)menu, (void *)win)); + + if (menu) + { + if (menu->status & _POSTED) + RETURN(E_POSTED); + else +#if NCURSES_SP_FUNCS + { + /* We ensure that userwin is never null. So even if a null + WINDOW parameter is passed, we store the SCREENS stdscr. + The only MENU that can have a null userwin is the static + _nc_default_Menu. + */ + SCREEN *sp = _nc_screen_of(menu->userwin); + + menu->userwin = win ? win : sp->_stdscr; + _nc_Calculate_Item_Length_and_Width(menu); + } +#else + menu->userwin = win; +#endif + } + else + _nc_Default_Menu.userwin = win; + + RETURN(E_OK); +} + +/*--------------------------------------------------------------------------- +| Facility : libnmenu +| Function : WINDOW* menu_win(const MENU*) +| +| Description : Returns pointer to the window of the menu +| +| Return Values : NULL on error, otherwise pointer to window ++--------------------------------------------------------------------------*/ +MENU_EXPORT(WINDOW *) +menu_win(const MENU *menu) +{ + const MENU *m = Normalize_Menu(menu); + + T((T_CALLED("menu_win(%p)"), (const void *)menu)); + returnWin(Get_Menu_UserWin(m)); +} + +/* m_win.c ends here */ diff --git a/contrib/ncurses/menu/menu.h b/contrib/ncurses/menu/menu.h new file mode 100644 index 00000000..e5a53729 --- /dev/null +++ b/contrib/ncurses/menu/menu.h @@ -0,0 +1,281 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/* $Id: menu.h,v 1.26 2020/12/12 00:38:02 tom Exp $ */ + +#ifndef ETI_MENU +#define ETI_MENU + +#ifdef AMIGA +#define TEXT TEXT_ncurses +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(BUILDING_MENU) +# define MENU_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT +#else +# define MENU_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT +#endif + +#define MENU_WRAPPED_VAR(type,name) extern MENU_IMPEXP type NCURSES_PUBLIC_VAR(name)(void) + +#define MENU_EXPORT(type) MENU_IMPEXP type NCURSES_API +#define MENU_EXPORT_VAR(type) MENU_IMPEXP type + + typedef int Menu_Options; + typedef int Item_Options; + +/* Menu options: */ +#define O_ONEVALUE (0x01) +#define O_SHOWDESC (0x02) +#define O_ROWMAJOR (0x04) +#define O_IGNORECASE (0x08) +#define O_SHOWMATCH (0x10) +#define O_NONCYCLIC (0x20) +#define O_MOUSE_MENU (0x40) + +/* Item options: */ +#define O_SELECTABLE (0x01) + +#if !NCURSES_OPAQUE_MENU + typedef struct + { + const char *str; + unsigned short length; + } + TEXT; +#endif /* !NCURSES_OPAQUE_MENU */ + + struct tagMENU; + + typedef struct tagITEM +#if !NCURSES_OPAQUE_MENU + { + TEXT name; /* name of menu item */ + TEXT description; /* description of item, optional in display */ + struct tagMENU *imenu; /* Pointer to parent menu */ + void *userptr; /* Pointer to user defined per item data */ + Item_Options opt; /* Item options */ + short index; /* Item number if connected to a menu */ + short y; /* y and x location of item in menu */ + short x; + bool value; /* Selection value */ + + struct tagITEM *left; /* neighbor items */ + struct tagITEM *right; + struct tagITEM *up; + struct tagITEM *down; + + } +#endif /* !NCURSES_OPAQUE_MENU */ + ITEM; + + typedef void (*Menu_Hook) (struct tagMENU *); + + typedef struct tagMENU +#if 1 /* not yet: !NCURSES_OPAQUE_MENU */ + { + short height; /* Nr. of chars high */ + short width; /* Nr. of chars wide */ + short rows; /* Nr. of items high */ + short cols; /* Nr. of items wide */ + short frows; /* Nr. of formatted items high */ + short fcols; /* Nr. of formatted items wide */ + short arows; /* Nr. of items high (actual) */ + short namelen; /* Max. name length */ + short desclen; /* Max. description length */ + short marklen; /* Length of mark, if any */ + short itemlen; /* Length of one item */ + short spc_desc; /* Spacing for descriptor */ + short spc_cols; /* Spacing for columns */ + short spc_rows; /* Spacing for rows */ + char *pattern; /* Buffer to store match chars */ + short pindex; /* Index into pattern buffer */ + WINDOW *win; /* Window containing menu */ + WINDOW *sub; /* Subwindow for menu display */ + WINDOW *userwin; /* User's window */ + WINDOW *usersub; /* User's subwindow */ + ITEM **items; /* array of items */ + short nitems; /* Nr. of items in menu */ + ITEM *curitem; /* Current item */ + short toprow; /* Top row of menu */ + chtype fore; /* Selection attribute */ + chtype back; /* Nonselection attribute */ + chtype grey; /* Inactive attribute */ + unsigned char pad; /* Pad character */ + + Menu_Hook menuinit; /* User hooks */ + Menu_Hook menuterm; + Menu_Hook iteminit; + Menu_Hook itemterm; + + void *userptr; /* Pointer to menus user data */ + char *mark; /* Pointer to marker string */ + + Menu_Options opt; /* Menu options */ + unsigned short status; /* Internal state of menu */ + } +#endif /* !NCURSES_OPAQUE_MENU */ + MENU; + +/* Define keys */ + +#define REQ_LEFT_ITEM (KEY_MAX + 1) +#define REQ_RIGHT_ITEM (KEY_MAX + 2) +#define REQ_UP_ITEM (KEY_MAX + 3) +#define REQ_DOWN_ITEM (KEY_MAX + 4) +#define REQ_SCR_ULINE (KEY_MAX + 5) +#define REQ_SCR_DLINE (KEY_MAX + 6) +#define REQ_SCR_DPAGE (KEY_MAX + 7) +#define REQ_SCR_UPAGE (KEY_MAX + 8) +#define REQ_FIRST_ITEM (KEY_MAX + 9) +#define REQ_LAST_ITEM (KEY_MAX + 10) +#define REQ_NEXT_ITEM (KEY_MAX + 11) +#define REQ_PREV_ITEM (KEY_MAX + 12) +#define REQ_TOGGLE_ITEM (KEY_MAX + 13) +#define REQ_CLEAR_PATTERN (KEY_MAX + 14) +#define REQ_BACK_PATTERN (KEY_MAX + 15) +#define REQ_NEXT_MATCH (KEY_MAX + 16) +#define REQ_PREV_MATCH (KEY_MAX + 17) + +#define MIN_MENU_COMMAND (KEY_MAX + 1) +#define MAX_MENU_COMMAND (KEY_MAX + 17) + +/* + * Some AT&T code expects MAX_COMMAND to be out-of-band not + * just for menu commands but for forms ones as well. + */ +#if defined(MAX_COMMAND) +# if (MAX_MENU_COMMAND > MAX_COMMAND) +# error Something is wrong -- MAX_MENU_COMMAND is greater than MAX_COMMAND +# elif (MAX_COMMAND != (KEY_MAX + 128)) +# error Something is wrong -- MAX_COMMAND is already inconsistently defined. +# endif +#else +# define MAX_COMMAND (KEY_MAX + 128) +#endif + +/* --------- prototypes for libmenu functions ----------------------------- */ + + extern MENU_EXPORT(ITEM **) menu_items(const MENU *); + extern MENU_EXPORT(ITEM *) current_item(const MENU *); + extern MENU_EXPORT(ITEM *) new_item(const char *, const char *); + + extern MENU_EXPORT(MENU *) new_menu(ITEM **); + + extern MENU_EXPORT(Item_Options) item_opts(const ITEM *); + extern MENU_EXPORT(Menu_Options) menu_opts(const MENU *); + + extern MENU_EXPORT(Menu_Hook) item_init(const MENU *); + extern MENU_EXPORT(Menu_Hook) item_term(const MENU *); + extern MENU_EXPORT(Menu_Hook) menu_init(const MENU *); + extern MENU_EXPORT(Menu_Hook) menu_term(const MENU *); + + extern MENU_EXPORT(WINDOW *) menu_sub(const MENU *); + extern MENU_EXPORT(WINDOW *) menu_win(const MENU *); + + extern MENU_EXPORT(const char *) item_description(const ITEM *); + extern MENU_EXPORT(const char *) item_name(const ITEM *); + extern MENU_EXPORT(const char *) menu_mark(const MENU *); + extern MENU_EXPORT(const char *) menu_request_name(int); + + extern MENU_EXPORT(char *) menu_pattern(const MENU *); + + extern MENU_EXPORT(void *) menu_userptr(const MENU *); + extern MENU_EXPORT(void *) item_userptr(const ITEM *); + + extern MENU_EXPORT(chtype) menu_back(const MENU *); + extern MENU_EXPORT(chtype) menu_fore(const MENU *); + extern MENU_EXPORT(chtype) menu_grey(const MENU *); + + extern MENU_EXPORT(int) free_item(ITEM *); + extern MENU_EXPORT(int) free_menu(MENU *); + extern MENU_EXPORT(int) item_count(const MENU *); + extern MENU_EXPORT(int) item_index(const ITEM *); + extern MENU_EXPORT(int) item_opts_off(ITEM *, Item_Options); + extern MENU_EXPORT(int) item_opts_on(ITEM *, Item_Options); + extern MENU_EXPORT(int) menu_driver(MENU *, int); + extern MENU_EXPORT(int) menu_opts_off(MENU *, Menu_Options); + extern MENU_EXPORT(int) menu_opts_on(MENU *, Menu_Options); + extern MENU_EXPORT(int) menu_pad(const MENU *); + extern MENU_EXPORT(int) pos_menu_cursor(const MENU *); + extern MENU_EXPORT(int) post_menu(MENU *); + extern MENU_EXPORT(int) scale_menu(const MENU *, int *, int *); + extern MENU_EXPORT(int) set_current_item(MENU *menu, ITEM *item); + extern MENU_EXPORT(int) set_item_init(MENU *, Menu_Hook); + extern MENU_EXPORT(int) set_item_opts(ITEM *, Item_Options); + extern MENU_EXPORT(int) set_item_term(MENU *, Menu_Hook); + extern MENU_EXPORT(int) set_item_userptr(ITEM *, void *); + extern MENU_EXPORT(int) set_item_value(ITEM *, bool); + extern MENU_EXPORT(int) set_menu_back(MENU *, chtype); + extern MENU_EXPORT(int) set_menu_fore(MENU *, chtype); + extern MENU_EXPORT(int) set_menu_format(MENU *, int, int); + extern MENU_EXPORT(int) set_menu_grey(MENU *, chtype); + extern MENU_EXPORT(int) set_menu_init(MENU *, Menu_Hook); + extern MENU_EXPORT(int) set_menu_items(MENU *, ITEM **); + extern MENU_EXPORT(int) set_menu_mark(MENU *, const char *); + extern MENU_EXPORT(int) set_menu_opts(MENU *, Menu_Options); + extern MENU_EXPORT(int) set_menu_pad(MENU *, int); + extern MENU_EXPORT(int) set_menu_pattern(MENU *, const char *); + extern MENU_EXPORT(int) set_menu_sub(MENU *, WINDOW *); + extern MENU_EXPORT(int) set_menu_term(MENU *, Menu_Hook); + extern MENU_EXPORT(int) set_menu_userptr(MENU *, void *); + extern MENU_EXPORT(int) set_menu_win(MENU *, WINDOW *); + extern MENU_EXPORT(int) set_top_row(MENU *, int); + extern MENU_EXPORT(int) top_row(const MENU *); + extern MENU_EXPORT(int) unpost_menu(MENU *); + extern MENU_EXPORT(int) menu_request_by_name(const char *); + extern MENU_EXPORT(int) set_menu_spacing(MENU *, int, int, int); + extern MENU_EXPORT(int) menu_spacing(const MENU *, int *, int *, int *); + + extern MENU_EXPORT(bool) item_value(const ITEM *); + extern MENU_EXPORT(bool) item_visible(const ITEM *); + + extern MENU_EXPORT(void) menu_format(const MENU *, int *, int *); + +#if NCURSES_SP_FUNCS + extern MENU_EXPORT(MENU *) NCURSES_SP_NAME(new_menu) (SCREEN *, ITEM **); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ETI_MENU */ diff --git a/contrib/ncurses/menu/menu.priv.h b/contrib/ncurses/menu/menu.priv.h new file mode 100644 index 00000000..e464a7c9 --- /dev/null +++ b/contrib/ncurses/menu/menu.priv.h @@ -0,0 +1,161 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/* $Id: menu.priv.h,v 1.30 2024/08/03 15:41:22 tom Exp $ */ + +/*************************************************************************** +* Module menu.priv.h * +* Top level private header file for all libnmenu modules * +***************************************************************************/ + +#ifndef MENU_PRIV_H_incl +#define MENU_PRIV_H_incl 1 +/* *INDENT-OFF* */ + +#include "curses.priv.h" + +#define NCURSES_OPAQUE_MENU 0 + +#include "mf_common.h" +#include "menu.h" + +/* Backspace code */ +#define BS (8) + +extern MENU_EXPORT_VAR(ITEM) _nc_Default_Item; +extern MENU_EXPORT_VAR(MENU) _nc_Default_Menu; + +/* Normalize item to default if none was given */ +#define Normalize_Item( item ) ((item)=(item)?(item):&_nc_Default_Item) + +/* Normalize menu to default if none was given */ +#define Normalize_Menu( menu ) ((menu)=(menu)?(menu):&_nc_Default_Menu) + +/* Get the user defined (framing) window of the menu */ +#define Get_Menu_UserWin(menu) ((menu)->userwin ? \ + (menu)->userwin : CURRENT_SCREEN->_stdscr) + +/* Normalize menu window */ +#define Get_Menu_Window( menu ) \ + ((menu)->usersub ? (menu)->usersub : Get_Menu_UserWin(menu)) + +/* menu specific status flags */ +#define _LINK_NEEDED (0x04) +#define _MARK_ALLOCATED (0x08) + +#define ALL_MENU_OPTS ( \ + O_ONEVALUE | \ + O_SHOWDESC | \ + O_ROWMAJOR | \ + O_IGNORECASE | \ + O_SHOWMATCH | \ + O_NONCYCLIC | \ + O_MOUSE_MENU ) + +#define ALL_ITEM_OPTS (O_SELECTABLE) + +/* Move to the window position of an item and draw it */ +#define Move_And_Post_Item(menu,item) \ + {wmove((menu)->win,(menu)->spc_rows*(item)->y,((menu)->itemlen+(menu)->spc_cols)*(item)->x);\ + _nc_Post_Item((menu),(item));} + +#define Move_To_Current_Item(menu,item) \ + if ( (item) != (menu)->curitem)\ + {\ + Move_And_Post_Item(menu,item);\ + Move_And_Post_Item(menu,(menu)->curitem);\ + } + +/* This macro ensures, that the item becomes visible, if possible with the + specified row as the top row of the window. If this is not possible, + the top row will be adjusted and the value is stored in the row argument. +*/ +#define Adjust_Current_Item(menu,row,item) \ + { if ((item)->y < row) \ + row = (short) (item)->y; \ + if ( (item)->y >= (row + (menu)->arows) ) \ + row = (short) (( (item)->y < ((menu)->rows - row) ) \ + ? (item)->y \ + : (menu)->rows - (menu)->arows); \ + _nc_New_TopRow_and_CurrentItem(menu,row,item); } + +/* Reset the match pattern buffer */ +#define Reset_Pattern(menu) \ + { (menu)->pindex = 0; \ + (menu)->pattern[0] = '\0'; } + +#define UChar(c) ((unsigned char)(c)) + +/* Internal functions. */ +extern MENU_EXPORT(void) _nc_Draw_Menu (const MENU *); +extern MENU_EXPORT(void) _nc_Show_Menu (const MENU *); +extern MENU_EXPORT(void) _nc_Calculate_Item_Length_and_Width (MENU *); +extern MENU_EXPORT(int) _nc_Calculate_Text_Width(const TEXT *); +extern MENU_EXPORT(void) _nc_Post_Item (const MENU *, const ITEM *); +extern MENU_EXPORT(bool) _nc_Connect_Items (MENU *, ITEM **); +extern MENU_EXPORT(void) _nc_Disconnect_Items (MENU *); +extern MENU_EXPORT(void) _nc_New_TopRow_and_CurrentItem (MENU *,int, ITEM *); +extern MENU_EXPORT(void) _nc_Link_Items (MENU *); +extern MENU_EXPORT(int) _nc_Match_Next_Character_In_Item_Name (MENU*,int,ITEM**); +extern MENU_EXPORT(int) _nc_menu_cursor_pos (const MENU* menu, const ITEM* item, + int* pY, int* pX); + +#ifdef TRACE + +#define returnItem(code) TRACE_RETURN1(code,item) +#define returnItemPtr(code) TRACE_RETURN1(code,item_ptr) +#define returnItemOpts(code) TRACE_RETURN1(code,item_opts) +#define returnMenu(code) TRACE_RETURN1(code,menu) +#define returnMenuHook(code) TRACE_RETURN1(code,menu_hook) +#define returnMenuOpts(code) TRACE_RETURN1(code,menu_opts) + +extern MENU_EXPORT(ITEM *) _nc_retrace_item (ITEM *); +extern MENU_EXPORT(ITEM **) _nc_retrace_item_ptr (ITEM **); +extern MENU_EXPORT(Item_Options) _nc_retrace_item_opts (Item_Options); +extern MENU_EXPORT(MENU *) _nc_retrace_menu (MENU *); +extern MENU_EXPORT(Menu_Hook) _nc_retrace_menu_hook (Menu_Hook); +extern MENU_EXPORT(Menu_Options) _nc_retrace_menu_opts (Menu_Options); + +#else /* !TRACE */ + +#define returnItem(code) return code +#define returnItemPtr(code) return code +#define returnItemOpts(code) return code +#define returnMenu(code) return code +#define returnMenuHook(code) return code +#define returnMenuOpts(code) return code + +#endif /* TRACE/!TRACE */ +/* *INDENT-ON* */ + +#endif /* MENU_PRIV_H_incl */ diff --git a/contrib/ncurses/menu/mf_common.h b/contrib/ncurses/menu/mf_common.h new file mode 100644 index 00000000..fcbd565c --- /dev/null +++ b/contrib/ncurses/menu/mf_common.h @@ -0,0 +1,98 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2005,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1995,1997 * + ****************************************************************************/ + +/* $Id: mf_common.h,v 0.25 2020/02/02 23:34:34 tom Exp $ */ + +/* Common internal header for menu and form library */ + +#ifndef MF_COMMON_H_incl +#define MF_COMMON_H_incl 1 + +#include +#include + +#include +#include +#include +#include +#include +#include + +#if DECL_ERRNO +extern int errno; +#endif + +/* in case of debug version we ignore the suppression of assertions */ +#ifdef TRACE +# ifdef NDEBUG +# undef NDEBUG +# endif +#endif + +#include + +#if USE_RCS_IDS +#define MODULE_ID(id) static const char Ident[] = id; +#else +#define MODULE_ID(id) /*nothing */ +#endif + +/* Maximum regular 8-bit character code */ +#define MAX_REGULAR_CHARACTER (0xff) + +#define SET_ERROR(code) (errno=(code)) +#define GET_ERROR() (errno) + +#ifdef TRACE +#define RETURN(code) returnCode( SET_ERROR(code) ) +#else +#define RETURN(code) return( SET_ERROR(code) ) +#endif + +/* The few common values in the status fields for menus and forms */ +#define _POSTED (0x01U) /* menu or form is posted */ +#define _IN_DRIVER (0x02U) /* menu or form is processing hook routine */ + +#define SetStatus(target,mask) (target)->status |= (unsigned short) (mask) +#define ClrStatus(target,mask) (target)->status = (unsigned short) (target->status & (~mask)) + +/* Call object hook */ +#define Call_Hook( object, handler ) \ + if ( (object) != 0 && ((object)->handler) != (void *) 0 )\ + {\ + SetStatus(object, _IN_DRIVER);\ + (object)->handler(object);\ + ClrStatus(object, _IN_DRIVER);\ + } + +#endif /* MF_COMMON_H_incl */ diff --git a/contrib/ncurses/menu/modules b/contrib/ncurses/menu/modules new file mode 100644 index 00000000..80ffb356 --- /dev/null +++ b/contrib/ncurses/menu/modules @@ -0,0 +1,64 @@ +# $Id: modules,v 1.19 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998-2006,2010 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# + +@ base +# Library objects +m_attribs lib $(srcdir) $(HEADER_DEPS) +m_cursor lib $(srcdir) $(HEADER_DEPS) +m_driver lib $(srcdir) $(HEADER_DEPS) +m_format lib $(srcdir) $(HEADER_DEPS) +m_global lib $(srcdir) $(HEADER_DEPS) +m_hook lib $(srcdir) $(HEADER_DEPS) +m_item_cur lib $(srcdir) $(HEADER_DEPS) +m_item_nam lib $(srcdir) $(HEADER_DEPS) +m_item_new lib $(srcdir) $(HEADER_DEPS) +m_item_opt lib $(srcdir) $(HEADER_DEPS) +m_item_top lib $(srcdir) $(HEADER_DEPS) +m_item_use lib $(srcdir) $(HEADER_DEPS) +m_item_val lib $(srcdir) $(HEADER_DEPS) +m_item_vis lib $(srcdir) $(HEADER_DEPS) +m_items lib $(srcdir) $(HEADER_DEPS) +m_new lib $(srcdir) $(HEADER_DEPS) +m_opts lib $(srcdir) $(HEADER_DEPS) +m_pad lib $(srcdir) $(HEADER_DEPS) +m_pattern lib $(srcdir) $(HEADER_DEPS) +m_post lib $(srcdir) $(HEADER_DEPS) +m_req_name lib $(srcdir) $(HEADER_DEPS) +m_scale lib $(srcdir) $(HEADER_DEPS) +m_spacing lib $(srcdir) $(HEADER_DEPS) +m_sub lib $(srcdir) $(HEADER_DEPS) +m_trace lib $(srcdir) $(HEADER_DEPS) +m_userptr lib $(srcdir) $(HEADER_DEPS) +m_win lib $(srcdir) $(HEADER_DEPS) + +# vile:makemode diff --git a/contrib/ncurses/misc/Makefile.in b/contrib/ncurses/misc/Makefile.in new file mode 100644 index 00000000..1a382c2d --- /dev/null +++ b/contrib/ncurses/misc/Makefile.in @@ -0,0 +1,232 @@ +# $Id: Makefile.in,v 1.83 2024/08/10 18:06:18 tom Exp $ +############################################################################## +# Copyright 2018-2021,2024 Thomas E. Dickey # +# Copyright 1998-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for ncurses miscellany directory +# +# This makes/installs the terminfo database +# +# The variable 'srcdir' refers to the source-distribution, and can be set with +# the configure script by "--srcdir=DIR". +# +# The rules are organized to produce the libraries for the configured models, +# and the programs with the configured default model. + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES : + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +CF_MFLAGS = @cf_cv_makeflags@ +@SET_MAKE@ + +DESTDIR = @DESTDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) + +tabsetdir = $(datadir)/tabset +ticdir = @TERMINFO@ +ticfile = $(ticdir).db +source = @TERMINFO_SRC@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_DATA = @INSTALL_DATA@ + +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ + +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +DATADIR = $(DESTDIR)$(datadir@MERGE_PREFIX@) + +@MAKE_DATABASE@INSTALL_PREFIX = $(DESTDIR)$(prefix@MERGE_PREFIX@) +@MAKE_DATABASE@LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) +@MAKE_DATABASE@TICDIR = $(DESTDIR)$(ticdir@MERGE_PREFIX@) +@MAKE_DATABASE@TICFILE = $(DESTDIR)$(ticfile@MERGE_PREFIX@) +@MAKE_DATABASE@TABSETDIR = $(DESTDIR)$(tabsetdir@MERGE_PREFIX@) + +@MAKE_PC_FILES@INSTALL_CONFIG = $(DESTDIR)$(PKG_CONFIG_LIBDIR@MERGE_PREFIX@) + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : depend +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.data +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.data +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +depend \ +sources :: + +@MAKE_DATABASE@all \ +@MAKE_DATABASE@sources :: terminfo.tmp + +@MAKE_DATABASE@install :: @MISC_INSTALL_DATA@ + +@MAKE_DATABASE@install.data :: terminfo.tmp \ +@MAKE_DATABASE@ $(LIBDIR) \ +@MAKE_DATABASE@ $(DATADIR) \ +@MAKE_DATABASE@ $(TABSETDIR) +@MAKE_DATABASE@ INSTALL_PREFIX=${INSTALL_PREFIX} \ +@MAKE_DATABASE@ TICDIR=${TICDIR} \ +@MAKE_DATABASE@ BINDIR=${BINDIR} \ +@MAKE_DATABASE@ tic_source=terminfo.tmp \ +@MAKE_DATABASE@ $(SHELL) ./run_tic.sh +@MAKE_DATABASE@ @( cd $(srcdir)/tabset && \ +@MAKE_DATABASE@ $(SHELL) -c 'for i in * ; do \ +@MAKE_DATABASE@ if test -f $$i ; then \ +@MAKE_DATABASE@ echo installing $$i; \ +@MAKE_DATABASE@ $(INSTALL_DATA) $$i $(TABSETDIR)/$$i; \ +@MAKE_DATABASE@ fi; done' ) +install.data :: + @echo "finished $@" + +NCURSES_CONFIG = ncurses@DFT_ARG_SUFFIX@@cf_cv_abi_version@@cf_config_suffix@-config + +install \ +install.libs :: $(BINDIR) ncurses-config + $(INSTALL_SCRIPT) ncurses-config $(BINDIR)/$(NCURSES_CONFIG) + +# Make a list of the files that gen-pkgconfig might create: +@MAKE_PC_FILES@PC_FILES = \ +@MAKE_PC_FILES@ @LIB_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ +@MAKE_PC_FILES@ @TINFO_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ +@MAKE_PC_FILES@ @TICS_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ +@MAKE_PC_FILES@ @PANEL_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ +@MAKE_PC_FILES@ @MENU_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ +@MAKE_PC_FILES@ @FORM_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc \ +@MAKE_PC_FILES@ @CXX_NAME@@USE_ARG_SUFFIX@@PC_MODULE_SUFFIX@.pc + +# some packagers prefer to be able to construct pc-files on servers where +# pkg-config is not installed. Work around that by creating the library +# directory during this rule: +@MAKE_PC_FILES@install \ +@MAKE_PC_FILES@install.libs :: pc-files +@MAKE_PC_FILES@ @$(SHELL) -c 'case "x$(PKG_CONFIG_LIBDIR)" in \ +@MAKE_PC_FILES@ x@GLOB_FULLPATH_POSIX@|x@GLOB_FULLPATH_OTHER@) \ +@MAKE_PC_FILES@ mkdir -p $(INSTALL_CONFIG); \ +@MAKE_PC_FILES@ for name in $(PC_FILES); do \ +@MAKE_PC_FILES@ test -f $$name || continue; \ +@MAKE_PC_FILES@ echo installing $$name; \ +@MAKE_PC_FILES@ $(INSTALL_DATA) $$name $(INSTALL_CONFIG)/$$name; \ +@MAKE_PC_FILES@ done \ +@MAKE_PC_FILES@ ;; \ +@MAKE_PC_FILES@ *) \ +@MAKE_PC_FILES@ echo "...skip actual install: no destination was given" ; \ +@MAKE_PC_FILES@ ;; \ +@MAKE_PC_FILES@ esac' + +@MAKE_PC_FILES@all \ +@MAKE_PC_FILES@sources :: pc-files +@MAKE_PC_FILES@pc-files : +@MAKE_PC_FILES@ $(SHELL) ./gen-pkgconfig +@MAKE_PC_FILES@ -touch $@ + +terminfo.tmp : run_tic.sed $(source) + echo '** adjusting tabset paths' + sed -f run_tic.sed $(source) >terminfo.tmp + +run_tic.sed : + WHICH_XTERM=@WHICH_XTERM@ \ + XTERM_KBS=@XTERM_KBS@ \ + datadir=${datadir} \ + $(SHELL) $(srcdir)/gen_edit.sh >$@ + +$(BINDIR) \ +$(DATADIR) : + mkdir -p $@ + +@MAKE_DATABASE@$(LIBDIR) \ +@MAKE_DATABASE@$(TABSETDIR) : +@MAKE_DATABASE@ mkdir -p $@ + +uninstall : @MISC_UNINSTALL_DATA@ uninstall.libs + +uninstall.data : +@MAKE_DATABASE@ -test -d $(TABSETDIR) && rm -rf $(TABSETDIR) +@MAKE_DATABASE@ -test -d $(TICDIR) && rm -rf $(TICDIR) +@MAKE_DATABASE@ -test -f $(TICFILE) && rm -f $(TICFILE) + +uninstall.libs : + -rm -f $(BINDIR)/$(NCURSES_CONFIG) +@MAKE_PC_FILES@ @$(SHELL) -c 'case x$(INSTALL_CONFIG) in \ +@MAKE_PC_FILES@ x@GLOB_FULLPATH_POSIX@|x@GLOB_FULLPATH_OTHER@) \ +@MAKE_PC_FILES@ for name in $(PC_FILES); do \ +@MAKE_PC_FILES@ test -f $$name || continue; \ +@MAKE_PC_FILES@ echo uninstalling $$name; \ +@MAKE_PC_FILES@ rm -f $(INSTALL_CONFIG)/$$name; \ +@MAKE_PC_FILES@ done \ +@MAKE_PC_FILES@ ;; \ +@MAKE_PC_FILES@ esac' + +tags : + +@MAKE_UPPER_TAGS@TAGS : + +mostlyclean : +@MAKE_DATABASE@ -rm -f terminfo.tmp +@MAKE_DATABASE@ -rm -f run_tic.sed +@MAKE_PC_FILES@ -rm -f pc-files $(PC_FILES) + -rm -f core tags TAGS *~ *.bak *.ln *.atac trace + +clean :: mostlyclean + +distclean : clean +@MAKE_PC_FILES@ -rm -f gen-pkgconfig + -rm -f Makefile run_tic.sh ncurses-config + +realclean : distclean + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/misc/chkdef.cmd b/contrib/ncurses/misc/chkdef.cmd new file mode 100644 index 00000000..a80230df --- /dev/null +++ b/contrib/ncurses/misc/chkdef.cmd @@ -0,0 +1,115 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998,2006 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: chkdef.cmd,v 1.4 2020/02/02 23:34:34 tom Exp $ + * + * Author: Juan Jose Garcia Ripoll . + * Webpage: http://www.arrakis.es/~worm/ + * + * chkdef.cmd - checks that a .def file has no conflicts and is properly + * formatted. + * + * returns nonzero if two symbols have the same code or a line has a wrong + * format. + * + * returns 0 otherwise + * + * the standard output shows conflicts. + */ +parse arg def_file + +def_file = translate(def_file,'\','/') + +call CleanQueue + +/* + * `cmp' is zero when the file is valid + * `codes' associates a name to a code + * `names' associates a code to a name + */ +cmp = 0 +codes. = 0 +names. = '' + +/* + * This sed expression cleans empty lines, comments and special .DEF + * commands, such as LIBRARY..., EXPORTS..., etc + */ +tidy_up = '"s/[ ][ ]*/ /g;s/;.*//g;/^[ ]*$/d;/^[a-zA-Z]/d;"' + +/* + * First we find all public symbols from the original DLL. All this + * information is pushed into a REXX private list with the RXQUEUE + * utility program. + */ +'@echo off' +'type' def_file '| sed' tidy_up '| sort | rxqueue' + +do while queued() > 0 + /* + * We retrieve the symbol name (NEW_NAME) and its code (NEW_CODE) + */ + parse pull '"' new_name '"' '@'new_code rest + select + when (new_code = '') | (new_name = '') then + /* The input was not properly formatted */ + do + say 'Error: symbol "'new_name'" has no export code or is empty' + cmp = 1 + end + when codes.new_name \= 0 then + /* This symbol was already defined */ + if codes.new_name \= new_code then + do + cmp = 2 + say 'Symbol "'new_name'" multiply defined' + end + when names.new_code \= '' then + /* This code was already assigned to a symbol */ + if names.new_code \= new_name then + do + cmp = 3 + say 'Conflict with "'names.new_code'" & "'new_name'" being @'new_code + end + otherwise + do + codes.new_name = new_code + names.new_code = new_name + end + end /* select */ +end + +exit cmp + +CleanQueue: procedure + do while queued() > 0 + parse pull foo + end +return diff --git a/contrib/ncurses/misc/cleantic.cmd b/contrib/ncurses/misc/cleantic.cmd new file mode 100644 index 00000000..b09ba57f --- /dev/null +++ b/contrib/ncurses/misc/cleantic.cmd @@ -0,0 +1,45 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998,2006 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: cleantic.cmd,v 1.5 2020/02/02 23:34:34 tom Exp $ + * + * Author: Juan Jose Garcia Ripoll . + * Webpage: http://www.arrakis.es/~worm/ + */ +parse arg dir + +pause +dir = translate(dir,'\','/'); +letters = '0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z' + +if dir = '' then + dir = '.' +'echo Cleaning 'dir +'for %%1 in ('letters') do @if not exist 'dir'\%%1\* (echo Cleaning ...\%%1 & rd %%1 2>NUL)' diff --git a/contrib/ncurses/misc/cmpdef.cmd b/contrib/ncurses/misc/cmpdef.cmd new file mode 100644 index 00000000..cd22f2d2 --- /dev/null +++ b/contrib/ncurses/misc/cmpdef.cmd @@ -0,0 +1,135 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998,2006 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: cmpdef.cmd,v 1.4 2020/02/02 23:34:34 tom Exp $ + * + * Author: Juan Jose Garcia Ripoll . + * Webpage: http://www.arrakis.es/~worm/ + * + * cmpdef.cmd - compares two .def files, checking whether they have + * the same entries with the same export codes. + * + * returns 0 if there are no conflicts between the files -- that is, + * the newer one can replace the older one. + * + * returns 1 when either of the files is not properly formatted and + * when there are conflicts: two symbols having the same export code. + * + * the standard output shows a list with newly added symbols, plus + * replaced symbols and conflicts. + */ +parse arg def_file1 def_file2 + +def_file1 = translate(def_file1,'\','/') +def_file2 = translate(def_file2,'\','/') + +call CleanQueue + +/* + * `cmp' is zero when the last file is valid and upward compatible + * `numbers' is the stem where symbols are stored + */ +cmp = 0 +names. = '' +numbers. = 0 + +/* + * This sed expression cleans empty lines, comments and special .DEF + * commands, such as LIBRARY..., EXPORTS..., etc + */ +tidy_up = '"s/[ ][ ]*/ /g;s/;.*//g;/^[ ]*$/d;/^[a-zA-Z]/d;"' + +/* + * First we find all public symbols from the original DLL. All this + * information is pushed into a REXX private list with the RXQUEUE + * utility program. + */ +'@echo off' +'type' def_file1 '| sed' tidy_up '| sort | rxqueue' + +do while queued() > 0 + /* + * We retrieve the symbol name (NAME) and its number (NUMBER) + */ + parse pull '"' name '"' '@'number rest + if number = '' || name = '' then + do + say 'Corrupted file' def_file1 + say 'Symbol' name 'has no number' + exit 1 + end + else + do + numbers.name = number + names.number = name + end +end + +/* + * Now we find all public symbols from the new DLL, and compare. + */ +'type' def_file2 '| sed' tidy_up '| sort | rxqueue' + +do while queued() > 0 + parse pull '"' name '"' '@'number rest + if name = '' | number = '' then + do + say 'Corrupted file' def_file2 + say 'Symbol' name 'has no number' + exit 1 + end + if numbers.name = 0 then + do + cmp = 1 + if names.number = '' then + say 'New symbol' name 'with code @'number + else + say 'Conflict old =' names.number ', new =' name 'at @'number + end + else if numbers.name \= number then + do + cmp = 1 + say name 'Symbol' name 'changed from @'numbers.name 'to @'number + end +end /* do */ + +exit cmp + +/* + * Cleans the REXX queue by pulling and forgetting every line. + * This is needed, at least, when `cmpdef.cmd' starts, because an aborted + * REXX program might have left some rubbish in. + */ +CleanQueue: procedure + do while queued() > 0 + parse pull foo + end +return + diff --git a/contrib/ncurses/misc/csort b/contrib/ncurses/misc/csort new file mode 100755 index 00000000..c39c2951 --- /dev/null +++ b/contrib/ncurses/misc/csort @@ -0,0 +1,37 @@ +#!/bin/sh +# $Id: csort,v 1.4 2021/09/04 15:55:29 tom Exp $ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 2002 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# override anything that might cause 'sort' to do the wrong thing... +LANG=C; export LANG +LANGUAGE=C; export LANGUAGE +LC_ALL=C; export LC_ALL +LC_CTYPE=C; export LC_CTYPE +sort "$@" diff --git a/contrib/ncurses/misc/emx.src b/contrib/ncurses/misc/emx.src new file mode 100644 index 00000000..901c7b50 --- /dev/null +++ b/contrib/ncurses/misc/emx.src @@ -0,0 +1,886 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998-2003,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: emx.src,v 1.12 2020/02/02 23:34:34 tom Exp $ +# This is a reformatted copy of the terminfo source for OS/2 EMX from +# Juan Jose Garcia Ripoll . +# http://www.arrakis.es/~worm/ +#---------------------------------------------------------------------------- +# +# This section describes terminal classes and maker brands that are still +# quite common. +# + +#### Specials +# +# Special "terminals". These are used to label tty lines when you don't +# know what kind of terminal is on it. The characteristics of an unknown +# terminal are the lowest common denominator - they look about like a ti 700. +# + +dumb|80-column dumb tty, + am, + cols#80, + bel=^G, + cr=^M, + cud1=^J, + ind=^J, +unknown|unknown terminal type, + gn, + use=dumb, +lpr|printer|line printer, + hc, + os, + cols#132, + lines#66, + bel=^G, + cr=^M, + cub1=^H, + cud1=^J, + ff=^L, + ind=^J, +glasstty|classic glass tty interpreting ASCII control characters, + am, + cols#80, + bel=^G, + clear=^L, + cr=^M, + cub1=^H, + cud1=^J, + ht=^I, + kbs=^H, + kcub1=^H, + kcud1=^J, + nel=^M^J, + +#### ANSI.SYS/ISO 6429/ECMA-48 Capabilities +# +# See the end-of-file comment for more on these. +# + +# The IBM PC alternate character set. Plug this into any Intel console entry. +# We use \E[11m for rmacs rather than \E[12m so the string can use the +# ROM graphics for control characters such as the diamond, up- and down-arrow. +# This works with the System V, Linux, and BSDI consoles. It's a safe bet this +# will work with any Intel console, they all seem to have inherited \E[11m +# from the ANSI.SYS de-facto standard. +klone+acs|alternate character set for ansi.sys displays, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + rmacs=\E[10m, + smacs=\E[11m, + +# Highlight controls corresponding to the ANSI.SYS standard. Most +# console drivers for Intel boxes obey these. Makes the same assumption +# about \E[11m as klone+acs. True ANSI/ECMA-48 would have , +# , but this isn't a documented feature of ANSI.SYS. +klone+sgr|attribute control for ansi.sys displays, + blink=\E[5m, + bold=\E[1m, + invis=\E[8m, + rev=\E[7m, + rmacs=\E[10m, + rmpch=\E[10m, + rmso=\E[m, + rmul=\E[m, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + sgr0=\E[0;10m, + smacs=\E[11m, + smpch=\E[11m, + smso=\E[7m, + smul=\E[4m, + use=klone+acs, + +# Highlight controls corresponding to the ANSI.SYS standard. *All* +# console drivers for Intel boxes obey these. Does not assume \E[11m will +# work; uses \E[12m instead, which is pretty bulletproof but loses you the ACS +# diamond and arrow characters under curses. +klone+sgr-dumb|attribute control for ansi.sys displays (no ESC [ 11 m), + blink=\E[5m, + bold=\E[1m, + invis=\E[8m, + rev=\E[7m, + rmacs=\E[10m, + rmso=\E[m, + rmul=\E[m, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;12%;m, + sgr0=\E[0;10m, + smacs=\E[12m, + smso=\E[7m, + smul=\E[4m, + use=klone+acs, + +# ANSI.SYS color control. +# The DOS 5 manual asserts that these sequences meet the ISO 6429 standard. +klone+color|color control for ansi.sys and ISO6429-compatible displays, + colors#8, + ncv#3, + pairs#64, + op=\E[37;40m, + setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + +# This is better than klone+color, it doesn't assume white-on-black as the +# default color pair, but many `ANSI' terminals don't grok the cap. +ecma+color|color control for ECMA-48-compatible terminals, + AX, + colors#8, + ncv#3, + pairs#64, + op=\E[39;49m, + setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + +#### ANSI/ECMA-48 terminals and terminal emulators +# +# See near the end of this file for details on ANSI conformance. +# Don't mess with these entries! Lots of other entries depend on them! +# +# This section lists entries in a least-capable to most-capable order. +# if you're in doubt about what `ANSI' matches yours, try them in that +# order and back off from the first that breaks. + +ansi-mini|any ansi terminal with pessimistic assumptions, + am, + cols#80, + it#8, + lines#24, + clear=\E[H\E[2J$<50>, + cub1=\E[D, + cud1=\E[B, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, + el=\E[K, + home=\E[H, + ht=^I, + +# +# ANSI.SYS entries +# +# This completely describes the sequences specified in the DOS 2.1 ANSI.SYS +# documentation (except for the keyboard key reassignment feature, which +# doesn't fit the model well). The klone+acs sequences were valid +# though undocumented. The capability is untested but should work for +# keys F1-F10 (%p1 values outside this range will yield unpredictable results). +# From: Eric S. Raymond Nov 7 1995 +ansi.sys-old|ANSI.SYS under PC-DOS 2.1, + am, + mir, + msgr, + xon, + cols#80, + lines#25, + clear=\E[2J, + cub1=^H, + cud1=\E[B, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, + el=\E[k, + home=\E[H, + is2=\E[m\E[?7h, + kcub1=^H, + kcud1=^J, + kcuf1=^L, + kcuu1=^K, + khome=^^, + pfkey=\E[0;%p1%{58}%+%d;%p2"%s", + rc=\E[u, + rmam=\E[?7l, + sc=\E[s, + smam=\E[?7h, + u6=\E[%i%d;%dR, + u7=\E[6n, + use=klone+color, + use=klone+acs, + use=klone+sgr, +ansi.sys|ANSI.SYS 3.1 and later versions, + el=\E[K, + use=ansi.sys-old, + +### EMX termcap.dat compatibility modes +# +# Keypad: Home=\0G Up=\0H PrPag=\0I +# ka1,kh kcuu1 kpp,ka3 +# +# Left=\0K 5=\0L Right=\0M +# kcub1 kb2 kcuf1 +# +# End=\0O Down=\0P NxPag=\0Q +# kc1,kend kcud1 kc3,knp +# +# Ins=\0R Del=\0S +# kich1 kdch1 +# +# On keyboard with 12 function keys, +# shifted f-keys: F13-F24 +# control f-keys: F25-F36 +# alt f-keys: F37-F48 +# The shift/control/alt keys do not modify each other, but alt overrides both, +# and control overrides shift. +# +# Also (possibly only EMX, so we don't put it in ansi.sys, etc): set the +# no_color_video to inform the application that standout(1), underline(2) +# reverse(4) and invisible(64) don't work with color. +emx-base|DOS special keys, + bce, + bw, + it#8, + ncv#71, + bel=^G, + ka1=\0G, + ka3=\0I, + kb2=\0L, + kbs=^H, + kc1=\0O, + kc3=\0Q, + kcbt=\0^O, + kcub1=\0K, + kcud1=\0P, + kcuf1=\0M, + kcuu1=\0H, + kdch1=\0S, + kend=\0O, + kf1=\0;, + kf10=\0D, + kf11=\0\205, + kf12=\0\206, + kf13=\0T, + kf14=\0U, + kf15=\0V, + kf16=\0W, + kf17=\0X, + kf18=\0Y, + kf19=\0Z, + kf2=\0<, + kf20=\0[, + kf21=\0\\, + kf22=\0], + kf23=\0\207, + kf24=\0\210, + kf25=\0\^, + kf26=\0_, + kf27=\0`, + kf28=\0a, + kf29=\0b, + kf3=\0=, + kf30=\0c, + kf31=\0d, + kf32=\0e, + kf33=\0f, + kf34=\0g, + kf35=\0\211, + kf36=\0\212, + kf37=\0h, + kf38=\0i, + kf39=\0j, + kf4=\0>, + kf40=\0k, + kf41=\0l, + kf42=\0m, + kf43=\0n, + kf44=\0o, + kf45=\0p, + kf46=\0q, + kf47=\0\213, + kf48=\0\214, + kf5=\0?, + kf6=\0@, + kf7=\0A, + kf8=\0B, + kf9=\0C, + khome=\0G, + kich1=\0R, + knp=\0Q, + kpp=\0I, + use=ansi.sys, +# +# To properly translate termcap.dat -> terminfo.src remember these +# equivalences: +# ti <-> smcup string to start programs using cup(termcap) +# te <-> rmcup string to end programs using cup +# so <-> smso begin standout mode +# se <-> rmso exit standout mode +# us <-> smul begin underline mode +# ue <-> rmul exit underline mode +# mb <-> blink turn on blinking +# md <-> bold turn on extra bright (bold) mode +# mr <-> rev turn on reverse video mode +# me <-> sgr0 turn off all attributes +# +# On my terminal, \E[4m looks dim. +ansi-emx|ANSI.SYS color, + blink=\E[5m, + bold=\E[1m, + kmous=\E[M, + rev=\E[7m, + rmcup=\E[0m, + rmso=\E[0m, + rmul@, + sgr0=\E[0m, + smcup=\E[0;37;40m, + smso=\E[7m, + smul@, + use=emx-base, +window|ANSI.SYS window, + blink=\E[5m, + bold=\E[1;37;47m, + rev=\E[1;37;47m, + rmcup=\E[0m, + rmso=\E[0;37;40m, + rmul=\E[0;37;40m, + sgr0=\E[0;37;40m, + smcup=\E[0;37;40m, + smso=\E[1;37;47m, + smul=\E[1;31;47m, + use=emx-base, +os2|OS/2-emx ANSI.SYS, + cub=\E[%p1%dD, + cub1=\E[D, + cud=\E[%p1%dB, + cud1=\E[B, + cuf=\E[%p1%dC, + cuf1=\E[C, + cuu=\E[%p1%dA, + cuu1=\E[A, + rc=\E[u, + sc=\E[s, + use=ansi-emx, + use=mono, +mono|ANSI.SYS mono, + blink=\E[5m, + bold=\E[1m, + rev=\E[7m, + rmcup=\E[0m, + rmso=\E[m, + rmul=\E[m, + sgr0=\E[m, + smcup=\E[0m, + smso=\E[1m, + smul=\E[4m, + use=emx-base, +# same as mono, but use reverse video for standout (nice for Emacs) +rmono|ANSI.SYS reverse mono, + smso=\E[7m, + use=mono, +# same as mono, but use a readable color for underlining +mono2|ANSI.SYS mono2, + rmul=\E[0m, + smul=\E[1;31;40m, + use=mono, +# nice colors for Emacs (white on blue, mode line white on cyan) +ansi-color-2-emx|ANSI.SYS color 2, + rmcup=\E[0m, + rmso=\E[0;37;44m, + rmul=\E[0m, + sgr0=\E[0;37;44m, + smcup=\E[0;37;44m, + smso=\E[1;37;46m, + smul=\E[1;31;40m, + use=ansi-emx, +# nice colors for Emacs (white on black, mode line black on cyan) +ansi-color-3-emx|ANSI.SYS color 3, + rmcup=\E[0m, + rmso=\E[0m, + rmul=\E[0m, + sgr0=\E[0m, + smcup=\E[0m, + smso=\E[30;46m, + smul=\E[1;31;40m, + use=ansi-emx, + +#### X terminal emulators +# +# X10/6.6 11/7/86, minus alternate screen, plus (csr) +# (xterm: ":MT:" changed to ":km:"; added / based on init string; +# removed (hs, eslok, tsl=\E[?E\E[?%i%dT, fsl=\E[?F, dsl=\E[?E) +# as these seem not to work -- esr) +x10term|vs100-x10|xterm terminal emulator (X10 window system), + am, + km, + mir, + msgr, + xenl, + xon, + cols#80, + it#8, + lines#65, + bold=\E[1m, + clear=\E[H\E[2J, + csr=\E[%i%p1%d;%p2%dr, + cub1=^H, + cud1=^J, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, + dch=\E[%p1%dP, + dch1=\E[P, + dl=\E[%p1%dM, + dl1=\E[M, + ed=\E[J, + el=\E[K, + home=\E[H, + ht=^I, + il=\E[%p1%dL, + il1=\E[L, + ind=^J, + is2=\E\E[m\E[?7h\E[?1;4l, + kbs=^H, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kf1=\EOP, + kf2=\EOQ, + kf3=\EOR, + kf4=\EOS, + rev=\E[7m, + ri=\EM, + rmam=\E[?7l, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmso=\E[m, + rmul=\E[m, + sgr0=\E[m, + smam=\E[?7h, + smir=\E[4h, + smkx=\E[?1h\E=, + smso=\E[7m, + smul=\E[4m, +# X11R6 xterm. This is known good for the XFree86 version under Linux. +# It is *way* more featureful than the stock X consortium entry (has acsc, +# for starters). The key is actually the \E[M prefix returned by +# xterm's internal mouse-tracking facility; ncurses will interpret the +# following three bytes of mouse status information. +# From: Eric S. Raymond 14 Dec 1995 +xterm-r6|xterm terminal emulator (X11R6 Window System), + am, + km, + mir, + msgr, + xenl, + xon, + cols#80, + it#8, + lines#65, + acsc=++\,\,--..00II``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, + bold=\E[1m, + clear=\E[H\E[2J, + cr=^M, + csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, + cub1=^H, + cud=\E[%p1%dB, + cud1=^J, + cuf=\E[%p1%dC, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu=\E[%p1%dA, + cuu1=\E[A, + dch=\E[%p1%dP, + dch1=\E[P, + dl=\E[%p1%dM, + dl1=\E[M, + ed=\E[J, + el=\E[K, + enacs=\E(B\E)0, + home=\E[H, + ht=^I, + ich=\E[%p1%d@, + ich1=\E[@, + il=\E[%p1%dL, + il1=\E[L, + ind=^J, + is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, + kbs=^H, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kend=\EOe, + kent=\EOM, + kf1=\E[11~, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[25~, + kf14=\E[26~, + kf15=\E[28~, + kf16=\E[29~, + kf17=\E[31~, + kf18=\E[32~, + kf19=\E[33~, + kf2=\E[12~, + kf20=\E[34~, + kf3=\E[13~, + kf4=\E[14~, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + kfnd=\E[1~, + khome=\EO\0, + kich1=\E[2~, + kmous=\E[M, + knp=\E[6~, + kpp=\E[5~, + rc=\E8, + rev=\E[7m, + ri=\EM, + rmacs=^O, + rmam=\E[?7l, + rmcup=\E[2J\E[?47l\E8, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmso=\E[m, + rmul=\E[m, + rs1=^O, + rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E<, + sc=\E7, + sgr0=\E[m, + smacs=^N, + smam=\E[?7h, + smcup=\E7\E[?47h, + smir=\E[4h, + smkx=\E[?1h\E=, + smso=\E[7m, + smul=\E[4m, + tbc=\E[3k, + u6=\E[%i%d;%dR, + u7=\E[6n, + u8=\E[?1;2c, + u9=\E[c, +xterm-bold|xterm terminal emulator (X11R6 Window System) standout w/bold, + smso=\E[1m, + use=xterm, +xterms|vs100s|xterm terminal emulator (small screen 24x80), + cols#80, + lines#24, + use=xterm, +# (kterm: this had extension capabilities ":KJ:TY=ascii:" -- esr) +kterm|kterm kanji terminal emulator (X window system), + eslok, + hs, + csr=\E[%i%p1%d;%p2%dr, + dsl=\E[?H, + fsl=\E[?F, + rc=\E8, + sc=\E7, + tsl=\E[?E\E[?%i%dT, + use=xterm, + use=ecma+color, + +# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file +xterm-nic|xterm with ich/ich1 suppressed for non-curses programs, + ich@, + ich1@, + use=xterm, + +# Should work with the color xterm on the X11R6 contrib tape. +# Assumes the xterm attribute default is black on white. +# From: Eric S. Raymond March 4 1996 +xterm-color|xterm with color support, + op=\E[30;47m, + use=xterm, + use=klone+color, + +# From: Thomas Dickey 13 Dec 1995 +rxvt|rxvt terminal emulator, + kend=\EOw, + khome=\E[H, + kmous@, + use=xterm, + use=klone+color, + +# From: David J. MacKenzie 20 Apr 1995 +# Here's a termcap entry I've been using for xterm_color, which comes +# with BSD/OS 2.0, and the X11R6 contrib tape too I think. Besides the +# color stuff, I also have a status line defined as the window manager +# title bar. [I have translated it to terminfo -- ESR] +xterm-pcolor|xterm with color used for highlights and status line, + hs, + wsl#40, + bold=\E[1m\E[43m, + dsl=\E]0;\007, + fsl=^G, + rev=\E[7m\E[34m, + smso=\E[7m\E[31m, + smul=\E[4m\E[42m, + tsl=\E]0;, + use=xterm, + +# HP ships this, except for the pb#9600 which was merged in from BSD termcap. +hpterm|X-hpterm|hp X11 terminal emulator, + am, + da, + db, + mir, + xhp, + cols#80, + lh#2, + lines#24, + lm#0, + lw#8, + nlab#8, + pb#9600, + xmc#0, + bel=^G, + bold=\E&dB, + cbt=\Ei, + clear=\E&a0y0C\EJ, + cr=^M, + cub1=^H, + cud1=\EB, + cuf1=\EC, + cup=\E&a%p1%dy%p2%dC, + cuu1=\EA, + dch1=\EP, + dim=\E&dH, + dl1=\EM, + ed=\EJ$<1>, + el=\EK, + hpa=\E&a%p1%dC, + ht=^I, + hts=\E1, + il1=\EL, + ind=^J, + kbs=^H, + kclr=\EJ, + kctab=\E2, + kcub1=\ED, + kcud1=\EB, + kcuf1=\EC, + kcuu1=\EA, + kdch1=\EP, + kdl1=\EM, + ked=\EJ, + kel=\EK, + kf1=\Ep, + kf2=\Eq, + kf3=\Er, + kf4=\Es, + kf5=\Et, + kf6=\Eu, + kf7=\Ev, + kf8=\Ew, + khome=\Eh, + khts=\E1, + kich1=\EQ, + kil1=\EL, + kind=\ES, + kll=\EF, + knp=\EU, + kpp=\EV, + kri=\ET, + krmir=\ER, + ktbc=\E3, + meml=\El, + memu=\Em, + pfkey=\E&f%p1%dk%p2%l%dL%p2%s, + pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s, + pfx=\E&f2a%p1%dk%p2%l%dL%p2%s, + pln=\E&f%p1%dk%p2%l%dd0L%p2%s, + rev=\E&dB, + ri=\ET, + rmacs=^O, + rmir=\ER, + rmkx=\E&s0A, + rmln=\E&j@, + rmso=\E&d@, + rmul=\E&d@, + sgr=\E&d%?%p7%t%'s'%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+%p5%{8}%*%+%'@'%+%c%?%p9%t%'\016'%c%e%'\017'%c%;, + sgr0=\E&d@, + smacs=^N, + smir=\EQ, + smkx=\E&s1A, + smln=\E&jB, + smso=\E&dJ, + smul=\E&dD, + tbc=\E3, + vpa=\E&a%p1%dY, + +# This entry describes an xterm with Sun-style function keys enabled +# via the X resource setting "xterm*sunFunctionKeys:true" +# To understand / note that L1,L2 and F11,F12 are the same. +# The ... keys are L3-L10. We don't set +# because we want it to be seen as . +# The ... keys are R1-R15. We treat some of these in accordance +# with their Sun keyboard labels instead. +# From: Simon J. Gerraty 10 Jan 1996 +xterm-sun|xterm with sunFunctionKeys true, + kb2=\E[218z, + kcpy=\E[197z, + kend=\E[220z, + kf1=\E[224z, + kf10=\E[233z, + kf11=\E[192z, + kf12=\E[193z, + kf13=\E[194z, + kf14=\E[195z, + kf15=\E[196z, + kf17=\E[198z, + kf18=\E[199z, + kf19=\E[200z, + kf2=\E[225z, + kf20=\E[201z, + kf3=\E[226z, + kf31=\E[208z, + kf32=\E[209z, + kf33=\E[210z, + kf34=\E[211z, + kf35=\E[212z, + kf36=\E[213z, + kf38=\E[215z, + kf4=\E[227z, + kf40=\E[217z, + kf42=\E[219z, + kf44=\E[221z, + kf5=\E[228z, + kf6=\E[229z, + kf7=\E[230z, + kf8=\E[231z, + kf9=\E[232z, + kfnd=\E[200z, + khlp=\E[196z, + khome=\E[214z, + kich1=\E[2z, + knp=\E[222z, + kpp=\E[216z, + kund=\E[195z, + use=xterm, +xterms-sun|small (80x24) xterm with sunFunctionKeys true, + cols#80, + lines#24, + use=xterm-sun, + +# This is for the extensible terminal emulator on the X11R6 contrib tape. +emu|emu native mode, + mir, + msgr, + xon, + colors#15, + cols#80, + it#8, + lines#24, + pairs#64, + vt#200, + acsc=61a\202f\260g2j\213k\214l\215m\216n\217o\220q\222s\224t\225u\226v\227w\230x\231~\244, + bel=^G, + blink=\ES\EW, + bold=\ES\EU, + civis=\EZ, + clear=\EP\EE0;0;, + cnorm=\Ea, + cr=^M, + csr=\Ek%p1%d;%p2%d;, + cub=\Eq-%p1%d;, + cub1=^H, + cud=\Ep%p1%d;, + cud1=\EB, + cuf=\Eq%p1%d;, + cuf1=\ED, + cup=\EE%p1%d;%p2%d;, + cuu=\Ep-%p1%d;, + cuu1=\EA, + dch=\EI%p1%d;, + dch1=\EI1;, + dl=\ER%p1%d;, + dl1=\ER1;, + ech=\Ej%p1%d;, + ed=\EN, + el=\EK, + el1=\EL, + enacs=\0, + home=\EE0;0;, + ht=^I, + hts=\Eh, + il=\EQ%p1%d;, + il1=\EQ1;, + ind=\EG, + is2=\ES\Er0;\Es0;, + kbs=^H, + kcub1=\EC, + kcud1=\EB, + kcuf1=\ED, + kcuu1=\EA, + kdch1=\177, + kent=^M, + kf0=\EF00, + kf1=\EF01, + kf10=\EF10, + kf11=\EF11, + kf12=\EF12, + kf13=\EF13, + kf14=\EF14, + kf15=\EF15, + kf16=\EF16, + kf17=\EF17, + kf18=\EF18, + kf19=\EF19, + kf2=\EF02, + kf20=\EF20, + kf3=\EF03, + kf4=\EF04, + kf5=\EF05, + kf6=\EF06, + kf7=\EF07, + kf8=\EF08, + kf9=\EF09, + kfnd=\Efind, + kich1=\Eins, + knp=\Enext, + kpp=\Eprior, + kslt=\Esel, + oc=\Es0;\Er0;, + rev=\ES\ET, + ri=\EF, + rmacs=\0, + rmir=\EX, + rmso=\ES, + rmul=\ES, + rs2=\ES\Es0;\Er0;, + setab=\Es%i%p1%d;, + setaf=\Er%i%p1%d;, + sgr0=\ES, + smacs=\0, + smir=\EY, + smso=\ES\ET, + smul=\ES\EV, + tbc=\Ej, +############################################################################### +# Aliases which conflict with terminfo.src +ansi|ANSI.SYS color, + use=ansi-emx, +ansi-color-2|ANSI.SYS color 2, + use=ansi-color-2-emx, +ansi-color-3|ANSI.SYS color 3, + use=ansi-color-3-emx, +xterm|vs100|xterm terminal emulator (X11R6 Window System), + use=xterm-r6, diff --git a/contrib/ncurses/misc/form.def b/contrib/ncurses/misc/form.def new file mode 100644 index 00000000..ea43b595 --- /dev/null +++ b/contrib/ncurses/misc/form.def @@ -0,0 +1,101 @@ +LIBRARY form5 INITINSTANCE TERMINSTANCE +DESCRIPTION "NCurses-5-1-20000704, module form" +CODE LOADONCALL +DATA LOADONCALL NONSHARED MULTIPLE +EXPORTS + "TYPE_ALNUM" @2 NONAME + "TYPE_ALPHA" @1 NONAME + "TYPE_ENUM" @3 NONAME + "TYPE_INTEGER" @4 NONAME + "TYPE_IPV4" @7 NONAME + "TYPE_NUMERIC" @5 NONAME + "TYPE_REGEXP" @6 NONAME + "_nc_Copy_Argument" @8 NONAME + "_nc_Copy_Type" @9 NONAME + "_nc_Default_Field" @11 NONAME + "_nc_Default_FieldType" @12 NONAME + "_nc_Default_Form" @10 NONAME + "_nc_First_Active_Field" @13 NONAME + "_nc_Free_Argument" @14 NONAME + "_nc_Free_Type" @15 NONAME + "_nc_Internal_Validation" @16 NONAME + "_nc_Make_Argument" @17 NONAME + "_nc_Position_Form_Cursor" @18 NONAME + "_nc_Refresh_Current_Field" @19 NONAME + "_nc_Set_Current_Field" @25 NONAME + "_nc_Set_Form_Page" @26 NONAME + "_nc_Synchronize_Attributes" @27 NONAME + "_nc_Synchronize_Options" @28 NONAME + "current_field" @102 NONAME + "data_ahead" @133 NONAME + "data_behind" @134 NONAME + "dup_field" @31 NONAME + "dynamic_field_info" @35 NONAME + "field_arg" @56 NONAME + "field_back" @53 NONAME + "field_buffer" @59 NONAME + "field_count" @111 NONAME + "field_fore" @52 NONAME + "field_index" @115 NONAME + "field_info" @34 NONAME + "field_init" @107 NONAME + "field_just" @41 NONAME + "field_opts" @60 NONAME + "field_opts_off" @51 NONAME + "field_opts_on" @50 NONAME + "field_pad" @45 NONAME + "field_status" @55 NONAME + "field_term" @108 NONAME + "field_type" @58 NONAME + "field_userptr" @57 NONAME + "form_driver" @126 NONAME + "form_fields" @101 NONAME + "form_init" @105 NONAME + "form_opts" @132 NONAME + "form_opts_off" @130 NONAME + "form_opts_on" @129 NONAME + "form_page" @117 NONAME + "form_request_by_name" @29 NONAME + "form_request_name" @61 NONAME + "form_sub" @104 NONAME + "form_term" @106 NONAME + "form_userptr" @131 NONAME + "form_win" @103 NONAME + "free_field" @33 NONAME + "free_fieldtype" @22 NONAME + "free_form" @109 NONAME + "link_field" @32 NONAME + "link_fieldtype" @21 NONAME + "move_field" @37 NONAME + "new_field" @30 NONAME + "new_fieldtype" @20 NONAME + "new_form" @100 NONAME + "new_page" @54 NONAME + "pos_form_cursor" @125 NONAME + "post_form" @123 NONAME + "scale_form" @118 NONAME + "set_current_field" @114 NONAME + "set_field_back" @43 NONAME + "set_field_buffer" @46 NONAME + "set_field_fore" @42 NONAME + "set_field_init" @121 NONAME + "set_field_just" @40 NONAME + "set_field_opts" @49 NONAME + "set_field_pad" @44 NONAME + "set_field_status" @47 NONAME + "set_field_term" @122 NONAME + "set_field_type" @38 NONAME + "set_field_userptr" @48 NONAME + "set_fieldtype_arg" @23 NONAME + "set_fieldtype_choice" @24 NONAME + "set_form_fields" @110 NONAME + "set_form_init" @119 NONAME + "set_form_opts" @128 NONAME + "set_form_page" @116 NONAME + "set_form_sub" @113 NONAME + "set_form_term" @120 NONAME + "set_form_userptr" @127 NONAME + "set_form_win" @112 NONAME + "set_max_field" @36 NONAME + "set_new_page" @39 NONAME + "unpost_form" @124 NONAME diff --git a/contrib/ncurses/misc/form.ref b/contrib/ncurses/misc/form.ref new file mode 100644 index 00000000..18e65a68 --- /dev/null +++ b/contrib/ncurses/misc/form.ref @@ -0,0 +1,106 @@ +LIBRARY FORM2 INITINSTANCE +DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - forms library' +EXPORTS +; +; SHARED VARIABLES +; + "TYPE_ALPHA" @1 ;NONAME + "TYPE_ALNUM" @2 ;NONAME + "TYPE_ENUM" @3 ;NONAME + "TYPE_INTEGER" @4 ;NONAME + "TYPE_NUMERIC" @5 ;NONAME + "TYPE_REGEXP" @6 ;NONAME + + "_nc_Default_Form" @10 ;NONAME + "_nc_Default_Field" @11 ;NONAME + +; +; FIELD FUNCTIONS +; + "new_fieldtype" @20 ;NONAME + "link_fieldtype" @21 ;NONAME + + "free_fieldtype" @22 ;NONAME + "set_fieldtype_arg" @23 ;NONAME + "set_fieldtype_choice" @24 ;NONAME + + "new_field" @30 ;NONAME + "dup_field" @31 ;NONAME + "link_field" @32 ;NONAME + + "free_field" @33 ;NONAME + "field_info" @34 ;NONAME + "dynamic_field_info" @35 ;NONAME + "set_max_field" @36 ;NONAME + "move_field" @37 ;NONAME + "set_field_type" @38 ;NONAME + "set_new_page" @39 ;NONAME + "set_field_just" @40 ;NONAME + "field_just" @41 ;NONAME + "set_field_fore" @42 ;NONAME + "set_field_back" @43 ;NONAME + "set_field_pad" @44 ;NONAME + "field_pad" @45 ;NONAME + "set_field_buffer" @46 ;NONAME + "set_field_status" @47 ;NONAME + "set_field_userptr" @48 ;NONAME + "set_field_opts" @49 ;NONAME + "field_opts_on" @50 ;NONAME + "field_opts_off" @51 ;NONAME + + "field_fore" @52 ;NONAME + "field_back" @53 ;NONAME + + "new_page" @54 ;NONAME + "field_status" @55 ;NONAME + "field_arg" @56 ;NONAME + "field_userptr" @57 ;NONAME + "field_type" @58 ;NONAME + "field_buffer" @59 ;NONAME + "field_opts" @60 ;NONAME + +; +; FORM FUNCTIONS +; + "new_form" @100 ;NONAME + + "form_fields" @101 ;NONAME + "current_field" @102 ;NONAME + + "form_win" @103 ;NONAME + "form_sub" @104 ;NONAME + + "form_init" @105 ;NONAME + "form_term" @106 ;NONAME + "field_init" @107 ;NONAME + "field_term" @108 ;NONAME + + "free_form" @109 ;NONAME + "set_form_fields" @110 ;NONAME + "field_count" @111 ;NONAME + "set_form_win" @112 ;NONAME + "set_form_sub" @113 ;NONAME + "set_current_field" @114 ;NONAME + "field_index" @115 ;NONAME + "set_form_page" @116 ;NONAME + "form_page" @117 ;NONAME + "scale_form" @118 ;NONAME + "set_form_init" @119 ;NONAME + "set_form_term" @120 ;NONAME + "set_field_init" @121 ;NONAME + "set_field_term" @122 ;NONAME + "post_form" @123 ;NONAME + "unpost_form" @124 ;NONAME + "pos_form_cursor" @125 ;NONAME + "form_driver" @126 ;NONAME + "set_form_userptr" @127 ;NONAME + "set_form_opts" @128 ;NONAME + "form_opts_on" @129 ;NONAME + "form_opts_off" @130 ;NONAME + + "form_userptr" @131 ;NONAME + + "form_opts" @132 ;NONAME + + "data_ahead" @133 ;NONAME + "data_behind" @134 ;NONAME diff --git a/contrib/ncurses/misc/gen-pkgconfig.in b/contrib/ncurses/misc/gen-pkgconfig.in new file mode 100644 index 00000000..c369dd26 --- /dev/null +++ b/contrib/ncurses/misc/gen-pkgconfig.in @@ -0,0 +1,251 @@ +#!@SHELL@ +# $Id: gen-pkgconfig.in,v 1.58 2024/09/28 20:21:23 tom Exp $ +############################################################################## +# Copyright 2018-2022,2024 Thomas E. Dickey # +# Copyright 2009-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# The complete configure script for ncurses is the ncurses5-config (or similar +# name, depending on the flavor, e.g., ncursesw5-config, ncurses6-config, etc). +# That provides more information than pkg-config, and is the portable and +# recommended solution. +# +# For each library, generate a ".pc" file which depends on the base ncurses +# library, except that the tinfo library does not depend on ncurses. +LIB_NAME=@LIB_NAME@ +TINFO_NAME=@TINFO_NAME@ +PANEL_NAME=@PANEL_NAME@ +MENU_NAME=@MENU_NAME@ +FORM_NAME=@FORM_NAME@ +CXX_NAME=@CXX_NAME@ + +DFT_DEP_SUFFIX=@DFT_DEP_SUFFIX@ +TINFO_ARG_SUFFIX=@TINFO_ARG_SUFFIX@ +CXX_LIB_SUFFIX=@CXX_LIB_SUFFIX@ + +suffix=@PC_MODULE_SUFFIX@ +prefix="@prefix@" +exec_prefix="@exec_prefix@" +includedir="@includedir@@includesubdir@" +libdir="@libdir@" + +RPATH_LIST=@RPATH_LIST@ +PRIVATE_LIBS="@PRIVATE_LIBS@" + +show_prefix='@prefix@' +show_exec_prefix='@exec_prefix@' +show_includedir='@includedir@@includesubdir@' +show_libdir='@libdir@' + +MAIN_LIBRARY="${LIB_NAME}@USE_ARG_SUFFIX@" +SUB_LIBRARY="${TINFO_ARG_SUFFIX}" + +CXX_LIBRARY="${CXX_NAME}@USE_ARG_SUFFIX@" +FORM_LIBRARY="${FORM_NAME}@USE_ARG_SUFFIX@" +MENU_LIBRARY="${MENU_NAME}@USE_ARG_SUFFIX@" +PANEL_LIBRARY="${PANEL_NAME}@USE_ARG_SUFFIX@" + +CFLAGS="@PKG_CFLAGS@" +if [ "$includedir" != "/usr/include" ]; then + includetop=`echo "$includedir" | sed -e 's,/include/[^/]*$,/include,'` + [ "$includetop" = "/usr/include" ] && includetop="$includedir" + CFLAGS="$CFLAGS -I\${includedir}" + if [ "x$includetop" != "x$includedir" ] + then + CFLAGS="$CFLAGS -I${includetop}" + fi +fi + +lib_flags= +for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ @LIBS@ +do + case $opt in + -l*) # LIBS is handled specially below + continue + ;; + -specs*) # ignore linker specs-files which were used to build library + continue + ;; + -Wl,-z*) # ignore flags used to manipulate shared image + continue + ;; + -Wl,--dynamic-linker*) # ignore ELF interpreter + continue + ;; + -Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*) + continue + ;; + -L*) + lib_check=`echo "x$opt" | sed -e 's/^.-L//'` + # on a new/nonstandard install, $libdir may not yet exist at this point + if [ "$libdir" != "$lib_check" ] + then + [ -d "$lib_check" ] || continue + fi + case "$lib_check" in + @LD_SEARCHPATH@) # skip standard libdir + if [ "$lib_check" = "$libdir" ] + then + lib_first=no + IFS_save="$IFS" + IFS='|' + LIBDIRS="@LD_SEARCHPATH@" + for lib_check in $LIBDIRS + do + if [ -d "$lib_check" ] + then + if [ "$lib_check" = "$libdir" ] + then + lib_first=yes + break + fi + fi + done + IFS="$IFS_save" + [ $lib_first = yes ] && continue + found=no + for check in $lib_flags + do + if [ "x$check" = "x$opt" ] + then + found=yes + break + fi + done + [ $found = yes ] && continue + : + else + continue + fi + ;; + *) + found=no + for check in $lib_flags + do + if [ "x$check" = "x$opt" ] + then + found=yes + break + fi + done + [ $found = yes ] && continue + ;; + esac + ;; + esac + lib_flags="$lib_flags $opt" +done + +# Check if we should specify the tinfo library explicitly so that terminfo +# functions or curses variables (which also reside in tinfo) can be linked +# using the -lncurses option. +NEED_TINFO=no +if [ "x@TINFO_LIBS@" != "x" ] && \ + [ "x$TINFO_ARG_SUFFIX" != "x$MAIN_LIBRARY" ] +then + NEED_TINFO=yes +fi + +# The "URL" feature came in pkg-config 0.17 +USEURL="" +CFGVER=`${PKG_CONFIG:-pkg-config} --version 2>/dev/null |head -n 1 | awk -F. '/0.[0-9][0-9]/{print $2;}'` +# A missing version should simply fail, but some packagers insist on building +# packages on machines which do not actually have the tools they depend on at +# runtime. +[ -z "$CFGVER" ] && CFGVER=30 +[ $CFGVER -ge 17 ] || USEURL="#" + +for name in @PC_MODULES_TO_MAKE@ +do + name="${name}" + case $name in + form*) name="$FORM_LIBRARY" ;; + menu*) name="$MENU_LIBRARY" ;; + panel*) name="$PANEL_LIBRARY" ;; + ncurses++*) name="$CXX_LIBRARY" ;; + esac + LIBS="-l$name" + + desc="ncurses @NCURSES_MAJOR@.@NCURSES_MINOR@" + reqs= + + if [ $name = $MAIN_LIBRARY ]; then + desc="$desc library" + [ $NEED_TINFO = yes ] && LIBS="$LIBS -l$TINFO_ARG_SUFFIX" + [ -n "@LIBS@" ] && LIBS="$LIBS @LIBS@" + elif [ $name = $SUB_LIBRARY ]; then + desc="$desc terminal interface library" + elif expr $name : ".*${CXX_NAME}.*" >/dev/null ; then + reqs="$PANEL_LIBRARY${suffix}, $MENU_LIBRARY${suffix}, $FORM_LIBRARY${suffix}, $MAIN_LIBRARY${suffix}" + desc="$desc add-on library" + else + reqs="$MAIN_LIBRARY${suffix}" + desc="$desc add-on library" + fi + + if [ $name != $SUB_LIBRARY ] && \ + [ $SUB_LIBRARY != $MAIN_LIBRARY ] && \ + [ $name != $TINFO_NAME ] && \ + [ $NEED_TINFO != yes ] ; then + [ -n "$reqs" ] && reqs="$reqs, " + reqs="${reqs}${SUB_LIBRARY}${suffix}" + fi + + if [ $name = $MAIN_LIBRARY ] + then + main_libs="$PRIVATE_LIBS" + else + main_libs= + fi + + echo "** creating ${name}${suffix}.pc" + cat >${name}${suffix}.pc <&2 +cat <&2 +cat </dev/null` + if test "x$system" = xLinux + then + case x`uname -r` in + x1.*) + WHICH_LINUX=linux-c + ;; + x2.[0-4]*) + WHICH_LINUX=linux2.2 + ;; + *) + WHICH_LINUX=linux3.0 + ;; + esac + else + WHICH_LINUX=$linux_dft + fi + ;; +xlinux*) + # allow specific setting + ;; +*) + WHICH_LINUX=$linux_dft + ;; +esac + +if test $WHICH_LINUX != $linux_dft +then +echo "** using $WHICH_LINUX terminal description for Linux console" >&2 +cat <16 ubyte >32 +# namelist, if more than 1 separated by "|" like "st|stterm| simpleterm 0.4.1" +>>12 regex \^[a-zA-Z0-9][a-zA-Z0-9.][^|]* Compiled terminfo entry "%-s" +!:mime application/x-terminfo +# no extension +#!:ext +# +#------------------------------------------------------------------------------ +# The following was added for ncurses6 development: +#------------------------------------------------------------------------------ +# +0 string \036\002 +# imitate the legacy compiled-format, to get the entry-name printed +>16 ubyte >32 +# namelist, if more than 1 separated by "|" like "st|stterm| simpleterm 0.4.1" +>>12 regex \^[a-zA-Z0-9][a-zA-Z0-9.][^|]* Compiled 32-bit terminfo entry "%-s" +!:mime application/x-terminfo2 +# +# While the compiled terminfo uses little-endian format irregardless of +# platform, System V screen dumps do not. They came later, and that detail was +# overlooked. +# +# AIX and HPUX use the SVr4 big-endian format +# Solaris uses the SVr3 formats (sparc and x86 differ endian-ness) +0 beshort 0433 SVr2 curses screen image, big-endian +0 beshort 0434 SVr3 curses screen image, big-endian +0 beshort 0435 SVr4 curses screen image, big-endian +# +0 leshort 0433 SVr2 curses screen image, little-endian +0 leshort 0434 SVr3 curses screen image, little-endian +0 leshort 0435 SVr4 curses screen image, little-endian +# +# Rather than SVr4, Solaris "xcurses" writes this header: +0 regex \^MAX=[0-9]+,[0-9]+$ +>1 regex \^BEG=[0-9]+,[0-9]+$ +>2 regex \^SCROLL=[0-9]+,[0-9]+$ +>3 regex \^VMIN=[0-9]+$ +>4 regex \^VTIME=[0-9]+$ +>5 regex \^FLAGS=0x[[:xdigit:]]+$ +>6 regex \^FG=[0-9],[0-9]+$ +>7 regex \^BG=[0-9]+,[0-9]+, Solaris xcurses screen image +# +# ncurses5 (and before) did not use a magic number, making screen dumps "data". +# ncurses6 (2015) uses this format, ignoring byte-order +0 string \210\210\210\210ncurses ncurses6 screen image +# +# PDCurses added this in 2005 +0 string PDC\001 PDCurses screen image diff --git a/contrib/ncurses/misc/makedef.cmd b/contrib/ncurses/misc/makedef.cmd new file mode 100644 index 00000000..129ca83b --- /dev/null +++ b/contrib/ncurses/misc/makedef.cmd @@ -0,0 +1,180 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998,2006 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: makedef.cmd,v 1.7 2021/09/04 10:52:55 tom Exp $ + * + * Author: Juan Jose Garcia Ripoll . + * Webpage: http://www.arrakis.es/~worm/ + * + * makedef.cmd - update a DLL export list using a newly created library file + * in a.out format, plus an old .DEF file. + * + * standard output gets a sorted list with all entrypoints with entrycodes. + * This list, plus a few .def sentences (LIBRARY, DESCRIPTION and EXPORT) + * is used to build a new .def file. + * + * `_nc_*' symbols are ignored. + * + * returns 1 when the old def_file is corrupted -- that is, export items are + * not properly formatted. + * + * returns 0 if everything went OK. + */ + +parse arg lib_file def_file + +lib_file = translate(lib_file,'\','/') +def_file = translate(def_file,'\','/') + +call CleanQueue + +/* + * `codes' is the stem that links a code to every symbol + * `names' is the stem where symbols are stored sequentially + * `last' is the index of the last symbol defined + */ +last = 0 +used. = 0 +codes. = 0 +names. = '' + +tmp_name = 'foo.tmp' + +/* + * This sed expression cleans empty lines, comments and special .DEF + * commands, such as LIBRARY..., EXPORTS..., etc + */ +tidy_up = '"/^[A-Z]/d;s/[ ][ ]*/ /g;s/;.*$//g;s/^[ ]*//g;/^[ ]*$/d"' + +/* + * First we find all public symbols (functions and variables). Next we + * concatenate this list with the old one, sorting it and wiping out + * all unused data (comments, DLL directives, blanks, etc). All this + * information is pushed into a REXX private list with the RXQUEUE + * utility program. + */ +'@echo off' +'emxexp -u' lib_file '>' tmp_name +'cat' tmp_name def_file '| sed' tidy_up '| sort > foo2.tmp' +'type foo2.tmp | rxqueue' +'del' tmp_name '1>NUL' + +/* + * This loop runs over the queue items + */ +do while queued() > 0 + /* + * We retrieve the symbol name (NEW_NAME) and its number (NEW_NUMBER) + * When the line comes from `emximp's output, there's no number, so + * we assign it the special value 0. + */ + parse pull new_symbol '@'new_code rest + if Left(new_symbol,1) = '"' then + parse var new_symbol '"' new_name '"' rest + else + do + echo 'Symbol 'new_symbol' was not quoted' + new_name = new_symbol + end + + if new_code = '' then + new_code = 0 + /* + * Here, one would place all smart checks that would kill unused symbols. + * However, export tables are not that big, so why bothering? + if Left(new_name,4) = '_nc_' then + iterate + */ + /* + * The algorithm: + * IF (this is the 2nd time the symbol appears) THEN + * (this symbol comes from a .DEF file) + * it has a valid code that we store + * we mark that code as used + * ELIF (it has no number) THEN + * (it is a new symbol) + * we increase the counter of defined symbols + * we assign it the special number 0 + * (later on it'll be assigned an unused export code) + * ELSE + * this symbol was in the old DLL and it is no longer + * here, so we skip it. + */ + select + when new_name = '' then + 'echo Warning: empty symbol found 1>&2' + when names.last = new_name then + do + codes.last = new_code + used.new_code = 1 + end + when new_code = 0 then + do + last = last + 1 + names.last = new_name + codes.last = 0 + end + otherwise + 'echo Warning: symbol "'new_name'" has disappeared 1>&2' + end /* select */ +end /* do while queued() */ + +/* + * Finally we scan the stem, writing out all symbols with export codes. + * Those that did not have a valid one (just 0) are assigned a new one. + */ +new_code = 1 +inx = 1 +do while inx <= last + if codes.inx = 0 then + do + do while used.new_code \= 0 + new_code = new_code + 1 + end + codes.inx = new_code + used.new_code = 1 + end + say ' "'names.inx'" @'codes.inx' NONAME' + inx = inx + 1 +end +'del foo2.tmp 1>NUL' +exit 0 + +/* + * Cleans the REXX queue by pulling and forgetting every line. + * This is needed, at least, when `makedef.cmd' starts, because an aborted + * REXX program might have left some rubbish in. + */ +CleanQueue: procedure + do while queued() > 0 + parse pull foo + end +return + diff --git a/contrib/ncurses/misc/makellib b/contrib/ncurses/misc/makellib new file mode 100755 index 00000000..fb3d3b7a --- /dev/null +++ b/contrib/ncurses/misc/makellib @@ -0,0 +1,168 @@ +#!/bin/sh +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 1998,2000 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996,1997,2000 +# +# $Id: makellib,v 1.11 2021/09/04 15:49:38 tom Exp $ +# System-dependent wrapper for 'lint' that creates a lint-library via the +# following method (XXX is the name of the library): +# a. If the file llib-lXXX doesn't exist, create it using the make-rule +# b. Process llib-lXXX with the system's lint utility, making +# llib-lXXX.ln +# c. Install llib-lXXX.ln in the lib directory. +# +# Using the intermediate file llib-lXXX bypasses a weakness of lint (passing +# through warning messages from the original source-files). +# +# There are two drawbacks to this approach: +# a. On a few systems, you'll have to manually-edit the llib-lXXX file +# to get a usable lint-library (not all C-preprocessors work well). +# b. The system's lint utility won't recognize -lXXX as a lint-library +# (Use tdlint as a wrapper; it is designed for this). +# +# Parameters: +# $1 = library name +# $* = C-preprocessor options +# +ARCH=`uname -s` +if test "x$ARCH" = "xSunOS" ; then + case `uname -r` in + 5.*) ARCH=Solaris + ;; + esac +fi +# +DST="$HOME/lib/$ARCH/lint" +OPT="" +LLIB="" +llib="" +# +while test $# != 0 +do + case $1 in + -L*) + DST="$DST `echo "$1"|sed -e 's/^-L//'`" + ;; + -*) + OPT="$OPT $1" + ;; + *) + if test -z "$LLIB" + then + LLIB=$1 + else + llib=llib-l$1 + fi + ;; + esac + shift +done + +if test -z "$LLIB" +then + echo '? no library name specified' + exit 1 +elif test -z "$llib" +then + llib="llib-l$LLIB" +fi + +if test ! -f "$llib" ; then + if ( make "$llib" ) + then + : + else + exit 1 + fi +fi + +rm -f "$llib.ln" "$llib.c" +TARGET=$LLIB + +case "$ARCH" in +AIX) + CREATE="-uvxo$LLIB -Nn4000" + TARGET=$llib.c + ln "$llib" "$TARGET" + ;; +Solaris) + CREATE="-C$llib" + TARGET=$llib.c + ln "$llib" "$TARGET" + ;; +FreeBSD) + CREATE="-g -z -C$LLIB" + TARGET=$llib.c + ln "$llib" "$TARGET" + ;; +CLIX) + CREATE="-DLINTLIBRARY -vxo$LLIB" + TARGET=$llib.c + ln "$llib" "$TARGET" + ;; +IRIX*) + CREATE="-DLINTLIBRARY -vxyo$LLIB" + TARGET=$llib.c + ln "$llib" "$TARGET" + ;; +UNIX_SV) + CREATE="-DLINTLIBRARY -vxyo$LLIB" + TARGET=$llib.c + ln "$llib" "$TARGET" + ;; +*) + echo "Sorry. I do not know how to build a lint-library for $ARCH" + exit 1 +esac + +echo OPT "$OPT" +echo TARGET "$TARGET" +echo LIBNAME "$llib" +if ( lint "$CREATE" "$OPT" "$TARGET" ) +then + if test -f "$llib.ln" + then + for p in $HOME/lib $HOME/lib/$ARCH $HOME/lib/$ARCH/lint + do + if test ! -d "$p" + then + mkdir "$p" + fi + done + for p in $DST + do + cp "$llib.ln" "$p/" + done + rm -f "$llib.ln" + fi +fi +if test "x$TARGET" = "x$llib.c" ; then + rm -f "$TARGET" +fi diff --git a/contrib/ncurses/misc/menu.def b/contrib/ncurses/misc/menu.def new file mode 100644 index 00000000..01f973c2 --- /dev/null +++ b/contrib/ncurses/misc/menu.def @@ -0,0 +1,81 @@ +LIBRARY menu5 INITINSTANCE TERMINSTANCE +DESCRIPTION "NCurses-5-1-20000704, module menu" +CODE LOADONCALL +DATA LOADONCALL NONSHARED MULTIPLE +EXPORTS + "_nc_Calculate_Item_Length_and_Width" @11 NONAME + "_nc_Connect_Items" @38 NONAME + "_nc_Default_Item" @63 NONAME + "_nc_Default_Menu" @64 NONAME + "_nc_Disconnect_Items" @65 NONAME + "_nc_Draw_Menu" @66 NONAME + "_nc_Link_Items" @67 NONAME + "_nc_Match_Next_Character_In_Item_Name" @68 NONAME + "_nc_New_TopRow_and_CurrentItem" @69 NONAME + "_nc_Post_Item" @70 NONAME + "_nc_Show_Menu" @71 NONAME + "_nc_menu_cursor_pos" @72 NONAME + "current_item" @2 NONAME + "free_item" @23 NONAME + "free_menu" @24 NONAME + "item_count" @25 NONAME + "item_description" @14 NONAME + "item_index" @26 NONAME + "item_init" @7 NONAME + "item_name" @15 NONAME + "item_opts" @5 NONAME + "item_opts_off" @27 NONAME + "item_opts_on" @28 NONAME + "item_term" @8 NONAME + "item_userptr" @18 NONAME + "item_value" @60 NONAME + "item_visible" @61 NONAME + "menu_back" @20 NONAME + "menu_driver" @29 NONAME + "menu_fore" @21 NONAME + "menu_format" @62 NONAME + "menu_grey" @22 NONAME + "menu_init" @9 NONAME + "menu_items" @1 NONAME + "menu_mark" @16 NONAME + "menu_opts" @6 NONAME + "menu_opts_off" @30 NONAME + "menu_opts_on" @31 NONAME + "menu_pad" @32 NONAME + "menu_pattern" @17 NONAME + "menu_request_by_name" @73 NONAME + "menu_request_name" @74 NONAME + "menu_spacing" @75 NONAME + "menu_sub" @12 NONAME + "menu_term" @10 NONAME + "menu_userptr" @19 NONAME + "menu_win" @13 NONAME + "new_item" @3 NONAME + "new_menu" @4 NONAME + "pos_menu_cursor" @33 NONAME + "post_menu" @34 NONAME + "scale_menu" @35 NONAME + "set_current_item" @36 NONAME + "set_item_init" @37 NONAME + "set_item_opts" @39 NONAME + "set_item_term" @40 NONAME + "set_item_userptr" @41 NONAME + "set_item_value" @42 NONAME + "set_menu_back" @43 NONAME + "set_menu_fore" @44 NONAME + "set_menu_format" @45 NONAME + "set_menu_grey" @46 NONAME + "set_menu_init" @47 NONAME + "set_menu_items" @48 NONAME + "set_menu_mark" @49 NONAME + "set_menu_opts" @50 NONAME + "set_menu_pad" @51 NONAME + "set_menu_pattern" @52 NONAME + "set_menu_spacing" @76 NONAME + "set_menu_sub" @53 NONAME + "set_menu_term" @54 NONAME + "set_menu_userptr" @55 NONAME + "set_menu_win" @56 NONAME + "set_top_row" @57 NONAME + "top_row" @58 NONAME + "unpost_menu" @59 NONAME diff --git a/contrib/ncurses/misc/menu.ref b/contrib/ncurses/misc/menu.ref new file mode 100644 index 00000000..cee964f7 --- /dev/null +++ b/contrib/ncurses/misc/menu.ref @@ -0,0 +1,73 @@ +LIBRARY MENU2 INITINSTANCE +DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - menu library' +EXPORTS + "menu_items" @1 ;NONAME + "current_item" @2 ;NONAME + "new_item" @3 ;NONAME + + "new_menu" @4 ;NONAME + + "item_opts" @5 ;NONAME + "menu_opts" @6 ;NONAME + + "item_init" @7 ;NONAME + "item_term" @8 ;NONAME + "menu_init" @9 ;NONAME + "menu_term" @10 ;NONAME + + "menu_sub" @12 ;NONAME + "menu_win" @13 ;NONAME + + "item_description" @14 ;NONAME + "item_name" @15 ;NONAME + "menu_mark" @16 ;NONAME + "menu_pattern" @17 ;NONAME + + "item_userptr" @18 ;NONAME + "menu_userptr" @19 ;NONAME + + "menu_back" @20 ;NONAME + "menu_fore" @21 ;NONAME + "menu_grey" @22 ;NONAME + + "free_item" @23 ;NONAME + "free_menu" @24 ;NONAME + "item_count" @25 ;NONAME + "item_index" @26 ;NONAME + "item_opts_off" @27 ;NONAME + "item_opts_on" @28 ;NONAME + "menu_driver" @29 ;NONAME + "menu_opts_off" @30 ;NONAME + "menu_opts_on" @31 ;NONAME + "menu_pad" @32 ;NONAME + "pos_menu_cursor" @33 ;NONAME + "post_menu" @34 ;NONAME + "scale_menu" @35 ;NONAME + "set_current_item" @36 ;NONAME + "set_item_init" @37 ;NONAME + "set_item_opts" @39 ;NONAME + "set_item_term" @40 ;NONAME + "set_item_userptr" @41 ;NONAME + "set_item_value" @42 ;NONAME + "set_menu_back" @43 ;NONAME + "set_menu_fore" @44 ;NONAME + "set_menu_format" @45 ;NONAME + "set_menu_grey" @46 ;NONAME + "set_menu_init" @47 ;NONAME + "set_menu_items" @48 ;NONAME + "set_menu_mark" @49 ;NONAME + "set_menu_opts" @50 ;NONAME + "set_menu_pad" @51 ;NONAME + "set_menu_pattern" @52 ;NONAME + "set_menu_sub" @53 ;NONAME + "set_menu_term" @54 ;NONAME + "set_menu_userptr" @55 ;NONAME + "set_menu_win" @56 ;NONAME + "set_top_row" @57 ;NONAME + "top_row" @58 ;NONAME + "unpost_menu" @59 ;NONAME + + "item_value" @60 ;NONAME + "item_visible" @61 ;NONAME + + "menu_format" @62 ;NONAME diff --git a/contrib/ncurses/misc/ncu2openbsd b/contrib/ncurses/misc/ncu2openbsd new file mode 100755 index 00000000..0c3365d7 --- /dev/null +++ b/contrib/ncurses/misc/ncu2openbsd @@ -0,0 +1,1288 @@ +#!/usr/bin/env perl +# $Id: ncu2openbsd,v 1.67 2023/09/09 15:59:17 tom Exp $ +# ----------------------------------------------------------------------------- +# Copyright 2021,2023 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# https://invisible-island.net/ncurses/ncurses-openbsd.html +# +# Update the OpenBSD source-tree given an ncurses tarball or build-tree. + +use strict; +use warnings; + +use Getopt::Std; +use Cwd; +use Cwd 'abs_path'; +use File::Path qw/ remove_tree /; +use File::Temp qw/ tempdir /; + +$| = 1; + +our ( $opt_d, $opt_n, $opt_r, $opt_t, $opt_v, $opt_x, $opt_6 ); +our $source_dir; +our $target_dir; +our $update_dir; +our $backup_dir; + +our $tempdir = tempdir( CLEANUP => 1 ); +my $current = getcwd; +my $working = $current; + +our $generated_by = "generated by: ncu2openbsd"; + +our %setup_dir = qw( + lib/libcurses ncurses + lib/libform form + lib/libmenu menu + lib/libpanel panel + usr.bin/infocmp progs + usr.bin/tabs progs + usr.bin/tic progs + usr.bin/toe progs + usr.bin/tput progs + usr.bin/tset progs + share/termtypes misc +); + +our %generated = qw( + codes.c 1 + comp_captab.c 1 + comp_userdefs.c 1 + expanded.c 1 + fallback.c 1 + init_keytry.h 1 + keys.list 1 + lib_gen.c 1 + lib_keyname.c 1 + make_hash 1 + make_keys 1 + names.c 1 + termsort.c 1 + unctrl.c 1 +); + +our %definitions = qw( + CAPTOINFO captoinfo + DATADIR /usr/share + INFOCMP infocmp + INFOTOCAP infotocap + NCURSES_MAJOR 5 + NCURSES_MINOR 7 + NCURSES_OSPEED int + NCURSES_PATCH 20081102 + TERMINFO /usr/share/terminfo + TIC tic + TOE toe + TPUT tput + TSET tset +); + +sub patchdate() { + return $definitions{"NCURSES_PATCH"}; +} + +sub failed($) { + chdir $current; + printf STDERR "? %s\n", $_[0]; + exit; +} + +sub verbose($) { + my $text = shift; + printf "%s\n", $text if ($opt_v); +} + +sub read_file($) { + my $name = shift; + open( my $fp, $name ) || &failed("cannot open $name"); + my (@input) = <$fp>; + chomp @input; + close($fp); + return @input; +} + +sub read_dir($) { + my $path = shift; + my @result; + if ( opendir( my $dh, $path ) ) { + my @data = sort readdir($dh); + closedir $dh; + for my $d ( 0 .. $#data ) { + next if ( $data[$d] =~ /^\.(\.)?$/ ); + next if ( -l $path . "/" . $data[$d] ); + $result[ $#result + 1 ] = $data[$d]; + } + } + return @result; +} + +sub rename_dir($$) { + my $src = shift; + my $dst = shift; + printf "%% mv %s -> %s\n", $src, $dst if ($opt_v); + rename $src, $dst unless ($opt_n); +} + +sub check_sourcedir($) { + my $path = shift; + &failed("not a directory: $path") unless ( -d $path ); + my $full = abs_path($path); + chdir $full; + &failed("not an ncurses source-tree: $path") + unless ( -f "NEWS" and -f "dist.mk" ); + $source_dir = $full; +} + +sub unpack($) { + my $path = shift; + my $full = abs_path($path); + my $command = ""; + if ( $path =~ /\.tgz$/ or $path =~ /\.tar\.gz$/ ) { + $command = "tar xzf %s"; + } + elsif ( $path =~ /\.zip$/ ) { + $command = "unzip -q %s"; + } + else { + &failed("not a gzip'd tarball or zip-file: $path"); + } + chdir $tempdir; + system( sprintf( $command, $full ) ); + + # there should be exactly one subdirectory -- the source-tree + my @data = &read_dir("."); + &failed("found no subdirectories of $path") if ( $#data < 0 ); + &failed( "too many subdirectories: " . $data[0] . " vs " . $data[1] ) + if ( $#data > 0 ); + &check_sourcedir( $data[0] ); +} + +sub remove_dir($) { + my $tree = shift; + if ( -d $tree ) { + printf "%% rm -rf %s\n", $tree if ($opt_v); + remove_tree( $tree, $opt_v ? 1 : 0, 1 ) unless ($opt_n); + } +} + +sub copy_CVS($) { + my $leaf = shift; + my $src = $target_dir . $leaf . "/CVS"; + my $dst = $update_dir . $leaf . "/CVS"; + my $verbose = $opt_v ? "v" : ""; + if ( -d $src and !-d $dst ) { + my $mid = $update_dir . $leaf; + mkdir $mid unless ( -d $mid ); + mkdir $dst unless ( -d $dst ); + system("cp -a$verbose $src/* $dst/"); + } +} + +sub is_tic_code($) { + my $item = shift; + my $result = 0; + $result = 1 + if ( + $item =~ /^(capconvert + |tic + |dump + |progs + |termsort + |transform + |MKtermsort)/x + ); + return $result; +} + +sub is_ident($$) { + my $name = shift; + my $text = shift; + my $code = 0; + $code = 1 if ( $text =~ /\$$name:.*\$/ ); + return $code; +} + +# We "could", filter out differences with ident's using the diff -I option, +# but in practice, that is cumbersome. +sub munge_ident($) { + my $target = shift; + my $source = $target; + $source =~ s/\.update\b//; + &failed("bug at $source") if ( $source eq $target ); + return unless ( -f $source ); + my @source = &read_file($source); + my @target = &read_file($target); + my $old_id = ""; + my $gap_id = 0; + my $new_id = ""; + my $skipit = -1; + + for my $n ( 0 .. $#source ) { + if ( &is_ident( "OpenBSD", $source[$n] ) ) { + $old_id = $source[$n]; + $skipit = $n + 1; + } + elsif ( &is_ident( "Id", $source[$n] ) ) { + $new_id = $source[$n]; + last; + } + elsif ( $n == $skipit ) { + $source[$n] =~ s/\s+$//; + if ( $source[$n] eq "" ) { + $gap_id = $source[$n]; + } + elsif ( $source[$n] eq '.\"' ) { + $gap_id = $source[$n]; + } + } + } + if ( $old_id ne "" ) { + my @update; + my $tables = &uses_tables($target); + $update[ $#update + 1 ] = $target[0] if ($tables); + $update[ $#update + 1 ] = $old_id; + $update[ $#update + 1 ] = $gap_id unless ( $gap_id eq 0 ); + for my $n ( $tables .. $#target ) { + if ( &is_ident( "Id", $target[$n] ) ) { + $update[ $#update + 1 ] = $new_id; + } + else { + $update[ $#update + 1 ] = $target[$n]; + } + } + system("chmod u+w $target"); + if ( open my $fp, ">", $target ) { + for my $n ( 0 .. $#update ) { + printf $fp "%s\n", $update[$n]; + } + close $fp; + system("chmod u-w $target"); + } + } +} + +# ncurses manual pages provide for renaming the utilities, normally as part of +# the scripts provided in its sources. OpenBSD developers do not use those. +sub munge_docs($) { + my $path = shift; + my @data = &read_file($path); + my $done = 0; + for my $n ( 0 .. $#data ) { + my $text = $data[$n]; + $text =~ s/\b1M\b/1/g; + $text =~ s/\b3X\b/3/g; + $text =~ s/\bcurs_(term(info|cap)\s*3\b)/$1/g; + $text =~ s/(\\fB)curs_(term(info|cap)\\f[RP]\(3\))/$1$2/g; + my $left = ""; + while ( $text =~ /@[[:alnum:]_]+@/ ) { + my $next = index( $text, "@" ); + last if ( $next < 0 ); + $left .= substr( $text, 0, $next++ ); + $text = substr( $text, $next ); + $next = index( $text, "@" ); + last if ( $next < 0 ); + my $word = substr( $text, 0, $next ); + if ( $word =~ /^[[:alnum:]_]+/ ) { + + if ( $definitions{$word} ) { + $word = $definitions{$word}; + } + else { + $word = "?"; + } + $left .= $word; + $text = substr( $text, $next + 1 ); + } + else { + &failed("unexpected definition @$word@"); + } + } + $text = $left . $text; + if ( $text ne $data[$n] ) { + $done++; + $data[$n] = $text; + } + } + if ($done) { + system("chmod u+w $path"); + if ( open my $fp, ">", $path ) { + for my $n ( 0 .. $#data ) { + printf $fp "%s\n", $data[$n]; + } + close $fp; + system("chmod u-w $path"); + } + } +} + +sub copy_file($$) { + my $src = shift; + my $dst = shift; + my $verbose = $opt_v ? "v" : ""; + if ( -d $dst ) { + my $leaf = $src; + $leaf =~ s,^.*/,,; + $dst .= "/" . $leaf; + } + system("chmod u+w $dst") if ( -f $dst ); + system("cp -a$verbose $src $dst"); + &munge_ident($dst); +} + +sub copy_code($) { + my $src = shift; + my $dst = shift; + ©_CVS( substr( $dst, length($update_dir) ) ); + printf ".. copying files for $dst\n"; + my @data = &read_dir($src); + printf ".. %d entries\n", $#data + 1; + my $verbose = $opt_v ? "v" : ""; + for my $d ( 0 .. $#data ) { + my $item = $data[$d]; + my $src_item = $src . "/" . $item; + next if ( -d $src_item ); + next if ( -l $src_item ); + next if ( $item =~ /^\.(\.)?$/ ); + next if ( $item =~ /\.(bak|in|log|status)$/ ); + next if ( $item =~ /^llib-/ ); + next if ( $item =~ /^modules/ ); + next if ( $item =~ /^[fm]_trace\.c/ and not $opt_t ); + next + if ( $item =~ /^Makefile/ and index( $update_dir, "/share/" ) < 0 ); + next if ( $item =~ /^README/ ); + next if ( $item eq "headers" ); + next if ( $generated{$item} ); + next if ( $item eq "link_test.c" ); + + if ( index( $dst, "/usr.bin/" ) >= 0 ) { + next if ( $item =~ /^(clear)/ ); # OpenBSD uses "tput clear" + my $prog = $dst; + $prog =~ s%^.*/%%; + $prog =~ s/(update|backup)//; + $prog .= "c"; + if ( $dst =~ /infocmp/ ) { + next if ( $item ne $prog ); + } + elsif ( $dst =~ /tabs/ ) { + next if ( $item ne $prog ); + } + elsif ( $dst =~ /tic/ ) { + next if ( &is_tic_code($item) == 0 ); + } + elsif ( $dst =~ /toe/ ) { + next if ( $item ne $prog ); + } + elsif ( $dst =~ /tput/ ) { + next if ( $item ne $prog ); + } + elsif ( $dst =~ /tset/ ) { + next if ( $item ne $prog ); + } + else { + next; + } + } + system( sprintf( "cp -a$verbose %s %s/%s", $src_item, $dst, $item ) ); + &munge_ident("$dst/$item"); + } +} + +# Checking if nroff supports tables is a long-obsolete issue, and is not really +# necessary, except to match OpenBSD's source-tree. +sub uses_tables($) { + my $docs = shift; + my @docs = &read_file($docs); + my $code = 0; + for my $n ( 0 .. $#docs ) { + if ( $docs[$n] =~ /^[.']\\"\s+t\b.*/ ) { + $code = 1; + last; + } + elsif ( $docs[$n] =~ /^\./ ) { + last; + } + } + return $code; +} + +sub copy_1doc($$) { + my $docs = shift; + my $src = "$source_dir/man/$docs"; + my $dst = "$update_dir/$docs"; + $src .= "m" if ( -f "${src}m" ); + $dst =~ s/x$//; + if ( $dst =~ /\.3/ ) { + $dst =~ s/\bncurses/curses/ if ( $dst =~ /ncurses\./ ); + $dst =~ s/\bcurs_// if ( $dst =~ /_term(cap|info)\./ ); + } + ©_file( $src, $dst ); + &munge_docs($dst); +} + +sub copy_docs($) { + my $docs = shift; + if ( index( $update_dir, "/usr.bin/" ) >= 0 ) { + ©_1doc( $docs . ".1" ); + if ( $docs eq "tic" ) { + ©_1doc("captoinfo.1"); + ©_1doc("infotocap.1"); + } + } + else { + my @docs = &read_dir("$source_dir/man"); + if ( $docs eq "curses" ) { + for my $n ( 0 .. $#docs ) { + next if ( $docs[$n] eq "Makefile" ); + next if ( $docs[$n] eq "make_sed.sh" ); + next if ( $docs[$n] eq "man_db.renames" ); + next if ( $docs[$n] eq "manlinks.sed" ); + next if ( $docs[$n] =~ /\.(1|head|tail|in)/ ); + next if ( $docs[$n] =~ /^(form|menu|mitem|panel)/ ); + ©_1doc( $docs[$n] ); + } + } + elsif ( $docs eq "form" ) { + for my $n ( 0 .. $#docs ) { + next unless ( $docs[$n] =~ /^form/ ); + ©_1doc( $docs[$n] ); + } + } + elsif ( $docs eq "menu" ) { + for my $n ( 0 .. $#docs ) { + next unless ( $docs[$n] =~ /^(menu|mitem)/ ); + ©_1doc( $docs[$n] ); + } + } + elsif ( $docs eq "panel" ) { + for my $n ( 0 .. $#docs ) { + next unless ( $docs[$n] =~ /^panel/ ); + ©_1doc( $docs[$n] ); + } + } + } +} + +sub setup_dir($) { + my $dst = shift; + &failed("no definition for $dst") + unless ( defined $setup_dir{$dst} or $opt_r ); + $target_dir = sprintf( "%s/%s", $opt_d, $dst ); + $update_dir = $target_dir . ".update"; + $backup_dir = $target_dir . ".backup"; + my $result = 0; + if ($opt_r) { + &remove_dir($update_dir); + if ( $target_dir =~ /\/(tabs|toe)$/ ) { + &remove_dir($target_dir); + } + elsif ( -d $backup_dir ) { + &remove_dir($target_dir); + &rename_dir( $backup_dir, $target_dir ); + } + } + else { + &remove_dir($update_dir); + mkdir $update_dir; + + # reuse the shared-library version, assuming ABI=5 would involve at + # most a minor-version bump. + ©_file( "$target_dir/shlib_version", $update_dir ) + if ( $dst =~ /^lib\// ); + ©_code( $source_dir . "/" . $setup_dir{$dst}, $update_dir ) + unless ( $setup_dir{$dst} eq "misc" ); + $result = 1; + } + return $result; +} + +sub do_build($) { + my $command = shift; + printf "%% %s\n", $command if ($opt_v); + system($command); +} + +sub finish_dir() { + printf "** $target_dir\n"; + system("diff -Naurb $target_dir $update_dir | diffstat -n 30") + if ( -d $target_dir ); + if ($opt_n) { + &do_build("cd $update_dir && make -n") if ($opt_x); + } + else { + if ( -d $backup_dir ) { + printf STDERR "? backup directory exists: %s\n", $backup_dir; + } + else { + &rename_dir( $target_dir, $backup_dir ); + &rename_dir( $update_dir, $target_dir ); + } + &do_build("cd $target_dir && make") if ($opt_x); + } +} + +################################################################################ + +sub only_c_files($) { + my @data = @{ $_[0] }; + my %data; + for my $n ( 0 .. $#data ) { + my $text = $data[$n]; + $data{$text}++ if ( $text =~ /\.c$/ ); + } + return sort keys %data; +} + +sub makefile_list($$$) { + my @data = @{ $_[0] }; + my $name = $_[1]; + my $skip = $_[2]; + my %data; + my $state = 0; + for my $n ( 0 .. $#data ) { + my $text = $data[$n]; + $text =~ s/^\s+//; + next if ( index( $text, $skip ) == 0 ); + $text =~ s/\s+=/=/; + $text =~ s/=\s+/=/; + $text =~ s/\s*\\//; + $state = 1 if ( $text =~ /^${name}=/ ); + next unless ( $state == 1 ); + + if ( index( $text, "(trace)" ) >= 0 and not $opt_t ) { + next unless ( $text =~ /\b(lib_trace|visbuf)\.c$/ ); + } + if ( not $opt_t ) { + next if ( $text =~ /\b[fm]_trace\.c$/ ); + } + $text =~ s/^.*=//; + $text =~ s/\$o/.o/g; + $text =~ s/^.*\///; + next if ( $text eq "link_test.c" ); + next if ( $text eq "mf_common.h" ); + next if ( $text eq "transform.h" ); + $data{$text}++ if ( $text ne "" ); + last if ( $data[$n] !~ /\\$/ ); + } + return sort keys %data; +} + +sub manpage_list($) { + my $path = shift; + my @data = &read_dir($path); + my %data; + for my $n ( 0 .. $#data ) { + my $text = $data[$n]; + $data{$text}++ if ( $text =~ /\.\d$/ ); + } + return sort keys %data; +} + +sub columns_of($) { + my $string = shift; + my $result = 0; + for my $n ( 0 .. length($string) - 1 ) { + my $c = substr( $string, $n, 1 ); + if ( $c eq "\t" ) { + $result |= 7; + $result++; + } + elsif ( $c eq "\n" ) { + $result = 0; + } + else { + ++$result; + } + } + return $result; +} + +sub format_list($$) { + my $name = $_[0]; + my @data = @{ $_[1] }; + my $keep = ( defined $_[2] ) ? 1 : 0; + my $base; + my $fill; + if ( length($name) >= 9 ) { + $fill = " "; + $base = length($name) + 1; + } + else { + $base = 9; + $fill = "\t"; + } + my $result = sprintf( "%s%s", $name, $fill ); + if ( $keep == 0 ) { + my %data; + for my $n ( 0 .. $#data ) { + $data{ $data[$n] } = 1 if ( defined $data[$n] ); + } + @data = sort keys %data; + } + for my $n ( 0 .. $#data ) { + my $data = $data[$n]; + my $col = &columns_of($result); + my $add = 1 + length($data); + if ( ( $col + $add ) > 76 ) { + $result .= " " if ( $col > $base ); + $base = 9; + $fill = "\t"; + $result .= "\\\n" . $fill . $data; + } + else { + $result .= " " if ( $col > $base ); + $result .= $data; + } + } + return $result; +} + +################################################################################ + +sub compare_makefiles($) { + if ($opt_v) { + my $newfile = shift; + my $bakfile = + ( -d $backup_dir ? $backup_dir : $target_dir ) . "/Makefile"; + system("diff -u $bakfile $newfile") if ( -f $bakfile ); + } +} + +# The curses makefile has to build build-time utilities and generate source. +sub gen_1st_makefile() { + my $libname = "curses"; + my $oldfile = "$source_dir/n$libname/Makefile"; + my @oldfile = &read_file($oldfile); + + my $newfile = "$update_dir/Makefile"; + open( my $fp, ">", $newfile ) || &failed("cannot open $newfile"); + my @subdirs = ( + '${.CURDIR}/base', '${.CURDIR}/tinfo', + '${.CURDIR}/tty', '${.CURDIR}/widechar' + ); + $subdirs[ $#subdirs + 1 ] = '${.CURDIR}/trace' if ($opt_t); + printf $fp < lib_gen.c + +init_keytry.h: make_keys keys.list + ./make_keys keys.list > \${.TARGET} + +make_keys: \${.CURDIR}/tinfo/make_keys.c \${.CURDIR}/curses.priv.h names.c + \${HOSTCC} \${LDSTATIC} \${HOSTCFLAGS} \${HOSTLDFLAGS} \\ + -o \${.TARGET} \${.CURDIR}/tinfo/make_keys.c \${LDADD} +EOF + + if ( &patchdate >= 20090808 ) { + printf $fp <= 20190309 ) { + printf $fp < \${.TARGET} +EOF + } + printf $fp < \${.TARGET} + +comp_captab.c: make_hash + sh \${.CURDIR}/tinfo/MKcaptab.sh \${AWK} \${USE_BIG_STRINGS} \\ + \${.CURDIR}/tinfo/MKcaptab.awk \${CAPLIST} > \${.TARGET} + +lib_keyname.c: keys.list \${.CURDIR}/base/MKkeyname.awk + \${AWK} -f \${.CURDIR}/base/MKkeyname.awk \\ + bigstrings=\${USE_BIG_STRINGS} \\ + keys.list > \${.TARGET} + +names.c: \${.CURDIR}/tinfo/MKnames.awk + \${AWK} -f \${.CURDIR}/tinfo/MKnames.awk \\ + bigstrings=\${USE_BIG_STRINGS} \\ + \${CAPLIST} > \${.TARGET} +codes.c: \${.CURDIR}/tinfo/MKcodes.awk + \${AWK} -f \${.CURDIR}/tinfo/MKcodes.awk \\ + bigstrings=\${USE_BIG_STRINGS} \\ + \${CAPLIST} > \${.TARGET} + +unctrl.c: \${.CURDIR}/base/MKunctrl.awk + echo | \${AWK} -f \${.CURDIR}/base/MKunctrl.awk bigstrings=1 > \${.TARGET} + +.include + +# Link libtermlib, libtermcap to libcurses so we don't break people's Makefiles +afterinstall: + -cd \${DESTDIR}\${LIBDIR}; \\ + for i in \${_LIBS}; do \\ + ln -f \$\$i `echo \$\$i | sed 's/curses/termlib/'`; \\ + ln -f \$\$i `echo \$\$i | sed 's/curses/termcap/'`; \\ + ln -f \$\$i `echo \$\$i | sed 's/curses/ncurses/'`; \\ + ln -f \$\$i `echo \$\$i | sed 's/curses/ncursesw/'`; \\ + done + +.include +EOF + close $fp; + &compare_makefiles($newfile); +} + +sub gen_lib_makefile($) { + my $libname = shift; + my $oldfile = "$source_dir/$libname/Makefile"; + my @oldfile = &read_file($oldfile); + + # in ncurses, header-files are quasi-generated, because the original + # header file for form/menu/panel lives in the source-directory, but is + # copied to the include-directory with "make sources". + my @headers = &makefile_list( \@oldfile, "AUTO_SRC", "?" ); + + # The C source is more straightforward. + my @sources = &makefile_list( \@oldfile, "C_SRC", "?" ); + my $newfile = "$update_dir/Makefile"; + open( my $fp, ">", $newfile ) || &failed("cannot open $newfile"); + printf $fp <", $newfile ) || &failed("cannot open $newfile"); + my @sources = ("$binname.c"); + my @links = (); + my @autosrc = &makefile_list( \@oldfile, "AUTO_SRC", "?" ); + + my $tput_ver = 0; + my $use_dump_entry = 0; + my $use_termsort = 0; + my $use_tparm_type = 0; + my $use_transform = 0; + + $use_dump_entry = 1 if ( $binname eq "infocmp" or $binname eq "tic" ); + $use_termsort = 1 if ( $use_dump_entry or $binname eq "tput" ); + + if ( &patchdate >= 20090314 ) { + $use_transform = 1 if ( $binname =~ /^(tic|tput|tset)/ ); + } + if ( &patchdate >= 20140521 ) { + $use_tparm_type = 1 if ( $binname =~ /^(tic|tput)$/ ); + } + if ( &patchdate >= 20160806 ) { + $tput_ver = &patchdate; + } + + $sources[ ++$#sources ] = "dump_entry.c" if ($use_dump_entry); + $sources[ ++$#sources ] = "tparm_type.c" if ($use_tparm_type); + $sources[ ++$#sources ] = "transform.c" if ($use_transform); + + $autosrc[ ++$#autosrc ] = "termsort.c" if ($use_termsort); + + # transform.h also is generated, but OpenBSD checked-in a copy + + if ( $binname eq "tic" ) { + $links[ ++$#links ] = "captoinfo"; + $links[ ++$#links ] = "infotocap"; + } + elsif ( $binname eq "tabs" ) { + $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 ); + } + elsif ( $binname eq "tput" ) { + $sources[ ++$#sources ] = "clear_cmd.c" if ( $tput_ver >= 20161022 ); + $sources[ ++$#sources ] = "reset_cmd.c" if ( $tput_ver >= 20160806 ); + $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 ); + $links[ ++$#links ] = "clear"; + } + elsif ( $binname eq "tset" ) { + $sources[ ++$#sources ] = "reset_cmd.c" if ( $tput_ver >= 20160806 ); + $sources[ ++$#sources ] = "tty_settings.c" if ( $tput_ver >= 20161224 ); + $links[ ++$#links ] = "reset"; + } + + printf $fp <= 20110625 ); + ©_file( "$source_dir/include/nc_string.h", $update_dir ) + if ( &patchdate >= 20120222 ); + ©_file( "$source_dir/include/nc_access.h", $update_dir ) + if ( &patchdate >= 20210626 ); + ©_file( "$source_dir/include/Caps-ncurses", $update_dir ) + if ( &patchdate >= 20190302 ); + &gen_1st_makefile; + &finish_dir; + } +} + +sub setup_lib_libform() { + if ( &setup_dir("lib/libform") ) { + ©_docs("form"); + &gen_lib_makefile("form"); + &finish_dir; + } +} + +sub setup_lib_libmenu() { + if ( &setup_dir("lib/libmenu") ) { + ©_docs("menu"); + &gen_lib_makefile("menu"); + &finish_dir; + } +} + +sub setup_lib_libpanel() { + if ( &setup_dir("lib/libpanel") ) { + ©_docs("panel"); + &gen_lib_makefile("panel"); + &finish_dir; + } +} + +sub setup_bin_infocmp() { + if ( &setup_dir("usr.bin/infocmp") ) { + ©_docs("infocmp"); + &gen_bin_makefile("infocmp"); + &finish_dir; + } +} + +sub setup_bin_tabs() { + if ( &setup_dir("usr.bin/tabs") ) { + ©_docs("tabs"); + &gen_bin_makefile("tabs"); + &finish_dir; + } +} + +sub setup_bin_tic() { + if ( &setup_dir("usr.bin/tic") ) { + if ( &patchdate >= 20140521 ) { + ©_file( "$source_dir/progs/tparm_type.c", $update_dir ); + ©_file( "$source_dir/progs/tparm_type.h", $update_dir ); + } + + # shared files for tput/tset + if ( &patchdate >= 20160806 ) { + ©_file( "$source_dir/progs/reset_cmd.c", $update_dir ); + ©_file( "$source_dir/progs/reset_cmd.h", $update_dir ); + } + if ( &patchdate >= 20161022 ) { + ©_file( "$source_dir/progs/clear_cmd.c", $update_dir ); + ©_file( "$source_dir/progs/clear_cmd.h", $update_dir ); + } + if ( &patchdate >= 20161224 ) { + ©_file( "$source_dir/progs/tty_settings.c", $update_dir ); + ©_file( "$source_dir/progs/tty_settings.h", $update_dir ); + } + ©_docs("tic"); + &gen_bin_makefile("tic"); + &finish_dir; + } +} + +sub setup_bin_toe() { + if ( &setup_dir("usr.bin/toe") ) { + ©_docs("toe"); + &gen_bin_makefile("toe"); + &finish_dir; + } +} + +sub setup_bin_tput() { + if ( &setup_dir("usr.bin/tput") ) { + ©_docs("tput"); + &gen_bin_makefile("tput"); + &finish_dir; + } +} + +sub setup_bin_tset() { + if ( &setup_dir("usr.bin/tset") ) { + ©_docs("tset"); + &gen_bin_makefile("tset"); + &finish_dir; + } +} + +sub setup_terminfo() { + if ( &setup_dir("share/termtypes") ) { + ©_code( $target_dir, $update_dir ); + ©_file( "$source_dir/misc/terminfo.src", + "$update_dir/termtypes.master" ); + + # build the terminfo database using the in-tree tic. + # This is always best practice, but for ncurses 6.2 in particular is + # required. + my $prog = abs_path("$target_dir/../../usr.bin/tic"); + my $libs = abs_path("$target_dir/../../lib/libcurses"); + if ( defined $prog and defined $libs ) { + $prog .= "/tic"; + &verbose(".. changing makefile to use in-tree tic"); + system( "sed -i -E " + . "-e 's,(TIC=).*,\\1\t$prog,' " + . "-e 's,(\\\${TIC}),LD_LIBRARY_PATH=$libs \\1,' " + . "$update_dir/Makefile" ); + } + &finish_dir; + } +} + +sub configure_tree() { + return if ( -f "ncurses/Makefile" ); + my @search = ( "/usr/share/terminfo", "/usr/local/share/terminfo" ); + my @prefix = ("./configure"); + $prefix[ ++$#prefix ] = "--with-abi-version=5" + if ( &patchdate >= 20150502 && !$opt_6 ); + my @options = ( + "--with-ospeed=int", # + "--with-shared", # + "--without-normal", # + "--without-debug", # + "--with-terminfo-dirs=" . join( ':', @search ), # + "--without-ada", # + "--disable-hard-tabs", # + "--enable-const", # + "--enable-getcap", # + "--enable-bsdpad", # + "--enable-signed-char", # + "--enable-termcap", # + "--enable-widec", # + "--disable-setuid-environ" + ); + $options[ ++$#options ] = "--with-trace" if ($opt_t); + $options[ ++$#options ] = "--enable-string-hacks" + if ( &patchdate >= 20120225 ); + system( join( ' ', @prefix ) . ' ' . join( ' ', @options ) ); + &failed("problem with configuring") unless ( -f "ncurses/Makefile" ); + + system("make sources"); + + # OpenBSD developers edit the generated file and do not regen it when + # doing upgrades. This script reflects those edits. + system( "sed -i" . " -E" + . " -e '/TYPEOF_CHTYPE/s,int,long,'" + . " -e '/USE_TERMCAP/d'" + . " -e '/HAVE_LIB(FORM|MENU|PANEL)/s,^(.*)\$,/* \\1 */,'" + . " -e 's/TERMPATH.*/PURE_TERMINFO 0/'" + . " -e '/SYSTEM_NAME/s,\[0-9.\]+,,'" + . " include/ncurses_cfg.h" ); +} + +sub get_definitions() { + my @data = &read_file("dist.mk"); + for my $n ( 0 .. $#data ) { + my $text = $data[$n]; + $text =~ s/^\s*//; + next unless ( $text =~ /^NCURSES.*=/ ); + $text =~ s/\s*=\s+/=/; + my $name = $text; + $name =~ s/=.*//; + my $value = $text; + $value =~ s/^[^=]*=//; + $value =~ s/\s.*//; + $definitions{$name} = $value; + } +} + +sub setup_all_dirs() { + printf "** %s all build-directories\n", $opt_r ? "removing" : "setting up"; + &get_definitions; + &configure_tree unless ($opt_r); + &setup_lib_libcurses; + &setup_lib_libmenu; + &setup_lib_libform; # build after libmenu, for mf_common.h + &setup_lib_libpanel; + &setup_bin_tic; # do this first, for shared headers + &setup_bin_infocmp; + &setup_bin_tabs if ( -f "$source_dir/progs/tabs.c" ); + &setup_bin_toe; + &setup_bin_tput; + &setup_bin_tset; + &setup_terminfo; +} + +sub usage() { + print < +if [ x@WITH_OVERWRITE@ = xno ]; then + includesubdir="@includedir@/${THIS}" + case $includedir in + $prefix/include/ncurses@LIB_SUFFIX@@EXTRA_SUFFIX@) + includedir=`echo "$includedir" | sed -e 's,/[^/]*$,,'` + ;; + esac +else + includesubdir="@includedir@" +fi + +LIBS="@LIBS@" +if [ "@TINFO_NAME@" = "@LIB_NAME@" ]; then + LIBS="-l${THIS} $LIBS" +else + LIBS="-l${THIS} -l${TINFO_LIB} $LIBS" +fi + +CFLAGS="@PKG_CFLAGS@" +if [ "$includesubdir" != "/usr/include" ]; then + CFLAGS="$CFLAGS -I${includesubdir}" + if [ "$includedir" != "/usr/include" ]; then + [ x@WITH_OVERWRITE@ = xno ] && CFLAGS="$CFLAGS -I${includedir}" + fi +fi + +# Ignore -L options which do not correspond to an actual directory, or which +# are standard library directories (i.e., the linker is supposed to search +# those directories). +# +# There is no portable way to find the list of standard library directories. +# Require a POSIX shell anyway, to keep this simple. +lib_flags= +for opt in -L$libdir @EXTRA_PKG_LDFLAGS@ $LIBS +do + case $opt in + -specs*) # ignore linker specs-files which were used to build library + continue + ;; + -Wl,-z*) # ignore flags used to manipulate shared image + continue + ;; + -Wl,--dynamic-linker*) # ignore ELF interpreter + continue + ;; + -Wl,--as-needed|-Wl,--build-id=*|-Wl,-dT,*|-Wl,-T,*) + continue + ;; + -L*) + lib_check=`echo "x$opt" | sed -e 's/^.-L//'` + [ -d "$lib_check" ] || continue + case "$lib_check" in + @LD_SEARCHPATH@) # skip standard libdir + if [ "$lib_check" = "$libdir" ] + then + lib_first=no + IFS_save="$IFS" + IFS='|' + LIBDIRS="@LD_SEARCHPATH@" + for lib_check in $LIBDIRS + do + if [ -d "$lib_check" ] + then + if [ "$lib_check" = "$libdir" ] + then + lib_first=yes + break + fi + fi + done + IFS="$IFS_save" + [ $lib_first = yes ] && continue + found=no + for check in $lib_flags + do + if [ "x$check" = "x$opt" ] + then + found=yes + break + fi + done + [ $found = yes ] && continue + : + else + continue + fi + ;; + *) + found=no + for check in $lib_flags + do + if [ "x$check" = "x$opt" ] + then + found=yes + break + fi + done + [ $found = yes ] && continue + ;; + esac + ;; + esac + lib_flags="$lib_flags $opt" +done + +[ $# = 0 ] && exec @SHELL@ "$0" --error + +while [ $# -gt 0 ]; do + case "$1" in + # basic configuration + --prefix) + echo "$prefix" + ;; + --exec-prefix) + echo "$exec_prefix" + ;; + # compile/link + --cflags) + OPTS= + for opt in $CFLAGS + do + case "x$opt" in + x-[fgOW]*) + opt= + ;; + esac + if [ -n "$opt" ] + then + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="$OPTS$opt" + fi + done + printf "%s\n" "$OPTS" + ;; + --cflags-only-I) + OPTS= + for opt in $CFLAGS + do + case "x$opt" in + x-[I]*) + ;; + *) + opt= + ;; + esac + if [ -n "$opt" ] + then + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="$OPTS$opt" + fi + done + printf "%s\n" "$OPTS" + ;; + --cflags-only-other) + OPTS= + for opt in $CFLAGS + do + case "x$opt" in + x-[I]*|x-[fgOW]*) + opt= + ;; + esac + if [ -n "$opt" ] + then + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="$OPTS$opt" + fi + done + printf "%s\n" "$OPTS" + ;; + --libs) + OPTS= + for opt in $lib_flags + do + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="${OPTS}${opt}" + done + printf '%s\n' "$OPTS" + ;; + --libs-only-L) + OPTS= + for opt in $lib_flags + do + case "x$opt" in + x-L*) + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="${OPTS}${opt}" + ;; + esac + done + printf '%s\n' "$OPTS" + ;; + --libs-only-l) + OPTS= + for opt in $lib_flags + do + case "x$opt" in + x-l*) + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="${OPTS}${opt}" + ;; + esac + done + printf '%s\n' "$OPTS" + ;; + --libs-only-other) + OPTS= + for opt in $lib_flags + do + case "x$opt" in + x-[lL]*) + ;; + *) + [ -n "$OPTS" ] && OPTS="$OPTS " + OPTS="${OPTS}${opt}" + ;; + esac + done + printf '%s\n' "$OPTS" + ;; + # identification + --version) + echo "@NCURSES_MAJOR@.@NCURSES_MINOR@.@NCURSES_PATCH@" + ;; + --abi-version) + echo "@cf_cv_abi_version@" + ;; + --mouse-version) + echo "@NCURSES_MOUSE_VERSION@" + ;; + # locations + --bindir) + echo "${bindir}" + ;; + --datadir) + echo "${datadir}" + ;; + --includedir) + INCS= + if [ "x@WITH_OVERWRITE@" = xno ]; then + INCS="${includesubdir}" + elif [ "${includedir}" != /usr/include ]; then + INCS="${includedir}" + fi + echo "$INCS" + ;; + --libdir) + echo "${libdir}" + ;; + --mandir) + echo "${mandir}" + ;; + --terminfo) + echo "@TERMINFO@" + ;; + --terminfo-dirs) + echo "@TERMINFO_DIRS@" + ;; + --termpath) + echo "@TERMPATH@" + ;; + # general info + --help) + cat <&2 + exit 1 + ;; + esac + shift +done +# vi:ts=4 sw=4 +# vile:shmode diff --git a/contrib/ncurses/misc/ncurses.def b/contrib/ncurses/misc/ncurses.def new file mode 100644 index 00000000..fa50456f --- /dev/null +++ b/contrib/ncurses/misc/ncurses.def @@ -0,0 +1,447 @@ +LIBRARY ncurses5 INITINSTANCE TERMINSTANCE +DESCRIPTION "NCurses-5-1-20000704, module ncurses" +CODE LOADONCALL +DATA LOADONCALL NONSHARED MULTIPLE +EXPORTS + "BC" @662 NONAME + "COLORS" @503 NONAME + "COLOR_PAIR" @36 NONAME + "COLOR_PAIRS" @504 NONAME + "COLS" @511 NONAME + "ESCDELAY" @513 NONAME + "LINES" @510 NONAME + "PAIR_NUMBER" @209 NONAME + "PC" @660 NONAME + "SP" @1003 NONAME + "TABSIZE" @512 NONAME + "UP" @661 NONAME + "_nc_access" @6 NONAME + "_nc_add_to_try" @7 NONAME + "_nc_align_termtype" @8 NONAME + "_nc_background" @9 NONAME + "_nc_baudrate" @10 NONAME + "_nc_cap_hash_table" @805 NONAME + "_nc_capalias_table" @806 NONAME + "_nc_capcmp" @707 NONAME + "_nc_captoinfo" @829 NONAME + "_nc_check_termtype" @15 NONAME + "_nc_comment_end" @819 NONAME + "_nc_comment_start" @818 NONAME + "_nc_copy_entry" @16 NONAME + "_nc_copy_termtype" @22 NONAME + "_nc_curr_col" @816 NONAME + "_nc_curr_file_pos" @817 NONAME + "_nc_curr_line" @815 NONAME + "_nc_curr_token" @803 NONAME + "_nc_disable_period" @23 NONAME + "_nc_do_color" @1037 NONAME + "_nc_doalloc" @25 NONAME + "_nc_entry_match" @710 NONAME + "_nc_err_abort" @826 NONAME + "_nc_expand_try" @27 NONAME + "_nc_expanded" @51 NONAME + "_nc_fallback" @625 NONAME + "_nc_find_entry" @809 NONAME + "_nc_find_type_entry" @810 NONAME + "_nc_first_name" @622 NONAME + "_nc_flush" @54 NONAME + "_nc_free_entries" @712 NONAME + "_nc_free_termtype" @58 NONAME + "_nc_freeall" @59 NONAME + "_nc_freewin" @60 NONAME + "_nc_get_hash_table" @63 NONAME + "_nc_get_table" @808 NONAME + "_nc_get_token" @811 NONAME + "_nc_get_tty_mode" @65 NONAME + "_nc_get_type" @823 NONAME + "_nc_getenv_num" @67 NONAME + "_nc_has_mouse" @73 NONAME + "_nc_hash_map" @84 NONAME + "_nc_head" @700 NONAME + "_nc_home_terminfo" @91 NONAME + "_nc_info_hash_table" @804 NONAME + "_nc_infoalias_table" @807 NONAME + "_nc_infotocap" @830 NONAME + "_nc_init_acs" @92 NONAME + "_nc_init_entry" @702 NONAME + "_nc_init_keytry" @93 NONAME + "_nc_keep_tic_dir" @95 NONAME + "_nc_key_names" @96 NONAME + "_nc_keypad" @1024 NONAME + "_nc_make_oldhash" @97 NONAME + "_nc_makenew" @1025 NONAME + "_nc_memmove" @98 NONAME + "_nc_merge_entry" @704 NONAME + "_nc_msec_cost" @103 NONAME + "_nc_mvcur_init" @1014 NONAME + "_nc_mvcur_resume" @106 NONAME + "_nc_mvcur_wrap" @1015 NONAME + "_nc_name_match" @623 NONAME + "_nc_nulls_sent" @116 NONAME + "_nc_oldnums" @117 NONAME + "_nc_ospeed" @118 NONAME + "_nc_outch" @1026 NONAME + "_nc_outstr" @1033 NONAME + "_nc_panelhook" @119 NONAME + "_nc_panic_mode" @814 NONAME + "_nc_parse_entry" @706 NONAME + "_nc_printf_string" @120 NONAME + "_nc_push_token" @812 NONAME + "_nc_read_entry" @620 NONAME + "_nc_read_entry_source" @709 NONAME + "_nc_read_file_entry" @621 NONAME + "_nc_read_termcap" @127 NONAME + "_nc_remove_key" @129 NONAME + "_nc_remove_string" @130 NONAME + "_nc_render" @1027 NONAME + "_nc_reset_input" @813 NONAME + "_nc_resolve_uses" @711 NONAME + "_nc_ripoffline" @132 NONAME + "_nc_save_str" @703 NONAME + "_nc_screen_chain" @137 NONAME + "_nc_screen_init" @142 NONAME + "_nc_screen_resume" @143 NONAME + "_nc_screen_wrap" @144 NONAME + "_nc_scroll_oldhash" @145 NONAME + "_nc_scroll_optimize" @1029 NONAME + "_nc_scroll_window" @1030 NONAME + "_nc_scrolln" @146 NONAME + "_nc_set_buffer" @147 NONAME + "_nc_set_source" @822 NONAME + "_nc_set_tty_mode" @148 NONAME + "_nc_set_type" @824 NONAME + "_nc_set_writedir" @152 NONAME + "_nc_setupscreen" @1031 NONAME + "_nc_sigaction" @158 NONAME + "_nc_signal_handler" @1034 NONAME + "_nc_slk_format" @159 NONAME + "_nc_slk_initialize" @160 NONAME + "_nc_start_line" @821 NONAME + "_nc_suppress_warnings" @828 NONAME + "_nc_synchook" @1035 NONAME + "_nc_syntax" @820 NONAME + "_nc_syserr_abort" @825 NONAME + "_nc_tail" @701 NONAME + "_nc_tic_dir" @161 NONAME + "_nc_tic_expand" @162 NONAME + "_nc_tic_written" @167 NONAME + "_nc_timed_wait" @1036 NONAME + "_nc_tinfo_fkeys" @169 NONAME + "_nc_tracing" @1010 NONAME + "_nc_trans_string" @170 NONAME + "_nc_user_definable" @172 NONAME + "_nc_visbuf" @1012 NONAME + "_nc_visbuf2" @178 NONAME + "_nc_vsscanf" @183 NONAME + "_nc_waddch_nosync" @1028 NONAME + "_nc_warning" @827 NONAME + "_nc_wrap_entry" @705 NONAME + "_nc_write_entry" @708 NONAME + "acs_map" @506 NONAME + "addch" @1 NONAME + "addchnstr" @2 NONAME + "addchstr" @3 NONAME + "addnstr" @4 NONAME + "addstr" @5 NONAME + "assume_default_colors" @184 NONAME + "attr_get" @14 NONAME + "attr_off" @185 NONAME + "attr_on" @186 NONAME + "attr_set" @17 NONAME + "attroff" @11 NONAME + "attron" @12 NONAME + "attrset" @13 NONAME + "baudrate" @18 NONAME + "beep" @19 NONAME + "bkgd" @20 NONAME + "bkgdset" @21 NONAME + "boolcodes" @601 NONAME + "boolfnames" @602 NONAME + "boolnames" @600 NONAME + "border" @24 NONAME + "box" @26 NONAME + "can_change_color" @28 NONAME + "cbreak" @29 NONAME + "chgat" @30 NONAME + "clear" @31 NONAME + "clearok" @32 NONAME + "clrtobot" @33 NONAME + "clrtoeol" @34 NONAME + "color_content" @35 NONAME + "color_set" @187 NONAME + "copywin" @37 NONAME + "cur_term" @515 NONAME + "curs_set" @38 NONAME + "curscr" @501 NONAME + "curses_version" @188 NONAME + "def_prog_mode" @39 NONAME + "def_shell_mode" @40 NONAME + "define_key" @189 NONAME + "del_curterm" @641 NONAME + "delay_output" @41 NONAME + "delch" @42 NONAME + "deleteln" @45 NONAME + "delscreen" @43 NONAME + "delwin" @44 NONAME + "derwin" @46 NONAME + "doupdate" @47 NONAME + "dupwin" @48 NONAME + "echo" @49 NONAME + "echochar" @50 NONAME + "endwin" @52 NONAME + "erase" @193 NONAME + "erasechar" @53 NONAME + "filter" @55 NONAME + "flash" @56 NONAME + "flushinp" @57 NONAME + "getbkgd" @211 NONAME + "getch" @61 NONAME + "getmouse" @356 NONAME + "getnstr" @62 NONAME + "getstr" @64 NONAME + "getwin" @66 NONAME + "halfdelay" @68 NONAME + "has_colors" @69 NONAME + "has_ic" @70 NONAME + "has_il" @71 NONAME + "has_key" @234 NONAME + "hline" @72 NONAME + "idcok" @74 NONAME + "idlok" @75 NONAME + "immedok" @76 NONAME + "inch" @77 NONAME + "inchnstr" @78 NONAME + "inchstr" @79 NONAME + "init_color" @81 NONAME + "init_pair" @82 NONAME + "initscr" @80 NONAME + "innstr" @83 NONAME + "insch" @85 NONAME + "insdelln" @86 NONAME + "insertln" @87 NONAME + "insnstr" @88 NONAME + "insstr" @89 NONAME + "instr" @90 NONAME + "intrflush" @94 NONAME + "is_linetouched" @100 NONAME + "is_wintouched" @101 NONAME + "isendwin" @99 NONAME + "keybound" @238 NONAME + "keyname" @102 NONAME + "keyok" @240 NONAME + "keypad" @104 NONAME + "killchar" @105 NONAME + "leaveok" @107 NONAME + "longname" @108 NONAME + "mcprint" @242 NONAME + "meta" @109 NONAME + "mouse_trafo" @251 NONAME + "mouseinterval" @360 NONAME + "mousemask" @358 NONAME + "move" @110 NONAME + "mvaddch" @111 NONAME + "mvaddchnstr" @112 NONAME + "mvaddchstr" @113 NONAME + "mvaddnstr" @114 NONAME + "mvaddstr" @115 NONAME + "mvchgat" @121 NONAME + "mvcur" @122 NONAME + "mvdelch" @123 NONAME + "mvderwin" @124 NONAME + "mvgetch" @125 NONAME + "mvgetnstr" @126 NONAME + "mvgetstr" @128 NONAME + "mvhline" @131 NONAME + "mvinch" @133 NONAME + "mvinchnstr" @134 NONAME + "mvinchstr" @135 NONAME + "mvinnstr" @136 NONAME + "mvinsch" @138 NONAME + "mvinsnstr" @139 NONAME + "mvinsstr" @140 NONAME + "mvinstr" @141 NONAME + "mvprintw" @149 NONAME + "mvscanw" @150 NONAME + "mvvline" @151 NONAME + "mvwaddch" @153 NONAME + "mvwaddchnstr" @154 NONAME + "mvwaddchstr" @155 NONAME + "mvwaddnstr" @156 NONAME + "mvwaddstr" @157 NONAME + "mvwchgat" @163 NONAME + "mvwdelch" @164 NONAME + "mvwgetch" @165 NONAME + "mvwgetnstr" @166 NONAME + "mvwgetstr" @168 NONAME + "mvwhline" @171 NONAME + "mvwin" @173 NONAME + "mvwinch" @174 NONAME + "mvwinchnstr" @175 NONAME + "mvwinchstr" @176 NONAME + "mvwinnstr" @177 NONAME + "mvwinsch" @179 NONAME + "mvwinsnstr" @180 NONAME + "mvwinsstr" @181 NONAME + "mvwinstr" @182 NONAME + "mvwprintw" @190 NONAME + "mvwscanw" @191 NONAME + "mvwvline" @192 NONAME + "napms" @194 NONAME + "newpad" @195 NONAME + "newscr" @502 NONAME + "newterm" @196 NONAME + "newwin" @197 NONAME + "nl" @198 NONAME + "nocbreak" @199 NONAME + "nodelay" @200 NONAME + "noecho" @201 NONAME + "nonl" @202 NONAME + "noqiflush" @203 NONAME + "noraw" @204 NONAME + "notimeout" @205 NONAME + "numcodes" @604 NONAME + "numfnames" @605 NONAME + "numnames" @603 NONAME + "ospeed" @663 NONAME + "overlay" @206 NONAME + "overwrite" @207 NONAME + "pair_content" @208 NONAME + "pechochar" @210 NONAME + "pnoutrefresh" @212 NONAME + "prefresh" @213 NONAME + "printw" @214 NONAME + "putp" @215 NONAME + "putwin" @216 NONAME + "qiflush" @217 NONAME + "raw" @218 NONAME + "redrawwin" @219 NONAME + "refresh" @220 NONAME + "reset_prog_mode" @222 NONAME + "reset_shell_mode" @223 NONAME + "resetty" @221 NONAME + "resizeterm" @263 NONAME + "restartterm" @643 NONAME + "ripoffline" @224 NONAME + "savetty" @225 NONAME + "scanw" @226 NONAME + "scr_dump" @227 NONAME + "scr_init" @228 NONAME + "scr_restore" @232 NONAME + "scr_set" @233 NONAME + "scrl" @229 NONAME + "scroll" @230 NONAME + "scrollok" @231 NONAME + "set_curterm" @640 NONAME + "set_term" @236 NONAME + "setscrreg" @235 NONAME + "setupterm" @644 NONAME + "slk_attr" @266 NONAME + "slk_attr_set" @270 NONAME + "slk_attroff" @237 NONAME + "slk_attron" @239 NONAME + "slk_attrset" @241 NONAME + "slk_clear" @243 NONAME + "slk_color" @272 NONAME + "slk_init" @244 NONAME + "slk_label" @245 NONAME + "slk_noutrefresh" @246 NONAME + "slk_refresh" @247 NONAME + "slk_restore" @248 NONAME + "slk_set" @249 NONAME + "slk_touch" @250 NONAME + "standend" @253 NONAME + "standout" @252 NONAME + "start_color" @254 NONAME + "stdscr" @500 NONAME + "strcodes" @608 NONAME + "strfnames" @609 NONAME + "strnames" @606 NONAME + "subpad" @255 NONAME + "subwin" @256 NONAME + "syncok" @257 NONAME + "termattrs" @258 NONAME + "termname" @259 NONAME + "tgetent" @645 NONAME + "tgetflag" @646 NONAME + "tgetnum" @647 NONAME + "tgetstr" @648 NONAME + "tgoto" @649 NONAME + "tigetflag" @260 NONAME + "tigetnum" @261 NONAME + "tigetstr" @262 NONAME + "timeout" @274 NONAME + "tparm" @653 NONAME + "tputs" @655 NONAME + "ttytype" @514 NONAME + "typeahead" @264 NONAME + "unctrl" @361 NONAME + "ungetch" @265 NONAME + "ungetmouse" @357 NONAME + "untouchwin" @267 NONAME + "use_default_colors" @276 NONAME + "use_env" @268 NONAME + "use_extended_names" @278 NONAME + "vidattr" @269 NONAME + "vidputs" @271 NONAME + "vline" @273 NONAME + "vw_printw" @284 NONAME + "vw_scanw" @285 NONAME + "vwprintw" @275 NONAME + "vwscanw" @277 NONAME + "waddch" @279 NONAME + "waddchnstr" @280 NONAME + "waddchstr" @281 NONAME + "waddnstr" @282 NONAME + "waddstr" @283 NONAME + "wattr_get" @291 NONAME + "wattr_off" @293 NONAME + "wattr_on" @292 NONAME + "wattr_set" @286 NONAME + "wattroff" @289 NONAME + "wattron" @288 NONAME + "wattrset" @290 NONAME + "wbkgd" @295 NONAME + "wbkgdset" @296 NONAME + "wborder" @299 NONAME + "wchgat" @301 NONAME + "wclear" @302 NONAME + "wclrtobot" @303 NONAME + "wclrtoeol" @304 NONAME + "wcolor_set" @287 NONAME + "wcursyncup" @305 NONAME + "wdelch" @306 NONAME + "wdeleteln" @307 NONAME + "wechochar" @308 NONAME + "wenclose" @359 NONAME + "werase" @310 NONAME + "wgetch" @312 NONAME + "wgetnstr" @313 NONAME + "wgetstr" @315 NONAME + "whline" @318 NONAME + "winch" @320 NONAME + "winchnstr" @321 NONAME + "winchstr" @322 NONAME + "winnstr" @323 NONAME + "winsch" @325 NONAME + "winsdelln" @326 NONAME + "winsertln" @327 NONAME + "winsnstr" @328 NONAME + "winsstr" @329 NONAME + "winstr" @330 NONAME + "wmouse_trafo" @294 NONAME + "wmove" @338 NONAME + "wnoutrefresh" @339 NONAME + "wprintw" @340 NONAME + "wredrawln" @341 NONAME + "wrefresh" @342 NONAME + "wresize" @343 NONAME + "wscanw" @344 NONAME + "wscrl" @345 NONAME + "wsetscrreg" @346 NONAME + "wstandend" @348 NONAME + "wstandout" @347 NONAME + "wsyncdown" @349 NONAME + "wsyncup" @350 NONAME + "wtimeout" @351 NONAME + "wtouchln" @352 NONAME + "wvline" @354 NONAME diff --git a/contrib/ncurses/misc/ncurses.ref b/contrib/ncurses/misc/ncurses.ref new file mode 100644 index 00000000..cf4de7d5 --- /dev/null +++ b/contrib/ncurses/misc/ncurses.ref @@ -0,0 +1,572 @@ +LIBRARY ncurses2 INITINSTANCE +DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - base library' +EXPORTS +;************ +;* curses.h * +;************ + + "stdscr" @500 NONAME ; variable + "curscr" @501 NONAME ; variable + "newscr" @502 NONAME ; variable + "COLORS" @503 NONAME ; variable + "COLOR_PAIRS" @504 NONAME ; variable + "color_pairs" @505 NONAME ; variable + "acs_map" @506 NONAME ; variable + "LINES" @510 NONAME ; variable + "COLS" @511 NONAME ; variable + "TABSIZE" @512 NONAME ; variable + "ESCDELAY" @513 NONAME ; variable + "ttytype" @514 NONAME ; variable + "cur_term" @515 NONAME ; variable + + "addch" @1 NONAME ; generated + "addchnstr" @2 NONAME ; generated + "addchstr" @3 NONAME ; generated + "addnstr" @4 NONAME ; generated + "addstr" @5 NONAME ; generated +; "addnwstr" @6 NONAME ; missing +; "addwstr" @7 NONAME ; missing +; "add_wch" @8 NONAME ; missing +; "add_wchnstr" @9 NONAME ; missing +; "add_wchstr" @10 NONAME ; missing + "attroff" @11 NONAME ; generated + "attron" @12 NONAME ; generated + "attrset" @13 NONAME ; generated + "attr_get" @14 NONAME ; generated +; "attr_off" @15 NONAME ; implemented << NO!! +; "attr_on" @16 NONAME ; implemented << NO!! + "attr_set" @17 NONAME ; generated + "baudrate" @18 NONAME ; implemented + "beep" @19 NONAME ; implemented + "bkgd" @20 NONAME ; generated + "bkgdset" @21 NONAME ; generated +; "bkgrndset" @22 NONAME ; missing +; "bkgrnd" @23 NONAME ; missing + "border" @24 NONAME ; generated +; "border_set" @25 NONAME ; missing + "box" @26 NONAME ; generated +; "box_set" @27 NONAME ; missing + "can_change_color" @28 NONAME ; implemented + "cbreak" @29 NONAME ; implemented + "chgat" @30 NONAME ; generated + "clear" @31 NONAME ; generated + "clearok" @32 NONAME ; implemented + "clrtobot" @33 NONAME ; generated + "clrtoeol" @34 NONAME ; generated + "color_content" @35 NONAME ; implemented + "COLOR_PAIR" @36 NONAME ; generated + "copywin" @37 NONAME ; implemented + "curs_set" @38 NONAME ; implemented + "def_prog_mode" @39 NONAME ; implemented + "def_shell_mode" @40 NONAME ; implemented + "delay_output" @41 NONAME ; implemented + "delch" @42 NONAME ; generated + "delscreen" @43 NONAME ; implemented + "delwin" @44 NONAME ; implemented + "deleteln" @45 NONAME ; generated + "derwin" @46 NONAME ; implemented + "doupdate" @47 NONAME ; implemented + "dupwin" @48 NONAME ; implemented + "echo" @49 NONAME ; implemented + "echochar" @50 NONAME ; generated +; "echo_wchar" @51 NONAME ; missing + "endwin" @52 NONAME ; implemented + "erasechar" @53 NONAME ; implemented +; "erase_wchar" @54 NONAME ; missing + "filter" @55 NONAME ; implemented + "flash" @56 NONAME ; implemented + "flushinp" @57 NONAME ; implemented +; "getbkgd" @58 NONAME ; missing +; "getbkgrnd" @59 NONAME ; missing +; "getcchar" @60 NONAME ; missing + "getch" @61 NONAME ; generated + "getnstr" @62 NONAME ; generated +; "getn_wstr" @63 NONAME ; missing + "getstr" @64 NONAME ; generated +; "get_wch" @65 NONAME ; missing + "getwin" @66 NONAME ; not in XPG4 +; "get_wstr" @67 NONAME ; missing + "halfdelay" @68 NONAME ; implemented + "has_colors" @69 NONAME ; implemented + "has_ic" @70 NONAME ; implemented + "has_il" @71 NONAME ; implemented + "hline" @72 NONAME ; generated +; "hline_set" @73 NONAME ; missing + "idcok" @74 NONAME ; implemented + "idlok" @75 NONAME ; implemented + "immedok" @76 NONAME ; implemented + "inch" @77 NONAME ; generated + "inchnstr" @78 NONAME ; generated + "inchstr" @79 NONAME ; generated + "initscr" @80 NONAME ; implemented + "init_color" @81 NONAME ; implemented + "init_pair" @82 NONAME ; implemented + "innstr" @83 NONAME ; generated +; "innwstr" @84 NONAME ; missing + "insch" @85 NONAME ; generated + "insdelln" @86 NONAME ; generated + "insertln" @87 NONAME ; generated + "insnstr" @88 NONAME ; generated + "insstr" @89 NONAME ; generated + "instr" @90 NONAME ; generated +; "ins_nwstr" @91 NONAME ; missing +; "ins_wch" @92 NONAME ; missing +; "ins_wstr" @93 NONAME ; missing + "intrflush" @94 NONAME ; implemented +; "inwstr" @95 NONAME ; missing +; "in_wch" @96 NONAME ; missing +; "in_wchstr" @97 NONAME ; missing +; "in_wchntr" @98 NONAME ; missing + "isendwin" @99 NONAME ; implemented + "is_linetouched" @100 NONAME ; implemented + "is_wintouched" @101 NONAME ; implemented + "keyname" @102 NONAME ; implemented +; "key_name" @103 NONAME ; missing + "keypad" @104 NONAME ; implemented + "killchar" @105 NONAME ; implemented +; "killwchar" @106 NONAME ; missing + "leaveok" @107 NONAME ; implemented + "longname" @108 NONAME ; implemented + "meta" @109 NONAME ; implemented + "move" @110 NONAME ; generated + "mvaddch" @111 NONAME ; generated + "mvaddchnstr" @112 NONAME ; generated + "mvaddchstr" @113 NONAME ; generated + "mvaddnstr" @114 NONAME ; generated + "mvaddstr" @115 NONAME ; generated +; "mvaddnwstr" @116 NONAME ; missing +; "mvaddwstr" @117 NONAME ; missing +; "mvadd_wch" @118 NONAME ; missing +; "mvadd_wchnstr" @119 NONAME ; missing +; "mvadd_wchstr" @120 NONAME ; missing + "mvchgat" @121 NONAME ; generated + "mvcur" @122 NONAME ; implemented + "mvdelch" @123 NONAME ; generated + "mvderwin" @124 NONAME ; implemented + "mvgetch" @125 NONAME ; generated + "mvgetnstr" @126 NONAME ; generated +; "mvgetn_wstr" @127 NONAME ; missing + "mvgetstr" @128 NONAME ; generated +; "mvget_wch" @129 NONAME ; missing +; "mvget_wstr" @130 NONAME ; missing + "mvhline" @131 NONAME ; generated +; "mvhline_set" @132 NONAME ; missing + "mvinch" @133 NONAME ; generated + "mvinchnstr" @134 NONAME ; generated + "mvinchstr" @135 NONAME ; generated + "mvinnstr" @136 NONAME ; generated +; "mvinnwstr" @137 NONAME ; missing + "mvinsch" @138 NONAME ; generated + "mvinsnstr" @139 NONAME ; generated + "mvinsstr" @140 NONAME ; generated + "mvinstr" @141 NONAME ; generated +; "mvins_nwstr" @142 NONAME ; missing +; "mvins_wch" @143 NONAME ; missing +; "mvins_wstr" @144 NONAME ; missing +; "mvinwstr" @145 NONAME ; missing +; "mvin_wch" @146 NONAME ; missing +; "mvin_wchstr" @147 NONAME ; missing +; "mvin_wchntr" @148 NONAME ; missing + "mvprintw" @149 NONAME ; implemented + "mvscanw" @150 NONAME ; implemented + "mvvline" @151 NONAME ; generated +; "mvvline_set" @152 NONAME ; missing + "mvwaddch" @153 NONAME ; generated + "mvwaddchnstr" @154 NONAME ; generated + "mvwaddchstr" @155 NONAME ; generated + "mvwaddnstr" @156 NONAME ; generated + "mvwaddstr" @157 NONAME ; generated +; "mvwaddnwstr" @158 NONAME ; missing +; "mvwaddwstr" @159 NONAME ; missing +; "mvwadd_wch" @160 NONAME ; missing +; "mvwadd_wchnstr" @161 NONAME ; missing +; "mvwadd_wchstr" @162 NONAME ; missing + "mvwchgat" @163 NONAME ; generated + "mvwdelch" @164 NONAME ; generated + "mvwgetch" @165 NONAME ; generated + "mvwgetnstr" @166 NONAME ; generated +; "mvwgetn_wstr" @167 NONAME ; missing + "mvwgetstr" @168 NONAME ; generated +; "mvwget_wch" @169 NONAME ; missing +; "mvwget_wstr" @170 NONAME ; missing + "mvwhline" @171 NONAME ; generated +; "mvwhline_set" @172 NONAME ; missing + "mvwin" @173 NONAME ; implemented + "mvwinch" @174 NONAME ; generated + "mvwinchnstr" @175 NONAME ; generated + "mvwinchstr" @176 NONAME ; generated + "mvwinnstr" @177 NONAME ; generated +; "mvwinnwstr" @178 NONAME ; missing + "mvwinsch" @179 NONAME ; generated + "mvwinsnstr" @180 NONAME ; generated + "mvwinsstr" @181 NONAME ; generated + "mvwinstr" @182 NONAME ; generated +; "mvwins_nwstr" @183 NONAME ; missing +; "mvwins_wch" @184 NONAME ; missing +; "mvwins_wstr" @185 NONAME ; missing +; "mvwinwstr" @186 NONAME ; missing +; "mvwin_wch" @187 NONAME ; missing +; "mvwin_wchnstr" @188 NONAME ; missing +; "mvwin_wchstr" @189 NONAME ; missing + "mvwprintw" @190 NONAME ; implemented + "mvwscanw" @191 NONAME ; implemented + "mvwvline" @192 NONAME ; generated +; "mvwvline_set" @193 NONAME ; missing + "napms" @194 NONAME ; implemented + "newpad" @195 NONAME ; implemented + "newterm" @196 NONAME ; implemented + "newwin" @197 NONAME ; implemented + "nl" @198 NONAME ; implemented + "nocbreak" @199 NONAME ; implemented + "nodelay" @200 NONAME ; implemented + "noecho" @201 NONAME ; implemented + "nonl" @202 NONAME ; implemented + "noqiflush" @203 NONAME ; implemented + "noraw" @204 NONAME ; implemented + "notimeout" @205 NONAME ; implemented + "overlay" @206 NONAME ; implemented + "overwrite" @207 NONAME ; implemented + "pair_content" @208 NONAME ; implemented + "PAIR_NUMBER" @209 NONAME ; generated + "pechochar" @210 NONAME ; implemented +; "pecho_wchar" @211 NONAME ; missing + "pnoutrefresh" @212 NONAME ; implemented + "prefresh" @213 NONAME ; implemented + "printw" @214 NONAME ; implemented + "putp" @215 NONAME ; implemented + "putwin" @216 NONAME ; implemented + "qiflush" @217 NONAME ; implemented + "raw" @218 NONAME ; implemented + "redrawwin" @219 NONAME ; generated + "refresh" @220 NONAME ; generated + "resetty" @221 NONAME ; implemented + "reset_prog_mode" @222 NONAME ; implemented + "reset_shell_mode" @223 NONAME ; implemented + "ripoffline" @224 NONAME ; implemented + "savetty" @225 NONAME ; implemented + "scanw" @226 NONAME ; implemented + "scr_dump" @227 NONAME ; implemented + "scr_init" @228 NONAME ; implemented + "scrl" @229 NONAME ; generated + "scroll" @230 NONAME ; generated + "scrollok" @231 NONAME ; implemented + "scr_restore" @232 NONAME ; implemented + "scr_set" @233 NONAME ; implemented +; "setcchar" @234 NONAME ; missing + "setscrreg" @235 NONAME ; generated + "set_term" @236 NONAME ; implemented + "slk_attroff" @237 NONAME ; implemented +; "slk_attr_off" @238 NONAME ; missing + "slk_attron" @239 NONAME ; implemented +; "slk_attr_on" @240 NONAME ; missing + "slk_attrset" @241 NONAME ; implemented +; "slk_attr_set" @242 NONAME ; missing + "slk_clear" @243 NONAME ; implemented + "slk_init" @244 NONAME ; implemented + "slk_label" @245 NONAME ; implemented + "slk_noutrefresh" @246 NONAME ; implemented + "slk_refresh" @247 NONAME ; implemented + "slk_restore" @248 NONAME ; implemented + "slk_set" @249 NONAME ; implemented + "slk_touch" @250 NONAME ; implemented +; "slk_wset" @251 NONAME ; missing + "standout" @252 NONAME ; generated + "standend" @253 NONAME ; generated + "start_color" @254 NONAME ; implemented + "subpad" @255 NONAME ; implemented + "subwin" @256 NONAME ; implemented + "syncok" @257 NONAME ; implemented + "termattrs" @258 NONAME ; implemented + "termname" @259 NONAME ; implemented + "tigetflag" @260 NONAME ; implemented + "tigetnum" @261 NONAME ; implemented + "tigetstr" @262 NONAME ; implemented +; "timeout" @263 NONAME ; implemented << NO!! + "typeahead" @264 NONAME ; implemented + "ungetch" @265 NONAME ; implemented +; "unget_wch" @266 NONAME ; missing + "untouchwin" @267 NONAME ; generated + "use_env" @268 NONAME ; implemented + "vidattr" @269 NONAME ; implemented +; "vid_attr" @270 NONAME ; missing + "vidputs" @271 NONAME ; implemented +; "vid_puts" @272 NONAME ; missing + "vline" @273 NONAME ; generated +; "vline_set" @274 NONAME ; missing + "vwprintw" @275 NONAME ; implemented +; "vw_printw" @276 NONAME ; implemented << NO!! + "vwscanw" @277 NONAME ; implemented +; "vw_scanw" @278 NONAME ; implemented << NO!! + "waddch" @279 NONAME ; implemented + "waddchnstr" @280 NONAME ; implemented + "waddchstr" @281 NONAME ; generated + "waddnstr" @282 NONAME ; implemented + "waddstr" @283 NONAME ; generated +; "waddwstr" @284 NONAME ; missing +; "wadd_wch" @285 NONAME ; missing +; "wadd_wchnstr" @286 NONAME ; missing +; "wadd_wchstr" @287 NONAME ; missing + "wattron" @288 NONAME ; generated + "wattroff" @289 NONAME ; generated + "wattrset" @290 NONAME ; generated + "wattr_get" @291 NONAME ; generated + "wattr_on" @292 NONAME ; implemented + "wattr_off" @293 NONAME ; implemented +; "wattr_set" @294 NONAME ; implemented << NO!! + "wbkgd" @295 NONAME ; implemented + "wbkgdset" @296 NONAME ; generated +; "wbkgrndset" @297 NONAME ; missing +; "wbkgrnd" @298 NONAME ; missing + "wborder" @299 NONAME ; implemented +; "wborder_set" @300 NONAME ; missing + "wchgat" @301 NONAME ; implemented + "wclear" @302 NONAME ; implemented + "wclrtobot" @303 NONAME ; implemented + "wclrtoeol" @304 NONAME ; implemented + "wcursyncup" @305 NONAME ; implemented + "wdelch" @306 NONAME ; implemented + "wdeleteln" @307 NONAME ; generated + "wechochar" @308 NONAME ; implemented +; "wecho_wchar" @309 NONAME ; missing + "werase" @310 NONAME ; implemented +; "wgetbkgrnd" @311 NONAME ; missing + "wgetch" @312 NONAME ; implemented + "wgetnstr" @313 NONAME ; implemented +; "wgetn_wstr" @314 NONAME ; missing + "wgetstr" @315 NONAME ; generated +; "wget_wch" @316 NONAME ; missing +; "wget_wstr" @317 NONAME ; missing + "whline" @318 NONAME ; implemented +; "whline_set" @319 NONAME ; missing + "winch" @320 NONAME ; generated + "winchnstr" @321 NONAME ; implemented + "winchstr" @322 NONAME ; generated + "winnstr" @323 NONAME ; implemented +; "winnwstr" @324 NONAME ; missing + "winsch" @325 NONAME ; implemented + "winsdelln" @326 NONAME ; implemented + "winsertln" @327 NONAME ; generated + "winsnstr" @328 NONAME ; implemented + "winsstr" @329 NONAME ; generated + "winstr" @330 NONAME ; generated +; "wins_nwstr" @331 NONAME ; missing +; "wins_wch" @332 NONAME ; missing +; "wins_wstr" @333 NONAME ; missing +; "winwstr" @334 NONAME ; missing +; "win_wch" @335 NONAME ; missing +; "win_wchnstr" @336 NONAME ; missing +; "win_wchstr" @337 NONAME ; missing + "wmove" @338 NONAME ; implemented + "wnoutrefresh" @339 NONAME ; implemented + "wprintw" @340 NONAME ; implemented + "wredrawln" @341 NONAME ; implemented + "wrefresh" @342 NONAME ; implemented + "wresize" @343 NONAME ; implemented + "wscanw" @344 NONAME ; implemented + "wscrl" @345 NONAME ; implemented + "wsetscrreg" @346 NONAME ; implemented + "wstandout" @347 NONAME ; generated + "wstandend" @348 NONAME ; generated + "wsyncdown" @349 NONAME ; implemented + "wsyncup" @350 NONAME ; implemented + "wtimeout" @351 NONAME ; implemented + "wtouchln" @352 NONAME ; implemented +; "wunctrl" @353 NONAME ; missing + "wvline" @354 NONAME ; implemented +; "wvline_set" @355 NONAME ; missing + + "getmouse" @356 NONAME + "ungetmouse" @357 NONAME + "mousemask" @358 NONAME + "wenclose" @359 NONAME + "mouseinterval" @360 NONAME + +; from unctrl.h + "unctrl" @361 NONAME + +; publics for tracing + "_tracef" @400 NONAME + "_tracedump" @401 NONAME + "_traceattr" @402 NONAME + "_tracechar" @403 NONAME + "_tracemouse" @404 NONAME + "trace" @405 NONAME + +;********** +;* term.h * +;********** + "boolnames" @600 NONAME ; variable + "boolcodes" @601 NONAME ; variable + "boolfnames" @602 NONAME ; variable + "numnames" @603 NONAME ; variable + "numcodes" @604 NONAME ; variable + "numfnames" @605 NONAME ; variable + "strnames" @606 NONAME ; variable + "strcodes" @608 NONAME ; variable + "strfnames" @609 NONAME ; variable + +; internals + "_nc_read_entry" @620 NONAME + "_nc_read_file_entry" @621 NONAME + "_nc_first_name" @622 NONAME + "_nc_name_match" @623 NONAME + "_nc_read_termcap_entry" @624 NONAME + "_nc_fallback" @625 NONAME + +; entry points + "set_curterm" @640 NONAME + "del_curterm" @641 NONAME + +; entry points +; "putp" @642 NONAME ; already defined + "restartterm" @643 NONAME + "setupterm" @644 NONAME + "tgetent" @645 NONAME + "tgetflag" @646 NONAME + "tgetnum" @647 NONAME + "tgetstr" @648 NONAME + "tgoto" @649 NONAME +; "tigetflag" @650 NONAME ; already defined +; "tigetnum" @651 NONAME ; already defined +; "tigetstr" @652 NONAME ; already defined + "tparm" @653 NONAME + "tparam" @654 NONAME + "tputs" @655 NONAME + +;************* +;* termcap.h * +;************* +; the functions are already defined in term.h + "PC" @660 NONAME + "UP" @661 NONAME + "BC" @662 NONAME + "ospeed" @663 NONAME + +;**************** +;* term_entry.h * +;**************** + "_nc_head" @700 NONAME + "_nc_tail" @701 NONAME + +; alloc_entry.c: elementary allocation code + "_nc_init_entry" @702 NONAME + "_nc_save_str" @703 NONAME + "_nc_merge_entry" @704 NONAME + "_nc_wrap_entry" @705 NONAME + +; parse_entry.c: entry-parsing code + "_nc_parse_entry" @706 NONAME + "_nc_capcmp" @707 NONAME + +; write_entry.c: writing an entry to the file system + "_nc_write_entry" @708 NONAME + +; comp_parse.c: entry list handling + "_nc_read_entry_source" @709 NONAME + "_nc_entry_match" @710 NONAME + "_nc_resolve_uses" @711 NONAME + "_nc_free_entries" @712 NONAME + +;********* +;* tic.h * +;********* +; "_nc_tracing" @800 NONAME ; defined below +; "_nc_tracef" @801 NONAME ; missing +; "_nc_visbuf" @802 NONAME ; defined below + + "_nc_curr_token" @803 NONAME + + "_nc_info_hash_table" @804 NONAME + "_nc_cap_hash_table" @805 NONAME + + "_nc_capalias_table" @806 NONAME + "_nc_infoalias_table" @807 NONAME + "_nc_get_table" @808 NONAME + +; comp_hash.c: name lookup + "_nc_find_entry" @809 NONAME + "_nc_find_type_entry" @810 NONAME + +; comp_scan.c: lexical analysis + "_nc_get_token" @811 NONAME + "_nc_push_token" @812 NONAME + "_nc_reset_input" @813 NONAME + "_nc_panic_mode" @814 NONAME + "_nc_curr_line" @815 NONAME + "_nc_curr_col" @816 NONAME + "_nc_curr_file_pos" @817 NONAME + "_nc_comment_start" @818 NONAME + "_nc_comment_end" @819 NONAME + "_nc_syntax" @820 NONAME + "_nc_start_line" @821 NONAME + +; comp_error.c: warning & abort messages + "_nc_set_source" @822 NONAME + "_nc_get_type" @823 NONAME + "_nc_set_type" @824 NONAME + "_nc_syserr_abort" @825 NONAME + "_nc_err_abort" @826 NONAME + "_nc_warning" @827 NONAME + "_nc_suppress_warnings" @828 NONAME + +; captoinfo.c: capability conversion + "_nc_captoinfo" @829 NONAME + "_nc_infotocap" @830 NONAME + +; comp_main.c: compiler main +; "_nc_progname" @831 NONAME ; no need to export it + + +; ***************** +; NCurses internals -- just for progs/*.exe and the library itself. +; ***************** + +; For broken linkers +; "_nc_screen" @1000 NONAME +; "_nc_alloc_screen" @1001 NONAME +; "_nc_set_screen" @1002 NONAME + +; For not so broken linkers + "SP" @1003 NONAME + +; Who knows what this is for + "_slk_init" @1004 NONAME + "slk_initialize" @1005 NONAME + +; Tracing -- all functions used internally + "_nc_tracing" @1010 NONAME + "_nc_tputs_trace" @1011 NONAME + "_nc_visbuf" @1012 NONAME + +; lib_acs.c + "init_acs" @1013 NONAME + +; lib_mvcur.c + "_nc_mvcur_init" @1014 NONAME + "_nc_mvcur_wrap" @1015 NONAME + "_nc_mvcur_scrolln" @1016 NONAME + +; lib_mouse.c + "_nc_mouse_init" @1017 NONAME + "_nc_mouse_event" @1018 NONAME + "_nc_mouse_inline" @1019 NONAME + "_nc_mouse_parse" @1020 NONAME + "_nc_mouse_wrap" @1021 NONAME + "_nc_mouse_resume" @1022 NONAME + "_nc_max_click_interval" @1023 NONAME + +; elsewhere ... + "_nc_keypad" @1024 NONAME + "_nc_makenew" @1025 NONAME + "_nc_outch" @1026 NONAME + "_nc_render" @1027 NONAME + "_nc_waddch_nosync" @1028 NONAME + "_nc_scroll_optimize" @1029 NONAME + "_nc_scroll_window" @1030 NONAME + "_nc_setupscreen" @1031 NONAME + "_nc_backspace" @1032 NONAME + "_nc_outstr" @1033 NONAME + "_nc_signal_handler" @1034 NONAME + "_nc_synchook" @1035 NONAME + "_nc_timed_wait" @1036 NONAME + "_nc_do_color" @1037 NONAME diff --git a/contrib/ncurses/misc/ncurses.supp b/contrib/ncurses/misc/ncurses.supp new file mode 100644 index 00000000..29511ea7 --- /dev/null +++ b/contrib/ncurses/misc/ncurses.supp @@ -0,0 +1,206 @@ +# $Id: ncurses.supp,v 1.8 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2008 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# This is a warning-suppression file for valgrind and ncurses. +# +# ncurses can also be configured using the --disable-leaks option, which +# allows an application to call _nc_freeall() or _nc_free_and_exit(), to +# free all of ncurses' "permanent" memory. +# +# Some of these leaks can be freed if the application does its own cleanup, +# for example: +# delscreen(SP); +# del_curterm(cur_term); +# However, few applications do this. + +{ + ncurses_leak__nc_add_to_try + Memcheck:Leak + fun:*alloc + fun:_nc_add_to_try +} + +{ + ncurses_leak__nc_home_terminfo + Memcheck:Leak + fun:malloc + fun:_nc_home_terminfo +} + +{ + ncurses_leak__nc_init_wacs + Memcheck:Leak + fun:calloc + fun:_nc_init_wacs +} + +{ + ncurses_leak__nc_keyname + Memcheck:Leak + fun:calloc + fun:_nc_keyname +} + +{ + ncurses_leak__nc_keyname_2 + Memcheck:Leak + fun:malloc + fun:strdup + fun:_nc_keyname +} + +{ + ncurses_leak__nc_printf_string + Memcheck:Leak + fun:malloc + fun:_nc_doalloc + fun:_nc_printf_string +} + +{ + ncurses_leak__nc_read_termtype + Memcheck:Leak + fun:*alloc + fun:_nc_read_termtype + fun:_nc_read_file_entry +} + +{ + ncurses_leak__nc_read_termtype_2 + Memcheck:Leak + fun:*alloc + fun:_nc_doalloc + fun:_nc_read_termtype + fun:_nc_read_file_entry +} + +{ + ncurses_leak__nc_scroll_optimize + Memcheck:Leak + fun:*alloc + fun:_nc_hash_map + fun:_nc_scroll_optimize +} + +{ + ncurses_leak__nc_scroll_optimize_2 + Memcheck:Leak + fun:*alloc + fun:_nc_doalloc + fun:_nc_scroll_optimize +} + +{ + ncurses_leak__nc_setupscreen + Memcheck:Leak + fun:calloc + fun:_nc_setupscreen + fun:newterm +} + +{ + ncurses_leak__nc_setupscreen_2 + Memcheck:Leak + fun:calloc + fun:newwin + fun:_nc_setupscreen +} + +{ + ncurses_leak__nc_setupterm_1 + Memcheck:Leak + fun:malloc + fun:strdup + fun:_nc_setupterm +} + +{ + ncurses_leak__nc_setupterm + Memcheck:Leak + fun:calloc + fun:_nc_setupterm +} + +{ + ncurses_leak__nc_setupscreen_3 + Memcheck:Leak + fun:calloc + fun:_nc_makenew + fun:newwin + fun:_nc_setupscreen +} + +{ + ncurses_leak__nc_set_buffer + Memcheck:Leak + fun:malloc + fun:_nc_set_buffer +} + +{ + ncurses_leak__nc_tparm_analyze + Memcheck:Leak + fun:*alloc + fun:_nc_doalloc + fun:_nc_tparm_analyze +} + +{ + ncurses_leak__nc_trace_alloc + Memcheck:Leak + fun:*alloc + fun:_nc_doalloc + fun:_nc_trace_alloc +} + +{ + ncurses_leak_start_color + Memcheck:Leak + fun:calloc + fun:start_color +} + +{ + ncurses_leak_tparm + Memcheck:Leak + fun:realloc + fun:_nc_doalloc + fun:tparm +} + +{ + ncurses_leak_tparam_internal + Memcheck:Leak + fun:realloc + fun:_nc_doalloc + fun:get_space + fun:save_number + fun:tparam_internal +} diff --git a/contrib/ncurses/misc/panel.def b/contrib/ncurses/misc/panel.def new file mode 100644 index 00000000..30ce1d65 --- /dev/null +++ b/contrib/ncurses/misc/panel.def @@ -0,0 +1,20 @@ +LIBRARY panel5 INITINSTANCE TERMINSTANCE +DESCRIPTION "NCurses-5-1-20000704, module panel" +CODE LOADONCALL +DATA LOADONCALL NONSHARED MULTIPLE +EXPORTS + "bottom_panel" @7 NONAME + "del_panel" @5 NONAME + "hide_panel" @3 NONAME + "move_panel" @13 NONAME + "new_panel" @8 NONAME + "panel_above" @9 NONAME + "panel_below" @10 NONAME + "panel_hidden" @15 NONAME + "panel_userptr" @12 NONAME + "panel_window" @1 NONAME + "replace_panel" @14 NONAME + "set_panel_userptr" @11 NONAME + "show_panel" @4 NONAME + "top_panel" @6 NONAME + "update_panels" @2 NONAME diff --git a/contrib/ncurses/misc/panel.ref b/contrib/ncurses/misc/panel.ref new file mode 100644 index 00000000..e84045a1 --- /dev/null +++ b/contrib/ncurses/misc/panel.ref @@ -0,0 +1,18 @@ +LIBRARY panel2 INITINSTANCE +DESCRIPTION 'NCurses 1.9.9e-1 for OS/2 - panel library' +EXPORTS + "panel_window" @1 + "update_panels" @2 + "hide_panel" @3 + "show_panel" @4 + "del_panel" @5 + "top_panel" @6 + "bottom_panel" @7 + "new_panel" @8 + "panel_above" @9 + "panel_below" @10 + "set_panel_userptr" @11 + "panel_userptr" @12 + "move_panel" @13 + "replace_panel" @14 + "panel_hidden" @15 diff --git a/contrib/ncurses/misc/run_tic.in b/contrib/ncurses/misc/run_tic.in new file mode 100644 index 00000000..c4edb271 --- /dev/null +++ b/contrib/ncurses/misc/run_tic.in @@ -0,0 +1,213 @@ +#!@SHELL@ +# $Id: run_tic.in,v 1.41 2024/08/04 14:50:26 tom Exp $ +############################################################################## +# Copyright 2019-2022,2024 Thomas E. Dickey # +# Copyright 2000-2012,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# This script is used to install terminfo.src using tic. We use a script +# because the path checking is too awkward to do in a makefile. +# +# Assumes: +# The leaf directory names (lib, tabset, terminfo) +# +echo "** Building terminfo database, please wait..." +# +# The script is designed to be run from the misc/Makefile as +# make install.data + +# Symbols which are not overridden by misc/Makefile: +: "${prefix:=@prefix@}" +: "${exec_prefix:=@exec_prefix@}" +: "${top_srcdir:=@top_srcdir@}" +: "${srcdir:=@srcdir@}" +: "${datarootdir:=@datarootdir@}" +: "${datadir:=@datadir@}" +: "${cross_compiling:=@cross_compiling@}" +: "${suffix:=@EXEEXT@}" + +: "${ext_funcs:=@NCURSES_EXT_FUNCS@}" +: "${tic_path:=@TIC@}" +: "${ticdir:=@TERMINFO@}" +: "${tic_source:=@TERMINFO_SRC@}" + +# Symbols which $DESTDIR and/or install-prefix may affect: +: "${INSTALL_PREFIX:=$prefix}" +: "${BINDIR:=@bindir@}" +: "${TICDIR:=$ticdir}" + +# Allow tic to run either from the install-path, or from the build-directory. +# Do not do this if we appear to be cross-compiling. In that case, we rely +# on the host's copy of tic to compile the terminfo database. +if test "x$cross_compiling" = "xno" +then + if test -f ../progs/tic$suffix + then + case "$PATH" in + \@PATH_SEPARATOR@*) + PATH="../progs@PATH_SEPARATOR@../lib@PATH_SEPARATOR@${BINDIR}$PATH" + ;; + *) + PATH="../progs@PATH_SEPARATOR@../lib@PATH_SEPARATOR@${BINDIR}@PATH_SEPARATOR@$PATH" + ;; + esac + export PATH + if test @DFT_LWR_MODEL@ = shared + then + SHLIB="sh $srcdir/shlib" + tic_path="$SHLIB tic" + else + tic_path="tic" + fi + elif test "$tic_path" = unknown + then + echo "? no tic program found" + exit 1 + fi +else + # Cross-compiling, so don't set PATH or run shlib. + SHLIB= + # reset $suffix, since it applies to the target, not the build platform. + suffix= +fi + + +# set another env var that doesn't get reset when `shlib' runs, so `shlib' uses +# the PATH we just set. +SHLIB_PATH=$PATH +export SHLIB_PATH + +# set a variable to simplify environment update in shlib +SHLIB_HOST=@host_os@ +export SHLIB_HOST + +# don't use user's TERMINFO variable +unset TERMINFO_DIRS +TERMINFO="$TICDIR" ; export TERMINFO +umask 022 + +# Construct the name of the old (obsolete) pathname, e.g., /usr/lib/terminfo. +TICDIR=`echo "$TERMINFO" | sed -e 's%/share/\([^/]*\)$%/lib/\1%'` + +# Parent directory may not exist, which would confuse the install for hashed +# database. Fix. +PARENT=`echo "$TERMINFO" | sed -e 's%/[^/]*$%%'` +if test -n "$PARENT" +then + mkdir -p "$PARENT" +fi + +# Remove the old terminfo stuff; we don't care if it existed before, and it +# would generate a lot of confusing error messages if we tried to overwrite it. +# We explicitly remove its contents rather than the directory itself, in case +# the directory is actually a symbolic link. +if test -d "$TERMINFO" +then + ( cd "$TERMINFO" && rm -fr ./? 2>/dev/null ) +elif test -f "$TERMINFO.db" +then + ( rm -f "$TERMINFO.db" 2>/dev/null ) +fi + +if test "$ext_funcs" = 1 ; then +cat </dev/null ) + if ( cd "$TICDIR" 2>/dev/null ) + then + cd "$TICDIR" || exit + TICDIR=`pwd` + if test "$TICDIR " != "$TERMINFO "; then + # Well, we tried. Some systems lie to us, so the + # installer will have to double-check. + echo "Verify if $TICDIR and $TERMINFO are the same." + echo "The new terminfo is in $TERMINFO; the other should be a link to it." + echo "Otherwise, remove $TICDIR and link it to $TERMINFO." + fi + else + cd ${INSTALL_PREFIX} || exit + # Construct a symbolic link that only assumes $ticdir has the + # same $prefix as the other installed directories. + RELATIVE=`echo $ticdir|sed -e 's%^'$prefix'/%%'` + if test "$RELATIVE" != "$ticdir" ; then + RELATIVE=../`echo $ticdir|sed -e 's%^'$prefix'/%%' -e 's%^/%%'` + fi + if ( @LN_S@ "$RELATIVE" "$TICDIR" ) + then + echo "** sym-linked $TICDIR for compatibility" + else + echo "** could not sym-link $TICDIR for compatibility" + fi + fi +fi +# vile:shmode diff --git a/contrib/ncurses/misc/shlib b/contrib/ncurses/misc/shlib new file mode 100755 index 00000000..7b93d170 --- /dev/null +++ b/contrib/ncurses/misc/shlib @@ -0,0 +1,142 @@ +#!/bin/sh +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 1998-2005,2007 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996 +# +# $Id: shlib,v 1.14 2021/09/04 15:55:29 tom Exp $ +# Use this script as a wrapper when running executables linked to shared +# libraries on systems that use the $LD_LIBRARY_PATH variable and don't embed +# the soname's path within the linked executable (such as IRIX), e.g, +# +# shlib knight +# +# Setting LD_LIBRARY_PATH, overrides/supplements the loader's normal search +# path, and works on most systems. The drawback is that then the environment +# variable has to be set to run the programs within this directory tree. +# +# For Linux (and other systems using the GNU loader), we can use the rpath +# directive, which embeds the pathname of the library within the executable. +# Using the Linux loader's rpath directive introduces a constraint, since +# it's embedded into the binary, and means that the binary cannot be moved +# around (though it'll work if the $exec_prefix convention that puts the bin +# and lib directories under the same parent is followed). +# +# Using the actual soname (e.g., ../lib/libncurses.so) alone, is a more +# flexible solution; you can link without having to set the environment +# variable, and on some systems (IRIX) you can even run the resulting binaries +# without setting LD_LIBRARY_PATH. +# +# Using a conventional link, with -L and -l options on Linux results in a +# statically linked executable, which we don't want at all. +# +# Special cases: +# +# BeOS R4.5 uses $LIBRARY_PATH rather than $LD_LIBRARY_PATH. +# Cygwin uses $PATH +# Mac OS X uses $DYLD_LIBRARY_PATH +# +# Other cases not handled by this script: +# +# AIX uses $LIBPATH +# IRIX64 may use $LD_LIBRARY64_PATH or $LD_LIBRARYN32_PATH +# Solaris may use $LD_LIBRARY_PATH_64 +# +CDPATH= +# +# Make sure that we use the PATH that was set in run_tic.sh +if test -n "$SHLIB_PATH" ; then + PATH=$SHLIB_PATH + export PATH +fi + +# Find the lib-directory for this build tree +q="" +for p in lib ../lib ../../lib ../../../lib +do + if test -d $p; then + q=`cd $p || exit; pwd` + break + elif test -f configure && test ! -d ../$p ; then + break + fi +done + +# Set the environment variable. +if test -n "$q" ; then + system= + if test -n "$SHLIB_HOST" ; then + system="$SHLIB_HOST" + elif test -n "$PATHEXT" ; then + system=cygwin + elif test -n "$LIBRARY_PATH" ; then + system=beos + elif test -n "$DYLD_LIBRARY_PATH" ; then + system=darwin + elif test -n "$LD_LIBRARY_PATH"; then + system=unix + else + for r in "$q"/*.* + do + if test -f "$r" + then + case $r in + *.dll) + system=cygwin + ;; + *.dylib) + system=darwin + ;; + esac + fi + test -n "$system" && break + done + fi + + case .$system in + .cygwin*) + variable=PATH + ;; + .beos*) + variable=LIBRARY_PATH + ;; + .darwin*) + variable=DYLD_LIBRARY_PATH + ;; + *) + variable=LD_LIBRARY_PATH + ;; + esac + + eval 'test -z "$'$variable'" && '$variable'=":"' + eval $variable'="$q:$'$variable'"' + eval 'export '$variable +fi + +eval "$*" diff --git a/contrib/ncurses/misc/tabset/std b/contrib/ncurses/misc/tabset/std new file mode 100644 index 00000000..e93f737f --- /dev/null +++ b/contrib/ncurses/misc/tabset/std @@ -0,0 +1 @@ + 3 1 1 1 1 1 1 1 1 1 1 1 1 1 diff --git a/contrib/ncurses/misc/tabset/stdcrt b/contrib/ncurses/misc/tabset/stdcrt new file mode 100644 index 00000000..66ba12f6 --- /dev/null +++ b/contrib/ncurses/misc/tabset/stdcrt @@ -0,0 +1 @@ + 3 1 1 1 1 1 1 1 1 1 \ No newline at end of file diff --git a/contrib/ncurses/misc/tabset/vt100 b/contrib/ncurses/misc/tabset/vt100 new file mode 100644 index 00000000..8828d19d --- /dev/null +++ b/contrib/ncurses/misc/tabset/vt100 @@ -0,0 +1,3 @@ + + +H H H H H H H H H H H H H H H H diff --git a/contrib/ncurses/misc/tabset/vt300 b/contrib/ncurses/misc/tabset/vt300 new file mode 100644 index 00000000..b1f9ce16 --- /dev/null +++ b/contrib/ncurses/misc/tabset/vt300 @@ -0,0 +1,3 @@ + + +P2$t9/17/25/33/41/49/57/65/73/81/89/97/105/113/121/129\ diff --git a/contrib/ncurses/misc/tdlint b/contrib/ncurses/misc/tdlint new file mode 100755 index 00000000..8ff5a40b --- /dev/null +++ b/contrib/ncurses/misc/tdlint @@ -0,0 +1,114 @@ +#!/bin/sh +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 1998,2000 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996 +# +# $Id: tdlint,v 1.8 2021/09/04 15:55:29 tom Exp $ +# +# Lint-script that allows user's own lint libraries, in addition to the ones +# installed in the system. +# +OPT="" +DIRS="" +LIBS="" +FILES="" +ARCH=`uname -s` +if test -z "$ARCH" ; then + echo '? uname not found' + exit 1 +else + case $ARCH in + AIX) set - "$@" -Nn4000 + ;; + IRIX) set - "$@" -n -lc + ;; + FreeBSD) set - "$@" -g -p -u -v -z + ;; + SunOS) + case `uname -r` in + 5.*) ARCH=Solaris + set - "$@" -n -lc + ;; + esac + ;; + esac +fi +# LIBDIR=$HOME/lib/$ARCH/lint ;export LIBDIR +for p in $HOME/lib/$ARCH/lint /usr/lib/lint /usr/lib +do + if [ -d "$p" ] + then + DIRS="$DIRS $p" + fi +done +# +while [ $# != 0 ] +do + case $1 in + -D*\"*) ;; + -L*) + DIRS="`echo "$1"|sed -e 's/^-L//'` $DIRS" + ;; + -l*) + lib="llib-l`echo "$1" | sed -e 's/^-l//'`.ln" + found=no + for p in $DIRS + do + printf "testing %s" "$p/$lib" + if [ -f "$p/$lib" ] + then + LIBS="$LIBS $p/$lib" + echo " (ok)" + found=yes + break + fi + echo + done + if [ $found = no ] + then + echo "ignored library $1" + fi + ;; + -n) if [ -z "$OPT" ] + then + OPT="-I." + fi + OPT="$OPT $1" + ;; + -*) OPT="$OPT $1" + ;; + *) + FILES="$FILES $1" + ;; + esac + shift +done +# +exec lint $OPT $FILES $LIBS diff --git a/contrib/ncurses/misc/terminfo.src b/contrib/ncurses/misc/terminfo.src new file mode 100644 index 00000000..489c4802 --- /dev/null +++ b/contrib/ncurses/misc/terminfo.src @@ -0,0 +1,27733 @@ +######## TERMINAL TYPE DESCRIPTIONS SOURCE FILE +# +# This version of terminfo.src is distributed with ncurses and is maintained +# by Thomas E. Dickey (TD). +# +# Report bugs and new terminal descriptions to +# bug-ncurses@gnu.org +# +# $Revision: 1.1157 $ +# $Date: 2024/11/02 20:48:46 $ +# +# The original header is preserved below for reference. It is noted that there +# is a "newer" version which differs in some cosmetic details (but actually +# stopped updates several years ago); we have decided to not change the header +# unless there is also a change in content. +# +# To further muddy the waters, it is noted that changes to this file as part of +# maintenance of ncurses (since 1996) are generally conceded to be copyright +# under the ncurses MIT-style license. That was the effect of the agreement +# which the principal authors of ncurses made in 1998. However, since much of +# the file itself is of unknown authorship (and the disclaimer below makes it +# obvious that Raymond cannot or will not convey rights over those parts), +# there is no explicit copyright notice on the file itself. +# +# It would also be a nuisance to split the file into unknown/known authorship +# and move pieces as they are maintained, since many of the maintenance changes +# have been small corrections to Raymond's translations to/from termcap format, +# correcting the data but not the accompanying annotations. +# +# In any case, note that almost half of this file is not data but annotations +# which reflect creative effort. Furthermore, the structure of entries to +# reuse common chunks also is creative (and subject to copyright). Finally, +# some portions of the data are derivative work under a compatible MIT-style +# license from xterm. +# +#------------------------------------------------------------------------------ +# https://invisible-island.net/ncurses/ncurses.faq.html#terminfo_copying +# https://invisible-island.net/personal/copyrights.html#removing_notes +#------------------------------------------------------------------------------ +# +# Version 10.2.1 +# terminfo syntax +# +# Eric S. Raymond (current maintainer) +# John Kunze, Berkeley +# Craig Leres, Berkeley +# +# Please e-mail changes to terminfo@thyrsus.com; the old termcap@berkeley.edu +# address is no longer valid. The latest version can always be found at +# . +# +# PURPOSE OF THIS FILE: +# +# This file describes the capabilities of various character-cell terminals, +# as needed by software such as screen-oriented editors. +# +# Other terminfo and termcap files exist, supported by various OS vendors +# or as relics of various older versions of UNIX. This one is the longest +# and most comprehensive one in existence. It subsumes not only the entirety +# of the historical 4.4BSD, GNU, System V and SCO termcap files and the BRL +# termcap file, but also large numbers of vendor-maintained termcap and +# terminfo entries more complete and carefully tested than those in historical +# termcap/terminfo versions. +# +# Pointers to related resources (including the ncurses distribution) may +# be found at . +# +# INTERNATIONALIZATION: +# +# This file uses only the US-ASCII character set (no ISO8859 characters). +# +# This file assumes a US-ASCII character set. If you need to fix this, start +# by global-replacing \E(B and \E)B with the appropriate ISO 6429 enablers +# for your character set. \E(A and \E)A enables the British character set +# with the pound sign at position 2/3. +# +# In a Japanese-processing environment using EUC/Japanese or Shift-JIS, +# C1 characters are considered the first-byte set of the Japanese encodings, +# so \E)0 should be avoided in and initialization strings. +# +# FILE FORMAT: +# +# The version you are looking at may be in any of three formats: master +# (terminfo with OT capabilities), stock terminfo, or termcap. You can tell +# which by the format given in the header above. +# +# The master format is accepted and generated by the terminfo tools in the +# ncurses suite; it differs from stock (System V-compatible) terminfo only +# in that it admits a group of capabilities (prefixed `OT') equivalent to +# various obsolete termcap capabilities. You can, thus, convert from master +# to stock terminfo simply by filtering with `sed "/OT[^,]*,/s///"'; but if +# you have ncurses `tic -I' is nicer (among other things, it automatically +# outputs entries in a canonical form). +# +# The termcap version is generated automatically from the master version +# using tic -C. This filtering leaves in the OT capabilities under their +# original termcap names. All translated entries fit within the 1023-byte +# string-table limit of archaic termcap libraries except where explicitly +# noted below. Note that the termcap translation assumes that your termcap +# library can handle multiple tc capabilities in an entry. 4.4BSD has this +# capability. Older versions of GNU termcap, through 1.3, do not. +# +# For details on these formats, see terminfo(5) in the ncurses distribution, +# and termcap(5) in the 4.4BSD Unix Programmer's Manual. Be aware that 4.4BSD +# curses has been declared obsolete by the caretakers of the 4.4BSD sources +# as of June 1995; they are encouraging everyone to migrate to ncurses. +# +# Note: unlike some other distributed terminfo files (Novell Unix & SCO's), +# no entry in this file has embedded comments. This is so source translation +# to termcap only has to carry over leading comments. Also, no name field +# contains embedded whitespace (such whitespace confuses rdist). +# +# Further note: older versions of this file were often installed with an editor +# script (reorder) that moved the most common terminal types to the front of +# the file. This should no longer be necessary, as the file is now ordered +# roughly by type frequency with ANSI/VT100 and other common types up front. +# +# Some information has been merged in from terminfo files distributed by +# USL and SCO (see COPYRIGHTS AND OTHER DELUSIONS below). Much information +# comes from vendors who maintain official terminfos for their hardware +# (notably DEC and Wyse). +# +# A detailed change history is included at the end of this file. +# +# FILE ORGANIZATION: +# +# Comments in this file begin with # - they cannot appear in the middle +# of a terminfo/termcap entry (this feature had to be sacrificed in order +# to allow standard terminfo and termcap syntax to be generated cleanly from +# the master format). Individual capabilities are commented out by +# placing a period between the colon and the capability name. +# +# The file is divided up into major sections (headed by lines beginning with +# the string "########") and minor sections (beginning with "####"); do +# +# grep "^####" | more +# +# to see a listing of section headings. The intent of the divisions is +# (a) to make it easier to find things, and (b) to order the database so +# that important and frequently-encountered terminal types are near the +# front (so that you'll get reasonable search efficiency from a linear +# search of the termcap form even if you don't use reorder). Minor sections +# usually correspond to manufacturers or standard terminal classes. +# Parenthesized words following manufacturer names are type prefixes or +# product line names used by that manufacturers. +# +# HOW TO READ THE ENTRIES: +# +# The first name in an entry is the canonical name for the model or +# type, last entry is a verbose description. Others are mnemonic synonyms for +# the terminal. +# +# Terminal names look like - +# The part to the left of the dash, if a dash is present, describes the +# particular hardware of the terminal. The part to the right may be used +# for flags indicating special ROMs, extra memory, particular terminal modes, +# or user preferences. +# +# All names should be in lower case, for consistency in typing. +# +# The following are conventionally used suffixes: +# -2p Has two pages of memory. Likewise 4p, 8p, etc. +# -am Enable auto-margin. +# -m Monochrome. Suppress color support +# -mc Magic-cookie. Some terminals (notably older Wyses) can +# only support one attribute without magic-cookie lossage. +# Their base entry is usually paired with another that +# uses magic cookies to support multiple attributes. +# -nam No auto-margin - suppress capability +# -nl No labels - suppress soft labels +# -ns No status line - suppress status line +# -rv Terminal in reverse video mode (black on white) +# -s Enable status line. +# -vb Use visible bell () rather than . +# -w Wide - in 132 column mode. +# If a name has multiple suffixes and one is a line height, that one should +# go first. Thus `aaa-30-s-rv' is recommended over `aaa-s-rv-30'. +# +# Entries with embedded plus signs are designed to be included through use/tc +# capabilities, not used as standalone entries. +# +# To avoid search clashes, some older all-numeric names for terminals have +# been removed (i.e., "33" for the Model 33 Teletype, "2621" for the HP2621). +# All primary names of terminals now have alphanumeric prefixes. +# +# Comments marked "esr" are mostly results of applying the termcap-compiler +# code packaged with ncurses and contemplating the resulting error messages. +# In many cases, these indicated obvious fixes to syntax garbled by the +# composers. In a few cases, I was able to deduce corrected forms for garbled +# capabilities by looking at context. All the information in the original +# entries is preserved in the comments. +# +# In the comments, terminfo capability names are bracketed with <> (angle +# brackets). Termcap capability names are bracketed with :: (colons). +# +# INTERPRETATION OF USER CAPABILITIES +# +# The System V Release 4 and XPG4 terminfo format defines ten string +# capabilities for use by applications, .... In this file, we use +# certain of these capabilities to describe functions which are not covered +# by terminfo. The mapping is as follows: +# +# u9 terminal enquire string (equiv. to ANSI/ECMA-48 DA) +# u8 terminal answerback description +# u7 cursor position request (equiv. to VT100/ANSI/ECMA-48 DSR 6) +# u6 cursor position report (equiv. to ANSI/ECMA-48 CPR) +# +# The terminal enquire string should elicit an answerback response +# from the terminal. Common values for will be ^E (on older ASCII +# terminals) or \E[c (on newer VT100/ANSI/ECMA-48-compatible terminals). +# +# The cursor position request () string should elicit a cursor position +# report. A typical value (for VT100 terminals) is \E[6n. +# +# The terminal answerback description (u8) must consist of an expected +# answerback string. The string may contain the following scanf(3)-like +# escapes: +# +# %c Accept any character +# %[...] Accept any number of characters in the given set +# +# The cursor position report () string must contain two scanf(3)-style +# %d format elements. The first of these must correspond to the Y coordinate +# and the second to the %d. If the string contains the sequence %i, it is +# taken as an instruction to decrement each value after reading it (this is +# the inverse sense from the cup string). The typical CPR value is +# \E[%i%d;%dR (on VT100/ANSI/ECMA-48-compatible terminals). +# +# These capabilities are used by tack(1m), the terminfo action checker +# (distributed with ncurses 5.0). +# +# TABSET FILES +# +# All the entries in this file have been edited to assume that the tabset +# files directory is /usr/share/tabset, in conformance with the File Hierarchy +# Standard for Linux and open-source BSD systems. Some vendors (notably Sun) +# use /usr/lib/tabset or (more recently) /usr/share/lib/tabset. +# +# No curses package we know of actually uses these files. If their location +# is an issue, you will have to hand-patch the file locations before compiling +# this file. +# +# REQUEST FOR CONTACT INFORMATION AND HISTORICAL MATERIAL +# +# As the ANSI/ECMA-48 standard and variants take firmer hold, and as +# character-cell terminals are increasingly replaced by X displays, much of +# this file is becoming a historical document (this is part of the reason for +# the new organization, which puts ANSI types, xterm, Unix consoles, +# and vt100 up front in confidence that this will catch 95% of new hardware). +# +# For the terminal types still alive, I'd like to have manufacturer's +# contact data (Internet address and/or snail-mail + phone). +# +# I'm also interested in enriching the comments so that the latter portions of +# the file do in fact become a potted history of VDT technology as seen by +# UNIX hackers. Ideally, I'd like the headers for each manufacturer to +# include its live/dead/out-of-the-business status, and for as many +# terminal types as possible to be tagged with information like years +# of heaviest use, popularity, and interesting features. +# +# I'm especially interested in identifying the obscure entries listed under +# `Miscellaneous obsolete terminals, manufacturers unknown' before the tribal +# wisdom about them gets lost. If you know a lot about obscure old terminals, +# please go to the terminfo resource page, grab the UFO file (ufo.ti), and +# eyeball it for things you can identify and describe. +# +# If you have been around long enough to contribute, please read the file +# with this in mind and send me your annotations. +# +# COPYRIGHTS AND OTHER DELUSIONS +# +# The BSD ancestor of this file had a standard Regents of the University of +# California copyright with dates from 1980 to 1993. +# +# Some information has been merged in from a terminfo file SCO distributes. +# It has an obnoxious boilerplate copyright which I'm ignoring because they +# took so much of the content from the ancestral BSD versions of this file +# and didn't attribute it, thereby violating the BSD Regents' copyright. +# +# Not that anyone should care. However many valid functions copyrights may +# serve, putting one on a termcap/terminfo file with hundreds of anonymous +# contributors makes about as much sense as copyrighting a wall-full of +# graffiti -- it's legally dubious, ethically bogus, and patently ridiculous. +# +# This file deliberately has no copyright. It belongs to no one and everyone. +# If you claim you own it, you will merely succeed in looking like a fool. +# Use it as you like. Use it at your own risk. Copy and redistribute freely. +# There are no guarantees anywhere. Svaha! +# + +######## ANSI, UNIX CONSOLE, AND SPECIAL TYPES +# +# This section describes terminal classes and brands that are still +# quite common. +# + +#### Specials +# +# Special "terminals". These are used to label tty lines when you don't +# know what kind of terminal is on it. The characteristics of an unknown +# terminal are the lowest common denominator - they look about like a ti 700. +# + +dumb|80-column dumb tty, + am, + cols#80, + bel=^G, cr=\r, cud1=\n, ind=\n, +unknown|unknown terminal type, + gn, use=dumb, +lpr|printer|line printer, + OTbs, hc, os, + cols#132, lines#66, + bel=^G, cr=\r, cub1=^H, cud1=\n, ff=^L, ind=\n, +glasstty|classic glass tty interpreting ASCII control characters, + OTbs, am, + cols#80, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, ht=^I, kcub1=^H, + kcud1=\n, nel=\r\n, .kbs=^H, + +vanilla|dumb tty, + OTbs, + bel=^G, cr=\r, cud1=\n, ind=\n, + +# This is almost the same as "dumb", but with no prespecified width. +# DEL and ^C are hardcoded to act as kill characters. +# ^D acts as a line break (just like newline). +# It also interprets +# \033];xxx\007 +# for compatibility with xterm -TD +9term|Plan9 terminal emulator for X, + am, + OTnl=\n, bel=^G, cud1=\n, + +#### ANSI.SYS/ISO 6429/ECMA-48 Capabilities +# +# See the end-of-file comment for more on these. +# + +# ANSI capabilities are broken up into pieces, so that a terminal +# implementing some ANSI subset can use many of them. +ansi+local1|ANSI normal-mode cursor-keys, + cub1=\E[D, cud1=\E[B, cuf1=\E[C, cuu1=\E[A, +ansi+local|ANSI normal-mode parameterized cursor-keys, + cub=\E[%p1%dD, cud=\E[%p1%dB, cuf=\E[%p1%dC, + cuu=\E[%p1%dA, use=ansi+local1, +ansi+tabs|ANSI tab-stops, + cbt=\E[Z, ht=^I, hts=\EH, tbc=\E[3g, +ansi+inittabs|ANSI initial tab-stops, + it#8, use=ansi+tabs, +ansi+erase|ANSI clear screen/line, + clear=\E[H\E[J, ed=\E[J, el=\E[K, +ansi+rca|ANSI relative cursor-addressing (1-based), + hpa=\E[%p1%{1}%+%dG, vpa=\E[%p1%{1}%+%dd, +ansi+rca2|ANSI relative cursor-addressing, + hpa=\E[%i%p1%dG, vpa=\E[%i%p1%dd, +ansi+cup|ANSI absolute cursor-addressing, + cup=\E[%i%p1%d;%p2%dH, home=\E[H, +ansi+rep|ANSI repeat-character, + rep=%p1%c\E[%p2%{1}%-%db, +ansi+idl1|ANSI insert/delete one line, + dl1=\E[M, il1=\E[L, +ansi+idl|ANSI insert/delete lines, + dl=\E[%p1%dM, il=\E[%p1%dL, use=ansi+idl1, +ansi+idc1|ANSI insert/delete one character, + dch1=\E[P, ich1=\E[@, rmir=\E[4l, smir=\E[4h, +ansi+idc|ANSI insert/delete characters, + dch=\E[%p1%dP, ich=\E[%p1%d@, use=ansi+idc1, +ansi+arrows|ANSI normal-mode home and cursor-keys, + kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + khome=\E[H, +ansi+apparrows|ANSI application-mode home and cursor-keys, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, khome=\EOH, + use=ansi+arrows, +ansi+sgr|ANSI graphic renditions, + blink=\E[5m, invis=\E[8m, rev=\E[7m, + sgr=\E[0%?%p3%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E[0m, +ansi+sgrso|ANSI standout only, + rmso=\E[m, smso=\E[7m, +ansi+sgrul|ANSI underline only, + rmul=\E[m, smul=\E[4m, +ansi+sgrbold|ANSI graphic renditions; assuming terminal has bold; not dim, + bold=\E[1m, + sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1; + %;%?%p7%t8;%;m, + use=ansi+sgr, use=ansi+sgrso, use=ansi+sgrul, +ansi+sgrdim|ANSI graphic renditions; assuming terminal has dim; not bold, + dim=\E[2m, + sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p5%t2; + %;%?%p7%t8;%;m, + use=ansi+sgr, use=ansi+sgrso, use=ansi+sgrul, + +# ECMA-48 does not specify scroll-regions, but most people consider it to be +# "ANSI" because it is widely-supported. See ecma+index for the standard form. +ansi+csr|ANSI scroll-region plus cursor save & restore, + csr=\E[%i%p1%d;%p2%dr, rc=\E8, sc=\E7, + +# The normal (ANSI) flavor of "media copy" building block asserts that +# characters sent to the printer do not echo on the screen. DEC terminals +# can also be put into autoprinter mode, where each line is sent to the +# printer as you move off that line, e.g., by a carriage return. +ansi+pp|ANSI printer port, + mc5i, + mc0=\E[i, mc4=\E[4i, mc5=\E[5i, +dec+pp|DEC autoprinter mode, + mc0=\E[i, mc4=\E[?4i, mc5=\E[?5i, + +# The IBM PC alternate character set. Plug this into any Intel console entry. +# We use \E[11m for rmacs rather than \E[12m so the string can use the +# ROM graphics for control characters such as the diamond, up- and down-arrow. +# This works with the System V, Linux, and BSDI consoles. It's a safe bet this +# will work with any Intel console, they all seem to have inherited \E[11m +# from the ANSI.SYS de-facto standard. +klone+acs|alternate character set for ansi.sys displays, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j + \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v + \301w\302x\263y\363z\362{\343|\330}\234~\376, + rmacs=\E[10m, smacs=\E[11m, + +# Highlight controls corresponding to the ANSI.SYS standard. Most +# console drivers for Intel boxes obey these. Makes the same assumption +# about \E[11m as klone+acs. True ANSI/ECMA-48 would have , +# , but this isn't a documented feature of ANSI.SYS. +klone+sgr|attribute control for ansi.sys displays, + blink=\E[5m, bold=\E[1m, rev=\E[7m, rmpch=\E[10m, + rmso=\E[m, rmul=\E[m, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6 + %t;1%;%?%p9%t;11%;m, + sgr0=\E[0;10m, smpch=\E[11m, smso=\E[7m, smul=\E[4m, + use=klone+acs, + +# Most Intel boxes do not treat "invis" (invisible) text. +klone+sgr8|attribute control for ansi.sys displays with invis, + invis=\E[8m, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6 + %t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + use=klone+sgr, + +# Highlight controls corresponding to the ANSI.SYS standard. *All* +# console drivers for Intel boxes obey these. Does not assume \E[11m will +# work; uses \E[12m instead, which is pretty bulletproof but loses you the ACS +# diamond and arrow characters under curses. +klone+sgr-dumb|attribute control for ansi.sys displays (no ESC [ 11 m), + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6 + %t;1%;%?%p7%t;8%;%?%p9%t;12%;m, + sgr0=\E[0;10m, smacs=\E[12m, use=ansi+sgrbold, + use=klone+acs, + +# KOI8-R (RFC1489) acs (alternate character set) +# From: Qing Long , 24 Feb 1996. +klone+koi8acs|alternate character set for ansi.sys displays with KOI8 charset, + acsc=+\020\,\021-\036.^_0\215`\004a\237f\234g\232h\222i + \220j\205k\203l\202m\204n\212o\213p\216q\0r\217s\214t + \206u\207v\210w\211x\201y\230z\231{\267|\274}L~ + \225, + rmacs=\E[10m, smacs=\E[11m, + +# ANSI.SYS color control. The setab/setaf caps depend on the coincidence +# between SVr4/XPG4's color numbers and ANSI.SYS attributes. Here are longer +# but equivalent strings that don't rely on that coincidence: +# setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, +# setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m, +# The DOS 5 manual asserts that these sequences meet the ISO 6429 standard. +# They match a subset of ECMA-48. +klone+color|color control for ansi.sys and ISO6429-compatible displays, + colors#8, ncv#3, pairs#64, + op=\E[37;40m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + +# This is better than klone+color, it doesn't assume white-on-black as the +# default color pair, but many `ANSI' terminals don't grok the cap. +ecma+color|color control for ECMA-48-compatible terminals, + AX, + op=\E[39;49m, use=klone+color, + +ecma+italics|ECMA-48 italics, + ritm=\E[23m, sitm=\E[3m, + +# Attribute control for ECMA-48-compatible terminals +ecma+sgr|attribute capabilities for true ECMA-48 terminals, + rmso=\E[27m, rmul=\E[24m, use=klone+sgr8, + +ecma+strikeout|ECMA-48 strikeout/crossed-out, + rmxx=\E[29m, smxx=\E[9m, + +# ECMA-48 does not include the VT100 indexing and scroll-margins. It has its +# own variation. +ecma+index|ECMA-48 scroll up/down, + indn=\E[%p1%dS, rin=\E[%p1%dT, + +# For comparison, here are all the capabilities implied by the Intel +# Binary Compatibility Standard (level 2) that fit within terminfo. +# For more detail on this rather pathetic standard, see the comments +# near the end of this file. +ibcs2|Intel Binary Compatibility Standard prescriptions, + cbt=\E[Z, clear=\Ec, cub1=\E[1D, cud1=\E[1B, cuf1=\E[1C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[1A, dch=\E[%p1%dP, + dispc=\E=%p1%dg, ech=\E[%p1%dX, hpa=\E[%i%p1%dG, hts=\EH, + ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, rc=\E7, + rmam=\E[?7l, sc=\E7, smam=\E[?7h, tbc=\E[g, + vpa=\E[%i%p1%dd, use=ansi+local, use=ecma+index, + +#### ANSI/ECMA-48 terminals and terminal emulators +# +# See near the end of this file for details on ANSI conformance. +# Don't mess with these entries! Lots of other entries depend on them! +# +# This section lists entries in a least-capable to most-capable order. +# if you're in doubt about what `ANSI' matches yours, try them in that +# order and back off from the first that breaks. + +# ansi-mr is for ANSI terminals with ONLY relative cursor addressing +# and more than one page of memory. It uses local motions instead of +# direct cursor addressing, and makes almost no assumptions. It does +# assume auto margins, no padding and/or xon/xoff, and a 24x80 screen. +ansi-mr|mem rel cup ANSI, + am, xon, + cols#80, lines#24, use=vanilla, use=ansi+erase, + use=ansi+local1, + +# ansi-mini is a bare minimum ANSI terminal. This should work on anything, but +# beware of screen size problems and memory relative cursor addressing. +ansi-mini|any ANSI terminal with pessimistic assumptions, + am, xon, + cols#80, lines#24, use=vanilla, use=ansi+cup, + use=ansi+erase, + +# ansi-mtabs adds relative addressing and minimal tab support +ansi-mtabs|any ANSI terminal with pessimistic assumptions (relative addressing), + it#8, + ht=^I, use=ansi-mini, use=ansi+local1, + +# ANSI X3.64 from emory!mlhhh (Hugh Hansard) via BRL +# +# The following is an entry for the full ANSI 3.64 (1977). It lacks +# padding, but most terminals using the standard are "fast" enough +# not to require any -- even at 9600 bps. If you encounter problems, +# try including the padding specifications. +# +# Note: the :as: and :ae: specifications are not implemented here, for +# the available termcap documentation does not make clear WHICH alternate +# character set to specify. ANSI 3.64 seems to make allowances for several. +# Please make the appropriate adjustments to fit your needs -- that is +# if you will be using alternate character sets. +# +# There are very few terminals running the full ANSI 3.64 standard, +# so I could only test this entry on one verified terminal (Visual 102). +# I would appreciate the results on other terminals sent to me. +# +# Please report comments, changes, and problems to: +# +# U.S. MAIL: Hugh Hansard +# Box: 22830 +# Emory University +# Atlanta, GA. 30322. +# +# USENET {akgua,msdc,sb1,sb6,gatech}!emory!mlhhh. +# +# (Added vt100 , to quiet a tic warning --esr) +ansi77|ANSI 3.64 standard 1977 version, + OTbs, am, mir, + cols#80, it#8, lines#24, + bel=^G, clear=\E[;H\E[2J, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M$<5*/>, + ed=\E[J, el=\E[K, home=\E[H, ht=^I, il1=\E[L$<5*/>, ind=\ED, + kf1=\EOP, kf2=\EOR, kf4=\EOS, nel=\r\ED, ri=\EM, rmir=\E[4l, + rmso=\E[m, rmul=\E[m, smir=\E[4h, smso=\E[7m, smul=\E[4m, + use=ansi+arrows, use=ansi+csr, use=ansi+local1, + +# Procomm and some other ANSI emulations don't recognize all of the ANSI- +# standard capabilities. This entry deletes , , , , and +# / capabilities, forcing curses to use repetitions of , +# , and . Also deleted and , as QModem up to +# 5.03 doesn't recognize these. Finally, we delete and , which seem +# to confuse many emulators. On the other hand, we can count on these programs +# doing //. Older versions of this entry featured +# , but now seems to be more common under +# ANSI.SYS influence. +# From: Eric S. Raymond Oct 30 1995 +pcansi-m|pcansi-mono|ibm-pc terminal programs claiming to be ANSI (mono mode), + OTbs, am, mir, msgr, + cols#80, lines#24, + bel=^G, cr=\r, cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, + home=\E[H, ht=^I, il1=\E[L, ind=\n, use=ansi+arrows, + use=ansi+erase, use=ansi+inittabs, use=ansi+local1, + use=klone+sgr-dumb, + +pcansi-25-m|pcansi25m|ibm-pc terminal programs with 25 lines (mono mode), + lines#25, use=pcansi-m, +pcansi-33-m|pcansi33m|ibm-pc terminal programs with 33 lines (mono mode), + lines#33, use=pcansi-m, +pcansi-43-m|ansi43m|ibm-pc terminal programs with 43 lines (mono mode), + lines#43, use=pcansi-m, +# The color versions. All PC emulators do color... +pcansi|ibm-pc terminal programs claiming to be ANSI, + use=klone+color, use=pcansi-m, +pcansi-25|pcansi25|ibm-pc terminal programs with 25 lines, + lines#25, use=pcansi, +pcansi-33|pcansi33|ibm-pc terminal programs with 33 lines, + lines#33, use=pcansi, +pcansi-43|pcansi43|ibm-pc terminal programs with 43 lines, + lines#43, use=pcansi, + +# ansi-m -- full ANSI X3.64 with ANSI.SYS-compatible attributes, no color. +# If you want pound signs rather than dollars, replace `B' with `A' +# in the , , , and capabilities. +# From: Eric S. Raymond Nov 6 1995 +ansi-m|ansi-mono|ANSI X3.64-1979 terminal with ANSI.SYS compatible attributes, + mc5i, + dch=\E[%p1%dP, dl=\E[%p1%dM, ech=\E[%p1%dX, el1=\E[1K, + hpa=\E[%i%p1%dG, ht=\E[I, ich=\E[%p1%d@, il=\E[%p1%dL, + kcbt=\E[Z, kich1=\E[L, mc4=\E[4i, mc5=\E[5i, nel=\r\E[S, + rep=%p1%c\E[%p2%{1}%-%db, s0ds=\E(B, s1ds=\E)B, + s2ds=\E*B, s3ds=\E+B, vpa=\E[%i%p1%dd, use=ansi+local, + use=ecma+index, use=pcansi-m, + +# ECMA-48 addresses three of the four capabilities here: +# +# u6 - +# 8.3.14 CPR - ACTIVE POSITION REPORT +# Notation: (Pn1;Pn2) Representation: CSI Pn1;Pn2 05/02 +# Parameter default values: Pn1 = 1; Pn2 = 1 +# +# u7 +# 8.3.35 DSR - DEVICE ST A TUS REPORT +# Notation: (Ps) Representation: CSI Ps 06/14 +# Parameter default value: Ps = 0 +# DSR is used either to report the status of the sending device or to +# request a status report from the receiving device, depending on the +# parameter values: +# 6 a report of the active presentation position or of the active data +# position in the form of ACTIVE POSITION REPORT (CPR) is requested +# +# u9 - +# 8.3.24 DA - DEVICE ATTRIBUTES +# Notation: (Ps) Representation: CSI Ps 06/03 +# Parameter default value: Ps = 0 +# With a parameter value not equal to 0, DA is used to identify the +# device which sends the DA. The parameter value is a device type +# identification code according to a register which is to be established. +# If the parameter value is 0, DA is used to request an identifying DA +# from a device. +# +# DEC (and most "ANSI") terminals reply with a private-mode ("?") sequence, +# but that register "which is to be" in ECMA-48 was never established. +# For terminals that support DA1, a more specific u8 capability is preferred, +# except for those (such as xterm) which can be configured to return different +# responses. +ansi+cpr|ncurses extension for ANSI CPR, + u6=\E[%i%d;%dR, u7=\E[6n, +ansi+enq|ncurses extension for ANSI ENQ, + u8=\E[?%[;0123456789]c, u9=\E[c, use=ansi+cpr, +# DEC terminals provided DECID, subsumed into DA1: +decid+cpr|ncurses extension for DECID, + u8=\E[?%[;0123456789]c, u9=\EZ, use=ansi+cpr, + +# ansi -- this terminfo expresses the largest subset of X3.64 that will fit in +# standard terminfo. Assumes ANSI.SYS-compatible attributes and color. +# From: Eric S. Raymond Nov 6 1995 +ansi|ansi/pc-term compatible with color, + use=ansi+enq, use=ecma+color, use=klone+sgr8, use=ansi-m, + +# ansi-generic is a vanilla ANSI terminal. This is assumed to implement +# all the normal ANSI stuff with no extensions. It assumes +# insert/delete line/char is there, so it won't work with +# VT100 clones. It assumes video attributes for bold, blink, +# underline, and reverse, which won't matter much if the terminal +# can't do some of those. Padding is assumed to be zero, which +# shouldn't hurt since xon/xoff is assumed. +ansi-generic|ansiterm|generic ANSI standard terminal, + am, xon, + cols#80, lines#24, use=vanilla, use=ansi+csr, use=ansi+cup, + use=ansi+rca, use=ansi+erase, use=ansi+tabs, + use=ansi+local, use=ansi+idc, use=ansi+idl, use=ansi+rep, + use=ansi+sgrbold, use=ansi+arrows, + +#### DOS ANSI.SYS variants +# +# This completely describes the sequences specified in the DOS 2.1 ANSI.SYS +# documentation (except for the keyboard key reassignment feature, which +# doesn't fit the model well). The klone+acs sequences were valid +# though undocumented. The capability is untested but should work for +# keys F1-F10 (%p1 values outside this range will yield unpredictable results). +# From: Eric S. Raymond Nov 7 1995 +# +# DOS 2.0 (January 1983) documented these features in +# Chapter 13, "Using Extended Screen and Keyboard Control" -TD +ansi.sys-old|ANSI.SYS under PC-DOS 2.0, + OTbs, am, mir, msgr, xon, + cols#80, lines#25, + clear=\E[2J, cub1=^H, cup=\E[%i%p1%d;%p2%dH, el=\E[k, + home=\E[H, is2=\E[m\E[?7h, kcub1=^H, kcud1=\n, kcuf1=^L, + kcuu1=^K, khome=^^, pfkey=\E[0;%p1%{58}%+%d;%p2"%s"p, + rc=\E[u, rmam=\E[?7l, sc=\E[s, smam=\E[?7h, use=ansi+cpr, + use=ansi+local1, use=klone+color, use=klone+sgr8, + +# Keypad: Home=\0G Up=\0H PrPag=\0I +# ka1,kh kcuu1 kpp,ka3 +# +# Left=\0K 5=\0L Right=\0M +# kcub1 kb2 kcuf1 +# +# End=\0O Down=\0P NxPag=\0Q +# kc1,kend kcud1 kc3,knp +# +# Ins=\0R Del=\0S +# kich1 kdch1 +# +# On keyboard with 12 function keys, +# shifted f-keys: F13-F24 +# control f-keys: F25-F36 +# alt f-keys: F37-F48 +# The shift/control/alt keys do not modify each other, but alt overrides both, +# and control overrides shift. +# +# capability for F1-F48 -TD +ansi.sys|ANSI.SYS 3.1 and later versions, + el=\E[K, ka1=\0G, ka3=\0I, kb2=\0L, kc1=\0O, kc3=\0Q, + kcbt=\0^O, kcub1=\0K, kcud1=\0P, kcuf1=\0M, kcuu1=\0H, + kdch1=\0S, kend=\0O, kf1=\0;, kf10=\0D, kf11=\0\205, + kf12=\0\206, kf13=\0T, kf14=\0U, kf15=\0V, kf16=\0W, + kf17=\0X, kf18=\0Y, kf19=\0Z, kf2=\0<, kf20=\0[, kf21=\0\\, + kf22=\0], kf23=\0\207, kf24=\0\210, kf25=\0\^, kf26=\0_, + kf27=\0`, kf28=\0a, kf29=\0b, kf3=\0=, kf30=\0c, kf31=\0d, + kf32=\0e, kf33=\0f, kf34=\0g, kf35=\0\211, kf36=\0\212, + kf37=\0h, kf38=\0i, kf39=\0j, kf4=\0>, kf40=\0k, kf41=\0l, + kf42=\0m, kf43=\0n, kf44=\0o, kf45=\0p, kf46=\0q, + kf47=\0\213, kf48=\0\214, kf5=\0?, kf6=\0@, kf7=\0A, kf8=\0B, + kf9=\0C, khome=\0G, kich1=\0R, knp=\0Q, kpp=\0I, + pfkey=\E[0;%?%p1%{11}%<%t%':'%e%p1%{13}%<%t%'z'%e%p1%{23}%< + %t%'G'%e%p1%{25}%<%t%'p'%e%p1%'#'%<%t%'E'%e%p1%'%'%<%t + %'f'%e%p1%'/'%<%t%'C'%e%{92}%;%p1%+%d;%p2"%s"p, + use=ansi+arrows, use=ansi.sys-old, + +# +# Define IBM PC keypad keys for vi as per MS-Kermit while using ANSI.SYS. +# This should only be used when the terminal emulator cannot redefine the keys. +# Since redefining keys with ansi.sys also affects PC-DOS programs, the key +# definitions must be restored. If the terminal emulator is quit while in vi +# or others using /, the keypad will not be defined as per PC-DOS. +# The PgUp and PgDn are prefixed with ESC so that tn3270 can be used on Unix +# (^U and ^D are already defined for tn3270). The ESC is safe for vi but it +# does "beep". ESC ESC i is used for Ins to avoid tn3270 ESC i for coltab. +# Note that is always BS, because PC-dos can tolerate this change. +# Caution: vi is limited to 256 string bytes, longer crashes or weirds out vi. +# Consequently the End keypad key could not be set (it is relatively safe and +# actually useful because it sends ^@ O, which beeps and opens a line above). +ansi.sysk|ansisysk|PC-DOS 3.1 ANSI.SYS with keypad redefined for vi, + is2=U2\sPC-DOS\s3.1\sANSI.SYS\swith\skeypad\sredefined\sfor + \svi\s9-29-86\n\E[;75;8p, + rmkx=\E[;71;0;71p\E[;72;0;72p\E[;73;0;73p\E[;77;0;77p\E[;80; + 0;80p\E[;81;0;81p\E[;82;0;82p\E[;83;0;83p, + smkx=\E[;71;30p\E[;72;11p\E[;73;27;21p\E[;77;12p\E[;80;10p + \E[;81;27;4p\E[;82;27;27;105p\E[;83;127p, + use=ansi.sys, +# +# Adds ins/del line/character, hence vi reverse scrolls/inserts/deletes nicer. +nansi.sys|nansisys|PC-DOS Public Domain NANSI.SYS, + dch1=\E[1P, dl1=\E[1M, ich1=\E[1@, il1=\E[1L, + is2=U3 PC-DOS Public Domain NANSI.SYS 9-23-86\n, + use=ansi.sys, +# +# See ansi.sysk and nansi.sys above. +nansi.sysk|nansisysk|PC-DOS Public Domain NANSI.SYS with keypad redefined for vi, + dch1=\E[1P, dl1=\E[1M, ich1=\E[1@, il1=\E[1L, + is2=U4\sPC-DOS\sPublic\sDomain\sNANSI.SYS\swith\skeypad + \sredefined\sfor\svi\s9-29-86\n\E[;75;8p, + use=ansi.sysk, + +#### Atari ST terminals + +# From Guido Flohr . +# +tw52|tw52-color|Toswin window manager with color, + bce, + colors#16, pairs#0x100, + oc=\Eb?\Ec0, op=\Eb?\Ec0, + setab=\Ec%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1 + %{48}%+%c, + setaf=\Eb%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1 + %{48}%+%c, + setb=\Ec%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1 + %{48}%+%c, + setf=\Eb%?%p1%{0}%=%t?%e%p1%{7}%=%t0%e%p1%{15}%=%t7%e%p1 + %{48}%+%c, + use=tw52-m, +tw52-m|Toswin window manager monochrome, + ul, + ma#999, + bold=\Eya, dch1=\Ea, dim=\EyB, + is2=\Ev\Eq\Ez_\Ee\Ei\Eb?\Ec0, rev=\EyP, rmso=\EzQ, + rmul=\EzH, rs2=\Ev\Eq\Ez_\Ee\Ei\Eb?\Ec0, sgr0=\Ez_, + smso=\EyQ, smul=\EyH, use=at-m, +tt52|Atari TT medium and high resolution, + lines#30, use=at-color, +st52-color|at-color|atari-color|atari_st-color|Atari ST with color, + bce, + colors#16, pairs#0x100, + is2=\Ev\Eq\Ee\Eb1\Ec0, rs2=\Ev\Eq\Ee\Eb1\Ec0, + setab=\Ec%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3} + %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1 + %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e + %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14} + %=%t6%e?, + setaf=\Eb%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3} + %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1 + %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e + %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14} + %=%t6%e?, + setb=\Ec%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3} + %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1 + %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e + %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14}%= + %t6%e?, + setf=\Eb%?%p1%{0}%=%t1%e%p1%{1}%=%t2%e%p1%{2}%=%t3%e%p1%{3} + %=%t>%e%p1%{4}%=%t4%e%p1%{5}%=%t7%e%p1%{6}%=%t5%e%p1 + %{7}%=%t0%e%p1%{8}%=%t8%e%p1%{9}%=%t9%e%p1%{10}%=%t:%e + %p1%{11}%=%t;%e%p1%{12}%=%t<%e%p1%{13}%=%t=%e%p1%{14}%= + %t6%e?, + use=st52, +st52|st52-m|at|at-m|atari|atari-m|atari_st|atarist-m|Atari ST, + am, eo, mir, npc, + civis=\Ef, clear=\EE, cnorm=\Ee, dl1=\EM, el1=\Eo, il1=\EL, + is2=\Ev\Eq\Ee, kLFT=\Ed, kRIT=\Ec, kdch1=^?, kf1=\EP, + kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, kf14=\Es, kf15=\Et, + kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, kf2=\EQ, kf20=\Ey, + kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, kf8=\EW, kf9=\EX, + khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, kpp=\Ea, kund=\EK, + rc=\Ek, rev=\Ep, rmso=\Eq, rs2=\Ev\Eq\Ee, sc=\Ej, sgr0=\Eq, + smso=\Ep, use=vt52-basic, +tw100|Toswin VT100 window manager, + eo, mir, msgr, xon, + colors#8, cols#80, it#8, lines#24, pairs#64, vt#3, + acsc=++\,\,--..00II``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, civis=\Ef, + clear=\E[2J\E[H, cnorm=\Ee, cr=\r, cub1=^H, cud1=\EB, + cuf1=\EC, cup=\E[%i%p1%d;%p2%dH, cuu1=\EA, dch1=\Ea, + dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, + el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, il1=\EL, + ind=\n, is2=\E<\E)0, kdch1=^?, kf1=\EOP, kf10=\EOY, kf11=\Ep, + kf12=\Eq, kf13=\Er, kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, + kf18=\Ew, kf19=\Ex, kf2=\EOQ, kf20=\Ey, kf3=\EOR, kf4=\EOS, + kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, kf9=\EOX, khlp=\EH, + khome=\E\EE, kich1=\EI, knp=\Eb, kpp=\E\Ea, kund=\EK, + ll=\E[24H, nel=\EE, oc=\E[30;47m, op=\E[30;47m, rev=\E[7m, + ri=\EM, rmacs=^O, rmcup=\E[?7h, rmir=\Ei, rmkx=\E[?1l\E>, + rmso=\E[m, rmul=\E[m, + rs1=\E<\E[20l\E[?3;6;9l\E[r\Eq\E(B\017\E)0\E>, + setb=\E[4%p1%'0'%+%Pa%?%ga%'0'%=%t0%e%ga%'1'%=%t4%e%ga%'2'%= + %t2%e%ga%'3'%=%t6%e%ga%'4'%=%t1%e%ga%'5'%=%t5%e%ga%'6' + %=%t3%e7%;m, + setf=\E[3%p1%'0'%+%Pa%?%ga%'0'%=%t0%e%ga%'1'%=%t4%e%ga%'2'%= + %t2%e%ga%'3'%=%t6%e%ga%'4'%=%t1%e%ga%'5'%=%t5%e%ga%'6' + %=%t3%e7%;m, + sgr0=\E[m, smacs=^N, smcup=\E[?7l, smir=\Eh, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, + use=ansi+apparrows, use=ansi+csr, use=ansi+local, + +# The entries for stv52 and stv52pc probably need a revision. +stv52|MiNT virtual console, + am, msgr, + lines#30, + blink=\Er, bold=\EyA, civis=\Ef, clear=\EE, cnorm=\E. \Ee, + cub1=^H, cvvis=\E.", dim=\Em, dl1=\EM, il1=\EL, ind=\n$<2*/>, + kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, + kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, + kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, + kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, + kpp=\Ea, kund=\EK, nel=\r\n$<2*/>, op=\Eb@\EcO, rev=\Ep, + ri=\EI$<2*/>, rmcup=\Ev\E. \Ee\Ez_, rmso=\Eq, rmul=\EzH, + rs1=\Ez_\Eb@\EcA, sgr0=\Ez_, smcup=\Ev\Ee\Ez_, smso=\Ep, + smul=\EyH, use=vt52-basic, +stv52pc|MiNT virtual console with PC charset, + am, msgr, + lines#30, + acsc=+\257\,\256-\^.v0\333I\374`\177a\260f\370g\361h\261j + \331k\277l\332m\300n\305o\377p-q\304r-s_t+u+v+w+x\263y + \363z\362{\343|\366}\234~\371, + blink=\Er, bold=\EyA, civis=\Ef, clear=\EE, cnorm=\E. \Ee, + cub1=^H, cvvis=\E.", dim=\Em, dl1=\EM, il1=\EL, ind=\n$<2*/>, + kdch1=^?, kf1=\EP, kf10=\EY, kf11=\Ep, kf12=\Eq, kf13=\Er, + kf14=\Es, kf15=\Et, kf16=\Eu, kf17=\Ev, kf18=\Ew, kf19=\Ex, + kf2=\EQ, kf20=\Ey, kf3=\ER, kf4=\ES, kf5=\ET, kf6=\EU, kf7=\EV, + kf8=\EW, kf9=\EX, khlp=\EH, khome=\EE, kich1=\EI, knp=\Eb, + kpp=\Ea, kund=\EK, nel=\r\n$<2*/>, rev=\Ep, ri=\EI$<2*/>, + rmcup=\Ev\E. \Ee\Ez_, rmso=\Eq, rmul=\EzH, + rs1=\Ez_\Eb@\EcA, sgr0=\Ez_, smcup=\Ev\Ee\Ez_, smso=\Ep, + smul=\EyH, use=vt52-basic, + +# From: Simson L. Garfinkel +atari-old|Atari st, + OTbs, am, + cols#80, it#8, lines#25, + clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, + ed=\EJ, el=\EK, ht=^I, il1=\EL, ri=\EI, rmso=\Eq, sgr0=\Eq, + smso=\Ep, use=vt52+arrows, +# UniTerm terminal program for the Atari ST: 49-line VT220 emulation mode +# From: Paul M. Aoki +uniterm|uniterm49|UniTerm VT220 emulator with 49 lines, + lines#49, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;49r\E[49;1H, use=vt220-base, +# MiNT VT52 emulation. 80 columns, 25 rows. +# MiNT is Now TOS, the operating system which comes with all Ataris now +# (mainly Atari Falcon). This termcap is for the VT52 emulation you get +# under tcsh/zsh/bash/sh/ksh/ash/csh when you run MiNT in `console' mode +# From: Per Persson , 27 Feb 1996 +st52-old|Atari ST with VT52 emulation, + am, km, + cols#80, lines#25, + bel=^G, civis=\Ef, clear=\EH\EJ, cnorm=\Ee, cr=\r, cub1=\ED, + cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + cuu1=\EA, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, il1=\EL, + ind=\n, ka1=\E#7, ka3=\E#5, kb2=\E#9, kbs=^H, kc1=\E#1, + kc3=\E#3, kclr=\E#7, kcub1=\E#K, kcud1=\E#P, kcuf1=\E#M, + kcuu1=\E#H, kf0=\E#D, kf1=\E#;, kf2=\E#<, kf3=\E#=, kf4=\E#>, + kf5=\E#?, kf6=\E#@, kf7=\E#A, kf8=\E#B, kf9=\E#C, khome=\E#G, + kil1=\E#R, kind=\E#2, kri=\E#8, lf0=f10, nel=\r\n, rc=\Ek, + ri=\EI, rmcup=, rmso=\Eq, rs1=\Ez_\Eb@\EcA, sc=\Ej, sgr0=\Eq, + smcup=\Ee, smso=\Ep, + +#### BeOS +# +# BeOS entry for Terminal program Seems to be almost ANSI +beterm|BeOS Terminal, + am, eo, mir, msgr, xenl, xon, + cols#80, it#8, lines#25, ncv#5, + bel=^G, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ech=\E[%p1%dX, el1=\E[1K, + home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ind=\n, + kf1=\E[11~, kf10=\E[20~, kf11=\E[21~, kf12=\E[22~, + kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[16~, + kf7=\E[17~, kf8=\E[18~, kf9=\E[19~, khome=\E[1~, kspd=^Z, + nel=\r\n, op=\E[m, rev=\E[7m, ri=\EM, rmkx=\E[?4l, rmso=\E[m, + rmul=\E[24m, rs1=\Ec, setb=\E[%p1%{40}%+%cm, + setf=\E[%p1%{30}%+%cm, sgr0=\E[0;10m, smkx=\E[?4h, + smso=\E[7m, smul=\E[4m, u6=\E[%i%p1%d;%p2%dR, u7=\E[6n, + vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+csr, + use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+local, use=klone+color, use=vt220+pcedit, + +#### Linux consoles +# + +# release 1.2.13: 1995/03 +# +# This entry is good for the 1.2.13 or later version of the Linux console. +# +# *************************************************************************** +# * * +# * WARNING: * +# * Linuxes come with a default keyboard mapping kcbt=^I. This entry, in * +# * response to user requests, assumes kcbt=\E[Z, the ANSI/ECMA reverse-tab * +# * character. Here are the keymap replacement lines that will set this up: * +# * * +# keycode 15 = Tab Tab +# alt keycode 15 = Meta_Tab +# shift keycode 15 = F26 +# string F26 ="\033[Z" +# * * +# * This has to use a key slot which is unfortunate (any unused one will * +# * do, F26 is the higher-numbered one). The change ought to be built * +# * into the kernel tables. * +# * * +# *************************************************************************** +# +# All linux kernels since 1.2.13 (at least) set the screen size +# themselves; this entry assumes that capability. +# +linux-basic|Linux console (basic), + am, bce, eo, mir, msgr, xenl, xon, + it#8, ncv#18, U8#1, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i + \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u + \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + bel=^G, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + dim=\E[2m, ech=\E[%p1%dX, el1=\E[1K, + flash=\E[?5h$<200/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ht=^I, hts=\EH, ind=\n, kb2=\E[G, kbs=^?, kcbt=\E[Z, kf1=\E[[A, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\E[[B, + kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kmous=\E[M, kspd=^Z, + nel=\r\n, ri=\EM, rmam=\E[?7l, rmso=\E[27m, rmul=\E[24m, + rs1=\Ec\E]R, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;%?%p9%t;11%;m, + smam=\E[?7h, tbc=\E[3g, vpa=\E[%i%p1%dd, use=ansi+arrows, + use=ansi+csr, use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+local, use=vt220+pcedit, use=vt102+enq, + use=klone+sgr, use=ecma+color, use=linux+sfkeys, + +linux+decid|ncurses extension for Linux console DECID, + u8=\E[?6c, use=decid+cpr, + +linux+sfkeys|shifted function-keys for Linux console, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, + +linux-m|Linux console no color, + colors@, pairs@, + setab@, setaf@, setb@, setf@, use=linux, + +# release 1.3: 1995/06 +# +# The 1.3.x kernels add color-change capabilities; if yours doesn't have this +# and it matters, turn off . The %02x escape used to implement this is +# not supposedly back-portable to older SV curses (although it has worked fine +# on Solaris for several years) and not supported in ncurses versions before +# 1.9.9. +linux-c-nc|Linux console with color-change, + ccc, + initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/ + %02x%p4%{255}%*%{1000}%/%02x, + oc=\E]R, use=linux-basic, +# From: Dennis Henriksen , 9 July 1996 +linux-c|Linux console 1.3.6+ for older ncurses, + ccc, + initc=\E]P%?%p1%{9}%>%t%p1%{10}%-%'a'%+%c%e%p1%d%;%p2%{255} + %*%{1000}%/%Pr%gr%{16}%/%Px%?%gx%{9}%>%t%gx%{10}%-%'a' + %+%c%e%gx%d%;%gr%{15}%&%Px%?%gx%{9}%>%t%gx%{10}%-%'a' + %+%c%e%gx%d%;%p3%{255}%*%{1000}%/%Pr%gr%{16}%/%Px%?%gx + %{9}%>%t%gx%{10}%-%'a'%+%c%e%gx%d%;%gr%{15}%&%Px%?%gx + %{9}%>%t%gx%{10}%-%'a'%+%c%e%gx%d%;%p4%{255}%*%{1000} + %/%Pr%gr%{16}%/%Px%?%gx%{9}%>%t%gx%{10}%-%'a'%+%c%e%gx + %d%;%gr%{15}%&%Px%?%gx%{9}%>%t%gx%{10}%-%'a'%+%c%e%gx + %d%;, + oc=\E]R, use=linux-basic, + +# release 2.2: 1999/01 +# +# The 2.2.x kernels add a private mode that sets the cursor type; use that to +# get a block cursor for cvvis. +# reported by Frank Heckenbach . +linux2.2|Linux 2.2.x console, + civis=\E[?25l\E[?1c, cnorm=\E[?25h\E[?0c, + cvvis=\E[?25h\E[?8c, use=linux-c-nc, + +# release 2.6: 2003/12 - 2004/12 +# +# Linux 2.6.x has a fix for SI/SO to work with UTF-8 encoding added here: +# http://lkml.iu.edu/hypermail/linux/kernel/0602.2/0738.html +# Although the kernel has mappings for these, they were not in the default +# font (tested with Debian and Fedora): +# '`' diamond +# '~' scan line 1 +# 'p' scan line 3 +# 'r' scan line 7 +# '_' scan line 9 +# +# The fix for SI/SO is part of a configurable (i.e., "optional") kernel feature +# misleadingly called CONFIG_CONSOLE_TRANSLATIONS. Disabling that not only +# omits the line-drawing using SI/SO, but also part/all of the Unicode feature: +# +# https://cateee.net/lkddb/web-lkddb/CONSOLE_TRANSLATIONS.html +# "This enables support for font mapping and Unicode translation on virtual consoles." +# +# This mailing list thread in July 2008 illustrates: +# +# https://marc.info/?t=121734656700005&r=1&w=4 +# "commit a29ccf6f823a84d89e1c7aaaf221cf7282022024 break console on slackware 12.1" +# +# The change which made it configurable was to reduce the size for use in +# embedded systems. Some background is found in +# +# https://lwn.net/Articles/284767/ +# "An interview with the new embedded maintainers" +linux2.6|Linux 2.6.x console, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + enacs=\E)0, rmacs=^O, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, use=linux2.2, + +# The 3.0 kernel adds support for clearing scrollback buffer (capability E3). +# It is the same as xterm's erase-saved-lines feature. +# +# Linux 3.0 was released in July 2011. The keyboard utilities (kbd) are +# used for configuring its keyboard mappings. +# +# kbd 1.14 was released before that (January 2008), but due to its placement +# late in the Linux 2.6.x series had no immediate effect for most users. That +# provided a default mapping for shift-tab to the (misnamed) Meta_Tab, i.e., +# the same as Alt-Tab. +# +# The suggested mapping for the conventional \E[Z is provided in this entry as +# an extended key to lessen user surprise -TD +linux3.0|Linux 3.0 kernels, + kcbt=\E^I, E3=\E[3J, kcbt2=\E[Z, use=linux2.6, + +# This is Linux console for ncurses. +linux|Linux console, + use=linux3.0, + +# Subject: linux 2.6.26 vt back_color_erase +# Changes to the Linux console driver broke bce model as reported in +# https://bugzilla.novell.com/show_bug.cgi?id=418613 +# apparently from +# http://lkml.org/lkml/2008/4/26/305 +# http://lkml.org/lkml/2008/10/3/66 +linux2.6.26|Linux console w/o bce, + bce@, use=linux2.6, + +# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file +linux-nic|Linux with ich/ich1 suppressed for non-curses programs, + ich@, ich1@, use=linux, + +# This assumes you have used setfont(8) to load one of the Linux koi8-r fonts. +# acsc entry from Pavel Roskin" , 29 Sep 1997. +linux-koi8|Linux with koi8 alternate character set, + acsc=+\020\,\021-\030.^Y0\215`\004a\221f\234g\237h\220i + \276j\205k\203l\202m\204n\212o~p\0q\0r\0s_t\206u\207v + \211w\210x\201y\230z\231{\267|\274~\224, + use=linux, use=klone+koi8acs, + +# Another entry for KOI8-r with Qing Long's acsc. +# (which one better complies with the standard?) +linux-koi8r|Linux with koi8-r alternate character set, + use=linux, use=klone+koi8acs, + +# Entry for the latin1 and latin2 fonts +linux-lat|Linux with latin1 or latin2 alternate character set, + acsc=+\020\,\021-\030.^Y0\333`\004a\013f\370g\361h\260i + \316j\211k\214l\206m\203n\305o~p\304q\212r\304s_t\207u + \215v\301w\302x\205y\363z\362{\343|\330}\234~\376, + use=linux, + +# This uses graphics from VT codeset instead of from cp437. +# reason: cp437 (aka "straight to font") is not functional under luit. +# from: Andrey V Lukyanov . +linux-vt|Linux console using VT codes for graphics, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz~~, + rmacs=\E(K, rmpch@, sgr@, sgr0=\E[0m\E(K\017, smacs=\E(0, + smpch@, use=linux, + +# release: 0.3.9b 1997/01 to 2000/05 +# +# This is based on the Linux console (relies on the console to perform some +# of the functionality), but does not recognize as many control sequences. +# The program comes bundled with an old (circa 1998) copy of the Linux +# console terminfo. It recognizes some non-ANSI/VT100 sequences such as +# \E* move cursor to home, as as \E[H +# \E,X same as \E(X +# \EE move cursor to beginning of row +# \E[y,xf same as \E[y,xH +# +# Note: The status-line support is buggy (dsl does not work). +kon|kon2|Kanji ON Linux console, + am, bce, ccc, eo, eslok, hs, mir, msgr, xenl, xon, + it#8, ncv#18, + bel=^G, civis=\E[?25l, cnorm=\E[?25h, cr=\r, cub1=^H, + cud1=\n, cup=\E[%i%p1%d;%p2%dH, dim=\E[2m, + dsl=\E[?H\E[?E, el1=\E[1K, fsl=\E[?F, home=\E[H, + hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ind=\n, + initc=\E]P%p1%x%p2%02x%p3%02x%p4%02x, kb2=\E[G, kbs=^?, + kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, + kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kspd=^Z, + nel=\r\n, op=\E[37;40m, ri=\EM, rmso=\E[27m, rmul=\E[24m, + rs1=\Ec, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + sgr0=\E[0;10m, tbc=\E[3g, tsl=\E[?T, u8=\E[?6c, + vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+csr, + use=ansi+enq, use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+local, use=ansi+sgrbold, use=ecma+sgr, + use=klone+color, use=vt220+pcedit, + +# release: 0.4.7 2005/05 +# +jfbterm|japanese framebuffer terminal, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + sgr0=\E[0m, use=kon, + +# FbTerm +# Another variant. There are two parts (src, src/lib) with the latter +# comprising the escape-sequence parsing. The copyright notice on that +# says it is based on GTerm by Timothy Miller. +# +# The original developer "dragchan" has left, but as of March 2017 there is +# (still dead) code from May 2015 here: +# https://github.com/izmntuk/fbterm +# +# The acsc string may be incorrect. +# +# Not used here, the program recognizes escapes for italic, underline and +# dim, rendering those as green, cyan and gray respectively. +fbterm|FbTerm for Linux with framebuffer, + colors#0x100, pairs#0x10000, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i + \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u + \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + initc=\E[3;%p1%d;%p2%d;%p3%d;%p4%d}, rmacs=\E[10m, + setab=\E[2;%p1%d}, setaf=\E[1;%p1%d}, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;%?%p9%t;11%;m, + sgr0=\E[0;10m, smacs=\E[11m, use=linux, + +# 16-color linux console entry; this works with a 256-character +# console font but bright background colors turn into dim ones when +# you use a 512-character console font. This uses bold for bright +# foreground colors and blink for bright background colors. +# +# Interestingly, the original version of this entry in 2009 used a documented +# (but nonstandard) SGR 21, which was supported in the Linux console since 1992 +# as an equivalent for SGR 22. Long after (early 2018), someone modified the +# console driver to make it ignore SGR 21 because the ECMA-48 standard +# suggested a different use for that particular code: +# +# https://github.com/torvalds/linux/commit/65d9982d7e523a1a8e7c9af012da0d166f72fc56#diff-7da3c215d12c9f6b88e1a37d38b116f0 +# +# Two years later, someone (unfamiliar with ECMA-48 this time) documented it: +# +# https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/man4/console_codes.4?id=a133a6bc03d751a424fe0a4adea2198757599615 +# +# For background, refer to the report on bug-ncurses: +# +# https://lists.gnu.org/archive/html/bug-ncurses/2019-10/msg00059.html +linux-16color|Linux console with 16 colors, + colors#16, ncv#42, pairs#0x100, + setab=\E[4%p1%{8}%m%d%?%p1%{7}%>%t;5%e;25%;m, + setaf=\E[3%p1%{8}%m%d%?%p1%{7}%>%t;1%e;22%;m, + use=linux, + +# bterm (bogl 0.1.18) +# Implementation is in bogl-term.c +# Key capabilities from linux terminfo entry +# +# Notes: +# bterm only supports acs using wide-characters, has case for these: qjxamlkut +# bterm does not support sgr, since it only processes one parameter -TD +bterm|bogl virtual terminal, + am, bce, + colors#8, cols#80, lines#24, pairs#64, + acsc=aajjkkllmmqqttuuxx, bold=\E[1m, clear=\E[H\E[2J, + cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, ed=\E[J, + el=\E[K, home=\E[H, ind=\n, kb2=\E[G, kbs=^?, kcbt=\E[Z, + kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, + kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, + kmous=\E[M, kspd=^Z, nel=\r\n, op=\E[49m\E[39m, rev=\E[7m, + ri=\EM, rmacs=^O, rmso=\E[27m, rmul=\E[24m, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[0m, smacs=^N, + smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=vt220+pcedit, use=vt220+cvis, + +#### Mach +# + +# From: Matthew Vernon +mach|Mach console, + am, km, NQ, + cols#80, it#8, lines#25, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\Ec, cr=\r, cub1=^H, + cud1=\n, cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, + home=\E[H, ht=^I, ind=\n, kbs=^?, kdch1=\E[9, kend=\E[Y, + kf1=\EOP, kf10=\EOY, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, + kf6=\EOU, kf7=\EOV, kf8=\EOW, kf9=\EOX, kich1=\E[@, kll=\E[F, + knp=\E[U, kpp=\E[V, rev=\E[7m, rmso=\E[0m, rmul=\E[24m, + sgr0=\E[0m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+idl, use=ansi+local, + +mach-bold|Mach console with bold instead of underline, + rmul=\E[0m, smul=\E[1m, use=mach, +mach-color|Mach console with ANSI color, + colors#8, pairs#64, + dim=\E[2m, invis=\E[8m, op=\E[37;40m, rmso=\E[27m, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=mach, + +# From: Samuel Thibault +# Source: git://git.sv.gnu.org/hurd/gnumach.git +# Files: i386/i386at/kd.c +# +# Added nel, hpa, sgr and removed rmacs, smacs based on source -TD +mach-gnu|GNU Mach, + acsc=+>\,<-\^.v0\333`+a\261f\370g\361h\260i#j\331k\277l + \332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w\302x + \263y\363z\362{\343|\330}\234~\376, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, ech=\E[%p1%dX, + el1=\E[1K, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ich1=\E[@, + invis=\E[8m, nel=\EE, + sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t; + 2%;%?%p6%t;1%;%?%p7%t;8%;m, + use=ecma+index, use=mach, + +mach-gnu-color|GNU Mach console with ANSI color, + colors#8, pairs#64, + op=\E[37;40m, rmso=\E[27m, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, use=mach-gnu, + +# From: Marcus Brinkmann +# http://git.savannah.gnu.org/cgit/hurd/hurd.git/log/console/ +# +# Comments in the original are summarized here: +# +# hurd uses 8-bit characters (km). +# +# Although it doesn't do XON/XOFF, we don't want padding characters (xon). +# +# Regarding compatibility to vt100: hurd doesn't specify , as we don't +# have the eat_newline_glitch. It doesn't support setting or removing tab +# stops (hts/tbc). +# +# hurd uses ^H instead of \E[D for cub1, as only ^H implements and it is +# one byte instead three. +# +# is not included because hurd has insert mode. +# +# hurd doesn't use ^J for scrolling, because this could put things into the +# scrollback buffer. +# +# gsbom/grbom are used to enable/disable real bold (not intensity bright) mode. +# This is a GNU extension. +# +# The original has commented-out ncv, but is restored here. +# +# Reading the source, RIS resets cnorm, but not xmous. +hurd|The GNU Hurd console server, + am, bce, bw, eo, km, mir, msgr, xenl, xon, NQ, + it#8, ncv#18, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + bel=^G, cbt=\E[Z, clear=\Ec, cr=\r, cub1=^H, cvvis=\E[34l, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, ech=\E[%p1%dX, + el1=\E[1K, flash=\Eg, ht=^I, ich=\E[%p1%d@, ind=\E[S, + kb2=\E[G, kbs=^?, kcbt=\E[Z, kf1=\EOP, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, + kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, kmous=\E[M, kspd=^Z, nel=\r\n, op=\E[39;49m, + ri=\E[T, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, + rs1=\EM\E[?1000l, + sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t; + 2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + smir=\E[4h, grbom=\E[>1l, gsbom=\E[>1h, + use=ansi+apparrows, use=ansi+csr, use=ansi+cup, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ansi+rca2, use=ansi+sgrbold, use=vt220+pcedit, + use=ecma+index, use=ecma+italics, use=klone+acs, + use=klone+color, use=vt220+cvis, + +#### QNX +# + +# QNX 4.0 Console +# Michael's original version of this entry had , , +# ; this was so terminfo applications could write the lower +# right corner without triggering a scroll. The ncurses terminfo library can +# handle this case with the capability, and prefers for better +# optimization. Bug: The capability resets attributes. +# From: Michael Hunter 30 Jul 1996 +# (removed: ) +qnx|qnx4|QNX console, + daisy, km, mir, msgr, xhpa, xt, + colors#8, cols#80, it#4, lines#25, ncv#3, pairs#8, + acsc=O\333a\261j\331k\277l\332m\300n\305o\337q\304s\334t + \303u\264v\301w\302x\263, + bel=^G, blink=\E{, bold=\E<, civis=\Ey0, clear=\EH\EJ, + cnorm=\Ey1, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\Ey2, + dch1=\Ef, dl1=\EF, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\Ee, + il1=\EE, ind=\n, kBEG=\377\356, kCAN=\377\263, + kCMD=\377\267, kCPY=\377\363, kCRT=\377\364, + kDL=\377\366, kEND=\377\301, kEOL=\377\311, + kEXT=\377\367, kFND=\377\370, kHLP=\377\371, + kHOM=\377\260, kIC=\377\340, kLFT=\377\264, + kMOV=\377\306, kMSG=\377\304, kNXT=\377\272, + kOPT=\377\372, kPRT=\377\275, kPRV=\377\262, + kRDO=\377\315, kRES=\377\374, kRIT=\377\266, + kRPL=\377\373, kSAV=\377\307, kSPD=\377\303, + kUND=\377\337, kbeg=\377\300, kcan=\377\243, kcbt=\377\0, + kclo=\377\343, kclr=\377\341, kcmd=\377\245, + kcpy=\377\265, kcrt=\377\305, kctab=\377\237, + kcub1=\377\244, kcud1=\377\251, kcuf1=\377\246, + kcuu1=\377\241, kdch1=\377\254, kdl1=\377\274, + ked=\377\314, kel=\377\310, kend=\377\250, kent=\377\320, + kext=\377\270, kf1=\377\201, kf10=\377\212, + kf11=\377\256, kf12=\377\257, kf13=\377\213, + kf14=\377\214, kf15=\377\215, kf16=\377\216, + kf17=\377\217, kf18=\377\220, kf19=\377\221, + kf2=\377\202, kf20=\377\222, kf21=\377\223, + kf22=\377\224, kf23=\377\333, kf24=\377\334, + kf25=\377\225, kf26=\377\226, kf27=\377\227, + kf28=\377\230, kf29=\377\231, kf3=\377\203, + kf30=\377\232, kf31=\377\233, kf32=\377\234, + kf33=\377\235, kf34=\377\236, kf35=\377\276, + kf36=\377\277, kf37=\377\321, kf38=\377\322, + kf39=\377\323, kf4=\377\204, kf40=\377\324, + kf41=\377\325, kf42=\377\326, kf43=\377\327, + kf44=\377\330, kf45=\377\331, kf46=\377\332, + kf47=\377\316, kf48=\377\317, kf5=\377\205, kf6=\377\206, + kf7=\377\207, kf8=\377\210, kf9=\377\211, kfnd=\377\346, + khlp=\377\350, khome=\377\240, khts=\377\342, + kich1=\377\253, kil1=\377\273, kind=\377\261, + kmov=\377\351, kmrk=\377\355, kmsg=\377\345, + knp=\377\252, knxt=\377\312, kopn=\377\357, + kopt=\377\353, kpp=\377\242, kprt=\377\255, + kprv=\377\302, krdo=\377\336, kref=\377\354, + kres=\377\360, krfr=\377\347, kri=\377\271, + krmir=\377\313, krpl=\377\362, krst=\377\352, + ksav=\377\361, kslt=\377\247, kspd=\377\335, + ktbc=\377\344, kund=\377\365, mvpa=\E!%p1%02d, op=\ER, + rep=\Eg%p2%{32}%+%c%p1%c, rev=\E(, ri=\EI, rmcup=\Eh\ER, + rmso=\E), rmul=\E], rs1=\ER, setb=\E@%p1%Pb%gb%gf%d%d, + setf=\E@%p1%Pf%gb%gf%d%d, sgr0=\E}\E]\E>\E), smcup=\Ei, + smso=\E(, smul=\E[, +# +# +qnxt|qnxt4|QNX4 terminal, + crxm, use=qnx4, +# +qnxm|QNX4 with mouse events, + maddr#1, + chr=\E/, cvr=\E", is1=\E/0t, mcub=\E/>1h, mcub1=\E/>7h, + mcud=\E/>1h, mcud1=\E/>1l\E/>9h, mcuf=\E/>1h\E/>9l, + mcuf1=\E/>7l, mcuu=\E/>6h, mcuu1=\E/>6l, rmicm=\E/>2l, + smicm=\E/>2h, use=qnx4, +# +qnxw|QNX4 windows, + xvpa, use=qnxm, +# +# Monochrome QNX4 terminal or console. Setting this terminal type will +# allow an application running on a color console to behave as if it +# were a monochrome terminal. Output will be through stdout instead of +# console writes because the term routines will recognize that the +# terminal name starts with 'qnxt'. +# +qnxtmono|Monochrome QNX4 terminal or console, + colors@, pairs@, + scp@, use=qnx4, + +# From: Federico Bianchi , 1 Jul 1998 +# (esr: commented out and to avoid warnings.) +# (TD: derive from original qnx4 entry) +qnxt2|QNX 2.15 serial terminal, + am, + civis@, cnorm@, cvvis@, dch1@, ich1@, kRES@, kRPL@, kUND@, kspd@, + rep@, rmcup@, rmso=\E>, setb@, setf@, smcup@, smso=\E<, use=qnx4, + +# QNX ANSI terminal definition +qansi-g|QNX ANSI, + am, eslok, hs, xon, + colors#8, cols#80, lines#25, ncv#19, pairs#64, wsl#80, + acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, clear=\E[2J\E[H, cr=\r, csr=\E[%i%p1%d;%p2%dr, + cup=\E[%i%p1%d;%p2%dH$<5>, cvvis=\E[?12;25h, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, + dl1=\E[1M, dsl=\E[r, ech=\E[%p1%dX, ed=\E[J, el=\E[K, + el1=\E[1K\E[X, flash=\E[?5h$<200>\E[?5l, fsl=\E[?6h\E8, + home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ich1=\E[1@, + il=\E[%p1%dL, il1=\E[1L, ind=\E[S, invis=\E[9m, + is2=\E>\E[?1l\E[?7h\E[0;10;39;49m, is3=\E(B\E)0, + kBEG=\ENn, kCAN=\E[s, kCMD=\E[t, kCPY=\ENs, kCRT=\ENt, + kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kHOM=\E[h, + kLFT=\E[d, kNXT=\E[u, kOPT=\ENz, kPRV=\E[v, kRIT=\E[c, + kcan=\E[S, kcbt=\E[Z, kclo=\ENc, kclr=\ENa, kcmd=\E[G, + kcpy=\E[g, kctab=\E[z, kdch1=\E[P, kdl1=\E[p, kend=\E[Y, + kext=\E[y, kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, + kf13=\EOp, kf14=\EOq, kf15=\EOr, kf16=\EOs, kf17=\EOt, + kf18=\EOu, kf19=\EOv, kf2=\EOQ, kf20=\EOw, kf21=\EOx, + kf22=\EOy, kf23=\EOz, kf24=\EOa, kf25=\E[1~, kf26=\E[2~, + kf27=\E[3~, kf28=\E[4~, kf29=\E[5~, kf3=\EOR, kf30=\E[6~, + kf31=\E[7~, kf32=\E[8~, kf33=\E[9~, kf34=\E[10~, + kf35=\E[11~, kf36=\E[12~, kf37=\E[17~, kf38=\E[18~, + kf39=\E[19~, kf4=\EOS, kf40=\E[20~, kf41=\E[21~, + kf42=\E[22~, kf43=\E[23~, kf44=\E[24~, kf45=\E[25~, + kf46=\E[26~, kf47=\E[27~, kf48=\E[28~, kf5=\EOT, kf6=\EOU, + kf7=\EOV, kf8=\EOW, kf9=\EOX, kfnd=\ENf, khlp=\ENh, + khts=\ENb, kich1=\E[@, kil1=\E[`, kind=\E[a, kmov=\ENi, + kmrk=\ENm, kmsg=\ENe, knp=\E[U, kopn=\ENo, kopt=\ENk, + kpp=\E[V, kref=\ENl, kres=\ENp, krfr=\ENg, kri=\E[b, + krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\E[T, ktbc=\ENd, + kund=\ENu, ll=\E[99H, nel=\EE, op=\E[39;49m, ri=\E[T, + rmacs=^O, rmam=\E[?7l, rmso=\E[27m, rmul=\E[24m, + rs1=\017\E[?7h\E[0;39;49m$<2>\E>\E[?1l, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%t;7%;%?%p7%t;9%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, + tsl=\E7\E1;24r\E[?6l\E[25;%i%p1%dH, use=ansi+arrows, + use=ansi+local, use=ansi+rep, use=ansi+inittabs, + use=ansi+sgrbold, use=att610+cvis0, use=decid+cpr, + use=ecma+index, +# +qansi|QNX ANSI with console writes, + daisy, xhpa, use=qansi-g, +# +qansi-t|QNX ANSI without console writes, + crxm, use=qansi, +# +qansi-m|QNX ANSI with mouse, + maddr#1, + chr=\E[, cvr=\E], is1=\E[0t, mcub=\E[>1h, mcub1=\E[>7h, + mcud=\E[>1h, mcud1=\E[>1l\E[>9h, mcuf=\E[>1h\E[>9l, + mcuf1=\E[>7l, mcuu=\E[>6h, mcuu1=\E[>6l, rmicm=\E[>2l, + smicm=\E[>2h, use=qansi, +# +qansi-w|QNX ANSI for windows, + xvpa, use=qansi-m, + +#### SCO consoles + +# SCO console and SOS-Syscons console for 386bsd +# (scoansi: had unknown capabilities +# :Gc=N:Gd=K:Gh=M:Gl=L:Gu=J:Gv=\072:\ +# :GC=E:GD=B:GH=D:GL=\64:GU=A:GV=\63:GR=C: +# :G1=?:G2=Z:G3=@:G4=Y:G5=;:G6=I:G7=H:G8=<:\ +# :CW=\E[M:NU=\E[N:RF=\E[O:RC=\E[P:\ +# :WL=\E[S:WR=\E[T:CL=\E[U:CR=\E[V:\ +# I renamed GS/GE/HM/EN/PU/PD/RT and added klone+sgr-dumb, based +# on the =\E[12m -- esr) +# +# klone+sgr-dumb is an error since the acsc does not match -TD +# +# In this description based on SCO's keyboard(HW) manpage list of default +# function key values: +# F13-F24 are shifted F1-F12 +# F25-F36 are control F1-F12 +# F37-F48 are shift+control F1-F12 +# +# hpa/vpa work in the console, but not in scoterm: +# hpa=\E[%p1%dG, +# vpa=\E[%p1%dd, +# +# SCO's terminfo uses +# kLFT=\E[d, +# kRIT=\E[c, +# which do not work (console or scoterm). +# +# Console documents only 3 attributes can be set with SGR (so we don't use sgr). +scoansi-old|SCO Extended ANSI standard crt (5.0.5), + OTbs, am, bce, eo, xon, NQ, + colors#8, cols#80, it#8, lines#25, pairs#64, + acsc=+/\,.-\230.\2310[5566778899::;;<<==>>FFGGHHIIJJKKLLMMNN + OOPPQQRRSSTTUUVVWWXX`\204a0fxgqh2jYk?lZm@nEqDtCu4vAwBx3 + yszr{c}\034~\207, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, + civis=\E[=14;12C, clear=\E[H\E[2J, cnorm=\E[=10;12C, + cub1=^H, cup=\E[%i%p1%d;%p2%dH, cvvis=\E[=0;12C, + dch=\E[%p1%dP, dch1=\E[P, dispc=\E[=%p1%dg, ed=\E[m\E[J, + el=\E[m\E[K, el1=\E[1K, home=\E[H, ht=^I, hts=\EH, + ich=\E[%p1%d@, ich1=\E[@, ind=\E[S, invis=\E[8m, kbeg=\E[E, + kcbt=\E[Z, kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, + kf11=\E[W, kf12=\E[X, kf13=\E[Y, kf15=\E[a, kf16=\E[b, + kf17=\E[c, kf18=\E[d, kf19=\E[e, kf2=\E[N, kf20=\E[f, + kf21=\E[g, kf22=\E[h, kf23=\E[i, kf24=\E[j, kf25=\E[k, + kf26=\E[l, kf27=\E[m, kf28=\E[n, kf29=\E[o, kf3=\E[O, + kf30=\E[p, kf31=\E[q, kf32=\E[r, kf33=\E[s, kf34=\E[t, + kf35=\E[u, kf36=\E[v, kf37=\E[w, kf38=\E[x, kf39=\E[y, + kf4=\E[P, kf40=\E[z, kf41=\E[@, kf42=\E[[, kf43=\E[\\, + kf44=\E[], kf45=\E[\^, kf46=\E[_, kf47=\E[`, kf48=\E[{, + kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, kich1=\E[L, + knp=\E[G, kpp=\E[I, op=\E[0;37;40m, rc=\E8, rev=\E[7m, + ri=\E[T, rmacs=\E[10m, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, + sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + sgr0=\E[0;10m, smacs=\E[12m, smam=\E[?7h, smso=\E[7m, + smul=\E[4m, use=ansi+arrows, use=ansi+idl, + use=ansi+local, use=ecma+index, + +scoansi-new|SCO Extended ANSI standard crt (5.0.6), + km, + civis=\E[=0c, cnorm=\E[=1c, csr=\E[%i%p1%d;%p2%dr, + cvvis=\E[=2c, mgc=\E[=r, oc=\E[51m, op=\E[50m, + rep=\E[%p1%d;%p2%db, rmm=\E[=11L, + sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%? + %p7%t;8%;%?%p9%t;12%e;10%;m, + smgb=\E[=1;0m, smgbp=\E[=1;%i%p1%dm, + smglp=\E[=2;%i%p1%dm, smgr=\E[=3;0m, + smgrp=\E[=3;%i%p1%dm, smgt=\E[=0;0m, + smgtp=\E[=0;%i%p1%dm, smm=\E[=10L, + wind=\E[%i%p1%d;%p2%d;%i%p3%d;%p4%dr, + use=scoansi-old, +# make this easy to change... +scoansi|SCO Extended ANSI standard crt, + use=scoansi-old, + +#### SGI consoles + +# Sent by Stefan Stapelberg , 24 Feb 1997, this is +# from SGI's terminfo database. SGI's entry shows F9-F12 with the codes +# for the application keypad mode. We have added iris-ansi-ap rather than +# change the original to keypad mode. +# +# (iris-ansi: added rmam/smam based on init string -- esr) +# +# This entry, and those derived from it, is used in xwsh (also known as +# winterm). Some capabilities that do not fit into the terminfo model +# include the shift- and control-functionkeys: +# +# F1-F12 generate different codes when shift or control modifiers are used. +# For example: +# F1 \E[001q +# shift F1 \E[013q +# control-F1 \E[025q +# +# In application keypad mode, F9-F12 generate codes like vt100 PF1-PF4, i.e., +# \EOP to \EOS. The shifted and control modifiers still do the same thing. +# +# The cursor keys also have different codes: +# control-up \E[162q +# control-down \E[165q +# control-left \E[159q +# control-right \E[168q +# +# shift-up \E[161q +# shift-down \E[164q +# shift-left \E[158q +# shift-right \E[167q +# +# control-tab \[072q +# +iris-ansi|iris-ansi-net|IRIS emulating 40 line ANSI terminal (almost VT100), + am, + cols#80, it#8, lines#40, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, + cnorm=\E[9/y\E[12/y\E[=6l, cr=\r, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, + cvvis=\E[10/y\E[=1h\E[=2l\E[=6h, ed=\E[J, el=\E[K, + el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ind=\ED, + is2=\E[?1l\E>\E[?7h\E[100g\E[0m\E7\E[r\E8, kDC=\E[P, + kEND=\E[147q, kHOM=\E[143q, kLFT=\E[158q, kPRT=\E[210q, + kRIT=\E[167q, kSPD=\E[218q, kcbt=\E[Z, kdch1=^?, + kend=\E[146q, kent=\r, kf1=\E[001q, kf10=\E[010q, + kf11=\E[011q, kf12=\E[012q, kf2=\E[002q, kf3=\E[003q, + kf4=\E[004q, kf5=\E[005q, kf6=\E[006q, kf7=\E[007q, + kf8=\E[008q, kf9=\E[009q, kich1=\E[139q, knp=\E[154q, + kpp=\E[150q, kprt=\E[209q, krmir=\E[146q, kspd=\E[217q, + nel=\EE, pfkey=\EP101;%p1%d.y%p2%s\E\\, rc=\E8, + rev=\E[7m, ri=\EM, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, sc=\E7, + sgr0=\E[m, smam=\E[?7h, smso=\E[1;7m, smul=\E[4m, + tbc=\E[3g, use=ansi+arrows, use=ansi+idl, use=ansi+local, + +iris-ansi-ap|IRIS ANSI in application-keypad mode, + is2=\E[?1l\E=\E[?7h, kent=\EOM, use=iris-ansi, + +# From the man-page, this is a quasi-vt100 emulator that runs on SGI's IRIX +# (T.Dickey 98/1/24) +iris-color|xwsh|IRIX ANSI with color, + ncv#33, + csr=\E[%i%p1%d;%p2%dr, dch=\E[%p1%dP, dim=\E[2m, + ech=\E[%p1%dX, ich=\E[%p1%d@, rmul=\E[24m, rs1=\Ec, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + use=ecma+italics, use=vt100+enq, use=klone+color, + use=iris-ansi-ap, + +#### OpenBSD consoles +# +# From: Alexei Malinin ; October, 2011. +# +# The following terminal descriptions for the AMD/Intel PC console +# were prepared based on information contained in the OpenBSD-4.9 +# termtypes.master and wscons(4) & vga(4) manuals (2010, November). +# +# Added bce based on testing with tack -TD +# Added several capabilities to pccon+base, reading wsemul_vt100_subr.c -TD +# Changed kbs to DEL and removed keys that duplicate stty settings -TD +# +# Notes from testing with vttest: +# fails wrapping test +# no 8-bit controls +# identifies as vt200 with selective erase, but does not implement DECSCA +# no vt52 mode +# also lacks these: +# ESC # 8 DEC Screen Alignment Test (DECALN). +# CSI ? 5 h Reverse Video (DECSCNM). +# +pccon+keys|OpenBSD PC keyboard keys, + kbs=^?, kend=\E[8~, kent=\r, kf1=\E[11~, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[35~, + kf22=\E[36~, kf23=\E[37~, kf24=\E[38~, kf3=\E[13~, + kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, + kf9=\E[20~, khome=\E[7~, krfr=^R, use=ansi+arrows, + use=vt220+pcedit, +pccon+sgr+acs0|sgr and simple ASCII pseudographics for OpenBSD PC console, + acsc=+>\,<-\^.v0#`+a:f\\h#i#j+k+l+m+n+o~p-q-r-s_t+u+v+w+x|y# + z#{*|!}#~o, + bold=\E[1m, rev=\E[7m, rmso=\E[27m, + sgr=\E[0%?%p1%p3%|%t;7%;%?%p6%t;1%;%?%p2%t;4%;m, + sgr0=\E[m, smso=\E[7m, +pccon+sgr+acs|sgr and default ASCII pseudographics for OpenBSD PC console, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bold=\E[1m, enacs=\E)0, rev=\E[7m, rmacs=\E(B, rmso=\E[27m, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e + \E(B%;, + sgr0=\E[m\E(B, smacs=\E(0, smso=\E[7m, +# underline renders as color +pccon+colors|ANSI colors for OpenBSD PC console, + bce, + ncv#2, + op=\E[49;39m, use=klone+color, +# OpenBSD uses wscons, +# + which does not implement DECSCNM or anything comparable, so it does not +# support flash. +# + it renders underline using color. +pccon+base|base capabilities for OpenBSD PC console, + am, km, mc5i, msgr, npc, nxon, xenl, xon, + cols#80, it#8, lines#24, + bel=^G, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, ech=\E[%p1%dX, el1=\E[1K, + home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ind=\ED, nel=\EE, + ri=\EM, rmam=\E[?7l, rmul=\E[24m, rs2=\Ec, smam=\E[?7h, + smul=\E[4m, tbc=\E[3g, use=ansi+cpr, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+local, + +pccon0-m|OpenBSD PC console without colors & with simple ASCII pseudographics, + use=pccon+sgr+acs0, use=pccon+base, use=pccon+keys, +pccon0|OpenBSD PC console with simple ASCII pseudographics, + use=pccon0-m, use=pccon+colors, +pccon-m|OpenBSD PC console without colors, + use=pccon+base, use=pccon+sgr+acs, use=pccon+keys, + use=ansi+enq, use=vt220+cvis, +pccon|OpenBSD PC console, + use=pccon-m, use=pccon+colors, + +#### NetBSD consoles +# +# pcvt termcap database entries (corresponding to release 3.31) +# Author's last edit-date: [Fri Sep 15 20:29:10 1995] +# +# (For the terminfo master file, I translated these into terminfo syntax. +# Then I dropped all the pseudo-HP entries. we don't want and can't use +# the :Xs: flag. Then I split :is: into a size-independent and a +# size-dependent . Finally, I added / -- esr) + +# NOTE: has been taken out of this entry. for reference, it should +# be . For discussion, see ICH/ICH1 VERSUS RMIR/SMIR below. +# (esr: added and to resolve NetBSD Problem Report #4583) +pcvtXX|pcvt VT200 emulator (DEC VT220), + am, km, mir, msgr, xenl, + it#8, vt#3, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz~~, + bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ind=\ED, + is1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kbs=^?, + kdch1=\E[3~, kf1=\E[17~, kf2=\E[18~, kf3=\E[19~, + kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, + khome=\E[1~, kich1=\E[2~, kll=\E[4~, knp=\E[6~, kpp=\E[5~, + nel=\EE, rev=\E[7m, rf=/usr/share/tabset/vt100, ri=\EM, + rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[27m, rmul=\E[24m, + rs1=\Ec\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr0=\E[m, + smacs=\E(0, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+apparrows, + use=ansi+csr, use=ansi+erase, use=ansi+idl, + use=ansi+local, use=decid+cpr, use=ecma+index, + use=vt220+cvis, + +# NetBSD/FreeBSD VT220 terminal emulator console (pc keyboard & monitor) +# termcap entries for pure VT220-Emulation and 25, 28, 35, 40, 43 and +# 50 lines entries; 80 columns +pcvt25|DEC VT220 emulation with 25 lines, + cols#80, lines#25, + is2=\E[1;25r\E[25;1H, use=pcvtXX, +pcvt28|DEC VT220 emulation with 28 lines, + cols#80, lines#28, + is2=\E[1;28r\E[28;1H, use=pcvtXX, +pcvt35|DEC VT220 emulation with 35 lines, + cols#80, lines#35, + is2=\E[1;35r\E[35;1H, use=pcvtXX, +pcvt40|DEC VT220 emulation with 40 lines, + cols#80, lines#40, + is2=\E[1;40r\E[40;1H, use=pcvtXX, +pcvt43|DEC VT220 emulation with 43 lines, + cols#80, lines#43, + is2=\E[1;43r\E[43;1H, use=pcvtXX, +pcvt50|DEC VT220 emulation with 50 lines, + cols#80, lines#50, + is2=\E[1;50r\E[50;1H, use=pcvtXX, + +# NetBSD/FreeBSD VT220 terminal emulator console (pc keyboard & monitor) +# termcap entries for pure VT220-Emulation and 25, 28, 35, 40, 43 and +# 50 lines entries; 132 columns +pcvt25w|DEC VT220 emulation with 25 lines and 132 cols, + cols#132, lines#25, + is2=\E[1;25r\E[25;1H, use=pcvtXX, +pcvt28w|DEC VT220 emulation with 28 lines and 132 cols, + cols#132, lines#28, + is2=\E[1;28r\E[28;1H, use=pcvtXX, +pcvt35w|DEC VT220 emulation with 35 lines and 132 cols, + cols#132, lines#35, + is2=\E[1;35r\E[35;1H, use=pcvtXX, +pcvt40w|DEC VT220 emulation with 40 lines and 132 cols, + cols#132, lines#40, + is2=\E[1;40r\E[40;1H, use=pcvtXX, +pcvt43w|DEC VT220 emulation with 43 lines and 132 cols, + cols#132, lines#43, + is2=\E[1;43r\E[43;1H, use=pcvtXX, +pcvt50w|DEC VT220 emulation with 50 lines and 132 cols, + cols#132, lines#50, + is2=\E[1;50r\E[50;1H, use=pcvtXX, + +# OpenBSD implements a color variation +pcvt25-color|DEC VT220 emulation with 25 lines and color, + cols#80, lines#25, + is2=\E[1;25r\E[25;1H, kf1=\EOP, kf10=\E[29~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, + kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, + kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf5=\E[17~, + kf6=\E[18~, kf7=\E[19~, kf8=\E[20~, kf9=\E[21~, use=pcvtXX, + use=ecma+color, + +# Terminfo entries to enable the use of the ncurses library in colour on a +# NetBSD-arm32 console (only tested on a RiscPC). +# Created by Dave Millen 22.07.98 +# modified codes for setf/setb to setaf/setab, then to klone+color, corrected +# typo in invis - TD +arm100|arm100-am|Arm(RiscPC) ncurses compatible (for 640x480), + bce, xenl, xon, + lines#30, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + blink=\E[5m$<2>, bold=\E[1m$<2>, cub1=^H, cud1=\n, + cuf1=\E[C$<2>, cuu1=\E[A$<2>, invis=\E[8m$<2>, ka1=\E[q, + ka3=\E[s, kb2=\E[r, kc1=\E[p, kc3=\E[n, kent=\E[M, kf0=\E[y, + kf1=\E[P, kf10=\E[x, kf2=\E[Q, kf3=\E[R, kf4=\E[S, kf5=\E[t, + kf6=\E[u, kf7=\E[v, kf8=\E[l, kf9=\E[w, rev=\E[7m$<2>, + rmacs=^O, rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m$<2>, + rmul=\E[m$<2>, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<2>, + sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m$<2>, smul=\E[4m$<2>, use=ansi+csr, + use=ansi+local, use=ecma+sgr, use=vt100+4bsd, + use=klone+color, + +arm100-w|arm100-wam|Arm(RiscPC) ncurses compatible (for 1024x768), + cols#132, lines#50, use=arm100, + +# NetBSD/x68k console VT200 emulator. This port runs on a 68K machine +# manufactured by Sharp for the Japanese market. +# From Minoura Makoto , 12 May 1996 +x68k|x68k-ite|NetBSD/x68k ITE, + cols#96, lines#32, + kbs=^?, kclr=\E[9~, khlp=\E[28~, use=vt220-base, + +# : +# Entry for the DNARD OpenFirmware console, close to ANSI but not quite. +# +# (still unfinished, but good enough so far.) +ofcons|DNARD OpenFirmware console, + bw, + cols#80, lines#30, + bel=^G, blink=\2335m, bold=\2331m, clear=^L, cr=\r, + cub=\233%p1%dD, cub1=\233D, cud=\233%p1%dB, cud1=\233B, + cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH, + cuu=\233%p1%dA, cuu1=\233A, dch=\233%p1%dP, dch1=\233P, + dim=\2332m, dl=\233%p1%dM, dl1=\233M, ed=\233J, el=\233K, + flash=^G, ht=^I, ich=\233%p1%d@, ich1=\233@, il=\233%p1%dL, + il1=\233L, ind=\n, invis=\2338m, kbs=^H, kcub1=\233D, + kcud1=\233B, kcuf1=\233C, kcuu1=\233A, kdch1=\233P, + kf1=\2330P, kf10=\2330M, kf2=\2330Q, kf3=\2330W, + kf4=\2330x, kf5=\2330t, kf6=\2330u, kf7=\2330q, kf8=\2330r, + kf9=\2330p, knp=\233/, kpp=\233?, nel=\r\n, rev=\2337m, + rmso=\2330m, rmul=\2330m, + sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t2%;%?%p7%t8 + %;%?%p1%p3%|%t;7%;m, + sgr0=\2330m, smso=\2337m, smul=\2334m, + +# NetBSD "wscons" emulator in VT220 mode. +# This entry is based on the NetBSD termcap entry. The emulator renders +# underlined text in red. Colors are otherwise usable. NetBSD developers +# prefer to not specify the corresponding ncv value. +# +# Testing the emulator and reading the source code (NetBSD 2.0), it appears +# that "vt220" is inaccurate. There are a few VT220-features, but most of the +# VT220 screens in vttest do not work with this emulator. For instance, it +# identifies itself (primary DA response) as a VT220 with selective erase. But +# the selective erase feature does not work. The secondary response is copied +# from Kermit's emulation of VT220, does not correspond to actual VT220. At +# the level of detail in a termcap, it is a passable emulator, since ECH does +# work. Don't use it on a VMS system -TD +wsvt25|NetBSD wscons in 25 line DEC VT220 mode, + bce, + colors#8, lines#25, pairs#64, + is2=\E[r\E[25;1H, kdch1=\E[3~, kend=\E[8~, kf1=\E[11~, + kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, + khome=\E[7~, op=\E[m, rs1=\Ec, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, use=vt220, + +wsvt25m|NetBSD wscons in 25 line DEC VT220 mode with Meta, + km, use=wsvt25, + +# NetBSD 6.x still uses wscons, with minor changes (2014/02/22) -TD +# +# TERM is by default vt100 for the console, wsvt25 for other ttys. +# Initial testing set TERM=xterm, based on comments by developers, found too +# many differences to continue in that path. However, test-results may be +# useful to people curious about compatibility with xterm. +# +# Testing with tack: +# ----------------- +# Failed: cbt, bel, flash, cvvis, smul (color), blink, invis +# There is color-bleeding in the color-pairs screen. +# Attributes do not work with color +# Failed: vpa/hpa +# Failed: kf1-kf4, kf13-kf48, khome, kend +# (effectively xterm-r6 for function-keys) +# None of the function or cursor key-modifiers are encoded. +# Console hangs in the smm/rmm test if TERM=xterm, does not show test +# +# Testing with vttest: +# ------------------- +# Identifies as VT220 with selective erase +# (however, selective erase refers to DECSCA, SPA) +# Does not implement VT52 +# Uses spaces to simulate double-size characters +# Does not support 8-bit controls +# Does not support VT220 reports +# Does not support send/receive mode +# Supports ECH (like rxvt) +# Does not support DECSCA +# Does not support any of the ISO-6429 cursor-movement +# Does not support any of the ISO-6429 miscellaneous tests +# (SL/SR also leave unexpected char on screen too) +# Background does not change in menu 11.6.9 (SGR 22-27) +# None of the xterm special features tests work +netbsd6|NetBSD wscons in 25 line DEC VT100 mode, + kbs=^?, use=wsvt25, + +# `rasterconsole' provided by 4.4BSD, NetBSD and OpenBSD on SPARC, and +# DECstation/pmax. +rcons|BSD rasterconsole, + use=sun-il, +# Color version of above. Color currently only provided by NetBSD. +rcons-color|BSD rasterconsole with ANSI color, + bce, + colors#8, pairs#64, + op=\E[m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=rcons, + +# mgterm -- MGL/MGL2, MobileGear Graphic Library +# for PocketBSD,PocketLinux,NetBSD/{hpcmips,mac68k} +# -- the setf/setb are probably incorrect, more likely setaf/setab -TD +# -- compare with cons25w +mgterm|MGL/MGL2 MobileGear Graphic Library, + OTbs, OTpt, am, bce, bw, eo, km, msgr, npc, + colors#8, cols#80, it#8, lines#18, pairs#64, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[30;1m, ech=\E[%p1%dX, el1=\E[1K, home=\E[H, + hpa=\E[%i%p1%d`, ht=^I, ich=\E[%p1%d@, ich1=\E[@, ind=\E[S, + kb2=\E[E, kcbt=\E[Z, kdch1=^?, kend=\E[F, kf1=\E[M, + kf10=\E[V, kf11=\E[W, kf12=\E[X, kf2=\E[N, kf3=\E[O, + kf4=\E[P, kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, + kich1=\E[L, knp=\E[G, kpp=\E[I, nel=\E[E, op=\E[x, rev=\E[7m, + ri=\E[T, rmso=\E[m, rs2=\E[x\E[m\Ec, setb=\E[4%p1%dm, + setf=\E[3%p1%dm, sgr0=\E[m, smso=\E[7m, vpa=\E[%i%p1%dd, + use=ansi+arrows, use=ansi+csr, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=ecma+index, + +#### FreeBSD console entries + +# Originally from termcap: +# +# From: Andrey Chernov 29 Mar 1996 +# Andrey Chernov maintains the FreeBSD termcap distributions. +# +# Note: Users of FreeBSD 2.1.0 and older versions must either upgrade +# or comment out the :cb: capability in the console entry. +# +# Alexander Lukyanov reports: +# I have seen FreeBSD-2.1.5R... The old el1 bug changed, but it is still there. +# Now el1 clears not only to the line beginning, but also a large chunk +# of previous line. But there is another bug - ech does not work at all. + +# syscons, sc - the console driver +# +# for syscons +# common entry without semigraphics +# Bug: The capability resets attributes. +# Bug? The ech and el1 attributes appear to move the cursor in some cases; for +# instance el1 does if the cursor is moved to the right margin first. Removed +# by T.Dickey 97/5/3 (ech=\E[%p1%dX, el1=\E[1K) +# +# Setting colors turns off reverse; we cannot guarantee order, so use ncv. +# Note that this disables standout with color. +# +# The emulator sends different strings based on shift- and control-keys, +# like scoansi: +# F13-F24 are shifted F1-F12 +# F25-F36 are control F1-F12 +# F37-F48 are shift+control F1-F12 +cons25w|ansiw|ansi80x25-raw|FreeBSD console (25-line raw mode), + am, bce, bw, eo, msgr, npc, + cols#80, it#8, lines#25, ncv#21, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, cnorm=\E[=0C, + cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, cvvis=\E[=1C, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[30;1m, ech=\E[%p1%dX, + home=\E[H, hpa=\E[%i%p1%d`, ht=^I, ich=\E[%p1%d@, + ich1=\E[@, ind=\E[S, kb2=\E[E, kcbt=\E[Z, kdch1=^?, + kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W, kf12=\E[X, + kf13=\E[Y, kf14=\E[Z, kf15=\E[a, kf16=\E[b, kf17=\E[c, + kf18=\E[d, kf19=\E[e, kf2=\E[N, kf20=\E[f, kf21=\E[g, + kf22=\E[h, kf23=\E[i, kf24=\E[j, kf25=\E[k, kf26=\E[l, + kf27=\E[m, kf28=\E[n, kf29=\E[o, kf3=\E[O, kf30=\E[p, + kf31=\E[q, kf32=\E[r, kf33=\E[s, kf34=\E[t, kf35=\E[u, + kf36=\E[v, kf37=\E[w, kf38=\E[x, kf39=\E[y, kf4=\E[P, + kf40=\E[z, kf41=\E[@, kf42=\E[[, kf43=\E[\\, kf44=\E[], + kf45=\E[\^, kf46=\E[_, kf47=\E[`, kf48=\E[{, kf5=\E[Q, + kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, kich1=\E[L, knp=\E[G, + kpp=\E[I, nel=\E[E, op=\E[x, rc=\E8, rev=\E[7m, ri=\E[T, + rmso=\E[m, rs2=\E[x\E[m\Ec, sc=\E7, + sgr=\E[0%?%p1%t;2;7%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;30;1%;%? + %p6%t;1%;m, + sgr0=\E[m, smso=\E[7m, vpa=\E[%i%p1%dd, use=ansi+arrows, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ecma+index, use=klone+color, + +cons25|ansis|ansi80x25|FreeBSD console (25-line ANSI mode), + acsc=-\030.^Y0\333`\004a\260f\370g\361h\261i\025j\331k\277l + \332m\300n\305q\304t\303u\264v\301w\302x\263y\363z\362~ + \371, + use=cons25w, +cons25-debian|FreeBSD console with debian backspace (25-line ANSI mode), + kbs=^?, kdch1=\E[3~, use=cons25, +cons25-m|ansis-mono|ansi80x25-mono|FreeBSD console (25-line mono ANSI mode), + colors@, pairs@, + bold@, dim@, op@, rmul=\E[m, setab@, setaf@, + sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m, + smul=\E[4m, use=cons25, +cons30|ansi80x30|FreeBSD console (30-line ANSI mode), + lines#30, use=cons25, +cons30-m|ansi80x30-mono|FreeBSD console (30-line mono ANSI mode), + lines#30, use=cons25-m, +cons43|ansi80x43|FreeBSD console (43-line ANSI mode), + lines#43, use=cons25, +cons43-m|ansi80x43-mono|FreeBSD console (43-line mono ANSI mode), + lines#43, use=cons25-m, +cons50|ansil|ansi80x50|FreeBSD console (50-line ANSI mode), + lines#50, use=cons25, +cons50-m|ansil-mono|ansi80x50-mono|FreeBSD console (50-line mono ANSI mode), + lines#50, use=cons25-m, +cons60|ansi80x60|FreeBSD console (60-line ANSI mode), + lines#60, use=cons25, +cons60-m|ansi80x60-mono|FreeBSD console (60-line mono ANSI mode), + lines#60, use=cons25-m, +cons25r|pc3r|ibmpc3r|cons25-koi8-r|FreeBSD console w/koi8-r cyrillic, + acsc=-\030.^Y0\215`\004a\220f\234h\221i\025j\205k\203l\202m + \204n\212q\0t\206u\207v\211w\210x\201y\230z\231~ + \225, + use=cons25w, +cons25r-m|pc3r-m|ibmpc3r-mono|cons25-koi8r-m|FreeBSD console w/koi8-r cyrillic (mono), + colors@, pairs@, + op@, rmul=\E[m, setab@, setaf@, + sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;30;1%;%?%p6%t;1%;m, + smul=\E[4m, use=cons25r, +cons50r|cons50-koi8r|FreeBSD console w/koi8-r cyrillic (50 lines), + lines#50, use=cons25r, +cons50r-m|cons50-koi8r-m|FreeBSD console w/koi8-r cyrillic (50-line mono), + lines#50, use=cons25r-m, +cons60r|cons60-koi8r|FreeBSD console w/koi8-r cyrillic (60 lines), + lines#60, use=cons25r, +cons60r-m|cons60-koi8r-m|FreeBSD console w/koi8-r cyrillic (60-line mono), + lines#60, use=cons25r-m, +# ISO 8859-1 FreeBSD console +cons25l1|cons25-iso8859|FreeBSD console w/iso 8859-1 chars, + acsc=+\253\,\273-\030.\031`\201a\202f\207g\210i\247j\213k + \214l\215m\216n\217o\220p\221q\222r\223s\224t\225u + \226v\227w\230x\231y\232z\233~\237, + use=cons25w, +cons25l1-m|cons25-iso-m|FreeBSD console w/iso 8859-1 chars (mono), + colors@, pairs@, + bold@, dim@, op@, rmul=\E[m, setab@, setaf@, + sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;m, + smul=\E[4m, use=cons25l1, +cons50l1|cons50-iso8859|FreeBSD console w/iso 8859-1 chars (50 lines), + lines#50, use=cons25l1, +cons50l1-m|cons50-iso-m|FreeBSD console w/iso 8859-1 chars (50-line mono), + lines#50, use=cons25l1-m, +cons60l1|cons60-iso|FreeBSD console w/iso 8859-1 chars (60 lines), + lines#60, use=cons25l1, +cons60l1-m|cons60-iso-m|FreeBSD console w/iso 8859-1 chars (60-line mono), + lines#60, use=cons25l1-m, + +# vt - virtual terminal console driver +# +# Starting with FreeBSD 8, an alternative configuration for syscons is provided, +# which is intended to be xterm-compatible. See for example +# http://svnweb.freebsd.org/base/stable/8/sys/dev/syscons/ +# in particular scterm-teken.c +# +# Some of the documentation refers to this as "vt"; its proper name is "teken". +# +# The sc(4) manual page states that it is possible to switch between the two +# by editing /boot/loader.conf, adding +# kern.vty=sc +# Doing that does not change the default TERM variable. That is hard-coded in +# /etc/ttys, rather than deriving it from the kernel state. +# +# For FreeBSD 12 and 13: +# --------------------- +# In newer releases, it is no longer possible to boot into a configuration that +# works with syscons. According to efi(4), +# "The vt(4) system console is automatically selected when booting via UEFI." +# See FreeBSD #264226. +# +# FreeBSD 13 supports 64-bit machines which boot with UEFI: +# https://www.freebsd.org/platforms/ +# The i386 platform does not use UEFI (and modifying the loader configuration +# does load sysconf); however because no updates (fixes) are available, most +# developers will regard that as unsupported. +# +# With FreeBSD 13, even when syscons is loaded (e.g., with the i386 platform), +# its function-keys are not configured. Using +# vidcontrol -T cons25 +# repairs this. +# +# When teken is loaded, vidcontrol can switch at runtime between the +# teken/cons25 function keys: +# vidcontrol -T cons25 +# vidcontrol -T xterm +# However due to a limitation in the implementation, only the first 12 function +# keys are available. The real syscons supports 48 function keys (using the +# shift and control modifiers), while xterm supports more than twice as many. +# +# vidcontrol does not change the emulation. As a result, the quarter (17/73) of +# non-function key capabilities which differ between syscons and teken are +# unsupported in the UEFI-based configurations. +# +# tack: +# VT100 line-drawing does not work (UTF-8 equivalents do). +# Shift/control modifiers have no effect on special keys. +# Meta does not work. +# vttest: +# supports REP (repeat). +# still does not support left/right margins +# SU/SD work, but not SL/SR +# alternate screen does not work +# ENQ/DA1 is unimplemented (the terminal does not identify itself) +# CPR, XCPR are unimplemented (i.e., vttest and resize are broken) +# implements X11 (original) xterm-mouse. +# ncurses: +# UTF-8 line-drawing works, including some double/thick lines +# +# For FreeBSD 9 and 10: +# -------------------- +# The /etc/ttys entries for console and other ttys are all configured to set +# TERM=xterm. +# +# Testing with tack: +# There is no VT100 line-drawing (uses +'s and -'s) +# Shifted f1-f12 give cons25 codes, rather than xterm function-keys +# +# Testing with vttest: +# Menu 2 diamonds don't work, blink ditto, light background ditto +# The terminal identifies itself as VT100 with AVO +# There is no VT52 support +# There is no doublesize character support +# The terminal supports ECH (like rxvt) +# The terminal does not support send/receive mode +# The terminal supports all of the ISO-6429 cursor-movement +# The terminal supports some of the ISO-6429 miscellaneous tests +# (SL/SR also leave unexpected char on screen too) +# +# Considering cons25 as a base, the line-drawing mostly works, but is missing +# the cells which happen to have ASCII control-character values: +# - ^X arrow pointing up +# . ^Y arrow pointing down +# i ^Y lantern +# ` ^D diamond +# +# Those are removed from this entry's acsc string to avoid confusion. +# The resulting description provides correct line-drawing and function-keys -TD +teken-2018|teken as of 2018, + bw@, mir, xenl, NQ, + acsc=0\333a\260f\370g\361h\261j\331k\277l\332m\300n\305q + \304t\303u\264v\301w\302x\263y\363z\362~\371, + cvvis@, hpa=\E[%i%p1%dG, hts=\EH, kdch1=\E[3~, kent=\r, + kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, + rmir=\E[4l, smir=\E[4h, tbc=\E[3g, use=vt220+cvis, + use=cons25, + +teken-2022|teken as of 2022, + am, bce, eo, mir, msgr, npc, NQ, + cols#80, it#8, lines#25, ncv#21, U8#1, + bold=\E[1m, cr=\r, cub1=^H, dim=\E[30;1m, ech=\E[%p1%dX, + ind=\E[S, kent=\r, nel=\E[E, op=\E[x, rev=\E[7m, ri=\E[T, + rmso=\E[27m, rs2=\E[x\E[m\Ec, + sgr=\E[0%?%p1%t;2;7%;%?%p3%t;7%;%?%p5%t;30;1%;%?%p6%t;1%;m, + sgr0=\E[m, use=vt220+cvis, use=ecma+index, + use=ansi+arrows, use=ansi+csr, use=ansi+cup, + use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+local, use=ansi+rca2, use=ansi+sgrso, + use=ansi+tabs, use=klone+color, + +teken-vt+fkeys|teken's xterm special keys, + kend=\E[F, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H, + use=vt220+pcedit, + +teken-sc+fkeys|teken's syscons special keys, + kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W, + kf12=\E[X, kf2=\E[N, kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R, + kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H, kich1=\E[L, + knp=\E[G, kpp=\E[I, + +teken-sc|teken imitating syscons, + use=teken-sc+fkeys, use=teken-2022, + +teken|teken-vt|teken imitating xterm, + xenl, use=teken-vt+fkeys, use=xterm+x11mouse, + use=teken-2022, + +teken-16color|teken using 16 colors, + use=ibm+16color, use=teken, + +#### 386BSD and BSD/OS Consoles +# + +# This was the original 386BSD console entry (I think). +# Some places it's named oldpc3|oldibmpc3. +# From: Alex R.N. Wetmore +origpc3|origibmpc3|IBM PC 386BSD console, + OTbs, am, bw, eo, xon, + cols#80, lines#25, + acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x + \263, + bold=\E[7m, clear=\Ec, cub1=^H, cup=\E[%i%p1%2d;%p2%2dH, + ed=\E[J, el=\E[K, home=\E[H, ind=\E[S, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[Y, ri=\E[T, + rmso=\E[1;0x\E[2;7x, rmul=\E[1;0x\E[2;7x, + sgr0=\E[m\E[1;0x\E[2;7x, smso=\E[1;7x\E[2;0x, + smul=\E[1;7x\E[2;0x, use=ansi+local1, + +# description of BSD/386 console emulator in version 1.0 (supplied by BSDI) +oldpc3|oldibmpc3|old IBM PC BSD/386 console, + OTbs, km, + lines#25, + bel=^G, bold=\E[=15F, cr=\r, cud1=\n, dim=\E[=8F, dl1=\E[M, + ht=^I, il1=\E[L, ind=\n, kich1=\E[L, kll=\E[F, knp=\E[G, + kpp=\E[I, nel=\r\n, sgr0=\E[=R, use=ansi+arrows, + +# Description of BSD/OS console emulator in version 1.1, 2.0, 2.1 +# Note, the emulator supports many of the additional console features +# listed in the iBCS2 (e.g. character-set selection) though not all +# are described here. This entry really ought to be upgraded. +# Also note, the console will also work with fewer lines after doing +# "stty rows NN", e.g. to use 24 lines. +# (Color support from Kevin Rosenberg , 2 May 1996) +# Bug: The capability resets attributes. +bsdos-pc|IBM PC BSD/OS console, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;1%;%?%p3%t;7%;%?%p4%t;5%;%?%p6 + %t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + use=bsdos-pc-nobold, + +bsdos-pc-nobold|BSD/OS PC console w/o bold, + use=klone+color, use=bsdos-pc-m, + +bsdos-pc-m|bsdos-pc-mono|BSD/OS PC console mono, + OTbs, am, eo, km, xon, + cols#80, it#8, lines#25, + bel=^G, clear=\Ec, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + ind=\n, kich1=\E[L, kll=\E[F, knp=\E[G, kpp=\E[I, nel=\r\n, + rc=\E8, sc=\E7, + sgr=\E[0;10%?%p1%t;7%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;%?%p7 + %t;8%;%?%p9%t;11%;m%?%p5%t\E[=8F%;, + use=ansi+arrows, use=ansi+idl, use=ansi+local, + use=klone+sgr8, + +# Old names for BSD/OS PC console used in releases before 4.1. +pc3|BSD/OS on the PC console, + use=bsdos-pc-nobold, +ibmpc3|pc3-bold|BSD/OS on the PC console with bold instead of underline, + use=bsdos-pc, + +# BSD/OS on the SPARC +bsdos-sparc|Sun SPARC BSD/OS console, + use=sun, + +# BSD/OS on the PowerPC +bsdos-ppc|PowerPC BSD/OS console, + use=bsdos-pc, + + +#### DEC VT52 +# (// capabilities aren't in DEC's official entry -- esr) +# +# Actually (TD pointed this out at the time the acsc string was added): +# VT52 shouldn't define full acsc since most of the cells don't match. +# see VT100 manual page A-31. This is the list that does match: +# f degree +# g plus/minus +# h right-arrow +# k down-arrow +# m scan-1 +# o scan-3 +# q scan-5 +# s scan-7 +# The line-drawing happens to work in several terminal emulators, but should +# not be used as a guide to the capabilities of the VT52. Note in particular +# that VT52 does not support line-drawing characters (the scan-X values refer +# to a crude plotting feature) -TD +vt52|DEC VT52, + lines#24, + acsc=+h.k0affggolpnqprrss, rmacs=\EG, rmkx=\E>, + smacs=\EF, smkx=\E=, u8=\E/[KL], use=vt50h, use=vt52-basic, + +# This is more likely the "vt52" that you would see in emulation, i.e., no +# keypad, no graphics. +vt52-basic|VT52 for emulators, + cols#80, it#8, lines#24, + bel=^G, clear=\EH\EJ, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EY%p1%' '%+%c%p2%' '%+%c, cuu1=\EA, ed=\EJ, el=\EK, + home=\EH, ht=^I, ind=\n, kbs=^H, nel=\r\n, ri=\EI, + use=vt52+arrows, + +vt52+arrows|cursor keys for VT52, + kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, + +#### DEC VT100 and compatibles +# +# DEC terminals from the VT100 forward are collected here. Older DEC terminals +# and micro consoles can be found in the `obsolete' section. More details on +# the relationship between the VT100 and ANSI X3.64/ISO 6429/ECMA-48 may be +# found near the end of this file. +# +# Except where noted, these entries are DEC's official terminfos. +# Contact Bill Hedberg of Terminal Support +# Engineering for more information. Updated terminfos and termcaps +# are kept available at ftp://gatekeeper.dec.com/pub/DEC/termcaps. +# +# In October 1995 DEC sold its terminals business, including the VT and Dorio +# line and trademark, to SunRiver Data Systems. SunRiver has since changed +# its name to Boundless Technologies; see http://www.boundless.com. +# + +# NOTE: Any VT100 emulation, whether in hardware or software, almost +# certainly includes what DEC called the `Level 1 editing extension' codes; +# only the very oldest VT100s lacked these and there probably aren't any of +# those left alive. To capture these, use one of the VT102 entries. +# +# Note that the glitch in vt100 is not quite the same as on the Concept, +# since the cursor is left in a different position while in the +# weird state (concept at beginning of next line, vt100 at end +# of this line) so all versions of vi before 3.7 don't handle +# right on vt100. The correct way to handle is when +# you output the char in column 80, immediately output CR LF +# and then assume you are in column 1 of the next line. If +# is on, am should be on too. +# +# I assume you have smooth scroll off or are at a slow enough baud +# rate that it doesn't matter (1200? or less). Also this assumes +# that you set auto-nl to "on", if you set it off use vt100-nam +# below. +# +# The padding requirements listed here are guesses. It is strongly +# recommended that xon/xoff be enabled, as this is assumed here. +# +# The vt100 uses and rather than // because the +# tab settings are in non-volatile memory and don't need to be +# reset upon login. Also setting the number of columns glitches +# the screen annoyingly. You can type "reset" to get them set. +# +# The VT100 series terminals have cursor ("arrows") keys which can operate +# in two different modes: Cursor Mode and Application Mode. Cursor Mode +# is the reset state, and is assumed to be the normal state. Application +# Mode is the "set" state. In Cursor Mode, the cursor keys transmit +# "Esc [ {code}" sequences, conforming to ANSI standards. In Application +# Mode, the cursor keys transmit "Esc O " sequences. Application Mode +# was provided primarily as an aid to the porting of VT52 applications. It is +# assumed that the cursor keys are normally in Cursor Mode, and expected that +# applications such as vi will always transmit the string. Therefore, +# the definitions for the cursor keys are made to match what the terminal +# transmits after the string is transmitted. If the string +# is a null string or is not defined, then cursor keys are assumed to be in +# "Cursor Mode", and the cursor keys definitions should match that assumption, +# else the application may fail. It is also expected that applications will +# always transmit the string to the terminal before they exit. +# +# The VT100 series terminals have an auxiliary keypad, commonly referred to as +# the "Numeric Keypad", because it is a cluster of numeric and function keys. +# The Numeric Keypad which can operate in two different modes: Numeric Mode and +# Application Mode. Numeric Mode is the reset state, and is assumed to be +# the normal state. Application Mode is the "set" state. In Numeric Mode, +# the numeric and punctuation keys transmit ASCII 7-bit characters, and the +# Enter key transmits the same as the Return key (Note: the Return key +# can be configured to send either LF (\015) or CR LF). In Application Mode, +# all the keypad keys transmit "Esc O {code}" sequences. The PF1 - PF4 keys +# always send the same "Esc O {code}" sequences. It is assumed that the keypad +# is normally in Numeric Mode. If an application requires that the keypad be +# in Application Mode then it is expected that the user, or the application, +# will set the TERM environment variable to point to a terminfo entry which has +# defined the string to include the codes that switch the keypad into +# Application Mode, and the terminfo entry will also define function key +# fields to match the Application Mode control codes. If the string +# is a null string or is not defined, then the keypad is assumed to be in +# Numeric Mode. If the string switches the keypad into Application +# Mode, it is expected that the string will contain the control codes +# necessary to reset the keypad to "Normal" mode, and it is also expected that +# applications which transmit the string will also always transmit the +# string to the terminal before they exit. +# +# Here's a diagram of the VT100 keypad keys with their bindings. +# The top line is the name of the key (some DEC keyboards have the keys +# labelled somewhat differently, like GOLD instead of PF1, but this is +# the most "official" name). The second line is the escape sequence it +# generates in Application Keypad mode (where "$" means the ESC +# character). The third line contains two items, first the mapping of +# the key in terminfo, and then in termcap. +# _______________________________________ +# | PF1 | PF2 | PF3 | PF4 | +# | $OP | $OQ | $OR | $OS | +# |_kf1__k1_|_kf2__k2_|_kf3__k3_|_kf4__k4_| +# | 7 8 9 - | +# | $Ow | $Ox | $Oy | $Om | +# |_kf9__k9_|_kf10_k;_|_kf0__k0_|_________| +# | 4 | 5 | 6 | , | +# | $Ot | $Ou | $Ov | $Ol | +# |_kf5__k5_|_kf6__k6_|_kf7__k7_|_kf8__k8_| +# | 1 | 2 | 3 | | +# | $Oq | $Or | $Os | enter | +# |_ka1__K1_|_kb2__K2_|_ka3__K3_| $OM | +# | 0 | . | | +# | $Op | $On | | +# |___kc1_______K4____|_kc3__K5_|_kent_@8_| +# +# Note however, that the arrangement of the 5-key ka1-kc3 do not follow the +# terminfo guidelines. That is a compromise used to assign the remaining +# keys on the keypad to kf5-kf0, used on older systems with legacy termcap +# support: +vt100+keypad|DEC VT100 numeric keypad no fkeys, + ka1=\EOq, ka3=\EOs, kb2=\EOr, kc1=\EOp, kc3=\EOn, +vt100+pfkeys|DEC VT100 numeric keypad (kf1-kf4), + kent=\EOM, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + use=vt100+keypad, +vt100+fnkeys|DEC VT100 numeric keypad (kf0-kf10), + kf0=\EOy, kf10=\EOx, kf5=\EOt, kf6=\EOu, kf7=\EOv, kf8=\EOl, + kf9=\EOw, use=vt100+pfkeys, +# +# A better adaptation to modern keyboards such as the PC's, which have a dozen +# function keys and the keypad 2,4,6,8 keys are labeled with arrows keys, is to +# use the 5-key arrangement to model the arrow keys as suggested in the +# terminfo guidelines: +# _______________________________________ +# | PF1 | PF2 | PF3 | PF4 | +# | $OP | $OQ | $OR | $OS | +# |_kf1__k1_|_kf2__k2_|_kf3__k3_|_kf4__k4_| +# | 7 8 9 - | +# | $Ow | $Ox | $Oy | $Om | +# |_ka1__K1_|_________|_ka3__K3_|_________| +# | 4 | 5 | 6 | , | +# | $Ot | $Ou | $Ov | $Ol | +# |_________|_kb2__K2_|_________|_________| +# | 1 | 2 | 3 | | +# | $Oq | $Or | $Os | enter | +# |_kc1__K4_|_________|_kc3__K5_| $OM | +# | 0 | . | | +# | $Op | $On | | +# |___________________|_________|_kent_@8_| +# +vt220+keypad|DEC VT220 numeric keypad, + ka1=\EOw, ka3=\EOy, kb2=\EOu, kc1=\EOq, kc3=\EOs, ka2=\EOx, + kb1=\EOt, kb3=\EOv, kc2=\EOr, use=vt100+pfkeys, +# +vt100+enq|ncurses extension for VT100-style ENQ, + u8=\E[?1;2c, use=ansi+enq, +vt102+enq|ncurses extension for VT102-style ENQ, + u8=\E[?6c, use=ansi+enq, +# +# And here, for those of you with orphaned VT100s lacking documentation, is +# a description of the soft switches invoked when you do `Set Up'. +# +# Scroll 0-Jump Shifted 3 0-# +# | 1-Smooth | 1-British pound sign +# | Autorepeat 0-Off | Wrap Around 0-Off +# | | 1-On | | 1-On +# | | Screen 0-Dark Bkg | | New Line 0-Off +# | | | 1-Light Bkg | | | 1-On +# | | | Cursor 0-Underline | | | Interlace 0-Off +# | | | | 1-Block | | | | 1-On +# | | | | | | | | +# 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 0 <--Standard Settings +# | | | | | | | | +# | | | Auto XON/XOFF 0-Off | | | Power 0-60 Hz +# | | | 1-On | | | 1-50 Hz +# | | ANSI/VT52 0-VT52 | | Bits Per Char. 0-7 Bits +# | | 1-ANSI | | 1-8 Bits +# | Keyclick 0-Off | Parity 0-Off +# | 1-On | 1-On +# Margin Bell 0-Off Parity Sense 0-Odd +# 1-On 1-Even +# +# The following SET-UP modes are assumed for normal operation: +# ANSI_MODE AUTO_XON/XOFF_ON NEWLINE_OFF 80_COLUMNS +# WRAP_AROUND_ON JUMP_SCROLL_OFF +# Other SET-UP modes may be set for operator convenience or communication +# requirements; I recommend +# AUTOREPEAT_ON BLOCK_CURSOR MARGIN_BELL_OFF SHIFTED_3_# +# Unless you have a graphics add-on such as Digital Engineering's VT640 +# (and even then, whenever it can be arranged!) you should set +# INTERLACE_OFF +# +# (vt100: I added / based on the init string, also . -- esr) +vt100|vt100-am|DEC VT100 (w/advanced video), + OTbs, xenl, xon, + vt#3, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, lf1=pf1, + lf2=pf2, lf3=pf3, lf4=pf4, mc0=\E[0i, rmam=\E[?7l, + rmkx=\E[?1l\E>, rs2=\E<\E>\E[?3;4;5l\E[?7;8h\E[r, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;$<2>, + smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m$<2>, + use=ansi+csr, use=ansi+pp, use=decid+cpr, use=vt100+4bsd, + use=vt100+fnkeys, + +vt100+4bsd|DEC VT100 from 4.0BSD, + am, msgr, + cols#80, it#8, lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, + clear=\E[H\E[J$<50>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>, + cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>, + enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=\n, kbs=^H, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmso=\E[m$<2>, + rmul=\E[m$<2>, rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;$<2>, + sgr0=\E[m\017$<2>, smacs=^N, smso=\E[1;7m$<2>, + smul=\E[4m$<2>, tbc=\E[3g, use=ansi+local, + +vt100nam|vt100-nam|VT100 no automargins, + am@, xenl@, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h, use=vt100-am, +vt100-vb|DEC VT100 (w/advanced video) & no beep, + bel@, flash=\E[?5h$<100/>\E[?5l, use=vt100, + +# Ordinary VT100 in 132 column ("wide") mode. +vt100-w|vt100-w-am|DEC VT100 132 cols (w/advanced video), + cols#132, lines#24, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=vt100-am, +vt100-w-nam|vt100-nam-w|DEC VT100 132 cols (w/advanced video no automargin), + cols#132, lines#14, vt@, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=vt100-nam, + +# VT100 with no advanced video. +vt100-nav|VT100 without advanced video option, + xmc#1, + blink@, bold@, rev@, rmso=\E[m, rmul@, sgr@, sgr0@, smso=\E[7m, + smul@, use=vt100, +vt100-nav-w|vt100-w-nav|DEC VT100 132 cols 14 lines (no advanced video option), + cols#132, lines#14, use=vt100-nav, + +# VT100 with one of the 24 lines used as a status line. +# We put the status line on the top. +vt100-s|vt100-s-top|vt100-top-s|VT100 for use with top sysline, + eslok, hs, + lines#23, + clear=\E[2;1H\E[J$<50>, csr=\E[%i%i%p1%d;%p2%dr, + cup=\E[%i%p1%{1}%+%d;%p2%dH$<5>, dsl=\E7\E[1;24r\E8, + fsl=\E8, home=\E[2;1H, is2=\E7\E[2;24r\E8, + tsl=\E7\E[1;%p1%dH\E[1K, use=vt100-am, + +# Status line at bottom. +# Clearing the screen will clobber status line. +vt100-s-bot|vt100-bot-s|VT100 for use with bottom sysline, + eslok, hs, + lines#23, + dsl=\E7\E[1;24r\E8, fsl=\E8, is2=\E[1;23r\E[23;1H, + tsl=\E7\E[24;%p1%dH\E[1K, use=vt100-am, + +# Most of the `vt100' emulators out there actually emulate a VT102 +# This entry (or vt102-nsgr) is probably the right thing to use for +# these. +vt102|DEC VT102, + dch1=\E[P, dl1=\E[M, il1=\E[L, rmir=\E[4l, smir=\E[4h, + use=vt100, +vt102-w|DEC VT102 in wide mode, + cols#132, + rs3=\E[?3h, use=vt102, + +# Many brain-dead PC comm programs that pretend to be `vt100-compatible' +# fail to interpret the ^O and ^N escapes properly. Symptom: the +# string in the canonical vt100 entry above leaves the screen littered +# with little snowflake or star characters (IBM PC ROM character \017 = ^O) +# after highlight turnoffs. This entry should fix that, and even leave +# ACS support working, at the cost of making multiple-highlight changes +# slightly more expensive. +# From: Eric S. Raymond July 22 1995 +vt102-nsgr|VT102 no sgr (use if you see snowflakes after highlight changes), + sgr@, sgr0=\E[m, use=vt102, + +# VT125 Graphics CRT. Clear screen also erases graphics +# Some VT125's came configured with VT102 support. +vt125|VT125 graphics terminal, + mir, + clear=\E[H\E[2J\EPpS(E)\E\\$<50>, use=vt100, + +# This isn't a DEC entry, it came from University of Wisconsin. +# (vt131: I added / based on the init string, also -- esr) +vt131|DEC VT131, + OTbs, am, xenl, + cols#80, it#8, lines#24, vt#3, + bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>, + clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2/>, cup=\E[%i%p1%d;%p2%dH$<5/>, + cuu1=\E[A$<2/>, ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, + ht=^I, is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, nel=\r\n, rev=\E[7m$<2/>, ri=\EM$<5/>, + rmam=\E[?7h, rmkx=\E[?1l\E>, rmso=\E[m$<2/>, + rmul=\E[m$<2/>, + rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr0=\E[m$<2/>, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m$<2/>, smul=\E[4m$<2/>, use=ansi+csr, + +# vt132 - like vt100 but slower and has ins/del line and such. +# I'm told that / are backwards in the terminal from the +# manual and from the ANSI standard, this describes the actual +# terminal. I've never actually used a vt132 myself, so this +# is untested. +# +vt132|DEC VT132, + xenl, + dch1=\E[P$<7>, dl1=\E[M$<99>, il1=\E[L$<99>, ind=\n$<30>, + ip=$<7>, rmir=\E[4h, smir=\E[4l, use=vt100, + +# This vt220 description maps F5--F9 to the second block of function keys +# at the top of the keyboard. The "DO" key is used as F10 to avoid conflict +# with the key marked (ESC) on the vt220. See vt220d for an alternate mapping. +# PF1--PF4 are used as F1--F4. +# +# added msgr -TD +vt220-old|vt200-old|DEC VT220 in VT100 emulation mode, + OTbs, OTpt, am, mir, msgr, xenl, xon, + cols#80, lines#24, vt#3, + OTnl=\n, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, + clear=\E[H\E[2J$<50>, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH$<10>, dch1=\E[P, ed=\E[J$<50>, + el=\E[K$<3>, home=\E[H, ht=^I, + if=/usr/share/tabset/vt100, ind=\ED$<20/>, + is2=\E[1;24r\E[24;1H, kf1=\EOP, kf10=\E[29~, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\E[17~, kf6=\E[18~, kf7=\E[19~, + kf8=\E[20~, kf9=\E[21~, khome=\E[1~, kich1=\E[2~, + rev=\E[7m$<2>, rf=/usr/share/tabset/vt100, + ri=\EM$<14/>, rmacs=\E(B$<4>, rmam=\E[?7l, rmir=\E[4l, + rmso=\E[27m, rmul=\E[24m, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;$<2>, + sgr0=\E[m$<2>, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h, + smso=\E[7m, smul=\E[4m, use=ansi+arrows, use=ansi+csr, + use=ansi+idl1, use=ansi+local1, use=vt220+pcedit, + use=vt220+cvis, + +# Here's a picture of the Sun/PC editing keypad: +# +--------+--------+--------+ +# | Insert | Home | PageUp | +# +--------+--------+--------+ +# | Delete | End | PageDn | +# +--------+--------+--------+ +# +# VT220 emulators such as xterm, using PC-keyboards use a different layout than +# the VT220 keyboard: +# VT220 PC +# ----- -- +# Prev PageUp +# Next PageDn +# Insert Insert +# Remove Delete +# Find Home +# Select End +vt220+pcedit|editing-keypad for VT220 using PC keyboard, + kdch1=\E[3~, kend=\E[4~, khome=\E[1~, kich1=\E[2~, + knp=\E[6~, kpp=\E[5~, +vt220+vtedit|editing-keypad for VT220 using DEC keyboard, + kdch1=\E[3~, kfnd=\E[1~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, + kslt=\E[4~, + +# A much better description of the VT200/220; used to be vt220-8 +# changed rmacs/smacs from shift-in/shift-out to vt200-old's explicit G0/G1 +# designation to accommodate bug in pcvt -TD +# +# Here's a picture of the VT220 editing keypad: +# +--------+--------+--------+ +# | Find | Insert | Remove | +# +--------+--------+--------+ +# | Select | Prev | Next | +# +--------+--------+--------+ +# +# Still, this is a "base" entry. Software emulators commonly leave out the +# DECTCEM feature -TD +vt220-base|DEC VT220 as emulated, + OTbs, am, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + dch=\E[%p1%dP, dch1=\E[P, ech=\E[%p1%dX, el1=\E[1K, + enacs=\E)0, flash=\E[?5h$<200/>\E[?5l, ht=^I, hts=\EH, + ich=\E[%p1%d@, if=/usr/share/tabset/vt100, ind=\ED, + is2=\E[?7h\E[>\E[?1l\E F\E[?4l, kbs=^H, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\EOQ, + kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, krdo=\E[29~, lf1=pf1, + lf2=pf2, lf3=pf3, lf4=pf4, nel=\EE, rev=\E[7m, ri=\EM, + rmacs=\E(B$<4>, rmam=\E[?7l, rmir=\E[4l, rmso=\E[27m, + rmul=\E[24m, rs1=\E[?3l, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;$<2>, + sgr0=\E[m\E(B, smacs=\E(0$<2>, smam=\E[?7h, smir=\E[4h, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+csr, + use=ansi+cup, use=ansi+pp, use=ansi+enq, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=vt220+vtedit, + +vt220|vt200|DEC VT220, + use=vt220+cvis, use=vt220-base, +vt220-w|vt200-w|DEC VT220 in wide mode, + cols#132, + rs3=\E[?3h, use=vt220, +vt220-8bit|vt220-8|vt200-8bit|vt200-8|DEC VT220/200 in 8-bit mode, + OTbs, am, mc5i, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\2335m, bold=\2331m, clear=\233H\233J, cr=\r, + csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=^H, + cud=\233%p1%dB, cud1=\n, cuf=\233%p1%dC, cuf1=\233C, + cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\233A, + dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M, + ech=\233%p1%dX, ed=\233J, el=\233K, el1=\2331K, enacs=\E)0, + flash=\233?5h$<200/>\233?5l, home=\233H, ht=^I, hts=\EH, + ich=\233%p1%d@, if=/usr/share/tabset/vt100, + il=\233%p1%dL, il1=\233L, ind=\ED, + is2=\233?7h\233>\233?1l\E F\233?4l, kbs=^H, + kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A, + kdch1=\2333~, kf1=\EOP, kf10=\23321~, kf11=\23323~, + kf12=\23324~, kf13=\23325~, kf14=\23326~, kf17=\23331~, + kf18=\23332~, kf19=\23333~, kf2=\EOQ, kf20=\23334~, + kf3=\EOR, kf4=\EOS, kf6=\23317~, kf7=\23318~, kf8=\23319~, + kf9=\23320~, kfnd=\2331~, khlp=\23328~, khome=\233H, + kich1=\2332~, knp=\2336~, kpp=\2335~, krdo=\23329~, + kslt=\2334~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, mc0=\233i, + mc4=\2334i, mc5=\2335i, nel=\EE, rc=\E8, rev=\2337m, ri=\EM, + rmacs=\E(B, rmam=\233?7l, rmir=\2334l, rmso=\23327m, + rmul=\23324m, rs1=\233?3l, sc=\E7, + sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m + %?%p9%t\E(0%e\E(B%;$<2>, + sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h, smir=\2334h, + smso=\2337m, smul=\2334m, tbc=\2333g, use=vt220+cvis8, + +# vt220d: +# This VT220 description regards F6--F10 as the second block of function keys +# at the top of the keyboard. This mapping follows the description given +# in the VT220 Programmer Reference Manual and agrees with the labeling +# on some terminals that emulate the VT220. There is no support for an F5. +# See vt220 for an alternate mapping. +# +vt220d|DEC VT220 in VT100 mode with DEC function key labeling, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, kf5@, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, use=vt220-old, + +vt220-nam|v200-nam|VT220 in VT100 mode with no auto margins, + am@, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h, use=vt220, + +# vt220 termcap written Tue Oct 25 20:41:10 1988 by Alex Latzko +# (not an official DEC entry!) +# The problem with real VT220 terminals is they don't send escapes when in +# in VT220 mode. This can be gotten around two ways. 1> don't send +# escapes or 2> put the VT220 into VT100 mode and use all the nifty +# features of VT100 advanced video which it then has. +# +# This entry takes the view of putting a VT220 into VT100 mode so +# you can use the escape key in emacs and everything else which needs it. +# +# You probably don't want to use this on a VMS machine since VMS will think +# it has a VT220 and will get fouled up coming out of emacs +# +# From: Alexander Latzko , 30 Dec 1996 +# (Added vt100 , to quiet a tic warning -- esr) +# added msgr -TD +vt200-js|vt220-js|DEC VT200 series with jump scroll, + am, msgr, + cols#80, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M, + home=\E[H, ht=^I, il1=\E[L, ind=\ED, + is2=\E[61"p\E[H\E[?3l\E[?4l\E[?1h\E[?5l\E[?6l\E[?7h\E[?8h\E[ + ?25h\E>\E[m, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\r\ED, + rf=/usr/share/tabset/vt100, ri=\EM, rmdc=, rmir=\E[4l, + rmkx=\E[?1l\E>, rmso=\E[27m$<5/>, rmul=\E[24m, + rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, smdc=, + smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m$<5/>, smul=\E[4m, + use=ansi+csr, use=ansi+erase, use=vt220+cvis, + +# This was DEC's VT320. Use the purpose-built one below instead +#vt320|DEC VT320 in VT100 emulation mode, +# use=vt220, + +# Use v320n for SCO's LYRIX. Otherwise, use Adam Thompson's vt320-nam. +# +vt320nam|v320n|DEC VT320 in VT100 emul. mode with NO AUTO WRAP mode, + am@, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h, + use=vt220-base, + +# These entries are not DEC's official ones, they were purpose-built for the +# VT320. Here are the designer's notes: +# is end on a PC kbd. Actually 'select' on a VT. Mapped to +# 'Erase to End of Field'... since nothing seems to use 'end' anyways... +# khome is Home on a PC kbd. Actually 'FIND' on a VT. +# Things that use usually use tab anyways... and things that don't use +# tab usually use instead... +# kprv is same as tab - Backtab is useless... +# I left out because of its RIDICULOUS complexity, +# and the resulting fact that it causes the termcap translation of the entry +# to SMASH the 1k-barrier... +# From: Adam Thompson Sept 10 1995 +# (vt320: uncommented --esr) +vt320|vt300|DEC VT320 7 bit terminal, + am, mir, msgr, xenl, + cols#80, lines#24, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, + dch1=\E[P, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + home=\E[H, ht=^I, hts=\EH, ich=\E[%p1%d@, ind=\ED, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H, + kbs=^?, kdch1=\E[3~, kel=\E[4~, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, + kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, + kf20=\E[34~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, + kf9=\E[20~, khome=\E[1~, kich1=\E[2~, knp=\E[6~, knxt=^I, + kpp=\E[5~, kprv=\E[Z, kslt=\E[4~, nel=\EE, rev=\E[7m, + rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, + rmul=\E[m, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;$<2>, + sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, + use=ansi+apparrows, use=ansi+csr, use=ansi+enq, + use=ansi+idl, use=ansi+local, use=dec+pp, use=vt220+cvis, + use=vt220+keypad, use=dec+sl, + +vt320-nam|vt300-nam|DEC VT320 7 bit terminal with no am to make SAS happy, + am@, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H, use=vt320, +# We have to init 132-col mode, not 80-col mode. +vt320-w|vt300-w|DEC VT320 wide 7 bit terminal, + cols#132, wsl#132, + is2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H, use=vt320, +vt320-w-nam|vt300-w-nam|DEC VT320 wide 7 bit terminal with no am, + am@, + is2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;24r\E[24;1H, use=vt320-w, + +# VT330 and VT340 -- These are ReGIS and SIXEL graphics terminals +# which are pretty much a superset of the VT320. They have the +# host writable status line, yet another different DRCS matrix size, +# and such, but they add the DEC Technical character set, Multiple text +# pages, selectable length pages, and the like. The difference between +# the VT330 and VT340 is that the former has only 2 planes and a monochrome +# monitor, the latter has 4 planes and a color monitor. These terminals +# support VT131 and ANSI block mode, but as with much of these things, +# termcap/terminfo doesn't deal with these features. +# +# Note that this entry is are set up in what was the standard way for GNU +# Emacs v18 terminal modes to deal with the cursor keys in that the arrow +# keys were switched into application mode at the same time the numeric pad +# is switched into application mode. This changes the definitions of the +# arrow keys. Emacs v19 is smarter and mines its keys directly out of +# your termcap or terminfo entry, +# +# From: Daniel Glasser , 13 Oct 1993 +# (vt340: string capability "sb=\E[M" corrected to "sr"; +# also, added / based on the init string -- esr) +vt340|dec-vt340|vt330|dec-vt330|DEC VT340 graphics terminal with 24 line page, + am, eslok, hs, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dsl=\E[2$~\r\E[1$}\E[K\E[$}, + flash=\E[?5h$<200/>\E[?5l, fsl=\E[$}, home=\E[H, ht=^I, + hts=\EH, ich=\E[%p1%d@, ind=\ED, + is2=\E<\E\sF\E>\E[?1h\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r + \E[24;1H, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, lf1=pf1, lf2=pf2, + lf3=pf3, lf4=pf4, nel=\r\ED, rev=\E[7m, + rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, + rmul=\E[24m, rs1=\E[?3l, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;$<2>, + sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, + tsl=\E[2$~\E[1$}\E[1;%dH, use=ansi+csr, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=vt220+cvis, + +# Left/right margins are supported in xterm since patch #279 (2012/05/10) +vt420+lrmm|VT420 left/right margins, + mgc=\E[?69l, smglp=\E[?69h\E[%i%p1%ds, + smglr=\E[?69h\E[%i%p1%d;%p2%ds, + smgrp=\E[?69h\E[%i;%p1%ds, + +# DEC doesn't supply a VT400 description, so we add Daniel Glasser's +# (originally written with VT420 as its primary name, and usable for it). +# +# VT400/420 -- This terminal is a superset of the VT320. It adds the multiple +# text pages and long text pages with selectable length of the VT340, along +# with left and right margins, rectangular area text copy, fill, and erase +# operations, selected region character attribute change operations, +# page memory and rectangle checksums, insert/delete column, reception +# macros, and other features too numerous to remember right now. TERMCAP +# can only take advantage of a few of these added features. +# +# Note that this entry is set up in what was the standard way for GNU +# Emacs v18 terminal modes to deal with the cursor keys in that the arrow +# keys were switched into application mode at the same time the numeric pad +# is switched into application mode. This changes the definitions of the +# arrow keys. Emacs v19 is smarter and mines its keys directly out of +# your termcap entry, +# +# From: Daniel Glasser , 13 Oct 1993 +# (vt400: string capability ":sb=\E[M:" corrected to ":sr=\E[M:"; +# also, added / based on the init string -- esr) +vt400|vt400-24|dec-vt400|DEC VT400 24x80 column autowrap, + am, eslok, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[J$<10/>, cr=\r, + cub1=^H, cud1=\n, dsl=\E[2$~\r\E[1$}\E[K\E[$}, + ed=\E[J$<10/>, el=\E[K$<4/>, flash=\E[?5h$<200/>\E[?5l, + fsl=\E[$}, ht=^I, hts=\EH, ind=\ED, + is2=\E<\E\sF\E>\E[?1h\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r + \E[24;1H, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, lf1=pf1, lf2=pf2, + lf3=pf3, lf4=pf4, nel=\r\ED, rev=\E[7m, + rf=/usr/share/tabset/vt300, ri=\EM, rmacs=\E(B, + rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, + rs1=\E<\E[?3l\E[!p\E[?7h, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;$<2>, + sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, + tsl=\E[2$~\E[1$}\E[1;%dH, use=ansi+csr, use=ansi+cup, + use=ansi+idc, use=ansi+idl, use=ansi+local, use=dec+sl, + use=vt220+cvis, + +# (vt420: I removed , it collided with . I also restored +# a missing -- esr) +# add msgr and other capabilities from vt220 -TD +vt420|DEC VT420, + am, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, + clear=\E[H\E[2J$<50>, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH$<10>, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K, + enacs=\E)0, flash=\E[?5h$<200/>\E[?5l, home=\E[H, ht=^I, + hts=\EH, ich=\E[%p1%d@, if=/usr/share/tabset/vt300, + ind=\ED, is2=\E[1;24r\E[24;1H, is3=\E[?67h\E[64;1"p, + kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kf1=\EOP, kf10=\E[29~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + kf5=\E[17~, kf6=\E[18~, kf7=\E[19~, kf8=\E[20~, kf9=\E[21~, + nel=\EE, rev=\E[7m$<2>, rf=/usr/share/tabset/vt300, + ri=\EM, rmacs=\E(B$<4>, rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, + rmsc=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + rmso=\E[27m, rmul=\E[24m, rs3=\E[?67h\E[64;1"p, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;$<2>, + sgr0=\E[m\E(B$<2>, smacs=\E(0$<2>, smam=\E[?7h, + smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, + use=ansi+csr, use=ansi+enq, use=ansi+idl, use=ansi+pp, + use=ansi+local, use=dec+sl, use=vt220+cvis, + use=vt420+lrmm, use=vt220+vtedit, + +# DEC VT220 and up support DECUDK (user-defined keys). DECUDK (i.e., pfx) +# takes two parameters, the key and the string. Translating the key is +# straightforward (keys 1-5 are not defined on real terminals, though some +# emulators define these): +# +# if (key < 16) then value = key; +# else if (key < 21) then value = key + 1; +# else if (key < 25) then value = key + 2; +# else if (key < 27) then value = key + 3; +# else if (key < 30) then value = key + 4; +# else value = key + 5; +# +# The string must be the hexadecimal equivalent, e.g., "5052494E" for "PRINT". +# There's no provision in terminfo for emitting a string in this format, so the +# application has to know it. +# +vt420pc|DEC VT420 w/PC keyboard, + kdch1=^?, kend=\E[4~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[11;2~, kf14=\E[12;2~, kf15=\E[13;2~, + kf16=\E[14;2~, kf17=\E[15;2~, kf18=\E[17;2~, + kf19=\E[18;2~, kf2=\E[12~, kf20=\E[19;2~, kf21=\E[20;2~, + kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\E[23~, + kf26=\E[24~, kf27=\E[25~, kf28=\E[26~, kf29=\E[28~, + kf3=\E[13~, kf30=\E[29~, kf31=\E[31~, kf32=\E[32~, + kf33=\E[33~, kf34=\E[34~, kf35=\E[35~, kf36=\E[36~, + kf37=\E[23;2~, kf38=\E[24;2~, kf39=\E[25;2~, kf4=\E[14~, + kf40=\E[26;2~, kf41=\E[28;2~, kf42=\E[29;2~, + kf43=\E[31;2~, kf44=\E[32;2~, kf45=\E[33;2~, + kf46=\E[34;2~, kf47=\E[35;2~, kf48=\E[36;2~, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H, + pctrm=USR_TERM:vt420pcdos:, + pfx=\EP1;1|%?%{16}%p1%>%t%{0}%e%{21}%p1%>%t%{1}%e%{25}%p1%> + %t%{2}%e%{27}%p1%>%t%{3}%e%{30}%p1%>%t%{4}%e%{5}%;%p1%+ + %d/%p2%s\E\\, + use=vt420, + +vt420pcdos|DEC VT420 w/PC for DOS Merge, + lines#25, + dispc=%?%p1%{19}%=%t\E\023\021%e%p1%{32}%<%t\E%p1%c%e%p1 + %{127}%=%t\E\177%e%p1%c%;, + pctrm@, + rmsc=\E[?0;0r\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr@, + sgr0=\E[m, smsc=\E[?1;2r\E[34h, use=vt420pc, + +vt420f|DEC VT420 with VT kbd; VT400 mode; F1-F5 used as Fkeys, + kdch1=^?, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, + kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, + kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, + kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[H, lf1=\EOP, lf2=\EOQ, lf3=\EOR, lf4=\EOS, + use=vt420, + +vt510|DEC VT510, + use=vt420, +vt510pc|DEC VT510 w/PC keyboard, + use=vt420pc, +vt510pcdos|DEC VT510 w/PC for DOS Merge, + use=vt420pcdos, + +# VT520/VT525 +# +# The VT520 is a monochrome text terminal capable of managing up to +# four independent sessions in the terminal. It has multiple ANSI +# emulations (VT520, VT420, VT320, VT220, VT100, VT PCTerm, SCO Console) +# and ASCII emulations (WY160/60, PCTerm, 50/50+, 150/120, TVI 950, +# 925 910+, ADDS A2). This terminfo data is for the ANSI emulations only. +# +# Terminal Set-Up is entered by pressing [F3], [Caps Lock]/[F3] or +# [Alt]/[Print Screen] depending upon which keyboard and which +# terminal mode is being used. If Set-Up has been disabled or +# assigned to an unknown key, Set-Up may be entered by pressing +# [F3] as the first key after power up, regardless of keyboard type. +vt520|DEC VT520, + use=ansi+rca, use=vt420, use=ansi+tabs, + +vt525|DEC VT525, + use=vt520, + +# I just got a brand new Boundless VT520 with that company's "ANSI 2011" +# Keyboard, which replaces the old LK41R-AA keyboard. +# +# In trying to get the function keys to work, I had to cobble my own +# terminfo.src entry, since the existing vt520 entry doesn't include most of +# the function keys. If I blend the entries for "vt420f" and "vt220+keypad" +# I seem to get them all -Mike Gran +vt520ansi|Boundless VT520 ANSI, + use=ansi+rca, use=vt420f, use=vt220+keypad, + use=ansi+tabs, + +#### VT100 emulations + +# John Hawkinson tells us that the EWAN telnet for Windows +# (the best Windows telnet as of September 1995) presents the name `dec-vt100' +# to telnetd. Michael Deutschmann informs us +# that this works best with a stock vt100 entry. +dec-vt100|EWAN telnet's vt100 emulation, + use=vt100, + +# From: Adrian Garside <94ajg2@eng.cam.ac.uk>, 19 Nov 1996 +dec-vt220|DOS tnvt200 terminal emulator, + am@, use=vt220, + +# Zstem340 is an (IMHO) excellent VT emulator for PC's. I recommend it to +# anyone who needs PC VT340 emulation. (or anything below that level, for +# that matter -- DEC's ALL-in-1 seems happy with it, as does INFOPLUS's +# RDBM systems, it includes ReGIS and Sixel support! I'm impressed... +# I can send the address if requested. +# (z340: changed garbled \E[5?l to \E[?5l, DEC smooth scroll off -- esr) +# From: Adam Thompson Sept 10 1995 +z340|ZSTEM VT340 terminal emulator 132col 42line, + lines#42, + is2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;42r\E[42;1H, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h\E[1;42r\E[42;1H, use=vt320-w, +z340-nam|ZSTEM VT340 terminal emulator 132col 42line (no automatic margins), + am@, + is2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;42r\E[42;1H, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7l\E[?8h\E[1;42r\E[42;1H, use=z340, + +# expect-5.44.1.15/example/tkterm +# a minimal subset of a VT100 (compare with "news-unk). +# +# The missing "=" in smkx is not a typo (here), but an error in tkterm. +tt|tkterm|Don Libes' tk text widget terminal emulator, + clear=\E[H\E[J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%p1%d;%p2%dH, cuu1=\E[A, ind=\n, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, + kf9=\EOX, rmkx=\E[?1l\E>, rmso=\E[m, smkx=\E[?1h\E, + smso=\E[7m, + +######## APPLE + +#### Terminal.app + +# nsterm*|Apple_Terminal - AppKit Terminal.app +# +# Terminal.app is a Terminal emulator bundled with NeXT's NeXTSTEP and +# OPENSTEP/Mach operating systems, and with Apple's Rhapsody, Mac OS X +# Server and Mac OS X operating systems. There is also a +# "terminal.app" in GNUstep, but I believe it to be an unrelated +# codebase and I have not attempted to describe it here. +# +# For NeXTSTEP, OPENSTEP/Mach, Rhapsody and Mac OS X Server 1.0, you +# are pretty much on your own. Use "nsterm-7-m" and hope for the best. +# You might also try "nsterm-7" and "nsterm-old" if you suspect your +# version supports color. +# +# To determine the version of Terminal.app you're using by running: +# +# echo "$TERM_PROGRAM" "$TERM_PROGRAM_VERSION" +# +# For Apple_Terminal v309+, use "nsterm-256color" (or "nsterm-bce") +# +# For Apple_Terminal v200+, use "nsterm-16color" (a.k.a. "nsterm") +# +# For Apple_Terminal v71+/v100+, use "nsterm-bce". +# +# For Apple_Terminal v51+, use "nsterm-7-c" or "nsterm-7-c-s". +# +# For Apple_Terminal v41+, use "nsterm-old", or "nsterm-s". +# +# For all earlier versions (Apple_Terminal), try "nsterm-7-m" +# (monochrome) or "nsterm-7" (color); "nsterm-7-m-s" and "nsterm-7-s" +# might work too, but really you're on your own here since these +# systems are very obsolete and I can't test them. I do welcome +# patches, though :). + +# Other Terminals: +# +# For GNUstep_Terminal, you're probably best off using "linux" or +# writing your own terminfo. + +# For MacTelnet, you're on your own. It's a different codebase, and +# seems to be somewhere between "vt102", "ncsa" and "xterm-color". + +# For iTerm.app, see "iterm". + +# +# The AppKit Terminal.app descriptions all have names beginning with +# "nsterm". Note that the statusline (-s) versions use the window +# titlebar as a phony status line, and may produce warnings during +# compilation as a result ("tsl uses 0 parameters, expected 1".) +# Ignore these warnings, or even ignore these entries entirely. Apps +# which need to position the cursor or do other fancy stuff inside the +# status line won't work with these entries. They're primarily useful +# for programs like Pine which provide simple notifications in the +# status line. Please note that non-ASCII characters don't work right +# in the status line, since Terminal.app incorrectly interprets their +# Unicode codepoints as MacRoman codepoints (in earlier Mac OS X +# versions) or only accepts status lines consisting entirely of +# characters from the first 256 Unicode positions (including C1 but +# not C0 or DEL.) +# +# The Mythology* of AppKit Terminal.app: +# +# In the days of NeXTSTEP 0.x and 1.x there were two incompatible +# bundled terminal emulators, Shell and Terminal. Scott Hess wrote a +# shareware replacement for Terminal called "Stuart" which NeXT bought +# and used as the basis for the Terminal.app in NeXTSTEP 2+, +# OPENSTEP/Mach, Apple Rhapsody, Mac OS X Server 1.0, and Mac OS X. I +# don't know the TERM_PROGRAM and TERM_PROGRAM_VERSION settings or +# capabilities for the early versions, but I believe that the +# TERM_PROGRAM_VERSION may have been reset at some point. +# +# The early versions were tailored to the NeXT character set. Sometime +# after the Apple acquisition the encoding was switched to MacRoman +# (initially with serious altcharset bugs due to incomplete conversion +# of the old NeXT code,) and then later to UTF-8. Also sometime during +# or just prior to the early days of Mac OS X, the Terminal grew ANSI +# 8-color support (initially buggy when combined with attributes, but +# that was later fixed.) More recently, around Mac OS X version 10.3 +# or so (Terminal.app v100+) xterm-like 16-color support was added. In +# some versions (for instance 133-1 which shipped with Mac OS X +# version 10.4) this suffered from the bug, but that seems to +# have been fixed in Mac OS X version 10.5 (Terminal.app v240.2+). +# +# In the early days of Mac OS X the terminal was fairly buggy and +# would routinely crash under load. Many of these bugs seem to have +# been fixed around Mac OS X version 10.3 (Terminal.app v100+) but +# some may still remain. This change seems to correspond to +# Terminal.app reporting "xterm-color" as $TERM rather than "vt100" as +# it did previously. +# +# * This may correspond with what actually happened, but I don't +# know. It is based on guesswork, hearsay, private correspondence, +# my faulty memory, and the following online sources and references: +# +# [1] "Three Scotts and a Duane" by Simson L. Garfinkel +# http://www.nextcomputers.org/NeXTfiles/Articles/NeXTWORLD/93.8/93.8.Dec.Community1.html +# +# [2] NeXTSTEP entry from Wikipedia, the free encyclopedia +# https://secure.wikimedia.org/wikipedia/en/wiki/Nextstep +# +# * Renamed the AppKit Terminal.app entry from "Apple_Terminal" to +# "nsterm" to comply with the name length and case conventions and +# limitations of various software packages [notably Solaris terminfo +# and UNIX.] A single Apple_Terminal alias is retained for +# backwards-compatibility. +# +# * Added function key support (F1-F4). These only work in Terminal.app +# version 51, hopefully the capabilities won't cause problems for people +# using version 41. +# +# * Added "full color" (-c) entries which support the 16-color mode in +# version 51. +# +# * By default, version 51 uses UTF-8 encoding with broken altcharset +# support, so "ASCII" (-7) entries without altcharset support were +# added. + +# nsterm - AppKit Terminal.app +# +# Apple's Mac OS X includes a Terminal.app derived from the old NeXT +# Terminal.app. It is a partial VT100 emulation with some xterm-like +# extensions. This terminfo was written to describe versions 41 +# (shipped with Mac OS X version 10.0) and 51 (shipped with Mac OS X +# version 10.1) of Terminal.app. +# +# Terminal.app runs under the Mac OS X Quartz windowing system (and +# other AppKit-supported windowing systems.) On the Mac OS X machine I +# use, the executable for Terminal.app is: +# /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal +# +# If you're looking for a description of the full-screen system +# console which runs under Apple's Darwin operating system on PowerPC +# platforms, see the "xnuppc" entry instead. +# +# There were no function keys in version 41. In version 51, there are +# four working function keys (F1, F2, F3 and F4.) The function keys +# are included in all of these entries. +# +# It does not support mouse pointer position reporting. Under some +# circumstances the cursor can be positioned using option-click; this +# works by comparing the cursor position and the selected position, +# and simulating enough cursor-key presses to move the cursor to the +# selected position. This technique fails in all but the simplest +# applications. +# +# It provides partial ANSI color support (background colors interacted +# badly with bold in version 41, though, as reflected in :ncv:.) The +# monochrome (-m) entries are useful if you've disabled color support +# or use a monochrome monitor. The full color (-c) entries are useful +# in version 51, which doesn't exhibit the background color bug. They +# also enable an xterm-compatible 16-color mode. +# +# The configurable titlebar is set using xterm-compatible sequences; +# it is used as a status bar in the statusline (-s) entries. Its width +# depends on font sizes and window sizes, but 50 characters seems to +# be the default for an 80x24 window. +# +# The MacRoman character encoding is used for some of the alternate +# characters in the "MacRoman" entries; the "ASCII" (-7) entries +# disable alternate character set support entirely, and the "VT100" +# (-acs) entries rely instead on Terminal.app's own buggy VT100 +# graphics emulation, which seems to think the character encoding is +# the old NeXT charset instead of MacRoman. The "ASCII" (-7) entries +# are useful in Terminal.app version 51, which supports UTF-8 and +# other ASCII-compatible character encodings but does not correctly +# implement VT100 graphics; once VT100 graphics are correctly +# implemented in Terminal.app, the "VT100" (-acs) entries should be +# usable in any ASCII-compatible character encoding [except perhaps +# in UTF-8, where some experts argue for disallowing alternate +# characters entirely.] +# +# Terminal.app reports "vt100" as the terminal type, but exports +# several environment variables which may aid detection in a shell +# profile (i.e. .profile or .login): +# +# TERM=vt100 +# TERM_PROGRAM=Apple_Terminal +# TERM_PROGRAM_VERSION=41 # in Terminal.app version 41 +# TERM_PROGRAM_VERSION=51 # in Terminal.app version 51 +# +# For example, the following Bourne shell script would detect the +# correct terminal type: +# +# if [ :"$TERM" = :"vt100" -a :"$TERM_PROGRAM" = :"Apple_Terminal" ] +# then +# export TERM +# if [ :"$TERM_PROGRAM_VERSION" = :41 ] +# then +# TERM="nsterm-old" +# else +# TERM="nsterm-c-7" +# fi +# fi +# +# In a C shell derivative, this would be accomplished by: +# +# if ( $?TERM && $?TERM_PROGRAM && $?TERM_PROGRAM_VERSION) then +# if ( :"$TERM" == :"vt100" && :"$TERM_PROGRAM" == :"Apple_Terminal" ) then +# if ( :"$TERM_PROGRAM_VERSION" == :41 ) then +# setenv TERM "nsterm-old" +# else +# setenv TERM "nsterm-c-7" +# endif +# endif +# endif + +# The '+' entries are building blocks +nsterm+7|AppKit Terminal.app v41+ basic capabilities w/ASCII charset, + am, bw, msgr, xenl, xon, + cols#80, it#8, lines#24, + bel=^G, cr=\r, cub1=^H, cud1=\n, dim=\E[2m, el1=\E[1K, ht=^I, + hts=\EH, ind=\n, kbs=^?, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, + kcuu1=\EOA, kent=\EOM, ri=\EM, rmam=\E[?7l, rmkx=\E[?1l\E>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m, + sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, tbc=\E[3g, + use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idl, + use=ansi+local, use=ansi+sgrbold, use=vt100+enq, + use=vt100+pfkeys, + +nsterm+acs|AppKit Terminal.app v41+ basic capabilities w/VT100 alternate-charset, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, use=nsterm+7, use=vt100+4bsd, + +nsterm+mac|AppKit Terminal.app v41+ basic capabilities w/MacRoman alternate-charset, + acsc=+\335\,\334-\366.\3770#`\327a:f\241g\261h#i + \360jjkkllmmnno\370p\370q\321rrssttuuvvwwxxy\262z\263{ + \271|\255}\243~\245, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, use=nsterm+7, use=vt100+4bsd, + +# compare with xterm+sl-twm +nsterm+s|AppKit Terminal.app v41+ status-line (window titlebar) support, + wsl#50, use=xterm+sl-twm, + +nsterm+c|AppKit Terminal.app v51+ full color support (including 16 colors), + op=\E[0m, use=ibm+16color, + +nsterm+c41|AppKit Terminal.app v41 color support, + ncv#37, + op=\E[0m, use=klone+color, + +# These are different combinations of the building blocks + +# ASCII charset (-7) +nsterm-m-7|nsterm-7-m|AppKit Terminal.app v41+ w/ASCII charset (monochrome), + use=nsterm+7, + +nsterm-m-s-7|nsterm-7-m-s|AppKit Terminal.app v41+ w/ASCII charset (monochrome w/statusline), + use=nsterm+s, use=nsterm+7, + +nsterm-7|AppKit Terminal.app v41+ w/ASCII charset (color), + use=nsterm+c41, use=nsterm+7, + +nsterm-7-c|nsterm-c-7|AppKit Terminal.app v51+ w/ASCII charset (full color), + use=nsterm+c, use=nsterm+7, + +nsterm-s-7|nsterm-7-s|AppKit Terminal.app v41+ w/ASCII charset (color w/statusline), + use=nsterm+s, use=nsterm+c41, use=nsterm+7, + +nsterm-c-s-7|nsterm-7-c-s|AppKit Terminal.app v51+ w/ASCII charset (full color w/statusline), + use=nsterm+s, use=nsterm+c, use=nsterm+7, + +# VT100 alternate-charset (-acs) +nsterm-m-acs|nsterm-acs-m|AppKit Terminal.app v41+ w/VT100 alternate-charset (monochrome), + use=nsterm+acs, + +nsterm-m-s-acs|nsterm-acs-m-s|AppKit Terminal.app v41+ w/VT100 alternate-charset (monochrome w/statusline), + use=nsterm+s, use=nsterm+acs, + +nsterm-acs|AppKit Terminal.app v41+ w/VT100 alternate-charset (color), + use=nsterm+c41, use=nsterm+acs, + +nsterm-c-acs|nsterm-acs-c|AppKit Terminal.app v51+ w/VT100 alternate-charset (full color), + use=nsterm+c, use=nsterm+acs, + +nsterm-s-acs|nsterm-acs-s|AppKit Terminal.app v41+ w/VT100 alternate-charset (color w/statusline), + use=nsterm+s, use=nsterm+c41, use=nsterm+acs, + +nsterm-c-s-acs|nsterm-acs-c-s|AppKit Terminal.app v51+ w/VT100 alternate-charset (full color w/statusline), + use=nsterm+s, use=nsterm+c, use=nsterm+acs, + +# MacRoman charset +nsterm-m|AppKit Terminal.app v41+ w/MacRoman charset (monochrome), + use=nsterm+mac, + +nsterm-m-s|AppKit Terminal.app v41+ w/MacRoman charset (monochrome w/statusline), + use=nsterm+s, use=nsterm+mac, + +nsterm-old|AppKit Terminal.app v41+ w/MacRoman charset (color), + use=nsterm+c41, use=nsterm+mac, + +nsterm-c|AppKit Terminal.app v51+ w/MacRoman charset (full color), + use=nsterm+c, use=nsterm+mac, + +nsterm-s|AppKit Terminal.app v41+ w/MacRoman charset (color w/statusline), + use=nsterm+s, use=nsterm+c41, use=nsterm+mac, + +nsterm-c-s|AppKit Terminal.app v51+ w/MacRoman charset (full color w/statusline), + use=nsterm+s, use=nsterm+c, use=nsterm+mac, + +# In Mac OS X version 10.5 the format of the preferences has changed +# and a new, more complex technique is needed, e.g., +# +# python -c 'import sys,objc;NSUserDefaults=objc.lookUpClass( +# "NSUserDefaults");ud=NSUserDefaults.alloc(); +# ud.init();prefs=ud.persistentDomainForName_( +# "com.apple.Terminal");prefs["Window Settings"][ +# prefs["Default Window Settings"]]["TerminalType" +# ]=sys.argv[1];ud.setPersistentDomain_forName_(prefs, +# "com.apple.Terminal")' nsterm-16color +# +# and it is still not settable from the preferences dialog. This is +# tracked under rdar://problem/7365108 and rdar://problem/7365134 +# in Apple's bug reporter. +# +# In OS X 10.5 (Leopard) the TERM which can be set in the preferences dialog +# defaults to xterm-color. Alternative selections are ansi, dtterm, rxvt, +# vt52, vt100, vt102 and xterm. +nsterm-16color|AppKit Terminal.app v240.2+ with Mac OS X version 10.5, + bw@, mir, npc, + flash=\E[?5h$<200/>\E[?5l, hpa=\E[%i%p1%dG, + kdch1=\E[3~, kend=\E[F, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, + kf16=\E[29~, kf17=\E[31~, kf18=\E[22~, kf19=\E[33~, + kf20=\E[34~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khome=\E[H, knp=\E[6~, kpp=\E[5~, + vpa=\E[%i%p1%dd, kLFT5=\E[5D, kRIT5=\E[5C, use=ansi+idc, + use=xterm+alt47, use=nsterm-c-s-acs, use=vt220+cvis, + +# The versions of Terminal.app in Mac OS X version 10.3.x seem to have +# the background color erase feature. The newer version 240.2 in Mac OS X +# version 10.5 does not. +# +# This entry is based on newsgroup comments by Alain Bench, Christian Ebert, +# and D P Schreber comparing to nsterm-c-s-acs. +# +# In Mac OS X version 10.4 and earlier, D P Schreber notes that $TERM +# can be set in Terminal.app, e.g., +# +# defaults write com.apple.Terminal TermCapString nsterm-bce +# +# and that it is not set in Terminal's preferences dialog. +# +# Modified for OS X 10.8, omitting bw based on testing with tack -TD +# +# Notes: +# * The terminal description matches the default settings. +# * The keyboard is configurable via a dialog. +# * By default khome, kend, knext and kprev are honored only with a +# shift-modifier. +# * There are bindings for control left/right arrow (but not up/down). +# Added those to nsterm-16color, which is the version used for OS X 10.6 +# * "Allow VT100 application keypage mode" is by default disabled. +# There is no way to press keypad-comma unless application mode is enabled +# and used. +# * 132-column mode stopped working during vttest's tests. Consider it broken. +# * CHT, REP, SU, SD are buggy. +# * ECH works (also in Leopard), but is not used here for compatibility. +# * The terminal preferences dialog replaces xterm-color by xterm-16color and +# xterm-256color. However, it adds "nsterm", so it is possible to use the +# nsterm entry from this file to override the MacPorts (20110404) or +# system (20081102) copy of this file. +# + In OS X 10.8 (Mountain Lion) the TERM which can be set in the preferences +# dialog defaults to xterm-256color. Alternative selections are ansi, +# dtterm, rxvt, vt52, vt100, vt102, xterm and xterm-16color. However, +# the menu says "Declare terminal as" without promising to actually emulate +# the corresponding terminals. Indeed, changing TERM does not affect the +# emulation itself. This means that +# + the function-keys do not match for dtterm for kf1-kf4 as well as +# khome/kend +# + the color model is the same for each setting of TERM (does not match +# ansi or dtterm). +# + the shift/control/meta key modifiers from rxvt and xterm variants are not +# recognised except for a few special cases, i.e., kRIT5 and kLFT5. +# + the VT52 emulation does not give a usable shell because screen-clearing +# does not work as expected. +# + selecting "xterm" or "xterm-16color" sets TERM to "xterm-256color". +# + OSX 10.9 (Yosemite) added more extended keys in the default configuration +# as well as unmasking F10 (which had been used in the window manager). Those +# keys are listed in this entry. +nsterm-bce|AppKit Terminal.app v71+/v100.1.8+ with Mac OS X version 10.3/10.4 (bce), + bce, use=nsterm-16color, + +# This is tested with OS X 10.8 (Mountain Lion), 2012/08/11 +# TERM_PROGRAM_VERSION=309 +# Earlier reports state that these differences also apply to OS X 10.7 (Lion), +# TERM_PROGRAM_VERSION=303 +nsterm-build309|Terminal.app in OS X 10.8, + use=xterm+256setaf, use=nsterm-bce, + +# removed bogus kDC7 -TD +nsterm-build326|Terminal.app in OS X 10.9, + kDC=\E[3;2~, kLFT=\E[1;2D, kRIT=\E[1;2C, kcbt=\E[Z, + kf18=\E[32~, kDC5=\E[3;5~, kLFT3=\Eb, kLFT5=\E[1;5D, + kRIT3=\Ef, kRIT5=\E[1;5C, use=nsterm-build309, + +# actually "343.7" +nsterm-build343|Terminal.app in OS X 10.10, + kend=\EOF, khome=\EOH, use=nsterm-build326, + +# reviewed Terminal.app in El Capitan (version 2.6 build 361) -TD +# Using vttest: +# + no VT52 mode for cursor keys, though VT52 screen works in vttest +# + f1-f4 map to pf1-pf4 +# + no VT220 support aside from DECTCEM and ECH +# + there are no protected areas. Forget about anything above VT220. +# + in ECMA-48 cursor movement, VPR and HPR fail. Others work. +# + vttest color 11.6.4 and 11.6.5 (bce for ED/EL and ECH/indexing) are bce +# + but bce fails for 11.6.7.2 (test repeat). +# + SD (11.6.7.3) also fails, but SL/SR/SU work. +# + 11.6.6 (test insert/delete char/line with bce) has several failures. +# + normal (not X10 or Highlight tracking) mouse now works. +# + mouse any-event works +# + mouse button-event works +# + in alternate screen: +# mode 47/48 work +# mode 1047 fails to restore cursor position (do not use) +# mode 1049 fails to restore screen contents (do not use) +# + dtterm window-modify operations work (some messages are not printed) +# + dtterm window-report gives size of window in characters/pixels as +# well as state of window. +# Using tack: +# + there is no difference between cnorm/cvvis +# + has dim/invis/blink (no protect of course) +# + most function keys with shift/control modifiers give beep +# (user can configure, but out-of-the-box is what I record) +# + shift-F5 is \E[25~ through shift-F12 is \E[34~ (skips \E[30~ between +# F8 and F9). +# + kLFT5/kRIT5 work, but not up/down with control-modifier +# + kLFT/kRIT work, but not up/down with shift-modifier +# + there are a few predefined bindings with Alt, but no clear pattern. +# + uses alt-key as UTF-8 "meta" something like xterm altSendsEscape +# Using ncurses test-program with xterm-new: +# + no italics +# Using xterm's scripts: +# + palette for 256-colors is hardcoded. +# + no support for "dynamic colors" +# + no support for tcap-query. +nsterm-build361|Terminal.app in OS X 10.11, + XT, + kmous=\E[M, use=nsterm-build343, + +# reviewed Terminal.app in High Sierra (version 2.8 build 400) -TD +# Comparing with build361, little has changed, except that italics work. +# Direct-color is not supported, by the way. +# +# Improved rmso/rmul -TD +nsterm-build400|Terminal.app in OS X 10.13, + rmso=\E[27m, rmul=\E[24m, use=xterm+sm+1006, + use=ecma+italics, use=nsterm-build361, + +nsterm-build440|Terminal.app in MacOS 11.6.8, + use=xterm+alt1049, use=nsterm-build400, + +# This is an alias which should always point to the "current" version +nsterm|nsterm-256color|Apple_Terminal|AppKit Terminal.app, + use=nsterm-build440, + +#### iTerm, iTerm2 + +# iTerm 0.10 +# +# iTerm.app from http://iterm.sourceforge.net/ is an alternative (and more +# featureful) terminal emulator for Mac OS X. It is similar enough in +# capabilities to nsterm-16color that I have derived this description from that +# one, but as far as I know they share no code. Many of the features are +# user-configurable, but I attempt only to describe the default configuration +# (B. Sittler). +# +# According to its documentation, iTerm uses terminfo to obtain function key +# definitions. For example, if it is started with TERM=xterm, it uses key +# definitions from that terminal description from the local OSX machine. Those +# $TERM settings may be augmented using the bookmark and profile dialogs. +# However, the behavior seen with tack does not agree with either the terminfo +# description or the function keys in its "xterm" profile. +# +# NOTES: +# with vttest: +# reports primary DA as VT100 with AVO: \E[?1;2c +# reports secondary DA as "\E[>0;95;c" +# supports blink and underline +# displays bold text as red +# recognizes all dtterm controls for modifying/querying window +# resizing via escape sequence is very slow +# supports X11R5 mouse (no X10) and XFree86 mouse (button- and event-tracking) +# supports X11R5 alternate screen and XFree86 1049 (no 1047/1048) +# supports CHA, VPA, VPR, but no other ECMA-48 cursor movement such as HPA +# with tack: +# . +# with ncurses test-program: +# ncurses 'k' has problem in second screen; light background does not fill +# with xterm scripts +# can display/alter xterm-256color cube +# can display/alter xterm-88color cube +iTerm.app|iterm|iTerm.app terminal emulator for Mac OS X, + bce, mir, npc, xenl, xon, + wsl#50, + blink=\E[5m, bold=\E[1m, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, el1=\E[1K, + flash=\E[?5h$<200/>\E[?5l, hpa=\E[%i%p1%dG, + kLFT=\E[1;2D, kRIT=\E[1;2C, kbs=^?, kcbt=\E[Z, kdch1=\E[3~, + kend=\EOF, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + knp=\E[6~, kpp=\E[5~, op=\E[0m, rev=\E[7m, ri=\EM, + rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? + %p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m, + smul=\E[4m, vpa=\E[%i%p1%dd, kEND5=\E[1;5F, + kHOM5=\E[1;5H, use=ansi+apparrows, use=ansi+csr, + use=ansi+enq, use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+local, use=vt100+4bsd, use=vt100+keypad, + use=vt100+pfkeys, use=xterm+alt47, use=xterm+sl-twm, + use=xterm+x11mouse, use=xterm+256setaf, use=vt220+cvis, + +# iTerm2 +# +# https://iterm2.com/ +# https://github.com/gnachman/iTerm2 +# ~/Library/Preferences/com.googlecode.iterm2.plist +# "iTerm" stalled in 2009. A different set of developers began "iTerm2". +# +# iTerm2 3.5.0 +# +# NOTES: +# with esctest: +# 365 tests passed, 196 known bugs, 2 tests fail intermittently +# the known bugs include several of the cursor-movement tests +# the ED, EL tests include those failing intermittently +# DECCOLM, DECERA, DECSED, DECSERA and SPA do not work +# most of the DECRPM, DECRQSS reports fail +# with vttest: +# reports primary DA as VT420 +# VT420 rectangular operations, as well as DECBI/DEVFI work with margins +# SRM does not work +# DECSED, and SPA do not work +# REP and SD work, SL/SR/SU do not work +# with tack: +# status-line does not work +# +# The default settings have blinking-text and keypad-application mode disabled. +# Enabling the latter make it half-working (numlock sends an escape character). +# About half of the modified function-keys are untestable due to preassigned +# features. +# +# iTerm2 3.5.0 comes with a 4-year-old copy of xterm's terminfo (June 2020), +# which is modified, using the ncurses TERMINFO_DIRS variable to substitute +# this locally: +# + xterm-nrc and xterm+pcfN are removed +# + the developer made changes to adapt it to the 16-year-old version of +# ncurses bundled with MacOS, i.e., changing the mouse protocol to the +# legacy X11 format and reducing the number of colors to 32k (in more than +# one place). In the former case, the developer was confused about why that +# was necessary. In the latter, the developer clearly misunderstood how the +# tools work. +# + vt420+lrmm is modified, removing smglr and corrupting mgc (again, developer +# confusion). +# + the developer added a couple of features, misnaming them as "xterm" blocks: +# + a copy of kitty+setal renamed to xterm+setulc (and Setulc) is added, but +# the feature is first mentioned in iTerm2 changes in May 2020, while +# it is first mention in kitty changes in December 2016. +# + Smulx is added +# +# iTerm2 3.4.0 +# +# NOTES: +# with esctest: +# 293 tests pass, 270 tests fail +# with tack: +# minor improvements which do not alter the terminfo +# +# iTerm2 3.0.15 +# +# NOTES: +# with vttest: +# reports primary DA as VT100 with AVO: \E[?1;2c +# reports secondary DA as "\E[>0;95;0c" +# numeric keypad application mode does not work +# by default, dtterm window-modifications are ignored +# by default, dtterm window-reports return, but icon as "L", window as "l" +# supports SD/SU, no REP, SL, SR +# supports CBT, CHA, VPA, CNL, CPL, VPR (no HPA, CHT, HPR) +# no improvement to XFree86 1047/1048 modes +# with tack: +# in meta-mode, imitates xterm, sending UTF-8 +# special-key modifiers based on xterm use incompatible default for alt/meta +# with ncurses test-program: +# no italics +# no improvement to ncurses 'k' +# with xterm scripts: +# acolors.sh works +# +# Italic text did not work initially, apparently because upgrading did not +# add/change that preference (set in Preferences, Profiles, Text). A new +# install of iTerm 3.0.15 provides italics by default (blinking text is an +# option in the preferences dialog). +# +# 2018/01/21: found xterm+sm+1006 did not work with version 3.1.5 +# 2018/05/19: xterm+sm+1006 seems to work with 3.1.6beta -TD +iTerm2.app|iterm2|terminal emulator for Mac OS X, + cbt=\E[Z, dim=\E[2m, kEND=\E[1;2F, kHOM=\E[1;2H, ka1@, ka3@, + kb2@, kc1@, kc3@, kent@, kf13=\E[1;2P, kf14=\E[1;2Q, + kf15=\E[1;2R, kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, + kf19=\E[18;2~, kf20=\E[19;2~, kf21=\E[20;2~, + kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, + kind=\E[1;2B, kri=\E[1;2A, nel=\EE, op=\E[39;49m, + rmso=\E[27m, rmul=\E[24m, + rs2=\E[!p\E[?3;4l\E[4l\E>\E[?1000l, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;m%?%p9%t\016%e\017%;, + Smulx=\E[4:%p1%dm, kDN3=\E\E[B, kDN4=\E[1;10B, + kDN5=\E[1;5B, kDN6=\E[1;6B, kEND3=\E[1;9F, + kEND4=\E[1;10F, kEND6=\E[1;6F, kEND7=\E[1;13F, + kEND8=\E[1;14F, kHOM3=\E[1;9H, kHOM4=\E[1;10H, + kHOM6=\E[1;6H, kHOM7=\E[1;13H, kHOM8=\E[1;14H, + kLFT3=\E\E[D, kLFT4=\E[1;10D, kLFT5=\E[1;5D, + kLFT6=\E[1;6D, kNXT3=\E\E[6~, kPRV3=\E\E[5~, + kRIT3=\E\E[C, kRIT4=\E[1;10C, kRIT5=\E[1;5C, + kRIT6=\E[1;6C, kUP3=\E\E[A, kUP4=\E[1;10A, kUP5=\E[1;5A, + kUP6=\E[1;6A, use=ecma+index, use=xterm+alt+title, + use=ecma+italics, use=iterm, use=bracketed+paste, + use=kitty+setal, + +# xnuppc - Darwin PowerPC Console (a.k.a. "darwin") +# +# On PowerPC platforms, Apple's Darwin operating system uses a +# full-screen system console derived from a NetBSD framebuffer +# console. It is an ANSI-style terminal, and is not really VT-100 +# compatible. +# +# Under Mac OS X, this is the system console driver used while in +# single-user mode [reachable by holding down Command-S during the +# boot process] and when logged in using console mode [reachable by +# typing ">console" at the graphical login prompt.] +# +# If you're looking for a description of the Terminal.app terminal +# emulator which runs under the Mac OS X Quartz windowing system (and +# other AppKit-supported windowing systems,) see the "nsterm" +# entry instead. +# +# NOTE: Under Mac OS X version 10.1, the default login window does not +# prompt for user name, instead requiring an icon to be selected from +# a list of known users. Since the special ">console" login is not in +# this list, you must make one of two changes in the Login Window +# panel of the Login section of System Prefs to make the special +# ">console" login accessible. The first option is to enable 'Show +# "Other User" in list for network users', which will add a special +# "Other..." icon to the graphical login panel. Selecting "Other..." +# will present the regular graphical login prompt. The second option +# is to change the 'Display Login Window as:' setting to 'Name and +# password entry fields', which replaces the login panel with a +# graphical login prompt. +# +# There are no function keys, at least not in Darwin 1.3. +# +# It has no mouse support. +# +# It has full ANSI color support, and color combines correctly with +# all three supported attributes: bold, inverse-video and underline. +# However, bold colored text is almost unreadable (bolding is +# accomplished using shifting and or-ing, and looks smeared) so bold +# has been excluded from the list of color-compatible attributes +# [using (ncv)]. The monochrome entry (-m) is useful if you use a +# monochrome monitor. +# +# There is one serious bug with this terminal emulation's color +# support: repositioning the cursor onto a cell with non-matching +# colors obliterates that cell's contents, replacing it with a blank +# and displaying a colored cursor in the "current" colors. There is +# no complete workaround at present [other than using the monochrome +# (-m) entries,] but removing the (msgr) capability seemed to help. +# +# The "standout" chosen was simple reverse-video, although a colorful +# standout might be more aesthetically pleasing. Similarly, the bold +# chosen is the terminal's own smeared bold, although a simple +# color-change might be more readable. The color-bold (-b) entries +# uses magenta colored text for bolding instead. The fancy color (-f +# and -f2) entries use color for bold, standout and underlined text +# (underlined text is still underlined, though.) +# +# Apparently the terminal emulator does support a VT-100-style +# alternate character set, but all the alternate character set +# positions have been left blank in the font. For this reason, no +# alternate character set capabilities have been included in this +# description. The console driver appears to be ASCII-only, so (enacs) +# has been excluded [although the VT-100 sequence does work.] +# +# The default Mac OS X and Darwin installation reports "vt100" as the +# terminal type, and exports no helpful environment variables. To fix +# this, change the "console" entry in /etc/ttys from "vt100" to +# "xnuppc-WxH", where W and H are the character dimensions of your +# console (see below.) +# +# The font used by the terminal emulator is apparently one originally +# drawn by Ka-Ping Yee, and uses 8x16-pixel characters. This +# file includes descriptions for the following geometries: +# +# Pixels Characters Entry Name (append -m for monochrome) +# ------------------------------------------------------------------- +# 640x400 80x25 xnuppc-80x25 +# 640x480 80x30 xnuppc-80x30 +# 720x480 90x30 xnuppc-90x30 +# 800x600 100x37 xnuppc-100x37 +# 896x600 112x37 xnuppc-112x37 +# 1024x640 128x40 xnuppc-128x40 +# 1024x768 128x48 xnuppc-128x48 +# 1152x768 144x48 xnuppc-144x48 +# 1280x1024 160x64 xnuppc-160x64 +# 1600x1024 200x64 xnuppc-200x64 +# 1600x1200 200x75 xnuppc-200x75 +# 2048x1536 256x96 xnuppc-256x96 +# +# The basic "xnuppc" entry includes no size information, and the +# emulator includes no reporting capability, so you'll be at the mercy +# of the TTY device (which reports incorrectly on my hardware.) The +# color-bold entries do not include size information. + +# The '+' entries are building blocks +xnuppc+basic|Darwin PowerPC console basic capabilities, + am, bce, mir, xenl, NQ, + it#8, + bold=\E[1m, cr=\r, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, + dsl=\E]2;\007, el1=\E[1K, home=\E[H, ht=^I, hts=\EH, ind=\n, + kbs=^?, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + rev=\E[7m, ri=\EM, rmam=\E[?7l, rmkx=\E[?1l\E>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m, + sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, tbc=\E[3g, + use=ansi+csr, use=ansi+erase, use=ansi+local, + use=ansi+sgrso, use=ansi+sgrul, use=vt100+keypad, + +xnuppc+c|Darwin PowerPC console ANSI color support, + ncv#32, use=klone+color, + +xnuppc+b|Darwin PowerPC console color-bold support, + ncv#32, + bold=\E[35m, + sgr=\E[0%?%p6%t;35%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m, + use=xnuppc+basic, + +xnuppc+f|Darwin PowerPC console fancy color support, + ncv#35, + sgr=\E[0%?%p6%t;35%;%?%p2%t;36;4%;%?%p1%t;33;44%;%?%p3%t;7%; + m, + smso=\E[33;44m, smul=\E[36;4m, use=xnuppc+b, + +xnuppc+f2|Darwin PowerPC console alternate fancy color support, + ncv#35, + bold=\E[33m, + sgr=\E[0%?%p6%t;33%;%?%p2%t;34%;%?%p1%t;31;47%;%?%p3%t;7%;m, + smso=\E[31;47m, smul=\E[34m, use=xnuppc+basic, + +# Building blocks for specific screen sizes +xnuppc+80x25|Darwin PowerPC console 80x25 support (640x400 pixels), + cols#80, lines#25, + +xnuppc+80x30|Darwin PowerPC console 80x30 support (640x480 pixels), + cols#80, lines#30, + +xnuppc+90x30|Darwin PowerPC console 90x30 support (720x480 pixels), + cols#90, lines#30, + +xnuppc+100x37|Darwin PowerPC console 100x37 support (800x600 pixels), + cols#100, lines#37, + +xnuppc+112x37|Darwin PowerPC console 112x37 support (896x600 pixels), + cols#112, lines#37, + +xnuppc+128x40|Darwin PowerPC console 128x40 support (1024x640 pixels), + cols#128, lines#40, + +xnuppc+128x48|Darwin PowerPC console 128x48 support (1024x768 pixels), + cols#128, lines#48, + +xnuppc+144x48|Darwin PowerPC console 144x48 support (1152x768 pixels), + cols#144, lines#48, + +xnuppc+160x64|Darwin PowerPC console 160x64 support (1280x1024 pixels), + cols#160, lines#64, + +xnuppc+200x64|Darwin PowerPC console 200x64 support (1600x1024 pixels), + cols#200, lines#64, + +xnuppc+200x75|Darwin PowerPC console 200x75 support (1600x1200 pixels), + cols#200, lines#75, + +xnuppc+256x96|Darwin PowerPC console 256x96 support (2048x1536 pixels), + cols#0x100, lines#96, + +# These are different combinations of the building blocks + +xnuppc-m|darwin-m|Darwin PowerPC console (monochrome), + use=xnuppc+basic, + +xnuppc|darwin|Darwin PowerPC console (color), + use=xnuppc+c, use=xnuppc+basic, + +xnuppc-m-b|darwin-m-b|Darwin PowerPC console (monochrome w/color-bold), + use=xnuppc+b, + +xnuppc-b|darwin-b|Darwin PowerPC console (color w/color-bold), + use=xnuppc+b, use=xnuppc+c, + +xnuppc-m-f|darwin-m-f|Darwin PowerPC console (fancy monochrome), + use=xnuppc+f, + +xnuppc-f|darwin-f|Darwin PowerPC console (fancy color), + use=xnuppc+f, use=xnuppc+c, + +xnuppc-m-f2|darwin-m-f2|Darwin PowerPC console (alternate fancy monochrome), + use=xnuppc+f2, + +xnuppc-f2|darwin-f2|Darwin PowerPC console (alternate fancy color), + use=xnuppc+f2, use=xnuppc+c, + +# Combinations for specific screen sizes +xnuppc-80x25-m|darwin-80x25-m|Darwin PowerPC console (monochrome) 80x25, + use=xnuppc+80x25, use=xnuppc+basic, + +xnuppc-80x25|darwin-80x25|Darwin PowerPC console (color) 80x25, + use=xnuppc+c, use=xnuppc+80x25, use=xnuppc+basic, + +xnuppc-80x30-m|darwin-80x30-m|Darwin PowerPC console (monochrome) 80x30, + use=xnuppc+80x30, use=xnuppc+basic, + +xnuppc-80x30|darwin-80x30|Darwin PowerPC console (color) 80x30, + use=xnuppc+c, use=xnuppc+80x30, use=xnuppc+basic, + +xnuppc-90x30-m|darwin-90x30-m|Darwin PowerPC console (monochrome) 90x30, + use=xnuppc+90x30, use=xnuppc+basic, + +xnuppc-90x30|darwin-90x30|Darwin PowerPC console (color) 90x30, + use=xnuppc+c, use=xnuppc+90x30, use=xnuppc+basic, + +xnuppc-100x37-m|darwin-100x37-m|Darwin PowerPC console (monochrome) 100x37, + use=xnuppc+100x37, use=xnuppc+basic, + +xnuppc-100x37|darwin-100x37|Darwin PowerPC console (color) 100x37, + use=xnuppc+c, use=xnuppc+100x37, use=xnuppc+basic, + +xnuppc-112x37-m|darwin-112x37-m|Darwin PowerPC console (monochrome) 112x37, + use=xnuppc+112x37, use=xnuppc+basic, + +xnuppc-112x37|darwin-112x37|Darwin PowerPC console (color) 112x37, + use=xnuppc+c, use=xnuppc+112x37, use=xnuppc+basic, + +xnuppc-128x40-m|darwin-128x40-m|Darwin PowerPC console (monochrome) 128x40, + use=xnuppc+128x40, use=xnuppc+basic, + +xnuppc-128x40|darwin-128x40|Darwin PowerPC console (color) 128x40, + use=xnuppc+c, use=xnuppc+128x40, use=xnuppc+basic, + +xnuppc-128x48-m|darwin-128x48-m|Darwin PowerPC console (monochrome) 128x48, + use=xnuppc+128x48, use=xnuppc+basic, + +xnuppc-128x48|darwin-128x48|Darwin PowerPC console (color) 128x48, + use=xnuppc+c, use=xnuppc+128x48, use=xnuppc+basic, + +xnuppc-144x48-m|darwin-144x48-m|Darwin PowerPC console (monochrome) 144x48, + use=xnuppc+144x48, use=xnuppc+basic, + +xnuppc-144x48|darwin-144x48|Darwin PowerPC console (color) 144x48, + use=xnuppc+c, use=xnuppc+144x48, use=xnuppc+basic, + +xnuppc-160x64-m|darwin-160x64-m|Darwin PowerPC console (monochrome) 160x64, + use=xnuppc+160x64, use=xnuppc+basic, + +xnuppc-160x64|darwin-160x64|Darwin PowerPC console (color) 160x64, + use=xnuppc+c, use=xnuppc+160x64, use=xnuppc+basic, + +xnuppc-200x64-m|darwin-200x64-m|Darwin PowerPC console (monochrome) 200x64, + use=xnuppc+200x64, use=xnuppc+basic, + +xnuppc-200x64|darwin-200x64|Darwin PowerPC console (color) 200x64, + use=xnuppc+c, use=xnuppc+200x64, use=xnuppc+basic, + +xnuppc-200x75-m|darwin-200x75-m|Darwin PowerPC console (monochrome) 200x75, + use=xnuppc+200x75, use=xnuppc+basic, + +xnuppc-200x75|darwin-200x75|Darwin PowerPC console (color) 200x75, + use=xnuppc+c, use=xnuppc+200x75, use=xnuppc+basic, + +xnuppc-256x96-m|darwin-256x96-m|Darwin PowerPC console (monochrome) 256x96, + use=xnuppc+256x96, use=xnuppc+basic, + +xnuppc-256x96|darwin-256x96|Darwin PowerPC console (color) 256x96, + use=xnuppc+c, use=xnuppc+256x96, use=xnuppc+basic, + +######## DOS/WINDOWS +# CRT is shareware. It implements some xterm features, including mouse. +crt|crt-vt220|CRT 2.3 emulating VT220, + bce, + ncv@, use=vt100+enq, use=vt220-base, use=ecma+color, + +# SecureCRT 8.7.3.2279 +# 8.7.3 was released 2020/08/11 +# (eval 2021/02/05) +# VanDyke Software, Inc. +# +# Advertised features: +# Xterm 24-bit color +# Xterm 256-color +# Double-size characters +# Xterm extensions for mouse support and changing title bar +# Emulates VT100, VT102, VT220, VT320, Linux console, SCO ANSI, +# TN3270, TVI910, TVI925, Wyse 50/60, and ANSI. +# Changes: +# Added ANSI sc/rc and REP in 2019/12/17 +# Added TVI910/ TVI925 in 2019/11/20 +# +# Default: +# Emulate "Xterm", using "ANSI with 256color" +# TERM=xterm-256color +# +# vttest: +# DA1 \E[?62;1;2;6;7;8;9c (vt220 with DRCS and NRCS) +# DA2 \E[>1;136;0c +# double-sized characters do not work +# Menu-1 fails (window resizes to 132-columns, but does not repaint) +# NRCS fails (tried French, but none of the replacements worked) +# VT100 line-drawing works, except the C/R, etc., are an hline. +# VT52 works except for S8C1T bug. +# RIS hangs the terminal. +# Local SRM does not echo. +# Some of the VT320/VT220 status reports work, not locator or DECXCPR +# DECUDK works if I press shift. +# Fails CHT, CNL, CPL +# Does not honor bce with ECH +# ERM/SPA does not work +# REP has 11 +'s except for final 2 +'s, like PuTTY. +# Fails SL/SR +# DECRPM does not respond. +# dtterm modify/report operations do not work +# Alternate screen works. +# Mouse: +# highlight tracking does not work. +# any event tracking does not work, but +# button event tracking does work. +# DEC locator does not work. +# SGR coordinates does not work. +# ncurses: +# reset6 does reset to 80-columns +# ncurses RGB edit does not work. +# direct colors don't work, probably needs semicolons. +# tack: +# blink works, but not dim or invis +# no italics or crossed-out +# scripts: +# 256color handles "-r" option (but test/ncurses menu d does not alter) +# dynamic colors queries do not work, though it seems some can be set. +# resize.pl gets no reply, resize.sh needs fix for no reply. +scrt|securecrt|SecureCRT emulating xterm-256color, + bce@, km@, npc, + bel@, cvvis@, kcbt=\E[Z, use=vt220+pcedit, + use=xterm+256setaf, use=ecma+index, use=ansi+rep, + use=xterm+keypad, use=xterm+pcfkeys, use=xterm-basic, + +# Absolute Telnet +# (eval 2021/02/20) +# 11.24 was released 2020/08/13 +# Celestial Software +# +# Advertised features: +# Emacs compatibility mode (Meta Keys can be enabled for left/right ALT) +# Double-size characters +# Xterm extensions for mouse support +# Emulates VT52, VT100, VT220, VT320, ansi, xterm, qnx, scoansi, +# ANSIBBS, WYSE60, TeleVideo 950. +# +# Default: +# TERM=xterm +# +# vttest: +# DA1: \E[?62;1;2;6;7;8;9;15;22c (VT200 with DRCS, UDK, NRCS) +# DA2: \E[>1;10;0c +# However: +# + NRCS tests do not work +# + DECUDK test fails +# + VT100 double-sized characters work +# menu-1 autowrap does not work +# supports blinking text +# VT220 DECSCA last screen (ignoring ECH, etc), leaves fill on top/left +# VT220 device status reports fail, except operating status +# 8-bit controls work +# xterm alternate screen recognized, but cursor restored incorrectly +# xterm mouse (normal, any event, button event) works +# xterm highlight-mouse does not work properly, confused with any-event +# does not recognize SGR-mouse mode +# supports xterm window-modifiny/reporting controls +# supports ECMA-48 cursor movement except HPR +# supports REP and SD, but not ECMA-48 SL, SR, SU +# tack: +# italics and crossed-out do not work +# supports xterm-style modified function-keys, using X11R6 F1-F4. +# does not support modified cursor-keys or editing-keys +# uses VT220-style Home/End +# if alt-keys are enabled, +# meta-mode sends escape rather than shifting, in 7-bit mode +# meta-mode does the expected shifting in 8-bit mode +# scripts: +# supports 256-colors, including changing palette (ncurses menu d works) +# supports UTF-8, but honors VT100 line-drawing +absolute|Absolute Telnet emulating xterm, + kcbt=\E[Z, use=ecma+index, use=linux+kbs, use=ansi+rep, + use=vt220+pcedit, use=xterm+keypad, use=xterm+app, + use=xterm+pcf0, use=xterm+256color, use=xterm+x11mouse, + use=xterm-basic, + +#### PuTTY +# http://www.chiark.greenend.org.uk/~sgtatham/putty/ +# +# PuTTY 0.78 (September 2020, tested 12 August 2023) +# Testing with tack: +# implements cross-out text (shortly after 0.74) +# restore kLFT as kLFT5, etc. (mentioned in October 2021) +# does not support direct-colors (mentioned in July 2021) +# +# PuTTY 0.74 (27 June 2020) +# (unchanged) +# +# PuTTY 0.73 (September 2019) +# Testing with tack: +# does not implement italics +# does not implement cross-out text +# its settings dialog allows some of the VT100 line-drawing tests to pass +# (not the padding test, though) +# Testing with vttest: +# xterm mouse modes are incomplete: X10, highlight, any-event, and focus in/out modes are not implemented. +# does not implement protected areas +# does not implement SL/SR +# +# PuTTY 0.71 (March 2019) provided a workable "rep" capability. It also +# changed longstanding keypad assignments, so that these no longer apply: +# kLFT=\E[D, kRIT=\E[C, kb2=\E[G, +# +# PuTTY recognized xterm's 1006 mouse mode in late 2015; subsequent release was +# in 2017 (0.70) -TD +# +# Comparing with 0.51, vttest is much better (only a few problems with the +# cursor position reports and wrapping). +# +# PuTTY 0.51 (14 December 2000) +# +# This emulates VT100 + VT52 (plus a few VT220 features: ech, SRM, DECTCEM, as +# well as SCO and Atari, color palettes from Linux console). Reading the code, +# it is intended to be VT102 plus selected features. By default, it sets $TERM +# to xterm, which is incorrect, since several features are misimplemented: +# +# Alt+key always sends ESC+key, so 'km' capability is removed. +# +# Control responses, wrapping and tabs are buggy, failing a couple of +# screens in vttest. +# +# xterm mouse support is not implemented (unreleased version may). +# +# Several features such as backspace/delete are optional; this entry documents +# the default behavior. None of the combinations of keyboard settings match +# those used for xterm -TD +# +# PuTTY recognizes xterm's 1049 mode for switching to/from alternate screen, +# but implements it incorrectly as mentioned here: +# http://stackoverflow.com/questions/24613237/terminal-retains-bg-color-after-closing-vim-using-color-scheme-and-putty-256co/37869114#37869114 +putty|PuTTY terminal emulator, + am, bce, bw, ccc, mir, msgr, xenl, xon, XT, + it#8, ncv#22, U8#1, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cr=\r, cub1=^H, cud1=\ED, cup=\E[%i%p1%d;%p2%dH, + cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, + dispc=%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G + \342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e + %p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G + \342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@ + %e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E + %%G\340\202\242\E%%@%e%p1%c%;, + ech=\E[%p1%dX, el1=\E[1K, enacs=\E(B\E)0, + flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ind=\n, + initc=\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/ + %02x%p4%{255}%*%{1000}%/%02x, + is2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R, + kbs=^?, kcbt=\E[Z, khome=\E[1~, kind=\E[B, kri=\E[A, kspd=^Z, + nel=\r\n, oc=\E]R, op=\E[39;49m, ri=\EM, rmacs=^O, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, + rmul=\E[24m, + rs2=\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l, + s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, vpa=\E[%i%p1%dd, E3=\E[3J, + use=ansi+apparrows, use=ansi+csr, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=ansi+tabs, + use=ansi+rep, use=bracketed+paste, use=ecma+index, + use=ecma+strikeout, use=klone+color, use=klone+sgr, + use=putty+cursor, use=putty+fnkeys, use=vt220+pcedit, + use=xterm+alt1049, use=vt102+enq, use=xterm+sm+1006, + use=xterm+sl, use=vt100+fnkeys, use=putty+keypad, + use=vt220+cvis, + +# older versions (e.g., before 0.71) of PuTTY used a shift-modifier to toggle +# between normal- and application-mode for the cursor-keys. That was dropped, +# and a few years later (after 0.74) restored as the control-modifier. +putty+cursor|PuTTY modified cursor-keys, + kDN5=\E[B, kLFT5=\E[D, kRIT5=\E[C, kUP5=\E[A, +putty+keypad|PuTTY numeric keypad, + kp1=\EOq, kp2=\EOr, kp3=\EOs, kp4=\EOt, kp5=\EOu, kp6=\EOv, + kp7=\EOw, kp8=\EOx, kp9=\EOy, kpADD=\EOl, kpDIV=\EOQ, + kpDOT=\EOn, kpMUL=\EOR, kpNUM=\EOP, kpSUB=\EOS, kpZRO=\EOp, + +vt100-putty|Reset PuTTY to pure VT100, + rs2=\E<\E["p\Ec\E[?3l\E]R\E[40"p\E[61"p\E[50;1;2"p, + use=vt100, +putty-256color|PuTTY 0.58 with xterm 256-colors, + use=xterm+256setaf, use=putty, +putty-noapp|putty with cursor keys in normal mode, + kLFT=\EOD, kRIT=\EOC, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, kind=\EOB, kri=\EOA, rmkx=\E>, smkx=\E=, + use=putty, + +# One of the keyboard selections is "VT100+". +# pterm (the X11 port) uses shifted F1-F10 as F11-F20 +putty-vt100|VT100+ keyboard layout, + use=putty+fnkeys+vt100, use=putty, + +putty-sco|putty with SCO function keys, + use=putty+fnkeys+sco, use=putty, + +# PuTTY has more than one section in its Keyboard configuration: +# a) backspace/delete, which we ignore since that choice largely depends on +# whether one matches Unix and BSD or Linux. +# b) home/end keys, also ignored because the "rxvt" setting sends keys which +# are unrelated to rxvt's actual settings. +# c) function keys and keypad - this is the interesting part. None of the +# selections match any of their respective namesakes, but they are shown +# here to help users who expect that the selections do what is implied. +# +# This is the default setting for PuTTY +putty+fnkeys|fn-keys for PuTTY, + use=putty+fnkeys+esc, + +putty+fnkeys+esc|ESC[n~ fn-keys for PuTTY, + kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, + kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + +putty+fnkeys+linux|Linux fn-keys for PuTTY, + kf1=\E[[A, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, + use=putty+fnkeys+esc, + +putty+fnkeys+xterm|Xterm R6 fn-keys for PuTTY, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + use=putty+fnkeys+esc, + +putty+fnkeys+vt400|VT400 fn-keys for PuTTY, + use=putty+fnkeys+esc, + +# Shifted F1 is F11. F13-F20 inherit from the defaults, and the last distinct +# key is F20. +putty+fnkeys+vt100|VT100+ fn-keys for PuTTY, + kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EO[, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, + kf9=\EOX, use=putty+fnkeys+esc, + +# Unlike xterm-sco, this leaves kmous ambiguous with kf1. +# +# Use modifiers to obtain function keys past 12: +# F1-F12 - normal +# F13-F24 - shift +# F25-F36 - control/alt +# F37-F48 - control/shift +# +putty+fnkeys+sco|SCO fn-keys for PuTTY, + kbeg=\E[E, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, kf11=\E[W, + kf12=\E[X, kf13=\E[Y, kf14=\E[Z, kf15=\E[a, kf16=\E[b, + kf17=\E[c, kf18=\E[d, kf19=\E[e, kf2=\E[N, kf20=\E[f, + kf21=\E[g, kf22=\E[h, kf23=\E[i, kf24=\E[j, kf25=\E[k, + kf26=\E[l, kf27=\E[m, kf28=\E[n, kf29=\E[o, kf3=\E[O, + kf30=\E[p, kf31=\E[q, kf32=\E[r, kf33=\E[s, kf34=\E[t, + kf35=\E[u, kf36=\E[v, kf37=\E[w, kf38=\E[x, kf39=\E[y, + kf4=\E[P, kf40=\E[z, kf41=\E[@, kf42=\E[[, kf43=\E[\\, + kf44=\E[], kf45=\E[\^, kf46=\E[_, kf47=\E[`, kf48=\E[{, + kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, khome=\E[H, + kich1=\E[L, knp=\E[G, kpp=\E[I, + +#### mintty +# https://github.com/mintty/mintty +# +# Originally a fork (and reduction) of PuTTY, this has grown from 15ksloc in +# 2013 to 41ksloc in 2020. That is still smaller than PuTTY (160ksloc), but +# larger than rxvt (31ksloc) and slightly smaller than rxvt-unicode (42ksloc). +# +# Version 3.0 responds to DA as a VT400, however it does not implement the +# application keypad. The assignment of cursor-keys versus modifiers differs +# from xterm (alt-left and alt-right send modifier 7, i.e., alt+control). +# +# Thomas Wolff suggested these extensions: +# blink2 turn on rapid blinking +# blink0 turn off blinking +# norm turn off bold and half-bright mode +# opaq turn off blank mode +# smul2 begin double underline mode +# smol begin overline mode +# rmol exit overline mode +# Font0 use default font +# Font1 use alternative font 1 +# ... +# Font10 use alternative font 10 +# setal set (under)line color +# ol set default (under)line color +# overs overstrike (print characters over each other) +# +# but see vte-2018 (use Smol/Rmol rather than smol/rmol). +mintty|Cygwin Terminal, + setal=\E[5%p1%dm, use=xterm+256color, + use=mintty+common, +mintty-direct|Cygwin Terminal direct-color, + use=kitty+setal, use=xterm+direct, use=mintty+common, +mintty+common|shared capabilities for mintty, + km@, npc, + kcbt=\E[Z, kent=\EOM, rmm@, rmpch=\E[10m, + rs1=\Ec\E]104\007, rshm=\E[22m, rsubm=\E[75m, + rsupm=\E[75m, smm@, smpch=\E[11m, sshm=\E[1:2m, + ssubm=\E[74m, ssupm=\E[73m, Rmol=\E[55m, Smol=\E[53m, + Smulx=\E[4:%p1%dm, blink2=\E[6m, norm=\E[22m, + opaq=\E[28m, smul2=\E[21m, use=linux+kbs, use=ansi+rep, + use=ecma+strikeout, use=ecma+index, use=vt420+lrmm, + use=xterm+focus, use=xterm+sm+1006, use=xterm+pcfkeys, + use=xterm+tmux, use=ecma+italics, use=xterm-basic, + use=bracketed+paste, use=report+version, +# 2019-06-09: These capabilities are commented-out for compatibility with +# existing releases 5.9-6.1, and may be considered for inclusion after the +# release of ncurses 6.2: +# Font0=\E[10m, +# Font1=\E[11m, +# Font2=\E[12m, +# Font3=\E[13m, +# Font4=\E[14m, +# Font5=\E[15m, +# Font6=\E[16m, +# Font7=\E[17m, +# Font8=\E[18m, +# Font9=\E[19m, +# Font10=\E[20m, +# blink0=\E[25m, +# ol=\E[59m, +# overs=\E[8\:7m, + +#### TeraTerm + +# This entry is for Tera Term Pro version 2.3, for MS-Windows 95/NT written by +# T. Teranishi dated Mar 10, 1998. It is a free software terminal emulator +# (communication program) which supports: +# +# - Serial port connections. +# - TCP/IP (telnet) connections. +# - VT100 emulation, and selected VT200/300 emulation. +# - TEK4010 emulation. +# - File transfer protocols (Kermit, XMODEM, ZMODEM, B-PLUS and +# Quick-VAN). +# - Scripts using the "Tera Term Language". +# - Japanese and Russian character sets. +# +# The program does not come with terminfo or termcap entries. However, the +# emulation (testing with vttest and ncurses) is reasonably close to VT100 (no +# VT52 or doublesize character support; blinking is done with color). Besides +# the HPA, VPA extensions it also implements CPL and CNL. +# +# All of the function keys can be remapped. This description shows the default +# mapping, as installed. Both VT100 PF1-PF4 keys and quasi-vt220 F1-F4 keys +# are supported. F13-F20 are obtained by shifting F3-F10. The editing keypad +# is laid out like VT220, rather than the face codes on the PC keyboard, i.e, +# kfnd Insert +# kslt Delete +# kich1 Home +# kdch1 PageUp +# kpp End +# knp PageDown +# +# ANSI colors are implemented, but cannot be combined with video attributes +# except for reverse. +# +# No fonts are supplied with the program, so the acsc string is chosen to +# correspond with the default Microsoft terminal font. +# +# Tera Term recognizes some xterm sequences, including those for setting and +# retrieving the window title, and for setting the window size (i.e., using +# "resize -s"), though it does not pass SIGWINCH to the application if the +# user resizes the window with the mouse. +teraterm2.3|Tera Term Pro 2.3, + km, + ncv#43, vt@, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i + \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u + \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP, + dch1=\E[P, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E[?5h$<200/>\E[?5l, hpa=\E[%i%p1%dG, kf1=\E[11~, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, + kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, op=\E[100m, rev=\E[7m, ri=\EM, + rmso=\E[27m, rmul=\E[24m, sgr0=\E[0m\017, smso=\E[7m, + smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+idl, + use=vt220+vtedit, use=vt100+enq, use=klone+color, + use=vt100, use=vt220+cvis, + +# Version 4.59 has regular VT100 line-drawing (so it is no longer necessary +# to choose a Windows OEM font). +# +# Testing with tack: +# - it does not have xenl (suppress that) +# - underline seems to work with color (modify ncv). +# Testing with vttest: +# - wrapping differs from VT100 (menu 1). +# - it recognizes xterm's X10 and normal mouse tracking, but none of the +# other flavors. +# - it recognizes the dtterm window controls for reporting size in +# characters and pixels. +# - it passes SIGWINCH. +teraterm4.59|Tera Term Pro 4.59, + bce, xenl@, + ncv#41, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + kmous=\E[M, use=teraterm2.3, + +# Version 4.97 +# +# Testing with tack: +# - no bell (flash works) +# - bold is yellow, blink is red. +# - default keyboard sends ^? for Delete, can be configured for kdch1 +# - no meta mode +# Testing with vttest: +# + autowrap has problems... +# + color-tests for bce feature match xterm's behavior +# + handles most of xterm's mouse-controls other than highlight-tracking. +# xterm's SGR 1006 works. +# + partial support for DEC locator-events +# + implements ECMA-48 SD/SU, but not REP, SL/SR. +# + has a "Tek" window, but does not work with vttest's examples +# + supports the dtterm window modify/report controls +# + responds to DECRQM and DECRQSS controls, but not consistent with DSR +# e.g., for VT220 +# + VT220 screen-display tests are ok +# + no VT52 support +# Other tests: +# + recognizes xterm's original direct-colors sequences, but result is +# poor. +# + no UTF-8 apparent when UTF-8 is set, with font Lucida Control +teraterm4.97|Tera Term Pro 4.97, + XT, use=ecma+color, use=xterm+sm+1006, use=teraterm4.59, +teraterm-256color|TeraTerm with xterm 256-colors, + use=xterm+256setaf, use=teraterm, + +teraterm|Tera Term, + use=teraterm4.97, + +#### Command prompt + +# Tested with WinNT 4.0, the telnet application assumes the screensize is +# 25x80. This entry uses the 'Terminal' font, to get line-drawing characters. +# +# Other notes: +# a) Fails tack's cup (cursor-addressing) test, though cup works well enough +# for casual (occasional) use. Also fails several of the vttest screens, +# but that is not unusual for VT100 "emulators". +# b) Does not implement VT100 keypad +# c) Recognizes a subset of VT52 controls. +ms-vt100|MS telnet imitating DEC VT100, + lines#25, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i + \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u + \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + ka1@, ka3@, kb2@, kc1@, kc3@, kent@, kf0@, kf1@, kf10@, kf2@, kf3@, kf4@, + kf5@, kf6@, kf7@, kf8@, kf9@, tbc@, use=vt102+enq, use=vt100, + +# Tested with Windows 2000, the telnet application runs in a console window, +# also using 'Terminal' font. +# +# Other notes: +# a) This version has no function keys or numeric keypad. Unlike the older +# version, the numeric keypad is entirely ignored. +# b) The program sets $TERM to "ansi", which of course is inaccurate. +ms-vt100-color|vtnt|windows 2000 ANSI (sic), + bce, + dch=\E[%p1%dP, ich=\E[%p1%d@, use=ecma+color, + use=ms-vt100, + +# Based on comments from Federico Bianchi: +# +# vt100+ is basically a VT102-noSGR with ANSI.SYS colors and a different +# scheme for PF keys. +# +# and PuTTY wishlist: +# +# The modifiers are represented as the codes listed above, prefixed to +# the normal sequences. If the modifier is pressed alone, its sequence +# is transmitted twice in succession. If multiple modifiers apply, +# they're transmitted in the order shift, control, alt. +# +# Shift \E^S +# Alt \E^A, +# Ctrl \E^C, +ms-vt100+|vt100+|windows XP VT100+ (sic), + kdch1=\E-, kend=\Ek, kf1=\E1, kf10=\E0, kf11=\E!, kf12=\E@, + kf13=\E\023\E1, kf14=\E\023\E2, kf15=\E\023\E3, + kf16=\E\023\E4, kf17=\E\023\E5, kf18=\E\023\E6, + kf19=\E\023\E7, kf2=\E2, kf20=\E\023\E8, kf21=\E\023\E9, + kf22=\E\023\E0, kf23=\E\023\E!, kf24=\E\023\E@, + kf25=\E\003\E1, kf26=\E\003\E2, kf27=\E\003\E3, + kf28=\E\003\E4, kf29=\E\003\E5, kf3=\E3, kf30=\E\003\E6, + kf31=\E\003\E7, kf32=\E\003\E8, kf33=\E\003\E9, + kf34=\E\003\E0, kf35=\E\003\E!, kf36=\E\003\E@, + kf37=\E\001\E1, kf38=\E\001\E2, kf39=\E\001\E3, kf4=\E4, + kf40=\E\001\E4, kf41=\E\001\E5, kf42=\E\001\E6, + kf43=\E\001\E7, kf44=\E\001\E8, kf45=\E\001\E9, + kf46=\E\001\E0, kf47=\E\001\E!, kf48=\E\001\E@, kf5=\E5, + kf6=\E6, kf7=\E7, kf8=\E8, kf9=\E9, khome=\Eh, kich1=\E+, + knp=\E/, kpp=\E?, use=ms-vt100-color, + +ms-vt-utf8|vt-utf8|UTF-8 flavor of VT100+, + use=ms-vt100+, + +# VT-UTF-8 and VT100+ Protocols +# https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-vuvp/969416c0-ccd6-4a75-a9b3-597d7713845b +# +# This Microsoft "protocol" adapted the aixterm 16-color feature from xterm's +# documentation in 2015, as seen in successive revisions: +# +# 2013/07/22 has 8 colors +# 2015/10/16 has 16 colors using SGR 90-97, 100-107 as well as SGR 24 and 27, +# adds "informative" reference to xterm's ctlseqs +# +# The cnorm/civis definitions added in 2015 are unrelated to any standard. +ms-vt100-16color|VT-UTF-8 and VT100+, + civis=\E[?h, cnorm=\E[?l, rmso=\E[27m, rmul=\E[24m, + use=ibm+16color, use=ms-vt100+, + +# Based on +# https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences +# We use this scheme to map function keys +# terminfo modifier code keys +# kf13-kf24 shift 2 F1 to F12 +# kf25-kf36 alt 3 F1 to F12 +# kf37-kf48 control 4 F1 to F12 +# kf49-kf60 ctrl-alt 7 F1 to F12 +# +# Unclear: smam and rmam implemented? +# Unclear: rmkx, smkx, rmir, smir - irrelevant? +# +# TD: +# + According to tack, tbc and cbt fail. +# + The line-drawing (acsc) does not work in telnet or ssh. I added the +# U8 extension to tell ncurses to use UTF-8 for line-drawing (when the +# locale uses UTF-8). That won't work for telnet (which uses ASCII), +# but seems to work for OpenSSH's ssh. I set the codepage to 65001, +# of course. +# + Function keys... do not work consistently in telnet and ssh. With +# telnet, kf1-kf4 are \EOP to \EOS, and kf5-kf12 match the terminfo. +# But with ssh, it's entirely different (reminds me of rxvt). +winconsole|Windows 10 new console, + am, km, mir, msgr, xenl, + ncv@, U8#1, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz~~, + bel=^G, blink@, cr=\r, ech=\E[%p1%dX, el1=\E[0K, ich1@, ind=\n, + invis@, is1=\E[!p, kf13=\E[11;2~, kf14=\E[12;2~, + kf15=\E[13;2~, kf16=\E[14;2~, kf17=\E[15;2~, + kf18=\E[17;2~, kf19=\E[18;2~, kf20=\E[19;2~, + kf21=\E[20;2~, kf22=\E[21;2~, kf23=\E[24;2~, + kf24=\E[25;2~, kf25=\E[11;3~, kf26=\E[12;3~, + kf27=\E[13;3~, kf28=\E[14;3~, kf29=\E[15;3~, + kf30=\E[17;3~, kf31=\E[18;3~, kf32=\E[19;3~, + kf33=\E[20;3~, kf34=\E[21;3~, kf35=\E[24;3~, + kf36=\E[25;3~, kf37=\E[11;4~, kf38=\E[12;4~, + kf39=\E[13;4~, kf40=\E[14;4~, kf41=\E[15;4~, + kf42=\E[17;4~, kf43=\E[18;4~, kf44=\E[19;4~, + kf45=\E[20;4~, kf46=\E[21;4~, kf47=\E[24;4~, + kf48=\E[25;4~, kf49=\E[11;7~, kf50=\E[12;7~, + kf51=\E[13;7~, kf52=\E[14;7~, kf53=\E[15;7~, + kf54=\E[17;7~, kf55=\E[18;7~, kf56=\E[19;7~, + kf57=\E[20;7~, kf58=\E[21;7~, kf59=\E[24;7~, + kf60=\E[25;7~, khome=\E[1~, nel=\r\n, ri=\E[T, rmacs=\E(B, + rmir@, rmpch@, rs1=\E[!p, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t + \E(0%e\E(B%;, + sgr0=\E[0m\E(B, smacs=\E(0, smir@, smpch@, use=ansi+arrows, + use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idc, + use=ansi+idl, use=ecma+index, use=ansi+inittabs, + use=ansi+local, use=ecma+sgr, use=ecma+color, + use=vt220+cvis, use=vt220+pcedit, use=xterm+nopcfkeys, + +# Windows Terminal +# https://github.com/microsoft/terminal +# +# Version 1.21.2911.0 +# 2024-10-17 +# +# - The "About" dialog has a pointer to the release notes, but that turns out +# to be for all branches. This particular version (unlike those previously +# tested) happens to be a non-preview version. +# - Windows Terminal #2958 has relevant discussion. +# +# tack: +# - keypad escapes still do not work +# - meta mode does not work +# - when running tests, the screen maximized and did not resume normal size +# +# vttest: +# - identifies as a VT100-level terminal supporting Greek and Turkish (not +# applicable to a VT100), horizontal scrolling () and DRCS (seems to work) +# - left/right margins work +# - DECSCUSR is okay except for mode 1 +# - SL/SR fail +# - does not support XTVERSION +# - some mouse controls work, but not highlight tracking and X10 compatibility +# - mouse focus events appear - but not in the test-screen (like VTE). +# - cursor position after alternate screen is correct for 1049, not otherwise +# - window reporting does not work +# +# wraptest: +# - DECRC does not restore wrap +# +# other: +# - change history says it supports bracketed paste +# - Greek and Turkish character sets work with GL, not GR +# - source code says it implements OSC 52, as well as 12, 112, but not 104. +# +# Windows 10 22H2 (also Windows 11) +# Version 1.16.10261.0 +# 2020-01-25 +# +# - Windows Terminal #1553: "Feature Request: Mouse/Touch/Pointer Bindings +# (like middle-click paste, right-click context menu, etc.)", compare to +# https://learn.microsoft.com/en-us/windows/console/mouse-event-record-str +# This appears to be related to a problem with its implementation of the +# Console API; the mouse does not work in a "Command Window" (e.g., as used +# in the ncurses MinGW driver), although escape sequences work. +# +# Windows 10 21H1 +# Version 1.9.1942.0 +# 2021-07-13 +# +# This has longstanding issues with CR/LF mapping, e.g., +# - first reported by Juergen Pfeifer August 13, 2020, with workaround +# - Windows Terminal #8303 "Updates to ms-terminal terminal type in terminfo to +# 1.4 from 0.2" +# - Windows Terminal #6733 "Midnight Commander (mc) output is screwed when +# using the 'ms-terminal' as $TERM" +# +# still seen in testing during May-July 2021. As a workaround, this terminal +# description sets cud1 to an escape sequence rather than just \r. +# +# Using TERM=xterm-256color shows a number of problems. +# A few are seen only in the WSL2 environment. +# +# tack: +# - flash does not work. +# - video attribute blink does not work. +# - video attribute invis does not work in WSL2. +# - italics sitm/ritm do not work in WSL2. +# - crossed-out smxx/rmxx do not work in WSL2. +# - reloading colors via initp interchanges red/blue. +# - does not implement OSC 104, which is used for resetting colors in xterm. +# - does not support numeric keypad application mode. +# - control-modifier (without alt/shift) does not work for special keys. +# - meta-key sends escape character rather than acting as a meta key. +# +# vttest: +# - identifies itself as a VT100. +# - cursor movement (menu 1) does not work properly, e.g., for wrapping. +# - does not support 8-bit controls. +# - does not support VT420 rectangles. +# - does not support VT420 left/right margins. +# - ECMA-48 cursor-movement works. +# - does not support X10 mouse, or mouse highlight tracking. +# - SGR mouse mode 1006 works. +# - any-event mouse mode shows no focus-in/focus-out events. +# - alternate screen 47/48 modes do not work, nor do 1047/1048. +# - alternate screen 1049 mode works. +# - none of the window report/modify operations work. +# - none of the DECRPM/DECRQM reporting operations work. +# +# xterm: +# - 256colors2.pl -r, -i and -q options work. +# - dynamic colors do not work. +# - paste64.pl does not work, i.e., bracketed-paste. +# - tcapquery.pl does not work. +# +# Windows 10 1903 +# Version 0.2.1831.0 +# 2019-07-02 +# +# The task manager shows this as "OpenConsole.exe", which differs +# from the "Windows Command Processor" used for the command-prompt. +# +# The settings dialog does not work (unless the end user expects to open +# profiles.json in Visual Studio). There is no documentation, of course. +# +# Testing via an ssh connection, using openssh: +# - the program sets TERM to cygwin if the tab is set to PowerShell, +# and to xterm-256color if "Legacy". However, in the latter, more tests +# fail in vttest, which does not pay attention to TERM. +# vttest: +# - menu 1 (tests for cursor movement) misbehaves like command-prompt +# - primary DA says this is a vanilla VT100 +# - does not flush response to primary DA, leaving a ^M on the end when +# the PowerShell tab is used. Both the "Legacy" tab and the command-prompt +# work properly in this test. +# - in the generic VT100 tests, there are problems with character sets +# (diamond shows as a double-width character, DEL as two replacement-chars). +# - outside of the generic VT100 tests, the program does poorly because most +# of the features are missing. +# - ECH does not work properly +# - a few generic xterm features are supported (set window title), but +# others are missing (such as the mouse). +# - the cursor visible/invisible works in the PowerShell tab, not in "Legacy" +# tack: +# - blink, dim, bold, invis, protect do not work +# - bce works (but per vttest, with ED, EL, not ECH) +# - does not support keypad application mode +# - implements most of the xterm modified keys; sometimes modifiers are ignored +# or simply incorrect +# - sends escape+key rather than implementing meta mode +# other: +# - color palette can be altered, but OSC 104 for resetting does not work +# - crashed with a script used for testing NRCS. +# - does not recognize either xterm+direct or xterm+indirect escapes. +ms-terminal|Windows terminal, + use=xterm+256color, use=ms+terminal, +ms-terminal-direct|Windows terminal with direct-colors, + use=xterm+direct, use=ms+terminal, +ms+terminal|building block for Windows terminal, + npc, + cud1=\E[B, kcbt=\E[Z, oc@, rmkx=\E[?1l, rmm@, smkx=\E[?1h, + smm@, rv=\E\\[>0;10;1c, use=linux+kbs, + use=bracketed+paste, use=xterm+pcfkeys, use=ansi+rep, + use=xterm+sm+1006, use=ecma+index, use=ecma+italics, + use=ecma+strikeout, use=vt420+lrmm, use=xterm-basic, + use=xterm+focus, use=xterm+tmux, + +#### Visual Studio +# Visual Studio Code 1.45.0 uses xterm.js 12.8.1 (see https://xtermjs.org/). +# +# vttest: +# - fixes menu 1 problem with wrapping +# - supports DECALN +# - fixes menu 8 problem with delete-character +# - REP, SL/SL work +# - keypad application mode still does not work; PF1-PF4 are not assigned. +# - DECRQM/DECRPM do not work +# - xterm mouse features: +# - SGR coordinates work; the other modes do not (see vscode #96058) +# - focus-events are not sent +# - mouse highlight tracking does not send button event +# tack/other: +# - little or no change since previous review +# +# Visual Studio Code 1.35.1 uses xterm.js (see https://xtermjs.org/). +# https://code.visualstudio.com/docs/editor/integrated-terminal +# +# This sets TERM to xterm-256color, which is a little more successful than +# Windows Terminal. +# +# vttest: +# - menu 1 (cursor movement) has problems with wrapping +# - claims to be a VT100 with AVO, but copies xterm #276's secondary response +# - menu 8 (insert/delete char/line) has problem with delete-character +# - like Windows Terminal, fails the ECH test: neither supports DECALN +# However, the bce test with ECH works. +# - does not support keypad application mode +# - supports most xterm mode controls (except DEC Locator Events) +# - REP, SL/SL do not work, but SD/SU work. +# - the alternate-screen tests fail because it does not support DECALN +# - window modify/report is not supported +# - supports some VT320 presentation reports +# tack: +# - does not support blinking text +# - implements most of the xterm modified keys, with some exceptions: +# - pageup/pagedown do not send escapes +# - alt cursor left/right send escape-b and escape-f +# - sends UTF-8 like xterm for meta mode +# other: +# - mouse mode is not reset by reset-sequence +# - supports italics and dim, but not cross-out or double-underline +# - color-palette cannot be changed +vscode|xterm.js|Visual Studio Code terminal using xterm.js, + npc, + kcbt=\E[Z, rmkx=\E[?1l, smkx=\E[?1h, use=linux+kbs, + use=xterm+256setaf, use=ecma+index, use=xterm+focus, + use=xterm+sm+1006, use=xterm+pcfkeys, use=ecma+italics, + use=xterm-basic, use=bracketed+paste, +vscode-direct|Visual Studio Code with direct-colors, + use=xterm+indirect, use=vscode, + +######## X TERMINAL EMULATORS +#### XTERM +# +# You can add the following line to your .Xdefaults to change the terminal type +# set by the xterms you start up to my-xterm: +# +# *termName: my-xterm +# +# System administrators can change the default entry for xterm instances +# by adding a similar line to /usr/X11/lib/X11/app-defaults/XTerm. In either +# case, xterm will detect and reject an invalid terminal type, falling back +# to the default of xterm. +# + +# X10/6.6 11/7/86, minus alternate screen, plus (csr) +# (xterm: ":MT:" changed to ":km:"; added / based on init string; +# removed (hs, eslok, tsl=\E[?E\E[?%i%dT, fsl=\E[?F, dsl=\E[?E) +# as these seem not to work -- esr) +x10term|vs100-x10|xterm terminal emulator (X10 window system), + OTbs, am, km, mir, msgr, xenl, xon, + cols#80, it#8, lines#65, + bold=\E[1m, clear=\E[H\E[2J, csr=\E[%i%p1%d;%p2%dr, + cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P, ed=\E[J, el=\E[K, + home=\E[H, ht=^I, ind=\n, is2=\E\E[m\E[?7h\E[?1;4l, kbs=^H, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, rev=\E[7m, ri=\EM, rmam=\E[?7l, + rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=, + smso=\E[7m, smul=\E[4m, use=ansi+idl, + +# csl is extension which clears the status line +x10term+sl|status-line for X10 xterm, + eslok, hs, + dsl=\E[?H, fsl=\E[?F, tsl=\E[?E\E[?%i%p1%dT, csl=\E[?E, + +# Compatible with the R5 xterm +# (from the XFree86 3.2 distribution, removed) +# added khome/kend, rmir/smir, rmul/smul, hts based on the R5 xterm code - TD +# corrected typos in rs2 string - TD +# added u6-u9 -TD +xterm-r5|xterm R5 version, + OTbs, am, km, msgr, xenl, + cols#80, it#8, lines#24, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + hts=\EH, ind=\n, kdl1=\E[31~, kel=\E[8~, kf0=\EOq, + kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, + kil1=\E[30~, kmous=\E[M, rev=\E[7m, ri=\EM, rmkx=\E[?1l\E>, + rmso=\E[m, rmul=\E[m, + rs2=\E>\E[?1;3;4;5;6l\E[4l\E[?7h\E[m\E[r\E[2J\E[H, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 + %;m, + sgr0=\E[m, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, + tbc=\E[3g, use=xterm+kbs, use=ansi+apparrows, + use=ansi+csr, use=ansi+idc, use=ansi+idl, use=ansi+local, + use=vt220+pcedit, use=vt100+enq, + +# Compatible with the R6 xterm +# (from XFree86 3.2 distribution, and added, removed) +# added khome/kend, hts based on the R6 xterm code - TD +# (khome/kend do not actually work in X11R5 or X11R6, but many people use this +# for compatibility with other emulators). +xterm-r6|xterm X11R6 version, + OTbs, am, km, mir, msgr, xenl, + cols#80, it#8, lines#24, + acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP, + dch1=\E[P, ed=\E[J, el=\E[K, enacs=\E)0, home=\E[H, ht=^I, + hts=\EH, ind=\n, + is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\E[11~, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, + kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, kmous=\E[M, meml=\El, memu=\Em, + rev=\E[7m, ri=\EM, rmacs=^O, rmir=\E[4l, rmkx=\E[?1l\E>, + rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, + sgr0=\E[m, smacs=^N, smir=\E[4h, smkx=\E[?1h\E=, tbc=\E[3g, + use=xterm+alt47, use=ansi+csr, use=ansi+idl, + use=ansi+local, use=ansi+sgrso, use=ansi+sgrul, + use=vt220+vtedit, use=xterm+kbs, use=vt100+enq, + +xterm-old|antique xterm version, + use=xterm-r6, +# The monochrome version began as a copy of "xtermm" (from Solaris), and was +# initially part of the xterm sources (in XFree86). But "xterm" continued to +# grow, while "xterm-mono" had none of the newer features. Additionally, +# inheriting from "xtermm" runs into several problems, including different +# function keys as well as the fact that the mouse support is not compatible. +# This entry restores the original intent, intentionally not an alias to +# simplify maintenance -TD +xterm-mono|monochrome xterm, + use=xterm-r6, +# This is the base xterm entry for the xterm supplied with XFree86 3.2 & up. +# The name has been changed and some aliases have been removed. +xterm-xf86-v32|xterm terminal emulator (XFree86 3.2 Window System), + OTbs, am, bce, km, mir, msgr, xenl, XT, + cols#80, lines#24, ncv@, + acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ech=\E[%p1%dX, ed=\E[J, el=\E[K, + el1=\E[1K, enacs=\E(B\E)0, flash=\E[?5h$<100/>\E[?5l, + home=\E[H, hpa=\E[%i%p1%dG, ind=\n, + is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>, + kbeg=\EOE, kbs=^?, kdch1=^?, kend=\EOF, kf1=\E[11~, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, + kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~, kmous=\E[M, kslt=\E[4~, + meml=\El, memu=\Em, rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, + rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=^O, + rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>, + setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, + use=ansi+apparrows, use=ansi+csr, use=ansi+idc, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=xterm+alt47, use=xterm+kbs, use=vt100+enq, + use=ecma+color, use=vt220+cvis, use=vt220+keypad, + use=vt220+pcedit, + +# This is the stock xterm entry supplied with XFree86 3.3, which uses VT100 +# codes for F1-F4 except while in VT220 mode. +xterm-xf86-v33|xterm terminal emulator (XFree86 3.3 Window System), + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, use=xterm-xf86-v32, + +# This version was released in XFree86 3.3.3 (November 1998). +# Besides providing printer support, it exploits a new feature that allows +# xterm to use terminfo-based descriptions with the titeInhibit resource. +# -- the distribution contained incorrect khome/kend values -TD +xterm-xf86-v333|xterm terminal emulator (XFree86 3.3.3 Window System), + blink=\E[5m, ich1@, invis=\E[8m, + is2=\E[!p\E[?3;4l\E[4l\E>, kdch1=\E[3~, kfnd@, kslt@, + rmcup=\E[?1047l\E[?1048l, rs1=\Ec, + rs2=\E[!p\E[?3;4l\E[4l\E>, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + smcup=\E[?1048h\E[?1047h, use=ansi+pp, + use=xterm-xf86-v33, + +# This version was released in XFree86 4.0. +xterm-xf86-v40|xterm terminal emulator (XFree86 4.0 Window System), + npc, + kDC=\E[3;5~, kEND=\EO5F, kHOM=\EO5H, kIC=\E[2;5~, + kLFT=\EO5D, kNXT=\E[6;5~, kPRV=\E[5;5~, kRIT=\EO5C, ka1@, + ka3@, kb2=\EOE, kc1@, kc3@, kcbt=\E[Z, kf13=\EO2P, kf14=\EO2Q, + kf15=\EO2R, kf16=\EO2S, kf17=\E[15;2~, kf18=\E[17;2~, + kf19=\E[18;2~, kf20=\E[19;2~, kf21=\E[20;2~, + kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P, + kf26=\EO5Q, kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~, + kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, + kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, + kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R, + kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~, kf43=\E[18;6~, + kf44=\E[19;6~, kf45=\E[20;6~, kf46=\E[21;6~, + kf47=\E[23;6~, kf48=\E[24;6~, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? + %p9%t\016%e\017%;, + use=xterm+alt1049, use=xterm-xf86-v333, + +# This version was released in XFree86 4.3. +xterm-xf86-v43|xterm terminal emulator (XFree86 4.3 Window System), + kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, + kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, + kbeg@, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p7%t;8%;m%?%p9%t\016%e\017%;, + use=xterm-xf86-v40, + +# Controlling the cursor-visibility is not a "new" feature, but was generally +# neglected in terminal emulators until the mid-1990s. These would work for +# the hardware terminals, or for more recent emulators, e.g., xterm. +vt220+cvis|DECTCEM VT220 cursor-visibility, + civis=\E[?25l, cnorm=\E[?25h, +vt220+cvis8|8-bit DECTCEM VT220 cursor-visibility, + civis=\233?25l, cnorm=\233?25h, +# The first block is for terminals which did not support blinking cursor. +att610+cvis0|AT&T 610 cursor-visibility, + civis=\E[?25l, cnorm=\E[?12l\E[?25h, +att610+cvis|AT&T 610 cursor-visibility with blink, + civis=\E[?25l, cnorm=\E[?12l\E[?25h, cvvis=\E[?12;25h, + +# This version was released in XFree86 4.4. +xterm-xf86-v44|xterm terminal emulator (XFree86 4.4 Window System), + use=att610+cvis, use=ecma+index, use=xterm-xf86-v43, + +xterm-xfree86|xterm terminal emulator (XFree86), + use=xterm-xf86-v44, + +xterm+nofkeys|building block for xterm fkey-variants, + npc, + kcbt=\E[Z, nel=\EE, use=ecma+index, use=ansi+rep, + use=ecma+strikeout, use=vt420+lrmm, use=xterm+focus, + use=xterm+sm+1006, use=xterm+tmux, use=ecma+italics, + use=xterm+keypad, use=xterm-basic, + +xterm-p370|xterm patch #370, + rv=\E\\[41;[1-6][0-9][0-9];0c, + xr=\EP>\\|XTerm\\([1-9][0-9]+\\)\E\\\\, + use=ecma+index, use=ansi+rep, use=ecma+strikeout, + use=xterm+pcfkeys, use=xterm+nofkeys, + use=bracketed+paste, use=report+version, + use=xterm+focus, + +xterm-p371|xterm patch #371, + use=dec+sl, use=xterm-p370, + +# This version reflects the current xterm features. +xterm-new|modern xterm terminal emulator, + use=xterm-p370, + +# This fragment is for people who cannot agree on what the backspace key +# should send. The ncurses configure script option "--with-xterm-kbs" can +# set it to BS (standard) or DEL (Linux's notion of "vt220"). xterm provides +# either, depending on how the pseudoterminals are configured. +xterm+kbs|fragment for backspace key, + kbs=^H, + +# Use this fragment for terminals that always use DEL for "backspace". +linux+kbs|fragment for "backspace" key, + kbs=^?, +# +# This fragment describes as much of XFree86 xterm's "pc-style" function +# keys as will fit into terminfo's 60 function keys. +# From ctlseqs.ms: +# Code Modifiers +# --------------------------------- +# 2 Shift +# 3 Alt +# 4 Shift + Alt +# 5 Control +# 6 Shift + Control +# 7 Alt + Control +# 8 Shift + Alt + Control +# --------------------------------- +# The meta key may also be used as a modifier in this scheme, adding another +# bit to the parameter. +xterm+pcfkeys|xterm fragment for PC-style fkeys, + use=xterm+app, use=xterm+pcf2, use=xterm+pcc2, + use=xterm+pce2, + +# The xterm ctrlFKeys resource defaults to 10, so without the "pc-style" +# feature, e.g., setting the modifyCursorKeys and modifyFunctionKeys resources +# to -1 to disable them, one gets 42 function-keys on a 12-function-key +# keyboard, e.g., +# kf1 = \E[11~ +# kf11 shift f1 = \E[23~ +# kf21 control f1 = \E[42~ +# kf31 shift control f1 = \E[52~ +xterm+nopcfkeys|fragment without PC-style fkeys, + kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, + kf20=\E[34~, kf21=\E[42~, kf22=\E[43~, kf23=\E[44~, + kf24=\E[45~, kf25=\E[46~, kf26=\E[47~, kf27=\E[48~, + kf28=\E[49~, kf29=\E[50~, kf3=\E[13~, kf30=\E[51~, + kf31=\E[52~, kf32=\E[53~, kf33=\E[54~, kf34=\E[55~, + kf35=\E[56~, kf36=\E[57~, kf37=\E[58~, kf38=\E[59~, + kf39=\E[60~, kf4=\E[14~, kf40=\E[61~, kf41=\E[62~, + kf42=\E[63~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, + +vt100+noapp|fragment with cursor keys in normal mode, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + use=vt100+noapp+pc, + +xterm+noapp|fragment with cursor keys in normal mode, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kend=\E[F, + khome=\E[H, + +xterm+app|fragment with cursor keys in application mode, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + use=xterm+app+pc, + +vt100+noapp+pc|fragment for noapp pc-style home/end, + kend=\E[F, khome=\E[H, + +xterm+app+pc|fragment for app pc-style home/end, + kend=\EOF, khome=\EOH, +# +# The "PC-style" modifier scheme was introduced in xterm patch #94 (1999/3/27) +# and revised in xterm patch #167 (2002/8/24). Some other terminal emulators +# copied the earlier scheme, as noted in the "use=" clauses in this file. +# +# The original assignments from patch #94 for cursor-keys had some technical +# issues: +# +# A parameter for a function-key to represent a modifier is just more +# bits. But for a cursor-key it may change the behavior of the +# application. For instance, emacs decodes the first parameter of a +# cursor-key as a repeat count. +# +# A parameterized string should (really) not begin with SS3 (\EO). +# Rather, CSI (\E[) should be used. +# +# For these reasons, the original assignments were deprecated. For +# compatibility reasons, they are still available as a setting of xterm's +# modifyCursorKeys resource. These fragments list the modified cursor-keys +# that might apply to xterm+pcfkeys with different values of that resource. +# +# These entries will have warnings when checking with tic because the kri/kind +# capabilities duplicate the kUP/kDN extensions. This is intentional, though +# not part of the original plan. The changes for xterm patch #206 (2005/11/3) +# show that kri/kind were seen much later as part of a set including kLFT/kRIT: +# +# * modify xterm-new terminfo entry to use capabilities for shifted +# scroll forward/reverse as shifted cursor up/down. +# +# In the 1980s when terminfo was defined, the developers made more of +# a distinction between shifted up/down versus shifted left/right since most +# terminals can index (scroll up/down), while few can scroll left/right. +xterm+pcc3|fragment with modifyCursorKeys:3, + kLFT=\E[>1;2D, kRIT=\E[>1;2C, kind=\E[>1;2B, + kri=\E[>1;2A, kDN=\E[>1;2B, kDN3=\E[>1;3B, kDN4=\E[>1;4B, + kDN5=\E[>1;5B, kDN6=\E[>1;6B, kDN7=\E[>1;7B, + kLFT3=\E[>1;3D, kLFT4=\E[>1;4D, kLFT5=\E[>1;5D, + kLFT6=\E[>1;6D, kLFT7=\E[>1;7D, kRIT3=\E[>1;3C, + kRIT4=\E[>1;4C, kRIT5=\E[>1;5C, kRIT6=\E[>1;6C, + kRIT7=\E[>1;7C, kUP=\E[>1;2A, kUP3=\E[>1;3A, + kUP4=\E[>1;4A, kUP5=\E[>1;5A, kUP6=\E[>1;6A, + kUP7=\E[>1;7A, + +xterm+pcc2|fragment with modifyCursorKeys:2, + kLFT=\E[1;2D, kRIT=\E[1;2C, kind=\E[1;2B, kri=\E[1;2A, + kDN=\E[1;2B, kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B, + kDN6=\E[1;6B, kDN7=\E[1;7B, kLFT3=\E[1;3D, kLFT4=\E[1;4D, + kLFT5=\E[1;5D, kLFT6=\E[1;6D, kLFT7=\E[1;7D, + kRIT3=\E[1;3C, kRIT4=\E[1;4C, kRIT5=\E[1;5C, + kRIT6=\E[1;6C, kRIT7=\E[1;7C, kUP=\E[1;2A, kUP3=\E[1;3A, + kUP4=\E[1;4A, kUP5=\E[1;5A, kUP6=\E[1;6A, kUP7=\E[1;7A, + +xterm+pcc1|fragment with modifyCursorKeys:1, + kLFT=\E[2D, kRIT=\E[2C, kind=\E[2B, kri=\E[2A, kDN=\E[2B, + kDN3=\E[3B, kDN4=\E[4B, kDN5=\E[5B, kDN6=\E[6B, kDN7=\E[7B, + kLFT3=\E[3D, kLFT4=\E[4D, kLFT5=\E[5D, kLFT6=\E[6D, + kLFT7=\E[7D, kRIT3=\E[3C, kRIT4=\E[4C, kRIT5=\E[5C, + kRIT6=\E[6C, kRIT7=\E[7C, kUP=\E[2A, kUP3=\E[3A, + kUP4=\E[4A, kUP5=\E[5A, kUP6=\E[6A, kUP7=\E[7A, + +xterm+pcc0|fragment with modifyCursorKeys:0, + kLFT=\EO2D, kRIT=\EO2C, kind=\EO2B, kri=\EO2A, kDN=\EO2B, + kDN3=\EO3B, kDN4=\EO4B, kDN5=\EO5B, kDN6=\EO6B, kDN7=\EO7B, + kLFT3=\EO3D, kLFT4=\EO4D, kLFT5=\EO5D, kLFT6=\EO6D, + kLFT7=\EO7D, kRIT3=\EO3C, kRIT4=\EO4C, kRIT5=\EO5C, + kRIT6=\EO6C, kRIT7=\EO7C, kUP=\EO2A, kUP3=\EO3A, + kUP4=\EO4A, kUP5=\EO5A, kUP6=\EO6A, kUP7=\EO7A, + +# +# Here are corresponding fragments from xterm patch #216: +# +xterm+pcf0|fragment with modifyFunctionKeys:0, + kf1=\EOP, kf13=\EO2P, kf14=\EO2Q, kf15=\EO2R, kf16=\EO2S, + kf17=\E[15;2~, kf18=\E[17;2~, kf19=\E[18;2~, kf2=\EOQ, + kf20=\E[19;2~, kf21=\E[20;2~, kf22=\E[21;2~, + kf23=\E[23;2~, kf24=\E[24;2~, kf25=\EO5P, kf26=\EO5Q, + kf27=\EO5R, kf28=\EO5S, kf29=\E[15;5~, kf3=\EOR, + kf30=\E[17;5~, kf31=\E[18;5~, kf32=\E[19;5~, + kf33=\E[20;5~, kf34=\E[21;5~, kf35=\E[23;5~, + kf36=\E[24;5~, kf37=\EO6P, kf38=\EO6Q, kf39=\EO6R, + kf4=\EOS, kf40=\EO6S, kf41=\E[15;6~, kf42=\E[17;6~, + kf43=\E[18;6~, kf44=\E[19;6~, kf45=\E[20;6~, + kf46=\E[21;6~, kf47=\E[23;6~, kf48=\E[24;6~, kf49=\EO3P, + kf50=\EO3Q, kf51=\EO3R, kf52=\EO3S, kf53=\E[15;3~, + kf54=\E[17;3~, kf55=\E[18;3~, kf56=\E[19;3~, + kf57=\E[20;3~, kf58=\E[21;3~, kf59=\E[23;3~, + kf60=\E[24;3~, kf61=\EO4P, kf62=\EO4Q, kf63=\EO4R, + use=xterm+nopcfkeys, +# +xterm+pcf2|fragment with modifyFunctionKeys:2, + kf1=\EOP, kf13=\E[1;2P, kf14=\E[1;2Q, kf15=\E[1;2R, + kf16=\E[1;2S, kf17=\E[15;2~, kf18=\E[17;2~, + kf19=\E[18;2~, kf2=\EOQ, kf20=\E[19;2~, kf21=\E[20;2~, + kf22=\E[21;2~, kf23=\E[23;2~, kf24=\E[24;2~, + kf25=\E[1;5P, kf26=\E[1;5Q, kf27=\E[1;5R, kf28=\E[1;5S, + kf29=\E[15;5~, kf3=\EOR, kf30=\E[17;5~, kf31=\E[18;5~, + kf32=\E[19;5~, kf33=\E[20;5~, kf34=\E[21;5~, + kf35=\E[23;5~, kf36=\E[24;5~, kf37=\E[1;6P, kf38=\E[1;6Q, + kf39=\E[1;6R, kf4=\EOS, kf40=\E[1;6S, kf41=\E[15;6~, + kf42=\E[17;6~, kf43=\E[18;6~, kf44=\E[19;6~, + kf45=\E[20;6~, kf46=\E[21;6~, kf47=\E[23;6~, + kf48=\E[24;6~, kf49=\E[1;3P, kf50=\E[1;3Q, kf51=\E[1;3R, + kf52=\E[1;3S, kf53=\E[15;3~, kf54=\E[17;3~, + kf55=\E[18;3~, kf56=\E[19;3~, kf57=\E[20;3~, + kf58=\E[21;3~, kf59=\E[23;3~, kf60=\E[24;3~, + kf61=\E[1;4P, kf62=\E[1;4Q, kf63=\E[1;4R, + use=xterm+nopcfkeys, +# +# Chunks from xterm #230: +xterm+pce2|fragment with modifyCursorKeys:2 editing-keys, + kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, + kNXT=\E[6;2~, kPRV=\E[5;2~, kDC3=\E[3;3~, kDC4=\E[3;4~, + kDC5=\E[3;5~, kDC6=\E[3;6~, kDC7=\E[3;7~, kEND3=\E[1;3F, + kEND4=\E[1;4F, kEND5=\E[1;5F, kEND6=\E[1;6F, + kEND7=\E[1;7F, kHOM3=\E[1;3H, kHOM4=\E[1;4H, + kHOM5=\E[1;5H, kHOM6=\E[1;6H, kHOM7=\E[1;7H, + kIC3=\E[2;3~, kIC4=\E[2;4~, kIC5=\E[2;5~, kIC6=\E[2;6~, + kIC7=\E[2;7~, kNXT3=\E[6;3~, kNXT4=\E[6;4~, + kNXT5=\E[6;5~, kNXT6=\E[6;6~, kNXT7=\E[6;7~, + kPRV3=\E[5;3~, kPRV4=\E[5;4~, kPRV5=\E[5;5~, + kPRV6=\E[5;6~, kPRV7=\E[5;7~, use=xterm+edit, + +xterm+edit|fragment for 6-key editing-keypad, + use=xterm+pc+edit, use=vt220+pcedit, + +xterm+decedit|fragment for vt220 6-key editing-keypad, + kdch1=\E[3~, kich1=\E[2~, knp=\E[6~, kpp=\E[5~, + use=xterm+vt+edit, + +xterm+pc+edit|fragment for pc-style editing keypad, + kend=\E[4~, khome=\E[1~, + +xterm+vt+edit|fragment for VT220-style editing keypad, + kfnd=\E[1~, kslt=\E[4~, + +# These variations for alternate-screen and title-stacking were introduced by +# xterm patch #331: +xterm+noalt|xterm without altscreen, + rmcup@, smcup@, + +xterm+alt47|X11R4 alternate-screen, + rmcup=\E[2J\E[?47l\E8, smcup=\E7\E[?47h, + +xterm+alt1049|xterm 90 feature, + rmcup=\E[?1049l, smcup=\E[?1049h, + +xterm+titlestack|xterm 251 feature, + rmcup=\E[23;0;0t, smcup=\E[22;0;0t, + +xterm+alt+title|xterm 90 and 251 features combined, + rmcup=\E[?1049l\E[23;0;0t, smcup=\E[?1049h\E[22;0;0t, + +# https://invisible-island.net/xterm/xterm.faq.html#xterm_keypad +# +# Xterm's emulation of the VT100 numeric keypad on a PC-keyboard runs into the +# problem that the keypad layout is different, and that the natural choice for +# PF1 is NumLock (which happens to be reserved for other use). To work around +# that, PF1-PF4 are emulated via F1-F4, which leaves the "/", "*" and "+" not +# directly related to VT100. +# +# With the VT220 keypad block that uses the 1-9 keys as suggested in +# terminfo(5), the other keys can be handled with user-defined capabilities: +# +# _______________________________________ +# | NumLock | / | * | - | +# | | $Oo | $Oj | $OS | +# |_________|__kpDIV__|__kpMUL__|__kpSUB__| +# | 7 8 9 | + | +# | $Ow | $Ox | $Oy | $Ok | +# |_ka1__K1_|_________|_ka3__K3_| kpADD | +# | 4 | 5 | 6 | | +# | $Ot | $Ou | $Ov | | +# |_________|_kb2__K2_|_________|_________| +# | 1 | 2 | 3 | | +# | $Oq | $Or | $Os | | +# |_kc1__K4_|_________|_kc3__K5_| enter | +# | 0 | . | $OM | +# | $Op | $On | | +# |_______kpZRO_______|__kpDOT__|_kent_@8_| +# +# ka2, kb1, kb3 and kc2 are extensions, as are the mixed-case names. +# There are no termcap equivalents for these extensions. +# +# kpCMA (comma) is used here for the VT100 keypad, which xterm emulates with +# shifted-keypad-plus, though normally that invokes a font-size change. +# +# Old versions of xterm, e.g., xterm-xfree86, documented \EOE as kb2, which +# does not fit into this layout. The extension kp5 fits, but is not visible +# to termcap applications. As an alternative, kbeg (which does have a termcap +# equivalent) is provided. +# +xterm+keypad|xterm emulating VT100/VT220 numeric keypad, + kbeg=\EOE, kp5=\EOE, kpADD=\EOk, kpCMA=\EOl, kpDIV=\EOo, + kpDOT=\EOn, kpMUL=\EOj, kpSUB=\EOm, kpZRO=\EOp, + use=vt220+keypad, +# +# Those chunks use the new-style (the xterm oldFunctionKeys resource is false). +# Alternatively, the same scheme with old-style function keys as in xterm-r6 +# is shown here (because that is used in mrxvt and mlterm): +xterm+r6f2|xterm with oldFunctionKeys and modifyFunctionKeys:2, + kf1=\E[11~, kf13=\E[11;2~, kf14=\E[12;2~, kf15=\E[13;2~, + kf16=\E[14;2~, kf2=\E[12~, kf25=\E[11;5~, kf26=\E[12;5~, + kf27=\E[13;5~, kf28=\E[14;5~, kf3=\E[13~, kf37=\E[11;6~, + kf38=\E[12;6~, kf39=\E[13;6~, kf4=\E[14~, kf40=\E[14;6~, + kf49=\E[11;3~, kf50=\E[12;3~, kf51=\E[13;3~, + kf52=\E[14;3~, kf61=\E[11;4~, kf62=\E[12;4~, + kf63=\E[13;4~, use=xterm+pcf2, +# +xterm+acs|ISO-2022 alternate character-switching for xterm, + acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + enacs@, rmacs=\E(B, smacs=\E(0, + +# This chunk is used for building the VT220/Sun/PC keyboard variants. +xterm-basic|modern xterm terminal emulator - common, + OTbs, am, bce, mir, msgr, xenl, AX, XT, + colors#8, cols#80, lines#24, pairs#64, + bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[2m, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ich=\E[%p1%d@, ind=\n, is2=\E[!p\E[?3;4l\E[4l\E>, + kmous=\E[M, meml=\El, memu=\Em, op=\E[39;49m, ri=\EM, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, + rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%; + %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, smam=\E[?7h, smir=\E[4h, smkx=\E[?1h\E=, + vpa=\E[%i%p1%dd, E3=\E[3J, use=ansi+csr, use=ansi+enq, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+pp, use=ansi+sgrbold, use=xterm+kbs, + use=xterm+alt+title, use=att610+cvis, use=xterm+acs, + use=xterm+meta, + +xterm+meta|meta mode for xterm, + km, + rmm=\E[?1034l, smm=\E[?1034h, + +# From: David J. MacKenzie , 14 Nov 1997 +# In retrospect, something like xterm-r6 was intended here -TD +xterm-xi|xterm on XI Graphics Accelerated X under BSD/OS 3.1, + rmso=\E[m, rmul=\E[m, use=xterm-xf86-v33, + +#### XTERM Colors + +# 16-colors is one of the variants of XFree86 3.3 xterm, updated for 4.0 +# (T.Dickey) +# +# If configured to support 88- or 256-colors (which is fairly common in 2009), +# xterm also recognizes the control sequences for initc -TD +xterm-16color|xterm with 16 colors like aixterm, + ccc, + initc=\E]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%* + %{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, + use=xterm+osc104, use=ibm+16color, use=xterm-new, + +# 256-colors is a compile-time feature of XFree86 xterm beginning with +# xterm patch #111 (1999/7/10) -TD +xterm+256color|original xterm 256-color feature, + ccc, + colors#0x100, pairs#0x10000, + initc=\E]4;%p1%d;rgb:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%* + %{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, + oc=\E]104\007, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48; + 5;%p1%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5 + ;%p1%d%;m, + setb@, setf@, + +# The semicolon separator used in xterm+256color does not follow the ECMA-48 +# standard. Since patch #282 (in 2012), xterm has supported both the legacy +# subparameter separator (semicolon) and the standard (colon). +# +# The xterm FAQ gives some of the history: +# https://invisible-island.net/xterm/xterm.faq.html#color_by_number +xterm+256color2|xterm 256-color feature, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48: + 5:%p1%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38:5 + :%p1%d%;m, + use=xterm+256color, + +# xterm OSC 104 resets the color palette. Using it as part of xterm+256color +# has the drawback that some of the xterm-alikes which use that building block +# require a different approach to rs1 -TD +xterm+osc104|reset color palette, + oc=\E]104\007, rs1=\Ec\E]104\007, + +# palette is hardcoded... +xterm+256setaf|xterm 256-color (set-only), + ccc@, + colors#0x100, pairs#0x10000, + initc@, op=\E[39;49m, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48; + 5;%p1%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5 + ;%p1%d%;m, + setb@, setf@, + +# 88-colors is a compile-time feature of XFree86 xterm beginning with +# xterm patch #115 (1999/9/18) -TD +# +# Note that the escape sequences used are the same as for 256-colors - xterm +# has a different table of default color resource values. If built for +# 256-colors, it can still handle an 88-color palette by using the initc +# capability. +# +# At this time (2007/7/14), except for rxvt 2.7.x, none of the other terminals +# which support the xterm+256color feature support the associated initc +# capability. So it is cancelled in the entries which use this and/or the +# xterm+256color block. +# +# The default color palette for the 256- and 88-colors are different. A +# given executable will have one palette (perhaps compiled-in). If the program +# supports xterm's control sequence, it can be programmed using initc. +xterm+88color|original xterm 88-color feature, + colors#88, pairs#7744, use=xterm+256color, + +xterm+88color2|xterm 88-color feature, + colors#88, pairs#7744, use=xterm+256color2, + +# These variants of XFree86 3.9.16 xterm are built as a configure option. +xterm-256color|xterm with 256 colors, + use=xterm+osc104, use=xterm+256color, use=xterm-new, +xterm-88color|xterm with 88 colors, + use=xterm+osc104, use=xterm+88color, + use=xterm-256color, + +# Emacs 26.1 and later support direct color mode in terminals, using a +# combination of user-defined capabilities and ncurses-dependent function +# calls. We will not include that here. +# +# Here is a first revision, which (disregarding the reuse of colors 1-7 which +# is of interest only to the numerically illiterate), is compatible with other +# terminal descriptions written for curses. It relies upon the extended range +# for numeric capabilities provided in ncurses 6.1: +xterm+direct2|xterm with direct-color indexing (old building-block), + RGB, + colors#0x1000000, pairs#0x10000, CO#8, + initc@, op=\E[39;49m, + setab=\E[%?%p1%{8}%<%t4%p1%d%e48:2:%p1%{65536}%/%d:%p1%{256} + %/%{255}%&%d:%p1%{255}%&%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e38:2:%p1%{65536}%/%d:%p1%{256} + %/%{255}%&%d:%p1%{255}%&%d%;m, + setb@, setf@, +xterm-direct2|xterm with direct-color indexing (old), + use=xterm+direct2, use=xterm+titlestack, use=xterm, + +# That in turn had a problem: in the original patch submitted for KDE konsole +# in 2006, the submitter and the developer alike overlooked a "color space +# identifier" parameter. This version provides for that parameter: +xterm+direct|xterm with direct-color indexing (building-block), + RGB, + colors#0x1000000, pairs#0x10000, CO#8, + initc@, op=\E[39;49m, + setab=\E[%?%p1%{8}%<%t4%p1%d%e48:2::%p1%{65536}%/%d:%p1 + %{256}%/%{255}%&%d:%p1%{255}%&%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e38:2::%p1%{65536}%/%d:%p1 + %{256}%/%{255}%&%d:%p1%{255}%&%d%;m, + setb@, setf@, +xterm-direct|xterm with direct-color indexing, + use=xterm+direct, use=xterm, + +# Here are corresponding flavors for terminals which could use the feature: +iterm2-direct|iTerm2 with direct-color indexing, + use=xterm+direct, use=iterm2, +mlterm-direct|mlterm with direct-color indexing, + use=xterm+direct, use=mlterm, + +# Meanwhile, in KDE #107487, the patch submitter and the developer both saw +# that xterm's original implementation should have used colons for the +# subparameter separators, but chose not to correct this in konsole. As of +# late 2017, konsole still accepts only the nonstandard semicolon delimiters. +xterm+indirect|xterm with direct-color indexing (old legacy building-block), + RGB, + colors#0x1000000, pairs#0x10000, + initc@, op=\E[39;49m, + setab=\E[%?%p1%{8}%<%t4%p1%d%e48;2;%p1%{65536}%/%d;%p1%{256} + %/%{255}%&%d;%p1%{255}%&%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e38;2;%p1%{65536}%/%d;%p1%{256} + %/%{255}%&%d;%p1%{255}%&%d%;m, + setb@, setf@, +konsole-direct|konsole with direct-color indexing, + use=xterm+indirect, use=konsole, +st-direct|simpleterm with direct-color indexing, + use=xterm+indirect, use=st, +vte-direct|VTE with direct-color indexing, + use=xterm+indirect, use=vte, +# reportedly in Apple's Mohave (fall 2018), but untested -TD +nsterm-direct|nsterm with direct-color indexing, + use=xterm+indirect, use=nsterm, + +# As for others (commenting at the time of release for ncurses 6.1): +# + Apple's Terminal.app does not recognize either form of the direct-color +# sequences. +# + Cygwin's mintty recognizes xterm's original implementation, does okay with +# the colors. Like vte, it is a subset of xterm, although different +# omissions/reservations of modified-keys are seen in testing. +# + PuTTY 0.70 seems to recognize xterm's original implementation but does +# nothing useful with the colors. +# + Teraterm 4.97, like PuTTY (no good). +# + terminology 0.91 recognizes xterm's original implementation, but does +# nothing useful with it. + +# Reviewing after ncurses 6.2: +# + Apple's Terminal.app is unchanged, has no support for direct color: +# Catalina 10.15.5 Terminal.app 2.10 (433) +# Mohave 10.14.6 - Terminal.app 2.9.5 (421.2) +# + Cygwin's mintty 3.1.7 works with colon/semicolon +# + PuTTY 0.73 works with semicolon +# + Teraterm 4.105 works with semicolon +# + terminology 1.7.0 works with colon/semicolon. + +# Other variants are possible, e.g., by using more of xterm's indexed color +# palette, though the intrusion of indexed colors on the direct-color space +# would be more noticeable. + +xterm+direct16|xterm with direct-color indexing (16-color building-block), + CO#16, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%?%p1%{16}%<%t%p1%{92}%+%d%e48 + :2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%& + %d%;%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%?%p1%{16}%<%t%p1%'R'%+%d%e38: + 2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1%{255}%&%d + %;%;m, + setb@, setf@, use=xterm+direct, + +xterm-direct16|xterm with direct-colors and 16 indexed colors, + use=xterm+direct16, use=xterm, + +xterm+direct256|xterm with direct-color indexing (256-color building-block), + CO#0x100, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e%? + %p1%{256}%<%t48;5;%p1%d%e48:2::%p1%{65536}%/%d:%p1 + %{256}%/%{255}%&%d:%p1%{255}%&%d%;%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e%? + %p1%{256}%<%t38;5;%p1%d%e38:2::%p1%{65536}%/%d:%p1 + %{256}%/%{255}%&%d:%p1%{255}%&%d%;%;m, + setb@, setf@, use=xterm+direct, + +xterm-direct256|xterm with direct-colors and 256 indexed colors, + use=xterm+direct256, use=xterm, + +#### XTERM Features + +# This chunk is based on suggestions by Ailin Nemui and Nicholas Marriott, who +# asked for some of xterm's advanced features to be added to its terminfo +# entry. It defines extended capabilities not found in standard terminfo or +# termcap. These are useful in tmux, for instance, hence the name. +# +# One caveat in adding extended capabilities in ncurses is that if the names +# are longer than two characters, then they will not be visible through the +# termcap interface. +# +# Ms modifies the selection/clipboard. Its parameters are +# p1 = the storage unit (clipboard, selection or cut buffer) +# p2 = the base64-encoded clipboard content. +# +# Ss is used to set the cursor style as described by the DECSCUSR +# function to a block or underline. +# Se resets the cursor style to the terminal power-on default. +# +# Cs and Cr set and reset the cursor colour. +xterm+tmux|advanced xterm features used in tmux (cursor style 2), + Cr=\E]112\007, Cs=\E]12;%p1%s\007, + Ms=\E]52;%p1%s;%p2%s\007, Se=\E[2 q, Ss=\E[%p1%d q, +xterm+tmux2|advanced xterm features used in tmux, + Cr=\E]112\E\\, Cs=\E]12;%p1%s\E\\, + Ms=\E]52;%p1%s;%p2%s\E\\, Se=\E[ q, Ss=\E[%p1%d q, + +# This is another variant, for XFree86 4.0 xterm (T.Dickey) +# This is an 8-bit version of xterm, which emulates DEC VT220 with ANSI color. +# To use it, your decTerminalID resource must be set to 200 or above. +# +# HTS \E H \210 +# RI \E M \215 +# SS3 \E O \217 +# CSI \E [ \233 +# +xterm-8bit|xterm terminal emulator 8-bit controls (X Window System), + OTbs, am, bce, km, mc5i, mir, msgr, npc, xenl, AX, + colors#8, cols#80, it#8, lines#24, pairs#64, + bel=^G, blink=\2335m, bold=\2331m, cbt=\233Z, + civis=\233?25l, clear=\233H\2332J, + cnorm=\233?25l\233?25h, cr=\r, csr=\233%i%p1%d;%p2%dr, + cub=\233%p1%dD, cub1=^H, cud=\233%p1%dB, cud1=\n, + cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH, + cuu=\233%p1%dA, cuu1=\233A, cvvis=\233?12;25h, + dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M, + ech=\233%p1%dX, ed=\233J, el=\233K, el1=\2331K, + flash=\233?5h$<100/>\233?5l, home=\233H, + hpa=\233%i%p1%dG, ht=^I, hts=\210, ich=\233%p1%d@, + il=\233%p1%dL, il1=\233L, ind=\n, invis=\2338m, + is2=\E[62"p\E\sG\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r + \E8, + ka1=\217w, ka3=\217u, kb2=\217y, kbeg=\217E, kc1=\217q, + kc3=\217s, kcbt=\233Z, kcub1=\217D, kcud1=\217B, + kcuf1=\217C, kcuu1=\217A, kdch1=\2333~, kend=\2334~, + kent=\217M, kf1=\23311~, kf10=\23321~, kf11=\23323~, + kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~, + kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~, + kf2=\23312~, kf20=\23334~, kf3=\23313~, kf4=\23314~, + kf5=\23315~, kf6=\23317~, kf7=\23318~, kf8=\23319~, + kf9=\23320~, khome=\2331~, kich1=\2332~, kmous=\233M, + knp=\2336~, kpp=\2335~, mc0=\233i, mc4=\2334i, mc5=\2335i, + meml=\El, memu=\Em, op=\23339;49m, rc=\E8, rev=\2337m, + ri=\215, rmam=\233?7l, rmcup=\233?1049l, rmir=\2334l, + rmkx=\233?1l\E>, rmso=\23327m, rmul=\23324m, rs1=\Ec, + rs2=\E[62"p\E\sG\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r + \E8, + sc=\E7, setab=\2334%p1%dm, setaf=\2333%p1%dm, + setb=\2334%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1 + %{6}%=%t3%e%p1%d%;m, + setf=\2333%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1 + %{6}%=%t3%e%p1%d%;m, + sgr=\2330%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p7%t;8%;m%?%p9%t\E(0%e\E(B%;, + sgr0=\2330m\E(B, smam=\233?7h, smcup=\233?1049h, + smir=\2334h, smkx=\233?1h\E=, smso=\2337m, smul=\2334m, + tbc=\2333g, u6=\233[%i%d;%dR, u8=\233[?%[;0123456789]c, + vpa=\233%i%p1%dd, use=ansi+enq, use=xterm+acs, + use=xterm+kbs, + +# Note: normally xterm supports modified function-keys as described in +# XTerm - "Other" modified keys +# https://invisible-island.net/xterm/modified-keys.html +# +# However, xterm-hp, xterm-sco and xterm-sun assume no modifiers. Here is +# a simple script which demonstrates these descriptions: +# #!/bin/sh +# export TERM=xterm-$1 +# xterm \ +# -kt $1 \ +# -fs 16 -fa mono \ +# -title $TERM \ +# -tn $TERM \ +# -xrm '*modifyCursorKeys:-1' \ +# -xrm '*modifyFunctionKeys:-1' \ +# -e tack +# e.g., "foo sun" if the script is named "foo" -TD +xterm-hp|xterm with hpterm function keys, + kclr=\EJ, kdch1=\EP, kend=\EF, khome=\Eh, kich1=\EQ, knp=\ES, + kpp=\ET, use=hp+pfk-cr, use=vt52+arrows, + use=xterm+nofkeys, use=xterm+nopcfkeys, + +xterm-sco|xterm with SCO function keys, + kbeg=\E[E, kbs=^?, kdch1=^?, kend=\E[F, kf1=\E[M, kf10=\E[V, + kf11=\E[W, kf12=\E[X, kf13=\E[Y, kf14=\E[Z, kf15=\E[a, + kf16=\E[b, kf17=\E[c, kf18=\E[d, kf19=\E[e, kf2=\E[N, + kf20=\E[f, kf21=\E[g, kf22=\E[h, kf23=\E[i, kf24=\E[j, + kf25=\E[k, kf26=\E[l, kf27=\E[m, kf28=\E[n, kf29=\E[o, + kf3=\E[O, kf30=\E[p, kf31=\E[q, kf32=\E[r, kf33=\E[s, + kf34=\E[t, kf35=\E[u, kf36=\E[v, kf37=\E[w, kf38=\E[x, + kf39=\E[y, kf4=\E[P, kf40=\E[z, kf41=\E[@, kf42=\E[[, + kf43=\E[\\, kf44=\E[], kf45=\E[\^, kf46=\E[_, kf47=\E[`, + kf48=\E[{, kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, + kich1=\E[L, kmous=\E[>M, knp=\E[G, kpp=\E[I, + use=ansi+arrows, use=xterm+nofkeys, + +# The xterm-new description has all of the features, but is not completely +# compatible with VT220. If you are using a Sun or PC keyboard, set the +# sunKeyboard resource to true: +# + maps the editing keypad +# + interprets control-function-key as a second array of keys, so a +# 12-fkey keyboard can support VT220's 20-fkeys. +# + maps numeric keypad "+" to ",". +# + uses DEC-style control sequences for the application keypad. +# +xterm-vt220|xterm emulating VT220, + npc, + kcbt=\E[Z, kend=\E[4~, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, + kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, + kf20=\E[34~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kmous=\E[M, nel=\EE, + use=xterm+app, use=xterm+edit, use=vt220+keypad, + use=ecma+italics, use=ecma+index, use=ansi+rep, + use=ecma+strikeout, use=xterm+focus, use=xterm+sm+1006, + use=xterm+tmux, use=xterm+keypad, use=xterm-basic, + +xterm-vt52|xterm emulating DEC VT52, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + clear=\EH\EJ, rmacs=\EG, smacs=\EF, use=xterm+kbs, + use=vt52+keypad, use=vt52-basic, + +xterm-noapp|xterm with cursor keys in normal mode, + rmcup@, rmkx=\E>, smcup@, smkx=\E=, use=xterm+noapp, + use=xterm, + +xterm-24|vs100|xterms|xterm terminal emulator 24-line (X Window System), + lines#24, use=xterm-old, + +# This is xterm for ncurses. +xterm|xterm terminal emulator (X Window System), + use=xterm-new, + +# This entry assumes that xterm's handling of VT100 SI/SO is disabled by +# setting the vt100Graphics resource to false. +xterm-utf8|xterm with no VT100 line-drawing in UTF-8 mode, + U8#1, use=xterm, + +# These building-blocks allow access to the X titlebar and icon name as a +# status line. There are a few problems in using them in entries: +# +# a) tsl should have a parameter to denote the column on which to transfer to +# the status line. +# b) the "0" code for xterm updates both icon-title and window title. Some +# window managers such as twm (and possibly window managers descended from +# it such as tvtwm, ctwm, and vtwm) track windows by icon-name. Thus, you +# don't want to mess with icon-name when using those window managers. +# c) fsl ends the escape sequence begun by tsl. Printable characters between +# those (probably) will appear in the window title. Nonprintable characters +# may cause the escape sequence to end with an error. +# d) the BEL (^G or \007) used in the original title-as-statusline came from +# David J. MacKenzie's "pseudo-color" entry in 20 Apr 1995. At that time +# xterm used BEL as the string-terminator rather than ST (\E\\). Either +# BEL or ST has worked since xterm patch #28 in 1996, but most uses of +# this feature have been embedded in shell scripts. +# +# But that issue regarding the parameter for tsl means that applications may +# not rely on it. The SVr4 documentation says tsl will "move to status line, +# column #1". At the point in time when ESR added DJM's "pseudo-color" entry +# with the split-up escape sequence for tsl/fsl, there were 65 entries using +# tsl: +# 32 used a parameter, matching the documentation (including x10term). +# 21 used a parameterless control, exiting from the status line on ^M. +# 6 used parameterless controls for tsl and fsl +# 6 used a split-up escape sequence, e.g., the same approach. +# +# The extension "TS" is preferable, because it does not accept a parameter. +# However, if you are using a non-extended terminfo, "TS" is not visible. +xterm+sl|access X title line and icon name, + hs, + dsl=\E]0;\007, fsl=^G, tsl=\E]0;, TS=\E]0;, +xterm+sl-twm|access X title line (pacify twm-descended window managers), + hs, + dsl=\E]2;\007, fsl=^G, tsl=\E]2;, TS=\E]2;, +xterm+sl-alt|alternate access X title line, + hs, + dsl=\E]2;\E\\, fsl=\E\\, tsl=\E]2;, TS=\E]2;, + +# In contrast, this block can be used for a DEC VT320 and up. There are two +# controls used. +# +# DECSASD (select active status display) +# \E[0$} Main display +# \E[1$} Status line +# +# DECSSDT (select status line type) +# \E[0$~ No status line +# \E[1$~ Indicator status line +# \E[2$~ Host-writable status line +# +# The building block assumes that the terminal always shows something at the +# status line (either the indicator, or status line). That is because if no +# status line is used, then the terminal makes that line part of the user +# window, changing its size without notice. +# +# Because there is no "esl" (enable status line) capability, the "tsl" +# capability ensures that the status line is host-writable. A DEC terminal +# will clear the status line when changing from indicator to host-writable +# mode. +# +# Once on the status line, the row part of cursor addressing is ignored. Since +# tsl expects a parameter (to specify the column), the shortest addressing that +# can be used for this purpose is HPA, e.g., \E[5d to go to column 5. +# +dec+sl|DEC VTxx status line, + eslok, hs, + dsl=\E[0$~, fsl=\E[0$}, tsl=\E[2$~\E[1$}\E[%i%p1%d`, + +# +# The following xterm variants don't depend on your base version +# +# xterm with bold instead of underline +xterm-bold|xterm terminal emulator (X11R6 Window System) standout w/bold, + sgr=%?%p9%t\016%e\017%;B\E[0%?%p6%t;1%;%?%p2%t;1%;%?%p1%p3%| + %t;7%;m, + smso=\E[7m, smul=\E[1m, use=xterm-old, + +# See the note on ICH/ICH1 VERSUS RMIR/SMIR near the end of file +xterm-nic|xterm with ich/ich1 suppressed for non-curses programs, + ich@, ich1@, use=xterm, +# From: Mark Sheppard , 4 May 1996 +xterm1|xterm terminal emulator ignoring the alternate screen buffer, + rmcup@, smcup@, use=xterm, + +# https://invisible-island.net/xterm/xterm-paste64.html +# +# Bracketed paste was introduced by xterm patch #203 in May 2005, as part of a +# larger feature for manipulating the clipboard selection. Few terminals aside +# from xterm fully implement the clipboard feature, but several copy this +# detail. The names for the extended capabilities here were introduced by vim +# in January 2017, but used internally. In 2023, vim patch 9.0.1117 is needed +# to work with this change. +bracketed+paste|xterm bracketed paste, + BD=\E[?2004l, BE=\E[?2004h, PE=\E[201~, PS=\E[200~, + +# https://invisible-island.net/xterm/xterm.log.html#xterm_354 +# +# The response is a DSR sequence identifying the version: DCS > | text ST +# For example: +# ^[P>|XTerm(354)^[\ +report+version|Report xterm name and version (XTVERSION), + XR=\E[>0q, xr=\EP>\\|[ -~]+\E\\\\, use=report+da2, + +# Vim uses RV to denote the secondary device attributes. Xterm documents the +# - first parameter as the terminal type (extending it to VT100), +# - the second as the patch number for xterm, and +# - the third parameter as zero. +# Other terminals may provide useful responses, though few are documented. +report+da2|report secondary device attributes (DA2), + RV=\E[>c, rv=\E\\[[0-9]+;[0-9]+;[0-9]+c, + +#### XTERM Mouse +# The xterm mouse protocol is used by other terminal emulators. +# In this section, two extended capabilities are used to illustrate the mouse +# protocol: XM and xm. The "XM" capability is recognized by ncurses to allow +# enabling/disabling other mouse protocols. The "xm" capability describes the +# mouse response; currently there is no interpreter which would use this +# information to make the mouse support completely data-driven. + +# Here is the "original" xterm mouse protocol. +# +# First seen in X10.3, February 1986, this likely dates from 1985 based on the +# copyright dates in the sources. A comment in charproc.c notes "MIT bogus +# sequence", referring to the fact that it does not correspond to a "real" +# terminal. The mouse responses for the X10 protocol are sent only for +# button-presses. +xterm+x10mouse|X10 xterm mouse protocol, + kmous=\E[M, XM=\E[?9%?%p1%{1}%=%th%el%;, + xm=\E[M%p3%' '%+%c%p2%'!'%+%c%p1%'!'%+%c, +xterm-x10mouse|X10 xterm mouse, + use=xterm+x10mouse, use=xterm, + +# Here is the conventional xterm mouse protocol, introduced with X11R1 in +# September 1987. +# +# The mouse responses for the X11 protocol covered button releases, as well as +# modifiers: +# shift 4 +# alt/meta 8 (technically the "mod1" mask, because X11 has no such keys) +# control 16 +# +# The modifiers are not reflected in this description because as used in xterm +# they are normally inaccessible because the translations resources assign +# shift and control to other features. However, they are important because +# they take up space in the first byte of the response. The other bits of this +# byte are used to encode the button number for both presses and releases. +# In the X11 protocol, any button-release is encoded with "3" (the lowest 2 +# bits in the byte). Later work on XFree86 xterm used the remaining 3 bits to +# provide additional features, e.g., wheel mouse. +# +# X11R1's xterm also supported an "emacs" mouse protocol, with final character +# "t" or "T", which was activated by double-clicking. The "t" response was +# used when the starting/ending positions were the same. +# +# X11R3 (February 1988) added the highlight/tracking mode. +# +# X11R4 (December 1989) added the control sequences document, listing the +# control sequences for the X10/X11 protocols without descriptions. It also +# mentioned the "emacs" ("T") response. Comments in button.c referred to the +# X11 protocol as "DEC VT200 compatible", although DEC offered no such terminal. +# +# X11R5 (November 1993) gave a description of the mouse protocol. +# +# X11R6 (January 1995) moved the control sequences document out of the xterm +# source-directory to xc/doc/specs/xterm, polishing the formatting but adding +# no new information. +xterm+x11mouse|X11 xterm mouse protocol, + kmous=\E[M, XM=\E[?1000%?%p1%{1}%=%th%el%;, + xm=\E[M%?%p4%t%p3%e%{3}%;%'\s'%+%c%p2%'!'%+%c%p1%'!'%+%c, +xterm-x11mouse|X11 mouse, + use=xterm+x11mouse, use=xterm, + +# Here is a suggested description of the xterm highlighting protocol. +# A more complicated example could be constructed to account for the "t" +# response. +xterm+x11hilite|X11 xterm mouse protocol with highlight, + kmous=\E[M, XM=\E[?1001%?%p1%{1}%=%th%el%;, + xm=\E[%p6%'!'%+%p5%'!'%+%c%p8%'!'%+%c%p7%'!'%+%c%p2%'!'%+%c + %p1%'!'%+%cT, +xterm-x11hilite|X11 mouse with highlight, + use=xterm+x11mouse, use=xterm, + +# The preceding were the sources from X Consortium. Other sources (or patches) +# were available. Starting in mid-1995, XFree86 developers collected some of +# those changes and began improvements, e.g., to support color. This was, by +# the way, around the same time that rxvt developers began implementing color, +# though dates (and attributions) are not well documented. I became interested +# in xterm in late 1995, and involved in early 1996. To complete the picture, +# CDE's dtterm was introduced around the same time, with no mouse protocol -TD + +# xterm patch #83 (1998/10/7), added Jason Bacon's changes to provide an +# "any-event" mouse mode. +# +# These building blocks incorporate later features as well: +# xterm patch #224 (2007/2/11) added private mode 1004, for enabling/disabling +# focus in/out event reporting. +# xterm patch #277 (2012/01/07) added private mode 1006 + +xterm+sm+1002|xterm any-button mouse, + kmous=\E[<, XM=\E[?1006;1004;1002%?%p1%{1}%=%th%el%;, + xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;, + use=xterm+focus, +xterm-1002|example of xterm any-button mouse, + use=xterm+sm+1002, use=xterm, + +xterm+sm+1003|xterm any-event mouse, + XM=\E[?1006;1004;1003%?%p1%{1}%=%th%el%;, + use=xterm+sm+1002, +xterm-1003|example of xterm any-event mouse, + use=xterm+sm+1003, use=xterm, + +# Some terminal emulators implement xterm focus in/out, but do it incorrectly, +# interfering with user applications. +# https://lists.gnu.org/archive/html/bug-ncurses/2023-10/msg00087.html +xterm+focus|xterm focus-in/out event "keys", + XF, + fd=\E[?1004l, fe=\E[?1004h, kxIN=\E[I, kxOUT=\E[O, + +# xterm patch #116 (1999/9/25) added Stephen P Wall's changes to support DEC +# locator mode. + +# xterm patch #120 (1999/10/28) added my change to support wheel mouse, by +# dropping support for the X11 mouse protocol's shift-modifier and using +# available bits in the first byte of the response to encode buttons 4 and 5. +# xterm patch #126 (2000/2/8) amended that change to avoid conflicting with +# older configurations which might have used the obsolete modifiers. + +# xterm patch #262 (2010/8/30) added Ryan Johnson's changes to provide a mode +# where the coordinates in the mouse response would be encoded in UTF-8, +# thereby extending the range of coordinates past 222=(255-33). This is the +# "1005" mouse mode. +xterm+sm+1005|xterm UTF-8 mouse (building block), + kmous=\E[M, XM=\E[?1005;1000%?%p1%{1}%=%th%el%;, + xm=\E[M%?%p4%t3%e%p3%'\s'%+%c%;%p2%'!'%+%u%p1%'!'%+%u, +xterm-1005|xterm UTF-8 mouse, + use=xterm+sm+1005, use=xterm, + +# xterm patch #277 (2012/1/7) provides a mode where the mouse response uses +# SGR-style parameters. +# +# Someone stated that the 1005 mouse mode would not be handled properly in luit. +# (By the way, this is a problem with the X11 protocol). A more plausible +# criticism is that the responses provided by the 1005 mode are not distinct +# from the non-1005 responses. +# +# As an alternative (and fixing the longstanding limitation of X11 mouse +# protocol regarding button-releases), I provided the 1006 mode, referring +# to it as "SGR 1006" since the replies resemble the SGR control string: +xterm+sm+1006|xterm SGR-mouse (building block), + kmous=\E[<, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, + xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;, +xterm-1006|xterm SGR-mouse, + use=xterm+sm+1006, use=xterm, + +# Some terminal emulators implement xterm focus in/out, but do it incorrectly, +# interfering with user applications. +# https://lists.gnu.org/archive/html/bug-ncurses/2023-10/msg00087.html +oldxterm+sm+1006|xterm SGR-mouse (building block), + kmous=\E[<, XM=\E[?1006;1000%?%p1%{1}%=%th%el%;, + xm=\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;, + +#### KTERM +# (kterm: this had extension capabilities ":KJ:TY=ascii:" -- esr) +# (kterm should not invoke DEC Graphics as the alternate character set +# -- Kenji Rikitake) +# (proper setting of enacs, smacs, rmacs makes kterm to use DEC Graphics +# -- MATSUMOTO Shoji) +# kterm implements acsc via built-in table of X Drawable's +kterm|kterm kanji terminal emulator (X window system), + XT, + ncv@, + acsc=``aajjkkllmmnnooppqqrrssttuuvvwwxx~~, enacs=, + rmacs=\E(B, rmam=\E[?7l, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e + \E(B%;, + sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, use=x10term+sl, + use=xterm-r6, use=ecma+color, +kterm-color|kterm-co|kterm with ANSI colors, + ncv@, use=kterm, use=ecma+color, + +#### Other XTERM + +# These (xtermc and xtermm) are distributed with Solaris. They refer to a +# variant of xterm which is apparently no longer supported, but are interesting +# because they illustrate SVr4 curses mouse controls - T.Dickey +xtermm|xterm terminal emulator (monochrome), + OTbs, am, km, mir, msgr, xenl, + btns#3, cols#80, it#8, lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink@, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cud1=\n, + dch=\E[%p1%dP, dch1=\E[P, el1=\E[1K$<3>, enacs=\E(B\E)0, + getm=\E[%p1%dY, ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, + ind=\n, kend=\E[Y, kf0=\EOy, kf10=\EOY, kf11=\EOZ, kf12=\EOA, + kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, kf9=\EOX, khome=\E[H, + kmous=\E[^_, knp=\E[U, kpp=\E[V, reqmp=\E[492Z, rev=\E[7m, + ri=\EM, rmacs=^O, rmcup=\E@0\E[?4r, + rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smcup=\E@0\E[?4s\E[?4h\E@1, + tbc=\E[3g, use=ansi+apparrows, use=ansi+csr, + use=ansi+cup, use=ansi+erase, use=ansi+idl, + use=ansi+local, use=ansi+sgrso, use=decid+cpr, + use=vt100+fnkeys, + +xtermc|xterm terminal emulator (color), + ncv#7, + op=\E[100m, + setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + use=xtermm, use=klone+color, + +# From: David J. MacKenzie 20 Apr 1995 +# Here's a termcap entry I've been using for xterm_color, which comes +# with BSD/OS 2.0, and the X11R6 contrib tape too I think. Besides the +# color stuff, I also have a status line defined as the window manager +# title bar. [I have translated it to terminfo -- ESR] +xterm-pcolor|xterm with color used for highlights and status line, + wsl#40, + bold=\E[1;43m, rev=\E[7;34m, + sgr=%?%p9%t\016%e\017%;\E[0%?%p6%t;1;43%;%?%p2%t;4;42%;%?%p1 + %t;7;31%;%?%p3%t;7;34%;m, + smso=\E[7;31m, smul=\E[4;42m, use=xterm+sl, use=xterm-r6, + +# This was mentioned +# http://unix.stackexchange.com/questions/119/colors-in-man-pages +# pointing to +# http://nion.modprobe.de/blog/archives/569-colored-manpages.html +# (blog posting by Nico Golde, June 24 2007) +# archive: +# https://web-beta.archive.org/web/20070921042430/http://nion.modprobe.de/mostlike.txt +# The comment hints where it started, but there are differences: +# Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm-pcolor +mostlike|manpages with color looking like most, + OTbs@, + bold=\E[1m\E[31m, + is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>, kbs=^H, + meml@, memu@, rev=\E[7m\E[34m, + rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>, sgr@, + smso=\E[1;30m\E[47m, smul=\E[32m, TS@, use=xterm-pcolor, + +# This describes the capabilities of color_xterm, an xterm variant from +# before ECMA-48 color support was folded into the main-line xterm release. +# This entry is straight from color_xterm's maintainer. +# From: Jacob Mandelson , 09 Nov 1996 +# The README's with the distribution also say that it supports SGR 21, 24, 25 +# and 27, but they are not present in the terminfo or termcap. +color_xterm|cx|cx100|color_xterm color terminal emulator for X, + OTbs, am, km, mir, msgr, xenl, XT, + cols#80, it#8, lines#65, ncv@, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, ed=\E[J, + el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=^I, + ich=\E[%p1%d@, ind=\n, is1=\E[r\E[m\E[?7h\E[?4;6l\E[4l, + kend=\E[8~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, + kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[7~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~, + rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, + rmcup=\E>\E[?41;1r, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, + rs1=\E(B\017\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E<, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;, + sgr0=\E[0m\017, smacs=^N, smam=\E[?7h, + smcup=\E[?1;41s\E[?1;41h\E=, smir=\E[4h, smso=\E[7m, + smul=\E[4m, use=ansi+apparrows, use=ansi+csr, + use=ansi+idl, use=ansi+local, use=decid+cpr, + use=ecma+color, use=vt220+keypad, + +# The IRAF source has a terminfo using "xterm-r5", but line-drawing does not +# work in that case. This entry uses xterm+acs, to work around that problem. +# +# Home/end keys do not work, due to a bug in the X Consortium xterm on which +# this is based: +# +# https://invisible-island.net/xterm/xterm.faq.html#bug_xterm_r6 +# +# Comparing to the X11R5 source, xgterm has dynamic and ANSI colors (probably +# not bce). It interchanges mouse buttons 2/3 for menus. +# +# It also has a few features found in later versions of xterm: +# - vi-button and dired-button, +# - i18n stuff like X11R6. +# - colorBD, colorUL +# - scrollBarRight +# +# Debian provides a package for xgterm (and iraf). Although the source for +# xgterm implements the control-sequences for ANSI color, the packaged xgterm +# does nothing with those, even after installing the app-defaults file which +# was overlooked by the Debian packager. +xgterm|graphic terminal for IRAF, + enacs=\E(B\E)0, rmacs=^O, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t + \016%e\017%;, + sgr0=\E[m\017, smacs=^N, use=xterm+acs, use=xterm-r5, + use=xterm+keypad, + +# The 'nxterm' distributed with Redhat Linux 5.2 is a slight rehack of +# xterm-sb_right-ansi-3d, which implements ANSI colors, but does not support +# SGR 39 or 49. SGR 0 does reset colors (along with everything else). This +# description is "compatible" with color_xterm, rxvt and XFree86 xterm, except +# that each of those implements the home, end, delete keys differently. +# +# Redhat Linux 6.x distributes XFree86 xterm as "nxterm", which uses bce +# colors; note that this is not compatible with the 5.2 version. +# csw (2002-05-15): make xterm-color primary instead of nxterm, to +# match XFree86's xterm.terminfo usage and prevent circular links +xterm-color|nxterm|generic color xterm, + ncv@, + op=\E[m, use=xterm-r6, use=klone+color, + +# This entry describes an xterm with Sun-style function keys enabled +# via the X resource setting "xterm*sunFunctionKeys:true" +# To understand / note that L1,L2 and F11,F12 are the same. +# The ... keys are L3-L10. We don't set +# because we want it to be seen as . +# The ... keys are R1-R15. We treat some of these in accordance +# with their Sun keyboard labels instead. +# From: Simon J. Gerraty 10 Jan 1996 +xterm-sun|xterm with sunFunctionKeys true, + kb2=\E[218z, kcpy=\E[197z, kdch1=\E[3z, kend=\E[220z, + kent=\EOM, kf1=\E[224z, kf10=\E[233z, kf11=\E[192z, + kf12=\E[193z, kf13=\E[194z, kf14=\E[195z, kf15=\E[196z, + kf17=\E[198z, kf18=\E[199z, kf19=\E[200z, kf2=\E[225z, + kf20=\E[201z, kf3=\E[226z, kf31=\E[208z, kf32=\E[209z, + kf33=\E[210z, kf34=\E[211z, kf35=\E[212z, kf36=\E[213z, + kf38=\E[215z, kf4=\E[227z, kf40=\E[217z, kf42=\E[219z, + kf44=\E[221z, kf45=\E[222z, kf46=\E[234z, kf47=\E[235z, + kf5=\E[228z, kf6=\E[229z, kf7=\E[230z, kf8=\E[231z, + kf9=\E[232z, kfnd=\E[200z, khlp=\E[196z, khome=\E[214z, + kich1=\E[2z, knp=\E[222z, kpp=\E[216z, kund=\E[195z, + use=xterm+kbs, use=ansi+apparrows, use=xterm+nofkeys, + use=xterm+nopcfkeys, + +xterms-sun|small (80x24) xterm with sunFunctionKeys true, + use=xterm-sun, + +#### GNOME (VTE) +# this describes the alpha-version of GNOME terminal shipped with Redhat 6.0 +gnome-rh62|GNOME terminal, + bce, + kdch1=^?, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + use=linux+kbs, use=xterm-color, + +# GNOME Terminal 1.4.0.4 (Redhat 7.2) +# +# This implements a subset of VT102 with a random selection of features from +# other terminals such as color and function-keys. +# +# shift-f1 to shift-f10 are f11 to f20 +# +# NumLock changes the application keypad to approximate VT100 keypad, except +# that there is no escape sequence matching comma (,). +# +# Other defects observed: +# vt100 LNM mode is not implemented. +# vt100 80/132 column mode is not implemented. +# vt100 DECALN is not implemented. +# vt100 DECSCNM mode is not implemented, so flash does not work. +# vt100 TBC (tab reset) is not implemented. +# xterm alternate screen controls do not restore cursor position properly +# it hangs in tack after running function-keys test. +gnome-rh72|GNOME Terminal in RedHat 7, + bce, km@, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, rmam=\E[?7l, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e + \017%;, + sgr0=\E[0m\017, smam=\E[?7h, tbc@, use=vt220+cvis, + use=linux+kbs, use=xterm-color, + +# GNOME Terminal 2.0.1 (Redhat 8.0) +# +# Documentation now claims it implements VT220 (which is demonstrably false). +# However, it does implement ECH, which is a VT220 feature. And there are +# workable VT100 LNM, DECALN, DECSNM modes, making it possible to display +# more of its bugs using vttest. +# +# However, note that bce and msgr are broken in this release. Tabs (tbc and +# hts) are broken as well. Sometimes flash (as in xterm-new) works. +# +# kf1 and kf10 are not tested since they're assigned (hardcoded?) to menu +# operations. Shift-tab generates a distinct sequence so it can be argued +# that it implements kcbt. +gnome-rh80|GNOME Terminal in RedHat 8, + bce@, msgr@, + ech=\E[%p1%dX, flash=\E[?5h$<100/>\E[?5l, kcbt=\E^I, + op=\E[39;49m, use=gnome-rh72, + +# GNOME Terminal 2.2.1 (Redhat 9.0) +# +# bce and msgr are repaired. +gnome-rh90|GNOME Terminal in RedHat 9, + bce, msgr, XT, + hpa=\E[%i%p1%dG, kLFT=\EO2D, kRIT=\EO2C, kb2=\E[E, + kcbt=\E[Z, tbc=\E[3g, vpa=\E[%i%p1%dd, use=xterm+pcf0, + use=xterm+pcfkeys, use=gnome-rh80, + +# GNOME Terminal 2.14.2 (Fedora Core 5) +# Ed Catmur notes that gnome-terminal has recognized soft-reset since May 2002. +gnome-fc5|GNOME Terminal in Fedora Core 5, + rs1=\Ec, + rs2=\E7\E[r\E8\E[m\E[?7h\E[!p\E[?1;3;4;6l\E[4l\E>\E[?1000l + \E[?25h, + use=ansi+enq, use=xterm+pcc0, use=gnome-rh90, + +# GNOME Terminal 2.18.1 (2007 snapshot) +# +# For any "recent" version of gnome-terminal, it is futile to attempt to +# support modifiers on cursor- and keypad keys because the program usually +# is hardcoded to set $TERM to "xterm", and on startup, it builds a subset +# of the keys (which more/less correspond to the termcap values), and will +# interpret those according to the $TERM value, but others not in the +# terminfo according to some constantly changing set of hacker guidelines -TD +vte-2007|VTE in GNOME Terminal snapshot 2.18.1, + use=xterm+pcc2, use=vt220+cvis, use=gnome-fc5, +gnome-2007|GNOME Terminal snapshot 2.18.1, + use=vte-2007, + +# GNOME Terminal 2.22.3 (2008 snapshot) +# +# In vttest, it claims to be a VT220 with national replacement character-sets, +# but aside from the identifier string, implements only a small fraction of +# VT220's behavior, which will make it less usable on a VMS system (unclear +# what the intent of the developer is, since the NRC feature exposed in vttest +# by this change does not work). +vte-2008|VTE in GNOME Terminal snapshot 2.22.3, + use=vte+pcfkeys, use=vte-2007, +gnome-2008|GNOME Terminal snapshot 2.22.3, + use=vte-2008, + +# GNOME Terminal 3.6.0 (2012) +# VTE 0.34.1 was marked in git 2012-10-15 (three days after patch was applied +# in ncurses). It inherited from gnome-fc5, which broke the modified forms +# of f1-f4 -TD +# +# Testing with tack shows that flash does not/has not worked -TD +vte-2012|VTE 0.34.1, + ncv#16, + dim=\E[2m, flash@, invis=\E[8m, rmso=\E[27m, rmul=\E[24m, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p7%t;8%;%?%p1%p3 + %|%t;7%;m%?%p9%t\016%e\017%;, + use=ecma+italics, use=vte-2008, +# Version 3.6.1 sets TERM to xterm-256color (still hardcoded), which has +# 61 differences from a correct entry for gnome terminal. +gnome-2012|GNOME Terminal 3.6.0, + use=vte-2012, + +# Before 2008, GNOME terminal could automatically use the contents of the +# "xterm" terminfo to supply key information which is not built into the +# program. With 2.22.3, this list was built into the program (which addressed +# the inadvertent use of random terminfo data, though using a set of values +# which did not correspond to any that xterm produced - still not solving the +# problem that GNOME terminal hardcoded the $TERM variable as "xterm"). +# +# terminfo modifier code keys +# kf13-kf24 shift 2 F1 to F12 +# kf25-kf36 control 5 F1 to F12 +# kf37-kf48 shift/control 6 F1 to F12 +# kf49-kf60 alt 3 F1 to F12 +# kf61-kf63 shift-alt 4 F1 to F3 +# +# The parameters with \EO (SS3) are technically an error, since SS3 should have +# no parameters. This appears to be rote copying based on xterm+pcc0. +vte+pcfkeys|VTE's variation on xterm+pcfkeys (building block), + kf13=\EO1;2P, kf14=\EO1;2Q, kf15=\EO1;2R, kf16=\EO1;2S, + kf25=\EO1;5P, kf26=\EO1;5Q, kf27=\EO1;5R, kf28=\EO1;5S, + kf37=\EO1;6P, kf38=\EO1;6Q, kf39=\EO1;6R, kf40=\EO1;6S, + kf49=\EO1;3P, kf50=\EO1;3Q, kf51=\EO1;3R, kf52=\EO1;3S, + kf61=\EO1;4P, kf62=\EO1;4Q, kf63=\EO1;4R, + use=xterm+pcfkeys, +gnome+pcfkeys|GHOME Terminal's variation on xterm+pcfkeys (building block), + use=vte+pcfkeys, + +# deprecated - use "vte" for newer versions +gnome|GNOME Terminal, + use=vte-2012, +gnome-256color|GNOME Terminal with xterm 256-colors, + use=xterm+256color, use=gnome, + +# relevant changes were made in January 2014, and later. +# +# Originally VTE was promoted as a library able to emulate any terminal by +# reading its terminal description. In practice, that never got beyond the +# ability to read definitions of special keys (function-, editing-, cursor). +# +# Before 2014, VTE had a termcap reader (originally pointing to a private copy +# of a termcap file derived from xterm). That was incomplete because it did +# not have any of the modifier-key information used for xterm's function-, +# editing-, and cursor-keys. Having its own reader was unnecessary since +# ncurses provides that information; used since xterm patch #225 in 2007. +# +# During April/May 2014, a few bug reports (e.g., gnome #169295, gnome #728900, +# gnome #730137) dealt with attempts to recast that termcap reader as library +# calls, then attempting to adapt a chunk of code from ncurses (src/vteti.c), +# abandoning that and finally constructing a table to match xterm's default +# behavior, e.g., for "xterm+pcfkeys". +vte-2014|VTE 0.35.1, + ncv@, + cbt=\E[Z, el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, + ich=\E[%p1%d@, kent=\EOM, use=ecma+index, + use=oldxterm+sm+1006, use=xterm+pcfkeys, use=vte-2012, + use=bracketed+paste, + +# As of January 2018, this was the most recent release, +# e.g., with gnome-terminal 3.26.2 +vte-2017|VTE 0.50.2, + E3=\E[3J, use=ecma+strikeout, use=vte-2014, + +# VTE 0.51.2 and gnome-terminal 3.28.2 copied a feature from KovId's TTY +# late in 2017 for changing the appearance of underlines, which was +# incorporated into Debian and Fedora testing-packages in February and March +# 2018, respectively. Overline (Smol/Rmol) has been supported since December +# 2017. +vte-2018|VTE 0.51.2, + AX, + blink=\E[5m, enacs=\E(B\E)0, nel=\EE, + rep=%p1%c\E[%p2%{1}%-%db, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t; + 8%;%?%p1%p3%|%t;7%;m%?%p9%t\016%e\017%;, + Rmol=\E[55m, Se=\E[1 q, Smol=\E[53m, Smulx=\E[4:%p1%dm, + use=xterm+alt+title, use=xterm+tmux, use=kitty+setal, + use=vte-2017, + +# Summarizing as of March 2022, these terminfo-capabilities of xterm are +# absent from VTE: +# - DEC application keypad mode +# - DEC-compatible status-line +# - DEC left/right margin support +# - DEC printer controls +# - AT&T cursor-blinking +# - meta mode, as documented in terminfo(5) +# - xterm's extension to clear scrollback +vte|VTE aka GNOME Terminal, + use=vte-2018, + +vte-256color|VTE with xterm 256-colors, + use=xterm+256color, use=vte, + +# XFCE Terminal 0.2.5.4beta2 +# +# This is based on some of the same source code, e.g., the VTE library, as +# gnome-terminal, but has fewer features, fails more screens in vttest. +# Since most of the terminfo-related behavior is due to the VTE library, +# the terminfo is the same as gnome-terminal. +xfce|Xfce Terminal, + use=vte-2008, + +# HTERM +# +# https://hterm.org +# +# A terminal written in JavaScript, which can provide xterm-like terminal +# emulation in a browser such as Google Chrome, or in Chome OS. +# +# https://chromium.googlesource.com/apps/libapps/+/master/nassh/doc/FAQ.md +# +# Tested with Secure Shell App version 0.39 in Chrome 89.0.4389.90, found that +# the numeric keypad escapes are missing -TD +hterm|Chromium hterm, + npc, + U8#1, + kcbt=\E[Z, kent=\EOM, nel=\EE, use=linux+kbs, + use=xterm+osc104, use=ecma+index, use=ansi+rep, + use=ecma+strikeout, use=vt420+lrmm, use=xterm+focus, + use=xterm+sm+1006, use=xterm+tmux, use=ecma+italics, + use=xterm+pcfkeys, use=xterm-basic, + use=bracketed+paste, +hterm-256color|Chromium hterm with xterm 256-colors, + use=xterm+256color2, use=hterm, + +# TERMITE +# +# https://github.com/thestinger/termite +# +# A review requires install of Arch Linux since Fedora and Debian don't have +# this program. It uses "vte3-ng" (a conflicting package), which is here: +# https://github.com/thestinger/vte-ng +# which (based on the default branch setting) seems to be a fork of vte +# 0.48.2, and is noted as such in Arch: +# https://aur.archlinux.org/packages/vte3-ng/ +# It won't be merged: +# https://bugzilla.gnome.org/show_bug.cgi?id=679658#c10 +# https://bugzilla.gnome.org/show_bug.cgi?id=78291 +# but perhaps made obsolete. +# +# The entry as given was mislabeled "xterm-termite" (it is not xterm), and +# was mostly cut/paste from xterm-256color, but since VTE does not actually +# implement several of the features in that terminal description, this one is +# trimmed to eliminate those. Also, since it is a slightly older version of +# VTE, it lacks a few more features (again, trimmed). +termite|VTE-based terminal, + am, km, mir, msgr, npc, xenl, + cols#80, lines#24, ncv@, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ech=\E[%p1%dX, ed=\E[J, el=\E[K, + el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, home=\E[H, + hpa=\E[%i%p1%dG, ind=\n, invis=\E[8m, + is2=\E[!p\E[?3;4l\E[4l\E>, kb2=\EOE, kbs=^?, kcbt=\E[Z, + kent=\EOM, kmous=\E[M, rev=\E[7m, ri=\EM, rmacs=\E(B, + rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, + rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+csr, + use=ansi+enq, use=ansi+idc, use=ansi+idl, + use=ansi+inittabs, use=ecma+index, use=ecma+italics, + use=ansi+local, use=xterm+alt1049, use=xterm+256color, + use=ecma+color, use=vt220+cvis, use=xterm+pcfkeys, + use=xterm+sl-twm, + +#### Other GNOME +# Multi-GNOME-Terminal 1.6.2 +# +# This does not use VTE, and does have different behavior (compare xfce and +# gnome). +mgt|Multi GNOME Terminal, + use=ecma+index, use=xterm-xf86-v333, + +#### KDE +# This is kvt 0-18.7, shipped with Redhat 6.0 (though whether it supports bce +# or not is debatable). +kvt|KDE terminal, + bce, km@, + kdch1=^?, kend=\E[F, khome=\E[H, use=linux+kbs, + use=xterm-color, + +# Konsole 1.0.1 (2001/11/25) +# (formerly known as kvt) +# +# This program hardcodes $TERM to 'xterm', which is not accurate. However, to +# simplify this entry (and point out why konsole isn't xterm), we base this on +# xterm-r6. The default keyboard appears to be 'linux'. +# +# Notes: +# a) konsole implements several features from XFree86 xterm, though none of +# that is documented - except of course in its source code - apparently +# because its implementors are unaccustomed to reading documentation - as +# evidenced by the sparse and poorly edited documentation distributed with +# konsole. Some features such as the 1049 private mode are recognized but +# incorrectly implemented as a duplicate of the 47 private mode. +# b) even with the "vt100 (historical)" keyboard setting, the numeric keypad +# sends PC-style escapes rather than VT100. +# c) fails vttest menu 3 (Test of character sets) because it does not properly +# parse some control sequences. Also fails vttest Primary Device Attributes +# by sending a bogus code (in the source it says it's supposed to be a +# VT220, which is doubly incorrect because it does not implement VT220 +# control sequences except for a few special cases). Treat it as a +# mildly-broken VT102. +# +# Update for konsole 1.3.2: +# The 1049 private mode works (but see the other xterm screens in vttest). +# Primary Device Attributes now returns the code for a VT100 with advanced +# video option. Perhaps that's intended to be a "mildly-broken Vt102". +# +# Updated for konsole 1.6.4: +# add konsole-solaris +# +# Updated for konsole 1.6.6: +# add control-key modifiers for function-keys, etc. +# +# Updated for konsole 2.3 (October 2008): +# vttest menu 1 shows that both konsole and gnome terminal do wrapping +# different from xterm (and VT100's). They have the same behavior in +# this detail, but it is unclear which copies the other. +# +# Deferred update for konsole 2.10 (late 2012): +# add SGR 1006 mouse +# +# Updated for konsole 2.12.4 (late 2013): +# add sitm/ritm +# +# Updated for konsole 16.07 (mid 2016): +# add dim, invis, strikeout +# (also overline, which is too rarely used to provide as an extension) +# +# Updated for konsole 17.12.0 (late 2017): +# +# Re-enable "bel", since it is latent in the source-code even though KDE config +# often hides the feature (2020/5/30) +konsole-base|KDE console window (common), + bce, km@, npc, XT, + ncv@, + ech=\E[%p1%dX, flash=\E[?5h$<100/>\E[?5l, + hpa=\E[%i%p1%dG, kend=\E[4~, kf1@, kf10@, kf11@, kf12@, kf13@, + kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2@, kf20@, kf3@, kf4@, + kf5@, kf6@, kf7@, kf8@, kf9@, kfnd@, khome=\E[1~, kslt@, + rmam=\E[?7l, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, + rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[?25h, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[0m\017, smam=\E[?7h, vpa=\E[%i%p1%dd, + use=ansi+sgrdim, use=ecma+index, use=xterm+focus, + use=xterm+sm+1006, use=ecma+strikeout, + use=ecma+italics, use=ecma+color, use=xterm-r6, + use=vt220+cvis, use=bracketed+paste, + use=report+version, + +# The keytab feature was introduced in 0.9.12 (February 2000) with "linux" and +# "vt100" key-table files along with a compiled-in default key-table. +# +# The main difference between the two keytabs was that the developer equated +# "vt100" with xterm, and noticed that the Linux console's F1-F5 differed from +# that. For the same reason, the home/end keys differ. A VT100 had none of +# that. The otherwise identical keytabs have definitions to model the VT52 +# cursor-keys and the VT100 cursor-keys with application versus normal modes. +# +# An "x11r5" keytab (displayed in the menu as "X11 R5") was added in January +# 2001, and shortly after retitled to "XFree 3.x.x". Both it and "vt100" were +# dropped from the install in June 2008. +# +# The default keytab added in January 2000 was originally titled "X11 R6", +# and likewise retitled to "XFree 4". +# +# A "solaris" keytab was added in Febrary 2005, copying the "vt100" keytab +# and changing backspace to ^H, removing that keytab's attempt to model the +# VT100 keypad and VT52 (KDE #20459). +# +# The developers made changes to the default and linux keytabs. Comparing +# the original and 2018 versions using diffstat: +# default: 119 added, 147 deleted, 28 unchanged +# linux: 47 added, 28 deleted, 104 unchanged +# +# Most of the change for the default keytab was to make konsole act more like +# xterm. That was a feature named AnyMod which came in May 2005 for KDE #92749 +# (see also Redhat #122815). Later, in June 2007 the compiled-in keytab was +# made an external file (like "linux" and "solaris"), and some further +# refinement made. But there are still flaws in the scheme. +# +# Essentially AnyMod maps the xterm "PC-style" modifier codes such as 2 for +# Shift into a placeholder in the table entries. That works well if all of the +# modified keys are modified in the same way. But xterm does not do that. The +# first 4 function keys are used in xterm to support the VT100 PF1-PF4 keypad +# keys. For example, F2 sends \EOQ in both terminals because of this feature. +# But a shifted F2 (F14=F2+12) differs like this, in infocmp's listing: +# kf14: '\E[1;2Q', '\EO2Q'. +# +# In effect, a quarter of konsole's function-keys are different from xterm. +# +# It is not a simple blunder: +# a) xterm patch #121 (November 1999), providing the first version of the +# PC-style modifiers would send \EO2Q +# b) xterm patch #216 (July 2006) amended this and other details, provided +# better documentation for the modifiers and made the behavior configurable, +# e.g., using the modifyFunctionKeys resource. The reason why it sends +# \E[1;2Q is that \E[O2Q is not a legal ECMA-48 control sequence. The +# changelog points this out as "avoid sending SS3 with parameters". +# c) That came after AnyMod was introduced, but still early enough that one +# might expect konsole's developers to followup. Twelve years later that +# has yet to happen. +# +# As of 2018, konsole still provides 3 keyboard profiles ("XFree 4", "linux", +# "solaris"). +konsole-linux|KDE console window with Linux keyboard, + kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13@, + kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E[[B, kf20@, + kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, use=konsole-base, +konsole-solaris|KDE console window with Solaris keyboard, + kbs=^H, kend=\E[4~, khome=\E[1~, use=konsole-vt100, + +# Obsolete: x11r5.keymap +# KDE's "XFree86 3.x.x" keyboard was obviously based on reading the xterm +# terminfo at the time rather than testing the code. +konsole-xf3x|KDE console window with keyboard for XFree86 3.x xterm, + kend=\E[4~, khome=\E[1~, use=konsole-vt100, + +# The value for kbs (see konsole-vt100) reflects local customization rather +# than the settings used for XFree86 xterm. +konsole-xf4x|KDE console window with keyboard for XFree86 4.x xterm, + kend=\EOF, khome=\EOH, use=konsole+pcfkeys, + use=konsole-vt100, + +konsole+pcfkeys|konsole subset of xterm+pcfkeys, + kcbt=\E[Z, use=xterm+pcc2, use=xterm+pcf0, + use=xterm+pce2, + +# Obsolete: vt100.keymap +# KDE's "vt100" keyboard has no relationship to any terminal that DEC made, but +# it is still useful for deriving the other entries, since the developer +# provided function-keys based on xterm. +konsole-vt100|KDE console window with VT100 (sic) keyboard, + kend=\E[F, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, + kf2=\E[12~, kf20@, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H, + use=konsole-base, + +# Obsolete: vt420pc.keytab was added in June 2000, dropped from the install in +# September 2008 and removed in June 2016. The developer who removed it stated +# that it was never installed. +konsole-vt420pc|KDE console window with VT420 PC keyboard, + kbs=^H, kdch1=^?, use=konsole-vt100, + +# make a default entry for konsole +konsole|KDE console window, + use=konsole-xf4x, + +# These were written for ncurses: +konsole-16color|klone of xterm-16color, + ncv#32, use=ibm+16color, use=konsole, +konsole-256color|KDE console window with xterm 256-colors, + use=xterm+256setaf, use=konsole, + +#### MLTERM +# https://github.com/arakiken/mlterm + +mlterm|multi lingual terminal emulator, + use=mlterm3, + +# Tested mlterm 3.9.0 (2020/09/19): +# ncurses: +# - has blinking text +# - has italics +# - has invisible-text +# tack: +# - has crossed-out text +# - does not support palette reset with OSC 104 +# - testing the function-keys is difficult because the terminal is +# preconfigured to set many of the modified keys to special functions, e.g., +# - shift-F1 and shift-F2 are bound to a split-screen feature +# - control-F1 and control-F2 is bound to a new-terminal feature +# vttest: +# - primary response says it is a VT340 (ReGIS and Sixel). +# - has partial support for double-size characters. +# - character-set tests do not work. +# - DEC locator works. +# - 1006-mouse works. +# - focus-events do not work reliably. +# - numeric keypad escapes do not work. +# - back-color erase works +# other: +# - title-stack works. +# - doesn't respond to 8-bit controls. +# - 256-color palette initializing works. +# - DECSTR soft-reset is documented. +# +# Tested mlterm 3.3.8 (2018/01/21): +# found xterm+sm+1006 did not work with version 3.3.8 +# soft-reset DECSTR is in sources since 2017/09/19. +# +# Tested mlterm 3.2.2 (2014/03/22): +# mlterm 3.x made further changes, but they were not reflected in the included +# mlterm.ti (which was dropped in 2015). This entry has been based on testing +# with ncurses, tack and vttest -TD +mlterm3|multi lingual terminal emulator 3.x, + bce, AX, + blink=\E[5m, flash=\E[?5h$<100/>\E[?5l, invis=\E[8m, + is2=\E[!p\E[?3;4l\E>, rs2=\E[!p\E[?3;4l\E>, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;%? + %p7%t;8%;m%?%p9%t\E(0%e\E(B%;, + use=ansi+enq, use=ansi+rep, use=ecma+italics, + use=ecma+strikeout, use=xterm+app, use=xterm+pcf2, + use=xterm+pcc2, use=xterm+pce2, use=xterm+meta, + use=xterm+alt+title, use=xterm+sm+1006, + use=vt100+pfkeys, use=bracketed+paste, use=mlterm2, + use=report+version, + +# This is mlterm 2.9.3's mlterm.ti, with some additions/corrections -TD +# +# It is nominally a VT102 emulator, with features borrowed from rxvt and +# xterm. +# +# The function keys are numbered based on shift/control/alt modifiers, except +# that the control-modifier itself is used to spawn a new copy of mlterm (the +# "-P" option). So control/F1 to control/F12 may not be usable, depending on +# how it is configured. +# +# kf1 to kf12 \E[11~ to \E[24~ +# shift kf1 to kf12 \E[11;2~ to \E[24;2~ +# alt kf1 to kf12 \E[11;3~ to \E[24;3~ +# shift/alt kf1 to kf12 \E[11;4~ to \E[24;4~ +# control kf1 to kf12 \E[11;5~ to \E[24;5~ (maybe) +# control/shift kf1 to kf12 \E[11;6~ to \E[24;6~ +# control/alt kf1 to kf12 \E[11;7~ to \E[24;7~ +# control/shift/alt kf1 to kf12 \E[11;8~ to \E[24;8~ +# +mlterm2|multi lingual terminal emulator 2.x, + am, eslok, km, mc5i, mir, msgr, npc, xenl, XT, + colors#8, cols#80, lines#24, pairs#64, + acsc=00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=, + home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ind=\n, + is2=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>, kbs=^?, + kcbt=\E[Z, kend=\EOF, kent=\EOM, kind=\EO1;2B, kmous=\E[M, + kri=\EO1;2A, mc0=\E[i, nel=\EE, op=\E[39;49m, rev=\E[7m, + ri=\EM, rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l, + rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, + rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;m%?%p9%t\E(0%e + \E(B%;, + sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, u8=\E[?1;2c, + vpa=\E[%i%p1%dd, use=ansi+apparrows, use=ansi+csr, + use=ansi+enq, use=ansi+idl, use=ansi+inittabs, + use=ansi+local, use=vt220+vtedit, use=xterm+alt1049, + use=ecma+index, use=mlterm+pcfkeys, use=vt220+cvis, + use=xterm+r6f2, + +# The insert/delete/home/end keys do not respond to modifiers because mlterm +# looks in its termcap to decide which string to send. If it used terminfo +# (when available), it could use the extended names introduced for xterm. +mlterm+pcfkeys|mlterm fragment for PC-style fkeys, + kLFT=\EO1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\EO1;2C, + kDN=\EO1;2B, kDN3=\EO1;3B, kDN4=\EO1;4B, kDN5=\EO1;5B, + kDN6=\EO1;6B, kDN7=\EO1;7B, kIC5=\E[2;5~, kIC6=\E[2;6~, + kLFT3=\EO1;3D, kLFT4=\EO1;4D, kLFT5=\EO1;5D, + kLFT6=\EO1;6D, kLFT7=\EO1;7D, kNXT5=\E[6;5~, + kNXT6=\E[6;6~, kPRV5=\E[5;5~, kPRV6=\E[5;6~, + kRIT3=\EO1;3C, kRIT4=\EO1;4C, kRIT5=\EO1;5C, + kRIT6=\EO1;6C, kRIT7=\EO1;7C, kUP=\EO1;2A, kUP3=\EO1;3A, + kUP4=\EO1;4A, kUP5=\EO1;5A, kUP6=\EO1;6A, kUP7=\EO1;7A, + +mlterm-256color|mlterm 3.0 with xterm 256-colors, + use=xterm+256color, use=mlterm, + +#### RXVT +# From: Thomas Dickey 04 Oct 1997 +# Updated: Oezguer Kesim 02 Nov 1997 +# Notes: +# rxvt 2.21b uses +# smacs=\E(B\E)U^N, rmacs=\E(B\E)0^O, +# but some applications don't work with that. +# It also has an AIX extension +# box2=lqkxjmwuvtn, +# and +# ech=\E[%p1%dX, +# but the latter does not work correctly. +# +# The distributed terminfo says it implements hpa and vpa, but they are not +# implemented correctly, using relative rather than absolute positioning. +# +# rxvt is normally configured to look for "xterm" or "xterm-color" as $TERM. +# Since rxvt is not really compatible with xterm, it should be configured as +# "rxvt" or "rxvt-color". +# +# removed dch/dch1 because they are inconsistent with bce/ech -TD +# remove km as per tack test -TD +rxvt-basic|rxvt terminal base (X Window System), + OTbs, bce, eo, mir, xenl, xon, XT, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E[?5h$<100/>\E[?5l, ich=\E[%p1%d@, + is1=\E[?47l\E=\E[?1l, + is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, + kcbt=\E[Z, kmous=\E[M, rev=\E[7m, ri=\EM, rmir=\E[4l, + rmkx=\E>, rmso=\E[27m, rmul=\E[24m, + rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, + rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[? + 25h, + s0ds=\E(B, s1ds=\E(0, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? + %p9%t\016%e\017%;, + sgr0=\E[0m\017, smir=\E[4h, smkx=\E=, smso=\E[7m, + smul=\E[4m, use=ansi+csr, use=ansi+idl, use=ansi+local, + use=xterm+alt47, use=vt100+enq, use=vt100+4bsd, + use=rxvt+pcfkeys, use=vt220+cvis, use=vt220+keypad, + +# Key Codes from rxvt reference: +# +# Note: Shift + F1-F10 generates F11-F20 +# +# For the keypad, use Shift to temporarily override Application-Keypad +# setting use Num_Lock to toggle Application-Keypad setting if Num_Lock +# is off, escape sequences toggle Application-Keypad setting. +# Also note that values of Home, End, Delete may have been compiled +# differently on your system. +# +# Normal Shift Control Ctrl+Shift +# Tab ^I ESC [ Z ^I ESC [ Z +# BackSpace ^H ^? ^? ^? +# Find ESC [ 1 ~ ESC [ 1 $ ESC [ 1 ^ ESC [ 1 @ +# Insert ESC [ 2 ~ paste ESC [ 2 ^ ESC [ 2 @ +# Execute ESC [ 3 ~ ESC [ 3 $ ESC [ 3 ^ ESC [ 3 @ +# Select ESC [ 4 ~ ESC [ 4 $ ESC [ 4 ^ ESC [ 4 @ +# Prior ESC [ 5 ~ scroll-up ESC [ 5 ^ ESC [ 5 @ +# Next ESC [ 6 ~ scroll-down ESC [ 6 ^ ESC [ 6 @ +# Home ESC [ 7 ~ ESC [ 7 $ ESC [ 7 ^ ESC [ 7 @ +# End ESC [ 8 ~ ESC [ 8 $ ESC [ 8 ^ ESC [ 8 @ +# Delete ESC [ 3 ~ ESC [ 3 $ ESC [ 3 ^ ESC [ 3 @ +# F1 ESC [ 11 ~ ESC [ 23 ~ ESC [ 11 ^ ESC [ 23 ^ +# F2 ESC [ 12 ~ ESC [ 24 ~ ESC [ 12 ^ ESC [ 24 ^ +# F3 ESC [ 13 ~ ESC [ 25 ~ ESC [ 13 ^ ESC [ 25 ^ +# F4 ESC [ 14 ~ ESC [ 26 ~ ESC [ 14 ^ ESC [ 26 ^ +# F5 ESC [ 15 ~ ESC [ 28 ~ ESC [ 15 ^ ESC [ 28 ^ +# F6 ESC [ 17 ~ ESC [ 29 ~ ESC [ 17 ^ ESC [ 29 ^ +# F7 ESC [ 18 ~ ESC [ 31 ~ ESC [ 18 ^ ESC [ 31 ^ +# F8 ESC [ 19 ~ ESC [ 32 ~ ESC [ 19 ^ ESC [ 32 ^ +# F9 ESC [ 20 ~ ESC [ 33 ~ ESC [ 20 ^ ESC [ 33 ^ +# F10 ESC [ 21 ~ ESC [ 34 ~ ESC [ 21 ^ ESC [ 34 ^ +# F11 ESC [ 23 ~ ESC [ 23 $ ESC [ 23 ^ ESC [ 23 @ +# F12 ESC [ 24 ~ ESC [ 24 $ ESC [ 24 ^ ESC [ 24 @ +# F13 ESC [ 25 ~ ESC [ 25 $ ESC [ 25 ^ ESC [ 25 @ +# F14 ESC [ 26 ~ ESC [ 26 $ ESC [ 26 ^ ESC [ 26 @ +# F15 (Help) ESC [ 28 ~ ESC [ 28 $ ESC [ 28 ^ ESC [ 28 @ +# F16 (Menu) ESC [ 29 ~ ESC [ 29 $ ESC [ 29 ^ ESC [ 29 @ +# F17 ESC [ 31 ~ ESC [ 31 $ ESC [ 31 ^ ESC [ 31 @ +# F18 ESC [ 32 ~ ESC [ 32 $ ESC [ 32 ^ ESC [ 32 @ +# F19 ESC [ 33 ~ ESC [ 33 $ ESC [ 33 ^ ESC [ 33 @ +# F20 ESC [ 34 ~ ESC [ 34 $ ESC [ 34 ^ ESC [ 34 @ +# +# Application +# Up ESC [ A ESC [ a ESC O a ESC O A +# Down ESC [ B ESC [ b ESC O b ESC O B +# Right ESC [ C ESC [ c ESC O c ESC O C +# Left ESC [ D ESC [ d ESC O d ESC O D +# KP_Enter ^M ESC O M +# KP_F1 ESC O P ESC O P +# KP_F2 ESC O Q ESC O Q +# KP_F3 ESC O R ESC O R +# KP_F4 ESC O S ESC O S +# XK_KP_Multiply * ESC O j +# XK_KP_Add + ESC O k +# XK_KP_Separator , ESC O l +# XK_KP_Subtract - ESC O m +# XK_KP_Decimal . ESC O n +# XK_KP_Divide / ESC O o +# XK_KP_0 0 ESC O p +# XK_KP_1 1 ESC O q +# XK_KP_2 2 ESC O r +# XK_KP_3 3 ESC O s +# XK_KP_4 4 ESC O t +# XK_KP_5 5 ESC O u +# XK_KP_6 6 ESC O v +# XK_KP_7 7 ESC O w +# XK_KP_8 8 ESC O x +# XK_KP_9 9 ESC O y +# +# The source-code for rxvt actually defines mappings for F21-F35, using +# "ESC [ 35 ~" to "ESC [ 49 ~". Keyboards with more than 12 function keys +# are rare, so this entry uses the shift- and control-modifiers as in +# xterm+pcfkeys to define keys past F12. +# +# kIC is normally not used, since rxvt performs a paste for that (shifted +# insert), unless private mode 35 is set. +# +# kDN, kDN5, kDN6, etc are extensions based on the names from xterm+pcfkeys -TD +# Removed kDN6, etc (control+shift) since rxvt does not implement this -TD +rxvt+pcfkeys|rxvt fragment for PC-style fkeys, + kDC=\E[3$, kEND=\E[8$, kHOM=\E[7$, kIC=\E[2$, kLFT=\E[d, + kNXT=\E[6$, kPRV=\E[5$, kRIT=\E[c, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kel=\E[8\^, kend=\E[8~, + kf21=\E[23$, kf22=\E[24$, kf23=\E[11\^, kf24=\E[12\^, + kf25=\E[13\^, kf26=\E[14\^, kf27=\E[15\^, kf28=\E[17\^, + kf29=\E[18\^, kf30=\E[19\^, kf31=\E[20\^, kf32=\E[21\^, + kf33=\E[23\^, kf34=\E[24\^, kf35=\E[25\^, kf36=\E[26\^, + kf37=\E[28\^, kf38=\E[29\^, kf39=\E[31\^, kf40=\E[32\^, + kf41=\E[33\^, kf42=\E[34\^, kf43=\E[23@, kf44=\E[24@, + khome=\E[7~, kind=\E[a, kri=\E[b, kDC5=\E[3\^, kDC6=\E[3@, + kDN=\E[b, kDN5=\EOb, kEND5=\E[8\^, kEND6=\E[8@, + kHOM5=\E[7\^, kHOM6=\E[7@, kIC5=\E[2\^, kIC6=\E[2@, + kLFT5=\EOd, kNXT5=\E[6\^, kNXT6=\E[6@, kPRV5=\E[5\^, + kPRV6=\E[5@, kRIT5=\EOc, kUP=\E[a, kUP5=\EOa, + use=vt220+vtedit, use=xterm+nopcfkeys, + +# rxvt was originally "xvt", first announced in April 1993: +# http://www.krsaborio.net/linux-desktops/research/1993/0416.html +#------------------------------------------------------------------------------ +# Article: 567 of comp.os.linux.announce +# Path: pavo.csi.cam.ac.uk!warwick!uknet!pipex!uunet!zaphod.mps.ohio-state.edu! +# caen!batcomputer!theory.TC.Cornell.EDU!mdw +# From: nation@rocket.sanders.com (Robert Nation) +# Newsgroups: comp.os.linux.announce +# Subject: xvt upload +# Date: 16 Apr 1993 18:13:07 GMT +# Organization: Cornell Theory Center +# Lines: 13 +# Approved: linux-announce@tc.cornell.edu (Matt Welsh) +# Message-ID: <1qmsvj$pvj@fitz.TC.Cornell.EDU> +# NNTP-Posting-Host: theory.tc.cornell.edu +# Keywords: xvt, xterm, Xwindows +# Originator: mdw@theory.TC.Cornell.EDU +# +# Rxvt has been uploaded to /pub/Linux/Incoming/rxvt.tar.z and +# rxvt.README on sunsite.unc.edu. +# +# Xvt is an xterm replacement which uses a little less memory, and is +# suitable for use on machines with small memories. Tek4010 support +# is removed. +# +# Modifications were made by Rob Nation (nation@rocket.sanders.lockheed.com) +# to make it a little more compact, and to add and remove certain features. +# +# +# -- +# Send submissions for comp.os.linux.announce to: linux-announce@tc.cornell.edu +#------------------------------------------------------------------------------ +# +# Though its change-log does not mention this, John Davis has stated that he +# was the author of the changes to use the bce ("new color model") which was +# incorporated into rxvt 2.11 (June 15, 1995). The change-log does not give +# dates, nor give developer's names. Initial color support was added for rxvt +# "2.0", which was sometime in 1994. +# +# rxvt had usable color support with 2.16 (April 2, 1996), with some help by my +# work on vttest, as well as bug reports to Mark Olesen. For instance, the fix +# mentioned here +# https://web.archive.org/web/20141016124430/http://web.archiveorange.com/archive/v/6ETvLb5wHtbbzCaS4S9J +# was from one of my bug-reports -TD +# +# While the color model both for xterm and rxvt was based on Linux console, +# Olesen (or possibly Davis) diverged in one respect from Linux's bce color +# behavior: inserting/deleting characters does not fill the newly empty cell +# with the default background color. +rxvt|rxvt-color|rxvt terminal emulator (X Window System), + ncv@, + hpa=\E[%i%p1%dG, kf0=\E[21~, sgr0=\E[m\017, + vpa=\E[%i%p1%dd, use=rxvt-basic, use=ecma+color, +rxvt-256color|rxvt 2.7.9 with xterm 256-colors, + use=xterm+256color, use=rxvt, +rxvt-88color|rxvt 2.7.9 with xterm 88-colors, + use=xterm+88color, use=rxvt, +rxvt-xpm|rxvt terminal emulator (X Window System with xpm), + use=rxvt, +rxvt-cygwin|rxvt terminal emulator (X Window System) on cygwin, + acsc=+\257\,\256-\^0\333`\004a\261f\370g\361h\260j\331k + \277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w + \302x\263y\363z\362{\343|\330}\234~\376, + use=rxvt, +rxvt-cygwin-native|rxvt terminal emulator (native MS Window System port) on cygwin, + acsc=+\257\,\256-\^0\333`\004a\261f\370g\361h\260j\331k + \277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v\301w + \302x\263y\363z\362{\343|\330~\376, + use=rxvt-cygwin, + +# This variant is supposed to work with rxvt 2.7.7 when compiled with +# NO_BRIGHTCOLOR defined. rxvt needs more work... +rxvt-16color|rxvt with 16 colors like aixterm, + ncv#32, use=ibm+16color, use=rxvt, + +#### MRXVT +# mrxvt 0.5.4 +# +# mrxvt is based on rxvt 2.7.11, but has by default XTERM_FKEYS defined, which +# makes its function-keys different from other flavors of rxvt -TD +# +# Testing with tack: +# + made custom description (below) to work, though it sets TERM=xterm. +# +# Testing with vttest: +# + While "based on" rxvt, some of the basic functionality is broken. The +# window collapses to a single line when running several of the screens +# in vttest, e.g., the tests for cursor movement, screen features, +# double-sized characters. +# + The VT52 test works properly, but this is an exception. Due to the +# other bug(s) most of vttest is untestable. +# + the color test using ECH shows a gap in the bce model, like rxvt. +# +# Testing with xterm "vttest" scripts: +# + resize.pl does not work because mrxvt does implement CSI 18 t +# (not in rxvt, but not documented by mrxvt) but not CSI 19 t. +# + none of the "dynamic colors" (OSC colors) scripts work. +mrxvt|multitabbed rxvt, + kEND=\E[8;2~, kHOM=\E[7;2~, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kend=\E[8~, khome=\E[7~, + kEND3=\E[8;3~, kEND4=\E[8;4~, kEND5=\E[8;5~, + kEND6=\E[8;6~, kEND7=\E[8;7~, kHOM3=\E[7;3~, + kHOM4=\E[7;4~, kHOM5=\E[7;5~, kHOM6=\E[7;6~, + kHOM7=\E[7;7~, use=xterm+r6f2, use=xterm+pcfkeys, + use=rxvt, + +mrxvt-256color|multitabbed rxvt with 256 colors, + use=xterm+256color, use=mrxvt, + +#### ETERM +# From: Michael Jennings +# +# Eterm 0.9.3 +# +# removed kf0 which conflicts with kf10 -TD +# remove cvvis which conflicts with cnorm -TD +# Eterm does not implement control/shift cursor keys such as kDN6, or kPRV/kNXT +# but does otherwise follow the rxvt+pcfkeys model -TD +# remove nonworking flash -TD +# remove km as per tack test -TD +Eterm|Eterm-color|Eterm with xterm-style color support (X Window System), + bce, bw, eo, mc5i, mir, xenl, xon, XT, + btns#5, lm#0, ncv@, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0, + hpa=\E[%i%p1%dG, ich=\E[%p1%d@, is1=\E[?47l\E>\E[?1l, + is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kNXT@, + kPRV@, ka1=\E[7~, ka3=\E[5~, kb2=\EOu, kbeg=\EOu, kc1=\E[8~, + kc3=\E[6~, kent=\EOM, khlp=\E[28~, kmous=\E[M, mc4=\E[4i, + mc5=\E[5i, rev=\E[7m, ri=\EM, rmam=\E[?7l, rmir=\E[4l, rmkx=, + rmso=\E[27m, rmul=\E[24m, + rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, + rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[? + 25h, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smir=\E[4h, smkx=, smso=\E[7m, + smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+csr, use=ansi+idl, + use=ansi+local, use=xterm+alt47, use=vt100+enq, + use=rxvt+pcfkeys, use=ecma+color, use=vt100+4bsd, + use=vt220+cvis, + +Eterm-256color|Eterm with xterm 256-colors, + use=xterm+256color, use=Eterm, + +Eterm-88color|Eterm with 88 colors, + use=xterm+88color, use=Eterm, + +#### ATERM +# Based on rxvt 2.4.8, it has a few differences in key bindings +aterm|AfterStep terminal, + XT, + kbs=^?, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, use=rxvt, + +#### XITERM +# xiterm 0.5-5.2 +# This is not based on xterm's source... +# vttest shows several problems with keyboard, cursor-movements. +# see also https://invisible-island.net/xterm/xterm.faq.html#bug_xiterm +xiterm|internationalized terminal emulator for X, + km@, use=klone+color, use=xterm-r6, + + +#### HPTERM +# HP ships this (HPUX 9 and 10), except for the pb#9600 which was merged in +# from BSD termcap. (hpterm: added empty , we have no idea what ACS +# chars look like --esr) +hpterm|X-hpterm|HP X11 terminal emulator (old), + am, da, db, mir, xhp, xon, + cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8, pb#9600, xmc#0, + acsc=, bel=^G, bold=\E&dB, cbt=\Ei, clear=\E&a0y0C\EJ, cr=\r, + cub1=^H, cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, + cuu1=\EA, dch1=\EP, dim=\E&dH, dl1=\EM, ed=\EJ$<1>, el=\EK, + hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL, ind=\n, kbs=^H, + kclr=\EJ, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, + khts=\E1, kich1=\EQ, kil1=\EL, knp=\EU, kpp=\EV, krmir=\ER, + ktbc=\E3, meml=\El, memu=\Em, + pfkey=\E&f%p1%dk%p2%l%dL%p2%s, + pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s, + pfx=\E&f2a%p1%dk%p2%l%dL%p2%s, + pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rev=\E&dB, ri=\ET, + rmacs=^O, rmir=\ER, rmkx=\E&s0A, rmln=\E&j@, rmso=\E&d@, + rmul=\E&d@, + sgr=\E&d%?%p7%t%{115}%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+ + %p5%{8}%*%+%{64}%+%c%?%p9%t%'\016'%c%e%'\017'%c%;, + sgr0=\E&d@\017, smacs=^N, smir=\EQ, smkx=\E&s1A, + smln=\E&jB, smso=\E&dJ, smul=\E&dD, tbc=\E3, + vpa=\E&a%p1%dY, use=hp+pfk-cr, use=hp+arrows, +# HPUX 11 provides a color version. +hpterm-color|HP X11 terminal emulator with color, + ccc, + colors#64, pairs#8, + home=\E&a0y0C, + initp=\E&v%p2%da%p3%db%p4%dc%p5%dx%p6%dy%p7%dz%p1%dI, + op=\E&v0S, scp=\E&v%p1%dS, use=hpterm, + +# http://bitsavers.trailing-edge.com/pdf/hp/9000_hpux/1986/97089-90081_198611_Facilities_for_Series_200_300_and_500.pdf +# http://bitsavers.trailing-edge.com/pdf/hp/9000_hpux/1987/97089-90081_198709_Facilities_for_Series_200_300_and_500_HP-UX_Concepts_and_Tutorials.pdf +# +# This article does not cover the HP 46020A keyboard that is used by the Model +# 217 and 237 computers. For information on this keyboard read the article, +# "The Series 300 ITE as System Console" found in the manual, HP-UX Concepts +# and Tutorials, Vol. 7. +# +# Possibly: +# http://bitsavers.trailing-edge.com/pdf/hp/9000_hpux/1986/97089-90042_198608_HP-UX_Concepts_and_Tutorials.pdf +# +# HP300_Series_ITE.pdf +# +# This version, which came from Martin Trusler, was tested with lynx using +# ncurses 5.4 +hpterm-color2|X-hpterm-color2|HP X11 terminal emulator with color (new), + OTbs, am, ccc, da, db, km, mir, xhp, + colors#8, cols#80, it#8, lh#2, lines#24, lm#0, lw#8, nlab#8, + pairs#8, xmc#0, + acsc=+>\,<-\^.v0\374``a\374f\372g\376h\374j+k+l+m+n+o-q-s-t+ + u+v+w+x|y{*|!}\273~\362, + bel=^G, bold=\E&dD, cbt=\Ei, clear=\EH\EJ, cr=\r, cub1=^H, + cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, + dch1=\EP, dim=\E&dH, dl1=\EM, ed=\EJ$<1>, el=\EK, + home=\E&a0y0C, hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL, + ind=\ES, + initp=\E&v0m%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e. + %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1 + %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%= + %t1%e.%p7%d%;z%p1%dI, + is1=\EH\EJ, kbs=^H, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ, + kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, knp=\EU, kpp=\EV, + krmir=\ER, ktbc=\E3, meml=\El, memu=\Em, + oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5 + I\E&v1b1c6I\E&v1x1y7I, + op=\E&v0S, pfkey=\E&f%p1%dk%p2%l%dL%p2%s, + pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s, + pfx=\E&f2a%p1%dk%p2%l%dL%p2%s, + pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rev=\E&dB, ri=\ET, + rmacs=^O, rmam=\E&s1C, rmcup=\E&s0A, rmir=\ER, rmkx=\E&s0A, + rmln=\E&j@, rmm=\E&k0I, rmso=\E&d@, rmul=\E&d@, rs1=\EE, + scp=\E&v%p1%dS, + sgr=\E&d%p1%p3%|%{2}%*%p2%p6%|%{4}%*%+%p5%{8}%*%+%{64}%+%c%? + %p9%t%'\016'%c%e%'\017'%c%;, + sgr0=\E&d@\017, smacs=^N, smam=\E&s0C, smcup=\E&s1A, + smir=\EQ, smkx=\E&s1A, smln=\E&jB, smm=\E&k1I, smso=\E&dB, + smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, use=hp+pfk-cr, + use=hp+arrows, +#### EMU +# This is for the extensible terminal emulator on the X11R6 contrib tape. +# It corresponds to emu's internal emulation: +# emu -term emu +# emu's default sets TERM to "xterm", but that doesn't work well -TD +# fixes: remove bogus rmacs/smacs, change oc to op, add bce, am -TD +# fixes: add civis, cnorm, sgr -TD +emu|emu native mode, + am, bce, mir, msgr, xon, + colors#15, cols#80, it#8, lines#24, pairs#64, vt#200, + acsc=61a\202f\260g2j\213k\214l\215m\216n\217o\220q\222s + \224t\225u\226v\227w\230x\231~\244, + bel=^G, blink=\EW, bold=\EU, civis=\EZ, clear=\EP\EE0;0;, + cnorm=\Ea, cr=\r, csr=\Ek%p1%d;%p2%d;, cub=\Eq-%p1%d;, + cub1=^H, cud=\Ep%p1%d;, cud1=\EB, cuf=\Eq%p1%d;, cuf1=\EC, + cup=\EE%p1%d;%p2%d;, cuu=\Ep-%p1%d;, cuu1=\EA, + dch=\EI%p1%d;, dch1=\EI1;, dl=\ER%p1%d;, dl1=\ER1;, + ech=\Ej%p1%d;, ed=\EN, el=\EK, el1=\EL, home=\EE0;0;, ht=^I, + hts=\Eh, il=\EQ%p1%d;, il1=\EQ1;, ind=\EG, + is2=\ES\Er0;\Es0;, kbs=^H, kcub1=\EC, kcud1=\EB, kcuf1=\ED, + kcuu1=\EA, kdch1=^?, kent=\r, kf0=\EF00, kf1=\EF01, + kf10=\EF10, kf11=\EF11, kf12=\EF12, kf13=\EF13, kf14=\EF14, + kf15=\EF15, kf16=\EF16, kf17=\EF17, kf18=\EF18, kf19=\EF19, + kf2=\EF02, kf20=\EF20, kf3=\EF03, kf4=\EF04, kf5=\EF05, + kf6=\EF06, kf7=\EF07, kf8=\EF08, kf9=\EF09, kfnd=\Efind, + kich1=\Eins, knp=\Enext, kpp=\Eprior, kslt=\Esel, + op=\Es0;\Er0;, rev=\ET, ri=\EF, rmir=\EX, rmso=\ES, rmul=\ES, + rs2=\ES\Es0;\Er0;, setab=\Es%i%p1%d;, + setaf=\Er%i%p1%d;, + sgr=\ES%?%p1%t\ET%;%?%p2%t\EV%;%?%p3%t\ET%;%?%p4%t\EW%;%?%p6 + %t\EU%;, + sgr0=\ES, smir=\EY, smso=\ET, smul=\EV, tbc=\Ej, + +# VT220 terminfo entry for the Emu emulation, corresponds to +# emu -term vt220 +# with NumLock set (to make the keypad transmit kf0-kf9). +# fixes: add am, xenl, corrected sgr0 -TD +emu-220|Emu-220 (vt200-7bit mode), + am, xenl, xon, + cols#80, it#8, lines#24, vt#200, + acsc=aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G, + blink=\E[0;5m, bold=\E[0;1m, clear=\E[2J\E[H, cr=\r, + cub1=\E[1D, cud1=\E[1B, cuf1=\E[1C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[1A, dch=\E[%p1%dP, + dch1=\E[1P, dl=\E[%p1%dM, dl1=\E[1M, ed=\E[0J, el=\E[0K, + el1=\E[1K, enacs=\E)0, home=\E[H, ht=^I, hts=\EH, + if=/usr/share/tabset/vt300, il=\E[%p1%dL, il1=\E[1L, + ind=\ED, is2=\E>\E[?1l\E[?3l\E[4l\E[?7h, kbs=^H, + kcmd=\E[29~, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, kent=\EOM, kf0=\EOp, kf1=\EOq, kf10=\EOl, + kf11=\EOm, kf12=\EOn, kf13=\EOP, kf14=\EOQ, kf15=\EOR, + kf16=\EOS, kf2=\EOr, kf26=\E[17~, kf27=\E[18~, kf28=\E[19~, + kf29=\E[20~, kf3=\EOs, kf30=\E[21~, kf34=\E[26~, + kf37=\E[31~, kf38=\E[32~, kf39=\E[33~, kf4=\EOt, + kf40=\E[34~, kf5=\EOu, kf6=\EOv, kf7=\EOw, kf8=\EOx, + kf9=\EOy, khlp=\E[28~, rev=\E[0;7m, ri=\EM, rmacs=^O, + rmcup=\E>, rmkx=\E>, rmso=\E[m, rmul=\E[m, + rs2=\E[4l\E[34l\E[?1l\E[?3l\E[?5l\E[?7h, + sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t; + 2%;%?%p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smcup=\E[?1l\E=, smkx=\E=, + smso=\E[0;7m, smul=\E[0;4m, tbc=\E[3g, use=ansi+csr, + use=ansi+local, use=vt220+vtedit, use=vt220+cvis, + +#### MVTERM +# A commercial product, Reportedly a version of Xterm with an OPEN LOOK UI, +# print interface, ANSI X3.64 colour escape sequences, etc. Newsgroup postings +# indicate that it emulates more than one terminal, but incompletely. +# +# This is adapted from a FreeBSD bug-report by Daniel Rudy +# It is based on vt102's entry, with some subtle differences, but also +# has status line +# supports ANSI colors (except for 'op' string) +# apparently implements alternate screen like xterm +# does not use padding, of course. +mvterm|vv100|SwitchTerm aka mvTERM, + km, mir, xenl, xon, + colors#8, pairs#64, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, ed=\E[J, + el=\E[K, ich=\E[%p1%d@, ich1=\E[@, kcub1=\EOD, kcud1=\EOB, + kcuf1=\EOC, kcuu1=\EOA, op=\E[100m, rev=\E[7m, ri=\EM, + rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + rs2=\E>\E[1;3;4;5;6l\E[?7h\E[100m\E[m\E[r\E[2J\E[H, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, + use=ansi+csr, use=ansi+idl, use=ansi+local, + use=xterm+alt47, use=vt100+fnkeys, use=vt100+4bsd, + use=x10term+sl, + +#### MTERM +# +# This application is available by email from . +# +# "mterm -type ansi" sets $TERM to "ansi" +mterm-ansi|ANSI emulation, + am, bw, mir, msgr, + it#8, + acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cr=\r, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, + dim=\E[2m, ech=\E[%p1%dX, home=\E[H, hpa=\E[%i%p1%d`, + ht=^I, ich1=, ind=\E[S, is2=\E)0\017, kbs=^H, nel=\EE, ri=\E[T, + rmacs=^O, rmso=\E[27m, rmul=\E[24m, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, vpa=\E[%i%p1%dd, use=ansi+erase, + use=ansi+idc1, use=ansi+idl, use=ansi+local, + use=ansi+sgrbold, use=ecma+index, + +# mterm normally sets $TERM to "mterm" +mterm|mouse-sun|Der Mouse term, + am, bw, mir, + it#8, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=^N, cuf1=^S, + cup=\006%p1%d.%p2%d., cuu1=^X, dch1=^Y, dl1=^K, ed=^B, el=^C, + home=^P, ht=^I, il1=^A, ind=^U, kbs=^H, ll=^R, nel=\r^U, ri=^W, + rmir=^O, rmso=^T, smir=^Q, smso=^V, +# "mterm -type decansi" sets $TERM to "decansi" +# +# note: kdch1, kfnd, kslt are in the source code, but do not work -TD +decansi|ANSI emulation with DEC compatibility hacks, + am, mir, msgr, xenl, + colors#8, it#8, pairs#64, + acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cr=\r, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, + dim=\E[2m, ech=\E[%p1%dX, enacs=\E(B\E)0, home=\E[H, + hpa=\E[%i%p1%d`, ht=^I, ich1=, ind=\E[S, is2=\E)0\E[r\017, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, + kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, nel=\EE, + op=\E[0m, ri=\E[T, rmacs=^O, rmam=\E[?7l, rmkx=\E[?1l\E>, + rmso=\E[27m, rmul=\E[24m, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, + vpa=\E[%i%p1%dd, use=ansi+cpr, use=ansi+csr, + use=ansi+erase, use=ansi+idc1, use=ansi+idl, + use=ansi+local, use=ansi+sgrbold, use=vt220+vtedit, + use=ecma+index, use=vt220+cvis, + +#### VWM +# http://vwm.sourceforge.net/ +# +# VWM 2.0.2 (2009-05-01) +# vwmterm is a terminal emulator written for the VWM console window manager. +# This version is obsolete, replaced by libvterm in 2.1.0 (2009-10-23). +vwmterm|VWM terminal, + am, bce, ccc, mir, msgr, npc, xenl, xon, + colors#8, pairs#64, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E[?25h, dim=\E[2m, home=\E[H, il1=\E[L, ind=\n, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kdch1=\E[3~, kend=\E[4~, kf1=\E[[A, kf10=\E[21~, + kf11=\E[22~, kf12=\E[23~, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, + kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, knp=\E[6~, kpp=\E[5~, rmacs=\E[10m, + rmam=\E[?7l, rs1=\E[H\E[J\E[m\Ec, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + sgr=\E[0;10%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;11%;m, + sgr0=\E[0;10m, smacs=\E[11m, smam=\E[?7h, smso=\E[3m, + smul=\E[4m, use=ansi+erase, use=ansi+local, use=ansi+sgr, + use=vt220+cvis, use=xterm+alt1049, + +#### MGR +# +# MGR is a Bell Labs window system lighter-weight than X. +# These entries describe MGR's xterm-equivalent. +# They are courtesy of Vincent Broman 14 Jan 1997 +# + +mgr|Bellcore MGR (non X) window system terminal emulation, + am, km, xon, + bel=^G, bold=\E2n, civis=\E9h, clear=^L, cnorm=\Eh, cr=\r, + csr=\E%p1%d;%p2%dt, cub1=^H, cud1=\Ef, cuf1=\Er, + cup=\E%p2%d;%p1%dM, cuu1=\Eu, cvvis=\E0h, + dch=\E%p1%dE$<5>, dch1=\EE, dl=\E%p1%dd$<3*>, + dl1=\Ed$<3>, ed=\EC, el=\Ec, hd=\E1;2f, ht=^I, hu=\E1;2u, + ich=\E%p1%dA$<5>, ich1=\EA, il=\E%p1%da$<3*>, + il1=\Ea$<3>, ind=\n, kbs=^H, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, nel=\r\n, rev=\E1n, rmam=\E5S, + rmso=\E0n, rmul=\E0n, sgr0=\E0n, smam=\E5s, smso=\E1n, + smul=\E4n, +mgr-sun|Mgr window with Sun keyboard, + ka1=\E[214z, ka3=\E[216z, kb2=\E[218z, kc1=\E[220z, + kc3=\E[222z, kcpy=\E[197z, kend=\E[220z, kent=\E[250z, + kf1=\E[224z, kf10=\E[233z, kf11=\E[234z, kf12=\E[235z, + kf2=\E[225z, kf3=\E[226z, kf4=\E[227z, kf5=\E[228z, + kf6=\E[229z, kf7=\E[230z, kf8=\E[231z, kf9=\E[232z, + kfnd=\E[200z, khlp=\E[207z, khome=\E[214z, knp=\E[222z, + kopn=\E[198z, kpp=\E[216z, kund=\E[195z, use=mgr, +mgr-linux|Mgr window with Linux keyboard, + ka1=\E[H, ka3=\E[5~, kb2=\E[G, kc1=\E[Y, kc3=\E[6~, + kdch1=\E[3~, kend=\E[4~, kf0=\E[[J, kf1=\E[[A, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf2=\E[[B, kf3=\E[[C, kf4=\E[[D, + kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, knp=\E[6~, kpp=\E[5~, use=mgr, + +#### SIMPLETERM +# st.suckless.org + +st|stterm|aka simpleterm, + use=st-0.8, + +# Reviewed 0.8.2: +# In tack, +# there is some problem turning off line-drawing +# shift+control function-keys do nothing; shift+control cursor keys work +# the padding tests make the terminal non-functional. +# In vttest, +# SD/SU work +# SL/SR/REP do not work +# ECMA-48 cursor movement works, e.g., CHA, CBT, etc. +# +# This entry discards the ccc/initc capabilities from st-0.7 because they +# belong in st-256color. +st-0.8|simpleterm 0.8, + kcbt@, kent@, oc=\E]104\007, Ms=\E]52;%p1%s;%p2%s\007, + kDN3=\E[1;3B, kDN5=\E[1;5B, kLFT3=\E[1;3D, kLFT5=\E[1;5D, + kNXT3=\E[6;3~, kNXT5=\E[6;5~, kPRV3=\E[5;3~, + kPRV5=\E[5;5~, kRIT3=\E[1;3C, kRIT5=\E[1;5C, + kUP3=\E[1;3A, kUP5=\E[1;5A, use=ecma+strikeout, + use=st-0.6, + +# Reviewed 0.7: +# dim is intermittent, sometimes works, sometimes does not +# italics may show up with yellow color +# has control cursor-keys, alt cursor-keys, still no combinations +# has control pageup/down +# tmux extensions, see TERMINFO EXTENSIONS in tmux(1) +# Se and Ss are implemented in the source-code, but the terminfo +# provided with the source is incorrect, since Se/Ss are mis-coded +# as booleans rather than strings. +st-0.7|simpleterm 0.7, + kcbt@, kent@, Ms=\E]52;%p1%s;%p2%s\007, kDN3=\E[1;3B, + kDN5=\E[1;5B, kLFT3=\E[1;3D, kLFT5=\E[1;5D, + kNXT3=\E[6;3~, kNXT5=\E[6;5~, kPRV3=\E[5;3~, + kPRV5=\E[5;5~, kRIT3=\E[1;3C, kRIT5=\E[1;5C, + kUP3=\E[1;3A, kUP5=\E[1;5A, use=ecma+strikeout, + use=st-0.6, use=xterm+256color, + +# st-0.4.1 +# +# This version uses a table which supports a single modifier (a subset of +# xterm's keys, using the same scheme). Because it supports only a single +# modifier in this table, function keys f36-f48 are normally unavailable +# because they are assigned to modifier-4. +# +# The program assigns TERM to match the program name (the upstream source says +# "st", but Debian renames it to "stterm"). +# +# The source includes two entries which are not useful here: +# st-meta| simpleterm with meta key, +# st-meta-256color| simpleterm with meta key and 256 colors, +# because st's notion of "meta" does not correspond to the terminfo definition. +# Rather, it acts like xterm - when the meta feature is disabled. +# +# Removed invis -TD +# Added eo, removed ul -TD +# +# Reviewed st 0.5: +# implements control-modifier, but not control-shift for special keys +# implements alt-modifier, but not alt-shift for special keys +# +# Reviewed st 0.6: +# http://git.suckless.org/st/log/st.info +# Tmux unofficial extensions, see TERMINFO EXTENSIONS in tmux(1) +# still has no function keys past kf36 (no combinations of modifiers) +# no application keypad mode, e.g, kent. +st-0.6|simpleterm 0.6, + bce, mir, npc, xenl, XT, + colors#8, pairs#64, + acsc=+C\,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyy + zz{{||}}~~, + clear=\E[H\E[2J, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, ech=\E[%p1%dX, + ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0, + flash=\E[?5h$<100/>\E[?5l, hpa=\E[%i%p1%dG, + ich=\E[%p1%d@, is2=\E[4l\E>\E[?1034l, kDC=\E[3;2~, + kEND=\E[1;2F, kHOM=\E[1;2H, kIC=\E[2;2~, kLFT=\E[1;2D, + kNXT=\E[6;2~, kPRV=\E[5;2~, kRIT=\E[1;2C, ka1=\E[1~, + ka3=\E[5~, kb2=\EOu, kbs=^?, kc1=\E[4~, kc3=\E[6~, kcbt=\E[Z, + kclr=\E[3;5~, kdl1=\E[3;2~, ked=\E[1;5F, kel=\E[1;2F, + khome=\E[1~, kil1=\E[2;5~, kind=\E[1;2B, kmous=\E[M, + kri=\E[1;2A, krmir=\E[2;2~, mc0=\E[i, mc4=\E[4i, mc5=\E[5i, + op=\E[39;49m, ri=\EM, rmacs=\E(B, rmir=\E[4l, + rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, rs1=\Ec, + rs2=\E[4l\E>\E[?1034l, setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p7%t;8%;m, + smacs=\E(0, smir=\E[4h, smkx=\E[?1h\E=, u8=\E[?1;2c, + vpa=\E[%i%p1%dd, Se=\E[2 q, Ss=\E[%p1%d q, + use=ansi+apparrows, use=ansi+csr, use=ansi+enq, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+sgrbold, use=vt100+4bsd, use=vt100+pfkeys, + use=vt220+pcedit, use=ecma+index, use=xterm+alt1049, + use=vt220+cvis, use=xterm+sl, use=ecma+italics, + use=ecma+strikeout, use=bracketed+paste, + use=xterm+pcf2, +# +# st-0.1.1 +# +# Note: the original terminfo description uses leading blank to persuade +# ncurses to use "st" as its name. Proper fix for that is to use "st" as an +# alias. +# +# Reading the code shows it should work for aixterm 16-colors +# - added st-16color +# +# Using tack: +# - set eo (erase-overstrike) +# - set xenl +# - tbc doesn't work +# - hts works +# - cbt doesn't work +# - shifted cursor-keys send sequences like rxvt +# - sgr referred to unimplemented "invis" mode. +# Fixes: add eo and xenl per tack, remove nonworking cbt, hts and tbc, invis +simpleterm|old-st|simpleterm 0.1.1, + am, eo, mir, msgr, ul, xenl, + cols#80, it#8, lines#24, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, + cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, + dch1=\E[P, ed=\E[J, el=\E[K, home=\E[H, hpa=\E[%i%p1%dG, + ht=^I, ich=\E[%p1%d@, ind=\n, kbs=^?, kdch1=\E[3~, + kend=\E[4~, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, knp=\E[6~, kpp=\E[5~, rev=\E[7m, rmso=\E[m, + rmul=\E[m, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;m, + sgr0=\E[0m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+csr, use=ansi+idl, use=vt220+cvis, + use=ecma+index, use=klone+color, use=xterm+acs, + +st-16color|stterm-16color|simpleterm with 16-colors, + use=ibm+16color, use=st, +# Tested with st 0.8.2 +# The issue with the titlebar is fixed, though st is very slow. +# In st 0.7, 256 colors "works", but when running xterm's test-scripts, some +# garbage is shown in the titlebar. +# +# terminal wants to use TERM=stterm-256color, but that is longer than 14 +# characters, making the choice nonportable. +st-256color|stterm-256color|simpleterm with 256 colors, + use=xterm+256color, use=st, + +#### TERMINATOR +# https://github.com/software-jessies-org/jessies/wiki/Terminator +# +# Tested using the Debian package org.jessies.terminator 6.104.3256 on 64-bit +# Debian/current -TD (2011/8/20) +# +# There were some packaging problems: +# a) using Java, the program starts off using 50Mb, and climbs from there, +# up to 114Mb after testing (no scrollback). +# b) it insists on reinstalling its terminal description in $HOME/.terminfo +# (two copies, just in case the host happens to be Mac OS X). +# I deleted this after testing with tack. +# +# Issues/features found with tack: +# a) tbc does not work (implying that hts also is broken). +# Comparing with the tabs utility shows a problem with the last tabstop on +# a line. +# b) has xterm-style shifted function-key strings +# meta also is used, but control is ignored. +# c) has xterm-style modifiers for cursor keys (shift, control, shift+control, +# meta) +# d) some combinations of shift/control send xterm-style sequences for +# insert/delete/home/end. +# e) numeric keypad sends only numbers (compare with vttest). +# f) meta mode (km) is not implemented. +# +# Issues found with ncurses test-program: +# a) bce is inconsistently implemented +# b) widths of Unicode values above 256 do not always agree with wcwidth. +# +# Checked with vttest, found low degree of compatibility there. +# +# Checked with xterm's scripts, found that the 256-color palette is fixed. +# +# Fixes: +# a) add sgr string +# b) corrected sgr0 to reset alternate character set +# c) modified smacs/rmacs to use SCS rather than SI/SO +# d) removed bce +# e) removed km +# +# Revisiting in May 2019, the Debian package was no longer available, and a +# developer-provided ".deb" does not work. However, a usable Windows ".msi" +# (which relies upon Cygwin) can be tested. The developers provide a terminfo, +# but some of the features it lists do not work reliably (bce, italics, invis). +# +# tack: +# tbc fails +# invis attribute fails +# key-definitions could be expanded, with some work: +# + supports xterm-style cursor key-modifiers for shift +# + supports xterm-style function key-modifiers for shift,control,alt +# + supports xterm-style editing key-modifiers for shift,control,alt +# (kbs=^?) +# ncurses test-program: +# "C" menu shows that bce implementation is incomplete +# italics did not work +# dim worked once in tack, but not in ncurses test-program +# "F" thick-line characters do not display +# vttest: +# terminal does not respond to 80/132-column switching +# wrapping at the right margin is erratic +# there are several problems in the cursor-movements and screen-features +# no VT52, no double-sized characters +# Device attributes response says it is a vanilla VT100 +# does not respond to xterm mouse controls +# alternate screen tests do not fill the screen, return wrong position +# window modify/report operations do not work +# miscellaneous ISO-6429 tests, e.g., REP, do not work +# CBT, CHT, HPR, CNL,CPL, VPR do not work +# +# removed the cancel for "hs", removed cbt, invis, corrected sgr -TD +# use xterm+256setaf, etc -TD +terminator|Terminator no line wrap, + bce, eo, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, lm#0, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[2m, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, + flash=^G, home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ind=\n, + is1=\E[?47l\E=\E[?1l, + is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, kbs=^?, + kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, rev=\E[7m, + ri=\EM, rmacs=\E(B, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, + rs1=\Ec, rs2=\E[!p\E[?3;4l\E[4l\E>, s0ds=\E(B, s1ds=\E(0, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p5%t;2%;%?%p1%p3%|%t;7 + %;m%?%p9%t\E(0%e\E(B%;, + sgr0=\E[m\E(B, smacs=\E(0, smir=\E[4h, smso=\E[7m, + smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, use=ansi+arrows, + use=ansi+csr, use=ansi+enq, use=ansi+idl, use=ansi+local, + use=vt220+pcedit, use=ecma+italics, use=ecma+index, + use=xterm+256setaf, use=xterm+sl-twm, + use=xterm+alt1049, use=vt220+cvis, use=bracketed+paste, + +#### TERMINOLOGY +# https://www.enlightenment.org/about-terminology +# https://github.com/borisfaure/terminology +# +# 2014/10/14: +# Tested terminology-0.3.0, 0.6.1, using tack and vttest. This is not a VT100 +# emulator, nor is it compatible with xterm, but it uses a few features from +# both -TD +# +# General comments: +# cursor does not fill on focus +# there are pervasive problems with clearing/erasing parts of the screen +# resizing the window causes it to stop listening to the keyboard +# tack - +# doesn't understand VT100 CPR needed for resize +# no CBT +# no cvvis +# has invis +# no blink +# uses bce model for colors, but (see below) fails the vttest screens +# has partial support for 256color feature. +# tack function-keys (a subset of xterm+pcf0), and +# tack cursor-keys (a subset of xterm+pce2): +# ctrl+shift (ignored) +# 2 shift +# shift-alt modifier -> shift (2) +# 3 alt +# 4 +# 5 ctrl +# tack modifiers did not work for fkeys in 0.3.0; subset works in 0.6.1 +# ctrl + khome/kend works - none of the other modifiers do +# vttest - +# spits lots of messages from termptyesc.c especially in vttest. +# no 132-column mode +# fails menu 1, 2 (definitely not VT100-compatible) +# primary (claims VT420 with several options, apparently none work) and +# secondary report says (perhaps... VT420): \E[>41;285;0c +# CHA, HPR, VPA, CNL, CPL work +# BCE with ED/EL - fail +# BCE with ECH/indexing - fail +# SD/SU work +# unlike teken, background light/dark works +# can set title +# X10 and Normal mouse work +# Any-event mouse works +# Mouse button-event works +# +# This description uses xterm+pcf0, which is misleading because the program +# does not handle combinations of modifiers - but listing them all would +# involve more effort than its developers spent -TD +terminology-0.6.1|EFL-based terminal emulator (0.6.1), + mc5i@, + blink@, ed@, el@, el1@, invis=\E[8m, kLFT=\E[1;2D, + kRIT=\E[1;2C, kind=\E[1;2B, kri=\E[1;2A, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p7%t;8 + %;m%?%p9%t\016%e\017%;$<2>, + vpa=\E[%i%p1%dd, kDC3=\E[3;3~, kDC4=\E[3;4~, + kDC5=\E[3;5~, kDC6=\E[3;6~, kDC7=\E[3;7~, kDN=\E[1;2B, + kDN3=\E[1;3B, kDN4=\E[1;4B, kDN5=\E[1;5B, kDN6=\E[1;6B, + kDN7=\E[1;7B, kEND5=\E[1;5F, kHOM5=\E[1;5H, + kLFT3=\E[1;3D, kLFT4=\E[1;4D, kLFT5=\E[1;5D, + kLFT6=\E[1;6D, kLFT7=\E[1;7D, kRIT3=\E[1;3C, + kRIT4=\E[1;4C, kRIT5=\E[1;5C, kRIT6=\E[1;6C, + kRIT7=\E[1;7C, kUP=\E[1;2A, use=ansi+enq, use=xterm+pcf0, + use=vt100, use=xterm+256setaf, + +# 2017-11-11: +# Tested terminology 1.0.0 +# +# tack - +# Shifted cursor-keys send nothing, but xterm modifiers for control+shift +# and control+alt were added like xterm+pcc2 +# Editing keys have some features from xterm+pce2 +# Changed from xterm+pcf0 to xterm+pcf2 +# +# vttest - +# REP, SL, SR fail +# +# Aside from the partial fixes for function/cursor/editing keys, no improvement +# in other tests versus 0.6.1 +terminology-1.0.0|EFL-based terminal emulator (1.0.0), + dim=\E[2m, flash=\E[?5h$<100/>\E[?5l, kend=\E[OF, + khome=\E[OH, rmacs=\E(B, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%; + %?%p1%p3%|%t;7%;%?%p7%t;8%;m$<2>, + sgr0=\E(B\E[m, smacs=\E(0, use=ecma+italics, + use=vt220+cvis, use=xterm+x11mouse, use=xterm+pce2, + use=xterm+pcf2, use=xterm+pcc2, use=bracketed+paste, + use=terminology-0.6.1, + +# 2020/12/26: +# Tested terminology 1.8.1 using tack and vttest. +# tack - +# flash does not work +# italics and crossed-out text work +# no meta mode +# vttest - +# DA1 says this is a VT420 with with 132 columns, NRCS, horizontal scrolling +# DA2 says this is a VT510, version 33.7 +# NRCS does not work, program hangs in the locking shift test. +# some of the VT420 rectangle operations work +# left/right margins do not work +# most of DECSCUSR works +# most problems with bce are fixed. +terminology-1.8.1|EFL-based terminal emulator (1.8.1), + km@, + cvvis@, flash@, initc@, kcbt=\E[Z, rmm@, smm@, Ms@, + use=linux+kbs, use=ecma+index, use=xterm+256setaf, + use=ansi+rep, use=ecma+strikeout, use=xterm+focus, + use=xterm+sm+1006, use=xterm+pcfkeys, use=xterm+tmux, + use=vt220+cvis, use=ecma+italics, use=xterm-basic, + use=report+version, + +terminology|EFL-based terminal emulator, + use=terminology-1.8.1, + +######## OPENGL CLIENTS + +#### Alacritty +# https://github.com/jwilm/alacritty +# Version 0.6.0 (2020/11/25) +# Version 0.4.0 (2019/11/25) +# Version 0.3.3 (2019/08/03) +# Version 0.2.1 (2018/10/03) +# Project started in 2016/02, uses Rust and OpenGL, and in contrast to (most X +# terminal programs) is not designed to run with a remote server. +# +# Packaged in Arch Linux - +# vttest: +# initial screensize 24x80 +# no DECCOLM (does not switch between 80/132 columns) +# otherwise, passes wrapping test +# no DECSCNM +# identifies as a VT102 +# numeric keypad does not send expected codes (seen in 0.4.0) +# passes bce test +# vt220: +# ECH works in 0.3.3 (0.2.1 left text on right margin) +# no SRM, DECSCA +# vt320: +# fails DECXCPR +# does not implement any of the DECRQM/DECRPM controls +# does not implement any of the DECRQSS controls +# vt420: +# no DECLRMM +# no DECBI, DECFI +# other: +# fails CHT, otherwise ECMA-48 cursor movement ok +# fails ERM/SPA, SL, SR, passes REP, SD, SU +# xterm: +# no X10 mouse +# has normal and highlight mouse +# has any-event and button-event mouse +# + does support SGR-mouse +# + does not correctly support focus in/out events (seen in 0.4.0) +# cursor-position wrong after alternate-screen (fixed in 0.4.0) +# none of the dtterm controls work +# tack: +# bell and flash do not work +# blink does not work +# italics and crossed-out work (latter did not work in 0.2.1) +# function-keys work up (tested combinations which window manager allows) +# treats meta as escape-prefix +# +# The program sources include "alacritty" and "alacritty-direct", which are +# copied from "xterm-256color" and "xterm-direct" (but using semicolon for +# subparameter delimiter). Refactored here to use ncurses building blocks -TD +alacritty|alacritty terminal emulator, + rs1=\Ec\E]104\007, use=xterm+256color, + use=alacritty+common, + +alacritty-direct|alacritty with direct color indexing, + use=xterm+indirect, use=alacritty+common, + +# cancel km, since it is not actually meta mode -TD +# added ecma+strikeout in 0.3.3 -TD +# added xterm+sl-twm in 0.3.3 -TD +alacritty+common|base fragment for alacritty, + km@, npc, + kb2=\EOE, kcbt=\E[Z, kent=\EOM, Se=\E[0 q, + Smulx=\E[4:%p1%dm, use=ecma+index, use=xterm+focus, + use=xterm+sm+1006, use=xterm-basic, use=xterm+app, + use=ansi+rep, use=xterm+tmux, use=ecma+strikeout, + use=xterm+sl-twm, use=ecma+italics, use=xterm+pce2, + use=xterm+pcc2, use=xterm+pcf2, use=bracketed+paste, + +# https://github.com/raphamorim/rio +# derived from alacritty +rio|fork of alacritty, + use=alacritty, +rio-direct|fork of alacritty, + use=alacritty-direct, + +#### Kitty +# https://github.com/kovidgoyal/kitty +# Project started in 2016/10 (see alacritty), but is a Python script rather +# than Rust, using OpenGL. The same caveats regarding remote connections +# apply. This is not an X terminal, though (like alacritty), it copies +# features from xterm. +# +# Regarding the name "kitty", that is a pun, reflected in the description. +# But see +# http://www.9bis.net/kitty/ +# https://github.com/kovidgoyal/kitty/issues/9 +# https://github.com/kovidgoyal/kitty/issues/1025 +# and +# http://lists.gnu.org/archive/html/bug-ncurses/2018-09/msg00005.html +# https://github.com/kovidgoyal/kitty/issues/879 +# +# Version 0.21.2 (June 28, 2021) +# changes since 0.19.1 +# Notes: +# Repeatable tests with tack and vttest assume a standard screensize -- +# measured in characters. However, kitty uses pixel-measurements and +# does not readily use characters. +# Resizing with twm shows only pixel-based hint rather than characters +# manual page states that it is possible to override initial window size, +# but configuration file has no effect on initial window size. +# The same problem with XFCE4, but editing the cached json file works +# for setting the window size (the "c" suffix for cells does not): +# {"window-size": [720, 440]} +# though the values depend upon the font in use. +# vttest +# tack +# flash works +# invisible text still does not work +# function/special key modifiers finally work +# +# Version 0.19.1 (October 6, 2020) +# changes since 0.13.3: +# vttest +# ISO-6429 +# REP works, though using unspecified behavior +# xterm +# xterm's SGR-mouse mode is recognized. +# does recognize original alternate-screen +# bug: mouse focus in/out does not work. +# bug: X10 mouse mode responds like any-event +# bug: highlight-tracking does not work; terminal hangs. +# +# tack +# rs1 adds an empty string for resetting title- and other OSC-strings. +# italics work +# +# Version 0.13.3 (January 19, 2019) +# Notes: +# initial screensize 71x22 +# does not respond to "resize -s" +# resizing with window manager gives no clues +# vttest +# does not switch between 80/132 columns +# fails wrapping test, copying vte/rxvt +# no reverse-background, no blink +# claims to be VT200: +# primary \E[?62;c +# secondary \E[>1;4000;12c +# however - +# no GR in the locking-shifts screen +# no NRCS or ISO-2022, anyway +# no VT52 +# VT220: +# has DECTCEM, ECH, but no SRM and DECSCA +# has operating condition report, none of the others +# VT320: +# has SU/SD +# DECRQSS ok for DECSTBM, SGR, none of the others +# no status-line +# VT420: +# DECXCPR device status works, none of the others +# no left/right margins +# has DECCARA, but not DECERA, DECFRA, DECRARA, DECSERA +# inside of DECCARA is uncolored +# line-drawing with DECCARA does not work +# aside from left/right margins, editing sequences look ok +# no DECFI, DECBI +# color: +# fails ECH test for bce +# ISO-6429 +# fails REP, SL, SL, but other cursor-movement ok +# xterm: +# does not recognize original alternate-screen +# cursor-position wrong after alternate-screen +# has normal mouse, any-event, any-button, but +# no X10 mouse +# no mouse-highlight tracking +# no DEC locator +# dtterm - only supports report-size chars/pixels +# recognizes tcap-query +# tack: +# flash doesn't work +# italics do not work +# bce should be set (but see vttest) +#* developer's terminfo stopped at kf25, but the program continues, +# copying xterm for the rest of the control+fkey sequence +# (but only one modifier is supported, like iTerm2). +#* it omitted shifted pageup/down +#* control+editing keys work +# In contrast to function-keys, some additional modifier combinations +# act like xterm for the editing/cursor-keys, e.g., alt+shift. While +# the implementation is incomplete, the building-blocks are consistent +# with what has been implemented -TD +# DECKPAM does not work -TD +#* ka1, ka3, kc1, kc3 were bogus (removed) +#* meta sends escape (removed kmm) -TD +#* cvvis does not make cursor "more visible" -TD +kitty|KovId's TTY, + use=xterm+256color, use=kitty+common, +kitty-direct|KovId's TTY using direct colors, + oc=\E]104\007, use=xterm+direct2, use=kitty+common, +kitty+common|KovId's TTY common properties, + am, mc5i, mir, msgr, npc, xenl, + cols#80, lines#24, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[2m, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ich=\E[%p1%d@, ind=\n, kBEG=\E[1;2E, kbeg=\EOE, kbs=^?, + kcbt=\E[Z, op=\E[39;49m, rev=\E[7m, ri=\EM, rmacs=\E(B, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l, rmso=\E[27m, + rmul=\E[24m, rs1=\E]\E\\\Ec, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%; + %?%p1%p3%|%t;7%;m, + sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, + Smulx=\E[4:%p1%dm, use=ansi+csr, use=ansi+enq, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+rep, use=xterm+focus, use=xterm+sm+1006, + use=ecma+index, use=xterm+pcfkeys, use=xterm+sl-twm, + use=ecma+strikeout, use=ecma+italics, + use=xterm+alt1049, use=att610+cvis, use=xterm+tmux, + use=bracketed+paste, use=report+version, + +kitty+setal|set underline colors (nonstandard), + setal=\E[58:2::%p1%{65536}%/%d:%p1%{256}%/%{255}%&%d:%p1 + %{255}%&%dm, + +######## WAYLAND CLIENTS + +#### Foot +# https://codeberg.org/dnkl/foot/ +# Version 1.18.1 2024/08/17 +# +# vttest: +# device attributes list 28=rectangular editing +# supports rectangle operations, but problems with left/right margins +# reports window-size, but not icon or window label +# numeric keypad has no application-mode +# +# Version 1.8.2 2021/07/31 +# +# This identifies as a VT220 with 4=sixel and 22=color, however: +# tack: +# bell does not work +# status-line does not work because foot does not set the window title +# sends escape when meta key is used, whether or not smm/rmm enabled +# vttest: +# wrap-test fails +# no application-mode for numeric keypad (unless private mode 1035 is set) +# no NRCS +# no VT52 +# no SRM +# protected areas do not work +# SU/SD work, SL/SR do not +# DECRPM responds, but not the corresponding ANSI reports. +# otherwise few reports, except cursor-position and mouse and some dtterm +# VT520 cursor-movement works, except for left/right margins +# supports xterm/DECSCUSR, though default case in vttest does not blink +# Send: <27> [ 0 <32> q +# Text: The cursor should be a blinking rectangle +# partial support for xterm mouse any-event mode and button-event mode: +# + does not report focus-in/focus-out +# + does not report buttons 6/7 +# alternate-screen works +foot|foot terminal emulator, + oc=\E]104\E\\, use=xterm+256color2, use=foot+base, + +foot-direct|foot with direct color indexing, + use=xterm+direct, use=foot+base, + +foot+base|foot base fragment, + am, bce, bw, mir, msgr, npc, xenl, AX, XT, + cols#80, it#8, lines#24, + bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, dim=\E[2m, + ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, + flash=\E]555\E\\, ind=\n, is2=\E[!p\E[4l\E>, kbs=^?, + kcbt=\E[Z, nel=\EE, oc=\E]104\E\\, op=\E[39;49m, ri=\EM, + rmam=\E[?7l, rmkx=\E[?1l\E>, rmm=\E[?1036h\E[?1034l, + rmso=\E[27m, rmul=\E[24m, rs1=\Ec, rs2=\E[!p\E[4l\E>, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%; + %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, smam=\E[?7h, smkx=\E[?1h\E=, + smm=\E[?1036l\E[?1034h, E3=\E[3J, Smulx=\E[4:%p1%dm, + rv=\E\\[>1;[0-9][0-9][0-9][0-9][0-9][0-9];0c, + xr=\EP>\\|foot\\([0-9]+\\.[0-9]+\\.[0-9]+(-[0-9]+-g[a-f[0-9] + +)?\\)?\E\\\\, + use=att610+cvis, use=ansi+csr, use=ansi+cup, + use=ansi+enq, use=ansi+local, use=ansi+idc, use=ansi+idl, + use=ansi+rca2, use=ansi+rep, use=ansi+tabs, + use=ansi+sgrbold, use=ecma+index, use=ecma+italics, + use=ecma+strikeout, use=kitty+setal, use=xterm+acs, + use=xterm+alt+title, use=xterm+pcfkeys, + use=xterm+sm+1006, use=xterm+tmux2, use=xterm+sl-alt, + use=bracketed+paste, use=report+version, + use=xterm+focus, + +######## WEB CLIENTS + +#### DomTerm +# https://domterm.org +# +# Quoting its webpage: +# The domterm command runs a server that manages sessions (usually shell +# processes). The user interface and terminal emulation is handled by a +# JavaScript library that can run in a regular web browser or an embedded +# browser such as Electron, using Web Sockets to talk to the server. +# +# it can connect to, and display in, a web browser, or as a standalone Qt +# application. Either way, it displays in the current desktop session. +# +# Testing AppImage for 3.2.0, on Fedora 40: +# + appears to implement erase-display by painting a double-line on the screen, +# doesn't use full screen for ded though it sort-of works for vi. +# + sets TERMINFO in its shell (imitating iTerm2), and TERM=domterm-xterm which +# doesn't work when doing sudo. According to the git log, that was April 1, +# 2023. The VTE developers copied the feature (i.e., a partially workable +# private terminal database) in February 2024. +# + the canonical name for the terminal description is still "domterm", and +# presumably the "domterm-xterm" alias is a workaround for hardcoded scripts +# that look for "xterm". +# + almost all of the differences between ncurses's "domterm" and DomTerm's +# are additions, but (read further) most are untestable due to breakage in +# the program. +# + DomTerm's updated terminal description says it implements italics, but +# + hangs in tack when doing blink (just before testing italics) +# + vttest, ncurses test-program also fare badly, e.g., due to improper line +# wrapping and/or inability to consistently clear the screen. +# +# The review of DomTerm 3.2.0 was prompted by noticing this page +# https://domterm.org/Wire-byte-protocol.html +# which goes on at length for extensions which collide with a commonly-used +# control for restoring a saved cursor position: +# CSI u Restore cursor (SCORC, also ANSI.SYS). +# +# Testing current code (2019/07/06) with Fedora 30: +# tack +# no flash +# no beep +# no dim +# no blink +# no invis +# no italics +# ok smxx/rmxx +# bce screen shows diagonal lines... +# kf6 sends nothing +# kf11 toggles maximize +# cursor-key application mode works +# numeric keypad application does not work; keys always send face-codes +# sends utf-8 for meta, like xterm +# vttest +# has problems with menu #1 (wrapping) +# DA = VT200 with 132 columns, color +# DA2 = 990, 100300 ("\E[>990;100300;0c") +# no VT52, no double-size characters +# vt220 ECH test works, SRM, DECSCA do not +# S7C1T/S8C1t does not work +# DECUDK does not work +# CNL does not work; the other ECMA-48 cursor-movement tests work +# REP sort-of works (does not match xterm) +# SD/SU work, but not SL/SR +# window reporting: works for size in chars/pixels, but not other tests +# X10 mouse clicks work -- but return 4 rather than 1 for codes +# any-event mouse mode acts like any-button mode +# implements SGR mouse-mode +# other: +# does not implement initc +# does accept either colons or semicolon in 38/48 SGR. +domterm|DomTerm web client, + npc, + bel@, blink@, dim@, invis@, kcbt=\E[Z, ritm@, rmkx=\E[?1l, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;m, + sitm@, smkx=\E[?1h, use=linux+kbs, use=xterm+256setaf, + use=ecma+index, use=xterm+focus, use=xterm+sm+1006, + use=xterm+pcfkeys, use=xterm-basic, + use=bracketed+paste, + +######## Miscellaneous + +#### WezTerm +# https://wezfurlong.org/wezterm/ +# https://github.com/wez/wezterm +# +# which says: +# "wezterm is a terminal emulator with support for modern features +# such as fonts with ligatures, hyperlinks, tabs and multiple windows." +# +# The documentation bears mention. It refers to the "ANSI" standard and +# https://wezfurlong.org/wezterm/what-is-a-terminal.html#ansi-and-ecma-48 +# X3.64 (withdrawn long ago). A related website +# https://github.com/wez/ecma48 +# states that ECMA-48 was issued in 1979 and not revised since. Actually that +# was the second revision; the fifth revision in 1991 is current. The source +# code refers to the second revision in a half-dozen places. Further, there +# are three times as many references to Wikipedia as to xterm's documentation. +# The git commit comments in several instances hint at an incomplete reading +# of the relevant standards. +# +# wezterm-20240203-110809-5046fc22 tested with MacOS +# General: +# + initial screensize is now 80x24 +# tack: +# + no change +# wraptest: +# + erasures (EL, ED, DCH, ICH, ESC) do not cancel wrap +# vttest: +# + some of the problems with debris have been fixed +# +# wezterm-20230712_072601_f4abf8fd-1.fedora38.x86_64 +# tested with MacOS and Fedora 38/39. +# +# General: +# + written in Rust. +# + initial screensize is odd, i.e., 81x24 +# provides no visual feedback on resize +# ignores "resize -s" +# manual resize and then running resize got off-by-one adjustment +# + leaves debris (unerased cells) when switching between normal/alternate +# screens. +# + sets TERM=xterm-256color +# tack: +# + misplaced message in "am" screen +# + fails xenl (should be false) +# + cvvis is same as cnorm, block +# + has blink and dim +# + in bce test, blue isn't really blue but some pale purple +# + modified keys mostly work, but its tab control interferes with some +# + rmm/smm don't work (always uses escape-prefix) +# wraptest: +# + poor (doesn't copy anyone, most of the results are wrong) +# vttest: +# + DA is VT5xx with sixel, selective erase, user windows, color +# + DA2 is VT220 version 277, perhaps a reference to xterm #277 +# + only the VT100 character set works, contrary to DA/DA2. +# + no NRCS, either +# + double-sized character work, with some debris +# + doesn't switch between 80/132 columns. +# + numeric keypad ANSI application mode escapes don't work. +# + numeric keypad ANSI mode misses "0", ".", "," +# + uses PC-style editing keypad \E[H and \E[F for Find and Select +# + no VT52 +# + DECSED selective erase doesn't work +# + SRM doesn't work +# + 8-bit controls don't work +# + DECNCSM doesn't work +# + most DECRQSS do not work (DECSCL, DECSTBM, DECSLRM respond) +# + DECRQM/DECRPM don't work (most reply permanently reset) +# + DECLRMM responds to DECRPM, but VT420 rectangle tests do not work. +# Some of the left/right margin tests work with the cursor-movement screen, +# but DECFI/DECBI do not work. The other cursor-movement tests are buggy. +# + implements ECMA-48 cursor movement, but not SL/SR or protected area +# + implements xterm normal, any-event and button-event mouse, none of the rest +# + reports window size, none of the other window reports +wezterm|Wez's Terminal Emulator, + am, bce, km, mir, msgr, npc, xenl, + acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, ech=\E[%p1%dX, + el1=\E[1K, flash=\E[?5h$<100/>\E[?5l, ind=\n, + is2=\E[!p\E[?3;4l\E[4l\E>, kbs=^?, kcbt=\E[Z, kend=\EOF, + op=\E[39;49m, ri=\EM, rmacs=\E(B, rmam=\E[?7l, + rmkx=\E[?1l\E>, rmso=\E[27m, rmul=\E[24m, + rs1=\Ec\E]104\007, rs2=\E[!p\E[?3;4l\E[4l\E>, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%; + %?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, smacs=\E(0, smam=\E[?7h, smkx=\E[?1h\E=, + u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?%[;0123456789]c, + u9=\E[c, Smol=\E[53m, Smulx=\E[4:%p1%dm, + xr=\EP>\\|WezTerm\\([1-9][0-9-]+\\)\E\\\\, + use=ansi+apparrows, use=ansi+csr, use=ansi+cup, + use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, use=ansi+rca2, + use=ansi+rep, use=ansi+sgrdim, use=bracketed+paste, + use=ecma+index, use=ecma+italics, use=ecma+strikeout, + use=report+version, use=vt220+cvis, + use=xterm+256color2, use=xterm+alt+title, + use=xterm+focus, use=xterm+pcc2, use=xterm+pce2, + use=xterm+pcf2, use=xterm+sl-alt, use=xterm+sm+1006, + use=xterm+tmux, + +#### Contour +# https://github.com/contour-terminal/contour +# +# "Modern C++ Terminal Emulator" +# Contour is a modern and actually fast, modal, virtual terminal emulator, +# for everyday use. It is aiming for power users with a modern feature mindset. +# +# That is three occurrences of "modern" too many -TD +# +# MacOS +# - cannot run, because the package is not signed. +# +# Fedora rawhide +# contour-terminal-0.3.12.262-6.fc39.x86_64 +# - dumps core, cannot test +# +# Fedora 39 +# contour-terminal-0.4.0.6245-1.fc38.x86_64 +# - starts but doesn't display +# +# Fedora 38 +# contour-terminal-0.4.0.6245-1.fc38.x86_64 +# - starts but doesn't display +# contour-terminal-0.3.12.262-1.fc38.x86_64 +# + testable (see below) +# + initial screensize 62x23, no visual feedback on resize, no "resize -s" +# +# Sets TERM=contour (which is preferable to xterm). +# +# tack: +# + cvvis is same as cnorm, "|" +# + sitm/ritm don't work +# + rmm/smm don't work (always uses escape, but terminfo defines km) +# + initp interchanges red/blue (bug in tack?) +# + modified F1-F4 are wrong, sending SS3 with modifier numbers +# + shifted editing-keypad doesn't send anything +# + meta key doesn't work +# + status-line works (based on xterm, including window-resizing) +# + dots don't line up for home test +# +# wraptest: +# + poor 7/25 differences from xterm (perhaps copying iTerm2) +# +# vttest: +# + hangs in menu 1, etc., when it tries to resize +# +# infocmp vs xterm-256color +# + missing XM/xm +# + rmcup/smcup doesn't use title-stack (but is implemented) +# + doesn't use SGR mouse (but is implemented) +# + sgr doesn't define dim, but dim capability is in terminfo (implemented) +# +# Developer's terminfo (compiled-in) uses some extensions. +contour|contour-latest|Contour Terminal Emulator, + am, bce, eslok, hs, km, mc5i, mir, msgr, npc, xenl, xvpa, + cols#80, lines#24, pairs#0x7fff, + bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + dim=\E[2m, dsl=\E[$~, ech=\E[%p1%dX, el1=\E[1K, + flash=\E[?5h$<100/>\E[?5l, fsl=\E[$}, hpa=\E[%i%p1%dG, + ind=\n, indn=\E[%p1%dS, invis=\E[8m, ka1=, ka3=, kbs=^?, kc1=, + kc3=, kcbt=\E[Z, kend=\EOF, khlp=, kmous=\E[M, kund=, + oc=\E]104\E\\, op=\E[39;49m, rev=\E[7m, ri=\EM, + rin=\E[%p1%dT, rmam=\E[?7l, rmkx=\E[?1l, rmso=\E[27m, + rmul=\E[24m, rs1=\E]\E\\\Ec, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, smam=\E[?7h, smkx=\E[?1h, smso=\E[7m, + smul=\E[4m, tsl=\E[2$~\E[1$}\E[H\E[2J, vpa=\E[%i%p1%dd, + Cs=\E]12;%p1%s\E\\, E3=\E[3J, Rmol=\E[55m, Se=\E[ q, + Smol=\E[53m, Smulx=\E[4:%p1%dm, Ss=\E[%p1%d q, + use=ansi+apparrows, use=ansi+cup, use=ansi+csr, + use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, use=ansi+rep, + use=att610+cvis, use=ecma+italics, use=ecma+strikeout, + use=xterm+256color, use=xterm+acs, use=xterm+alt1049, + use=xterm+pcc2, use=xterm+pce2, use=xterm+pcf2, + +contour-direct|Contour terminal with direct colors, + use=xterm+direct, use=contour, + +######## UNIX VIRTUAL TERMINALS, VIRTUAL CONSOLES, AND TELNET CLIENTS +# + +# Columbus UNIX virtual terminal. This terminal also appears in +# UNIX 4.0 and successors as line discipline 1 (?), but is +# undocumented and does not really work quite right. +cbunix|cb unix virtual terminal, + OTbs, am, da, db, + cols#80, lines#24, lm#0, + bel=^G, clear=\EL, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EG%p2%c%p1%c, cuu1=\EA, dch1=\EM, dl1=\EN, ed=\EL, + el=\EK, ich1=\EO, il1=\EP, ind=\n, khome=\EE, rmso=\Eb^D, + rmul=\Eb^A, smso=\Ea^D, smul=\Ea^A, use=vt52+arrows, +# (vremote: removed obsolete ":nl@:" -- esr) +vremote|virtual remote terminal, + am@, + cols#79, use=cbunix, + +pty|4bsd pseudo teletype, + cup=\EG%p1%{32}%+%c%p2%{32}%+%c, rmso=\Eb$, rmul=\Eb!, + smso=\Ea$, smul=\Ea!, use=cbunix, + +#### Emacs + +# https://www.emacswiki.org/emacs/AnsiTerm +# https://github.com/emacs-mirror/emacs/blob/master/lisp/term.el +# +# The codes supported by the term.el terminal emulation in GNU Emacs 19.30 +eterm|GNU Emacs term.el terminal emulation, + am, mir, xenl, + cols#80, lines#24, + bel=^G, bold=\E[1m, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, + cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + el1=\E[1K, home=\E[H, ht=^I, ich=\E[%p1%d@, ind=\n, + rev=\E[7m, rmir=\E[4l, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smir=\E[4h, smso=\E[7m, smul=\E[4m, use=ansi+cpr, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=xterm+alt47, + +# The codes supported by the term.el terminal emulation in GNU Emacs 22.2 +eterm-color|Emacs term.el terminal emulator term-protocol-version 0.96, + msgr, + colors#8, pairs#64, + kbs=^?, khome=\E[1~, op=\E[39;49m, ri=\EM, rmso=\E[27m, + rmul=\E[24m, rs1=\Ec, setab=\E[%p1%'('%+%dm, + setaf=\E[%p1%{30}%+%dm, + sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%? + %p7%t;8%;m, + sgr0=\E[m, use=ansi+apparrows, use=ansi+csr, + use=ansi+sgr, use=vt220+pcedit, use=eterm, + +# shell.el can "do" color, though not nearly as well. +# +# seen here: +# http://unix.stackexchange.com/questions/237943/changing-colors-used-by-ls-does-not-work-in-emacs-shell-mode +# +# and +# https://lists.gnu.org/archive/html/bug-gnu-emacs/2012-08/msg00481.html +# https://github.com/emacs-mirror/emacs/blob/master/lisp/shell.el +# https://github.com/emacs-mirror/emacs/blob/master/lisp/ansi-color.el +# +# however, as tested with Emacs 24.5.1, the result is buggy, losing overlays +# frequently. The contemporaneous term.el aka ansi-term does not "support" +# italics but does not lose the color information -TD 2017/01/28. +dumb-emacs-ansi|Emacs dumb terminal with ANSI color codes, + am, hc, + it#8, ncv#13, + bold=\E[1m, cud1=\n, ht=^I, ind=\n, op=\E[39;49m, + rmul=\E[24m, sgr0=\E[m, smul=\E[4m, use=ecma+italics, + use=klone+color, + +#### Screen + +# Entries for use by the `screen' program by Juergen Weigert, +# Michael Schroeder, Oliver Laumann. The screen and +# screen-w entries came with version 3.7.1. The screen2 and screen3 entries +# come from University of Wisconsin and may be older. +# (screen: added on ANSI model -- esr) +# +# 'screen' defines extensions to termcap. Some are used in its terminal +# description: +# G0 (bool) Terminal can deal with ISO 2022 font selection sequences. +# AX (bool) Does understand ANSI set default fg/bg color +# (\E[39m / \E[49m). +# S0 (str) Switch charset 'G0' to the specified charset. +# E0 (str) Switch charset 'G0' back to standard charset. +# +# Initially tested with screen 3.09.08 +# +# According to its manual page +# +# Screen is a full-screen window manager that multiplexes a physical +# terminal between several processes (typically interactive shells). Each +# virtual terminal provides the functions of a DEC VT100 terminal and, in +# addition, several control functions from the ISO 6429 (ECMA 48, ANSI +# X3.64) and ISO 2022 standards (e.g. insert/delete line and support for +# multiple character sets). +# +# However, there is a design error in its support for video highlights. The +# program uses a table (rendlist) which equates the SGR codes to terminal +# capabilities. That, and color-decoding are hardcoded in screen; its behavior +# is modified only by the presence or absence of the corresponding capabilities. +# Not by their values. +# +# If screen sets the TERMCAP variable, it uses hardcoded strings which +# correspond to the rendlist table. +# +# The table gives this information: +# +# SGR capability +# --- --------- +# 1 bold +# 2 dim +# 3 standout +# 4 underline +# 5 blink +# - (unused 6) +# 7 reverse +# - (unused 8-21) +# 22 reset bold, standout and dim +# 23 reset standout +# 24 reset underline +# 25 reset blink +# - (unused 26) +# 27 reset reverse +# +# ECMA-48 differs from this: 3 and 23 set and reset italics, respectively. +# ECMA-48 does not define "standout" - that is a termcap/terminfo abstraction. +# Without some redesign of screen, it is not possible to extend the set of +# capabilities. Substitution would be possible, e.g., sending italics in +# place of underline. +# +# Because screen uses hard-coded parsing, it does not check if two capabilities +# use the same value. For example, changing standout to be the same as any of +# the other capabilities will confuse screen. Curses applications which use +# sgr are not impacted (because that usually resets all capabilities before +# setting any), but termcap applications do not use sgr -TD +# +# The "screen" entry should use ecma+index rather than just indn, but tmux +# defaults to using "screen". For background, screen supported ecma+index +# since 1994 (i.e., screen 3.0.5), stating that it was an obscure code used by +# the (Siemens Nixdorf) 97801 terminal. It was not shown in the termcap or +# terminfo entries (which list about 60% of the control sequences). +screen-base|VT 100/ANSI X3.64 virtual terminal (base), + OTbs, OTpt, km, mir, xenl, G0, + ncv@, U8#1, + acsc=++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxy + yzz{{||}}~~, + blink=\E[5m, bold=\E[1m, civis=\E[?25l, + cnorm=\E[34h\E[?25h, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, cvvis=\E[34l, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, el1=\E[1K, flash=\Eg, + hpa=\E[%i%p1%dG, ich=\E[%p1%d@, indn=\E[%p1%dS, is2=\E)0, + kbs=^?, kcbt=\E[Z, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, kmous=\E[M, nel=\EE, rev=\E[7m, ri=\EM, + rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[23m, rmul=\E[24m, + rs2=\Ec\E[?1000l\E[?25h, + sgr=\E[0%?%p6%t;1%;%?%p1%t;3%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t; + 5%;%?%p5%t;2%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[3m, + smul=\E[4m, vpa=\E[%i%p1%dd, E0=\E(B, S0=\E(%p1%c, + use=ansi+apparrows, use=ansi+csr, use=ansi+erase, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=xterm+kbs, use=vt220+pcedit, use=xterm+alt1049, + use=ecma+color, use=vt100+enq, use=vt100+4bsd, + +screen|VT 100/ANSI X3.64 virtual terminal, + use=screen4, + +no+brackets|cancel bracketed paste, + BD@, BE@, PE@, PS@, + +# The bce and status-line entries are from screen 3.9.13 (and require some +# changes to .screenrc). +screen-bce|VT 100/ANSI X3.64 virtual terminal with bce, + bce, + ech@, use=screen, +screen-s|VT 100/ANSI X3.64 virtual terminal with hardstatus line, + dsl=\E_\E\\, fsl=\E\\, tsl=\E_, use=screen, + +# ====================================================================== +# Entries for GNU Screen with 16 colors. +# Those variations permit to benefit from 16 colors palette, and from +# bold font and blink attribute separated from bright colors. But they +# are less portable than the generic "screen" 8 color entries: Their +# usage makes real sense only if the terminals you attach and reattach +# do all support 16 color palette. + +screen-16color|GNU Screen with 16 colors, + use=ibm+16color, use=screen, + +screen-16color-s|GNU Screen with 16 colors and status line, + use=ibm+16color, use=screen-s, + +screen-16color-bce|GNU Screen with 16 colors and BCE, + use=ibm+16color, use=screen-bce, + +screen-16color-bce-s|GNU Screen with 16 colors using BCE and status line, + bce, use=ibm+16color, use=screen-s, + +# ====================================================================== +# Entries for GNU Screen 4.02 with --enable-colors256. + +screen-256color|GNU Screen with 256 colors, + use=xterm+256setaf, use=screen, + +screen-256color-s|GNU Screen with 256 colors and status line, + use=xterm+256setaf, use=screen-s, + +screen-256color-bce|GNU Screen with 256 colors and BCE, + use=xterm+256setaf, use=screen-bce, + +screen-256color-bce-s|GNU Screen with 256 colors using BCE and status line, + bce, use=xterm+256setaf, use=screen-s, + +screen.xterm-256color|GNU Screen with xterm using 256 colors, + use=xterm+256setaf, use=screen.xterm-new, + +screen.konsole-256color|GNU Screen with konsole using 256 colors, + XR@, use=xterm+256setaf, use=screen.konsole, + +screen.vte-256color|GNU Screen with vte using 256 colors, + use=xterm+256setaf, use=screen.vte, + +screen.putty-256color|GNU Screen with putty using 256 colors, + use=xterm+256setaf, use=screen.putty, + +screen.mlterm-256color|GNU Screen with mlterm using 256 colors, + XR@, use=xterm+256setaf, use=screen.mlterm, + +# ====================================================================== + +# Read the fine manpage: +# When screen tries to figure out a terminal name for +# itself, it first looks for an entry named "screen.", +# where is the contents of your $TERM variable. If +# no such entry exists, screen tries "screen" (or "screen-w" +# if the terminal is wide (132 cols or more)). If even this +# entry cannot be found, "vt100" is used as a substitute. +# +# Notwithstanding the manpage, screen uses its own notion of the termcap +# and some keys from "screen." are ignored. Here is an entry which +# covers those (tested with screen 4.00.02) -TD +screen+fkeys|function-keys according to screen, + kend=\E[4~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kfnd@, + khome=\E[1~, kslt@, + +# See explanation before "screen" entry. Cancel italics so that applications +# do not assume screen supports the feature. Add this tweak to entries which +# extend screen for terminals which do support italics. +screen+italics|screen cannot support italics, + ritm@, sitm@, +# +# Here are a few customized entries which are useful -TD +# +# Notes: +# (a) screen does not support invis. +# (b) screen's implementation of bw is incorrect according to tack. +# (c) screen appears to hardcode the strings for khome/kend, making it +# necessary to override the "use=" clause's values (screen+fkeys). +# (d) screen sets $TERMCAP to a termcap-formatted copy of the 'screen' entry, +# which is NOT the same as the terminfo screen.. +# (e) when screen finds one of these customized entries, it sets $TERM to +# match. Hence, no "screen.xterm" entry is provided, since that would +# create heartburn for people running remote xterm's. +# (f) screen does not support rep. +# (g) the xterm-new compatibility does not include bracketed paste. +# +# xterm (-xfree86 or -r6) does not normally support kIC, kNXT and kPRV +# since the default translations override the built-in keycode +# translation. They are suppressed here to show what is tested by tack. +screen.xterm-xfree86|screen.xterm-new|screen customized for modern xterm, + bce@, bw, + invis@, kIC@, kNXT@, kPRV@, meml@, memu@, rep@, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;%?%p4%t;5%;%?%p5%t;2%;m, + E3@, use=screen+italics, use=screen+fkeys, + use=xterm+x11mouse, use=ecma+index, use=ansi+rep, + use=ecma+strikeout, use=xterm+pcfkeys, + use=xterm+nofkeys, + +# Don't use this, because not everyone has "screen.xterm-new": +#:screen.xterm|screen for modern xterm, +#: use=screen.xterm-new, + +# xterm-r6 does not really support khome/kend unless it is propped up by +# the translations resource. +screen.xterm-r6|screen customized for X11R6 xterm, + bw, use=xterm+x11mouse, use=screen+fkeys, use=xterm-r6, +# Color applications running in screen and TeraTerm do not play well together +# on Solaris because Sun's curses implementation gets confused. +screen.teraterm|disable ncv in teraterm, + ncv#127, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i + \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u + \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + use=screen+fkeys, use=xterm+x11mouse, use=screen, +# Other terminals +screen.rxvt|screen in rxvt, + bw, XT, + cvvis@, flash@, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, + kcuu1=\EOA, use=screen+fkeys, use=vt100+enq, + use=rxvt+pcfkeys, use=xterm+x11mouse, use=vt220+keypad, + use=screen, +screen.Eterm|screen in Eterm, + use=xterm+x11mouse, use=screen+fkeys, use=Eterm, +screen.mrxvt|screen in mrxvt, + use=xterm+x11mouse, use=screen+fkeys, use=mrxvt, +screen.vte|screen in any VTE-based terminal, + use=xterm+x11mouse, use=screen+italics, + use=screen+fkeys, use=no+brackets, use=vte, +screen.gnome|screen in GNOME Terminal, + use=xterm+x11mouse, use=screen+italics, + use=screen+fkeys, use=no+brackets, use=gnome, +screen.konsole|screen in KDE console window, + XR@, use=xterm+x11mouse, use=screen+italics, + use=screen+fkeys, use=no+brackets, use=konsole, +# fix the backspace key +screen.linux|screen.linux-s|screen in Linux console, + bw, + kcbt@, use=linux+sfkeys, use=xterm+x11mouse, + use=screen+fkeys, use=screen, +screen.mlterm|screen in mlterm, + XR@, use=xterm+x11mouse, use=screen+fkeys, + use=no+brackets, use=mlterm, +screen.putty|screen in putty, + use=xterm+x11mouse, use=screen+fkeys, use=no+brackets, + use=putty, + +# The default "screen" entry is reasonably portable, but not optimal for the +# most widely-used terminal emulators. The "bce" capability is supported in +# screen since 3.9.13, and when used, will require fewer characters to be sent +# to the terminal for updates. +# +# If you are using only terminals which support bce, then you can use this +# feature in your screen configuration. +# +# Adding these lines to your ".screenrc" file will allow using these customized +# entries: +# term screen-bce +# bce on +# defbce on +screen-bce.xterm-new|screen optimized for modern xterm, + bce, + ech@, use=screen+italics, use=screen.xterm-new, +screen-bce.rxvt|screen optimized for rxvt, + bce, + ech@, use=screen.rxvt, +screen-bce.Eterm|screen optimized for Eterm, + bce, + ech@, use=screen.Eterm, +screen-bce.mrxvt|screen optimized for mrxvt, + bce, + ech@, use=screen.mrxvt, +screen-bce.gnome|screen optimized for GNOME-Terminal, + ech@, use=screen+italics, use=screen.gnome, +screen-bce.konsole|screen optimized for KDE console window, + ech@, use=screen+italics, use=screen.konsole, +screen-bce.linux|screen optimized for Linux console, + bce, + ech@, use=screen.linux, + +screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols, + cols#132, use=screen, + +screen2|VT 100/ANSI X3.64 virtual terminal (old 2.x), + cols#80, lines#24, + clear=\E[2J\E[H, cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + ed=\E[J, el=\E[K, ich1=, ind=\n, kbs=^H, kf0=\E~, kf1=\ES, + kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, + kf9=\E0I, khome=\EH, nel=\r\n, rc=\E8, ri=\EM, rmso=\E[23m, + rmul=\E[24m, rs1=\Ec, sc=\E7, sgr0=\E[m, smso=\E[3m, + smul=\E[4m, use=ansi+idc, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, use=vt52+arrows, + +# (screen3: removed unknown ":xv:LP:G0:" -- esr) +screen3|VT 100/ANSI X3.64 virtual terminal (old 3.x), + km, mir, msgr, + cols#80, lines#24, + bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, dch=\E[%p1%dP, + dch1=\E[P, home=\E[H, ich=\E[%p1%d@, ind=\n, is2=\E)0, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\EE, rev=\E[7m, + ri=\EM, rmir=\E[4l, rmkx=\E>, rmso=\E[23m, rmul=\E[24m, + rs1=\Ec, sgr0=\E[m, smir=\E[4h, smkx=\E=, smso=\E[3m, + smul=\E[4m, use=ansi+csr, use=ansi+erase, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, + +# screen 4.0 was released 2003-07-21, and as of March 2019, its terminfo file +# was last updated in 2009 to include 256-color support. The most recent +# release is 4.6.2 (October 2017). +screen4|VT 100/ANSI X3.64 virtual terminal (4.x), + use=ecma+index, use=screen-base, + +# As of December 2022, screen 5.0 has not been released. +# +# However, +# +# https://savannah.gnu.org/bugs/?36676 +# +# mentions a change to implement italics which should be in a version 5, +# (implemented 2016-11-05, but merged 2017-07-09). That does away with the +# longstanding use of SGR 3 for standout, and interprets it as italics. +# +# The same development branch has some support for direct-colors, but none +# of this has been documented. +screen5|VT 100/ANSI X3.64 virtual terminal (someday), + rmso=\E[27m, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;m%?%p9%t\016%e\017%;, + smso=\E[7m, use=ecma+italics, use=ecma+index, + use=screen-base, + +#### Tmux + +# tmux is mostly compatible with screen, but has support for italics, and some +# of the xterm cursor bits. +# +# However, unlike screen, tmux has no provision for using derived terminal +# descriptions. When screen starts, it looks for a suitable "inner" terminal +# such as "screen.$TERM" to correspond to the outer terminal's quirks. The +# various entries such as screen.xterm-new provide a way to more closely +# match the terminal. +tmux|tmux terminal multiplexer, + invis=\E[8m, rmso=\E[27m, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + smso=\E[7m, E3=\E[3J, Smulx=\E[4:%p1%dm, + use=ecma+italics, use=ecma+strikeout, use=xterm+edit, + use=xterm+pcfkeys, use=xterm+sl, use=xterm+tmux, + use=screen, use=bracketed+paste, use=report+version, + use=xterm+focus, + +tmux-256color|tmux with 256 colors, + use=xterm+256setaf, use=tmux, + +tmux-direct|tmux with direct-color indexing, + use=kitty+setal, use=xterm+direct, use=tmux, + +#### Mosh +# https://mosh.org/ +# mosh 1.3.2 +# +# mosh's DA1 identifies it as a VT220, but sets $TERM to "xterm" or +# "xterm-256color" (hard-coded), which in its pretense that it is xterm, is +# several years out of date. +# +# There is little documentation; the existing manpages amount to a quarter of +# the length of mosh.org's heavily promotional website. This entry is based +# on testing, and reading the source-code. For the latter, analysis is aided +# by the developer's extensive use of hard-coded strings. +# +# The website has an example "Tricky unicode", which shows a shell command +# with a typo (i.e., assuming that a byte in octal uses 4 digits) and suggests +# that mosh and OS X Terminal "gets it right". +# +# The example as shown would not work. Correcting the typo, xterm gives the +# result expected by the mosh developer. +# +# The other examples follow in a similar vein. +# +# It does not support these xterm features: +# use=ansi+rep (xterm patch #36, 1997) +# use=ecma+strikeout (xterm patch #305, 2014) +# use=vt420+lrmm (xterm patch #279, 2012) +# titlestack in smcup/rmcup has no effect (xterm patch #251, 2009) +# does not support "dim" (xterm patch #305, 2014) +# In tack +# rmkx/smkx has no effect on numeric keypad +# acs stuff has no effect, is included here for ease of comparison +# +# Unlike screen and tmux, mosh has only limited awareness of a terminal +# description. It assumes that the underlying terminal is xterm, and would +# not work well with terminals using other key-definitions, such as urxvt. +mosh|mobile shell, + U8#1, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%| + %t;7%;%?%p4%t;5%;%?%p7%t;8%;m, + sgr0=\E(B\E[m, use=ansi+enq, use=xterm+meta, + use=ecma+italics, use=ecma+index, use=xterm+acs, + use=xterm+focus, use=xterm+sm+1006, use=xterm+pcfkeys, + use=xterm-xfree86, use=bracketed+paste, + +mosh-256color|mosh using 256-colors, + use=xterm+256color, use=mosh, + +#### Dvtm + +# dvtwm 0.15 +# http://www.brain-dump.org/projects/dvtm/ +# +# + This uses ncurses to manage the display, including support for italics and +# default-colors. +# + However, default-colors are incomplete: do not set bce. +# + It does not implement flash (since no \e[?5h) +# + Do not set XT: dvtm knows about OSC 0 and 2, but not 1. +# Oddly enough, if $TERM contains "linux", it attempts to set the title. +# + Some of the program is cut/paste from rxvt-unicode, e.g., the ACS table. +# + The built-in table of function-keys (based on rxvt) is incomplete (ends +# with kf22). +# + It also omits the shifted cursor- and editing-keypad keys. +# However, it is confused by xterm's shifted cursor- and editing-keypad keys +# (and passes those through without interpretation) +# and may simply pass-through rxvt's, making it appear to work. +# In other cases such as kf23 and up, no pass-through is done. +# + Most of the mode-settings in the initialization/reset strings are not +# implemented; dvtm copies its description from rxvt. +dvtm|dynamic virtual terminal manager, + eo, mir, xenl, + ncv@, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, el1=\E[1K, + hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ich1=\E[@, + is1=\E[?47l\E=\E[?1l, + is2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l, + kDC=\E[3$, kEND=\E[8$, kHOM=\E[7$, kIC=\E[2$, kLFT=\E[d, + kNXT=\E[6$, kPRV=\E[5$, kRIT=\E[c, ka1=\EOw, ka3=\EOy, + kb2=\EOu, kbs=^?, kc1=\EOq, kc3=\EOs, kcbt=\E[Z, kel=\E[8\^, + kend=\E[8~, kent=\EOM, kf0=\E[21~, kf1=\E[11~, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\E[12~, kf20=\E[34~, kf21=\E[23$, + kf22=\E[24$, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[7~, kind=\E[a, kmous=\E[M, kri=\E[b, rev=\E[7m, + ri=\EM, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, + rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, + rs2=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l\E>\E[?1000l\E[? + 25h, + s0ds=\E(B, s1ds=\E(0, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%? + %p9%t\016%e\017%;, + sgr0=\E[m\017, smir=\E[4h, smso=\E[7m, smul=\E[4m, + vpa=\E[%i%p1%dd, use=ansi+arrows, use=ansi+csr, + use=ansi+idl, use=ansi+local, use=xterm+alt47, + use=vt220+vtedit, use=vt220+cvis, use=ecma+color, + use=ecma+italics, use=vt100+4bsd, + +dvtm-256color|dynamic virtual terminal manager with 256 colors, + colors#0x100, pairs#0x10000, + setab=\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48; + 5;%p1%d%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5 + ;%p1%d%;m, + use=dvtm, + +#### NCSA Telnet + +# Francesco Potorti : +# NCSA telnet is one of the most used telnet clients for the Macintosh. It has +# been maintained until recently by the National Center for Supercomputer +# Applications, and it is feature rich, stable and free. It can be downloaded +# from www.ncsa.edu. This terminfo description file is based on xterm-vt220, +# xterm+sl, and the docs at NCSA. It works well. +# +# NCSA Telnet 2.6 for Macintosh in VT220 8-bit emulation mode +# The terminal options should be set as follows: +# Xterm sequences ON +# use VT wrap mode ON +# use Emacs arrow keys OFF +# CTRL-COMND is Emacs meta ON +# 8 bit mode ON +# answerback string: "ncsa-vt220-8" +# setup keys: all disabled +# +# Application mode is not used. +# +# Other special mappings: +# Apple VT220 +# HELP Find +# HOME Insert here +# PAGEUP Remove +# DEL Select +# END Prev Screen +# PAGEDOWN Next Screen +# +# Though it supports ANSI color, NCSA Telnet uses color to represent blinking +# text. +# +# The status-line manipulation is a mapping of the xterm-compatible control +# sequences for setting the window-title. So you must use tsl and fsl in +# pairs, since the latter ends the string that is loaded to the window-title. +ncsa-m|ncsa-vt220-8|NCSA Telnet 2.6 for Macintosh in VT220-8 mode, + am, km, mir, msgr, xenl, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, + dch1=\E[P, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0, + flash=\E[?5h$<100/>\E[?5l, home=\E[H, ht=^I, hts=\EH, + ich=\E[%p1%d@, if=/usr/share/tabset/vt100, + ind=\n$<150*>, + is2=\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>, + kdch1=\E[4~, kend=\E[5~, kf1=\E[17~, kf10=\E[28~, + kf11=\E[29~, kf12=\E[31~, kf13=\E[32~, kf14=\E[33~, + kf15=\E[34~, kf2=\E[18, kf3=\E[19~, kf4=\E[20~, kf5=\E[21~, + kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, kf9=\E[26~, khlp=\E[1~, + khome=\E[2~, knp=\E[6~, kpp=\E[3~, mc4=\E[4i, mc5=\E[5i, + rev=\E[7m, rf=/usr/share/tabset/vt100, ri=\EM, + rmam=\E[?7l, rmcup=\E[2J\E8, rmir=\E[4l, rmso=\E[27m, + rmul=\E[24m, + rs2=\E7\E[r\E8\E[m\E[?7h\E[?1;4;6l\E[4l\E>, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%t;7%;m%? + %p9%t\E(0%e\E(B%;, + sgr0=\E[m\E(B, smam=\E[?7h, smcup=\E7, smir=\E[4h, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, u8=\E[?62;1;6c, + use=ansi+arrows, use=ansi+csr, use=ansi+idl, + use=ansi+local, use=vt220+cvis, use=xterm+acs, + use=xterm+sl, use=ansi+enq, + +ncsa|NCSA Telnet 2.7 for Macintosh in VT220-8 mode (color), + use=ncsa-m, use=klone+color, +ncsa-ns|NCSA Telnet 2.7 for Macintosh in VT220-8 mode (color w/o status line), + hs@, + dsl@, fsl@, tsl@, use=ncsa, +ncsa-m-ns|NCSA Telnet 2.6 for Macintosh in VT220-8 mode (no status line), + hs@, + dsl@, fsl@, tsl@, use=ncsa-m, +# alternate -TD: +# The documented function-key mapping refers to the Apple Extended Keyboard +# (e.g., NCSA Telnet's F1 corresponds to a VT220 F6). We use the VT220-style +# codes, however, since the numeric keypad (VT100) PF1-PF4 are available on +# some keyboards and many applications require these as F1-F4. +# +ncsa-vt220|NCSA Telnet using VT220-compatible function keys, + kf1=\EOP, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\EOQ, + kf20=\E[34~, kf3=\EOR, kf4=\EOS, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, use=ncsa, + +#### Pilot Pro Palm-Top +# +# Termcap for Top Gun Telnet and SSH on the Palm Pilot. +# https://web.archive.org/web/20051103015726/http://www.ai/~iang/TGssh/ +pilot|tgtelnet|Top Gun Telnet on the Palm Pilot Professional, + OTbs, am, xenl, + cols#39, lines#16, + bel=^G, clear=\Ec, cr=\r, cub1=^H, cud1=\n, + cup=\Em%p1%{32}%+%c%p2%{32}%+%c, home=\Em\s\s, ht=^I, + ind=\n, kbs=^H, kcub1=^H, kcud1=\n, knp=^L, kpp=^K, nel=\Em~\s, + rmso=\EB, smso=\Eb, + +# From: Federico Bianchi +# These entries are for the Embeddable Linux Kernel System (ELKS) +# project - an heavily stripped down Linux to be run on 16 bit +# boxes or, eventually, to be used in embedded systems - and have been +# adapted from the stock ELKS termcap. The project itself looks stalled, +# and the latest improvements I know of date back to March 2000. +# +# To cope with the ELKS dumb console I added an "elks-glasstty" entry; +# as an added bonus, this deals with all the capabilities common to +# both VT52 and ANSI (or, eventually, "special") modes. + +elks-glasstty|ELKS glass-TTY capabilities, + OTbs, am, + cols#80, it#8, lines#25, + bel=^G, cr=\r, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, + nel=\r\n, + +elks-vt52|ELKS VT52 console, + clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, el=\EK, + home=\EH, use=elks-glasstty, + +elks-ansi|ELKS ANSI console, + clear=\E[H\E[2J, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, + el=\E[K, home=\E[H, use=ansi+local1, use=ansi+sgrso, + use=elks-glasstty, + +# As a matter of fact, ELKS 0.0.83 on PCs defaults to ANSI emulation +# instead of VT52, but the "elks" entry still refers to the latter. + +elks|default ELKS console, + use=elks-vt52, + +# Project SIBO (for Psion 3 palmtops) console is identical to the ELKS +# one but in screen size + +sibo|ELKS SIBO console, + cols#61, it#8, lines#20, use=elks-vt52, + +######## COMMERCIAL WORKSTATION CONSOLES +# + +#### Alpha consoles +# + +# This is from the OSF/1 Release 1.0 termcap file +pccons|pcconsole|ANSI (mostly) Alpha PC console terminal emulation, + am, xon, + cols#80, lines#25, + bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M, + el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, nel=\r\n, + rev=\E[7m, rmso=\E[m, sgr0=\E[m, smso=\E[7m, + use=ansi+arrows, + +#### Sun consoles +# + +# :is1: resets scrolling region in case a previous user had used "tset VT100" +oldsun|Sun Microsystems Workstation console, + OTbs, am, km, mir, msgr, + cols#80, it#8, lines#34, + bel=^G, clear=^L, cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, ed=\E[J, el=\E[K, ht=^I, + ich=\E[%p1%d@, ich1=\E[@, ind=\n, is1=\E[1r, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, khome=\E[H, rmso=\E[m, sgr0=\E[m, + smso=\E[7m, use=ansi+idl, use=ansi+local1, + +# From: Alexander Lukyanov , 14 Nov 1995 +# capability later corrected by J.T. Conklin +# SGR 1, 4 aren't supported - removed bold/underline (T.Dickey 17 Jan 1998) +sun-il|Sun Microsystems console with working insert-line, + am, km, msgr, + cols#80, lines#34, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch=\E[%p1%dP, + dch1=\E[P, ed=\E[J, el=\E[K, ht=^I, ich=\E[%p1%d@, ich1=\E[@, + ind=\n, kb2=\E[218z, kdch1=^?, kend=\E[220z, kf1=\E[224z, + kf10=\E[233z, kf11=\E[234z, kf12=\E[235z, kf2=\E[225z, + kf3=\E[226z, kf4=\E[227z, kf5=\E[228z, kf6=\E[229z, + kf7=\E[230z, kf8=\E[231z, kf9=\E[232z, khome=\E[214z, + kich1=\E[247z, knp=\E[222z, kopt=\E[194z, kpp=\E[216z, + kres=\E[193z, kund=\E[195z, rev=\E[7m, rmso=\E[m, rmul@, + rs2=\E[s, sgr=\E[0%?%p1%p3%|%t;7%;m, sgr0=\E[m, + smso=\E[7m, u8=\E[1t, u9=\E[11t, use=ansi+arrows, + use=ansi+idl, + +# On some versions of CGSIX framebuffer firmware (SparcStation 5), / +# flake out on the last line. Unfortunately, without them the terminal has no +# way to scroll. +sun-cgsix|sun-ss5|Sun SparcStation 5 console, + il@, il1@, use=sun-il, + +# The Sun console was documented in the wscons manual page (apparently +# unrelated to the "wscons" used by some of the BSDs). +# +# https://illumos.org/man/4D/wscons +# https://www.bitsavers.org/pdf/sun/sun1/800-0345_Sun-1_System_Reference_Manual_Jul82.pdf +# +# The early cmdtool and shelltool programs in Sun's NeWS were based on this. +# After NeWS was discontinued, XView provided a similar shelltool, with an +# incomplete manual page. Presumably the intent was to document features of +# shelltool not in wscons: +# +# https://manpages.ubuntu.com/manpages/bionic/en/man1/shelltool.1.html +# https://manpages.ubuntu.com/manpages/bionic/en/man1/cmdtool.1.html +# +# The wscons manual page and the XView source show that it had no feature that +# could be used in ncurses u6/u7/u8/u9 extensions. Interesting, the XView +# source shows that its shelltool could tell the host what a particular mode +# was set to. But neither that nor its CSI..t controls support u6/u7/u8/u9. +# +# If you are using an SS5, change the sun definition to use sun-ss5. +sun|sun1|sun2|Sun Microsystems Inc. workstation console, + use=sun-il, + +sun+sl|Sun Workstation window status line, + hs, + dsl=\E]l\E\\, fsl=\E\\, tsl=\E]l, + +# From: Tue Sep 24 13:14:44 1985 +sun-s|Sun Microsystems Workstation window with status line, + use=sun+sl, use=sun, +sun-e-s|sun-s-e|Sun Microsystems Workstation with status hacked for emacs, + use=sun+sl, use=sun-e, +sun-48|Sun 48-line window, + cols#80, lines#48, use=sun, +sun-34|Sun 34-line window, + use=sun, +sun-24|Sun 24-line window, + cols#80, lines#24, use=sun, +sun-17|Sun 17-line window, + cols#80, lines#17, use=sun, +sun-12|Sun 12-line window, + cols#80, lines#12, use=sun, +sun-1|Sun 1-line window for sysline, + eslok, hs, + cols#80, lines#1, + dsl=^L, fsl=\E[K, tsl=\r, use=sun, +sun-e|sun-nic|sune|Sun Microsystems Workstation without insert character, + ich1@, rmir@, smir@, use=sun, +sun-c|sun-cmd|Sun Microsystems Workstation console with scrollable history, + lines#35, + rmcup=\E[>4h, smcup=\E[>4l, use=sun, +sun-type4|Sun Workstation console with type 4 keyboard, + kcub1=\E[217z, kcud1=\E[221z, kcuf1=\E[219z, + kcuu1=\E[215z, use=sun-il, + +# Most of the current references to sun-color are from users wondering why this +# is the default on install. Details from reading the wscons manpage, adding +# cub, etc., here (rather than in the base sun-il entry) since it is not clear +# when those were added -TD (2005-05-28) +# +# According to wscons manpage, color is supported only on IA systems. +# Sun's terminfo entry documents bold and smul/rmul capabilities, but wscons +# does not list these. It also sets ncv#3, however that corresponds to +# underline and standout. +# +# Since the documentation and terminfo do not agree, see also current code at +# https://web.archive.org/web/20091231042744/http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/tem_safe.c +# +# That (actually a different driver which "supports" sun-color) also supports +# these features: +# vpa=\E[%i%p1%dd +# hpa=\E[%i%p1%d` +# cbt=\E[Z +# dim=\E[2m +# blink=\E[5m +# It supports bold, but not underline -TD (2009-09-19) +sun-color|Sun Microsystems Workstation console with color support (IA systems), + bold=\E[1m, cub1=^H, cud1=\n, home=\E[H, op=\E[0m, + setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6} + %=%t3%e%p1%d%;m, + sgr=\E[0%?%p6%t;1%;%?%p1%p3%|%t;7%;m, use=ansi+local, + use=sun, use=klone+color, + +#### Iris consoles +# + +# (wsiris: this had extension capabilities +# :HS=\E7F2:HE=\E7F7:\ +# :CT#2:CZ=*Bblack,red,green,yellow,blue,magenta,cyan,*Fwhite: +# See the note on Iris extensions near the end of this file. +# Finally, removed suboptimal =\EH\EJ and added & +# from BRL -- esr) +wsiris|iris40|IRIS emulating a 40 line Visual 50 (approximately), + OTbs, OTnc, OTpt, am, + OTkn#3, cols#80, it#8, lines#40, + OTnl=\EB, bel=^G, clear=\Ev, cnorm=\E>, cub1=^H, cud1=\EB, + cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, + cvvis=\E;, dim=\E7F2, dl1=\EM, ed=\EJ, el=\EK, + flash=\E7F4\E7B1\013\E7F7\E7B0, home=\EH, ht=^I, il1=\EL, + ind=\n, is2=\E7B0\E7F7\E7C2\E7R3, kf0=\E0, kf1=\E1, + kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6, kf7=\E7, kf8=\E8, + kf9=\E9, ri=\EI, rmso=\E0@, rmul=\E7R3\E0@, sgr0=\E7F7, + smso=\E9P, smul=\E7R2\E9P, use=vt52+arrows, + +#### NeWS consoles +# +# Console terminal windows under the NeWS (Sun's Display Postscript windowing +# environment). Note: these have nothing to do with Sony's News workstation +# line. +# + +# Entry for NeWS's psterm from Eric Messick & Hugh Daniel +# (psterm: unknown ":sl=\EOl:el=\ENl:" removed -- esr) +psterm|psterm-basic|NeWS psterm-80x34, + OTbs, am, hs, km, ul, + cols#80, it#8, lines#34, + blink=\EOb, bold=\EOd, clear=^L, csr=\EE%p1%d;%p2%d;, + cub1=\ET, cud1=\EP, cuf1=\EV, cup=\E%p1%d;%p2%d;, cuu1=\EY, + dch1=\EF, dl1=\EK, ed=\EB, el=\EC, flash=\EZ, fsl=\ENl, + home=\ER, ht=^I, il1=\EA, ind=\EW, is1=\EN*, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, ll=\EU, rc=^\, rev=\EOr, + ri=\EX, rmcup=\ENt, rmir=\ENi, rmso=\ENo, rmul=\ENu, sc=^], + sgr0=\EN*, smcup=\EOt, smir=\EOi, smso=\EOo, smul=\EOu, + tsl=\EOl, +psterm-96x48|NeWS psterm 96x48, + cols#96, lines#48, use=psterm, +psterm-90x28|NeWS psterm 90x28, + cols#90, lines#28, use=psterm, +psterm-80x24|NeWS psterm 80x24, + cols#80, lines#24, use=psterm, +# This is a faster termcap for psterm. Warning: if you use this termcap, +# some control characters you type will do strange things to the screen. +# (psterm-fast: unknown ":sl=^Ol:el=^Nl:" -- esr) +psterm-fast|NeWS psterm fast version (flaky ctrl chars), + OTbs, am, hs, km, ul, + cols#80, it#8, lines#34, + blink=^Ob, bold=^Od, clear=^L, csr=\005%p1%d;%p2%d;, + cub1=^T, cud1=^P, cuf1=^V, cup=\004%p1%d;%p2%d;, cuu1=^Y, + dch1=^F, dl1=^K, ed=^B, el=^C, flash=^Z, fsl=^Nl, home=^R, ht=^I, + il1=^A, ind=^W, is1=^N*, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, ll=^U, rc=^\, rev=^Or, ri=^X, rmcup=^Nt, rmir=^Ni, + rmso=^No, rmul=^Nu, sc=^], sgr0=^N*, smcup=^Ot, smir=^Oi, + smso=^Oo, smul=^Ou, tsl=^Ol, + +#### NeXT consoles +# +# Use `glasstty' for the Workspace application +# + +# From: Dave Wetzel 22 Dec 1995 +next|NeXT console, + am, xt, + cols#80, it#8, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H, + ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, + rmso=\E[4;1m, sgr0=\E[m, smso=\E[4;2m, +nextshell|NeXT Shell application, + am, + cols#80, + bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, kbs=^H, kcub1=^H, + kcud1=\n, nel=\r\n, + +#### Sony NEWS workstations +# + +# (news-unk: this had :KB=news: -- esr) +news-unk|Sony NEWS VT100 emulator common entry, + OTbs, OTpt, am, xenl, + cols#80, + OTnl=\n, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, + cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + if=/usr/share/tabset/vt100, + is2=\E[?7h\E[?1h\E[?3l\E7\E8, kbs=^H, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOY, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, + kf8=\EOW, kf9=\EOX, rev=\E[7m, ri=\EM, rmkx=\E[?1l\E>, + rmso=\E[m, rmul=\E[m, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[r, sgr0=\E[m, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, use=ansi+csr, + use=ansi+idl, +# +# (news-29: this had :TY=ascii: --esr) +news-29|Sony NEWS VT100 emulator with 29 lines, + lines#29, use=news-unk, +# (news-29-euc: this had :TY=euc: --esr) +news-29-euc|Sony NEWS VT100 emulator with 29 lines and EUC, + use=news-29, +# (news-29-sjis: this had :TY=sjis: --esr) +news-29-sjis|Sony NEWS VT100 emulator with 29 lines and SJIS, + use=news-29, +# +# (news-33: this had :TY=ascii: --esr) +news-33|Sony NEWS VT100 with 33 lines, + lines#33, use=news-unk, +# (news-33-euc: this had :TY=euc: --esr) +news-33-euc|Sony NEWS VT100 with 33 lines and EUC, + use=news-33, +# (news-33-sjis: this had :TY=sjis: --esr) +news-33-sjis|Sony NEWS VT100 with 33 lines and SJIS, + use=news-33, +# +# (news-42: this had :TY=ascii: --esr) +news-42|Sony NEWS VT100 with 42 lines, + lines#42, use=news-unk, +# (news-42-euc: this had :TY=euc: --esr) +news-42-euc|Sony NEWS VT100 with 42 lines and EUC, + use=news-42, +# (news-42-sjis: this had :TY=sjis: --esr) +news-42-sjis|Sony NEWS VT100 with 42 lines and SJIS, + use=news-42, +# +# NEWS-OS old termcap entry +# +# (news-old-unk: this had :KB=news:TY=sjis: --esr) +news-old-unk|old Sony NEWS VT100 emulator common entry, + OTbs, OTpt, am, xenl, + cols#80, vt#3, + OTnl=\n, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J, + cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + if=/usr/share/tabset/vt100, kbs=^H, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, rev=\E[7m, ri=\EM, rmkx=\E[?1l\E>, + rmso=\E[m, rmul=\E[m, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr0=\E[m, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, use=ansi+csr, +# +# (nwp512: this had :DE=^H:, which I think means --esr) +nwp512|news|nwp514|news40|vt100-bm|nwp512-o|nwp514-o|news-o|news40-o|vt100-bm-o|old Sony VT100 emulator 40 lines, + OTbs, + lines#40, + is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;40 + r\E8, + use=news-old-unk, +# +# (nwp512-a: this had :TY=ascii: and the alias vt100-bm --esr) +nwp512-a|nwp514-a|news-a|news42|news40-a|old Sony VT100 emulator 42 line, + lines#42, + is2=\E[?7h\E[?1l\E[?3l\E7\E[1;42r\E8, + use=news-old-unk, +# +# (nwp513: this had :DE=^H: and the alias vt100-bm --esr) +nwp513|nwp518|nwe501|newscbm|news31|nwp513-o|nwp518-o|nwe501-o|nwp251-o|newscbm-o|news31-o|old Sony VT100 emulator 31 lines, + OTbs, + lines#31, + is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;31 + r\E8, + use=news-old-unk, +# +# (nwp513-a: this had :TY=ascii: and :DE=^H:, which I interpret as ; --esr) +# also the alias vt100-bm. +nwp513-a|nwp518-a|nwe501-a|nwp251-a|newscbm-a|news31-a|newscbm33|news33|old Sony VT100 emulator 33 lines, + OTbs, + lines#33, + is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;33 + r\E8, + use=news-old-unk, +# +# (news28: this had :DE=^H:, I think that's , and :KB=nws1200: --esr) +news28|old Sony VT100 emulator 28 lines, + OTbs, + lines#28, + is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;28 + r\E8, + use=news-old-unk, +# +# (news29: this had :TY=ascii:KB=nws1200:\ --esr) +news29|news28-a|old Sony VT100 emulator 29 lines, + lines#29, + is2=\E7\E[r\E8\EE\EE\EE\EM\EM\EM\E[?7h\E[?1l\E[?3l\E7\E[1;29 + r\E8, + use=news-old-unk, +# +# (news511: this had :TY=sjis: --esr) +nwp511|nwp-511|nwp-511 VT100, + OTbs, OTpt, am, xenl, + cols#80, lines#24, + clear=\E[;H\E[2J$<20/>, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A$<2/>, dl1=\E[M, ed=\E[J$<30/>, el=\E[K$<3/>, + flash=\E[?5h\0\0\0\0\0\0\0\0\0\0\0\0\0\E[?5l, + il1=\E[L, is2=\E[?5l\E[?1l\E>\E[?7h\E[?8h, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\E#W, khome=\E[H, + ri=\EM$<5/>, rmso=\E[m$<2/>, rmul=\E[m$<2/>, + rs2=\E7\E[r\E8\E[?5l\E[?1l\E>\E[?7h\E[?8h, + smso=\E[7m$<2/>, smul=\E[4m$<2/>, use=ansi+local1, +# (news517: this had :TY=sjis:. --esr) +nwp517|nwp-517|nwp-517 VT200 80 cols 30 rows, + cols#80, lines#30, + OTi2=\E[2$~\n, dsl=\E[1$~, + is2=\E7\E[r\E8\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + tsl=\E[1$}\E[;%df, use=dec+sl, use=vt220-base, +# (news517-w: this had :TY=sjis:. --esr) +nwp517-w|nwp-517-w|nwp-517 VT200 132 cols 50 rows, + eslok, hs, + cols#132, lines#50, + OTi2=\E[2$~\n, dsl=\E[1$~, fsl=\E[0$}, + is2=\E7\E[r\E8\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h, + tsl=\E[1$}\E[;%df, use=vt220-base, + +#### Common Desktop Environment +# + +# This ships with Sun's CDE in Solaris 2.5 +# Corrected Sun Aug 9 1998 by Alexander V. Lukyanov +dtterm|CDE desktop terminal, + am, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, lm#0, ncv@, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[2m, ech=\E[%p1%dX, el1=\E[1K, enacs=\E(B\E)0, + flash=\E[?5h$<200>\E[?5l, home=\E[H, ht=^I, hts=\EH, + ich=\E[%p1%d@, ind=\ED, is2=\E F\E>\E[?1l\E[?7h\E[?45l, + kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[12~, + kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khlp=\E[28~, nel=\EE, ri=\EM, rmacs=^O, rmam=\E[?7l, + rmir=\E[4l, rmso=\E[22;27m, rmul=\E[24m, + sgr=\E[0%?%p1%t;2;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, + smso=\E[2;7m, smul=\E[4m, tbc=\E[3g, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ansi+sgr, use=decid+cpr, use=vt220+vtedit, + use=vt220+cvis, use=ecma+color, + +######## Non-Unix Consoles +# + +#### EMX termcap.dat compatibility modes +# +# Also (possibly only EMX, so we don't put it in ansi.sys, etc): set the +# no_color_video to inform the application that standout(1), underline(2) +# reverse(4) and invisible(64) don't work with color. +emx-base|DOS special keys, + bce, bw, + it#8, ncv#71, + bel=^G, use=ansi.sys, + +# Except for the "-emx" suffixes, these are as distributed with EMX 0.9b, +# a Unix-style environment used on OS/2. (Note that the suffix makes some +# names longer than 14 characters, the nominal maximum). +# +# Removed: rmacs=\E[10m, smacs=\E[11m, because OS/2 does not implement acs. +ansi-emx|ANSI.SYS color, + eo, + clear=\E[1;33;44m\E[H\E[J, cr=\r, cud1=\n, dch=\E[%p1%dp, + ed=\E[J, flash=\E[?5h$<100/>\E[?5l, ht=^I, hts=\EH, + ich=\E[%p1%d@, ich1=\E[@, ind=\n, kb2=\E[G, kf0=\0D, kll=\0O, + kspd=^Z, nel=\r\n, rev=\E[5;37;41m, rmir=\E[4l, + rmso=\E[0;44m\E[1;33m, rmul=\E[0;44m\E[1;33m, rs1=\Ec, + sgr0=\E[0m\E[1;33;44m, smir=\E[4h, smso=\E[0;31;47m, + smul=\E[1;31;44m, tbc=\E[3g, u8=\E[?6c, u9=\E[c, + use=vt220+cvis, use=emx-base, +# nice colors for Emacs (white on blue, mode line white on cyan) +ansi-color-2-emx|ANSI.SYS color 2, + clear=\E[0;37;44m\E[H\E[J, rev=\E[1;37;46m, + rmso=\E[0;37;44m, rmul=\E[0;37;44m, sgr0=\E[0;37;44m, + smso=\E[1;37;46m, smul=\E[1;36;44m, use=ansi-emx, +# nice colors for Emacs (white on black, mode line black on cyan) +ansi-color-3-emx|ANSI.SYS color 3, + clear=\E[0;37;40m\E[H\E[J, rev=\E[1;37;46m, + rmso=\E[0;37;40m, rmul=\E[0;37;40m, sgr0=\E[0;10m, + smso=\E[1;37;46m, smul=\E[0;36;40m, use=ansi-emx, +mono-emx|stupid monochrome ANSI terminal with only one kind of emphasis, + am, + cols#80, it#8, lines#24, + clear=\E[H\E[2J$<50>, cup=\E[%i%p1%d;%p2%dH, el=\E[K, + home=\E[H, ht=^I, kb2=\E[G, kbs=^H, kcub1=\0K, kcud1=\0P, + kcuf1=\0M, kcuu1=\0H, kf0=\0D, kf1=\0;, kf2=\0<, kf3=\0=, + kf4=\0>, kf5=\0?, kf6=\0@, kf7=\0A, kf8=\0B, kf9=\0C, + khome=\0G, kich1=\0R, kll=\0O, knp=\0Q, kpp=\0I, nel=\r\n, + rev=\E[7m, sgr0=\E[0m, use=ansi+local1, + +#### Cygwin + +# Use this for cygwin32 (tested with beta 19.1) +# underline is colored bright magenta +# shifted kf1-kf12 are kf11-kf22 +cygwinB19|ANSI emulation for cygwin32, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\E[[A, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, + kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, rmam@, smam@, use=vt220+pcedit, + use=ansi.sys, + +# Use this for cygwin (tested with version 1.1.0). +# I've combined pcansi and linux. Some values of course were different and +# I've indicated which of these were and which I used. +# Cheers, earnie_boyd@yahoo.com +# several changes based on running with tack and comparing with older entry -TD +# more changes from csw: +# add cbt [backtab] +# remove eo [erase overstrike with blank] +# change clear was \E[H\E[J now \E[2J (faster?) +# remove cols +# remove lines +# remove ncv#3 [colors collide with highlights, bitmask] not applicable +# to MSDOS box? +# add cub [cursor back param] +# add cuf [cursor forward param] +# add cuu [cursor up param] +# add cud [cursor down param] +# add hs [has status line] +# add fsl [return from status line] +# add tsl [go to status line] +# add smacs [Start alt charset] (not sure if this works) +# add rmacs [End alt charset] (ditto) +# add smcup [enter_ca_mode] (save console; thanks Corinna) +# add rmcup [exit_ca_mode] (restore console; thanks Corinna) +# add kb2 [center of keypad] +# add u8 [user string 8] \E[?6c +# add el [clear to end of line] \E[K +# Notes: +# cnorm [make cursor normal] not implemented +# flash [flash] not implemented +# blink [blink] not implemented very usefully in cygwin? \E[5m +# dim [dim] not implemented very usefully in cygwin? \E[2m +# cub1 [cursor back 1] typically \E[D, but ^H is faster? +# kNXT [shifted next key] not implemented +# kPRV [shifted prev key] not implemented +# khome [home key] really is \E[1~ NOT \E[H +# tbc [clear tab stops] not implemented +# xenl [newline ignored after 80 cols] messes up last line? Ehud Karni +# smpch [Start PC charset] is \E[11m, same as smacs +# rmpch [End PC charset] is \E[10m, same as rmacs +# mir [move in insert mode] fails in tack? +# bce [back color erase] causes problems with change background color? +# cvvis [make cursor very visible] causes a stackdump when testing with +# testcurs using the output option? \E[?25h\E[?8c +# civis [make cursor invisible] causes everything to stackdump? \E[?25l\E[?1c +# ech [erase characters param] broken \E[%p1%dX +# kcbt [back-tab key] not implemented in cygwin? \E[Z +# +# 2005/11/12 -TD +# Remove cbt since it does not work in current cygwin +# Add 'mir' and 'in' flags based on tack +cygwin|ANSI emulation for Cygwin, + am, hs, mir, msgr, xon, + colors#8, it#8, pairs#64, + bel=^G, bold=\E[1m, cr=\r, cub=\E[%p1%dD, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, el1=\E[1K, fsl=^G, home=\E[H, ht=^I, + ind=\n, invis=\E[8m, kb2=\E[G, kf1=\E[[A, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, + kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, kspd=^Z, nel=\r\n, op=\E[39;49m, rc=\E8, + rev=\E[7m, ri=\EM, rmpch=\E[10m, rmso=\E[27m, rmul=\E[24m, + rs1=\Ec\E]R, sc=\E7, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7 + %t;8%;%?%p9%t;11%;m, + sgr0=\E[0;10m, smpch=\E[11m, smso=\E[7m, smul=\E[4m, + tsl=\E];, use=ansi+arrows, use=ansi+erase, use=ansi+idc, + use=ansi+idl, use=ansi+local, use=ansi+rca2, + use=vt220+pcedit, use=vt102+enq, use=klone+acs, + use=xterm+alt47, + +# I've supplied this so that you can help test new values and add other +# features. Cheers, earnie_boyd@yahoo.com. +# +# Some features are from pcansi. The op value is from linux. Function-keys +# are from linux. These have been tested not to cause problems. xenl was in +# this list, but DOES cause problems so it has been removed +cygwinDBG|Debug Version for Cygwin, + am, eo, mir, msgr, xon, + cols#80, lines#24, ncv#3, + bel=^G, cr=\r, cup=\E[%i%p1%d;%p2%dH, dim=\E[2m, el1=\E[1K, + flash=\E[?5h$<200/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ind=\n, kNXT=\E[6$, kPRV=\E[5$, kb2=\E[G, kcbt=\E[Z, + kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[[B, + kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[1~, kspd=^Z, + nel=\r\n, op=\E[39;49m, rc=\E8, ri=\EM, rs1=\Ec\E]R, sc=\E7, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5 + %t;2%;%?%p6%t;1%;%?%p7%t;8%;%?%p9%t;12%;m, + sgr0=\E[0;10m, vpa=\E[%i%p1%dd, use=ansi+arrows, + use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, use=ansi+sgrbold, + use=klone+acs, use=klone+color, use=vt220+pcedit, + use=vt220+cvis, use=vt102+enq, + +#### DJGPP + +# Key definitions: +# The encodings for unshifted arrow keys, F1-F12, Home, Insert, etc. match the +# encodings used by other x86 environments. All others are invented for DJGPP. +# Oddly enough, while several combinations of modifiers are tabulated, there is +# none for shifted cursor keys. +# +# kf1-kf12: +# F1 \E[[A +# F2 \E[[B +# F3 \E[[C +# F4 \E[[D +# F5 \E[[E +# F6 \E[17~ +# F7 \E[18~ +# F8 \E[19~ +# F9 \E[20~ +# F10 \E[21~ +# F11 \E[23~ +# F12 \E[24~ +# +# Delete \E[3~ +# Down Arrow \E[B +# End \E[4~ +# Home \E[1~ +# Insert \E[2~ +# Left Arrow \E[D +# Page Down \E[6~ +# Page Up \E[5~ +# Right Arrow \E[C +# Up Arrow \E[A +# +# kf13-kf24: +# Shift-F1 \E[25~ +# Shift-F2 \E[26~ +# Shift-F3 \E[27~ +# Shift-F4 \E[28~ +# Shift-F5 \E[29~ +# Shift-F6 \E[30~ +# Shift-F7 \E[31~ +# Shift-F8 \E[32~ +# Shift-F9 \E[33~ +# Shift-F10 \E[34~ +# Shift-F11 \E[35~ +# Shift-F12 \E[36~ +# +# kf25-kf36: +# Ctrl-F1 \E[47~ +# Ctrl-F2 \E[48~ +# Ctrl-F3 \E[49~ +# Ctrl-F4 \E[50~ +# Ctrl-F5 \E[51~ +# Ctrl-F6 \E[52~ +# Ctrl-F7 \E[53~ +# Ctrl-F8 \E[54~ +# Ctrl-F9 \E[55~ +# Ctrl-F10 \E[56~ +# Ctrl-F11 \E[57~ +# Ctrl-F12 \E[58~ +# +# Ctrl-Delete \E[43~ +# Ctrl-Down Arrow \E[38~ +# Ctrl-End \E[44~ +# Ctrl-Home \E[41~ +# Ctrl-Insert \E[42~ +# Ctrl-Left Arrow \E[39~ +# Ctrl-Page Down \E[46~ +# Ctrl-Page Up \E[45~ +# Ctrl-Right Arrow \E[40~ +# Ctrl-Up Arrow \E[37~ +# +# kf37-kf48: +# Alt-F1 \E[59~ +# Alt-F2 \E[60~ +# Alt-F3 \E[61~ +# Alt-F4 \E[62~ +# Alt-F5 \E[63~ +# Alt-F6 \E[64~ +# Alt-F7 \E[65~ +# Alt-F8 \E[66~ +# Alt-F9 \E[67~ +# Alt-F10 \E[68~ +# Alt-F11 \E[79~ +# Alt-F12 \E[80~ +# +# ignore (conflicting): +# Alt-Delete \E[65~ +# Alt-Down Arrow \E[60~ +# Alt-End \E[66~ +# Alt-Home \E[41~ +# Alt-Insert \E[64~ +# Alt-Left Arrow \E[61~ +# Alt-Page Down \E[68~ +# Alt-Page Up \E[67~ +# Alt-Right Arrow \E[62~ +# Alt-Up Arrow \E[59~ +# +# Also: +# Alt-A \E[82~ +# Alt-B \E[82~ +# Alt-C \E[83~ +# Alt-D \E[84~ +# Alt-E \E[85~ +# Alt-F \E[86~ +# Alt-G \E[87~ +# Alt-H \E[88~ +# Alt-I \E[89~ +# Alt-J \E[90~ +# Alt-K \E[91~ +# Alt-L \E[92~ +# Alt-M \E[93~ +# Alt-N \E[94~ +# Alt-O \E[95~ +# Alt-P \E[96~ +# Alt-Q \E[97~ +# Alt-R \E[98~ +# Alt-S \E[99~ +# Alt-T \E[100~ +# Alt-U \E[101~ +# Alt-V \E[102~ +# Alt-W \E[103~ +# Alt-X \E[104~ +# Alt-Y \E[105~ +# Alt-Z \E[106~ +djgpp|ANSI emulation for DJGPP 2.05, + am, bce, msgr, xhp, xon, xt, + colors#8, it#8, pairs#64, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j + \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v + \301w\302x\263y\363z\362{\343|\330}\234~\376, + bel=^G, bold=\E[1m, cbt=\E[Z, civis=\E[1v, cnorm=\E[v, cr=\r, + cub1=^H, cup=\E[%i%p1%d;%p2%dH, cvvis=\E[2v, + dch=\E[%p1%dP, dch1=\E[P, ech=\E[%p1%dX, el1=\E[1K, + home=\E[H, hpa=\E[%i%p1%dG, ht=^I, ich=\E[%p1%d@, + ich1=\E[@, ind=\E[S, kf1=\E[[A, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[27~, + kf16=\E[28~, kf17=\E[29~, kf18=\E[30~, kf19=\E[31~, + kf2=\E[[B, kf20=\E[32~, kf21=\E[33~, kf22=\E[34~, + kf23=\E[35~, kf24=\E[36~, kf25=\E[47~, kf26=\E[48~, + kf27=\E[49~, kf28=\E[50~, kf29=\E[51~, kf3=\E[[C, + kf30=\E[52~, kf31=\E[53~, kf32=\E[54~, kf33=\E[55~, + kf34=\E[56~, kf35=\E[57~, kf36=\E[58~, kf37=\E[59~, + kf38=\E[60~, kf39=\E[61~, kf4=\E[[D, kf40=\E[62~, + kf41=\E[63~, kf42=\E[64~, kf43=\E[65~, kf44=\E[66~, + kf45=\E[67~, kf46=\E[68~, kf48=\E[80~, kf5=\E[[E, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, nel=\r\n, op=\E[37;40m, ri=\E[T, rmso=\E[m, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%e;25%;%? + %p6%t;1%;%?%p7%t;8%;m, + sgr0=\E[m, smso=\E[7m, smul=\E[4m, vpa=\E[%i%p1%dd, + alt_A=\E[82~, alt_B=\E[82~, alt_C=\E[83~, alt_D=\E[84~, + alt_E=\E[85~, alt_F=\E[86~, alt_G=\E[87~, alt_H=\E[88~, + alt_I=\E[89~, alt_J=\E[90~, alt_K=\E[91~, alt_L=\E[92~, + alt_M=\E[93~, alt_N=\E[94~, alt_O=\E[95~, alt_P=\E[96~, + alt_Q=\E[97~, alt_R=\E[98~, alt_S=\E[99~, alt_T=\E[100~, + alt_U=\E[101~, alt_V=\E[102~, alt_W=\E[103~, + alt_X=\E[104~, alt_Y=\E[105~, alt_Z=\E[106~, kDC5=\E[43~, + kDN5=\E[38~, kEND5=\E[44~, kHOM5=\E[41~, kIC5=\E[42~, + kLFT5=\E[39~, kNXT5=\E[46~, kPRV5=\E[45~, kRIT5=\E[40~, + kUP5=\E[37~, use=ansi+arrows, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=ansi+sgr, + use=vt220+pcedit, use=ecma+index, + +djgpp203|entry for DJGPP 2.03, + OTbs, am, + cols#80, it#8, lines#25, + bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, kbs=^H, kcub1=^H, + kcud1=\n, nel=\r\n, + +djgpp204|entry for DJGPP 2.04, + OTbs, am, AX, + colors#8, cols#80, it#8, lines#25, ncv#3, pairs#64, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[1v, + clear=\E[H\E[2J, cnorm=\E[v, cr=\r, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E[2v, dch=\E[%p1%dP, + dch1=\E[P, ech=\E[%p1%dX, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + ich=\E[%p1%d@, ich1=\E[@, ind=\E[S, invis=\E[8m, + kf0=\E[21~, kf1=\E[[A, kf10=\E[21~, kf2=\E[[B, kf3=\E[[C, + kf4=\E[[D, kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, + kf9=\E[20~, khome=\E[1~, kll=\E[4~, nel=\r\n, rev=\E[7m, + ri=\E[T, rmso=\E[m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + sgr0=\E[m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+idl, use=ansi+local, use=vt220+pcedit, + use=ecma+index, + +#### U/Win + +# This is tested using U/Win's telnet. Scrolling is omitted because it is +# buggy. Another odd bug appears when displaying "~" in alternate character +# set (the emulator spits out error messages). Compare with att6386 -TD +uwin|U/Win 3.2 console, + am, eo, in, msgr, xenl, xon, + it#8, ncv#58, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260i + \316j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u + \264v\301w\302x\263y\363z\362{\343|\330}\234~\376, + bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dim=\E[2m, + ech=\E[%p1%dX, el1=\E[1K, home=\E[H, ht=^I, hts=\EH, + kdch1=^?, kend=\E[Y, kf1=\EOP, kf10=\EOY, kf11=\EOZ, + kf12=\EOA, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, + kf7=\EOV, kf8=\EOW, kf9=\EOX, kich1=\E[@, nel=\r\n, + op=\E[39;49m, rc=\E8, rev=\E[7m, rmacs=\E[10m, + rmpch=\E[10m, rmso=\E[27m, rmul=\E[m, rs1=\Ec\E]R, sc=\E7, + sgr0=\E[0;10m, smacs=\E[11m, smpch=\E[11m, smso=\E[7m, + smul=\E[4m, tbc=\E[3g, use=ansi+arrows, use=ansi+cpr, + use=ansi+erase, use=ansi+idc, use=klone+color, + use=vt220+cvis, + +#### Microsoft (miscellaneous) + +# This entry fits the Windows NT console when the _POSIX_TERM environment +# variable is set to 'on'. While the Windows NT POSIX console is seldom used, +# the Telnet client supplied with both the Windows for WorkGroup 3.11 TCP/IP +# stack and the Win32 (i.e., Windows 95 and Windows NT 3.1 or later) operating +# systems is not, and (surprise!) they match very well. +# +# See: MS Knowledge Base item Q108581, dated 13-MAY-1997, titled "Setting Up +# VI POSIX Editor for Windows NT 3.1". True to Microsoft form, not only +# are the installation instructions a pile of mind-numbing bureaucratese, +# but the termcap entry is actually broken and unusable as given; the :do: +# capability is misspelled "d". +# +# To use this, you need to a bunch of environment variables: +# +# SET _POSIX_TERM=on +# SET TERM=ansi +# SET TERMCAP=location of termcap file in POSIX file format +# which is case-sensitive. +# e.g. SET TERMCAP=//D/RESKIT35/posix/termcap +# SET TMP=//C/TEMP +# +# Important note: setting the TMP environment variable in POSIX style renders +# it incompatible with a lot of other applications, including Visual C++. So +# you should have a separate command window just for vi. All the other +# variables may be permanently set in the Control Panel\System applet. +# +# You can find out more about the restrictions of this facility at +# +# +# From: Federico Bianchi , 15 Jan 1997 +ansi-nt|psx_ansi|Microsoft Windows NT console POSIX ANSI mode, + am, bw, msgr, + cols#80, it#8, lines#25, + bel=^G, clear=\E[2J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, ed=\E[J, el=\E[K, + home=\E[H, ht=^I, ind=\E[S, kbs=^H, kcub1=\E[D, kcud1=\E[V, + kcuf1=\E[C, kcuu1=\E[A, nel=\r\E[S, rc=\E[u, rev=\E[7m, + ri=\E[T, rmso=\E[m, sc=\E[s, sgr0=\E[0m, smso=\E[7m, +# From: jew@venus.sunquest.com +# Date: 19 Feb 93 23:41:07 GMT +# Here's a combination of ansi and vt100 termcap +# entries that works nearly perfectly for me +# (Gateway 2000 Handbook and Microsoft Works 3.0): +pcmw|PC running Microsoft Works, + am, xenl, + cols#80, it#8, lines#24, vt#3, + bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>, + clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2/>, cup=\E[%i%p1%d;%p2%dH$<5/>, + cuu1=\E[A$<2/>, ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, + ht=^I, hts=\EH$<2/>, ind=\ED$<5/>, is2=\E[1;24r\E[24;1H, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\r\ED$<5/>, + rc=\E8, rev=\E[7m$<2/>, rf=/usr/share/tabset/vt100, + ri=\EM$<5/>, rmso=\E[m$<2/>, rmul=\E[m$<2/>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7, + sgr0=\E[m$<2/>, smso=\E[7m$<2/>, smul=\E[4m$<2/>, + tbc=\E[3g$<2/>, + +# From: Federico Bianchi +# This is the entry for the OpenNT terminal. +# The ntconsole name is for backward compatibility. +# This is for OpenNT 2.0 and later. +# Later OpenNT was renamed to Interix. +# +# Presently it is distributed by Microsoft as Services For Unix (SFU). +# The 3.5 beta contained ncurses 4.2 (that is header files and executables, +# the documentation dated from 1.9.9e) -TD +# +# For a US keyboard, with 12 function-kecbt=\E[Z, ys, +# kf1-kf12 are unmodifiedcbt=\E[Z, cbt=\E[Z, +# kf13-kf24 use the shift-key +# kf25-kf36 use the left alt-key +# kf37-kf38 use the control-key +# kf49-kf60 use the shift- and control-keys +# The shifted cursor keys send the sequences originally used for kf61-kf64: +# down=\EF+ (kf61) +# up=\EF- (kf62) +# left=\EF^ (unassigned) +# right=\EF$ (kf64) + +interix|opennt|opennt-25|ntconsole|ntconsole-25|OpenNT-term compatible with color, + am, bce, msgr, + cols#80, it#8, lines#25, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j + \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v + \301w\302x\263y\363z\362{\343|\330}\234~\376, + bel=^G, bold=\E[1m, clear=\E[2J, cr=\r, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + ind=\E[S, kLFT=\EF\^, kRIT=\EF$, kcbt=\E[Z, kdch1=^?, + kend=\E[U, kf0=\EFA, kf1=\EF1, kf10=\EFA, kf11=\EFB, + kf12=\EFC, kf13=\EFD, kf14=\EFE, kf15=\EFF, kf16=\EFG, + kf17=\EFH, kf18=\EFI, kf19=\EFJ, kf2=\EF2, kf20=\EFK, + kf21=\EFL, kf22=\EFM, kf23=\EFN, kf24=\EFO, kf25=\EFP, + kf26=\EFQ, kf27=\EFR, kf28=\EFS, kf29=\EFT, kf3=\EF3, + kf30=\EFU, kf31=\EFV, kf32=\EFW, kf33=\EFX, kf34=\EFY, + kf35=\EFZ, kf36=\EFa, kf37=\EFb, kf38=\EFc, kf39=\EFd, + kf4=\EF4, kf40=\EFe, kf41=\EFf, kf42=\EFg, kf43=\EFh, + kf44=\EFi, kf45=\EFj, kf46=\EFk, kf47=\EFm, kf48=\EFn, + kf49=\EFo, kf5=\EF5, kf50=\EFp, kf51=\EFq, kf52=\EFr, + kf53=\EFs, kf54=\EFt, kf55=\EFu, kf56=\EFv, kf57=\EFw, + kf58=\EFx, kf59=\EFy, kf6=\EF6, kf60=\EFz, kf7=\EF7, + kf8=\EF8, kf9=\EF9, kich1=\E[L, kind=\EF+, kll=\E[U, + knp=\E[T, kpp=\E[S, kri=\EF-, ll=\E[U, nel=\r\n, op=\E[m, + rc=\E[u, rev=\E[7m, ri=\E[T, rmcup=\E[2b\E[u\r\E[K, + rmso=\E[m, rmul=\E[m, rs1=\Ec, sc=\E[s, sgr0=\E[0m, + smcup=\E[s\E[1b, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+idl, use=ansi+local, use=ecma+index, + use=klone+color, + +opennt-35|ntconsole-35|OpenNT-term35 compatible with color, + lines#35, use=opennt, + +opennt-50|ntconsole-50|OpenNT-term50 compatible with color, + lines#50, use=opennt, + +opennt-60|ntconsole-60|OpenNT-term60 compatible with color, + lines#60, use=opennt, + +opennt-100|ntconsole-100|OpenNT-term100 compatible with color, + lines#100, use=opennt, + +# OpenNT wide terminals +opennt-w|opennt-25-w|ntconsole-w|ntconsole-25-w|OpenNT-term-w compat with color, + cols#125, use=opennt, + +opennt-35-w|ntconsole-35-w|OpenNT-term35-w compatible with color, + lines#35, use=opennt-w, + +opennt-50-w|ntconsole-50-w|OpenNT-term50-w compatible with color, + lines#50, use=opennt-w, + +opennt-60-w|ntconsole-60-w|OpenNT-term60-w compatible with color, + lines#60, use=opennt-w, + +opennt-w-vt|opennt-25-w-vt|ntconsole-w-vt|ntconsole-25-w-vt|OpenNT-term-w-vt compat with color, + cols#132, use=opennt, + +# OpenNT terminals with no smcup/rmcup (names match termcap entries) +interix-nti|opennt-nti|opennt-25-nti|ntconsole-25-nti|OpenNT-nti compatible with color, + rmcup@, smcup@, use=opennt, + +opennt-35-nti|ntconsole-35-nti|OpenNT-term35-nti compatible with color, + lines#35, use=opennt-nti, + +opennt-50-nti|ntconsole-50-nti|OpenNT-term50-nti compatible with color, + lines#50, use=opennt-nti, + +opennt-60-nti|ntconsole-60-nti|OpenNT-term60-nti compatible with color, + lines#60, use=opennt-nti, + +opennt-100-nti|ntconsole-100-nti|OpenNT-term100-nti compatible with color, + lines#100, use=opennt-nti, + +######## COMMON TERMINAL TYPES +# +# This section describes terminal classes and maker brands that are still +# quite common, but have proprietary command sets not blessed by ANSI. +# + +#### Altos +# +# Altos made a moderately successful line of UNIX boxes. In 1990 they were +# bought out by Acer, a major Taiwanese manufacturer of PC-clones. +# Acer has a web site at http://www.acer.com. +# +# Altos descriptions from Ted Mittelstaedt 4 Sep 1993 +# His comments suggest they were shipped with the system. +# + +# (altos2: had extension capabilities +# :c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\ +# :c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\ +# :c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\ +# :cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r: +# :XU=^Aq\r:XD=^Ar\r:XR=^As\r:XL=^At\r:\ +# :YU=^AQ\r:YD=^AR\r:YR=^AS\r:YL=^AT\r:\ +# :HL=^AP\r:SP=\E[i:\ +# :IS=\E[@:DE=\E[P:IL=\E[L:NS=\E[S:PS=\E[T:\ +# :LO=\E[0q:LC=\E[5q:LL=\E[6q:\ +# Comparison with the k* capabilities makes it obvious that the c* things are +# shift keys. I have renamed them to keys 32 and up accordingly. Also, +# :sr: was given as a boolean-- esr) +altos2|alt2|altos-2|Altos II, + cols#80, it#8, lines#24, xmc#0, + clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\E[1B, cuf1=\E[1C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[1A, dch1=\E[P, dl1=\E[M, + ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@, + if=/usr/share/tabset/vt100, il1=\E[L, ind=\n, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kDL=^Am\r, + kEOL=^An\r, kcbt=^AK\r, kclr=^AL\r, kdch1=^AM\r, kel=^AN\r, + kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf32=^A`\r, + kf33=^Aa\r, kf34=^Ab\r, kf35=^Ac\r, kf36=^Ad\r, kf37=^Ae\r, + kf38=^Af\r, kf39=^Ag\r, kf4=^AC\r, kf40=^Ah\r, kf41=^Ai\r, + kf42=^Aj\r, kf43=^Ak\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=\E[f, kil1=^AJ\r, kind=^AO\r, + nel=\r\n, rmam=\E[?7l, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smam=\E[?7h, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + +# (altos3: had extension capabilities +# :c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\ +# :c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\ +# :c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\ +# :cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r: +# :XU=^Aq\r:XD=^Ar\r:XR=^As\r:XL=^At\r:\ +# :HL=^AP\r:SP=\E[i:\ +# :IS=\E[@:DE=\E[P:IL=\E[L:NS=\E[S:PS=\E[T: +altos3|altos5|alt3|alt5|altos-3|altos-5|Altos III or V, + blink=\E[5p, ri=\EM, sgr0=\E[p, use=altos2, +altos4|alt4|altos-4|Altos IV, + use=wy50, +# (altos7: had extension capabilities: +# :GG#0:GI=\EH8:GF=\EH7:\ +# :c0=^A`\r:c1=^Aa\r:c2=^Ab\r:c3=^Ac\r:\ +# :c4=^Ad\r:c5=^Ae\r:c6=^Af\r:c7=^Ag\r:\ +# :c8=^Ah\r:c9=^Ai\r:cA=^Aj\r:cB=^Ak\r:\ +# :cC=^Al\r:cD=^Am\r:cE=^An\r:cF=^Ao\r: +# Comparison with the k* capabilities makes it obvious that the c* things are +# shift keys. I have renamed them to keys 32 and up accordingly. I have +# also made this entry relative to adm12 in order to give it an . The +# imported by use=adm+sgr may work, let me know. -- esr) +altos7|alt7|Altos VII, + am, mir, + cols#80, lines#24, xmc#0, + acsc=j5k3l2m1n8q:t4u9v=w0x6, blink=\EG2, bold=\EGt, + clear=\E+^^, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dim=\EGp, dl1=\ER, ed=\EY, el=\ET, home=^^, ht=^I, il1=\EE, + ind=\n, invis=\EG1, + is2=\E`:\Ee(\EO\Ee6\Ec41\E~4\Ec21\Eu\E~2, kDL=^Am\r, + kEOL=^An\r, kbs=^H, kcbt=^AK\r, kclr=^AL\r, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=^AM\r, kel=^AN\r, + kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf32=^A`\r, + kf33=^Aa\r, kf34=^Ab\r, kf35=^Ac\r, kf36=^Ad\r, kf37=^Ae\r, + kf38=^Af\r, kf39=^Ag\r, kf4=^AC\r, kf40=^Ah\r, kf41=^Ai\r, + kf42=^Aj\r, kf43=^Ak\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=^^, kil1=^AJ\r, kind=^AO\r, + knp=\EK, kpp=\EJ, mc4=\EJ, mc5=\Ed#, nel=\r\n, ri=\Ej, + rmir=\Er, smir=\Eq, use=adm+sgr, +altos7pc|alt7pc|Altos PC VII, + kend=\ET, use=altos7, + +#### Hewlett-Packard (hp) +# +# Hewlett-Packard +# 8000 Foothills Blvd +# Roseville, CA 95747 +# Vox: 1-(916)-785-4363 (Technical response line for VDTs) +# 1-(800)-633-3600 (General customer support) +# +# +# As of March 1998, HP no longer has any terminals in production. +# The 700 series (22, 32, 41, 44, 92, 94, 96, 98) is still being +# supported (they still have parts). So are the 2392a and 2394a. +# See the WORKSTATION CONSOLES section for the 700s. +# + +# Generic HP terminal - this should (hopefully) work on any HP terminal. +hpgeneric|hp|Hewlett-Packard generic terminal, + OTbs, OTpt, am, da, db, mir, xhp, + cols#80, lines#24, lm#0, vt#6, + bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\E&a%p2%dc%p1%dY$<6>, cuu1=\EA, dch1=\EP, dl1=\EM, + ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1, il1=\EL, + ind=\n, kbs=^H, kcbt=\Ei, rmir=\ER, rmso=\E&d@, rmul=\E&d@, + sgr0=\E&d@, smir=\EQ, smso=\E&dJ, smul=\E&dD, tbc=\E3, + vpa=\E&a%p1%dY, + +hp110|Hewlett-Packard model 110 portable, + lines#16, use=hpgeneric, + +hp+pfk+cr|HP function keys with CR, + kf1=\Ep\r, kf2=\Eq\r, kf3=\Er\r, kf4=\Es\r, kf5=\Et\r, + kf6=\Eu\r, kf7=\Ev\r, kf8=\Ew\r, + +hp+pfk-cr|HP function keys w/o CR, + kf1=\Ep, kf2=\Eq, kf3=\Er, kf4=\Es, kf5=\Et, kf6=\Eu, kf7=\Ev, + kf8=\Ew, + +# The hp2621s use the same keys for the arrows and function keys, +# but not separate escape sequences. These definitions allow the +# user to use those keys as arrow keys rather than as function +# keys. +hp+pfk+arrows|HP alternate arrow definitions, + kcub1=\Eu\r, kcud1=\Ew\r, kcuf1=\Ev\r, kcuu1=\Et\r, kf1@, + kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, khome=\Ep\r, kind=\Er\r, + kll=\Eq\r, kri=\Es\r, + +hp+arrows|HP arrow definitions, + khome=\Eh, kind=\ES, kll=\EF, kri=\ET, use=vt52+arrows, + +# Generic stuff from the HP 262x series +# +hp262x|HP 262x terminals, + xhp, + blink=\E&dA, dch1=\EP$<2>, ed=\EJ, ht=\011$<2>, ind=\ES, + invis=\E&dS, ip=$<2>, kdch1=\EP, kdl1=\EM, ked=\EJ, kel=\EK, + khome=\Eh, kich1=\EQ, kil1=\EL, kind=\ES, knp=\EU, kpp=\EV, + kri=\ET, krmir=\ER, rev=\E&dB, rmkx=\E&s0A, rmso=\E&d@, + rmul=\E&d@, + sgr=\E&d%{64}%?%p1%t%{66}%|%;%?%p2%t%{68}%|%;%?%p3%t%{66}%| + %;%?%p4%t%{65}%|%;%c, + sgr0=\E&d@, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, + use=vt52+arrows, + +# Note: no on HPs since that homes to top of memory, not screen. +# Due to severe 2621 braindamage, the only way to get the arrow keys to +# transmit anything at all is to turn on the function key labels +# with , and even then the user has to hold down shift! +# The default 2621 turns off the labels except when it has to to +# enable the function keys. If your installation prefers labels +# on all the time, or off all the time (at the "expense" of the +# function keys), use 2621-nl or 2621-wl. +# +# Note: there are newer ROMs for 2621's that allow you to set +# strap A so the regular arrow keys xmit \EA, etc, as with the +# 2645. However, even with this strap set, the terminal stops +# xmitting if you reset it, until you unset and reset the strap! +# Since there is no way to set/unset the strap with an escape +# sequence, we don't use it in the default. +# If you like, you can use 2621-ba (brain-damaged arrow keys). +hp2621-ba|HP 2621 w/new rom and strap A set, + rmkx@, smkx@, use=hp+arrows, use=hp2621, + +# hp2621 with function labels. Most of the time they are off, +# but inside vi, the function key labels appear. You have to +# hold down shift to get them to xmit. +hp2621|hp2621a|hp2621A|2621|2621a|2621A|hp2621-wl|2621-wl|HP 2621 w/labels, + is2=\E&jA\r, rmkx=\E&jA, use=hp2621-fl, +hp2621-fl|HP 2621, + xhp@, xon, + pb#19200, + cbt=\Ei, cup=\E&a%p2%dc%p1%dY, dch1=\EP$<2>, ht=\011$<2>, + ip=$<2>, is2=\E&j@\r, rmkx=\E&j@, smkx=\E&jB, smso=\E&dD, + use=hp+pfk+cr, use=hpgeneric, + +# To use hp2621p printer, setenv TERM=2621p, PRINTER=2612p +hp2621p|HP 2621 with printer, + mc4=\E&p13C, mc5=\E&p11C, use=hp2621, + +hp2621p-a|HP 2621p with fn as arrows, + use=hp+pfk+arrows, use=hp2621p, + +# hp2621 with k45 keyboard +hp2621-k45|hp2621k45|k45|HP 2621 with 45 keyboard, + kbs=^H, khome=\Eh, rmkx=\E&s0A, smkx=\E&s1A, use=hp2621, + use=vt52+arrows, + +# 2621 using all 48 lines of memory, only 24 visible at any time. +hp2621-48|HP 48 line 2621, + lines#48, + cup=\E&a%p2%dc%p1%dR, home=\EH, vpa=\E&a%p1%dR, + use=hp2621, + +# 2621 with no labels ever. Also prevents vi delays on escape. +hp2621-nl|HP 2621 with no labels, + kcub1@, kcud1@, kcuf1@, kcuu1@, khome@, rmkx@, smkx@, + use=hp2621-fl, + +# Needed for UCB ARPAVAX console, since lsi-11 expands tabs +# (wrong). +# +hp2621-nt|HP 2621 w/no tabs, + ht@, use=hp2621, + +# Hp 2624 B with 4 or 10 pages of memory. +# +# Some assumptions are made with this entry. These settings are +# NOT set up by the initialization strings. +# +# Port Configuration +# RecvPace=Xon/Xoff +# XmitPace=Xon/Xoff +# StripNulDel=Yes +# +# Terminal Configuration +# InhHndShk=Yes +# InhDC2=Yes +# XmitFnctn(A)=No +# InhEolWrp=No +# +# Note: the 2624 DOES have a true , believe it or not! +# +# The 2624 has an "error line" to which messages can be sent. +# This is CLOSE to what is expected for a "status line". However, +# after a message is sent to the "error line", the next carriage +# return is EATEN and the "error line" is turned back off again! +# So I guess we can't define , , , , , . +# +# This entry supports emacs (and any other program that uses raw +# mode) at 4800 baud and less. I couldn't get the padding right +# for 9600. +# +# (hp2624: replaced NUL sequences in flash with mandatory pauses -- esr) +hp2624|hp2624a|hp2624b|hp2624b-4p|Hewlett Packard 2624 B, + da, db, + lm#96, + flash=\E&w13F$<66/>\E&w12F$<66/>\E&w13F$<66/>\E&w12F, use=hp+labels, use=scrhp, + +# This hp2626 entry does not use any of the fancy windowing stuff +# of the 2626. +# +# Indeed, terminfo does not yet handle such stuff. Since changing +# any window clears memory, it is probably not possible to use +# this for screen opt. +# +# ed is incredibly slow most of the time - I am guessing at the +# exact padding. Since the terminal uses xoff/xon this is intended +# only for cost computation, so that the terminal will prefer el +# or even dl1 which is probably faster! +# +# \ED\EJ\EC hack for ed from Ed Bradford - apparently ed is only +# extra slow on the last line of the window. +# +# The padding probably should be changed. +# +hp2626|hp2626a|hp2626p|HP 2626, + da, db, + lm#0, pb#19200, + ed=\ED\EJ$<500>\EC, indn=\E&r%p1%dD, ip=$<4>, + is2=\E&j@\r, rin=\E&r%p1%dU, use=hp+pfk-cr, + use=hp+labels, use=scrhp, + +# This entry is for sysline. It allocates a 23 line window with +# a 115 line workspace for regular use, and a 1 line window for +# the status line. +# +# This assumes port 2 is being used. +# Turn off horizontal line, Create ws #1 with 115 lines, +# Create ws #2 with 1 line, Create window #1 lines 1-23, +# Create window #2 lines 24-24, Attach cursor to workspace #1. +# Note that this clears the tabs so it must be done by tset before +# it sets the tabs. +# +hp2626-s|HP 2626 using only 23 lines, + eslok, hs, + lines#23, + fsl=\E&d@\E&w7f2p1I\E&w4f1I, + is1=\E&q3t0{0H\s\E&w0f115n1I\s\E&w0f1n2I\s\E&w2f1i0d0u22l0S + \s\E&w2f2i0d23u23l0S\s\E&w7f2p1I\s\r, + tsl=\E&w7f2p2I\E&w4f2I\r\EK\E&a%p1%dC, use=hp2626, +# Force terminal back to 24 lines after being 23. +hp2626-ns|HP 2626 using all 24 lines, + is1=\E&q3t0{0H\s\E&w0f118n1I\s\E&w0f1n2I\s\E&w2f1i0d0u23l0S + \s\E&w3f2I\s\E&w7f2p1I\s\r, + use=hp2626, +# Various entries useful for small windows on 2626. +hp2626-12|Hewlett-Packard 2626 12 lines, + lines#12, use=hp2626, +hp2626-12x40|Hewlett-Packard 2626 12 lines 40 columns, + cols#40, lines#12, use=hp2626, +hp2626-x40|Hewlett-Packard 2626 40 columns, + cols#40, use=hp2626, +hp2626-12-s|Hewlett-Packard 2626 11 lines plus status, + lines#11, use=hp2626-s, + +# +# hp2627 color tubes from University of Wisconsin +# +hp2627a-rev|HP 2627 with reverse video colors, + ht=^I, + is2=\E&v0m1a0b0c1x1y1z1i0a0b1c1x1y1z0i0S\E&j@\r\E3 + \r, + kcub1=^H, kcud1=\n, nel=\r\n, rmul=\E&v0S\E&d@, + smul=\E&dD\E&v1S, use=hp2621-nl, +hp2627a|HP 2627 color terminal with no labels, + ht=^I, + is2=\E&v0m1a1b0c1i0a1b1c2i1a0b0c0i0S\E&j@\r\E3\r, + kcub1=^H, kcud1=\n, nel=\r\n, rmso=\E&v0S, + rmul=\E&v0S\E&d@, smso=\E&v2S, smul=\E&dD\E&v1S, + use=hp2621-nl, +hp2627c|HP 2627 color (cyan) terminal with no labels, + is2=\E&v0m1a0b0c2i1a1b0c1i0a1b1c0i0S\E&j@\r\E3\r, + use=hp2627a, + +# hp2640a doesn't have the Y cursor addressing feature, and C is +# memory relative instead of screen relative, as we need. +# +hp2640a|HP 2640a, + cup@, rmkx@, smkx@, use=hp2645, + +hp2640b|hp2644a|HP 264x series, + rmkx@, smkx@, use=hp2645, + +# (hp2641a: removed unknown :gu: -- esr) +hp2641a|hp2645a|hp2647a|HP 264?A series BRL entry, + am, da, db, mir, xhp, + cols#80, lines#24, + bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\E&a%p2%2dc%p1%2dY, cuu1=\EA, dch1=\EP, dl1=\EM, + ed=\EJ, el=\EK, hpa=\E&a%p1%2dC, ht=^I, + if=/usr/share/tabset/std, il1=\EL, ind=\n, + is2=\EE$<500/>, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, + rmir=\ER, rmso=\E&d@, smir=\EQ, smso=\E&dB, + vpa=\E&a%p1%2dY, + +# This terminal should be used at 4800 baud or less. It needs padding for +# plain characters at 9600, I guessed at an appropriate cr delay. It really +# wants ^E/^F handshaking, but that doesn't work well even if you write +# software to support it. +hp2645|hp45|HP 2645 series, + pb#9600, + blink=\E&dA, cr=\r$<20>, dim=\E&dH, kctab=\E2, kdch1=\EP, + kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh, khts=\E1, kich1=\EQ, + kil1=\EL, kind=\ES, knp=\EU, kpp=\EV, kri=\ET, krmir=\ER, + rev=\E&dB, rmkx=\E&s0A, + sgr=\E&d%{64}%?%p1%t%{66}%|%;%?%p2%t%{68}%|%;%?%p3%t%{66}%| + %;%?%p4%t%{65}%|%;%?%p5%t%{72}%|%;%?%p6%t%{66}%|%;%c, + sgr0=\E&d@, smkx=\E&s1A, use=hpgeneric, use=vt52+arrows, +# You should use this terminal at 4800 baud or less. +hp2648|hp2648a|HP 2648a graphics terminal, + clear=\EH\EJ$<50>, cup=\E&a%p2%dc%p1%dY$<20>, + dch1=\EP$<7>, ip=$<5>, use=hp2645, + +# The HP 150 terminal is a fairly vanilla HP terminal, with the +# clreol standout problem. It also has graphics capabilities and +# a touch screen, which we don't describe here. +hp150|Hewlett Packard Model 150, + OTbs, use=hp2622, + +# HP 2382a terminals, "the little ones." They don't have any +# alternate character set support and sending out ^N/^O will +# leave the screen blank. +hp2382a|hp2382|Hewlett Packard 2382a, + da, db, + lh#1, lm#48, + acsc@, + pln=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t\s%;%p2 + %s, + rmacs@, + sgr=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga + %+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+ + %Pa%;%?%p7%t%?%ga%ts%ga%{64}%+%e%{83}%;%e%?%ga%t%ga%{64} + %+%e%{64}%;%;%c, + sgr0=\E&d@, smacs@, use=hp+labels, use=scrhp, + +hp2621-a|hp2621a-a|hp2621 with fn as arrows, + use=hp+pfk+arrows, use=hp2621-fl, + +# newer hewlett packard terminals + +newhpkeyboard|generic entry for HP extended keyboard, + kbs=^H, kcbt=\Ei, kclr=\EJ, kdch1=\EP, kdl1=\EM, ked=\EJ, + kel=\EK, khome=\Eh, kich1=\EQ, kil1=\EL, kind=\ET, kll=\EF, + knp=\EU, kpp=\EV, kri=\ES, krmir=\ER, rmkx=\E&s0A, + smkx=\E&s1A, use=hp+pfk-cr, use=vt52+arrows, + +newhp|generic entry for new Hewlett Packard terminals, + am, bw, mir, xhp, xon, + cols#80, lines#24, pb#4800, + acsc=2[3@4>5I9(:'JSKWLQMAO#P$Q;R!S"T1U2V4W3X:Y+Z*dHjGkTlRmFn + /q\,t5u6v8w7x., + bel=^G, blink=\E&dA, bold=\E&dF, cbt=\Ei, cr=\r, cub1=^H, + cud1=\n, cuf1=\EC, cuu1=\EA, dch1=\EP$<2>, dim=\E&dH, + dl1=\EM, ed=\EJ, el=\EK, ht=\011$<2>, hts=\E1, il1=\EL, ind=\n, + invis=\E&dS, ip=$<2>, is1=\E&jB$<8>, nel=\r\n, + pfkey=\E&f0a%p1%dk0d%p2%l%dL%p2%s, + pfloc=\E&f1a%p1%dk0d%p2%l%dL%p2%s, + pfx=\E&f2a%p1%dk0d%p2%l%dL%p2%s, rev=\E&dB, ri=\ET, + rmacs=^O, rmir=\ER, rmso=\E&d@, rmul=\E&d@, rs1=\Eg, + sgr=\E&d%{0}%Pa%?%p4%t%{1}%ga%+%Pa%;%?%p1%p3%|%p6%|%t%{2}%ga + %+%Pa%;%?%p2%p6%|%t%{4}%ga%+%Pa%;%?%p1%p5%|%t%{8}%ga%+ + %Pa%;%?%p7%t%?%ga%ts%ga%{64}%+%e%{83}%;%e%?%ga%t%ga%{64} + %+%e%{64}%;%;%c%?%p9%t\016%e\017%;, + sgr0=\E&d@\017, smacs=^N, smir=\EQ, smso=\E&dJ, smul=\E&dD, + tbc=\E3, use=newhpkeyboard, + +memhp|memory relative addressing for new HP ttys, + vt#6, + clear=\EH\EJ$<40>, cub=\E&a-%p1%dC, cud=\E&a+%p1%dR, + cuf=\E&a+%p1%dC, cup=\E&a%p1%dr%p2%dC, cuu=\E&a-%p1%dR, + home=\EH, hpa=\E&a%p1%dC, ll=\E&a23R\r, + mrcup=\E&a%p1%dr%p2%dC, vpa=\E&a%p1%dR, use=newhp, + +scrhp|screen relative addressing for new HP ttys, + clear=\E&a0c0Y\EJ$<40>, cub=\E&a-%p1%dC, + cud=\E&a+%p1%dR, cuf=\E&a+%p1%dC, + cup=\E&a%p1%dy%p2%dC$<10>, cuu=\E&a-%p1%dR, + home=\E&a0y0C, hpa=\E&a%p1%dC, ll=\E&a0y0C\EA, + mrcup=\E&a%p1%dr%p2%dC, vpa=\E&a%p1%dY, use=newhp, + +# (hp+labels: added label values from a BRL termcap -- esr) +hp+labels|"standard" label info for new HP ttys, + lh#2, lw#8, nlab#8, + lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, + pln=\E&f2a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d0L%?%ga%!%t\s%;%p2 + %s, + rmln=\E&j@, smln=\E&jB, + +hp+printer|"standard" printer info for HP ttys, + ff=\E&p4u0C, mc0=\EH\E&p4dF, mc4=\E&p13C, mc5=\E&p11C, + + +# The new hp2621b is kind of a cross between the old 2621 and the +# new 262x series of machines. It has dip-switched options. +# The firmware has a bug in it such that if you give it a null +# length label, the following character is eaten! +hp2621b|HP 2621b with old style keyboard, + lh#1, lm#48, lw#8, nlab#8, + khome=\Eh, kind=\ET, kll=\EF, kri=\ES, + pln=\E&f0a%p1%dk%p2%l%Pa%?%ga%t%ga%d%e1%;d3L%?%ga%!%t%{32}%c + %;%p2%s\E%{111}%p1%+%c\r, + smln=\E&jB, use=hp2621, use=vt52+arrows, + +hp2621b-p|HP 2621b with printer, + use=hp+printer, use=hp2621b, + +# hp2621b - new 2621b with new extended keyboard +# these are closer to the new 26xx series than the other 2621b +hp2621b-kx|HP 2621b with extended keyboard, + use=newhpkeyboard, use=hp2621b, + +hp2621b-kx-p|HP 2621b with new keyboard & printer, + use=hp+printer, use=hp2621b-kx, + +# Some assumptions are made in the following entries. +# These settings are NOT set up by the initialization strings. +# +# Port Configuration +# RecvPace=Xon/Xoff XmitPace=Xon/Xoff StripNulDel=Yes +# +# Terminal Configuration +# InhHndShk(G)=Yes InhDC2(H)=Yes +# XmitFnctn(A)=No InhEolWrp=No +# +# +# Hp 2622a & hp2623a display and graphics terminals +# +hp2622|hp2622a|HP 2622, + da, db, + lm#0, pb#19200, + is2=\E&dj@\r, use=hp+pfk-cr, use=hp+labels, use=scrhp, + +# The 2623 is a 2622 with extra graphics hardware. +hp2623|hp2623a|HP 2623, + use=hp2622, + +hp2624b-p|hp2624b-4p-p|Hewlett Packard 2624 B with printer, + use=hp+printer, use=hp2624, + +# The hewlett packard B can have an optional extra 6 pages of memory. +hp2624-10p|hp2624a-10p|hp2624b-10p|Hewlett Packard 2624 B w/ 10 pages of memory, + lm#240, use=hp2624, + +hp2624b-10p-p|Hewlett Packard 2624 B w/ extra memory & printer, + lm#240, use=hp2624b-p, + +# Color manipulations for HP terminals +hp+color|HP with colors, + ccc, + colors#16, ncv#17, pairs#7, + initp=\E&v%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e. + %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1 + %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%= + %t1%e.%p7%d%;z%p1%dI, + oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5 + I\E&v1b1c6I\E&v1x1y7I, + op=\E&v0S, scp=\E&v%p1%dS, + +# sets the screen to be 80 columns wide +hp2397a|hp2397|Hewlett Packard 2397A color terminal, + is2=\E&w6f80X, use=memhp, use=hp+labels, use=hp+color, + +# HP 700/44 Setup parameters: +# Terminal Mode HP-PCterm +# Inhibit Auto Wrap NO +# Status Line Host Writable +# PC Character Set YES +# Twenty-Five Line Mode YES +# XON/XOFF @128 or 64 (sc) +# Keycode Mode NO or YES (sc) +# Backspace Key BS or BS/DEL +# +# sets pcterm; autowrap; 25 lines; pc char set; prog DEL key; +# \E\\? does not turn off keycode mode +# sets alternate start/stop; keycode on +hpansi|hp700|Hewlett Packard 700/44 in HP-PCterm mode, + am, eo, xenl, xon, + cols#80, lines#25, + acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x + \263, + bel=^G, cbt=\E[Z, clear=\E[2J\E[H, cr=\r, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, ed=\E[J, + el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, ind=\n, + is2=\E[44"p\E[?7h\E[>10h\E[>12h\EP1;1|3/7F\E\\, + kcbt=\E[Z, kend=\E[4~, kf1=\E[17~, kf10=\E[28~, kf2=\E[18~, + kf3=\E[19~, kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, + kf8=\E[25~, kf9=\E[26~, khome=\E[1~, knp=\E[6~, kpp=\E[5~, + rmam=\E[?7l, rmsc=\E[>11l\EP1**x0/11;1/13\E[m\E\\, + rmso=\E[m, rmul=\E[m, sgr0=\E[m, smam=\E[?7h, + smsc=\E[>11h\EPO**x0/65;1/67\E\\$<250>, smso=\E[7m, + smul=\E[4m, xoffc=g, xonc=e, use=ansi+arrows, + use=ansi+local1, use=vt220+cvis, +# +# (hp2392: copied here from hpex -- esr) +hp2392|239x series, + cols#80, + cbt=\Ei, cup=\E&a%p1%dy%p2%dC, khome=\Eh, kind=\EU, + knp=\Eu, kpp=\Ev, kri=\EV, rmir=\ER, rmul=\E&d@, smir=\EQ, + smul=\E&dD, vpa=\E&a%p1%dY, use=hpsub, use=hp+pfk+cr, + +hpsub|HP terminals -- capability subset, + am, da, db, mir, xhp, xon, + lines#24, + bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cuu1=\EA, dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, + ht=^I, if=/usr/share/tabset/stdcrt, il1=\EL, ind=\n, + is2=\E&s1A\E<\E&k0\\, kbs=^H, khome=\Eh, rmkx=\E&s0A, + rmso=\E&d@, sgr0=\E&d@, smkx=\E&s1A, smso=\E&dB, + use=vt52+arrows, + +# hpex: +# May be used for most 24 x 80 hp terminals, +# but has no padding added, so may allow runover in some terminals at high +# baud rates. Will not work for hp2640a or hp2640b terminals, hp98x6 and +# hp98x5 terminal emulators or hp98x6 consoles. +# Adds xy-cursor addressing, vertical cursor addressing, home, +# last line, and underline capabilities. +# +# (hpex: removed memory-lock capabilities ":ml=\El:mu=\Em:", +# moved here from hpsub -- esr) +hpex|HP extended capabilities, + cud1=\n, cup=\E&a%p1%dy%p2%dC, kcub1=^H, kcud1=\n, + nel=\r\n, rmir=\ER, rmul=\E&d@, smir=\EQ, smul=\E&dD, + vpa=\E&a%p1%dY, use=hpsub, + +# From: Ville Sulko , 05 Aug 1996 +hp2|hpex2|Hewlett-Packard extended capabilities newer version, + am, da, db, mir, xhp, + cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8, xmc#0, + bel=^G, clear=\E&a0y0C\EJ, cr=\r, cub1=^H, cud1=\EB, + cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP, + dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1, + il1=\EL, ind=\n, kbs=^H, kclr=\EJ, kctab=\E2, kdch1=\EP, + kdl1=\EM, ked=\EJ, kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, + knp=\EU, kpp=\EV, krmir=\ER, ktbc=\E3, meml=\El, memu=\Em, + pfkey=\E&f%p1%dk%p2%l%dL%p2%s, + pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s, + pfx=\E&f2a%p1%dk%p2%l%dL%p2%s, + pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rmir=\ER, rmkx=\E&s0A, + rmln=\E&j@, rmso=\E&d@, rmul=\E&d@, + sgr=\E&d%?%p7%t%{115}%c%;%p1%p3%|%p6%|%{2}%*%p2%{4}%*%+%p4%+ + %p5%{8}%*%+%{64}%+%c%?%p9%t%'\016'%c%e%'\017'%c%;, + sgr0=\E&d@\017, smir=\EQ, smkx=\E&s1A, smln=\E&jB, + smso=\E&dB, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, + use=hp+pfk-cr, use=hp+arrows, + +# HP 236 console +# From: +hp236|hp236 internal terminal emulator, + OTbs, am, + cols#80, lines#24, + clear=\EF, cnorm=\EDE, cub1=^H, + cup=\EE%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, cvvis=\EDB, + dch1=\EJ, dl1=\EH, el=\EK, ich1=\EI, il1=\EG, rmso=\ECI, + sgr0=\ECI, smso=\EBI, + +# This works on a hp300 console running Utah 4.3 BSD +# From: Craig Leres +hp300h|HP Catseye console, + OTbs, am, da, db, mir, xhp, + cols#128, lines#51, lm#0, xmc#0, + bel=^G, cbt=\Ei, clear=\E&a0y0C\EJ, cr=\r, cub1=^H, cud1=\EB, + cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP, + dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, + if=/usr/share/tabset/stdcrt, il1=\EL, ind=\n, kbs=^H, + khome=\Eh, rmir=\ER, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, + sgr0=\E&d@, smir=\EQ, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, + tbc=\E3, vpa=\E&a%p1%dY, use=vt52+arrows, +# From: Greg Couch +hp9837|hp98720|hp98721|HP 9000/300 workstations, + OTbs, am, da, db, mir, xhp, + cols#128, it#8, lines#46, lm#0, + bel=^G, cbt=\Ei, clear=\E&a0y0C\EJ, cub1=^H, cud1=\EB, + cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP, + dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=^I, hts=\E1, + il1=\EL, ind=\n, is2=\E&v0m1b0i&j@, kbs=^H, kdch1=\EP, + kdl1=\EM, ked=\EJ, kel=\EK, khome=\Eh, kich1=\EQ, kil1=\EL, + knp=\EU, kpp=\EV, rmir=\ER, rmkx=\E&s0A, rmso=\E&v0S, + rmul=\E&d@, sgr0=\E&d@, smir=\EQ, smkx=\E&s1A, smso=\E&v5S, + smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, use=vt52+arrows, +# HP 9845 desktop computer from BRL +# (hp9845: removed unknown capability :gu: -- esr) +hp9845|HP 9845, + OTbs, am, da, db, eo, mir, xhp, + cols#80, lines#21, + OTbc=\ED, clear=\EH\EJ, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\E&a%p2%2dc%p1%2dY, cuu1=\EA, dch1=\EP, dl1=\EM, + ed=\EJ, el=\EK, if=/usr/share/tabset/std, il1=\EL, + rmir=\ER, rmso=\E&d@, smir=\EQ, smso=\E&dB, +# From: Charles A. Finnell of MITRE , developed 07SEP90 +# (hp98550: replaced /usr/share/tabset/9837 with std because ,; +# added empty to avoid warnings re / --esr) +hp98550|hp98550a|HP 9000 Series 300 color console, + OTbs, am, da, db, mir, xhp, + cols#128, lines#49, lm#0, + acsc=, bel=^G, blink=\E&dA, bold=\E&dJ, cbt=\Ei, civis=\E*dR, + clear=\EH\EJ, cnorm=\E*dQ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\E&a%p1%dy%p2%dC, cuu1=\EA, dch1=\EP, dim=\E&dH, + dl1=\EM, ed=\EJ, el=\EK, hpa=\E&a%p1%dC, hts=\E1, + if=/usr/share/tabset/std, il1=\EL, ind=\n, invis=\E&ds, + kbs=^H, kclr=\EJ, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ, + kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, kll=\EF, knp=\EU, + kpp=\EV, krmir=\ER, ktbc=\E3, rev=\E&dJ, rmacs=^O, rmir=\ER, + rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smacs=^N, + smir=\EQ, smkx=\E&s1A, smso=\E&dJ, smul=\E&dD, tbc=\E3, + vpa=\E&a%p1%dY, use=hp+pfk-cr, use=ansi+inittabs, + use=hp+arrows, + +# From: Martin Trusler +hp98550-color|hp98550a-color|HP 9000 Series 300 color console (Trusler), + OTbs, am, ccc, da, db, km, mir, xhp, + colors#8, cols#128, lh#2, lines#49, lm#0, lw#8, nlab#8, pairs#8, + xmc#0, + acsc=+>\,<-\^.v0\374``a\374f\372g\376h\374j+k+l+m+n+o-q-s-t+ + u+v+w+x|y{*|!}\273~\362, + bel=^G, bold=\E&dD, cbt=\Ei, clear=\EH\EJ, cr=\r, cub1=^H, + cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, + dch1=\EP, dl1=\EM, ed=\EJ, el=\EK, home=\E&a0y0C, + hpa=\E&a%p1%dC, hts=\E1, il1=\EL, ind=\ES, + initp=\E&v0m%?%p2%{1000}%=%t1%e.%p2%d%;a%?%p3%{1000}%=%t1%e. + %p3%d%;b%?%p4%{1000}%=%t1%e.%p4%d%;c%?%p5%{1000}%=%t1 + %e.%p5%d%;x%?%p6%{1000}%=%t1%e.%p6%d%;y%?%p7%{1000}%= + %t1%e.%p7%d%;z%p1%dI, + is1=\EH\EJ, kbs=^H, kctab=\E2, kdch1=\EP, kdl1=\EM, ked=\EJ, + kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, kll=\EF, knp=\EU, + kpp=\EV, krmir=\ER, ktbc=\E3, meml=\El, memu=\Em, + oc=\E&v0m1a1b1c0I\E&v1a1I\E&v1b2I\E&v1a1b3I\E&v1c4I\E&v1a1c5 + I\E&v1b1c6I\E&v1x1y7I, + op=\E&v0S, pfkey=\E&f%p1%dk%p2%l%dL%p2%s, + pfloc=\E&f1a%p1%dk%p2%l%dL%p2%s, + pfx=\E&f2a%p1%dk%p2%l%dL%p2%s, + pln=\E&f%p1%dk%p2%l%dd0L%p2%s, rev=\E&dB, ri=\ET, + rmacs=^O, rmam=\E&s1C, rmcup=\E&s0A, rmir=\ER, rmkx=\E&s0A, + rmln=\E&j@, rmm=\E&k0I, rmso=\E&d@, rmul=\E&d@, rs1=\EE, + scp=\E&v%p1%dS, + sgr=\E&d%p1%p3%|%{2}%*%p2%p6%|%{4}%*%+%{64}%+%c%?%p9%t%' + \016'%c%e%'\017'%c%;, + sgr0=\E&d@\017, smacs=^N, smam=\E&s0C, smcup=\E&s1A, + smir=\EQ, smkx=\E&s1A, smln=\E&jB, smm=\E&k1I, smso=\E&dB, + smul=\E&dD, tbc=\E3, u6=\Ea%dc%dR\r, u7=\Ea, + u8=\E%[0123456789/], u9=\E*s1\^, vpa=\E&a%p1%dY, + use=hp+pfk-cr, use=ansi+inittabs, use=hp+arrows, + +# From: Victor Duchovni +# (hp700-wy: removed obsolete ":nl=^J:"; +# replaced /usr/share/tabset/hp700-wy with std because , -- esr) +hp700-wy|HP 700/41 emulating Wyse30, + OTbs, am, bw, mir, msgr, + cols#80, it#8, lines#24, xmc#1, + cbt=\EI, clear=^Z, cr=\r, cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET$<10/>, home=^^, ht=^I, hts=\E1, + if=/usr/share/tabset/stdcrt, il1=\EE$<0.7*/>, + is1=\E~"\EC\Er\E(\EG0\003\E`9\E`1, kbs=^?, kcbt=\EI, + kclr=^Z, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, ked=\EY, + kel=\ET, khome=^^, khts=\EI, kich1=\Eq, krmir=\Er, ll=^^^K, + ri=\Ej, rmir=\Er, rmso=\EG0$<10/>, rmul=\EG0$<10/>, + sgr0=\EG0$<10/>, smir=\Eq, smso=\EG4$<10/>, + smul=\EG8$<10/>, tbc=\E0, vpa=\E[%p1%{32}%+%c, +hp70092|hp70092a|hp70092A|HP 700/92, + am, da, db, xhp, + cols#80, lh#2, lines#24, lm#0, lw#8, nlab#8, + acsc=0cjgktlrmfn/q\,t5u6v8w7x., bel=^G, blink=\E&dA, + bold=\E&dB, cbt=\Ei, clear=\E&a0y0C\EJ, cr=\r, cub1=^H, + cud1=\EB, cuf1=\EC, cup=\E&a%p1%dy%p2%dC, cuu1=\EA, + dch1=\EP, dim=\E&dH, dl1=\EM, el=\EK, hpa=\E&a%p1%dC, ht=^I, + hts=\E1, il1=\EL, kbs=^H, kclr=\EJ, kctab=\E2, kdch1=\EP, + kdl1=\EM, ked=\EJ, kel=\EK, khts=\E1, kich1=\EQ, kil1=\EL, + kll=\EF, knp=\EU, kpp=\EV, krmir=\ER, ktbc=\E3, rev=\E&dB, + ri=\ET, rmacs=^O, rmir=\ER, rmkx=\E&s0A, rmln=\E&j@, + rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, smacs=^N, smir=\EQ, + smkx=\E&s1A, smln=\E&jB, smso=\E&dJ, smul=\E&dD, tbc=\E3, + vpa=\E&a%p1%dY, use=hp+pfk-cr, use=hp+arrows, + +bobcat|sbobcat|HP 9000 model 300 console, + am, da, db, mir, xhp, + cols#128, it#8, lines#47, xmc#0, + cbt=\Ei, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\E&a%p1%dy%p2%dC$<6/>, cuu1=\EA, dch1=\EP, + dl1=\EM$<10*/>, ed=\EJ, el=\EK, hpa=\E&a%p1%dC$<6/>, ht=^I, + il1=\EL$<10*/>, ind=\n, kbs=^H, khome=\Eh, nel=\r\n, + rmir=\ER, rmkx=\E&s0A, rmso=\E&d@, rmul=\E&d@, sgr0=\E&d@, + smir=\EQ, smkx=\E&s1A, smso=\E&dB, smul=\E&dD, + vpa=\E&a%p1%dY$<6/>, use=vt52+arrows, +gator-t|HP 9000 model 237 emulating extra-tall AAA, + lines#94, use=gator, +gator|HP 9000 model 237 emulating AAA, + bw, km, mir, ul, + cols#128, it#8, lines#47, + bel=^G, cbt=\E[Z, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, dch=\E[%p1%dP$<4/>, + dch1=\E[P, dl=\E[%p1%dM$<1*/>, dl1=\E[M, home=\E[H, + hpa=\E[%i%p1%d`, ht=^I, ich=\E[%p1%d@$<4/>, ich1=\E[@, + il=\E[%p1%dL$<1*/>, il1=\E[L, kbs=^H, kcub1=^H, kcud1=\n, + nel=\r\n, rep=%p1%c\E[%p2%db$<1*/>, rev=\E[7m, rmso=\E[m, + rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m, + use=ansi+erase, + +gator-52|HP 9000 model 237 emulating VT52, + cols#128, lines#47, use=vt52-basic, +gator-52t|HP 9000 model 237 emulating extra-tall VT52, + lines#94, use=gator-52, + +#### Honeywell-Bull +# +# From: Michael Haardt 11 Jan 93 +# + +# Honeywell Bull terminal. Its cursor and function keys send single +# control characters and it has standout/underline glitch. Most programs +# do not like these features/bugs. Visual bell is realized by flashing the +# "keyboard locked" LED. +dku7003-dumb|Honeywell Bull DKU 7003 dumb mode, + cols#80, lines#25, + clear=^]^_, cr=\r, cub1=^Y, cud1=^K, cuf1=^X, + cup=\E[%i%p1%d;%p2%dH, cuu1=^Z, ed=^_, el=\E[K, + flash=\E[2h\E[2l, home=^], ht=^I, ind=\n, kbs=^H, kcub1=^Y, + kcud1=^K, kcuf1=^X, kcuu1=^Z, khome=^], nel=\r\n, +dku7003|Honeywell Bull DKU 7003 all features described, + msgr, + xmc#1, + blink=\E[5m, bold=\E[7m, dim=\E[2m, rev=\E[7m, rmso=\E[m, + rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m, + use=dku7003-dumb, + +#### Lear-Siegler (LSI adm) +# +# These guys are long since out of the terminals business, but +# in 1995 many current terminals still have an adm type as one of their +# emulations (usually their stupidest, and usually labeled adm3, though +# these `adm3' emulations normally have adm3a+ capabilities). +# +# WARNING: Some early ADM terminals (including the ADM3 and ADM5) had a +# `diagnostic feature' that sending them a ^G while pin 22 (`Ring Indicator') +# was being held to ground would trigger a send of the top line on the screen. +# A quick fix might be to drop back to a cheesy 4-wire cable with pin 22 +# hanging in the air. (Thanks to Eric Fischer, , +# for clearing up this point.) + +adm1a|adm1|LSI adm1a, + am, + cols#80, lines#24, + bel=^G, clear=\E;$<1>, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, home=^^, + ind=\n, +adm2|LSI adm2, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\E;, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, home=^^, ich1=\EQ, il1=\EE, ind=\n, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, +# (adm3: removed obsolete ":ma=^K^P:" -- esr) +adm3|LSI adm3, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, ind=\n, +# The following ADM-3A switch settings are assumed for normal operation: +# SPACE U/L_DISP CLR_SCRN 24_LINE +# CUR_CTL LC_EN AUTO_NL FDX +# Other switches may be set for operator convenience or communication +# requirements. I recommend +# DISABLE_KB_LOCK LOCAL_OFF 103 202_OFF +# ETX_OFF EOT_OFF +# Most of these terminals required an option ROM to support lower case display. +# Open the case and look at the motherboard; if you see an open 24-pin DIP +# socket, you may be out of luck. +# +# (adm3a: some capabilities merged in from BRl entry -- esr) +adm3a|LSI adm3a, + OTbs, am, + cols#80, lines#24, + OTma=^K^P, OTnl=\n, bel=^G, clear=\032$<1/>, cr=\r, cub1=^H, + cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, home=^^, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^L, + kcuu1=^K, rs2=^N, +adm3a+|adm3a plus, + kbs=^H, use=adm3a, +# (adm5: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" & duplicate ":do=^J:" -- esr) +adm5|LSI adm5, + xmc#1, + ed=\EY, el=\ET, khome=^^, rmso=\EG, smso=\EG, use=adm3a+, +# A lot of terminals other than adm11s use these. Wherever you see +# use=adm+sgr with some of its capabilities disabled, try the +# disabled ones. They may well work but not have been documented or +# expressed in the using entry. We'd like to cook up an but the +# / sequences of the using entries vary too much. +adm+sgr|adm style highlight capabilities, + invis=\EG1, rev=\EG4, rmso=\EG0, rmul=\EG0, sgr0=\EG0, + smso=\EG4, smul=\EG8, +# LSI ADM-11 from George William Hartwig, Jr. via BRL +# Status line additions from Stephen J. Muir +# from . could also +# be ^Z, according to his entry. +# (adm11: =\EG4 was obviously erroneous because it also said +# =\EG4. Looking at other ADMs confirms this -- esr) +adm11|LSI ADM-11, + OTbs, am, hs, + OTkn#8, cols#80, lines#24, + OTnl=\n, bel=^G, blink=\EG2, clear=\E*, cr=\r, cub1=^H, + cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, dsl=\Eh, ed=\EY, el=\ET, fsl=\E(\r, home=^^, ht=^I, + kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf1=^A@\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, khome=^^, nel=\r\n, tsl=\EF\E), + use=adm+sgr, +# From: Andrew Scott Beals +# Corrected by Olaf Siebert , 11 May 1995 +# Supervisor mode info by Ari Wuolle, , 27 Aug 1996 +# (adm12: removed obsolete ":kn:ma=j^Jk^P^K^Pl ^R^L^L :". This formerly had +# =\Eq but that looked wrong; this is from Dave Yost +# via BRL. That entry asserted , but I've left that out because +# neither earlier nor later ADMSs have it -- esr) +# +# You will need to get into the supervisor setup before you can set +# baudrate etc. for your ADM-12+. Press Shift-Ctrl-Setup and you should +# see a lot more setup options. +# +# While in supervisor setup you can also use following codes: +# +# Ctrl-P Personality character selections (configure for example what +# arrow keys send, if I recall correctly) +# Ctrl-T tabs 1-80 use left&right to move and up to set and +# Ctrl-V tabs 81-158 down to clear tab. Shift-Ctrl-M sets right margin at cursor +# Ctrl-B Binary setup (probably not needed. I think that everything can +# be set using normal setup) +# Ctrl-A Answerback mode (enter answerback message) +# Ctrl-U User friendly mode (normal setup) +# Ctrl-D Defaults entire setup and function keys from EPROM tables +# Ctrl-S Save both setup and functions keys. Takes from 6 to 10 seconds. +# Ctrl-R Reads both setup and functions keys from NVM. +# Shift-Ctrl-X Unlock keyboard and cancel received X-OFF status +# +# ADM-12+ supports hardware handshaking, but it is DTR/CTS as opposed to +# RTS/CTS used nowadays with virtually every modem and computer. 19200 +# bps works fine with hardware flow control. +# +# The following null-modem cable should fix this and enable you to use +# RTS/CTS handshaking (which Linux supports, use CRTSCTS setting). Also +# set ADM-12+ for DTR handshaking from supervisor setup. +# +# PC Serial ADM-12+ +# -------- ------- +# 2 - 3 +# 3 - 2 +# 4 - 5 +# 5 - 20 +# 6,8 - 4 +# 7 - 7 +# 20 - 6,8 +# +adm12|LSI adm12, + OTbs, OTpt, am, mir, + OTug#1, cols#80, it#8, lines#24, + bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, home=^^, hts=\E1, ich1=\EQ, il1=\EE, + is2=\E0\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s + \s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s + \s\s\E1\s\s\s\s\s\s\s\s\E1\s\s\s\s\s\s\s\s\E1, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A1\r, + kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r, + kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, rmir=\Er, smir=\Eq, tbc=\E0, + use=adm+sgr, +# (adm20: removed obsolete ":kn#7:" -- esr) +adm20|Lear Siegler adm20, + OTbs, am, + cols#80, it#8, lines#24, + bel=^G, cbt=\EI, clear=^Z, cr=\r, cub1=^H, cuf1=^L, + cup=\E=%i%p2%{31}%+%c%p1%{31}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, home=^^, ht=^I, ich1=\EQ, il1=\EE, + kf1=^A, kf2=^B, kf3=^W, kf4=^D, kf5=^E, kf6=^X, kf7=^Z, rmso=\E(, + sgr0=\E(, smso=\E), +adm21|Lear Siegler adm21, + xmc#1, + dch1=\EW, dl1=\ER$<30*>, ed=\EY, el=\ET, ich1=\EQ, + il1=\EE$<30*>, invis@, kbs=^H, khome=^^, use=adm+sgr, + use=adm3a, +# (adm22: ":em=:" was an obvious typo for ":ei=:"; also, +# removed obsolete ":kn#7:ma=j^Jk^P^K^Pl ^R^L^L :"; +# removed bogus-looking \200 from before . -- esr) +adm22|LSI adm22, + OTbs, am, + cols#80, lines#24, + bel=^G, cbt=\EI, clear=\E+, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\Ey, el=\Et, home=^^, ht=\Ei, ich1=\EQ, il1=\EE, + is2=\E%\014\014\014\016\003\0\003\002\003\002\0\0\0\0\0\0\0 + \0\0\0\0, + kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf1=^A@\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, khome=^^, lf1=F1, lf2=F2, lf3=F3, lf4=F4, lf5=F5, + lf6=F6, lf7=F7, rmso=\E(, sgr0=\E(, smso=\E), +# ADM 31 DIP Switches +# +# This information comes from two versions of the manual for the +# Lear-Siegler ADM 31. +# +# Main board: +# rear of case +# +-||||-------------------------------------+ +# + S1S2 ||S + +# + ||3 + +# + + +# + ||S + +# + ||4 + +# + + +# + + +# + + +# + + +# + + +# +-+ +-+ +# + + +# + S5 S6 S7 + +# + == == == + +# +----------------------------------------------+ +# front of case (keyboard) +# +# S1 - Data Rate - Modem +# S2 - Data Rate - Printer +# ------------------------ +# Data Rate Setting +# ------------------- +# 50 0 0 0 0 +# 75 1 0 0 0 +# 110 0 1 0 0 +# 134.5 1 1 0 0 +# 150 0 0 1 0 +# 300 1 0 1 0 +# 600 0 1 1 0 +# 1200 1 1 1 0 +# 1800 0 0 0 1 +# 2000 1 0 0 1 +# 2400 0 1 0 1 +# 3600 1 1 0 1 +# 4800 0 0 1 1 +# 7200 1 0 1 1 +# 9600 0 1 1 1 +# x 1 1 1 1 +# +# S3 - Interface/Printer/Attributes +# --------------------------------- +# Printer Busy Control +# sw1 sw2 sw3 +# --------------- +# off off off Busy not active, CD disabled +# off off on Busy not active, CD enabled +# off on off Busy active on J5-20, CD disabled +# on off off Busy active on J5-19, CD disabled - Factory Set. +# on off on Busy active on J5-19, CD enabled +# +# sw4 Used in conjunction with S4 for comm interface control - Fact 0 +# +# sw5 Secondary Channel Control (Hardware implementation only) - Fact 0 +# +# sw6 ON enables printer BUSY active LOW - Factory Setting +# OFF enables printer BUSY active HIGH - If set to this, ADM31 senses +# +# sw7 ON - steady cursor - Factory Setting +# OFF - blinking cursor +# +# sw8 ON causes selected attribute character to be displayed +# OFF causes SPACE to be displayed instead - Factory Setting +# +# S4 - Interface +# -------------- +# Modem Interface +# S3 S4 S4 S4 S4 +# sw4 sw1 sw2 sw3 sw4 +# --------------------------- +# OFF ON OFF ON OFF Enable RS-232C interface, Direct Connect and +# Current Loop disabled - Factory Setting +# ON ON OFF ON OFF Enable Current Loop interface, Direct Connect +# disabled +# OFF OFF ON OFF ON Enable Direct Connect interface, RS-232C and +# Current Loop Disabled +# +# sw5 ON disables dot stretching mode - Factory Setting +# OFF enables dot stretching mode +# sw6 ON enables blanking function +# OFF enables underline function - Factory Setting +# sw7 ON causes NULLS to be displayed as NULLS +# OFF causes NULLS to be displayed as SPACES - Factory Setting +# +# S5 - Word Structure +# ------------------- +# sw1 ON enables BREAK key - Factory Setting +# OFF disables BREAK key +# sw2 ON selects 50Hz monitor refresh rate +# OFF selects 60Hz monitor refresh rate - Factory Setting +# +# Modem Port Selection +# sw3 sw4 sw5 +# --------------- +# ON ON ON Selects 7 DATA bits, even parity, 2 STOP bits +# OFF ON ON Selects 7 DATA bits, odd parity, 2 STOP bits +# ON OFF ON Selects 7 DATA bits, even parity, 1 STOP bit - Factory Set. +# OFF OFF ON Selects 7 DATA bits, odd parity, 1 STOP bit +# ON ON OFF Selects 8 DATA bits, no parity, 2 STOP bits +# OFF ON OFF Selects 8 DATA bits, no parity, 1 STOP bit +# ON OFF OFF Selects 8 DATA bits, even parity, 1 STOP bit +# OFF OFF OFF Selects 8 DATA bits, odd parity, 1 STOP bit +# +# sw6 ON sends bit 8 a 1 (mark) +# OFF sends bit 8 as 0 (space) - Factory Setting +# sw7 ON selects Block Mode +# OFF selects Conversation Mode - Factory Setting +# sw8 ON selects Full Duplex operation +# OFF selects Half Duplex operation - Factory Setting +# +# S6 - Printer +# ------------ +# sw1, sw2, sw6, sw7 Reserved - Factory 0 +# +# Printer Port Selection +# same as Modem above, bit 8 (when 8 DATA bits) is always = 0 +# +# sw8 ON enables Printer Port +# OFF disables Printer Port - Factory Setting +# +# S7 - Polling Address +# -------------------- +# sw1-7 Establish ASCII character which designates terminal polling address +# ON = logic 0 +# OFF = logic 1 - Factory Setting +# sw8 ON enables Polling Option +# OFF disables Polling Option - Factory Setting +# +# +# On some older adm31s, S4 does not exist, and S5-sw6 is not defined. +# +# This adm31 entry uses underline as the standout mode. +# If the adm31 gives you trouble with standout mode, check the DIP switch in +# position 6, bank @c11, 25% from back end of the circuit board. Should be +# OFF. If there is no such switch, you have an old adm31 and must use oadm31. +# (adm31: removed obsolete ":ma=j^Jk^P^K^Pl ^R^L^L :" -- esr) +adm31|LSI adm31 with sw6 set for underline mode, + OTbs, am, mir, + cols#80, lines#24, + bel=^G, clear=\E*, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, home=^^, il1=\EE, ind=\n, is2=\Eu\E0, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A1\r, + kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r, + kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, rmir=\Er, rmso=\EG0, + rmul=\EG0, sgr0=\EG0, smir=\Eq, smso=\EG1, smul=\EG1, +adm31-old|o31|old adm31, + rmul@, smso=\EG4, smul@, use=adm31, +# LSI ADM-36 from Col. George L. Sicherman via BRL +adm36|LSI ADM36, + OTbs, OTpt, + OTkn#4, + if=/usr/share/tabset/vt100, + is2=\E<\E>\E[6;?2;?7;?8h\E[4;20;?1;?3;?4;?5;?6;?18;?19l, use=vt100+4bsd, +# (adm42: removed obsolete ":ma=^K^P:" -- esr) +adm42|LSI adm42, + OTbs, am, + cols#80, lines#24, + bel=^G, cbt=\EI, clear=\E;, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + cvvis=\EC\E3 \E3(, dch1=\EW, dl1=\ER, ed=\EY, el=\ET, ht=^I, + il1=\EE$<270>, ind=\n, invis@, ip=$<6*>, kcub1=^H, kcud1=\n, + kcuf1=^L, kcuu1=^K, khome=^^, pad=^?, rmir=\Er, rmul@, + smir=\Eq, smul@, use=adm+sgr, +# The following termcap for the Lear Siegler ADM-42 leaves the +# "system line" at the bottom of the screen blank (for those who +# find it distracting otherwise) +adm42-ns|LSI adm-42 with no system line, + cbt=\EI\EF \011, clear=\E;\EF \011, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<6>\EF \011, + dch1=\EW\EF \011, dl1=\ER\EF \011, ed=\EY\EF \011, + el=\ET\EF \011, il1=\EE\EF \011, rmir=\Er\EF \011, + smir=\Eq\EF \011, use=adm42, +# ADM 1178 terminal -- rather like an ADM-42. Manual is dated March 1 1985. +# The insert mode of this terminal is commented out because it's broken for our +# purposes in that it will shift the position of every character on the page, +# not just the cursor line! +# From: Michael Driscoll 10 July 1996 +adm1178|1178|LSI adm1178, + am, + cols#80, lines#24, xmc#1, + bel=^G, bold=\E(, cbt=\EI, clear=\E+, cr=\r, cub1=^H, cud1=\n, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + cvvis=\EC\E3 \E3(, dch1=\EW, dl1=\ER, ed=\EY, el=\ET, + home=^^, ht=^I, il1=\EE, ind=\n, ip=$<6*/>, kbs=^H, kcub1=^H, + kcud1=\n, nel=\r\n, pad=^?, rev=\EG4, rmso=\EG0, rmul=\EG0, + sgr0=\E), smso=\EG4, smul=\EG1, + +#### Prime +# +# Yes, Prime made terminals. These entries were posted by Kevin J. Cummings +# on 14 Dec 1992 and lightly edited by esr. +# Prime merged with ComputerVision in the late 1980s; you can reach them at: +# +# ComputerVision Services +# 500 Old Connecticut Path +# Framingham, Mass. +# + +# Standout mode is dim reverse-video. +pt100|pt200|wren|fenix|Prime pt100/pt200, + am, bw, mir, msgr, + cols#80, it#8, lines#24, + cbt=\E[Z, clear=\E?, cr=\r, cub1=^H, cud1=\ED, + cup=\E0%p1%{33}%+%c%p2%{33}%+%c, cuu1=\EM, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, dl1=\E[M, ed=\E[J\E[r, + el=\E[K\E[t, flash=\E$$<200/>\E$P, home=\E$B, ht=^I, + il1=\E[L\E[t, ind=\n, khome=\E$A, nel=\r\n, rmcup=, + rmir=\E[4l, rmkx=\E[>13l, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smcup=\E[>1l\E[>2l\E[>16l\E[4l\E[>9l\E[20l\E[>3l\E[>7h\E[>12 + l\E[1Q, + smir=\E[4h, smkx=\E[>13h, smso=\E[2;7m, smul=\E[4m, + use=ansi+arrows, use=ansi+local, + +pt100w|pt200w|wrenw|fenixw|Prime pt100/pt200 in 132-column mode, + cols#132, + cup=\E[%i%p1%d;%p2%dH, use=pt100, +pt250|Prime PT250, + rmso@, smso@, use=pt100, +pt250w|Prime PT250 in 132-column mode, + rmso@, smso@, use=pt100w, + +#### Qume (qvt) +# +# Qume, Inc. +# 3475-A North 1st Street +# San Jose CA 95134 +# Vox: (800)-457-4447 +# Fax: (408)-473-1510 +# Net: josed@techsupp.wyse.com (Jose D'Oliveira) +# +# Qume was bought by Wyse, but still (as of early 1995) has its own support +# group and production division. +# +# Discontinued Qume models: +# +# The qvt101 and qvt102 listed here are long obsolete; so is the qvt101+ +# built to replace them, and a qvt119+ which was a 101+ with available wide +# mode (132 columns). There was a qvt103 which added VT100/VT131 emulations +# and an ANSI-compatible qvt203 that replaced it. Qume started producing +# ANSI-compatible terminals with the qvt323 and qvt61. +# +# Current Qume models (as of February 1995): +# +# All current Qume terminals have ANSI-compatible operation modes. +# Qume is still producing the qvt62, which features emulations for other +# popular lines such as ADDS, and dual-host capabilities. The qvt82 is +# designed for use as a SCO ANSI terminal. The qvt70 is a color terminal +# with many emulations including Wyse370, Wyse 325, etc. Their newest +# model is the qvt520, which is VT420-compatible. +# +# There are some ancient printing Qume terminals under `Daisy Wheel Printers' +# +# If you inherit a Qume without docs, try Ctrl-Shift-Setup to enter its +# setup mode. Shift-s should be a configuration save to NVRAM. + +qvt101|qvt108|Qume qvt 101 and QVT 108, + xmc#1, use=qvt101+, + +# This used to have but no or . The BSD termcap +# file had . I've done the safe thing and yanked +# both. The is from BSD, which also claimed bold=\E( and dim=\E). +# What seems to be going on here is that this entry was designed so that +# the normal highlight is bold and standout is dim plus something else +# (reverse-video maybe? But then, are there two sequences?) +# +# Added kdch1, kil1, kdl1 based on screenshot -TD: +# http://www.vintagecomputer.net/qume/qvt-108/qume_qvt-108_keyboard.jpg +qvt101+|qvt101p|Qume qvt 101 PLUS product, + am, bw, hs, ul, + cols#80, lines#24, xmc#0, + bel=^G, cbt=\EI, clear=^Z, cnorm=\E.4, cr=\r, cub1=^H, cud1=\n, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW, dl1=\ER, dsl=\Eg\Ef\r, ed=\EY, el=\ET, + flash=\Eb$<200>\Ed, fsl=\r, home=^^, ht=^I, hts=\E1, + ich1=\EQ, il1=\EE, ind=\n, invis@, kbs=^H, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, + kel=\ET, kf1=^A@\r, kf10=^AI\r, kf2=^AA\r, kf3=^AB\r, + kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, + kf9=^AH\r, khome=^^, kich1=\EQ, kil1=\EE, mc4=\EA, mc5=\E@, + rmso=\E(, smso=\E0P\E), tbc=\E3, tsl=\Eg\Ef, use=adm+sgr, +qvt102|Qume qvt 102, + cnorm=\E., use=qvt101, +# (qvt103: added / based on init string -- esr) +qvt103|Qume qvt 103, + am, xenl, xon, + cols#80, it#8, lines#24, vt#3, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, + clear=\E[H\E[2J$<50>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>, + cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, home=\E[H, ht=^I, + hts=\EH, ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, + kcuu1=\EOA, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + rev=\E[7m$<2>, ri=\EM$<5>, rmam=\E[?7l, rmkx=\E[?1l\E>, + rmso=\E[m$<2>, rmul=\E[m$<2>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 + %;m$<2>, + sgr0=\E[m$<2>, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, use=ansi+csr, + use=ansi+local, + +qvt103-w|Qume qvt103 132 cols, + cols#132, lines#24, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=qvt103, +qvt119+|qvt119p|qvt119|Qume qvt 119 and 119PLUS terminals, + am, hs, mir, msgr, + cols#80, lines#24, xmc#0, + bel=^G, cbt=\EI, clear=\E*1, cnorm=\E.4, cr=\r, cub1=^H, + cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, cvvis=\E.2, dch1=\EW, dl1=\ER, dsl=\Eg\Ef\r, ed=\Ey, + el=\Et, flash=\En0$<200>\En1, fsl=\r, home=^^, ht=^I, + hts=\E1, il1=\EE, ind=\n, is2=\EDF\EC\EG0\Er\E(\E%EX, + kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^AI\r, + kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, + kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, + mc4=\EA, mc5=\E@, ri=\EJ, rmir=\Er, smir=\Eq, smul=\EG8, + tbc=\E3, tsl=\Eg\Ef, use=adm+sgr, +qvt119+-25|qvt119p-25|QVT 119 PLUS with 25 data lines, + lines#25, use=qvt119+, +qvt119+-w|qvt119p-w|qvt119-w|QVT 119 and 119 PLUS in 132 column mode, + cols#132, + is2=\EDF\EC\EG0\Er\E(\E%\EX\En4, use=qvt119+, +qvt119+-25-w|qvt119p-25-w|qvt119-25-w|QVT 119 and 119 PLUS 132 by 25, + lines#25, use=qvt119+, +qvt203|qvt203+|Qume qvt 203 Plus, + dch1=\E[P$<7>, dl1=\E[M$<99>, il1=\E[L$<99>, ind=\n$<30>, + ip=$<7>, kf0=\E[29~, kf1=\E[17~, kf2=\E[18~, kf3=\E[19~, + kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, + kf9=\E[28~, rmir=\E[4l, smir=\E[4h, use=qvt103, +qvt203-w|qvt203-w-am|Qume qvt 203 PLUS in 132 cols (w/advanced video), + cols#132, lines#24, + rs2=\E>\E[?3h\E[?4l\E[?5l\E[?8h, use=qvt203, +# +# Since a command is present for enabling 25 data lines, +# a specific terminfo entry may be generated for the 203. +# If one is desired for the QVT 119 PLUS then 25 lines must +# be selected in the status line (setup line 9). +# +qvt203-25|QVT 203 PLUS with 25 by 80 column mode, + cols#80, lines#25, + is2=\E[=40h\E[?3l, use=qvt203, +qvt203-25-w|QVT 203 PLUS with 25 by 132 columns, + cols#132, lines#25, + rs2=\E[?3h\E[=40h, use=qvt203, + +#### TeleVideo (tvi) +# +# TeleVideo +# 550 East Brokaw Road +# PO Box 49048 95161 +# San Jose CA 95112 +# Vox: (408)-954-8333 +# Fax: (408)-954-0623 +# +# +# These require incredible amounts of padding. +# +# All of these terminals (912 to 970 and the tvipt) are discontinued. Newer +# TeleVideo terminals are ANSI and PC-ANSI compatible. + +tvi803|TeleVideo 803, + clear=\E*$<10>, use=tvi950, + +# Vanilla tvi910 -- W. Gish 10/29/86 +# Switch settings are: +# +# S1 1 2 3 4 +# D D D D 9600 +# D D D U 50 +# D D U D 75 +# D D U U 110 +# D U D D 135 +# D U D U 150 +# D U U D 300 +# D U U U 600 +# U D D D 1200 +# U D D U 1800 +# U D U D 2400 +# U D U U 3600 +# U U D D 4800 +# U U D U 7200 +# U U U D 9600 +# U U U U 19200 +# +# S1 5 6 7 8 +# U D X D 7N1 (data bits, parity, stop bits) (X means ignored) +# U D X U 7N2 +# U U D D 7O1 +# U U D U 7O2 +# U U U D 7E1 +# U U U U 7E2 +# D D X D 8N1 +# D D X U 8N2 +# D U D D 8O1 +# D U U U 8E2 +# +# S1 9 Autowrap +# U on +# D off +# +# S1 10 CR/LF +# U do CR/LF when CR received +# D do CR when CR received +# +# S2 1 Mode +# U block +# D conversational +# +# S2 2 Duplex +# U half +# D full +# +# S2 3 Hertz +# U 50 +# D 60 +# +# S2 4 Edit mode +# U local +# D duplex +# +# S2 5 Cursor type +# U underline +# D block +# +# S2 6 Cursor down key +# U send ^J +# D send ^V +# +# S2 7 Screen colour +# U green on black +# D black on green +# +# S2 8 DSR status (pin 6) +# U disconnected +# D connected +# +# S2 9 DCD status (pin 8) +# U disconnected +# D duplex +# +# S2 10 DTR status (pin 20) +# U disconnected +# D duplex +# (tvi910: removed obsolete ":ma=^Kk^Ll^R^L:"; added , , , +# , , , , from SCO entry -- esr) +tvi910|TeleVideo model 910, + OTbs, am, msgr, + cols#80, it#8, lines#24, xmc#1, + bel=^G, cbt=\EI, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EY, el=\ET, + home=\E=^A^A, hpa=\E]%p1%{32}%+%c, ht=^I, + if=/usr/share/tabset/stdcrt, ind=\n, invis@, kbs=^H, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kf0=^AI\r, kf1=^A@\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, + vpa=\E[%p1%{32}%+%c, use=adm+sgr, +# From: Alan R. Rogers +# as subsequently hacked over by someone at SCO +# (tvi910+: removed obsolete ":ma=^K^P^L :" -- esr) +# +# Here are the 910+'s DIP switches (U = up, D = down, X = don't care): +# +# S1 1 2 3 4: +# D D D D 9600 D D D U 50 D D U D 75 D D U U 110 +# D U D D 135 D U D U 150 D U U D 300 D U U U 600 +# U D D D 1200 U D D U 1800 U D U D 2400 U D U U 3600 +# U U D D 4800 U U D U 7200 U U U D 9600 U U U U 19200 +# +# S1 5 6 7 8: +# U D X D 7N1 U D X U 7N2 U U D D 7O1 U U D U 7O2 +# U U U D 7E1 U U U U 7E2 D D X D 8N1 D D X U 8N2 +# D U D D 8O1 D U U U 8E2 +# +# S1 9 Autowrap (U = on, D = off) +# S1 10 CR/LF (U = CR/LF on CR received, D = CR on CR received) +# S2 1 Mode (U = block, D = conversational) +# S2 2 Duplex (U = half, D = full) +# S2 3 Hertz (U = 50, D = 60) +# S2 4 Edit mode (U = local, D = duplex) +# S2 5 Cursor type (U = underline, D = block) +# S2 6 Cursor down key (U = send ^J, D = send ^V) +# S2 7 Screen colour (U = green on black, D = black on green) +# S2 8 DSR status (pin 6) (U = disconnected, D = connected) +# S2 9 DCD status (pin 8) (U = disconnected, D = connected) +# S2 10 DTR status (pin 20) (U = disconnected, D = connected) +# +tvi910+|TeleVideo 910+, + dch1=\EW, dl1=\ER$<33*>, home=^^, ich1=\EQ, il1=\EE$<33*>, + kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r, kf4=^AD\r, + kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, kf9=^AI\r, + ll=\E=7\s, use=tvi910, + +# (tvi912: removed obsolete ":ma=^K^P^L :", added and +# from BRL entry -- esr) +tvi912|tvi914|tvi920|TeleVideo 912/914/920 (old), + OTbs, OTpt, am, msgr, + cols#80, it#8, lines#24, xmc#1, + bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER$<33*>, ed=\Ey, el=\ET, flash=\Eb$<50/>\Ed, home=^^, + ht=^I, hts=\E1, ich1=\EQ, if=/usr/share/tabset/stdcrt, + il1=\EE$<33*>, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, + kcuu1=^K, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, + kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, + kf9=^AH\r, khome=^^, rmso=\Ek, rmul=\Em, smso=\Ej, smul=\El, + tbc=\E3, +# We got some new tvi912c terminals that act really weird on the regular +# termcap, so one of our gurus worked this up. Seems that cursor +# addressing is broken. +tvi912cc|tvi912 at Cowell College, + cup@, use=tvi912c, + +# tvi{912,920}[bc] - TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C +# From: Benjamin C. W. Sittler +# +# Someone has put a scanned copy of the manual online at: +# http://vt100.net/televideo/912b-om/ +# (https://vt100.net/manx/details/6,5484) +# +# These terminals were produced ca. 1979, and had a 12" monochrome +# screen, supported 75-9600 baud (no handshaking), monochrome, 7-bit +# ASCII, and were generally similar to adm3a but with attributes +# (including some with magic cookies), fancy half-duplex mode, and +# different bugs. +# +# Some operations require truly incredible amounts of padding. The +# insert_line () and delete_line () operations in particular +# are so slow as to be nearly unusable. +# +# There may or may not have been a separate, earlier series of 912/920 +# terminals (without the "B" and "C" suffix); I have never seen one, +# and the manual only describes the "B" and "C" series. The 912 and 920 +# are quite distinct from the 914 and 924, which were much nicer non- +# magic-cookie terminals similar to the 950. +# +# This is a new description for the following TeleVideo terminals, +# distinguished chiefly by their keyboards: +# +# TVI-912B - very odd layout, no function keys (84 keys) +# TVI-920B - typewriter layout, no function keys (103 keys) +# TVI-912C - very odd layout, function keys F1-F11 (82 keys) +# TVI-920C - typewriter layout, function keys F1-F11 (101 keys) +# +# To choose a setting for the TERM variable, start with the model: +# +# Model || base name +# ----------||----------- +# TVI-912B || tvi912b +# TVI-912C || tvi912c +# TVI-920B || tvi920b +# TVI-920C || tvi920c +# +# Then add a suffix from the following table describing installed options +# and how you'd like to use the terminal: +# +# Use Video | Second | Visual | Magic | Page || feature +# Attributes | Page | Bell | Cookies | Print || suffix +# ------------|--------|--------|---------|-------||--------- +# No | No | N/A | N/A | No || -unk +# No | No | N/A | N/A | Yes || -p +# No | Yes | No | N/A | No || -2p-unk +# No | Yes | No | N/A | Yes || -2p-p +# No | Yes | Yes | N/A | No || -vb-unk +# No | Yes | Yes | N/A | Yes || -vb-p +# Yes | No | N/A | No | N/A || +# Yes | No | N/A | Yes | N/A || -mc +# Yes | Yes | No | No | N/A || -2p +# Yes | Yes | No | Yes | N/A || -2p-mc +# Yes | Yes | Yes | No | N/A || -vb +# Yes | Yes | Yes | Yes | N/A || -vb-mc +# +# So e.g. a model 920 C with second page memory option, visual bell +# and no magic cookies would be tvi920c-vb; a model 912 B without the +# second page memory option and using magic cookies would be +# tvi912b-mc +# +# PADDING +# +# At 9600 baud, the terminal is prone to overflow its input buffer +# during complex operations (insert/delete +# character/line/screen/page), and it does not signal this over the +# RS232 cable. The typical symptom of an overrun is that the terminal +# starts beeping, and output becomes garbled. +# +# The padding delays in this terminfo were derived using tack(1) +# running on a Linux box connected to a TVI-920C with a later-model +# (A49C1-style) ROM running at 9600 baud, so your mileage may +# vary. The numbers below seem to give the terminal enough time so +# that it doesn't overflow its input buffer and start losing +# characters. +# +# KEYS +# +# If you want to use the FUNCT key on a tvi912[bc], use the +# corresponding tvi920[bc] terminfo with FUNCT + ... equivalents from +# the following table (these also work on the 920 series): +# +# Unshifted Function Keys: +# +# Key | capname|| Equivalent +# -----|--------||------------ +# F1 | || FUNCT + @ +# F2 | || FUNCT + A +# F3 | || FUNCT + B +# F4 | || FUNCT + C +# F5 | || FUNCT + D +# F6 | || FUNCT + E +# F7 | || FUNCT + F +# F8 | || FUNCT + G +# F9 | || FUNCT + H +# F10 | || FUNCT + I +# F11 | || FUNCT + J +# +# Shifted Function Keys: +# +# SHIFT + Key | capname|| Equivalent +# -------------|--------||------------ +# SHIFT + F1 | || FUNCT + ` +# SHIFT + F2 | || FUNCT + a +# SHIFT + F3 | || FUNCT + b +# SHIFT + F4 | || FUNCT + c +# SHIFT + F5 | || FUNCT + d +# SHIFT + F6 | || FUNCT + e +# SHIFT + F7 | || FUNCT + f +# SHIFT + F8 | || FUNCT + g +# SHIFT + F9 | || FUNCT + h +# SHIFT + F10 | || FUNCT + i +# SHIFT + F11 | || FUNCT + j +# +# PORTS AND SWITCH SETTINGS +# +# Here are the switch settings for the TVI-912B/TVI-920B and +# TVI-912C/TVI-920C: +# +# S1 (Line), and S3 (Printer) baud rates -- put one, and only one, switch down: +# 2: 9600 3: 4800 4: 2400 5: 1200 +# 6: 600 7: 300 8: 150 9: 75 +# 10: 110 +# +# S2 UART/Terminal options: +# Up Down +# 1: Not used Not allowed +# 2: Alternate character set Standard character set +# 3: Full duplex Half duplex +# 4: 50 Hz refresh 60 Hz refresh +# 5: No parity Send parity +# 6: 2 stop bits 1 stop bit +# 7: 8 data bits 7 data bits +# 8: Not used Not allowed on Rev E or lower +# 9: Even parity Odd parity +# 10: Steady cursor Blinking cursor +# (On Rev E or lower, use W25 instead of switch 10.) +# +# S5 UART/Terminal options: +# Open Closed +# 1: P3-6 Not connected DSR received on P3-6 +# 2: P3-8 Not connected DCD received on P3-8 +# +# 3 Open, 4 Open: P3-20 Not connected +# 3 Open, 4 Closed: DTR on when terminal is on +# 3 Closed, 4 Open: DTR is connected to RTS +# 3 Closed, 4 Closed: Not allowed +# +# 5 Closed: HDX printer (hardware control) Rev. K with extension port off, +# all data transmitted out of the modem port (P3) will also be +# transmitted out of the printer port (P4). +# +# 6 Open, 7 Open: Not allowed +# 6 Open, 7 Closed: 20ma current loop input +# 6 Closed, 7 Open: RS232 input +# 6 Closed, 7 Closed: Not allowed +# +# Jumper options: +# If the jumper is installed, the effect will occur (the next time the terminal +# is switched on). +# +# S4/W31: Enables automatic LF upon receipt of CR from +# remote or keyboard. +# S4/W32: Enables transmission of EOT at the end of Send. If not +# installed, a carriage return is sent. +# S4/W33: Disables automatic carriage return in column 80. +# S4/W34: Selects Page Print Mode as initial condition. If not +# installed, Extension Mode is selected. +# +# NON-STANDARD CAPABILITIES +# +# Sending or returns a cursor position report in the format +# YX\r, where Y and X are as in . This format is described in +# and , but it's not clear how one should write an +# appropriate scanf string, since we need to subtract %' ' from the +# character after reading it. The capability is used by tack(1) +# to synchronize during padding tests, and seems to work for that +# purpose. +# +# This description also includes the obsolete termcap capabilities +# has_hardware_tabs () and backspaces_with_bs (). +# +# FEATURES NOT YET DESCRIBED IN THIS TERMINFO +# +# The FUNCT modifier actually works with every normal key by sending +# ^AX\r, where X is the sequence normally sent by that key. This is a +# sort of meta key not currently describable in terminfo. +# +# There are quite a few other keys (especially on the 920 models,) but +# they are for the most part only useful in block mode. +# +# These terminals have lots of forms manipulation features, mainly +# useful in block mode, including "clear X to nulls" (vs. "clear X to +# spaces"; nulls are sentinels for "send X" operations); "send X" +# operations for uploading all or part of the screen; and block-mode +# editing keys (they don't send escape sequences, but manipulate video +# memory directly). Block mode is used for local editing, and protect +# mode (in conjunction with the "write protect" attribute, +# a.k.a. half-intensity outside of protect mode) is used to control +# which parts of the screen are edited/sent/printed (by ). +# +# There are at least two major families of ROM, "early" and +# A49B1/A49C1; the major difference seems to be that the latter ROMs +# support a few extra escape sequences for manipulating the off-screen +# memory page, and for sending whole pages back to the host (mainly +# useful in block mode.) The descriptions in this file don't use any +# of those sequences: set cursor position including page (\E-PYX, +# where P is \s for page 0 and ! for page 1 [actually only the LSB of +# P is taken into account, so e.g. 0 and 1 work too,] and Y and X are +# as in ); read cursor position (\E/), which is analogous to +# and returns PYX\r, where P is \s for page 0 or ! for page 1, and YX +# are as in , and some "send page" features mainly useful for +# forms manipulation. +# +# The keyboard enable (\E") and disable (\E#) sequences are unused, +# except that a terminal reset () enables the keyboard. +# +# Auto-flip mode (\Ev) is likely faster than the scrolling mode (\Ew) +# enabled in , but auto-flip is very jarring so we don't use it. +# +# BUGS +# +# At least up to the A49B1 and A49C1 ROMs, there are no \Eb and \Ed +# sequences (I infer that in some TeleVideo terminal they may invert +# and uninvert the display) so the sequence given here is a +# cheesy page-flip instead. +# +# The back_tab () sequence (\EI) doesn't work according to +# tack(1), so it is not included in the descriptions below. +# +# It's not clear whether auto_left_margin () flag should be set +# for these terminals; tack says yes, so it is set here, but this +# differs from other descriptions I've seen. +# +# Extension print mode () echoes all characters to the printer +# port [in addition to displaying them] except for the page print mode +# sequence (); this is a slight violation of the terminfo +# definition for but I don't expect it to cause problems. We +# reset to page print mode in since it may have been enabled +# accidentally. +# +# The descriptions with plus signs (+) are building blocks. + +tvi912b-unk|tvi912c-unk|TeleVideo TVI-912B or TVI-912C (no attributes), + OTbs, OTpt, am, bw, + cols#80, it#8, lines#24, + bel=^G, clear=\032$<50>, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%' '%+%c%p2%' '%+%c, cuu1=^K, dch1=\EW$<30>, + dl1=\ER$<1*>$<100>, ed=\Ey$<2*>$<10>, el=\ET$<15>, + home=^^, ht=^I, hts=\E1, ich1=\EQ$<30>, + if=/usr/share/tabset/stdcrt, il1=\EE$<1*>$<100>, + ind=\n$<10>, is2=\Ew\EA\E'\E"\E(, kcub1=^H, kcud1=\n, + kcuf1=^L, kcuu1=^K, kdch1=^?, kent=\r, khome=^^, mc4=\EA, + mc5=\E@, rs1=\Ek\010\Em\010\Eq\032, tbc=\E3, u6=%c%c\r, + u7=\E?, u8=%c%c\r, u9=\E?, + +# This isn't included in the basic capabilities because it is +# typically unusable in combination with the full range of video +# attributes, since the magic cookie attributes turn into ASCII +# control characters, and the half-intensity ("protected") attribute +# converts all affected characters to spaces. + +tvi912b+printer|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C page print support, + mc0=\EP, + +# This uses half-intensity mode () for standout (), and +# exposes no other attributes (half-intensity is the only attribute +# that does not generate a magic cookie.) + +tvi912b+dim|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C half-intensity attribute support, + msgr, + dim=\E), rmso=\E(, sgr=\E%?%p1%p5%|%t)%e(%;, sgr0=\E(, + smso=\E), + +# Full magic-cookie attribute support, with half-intensity reverse +# video for standout. Note that we add a space in the sequence +# to give a consistent magic-cookie count. Also note that uses +# backspacing (in the TVI-supported order) to apply all requested +# attributes with only a single magic cookie. + +tvi912b+mc|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C full magic-cookie attribute support, + xmc#1, + blink=\E\^, dim=\E)\s, invis=\E_, rev=\Ej, rmso=\E(\Ek, + rmul=\Em, + sgr=\E%?%p1%p5%|%t)%e(%;\s\010\E%?%p1%p3%|%tj%ek%;\010\E%? + %p2%tl%em%;\010\E%?%p7%t_%e%?%p4%t\^%eq%;%;, + sgr0=\E(\Ek\010\Em\010\Eq, smso=\E)\Ej, smul=\El, + +# This uses the second page memory option to save & restore screen +# contents. If your terminal is missing the option, this description +# should still work, but that has not been tested. + +tvi912b+2p|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C second page memory option support, + flash=\EK$<100>\EK, rmcup=\032$<50>\EK\E=7\s, + smcup=\EK\032$<50>\E(\Ek\010\Em\010\Eq\032$<50>, + +# This simulates flashing by briefly toggling to the other page +# (kludge!) + +tvi912b+vb|TeleVideo TVI-912B/TVI-920B and TVI-912C/TVI-920C second page memory option "visible bell" support, + bel=\EK$<100>\EK, use=tvi912b+2p, + +# Function keys ( .. are shifted .. ) + +tvi920b+fn|TeleVideo TVI-920B and TVI-920C function key support, + kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^A`\r, kf13=^Aa\r, + kf14=^Ab\r, kf15=^Ac\r, kf16=^Ad\r, kf17=^Ae\r, kf18=^Af\r, + kf19=^Ag\r, kf2=^AA\r, kf20=^Ah\r, kf21=^Ai\r, kf22=^Aj\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, + +# Combinations of the basic building blocks + +tvi912b-2p-unk|tvi912c-2p-unk|tvi912b-unk-2p|tvi912c-unk-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; no attributes), + use=tvi912b+2p, use=tvi912b-unk, + +tvi912b-vb-unk|tvi912c-vb-unk|tvi912b-unk-vb|tvi912c-unk-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; no attributes), + use=tvi912b+vb, use=tvi912b-unk, + +tvi912b-p|tvi912c-p|TeleVideo TVI-912B or TVI-912C (no attributes; page print), + use=tvi912b+printer, use=tvi912b-unk, + +tvi912b-2p-p|tvi912c-2p-p|tvi912b-p-2p|tvi912c-p-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; no attributes; page print), + use=tvi912b+2p, use=tvi912b+printer, use=tvi912b-unk, + +tvi912b-vb-p|tvi912c-vb-p|tvi912b-p-vb|tvi912c-p-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; no attributes; page print), + use=tvi912b+vb, use=tvi912b+printer, use=tvi912b-unk, + +tvi912b-2p|tvi912c-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; half-intensity attribute), + use=tvi912b+2p, use=tvi912b+dim, use=tvi912b-unk, + +tvi912b-2p-mc|tvi912c-2p-mc|tvi912b-mc-2p|tvi912c-mc-2p|TeleVideo TVI-912B or TVI-912C (second page memory option; magic cookies), + use=tvi912b+2p, use=tvi912b+mc, use=tvi912b-unk, + +tvi912b-vb|tvi912c-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; half-intensity attribute), + use=tvi912b+vb, use=tvi912b+dim, use=tvi912b-unk, + +tvi912b-vb-mc|tvi912c-vb-mc|tvi912b-mc-vb|tvi912c-mc-vb|TeleVideo TVI-912B or TVI-912C (second page memory option "visible bell"; magic cookies), + use=tvi912b+vb, use=tvi912b+mc, use=tvi912b-unk, + +tvi912b|tvi912c|TeleVideo TVI-912B or TVI-912C (half-intensity attribute), + use=tvi912b+dim, use=tvi912b-unk, + +tvi912b-mc|tvi912c-mc|TeleVideo TVI-912B or TVI-912C (magic cookies), + use=tvi912b+mc, use=tvi912b-unk, + +tvi920b-unk|tvi920c-unk|TeleVideo TVI-920B or TVI-920C (no attributes), + use=tvi920b+fn, use=tvi912b-unk, + +tvi920b-2p-unk|tvi920c-2p-unk|tvi920b-unk-2p|tvi920c-unk-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; no attributes), + use=tvi920b+fn, use=tvi912b+2p, use=tvi912b-unk, + +tvi920b-vb-unk|tvi920c-vb-unk|tvi920b-unk-vb|tvi920c-unk-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; no attributes), + use=tvi920b+fn, use=tvi912b+vb, use=tvi912b-unk, + +tvi920b-p|tvi920c-p|TeleVideo TVI-920B or TVI-920C (no attributes; page print), + use=tvi920b+fn, use=tvi912b+printer, use=tvi912b-unk, + +tvi920b-2p-p|tvi920c-2p-p|tvi920b-p-2p|tvi920c-p-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; no attributes; page print), + use=tvi920b+fn, use=tvi912b+2p, use=tvi912b+printer, + use=tvi912b-unk, + +tvi920b-vb-p|tvi920c-vb-p|tvi920b-p-vb|tvi920c-p-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; no attributes; page print), + use=tvi920b+fn, use=tvi912b+vb, use=tvi912b+printer, + use=tvi912b-unk, + +tvi920b-2p|tvi920c-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; half-intensity attribute), + use=tvi920b+fn, use=tvi912b+2p, use=tvi912b+dim, + use=tvi912b-unk, + +tvi920b-2p-mc|tvi920c-2p-mc|tvi920b-mc-2p|tvi920c-mc-2p|TeleVideo TVI-920B or TVI-920C (second page memory option; magic cookies), + use=tvi920b+fn, use=tvi912b+2p, use=tvi912b+mc, + use=tvi912b-unk, + +tvi920b-vb|tvi920c-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; half-intensity attribute), + use=tvi920b+fn, use=tvi912b+vb, use=tvi912b+dim, + use=tvi912b-unk, + +tvi920b-vb-mc|tvi920c-vb-mc|tvi920b-mc-vb|tvi920c-mc-vb|TeleVideo TVI-920B or TVI-920C (second page memory option "visible bell"; magic cookies), + use=tvi920b+fn, use=tvi912b+vb, use=tvi912b+mc, + use=tvi912b-unk, + +tvi920b|tvi920c|TeleVideo TVI-920B or TVI-920C (half-intensity attribute), + use=tvi920b+fn, use=tvi912b+dim, use=tvi912b-unk, + +tvi920b-mc|tvi920c-mc|TeleVideo TVI-920B or TVI-920C (magic cookies), + use=tvi920b+fn, use=tvi912b+mc, use=tvi912b-unk, + +# TeleVideo 921 and variants +# From: Tim Theisen 22 Sept 1995 +# (tvi921: removed :ko=bt: before translation, I see no backtab cap; +# also added empty to suppress tic warning -- esr) +tvi921|TeleVideo model 921 with sysline same as page & real vi function, + OTbs, OTpt, am, hs, xenl, xhp, + cols#80, lines#24, xmc#0, + acsc=, clear=^Z, cnorm=\E.3, cr=\r, cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<3/>, cuu1=^K, + cvvis=\E.2, dch1=\EW, dl1=\ER$<1*/>, dsl=\Ef\r\Eg, ed=\EY, + el=\ET, fsl=\Eg, home=^^, ht=^I, ich1=\EQ, + if=/usr/share/tabset/stdcrt, il1=\EE, ind=\n, invis@, + is2=\El\E"\EF1\E.3\017\EA\E<, kbs=^H, kclr=^Z, kcub1=^H, + kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER$<1*/>, + ked=\EY, kel=\ET, kich1=\EQ, kil1=\EE, nel=\r\n, rmacs=\E%%, + rmir=, smacs=\E$, smir=, tsl=\Ef\EG0, use=adm+sgr, +# without the beeper +# (tvi92B: removed :ko=bt: before translation, I see no backtab cap; +# also added empty to suppress tic warning -- esr) +tvi92B|TeleVideo model 921 with sysline same as page & real vi function & no beeper, + am, hs, xenl, xhp, + cols#80, lines#24, xmc#0, + acsc=, clear=^Z, cnorm=\E.3, cr=\r, cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<3/>, cuu1=^K, + cvvis=\E.2, dch1=\EW, dl1=\ER$<1*/>, dsl=\Ef\r\Eg, ed=\EY, + el=\ET, flash=\Eb$<200/>\Ed, fsl=\Eg, home=^^, ht=^I, + ich1=\EQ, if=/usr/share/tabset/stdcrt, il1=\EE, ind=\n, + invis@, is2=\El\E"\EF1\E.3\017\EA\E<, kbs=^H, kclr=^Z, + kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, + kdl1=\ER$<1*/>, ked=\EY, kel=\ET, kich1=\EQ, kil1=\EE, + nel=\r\n, rmacs=\E%%, smacs=\E$, tsl=\Ef\EG0, use=adm+sgr, +# (tvi92D: removed :ko=bt: before translation, I see no backtab cap -- esr) +tvi92D|tvi92B with DTR instead of XON/XOFF & better padding, + dl1=\ER$<2*/>, il1=\EE$<2*/>, + is2=\El\E"\EF1\E.3\016\EA\E<, kdl1=\ER$<2*/>, + kil1=\EE$<2*/>, use=tvi92B, + +# (tvi924: This used to have , . I put the new strings +# in from a BSD termcap file because it looks like they do something the +# old ones skip -- esr) +tvi924|TeleVideo tvi924, + am, bw, hs, in, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, wsl#80, xmc#0, + bel=^G, blink=\EG2, cbt=\EI, civis=\E.0, clear=\E*0, + cnorm=\E.3, cr=\r, csr=\E_%p1%{32}%+%c%p2%{32}%+%c, + cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, cvvis=\E.1, + dch1=\EW, dl1=\ER, dsl=\Es0\Ef\031, ed=\Ey, el=\Et, + flash=\Eb$<200>\Ed, fsl=\031\Es1, home=^^, ht=^I, hts=\E1, + ich1=\EQ, if=/usr/share/tabset/stdcrt, il1=\EE, ind=\n, + invis@, is1=\017\E%\E'\E(\EDF\EC\EG0\EN0\Es0\Ev0, + kbs=^H, kclr=\E*0, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, + kdch1=\EW, kdl1=\ER, ked=\Ey, kel=\Et, kf0=^A@\r, kf1=^AA\r, + kf10=^AJ\r, kf11=^AK\r, kf12=^AL\r, kf13=^AM\r, kf14=^AN\r, + kf15=^AO\r, kf2=^AB\r, kf3=^AC\r, kf4=^AD\r, kf5=^AE\r, + kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, kf9=^AI\r, khome=^^, + kich1=\EQ, kil1=\EE, lf0=F1, lf1=F2, lf10=F11, lf2=F3, lf3=F4, + lf4=F5, lf5=F6, lf6=F7, lf7=F8, lf8=F9, lf9=F10, + pfkey=\E|%p1%{49}%+%c%p2%s\031, ri=\Ej, tbc=\E3, tsl=\Ef, + use=adm+sgr, + +# TVI925 DIP switches. In each of these, D = Down and U = Up, +# +# Here are the settings for the external (baud) switches (S1): +# +# Position Baud +# 7 8 9 10 [Printer] +# 1 2 3 4 [Main RS232] +# ----------------------------------------------------- +# D D D D 9600 +# D D D U 50 +# D D U D 75 +# D D U U 110 +# D U D D 135 +# D U D U 150 +# D U U D 300 +# D U U U 600 +# U D D D 1200 +# U D D U 1800 +# U D U D 2400 +# U D U U 3600 +# U U D D 4800 +# U U D U 7200 +# U U U D 9600 +# U U U U 19200 +# +# +# Settings for word length and stop-bits (S1) +# +# Position Description +# 5 6 +# --------------------------- +# U - 7-bit word +# D - 8-bit word +# - U 2 stop bits +# - D 1 stop bit +# +# +# S2 (external) settings +# +# Position Up Dn Description +# -------------------------------------------- +# 1 X Local edit +# X Duplex edit (transmit editing keys) +# -------------------------------------------- +# 2 X 912/920 emulation +# X 925 +# -------------------------------------------- +# 3 X +# 4 X No parity +# 5 X +# -------------------------------------------- +# 3 X +# 4 X Odd parity +# 5 X +# -------------------------------------------- +# 3 X +# 4 X Even parity +# 5 X +# -------------------------------------------- +# 3 X +# 4 X Mark parity +# 5 X +# -------------------------------------------- +# 3 X +# 4 X Space parity +# 5 X +# -------------------------------------------- +# 6 X White on black display +# X Black on white display +# -------------------------------------------- +# 7 X Half Duplex +# 8 X +# -------------------------------------------- +# 7 X Full Duplex +# 8 X +# -------------------------------------------- +# 7 X Block mode +# 8 X +# -------------------------------------------- +# 9 X 50 Hz +# X 60 Hz +# -------------------------------------------- +# 10 X CR/LF (Auto LF) +# X CR only +# +# S3 (internal switch) settings: +# +# Position Up Dn Description +# -------------------------------------------- +# 1 X Keyclick off +# X Keyclick on +# -------------------------------------------- +# 2 X English +# 3 X +# -------------------------------------------- +# 2 X German +# 3 X +# -------------------------------------------- +# 2 X French +# 3 X +# -------------------------------------------- +# 2 X Spanish +# 3 X +# -------------------------------------------- +# 4 X Blinking block cursor +# 5 X +# -------------------------------------------- +# 4 X Blinking underline cursor +# 5 X +# -------------------------------------------- +# 4 X Steady block cursor +# 5 X +# -------------------------------------------- +# 4 X Steady underline cursor +# 5 X +# -------------------------------------------- +# 6 X Screen blanking timer (ON) +# X Screen blanking timer (OFF) +# -------------------------------------------- +# 7 X Page attributes +# X Line attributes +# -------------------------------------------- +# 8 X DCD disconnected +# X DCD connected +# -------------------------------------------- +# 9 X DSR disconnected +# X DSR connected +# -------------------------------------------- +# 10 X DTR Disconnected +# X DTR connected +# -------------------------------------------- +# +# (tvi925: BSD has . I got and from there -- esr) +tvi925|TeleVideo 925, + OTbs, am, bw, hs, ul, + cols#80, lines#24, xmc#1, + bel=^G, cbt=\EI, clear=^Z, cnorm=\E.4, cr=\r, cub1=^H, cud1=^V, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + cvvis=\E.2, dch1=\EW, dl1=\ER, dsl=\Eh, ed=\EY, el=\ET, + flash=\Eb$<200>\Ed, fsl=\r\Eg, home=^^, ht=^I, hts=\E1, + ich1=\EQ, il1=\EE, ind=\n, invis@, is2=\El\E", kbs=^H, kclr=^Z, + kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, + ked=\EY, kel=\ET, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, + kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, + kf9=^AH\r, khome=^^, kich1=\EQ, kil1=\EE, ri=\Ej, tbc=\E3, + tsl=\Eh\Ef, use=adm+sgr, +# TeleVideo 925 from Mitch Bradley via BRL +# to avoid "magic cookie" standout glitch: +tvi925-hi|TeleVideo Model 925 with half intensity standout mode, + xmc@, + kcud1=\n, rmso=\E(, smso=\E), use=tvi925, + +# From: Todd Litwin 28 May 1993 +# Originally Tim Curry, Univ. of Central Fla., 5/21/82 +# for additional capabilities, +# The following tvi descriptions from B:pjphar and virus!mike +# is for all 950s. It sets the following attributes: +# full duplex (\EDF) write protect off (\E() +# conversation mode (\EC) graphics mode off (\E%) +# white on black (\Ed) auto page flip off (\Ew) +# turn off status line (\Eg) clear status line (\Ef\r) +# normal video (\E0) monitor mode off (\EX or \Eu) +# edit mode (\Er) load blank char to space (\Ee\040) +# line edit mode (\EO) enable buffer control (^O) +# protect mode off (\E\047) duplex edit keys (\El) +# program unshifted send key to send line all (\E016) +# program shifted send key to send line unprotected (\E004) +# set the following to nulls: +# field delimiter (\Ex0\200\200) +# line delimiter (\Ex1\200\200) +# start-protected field delimiter (\Ex2\200\200) +# end-protected field delimiter (\Ex3\200\200) +# set end of text delimiter to carriage return/null (\Ex4\r\200) +# +# TVI 950 Switch Setting Reference Charts +# +# TABLE 1: +# +# S1 1 2 3 4 5 6 7 8 9 10 +# +-----------------------+-----+-----+-----------------------+ +# | Computer Baud Rate |Data |Stop | Printer Baud Rate | +# | |Bits |Bits | | +# +------+-----------------------+-----+-----+-----------------------+ +# | Up | See | 7 | 2 | See | +# +------+-----------------------+-----+-----+-----------------------+ +# | Down | TABLE 2 | 8 | 1 | TABLE 2 | +# +------+-----------------------+-----+-----+-----------------------+ +# +# +# S2 1 2 3 4 5 6 7 8 9 10 +# +-----+-----+-----------------+-----+-----------+-----+-----+ +# |Edit |Cursr| Parity |Video|Transmiss'n| Hz |Click| +# +------+-----+-----+-----------------+-----+-----------+-----+-----+ +# | Up | Dplx|Blink| See |GonBk| See | 60 | Off | +# +------+-----+-----+-----------------+-----+-----------+-----+-----+ +# | Down |Local|St'dy| TABLE 3 |BkonG| CHART | 50 | On | +# +------+-----+-----+-----------------+-----+-----------+-----+-----+ +# +# TABLE 2: +# +# +-----------+-----+-----+-----+-----+-----------+ +# | Display | 1 | 2 | 3 | 4 | Baud | +# +-----------+-----+-----+-----+-----+ | +# | Printer | 7 | 8 | 9 | 10 | Rate | +# +-----------+-----+-----+-----+-----+-----------+ +# | D | D | D | D | 9600 | +# | U | D | D | D | 50 | +# | D | U | D | D | 75 | +# | U | U | D | D | 110 | +# | D | D | U | D | 135 | +# | U | D | U | D | 150 | +# | D | U | U | D | 300 | +# | U | U | U | D | 600 | +# | D | D | D | U | 1200 | +# | U | D | D | U | 1800 | +# | D | U | D | U | 2400 | +# | U | U | D | U | 3600 | +# | D | D | U | U | 4800 | +# | U | D | U | U | 7200 | +# | D | U | U | U | 9600 | +# | U | U | U | U | 19200 | +# +-----+-----+-----+-----+-----------+ +# +# TABLE 3: +# +-----+-----+-----+-----------+ +# | 3 | 4 | 5 | Parity | +# +-----+-----+-----+-----------+ +# | X | X | D | None | +# | D | D | U | Odd | +# | D | U | U | Even | +# | U | D | U | Mark | +# | U | U | U | Space | +# +-----+-----+-----+-----------+ +# X = don't care +# +# CHART: +# +-----+-----+-----------------+ +# | 7 | 8 | Communication | +# +-----+-----+-----------------+ +# | D | D | Half Duplex | +# | D | U | Full Duplex | +# | U | D | Block | +# | U | U | Local | +# +-----+-----+-----------------+ +# +# (tvi950: early versions had obsolete ":ma=^Vj^Kk^Hh^Ll^^H:". +# I also inserted and ; the :ko: string indicated that +# should be present and all tvi native modes use the same string for this. +# Finally, note that BSD has cud1=^V. -- esr) +# +# TVI 950 has 11 function-keys -TD +tvi950|TeleVideo 950, + OTbs, am, hs, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, xmc#1, + acsc=jHkGlFmEnIqKtMuLvOwNxJ, bel=^G, cbt=\EI, clear=\E*, + cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, dsl=\Eg\Ef\r, ed=\Ey, el=\Et, flash=\Eb$<200/>\Ed, + fsl=\r, home=^^, ht=^I, hts=\E1, ich1=\EQ, il1=\EE, ind=\n, + invis@, + is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\El + \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0 + \Ef\r, + kbs=^H, kcbt=\EI, kclr=\E*, kcub1=^H, kcud1=^V, kcuf1=^L, + kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\Ey, kel=\Et, kf1=^A@\r, + kf10=^AI\r, kf11=^AJ\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, + kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, + khome=^^, kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`, ri=\Ej, + rmacs=\E%%, rmir=\Er, smacs=\E$, smir=\Eq, tbc=\E3, + tsl=\Eg\Ef, kF1=^A`\r, kF10=^Ai\r, kF11=^Aj\r, kF2=^Aa\r, + kF3=^Ab\r, kF4=^Ac\r, kF5=^Ad\r, kF6=^Ae\r, kF7=^Af\r, + kF8=^Ag\r, kF9=^Ah\r, use=adm+sgr, +# +# is for 950 with two pages adds the following: +# set 48 line page (\E\\2) +# place cursor at page 0, line 24, column 1 (\E-07 ) +# set local (no send) edit keys (\Ek) +# +# two page 950 adds the following: +# when entering ex, set 24 line page (\E\\1) +# when exiting ex, reset 48 line page (\E\\2) +# place cursor at 0,24,1 (\E-07 ) +# set duplex (send) edit keys (\El) when entering vi +# set local (no send) edit keys (\Ek) when exiting vi +# +tvi950-2p|TeleVideo 950 w/2 pages, + is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek + \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0 + \E\\2\E-07\s\011, + rmcup=\E\\2\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s, + smkx=\El, use=tvi950, +# +# is for 950 with four pages adds the following: +# set 96 line page (\E\\3) +# place cursor at page 0, line 24, column 1 (\E-07 ) +# +# four page 950 adds the following: +# when entering ex, set 24 line page (\E\\1) +# when exiting ex, reset 96 line page (\E\\3) +# place cursor at 0,24,1 (\E-07 ) +# +tvi950-4p|TeleVideo 950 w/4 pages, + is2=\EDF\EC\Ed\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek + \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0 + \E\\3\E-07\s\011, + rmcup=\E\\3\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s, + smkx=\El, use=tvi950, +# +# for reverse video 950 changes the following: +# set reverse video (\Ed) +# +# set vb accordingly (\Ed ...delay... \Eb) +# +tvi950-rv|TeleVideo 950 rev video, + flash=\Ed$<200/>\Eb, + is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\El + \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r + \0, + use=tvi950, + +# tvi950-rv-2p uses the appropriate entries from 950-2p and 950-rv +tvi950-rv-2p|TeleVideo 950 rev video w/2 pages, + flash=\Ed$<200/>\Eb, + is2=\EDF\EC\Eb\EG0\Eg\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek + \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0 + \E\\2\E-07\s, + rmcup=\E\\2\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s, + smkx=\El, use=tvi950, + +# tvi950-rv uses the appropriate entries from 950-4p and 950-rv +tvi950-rv-4p|TeleVideo 950 rev video w/4 pages, + flash=\Ed$<200/>\Eb, + is2=\EDF\EC\Eb\EG0\Er\EO\E'\E(\E%\Ew\EX\Ee\s\017\011\Ek + \E016\E004\Ex0\0\0\Ex1\0\0\Ex2\0\0\011\Ex3\0\0\Ex4\r\0 + \E\\3\E-07\s, + rmcup=\E\\3\E-07\s, rmkx=\Ek, smcup=\E\\1\E-07\s, + smkx=\El, use=tvi950, +# From: Andreas Stolcke +# (tvi955: removed obsolete ":ma:=^Vj^Kk^Hh^Ll^^H"; +# removed incorrect (and overridden) ":do=^J:"; fixed broken continuations in +# the :rs: string, inserted the implied by the termcap :ko: string. Note +# the :ko: string had :cl: in it, which means that one of the original +# , had to be wrong; set because that's what +# the 950 has. Finally, corrected the string to match the 950 and what +# ko implies -- esr) +# If the BSD termcap file was right, would +# also work. +tvi955|TeleVideo 955, + mc5i, msgr@, + xmc@, + acsc=0_`RjHkGlFmEnIoPqKsQtMuLvOwNxJ, blink=\EG2, + civis=\E.0, cnorm=\E.2, cud1=^V, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E.1, dim=\E[=5h, ind@, invis=\EG1, + is2=\E[=3l\EF1\Ed\EG0\E[=5l\E%\El, kctab=\E2, khts=\E1, + knp=\EK, kpp=\EJ, krmir=\EQ, ktbc=\E3, mc0=\EP, rmacs=\E%, + rmam=\E[=7l, rmxon=^N, + rs1=\EDF\EC\Eg\Er\EO\E'\E(\Ew\EX\Ee\s\017\E0P\E6\0\E0p\E4\0 + \Ef\r, + sgr0=\EG0\E[=5l, smam=\E[=7h, smxon=^O, use=tvi950, +tvi955-w|955-w|TeleVideo 955 w/132 cols, + cols#132, + is2=\E[=3h\EF1\Ed\EG0\E[=5l\E%\El, use=tvi955, +# use half-intensity as normal mode, full intensity as +tvi955-hb|955-hb|TeleVideo 955 half-bright, + bold=\E[=5l, dim@, is2=\E[=3l\EF1\Ed\EG0\E[=5h\E%\El, + sgr0=\EG0\E[=5h, use=tvi955, +# From: Humberto Appleton , 880521 UT Austin +# (tvi970: removed ":sg#0:"; removed =\E[m, =\E[m; +# added ////// from BRL. +# According to BRL we could have =\E>, =\E= but I'm not sure what +# it does to the function keys. I deduced /. +# also added empty to suppress tic warning, -- esr) +tvi970|TeleVideo 970, + OTbs, OTpt, am, da, db, mir, msgr, + cols#80, it#8, lines#24, + acsc=, cbt=\E[Z, clear=\E[H\E[2J, csr=\E[%i%p1%d;%p2%dr, + cub1=^H, cud1=\ED, cuf1=\E[C, cup=\E[%i%p1%d;%p2%df, + cuu1=\EM, cvvis=\E[1Q, dch1=\E[P, dl1=\E[M, dsl=\Eg\Ef\r, + ed=\E[J, el=\E[K, flash=\E[5m$<200/>\E[m, home=\E[H, + hpa=\E[%i%p1%dG, ht=^I, il1=\E[L, + is2=\E<\E[?21l\E[19h\E[1Q\E[10l\E[7l\E[H\E[2J, + kf1=\E?a, kf2=\E?b, kf3=\E?c, kf4=\E?d, kf5=\E?e, kf6=\E?f, + kf7=\E?g, kf8=\E?h, kf9=\E?i, ri=\EM, rmacs=\E(B, + rmam=\E[?7h, rmcup=, rmir=\E[4l, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smacs=\E(B, smam=\E[?7l, + smcup=\E[?20l\E[?7h\E[1Q, smir=\E[4h, smso=\E[7m, + smul=\E[4m, vpa=\E[%i%p1%dd, use=ansi+arrows, + +tvi970-vb|TeleVideo 970 with visual bell, + flash=\E[?5h\0\0\0\0\0\0\0\0\0\0\0\0\0\E[?5l, + use=tvi970, +tvi970-2p|TeleVideo 970 with using 2 pages of memory, + rmcup=\E[H\E[J\E[V, smcup=\E[U\E[?20l\E[?7h\E[1Q, + use=tvi970, +# Works with vi and rogue. NOTE: Esc v sets autowrap on, Esc u sets 80 chars +# per line (rather than 40), Esc K chooses the normal character set. Not sure +# padding is needed, but adapted from the tvi920c termcap. The and +# strings are klutzy, but at least use no screen space. +# (tvipt: removed obsolete ":ma=^Kk^Ll^R^L:". I wish we knew , +# its absence means =\Ev isn't safe to use. -- esr) +# From: Gene Rochlin 9/19/84. +# The ////, and caps are from BRL, which says: +# F1 and F2 should be programmed as ^A and ^B; required for UNIFY. +tvipt|TeleVideo personal terminal, + OTbs, am, + cols#80, lines#24, + cbt=\EI, clear=^Z, cub1=^H, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\ER$<5*>, + ed=\EY, el=\ET, home=^^, if=/usr/share/tabset/stdcrt, + il1=\EE$<5*>, is2=\Ev\Eu\EK, kbs=^H, kcub1=^H, kcud1=\n, + kcuf1=^L, kcuu1=^K, kf0=^A, kf1=^B, khome=^^, mc4=^T, mc5=^R, + rmso=\EF, rmul=\EF, smso=\EG1@A\EH, smul=\EG1B@\EH, +# From: Nathan Peterson , 03 Sep 1996 +tvi9065|TeleVideo 9065, + am, bw, chts, hs, mc5i, mir, msgr, xenl, xon, + cols#80, it#8, lh#1, lines#25, lm#0, lw#9, ma#4, nlab#8, vt#0, + wnum#0, wsl#30, + acsc='r0_jhkglfmeniopqksqtmulvownxj, bel=^G, + blink=\EG2, bold=\EG\,, cbt=\EI, civis=\E.0, clear=^Z, + cnorm=\E.3, cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=^V, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + cvvis=\E.2, dch=\E[%p1%dP, dch1=\EW, dim=\EGp, + dl=\E[%p1%dM, dl1=\ER, dsl=\E_30\r, ech=\E[%p1%d@, ed=\EY, + el=\ET, flash=\Eb$<15>\Ed, fsl=\r, home=^^, ht=^I, hts=\E1, + ich=\E[%p1%d@, if=/usr/share/tabset/stdcrt, + il=\E[%p1%dL, il1=\EE, ind=\n, invis=\EG1, ip=$<3>, + is1=\E"\E%\E'\E(\EG@\EO\EX\E[=5l\E[=6l\E[=7h\Ed\Er, + is2=\EF2\EG0\E\\L, is3=\E<\E[=4l\E[=8h, kHOM=\E\s\s\s, + kbs=^H, kcbt=\EI, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, + kdch1=\EW, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, ll=\E[25;1H, + mc0=\E[0;0i, mc4=\Ea, mc5=\E`, nel=\r\n, + pfkey=\E|%p1%{48}%+%c3%p2%s\031, + pfloc=\E|%p1%{48}%+%c2%p2%s\031, + pfx=\E|%p1%{48}%+%c1%p2%s\031, + pln=\E_%p1%{63}%+%c%p2%s\r, prot=\E&, + rep=\E[%p2%db%p1%c, rev=\EG4, + rf=/usr/share/tabset/stdcrt, ri=\Ej, rmacs=\E%%, + rmam=\E[=7l, rmcup=\E.3\Er\E[1;25r\E[25;0H, rmdc=\0, + rmir=\Er, rmln=\E[4;1v, rmso=\EG0, rmul=\EG0, rmxon=^N, + rs1=\EC\EDF\E[0;0v\E[8;1v\E[=65l, + rs2=\E.b\E[10;20v\E[14;1v\E[3;0v\E[7;0v\E[=11.h\E[=12.h\E[=1 + 3.h\E[=14.h\E[=15l\E[=20h\E[=60l\E[=61h\E[=9l\E[=10l\E[= + 21l\E[=23l\E[=3l\E_40\E_50\En\Ew\Ee\s\Ex0\0\0\Ex1\0\0 + \Ex2\0\0\Ex3\0\0\Ex4\0\0\E1, + rs3=\E[=19h\E.3\E9\E0O\0\0\0\0\0\E0o\0\0\0\0\0\E0J\177\0\0 + \0\0, + sgr=\EG0%?%p1%t\EGt%;%?%p2%t\EG8%;%?%p3%t\EG4%;%?%p4%t\EG2%; + %?%p5%t\EGp%;%?%p6%t\EG\,%;%?%p7%t\EG1%;%?%p8%t\E&%;%? + %p9%t\E$%e\E%%%;, + sgr0=\EG0\E%, smacs=\E$, smam=\E=7h, smcup=\E.2, smdc=\Er, + smir=\Eq, smln=\E[4;2v, smso=\EGt, smul=\EG8, smxon=^O, + tbc=\E3, tsl=\E[4;1v\E_30, uc=\EG8\EG0, use=ansi+local, + use=ecma+index, + +#### Visual (vi) +# +# In September 1993, Visual Technology of Westboro, Massachusetts, +# merged with White Pine Software of Nashua, New Hampshire. +# +# White Pine Software may be contacted at +1 603/886-9050. +# Or visit White Pine on the World Wide Web at URL http://www.wpine.com. +# + +# Visual 50 from Beau Shekita, BTL-Whippany +# Recently I hacked together the following termcap for Visual +# Technology's Visual 50 terminal. It's a slight modification of +# the VT52 termcap. +# It's intended to run when the Visual 50 is in VT52 emulation mode +# (I know what you're thinking; if it's emulating a VT52, then why +# another termcap? Well, it turns out that the Visual 50 can handle +# and db(?) among other things, which the VT52 can't) +# The termcap works OK for the most part. The only problem is on +# character inserts. The whole line gets painfully redrawn for each +# character typed. Any suggestions? +# Beau's entry is combined with the vi50 entry from University of Wisconsin. +# Note especially the function. - are really l4-l6 in +# disguise; - are really l1-l3. +vi50|Visual 50, + OTbs, OTpt, am, da, db, msgr, + OTnl=\n, cbt=\Ez$<4/>, cub1=^H, dl1=\EM$<3*/>, + el=\EK$<16/>, il1=\EL, kf1=\EP, kf2=\EQ, kf3=\ER, kf4=\EV, + kf5=\EE, kf6=\E], kf7=\EL, kf8=\Ev, kf9=\EM, khome=\EH, + rmso=\ET, rmul=\EW, smso=\EU, smul=\ES, use=vt52-basic, +# this one was BSD & SCO's vi50 +vi50adm|Visual 50 in adm3a mode, + am, msgr, + cols#80, it#8, lines#24, + bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\EM, + ed=\Ek, el=\EK, home=\EH, ht=^I, il1=\EL, ind=\n, kbs=^H, + khome=\EH, rmso=\ET, smso=\EU, use=vt52+arrows, +# From: Jeff Siegal +vi55|Visual 55, + OTbs, am, mir, msgr, + cols#80, it#8, lines#24, + clear=\Ev, csr=\E_%p1%{65}%+%c%p2%{65}%+%c, cub1=^H, + cud1=\n, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + cuu1=\EA, dch1=\Ew, dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, + il1=\EL, is2=\Ev\E_AX\Eb\EW\E9P\ET, kbs=^H, ri=\EI, + rmir=\Eb, rmso=\ET, smir=\Ea, smso=\EU, use=vt52+arrows, + +# Visual 200 from BRL +# The following switch settings are assumed for normal operation: +# FULL_DUPLEX SCROLL CR +# AUTO_NEW_LINE_ON VISUAL_200_EMULATION_MODE +# Other switches may be set for operator convenience or communication +# requirements. +# Character insertion is kludged in order to get around the "beep" misfeature. +# (This cap is commented out because / is more efficient -- esr) +# Supposedly "4*" delays should be used for , , , , +# and strings, but we seem to get along fine without them. +vi200|Visual 200, + OTbs, OTpt, am, mir, msgr, + OTkn#10, cols#80, it#8, lines#24, + acsc=+h.kffggjmkllsmenbq`tnuovcwdxa}r, bel=^G, cbt=\Ez, + clear=\Ev, cnorm=\Ec, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\Ed, + dch1=\EO, dim=\E4, dl1=\EM, ed=\Ey, el=\Ex, home=\EH, ht=^I, + hts=\E1, il1=\EL, ind=\n, invis=\Ea, kbs=^H, kclr=\Ev, + kctab=\E2, kdch1=\EO, kdl1=\EM, ked=\EJ, kel=\Et, kf0=\E?p, + kf1=\E?q, kf2=\E?r, kf3=\E?s, kf4=\E?t, kf5=\E?u, kf6=\E?v, + kf7=\E?w, kf8=\E?x, kf9=\E?y, khome=\EH, khts=\E1, kich1=\Ei, + kil1=\EL, krmir=\Ej, mc0=\EH\E], mc4=\EX, mc5=\EW, ri=\EI, + rmacs=\EG, rmkx=\E>, rmso=\E3, + rs1=\E3\Eb\Ej\E\El\EG\Ec\Ek\EX, sgr0=\E3\Eb, smacs=\EF, + smkx=\E=, smso=\E4, tbc=\Eg, use=vt52+arrows, +# The older Visuals didn't come with function keys. This entry uses +# and so that the keypad keys can be used as function keys. +# If your version of vi doesn't support function keys you may want +# to use vi200-f. +vi200-f|Visual 200 no function keys, + is2=\E3\Eb\Ej\E\\\El\EG\Ed\Ek, rmso@, smso@, use=vi200, +vi200-rv|Visual 200 reverse video, + cnorm@, cvvis@, ri@, use=vi200, + +# the function keys are programmable but we don't reprogram them to their +# default values with because programming them is very verbose. maybe +# an initialization file should be made for the 300 and they could be stuck +# in it. +# (vi300: added / based on init string -- esr) +vi300|Visual 300 ANSI x3.64, + am, bw, mir, xenl, + cols#80, lines#24, + bel=^G, cbt=\E[Z, clear=\E[H\E[2J, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P$<40>, dl1=\E[M, ed=\E[J, + el=\E[K, home=\E[H, ht=^I, il1=\E[L, ind=\n, + is2=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[1Q\E[0;1(D\E[8s, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kf1=\E_A\E\\, kf2=\E_B\E\\, kf3=\E_C\E\\, kf4=\E_D\E\\, + kf5=\E_E\E\\, kf6=\E_F\E\\, kf7=\E_G\E\\, kf8=\E_H\E\\, + kf9=\E_I\E\\, khome=\E[H, ri=\EM, rmam=\E[?7l, rmir=\E[4l, + rmso=\E[m, rmul=\E[m, sgr0=\E[m, smam=\E[?7h, smir=\E[4h, + smso=\E[1m, smul=\E[4m, use=ansi+local1, + +# some of the vi300s have older firmware that has the command +# sequence for setting editing extent reversed. +vi300-old|Visual 300 with old firmware (set edit extent reversed), + is2=\E[7s\E[2;3;4;20;?5;?6l\E[12;?7h\E[2Q\E[0;1(D\E[8s, use=vi300, + +# Visual 500 prototype entry from University of Wisconsin. +# The best place to look for the escape sequences is page A1-1 of the +# Visual 500 manual. The initialization sequence given here may be +# overkill, but it does leave out some of the initializations which can +# be done with the menus in set-up mode. +# The :xp: line below is so that emacs can understand the padding requirements +# of this slow terminal. :xp: is 10 time the padding factor. +# (vi500: removed unknown :xp#4: termcap; +# also added empty to suppress tic warning -- esr) +vi500|Visual 500, + am, mir, msgr, + cols#80, it#8, lines#33, + acsc=, cbt=\Ez$<4/>, clear=\Ev$<6*/>, cr=\r, + csr=\E(%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=\EB, + cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, + dch1=\EO$<3*/>, dl1=\EM$<3*/>, ed=\Ey$<3*/>, + el=\Ex$<16/>, home=\EH, ht=\011$<8/>, il1=\EL\Ex$<3*/>, + ind=\n, + is2=\E3\E\001\E\007\E\003\Ek\EG\Ed\EX\El\E>\Eb\E\\, + kbs=^H, khome=\EH, nel=\r\n, rmacs=^O, rmir=\Ej, rmso=\E^G, + rmul=\E^C, smacs=^N, smir=\Ei, smso=\E^H, smul=\E^D, + use=vt52+arrows, + +# The visual 550 is a visual 300 with Tektronix graphics, +# and with 33 lines. clear screen is modified here to +# also clear the graphics. +vi550|Visual 550 ANSI x3.64, + lines#33, + clear=\030\E[H\E[2J, use=vi300, + +vi603|visual603|Visual 603, + hs, mir, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, + csr=\E[%i%p1%d;%p2%dr, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, + dsl=\EP2;1~\E\\, ed=\E[J, el=\E[K, fsl=\E\\, ind=\ED, + is1=\E>\E[?3l\E[?4l\E[?7h\E[?8h\E[1;24r, rev=\E[7m, + ri=\EM, rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, + sgr0=\E[m\017$<2>, smir=\E[4h, smso=\E[7m, smul=\E[4m, + tsl=\EP2~, use=ansi+idl1, use=decid+cpr, use=vt100+4bsd, + +#### Wyse (wy) +# +# Wyse Technology +# 3471 North First Street +# San Jose, CA 95134 +# Vox: (408)-473-1200 +# Fax: (408) 473-1222 +# Web: http://www.wyse.com +# +# Wyse sales can be reached by phone at 1-800-GET-WYSE. Tech support is at +# (800)-800-WYSE (option 5 gets you a human). There's a Web page at the +# obvious address, . They keep terminfo entries at +# https://web.archive.org/web/19970712022641/http://www.wyse.co.uk/support/appnotes/idxappnt.htm +# +# +# Wyse bought out Link Technology, Inc. in 1990 and closed it down in 1995. +# They now own the Qume and Amdek brands, too. So these are the people to +# talk with about all Link, Qume, and Amdek terminals. +# +# These entries include a few small fixes. +# I canceled the bel capacities in the vb entries. +# I made two trivial syntax fixes in the wyse30 entry. +# I made some entries relative to adm+sgr. +# +# +# Note: The wyse75, wyse85, and wyse99 have been discontinued. + +# Although the Wyse 30 can support more than one attribute +# it requires magic cookies to do so. Many applications do not +# function well with magic cookies. The following terminfo uses +# the protect mode to support one attribute (dim) without cookies. +# If more than one attribute is needed then the wy30-mc terminfo +# should be used. +# +wy30|wyse30|Wyse 30, + am, bw, mc5i, mir, msgr, xon, + cols#80, lh#1, lines#24, lw#8, ma#1, nlab#8, + acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, cbt=\EI, + civis=\E`0, clear=\E+$<80>, cnorm=\E`1, cr=\r, cub1=^H, + cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, dch1=\EW$<10>, dim=\E`7\E), dl1=\ER$<1>, + ed=\EY$<80>, el=\ET, flash=\E`8$<100/>\E`9, home=^^, + ht=\011$<1>, hts=\E1, il1=\EE$<2>, ind=\n$<2>, ip=$<2>, + is2=\E'\E(\E\^3\E`9\016\024, kHOM=\E{, kbs=^H, kcbt=\EI, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, + ked=\EY, kel=\ET, kent=\E7, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, + kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, + khome=^^, kich1=\EQ, kil1=\EE, knp=\EK, kpp=\EJ, krpl=\Er, + ll=^^^K, mc0=\EP, mc4=^T, mc5=^X, nel=\r\n, + pfx=\Ez%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E`7\E), ri=\Ej$<3>, + rmacs=\EH^C, rmir=\Er, rmln=\EA11, rmso=\E(, + sgr=%?%p1%p5%p8%|%|%t\E`7\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;, + sgr0=\E(\EH\003, smacs=\EH^B, smir=\Eq, smln=\EA10, + smso=\E`7\E), tbc=\E0, use=wyse+sl, +# +# This terminal description uses the non-hidden attribute mode +# (with magic cookie). +# +# (wy30-mc: added to suppress tic warning --esr) +wy30-mc|wyse30-mc|Wyse 30 with magic cookies, + msgr@, + ma@, xmc#1, + blink=\EG2, dim=\EGp, prot=\EG0\E), rmacs=\EG0\EH\003, + rmcup=\EG0, rmso=\EG0, + sgr=\EG%{48}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%? + %p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8 + %t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;, + sgr0=\EG0\E(\EH\003, smacs=\EG0\EH\002, smcup=, + smso=\EG4, use=wy30, use=adm+sgr, +# The mandatory pause used by does not work with +# older versions of terminfo. If you see this effect then +# unset xon and delete the / from the delay. +# i.e. change $<100/> to $<100> +wy30-vb|wyse30-vb|Wyse 30 visible bell, + bel@, use=wy30, +# +# The Wyse 50 can support one attribute (e.g. Dim, Inverse, +# Normal) without magic cookies by using the protect mode. +# The following description uses this feature, but when more +# than one attribute is put on the screen at once, all attributes +# will be changed to be the same as the last attribute given. +# The Wyse 50 can support more attributes when used with magic +# cookies. The wy50-mc terminal description uses magic cookies +# to correctly handle multiple attributes on a screen. +# +wy50|wyse50|Wyse 50, + am, bw, mc5i, mir, msgr, xon, + cols#80, lh#1, lines#24, lw#8, ma#1, nlab#8, + acsc=a;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, cbt=\EI, + civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r, cub1=^H, + cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, dch1=\EW$<1>, dim=\E`7\E), dl1=\ER, ed=\EY$<20>, + el=\ET, flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1, + il1=\EE, ind=\n$<2>, ip=$<1>, is1=\E`:\E`9$<30>, + is2=\016\024\E'\E(, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, + kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, + kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K, + mc0=\EP, mc4=^T, mc5=^X, nel=\r\n, + pfx=\Ez%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E`7\E), rev=\E`6\E), + ri=\Ej, rmacs=\EH^C, rmir=\Er, rmln=\EA11, rmso=\E(, + sgr=%?%p1%p3%|%t\E`6\E)%e%p5%p8%|%t\E`7\E)%e\E(%;%?%p9%t\EH + \002%e\EH\003%;, + sgr0=\E(\EH\003, smacs=\EH^B, smir=\Eq, smln=\EA10, + smso=\E`6\E), tbc=\E0, kF1=^A`\r, kF10=^Ai\r, kF11=^Aj\r, + kF12=^Ak\r, kF13=^Al\r, kF14=^Am\r, kF15=^An\r, kF16=^Ao\r, + kF2=^Aa\r, kF3=^Ab\r, kF4=^Ac\r, kF5=^Ad\r, kF6=^Ae\r, + kF7=^Af\r, kF8=^Ag\r, kF9=^Ah\r, use=wyse+sl, +wyse+sl|status line for Wyse terminals, + hs, + wsl#45, + dsl=\EF\r, fsl=\r, tsl=\EF, +# +# This terminal description uses the non-hidden attribute mode +# (with magic cookie). +# +# The mandatory pause used by flash does not work with some +# older versions of terminfo. If you see this effect then +# unset and delete the / from the delay. +# i.e. change $<100/> to $<100> +# (wy50-mc: added to suppress tic warning --esr) +wy50-mc|wyse50-mc|Wyse 50 with magic cookies, + msgr@, + ma@, xmc#1, + blink=\EG2, dim=\EGp, prot=\EG0\E), rev=\EG4, + rmacs=\EG0\EH\003, rmcup=\EG0, rmso=\EG0, + sgr=\EG%{48}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{4}%|%;%? + %p4%t%{2}%|%;%?%p1%p5%|%t%{64}%|%;%?%p7%t%{1}%|%;%c%?%p8 + %t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;, + sgr0=\EG0\E(\EH\003, smacs=\EG0\EH\002, smcup=, + smso=\EGt, use=wy50, use=adm+sgr, +wy50-vb|wyse50-vb|Wyse 50 visible bell, + bel@, use=wy50, +wy50-w|wyse50-w|Wyse 50 132-column, + cols#132, lw#7, nlab#16, wsl#97, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<2>, is1=\E`;\E`9$<30>, + use=wy50, +wy50-wvb|wyse50-wvb|Wyse 50 132-column visible bell, + bel@, use=wy50-w, + +# +# The Wyse 350 is a Wyse 50 with color. +# Unfortunately this means that it has magic cookies. +# The color attributes are designed to overlap the reverse, dim and +# underline attributes. This is nice for monochrome applications +# because you can make underline stuff green (or any other color) +# but for true color applications it's not so hot because you cannot +# mix color with reverse, dim or underline. +# To further complicate things one of the attributes must be +# black (either the foreground or the background). In reverse video +# the background changes color with black letters. In normal video +# the foreground changes colors on a black background. +# This terminfo uses some of the more advanced features of curses +# to display both color and blink. In the final analysis I am not +# sure that the wy350 runs better with this terminfo than it does +# with the wy50 terminfo (with user adjusted colors). +# +# The mandatory pause used by flash does not work with +# older versions of terminfo. If you see this effect then +# unset xon and delete the / from the delay. +# i.e. change $<100/> to $<100> +# +# Bug: The capability resets attributes. +wy350|wyse350|Wyse 350, + am, bw, mc5i, mir, xon, + colors#8, cols#80, lh#1, lines#24, lw#8, ncv#55, nlab#8, pairs#8, + xmc#1, + acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2, + cbt=\EI, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r, + cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<1>, + dim=\EGp, dl1=\ER, ed=\EY$<20>, el=\ET, + flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1, il1=\EE, + ind=\n$<2>, ip=$<1>, is1=\E`:\E`9$<30>, + is2=\016\024\E'\E(, is3=\E%?, kHOM=\E{, kbs=^H, kcbt=\EI, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, + ked=\EY, kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, + kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, + kf16=^AO\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, + kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, + kich1=\EQ, kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, + ll=^^^K, mc0=\EP, mc4=^T, mc5=^X, nel=\r\n, oc=\E%?, op=\EG0, + pfx=\Ez%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\EG0\E), ri=\Ej, + rmacs=\EG0\EH\003, rmir=\Er, rmln=\EA11, setb=, + setf=%?%p1%{0}%=%t%{76}%e%p1%{1}%=%t%{64}%e%p1%{2}%=%t%{8}%e + %p1%{3}%=%t%{72}%e%p1%{4}%=%t%{4}%e%p1%{5}%=%t%{68}%e + %p1%{6}%=%t%{12}%e%p1%{7}%=%t%{0}%;%PC\EG%gC%gA%+%{48} + %+%c, + sgr=%{0}%?%p4%t%{2}%|%;%?%p7%t%{1}%|%;%PA\EG%?%gC%t%gC%e%{0} + %?%p1%t%{4}%|%;%?%p2%t%{8}%|%;%?%p3%t%{4}%|%;%?%p5%t + %{64}%|%;%;%gA%+%{48}%+%c%?%p8%t\E)%e\E(%;%?%p9%t\EH + \002%e\EH\003%;, + sgr0=\EG0\E(\EH\003%{0}%PA%{0}%PC, smacs=\EG0\EH\002, + smir=\Eq, smln=\EA10, tbc=\E0, use=adm+sgr, use=wyse+sl, +wy350-vb|wyse350-vb|Wyse 350 visible bell, + bel@, use=wy350, +wy350-w|wyse350-w|Wyse 350 132-column, + cols#132, lw#7, nlab#16, wsl#97, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<2>, is1=\E`;\E`9$<30>, + use=wy350, +wy350-wvb|wyse350-wvb|Wyse 350 132-column visible bell, + bel@, use=wy350-w, +# +# This terminfo description is untested. +# The wyse100 emulates an adm31, so the adm31 entry should work. +# +wy100|Wyse 100, + hs, mir, + cols#80, lines#24, xmc#1, + bel=^G, clear=\E;, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, dsl=\EA31, ed=\EY, el=\ET, fsl=\r, il1=\EE, ind=\n, + invis@, is2=\Eu\E0, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, + kcuu1=^K, kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, + kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, khome=\E{, + rmir=\Er, smir=\Eq, tsl=\EF, use=adm+sgr, +# +# The Wyse 120/150 has most of the features of the Wyse 60. +# This terminal does not need padding up to 9600 baud! +# should be set but the clear screen fails when in +# alt-charset mode. Try \EcE\s\s\E+\s if the screen is really clear +# then set . +# +wy120|wyse120|wy150|wyse150|Wyse 120/150, + am, bw, km, mc5i, mir, msgr, xon, + cols#80, it#8, lh#1, lines#24, lw#8, nlab#8, pb#9601, + acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~, + bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>, + cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>, + dim=\EGp, dl1=\ER$<3>, ed=\EY$<50>, el=\ET$<4>, + flash=\E`8$<100/>\E`9, home=^^, ht=\011$<1>, hts=\E1, + il1=\EE$<3>, ind=\n$<3>, ip=$<2>, is1=\EcB0\EcC1, + is2=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016 + \024\El, + is3=\EwJ\Ew1$<150>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, + kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, + kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K, + mc0=\EP, mc4=^T, mc5=\Ed#, nel=\r\n$<3>, + pfloc=\EZ2%p1%{63}%+%c%p2%s\177, + pfx=\EZ1%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<2>, + rmacs=\EcD, rmam=\Ed., rmcup=\Ew1, rmir=\Er, rmln=\EA11, + rmxon=\Ec20, rs1=\E~!\E~4$<30>, rs2=\EeF\E`:$<70>, + rs3=\EwG\Ee($<100>, + sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8} + %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t + %{64}%|%;%?%p7%t%{1}%|%;%c, + sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/, + smcup=\Ew0, smir=\Eq, smln=\EA10, smso=\EGt, smxon=\Ec21, + tbc=\E0, use=adm+sgr, use=wyse+sl, +# +wy120-w|wyse120-w|wy150-w|wyse150-w|Wyse 120/150 132-column, + cols#132, lw#7, nlab#16, wsl#97, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<12>, ip=$<4>, + rs2=\E`;$<70>, use=wy120, +# +wy120-25|wyse120-25|wy150-25|wyse150-25|Wyse 120/150 80-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy120, +# +wy120-25-w|wyse120-25-w|wy150-25-w|wyse150-25-w|Wyse 120/150 132-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy120-w, +# +wy120-vb|wyse120-vb|wy150-vb|wyse150-vb|Wyse 120/150 visible bell, + bel@, use=wy120, +# +wy120-w-vb|wy120-wvb|wyse120-wvb|wy150-w-vb|wyse150-w-vb|Wyse 120/150 132-column visible bell, + bel@, use=wy120-w, +# +# The Wyse 60 is like the Wyse 50 but with more padding. +# The reset strings are slow and the pad times very depending +# on other parameters such as font loading. I have tried +# to follow the following outline: +# +# -> set personality +# -> set number of columns +# -> set number of lines +# -> select the proper font +# -> do the initialization +# -> set up display memory (2 pages) +# +# The Wyse 60's that have VT100 emulation are slower than the +# older Wyse 60's. This change happened mid-1987. +# The capabilities effected are +# +# The meta key is only half right. This terminal will return the +# high order bit set when you hit CTRL-function_key +# +# It may be useful to assign two function keys with the +# values \E=(\s look at old data in page 1 +# \E=W, look at bottom of page 1 +# where \s is a space ( ). +# +# Note: +# The Wyse 60 runs faster when the XON/XOFF +# handshake is turned off. +# +# (wy60: we use \E{ rather than ^^ for home (both are documented) to avoid +# a bug reported by Robert Dunn, -- esr) +wy60|wyse60|Wyse 60, + am, bw, km, mc5i, mir, msgr, + cols#80, lh#1, lines#24, lw#8, nlab#8, + acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~, + bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<100>, + cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW$<11>, dclk=\E`b, dim=\EGp, dl1=\ER$<5>, + ed=\EY$<100>, el=\ET, flash=\E`8$<100/>\E`9, home=\E{, + ht=\011$<1>, hts=\E1, il1=\EE$<4>, ind=\n$<5>, ip=$<3>, + is1=\EcB0\EcC1, + is2=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016 + \024\El, + is3=\EwJ\Ew1$<150>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, + kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, + kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=\E{^K, + mc0=\EP, mc4=^T, mc5=\Ed#, nel=\r\n$<3>, + pfloc=\EZ2%p1%{63}%+%c%p2%s\177, + pfx=\EZ1%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<7>, + rmacs=\EcD, rmam=\Ed., rmclk=\E`c, rmcup=\Ew1, rmir=\Er, + rmln=\EA11, rmxon=\Ec20, rs1=\E~!\E~4$<150>, + rs2=\EeG$<150>, rs3=\EwG\Ee($<200>, + sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8} + %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t + %{64}%|%;%?%p7%t%{1}%|%;%c, + sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/, + smcup=\Ew0, smir=\Eq, smln=\EA10, smso=\EGt, smxon=\Ec21, + tbc=\E0, kF1=^A`\r, kF10=^Ai\r, kF11=^Aj\r, kF12=^Ak\r, + kF13=^Al\r, kF14=^Am\r, kF15=^An\r, kF16=^Ao\r, kF2=^Aa\r, + kF3=^Ab\r, kF4=^Ac\r, kF5=^Ad\r, kF6=^Ae\r, kF7=^Af\r, + kF8=^Ag\r, kF9=^Ah\r, use=adm+sgr, use=wyse+sl, +# +wy60-w|wyse60-w|Wyse 60 132-column, + cols#132, lw#7, nlab#16, wsl#97, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<16>, ip=$<5>, + rs2=\EeF$<150>\E`;$<150>, use=wy60, +# +wy60-25|wyse60-25|Wyse 60 80-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<200>, use=wy60, +wy60-25-w|wyse60-25-w|Wyse 60 132-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<200>, use=wy60-w, +# +wy60-42|wyse60-42|Wyse 60 80-column 42-lines, + lines#42, + clear=\E+$<260>, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<2>, + dch1=\EW$<16>, dl1=\ER$<11>, ed=\Ey$<260>, il1=\EE$<11>, + ind=\n$<9>, ip=$<5>, is1=\EcB2\EcC3, nel=\r\n$<6>, + ri=\Ej$<10>, rs3=\Ee*$<150>, use=wy60, +wy60-42-w|wyse60-42-w|Wyse 60 132-column 42-lines, + cols#132, lw#7, nlab#16, wsl#97, + cup=\Ea%i%p1%dR%p2%dC$<2>, dch1=\EW$<19>, + home=\036$<2>, ip=$<6>, nel=\r\n$<11>, + rs2=\EeF$<150>\E`;$<150>, use=wy60-42, +# +wy60-43|wyse60-43|Wyse 60 80-column 43-lines, + lh@, lines#43, lw@, nlab@, + pln@, rs3=\Ee+$<150>, use=wy60-42, +wy60-43-w|wyse60-43-w|Wyse 60 132-column 43-lines, + lh@, lines#43, lw@, nlab@, + pln@, rs3=\Ee+$<150>, use=wy60-42-w, +# +wy60-vb|wyse60-vb|Wyse 60 visible bell, + bel@, use=wy60, +wy60-w-vb|wy60-wvb|wyse60-wvb|Wyse 60 132-column visible bell, + bel@, use=wy60-w, + +# The Wyse-99GT looks at lot like the Wyse 60 except that it +# does not have the 42/43 line mode. In the Wyse-60 the "lines" +# setup parameter controls the number of lines on the screen. +# For the Wyse 99GT the "lines" setup parameter controls the +# number of lines in a page. The screen can display 25 lines max. +# The Wyse-99GT also has personalities for the VT220 and +# Tektronix 4014. But this has no bearing on the native mode. +# +# (msgr) should be set but the clear screen fails when in +# alt-charset mode. Try \EcE\s\s\E+\s if the screen is really clear +# then set msgr, else use msgr@. +# +# u0 -> enter Tektronix mode +# u1 -> exit Tektronix mode +# +wy99gt|wyse99gt|Wyse 99gt, + msgr@, + clear=\E+$<130>, dch1=\EW$<7>, dl1=\ER$<4>, ed=\Ey$<130>, + el=\Et$<5>, ind=\n$<4>, ip=$<2>, is3=\Ew0$<20>, nel@, + ri=\Ej$<3>, rmcup=\Ew0, rs2=\E`:$<150>, smcup=\Ew1, + u0=\E~>\E8, u1=\E[42h, use=wy60, +# +wy99gt-w|wyse99gt-w|Wyse 99gt 132-column, + cols#132, lw#7, nlab#16, wsl#97, + clear=\E+$<160>, cup=\Ea%i%p1%dR%p2%dC$<2>, + dch1=\EW$<9>, ed=\Ey$<160>, ip=$<4>, rs2=\E`;$<150>, + use=wy99gt, +# +wy99gt-25|wyse99gt-25|Wyse 99gt 80-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<200>, use=wy99gt, +# +wy99gt-25-w|wyse99gt-25-w|Wyse 99gt 132-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs2=\E`;$<150>, use=wy99gt-w, +# +wy99gt-vb|wyse99gt-vb|Wyse 99gt visible bell, + bel@, use=wy99gt, +# +wy99gt-w-vb|wy99gt-wvb|wyse99gt-wvb|Wyse 99gt 132-column visible bell, + bel@, use=wy99gt-w, + +# Can't set tabs! Other bugs (ANSI mode only): +# - can't redefine function keys (anyway, key redefinition in ANSI mode +# is too much complex to be described); +# - meta key can't be described (the terminal forgets it when reset); +# The xon-xoff handshaking can't be disabled while in ANSI personality, so +# emacs can't work at speed greater than 9600 baud. No padding is needed at +# this speed. +# dch1 has been commented out because it causes annoying glittering when +# vi deletes one character at the beginning of a line with tabs in it. +# dch makes sysgen(1M) have a horrible behaviour when deleting +# a screen and makes screen(1) behave badly, so it is disabled too. The nice +# thing is that vi goes crazy if smir-rmir are present and both dch-dch1 are +# not, so smir and rmir are commented out as well. +# From: Francesco Potorti` , 24 Aug 1998 +wy99-ansi|Wyse WY-99GT in ANSI mode (int'l PC keyboard), + am, km, mir, msgr, xenl, + cols#80, it#8, lines#25, vt#3, + acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~, + bel=^G, cbt=\E[Z, civis=\E[?25l, clear=\E[H\E[J$<200>, + cnorm=\E[34h\E[?25h, cr=\r, cub=\E[%p1%dD$<1>, + cub1=\010$<1>, cud=\E[%p1%dB, cud1=\ED, + cuf=\E[%p1%dC$<1>, cuf1=\E[C$<1>, + cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM, + cvvis=\E[34l\E[?25h, dim=\E[2m, ech=\E[%p1%dX, + ed=\E[J$<8*>, el=\E[K$<1>, el1=\E[1K$<1>, enacs=\E)0, + flash=\E[?5h$<30/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ht=^I, ich=\E[%p1%d@, ind=\n$<1>, + is2=\E7\E[1r\E8\E[2;3;4;13;20;34;39;36l\E[12;16;34h\E[?1;3;4 + ;5;10;18l\E[?7;8;25h\E>\E[?5W\E(B\017\E[4i, + kbs=^H, kcbt=\E[z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, + kcuu1=\EOA, kf1=\EOP, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf17=\E[K, kf18=\E[31~, kf19=\E[32~, kf2=\EOQ, + kf20=\E[33~, kf21=\E[34~, kf22=\E[35~, kf23=\E[1~, + kf24=\E[2~, kf3=\EOR, kf4=\EOS, kf5=\E[M, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, ll=\E[24E, mc0=\E[?19h, + nel=\EE, prot=\E[1"q, ri=\EM, rmacs=^O, rmam=\E[?7l, + rmir=\E[4l, rmkx=\E[?1l, rmso=\E[27m, rmul=\E[24m, + rs2=\E[61"p\E[40h\E[?6l\E[1r\E[2;3;4;13;20;34;39;36l\E[12;16 + ;34h\E[?1;3;4;5;10;18l\E[?7;8;25h\E>\E[?5W\E(B\017\E[24E + \E[4i, + sgr=\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%O%t;7%;%?%p4%t;5%;%? + %p5%t;2%;%?%p7%t;8%;m\E[%?%p8%t1%;"q%?%p9%t\016%e\017%;, + sgr0=\E[m\017\E["q, smacs=^N, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h, vpa=\E[%i%p1%dd, use=ansi+csr, use=ansi+idl, + use=ansi+pp, use=ansi+sgrbold, + +# This is the american terminal. Here tabs work fine. +# From: Francesco Potorti` , 24 Aug 1998 +wy99a-ansi|Wyse WY-99GT in ANSI mode (US PC keyboard), + hts=\EH, is3=\E[?5l, rs3=\E[?5l, tbc=\E[3g, use=wy99-ansi, + +# This terminal (firmware version 02) has a lot of bugs: +# - can't set tabs; +# - other bugs in ANSI modes (see above). +# This description disables handshaking when using cup. This is because +# GNU emacs doesn't like Xon-Xoff handshaking. This means the terminal +# cannot be used at speeds greater than 9600 baud, because at greater +# speeds handshaking is needed even for character sending. If you use +# DTR handshaking, you can use even greater speeds. +# From: Francesco Potorti` , 24 Aug 1998 +wy99f|wy99fgt|wy-99fgt|Wyse WY-99GT (int'l PC keyboard), + am, bw, km, mc5i, mir, msgr, xon, + cols#80, it#8, lines#25, + acsc='x+y.w_vi~j(k'l&m%n)o9q*s8t-u.v\,w+x=, bel=^G, + blink=\EG2, cbt=\EI, civis=\E`0, clear=\E'\E(\032, + cnorm=\E`4\E`1, cr=\r, cub1=^H, cud1=\Ej, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + cvvis=\E`2\E`1, dch1=\EW, dim=\EGp, dl1=\ER, ed=\EY$<8*>, + el=\ET$<8>, enacs=\Ec@1J$<2000>, + flash=\E\^1$<30/>\E\^0, home=^^, ht=^I, il1=\EE, ind=\n, + invis=\EG3, + is2=\Eu\Ee6\EC\EDF\Ec21\Ec31\Ec62\Ec72\Ee;\016\E'\EeL\E`9\E + \^0\E`1\E`4\Ee.\E`:\Ee1\EG0\E(\Ed/\Ee4\Ed*\EO\E`I\Er\Ee" + \EcD\024, + ka1=^^, ka3=\EJ, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kf1=^A@\r, kf10=^AI\r, + kf11=^AJ\r, kf12=^AK\r, kf13=^A`\r, kf14=^Aa\r, kf15=^Ab\r, + kf16=^Ac\r, kf17=^Ad\r, kf18=^Ae\r, kf19=^Af\r, kf2=^AA\r, + kf20=^Ag\r, kf21=^Ah\r, kf22=^Ai\r, kf23=^Aj\r, kf24=^Ak\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, kprt=\EP, mc0=\EP, mc4=^T, mc5=\Ed#, + nel=^_, prot=\E), rev=\EG4, ri=\Ej, rmacs=\EcD, rmam=\Ed., + rmcup=\Ec21\Ec31, rmir=\Er, rmso=\EG0, rmxon=\Ec20\Ec30, + rs2=\Eu\E~4\Ee6\EC\EDF\Ec21\Ec31\Ec62\Ec72\Ee;\016\E'\EeL\E` + 9\E\^0\E`1\E`4\Ee.\E`:\Ee)\Ew\EwG\Ew0\Ee1\EG0\E(\Ed/ + \Ee4\Ed*\EO\E`I\Er\Ee"\Ec@0B\EcD\024, + sgr=\E(\EG%{48}%?%p1%p3%O%t%{4}%+%;%?%p2%t%{8}%+%;%?%p4%t + %{2}%+%;%?%p5%t%{64}%+%;%?%p7%t%{1}%+%;%c%?%p8%t\E)%;%? + %p9%t\EcE%e\EcD%;, + sgr0=\E(\EG0, smacs=\EcE, smam=\Ed/, smcup=\Ec20\Ec30, + smir=\Eq, smso=\EG4, smxon=\Ec21\Ec31, use=wyse+sl, + +# This is the american terminal. Here tabs work. +# From: Francesco Potorti` , 24 Aug 1998 +wy99fa|wy99fgta|wy-99fgta|Wyse WY-99GT (US PC keyboard), + hts=\E1, tbc=\E0, use=wy99f, + +# +# The Wyse 160 is combination of the WY-60 and the WY-99gt. +# The reset strings are slow and the pad times very depending +# on other parameters such as font loading. I have tried +# to follow the following outline: +# +# -> set personality +# -> set number of columns +# -> set number of lines +# -> select the proper font +# -> do the initialization +# -> set up display memory (2 pages) +# +# The display memory may be used for either text or graphics. +# When "Display Memory = Shared" the terminal will have more pages +# but garbage may be left on the screen when you switch from +# graphics to text. If "Display Memory = Unshared" then the +# text area will be only one page long. +# +# (wy160: we use \E{ rather than ^^ for home (both are documented) to avoid +# a bug reported by Robert Dunn, -- esr) +wy160|wyse160|Wyse 160, + am, bw, km, mc5i, mir, msgr, + cols#80, lh#1, lines#24, lw#8, nlab#8, wsl#38, + acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~, + bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<30>, + cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<5>, + dclk=\E`b, dim=\EGp, dl1=\ER$<1>, ed=\EY$<30>, el=\ET$<5>, + flash=\E`8$<100/>\E`9, home=\E{, ht=^I, hts=\E1, + il1=\EE$<1>, ind=\n$<1>, ip=$<2>, is1=\EcB0\EcC1, + is2=\Ed$\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016 + \024\El, + is3=\Ew0$<100>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, + kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, + kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=\E{^K, + mc0=\EP, mc4=^T, mc5=\Ed#, nel=\r\n$<1>, + pfloc=\EZ2%p1%{63}%+%c%p2%s\177, + pfx=\EZ1%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<1>, + rmacs=\EcD, rmam=\Ed., rmclk=\E`c, rmcup=\Ew0, rmir=\Er, + rmln=\EA11, rmxon=\Ec20, rs1=\E~!\E~4$<70>, + rs2=\E`:$<100>, rs3=\EwG\Ee($<140>, + sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8} + %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t + %{64}%|%;%?%p7%t%{1}%|%;%c, + sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/, + smcup=\Ew1, smir=\Eq, smln=\EA10, smso=\EGt, smxon=\Ec21, + tbc=\E0, use=adm+sgr, use=wyse+sl, +# +wy160-w|wyse160-w|Wyse 160 132-column, + cols#132, lw#7, nlab#16, wsl#90, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<9>, + rs2=\EeF$<150>\E`;$<150>, use=wy160, +# +wy160-25|wyse160-25|Wyse 160 80-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<200>, use=wy160, +wy160-25-w|wyse160-25-w|Wyse 160 132-column 25-lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<200>, use=wy160-w, +# +wy160-42|wyse160-42|Wyse 160 80-column 42-lines, + lines#42, + clear=\E+$<50>, dl1=\ER$<2>, ed=\Ey$<50>, il1=\EE$<2>, + ind=\n$<2>, is1=\EcB2\EcC3, nel=\r\n$<2>, ri=\Ej$<2>, + rs3=\Ee*$<150>, use=wy160, +wy160-42-w|wyse160-42-w|Wyse 160 132-column 42-lines, + cols#132, lw#7, nlab#16, wsl#90, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<8>, ip=$<3>, + rs2=\EeF$<150>\E`;$<150>, use=wy160-42, +# +wy160-43|wyse160-43|Wyse 160 80-column 43-lines, + lh@, lines#43, lw@, nlab@, + pln@, rs3=\Ee+$<150>, use=wy160-42, +wy160-43-w|wyse160-43-w|Wyse 160 132-column 43-lines, + lh@, lines#43, lw@, nlab@, + pln@, rs3=\Ee+$<150>, use=wy160-42-w, +# +wy160-vb|wyse160-vb|Wyse 160 visible bell, + bel@, use=wy160, +wy160-w-vb|wy160-wvb|wyse160-wvb|Wyse 160 132-column visible bell, + bel@, use=wy160-w, +# +# The Wyse 75 is a VT100 lookalike without advanced video. +# +# The Wyse 75 can support one attribute (e.g. Dim, Inverse, +# Underline) without magic cookies. The following description +# uses this capability, but when more than one attribute is +# put on the screen at once, all attributes will be changed +# to be the same as the last attribute given. +# The Wyse 75 can support more attributes when used with magic +# cookies. The wy75-mc terminal description uses magic cookies +# to correctly handle multiple attributes on a screen. +# +wy75|wyse75|Wyse 75, + am, hs, mir, msgr, xenl, xon, + cols#80, lines#24, ma#1, pb#1201, wsl#78, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, clear=\E[H\E[J$<30>, cr=\r, + csr=\E[%i%p1%d;%p2%dr$<2>, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP$<3*>, + dch1=\E[P$<3>, dim=\E[0t\E[2m, dl=\E[%p1%dM$<1*>, + dl1=\E[M, dsl=\E[>\,\001\001\E[>-\001\001, + ech=\E[%p1%dX, ed=\E[J$<30>, el=\E[K$<3>, el1=\E[1K$<3>, + enacs=\E)0, flash=\E[30h\E\,$<250/>\E[30l, fsl=^A, + home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@$<1*>, + il=\E[%p1%dL$<2*>, il1=\E[L$<2>, ind=\n$<2>, ip=$<1>, + is1=\E[2;4;20;30l\E[?1;10l\E[12h\E[?7;8;25h, + is2=\E>\E(B\E)0\017, is3=\E[m, kdl1=\E[M, kel=\E[K, + kf1=\E[?5i, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf2=\E[?3i, + kf20=\E[34~, kf21=\E[35~, kf3=\E[2i, kf4=\E[@, kf5=\E[M, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~, + khlp=\E[28~, kich1=\E[@, kil1=\E[L, knp=\E[6~, kpp=\E[5~, + kprt=\E[?5i, kslt=\E[4~, mc0=\E[0i, rc=\E8, rev=\E[1t\E[7m, + ri=\EM$<2>, rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, + rmso=\E[m, rmul=\E[m, rs1=\E[13l\E[3l\E!p, + rs2=\E[35h\E[?3l$<80>, rs3=\E[?5l, sc=\E7, + sgr=%?%p5%t\E[0t%;%?%p3%p1%|%t\E[1t%;%?%p2%t\E[2t%;%?%p4%t + \E[3t%;%?%p1%p2%p3%p4%p5%|%|%|%|%t\E[7m%e\E[m%;%?%p9%t + \016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1l\E[?7h\E=, smso=\E[1t\E[7m, smul=\E[2t\E[4m, + tsl=\E[>\,\001, use=ansi+arrows, use=ansi+local, + use=ansi+pp, use=ansi+tabs, use=decid+cpr, + use=vt220+cvis, use=vt220+keypad, +# +# This terminal description uses the non-hidden attribute mode +# (with magic cookie). +# +wy75-mc|wyse75-mc|Wyse 75 with magic cookies, + msgr@, + ma@, xmc#1, + blink=\E[2p, dim=\E[1p, invis=\E[4p, is3=\E[m\E[p, + rev=\E[16p, rmacs=\E[0p\017, rmso=\E[0p, rmul=\E[0p, + sgr=\E[%{0}%?%p2%p6%|%t%{8}%|%;%?%p1%p3%|%p6%|%t%{16}%|%;%? + %p4%t%{2}%|%;%?%p1%p5%|%t%{1}%|%;%?%p7%t%{4}%|%;%dp%?%p9 + %t\016%e\017%;, + sgr0=\E[0p\017, smacs=\E[0p\016, smso=\E[17p, smul=\E[8p, + use=wy75, +wy75-vb|wyse75-vb|Wyse 75 with visible bell, + pb@, + bel@, use=wy75, +wy75-w|wyse75-w|Wyse 75 in 132 column mode, + cols#132, wsl#130, + rs2=\E[35h\E[?3h$<80>, use=wy75, +wy75-wvb|wyse75-wvb|Wyse 75 with visible bell 132 columns, + pb@, + bel@, use=wy75-w, +# +# Wyse 85 emulating a VT220 7 bit mode. +# 24 line screen with status line. +# +# The VT220 mode permits more function keys but it wipes out +# the escape key. I strongly recommend that be set to +# escape (esc). +# The terminal may have to be set for 8 data bits and 2 stop +# bits for the arrow keys to work. +# The Wyse 85 runs faster with XON/XOFF enabled. Also the +# and work best when XON/XOFF is set. and +# leave trash on the screen when used without XON/XOFF. +# +wy85|wyse85|Wyse 85, + hs, mir, xenl, xon, + wsl#80, + clear=\E[H\E[J$<110>, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH$<1>, dch=\E[%p1%dP$<3*>, + dch1=\E[P$<3>, dim=\E[2m, dl=\E[%p1%dM$<3*>, + dl1=\E[M$<3>, dsl=\E[40l, ech=\E[%p1%dX, ed=\E[J$<110>, + el=\E[K$<1>, el1=\E[1K, enacs=\E)0, + flash=\E[30h\E\,$<300/>\E[30l, fsl=\E[1;24r\E8, + ht=\011$<1>, ich=\E[%p1%d@$<4*>, il=\E[%p1%dL$<5*>, + il1=\E[L$<5>, ind=\n$<3>, ip=$<3>, is1=\E[62;1"p\E[?5W, + is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h$<16>, + is3=\E>\E(B\E)0\017\E[m, kf10=\E[21~, kf11=\E[23~, + kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, + kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, + kf20=\E[34~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, + kf9=\E[20~, khlp=\E[28~, khome=\E[26~, lf1=PF1, lf2=PF2, + lf3=PF3, lf4=PF4, mc0=\E[0i, ri=\EM$<3>, rmam=\E[?7l, + rmir=\E[4l, rmkx=\E>, rs1=\E[13l\E[3l\E!p, + rs2=\E[35h\E[?3l$<70>, rs3=\E[?5l, + sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? + %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smir=\E[4h, smkx=\E[?1l\E=, + tsl=\E[40h\E7\E[25;%i%p1%dH, use=ansi+arrows, + use=ansi+csr, use=ansi+inittabs, use=ansi+local, + use=ansi+pp, use=ansi+sgrbold, use=decid+cpr, + use=vt100+4bsd, use=vt220+vtedit, use=vt220+cvis, + use=vt220+keypad, +# +# Wyse 85 with visual bell. +wy85-vb|wyse85-vb|Wyse 85 with visible bell, + bel@, flash=\E[30h\E\,$<300/>\E[30l, use=wy85, +# +# Wyse 85 in 132-column mode. +wy85-w|wyse85-w|Wyse 85 in 132-column mode, + cols#132, wsl#132, + rs2=\E[35h$<70/>\E[?3h, use=wy85, +# +# Wyse 85 in 132-column mode with visual bell. +wy85-wvb|wyse85-wvb|Wyse 85 with visible bell 132-columns, + bel@, use=wy85-w, + +# From: Kevin Turner , 12 Jul 1998 +# This copes with an apparent firmware bug in the wy85. He writes: +# "What I did was change leave the terminal cursor keys set to Normal +# (instead of application), and change \E[ to \233 for all the keys in +# terminfo. At one point, I found some reference indicating that this +# terminal bug (not sending \E[) was acknowledged by Wyse (so it's not just +# me), but I can't find that and the server under my bookmark to "Wyse +# Technical" isn't responding. So there's the question of whether the wy85 +# terminfo should reflect the manufacturer's intended behaviour of the terminal +# or the actual." +wy85-8bit|wyse85-8bit|Wyse 85 in 8-bit mode, + hs, mir, xenl, xon, + wsl#80, + clear=\E[H\E[J$<110>, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH$<1>, dch=\E[%p1%dP$<3*>, + dch1=\E[P$<3>, dim=\E[2m, dl=\E[%p1%dM$<3*>, + dl1=\E[M$<3>, dsl=\E[40l, ech=\E[%p1%dX, ed=\E[J$<110>, + el=\E[K$<1>, el1=\E[1K, enacs=\E)0, + flash=\E[30h\E\,$<300/>\E[30l, fsl=\E[1;24r\E8, + ht=\011$<1>, ich=\E[%p1%d@$<4*>, il=\E[%p1%dL$<5*>, + il1=\E[L$<5>, ind=\n$<3>, ip=$<3>, is1=\E[62;1"p\E[?5W, + is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h$<16>, + is3=\E>\E(B\E)0\017\E[m, ka1=\EOw, ka3=\EOy, kb2=\EOu, + kc1=\EOq, kc3=\EOs, kcub1=\233D, kcud1=\233B, kcuf1=\233C, + kcuu1=\233A, kdch1=\2333~, kf10=\23321~, kf11=\23323~, + kf12=\23324~, kf13=\23325~, kf14=\23326~, kf15=\23328~, + kf16=\23329~, kf17=\23331~, kf18=\23332~, kf19=\23333~, + kf20=\23334~, kf6=\23317~, kf7=\23318~, kf8=\23319~, + kf9=\23320~, kfnd=\2331~, khlp=\23328~, khome=\23326~, + kich1=\2332~, knp=\2336~, kpp=\2335~, kslt=\2334~, lf1=PF1, + lf2=PF2, lf3=PF3, lf4=PF4, mc0=\E[0i, ri=\EM$<3>, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rs1=\E[13l\E[3l\E!p, + rs2=\E[35h\E[?3l$<70>, rs3=\E[?5l, + sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? + %p6%t;1%;%?%p7%t;8%;+m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smir=\E[4h, smkx=\E[?1l\E=, + tsl=\E[40h\E7\E[25;%i%p1%dH, use=ansi+csr, + use=ansi+inittabs, use=ansi+local, use=ansi+pp, + use=ansi+sgrbold, use=decid+cpr, use=vt100+4bsd, + use=vt100+pfkeys, use=vt220+cvis, +# +# Wyse 185 emulating a VT320 7 bit mode. +# +# This terminal always displays 25 lines. These lines may be used +# as 24 data lines and a terminal status line (top or bottom) or +# 25 data lines. The 48 and 50 line modes change the page size +# and not the number of lines on the screen. +# +# The Compose Character key can be used as a meta key if changed +# by set-up. +# +wy185|wyse185|Wyse 185, + hs, km, mir, xenl, xon, + wsl#80, + civis=\E[?25l, clear=\E[H\E[J$<40>, + cnorm=\E[34h\E[?25h, csr=\E[%i%p1%d;%p2%dr$<20>, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E[?25h\E[34l, dch=\E[%p1%dP$<3>, dch1=\E[P$<3>, + dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>, + dsl=\E7\E[99;0H\E[K\E8, ech=\E[%p1%dX, ed=\E[J$<40>, + el=\E[K, el1=\E[1K, enacs=\E)0, + flash=\E[30h\E\,$<100/>\E[30l, fsl=\E[1;24r\E8, + hpa=\E[%i%p1%d`, ich=\E[%p1%d@$<2>, il=\E[%p1%dL$<3*>, + il1=\E[L$<3>, ind=\n$<2>, ip=$<4>, is1=\E[?5W, + is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25h, + is3=\E>\E(B\E)0\017\E[m, kcbt=\E[Z, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf20=\E[34~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, khome=\E[26~, lf1=PF1, + lf2=PF2, lf3=PF3, lf4=PF4, mc0=\E[0i, rc=\E8, ri=\EM$<2>, + rmam=\E[?7l, rmcup=\E[ R, rmir=\E[4l, rmkx=\E>, + rmso=\E[27m, rmul=\E[24m, + rs1=\E[13l\E[3l\E\\\E[63;1"p\E[!p, rs2=\E[35h\E[?3l, + rs3=\E[?5l\E[47h\E[40l\E[r, sc=\E7, + sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? + %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smcup=\E[ Q, smir=\E[4h, + smkx=\E[?1l\E=, tsl=\E7\E[99;%i%p1%dH, vpa=\E[%i%p1%dd, + use=ansi+arrows, use=ansi+inittabs, use=ansi+local, + use=ansi+pp, use=ansi+sgrbold, use=decid+cpr, + use=vt100+4bsd, use=vt220+vtedit, use=vt220+keypad, +# +# Wyse 185 with 24 data lines and top status (terminal status) +wy185-24|wyse185-24|Wyse 185 with 24 data lines, + hs@, + dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@, + use=wy185, +# +# Wyse 185 with visual bell. +wy185-vb|wyse185-vb|Wyse 185+flash, + bel@, use=wy185, +# +# Wyse 185 in 132-column mode. +wy185-w|wyse185-w|Wyse 185 in 132-column mode, + cols#132, wsl#132, + dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>, + ip=$<7>, rs2=\E[35h\E[?3h, use=wy185, +# +# Wyse 185 in 132-column mode with visual bell. +wy185-wvb|wyse185-wvb|Wyse 185+flash+132 cols, + bel@, use=wy185-w, + +# wy325 terminfo entries +# Done by Joe H. Davis 3-9-92 + +# lines 25 columns 80 +# +wy325|wyse325|Wyse epc, + am, bw, mc5i, mir, + cols#80, lh#1, lines#24, lw#8, nlab#8, pb#9601, + acsc=+/\,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~, + bel=^G, blink=\EG2, cbt=\EI, civis=\E`0, clear=\E+$<50>, + cnorm=\E`1, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW$<7>, + dim=\EGp, dl1=\ER$<3>, ed=\EY$<50>, el=\ET$<4>, + flash=\E`8$<100/>\E`9, home=^^, ht=^I, hts=\E1, + il1=\EE$<3>, ind=\n$<3>, ip=$<2>, is1=\EcB0\EcC1, + is2=\EcD\E'\Er\EH\003\Ed/\EO\Ee1\Ed*\E`@\E`9\E`1\016\024 + \El, + is3=\Ew0$<16>, kHOM=\E{, kbs=^H, kcbt=\EI, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, + kel=\ET, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, + kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, ll=^^^K, + mc0=\EP, mc4=^T, mc5=\Ed#, + pfloc=\EZ2%p1%{63}%+%c%p2%s\177, + pfx=\EZ1%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<2>, + rmacs=\EcD, rmam=\Ed., rmcup=\Ew0, rmir=\Er, rmln=\EA11, + rs1=\E~!\E~4$<30>, rs2=\EeF\E`:$<70>, + rs3=\EwG\Ee($<100>, + sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EcE%e\EcD%;\EG%{48}%?%p2%t%{8} + %|%;%?%p1%p3%|%p6%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%|%t + %{64}%|%;%?%p7%t%{1}%|%;%c, + sgr0=\E(\EH\003\EG0\EcD, smacs=\EcE, smam=\Ed/, + smcup=\Ew1, smir=\Eq, smln=\EA10, smso=\EGt, tbc=\E0, + use=adm+sgr, use=wyse+sl, + +# +# lines 24 columns 80 vb +# +wy325-vb|wyse325-vb|Wyse-325 with visual bell, + bel@, use=wy325, + +# +# lines 24 columns 132 +# +wy325-w|wyse325-w|wy325w-24|Wyse-325 in wide mode, + cols#132, lw#7, nlab#16, wsl#97, + cup=\Ea%i%p1%dR%p2%dC, dch1=\EW$<12>, ip=$<4>, + rs2=\E`;$<70>, use=wy325, +# +# lines 25 columns 80 +# +wy325-25|wyse325-25|wy325-80|wyse-325|Wyse-325 25 lines, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy325, +# +# lines 25 columns 132 +# +wy325-25w|wyse325-25w|Wyse-325 132 columns, + lh@, lines#25, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy325-w, +# +# lines 25 columns 132 vb +# +wy325-w-vb|wy325-wvb|wyse325-wvb|Wyse-325 wide mode reverse video, + bel@, use=wy325-w, + +# +# lines 42 columns 80 +# +wy325-42|wyse325-42|Wyse-325 42 lines, + lh@, lines#42, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy325, +# +# lines 42 columns 132 +# +wy325-42w|wyse325-42w|Wyse-325 42 lines wide mode, + lh@, lines#42, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy325-w, +# +# lines 42 columns 132 vb +# +wy325-42w-vb|wy325-42wvb|Wyse-325 42 lines wide mode visual bell, + bel@, use=wy325-w, +# +# lines 43 columns 80 +# +wy325-43|wyse325-43|Wyse-325 43 lines, + lh@, lines#43, lw@, nlab@, + pln@, use=wy325, +# +# lines 43 columns 132 +# +wy325-43w|wyse325-43w|Wyse-325 43 lines wide mode, + lh@, lines#43, lw@, nlab@, + pln@, rs3=\EwG\Ee)$<100>, use=wy325-w, +# +# lines 43 columns 132 vb +# +wy325-43w-vb|wy325-43wvb|Wyse-325 43 lines wide mode visual bell, + bel@, use=wy325-w, + +# Wyse 370 -- 24 line screen with status line. +# +# The terminal may have to be set for 8 data bits and 2 stop +# bits for the arrow keys to work. +# +# If you change keyboards the terminal will send different +# escape sequences. +# The following definition is for the basic terminal without +# function keys. +# +# -> enter Tektronix 4010/4014 mode +# -> exit Tektronix 4010/4014 mode +# -> enter ASCII mode (from any ANSI mode) +# -> exit ASCII mode (goto native ANSI mode) +# -> enter Tek 4207 ANSI mode (from any ANSI mode) +# -> exit Tek 4207 mode (goto native ANSI mode) +# +# Bug: The capability resets attributes. +wy370-nk|Wyse 370 without function keys, + am, ccc, hs, mir, msgr, xenl, xon, + colors#64, cols#80, lines#24, ncv#48, pairs#64, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, civis=\E[?25l, clear=\E[H\E[J$<40>, + cnorm=\E[34h\E[?25h, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH$<1>, cvvis=\E[?25h\E[34l, + dch=\E[%p1%dP$<1*>, dch1=\E[P$<1>, dclk=\E[31h, + dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>, dsl=\E[40l, + ech=\E[%p1%dX$<.1*>, ed=\E[J$<40>, el=\E[K$<10>, + el1=\E[1K$<12>, enacs=\E)0, + flash=\E[30h\E\,$<300/>\E[30l, fsl=\E[1;24r\E8, + home=\E[H, hpa=\E[%i%p1%d`, ht=\011$<1>, + ich=\E[%p1%d@$<1*>, il=\E[%p1%dL$<2*>, il1=\E[L$<2>, + ind=\n$<2>, + initc=\E[66;%p1%d;%?%p2%{250}%<%t%{0}%e%p2%{500}%<%t%{16}%e + %p2%{750}%<%t%{32}%e%{48}%;%?%p3%{250}%<%t%{0}%e%p3 + %{500}%<%t%{4}%e%p3%{750}%<%t%{8}%e%{12}%;%?%p4%{250} + %<%t%{0}%e%p4%{500}%<%t%{1}%e%p4%{750}%<%t%{2}%e%{3}%; + %{1}%+%+%+%dw, + ip=$<1>, is1=\E[90;1"p\E[?5W$<6>, + is2=\E[2;4;20;30;40l\E[?1;10;16l\E[12h\E[?7;8;25h, + is3=\E>\017\E)0\E(B\E[63;0w\E[m, mc0=\E[0i, + oc=\E[60w\E[63;0w\E[66;1;4w\E[66;2;13w\E[66;3;16w\E[66;4;49w + \E[66;5;51w\E[66;6;61w\E[66;7;64w, + op=\E[m, ri=\EM$<2>, rmacs=^O, rmam=\E[?7l, rmclk=\E[31l, + rmcup=\E[ R, rmir=\E[4l, rmkx=\E>, rmso=\E[27m, + rmul=\E[24m, rs1=\E[13l\E[3l\E!p\E[?4i, + rs2=\E[35h\E[?3l$<8>, rs3=\E[?5l, setb=\E[62;%p1%dw, + setf=\E[61;%p1%dw, + sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? + %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smcup=\E[ Q, + smir=\E[4h, smkx=\E[?1l\E=, + tsl=\E[40l\E[40h\E7\E[99;%i%p1%dH, u0=\E[?38h\E8, + u1=\E[?38l\E)0, u2=\E[92;52"p, u3=\E~B, u4=\E[92;76"p, + u5=\E%!1\E[90;1"p, vpa=\E[%i%p1%dd, use=ansi+csr, + use=ansi+inittabs, use=ansi+local, use=ansi+pp, + use=ansi+sgrbold, use=decid+cpr, +# +# Function key set for the ASCII (wy-50 compatible) keyboard +# This is the default 370. +# +wy370|wyse370|wy370-101k|Wyse 370 with 101 key keyboard, + kcbt=\E[Z, kdch1=\EOQ, kdl1=\EOQ, kent=\EOM, kf1=\E[?4i, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf2=\E[?3i, + kf3=\E[2i, kf4=\E[@, kf5=\E[M, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, kich1=\EOP, kil1=\EOP, knp=\E[U, + kpp=\E[V, use=ansi+arrows, use=wy370-nk, +# +# Function key set for the VT-320 (and wy85) compatible keyboard +# +wy370-105k|Wyse 370 with 105 key keyboard, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, kfnd=\E[1~, + khlp=\E[28~, khome=\E[26~, lf1=PF1, lf2=PF2, lf3=PF3, + lf4=PF4, use=ansi+arrows, use=vt220+vtedit, use=wy370-nk, + use=vt220+keypad, +# +# Function key set for the PC compatible keyboard +# +wy370-EPC|Wyse 370 with 102 key keyboard, + kcbt=\E[Z, kend=\E[1~, kent=\EOM, kf1=\EOP, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + kf5=\E[M, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + kich1=\E[2~, knp=\E[U, kpp=\E[V, use=ansi+arrows, + use=wy370-nk, +# +# Wyse 370 with visual bell. +wy370-vb|Wyse 370 with visible bell, + bel@, use=wy370, +# +# Wyse 370 in 132-column mode. +wy370-w|Wyse 370 in 132-column mode, + cols#132, wsl#132, + rs2=\E[35h\E[?3h$<70>, use=wy370, +# +# Wyse 370 in 132-column mode with visual bell. +wy370-wvb|Wyse 370 with visible bell 132-columns, + flash=\E[30h\E\,$<300/>\E[30l, use=wy370-w, +wy370-rv|Wyse 370 reverse video, + rs3=\E[32h\E[?5h, use=wy370, +# +# Wyse 99gt Tektronix 4010/4014 emulator, +# +wy99gt-tek|Wyse 99gt Tektronix 4010/4014 emulator, + am, os, + cols#74, lines#35, + bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuf1=\s, + cup=\035%{3040}%{89}%p1%*%-%Py%p2%{55}%*%Px%gy%{128}%/%{31} + %&%{32}%+%c%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c%gy%{004} + %/%{31}%&%{96}%+%c%gx%{128}%/%{31}%&%{32}%+%c%gx%{004}%/ + %{31}%&%{64}%+%c\037, + cuu1=^K, ff=^L, + hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH + \037, + home=^]7`x @\037, + hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + \037, + is2=\E8, nel=\r\n, u0=\E~>\E8, u1=\E[42h, +# +# Wyse 160 Tektronix 4010/4014 emulator, +# +wy160-tek|Wyse 160 Tektronix 4010/4014 emulator, + cup=\035%{3103}%{91}%p1%*%-%Py%p2%{55}%*%Px%gy%{128}%/%{31} + %&%{32}%+%c%gy%{3}%&%{4}%*%gx%{3}%&%+%{96}%+%c%gy%{004} + %/%{31}%&%{96}%+%c%gx%{128}%/%{31}%&%{32}%+%c%gx%{004}%/ + %{31}%&%{64}%+%c\037, + home=^]8`g @\037, use=wy99gt-tek, +# +# Wyse 370 Tektronix 4010/4014 emulator, +# +wy370-tek|Wyse 370 Tektronix 4010/4014 emulator, + am, os, + cols#80, lines#36, + bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuf1=\s, + cup=\035%{775}%{108}%p1%*%{5}%/%-%Py%p2%{64}%*%{4}%+%{5}%/ + %Px%gy%{32}%/%{31}%&%{32}%+%c%gy%{31}%&%{96}%+%c%gx%{32} + %/%{31}%&%{32}%+%c%gx%{31}%&%{64}%+%c\037, + cuu1=^K, ff=^L, + hd=\036HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH + \037, + home=^]8g @\037, + hu=\036DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD + \037, + is2=\E8, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^I, kcuu1=^K, + nel=\r\n, u0=\E[?38h\E8, u1=\E[?38l\E)0, + +# Vendor-supplied Wyse entries end here. + +# +#TITLE: TERMINFO ENTRY WY520 +#DATE: 8/5/93 +# The WY520 terminfo is based on the WY285 entry published on the WYSE +# BBS with the addition of more function keys and special keys. +# +# rs1 -> set personality +# rs2 -> set number of columns +# rs3 -> set number of lines +# is1 -> select the proper font +# is2 -> do the initialization +# is3 -> If this string is empty then rs3 gets sent. +# +# Wyse 520 emulating a VT420 7 bit mode with default ANSI keyboard +# - The BS key is programmed to generate BS in smcup since +# is2 doesn't seem to work. +# - Remove and shift/Remove: delete a character +# - Insert : enter insert mode +# - Find : delete to end of file +# - Select : clear a line +# - F11, F12, F13: send default sequences (not ESC, BS, LF) +# - F14 : Home key +# - Bottom status line (host writable line) is used. +# - smkx,rmkx are removed because this would put the numeric +# keypad in Dec application mode which doesn't seem to work +# with SCO applications. +# +wy520|wyse520|Wyse 520, + am, hs, km, mir, xenl, xon, + cols#80, it#8, lines#24, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, civis=\E[?25l, clear=\E[H\E[J$<40>, + cnorm=\E[34h\E[?25h, cr=\r, csr=\E[%i%p1%d;%p2%dr$<20>, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E[?25h\E[34l, dch=\E[%p1%dP$<3>, dch1=\E[P$<30>, + dim=\E[2m, dl=\E[%p1%dM$<2*>, dl1=\E[M$<2>, dsl=\E[0$~, + ech=\E[%p1%dX, ed=\E[J$<40>, el=\E[K, el1=\E[1K, + enacs=\E)0, fsl=\E[0$}, home=\E[H, hpa=\E[%i%p1%d`, + ich=\E[%p1%d@$<2>, il=\E[%p1%dL$<3*>, il1=\E[L$<3>, + ind=\n$<2>, ip=$<4>, is1=\E[?5W, + is2=\E[2;4;20;30l\E[?1;4;10;16l\E[12h\E[?7;8;25;67h, + is3=\E>\E(B\E)0\017\E[m, kcbt=\E[Z, ked=\E[1~, kel=\E[4~, + kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, + kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, + kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, + khome=\E[26~, lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4, mc0=\E[0i, + ri=\EM$<2>, rmacs=^O, rmam=\E[?7l, rmcup=\E[ R, rmir=\E[4l, + rmul=\E[24m, rs1=\E[13l\E[3l\E\\\E[63;1"p\E[!p, + rs2=\E[35h\E[?3l, rs3=\E[?5l\E[47h\E[40l\E[r, + sgr=\E[0%?%p2%t;4%;%?%p3%p1%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;%? + %p6%t;1%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, + smcup=\E[ Q\E[?67;8h, smir=\E[4h, + tsl=\E[2$~\E[1$}\E[%i%p1%d`, vpa=\E[%i%p1%dd, + use=ansi+arrows, use=ansi+csr, use=ansi+local, + use=ansi+pp, use=ansi+sgrbold, use=ansi+tabs, + use=decid+cpr, use=vt220+vtedit, use=vt220+keypad, +# +# Wyse 520 with 24 data lines and status (terminal status) +wy520-24|wyse520-24|Wyse 520 with 24 data lines, + hs@, + dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@, + use=wy520, +# +# Wyse 520 with visual bell. +wy520-vb|wyse520-vb|Wyse 520 with visible bell, + flash=\E[30h\E\,$<100/>\E[30l, use=wy520, +# +# Wyse 520 in 132-column mode. +wy520-w|wyse520-w|Wyse 520 in 132-column mode, + cols#132, wsl#132, + dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>, + ip=$<7>, rs2=\E[35h\E[?3h, use=wy520, +# +# Wyse 520 in 132-column mode with visual bell. +wy520-wvb|wyse520-wvb|Wyse 520 with visible bell 132-columns, + flash=\E[30h\E\,$<100/>\E[30l, use=wy520-w, +# +# +# Wyse 520 emulating a VT420 7 bit mode. +# The DEL key is programmed to generate BS in is2. +# With EPC keyboard. +# - 'End' key will clear till end of line on EPC keyboard +# - Shift/End : ignored. +# - Insert : enter insert mode. +# - Delete : delete a character (have to change interrupt character +# to CTRL-C: stty intr '^c') for it to work since the +# Delete key sends 7FH. +wy520-epc|wyse520-epc|Wyse 520 with EPC keyboard, + kdch1=^?, kel=\E[4~, kend=\E[4~, kf0=\E[21~, kf1=\E[11~, + kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, khome=\E[H, + use=wy520, +# +# Wyse 520 with 24 data lines and status (terminal status) +# with EPC keyboard. +wy520-epc-24|wyse520-pc-24|Wyse 520 with 24 data lines and EPC keyboard, + hs@, + dsl@, fsl@, rs3=\E[?5l\E[47h\E[40l\E[1;24r, tsl@, + use=wy520-epc, +# +# Wyse 520 with visual bell. +wy520-epc-vb|wyse520-pc-vb|Wyse 520 with visible bell and EPC keyboard, + flash=\E[30h\E\,$<100/>\E[30l, use=wy520-epc, +# +# Wyse 520 in 132-column mode. +wy520-epc-w|wyse520-epc-w|Wyse 520 in 132-column mode with EPC keyboard, + cols#132, wsl#132, + dch=\E[%p1%dP$<7>, dch1=\E[P$<7>, ich=\E[%p1%d@$<7>, + ip=$<7>, rs2=\E[35h\E[?3h, use=wy520-epc, +# +# Wyse 520 in 132-column mode with visual bell. +wy520-epc-wvb|wyse520-p-wvb|Wyse 520 with visible bell 132-columns and EPC keyboard, + flash=\E[30h\E\,$<100/>\E[30l, use=wy520-epc-w, +# +# Wyse 520 in 80-column, 36 lines +wy520-36|wyse520-36|Wyse 520 with 36 data lines, + hs@, + lines#36, + dsl@, fsl@, rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r, tsl@, + use=wy520, +# +# Wyse 520 in 80-column, 48 lines +wy520-48|wyse520-48|Wyse 520 with 48 data lines, + hs@, + lines#48, + dsl@, fsl@, rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r, tsl@, + use=wy520, +# +# Wyse 520 in 132-column, 36 lines +wy520-36w|wyse520-36w|Wyse 520 with 132 columns and 36 data lines, + cols#132, wsl#132, + rs2=\E[?3h, + rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r\E[132$|, + use=wy520-36, +# +# Wyse 520 in 132-column, 48 lines +wy520-48w|wyse520-48w|Wyse 520 with 48 data lines (132 column), + cols#132, wsl#132, + rs2=\E[?3h, + rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r\E[132$|, + use=wy520-48, +# +# +# Wyse 520 in 80-column, 36 lines with EPC keyboard +wy520-36pc|wyse520-36pc|Wyse 520 with 36 data lines and EPC keyboard, + hs@, + lines#36, + dsl@, fsl@, rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r, tsl@, + use=wy520-epc, +# +# Wyse 520 in 80-column, 48 lines with EPC keyboard +wy520-48pc|wyse520-48pc|Wyse 520 with 48 data lines and EPC keyboard, + hs@, + lines#48, + dsl@, fsl@, rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r, tsl@, + use=wy520-epc, +# +# Wyse 520 in 132-column, 36 lines with EPC keyboard +wy520-36wpc|wyse520-36wpc|Wyse 520 with 36 data lines and EPC keyboard (132 column), + cols#132, wsl#132, + rs2=\E[?3h, + rs3=\E[?5l\E[36*|\E[36t\E[40l\E[1;36r\E[132$|, + use=wy520-36pc, +# +# Wyse 520 in 132-column, 48 lines with EPC keyboard +wy520-48wpc|wyse520-48wpc|Wyse 520 with 48 data lines and EPC keyboard (132 column), + cols#132, wsl#132, + rs2=\E[?3h, + rs3=\E[?5l\E[48*|\E[48t\E[40l\E[1;48r\E[132$|, + use=wy520-48pc, + +# From: John Gilmore +# (wyse-vp: removed , there's no such +# file and we don't know what is -- esr) +wyse-vp|Wyse 50 in ADDS Viewpoint emulation mode with "enhance" on, + OTbs, am, + cols#80, it#8, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^F, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dch1=\EW, + dl1=\El, ed=\Ek, el=\EK, home=^A, ht=^I, il1=\EM, ind=\n, + is2=\E`:\E`9\017\Er, kbs=^H, kcub1=^U, kcud1=\n, kcuf1=^F, + kcuu1=^Z, khome=^A, ll=^A^Z, nel=\r\n, rmir=\Er, rmso=^O, + rmul=^O, rs1=\E`:\E`9\017\Er, sgr0=^O, smir=\Eq, smso=^N, + smul=^N, + +wy75ap|wyse75ap|wy-75ap|wyse-75ap|Wyse WY-75 Applications and Cursor keypad, + is2=\E[1;24r\E[?10;3l\E[?1;25h\E[4l\E[m\E(B\E=, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + khome=\EOH, rmkx=\E[?1l\E>$<10/>, smkx=\E[?1h\E=$<10/>, + use=wy75, + +# From: Eric Freudenthal +wy100q|Wyse 100 for Quotron, + OTbs, + cols#80, lines#24, xmc#1, + cbt=\EI, clear=^Z, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, home=^^, il1=\EE, invis@, + is2=\E`:\0\EC\EDF\E0\E'\E(\EA21, kcub1=^H, kcud1=\n, + kcuf1=^L, kcuu1=^K, ri=\Ej, rmir=\Er, smir=\Eq, use=adm+sgr, + +#### Kermit terminal emulations +# +# Obsolete Kermit versions may be listed in the section describing obsolete +# non-ANSI terminal emulators later in the file. +# + +# KERMIT standard all versions. +# Straight ascii keyboard. :sr=\EI: not avail. many versions + bug prone in vi. +# (kermit: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr) +# From: greg small 9-25-84 +kermit|standard kermit, + OTbs, + cols#80, lines#24, + clear=\EE, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ, + el=\EK, home=\EH, is2=K0 Standard Kermit 9-25-84\n, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, +kermit-am|standard kermit plus auto-margin, + am, + is2=K1 Standard Kermit plus Automatic Margins\n, + use=kermit, +# IBMPC Kermit 1.2. +# Bugs: , : do not work except at beginning of line! does +# not work, but fake with :cl=\EH\EJ (since :cd=\EJ: works at beginning of +# line). +# From: greg small 8-30-84 +pckermit|pckermit12|UCB IBMPC Kermit 1.2, + am, + lines#25, + clear=\EH\EJ, ed@, el@, + is2=K2 UCB IBMPC Kermit 1.2 8-30-84\n, use=kermit, +# IBMPC Kermit 1.20 +# Cannot use line 25, now acts funny like ANSI special scrolling region. +# Initialization must escape from that region by cursor position to line 24. +# Cannot use character insert because 1.20 goes crazy if insert at col 80. +# Does not use :am: because autowrap is lost when kermit dropped and restarted. +# From: greg small 12-19-84 +pckermit120|UCB IBMPC Kermit 1.20, + it#8, + cvvis=\EO\Eq\EEK3, dch1=\EN, dl1=\EM, ht=^I, il1=\EL, + is2=\EO\Eq\EJ\EY7\sK3\sUCB\sIBMPC\sKermit\s1.20\s\s12-19-84 + \n, + rmir@, rmso=\Eq, smir@, smso=\Ep, use=kermit, +# MS-DOS Kermit 2.27 for the IBMPC +# Straight ascii keyboard. :sr=\EI: not avail. many versions + bug prone in vi. +# Cannot use line 25, now acts funny like ANSI special scrolling region. +# Initialization must escape from that region by cursor position to line 24. +# Does not use am: because autowrap is lost when kermit dropped and restarted. +# Reverse video for standout like H19. +# (msk227: removed obsolete ":ma=^Hh^Jj^Kk^Ll^^H:" -- esr) +# From: greg small 3-17-85 +msk227|mskermit227|MS-DOS Kermit 2.27 for the IBMPC, + OTbs, am@, + cols#80, it#8, lines#24, + clear=\EE, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, + cvvis=\EO\Eq\EG\EwK4, dch1=\EN, dl1=\EM, ed=\EJ, el=\EK, + home=\EH, ht=^I, il1=\EL, + is2=\EO\Eq\EG\Ew\EJ\EY7\sK4\sMS\sKermit\s2.27\sfor\sthe + \sIBMPC\s3-17-85\n, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, rc=\Ek, + rmir=\EO, rmso=\Eq, sc=\Ej, smir=\E@, smso=\Ep, +# MS-DOS Kermit 2.27 with automatic margins +# From: greg small 3-17-85 +msk227am|mskermit227am|UCB MS-DOS Kermit 2.27 with automatic margins, + am, + cvvis=\EO\Eq\EG\EvK5, + is2=\EO\Eq\EG\Ev\EJ\EY7\sK5\sMS\sKermit\s2.27\s+automatic + \smargins\s3-17-85\n, + use=msk227, +# MS-DOS Kermit 2.27 UCB 227.14 for the IBM PC +# Automatic margins now default. Use ansi for highlights. +# Define function keys. +# (msk22714: removed obsolete ":kn#10:" -- esr) +# From: greg small 3-17-85 +msk22714|mskermit22714|UCB MS-DOS Kermit 2.27 UCB 227.14 IBM PC, + am, + bold=\E[1m, cvvis=\EO\Eq\EG\EvK6, + is2=\EO\Eq\EG\Ev\EJ\EY7\sK6\sMS\sKermit\s2.27\sUCB\s227.14 + \sIBM\sPC\s3-17-85\n, + kf0=\E0, kf1=\E1, kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6, + kf7=\E7, kf8=\E8, kf9=\E9, rev=\E[7m, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smso=\E[1m, smul=\E[4m, use=mskermit227, +# This was designed for a VT320 emulator, but it is probably a good start +# at support for the VT320 itself. +# Please send changes with explanations to bug-gnu-emacs@prep.ai.mit.edu. +# (vt320-k3: I added / based on the init string -- esr) +vt320-k3|MS-Kermit 3.00's VT320 emulation, + am, km, mir, msgr, xenl, + cols#80, it#8, lines#49, pb#9600, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, cmdch=\E, cr=\r, cub1=^H, + cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, + flash=\E[?5h$<100/>\E[?5l\E[?5h$<100/>\E[?5l\E[?5h$<100/>\E[ + ?5l, + home=\E[H, hpa=\E[%i%p1%dG, ht=^I, hts=\EH, ich=\E[%p1%d@, + ind=\n, is2=\E>\E F\E[?1h\E[?7h\E[r\E[2$~, kbs=^H, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kdl1=\E[3~, + kf0=\E[21~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + kich1=\E[2~, knp=\E[6~, kpp=\E[5~, mc0=\E[0i, mc4=\E[4i, + mc5=\E[5i, nel=\r\n, rev=\E[7m, ri=\EM, rin=\E[%p1%dL, + rmacs=\E(B, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[27m, rmul=\E[24m, + rs1=\E(B\E)B\E>\E\sF\E[4;20l\E[12h\E[?1;5;6;38;42l\E[?7;25h + \E[4i\E[?4i\E[m\E[r\E[2$~, + sgr0=\E[m, smacs=\E(0, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g, + tsl=\E[1$}\r\E[K, vpa=\E[%i%p1%dd, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+local, use=dec+sl, + use=vt220+cvis, + +# From: Joseph Gil 13 Dec 1991 +# ACS capabilities from Philippe De Muyter 30 May 1996 +# (I removed a bogus boolean :mo: and added , , -- esr) +vt320-k311|DEC VT320 series as defined by kermit 3.11, + am, eslok, hs, mir, msgr, xenl, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, + dch1=\E[P, dsl=\E[2$~\r\E[1$}\E[K\E[$}, ed=\E[J, el=\E[K, + flash=\E[?5h$<100/>\E[?5l, fsl=\E[$}, home=\E[H, ht=^I, + hts=\EH, ich=\E[%p1%d@, il1=\E[L$<3/>, ind=\ED, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r\E[24;1H, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, lf1=pf1, lf2=pf2, + lf3=pf3, lf4=pf4, nel=\r\ED, rev=\E[7m, + rf=/usr/share/tabset/vt100, ri=\EM, rmacs=^O, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, + rmul=\E[24m, rs1=\E[?3l, sgr0=\E[m, smacs=^N, smam=\E[?7h, + smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, + tbc=\E[3g, tsl=\E[2$~\E[1$}\E[1;%dH, use=ansi+csr, + use=ansi+idl, use=ansi+local, use=vt220+cvis, + +######## NON-ANSI TERMINAL EMULATIONS +# + +#### Avatar +# +# These entries attempt to describe Avatar, a terminal emulation used with +# MS-DOS bulletin-board systems. It was designed to give ANSI-like +# capabilities, but with cheaper (shorter) control sequences. Messy design, +# excessively dependent on PC idiosyncrasies, but apparently rather popular +# in the BBS world. +# +# No color support. Avatar doesn't fit either of the Tektronix or HP color +# models that terminfo knows about. An Avatar color attribute is the +# low 7 bits of the IBM-PC display-memory attribute. Bletch. +# +# I wrote these entries while looking at the Avatar spec. I don't have +# the facilities to test them. Let me know if they work, or don't. +# +# Avatar escapes not used by these entries (because maybe you're smarter +# and more motivated than I am and can figure out how to wrap terminfo +# around some of them, and because they are weird enough to be funny): +# level 0: +# ^L -- clear window/reset current attribute to default +# ^V^A%p1%c -- set current color attribute, parameter decodes as follows: +# +# bit: 6 5 4 3 2 1 0 +# | | | | | +# +---+---+ | +---+---+ +# | | | +# | | foreground color +# | foreground intensity +# background color +# level 0+: +# ^V^J%p1%c%p2%c%p3%c%p4%c%p5%c -- scroll (p2,p3) to (p4,p5) up by p1 lines +# ^V^K%p1%c%p2%c%p3%c%p4%c%p5%c -- scroll (p2,p3) to (p4,p5) down by p1 lines +# ^V^L%p1%c%p2%c%p3%c -- clear p2 lines and p3 cols w/attr %p1 +# ^V^M%p1%c%p2%c%p3%c%p4%c -- fill p3 lines & p4 cols w/char p2+attr %p1 +# (^V^L and ^V^M set the current attribute as a side-effect.) +# ^V ^Y [...] -- repeat pattern. specifies the number of bytes +# in the pattern, the number of times the pattern +# should be repeated. If either value is 0, no-op. +# The pattern can contain Avatar console codes, +# including other ^V ^Y patterns. +# level 1: +# ^V^O -- clockwise mode on; turn print direction right each time you +# hit a window edge (yes, really). Turned off by CR +# ^V^P -- no-op +# ^V^Q%c -- query the driver +# ^V^R -- driver reset +# ^V^S -- Sound tone (PC-specific) +# ^V^T -- change highlight at current cursor position to %c +# ^V^U%p1%c%p2%c -- highlight window with attribute +# ^V^V%p1%c%p2%c%p3%c%p4%c%p5%c +# -- define window +# +# From: Eric S. Raymond 1 Nov 1995 +# (The ///// capabilities exist only to +# tell ncurses that the corresponding highlights exist; it should use , +# which is the only method that will actually work for multiple highlights.) +# +# Update by TD - 2004: half of this was inconsistent. Found documentation +# and repaired most of the damage. sgr0 is probably incorrect, but the +# available documentation gives no clues for a workable string. +avatar0|avatar terminal emulator level 0, + am, bce, msgr, + cols#80, it#8, lines#25, + blink=^V^B, bold=^V^A^P, cr=\r, cub1=^V^E, cud1=^V^D, + cuf1=^V^F, cup=\026\010%p1%c%p2%c, cuu1=^V^C, el=^V^G, + ind=\n, invis=^V^A\0, rep=\031%p1%c%p2%c, rev=^V^Ap, + rmacs@, rs2=^L, + sgr=%?%p1%p2%|%p3%|%p6%|%p7%|%t\026\001%?%p7%t%{128}%e%{0}%? + %p1%t%{112}%|%;%?%p2%t%{1}%|%;%?%p3%t%{112}%|%;%?%p6%t + %{16}%|%;%;%c%;%?%p4%t\026\002%;, + sgr0=^V^A^G, smacs@, smso=^V^Ap, smul=^V^A^A, + use=klone+acs, +# From: Eric S. Raymond 1 Nov 1995 +avatar0+|avatar terminal emulator level 0+, + dch1=^V^N, rmir=\026\n\0\0\0\0, smir=^V^I, use=avatar0, +# From: Eric S. Raymond 1 Nov 1995 +avatar|avatar1|avatar terminal emulator level 1, + civis=^V'^B, cnorm=^V'^A, cvvis=^V^C, dl1=^V-, il1=^V+, + rmam=^V", rmir=^V^P, smam=^V$, use=avatar0+, + +#### RBcomm +# +# RBComm is a lean and mean terminal emulator written by the Interrupt List +# maintainer, Ralf Brown. It was fairly popular in the late DOS years (early +# '90s), especially in the BBS world, and still has some loyal users due to +# its very small memory footprint and to a cute macro language. +rbcomm|IBM PC with RBcomm and EMACS keybindings, + am, bw, mir, msgr, xenl, + cols#80, it#8, lines#25, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=^L, cr=\r, + cub1=^H, cud1=^C, cuf1=^B, + cup=\037%p2%{32}%+%c%p1%{32}%+%c, cuu1=^^, dch1=^W, + dl=\E[%p1%dM, dl1=^Z, ech=\E[%p1%dX, ed=^F5, el=^P^P, ht=^I, + il=\E[%p1%dL, il1=^K, ind=\ED, invis=\E[8m, + is2=\017\035\E(B\E)0\E[?7h\E[?3l\E[>8g, kbs=^H, + kcub1=^B, kcud1=^N, kcuf1=^F, kcuu1=^P, khome=^A, nel=\r\ED, + rep=\030%p1%c%p2%c, rev=^R, ri=\EM, rmcup=, rmdc=, rmir=^], + rmkx=\E>, rmso=^U, rmul=^U, + rs1=\017\E(B\E)0\025\E[?3l\E[>8g, sgr0=\E[m, smcup=, + smdc=, smir=^\, smkx=\E=, smso=^R, smul=^T, use=ansi+csr, + use=vt220+cvis, + +rbcomm-nam|IBM PC with RBcomm without autowrap, + am@, + cud1=\n, ind=\n, + is2=\017\035\E(B\E)0\E[?7l\E[?3l\E[>8g, kcub1=^H, + kcud1=\n, nel=\r\n, use=rbcomm, +rbcomm-w|IBM PC with RBcomm in 132 column mode, + cols#132, + cud1=\n, ind=\n, + is2=\017\035\E(B\E)0\E[?7h\E[?3h\E[>8g, kcub1=^H, + kcud1=\n, nel=\r\n, use=rbcomm, + +######## LCD DISPLAYS +# + +#### Matrix Orbital +# from: Eric Z. Ayers (eric@ale.org) +# +# Matrix Orbital 20x4 LCD display +# Command Character is 0xFE (decimal 254, octal 376) +# +# On this device, cursor addressability isn't possible. The LCD expects: +# 0xfe G +# for cup: %p1 == row and %p2 is column +# +# This line: +# cup=\376G%p2%c%p1%c +# LOOKS like it will work, but sometimes only one of the two numbers is sent. +# See the terminfo (5) manpage commented regarding 'Terminals which use "%c"'. +# +# Alas, there is no cursor upline capability on this display. +# +# These entries add some 'sanity stuff' to the clear function. That is, it +# does a 'clear' and also turns OFF auto scroll, turns ON Auto Line Wrapping, +# and turns off the cursor blinking and stuff like that. +# +# NOTE: calling 'beep' turns on the backlight (bell) +# NOTE: calling 'flash' turns it on and back off (visual bell) +# +MtxOrb|generic Matrix Orbital LCD display, + bel=\376B\001, clear=\376X\376C\376R\376K\376T, + cnorm=\376K\376T, cub1=\376L, cuf1=\376M, + flash=\376B\001$<200>\376F, home=\376H, +MtxOrb204|20x4 Matrix Orbital LCD display, + cols#20, lines#4, use=MtxOrb, +MtxOrb162|16x2 Matrix Orbital LCD display, + cols#16, lines#2, use=MtxOrb, +# The end + +######## OLDER TERMINAL TYPES +# +# This section is devoted to older commercial terminal brands that are now +# discontinued, but known to be still in use or represented by emulations. +# + +#### AT&T (att, tty) +# +# This section also includes Teletype-branded VDTs. +# +# The AT&T/Teletype terminals group was sold to SunRiver Data Systems (now +# Boundless Technologies); for details, see the header comment on the ADDS +# section. +# +# These are AT&T's official terminfo entries. All-caps aliases have been +# removed. +# +att2300|sv80|AT&T 2300 Video Information Terminal 80 column mode, + am, eo, mir, msgr, xon, + cols#80, it#8, lines#24, + bel=^G, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, el1=\E[1K, home=\E[H, ht=^I, + ich=\E[%p1%d@, ind=\n, kcbt=\E[Z, kclr=\E[J, kdch1=\E[P, + kdl1=\E[M, kf1=\E[1r, kf10=\E[10r, kf11=\E[11r, + kf12=\E[12r, kf13=\E[13r, kf14=\E[14r, kf15=\E[15r, + kf16=\E[16r, kf2=\E[2r, kf3=\E[3r, kf4=\E[4r, kf5=\E[5r, + kf6=\E[6r, kf7=\E[7r, kf8=\E[8r, kf9=\E[9r, kich1=\E[@, + kil1=\E[L, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rev=\E[7m, + rmir=\E[4l, rmso=\E[m, sgr0=\E[m, smir=\E[4h, smso=\E[7m, + use=ansi+arrows, use=ansi+cpr, use=ansi+erase, + use=ansi+idl, use=ansi+local, + +att2350|AT&T 2350 Video Information Terminal 80 column mode, + mc0@, mc4@, mc5@, use=att2300, + +# Must setup RETURN KEY - CR, REC'VD LF - INDEX. +# Seems upward compatible with VT100, plus ins/del line/char. +# On sgr, the protection parameter is ignored. +# No check is made to make sure that only 3 parameters are output. +# standout= reverse + half-intensity = 3 | 5. +# bold= reverse + underline = 2 | 3. +# note that half-bright blinking doesn't look different from normal blinking. +# NOTE:you must program the function keys first, label second! +# (att4410: a BSD entry has been seen with the following capabilities: +# , , , , , +# , , , -- esr) +att5410v1|att4410v1|tty5410v1|AT&T 4410/5410 80 columns - version 1, + am, hs, mir, msgr, xon, + cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80, + acsc=++\,\,--..00``aaffgghhjjkkllmmnnooppqqrrssttuuvvwwxxyyz + z{{||}}~~, + bel=^G, bold=\E[2;7m, cr=\r, cub1=^H, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dim=\E[2m, dl1=\E[M, + fsl=\E8, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, ind=\n, + is1=\E[?3l\E)0, + is3=\E[1;03q\s\s\sf1\s\s\s\s\s\s\s\s\s\s\s\EOP\E[2;03q\s\s + \sf2\s\s\s\s\s\s\s\s\s\s\s\EOQ\E[3;03q\s\s\sf3\s\s\s\s + \s\s\s\s\s\s\s\EOR\E[4;03q\s\s\sf4\s\s\s\s\s\s\s\s\s\s + \s\EOS\E[5;03q\s\s\sf5\s\s\s\s\s\s\s\s\s\s\s\EOT\E[6;03q + \s\s\sf6\s\s\s\s\s\s\s\s\s\s\s\EOU\E[7;03q\s\s\sf7\s\s + \s\s\s\s\s\s\s\s\s\EOV\E[8;03q\s\s\sf8\s\s\s\s\s\s\s\s + \s\s\s\EOW, + kclr=\E[2J, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, + kf6=\EOU, kf7=\EOV, kf8=\EOW, kll=\E[24;1H, ll=\E[24H, + nel=\r\n, + pfx=\E[%p1%1d;%p2%l%2.2dq\s\s\sf%p1%1d\s\s\s\s\s\s\s\s\s\s + \s%p2%s, + pln=\E[%p1%d;00q%p2%:-16s, ri=\EM, rmacs=^O, + rs2=\Ec\E[?3l\E[2;0y, + sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, tsl=\E7\E[25;%p1%{1}%+%dH, + use=ansi+arrows, use=ansi+csr, use=ansi+erase, + use=ansi+local1, use=ansi+sgrbold, + +att4410v1-w|att5410v1-w|tty5410v1-w|AT&T 4410/5410 132 columns - version 1, + cols#132, wsl#132, + is1=\E[?3h\E)0, rs2=\Ec\E[?3h\E[2;0y, use=att5410v1, + +att4410|att5410|tty5410|AT&T 4410/5410 80 columns - version 2, + OTbs, + pfx=\E[%p1%d;%p2%l%02dq f%p1%d %p2%s, + use=att5410v1, + +att5410-w|att4410-w|4410-w|tty5410-w|5410-w|AT&T 4410/5410 in 132 column mode, + cols#132, wsl#132, + is1=\E[?3h\E)0, rs2=\Ec\E[?3h\E[2;0y, use=att4410, + +# 5410 in terms of a VT100 +# (v5410: added / based on init string -- esr) +v5410|att5410 in terms of a VT100, + am, mir, msgr, xon, + cols#80, it#8, lines#24, vt#3, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, + clear=\E[H\E[J$<50>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>, + cuu1=\E[A$<2>, dch1=\E[P, dl1=\E[M, ed=\E[J$<50>, + el=\E[K$<3>, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, + ht=^I, hts=\EH, ich1=\E[@, il1=\E[L, ind=\n, kbs=^H, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l, + rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;m%?%p9%t\016%e\017%;$<2>, + sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, + smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, + use=ansi+csr, use=decid+cpr, use=vt100+fnkeys, + +# +# Teletype Model 5420 -- A souped up 5410, with multiple windows, +# even! the 5420 has three modes: scroll, window or page mode +# this terminfo should work in scroll or window mode, but doesn't +# take advantage of any of the differences between them. +# +# Has memory below (2 lines!) +# 3 pages of memory (plus some spare) +# The 5410 sequences for , , ,
, , , , +# , would work for these, but these work in both scroll and window +# mode... Unset insert character so insert mode works +# sets 80 column mode, +# escape sequence: +# 1) turn off all fonts +# 2) function keys off, keyboard lock off, control display off, +# insert mode off, erasure mode off, +# 3) full duplex, monitor mode off, send graphics off, nl on lf off +# 4) reset origin mode +# 5) set line wraparound +# 6) exit erasure mode, positional attribute mode, and erasure extent mode +# 7) clear margins +# 8) program ENTER to transmit ^J, +# We use \212 to program the ^J because a bare ^J will get translated by +# UNIX into a CR/LF. The enter key is needed for AT&T uOMS. +# 1 2 3 4 5 6 7 8 +# set screen color to black, +# No representation in terminfo for the delete word key: kdw1=\Ed +# Key capabilities assume the power-up send sequence... +# This is not strictly necessary, but it helps maximize +# memory usefulness: , +# Alternate sgr0: , +# Alternate sgr: , +# smkx programs the SYS PF keys to send a set sequence. +# It also sets up labels f1, f2, ..., f8, and sends edit keys. +# This string causes them to send the strings - +# when pressed in SYS PF mode. +# (att4415: I added / based on the init string -- esr) +att4415|tty5420|att5420|AT&T 4415/5420 80 cols, + db, + lm#78, wsl#55, + clear=\E[x\E[J, cnorm=\E[11;0j, cub1=^H, + cup=\E[%i%p1%d;%p2%dx, cvvis=\E[11;1j, + ech=\E[%p1%ds\E[%p1%dD, flash=\E[?5h$<200>\E[?5l, + home=\E[x, ich1@, indn=\E[%p1%dE, is1=\E[?3l$<100>, + is2=\E[m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h + \E[4i\Ex\E[21;1j\212, + is3=\E[?5l, kbeg=\Et, kcbt=\E[Z, kdch1=\E[P, kdl1=\E[M, + kel=\E[2K, kend=\Ez, kent=\Eent, kf1=\EOc, kf2=\EOd, + kf3=\EOe, kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, + kich1=\E[4h, kil1=\E[L, kind=\E[T, kll=\Eu, knp=\E[U, + kpp=\E[V, kri=\E[S, lf1=F1, lf2=F2, lf3=F3, lf4=F4, lf5=F5, + lf6=F6, lf7=F7, lf8=F8, ll=\Ew, mc0=\E[?2i, mc4=\E[?9i, + mc5=\E[?4i, mrcup=\E[%i%p1%d;%p2%dt, + pfx=\E[%p1%d;%p2%l%02dq F%p1%d %p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, prot=\EV, + rin=\E[%p1%dF, rmam=\E[?7l, rmkx=\E[19;0j\E[21;1j\212, + rmln=\E|, + sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%p6%|%t;7%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smkx=\E[19;1j\E[21;4j\Eent, + smln=\E~, tsl=\E7\E[25;%p1%{8}%+%dH, use=ansi+idc, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+rca, use=att4410, + +att4415-w|tty5420-w|att5420-w|AT&T 4415/5420 132 cols, + cols#132, lm#54, wsl#97, + is1=\E[?3h$<100>, use=att4415, + +att4415-rv|tty5420-rv|att5420-rv|AT&T 4415/5420 80 cols/rv, + flash=\E[?5l$<200>\E[?5h, is3=\E[?5h, use=att4415, + +att4415-w-rv|tty5420-w-rv|att5420-w-rv|AT&T 4415/5420 132 cols/rv, + cols#132, lm#54, wsl#97, + flash=\E[?5l$<200>\E[?5h, is1=\E[?3h$<100>, is3=\E[?5h, + use=att4415, + +# Note that this mode permits programming USER PF KEYS and labels +# However, when you program user pf labels you have to reselect +# user pf keys to make them appear! +att4415+nl|tty5420+nl|att5420+nl|generic AT&T 4415/5420 changes for not changing labels, + kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, + pfx=\E[%p1%d;%p2%l%02d;0;1q\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s + \s%p2%s, + pln=\E[%p1%d;0;0;1q%p2%:-16.16s, + +att4415-nl|tty5420-nl|att5420-nl|AT&T 4415/5420 without changing labels, + kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl, + use=att4415, + +att4415-rv-nl|tty5420-rv-nl|att5420-rv-nl|AT&T 4415/5420 reverse video without changing labels, + kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl, + use=att4415-rv, + +att4415-w-nl|tty5420-w-nl|att5420-w-nl|AT&T 4415/5420 132 cols without changing labels, + kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl, + use=att4415-w, + +att4415-w-rv-n|tty5420-w-rv-n|att5420-w-rv-n|AT&T 4415/5420 132 cols reverse without changing labels, + kf1@, kf2@, kf3@, kf4@, kf5@, kf6@, kf7@, kf8@, use=att4415+nl, + use=att4415-w-rv, + +att5420_2|AT&T 5420 model 2 80 cols, + am, db, hs, mir, msgr, xon, + cols#80, lh#2, lines#24, lm#78, lw#8, nlab#8, wsl#55, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + cbt=\E[1Z, clear=\EH\EJ, cnorm=\E[11;0j, cr=\EG, cub1=^H, + cud1=\E[1B, cuf1=\E[1C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[1A, cvvis=\E[11;1j, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%ds\E[%p1%dD, ed=\E[0J, el=\E[0K, el1=\E[1K, + flash=\E[?5h$<200>\E[?5l, fsl=\E8, home=\E[H, + hpa=\E[%p1%{1}%+%dG, ich=\E[%p1%d@, ich1=\E[@, ind=\n, + indn=\E[%p1%dE, + is1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;0j\E[6;0j\E[7;0j + \E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j + \E[29;0j\E[1;24r, + kbeg=\Et, kcbt=\E[Z, kclr=\E[2J, kdch1=\E[P, kdl1=\E[M, + kel=\E[2K, kend=\Ez, kent=\n, kf1=\EOc, kf2=\EOd, kf3=\EOe, + kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, + kich1=\E[4h, kil1=\E[L, kind=\E[T, kll=\Eu, knp=\E[U, + kpp=\E[V, kri=\E[S, lf1=F1, lf2=F2, lf3=F3, lf4=F4, lf5=F5, + lf6=F6, lf7=F7, lf8=F8, ll=\Ew, mc0=\E[?;2i, mc4=\E[4i, + mc5=\E[5i, mrcup=\E[%i%p1%d;%p2%dt, nel=\r\n, + pfx=\E[%p1%d;%p2%l%02dq\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s\s%p2 + %s\E~, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s\E~, prot=\EV, ri=\EM, + rin=\E[%p1%dF, rmacs=^O, rmkx=\E[19;0j, rmln=\E|, + rs2=\Ec\E[?3l\E[2;0y, + sgr=\E[0%?%p1%p5%|%t;2%;%?%p2%p6%|%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;%?%p8%t\EV%;, + sgr0=\E[m\017, smacs=^N, smkx=\E[19;1j, smln=\E~, + tsl=\E7\E[25;%p1%{8}%+%dH, vpa=\E[%p1%{1}%+%dd, + use=ansi+arrows, use=ansi+csr, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, use=ansi+sgrdim, + use=decid+cpr, + +att5420_2-w|AT&T 5420 model 2 in 132 column mode, + cols#132, + is1=\E[0;23r\Ex\Ey\E[2;0j\E[3;3j\E[4;0j\E[5;1j\E[6;0j\E[7;0j + \E[8;0j\E[9;1j\E[10;0j\E[15;0j\E[16;1j\E[19;0j\E[20;1j + \E[29;0j\E[1;24r, + use=att5420_2, + +att4418|att5418|AT&T 5418 80 cols, + am, xon, + cols#80, lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, clear=\E[H\E[2J, cr=\r, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[1P, + dim=\E[2m, ed=\E[0J, el=\E[0K, home=\E[H, ich=\E[%p1%d@, + ich1=\E[1@, il1=\E[1L, ind=\n, is1=\E[?3l, + is2=\E)0\E?6l\E?5l, kclr=\E[%%, kcub1=\E@, kcud1=\EU, + kcuf1=\EA, kcuu1=\ES, kent=\E[, kf1=\E[h, kf10=\E[m, + kf11=\E[n, kf12=\E[o, kf13=\E[H, kf14=\E[I, kf15=\E[J, + kf18=\E[K, kf19=\E[L, kf2=\E[i, kf20=\E[E, kf21=\E[_, + kf22=\E[M, kf23=\E[N, kf24=\E[O, kf3=\E[j, kf6=\E[k, + kf7=\E[l, kf8=\E[f, kf9=\E[w, khome=\Ec, rc=\E8, rev=\E[7m, + rmacs=^O, rmso=\E[m, rmul=\E[m, sc=\E7, sgr0=\E[m\017, + smacs=^N, smso=\E[7m, smul=\E[4m, use=ansi+idl, + use=ansi+local, + +att4418-w|att5418-w|AT&T 5418 132 cols, + cols#132, + is1=\E[?3h, use=att5418, + +att4420|tty4420|Teletype 4420, + OTbs, da, db, eo, msgr, ul, xon, + cols#80, lines#24, lm#72, + bel=^G, clear=\EH\EJ, cr=\EG, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EP, + dl1=\EM, ed=\EJ, el=\Ez, home=\EH, il1=\EL, ind=\EH\EM\EY7\s, + kcbt=\EO, kclr=\EJ, kcub1=^H, kdch1=\EP, kdl1=\EM, kf0=\EU, + kf3=\E@, khome=\EH, kich1=\E\^, kil1=\EL, kind=\ES, kri=\ET, + lf0=segment advance, lf3=cursor tab, rmdc@, rmso=\E~, + rmul=\EZ, smdc@, smso=\E}, smul=\E\\, use=vt52+arrows, + +# The following is a terminfo entry for the Teletype 4424 +# asynchronous keyboard-display terminal. It supports +# the vi editor. The terminal must be set up as follows, +# +# HIGHLIGHT DEFINITION 3-TONE +# DISPLAY FUNCTION GROUP III +# +# The second entry below provides limited (a la adm3a) +# operation under GROUP II. +# +# This must be used with DISPLAY FUNCTION GROUP I or III +# and HIGHLIGHT DEFINITION 3-TONE +# The terminal has either bold or blink, depending on options +# +# (att4424: commented out =\E[1m, we don't need bright locked on -- esr) +att4424|tty4424|Teletype 4424, + OTbs, am, xon, + cols#80, lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E3, bold=\E3, cbt=\EO, clear=\E[H\E[2J, cr=\r, + csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\E[%i%p1%d;%p2%dH, cuu1=\EA, dch=\E[%p1%dP, dch1=\EP, + dim=\EW, dl=\E[%p1%dM, dl1=\EM, ed=\EJ, el=\Ez, home=\E[H, + ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E\^, il=\E[%p1%dL, + il1=\EL, ind=\n, is2=\E[20l\E[?7h, kclr=\EJ, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\EE, rev=\E}, ri=\ET, + rmacs=\E(B, rmso=\E~, rmul=\EZ, + sgr=\EX\E~\EZ\E4\E(B%?%p1%p3%|%t\E}%;%?%p2%t\E\\%;%?%p4%p6%| + %t\E3%;%?%p5%t\EW%;%?%p9%t\E(0%;, + sgr0=\EX\E~\EZ\E4\E(B, smacs=\E(0, smso=\E}, smul=\E\\, + tbc=\EF, use=ansi+arrows, use=ansi+local, + +att4424-1|tty4424-1|Teletype 4424 in display function group I, + kclr@, kcub1=\ED, kcud1=\EB, kcuf1=\EC, kcuu1=\EA, khome@, + use=att4424, + +# This entry is not one of AT&T's official ones, it was translated from the +# 4.4BSD termcap file. The highlight strings are different from att4424. +# I have no idea why this is -- older firmware version, maybe? +# The following two lines are the comment originally attached to the entry: +# This entry appears to avoid the top line - I have no idea why. +# From: jwb Wed Mar 31 13:25:09 1982 remote from ihuxp +att4424m|tty4424m|Teletype 4424M, + am, da, db, mir, + cols#80, it#8, lines#23, + bel=^G, clear=\E[2;H\E[J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%2d;%p2%2dH\E[B, cuu1=\E[A, dch1=\EP, + dl1=\EM, el=\E[K, ht=^I, ich1=\E\^, il1=\EL, ind=\n, ip=$<2/>, + is2=\E[m\E[2;24r, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + nel=\r\n, ri=\ET, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smso=\E[7m, smul=\E[4m, use=ansi+arrows, + +# The Teletype 5425 is really version 2 of the Teletype 5420. It +# is quite similar, except for some minor differences. No page +# mode, for example, so all of the sequences used above have +# to change back to what's being used for the 5410. Many of the +# option settings have changed their numbering as well. +# +# This has been tested on a preliminary model. +# +# (att5425: added / based on the init string -- esr) +att5425|tty5425|att4425|AT&T 4425/5425, + da, db, hs, mir, xenl, xon, + lh#2, lm#78, lw#8, nlab#8, wsl#55, + bold=\E[2;7m, cnorm=\E[12;0j, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E[12;1j, dch=\E[%p1%dP, + dch1=\E[P, dim=\E[2m, ech=\E[%p1%ds\E[%p1%dD, el1=\E[1K, + flash=\E[?5h$<200>\E[?5l, fsl=\E8, hpa=\E[%p1%{1}%+%dG, + ich=\E[%p1%d@, indn=\E[%p1%dE, is1=\E<\E[?3l$<100>, + is2=\E[m\017\E[1;2;3;4;6l\E[12;13;14;20l\E[?6;97;99l\E[?7h + \E[4i\Ex\E[25;1j\212, + is3=\E[?5l, kbeg=\Et, kcbt=\E[Z, kclr=\E[J, kdch1=\E[P, + kdl1=\E[M, kel=\E[2K, kend=\Ez, kent=\Eent, kf1=\EOc, + kf2=\EOd, kf3=\EOe, kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, + kf8=\EOj, kich1=\E[4h, kil1=\E[L, kind=\E[T, kri=\E[S, + ll=\E[24H, mc0=\E[?2i, mc4=\E[?9i, mc5=\E[?4i, nel=\r\n, + pfx=\E[%p1%d;%p2%l%02dq F%p1%1d %p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, prot=\EV, ri=\EM, + rin=\E[%p1%dF, rmam=\E[?7l, rmir=\E[4l, + rmkx=\E[21;0j\E[25;1j\212, rmln=\E|, + rs2=\Ec\E[?3l\E[2;0y, + sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6 + %|%t;7%;%?%p7%t;8%;m%?%p8%t\EV%;%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smam=\E[?7h, smir=\E[4h, + smkx=\E[21;1j\E[25;4j\Eent\E~, smln=\E~, + tsl=\E7\E[25;%p1%{8}%+%dH, vpa=\E[%p1%{1}%+%dd, + use=ansi+arrows, use=ansi+csr, use=ansi+erase, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+sgrbold, use=decid+cpr, use=vt100+4bsd, + +att5425-nl|tty5425-nl|att4425-nl|AT&T 4425/5425 80 columns no labels, + smkx=\E[21;1j\E[25;4j\Eent, use=att4425, + +att5425-w|att4425-w|tty5425-w|Teletype 4425/5425 in 132 column mode, + cols#132, lm#54, wsl#97, + is1=\E[?3h$<100>, use=tty5425, + +# (att4426: his had bogus capabilities: :ri=\EM:, :ri=\E[1U:. +# I also added / -- esr) +att4426|tty4426|Teletype 4426S, + am, da, db, xon, + cols#80, lines#24, lm#48, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, bold=\E[5m, clear=\E[H\E[2J\E[1U\E[H\E[2J\E[1V, + cr=\r, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\EP, + ed=\E[J, el=\E[0K, home=\E[H, hpa=\E[%p1%dG, ht=^I, hts=\E1, + ich=\E[%p1%d@, ich1=\E\^, il1=\EL, ind=\n, is1=\Ec\E[?7h, + is2=\E[m\E[1;24r, kbs=^H, kcbt=\EO, kclr=\E[2J, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, + kf8=\EOW, khome=\E[H, kll=\E[24;1H, ll=\E[24H, nel=\r\n, + rc=\E8, rev=\E[7m, ri=\ET, rmacs=\E(B, rmam=\E[?7l, + rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l\E[2;0y, sc=\E7, + sgr0=\E[m\E(B, smacs=\E(0, smam=\E[?7h, smso=\E[5m, + smul=\E[4m, tbc=\E[3g, vpa=\E[%p1%dd, use=ansi+idl, + use=ansi+local, use=ecma+index, use=vt52+arrows, + +# Terminfo entry for the AT&T 510 A Personal Terminal +# Function keys 9 - 16 are available only after the +# screen labeled (soft keys/action blocks) are labeled. Function key +# 9 corresponds to the leftmost touch target on the screen, +# function key 16 corresponds to the rightmost. +# +# This entry is based on one done by Ernie Rice at Summit, NJ and +# changed by Anne Gallup, Skokie, IL, ttrdc!anne +att510a|bct510a|AT&T 510A Personal Terminal, + am, mir, msgr, xenl, xon, + cols#80, lh#2, lines#24, lw#7, nlab#8, + acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[2;7m, civis=\E[11;0|, + clear=\E[H\E[J, cnorm=\E[11;3|, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E[11;2|, dch=\E[%p1%dP, + dch1=\E[P, dim=\E[2m, ed=\E[0J, el=\E[0K, el1=\E[1K, + enacs=\E(B\E)1, ff=^L, home=\E[H, ind=\n, + is1=\E(B\E)1\E[2l, is3=\E[21;1|\212, kLFT=\E[u, + kRIT=\E[v, kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kf1=\EOm, kf10=\EOd, kf11=\EOe, + kf12=\EOf, kf13=\EOg, kf14=\EOh, kf15=\EOi, kf16=\EOj, + kf2=\EOV, kf3=\EOu, kf4=\ENj, kf5=\ENe, kf6=\ENf, kf7=\ENh, + kf8=\E[H, kf9=\EOc, kind=\E[S, kri=\E[T, mc0=\E[0i, + mc4=\E[?8i, mc5=\E[?4i, nel=\EE, pln=\E[%p1%dp%p2%:-16s, + rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O, rmkx=\E[19;0|, + rmso=\E[m, rmul=\E[m, sc=\E7, + sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6 + %|%t;7%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smkx=\E[19;1|, smso=\E[7m, + smul=\E[4m, use=ansi+cpr, use=ansi+idl, use=ansi+local, + use=ansi+tabs, + +# Terminfo entry for the AT&T 510 D Personal Terminal +# Function keys 9 through 16 are accessed by bringing up the +# system blocks. +# Function key 9 corresponds to the leftmost touch target on the screen, +# function key 16 corresponds to the rightmost. +# +# There are problems with soft key labeling. These are due to +# strangenesses in the native terminal that are impossible to +# describe in a terminfo. +att510d|bct510d|AT&T 510D Personal Terminal, + am, da, db, mir, msgr, xenl, xon, + cols#80, lh#2, lines#24, lm#48, lw#7, nlab#8, + acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~, + bel=^G, bold=\E[2;7m, clear=\E[H\E[J, cnorm=\E[11;3|, + cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, cvvis=\E[11;2|, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, ed=\E[0J, el=\E[0K, + el1=\E[1K, enacs=\E(B\E)1, ff=^L, home=\E[H, + hpa=\E[%p1%{1}%+%dG, ich=\E[%p1%d@, ind=\n, + is1=\E(B\E)1\E[5;0|, is3=\E[21;1|\212, kLFT=\E[u, + kRIT=\E[v, kbs=^H, kcbt=\E[Z, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kf1=\EOm, kf10=\EOd, kf11=\EOe, + kf12=\EOf, kf13=\EOg, kf14=\EOh, kf15=\EOi, kf16=\EOj, + kf2=\EOV, kf3=\EOu, kf4=\ENj, kf5=\ENe, kf6=\ENf, kf7=\ENh, + kf8=\E[H, kf9=\EOc, kind=\E[S, kri=\E[T, ll=\E#2, mc0=\E[0i, + mc4=\E[?8i, mc5=\E[?4i, mgc=\E:, nel=\EE, + pln=\E[%p1%dp%p2%:-16s, rc=\E8, ri=\EM, rmacs=^O, + rmir=\E[4l, rmkx=\E[19;0|, rmln=\E<, rmxon=\E[29;1|, + rs2=\E[5;0|, sc=\E7, + sgr=\E[0%?%p5%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1%|%p6 + %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smgl=\E4, smgr=\E5, smir=\E[4h, + smkx=\E[19;1|, smln=\E?, smxon=\E[29;0|, + vpa=\E[%p1%{1}%+%dd, use=ansi+cpr, use=ansi+idl, + use=ansi+local, use=ansi+rep, use=ansi+sgrbold, + use=ansi+tabs, use=ecma+index, + +# (att500: I merged this with the att513 entry, att500 just used att513 -- esr) +att500|att513|AT&T 513 using page mode, + am, chts, mir, msgr, xenl, xon, + cols#80, lh#2, lines#24, lw#8, nlab#8, + acsc=+g\,h-f.e`bhrisjjkkllmmnnqqttuuvvwwxx{{||}}~~, + bel=^G, bold=\E[2;7m, cnorm=\E[11;0|, cr=\r, + csr=%i\E[%p1%d;%p2%dr, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E[11;1|, dch=\E[%p1%dP, + dch1=\E[P$<1>, dim=\E[2m, el1=\E[1K, enacs=\E(B\E)1, + home=\E[H, hpa=\E[%p1%{1}%+%dG, ich=\E[%p1%d@, ind=\n, + indn=\E[%p1%dE, + is1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l, + kBEG=\ENB, kCAN=\EOW, kCMD=\EOU, kCPY=\END, kCRT=\EON, + kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kEXT=\EOK, + kFND=\EOX, kHLP=\EOM, kHOM=\ENM, kIC=\ENJ, kLFT=\ENK, + kMOV=\ENC, kMSG=\EOL, kNXT=\ENH, kOPT=\EOR, kPRT=\EOZ, + kPRV=\ENG, kRDO=\EOT, kRES=\EOQ, kRIT=\ENL, kRPL=\EOY, + kSAV=\EOO, kSPD=\EOP, kUND=\EOS, kbeg=\E9, kcan=\EOw, + kcbt=\E[Z, kclo=\EOV, kclr=\E[J, kcmd=\EOu, kcpy=\ENd, + kcrt=\EOn, kdch1=\ENf, kdl1=\ENe, kel=\EOa, kend=\E0, + kent=\Eent, kext=\EOk, kf1=\EOc, kf2=\EOd, kf3=\EOe, + kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, kfnd=\EOx, + khlp=\EOm, kich1=\ENj, kind=\E[S, kmov=\ENc, kmrk=\ENi, + kmsg=\EOl, knp=\E[U, knxt=\ENh, kopn=\EOv, kopt=\EOr, + kpp=\E[V, kprt=\EOz, kprv=\ENg, krdo=\EOt, kref=\EOb, + kres=\EOq, krfr=\ENa, kri=\E[T, krpl=\EOy, krst=\EOB, + ksav=\EOo, kslt=\ENI, kspd=\EOp, kund=\EOs, ll=\E#2, + mc0=\E[?98l\E[0i, mc4=\E[?98l\E[?8i, mc5=\E[?98l\E[?4i, + nel=\EE, + pfkey=\E[%p1%d;%p2%l%d;3;0p\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s + \s%p2%s, + pfloc=\E[%p1%d;%p2%l%d;2;0p\s\s\sF%p1%d\s\s\s\s\s\s\s\s\s\s + \s%p2%s, + pfx=\E[%p1%d;%p2%l%d;1;0p F%p1%d %p2%s, + pln=\E[%p1%dp%p2%:-16s, rc=\E8, ri=\EM, rin=\E[%p1%dF, + rmacs=^O, rmir=\E[4l, rmkx=\E[19;0|\E[21;1|\212, + rmln=\E<, + rs1=\E?\E[3;3|\E[10;0|\E[21;1|\212\E[6;1|\E[1{\E[?99l\E[2;0| + \E[6;1|\E[8;0|\E[19;0|\E[1{\E[?99l, + rs2=\E[5;0|, sc=\E7, + sgr=\E[0%?%p1%p5%|%p6%|%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%p6%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smir=\E[4h, + smkx=\E[19;1|\E[21;4|\Eent, smln=\E?, + vpa=\E[%p1%{1}%+%dd, use=ansi+arrows, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=ansi+rep, + use=ansi+sgrbold, use=ansi+tabs, use=decid+cpr, + +# 01-07-88: +# printer must be set to EMUL ANSI to accept ESC codes +# stops at top margin +# sets cpi 10,lpi 6,form 66,left 1,right 132,top 1,bottom 66,font +# and alt font ascii,wrap on,tabs cleared +# disables newline on LF,Emphasized off +# The capability sets form length +att5310|att5320|AT&T Model 53210 or 5320 matrix printer, + xhpa, xvpa, + bufsz#0x2000, cols#132, cps#120, it#8, lines#66, orc#10, + orhi#100, orl#12, orvi#72, + cpi=%?%p1%{10}%=%t\E[w%e%p1%{12}%=%t\E[2w%e%p1%{5}%=%t\E[5w + %e%p1%{13}%=%p1%{14}%=%O%t\E[3w%e%p1%{16}%=%p1%{17}%=%O + %t\E[4w%e%p1%{6}%=%t\E[6w%e%p1%{7}%=%t\E[7w%e%p1%{8}%=%t + \E[8w%;, + cr=\r, + csnm=%?%p1%{0}%=%tusascii%e%p1%{1}%=%tenglish%e%p1%{2}%=%tfi + nnish%e%p1%{3}%=%tjapanese%e%p1%{4}%=%tnorwegian%e%p1 + %{5}%=%tswedish%e%p1%{6}%=%tgermanic%e%p1%{7}%=%tfrench + %e%p1%{8}%=%tcanadian_french%e%p1%{9}%=%titalian%e%p1 + %{10}%=%tspanish%e%p1%{11}%=%tline%e%p1%{12}%=%tsecurit + y%e%p1%{13}%=%tebcdic%e%p1%{14}%=%tapl%e%p1%{15}%=%tmos + aic%;, + cud=\E[%p1%de, cud1=\n, cuf=\E[%p1%da, cuf1=\s, cuu1=\EM, + ff=^L, hpa=\E[%p1%d`, ht=^I, is1=\Ec, is2=\E[20l\r, + lpi=%?%p1%{2}%=%t\E[4z%e%p1%{3}%=%t\E[5z%e%p1%{4}%=%t\E[6z%e + %p1%{6}%=%t\E[z%e%p1%{8}%=%t\E[2z%e%p1%{12}%=%t\E[3z%;, + rshm=\E[m, + scs=%?%p1%{0}%=%t\E(B%e%p1%{1}%=%t\E(A%e%p1%{2}%=%t\E(C%e%p1 + %{3}%=%t\E(D%e%p1%{4}%=%t\E(E%e%p1%{5}%=%t\E(H%e%p1%{6} + %=%t\E(K%e%p1%{7}%=%t\E(R%e%p1%{8}%=%t\E(Q%e%p1%{9}%=%t + \E(Y%e%p1%{10}%=%t\E(Z%e%p1%{11}%=%t\E(0%e%p1%{12}%=%t + \E(1%e%p1%{13}%=%t\E(3%e%p1%{14}%=%t\E(8%e%p1%{15}%=%t + \E(}%;, + smgbp=\E[;%p1%dr, smglp=\E[%{1}%p1%+%ds, + smgrp=\E[;%{1}%p1%+%ds, smgtp=\E[%p1%dr, sshm=\E[5m, + u0=\E[%p1%dt, vpa=\E[%p1%dd, + +# Teletype 5620, firmware version 1.1 (8;7;3) or earlier from BRL +# The following SET-UP modes are assumed for normal operation: +# CR_DEF=CR NL_DEF=INDEX DUPLEX=FULL +# Other SET-UP modes may be set for operator convenience or communication +# requirements. This termcap description is for the Resident Terminal Mode. +# No delays specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +# The BRL entry also said: UNSAFE :ll=\E[70H: +att5620-1|tty5620-1|dmd1|Teletype 5620 with old ROMs, + am, xon, + cols#88, it#8, lines#70, vt#3, + bel=^G, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, home=\E[H, ht=^I, ich=\E[%p1%d@, + ich1=\E[@, ind=\n, kclr=\E[2J, kll=\E[70;1H, nel=\r\n, + rc=\E8, ri=\E[T, rs1=\Ec, sc=\E7, use=ansi+arrows, + use=ansi+erase, use=ansi+idl, use=ansi+local1, + use=ecma+index, + +# 5620 terminfo (2.0 or later ROMS with char attributes) +# The following SET-UP modes are assumed for normal operation: +# DUPLEX=FULL GEN_FLOW=ON NEWLINE=INDEX RETURN=CR +# Other SET-UP modes may be set for operator convenience or communication +# requirements. This termcap description is for Resident Terminal Mode. No +# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +# assumptions: (scroll forward one line) is only done at screen bottom +# Be aware that older versions of the dmd have a firmware bug that affects +# parameter defaulting; for this terminal, the 0 in \E[0m is not optional. +# is from an otherwise inferior BRL for this terminal. That entry +# also has =\E[70H commented out and marked unsafe. +# For more, see the 5620 FAQ maintained by David Breneman . +att5620|dmd|tty5620|ttydmd|5620|AT&T 5620 terminal 88 columns, + OTbs, am, msgr, npc, xon, + cols#88, it#8, lines#70, + bel=^G, bold=\E[2m, cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, home=\E[H, ht=^I, + ich=\E[%p1%d@, ich1=\E[@, ind=\E[S, kclr=\E[2J, + kll=\E[70;1H, nel=\n, pfx=\E[%p1%d;%p2%l%dq%p2%s, rc=\E8, + rev=\E[7m, ri=\E[T, rmso=\E[0m, rmul=\E[0m, rs1=\Ec, sc=\E7, + sgr0=\E[0m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+erase, use=ansi+idl, use=ansi+local1, + use=ecma+index, + +att5620-24|tty5620-24|dmd-24|Teletype dmd 5620 in a 24x80 layer, + lines#24, use=att5620, +att5620-34|tty5620-34|dmd-34|Teletype dmd 5620 in a 34x80 layer, + lines#34, use=att5620, +# 5620 layer running the "S" system's downloaded graphics handler: +att5620-s|tty5620-s|layer|vitty|AT&T 5620 S layer, + OTbs, OTpt, am, + cols#80, it#8, lines#72, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, + cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=^K, dl1=\ED, + el=\EK, flash=\E^G, ht=^I, il1=\EI, ind=\n, kclr=\E[2J, + khome=\E[H, kll=\E[70;1H, use=ansi+arrows, + +# Entries for thru refer to the shifted system pf keys. +# +# Entries for thru refer to the alternate keypad mode +# keys: = * / + 7 8 9 - 4 5 6 , 1 2 3 0 . ENTER +att605|AT&T 605 80 column 102key keyboard, + am, eo, xon, + cols#80, lines#24, lw#8, nlab#8, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[M, + el1=\E[1K, fsl=\E8, ht=^I, il1=\E[L, ind=\n, invis=\E[8m, + is1=\E[8;0|\E[?\E[13;20l\E[?\E[12h, is2=\E[m\017, + kLFT=\E[ A, kRIT=\E[ @, kcbt=\E[Z, kclr=\E[2J, kdch1=\E[P, + kdl1=\E[M, kend=\E[24;1H, kf1=\EOc, kf10=\ENp, kf11=\ENq, + kf12=\ENr, kf13=\ENs, kf14=\ENt, kf15=\EOC, kf16=\EOD, + kf17=\EOE, kf18=\EOF, kf19=\EOG, kf2=\EOd, kf20=\EOH, + kf21=\EOI, kf22=\EOJ, kf23=\ENO, kf24=\ENP, kf25=\ENQ, + kf26=\ENR, kf27=\ENS, kf28=\ENT, kf29=\EOP, kf3=\EOe, + kf30=\EOQ, kf31=\EOR, kf32=\EOS, kf33=\EOw, kf34=\EOx, + kf35=\EOy, kf36=\EOm, kf37=\EOt, kf38=\EOu, kf39=\EOv, + kf4=\EOf, kf40=\EOl, kf41=\EOq, kf42=\EOr, kf43=\EOs, + kf44=\EOp, kf45=\EOn, kf46=\EOM, kf5=\EOg, kf6=\EOh, + kf7=\EOi, kf8=\EOj, kf9=\ENo, kich1=\E[@, kil1=\E[L, + kind=\E[S, knp=\E[U, kpp=\E[V, ll=\E[24H, mc4=\E[?4i, + mc5=\E[?5i, nel=\EE, + pfx=\E[%p1%d;%p2%l%02dq F%p1%1d %p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, rc=\E8, rev=\E[7m, + rmacs=^O, rmln=\E[2p, rmso=\E[m, rmul=\E[m, rs2=\Ec\E[?3l, + sc=\E7, sgr0=\E[m\017, smacs=\E)0\016, smln=\E[p, + smso=\E[7m, smul=\E[4m, tsl=\E7\E[25;%i%p1%dx, + use=ansi+arrows, use=ansi+cpr, use=ansi+erase, + use=ansi+idc, use=ansi+local1, + +att605-pc|AT&T 605 in pc term mode, + acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x + \263, + cub1=\E[D, kend=\E[F, kf1=\E[M, kf10=\E[V, kf2=\E[N, + kf3=\E[O, kf4=\E[P, kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, + kf9=\E[U, knp=\E[G, kpp=\E[I, rmsc=\E[50;0|$<400>, + smsc=\E[?11l\E[50;1|$<250>, xoffc=g, xonc=e, use=att605, +att605-w|AT&T 605-w 132 column 102 key keyboard, + cols#132, wsl#132, + is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h\E(B\E)0, use=att605, +# (att610: I added / based on the init string. I also +# added and because the BSD file says the att615s have them, +# and the 615 is like a 610 with a big keyboard, and most of their other +# smart terminals support the same sequence -- esr) +att610|AT&T 610; 80 column; 98key keyboard, + am, eslok, hs, mir, msgr, xenl, xon, + cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cbt=\E[Z, cr=\r, cub1=^H, cvvis=\E[?12;25h, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, el1=\E[1K, + flash=\E[?5h$<200>\E[?5l, fsl=\E8, ht=^I, ich=\E[%p1%d@, + ind=\ED, + is1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)0, + is2=\E[m\017, is3=\E(B\E)0, kLFT=\E[ @, kRIT=\E[ A, + kcbt=\E[Z, kclr=\E[2J, kf1=\EOc, kf10=\ENp, kf11=\ENq, + kf12=\ENr, kf13=\ENs, kf14=\ENt, kf2=\EOd, kf3=\EOe, + kf4=\EOf, kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\ENo, + kind=\E[S, kri=\E[T, ll=\E[24H, mc4=\E[?4i, mc5=\E[?5i, + nel=\EE, + pfx=\E[%p1%d;%p2%l%02dq F%p1%1d %p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, ri=\EM, rmacs=^O, + rmam=\E[?7l, rmir=\E[4l, rmln=\E[2p, rs2=\Ec\E[?3l, + sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, + smln=\E[p, tsl=\E7\E[25;%i%p1%dx, use=ansi+arrows, + use=ansi+csr, use=ansi+cup, use=ansi+erase, use=ansi+idl, + use=ansi+local, use=ansi+sgrbold, use=decid+cpr, + use=ecma+index, use=att610+cvis, + +att610-w|AT&T 610; 132 column; 98key keyboard, + cols#132, wsl#132, + is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h, + use=att610, + +att610-103k|AT&T 610; 80 column; 103key keyboard, + kBEG=\ENB, kCAN=\EOW, kCMD=\EOU, kCPY=\END, kCRT=\EON, + kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kEXT=\EOK, + kFND=\EOX, kHLP=\EOM, kMOV=\ENC, kMSG=\EOL, kNXT=\ENH, + kOPT=\EOR, kPRT=\EOZ, kPRV=\ENG, kRDO=\EOT, kRES=\EOQ, + kRPL=\EOY, kSAV=\EOO, kSPD=\EOP, kUND=\EOS, kbeg=\E9, + kcan=\EOw, kclo=\EOV, kcmd=\EOu, kcpy=\ENd, kcrt=\EOn, + kdch1=\ENf, kdl1=\ENe, kel=\EOa, kend=\E0, kent=\r, + kext=\EOk, kf10@, kf11@, kf12@, kf13@, kf14@, kf9@, kfnd=\EOx, + khlp=\EOm, kich1=\ENj, kmov=\ENc, kmrk=\ENi, kmsg=\EOl, + knp=\E[U, knxt=\ENh, kopn=\EOv, kopt=\EOr, kpp=\E[V, + kprt=\EOz, kprv=\ENg, krdo=\EOt, kref=\EOb, kres=\EOq, + krfr=\ENa, krmir=\ENj, krpl=\EOy, krst=\EOB, ksav=\EOo, + kslt=\ENI, kspd=\EOp, kund=\EOs, use=att610, +att610-103k-w|AT&T 610; 132 column; 103key keyboard, + cols#132, wsl#132, + is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h, + use=att610-103k, +att615|AT&T 615; 80 column; 98key keyboard, + kLFT=\E[ A, kRIT=\E[ @, kf15=\EOC, kf16=\EOD, kf17=\EOE, + kf18=\EOF, kf19=\EOG, kf20=\EOH, kf21=\EOI, kf22=\EOJ, + kf23=\ENO, kf24=\ENP, kf25=\ENQ, kf26=\ENR, kf27=\ENS, + kf28=\ENT, kf29=\EOP, kf30=\EOQ, kf31=\EOR, kf32=\EOS, + kf33=\EOw, kf34=\EOx, kf35=\EOy, kf36=\EOm, kf37=\EOt, + kf38=\EOu, kf39=\EOv, kf40=\EOl, kf41=\EOq, kf42=\EOr, + kf43=\EOs, kf44=\EOp, kf45=\EOn, kf46=\EOM, use=att610, +att615-w|AT&T 615; 132 column; 98key keyboard, + kLFT=\E[ A, kRIT=\E[ @, kf15=\EOC, kf16=\EOD, kf17=\EOE, + kf18=\EOF, kf19=\EOG, kf20=\EOH, kf21=\EOI, kf22=\EOJ, + kf23=\ENO, kf24=\ENP, kf25=\ENQ, kf26=\ENR, kf27=\ENS, + kf28=\ENT, kf29=\EOP, kf30=\EOQ, kf31=\EOR, kf32=\EOS, + kf33=\EOw, kf34=\EOx, kf35=\EOy, kf36=\EOm, kf37=\EOt, + kf38=\EOu, kf39=\EOv, kf40=\EOl, kf41=\EOq, kf42=\EOr, + kf43=\EOs, kf44=\EOp, kf45=\EOn, kf46=\EOM, use=att610-w, +att615-103k|AT&T 615; 80 column; 103key keyboard, + kLFT=\E[ A, kRIT=\E[ @, use=att610-103k, +att615-103k-w|AT&T 615; 132 column; 103key keyboard, + kLFT=\E[ A, kRIT=\E[ @, use=att610-103k-w, +# (att620: I added / based on the init string and +# / from a BSD termcap -- esr) +att620|AT&T 620; 80 column; 98key keyboard, + am, eslok, hs, mir, msgr, xenl, xon, + cols#80, it#8, lh#2, lines#24, lw#8, nlab#8, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cbt=\E[Z, cr=\r, cub1=^H, cvvis=\E[?12;25h, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, el1=\E[1K, + flash=\E[?5h$<200>\E[?5l, fsl=\E8, ht=^I, ich=\E[%p1%d@, + ind=\ED, + is1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h, + is2=\E[m\017, is3=\E(B\E)0, kLFT=\E[ A, kRIT=\E[ @, + kcbt=\E[Z, kclr=\E[2J, kf1=\EOc, kf10=\ENp, kf11=\ENq, + kf12=\ENr, kf13=\ENs, kf14=\ENt, kf15=\EOC, kf16=\EOD, + kf17=\EOE, kf18=\EOF, kf19=\EOG, kf2=\EOd, kf20=\EOH, + kf21=\EOI, kf22=\EOJ, kf23=\ENO, kf24=\ENP, kf25=\ENQ, + kf26=\ENR, kf27=\ENS, kf28=\ENT, kf29=\EOP, kf3=\EOe, + kf30=\EOQ, kf31=\EOR, kf32=\EOS, kf33=\EOw, kf34=\EOx, + kf35=\EOy, kf36=\EOm, kf37=\EOt, kf38=\EOu, kf39=\EOv, + kf4=\EOf, kf40=\EOl, kf41=\EOq, kf42=\EOr, kf43=\EOs, + kf44=\EOp, kf45=\EOn, kf46=\EOM, kf5=\EOg, kf6=\EOh, + kf7=\EOi, kf8=\EOj, kf9=\ENo, kind=\E[S, kri=\E[T, ll=\E[24H, + mc4=\E[?4i, mc5=\E[?5i, nel=\EE, + pfx=\E[%p1%d;%p2%l%02dq F%p1%1d %p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, ri=\EM, + rmacs=\E(B\017, rmam=\E[?7l, rmir=\E[4l, rmln=\E[2p, + rs2=\Ec\E[?3l, + sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%t;7%;%?%p7%t;8%;m%?%p9%t\E)0\016%e\E(B\017%;, + sgr0=\E[m\E(B\017, smacs=\E)0\016, smam=\E[?7h, + smir=\E[4h, smln=\E[p, tsl=\E7\E[25;%i%p1%dx, + use=ansi+arrows, use=ansi+csr, use=ansi+cup, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ansi+sgrbold, use=decid+cpr, use=ecma+index, + use=att610+cvis, + +att620-w|AT&T 620; 132 column; 98key keyboard, + cols#132, wsl#132, + is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h, + use=att620, +att620-103k|AT&T 620; 80 column; 103key keyboard, + kBEG=\ENB, kCAN=\EOW, kCMD=\EOU, kCPY=\END, kCRT=\EON, + kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kEXT=\EOK, + kFND=\EOX, kHLP=\EOM, kMOV=\ENC, kMSG=\EOL, kNXT=\ENH, + kOPT=\EOR, kPRT=\EOZ, kPRV=\ENG, kRDO=\EOT, kRES=\EOQ, + kRPL=\EOY, kSAV=\EOO, kSPD=\EOP, kUND=\EOS, kbeg=\E9, + kcan=\EOw, kclo=\EOV, kcmd=\EOu, kcpy=\ENd, kcrt=\EOn, + kdch1=\ENf, kdl1=\ENe, kel=\EOa, kend=\E0, kent=\r, + kext=\EOk, kf10@, kf11@, kf12@, kf13@, kf14@, kf15@, kf16@, kf17@, + kf18@, kf19@, kf20@, kf21@, kf22@, kf23@, kf24@, kf25@, kf26@, kf27@, + kf28@, kf29@, kf30@, kf31@, kf32@, kf33@, kf34@, kf35@, kf36@, kf37@, + kf38@, kf39@, kf40@, kf41@, kf42@, kf43@, kf44@, kf45@, kf46@, kf9@, + kfnd=\EOx, khlp=\EOm, kich1=\ENj, kmov=\ENc, kmrk=\ENi, + kmsg=\EOl, knp=\E[U, knxt=\ENh, kopn=\EOv, kopt=\EOr, + kpp=\E[V, kprt=\EOz, kprv=\ENg, krdo=\EOt, kref=\EOb, + kres=\EOq, krfr=\ENa, krmir=\ENj, krpl=\EOy, krst=\EOB, + ksav=\EOo, kslt=\ENI, kspd=\EOp, kund=\EOs, use=att620, + +att620-103k-w|AT&T 620; 132 column; 103key keyboard, + cols#132, wsl#132, + is1=\E[8;0|\E[?4;5;13;15l\E[13;20l\E[?3;7h\E[12h, + use=att620-103k, + +# AT&T (formerly Teletype) 630 Multi-Tasking Graphics terminal +# The following SETUP modes are assumed for normal operation: +# Local_Echo=Off Gen_Flow=On Return=CR Received_Newline=LF +# Font_Size=Large Non-Layers_Window_Cols=80 +# Non-Layers_Window_Rows=60 +# Other SETUP modes may be set for operator convenience or communication +# requirements. Some capabilities assume a printer attached to the Aux EIA +# port. This termcap description is for the Fixed Non-Layers Window. No +# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +# (att630: added , and from a BSD termcap file -- esr) +att630|AT&T 630 windowing terminal, + OTbs, am, da, db, mir, msgr, npc, xon, + cols#80, it#8, lines#60, lm#0, + bel=^G, blink=\E[5m, cbt=\E[Z, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dim=\E[2m, el1=\E[1K, home=\E[H, + ht=^I, ind=\ED, is2=\E[m, kcbt=\E[Z, kclr=\E[2J, kdch1=\E[P, + kdl1=\E[M, kent=\r, kf10=\ENp, kf11=\ENq, kf12=\ENr, + kf13=\ENs, kf14=\ENt, kf15=\ENu, kf16=\ENv, kf17=\ENw, + kf18=\ENx, kf19=\ENy, kf20=\ENz, kf21=\EN{, kf22=\EN|, + kf23=\EN}, kf24=\EN~, kf9=\ENo, kich1=\E[@, kil1=\E[L, + mc4=\E[?4i, mc5=\E[?5i, nel=\r\n, + pfx=\E[%p1%d;%p2%l%dq%p2%s, rc=\E8, rev=\E[7m, ri=\EM, + rmso=\E[m, rmul=\E[m, rs2=\Ec, sc=\E7, + sgr=\E[0%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%|%p4%|%t;7 + %;m, + sgr0=\E[m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+cpr, use=ansi+erase, use=ansi+idc, use=ansi+idl, + use=ansi+local, use=ecma+index, + +att630-24|5630-24|5630DMD-24|630MTG-24|AT&T 630 windowing terminal 24 lines, + lines#24, use=att630, + +# This is the att700 entry for 700 native emulation of the AT&T 700 +# terminal. Comments are relative to changes from the 605V2 entry and +# att730 on which the entry is based. Comments show the terminfo +# capability name, termcap name, and description. +# +# Here is what's going onm in the init string: +# ESC [ 50;4| set 700 native mode (really is 605) +# x ESC [ 56;ps| set lines to 24: ps=0; 40: ps=1 (plus status line) +# ESC [ 53;0| set GenFlow to Xon/Xoff +# ESC [ 8 ;0| set CR on NL +# x ESC [ ? 3 l/h set workspace: 80 col(l); 132 col(h) +# ESC [ ? 4 l jump scroll +# ESC [ ? 5 l/h video: normal (l); reverse (h) +# ESC [ ?13 l Labels on +# ESC [ ?15 l parity check = no +# ESC [ 13 l monitor mode off +# ESC [ 20 l LF on NL (not CRLF on NL) +# ESC [ ? 7 h autowrap on +# ESC [ 12 h local echo off +# ESC ( B GO = ASCII +# ESC ) 0 G1 = Special Char & Line Drawing +# ESC [ ? 31 l Set 7 bit controls +# +# Note: Most terminals, especially the 600 family use Reverse Video for +# standout mode. DEC also uses reverse video. The VT100 uses bold in addition +# Assume we should stay with reverse video for 70.. However, the 605V2 exits +# standout mode with \E[m (all normal attributes). The 730 entry simply +# exits reverse video which would leave other current attributes intact. It +# was assumed the 730 entry to be more correct so rmso has changed. The +# 605V2 has no sequences to turn individual attributes off, thus its setting +# and the rmso/smso settings from the 730. +# +# Note: For the same reason as above in rmso I changed exit under-score mode +# to specifically turn off underscore, rather than return to all normal +# attributes +# +# Note: The following pkey_xmit is taken from the 605V2 which contained the +# capability as pfxl. It was changed here to pfx since pfxl +# will only compile successfully with Unix 4.0 tic. Also note that pfx only +# allows strings to be parameters and label values must be programmed as +# constant strings. Supposedly the pfxl of Version 4.0 allows both labels +# and strings to be parameters. The 605V2 pfx entry should be examined later +# in this regard. For reference the 730 pfxl entry is shown here for comparison +# 730 pfx entry: +# pfxl=\E[%?%p1%{25}%<%t%p1%e%p1%{24}%-%;%d;%p2%l%02d%?%p1%{25}%<%tq\s\s\s +# SYS\s\s\s\s\sF%p1%:-2d\s\s%e;0;3q%;%p2%s, +# +# (for 4.0 tic) +# pfxl=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t F%p1%1d %;%p2%s, +# +# (for <4.0 tic) +# pfx=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t F%p1%1d %;%p2%s, +# +# From the AT&T 705 Multi-tasking terminal user's guide Page 8-8,8-9 +# +# Port1 Interface +# +# modular 10 pin Connector +# Left side Right side +# Pin 1 2 3 4 5 6 7 8 9 10 +# +# Key (notch) at bottom +# +# Pin 1 DSR +# 3 DCD +# 4 DTR +# 5 Sig Ground +# 6 RD +# 7 SD +# 8 CTS +# 9 RTS +# 10 Frame Ground +# +# The manual is 189 pages and is loaded with details about the escape codes, +# etc..... Available from AT&T CIC 800-432-6600... +# ask for Document number 999-300-660.. +# +att700|AT&T 700 24x80 column display w/102key keyboard, + am, eslok, hs, mir, msgr, xenl, xon, + cols#80, lh#2, lines#24, lw#8, nlab#8, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, + el1=\E[1K, enacs=\E(B\E)0, flash=\E[?5h$<200>\E[?5l, + fln=4\,4, fsl=\E8, home=\E[H, ich=\E[%p1%d@, ind=\ED, + is2=\E[50;4|\E[53;0|\E[8;0|\E[?4;13;15l\E[13;20l\E[?7h\E[12h + \E(B\E)0\E[?31l\E[0m\017, + is3=\E(B\E)0, kLFT=\E[ A, kRIT=\E[ @, kcbt=\E[Z, + kclr=\E[2J, kdch1=\E[P, kdl1=\E[M, kend=\E[24;1H, kf1=\EOc, + kf10=\ENp, kf11=\ENq, kf12=\ENr, kf13=\ENs, kf14=\ENt, + kf15=\EOC, kf16=\EOD, kf17=\EOE, kf18=\EOF, kf19=\EOG, + kf2=\EOd, kf20=\EOH, kf21=\EOI, kf22=\EOJ, kf23=\ENO, + kf24=\ENP, kf25=\ENQ, kf26=\ENR, kf27=\ENS, kf28=\ENT, + kf29=\EOq, kf3=\EOe, kf30=\EOr, kf31=\EOs, kf32=\EOt, + kf33=\EOu, kf34=\EOv, kf35=\EOw, kf36=\EOx, kf37=\EOy, + kf38=\EOu, kf39=\EOv, kf4=\EOf, kf40=\EOl, kf41=\EOq, + kf42=\EOr, kf43=\EOs, kf44=\EOp, kf45=\EOn, kf46=\EOM, + kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\ENo, kich1=\E[@, + kil1=\E[L, knp=\E[U, kpp=\E[V, ll=\E[24H, nel=\EE, + pfx=\E[%p1%d;%p2%l%02dq%?%p1%{9}%<%t\s\s\sF%p1%1d\s\s\s\s\s + \s\s\s\s\s\s%;%p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, ri=\EM, rmacs=^O, + rmir=\E[4l, rmln=\E[2p, rmso=\E[27m, rmul=\E[24m, + rmxon=\E[53;3|, rs1=\Ec\E[?3;5l\E[56;0|, + sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smir=\E[4h, smln=\E[p, + smxon=\E[53;0|, tsl=\E7\E[99;%i%p1%dx, use=ansi+arrows, + use=ansi+csr, use=ansi+erase, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, use=ansi+rep, + use=ansi+sgrbold, use=decid+cpr, use=dec+pp, + use=att610+cvis0, + +# This entry was modified 3/13/90 by JWE. +# fixes include additions of , correcting , and modification +# of . (See comments below) +# att730 has status line of 80 chars +# These were commented out: , , +# the and up keys are used for shifted system Fkeys +# NOTE: JWE 3/13/90 The 98 key keyboard translation for shift/HOME is +# currently the same as (unshifted HOME or \E[H). On the 102, 102+1 +# and 122 key keyboards, the 730's translation is \E[2J. For consistency +# has been commented out. The user can uncomment if using the +# 102, 102+1, or 122 key keyboards +# kHOM=\E[2J, +# (att730: I added / based on the init string -- esr) +att730|AT&T 730 windowing terminal, + am, da, db, eslok, hs, mir, msgr, npc, xenl, xon, + cols#80, it#8, lh#2, lines#60, lm#0, lw#8, nlab#24, wsl#80, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, cbt=\E[Z, cr=\r, cub1=^H, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[2m, el1=\E[1K, enacs=\E(B\E)0, + flash=\E[?5h$<200>\E[?5l, fsl=\E8, ht=^I, ich=\E[%p1%d@, + ind=\ED, + is1=\E[8;0|\E[?3;4;5;13;15l\E[13;20l\E[?7h\E[12h\E(B\E)B, + is2=\E[m\017, is3=\E(B\E)0, kLFT=\E[ @, kRIT=\E[ A, + kcbt=\E[Z, kclr=\E[2J, kf1=\EOc, kf10=\ENp, kf11=\ENq, + kf12=\ENr, kf13=\ENs, kf14=\ENt, kf15=\ENu, kf16=\ENv, + kf17=\ENw, kf18=\ENx, kf19=\ENy, kf2=\EOd, kf20=\ENz, + kf21=\EN{, kf22=\EN|, kf23=\EN}, kf24=\EN~, kf25=\EOC, + kf26=\EOD, kf27=\EOE, kf28=\EOF, kf29=\EOG, kf3=\EOe, + kf30=\EOH, kf31=\EOI, kf32=\EOJ, kf33=\ENO, kf34=\ENP, + kf35=\ENQ, kf36=\ENR, kf37=\ENS, kf38=\ENT, kf39=\EOU, + kf4=\EOf, kf40=\EOV, kf41=\EOW, kf42=\EOX, kf43=\EOY, + kf44=\EOZ, kf45=\EO[, kf46=\EO\s, kf47=\EO], kf48=\EO\^, + kf5=\EOg, kf6=\EOh, kf7=\EOi, kf8=\EOj, kf9=\ENo, kich1=\E[@, + kil1=\E[L, kind=\E[S, kri=\E[T, mc0=\E[?19h\E[0i, nel=\EE, + pfx=\E[%?%p1%{25}%<%t%p1%e%p1%{24}%-%;%d;%p2%l%02d%?%p1%{25} + %<%tq\s\s\sSYS\s\s\s\s\sF%p1%:-2d\s\s%e;0;3q%;%p2%s, + pfxl=\E[%p1%d;%p2%l%02d;0;0q%p3%:-16.16s%p2%s, + pln=\E[%p1%d;0;0;0q%p2%:-16.16s, ri=\EM, rmacs=^O, + rmam=\E[?7l, rmir=\E[4l, rmln=\E[?13h, rmso=\E[27m, + rmul=\E[24m, rmxon=\E[?21l, rs2=\Ec\E[?3l, + sgr=\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%;%?%p3%p1 + %|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smam=\E[?7h, smir=\E[4h, + smln=\E[?13l, smxon=\E[?21h, swidm=\E#6, + tsl=\E7\E[;%i%p1%dx, use=ansi+arrows, use=ansi+csr, + use=ansi+cup, use=ansi+erase, use=ansi+idl, + use=ansi+local, use=ansi+rep, use=ansi+sgrbold, + use=decid+cpr, use=dec+pp, use=att610+cvis, + +# "MGT" is "Multi-Tasking Graphics Terminal" +att730-41|730MTG-41|AT&T 730-41 windowing terminal, + lines#41, use=att730, +att730-24|730MTG-24|AT&T 730-24 windowing terminal, + lines#24, use=att730, +att730r|730MTGr|AT&T 730 rev video windowing terminal, + flash=\E[?5l$<200>\E[?5h, + is1=\E[8;0|\E[?3;4;13;15l\E[?5h\E[13;20l\E[?7h\E[12h\E(B\E)B, use=att730, +att730r-41|730MTG-41r|AT&T 730r-41 rev video windowing terminal, + lines#41, use=att730r, +att730r-24|730MTGr-24|AT&T 730r-24 rev video windowing terminal, + lines#24, use=att730r, + +# The following represents the screen layout along with the associated +# bezel buttons for the 5430/pt505 terminal. The "kf" designations do +# not appear on the screen but are shown to reference the bezel buttons. +# The "CMD", "MAIL", and "REDRAW" buttons are shown in their approximate +# position relative to the screen. +# +# +# +# +----------------------------------------------------------------+ +# | | +# XXXX | kf0 kf24 | XXXX +# | | +# | | +# XXXX | kf1 kf23 | XXXX +# | | +# | | +# XXXX | kf2 kf22 | XXXX +# | | +# | | +# XXXX | kf3 kf21 | XXXX +# | | +# | | +# XXXX | kf4 kf20 | XXXX +# | | +# | | +# XXXX | kf5 kf19 | XXXX +# | | +# | | +# XXXX | kf6 kf18 | XXXX +# | | +# | | +# XXXX | | XXXX +# | | +# | | +# +----------------------------------------------------------------+ +# +# XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX +# +# Note: XXXX represents the screen buttons +# CMD REDRAW +# +# MAIL +# +# version 1 note: +# The character string sent by key 'kf26' may be user programmable +# to send either \E[16s, or \E[26s. +# The character string sent by key 'krfr' may be user programmable +# to send either \E[17s, or \E[27s. +# +# Depression of the "CMD" key sends \E! (kcmd) +# Depression of the "MAIL" key sends \E[26s (kf26) +# "REDRAW" same as "REFRESH" (krfr) +# +# "kf" functions adds carriage return to output string if terminal is in +# 'new line' mode. +# +# The following are functions not covered in the table above: +# +# Set keyboard character (SKC): \EPn1;Pn2w +# Pn1= 0 Back Space key +# Pn1= 1 Break key +# Pn2= Program char (hex) +# +# Screen Definition (SDF): \E[Pn1;Pn2;Pn3;Pn4;Pn5t +# Pn1= Window number (1-39) +# Pn2-Pn5= Y;X;Y;X coordinates +# +# Screen Selection (SSL): \E[Pnu +# Pn= Window number +# +# Set Terminal Modes (SM): \E[Pnh +# Pn= 3 Graphics mode +# Pn= > Cursor blink +# Pn= < Enter new line mode +# Pn= = Enter reverse insert/replace mode +# Pn= ? Enter no scroll mode +# +# Reset Terminal Mode (RM): \E[Pnl +# Pn= 3 Exit graphics mode +# Pn= > Exit cursor blink +# Pn= < Exit new line mode +# Pn= = Exit reverse insert/replace mode +# Pn= ? Exit no scroll mode +# +# Screen Status Report (SSR): \E[Pnp +# Pn= 0 Request current window number +# Pn= 1 Request current window dimensions +# +# Device Status Report (DSR): \E[6n Request cursor position +# +# Call Status Report (CSR): \E[Pnv +# Pn= 0 Call failed +# Pn= 1 Call successful +# +# Transparent Button String (TBS): \E[Pn1;Pn2;Pn3;{string +# Pn1= Button number to be loaded +# Pn2= Character count of "string" +# Pn3= Key mode being loaded: +# 0= Unshifted +# 1= Shifted +# 2= Control +# String= Text string (15 chars max) +# +# Screen Number Report (SNR): \E[Pnp +# Pn= Screen number +# +# Screen Dimension Report (SDR): \E[Pn1;Pn2r +# Pn1= Number of rows available in window +# Pn2= Number of columns available in window +# +# Cursor Position Report (CPR): \E[Pn1;Pn2R +# Pn1= "Y" Position of cursor +# Pn2= "X" Position of cursor +# +# Request Answer Back (RAB): \E[c +# +# Answer Back Response (ABR): \E[?;*;30;VSV +# *= 0 No printer available +# *= 2 Printer available +# V= Software version number +# SV= Software sub version number +# (printer-available field not documented in v1) +# +# Screen Alignment Aid: \En +# +# Bell (lower pitch): \E[x +# +# Dial Phone Number: \EPdstring\ +# string= Phone number to be dialed +# +# Set Phone Labels: \EPpstring\ +# string= Label for phone buttons +# +# Set Clock: \EPchour;minute;second\ +# +# Position Clock: \EPsY;X\ +# Y= "Y" coordinate +# X= "X" coordinate +# +# Delete Clock: \Epr\ +# +# Programming The Function Buttons: \EPfPn;string\ +# Pn= Button number (00-06, 18-24) +# (kf00-kf06, kf18-kf24) +# string= Text to sent on button depression +# +# The following in version 2 only: +# +# Request For Local Directory Data: \EPp12;\ +# +# Local Directory Data to host: \EPp11;LOCAL...DIRECTORY...DATA\ +# +# Request for Local Directory Data in print format: \EPp13;\ +# +# Enable 'Prt on Line' mode: \022 (DC2) +# +# Disable 'Prt on Line' mode: \024 (DC4) +# + +# 05-Aug-86: +# The following Terminfo entry describes functions which are supported by +# the AT&T 5430/pt505 terminal software version 2 and later. +att505|pt505|att5430|gs5430|AT&T Personal Terminal 505 or 5430 GETSET terminal, + am, xon, + cols#80, it#8, lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H, + cnorm=\E[>l, cr=\r, cup=\E[%p1%d;%p2%dH, cvvis=\E[>h, + dch=\E[%p1%dP, dch1=\E[P, ed=\E[0J, el=\E[0K, el1=\E[2K, + home=\E[H, ht=^I, ind=\n, + is1=\EPr\\E[0u\E[2J\E[0;0H\E[m\E[3l\E[l\E[=l\E[?l, + kbs=^H, kcmd=\E!, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, kf0=\E[00s, kf1=\E[01s, kf18=\E[18s, + kf19=\E[19s, kf2=\E[02s, kf20=\E[20s, kf21=\E[21s, + kf22=\E[22s, kf23=\E[23s, kf24=\E[24s, kf26=\E[26s, + kf3=\E[03s, kf4=\E[04s, kf5=\E[05s, kf6=\E[06s, + krfr=\E[27s, mc4=\E[4i, mc5=\E[5i, rc=\E8, rev=\E[7m, + rmacs=\E[10m, rmam=\E[11;1j, rmir=\E[4l, rmso=\E[m, + rmul=\E[m, rs1=\Ec, sc=\E7, sgr0=\E[m, smacs=\E[11m, + smam=\E[11;0j, smir=\E[4h, smso=\E[1m, smul=\E[4m, + use=ansi+cpr, use=ansi+idl, use=ansi+local, + +# The following Terminfo entry describes functions which are supported by +# the AT&T 5430/pt505 terminal software version 1. +att505-24|pt505-24|gs5430-24|AT&T PT505 or 5430 GETSET version 1 24 lines, + lines#24, + mc4@, mc5@, rc@, rmam@, sc@, smam@, use=att505, +att505-22|pt505-22|gs5430-22|AT&T PT505 or 5430 GETSET version 1 22 lines, + lines#22, use=att505, +# +#### ------------------ TERMINFO FILE CAN BE SPLIT HERE --------------------- +# This cut mark helps make life less painful for people running ncurses tic +# on machines with relatively little RAM. The file can be broken in half here +# cleanly and compiled in sections -- no `use' references cross this cut +# going forward. +# + +#### Ampex (Dialogue) +# +# Yes, these are the same people who are better-known for making audio- and +# videotape. I'm told they are located in Redwood City, CA. +# + +# From: Fri Sep 11 22:38:32 1981 +# (ampex80: some capabilities merged in from SCO's entry -- esr) +ampex80|a80|d80|dialogue|dialogue80|Ampex dialogue 80, + OTbs, am, bw, ul, + cols#80, it#8, lines#24, + bel=^G, cbt=\EI, clear=\E*$<75>, cr=\r, cub1=^H, cud1=\n, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW, dl1=\ER$<5*>, ed=\Ey, el=\Et, ht=^I, hts=\E1, + ich1=\EQ, il1=\EE$<5*>, ind=\n, is2=\EA, rmso=\Ek, rmul=\Em, + smso=\Ej, smul=\El, tbc=\E3, +# This entry was from somebody anonymous, Tue Aug 9 20:11:37 1983, who wrote: +ampex175|Ampex d175, + am, + cols#80, lines#24, + bel=^G, clear=\E+, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\Ey, el=\Et, home=^^, ich1=\EQ, il1=\EE, ind=\n, + is2=\EX\EA\EF, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, + kdch1=\EW, kdl1=\ER, khome=^^, kich1=\EQ, kil1=\EE, ll=^^^K, + rmcup=\EF, rmso=\Ek, rmul=\Em, smcup=\EN, smso=\Ej, smul=\El, +# No backspace key in the main QWERTY cluster. Fortunately, it has a +# NEWLINE/PAGE key just above RETURN that sends a strange single-character +# code. Given a suitable Unix (one that lets you set an echo-erase-as-BS-SP-BS +# mode), this key can be used as the erase key; I find I like this. Because +# some people and some systems may not, there is another termcap ("ampex175") +# that suppresses this little eccentricity by omitting the relevant capability. +ampex175-b|Ampex d175 using left arrow for erase, + kbs=^_, use=ampex175, +# From: Richard Bascove +# (ampex210: removed obsolete ":kn#10:" -- esr) +ampex210|a210|Ampex a210, + OTbs, am, hs, xenl, + cols#80, it#8, lines#24, xmc#1, + cbt=\EI, clear=\E*, cub1=^H, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\Ey, el=\Et, flash=\EU\EX\EU\EX\EU\EX\EU\EX, + fsl=\E.2, home=^^, ht=^I, ich1=\EQ, + if=/usr/share/tabset/std, il1=\EE, invis@, + is2=\EC\Eu\E'\E(\El\EA\E%\E{\E.2\EG0\Ed\En, kcub1=^H, + kcud1=^V, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A1\r, + kf2=^A2\r, kf3=^A3\r, kf4=^A4\r, kf5=^A5\r, kf6=^A6\r, + kf7=^A7\r, kf8=^A8\r, kf9=^A9\r, khome=^^, + tsl=\E.0\Eg\E}\Ef, use=adm+sgr, +# (ampex219: I added / based on the init string, added +# from ampex219w, added =\E[?3l, irresistibly suggested by , +# and moved the padding to be *after* the caps -- esr) +ampex219|ampex-219|amp219|Ampex with automargins, + hs, xenl, + cols#80, it#8, lines#24, + bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>, cbt=\E[Z, + clear=\E[H\E[2J$<50>, cnorm=\E[?3l, cr=\r, + csr=%i\E[%p1%2d;%p2%2dr, cub1=^H, cud1=\E[B, + cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>, + cuu1=\E[A$<2>, cvvis=\E[?3h, dim=\E[1m, ed=\E[J$<50>, + el=\E[K$<3>, home=\E[H, ht=^I, ind=\n, + is2=\E>\E[?1l\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\E[21~, + kf1=\E[7~, kf2=\E[8~, kf3=\E[9~, kf4=\E[10~, kf5=\E[11~, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, khome=\E[H, + rev=\E[7m, ri=\EM$<5>, rmam=\E[?7l, rmkx=\E>, + rmso=\E[m$<2>, rmul=\E[m$<2>, sgr0=\E[m$<2>, smam=\E[?7h, + smkx=\E=, smso=\E[7m$<2>, smul=\E[4m$<2>, +ampex219w|ampex-219w|amp219w|Ampex 132 cols, + cols#132, + cud1=\n, is2=\E>\E[?3h\E[?4l\E[?5l\E[?7h\E[?8h, + use=ampex219, +# (ampex232: removed , no file and no --esr) +ampex232|ampex-232|Ampex Model 232, + am, + cols#80, lines#24, xmc#1, + cbt=\EI, civis=\E.0, clear=\E+, cnorm=\E.4, cub1=^H, cud1=^V, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW, dl1=\ER$<5*/>, ed=\EY, el=\ET, + flash=\Eb$<200/>\Ed, ht=^I, ich1=\EQ, il1=\EE$<5*/>, + invis@, is2=\Eg\El, kbs=^H, kcub1=^H, kcud1=^V, kcuf1=^L, + kcuu1=^K, kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r, + kf4=^AD\r, kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, + kf9=^AI\r, khome=^^, use=adm+sgr, +# (ampex: removed , no file and no -- esr) +ampex232w|Ampex Model 232 / 132 columns, + cols#132, + is2=\E\034Eg\El, use=ampex232, + +#### Ann Arbor (aa) +# +# Ann Arbor made dream terminals for hackers -- large screen sizes and huge +# numbers of function keys. At least some used monitors in portrait mode, +# allowing up to 76-character screen heights! They were reachable at: +# +# Ann Arbor Terminals +# 6175 Jackson Road +# Ann Arbor, MI 48103 +# (313)-663-8000 +# +# But in 1996 the phone number reaches some kitschy retail shop, and Ann Arbor +# can't be found on the Web; I fear they're long dead. R.I.P. +# + + +# Originally from Mike O'Brien@Rand and Howard Katseff at Bell Labs. +# Highly modified 6/22 by Mike O'Brien. +# split out into several for the various screen sizes by dave-yost@rand +# Modifications made 3/82 by Mark Horton +# Modified by Tom Quarles at UCB for greater efficiency and more diversity +# status line moved to top of screen, removed 5/82 +# Some unknown person at SCO then hacked the init strings to make them more +# efficient. +# +# assumes the following setup: +# A menu: 0000 1010 0001 0000 +# B menu: 9600 0100 1000 0000 0000 1000 0000 17 19 +# C menu: 56 66 0 0 9600 0110 1100 +# D menu: 0110 1001 1 0 +# +# Briefly, the settings are for the following modes: +# (values are for bit set/clear with * indicating our preference +# and the value used to test these termcaps) +# Note that many of these settings are irrelevant to the terminfo +# and are just set to the default mode of the terminal as shipped +# by the factory. +# +# A menu: 0000 1010 0001 0000 +# Block/underline cursor* +# blinking/nonblinking cursor* +# key click/no key click* +# bell/no bell at column 72* +# +# key pad is cursor control*/key pad is numeric +# return and line feed/return for key * +# repeat after .5 sec*/no repeat +# repeat at 25/15 chars per sec. * +# +# hold data until pause pressed/process data unless pause pressed* +# slow scroll/no slow scroll* +# Hold in area/don't hold in area* +# functions keys have default*/function keys disabled on powerup +# +# show/don't show position of cursor during page transmit* +# unused +# unused +# unused +# +# B menu: 9600 0100 1000 0000 0000 1000 0000 17 19 +# Baud rate (9600*) +# +# 2 bits of parity - 00=odd,01=even*,10=space,11=mark +# 1 stop bit*/2 stop bits +# parity error detection off*/on +# +# keyboard local/on line* +# half/full duplex* +# disable/do not disable keyboard after data transmission* +# +# transmit entire page/stop transmission at cursor* +# transfer/do not transfer protected characters* +# transmit all characters/transmit only selected characters* +# transmit all selected areas/transmit only 1 selected area* +# +# transmit/do not transmit line separators to host* +# transmit/do not transmit page tab stops tabs to host* +# transmit/do not transmit column tab stop tabs to host* +# transmit/do not transmit graphics control (underline,inverse..)* +# +# enable*/disable auto XON/XOFF control +# require/do not require receipt of a DC1 from host after each LF* +# pause key acts as a meta key/pause key is pause* +# unused +# +# unused +# unused +# unused +# unused +# +# XON character (17*) +# XOFF character (19*) +# +# C menu: 56 66 0 0 9600 0110 1100 +# number of lines to print data on (printer) (56*) +# +# number of lines on a sheet of paper (printer) (66*) +# +# left margin (printer) (0*) +# +# number of pad chars on new line to printer (0*) +# +# printer baud rate (9600*) +# +# printer parity: 00=odd,01=even*,10=space,11=mark +# printer stop bits: 2*/1 +# print/do not print guarded areas* +# +# new line is: 01=LF,10=CR,11=CRLF* +# unused +# unused +# +# D menu: 0110 1001 1 0 +# LF is newline/LF is down one line, same column* +# wrap to preceding line if move left from col 1*/don't wrap +# wrap to next line if move right from col 80*/don't wrap +# backspace is/is not destructive* +# +# display*/ignore DEL character +# display will not/will scroll* +# page/column tab stops* +# erase everything*/erase unprotected only +# +# editing extent: 0=display,1=line*,2=field,3=area +# +# unused +# + +annarbor4080|aa4080|Ann Arbor 4080, + OTbs, am, + cols#80, lines#40, + bel=^G, clear=\014$<2>, cr=\r, cub1=^H, cud1=\n, cuf1=^_, + cup=\017%p2%{10}%/%{16}%*%p2%{10}%m%+%c%p1%?%p1%{19}%>%t + %{12}%+%;%{64}%+%c, + cuu1=^N, home=^K, ht=^I, hts=^]^P1, ind=\n, kbs=^^, kcub1=^H, + kcud1=\n, kcuf1=^_, kcuu1=^N, khome=^K, tbc=^\^P^P, + +# Strange Ann Arbor terminal from BRL +aas1901|Ann Arbor K4080 w/S1901 mod, + am, + cols#80, lines#40, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^_, cuu1=^N, + home=^K, ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, ll=^O\0c, + nel=\r\n, + +# If you're using the GNU termcap library, add +# :cS=\E[%p1%d;%p2%d;%p3%d;%p4%dp: +# to these capabilities. This is the nonstandard GNU termcap scrolling +# capability, arguments are: +# 1. Total number of lines on the screen. +# 2. Number of lines above desired scroll region. +# 3. Number of lines below (outside of) desired scroll region. +# 4. Total number of lines on the screen, the same as the first parameter. +# The generic Ann Arbor entry is the only one that uses this. +aaa+unk|aaa-unk|Ann Arbor Ambassador (internal - don't use this directly), + OTbs, am, km, mc5i, mir, xon, + cols#80, + bel=^G, clear=\E[H\E[J$<156>, cr=\r, cub1=^H, cud1=^K, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, ed=\E[J, + el=\E[K$<5>, home=\E[H, hpa=\E[%p1%{1}%+%dG, + ich=\E[%p1%d@$<4*>, ich1=\E[@$<4>, il1=\E[L$<3>, ind=^K, + is1=\E[m\E7\E[H\E9\E8, + is3=\E[1Q\E[>20;30l\EP`+x~M\E\\, kcbt=\E[Z, kclr=\E[J, + kdch1=\E[P, kdl1=\E[M, kf1=\EOA, kf10=\EOJ, kf11=\EOK, + kf12=\EOL, kf13=\EOM, kf14=\EON, kf15=\EOO, kf16=\EOP, + kf17=\EOQ, kf18=\EOR, kf19=\EOS, kf2=\EOB, kf20=\EOT, + kf21=\EOU, kf22=\EOV, kf23=\EOW, kf24=\EOX, kf3=\EOC, + kf4=\EOD, kf5=\EOE, kf6=\EOF, kf7=\EOG, kf8=\EOH, kf9=\EOI, + kich1=\E[@, kil1=\E[L, krmir=\E6, mc0=\E[0i, mc4=^C, + mc5=\E[v, mc5p=\E[%p1%dv, rc=\E8, + rmkx=\EP`>y~[[J`8xy~[[A`4xy~[[D`6xy~[[C`2xy~[[B\E + \\, + rmm=\E[>52l, sc=\E7, + sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1; + %;%?%p7%t8;%;m, + sgr0=\E[m, + smkx=\EP`>z~[[J`8xz~[[A`4xz~[[D`6xz~[[C`2xz~[[B\E + \\, + smm=\E[>52h, vpa=\E[%p1%{1}%+%dd, use=ansi+arrows, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+rep, use=ansi+sgrbold, + +aaa+rv|Ann Arbor Ambassador in reverse video, + blink=\E[5;7m, bold=\E[1;7m, invis=\E[7;8m, + is1=\E[7m\E7\E[H\E9\E8, rev=\E[m, rmso=\E[7m, rmul=\E[7m, + rs1=\E[H\E[7m\E[J$<156>, + sgr=\E[%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p1%p2%|%p3%!%|%t7 + ;%;%?%p7%t8;%;m\016, + sgr0=\E[7m\016, smso=\E[m, smul=\E[4;7m, +# Ambassador with the DEC option, for partial VT100 compatibility. +aaa+dec|Ann Arbor Ambassador in DEC VT100 mode, + acsc=aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}, + csr=\E[%i%p1%d;%p2%dr, enacs=\E(B\E)0, rmacs=^O, + sgr=\E[%?%p2%t4;%;%?%p4%t5;%;%?%p6%t1;%;%?%p1%p3%|%!%t7;%;%? + %p7%t8;%;m%?%p9%t\016%e\017%;, + smacs=^N, +aaa-18|Ann Arbor Ambassador/18 lines, + lines#18, + is2=\E7\E[60;0;0;18p\E8, + rmcup=\E[60;0;0;18p\E[60;1H\E[K, smcup=\E[18;0;0;18p, + use=aaa+unk, +aaa-18-rv|Ann Arbor Ambassador/18 lines+reverse video, + use=aaa+rv, use=aaa-18, +aaa-20|Ann Arbor Ambassador/20 lines, + lines#20, + is2=\E7\E[60;0;0;20p\E8, + rmcup=\E[60;0;0;20p\E[60;1H\E[K, smcup=\E[20;0;0;20p, + use=aaa+unk, +aaa-22|Ann Arbor Ambassador/22 lines, + lines#22, + is2=\E7\E[60;0;0;22p\E8, + rmcup=\E[60;0;0;22p\E[60;1H\E[K, smcup=\E[22;0;0;22p, + use=aaa+unk, +aaa-24|Ann Arbor Ambassador/24 lines, + lines#24, + is2=\E7\E[60;0;0;24p\E8, + rmcup=\E[60;0;0;24p\E[60;1H\E[K, smcup=\E[24;0;0;24p, + use=aaa+unk, +aaa-24-rv|Ann Arbor Ambassador/24 lines+reverse video, + use=aaa+rv, use=aaa-24, +aaa-26|Ann Arbor Ambassador/26 lines, + lines#26, + is2=\E7\E[60;0;0;26p\E8, + rmcup=\E[60;0;0;26p\E[26;1H\E[K, + smcup=\E[H\E[J$<156>\E[26;0;0;26p, use=aaa+unk, +aaa-28|Ann Arbor Ambassador/28 lines, + lines#28, + is2=\E7\E[60;0;0;28p\E8, + rmcup=\E[60;0;0;28p\E[28;1H\E[K, + smcup=\E[H\E[J$<156>\E[28;0;0;28p, use=aaa+unk, +aaa-30-s|aaa-s|Ann Arbor Ambassador/30 lines w/status, + eslok, hs, + lines#29, + dsl=\E7\E[60;0;0;30p\E[1;1H\E[K\E[H\E8\r\n\E[K, + fsl=\E[>51l, is2=\r\n\E[A\E7\E[60;1;0;30p\E8, + rmcup=\E[60;1;0;30p\E[29;1H\E[K, + smcup=\E[H\E[J$<156>\E[30;1;0;30p\E[30;1H\E[K, + tsl=\E[>51h\E[1;%p1%dH\E[2K, use=aaa+unk, +aaa-30-s-rv|aaa-s-rv|Ann Arbor Ambassador/30 lines+status+reverse video, + use=aaa+rv, use=aaa-30-s, +aaa-s-ctxt|aaa-30-s-ctxt|Ann Arbor Ambassador/30 lines+status+save context, + rmcup=\E[60;1;0;30p\E[59;1H\E[K, + smcup=\E[30;1H\E[K\E[30;1;0;30p, use=aaa-30-s, +aaa-s-rv-ctxt|aaa-30-s-rv-ct|Ann Arbor Ambassador/30 lines+status+save context+reverse video, + rmcup=\E[60;1;0;30p\E[59;1H\E[K, + smcup=\E[30;1H\E[K\E[30;1;0;30p, use=aaa-30-s-rv, +aaa|aaa-30|ambas|ambassador|Ann Arbor Ambassador/30 lines, + lines#30, + is2=\E7\E[60;0;0;30p\E8, + rmcup=\E[60;0;0;30p\E[30;1H\E[K, + smcup=\E[H\E[J$<156>\E[30;0;0;30p, use=aaa+unk, +aaa-30-rv|aaa-rv|Ann Arbor Ambassador/30 lines in reverse video, + use=aaa+rv, use=aaa-30, +aaa-30-ctxt|aaa-ctxt|Ann Arbor Ambassador/30 lines; saving context, + rmcup=\E[60;0;0;30p\E[60;1H\E[K, smcup=\E[30;0;0;30p, + use=aaa-30, +aaa-30-rv-ctxt|aaa-rv-ctxt|Ann Arbor Ambassador/30 lines reverse video; saving context, + rmcup=\E[60;0;0;30p\E[60;1H\E[K, smcup=\E[30;0;0;30p, + use=aaa+rv, use=aaa-30, +aaa-36|Ann Arbor Ambassador/36 lines, + lines#36, + is2=\E7\E[60;0;0;36p\E8, + rmcup=\E[60;0;0;36p\E[36;1H\E[K, + smcup=\E[H\E[J$<156>\E[36;0;0;36p, use=aaa+unk, +aaa-36-rv|Ann Arbor Ambassador/36 lines+reverse video, + use=aaa+rv, use=aaa-36, +aaa-40|Ann Arbor Ambassador/40 lines, + lines#40, + is2=\E7\E[60;0;0;40p\E8, + rmcup=\E[60;0;0;40p\E[40;1H\E[K, + smcup=\E[H\E[J$<156>\E[40;0;0;40p, use=aaa+unk, +aaa-40-rv|Ann Arbor Ambassador/40 lines+reverse video, + use=aaa+rv, use=aaa-40, +aaa-48|Ann Arbor Ambassador/48 lines, + lines#48, + is2=\E7\E[60;0;0;48p\E8, + rmcup=\E[60;0;0;48p\E[48;1H\E[K, + smcup=\E[H\E[J$<156>\E[48;0;0;48p, use=aaa+unk, +aaa-48-rv|Ann Arbor Ambassador/48 lines+reverse video, + use=aaa+rv, use=aaa-48, +aaa-60-s|Ann Arbor Ambassador/59 lines+status, + eslok, hs, + lines#59, + dsl=\E7\E[60;0;0;60p\E[1;1H\E[K\E[H\E8\r\n\E[K, + fsl=\E[>51l, is2=\r\n\E[A\E7\E[60;1;0;60p\E8, + tsl=\E[>51h\E[1;%p1%dH\E[2K, use=aaa+unk, +aaa-60-s-rv|Ann Arbor Ambassador/59 lines+status+reverse video, + use=aaa+rv, use=aaa-60-s, +aaa-60-dec-rv|Ann Arbor Ambassador/DEC mode+59 lines+status+rev video, + use=aaa+dec, use=aaa+rv, use=aaa-60-s, +aaa-60|Ann Arbor Ambassador/60 lines, + lines#60, + is2=\E7\E[60;0;0;60p\E[1Q\E[m\E[>20;30l\E8, + use=aaa+unk, +aaa-60-rv|Ann Arbor Ambassador/60 lines+reverse video, + use=aaa+rv, use=aaa-60, +aaa-db|Ann Arbor Ambassador 30/destructive backspace, + OTbs@, + cub1=\E[D, is3=\E[1Q\E[m\E[>20l\E[>30h, use=aaa-30, + +guru|guru-33|guru+unk|Ann Arbor guru/33 lines 80 cols, + lines#33, + flash=\E[>59h$<100>\E[>59l, + is2=\E7\E[255;0;0;33;80;80p\E8\E[J, is3=\E[>59l, + rmcup=\E[255p\E[255;1H\E[K, smcup=\E[33p, use=aaa+unk, +guru+rv|guru changes for reverse video, + flash=\E[>59l$<100>\E[>59h, is3=\E[>59h, +guru-rv|guru-33-rv|Ann Arbor guru/33 lines+reverse video, + use=guru+rv, use=guru-33, +guru+s|guru status line, + eslok, hs, + dsl=\E7\E[;0p\E[1;1H\E[K\E[H\E8\r\n\E[K, fsl=\E[>51l, + rmcup=\E[255;1p\E[255;1H\E[K, smcup=, + tsl=\E[>51h\E[1;%p1%dH\E[2K, +guru-nctxt|guru with no saved context, + smcup=\E[H\E[J$<156>\E[33p\E[255;1H\E[K, use=guru, +guru-s|guru-33-s|Ann Arbor guru/33 lines+status, + lines#32, + is2=\r\n\E[A\E7\E[255;1;0;33;80;80p\E8\E[J, + smcup=\E[33;1p\E[255;1H\E[K, use=guru+s, use=guru+unk, +guru-24|Ann Arbor guru 24 lines, + cols#80, lines#24, + is2=\E7\E[255;0;0;24;80;80p\E8\E[J, smcup=\E[24p, + use=guru+unk, +guru-44|Ann Arbor guru 44 lines, + cols#97, lines#44, + is2=\E7\E[255;0;0;44;97;100p\E8\E[J, smcup=\E[44p, + use=guru+unk, +guru-44-s|Ann Arbor guru/44 lines+status, + lines#43, + is2=\r\n\E[A\E7\E[255;1;0;44;80;80p\E8\E[J, + smcup=\E[44;1p\E[255;1H\E[K, use=guru+s, use=guru+unk, +guru-76|guru with 76 lines by 89 cols, + cols#89, lines#76, + is2=\E7\E[255;0;0;76;89;100p\E8\E[J, smcup=\E[76p, + use=guru+unk, +guru-76-s|Ann Arbor guru/76 lines+status, + cols#89, lines#75, + is2=\r\n\E[A\E7\E[255;1;0;76;89;100p\E8\E[J, + smcup=\E[76;1p\E[255;1H\E[K, use=guru+s, use=guru+unk, +guru-76-lp|guru-lp|guru with page bigger than line printer, + cols#134, lines#76, + is2=\E7\E[255;0;0;76;134;134p\E8\E[J, smcup=\E[76p, + use=guru+unk, +guru-76-w|guru 76 lines by 178 cols, + cols#178, lines#76, + is2=\E7\E[255;0;0;76;178;178p\E8\E[J, smcup=\E[76p, + use=guru+unk, +guru-76-w-s|Ann Arbor guru/76 lines+status+wide, + cols#178, lines#75, + is2=\r\n\E[A\E7\E[255;1;0;76;178;178p\E8\E[J, + smcup=\E[76;1p\E[255;1H\E[K, use=guru+s, use=guru+unk, +guru-76-wm|guru 76 lines by 178 cols with 255 cols memory, + cols#178, lines#76, + is2=\E7\E[255;0;0;76;178;255p\E8\E[J, smcup=\E[76p, + use=guru+unk, +aaa-rv-unk|Ann Arbor unknown type, + lh#0, lw#0, nlab#0, + blink=\E[5;7m, bold=\E[1;7m, home=\E[H, invis=\E[7;8m, + is1=\E[7m\E7\E[H\E9\E8, rev=\E[m, rmso=\E[7m, rmul=\E[7m, + rs1=\E[H\E[7m\E[J, + sgr=\E[%?%p6%t1;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p1%!%t + 7;%;%?%p7%t8;%;m, + sgr0=\E[7m, smso=\E[m, smul=\E[4;7m, + +#### Applied Digital Data Systems (adds) +# +# ADDS itself is long gone. ADDS was bought by NCR, and the same group made +# ADDS and NCR terminals. When AT&T and NCR merged, the engineering for +# terminals was merged again. Then AT&T sold the terminal business to +# SunRiver, which later changed its name to Boundless Technologies. The +# engineers from Teletype, AT&T terminals, ADDS, and NCR (who are still there +# as of early 1995) are at: +# +# Boundless Technologies +# 100 Marcus Boulevard +# Hauppauge, NY 11788-3762 +# Vox: (800)-231-5445 +# Fax: (516)-342-7378 +# Web: http://boundless.com +# +# Their voice mail used to describe the place as "SunRiver (formerly ADDS)". +# In 1995 Boundless acquired DEC's terminals business. +# + +# Regent: lowest common denominator, works on all regents. +# (regent: renamed ":bc:" to ":le:" -- esr) +regent|ADDS Regent Series, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^U, cud1=\n, cuf1=^F, cuu1=^Z, + home=\EY\s\s, ind=\n, ll=^A, +# Regent 100 has a bug where if computer sends escape when user is holding +# down shift key it gets confused, so we avoid escape. +regent100|ADDS Regent 100, + xmc#1, + bel=^G, + cup=\013%p1%'\s'%+%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%c, + kf0=^B1\r, kf1=^B2\r, kf2=^B3\r, kf3=^B4\r, kf4=^B5\r, + kf5=^B6\r, kf6=^B7\r, kf7=^B8\r, lf0=F1, lf1=F2, lf2=F3, + lf3=F4, lf4=F5, lf5=F6, lf6=F7, lf7=F8, rmso=\E0@, rmul=\E0@, + sgr0=\E0@, smso=\E0P, smul=\E0`, use=regent, +regent20|ADDS Regent 20, + bel=^G, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, ed=\Ek, el=\EK, + use=regent, +regent25|ADDS Regent 25, + bel=^G, kcub1=^U, kcud1=\n, kcuf1=^F, kcuu1=^Z, khome=^A, + use=regent20, +regent40|ADDS Regent 40, + xmc#1, + bel=^G, dl1=\El$<2*>, il1=\EM$<2*>, kf1=^B1\r, kf2=^B2\r, + kf3=^B3\r, kf4=^B4\r, kf5=^B5\r, kf6=^B6\r, kf7=^B7\r, + kf8=^B8\r, lf0=F1, lf1=F2, lf2=F3, lf3=F4, lf4=F5, lf5=F6, + lf6=F7, lf7=F8, rmso=\E0@, rmul=\E0@, sgr0=\E0@, smso=\E0P, + smul=\E0`, use=regent25, +regent40+|ADDS Regent 40+, + is2=\EB, use=regent40, +# It uses a different code for mapping acs vs dim/blink. +regent60|regent200|adds200|ADDS Regent 60, + acsc=jLkDl@mHnhq`tXuTv\\wPxd, dch1=\EE, ed=\Ek, + is2=\EV\EB, kbs=^H, kcbt=\EO, kdch1=\EE, kich1=\EF, + krmir=\EF, rmacs=\E2, rmir=\EF, rmso=\ER\E0@\EV, smacs=\E1, + smir=\EF, smso=\ER\E0P\EV, kF1=^B!\r, kF2=^B"\r, kF3=^B#\r, + kF4=^B$\r, kF5=^B%\r, kF6=^B&\r, kF7=^B'\r, kF8=^B(\r, + use=regent40+, +# From: Thu Jul 9 09:27:33 1981 +# (viewpoint: added , function key, and capabilities -- esr) +viewpoint|addsviewpoint|ADDS Viewpoint, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^L, cnorm=\017\E0`, cr=\r, cub1=^H, cud1=\n, + cuf1=^F, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, + cvvis=\017\E0P, dl1=\El, ed=\Ek$<16.1*>, el=\EK$<16>, + ind=\n, is2=\017\E0`, kcub1=^U, kcud1=\n, kcuf1=^F, kcuu1=^Z, + kf0=^B1, kf2=^B2, kf3=^B!, kf4=^B", kf5=^B#, khome=^A, ll=^A, + rmso=^O, rmul=^O, sgr0=^O, smso=^N, smul=^N, +# Some viewpoints have bad ROMs that foo up on ^O +screwpoint|ADDS Viewpoint with ^O bug, + cvvis@, rmso@, rmul@, smso@, smul@, use=viewpoint, + +# From: Jay S. Rouman 5 Jul 92 +# The /// strings were added by ESR from specs. +# Theory; the vp3a+ wants \E0%c to set highlights, where normal=01000000, +# underline=01100000, rev=01010000, blink=01000010,dim=01000001, +# invis=01000100 and %c is the logical or of desired attributes. +# There is also a `tag bit' enabling attributes, set by \E) and unset by \E(. +# +# Update by TD - 2004: +# Adapted from +# https://web.archive.org/web/19990922005103/http://www.cs.utk.edu/~shuford/terminal/adds_viewpoint_news.txt +# +# COMMANDS ASCII CODE +# +# Address, Absolute ESC,=,row,column +# Beep BEL +# Aux Port Enable ESC,@ +# Aux Port Disable ESC,A +# Backspace BS +# Cursor back BS +# Cursor down LF +# Cursor forward FF +# Cursor home RS +# Cursor up VT +# Cursor suppress ETB +# Cursor enable CAN +# Erase to end of line ESC,T +# Erase to end of page ESC,Y +# Erase screen SUB +# Keyboard lock SI +# Keyboard unlock SO +# Read current cursor position ESC,? +# Set Attribute ESC,0,x (see below for values of x) +# Tag bit reset ESC,( +# Tag bit set ESC,) +# Transparent Print on ESC,3 +# Transparent Print off ESC,4 +# +# +# ATTRIBUTES +# +# Normal @ 0100 +# Half Intensity A 0101 +# Blinking B 0102 +# Half Intensity Blinking C 0103 +# Reverse Video P 0120 +# Reverse Video Half Intensity Q 0121 +# Reverse Video Blinking R 0122 +# Reverse Video Half Intensity +# Blinking S 0123 +# Underlined ` 0140 +# Underlined Half Intensity a 0141 +# Underlined Blinking b 0142 +# Underlined Half Intensity +# Blinking c 0143 +# Video suppress D 0104 +vp3a+|viewpoint3a+|ADDS Viewpoint 3a+, + am, bw, + cols#80, it#8, lines#24, + blink=\E0B\E), civis=^W, clear=\E*$<80>, cnorm=^X, cr=\r, + cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dim=\E0A\E), + ed=\EY$<80>, el=\ET, home=^^, ht=^I, ind=\n, invis=\E0D\E), + kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, + nel=\r\n, rev=\E0P\E), rmso=\E(, + sgr=%?%p1%p2%|%p3%|%p4%|%p5%|%p7%|%t\E0%{64}%?%p1%t%{17}%|%; + %?%p2%t%{32}%|%;%?%p3%t%{16}%|%;%?%p4%t%{2}%|%;%?%p5%t + %{1}%|%;%c%?%p7%tD%;\E)%e\E(%;, + sgr0=\E(, smso=\E0Q\E), smul=\E0`\E), +vp60|viewpoint60|addsvp60|ADDS Viewpoint60, + use=regent40, +# +# adds viewpoint 90 - from cornell +# Note: emacs sends ei occasionally to insure the terminal is out of +# insert mode. This unfortunately puts the viewpoint90 IN insert +# mode. A hack to get around this is . (Also, +# - :ei=:im=: must be present in the termcap translation.) +# - indicates glitch that attributes stick to location +# - means it's safe to move in standout mode +# - : clears screen and visual attributes without affecting +# the status line +# Function key and label capabilities merged in from SCO. +vp90|viewpoint90|ADDS Viewpoint 90, + OTbs, bw, msgr, xhp, + cols#80, lines#24, + clear=\EG\Ek, cub1=^H, cud1=\n, cuf1=^F, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dch1=\EE, + dl1=\El, ed=\Ek, el=\EK, home=\EY\s\s, ht=^I, + ich1=\EF \EF\025, ind=\n, kbs=^H, kcub1=^U, kcud1=\n, + kcuf1=^F, kcuu1=^Z, kf0=^B1\r, kf1=^B2\r, kf10=^B;\r, + kf2=^B3\r, kf3=^B4\r, kf4=^B5\r, kf5=^B6\r, kf6=^B7\r, + kf7=^B8\r, kf8=^B9\r, kf9=^B:\r, khome=^A, lf0=F1, lf1=F2, + lf10=F11, lf2=F3, lf3=F4, lf4=F5, lf5=F6, lf6=F7, lf7=F8, lf8=F9, + lf9=F10, ll=^A, rmso=\ER\E0@\EV, rmul=\ER\E0@\EV, + sgr0=\ER\E0@\EV, smso=\ER\E0Q\EV, smul=\ER\E0`\EV, +# Note: if return acts weird on a980, check internal switch #2 +# on the top chip on the CONTROL pc board. +adds980|a980|ADDS Consul 980, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\014$<1>\013@, cr=\r, cub1=^H, cud1=\n, + cuf1=\E^E01, cup=\013%p1%{64}%+%c\E\005%p2%2d, + dl1=\E\017$<13>, il1=\E\016$<13>, ind=\n, kf0=\E0, kf1=\E1, + kf2=\E2, kf3=\E3, kf4=\E4, kf5=\E5, kf6=\E6, kf7=\E7, kf8=\E8, + kf9=\E9, rmso=^O, sgr0=^O, smso=^Y^^^N, + +#### C. Itoh Electronics +# +# As of 1995 these people no longer make terminals (they're still in the +# printer business). Their terminals were all clones of the DEC VT series. +# They're located in Orange County, CA. +# + +# CIT 80 - vt-52 emulator, the termcap has been modified to remove +# the delay times and do an auto tab set rather than the indirect +# file used in vt100. +cit80|cit-80|citoh 80, + OTbs, am, + cols#80, lines#24, + clear=\E[H\EJ, cr=\r, cub1=^H, cup=\E[%i%p1%2d;%p2%2dH, + ed=\EJ, el=\EK, ff=^L, ind=\n, is2=\E>, kcub1=\EOD, kcud1=\EOB, + kcuf1=\EOC, kcuu1=\EOA, rmkx=\E[?1l\E>, smkx=\E[?1h\E=, + use=ansi+local1, + +# From: Tim Wood Fri Sep 27 09:39:12 PDT 1985 +# (cit101: added / based on init string, merged this with c101 -- esr) +cit101|citc|C. Itoh fast VT100, + OTbs, am, xenl, + cols#80, lines#24, + bel=^G, clear=\E[H\E[2J, cnorm=\E[V\E8, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E7\E[U, dch1=\E[P, + dl1=\E[M, ed=\E[J, el=\E[K, flash=\E[?5h$<200/>\E[?5l, + ich1=\E[@, il1=\E[L, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[3g\E[>5g, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m, + smul=\E[4m, use=ansi+local1, + +# CIE Terminals CIT-101e from Geoff Kuenning via BRL +# The following termcap entry was created from the Callan cd100 entry. The +# last two lines (with the capabilities in caps) are used by RM-cobol to allow +# full selection of combinations of reverse video, underline, and blink. +# (cit101e: removed unknown :f0=\EOp:f1=\EOq:f2=\EOr:f3=\EOs:f4=\EOt:f5=\EOu:\ +# f6=\EOv:f7=\EOw:f8=\EOx:f9=\EOy:AB=\E[0;5m:AL=\E[m:AR=\E[0;7m:AS=\E[0;5;7m:\ +# :NB=\E[0;1;5m:NM=\E[0;1m:NR=\E[0;1;7m:NS=\E[0;1;5;7m: -- esr) +cit101e|C. Itoh CIT-101e, + OTbs, OTpt, am, mir, msgr, + cols#80, it#8, lines#24, + acsc=, cnorm=, csr=\E[%i%p1%2d;%p2%2dr, + cup=\E[%i%p1%2d;%p2%2dH, cvvis=\E[?1l\E[?4l\E[?7h, + dch1=\E[P, dl1=\E[M, if=/usr/share/tabset/vt100, + il1=\E[L, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kf0=\EOT, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOm, + kf6=\EOl, kf7=\EOM, kf8=\EOn, rc=\E8, ri=\EM, rmacs=^O, + rmir=\E[4l, rmkx=\E>, rmso=\E[m, rmul=\E[m, sc=\E7, smacs=^N, + smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m, + use=ansi+erase, use=ansi+local1, + +# From: David S. Lawyer, June 1997: +# The CIT 101-e was made in Japan in 1983-4 and imported by CIE +# Terminals in Irvine, CA. It was part of CITOH Electronics. In the +# late 1980's CIT Terminals went out of business. +# There is no need to use the initialization string is=... (by invoking +# tset or setterm etc.) provided that the terminal has been manually set +# up (and the setup saved with ^S) to be compatible with this termcap. To be +# compatible it should be in ANSI mode (not VT52). A set-up that +# works is to set all the manually settable stuff to factory defaults +# by pressing ^D in set-up mode. Then increase the brightness with the +# up-arrow key since the factory default will likely be dim on an old +# terminal. Then change any options you want (provided that they are +# compatible with the termcap). For my terminal I set: Screen +# Background: light; Keyclicks: silent; Auto wraparound: on; CRT saver: +# on. I also set up mine for parity (but you may not need it). Then +# save the setup with ^S. +# (cit101e-rv: added empty to suppress a tic warning. --esr) +cit101e-rv|C. Itoh CIT-101e (sets reverse video), + am, eo, mir, msgr, xenl, xon, + cols#80, lines#24, + OTnl=\EM, bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[1v, + cnorm=\E[0;3;4v, cr=\r, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E[3;5v, flash=\E[?5l$<200/>\E[?5h, home=\E[H, + hpa=\E[%i%p1%dG, ind=\n, + is2=\E<\E>\E[?1l\E[?3l\E[?4l\E[?5h\E[?7h\E[?8h\E[3g\E[>5g\E( + B\E[m\E[20l\E[1;24r\E[24;1H, + kbs=^?, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\EE, rev=\E[7m, + ri=\EM, rmcup=, rmso=\E[m, rmul=\E[m, rs1=\Ec\E[?7h\E[>5g, + sgr0=\E[m, smcup=\E[>5g\E[?7h\E[?5h, smso=\E[7m, + smul=\E[4m, u6=\E[%i%p1%d;%p2%dR, u8=\E[?6c, + use=ansi+enq, use=ansi+csr, use=ansi+erase, use=ansi+idc, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ecma+index, + +cit101e-n|CIT-101e w/o am, + am@, + cvvis=\E[?1l\E[?4l\E[?7l, kbs=^H, kcub1=^H, kcud1=\n, + use=cit101e, +cit101e-132|CIT-101e with 132 cols, + cols#132, + kbs=^H, kcub1=^H, kcud1=\n, use=cit101e, +cit101e-n132|CIT-101e with 132 cols w/o am, + am@, + cols#132, + cvvis=\E[?1l\E[?4l\E[?7l, kbs=^H, kcub1=^H, kcud1=\n, + use=cit101e, +# CIE Terminals CIT-500 from BRL +# The following SET-UP modes are assumed for normal operation: +# GENERATE_XON/XOFF:YES DUPLEX:FULL NEWLINE:OFF +# AUTOWRAP:ON MODE:ANSI SCREEN_LENGTH:64_LINES +# DSPLY_CNTRL_CODES?NO PAGE_WIDTH:80 EDIT_MODE:OFF +# Other SET-UP modes may be set for operator convenience or communication +# requirements. +# Hardware tabs are assumed to be set every 8 columns; they can be set up +# by the "reset", "tset", or "tabs" utilities. No delays are specified; use +# "stty ixon -ixany" to enable DC3/DC1 flow control! +# (cit500: I added / based on the init string -- esr) +cit500|CIE Terminals CIT-500, + OTbs, OTpt, mir, msgr, xon, + OTkn#10, cols#80, lines#64, vt#3, + acsc=, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[J, + cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, + dch1=\E[P, ed=\EJ, el=\EK, home=\E[H, ind=\n, is2=\E<\E)0, + kcbt=\E[Z, kdch1=\E[P, kdl1=\E[M, ked=\EJ, kel=\EK, kf0=\EOP, + kf1=\EOQ, kf2=\EOR, kf3=\EOS, kf4=\EOU, kf5=\EOV, kf6=\EOW, + kf7=\EOX, kf8=\EOY, kf9=\EOZ, khome=\E[H, kich1=\E[4h, + kil1=\E[L, krmir=\E[4l, lf0=PF1, lf1=PF2, lf2=PF3, lf3=PF4, + lf4=F15, lf5=F16, lf6=F17, lf7=F18, lf8=F19, lf9=F20, + ll=\E[64H, nel=\EE, rev=\E[7m, ri=\EM, rmacs=^O, rmam=\E[?7l, + rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + rs1=\E<\E2\E[20l\E[?6l\E[r\E[m\E[q\E(B\017\E)0\E>, + sgr0=\E[m, smacs=^N, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, + use=ansi+apparrows, use=ansi+csr, use=ansi+idl, + use=ansi+inittabs, use=ansi+local, + +# C. Itoh printers begin here +citoh|ci8510|8510|C. Itoh 8510a, + cols#80, it#8, + bold=\E!, cub1@, + is2=\E(009\,017\,025\,033\,041\,049\,057\,065\,073., + rep=\ER%p2%03d%p1%c, ri=\Er, rmul=\EY, sgr0=\E"\EY, + smul=\EX, use=lpr, +citoh-pica|citoh in pica, + is1=\EN, use=citoh, +citoh-elite|citoh in elite, + cols#96, + is1=\EE, + is2=\E(009\,017\,025\,033\,041\,049\,057\,065\,073\,081\,089 + ., + use=citoh, +citoh-comp|citoh in compressed, + cols#136, + is1=\EQ, + is2=\E(009\,017\,025\,033\,041\,049\,057\,065\,073\,081\,089 + \,097\,105\,113\,121\,129., + use=citoh, +# citoh has infinite cols because we don't want lp ever inserting \n\t**. +citoh-prop|citoh-ps|ips|citoh in proportional spacing mode, + cols#0x7fff, + is1=\EP, use=citoh, +citoh-6lpi|citoh in 6 lines per inch mode, + is3=\EA, use=citoh, +citoh-8lpi|citoh in 8 lines per inch mode, + lines#88, + is3=\EB, use=citoh, + +#### Control Data (cdc) +# + +cdc456|CDC 456 terminal, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^Y^X, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E1%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dl1=\EJ, ed=^X, + el=^V, home=^Y, il1=\EL, ind=\n, + +# Assorted CDC terminals from BRL (improvements by DAG & Ferd Brundick) +cdc721|CDC Viking, + OTbs, am, + cols#80, lines#24, + clear=^L, cuf1=^X, cup=\002%p2%{32}%+%c%p1%{32}%+%c, + cuu1=^W, el=^K, home=^Y, kcub1=^H, kcud1=\n, kcuf1=^I, + kcuu1=^W, khome=^Y, +cdc721ll|CDC Viking with long lines, + OTbs, am, + cols#132, lines#24, + clear=^L, cuf1=^X, cup=\002%p2%{32}%+%c%p1%{32}%+%c, + cuu1=^W, el=^K, home=^Y, kcub1=^H, kcud1=\n, kcuf1=^I, + kcuu1=^W, khome=^Y, +# (cdc752: the BRL entry had :ll=\E1 ^Z: commented out +cdc752|CDC 752, + OTbs, am, bw, xhp, + cols#80, lines#24, + bel=^G, clear=\030\E1\s\s, cr=\r, cub1=^H, cud1=\n, cuf1=^U, + cup=\E1%p2%{32}%+%c%p1%{32}%+%c, cuu1=^Z, el=^V, + home=\E1\s\s, ind=\n, ll=^Y, rs1=\E1 \030\002\003\017, +# CDC 756 +# The following switch/key settings are assumed for normal operation: +# 96 chars SCROLL FULL duplex not BLOCK +# Other switches may be set according to communication requirements. +# Insert/delete-character cannot be used, as the whole display is affected. +# "so" & "se" are commented out until jove handles "sg" correctly. +cdc756|CDC 756, + OTbs, am, bw, + OTkn#10, cols#80, lines#24, + bel=^G, clear=^Y^X, cr=\r, cub1=^H, cud1=\n, cuf1=^U, + cup=\E1%p2%{32}%+%c%p1%{32}%+%c, cuu1=^Z, + dl1=\EJ$<6*/>, ed=^X, el=^V, home=^Y, il1=\EL$<6*/>, ind=\n, + kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^U, kcuu1=^Z, kdch1=\EI, + kdl1=\EL, ked=^X, kel=^V, kf0=\EA, kf1=\EB, kf2=\EC, kf3=\ED, + kf4=\EE, kf5=\EF, kf6=\EG, kf7=\EH, kf8=\Ea, kf9=\Eb, khome=^Y, + khts=^O, kich1=\EK, kil1=\EL, lf0=F1, lf1=F2, lf2=F3, lf3=F4, + lf4=F5, lf5=F6, lf6=F7, lf7=F8, lf8=F9, lf9=F10, ll=^Y^Z, + rs1=^Y^X^B^C^O, +# +# CDC 721 from Robert Viduya, Ga. Tech. via BRL. +# +# Part of the long initialization string defines the "DOWN" key to the left +# of the tab key to send an ESC. The real ESC key is positioned way out +# in right field. +# +# The termcap won't work in 132 column mode due to the way it it moves the +# cursor. Termcap doesn't have the capability (as far as I could tell) to +# handle the 721 in 132 column mode. +# +# (cdc721: changed :ri: to :sr: -- esr) +cdc721-esc|Control Data 721, + OTbs, OTpt, am, bw, msgr, xon, + OTkn#10, cols#80, it#8, lines#30, + bel=^G, blink=^N, cbt=^^^K, clear=^L, cub1=^H, cud1=^Z, + cuf1=^X, cup=\002%p2%{32}%+%c%p1%{32}%+%c, cuu1=^W, + dch1=^^N, dim=^\, dl1=^^Q, ed=^^P, el=^K, home=^Y, hts=^^^RW, + ich1=^^O, il1=^^R, ind=\036W =\036U, invis=^^^R[, + is2=\036\022B\003\036\035\017\022\025\035\036E\036\022H\036 + \022J\036\022L\036\022N\036\022P\036\022Q\036\022\036 + \022\^\036\022b\036\022i\036W\s=\036\022Z\036\011C1-`\s` + !k/o, + kbs=^H, kcub1=^H, kcud1=^Z, kcuf1=^X, kcuu1=^W, kf0=^^q, + kf1=^^r, kf2=^^s, kf3=^^t, kf4=^^u, kf5=^^v, kf6=^^w, kf7=^^x, + kf8=^^y, kf9=^^z, khome=^Y, ll=^B =, rev=^^D, + ri=\036W =\036V, rmir=, rmkx=^^^Rl, rmso=^^E, rmul=^], + sgr0=^O^U^]^^E^^^R\\, smir=, smkx=^^^Rk, smso=^^D, smul=^\, + tbc=^^^RY, + +#### Getronics +# +# Getronics is a Dutch electronics company that at one time was called +# `Geveke' and made async terminals; but (according to the company itself!) +# they've lost all their documentation on the command set. The hardware +# documentation suggests the terminals were actually manufactured by a +# Taiwanese electronics company named Cal-Comp. There are known +# to have been at least two models, the 33 and the 50. +# + +# The 50 seems to be a top end VT220 clone, with the addition of a higher +# screen resolution, a larger screen, at least 1 page of memory above and +# below the screen, apparently pages of memory right and left of the screen +# which can be panned, and about 75 function keys (15 function keys x normal, +# shift, control, func A, func B). It also has more setup possibilities than +# the VT220. The monitor case is dated November 1978 and the keyboard case is +# May 1982. +# +# The VT100 emulation works as is. The entry below describes the rather +# non-conformant (but more featureful) ANSI mode. +# +# From: Stephen Peterson , 27 May 1995 +visa50|Geveke VISA 50 terminal in ANSI 80 character mode, + bw, mir, msgr, + cols#80, lines#25, + acsc=0_aaffggh jjkkllmmnnooqqssttuuvvwwxx, bel=^G, + blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[2J, cr=\r, + csr=\E[%i%p1%d;%p2%dr, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dX, dch1=\E[X, dim=\E[2m, ed=\E[J, el=\E[K, + flash=\E[?5h$<100/>\E[?5l, home=\E[H, hpa=\E[%i%p1%dG, + ht=^I, ind=\n, invis=\E[8m, + is2=\E0;2m\E[1;25r\E[25;1H\E[?3l\E[?7h\E[?8h, + ka1=\E[f, ka3=\EOQ, kb2=\EOP, kc1=\EOR, kc3=\EOS, kdch1=^?, + kdl1=\EOS, kf0=\E010, kf1=\E001, kf10=\E011, kf2=\E002, + kf3=\E003, kf4=\E004, kf5=\E005, kf6=\E006, kf7=\E007, + kf8=\E008, kf9=\E009, khome=\E[f, lf2=A delete char, + lf3=A insert line, lf4=A delete line, lf5=A clear, + lf6=A ce of/cf gn, lf7=A print, lf8=A on-line, + lf9=A funcl0=A send, nel=\r\n, rev=\E[7m, rmacs=\E[3l, + rmam=\E[?7l, rmkx=\E>, rmso=\E[0;2m, rmul=\E[0m, + sgr0=\E[0;2m, smacs=\E3h, smam=\E?7h, smkx=\E=, + smso=\E[2;7m, smul=\E[4m, tbc=\E[3g, vpa=\E[%i%p1%dd, + use=ansi+arrows, use=ansi+idc, use=ansi+idl, + use=ansi+local, + +#### Human Designed Systems (Concept) +# +# Human Designed Systems +# 400 Fehley Drive +# King of Prussia, PA 19406 +# Vox: (610)-277-8300 +# Fax: (610)-275-5739 +# Net: support@hds.com +# +# John Martin is their termcap expert. They're mostly out of +# the character-terminal business now (1995) and making X terminals. In +# particular, the whole `Concept' line described here was discontinued long +# ago. +# + +# From: Sat Jun 27 07:41:20 1981 +# Extensive changes to c108 by arpavax:eric Feb 1982 +# Some unknown person at SCO then translated it to terminfo. +# +# There seem to be a number of different versions of the C108 PROMS +# (with bug fixes in its Z-80 program). +# +# The first one that we had would lock out the keyboard of you +# sent lots of short lines (like /usr/dict/words) at 9600 baud. +# Try that on your C108 and see if it sends a ^S when you type it. +# If so, you have an old version of the PROMs. +# +# You should configure the C108 to send ^S/^Q before running this. +# It is much faster (at 9600 baud) than the c100 because the delays +# are not fixed. +# new status line display entries for c108-8p: +# - init str #3 - setup term for status display - +# set programmer mode, select window 2, define window at last +# line of memory, set bkgnd stat mesg there, select window 0. +# +# - to status line - select window 2, home cursor, erase to +# end-of-window, 1/2 bright on, goto(line#0, col#?) +# +# - from status line - 1/2 bright off, select window 0 +# +# - disable status display - set bkgnd status mesg with +# illegal window # +# +# There are probably more function keys that should be added but +# I don't know what they are. +# +# No delays needed on c108 because of ^S/^Q handshaking +# +c108|concept108|c108-8p|concept108-8p|Concept 108 w/8 pages, + is3=\EU\E\sz"\Ev\001\177\s!p\E\s;"\E\sz\s\Ev\s\s\001\177p + \Ep\n, + rmcup=\Ev \001\177p\Ep\r\n, use=c108-4p, +c108-4p|concept108-4p|Concept 108 w/4 pages, + eslok, hs, xon, + pb@, + acsc=jEkTl\\mMqLxU, cnorm=\Ew, cr=\r, + cup=\Ea%p1%?%p1%{95}%>%t\001%{96}%-%;%{32}%+%c%p2%?%p2%{95} + %>%t\001%{96}%-%;%{32}%+%c, + cvvis=\EW, dch1=\E 1$<16*>, dsl=\E ;\177, fsl=\Ee\E z\s, + is1=\EK\E!\E F, + is3=\EU\E z"\Ev\177 !p\E ;"\E z \Ev \001 p\Ep\n, + rmacs=\Ej\s, rmcup=\Ev \001 p\Ep\r\n, smacs=\Ej!, + smcup=\EU\Ev 8p\Ep\r\E\025, + tsl=\E z"\E?\E\005\EE\Ea %+\s, use=c100, +c108-rv|c108-rv-8p|Concept 108 w/8 pages in reverse video, + rmcup=\Ev \002 p\Ep\r\n, smcup=\EU\Ev 8p\Ep\r, + use=c108-rv-4p, +c108-rv-4p|concept108rv4p|Concept 108 w/4 pages in reverse video, + flash=\EK$<200>\Ek, is1=\Ek, rmso=\Ee, smso=\EE, + use=c108-4p, +c108-w|c108-w-8p|concept108-w-8|concept108-w8p|Concept 108 w/8 pages in wide mode, + cols#132, + is1=\E F\E", rmcup=\Ev ^A0\001D\Ep\r\n, + smcup=\EU\Ev 8\001D\Ep\r, use=c108-8p, + +# Concept 100: +# These have only window relative cursor addressing, not screen +# relative. To get it to work right here, smcup/rmcup (which +# were invented for the concept) lock you into a one page +# window for screen style programs. +# +# To get out of the one page window, we use a clever trick: +# we set the window size to zero ("\Ev " in rmcup) which the +# terminal recognizes as an error and resets the window to all +# of memory. +# +# This trick works on c100 but does not on c108, sigh. +# +# Some tty drivers use cr3 for concept, others use nl3, hence +# the delays on cr and ind below. This padding is only needed at +# 9600 baud and up. One or the other is commented out depending on +# local conventions. +# +# 2 ms padding on isn't always enough. 6 works fine. Maybe +# less than 6 but more than 2 will work. +# +# Note: can't use function keys f7-f10 because they are +# indistinguishable from arrow keys (!), also, del char and +# clear eol use xon/xoff so they probably won't work very well. +# +# Also note that we don't define insrt/del char/delline/eop/send +# because they don't transmit unless we reset them - I figured +# it was a bad idea to clobber their definitions. +# +# The sequence changes the escape character to ^^ so that +# escapes will be passed through to the printer. Only trouble +# is that ^^ won't be - ^^ was chosen to be unlikely. +# Unfortunately, if you're sending raster bits through to be +# plotted, any character you choose will be likely, so we lose. +# +# \EQ"\EY(^W (send anything from printer to host, for xon/xoff) +# cannot be # in is2 because it will hang a c100 with no printer +# if sent twice. +c100|concept100|concept|c104|c100-4p|HDS Concept 100, + OTbs, am, eo, mir, ul, xenl, + cols#80, lines#24, pb#9600, vt#8, + bel=^G, blink=\EC, clear=\E?\E\005$<2*>, cr=$<9>\r, + cub1=^H, cud1=\n, cuf1=\E=, + cup=\Ea%p1%{32}%+%c%p2%{32}%+%c, cuu1=\E;, + dch1=\E\021$<16*>, dim=\EE, dl1=\E\002$<3*>, + ed=\E\005$<16*>, el=\E\025$<16>, flash=\Ek$<200>\EK, + ht=\011$<8>, il1=\E\022$<3*>, ind=\n, invis=\EH, ip=$<16*>, + is1=\EK, + is2=\EU\Ef\E7\E5\E8\El\ENH\E\0\Eo&\0\Eo'\E\Eo!\0\E\007!\E + \010A@\s\E4#:"\E:a\E4#;"\E:b\E4#<"\E:c, + is3=\Ev $<6>\Ep\n, kbs=^H, kcbt=\E', kctab=\E_, + kcub1=\E>, kcud1=\E<, kcuf1=\E=, kcuu1=\E;, kdch1=\E^Q, + kdl1=\E^B, ked=\E^C, kel=\E^S, kf1=\E5, kf2=\E6, kf3=\E7, + kf4=\E8, kf5=\E9, kf6=\E:a, kf7=\E:b, kf8=\E:c, khome=\E?, + khts=\E], kich1=\E^P, kil1=\E^R, kind=\E[, knp=\E-, kpp=\E., + kri=\E\\, krmir=\E\0, mc4=\036o \E\EQ!\EYP\027, + mc5=\EQ"\EY(\027\EYD\Eo \036, prot=\EI, + rep=\Er%p1%c%p2%{32}%+%c$<.2*>, rev=\ED, + rmcup=\Ev $<6>\Ep\r\n, rmir=\E\s\s, rmkx=\Ex, + rmso=\Ed, rmul=\Eg, sgr0=\EN@, + smcup=\EU\Ev 8p\Ep\r\E\025$<16>, smir=\E^P, smkx=\EX, + smso=\ED, smul=\EG, +c100-rv|c100-rv-4p|concept100-rv|Concept 100 reverse video, + cnorm@, cvvis@, flash=\EK$<200>\Ek, is1=\Ek, rmso=\Ee, + smso=\EE, use=c100, +oc100|oconcept|c100-1p|old 1-page Concept 100, + in, + is3@, use=c100, + +# From: Walter Skorski , 16-oct-1996. +# Lots of notes, originally inline, but ncurses doesn't grok that. +# +# am: not available in power on mode, but turned on with \E[=107;207h in +# is2=. Also, \E=124l in is2= could have been used to prevent needing +# to specify xenl:, but that would have rendered the last space on the +# last line useless. +# bw: Not available in power on mode, but turned on with \E[=107;207h in +# is2=. +# clear: Could be done with \E[2J alone, except that vi (and probably most +# other programs) assume that this also homes the cursor. +# dsl: Go to window 2, go to the beginning of the line, use a line feed to +# scroll the window, and go back to window 1. +# is2: the string may cause a warning to be issued by tic that it +# found a very long line and that it suspects that a comma is missing +# somewhere. This warning can be ignored (unless it comes up more than +# once). The initialization string contains the following commands: +# +# [Setup mode items changed from factory defaults:] +# \E)0 set alternate character set to +# graphics +# ^O set character set to default +# [In case it wasn't] +# \E[m turn off all attributes +# [In case they weren't off] +# \E[=107; cursor wrap and +# 207h character wrap on +# \E[90;3u set Fkey definitions to "transmit" +# defaults +# \E[92;3u set cursor key definitions to +# "transmit" defaults +# \E[43;1u set shift F13 to transmit... +# \177\E$P\177 +# \E[44;1u set shift F14 to transmit... +# \177\E$Q\177 +# \E[45;1u set shift F15 to transmit... +# \177\E$R\177 +# \E[46;1u set shift F16 to transmit... +# \177\E$S\177 +# \E[200;1u set shift up to transmit... +# \177\E$A\177 +# \E[201;1u set shift down to transmit... +# \177\E$B\177 +# \E[202;1u set shift right to transmit... +# \177\E$C\177 +# \E[203;1u set shift left to transmit... +# \177\E$D\177 +# \E[204;1u set shift home to transmit... +# \177\E$H\177 +# \E[212;1u set backtab to transmit... +# \177\E$I\177 +# \E[213;1u set shift backspace to transmit... +# \177\E$^H\177 +# \E[214;1u set shift del to transmit... +# "\E$\177" +# [Necessary items not mentioned in setup mode:] +# \E[2!w move to window 2 +# \E[25;25w define window as line 25 of memory +# \E[!w move to window 1 +# \E[2*w show current line of window 2 as +# status line +# \E[2+x set meta key to use high bit +# \E[;3+} move underline to bottom of character +# +# All Fkeys are set to their default transmit definitions with \E[90;3u +# in is2=. IMPORTANT: to use this terminal definition, the "quit" stty +# setting MUST be redefined or deactivated, because the default is +# contained in almost all of this terminal's Fkey strings! If for some +# reason "quit" cannot be altered, the Fkeys can, but it would be +# necessary to change ^| to ^] in all of these definitions, and add +# \E[2;029!t to is2. +# lines: is set to 24 because this terminal refuses to treat the 25th +# line normally. +# ll: Not available in power on mode, but turned on with \E[=107;207h in +# is2=. +# lm: Pointless, given that this definition locks a single screen of +# memory into view, but what the hey... +# rmso: Could use \E[1;7!{ to turn off only bold and reverse (leaving any +# other attributes alone), but some programs expect this to turn off +# everything. +# rmul: Could use \E[4!{ to turn off only underline (leaving any other +# attributes alone), but some programs expect this to turn off +# everything. +# sgr: Attributes are set on this terminal with the string \E[ followed by +# a list of attribute code numbers (in decimal, separated by +# semicolons), followed by the character m. The attribute code +# numbers are: +# 1 for bold; +# 2 for dim (which is ignored in power on mode); +# 4 for underline; +# 5 for blinking; +# 7 for inverse; +# 8 for not displayable; and +# =99 for protected (except that there are strange side +# effects to protected characters which make them inadvisable). +# The mapping of terminfo parameters to attributes is as follows: +# %p1 (standout) = bold and inverse together; +# %p2 (underline) = underline; +# %p3 (reverse) = inverse; +# %p4 (blink) = blinking; +# %p5 (dim) is ignored; +# %p6 (bold) = bold; +# %p7 (invisible) = not displayable; +# %p8 (protected) is ignored; and +# %p9 (alt char set) = alt char set. +# The code to do this is: +# \E[0 OUTPUT \E[0 +# %?%p1%p6%O IF (standout; bold) OR +# %t;1 THEN OUTPUT ;1 +# %; ENDIF +# %?%p2 IF underline +# %t;4 THEN OUTPUT ;4 +# %; ENDIF +# %?%p4 IF blink +# %t;5 THEN OUTPUT ;5 +# %; ENDIF +# %?%p1%p3%O IF (standout; reverse) OR +# %t;7 THEN OUTPUT ;7 +# %; ENDIF +# %?%p7 IF invisible +# %t;8 THEN OUTPUT ;8 +# %; ENDIF +# m OUTPUT m +# %?%p9 IF altcharset +# %t^N THEN OUTPUT ^N +# %e^O ELSE OUTPUT ^O +# %; ENDIF +# sgr0: Everything is turned off (including alternate character set), since +# there is no way of knowing what it is that the program wants turned +# off. +# smul: The "underline" attribute is reconfigurable to an overline or +# strike-through, or (as done with \E[;3+} in is2=), to a line at the true +# bottom of the character cell. This was done to allow for more readable +# underlined characters, and to be able to distinguish between an +# underlined space, an underscore, and an underlined underscore. +# xenl: Terminal can be configured to not need this, but this "glitch" +# behavior is actually preferable with autowrap terminals. +# +# Parameters kf31= thru kf53= actually contain the strings sent by the shifted +# Fkeys. There are no parameters for shifted Fkeys in terminfo. The is2 +# string modifies the 'O' in kf43 to kf46 to a '$'. +# +# kcbt was originally ^I but redefined in is2=. +# kHOM was \E[H originally but redefined in is2=, as were a number of +# other keys. +# kDC was originally \177 but redefined in is2=. +# +# kbs: Shift was also ^H originally but redefined as \E$^H in is2=. +# tsl: Go to window 2, then do an hpa=. +# +#------- flash=\E[8;3!}^G\E[3;3!} +#------- flash=\E[?5h$<100>\E[?5l +# There are two ways to flash the screen, both of which have their drawbacks. +# The first is to set the bell mode to video, transmit a bell character, and +# set the bell mode back - but to what? There is no way of knowing what the +# user's old bell setting was before we messed with it. Worse, the command to +# set the bell mode also sets the key click volume, and there is no way to say +# "leave that alone", or to know what it's set to, either. +# The second way to do a flash is to set the screen to inverse video, pad for a +# tenth of a second, and set it back - but like before, there's no way to know +# that the screen wasn't ALREADY in inverse video, or that the user may prefer +# it that way. The point is moot anyway, since vi (and probably other +# programs) assume that by defining flash=, you want the computer to use it +# INSTEAD of bel=, rather than as a secondary type of signal. +# +#------- cvvis=\E[+{ +# The is the power on setting, which is also as visible as the cursor +# gets. +#------- wind=\E[%i%p1%d;%p2%d;%p3%{1}%+%d;%p4%{1}%+%dw +# Windowing is possible, but not defined here because it is also used to +# emulate status line functions. Allowing a program to set a window could +# clobber the status line or render it unusable. There is additional memory, +# but screen scroll functions are destructive and do not make use of it. +# +#------- dim= Not available in power on mode. +# You have a choice of defining low intensity characters as "half bright" and +# high intensity as "normal", or defining low as "normal" and high as "bold". +# No matter which you choose, only one of either "half bright" or "bold" is +# available at any time, so taking the time to override the default is +# pointless. +# +#------- prot=\E[=0;99m +# Not defined, because it appears to have some strange side effects. +#------- pfkey=%?%p1%{24}%<%p1%{30}%>%p1%{54}%<%A%O%t\E[%p1%du\177%p2%s\177%; +#------- pfloc=%?%p1%{24}%<%p1%{30}%>%p1%{54}%<%A%O%t\E[%p1%du\177%p2%s\177%; +#------- pfx=%?%p1%{24}%<%p1%{30}%>%p1%{54}%<%A%O%t\E[%p1%d;1u\177%p2%s\177%; +# Available, but making them available to programs is inadvisable. +# The code to do this is: +# %?%p1%{24}%< IF ((key; 24) <; +# %p1%{30}%> ((key; 30) >; +# %p1%{54}%< (key; 54) < +# %A ) AND +# %O ) OR +# [that is, "IF key < 24 OR (key > 30 AND key < 54)",] +# %t\E[ THEN OUTPUT \E[ +# %p1%d OUTPUT (key) as decimal +# [next line applies to pfx only] +# ;1 OUTPUT ;1 +# u OUTPUT u +# \177 OUTPUT \177 +# %p2%s OUTPUT (string) as string +# \177 OUTPUT \177 +# [DEL chosen as delimiter, but could be any character] +# [implied: ELSE do nothing] +# %; ENDIF +# +#------- rs2= +# Not defined since anything it might do could be done faster and easier with +# either Meta-Shift-Reset or the main power switch. +# +#------- smkx=\E[1!z +#------- rmkx=\E[!z +# These sequences apply to the cursor and setup keys only, not to the +# numeric keypad. But it doesn't matter anyway, since making these +# available to programs is inadvisable. +# For the key definitions below, all sequences beginning with \E$ are +# custom and programmed into the terminal via is2. \E$ also has no +# meaning to any other terminal. +# +#------- cmdch=\E[;%p1%d!t +# Available, but making it available to programs is inadvisable. +#------- smxon=\E[1*q +# Available, but making it available to programs is inadvisable. +# Terminal will send XON/XOFF on buffer overflow. +#------- rmxon=\E[*q +# Available, but making it available to programs is inadvisable. +# Terminal will not notify on buffer overflow. +#------- smm=\E[2+x +#------- rmm=\E[+x +# Available, but making them available to programs is inadvisable. +# +# Printing: +# It's not made clear in the manuals, but based on other ansi/vt type +# terminals, it's a good guess that this terminal is capable of both +# "transparent print" (which doesn't copy data to the screen, and +# therefore needs mc5i: specified to say so) and "auxiliary print" +# (which does duplicate printed data on the screen, in which case mc4= +# and mc5= should use the \E[?4i and \E[?5i strings instead). + +hds200|Human Designed Systems HDS200, + am, bw, eslok, hs, km, mir, msgr, xenl, xon, NQ, + cols#80, lines#24, lm#0, + acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G, + blink=\E[0;5m, bold=\E[0;1m, civis=\E[6+{, cnorm=\E[+{, + cr=\r, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dsl=\E[2!w\r\n\E[!w, el1=\E[1K, fsl=\E[!w, home=\E[H, + hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ind=\ED, invis=\E[0;8m, + is2=\E)0\017\E[m\E[=107;207h\E[90;3u\E[92;3u\E[43;1u\177\E$P + \177\E[44;1u\177\E$Q\177\E[45;1u\177\E$R\177\E[46;1u + \177\E$S\177\E[200;1u\177\E$A\177\E[201;1u\177\E$B\177 + \E[202;1u\177\E$C\177\E[203;1u\177\E$D\177\E[204;1u\177 + \E$H\177\E[212;1u\177\E$I\177\E[213;1u\177\E$\010\177\E[ + 214;1u"\E$\177"\E[2!w\E[25;25w\E[!w\E[2*w\E[2+x\E[;3+}, + kDC=\E$^?, kHOM=\E$H, kLFT=\E$D, kRIT=\E$C, kcbt=\E$I, + kdch1=^?, kent=\r, kf1=^\001\r, kf10=^\010\r, kf11=^\011\r, + kf12=^\012\r, kf13=\EOP, kf14=\EOQ, kf15=\EOR, kf16=\EOS, + kf17=^\017\r, kf18=^\018\r, kf19=^\019\r, kf2=^\002\r, + kf20=^\020\r, kf21=^\021\r, kf22=^\022\r, kf23=^\023\r, + kf3=^\003\r, kf31=^\031\r, kf32=^\032\r, kf33=^\033\r, + kf34=^\034\r, kf35=^\035\r, kf36=^\036\r, kf37=^\037\r, + kf38=^\038\r, kf39=^\039\r, kf4=^\004\r, kf40=^\040\r, + kf41=^\041\r, kf42=^\042\r, kf43=\E$P, kf44=\E$Q, + kf45=\E$R, kf46=\E$S, kf47=^\047\r, kf48=^\048\r, + kf49=^\049\r, kf5=^\005\r, kf50=^\050\r, kf51=^\051\r, + kf52=^\052\r, kf53=^\053\r, kf6=^\006\r, kf7=^\007\r, + kf8=^\008\r, kf9=^\009\r, kind=\E[T, knp=\E[U, kpp=\E[V, + kri=\E[S, ll=\E[H\E[A, nel=\E[E, rev=\E[0;7m, ri=\EM, + rmacs=^O, rmir=\E[4l, rmso=\E[m\017, rmul=\E[m\017, + sgr=\E[0%?%p1%p6%O%t;1%;%?%p2%t;4%;%?%p4%t;5%;%?%p1%p3%O%t;7 + %;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, smir=\E[4h, smso=\E[0;1;7m, + smul=\E[0;4m, tsl=\E[2!w\E[%i%p1%dG, vpa=\E[%i%p1%dd, + use=ansi+arrows, use=ansi+csr, use=ansi+erase, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+pp, + +# through included to specify padding needed in raw mode. +# (avt-ns: added empty to suppress a tic warning --esr) +avt-ns|Concept AVT no status line, + OTbs, am, eo, mir, ul, xenl, xon, + cols#80, lines#24, lm#192, + acsc=, bel=^G, clear=\E[H\E[J$<38>, cnorm=\E[=119l, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, cvvis=\E[=119h, + dim=\E[1!{, dl=\E[%p1%dM$<4*>, dl1=\E[M$<4>, + ed=\E[J$<96>, el=\E[K$<6>, home=\E[H, + hpa=\E[%p1%{1}%+%dG, ht=\011$<4>, ich=\E[%p1%d@, + il=\E[%p1%dL$<4*>, il1=\E[L$<4>, ind=\n$<8>, ip=$<4>, + is1=\E[=103l\E[=205l, + is2=\E[1*q\E[2!t\E[7!t\E[=4;101;119;122l\E[=107;118;207h\E)1 + \E[1Q\EW\E[!y\E[!z\E>\E[0:0:32!r\E[0*w\E[w\E2\r\n\E[2;27 + !t, + kdch1=\E\002\r, ked=\E\004\r, kf1=\EOP, kf2=\EOQ, kf3=\EOR, + kf4=\EOS, kich1=\E\001\r, kil1=\E\003\r, ll=\E[24H, + mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, + pfloc=\E[%p1%d;0u#%p2%s#, pfx=\E[%p1%d;1u#%p2%s#, + prot=\E[99m, ri=\EM$<4>, rmacs=\016$<1>, + rmcup=\E[w\E2\r\n, rmkx=\E[!z\E[0;2u, rmso=\E[7!{, + rmul=\E[4!{, + sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1; + %;%?%p7%t8;%;%?%p8%t99;%;m%?%p5%t\E[1!{%;%?%p9%t\017%e + \016%;$<1>, + sgr0=\E[m\016$<1>, smacs=\017$<1>, + smcup=\E[=4l\E[1;24w\E2\r, smkx=\E[1!z\E[0;3u, + vpa=\E[%p1%{1}%+%dd, use=ansi+arrows, use=ansi+csr, + use=ansi+idc1, use=ansi+inittabs, use=ansi+local, + use=ansi+rep, use=ansi+sgrbold, + +avt-rv-ns|Concept AVT in reverse video mode/no status line, + flash=\E[=205l$<200>\E[=205h, is1=\E[=103l\E[=205h, + use=avt-ns, +avt-w-ns|Concept AVT in 132 column mode/no status line, + is1=\E[=103h\E[=205l, smcup=\E[H\E[1;24;1;132w, + use=avt-ns, +avt-w-rv-ns|Concept AVT in 132 column mode/no status line/reverse video, + flash=\E[=205l$<200>\E[=205h, is1=\E[=103h\E[=205h, + smcup=\E[H\E[1;24;1;132w, use=avt-ns, + +# Concept AVT with status line. We get the status line using the +# "Background status line" feature of the terminal. We swipe the +# first line of memory in window 2 for the status line, keeping +# 191 lines of memory and 24 screen lines for regular use. +# The first line is used instead of the last so that this works +# on both 4 and 8 page AVTs. (Note the lm#191 or 192 - this +# assumes an 8 page AVT but lm isn't currently used anywhere.) +# +avt+s|Concept AVT status line changes, + eslok, hs, + lm#191, + dsl=\E[0*w, fsl=\E[1;1!w, + is3=\E[2w\E[2!w\E[1;1;1;80w\E[H\E[2*w\E[1!w\E2\r\n, + rmcup=\E[2w\E2\r\n, smcup=\E[2;25w\E2\r, + tsl=\E[2;1!w\E[;%p1%dH\E[2K, +avt|avt-s|concept-avt|Concept AVT w/80 columns, + use=avt+s, use=avt-ns, +avt-rv|avt-rv-s|Concept AVT reverse video w/sl, + flash=\E[=205l$<200>\E[=205h, is1=\E[=103l\E[=205h, + use=avt+s, use=avt-ns, +avt-w|avt-w-s|Concept AVT 132 cols+status, + is1=\E[=103h\E[=205l, smcup=\E[H\E[1;24;1;132w, + use=avt+s, use=avt-ns, +avt-w-rv|avt-w-rv-s|Concept AVT wide+status+rv, + flash=\E[=205l$<200>\E[=205h, is1=\E[=103h\E[=205h, + smcup=\E[H\E[1;24;1;132w, use=avt+s, use=avt-ns, + +#### Contel Business Systems. +# + +# Contel c300 and c320 terminals. +contel300|contel320|c300|Contel Business Systems C-300 or C-320, + am, in, xon, + cols#80, lines#24, xmc#1, + bel=^G, clear=\EK, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA, + dch1=\EO$<5.5*>, dl1=\EM$<5.5*>, ed=\EJ$<5.5*>, + el=\EI$<5.5>, flash=\020\002$<200/>\020\003, home=\EH, + hts=\E1, ich1=\EN, il1=\EL$<5.5*>, ind=\n, ip=$<5.5*>, + kbs=^H, kf0=\ERJ, kf1=\ERA, kf2=\ERB, kf3=\ERC, kf4=\ERD, + kf5=\ERE, kf6=\ERF, kf7=\ERG, kf8=\ERH, kf9=\ERI, ll=\EH\EA, + rmso=\E!\0, sgr0=\E!\0, smso=\E!\r, tbc=\E3, +# Contel c301 and c321 terminals. +contel301|contel321|c301|c321|Contel Business Systems C-301 or C-321, + flash@, ich1@, ip@, rmso=\E!\0$<20>, smso=\E!\r$<20>, + use=contel300, + +#### Data General (dg) +# +# According to James Carlson writing in January 1995, +# the terminals group at Data General was shut down in 1991; all these +# terminals have thus been discontinued. +# +# DG terminals have function keys that respond to the SHIFT and CTRL keys, +# e.g., SHIFT-F1 generates a different code from F1. To number the keys +# sequentially, first the unmodified key codes are listed as F1 through F15. +# Then their SHIFT versions are listed as F16 through F30, their CTRL versions +# are listed as F31 through F45, and their CTRL-SHIFT versions are listed as +# F46 through F60. This is done in the private "includes" below whose names +# start with "dgkeys+". +# +# DG terminals generally support 8 bit characters. For each of these terminals +# two descriptions are supplied: +# 1) A default description for 8 bits/character communications, which +# uses the default DG international character set and keyboard codes. +# 2) A description with suffix "-7b" for 7 bits/character communications. +# This description must use the NON-DEFAULT native keyboard language. + +# Unmodified fkeys (kf1-kf11), Shift fkeys (kf12-kf22), Ctrl fkeys (kf23-kf33), +# Ctrl/Shift fdkeys (kf34-kf44). + +dgkeys+8b|Private entry describing DG terminal 8-bit ANSI mode special keys, + ka1=\233020z, ka3=\233021z, kc1=\233022z, kc3=\233023z, + kclr=\2332J, kcub1=\233D, kcud1=\233B, kcuf1=\233C, + kcuu1=\233A, kel=\233K, kf1=\233001z, kf10=\233010z, + kf11=\233011z, kf12=\233012z, kf13=\233013z, + kf14=\233014z, kf15=\233000z, kf16=\233101z, + kf17=\233102z, kf18=\233103z, kf19=\233104z, + kf2=\233002z, kf20=\233105z, kf21=\233106z, + kf22=\233107z, kf23=\233108z, kf24=\233109z, + kf25=\233110z, kf26=\233111z, kf27=\233112z, + kf28=\233113z, kf29=\233114z, kf3=\233003z, + kf30=\233100z, kf31=\233201z, kf32=\233202z, + kf33=\233203z, kf34=\233204z, kf35=\233205z, + kf36=\233206z, kf37=\233207z, kf38=\233208z, + kf39=\233209z, kf4=\233004z, kf40=\233210z, + kf41=\233211z, kf42=\233212z, kf43=\233213z, + kf44=\233214z, kf45=\233200z, kf46=\233301z, + kf47=\233302z, kf48=\233303z, kf49=\233304z, + kf5=\233005z, kf50=\233305z, kf51=\233306z, + kf52=\233307z, kf53=\233308z, kf54=\233309z, + kf55=\233310z, kf56=\233311z, kf57=\233312z, + kf58=\233313z, kf59=\233314z, kf6=\233006z, + kf60=\233300z, kf7=\233007z, kf8=\233008z, kf9=\233009z, + khome=\233H, kprt=\233i, + +dgkeys+7b|Private entry describing DG terminal 7-bit ANSI mode special keys, + ka1=\E[020z, ka3=\E[021z, kc1=\E[022z, kc3=\E[023z, + kclr=\E[2J, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kel=\E[K, kf1=\E[001z, kf10=\E[010z, kf11=\E[011z, + kf12=\E[012z, kf13=\E[013z, kf14=\E[014z, kf15=\E[000z, + kf16=\E[101z, kf17=\E[102z, kf18=\E[103z, kf19=\E[104z, + kf2=\E[002z, kf20=\E[105z, kf21=\E[106z, kf22=\E[107z, + kf23=\E[108z, kf24=\E[109z, kf25=\E[110z, kf26=\E[111z, + kf27=\E[112z, kf28=\E[113z, kf29=\E[114z, kf3=\E[003z, + kf30=\E[100z, kf31=\E[201z, kf32=\E[202z, kf33=\E[203z, + kf34=\E[204z, kf35=\E[205z, kf36=\E[206z, kf37=\E[207z, + kf38=\E[208z, kf39=\E[209z, kf4=\E[004z, kf40=\E[210z, + kf41=\E[211z, kf42=\E[212z, kf43=\E[213z, kf44=\E[214z, + kf45=\E[200z, kf46=\E[301z, kf47=\E[302z, kf48=\E[303z, + kf49=\E[304z, kf5=\E[005z, kf50=\E[305z, kf51=\E[306z, + kf52=\E[307z, kf53=\E[308z, kf54=\E[309z, kf55=\E[310z, + kf56=\E[311z, kf57=\E[312z, kf58=\E[313z, kf59=\E[314z, + kf6=\E[006z, kf60=\E[300z, kf7=\E[007z, kf8=\E[008z, + kf9=\E[009z, khome=\E[H, kprt=\E[i, + +dgkeys+11|Private entry describing 11 minimal-subset DG mode special keys, + kclr=^L, kcub1=^Y, kcud1=^Z, kcuf1=^X, kcuu1=^W, kel=^K, + kf1=^^q, kf10=^^z, kf11=^^{, kf12=^^a, kf13=^^b, kf14=^^c, + kf15=^^d, kf16=^^e, kf17=^^f, kf18=^^g, kf19=^^h, kf2=^^r, + kf20=^^i, kf21=^^j, kf22=^^k, kf23=^^1, kf24=^^2, kf25=^^3, + kf26=^^4, kf27=^^5, kf28=^^6, kf29=^^7, kf3=^^s, kf30=^^8, + kf31=^^9, kf32=^^:, kf33=^^;, kf34=^^!, kf35=^^", kf36=^^#, + kf37=^^$, kf38=^^%%, kf39=^^&, kf4=^^t, kf40=^^', kf41=^^(, + kf42=^^), kf43=^^*, kf44=^^+, kf5=^^u, kf6=^^v, kf7=^^w, + kf8=^^x, kf9=^^y, khome=^H, + +dgkeys+15|Private entry describing 15 DG mode special keys, + kHOM=^^^H, kLFT=^^^Y, kRIT=^^^X, ka1=^^\\, ka3=^^], kc1=^^\^, + kc3=^^_, kf1=^^q, kf10=^^z, kf11=^^{, kf12=^^|, kf13=^^}, + kf14=^^~, kf15=^^p, kf16=^^a, kf17=^^b, kf18=^^c, kf19=^^d, + kf2=^^r, kf20=^^e, kf21=^^f, kf22=^^g, kf23=^^h, kf24=^^i, + kf25=^^j, kf26=^^k, kf27=^^l, kf28=^^m, kf29=^^n, kf3=^^s, + kf30=^^`, kf31=^^1, kf32=^^2, kf33=^^3, kf34=^^4, kf35=^^5, + kf36=^^6, kf37=^^7, kf38=^^8, kf39=^^9, kf4=^^t, kf40=^^:, + kf41=^^;, kf42=^^<, kf43=^^=, kf44=^^>, kf45=^^0, kf46=^^!, + kf47=^^", kf48=^^#, kf49=^^$, kf5=^^u, kf50=^^%%, kf51=^^&, + kf52=^^', kf53=^^(, kf54=^^), kf55=^^*, kf56=^^+, kf57=^^\,, + kf58=^^-, kf59=^^., kf6=^^v, kf60=^^\s, kf7=^^w, kf8=^^x, + kf9=^^y, + +# Data General color terminals use the "Tektronix" color model. The total +# number of colors varies with the terminal model, as does support for +# attributes used in conjunction with color. + +# Removed u7, u8 definitions since they conflict with tack: +# Preserve user-defined colors in at least some cases. +# u7=^^Fh, +# Default is ACM mode. +# u8=^^F}20^^Fi^^F}21, +# +dgunix+fixed|Fixed color info for DG D430C terminals in DG-UNIX mode, + ncv#53, use=dgmode+color, + +dg+fixed|Fixed color info for DG D430C terminals in DG mode, + use=dgunix+fixed, + +# Video attributes are coordinated using static variables set by "sgr", then +# checked by "op", "seta[bf]", and "set[bf]" to refresh the attribute settings. +# (D=dim, U=underline, B=blink, R=reverse.) +dg+color8|Color info for Data General D220 and D230C terminals in ANSI mode, + bce, + colors#8, ncv#16, pairs#64, + op=\E[%?%gD%t2;%;%?%gU%t4;%;%?%gB%t5;%;%?%gR%t7;%;m, + setab=\E[4%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, + setaf=\E[3%p1%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, + setb=\E[4%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|%; + %d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, + setf=\E[3%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%|%; + %d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%;%?%gR%t;7%;m, + +dg+color|Color info for Data General D470C terminals in ANSI mode, + colors#16, ncv#53, pairs#0x100, + setab=\E[%?%p1%{8}%<%t4%p1%e=%p1%{2}%&%?%p1%{1}%&%t%{4}%|%; + %?%p1%{4}%&%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t + ;5%;%?%gR%t;7%;m, + setaf=\E[%?%p1%{8}%<%t3%p1%e<%p1%{2}%&%?%p1%{1}%&%t%{4}%|%; + %?%p1%{4}%&%t%{1}%|%;%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t + ;5%;%?%gR%t;7%;m, + setb=\E[%?%p1%{8}%<%t4%e=%;%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%? + %p1%{4}%&%t%{1}%|%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%; + %?%gR%t;7%;m, + setf=\E[%?%p1%{8}%<%t3%e<%;%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%? + %p1%{4}%&%t%{1}%|%;%d%?%gD%t;2%;%?%gU%t;4%;%?%gB%t;5%; + %?%gR%t;7%;m, + use=dg+color8, + +dgmode+color8|Color info for Data General D220/D230C terminals in DG mode, + bce, + colors#8, ncv#16, pairs#64, + op=\036Ad\036Bd, + setab=\036B%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%| + %;%{48}%+%c, + setaf=\036A%p1%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1%{4}%&%t%{1}%| + %;%{48}%+%c, + setb=\036B%p1%{48}%+%c, setf=\036A%p1%{48}%+%c, + +dgmode+color|Color info for Data General D470C terminals in DG mode, + colors#16, pairs#0x100, + setab=\036B%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1 + %{4}%&%t%{1}%|%;%;%{48}%+%c, + setaf=\036A%p1%?%p1%{8}%<%t%{2}%&%?%p1%{1}%&%t%{4}%|%;%?%p1 + %{4}%&%t%{1}%|%;%;%{48}%+%c, + use=dgmode+color8, + +dgunix+ccc|Configurable color info for DG D430C terminals in DG-UNIX mode, + bce, ccc, + colors#52, ncv#53, pairs#26, + initp=\036RG0%p1%02X%p2%{255}%*%{1000}%/%02X%p3%{255}%* + %{1000}%/%02X%p4%{255}%*%{1000}%/%02X%p5%{255}%* + %{1000}%/%02X%p6%{255}%*%{1000}%/%02X%p7%{255}%* + %{1000}%/%02X, + oc=\036RG01A00FF00000000\036RG01B00000000FF00 + \036RG01C007F00000000\036RG01D000000007F00, + op=\036RF4831A\036RF2E31B\036RF1D31C\036RF3F31D, + scp=\036RG2%p1%02X, + +# Colors are in the order: normal, reverse, dim, dim + reverse. +dg+ccc|Configurable color info for DG D430C terminals in DG mode, + bce, ccc, + colors#52, ncv#53, pairs#26, + initp=\036RG0%p1%{16}%/%{48}%+%c%p1%{16}%m%{48}%+%c%p2%{255} + %*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c + %p3%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga%{16}%m + %{48}%+%c%p4%{255}%*%{1000}%/%Pa%ga%{16}%/%{48}%+%c%ga + %{16}%m%{48}%+%c%p5%{255}%*%{1000}%/%Pa%ga%{16}%/%{48} + %+%c%ga%{16}%m%{48}%+%c%p6%{255}%*%{1000}%/%Pa%ga%{16} + %/%{48}%+%c%ga%{16}%m%{48}%+%c%p7%{255}%*%{1000}%/%Pa + %ga%{16}%/%{48}%+%c%ga%{16}%m%{48}%+%c, + oc=\036RG01:00??00000000\036RG01;00000000??00\036RG01<007?00 + 000000\036RG01=000000007?00, + op=\036RF4831:\036RF2>31;\036RF1=31<\036RF3?31=, + scp=\036RG2%p1%{16}%/%{48}%+%c%p1%{16}%m%{48}%+%c, + +# The generic DG terminal type (an 8-bit-clean subset of the 6053) +# Initialization string 1 sets: +# ^R - vertical scrolling enabled +# ^C - blinking enabled +dg-generic|generic Data General terminal in DG mode, + am, bw, msgr, xon, + cols#80, lines#24, + bel=^G, blink=^N, clear=^L, cr=\r, cub1=^Y, cud1=^Z, cuf1=^X, + cup=\020%p2%c%p1%c, cuu1=^W, dim=^\, el=^K, ind=\n, is1=^R^C, + mc0=^Q, nel=\n, rmso=^], rmul=^U, sgr0=^O^U^], smso=^\, + smul=^T, use=dgkeys+11, + +# According to the 4.4BSD termcap file, the dg200 should be the +# termcap equivalent of \020%p2%{128}%+%c%p1%{128}%+%c (in termcap +# notation that's "^P%r%+\200%+\200"). Those \200s are suspicious, +# maybe they were originally nuls (which would fit). + +dg200|Data General DASHER 200, + OTbs, am, bw, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^Y, cud1=^Z, cuf1=^X, + cup=\020%p2%c%p1%c, cuu1=^W, el=^K, home=^H, ind=\n, + kcub1=^Y, kcud1=^Z, kcuf1=^X, kcuu1=^W, kf0=^^z, kf1=^^q, + kf2=^^r, kf3=^^s, kf4=^^t, kf5=^^u, kf6=^^v, kf7=^^w, kf8=^^x, + kf9=^^y, khome=^H, lf0=f10, nel=\n, rmso=^^E, rmul=^U, + smso=^^D, smul=^T, + +# Data General 210/211 (and 410?) from Lee Pearson (umich!lp) via BRL +dg210|dg-ansi|Data General 210/211, + am, + cols#80, lines#24, + OTnl=\E[B, clear=\E[2J, cup=\E[%i%p1%d;%p2%dH, ed=\E[J, + el=\E[K, home=\E[H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, khome=\E[H, nel=\r\E[H\E[A\n, rmso=\E[0;m, + rmul=\E[0;m, smso=\E[7;m, smul=\E[4;m, use=ansi+local1, + +# From: Peter N. Wan +# courtesy of Carlos Rucalde of Vantage Software, Inc. +# (dg211: this had ., which was an ancient termcap hangover. +# I suspect the d200 function keys actually work on the dg211, check it out.) +dg211|Data General d211, + cnorm=^L, cvvis=^L^R, ht=^I, ind@, kbs=^Y, kf0@, kf1@, kf2@, kf3@, + kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, lf0@, nel=\r^Z, rmcup=^L, + rmso=\036E$<0/>, smcup=^L^R, smso=\036D$<5/>, use=dg200, + +# dg450 from Cornell (not official) +dg450|dg6134|Data General 6134, + cub1@, cuf1=^X, use=dg200, + +# Not official... +# Note: lesser Dasher terminals will not work with vi because vi insists upon +# having a command to move straight down from any position on the bottom line +# and scroll the screen up, or a direct vertical scroll command. The 460 and +# above have both, the D210/211, for instance, has neither. We must use ANSI +# mode rather than DG mode because standard UNIX tty drivers assume that ^H is +# backspace on all terminals. This is not so in DG mode. +# (dg460-ansi: removed obsolete ":kn#6:"; also removed ":mu=\EW:", on the +# grounds that there is no matching ":ml:" +dg460-ansi|Data General Dasher 460 in ANSI-mode, + OTbs, am, msgr, ul, + cols#80, it#8, lines#24, + OTnl=\ED, blink=\E[5m, clear=\E[2J, cub1=^H, + cup=\E[%i%p1%2d;%p2%2dH, dch1=\E[P, dim=\E[2m, dl1=\E[M, + ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, + ind=\E[S, is2=^^F@, kbs=\E[D, kf0=\E[001z, kf1=\E[002z, + kf2=\E[003z, kf3=\E[004z, kf4=\E[005z, kf5=\E[006z, + kf6=\E[007z, kf7=\E[008z, kf8=\E[009z, kf9=\E[00:z, lf0=f1, + lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, lf9=f10, + mc0=\E[i, rev=\E[7m, ri=\E[T, rmso=\E[m, rmul=\E[05, + sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p5%t;2%;%?%p2%t;4%;%?%p4%t;5%; + %?%p1%p3%|%t;7%;m, + sgr0=\E(B\E[m, smso=\E[7m, smul=\E[4m, u8=\E[5n, u9=\E[0n, + use=ansi+arrows, use=ansi+cpr, use=ansi+local1, + +# From: Wayne Throop (not official) +# Data General 605x +# Ought to work for a Model 6242, Type D210 as well as a 605x. +# Note that the cursor-down key transmits ^Z. Job control users, beware! +# This also matches a posted description of something called a `Dasher 100' +# so there's a dg100 alias here. +# (dg6053: the 4.4BSD file had , , . -- esr) +dg6053-old|dg100|Data General 6053, + OTbs, am, bw, ul, + cols#80, lines#24, + OTbc=^Y, bel=^G, clear=^L, cnorm=^L, cr=\r, cub1=^Y, cud1=^Z, + cuf1=^X, cup=\020%p2%c%p1%c, cuu1=^W, cvvis=^L^R, el=^K, + home=^H, ht=^I, is2=^R, kbs=^Y, kcub1=^Y, kcud1=^Z, kcuf1=^X, + kcuu1=^W, kf0=^^q, kf1=^^r, kf2=^^s, kf3=^^t, kf4=^^u, kf5=^^v, + kf6=^^w, kf7=^^x, kf8=^^y, kf9=^^z, khome=^H, rmcup=^L, + rmso=\0^^E, rmul=^U, smcup=^L^R, smso=\0\0\0\0\0\036D, + smul=^T, + +# (Some performance can be gained over the generic DG terminal type) +dg6053|6053|6053-dg|dg605x|605x|605x-dg|d2|d2-dg|Data General DASHER 6053, + xon@, + home=\020\0\0, ll=^P\0^W, use=dg-generic, + +# Like 6053, but adds reverse video and more keypad and function keys. +d200|d200-dg|Data General DASHER D200, + bold=^^D^T, home@, ll@, rev=^^D, rmso=^^E^], + sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;%?%p4 + %t\016%e\017%;%?%p1%p5%|%t\034%e\035%;, + sgr0=^O^U^]^^E, smso=^^D^\, use=dgkeys+15, use=dg6053, + +# DASHER D210 series terminals in ANSI mode. +# Reverse video, no insert/delete character/line, 7 bits/character only. +# +# Initialization string 1 sets: +# <0 - scrolling enabled +# <1 - blink enabled +# <4 - print characters regardless of attributes +d210|d214|Data General DASHER D210 series, + am, bw, msgr, xon, + cols#80, lines#24, + bel=^G, blink=\E[5m, bold=\E[4;7m, clear=\E[2J, cr=\r, + cub1=^H, cup=\E[%i%p1%d;%p2%dH, dim=\E[2m, ed=\E[J, + el=\E[K, el1=\E[1K, home=\E[H, ind=\n, is1=\E[<0;<1;<4l, + ll=\E[H\E[A, nel=\n, rev=\E[7m, rmso=\E[m, rmul=\E[m, + sgr=\E[%?%p4%t5;%;%?%p2%p6%|%t4;%;%?%p1%p5%|%t2;%;%?%p1%p3%| + %p6%|%t7;%;m, + sgr0=\E[m, smso=\E[2;7m, smul=\E[4m, use=ansi+local, + use=dgkeys+7b, + +# DASHER D210 series terminals in DG mode. +# Like D200, but adds clear to end-of-screen and needs XON/XOFF. +d210-dg|d214-dg|Data General DASHER D210 series in DG mode, + xon, + ed=^^FF, use=d200-dg, + +# DASHER D211 series terminals in ANSI mode. +# Like the D210, but with 8-bit characters and local printer support. +# +# Initialization string 2 sets: +# \E[2;1;1;1v +# 2;1 - 8 bit operations +# 1;1 - 8 bit (international) keyboard language +# \E(B - default primary character set (U.S. ASCII) +# \E)4 - default secondary character set (international) +# ^O - primary character set +# +d211|d215|Data General DASHER D211 series, + km, + is2=\E[2;1;1;1v\E(B\E)4\017, mc0=\E[i, use=dgkeys+8b, + use=d210, + +# Initialization string 2 sets: +# \E[2;0;1;0v +# 2;0 - 7 bit operations +# 1;0 - 7 bit (native) keyboard language +# \E(0 - default character set (the keyboard native language) +# ^O - primary character set +d211-7b|d215-7b|Data General DASHER D211 series in 7 bit mode, + km@, + is2=\E[2;0;1;0v\E(0\017, use=dgkeys+7b, use=d211, + +# Like the D210 series, but adds support for 8-bit characters. +# +# Reset string 2 sets: +# ^^N - secondary character set +# ^^FS0> - 8 bit international character set +# ^^O - primary character set +# ^^FS00 - default character set (matching the native keyboard language) +# +d211-dg|d215-dg|Data General DASHER D211 series in DG mode, + km, + rs2=\036N\036FS0>\036O\036FS00, use=d210-dg, + +d216-dg|d216e-dg|d216+dg|d216e+dg|d217-dg|Data General DASHER D216 series in DG mode, + use=d211-dg, + +# Enhanced DG mode with changes to be more UNIX compatible. +d216-unix|d216e-unix|d216+|d216e+|Data General DASHER D216+ in DG-UNIX mode, + mc5i, + it#8, + acsc=a\177j$k"l!m#n)q+t'u&v(w%x*, blink=^^PI, + clear=^^PH, cub1=^^PD, cud1=^^PB, cuf1=^^PC, cuu1=^^PA, + el=^^PE, home=^^PF, hpa=\020%p1%c\177, ht=^I, ind=\n, + is1=^R^C^^P@1, is3=^^Fz0, kHOM=^^Pf, kLFT=^^Pd, kPRT=^^P1, + kRIT=^^Pc, kclr=^^PH, kcub1=^^PD, kcud1=^^PB, kcuf1=^^PC, + kcuu1=^^PA, kel=^^PE, khome=^^PF, kprt=^^P0, mc0=^^F?9, + mc4=^^Fa, mc5=^^F`, rmacs=\036FS00, + rs2=\036N\036FS0E\036O\036FS00, + sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%; + \036P%?%p4%tI%eJ%;%?%p1%p5%|%t\034%e\035%;\036FS%?%p9%t1 + 1%e00%;, + sgr0=\036PJ\025\035\036E\036FS00, smacs=\036FS11, + vpa=\020\177%p1%c, use=dgkeys+15, use=d216-dg, +d216-unix-25|d216+25|Data General DASHER D216+ in DG-UNIX mode with 25 lines, + lines#25, + is3=^^Fz2, use=d216+, + +d217-unix|Data General DASHER D217 in DG-UNIX mode, + use=d216-unix, +d217-unix-25|Data General DASHER D217 in DG-UNIX mode with 25 lines, + use=d216-unix-25, + +# DASHER D220 color terminal in ANSI mode. +# Like the D470C but with fewer colors and screen editing features. +# +# Initialization string 1 sets: +# \E[<0;<1;<4l +# <0 - scrolling enabled +# <1 - blink enabled +# <4 - print characters regardless of attributes +# \E[m - all attributes off +# Reset string 1 sets: +# \Ec - initial mode defaults (RIS) +# +d220|Data General DASHER D220, + mc5i@, + dl@, dl1@, il@, il1@, is1=\E[<0;<1;<4l\E[m, mc4@, mc5@, rs1=\Ec, + use=dg+color8, use=d470c, + +d220-7b|Data General DASHER D220 in 7 bit mode, + mc5i@, + dl@, dl1@, il@, il1@, is1=\E[<0;<1;<4l\E[m, mc4@, mc5@, rs1=\Ec, + use=dg+color8, use=d470c-7b, + +# Initialization string 3 sets: +# - default cursor (solid rectangle) +# Reset string 2 sets: +# ^^N - secondary character set +# ^^FS0> - 8 bit international character set +# ^^O - primary character set +# ^^FS00 - default character set (matching the native keyboard language) +# +d220-dg|Data General DASHER D220 color terminal in DG mode, + mc5i@, + dl1@, home@, il1@, is2@, is3=^^FQ2, ll@, mc4@, mc5@, rs1@, + rs2=\036N\036FS0>\036O\036FS00, use=dgmode+color8, + use=d470c-dg, + +# DASHER D230C color terminal in ANSI mode. +# Like the D220 but with minor ANSI compatibility improvements. +# +d230c|d230|Data General DASHER D230C, + blink=\E[5;50m, bold=\E[4;7;50m, dim=\E[2;50m, nel=\r\n, + rev=\E[7;50m, rmkx=\E[2;1v, rmso=\E[50m, rmul=\E[50m, + sgr=\E[%?%p1%p3%|%p6%|%t7;%{1}%e%{0}%;%PR%?%p4%t5;%{1}%e%{0} + %;%PB%?%p2%p6%|%t4;%{1}%e%{0}%;%PU%?%p1%p5%|%t2;%{1}%e + %{0}%;%PD50m\E)%?%p9%t6\016%e4\017%;, + sgr0=\E[50m\E)4\017, smkx=\E[2;0v, smso=\E[2;7;50m, + smul=\E[4;50m, use=dgkeys+7b, use=d220, + +d230c-dg|d230-dg|Data General DASHER D230C in DG mode, + use=d220-dg, + +# DASHER D400/D450 series terminals. +# These add intelligent features like insert/delete to the D200 series. +# +# Initialization string 2 sets: +# ^^FQ2 - default cursor (solid rectangle) +# ^^FW - character protection disabled +# ^^FJ - normal (80 column) mode +# ^^F\^ - horizontal scrolling enabled (for alignment) +# ^^FX004? - margins at columns 0 and 79 +# ^^F] - horizontal scrolling disabled +# ^^O - primary character set +# ^^FS00 - default character set (the keyboard native language) +# - (should reset scrolling regions, but that glitches the screen) +# Reset string 1 sets: +# ^^FA - all terminal defaults except scroll rate +# Reset string 2 sets: +# ^^F] - horizontal scrolling disabled +# ^^FT0 - jump scrolling +# +d400|d400-dg|d450|d450-dg|Data General DASHER D400/D450 series, + mc5i, + acsc=j$k"l!m#n)q+t'u&v(w%x*, civis=^^FQ0, cnorm=^^FQ2, + dch1=^^K, dl1=^^FI, enacs=\036N\036FS11\036O, home=^^FG, + hpa=\020%p1%c\177, ich1=^^J, il1=^^FH, + is2=\036FQ2\036FW\036FJ\036F\^\036FX004?\036F]\036O + \036FS00, + ll=^^FG^W, mc4=^^Fa, mc5=^^F`, ri=^^I, rmacs=^^O, rs1=^^FA, + rs2=\036F]\036FT0, + sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;%?%p4 + %t\016%e\017%;%?%p1%p5%|%t\034%e\035%;\036%?%p9%tN%eO%;, + sgr0=^O^U^]^^E^^O, smacs=^^N, vpa=\020\177%p1%c, + use=d210-dg, + +# DASHER D410/D460 series terminals in ANSI mode. +# These add a large number of intelligent terminal features. +# +# Initialization string 1 sets: +# \E[<0;<1;<2;<4l +# <0 - scrolling enabled +# <1 - blink enabled +# <2 - horizontal scrolling enabled (for alignment) +# <4 - print characters regardless of attributes +# \E[5;0v - normal (80 column) mode +# \E[1;1;80w - margins at columns 1 and 80 +# \E[1;6;<2h +# 1 - print all characters even if protected +# 6 - character protection disabled +# <2 - horizontal scrolling disabled +# - (should reset scrolling regions, but that glitches the screen) +# +# Initialization string 2 sets: +# \E[3;2;2;1;1;1v +# 3;2 - default cursor (solid rectangle) +# 2;1 - 8 bit operations +# 1;1 - international keyboard language +# \E(B - default primary character set (U.S. ASCII) +# \E)4 - default secondary character set (international) +# ^O - primary character set +# +# Reset string 1 sets: +# \Ec - initial mode defaults (RIS) +# \E[<2h - horizontal scrolling disabled +# +# Reset string 2 sets: +# \E[4;0;2;1;1;1v +# 4;0 - jump scrolling +# 2;1 - 8 bit operations +# 1;1 - 8 bit (international) keyboard language +# \E(B - default primary character set (U.S. ASCII) +# \E)4 - default secondary character set (international) +# +d410|d411|d460|d461|Data General DASHER D410/D460 series, + acsc=j$k"l!m#n)q+t'u&v(w%x*, civis=\E[3;0v, + cnorm=\E[3;2v, dch=\E[%p1%dP, dch1=\E[P, ich=\E[%p1%d@, + ich1=\E[@, + is1=\E[<0;<1;<2;<4l\E[5;0v\E[1;1;80w\E[1;6;<2h, + is2=\E[3;2;2;1;1;1v\E(B\E)4\017, ri=\EM, + rmacs=\E)4\017, rs1=\Ec\E[<2h, + rs2=\E[4;0;2;1;1;1v\E(B\E)4, + sgr=\E[%?%p1%t2;7%;%?%p3%t7;%;%?%p4%t5;%;%?%p2%t4;%;%?%p1%p5 + %|%t2;%;%?%p6%t4;7;%;m\E)%?%p9%t6\016%e4\017%;, + sgr0=\E[m\E)4\017, smacs=\E)6\016, use=d211, + use=ansi+idl, use=ansi+pp, + +# Initialization string 2 sets: +# \E[3;2;2;0;1;0v +# 3;2 - default cursor (solid rectangle) +# 2;0 - 7 bit operations +# 1;0 - 7 bit (native) keyboard language +# \E(0 - default character set (the keyboard native language) +# ^O - primary character set +# +# Reset string 2 sets: +# \E[4;0;2;0;1;0v +# 4;0 - jump scrolling +# 2;0 - 7 bit operations +# 1;0 - 7 bit (native) keyboard language +# \E(0 - default character set (the keyboard native language) +# +d410-7b|d411-7b|d460-7b|d461-7b|Data General DASHER D410/D460 series in 7 bit mode, + km@, + enacs=\E)6, is2=\E[3;2;2;0;1;0v\E(0\017, rmacs=^O, + rs2=\E[4;0;2;0;1;0v\E(0, + sgr=\E[%?%p1%p5%|%t2;%;%?%p2%p6%|%t4;%;%?%p1%p3%|%p6%|%t7;%; + %?%p4%t5;%;m%?%p9%t\016%e\017%;, + sgr0=\E[m\017, smacs=^N, use=dgkeys+7b, use=d410, + +d410-dg|d460-dg|d411-dg|d461-dg|Data General DASHER D410/D460 series in DG mode, + km, + enacs@, rmacs=\036FS00, + sgr=\036%?%p1%p3%|%p6%|%tD%eE%;%?%p2%p6%|%t\024%e\025%;%?%p4 + %t\016%e\017%;%?%p1%p5%|%t\034%e\035%;\036FS%?%p9%t11%e0 + 0%;, + sgr0=\017\025\035\036E\036FS00, smacs=\036FS11, + use=d400-dg, + +# DASHER D410/D460 series terminals in wide (126 columns) ANSI mode. +# +# Initialization string 1 sets: +# \E[<0;<1;<2;<4l +# <0 - scrolling enabled +# <1 - blink enabled +# <2 - horizontal scrolling enabled (for alignment) +# <4 - print characters regardless of attributes +# \E[5;1v - compressed (135 column) mode +# \E[1;1;126 - margins at columns 1 and 126 +# \E[1;6;<2h +# 1 - print all characters even if protected +# 6 - character protection disabled +# <2 - horizontal scrolling disabled +# - (should reset scrolling regions, but that glitches the screen) +# +# Reset string 1 sets: +# \Ec - initial mode defaults (RIS) +# \E[5;1v - compressed (135 column) mode +# \E[1;1;126w - margins at columns 1 and 126 +# \E[<2h - horizontal scrolling disabled +# +d410-w|d411-w|d460-w|d461-w|Data General DASHER D410/D460 series in wide mode, + cols#126, + is1=\E[<0;<1;<2;<4l\E[5;1v\E[1;1;126w\E[1;6;<2h, + rs1=\Ec\E[5;1v\E[1;1;126w\E[<2h, use=d410, + +d410-7b-w|d411-7b-w|d460-7b-w|d461-7b-w|Data General DASHER D410/D460 series in wide 7 bit mode, + cols#126, + is1=\E[<0;<1;<2;<4l\E[5;1v\E[1;1;126w\E[1;6;<2h, + rs1=\Ec\E[5;1v\E[1;1;126w\E[<2h, use=d410-7b, + +d412-dg|d462-dg|d462e-dg|d412+dg|d462+dg|d413-dg|d463-dg|Data General DASHER D412/D462 series in DG mode, + use=d410-dg, + +# These add intelligent features like scrolling regions. +d412-unix|d462-unix|d412+|d462+|Data General DASHER D412+/D462+ series in Unix mode, + civis=^^FQ0, clear=^^FE, cnorm=^^FQ5, + cup=\036FP%p2%2.2X%p1%2.2X, dch1=^^K, dl1=^^FI, + home=^^FG, hpa=\036FP%p1%2.2XFF, ich1=^^J, il1=^^FH, + is2=\036FQ5\036FW\036FJ\036F\^\036FX004F\036O + \036FS00, + ll=\036FG\036PA, mc0=^A, rc=\036F}11, ri=^^I, + rs1=\036FA\036FT0, rs2=^^P@1, sc=\036F}10, + vpa=\036FPFF%p1%2.2X, + wind=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{23}%p2 + %>%t000%;\036FX%p3%2.2X%p4%2.2X, + use=d216+, +d412-unix-w|d462-unix-w|d412+w|d462+w|Data General DASHER D412+/D462+ series in wide Unix mode, + cols#132, + is2=\036FQ5\036FW\036FK\036F\^\036FX0083\036O + \036FS00, + rs2=\036P@1\036FK\036FX0083, + wind=\036FB%?%p1%t%p1%2.2X1%;%p2%p1%-%{1}%+%2.2X1%?%{23}%p2 + %>%t001%;\036FX%p3%2.2X%p4%2.2X, + use=d412-unix, +d412-unix-25|d462-unix-25|d412+25|d462+25|Data General DASHER D412+/D462+ series in Unix mode with 25 lines, + lines#25, + is3=^^Fz2, + wind=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{24}%p2 + %>%t000%;\036FX%p3%2.2X%p4%2.2X, + use=d462+, +d412-unix-s|d462-unix-s|d412+s|d462+s|Data General DASHER D412+/D462+ in Unix mode with status line, + eslok, hs, + clear=\036FG\036PH, fsl=\036F}01\022, + is3=\036Fz2\036F}00\036FB180000\036F}01, ll@, + tsl=\036F}00\036FP%p1%2.2X18\036PG, + wind=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{23}%p2 + %>%t%{23}%p2%-%2.2X0%;000\036FX%p3%2.2X%p4%2.2X, + use=d462+, + +# Relative cursor motions are confined to the current window, +# which is not what the scrolling region specification expects. +# Thus, relative vertical cursor positioning must be deleted. +d412-unix-sr|d462-unix-sr|d412+sr|d462+sr|Data General DASHER D412+/D462+ in Unix mode with scrolling region, + csr=\036FB%?%p1%t%p1%2.2X0%;%p2%p1%-%{1}%+%2.2X0%?%{23}%p2%> + %t000%;, + cud1@, cuu1@, ll@, use=d462+, + +d413-unix|d463-unix|Data General DASHER D413/D463 series in DG-UNIX mode, + use=d412-unix, +d413-unix-w|d463-unix-w|Data General DASHER D413/D463 series in wide DG-UNIX mode, + use=d412-unix-w, +d413-unix-25|d463-unix-25|Data General DASHER D413/D463 series in DG-UNIX mode with 25 lines, + use=d412-unix-25, +d413-unix-s|d463-unix-s|Data General DASHER D413/D463 in DG-UNIX mode with status line, + use=d412-unix-s, +d413-unix-sr|d463-unix-sr|Data General DASHER D413/D463 in DG-UNIX mode with scrolling region, + use=d412-unix-sr, + +d414-unix|d464-unix|Data General D414/D464 in DG-UNIX mode, + use=d413-unix, +d414-unix-w|d464-unix-w|Data General D414/D464 in wide DG-UNIX mode, + use=d413-unix-w, +d414-unix-25|d464-unix-25|Data General D414/D464 in DG-UNIX mode with 25 lines, + use=d413-unix-25, +d414-unix-s|d464-unix-s|Data General D414/D464 in DG-UNIX mode with status line, + use=d413-unix-s, +d414-unix-sr|d464-unix-sr|Data General D414/D464 in DG-UNIX mode with scrolling region, + use=d413-unix-sr, + +d430c-dg|d430-dg|Data General D430C in DG mode, + use=d413-dg, use=dg+fixed, +d430c-dg-ccc|d430-dg-ccc|Data General D430C in DG mode with configurable colors, + use=d413-dg, use=dg+ccc, + +d430c-unix|d430-unix|Data General D430C in DG-UNIX mode, + use=d413-unix, use=dgunix+fixed, +d430c-unix-w|d430-unix-w|Data General D430C in wide DG-UNIX mode, + use=d413-unix-w, use=dgunix+fixed, +d430c-unix-25|d430-unix-25|Data General D430C in DG-UNIX mode with 25 lines, + use=d413-unix-25, use=dgunix+fixed, +d430c-unix-s|d430-unix-s|Data General D430C in DG-UNIX mode with status line, + use=d413-unix-s, use=dgunix+fixed, +d430c-unix-sr|d430-unix-sr|Data General D430C in DG-UNIX mode with scrolling region, + use=d413-unix-sr, use=dgunix+fixed, +d430c-unix-ccc|d430-unix-ccc|Data General D430C in DG-UNIX mode with configurable colors, + use=d413-unix, use=dgunix+ccc, +d430c-unix-w-ccc|d430-unix-w-ccc|Data General D430C in wide DG-UNIX mode with configurable colors, + use=d413-unix-w, use=dgunix+ccc, +d430c-unix-25-ccc|d430-unix-25-ccc|Data General D430C in DG-UNIX mode with 25 lines and configurable colors, + use=d413-unix-25, use=dgunix+ccc, +d430c-unix-s-ccc|d430-unix-s-ccc|Data General D430C in DG-UNIX mode with status line and configurable colors, + use=d413-unix-s, use=dgunix+ccc, +d430c-unix-sr-ccc|d430-unix-sr-ccc|Data General D430C in DG-UNIX mode with scrolling region and configurable colors, + use=d413-unix-sr, use=dgunix+ccc, + +# DASHER D470C color terminal in ANSI mode. +# Like the D460 but with 16 colors and without a compressed mode. +# +# Initialization string 1 sets: +# \E[<0;<1;<2;<4l +# <0 - scrolling enabled +# <1 - blink enabled +# <2 - horizontal scrolling enabled (for alignment) +# <4 - print characters regardless of attributes +# \E[1;1;80w - margins at columns 1 and 80 +# \E[1;6;<2h +# 1 - print all characters even if protected +# 6 - character protection disabled +# <2 - horizontal scrolling disabled +# - (should reset scrolling regions, but that glitches the screen) +# +d470c|d470|Data General DASHER D470C, + is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h, + sgr=\E[%?%p3%t7;%;%?%p4%t5;%;%?%p2%t4;%;%?%p6%t4;7;%;%?%p1%t + 2;7;%;%?%p5%t2;%;m\E)%?%p9%t6\016%e4\017%;, + use=dg+color, use=d460, + +d470c-7b|d470-7b|Data General DASHER D470C in 7 bit mode, + is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h, + sgr=\E[%?%p3%t7;%;%?%p4%t5;%;%?%p2%t4;%;%?%p6%t4;7;%;%?%p1%t + 2;7;%;%?%p5%t2;%;m%?%p9%t\016%e\017%;, + use=dg+color, use=d460-7b, + +# Initialization string 2 sets: +# ^^FQ2 - default cursor (solid rectangle) +# ^^FW - character protection disabled +# ^^F\^ - horizontal scrolling enabled (for alignment) +# ^^FX004? - margins at columns 0 and 79 +# ^^F] - horizontal scrolling disabled +# ^^O - primary character set +# ^^FS00 - default character set (the keyboard native language) +# - (should reset scrolling regions, but that glitches the screen) +# +d470c-dg|d470-dg|Data General DASHER D470C in DG mode, + is2=\036FQ2\036FW\036F\^\036FX004?\036F]\036O + \036FS00, + use=dgmode+color, use=d460-dg, + +# DASHER D555 terminal in ANSI mode. +# Like a D411, but has an integrated phone. +d555|Data General DASHER D555, + use=d411, +d555-7b|Data General DASHER D555 in 7-bit mode, + use=d411-7b, +d555-w|Data General DASHER D555 in wide mode, + use=d411-w, +d555-7b-w|Data General DASHER D555 in wide 7-bit mode, + use=d411-7b-w, +d555-dg|Data General DASHER D555 series in DG mode, + use=d411-dg, + +# DASHER D577 terminal in ANSI mode. +# Like a D411, but acts as a keyboard for serial printers ("KSR" modes). +d577|Data General DASHER D577, + use=d411, +d577-7b|Data General DASHER D577 in 7-bit mode, + use=d411-7b, +d577-w|Data General DASHER D577 in wide mode, + use=d411-w, +d577-7b-w|Data General DASHER D577 in wide 7-bit mode, + use=d411-7b-w, + +d577-dg|d578-dg|Data General DASHER D577/D578 series in DG mode, + use=d411-dg, + +# DASHER D578 terminal. +# Like a D577, but without compressed mode; like a D470C in this respect. +# +# Initialization string 1 sets: +# \E[<0;<1;<2;<4l +# <0 - scrolling enabled +# <1 - blink enabled +# <2 - horizontal scrolling enabled (for alignment) +# <4 - print characters regardless of attributes +# \E[1;1;80w - margins at columns 1 and 80 +# \E[1;6;<2h +# 1 - print all characters even if protected +# 6 - character protection disabled +# <2 - horizontal scrolling disabled +# - (should reset scrolling regions, but that glitches the screen) +# +d578|Data General DASHER D578, + is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h, use=d577, +d578-7b|Data General DASHER D578 in 7-bit mode, + is1=\E[<0;<1;<2;<4l\E[1;1;80w\E[1;6;<2h, use=d577-7b, + +#### Datamedia (dm) +# +# Datamedia was headquartered in Nashua, New Hampshire until it went +# out of business in 1993, but the ID plates on the terminals referred +# to the factory in Pennsauken, NJ. The factory was sold to a PCB board +# manufacturer which threw out all information about the terminals. +# + +cs10|colorscan|Datamedia Color Scan 10, + msgr, + cols#80, lines#24, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%02d;%p2%02dH, cuu1=\E[A, ind=\n, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smso=\E[7m, smul=\E[4m, use=ansi+erase, + +cs10-w|Datamedia Color Scan 10 with 132 columns, + cols#132, + cup=\E[%i%p1%02d;%p2%03dH, use=cs10, + +# (dm1520: removed obsolete ":ma=^\ ^_^P^YH:" -- esr) +dm1520|dm1521|Datamedia 1520, + OTbs, am, xenl, + cols#80, it#8, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^\, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^], + home=^Y, ht=^I, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^\, kcuu1=^_, + khome=^Y, +# dm2500: this terminal has both and . Applications using +# termcap/terminfo directly (rather than through ncurses) might be confused. +dm2500|datamedia2500|Datamedia 2500, + OTbs, OTnc, + cols#80, lines#24, + bel=^G, clear=^^^^^?, cub1=^H, cud1=\n, cuf1=^\, + cup=\014%p2%{96}%^%c%p1%{96}%^%c, cuu1=^Z, + dch1=\020\010\030\035$<10*>, + dl1=\020\032\030\035$<10*>, el=^W, home=^B, + ich1=\020\034\030\035$<10*>, + il1=\020\n\030\035\030\035$<15>, ind=\n, pad=\377, + rmdc=^X^], rmir=\377\377\030\035$<10>, rmso=^X^], + smdc=^P, smir=^P, smso=^N, +# dmchat is like DM2500, but DOES need "all that padding" (jcm 1/31/82) +# also, has a meta-key. +# From: +# (dmchat: ":MT:" changed to ":km:" -- esr) +dmchat|dmchat version of Datamedia 2500, + km, + dl1=\020\032\030\035$<2/>, + il1=\020\n\030\035\030\035$<1*/>, use=dm2500, +# (dm3025: ":MT:" changed to ":km:" -- esr) +dm3025|Datamedia 3025a, + OTbs, km, + cols#80, it#8, lines#24, + bel=^G, clear=\EM$<2>, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, + dch1=\010$<6>, dl1=\EP\EA\EQ$<130>, ed=\EJ$<2>, el=\EK, + home=\EH, ht=^I, il1=\EP\n\EQ$<130>, ind=\n, ip=$<6>, + is2=\EQ\EU\EV, rmdc=\EQ, rmir=\EQ, rmso=\EO0, smdc=\EP, + smir=\EP, smso=\EO1, +dm3045|Datamedia 3045a, + am, eo, km@, ul, xenl, + dch1=\EB$<6>, dl1@, il1@, is2=\EU\EV, kcuf1=\EC, kcuu1=\EA, + kf0=\Ey\r, kf9=\Ex\r, khome=\EH, pad=^?, rmdc@, rmir=\EP, + rmso@, smdc@, smso@, use=dm3025, use=hp+pfk+cr, +# Datamedia DT80 soft switches: +# 1 0=Jump 1=Smooth +# Autorepeat 0=off 1=on +# Screen 0=Dark 1=light +# Cursor 0=u/l 1=block +# +# 2 Margin Bell 0=off 1=on +# Keyclick 0=off 1=on +# ANSI/VT52 0=VT52 1=ANSI +# Xon/Xoff 0=Off 1=On +# +# 3 Shift3 0=Hash 1=UK Pound +# Wrap 0=Off 1=On +# Newline 0=Off 1=On +# Interlace 0=Off 1=On +# +# 4 Parity 0=Odd 1=Even +# Parity 0=Off 1=On +# Bits/Char 0=7 1=8 +# Power 0=60Hz 1=50Hz +# +# 5 Line Interface 0=EIA 1=Loop +# Aux Interface 0=EIA 1=Loop +# Local Copy 0=Off 1=On +# Spare +# +# 6 Aux Parity 0=Odd 1=Even +# Aux Parity 0=Off 1=On +# Aux Bits/Char 0=7 1=8 +# CRT Saver 0=Off 1=On +# dm80/1 is a VT100 lookalike, but it doesn't seem to need any padding. +dm80|dmdt80|dt80|Datamedia dt80/1, + clear=\E[2J\E[H, cuf1=\E[C, cup=%i\E[%p1%d;%p2%dH, + cuu1=\E[A, ed=\E[J, el=\E[K, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, + ri=\EM, rmso=\E[m, rmul=\E[m, sgr0=\E[m\017$<2>, + smso=\E[7m, smul=\E[4m, use=vt100+4bsd, +# except in 132 column mode, where it needs a little padding. +# This is still less padding than the VT100, and you can always turn on +# the ^S/^Q handshaking, so you can use VT100 flavors for things like +# reverse video. +dm80w|dmdt80w|dt80w|Datamedia dt80/1 in 132 char mode, + cols#132, + clear=\E[H\E[2J$<50/>, cud1=\n, + cup=\E[%i%p1%d;%p2%dH$<5/>, cuu1=\E[A$<5/>, + ed=\E[0J$<20/>, el=\E[0K$<20/>, use=dm80, +# From: Adam Thompson Sept 10 1995 +dt80-sas|Datamedia DT803/DTX for SAS usage, + am, bw, + cols#80, lines#24, + acsc=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~, + bel=^G, clear=^L, cr=\r, + csr=\E=%p1%{32}%+%c%{32}%c\E#1\E=%p2%{32}%+%c%{32}%c\E#2, + cub1=^H, cud1=\EB, cuf1=^\, + cup=\E=%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, dl1=\EM, ed=^K, + el=^], ff=^L, home=^Y, ht=^I, hts=\E'1, il1=\EL, ind=\EB, + is2=\E)0\E<\EP\E'0\E$2, kclr=^L, kcub1=^H, kcud1=\n, + kcuf1=^\, kcuu1=^_, ked=^K, kel=^], khome=^Y, mc4=^O, mc5=^N, + rev=\E$2\004, ri=\EI, rmacs=\EG, rmso=^X, sgr0=^X, smacs=\EF, + smso=\E$2\004, tbc=\E'0, + +# Datamedia Excel 62, 64 from Gould/SEL UTX/32 via BRL +# These aren't end-all Excel termcaps; but do insert/delete char/line +# and name some of the extra function keys. (Mike Feldman ccvaxa!feldman) +# The naming convention has been bent somewhat, with the use of E? (where +# E is for 'Excel') as # a name. This was done to distinguish the entries +# from the other Datamedias in use here, and yet to associate a model of +# the Excel terminals with the regular datamedia terminals that share +# major characteristics. +excel62|excel64|Datamedia Excel 62, + dch1=\E[P, kbs=^H, kcub1=^H, kcud1=\n, kf5=\EOu, kf6=\EOv, + kf7=\EOw, kf8=\EOx, kf9=\EOy, rmir=\E[4l, smir=\E[4h, + use=dt80, +excel62-w|excel64-w|Datamedia Excel 62 in 132 char mode, + dch1=\E[P, kbs=^H, kcub1=^H, kcud1=\n, kf5=\EOu, kf6=\EOv, + kf7=\EOw, kf8=\EOx, kf9=\EOy, rmir=\E[4l, smir=\E[4h, + use=dt80w, +excel62-rv|excel64-rv|Datamedia Excel 62 in reverse video mode, + dch1=\E[P, flash=\E[?5l\E[?5h, kbs=^H, kcub1=^H, kcud1=\n, + kf5=\EOu, kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, rmir=\E[4l, + smir=\E[4h, use=dt80, + +#### Falco +# +# Falco Data Products +# 440 Potrero Avenue +# Sunnyvale, CA 940864-196 +# Vox: (800)-325-2648 +# Fax: (408)-745-7860 +# Net: techsup@charm.sys.falco.com +# +# Current Falco models as of 1995 are generally ANSI-compatible and support +# emulations of DEC VT-series, Wyse, and TeleVideo types. +# + +# Test version for Falco ts-1. See for info +# This terminal was released around 1983 and was discontinued long ago. +# The standout and underline highlights are the same. +falco|ts1|ts-1|Falco ts-1, + OTbs, am, + cols#80, it#8, lines#24, + bel=^G, clear=\E*, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET\EG0\010, home=^^, ht=^I, il1=\EE, + ind=\n, is2=\Eu\E3, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, + kf0=^A0\r, rmir=\Er, rmso=\Eg0, rmul=\Eg0, sgr0=\Eg0, + smir=\Eq, smso=\Eg1, smul=\Eg1, +falco-p|ts1p|ts-1p|Falco ts-1 with paging option, + OTbs, am, da, db, mir, msgr, ul, + cols#80, it#8, lines#24, + bel=^G, cbt=\EI, clear=\E*, cr=\r, cub1=^H, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, dch1=\EW, dl1=\ER, + ed=\EY, el=\ET\EG0\010\Eg0, ht=^I, il1=\EE, ind=\n, + is2=\EZ\E3\E_c, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, khome=\E[H, rmcup=\E_b, rmir=\Er, rmso=\Eg0, + rmul=\Eg0, sgr0=\Eg0, smcup=\E_d, smir=\Eq, smso=\Eg4, + smul=\Eg1, use=ansi+local1, + +# (ts100: I added / based on the init string -- esr) +ts100|ts100-sp|Falco ts100-sp, + mir, xenl, xon, + vt#3, + cub1=^H, cud1=\n, cuf1=\E[C$<2>, cuu1=\E[A$<2>, dch1=\E~W, + dl1=\E~R, ich1=\E~Q, il1=\E~E, is1=\E~)\E~ea, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, rmam=\E[?7l, + rmkx=\E[?1l\E>, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, smam=\E[?7h, + smkx=\E[?1h\E=, use=ansi+csr, use=ansi+local, + use=decid+cpr, use=vt100+4bsd, use=vt100+fnkeys, + +ts100-ctxt|Falco ts-100 saving context, + rmcup=\E~_b, smcup=\E~_d\E[2J, use=ts100, + +#### Florida Computer Graphics +# + +# Florida Computer Graphics Beacon System, using terminal emulator program +# "host.com", as provided by FCG. This description is for an early release +# of the "host" program. Known bug: clears the whole screen, so it's +# commented out. + +# From: David Bryant 1/7/83 +beacon|FCG Beacon System, + am, da, db, + cols#80, lines#32, + bel=\ESTART\r\E37\r\EEND\r$<1>, + blink=\ESTART\r\E61\,1\r\EEND\r, clear=\EZ$<10>, cr=\r, + cub1=^H, cud1=\n, cuf1=\EV, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<20>, cuu1=\EU, + dch1=\EW, dl1=\ER, el=\ET, home=\EH$<10>, ich1=\EQ, il1=\EE, + ind=\n, rev=\ESTART\r\E59\,1\r\EEND\r, rmcup=, + rmso=\ESTART\r\E70\,0\r\EEND\r$<20>, + rmul=\ESTART\r\E60\,0\r\EEND\r, + sgr0=\ESTART\r\E78\r\E70\,0\r\EEND\r$<20>, + smcup=\ESTART\r\E2\,0\r\E12\r\EEND\r$<10>, + smso=\ESTART\r\E70\,6\r\EEND\r$<20>, + smul=\ESTART\r\E60\,1\r\EEND\r, + +#### Fluke +# + +# The f1720a differences from ANSI: no auto margin, destructive +# tabs, # of lines, funny highlighting and underlining +f1720|f1720a|fluke 1720A, + xt, + cols#80, lines#16, xmc#1, + bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, ind=\ED, + is2=\E[H\E[2J, kcub1=^_, kcud1=^], kcuf1=^^, kcuu1=^\, + ri=\EM, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smso=\E[7m, + smul=\E[4m, use=ansi+local1, + +#### Liberty Electronics (Freedom) +# +# Liberty Electronics +# 48089 Fremont Blvd +# Fremont CA 94538 +# Vox: (510)-623-6000 +# Fax: (510)-623-7021 + +# From: +# (f100: added empty to suppress a tic warning; +# made this relative to adm+sgr -- note that isn't +# known to work for f100 but does on the f110. --esr) +f100|freedom|freedom100|Liberty Freedom model 100, + OTbs, am, bw, hs, mir, msgr, xon, + cols#80, lines#24, + acsc=, bel=^G, cbt=\EI, clear=^Z, cr=\r, cub1=^H, cud1=\n, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW, dl1=\ER$<11.5*>, dsl=\Eg\Ef\r, ed=\EY, el=\ET, + flash=\Eb$<200>\Ed, fsl=\r, home=^^, hpa=\E]%p1%{32}%+%c, + ht=^I, hts=\E1, il1=\EE$<8.5*>, ind=\n, ip=$<6>, + is2=\Eg\Ef\r\Ed, kbs=^H, kcbt=\EI, kcub1=^H, kcud1=^V, + kcuf1=^L, kcuu1=^K, kf1=^A@\r, kf10=^AI\r, kf2=^AA\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=^^, ri=\Ej, rmacs=\E$, rmir=\Er, + smacs=\E%%, smir=\Eq, tbc=\E3, tsl=\Eg\Ef, + vpa=\E[%p1%{32}%+%c, use=adm+sgr, +f100-rv|freedom-rv|Liberty Freedom 100 in reverse video, + flash=\Ed$<200>\Eb, is2=\Eg\Ef\r\Eb, use=f100, +# The f110 and f200 have problems with vi(1). They use the ^V +# code for the down cursor key. When kcud1 is defined in terminfo +# as ^V, the Control Character Quoting capability (^V in insert mode) +# is lost! It cannot be remapped in vi because it is necessary to enter +# a ^V to to quote the ^V that is being remapped!!! +# +# f110/f200 users will have to decide whether +# to lose the down cursor key or the quoting capability. We will opt +# initially for leaving the quoting capability out, since use of VI +# is not generally applicable to most interactive applications +# (f110: added , & from f100 -- esr) +f110|freedom110|Liberty Freedom 110, + bw@, eslok, + it#8, wsl#80, + blink=\EG2, bold=\EG0, civis=\E.1, cnorm=\E.2, cud1=^V, + dim=\EG@, dl1=\ER, dsl=\Ef\r, flash=\Eb$<200/>\Ed, il1=\EE, + ip@, is2@, kclr=^^, kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET, + kf0=^AI\r, kf10@, kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`, + ri=\EJ, rmacs=\E%%, rmir=\Er\EO, smacs=\E$, smir=\EO\Eq, + smso=\EG<, tsl=\Ef, use=f100, +f110-14|Liberty Freedom 110 14inch, + dch1@, use=f110, +f110-w|Liberty Freedom 110 - 132 cols, + cols#132, use=f110, +f110-14w|Liberty Freedom 110 14in/132 cols, + cols#132, + dch1@, use=f110, +# (f200: added to suppress tic warnings re / --esr) +f200|freedom200|Liberty Freedom 200, + OTbs, am, eslok, hs, mir, msgr, xon, + cols#80, it#8, lines#24, wsl#80, + acsc=, bel=^G, blink=\EG2, bold=\EG0, cbt=\EI, civis=\E.0, + clear=^Z, cnorm=\E.1, cr=\r, + csr=\Em0%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=^V, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW, dim=\EG@, dl1=\ER, dsl=\Ef\r, ed=\EY, el=\ET, + flash=\Eo$<200/>\En, fsl=\r, home=^^, + hpa=\E]%p1%{32}%+%c, hts=\E1, il1=\EE, ind=\n, kbs=^H, + kclr=^^, kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, + kdl1=\ER, ked=\EY, kel=\ET, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, kich1=\EQ, kil1=\EE, mc4=\Ea, mc5=\E`, + ri=\EJ, rmacs=\E%%, rmir=\Er, smacs=\E$, smir=\Eq, smso=\EG<, + tbc=\E3, tsl=\Ef, vpa=\E[%p1%{32}%+%c, use=adm+sgr, +f200-w|Liberty Freedom 200 - 132 cols, + cols#132, use=f200, +# The f200 has the ability to reprogram the down cursor key. The key is +# reprogrammed to ^J (linefeed). This value is remembered in non-volatile RAM, +# so powering the terminal off and on will not cause the change to be lost. +f200vi|Liberty Freedom 200 for vi, + flash=\Eb$<200/>\Ed, kcud1=\n, use=f200, +f200vi-w|Liberty Freedom 200 - 132 cols for vi, + cols#132, use=f200vi, + +#### GraphOn (go) +# +# Graphon Corporation +# 544 Division Street +# Campbell, CA 95008 +# Vox: (408)-370-4080 +# Fax: (408)-370-5047 +# Net: troy@graphon.com (Troy Morrison) +# +# +# The go140 and go225 have been discontinued. GraphOn now makes X terminals, +# including one odd hybrid that starts out life on power-up as a character +# terminal, than can be switched to X graphics mode (driven over the serial +# line) by an escape sequence. No info on this beast yet. +# (go140: I added / based on the init string -- esr) +go140|graphon go-140, + OTbs, + cols#80, it#8, lines#24, + clear=\E[H\E[2J$<10/>, cub1=^H, + cup=\E[%i%p1%2d;%p2%2dH, dch1=\E[P, dl1=\E[M, + ed=\E[J$<10/>, el=\E[K, ht=^I, + if=/usr/share/tabset/vt100, il1=\E[L, + is2=\E<\E=\E[?3l\E[?7l\E(B\E[J\E7\E[;r\E8\E[m\E[q, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H, ri=\EM, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, + rmul=\E[m, sgr0=\E[m, smam=\E[?7h, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, use=ansi+local1, + +go140w|graphon go-140 in 132 column mode, + am, + cols#132, + is2=\E<\E=\E[?3h\E[?7h\E(B\E[J\E7\E[;r\E8\E[m\E[q, + use=go140, +# Hacked up vt200 termcap to handle GO-225/VT220 +# From: +# (go225: I added / based on the init string -- esr) +go225|go-225|Graphon 225, + OTbs, am, mir, xenl, + cols#80, it#8, lines#25, vt#3, + blink=\E[5m, bold=\E[1m, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, dl1=\E[M, + home=\E[H, ht=^I, il1=\E[L, ind=\ED, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, rev=\E[7m, + rf=/usr/share/tabset/vt100, ri=\EM, rmam=\E[?7l, + rmcup=\E[!p\E[?7h\E[2;1;1#w, rmir=\E[4l, rmkx=\E>, + rmso=\E[27m, rmul=\E[24m, rs1=\E[!p\E[?7h\E[2;1;1#w, + sgr0=\E[m, smam=\E[?7h, smcup=\E[2;0#w\E[1;25r, + smir=\E[4h, smkx=\E=, smso=\E[7m, smul=\E[4m, + use=ansi+arrows, use=ansi+csr, use=ansi+erase, + +#### Harris (Beehive) +# +# Bletch. These guys shared the Terminal Brain Damage laurels with Hazeltine. +# Their terminal group is ancient history now (1995) though the parent +# company is still in business. +# + +# Beehive documentation is undated and marked Preliminary and has no figures +# so we must have early Superbee2 (Model 600, according to phone conversation +# with mfr.). It has proved reliable except for some missing padding +# (notably after \EK and at bottom of screen). +# +# The key idea is that AEP mode is poison for & that US's in +# the local memory should be avoided like the plague. That means +# that the 2048 character local buffer is used as 25 lines of 80 +# characters, period. No scrolling local memory, folks. It also +# appears that we cannot use naked INS LINE feature since it uses +# US. The sbi fakes with an 80-space insert that may be too +# slow at low speeds; also spaces get converted to \040 which is +# too long for some programs (not vi). DEL LINE is ok but slow. +# +# The string is designed for last line of screen ONLY; cup to +# 25th line corrects the motion inherent in scrolling to Page 1. +# +# There is one understood bug. It is that the screen appears to +# pop to a new (blank) page after a , or leave a half-line +# ellipsis to a quad that is the extra 48 memory locations. The +# data received is dumped into memory but not displayed. Not to +# worry if is being used; the lines not displayed will be, +# whenever the cursor is moved up there. Since is addressed +# relative to MEMORY of window, nothing is lost; but beware of +# relative cursor motion (,,,). Recommended, +# therefore, is setenv MORE -c . +# +# WARNING: Not all features tested. +# +# Timings are assembled from 3 sources. Some timings may reflect +# SB2/Model 300 that were used if more conservative. +# Tested on a Model 600 at 1200 and 9600 bd. +# +# The BACKSPACEkb option is cute. The NEWLINE key, so cleverly +# placed on the keyboard and useless because of AEP, is made +# into a backspace key. In use ESC must be pressed twice (to send) +# and sending ^C must be prefixed by ESC to avoid that weird +# transmit mode associated with ENTER key. +# +# IF TERMINAL EVER GOES CATATONIC with the cursor buzzing across +# the screen, then it has dropped into ENTER mode; hit +# RESET--ONLINE--!tset. +# +# As delivered this machine has a FATAL feature that will throw +# it into that strange transmit state (SPOW) if the space bar is +# hit after a CR is received, but before receiving a LF (or a +# few others). +# +# The circuits MUST be modified to eliminate the SPOW latch. +# This is done by strapping on chip A46 of the I/O board; cut +# the p.c. connection to Pin 5 and strap Pin 5 to Pin 8 of that +# chip. This mod has been checked out on a Mod 600 of Superbee II. +# With this modification absurdly high timings on cr are +# unnecessary. +# +# NOTE WELL that the rear panel switch should be set to CR/LF, +# not AEP! +# +sb1|Beehive SuperBee, + OTbs, am, bw, da, db, mir, ul, xsb, + cols#80, lines#25, xmc#1, + bel=^G, cbt=\E`$<650>, clear=\EH$<1>\EJ$<3>, cr=$<1>\r, + cub1=^H, cud1=\n, cuf1=\EC$<3>, cup=\EF%p2%03d%p1%03d, + cuu1=\EA$<3>, dch1=\EP$<3>, dl1=\EM$<100>, ed=\EJ$<3>, + el=\EK$<3>, home=\EH$<1>, ht=^I, hts=\E1, + il1=\EN\EL$<3>\EQ\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s + \s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s + \s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s + \s\s\s\s\s\EP$<3>\s\EO\ER\EA$<3>, + ind=\n, is2=\EE$<3>\EX\EZ\EO\Eb\Eg\ER, kbs=^_, kdl1=\EM, + ked=\EJ, kel=\EK, kf0=\E2, kf9=\E1, khome=\EH, kich1=\EQ\EO, + krmir=\ER, lf0=TAB CLEAR, lf9=TAB SET, rmcup=, rmir=\ER, + rmso=\E_3, rmul=\E_3, sgr0=\E_3, smcup=\EO, smir=\EQ\EO, + smso=\E_1, smul=\E_0, tbc=\E3, use=hp+pfk-cr, + use=vt52+arrows, +sbi|superbee|Beehive SuperBee at Indiana U., + xsb, + cr=\r$<1>, il1=\EN$<1>\EL$<9>\EQ \EP$<9> \EO\ER\EA, + use=sb1, +# Alternate (older) description of Superbee - f1=escape, f2=^C. +# Note: there are at least 3 kinds of superbees in the world. The sb1 +# holds onto escapes and botches ^C's. The sb2 is the best of the 3. +# The sb3 puts garbage on the bottom of the screen when you scroll with +# the switch in the back set to CRLF instead of AEP. This description +# is tested on the sb2 but should work on all with either switch setting. +# The f1/f2 business is for the sb1 and the can be taken out for +# the other two if you want to try to hit that tiny escape key. +# This description is tricky: being able to use cup depends on there being +# 2048 bytes of memory and the hairy string. +superbee-xsb|Beehive SuperBee (improved), + am, da, db, xsb, + cols#80, it#8, lines#25, + clear=\EH\EJ$<3>, cnorm=\n, cr=\r$<1000>, cub1=^H, cud1=\n, + cuf1=\EC, cup=\EF%p2%3d%p1%3d, cuu1=\EA$<3>, + dch1=\EP$<3>, dl1=\EM$<100>, ed=\EJ$<3>, el=\EK$<3>, + home=\EH, ht=^I, hts=\E1, + ind=\n\0\0\0\n\0\0\0\EA\EK\0\0\0\ET\ET, is2=\EH\EJ, + khome=\EH, rmso=\E_3, sgr0=\E_3, smso=\E_1, tbc=\E3, + use=hp+pfk-cr, use=vt52+arrows, +# This loses on lines > 80 chars long, use at your own risk +superbeeic|SuperBee with insert char, + ich1=, rmir=\ER, smir=\EQ, use=superbee-xsb, +sb2|sb3|fixed SuperBee, + xsb@, use=superbee, + +#### Beehive Medical Electronics +# +# Steve Seymour writes (Wed, 03 Feb 1999): +# Regarding your question though; Beehive terminals weren't made by Harris. +# They were made by Beehive Medical Electronics in Utah. They went out of +# business in the early '80s. +# +# (OK, then, I don't know why a couple of these say "Harris Beehive".) +# + +# Reports are that most of these Beehive entries (except superbee) have not +# been tested and do not work right. is a trouble spot. Be warned. + +# (bee: was empty, which is obviously bogus -- esr) +beehive|bee|Harris Beehive, + OTbs, am, mir, + cols#80, lines#24, + cbt=\E>, clear=\EE, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EF%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EP, + dl1=\EM, ed=\EJ, el=\EK, home=\EH, il1=\EL, kbs=^H, kcbt=\E>, + kclr=\EE, kdch1=\EP, kdl1=\EM, kel=\EK, khome=\EH, kich1=\EQ, + kil1=\EL, krmir=\E@, rmir=\E@, rmso=\Ed@, rmul=\Ed@, + sgr0=\Ed@, smir=\EQ, smso=\EdP, smul=\Ed`, use=vt52+arrows, +# set tab is ^F, clear (one) tab is ^V, no way to clear all tabs. +# good grief - does this entry make :sg:/:ug: when it doesn't have to? +# look at those spaces in /. Seems strange to me... +# (beehive: removed, no such file. If you +# really care, cook up one using ^F -- esr) +beehive3|bh3m|beehiveIIIm|Harris Beehive 3m, + OTbs, am, + cols#80, it#8, lines#20, + bel=^G, clear=^E^R, cr=\r, cub1=^H, cud1=\n, cuf1=^L, cuu1=^K, + dl1=\021$<350>, ed=^R, el=^P, home=^E, ht=^I, hts=^F, + il1=\023$<160>, ind=\n, ll=^E^K, rmso=\s^_, smso=^]\s, +beehive4|bh4|Beehive 4, + am, + cols#80, lines#24, + bel=^G, clear=\EE, cr=\r, cub1=\ED, cud1=\n, cuf1=\EC, + cuu1=\EA, ed=\EJ, el=\EK, home=\EH, ind=\n, +# There was an early Australian kit-built computer called a "Microbee". +# It's not clear whether this is for one of those or for a relative +# of the Beehive. +microb|microbee|Micro Bee series, + OTbs, am, + cols#80, it#8, lines#24, + bel=^G, clear=\EE, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EF%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ, + el=\EK, ht=^I, ind=\n, kf9=\Ex, khome=\EH, rmso=\Ed@, + rmul=\Ed@, sgr0=\Ed@, smso=\s\EdP, smul=\Ed`, + use=hp+pfk-cr, use=vt52+arrows, + +# 8675, 8686, and bee from Cyrus Rahman +# (8675: changed k10, k11...k16 to k;, F1...F6 -- esr) +ha8675|Harris 8675, + is2=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU, kf1=^F, + kf10=\Ed, kf11=^W, kf12=\ER, kf13=\EE, kf14=\EI, kf15=\Ei, + kf16=\Eg, kf2=^P, kf3=^N, kf4=^V, kf5=\n, kf6=^T, kf7=^H, kf8=^?, + kf9=\Ee, use=bee, +# (8686: changed k10, k11...k16 to k;, F1...F6; fixed broken continuation +# in :is: -- esr) +ha8686|Harris 8686, + is2=\ES\E#\E*\Eh\Em\E?\E1\E9\E@\EX\EU\E"*Z01\E"8F35021B7C83# + \E"8F45021B7D83#\E"8F55021B7E83#\E"8F65021B7F83#\E"8F750 + 21B7383#\E"8F851BD7#\E"8F95021B7083#\E"8FA5021B7183#\E"8 + FB5021B7283#, + kf1=^B\Ep^C, kf10=\Ej, kf11=\EW, kf12=^B\E{^C, + kf13=^B\E|^C, kf14=^B\E}^C, kf15=^B\E~^C, kf16=^B\E^?^C, + kf2=^B\Eq^C, kf3=^B\Er^C, kf4=^B\Es^C, kf5=\E3, kf6=\EI, + kf7=\ER, kf8=\EJ, kf9=\E(, use=bee, + +#### Hazeltine +# +# Hazeltine appears to be out of the terminal business as of 1995. These +# guys were co-owners of the Terminal Brain Damage Hall Of Fame along with +# Harris. They have a hazeltine.com domain (but no web page there ) and can +# be reached at: +# +# Hazeltine +# 450 East Pulaski Road +# Greenlawn, New York 11740 +# +# As late as 1993, manuals for the terminal product line could still be +# purchased from: +# +# TRW Customer Service Division +# 15 Law Drive +# P.O. Box 2076 +# Fairfield, NJ 07007-2078 +# +# They're now (1998) a subsidiary of General Electric, operating under the +# marque "GEC-Marconi Hazeltine" and doing military avionics. Web page +# at . +# + +# Since is blank, when you want to erase something you +# are out of luck. You will have to do ^L's a lot to +# redraw the screen. h1000 is untested. It doesn't work in +# vi - this terminal is too dumb for even vi. (The code is +# there but it isn't debugged for this case.) +hz1000|Hazeltine 1000, + OTbs, + cols#80, lines#12, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\s, home=^K, + ind=\n, +# From: Thu Aug 20 09:09:18 1981 +hz1420|Hazeltine 1420, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\E^\, cr=\r, cub1=^H, cud1=\n, cuf1=^P, + cup=\E\021%p2%c%p1%{32}%+%c, cuu1=\E^L, dl1=\E^S, + ed=\E^X, el=\E^O, ht=^N, il1=\E^Z, ind=\n, rmso=\E^Y, + smso=\E^_, +# New "safe" cursor movement (11/87) from . Prevents +# freakout with out-of-range args and tn3270. No hz since it needs to +# receive tildes. +hz1500|Hazeltine 1500, + OTbs, am, hz, + cols#80, lines#24, + bel=^G, clear=~^\, cr=\r, cub1=^H, cud1=~^K, cuf1=^P, + cup=~\021%p2%p2%?%{30}%>%t%{32}%+%;%{96}%+%c%p1%{96}%+%c, + cuu1=~^L, dl1=~\023$<40>, ed=~\030$<10>, el=~^O, home=~^R, + il1=~\032$<40>, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^P, + kcuu1=~^L, khome=~^R, rmso=~^Y, smso=~^_, +# h1510 assumed to be in sane escape mode. Else use h1500. +# (h1510: early versions of this entry apparently had ", +# , but these caps were commented out in 8.3; also, +# removed incorrect and overridden ":do=^J:" -- esr) +hz1510|Hazeltine 1510, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\E^\, cr=\r, cub1=^H, cud1=\E^K, cuf1=^P, + cup=\E\021%p2%c%p1%c, cuu1=\E^L, dl1=\E^S, ed=\E^X, + el=\E^O, il1=\E^Z, ind=\n, +# Hazeltine 1520 +# The following switch settings are assumed for normal operation: +# FULL CR U/L_CASE ESCAPE +# FORMAT_OFF EOM_A_OFF EOM_B_OFF WRAPAROUND_ON +# Other switches may be set for operator convenience or communication +# requirements. +hz1520|Hazeltine 1520, + OTbs, am, bw, msgr, + cols#80, lines#24, + bel=^G, bold=\E^_, clear=\E^\, cr=\r, cub1=^H, cud1=\n, + cuf1=^P, cup=\E\021%p2%c%p1%c, cuu1=\E^L, dl1=\E^S, + ed=\E^X, el=\E^O, home=\E^R, il1=\E^Z, ind=\n, kbs=^H, + kclr=\E^\, kcub1=^H, kcud1=\E^K, kcuf1=^P, kcuu1=\E^L, + kdl1=\E^S, ked=\E^X, kel=\E^O, khome=\E^R, kil1=\E^Z, + rmso=\E^Y, rs1=\E$\E\005\E?\E\031, sgr0=\E^Y, smso=\E^_, +# This version works with the escape switch off +# (h1520: removed incorrect and overridden ":do=^J:" -- esr) +hz1520-noesc|Hazeltine 1520 (no escape), + am, hz, + cols#80, lines#24, + bel=^G, clear=~^\, cr=\r, cub1=^H, cud1=~^K, cuf1=^P, + cup=~\021%p2%c%p1%c$<1>, cuu1=~^L, dl1=~^S, ed=~^X, el=~^O, + home=~^R, il1=~^Z, ind=\n, rmso=~^Y, smso=~^_, +# Note: the h1552 appears to be the first Hazeltine terminal which +# is not braindamaged. It has tildes and backprimes and everything! +# Be sure the auto lf/cr switch is set to cr. +hz1552|Hazeltine 1552, + OTbs, + cud1=\n, dl1=\EO, il1=\EE, lf1=blue, lf2=red, lf3=green, + use=vt52, +hz1552-rv|Hazeltine 1552 reverse video, + cud1=\n, rmso=\ET, smso=\ES, use=hz1552, +# Note: h2000 won't work well because of a clash between upper case and ~'s. +hz2000|Hazeltine 2000, + OTbs, OTnc, am, + cols#74, lines#27, + bel=^G, clear=~\034$<6>, cub1=^H, cud1=\n, + cup=~\021%p2%c%p1%c, dl1=~\023$<6>, home=~^R, + il1=~\032$<6>, ind=\n, pad=^?, +# Date: Fri Jul 23 10:27:53 1982. Some unknown person wrote: +# I tested this termcap entry for the Hazeltine Esprit with vi. It seems +# to work ok. There is one problem though if one types a lot of garbage +# characters very fast vi seems not able to keep up and hangs while trying +# to insert. That's in insert mode while trying to insert in the middle of +# a line. It might be because the Esprit doesn't have insert char and delete +# char as a built in function. Vi has to delete to end of line and then +# redraw the rest of the line. +esprit|Hazeltine Esprit I, + OTbs, am, bw, + cols#80, lines#24, + bel=^G, cbt=\E^T, clear=\E^\, cr=\r, cub1=^H, cud1=\E^K, + cuf1=^P, cup=\E\021%p2%c%p1%c, cuu1=\E^L, dl1=\E^S, + ed=\E^W, el=\E^O, home=\E^R, il1=\E^Z, ind=\n, is2=\E?, kbs=^H, + kcub1=^H, kcud1=\E^K, kcuf1=^P, kcuu1=\E^L, kf0=^B0\n, + kf1=^B1\n, kf2=^B2\n, kf3=^B3\n, kf4=^B4\n, kf5=^B5\n, + kf6=^B6\n, kf7=^B7\n, kf8=^B8\n, kf9=^B9\n, khome=\E^R, + lf0=0, lf1=1, lf2=2, lf3=3, lf4=4, lf5=5, lf6=6, lf7=7, lf8=8, lf9=9, + rmkx=\E>, rmso=\E^Y, smkx=\E<, smso=\E^_, +esprit-am|Hazeltine esprit auto-margin, + am, use=esprit, +# Hazeltine Modular-1 from Cliff Shackelton via BRL +# Vi it seems always wants to send a control J for "do" and it turned out +# that the terminal would work somewhat if the auto LF/CR was turned off. +# (hmod1: removed :dn=~^K: -- esr) +hmod1|Hazeltine Modular 1, + OTbs, am, hz, + cols#80, lines#24, + bel=^G, cbt=~^T, clear=~^\, cr=\r, cub1=^H, cud1=~^K, cuf1=^P, + cup=~\021%p2%c%p1%c, cuu1=~^L, dl1=~^S, home=~^R, il1=~^Z, + ind=\n, kcub1=^H, kcud1=~^K, kcuf1=^P, kcuu1=~^L, khome=~^R, + rc=~^Q, rmso=~^Y, sc=~^E, sgr0=~^Y, smso=~^_, +# +# Hazeltine Executive 80 Model 30 (1554?) +# from Will Martin via BRL +# Like VT100, except for different "am" behavior. +hazel|exec80|h80|he80|Hazeltine Executive 80, + OTbs, OTpt, am, + cols#80, it#8, lines#24, vt#3, + OTnl=\n, bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>, + clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2/>, cup=\E[%i%p1%d;%p2%dH$<5/>, + cuu1=\E[A$<2/>, ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, + ht=^I, is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, rev=\E[7m$<2/>, + rf=/usr/share/tabset/vt100, ri=\EM$<5/>, + rmkx=\E[?1l\E>, rmso=\E[m$<2/>, rmul=\E[m$<2/>, + rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr0=\E[m$<2/>, smkx=\E[?1h\E=, smso=\E[7m$<2/>, + smul=\E[4m$<2/>, use=ansi+csr, + +#### IBM +# + +ibm327x|line mode IBM 3270 style, + gn, + clear=\r\n, el=\r, home=\r, + +ibm3101|i3101|IBM 3101-10, + OTbs, am, xon, + cols#80, lines#24, + bel=^G, clear=\EK, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ, + el=\EI, home=\EH, hts=\E0, ind=\n, nel=\r\n, tbc=\EH, + use=vt52+arrows, +ibm3151|IBM 3151 display, + is2=\E S, rmacs=\E>B, rs2=\E S, + sgr=\E4%{64}%?%p1%t%{65}%|%;%?%p2%t%{66}%|%;%?%p3%t%{65}%|%; + %?%p4%t%{68}%|%;%?%p5%t%{64}%|%;%?%p6%t%{72}%|%;%?%p7%t + %{80}%|%;%c%?%p9%t\E>A%e\E>B%;, + sgr0=\E4@\E>B, smacs=\E>A, use=ibm3162, +# From: Mark Easter 29 Oct 1992 +# removed kend, knp, kpp -TD +# +# From: Stephen Powell 23 Apr 2015 +# Added ich1 (kich1 without ich1 doesn't make sense). +# Added il1 (kil1 without il1 doesn't make sense). +# Added xon (terminal uses XON/XOFF flow control). +# +ibm3161|ibm3163|wy60-316X|wyse60-316X|IBM 3161/3163 display, + OTbs, am, mir, msgr, xon, + cols#80, it#8, lines#24, + acsc=j\352k\353l\354m\355n\356q\361t\364u\365v\366w\367x + \370, + bel=^G, blink=\E4D, bold=\E4H, clear=\EH\EJ, cr=\r, cub1=\ED, + cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + cuu1=\EA, dch1=\EQ, dl1=\EO, ed=\EJ, el=\EI, home=\EH, + ich1=\EP \010, il1=\EN, ind=\n, invis=\E4P, kbs=^H, kcbt=\E2, + kclr=\EL\r, kctab=\E1, kdch1=\EQ, kdl1=\EO, ked=\EJ, kel=\EI, + kf1=\Ea\r, kf10=\Ej\r, kf11=\Ek\r, kf12=\El\r, kf13=\E!a\r, + kf14=\E!b\r, kf15=\E!c\r, kf16=\E!d\r, kf17=\E!e\r, + kf18=\E!f\r, kf19=\E!g\r, kf2=\Eb\r, kf20=\E!h\r, + kf21=\E!i\r, kf22=\E!j\r, kf23=\E!k\r, kf24=\E!l\r, + kf3=\Ec\r, kf4=\Ed\r, kf5=\Ee\r, kf6=\Ef\r, kf7=\Eg\r, + kf8=\Eh\r, kf9=\Ei\r, khome=\EH, khts=\E0, kich1=\EP \010, + kil1=\EN, ktbc=\E 1, mc4=^P^T, mc5=^P^R, rev=\E4A, + rmcup=\E>A, rmso=\E4@, rmul=\E4@, + sgr=\E4%{64}%?%p1%t%{65}%|%;%?%p2%t%{66}%|%;%?%p3%t%{65}%|%; + %?%p4%t%{68}%|%;%?%p5%t%{64}%|%;%?%p6%t%{72}%|%;%?%p7%t + %{80}%|%;%c%?%p9%t\E>A%e\E<@%;, + sgr0=\E4@\E<@, smcup=\E>A, smso=\E4A, smul=\E4B, + use=vt52+arrows, + +ibm3161-C|IBM 3161-C NLS terminal using cartridge, + rmcup=\E>B, s0ds=\E>B, s1ds=\E>A, smcup=\E>B, use=ibm3161, +# +# From: Stephen Powell 23 Apr 2015 +# Deleted il1. (il1 will now be inherited from ibm3161-C, which inherits +# it from ibm3161. +# +ibm3162|IBM 3162 display, + blink=\E4$a, bold=\E4(a, invis=\E40a, rev=\E4!a, + rmso=\E4>b, rmul=\E4=b, sgr0=\E4@, smso=\E4!a, smul=\E4"a, + use=ibm3161-C, + +# This really should not use setab/setaf, but it is clear that the +# original terminfo does not toggle red/blue colors as in setb/setf. +ibm3164|i3164|IBM 3164, + msgr, + colors#8, pairs#64, + op=\E4 "@, rmcup=\E!9(N\E>B, s0ds=\E>B, s1ds=\E>A, + setab=\E4 %p1%{64}%+%c, + setaf=\E4%?%p1%t %p1%{32}%+%c%e!'%;@, + smcup=\E!9/N\E>B, use=ibm3161, + +ibm5151|wy60-AT|wyse60-AT|IBM 5151 Monochrome display, + am, bw, msgr, xon, + cols#80, it#8, lines#25, + acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x + \263, + bel=^G, cr=\r, cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, + dch1=\E[P, ech=\E[%p1%dX, home=\E[H, hpa=\E[%i%p1%dG, + ind=\E[S, is2=\Ec, kcbt=\E[Z, kclr=\E[144q, kdch1=\E[P, + ked=\E[148q, kel=\E[142q, kend=\E[146q, kf1=\E[001q, + kf10=\E[010q, kf11=\E[011q, kf12=\E[012q, kf13=\E[013q, + kf14=\E[014q, kf15=\E[015q, kf16=\E[016q, kf17=\E[017q, + kf18=\E[018q, kf19=\E[019q, kf2=\E[002q, kf20=\E[020q, + kf21=\E[021q, kf22=\E[022q, kf23=\E[023q, kf24=\E[024q, + kf25=\E[025q, kf26=\E[026q, kf27=\E[027q, kf28=\E[028q, + kf29=\E[029q, kf3=\E[003q, kf30=\E[030q, kf31=\E[031q, + kf32=\E[032q, kf33=\E[033q, kf34=\E[034q, kf35=\E[035q, + kf36=\E[036q, kf4=\E[004q, kf5=\E[005q, kf6=\E[006q, + kf7=\E[007q, kf8=\E[008q, kf9=\E[009q, kich1=\E[139q, + kil1=\E[140q, kind=\E[151q, knp=\E[154q, kpp=\E[150q, + kri=\E[155q, krmir=\E[4l, ri=\E[T, rmir=\E[4l, rs2=\Ec, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 + %;%?%p7%t;8%;m, + smir=\E[4h, use=ansi+arrows, use=ansi+erase, + use=ansi+idl, use=ansi+local, use=ansi+sgrbold, + use=ecma+index, + +ibmaed|IBM Experimental display, + OTbs, am, eo, msgr, + cols#80, it#8, lines#52, + clear=\EH\EK, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ, + dl1=\EO, ed=\EJ, el=\EI, flash=\EG, home=\EH, ht=^I, ich1=\EP, + il1=\EN, kbs=^H, rmso=\E0, sgr0=\E0, smso=\E0, + use=vt52+arrows, +ibm-apl|apl|IBM apl terminal simulator, + lines#25, use=dm1520, +# (ibmmono: this had an unknown `sb' boolean, I changed it to `bs'. +# Also it had ":I0=f10:" which pretty obviously should be "l0=f10" -- esr) +ibmmono|IBM workstation monochrome, + eslok, hs, + bold=\EZ, dl1=\EM, dsl=\Ej\EY8 \EI\Ek, fsl=\Ek, il1=\EL, + invis=\EF\Ef0;\Eb0;, kbs=^H, kf0=\E<, kf1=\ES, kf2=\ET, + kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\EY, + khome=\EH, kich1=\0, kind=\EE, knp=\EE, kpp=\Eg, kri=\EG, + lf0=f10, rev=\Ep, ri=\EA, rmso=\Ez, rmul=\Ew, + sgr0=\Ew\Eq\Ez\EB, smso=\EZ, smul=\EW, tsl=\Ej\EY8%+ \Eo, + use=ibm3101, +ibmega|IBM Enhanced Color Display, + ht=^I, kcub1=^H, kcud1=\n, use=ibmmono, +# This color scheme is assumed in some recent IBM terminal descriptions +# (green on black, emulated on a 16-color terminal). +ibm+color|IBM color definitions, + colors#8, ncv#3, pairs#64, + op=\E[32m\E[40m, + setb=\E[%?%p1%{0}%=%t40m%e%p1%{1}%=%t41m%e%p1%{2}%=%t42m%e + %p1%{3}%=%t43m%e%p1%{4}%=%t44m%e%p1%{5}%=%t45m%e%p1%{6} + %=%t46m%e%p1%{7}%=%t107m%;, + setf=\E[%?%p1%{0}%=%t30m%e%p1%{1}%=%t31m%e%p1%{2}%=%t32m%e + %p1%{3}%=%t33m%e%p1%{4}%=%t34m%e%p1%{5}%=%t35m%e%p1%{6} + %=%t36m%e%p1%{7}%=%t97m%;, +ibm+16color|IBM aixterm color definitions, + colors#16, pairs#0x100, + setab=\E[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm, + setaf=\E[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm, + setb=%p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa%?%ga%{1}%=%t4%e + %ga%{3}%=%t6%e%ga%{4}%=%t1%e%ga%{6}%=%t3%e%ga%d%;m, + setf=%p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa%?%ga%{1}%=%t4%e + %ga%{3}%=%t6%e%ga%{4}%=%t1%e%ga%{6}%=%t3%e%ga%d%;m, +ibm5154|IBM 5154 Color display, + ncv@, + bold@, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=ibm5151, + use=ibm+color, +ibmega-c|ibm5154-c|IBM Enhanced Color Display with standout and underline, + rmso=\EB, rmul=\EB, smso=\EF\Ef3;, smul=\EF\Ef2;, + use=ibmmono, +ibmvga-c|IBM VGA display color termcap, + ht=^I, kcub1=^H, kcud1=\n, use=ibmega-c, +ibmvga|IBM VGA display, + use=ibmega, +# ibmapa* and ibmmono entries come from ACIS 4.3 distribution +rtpc|ibmapa16|IBM 6155 Extended Monochrome Graphics Display, + lines#32, + dsl=\Ej\EY@ \EI\Ek, tsl=\Ej\EY@%+ \Eo, use=ibmmono, +ibm6155|IBM 6155 Black & White display, + blink@, bold@, use=ibm5151, +# Advanced Monochrome (6153) and Color (6154) Graphics Display: +ibmapa8c|ibmapa8|IBM 6154 Advanced Graphics Display, + lines#31, + dsl=\Ej\EY? \EI\Ek, tsl=\Ej\EY?%+ \Eo, use=ibmmono, +ibmapa8c-c|ibm6154-c|IBM 6154 Advanced Color Graphics Display, + lines#31, + dim=\EF\Ef7;, dsl=\Ej\EY? \EI\Ek, tsl=\Ej\EY?%+ \Eo, + use=ibmega-c, +ibm6154|IBM 6154 Color displays, + blink@, bold=\E[12m, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p7%t;8%;%?%p6%t;1 + 2%;m, + sgr0=\E[0;10m, use=ibm5154, +ibm6153|IBM 6153 Black & White display, + blink@, bold=\E[12m, s0ds=\E[10m, s1ds=\E[11m, s2ds=\E[12m, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p7%t;8%;%?%p6%t;1 + 2%;m, + sgr0=\E[0;10m, use=ibm5151, +ibm6153-90|IBM 6153 Black & White display (36-line), + cols#90, lines#36, + blink@, bold@, use=ibm5151, +ibm6153-40|IBM 6153 Black & White display (12-line), + cols#40, lines#12, use=ibm6153-90, +ibm8512|ibm8513|IBM color VGA Terminal, + mir, + cub1=\E[D, is2=\Eb\E[m\017\E[?7h, kf0=\E[010q, rc=\E[u, + rmacs=^O, rmam=\E[?7l, rmcup=\E[20h, rmdc=\E[4l, + rs1=\Eb\E[m\017\E[?7h\E[H\E[J, sc=\E[s, sgr0=\E[m, + smacs=^N, smam=\E[?7h, smcup=\E[20;4l\E[?7h\Eb, + smdc=\E[4h, use=ibm8503, +hft-c|HFT with Color, + acsc=jjkkllmmnnqqttuuvvwwxx, s0ds=\E(B, s1ds=\E(0, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[0m\E(B, + use=ibm5151, use=ibm+color, +hft-c-old|HFT with Color PC850, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, use=ibm5151, + use=ibm+color, +hft-old|AIWS High Function Terminal, + am, xon, + cols#80, lines#25, + bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, + dl1=\E[M, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, ind=\n, + invis=\E[8m, kf1=\E[001q, kf2=\E[002q, kf3=\E[003q, + kf4=\E[004q, kf5=\E[005q, kf6=\E[006q, kf7=\E[007q, + kf8=\E[008q, kf9=\E[009q, knp=\E[153q, kpp=\E[159q, + ktbc=\E[010q, rev=\E[7m, rmir=\E6, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smir=\E6, smso=\E[7m, smul=\E[4m, + use=ansi+arrows, use=ansi+erase, use=ibm+color, + +ibm-system1|system1|IBM system/1 computer, + am, xt, + cols#80, lines#24, + bel=^G, clear=^Z, cub1=^H, cuf1=^\, + cup=\005%p1%{32}%+%c%p2%{32}%+%c, cuu1=^^, home=^K, + ind=\n, +# lft-pc850 : IBM Low Function Terminal Device +# lft "supports" underline, bold, and blink in the sense that the lft code +# sets all the right bits. HOWEVER, depending upon the adapter, these +# attributes may or may not be supported by the device driver. +lft|lft-pc850|LFT-PC850|IBM LFT PC850 Device, + am, bw, msgr, xon, + cols#80, it#8, lines#25, + acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x + \263, + bel=^G, cbt=\E[Z, clear=\E[H\E[J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, ed=\E[2J, el=\E[0K, home=\E[H, + hpa=\E[%i%p1%dG, ich=\E[%p1%d@, ind=\ED, is2=\Ec, + kcbt=\E[Z, kclr=\E[144q, kdch1=\E[P, ked=\E[148q, + kel=\E[142q, kend=\E[146q, kf1=\E[001q, kf10=\E[010q, + kf11=\E[011q, kf12=\E[012q, kf13=\E[013q, kf14=\E[014q, + kf15=\E[015q, kf16=\E[016q, kf17=\E[017q, kf18=\E[018q, + kf19=\E[019q, kf2=\E[002q, kf20=\E[020q, kf21=\E[021q, + kf22=\E[022q, kf23=\E[023q, kf24=\E[024q, kf25=\E[025q, + kf26=\E[026q, kf27=\E[027q, kf28=\E[028q, kf29=\E[029q, + kf3=\E[003q, kf30=\E[030q, kf31=\E[031q, kf32=\E[032q, + kf33=\E[033q, kf34=\E[034q, kf35=\E[035q, kf36=\E[036q, + kf4=\E[004q, kf5=\E[005q, kf6=\E[006q, kf7=\E[007q, + kf8=\E[008q, kf9=\E[009q, kich1=\E[139q, kil1=\E[140q, + kind=\E[151q, knp=\E[154q, kpp=\E[150q, kri=\E[155q, + krmir=\E[4l, ri=\EL, rmacs=\E(B, rmir=\E[4l, rmso=\E[0m, + rmul=\E[0m, rs2=\Ec, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 + %;%?%p7%t;8%;m%?%p9%t\E(0%e\E(B%;, + smacs=\E(0, smir=\E[4h, tbc=\E[3g, use=ansi+arrows, + use=ansi+idl, use=ansi+local, use=ansi+sgrbold, + use=ecma+index, + +# "Megapel" refers to the display adapter, which was used with the IBM RT +# aka IBM 6150. +ibm5081|hft|IBM Megapel Color display, + acsc=jjkkllmmnnqqttuuvvwwxx, blink@, bold@, s0ds=\E(B, + s1ds=\E(0, sgr0=\E[0m\E(B, use=ibm5154, +ibm5081-c|ibmmpel-c|IBM 5081 1024x1024 256/4096 Megapel enhanced color display, + lines#33, + dsl=\Ej\EYA \EI\Ek, tsl=\Ej\EYA%+ \Eo, use=ibmega-c, +ibm8503|ibm8507|ibm8604|IBM 8503 B & W VGA display, + use=hft-c, +ibm8514|IBM 8514/a color VGA display, + eslok, hs, + dsl=\Ej\EYI \EI\Ek, fsl=\Ek, tsl=\Ej\EYI%+ \Eo, use=hft, +ibm8514-c|IBM 8514 color display with standout and underline, + lines#41, + dsl=\Ej\EYI \EI\Ek, ht=^I, kcub1=^H, kcud1=\n, + tsl=\Ej\EYI%+ \Eo, use=ibmega-c, + +# +# AIX entries. IBM ships these with AIX 3.2.5. +# -- added rc, sc based on manpage -TD +# -- added rmacs, smacs based on manpage -TD +# Note that we could use ibm+16color, but that is not how IBM defines this one. +aixterm|IBM Aixterm Terminal Emulator, + acsc=jjkkllmmnnqqttuuvvwwxx, bold=\E[1m, rc=\E8, ri@, + rmacs=\E(B, s0ds=\E(B, s1ds=\E(0, sc=\E7, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7 + %t;8%;m%?%p9%t\E(0%e\E(B%;, + sgr0=\E[0;10m\E(B, smacs=\E(0, use=ibm6154, + use=aixterm+sl, +aixterm+sl|status line for AIXterm, + eslok, hs, + dsl=\E[?E, fsl=\E[?F, tsl=\E[?%p1%dT, + +aixterm-m|IBM AIXterm Monochrome Terminal Emulator, + acsc=jjkkllmmnnqqttuuvvwwxx, bold=\E[1m, ri@, s0ds=\E(B, + s1ds=\E(0, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7 + %t;8%;m%?%p9%t\E(0%e\E(B%;, + sgr0=\E[0;10m\E(B, use=ibm6153, use=aixterm+sl, +aixterm-m-old|old IBM AIXterm Monochrome Terminal Emulator, + bold=\E[1m, ri@, + sgr=\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7 + %t;8%;m, + use=ibm6153, use=aixterm+sl, +jaixterm|IBM Kanji Aixterm Terminal Eemulator, + acsc@, rmacs@, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8 + %;m, + sgr0=\E[m, smacs@, use=aixterm, +jaixterm-m|IBM Kanji AIXterm Monochrome Terminal Emulator, + acsc@, rmacs@, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p6%t;1%;%?%p7%t;8 + %;m, + sgr0=\E[m, smacs@, use=aixterm-m, + +# This flavor is adapted from xterm, in turn from aixterm documentation -TD +aixterm-16color|IBM Aixterm Terminal Emulator with 16 colors, + use=ibm+16color, use=aixterm, + +#### Infoton/General Terminal Corp. +# + +# gt100 sounds like something DEC would come out with. Let's hope they don't. +i100|gt100|gt100a|General Terminal 100A (formerly Infoton 100), + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\Ef%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, dl1=\EM, + ed=\EJ, el=\EK, flash=\Eb$<200/>\Ea, home=\EH, il1=\EL, + ind=\n, rmso=\Ea, smso=\Eb, + +i400|Infoton 400, + OTbs, am, + cols#80, lines#25, + bel=^G, clear=\E[2J, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%3d;%p2%3dH, cuu1=\E[A, + dch1=\E[4h\E[2Q\E[P\E[4l\E[0Q, dl1=\E[M, el=\E[N, + il1=\E[L, ind=\n, rmir=\E[4l\E[0Q, smir=\E[4h\E[2Q, + +# (addrinfo: removed obsolete ":bc=^Z:" -- esr) +addrinfo|cursor-addressable Infoton, + cup=\037%p1%c%p2%c, home=^H, use=infoton, + +# "VISTAR II/HZ Technical Users Manual" (May 1975). +# +infoton2|cursor-addressable Infoton VISTAR II, + cup=~\021%p2%c%p1%c, home=^H, use=infoton, + +# "VISTAR Technical User's Manual" (October 1972). +# +# (infoton: used to have the no-ops , , -- esr) +infoton|Infoton VISTAR, + am, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^Z, cud1=\n, cuf1=^Y, cuu1=^\, + ed=^K, ind=\n, ll=^H^\, + +# The ICL6402 was actually the Kokusai Display System 6402. +# The 6404 was the KDS7372 (color version of the 6402). +# +# ICL6404 control codes follow: +# +#code function +#~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#ctrl-A set SOM position at cursor position +#ctrl-G Bell +#ctrl-H Backspace +#ctrl-I Horizontal tab +#ctrl-J Linefeed +#ctrl-K Cursor up +#ctrl-L Cursor right +#ctrl-M Carriage return +#ctrl-N Disable xon/xoff to host +#ctrl-O Enable xon/xoff to host +#ctrl-R Enable bidirectional mode +#ctrl-T Disable bidirectional mode +#ctrl-V Cursor down +#ctrl-Z Clear unprotected data to insert char +#ctrl-^ Cursor home +#ctrl-_ Newline +# +#ESC lead-in char for multiple character command +# +#ESC space R execute power on sequence +#ESC ! p1 p2 define scroll region: +# p1 = scroll top line: 20h - 37h +# p1 = scroll bottom line: 20h - 37h +#ESC " unlock keyboard +#ESC # lock keyboard +#ESC $ Semi-graphics mode on +#ESC % Semi-graphics mode off +#ESC & protect mode on +#ESC ' protect mode off +#ESC ( write protect mode off (full intensity) +#ESC ) write protect mode on (half intensity) +# +#ESC * clear screen +#ESC + clear unprotected data to insert char +#ESC , clear unprotected data to half intensity spaces +#ESC - p1 p2 p3 p4 address cursor to page, row, column: +# p1 = page number 0 - 3 +# p2 = row 20h - 7fh +# p3 = column (lo) 20h - 7fh +# p4 = column (hi) 20h - 21h (only 132 col) +#ESC . p1 set cursor style: +# p1 = 0 invisible cursor +# p1 = 1 block blinking cursor +# p1 = 2 block steady cursor +# p1 = 3 underline blinking cursor +# p1 = 4 underline steady cursor +#ESC / transmit cursor location (page, row, column) +#ESC 0 p1 p2 p3 p4 program edit key: +# p1 = edit key code: '@'-'S', '`'-'s' +# p2 p3 p4 = program data (3 bytes) +# +#ESC 1 set tab +#ESC 2 clear tab at cursor +#ESC 3 clear all tabs +#ESC 4 send unprotect line to cursor +#ESC 5 send unprotect page to cursor +#ESC 6 send line to cursor +#ESC 7 send page to cursor +#ESC 8 n set scroll mode: +# n = 0 set jump scroll +# n = 1 set smooth scroll +#ESC 9 n control display: +# n = 0 display off +# n = 1 display on +#ESC : clear unprotected data to null +#ESC ; clear unprotected data to insert char +# +#ESC < keyclick on +#ESC = p1 p2 address cursor to row, column +# p1 = row 20h - 7fh +# p2 = column (lo) 20h - 7fh +# p3 = column (hi) 20h - 21h (only 132 col) +#ESC > keyclick off +#ESC ? transmit cursor location (row, column) +# +#ESC @ copy print mode on +#ESC A copy print mode off +#ESC B block mode on +#ESC C block mode off (conversation mode) +#ESC D F set full duplex +#ESC D H set half duplex +#ESC E line insert +#ESC F p1 p2 set page colour (p1 = f/grnd, p2 = b/grnd) +# 0 = black, 1 = red, 2 = green, 3 = yellow +# 4 = blue, 5 = magenta, 6 = cyan, 7 = white +#ESC G n set serial field attribute (n = 30h - 3Fh) +#ESC H n full graphics mode: +# n = 0 exit full graphics mode +# n = 1 enter full graphics mode +#ESC I back tab +#ESC J back page +#ESC K forward page +# +#ESC L unformatted page print +#ESC M L move window left (132 col mode only) +#ESC M R move window right (132 col mode only) +#ESC N set page edit (clear line edit) +#ESC O set line edit (clear page edit) +#ESC P formatted page print +#ESC Q character insert +#ESC R line delete +#ESC S send message unprotected only +#ESC T erase line to insert char +#ESC U set monitor mode (see ESC X, ESC u) +# +#ESC V n select video attribute mode: +# n = 0 serial field attribute mode +# n = 1 parallel character attribute mode +#ESC V 2 n define line attribute: +# n = 0 single width single height +# n = 1 single width double height +# n = 2 double width single height +# n = 3 double width double height +#ESC V 3 n select character font: +# n = 0 system font +# n = 1 user defined font +#ESC V 4 n select screen mode: +# n = 0 page screen mode +# n = 1 virtual screen mode +#ESC V 5 n control mouse mode: +# n = 0 disable mouse +# n = 1 enable sample mode +# n = 2 send mouse information +# n = 3 enable request mode +#ESC W character delete +#ESC X clear monitor mode (see ESC U, ESC u) +#ESC Y erase page to insert char +# +#ESC Z n send user/status line: +# n = 0 send user line +# n = 1 send status line +# n = 2 send terminal ID +#ESC [ p1 p2 p3 set character attribute (parallel char mode): +# p1: 0 = normal +# 1 = blank +# 2 = blink +# 3 = blink blank (= blank) +# 4 = reverse +# 5 = reverse blank +# 6 = reverse blink +# 7 = reverse blink blank (= reverse blank) +# 8 = underline +# 9 = underline blank +# : = underline blink +# ; = underline blink blank +# < = reverse underline +# = = reverse underline blank +# > = reverse underline blink +# ? = reverse underline blink blank +# p2, p3: f/grnd, b/grnd colour +# (see ESC F for colours) +# use ZZ for mono, eg. +# ESC [ 0 Z Z for normal +# ESC [ 4 Z Z for inverse etc. +# +#ESC \ n set page size: +# n = 1 24 lines/page +# n = 2 48 lines/page +# n = 3 72 lines/page +# n = 4 96 lines/page +#ESC ] n set Wordstar mode: +# n = 0 normal (KDS7372) mode +# n = 1 Wordstar mode +# +#ESC b set foreground colour screen +# +#ESC c n enter self-test mode: +# n = 0 exit self test mode +# n = 1 ROM test +# n = 2 RAM test +# n = 3 NVRAM test +# n = 4 screen display test +# n = 5 main/printer port test +# n = 6 mouse port test +# n = 7 graphics board test +# n = 8 graphics memory test +# n = 9 display all 'E' +# n = : display all 'H' +#ESC d set background colour screen +# +#ESC e n program insert char (n = insert char) +#ESC f text CR load user status line with 'text' +# +#ESC g display user status line on 25th line +#ESC h display system status line on 25th line +#ESC i tab +#ESC j reverse linefeed +#ESC k n duplex/local edit mode: +# n = 0 duplex edit mode +# n = 1 local edit mode +#ESC l n select virtual screen: +# n = 0 screen 1 +# n = 1 screen 2 +#ESC m save current config to NVRAM +#ESC n p1 select display screen: +# p1 = 0 screen 1 +# p1 = 1 screen 2 +# p1 = 2 screen 3 +# p1 = 3 screen 4 +#ESC o p1 p2 set characters/line and attribute: +# p1 = 0 80 chars/line +# +#ESC o p1 p2 set characters/line and attribute: +# p1 = 0 80 chars/line +# p1 = 1 132 chars/line +# p2 = 0 single width single height +# p2 = 1 single width double height +# p2 = 2 double width single height +# p2 = 3 double width double height +# +#ESC q insert mode on +#ESC r edit mode on +#ESC s send message all +#ESC t erase line to null +#ESC u clear monitor mode (see ESC U, ESC X) +#ESC v autopage mode on +#ESC w autopage mode off +#ESC x p1 p2 p3 define delimiter code... +#ESC y erase page to null +# +#ESC z 2 p1 p2 p3 p4 draw quadrangle: +# p1 = starting row +# p2 = starting column +# p3 = end row +# p4 = end column +# +#ESC { p1 p2 p3 p4 configure main port +# (baud, stop bits, parity, word length) +# +#ESC | p1 p2 text Ctrl-Y program function key with 'text': +# p1 = function key code: +# '1' - ';' normal f1- f11 +# '<' - 'F' shifted f1 - f11 +# p2 = program mode: +# 1 = FDX +# 2 = LOC +# 3 = HDX +# Ctrl-Y = terminator +# (use Ctrl-P to escape ^P, ^Y ) +# +#ESC } p1 p2 p3 p4 configure printer port +# (baud, stop bits, parity, word length) +#ESC ~ send system status +# +# Codes and info from Peter Disdale 12 May 1997 +# +# Entry is by esr going solely on above information and is UNTESTED. +# This actually looks a lot like a TeleVideo 9xx. +# This entry uses page 0 and is monochrome; I'm not brave enough to try +# to make color work without a test terminal. The capability is a guess. +# The initialization string sets conversation mode, blinking underline cursor, +# full duplex, parallel attribute mode, display user status line, white +# foreground, black background, normal highlight. +# +icl6404|kds7372|icl6402|kds6402|ICL 6404 aka Kokusai Display Systems 7372, + OTbs, am, hs, + cols#80, lines#24, + bel=^G, blink=\E[2ZZ, cbt=\EI, civis=\E.0, clear=\E*, + cnorm=\E.3, cr=\r, csr=\E!%p1%{32}%+%c%p2%{32}%+%c, + cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{80}%m%{32}%+%c%p2%{80}%>%{32}%+%c, + cuu1=^K, cvvis=\E.1, dch1=\EW, dl1=\ER, home=^^, ht=^I, + hts=\E1, il1=\EE, invis=\E[1ZZ, + is1=\EC\E.3\EDF\EV1\Eg\E[0ZZ, nel=^_, rev=\E[4ZZ, + rmir=\Er, rmso=\E[%gh%{4}%^%Ph%gh%dZZ, + rmul=\E[%gh%{8}%^%Ph%gh%dZZ, rs2=\Eo1, + sgr=\E[%'0'%?%p1%t%'8'%|%;%?%p2%t%'8'%|%;%?%p3%t%'4'%|%;%? + %p4%t%'2'%|%;%?%p7%t%'1'%|%;%cZZ, + sgr0=\E[0ZZ, smir=\Eq, smso=\E[8ZZ, smul=\E[8ZZ, tbc=\E3, +icl6404-w|kds7372-w|ICL 6404 aka Kokusai Display Systems 7372 132 cols, + rs2=\Eo1, use=icl6404, + +#### Interactive Systems Corp +# +# ISC used to sell OEMed and customized hardware to support ISC UNIX. +# ISC UNIX still exists in 1995, but ISC itself is no more; they got +# bought out by Sun. +# + +# From: Wed Sep 16 08:06:44 1981 +# (intext: removed obsolete ":ma=^K^P^R^L^L ::bc=^_:", also the +# ":le=^_:" later overridden -- esr) +intext|Interactive Systems Corporation modified owl 1200, + OTbs, am, + cols#80, it#8, lines#24, xmc#1, + bel=^G, cbt=^Y, clear=\014$<132>, cr=\r, cub1=^H, cud1=\n, + cuf1=^^, cup=\017%p1%{32}%+%c%p2%{32}%+%c, cuu1=^\, + dch1=\022$<5.5*>, dl1=\021$<5.5*>, ed=\026J$<5.5*>, + el=^Kp^R, ht=^I, il1=\020$<5.5*>, ind=\n, ip=$<5.5*>, kbs=^H, + kcub1=^_, kcud1=\n, kcuf1=^^, kcuu1=^\, kf0=^VJ\r, kf1=^VA\r, + kf2=^VB\r, kf3=^VC\r, kf4=^VD\r, kf5=^VE\r, kf6=^VF\r, + kf7=^VG\r, kf8=^VH\r, kf9=^VI\r, khome=^Z, rmir=^V<, + rmkx=^V9, rmso=^V#\s, smir=^V;, smkx=\036:\264\026%%, + smso=^V$\,, +intext2|intextii|INTERACTIVE modified owl 1251, + am, bw, ul, + cols#80, lines#24, xmc#0, + bel=^G, cbt=\E[Z, clear=\E[H\E[2J, cr=\r, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, ed=\E[J, + el=\E[K, + flash=\E[;;;;;;;;;2;;u$<200/>\E[;;;;;;;;;1;;u, + hpa=\E[%p1%{1}%+%dG, ht=^I, ich1=\E[@, il1=\E[L, ind=\E[S, + kbs=^H, kcub1=\ED\r, kcud1=\EB\r, kcuf1=\EC\r, kcuu1=\EA\r, + kf0=\E@\r, kf1=\EP\r, kf2=\EQ\r, kf3=\ES\r, kf4=\ET\r, + kf5=\EU\r, kf6=\EV\r, kf7=\EW\r, kf8=\EX\r, kf9=\EY\r, + khome=\ER\r, lf0=REFRSH, lf1=DEL CH, lf2=TABSET, lf3=GOTO, + lf4=+PAGE, lf5=+SRCH, lf6=-PAGE, lf7=-SRCH, lf8=LEFT, + lf9=RIGHT, ri=\E[T, rmso=\E[2 D, rmul=\E[2 D, smso=\E[6 D, + smul=\E[18 D, use=ansi+local1, + +#### Kimtron (abm, kt) +# +# Kimtron seems to be history, but as March 1998 these people are still +# offering repair services for Kimtron equipment: +# +# Com/Pair Monitor Service +# 1105 N. Cliff Ave. +# Sioux Falls, South Dakota 57103 +# +# WATS voice: 1-800/398-4946 +# POTS fax: +1 605/338-8709 +# POTS voice: +1 605/338-9650 +# Email: +# Internet/Web: +# +# Kimtron entries include (undocumented) codes for: enter dim mode, +# enter bold mode, enter reverse mode, turn off all attributes. +# + +# Kimtron ABM 85 added by Dual Systems +# (abm85: removed duplicated ":kd=^J:" -- esr) +abm85|Kimtron ABM 85, + OTbs, am, bw, msgr, + cols#80, it#8, lines#24, xmc#1, + cbt=\EI, clear=\E*, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\Ey, el=\Et, ht=^I, + if=/usr/share/tabset/stdcrt, il1=\EE, + is2=\EC\EX\Eg\En\E%\Er\E(\Ek\Em\Eq, kbs=^H, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, rmir=\Er, rmso=\Ek, + rmul=\Em, smir=\EQ, smso=\Ej, smul=\El, +# Kimtron ABM 85H added by Dual Systems. +# Some notes about the abm85h entries: +# 1) there are several firmware revs of 85H in the world. Use abm85h-old for +# firmware revs prior to SP51 +# 2) Make sure to use abm85h entry if the terminal is in 85h mode and the +# abm85e entry if it is in tvi920 emulation mode. They are incompatible +# in some places and NOT software settable i.e., can't fix it) +# 3) In 85h mode, the arrow keys and special functions transmit when +# the terminal is in dup-edit, and work only locally in local-edit. +# Vi won't swallow `del char' for instance, but turns on +# dup-edit anyway so that the arrow keys will work right. If the +# arrow keys don't work the way you like, change , , and +# . Note that 920E mode does not have software commands to toggle +# between dup and local edit, so you get whatever was set last on the +# terminal. +# 4) attribute is nice, but seems too slow to work correctly +# (\Eb\Ed) +# 5) Make sure `hidden' attributes are selected. If `embedded' attributes +# are selected, the entry should be removed. +# 6) auto new-line should be on (selectable from setup mode only) +# +# From: Erik Fair Sun Oct 27 07:21:05 1985 +abm85h|Kimtron ABM 85H native mode, + hs, + xmc@, + bel=^G, cnorm=\E.4, cvvis=\E.2, dim=\E), dsl=\Ee, flash@, + fsl=\r, invis@, + is2=\EC\EN\EX\024\016\EA\Ea\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r + \EG0\Ed\E.4\El, + kcud1=^V, sgr0=\E(\EG0, smir=\EZ, tsl=\Eg\Ef, use=adm+sgr, + use=abm85, +abm85e|Kimtron ABM 85H in 920E mode, + xmc@, + bel=^G, dim=\E), flash@, + is2=\EC\EX\EA\E%\E9\Ee\Er\En\E"\E}\E'\E(\Ef\r\Ek\Eq + \Em, + rev=\Ej, sgr0=\E(\Ek, smir=\EZ, use=abm85, +abm85h-old|oabm85h|o85h|Kimtron ABM 85H with old firmware rev., + xmc@, + bel=^G, dim=\E), + is2=\E}\EC\EX\Ee\En\E%\Er\E(\Ek\Em\Eq\Ed\ET\EC\E9 + \EF, + rev=\Ej, sgr0=\E(\Ek, smir=\EZ, use=abm85, +# From: +# (kt7: removed obsolete :ma=^V^J^L :" -- esr) +kt7|kimtron model kt-7, + OTbs, am, + cols#80, it#8, lines#24, + cbt=\EI, clear=^Z, cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, fsl=\Eg, home=^^, ht=^I, ich1=\EQ, + if=/usr/share/tabset/stdcrt, il1=\EE, invis@, is2=\El\E", + kbs=^H, kcbt=\EI, kclr=^Z, kcub1=^H, kcud1=^V, kcuf1=^L, + kcuu1=^K, kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET, kf0=^AI\r, + kf1=^A@\r, kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, + kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, + kich1=\EQ, kil1=\EE, tsl=\Ef, use=adm+sgr, +# Renamed TB=^I to :ta:, BE=^G to :bl:, BS=^H to :kb:, N to :kS: (based on the +# other kt7 entry and the adjacent key capabilities). Removed EE which is +# identical to :mh:. Removed :ES=\EGD: which is some kind of highlight +# but we can't figure out what. +kt7ix|kimtron model kt-7 or 70 in IX mode, + am, bw, + cols#80, it#8, lines#25, + acsc=jYk?lZm@nEqDt4uCvAwBx3, bel=^G, blink=\EG2, cbt=\EI, + civis=\E.0, clear=\E*, cnorm=\E.3, cr=\r, cub1=^H, cud1=^V, + cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW, dim=\EG@, dl1=\ER, dsl=\Ef\r, ed=\EY, el=\ET, fsl=\r, + home=^^, ht=^I, ich1=\EQ, il1=\EE, ind=\n, + is2=\EG0\E s\017\E~, kcbt=\EI, kclr=\E*, kdl1=\ER, ked=\EY, + kel=\ET, kend=\EY, kf0=^AI\r, kf1=^A@\r, kf2=^AA\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, kil1=\EE, knp=\EJ, + nel=\r\n, pulse=\EK, rmacs=\E%%, rmir=, rmso=\EG0, rmul=\EG0, + sgr0=\EG0, smacs=\E$, smir=, smso=\EG4, smul=\EG8, tsl=\Ef, + use=ansi+arrows, + +#### Microdata/MDIS +# +# This was a line of terminals made by McDonnell-Douglas Information Systems. +# These entries come direct from MDIS documentation. I have edited them only +# to move primary names of the form p[0-9] * to aliases, and to comment out +# / in a couple of entries without strings. I have +# also removed the change history; the last version indicates this is +# version 4.3 by A.Barkus, September 1990 (earliest entry is October 1989). +# + +# McDonnell Information Systems Terminal Family History +# ========================================= +# +# Prism-1, Prism-2 and P99: +# Ancient Microdata and CMC terminals, vaguely like ADDS Regent 25. +# +# Prism-4 and Prism-5: +# Slightly less ancient range of Microdata terminals. Follow-on from +# Prism-2, but with many enhancements. P5 has eight display pages. +# +# Prism-6: +# A special terminal for use with library systems, primarily in Germany. +# Limited numbers. Similar functionality to P5 (except attributes?). +# +# Prism-7, Prism-8 and Prism-9: +# More recent range of MDIS terminals, in which P7 and P8 +# replace the P4 & P5, with added functionality, and P9 is the flagship. +# The P9 has two emulation modes - P8 and ANSI - and includes a +# large number of the DEC VT220 control sequences. Both +# P8 and P9 support 80c/24ln/8pg and 132cl/24li/4pg formats. +# +# Prism-12 and Prism-14: +# Latest range, functionally very similar to the P9. The P14 has a +# black-on-white overscanning screen. +# +# The terminfo definitions given here are: +# +# p2 - Prism-2 (or Prism-1 or P99). +# +# p4 - Prism-4 (and older P7s & P8s). +# p5 - Prism-5 (or Prism-6). +# +# p7 - Prism-7. +# p8 - Prism-8 (in national or multinational mode). +# p8-w - 132 column version of p8. +# p9 - Prism-9 in ANSI mode. +# p9-w - 132 column version of p9. +# p9-8 - Prism-9 in Prism-8 emulation mode. +# p9-8-w - As p9-8, but with 132 columns. +# +# p12 - Prism-12 in ANSI mode. +# p12-w - 132 column version of p12. +# p12-m - Prism-12 in MDC emulation mode. +# p12-m-w - As p12-m, but with 132 columns. +# p14 - Prism-14 in ANSI mode. +# p14-w - 132 column version of p14. +# p14-m - Prism-14 in MDC emulation mode. +# p14-m-w - As p14-m, but with 132 columns. +# +# p2: Prism-2 +# ----------- +# +# Includes Prism-1 and basic P99 without SP or MP loaded. +# The simplest form of Prism-type terminal. +# Basic cursor movement and clearing operations only. +# No video attributes. +# Notes: +# Horizontal cursor qualifiers of NUL, XON and XOFF are mapped to the next +# value up, followed by backspace. +# +prism2|MDC Prism-2, + am, bw, msgr, + cols#80, lines#24, + bel=^G, clear=\014$<20>, cr=\r, cub1=^H, cud1=\n, cuf1=^F, + cup=\013%p1%{32}%+%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%? + %{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c, + cuu1=^Z, ed=\EJ, el=\EK, home=^A, + hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc + %=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c, + ind=\n, kbs=^H, khome=^A, vpa=\013%p1%{32}%+%c, + +# p4: Prism-4 +# ----------- +# +# Includes early versions of P7 & P8. +# Basic family definition for most Prisms (except P2 and P9 ANSI). +# Notes: +# Horizontal cursor qualifiers of NUL, XON and XOFF are mapped to the next +# value up, followed by backspace. +# Cursor key definitions removed because they interfere with vi and csh keys. +# +prism4|p4|P4|MDC Prism-4, + am, bw, hs, mc5i, msgr, + cols#80, lines#24, wsl#72, xmc#1, + bel=^G, blink=^CB, civis=\035\344, clear=\014$<20>, + cnorm=\035\342, cr=\r, cub1=^H, cud1=\n, cuf1=^F, + cup=\013%p1%{32}%+%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%Pc%? + %{17}%gc%=%{19}%gc%=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c, + cuu1=^Z, dim=^CA, dsl=\035\343\035\345, ed=\EJ, el=\EK, + fsl=\035\345, home=^A, + hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%Pc%?%{17}%gc%=%{19}%gc + %=%|%gc%!%|%t%{1}%gc%+%c%{8}%e%gc%;%c, + ind=\n, invis=^CH, kbs=^H, khome=^A, mc0=\EU, mc4=\ET, mc5=\ER, + rev=^CD, rmso=^C\s, rmul=^C\s, + sgr=\003%{64}%?%p1%p3%|%t%{4}%+%;%?%p2%t%{16}%+%;%?%p4%t%{2} + %+%;%?%p5%t%{1}%+%;%?%p7%t%{8}%+%;%c%?%p9%t\016%e\017%;, + sgr0=^C\s, smso=^CD, smul=^CP, tsl=\035\343, + vpa=\013%p1%{32}%+%c, + +# p5: Prism-5 +# ----------- +# +# Same definition as p4. Includes Prism-6 (not tested!). +# Does not use any multi-page features. +# +prism5|p5|P5|MDC Prism-5, + use=p4, + +# p7: Prism-7 +# ----------- +# +# Similar definition to p4. Uses ANSI cursor motion to avoid network problems. +# Notes: +# Use p4 for very early models of P7. +# Rev-index removed; can't send nulls to terminal in 8-bit modes. +# +prism7|p7|P7|MDC Prism-7, + cup=\E[%i%p1%d;%p2%dH, hpa@, vpa@, use=p4, + +# p8: Prism-8 +# ----------- +# +# Similar definition to p7. Uses ANSI cursor motion to avoid network problems. +# Supports national and multinational character sets. +# Notes: +# Alternate char set operations only work in multinational mode. +# Use p4 for very early models of P8. +# Rev-index removed; can't send nulls to terminal in 8-bit modes. +# (esr: commented out / because there's no ) +# +prism8|p8|P8|MDC Prism-8, + cup=\E[%i%p1%d;%p2%dH, hpa=\E[%i%p1%d`, is2=\E[<12h, + vpa=\E[%i%p1%dd, use=p4, + +# p8-w: Prism-8 in 132 column mode +# -------------------------------- +# +# 'Wide' version of p8. +# Notes: +# Rev-index removed; can't send nulls to terminal in 8-bit modes. +# +prism8-w|p8-w|P8-W|MDC Prism-8 in 132 column mode, + cols#132, + is2=\E[<12h\E[<14h, use=p8, + +# p9: Prism-9 in ANSI mode +# ------------------------- +# +# The "flagship" model of this generation of terminals. +# ANSI X3.64 (ISO 6429) standard sequences, plus many DEC VT220 ones. +# Notes: +# Tabs only reset by "reset". Otherwise assumes default (8 cols). +# Fixes to deal with terminal firmware bugs: +# . 'ri' uses insert-line since rev index doesn't always +# . 'sgr0' has extra '0' since esc[m fails +# . 'fsl' & 'dsl' use illegal char since cr is actioned wrong on line 25 +# Not covered in the current definition: +# . Labels +# . Programming Fn keys +# . Graphic characters (defaults correctly to vt100) +# . Padding values (sets xon) +# (esr: commented out / because there's no ) +# +prism9|p9|P9|MDC Prism-9 in ANSI mode, + am, bw, hs, msgr, xenl, xon, + cols#80, lines#24, vt#3, wsl#72, + bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[<4l, clear=^L, + cnorm=\E[<4h, cr=\r, csr=\E[%i%p1%d;%p2%d%%v, cub1=^H, + cud1=\n, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dsl=\E[%}\024, ech=\E[%p1%dX, ed=\E[J$<10>, el=\E[K, + fsl=^T, home=\E[H, hpa=\E[%i%p1%d`, ind=\n, + is2=\E[&p\E[<12l\E F, kclr=^L, kf1=\E[11~, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, + kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, nel=\r\n, prot=\E[32%{, + rc=\E[%z, rep=\E[%p2%db%p1%c, rev=\E[7m, ri=\E[L, + rmir=\E[4l, rmso=\E[27m, rmul=\E[24m, + rs2=\E[&p\E[<12l\E\sF\E[3g\E[9;17;25;33;41;49;57;65;73 + \sN, + sc=\E[%y, + sgr=\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;m%? + %p8%t\E[32%%{%;%?%p9%t\016%e\017%;, + sgr0=\E[0m\017, smir=\E[4h, smso=\E[7m, smul=\E[4m, + tsl=\E[%i%p1%d%%}, vpa=\E[%i%p1%dd, use=ansi+arrows, + use=ansi+idl, use=ansi+inittabs, use=ansi+local, + use=ansi+pp, + +# p9-w: Prism-9 in 132 column mode +# -------------------------------- +# +# 'Wide' version of p9. +# +prism9-w|p9-w|P9-W|MDC Prism-9 in 132 column mode, + cols#132, + is2=\E[&p\E[<12l\E F\E[<14h, + rs2=\E[&p\E[<12l\E F\E[<14h, use=p9, + +# p9-8: Prism-9 in P8 mode +# ------------------------ +# +# P9 terminal in P8 emulation mode. +# Similar to p8 definition. +# Insertion and deletion operations possible. +# +prism9-8|p9-8|P9-8|MDC Prism-9 in P8 mode, + dch=\E[%p1%dP, dch1=\E[P, ich=\E[%p1%d@, ich1=\E[@, + use=ansi+idl, use=p8, + +# p9-8-w: Prism-9 in P8 and 132 column modes +# ------------------------------------------ +# +# P9 terminal in P8 emulation mode and 132 column mode. +# +prism9-8-w|p9-8-w|P9-8-W|MDC Prism-9 in Prism 8 emulation and 132 column mode, + dch=\E[%p1%dP, dch1=\E[P, ich=\E[%p1%d@, ich1=\E[@, + use=ansi+idl, use=p8-w, + +# p12: Prism-12 in ANSI mode +# --------------------------- +# +# See p9 definition. +# +prism12|p12|P12|MDC Prism-12 in ANSI mode, + use=p9, + +# p12-w: Prism-12 in 132 column mode +# ---------------------------------- +# +# 'Wide' version of p12. +# +prism12-w|p12-w|P12-W|MDC Prism-12 in 132 column mode, + use=p9-w, + +# p12-m: Prism-12 in MDC emulation mode +# ------------------------------------- +# +# P12 terminal in MDC emulation mode. +# Similar to p8 definition. +# Insertion and deletion operations possible. +# +prism12-m|p12-m|P12-M|MDC Prism-12 in MDC emulation mode, + use=p9-8, + +# p12-m-w: Prism-12 in MDC emulation and 132 column modes +# ------------------------------------------------------- +# +# P12 terminal in MDC emulation mode and 132 column mode. +# +prism12-m-w|p12-m-w|P12-M-W|MDC Prism-12 in MDC emulation and 132 column mode, + use=p9-8-w, + +# p14: Prism-14 in ANSI mode +# --------------------------- +# +# See p9 definition. +# +prism14|p14|P14|MDC Prism-14 in ANSI mode, + use=p9, + +# p14-w: Prism-14 in 132 column mode +# ---------------------------------- +# +# 'Wide' version of p14. +# +prism14-w|p14-w|P14-W|MDC Prism-14 in 132 column mode, + use=p9-w, + +# p14-m: Prism-14 in MDC emulation mode +# ------------------------------------- +# +# P14 terminal in MDC emulation mode. +# Similar to p8 definition. +# Insertion and deletion operations possible. +# +prism14-m|p14-m|P14-M|MDC Prism-14 in MDC emulation mode, + use=p9-8, + +# p14-m-w: Prism-14 in MDC emulation and 132 column modes +# ------------------------------------------------------- +# +# P14 terminal in MDC emulation mode and 132 column mode. +# +prism14-m-w|p14-m-w|P14-M-W|MDC Prism-14 in MDC emulation and 132 column mode, + use=p9-8-w, + +# End of McDonnell Information Systems Prism definitions + +# These things were popular in the Pick database community at one time +# From: George Land 24 Sep 1996 +p8gl|prism8gl|McDonnell-Douglas Prism-8 alternate definition, + am, bw, hs, mir, + cols#80, lines#24, ma#1, wsl#78, xmc#1, + bel=^G, blink=^CB, clear=^L, cr=\r, cub1=^U, cud1=\n, cuf1=^F, + cup=\E[%i%p1%d;%p2%dH, cuu1=^Z, dch1=\s^H, dim=^CA, dl1=^P, + ed=\EJ, el=\EK, home=^A, ind=\n, invis=^CH, kbs=^H, kcub1=^U, + kcud1=\n, kcuf1=^F, kcuu1=^Z, kdch1=\s^H, kdl1=^P, ked=\EJ, + kel=\EK, kf1=^A@\r, kf10=^AI\r, kf12=^AJ\r, kf13=^AK\r, + kf14=^AL\r, kf15=^AM\r, kf16=^AN\r, kf17=^AO\r, kf2=^AA\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=^A, lf1=F1, lf10=F10, lf2=F2, + lf3=F3, lf4=F4, lf5=F5, lf6=F6, lf7=F7, lf8=F8, lf9=F9, nel=\n\r, + pad=\0, rev=^CD, rmso=^C\s, rmul=^C\s, sgr0=^C\s, smso=^CE, + smul=^C0, + +#### Microterm (act, mime) +# +# The mime1 entries refer to the Microterm Mime I or Mime II. +# The default mime is assumed to be in enhanced act iv mode. +# + +# New "safe" cursor movement (5/87) from . Prevents +# freakout with out-of-range args on Sytek multiplexors. No and +# since it gets confused and it's too dim anyway. No +# since Sytek insists ^S means xoff. +# (act4: found ":ic=2^S:ei=:im=:ip=.1*^V:" commented out in 8.3 -- esr) +act4|microterm|microterm act iv, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\014$<12/>, cr=\r, cub1=^H, cud1=^K, cuf1=^X, + cup=\024%p1%{24}%+%c%p2%p2%?%{47}%>%t%{48}%+%;%{80}%+%c, + cuu1=^Z, dch1=\004$<.1*/>, dl1=\027$<2.3*/>, + ed=\037$<2.2*/>, el=\036$<.1*/>, home=^], + il1=\001<2.3*/>, ind=\n, kcub1=^H, kcud1=^K, kcuf1=^X, + kcuu1=^Z, +# The padding on :sr: and :ta: for act5 and mime is a guess and not final. +# The act 5 has hardware tabs, but they are in columns 8, 16, 24, 32, 41 (!)... +# (microterm5: removed obsolete ":ma==^Z^P^Xl^Kj:" -- esr) +act5|microterm5|microterm act v, + ri=\EH$<3>, uc=^H\EA, use=act4, +# Mimes using brightness for standout. Half bright is really dim unless +# you turn up the brightness so far that lines show up on the screen. +mime-fb|full bright mime1, + is2=^S\E, rmso=^S, smso=^Y, use=mime, +mime-hb|half bright mime1, + is2=^Y\E, rmso=^Y, smso=^S, use=mime, +# (mime: removed obsolete ":ma=^X ^K^J^Z^P:"; removed ":do=^K:" that overrode +# the more plausible ":do=^J:" -- esr) +# uc was at one time disabled to get around a curses bug, be wary of it +mime|mime1|mime2|mimei|mimeii|microterm mime1, + OTbs, am, + cols#80, it#8, lines#24, vt#9, + bel=^G, clear=^]^C, cr=\r, cub1=^H, cud1=\n, cuf1=^X, + cup=\024%p1%{24}%+%c%p2%p2%?%{32}%>%t%{48}%+%;%{80}%+%c, + cuu1=^Z, dl1=\027$<80>, ed=^_, el=^^, home=^], ht=\011$<2>, + il1=\001$<80>, ind=\n, is2=^S\E^Q, kcub1=^H, kcud1=^K, + kcuf1=^X, kcuu1=^Z, ri=\022$<3>, uc=^U, +# These termcaps (for mime2a) put the terminal in low intensity mode +# since high intensity mode is so obnoxious. +mime2a-s|microterm mime2a (emulating an enhanced Soroc iq120), + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\EL, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EI, dch1=\ED, + dl1=\027$<20*>, ed=\EJ$<20*>, el=\EK, home=^^, + il1=\001$<20*>, ind=\n, ip=$<2>, is2=\E), kcub1=^H, kcud1=\n, + kcuf1=^L, kcuu1=^K, ri=\EI, rmir=^Z, rmso=\E;, rmul=\E7, + smir=\EE, smso=\E:, smul=\E6, +# This is the preferred mode (but ^X can't be used as a kill character) +mime2a|mime2a-v|microterm mime2a (emulating an enhanced VT52), + OTbs, + cols#80, it#8, lines#24, + bel=^G, clear=\EL, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=^N, + dl1=\027$<20*>, ed=\EQ$<20*>, el=\EP, home=\EH, ht=^I, + il1=\001$<20*>, ind=\n, ip=$<2>, is2=^Y, ri=\EA, rmir=^Z, + rmso=\E9, rmul=\E5, smir=^O, smso=\E8, smul=\E4, + use=vt52+arrows, +# (mime3a: removed obsolete ":ma=^X ^K^J^Z^P:" -- esr) +mime3a|mime1 emulating 3a, + am@, + kcud1=^K, kcuf1=^X, kcuu1=^Z, use=adm3a, +mime3ax|mime-3ax|mime1 emulating enhanced 3a, + it#8, + dl1=\027$<80>, ed=^_, el=^X, ht=\011$<3>, il1=\001$<80>, + use=mime3a, +# Wed Mar 9 18:53:21 1983 +# We run our terminals at 2400 baud, so there might be some timing problems at +# higher speeds. The major improvements in this model are the terminal now +# scrolls down and insert mode works without redrawing the rest of the line +# to the right of the cursor. This is done with a bit of a kludge using the +# exit graphics mode to get out of insert, but it does not appear to hurt +# anything when using vi at least. If you have some users using act4s with +# programs that use curses and graphics mode this could be a problem. +mime314|mm314|mime 314, + am, + cols#80, lines#24, + clear=^L, cub1=^H, cuf1=^X, cup=\024%p1%c%p2%c, cuu1=^Z, + dch1=^D, dl1=^W, ed=^_, el=^^, home=^], ht=^I, il1=^A, kcub1=^H, + kcud1=^K, kcuf1=^X, kcuu1=^Z, rmir=^V, smir=^S, +# Microterm mime 340 from University of Wisconsin +mm340|mime340|mime 340, + cols#80, lines#24, + clear=\032$<12/>, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\E#$<2.1*/>, dl1=\EV$<49.6/>, ed=\037$<2*/>, + el=\EL$<2.1/>, ht=^I, il1=\EU$<46/>, ind=\n, is2=\E\,, + kbs=^H, kcub1=^H, kcud1=\n, kcuu1=^K, nel=\r\n, +# This came from University of Wisconsin marked "astro termcap for jooss". +# (mt4520-rv: removed obsolete ":kn#4:" and incorrect ":ri=\E[C:"; +# also added / based on the init string -- esr) +mt4520-rv|micro-term 4520 reverse video, + am, hs, msgr, xenl, xon, + cols#80, it#8, lines#24, wsl#80, + bel=^G, cnorm=\E[0V\E8, cr=\r, cup=\E[%i%p1%d;%p2%dH, + cvvis=\E7\E[0U, dch=\E[%p1%dP, dch1=\E[P, + flash=\E[?5l$<200/>\E[?5h, fsl=\E[?5l\E[?5h, home=\E[H, + ht=^I, hts=\EH, ich=\E[%p1%d@, ich1=\E[@, ind=\ED, + is2=\E(B\E[2l\E>\E[20l\E[?3l\E[?5h\E[?7h\E[1;24r\E[24;1H\E[H + \E[J, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, ll=\E[24;1H, nel=\EE, + rf=/usr/share/tabset/vt100, ri=\EM, rmam=\E[?7l, + rmso=\E[0m, rmul=\E[24m, + rs1=\E(B\E[2l\E>\E[20l\E[?3l\E[?5h\E[?7h\E[H\E[J, + sgr0=\E[m, smam=\E[?7h, smso=\E[7m, smul=\E[4m, tbc=\E[g, + tsl=\E[25;1H, use=ansi+arrows, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+local, + +# Fri Aug 5 08:11:57 1983 +# This entry works for the ergo 4000 with the following setups: +# ansi,wraparound,newline disabled, xon/xoff disabled in both +# setup a & c. +# +# WARNING!!! There are multiple versions of ERGO 4000 microcode +# Be advised that very early versions DO NOT WORK RIGHT !! +# Microterm does have a ROM exchange program- use it or lose big +# (ergo400: added / based on the init string -- esr) +ergo4000|microterm ergo 4000, + da, db, msgr, + cols#80, lines#66, + bel=^G, clear=\E[H\E[2J$<80>, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[1P$<80>, dl1=\E[1M$<5*>, + ed=\E[0J$<15>, el=\E[0K$<13>, ht=^I, il1=\E[1L$<5*>, + ind=\ED$<20*>, + is2=\E<\E=\E[?1l\E[?4l\E[?5l\E[?7h\E[?8h$<300>, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, lf1=pf1, lf2=pf2, lf3=pf3, + lf4=pf4, ri=\EM$<20*>, rmam=\E[?7l, rmir=\E[4l, + rmkx=\E=$<4>, rmso=\E[m$<20>, sgr0=\E[m$<20>, + smam=\E[?7m, smir=\E[4h$<6>, smkx=\E=$<4>, + smso=\E[7m$<20>, use=ansi+local1, + +#### NCR +# +# NCR's terminal group was merged with AT&T's when AT&T bought the company. +# For what happened to that group, see the ADDS section. +# +# There is an NCR4103 terminal that's just a re-badged Wyse-50. +# + +# The following vendor-supplied termcaps were captured from the Boundless +# Technologies site, 8 March 1998. I removed all-upper-case names that were +# identical, except for case, to lower-case ones. I also uncommented the acsc +# capabilities.X +# +# The Intecolor emulation of the NCR 2900/260C color terminal is basically a +# DEC VT200/300 with color capabilities added. +ncr260intan|NCR Intecolor emulation of the 2900/260C with an ANSI keyboard, + colors#8, pairs#64, + op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + use=decid+cpr, use=ncr260vt300an, +# The Intecolor emulation of the NCR 2900/260C color terminal is basically a +# DEC VT200/300 with color capabilities added. +ncr260intwan|NCR Intecolor emulation of the 2900/260C with an ANSI keyboard (132 column), + colors#8, pairs#64, + op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + use=decid+cpr, use=ncr260vt300wan, +# The Intecolor emulation of the NCR 2900/260C color terminal is basically a +# DEC VT200/300 with color capabilities added. +ncr260intpp|NCR Intecolor emulation of the 2900/260C with a PC+ keyboard, + colors#8, pairs#64, + op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + use=ncr260vt300pp, +# The Intecolor emulation of the NCR 2900/260C color terminal is basically a +# DEC VT200/300 with color capabilities added. +ncr260intwpp|NCR Intecolor emulation of the 2900/260C with a PC+ keyboard (132 column), + colors#8, pairs#64, + op=\E[0m, setab=\E[4%p1%dm, setaf=\E[3%p1%dm, + use=ncr260vt300wpp, +# This definition for ViewPoint supports several attributes. This means +# that it has magic cookies (extra spaces where the attributes begin). +# Some applications do not function well with magic cookies. The System +# Administrator's Shell in NCR Unix SVR4 1.03 is one such application. +# If supporting various attributes is not vital, 'xmc#1' and the extra +# attributes can be removed. +# Mapping to ASCII character set ('acsc' capability) can also be +# restored if needed. +ncr260vppp|NCR 2900/260 viewpoint, + am, bw, km, mc5i, mir, msgr, xon, + cols#80, lines#24, nlab#32, xmc#1, + acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2, + cbt=\EI, civis=\E`0, clear=\014$<40>, cnorm=\E`5, + cr=\r$<2>, cub1=\010$<2>, cud1=\n$<2>, cuf1=\006$<2>, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<5>, cuu1=\032$<2>, + dch1=\EW$<2>, dim=\EGp, dl1=\El$<2>, ed=\Ek$<2>, + el=\EK$<2>, home=\036$<2>, ht=^I, hts=\E1, il1=\EM$<2>, + ind=\n$<2>, invis=\EG1, + is2=\Ee6\E~%$<100>\E+\E`:\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0 + \EcC1\Ee7$<100>, + kDC=\El, kEND=\Ek, kHOM=^A, kPRT=\E7, kRIT=^F, ka1=^A, ka3=\EJ, + kbs=^H, kc1=\ET, kc3=\EJ, kcub1=^U, kcud1=\n, kcuf1=^F, + kcuu1=^Z, kdch1=\EW, kend=\EK, kf1=^B1\r, kf10=^B:\r, + kf11=^B;\r, kf12=^B<\r, kf13=^B=\r, kf14=^B>\r, kf15=^B?\r, + kf16=^B@\r, kf17=^B!\r, kf18=^B"\r, kf19=^B#\r, kf2=^B2\r, + kf20=^B$\r, kf21=^B%^M, kf22=^B&\r, kf23=^B'\r, kf24=^B(\r, + kf25=^B)\r, kf26=^B*\r, kf27=^B+\r, kf28=\002\,\r, + kf29=^B-\r, kf3=^B3\r, kf30=^B.\r, kf31=^B/\r, kf32=^B0\r, + kf4=^B4\r, kf5=^B5\r, kf6=^B6\r, kf7=^B7\r, kf8=^B8\r, + kf9=^B9\r, khome=^A, kich1=\Eq, knp=\EJ, kpp=\EJ, kprt=\EP, + ll=\001$<5>, mc0=\EP$<100>, mc4=^T, mc5=^R, + mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<5>, + nel=\037$<2>, rev=\EG4, ri=\Ej$<2>, rmacs=\EcB0\EH\003, + rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, + rs2=\Ee6\E~%$<100>\E+\E`:\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0 + \EcC1\Ee7$<100>, + sgr0=\EG0\EH\003, smacs=\EcB1\EH\002, smir=\Eq, + smso=\EG4, smul=\EG8, smxon=\Ec21, use=ncr260vp+sl, + +ncr260vp+sl|NCR 2900/260 viewpoint with status-line, + hs, + dsl=\E`c, fsl=\r, tsl=\EF, + +ncr260vpwpp|NCR 2900/260 viewpoint wide mode, + cols#132, + cup=\Ea%i%p1%dR%p2%dC$<30>, + is2=\Ee6\E~%$<100>\E+\E`;\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0 + \EcC1\Ee7$<100>, + rs2=\Ee6\E~%$<100>\E+\E`;\Ed/\E`1\EO\Ee4\Ec@0@\Ec@1A\EcB0 + \EcC1\Ee7$<100>, + use=ncr260vppp, + +ncr260vt100an|NCR 2900/260 VT100 with ANSI keyboard, + am, mir, msgr, xenl, xon, + cols#80, lines#24, nlab#32, + acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G, + clear=\E[2J\E[1;1H$<20>, cr=\r$<1>, cub=\E[%p1%dD$<5>, + cub1=\E[D$<5>, cud=\E[%p1%dB$<5>, cud1=\E[B$<5>, + cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>, + cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>, + cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>, + dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX, + ed=\E[0J$<5>, el=\E[0K$<3>, el1=\E[1K$<3>, home=\E[H$<1>, + hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>, + il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>, + indn=\E[%p1%dE$<5>, + is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + khlp=\E[28~, kich1=\E[2~, krdo=\E[29~, nel=\EE$<5>, + ri=\EM$<5>, rmacs=^O, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[0m, rmul=\E[0m, + rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<20>, + sgr0=\E[0m\017$<20>, smacs=^N, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[1;7m, tbc=\E[3g, + vpa=\E[%p1%dd$<40>, use=ansi+csr, use=ansi+sgrbold, + use=decid+cpr, use=vt220+vtedit, use=vt220+cvis, + use=vt220+keypad, use=ncr260vt+sl, + +ncr260vt+sl|NCR 2900/260 VT100 status line, + hs, + dsl=\E[0$~\E[1$~, fsl=\E[0$}, tsl=\E[2$~\E[1$}, +ncr260vt100wan|NCR 2900/260 VT100 wide mode ANSI keyboard, + cols#132, + cup=\E[%i%p1%d;%p2%dH$<30>, + is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + use=ncr260vt100an, +ncr260vt100pp|NCR 2900/260 VT100 with PC+ keyboard, + ka1=\E[H, ka3=\EOu, kb2=\E[V, kc3=\E[U, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[4~, + kend=\E[5~, khome=\E[2~, kich1=\E[1~, kpp=\E[3~, lf1=pf1, + lf2=pf2, lf3=pf3, lf4=pf4, rmkx=\E>, smkx=\E=, + use=ncr260vt100an, +ncr260vt100wpp|NCR 2900/260 VT100 wide mode PC+ keyboard, + cols#132, + cup=\E[%i%p1%d;%p2%dH$<30>, + is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + use=ncr260vt100pp, +ncr260vt200an|NCR 2900/260 VT200 with ANSI keyboard, + am, mir, msgr, xenl, xon, + cols#80, lines#24, nlab#32, + acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G, + clear=\E[2J\E[1;1H$<20>, cr=\r$<1>, + csr=\E[%i%p1%d;%p2%dr$<5>, cub=\E[%p1%dD$<5>, + cub1=\E[D$<5>, cud=\E[%p1%dB$<5>, cud1=\E[B$<5>, + cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>, + cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>, + cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>, + dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX$<5>, + ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>, home=\E[H, + hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>, + il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>, + indn=\E[%p1%dE$<5>, + is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf0=\EOy, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, + kf21=\E[31~, kf22=\E[32~, kf23=\E[33~, kf24=\E[34~, + kf25=\E[35~, kf26=\E[1~, kf27=\E[2~, kf28=\E[3~, + kf29=\E[4~, kf30=\E[5~, kf31=\E[6~, kf32=\E[7~, kf33=\E[8~, + kf34=\E[9~, kf35=\E[10~, kf5=\E[M, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, krdo=\E[29~, mc0=\E[i, + mc4=\E[4i, mc5=\E[5i, nel=\EE, rc=\E8, ri=\EM$<5>, + rmacs=\017$<20>, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[27m, rmul=\E[24m, + rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + sc=\E7, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<20>, + sgr0=\E[0m\017$<20>, smacs=\016$<20>, smam=\E[?7h, + smir=\E[4h, smkx=\E[?1h\E=, tbc=\E[3g, + vpa=\E[%p1%dd$<40>, use=ansi+sgrbold, use=decid+cpr, + use=vt220+vtedit, use=vt220+cvis, use=vt220+keypad, + use=ncr260vt+sl, + +ncr260vt200wan|NCR 2900/260 VT200 wide mode ANSI keyboard, + cols#132, + cup=\E[%i%p1%d;%p2%dH$<30>, + is2=\E[!p\E[?3;7;19;67h\E[?4l\E(B\E)0\017\E[2J\E[1;1H$<200>, + rs2=\E[!p\E[?3;7;19;67h\E[?4l\E(B\E)0\017\E[2J\E[1;1H$<200>, use=ncr260vt200an, +ncr260vt200pp|NCR 2900/260 VT200 with PC+ keyboard, + ka1=\E[H, ka3=\EOu, kb2=\E[V, kc3=\E[U, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[4~, + kend=\E[1~, khome=\E[H, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, + rmkx=\E>, smkx=\E=, use=ncr260vt200an, +ncr260vt200wpp|NCR 2900/260 VT200 wide mode PC+ keyboard, + cols#132, + cup=\E[%i%p1%d;%p2%dH$<30>, + is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E(B\E)0\017\E[2J\E[1;1H\E>$< + 200>, + use=ncr260vt200pp, +ncr260vt300an|NCR 2900/260 VT300 with ANSI keyboard, + am, mir, msgr, xenl, xon, + cols#80, lines#24, nlab#32, + acsc=``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G, + clear=\E[2J\E[1;1H$<20>, cr=\r$<1>, + csr=\E[%i%p1%d;%p2%dr$<5>, cub=\E[%p1%dD$<5>, + cub1=\E[D$<5>, cud=\E[%p1%dB$<5>, cud1=\E[B$<5>, + cuf=\E[%p1%dC$<5>, cuf1=\E[C$<5>, + cup=\E[%i%p1%d;%p2%dH$<10>, cuu=\E[%p1%dA$<5>, + cuu1=\E[A$<5>, dch=\E[%p1%dP$<5>, dch1=\E[1P$<5>, + dl=\E[%p1%dM$<5>, dl1=\E[M$<5>, ech=\E[%p1%dX$<5>, + ed=\E[0J, el=\E[0K$<5>, el1=\E[1K$<5>, home=\E[H, + hpa=\E[%p1%dG$<40>, ht=^I, hts=\EH, ich=\E[%p1%d@$<5>, + il=\E[%p1%dL$<5>, il1=\E[L$<5>, ind=\ED$<5>, + indn=\E[%p1%dE$<5>, + is2=\E[!p\E[?7;19;67h\E[?1;3;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1 + ;1H\E>$<200>, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf0=\EOy, kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, + kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, + kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, kf20=\E[34~, + kf21=\E[31~, kf22=\E[32~, kf23=\E[33~, kf24=\E[34~, + kf25=\E[35~, kf26=\E[1~, kf27=\E[2~, kf28=\E[3~, + kf29=\E[4~, kf30=\E[5~, kf31=\E[6~, kf32=\E[7~, kf33=\E[8~, + kf34=\E[9~, kf35=\E[10~, kf5=\E[M, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, khlp=\E[28~, krdo=\E[29~, mc0=\E[i, + mc4=\E[4i, mc5=\E[5i, nel=\EE, rc=\E8, ri=\EM$<5>, + rmacs=\017$<20>, rmam=\E[?7l, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[27m, rmul=\E[24m, + rs2=\E[!p\E[?7;19;67h\E[?1;3;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1 + ;1H\E>$<200>, + sc=\E7, + sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5 + %;%?%p7%t;8%;m%?%p9%t\016%e\017%;$<20>, + sgr0=\E[0m\017$<20>, smacs=\016$<20>, smam=\E[?7h, + smir=\E[4h, smkx=\E[?1h\E=, tbc=\E[3g, + vpa=\E[%p1%dd$<40>, use=ansi+sgrbold, use=decid+cpr, + use=vt220+vtedit, use=vt220+cvis, use=vt220+keypad, + use=ncr260vt+sl, + +ncr260vt300wan|NCR 2900/260 VT300 wide mode ANSI keyboard, + cols#132, + cup=\E[%i%p1%d;%p2%dH$<30>, + is2=\E[!p\E[?3;7;19;67h\E[?4l\E[1;0%w\E(B\E)0\017\E[2J\E[1;1 + H$<200>, + rs2=\E[!p\E[?3;7;19;67h\E[?4l\E[1;0%w\E(B\E)0\017\E[2J\E[1;1 + H$<200>, + use=ncr260vt300an, +ncr260vt300pp|NCR 2900/260 VT300 with PC+ keyboard, + ka1=\E[H, ka3=\EOu, kb2=\E[V, kc3=\E[U, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[4~, + kend=\E[1~, khome=\E[H, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, + rmkx=\E>, smkx=\E=, use=ncr260vt300an, +ncr260vt300wpp|NCR260VT300WPP|NCR 2900/260 VT300 wide mode PC+ keyboard, + cols#132, + cup=\E[%i%p1%d;%p2%dH$<30>, + is2=\E[!p\E[?3;7;19;67h\E[?1;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1 + ;1H\E>$<200>, + rs2=\E[!p\E[?3;7;19;67h\E[?1;4l\E[1;0%w\E(B\E)0\017\E[2J\E[1 + ;1H\E>$<200>, + use=ncr260vt300pp, +# This terminfo file contains color capabilities for the Wyse325 emulation of +# the NCR 2900/260C color terminal. Because of the structure of the command +# (escape sequence) used to set color attributes, one of the fore/background +# colors must be preset to a given value. I have set the background color to +# black. The user can change this setup by altering the last section of the +# 'setf' definition. The escape sequence to set color attributes is +# ESC d y 1 +# In addition, the background color can be changed through the desk accessories. +# The capability 'op' sets colors to green on black (default combination). +# +# NOTE: The NCR Unix System Administrator's Shell will not function properly +# if the 'pairs' capability is defined. Un-Comment the 'pairs' +# capability and recompile if you wish to have it included. +# +ncr260wy325pp|NCR 2900/260 Wyse 325, + am, bw, km, mc5i, mir, msgr, xon, + colors#16, cols#80, lines#24, ncv#33, nlab#32, + acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2, + cbt=\EI, civis=\E`0, clear=\E*$<10>, cnorm=\E`1, cr=\r, + cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<10>, cuu1=\013$<5>, + cvvis=\E`5, dch1=\EW$<50>, dl1=\ER$<5>, ed=\Ey$<5>, + el=\Et$<5>, home=\036$<5>, ht=^I, hts=\E1, il1=\EE$<5>, + ind=\n$<5>, invis=\EG1, + is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<100>, + kDC=\ER, kEND=\EY, kHOM=\E{, kNXT=\EK, kPRT=\E7, kPRV=\EJ, + kRIT=^L, ka1=^^, kb2=\EJ, kbs=^H, kc1=\ET, kc3=\EK, kcbt=\EI, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, kdch1=\EW, kend=\ET, + kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, + kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, + kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, + kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, + kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r, kf30=^Am\r, kf31=^An\r, + kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, + kprt=\EP, mc0=\EP, mc4=^T, mc5=^R, + mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<10>, + nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH\003\EcB0, + rmam=\Ed., rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, + rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<100>, + setb=\s, + setf=%?%p1%{0}%=%t%{49}%e%p1%{1}%=%t%{50}%e%p1%{2}%=%t%{51} + %e%p1%{3}%=%t%{52}%e%p1%{4}%=%t%{53}%e%p1%{5}%=%t%{54} + %e%p1%{6}%=%t%{55}%e%p1%{7}%=%t%{64}%e%p1%{8}%=%t%{57} + %e%p1%{9}%=%t%{58}%e%p1%{10}%=%t%{59}%e%p1%{11}%=%t + %{60}%e%p1%{12}%=%t%{61}%e%p1%{13}%=%t%{62}%e%p1%{14}%= + %t%{63}%e%p1%{15}%=%t%{56}%;\Edy%c11$<100>, + sgr0=\EG0\EcB0\EcD$<15>, smacs=\EH\002\EcB1, smam=\Ed/, + smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0, + use=ncr260vp+sl, +ncr260wy325wpp|NCR 2900/260 Wyse 325 wide mode, + cols#132, + cup=\Ea%i%p1%dR%p2%dC$<30>, + is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<100>, + rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<100>, + use=ncr260wy325pp, +# This definition for Wyse 350 supports several attributes. This means +# that it has magic cookies (extra spaces where the attributes begin). +# Some applications do not function well with magic cookies. The System +# Administrator's Shell in NCR Unix SVR4 1.03 is one such application. +# If supporting various attributes is not vital, 'xmc#1' and the extra +# attributes can be removed. +# Mapping to ASCII character set ('acsc' capability) can also be +# restored if needed. +# In addition, color capabilities have been added to this file. The drawback, +# however, is that the background color has to be black. The foreground colors +# are numbered 0 through 15. +# +# NOTE: The NCR Unix System Administrator's Shell does not function properly +# with the 'pairs' capability defined as below. If you wish to +# have it included, Un-comment it and recompile (using 'tic'). +# +ncr260wy350pp|NCR 2900/260 Wyse 350, + colors#16, ncv#33, pairs#16, + acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, cbt=\EI, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<40>, ed=\Ey$<5>, + el=\Et$<5>, ht=^I, hts=\E1, + is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<100>, + mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<20>, + rmacs=\EH\003\EcB0, + rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<100>, + setb=\s, + setf=%?%p1%{0}%=%t%{49}%e%p1%{1}%=%t%{50}%e%p1%{2}%=%t%{51} + %e%p1%{3}%=%t%{52}%e%p1%{4}%=%t%{53}%e%p1%{5}%=%t%{54} + %e%p1%{6}%=%t%{55}%e%p1%{7}%=%t%{102}%e%p1%{8}%=%t%{97} + %e%p1%{9}%=%t%{98}%e%p1%{10}%=%t%{99}%e%p1%{11}%=%t + %{101}%e%p1%{12}%=%t%{106}%e%p1%{13}%=%t%{110}%e%p1 + %{14}%=%t%{111}%e%p1%{15}%=%t%{56}%;\Em0%c$<100>, + sgr0=\EG0\EH\003\EcD, smacs=\EH\002\EcB1, tbc=\E0, + use=ncr260vp+sl, use=ncr160wy50+pp, +ncr260wy350wpp|NCR 2900/260 Wyse 350 wide mode, + cols#132, + cup=\Ea%i%p1%dR%p2%dC$<30>, + is2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<200>, + rs2=\Ee6\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E"\Ee4\Ex@\E`9 + \Ee7$<200>, + use=ncr260wy350pp, +# This definition for Wyse 50+ supports several attributes. This means +# that it has magic cookies (extra spaces where the attributes begin). +# Some applications do not function well with magic cookies. The System +# Administrator's Shell in NCR Unix SVR4 1.03 is one such application. +# If supporting various attributes is not vital, 'xmc#1' and the extra +# attributes can be removed. +# Mapping to ASCII character set ('acsc' capability) can also be +# restored if needed. +# (ncr260wy50+pp: originally contained commented-out +# , as well as the commented-out one there -- esr) +ncr260wy50+pp|NCR 2900/260 Wyse 50+, + am, bw, km, mc5i, mir, msgr, xon, + cols#80, lines#24, nlab#32, xmc#1, + acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2, + cbt=\EI$<5>, civis=\E`0, clear=\E+$<20>, cnorm=\E`1, cr=\r, + cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<30>, cuu1=\013$<5>, + cvvis=\E`5, dch1=\EW$<50>, dim=\EGp, dl1=\ER$<5>, + ed=\EY$<5>, el=\ET$<5>, home=\036$<10>, ht=\011$<5>, + hts=\E1$<5>, il1=\EE$<5>, ind=\n$<5>, invis=\EG1, + is2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<100>, + kDC=\ER, kEND=\EY, kHOM=\E{, kPRT=\E7, kRIT=^L, ka1=^^, kbs=^H, + kc1=\ET, kc3=\EK, kcbt=\EI, kcub1=^H, kcud1=\n, kcuf1=^L, + kcuu1=^K, kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r, + kf11=^AJ\r, kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, + kf16=^AO\r, kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r, + kf20=^Ac\r, kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r, + kf25=^Ah\r, kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r, + kf3=^AB\r, kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r, + kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, + khome=^^, kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP, + mc0=\EP$<10>, mc4=^T, mc5=^R, + mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<10>, + nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH^C, rmam=\Ed., + rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, + rs2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<100>, + sgr0=\EG0\EH\003$<15>, smacs=\EH^B, smam=\Ed/, smir=\Eq, + smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0$<5>, + use=ncr260vp+sl, +ncr260wy50+wpp|NCR 2900/260 Wyse 50+ wide mode, + cols#132, + cup=\Ea%i%p1%dR%p2%dC$<30>, + is2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<200>, + rs2=\Ee6\E~"$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<200>, + use=ncr260wy50+pp, +ncr260wy60pp|NCR 2900/260 Wyse 60, + am, bw, km, mc5i, mir, msgr, xon, + cols#80, lines#24, nlab#32, + acsc=07a?h;j5k3l2m1n8q:t4u9v=w0x6, bel=^G, blink=\EG2, + cbt=\EI$<15>, civis=\E`0, clear=\E*$<100>, cnorm=\E`1, + cr=\r, cub1=\010$<5>, cud1=\n$<5>, cuf1=\014$<5>, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<10>, cuu1=\013$<5>, + cvvis=\E`5, dch1=\EW$<50>, dl1=\ER$<5>, ed=\Ey$<5>, + el=\Et$<5>, home=\036$<25>, ht=\011$<15>, hts=\E1$<15>, + il1=\EE$<5>, ind=\n$<5>, invis=\EG1, + is2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<100>, + kDC=\ER, kEND=\EY, kHOM=\E{, kNXT=\EK, kPRT=\E7, kPRV=\EJ, + kRIT=^L, ka1=^^, kb2=\EJ, kbs=^H, kc1=\ET, kc3=\EK, + kcbt=\EI$<15>, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, + kdch1=\EW, kend=\ET, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf17=^A`\r, kf18=^Aa\r, kf19=^Ab\r, kf2=^AA\r, kf20=^Ac\r, + kf21=^Ad\r, kf22=^Ae\r, kf23=^Af\r, kf24=^Ag\r, kf25=^Ah\r, + kf26=^Ai\r, kf27=^Aj\r, kf28=^Ak\r, kf29=^Al\r, kf3=^AB\r, + kf30=^Am\r, kf31=^An\r, kf32=^Ao\r, kf4=^AC\r, kf5=^AD\r, + kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, + kich1=\Eq, knp=\EK, kpp=\EJ, kprt=\EP, mc0=\EP, mc4=^T, mc5=^R, + mrcup=\Ew@%p1%{48}%+%c%p2%{32}%+%c%p3%{32}%+%c$<30>, + nel=\037$<5>, rev=\EG4, ri=\Ej$<5>, rmacs=\EH^C, rmam=\Ed., + rmir=\Er, rmso=\EG0, rmul=\EG0, rmxon=\Ec20, + rs2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`:\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<100>, + sgr0=\EG0\EcB0\EcD$<15>, smacs=\EH^B, smam=\Ed/, + smir=\Eq, smso=\EGt, smul=\EG8, smxon=\Ec21, tbc=\E0$<15>, + use=ncr260vp+sl, +ncr260wy60wpp|NCR 2900/260 Wyse 60 wide mode, + cols#132, + cup=\Ea%i%p1%dR%p2%dC$<30>, + is2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<100>, + rs2=\Ee6\E~4$<100>\E+\Ed/\Ee1\Ed*\Er\EO\E`1\E`;\E`@\E~!\E" + \Ee4\Ex@\E`9\Ee7$<100>, + use=ncr260wy60pp, +ncr160vppp|NCR 2900/160 viewpoint, + use=ncr260vppp, +ncr160vpwpp|NCR 2900/160 viewpoint wide mode, + use=ncr260vpwpp, +ncr160vt100an|NCR 2900/160 VT100 with ANSI keyboard, + use=ncr260vt100an, +ncr160vt100pp|NCR 2900/160 VT100 with PC+ keyboard, + use=ncr260vt100pp, +ncr160vt100wan|NCR 2900/160 VT100 wide mode ANSI keyboard, + use=ncr260vt100wan, +ncr160vt100wpp|NCR 2900/160 VT100 wide mode PC+ keyboard, + use=ncr260vt100wpp, +ncr160vt200an|NCR 2900/160 VT200 with ANSI keyboard, + use=ncr260vt200an, +ncr160vt200pp|NCR 2900/160 VT200 with PC+ keyboard, + use=ncr260vt200pp, +ncr160vt200wan|NCR 2900/160 VT200 wide mode ANSI keyboard, + use=ncr260vt200wan, +ncr160vt200wpp|NCR 2900/160 VT200 wide mode PC+ keyboard, + use=ncr260vt200wpp, +ncr160vt300an|NCR 2900/160 VT300 with ANSI keyboard, + use=ncr260vt300an, +ncr160vt300pp|NCR 2900/160 VT300 with PC+ keyboard, + use=ncr260vt300pp, +ncr160vt300wan|NCR 2900/160 VT300 wide mode ANSI keyboard, + use=ncr260vt300wan, +ncr160vt300wpp|NCR 2900/160 VT300 wide mode PC+ keyboard, + use=ncr260vt300wpp, +ncr160wy50+pp|NCR 2900/160 Wyse 50+, + use=ncr260wy50+pp, +ncr160wy50+wpp|NCR 2900/160 Wyse 50+ wide mode, + use=ncr260wy50+wpp, +ncr160wy60pp|NCR 2900/160 Wyse 60, + use=ncr260wy60pp, +ncr160wy60wpp|NCR 2900/160 Wyse 60 wide mode, + use=ncr260wy60wpp, +ncrvt100an|ncrvt100pp|NCR VT100 for the 2900 terminal, + hs, mc5i, mir, xon, + nlab#32, + acsc=``aaffgghhiijjkkllmmnnqqttuuvvwwxxyyzz~~, + blink=\E[5m$<30>, bold=\E[1m$<30>, + clear=\E[2J\E[1;1H$<300>, + csr=\E[%i%p1%d;%p2%dr$<100>, cub=\E[%p1%dD$<30>, + cub1=\E[D$<2>, cud=\E[%p1%dB$<30>, cud1=\E[B$<2>, + cuf=\E[%p1%dC$<30>, cup=\E[%i%p1%d;%p2%dH$<100>, + cuu=\E[%p1%dA$<30>, dch=\E[%p1%dP$<40>, + dch1=\E[1P$<10>, dl=\E[%p1%dM$<70>, dl1=\E[M$<40>, + dsl=\E[31l$<25>, ed=\E[0J$<300>, el=\E[0K$<30>, + el1=\E[1K$<30>, enacs=\E(B\E)0$<40>, fsl=1$<10>, + home=\E[H$<2>$<80>, il=\E[%p1%dL$<80>, + il1=\E[B\E[L$<80>, ind=\ED, + is2=\E[12h\E[?10l\E%/0n\E[P\031\E[?3l\E(B\E)0$<200>, + kLFT=\E[D, kRIT=\E[C, ka1=\E[H, kent=\r, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, mc0=\E[i$<100>, nel=\EE, rc=\E8, + rev=\E[7m$<30>, ri=\EM$<50>, rmacs=\017$<90>, + rmir=\E[4l$<80>, rmso=\E[0m$<30>, rmul=\E[0m$<30>, + rs2=\Ec\E[12;31h\E[?3;4;5;10l\E[?6;7;19;25h\E[33;34l\E[0m\E( + B\E)0\E%/0n\E[P\031$<200>, + sc=\E7, + sgr=%?%p9%t\016%e\017%;\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1 + %p3%|%t;7%;%?%p4%t;5%;m$<120>, + sgr0=\017\E[0m$<120>, smacs=\016$<90>, smir=\E[4h$<80>, + smso=\E[7m$<30>, smul=\E[4m$<30>, tbc=\E[3g$<40>, + tsl=\E[>+1$<70>, use=decid+cpr, use=vt100+4bsd, +ncrvt100wan|NCRVT100WPP|ncrvt100wpp|NCR VT100 emulation of the 2900 terminal, + cols#132, + is2=\E[12h\E[?10l\E%/0n\E[P\031\E[?3h\E(B\E)0$<200>, + rs2=\Ec\E[12;31h\E[?4;5;10l\E?3;6;7;19;25h\E[33;34l\E[0m\E(B + \E)0\E%/0n\E[P\031$<200>, + use=ncrvt100an, +# +# Vendor-supplied NCR termcaps end here + +# NCR7900 DIP switches: +# +# Switch A: +# 1-4 - Baud Rate +# 5 - Parity (Odd/Even) +# 6 - Don't Send or Do Send Spaces +# 7 - Parity Enable +# 8 - Stop Bits (One/Two) +# +# Switch B: +# 1 - Upper/Lower Shift +# 2 - Typewriter Shift +# 3 - Half Duplex / Full Duplex +# 4 - Light/Dark Background +# 5-6 - Carriage Return Without / With Line Feed +# 7 - Extended Mode +# 8 - Suppress Keyboard Display +# +# Switch C: +# 1 - End of line entry disabled/enabled +# 2 - Conversational mode / (Local?) Mode +# 3 - Control characters displayed / not displayed +# 4 - (2-wire?) / 4-wire communications +# 5 - RTS on and off for each character +# 6 - (50Hz?) / 60 Hz +# 7 - Exit after level zero diagnostics +# 8 - RS-232 interface +# +# Switch D: +# 1 - Reverse Channel (yes / no) +# 2 - Manual answer (no / yes) +# 3-4 - Cursor appearance +# 5 - Communication Rate +# 6 - Enable / Disable EXT turnoff +# 7 - Enable / Disable CR turnoff +# 8 - Enable / Disable backspace +# +# Since each attribute parameter is 0 or 1, we shift each attribute (standout, +# reverse, blink, dim, and underline) the appropriate number of bits (by +# multiplying the 0 or 1 by a correct factor to shift) so the bias character, +# '@' is (effectively) "or"ed with each attribute to generate the proper third +# character in the 0 sequence. The string implements the following +# equation: +# +# ((((('@' + P5) | (P4 << 1)) | (P3 << 3)) | (P2 << 4)) | (p1 * 17)) => +# ((((('@' + P5) + (P4 << 1)) + (P3 << 3)) + (P2 << 4)) + (p1 * 17)) +# +# Where: P1 <==> Standout attribute parameter +# P2 <==> Underline attribute parameter +# P3 <==> Reverse attribute parameter +# P4 <==> Blink attribute parameter +# P5 <==> Dim attribute parameter +# From , init string hacked by SCO. +ncr7900i|ncr7900|n7900|NCR 7900 model 1, + am, bw, ul, + cols#80, lines#24, xmc#1, + bel=^G, blink=\E0B, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^F, + cup=\E1%p2%c%p1%c, cuu1=^Z, dim=\E0A, ed=\Ek, el=\EK, ind=\n, + is2=\E0@\010\E3\E4\E7, kcub1=^U, kcud1=\n, kcuf1=^F, + kcuu1=^Z, khome=^A, ll=^A, mc4=^T, mc5=^R, rev=\E0P, rmso=\E0@, + rmul=\E0@, + sgr=\E0%p5%{64}%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17} + %*%+%c, + sgr0=\E0@, smso=\E0Q, smul=\E0`, +ncr7900iv|NCR 7900 model 4, + am, bw, eslok, hs, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, + cup=\013%p1%{64}%+%c\E\005%p2%02d, dl1=\E^O, dsl=\Ey1, + fsl=\Ek\Ey5, home=\013@\E^E00, il1=\E^N, ind=\n, kbs=^H, + kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, + kf8=\ER, khome=\EH, lf6=blue, lf7=red, lf8=white, nel=\r\n, + tsl=\Ej\Ex5\Ex1\EY8%p1%{32}%+%c\Eo, use=vt52+arrows, +# Warning: This terminal will lock out the keyboard when it receives a CTRL-D. +# The user can enter a CTRL-B to get out of this locked state. +# In , we want to output the character given by the formula: +# ((col / 10) * 16) + (col % 10) where "col" is "p1" +ncr7901|NCR 7901 model, + am, bw, ul, + cols#80, lines#24, + bel=^G, blink=\E0B, civis=^W, clear=^L, cnorm=^X, cr=\r, + cub1=^H, cud1=\n, cuf1=^F, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, dim=\E0A, + ed=\Ek, el=\EK, + hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%c, ind=\n, + is2=\E4^O, kclr=^L, kcub1=^U, kcud1=\n, kcuf1=^F, kcuu1=^Z, + khome=^H, ll=^A, mc4=^T, mc5=^R, rev=\E0P, rmso=^O, rmul=^O, + sgr=\E0%p5%{64}%+%p4%{2}%*%+%p3%{16}%*%+%p2%{32}%*%+%p1%{17} + %*%+%c\016, + sgr0=^O, smso=\E0Q\016, smul=\E0`\016, + vpa=\013%p1%{64}%+%c, + +# Newbury Data Recording Limited (Newbury Data) +# +# Have been manufacturing and reselling various peripherals for a long time +# They don't make terminals anymore, but are still in business (in 2007). +# Their e-mail address is at ndsales@newburydata.co.uk +# and their post address is: +# +# Newbury Data Recording Ltd, +# Premier Park, Road One, +# Winsford, Cheshire, CW7 3PT +# +# Their technical support is still good, they sent me for free a printed copy +# of the 9500 user manual and I got it just 1 week after I first contacted them +# (in 2005)! + +# NDR 9500 +# Manufactured in the early/mid eighties, behaves almost the same as a +# TeleVideo 950. Take a 950, change its cabinet for a more 80s-ish one (but +# keep the same keyboard layout), add an optional 25-line mode, replace the DIP +# switches with a menu and remove the "lock line" feature (ESC ! 1 and ESC ! +# 2), here is the NDR 9500. Even the line-lock, albeit disabled, is +# recognized: if you type in "ESC !", the next (third) character is not +# echoed, showing that the terminal was actually waiting for a parameter! +ndr9500|nd9500|Newbury Data 9500, + am, bw, hs, mc5i, mir, msgr, ul, xon, + cols#80, lines#24, wsl#79, + acsc=jDkClBmAnIqKtMuLvOwNxJ, bel=^G, cbt=\EI, civis=\E.0, + clear=\E;, cnorm=\E.1, cr=\r, cub1=^H, cud1=^V, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dim=\E), dl1=\ER, dsl=\Eh, ed=\EY, el=\ET, + flash=\Eb$<50/>\Ed, fsl=\r, home=^^, ht=^I, hts=\E1, + ich1=\EQ, il1=\EE, ind=\n, is2=\Ew\E'\EDF\El\Er\EO, + kDC=\Er, kDL=\EO, kEOL=\Et, kIC=\Eq, kcbt=\EI, kclr=^Z, + kcub1=^H, kcud1=^V, kcuf1=^L, kcuu1=^K, kdch1=\EW, kdl1=\ER, + ked=\EY, kel=\ET, kent=\r, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^A`\r, kf13=^Aa\r, kf14=^Ab\r, kf15=^Ac\r, kf16=^Ad\r, + kf17=^Ae\r, kf18=^Af\r, kf19=^Ag\r, kf2=^AA\r, kf20=^Ah\r, + kf21=^Ai\r, kf22=^Aj\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, + kf6=^AE\r, kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, + kich1=\EQ, kil1=\EE, kprt=\EP, mc4=\Ea, mc5=\E`, nel=^_, + pfloc=\E|%{48}%p1%+%c2%p2%s\031, + pfx=\E|%{48}%p1%+%c1%p2%s\031, prot=\E), ri=\Ej, + rmacs=\E%%, rmir=\Er, rmso=\E(, rmxon=^N, + sgr=\EG0\E%%%%\E(%?%p1%p5%p8%|%|%t\E)%;%?%p9%t\E$%;, + sgr0=\EG0\E%%\E(, smacs=\E$, smir=\Eq, smso=\E), smxon=^O, + tbc=\E3, tsl=\Eg\Ef\011%p1%{32}%+%c, .kbs=^H, + +ndr9500-nl|NDR 9500 with no status line, + hs@, + wsl@, + dsl@, fsl@, tsl@, use=ndr9500, + +ndr9500-25|NDR 9500 with 25th line enabled, + lines#25, use=ndr9500, + +ndr9500-25-nl|NDR 9500 with 25 lines and no status line, + lines#25, use=ndr9500-nl, + +ndr9500-mc|NDR 9500 with magic cookies (enables underline inverse video invisible and blink), + msgr@, + xmc#1, + blink=\EG2, invis=\EG1, rev=\EG4, rmso=\EG0, rmul=\EG0, + sgr=\E%%\E(%?%p5%p8%|%t\E)%;%?%p9%t\E$%;\EG%{48}%?%p7%t%{1} + %+%;%?%p4%t%{2}%+%;%?%p3%p1%|%t%{4}%+%;%?%p2%t%{8}%+%;%c, + smso=\EG4, smul=\EG8, use=ndr9500, + +ndr9500-25-mc|NDR 500 with 25 lines and magic cookies, + lines#25, use=ndr9500-mc, + +ndr9500-mc-nl|NDR 9500 with magic cookies and no status line, + hs@, + wsl@, + dsl@, fsl@, tsl@, use=ndr9500-mc, + +ndr9500-25-mc-nl|NDR 9500 with 25 lines and magic cookies and no status line, + lines#25, use=ndr9500-mc-nl, + +#### Perkin-Elmer (Owl) +# +# These are official terminfo entries from within Perkin-Elmer. +# + +bantam|pe550|pe6100|Perkin Elmer 550, + OTbs, + cols#80, lines#24, + bel=^G, clear=\EK$<20>, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA, + el=\EI$<20>, home=\EH, ind=\n, ll=\EH\EA, +fox|pe1100|Perkin Elmer 1100, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\EH\EJ$<132>, cr=\r, cub1=^H, cud1=\n, + cuf1=\EC, cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA, + ed=\EJ$<5.5*>, el=\EI, flash=\020\002$<200/>\020\003, + home=\EH, hts=\E1, ind=\n, ll=\EH\EA, tbc=\E3, +owl|pe1200|Perkin Elmer 1200, + OTbs, am, in, + cols#80, lines#24, + bel=^G, clear=\EH\EJ$<132>, cr=\r, cub1=^H, cud1=\n, + cuf1=\EC, cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA, + dch1=\EO$<5.5*>, dl1=\EM$<5.5*>, ed=\EJ$<5.5*>, + el=\EI$<5.5>, flash=\020\002$<200/>\020\003, home=\EH, + hts=\E1, ich1=\EN, il1=\EL$<5.5*>, ind=\n, ip=$<5.5*>, + kbs=^H, kf0=\ERJ, kf1=\ERA, kf2=\ERB, kf3=\ERC, kf4=\ERD, + kf5=\ERE, kf6=\ERF, kf7=\ERG, kf8=\ERH, kf9=\ERI, ll=\EH\EA, + rmso=\E!\0, sgr0=\E!\0, smso=\E!^H, tbc=\E3, +pe1251|pe6300|pe6312|Perkin Elmer 1251, + am, + cols#80, it#8, lines#24, pb#300, vt#8, xmc#1, + bel=^G, clear=\EK$<332>, cr=\r, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EX%p1%{32}%+%c\EY%p2%{32}%+%c, cuu1=\EA, + ed=\EJ$<20*>, el=\EI$<10*>, home=\EH, hts=\E1, ind=\n, + kf0=\ERA, kf1=\ERB, kf10=\ERK, kf2=\ERC, kf3=\ERD, kf4=\ERE, + kf5=\ERF, kf6=\ERG, kf7=\ERH, kf8=\ERI, kf9=\ERJ, tbc=\E3, +# (pe7000m: this had +# rmul=\E!\0, smul=\E!\040, +# which is probably wrong, it collides with kf0 +pe7000m|Perkin Elmer 7000 series monochrome monitor, + am, + cols#80, lines#24, + bel=^G, cbt=\E!Y, clear=\EK, cr=\r, cub1=\ED, cud1=\EB, + cuf1=\EC, cup=\ES%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, + ed=\EJ, el=\EI, home=\EH, ind=\n, + is1=\E!\0\EW 7o\Egf\ES7\s, kbs=^H, kcub1=\E!V, + kcud1=\E!U, kcuf1=\E!W, kcuu1=\E!T, kf0=\E!\0, kf1=\E!^A, + kf10=\E!\n, kf2=\E!^B, kf3=\E!^C, kf4=\E!^D, kf5=\E!^E, + kf6=\E!^F, kf7=\E!^G, kf8=\E!^H, kf9=\E!^I, khome=\E!S, + ll=\ES7\s, ri=\ER, +pe7000c|Perkin Elmer 7000 series colour monitor, + is1=\E!\0\EW 7o\Egf\Eb0\Ec7\ES7\s, rmso=\Eb0, + rmul=\E!\0, smso=\Eb2, smul=\E!\s, use=pe7000m, + +#### Sperry Univac +# +# Sperry Univac has merged with Burroughs to form Unisys. +# + +# This entry is for the Sperry UTS30 terminal running the TTY +# utility under control of CP/M Plus 1R1. The functionality +# provided is comparable to the DEC VT100. +# (uts30: I added / based on the init string -- esr) +uts30|Sperry UTS30 with cp/m@1R1, + am, bw, hs, + cols#80, lines#24, wsl#40, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, civis=\ER, clear=^L, + cnorm=\ES, cr=\r, csr=\EU%p1%{32}%+%c%p2%{32}%+%c, + cub1=^H, cud1=\E[B, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, + dch1=\EM, dl=\E[%p1%dM, dl1=\EL, ed=\E[J, el=\E[K, fsl=\r, + home=\E[H, ht=^I, ich=\E[%p1%d@, ich1=\EO, il=\E[%p1%dL, + il1=\EN, ind=\n, indn=\E[%p1%dB, is2=\E[U 7\E[24;1H, + khome=\E[H, rc=\EX, rev=\E[7m, + rf=/usr/share/tabset/vt100, ri=\EI, rin=\E[%p1%dA, + rmacs=\Ed, rmam=\E[?7l, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\EW, + sgr0=\E[m, smacs=\EF, smam=\E[?7m, tsl=\E], uc=\EPB, + use=ansi+apparrows, use=ansi+local, use=ansi+sgrso, + use=ansi+sgrul, + +#### Tandem +# +# Tandem builds these things for use with its line of fault-tolerant +# transaction-processing computers. They aren't generally available +# on the merchant market, and so are fairly uncommon. +# + +tandem6510|adm3a repackaged by Tandem, + use=adm3a, + +# A funny series of terminal that TANDEM uses. The actual model numbers +# have a fourth digit after 653 that designates minor variants. These are +# natively block-mode and rather ugly, but they have a character mode which +# this doubtless(?) exploits. There is a 6520 that is slightly dumber. +# (tandem653: had ":sb=\ES:", probably someone's mistake for sf; also, +# removed , no such file -- esr) +tandem653|t653x|Tandem 653x multipage terminal, + OTbs, am, da, db, hs, + cols#80, lines#24, wsl#64, xmc#1, + clear=\EI, cub1=^H, cud1=\n, cuf1=\EC, + cup=\023%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dsl=\Eo\r, + ed=\EJ, el=\EK, fsl=\r, home=\EH, ind=\ES, ri=\ET, rmso=\E6\s, + rmul=\E6\s, sgr0=\E6\s, smso=\E6$, smul=\E60, tsl=\Eo, + +#### Tandy/Radio Shack +# +# Tandy has a line of VDTs distinct from its microcomputers. +# + +dmterm|deskmate terminal, + am, bw, + cols#80, lines#24, + bel=^G, civis=\EG5, clear=\Ej, cnorm=\EG6, cr=\r, cub1=^H, + cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + cuu1=\EA, dch1=\ES, dl1=\ER, ed=\EJ, el=\EK, home=\EH, ht=^I, + ich1=\EQ, il1=\EP, ind=\EX, invis@, kf0=\E1, kf1=\E2, kf2=\E3, + kf3=\E4, kf4=\E5, kf5=\E6, kf6=\E7, kf7=\E8, kf8=\E9, kf9=\E0, + khome=\EH, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, + lf6=f7, lf7=f8, lf8=f9, lf9=f10, ll=\EE, rmul@, smul@, + use=adm+sgr, use=vt52+arrows, +dt100|dt-100|Tandy DT-100 terminal, + xon, + cols#80, lines#24, xmc#1, + acsc=jjkkllmmnnqqttuuvvwwxx, bel=^G, clear=\E[H\E[2J, + cr=\r, csr=\E[%p1%2d;%p2%2dr, cub1=^H, + cup=\010\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, ed=\E[J, + el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, ind=\n, + is2=\E[?3l\E)0\E(B, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, kf1=\E[?3i, kf10=\E[?5i, kf2=\E[2i, kf3=\E[@, + kf4=\E[M, kf5=\E[17~, kf6=\E[18~, kf7=\E[19~, kf8=\E[20~, + kf9=\E[21~, khome=\E[H, knp=\E[29~, kpp=\E[28~, lf1=f1, + lf2=f2, lf3=f3, lf4=f4, lf5=f5, lf6=f6, lf7=f7, lf8=f8, ri=\EM, + rmacs=^O, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smacs=^N, + smso=\E[7m, smul=\E[4m, use=ansi+local1, use=vt220+cvis, +dt100w|dt-100w|Tandy DT-100 terminal (wide mode), + cols#132, use=dt100, +dt110|Tandy DT-110 emulating ANSI, + xon, + cols#80, lines#24, + acsc=jjkkllmmnnqqttuuvvwwxx, bel=^G, clear=\E[H\E[2J, + cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, + cup=\010\E[%i%p1%d;%p2%dH, dch1=\E[0P, dl1=\E[0M, + ed=\E[0J, el=\E[0K, enacs=\E(B\E)0, home=\E[H, ht=^I, + ich1=\E[0@, il1=\E[0L, ind=\n, is2=\E[?3l\E)0\E(B, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kend=\E[K, + kf1=\E[1~, kf10=\E[10~, kf2=\E[2~, kf3=\E[3~, kf4=\E[4~, + kf5=\E[5~, kf6=\E[6~, kf7=\E[7~, kf8=\E[8~, kf9=\E[9~, + khome=\E[G, kich1=\E[@, knp=\E[26~, kpp=\E[25~, lf0=f1, + lf1=f2, lf2=f3, lf3=f4, lf4=f5, lf5=f6, lf6=f7, lf7=f8, lf8=f9, + lf9=f10, ri=\EM, rmacs=^O, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smacs=^N, smso=\E[7m, smul=\E[4m, use=ansi+local1, + use=vt220+cvis, +pt210|TRS-80 PT-210 printing terminal, + hc, os, + cols#80, + bel=^G, cr=\r, cud1=\n, ind=\n, + +#### Tektronix (tek) +# +# Tektronix tubes are graphics terminals. Most of them use modified +# oscilloscope technology incorporating a long-persistence green phosphor, +# and support vector graphics on a main screen with an attached "dialogue +# area" for interactive text. +# + +tek|tek4012|Tektronix 4012, + OTbs, os, + cols#75, lines#35, + bel=^G, clear=\E\014$<1000>, cr=\r, cub1=^H, cud1=\n, + ff=\014$<1000>, is2=\E^O, +# (tek4013: added to suppress tic warnings re / --esr) +tek4013|Tektronix 4013, + acsc=, rmacs=\E^O, smacs=\E^N, use=tek4012, +tek4014|Tektronix 4014, + cols#81, lines#38, + is2=\E\017\E9, use=tek4012, +# (tek4015: added to suppress tic warnings re / --esr) +tek4015|Tektronix 4015, + acsc=, rmacs=\E^O, smacs=\E^N, use=tek4014, +tek4014-sm|Tektronix 4014 in small font, + cols#121, lines#58, + is2=\E\017\E:, use=tek4014, +# (tek4015-sm: added to suppress tic warnings re / --esr) +tek4015-sm|Tektronix 4015 in small font, + acsc=, rmacs=\E^O, smacs=\E^N, use=tek4014-sm, +# Tektronix 4023 from Andrew Klossner +# +# You need to have "stty nl2" in effect. Some versions of tset(1) know +# how to set it for you. +# +# It's got the Magic Cookie problem around stand-out mode. If you can't +# live with Magic Cookie, remove the :so: and :se: fields and do without +# reverse video. If you like reverse video stand-out mode but don't want +# it to flash, change the letter 'H' to 'P' in the :so: field. +tek4023|Tektronix 4023, + OTbs, am, + OTdN#4, cols#80, lines#24, vt#4, xmc#1, + OTnl=\n, bel=^G, clear=\E\014$<4/>, cr=\r, cub1=^H, cud1=\n, + cuf1=^I, cup=\034%p2%{32}%+%c%p1%{32}%+%c, kbs=^H, + rmso=^_@, smso=^_P, +# It is recommended that you run the 4025 at 4800 baud or less; +# various bugs in the terminal appear at 9600. It wedges at the +# bottom of memory (try "cat /usr/dict/words"); ^S and ^Q typed +# on keyboard don't work. You have to hit BREAK twice to get +# one break at any speed - this is a documented feature. +# Can't use cursor motion because it's memory relative, and +# because it only works in the workspace, not the monitor. +# Same for home. Likewise, standout only works in the workspace. +# +# was commented out since vi and rogue seem to work better +# simulating it with lots of spaces! +# +# and had 145ms of padding, but that slowed down vi's ^U +# and didn't seem necessary. +# +tek4024|tek4025|tek4027|Tektronix 4024/4025/4027, + OTbs, am, da, db, + cols#80, it#8, lines#34, lm#0, + bel=^G, clear=\037era\r\n\n, cmdch=^_, cr=\r, + cub=\037lef %p1%d\r, cub1=^H, cud=\037dow %p1%d\r, + cud1=^F\n, cuf=\037rig %p1%d\r, cuf1=\037rig\r, + cuu=\037up %p1%d\r, cuu1=^K, dch1=\037dch\r, + dl=\037dli %p1%d\r\006, dl1=\037dli\r\006, + ed=\037dli 50\r, ht=^I, ich1=\037ich\r \010, + il=\037up\r\037ili %p1%d\r, il1=\037up\r\037ili\r, + ind=^F\n, + is2=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r, + rmkx=\037lea\sp2\r\037lea\sp4\r\037lea\sp6\r\037lea\sp8\r + \037lea\sf5\r, + smkx=\037lea\sp4\s/h/\r\037lea\sp8\s/k/\r\037lea\sp6\s/\s/ + \r\037lea\sp2\s/j/\r\037lea\sf5\s/H/\r, +tek4025-17|Tektronix 4025 17 line window, + lines#17, use=tek4025, +tek4025-17-ws|Tektronix 4025 17 line window in workspace, + is2=!com\s31\r\n\037sto\s9\s17\s25\s33\s41\s49\s57\s65\s73 + \r\037wor\s17\r\037mon\s17\r, + rmcup=\037mon h\r, rmso=\037att s\r, smcup=\037wor h\r, + smso=\037att e\r, use=tek4025-17, +tek4025-ex|tek4027-ex|Tektronix 4025/4027 w/!, + is2=\037com 33\r\n!sto 9 17 25 33 41 49 57 65 73\r, + rmcup=\037com 33\r, smcup=!com 31\r, use=tek4025, +# Tektronix 4025a +# From: Doug Gwyn +# The following status modes are assumed for normal operation (replace the +# initial "!" by whatever the current command character is): +# !COM 29 # NOTE: changes command character to GS (^]) +# ^]DUP +# ^]ECH R +# ^]EOL +# ^]RSS T +# ^]SNO N +# ^]STO 9 17 25 33 41 49 57 65 73 +# Other modes may be set according to communication requirements. +# If the command character is inadvertently changed, termcap can't restore it. +# Insert-character cannot be made to work on both top and bottom rows. +# Clear-to-end-of-display emulation via !DLI 988 is too grotty to use, alas. +# There also seems to be a problem with vertical motion, perhaps involving +# delete/insert-line, following a typed carriage return. This terminal sucks. +# Delays not specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +# (tek4025a: removed obsolete ":xx:". This may mean the tek4025a entry won't +# work any more. -- esr) +tek4025a|Tektronix 4025A, + OTbs, OTpt, am, bw, da, db, xon, + cols#80, it#8, lines#34, + bel=^G, cbt=\035bac;, clear=\035era;\n\035rup;, cmdch=^], + cr=\r, cub=\035lef %p1%d;, cub1=^H, cud=\035dow %p1%d;, + cud1=\n, cuf=\035rig %p1%d;, cuf1=\035rig;, + cuu=\035up %p1%d;, cuu1=^K, dch=\035dch %p1%d;, + dch1=\035dch;, dl=\035dli %p1%d;, dl1=\035dli;, + el=\035dch 80;, hpa=\r\035rig %p1%d;, ht=^I, + il1=\013\035ili;, ind=\n, indn=\035dow %p1%d;, + rs2=!com\s29\035del\s0\035rss\st\035buf\035buf\sn\035cle + \035dis\035dup\035ech\sr\035eol\035era\sg\035for\sn + \035pad\s203\035pad\s209\035sno\sn\035sto\s9\s17\s25 + \s33\s41\s49\s57\s65\s73\035wor\s0;, + tbc=\035sto;, +# From: cbosg!teklabs!davem Wed Sep 16 21:11:41 1981 +# Here's the command file that I use to get rogue to work on the 4025. +# It should work with any program using the old curses (e.g. it better +# not try to scroll, or cursor addressing won't work. Also, you can't +# see the cursor.) +# (This "learns" the arrow keys for rogue. I have adapted it for termcap - mrh) +tek4025-cr|Tektronix 4025 for curses and rogue, + OTbs, am, + cols#80, it#8, lines#33, + clear=\037era;, cub1=^H, cud1=^F\n, cuf1=\037rig;, + cup=\037jum%i%p1%d\,%p2%d;, cuu1=^K, ht=^I, ind=^F\n, + is2=!com 31\r\n\037sto 9 17 25 33 41 49 57 65 73\r, + rmcup=\037wor 0, smcup=\037wor 33h, +# next two lines commented out since curses only allows 128 chars, sigh. +# :ti=\037lea p1/b/\037lea p2/j/\037lea p3/n/\037lea p4/h/\037lea p5/ /\037lea p6/l/\037lea p7/y/\037lea p8/k/\037lea p9/u/\037lea p./f/\037lea pt/`era w/13\037lea p0/s/\037wor 33h:\ +# :te=\037lea p1\037lea p2\037lea p3\037lea p4\037lea pt\037lea p5\037lea p6\037lea p7\037lea p8\037lea p9/la/13\037lea p.\037lea p0\037wor 0: +tek4025ex|4025ex|4027ex|Tektronix 4025 w/!, + is2=\037com\s33\r\n!sto\s9\,17\,25\,33\,41\,49\,57\,65\,73 + \r, + rmcup=\037com 33\r, smcup=!com 31\r, use=tek4025, +tek4105|Tektronix 4105, + OTbs, am, mir, msgr, ul, xenl, xt, + cols#79, it#8, lines#29, + acsc=, bel=^G, blink=\E[=3;<7m, bold=\E[=7;<4m, cbt=\E[Z, + clear=\E[2J\E[H, cr=\r, cub1=\E[1D, cud1=\E[1B, cuf1=\E[1C, + cup=\E[%i%p1%2d;%p2%2dH, cuu1=\E[1A, dch1=\E[1P, + dim=\E[=1;<6m, dl1=\E[1M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + il1=\E[1L, ind=\E[S, invis=\E[=6;<5, is1=\E%!1\E[m, + is2=\E%!1\E[?6141\E[m, kbs=^H, kcub1=\E[1D, kcud1=\E[1B, + kcuf1=\E[1C, kcuu1=\E[1A, rev=\E[=1;<3m, ri=\E[T, + rmacs=\E[m, rmcup=, rmir=\E[4l, rmso=\E[=0;<1m, + rmul=\E[=0;<1m, sgr0=\E[=0;<1m, smacs=\E[1m, + smcup=\E%!1\E[?6l\E[2J, smir=\E[4h, smso=\E[=2;<3m, + smul=\E[=5;<2m, tbc=\E[1g, + +# (tek4105-30: I added / based on the init string -- esr) +tek4105-30|Tektronix 4015 emulating 30 line VT100, + mir, xenl, xon, + lines#30, vt#3, + cub1=^H, cud1=\n, cuf1=\E[C$<2>, cuu1=\E[A$<2>, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, rmam=\E[?7l, + rmkx=\E[?1l\E>, rmso=\E[m$<2>, smam=\E[?7h, + smkx=\E[?1h\E=, use=ansi+csr, use=ansi+local, + use=vt100+4bsd, use=vt100+fnkeys, + +# Tektronix 4105 from BRL +# The following setup modes are assumed for normal operation: +# CODE ansi CRLF no DABUFFER 141 +# DAENABLE yes DALINES 30 DAMODE replace +# DAVISIBILITY yes ECHO no EDITMARGINS 1 30 +# FLAGGING input INSERTREPLACE replace LFCR no +# ORIGINMODE relative PROMPTMODE no SELECTCHARSET G0 B +# SELECTCHARSET G1 0 TABS -2 +# Other setup modes may be set for operator convenience or communication +# requirements; I recommend +# ACURSOR 1 0 AUTOREPEAT yes AUTOWRAP yes +# BYPASSCANCEL CURSORKEYMODE no DAINDEX 1 0 0 +# EOFSTRING '' EOLSTRING EOMCHARS +# GAMODE overstrike GCURSOR 0 100 0 GSPEED 10 1 +# IGNOREDEL no KEYEXCHAR
NVDEFINE -53 "" +# PROMPTSTRING '' QUEUESIZE 2460 WINDOW 0 0 4095 3132 +# XMTDELAY 0 +# and factory color maps. After setting these modes, save them with NVSAVE. No +# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +# "IC" cannot be used in combination with "im" & "ei". +# "tek4105a" is just a guess: +tek4105a|Tektronix 4105 (BRL), + OTbs, OTpt, msgr, xon, + OTkn#8, cols#80, lines#30, vt#3, + acsc=, bel=^G, blink=\E[5m, bold=\E[1m, + civis=\E%!0\ETD00\E%!1, cnorm=\E%!0\ETD10\E%!1, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, + cvvis=\E%!0\ETD70\E%!1, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, home=\E[H, ind=\n, is2=\E%!1, kbs=^H, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOA, + kf1=\EOB, kf2=\EOC, kf3=\EOD, kf4=\EOP, kf5=\EOQ, kf6=\EOR, + kf7=\EOS, lf0=F1, lf1=F2, lf2=F3, lf3=F4, lf4=F5, lf5=F6, lf6=F8, + ll=\E[30;H, nel=\EE, rev=\E[7m, ri=\EM, rmacs=^O, + rmcup=\E%!0\ELBH=\E%!1, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[m, rmul=\E[m, + rs2=\030\E%!0\EKC\E\014\EKR0\EKF0\ENM0\ELBH=\ETF8000010F40 + \ELI100\ELLA>\ELM0\EKE0\ENF1\EKS0\END0\E%!1\Ec\E[?3;5l + \E[?7;8h\E[r\E[m\E>, + sgr0=\E[m, smacs=^N, smcup=\E[?6l, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+inittabs, + use=ansi+local, use=ecma+index, + +# Tektronix 4106/4107/4109 from BRL +# The following setup modes are assumed for normal operation: +# CODE ansi COLUMNMODE 80 CRLF no +# DABUFFER 141 DAENABLE yes DALINES 32 +# DAMODE replace DAVISIBILITY yes ECHO no +# EDITMARGINS 1 32 FLAGGING input INSERTREPLACE replace +# LFCR no LOCKKEYBOARD no ORIGINMODE relative +# PROMPTMODE no SELECTCHARSET G0 B SELECTCHARSET G1 0 +# TABS -2 +# Other setup modes may be set for operator convenience or communication +# requirements; I recommend +# ACURSOR 1 0 AUTOREPEAT yes AUTOWRAP yes +# BYPASSCANCEL CURSORKEYMODE no DAINDEX 1 0 0 +# EOFSTRING '' EOLSTRING EOMCHARS +# GAMODE overstrike GCURSOR 0 100 0 GSPEED 9 3 +# IGNOREDEL no KEYEXCHAR
NVDEFINE -53 "" +# PROMPTSTRING '' QUEUESIZE 2620 WINDOW 0 0 4095 3132 +# XMTDELAY 0 +# and factory color maps. After setting these modes, save them with NVSAVE. No +# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +# "IC" cannot be used in combination with "im" & "ei". +tek4106brl|tek4107brl|tek4109brl|Tektronix 4106 4107 or 4109, + msgr, xon, + cols#80, lines#32, vt#3, + acsc=, bel=^G, blink=\E[5m, bold=\E[1m, + civis=\E%!0\ETD00\E%!1, cnorm=\E%!0\ETD10\E%!1, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, + cvvis=\E%!0\ETD70\E%!1, dch=\E[%p1%dP, dch1=\E[P, + ech=\E[%p1%dX, home=\E[H, ind=\n, is2=\E%!1, kbs=^H, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOA, + kf1=\EOB, kf2=\EOC, kf3=\EOD, kf4=\EOP, kf5=\EOQ, kf6=\EOR, + kf7=\EOS, lf0=F1, lf1=F2, lf2=F3, lf3=F4, lf4=F5, lf5=F6, lf6=F8, + ll=\E[32;H, nel=\EE, rev=\E[7m, ri=\EM, rmacs=^O, + rmcup=\E%!0\ELBH=\E%!1, rmir=\E[4l, rmkx=\E[?1l\E>, + rmso=\E[m, rmul=\E[m, + rs1=\030\E%!0\EKC\E\014\EKR0\EKF0\ENM0\ELBH=\ETF8000010F40 + \ELI100\ELLB0\ELM0\EKE0\ENF1\EKS0\END0\ERE0\E%!1\Ec\E[?3 + ;5l\E[?7;8h\E[r\E[m\E>, + sgr0=\E[m, smacs=^N, smcup=\E[?6l, smir=\E[4h, + smkx=\E[?1h\E=, smso=\E[7;42m, smul=\E[4m, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+inittabs, + use=ansi+local, use=ecma+index, + +# Refer to: +# TEK Programmer's Reference +# Part No. 070-4893-00 +# Product Group 18 +# 4107/4109 Computer Display Terminal +# November 1983 +# +# Tektronix 4107/4109 interpret 4 modes using "\E%!" followed by a code: +# 0 selects Tek mode, i.e., \E%!0 +# 1 selects ANSI mode +# 2 selects ANSI edit-mode +# 3 selects VT52 mode +# +# One odd thing about the description (which has been unchanged since the 90s) +# is that the cursor addressing is using VT52 mode, and a few others use the +# VT52's non-CSI versions of ANSI, e.g., \EJ. A possible explanation is that +# the developer used Emacs, which misuses cvvis (this description sets VT52 +# mode in that capability). +tek4107|tek4109|Tektronix terminals 4107 4109, + OTbs, am, mir, msgr, ul, xenl, xt, + cols#79, it#8, lines#29, + bel=^G, blink=\E%!1\E[5m$<2>\E%!0, + bold=\E%!1\E[1m$<2>\E%!0, clear=\ELZ, cnorm=\E%!0, cr=\r, + cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\E%!3, + dim=\E%!1\E[<0m$<2>\E%!0, ed=\EJ, el=\EK, ht=^I, ind=\n, + kbs=^H, rev=\E%!1\E[7m$<2>\E%!0, ri=\EI, + rmso=\E%!1\E[m$<2>\E%!0, rmul=\E%!1\E[m$<2>\E%!0, + sgr=\E%%!1\E[%?%p1%t;7;5%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%; + %?%p5%t<0%;%?%p6%t;1%;m$<2>\E%%!0, + sgr0=\E%!1\E[m$<2>\E%!0, smso=\E%!1\E[7;5m$<2>\E%!0, + smul=\E%!1\E[4m$<2>\E%!0, use=vt52+arrows, +# Tektronix 4207 with sysline. In the ancestral termcap file this was 4107-s; +# see the note attached to tek4207. +tek4207-s|Tektronix 4207 with sysline but no memory, + eslok, hs, + dsl=\E7\E[?6l\E[2K\E[?6h\E8, fsl=\E[?6h\E8, + is1=\E%!1\E[2;32r\E[132D\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8 + C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J, + is2=\E7\E[?6l\E[2K\E[?6h\E8, + tsl=\E7\E[?6l\E[2K\E[;%i%df, use=tek4107, + +# The 4110 series may be a wonderful graphics series, but they make the 4025 +# look good for screen editing. In the dialog area, you can't move the cursor +# off the bottom line. Out of the dialog area, ^K moves it up, but there +# is no way to scroll. +# +# Note that there is a floppy for free from Tek that makes the +# 4112 emulate the VT52 (use the VT52 termcap). There is also +# an expected enhancement that will use ANSI standard sequences. +# +# 4112 in non-dialog area pretending to scroll. It really wraps +# but vi is said to work (more or less) in this mode. +# +# 'vi' works reasonably well with this entry. +# +otek4112|o4112-nd|otek4113|otek4114|Tektronix 4110 series (old), + am, + cols#80, lines#34, + bel=^G, clear=\E^L, cr=\r, cub1=^H, cud1=\n, cuu1=^K, ind=\n, + rmcup=\EKA1\ELV1, smcup=\EKA0\ELV0\EMG0, +# The 4112 with the ANSI compatibility enhancement +tek4112|tek4114|Tektronix 4110 series, + OTbs, am, db, + cols#80, lines#34, + cbt=\E[Z, clear=\E[2J\E[0;0H, cub1=^H, cud1=\E[B, + cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, dch1=\E[P, + dl1=\E[M, ed=\E[0J, el=\E[0K, ich1=\E[@, il1=\E[L, + ind=\E7\E[0;0H\E[M\E8, is2=\E3!1, ri=\E7\E[0;0H\E[L\E8, + rmso=\E[m, rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m, +tek4112-nd|Tektronix 4112 not in dialog area, + OTns, + cuu1=^K, use=tek4112, +tek4112-5|Tektronix 4112 in 5 line dialog area, + lines#5, use=tek4112, +# (tek4113: this used to have "", someone's mistake; +# removed ", ", which had been commented out in 8.3. +# Note, the !0 and !1 sequences in /// were +# previously \0410 and \0411 sequences...I don't *think* they were supposed +# to be 4-digit octal -- esr) +tek4113|Tektronix 4113 color graphics with 5 line dialog area, + OTbs, am, da, eo, + cols#80, lines#5, + clear=\ELZ, cub1=^H, cud1=\n, cuf1=\ELM1 \ELM0, + flash=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4 + \ERBA4\ERBA4\ERB0, + is2=\EKA1\ELL5\ELV0\ELV1, uc=\010\ELM1_\ELM0, +tek4113-34|Tektronix 4113 color graphics with 34 line dialog area, + lines#34, + is2=\EKA1\ELLB2\ELV0\ELV1, use=tek4113, +# :ns: left off to allow vi visual mode. APL font (:as=\E^N:/:ae=\E^O:) not +# supported here. :uc: is slow, but looks nice. Suggest setenv MORE -up . +# :vb: needs enough delay to let you see the background color being toggled. +tek4113-nd|Tektronix 4113 color graphics with no dialog area, + OTbs, am, eo, + cols#80, it#8, lines#34, + clear=\E^L, cub1=^H, cud1=\n, cuf1=^I, cuu1=^K, + cvvis=\ELZ\EKA0, + flash=\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4\ERBA4 + \ERBA4\ERBA4\ERB0, + home=\ELF7l\177 @, ht=^I, is2=\ELZ\EKA0\ELF7l\177 @, + ll=\ELF hl @, rmso=\EMT1, smso=\EMT2, uc=\010\EMG1_\EMG0, +# This entry is from Tek. Inc. (Brian Biehl) +# (tek4115: :bc: renamed to :le:, / added based on init string -- esr) +otek4115|Tektronix 4115 (old), + OTbs, am, da, db, eo, + cols#80, it#8, lines#34, + cbt=\E[Z, clear=\E[H\E[2J, + cnorm=\E%!0\ELBG8\E%!1\E[34;1H, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E%!0\ELBB2\E%!1, + dch1=\E[P, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + if=/usr/share/tabset/vt100, il1=\E[L, + is2=\E%!0\E%\014\ELV0\EKA1\ELBB2\ENU@=\ELLB2\ELM0\ELV1\EKYA? + \E%!1\E[<1l\E[?7h\E[?8h\E[34;1H\E[34B\E[m, + kbs=^H, ri=\EM, rmam=\E[?7l, + rmcup=\E%!0\ELBG8\E%!1\E[34;1H\E[J, rmir=\E[4l, + rmkx=\E>, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smam=\E[?7h, + smcup=\E%!0\ELBB2\E%!1, smir=\E[4h, smkx=\E=, smso=\E[7m, + smul=\E[4m, use=ansi+local1, +tek4115|Tektronix 4115 entry with more ANSI capabilities (new), + am, xon, + cols#80, lines#34, + bel=^G, cr=\r, cub1=^H, cud1=\n, dch1=\E[P, ich=\E[%p1%d@, + ich1=\E[@, ind=\n, kcuu1=\E[A, rmam=\E[?7l, sgr0=\E[m, + smam=\E[?7h, use=ansi+arrows, use=ansi+cup, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ansi+rep, use=ansi+rca, use=ansi+sgrbold, + use=ansi+tabs, + +# The tek4125 emulates a VT100 incorrectly - the scrolling region +# command is ignored. The following entry replaces with the needed +# , , and ; removes some cursor pad commands that the tek4125 +# chokes on; and adds a lot of initialization for the Tektronix dialog area. +# Note that this entry uses all 34 lines and sets the cursor color to green. +# Steve Jacobson 8/85 +# (tek4125: there were two "\!"s in the is that I replaced with "\E!"; +# commented out, =\E1 because there's no -- esr) +tek4125|Tektronix 4125, + lines#34, + csr@, dl1=\E[1M, il1=\E[1L, + is2=\E%\E!0\EQD1\EUX03\EKA\ELBB2\ELCE0\ELI100\ELJ2\ELLB2 + \ELM0\ELS1\ELX00\ELV1\E%\E!1\E>\E[?3l\E[?4l\E[?5l\E[?7h + \E[?8h, + rc@, sc@, smkx=\E=, use=vt100+4bsd, + +# From: +# (tek4207: This was the termcap file's entry for the 4107/4207, but SCO +# supplied another, less capable 4107 entry. So we'll use that for 4107 and +# note that if jcoker wasn't confused you may be able to use this one. +# I merged in ,,,, from a BRL entry -- esr) +tek4207|Tektronix 4207 graphics terminal with memory, + am, bw, mir, msgr, ul, xenl, + cols#80, it#8, lines#32, + blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J$<156/>, + cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\EM, dch1=\E[P$<4/>, dl1=\E[M$<3/>, ed=\E[J, + el=\E[K$<5/>, home=\E[H, ht=^I, ich1=\E[@$<4/>, + il1=\E[L$<3/>, ind=\E[S, invis=\E[=6;<5, + is2=\E%!0\ELBP0\E%!1\E[H\E[2g\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8 + C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[8C\EH\E[J, + kcub1=\E[D, kcud1=\ED, kcuf1=\E[C, kcuu1=\EM, khome=\E[H, + rev=\E[7m, ri=\E[T, + rmcup=\E[?6h\E%!0\ELBP0\E%!1\E[32;1f, rmso=\E[m, + rmul=\E[m, sgr0=\E[m, smcup=\E[?6l\E[H\E[J, smso=\E[7m, + smul=\E[4m, tbc=\E[1g, + +# From: Thu Oct 31 12:54:27 1985 +# (tek4404: There was a "\!" in that I replaced with "\E!". +# Tab had been given as \E2I,that must be the tab-set capability -- esr) +tek4404|Tektronix 4404, + OTbs, + cols#80, it#8, lines#32, + blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cub1=^H, cud1=\n, + cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, dch1=\E[P, + dl1=\E[1M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, hts=\E[2I, + il1=\E[1L, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + rmcup=\E[1;1H\E[0J\E[?6h\E[?1l, rmir=\E[4l, + rmkx=\E[?1h, rmso=\E[27m, rmul=\E[m, sgr0=\E[m, + smcup=\E%\E!1\E[1;32r\E[?6l\E>, smir=\E[4h, + smkx=\E[?1l, smso=\E[7m, smul=\E[4m, use=ansi+csr, + +# Some unknown person wrote: +# I added the is string - straight Unix has ESC ; in the login +# string which sets a ct8500 into monitor mode (aka 4025 snoopy +# mode). The is string here cleans up a few things (but not +# everything). +ct8500|Tektronix ct8500, + am, bw, da, db, + cols#80, lines#25, + bel=^G, cbt=\E^I, clear=\E^E, cr=\r, cub1=^H, cud1=\n, + cuf1=\ES, cup=\E|%p1%{32}%+%c%p2%{32}%+%c, cuu1=\ER, + dch1=\E^], dl1=\E\r, ed=\E^U, el=\E^T, ht=^I, ich1=\E^\, + il1=\E^L, ind=\n, is2=\037\EZ\Ek, ri=\E^A, rmso=\E\s, + rmul=\E\s, sgr0=\E\s, smso=\E$, smul=\E!, + +# Tektronix 4205 terminal. +# +# am is not defined because the wrap around occurs not when the char. +# is placed in the 80'th column, but when we are attempting to type +# the 81'st character on the line. (esr: hmm, this is like the VT100 +# version of xenl, perhaps am + xenl would work!) +# +# Bold, dim, and standout are simulated by colors and thus not allowed +# with colors. The Tektronix color table is mapped into the RGB color +# table by setf/setb. All colors are reset to factory specifications by oc. +# The cap uses RGB notation to define colors. for arguments 1-3 the +# interval (0-1000) is broken into 8 smaller sub-intervals (125). Each sub- +# interval then maps into pre-defined value. +tek4205|Tektronix 4205, + ccc, mir, msgr, + colors#8, cols#80, it#8, lines#30, ncv#49, pairs#63, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[=7;<4m, cbt=\E[Z, + clear=\E[2J\E[H, cr=\r, cup=\E[%i%p1%d;%p2%dH, + dch1=\E[1P, dim=\E[=1;<6m, dl=\E[%p1%dM, dl1=\E[1M, + ech=\E%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E)0, + home=\E[H, ht=^I, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[1L, + ind=\ED, + initc=\E%%!0\ETF4%?%p1%{0}%=%t0%e%p1%{1}%=%t4%e%p1%{2}%=%t3 + %e%p1%{3}%=%t5%e%p1%{4}%=%t2%e%p1%{5}%=%t6%e%p1%{6}%= + %t7%e1%;%?%p2%{125}%<%t0%e%p2%{250}%<%tA2%e%p2%{375}%< + %tA?%e%p2%{500}%<%tC8%e%p2%{625}%<%tD4%e%p2%{750}%<%tE + 1%e%p2%{875}%<%tE:%eF4%;%?%p3%{125}%<%t0%e%p3%{250}%< + %tA2%e%p3%{375}%<%tA?%e%p3%{500}%<%tC8%e%p3%{625}%<%tD + 4%e%p3%{750}%<%tE1%e%p3%{875}%<%tE:%eF4%;%?%p4%{125}%< + %t0%e%p4%{250}%<%tA2%e%p4%{375}%<%tA?%e%p4%{500}%<%tC8 + %e%p4%{625}%<%tD4%e%p4%{750}%<%tE1%e%p4%{875}%<%tE:%eF + 4%;\E%%!1, + invis=\E[=6;<5, is1=\E%!0\ETM1\E%!1\E[m, kbs=^H, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\EOA, + kf1=\EOB, kf2=\EOC, kf3=\EOD, kf4=\EP, kf5=\EQ, kf6=\ER, + kf7=\ES, + oc=\E%!0\ETFB000001F4F4F42F40030F404A4C because of a bug in old vi (if stty says you have +# a "newline" style terminal (-crmode) vi figures all it needs is nl +# to get crlf, even if is not ^M.) +# (tty40: removed obsolete ":nl=\EG\EB:", it's just do+cr -- esr) +tty40|ds40|ds40-2|dataspeed40|Teletype dataspeed 40/2, + OTbs, xon, + cols#80, lines#24, + clear=\EH$<20>\EJ$<80>, cr=\EG, cub1=^H, cud1=\EB, + cuf1=\EC, cuu1=\E7, dch1=\EP$<50>, dl1=\EM$<50>, + ed=\EJ$<75>, home=\EH$<10>, ht=\E@$<10>, hts=\E1, + ich1=\E\^$<50>, il1=\EL$<50>, ind=\ES$<20>, kbs=^], + kcub1=^H, mc4=^T, mc5=\022$<2000>, ri=\ET$<10>, rmso=\E4, + rs2=\023\ER$<60>, smso=\E3, tbc=\EH\E2$<80>, +tty43|model 43 teletype, + OTbs, am, hc, os, xon, + cols#132, + bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, kbs=^H, + +#### Tymshare +# + +# You can add to put this 40-column mode, though I can't +# for the life of me think why anyone would want to. +scanset|sc410|sc415|Tymshare Scan Set, + am, bw, msgr, + cols#80, lines#24, + acsc=j%k4l, sc=^B, smacs=^N, + use=vt52+arrows, + +#### Volker-Craig (vc) +# +# If you saw a Byte Magazine cover with a terminal on it during the early +# 1980s, it was probably one of these. Carl Helmers liked them because +# they could crank 19.2 and were cheap (that is, he liked them until he tried +# to program one...) +# + +# Missing in vc303a and vc303 descriptions: they scroll 2 lines at a time +# every other linefeed. +vc303|vc103|vc203|Volker-Craig 303, + OTbs, OTns, am, + cols#80, lines#24, + bel=^G, clear=\014$<40>, cr=\r, cub1=^H, cud1=\n, cuf1=^I, + cuu1=^N, home=\013$<40>, kcub1=^H, kcud1=\n, kcuf1=^I, + kcuu1=^N, ll=\017$<1>W, +vc303a|vc403a|Volker-Craig 303a, + clear=\030$<40>, cuf1=^U, cuu1=^Z, el=\026$<20>, + home=\031$<40>, kcuf1=^U, kcuu1=^Z, ll=^P, use=vc303, +# (vc404: removed obsolete ":ma=^Z^P^U :" -- esr) +vc404|Volker-Craig 404, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\030$<40>, cr=\r, cub1=^H, cud1=\n, cuf1=^U, + cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, + ed=\027$<40>, el=\026$<20>, home=\031$<40>, ind=\n, + kcub1=^H, kcud1=\n, kcuf1=^U, kcuu1=^Z, +vc404-s|Volker-Craig 404 w/standout mode, + cud1=\n, rmso=^O, smso=^N, use=vc404, +# From: +# (vc414: merged in cup/dl1/home from an old vc414h-noxon) +vc414|vc414h|Volker-Craig 414H in sane escape mode., + OTbs, am, + cols#80, lines#24, + clear=\E\034$<40>, cud1=\E^K, cuf1=^P, + cup=\E\021%p2%c%p1%c$<40>, cuu1=\E^L, dch1=\E3, + dl1=\E\023$<40>, ed=\E^X, el=\E\017$<10/>, home=\E^R, + ich1=\E:, il1=\E\032$<40>, kcub1=^H, kcud1=\E^K, kcuf1=^P, + kcuu1=\E^L, kf0=\EA, kf1=\EB, kf2=\EC, kf3=\ED, kf4=\EE, + kf5=\EF, kf6=\EG, kf7=\EH, khome=\E^R, lf0=PF1, lf1=PF2, + lf2=PF3, lf3=PF4, lf4=PF5, lf5=PF6, lf6=PF7, lf7=PF8, + rmso=\E^_, smso=\E^Y, +vc415|Volker-Craig 415, + clear=^L, use=vc404, + +######## OBSOLETE PERSONAL-MICRO CONSOLES AND EMULATIONS +# + +#### IBM PC and clones +# + +# The pcplot IBM-PC terminal emulation program is really messed up. It is +# supposed to emulate a vt-100, but emulates the wraparound bug incorrectly, +# doesn't support scrolling regions, ignores add line commands, and ignores +# delete line commands. Consequently, the resulting behavior looks like a +# crude adm3a-type terminal. +# Steve Jacobson 8/85 +pcplot|pc-plot terminal emulation program, + xenl@, + csr@, dl@, dl1@, il@, il1@, rc@, sc@, use=vt100+4bsd, +# KayPro II from Richard G Turner +# I've found that my KayPro II, running MDM730, continues to emulate an +# ADM-3A terminal, just like I was running TERM.COM. On our 4.2 UNIX +# system the following termcap entry works well: +# I have noticed a couple of minor glitches, but nothing I can't work +# around. (I added two capabilities from the BRL entry -- esr) +kaypro|kaypro2|kaypro II, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\032$<1/>, cr=\r, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dl1=\ER, ed=^W, + el=^X, home=^^, il1=\EE, ind=\n, kcud1=\n, kcuf1=^L, kcuu1=^K, + +# From IBM, Thu May 5 19:35:27 1983 +# (ibmpc: commented out =\200R because we don't know -- esr) +ibm-pc|ibm5051|5051|IBM Personal Computer (no ANSI.SYS), + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^L^K, cr=\r^^, cub1=^], cud1=\n, cuf1=^\, + cuu1=^^, home=^K, ind=\n$<10>, kcud1=^_, + +ibmpc|wy60-PC|wyse60-PC|IBM PC/XT running PC/IX, + OTbs, am, bw, eo, hs, km, msgr, ul, + cols#80, it#8, lines#24, + acsc=j\331k\277l\332m\300n\305q\304t\303u\264v\301w\302x + \263, + bel=^G, clear=\Ec, cr=\r, cup=\E[%i%p1%d;%p2%dH, + ech=\E[%p1%dX, ed=\E[J, el=\E[K, home=\E[H, + hpa=\E[%i%p1%dG, ind=\E[S\E[B, indn=\E[%p1%dS\E[%p1%dB, + invis=\E[30;40m, kcbt=^], kdch1=^?, kend=\E[Y, kf1=\240, + kf10=\251, kf2=\241, kf3=\242, kf4=\243, kf5=\244, kf6=\245, + kf7=\246, kf8=\247, kf9=\250, kich1=\E[^H, knp=\E[U, + kpp=\E[V, ll=\E[24;1H, nel=\r, rev=\E[7m, ri=\E[T\E[A, + rin=\E[%p1%dT\E[%p1%dA, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 + %;%?%p7%t30;40%;m, + sgr0=\E[m, use=ansi+arrows, use=ansi+local, + use=ansi+sgrbold, + +#### Apple II +# +# Apple II firmware console first, then various 80-column cards and +# terminal emulators. For two cents I'd toss all these in the UFO file +# along with the 40-column apple entries. +# + +# From: brsmith@umn-cs.cs.umn.edu (Brian R. Smith) via BRL +# 'it#8' tells UNIX that you have tabs every 8 columns. This is a +# function of TIC, not the firmware. +# The clear key on a IIgs will do something like clear-screen, +# depending on what you're in. +appleIIgs|appleIIe|appleIIc|Apple 80 column firmware interface, + OTbs, am, bw, eo, msgr, + cols#80, it#8, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^\, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^], + home=^Y, ht=^I, ind=^W, kbs=^H, kclr=^X, kcub1=^H, kcud1=\n, + kcuf1=^U, kcuu1=^K, kdch1=^?, nel=\r^W, ri=^V, rmso=^N, + smso=^O, +# Apple //e with 80-column card, entry from BRL +# The modem interface is permitted to discard LF (maybe DC1), otherwise +# passing characters to the 80-column firmware via COUT (PR#3 assumed). +# Auto-wrap does not work right due to newline scrolling delay, which also +# requires that you set "stty cr2". +# Note: Cursor addressing is only available via the Pascal V1.1 entry, +# not via the BASIC PR#3 hook. All this nonsense can be avoided only by +# using a terminal emulation program instead of the built-in firmware. +apple2e|Apple //e, + bw, msgr, + cols#80, lines#24, + bel=^G, clear=\014$<100/>, cub1=^H, cud1=\n, cuu1=^_, + ed=\013$<4*/>, el=\035$<4/>, home=^Y, ht=^I, ind=^W, + is2=^R^N, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^U, kcuu1=^K, + nel=\r$<100/>, rev=^O, ri=^V, rmso=^N, rs1=^R^N, sgr0=^N, + smso=^O, +# mcvax!vu44!vu45!wilcke uses the "ap" entry together with Ascii Express Pro +# 4.20, with incoming and outgoing terminals both on 0, emulation On. +apple2e-p|Apple //e via Pascal, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, use=apple2e, +# (ASCII Express) MouseTalk "Standard Apple //" emulation from BRL +# Enable DC3/DC1 flow control with "stty ixon -ixany". +apple-ae|ASCII Express, + OTbs, am, bw, msgr, nxon, xon, + cols#80, it#8, lines#24, + bel=\007$<500/>, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^U, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^], + home=^Y, ind=^W, is2=^R^N, kclr=^X, kcub1=^H, kcud1=\n, + kcuf1=^U, kcuu1=^K, rev=^O, ri=^V, rmso=^N, rs1=^R^N, sgr0=^N, + smso=^O, +appleII|Apple II plus, + OTbs, am, + cols#80, it#8, lines#24, + clear=^L, cnorm=^TC2, cub1=^H, cud1=\n, cuf1=^\, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, cvvis=^TC6, + ed=^K, el=^], flash=\024G1$<200/>\024T1, home=\E^Y, ht=^I, + is2=^TT1^N, kcud1=\n, kcuf1=^U, rmso=^N, sgr0=^N, smso=^O, +# Originally by Gary Ford 21NOV83 +# From: Fri Oct 11 21:27:00 1985 +apple-80|Apple II with smarterm 80 col, + OTbs, am, bw, + cols#80, lines#24, + cbt=^R, clear=\014$<10*/>, cr=\r$<10*/>, cub1=^H, cud1=\n, + cuf1=^\, cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, + ed=\013$<10*/>, el=\035$<10/>, home=^Y, +apple-soroc|Apple emulating Soroc 120, + am, + cols#80, lines#24, + bel=^G, clear=\E*$<300>, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EY, el=\ET, + home=^^, ind=\n, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, +# From Peter Harrison, Computer Graphics Lab, San Francisco +# ucbvax!ucsfmis!harrison .....uucp +# ucbvax!ucsfmis!harrison@BERKELEY .......ARPA +# "These two work. If you don't have the inverse video chip for the +# Apple with videx then remove the :so: and :se: fields." +# (apple-videx: this used to be called DaleApple -- esr) +apple-videx|Apple with videx videoterm 80 column board with inverse video, + OTbs, am, xenl, + cols#80, it#8, lines#24, + clear=\014$<300/>, cub1=^H, cud1=\n, cuf1=^\, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^], + home=^Y, ht=^I, kcub1=^H, kcud1=\n, kcuf1=^U, khome=^Y, + rmso=^Z2, sgr0=^Z2, smso=^Z3, +# My system [for reference] : Apple ][+, 64K, Ultraterm display card, +# Apple Cat ][ 212 modem, + more all +# controlled by ASCII Express: Pro. +# From Dave Shaver +apple-uterm-vb|Videx Ultraterm for Apple micros with Visible Bell, + OTbs, am, eo, xt, + cols#80, lines#24, + acsc=, clear=^L, cuf1=^\, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^], + flash=^W35^W06, home=^Y, + is2=^V4^W06\017\rVisible Bell Installed.\016\r\n, + rmso=^N, smso=^O, +apple-uterm|Ultraterm for Apple micros, + OTbs, am, eo, xt, + cols#80, lines#24, + acsc=, clear=^L, cuf1=^\, + cup=\036%p2%{32}%+%c%p1%{32}%+%c, cuu1=^_, ed=^K, el=^], + home=^Y, is2=^V4^W06\016, rmso=^N, smso=^O, +# from trwrba!bwong (Bradley W. Wong): +# +# This entry assumes that you are using an apple with the UCSD Pascal +# language card. SYSTEM.MISCINFO is assumed to be the same as that +# supplied with the standard apple except that screenwidth should be set +# using SETUP to 80 columns. Note that the right arrow is not mapped in +# this termcap entry. This is because that key, on the Apple, transmits +# a ^U and would thus preempt the more useful "up" function of vi. +# +# HMH 2/23/81 +apple80p|80-column apple with Pascal card, + am, bw, + cols#80, lines#24, + clear=^Y^L, cuf1=^\:, cup=\036%p2%{32}%+%c%p1%{32}%+%c, + cuu1=^_, ed=^K, el=^], home=^Y, kcub1=^H, +# +# Apple II+ equipped with Videx 80 column card +# +# Terminfo from ihnp4!ihu1g!djc1 (Dave Christensen) via BRL; +# manually converted by D A Gwyn +# +# DO NOT use any terminal emulation with this data base, it works directly +# with the Videx card. This has been tested with vi 1200 baud and works fine. +# +# This works great for vi, except I've noticed in pre-R2, ^U will scroll back +# 1 screen, while in R2 ^U doesn't. +# For inverse alternate character set add: +# =^O:=^N: +# (apple-v: added it#8 -- esr) +apple-videx2|Apple II+ w/ Videx card (similar to Datamedia h1520), + am, xenl, + cols#80, it#8, lines#24, + bel=\007$<100/>, clear=\014$<16*/>, cr=\r, cub1=^H, + cud1=\n, cuf1=^\, cup=\036%p2%{32}%+%c%p1%{32}%+%c, + cuu1=^_, ed=\013$<16*/>, el=^], home=^Y, ht=\011$<8/>, + ind=\n, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^\, kcuu1=^_, + khome=^Y, rmso=^Z2, smso=^Z3, +apple-videx3|vapple|Apple II with 80 col card, + OTbs, am, + cols#80, lines#24, + clear=\Ev, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, el=\Ex, + home=\EH, kf0=\EP, kf1=\EQ, kf2=\ER, kf3=\E\s, kf4=\E!, + kf5=\E", kf6=\E#, kf7=\E$, kf8=\E%%, kf9=\E&, khome=\EH, + use=vt52+arrows, +#From: decvax!cbosgd!cbdkc1!mww Mike Warren via BRL +aepro|Apple II+ running ASCII Express Pro--vt52, + OTbs, + cols#80, lines#24, + clear=\014$<300/>, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ, + el=\EK, home=\EH, +# UCSD addition: Yet another termcap from Brian Kantor's Micro Munger Factory +apple-vm80|ap-vm80|Apple with viewmax-80, + OTbs, + cols#80, lines#24, + clear=\014$<300/>, cuf1=^\:, + cup=\036%p1%{32}%+%c%p2%{32}%+%c$<100/>, cuu1=^_, + ed=\013$<300/>, el=^], home=\031$<200/>, + +#### Apple Lisa & Macintosh +# + +# (lisa: changed to -- esr) +lisa|Apple Lisa console display (black on white), + OTbs, am, eo, msgr, + cols#88, it#8, lines#32, + acsc=jdkclfmenbqattuvvuwsx`, civis=\E[5h, clear=^L, + cnorm=\E[5l, cub1=^H, cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, + dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, ich1=\E[@, + il1=\E[L, is2=\E>\E[m\014, kbs=^H, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, rmacs=\E[10m, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smacs=\E[11m, smso=\E[7m, smul=\E[4m, + use=ansi+local1, +liswb|Apple Lisa console display (white on black), + is2=\E>\E[0;7m\014, rmso=\E[0;7m, rmul=\E[0;7m, + smso=\E[m, smul=\E[4m, use=lisa, + +# lisaterm from ulysses!gamma!epsilon!mb2c!jed (John E. Duncan III) via BRL; +# revised by Ferd Brundick +# +# These entries assume that the 'Auto Wraparound' is enabled. +# Xon-Xoff flow control should also be enabled. +# +# The VT100 uses :rs2: and :rf: rather than :is2:/:tbc:/:hts: because the tab +# settings are in non-volatile memory and don't need to be reset upon login. +# Also setting the number of columns glitches the screen annoyingly. +# You can type "reset" to get them set. +# +lisaterm|Apple Lisa or Lisa/2 running LisaTerm VT100 emulation, + OTbs, OTpt, am, xenl, xon, + OTkn#4, cols#80, it#8, lines#24, vt#3, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[2J, cr=\r, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, + home=\E[H, ht=^I, hts=\EH, ind=\n, kbs=^H, kcub1=\EOD, + kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf0=\EOP, kf1=\EOQ, + kf2=\EOR, kf3=\EOS, lf0=F1, lf1=F2, lf2=F3, lf3=F4, rev=\E[7m, + ri=\EM, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + rs1=\E>\E[?1l\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1;24r, + sgr0=\E[m, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, + tbc=\E[3g, use=ansi+csr, use=ansi+local, + +# Lisaterm in 132 column ("wide") mode. +lisaterm-w|Apple Lisa with Lisaterm in 132 column mode, + cols#132, + kbs=^H, kcub1=^H, kcud1=\n, use=lisaterm, +# Although MacTerminal has insert/delete line, it is commented out here +# since it is much faster and cleaner to use the "lock scrolling region" +# method of inserting and deleting lines due to the MacTerminal implementation. +# Also, the "Insert/delete ch" strings have an extra character appended to them +# due to a bug in MacTerminal V1.1. Blink is disabled since it is not +# supported by MacTerminal. +mac|macintosh|Macintosh with MacTerminal, + xenl, + OTdN#30, + blink@, dch1=\E[P$<7/>, ich1=\E[@$<9/>, ip=$<7/>, use=lisa, +# Lisaterm in 132 column ("wide") mode. +mac-w|macterminal-w|Apple Macintosh with MacTerminal in 132 column mode, + cols#132, use=mac, + +#### Radio Shack/Tandy +# + +# (coco3: This had "ta" used incorrectly as a boolean and bl given as "bl#7". +# I read these as mistakes for ":it#8:" and ":bl=\007:" respectively -- esr) +# From: <{pbrown,ctl}@ocf.berkeley.edu> 12 Mar 90 +coco3|os9LII|Tandy CoCo3 24*80 OS9 Level II, + OTbs, am, + cols#80, it#8, lines#24, + bel=^G, blink=^_", bold=\E:^A, civis=^E\s, + clear=\014$<5*/>, cnorm=^E!, cub1=^H, cud1=\n, cuf1=^F, + cup=\002%p2%{32}%+%c%p1%{32}%+%c$<2/>, cuu1=^I, + dl1=^_1, ed=^K, el=^D, home=^A, il1=^_0, kcub1=^H, kcud1=\n, + kcuf1=^I, kcuu1=^L, rev=^_\s, rmso=^_!, rmul=^_#, + sgr0=\037!\E:\0, smso=^_\s, smul=^_", +# (trs2: removed obsolete ":nl=^_:" -- esr) +trs2|trsII|trs80II|Radio Shack Model II using P&T CP/M, + OTbs, am, msgr, + cols#80, it#8, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=^_, cuf1=^], + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^^, dl1=^K, ed=^B, + el=^A, home=^F, ht=^I, il1=^D, ind=\n, kbs=^H, kcub1=^\, + kcud1=^_, kcuf1=^], kcuu1=^^, rmso=^O, sgr0=^O, smso=^N, +# From: Kevin Braunsdorf +# (This had extension capabilities +# :BN=\E[?33h:BF=\E[?33l:UC=\E[_ q:BC=\E[\177 q:\ +# :CN=\ERC:CF=\ERc:NR=\ERD:NM=\ER@: +# I also deleted the unnecessary ":kn#2:", ":sg#0:" -- esr) +trs16|trs-80 model 16 console, + OTbs, am, + cols#80, it#8, lines#24, + acsc=jak`l_mbquvewcxs, bel=^G, civis=\ERc, clear=^L, + cnorm=\ERC, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ, + dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\EP, il1=\EL, + ind=\n, kbs=^H, kf0=^A, kf1=^B, kf2=^D, kf3=^L, kf4=^U, kf5=^P, + kf6=^N, kf7=^S, khome=^W, lf0=f1, lf1=f2, lf2=f3, lf3=f4, lf4=f5, + lf5=f6, lf6=f7, lf7=f8, mc4=\E]+, mc5=\E]=, rmacs=\ERg, + rmso=\ER@, sgr0=\ER@, smacs=\ERG, smso=\ERD, + use=vt52+arrows, + +#### Commodore Business Machines +# +# Formerly located in West Chester, PA; went spectacularly bust in 1994 +# after years of shaky engineering and egregious mismanagement. Made one +# really nice machine (the Amiga) and boatloads of nasty ones (PET, C-64, +# C-128, VIC-20). The C-64 is said to have been the most popular machine +# ever (most units sold); they can still be found gathering dust in closets +# everywhere. +# + +# From: Kent Polk , 30 May 90 +# Added a few more entries, converted caret-type control sequence (^x) entries +# to '\0xx' entries since a couple of people mentioned losing '^x' sequences. +# Corrections by Ty Sarna , Sat Feb 28 18:55:15 1998 +# +# :as:, :ae: Support for alternate character sets. +# :ve=\E[\040p:vi=\E[\060\040p: cursor visible/invisible. +# :xn: vt100 kludginess at column 80/NEWLINE ignore after 80 cols(Concept) +# This one appears to fix a problem I always had with a line ending +# at 'width+1' (I think) followed by a blank line in vi. The blank +# line tended to disappear and reappear depending on how the screen +# was refreshed. Note that this is probably needed only if you use +# something like a Dnet Fterm with the window sized to some peculiar +# dimension larger than 80 columns. +# :k0=\E9~: map F10 to k0 - could have F0-9 -> k0-9, but ... F10 was 'k;' +# (amiga: removed obsolete :kn#10:, +# also added empty to suppress a warning --esr) +amiga|Amiga ANSI, + OTbs, am, bw, xenl, + cols#80, lines#24, + acsc=, bel=^G, blink=\E[7;2m, bold=\E[1m, cbt=\E[Z, + civis=\E[0 p, cnorm=\E[ p, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, dim=\E[2m, home=\E[H, + ich=\E[%p1%d@, ich1=\E[@, ind=\E[S, invis=\E[8m, + is2=\E[20l, kbs=^H, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, + kcuu1=\E[A, kf0=\E[9~, kf1=\E[0~, kf2=\E[1~, kf3=\E[2~, + kf4=\E[3~, kf5=\E[4~, kf6=\E[5~, kf7=\E[6~, kf8=\E[7~, + kf9=\E[8~, rev=\E[7m, ri=\E[T, rmacs=^O, rmso=\E[m, + rmul=\E[m, rs1=\Ec, sgr0=\E[m, smacs=^N, smso=\E[7m, + smul=\E[4m, use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ecma+index, + +# From: Hans Verkuil , 4 Dec 1995 +# (amiga: added empty to suppress a warning. +# I'm told this entry screws up badly with AS225, the Amiga +# TCP/IP package once from Commodore, and now sold by InterWorks.--esr) +amiga-h|Hans Verkuil's Amiga ANSI, + OTbs, bw, msgr, + cols#80, lines#24, + acsc=, bel=^G, blink=\2337;2m, bold=\2331m, cbt=\233Z, + civis=\2330 p, clear=\233H\233J, cnorm=\233 p, cr=\r, + cub=\233%p1%dD, cub1=\233D, cud=\233%p1%dB, cud1=\233B, + cuf=\233%p1%dC, cuf1=\233C, cup=\233%i%p1%d;%p2%dH, + cuu=\233%p1%dA, cuu1=\233A, dch=\233%p1%dP, dch1=\233P, + dim=\2332m, ech=\233%p1%dP, ed=\233J, el=\233K, flash=^G, + home=\233H, ht=^I, ich=\233%p1%d@, ich1=\233@, ind=\233S, + indn=\233%p1%dS, invis=\2338m, is2=\23320l, kbs=^H, + kcub1=\233D, kcud1=\233B, kcuf1=\233C, kcuu1=\233A, + kdch1=^?, kf0=\2339~, kf1=\2330~, kf2=\2331~, kf3=\2332~, + kf4=\2333~, kf5=\2334~, kf6=\2335~, kf7=\2336~, kf8=\2337~, + kf9=\2338~, nel=\233B\r, rev=\2337m, ri=\233T, + rin=\233%p1%dT, rmacs=^O, rmcup=\233?7h, rmso=\2330m, + rmul=\2330m, rs1=\Ec, sgr0=\2330m, smacs=^N, smcup=\233?7l, + smso=\2337m, smul=\2334m, + +# From: Henning 'Faroul' Peters , 25 Sep 1999 +# +# Pavel Fedin added +# Home Shift+Left +# End Shift+Right +# PgUp Shift+Up +# PgDn Shift+Down +amiga-8bit|Amiga ANSI using 8-bit controls, + acsc=, dl=\233%p1%dM, dl1=\233M, il=\233%p1%dL, il1=\233L, + ind=\204, indn@, kend=\233 @, khome=\233 A, knp=\233S, + kpp=\233T, ri=\215, rin@, use=amiga-h, + +# From: Ruediger Kuhlmann , 18 Jul 2000 +# requires use of appropriate preferences settings. +amiga-vnc|Amiga using VNC console (black on light gray), + am, da, db, msgr, ndscr, + btns#1, colors#16, cols#80, lines#24, lm#0, ncv#0, pairs#0x100, + bel=^G, blink=\E[7;2m, bold=\E[1m, civis=\E[0p, + cnorm=\E[p\E[>?6l, cr=\r, csr=\E[%i%p1%d;%p2%dr, + cup=\E[%i%p1%d;%p2%dH, cvvis=\E[>?6h, dch=\E[%p1%dP, + dch1=\E[P, dim=\E[2m, dl=\E[%p1%dM, dl1=\E[1M, flash=^G, + ich=\E[%p1%d@, ich1=\E[@, il=\E[%p1%dL, il1=\E[1L, ind=\ED, + invis=\E8m, + is2=\E[>?2;18l\E[>?26;?6;20;>?15;?7;>?22;>?8h, + kcbt=\233Z, kdch1=^?, kf0=\E[9~, kf1=\E[0~, kf2=\E[1~, + kf3=\E[2~, kf4=\E[3~, kf5=\E[4~, kf6=\E[5~, kf7=\E[6~, + kf8=\E[7~, kf9=\E[8~, khlp=\E[?~, khome=\E[44~, kll=\E[45~, + kmous=\E[M, knp=\E[42~, kpp=\E[41~, nel=\EE, oc=\E[0m, + rev=\E[7m, ri=\EM, rmcup=\E[?7h\E[r\E[J, rmkx=\E[?1l, + rmso=\E[21m, rmul=\E[24m, rs1=\Ec, + rs2=\E[>?2;18l\E[>?26;?6;20;>?15;?7;>?22;>?8h, + setab=\E[%?%p1%{8}%>%t%'F'%p1%+%d%e4%p1%d%;m, + setaf=\E[%?%p1%{8}%>%t%'2'%p1%+%d%e3%p1%d%;m, + sgr0=\E[0m\017\E[30;85;>15m, smcup=\E[?7h, smkx=\E[?1h, + smso=\E[1m, smul=\E[4m, use=ansi+arrows, use=ansi+erase, + use=ansi+local, use=ecma+index, + +# MorphOS on Genesi Pegasos +# By Pavel Fedin +morphos|MorphOS on Genesi Pegasos, + acsc=, dl=\233%p1%dM, dl1=\233M, il=\233%p1%dL, il1=\233L, + ind=\204, indn@, kend=\23345~, kf11=\23320~, kf12=\23321~, + khome=\23344~, kich1=\23340~, knp=\23342~, kpp=\23341~, + ri=\215, rin@, use=amiga-h, + +# Commodore B-128 microcomputer from Doug Tyrol +# I'm trying to write a termcap for a commodore b-128, and I'm +# having a little trouble. I've had to map most of my control characters +# to something that unix will accept (my delete-char is a ctrl-t, etc), +# and create some functions (like cm), but thats life. +# The problem is with the arrow keys - right, and up work fine, but +# left deletes the previous character and down I just can't figure out. +# Jove knows what I want, but I don't know what it's sending to me (it +# isn't thats bound to next-line in jove). +# Anybody got any ideas? Here's my termcap. +# DAG -- I changed his "^n" entries to "\n"; see if that works. +# +commodore|b-128|Commodore B-128 micro, + am, bw, + OTdN#20, cols#80, lines#24, pb#150, + OTbc=^H, OTnl=\r, clear=\E\006$<10/>, cr=\r, cud1=\n, + cuf1=^F, cup=\E\013%p1%2d\,%p2%2d\,$<20/>, cuu1=^P, + dch1=\177$<10*/>, dl1=\Ed$<10*/>, el=\Eq$<10/>, + home=\E^E, ht=\011$<5/>, ich1=\E\n$<5/>, il1=\Ei$<10/>, + kcub1=^B, kcud1=\n, kcuf1=^F, kcuu1=^P, khome=\E^E, rmir=, + smir=, + +#### North Star +# +# North Star Advantage from Lt. Fickie via BRL +northstar|North Star Advantage, + OTbs, + cols#80, lines#24, + clear=\004$<200/>, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<1/>, ed=\017$<200/>, + el=\016$<200/>, home=\034\032$<200/>, + +#### Osborne +# +# Thu Jul 7 03:55:16 1983 +# +# As an aside, be careful; it may sound like an anomaly on the +# Osborne, but with the 80-column upgrade, it's too easy to +# enter lines >80 columns! +# +# I've already had several comments... +# The Osborne-1 with the 80-col option is capable of being +# 52, 80, or 104 characters wide; default to 80 for compatibility +# with most systems. +# +# The tab is destructive on the Ozzie; make sure to 'stty -tabs'. +osborne-w|osborne1-w|Osborne I in 104-column mode, + msgr, ul, xt, + cols#104, lines#24, + bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, el=\ET, ich1=\EQ, il1=\EE, ind=\n, kcub1=^H, kcud1=\n, + kcuf1=^L, kcuu1=^K, rmso=\E(, rmul=\Em, smso=\E), smul=\El, +# Osborne I from ptsfa!rhc (Robert Cohen) via BRL +osborne|osborne1|Osborne I in 80-column mode, + OTbs, am, mir, msgr, ul, xhp, + OTdB#4, cols#80, lines#24, + clear=^Z, cub1=\010$<4>, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, + dch1=\EW$<4/>, dl1=\ER, el=\ET, il1=\EE, is2=^Z, kbs=^H, + kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, rmir=, rmso=\E), + rmul=\Em, smir=\EQ, smso=\E(, smul=\El, +# +# Osborne Executive definition from BRL +# Similar to tvi920 +# Added by David Milligan and Tom Smith (SMU) +osexec|Osborne executive, + OTbs, am, + OTug#1, cols#80, lines#24, xmc#1, + OTnl=\n, bel=^G, clear=^Z, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dl1=\ER, ed=\EY, el=\ET, home=^^, hts=\E1, ich1=\EQ, il1=\EE, + is2=\Eq\Ek\Em\EA\Ex0, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, + kcuu1=^K, kf0=^A@\r, kf1=^AA\r, kf2=^AB\r, kf3=^AC\r, + kf4=^AD\r, kf5=^AE\r, kf6=^AF\r, kf7=^AG\r, kf8=^AH\r, + kf9=^AI\r, rmir=, rmso=\Ek, rmul=\Em, smir=, smso=\Ej, + smul=\El, tbc=\E3, + +#### Console types for obsolete UNIX clones +# +# Coherent, Minix, Venix, and several lesser-known kin were OSs for 8088 +# machines that tried to emulate the UNIX look'n'feel. Coherent and Venix +# were commercial, Minix an educational tool sold in conjunction with a book. +# Memory-segmentation limits and a strong tendency to look like V7 long after +# it was obsolete made all three pretty lame. Venix croaked early. Coherent +# and Minix were ported to 32-bit Intel boxes, only to be run over by a +# steamroller named `Linux' (which, to be fair, traces some lineage to Minix). +# Coherent's vendor, the Mark Williams Company, went belly-up in 1994. There +# are also, I'm told, Minix ports that ran on Amiga and Atari machines and +# even as single processes under SunOS and the Macintosh OS. +# + +# See +# https://web.archive.org/web/20120703021949/http://www.minix3.org/manpages/html4/console.html +minix|minix console (v3), + NQ, + acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260j + \331k\277l\332m\300n\305o~p\304q\304r\304s_t\303u\264v + \301w\302x\263y\363z\362{\343|\330}\234~\376, + kdch1=^?, kend=\E[Y, kf0=\E[21~, kf1=\E[11~, kf10=\E[21~, + kf11=\E[11;2~, kf12=\E[12;2~, kf13=\E[13;2~, + kf14=\E[14;2~, kf15=\E[15;2~, kf16=\E[17;2~, + kf17=\E[18;2~, kf18=\E[19;2~, kf19=\E[20;2~, kf2=\E[12~, + kf20=\E[21;2~, kf21=\E[11;5~, kf22=\E[12;5~, + kf23=\E[13;5~, kf24=\E[14;5~, kf25=\E[15;5~, + kf26=\E[17;5~, kf27=\E[18;5~, kf28=\E[19;5~, + kf29=\E[20;5~, kf3=\E[13~, kf30=\E[21;5~, kf31=\E[11;6~, + kf32=\E[12;6~, kf33=\E[13;6~, kf34=\E[14;6~, + kf35=\E[15;6~, kf36=\E[17;6~, kf37=\E[18;6~, + kf38=\E[19;6~, kf39=\E[20;6~, kf4=\E[14~, kf40=\E[21;6~, + kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + kich1=\E[@, knp=\E[U, kpp=\E[V, lf0@, lf1@, lf2@, lf3@, lf4@, lf5@, + use=minix-3.0, + +minix-3.0|minix console (v3.0), + use=ecma+color, use=minix-1.7, + +# See +# https://web.archive.org/web/20030914201935/http://www.minix-vmd.org/pub/Minix-vmd/1.7.0/wwwman/man4/console.4.html +# This matches the entry provided with minix 1.7.4, with bogus :ri: removed. +minix-1.7|minix console (v1.7), + am, xenl, xon@, + el1=\E[2K, is2=\E[0m, lf0=End, lf1=PgUp, lf2=PgDn, lf3=Num +, + lf4=Num -, lf5=Num 5, use=minix-1.5, +# Corrected Jan 14, 1997 by Vincent Broman +minix-old|minix-1.5|minix console (v1.5), + xon, NQ, + cols#80, it#8, lines#25, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[H\E[0J, cr=\r, + cub1=^H, cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + ed=\E[0J, el=\E[K, home=\E[H, ht=^I, ich=\E[%p1%d@, + ich1=\E[@, ind=\n, kf0=\E[Y, kf1=\E[V, kf2=\E[U, kf3=\E[T, + kf4=\E[S, kf5=\E[G, nel=\r\n, rev=\E[7m, ri=\EM, rmso=\E[0m, + rmul=\E[0m, sgr0=\E[0m, smso=\E[7m, smul=\E[4m, + use=ansi+arrows, use=ansi+idl, use=ansi+local, + +# The linewrap option can be specified by editing /usr/include/minix/config.h +# before recompiling the minix 1.5 kernel. +minix-old-am|minix console with linewrap, + am, use=minix-old, + +pc-minix|minix console on an Intel box, + use=klone+acs, use=minix-3.0, + +# According to the Coherent 2.3 manual, the PC console is similar +# to a z19. The differences seem to be (1) 25 lines, (2) no status +# line, (3) standout is broken, (4) ins/del line is broken, (5) +# has blinking and bold. +pc-coherent|pcz19|coherent|IBM PC console running Coherent, + am, mir, + cols#80, it#8, lines#25, + bel=^G, clear=\EE, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EN, + ed=\EJ, el=\EK, home=\EH, ht=^I, ind=\n, kbs=^H, khome=\EH, + ri=\EI, rmir=\EO, rmso=\Eq, sgr0=\Eq, smir=\E@, smso=\Ep, + use=vt52+arrows, + +# According to the Venix 1.1 manual, the PC console is similar +# to a DEC VT52. Differences seem to be (1) arrow keys send +# different strings, (2) enhanced standout, (3) added insert/delete line. +# Note in particular that it doesn't have automatic margins. +# There are other keys (f1-f10, kpp, knp, kcbt, kich1, kdch1) but they +# not described here because this derives from an old termcap entry. +pc-venix|venix|IBM PC console running Venix, + cols#80, it#8, lines#25, + bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, + ed=\EJ, el=\EK, ht=^I, il1=\EL, ind=\n, kbs=^H, kcub1=\EK, + kcud1=\EP, kcuf1=\EM, kcuu1=\EH, khome=\EG, ri=\EI, + +#### Miscellaneous microcomputer consoles +# +# If you know anything more about any of these, please tell me. +# + +# The MAI Basic Four computer was obsolete at the end of the 1980s. +# It may be used as a terminal by putting it in "line" mode as seen on +# one of the status lines. +# Initialization is similar to CIT80. will set ANSI mode for you. +# Hardware tabs set by at 8-spacing. Auto line wrap causes glitches so +# wrap mode is reset by . Using =\E[S caused errors so I +# used \ED instead. +# From: bf347@lafn.org (David Lawyer), 28 Jun 1997 +mai|basic4|MAI Basic Four in ANSI mode, + am, da, db, mir, msgr, + cols#82, it#8, lines#25, + bel=^G, blink=\E[5m, bold=\E[1m, clear=^]^_, cnorm=\E[?7h, + cr=\r, cub1=^H, cud1=\n, cuf1=^X, cup=\E[%i%p1%d;%p2%dH, + cuu1=^Z, cvvis=\E[?7l, dch1=\E[1P, dl1=\E[M, ed=^_, el=^^, + home=^], ht=^I, if=/usr/share/tabset/vt100, il1=\E[L, + ind=\ED, + is2=\E>\E[?1h\E[?7h\E[?5l\017\E(B\E[m\E[20l\E[1;24r\E[24;1H, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, + kf7=\EOV, kf8=\EOW, nel=\r\ED, rev=\E[7m, ri=\E[T, + rmir=\E[4l, rmso=\E[m, rmul=\E[m, sgr0=\E[m, smir=\E[4h, + smso=\E[7m, smul=\E[4m, use=ansi+csr, + +# basis from Peter Harrison, Computer Graphics Lab, San Francisco +# ucbvax!ucsfmis!harrison ...uucp / ucbvax!ucsfmis!harrison@BERKELEY ...ARPA +# +# On Sat, 7 Aug 1999, Torsten Jerzembeck wrote: +# The Basis 108 was a Apple II clone, manufactured by the "Basis +# Mikrocomputer GmbH" in Munster, Germany (the company still exists today, +# about 1,5 km from where I live, but doesn't build own computers any +# more). A Basis 108 featured a really heavy (cast aluminium?) case, was +# equipped with one or two 5.25" disk drives, had a monochrome and colour +# video output for a TV set or a dedicated monitor and several slots for +# Apple II cards. Basis 108 were quite popular at german schools before +# the advent of the IBM PC. They run, for example, the UCSD Pascal +# development system (which I used even in 1993 to program the steering +# and data recording for our school's experimental solar panel :), Apple DOS +# or CP/M. +# (basis: removed obsolete ":ma=^K^P^R^L^L :nl=5000*^J:" -- esr) +basis|BASIS108 computer with terminal translation table active, + clear=\E*$<300/>, cud1=\n$<5000/>, ed=\EY, el=\ET, kbs=^H, + rmso=\E), sgr0=\E), smso=\E(, use=adm3a, +# luna's BMC terminal emulator +luna|luna68k|LUNA68K Bitmap console, + cols#88, lines#46, use=ansi-mini, +megatek|pegasus workstation terminal emulator, + am, os, + cols#83, lines#60, +# The Xerox 820 was a Z80 micro with a snazzy XEROX PARC-derived +# interface (pre-Macintosh by several years) that went nowhere. +xerox820|x820|Xerox 820, + am, + cols#80, lines#24, + bel=^G, clear=\032$<1>, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=^Q, el=^X, + home=^^, ind=\n, + +#### Videotex and teletext +# + +# \E\:1} switch to te'le'informatique mode (ascii terminal/ISO 6429) +# \E[?3l 80 columns +# \E[?4l scrolling on +# \E[12h local echo off +# \Ec reset: G0 U.S. charset (to get #,@,{,},...), 80 cols, clear screen +# \E)0 G1 DEC set (line graphics) +# +# From: Igor Tamitegama , 18 Jan 1997 +m2-nam|minitel|minitel-2|minitel-2-nam|France Telecom Minitel 2 mode te'le'informatique, + OTbs, eslok, hs, xenl, + cols#80, it#8, lines#24, wsl#72, xmc#0, + acsc=aaffggjjkkllmmnnooqqssttuuvvwwxx, bel=^G, + blink=\E[5m, bold=\E[1m, civis=\E[<1h, cnorm=\E[<1l, cr=\r, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + flash=^G, fsl=\n, home=\E[H, ht=^I, ind=\n, ip=$<7/>, + is1=\E:1}\Ec\E[?4l\E[12h, is2=\Ec\E[12h\E)0, + is3=\E[?3l, kclr=\E[2J, kdch1=\E[P, kdl1=\E[M, kf0=\EOp, + kf1=\EOq, kf10=\EOp, kf2=\EOr, kf3=\EOs, kf4=\EOt, kf5=\EOu, + kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, kich1=\E[4h, + kil1=\E[4l, knp=\EOn, kpp=\EOR, ll=\E[24;80H, mc0=\E[i, + nel=\r\n, rev=\E[7m, ri=\EM, rmacs=^O, rmir=\E[4l, + rmso=\E[27m, rmul=\E[24m, rs1=\Ec\E[?4l\E[12h, + rs2=\Ec\E)0, sgr0=\E[m, smacs=^N, smir=\E[4h, smso=\E[7m, + smul=\E[4m, tsl=^_@A, use=ansi+arrows, use=ansi+cpr, + use=ansi+csr, use=ansi+erase, use=ansi+idl, + use=ansi+local, + +# From: Alexandre Montaron , 18 Jun 1998, updated 19 Sep 2016 +# +minitel1|minitel 1, + am, bw, eslok, hs, hz, .msgr, G0, + colors#8, cols#40, lines#24, pairs#8, .ncv#16, + acsc=j+k+l+m+n+o~q`s_t+u+v+w+x|, bel=^G, blink=\EH, + civis=^T, clear=^L, cnorm=^Q, cr=\r, cub1=^H, cud1=\n, cuf1=^I, + cup=\037%p1%'A'%+%c%p2%'A'%+%c, cuu1=^K, + dsl=\037@A\030\n, el=^X, + flash=\037@A\EW \177\022\177\022P\r\030\n, fsl=\n, + home=^^, ind=\n, is2=\E;`ZQ\E:iC\E:iE\021, kbs=^SG, + kcan=^SE, kend=^SI, kent=^SA, khlp=^SD, knp=^SH, kpp=^SB, + krfr=^SC, nel=\r\n, op=\EG, rep=%p1%c\022%p2%'?'%+%c, + rev=\E], ri=^K, rmso=\E\\, + rs2=\024\037XA\030\n\030\n\030\n\030\n\030\n\030\n\030\n + \030\n\030\n\030\n\030\n\030\n\030\n\030\n\030\n\030\n + \030\n\030\n\030\n\030\n\030\n\030\n\030\n\030\014 + \021, + setab=\0, setaf=\E%p1%'@'%+%c, setb=\0, + setf=\E%?%p1%{1}%=%tD%e%p1%{3}%=%tF%e%p1%{4}%=%tA%e%p1%{6}%= + %tC%e%p1%'@'%+%c%;, + sgr=%?%p1%t\E]%;%?%p3%t\E]%;%?%p4%t\EH%;, + sgr0=\EI\E\\\EG, smso=\E], tsl=\037@%p1%'A'%+%c, + u6=\037%c%'A'%-%c%'A'%-, u7=\Ea, + u8=\001%[BCDEFGHIJKLbcresdfg0123456789]\004, u9=\E9{, + .dim=\EB, .hup=\E9g, .rs2=^L, .u8=^ABr4^D, + C0=`>a9f!j%k4l\,\277?\,\300AA\, + \301BA\,\302CA\,\303DA\,\304HA\,\305JA\,\306a\,\307KC\, + \310AE\,\311BE\,\312CE\,\313HE\,\314AI\,\315BI\,\316CI\, + \317HI\,\320b\,\321DN\,\322AO\,\323BO\,\324CO\,\325DO\, + \326HO\,\3274\,\330i\,\331AU\,\332BU\,\333CU\,\334HU\, + \335BY\,\336l\,\337{\,\340Aa\,\341Ba\,\342Ca\,\343Da\, + \344Ha\,\345Ja\,\346q\,\347Kc\,\350Ae\,\351Be\,\352Ce\, + \353He\,\354Ai\,\355Bi\,\356Ci\,\357Hi\,\360r\,\361Dn\, + \362Ao\,\363Bo\,\364Co\,\365Do\,\366Ho\,\3678\,\370y\, + \371Au\,\372Bu\,\373Cu\,\374Hu\,\375By\,\376|\,\377Hy\, + \252c\,\,0\017\031%\016\,}#\,f0\,g1\,\\\,\\\,\,+.\,./\,0 + \177\,--, +minitel1b|minitel 1-bistandard (in 40cols mode), + mir, + cub1=^H, cud1=\n, cuf1=^I, cuu1=^K, dch=\E[%p1%dP, dch1=\E[P, + ed=\E[J, el1=\E[1K, is1=\E;iYA\E;jYC, kbs@, kcan@, + kclr=\E[2J, kctab=^I, kdch1=\E[P, kdl1=\E[M, kent@, kf1=^SD, + kf10=^Y0, kf11=^Y1, kf12=^Y/, kf13=^Y{1, kf14=^Y{2, + kf15=^Y{3, kf16=^Y{4, kf17=^Y{5, kf18=^Y{6, kf19=^Y{7, + kf2=^SC, kf20=^Y{8, kf21=^Y{9, kf22=^Y{0, kf23=^Y{*, + kf24=^Y{#, kf3=^SF, kf4=^SA, kf5=^SG, kf6=^SE, kf7=^Y8, + kf8=^Y\,, kf9=^Y., khlp@, kich1=\E[4h, kil1=\E[L, krfr@, + lf1=Guide, lf2=Repetition, lf3=Sommaire, lf4=Envoi, + lf5=Correction, lf6=Annulation, rmir=\E[4l, smir=\E[4h, + u8=\001%[ABCPtuvwxyz0123456789:;<=>?]\004, + .ich=\E[%p1%d@, .ich1=\E[@, .kLFT=\E[P, .kRIT=\E[4h, + .kb2=^Y{g, .kcbt=^Y{i, .kel=^X, .mc0=\E:|k, .rmkx=\E;jYA, + .rs1=\E[4l\E[2l, .smkx=\E;iYA\E;jYC, .u8=^ACu<^D, + use=ansi+arrows, use=ansi+idl, use=ansi+local, + use=minitel1, + +# rmkx posait des problemes (logout en sortant de vi). +minitel1b-80|minitel 1-bistandard (standard teleinformatique), + am@, bw@, eslok@, hz@, msgr, + colors@, cols#80, it#8, pairs@, + acsc@, blink=\E[5m, bold=\E[1m, civis=\037@A\024\n, + clear=\E[H\E[J, cnorm=\037@A\021\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H, + ht=^I, ind=\ED, is1@, is2@, kbs=\EOl, kcan=\EOQ, kend=\E)4\r, + kent=\EOM, kf1=\EOq, kf10=\EOp, kf11=\EOP1, kf12=\EOP2, + kf13=\EOP3, kf14=\EOP4, kf15=\EOP5, kf16=\EOP6, kf17=\EOP7, + kf18=\EOP8, kf19=\EOP9, kf2=\EOr, kf20=\EOP0, kf21=\EOP*, + kf22=\EOP#, kf23@, kf24@, kf3=\EOs, kf4=\EOt, kf5=\EOu, + kf6=\EOv, kf7=\EOw, kf8=\EOx, kf9=\EOy, khlp=\EOm, knp=\EOn, + kpp=\EOR, krfr=\EOS, lf1@, lf2@, lf3@, lf4@, lf5@, lf6@, nel=\EE, + op@, rc=\E8, rep@, rev=\E[7m, ri=\EM, rmkx@, rmso=\E[27m, + rmul=\E[24m, + rs2=\036\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[ + H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M + \E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2 + M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[2M\E[H\E[L\E[12H\E[ + 2M\E[H\E[J\E[m, + sc=\E7, setab@, setaf@, setb@, setf@, sgr@, sgr0=\E[m, smkx@, + smso=\E[7m, smul=\E[4m, + tsl=\037@%?%p1%{63}%<%t%p1%'A'%+%c%e\177%p1%{62}%-%Pa%?%ga + %{1}%&%t\011%;%?%ga%{2}%&%t\011\011%;%?%ga%{4}%&%t\011 + \011\011\011%;%?%ga%{07}%>%t\011\011\011\011\011\011 + \011\011%;%?%ga%{15}%>%t\011\011\011\011\011\011\011 + \011%;%;, + u6@, u7@, u8@, u9@, .acsc=}#f[, .enacs=^O, .kb2=\EOPg, + .kcbt=\EOPi, .ll=\E[24H, .mc0=\E[i, .rmacs=^O, .rs2=\Ec, + .sgr=\E[%?%p1%t7;%;%?%p2%t4;%;%?%p3%t7;%;%?%p4%t5;%;%?%p6%t1 + ;%;m, + .smacs=^N, C0=}#f[j+k+l+m+n+o~q=s_t+u+v+w+x!0\032, + XC=B\016%\017\,\243#\,\247]\,\260[\,\340@\,\347\\\\\,\351{\, + \350}\,\371|\,\300A\,\301A\,\302A\,\303A\,\304A\,\305A\, + \306E\,\307C\,\310E\,\311E\,\312E\,\313E\,\314I\,\315I\, + \316I\,\317I\,\320D\,\321N\,\322O\,\323O\,\324O\,\325O\, + \326O\,\331U\,\332U\,\333U\,\334U\,\335Y\,\337s\,\341a\, + \342a\,\343a\,\344a\,\345a\,\346e\,\352e\,\353e\,\354i\, + \355i\,\356i\,\357i\,\360d\,\361n\,\362o\,\363o\,\364o\, + \365o\,\366o\,\372u\,\373u\,\374u\,\375y\,\377y\,\267.\, + \327x\,\367/\,\261\E7\E[4m+\E8\E[C\,\,0\017%\016\,x|\,y + \E7\E[4m<\E8\E[C\,z\E7\E[4m>\E8\E[C\,g\E7\E[4m+\E8\E[C, + use=minitel1b, + +minitel1-nb|minitel 1 (40cols) noir & blanc sans couleurs avec bold et dim ..., + colors@, pairs@, + bold=\EG, clear=^L\EB, + cup=\037%p1%'A'%+%c%p2%'A'%+%c\EB, dim=\ED, home=^^\EB, + op@, rs2=^L\EB, setab@, setaf@, setb@, setf@, + sgr=%?%p1%p3%O%t\E]%;%?%p4%t\EH%;%?%p5%t\ED%;%?%p6%t\EG%;, + sgr0=\EI\E\\\EB, tsl=\037@%p1%'A'%+%c\EB, .invis=\E@, + use=minitel1, + +minitel1b-nb|minitel 1b (40cols) noir & blanc sans couleurs avec bold et dim ..., + msgr, + colors@, pairs@, + acsc=`>a9f!j%k4l\E[?5l, + hpa=\E[%i%p1%d`, ht=^I, hts=\EH, ind=\n, + initc=\E]P%p1%{15}%&%X%p2%{255}%&%02X%p3%{255}%&%02X%p4 + %{255}%&%02X, + is2=\E]R\E]P3FFFF80\E[?8c, ka1=\EOw, ka3=\EOy, kb2=\E[G, + kbs=^?, kc1=\EOq, kc3=\EOs, kcbt=\E^I, kclr=\E\r, + kdl1=\E\E[A, kent=\EOM, kf1=\E[[A, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\E[[B, kf20=\E[34~, kf3=\E[[C, kf4=\E[[D, + kf5=\E[[E, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khome=\E[1~, kil1=\E\E[B, kmous=\E[M, nel=\EE, + oc=\E]R\E]P3FFFF80, op=\E[39;49m, rev=\E[7m, ri=\EM, + rmacs=^O, rmam=\E[?7l, rmir=\E[4l, rmpch=\E[10m, + rmso=\E[27m, rs1=\Ec, rs3=\E[37;40m\E[8], sgr0=\E[m, + smacs=^N, smam=\E[?7h, smir=\E[4h, smpch=\E[11m, + smso=\E[7m, tbc=\E[3g, vpa=\E[%i%p1%dd, .VN=\E[?5l, + .VR=\E[?5h, .am@, .ich=\E[%p1%d@, .ich1=\E[@, .ll=\E[99H, + .rmcup=, .rmul=\E[24m, .smcup=\E]R\E]P3FFFF80\E[?8c, + .smul=\E[4m, + E3=\E[99H\E[2J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n, + use=ansi+arrows, use=ansi+csr, use=ansi+cup, + use=ansi+erase, use=ansi+idl, use=ansi+local1, + use=klone+color, use=vt220+pcedit, use=vt220+cvis, + use=linux+decid, + +# 1. Using double-shapes for VT100 graphical chars (eg: mc). +# 2. Native brown color corrected to good yellow color. +# 3. Adding "Insert" and "Delete Line" keys as ESC Up and ESC Down arrow keys. +# 4. Suppressed nonexistent underlined mode (normally as bright). +# 5. ich/ich1 not filled because of non-curses programs. +#-- +# 6. Suppressed nonexistent invisible mode. +#(7.)Adding forgotten "cub/cud/cuf/cuu" sequences deplacement. + +linux-m1b|Linux Minitel 1B "like" Monochrome (Gris/Blanc/Noir+Dim), + ccc@, + colors@, ncv@, pairs@, + acsc@, bold=\E[33m, enacs@, initc@, + is2=\E]R\E]P1A9A9A9\E]P2A9A9A9\E]P3FFFFFF\E]P4A9A9A9\E]P5A9A + 9A9\E]P6A9A9A9\E]P9FFFFFF\E]PAFFFFFF\E]PBFFFFFF\E]PCFFFF + FF\E]PDFFFFFF\E]PEFFFFFF\E[?2c, + oc@, op@, rmacs@, setab=^A, setaf=^A, smacs@, .setab@, .setaf@, + .smcup=\E]R\E]P1A9A9A9\E]P2A9A9A9\E]P3FFFFFF\E]P4A9A9A9\E]P5 + A9A9A9\E]P6A9A9A9\E]P9FFFFFF\E]PAFFFFFF\E]PBFFFFFF\E] + PCFFFFFF\E]PDFFFFFF\E]PEFFFFFF\E[?2c, + use=linux-m1, + +linux-m2|Linux Minitel 2 "like" Couleurs (Vert/Blanc/Noir+Bleu), + ccc@, + colors@, ncv@, pairs@, + acsc=++\,\,--..00``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttu + uvvwwxxyyzz{{||}}~~, + bold=\E[33m, cnorm=\E[?2c\E[?25h, cvvis=\E[?8c\E[?25h, + enacs=\E)0, initc@, + is2=\E]R\E]P100A900\E]P200A900\E]P3FFFFFF\E]P400A900\E]P500A + 900\E]P600A900\E]P700A900\E]P80000FF\E]P9FFFFFF\E]PAFFFF + FF\E]PBFFFFFF\E]PCFFFFFF\E]PDFFFFFF\E]PEFFFFFF\E]PFFFFFF + F\E[;37m, + oc@, op@, setab=^A, setaf=^A, sgr0=\E[;37m, .setab@, .setaf@, + .smcup=\E]R\E]P100A900\E]P200A900\E]P3FFFFFF\E]P400A900\E]P5 + 00A900\E]P600A900\E]P700A900\E]P80000FF\E]P9FFFFFF\E] + PAFFFFFF\E]PBFFFFFF\E]PCFFFFFF\E]PDFFFFFF\E]PEFFFFFF + \E]PFFFFFFF\E[;37m, + use=linux-m1, + +# From: Alexandre Montaron, 27 May 2020 +linux-s|Linux console with added status line at bottom, + hs, + clear=\E[255;255H\E[A\E[1J\E[H, csr@, + dsl=\E7\E[255H\E[K\E8, ed@, fsl=\E8, + iprog=\sbash\s-c\s'echo\s-ne\s"\E[?6l\E[255H\E[A\E[6n"\s; + \sread\s-d\sR\sTMP\s;\sLINES=`echo\s$TMP\s|\scut\s-f1 + \s-d\s";"\s|\scut\s-f2\s-d\s"["`\s;\sstty\srows\s$LINE + S\s;\secho\s-ne\s"\E[;"$LINES"r\E[J"', + rs1=\E]R, tsl=\E7\E[255;%p1%dH, .rc@, .sc@, use=linux, + +# Screen entries counterpart : + +screen.linux-m1|Linux m1 specific for screen, + ncv@, + kclr=\E\r, kdl1=\E\E[A, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf20=\E[34~, kil1=\E\E[B, rmul@, smul@, + u8=\E[?1;2c, + E3=\E[99H\E[2J\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n + \n\n\n\n\n\n\n\n\n\n, + use=decid+cpr, use=xterm+x11mouse, use=screen, + +screen.linux-m1b|Linux m1b specific for screen, + colors@, pairs@, + op@, setab@, setaf@, setb@, setf@, use=screen.linux-m1, + +screen.linux-m2|Linux m2 specific for screen, + acsc=++\,\,--..00``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttu + uvvwwxxyyzz{{||}}~~, + use=screen.linux-m1b, + +# Putty : + +putty-m1|Putty Minitel 1 "like" Couleurs, + dim@, kf1=\E[11~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, + kf5=\E[15~, rmul=\E[24m, smul=\E[4m, .E3=\E[300S, + use=xterm+alt47, use=putty+screen, use=xterm+sl-twm, + use=ecma+index, use=linux-m1, + +putty-m1b|Putty Minitel 1B "like" Monochrome (Gris/Blanc/Noir), + dim@, kf1=\E[11~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, + kf5=\E[15~, rmul=\E[24m, smul=\E[4m, .E3=\E[300S, + use=xterm+alt47, use=putty+screen, use=xterm+sl-twm, + use=ecma+index, use=linux-m1b, + +putty-m2|Putty Minitel 2 "like" Couleurs (Vert/Blanc/Noir), + acsc=``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{ + {||}}~~, + dim@, kf1=\E[11~, kf2=\E[12~, kf3=\E[13~, kf4=\E[14~, + kf5=\E[15~, rmul=\E[24m, smul=\E[4m, .E3=\E[300S, + use=xterm+alt47, use=putty+screen, use=xterm+sl-twm, + use=ecma+index, use=linux-m2, + +putty+screen|PuTTY with screen resizing extensions (building-block), + .WS=\E[8;%p1%d;%p2%dt, Z0=\E[?3h, Z1=\E[?3l, + +putty-screen|PuTTY with screen resizing extensions, + WS=\E[8;%p1%d;%p2%dt, Z0=\E[?3h, Z1=\E[?3l, use=putty, + +screen.putty-m1|Putty m1 specific for screen, + dim@, rmul=\E[24m, smul=\E[4m, E3@, use=screen.linux-m1, + +screen.putty-m1b|Putty m1b specific for screen, + colors@, pairs@, + op@, setab@, setaf@, setb@, setf@, use=screen.putty-m1, + +screen.putty-m2|Putty m2 specific for screen, + acsc=++\,\,--..00``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttu + uvvwwxxyyzz{{||}}~~, + use=screen.putty-m1b, +# From: Alexandre Montaron, 19 Nov 2015, updated 19 Sep 2016 +# +# He comments: +# viewdata lacks a true cup capability, +# so I achieved it with home and cud1/cuf1 sequences only ! +viewdata|Prestel/Viewdata terminals, + am, bw, eslok, hz, + cols#40, lines#24, + bel=^G, civis=^T, clear=^L, cnorm=^Q, cr=\r, cub1=^H, cud1=\n, + cuf1=^I, + cup=\036%?%p1%{07}%>%t\n\n\n\n\n\n\n\n%;%?%p1%{15}%>%t\n\n + \n\n\n\n\n\n%;%?%p1%{4}%&%t\n\n\n\n%;%?%p1%{2}%&%t\n\n%; + %?%p1%{1}%&%t\n%;%?%p2%{07}%>%t\011\011\011\011\011\011 + \011\011%;%?%p2%{15}%>%t\011\011\011\011\011\011\011 + \011%;%?%p2%{23}%>%t\011\011\011\011\011\011\011\011%;%? + %p2%{31}%>%t\011\011\011\011\011\011\011\011%;%?%p2%{4} + %&%t\011\011\011\011%;%?%p2%{2}%&%t\011\011%;%?%p2%{1}%& + %t\011%;, + cuu1=^K, home=^^, nel=\r\n, rs2=^L, .el=^X, .ind=\n, + .rep=%p1%c\022%p2%'?'%+%c, .ri=^K, + +viewdata-o|optimized version of Viewdata Prestel/Viewdata terminals, + cup=\036%p1%?%p2%{20}%>%t%?%p1%{23}%=%t%Pa%{1}%e%{1}%+%;%; + %Pa%?%ga%{13}%<%t%?%ga%{07}%>%t\n\n\n\n\n\n\n\n%;%?%ga + %{4}%&%t\n\n\n\n%;%?%ga%{2}%&%t\n\n%;%?%ga%{1}%&%t\n%;%e + %{24}%ga%-%Pa%?%ga%{07}%>%t\013\013\013\013\013\013\013 + \013%;%?%ga%{4}%&%t\013\013\013\013%;%?%ga%{2}%&%t\013 + \013%;%?%ga%{1}%&%t\013%;%;%?%p2%{21}%<%t%?%p2%{07}%>%t + \011\011\011\011\011\011\011\011%;%?%p2%{15}%>%t\011 + \011\011\011\011\011\011\011%;%?%p2%{4}%&%t\011\011\011 + \011%;%?%p2%{2}%&%t\011\011%;%?%p2%{1}%&%t\011%;%e%{40} + %p2%-%Pa%?%ga%{07}%>%t\010\010\010\010\010\010\010\010%; + %?%ga%{15}%>%t\010\010\010\010\010\010\010\010%;%?%ga + %{4}%&%t\010\010\010\010%;%?%ga%{2}%&%t\010\010%;%?%ga + %{1}%&%t\010%;%?%p1%{23}%=%t\013%;%;, + .ll=^^^K, use=viewdata, + +# Samples with TERM=viewdata and TERM=viewdata-rv: http://canal.chez.com/blog/ + +viewdata-rv|Prestel/Viewdata terminals with reverse capabilitie (as green), + xmc#1, + rmso=\EG, smso=\EB, use=viewdata-o, + +######## OBSOLETE VDT TYPES +# +# These terminals are *long* dead -- these entries are retained for +# historical interest only. + +#### Amtek Business Machines +# + +# (abm80: early versions of this entry apparently had ":se=\E^_:so=\E^Y", +# but these caps were commented out in 8.3; also, removed overridden +# ":do=^J:" -- esr) +abm80|amtek business machines 80, + OTbs, am, bw, + cols#80, lines#24, + cbt=^T, clear=\E^\, cub1=^H, cud1=\E^K, cuf1=^P, + cup=\E\021%p2%{32}%+%c%p1%{32}%+%c, cuu1=\E^L, + dl1=\E^S, ed=\E^X, el=\E^O, home=\E^R, il1=\E^Z, + +#### Bell Labs blit terminals +# +# These were AT&T's official entries. The 5620 FAQ maintained by +# David Breneman has this to say: +# +# Actually, in the beginning was the Jerq, and the Jerq was white with a +# green face, and Locanthi and Pike looked upon the Jerq and said the Jerq +# was good. But lo, upon the horizon loomed a mighty management-type person +# (known now only by the initials VP) who said, the mighty Jerq must stay +# alone, and could not go forth into the world. So Locanthi and Pike put the +# Jerq to sleep, cloned its parts, and the Blit was brought forth unto the +# world. And the Jerq lived the rest of its days in research, but never +# strayed from those paths. +# +# In all seriousness, the Blit was originally known as the Jerq, but when +# it started to be shown outside of the halls of the Bell Labs Research +# organization, the management powers that be decided that the name could +# not remain. So it was renamed to be Blit. This was in late 1981. +# +# (The AT&T 5620 was the commercialized Blit. Its successors were the 630, +# 730, and 730+.) +# + +blit|jerq|blit running teletype rom, + am, eo, ul, xon, + cols#87, it#8, lines#72, + bel=^G, clear=^L, cr=\r, cub1=\ED, cud1=\n, cuf1=\EC, + cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, + dch=\Ee%p1%{32}%+%c, dch1=\Ee!, dl=\EE%p1%{32}%+%c, + dl1=\EE!, el=\EK, ht=^I, ich=\Ef%p1%{32}%+%c, ich1=\Ef!, + il=\EF%p1%{32}%+%c, il1=\EF!, ind=\n, kbs=^H, kf1=\Ex, + kf2=\Ey, kf3=\Ez, use=vt52+arrows, + +# (cbblit: here's a BSD termcap that says -- esr) +cbblit|fixterm|blit running columbus code, + cols#88, + ed=\EJ, flash=\E^G, ich1@, mc4=^T, mc5=^R, mc5p=\EP%p1%03d, + rmir=\ER, rmso=\EV!, rmul=\EV", smir=\EQ, smso=\EU!, + smul=\EU", use=blit, + +oblit|ojerq|first version of blit rom, + am, da, db, eo, mir, ul, xon, + cols#88, it#8, lines#72, + bel=^G, clear=^L, cr=\r, cub1=\ED, cud1=\n, cuf1=\EC, + cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, dch1=\EO, + dl=\Ee%p1%{32}%+%c, dl1=\EE, ed=\EJ, el=\EK, flash=\E^G, + ht=^I, il=\Ef%p1%{32}%+%c, il1=\EF, ind=\n, kbs=^H, rmir=\ER, + smir=\EQ, + +#### Bolt, Beranek & Newman (bbn) +# +# The BitGraph was a product of the now-defunct BBN Computer Corporation. +# The parent company, best known as the architects of the Internet, is +# still around. +# +# Jeff DelPapa writes: +# The bitgraph was a large white box that contained a monochrome bitmap +# display, and a 68000 to run it. You could download code and run it on +# the cpu, it had 128kb (I think) of memory. I used one in the late +# 70's, sure beat a VT100. It had one strange feature tho -- it used +# the cpu to bitblt pixels to scroll, it took longer than the refresh +# rate, and looked like a rubber sheet stretching, then snapping +# upwards. It had everything the early mac had, except a floppy drive a +# small screen (it had a 17" crisp beauty) and a real OS. They (Bolt +# Beranek and Neuman) sold at most a few hundred of them to the real +# world. DOD may have bought more... +# + +# Entries for the BitGraph terminals. The problem +# with scrolling in vi can only be fixed by getting BBN to put +# smarter scroll logic in the terminal or changing vi or padding +# scrolls with about 500 ms delay. +# +# I always thought the problem was related to the terminal +# counting newlines in its input buffer before scrolling and +# then moving the screen that much. Then vi comes along and +# paints lines in on the bottom line of the screen, so you get +# this big white gap. + +bitgraph|bg2.0nv|bg3.10nv|BBN BitGraph 2.0 or later (normal video), + flash=\E[?5h$<200/>\E[?5l, is2=\E>\E[?5l\E[?7h, + use=bg2.0, +bg2.0rv|bg3.10rv|BBn BitGraph 2.0 (reverse video), + flash=\E[?5l$<200/>\E[?5h, is2=\E>\E[?5h\E[?7h, + use=bg2.0, +bg2.0|bg3.10|BBN BitGraph 2.0 or later (no init), + OTbs, xenl, + cols#85, lines#64, + bel=^G, clear=\E[H\E[J$<150>, cr=\r, cub1=^H, + cup=%i\E[%p1%d;%p2%dH, dl1=\E[M$<2*>, ed=\E[J$<150>, + el=\E[K$<2>, ht=^I, il1=\E[L$<2*>, ind=\n$<280>, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, lf1=PF1, lf2=PF2, lf3=PF3, + lf4=PF4, rmkx=\E>, rmso=\E[m, sgr0=\E[m, smkx=\E=, + smso=\E[7m, use=ansi+csr, use=ansi+local1, + +bg1.25rv|BBN BitGraph 1.25 (reverse video), + flash=\E[?5l$<200/>\E[?5h, is2=\E>\E[?5h\E[?7h, + use=bg1.25, +bg1.25nv|BBN BitGraph 1.25 (normal video), + flash=\E[?5h$<200/>\E[?5l, is2=\E>\E[?5l\E[?7h, + use=bg1.25, +# (bg1.25: I added / based on the init string -- esr) +bg1.25|BBN BitGraph 1.25, + cols#85, lines#64, + bel=^G, clear=\E[H\E[J$<150>, cr=\r, cub1=^H, + cup=%i\E[%p1%d;%p2%dH, dl1=\E[M$<2*>, ed=\E[J$<150>, + el=\E[K$<2>, ht=^I, il1=\E[L$<2*>, ind=\n$<280>, kf1=\EP, + kf2=\EQ, kf3=\ER, kf4=\ES, lf1=PF1, lf2=PF2, lf3=PF3, lf4=PF4, + ll=\E[64;1H, rmam=\E[?7l, rmkx=\E>, rmso=\E[m, sgr0=\E[m, + smam=\E[?7h, smkx=\E=, smso=\E[7m, use=ansi+local1, + use=vt52+arrows, + +#### Bull (bq, dku, vip) +# +# (Adapted for terminfo; AIX extension capabilities translated -- esr) + +#============================================# +# BULL QUESTAR 210 `SDP' terminals emulation # +#============================================# +# +# Description written by R.K.Saunders (Bull Transac) +# +# Modifications written by F. Girard (Bull MTS) +# 19-05-87 V02.00.01 +# 17-12-87 V02.00.02 +# 15-09-89 V02.00.05 +# +# Typical technical selections F1 (modes SDP/ROLL): +# ------------------------------------------------------- +# | 01 02 03 04 05 06 07 08 09 10 | +# | 1010 0011 1010 0110 0110 0001 0100 0000 0000 0000 | +# | | +# | 11 12 13 14 15 16 17 18 19 20 | +# | 0000 0110 100? 0000 0000 0000 0001 0000 0000 0001 | +# | | +# | 21 22 23 24 25 26 27 28 29 30 | +# | 0011 0000 0001 1000 0000 0000 0000 0000 0000 0000 | +# | | +# | 31 32 33 34 35 36 37 38 39 40 | +# | 1010 0011 0000 0000 0000 0000 0000 0000 0000 0000 | +# ------------------------------------------------------- +# Typical firmware identification F5 "etat 6": +# P287.02.04b (AZERTY) +# P297.11.04 (24-pin: 2732) or P798.11.04 (28-pin: 2764) +# P298.03.03 (monochrome) or P374.03.02 (colour) +# +# SM SDP mode (VIP command): ^[[?=h +# RIS (erases screen): ^[c +# DMI disable keyboard: ^[` +# SM double rendition mode: ^[[?>h +# RM solicited status mode: ^[[5l +# RM character mode: ^[[>l +# RM echoplex mode: ^[[12l +# RM column tab mode: ^[[18l +# RM forbid SS2 keyboard mode: ^[[?h\EPY99:98\E\\, + is2=\E[5;>;12;18;?h\EPY99:98\E\\, + smir=\E[4h, smso=\E[0;7m, smul=\E[0;4m, + tsl=\EPY99:98\E\\\E[0;98v\E[2;7m, use=ansi+arrows, + use=ansi+erase, use=ansi+idl, use=ansi+inittabs, + use=ansi+local, use=ansi+sgrdim, + +tws2102-sna|dku7102-sna|Bull Questar tws2102 for SNA, + dsl=\E[0;98v\E[2J\E[v, fsl=\E[v, is3=\Eb, tsl=\E[0;98v, + use=tws-generic, +tws2103|xdku|Bull Questar tws2103, + ht=^I, use=tws-generic, +tws2103-sna|dku7103-sna|Bull Questar tws2103 for SNA, + ht=^I, use=tws2102-sna, +dku7102-old|Bull Questar 200 DKU7102 (microcode version < 6), + clear=\E[2J\E[H, cup@, dl@, dl1@, + dsl=\EPY99:98\E\\\E[0;98v\E[2J\E[H\E[v, el=\E[K\E[m, + il@, il1@, tsl=\EPY99:98\E\\\E[0;98v\E[H\E[2;7m, + use=tws-generic, +dku7202|Bull Questar 200 DKU7202 (colour/character attributes), + blink=\E[0;2;4m, dim=\E[0;5m, ht=^I, is3=\E[?3h\Eb, + sgr=\E[0%?%p1%t;2;4;5;7%;%?%p3%t;7%;%?%p2%t;2%;%?%p4%t;2;4%; + %?%p5%t;5%;%?%p7%t;8%;m%?%p9%t\016%e\017%;, + smso=\E[0;4;5;7m, smul=\E[0;2m, use=tws-generic, + +#=========================================================# +# BULL QUESTAR 303 & 310 `DEC VT 320' terminals emulation # +#=========================================================# +# +# Description written by J. Staerck (BULL SA) +# Copyright (c) 1989 BULL SA +#--------------------------------------------------------------------------- +# This entry is used for terminals with VT320 emulation mode +# and following set-up : +# 8 bit ISO Latin Character Set (ISO 8859-1), +# 7 bit Control Characters, +# 80 columns screen. +# Hereafter are some DEC vt terminals' commands. (valid on VT200 and 300) +# They are used in string capabilities with VT220-320 emulation mode. +# In the following DEC definitions, two kinds of terminfo databases are +# provided : +# 1. the first with Command Sequence Introducer starting with escape +# sequence in 7 bits characters ex. ESC [ : 2 chars. in 7-bit mode. +# 2. the second with Command Sequence Introducer starting with escape +# sequence in 8 bits characters ex. ESC [ : 1 char. 'CSI' =x9B. +# Soft Terminal Reset esc [ ! p +# RIS (erases screen): esc c +# DECKPNM numeric keypad mode: esc > +# DECKPAM applic. keypad mode: esc = +# DECSTBM Scrolling region: esc [ r +# SCS select G0 = US: esc ( B +# SCS select G1 = line-graphic: esc ) 0 +# Select 7-bit C1 controls: esc sp F +# Select 8-bit C1 controls: esc sp G +# Select cursor home: esc [ H +# Select erase screen: esc [ J +# SM KAM lock keyboard: esc [ 2 h +# RM KAM unlock keyboard: esc [ 2 l +# SM SRM local echo off: esc [ 1 2 h +# RM SRM local echo on: esc [ 1 2 l +# SM LNM New line : esc [ 2 0 h +# RM LNM return = CR only: esc [ 2 0 l +# SM DECCKM cursor keys mode: esc [ ? 1 h +# RM DECCKM appli. keys mode: esc [ ? 1 l +# SM DECANM ANSI mode on: esc [ ? 2 h +# RM DECANM ANSI mode off: esc [ ? 2 l +# SM DECCOLM 132-column screen: esc [ ? 3 h +# RM DECCOLM 80-column screen: esc [ ? 3 l +# SM DECSCLM Smooth scroll: esc [ ? 4 h +# RM DECSCLM Jump scroll: esc [ ? 4 l +# SM DECSCNM screen light backgr. esc [ ? 5 h +# RM DECSCNM screen dark backgr. esc [ ? 5 l +# SM DECOM move within margins: esc [ ? 6 h +# RM DECOM move outside margins: esc [ ? 6 l +# SM DECAWM auto right margin: esc [ ? 7 h +# RM DECAWM auto right margin: esc [ ? 7 l +# SM DECARM auto repeat: esc [ ? 8 h +# RM DECARM auto repeat: esc [ ? 8 l +# DECSASD Select active main: esc [ 0 $ } +# DECSASD Select active status: esc [ 1 $ } +# DECSSDT Select status none: esc [ 0 $ ~ +# DECSSDT Select status indic.: esc [ 1 $ ~ +# DECSSDT Select status host-wr: esc [ 2 $ ~ +# SM DECTCEM Visible cursor: esc [ ? 2 5 h +# RM DECTCEM Invisible cursor: esc [ ? 2 5 l +# SM DECNCRM 7 bits NCR set: esc [ ? 4 2 h +# RM DECNCRM Multi or ISO latin: esc [ ? 4 2 l +# SM DECNKM numeric keypad mode: esc [ ? 6 6 h +# RM DECNKM numeric keypad appl.: esc [ ? 6 6 l +# SM DECKBUM clavier informatique esc [ ? 6 8 h +# RM DECKBUM clavier bureautique: esc [ ? 6 8 l +# DECSCL VT300 mode 8-bit ctrl: esc [ 6 3 " p +# or DECSCL VT300 mode 8-bit ctrl: esc [ 6 3 ; 0 " p +# or DECSCL VT300 mode 8-bit ctrl: esc [ 6 3 ; 2 " p +# DECSCL VT300 mode 7-bit ctrl: esc [ 6 3 ; 1 " p +# Char. and Line attributes: esc [ Ps ... Ps m +# with: 0 All off, 1 Bold, 4 Underline, 5 Blinking, 7 Reverse +# and : 22 Bold off, 24 Underline off, 25 Blinking off, 27 Reverse off +# + +# This entry covers BQ303, BQ306, BQ310, Q303, Q306, Q310 +bq300|Bull VT320 ISO Latin 1 80 columns terminal, + eo, km, mir, xenl, xon, + vt#3, wsl#80, + blink=\E[5m, bold=\E[1m, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[P, dsl=\E[1$}\E[2$~\n\E[0$}, + ech=\E[%p1%dX, el1=\E[1K, flash=\E[?5h$<50>\E[?5l, + ich=\E[%p1%d@, ind=\ED, is1=\E[63;1"p\E[2h, + is2=\E[?2h\E[?3l\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + is3=\E[0$}\E[?25h\E[2l\E[H\E[J, ka1=\EOw, ka3=\EOy, + kb2=\EOu, kc1=\EOq, kc3=\EOs, kf1=\EOP, kf10=\E[21~, + kf11=\E[23~, kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, + kf15=\E[28~, kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, + kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR, kf4=\EOS, + kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, + khlp=\E[28~, krdo=\E[29~, lf1=pf1, lf2=pf2, lf3=pf3, lf4=pf4, + nel=\EE, rev=\E[7m, ri=\EM, rmacs=\E(B, rmam=\E[?7l, + rmcup=\E[?7h, rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[27m, + rmul=\E[24m, rs1=\E[!p, rs2=\E[?3l, s0ds=\E(B, s1ds=\E(0, + sgr=\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1 + %;m%?%p9%t\E(0%e\E(B%;, + sgr0=\E[0m\E(B, smacs=\E(0, smam=\E[?7h, + smcup=\E[?7l\E[?1l\E(B, smir=\E[4h, smso=\E[7m, + smul=\E[4m, tsl=\E[1$}\E[2$~, use=ansi+enq, use=ansi+csr, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ansi+pp, use=dec+sl, use=vt100+4bsd, use=vt220+cvis, + use=vt220+vtedit, + +bq300-rv|Bull VT320 reverse 80 columns, + flash=\E[?5l$<50>\E[?5h, + is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + use=bq300, +bq300-w|Bull VT320 132 columns, + cols#132, wsl#132, + is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + rs2=\E[?3h, use=bq300, +bq300-w-rv|Bull VT320 reverse mode 132 columns, + cols#132, wsl#132, + flash=\E[?5l$<50>\E[?5h, + is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + rs2=\E[?3h, use=bq300, + +# This entry is used for terminals with VT320 emulation mode +# and following set-up : +# 8 bit ISO Latin Character Set (ISO 8859-1), +# 8 bit Control Characters, (CSI coded as x9B for ESC [) +# 80 columns screen. +# Soft Terminal Reset csi ! p +# RIS (erases screen): esc c +# DECKPNM numeric keypad mode: esc > +# DECKPAM applic. keypad mode: esc = +# DECSTBM Scrolling region: esc [ r +# SCS select G0 = US: esc ( B +# SCS select G1 = line-graphic: esc ) 0 +# Select 7-bit C1 controls: esc sp F +# Select 8-bit C1 controls: esc sp G +# Select cursor home: csi H +# Select erase screen: csi J +# SM KAM lock keyboard: csi 2 h +# RM KAM unlock keyboard: csi 2 l +# SM SRM local echo off: csi 1 2 h +# RM SRM local echo on: csi 1 2 l +# SM LNM New line : csi 2 0 h +# RM LNM return = CR only: csi 2 0 l +# SM DECCKM cursor keys mode: csi ? 1 h +# RM DECCKM appli. keys mode: csi ? 1 l +# SM DECANM ANSI mode on: csi ? 2 h +# RM DECANM ANSI mode off: csi ? 2 l +# SM DECCOLM 132-column screen: csi ? 3 h +# RM DECCOLM 80-column screen: csi ? 3 l +# SM DECSCLM Smooth scroll: csi ? 4 h +# RM DECSCLM Jump scroll: csi ? 4 l +# SM DECSCNM screen light backgr. csi ? 5 h +# RM DECSCNM screen dark backgr. csi ? 5 l +# SM DECOM move within margins: csi ? 6 h +# RM DECOM move outside margins: csi ? 6 l +# SM DECAWM auto right margin: csi ? 7 h +# RM DECAWM auto right margin: csi ? 7 l +# SM DECARM auto repeat: csi ? 8 h +# RM DECARM auto repeat: csi ? 8 l +# DECSASD Select active main: csi 0 $ } +# DECSASD Select active status: csi 1 $ } +# DECSSDT Select status none: csi 0 $ ~ +# DECSSDT Select status indic.: csi 1 $ ~ +# DECSSDT Select status host-wr: csi 2 $ ~ +# SM DECTCEM Visible cursor: csi ? 2 5 h +# RM DECTCEM Invisible cursor: csi ? 2 5 l +# SM DECNCRM 7 bits NCR set: csi ? 4 2 h +# RM DECNCRM Multi or ISO latin: csi ? 4 2 l +# DECSCL VT300 mode 8-bit ctrl: csi 6 3 " p +# or DECSCL VT300 mode 8-bit ctrl: csi 6 3 ; 0 " p +# DECSCL VT300 mode 7-bit ctrl: csi 6 3 ; 1 " p +# Char. and Line attributes: csi Ps ... Ps m +# with: 0 All off, 1 Bold, 4 Underline, 5 Blinking, 7 Reverse +# and : 22 Bold off, 24 Underline off, 25 Blinking off, 27 Reverse off +# (bq300-8: ,,,,, to get under 1024 --esr) +bq300-8|Bull VT320 full 8 bits 80 columns, + eo, eslok, hs, km, mc5i, mir, xenl, xon, + vt#3, wsl#80, + blink=\2335m, bold=\2331m, clear=\233H\233J, + csr=\233%i%p1%d;%p2%dr, cub=\233%p1%dD, cub1=\2331D, + cud=\233%p1%dB, cud1=\2331B, cuf=\233%p1%dC, cuf1=\2331C, + cup=\233%i%p1%d;%p2%dH, cuu=\233%p1%dA, cuu1=\2331A, + dch=\233%p1%dP, dch1=\233P, dl=\233%p1%dM, dl1=\233M, + dsl=\2331$}\2332$~\n\2330$}, ech=\233%p1%dX, ed=\233J, + el=\233K, el1=\2331K, flash=\233?5h$<50>\233?5l, + fsl=\2330$}, home=\233H, ich=\233%p1%d@, il=\233%p1%dL, + il1=\233L, ind=\ED, is1=\E[63;2"p\E[2h, + is2=\E[?2h\E[?3l\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + is3=\2330$}\233?25h\2332l\233H\233J, ka1=\217w, + ka3=\217y, kb2=\217u, kc1=\217q, kc3=\217s, kcub1=\233D, + kcud1=\233B, kcuf1=\233C, kcuu1=\233A, kdch1=\2333~, + kf1=\217P, kf10=\23321~, kf11=\23323~, kf12=\23324~, + kf13=\23325~, kf14=\23326~, kf15=\23328~, kf16=\23329~, + kf17=\23331~, kf18=\23332~, kf19=\23333~, kf2=\217Q, + kf20=\23334~, kf3=\217R, kf4=\217S, kf6=\23317~, + kf7=\23318~, kf8=\23319~, kf9=\23320~, kfnd=\2331~, + khlp=\23328~, kich1=\2332~, knp=\2336~, kpp=\2335~, + krdo=\23329~, kslt=\2334~, lf1=pf1, lf2=pf2, lf3=pf3, + lf4=pf4, mc0=\233i, mc4=\2334i, mc5=\2335i, nel=\EE, rc=\E8, + rev=\2337m, ri=\EM, rmacs=\E(B, rmam=\233?7l, + rmcup=\233?7h, rmir=\2334l, rmkx=\233?1l\E>, + rmso=\23327m, rmul=\23324m, rs1=\E[!p, rs2=\E[?3l, + s0ds=\E(B, s1ds=\E(0, sc=\E7, + sgr=\233%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t; + 1%;m%?%p9%t\E(0%e\E(B%;, + sgr0=\2330m\E(B, smacs=\E(0, smam=\233?7h, + smcup=\233?7l\233?1l\E(B, smir=\2334h, smso=\2337m, + smul=\2334m, tbc=\2333g, tsl=\2331$}\2332$~, + use=vt100+4bsd, use=vt220+cvis8, +bq300-8rv|Bull VT320 8-bit reverse mode 80 columns, + flash=\233?5l$<50>\233?5h, + is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + use=bq300-8, +bq300-8w|Bull VT320 8-bit 132 columns, + cols#132, wsl#132, + is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + rs2=\233?3h, use=bq300-8, +bq300-w-8rv|Bull VT320 8-bit reverse mode 132 columns, + cols#132, wsl#132, + flash=\233?5l$<50>\233?5h, + is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + rs2=\233?3h, use=bq300-8, + +# This entry is used for terminals with VT320 emulation mode +# a 102 keys keyboard (PC scancode !) and following set-up : +# 8 bit ISO Latin Character Set (ISO 8859-1), +# 7 bit Control Characters, +# 80 columns screen. +bq300-pc|Questar 303 with PC keyboard ISO Latin 1 80 columns, + kbs=^H, kf1=\E[17~, kf10=\E[28~, kf11=\E[29~, kf12=\E[31~, + kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E[18~, kf20@, + kf3=\E[19~, kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, + kf8=\E[25~, kf9=\E[26~, kfnd@, khlp@, krdo@, kslt@, lf1@, lf2@, + lf3@, lf4@, use=vt220+pcedit, use=bq300, +bq300-pc-rv|Questar 303 with PC keyboard reverse mode 80 columns, + flash=\E[?5l$<50>\E[?5h, + is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + use=bq300-pc, +bq300-pc-w|Questar 303 with PC keyboard 132 columns terminal, + cols#132, wsl#132, + is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + rs2=\E[?3h, use=bq300-pc, +bq300-pc-w-rv|Questar 303 with PC keyboard reverse mode 132 columns, + cols#132, wsl#132, + flash=\E[?5l$<50>\E[?5h, + is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sF\E[?42l\E[?4 + l, + rs2=\E[?3h, use=bq300-pc, +# 8 bit ISO Latin Character Set (ISO 8859-1), +# 8 bit Control Characters, +# 80 columns screen. +bq300-8-pc|Q306-8-pc|Questar 303 with PC keyboard in full 8 bits 80 columns, + kend=\2334~, kf1=\23317~, kf10=\23328~, kf11=\23329~, + kf12=\23331~, kf13@, kf14@, kf15@, kf16@, kf17@, kf18@, kf19@, + kf2=\23318~, kf20@, kf3=\23319~, kf4=\23320~, kf5=\23321~, + kf6=\23323~, kf7=\23324~, kf8=\23325~, kf9=\23326~, kfnd@, + khlp@, khome=\2331~, krdo@, kslt@, lf1@, lf2@, lf3@, lf4@, + use=bq300-8, +bq300-8-pc-rv|Questar 303 with PC keyboard full 8 bits reverse mode 80 columns, + flash=\E[?5l$<50>\E[?5h, + is2=\E[?2h\E[?3l\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + use=bq300-8-pc, +bq300-8-pc-w|Questar 303 with PC keyboard full 8 bits 132 columns, + cols#132, wsl#132, + is2=\E[?2h\E[?3h\E[?5l\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + rs2=\E[?3h, use=bq300-8-pc, +bq300-8-pc-w-rv|Questar 303 with PC keyboard full 8 bits reverse 132 columns, + cols#132, wsl#132, + flash=\E[?5l$<50>\E[?5h, + is2=\E[?2h\E[?3h\E[?5h\E[?7h\E[?8h\E>\E[?1l\E\sG\E[?42l\E[?4 + l, + rs2=\E[?3h, use=bq300-8-pc, + +#======================================================# +# BULL QUESTAR 310 `VIP 7800/8800' terminals emulation # +#======================================================# + +# normal mode, 8 bits, 80 columns terminal. +# BLD bell disable ^[g +# BLE bell enable ^[h +# CAMR char. attr. mode reset ^[[G +# CAMS char. attr. mode set ^[[D +# CLR clear ^[` +# CM character mode (async.) ^[k +# EP echoplex mode (by host) ^[m +# IM insert mode set ^[[I +# IMR insert mode reset ^[[J +# KBL keyboard lock (reset) ^[[X +# KBU keyboard unlock (set) ^[[W +# LGR Line-graphic mode reset ^[F +# LGS Line-graphic mode set ^[G +# NEP non echoplex mode (by host) ^[l +# PDS print data space ^[[0p +# PDT print data terminator ^[[

u +# TBC tab clear (at cursor pos.) ^[[g +# TBI tab initialize ^[[N +# TBS tab set (at cursor pos.) ^[p +# +# ATR attribute (visual) +# blink : ^[sB +# dim : ^[sL +# hide (blank) : ^[sH +# inverse video : ^[sI +# protected : ^[sP +# reset : ^[sR +# underline : ^[s_ +# +# This covers the vip7800 and BQ3155-vip7800 +vip|Bull Questar 3155-7800, + am, eslok, hs, km, mc5i, msgr, xenl, xon, + vt#3, wsl#80, + acsc=0pjdkblamcnkqitgufvhwexj, blink=\EsB, clear=\E`, + cub1=^H, cud1=\n, cup=\E[%i%p1%03d%p2%03df, dch1=\E[P, + dim=\EsL, dl1=\E[M, dsl=\Ev, + flash=\007$<80>\007$<80>\007, fsl=\EO, hts=\Ep, + ich1=\E[I, invis=\EsH, + is2=\E[00u\E[<>001001024080024080u\E[01u, + is3=\Er\E[W\E`, kHOM=\EH, kLFT=\Eo, kRIT=\Eu, kcbt=\E[Z, + kclr=\E`, kctab=\E[g, kdch1=\E[P, kdl1=\E[M, ked=\EJ, + kel=\EK, kf1=\E0, kf10=\ET, kf11=\E\\, kf12=\E\^, kf13@, kf14@, + kf15@, kf16@, kf17@, kf18@, kf19@, kf2=\E2, kf20@, kf21=\E1, + kf22=\E5, kf23=\E7, kf24=\E9, kf25=\E;, kf26=\E=, kf27=\E?, + kf28=\EQ, kf29=\ES, kf3=\E6, kf30=\EV, kf31=\E], kf32=\E_, + kf4=\E8, kf5=\E:, kf6=\E<, kf7=\E>, kf8=\EP, kf9=\ER, + khome=\EH, khts=\Ep, kich1=\E[I, kil1=\E[L, kind=\E[0s, + kll=\EH\EA, kri=\E[1s, krmir=\E[J, ktbc=\E[N, lf1=pf1, + lf2=pf2, lf3=pf3, lf4=pf4, ll=\EH\EA, mc0=\E[0p, mc4=\E[, rmacs=\EF, rmir=\E[J, rmso=\EsR, + rmul=\EsR, rs1=\Ec, rs2=\E[G, s0ds=\EF, s1ds=\EG, + sgr0=\EsR\EsU\EF, smacs=\EG, smir=\E[I, smso=\EsI, + smul=\Es_, tbc=\E[N, tsl=\Ew, use=ansi+inittabs, + use=vt52-basic, +# normal screen, 8 bits, 132 columns terminal. +vip-w|vip7800-w|Q310-vip-w|Q310-vip-w-am|Questar 3155-vip7800 wide, + cols#132, wsl#132, + is2=\E[00u\E[<>001001024132024132u\E[01u, use=vip, +vip-H|vip7800-H|Q310-vip-H|Q310-vip-H-am|Questar 3155-vip7800 72 lines, + lines#72, + is2=\E[00u\E[<>001001024080072080u\E[01u, use=vip, +vip-Hw|vip7800-Hw|Q310-vip-Hw|Questar 3155-vip7800 wide 72 lines, + cols#132, lines#72, wsl#132, + is2=\E[00u\E[<>001001024132072132u\E[01u, use=vip, + +#### Chromatics +# + +# I have put the long strings in /. Ti sets up a window +# that is smaller than the screen, and puts up a warning message +# outside the window. Te erases the warning message, puts the +# window back to be the whole screen, and puts the cursor at just +# below the small window. I defined and to really turn +# the cursor on and off, but I have taken this out since I don't +# like the cursor being turned off when vi exits. +cg7900|chromatics|chromatics 7900, + am, + cols#80, lines#40, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^], + cup=\001M%p2%d\,%p1%d\,, cuu1=^K, dch1=^A<1, dl1=^A<2, + ed=^Al, el=^A`, home=^\, ich1=^A>1, il1=^A>2, ind=\n, ll=^A|, + rmcup=\001W0\,40\,85\,48\,\014\001W0\,0\,85\,48\,\001M0\,40 + \,, + rmso=\001C1\,\001c2\,, + smcup=\001P0\001O1\001R1\001C4\,\001c0\,\014\001M0\,42\,WARN + ING\sDOUBLE\sENTER\sESCAPE\sand\s\025\001C1\,\001c2\, + \001W0\,0\,79\,39\,, + smso=\001C4\,\001c7\,, uc=^A^A_^A\0, + +#### Computer Automation +# + +ca22851|Computer Automation 22851, + am, + cols#80, lines#24, + bel=^G, clear=\014$<8>, cr=\r, cub1=^U, cud1=\n, cuf1=^I, + cup=\002%i%p1%c%p2%c, cuu1=^V, ed=^\, el=^], home=^^, ind=\n, + kcub1=^U, kcud1=^W, kcuu1=^V, khome=^^, + +#### Cybernex +# + +# This entry has correct padding and the undocumented "ri" capability +cyb83|xl83|Cybernex xl-83, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\014$<62>, cr=\r, cub1=^H, cud1=\n, cuf1=^I, + cup=\027%p1%{32}%+%c%p2%{32}%+%c, cuu1=^N, + ed=\020$<62>, el=\017$<3>, home=^K, ind=\n, kcub1=^H, + kcud1=\n, kcuf1=^I, kcuu1=^N, ri=^N, +# (mdl110: removed obsolete ":ma=^Z^P:" and overridden ":cd=145^NA^W:" -- esr) +cyb110|mdl110|Cybernex mdl-110, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=\030$<70>, cr=\r, cub1=^H, cud1=\n, cuf1=^U, + cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^Z, + dch1=\016A\036$<3.5>, dl1=\016A\016\036$<40>, + ed=\016@\026$<6>, el=\016@\026$<145>, home=^Y, + ht=\011$<43>, ich1=\016A\035$<3.5>, + il1=\016A\016\035$<65>, ind=\n, rmso=^NG, smso=^NF, + +#### Datapoint +# +# Datapoint is gone. They used to be headquartered in Texas. +# They created ARCnet, an Ethernet competitor that flourished for a while +# in the early 1980s before 3COM got wise and cut its prices. The service +# side of Datapoint still lives (1995) in the form of Intelogic Trace. +# + +dp3360|datapoint|Datapoint 3360, + OTbs, am, + cols#82, lines#25, + bel=^G, clear=^]^_, cr=\r, cub1=^H, cud1=\n, cuf1=^X, cuu1=^Z, + ed=^_, el=^^, home=^], ind=\n, + +# From: Jan Willem Stumpel , 11 May 1997 +# The Datapoint 8242 Workstation was sold at least between 1985 +# and 1989. To make the terminal work with this entry, press +# CONTROL-INT-INT to take the terminal off-line, and type (opt). +# Set the options AUTO ROLL, ROLL DN, and ESC KBD on, and AUTO +# CR/LF off. Use control-shift-[] as escape key, control-I as tab, +# shift-F1 to shift-F5 as F6 to F10 (unshifted F1 to F5 are in +# fact unusable because the strings sent by the terminal conflict +# with other keys). +# The terminal is capable of displaying "box draw" characters. +# For each graphic character you must send 2 ESC's (\E\E) followed +# by a control character as follows: +# character meaning +# ========= ======= +# ctrl-E top tee +# ctrl-F right tee +# ctrl-G bottom tee +# ctrl-H left tee +# ctrl-I cross +# ctrl-J top left corner +# ctrl-K top right corner +# ctrl-L bottom left corner +# ctrl-M bottom right corner +# ctrl-N horizontal line +# ctrl-O vertical line +# Unfortunately this cannot be fitted into the termcap/terminfo +# description scheme. +dp8242|Datapoint 8242, + msgr, + cols#80, lines#25, + bel=^G, civis=^Y, clear=^U\E^D^W^X, cnorm=^X, cr=\r, cub1=^H, + cud1=\n, cup=\011%p2%'\0'%+%c%p1%'\0'%+%c, dl1=\E^Z, + ed=^W, el=^V, home=^U, ht=^I, il1=\E^T, ind=^C, + is1=\E\014\E\016\0\230\0\317\025\027\030\E\004, + kbs=^H, kcub1=^D, kcud1=^B, kcuf1=^F, kcuu1=^E, kf1=^G\Ee, + kf10=\EK\Ea, kf2=^I\Ed, kf3=\n\Ec, kf4=\n\Eb, kf5=^S\Ea, + kf6=\EO\Ee, kf7=\EN\Ed, kf8=\EM\Ec, kf9=\EL\Eb, nel=\r\n, + rep=\E\023%p1%c%p2%c, ri=^K, rmso=\E^D, rmul=\E^D, + rs1=\E\014\E\016\0\230\0\317\025\027\030\E\004, + smso=\E^E, smul=\E^F, + wind=\E\014\E\016%p1%'\0'%+%c%p2%'\0'%+%c%p3%'\0'%+%c%p4%' + \0'%+%c\025, + +#### DEC terminals (Obsolete types: DECwriter and VT40/42/50) +# +# These entries came from DEC's official terminfos for its older terminals +# (which happen to be identical to the AT&T/SCO terminal descriptions), +# Bill Hedberg of Terminal Support Engineering +# may have had more information. Updated terminfos and termcaps were available +# at ftp://gatekeeper.dec.com/pub/DEC/termcaps. + +# DEC's terminfos did not describe the auxiliary keypad. +# +# DECScope of course had no "function keys", but this building block assigns +# the three blank keys at the top of the auxiliary (numeric) keypad, using +# the same analogy as VT100 (also lacking function-keys). +# +# These assignments use the same layout for 0-9 as VT100+keypad; the VT52 +# keypad had its cursor-keys on the right-column as shown -TD +# _______________________________________ +# | PF1 | PF2 | PF3 | c-up | +# | \EP | \EQ | \ER | \EA | +# |_kf1__k1_|_kf2__k2_|_kf3__k3_|kcuu1_k4_| +# | 7 8 9 c-down | +# | \E?w | \E?x | \E?y | \EB | +# |_kf9__k9_|_kf10_k;_|_kf0__k0_|kcud1____| +# | 4 | 5 | 6 | c-right | +# | \E?t | \E?u | \E?v | \EC | +# |_kf5__k5_|_kf6__k6_|_kf7__k7_|kcuf1_k8_| +# | 1 | 2 | 3 | c-left | +# | \E?q | \E?r | \E?s | \ED | +# |_ka1__K1_|_kb2__K2_|_ka3__K3_|kcub1____| +# | 0 | . | enter | +# | \E?p | \E?n | \E?M | +# |___kc1_______K4____|_kc3__K5_|_kent_@8_| +# +vt52+keypad|DECScope auxiliary keypad, + ka1=\E?q, ka3=\E?s, kb2=\E?r, kc1=\E?p, kc3=\E?n, kf0=\E?y, + kf1=\EP, kf2=\EQ, kf3=\ER, kf5=\E?t, kf6=\E?u, kf7=\E?v, + kf8=\E?w, kf9=\E?x, + +gt40|DEC gt40, + OTbs, os, + cols#72, lines#30, + bel=^G, cr=\r, cub1=^H, cud1=\n, +gt42|DEC gt42, + OTbs, os, + cols#72, lines#40, + bel=^G, cr=\r, cub1=^H, cud1=\n, + +vt50|DEC VT50, + OTbs, + cols#80, lines#12, + bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cuu1=\EA, ed=\EJ, el=\EK, ht=^I, ind=\n, u8=\E/A, u9=\EZ, +vt50h|DEC VT50h, + cub1=\ED, cud1=\EB, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + u8=\E/[HJ], use=vt52+keypad, use=vt50, use=vt52+arrows, + +# (vt61: there's a BSD termcap that claims , ) +vt61|vt-61|vt61.5|DEC VT61, + cols#80, lines#24, + bel=^G, clear=\EH\EJ$<120>, cr=\r$<20>, cub1=^H, cud1=\n, + cuf1=\EC$<20>, cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<20>, + cuu1=\EA$<20>, ed=\EJ$<120>, el=\EK$<70>, ht=^I, + ind=\n$<20>, ri=\E$<20>I, use=vt52+arrows, + +# The gigi does standout with red! +# (gigi: I added / based on the init string, corrected cub1 -- esr) +gigi|vk100|DEC gigi graphics terminal, + OTbs, am, xenl, + cols#84, lines#24, + bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, ed=\E[J, el=\E[K, ht=^I, ind=\n, + is2=\E>\E[?3l\E[?4l\E[?5l\E[?20l\E[?7h\E[?8h, + kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kf1=\EOP, + kf2=\EOQ, kf3=\EOR, kf4=\EOS, khome=\E[H, ri=\EM, + rmam=\E[?7l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7;31m, + smul=\E[4m, use=ansi+local, + +# DEC PRO-350 console (VT220-style). The 350 was DEC's attempt to produce +# a PC differentiated from the IBM clones. It was a total, ludicrous, +# grossly-overpriced failure (among other things, DEC's OS didn't include +# a format program, so you had to buy pre-formatted floppies from DEC at +# a hefty premium!). +pro350|decpro|DEC pro console, + OTbs, + cols#80, it#8, lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + clear=\EH\EJ, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\EJ, + el=\EK, home=\EH, ht=^I, kf0=\EE, kf1=\EF, kf2=\EG, kf3=\EH, + kf4=\EI, kf5=\EJ, kf6=\Ei, kf7=\Ej, khome=\EH, ri=\EI, + rmacs=\EG, rmso=\E^N, rmul=\E^C, smacs=\EF, smso=\E^H, + smul=\E^D, use=vt52+arrows, + +dw1|DECwriter I, + OTbs, hc, os, + cols#72, + bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, +dw2|decwriter|dw|DECwriter II, + OTbs, hc, os, + cols#132, + bel=^G, cr=\r, cub1=^H, cud1=\n, ind=\n, kbs=^H, +# \E(B Use U.S. character set (otherwise # => british pound !) +# \E[20l Disable "linefeed newline" mode (else puts \r after \n,\f,\v) +# \E[w 10 char/in pitch +# \E[1;132 full width horizontal margins +# \E[2g clear all tab stops +# \E[z 6 lines/in +# \E[66t 66 lines/page (for \f) +# \E[1;66r full vertical page can be printed +# \E[4g clear vertical tab stops +# \E> disable alternate keypad mode (so it transmits numbers!) +# \E[%i%p1%du set tab stop at column %d (origin == 1) +# (Full syntax is \E[n;n;n;n;n;...;nu where each 'n' is +# a tab stop) +# +# The dw3 does standout with wide characters. +# +dw3|la120|DECwriter III, + OTbs, hc, os, + cols#132, + bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, + is1=\E(B\E[20l\E[w\E[0;132s\E[2g\E[z\E[66t\E[1;66r\E[4g\E>, + is2=\E[9;17;25;33;41;49;57;65;73;81;89;97;105;113;121;129u + \r, + kbs=^H, rmso=\E[w, sgr0=\E[w, smso=\E[6w, +dw4|DECwriter IV, + OTbs, am, hc, os, + cols#132, + bel=^G, cr=\r, cub1=^H, cud1=\n, ht=^I, ind=\n, is2=\Ec, kbs=^H, + kf0=\EOP, kf1=\EOQ, kf2=\EOR, kf3=\EOS, + +# These aren't official +ln03|DEC ln03 laser printer, + hc, + cols#80, lines#66, + bel=^G, cr=\r, cud1=\n, hd=\EK, ht=^I, hu=\EL, ind=\n, nel=\r\n, + rmso=\E[22m, rmul=\E[24m, sgr0=\E[m, smso=\E[1m, + smul=\E[4m, +ln03-w|DEC ln03 laser printer 132 cols, + cols#132, + kbs=^H, kcub1=^H, kcud1=\n, use=ln03, + +#### Delta Data (dd) +# + +# Untested. The cup sequence is hairy enough that it probably needs work. +# The idea is ctrl(O), dd(row), dd(col), where dd(x) is x - 2*(x%16) + '9'. +# There are BSD-derived termcap entries floating around for this puppy +# that are *certainly* wrong. +delta|dd5000|delta data 5000, + OTbs, am, + cols#80, lines#27, + bel=^G, clear=^NR, cub1=^H, cud1=\n, cuf1=^Y, + cup=\017%p1%p1%{16}%m%{2}%*%-%{57}%+%c%p2%p2%{16}%m%{2}%*%- + %{57}%+%c, + cuu1=^Z, dch1=^NV, el=^NU, home=^NQ, ind=\n, + +#### Digital Data Research (ddr) +# + +# (ddr: I added / based on the init string -- esr) +ddr|rebus3180|ddr3180|Rebus/DDR 3180 VT100 emulator, + OTbs, am, xenl, + cols#80, it#8, lines#24, vt#3, + blink=\E[5m$<2/>, bold=\E[1m$<2/>, + clear=\E[H\E[2J$<50/>, cub1=^H, cud1=\n, cuf1=\E[C$<2/>, + cup=\E[%i%p1%d;%p2%dH$<5/>, cuu1=\E[A$<2/>, + ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, ht=^I, + ind=\ED$<5/>, is2=\E[1;24r\E[24;1H, kbs=^H, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, rev=\E[7m$<2/>, + rf=/usr/share/tabset/vt100, ri=\EM$<5/>, rmam=\E[7l, + rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m$<2/>, + rs1=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, + sgr0=\E[m$<2/>, smam=\E[7l, smkx=\E[?1h\E=, smso=\E[7m, + smul=\E[4m$<2/>, use=ansi+csr, + +#### Evans & Sutherland +# + +# Jon Leech tells us: +# The ps300 was the Evans & Sutherland Picture System 300, a high +# performance 3D vector graphics system with a bunch of specialized hardware. +# Approximate date of release was 1982 (early 80s, anyway), and it had several +# evolutions including (limited) color versions such as the PS330C. PS300s +# were effectively obsolete by the late 80s, replaced by raster graphics +# systems, although specialized applications like molecular modeling +# hung onto them for a while longer. AFAIK all E&S vector graphics systems +# are out of production, though of course E&S is very much alive (in 1996). +# (ps300: changed ":pt@:" to "it@" -- esr) +# +ps300|Picture System 300, + xt, + it@, + rmso@, rmul@, smso@, smul@, use=vt100+4bsd, + +#### General Electric (ge) +# + +terminet1200|terminet300|tn1200|tn300|terminet|GE terminet 1200, + OTbs, hc, os, + cols#120, + bel=^G, cr=\r, cud1=\n, ind=\n, + +#### Heathkit/Zenith +# + +# Here is a description of the H19 DIP switches: +# +# S401 +# 0-3 = baud rate as follows: +# +# 3 2 1 0 +# --- --- --- --- +# 0 0 1 1 300 baud +# 0 1 0 1 1200 baud +# 1 0 0 0 2400 baud +# 1 0 1 0 4800 baud +# 1 1 0 0 9600 baud +# 1 1 0 1 19.2K baud +# +# 4 = parity (0 = no parity) +# 5 = even parity (0 = odd parity) +# 6 = stick parity (0 = normal parity) +# 7 = full duplex (0 = half duplex) +# +# S402 +# 0 = block cursor (0 = underscore cursor) +# 1 = no key click (0 = keyclick) +# 2 = wrap at end of line (0 = no wrap) +# 3 = auto LF on CR (0 = no LF on CR) +# 4 = auto CR on LF (0 = no CR on LF) +# 5 = ANSI mode (0 = VT52 mode) +# 6 = keypad shifted (0 = keypad unshifted) +# 7 = 50Hz refresh (1 = 60Hz refresh) +# +# Factory Default settings are as follows: +# 7 6 5 4 3 2 1 0 +# S401 1 0 0 0 1 1 0 0 +# S402 0 0 0 0 0 0 0 0 +# (h19: I added / based on the init string; +# also added empty to suppress a tic warning -- esr) +h19-a|h19a|heath-ansi|heathkit-a|Heathkit h19 ANSI mode, + OTbs, am, mir, msgr, + cols#80, it#8, lines#24, + acsc=, bel=^G, clear=\E[2J, cnorm=\E[>4l, cr=\r, cub1=^H, + cud1=\E[1B, cuf1=\E[1C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[1A, cvvis=\E[>4h, dch1=\E[1P, dl1=\E[1M$<1*>, + ed=\E[J, el=\E[K, home=\E[H, ht=^I, il1=\E[1L$<1*>, ind=\n, + is2=\E<\E[>1;2;3;4;5;6;7;8;9l\E[m\E[11m\E[?7h, + kbs=^H, kcub1=\E[1D, kcud1=\E[1B, kcuf1=\E[1C, kcuu1=\E[1A, + kf1=\EOS, kf2=\EOT, kf3=\EOU, kf4=\EOV, kf5=\EOW, kf6=\EOP, + kf7=\EOQ, kf8=\EOR, khome=\E[H, lf6=blue, lf7=red, lf8=white, + ri=\EM, rmacs=\E[11m, rmam=\E[?7l, rmir=\E[4l, rmso=\E[m, + smacs=\E[10m, smam=\E[?7h, smir=\E[4h, smso=\E[7m, +h19-bs|Heathkit w/keypad shifted, + rmkx=\Eu, smkx=\Et, use=h19-b, +h19-us|h19us|h19-smul|Heathkit w/keypad shifted/underscore cursor, + rmkx=\Eu, smkx=\Et, use=h19-u, +# (h19: merged in from BSDI hp19-e entry>; +# also added empty to suppress a tic warning --esr) +# From: Tim Pierce , 23 Feb 1998 +# Tim tells us that: +# I have an old Zenith-19 terminal at home that still gets a lot of use. +# This terminal suffers from the same famous insert-mode padding lossage +# that has been acknowledged for the Z29 terminal. Emacs is nearly +# unusable on this box, since even a half-scroll up or down the window +# causes flaming terminal death. +# +# On the Z19, the only way I have found around this problem is to remove +# the :al: and :dl: entries entirely. No amount of extra padding will +# help (I have tried up to 20000). Removing and +# makes Emacs a little slower, but it remains in the land of the living. +# Big win. +h19|heath|h19-b|heathkit|heath-19|z19|zenith|Heathkit h19, + OTbs, am, eslok, hs, mir, msgr, + cols#80, it#8, lines#24, + acsc=+h.kaiggjdkclfmenbozqas{tvutvuwsx`~\^, bel=^G, + clear=\EE, cnorm=\Ey4, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, cvvis=\Ex4, + dch1=\EN, ed=\EJ, el=\EK, fsl=\Ek\Ey5, home=\EH, ht=^I, ind=\n, + ip=$<1.5/>, kbs=^H, kf1=\ES, kf2=\ET, kf3=\EU, kf4=\EV, + kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, khome=\EH, lf6=blue, + lf7=red, lf8=white, ri=\EI, rmacs=\EG, rmir=\EO, rmso=\Eq, + smacs=\EF, smir=\E@, smso=\Ep, + tsl=\Ej\Ex5\EY8%p1%{32}%+%c\Eo\Eo, use=vt52+arrows, +h19-u|Heathkit with underscore cursor, + cnorm@, cvvis@, use=h19-b, +h19-g|h19g|Heathkit w/block cursor, + cnorm=\Ex4, cvvis@, use=h19-b, +alto-h19|altoh19|altoheath|alto-heath|alto emulating Heathkit h19, + lines#60, + dl1=\EM, il1=\EL, use=h19, + +# The major problem with the Z29 is that it requires more padding than the Z19. +# +# The problem with declaring an H19 to be synonymous with a Z29 is that +# it needs more padding. It especially loses if a program attempts +# to put the Z29 into insert mode and insert text at 9600 baud. It +# even loses worse if the program attempts to insert tabs at 9600 +# baud. Adding padding to text that is inserted loses because in +# order to make the Z29 not die, one must add so much padding that +# whenever the program tries to use insert mode, the effective +# rate is about 110 baud. +# +# What program would want to put the terminal into insert mode +# and shove stuff at it at 9600 baud you ask? +# +# Emacs. Emacs seems to want to do the mathematically optimal +# thing in doing a redisplay rather than the practical thing. +# When it is about to output a line on top of a line that is +# already on the screen, instead of just killing to the end of +# the line and outputting the new line, it compares the old line +# and the new line and if there are any similarities, it +# constructs the new line by deleting the text on the old line +# on the terminal that is already there and then inserting new +# text into the line to transform it into the new line that is +# to be displayed. The Z29 does not react kindly to this. +# +# But don't cry for too long.... There is a solution. You can make +# a termcap entry for the Z29 that says the Z29 has no insert mode. +# Then Emacs cannot use it. "Oh, no, but now inserting into a +# line will be really slow", you say. Well there is a sort of a +# solution to that too. There is an insert character option on +# the Z29 that will insert one character. Unfortunately, it +# involves putting the terminal into ANSI mode, inserting the +# character, and changing it back to H19 mode. All this takes 12 +# characters. Pretty expensive to insert one character, but it +# works. Either Emacs doesn't try to use its inserting hack when +# it's only given an insert character ability or the Z29 doesn't +# require padding with this (the former is probably more likely, +# but I haven't checked it out). +# (z29: added empty to suppress a tic warning, merged in +# status line capabilities from BRL entry --esr) +z29|zenith29|z29b|Zenith z29b, + OTbs, OTpt, am, eslok, hs, mir, msgr, + OTkn#10, cols#80, lines#24, + OTbc=\ED, acsc=, bel=^G, cbt=\E-, clear=\EE$<14>, cnorm=\Ey4, + cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\E$<1>A, + cvvis=\Ex4, dch1=\EN$<0.1*>, dl1=\EM$<1/>, dsl=\Ey1, + ed=\EJ$<14>, el=\EK$<1>, fsl=\Ek\Ey5, home=\EH, ht=^I, + ich1=\E<\E[1@\E[?2h$<1>, il1=\EL$<1/>, ind=\n$<2>, + is2=\E<\E[?2h\Ev, kbs=^H, kf0=\E~, kf1=\ES, kf2=\ET, kf3=\EU, + kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, kf9=\E0I, + khome=\EH, lf0=home, ri=\EI$<2/>, rmacs=\EF, rmir=\EO, + rmso=\Eq, rmul=\Es0, smacs=\EG, smir=\E@, smso=\Ep, + smul=\Es8, tsl=\Ej\Ex5\Ex1\EY8%+ \Eo, use=vt52+arrows, +# z29 in ANSI mode. Assumes that the cursor is in the correct state, and that +# the world is stable. causes the terminal to be reset to the state +# indicated by the name. kc -> key click, nkc -> no key click, uc -> underscore +# cursor, bc -> block cursor. +# From: Mike Meyers +# (z29a: replaced nonexistent because +# looks VT100-compatible -- esr) +z29a|z29a-kc-bc|h29a-kc-bc|Heath/Zenith 29 in ANSI mode, + OTbs, OTpt, am, eslok, hs, mir, msgr, + OTkn#10, cols#80, it#8, lines#24, + OTbc=\ED, bel=^G, blink=\E[5m, bold=\E[2m, clear=\E[2J, + cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[1P, + dim=\E[2m, dsl=\E[>1l, ed=\E[J, el=\E[K, fsl=\E[u\E[>5l, + home=\E[H, ht=^I, hts=\EH, if=/usr/share/tabset/vt100, + ind=\ED, kclr=\E[J, ked=\E[J, kf0=\E[~, kf1=\EOS, kf2=\EOT, + kf3=\EOU, kf4=\EOV, kf5=\EOW, kf6=\EOP, kf7=\EOQ, kf8=\EOR, + kf9=\EOX, khome=\E[H, lf0=help, mc0=\E#7, nel=\r\ED, rc=\E[r, + rev=\E[7m, ri=\EM, rmcup=\E[?7h, rmso=\E[m, rmul=\E[m, + rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>4h\E[>1;2;3;5;6;7;8;9l\E[m + \E[11m, + sc=\E[s, sgr0=\E[m, smcup=\E[?7l, smso=\E[7;2m, smul=\E[4m, + tbc=\E[3g, tsl=\E[s\E[>5;1h\E[25;%i%dH\E[1K, + use=ansi+apparrows, use=ansi+idl, use=ansi+local, + +z29a-kc-uc|h29a-kc-uc|Zenith z29 ANSI mode with keyclick and underscore cursor, + rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>1;2;3;4;5;6;7;8;9l\E[m\E[11 + m, + use=z29a, +z29a-nkc-bc|h29a-nkc-bc|Zenith z29 ANSI mode with block cursor and no keyclick, + rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>2;4h\E[>1;3;5;6;7;8;9l\E[m + \E[11m, + use=z29a, +z29a-nkc-uc|h29a-nkc-uc|Zenith z29 ANSI mode with underscore cursor and no keyclick, + rs1=\E<\E[1;24r\E[24;1H\E[?7h\E[>2h\E[>1;3;4;5;6;7;8;9l\E[m + \E[11m, + use=z29a, +# From: Jeff Bartig 31 Mar 1995 +z39-a|z39a|zenith39-a|zenith39-ansi|Zenith 39 in ANSI mode, + am, eslok, hs, mir, msgr, xon, + cols#80, lines#24, + acsc=0a``aaffggjjkkllmmnnooqqssttuuvvwwxx~~, bel=^G, + blink=\E[5m, bold=\E[1m, cbt=\E[1Z, civis=\E[>5h, + clear=\E[2J\E[H, cnorm=\E[>5l, cr=\r, + csr=\E[%i%p1%d;%p2%dr, cub1=^H, cup=\E[%i%p1%d;%p2%dH, + dch=\E[%p1%dP, dch1=\E[1P, dim=\E[2m, dl=\E[%p1%dM, + dl1=\E[1M, dsl=\E[>1l, ed=\E[0J, el=\E[0K, el1=\E[1K, + fsl=\E[u, home=\E[H, il=\E[%p1%dL, il1=\E[1L, ind=\n, + is2=\E<\E[>1;3;5;6;7l\E[0m\E[2J, ka1=\EOw, ka3=\EOu, + kb2=\EOy, kc1=\EOq, kc3=\EOs, ked=\E[J, kf1=\EOS, kf2=\EOT, + kf3=\EOU, kf4=\EOV, kf5=\EOW, kf6=\EOP, kf7=\EOQ, kf8=\EOR, + kf9=\EOX, khlp=\E[~, ll=\E[24;1H, mc0=\E[?19h\E[i, rc=\E[u, + rev=\E[7m, rmacs=\E(B, rmir=\E[4l, rmkx=\E[>7l, rmso=\E[0m, + rmul=\E[0m, rs2=\E<\Ec\0, sc=\E[s, sgr0=\E[0m, smacs=\E(0, + smir=\E[4h, smkx=\E[>7h, smso=\E[7m, smul=\E[4m, + tsl=\E[s\E[>1h\E[25;%i%p1%dH, use=ansi+arrows, + use=ansi+local, use=ansi+pp, use=ansi+tabs, + +# From: Brad Brahms +z100|h100|z110|z-100|h-100|Heath/Zenith z-100 pc with color monitor, + cnorm=\Ey4\Em70, cvvis=\Ex4\Em71, use=z100bw, +# (z100bw: removed obsolete ":kn#10:", added empty -- esr) +z100bw|h100bw|z110bw|z-100bw|h-100bw|Heath/Zenith z-100 pc, + OTbs, OTpt, mir, msgr, + OTkn#10, cols#80, it#8, lines#24, + acsc=+h.kaiggjdkclfmenbozqas{tvutvuwsx`~\^, + clear=\EE$<5*/>, cnorm=\Ey4, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<1*/>, cuu1=\EA, + cvvis=\Ex4, dch1=\EN$<1*/>, dl1=\EM$<5*/>, ed=\EJ, el=\EK, + home=\EH, ht=^I, il1=\EL$<5*/>, kbs=^H, kf0=\EJ, kf1=\ES, + kf2=\ET, kf3=\EU, kf4=\EV, kf5=\EW, kf6=\EP, kf7=\EQ, kf8=\ER, + kf9=\EOI, khome=\EH, ri=\EI, rmacs=\EG, rmir=\EO, rmso=\Eq, + smacs=\EF, smir=\E@, smso=\Ep, use=vt52+arrows, +p19|h19-b with il1/dl1, + dl1=\EM$<2*/>, il1=\EL$<2*/>, use=h19-b, +# From: +# (ztx: removed duplicate :sr: -- esr) +ztx|ztx11|zt-1|htx11|ztx-1-a|Heath/Zenith ztx-10 or 11, + OTbs, am, eslok, hs, + cols#80, it#8, lines#24, + clear=\EE, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dl1=\EM, + dsl=\Ey1, ed=\EJ, el=\EK, fsl=\Ek\Ey5, home=\EH, ht=^I, + il1=\EL, is2=\Ej\EH\Eq\Ek\Ev\Ey1\Ey5\EG\Ey8\Ey9\Ey>, + kbs=^H, kf0=\ES, kf1=\EB, kf2=\EU, kf3=\EV, kf4=\EW, kf5=\EP, + kf6=\EQ, kf7=\ER, ri=\EI, rmso=\Eq, rmul=\Eq, smso=\Es5, + smul=\Es2, tsl=\Ej\Ex5\Ex1\EY8%+ \Eo, use=vt52+arrows, + +#### IMS International (ims) +# +# There was a company called IMS International located in Carson City, +# Nevada, that flourished from the mid-70s to mid-80s. They made S-100 +# bus/Z80 hardware and a line of terminals called Ultimas. +# + +# From: Erik Fair Sun Oct 27 07:21:05 1985 +ims950-b|bare ims950 no init string, + is2@, use=ims950, +# (ims950: removed obsolete ":ko@:" -- esr) +ims950|IMS TeleVideo 950 emulation, + xenl@, + flash@, kbs@, kcub1@, kcud1@, kcuf1@, kcuu1@, kf0@, kf1@, kf2@, kf3@, + kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, khome@, use=tvi950, +# (ims950-rv: removed obsolete ":ko@:" -- esr) +ims950-rv|IMS tvi950 rev video, + xenl@, + flash@, kbs@, kcub1@, kcud1@, kcuf1@, kcuu1@, kf0@, kf1@, kf2@, kf3@, + kf4@, kf5@, kf6@, kf7@, kf8@, kf9@, khome@, use=tvi950-rv, +ims-ansi|ultima2|ultimaII|IMS Ultima II, + OTbs, am, + cols#80, it#8, lines#24, + clear=\E[H\E[2J, cub1=^H, cud1=\ED, cuf1=\EC, + cup=\E[%i%p1%2d;%p2%2dH, cuu1=\EM, ed=\E[0J, el=\E[0K, + ht=^I, if=/usr/share/tabset/vt100, + is2=\E[m\E[>14l\E[?1;?5;20l\E>\E[1m\r, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, ri=\EM, + rmso=\E[m\E[1m, rmul=\E[m\E[1m, sgr0=\E[m, smso=\E[7m, + smul=\E[4m, + +#### Intertec Data Systems +# +# I think this company is long dead as of 1995. They made an early CP/M +# micro called the "Intertec Superbrain" that was moderately popular, +# then sank out of sight. +# + +superbrain|Intertec Superbrain, + OTbs, am, bw, + cols#80, lines#24, + OTbc=^U, bel=^G, clear=\014$<5*>, cr=\r, cub1=^H, cud1=\n, + cuf1=^F, cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<20>, cuu1=^K, + ed=\E~k<10*>, el=\E~K$<15>, ht=^I, ind=\n, kcub1=^U, + kcud1=\n, kcuf1=^F, kcuu1=^K, rmcup=^L, smcup=^L, +# (intertube: a Gould entry via BRL asserted smul=\E0@$<200/>, +# rmul=\E0A$<200/>; my guess is the highlight letter is bit-coded like an ADM, +# and the reverse is actually true. Try it. -- esr) +intertube|intertec|Intertec InterTube, + OTbs, am, + cols#80, lines#25, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^F, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<50>, cuu1=^Z, home=^A, + ind=\n, rmso=\E0@, smso=\E0P, +# The intertube 2 has the "full duplex" problem like the Tektronix 4025: if you +# are typing and a command comes in, the keystrokes you type get interspersed +# with the command and it messes up +intertube2|Intertec data systems InterTube 2, + OTbs, + cup=\016%p1%c\020%p2%{10}%/%{16}%*%p2%{10}%m%+%c, + el=\EK, hpa=\020%p1%{10}%/%{16}%*%p1%{10}%m%+%c, + ll=^K^X\r, vpa=\013%p1%c, use=intertube, + +#### Ithaca Intersystems +# +# This company made S100-bus personal computers long ago in the pre-IBM-PC +# past. They used to be reachable at: +# +# Ithaca Intersystems +# 1650 Hanshaw Road +# Ithaca, New York 14850 +# +# However, the outfit went bankrupt years ago. +# + +# The Graphos III was a color graphics terminal from Ithaca Intersystems. +# These entries were written (originally in termcap syntax) by Brian Yandell +# and Mike Meyer at the +# University of Wisconsin. + +# (graphos: removed obsolete and syntactically incorrect :kn=4:, +# removed and +# no such file & no -- esr) +graphos|graphos III, + am, mir, + cols#80, it#8, lines#24, + clear=\E[H\E[2J, cnorm=\Ez56;2;0;0z\Ez73z\Ez4;1;1z, + cr=\r, cub1=^H, cud=\E[%p1%dB, cup=\E[%i%p1%d;%p2%dH, + cvvis=\Ez4;2;1z\Ez56;2;80;24z, dch1=\E[P, ed=\E[J, + el=\E[K, home=\E[H, ht=^I, ind=\ED, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, nel=\r\ED, rc=\E8, ri=\EM, rmdc=\E[4l, + rmir=\E[4l, sc=\E7, sgr0=\E[m, smdc=\E[4h, smir=\E[4h, + use=ansi+arrows, use=ansi+idl, use=ansi+local, + use=ansi+sgrso, + +graphos-30|graphos III with 30 lines, + lines#30, + cvvis=\Ez4;2;1z\Ez56;2;80;30z, use=graphos, + +#### Modgraph +# +# These people used to be reachable at: +# +# Modgraph, Inc +# 1393 Main Street, +# Waltham, MA 02154 +# Vox: (617)-890-5796. +# +# However, if you call that number today you'll get an insurance company. +# I have mail from "Michael Berman, V.P. Sales, Modgraph" dated +# 26 Feb 1997 that says: +# +# Modgraph GX-1000, replaced by GX-2000. Both are out of production, have been +# for ~7 years. Modgraph still in business. Products are rugged laptop and +# portable PC's and specialized CRT and LCD monitors (rugged, rack-mount +# panel-mount etc). I can be emailed at sonfour@aol.com +# +# Peter D. Smith notes that his modgraph manual was +# dated 1984. According to the manual, it featured Tek 4010/4014 +# graphics and DEC VT100/VT52 + ADM-3A emulation with a VT220-style keyboard. +# + +modgraph|mod24|modgraph terminal emulating VT100, + xenl@, + cvvis=\E\^9;0s\E\^7;1s, + is2=\E\^9;0s\E\^7;1s\E[3g\E\^11;9s\E\^11;17s\E\^11;25s\E\^11 + ;33s\E\^11;41s\E\^11;49s\E\^11;57s\E\^11;65s\E\^11;73s + \E\^11;81s\E\^11;89s, + rf@, ri=\EM\E[K$<5/>, use=vt100+4bsd, +# The GX-1000 manual is dated 1984. This looks rather like a VT-52. +modgraph2|modgraph gx-1000 80x24 with keypad not enabled, + am, da, db, + cols#80, it#8, lines#24, + clear=\EH\EJ$<50/>, cub1=^H, cud1=\EB$<2/>, + cuf1=\EC$<2/>, cup=\EY%p1%{32}%+%c%p2%{32}%+%c$<5/>, + cuu1=\EA$<2/>, ed=\EJ$<50/>, el=\EK$<3/>, ht=^I, + is2=\E<\E\^5;2s\E\^7;1s\E[3g\E\^11;9s\E\^11;17s\E\^11;25s\E + \^11;33s\E\^11;41s\E\^11;49s\E\^11;57s\E\^11;65s\E\^11;7 + 3s\E\^11;81s\E\^11;89s\E\^12;0s\E\^14;2s\E\^15;9s\E\^25; + 1s\E\^9;1s\E\^27;1, + ri=\EI$<5/>, +# +# Modgraph from Nancy L. Cider +# BUG NOTE from Barbara E. Ringers : +# If we set TERM=vt100, and set the Modgraph screen to 24 lines, setting a +# mark and using delete-to-killbuffer work correctly. However, we would +# like normal mode of operation to be using a Modgraph with 48 line setting. +# If we set TERM=mod (which is a valid entry in termcap with 48 lines) +# the setting mark and delete-to-killbuffer results in the deletion of only +# the line the mark is set on. +# We've discovered that the delete-to-killbuffer works correctly +# with TERM=mod and screen set to 80x48 but it's not obvious. Only +# the first line disappears but a ctrl-l shows that it did work +# correctly. +modgraph48|mod|Modgraph w/48 lines, + OTbs, OTpt, am, xenl, + cols#80, it#8, lines#48, vt#3, + OTnl=\n, bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[;H\E[2J, + cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, + cuu1=\E[A, ed=\E[J, el=\E[K, + flash=\E[?5h\E[0q\E[1;2q\E[?5l\E[0q\E[4;3q, + home=\E[H, ht=^I, is2=\E<\E[1;48r\E[0q\E[3;4q\E=\E[?1h, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, rev=\E[7m, ri=\EM, + rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, rs1=\E=\E[0q\E>, + sgr0=\E[m, smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, + use=ansi+csr, + +#### Morrow Designs +# +# This was George Morrow's company. They started in the late 1970s making +# S100-bus machines. They used to be reachable at: +# +# Morrow +# 600 McCormick St. +# San Leandro, CA 94577 +# +# but they're long gone now (1995). +# + +# The mt70 terminal was shipped with the Morrow MD-3 microcomputer. +# Jeff's specimen was dated June 1984. +# From: Jeff Wieland 24 Feb 1995 +mt70|mt-70|Morrow MD-70; native Morrow mode, + am, mir, msgr, xon, + cols#80, it#8, lines#24, + acsc=+z\,{-x.yOi`|jGkFlEmDnHqJtLuKvNwMxI, bel=^G, + cbt=\EI, civis=\E"0, clear=^Z, cnorm=\E"2, cr=\r, cub1=^H, + cud1=\n, cuf1=^L, cup=\E=%p1%{32}%+%c%p2%{32}%+%c$<1>, + cuu1=^K, dch1=\EW, dim=\EG2, dl1=\ER, ed=\EY, el=\ET$<10>, + flash=\EK1$<200>\EK0, home=^^, ht=^I, ich1=\EQ, il1=\EE, + ind=\n, invis@, is1=\E"2\EG0\E], kbs=^H, kcbt=^A^Z\r, + kclr=^An\r, kcub1=^AL\r, kcud1=^AK\r, kcuf1=^AM\r, + kcuu1=^AJ\r, kdch1=^?, kf1=^A@\r, kf10=^AI\r, kf11=^A`\r, + kf12=^Aa\r, kf13=^Ab\r, kf14=^Ac\r, kf15=^Ad\r, kf16=^Ae\r, + kf17=^Af\r, kf18=^Ag\r, kf19=^Ah\r, kf2=^AA\r, kf20=^Ai\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khlp=^AO\r, khome=^AN\r, nel=^_, + rmacs=\E%%, rmcup=, smacs=\E$, smcup=\E"2\EG0\E], + smul=\EG1, tbc=\E0, use=adm+sgr, + +#### Motorola +# + +# Motorola EXORterm 155 from {decvax, ihnp4}!philabs!sbcs!megad!seth via BRL +# (Seth H Zirin) +ex155|Motorola Exorterm 155, + OTbs, am, bw, + OTkn#5, OTug#1, cols#80, lines#24, + cbt=\E[, clear=\EX, cub1=\ED, cud1=\EB, cuf1=\EC, + cup=\EE%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, ed=\ET, + el=\EU, home=\E@, ht=\EZ, kbs=^H, kcbt=\E[, kclr=\EX, kcub1=^H, + kcud1=\n, kcuf1=^L, kcuu1=^K, ked=\ET, kel=\EU, khome=\E@, + rmso=\Ec\ED, rmul=\Eg\ED, smso=\Eb\ED, smul=\Ef\ED, + +#### Omron +# +# This company is still around in 1995, manufacturing point-of-sale systems. + +omron|Omron 8025AG, + OTbs, am, da, db, + cols#80, lines#24, + bel=^G, clear=\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, cuu1=\EA, + cvvis=\EN, dch1=\EP, dl1=\EM, ed=\ER, el=\EK, home=\EH, + il1=\EL, ind=\ES, ri=\ET, rmso=\E4, smso=\Ef, + +#### Ramtek +# +# Ramtek was a vendor of high-end graphics terminals around 1979-1983; they +# were competition for things like the Tektronix 4025. +# + +# Ramtek 6221 from BRL, probably by Doug Gwyn +# The following SET-UP modes are assumed for normal operation: +# UNDERLINE_CURSOR ANSI_MODE AUTO_XON/XOFF_ON +# NEWLINE_OFF 80_COLUMNS +# Other SET-UP modes may be set for operator convenience or communication +# requirements; I recommend +# SMOOTH_SCROLL AUTO_REPEAT_ON 3_#_SHIFTED WRAP_AROUND_ON +# Hardware tabs are assumed to be every 8 columns; they can be set up by the +# "reset", "tset", or "tabs" utilities (use rt6221-w, 160 columns, for this). +# Note that the Control-E key is useless on this brain-damaged terminal. No +# delays are specified; use "stty ixon -ixany" to enable DC3/DC1 flow control! +rt6221|Ramtek 6221 80x24, + OTbs, OTpt, msgr, xon, + OTkn#4, cols#80, it#8, lines#24, vt#3, + acsc=, bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[>5l, + clear=\E[1;1H\E[J, cnorm=\E[>5h\E[>9h, cr=\r, cub1=^H, + cud1=^K, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, + cvvis=\E[>7h\E[>9l, ed=\E[J, el=\E[K, home=\E[1;1H, ht=^I, + hts=\EH, ind=\n, is2=\E)0, kbs=^H, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kf0=\EOP, kf1=\EOQ, kf2=\EOR, + kf3=\EOS, lf0=PF1, lf1=PF2, lf2=PF3, lf3=PF4, ll=\E[24;1H, + nel=\EE, rev=\E[7m, ri=\EM, rmacs=^O, rmkx=\E>, rmso=\E[m, + rmul=\E[m, + rs1=\E[1w\E[>37m\E[>39m\E[1v\E[20l\E[?3l\E[?6l\E[>5h\E[>6h + \E[>7h\E[>8l\E[>9h\E[>10l\E[1;24r\E[m\E[q\E(B\017\E)0\E# + 5\E>, + sgr0=\E[m, smacs=^N, smkx=\E=, smso=\E[7m, smul=\E[4m, + tbc=\E[3g, use=ansi+csr, use=ansi+local, + +# [TO DO: Check out: short forms of ho/cl and ll; reset (\Ec)]. +rt6221-w|Ramtek 6221 160x48, + cols#160, lines#48, + ll=\E[48;1H, use=rt6221, + +#### RCA +# + +# RCA VP3301 or VP3501 +rca|RCA vp3301/vp3501, + OTbs, + cols#40, lines#24, + clear=^L, cuf1=^U, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, home=^Z, rmso=\E\ES0, smso=\E\ES1, + + +#### Selanar +# + +# Selanar HiREZ-100 from BRL, probably by Doug Gwyn +# The following SET-UP modes are assumed for normal operation: +# SET_DEFAULT_TABS 48_LINES 80_COLUMNS +# ONLINE ANSI CURSOR_VISIBLE +# VT102_AUTO_WRAP_ON VT102_NEWLINE_OFF VT102_MONITOR_MODE_OFF +# LOCAL_ECHO_OFF US_CHAR_SET WPS_TERMINAL_DISABLED +# CPU_AUTO_XON/XOFF_ENABLED PRINT_FULL_SCREEN +# For use with graphics software, all graphics modes should be set to factory +# default. Other SET-UP modes may be set for operator convenience or +# communication requirements. No delays are specified; use "stty ixon -ixany" +# to enable DC3/DC1 flow control! +# I commented out the scrolling capabilities since they are too slow. +hirez100|Selanar HiREZ-100, + OTbs, OTpt, mir, msgr, xon, + OTkn#4, cols#80, it#8, lines#48, vt#3, + acsc=, bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub=\E[%p1%dD, + cub1=^H, cud1=\n, cup=\E[%i%p1%d;%p2%dH, cuu1=\EM, + dch=\E[%p1%dP, dch1=\E[P, home=\E[H, ht=^I, hts=\EH, + is2=\E<\E)0, kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, + kcuu1=\EOA, kf0=\EOP, kf1=\EOQ, kf2=\EOR, kf3=\EOS, lf0=PF1, + lf1=PF2, lf2=PF3, lf3=PF4, ll=\E[48H, mc0=\E[i, + mc4=\E[4i\E[?4i, mc5=\E[?5i\E[5i, nel=\EE, rc=\E8, + rev=\E[7m, rmacs=^O, rmkx=\E[?1l\E>, + rs1=\030\E2\E<\E[4i\E[?4i\E[12h\E[2;4;20l\E[?0;7h\E[?1;3;6;1 + 9l\E[r\E[m\E(B\017\E)0\E>, + sc=\E7, sgr0=\E[m, smacs=^N, smkx=\E[?1h\E=, tbc=\E[3g, + use=ansi+erase, use=ansi+idl, use=ansi+local, + use=ansi+sgrso, use=ansi+sgrul, + +hirez100-w|Selanar HiREZ-100 in 132-column mode, + cols#132, use=hirez100, + +#### Signetics +# + +# From University of Wisconsin +vsc|Signetics Vsc Video driver by RMC, + am, msgr, + cols#80, it#8, lines#26, + clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n, cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, el=\E[K, home=\E[H, + ht=^I, ind=\n, kbs=^H, kcub1=^H, kcud1=\n, nel=\r\n, rev=^_\s, + rmso=^_!, rmul=^_#, sgr0=^_!, smso=^_\s, smul=^_", + +#### Soroc +# +# Alan Frisbie writes: +# +# As you may recall, the Soroc logo consisted of their name, +# with the letter "S" superimposed over an odd design. This +# consisted of a circle with a slightly smaller 15 degree (approx.) +# wedge with rounded corners inside it. The color was sort of +# a metallic gold/yellow. +# +# If I had been more of a beer drinker it might have been obvious +# to me, but it took a clue from their service department to make +# me exclaim, "Of course!" The circular object was the top of +# a beer can (the old removable pop-top style) and "Soroc" was an +# anagram for "Coors". +# +# I can just imagine the founders of the company sitting around +# one evening, tossing back a few and trying to decide what to +# call their new company and what to use for a logo. +# + +# (soroc120: removed obsolete ":ma=^K^P^R^L^L :" -- esr) +soroc120|iq120|soroc|Soroc iq120, + clear=\E*$<2>, ed=\EY, el=\ET, use=adm3a, +soroc140|iq140|Soroc iq140, + OTbs, am, mir, + cols#80, lines#24, + bel=^G, cbt=\EI, clear=\E+, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\Ew, + dl1=\Er$<.7*>, ed=\Ey, el=\Et, home=^^, il1=\Ee$<1*>, ind=\n, + kbs=^H, kcuf1=^L, kcuu1=^K, kf0=^A0\r, kf1=^A@\r, kf2=^AA\r, + kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, kf7=^AF\r, + kf8=^AG\r, kf9=^AH\r, khome=^^, ll=^^^K, rmir=\E8, rmso=\E^?, + rmul=\E^A, smir=\E9, smso=\E^?, smul=\E^A, + +#### Southwest Technical Products +# +# These guys made an early personal micro called the M6800. +# The ct82 was probably its console terminal. +# + +# (swtp: removed obsolete ":bc=^D:" -- esr) +swtp|ct82|Southwest Technical Products ct82, + am, + cols#82, lines#20, + bel=^G, clear=^L, cr=\r, cub1=^D, cud1=\n, cuf1=^S, + cup=\013%p2%c%p1%c, cuu1=^A, dch1=^\^H, dl1=^Z, ed=^V, el=^F, + home=^P, ich1=^\^X, il1=^\^Y, ind=^N, + is2=\034\022\036\023\036\004\035\027\011\023\036\035\036 + \017\035\027\022\011, + ll=^C, ri=^O, rmso=^^^F, smso=^^^V, + +#### Synertek +# +# Bob Manson writes (28 Apr 1995): +# +# Synertek used to make ICs, various 6502-based single-board process +# control and hobbyist computers, and assorted peripherals including a +# series of small inexpensive terminals (I think they were one of the +# first to have a "terminal-on-a-keyboard", where the terminal itself +# was only slightly larger than the keyboard). +# +# They apparently had a KTM-1 model, which I've never seen. The KTM-2/40 +# was a 40x24 terminal that could connect to a standard TV through a +# video modulator. The KTM-2/80 was the 80-column version (the 2/40 +# could be upgraded to the 2/80 by adding 2 2114 SRAMs and a new ROM). +# I have a KTM-2/80 still in working order. The KTM-2s had fully +# socketed parts, used 2 6507s, a 6532 as keyboard scanner, a program +# ROM and 2 ROMs as character generators. They were incredibly simple, +# and I've never had any problems with mine (witness the fact that mine +# was made in 1981 and is still working great... I've blown the video +# output transistor a couple of times, but it's a 2N2222 :-) +# +# The KTM-3 (which is what is listed in the terminfo file) was their +# attempt at putting a KTM-2 in a box (and some models came with a +# CRT). It wasn't much different from the KTM-2 hardware-wise, but the +# control and escape sequences are very different. The KTM-3 was always +# real broken, at least according to the folks I've talked to about it. +# +# The padding in the entry is probably off--these terminals were very +# slow (it takes like 100ms for the KTM-2 to clear the screen...) And +# anyone with any sanity replaced the ROMs with something that provided +# a reasonable subset of VT100 functionality, since the usual ROMs were +# obviously very primitive... oh, you could get an upgraded ROM from +# Synertek for some incredible amount of money, but what hacker with an +# EPROM burner would do that? :) +# +# Sorry I don't have any contact info; I believe they were located in +# Sunnyvale, and I'm fairly sure they are still manufacturing ICs +# (they've gone to ASICs and FPGAs), but I doubt they're in the computer +# business these days. +# + +# Tested, seems to work fine with vi. +synertek|ktm|synertek380|Synertek KTM 3/80 tubeless terminal, + am, + cols#80, lines#24, + clear=^Z, cub1=^H, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EJ, el=\EK, + +#### Tab Office Products +# +# TAB Products Co. - Palo Alto, California +# Electronic Office Products, +# 1451 California Avenue 94304 +# +# I think they're out of business. +# + +# The tab 132 uses xon/xoff, so no padding needed. +# / have nothing to do with arrow keys. +# sets 80 col mode, normal video, autowrap on (for ). +# Seems to be no way to get rid of status line. +# The manual for this puppy was dated June 1981. It claims to be VT52- +# compatible but looks more VT100-like -esr +# +# According to +# https://ub.fnwi.uva.nl/computermuseum/tab13215g.html +# This monochrome graphics terminal of TAB Products, California, is a DEC +# VT52/VT100/VT132 compatible alphanumeric terminal (TAB 132/15), +# factory-fitted with additional hardware for Tektronix 4010 emulation. +# Also the terminal understands a selection of Tektronix 4027 commands. +tab132|tab|tab132-15|tab 132/15, + da, db, + OTdN@, lm#96, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, il1=\E[L, + is2=\E[?7h\E[?3l\E[?5l, rmir=\E[4l, rmkx@, smir=\E[4h, + smkx@, use=decid+cpr, use=vt100+4bsd, +tab132-w|tab132 in wide mode, + cols#132, + is2=\E[?7h\E[?3h\E[?5l, use=tab132, +tab132-rv|tab132 in reverse-video mode, + is2=\E[?7h\E[?3l\E[?5h, use=tab132, +tab132-w-rv|tab132 in reverse-video/wide mode, + is2=\E[?7h\E[?3h\E[?5h, use=tab132-w, + + +#### Teleray +# +# Research Incorporated +# 6425 Flying Cloud Drive +# Eden Prairie, MN 55344 +# Vox: (612)-941-3300 +# +# The Teleray terminals were all discontinued in 1992-93. RI still services +# and repairs these beasts, but no longer manufactures them. The Teleray +# people believe that all the types listed below are very rare now (1995). +# There was a newer line of Telerays (Model 7, Model 20, Model 30, and +# Model 100) that were ANSI-compatible. +# +# Note two things called "teleray". Reorder should move the common one +# to the front if you have either. A dumb Teleray with the cursor stuck +# on the bottom and no obvious model number is probably a 3700. +# + +t3700|dumb Teleray 3700, + OTbs, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, ind=\n, +t3800|Teleray 3800 series, + OTbs, + cols#80, it#8, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=\EJ, el=\EK, + home=\EH, ht=^I, ind=\n, ll=\EY7\s, +t1061|teleray|Teleray 1061, + OTbs, am, km, xhp, xt, + cols#80, it#8, lines#24, xmc#1, + bel=^G, clear=\014$<1>, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ, + dl1=\EM$<2*>, ed=\EJ$<1>, el=\EK, home=\EH, ht=^I, hts=\EF, + ich1=\EP, il1=\EL$<2*>, ind=\n, ip=$<0.4*>, + is2=\Ee\EU01^Z1\EV\EU02^Z2\EV\EU03^Z3\EV\EU04^Z4\EV\EU05^Z5 + \EV\EU06^Z6\EV\EU07^Z7\EV\EU08^Z8\EV\Ef, + kf1=^Z1, kf2=^Z2, kf3=^Z3, kf4=^Z4, kf5=^Z5, kf6=^Z6, kf7=^Z7, + kf8=^Z8, rmso=\ER@, rmul=\ER@, smso=\s\ERD, smul=\ERH, + tbc=\EG, +t1061f|Teleray 1061 with fast PROMs, + dl1=\EM, il1=\EL, ip@, use=t1061, +# "Teleray Arpa Special", officially designated as +# "Teleray Arpa network model 10" with "Special feature 720". +# This is the new (1981) fast microcode updating the older "arpa" proms +# (which gave meta-key and programmable-fxn keys). 720 is much much faster, +# converts the keypad to programmable function keys, and has other goodies. +# Standout mode is still broken (magic cookie, etc) so is suppressed as no +# programs handle such lossage properly. +# Note: this is NOT the old termcap's "t1061f with fast proms." +# From: J. Lepreau Tue Feb 1 06:39:37 1983, Univ of Utah +# (t10: removed overridden ":so@:se@:us@:ue@:" -- esr) +t10|Teleray 10 special, + OTbs, km, xhp, xt, + cols#80, it#8, lines#24, xmc#2, + clear=\Ej$<30/>, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\EQ, + dl1=\EM, ed=\EJ, el=\EK, home=\EH, ht=^I, ich1=\EP, il1=\EL, + ind=\Eq, pad=\0, ri=\Ep, rmso=\ER@, rmul=\ER@, smso=\ERD, + smul=\ERH, +# Teleray 16 - map the arrow keys for vi/rogue, shifted to up/down page, and +# back/forth words. Put the function keys (f1-f10) where they can be +# found, and turn off the other magic keys along the top row, except +# for line/local. Do the magic appropriate to make the page shifts work. +# Also toggle ^S/^Q for those of us who use Emacs. +t16|Teleray 16, + am, da, db, mir, xhp, xt, + cols#80, lines#24, + bel=^G, clear=\E[H\E[2J, cr=\r, cub1=^H, + cup=%i\E[%p1%d;%p2%df, dch1=\E[P, dl1=\E[M, ed=\E[0J, + el=\E[0K, home=\E[H, ht=^I, il1=\E[L, ind=\n, kf1=^Z1, + kf10=^Z0, kf2=^Z2, kf3=^Z3, kf4=^Z4, kf5=^Z5, kf6=^Z6, kf7=^Z7, + kf8=^Z8, kf9=^Z9, ri=\E[T, rmcup=\E[V\E[24;1f\E[?38h, + rmir=\E[4l, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smcup=\E[U\E[?38l, smir=\E[4h, smso=\E[7m, smul=\E[4m, + use=ansi+local1, + +#### Texas Instruments (ti) +# + +# The Silent 700 was so called because it was built around a quiet thermal +# printer. It was portable, equipped with an acoustic coupler, and pretty +# neat for its day. +ti700|ti733|ti735|ti745|ti800|Texas Instruments Silent 700/733/735/745 or OMNI 800, + OTbs, hc, os, + cols#80, + bel=^G, cr=\r$<162>, cub1=^H, cud1=\n, ind=\n, + +# Terminal entries for the Texas Instruments 703/707 +# hardcopy terminals. +# +# http://www.bitsavers.org/pdf/ti/terminal/silent_700/ +# Refer to: +# Model 707 Data Terminal User's Manual +# http://www.bitsavers.org/pdf/ti/terminal/silent_700/2310451-0001_Silent_700_Model_707_Users_Manual_Nov1983.pdf +# +# pages 2-7 and 2-8 say that the model 707 prints 10.2 characters per inch +# (cpi) (80 characters per line) by default, and can be switched to/from 17.0 +# cpi using an escape sequence. There is no 80/132-column capability in +# terminfo (only the more general cpi which allows any value). +ti703|ti707|Texas Instruments Silent 703/707, + am, xenl, + it#8, + cuf1=\s, is2=\EPC\\, nel=\r\n, use=ti700, +ti703-w|ti707-w|Texas Instruments Silent 703/707 (132 column), + cols#132, + is2=\EPD\\, use=ti703, + +# +# Texas Instruments 916 VDT 7 bit control mode +# +ti916|ti916-220-7|Texas Instruments 916 VDT 8859/1 VT220 mode 7 bit CTRL, + da, db, in, + cbt=\E[Z, clear=\E[H\E[2J$<6>, dch=\E[%p1%dP$<250>, + ech=\E[%p1%dX$<20>, ed=\E[J$<6>, el=\E[0K, + enacs=\E(B\E)0, ff=^L, flash=\E[?5h\E[?5l$<6>, + hpa=\E[%p1%{1}%+%dG, hts=\E[0W, ich=\E[%p1%d@$<250>, + il=\E[%p1%dL$<36>, ip=$<10>, is2=\E[1;24r\E[24;1H, + kcmd=\E[29~, kdch1=\E[P, kent=\n, kf1=\E[17~, kf10=\E[28~, + kf11=\E[29~, kf12=\E[31~, kf2=\E[18~, kf3=\E[19~, + kf4=\E[20~, kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, + kf9=\E[26~, khome=\E[H, kich1=\E[@, knp=\E[S, kpp=\E[T, + kprt=^X, prot=\E&, rmacs=\017$<2>, rs2=\E[!p, sgr@, + smacs=\016$<2>, vpa=\E[%p1%{1}%+%dd, use=vt220, +# +# Texas Instruments 916 VDT 8 bit control mode +# +ti916-8|ti916-220-8|Texas Instruments 916 VDT 8859/1 8 VT220 mode bit CTRL, + kcmd=\23329~, kcub1=\233D, kcud1=\233B, kcuf1=\233C, + kcuu1=\233A, kdch1=\233P, kf1=\23317~, kf10=\23328~, + kf11=\23329~, kf12=\23331~, kf2=\23318~, kf3=\23319~, + kf4=\23320~, kf5=\23321~, kf6=\23323~, kf7=\23324~, + kf8=\23325~, kf9=\23326~, khome=\233H, kich1=\233@, + knp=\233S, kpp=\233T, use=ti916, +# +# Texas Instruments 916 VDT 8859/1 7 bit control 132 column mode +# +ti916-132|Texas Instruments 916 VDT VT220 132 column, + cols#132, use=ti916, +# +# Texas Instruments 916 VDT 8859/1 8 bit control 132 column mode +# +ti916-8-132|Texas Instruments 916 VDT 8-bit VT220 132 column, + cols#132, use=ti916-8, +ti924|Texas Instruments 924 VDT 8859/1 7 bit CTRL, + OTbs, am, xon, + cols#80, it#8, lines#24, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H, cr=\r, + csr=%i\E[%p1%d;%p2%dr, cup=%i\E[%p1%d;%p2%dH, + cvvis=\E[?31h, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + hts=\EH, il1=\E[L, ind=\ED, kbs=^H, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\E[16~, kf6=\E[17~, kf7=\E[18~, + kf8=\E[19~, kf9=\E[20~, kich1=\E[@, rc=\E8, rev=\E[7m, + ri=\EM, rmso=\E[m, rmul=\E[m, sc=\E7, sgr0=\E[m, smso=\E[7m, + smul=\E[4m, tbc=\E[3g, use=ansi+local1, use=vt220+cvis, +ti924-8|Texas Instruments 924 VDT 8859/1 8 bit CTRL, + am, xon, + cols#80, it#8, lines#24, + bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H, cr=\r, + csr=%i\E[%p1%d;%p2%dr, cup=%i\E[%p1%d;%p2%dH, + cvvis=\E[?31h, dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ht=^I, + hts=\EH, il1=\E[L, ind=\ED, kbs=^H, kcub1=\E[D, kcud1=\E[B, + kcuf1=\E[C, kcuu1=\E[A, kdch1=\233P, kf1=\217P, kf2=\217Q, + kf3=\217R, kf4=\217S, kf5=\23316~, kf6=\23317~, + kf7=\23318~, kf8=\23319~, kf9=\23320~, kich1=\233@, rc=\E8, + rev=\E[7m, ri=\EM, rmso=\E[m, rmul=\E[m, sc=\E7, sgr0=\E[m, + smso=\E[7m, smul=\E[4m, tbc=\E[3g, use=ansi+local1, + use=vt220+cvis, +ti924w|Texas Instruments 924 VDT 7 bit - 132 column mode, + cols#132, use=ti924, +ti924-8w|Texas Instruments 924 VDT 8 bit - 132 column mode, + cols#132, use=ti924-8, +ti931|Texas Instruments 931 VDT, + OTbs, am, xon, + cols#80, lines#24, + bel=^G, blink=\E4P, clear=\EL, cnorm=\E4@, cr=\r, cub1=\ED, + cud1=\EB, cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, + cuu1=\EA, dch1=\EQ, dl1=\EO, ed=\EJ, el=\EI, home=\EH, + ich1=\ER\EP\EM, il1=\EN, ind=\Ea, invis=\E4H, + is2=\EGB\E(@B@@\E), kdch1=\EQ, kdl1=\EO, kf1=\Ei1, + kf2=\Ei2, kf3=\Ei3, kf4=\Ei4, kf5=\Ei5, kf6=\Ei6, kf7=\Ei7, + kf8=\Ei8, kf9=\Ei9, kich1=\EP, kil1=\EN, rev=\E4B, ri=\Eb, + rmso=\E4@, rmul=\E4@, sgr0=\E4@, smso=\E4A, smul=\E4D, + use=vt52+arrows, +ti926|Texas Instruments 926 VDT 8859/1 7 bit CTRL, + csr@, ind=\E[1S, ri=\E[1T, use=ti924, +# (ti926-8: I corrected this from the broken SCO entry -- esr) +ti926-8|Texas Instruments 926 VDT 8859/1 8 bit CTRL, + csr@, ind=\2331S, ri=\2331T, use=ti924-8, +ti_ansi|basic entry for ti928, + am, bce, eo, xenl, xon, + colors#8, cols#80, it#8, lines#25, pairs#64, + bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[2J\E[H, + cr=\r, csr=\E[%i%p1%d;%p2%dr, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, ed=\E[J, + el=\E[K, home=\E[H, ht=^I, ich1=\E[@, il1=\E[L, ind=\E[S, + kend=\E[F, kf0=\E[V, kf1=\E[M, kf2=\E[N, kf3=\E[O, kf4=\E[P, + kf5=\E[Q, kf6=\E[R, kf7=\E[S, kf8=\E[T, kf9=\E[U, knp=\E[G, + kpp=\E[I, op=\E[37;40m, ri=\E[T, rmso=\E[m, rmul=\E[m, + setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, + smso=\E[7m, smul=\E[4m, use=ansi+arrows, use=ansi+local1, +# +# 928 VDT 7 bit control mode +# +ti928|Texas Instruments 928 VDT 8859/1 7 bit CTRL, + kdch1=\E[P, kend=\E_1\E\\, kent=\E[8~, kf1=\E[17~, + kf10=\E[28~, kf11=\E[29~, kf12=\E[31~, kf13=\E[32~, + kf15=\E[34~, kf2=\E[18~, kf3=\E[19~, kf4=\E[20~, + kf5=\E[21~, kf6=\E[23~, kf7=\E[24~, kf8=\E[25~, kf9=\E[26~, + kich1=\E[@, knp=\E[S, kpp=\E[T, kprt=\E[35~, use=ti_ansi, +# +# 928 VDT 8 bit control mode +# +ti928-8|Texas Instruments 928 VDT 8859/1 8 bit CTRL, + kdch1=\233P, kend=\2371\234, kent=\2338~, kf1=\23317~, + kf10=\23328~, kf11=\23329~, kf12=\23331~, kf13=\23332~, + kf15=\23334~, kf2=\23318~, kf3=\23319~, kf4=\23320~, + kf5=\23321~, kf6=\23323~, kf7=\23324~, kf8=\23325~, + kf9=\23326~, khome=\233H, kich1=\233@, knp=\233S, + kpp=\233T, kprt=\23335~, use=ti_ansi, + +#### Zentec (zen) +# + +# (zen30: removed obsolete :ma=^L ^R^L^K^P:. This entry originally +# had just =\EG6 which I think means standout was supposed to be +# dim-reverse using ADM12-style attributes. ADM12 / and +# might work-- esr) +zen30|z30|Zentec 30, + OTbs, am, mir, ul, + cols#80, lines#24, + bel=^G, clear=\E*, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, dch1=\EW, + dim=\EG2, dl1=\ER$<1.5*>, ed=\EY, el=\ET$<1.0*>, home=^^, + il1=\EE$<1.5*>, ind=\n, rmir=\Er, rmul@, smir=\Eq, smso=\EG6, + smul@, use=adm+sgr, +# (zen50: this had extension capabilities +# :BS=^U:CL=^V:CR=^B: +# UK/DK/RK/LK/HM were someone's aliases for ku/kd/kl/kr/kh, +# which were also in the original entry -- esr) +# (zen50: removed obsolete ":ma=^Hh^Ll^Jj^Kk:" -- esr) +zen50|z50|Zentec Zephyr, + OTbs, am, + cols#80, lines#24, xmc#1, + clear=\E+, cub1=^H, cup=\E=%p1%{32}%+%c%p2%{32}%+%c, + cuu1=^K, dch1=\EW, dl1=\ER, ed=\EY, el=\ET, ich1=\EQ, il1=\EE, + invis@, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, khome=^^, + rmul@, smul@, use=adm+sgr, + +# CCI 4574 (Office Power) from Will Martin via BRL +cci|cci1|z8001|zen8001|CCI Custom Zentec 8001, + OTbs, am, bw, + cols#80, lines#24, + blink=\EM", clear=\EH\EJ, cnorm=\EP, + csr=\ER%p1%{32}%+%c%p2%{32}%+%c, cub1=^H, cud1=\n, + cuf1=\EC, cup=\EY%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, + cvvis=\EF\EQ\EM \ER 7, dim=\EM!, ed=\EJ, el=\EK, home=\EH, + invis=\EM(, is2=\EM \EF\ET\EP\ER 7, kbs=^H, khome=\EH, + mc4=^T, mc5=^R, rev=\EM$, ri=\EI, rmso=\EM\s, rmul=\EM\s, + sgr0=\EM\s, smso=\EM$, smul=\EM0, use=vt52+arrows, + +######## OBSOLETE UNIX CONSOLES +# + +#### Apollo consoles +# +# Apollo got bought by Hewlett-Packard. The Apollo workstations are +# labeled HP700s now. +# + +# From: Gary Darland +apollo|Apollo console, + OTbs, am, mir, + cols#88, lines#53, + clear=^L, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\EM%p1%{32}%+%c%p2%d), cuu1=\EA, dch1=\EP, dl1=\EL, + ed=\EJ, el=\EK, hpa=\EN%p1%d, il1=\EI, ind=\EE, ri=\ED, + rmcup=\EX, rmir=\ER, rmso=\ET, rmul=\EV, smcup=\EW, smir=\EQ, + smso=\ES, smul=\EU, vpa=\EO+\s, + +# We don't know whether or not the apollo guys replicated DEC's firmware bug +# in the VT132 that reversed /. To be on the safe side, disable +# both these capabilities. +apollo+vt132|Apollo console emulating VT132, + rmir@, smir@, use=vt132, + +apollo_15P|Apollo 15 inch display, + use=apollo+vt132, +apollo_19L|Apollo 19 inch display, + use=apollo+vt132, +apollo_color|Apollo color display, + use=apollo+vt132, + +#### AT&T consoles + +# This actually describes the generic SVr4 display driver for Intel boxes. +# The isn't documented and therefore may not be reliable. +# From: Eric Raymond Mon Nov 27 19:00:53 EST 1995 +att6386|at386|386at|AT&T WGS 6386 console, + am, bw, eo, xon, + cols#80, lines#25, + acsc=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~, + bel=^G, civis=\E[=C, clear=\E[2J\E[H, cnorm=\E[=1C, cr=\r, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + dim=\E[2m, dl=\E[%p1%dM, dl1=\E[1M, ech=\E[%p1%dX, ed=\E[J, + el=\E[K, home=\E[H, hpa=\E[%i%p1%dG, ich=\E[%p1%d@, + ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L, ind=\E[S, invis=\E[9m, + is2=\E[0;10;39m, kcbt=^], kdch1=\E[P, kend=\E[Y, kf1=\EOP, + kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ, kf3=\EOR, + kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, kf9=\EOX, + kich1=\E[@, knp=\E[U, kpp=\E[V, krmir=\E0, nel=\r\E[S, + rc=\E8, ri=\E[T, rmacs=\E[10m, sc=\E7, + sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p5%t; + 2%;%?%p6%t;1%;%?%p9%t;12%e;10%;%?%p7%t;9%;m, + sgr0=\E[0;10m, smacs=\E[12m, vpa=\E[%i%p1%dd, + use=ansi+arrows, use=ansi+inittabs, use=ansi+local, + use=ansi+sgrbold, use=ecma+index, use=klone+color, + +# (pc6300plus: removed ":KM=/usr/lib/ua/kmap.s5:"; renamed BO/EE/CI/CV -- esr) +pc6300plus|AT&T 6300 plus, + OTbs, am, xon, + cols#80, lines#24, + bel=^G, blink=\E[5m, bold=\E[1m, civis=\E[=C, + clear=\E[2J\E[H, cnorm=\E[=1C, cr=\r, cub1=^H, + cup=\E[%i%p1%2d;%p2%2dH, dch1=\E[1P, dim=\E[2m, + dl1=\E[1M, ed=\E[0J, el=\E[0K, home=\E[H, hts=\EH, + ich1=\E[1@, il1=\E[1L, ind=\n, invis=\E[9m, kbs=^H, + kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOc, + kf10=\EOu, kf2=\EOd, kf3=\EOe, kf4=\EOf, kf5=\EOg, kf6=\EOh, + kf7=\EOi, kf8=\EOj, kf9=\EOk, nel=\r\n, rev=\E[7m, rmso=\E[m, + rmul=\E[m, sgr0=\E[m, smso=\E[7m, smul=\E[4m, tbc=\E[3g, + use=ansi+local1, + +# From: Benjamin C. W. Sittler +# +# I have a UNIX PC which I use as a terminal attached to my Linux PC. +# Unfortunately, the UNIX PC terminfo entry that comes with ncurses +# is broken. All the special key sequences are broken, making it unusable +# with Emacs. The problem stems from the following: +# +# The UNIX PC has a plethora of keys (103 of them, and there's no numeric +# keypad!), loadable fonts, and strange highlighting modes ("dithered" +# half-intensity, "smeared" bold, and real strike-out, for example.) It also +# uses resizable terminal windows, but the bundled terminal program always +# uses an 80x24 window (and doesn't support seem to support a 132-column +# mode.) +# +# HISTORY: The UNIX PC was one of the first machines with a GUI, and used a +# library which was a superset of SVr3.5 curses (called tam, for "terminal +# access method".) tam includes support for real, overlapping windows, +# onscreen function key labels, and bitmap graphics. But since the primary +# user interface on the UNIX PC was a GUI program (ua, for "user +# assistant",) and remote administration was considered important for the +# machine, tam also supported VT100-compatible terminals attached to the +# serial port or used across the StarLan network. To simulate the extra keys +# not present on a VT100, users could press ESC and a two-letter sequence, +# such as u d (Undo) or U D (Shift-Undo.) These two-letter sequences, +# however, were not the same as those sent by the actual Undo key. The +# actual Undo key sends ESC 0 s unshifted, and ESC 0 S shifted, for example. +# (If you're interested in adding some of the tam calls to ncurses, btw, I +# have the full documentation and several programs which use tam. It also +# used an extended terminfo format to describe key sequences, special +# highlighting modes, etc.) +# +# KEYS: This means that ncurses would quite painful on the UNIX PC, since +# there are two sequences for every key-modifier combination (local keyboard +# sequence and remote "VT100" sequence.) But I doubt many people are trying +# to use ncurses on the UNIX PC, since ncurses doesn't properly handle the +# GUI. Unfortunately, the terminfo entry (and the termcap, too, I presume) +# seem to have been built from the manual describing the VT100 sequences. +# This means it doesn't work for a real live UNIX PC. +# +# FONTS: The UNIX PC also has a strange interpretation of "alternate +# character set". Rather than the VT100 graphics you might expect, it allows +# up to 8 custom fonts to be loaded at any given time. This means that +# programs expecting VT100 graphics will usually be disappointed. For this +# reason I have disabled the smacs/rmacs sequences, but they could easily be +# re-enabled. Here are the relevant control sequences (from the ESCAPE(7) +# manpage), should you wish to do so: +# +# SGR10 - Select font 0 - ESC [ 10 m or SO +# SGR11 - Select font 1 - ESC [ 11 m or SI +# SGR12 - Select font 2 - ESC [ 12 m +# ... (etc.) +# SGR17 - Select font 7 - ESC [ 17 m +# +# Graphics for line drawing are not reliably found at *any* character +# location because the UNIX PC has dynamically reloadable fonts. I use font +# 0 for regular text and font 1 for italics, but this is by no means +# universal. So ASCII line drawing is in order if smacs/rmacs are enabled. +# +# MISC: The cursor visible/cursor invisible sequences were swapped in the +# distributed terminfo. +# +# To ameliorate these problems (and fix a few highlighting bugs) I rewrote +# the UNIX PC terminfo entry. The modified version works great with Lynx, +# Emacs, and XEmacs running on my Linux PC and displaying on the UNIX PC +# attached by serial cable. In Emacs, even the Undo key works, and many +# applications can now use the F1-F8 keys. +# +# esr's notes: +# Terminfo entry for the AT&T Unix PC 7300 +# from escape(7) in Unix PC 7300 Manual. +# Somewhat similar to a vt100-am (but different enough +# to redo this from scratch.) +# +# /*************************************************************** +# * +# * FONT LOADING PROGRAM FOR THE UNIX PC +# * +# * This routine loads a font defined in the file ALTFONT +# * into font memory slot #1. Once the font has been loaded, +# * it can be used as an alternative character set. +# * +# * The call to ioctl with the argument WIOCLFONT is the key +# * to this routine. For more information, see window(7) in +# * the PC 7300 documentation. +# ***************************************************************/ +# #include /* needed for strcpy call */ +# #include /* needed for ioctl call */ +# #define FNSIZE 60 /* font name size */ +# #define ALTFONT "/usr/lib/wfont/special.8.ft" /* font file */ +# /* +# * The file /usr/lib/wfont/special.8.ft comes with the +# * standard PC software. It defines a graphics character set +# * similar to that of the Teletype 5425 terminal. To view +# * this or other fonts in /usr/lib/wfont, use the command +# * cfont . For further information on fonts see +# * cfont(1) in the PC 7300 documentation. +# */ +# +# struct altfdata /* structure for alt font data */ +# { +# short altf_slot; /* memory slot number */ +# char altf_name[FNSIZE]; /* font name (file name) */ +# }; +# ldfont() +# { +# int wd; /* window in which altfont will be */ +# struct altfdata altf; +# altf.altf_slot=1; +# strcpy(altf.altf_name,ALTFONT); +# for (wd =1; wd < 12; wd++) { +# ioctl(wd, WIOCLFONT,&altf); +# } +# } +# +# (att7300: added /// from the BSDI entry, +# they're confirmed by the man page for the System V display---esr) +# +att7300|unixpc|pc7300|3b1|s4|AT&T UNIX PC Model 7300, + am, xon, + cols#80, it#8, lines#24, + bel=^G, blink=\E[9m, bold=\E[1m, cbt=\E^I, civis=\E[=1C, + clear=\E[2J\E[H, cnorm=\E[=0C, cr=\r, cub1=^H, + cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dim=\E[2m, ed=\E[0J, + el=\E[0K, home=\E[H, ich1=\E[@, ind=\n, invis=\E[9m, + is1=\017\E[=1w, kBEG=\ENB, kCAN=\EOW, kCPY=\END, kCRT=\EON, + kDC=\ENF, kDL=\ENE, kEND=\ENN, kEOL=\EOA, kFND=\EOX, + kHLP=\EOM, kHOM=\ENM, kIC=\ENJ, kLFT=\ENK, kMOV=\ENC, + kNXT=\ENH, kOPT=\EOR, kPRV=\ENG, kRDO=\EOT, kRIT=\ENL, + kRPL=\EOY, kSAV=\EOO, kUND=\EOS, kbeg=\ENb, kcan=\EOw, + kcbt=\E[Z, kclo=\EOV, kclr=\E[J, kcmd=\EOu, kcpy=\ENd, + kcrt=\EOn, kdch1=\ENf, ked=\E[J, kel=\EOa, kend=\E0, + kext=\EOk, kf1=\EOc, kf2=\EOd, kf3=\EOe, kf4=\EOf, kf5=\EOg, + kf6=\EOh, kf7=\EOi, kf8=\EOj, kfnd=\EOx, khlp=\EOm, + kich1=\ENj, kind=\E[B, kmov=\ENc, kmrk=\ENi, knp=\E[U, + knxt=\ENh, kopn=\EOv, kopt=\EOr, kpp=\E[V, kprt=\EOz, + kprv=\ENg, krdo=\EOt, kref=\EOb, krfr=\ENa, kri=\E[A, + krpl=\EOy, krst=\EOB, ksav=\EOo, kslt=\ENI, kund=\EOs, + nel=\EE, rev=\E[7m, ri=\EM, rmso=\E[m, rmul=\E[m, + sgr0=\E[0;10m, smso=\E[7m, smul=\E[4m, use=ansi+arrows, + use=ansi+idl, use=ansi+local, + +#### Convergent Technology +# +# Burroughs bought Convergent shortly before it merged with Univac. +# CTOS is (I believe) dead. Probably the aws is too (this entry dates +# from 1991 or earlier). +# + +# Convergent AWS workstation from Gould/SEL UTX/32 via BRL +# (aws: removed unknown :dn=^K: -- esr) +aws|Convergent Technologies AWS workstation under UTX and Xenix, + am, + OTug#0, cols#80, lines#28, xmc#0, + OTbc=^H, OTma=\016h\013j\001k\022l\002m, OTnl=\n, acsc=, + clear=^L, cud1=^K, cuf1=^R, cup=\EC%p2%c%p1%c, cuu1=^A, + dch1=\EDC, dl1=\EDL, ed=\EEF, el=\EEL, hpa=\EH%p1%c, + ich1=\EIC, il1=\EIL, ind=\ESU, kbs=^H, kcub1=^N, kcud1=^K, + kcuf1=^R, kcuu1=^A, ri=\ESD, rmacs=\EAAF, rmso=\EARF, + rmul=\EAUF, smacs=\EAAN, smso=\EARN, smul=\EAUN, + vpa=\EV%p1%c, +awsc|Convergent Technologies AWS workstation under CTOS, + am, + OTug#0, cols#80, lines#24, xmc#0, + OTbc=^N, OTma=\016h\013j\001k\022l\002m, acsc=, clear=^L, + cud1=^K, cuf1=^R, cup=\EC%p2%c%p1%c, cuu1=^A, ed=\EEF, + el=\EEL, kbs=^H, kcub1=^N, kcud1=^K, kcuf1=^R, kcuu1=^A, + rmacs=\EAAF, rmso=\EAA, rmul=\EAA, smacs=\EAAN, smso=\EAE, + smul=\EAC, + +#### DEC consoles +# + +# The MicroVax console. Tim Theisen writes: +# The digital uVax II's had a graphic display called a qdss. It was +# supposed to be a high performance graphic accelerator, but it was +# late to market and barely appeared before faster dumb frame buffers +# appeared. I have only used this display while running X11. However, +# during bootup, it was in text mode, and probably had a terminal emulator +# within it. And that is what your termcap entry is for. In graphics +# mode the screen size is 1024x864 pixels. +qdss|qdcons|qdss glass tty, + OTbs, am, + cols#128, lines#57, + clear=\032$<1/>, cub1=^H, cud1=\n, cuf1=^L, + cup=\E=%p1%c%p2%c, cuu1=^K, + +#### Fortune Systems consoles +# +# Fortune made a line of 68K-based UNIX boxes that were pretty nifty +# in their day; I (esr) used one myself for a year or so around 1984. +# They had no graphics, though, and couldn't compete against Suns and +# the like. R.I.P. +# + +# From: Robert Nathanson via tut Wed Oct 5, 1983 +# (This had extension capabilities +# :rv=\EH:re=\EI:rg=0:GG=0:\ +# :CO=\E\\:WL=^Aa\r:WR=^Ab\r:CL=^Ac\r:CR=^Ad\r:DL=^Ae\r:RF=^Af\r:\ +# :RC=^Ag\r:CW=^Ah\r:NU=^Aj\r:EN=^Ak\r:HM=^Al:PL=^Am\r:\ +# :PU=^An\r:PD=^Ao\r:PR=^Ap\r:HP=^A@\r:RT=^Aq\r:TB=\r:CN=\177:MP=\E+F: +# It had both ":bs:" and ":bs=^H:"; I removed the latter. Also, it had +# ":sg=0:" and ":ug=0:"; evidently the composer was trying (unnecessarily) +# to force both magic cookie glitches off. Once upon a time, I +# used a Fortune myself, so I know the capabilities of the form ^A[a-z]\r are +# function keys; thus the "Al" value for HM was certainly an error. I renamed +# EN/PD/PU/CO/CF/RT according to the XENIX/TC mappings, but not HM/DL/RF/RC. +# I think :rv: and :re: are start/end reverse video and :rg: is a nonexistent +# "reverse-video-glitch" capability; I have put :rv: and :re: in with standard +# names below. I've removed obsolete ":nl=5^J:" as there is a :do: -- esr) +fos|fortune|Fortune system, + OTbs, am, bw, + cols#80, lines#25, + acsc=j*k(l m"q&v%w#x-, bel=^G, blink=\EN, civis=\E], + clear=\014$<20>, cnorm=\E\\, cr=\r, cub1=^H, cud1=\n$<3>, + cup=\034C%p1%{32}%+%c%p2%{32}%+%c, cuu1=\013$<3>, + cvvis=\E:, dch1=\034W$<5>, dl1=\034R$<15>, ed=\034Y$<3*>, + el=^\Z, home=\036$<10>, ht=^Z, ich1=\034Q$<5>, + il1=\034E$<15>, ind=\n, is2=^_.., kbs=^H, kcub1=^Aw\r, + kcud1=^Ay\r, kcuf1=^Az\r, kcuu1=^Ax\r, kend=^Ak\r, + kent=^Aq, kf1=^Aa\r, kf2=^Ab\r, kf3=^Ac\r, kf4=^Ad\r, + kf5=^Ae\r, kf6=^Af\r, kf7=^Ag\r, kf8=^Ah\r, khome=^A?\r, + knp=^Ao\r, kpp=^An\r, nel=\r\n, rev=\EH, rmacs=^O, rmso=^\I`, + rmul=^\IP, sgr0=\EI, smacs=\Eo, smso=^\H`, smul=^\HP, + +#### Masscomp consoles +# +# Masscomp has gone out of business. Their product line was purchased by a +# company in Georgia (US) called "XS International", parts and service may +# still be available through them. +# + +# (masscomp: ":MT:" changed to ":km:"; -- esr) +masscomp|masscomp workstation console, + OTbs, km, mir, + cols#80, it#8, lines#24, + clear=\E[2J, cub1=^H, cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, + dl1=\E[M, ed=\E[J, el=\E[K, ht=^I, il1=\E[L, + is2=\EGc\EGb\EGw, kbs=^H, kcub1=\EOD, kcud1=\EOB, + kcuf1=\EOC, kcuu1=\EOA, rmir=\E[4l, rmso=\E[m, rmul=\EGau, + smir=\E[4h, smso=\E[7m, smul=\EGu, use=ansi+local1, +masscomp1|masscomp large screen version 1, + cols#104, lines#36, use=masscomp, +masscomp2|masscomp large screen version 2, + cols#64, lines#21, use=masscomp, + +#### OSF Unix +# + +# OSF/1 1.1 Snapshot 2 +pmcons|pmconsole|PMAX console, + am, + cols#128, lines#57, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuu1=^K, ht=^I, + ind=\n, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, + +#### Other consoles +# The following is a version of the ibm-pc entry distributed with PC/IX, +# (Interactive Systems' System 3 for the Big Blue), modified by Richard +# McIntosh at UCB/CSM. The :pt: and :uc: have been removed from the original, +# (the former is untrue, and the latter failed under UCB/man); standout and +# underline modes have been added. Note: this entry describes the "native" +# capabilities of the PC monochrome display, without ANY emulation; most +# communications packages (but NOT PC/IX connect) do some kind of emulation. +pcix|PC/IX console, + am, bw, eo, + cols#80, lines#24, + clear=\Ec, cub1=^H, cup=\E[%i%p1%2d;%p2%2dH, ed=\E[J, + el=\E[K, home=\E[H, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smso=\E[7m, smul=\E[4m, use=ansi+local1, + +# (ibmpcx: this entry used to be known as ibmx. +# It formerly included the following extension capabilities: +# :GC=b:GL=v:GR=t:RT=^J:\ +# :GH=\E[196g:GV=\E[179g:\ +# :GU=\E[193g:GD=\E[194g:\ +# :G1=\E[191g:G2=\E[218g:G3=\E[192g:G4=\E[217g:\ +# :CW=\E[E:NU=\E[F:RF=\E[G:RC=\E[H:\ +# :WL=\E[K:WR=\E[L:CL=\E[M:CR=\E[N:\ +# I renamed GS/GE/WL/WR/CL/CR/PU/PD/HM/EN; also, removed a duplicate +# ":kh=\E[Y:". Added IBM-PC forms characters and highlights, they match +# what was there before. -- esr) +ibmpcx|xenix|ibmx|IBM PC xenix console display, + OTbs, am, msgr, + cols#80, lines#25, + clear=^L, cub1=^H, cup=\E[%p1%d;%p2%dH, dch1=\E[P, + dl1=\E[M, ed=\E[J, el=\E[K, home=\E[H, ich1=\E[@, il1=\E[L, + kend=\E[d, kf1=\E[K, kf2=\E[L, kf3=\E[M, kf4=\E[N, + khome=\E[Y, knp=\E[e, kpp=\E[Z, use=ansi+arrows, + use=ansi+local1, use=klone+acs, use=klone+sgr8, + +######## OTHER OBSOLETE TYPES +# +# These terminals are *long* dead -- these entries are retained for +# historical interest only. +# + +#### Obsolete non-ANSI software emulations +# + +# CTRM terminal emulator +# 1. underlining is not allowed with colors: first, is is simulated by +# black on white, second, it disables background color manipulations. +# 2. BLINKING, REVERSE and BOLD are allowed with colors, +# so we have to save their status in the static registers A, B and H +# respectively, to be able to restore them when color changes +# (because any color change turns off ALL attributes) +# 3. and sequences alternate modes, +# rather than simply entering them. Thus we have to check the +# static register B and H to determine the status, before sending the +# escape sequence. +# 4. now must set the status of all 3 register (A,B,H) to zero +# and then reset colors +# 5. implementation of the protect mode would badly penalize the performance. +# we would have to use \E&bn sequence to turn off colors (as well as all +# other attributes), and keep the status of protect mode in yet another +# static variable. If someone really needs this mode, they would have to +# create another terminfo entry. +# 6. original color-pair is white on black. +# store the information about colors into static registers +# 7. set foreground color. it performs the following steps. +# 1) turn off all attributes +# 2) turn on the background and video attributes that have been turned +# on before (this information is stored in static registers X,Y,Z,A,B,H,D). +# 3) turn on foreground attributes +# 4) store information about foreground into U,V,W static registers +# 8. turn on background: similar to turn on foreground above +ctrm|C terminal emulator, + am, bce, xon, + colors#8, cols#80, lh#0, lines#24, lm#0, lw#0, ncv#2, nlab#0, + pairs#63, pb#19200, vt#6, + bel=^G, blink=\E&dA%{1}%PA, + bold=%?%gH%{0}%=%t\E&dH%{1}%PH%;, cbt=\Ei, + clear=\EH\EJ, cr=\r, cub1=^H, cud1=\n, cuf1=\EC, + cup=\E&a%p2%dc%p1%dY, cuu1=\EA, dch1=\EP$<2>, dl1=\EM, + ed=\EJ, el=\EK, hpa=\E&a%p1%dC, ht=\011$<2>, hts=\E1, + il1=\EL, ind=\n, ip=$<2>, is2=\E&jA\r, kbs=^H, kcub1=\Eu\r, + kcud1=\Ew\r, kcuf1=\Ev\r, kcuu1=\Et\r, khome=\Ep\r, + op=\E&bn\E&bB\E&bG\E&bR%{0}%PX%{0}%PY%{0}%PZ%{1}%PW%{1}%PV + %{1}%PU, + rev=%?%gB%{0}%=%t\E&dB%{1}%PB%;, rmir=\ER, rmkx=\E&jA, + setb=\E&bn%?%gA%t\E&dA%;%?%gB%t\E&dB%;%?%gH%t\E&dH%;%?%gU%t + \E&bR%;%?%gV%t\E&bG%;%?%gW%t\E&bB%;%?%p1%{1}%&%t\E&bb + %{1}%e%{0}%;%PZ%?%p1%{2}%&%t\E&bg%{1}%e%{0}%;%PY%?%p1 + %{4}%&%t\E&br%{1}%e%{0}%;%PX, + setf=\E&bn%?%gA%t\E&dA%;%?%gB%t\E&dB%;%?%gH%t\E&dH%;%?%gX%t + \E&br%;%?%gY%t\E&bg%;%?%gZ%t\E&bb%;%?%p1%{1}%&%t\E&bB + %{1}%e%{0}%;%PW%?%p1%{2}%&%t\E&bG%{1}%e%{0}%;%PV%?%p1 + %{4}%&%t\E&bR%{1}%e%{0}%;%PU, + sgr=\E&d@%{0}%PA%{0}%PB%{0}%PD%{0}%PH%?%p1%p3%p5%|%|%t\E&dB + %{1}%PB%;%?%p4%t\E&dA%{1}%PA%;%?%p6%t\E&dH%{1}%PH%;%?%p2 + %t\E&dD%;, + sgr0=\E&d@%{0}%PA%{0}%PB%{0}%PH, smir=\EQ, smkx=\E&jB, + smso=\E&dD, smul=\E&dD, tbc=\E3, vpa=\E&a%p1%dY, + use=hp+pfk+cr, + +# gs6300 - can't use blue foreground, it clashes with underline; +# it's simulated with cyan +# Bug: The capability probably resets attributes. +# (gs6300: commented out (no ) --esr) +gs6300|emots|AT&T PC6300 with EMOTS terminal emulator, + am, bce, msgr, xon, + colors#8, cols#80, it#8, lines#24, pairs#63, + acsc=++\,\,--..``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyz + z{{||}}~~, + bel=^G, blink=\E[5m, bold=\E[1m, cr=\r, cub1=^H, cud1=\n, + cup=\E[%i%p1%d;%p2%dH, dch=\E[%p1%dP, dch1=\E[P, + home=\E[H, ht=^I, ich=\E[%p1%d@, ich1=\E[@, ind=\n, is2=\E[m, + kcbt=^R^I, kf1=\E[0s, kf2=\E[24s, kf3=\E[1s, kf4=\E[23s, + kf5=\E[2s, kf6=\E[22s, kf7=\E[3s, kf8=\E[21s, mc4=\E[4i, + mc5=\E[5i, op=\E[?;m, rev=\E[7m, ri=\E[L, rmacs=\E[10m, + rs1=\Ec, setb=\E[?;%p1%dm, + setf=\E[?%?%p1%{0}%=%t0%e%p1%{1}%=%t2%e%p1%{1}%-%d%;m, + sgr0=\E[m\E[10m, smacs=\E[11m, smso=\E[1m, smul=\E[4m, + use=ansi+arrows, use=ansi+erase, use=ansi+idl, + use=ansi+local, + +# From: 29 Oct 85 05:40:18 GMT +# MS-Kermit with Heath-19 emulation mode enabled +# (h19k: changed ":pt@:" to ":it@" +h19k|h19kermit|Heathkit emulation provided by Kermit (no auto margin), + am@, da, db, xt, + it@, + ht@, use=h19-u, + +# Apple Macintosh with VersaTerm, a terminal emulator distributed by Synergy +# Software (formerly Peripherals Computers & Supplies, Inc) of +# 2457 Perkiomen Ave., Reading, PA 19606, 1-800-876-8376. They can +# also be reached at support@synergy.com. +versaterm|VersaTerm VT100 emulator for the Macintosh, + am, xenl, + cols#80, it#8, lines#24, + bel=^G, blink=\E[5m$<2/>, bold=\E[1m$<2/>, + clear=\E[;H\E[2J$<50/>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2/>, cup=\E[%i%p1%d;%p2%dH$<5/>, + cuu1=\E[A$<2/>, dch1=\E[1P$<7/>, dl1=\E[1M$<9/>, + ed=\E[J$<50/>, el=\E[K$<3/>, home=\E[H, ht=^I, + ich1=\E[1@$<7/>, il1=\E[1L$<9/>, is2=\E[1;24r\E[24;1H, + kbs=^H, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, + kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, nel=\r\n, + rev=\E[7m$<2/>, rf=/usr/share/tabset/vt100, + ri=\EM$<5/>, rmkx=\E>\E[?1l, rmso=\E[m$<2/>, + rmul=\E[m$<2/>, rs1=\E>, sgr0=\E[m$<2/>, smkx=\E=\E[?1h, + smso=\E[7m$<2/>, smul=\E[4m$<2/>, use=ansi+csr, + +# From: Rick Thomas +# (xtalk: I added / based on the init string. +xtalk|IBM PC with xtalk communication program (versions up to 3.4), + am, mir, msgr, xon, + cols#80, it#8, lines#24, vt#3, xmc#1, + acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, + bel=^G, clear=\E[H\E[J$<50>, cr=\r, cub1=^H, cud1=\n, + cuf1=\E[C$<2>, cup=\E[%i%p1%d;%p2%dH$<5>, + cuu1=\E[A$<2>, dl1=\E[M$<99>, ed=\E[J$<50>, el=\E[K$<3>, + el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, + il1=\E[L$<99>, ind=\n, kbs=^H, kcub1=\EOD, kcud1=\EOB, + kcuf1=\EOC, kcuu1=\EOA, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l, + rmkx=\E[?1l\E>, rmso=\E[m\s, + rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sgr0=\E[m, + smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=, smso=\E[7m\s, + tbc=\E[3g, use=ansi+local, use=vt100+fnkeys, + +# The official PC terminal emulator program of the AT&T Product Centers. +# Note - insert mode commented out - doesn't seem to work on AT&T PC. +simterm|attpc running simterm, + am, + cols#80, lines#24, + bel=^G, clear=\EH\EJ, cr=\r, cub1=^H, cud1=\EB, cuf1=\EC, + cup=\E=%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EA, dch1=\ER, + dl1=\EM, ed=\EJ, el=\EK, home=\EH, il1=\EL, ind=\n, rmcup=\EVE, + rmso=\E&d@, sgr0=\E&d@, smcup=\EVS, smso=\E&dB, + +#### Daisy wheel printers +# +# This section collects Diablo, DTC, Xerox, Qume, and other daisy +# wheel terminals. These are now largely obsolete. +# + +# (diablo1620: removed , no such file -- esr) +diablo1620|diablo1720|diablo450|ipsi|Diablo 1620, + hc, os, + cols#132, it#8, + cub1=^H, cud1=\n, cuu1=\E\n, hd=\ED, hpa=\E\011%i%p1%c, + ht=^I, hts=\E1, hu=\EU, kbs=^H, tbc=\E2, +diablo1620-m8|diablo1640-m8|Diablo 1620 w/8 column left margin, + cols#124, + is2=\r \E9, use=diablo1620, +# (diablo1640: removed , no such file -- esr) +diablo1640|diablo1730|diablo1740|diablo630|x1700|diablo|xerox|Diablo 1640, + bel=^G, rmso=\E&, rmul=\ER, smso=\EW, smul=\EE, + use=diablo1620, +# (diablo1640-lm: removed , no such +# file -- esr) +diablo1640-lm|diablo-lm|xerox-lm|Diablo 1640 with indented left margin, + cols#124, + rmso=\E&, rmul=\ER, smso=\EW, smul=\EE, use=diablo1620, +diablo1740-lm|630-lm|1730-lm|x1700-lm|Diablo 1740 printer, + use=diablo1640-lm, +# DTC 382 with VDU. Has no so we fake it with . Standout +# works but won't go away without dynamite . +# The terminal has tabs, but I'm getting tired of fighting the braindamage. +# If no tab is set or the terminal's in a bad mood, it glitches the screen +# around all of memory. Note that return puts a blank ("a return character") +# in the space the cursor was at, so we use ^P return (and thus ^P newline for +# newline). Note also that if you turn off :pt: and let Unix expand tabs, +# curses won't work (some old BSD versions) because it doesn't clear this bit, +# and cursor addressing sends a tab for row/column 9. What a losing terminal! +# I have been unable to get tabs set in all 96 lines - it always leaves at +# least one line with no tabs in it, and once you tab through that line, +# it completely weirds out. +# (dtc382: change to -- it just does a clear --esr) +dtc382|DTC 382, + am, da, db, xhp, + cols#80, lines#24, lm#96, + bel=^G, clear=\020\035$<20>, cnorm=^Pb, cr=^P\r, cub1=^H, + cuf1=^PR, cup=\020\021%p2%c%p1%c, cuu1=^P^L, cvvis=^PB, + dch1=^X, dl1=^P^S, ed=^P^U^P^S^P^S, el=^P^U, home=^P^R, + il1=^P^Z, ind=\n, pad=^?, rmcup=, rmir=^Pi, rmul=^P \0, + smcup=\020\035$<20>, smir=^PI, smul=^P ^P, +dtc300s|DTC 300s, + hc, os, + cols#132, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=^Z, ff=^L, hd=\Eh, ht=^I, + hts=\E1, hu=\EH, ind=\n, kbs=^H, tbc=\E3, +gsi|mystery gsi terminal, + hc, os, + cols#132, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=^Z, hd=\Eh, ht=^I, hu=\EH, + ind=\n, +aj830|aj832|aj|Anderson Jacobson, + hc, os, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=\E7, hd=\E9, hu=\E8, + ind=\n, +# From: Chris Torek Thu, 7 Nov 85 18:21:58 EST +aj510|Anderson-Jacobson model 510, + am, mir, + cols#80, lines#24, + clear=^L, cub1=^H, cuf1=\EX, + cup=\E#%p1%{32}%+%c%p2%{32}%+%c, cuu1=\EY, + dch1=\E'D$<.1*>, dl1=\E&D$<2*/>, ed=\E'P, el=\E'L, ich1=, + il1=\E&I$<2*/>, ip=$<.1*/>, kcub1=\EW, kcud1=\EZ, + kcuf1=\EX, kcuu1=\EY, pad=^?, rmcup=\E"N, rmir=\E'J, + rmso=\E"I, rmul=\E"U, smcup=\E"N, smir=\E'I, smso=\E"I, + smul=\E"U, +# From: Thu Aug 20 09:09:18 1981 +# This is incomplete, but it's a start. +nec5520|nec|spinwriter|NEC 5520, + hc, os, + cols#132, it#8, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=\E9, ff=^L, + hd=\E]s\n\E]W, ht=^I, hts=\E1, hu=\E]s\E9\E]W, ind=\n, + kbs=^H, tbc=\E3, +qume5|qume|Qume Sprint 5, + hc, os, + cols#80, it#8, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuu1=^Z, ff=^L, hd=\Eh, ht=^I, + hts=\E1, hu=\EH, ind=\n, kbs=^H, tbc=\E3, +# I suspect the Xerox 1720 is the same as the Diablo 1620. +xerox1720|x1720|x1750|Xerox 1720, + hc, os, + cols#132, it#8, + bel=^G, cr=\r, cub1=^H, cud1=\n, ff=^L, ht=^I, hts=\E1, ind=\n, + tbc=\E2, + +#### Miscellaneous obsolete terminals, manufacturers unknown +# +# If you have any information about these (like, a manufacturer's name, +# and a date on the serial-number plate) please send it! + +cad68-3|cgc3|cad68 basic monitor transparent mode size 3 chars, + OTbs, am, + cols#73, lines#36, + clear=^Z, cub1=^H, cuf1=^L, cuu1=^K, home=^^, +cad68-2|cgc2|cad68 basic monitor transparent mode size 2 chars, + OTbs, am, + cols#85, lines#39, + clear=^Z, cub1=^H, cuf1=^L, cuu1=^K, home=^^, kcub1=\E3, + kcud1=\E2, kcuf1=\E4, kcuu1=\E1, kf1=\E5, kf2=\E6, kf3=\E7, + kf4=\E8, rmso=\Em^C, smso=\Em^L, +cops10|cops|cops-10|cops 10, + am, bw, + cols#80, lines#24, + bel=^G, clear=\030$<30/>, cr=\r, cub1=^H, cud1=\n, cuf1=^L, + cup=\020%p1%{32}%+%c%p2%{32}%+%c, cuu1=^K, ed=^W, el=^V, + ind=\n, kbs=^H, kcub1=^H, kcud1=\n, kcuf1=^L, kcuu1=^K, + khome=^Y, + +# http://www.bitsavers.org/pdf/datapro/alphanumeric_terminals/Datapro_C25_Datagraphix.pdf +# +# DatagraphiX, Inc. +# (a subsidiary of General Dynamics), +# P.O. Box 82449, San Diego, California 92138. +# +# (d132: removed duplicate :ic=\E5:, +# merged in capabilities from a BRL entry -- esr) +d132|datagraphix|DatagraphiX 132a, + da, db, in, + cols#80, lines#30, + bel=^G, clear=^L, cnorm=\Em\En, cr=\r, cub1=^H, cud1=\n, + cuf1=\EL, cup=\E8%i%p1%3d%p2%3d, cuu1=\EK, cvvis=\Ex, + dch1=\E6, home=\ET, ht=^I, ich1=\E5, il1=\E3, ind=\n, kbs=^H, + kcub1=^H, kcud1=\n, nel=\r\n, ri=\Ew, +# The d800 was an early portable terminal from c.1984-85 that looked a lot +# like the original Compaq `lunchbox' portable (but no handle). It had a VT220 +# mode (which is what this entry looks like) and several other lesser-known +# emulations. +d800|Direct 800/A, + OTbs, am, da, db, msgr, xhp, + cols#80, it#8, lines#24, + acsc=``a1fxgqh0jYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~, + bel=^G, clear=\E[1;1H\E[2J, cnorm=\E[>12h, cr=\r, cub1=^H, + cud1=\n, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu1=\E[A, + cvvis=\E[>12l, ed=\E[J, el=\E[K, ht=^I, ind=\ED, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf1=\EOP, kf2=\EOQ, + kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV, kf8=\EOW, + ri=\EM, rmacs=\E[m, rmso=\E[m, rmul=\E[m, sgr0=\E[m, + smacs=\E[1m, smso=\E[7m, smul=\E[4m, +digilog|digilog 333, + OTbs, + cols#80, lines#16, + bel=^G, cr=\r, cub1=^H, cud1=\n, cuf1=^I, cuu1=^O, el=^X, + home=^N, ind=\n, +# The DWK was a terminal manufactured in the Soviet Union c.1986 +dwk|dwk-vt|dwk terminal, + am, + acsc=+\^\,Q-S.M0\177`+a:f'g#h#i#jXkClJmFnNo~qUs_tEuPv\\wKxW~ + _, + clear=\EH\EJ, cub1=^H, cud1=\n, dch1=\EP, ich1=\EQ, kbs=^?, + kdch1=\Ee, kf1=\Ef1, kf10=\Ef0, kf2=\Ef2, kf3=\Ef3, kf4=\Ef4, + kf5=\Ef5, kf6=\Ef6, kf7=\Ef7, kf8=\Ef8, kf9=\Ef9, kich1=\Ed, + knp=\Eh, kpp=\Eg, rev=\ET, ri=\ES, rmacs=\EG, rmso=\EX, + sgr0=\EX, smacs=\EF, smso=\ET, use=vt52-basic, +env230|envision230|envision 230 graphics terminal, + xenl@, + enacs@, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rmacs@, + sgr=\E[0%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t; + 1%;m$<2>, + sgr0=\E[0m$<2>, smacs@, smso=\E[7m, use=vt100+4bsd, +# These execuports were impact-printer ttys with a 30- or maybe 15-cps acoustic +# coupler attached, the whole rig fitting in a suitcase and more or less +# portable. Hot stuff for c.1977 :-) -- esr +ep48|ep4080|execuport 4080, + OTbs, am, os, + cols#80, + bel=^G, cr=\r, cub1=^H, cud1=\n, hd=^\, hu=^^, ind=\n, +ep40|ep4000|execuport 4000, + cols#136, use=ep4080, +# Adam Thompson tells us: +# Informer series - these are all portable units, resembling older +# automatic bread-baking machines. The terminal looks like a `clamshell' +# design, but isn't. The structure is similar to the Direct terminals, +# but only half the width. The entire unit is only about 10" wide. +# It features an 8" screen (6" or 7" if you have color!), and an 9"x6" +# keyboard. All the keys are crammed together, much like some laptop +# PCs today, but perhaps less well organized...all these units have a +# bewildering array of plugs on the back, including a built-in modem. +# The 305 was a color version of the 304; the 306 and 307 were mono and +# color terminals built for IBM bisync protocols. +# From: Paul Leondis +ifmr|Informer D304, + OTbs, am, + cols#80, lines#24, + clear=\EZ, cub1=^H, cud1=\n, cuf1=\EC, + cup=\EY%p2%{32}%+%c%p1%{32}%+%c, cuu1=\EA, dch1=\E\\, + ed=\E/, el=\EQ, home=\EH, ich1=\E[, ri=\En, rmso=\EK, sgr0=\EK, + smso=\EJ, +# Entry largely based on wy60 and has the features of wy60ak. +opus3n1+|Esprit Opus3n1+ in wy60 mode with ANSI arrow keys, + am, bw, hs, km, mir, msgr, ul, xon, + cols#80, lh#1, lines#24, lw#8, nlab#8, wsl#80, + acsc=0wa_h[jukslrmqnxqzttuyv]wpxv, bel=^G, blink=\EG2, + cbt=\EI, civis=\E`0, clear=\E*$<100>, cnorm=\E`1, cr=\r, + cub1=^H, cud1=\n, cuf1=^L, cup=\Ea%i%p1%dR%p2%dC, cuu1=^K, + dch1=\EW$<11>, dim=\EGp, dl1=\ER$<5>, dsl=\Ez(\r, + ed=\EY$<100>, el=\ET, fsl=\r, home=\036$<2>, ht=\011$<5>, + hts=\E1, if=/usr/share/tabset/std, il1=\EE$<4>, ind=\n, + ip=$<3>, + is2=\E`:\Ee(\EO\Ee6\Ec41\E~4\Ec21\Ed/\Ezz&\E[A\177\Ezz'\E[B + \177\Ezz(\E[D\177\Ezz)\E[C\177\Ezz<\E[Q\177\Ezz`\E[F + \177\EA1*\EZH12, + kHOM=\E{, kcbt=\EI, kdch1=\EW, kdl1=\ER, ked=\EY, kel=\ET, + kend=\E[F, kent=\E7, kf1=^A@\r, kf10=^AI\r, kf11=^AJ\r, + kf12=^AK\r, kf13=^AL\r, kf14=^AM\r, kf15=^AN\r, kf16=^AO\r, + kf2=^AA\r, kf3=^AB\r, kf4=^AC\r, kf5=^AD\r, kf6=^AE\r, + kf7=^AF\r, kf8=^AG\r, kf9=^AH\r, khome=^^, kich1=\EQ, + kil1=\EE, knp=\EK, kpp=\EJ, kprt=\EP, krpl=\Er, mc0=\EP, + mc4=^T, mc5=^R, nel=\r\n$<3>, + pfloc=\EZ2%p1%{63}%+%c%p2%s\177, + pfx=\EZ1%p1%{63}%+%c%p2%s\177, + pln=\Ez%p1%{47}%+%c%p2%s\r, prot=\E), ri=\Ej$<7>, + rmacs=\EH^C, rmam=\Ed., rmcup=, rmir=\Er, rmln=\EA11, + rmxon=\Ec20, rs1=\E~!\E~4$<150>, rs2=\EeF$<150>, + rs3=\EwG\Ee($<150>, + sgr=%?%p8%t\E)%e\E(%;%?%p9%t\EH\002%e\EH\003%;\EG%{48}%?%p2 + %t%{8}%|%;%?%p1%p3%|%t%{4}%|%;%?%p4%t%{2}%|%;%?%p1%p5%| + %t%{64}%|%;%?%p7%t%{1}%|%;%c, + sgr0=\E(\EH\003\EG0\EcD, smacs=\EH^B, smam=\Ed/, + smcup=\Ezz&\E[A\177\Ezz'\E[B\177\Ezz(\E[D\177\Ezz)\E[C\177 + \Ezz<\E[Q\177, + smir=\Eq, smln=\EA10, smxon=\Ec21, tbc=\E0, tsl=\Ez(, + uc=\EG8\EG0, use=ansi+arrows, use=adm+sgr, + +teletec|Teletec Datascreen, + OTbs, am, + cols#80, lines#24, + bel=^G, clear=^L, cr=\r, cub1=^H, cud1=\n, cuf1=^_, cuu1=^K, + home=^^, ind=\n, +# From: Mark Dornfeld +# This description is for the LANPAR Technologies VISION 3220 +# terminal from 1984/85. The function key definitions k0-k5 represent the +# edit keypad: FIND, INSERT HERE, REMOVE, SELECT, PREV SCREEN, +# NEXT SCREEN. The key definitions k6-k9 represent the PF1 to PF4 keys. +# +# Kenneth Randell writes on 31 Dec 1998: +# I had a couple of scopes (3221) like this once where I used to work, around +# the 1987 time frame if memory serves me correctly. These scopes were made +# by an outfit called LANPAR Technologies, and were meant to me DEC VT 220 +# compatible. The 3220 was a plain text terminal like the VT-220, the 3221 +# was a like the VT-240 (monochrome with Regis + Sixel graphics), and the 3222 +# was like the VT-241 (color with Regis + Sixel Graphics). These terminals +# (3221) cost about $1500 each, and one was always broken -- had to be sent +# back to the shop for repairs. +# The only real advantage these scopes had over the VT-240's were: +# 1) They were faster in the Regis display, or at least the ones I did +# 2) They had a handy debugging feature where you could split-screen the +# scope, the graphics would appear on the top, and the REGIS commands would +# appear on the bottom. I don't remember the VT-240s being able to do that. +# I would swear that LANPAR Technologies was in MA someplace, but since I +# don't work at the same place anymore, and those terminals and manuals were +# long since junked, I cannot be any more sure than that. +# +# (v3220: removed obsolete ":kn#10:", +# I added / based on the init string -- esr) +v3220|LANPAR Vision II model 3220/3221/3222, + OTbs, am, mir, xenl, + cols#80, it#8, lines#24, + cub1=^H, cup=\E[%i%p1%d;%p2%dH, dch1=\E[P, dl1=\E[M, ht=^I, + il1=\E[L, is2=\E>\E[?3l\E[?7h\E[?8h\E[p, kcub1=\E[D, + kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, kf0=\E[1~, kf1=\E[2~, + kf2=\E[3~, kf3=\E[4~, kf4=\E[5~, kf5=\E[6~, kf6=\E[OP, + kf7=\E[OQ, kf8=\E[OR, kf9=\E[OS, khome=\E[H, ri=\EM, + rmam=\E[?7l, rmir=\E[4l, rmkx=\E>, rmso=\E[m, rmul=\E[m, + sgr0=\E[m, smam=\E[?7h, smir=\E[4h, smkx=\E=, smso=\E[7m, + smul=\E[4m, use=ansi+erase, use=ansi+local1, +######## ICH/ICH1 VERSUS RMIR/SMIR +# +# Some non-curses applications get confused if both ich/ich1 and rmir/smir +# are present; the symptom is doubled characters in an update using insert. +# These applications are technically correct; in both 4.3BSD termcap and +# terminfo, you're not actually supposed to specify both ich/ich1 and rmir/smir +# unless the terminal needs both. To my knowledge, no terminal still in this +# file requires both other than the very obsolete dm2500. +# +# For ncurses-based applications this is not a problem, as ncurses uses +# one or the other as appropriate but never mixes the two. Therefore we +# have not corrected entries like `linux' and `xterm' that specify both. +# If you see doubled characters from these, use the linux-nic and xterm-nic +# entries that suppress ich/ich1. And upgrade to ncurses! +# + +######## VT100/ANSI/ISO 6429/ECMA-48/PC-TERM TERMINAL STANDARDS +# +# ANSI X3.64 has been withdrawn and replaced by ECMA-48. The ISO 6429 and +# ECMA-48 standards are said to be almost identical, but are not the same +# as X3.64 (though for practical purposes they are close supersets of it). +# +# You can obtain ECMA-48 for free by sending email to helpdesk@ecma.ch +# requesting the standard(s) you want (i.e. ECMA-48, "Control Functions for +# Coded Character Sets"), include your snail-mail address, and you should +# receive the document in due course. Don't expect an email acknowledgment. +# +# Related standards include "X3.4-1977: American National Standard Code for +# Information Interchange" (the ASCII standard) and "X3.41.1974: +# Code-Extension Techniques for Use with the 7-Bit Coded Character Set of +# American National Standard for Information Interchange." I believe (but +# am not certain) that these are effectively identical to ECMA-6 and ECMA-35 +# respectively. +# + +#### VT100/ANSI/ECMA-48 +# +# ANSI Standard (X3.64) Control Sequences for Video Terminals and Peripherals +# and ECMA-48 Control Functions for Coded Character Sets. +# +# Much of the content of this comment is adapted from a table prepared by +# Richard Shuford, based on a 1984 Byte article. Terminfo correspondences, +# discussion of some terminfo-related issues, and updates to capture ECMA-48 +# have been added. Control functions described in ECMA-48 only are tagged +# with * after their names. +# +# The table is a complete list of the defined ANSI X3.64/ECMA-48 control +# sequences. In the main table, \E stands for an escape (\033) character, +# SPC for space. Pn stands for a single numeric parameter to be inserted +# in decimal ASCII. Ps stands for a list of such parameters separated by +# semicolons. Parameter meanings for most parameterized sequences are +# described in the notes. +# +# Sequence Sequence Parameter or +# Mnemonic Name Sequence Value Mode terminfo +# ----------------------------------------------------------------------------- +# APC Applicatn Program Command \E _ - Delim - +# BEL Bell * ^G - - bel +# BPH Break Permitted Here * \E B - * - +# BS BackSpace * ^H - EF - +# CAN Cancel * ^X - - - (A) +# CBT Cursor Backward Tab \E [ Pn Z 1 eF cbt +# CCH Cancel Previous Character \E T - - - +# CHA Cursor Horizntal Absolute \E [ Pn G 1 eF hpa (B) +# CHT Cursor Horizontal Tab \E [ Pn I 1 eF tab (C) +# CMD Coding Method Delimiter * \E +# CNL Cursor Next Line \E [ Pn E 1 eF nel (D) +# CPL Cursor Preceding Line \E [ Pn F 1 eF - +# CPR Cursor Position Report \E [ Pn ; Pn R 1, 1 - - (E) +# CSI Control Sequence Intro \E [ - Intro - +# CTC Cursor Tabulation Control \E [ Ps W 0 eF - (F) +# CUB Cursor Backward \E [ Pn D 1 eF cub +# CUD Cursor Down \E [ Pn B 1 eF cud +# CUF Cursor Forward \E [ Pn C 1 eF cuf +# CUP Cursor Position \E [ Pn ; Pn H 1, 1 eF cup (G) +# CUU Cursor Up \E [ Pn A 1 eF cuu +# CVT Cursor Vertical Tab \E [ Pn Y - eF - (H) +# DA Device Attributes \E [ Pn c 0 - - +# DAQ Define Area Qualification \E [ Ps o 0 - - +# DCH Delete Character \E [ Pn P 1 eF dch +# DCS Device Control String \E P - Delim - +# DL Delete Line \E [ Pn M 1 eF dl +# DLE Data Link Escape * ^P - - - +# DMI Disable Manual Input \E \ - Fs - +# DSR Device Status Report \E [ Ps n 0 - - (I) +# DTA Dimension Text Area * \E [ Pn ; Pn SPC T - PC - +# EA Erase in Area \E [ Ps O 0 eF - (J) +# ECH Erase Character \E [ Pn X 1 eF ech +# ED Erase in Display \E [ Ps J 0 eF ed (J) +# EF Erase in Field \E [ Ps N 0 eF - +# EL Erase in Line \E [ Ps K 0 eF el (J) +# EM End of Medium * ^Y - - - +# EMI Enable Manual Input \E b Fs - +# ENQ Enquire ^E - - - +# EOT End Of Transmission ^D - * - +# EPA End of Protected Area \E W - - - (K) +# ESA End of Selected Area \E G - - - +# ESC Escape ^[ - - - +# ETB End Transmission Block ^W - - - +# ETX End of Text ^C - - - +# FF Form Feed ^L - - - +# FNK Function Key * \E [ Pn SPC W - - - +# GCC Graphic Char Combination* \E [ Pn ; Pn SPC B - - - +# FNT Font Selection \E [ Pn ; Pn SPC D 0, 0 FE - +# GSM Graphic Size Modify \E [ Pn ; Pn SPC B 100, 100 FE - (L) +# GSS Graphic Size Selection \E [ Pn SPC C none FE - +# HPA Horz Position Absolute \E [ Pn ` 1 FE - (B) +# HPB Char Position Backward \E [ j 1 FE - +# HPR Horz Position Relative \E [ Pn a 1 FE - (M) +# HT Horizontal Tab * ^I - FE - (N) +# HTJ Horz Tab w/Justification \E I - FE - +# HTS Horizontal Tab Set \E H - FE hts +# HVP Horz & Vertical Position \E [ Pn ; Pn f 1, 1 FE - (G) +# ICH Insert Character \E [ Pn @ 1 eF ich +# IDCS ID Device Control String \E [ SPC O - * - +# IGS ID Graphic Subrepertoire \E [ SPC M - * - +# IL Insert Line \E [ Pn L 1 eF il +# IND Index \E D - FE - +# INT Interrupt \E a - Fs - +# JFY Justify \E [ Ps SPC F 0 FE - +# IS1 Info Separator #1 * ^_ - * - +# IS2 Info Separator #1 * ^^ - * - +# IS3 Info Separator #1 * ^] - * - +# IS4 Info Separator #1 * ^\ - * - +# LF Line Feed ^J - - - +# LS1R Locking Shift Right 1 * \E ~ - - - +# LS2 Locking Shift 2 * \E n - - - +# LS2R Locking Shift Right 2 * \E } - - - +# LS3 Locking Shift 3 * \E o - - - +# LS3R Locking Shift Right 3 * \E | - - - +# MC Media Copy \E [ Ps i 0 - - (S) +# MW Message Waiting \E U - - - +# NAK Negative Acknowledge * ^U - * - +# NBH No Break Here * \E C - - - +# NEL Next Line \E E - FE nel (D) +# NP Next Page \E [ Pn U 1 eF - +# NUL Null * ^@ - - - +# OSC Operating System Command \E ] - Delim - +# PEC Pres. Expand/Contract * \E Pn SPC Z 0 - - +# PFS Page Format Selection * \E Pn SPC J 0 - - +# PLD Partial Line Down \E K - FE - (T) +# PLU Partial Line Up \E L - FE - (U) +# PM Privacy Message \E ^ - Delim - +# PP Preceding Page \E [ Pn V 1 eF - +# PPA Page Position Absolute * \E [ Pn SPC P 1 FE - +# PPB Page Position Backward * \E [ Pn SPC R 1 FE - +# PPR Page Position Forward * \E [ Pn SPC Q 1 FE - +# PTX Parallel Texts * \E [ \ - - - +# PU1 Private Use 1 \E Q - - - +# PU2 Private Use 2 \E R - - - +# QUAD Typographic Quadding \E [ Ps SPC H 0 FE - +# REP Repeat Char or Control \E [ Pn b 1 - rep +# RI Reverse Index \E M - FE - (V) +# RIS Reset to Initial State \E c - Fs - +# RM Reset Mode * \E [ Ps l - - - (W) +# SACS Set Add. Char. Sep. * \E [ Pn SPC / 0 - - +# SAPV Sel. Alt. Present. Var. * \E [ Ps SPC ] 0 - - (X) +# SCI Single-Char Introducer \E Z - - - +# SCO Sel. Char. Orientation * \E [ Pn ; Pn SPC k - - - +# SCS Set Char. Spacing * \E [ Pn SPC g - - - +# SD Scroll Down \E [ Pn T 1 eF rin +# SDS Start Directed String * \E [ Pn ] 1 - - +# SEE Select Editing Extent \E [ Ps Q 0 - - (Y) +# SEF Sheet Eject & Feed * \E [ Ps ; Ps SPC Y 0,0 - - +# SGR Select Graphic Rendition \E [ Ps m 0 FE sgr (O) +# SHS Select Char. Spacing * \E [ Ps SPC K 0 - - +# SI Shift In ^O - - - (P) +# SIMD Sel. Imp. Move Direct. * \E [ Ps ^ - - - +# SL Scroll Left \E [ Pn SPC @ 1 eF - +# SLH Set Line Home * \E [ Pn SPC U - - - +# SLL Set Line Limit * \E [ Pn SPC V - - - +# SLS Set Line Spacing * \E [ Pn SPC h - - - +# SM Select Mode \E [ Ps h none - - (W) +# SO Shift Out ^N - - - (Q) +# SOH Start Of Heading * ^A - - - +# SOS Start of String * \E X - - - +# SPA Start of Protected Area \E V - - - (Z) +# SPD Select Pres. Direction * \E [ Ps ; Ps SPC S 0,0 - - +# SPH Set Page Home * \E [ Ps SPC G - - - +# SPI Spacing Increment \E [ Pn ; Pn SPC G none FE - +# SPL Set Page Limit * \E [ Ps SPC j - - - +# SPQR Set Pr. Qual. & Rapid. * \E [ Ps SPC X 0 - - +# SR Scroll Right \E [ Pn SPC A 1 eF - +# SRCS Set Reduced Char. Sep. * \E [ Pn SPC f 0 - - +# SRS Start Reversed String * \E [ Ps [ 0 - - +# SSA Start of Selected Area \E F - - - +# SSU Select Size Unit * \E [ Pn SPC I 0 - - +# SSW Set Space Width * \E [ Pn SPC [ none - - +# SS2 Single Shift 2 (G2 set) \E N - Intro - +# SS3 Single Shift 3 (G3 set) \E O - Intro - +# ST String Terminator \E \ - Delim - +# STAB Selective Tabulation * \E [ Pn SPC ^ - - - +# STS Set Transmit State \E S - - - +# STX Start pf Text * ^B - - - +# SU Scroll Up \E [ Pn S 1 eF indn +# SUB Substitute * ^Z - - - +# SVS Select Line Spacing * \E [ Pn SPC \ 1 - - +# SYN Synchronous Idle * ^F - - - +# TAC Tabul. Aligned Centered * \E [ Pn SPC b - - - +# TALE Tabul. Al. Leading Edge * \E [ Pn SPC a - - - +# TATE Tabul. Al. Trailing Edge* \E [ Pn SPC ` - - - +# TBC Tab Clear \E [ Ps g 0 FE tbc +# TCC Tabul. Centered on Char * \E [ Pn SPC c - - - +# TSR Tabulation Stop Remove * \E [ Pn SPC d - FE - +# TSS Thin Space Specification \E [ Pn SC E none FE - +# VPA Vert. Position Absolute \E [ Pn d 1 FE vpa +# VPB Line Position Backward * \E [ Pn k 1 FE - +# VPR Vert. Position Relative \E [ Pn e 1 FE - (R) +# VT Vertical Tabulation * ^K - FE - +# VTS Vertical Tabulation Set \E J - FE - +# +# --------------------------------------------------------------------------- +# +# Notes: +# +# Some control characters are listed in the ECMA-48 standard without +# being assigned functions relevant to terminal control there (they +# referred to other standards such as ISO 1745 or ECMA-35). They are listed +# here anyway for completeness. +# +# (A) ECMA-48 calls this "CancelCharacter" but retains the CCH abbreviation. +# +# (B) There seems to be some confusion abroad between CHA and HPA. Most +# `ANSI' terminals accept the CHA sequence, not the HPA. but terminfo calls +# the capability (hpa). ECMA-48 calls this "Cursor Character Absolute" but +# preserved the CHA abbreviation. +# +# (C) CHT corresponds to terminfo (tab). Usually it has the value ^I. +# Occasionally (as on, for example, certain HP terminals) this has the HTJ +# value. ECMA-48 calls this "Cursor Forward Tabulation" but preserved the +# CHT abbreviation. +# +# (D) terminfo (nel) is usually \r\n rather than ANSI \EE. +# +# (E) ECMA-48 calls this "Active Position Report" but preserves the CPR +# abbreviation. +# +# (F) CTC parameter values: +# 0 = set char tab, +# 1 = set line tab, +# 2 = clear char tab, +# 3 = clear line tab, +# 4 = clear all char tabs on current line, +# 5 = clear all char tabs, +# 6 = clear all line tabs. +# +# (G) CUP and HVP are identical in effect. Some ANSI.SYS versions accept +# HVP, but always allow CUP as an alternate. ECMA-48 calls HVP "Character +# Position Absolute" but retains the HVP abbreviation. +# +# (H) ECMA calls this "Cursor Line Tabulation" but preserves the CVT +# abbreviation. +# +# (I) DSR parameter values: +# 0 = ready, +# 1 = busy, +# 2 = busy, will send DSR later, +# 3 = malfunction, +# 4 = malfunction, will send DSR later, +# 5 = request DSR, +# 6 = request CPR response. +# +# (J) ECMA calls ED "Erase In Page". EA/ED/EL parameters: +# 0 = clear to end, +# 1 = clear from beginning, +# 2 = clear. +# +# (K) ECMA calls this "End of Guarded Area" but preserves the EPA abbreviation. +# +# (L) The GSM parameters are vertical and horizontal parameters to scale by. +# +# (M) Some ANSI.SYS versions accept HPR, but more commonly `ANSI' terminals +# use CUF for this function and ignore HPR. ECMA-48 calls this "Character +# Position Relative" but retains the HPR abbreviation. +# +# (N) ECMA-48 calls this "Character Tabulation" but retains the HT +# abbreviation. +# +# (O) SGR parameter values: +# 0 = default mode (attributes off), +# 1 = bold, +# 2 = dim, +# 3 = italicized, +# 4 = underlined, +# 5 = slow blink, +# 6 = fast blink, +# 7 = reverse video, +# 8 = invisible, +# 9 = crossed-out (marked for deletion), +# 10 = primary font, +# 10 + n (n in 1..9) = nth alternative font, +# 20 = Fraktur, +# 21 = double underline, +# 22 = turn off 2, +# 23 = turn off 3, +# 24 = turn off 4, +# 25 = turn off 5, +# 26 = proportional spacing, +# 27 = turn off 7, +# 28 = turn off 8, +# 29 = turn off 9, +# 30 = black fg, +# 31 = red fg, +# 32 = green fg, +# 33 = yellow fg, +# 34 = blue fg, +# 35 = magenta fg, +# 36 = cyan fg, +# 37 = white fg, +# 38 = set fg color as in CCITT T.416, +# 39 = set default fg color, +# 40 = black bg +# 41 = red bg, +# 42 = green bg, +# 43 = yellow bg, +# 44 = blue bg, +# 45 = magenta bg, +# 46 = cyan bg, +# 47 = white bg, +# 48 = set bg color as in CCITT T.416, +# 49 = set default bg color, +# 50 = turn off 26, +# 51 = framed, +# 52 = encircled, +# 53 = overlined, +# 54 = turn off 51 & 52, +# 55 = not overlined, +# 56-59 = reserved, +# 61-65 = variable highlights for ideograms. +# +# (P) SI is also called LSO, Locking Shift Zero. +# +# (Q) SI is also called LS1, Locking Shift One. +# +# (R) Some ANSI.SYS versions accept VPR, but more commonly `ANSI' terminals +# use CUD for this function and ignore VPR. ECMA calls it `Line Position +# Absolute' but retains the VPA abbreviation. +# +# (S) MC parameters: +# 0 = start xfer to primary aux device, +# 1 = start xfer from primary aux device, +# 2 = start xfer to secondary aux device, +# 3 = start xfer from secondary aux device, +# 4 = stop relay to primary aux device, +# 5 = start relay to primary aux device, +# 6 = stop relay to secondary aux device, +# 7 = start relay to secondary aux device. +# +# (T) ECMA-48 calls this "Partial Line Forward" but retains the PLD +# abbreviation. +# +# (U) ECMA-48 calls this "Partial Line Backward" but retains the PLU +# abbreviation. +# +# (V) ECMA-48 calls this "Reverse Line Feed" but retains the RI abbreviation. +# +# (W) RM/SM modes are as follows: +# 1 = Guarded Area Transfer Mode (GATM), +# 2 = Keyboard Action Mode (KAM), +# 3 = Control Representation Mode (CRM), +# 4 = Insertion Replacement Mode (IRM), +# 5 = Status Report Transfer Mode (SRTM), +# 6 = Erasure Mode (ERM), +# 7 = Line Editing Mode (LEM), +# 8 = Bi-Directional Support Mode (BDSM), +# 9 = Device Component Select Mode (DCSM), +# 10 = Character Editing Mode (HEM), +# 11 = Positioning Unit Mode (PUM), +# 12 = Send/Receive Mode (SRM), +# 13 = Format Effector Action Mode (FEAM), +# 14 = Format Effector Transfer Mode (FETM), +# 15 = Multiple Area Transfer Mode (MATM), +# 16 = Transfer Termination Mode (TTM), +# 17 = Selected Area Transfer Mode (SATM), +# 18 = Tabulation Stop Mode (TSM), +# 19 = Editing Boundary Mode (EBM), +# 20 = Line Feed New Line Mode (LF/NL), +# 21 = Graphic Rendition Combination Mode (GRCM), +# 22 = Zero Default Mode (ZDM). +# +# The EBM and LF/NL modes have actually been removed from ECMA-48's 5th edition +# but are listed here for reference. +# +# (X) Select Alternate Presentation Variants is used only for non-Latin +# alphabets. +# +# (Y) "Select Editing Extent" (SEE) was ANSI "Select Edit Extent Mode" (SEM). +# +# (Z) ECMA-48 calls this "Start of Guarded Area" but retains the SPA +# abbreviation. +# +# --------------------------------------------------------------------------- +# +# Abbreviations: +# +# Intro an Introducer of some kind of defined sequence; the normal 7-bit +# X3.64 Control Sequence Introducer is the two characters "Escape [" +# +# Delim a Delimiter +# +# x/y identifies a character by position in the ASCII table (column/row) +# +# eF editor function (see explanation) +# +# FE format effector (see explanation) +# +# F is a Final character in +# an Escape sequence (F from 3/0 to 7/14 in the ASCII table) +# a control sequence (F from 4/0 to 7/14) +# +# Gs is a graphic character appearing in strings (Gs ranges from +# 2/0 to 7/14) in the ASCII table +# +# Ce is a control represented as a single bit combination in the C1 set +# of controls in an 8-bit character set +# +# C0 the familiar set of 7-bit ASCII control characters +# +# C1 roughly, the set of control chars available only in 8-bit systems. +# This is too complicated to explain fully here, so read Jim Fleming's +# article in the February 1983 BYTE, especially pages 214 through 224. +# +# Fe is a Final character of a 2-character Escape sequence that has an +# equivalent representation in an 8-bit environment as a Ce-type +# (Fe ranges from 4/0 to 5/15) +# +# Fs is a Final character of a 2-character Escape sequence that is +# standardized internationally with identical representation in 7-bit +# and 8-bit environments and is independent of the currently +# designated C0 and C1 control sets (Fs ranges from 6/0 to 7/14) +# +# I is an Intermediate character from 2/0 to 2/15 (inclusive) in the +# ASCII table +# +# P is a parameter character from 3/0 to 3/15 (inclusive) in the ASCII +# table +# +# Pn is a numeric parameter in a control sequence, a string of zero or +# more characters ranging from 3/0 to 3/9 in the ASCII table +# +# Ps is a variable number of selective parameters in a control sequence +# with each selective parameter separated from the other by the code +# 3/11 (which usually represents a semicolon); Ps ranges from +# 3/0 to 3/9 and includes 3/11 +# +# * Not relevant to terminal control, listed for completeness only. +# +# Format Effectors versus Editor Functions +# +# A format effector specifies how following output is to be displayed. +# An editor function allows you to modify the display. Informally +# format effectors may be destructive; format effectors should not be. +# +# For instance, a format effector that moves the "active position" (the +# cursor or equivalent) one space to the left would be useful when you want to +# create an overstrike, a compound character made of two standard characters +# overlaid. Control-H, the Backspace character, is actually supposed to be a +# format effector, so you can do this. But many systems use it in a +# nonstandard fashion, as an editor function, deleting the character to the +# left of the cursor and moving the cursor left. When Control-H is assumed to +# be an editor function, you cannot predict whether its use will create an +# overstrike unless you also know whether the output device is in an "insert +# mode" or an "overwrite mode". When Control-H is used as a format effector, +# its effect can always be predicted. The familiar characters carriage +# return, linefeed, formfeed, etc., are defined as format effectors. +# +# NOTES ON THE DEC VT100 IMPLEMENTATION +# +# Control sequences implemented in the VT100 are as follows: +# +# CPR, CUB, CUD, CUF, CUP, CUU, DA, DSR, ED, EL, HTS, HVP, IND, +# LNM, NEL, RI, RIS, RM, SGR, SM, TBC +# +# plus several private DEC commands. +# +# Erasing parts of the display (EL and ED) in the VT100 is performed thus: +# +# Erase from cursor to end of line Esc [ 0 K or Esc [ K +# Erase from beginning of line to cursor Esc [ 1 K +# Erase line containing cursor Esc [ 2 K +# Erase from cursor to end of screen Esc [ 0 J or Esc [ J +# Erase from beginning of screen to cursor Esc [ 1 J +# Erase entire screen Esc [ 2 J +# +# Some brain-damaged terminal/emulators respond to Esc [ J as if it were +# Esc [ 2 J, but this is wrong; the default is 0. +# +# The VT100 responds to receiving the DA (Device Attributes) control +# +# Esc [ c (or Esc [ 0 c) +# +# by transmitting the sequence +# +# Esc [ ? l ; Ps c +# +# where Ps is a character that describes installed options. +# +# The VT100's cursor location can be read with the DSR (Device Status +# Report) control +# +# Esc [ 6 n +# +# The VT100 reports by transmitting the CPR sequence +# +# Esc [ Pl ; Pc R +# +# where Pl is the line number and Pc is the column number (in decimal). +# +# The specification for the DEC VT100 is document EK-VT100-UG-003. + +#### ANSI.SYS +# +# Here is a description of the color and attribute controls supported in the +# the ANSI.SYS driver under MS-DOS. Most console drivers and ANSI +# terminal emulators for Intel boxes obey these. They are a proper subset +# of the ECMA-48 escapes. +# +# 0 all attributes off +# 1 foreground bright +# 4 underscore on +# 5 blink on/background bright (not reliable with brown) +# 7 reverse-video +# 8 set blank (non-display) +# 10 set primary font +# 11 set first alternate font (on PCs, display ROM characters 1-31) +# 12 set second alternate font (on PCs, display IBM high-half chars) +# +# Color attribute sets +# 3n set foreground color / 0=black, 1=red, 2=green, 3=brown, +# 4n set background color \ 4=blue, 5=magenta, 6=cyan, 7=white +# Bright black becomes gray. Bright brown becomes yellow, +# These coincide with the prescriptions of the ISO 6429/ECMA-48 standard. +# +# * If the 5 attribute is on and you set a background color (40-47) it is +# supposed to enable bright background. +# +# * Many VGA cards (such as the Paradise and compatibles) do the wrong thing +# when you try to set a "bright brown" (yellow) background with attribute +# 5 (you get a blinking yellow foreground instead). A few displays +# (including the System V console) support an attribute 6 that undoes this +# braindamage (this is required by iBCS2). +# +# * Some older versions of ANSI.SYS have a bug that causes them to require +# ESC [ Pn k as EL rather than the ANSI ESC [ Pn K. (This is not ECMA-48 +# compatible.) + +#### Intel Binary Compatibility Standard +# +# For comparison, here are the capabilities implied by the Intel Binary +# Compatibility Standard for UNIX systems (Intel order number 468366-001). +# These recommendations are optional. IBCS2 allows the leading escape to +# be either the 7-bit \E[ or 8-bit \0233 introducer, in accordance with +# the ANSI X.364/ISO 6429/ECMA-48 standard. Here are the iBCS2 capabilities +# (as described in figure 9-3 of the standard). Those expressed in the ibcs2 +# terminfo entry are followed with the corresponding capability in parens: +# +# CSI k disable (n=0) or enable (n=1) keyclick +# CSI 2h lock keyboard +# CSI 2i send screen as input +# CSI 2l unlock keyboard +# CSI 6m enable background color intensity +# CSI <0-2>c reserved +# CSI <0-59>m select graphic rendition +# CSI ;H (cup) cursor to line n and column m +# CSI ;f cursor to line n and column m +# CSI @ (ich) insert characters +# CSI A (cuu) cursor up n lines +# CSI B (cud) cursor down n lines +# CSI C (cuu) cursor right n characters +# CSI D (cud) cursor left n characters +# CSI E cursor down n lines and in first column +# CSI F cursor up n lines and in first column +# CSI G (hpa) position cursor at column n-1 +# CSI J (ed) erase in display +# CSI K (el) erase in line +# CSI L (il) insert line(s) +# CSI P (dch) delete characters +# CSI S (indn) scroll up n lines +# CSI T (rin) scroll down n lines +# CSI X (ech) erase characters +# CSI Z (cbt) back up n tab stops +# CSI ` cursor to column n on line +# CSI a (cuu) cursor right n characters +# CSI d (vpa) cursor to line n +# CSI e cursor down n lines and in first column +# CSI g (cbt) clear all tabs +# CSI z make virtual terminal n active +# CSI ?7h (smam) turn automargin on +# CSI ?7l (rmam) turn automargin off +# CSI s save cursor position +# CSI u restore cursor position to saved value +# CSI =A set overscan color +# CSI =F set normal foreground color +# CSI =G set normal background color +# CSI =H set reverse foreground color +# CSI =I set reverse foreground color +# CSI =J set graphic foreground color +# CSI =K set graphic foreground color +# CSI =g (dispc) display n from alternate graphics character set +# CSI =

;B set bell parameters +# CSI =;C set cursor parameters +# CSI =D enable/disable intensity of background color +# CSI =E set/clear blink vs. bold background +# CSI 7 (sc) (sc) save cursor position +# CSI 8 (rc) (rc) restore cursor position to saved value +# CSI H (hts) (hts) set tab stop +# CSI Q define function key string +# (string must begin and end with delimiter char) +# CSI c (clear) clear screen +# +# The lack of any specification for attributes in SGR (among other things) +# makes this a wretchedly weak standard. The table above is literally +# everything iBSC2 has to say about terminal escape sequences; there is +# no further discussion of their meaning or how to set the parameters +# in these sequences at all. +# + +######## NONSTANDARD CAPABILITY TRANSLATIONS USED IN THIS FILE +# +# The historical termcap file entries were written primarily in 4.4BSD termcap. +# The 4.4BSD termcap set was substantially larger than the original 4.1BSD set, +# with the extension names chosen for compatibility with the termcap names +# assigned in System V terminfo. There are some variant extension sets out +# there. We try to describe them here. +# +#### XENIX extensions: +# +# The XENIX extensions include a set of function-key capabilities as follows: +# +# code XENIX variable name terminfo name name clashes? +# ---- ------------------- ------------- ----------------------- +# CL key_char_left +# CR key_char_right +# CW key_change_window create_window +# EN key_end kend +# HM key_home khome +# HP ?? +# LD key_delete_line kdl1 +# LF key_linefeed label_off +# NU key_next_unlocked_cell +# PD key_page_down knp +# PL ?? +# PN start_print mc5 +# PR ?? +# PS stop_print mc4 +# PU key_page_up kpp pulse +# RC key_recalc remove_clock +# RF key_toggle_ref req_for_input +# RT key_return kent +# UP key_up_arrow kcuu1 parm_up_cursor +# WL key_word_left +# WR key_word_right +# +# The XENIX extensions also include the following character-set and highlight +# capabilities: +# +# XENIX terminfo function +# ----- -------- ------------------------------ +# GS smacs start alternate character set +# GE rmacs end alternate character set +# GG :as:/:ae: glitch (analogous to :sg:/:ug:) +# bo blink begin blink (not used in /etc/termcap) +# be end blink (not used in /etc/termcap) +# bb blink glitch (not used in /etc/termcap) +# it dim begin dim (not used in /etc/termcap) +# ie end dim (not used in /etc/termcap) +# ig dim glitch (not used in /etc/termcap) +# +# Finally, XENIX also used the following forms-drawing capabilities: +# +# single double type ASCII approximation +# ------ ------ ------------- ------------------- +# GV Gv vertical line | +# GH Gv horizontal line - _ +# G1 G5 top right corner _ | +# G2 G6 top left corner | +# G3 G7 bottom left corner |_ +# G4 G8 bottom right corner _| +# GD Gd down-tick character T +# GL Gl left-tick character -| +# GR Gr right-tick character |- +# GC Gc middle intersection -|- +# GU Gu up-tick character _|_ +# +# These were invented to take advantage of the IBM PC ROM character set. One +# can compose an acsc string from the single-width characters as follows +# "j{G4}k{G1}l{G2}m{G3}q{GH}x{GV}t{GR}u{GL}v{GU}w{GD}n{GC}" +# When translating a termcap file, ncurses tic will do this automatically. +# The double forms characters don't fit the SVr4 terminfo model. +# +#### AT&T Extensions: +# +# The old AT&T 5410, 5420, 5425, pc6300plus, 610, and s4 entries used a set of +# nonstandard capabilities. Its signature is the KM capability, used to name +# some sort of keymap file. EE, BO, CI, CV, XS, DS, FL and FE are in this +# set. Comments in the original, and a little cross-checking with other AT&T +# documentation, seem to establish that BO=:mr: (start reverse video), DS=:mh: +# (start dim), XS=:mk: (secure/invisible mode), EE=:me: (end highlights), +# FL=:LO: (enable soft labels), FE=:LF: (disable soft labels), CI=:vi: (make +# cursor invisible), and CV=:ve: (make cursor normal). +# +#### HP Extensions +# +# The HP library (as of mid-1995, their term.h file version 70.1) appears to +# have the System V capabilities up to SVr1 level. After that, it supports +# two nonstandard caps meml and memu corresponding to the old termcap :ml:, +# :mu: capabilities. After that, it supports caps plab_norm, label_on, +# label_off, and key_f11..key_f63 capabilities like SVr4's. This makes the +# HP binary format incompatible with SVr4's. +# +#### IBM Extensions +# +# There is a set of nonstandard terminfos used by IBM's AIX operating system. +# The AIX terminfo library diverged from SVr1 terminfo, and replaces all +# capabilities following prtr_non with the following special capabilities: +# box[12], batt[12], colb[0123456789], colf[0123456789], f[01234567], kbtab, +# kdo, kcmd, kcpn, kend, khlp, knl, knpn, kppn, kppn, kquit, ksel, kscl, kscr, +# ktab, kmpf[123456789], apstr, ksf1..ksf10, kf11...kf63, kact, topl, btml, +# rvert, lvert. Some of these are identical to XPG4/SVr4 equivalents: +# kcmd, kend, khlp, and kf11...kf63. Two others (kbtab and ksel) can be +# renamed (to kcbt and kslt). The places in the box[12] capabilities +# correspond to acsc chars, here is the mapping: +# +# box1[0] = ACS_ULCORNER +# box1[1] = ACS_HLINE +# box1[2] = ACS_URCORNER +# box1[3] = ACS_VLINE +# box1[4] = ACS_LRCORNER +# box1[5] = ACS_LLCORNER +# box1[6] = ACS_TTEE +# box1[7] = ACS_RTEE +# box1[8] = ACS_BTEE +# box1[9] = ACS_LTEE +# box1[10] = ACS_PLUS +# +# The box2 characters are the double-line versions of these forms graphics. +# The AIX binary terminfo format is incompatible with SVr4's. +# +#### Iris console extensions: +# +# HS is half-intensity start; HE is half-intensity end +# CT is color terminal type (for Curses & rogue) +# CP is color change escape sequence +# CZ are color names (for Curses & rogue) +# +# The ncurses tic utility recognizes HS as an alias for mh . +# +#### TC Extensions: +# +# There is a set of extended termcaps associated with something +# called the "Terminal Control" or TC package created by MainStream Systems, +# Winfield Kansas. This one also uses GS/GE for as/ae, and also uses +# CF for civis and CO for cvvis. Finally, they define a boolean :ct: +# that flags color terminals. +# +######## NCURSES USER-DEFINABLE CAPABILITIES +# +# Extensions added after ncurses 5.0 generally use the "-x" option of tic and +# infocmp to manipulate user-definable capabilities. Those that are intended +# for use in either terminfo or termcap use 2-character names. Extended +# function keys do not use 2-character names, and are available only with +# terminfo. +# +# Beginning in 2010, NetBSD curses has also provided a "-x" option for +# tic/infocmp, and uses this database (with a few changes). There are a few +# differences, noted in +# https://invisible-island.net/ncurses/ncurses-netbsd.html +# +# ncurses makes explicit checks for a few user-definable capabilities: AX, E3, +# RGB, U8, XM, which are documented in the user_caps(5) manual page. +# +#### SCREEN Extensions: +# +# The screen program uses the termcap interface. It recognizes a few useful +# nonstandard capabilities. Those are used in this file. +# +# AX (bool) Does understand ANSI set default fg/bg color (\E[39m / +# \E[49m). +# G0 (bool) Terminal can deal with ISO 2022 font selection sequences. +# E0 (str) Switch charset 'G0' back to standard charset. +# S0 (str) Switch charset 'G0' to the specified charset. +# XT (bool) Terminal understands special xterm sequences (OSC, mouse +# tracking). +# +# AX is relatively straightforward; it is interpreted by ncurses to say that +# SGR 39/49 reset the terminal's foreground and background colors to their +# "default". +# +# XT is harder, since screen's manpage does not give more details. For that, +# we must read screen's source-code. For example, when XT is set, screen +# assumes +# +# a) OSC 1 sets the title string, e.g., for the icon. Recent versions of +# screen may also set the terminal's name, which is (for xterm) distinct +# from the icon name. +# b) OSC 20 sets the background pixmap. This is an rxvt feature. +# c) OSC 39 and OSC 49 set the default foreground/background colors. Again +# this is an rxvt feature. +# d) certain mode settings enable the mouse: 9, 1000, 1001, 1002, 1003. +# These are from xterm, although xterm accepts mouse codes that may not be +# recognized by screen, e.g., 1005, 1006. +# e) colors beyond 0..7 are implemented by xterm's aixterm-like 16-color +# sequence. However, because screen uses only termcap, the values returned +# by Af/Ab are not usable because they rely on expressions that termcap +# does not support. Therefore, screen uses a hardcoded string to work +# around the limitation. In a few cases, screen also uses tparm, which +# is a terminfo function rather than termcap. +# f) all entries named "*xterm*" or "*rxvt*" have the bce flag set. +# g) screen also uses the feature to decide whether to pay attention to other +# xterm-related features which are unrelated to the description in the +# manual page. +# +# Since XT is useful only when the outer terminal matches screen's assumptions, +# it is appropriate to use it in the derived terminal descriptions such as +# "screen.xterm", but not in the generic "screen", "screen-bce" entries. +# +# The other ISO-2022 features are rarely used, but provided here to make +# screen's termcap features available. +# +#### XTERM Extensions: +# +# For a discussion of "xterm", "xterm-256color" as values for TERM, see +# https://invisible-island.net/ncurses/ncurses.faq.html#xterm_generic +# https://invisible-island.net/ncurses/ncurses.faq.html#xterm_256color +# +# For xterm control sequences, see +# https://invisible-island.net/xterm/ctlseqs/ctlseqs.html +# +# For function-keys with modifiers, see +# https://invisible-island.net/ncurses/ncurses.faq.html#modified_keys +# +# For a discussion of "bracketed paste", see +# https://invisible-island.net/xterm/xterm-paste64.html +# +# Most of the xterm extensions are for function-keys. Since xterm patch #94 (in +# 1999), xterm has supported shift/control/alt/meta modifiers which produce +# additional function-key strings. Some other developers copied the feature, +# though they did not follow xterm's lead in xterm patch #167 (in 2002), to make +# these key definitions less ambiguous. +# +# A few terminals provide similar functionality (sending distinct keys when +# a modifier is used), including rxvt. +# +# These are the extended keys defined in this file: +# +# kDC3 kDC4 kDC5 kDC6 kDC7 kDN kDN3 kDN4 kDN5 kDN6 kDN7 kEND3 kEND4 kEND5 kEND6 +# kEND7 kHOM3 kHOM4 kHOM5 kHOM6 kHOM7 kIC3 kIC4 kIC5 kIC6 kIC7 kLFT3 kLFT4 +# kLFT5 kLFT6 kLFT7 kNXT3 kNXT4 kNXT5 kNXT6 kNXT7 kPRV3 kPRV4 kPRV5 kPRV6 kPRV7 +# kRIT3 kRIT4 kRIT5 kRIT6 kRIT7 kUP kUP3 kUP4 kUP5 kUP6 kUP7 kxIN kxOUT ka2 kb1 +# kb3 kc2 +# +# Bracketed paste is described with these capabilities in vim: +# +# BE enables bracketed paste +# BD disables bracketed paste +# PS is sent before the pasted text +# PE is sent after the pasted text +# +# vim also uses these names for xterm focus: +# +# fe enables focus events +# fd disables focus events +# +# Here are the other xterm-related extensions which are used in this file: +# +# Cr is a string capability which resets the cursor color +# Cs is a string capability which sets the cursor color to a given value. +# The single string parameter is the color name/number, according to the +# implementation. +# Ms modifies the selection/clipboard. Its parameters are +# p1 = the storage unit (clipboard, selection or cut buffer) +# p2 = the base64-encoded clipboard content. +# RV requests the terminal to report secondary device attributes (i.e, version). +# rv shows the format of the terminal responses, as a regular expression. +# Se resets the cursor style to the terminal power-on default. +# Ss is a string capability with one numeric parameter. It is used to set the +# cursor style as described by the DECSCUSR function to a block or +# underline. +# TS is a string capability which acts like "tsl", but uses no parameter and +# goes to the first column of the "status line". +# XF is set/true for terminals which support the xterm focus-in/focus-out +# escape sequences sent from the terminal to the host when private mode +# 1004 is set. Those are defined as kxIN and kxOUT, to take advantage of +# ncurses keypad mode to interpret them like a function key. Because the +# 1004 mode is usually combined with other flags to set the mouse protocol, +# this flag provides an application with the information that the focus +# mode is assumed to be set, e.g., in XM. +# XM is a string capability which overrides ncurses's built-in string which +# enables/disables xterm mouse mode. +# xm shows the format of the mouse responses. Parameters: +# p1 = y-ordinate +# p2 = x-ordinate +# p3 = button +# p4 = state, e.g., pressed or released +# p5 = y-ordinate starting region +# p6 = x-ordinate starting region +# p7 = y-ordinate ending region +# p8 = x-ordinate ending region +# Other extensions, used in xm: +# %u = UTF-8 +# XR requests the terminal to report its version as a free-format string. +# xr shows the format of the terminal responses, as a regular expression. +# +#### Miscellaneous extensions: +# +# csr clears the status line +# gsbom/grbom are used to enable/disable real bold (not intensity bright) mode. +# This was implemented for the Hurd. +# rmxx/smxx describes the ECMA-48 strikeout/crossed-out attributes, as an +# experimental feature of tmux. +# CO gives the number of indexed ("ANSI") colors which overlay an RGB color +# space. +# E3 clears the terminal's scrollback buffer. This was implemented in the +# Linux 3.0 kernel as a security feature. It matches a feature which was +# added in xterm patch #107. +# NQ denotes a terminal which does not support the standard query/response used +# in u6/u7 (cursor position) and u8/u9 (device attributes). +# U8 is a numeric capability which denotes a terminal emulator which does not +# support VT100 SI/SO when processing UTF-8 encoding. Set this to a nonzero +# value to enable it. +# Smulx modifies the appearance of underlines in VTE, December 2017. +# +######## CHANGE HISTORY +# +# The last /etc/termcap version maintained by John Kunze was 8.3, dated 8/5/94. +# Releases 9 and 10 (up until the release of ncurses 4.2 in 1998) were +# maintained by Eric S. Raymond as part of the ncurses project. +# +# This file contains all the capability information present in John Kunze's +# last version of the termcap master file, except as noted in the change +# comments at end of file. Some information about very ancient obsolete +# capabilities has been moved to comments. Some all-numeric names of older +# terminals have been retired. +# +# I changed :MT: to :km: (the 4.4BSD name) everywhere. I commented out some +# capabilities (EP, dF, dT, dV, kn, ma, ml, mu, xr, xx) that are no longer +# used by BSD curses. +# +# The 9.1.0 version of this file was translated from my lightly-edited copy of +# 8.3, then mechanically checked against 8.3 using Emacs Lisp code written for +# the purpose. Unless the ncurses tic implementation and the Lisp code were +# making perfectly synchronized mistakes which I then failed to catch by +# eyeball, the translation was correct and perfectly information-preserving. +# +# Major version number bumps correspond to major version changes in ncurses. +# +# Here is a log of the changes since then: +# +# 9.1.0 (Wed Feb 1 04:50:32 EST 1995): +# * First terminfo master translated from 8.3. +# 9.2.0 (Wed Feb 1 12:21:45 EST 1995): +# * Replaced Wyse entries with updated entries supplied by vendor. +# +# 9.3.0 (Mon Feb 6 19:14:40 EST 1995): +# * Added contact & status info from G. Clark Brown . +# 9.3.1 (Tue Feb 7 12:00:24 EST 1995): +# * Better XENIX keycap translation. Describe TC termcaps. +# * Contact and history info supplied by Qume. +# 9.3.2 (Sat Feb 11 23:40:02 EST 1995): +# * Raided the Shuford FTP site for recent termcaps/terminfos. +# * Added information on X3.64 and VT100 standard escape sequences. +# 9.3.3 (Mon Feb 13 12:26:15 EST 1995): +# * Added a correct X11R6 xterm entry. +# * Fixed terminfo translations of padding. +# 9.3.4 (Wed Feb 22 19:27:34 EST 1995): +# * Added correct acsc/smacs/rmacs strings for vt100 and xterm. +# * Added u6/u7/u8/u9 capabilities. +# * Added PCVT entry. +# 9.3.5 (Thu Feb 23 09:37:12 EST 1995): +# * Emacs uses :so:, not :mr:, for its mode line. Fix linux entry +# to use reverse-video standout so Emacs will look right. +# * Added el1 capability to ansi. +# * Added smacs/rmacs to ansi.sys. +# +# 9.4.0 (Sat Feb 25 16:43:25 EST 1995): +# * New mt70 entry. +# * Added COPYRIGHTS AND OTHER DELUSIONS. +# * Added AT&T 23xx & 500/513, vt220 and vt420, opus3n1+, netronics +# smartvid & smarterm, ampex 175 & 219 & 232, +# env230, falco ts100, fluke, intertube, superbrain, ncr7901, vic20, +# ozzie, trs200, tr600, Tandy & Texas Instruments VDTs, intext2, +# screwpoint, fviewpoint, Contel Business Systems, Datamedia Colorscan, +# adm36, mime314, ergo4000, ca22851. Replaced att7300, esprit, dd5500. +# * Replaced the Perkin-Elmer entries with vendor's official ones. +# * Restored the old minimal-ansi entry, luna needs it. +# * Fixed some incorrect ip and proportional-padding translations. +# 9.4.1 (Mon Feb 27 14:18:33 EST 1995): +# * Fix linux & AT386 sgr strings to do A_ALTCHARSET turnoff correctly. +# * Make the xterm entry 65 lines again; create xterm25 and xterm24 +# to force a particular height. +# * Added beehive4 and reorganized other Harris entries. +# 9.4.2 (Thu Mar 9 01:45:44 EST 1995): +# * Merged in DEC's official entries for its terminals. The only old +# entry I kept was Doug Gwyn's alternate vt100 (as vt100-avo). +# * Replaced the translated BBN BitGraph entries with purpose-built +# ones from AT&T's SVr3. +# * Replaced the AT&T entries with AT&T's official terminfos. +# * Added Teleray 16, vc415, cops10. +# * Merged in many individual capabilities from SCO terminfo files. +# 9.4.3 (Mon Mar 13 02:37:53 EST 1995): +# * Typo fixes. +# * Change linux entry so A_PROTECT enables IBM-PC ROM characters. +# 9.4.4 (Mon Mar 27 12:32:35 EST 1995): +# * Added tty35, Ann Arbor Guru series. vi300 and 550, cg7900, tvi803, +# pt210, ibm3164, IBM System 1, ctrm, Tymshare scanset, dt200, adm21, +# simterm, citoh and variants. +# * Replaced sol entry with sol1 and sol2. +# * Replaced Qume QVT and Freedom-series entries with purpose-built +# terminfo entries. +# * Enhanced vt220, tvi910, tvi924, hpterm, hp2645, adm42, tek +# and dg200 entries using caps from SCO. +# * Added the usual set of function-key mappings to ANSI entry. +# * Corrected xterm's function-key capabilities. +# 9.4.5 (Tue Mar 28 14:27:49 EST 1995): +# * Fix in xterm entry, cub and cud are not reliable under X11R6. +# 9.4.6 (Thu Mar 30 14:52:15 EST 1995): +# * Fix in xterm entry, get the arrow keys right. +# * Change some \0 escapes to \200. +# 9.4.7 (Tue Apr 4 11:27:11 EDT 1995) +# * Added apple (Videx card), adm1a, oadm31. +# * Fixed malformed ampex csr. +# * Fixed act4, cyb110; they had old-style prefix padding left in. +# * Changed mandatory to advisory padding in many entries. +# * Replaced HP entries up to hpsub with purpose-built ones. +# * Blank rmir/smir/rmdc/smdc capabilities removed. +# * Small fixes merged in from SCO entries for lpr, fos, tvi910+, tvi924. +# 9.4.8 (Fri Apr 7 09:36:34 EDT 1995): +# * Replaced the Ann Arbor entries with SCO's, the init strings are +# more efficient (but the entries otherwise identical). +# * Added dg211 from Shuford archive. +# * Added synertek, apple-soroc, ibmpc, pc-venix, pc-coherent, xtalk, +# adm42-nl, pc52, gs6300, xerox820, uts30. +# * Pull SCO's padding into vi200 entry. +# * Improved capabilities for tvi4107 and other TeleVideo and Viewpoint +# entries merged in from SCO's descriptions. +# * Fixed old-style prefix padding on zen50, h1500. +# * Moved old superbee entry to superbee-xsb, pulled in new superbee +# entry from SCO's description. +# * Reorganized the special entries. +# * Added lm#0 to cbunix and virtual entries. +# +# 9.5.0 (Mon Apr 10 11:30:00 EDT 1995): +# * Restored cdc456tst. +# * Fixed sb1 entry, SCO erroneously left out the xsb glitch. +# * Added megatek, beacon, microkit. +# * Freeze for ncurses-1.9 release. +# 9.5.1 (Fri Apr 21 12:46:42 EDT 1995): +# * Added historical data for TAB. +# * Comment fixes from David MacKenzie. +# * Added the new BSDI pc3 entry. +# 9.5.2 (Tue Apr 25 17:27:52 EDT 1995) +# * A change in the tic -C logic now ensures that all entries in +# the termcap translation will fit in < 1024 bytes. +# * Added `bobcat' and `gator' HP consoles and the Nu machine entries +# from GNU termcap file. This merges in all their local information. +# 9.5.3 (Tue Apr 25 22:28:13 EDT 1995) +# * Changed tic -C logic to dump all capabilities used by GNU termcap. +# * Added warnings about entries with long translations (restoring +# all the GNU termcaps pushes a few over the edge). +# 9.5.4 (Wed Apr 26 15:35:09 EDT 1995) +# * Yet another tic change, and a couple of entry tweaks, to reduce the +# number of long (> 1024) termcap translations back to 0. +# +# 9.6.0 (Mon May 1 10:35:54 EDT 1995) +# * Added kf13-kf20 to Linux entry. +# * Regularize Prime terminal names. +# * Historical data on Synertek. +# * Freeze for ncurses-1.9.1. +# 9.6.1 (Sat May 6 02:00:52 EDT 1995): +# * Added true xterm-color entry, renamed djm's pseudo-color entry. +# * Eliminate whitespace in short name fields, this tanks some scripts. +# * Name field changes to shorten some long entries. +# * Termcap translation now automatically generates empty rmir/smir +# when ich1/ich is present (copes with an ancient vi bug). +# * Added `screen' entries from FSF's screen-3.6.2. +# * Added linux-nic and xterm-nic entries. +# 9.6.2 (Sat May 6 17:00:55 EDT 1995): +# * Change linux entry to use smacs=\E[11m and have an explicit acsc, +# eliminating some special-case code in ncurses. +# +# 9.7.0 (Tue May 9 18:03:12 EDT 1995): +# * Added vt320-k3, rsvidtx from the Emacs termcap.dat file. I think +# that captures everything unique from it. +# * Added reorder script generator. +# * Freeze for ncurses 1.9.2 release. +# 9.7.1 (Thu Jun 29 09:35:22 EDT 1995): +# * Added Sean Farley's kspd, flash, rs1 capabilities for linux. +# * Added Olaf Siebert's corrections for adm12. +# * ansi-pc-color now includes the colors and pairs caps, so that +# entries which use it will inherit them automatically. +# * The linux entry can now recognize the center (keypad 5) key. +# * Removed some junk that found its way into Linux acsc. +# +# 9.8.0 (Fri Jul 7 04:46:57 EDT 1995): +# * Add 50% cut mark as a desperate hack to reduce tic's core usage. +# * xterm doesn't try to use application keypad mode any more. +# * Freeze for ncurses-1.9.3 release. +# 9.8.1 (Thu Jul 19 17:02:12 EDT 1995): +# * Added corrected sun entry from vendor. +# * Added csr capability to linux entry. +# * Peter Wemm says the at386 hpa should be \E[%i%p1%dG, not \E[%p1%dG. +# * Added vt102-nsgr to cope with stupid IBM PC `VT100' emulators. +# * Some commented-out caps in long entries come back in, my code +# for computing string-table lengths had a bug in it. +# * pcansi series modified to fit comm-program reality better. +# 9.8.2 (Sat Sep 9 23:35:00 EDT 1995): +# * BSD/OS actually ships the ibmpc3 bold entry as its console. +# * Correct some bad aliases in the pcansi series +# * Added entry for QNX console. +# * Clean up duplicate long names for use with 4.4 library. +# * Change vt100 standout to be normal reverse vide, not bright reverse; +# this makes the Emacs status line look better. +# 9.8.3 (Sun Sep 10 13:07:34 EDT 1995): +# * Added Adam Thompson's VT320 entries, also his dtx-sas and z340. +# * Minor surgery, mostly on name strings, to shorten termcap version. +# +# 9.9.0 (Sat Sep 16 23:03:48 EDT 1995): +# * Added dec-vt100 for use with the EWAN emulator. +# * Added kmous to xterm for use with xterm's mouse-tracking facility. +# * Freeze for 1.9.5 alpha release. +# 9.9.1 (Wed Sep 20 13:46:09 EDT 1995): +# * Changed xterm lines to 24, the X11R6 default. +# 9.9.2 (Sat Sep 23 21:29:21 EDT 1995): +# * Added 7 newly discovered, undocumented acsc characters to linux +# entry (the pryz{|} characters). +# * ncurses no longer steals A_PROTECT. Simplify linux sgr accordingly. +# * Correct two typos in the xterm entries introduced in 9.9.1. +# * I finally figured out how to translate ko capabilities. Done. +# * Added tvi921 entries from Tim Theisen. +# * Cleanup: dgd211 -> dg211, adm42-nl -> adm42-nsl. +# * Removed mystery tec entry, it was neither interesting nor useful. +# * shortened altos3, qvt203, tvi910+, tvi92D, tvi921-g, tvi955, vi200-f, +# vi300-ss, att505-24, contel301, dm3045, f200vi, pe7000c, vc303a, +# trs200, wind26, wind40, wind50, cdc456tst, dku7003, f110, dg211, +# by making them relative to use capabilities +# * Added cuf1=^L to tvi925 from deleted variant tvi925a. +# * fixed cup in adm22 entry and parametrized strings in vt320-k3. +# * added it#8 to entries that used to have :pt: -- tvi912, vi200, +# ampex80, +# * Translate all home=\E[;H capabilities to home=\E[H, they're +# equivalent. +# * Translate \E[0m -> \E[m in [rs]mso, [rs]mul, and init strings of +# vt100 and ANSI-like terminals. +# 9.9.3 (Tue Sep 26 20:11:15 EDT 1995): +# * Added it#8 and ht=\t to *all* entries with :pt:; the ncurses tic +# does this now, too. +# * fviewpoint is gone, it duplicated screwpoint. +# * Added hp2627, graphos, graphos-30, hpex, ibmega, ibm8514, ibm8514-c, +# ibmvga, ibmvga-c, minix, mm340, mt4520-rv, screen2, screen3, +# versaterm, vi500, vsc, vt131, vt340, vt400 entries from UW. +# The UW vi50 replaces the old one, which becomes vi50adm, +# * No more embedded commas in name fields. +# +# 9.10.0 (Wed Oct 4 15:39:37 EDT 1995): +# * XENIX forms characters in fos, trs16, scoansi become acsc strings, +# * Introduced klone+* entries for describing Intel-console behavior. +# * Linux kbs is default-mapped to delete for some brain-dead reason. +# * -nsl -> -ns. The -pp syntax is obsolete. +# * Eliminate [A-Z]* primaries in accordance with SVr4 terminfo docs. +# * Make xterm entry do application-keypad mode again. I got complaints +# that it was messing up someone's 3270 emulator. +# * Added some longname fields in order to avoid warning messages from +# older tic implementations. +# * According to ctlseqs.ms, xterm has a full vt100 graphics set. Use +# it! (This gives us pi, greater than, less than, and a few more.) +# * Freeze for ncurses-1.9.6 release. +# 9.10.1 (Sat Oct 21 22:18:09 EDT 1995): +# * Add xon to a number of console entries, they're memory-mapped and +# don't need padding. +# * Correct the use dependencies in the ansi series. +# * Hand-translate more XENIX capabilities. +# * Added hpterm entry for HP's X terminal emulator. +# * Added aixterm entries. +# * Shortened four names so everything fits in 14 chars. +# +# 9.11.0 (Thu Nov 2 17:29:35 EST 1995): +# * Added ibcs2 entry and info on iBCS2 standard. +# * Corrected hpa/vpa in linux entry. They still fail the worm test. +# * We can handle the HP meml/memu capability now. +# * Added smacs to klone entries, just as documentation. +# * Corrected ansi.sys and cit-500 entries. +# * Added z39, vt320-k311, v220c, and avatar entries. +# * Make pcansi use the ansi.sys invis capability. +# * Added DIP switch descriptions for vt100, adm31, tvi910, tvi920c, +# tvi925, tvi950, dt80, ncr7900i, h19. +# * X3.64 has been withdrawn, change some references. +# * Removed function keys from ansi-m entry. +# * Corrected ansi.sys entry. +# * Freeze for ncurses-1.9.7 release. +# 9.11.1 (Tue Nov 6 18:18:38 EST 1995): +# * Added rmam/smam capabilities to many entries based on init strings. +# * Added correct hpa/vpa to linux. +# * Reduced several entries relative to vt52. +# 9.11.2 (Tue Nov 7 00:21:06 EST 1995): +# * Exiled some utterly unidentifiable custom and homebrew types to the +# UFO file; also, obsolete small-screen hardware; also, entries which +# look flat-out incorrect, garbled, or redundant. These include the +# following entries: carlock, cdc456tst, microkit, qdss, ramtek, tec, +# tec400, tec500, ubell, wind, wind16, wind40, wind50, plasma, agile, +# apple, bch, daleblit, nucterm, ttywilliams, nuterminal, nu24, bnu, +# fnu, nunix-30, nunix-61, exidy, ex3000, sexidy, pc52, sanyo55, +# yterm10, yterm11, yterm10nat, aed, aed-ucb, compucolor, compucolor2, +# vic20, dg1, act5s, netx, smartvid, smarterm, sol, sol2, dt200, +# trs80, trs100, trs200, trs600, xitex, rsvidtx, vid, att2300-x40, +# att2350-x40, att4410-nfk, att5410-ns, otty5410, att5425-nl-w, +# tty5425-fk, tty5425-w-fk, cita, c108-na, c108-rv-na, c100-rv-na, +# c108-na-acs, c108-rv-na-acs, ims950-ns, infotonKAS, ncr7900i-na, +# regent60na, scanset-n, tvi921-g, tvi925n, tvi925vbn, tvi925vb, +# vc404-na, vc404-s-na, vt420nam, vt420f-nam, vt420pc-nam, vt510nam, +# vt510pc-nam, vt520nam, vt525nam, xterm25, xterm50, xterm65, xterms. +# * Corrected pcvt25h as suggested by Brian C. Grayson +# . +# 9.11.3 (Thu Nov 9 12:14:40 EST 1995): +# * Added kspd=\E[P, kcbt=\E[Z, to linux entry, changed kbs back to ^H. +# * Added kent=\EOM to xterm entry. +# +# 9.11.4 (Fri Nov 10 08:31:35 EST 1995): +# * Corrected gigi entry. +# * Restored cuf/cud1 to xterm, their apparent bugginess was due to +# bad hpa/vpa capabilities. +# * Corrected flash strings to have a uniform delay of .2 sec. No +# more speed-dependent NUL-padding! +# * terminfo capabilities in comments bracketed with <>. +# 9.11.5 (Fri Nov 10 15:35:02 EST 1995): +# * Replaced pcvt with the 3.31 pcvt entries. +# * Freeze for 1.9.7a. +# 9.11.6 (Mon Nov 13 10:20:24 EST 1995): +# * Added emu entry from the X11R6 contrib tape sources. +# +# 9.12.0 (Wed Nov 29 04:22:25 EST 1995): +# * Improved iris-ansi and sun entries. +# * More flash string improvements. +# * Corrected wy160 & wy160 as suggested by Robert Dunn +# * Added dim to at386. +# * Reconciled pc3 and ibmpc3 with the BSDI termcap file. Keith says +# he's ready to start using the termcap generated from this one. +# * Added vt102-w, vt220-w, xterm-bold, wyse-vp, wy75ap, att4424m, +# ln03, lno3-w, h19-g, z29a*, qdss. Made vt200 an alias of vt220. +# * Improved hpterm, apollo consoles, fos, qvt101, tvi924. tvi925, +# att610, att620, att630, +# * Changed hazeltine name prefix from h to hz. +# * Sent t500 to the UFI file. +# * I think we've sucked all the juice out of BSDI's termcap file now. +# * Freeze for ncurses 1.9.8 release +# 9.12.1 (Thu Nov 30 03:14:06 EST 1995) +# * Unfreeze, linux kbs needed to be fixed. +# * Tim Theisen pinned down a bug in the DMD firmware. +# 9.12.2 (Thu Nov 30 19:08:55 EST 1995): +# * Fixes to ansi and klone capabilities (thank you, Aaron Ucko). +# (The broken ones had been shadowed by sgr.) +# 9.12.3 (Thu Dec 7 17:47:22 EST 1995): +# * Added documentation on ECMA-48 standard. +# * New Amiga entry. +# 9.12.4 (Thu Dec 14 04:16:39 EST 1995): +# * More ECMA-48 stuff +# * Corrected typo in minix entry, added pc-minix. +# * Corrected khome/kend in xterm (thank you again, Aaron Ucko). +# * Added rxvt entry. +# * Added 1.3.x color-change capabilities to linux entry. +# 9.12.5 (Tue Dec 19 00:22:10 EST 1995): +# * Corrected rxvt entry khome/kend. +# * Corrected linux color change capabilities. +# * NeXT entries from Dave Wetzel. +# * Cleaned up if and rf file names (all in /usr/share now). +# * Changed linux op capability to avoid screwing up a background color +# pair set by setterm. +# 9.12.6 (Wed Feb 7 16:14:35 EST 1996): +# * Added xterm-sun. +# 9.12.7 (Fri Feb 9 13:27:35 EST 1996): +# * Added visa50. +# +# 9.13.0 (Sun Mar 10 00:13:08 EST 1996): +# * Another sweep through the Shuford archive looking for new info. +# * Added dg100 alias to dg6053 based on a comp.terminals posting. +# * Added st52 from Per Persson. +# * Added eterm from the GNU Emacs 19.30 distribution. +# * Freeze for 1.9.9. +# 9.13.1 (Fri Mar 29 14:06:46 EST 1996): +# * FreeBSD console entries from Andrew Chernov. +# * Removed duplicate Atari st52 name. +# 9.13.2 (Tue May 7 16:10:06 EDT 1996) +# * xterm doesn't actually have ACS_BLOCK. +# * Change klone+color setf/setb to simpler forms that can be +# translated into termcap. +# * Added xterm1. +# * Removed mechanically-generated junk capabilities from cons* entries. +# * Added color support to bsdos. +# 9.13.3 (Thu May 9 10:35:51 EDT 1996): +# * Added Wyse 520 entries from Wm. Randolph Franklin . +# * Created ecma+color, linux can use it. Also added ech to linux. +# * Teach xterm about more keys. Add Thomas Dickey's 3.1.2E updates. +# * Add descriptions to FreeBSD console entries. Also shorten +# some aliases to <= 14 chars for portability. +# * Added x68k console +# * Added OTbs to several VT-series entries. +# 9.13.4 (Wed May 22 10:54:09 EDT 1996): +# * screen entry update for 3.7.1 from Michael Alan Dorman. +# 9.13.5 (Wed Jun 5 11:22:41 EDT 1996): +# * kterm correction due to Kenji Rikitake. +# * ACS correction in vt320-kll due to Phillippe De Muyter. +# 9.13.6 (Sun Jun 16 15:01:07 EDT 1996): +# * Sun console entry correction from J.T. Conklin. +# * Changed all DEC VT300 and up terminals to use VT300 tab set +# 9.13.7 (Mon Jul 8 20:14:32 EDT 1996): +# * Added smul to linux entry (we never noticed it was missing +# because of sgr!). +# * Added rmln to hp+labels (deduced from other HP entries). +# * Added vt100 acsc capability to vt220, vt340, vt400, d800, dt80-sas, +# pro350, att7300, 5420_2, att4418, att4424, att4426, att505, vt320-k3. +# * Corrected vt220 acsc. +# * The klone+sgr and klone+sgr-dumb entries now use klone+acs; +# this corresponds to reality and helps prevent some tic warnings. +# * Added sgr0 to c101, pcix, vt100-nav, screen2, oldsun, next, altos2, +# hpgeneric, hpansi, hpsub, hp236, hp700-wy, bobcat, dku7003, adm11, +# adm12, adm20, adm21, adm22, adm31, adm36, adm42, pt100, pt200, +# qvt101, tvi910, tvi921, tvi92B, tvi925, tvi950, tvi970, wy30-mc, +# wy50-mc, wy100, wyse-vp, ampex232, regent100, viewpoint, vp90, +# adds980, cit101, cit500, contel300, cs10, dm80, falco, falco-p, +# f1720a, go140, sb1, superbeeic, microb, ibm8512, kt7, ergo4000, +# owl, uts30, dmterm, dt100, dt100, dt110, appleII, apple-videx, +# lisa, trsII, atari, st52, pc-coherent, basis, m2-man, bg2.0, bg1.25, +# dw3, ln03, ims-ansi, graphos, t16, zen30, xtalk, simterm, d800, +# ifmr, v3220, wy100q, tandem653, ibmaed. +# * Added DWK terminal description. +# 9.13.8 (Wed Jul 10 11:45:21 EDT 1996): +# * Many entries now have highlights inherited from adm+sgr. +# * xterm entry now corresponds to XFree86 3.1.2E, with color. +# * xtitle and xtitle-twm enable access to the X status line. +# * Added linux-1.3.6 color palette caps in conventional format. +# * Added adm1178 terminal. +# * Move fos and apollo terminals to obsolete category. +# * Aha! The BRL terminals file told us what the Iris extensions mean. +# * Added, from the BRL termcap file: rt6221, rt6221-w, northstar, +# commodore, cdc721-esc, excel62, osexec. Replaced from the BRL file: +# cit500, adm11. +# 9.13.9 (Mon Jul 15 00:32:51 EDT 1996): +# * Added, from the BRL termcap file: cdc721, cdc721l, cdc752, cdc756, +# aws, awsc, zentec8001, modgraph48, rca vp3301/vp3501, ex155. +# * Corrected, from BRL termcap file: vi50. +# * Better rxvt entry & corrected xterm entries from Thomas Dickey. +# 9.13.10 (Mon Jul 15 12:20:13 EDT 1996): +# * Added from BRL: cit101e & variants, hmod1, vi200, ansi77, att5620-1, +# att5620-s, att5620-s, dg210, aas1901, hz1520, hp9845, osborne +# (old osborne moved to osborne-w), tvi970-vb, tvi970-2p, tvi925-hi, +# tek4105brl, tek4106brl, tek4107brl,tek4109brl, hazel, aepro, +# apple40p, apple80p, appleIIgs, apple2e, apple2e-p, apple-ae. +# * Paired-attribute fixes to various terminals. +# * Sun entry corrections from A. Lukyanov & Gert-Jan Vons. +# * xterm entry corrections from Thomas Dickey. +# 9.13.11 (Tue Jul 30 16:42:58 EDT 1996): +# * Added t916 entry, translated from a termcap in SCO's support area. +# * New qnx entry from Michael Hunter. +# 9.13.12 (Mon Aug 5 14:31:11 EDT 1996): +# * Added hpex2 from Ville Sulko. +# * Fixed a bug that ran the qnx and pcvtXX together. +# 9.13.13 (Fri Aug 9 01:16:17 EDT 1996): +# * Added dtterm entry from Solaris CDE. +# 9.13.14 (Tue Sep 10 15:31:56 EDT 1996): +# * corrected pairs#8 typo in dtterm entry. +# * added tvi9065. +# 9.13.15 (Sun Sep 15 02:47:05 EDT 1996): +# * updated xterm entry to cover 3.1.2E's new features. +# 9.13.16 (Tue Sep 24 12:47:43 EDT 1996): +# * Added new minix entry +# * Removed aliases of the form ^[0-9]* for obsolete terminals. +# * Commented out linux-old, nobody's using pre-1.2 kernels now. +# 9.13.17 (Fri Sep 27 13:25:38 EDT 1996): +# * Added Prism entries and kt7ix. +# * Caution notes about EWAN and tabset files. +# * Changed /usr/lib/tabset -> /usr/share/tabset. +# * Added acsc/rmacs/smacs to vt52. +# 9.13.18 (Mon Oct 28 13:24:59 EST 1996): +# * Merged in Thomas Dickey's reorganization of the xterm entries; +# added technical corrections to avoid warning messages. +# 9.13.19 (Sat Nov 16 16:05:49 EST 1996): +# * Added rmso=\E[27m in Linux entry. +# * Added koi8-r support for Linux console. +# * Replace xterm entries with canonical ones from XFree86 3.2. +# 9.13.20 (Sun Nov 17 23:02:51 EST 1996): +# * Added color_xterm from Jacob Mandelson +# 9.13.21 (Mon Nov 18 12:43:42 EST 1996): +# * Back off the xterm entry to use r6 as a base. +# 9.13.22 (Sat Nov 30 11:51:31 EST 1996): +# * Added dec-vt220 at Adrian Garside's request. +# +#-(original-changelog-1996/12/29-to-1998/02/28-by-TD)--------------------------- +# +# 10.1.0 (Sun Dec 29 02:36:31 EST 1996): withdrawn +# * Minor corrections to xterm entries. +# * Replaced EWAN telnet entry. +# * Dropped the reorder script generator. It was a fossil. +# 9.13.23 (Fri Feb 21 16:36:06 EST 1997): +# * Replaced minitel-2 entry. +# * Added MGR, ansi-nt. +# 9.13.24 (Sun Feb 23 20:55:23 EST 1997): +# * Thorsten Lockert added termcap `bs' to a lot of types, working from +# the 4.4BSD Lite2 file. +# +# 10.1.1 (Sat May 3 21:41:27 EDT 1997): +# * Use setaf/setab consistently with SVr4. +# * Remove ech, el1 from cons25w, they do not work in FreeBSD 2.1.5 +# 10.1.2 (Sat May 24 21:10:57 EDT 1997) +# * update xterm-xf86-v32 to match XFree86 3.2A (changes F1-F4) +# * add xterm-16color, for XFree86 3.3 +# 10.1.3 (Sat May 31 12:21:05 EDT 1997) +# * correct typo in emu +# * correct typo in vt102-w (Robert Wuest) +# * make new entry xterm-xf86-v33, restored xterm-xf86-v32. +# 10.1.4 (Sun Jun 15 08:29:05 EDT 1997) +# * remove ech capability from rxvt (it does the wrong thing) +# 10.1.5 (Sat Jun 28 21:34:36 EDT 1997) +# * remove spurious newlines from several entries (hp+color, wy50, +# wy350, wy370-nk, wy99gt-tek, wy370-tek, ibm3161, tek4205, ctrm, +# gs6300) +# 10.1.6 (Sat Jul 5 15:08:16 EDT 1997) +# * correct rmso capability of wy50-mc +# 10.1.7 (Sat Jul 12 20:05:55 EDT 1997) +# * add cbt to xterm-xf86-v32 +# * disentangle some entries from 'xterm', preferring xterm-r6 in case +# 'xterm' is derived from xterm-xf86-v32, which implements ech and +# other capabilities not in xterm-r6. +# * remove alternate character set from kterm entry. +# 10.1.8 (Sat Aug 2 18:43:18 EDT 1997) +# * correct acsc entries for ACS_LANTERN, which is 'i', not 'I'. +# 10.1.9 (Sat Aug 23 17:54:38 EDT 1997) +# * add xterm-8bit entry. +# 10.1.10 (Sat Oct 4 18:17:13 EDT 1997) +# * repair several places where early version of tic replaced \, with \\\, +# * make acsc entries canonical form (sorted, uniq). +# * modify acsc entries for linux, linux-koi8 +# * new rxvt entry, from corrected copy of distribution in rxvt 2.21b +# * add color, mouse support to kterm. +# 10.1.11 (Sat Oct 11 14:57:10 EDT 1997) +# * correct wy120 smxon/tbc capabilities which were stuck together. +# 10.1.12 (Sat Oct 18 17:38:41 EDT 1997) +# * add entry for xterm-xf86-v39t +# 10.1.13 (Sat Nov 8 13:43:33 EST 1997) +# * add u8,u9 to sun-il description +# 10.1.14 (Sat Nov 22 19:59:03 EST 1997) +# * add vt220-js, pilot, rbcomm, datapoint entries from esr's 27-jun-97 +# version. +# * add hds200 description (Walter Skorski) +# * add EMX 0.9b descriptions +# * correct rmso/smso capabilities in wy30-mc and wy50-mc (Daniel Weaver) +# * rename xhpterm back to hpterm. +# 10.1.15 (Sat Nov 29 19:21:59 EST 1997) +# * change initc in linux-c-nc to use 0..1000 range. +# 10.1.16 (Sat Dec 13 19:41:59 EST 1997) +# * remove hpa/vpa from rxvt, which implements them incorrectly. +# * add sgr0 for rxvt. +# * remove bogus smacs/rmacs from EMX descriptions. +# 10.1.17 (Sat Dec 20 17:54:10 EST 1997) +# * revised entry for att7300 +# 10.1.18 (Sat Jan 3 17:58:49 EST 1998) +# * use \0 rather than \200. +# * rename rxvt-color to rxvt to match rxvt 2.4.5 distribution. +# 10.1.19 (Sat Jan 17 14:24:57 EST 1998) +# * change xterm (xterm-xf86-v40), xterm-8bit rs1 to use hard reset. +# * rename xterm-xf86-v39t to xterm-xf86-v40 +# * remove bold/underline from sun console entries since they're not +# implemented. +# 10.1.20 (Sat Jan 24 11:02:51 EST 1998) +# * add beterm entry (Fred Fish) +# * add irix-color/xwsh entry. +# * turn ncv off for linux. +# 10.1.21 (Sat Jan 31 17:39:16 EST 1998) +# * set ncv for FreeBSD console (treat colors with reverse specially). +# * remove sgr string from qnx based on report by Xiaodan Tang +# 10.1.22 (Wed Feb 11 18:40:12 EST 1998) +# * remove spurious commas from descriptions +# * correct xterm-8bit to match XFree86 3.9Ad F1-F4. +# 10.1.23 (Sat Feb 28 17:48:38 EST 1998) +# * add linux-koi8r to replace linux-koi8 (which uses a corrupt acsc, +# apparently based on cp-866). +# +#-(replaced-changelog-1998/02/28-by-ESR)---------------------------------------- +# +# 9.13.23 (Fri Feb 21 16:36:06 EST 1997): +# * Replaced minitel-2 entry. +# * Added MGR, ansi-nt. +# * Minor corrections to xterm entries. +# * Replaced EWAN telnet entry. +# * Dropped the reorder script generator. It was a fossil. +# 9.13.24 (Sun Feb 23 20:55:23 EST 1997): +# * Thorsten Lockert added termcap `bs' to a lot of types, working from +# the 4.4BSD Lite2 file. +# 9.13.25 (Fri Jun 20 12:33:36 EDT 1997): +# * Added Datapoint 8242, pilot, ansi_psx, rbcomm, vt220js. +# * Updated iris-ansi; corrected vt102-w. +# * Switch base xterm entry to 3.3 level. +# 9.13.26 (Mon Jun 30 22:45:45 EDT 1997) +# * Added basic4. +# * Removed rmir/smir from tv92B. +# +# 10.2.0 (Sat Feb 28 12:47:36 EST 1998): +# * add hds200 description (Walter Skorski) +# * add beterm entry (Fred Fish) +# * add Thomas Dickey's xterm-xf86-v40, xterm-8bit, xterm-16color, +# iris-color entries. +# * add emx entries. +# * Replaced unixpc entry with Benjamin Sittler's corrected version. +# * Replaced xterm/rxvt/emu/syscons entries with Thomas Dickey's +# versions. +# * remove sgr string from qnx based on report by Xiaodan Tang +# * Added u8/u9, removed rmul/smul from sun-il. +# * 4.2 tic displays \0 rather than \200. +# * add linux-koi8r to replace linux-koi8 (which uses a corrupt acsc, +# apparently based on cp-866). +# * Merged in Pavel Roskin's acsc for linux-koi8 +# * Corrected some erroneous \\'s to \. +# * 4.2 ncurses has been changed to use setaf/setab, consistent w/SysV. +# * II -> ii in pcvtXX, screen, xterm. +# * Removed \n chars following ANSI escapes in sgr & friends. +# * Updated Wyse entries. +# * h19 corrections from Tim Pierce. +# * Noted that the dm2500 has both ich and smir. +# * added pccons for the Alpha under OSF/1. +# * Added Sony NEWS workstation entries and cit101e-rv. +# * Reverted `amiga'; to Kent Polk's version, as I'm told +# the Verkuil entry messes up with Amiga Telnet. +# 10.2.1 (Sun Mar 8 18:32:04 EST 1998): +# * Corrected attributions in 10.2.0 release notes. +# * Scanned the Shuford archive for new terminfos and information. +# * Removed sgr from qnx entry (Thomas Dickey). +# * Added entries for ICL and Kokusai Data Systems terminals. +# * Incorporated NCR terminfos from the Boundless Technology FTP site. +# * Incorporated att700 from the Boundless Technology FTP site. +# * Miscellaneous contact-address and Web-page updates. +# +#-(changelog-beginning-ncurses-4.2)--------------------------------------------- +# +# 1998/5/9 +# * add nxterm and xterm-color terminfo description (request by Cristian +# Gafton ). +# * modify rxvt terminfo description to clear alternate screen before +# switching back to normal screen, for compatibility with applications +# which use xterm (reported by Manoj Kasichainula ). +# * modify linux terminfo description to reset color palette (reported +# by Telford Tendys ). +# +# 1998/7/4 +# * merge changes from current XFree86 xterm terminfo descriptions. +# +# 1998/7/25 +# * Added minitel1 entries from Alexander Montaron. +# * Added qnxt2 from Federico Bianchi. +# * Added arm100 terminfo entries from Dave Millen. +# +# 1998/8/6 +# * Added ncsa telnet entries from Francesco Potorti +# +# 1998/8/15 +# * modify ncsa telnet entry to reflect color, other capabilities based on +# examination of the source code - T.Dickey. +# +# 1998/8/22 +# * Corrected some erroneous \\'s to \ (eterm, osborne) - TD. +# +# 1998/8/29 +# * Added Francesco Potorti's tuned Wyse 99 entries. +# * dtterm enacs correction from Alexander V. Lukyanov. +# * Add ncsa-ns, ncsa-m-ns and ncsa-m entries from esr version. +# * correct a typo in icl6404 entry. +# * add xtermm and xtermc +# +# 1998/9/26 +# * format most %'char' sequences to %{number} +# * adapt IBM AIX 3.2.5 terminfo - T.Dickey +# * merge Data General terminfo from Hasufin - TD +# +# 1998/10/10 +# * update xterm-xfree86 to current (xterm patch #84), for is2/rs2 changes - TD +# * correct initialization string in xterm-r5, add misc other features +# to correspond with xterm patch #84 - TD +# +# 1998/12/19 +# * update xterm-xfree86 to current (xterm patch #90), smcur/rmcur changes - TD +# * add Mathew Vernon's mach console entries +# * corrections for ncsa function-keys (report by Larry Virden) +# +# 1998/12/19 +# * change linux to use ncv#2, since underline does not work with color - TD +# +# 1999/1/9 +# * add kbt to iris-ansi, document other shift/control functionkeys - TD +# * correct iris-ansi and iris-ansi-ap with respect to normal vs keypad +# application modes, change kent to use the correct keypad code - TD +# +# 1999/1/10 +# * add entry for Tera Term - TD +# +# 1999/1/23 +# * minor improvements for teraterm entry - TD +# * rename several entries used by BSDI: bsdos to bsdos-pc-nobold, +# and bsdos-bold to bsdos-pc (Jeffrey C Honig) +# +# 1999/2/20 +# * resolve ambiguity of kend/kll/kslt and khome/kfnd/kich1 strings in +# xterm and ncsa entries by removing the unneeded ones. Note that +# some entries will return kend & khome versus kslt and kfnd, for +# PC-style keyboards versus strict vt220 compatibility - TD +# +# 1999/3/13 +# * adjust xterm-xfree86 khome/kend to match default PC-style keyboard +# tables - TD +# * add 'crt' entry - TD +# * correct typos in 'linux-c' entry - TD +# +# 1999/3/14 +# * update entries for BSD/OS console to use klone+sgr and klone+color +# (Jeffrey C Honig) +# +# 1999/3/27 +# * adjust xterm-xfree86 miscellaneous keypad keys, as per xterm patch #94 - TD. +# +# 1999/4/10 +# * add linux-lat, from RedHat patches to ncurses 4.2 +# +# 1999/4/17 +# * add complete set of default function-key definitions for scoansi - TD. +# +# 1999/7/3 +# * add cnorm, cvvis for Linux 2.2 kernels +# +# 1999/7/24 +# * add kmous to xterm-r5 -TD +# * correct entries xterm+sl and xterm+sl-twm, which were missing the +# parent "use" clause -TD +# +# 1999/7/31 +# * corrected cnorm, added el1 in 'screen' description -TD +# +# 1999/8/14 +# * add ms-vt100 -TD +# +# 1999/8/21 +# * corrections to beterm entry -TD +# +# 1999/8/28 +# * add cygwin entry -TD +# +# 1999/9/4 +# * minor corrections for beterm entry -TD +# +# 1999/9/18 +# * add acsc string to HP 70092 terminfo entry -Joerg Wunsch +# +# 1999/9/25 +# * add amiga-8bit entry +# * add console entries from NetBSD: ofcons, wsvt25, wsvt25m, rcons, +# rcons-color, based on +# ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/share/termcap/termcap.src +# * add alias for iris-ansi-net +# +# 1999/10/2 +# * corrected scoansi entry's acsc, some function keys, add color -TD +# +# 1999/10/23 +# * add cnorm, cvvis to cons25w, and modify ncv to add 'dim' -TD +# * reorder ncsa entries to make ncsa-vt220 use the alternate function +# key mapping, leaving Potorti's entries more like he named them -TD +# * remove enter/exit am-mode from cygwin -TD +# +# 1999/10/30 +# * correct typos in several entries (missing '[' from CSI): +# mgr-sun, ncsa-m, vt320-k3, att505, avt-ns, as well as smir/rmir +# strings for avt-ns -TD +# * add 'dim' to ncv mask for linux (report by Klaus Weide). +# +# 1999/11/27 +# * correct kf1-kf4 in xterm-r6 which were vt100-style PF1-PF4 -TD +# * add hts to xterm-r6, and u6-u9 to xterm-r5 -TD +# * add xterm-88color and xterm-256color -TD +# +# 1999/12/4 +# * add "obsolete" termcap strings -TD +# * add kvt and gnome entries -TD +# +# 1999/12/11 +# * correct cup string for regent100 -TD +# +# 2000/1/1 +# * update mach, add mach-color based on Debian diffs for ncurses 5.0 -TD +# * add entries for xterm-hp, xterm-vt220, xterm-vt52 and xterm-noapp -TD +# * change OTrs capabilities to rs2 -TD +# * add obsolete and extended capabilities to 'screen' -TD +# +# 2000/1/5 +# * remove kf0 from rxvt, vt520, vt525 and ibm5151 since it conflicts +# with kf10 -TD +# * updated xterm-xf86-v40, making kdch1 correspond to vt220 'Remove', +# and adding kcbt -TD +# +# 2000/1/12 +# * remove incorrect khome/kend from xterm-xf86-v333, which was based on +# nonstandard resource settings -TD +# +# 2000/2/26 +# * minor fixes for xterm-*, based on Debian #58530 -TD +# +# 2000/3/4 +# * add several terminal types from esr's "11.0", as well as comments. +# bq300*, dku7102-old, dku7202, hft, lft, pcmw, pmcons, tws*, vip*, +# vt220-8bit, vt220-old, wy85-8bit +# +# 2000/3/18 +# * add several terminal types from esr's "11.0.1" (ansi-*). +# * update OTxx capabilities for changes on 2000/3/4. +# * revert part of vt220 change (request by Todd C Miller for OpenBSD) +# +# 2000/3/26 +# * move screen's AX extension to ecma+color, modify several entries to +# use that, adjusting ncv as needed -TD +# +# 2000/4/8 +# * add bsdos-pc-m, bsdos-pc-mono (Jeffrey C Honig) +# * correct spelling error in entry name: bq300-rv was given as bg300-rv +# in esr's version. +# +# 2000/4/15 +# * add cud, ech, etc., to beterm based on feedback from Rico Tudor -TD +# * correct color definition for ibm3164, make minor changes to other +# IBM terminal definitions based on recent terminfo descriptions -TD +# +# 2000/4/22 +# * add mgterm, from NetBSD -TD +# * add alias sun-cgsix for sun-ss5 as per NetBSD +# * change cons25w to use rs2 for reset rather than rs1 -TD +# * add rc/sc to aixterm based on manpage -TD +# +# 2000/5/13 +# * remove ncv from xterm-16color, xterm-256color +# +# 2000/6/10 +# * add kmous capability to linux to use Joerg Schoen's gpm patch. +# +# 2000/7/1 +# * add Eterm (Michael Jennings) +# +# 2000-07-18 +# * add amiga-vnc entry. +# +# 2000-08-12 +# * correct description of Top Gun Telnet. +# * add kterm-color +# +# 2000-08-26 +# * add qansi* entries from QNX ftp site. +# +# 2000-09-16 +# * add Matrix Orbital entries by Eric Z. Ayers). +# * add xterm-basic, xterm-sco entries, update related entries to XFree86 +# 4.0.1c -TD +# +# 2000-09-17 +# * add S0, E0 extensions to screen's entry -TD +# +# 2000-09-23 +# * several corrections based on tic's new parameter-checking code -TD +# * modify xterm-r6 and similar rs2 sequences which had \E7...\E8 +# bracketing sequences that reset video attributes (\E8 would restore +# them) -TD +# +# 2000-11-11 +# * rename cygwin to cygwinB19, adapt newer entry from Earnie Boyd -TD +# +# 2000-12-16 +# * improved scoansi, based on SCO man-page, and testing console, +# scoterm with tack -TD +# +# 2001-01-27 +# * modify kterm to use acsc via SCS controls. +# +# 2001-02-10 +# * screen 3.9.8 allows xterm mouse controls to pass-through +# +# 2001-03-11 +# * remove spurious "%|" from some xterm entries. +# +# 2001-03-31 +# * modify 'screen' khome/kend to match screen 3.09.08 +# * add examples of 'screen' customization (screen.xterm-xfree86, +# screen.xterm-r6, screen.teraterm) -TD +# +# 2001-04-14 +# * correct definitions of shifted editing keys for xterm-xfree86 -TD +# * add "Apple_Terminal" entries -Benjamin Sittler +# * remove time-delays from "Apple_Terminal" entries -TD +# * make sgr entries time-delays consistent with individual caps -TD +# +# 2001-05-05 +# * corrected/updated screen.xterm-xfree86 +# +# 2001-05-19 +# * ELKS descriptions, from Federico Bianchi +# * add u6 (CSR) to Eterm (Michael Jennings). +# +# 2001-07-21 +# * renamed "Apple_Terminal" entries to "nsterm" to work with Solaris's +# tic which handles names no longer than 14 characters. Add +# corresponding descriptions for the Darwin PowerPC console named +# "xnuppc" -Benjamin Sittler +# +# 2001-09-01 +# * change kbs in mach entries to ^? (Marcus Brinkmann). +# +# 2001-11-17 +# * add "putty" entry -TD +# * updated "Apple_Terminal" entries -Benjamin Sittler +# +# 2001-11-24 +# * add ms-vt100-color entry -TD +# * add "konsole" entries -TD +# +# 2001-12-08 +# * update gnome entry to Redhat 7.2 -TD +# +# 2002-05-25 +# * add kf13-kf48 strings to cons25w -TD +# * add pcvt25-color entry -TD +# * changed a few /usr/lib/tabset -> /usr/share/tabset. +# * improve some features of scoansi entry based on SCO's version -TD +# * add scoansi-new entry corresponding to OpenServer 5.0.6 +# +# 2002-06-15 +# * add kcbt to screen entry -TD +# +# 2002-06-22 +# * add rxvt-16color, ibm+16color, mvterm entries -TD +# +# 2002-09-28 +# * split out linux-basic entry, making linux-c inherit from that, and +# in turn linux (with cnorm, etc) inherit from linux-c-nc to reflect +# the history of this console type -TD +# * scaled the linux-c terminfo entry to match linux-c-nc, i.e., the +# r/g/b parameters of initc are in the range 0 to 1000 -TD +# +# 2002-10-05 +# * minor fix for scale-factor of linux-c and linux-c-nc -TD +# +# 2002-11-09 +# * split-out vt100+keypad and vt220+keypad, fix interchanged ka3/kb2 +# in the latter -TD +# +# 2002-11-16 +# * add entries for mterm (mterm, mterm-ansi, decansi) -TD +# * ncr260wy350pp has only 16 color pairs -TD +# * add sun-type4 from NetBSD -TD +# * update xterm-xfree86 to current (xterm patch #170) -TD +# * add screen-bce, screen-s entries -TD +# * add xterm-1002, xterm-1003 entries -TD +# +# 2003-01-11 +# * update homepage for Top Gun Telnet/SSH +# +# 2003-01-25 +# * reduce duplication in emx entries, added emx-base -TD +# +# 2003-05-24 +# * corrected acs for screen.teraterm -TD +# * add tkterm entry -TD +# +# 2003-07-15 +# * cygwin changes from Charles Wilson: +# misc/terminfo.src (nxterm|xterm-color): make xterm-color +# primary instead of nxterm, to match XFree86's xterm.terminfo +# usage and to prevent circular links. +# (rxvt): add additional codes from rxvt.org. +# (rxvt-color): new alias +# (rxvt-xpm): new alias +# (rxvt-cygwin): like rxvt, but with special acsc codes. +# (rxvt-cygwin-native): ditto. rxvt may be run under XWindows, or +# with a "native" MSWin GUI. Each takes different acsc codes, +# which are both different from the "normal" rxvt's acsc. +# (cygwin): cygwin-in-cmd.exe window. Lots of fixes. +# (cygwinDBG): ditto. +# +# 2003-09-27 +# * update gnome terminal entries -TD +# +# 2003-10-04 +# * add entries for djgpp 2.03 and 2.04 -TD +# +# 2003-10-25 +# * add alias for vtnt -TD +# * update xterm-xfree86 for XFree86 4.4 -TD +# +# 2003-11-22 +# * add linux-vt (Andrey V Lukyanov) +# +# 2003-12-20 +# * add screen.linux -TD +# +# 2004-01-10 +# * revised/improved entries for tvi912b, tvi920b (Benjamin Sittler) +# +# 2004-01-17 +# * add OpenNT/Interix/SFU entries (Federico Bianchi) +# * add vt100+ and vt-utf8 entries -TD +# * add uwin entry -TD +# +# 2004-03-27 +# * add sgr strings to several common entries lacking them, e.g., +# screen, to make the entries more portable -TD +# * remove cvvis from rxvt entry, since it is the same as cnorm -TD +# * similar fixups for cvvis/cnorm various entries -TD +# +# 2004-05-22 +# * remove 'ncv' from xterm-256color (xterm patch #188) -TD +# +# 2004-06-26 +# * add mlterm -TD +# * add xterm-xf86-v44 -TD +# * modify xterm-new aka xterm-xfree86 to accommodate luit, which relies +# on G1 being used via an ISO-2022 escape sequence (report by +# Juliusz Chroboczek) -TD +# * add 'hurd' entry -TD +# +# 2004-07-03 +# * make xterm-xf86-v43 derived from xterm-xf86-v40 rather than +# xterm-basic -TD +# * align with xterm #192's use of xterm-new -TD +# * update xterm-new and xterm-8bit for cvvis/cnorm strings -TD +# * make xterm-new the default "xterm" -TD +# +# 2004-07-10 +# * minor fixes for emu -TD +# * add emu-220 +# * add rmam/smam to linux (Trevor Van Bremen) +# * change wyse acsc strings to use 'i' map rather than 'I' -TD +# * fixes for avatar0 -TD +# * fixes for vp3a+ -TD +# +# 2004-07-17 +# * add xterm-pc-fkeys -TD +# * review/update gnome and gnome-rh90 entries (prompted by +# Redhat Bugzilla #122815) -TD +# * review/update konsole entries -TD +# * add sgr, correct sgr0 for kterm and mlterm -TD +# * correct tsl string in kterm -TD +# +# 2004-07-24 +# * make ncsa-m rmacs/smacs consistent with sgr -TD +# * add sgr, rc/sc and ech to syscons entries -TD +# * add function-keys to decansi -TD +# * add sgr to mterm-ansi -TD +# * add sgr, civis, cnorm to emu -TD +# * correct/simplify cup in addrinfo -TD +# * corrections for gnome and konsole entries +# (Redhat Bugzilla #122815) -Hans de Goede +# * modify DEC entries (vt220, etc), to add sgr string, and to use +# ISO-2022 strings for rmacs/smacs -TD +# +# 2004-07-31 +# * rename xterm-pc-fkeys to xterm+pcfkeys -TD +# +# 2004-08-07 +# * improved putty entry -Robert de Bath +# +# 2004-08-14 +# * remove dch/dch1 from rxvt because they are implemented inconsistently +# with the common usage of bce/ech -TD +# * remove khome from vt220 (vt220's have no home key) -TD +# * add rxvt+pcfkeys -TD +# +# 2004-08-21 +# * modify several entries to ensure xterm mouse and cursor visibility +# are reset in rs2 string: hurd, putty, gnome, konsole-base, mlterm, +# Eterm, screen. (The xterm entries are left alone - old ones for +# compatibility, and the new ones do not require this change) -TD +# +# 2004-08-28 +# * add morphos entry -Pavel Fedin +# * modify amiga-8bit to add khome/kend/knp/kpp -Pavel Fedin +# * corrected \E[5?l to \E[?5l in vt320 entries -TD +# +# 2004-11-20 +# * update wsvt25 entry -TD +# +# 2005-01-29 +# * update pairs for xterm-88color and xterm-256color to reflect the +# ncurses extended-color support -TD +# +# 2005-02-26 +# * modify sgr/sgr0 in xterm-new to improve tgetent's derived "me" -TD +# * add aixterm-16color to demonstrate 16-color capability -TD +# +# 2005-04-23 +# * add media-copy to vt100 -TD +# * corrected acsc string for vt52 -TD +# +# 2005-04-30 +# * add kUP, kDN (user-defined shifted up/down arrow) definitions for +# xterm-new -TD +# * add kUP5, kUP6, etc., for xterm-new and rxvt -TD +# +# 2005-05-07 +# * re-corrected acsc string for vt52 -TD +# +# 2005-05-28 +# * corrected sun-il sgr string which referred to bold and underline -TD +# * add sun-color entry -TD +# +# 2005-07-23 +# * modify sgr0 in several entries to reset alternate-charset as in the +# sgr string -TD +# * modify sgr string of prism9 to better match the individual +# attributes -TD +# +# 2005-10-15 +# * correct order of use= in rxvt-basic -TD +# +# 2005-10-26 +# * use kind/kri as shifted up/down cursor keys for xterm-new -TD +# +# 2005-11-12 +# * other minor fixes to cygwin based on tack -TD +# * correct smacs in cygwin (report by Baurzhan Ismagulov). +# +# 2006-02-18 +# * add nsterm-16color entry -TD +# * remove ncv flag from xterm-16color -TD +# * remove setf/setb from xterm-256color to match xterm #209 -TD +# * update mlterm entry to 2.9.2 -TD +# +# 2006-02-25 +# * fixes to make nsterm-16color match report +# by Christian Ebert -Alain Bench +# +# 2006-04-22 +# * add xterm+256color building block -TD +# * add gnome-256color, putty-256color, rxvt-256color -TD +# +# 2006-05-06 +# * add hpterm-color -TD +# +# 2006-06-24 +# * add xterm+pcc0, xterm+pcc1, xterm+pcc2, xterm+pcc3 -TD +# * add gnome-fc5 (prompted by GenToo #122566) -TD +# * remove obsolete/misleading comments about kcbt on Linux -Alain Bench +# * improve xterm-256color by combining the ibm+16color setaf/setab +# strings with SGR 48. The setf/setb strings also are cancelled here +# rather than omitted so derived entries will cancel those also -Alain +# Bench +# +# 2006-07-01 +# * add some notes regarding copyright to terminfo.src -TD +# * use rxvt+pcfkeys in Eterm -TD +# * remove km and flash from gnome, Eterm and rxvt since they do not work +# as one would expect (km sends ESC rather than setting the 8th bit +# of the key) -TD +# * add/use ansi+enq, vt100+enq and vt102+enq -TD +# * add konsole-solaris -TD +# +# 2006-07-22 +# * update xterm-sun and xterm-sco entries to match xterm #216 -TD +# * modify is2/rs2 strings for xterm-r6 as per fix in xterm #148 -TD +# * modify xterm-24 to inherit from "xterm" -TD +# * add xiterm entry -TD +# * add putty-vt100 entry -TD +# * corrected spelling of Michael A Dorman's name, prompted by +# http://www.advogato.org/person/mdorman/diary.html -TD +# +# 2006-08-05 +# * add xterm+pcf0, xterm+pcf2 from xterm #216 -TD +# * update xterm+pcfkeys to match xterm #216 -TD +# +# 2006-08-17 +# * make descriptions of xterm entries consistent with its terminfo -TD +# +# 2006-08-26 +# * add xfce, mgt -TD +# +# 2006-09-02 +# * correct acsc string in kterm -TD +# +# 2006-09-09 +# * add kon entry -TD +# * remove invis from linux and related entries, add klone+sgr8 for those +# that implement the feature (or have not been shown to lack it) -TD +# +# 2006-09-23 +# * add ka2, kb1, kb3, kc2 to vt220-keypad as an extension -TD +# * minor improvements to rxvt+pcfkeys -TD +# +# 2006-09-30 +# * fix a few typos in if/then/else expressions -TD +# +# 2006-10-07 +# * add several GNU Screen variations with 16- and 256-colors, and +# status line (Alain Bench). +# +# 2007-03-03 +# * add Newbury Data entries (Jean-Charles Billaud). +# +# 2007-06-10 +# * corrected xterm+pcf2 modifiers for F1-F4, match xterm #226 -TD +# +# 2007-07-14 +# * restore section of pre-ncurses-4.2 changelog to fix attribution -TD +# * add konsole-256color entry -TD +# +# 2007-08-18 +# * add 9term entry (request by Juhapekka Tolvanen) -TD +# +# 2007-10-13 +# * correct kIC in rxvt+pcfkeys (prompted by Debian #446444) -TD +# * add shift-control- and control-modified keys for rxvt editing +# keypad -TD +# * update mlterm entry to 2.9.3 -TD +# * add mlterm+pcfkeys -TD +# +# 2007-10-20 +# * move kLFT, kRIT, kind and kri capabilities from xterm-new to +# xterm+pcc0, etc., to make the corresponding building blocks reflect +# xterm's capabilities -TD +# * add mrxvt entry -TD +# * add xterm+r6f2, use in mlterm and mrxvt entries -TD +# +# 2007-11-03 +# * correct acsc strings for h19 and z100 (Benjamin Sittler) +# +# 2007-11-11 +# * use xterm-xf86-v44 for "xterm-xfree86", reflecting changes to +# xterm starting with xterm patch #216 -TD +# * make legacy xterm entries such as xterm-24 inherit from xterm-old, +# to match xterm #230 -TD +# * extend xterm+pccX entries to match xterm #230 -TD +# * add xterm+app, xterm+noapp, from xterm #230 -TD +# * add/use xterm+pce2 from xterm #230, in xterm+pcfkeys -TD +# +# 2008-04-19 +# * add screen.rxvt -TD +# +# 2008-04-28 +# * add screen+fkeys (prompted by Debian #478094) -TD +# +# 2008-06-28 +# * add screen.mlterm -TD +# * improve mlterm and mlterm+pcfkeys -TD +# +# 2008-08-23 +# * add Eterm-256color, Eterm-88color -TD +# * add rxvt-88color -TD +# +# 2008-10-12 +# * add teraterm4.59 entry, use that as primary teraterm entry, rename +# original to teraterm2.3 -TD +# * update "gnome" to 2.22.3 -TD +# * update "konsole" to 1.6.6 -TD +# * add "aterm" -TD +# * add "linux2.6.26" -TD +# +# 2008-11-15 +# * change several \E[2g (clear tab at current column) to \E[3g +# (clear all tabs) to match definition for tbc capability -TD +# +# 2008-11-29 +# * add eterm-color -TD +# +# 2009-01-10 +# * add screen.Eterm -TD +# +# 2009-03-28 +# * correct typo in pfkey of ansi.sys-old +# (report by Kalle Olavi Niemitalo) +# * move function- and cursor-keys from emx-base to ansi.sys, and create +# a pfkey capability which handles F1-F48 -TD +# +# 2009-05-02 +# * add vwmterm entry (Bryan Christ) +# +# 2009-09-19 +# * change ncv and op capabilities in sun-color to match Sun's entry for +# this (report by Laszlo Peter) +# * improve interix smso by using reverse rather than bold (report by +# Kristof Zelechovski). +# +# 2009-10-03 +# * remove unnecessary kcan assignment to ^C from putty (Sven Joachim) +# * add linux-16color (Benjamin Sittler) +# * correct initc capability of linux-c-nc end-of-range (Benjamin Sittler) +# * similar change for dg+ccc and dgunix+ccc (Benjamin Sittler) +# * add ccc and initc capabilities to xterm-16color -TD +# +# 2009-10-31 +# * updated nsterm* entries (Benjamin Sittler, prompted by GenToo #206201) +# +# 2009-12-12 +# * updated nsterm* entries (Benjamin Sittler, Emanuele Giaquinta) +# +# 2009-12-19 +# * add bw (auto-left-margin) to nsterm* entries (Benjamin Sittler) +# * rename minix to minix-1.7, add minix entry for Minix3 -TD +# +# 2009-12-26 +# * add bterm (bogl 0.1.18) -TD +# * minor fix to rxvt+pcfkeys -TD +# +# 2010-02-06 +# * update mrxvt to 0.5.4, add mrxvt-256color -TD +# +# 2010-02-13 +# * add several screen-bce.XXX entries -TD +# +# 2010-02-23 +# * modify screen-bce.XXX entries to exclude ech, since screen's color +# model does not clear with color for that feature -TD +# +# 2010-03-20 +# * rename atari and st52 to atari-old, st52-old, use newer entries from +# FreeMiNT by Guido Flohr (from patch/report by Alan Hourihane). +# +# 2010-06-12 +# * add mlterm-256color entry -TD +# +# 2010-07-17 +# * add hard-reset for rs2 to wsvt25 to help ensure that reset ends +# the alternate character set (patch by Nicholas Marriott) +# +# 2010-08-28 +# * improve acsc for vt52 (Benjamin Sittler) +# * modify nsterm entries for consistent sgr/sgr0 -TD +# * modify xnuppc entries for consistent sgr/sgr0 -TD +# * add invis to tek4115 sgr -TD +# +# 2010-09-11 +# * reformat acsc strings to canonical format -TD +# +# 2010-09-25 +# * add "XT" capability to entries for terminals that support both +# xterm-style mouse- and title-controls, for "screen" which +# special-cases TERM beginning with "xterm" or "rxvt" -TD +# +# 2010-10-02 +# * fill in no-parameter forms of cursor-movement where a parameterized +# form is available -TD +# * fill in missing cursor controls where the form of the controls is +# ANSI -TD +# * add parameterized cursor-controls to linux-basic (report by Dae) -TD +# +# 2010-10-09 +# * correct comparison used for setting 16-colors in linux-16color +# entry (Novell #644831) -TD +# * improve linux-16color entry, using "dim" for color-8 which makes it +# gray rather than black like color-0 -TD +# +# 2010-11-20 +# * make "vte" the principal entry defining "gnome", since GNOME terminal +# is merely one of several terminals whose behavior is provided by this +# library -TD +# +# 2010-11-27 +# * fix typo in rmso for tek4106 -Goran Weinholt +# +# 2010-12-11 +# * suppress ncv in screen entry, allowing underline -Alejandro R. Sedeno +# * also suppress ncv in konsole-base -TD +# +# 2011-02-05 +# * add U8 feature to denote entries for terminal emulators which do not +# support VT100 SI/SO when processing UTF-8 encoding -TD +# * add xterm-utf8 as a demo of the U8 feature -TD +# +# 2011-02-20 +# * add cons25-debian entry (Brian M Carlson, Debian #607662). +# +# 2011-06-11 +# * update minix entry to minix 3.2 (Thomas Cort). +# +# 2011-07-09 +# * fix inconsistent tabset path in pcmw (Todd C. Miller). +# * remove a backslash which continued comment, obscuring altos3 +# definition with OpenBSD toolset (Nicholas Marriott). +# +# 2011-07-16 +# * add/use xterm+tmux chunk from xterm #271 -TD +# * resync xterm-new entry from xterm #271 -TD +# * add E3 extended capability to linux-basic (Miroslav Lichvar) +# * add linux2.2, linux2.6, linux3.0 entries to give context for E3 -TD +# * add SI/SO change to linux2.6 entry (Debian #515609) -TD +# +# 2011-07-21 +# * add kich1 to sun (Yuri Pankov) +# * use bold rather than reverse for smso in sun-color (Yuri Pankov). +# +# 2011-08-06 +# * corrected k9 in dg460-ansi, add other features based on manuals -TD +# +# 2011-08-20 +# * minor cleanup of X-terminal emulator section -TD +# * add terminator entry -TD +# * add simpleterm entry -TD +# +# 2011-09-10 +# * add xterm+kbs fragment from xterm #272 -TD +# +# 2011-11-12 +# * add pccon entries for OpenBSD console (Alexei Malinin) +# +# 2011-12-17 +# * corrected old changelog comments -TD +# +# 2011-11-24 +# * add putty-sco -TD +# +# 2012-01-28 +# * add mach-gnu (Samuel Thibault) +# * add mach-gnu-color, tweaks to mach-gnu -TD +# * make sgr for sun-color agree with smso -TD +# * make sgr for prism9 agree with other caps -TD +# * make sgr for icl6404 agree with other caps -TD +# * make sgr for ofcons agree with other caps -TD +# * make sgr for att5410v1, att4415, att620 agree with other caps -TD +# * make sgr for aaa-unk, aaa-rv agree with other caps -TD +# * make sgr for avt-ns agree with other caps -TD +# +# 2012-02-11 +# * make sgr for xterm-pcolor agree with other caps -TD +# * make sgr for att5425 agree with other caps -TD +# * make sgr for att630 agree with other caps -TD +# * make sgr for linux entries agree with other caps -TD +# * make sgr for tvi9065 agree with other caps -TD +# * make sgr for ncr260vt200an agree with other caps -TD +# * make sgr for ncr160vt100pp agree with other caps -TD +# * make sgr for ncr260vt300an agree with other caps -TD +# * make sgr for aaa-60-dec-rv, aaa+dec agree with other caps -TD +# * make sgr for cygwin, cygwinDBG agree with other caps -TD +# +# 2012-03-31 +# * correct order of use-clauses in st-256color -TD +# +# 2012-04-01 +# * revert 2011-07-16 change to "linux" alias, return to "linux2.2" -TD +# +# 2012-04-14 +# * document all of the user-defined capabilities in one place -TD +# * add XT to some places to improve usefulness for other applications +# than screen, which would like to pretend that xterm's title is +# a status-line. -TD +# * change use-clauses in ansi-mtabs, hp2626, and hp2622 based on review +# of ordering and overrides -TD +# +# 2012-04-21 +# * add msgr to vt420, similar DEC vtXXX entries -TD +# * add several missing vt420 capabilities from vt220 -TD +# * factor out ansi+pp from several entries -TD +# * change xterm+sl and xterm+sl-twm to include only the status-line +# capabilities and not "use=xterm", making them more generally useful +# as building-blocks -TD +# * add dec+sl building block, as example -TD +# +# 2012-04-28 +# * fix some inconsistencies between vt320/vt420, e.g., cnorm/civis -TD +# * add eslok flag to dec+sl -TD +# * dec+sl applies to vt320 and up -TD +# * drop wsl width from xterm+sl -TD +# * reuse xterm+sl in putty and nsca-m -TD +# * add ansi+tabs to vt520 -TD +# * add ansi+enq to vt220-vt520 -TD +# +# 2012-05-05 +# * remove p6 (bold) from opus3n1+ for consistency -TD +# * remove acs stuff from env230 per clues in Ingres termcap -TD +# * modify env230 sgr/sgr0 to match other capabilities -TD +# * modify smacs/rmacs in bq300-8 to match sgr/sgr0 -TD +# * make sgr for dku7202 agree with other caps -TD +# * make sgr for ibmpc agree with other caps -TD +# * make sgr for tek4107 agree with other caps -TD +# * make sgr for ndr9500 agree with other caps -TD +# * make sgr for sco-ansi agree with other caps -TD +# * make sgr for d410 agree with other caps -TD +# * make sgr for d210 agree with other caps -TD +# * make sgr for d470c, d470c-7b agree with other caps -TD +# +# 2012-05-12 +# * rewrite vt520 entry based on vt420 -TD +# * corrected 'op' for bterm (report by Samuel Thibault) -TD +# +# 2012-06-02 +# * add kdch1 to wsvt25 entry from NetBSD CVS (reported by David Lord, +# analysis by Martin Husemann). +# * add cnorm/civis to wsvt25 entry from NetBSD CVS (report/analysis by +# Onno van der Linden). +# * add kdch1 aka "Remove" to vt220 and vt220-8 entries -TD +# * add kdch1, etc., to qvt108 -TD +# * add dl1/il1 to some entries based on dl/il values -TD +# * add dl to simpleterm -TD +# +# 2012-06-10 +# * modify some older xterm entries to align with xterm source -TD +# * separate "xterm-old" alias from "xterm-r6" -TD +# +# 2012-07-28 +# * add E3 to xterm-basic and putty -TD +# +# 2012-08-11 +# * add nsterm-256color, make this the default nsterm -TD +# * remove bw from nsterm-bce, per testing with tack -TD +# +# 2012-10-12 +# * add vte-2012, gnome-2012, making these the defaults for vte/gnome +# (patch by Christian Persch). +# +# 2012-11-02 +# * reviewed vte-2012, reverted most of the change since it was incorrect +# based on testing with tack -TD +# * un-cancel the initc in vte-256color, since this was implemented +# starting with version 0.20 in 2009 -TD +# +# 2013-03-16 +# * correct typo in sgr string for sun-color, +# add bold for consistency with sgr, +# change smso for consistency with sgr -TD +# * correct typo in sgr string for terminator -TD +# * add blink to the attributes masked by ncv in linux-16color (report +# by Benjamin Sittler) +# +# 2013-03-23 +# * change initialization for vt220, similar entries for consistency +# with cursor-key strings (NetBSD #47674) -TD +# * further improvements to linux-16color (Benjamin Sittler) +# +# 2013-05-11 +# * move nsterm-related entries out of "obsolete" section to more +# plausible "ansi consoles" -TD +# * additional cleanup of table-of-contents by reordering -TD +# +# 2013-06-07 +# * added note to clarify Terminal.app's non-emulation of the various +# terminal types listed in the preferences dialog -TD +# +# 2013-11-02 +# * use TS extension to describe xterm's title-escapes -TD +# * modify terminator and nsterm-s to use xterm+sl-twm building block -TD +# * update hurd.ti, add xenl to reflect 2011-03-06 change in +# http://git.savannah.gnu.org/cgit/hurd/hurd.git/log/console/display.c +# (Debian #727119). +# * simplify pfkey expression in ansi.sys -TD +# +# 2013-11-10 +# * split-out building blocks xterm+sm+1002 and xterm+sm+1003 -TD +# +# 2014-02-22 +# * updated notes for wsvt25 based on tack and vttest -TD +# * add teken entry to show actual properties of FreeBSD's "xterm" +# console -TD +# +# 2014-03-22 +# * add terminology entry -TD +# * add mlterm3 entry, use that as "mlterm" -TD +# * inherit mlterm-256color from mlterm -TD +# +# 2014-03-23 +# * fix typo in "mlterm" entry (report by Gabriele Balducci) -TD +# +# 2014-03-30 +# * cancel ccc in putty-256color and konsole-256color for consistency +# with the cancelled initc capability (patch by Sven Zuhlsdorf). +# * add xterm+256setaf building block for various terminals which only +# get the 256-color feature half-implemented -TD +# * updated "st" entry (leaving the 0.1.1 version as "simpleterm") to +# 0.4.1 -TD +# +# 2014-05-03 +# * add vt520ansi (Mike Gran) +# +# 2014-05-24 +# * correct several entries which had termcap-style padding used in +# terminfo: adm21, aj510, alto-h19, att605-pc, x820 -TD +# * correct syntax for padding in some entries: dg211, h19 -TD +# * correct ti924-8 which had confused padding versus octal escapes -TD +# * correct padding in sbi entry -TD +# +# 2014-06-07 +# * update xterm-new to xterm patch #305 -TD +# + change screen's smso to use SGR 7 (ECMA-80 reverse) rather than SGR 3 +# (italic). This was a long-ago typo in screen 3.1.1 which was +# overlooked until a few terminal emulators implemented the feature -TD +# +# 2014-06-09 +# > fix regression in screen terminfo entries (reports by Christian +# Ebert, Gabriele Balducci) -TD +# + revert the change to screen; see notes for why this did not work -TD +# + cancel sitm/ritm for entries which extend "screen", to work around +# screen's hardcoded behavior for SGR 3 -TD +# +# 2014-06-14 +# + modify sgr for screen.xterm-new to support dim capability -TD +# + add dim capability to nsterm+7 -TD +# + cancel dim capability for iterm -TD +# + add dim, invis capabilities to vte-2012 -TD +# + add sitm/ritm to konsole-base and mlterm3 -TD +# +# 2014-10-06 +# + add xterm-1005 and xterm-1006 entries, with suggested extension +# capability "xm" -TD +# +# 2014-10-07 +# + update test-report for mrxvt -TD +# +# 2014-10-11 +# + add xterm-x10mouse, xterm-x11mouse, etc. -TD +# +# 2014-10-18 +# + reviewed terminology 0.6.1, add function key definitions. None of +# the vt100-compatibility issues were improved -TD +# +# 2015-04-22 +# + add 'dim' capability to screen entry (report by Leonardo B Schenkel) +# + add several key definitions to nsterm-bce to match preconfigured +# keys, e.g., with OSX 10.9 and 10.10 (report by Leonardo B Schenkel) +# +# 2015-05-02 +# + remove unnecessary ';' from E3 capabilities -TD +# + add tmux entry, derived from screen (patch by Nicholas Marriott). +# + split-out recent change to nsterm-bce as nsterm-build326, and add +# nsterm-build342 to reflect changes with successive releases of OSX +# (discussion with Leonardo B Schenkel) +# + add xon, ich1, il1 to ibm3161 (patch by Stephen Powell, +# Debian #783806) +# +# 2015-05-17 +# + remove screen-bce.mlterm, since mlterm does not do "bce" -TD +# + add several screen.XXX entries to support the respective variations +# for 256 colors -TD +# +# 2015-05-23 +# + add putty+fnkeys* building-block entries -TD +# +# 2015-05-30 +# + remove spurious "%;" from st entry (report by Daniel Pitts) -TD +# + add vte-2014, update vte to use that -TD +# +# 2015-06-27 +# + comment-out "screen.xterm" entry, and inherit screen.xterm-256color +# from xterm-new (report by Richard Birkett) -TD +# +# 2015-07-25 +# + add status line to tmux via xterm+sl (patch by Nicholas Marriott). +# + fixes for st 0.5 from testing with tack -TD +# +# 2015-10-24 +# + updated minitel entries to fix kel problem with emacs, and add +# minitel1b-nb (Alexandre Montaron). +# + reviewed/updated nsterm entry Terminal.app in OSX -TD +# + replace some dead URLs in commands with equivalents from the +# Internet Archive -TD +# +# 2015-11-14 +# + add bold to pccon+sgr+acs and pccon-base (Tati Chevron). +# + add keys f12-f124 to pccon+keys (Tati Chevron). +# +# 2015-11-21 +# + fix some inconsistencies in the pccon* entries -TD +# +# 2015-11-28 +# + add viewdata (Alexandre Montaron). +# +# 2016-01-16 +# + tidy up comments about hardcoded 256color palette (report by +# Leonardo Brondani Schenkel) -TD +# + add putty-noapp entry, and amend putty entry to use application mode +# for better consistency with xterm (report by Leonardo Brondani +# Schenkel) -TD +# +# 2016-04-23 +# + add 'oc' capability to xterm+256color, allowing palette reset for +# xterm -TD +# +# 2016-05-14 +# + modify linux2.6 entry to improve line-drawing -TD +# + make linux3.0 entry the default linux entry (Debian #823658) -TD +# +# 2016-05-29 +# + modify rs1 for xterm-16color, xterm-88color and xterm-256color to +# reset palette using "oc" string as in linux -TD +# +# 2016-06-11 +# + use ANSI reply for u8 in xterm-new, to reflect vt220-style responses +# that could be returned -TD +# + added a few capabilities fixed in recent vte -TD +# +# 2016-08-17 +# + correct a typo in interix -TD +# +# 2016-09-24 +# + updated minitel entries to use status line with screen(1), as well as +# printing special G2 videotex chars like french accentuated glyph +# using special cap XC= (patch by Alexandre Montaron). +# +# 2016-10-01 +# + add linux-m1 minitel entries (patch by Alexandre Montaron). +# + correct rs2 string for vt100-nam -TD +# +# 2016-11-26 +# + modify linux-16color to not mask dim, standout or reverse with the +# ncv capability -TD +# + add 0.1sec mandatory delay to flash capabilities using the VT100 +# reverse-video control -TD +# + omit selection of ISO-8859-1 for G0 in enacs capability from linux2.6 +# entry, to avoid conflict with the user-defined mapping. The reset +# feature will use ISO-8859-1 in any case (Mikulas Patocka). +# +# 2016-12-30 +# + merge current st description (report by Harry Gindi) -TD +# +# 2016-12-31 +# + modify flash capability for linux and wyse entries to put the delay +# between the reverse/normal escapes rather than after -TD +# +# 2017-01-28 +# + minor comment-fixes to help automate links to bug-urls -TD +# + add dvtm, dvtm-256color -TD +# + add settings corresponding to xterm-keys option to tmux entry to +# reflect upcoming change to make that option "on" by default +# (patch by Nicholas Marriott). +# + uncancel Ms in tmux entry (Harry Gindi, Nicholas Marriott). +# + add dumb-emacs-ansi -TD +# +# 2017-03-05 +# + correct a few spelling errors in comments -TD +# + add fbterm -TD +# +# 2017-03-11 +# + add vt100+4bsd building block, use that for older terminals rather +# than "vt100" which is now mostly used as a building block for +# terminal emulators -TD +# + modify vt100 rs2 string to reset vt52 mode and scrolling regions +# (report/analysis by Robert King) -TD +# +# 2017-04-01 +# + minor fixes for vt100+4bsd, e.g., delay in sgr for consistency -TD +# + add smso for env230, to match sgr -TD +# + remove p7/protect from sgr in fbterm -TD +# + drop setf/setb from fbterm; setaf/setab are enough -TD +# + make xterm-pcolor sgr consistent with other capabilities -TD +# + add rmxx/smxx ECMA-48 strikeout extension to tmux and xterm-basic +# (discussion with Nicholas Marriott) +# +# 2017-04-22 +# + correct missing comma-separator between string capabilities in +# icl6402 and m2-nam -TD +# + update formatting with ncurses 6.0.20170422 -TD +# + restore rmir/smir in ansi+idc to better match original ansiterm+idc, +# add alias ansiterm (report by Robert King). +# +# 2017-05-13 +# + reformatted using hexadecimal numbers to improve readability -TD +# +# 2017-07-29 +# + update interix entry using tack and SFU on Windows 7 Ultimate -TD +# + use ^? for kdch1 in interix (reported by Jonathan de Boyne Pollard) +# + add "rep" to xterm-new, available since 1997/01/26 -TD +# + move SGR 24 and 27 from vte-2014 to vte-2012 (request by Alain +# Williams) -TD +# +# 2017-08-16 +# + update "iterm" entry -TD +# + add "iterm2" entry (report by Leonardo Brondani Schenkel) -TD +# +# 2017-08-18 +# + update notes on user-defined capabilities -TD +# +# 2017-08-26 +# + fixes for "iterm2" (report by Leonardo Brondani Schenkel) -TD +# +# 2017-11-11 +# + add "op" to xterm+256setaf -TD +# + reviewed terminology 1.0.0 -TD +# + reviewed st 0.7 -TD +# +# 2017-11-18 +# + modify old terminology entry and a few other terminal emulators to +# account for xon -TD +# + correct sgr string for tmux, which used screen's "standout" code +# rather than the standard code (patch by Roman Kagan) +# + correct sgr/sgr0 strings in a few other cases reported by tic, making +# those correspond to the non-sgr settings where they differ, but +# otherwise use ECMA-48 consistently: +# jaixterm, aixterm, att5420_2, att4424, att500, decansi, d410-7b, +# dm80, hpterm, emu-220, hp2, iTerm2.app, mterm-ansi, ncrvt100an, +# st-0.7, vi603, vwmterm -TD +# +# 2017-12-30 +# + add xterm+noalt, xterm+titlestack, xterm+alt1049, xterm+alt+title +# blocks from xterm #331 -TD +# + add xterm+direct, xterm+indirect, xterm-direct entries from xterm +# #331 -TD +# + modify xterm+256color and xterm+256setaf to use correct number of +# color pairs, for ncurses 6.1 -TD +# + add rs1 capability to xterm-256color -TD +# + modify xterm-r5, xterm-r6 and xterm-xf86-v32 to use xterm+kbs to +# match xterm #272, reflecting packager's changes -TD +# + remove "boolean" Se, Ss from st-0.7 -TD +# +# 2018-01-04 +# + add konsole-direct and st-direct -TD +# + remove unsupported "Tc" capability from st-0.7; use st-direct if +# direct-colors are wanted -TD +# +# 2018-01-17 +# + add vte-direct -TD +# + add XT, hpa, indn, and vpa to screen, and invis, E3 to tmux (patch by +# Pierre Carru) +# +# 2018-01-21 +# + use xterm+sm+1006 in xterm-new, vte-2014 -TD +# + use xterm+x11mouse in iterm, iterm2, mlterm3 because xterm's 1006 +# mode does not work with those programs. konsole is debatable -TD +# + add "termite" entry (report by Markus Pfeiffer) -TD +# +# 2018-01-27 +# + trim "XT" from screen entry -TD +# + modify iterm to use xterm+sl-twm building block -TD +# + mark konsole-420pc, konsole-vt100, konsole-xf3x obsolete reflecting +# konsole's removal in 2008 -TD +# + expanded the history section of konsole to explain its flawed +# imitation of xterm's keyboard -TD +# + use xterm+x11mouse in screen.* entries because screen does not yet +# support xterm's 1006 mode -TD +# + add nsterm-build400 for macOS 10.13 -TD +# + add ansi+idc1, use that in ansi+idc adding dch for consistency -TD +# + update vte to vte-2017 -TD +# + add ecma+strikeout to vte-2017 -TD +# + add iterm2-direct -TD +# + updated teraterm, added teraterm-256color -TD +# + add mlterm-direct -TD +# + add descriptions for ANSI building-blocks -TD +# +# 2018-02-24 +# + correct Ss/Ms interchange in st-0.7 entry (tmux #1264) -TD +# + fix remaining flash capabilities with trailing mandatory delays -TD +# +# 2018-03-17 +# + trim some redundant capabilities from st-0.7 -TD +# + trim unnecessary setf/setb from interix -TD +# +# 2018-05-19 +# + trim spurious whitespace from tmux in 2018-02-24 changes; +# fix some inconsistencies in/between tmux- and iterm2-entries for SGR +# (report by C Anthony Risinger) +# + improve iterm2 using some xterm features which it has adapted -TD +# +# 2018-06-30 +# + add acsc string to vi200 (Nibby Nebbulous) +# add right/down-arrow to vi200's acsc -TD +# +# 2018-07-21 +# + corrected acsc for wy50 -TD +# + add wy50 and wy60 shifted function-keys as kF1 to kF16 -TD +# + remove ansi+rep mis-added to interix in 2018-02-23 -TD +# +# 2018-07-28 +# + fix typo in tvi955 -TD +# + corrected acsc for regent60 -TD +# + add alias n7900 -TD +# +# 2018-09-29 +# + corrected acsc for tvi950 -TD +# + remove bogus kf0 from tvi950 -TD +# + added function-key definitions to agree with TeleVideo 950 manual -TD +# + add bel to tvi950 -TD +# + add shifted function-keys to regent60 -TD +# + renumber regent40 function-keys to match manual -TD +# + add cd (clr_eos) to adds200 -TD +# +# 2018-10-27 +# + add OpenGL clients alacritty and kitty -TD +# + add Smulx for tmux, vte-2018 -Nicholas Marriott +# +# 2018-12-15 +# + fix a typo in comments (Aaron Gyes). +# + add nsterm-build309 to replace nsterm-256color, assigning the latter +# as an alias of nsterm, to make mouse work with nsterm-256color -TD +# + base gnome-256color entry on "gnome", not "vte", for consistency -TD +# +# 2019-01-12 +# + add nsterm-direct -TD +# + use SGR 1006 mouse for konsole-base -TD +# + use SGR 1006 mouse for putty -TD +# + add ti703/ti707, ti703-w/ti707-w (Robert Clausecker) +# +# 2019-02-23 +# + fix typo in adds200 -TD +# +# 2019-03-30 +# + add "screen5", to mention italics (report by Stefan Assmann) +# + modify description of xterm+x11hilite to eliminate unused p5 -TD +# +# 2019-05-18 +# + update xterm-new to xterm patch #345 -TD +# + add/use xterm+keypad in xterm-new (report by Alain D D Williams) -TD +# + update terminator entry -TD +# + remove hard-tabs from ti703 (report by Robert Clausecker) +# + add Smol/Rmol for mintty, vte-2018 -Nicholas Marriott +# +# 2019-06-01 +# + add rs1 to konsole, mlterm -TD +# +# 2019-06-08 +# + add mintty, mintty-direct (Thomas Wolff) +# 2019-06-09 +# + comment-out some user-defined capabilities in mintty+common to allow +# builds with existing releases 5.9-6.1 -TD +# +# 2019-06-30 +# + add ms-terminal -TD +# + add vscode, vscode-direct -TD +# + use ecma+index in screen, st -TD +# +# 2019-07-06 +# + add domterm -TD +# + improve comments for recent changes, add alias xterm.js -TD +# +# 2019-08-03 +# + amend the change to screen, because tmux relies upon that entry +# and does not support that feature (Debian #933572) -TD +# + updated ms-terminal entry & notes -TD +# + updated kitty entry & notes -TD +# + updated alacritty+common entry & notes -TD +# + use xterm+sl-twm for consistency -TD +# +# 2019-09-22 +# + correct a comment -TD +# +# 2019-10-26 +# + modify linux-16color to accommodate Linux console driver change in +# early 2018 (report by Dino Petrucci). +# +# 2019-11-02 +# + add "xterm-mono" to help packagers (report by Sven Joachim) -TD +# +# 2019-11-09 +# + drop ich1 from rxvt-basic, Eterm and mlterm to improve compatibility +# with old non-curses programs -TD +# + reviewed st 0.8.2, updated some details -TD +# + use ansi+rep several places -TD +# +# 2020-01-12 +# + update alacritty entries for 0.4.0 (prompted by patch by +# Christian Duerr) -TD +# +# 2020-01-18 +# + spelling fixes per codespell -TD +# + improve xm example for xterm+x11mouse, xterm+sm+1006 -TD +# +# 2020-02-22 +# + improve vt50h and vt52 based on DECScope manual -TD +# + add/use vt52+keypad and vt52-basic -TD +# +# 2020-04-18 +# + use vt52+keypad in xterm-vt52, from xterm #354 -TD +# +# 2020-04-25 +# + use vt100+fnkeys in putty -TD +# +# 2020-05-02 +# + add details on the change to Linux SGR 21 in 2018 -TD +# + add xterm-direct16 and xterm-direct256 -TD +# +# 2020-05-03 +# + fix some dead URLs -TD +# +# 2020-05-16 +# + update notes on vscode / xterm.js -TD +# +# 2020-05-30 +# + re-enable "bel" in konsole-base (report by Nia Huang) +# + add linux-s entry (patch by Alexandre Montaron). +# +# 2020-06-06 +# + add xterm+256color2, xterm+88color2, to deprecate nonstandard usage +# in xterm+256color, xterm+88color -TD +# + add shifted Linux console keys in linux+sfkeys entry for +# screen.linux (report by Alexandre Montaron). +# + use vt100+enq in screen (report by Alexandre Montaron). +# + add screen.linux-s alias (suggested by Alexandre Montaron). +# +# 2020-07-11 +# + fix pound-sign mapping in acsc of linux2.6 entry (report by Ingo +# Bruckl). +# +# 2020-08-28 +# + correct icl6404 csr (report by Florian Weimer). +# + correct ti916 cup (report by Florian Weimer). +# + improve ndr9500 (report by Florian Weimer). +# +# 2020-09-05 +# + correct description of vt330/vt340 (Ross Combs). +# +# 2020-09-19 +# + update mlterm3 for 3.9.0 (report by Premysl Eric Janouch). +# +# 2020-09-29 +# + add tmux-direct (tmux #2370) +# + simplify mlterm initialization with DECSTR -TD +# + change tmux's kbs to ^? (report by Premysl Eric Janouch) +# +# 2020-10-10 +# + correct sgr in aaa+rv (report by Florian Weimer) -TD +# + fix some sgr inconsistencies in d230c, ibm6153, ibm6154, +# ncrvt100an -TD +# +# 2020-10-17 +# + expanded notes about tek4107 -TD +# +# 2020-11-07 +# + update kitty+common -TD +# + add putty+screen and putty-screen (suggested by Alexandre Montaron). +# +# 2020-11-28 +# + add Smulx to alacritty (Christian Duerr). +# + add rep to PuTTY -TD +# + add putty+keypad -TD +# +# 2020-12-05 +# + correct mlterm3 kf1-kf4 (Debian #975322) -TD +# + add flash to mlterm3 -TD +# +# 2020-12-27 +# + update terminology to 1.8.1 -TD +# +# 2021-01-16 +# + add comment for linux2.6 regarding CONFIG_CONSOLE_TRANSLATIONS +# (report by Patrick McDermott) -TD +# +# 2021-01-25 +# + split-out att610+cvis, vt220+cvis, vt220+cvis8 -TD +# + add vt220-base, for terminal emulators which generally have not +# supported att610's blinking cursor control -TD +# + use vt220+cvis in vt220, etc -TD +# + use att610+cvis, xterm+tmux and ansi+enq in kitty -TD +# + use vt220+cvis in st, terminology, termite since they ignore +# blinking-cursor detail in att610+cvis -TD +# +# 2021-02-20 +# + add/use vt220+pcedit and vt220+vtedit -TD +# + add scrt/securecrt and absolute -TD +# + add nel to xterm-new, though supported since X11R5 -TD +# + add/use xterm+nofkeys -TD +# + move use of ecma+italics from xterm-basic to xterm+nofkeys -TD +# +# 2021-02-27 +# + remove a duplicate "use" in xterm-vt220 -TD +# +# 2021-03-14 +# + correct use-ordering in some xterm-direct flavors -TD +# +# 2021-03-20 +# + add hterm, hterm-256color (Mike Frysinger) +# +# 2021-06-26 +# + use default colors in pccon "op" -TD +# + correct rmacs/smacs in aaa+dec, aaa+rv -TD +# + add hpterm-color2 and hp98550-color (Martin Trusler) +# +# 2021-07-17 +# + correct typo in "vip" comments (report by Nick Black), reviewed this +# against Glink manual -TD +# + fill in some missing pieces for pccon, to make it comparable to the +# vt220 entry -TD +# +# 2021-07-24 +# + trim "flash" from pccon+base -TD +# + revert change for aaa+rv -TD +# + add workaround for Windows Terminal's problems with CR/LF mapping to +# ms-terminal (patch by Juergen Pfeifer). +# + review/update current Windows Terminal vs ms-terminal -TD +# +# 2021-07-31 +# + add extensions in xterm+tmux and ecma+strikeout to ms-terminal, +# but cancel the non-working Cr and Ms capabilities -TD +# + add foot and foot-direct -TD +# +# 2021-08-15 +# + fix missing "%d" for setaf/setab code 8-15 in xterm+direct16 (report +# by Florian Weimer) -TD +# +# 2021-08-16 +# + corrected tsl capability for terminator -TD +# +# 2021-09-04 +# + modify linux3.0 entry to reflect default mapping of shift-tab by +# kbd 1.14 (report by Jan Engelhardt) -TD +# +# 2021-09-11 +# + add testing note for xterm-{hp|sco|sun} -TD +# + corrected description for ansi.sys-old -TD +# + add xterm+nopcfkeys, to fill in keys for xterm-hp, xterm-sun -TD +# + use hp+arrows in a few places -TD +# + use hp+pfk-cr in a few places -TD +# +# 2021-09-21 +# + add kbeg to xterm+keypad to accommodate termcap applications -TD +# + add smglp and smgrp to vt420+lrmm, to provide useful data for the +# "tabs" +m option -TD +# +# 2021-10-09 +# + fill in some details for infoton -TD +# + fix spelling/consistency in several descriptions -TD +# + use vt420+lrmm in vt420 -TD +# +# 2021-10-13 +# + trim some redundant definitions -TD +# +# 2021-11-13 +# + add xterm+sl-alt, use that in foot+base (report by Jonas Grosse +# Sundrup) -TD +# +# 2021-11-20 +# + add dim, ecma+strikeout to st-0.6 -TD +# +# 2021-11-27 +# + fix errata in description fields (report by Eric Lindblad) -TD +# + add x10term+sl, aixterm+sl, ncr260vp+sl, ncr260vp+vt, wyse+sl -TD +# +# 2022-01-23 +# + update kitty -TD +# +# 2022-03-12 +# + add xterm+acs building-block -TD +# + add xterm-p370, for use in older terminals -TD +# + add dec+sl to xterm-new, per patch #371 -TD +# + add mosh and mosh-256color -TD +# +# 2022-03-19 +# + add xgterm -TD +# + correct setal in mintty/tmux entries, add to vte-2018 (report by +# Robert Lange) +# + add blink to vte-2018 (report by Robert Lange) +# +# 2022-03-26 +# + update teken -TD +# + add teken-16color, teken-vt and teken-sc -TD +# + add a few missing details for vte-2018 (report by Robert Lange) -TD +# +# 2022-03-27 +# + make description-fields distinct -TD +# +# 2022-04-30 +# + modify samples for xterm mouse 1002/1003 modes to use 1006 mode, and +# also provide for focus in/out responses -TD +# +# 2022-05-28 +# + expanded notes for teken/syscons -TD +# +# 2022-06-04 +# + remove u6-u9 from teken-2018 -TD +# + set "xterm-new" to "xterm-p370", add "xterm-p371" -TD +# +# 2022-06-18 +# + revise kon/kon2/jfbterm to undo "linux2.6" change to +# smacs/rmacs/enacs (Debian #1012800) -TD +# + amended note for att610+cvis0, as per documentation for att610, +# att620, att730 -TD +# +# 2022-06-25 +# + correct dsl in dec+sl (report by Rajeev Pillai) -TD +# + add/use ansi+cpr, decid+cpr -TD +# +# 2022-07-03 +# + use NQ to flag entries where the terminal does not support query and +# response -TD +# + use ansi+enq and decid+cpr in cases where the terminal probably +# supported the u6-u9 extension -TD +# + add/use apollo+vt132, xterm+alt47 -TD +# +# 2022-08-27 +# + modify nsterm to use xterm+alt1049 (report by Paul Handly) -TD +# + modify putty to use xterm+alt1049 -TD +# +# 2022-12-24 +# + add/use bracketed+paste to help identify terminals supporting this +# xterm feature (prompted by discussion with Bram Moolenaar) -TD +# +# 2022-12-29 +# + correct PS vs PE names in bracketed+paste (report by Bram Moolenaar) +# -TD +# +# 2023-01-07 +# + add comment to bracketed+paste explaining that vim patch 9.0.1117 is +# needed for use with the updated xterm descriptions (suggested by Bram +# Moolenaar). +# + add RV report+version (suggested by Bram Moolenaar). +# +# 2023-01-14 +# + change RV to XR/xr, to avoid conflict with pre-existing usage in vim, +# to use RV/rv to denote DA2 and its response (discussion with Bram +# Moolenaar) -TD +# + add XF flag to xterm+focus so that termcap applications can be aware +# of terminals which may support focus in/out -TD +# + use xterm+focus in xterm-p370 and tmux -TD +# +# 2023-01-28 +# + document XF, kxIN and kxOUT -TD +# + add note on sun/wscons/cmdtool/shelltool -TD +# +# 2023-04-01 +# + remove DECCOLM+DECSCLM from foot (patch by Daniel Ekloef). +# +# 2023-04-08 +# + add xterm+focus to alacritty+common (patch by Christian Duerr). +# +# 2023-05-08 +# + add mode 1004 to xterm+sm+1006 from xterm #380 -TD +# +# 2023-06-05 +# + add xterm+focus to foot+base (patch by Daniel Ekloef). +# +# 2023-07-08 +# + add linux+kbs for terminals which imitate xterm's behavior with +# Linux -TD +# +# 2023-07-15 +# + mention E3 in regard to user_caps(5) -TD +# +# 2023-08-12 +# + add/use putty+cursor to reflect amending of modified cursor-keys in +# 2021 -TD +# + add ecma+strikeout to putty -TD +# +# 2023-10-21 +# + use oldxterm+sm+1006 in vte-2014 (report by Benno Schulenberg) -TD +# + add ansi+apparrows -TD +# +# 2023-10-28 +# + move xterm focus mode 1004 from xterm+sm+1006 into xterm+focus as +# fe/fd capabilities, like vim (vim-pr #13440). +# +# 2023-11-11 +# + used "infocmp -u" to help trim redundant capabilities -TD +# +# 2023-12-09 +# + remove xterm+sm+1006 from tmux (Debian #1057688). +# + used "infocmp -u" to help trim redundant capabilities -TD +# +# 2023-12-16 +# + used "infocmp -u" to help trim redundant capabilities -TD +# +# 2023-12-30 +# + add ms-vt100-16color, winconsole -TD +# + add rio, rio-direct -TD +# + add mostlike -TD +# + add wezterm, contour -TD +# +# 2024-01-06 +# + use ansi+arrows, ansi+apparrows, ansi+csr, ansi+erase, ansi+idc, +# ansi+idc1, ansi+idl, ansi+idl1, ansi+inittabs to trim -TD +# +# 2024-01-07 +# + restore padding for wy520* and vt320-k311 (report by Sven Joachim). +# +# 2024-01-13 +# + use ansi+local, ansi+local1, ansi+pp, ansi+rca, ansi+rca2, ansi+sgr +# to trim -TD +# +# 2024-01-14 +# + use ansi+sgrbold, ansi+sgrdim, ansi+sgrso, ansi+sgrul, ansi+tabs +# ecma+color, ecma+sgr, vt100+4bsd, vt100+pfkeys, vt220+pcedit +# xterm+256color, xterm+acs, xterm+nopcfkeys, xterm+pcf2 to trim -TD +# +# 2024-01-27 +# + amend change to z39-a (report by Sven Joachim). +# + use xterm+nopcfkeys, vt52-basic, dec+pp, dec+sl, vt52+arrows, +# hp+pfk+cr, klone+acs, klone+color, klone+sgr, ncr160wy50+pp +# to trim -TD +# + NetBSD-related fixes for x68k and wsvt52 (patch by Thomas Klausner) +# +# 2024-02-11 +# + add vt100+noapp, vt100+noapp+pc, xterm+app+pc, xterm+decedit from +# xterm #389 -TD +# +# 2024-03-09 +# + modify xgterm to work around line-drawing bug -TD +# + use CSI 3J in vte-2017 (report by Sven Joachim) +# +# 2024-05-25 +# + review/update iTerm2 for 3.5.0 -TD +# +# 2024-07-27 +# + modify wezterm, omitting its broken left/right margin feature (report +# by Thayne McCombs) -TD +# +# 2024-08-17 +# + review/update foot for 1.18.1 -TD +# + add a note about DomTerm 3.2.0 -TD +# +# 2024-09-07 +# + update comments -TD +# +# 2024-10-05 +# + use xterm+alt+title in wezterm -TD +# + update comments -TD +# +# 2024-10-26 +# + update ms-terminal -TD +# + add ms-terminal-direct -TD +# +# 2024-11-02 +# + add extended-keys for djgpp 2.05 -TD +# +######## SHANTIH! SHANTIH! SHANTIH! diff --git a/contrib/ncurses/mk-0th.awk b/contrib/ncurses/mk-0th.awk new file mode 100644 index 00000000..36622430 --- /dev/null +++ b/contrib/ncurses/mk-0th.awk @@ -0,0 +1,175 @@ +# $Id: mk-0th.awk,v 1.24 2021/03/20 11:44:48 tom Exp $ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 1998-2010,2012 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Generate list of sources for a library, together with lint/lintlib rules +# +# Variables: +# libname (library name, e.g., "ncurses", "panel", "forms", "menus") +# subsets (is used here to decide if wide-character code is used) +# ticlib (library name for libtic, e.g., "tic") +# termlib (library name for libtinfo, e.g., "tinfo") +# +function make_lintlib(name,sources) { + print "" + print "clean ::" + printf "\trm -f llib-l%s.*\n", name + print "" + print "realclean ::" + printf "\trm -f llib-l%s\n", name + print "" + printf "llib-l%s : %s\n", name, sources + printf "\tcproto -a -l -DNCURSES_ENABLE_STDBOOL_H=0 -DLINT $(CPPFLAGS) %s >$@\n", sources + print "" + print "lintlib ::" + printf "\tsh $(srcdir)/../misc/makellib %s $(CPPFLAGS)\n", name + print "" + print "lint ::" + printf "\t$(LINT) $(LINT_OPTS) $(CPPFLAGS) %s $(LINT_LIBS)\n", sources +} + +# A blank in "subsets" indicates a split-off of the library into a separate +# file, e.g., for libtic or libtinfo. They are all logical parts of the same +# library. +function which_library() { + if ( ( which == "ticlib" ) && ( subsets ~ /ticlib / ) ) { + return ticlib; + } else if ( ( which == "termlib" || which == "ext_tinfo" ) && ( subsets ~ /[[:space:]]base/ ) ) { + return termlib; + } else { + return libname; + } +} + +function show_list(name, len, list) { + if ( len > 0 ) { + printf "\n%s_SRC =", toupper(name); + for (n = 0; n < len; ++n) + printf " \\\n\t%s", list[n]; + print ""; + make_lintlib(name, sprintf("$(%s_SRC)", toupper(name))); + } +} + +BEGIN { + which = libname; + using = 0; + found = 0; + count_ticlib = 0; + count_termlib = 0; + count_library = 0; + } + /^@/ { + which = $0; + sub(/^@[[:blank:]]+/, "", which); + sub(/[[:blank:]]+$/, "", which); + } + !/^[@#]/ { + if (using == 0) + { + print "" + print "# generated by mk-0th.awk" + printf "# libname: %s\n", libname + printf "# subsets: %s\n", subsets + if ( libname ~ /ncurses/ ) { + printf "# ticlib: %s\n", ticlib + printf "# termlib: %s\n", termlib + } + print "" + print ".SUFFIXES: .c .cc .h .i .ii" + print ".c.i :" + printf "\t$(CPP) $(CPPFLAGS) $< >$@\n" + print ".cc.ii :" + printf "\t$(CPP) $(CPPFLAGS) $< >$@\n" + print ".h.i :" + printf "\t$(CPP) $(CPPFLAGS) $< >$@\n" + print "" + using = 1; + } + if (which ~ /port_/ ) + { + # skip win32 source + } + else if ( $0 != "" && $1 != "link_test" ) + { + if ( found == 0 ) + { + if ( subsets ~ /widechar/ ) + widechar = 1; + else + widechar = 0; + printf "C_SRC =" + if ( $2 == "lib" ) + found = 1 + else if ( $2 == "c++" ) + found = 2 + else + found = 3 + } + if ( libname == "c++" || libname == "c++w" ) { + srcname = sprintf("%s/%s.cc", $3, $1); + printf " \\\n\t%s", srcname; + } else if ( widechar == 1 || $3 != "$(wide)" ) { + srcname = sprintf("%s/%s.c", $3, $1); + printf " \\\n\t%s", srcname; + if ( which_library() == libname ) { + list_library[count_library++] = srcname; + } else if ( which_library() == ticlib ) { + list_ticlib[count_ticlib++] = srcname; + } else { + list_termlib[count_termlib++] = srcname; + } + } + } + } +END { + print "" + if ( found == 1 ) + { + print "" + printf "# Producing llib-l%s is time-consuming, so there's no direct-dependency for\n", libname; + print "# it in the lintlib rule. We'll only remove in the cleanest setup."; + show_list(libname, count_library, list_library); + show_list(ticlib, count_ticlib, list_ticlib); + show_list(termlib, count_termlib, list_termlib); + } + else if ( found == 2 ) + { + make_lintlib(libname, "$(C_SRC)"); + } + else + { + print "" + print "lintlib :" + print "\t@echo no action needed" + } + } +# vile:ts=4 sw=4 diff --git a/contrib/ncurses/mk-1st.awk b/contrib/ncurses/mk-1st.awk new file mode 100644 index 00000000..639de74a --- /dev/null +++ b/contrib/ncurses/mk-1st.awk @@ -0,0 +1,608 @@ +# $Id: mk-1st.awk,v 1.128 2024/08/11 09:04:32 tom Exp $ +############################################################################## +# Copyright 2018-2023,2024 Thomas E. Dickey # +# Copyright 1998-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# Generate list of objects for a given model library +# Variables: +# name (library name, e.g., "ncurses", "panel", "forms", "menus") +# traces ("all" or "DEBUG", to control whether tracing is compiled in) +# MODEL (e.g., "DEBUG", uppercase; toupper is not portable) +# CXX_MODEL (e.g., "DEBUG", uppercase) +# LIB_SUFFIX (e.g., "", "w", "t", "tw") +# USE_LIB_SUFFIX (e.g., "", "w", "t", "tw") +# model (directory into which we compile, e.g., "obj") +# prefix (e.g., "lib", for Unix-style libraries) +# suffix (e.g., "_g.a", for debug libraries) +# subset ("none", "base", "base+ext_funcs" or "termlib", etc.) +# driver ("yes" or "no", depends on --enable-term-driver) +# ShlibVer ("rel", "abi" or "auto", to augment DoLinks variable) +# ShlibVerInfix ("yes" or "no", determines location of version #) +# SymLink ("ln -s", etc) +# TermlibRoot ("tinfo" or other root for libterm.so) +# TermlibSuffix (".so" or other suffix for libterm.so) +# ReLink ("yes", or "no", flag to rebuild shared libs on install) +# ReRanlib ("yes", or "no", flag to rerun ranlib for installing static) +# DoLinks ("yes", "reverse" or "no", flag to add symbolic links) +# rmSoLocs ("yes" or "no", flag to add extra clean target) +# ldconfig (path for this tool, if used) +# make_phony ("yes" if the make-program accepts ".PHONY" directive. +# overwrite ("yes" or "no", flag to add link to libcurses.a +# depend (optional dependencies for all objects, e.g, ncurses_cfg.h) +# host (cross-compile host, if any) +# libtool_version (libtool "-version-info" or "-version-number") +# +# Notes: +# CLIXs nawk does not like underscores in command-line variable names. +# Mixed-case variable names are ok. +# HP-UX requires shared libraries to have executable permissions. +# +function is_ticlib() { + return ( subset ~ /^ticlib$/ ); + } +function is_termlib() { + return ( subset ~ /^(ticlib\+)?termlib((\+[^+ ]+)*\+[a-z_]+_tinfo)?$/ ); + } +# see lib_name +function lib_name_of(a_name) { + return sprintf("%s%s%s", prefix, a_name, suffix) + } +# see imp_name +function imp_name_of(a_name) { + if (ShlibVerInfix == "cygdll" || ShlibVerInfix == "msysdll" || ShlibVerInfix == "mingw") { + result = sprintf("%s%s%s.a", prefix, a_name, suffix); + } else if (ShlibVerInfix == "msvcdll") { + result = sprintf("%s%s%s.lib", prefix, a_name, suffix); + } else{ + result = ""; + } + return result; + } +# see abi_name +function abi_name_of(a_name) { + if (ShlibVerInfix == "cygdll") { + result = sprintf("%s%s$(ABI_VERSION)%s", "cyg", a_name, suffix); + } else if (ShlibVerInfix == "msysdll") { + result = sprintf("%s%s$(ABI_VERSION)%s", "msys-", a_name, suffix); + } else if (ShlibVerInfix == "mingw" || ShlibVerInfix == "msvcdll") { + result = sprintf("%s%s$(ABI_VERSION)%s", prefix, a_name, suffix); + } else if (ShlibVerInfix == "yes") { + result = sprintf("%s%s.$(ABI_VERSION)%s", prefix, a_name, suffix); + } else { + result = sprintf("%s.$(ABI_VERSION)", lib_name_of(a_name)); + } + return result; + } +# see rel_name +function rel_name_of(a_name) { + if (ShlibVerInfix == "cygdll") { + result = sprintf("%s%s$(REL_VERSION)%s", "cyg", a_name, suffix); + } else if (ShlibVerInfix == "msysdll") { + result = sprintf("%s%s$(ABI_VERSION)%s", "msys-", a_name, suffix); + } else if (ShlibVerInfix == "mingw" || ShlibVerInfix == "msvcdll") { + result = sprintf("%s%s$(REL_VERSION)%s", prefix, a_name, suffix); + } else if (ShlibVerInfix == "yes") { + result = sprintf("%s%s.$(REL_VERSION)%s", prefix, a_name, suffix); + } else { + result = sprintf("%s.$(REL_VERSION)", lib_name_of(a_name)); + } + return result; + } +# see end_name +function end_name_of(a_name) { + if ( MODEL != "SHARED" ) { + result = lib_name_of(a_name); + } else if ( DoLinks == "reverse") { + result = lib_name_of(a_name); + } else { + if ( ShlibVer == "rel" ) { + result = rel_name_of(a_name); + } else if ( ShlibVer == "abi" || ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll" ) { + result = abi_name_of(a_name); + } else { + result = lib_name_of(a_name); + } + } + return result + } +function symlink(src,dst) { + if ( src != dst ) { + if ( SymLink !~ /.*-f.*/ ) { + printf "rm -f %s; ", dst + } + printf "$(LN_S) %s %s; ", src, dst + } + } +function rmlink(directory, dst) { + if ( dst != "" ) { + printf "\t-rm -f %s/%s\n", directory, dst + } + } +function removelinks(directory) { + nlinks = 0; + links[nlinks++] = end_name; + if ( DoLinks == "reverse" ) { + if ( ShlibVer == "rel" ) { + links[nlinks++] = abi_name; + links[nlinks++] = rel_name; + } else if ( ShlibVer == "abi" ) { + links[nlinks++] = abi_name; + } + } else { + if ( ShlibVer == "rel" ) { + links[nlinks++] = abi_name; + links[nlinks++] = lib_name; + } else if ( ShlibVer == "abi" ) { + links[nlinks++] = lib_name; + } + } + for (j = 0; j < nlinks; ++j) { + found = 0; + for (k = 0; k < j; ++k ) { + if ( links[j] == links[k] ) { + found = 1; + break; + } + } + if ( !found ) { + rmlink(directory, links[j]); + } + } + } +function make_shlib(objs, shlib_list) { + printf "\t$(MK_SHARED_LIB) $(%s_OBJS) $(%s)\n", objs, shlib_list + } +function sharedlinks(directory) { + if ( ShlibVer != "auto" && ShlibVer != "cygdll" && ShlibVer != "msysdll" && ShlibVer != "mingw" && ShlibVer != "msvcdll" ) { + printf "\tcd %s && (", directory + if ( DoLinks == "reverse" ) { + if ( ShlibVer == "rel" ) { + symlink(lib_name, abi_name); + symlink(abi_name, rel_name); + } else if ( ShlibVer == "abi" ) { + symlink(lib_name, abi_name); + } + } else { + if ( ShlibVer == "rel" ) { + symlink(rel_name, abi_name); + symlink(abi_name, lib_name); + } else if ( ShlibVer == "abi" ) { + symlink(abi_name, lib_name); + } + } + printf ")\n" + } + } +# termlib may be named explicitly via "--with-termlib=XXX", which overrides +# any suffix. Temporarily override "suffix" to account for this. +function termlib_end_of() { + termlib_save_suffix = suffix; + suffix = TermlibSuffix; + termlib_temp_result = end_name_of(TermlibRoot); + suffix = termlib_save_suffix; + return termlib_temp_result; +} +function shlib_build(directory) { + dst_libs = sprintf("%s/%s", directory, end_name); + printf "%s : \\\n", dst_libs + if (subset == "ticlib" && driver == "yes" ) { + base = name; + sub(/^tic/, "ncurses", base); # workaround for "w" + printf "\t\t%s/%s \\\n", directory, end_name_of(base); + } + if (subset ~ /^base/ || subset == "ticlib" ) { + save_suffix = suffix + sub(/^[^.]\./,".",suffix) + if (directory != "../lib") { + printf "\t\t%s/%s \\\n", "../lib", termlib_end_of(); + } + printf "\t\t%s/%s \\\n", directory, termlib_end_of(); + suffix = save_suffix + } + printf "\t\t$(RESULTING_SYMS) $(%s_OBJS)\n", OBJS + printf "\t@echo linking $@\n" + printf "\t@mkdir -p %s\n", directory + if ( ReLink != "yes" ) { + printf "\t@sleep 1\n" + } + if ( is_ticlib() ) { + make_shlib(OBJS, "TICS_LIST") + } else if ( is_termlib() ) { + make_shlib(OBJS, "TINFO_LIST") + } else { + make_shlib(OBJS, "SHLIB_LIST") + } + sharedlinks(directory) + } +function shlib_install(directory) { + src_lib1 = sprintf("../lib/%s", end_name); + dst_lib1 = sprintf("%s/%s", directory, end_name); + printf "%s : \\\n", dst_lib1 + printf "\t\t%s \\\n", directory + printf "\t\t%s\n", src_lib1 + printf "\t@echo installing $@\n" + printf "\t$(INSTALL_LIB) %s %s\n", src_lib1, dst_lib1; + sharedlinks(directory) + } +function install_dll(directory,filename) { + src_name = sprintf("../lib/%s", filename); + dst_name = sprintf("%s/%s", directory, filename); + printf "\t@echo installing %s as %s\n", src_name, dst_name + if ( directory == "$(BINDIR)" ) { + program = "$(INSTALL) -m 755"; + } else { + program = "$(INSTALL_LIB)"; + } + printf "\t%s %s %s\n", program, src_name, dst_name + } +function in_subset(value) { + value = " " value " "; + check = subset; + gsub("[+]", " ", check); + check = " " check " "; + return index(check,value); + } +function trim_suffix(value) { + if (USE_LIB_SUFFIX != "" && length(value) > length(USE_LIB_SUFFIX)) { + check = substr(value, 1 + length(value) - length(USE_LIB_SUFFIX)); + if (check == USE_LIB_SUFFIX) { + value = substr(value, 1, length(value) - length(USE_LIB_SUFFIX)); + } + } + return value; +} +BEGIN { + TOOL_PREFIX = ""; + found = 0; + using = 0; + } + /^@/ { + using = 0 + if (subset == "none") { + using = 1 + print "" + print "# generated by mk-1st.awk" + } else if (in_subset($2) > 0) { + if (using == 0) { + if (found == 0) { + if ( name ~ /^.*\+\+.*/ ) { + if ( CXX_MODEL == "NORMAL" && MODEL == "SHARED" ) { + print "" + printf "# overriding model from %s to match CXX_MODEL\n", MODEL; + MODEL = "NORMAL"; + suffix = ".a"; + DoLinks = "no"; + } + } + print "" + printf "# generated by mk-1st.awk (subset=%s)\n", subset + printf "# name: %s\n", name + printf "# traces: %s\n", traces + printf "# MODEL: %s\n", MODEL + printf "# CXX_MODEL: %s\n", CXX_MODEL + printf "# LIB_SUFFIX: %s\n", LIB_SUFFIX + printf "# USE_LIB_SUFFIX: %s\n", USE_LIB_SUFFIX + printf "# model: %s\n", model + printf "# prefix: %s\n", prefix + printf "# suffix: %s\n", suffix + printf "# subset: %s\n", subset + printf "# driver: %s\n", driver + printf "# ShlibVer: %s\n", ShlibVer + printf "# ShlibVerInfix: %s\n", ShlibVerInfix + printf "# SymLink: %s\n", SymLink + printf "# TermlibRoot: %s\n", TermlibRoot + printf "# TermlibSuffix: %s\n", TermlibSuffix + printf "# ReLink: %s\n", ReLink + printf "# ReRanlib: %s\n", ReRanlib + printf "# DoLinks: %s\n", DoLinks + printf "# rmSoLocs: %s\n", rmSoLocs + printf "# ldconfig: %s\n", ldconfig + printf "# make_phony: %s\n", make_phony + printf "# overwrite: %s\n", overwrite + printf "# depend: %s\n", depend + printf "# host: %s\n", host + printf "# libtool_version: %s\n", libtool_version + print "" + } + using = 1 + } + if ( is_ticlib() ) { + OBJS = MODEL "_P" + } else if ( is_termlib() ) { + OBJS = MODEL "_T" + } else { + OBJS = MODEL + } + } + } + /^[@#]/ { + next + } + $1 ~ /trace/ { + if (traces != "all" && traces != MODEL && $1 != "lib_trace") + next + } + { + if (using \ + && ( $1 != "link_test" ) \ + && ( $2 == "lib" \ + || $2 == "progs" \ + || $2 == "c++" )) + { + if ( found == 0 ) + { + printf "%s_OBJS =", OBJS + if ( $2 == "lib" ) { + found = 1; + } else if ( $2 == "c++" ) { + TOOL_PREFIX = "CXX_"; + found = 1; + } else { + found = 2; + } + if ( $2 == "c++" ) { + CC_NAME="CXX" + CC_FLAG="CXXFLAGS" + } else { + CC_NAME="CC" + CC_FLAG="CFLAGS" + } + } + printf " \\\n\t../%s/%s$o", model, $1; + } + } +END { + print "" + if ( found != 0 ) + { + printf "\n$(%s_OBJS) : %s\n", OBJS, depend + } + if ( found == 1 ) + { + print "" + lib_name = lib_name_of(name); + if ( MODEL == "SHARED" ) + { + abi_name = abi_name_of(name); + rel_name = rel_name_of(name); + imp_name = imp_name_of(name); + end_name = end_name_of(name); + + shlib_build("../lib") + + print "" + print "install \\" + print "install.libs \\" + + if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll") { + + dst_dirs = "$(BINDIR) $(LIBDIR)"; + printf "install.%s :: %s $(LIBRARIES)\n", name, dst_dirs + install_dll("$(BINDIR)",end_name); + install_dll("$(LIBDIR)",imp_name); + + } else { + + lib_dir = "$(LIBDIR)"; + printf "install.%s :: %s/%s\n", name, lib_dir, end_name + print "" + if ( ReLink == "yes" ) { + shlib_build(lib_dir) + } else { + shlib_install(lib_dir) + } + } + + if ( overwrite == "yes" && name == "ncurses" ) + { + if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || SlibVer == "msvcdll") { + if (ShlibVer == "msvcdll") { + curses_prefix = "" + } else { + curses_prefix = "lib" + } + ovr_name = sprintf("%scurses%s.a", curses_prefix, suffix) + printf "\t@echo linking %s to %s\n", imp_name, ovr_name + printf "\tcd $(LIBDIR) && (" + symlink(imp_name, ovr_name) + printf ")\n" + } else { + ovr_name = sprintf("libcurses%s", suffix) + printf "\t@echo linking %s to %s\n", end_name, ovr_name + printf "\tcd $(LIBDIR) && (" + symlink(end_name, ovr_name) + printf ")\n" + } + } + if ( ldconfig != "" && ldconfig != ":" ) { + printf "\t- test -z \"$(DESTDIR)\" && %s\n", ldconfig + } + print "" + print "uninstall \\" + print "uninstall.libs \\" + printf "uninstall.%s ::\n", name + if ( ShlibVer == "cygdll" || ShlibVer == "msysdll" || ShlibVer == "mingw" || ShlibVer == "msvcdll") { + + printf "\t@echo uninstalling $(BINDIR)/%s\n", end_name + printf "\t-@rm -f $(BINDIR)/%s\n", end_name + + printf "\t@echo uninstalling $(LIBDIR)/%s\n", imp_name + printf "\t-@rm -f $(LIBDIR)/%s\n", imp_name + + } else { + printf "\t@echo uninstalling $(LIBDIR)/%s\n", end_name + removelinks("$(LIBDIR)") + if ( overwrite == "yes" && name == "ncurses" ) + { + ovr_name = sprintf("libcurses%s", suffix) + printf "\t-@rm -f $(LIBDIR)/%s\n", ovr_name + } + } + if ( rmSoLocs == "yes" ) { + print "" + print "mostlyclean \\" + print "clean ::" + printf "\t-@rm -f so_locations\n" + } + } + else if ( MODEL == "LIBTOOL" ) + { + end_name = lib_name; + use_name = trim_suffix(TermlibRoot) USE_LIB_SUFFIX + printf "../lib/%s : \\\n", lib_name + if ( (name != use_name ) && ( index(name, "++") == 0 ) && ( index(name, "tic") == 1 || index(name, "ncurses") == 1 ) ) { + printf "\t\t../lib/lib%s.la \\\n", use_name; + if ( index(name, "tic") == 1 && index(TermlibRoot, "ncurses") != 1 ) { + printf "\t\t../lib/lib%s%s.la \\\n", "ncurses", USE_LIB_SUFFIX; + } + } + printf "\t\t$(%s_OBJS)\n", OBJS + if ( is_ticlib() ) { + which_list = "TICS_LIST"; + } else if ( is_termlib() ) { + which_list = "TINFO_LIST"; + } else { + which_list = "SHLIB_LIST"; + } + printf "\tcd ../lib && $(LIBTOOL_LINK) $(%s) $(%s) \\\n", CC_NAME, CC_FLAG; + printf "\t\t-o %s $(%s_OBJS:$o=.lo) \\\n", lib_name, OBJS; + printf "\t\t-rpath $(libdir) \\\n"; + printf "\t\t%s $(NCURSES_MAJOR):$(NCURSES_MINOR) $(LT_UNDEF) $(%s) $(LDFLAGS)\n", libtool_version, which_list; + if ( make_phony == "yes" ) { + print "" + printf ".PHONY :\tinstall.%s\n", trim_suffix(name); + } + print "" + print "install \\" + print "install.libs \\" + printf "install.%s :: \\\n", trim_suffix(name); + printf "\t\t$(LIBDIR) \\\n"; + use_name = TermlibRoot USE_LIB_SUFFIX + if ( (name != use_name ) && ( index(name, "++") == 0 ) && ( index(name, "tic") == 1 || index(name, "ncurses") == 1 ) ) { + if ( trim_suffix(TermlibRoot) != trim_suffix(name) ) { + printf "\t\tinstall.%s \\\n", trim_suffix(TermlibRoot); + } + if ( index(name, "tic") == 1 && index(TermlibRoot, "ncurses") != 1 && trim_suffix(name) != "ncurses" ) { + printf "\t\tinstall.%s \\\n", "ncurses"; + } + } + printf "\t\t../lib/%s\n", lib_name + printf "\t@echo installing ../lib/%s as $(LIBDIR)/%s\n", lib_name, lib_name + printf "\tcd ../lib; $(LIBTOOL_INSTALL) $(INSTALL) %s $(LIBDIR)\n", lib_name + print "" + print "uninstall \\" + print "uninstall.libs \\" + printf "uninstall.%s ::\n", trim_suffix(name) + printf "\t@echo uninstalling $(LIBDIR)/%s\n", lib_name + printf "\t-@$(LIBTOOL_UNINSTALL) rm -f $(LIBDIR)/%s\n", lib_name + } + else + { + end_name = lib_name; + printf "../lib/%s : $(%s_OBJS)\n", lib_name, OBJS + # workaround: binutils' ranlib tries to be clever with + # timestamps, by pretending its update took no time, confusing + # the make utility. + if ( ReLink != "yes" ) { + printf "\t@sleep 1\n" + } + printf "\t$(%sAR) $(%sARFLAGS) $@ $?\n", TOOL_PREFIX, TOOL_PREFIX; + printf "\t$(RANLIB) $@\n" + if ( host == "vxworks" ) + { + printf "\t$(LD) $(LD_OPTS) $? -o $(@:.a=$o)\n" + } + print "" + print "install \\" + print "install.libs \\" + printf "install.%s :: $(LIBDIR) ../lib/%s\n", name, lib_name + printf "\t@echo installing ../lib/%s as $(LIBDIR)/%s\n", lib_name, lib_name + printf "\t$(INSTALL_DATA) ../lib/%s $(LIBDIR)/%s\n", lib_name, lib_name + if ( overwrite == "yes" && lib_name == "libncurses.a" ) + { + printf "\t@echo linking libcurses.a to libncurses.a\n" + printf "\t-@rm -f $(LIBDIR)/libcurses.a\n" + printf "\t(cd $(LIBDIR) && " + symlink("libncurses.a", "libcurses.a") + printf ")\n" + } + if ( ReRanlib == "yes" ) + { + printf "\t$(RANLIB) $(LIBDIR)/%s\n", lib_name + } + if ( host == "vxworks" ) + { + printf "\t@echo installing ../lib/lib%s$o as $(LIBDIR)/lib%s$o\n", name, name + printf "\t$(INSTALL_DATA) ../lib/lib%s$o $(LIBDIR)/lib%s$o\n", name, name + } + print "" + print "uninstall \\" + print "uninstall.libs \\" + printf "uninstall.%s ::\n", name + printf "\t@echo uninstalling $(LIBDIR)/%s\n", lib_name + printf "\t-@rm -f $(LIBDIR)/%s\n", lib_name + if ( overwrite == "yes" && lib_name == "libncurses.a" ) + { + printf "\t@echo linking libcurses.a to libncurses.a\n" + printf "\t-@rm -f $(LIBDIR)/libcurses.a\n" + } + if ( host == "vxworks" ) + { + printf "\t@echo uninstalling $(LIBDIR)/lib%s$o\n", name + printf "\t-@rm -f $(LIBDIR)/lib%s$o\n", name + } + } + print "" + print "clean ::" + removelinks("../lib"); + print "" + print "mostlyclean::" + printf "\t-rm -f $(%s_OBJS)\n", OBJS + if ( MODEL == "LIBTOOL" ) { + printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS + } + } + else if ( found == 2 ) + { + print "" + print "mostlyclean::" + printf "\t-rm -f $(%s_OBJS)\n", OBJS + if ( MODEL == "LIBTOOL" ) { + printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS + } + print "" + print "clean ::" + printf "\t-rm -f $(%s_OBJS)\n", OBJS + if ( MODEL == "LIBTOOL" ) { + printf "\t-$(LIBTOOL_CLEAN) rm -f $(%s_OBJS:$o=.lo)\n", OBJS + } + } + } +# vile:ts=4 sw=4 diff --git a/contrib/ncurses/mk-2nd.awk b/contrib/ncurses/mk-2nd.awk new file mode 100644 index 00000000..4493bcf5 --- /dev/null +++ b/contrib/ncurses/mk-2nd.awk @@ -0,0 +1,154 @@ +# $Id: mk-2nd.awk,v 1.23 2021/06/17 21:20:30 tom Exp $ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 1998-2004,2005 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# Generate compile-rules for the modules that we are using in libraries or +# programs. We are listing them explicitly because we have turned off the +# suffix rules (to force compilation with the appropriate flags). We could use +# make-recursion but that would result in makefiles that are useless for +# development. +# +# Variables: +# model directory into which objects are compiled. +# MODEL (uppercase version of "model"; toupper is not portable) +# echo (yes iff we will show the $(CC) lines) +# subset ("none", "base", "base+ext_funcs" or "termlib") +# crenames ("yes" or "no", flag to control whether -c & -o options are used) +# cxxrenames ("yes" or "no", flag to control whether -c & -o options are used) +# traces ("all" or "DEBUG", to control whether tracing is compiled in) +# srcdir is expanded when "configure --srcdir" was used +# +# Fields in src/modules: +# $1 = module name +# $2 = progs|lib|c++ +# $3 = source-directory +# +# Fields in src/modules past $3 are dependencies +# +function in_subset(value) { + value = " " value " "; + check = subset; + gsub("[+]", " ", check); + check = " " check " "; + return index(check,value); + } +BEGIN { + found = 0 + using = 0 + } + /^@/ { + using = 0 + if (subset == "none") { + using = 1 + } else if (in_subset($2) > 0) { + if (using == 0) { + if (found == 0) { + print "" + print "# generated by mk-2nd.awk" + printf "# model: %s\n", model + printf "# MODEL: %s\n", MODEL + printf "# echo: %s\n", echo + printf "# subset: %s\n", subset + printf "# crenames: %s\n", crenames + printf "# cxxrenames: %s\n", cxxrenames + printf "# traces: %s\n", traces + printf "# srcdir: %s\n", srcdir + } + using = 1 + } + } + } + /^[@#]/ { + next + } + $1 ~ /trace/ { + if (traces != "all" && traces != MODEL && $1 != "lib_trace") + next + } + { + if ($0 != "" \ + && using != 0) { + found = 1 + if ( $1 != "" ) { + print "" + if ( $2 == "c++" ) { + compile="CXX" + suffix=".cc" + use_c_o=cxxrenames + } else { + compile="CC" + suffix=".c" + use_c_o=crenames + } + printf "../%s/%s$o :\t%s/%s%s", model, $1, $3, $1, suffix + for (n = 4; n <= NF; n++) printf " \\\n\t\t\t%s", $n + print "" + if ( echo == "yes" ) + atsign="" + else { + atsign="@" + printf "\t@echo 'compiling %s (%s)'\n", $1, model + } + printf "\t%s", atsign; + if ( use_c_o != "yes" ) { + printf "cd ../%s; ", model; + } + # The choice here is between + # base+ext_funcs and + # termlib+ext_tinfo + # but they may appear in the same value. + if ( subset ~ /base/ ) { + mycflags="" + } else if ( subset ~ /termlib/ ) { + mycflags=" -DUSE_TERMLIB" + } + printf "$(LIBTOOL_COMPILE) $(%s) $(CFLAGS_%s)%s -c ", compile, MODEL, mycflags + if ( $3 == "." || srcdir == "." ) { + dir = $3 "/" + sub("^\\$\\(srcdir\\)/","",dir); + sub("^\\./","",dir); + printf "../%s/%s%s%s", name, dir, $1, suffix + } else { + printf "%s/%s%s", $3, $1, suffix + } + if ( use_c_o == "yes" ) { + printf " -o ../%s/%s$o", model, $1 + } + } else { + printf "%s", $1 + for (n = 2; n <= NF; n++) printf " %s", $n + } + print "" + } + } +END { + print "" + } diff --git a/contrib/ncurses/mk-hdr.awk b/contrib/ncurses/mk-hdr.awk new file mode 100644 index 00000000..7608afed --- /dev/null +++ b/contrib/ncurses/mk-hdr.awk @@ -0,0 +1,115 @@ +# $Id: mk-hdr.awk,v 1.8 2021/06/17 21:20:30 tom Exp $ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 2007-2010,2013 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 2007 +# +# Generate install/uninstall rules for header files +# Variables: +# subset ("none", "base", "base+ext_funcs" or "termlib", etc.) +# compat ("yes" or "no", flag to add link to curses.h +# +function basename(path) { + sub(/^.*\//,"",path) + return path; +} +function in_subset(value) { + value = " " value " "; + check = subset; + gsub("[+]", " ", check); + check = " " check " "; + return index(check,value); +} +BEGIN { + found = 0 + using = 1 + count = 0 + } + /^@/ { + using = 0 + if (subset == "none") { + using = 1 + } else if (in_subset($2) > 0) { + using = 1 + } else { + using = 0 + } + } + /^[@#]/ { + next + } + { + if (using && NF != 0) { + if (found == 0) { + print "" + print "# generated by mk-hdr.awk" + printf "# subset: %s\n", subset + printf "# compat: %s\n", compat + print "" + found = 1 + } + data[count] = $1 + count = count + 1 + } + } +END { + if ( count > 0 ) + { + print "${INCLUDEDIR} :" + print " mkdir -p $@" + print "" + print "install \\" + print "install.libs \\" + print "install.includes :: ${AUTO_SRC} ${INCLUDEDIR} \\" + + for (i = 0; i < count - 1; ++i) { + printf " %s \\\n", data[i] + } + printf " %s\n", data[count - 1] + + for (i = 0; i < count; ++i) { + printf " @ (cd ${INCLUDEDIR} && rm -f %s) ; ../headers.sh ${INSTALL_DATA} ${INCLUDEDIR} ${srcdir} %s\n", basename(data[i]), data[i] + if (data[i] == "curses.h" && compat == "yes") { + printf " @ (cd ${INCLUDEDIR} && rm -f ncurses.h && ${LN_S} %s ncurses.h)\n", data[i] + } + } + print "" + print "uninstall \\" + print "uninstall.libs \\" + print "uninstall.includes ::" + + for (i = 0; i < count; ++i) { + printf " -@ (cd ${INCLUDEDIR} && rm -f %s)\n", basename(data[i]) + if (data[i] == "curses.h" && compat == "yes") { + printf " -@ (cd ${INCLUDEDIR} && rm -f ncurses.h)\n" + } + } + } + } +# vile:ts=4 sw=4 diff --git a/contrib/ncurses/ncurses/Makefile.in b/contrib/ncurses/ncurses/Makefile.in new file mode 100644 index 00000000..404a4e9f --- /dev/null +++ b/contrib/ncurses/ncurses/Makefile.in @@ -0,0 +1,384 @@ +# $Id: Makefile.in,v 1.185 2024/08/10 18:07:57 tom Exp $ +############################################################################## +# Copyright 2018-2022,2024 Thomas E. Dickey # +# Copyright 1998-2017,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for ncurses source code. +# +# This makes the following: +# programs +# includes +# libraries (normal/debug/profile/shared) +# +# The variable 'srcdir' refers to the source-distribution, and can be set with +# the configure script by "--srcdir=DIR". +# +# The rules are organized to produce the libraries for the configured models, +# and the programs with the configured default model. + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +TOP_MFLAGS = @cf_cv_makeflags@ DESTDIR="$(DESTDIR)" RPATH_LIST="$(RPATH_LIST)" +@SET_MAKE@ + +x = @EXEEXT@ +o = .@OBJEXT@ + +MODEL = @DFT_LWR_MODEL@ +DESTDIR = @DESTDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) + +PACKAGE = @PACKAGE@ + +LIBTOOL = @LIBTOOL@ +LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ +LIBTOOL_CLEAN = @LIB_CLEAN@ +LIBTOOL_COMPILE = @LIB_COMPILE@ +LIBTOOL_LINK = @LIB_LINK@ +LIBTOOL_INSTALL = @LIB_INSTALL@ +LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ +LT_UNDEF = @LT_UNDEF@ + +INSTALL = @INSTALL@ +INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ +INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ +INSTALL_DATA = @INSTALL_DATA@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AWK = @AWK@ +LD = @LD@ +LN_S = @LN_S@ +NM = @NM@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +CC = @CC@ +CPP = @CPP@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ +LIBS = @LIBS@ + +INCDIR = $(srcdir)/../include +CPPFLAGS = -DHAVE_CONFIG_H -DBUILDING_NCURSES -I../ncurses @CPPFLAGS@ + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +BUILD_CPPFLAGS = -DHAVE_CONFIG_H -DUSE_BUILD_CC -I../ncurses -I$(srcdir) -I../include -I$(INCDIR) @BUILD_CPPFLAGS@ +BUILD_CC = @BUILD_CC@ +BUILD_CCFLAGS = @BUILD_CFLAGS@ +BUILD_LDFLAGS = @BUILD_LDFLAGS@ +BUILD_LIBS = @BUILD_LIBS@ + +# The executables built in this directory are used for generating source that +# is compiled into the build, or are test-programs that are not installed. + +BUILD_EXEEXT = @BUILD_EXEEXT@ +x = @EXEEXT@ + +CFLAGS_LIBTOOL = $(CCFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +LINK = $(LIBTOOL) +LDFLAGS = @LDFLAGS@ @LD_MODEL@ + +SHLIB_DIRS = -L../lib +SHLIB_LIST = $(SHLIB_DIRS) @SHLIB_LIST@ @LIBS@ +TINFO_LIST = $(SHLIB_DIRS) @TINFO_LIST@ @LIBS@ +TICS_LIST = $(SHLIB_DIRS) @TICS_LIST@ @LIBS@ + +RPATH_LIST = @RPATH_LIST@ +RESULTING_SYMS = @RESULTING_SYMS@ +VERSIONED_SYMS = @VERSIONED_SYMS@ +MK_SHARED_LIB = @MK_SHARED_LIB@ + +NCURSES_MAJOR = @NCURSES_MAJOR@ +NCURSES_MINOR = @NCURSES_MINOR@ +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ + +RANLIB = @LIB_PREP@ + +LIBRARIES = @Libs_To_Make@ + +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ +LINT_LIBS = -lncurses @LIBS@ + +FALLBACK_LIST = @FALLBACK_LIST@ + +USE_BIG_STRINGS = @USE_BIG_STRINGS@ +TERMINFO_CAPS = $(top_srcdir)/include/@TERMINFO_CAPS@ +CAPLIST = $(TERMINFO_CAPS) $(top_srcdir)/include/Caps-ncurses + +TERMINFO = @TERMINFO@ +TERMINFO_SRC = @TERMINFO_SRC@ +TIC_PATH = @TIC@ +INFOCMP_PATH = @INFOCMP@ + +AUTO_SRC = \ + ./codes.c \ + ./comp_captab.c \ + ./comp_userdefs.c \ + ./expanded.c \ + ./fallback.c \ + ./lib_gen.c \ + ./lib_keyname.c \ + ./link_test.c \ + ./names.c \ + ./unctrl.c \ + init_keytry.h \ + keys.list + +HEADER_DEPS = @INTERNALS_HDR@ \ + ../include/ncurses_cfg.h \ + ../include/ncurses_def.h \ + ../include/ncurses_dll.h \ + ../include/curses.h \ + ../include/term.h \ + ../include/unctrl.h \ + $(INCDIR)/nc_alloc.h \ + $(INCDIR)/nc_panel.h \ + $(INCDIR)/nc_string.h \ + $(INCDIR)/nc_termios.h \ + $(INCDIR)/nc_tparm.h \ + $(INCDIR)/nc_win32.h \ + $(INCDIR)/term_entry.h \ + $(srcdir)/curses.priv.h \ + $(srcdir)/new_pair.h \ + $(srcdir)/term.priv.h + +TEST_DEPS = ../lib/@LIB_PREFIX@ncurses@DFT_DEP_SUFFIX@ +TEST_ARGS = @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@ +TEST_LDFLAGS = @LD_MODEL@ $(TEST_ARGS) @LIBS@ @LOCAL_LDFLAGS@ @LDFLAGS@ + +TEST_PROGS = \ + captoinfo$x \ + hardscroll$x \ + hashmap$x \ + lib_mvcur$x \ + link_test$x \ + report_hashing$x + +LOCAL_LIBDIR = @top_builddir@/lib + +base = $(srcdir)/base +serial = $(srcdir)/tty +tinfo = $(srcdir)/tinfo +trace = $(srcdir)/trace +wide = $(srcdir)/widechar +win32con = $(srcdir)/win32con + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : test_progs + +all libs :: $(AUTO_SRC) ../lib $(LIBRARIES) + +@CHECK_BUILD@all libs :: report_offsets$(BUILD_EXEEXT) + +sources: $(AUTO_SRC) + +$(BINDIR) \ +$(LIBDIR) : + mkdir -p $@ + +../lib : ; mkdir $@ + +./fallback.c : $(tinfo)/MKfallback.sh + $(SHELL) -e $(tinfo)/MKfallback.sh $(TERMINFO) $(TERMINFO_SRC) "$(TIC_PATH)" "$(INFOCMP_PATH)" $(FALLBACK_LIST) >$@ + +./lib_gen.c : $(base)/MKlib_gen.sh ../include/curses.h + FGREP="@FGREP@" $(SHELL) -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" generated <../include/curses.h >$@ + +init_keytry.h : make_keys$(BUILD_EXEEXT) keys.list + ./make_keys$(BUILD_EXEEXT) keys.list > $@ + +keys.list : $(tinfo)/MKkeys_list.sh + AWK=$(AWK) USE_SIGWINCH=@cf_cv_enable_sigwinch@ $(SHELL) $(tinfo)/MKkeys_list.sh $(CAPLIST) | LC_ALL=C sort >$@ + +make_keys$(BUILD_EXEEXT) : \ + build.priv.h \ + $(tinfo)/make_keys.c \ + ./names.c + $(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(tinfo)/make_keys.c $(BUILD_LDFLAGS) $(BUILD_LIBS) + +make_hash$(BUILD_EXEEXT) : \ + build.priv.h \ + $(tinfo)/make_hash.c \ + ../include/hashsize.h + $(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(tinfo)/make_hash.c $(BUILD_LDFLAGS) $(BUILD_LIBS) + +report_offsets$(BUILD_EXEEXT) : \ + $(srcdir)/curses.priv.h \ + $(srcdir)/report_offsets.c + $(BUILD_CC) -o $@ $(BUILD_CPPFLAGS) $(BUILD_CCFLAGS) $(srcdir)/report_offsets.c $(BUILD_LDFLAGS) $(BUILD_LIBS) + ./report_offsets$(BUILD_EXEEXT) + +./expanded.c : $(srcdir)/curses.priv.h $(serial)/MKexpanded.sh + $(SHELL) -e $(serial)/MKexpanded.sh "$(CPP)" $(CPPFLAGS) > $@ + +./comp_captab.c: \ + make_hash$(BUILD_EXEEXT) \ + ../include/hashsize.h \ + $(tinfo)/MKcaptab.sh \ + $(tinfo)/MKcaptab.awk + $(SHELL) -e $(tinfo)/MKcaptab.sh $(AWK) $(USE_BIG_STRINGS) $(tinfo)/MKcaptab.awk $(CAPLIST) > $@ + +./comp_userdefs.c: \ + make_hash$(BUILD_EXEEXT) \ + ../include/hashsize.h \ + $(tinfo)/MKuserdefs.sh + $(SHELL) -e $(tinfo)/MKuserdefs.sh $(AWK) $(USE_BIG_STRINGS) $(CAPLIST) > $@ + +./lib_keyname.c: keys.list $(base)/MKkeyname.awk + $(AWK) -f $(base)/MKkeyname.awk use_sigwinch=@cf_cv_enable_sigwinch@ bigstrings=$(USE_BIG_STRINGS) keys.list > $@ + +./codes.c: $(tinfo)/MKcodes.awk + $(AWK) -f $(tinfo)/MKcodes.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@ + +./names.c: $(tinfo)/MKnames.awk + $(AWK) -f $(tinfo)/MKnames.awk bigstrings=$(USE_BIG_STRINGS) $(CAPLIST) >$@ + +./unctrl.c: $(base)/MKunctrl.awk + echo | $(AWK) -f $(base)/MKunctrl.awk bigstrings=$(USE_BIG_STRINGS) >$@ + +tags: + $(CTAGS) *.[ch] */*.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] */*.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac + -test -d trace || rm -f trace + -rm -f $(TEST_PROGS) + +clean :: mostlyclean + -rm -f $(AUTO_SRC) + -rm -f make_keys$(BUILD_EXEEXT) + -rm -f make_hash$(BUILD_EXEEXT) + -rm -f report_offsets$(BUILD_EXEEXT) + -rm -rf .libs *.dSYM *.map + +distclean :: clean + -rm -f Makefile + +realclean :: distclean + +# These rules are used to allow "make -n" to work on a clean directory-tree +../include/hashsize.h \ +../include/parametrized.h \ +../include/term.h : + ( cd ../include && $(MAKE) $(TOP_MFLAGS) ) + +# These rules build test-programs for the modules that have test-drivers +@MAKE_PHONY@.PHONY : test_progs +test_progs : $(TEST_PROGS) + +./link_test.c : $(base)/MKlib_gen.sh ../include/curses.h + FGREP="@FGREP@" $(SHELL) -e $(base)/MKlib_gen.sh "$(CPP) $(CPPFLAGS)" "$(AWK)" implemented <../include/curses.h >$@ + +captoinfo$x : $(tinfo)/captoinfo.c $(TEST_DEPS) + @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DMAIN $(tinfo)/captoinfo.c $(TEST_LDFLAGS) + +hardscroll$x : $(serial)/hardscroll.c $(TEST_DEPS) + @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DSCROLLDEBUG $(serial)/hardscroll.c $(TEST_LDFLAGS) + +hashmap$x : $(serial)/hashmap.c $(serial)/hardscroll.c $(TEST_DEPS) + @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DHASHDEBUG $(serial)/hashmap.c $(serial)/hardscroll.c $(TEST_LDFLAGS) + +lib_mvcur$x : $(serial)/lib_mvcur.c $(TEST_DEPS) \ + ../@DFT_OBJ_SUBDIR@/dump_entry$o + @ECHO_LD@ $(LIBTOOL_LINK) -o $@ $(CFLAGS_DEFAULT) -DNCURSES_TEST -I$(serial)/../../progs $(serial)/lib_mvcur.c ../@DFT_OBJ_SUBDIR@/dump_entry$o $(TEST_LDFLAGS) + +link_test$x : ./link_test.c $(TEST_DEPS) \ + ../@DFT_OBJ_SUBDIR@/link_test$o + @ECHO_LD@ $(CC) -o $@ $(CFLAGS_DEFAULT) ../@DFT_OBJ_SUBDIR@/link_test$o $(TEST_LDFLAGS) + +../@DFT_OBJ_SUBDIR@/dump_entry$o: + ( cd ../progs && $(MAKE) ../@DFT_OBJ_SUBDIR@/dump_entry$o ) + +report_hashing$x : \ + $(srcdir)/curses.priv.h \ + $(srcdir)/report_hashing.c $(TEST_DEPS) + @ECHO_LD@ $(CC) -o $@ $(CFLAGS_DEFAULT) report_hashing.c $(TEST_LDFLAGS) + +# Verify that each header-file can be compiled without including another. +@MAKE_PHONY@.PHONY : check_headers +check_headers: + @$(SHELL) -c "for header in *.h;\ + do \ + echo \"** testing \$${header}\" ; \ + echo \"#include <\$${header}>\" >headers.c; \ + echo \"int main(void) { return 0; }\" >>headers.c; \ + $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ + done" + -@rm -f headers.* + +@MAKE_PHONY@.PHONY : check_objects +check_objects: test_progs + +check :: check_headers check_objects + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/ncurses/README b/contrib/ncurses/ncurses/README new file mode 100644 index 00000000..f52a6528 --- /dev/null +++ b/contrib/ncurses/ncurses/README @@ -0,0 +1,51 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998-2006,2009 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README,v 1.11 2020/02/02 23:34:34 tom Exp $ +------------------------------------------------------------------------------- +For discussion of the package internals, see hackguide.html in the doc/html +directory. + +------------------------------------------------------------------------------- +The llib-lXXXX files could be used as lint-library sources (and were, at one +time). However, they are actually used as a documentation aid to keep track +of changes to the public/private interfaces in ncurses. Most of the text in +these files is generated using cproto; some manual cleanup and adjustment of +types (to reflect #define's in curses.h) is needed. The functions listed in +the llib-lXXXX files do not correspond to the default configure options; some +additional ones are added to include "all" of the entrypoints for each of the +major configurations (normal, wide-character, threaded): + + --disable-macros + --disable-root-environ + --enable-expanded + --enable-getcap + --enable-getcap-cache + --enable-sp-funcs + --enable-termcap + --with-develop diff --git a/contrib/ncurses/ncurses/README.IZ b/contrib/ncurses/ncurses/README.IZ new file mode 100644 index 00000000..a9e52ea5 --- /dev/null +++ b/contrib/ncurses/ncurses/README.IZ @@ -0,0 +1,96 @@ +------------------------------------------------------------------------------- +-- Copyright 2020,2021 Thomas E. Dickey -- +-- Copyright 2002,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README.IZ,v 1.5 2021/06/17 21:20:30 tom Exp $ +--------------------------------------------------------------------- + +Here is the patch. I did no testing whatsoever with event watching +requests present (I need some applications which exercise this before +this, probably lynx ;-), but the code looks working "the normal way". + +I had no way to test that the poll() branch compiles/works... + +Here is the API: + +*) two new functions wgetch_events() wgetstrn_event() are introduced, + which allow an event-watch specification given as the last argument; + +*) if the last argument is NULL, they behave as wgetch() and + wgetstrn() (TESTED!); + +*) the event specification is a pointer to _nc_eventlist, which + contains bookkeeping elements (count and the summary of results), + and an array of pointers to _nc_event; + +*) each _nc_event is a typed union, with two types supported "as + shipped": _NC_EVENT_TIMEOUT_MSEC, _NC_EVENT_FILE. For + _NC_EVENT_FILE the fields are fd, flag, and the output field. + +*) The only supported flag "as shipped" is _NC_EVENT_FILE_READABLE. + If the file was found readable, the return field is set to this, + otherwise to 0; + +*) If these functions return KEY_EVENT, this means that the return + fields in both the _nc_eventlist and _nc_event structures make + sense. The field result_flags of _nc_eventlist may have a + combination of bits _NC_EVENT_TIMEOUT_MSEC and _NC_EVENT_FILE_READABLE + set; + +*) The timeout_msec field of _NC_EVENT_TIMEOUT_MSEC _nc_event's is + updated on return, even if the return is not KEY_EVENT. However, + the change in the value represents only the amount of time spent in + waiting for events, not the amount of time spent bookkeeping; + +*) the return KEY_EVENT of wgetstrn_event() means that the output + string includes the user input typed so far, but the user did not have + a chance to press ENTER (or whatever). This call should be + repeated (with "shifted" pointer to a buffer, of course) to + complete the input; + +*) The presence of this extension can be checked via inspecting + #ifdef NCURSES_EVENT_VERSION. This symbol is not defined on BeOS, + since there is no support for this on BeOS. + +Known issues: calls interrupted by KEY_EVENT reset the ESCDELAY +timer. This is not entirely new, since other synthetic events behave +the same (see "if (ch >= KEY_MIN)" branch of kgetch()). However, +KEY_EVENT may be generated in a continuous stream (say, when +downloading a file), thus this may be more important than with other +synthetic keys. An additional field in window structure which keeps +timestamp of the first raw key in the queue may be needed to +circumvent this. + +Another possible issue: KEY_EVENT has a preference over a user input, +so a stream of KEY_EVENT's can make input hard. Maybe use +result_flags as in input parameter too, which specifies whether the +user input should have higher precedence? + +Also: I took an opportunity to document kgetch() better. + +Enjoy, +Ilya diff --git a/contrib/ncurses/ncurses/SigAction.h b/contrib/ncurses/ncurses/SigAction.h new file mode 100644 index 00000000..30f2474b --- /dev/null +++ b/contrib/ncurses/ncurses/SigAction.h @@ -0,0 +1,110 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2003,2005 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* + * $Id: SigAction.h,v 1.10 2020/02/02 23:34:34 tom Exp $ + * + * This file exists to handle non-POSIX systems which don't have , + * and usually no sigaction() nor + */ + +#ifndef _SIGACTION_H +#define _SIGACTION_H + +#ifndef HAVE_SIGACTION +#define HAVE_SIGACTION 0 +#endif + +#ifndef HAVE_SIGVEC +#define HAVE_SIGVEC 0 +#endif + +#if HAVE_SIGACTION + +#if !HAVE_TYPE_SIGACTION +typedef struct sigaction sigaction_t; +#endif + +#else /* !HAVE_SIGACTION */ + +#if HAVE_SIGVEC + +#undef SIG_BLOCK +#define SIG_BLOCK 00 + +#undef SIG_UNBLOCK +#define SIG_UNBLOCK 01 + +#undef SIG_SETMASK +#define SIG_SETMASK 02 + + /* + * is in the Linux 1.2.8 + gcc 2.7.0 configuration, + * and is useful for testing this header file. + */ +#if HAVE_BSD_SIGNAL_H +#include +#endif + +typedef struct sigvec sigaction_t; + +#define sigset_t _nc_sigset_t +typedef unsigned long sigset_t; + +#undef sa_mask +#define sa_mask sv_mask +#undef sa_handler +#define sa_handler sv_handler +#undef sa_flags +#define sa_flags sv_flags + +#undef sigaction +#define sigaction _nc_sigaction +#undef sigprocmask +#define sigprocmask _nc_sigprocmask +#undef sigemptyset +#define sigemptyset _nc_sigemptyset +#undef sigsuspend +#define sigsuspend _nc_sigsuspend +#undef sigdelset +#define sigdelset _nc_sigdelset +#undef sigaddset +#define sigaddset _nc_sigaddset + +/* tty/lib_tstp.c is the only user */ +#include + +#endif /* HAVE_SIGVEC */ +#endif /* HAVE_SIGACTION */ +#endif /* !defined(_SIGACTION_H) */ diff --git a/contrib/ncurses/ncurses/base/MKkeyname.awk b/contrib/ncurses/ncurses/base/MKkeyname.awk new file mode 100644 index 00000000..b3d04ee7 --- /dev/null +++ b/contrib/ncurses/ncurses/base/MKkeyname.awk @@ -0,0 +1,178 @@ +# $Id: MKkeyname.awk,v 1.51 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +BEGIN { + print "/* generated by MKkeyname.awk */" + print "" + print "#include " + print "#include " + print "" + first = 1; +} + +/^[^#]/ { + if (bigstrings) { + if (first) { + print "struct kn { short offset; int code; };" + print "static const struct kn _nc_key_names[] = {" + } + printf "\t{ %d, %s },\n", offset, $1 + offset += length($1) + 1 + names = names"\n\t\""$1"\\0\"" + } else { + if (first) { + print "struct kn { const char *name; int code; };" + print "static const struct kn _nc_key_names[] = {" + } + printf "\t{ \"%s\", %s },\n", $1, $1; + } + first = 0; + } + +END { + if (bigstrings) { + printf "\t{ -1, 0 }};\n" + print "" + print "static const char key_names[] = "names";" + } else { + printf "\t{ 0, 0 }};\n" + } + print "" + print "#define SIZEOF_TABLE 256" + print "#define MyTable _nc_globals.keyname_table" + print "#define MyInit _nc_globals.init_keyname" + print "" + print "NCURSES_EXPORT(NCURSES_CONST char *)" + print "safe_keyname (SCREEN *sp, int c)" + print "{" + print " char name[20];" + print " NCURSES_CONST char *result = 0;" + print "" + print " if (c == -1) {" + print " result = \"-1\";" + print " } else {" + print " int i;" + if (bigstrings) { + print " for (i = 0; _nc_key_names[i].offset != -1; i++) {" + print " if (_nc_key_names[i].code == c) {" + print " result = (NCURSES_CONST char *)key_names + _nc_key_names[i].offset;" + print " break;" + print " }" + print " }" + } else { + print " for (i = 0; _nc_key_names[i].name != 0; i++) {" + print " if (_nc_key_names[i].code == c) {" + print " result = (NCURSES_CONST char *)_nc_key_names[i].name;" + print " break;" + print " }" + print " }" + } + print "" + print " if (result == 0 && (c >= 0 && c < SIZEOF_TABLE)) {" + print " if (MyTable == 0)" + print " MyTable = typeCalloc(char *, SIZEOF_TABLE);" + print "" + print " if (MyTable != 0) {" + print " int m_prefix = (sp == 0 || sp->_use_meta);" + print "" + print " /* if sense of meta() changed, discard cached data */" + print " if (MyInit != (m_prefix + 1)) {" + print " MyInit = m_prefix + 1;" + print " for (i = 0; i < SIZEOF_TABLE; ++i) {" + print " if (MyTable[i]) {" + print " FreeAndNull(MyTable[i]);" + print " }" + print " }" + print " }" + print "" + print " /* create and cache result as needed */" + print " if (MyTable[c] == 0) {" + print " int cc = c;" + print " char *p = name;" + print "#define P_LIMIT (sizeof(name) - (size_t) (p - name))" + print " if (cc >= 128 && m_prefix) {" + print " _nc_STRCPY(p, \"M-\", P_LIMIT);" + print " p += 2;" + print " cc -= 128;" + print " }" + print " if (cc < 32)" + print " _nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"^%c\", cc + '@');" + print " else if (cc == 127)" + print " _nc_STRCPY(p, \"^?\", P_LIMIT);" + print " else" + print " _nc_SPRINTF(p, _nc_SLIMIT(P_LIMIT) \"%c\", cc);" + print " MyTable[c] = strdup(name);" + print " }" + print " result = MyTable[c];" + print " }" + print "#if NCURSES_EXT_FUNCS && NCURSES_XNAMES" + print " } else if (result == 0 && HasTerminal(sp)) {" + print " int j, k;" + print " char * bound;" + print " TERMTYPE2 *tp = &TerminalType(TerminalOf(sp));" + print " unsigned save_trace = _nc_tracing;" + print "" + print " _nc_tracing = 0; /* prevent recursion via keybound() */" + print " for (j = 0; (bound = NCURSES_SP_NAME(keybound)(NCURSES_SP_ARGx c, j)) != 0; ++j) {" + print " for(k = STRCOUNT; k < (int) NUM_STRINGS(tp); k++) {" + print " if (tp->Strings[k] != 0 && !strcmp(bound, tp->Strings[k])) {" + print " result = ExtStrname(tp, k, strnames);" + print " break;" + print " }" + print " }" + print " free(bound);" + print " if (result != 0)" + print " break;" + print " }" + print " _nc_tracing = save_trace;" + print "#endif" + print " }" + print " }" + print " return result;" + print "}" + print "" + print "NCURSES_EXPORT(NCURSES_CONST char *)" + print "keyname (int c)" + print "{" + print " return safe_keyname (CURRENT_SCREEN, c);" + print "}" + print "" + print "#if NO_LEAKS" + print "void _nc_keyname_leaks(void)" + print "{" + print " if (MyTable != 0) {" + print " int j;" + print " for (j = 0; j < SIZEOF_TABLE; ++j) {" + print " FreeIfNeeded(MyTable[j]);" + print " }" + print " FreeAndNull(MyTable);" + print " }" + print "}" + print "#endif /* NO_LEAKS */" +} diff --git a/contrib/ncurses/ncurses/base/MKlib_gen.sh b/contrib/ncurses/ncurses/base/MKlib_gen.sh new file mode 100755 index 00000000..5b53ec67 --- /dev/null +++ b/contrib/ncurses/ncurses/base/MKlib_gen.sh @@ -0,0 +1,565 @@ +#!/bin/sh +# +# MKlib_gen.sh -- generate sources from curses.h macro definitions +# +# ($Id: MKlib_gen.sh,v 1.74 2024/09/22 20:41:58 tom Exp $) +# +############################################################################## +# Copyright 2018-2022,2024 Thomas E. Dickey # +# Copyright 1998-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# The XSI Curses standard requires all curses entry points to exist as +# functions, even though many definitions would normally be shadowed +# by macros. Rather than hand-hack all that code, we actually +# generate functions from the macros. +# +# This script accepts a file of prototypes on standard input. It discards +# any that don't have a `generated' comment attached. It then parses each +# prototype (relying on the fact that none of the macros take function +# pointer or array arguments) and generates C source from it. +# +# Here is what the pipeline stages are doing: +# +# 1. sed: extract prototypes of generated functions +# 2. sed: decorate prototypes with generated arguments a1. a2,...z +# 3. awk: generate the calls with args matching the formals +# 4. sed: prefix function names in prototypes so the preprocessor won't expand +# them. +# 5. cpp: macro-expand the file so the macro calls turn into C calls +# 6. awk: strip the expansion junk off the front and add the new header +# 7. sed: squeeze spaces, strip off gen_ prefix. +# + +# keep the editing independent of locale: +if test "${LANGUAGE+set}" = set; then LANGUAGE=C; export LANGUAGE; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +if test "${LC_COLLATE+set}" = set; then LC_COLLATE=C; export LC_COLLATE; fi + +preprocessor="$1 -DNCURSES_WATTR_MACROS -DNCURSES_INTERNALS -I../include" +AWK="$2" +USE="$3" + +# A patch discussed here: +# https://gcc.gnu.org/ml/gcc-patches/2014-06/msg02185.html +# +# introduces spurious #line markers into the preprocessor output. The result +# appears in gcc 5.0 and (with modification) in 5.1, making it necessary to +# determine if we are using gcc, and if so, what version because the proposed +# solution uses a nonstandard option. +# +# As illustrated in +# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60723 +# +# gcc developers chose to ignore the problems with this, and summarized those +# as "intriguing problems" in +# https://gcc.gnu.org/gcc-5/porting_to.html + +PRG=`echo "$1" | "$AWK" '{ sub(/^[ ]*/,""); sub(/[ ].*$/, ""); print; }' || exit 0` +FSF=`("$PRG" --version 2>/dev/null || exit 0) | ${FGREP-grep -F} "Free Software Foundation" | head -n 1` +ALL=`"$PRG" -dumpversion 2>/dev/null || exit 0` +ONE=`echo "$ALL" | sed -e 's/[^0-9].*$//'` +if test -n "$FSF" && test -n "$ALL" && test -n "$ONE" ; then + if test "$ONE" -ge 5 ; then + echo ".. adding -P option to work around $PRG $ALL" >&2 + preprocessor="$preprocessor -P" + fi +fi + +PID=$$ +ED1=sed1_${PID}.sed +ED2=sed2_${PID}.sed +ED3=sed3_${PID}.sed +ED4=sed4_${PID}.sed +AW1=awk1_${PID}.awk +AW2=awk2_${PID}.awk +TMP=gen__${PID}.c +trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP; exit 1" 1 2 3 15 +trap "rm -f $ED1 $ED2 $ED3 $ED4 $AW1 $AW2 $TMP" 0 + +ALL=$USE +if test "$USE" = implemented ; then + cat >$ED1 <$ED1 <$ED2 <$ED3 <$ED4 <$ED4 <$AW1 <<\EOF1 +BEGIN { + skip=0; + } +/^P_POUNDCif/ { + print "\n" + print $0 + skip=0; +} +/^P_POUNDCendif/ { + print $0 + skip=1; +} +$0 !~ /^P_/ { + if (skip) + print "\n" + skip=1; + + first=$1 + for (i = 1; i <= NF; i++) { + if ( $i != "NCURSES_CONST" ) { + first = i; + break; + } + } + second = first + 1; + returnCast = ""; + if ( $first == "chtype" ) { + returnType = "Chtype"; + } else if ( $first == "SCREEN" ) { + returnType = "SP"; + } else if ( $first == "WINDOW" ) { + returnType = "Win"; + } else if ( $first == "attr_t" || $second == "attrset" || $second == "standout" || $second == "standend" || $second == "wattrset" || $second == "wstandout" || $second == "wstandend" ) { + returnType = "IntAttr"; + returnCast = "(attr_t)"; + } else if ( $first == "bool" || $first == "NCURSES_BOOL" ) { + returnType = "Bool"; + } else if ( $second == "*" ) { + returnType = ($1 == "NCURSES_CONST") ? "CPtr" : "Ptr"; + } else { + returnType = "Code"; + } + myfunc = second; + for (i = second; i <= NF; i++) { + if ($i != "*") { + myfunc = i; + break; + } + } + if (using == "implemented") { + printf "#undef %s\n", $myfunc; + } + print $0; + print "{"; + argcount = 1; + check = NF - 1; + if ($check == "void") + argcount = 0; + if (argcount != 0) { + for (i = 1; i <= NF; i++) + if ($i == ",") + argcount++; + } + + # suppress trace-code for functions that we cannot do properly here, + # since they return data. + dotrace = 1; + if ($myfunc ~ /innstr/) + dotrace = 0; + if ($myfunc ~ /innwstr/) + dotrace = 0; + + # workaround functions that we do not parse properly + if ($myfunc ~ /ripoffline/) { + dotrace = 0; + argcount = 2; + if ($myfunc ~ /NCURSES_SP_NAME/) { + argcount = 3; + } + } + if ($myfunc ~ /wunctrl/) { + dotrace = 0; + } + + do_getstr = 0; + if ($myfunc ~ /get[n]?str/) { + do_getstr = 1; + } + + call = "@@T((T_CALLED(\"" + args = "" + comma = "" + num = 0; + pointer = 0; + va_list = 0; + varargs = 0; + argtype = "" + for (i = myfunc; i <= NF; i++) { + ch = $i; + if ( ch == "*" ) { + pointer = 1; + } else if ( ch == "va_list" ) { + va_list = 1; + } else if ( ch == "..." ) { + varargs = 1; + } else if ( ch == "char" ) { + argtype = "char"; + } else if ( ch == "int" ) { + argtype = "int"; + } else if ( ch == "short" ) { + argtype = "short"; + } else if ( ch == "chtype" ) { + argtype = "chtype"; + } else if ( ch == "attr_t" || ch == "NCURSES_ATTR_T" ) { + argtype = "attr"; + } + + if ( ch == "," || ch == ")" ) { + argcast = ""; + if (va_list) { + call = call "%s" + } else if (varargs) { + call = call "%s" + } else if (pointer) { + if ( argtype == "char" ) { + if (do_getstr) { + call = call "%p" + } else { + call = call "%s" + } + comma = comma "_nc_visbuf2(" num "," + pointer = 0; + } else { + call = call "%p" + comma = comma "(const void *)" + } + } else if (argcount != 0) { + if ( argtype == "int" || argtype == "short" ) { + call = call "%d" + argtype = "" + } else if ( argtype != "" ) { + call = call "%s" + comma = comma "_trace" argtype "2(" num "," + if (argtype == "attr") { + argcast = "(chtype)"; + } + } else { + call = call "%#lx" + comma = comma "(long)" + } + } + if (ch == ",") { + args = args comma "a" ++num; + } else if ( argcount != 0 ) { + if ( va_list ) { + args = args comma "\"va_list\"" + } else if ( varargs ) { + args = args comma "\"...\"" + } else { + args = args comma argcast "z" + } + } + call = call ch + if (pointer == 0 && argcount != 0 && argtype != "" ) + args = args ")" + if (args != "") + comma = ", " + pointer = 0; + argtype = "" + } + if ( i == myfunc || ch == "(" ) + call = call ch + } + call = call "\")" + if (args != "") + call = call ", " args + call = call ")); " + + if (dotrace) + printf "%s\n\t@@", call + + if (match($0, "^void")) { + call = "" + } else if (dotrace) { + call = sprintf("return%s( ", returnType); + if (returnCast != "") { + call = call returnCast; + } + } else { + call = "@@return "; + } + + call = call $myfunc "("; + for (i = 1; i < argcount; i++) { + if (i != 1) + call = call ", "; + call = call "a" i; + } + if ( argcount != 0 && $check != "..." ) { + if (argcount != 1) + call = call ", "; + call = call "z"; + } + if (!match($0, "^void")) + call = call ") "; + if (dotrace) { + call = call ")"; + } + print call ";" + + if (match($0, "^void")) + print "@@returnVoid;" + print "}"; +} +EOF1 + +cat >$AW2 <" + print "" + print "#undef NCURSES_NOMACROS /* _this_ file uses macros */" + print "#define NCURSES_NOMACROS 1" + print "" + print "#include " + print "" + } +/^DECLARATIONS/ {start = 1; next;} + { + if (start) { + if ( "$USE" == "generated" ) { + print \$0; + } else if ( \$0 ~ /^[{}]?\$/ ) { + print \$0; + } else if ( \$0 ~ /;/ ) { + print \$0; + } else { + calls[start] = \$0; + print \$0; + start++; + } + } + } +END { + if ( "$USE" != "generated" ) { + print "static int link_test(int code)" + print "{" + print " switch(code)" + print " {" + casenum = 1; + for (n = 1; n < start; ++n) { + value = calls[n]; + if ( value !~ /P_POUNDC/ ) { + gsub(/[ \t]+/," ",value); + sub(/^[0-9a-zA-Z_]+ /,"",value); + sub(/^[*][ \t]*/,"",value); + gsub("struct[ \t]*[0-9a-zA-Z_]+[ \t]*[*]","",value); + gsub(/[0-9a-zA-Z_]+[ \t]*[*][ \t]*/,"",value); + gsub(/ (const) /," ",value); + gsub(/ (int|short|attr_t|chtype|wchar_t|NCURSES_BOOL|NCURSES_OUTC|NCURSES_OUTC_sp|va_list) /," ",value); + gsub(/ void /,"",value); + sub(/^/,"call_",value); + gsub(/ (a[0-9]|z) /, " 0 ", value); + gsub(/ int[ \t]*[(][^)]+[)][(][^)]+[)]/, "0", value); + printf " case %d: %s; break;\n", casenum++, value; + } else { + print value; + } + } + print " default: return 0; /* case did not exist */" + print " }" + print " return 1; /* case exists */" + print "}" + } + } +EOF1 + +cat >$TMP < +#undef NCURSES_NOMACROS +#include +#include +#include + +DECLARATIONS + +EOF + +sed -n -f $ED1 \ +| sed -e 's/NCURSES_EXPORT(\(.*\)) \(.*\) (\(.*\))/\1 \2(\3)/' \ +| sed -f $ED2 \ +| "$AWK" -f $AW1 using="$USE" \ +| sed \ + -e 's/ [ ]*$//g' \ + -e 's/^\([a-zA-Z_][a-zA-Z_]*[ *]*\)/\1 gen_/' \ + -e 's/gen_$//' \ + -e 's/ / /g' >>$TMP + +$preprocessor $TMP 2>/dev/null \ +| sed \ + -e 's/ / /g' \ + -e 's/^ //' \ + -e 's/_Bool/NCURSES_BOOL/g' \ +| "$AWK" -f $AW2 \ +| sed -f $ED3 \ +| sed \ + -e 's/^.*T_CALLED.*returnCode( \([a-z].*) \));/ return \1;/' \ + -e 's/^.*T_CALLED.*returnCode( \((wmove.*) \));/ return \1;/' \ + -e 's/gen_//' \ + -e 's/^[ ]*#/#/' \ + -e '/#ident/d' \ + -e '/#line/d' \ +| sed -f $ED4 + +# a simple test-driver checks one or all of the linkages +if test "$USE" = "implemented" +then +cat <<"EOF" +int main(int argc, char *argv[]) +{ + int n; + int rc; + if (argc > 1) + { + rc = !link_test(atoi(argv[1])); + } + else + { + rc = 0; + for (n = 1; ; ++n) + { + printf("TEST %d\n", n); + fflush(stdout); + if (!link_test(n)) + { + rc = 1; + break; + } + } + } + return rc; +} +EOF +fi diff --git a/contrib/ncurses/ncurses/base/MKunctrl.awk b/contrib/ncurses/ncurses/base/MKunctrl.awk new file mode 100644 index 00000000..e5362bd6 --- /dev/null +++ b/contrib/ncurses/ncurses/base/MKunctrl.awk @@ -0,0 +1,177 @@ +# $Id: MKunctrl.awk,v 1.30 2024/02/03 21:09:14 tom Exp $ +############################################################################## +# Copyright 2020,2024 Thomas E. Dickey # +# Copyright 1998-2012,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey (1997-on) +# + +BEGIN { + print "/* generated by MKunctrl.awk */" + print "" + print "#include " + print "#include " + print "" + print "#undef unctrl" + print "" + } +END { + print "NCURSES_EXPORT(NCURSES_CONST char *) safe_unctrl(SCREEN *sp, chtype ch)" + print "{" + blob="" + offset=0 + if (bigstrings) { + printf "static const short unctrl_table[] = {" + } else { + printf "static const char* const unctrl_table[] = {" + } + for ( ch = 0; ch < 256; ch++ ) { + gap = "," + part="" + if ((ch % 8) == 0) { + printf "\n " + if (ch != 0) + blob = blob "\"" + blob = blob "\n \"" + } + if (bigstrings) + printf "%4d%s", offset, gap; + if (ch < 32) { + part = sprintf ("^\\%03o", ch + 64); + offset = offset + 3; + } else if (ch == 127) { + part = "^?"; + offset = offset + 3; + } else if (ch >= 128 && ch < 160) { + part = sprintf("~\\%03o", ch - 64); + offset = offset + 3; + } else if (ch == 255) { + part = "~?"; + offset = offset + 3; + } else if (ch >= 160) { + part = sprintf("M-\\%03o", ch - 128); + offset = offset + 4; + } else { + gap = gap " " + part = sprintf("\\%03o", ch); + offset = offset + 2; + } + if (ch == 255) + gap = "\n" + else if (((ch + 1) % 8) != 0) + gap = gap " " + if (bigstrings) { + blob = blob part "\\0"; + } else { + printf "\"%s\"%s", part, gap + } + } + print "};" + blob = blob "\""; + + print "" + printf "#if NCURSES_EXT_FUNCS\n"; + if (bigstrings) { + blob = blob "\n/* printable values in 128-255 range */" + printf "static const short unctrl_c1[] = {" + } else { + printf "static const char* const unctrl_c1[] = {" + } + for ( ch = 128; ch < 256; ch++ ) { + gap = "," + if ((ch % 8) == 0) { + if (ch != 128) + blob = blob "\"" + printf "\n " + blob = blob "\n \"" + } + if (bigstrings) { + printf "%4d%s", offset, gap; + part = sprintf("\\%03o\\0", ch); + blob = blob part + offset = offset + 2; + if (((ch + 1) % 8) != 0) + gap = gap " " + } else { + if (ch >= 128) { + printf "\"\\%03o\"", ch + gap = gap " " + } + if (ch == 255) + gap = "\n" + else if (((ch + 1) % 8) != 0) + gap = gap " " + printf "%s", gap + } + } + print "};" + print "#endif /* NCURSES_EXT_FUNCS */" + blob = blob "\"\n" + + print "" + if (bigstrings) { + print "static const char unctrl_blob[] = "blob";" + print "" + stringname = "unctrl_blob + unctrl" + } else { + stringname = "unctrl" + } + print "\tint check = (int) ChCharOf(ch);" + print "\tconst char *result;" + print "" + print "\t(void) sp;" + print "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {" + print "#if NCURSES_EXT_FUNCS" + print "\t\tif ((sp != 0)" + print "\t\t && (sp->_legacy_coding > 1)" + print "\t\t && (check >= 128)" + print "\t\t && (check < 160))" + printf "\t\t\tresult = %s_c1[check - 128];\n", stringname; + print "\t\telse" + print "\t\tif ((check >= 160)" + print "\t\t && (check < 256)" + print "\t\t && !_nc_unicode_locale()" + print "\t\t && ((sp != 0)" + print "\t\t && ((sp->_legacy_coding > 0)" + print "\t\t || (sp->_legacy_coding == 0" + print "\t\t && isprint(check)))))" + printf "\t\t\tresult = %s_c1[check - 128];\n", stringname; + print "\t\telse" + print "#endif /* NCURSES_EXT_FUNCS */" + printf "\t\t\tresult = %s_table[check];\n", stringname; + print "\t} else {" + print "\t\tresult = 0;" + print "\t}" + print "\treturn (NCURSES_CONST char *)result;" + print "}" + print "" + print "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)" + print "{" + print "\treturn safe_unctrl(CURRENT_SCREEN, ch);" + print "}" + } diff --git a/contrib/ncurses/ncurses/base/README b/contrib/ncurses/ncurses/base/README new file mode 100644 index 00000000..2710b367 --- /dev/null +++ b/contrib/ncurses/ncurses/base/README @@ -0,0 +1,36 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README,v 1.3 2020/02/02 23:34:34 tom Exp $ +------------------------------------------------------------------------------- + +The functions in this directory are the generic (not device-specific) modules +of ncurses. + +As a rule, these modules should not depend directly on term.h references and +associated terminfo function and variables. diff --git a/contrib/ncurses/ncurses/base/define_key.c b/contrib/ncurses/ncurses/base/define_key.c new file mode 100644 index 00000000..fb9ae36b --- /dev/null +++ b/contrib/ncurses/ncurses/base/define_key.c @@ -0,0 +1,86 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: define_key.c,v 1.22 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(define_key) (NCURSES_SP_DCLx const char *str, int keycode) +{ + int code = ERR; + + T((T_CALLED("define_key(%p, %s,%d)"), (void *) SP_PARM, _nc_visbuf(str), keycode)); + if (SP_PARM == 0 || !HasTInfoTerminal(SP_PARM)) { + code = ERR; + } else if (keycode > 0) { + unsigned ukey = (unsigned) keycode; + +#ifdef USE_TERM_DRIVER +#define CallHasKey(keycode) CallDriver_1(SP_PARM, td_kyExist, keycode) +#else +#define CallHasKey(keycode) NCURSES_SP_NAME(has_key)(NCURSES_SP_ARGx keycode) +#endif + + if (str != 0) { + NCURSES_SP_NAME(define_key) (NCURSES_SP_ARGx str, 0); + } else if (CallHasKey(keycode)) { + while (_nc_remove_key(&(SP_PARM->_keytry), ukey)) + code = OK; + } + if (str != 0) { + if (NCURSES_SP_NAME(key_defined) (NCURSES_SP_ARGx str) == 0) { + if (_nc_add_to_try(&(SP_PARM->_keytry), str, ukey) == OK) { + code = OK; + } else { + code = ERR; + } + } else { + code = ERR; + } + } + } else { + while (_nc_remove_string(&(SP_PARM->_keytry), str)) + code = OK; + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +define_key(const char *str, int keycode) +{ + return NCURSES_SP_NAME(define_key) (CURRENT_SCREEN, str, keycode); +} +#endif diff --git a/contrib/ncurses/ncurses/base/key_defined.c b/contrib/ncurses/ncurses/base/key_defined.c new file mode 100644 index 00000000..147e5fe2 --- /dev/null +++ b/contrib/ncurses/ncurses/base/key_defined.c @@ -0,0 +1,88 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2003-2006,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey, 2003 * + ****************************************************************************/ + +#include +#include + +MODULE_ID("$Id: key_defined.c,v 1.11 2023/06/24 15:36:32 tom Exp $") + +static int +find_definition(TRIES * tree, const char *str) +{ + TRIES *ptr; + int result = OK; + + if (VALID_STRING(str) && *str != '\0') { + for (ptr = tree; ptr != 0; ptr = ptr->sibling) { + if (UChar(*str) == UChar(ptr->ch)) { + if (str[1] == '\0' && ptr->child != 0) { + result = ERR; + } else if ((result = find_definition(ptr->child, str + 1)) + == OK) { + result = ptr->value; + } else if (str[1] == '\0') { + result = ERR; + } + } + if (result != OK) + break; + } + } + return (result); +} + +/* + * Returns the keycode associated with the given string. If none is found, + * return OK. If the string is only a prefix to other strings, return ERR. + * Otherwise, return the keycode's value (neither OK/ERR). + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(key_defined) (NCURSES_SP_DCLx const char *str) +{ + int code = ERR; + + T((T_CALLED("key_defined(%p, %s)"), (void *) SP_PARM, _nc_visbuf(str))); + if (SP_PARM != 0 && str != 0) { + code = find_definition(SP_PARM->_keytry, str); + } + + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +key_defined(const char *str) +{ + return NCURSES_SP_NAME(key_defined) (CURRENT_SCREEN, str); +} +#endif diff --git a/contrib/ncurses/ncurses/base/keybound.c b/contrib/ncurses/ncurses/base/keybound.c new file mode 100644 index 00000000..bbd912a0 --- /dev/null +++ b/contrib/ncurses/ncurses/base/keybound.c @@ -0,0 +1,64 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1999-2009,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: keybound.c,v 1.12 2020/02/02 23:34:34 tom Exp $") + +/* + * Returns the count'th string definition which is associated with the + * given keycode. The result is malloc'd, must be freed by the caller. + */ +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(keybound) (NCURSES_SP_DCLx int code, int count) +{ + char *result = 0; + + T((T_CALLED("keybound(%p, %d,%d)"), (void *) SP_PARM, code, count)); + if (SP_PARM != 0 && code >= 0) { + result = _nc_expand_try(SP_PARM->_keytry, + (unsigned) code, + &count, + (size_t) 0); + } + returnPtr(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +keybound(int code, int count) +{ + return NCURSES_SP_NAME(keybound) (CURRENT_SCREEN, code, count); +} +#endif diff --git a/contrib/ncurses/ncurses/base/keyok.c b/contrib/ncurses/ncurses/base/keyok.c new file mode 100644 index 00000000..945228aa --- /dev/null +++ b/contrib/ncurses/ncurses/base/keyok.c @@ -0,0 +1,103 @@ +/**************************************************************************** + * Copyright 2019-2020,2021 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: keyok.c,v 1.17 2021/06/17 21:26:02 tom Exp $") + +/* + * Enable (or disable) ncurses' interpretation of a keycode by adding (or + * removing) the corresponding 'tries' entry. + * + * Do this by storing a second tree of tries, which records the disabled keys. + * The simplest way to copy is to make a function that returns the string (with + * nulls set to 0200), then use that to reinsert the string into the + * corresponding tree. + */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(keyok) (NCURSES_SP_DCLx int c, bool flag) +{ + int code = ERR; + + if (HasTerminal(SP_PARM)) { + T((T_CALLED("keyok(%p, %d,%d)"), (void *) SP_PARM, c, flag)); +#ifdef USE_TERM_DRIVER + code = CallDriver_2(sp, td_kyOk, c, flag); +#else + if (c >= 0) { + int count = 0; + char *s; + unsigned ch = (unsigned) c; + + if (flag) { + while ((s = _nc_expand_try(SP_PARM->_key_ok, + ch, &count, (size_t) 0)) != 0) { + if (_nc_remove_key(&(SP_PARM->_key_ok), ch)) { + code = _nc_add_to_try(&(SP_PARM->_keytry), s, ch); + free(s); + count = 0; + if (code != OK) + break; + } else { + free(s); + } + } + } else { + while ((s = _nc_expand_try(SP_PARM->_keytry, + ch, &count, (size_t) 0)) != 0) { + if (_nc_remove_key(&(SP_PARM->_keytry), ch)) { + code = _nc_add_to_try(&(SP_PARM->_key_ok), s, ch); + free(s); + count = 0; + if (code != OK) + break; + } else { + free(s); + } + } + } + } +#endif + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +keyok(int c, bool flag) +{ + return NCURSES_SP_NAME(keyok) (CURRENT_SCREEN, c, flag); +} +#endif diff --git a/contrib/ncurses/ncurses/base/legacy_coding.c b/contrib/ncurses/ncurses/base/legacy_coding.c new file mode 100644 index 00000000..a71aee01 --- /dev/null +++ b/contrib/ncurses/ncurses/base/legacy_coding.c @@ -0,0 +1,58 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2005,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2005 * + * Juergen Pfeifer 2009 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: legacy_coding.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(use_legacy_coding) (NCURSES_SP_DCLx int level) +{ + int result = ERR; + + T((T_CALLED("use_legacy_coding(%p,%d)"), (void *) SP_PARM, level)); + if (level >= 0 && level <= 2 && SP_PARM != 0) { + result = SP_PARM->_legacy_coding; + SP_PARM->_legacy_coding = level; + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +use_legacy_coding(int level) +{ + return NCURSES_SP_NAME(use_legacy_coding) (CURRENT_SCREEN, level); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_addch.c b/contrib/ncurses/ncurses/base/lib_addch.c new file mode 100644 index 00000000..ac472a66 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_addch.c @@ -0,0 +1,602 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* +** lib_addch.c +** +** The routine waddch(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_addch.c,v 1.142 2024/07/27 19:22:23 tom Exp $") + +static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); + +/* + * Ugly microtweaking alert. Everything from here to end of module is + * likely to be speed-critical -- profiling data sure says it is! + * Most of the important screen-painting functions are shells around + * waddch(). So we make every effort to reduce function-call overhead + * by inlining stuff, even at the cost of making wrapped copies for + * export. Also we supply some internal versions that don't call the + * window sync hook, for use by string-put functions. + */ + +/* Return bit mask for clearing color pair number if given ch has color */ +#define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0)) + +static NCURSES_INLINE NCURSES_CH_T +render_char(WINDOW *win, NCURSES_CH_T ch) +/* compute a rendition of the given char correct for the current context */ +{ + attr_t a = WINDOW_ATTRS(win); + int pair = GetPair(ch); + + if (ISBLANK(ch) + && AttrOf(ch) == A_NORMAL + && pair == 0) { + /* color/pair in attrs has precedence over bkgrnd */ + ch = win->_nc_bkgd; + SetAttr(ch, a | AttrOf(win->_nc_bkgd)); + if ((pair = GET_WINDOW_PAIR(win)) == 0) + pair = GetPair(win->_nc_bkgd); + SetPair(ch, pair); + } else { + /* color in attrs has precedence over bkgrnd */ + a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a); + /* color in ch has precedence */ + if (pair == 0) { + if ((pair = GET_WINDOW_PAIR(win)) == 0) + pair = GetPair(win->_nc_bkgd); + } + AddAttr(ch, (a & COLOR_MASK(AttrOf(ch)))); + SetPair(ch, pair); + } + + TR(TRACE_VIRTPUT, + ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)", + _tracech_t2(1, CHREF(win->_nc_bkgd)), + GetPair(win->_nc_bkgd), + _traceattr(WINDOW_ATTRS(win)), + GET_WINDOW_PAIR(win), + _tracech_t2(3, CHREF(ch)), + GetPair(ch))); + + return (ch); +} + +NCURSES_EXPORT(NCURSES_CH_T) +_nc_render(WINDOW *win, NCURSES_CH_T ch) +/* make render_char() visible while still allowing us to inline it below */ +{ + return render_char(win, ch); +} + +/* check if position is legal; if not, return error */ +#ifndef NDEBUG /* treat this like an assertion */ +#define CHECK_POSITION(win, x, y) \ + if (y > win->_maxy \ + || x > win->_maxx \ + || y < 0 \ + || x < 0) { \ + TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \ + "(_maxx = %d, _maxy = %d)", win, x, y, \ + win->_maxx, win->_maxy)); \ + return(ERR); \ + } +#else +#define CHECK_POSITION(win, x, y) /* nothing */ +#endif + +static bool +newline_forces_scroll(const WINDOW *win, NCURSES_SIZE_T *ypos) +{ + bool result = FALSE; + + if (*ypos >= win->_regtop && *ypos <= win->_regbottom) { + if (*ypos == win->_regbottom) { + *ypos = win->_regbottom; + result = TRUE; + } else if (*ypos < win->_maxy) { + *ypos = (NCURSES_SIZE_T) (*ypos + 1); + } + } else if (*ypos < win->_maxy) { + *ypos = (NCURSES_SIZE_T) (*ypos + 1); + } + return result; +} + +/* + * The _WRAPPED flag is useful only for telling an application that we've just + * wrapped the cursor. We don't do anything with this flag except set it when + * wrapping, and clear it whenever we move the cursor. If we try to wrap at + * the lower-right corner of a window, we cannot move the cursor (since that + * wouldn't be legal). So we return an error (which is what SVr4 does). + * Unlike SVr4, we can successfully add a character to the lower-right corner + * (Solaris 2.6 does this also, however). + */ +static int +wrap_to_next_line(WINDOW *win) +{ + win->_flags |= _WRAPPED; + if (newline_forces_scroll(win, &(win->_cury))) { + win->_curx = win->_maxx; + if (!win->_scroll) + return (ERR); + scroll(win); + } + win->_curx = 0; + return (OK); +} + +#if USE_WIDEC_SUPPORT +static int waddch_literal(WINDOW *, NCURSES_CH_T); +/* + * Fill the given number of cells with blanks using the current background + * rendition. This saves/restores the current x-position. + */ +static void +fill_cells(WINDOW *win, int count) +{ + NCURSES_CH_T blank = blankchar; + int save_x = win->_curx; + int save_y = win->_cury; + + while (count-- > 0) { + if (waddch_literal(win, blank) == ERR) + break; + } + win->_curx = (NCURSES_SIZE_T) save_x; + win->_cury = (NCURSES_SIZE_T) save_y; +} +#endif + +/* + * Build up the bytes for a multibyte character, returning the length when + * complete (a positive number), -1 for error and -2 for incomplete. + */ +#if USE_WIDEC_SUPPORT +NCURSES_EXPORT(int) +_nc_build_wch(WINDOW *win, ARG_CH_T ch) +{ + char *buffer = WINDOW_EXT(win, addch_work); + int len; + int x = win->_curx; + int y = win->_cury; + mbstate_t state; + wchar_t result; + + if ((WINDOW_EXT(win, addch_used) != 0) && + (WINDOW_EXT(win, addch_x) != x || + WINDOW_EXT(win, addch_y) != y)) { + /* discard the incomplete multibyte character */ + WINDOW_EXT(win, addch_used) = 0; + TR(TRACE_VIRTPUT, + ("Alert discarded multibyte on move (%d,%d) -> (%d,%d)", + WINDOW_EXT(win, addch_y), WINDOW_EXT(win, addch_x), + y, x)); + } + WINDOW_EXT(win, addch_x) = x; + WINDOW_EXT(win, addch_y) = y; + + /* + * If the background character is a wide-character, that may interfere with + * processing multibyte characters in this function. + */ + if (!is8bits(CharOf(CHDEREF(ch)))) { + if (WINDOW_EXT(win, addch_used) != 0) { + /* discard the incomplete multibyte character */ + WINDOW_EXT(win, addch_used) = 0; + TR(TRACE_VIRTPUT, + ("Alert discarded incomplete multibyte")); + } + return 1; + } + + init_mb(state); + buffer[WINDOW_EXT(win, addch_used)] = (char) CharOf(CHDEREF(ch)); + WINDOW_EXT(win, addch_used) += 1; + buffer[WINDOW_EXT(win, addch_used)] = '\0'; + if ((len = (int) mbrtowc(&result, + buffer, + (size_t) WINDOW_EXT(win, addch_used), + &state)) > 0) { + attr_t attrs = AttrOf(CHDEREF(ch)); + if_EXT_COLORS(int pair = GetPair(CHDEREF(ch))); + SetChar(CHDEREF(ch), result, attrs); + if_EXT_COLORS(SetPair(CHDEREF(ch), pair)); + WINDOW_EXT(win, addch_used) = 0; + } else if (len == -1) { + /* + * An error occurred. We could either discard everything, + * or assume that the error was in the previous input. + * Try the latter. + */ + TR(TRACE_VIRTPUT, ("Alert! mbrtowc returns error")); + /* handle this with unctrl() */ + WINDOW_EXT(win, addch_used) = 0; + } + return len; +} +#endif /* USE_WIDEC_SUPPORT */ + +static +#if !USE_WIDEC_SUPPORT /* cannot be inline if it is recursive */ +NCURSES_INLINE +#endif +int +waddch_literal(WINDOW *win, NCURSES_CH_T ch) +{ + int x; + int y; + struct ldat *line; + + x = win->_curx; + y = win->_cury; + + CHECK_POSITION(win, x, y); + + ch = render_char(win, ch); + + line = win->_line + y; + + CHANGED_CELL(line, x); + + /* + * Build up multibyte characters until we have a wide-character. + */ +#if NCURSES_SP_FUNCS +#define DeriveSP() SCREEN *sp = _nc_screen_of(win); +#else +#define DeriveSP() /*nothing */ +#endif + if_WIDEC({ + DeriveSP(); + if (WINDOW_EXT(win, addch_used) != 0 || !Charable(ch)) { + int len = _nc_build_wch(win, CHREF(ch)); + + if (len >= -1) { + attr_t attr = AttrOf(ch); + + /* handle EILSEQ (i.e., when len >= -1) */ + if (len == -1 && is8bits(CharOf(ch))) { + const char *s = NCURSES_SP_NAME(unctrl) + (NCURSES_SP_ARGx (chtype) CharOf(ch)); + + if (s[1] != '\0') { + int rc = OK; + while (*s != '\0') { + rc = waddch(win, UChar(*s) | attr); + if (rc != OK) + break; + ++s; + } + return rc; + } + } + if (len == -1) + return waddch(win, ' ' | attr); + } else { + return OK; + } + } + }); + + /* + * Non-spacing characters are added to the current cell. + * + * Spacing characters that are wider than one column require some display + * adjustments. + */ + if_WIDEC({ + int len = _nc_wacs_width(CharOf(ch)); + int i; + int j; + + if (len == 0) { /* non-spacing */ + if ((x > 0 && y >= 0) + || (win->_maxx >= 0 && win->_cury >= 1)) { + NCURSES_CH_T *dst; + wchar_t *chars; + if (x > 0 && y >= 0) { + for (j = x - 1; j >= 0; --j) { + if (!isWidecExt(win->_line[y].text[j])) { + win->_curx = (NCURSES_SIZE_T) j; + break; + } + } + dst = &(win->_line[y].text[j]); + } else { + dst = &(win->_line[y - 1].text[win->_maxx]); + } + chars = dst->chars; + for (i = 0; i < CCHARW_MAX; ++i) { + if (chars[i] == 0) { + TR(TRACE_VIRTPUT, + ("adding non-spacing %s (level %d)", + _tracech_t(CHREF(ch)), i)); + chars[i] = CharOf(ch); + break; + } + } + } + goto testwrapping; + } else if (len > 1) { /* multi-column characters */ + /* + * Check if the character will fit on the current line. If it does + * not fit, fill in the remainder of the line with blanks. and + * move to the next line. + */ + if (len > win->_maxx + 1) { + TR(TRACE_VIRTPUT, ("character will not fit")); + return ERR; + } else if (x + len > win->_maxx + 1) { + int count = win->_maxx + 1 - x; + TR(TRACE_VIRTPUT, ("fill %d remaining cells", count)); + fill_cells(win, count); + if (wrap_to_next_line(win) == ERR) + return ERR; + x = win->_curx; + y = win->_cury; + CHECK_POSITION(win, x, y); + line = win->_line + y; + } + /* + * Check for cells which are orphaned by adding this character, set + * those to blanks. + * + * FIXME: this actually could fill j-i cells, more complicated to + * setup though. + */ + for (i = 0; i < len; ++i) { + if (isWidecBase(win->_line[y].text[x + i])) { + break; + } else if (isWidecExt(win->_line[y].text[x + i])) { + for (j = i; x + j <= win->_maxx; ++j) { + if (!isWidecExt(win->_line[y].text[x + j])) { + TR(TRACE_VIRTPUT, ("fill %d orphan cells", j)); + fill_cells(win, j); + break; + } + } + break; + } + } + /* + * Finally, add the cells for this character. + */ + for (i = 0; i < len; ++i) { + NCURSES_CH_T value = ch; + SetWidecExt(value, i); + TR(TRACE_VIRTPUT, ("multicolumn %d:%d (%d,%d)", + i + 1, len, + win->_begy + y, win->_begx + x)); + line->text[x] = value; + CHANGED_CELL(line, x); + ++x; + } + goto testwrapping; + } + }); + + /* + * Single-column characters. + */ + line->text[x++] = ch; + /* + * This label is used only for wide-characters. + */ + if_WIDEC( + testwrapping: + ); + + TR(TRACE_VIRTPUT, ("cell (%d, %d..%d) = %s", + win->_cury, win->_curx, x - 1, + _tracech_t(CHREF(line->text[win->_curx])))); + + if (x > win->_maxx) { + return wrap_to_next_line(win); + } + win->_curx = (NCURSES_SIZE_T) x; + return OK; +} + +static NCURSES_INLINE int +waddch_nosync(WINDOW *win, const NCURSES_CH_T ch) +/* the workhorse function -- add a character to the given window */ +{ + NCURSES_SIZE_T x, y; + chtype t = (chtype) CharOf(ch); +#if USE_WIDEC_SUPPORT || NCURSES_SP_FUNCS || USE_REENTRANT + SCREEN *sp = _nc_screen_of(win); +#endif + const char *s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx t); + int tabsize = 8; + + /* + * If we are using the alternate character set, forget about locale. + * Otherwise, if unctrl() returns a single-character or the locale + * claims the code is printable (and not also a control character), + * treat it that way. + */ + if ((AttrOf(ch) & A_ALTCHARSET) + || ( +#if USE_WIDEC_SUPPORT + (sp != 0 && sp->_legacy_coding) && +#endif + s[1] == 0 + ) + || ( + (isprint((int) t) && !iscntrl((int) t)) +#if USE_WIDEC_SUPPORT + || ((sp == 0 || !sp->_legacy_coding) && + (WINDOW_EXT(win, addch_used) + || !_nc_is_charable(CharOf(ch)))) +#endif + )) { + return waddch_literal(win, ch); + } + + /* + * Handle carriage control and other codes that are not printable, or are + * known to expand to more than one character according to unctrl(). + */ + x = win->_curx; + y = win->_cury; + CHECK_POSITION(win, x, y); + + switch (t) { + case '\t': +#if USE_REENTRANT + tabsize = *ptrTabsize(sp); +#else + tabsize = TABSIZE; +#endif + x = (NCURSES_SIZE_T) (x + (tabsize - (x % tabsize))); + /* + * Space-fill the tab on the bottom line so that we'll get the + * "correct" cursor position. + */ + if ((!win->_scroll && (y == win->_regbottom)) + || (x <= win->_maxx)) { + NCURSES_CH_T blank = blankchar; + AddAttr(blank, AttrOf(ch)); + while (win->_curx < x) { + if (waddch_literal(win, blank) == ERR) + return (ERR); + } + break; + } else { + wclrtoeol(win); + win->_flags |= _WRAPPED; + if (newline_forces_scroll(win, &y)) { + x = win->_maxx; + if (win->_scroll) { + scroll(win); + x = 0; + } + } else { + x = 0; + } + } + break; + case '\n': + wclrtoeol(win); + if (newline_forces_scroll(win, &y)) { + if (win->_scroll) + scroll(win); + else + return (ERR); + } + /* FALLTHRU */ + case '\r': + x = 0; + win->_flags &= ~_WRAPPED; + break; + case '\b': + if (x == 0) + return (OK); + x--; + win->_flags &= ~_WRAPPED; + break; + default: + while (*s) { + NCURSES_CH_T sch; + SetChar(sch, UChar(*s++), AttrOf(ch)); + if_EXT_COLORS(SetPair(sch, GetPair(ch))); + if (waddch_literal(win, sch) == ERR) + return ERR; + } + return (OK); + } + + win->_curx = x; + win->_cury = y; + + return (OK); +} + +NCURSES_EXPORT(int) +_nc_waddch_nosync(WINDOW *win, const NCURSES_CH_T c) +/* export copy of waddch_nosync() so the string-put functions can use it */ +{ + return (waddch_nosync(win, c)); +} + +/* + * The versions below call _nc_synchook(). We wanted to avoid this in the + * version exported for string puts; they'll call _nc_synchook once at end + * of run. + */ + +/* These are actual entry points */ + +NCURSES_EXPORT(int) +waddch(WINDOW *win, const chtype ch) +{ + int code = ERR; + NCURSES_CH_T wch; + SetChar2(wch, ch); + + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("waddch(%p, %s)"), (void *) win, + _tracechtype(ch))); + + if (win && (waddch_nosync(win, wch) != ERR)) { + _nc_synchook(win); + code = OK; + } + + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} + +NCURSES_EXPORT(int) +wechochar(WINDOW *win, const chtype ch) +{ + int code = ERR; + NCURSES_CH_T wch; + SetChar2(wch, ch); + + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"), + (void *) win, + _tracechtype(ch))); + + if (win && (waddch_nosync(win, wch) != ERR)) { + bool save_immed = win->_immed; + win->_immed = TRUE; + _nc_synchook(win); + win->_immed = save_immed; + code = OK; + } + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} diff --git a/contrib/ncurses/ncurses/base/lib_addstr.c b/contrib/ncurses/ncurses/base/lib_addstr.c new file mode 100644 index 00000000..a3753af0 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_addstr.c @@ -0,0 +1,259 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * * + * Rewritten 2001-2004 to support wide-characters by * + * Sven Verdoolaege * + * Thomas Dickey * + ****************************************************************************/ + +/* +** lib_addstr.c +* +** The routines waddnstr(), waddchnstr(). +** +*/ + +#include + +MODULE_ID("$Id: lib_addstr.c,v 1.62 2023/11/21 21:47:23 tom Exp $") + +NCURSES_EXPORT(int) +waddnstr(WINDOW *win, const char *astr, int n) +{ + const char *str = astr; + int code = ERR; + + T((T_CALLED("waddnstr(%p,%s,%d)"), (void *) win, _nc_visbufn(astr, n), n)); + + if (win && (str != 0) && (n != 0)) { + bool explicit = (n > 0); + + TR(TRACE_VIRTPUT | TRACE_ATTRS, + ("... current %s", _traceattr(WINDOW_ATTRS(win)))); + code = OK; + + TR(TRACE_VIRTPUT, ("str is not null, length = %d", + (explicit ? n : (int) strlen(str)))); + if (!explicit) + n = INT_MAX; + while ((n-- > 0) && (*str != '\0')) { + NCURSES_CH_T ch; + TR(TRACE_VIRTPUT, ("*str = %#o", UChar(*str))); + SetChar(ch, UChar(*str++), A_NORMAL); + if (_nc_waddch_nosync(win, ch) == ERR) { + code = ERR; + break; + } + } + _nc_synchook(win); + } + TR(TRACE_VIRTPUT, ("waddnstr returns %d", code)); + returnCode(code); +} + +NCURSES_EXPORT(int) +waddchnstr(WINDOW *win, const chtype *astr, int n) +{ + NCURSES_SIZE_T y, x; + int code = OK; + int i; + struct ldat *line; + + T((T_CALLED("waddchnstr(%p,%p,%d)"), (void *) win, (const void *) astr, n)); + + if (!win || !astr) + returnCode(ERR); + + y = win->_cury; + x = win->_curx; + if (n < 0) { + const chtype *str; + n = 0; + for (str = (const chtype *) astr; *str != 0; str++) + n++; + } + if (n > win->_maxx - x + 1) + n = win->_maxx - x + 1; + if (n == 0) + returnCode(code); + + line = &(win->_line[y]); + for (i = 0; i < n && ChCharOf(astr[i]) != '\0'; ++i) { + SetChar2(line->text[i + x], astr[i]); + } + CHANGED_RANGE(line, x, (NCURSES_SIZE_T) (x + n - 1)); + + _nc_synchook(win); + returnCode(code); +} + +#if USE_WIDEC_SUPPORT + +NCURSES_EXPORT(int) +_nc_wchstrlen(const cchar_t *s) +{ + int result = 0; + if (s != 0) { + while (CharOf(s[result]) != L'\0') { + result++; + } + } + return result; +} + +NCURSES_EXPORT(int) +wadd_wchnstr(WINDOW *win, const cchar_t *astr, int n) +{ + static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); + NCURSES_SIZE_T y; + NCURSES_SIZE_T x; + int code = OK; + struct ldat *line; + int i, j, start, len, end; + + T((T_CALLED("wadd_wchnstr(%p,%s,%d)"), + (void *) win, + _nc_viscbuf(astr, n), + n)); + + if (!win || !astr) + returnCode(ERR); + + y = win->_cury; + x = win->_curx; + if (n < 0) { + n = _nc_wchstrlen(astr); + } + if (n > win->_maxx - x + 1) + n = win->_maxx - x + 1; + if (n == 0) + returnCode(code); + + line = &(win->_line[y]); + start = x; + end = x + n - 1; + + /* + * Reset orphaned cells of multi-column characters that extend up to the + * new string's location to blanks. + */ + if (x > 0 && isWidecExt(line->text[x])) { + for (i = 0; i <= x; ++i) { + if (!isWidecExt(line->text[x - i])) { + /* must be isWidecBase() */ + start -= i; + while (i > 0) { + line->text[x - i--] = _nc_render(win, blank); + } + break; + } + } + } + + /* + * Copy the new string to the window. + */ + for (i = 0; i < n && CharOf(astr[i]) != L'\0' && x <= win->_maxx; ++i) { + if (isWidecExt(astr[i])) + continue; + + len = _nc_wacs_width(CharOf(astr[i])); + + if (x + len - 1 <= win->_maxx) { + line->text[x] = _nc_render(win, astr[i]); + if (len > 1) { + for (j = 0; j < len; ++j) { + if (j != 0) { + line->text[x + j] = line->text[x]; + } + SetWidecExt(line->text[x + j], j); + } + } else { + len = 1; + } + x = (NCURSES_SIZE_T) (x + len); + end += len - 1; + } else { + break; + } + } + + /* + * Set orphaned cells of multi-column characters which lie after the new + * string to blanks. + */ + while (x <= win->_maxx && isWidecExt(line->text[x])) { + line->text[x] = _nc_render(win, blank); + ++end; + ++x; + } + CHANGED_RANGE(line, start, end); + + _nc_synchook(win); + returnCode(code); +} + +NCURSES_EXPORT(int) +waddnwstr(WINDOW *win, const wchar_t *str, int n) +{ + int code = ERR; + + T((T_CALLED("waddnwstr(%p,%s,%d)"), (void *) win, _nc_viswbufn(str, n), n)); + + if (win && (str != 0) && (n != 0)) { + bool explicit = (n > 0); + + TR(TRACE_VIRTPUT | TRACE_ATTRS, + ("... current %s", _traceattr(WINDOW_ATTRS(win)))); + code = OK; + + TR(TRACE_VIRTPUT, ("str is not null, length = %d", + (explicit ? n : (int) wcslen(str)))); + if (!explicit) + n = INT_MAX; + while ((n-- > 0) && (*str != L('\0'))) { + NCURSES_CH_T ch; + TR(TRACE_VIRTPUT, ("*str[0] = %#lx", (unsigned long) *str)); + SetChar(ch, *str++, A_NORMAL); + if (wadd_wch(win, &ch) == ERR) { + code = ERR; + break; + } + } + _nc_synchook(win); + } + TR(TRACE_VIRTPUT, ("waddnwstr returns %d", code)); + returnCode(code); +} + +#endif diff --git a/contrib/ncurses/ncurses/base/lib_beep.c b/contrib/ncurses/ncurses/base/lib_beep.c new file mode 100644 index 00000000..b1a60b92 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_beep.c @@ -0,0 +1,91 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2013,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * beep.c + * + * The routine beep(). + * + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_beep.c,v 1.18 2020/02/02 23:34:34 tom Exp $") + +/* + * beep() + * + * Sound the current terminal's audible bell if it has one. If not, + * flash the screen if possible. + * + */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(beep) (NCURSES_SP_DCL0) +{ + int res = ERR; + + T((T_CALLED("beep(%p)"), (void *) SP_PARM)); + +#ifdef USE_TERM_DRIVER + if (SP_PARM != 0) + res = CallDriver_1(SP_PARM, td_doBeepOrFlash, TRUE); +#else + /* FIXME: should make sure that we are not in altchar mode */ + if (cur_term == 0) { + res = ERR; + } else if (bell) { + res = NCURSES_PUTP2_FLUSH("bell", bell); + } else if (flash_screen) { + res = NCURSES_PUTP2_FLUSH("flash_screen", flash_screen); + _nc_flush(); + } +#endif + + returnCode(res); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +beep(void) +{ + return NCURSES_SP_NAME(beep) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_bkgd.c b/contrib/ncurses/ncurses/base/lib_bkgd.c new file mode 100644 index 00000000..4f990808 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_bkgd.c @@ -0,0 +1,273 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2014,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997 * + * and: Sven Verdoolaege 2000 * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_bkgd.c,v 1.63 2021/05/08 14:58:12 tom Exp $") + +static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); + +/* + * Set the window's background information. + */ +#if USE_WIDEC_SUPPORT +NCURSES_EXPORT(void) +#else +static NCURSES_INLINE void +#endif +wbkgrndset(WINDOW *win, const ARG_CH_T ch) +{ + T((T_CALLED("wbkgrndset(%p,%s)"), (void *) win, _tracech_t(ch))); + + if (win) { + attr_t off = AttrOf(win->_nc_bkgd); + attr_t on = AttrOf(CHDEREF(ch)); + + toggle_attr_off(WINDOW_ATTRS(win), off); + toggle_attr_on(WINDOW_ATTRS(win), on); + +#if NCURSES_EXT_COLORS + { + int pair; + + if (GetPair(win->_nc_bkgd) != 0) + SET_WINDOW_PAIR(win, 0); + if ((pair = GetPair(CHDEREF(ch))) != 0) + SET_WINDOW_PAIR(win, pair); + } +#endif + + if (CharOf(CHDEREF(ch)) == L('\0')) { + SetChar(win->_nc_bkgd, BLANK_TEXT, AttrOf(CHDEREF(ch))); + if_EXT_COLORS(SetPair(win->_nc_bkgd, GetPair(CHDEREF(ch)))); + } else { + win->_nc_bkgd = CHDEREF(ch); + } +#if USE_WIDEC_SUPPORT + /* + * If we're compiled for wide-character support, _bkgrnd is the + * preferred location for the background information since it stores + * more than _bkgd. Update _bkgd each time we modify _bkgrnd, so the + * macro getbkgd() will work. + */ + { + cchar_t wch; + int tmp; + + memset(&wch, 0, sizeof(wch)); + (void) wgetbkgrnd(win, &wch); + tmp = _nc_to_char((wint_t) CharOf(wch)); + + win->_bkgd = (((tmp == EOF) ? ' ' : (chtype) tmp) + | (AttrOf(wch) & ALL_BUT_COLOR) + | (chtype) ColorPair(GET_WINDOW_PAIR(win))); + } +#endif + } + returnVoid; +} + +NCURSES_EXPORT(void) +wbkgdset(WINDOW *win, chtype ch) +{ + NCURSES_CH_T wch; + T((T_CALLED("wbkgdset(%p,%s)"), (void *) win, _tracechtype(ch))); + SetChar2(wch, ch); + wbkgrndset(win, CHREF(wch)); + returnVoid; +} + +/* + * Set the window's background information and apply it to each cell. + */ +static NCURSES_INLINE int +_nc_background(WINDOW *win, const ARG_CH_T ch, bool narrow) +{ +#undef SP_PARM +#define SP_PARM SP /* to use Charable() */ + int code = ERR; + +#if USE_WIDEC_SUPPORT + T((T_CALLED("%s(%p,%s)"), + narrow ? "wbkgd" : "wbkgrnd", + (void *) win, + _tracecchar_t(ch))); +#define TraceChar(c) _tracecchar_t2(1, &(c)) +#else + T((T_CALLED("%s(%p,%s)"), + "wbkgd", + (void *) win, + _tracech_t(ch))); + (void) narrow; +#define TraceChar(c) _tracechar(CharOf(c)) +#endif + + if (SP == 0) { + ; + } else if (win) { + NCURSES_CH_T new_bkgd = CHDEREF(ch); + NCURSES_CH_T old_bkgd; + int y; + NCURSES_CH_T old_char; + attr_t old_attr; + int old_pair; + NCURSES_CH_T new_char; + attr_t new_attr; + int new_pair; + + /* SVr4 trims color info if non-color terminal */ + if (!SP->_pair_limit) { + RemAttr(new_bkgd, A_COLOR); + SetPair(new_bkgd, 0); + } + + /* avoid setting background-character to a null */ + if (CharOf(new_bkgd) == 0) { + NCURSES_CH_T tmp_bkgd = blank; + SetAttr(tmp_bkgd, AttrOf(new_bkgd)); + SetPair(tmp_bkgd, GetPair(new_bkgd)); + new_bkgd = tmp_bkgd; + } + + memset(&old_bkgd, 0, sizeof(old_bkgd)); + (void) wgetbkgrnd(win, &old_bkgd); + + if (!memcmp(&old_bkgd, &new_bkgd, sizeof(new_bkgd))) { + T(("...unchanged")); + returnCode(OK); + } + + old_char = old_bkgd; + RemAttr(old_char, ~A_CHARTEXT); + old_attr = AttrOf(old_bkgd); + old_pair = GetPair(old_bkgd); + + if (!(old_attr & A_COLOR)) { + old_pair = 0; + } + T(("... old background char %s, attr %s, pair %d", + TraceChar(old_char), _traceattr(old_attr), old_pair)); + + new_char = new_bkgd; + RemAttr(new_char, ~A_CHARTEXT); + new_attr = AttrOf(new_bkgd); + new_pair = GetPair(new_bkgd); + + /* SVr4 limits background character to printable 7-bits */ + if ( +#if USE_WIDEC_SUPPORT + narrow && +#endif + !Charable(new_bkgd)) { + new_char = old_char; + } + if (!(new_attr & A_COLOR)) { + new_pair = 0; + } + T(("... new background char %s, attr %s, pair %d", + TraceChar(new_char), _traceattr(new_attr), new_pair)); + + (void) wbkgrndset(win, CHREF(new_bkgd)); + + /* SVr4 updates color pair if old/new match, otherwise just attrs */ + if ((new_pair != 0) && (new_pair == old_pair)) { + WINDOW_ATTRS(win) = new_attr; + SET_WINDOW_PAIR(win, new_pair); + } else { + WINDOW_ATTRS(win) = new_attr; + } + + for (y = 0; y <= win->_maxy; y++) { + int x; + + for (x = 0; x <= win->_maxx; x++) { + NCURSES_CH_T *cp = &(win->_line[y].text[x]); + int tmp_pair = GetPair(*cp); + attr_t tmp_attr = AttrOf(*cp); + + if (CharEq(*cp, old_bkgd)) { +#if USE_WIDEC_SUPPORT + if (!narrow) { + if (Charable(new_bkgd)) { + SetChar2(*cp, CharOf(new_char)); + } else { + SetChar(*cp, L' ', AttrOf(new_char)); + } + memcpy(cp->chars, + new_char.chars, + CCHARW_MAX * sizeof(cp->chars[0])); + } else +#endif + SetChar2(*cp, CharOf(new_char)); + } + if (tmp_pair != 0) { + if (tmp_pair == old_pair) { + SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr); + SetPair(*cp, new_pair); + } else { + SetAttr(*cp, + (tmp_attr & (~old_attr | A_COLOR)) + | (new_attr & ALL_BUT_COLOR)); + } + } else { + SetAttr(*cp, (tmp_attr & ~old_attr) | new_attr); + SetPair(*cp, new_pair); + } + } + } + touchwin(win); + _nc_synchook(win); + code = OK; + } + returnCode(code); +} + +#if USE_WIDEC_SUPPORT +NCURSES_EXPORT(int) +wbkgrnd(WINDOW *win, const ARG_CH_T ch) +{ + return _nc_background(win, ch, FALSE); +} +#endif + +NCURSES_EXPORT(int) +wbkgd(WINDOW *win, chtype ch) +{ + NCURSES_CH_T wch; + SetChar2(wch, ch); + return _nc_background(win, CHREF(wch), TRUE); +} diff --git a/contrib/ncurses/ncurses/base/lib_box.c b/contrib/ncurses/ncurses/base/lib_box.c new file mode 100644 index 00000000..186f1121 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_box.c @@ -0,0 +1,140 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Sven Verdoolaege 2001 * + ****************************************************************************/ + +/* +** lib_box.c +** +** The routine wborder(). +** +*/ + +#include + +MODULE_ID("$Id: lib_box.c,v 1.26 2020/02/02 23:34:34 tom Exp $") + +#if USE_WIDEC_SUPPORT +static NCURSES_INLINE chtype +_my_render(WINDOW *win, chtype ch) +{ + NCURSES_CH_T wch; + SetChar2(wch, ch); + wch = _nc_render(win, wch); + return ((attr_t) CharOf(wch)) | AttrOf(wch); +} + +#define RENDER_WITH_DEFAULT(ch,def) w ## ch = _my_render(win, (ch == 0) ? def : ch) +#else +#define RENDER_WITH_DEFAULT(ch,def) w ## ch = _nc_render(win, (ch == 0) ? def : ch) +#endif + +NCURSES_EXPORT(int) +wborder(WINDOW *win, + chtype ls, chtype rs, + chtype ts, chtype bs, + chtype tl, chtype tr, + chtype bl, chtype br) +{ + NCURSES_SIZE_T i; + NCURSES_SIZE_T endx, endy; + chtype wls, wrs, wts, wbs, wtl, wtr, wbl, wbr; + + T((T_CALLED("wborder(%p,%s,%s,%s,%s,%s,%s,%s,%s)"), + (void *) win, + _tracechtype2(1, ls), + _tracechtype2(2, rs), + _tracechtype2(3, ts), + _tracechtype2(4, bs), + _tracechtype2(5, tl), + _tracechtype2(6, tr), + _tracechtype2(7, bl), + _tracechtype2(8, br))); + + if (!win) + returnCode(ERR); + + RENDER_WITH_DEFAULT(ls, ACS_VLINE); + RENDER_WITH_DEFAULT(rs, ACS_VLINE); + RENDER_WITH_DEFAULT(ts, ACS_HLINE); + RENDER_WITH_DEFAULT(bs, ACS_HLINE); + RENDER_WITH_DEFAULT(tl, ACS_ULCORNER); + RENDER_WITH_DEFAULT(tr, ACS_URCORNER); + RENDER_WITH_DEFAULT(bl, ACS_LLCORNER); + RENDER_WITH_DEFAULT(br, ACS_LRCORNER); + + T(("using %s, %s, %s, %s, %s, %s, %s, %s", + _tracechtype2(1, wls), + _tracechtype2(2, wrs), + _tracechtype2(3, wts), + _tracechtype2(4, wbs), + _tracechtype2(5, wtl), + _tracechtype2(6, wtr), + _tracechtype2(7, wbl), + _tracechtype2(8, wbr))); + + endx = win->_maxx; + endy = win->_maxy; + + for (i = 0; i <= endx; i++) { + SetChar2(win->_line[0].text[i], wts); + SetChar2(win->_line[endy].text[i], wbs); + } + win->_line[endy].firstchar = win->_line[0].firstchar = 0; + win->_line[endy].lastchar = win->_line[0].lastchar = endx; + + for (i = 0; i <= endy; i++) { +#if USE_WIDEC_SUPPORT + if (endx > 0 && isWidecExt(win->_line[i].text[endx])) { + SetChar2(win->_line[i].text[endx - 1], ' '); + } +#endif + SetChar2(win->_line[i].text[0], wls); + SetChar2(win->_line[i].text[endx], wrs); + win->_line[i].firstchar = 0; + win->_line[i].lastchar = endx; +#if USE_WIDEC_SUPPORT + if (isWidecExt(win->_line[i].text[1])) { + SetChar2(win->_line[i].text[1], ' '); + } +#endif + } + SetChar2(win->_line[0].text[0], wtl); + SetChar2(win->_line[0].text[endx], wtr); + SetChar2(win->_line[endy].text[0], wbl); + SetChar2(win->_line[endy].text[endx], wbr); + + _nc_synchook(win); + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/base/lib_chgat.c b/contrib/ncurses/ncurses/base/lib_chgat.c new file mode 100644 index 00000000..74c4f75b --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_chgat.c @@ -0,0 +1,80 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Sven Verdoolaege 2001 * + * and: Thomas E. Dickey 2005 * + ****************************************************************************/ + +/* +** lib_chgat.c +** +** The routine wchgat(). +** +*/ + +#include + +MODULE_ID("$Id: lib_chgat.c,v 1.13 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wchgat(WINDOW *win, + int n, + attr_t attr, + NCURSES_PAIRS_T pair_arg, + const void *opts GCC_UNUSED) +{ + int code = ERR; + int color_pair = pair_arg; + + T((T_CALLED("wchgat(%p,%d,%s,%d)"), + (void *) win, + n, + _traceattr(attr), + color_pair)); + + set_extended_pair(opts, color_pair); + if (win) { + struct ldat *line = &(win->_line[win->_cury]); + int i; + + toggle_attr_on(attr, ColorPair(color_pair)); + + for (i = win->_curx; i <= win->_maxx && (n == -1 || (n-- > 0)); i++) { + SetAttr(line->text[i], attr); + SetPair(line->text[i], color_pair); + CHANGED_CELL(line, i); + } + + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_clear.c b/contrib/ncurses/ncurses/base/lib_clear.c new file mode 100644 index 00000000..2a1c97c4 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_clear.c @@ -0,0 +1,57 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_clear.c +** +** The routine wclear(). +** +*/ + +#include + +MODULE_ID("$Id: lib_clear.c,v 1.9 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wclear(WINDOW *win) +{ + int code = ERR; + + T((T_CALLED("wclear(%p)"), (void *) win)); + + if ((code = werase(win)) != ERR) + win->_clear = TRUE; + + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_clearok.c b/contrib/ncurses/ncurses/base/lib_clearok.c new file mode 100644 index 00000000..d98287c0 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_clearok.c @@ -0,0 +1,56 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_clearok.c +** +** The routine clearok. +** +*/ + +#include + +MODULE_ID("$Id: lib_clearok.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +clearok(WINDOW *win, bool flag) +{ + T((T_CALLED("clearok(%p,%d)"), (void *) win, flag)); + + if (win) { + win->_clear = flag; + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_clrbot.c b/contrib/ncurses/ncurses/base/lib_clrbot.c new file mode 100644 index 00000000..e5482b9e --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_clrbot.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2006,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_clrbot.c +** +** The routine wclrtobot(). +** +*/ + +#include + +MODULE_ID("$Id: lib_clrbot.c,v 1.22 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wclrtobot(WINDOW *win) +{ + int code = ERR; + + T((T_CALLED("wclrtobot(%p)"), (void *) win)); + + if (win) { + NCURSES_SIZE_T y; + NCURSES_SIZE_T startx = win->_curx; + NCURSES_CH_T blank = win->_nc_bkgd; + + T(("clearing from y = %ld to y = %ld with maxx = %ld", + (long) win->_cury, (long) win->_maxy, (long) win->_maxx)); + + for (y = win->_cury; y <= win->_maxy; y++) { + struct ldat *line = &(win->_line[y]); + NCURSES_CH_T *ptr = &(line->text[startx]); + NCURSES_CH_T *end = &(line->text[win->_maxx]); + + CHANGED_TO_EOL(line, startx, win->_maxx); + + while (ptr <= end) + *ptr++ = blank; + + startx = 0; + } + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_clreol.c b/contrib/ncurses/ncurses/base/lib_clreol.c new file mode 100644 index 00000000..0b6b0ff8 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_clreol.c @@ -0,0 +1,92 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2001,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_clreol.c +** +** The routine wclrtoeol(). +** +*/ + +#include + +MODULE_ID("$Id: lib_clreol.c,v 1.24 2021/10/23 19:06:01 tom Exp $") + +NCURSES_EXPORT(int) +wclrtoeol(WINDOW *win) +{ + int code = ERR; + + T((T_CALLED("wclrtoeol(%p)"), (void *) win)); + + if (win) { + NCURSES_CH_T blank; + NCURSES_CH_T *ptr, *end; + struct ldat *line; + NCURSES_SIZE_T y = win->_cury; + NCURSES_SIZE_T x = win->_curx; + + /* + * If we have just wrapped the cursor, the clear applies to the + * new line, unless we are at the lower right corner. + */ + if (IS_WRAPPED(win) != 0 + && y < win->_maxy) { + win->_flags &= ~_WRAPPED; + } + + /* + * There's no point in clearing if we're not on a legal + * position, either. + */ + if (IS_WRAPPED(win) + || y > win->_maxy + || x > win->_maxx) + returnCode(ERR); + + blank = win->_nc_bkgd; + line = &win->_line[y]; + CHANGED_TO_EOL(line, x, win->_maxx); + + ptr = &(line->text[x]); + end = &(line->text[win->_maxx]); + + while (ptr <= end) + *ptr++ = blank; + + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_color.c b/contrib/ncurses/ncurses/base/lib_color.c new file mode 100644 index 00000000..654b63df --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_color.c @@ -0,0 +1,1166 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* lib_color.c + * + * Handles color emulation of SYS V curses + */ + +#define NEW_PAIR_INTERNAL 1 + +#include +#include +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_color.c,v 1.151 2024/05/25 23:10:42 tom Exp $") + +#ifdef USE_TERM_DRIVER +#define CanChange InfoOf(SP_PARM).canchange +#define DefaultPalette InfoOf(SP_PARM).defaultPalette +#define HasColor InfoOf(SP_PARM).hascolor +#define InitColor InfoOf(SP_PARM).initcolor +#define MaxColors InfoOf(SP_PARM).maxcolors +#define MaxPairs InfoOf(SP_PARM).maxpairs +#define UseHlsPalette (DefaultPalette == _nc_hls_palette) +#else +#define CanChange can_change +#define DefaultPalette (hue_lightness_saturation ? hls_palette : cga_palette) +#define HasColor has_color +#define InitColor initialize_color +#define MaxColors max_colors +#define MaxPairs max_pairs +#define UseHlsPalette (hue_lightness_saturation) +#endif + +#ifndef USE_TERM_DRIVER +/* + * These should be screen structure members. They need to be globals for + * historical reasons. So we assign them in start_color() and also in + * set_term()'s screen-switching logic. + */ +#if USE_REENTRANT +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(COLOR_PAIRS) (void) +{ + return SP ? SP->_pair_count : -1; +} +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(COLORS) (void) +{ + return SP ? SP->_color_count : -1; +} +#else +NCURSES_EXPORT_VAR(int) COLOR_PAIRS = 0; +NCURSES_EXPORT_VAR(int) COLORS = 0; +#endif +#endif /* !USE_TERM_DRIVER */ + +#define DATA(r,g,b) {r,g,b, 0,0,0, 0} + +#define MAX_PALETTE 8 + +#define OkColorHi(n) (((n) < COLORS) && ((n) < maxcolors)) +#define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE) + +/* + * Given a RGB range of 0..1000, we'll normally set the individual values + * to about 2/3 of the maximum, leaving full-range for bold/bright colors. + */ +#define RGB_ON 680 +#define RGB_OFF 0 +/* *INDENT-OFF* */ +static const color_t cga_palette[] = +{ + /* R G B */ + DATA(RGB_OFF, RGB_OFF, RGB_OFF), /* COLOR_BLACK */ + DATA(RGB_ON, RGB_OFF, RGB_OFF), /* COLOR_RED */ + DATA(RGB_OFF, RGB_ON, RGB_OFF), /* COLOR_GREEN */ + DATA(RGB_ON, RGB_ON, RGB_OFF), /* COLOR_YELLOW */ + DATA(RGB_OFF, RGB_OFF, RGB_ON), /* COLOR_BLUE */ + DATA(RGB_ON, RGB_OFF, RGB_ON), /* COLOR_MAGENTA */ + DATA(RGB_OFF, RGB_ON, RGB_ON), /* COLOR_CYAN */ + DATA(RGB_ON, RGB_ON, RGB_ON), /* COLOR_WHITE */ +}; + +static const color_t hls_palette[] = +{ + /* H L S */ + DATA( 0, 0, 0), /* COLOR_BLACK */ + DATA( 120, 50, 100), /* COLOR_RED */ + DATA( 240, 50, 100), /* COLOR_GREEN */ + DATA( 180, 50, 100), /* COLOR_YELLOW */ + DATA( 330, 50, 100), /* COLOR_BLUE */ + DATA( 60, 50, 100), /* COLOR_MAGENTA */ + DATA( 300, 50, 100), /* COLOR_CYAN */ + DATA( 0, 50, 100), /* COLOR_WHITE */ +}; + +#ifdef USE_TERM_DRIVER +NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette = cga_palette; +NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette = hls_palette; +#endif + +/* *INDENT-ON* */ +#if NCURSES_EXT_FUNCS +/* + * These are called from _nc_do_color(), which in turn is called from + * vidattr - so we have to assume that sp may be null. + */ +static int +default_fg(NCURSES_SP_DCL0) +{ + return (SP_PARM != 0) ? SP_PARM->_default_fg : COLOR_WHITE; +} + +static int +default_bg(NCURSES_SP_DCL0) +{ + return SP_PARM != 0 ? SP_PARM->_default_bg : COLOR_BLACK; +} +#else +#define default_fg(sp) COLOR_WHITE +#define default_bg(sp) COLOR_BLACK +#endif + +#ifndef USE_TERM_DRIVER +/* + * SVr4 curses is known to interchange color codes (1,4) and (3,6), possibly + * to maintain compatibility with a pre-ANSI scheme. The same scheme is + * also used in the FreeBSD syscons. + */ +static int +toggled_colors(int c) +{ + if (c < 16) { + static const int table[] = + {0, 4, 2, 6, 1, 5, 3, 7, + 8, 12, 10, 14, 9, 13, 11, 15}; + c = table[c]; + } + return c; +} +#endif + +static void +set_background_color(NCURSES_SP_DCLx int bg, NCURSES_SP_OUTC outc) +{ +#ifdef USE_TERM_DRIVER + CallDriver_3(SP_PARM, td_color, FALSE, bg, outc); +#else + if (set_a_background) { + TPUTS_TRACE("set_a_background"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_a_background, bg), + 1, outc); + } else { + TPUTS_TRACE("set_background"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_background, toggled_colors(bg)), + 1, outc); + } +#endif +} + +static void +set_foreground_color(NCURSES_SP_DCLx int fg, NCURSES_SP_OUTC outc) +{ +#ifdef USE_TERM_DRIVER + CallDriver_3(SP_PARM, td_color, TRUE, fg, outc); +#else + if (set_a_foreground) { + TPUTS_TRACE("set_a_foreground"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_a_foreground, fg), + 1, outc); + } else { + TPUTS_TRACE("set_foreground"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_foreground, toggled_colors(fg)), + 1, outc); + } +#endif +} + +static void +init_color_table(NCURSES_SP_DCL0) +{ + const color_t *tp = DefaultPalette; + int n; + + assert(tp != 0); + + for (n = 0; n < COLORS; n++) { + if (InPalette(n)) { + SP_PARM->_color_table[n] = tp[n]; + } else { + SP_PARM->_color_table[n] = tp[n % MAX_PALETTE]; + if (UseHlsPalette) { + SP_PARM->_color_table[n].green = 100; + } else { + if (SP_PARM->_color_table[n].red) + SP_PARM->_color_table[n].red = 1000; + if (SP_PARM->_color_table[n].green) + SP_PARM->_color_table[n].green = 1000; + if (SP_PARM->_color_table[n].blue) + SP_PARM->_color_table[n].blue = 1000; + } + } + } +} + +static bool +init_direct_colors(NCURSES_SP_DCL0) +{ + static NCURSES_CONST char name[] = "RGB"; + + rgb_bits_t *result = &(SP_PARM->_direct_color); + + result->value = 0; + + if (COLORS >= 8) { + int n; + const char *s; + int width; + + /* find the number of bits needed for the maximum color value */ + for (width = 0; (1 << width) - 1 < (COLORS - 1); ++width) { + ; + } + + if (tigetflag(name) > 0) { + n = (width + 2) / 3; + result->bits.red = UChar(n); + result->bits.green = UChar(n); + result->bits.blue = UChar(width - (2 * n)); + } else if ((n = tigetnum(name)) > 0) { + result->bits.red = UChar(n); + result->bits.green = UChar(n); + result->bits.blue = UChar(n); + } else if ((s = tigetstr(name)) != 0 && VALID_STRING(s)) { + int red = n; + int green = n; + int blue = width - (2 * n); + + switch (sscanf(s, "%d/%d/%d", &red, &green, &blue)) { + default: + blue = width - (2 * n); + /* FALLTHRU */ + case 1: + green = n; + /* FALLTHRU */ + case 2: + red = n; + /* FALLTHRU */ + case 3: + /* okay */ + break; + } + result->bits.red = UChar(red); + result->bits.green = UChar(green); + result->bits.blue = UChar(blue); + } + } + return (result->value != 0); +} + +/* + * Reset the color pair, e.g., to whatever color pair 0 is. + */ +static bool +reset_color_pair(NCURSES_SP_DCL0) +{ +#ifdef USE_TERM_DRIVER + return CallDriver(SP_PARM, td_rescol); +#else + bool result = FALSE; + + (void) SP_PARM; + if (orig_pair != 0) { + (void) NCURSES_PUTP2("orig_pair", orig_pair); + result = TRUE; + } + return result; +#endif +} + +/* + * Reset color pairs and definitions. Actually we do both more to accommodate + * badly-written terminal descriptions than for the relatively rare case where + * someone has changed the color definitions. + */ +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_DCL0) +{ + int result = FALSE; + + T((T_CALLED("_nc_reset_colors(%p)"), (void *) SP_PARM)); + if (SP_PARM->_color_defs > 0) + SP_PARM->_color_defs = -(SP_PARM->_color_defs); + if (reset_color_pair(NCURSES_SP_ARG)) + result = TRUE; + +#ifdef USE_TERM_DRIVER + result = CallDriver(SP_PARM, td_rescolors); +#else + if (orig_colors != 0) { + NCURSES_PUTP2("orig_colors", orig_colors); + result = TRUE; + } +#endif + returnBool(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +_nc_reset_colors(void) +{ + return NCURSES_SP_NAME(_nc_reset_colors) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0) +{ + int result = ERR; + + T((T_CALLED("start_color(%p)"), (void *) SP_PARM)); + + if (SP_PARM == 0) { + result = ERR; + } else if (SP_PARM->_coloron) { + result = OK; + } else { + int maxpairs = MaxPairs; + int maxcolors = MaxColors; + if (reset_color_pair(NCURSES_SP_ARG) != TRUE) { + set_foreground_color(NCURSES_SP_ARGx + default_fg(NCURSES_SP_ARG), + NCURSES_SP_NAME(_nc_outch)); + set_background_color(NCURSES_SP_ARGx + default_bg(NCURSES_SP_ARG), + NCURSES_SP_NAME(_nc_outch)); + } +#if !NCURSES_EXT_COLORS + /* + * Without ext-colors, we cannot represent more than 256 color pairs. + */ + if (maxpairs > 256) + maxpairs = 256; +#endif + + if (maxpairs > 0 && maxcolors > 0) { + SP_PARM->_pair_limit = maxpairs; + +#if NCURSES_EXT_FUNCS + /* + * If using default colors, allocate extra space in table to + * allow for default-color as a component of a color-pair. + */ + SP_PARM->_pair_limit += (1 + (2 * maxcolors)); +#if !NCURSES_EXT_COLORS + SP_PARM->_pair_limit = limit_PAIRS(SP_PARM->_pair_limit); +#endif +#endif /* NCURSES_EXT_FUNCS */ + SP_PARM->_pair_count = maxpairs; + SP_PARM->_color_count = maxcolors; +#if !USE_REENTRANT + COLOR_PAIRS = maxpairs; + COLORS = maxcolors; +#endif + + ReservePairs(SP_PARM, 16); + if (SP_PARM->_color_pairs != 0) { + if (init_direct_colors(NCURSES_SP_ARG)) { + result = OK; + } else { + TYPE_CALLOC(color_t, maxcolors, SP_PARM->_color_table); + if (SP_PARM->_color_table != 0) { + MakeColorPair(SP_PARM->_color_pairs[0], + default_fg(NCURSES_SP_ARG), + default_bg(NCURSES_SP_ARG)); + init_color_table(NCURSES_SP_ARG); + + result = OK; + } + } + if (result == OK) { + T(("started color: COLORS = %d, COLOR_PAIRS = %d", + COLORS, COLOR_PAIRS)); + + SP_PARM->_coloron = 1; + } else if (SP_PARM->_color_pairs != 0) { + FreeAndNull(SP_PARM->_color_pairs); + } + } + } else { + result = OK; + } + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +start_color(void) +{ + return NCURSES_SP_NAME(start_color) (CURRENT_SCREEN); +} +#endif + +/* This function was originally written by Daniel Weaver */ +static void +rgb2hls(int r, int g, int b, int *h, int *l, int *s) +/* convert RGB to HLS system */ +{ + int min, max, t; + + if ((min = g < r ? g : r) > b) + min = b; + if ((max = g > r ? g : r) < b) + max = b; + + /* calculate lightness */ + *l = ((min + max) / 20); + + if (min == max) { /* black, white and all shades of gray */ + *h = 0; + *s = 0; + return; + } + + /* calculate saturation */ + if (*l < 50) + *s = (((max - min) * 100) / (max + min)); + else + *s = (((max - min) * 100) / (2000 - max - min)); + + /* calculate hue */ + if (r == max) + t = (120 + ((g - b) * 60) / (max - min)); + else if (g == max) + t = (240 + ((b - r) * 60) / (max - min)); + else + t = (360 + ((r - g) * 60) / (max - min)); + + *h = (t % 360); +} + +/* + * Change all cells which use(d) a given color pair to force a repaint. + */ +NCURSES_EXPORT(void) +_nc_change_pair(SCREEN *sp, int pair) +{ + int y, x; + + if (CurScreen(sp)->_clear) + return; +#if NO_LEAKS + if (_nc_globals.leak_checking) + return; +#endif + + for (y = 0; y <= CurScreen(sp)->_maxy; y++) { + struct ldat *ptr = &(CurScreen(sp)->_line[y]); + bool changed = FALSE; + for (x = 0; x <= CurScreen(sp)->_maxx; x++) { + if (GetPair(ptr->text[x]) == pair) { + /* Set the old cell to zero to ensure it will be + updated on the next doupdate() */ + SetChar(ptr->text[x], 0, 0); + CHANGED_CELL(ptr, x); + changed = TRUE; + } + } + if (changed) + NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_ARGx y); + } +} + +NCURSES_EXPORT(void) +_nc_reserve_pairs(SCREEN *sp, int want) +{ + int have = sp->_pair_alloc; + + if (have == 0) + have = 1; + while (have <= want) + have *= 2; + if (have > sp->_pair_limit) + have = sp->_pair_limit; + + if (sp->_color_pairs == 0) { + TYPE_CALLOC(colorpair_t, have, sp->_color_pairs); + } else if (have > sp->_pair_alloc) { +#if NCURSES_EXT_COLORS && NCURSES_EXT_FUNCS + colorpair_t *next; + + if ((next = typeCalloc(colorpair_t, have)) == 0) + _nc_err_abort(MSG_NO_MEMORY); + memcpy(next, sp->_color_pairs, (size_t) sp->_pair_alloc * sizeof(*next)); + _nc_copy_pairs(sp, next, sp->_color_pairs, sp->_pair_alloc); + free(sp->_color_pairs); + sp->_color_pairs = next; +#else + TYPE_REALLOC(colorpair_t, have, sp->_color_pairs); + if (sp->_color_pairs != 0) { + memset(sp->_color_pairs + sp->_pair_alloc, 0, + sizeof(colorpair_t) * (size_t) (have - sp->_pair_alloc)); + } +#endif + } + if (sp->_color_pairs != 0) { + sp->_pair_alloc = have; + } +} + +/* + * Extension (1997/1/18) - Allow negative f/b values to set default color + * values. + */ +NCURSES_EXPORT(int) +_nc_init_pair(SCREEN *sp, int pair, int f, int b) +{ + static colorpair_t null_pair; + colorpair_t result = null_pair; + colorpair_t previous; + int maxcolors; + + T((T_CALLED("init_pair(%p,%d,%d,%d)"), (void *) sp, pair, f, b)); + + if (!ValidPair(sp, pair)) + returnCode(ERR); + + maxcolors = MaxColors; + + ReservePairs(sp, pair); + previous = sp->_color_pairs[pair]; +#if NCURSES_EXT_FUNCS + if (sp->_default_color || sp->_assumed_color) { + bool isDefault = FALSE; + bool wasDefault = FALSE; + int default_pairs = sp->_default_pairs; + + /* + * Map caller's color number, e.g., -1, 0, 1, .., 7, etc., into + * internal unsigned values which we will store in the _color_pairs[] + * table. + */ + if (isDefaultColor(f)) { + f = COLOR_DEFAULT; + isDefault = TRUE; + } else if (!OkColorHi(f)) { + returnCode(ERR); + } + + if (isDefaultColor(b)) { + b = COLOR_DEFAULT; + isDefault = TRUE; + } else if (!OkColorHi(b)) { + returnCode(ERR); + } + + /* + * Check if the table entry that we are going to init/update used + * default colors. + */ + if (isDefaultColor(FORE_OF(previous)) + || isDefaultColor(BACK_OF(previous))) + wasDefault = TRUE; + + /* + * Keep track of the number of entries in the color pair table which + * used a default color. + */ + if (isDefault && !wasDefault) { + ++default_pairs; + } else if (wasDefault && !isDefault) { + --default_pairs; + } + + /* + * As an extension, ncurses allows the pair number to exceed the + * terminal's color_pairs value for pairs using a default color. + * + * Note that updating a pair which used a default color with one + * that does not will decrement the count - and possibly interfere + * with sequentially adding new pairs. + */ + if (pair > (sp->_pair_count + default_pairs)) { + returnCode(ERR); + } + sp->_default_pairs = default_pairs; + } else +#endif + { + if ((f < 0) || !OkColorHi(f) + || (b < 0) || !OkColorHi(b) + || (pair < 1)) { + returnCode(ERR); + } + } + + /* + * When a pair's content is changed, replace its colors (if pair was + * initialized before a screen update is performed replacing original + * pair colors with the new ones). + */ + MakeColorPair(result, f, b); + if ((FORE_OF(previous) != 0 + || BACK_OF(previous) != 0) + && !isSamePair(previous, result)) { + _nc_change_pair(sp, pair); + } + + _nc_reset_color_pair(sp, pair, &result); + sp->_color_pairs[pair] = result; + _nc_set_color_pair(sp, pair, cpINIT); + + if (GET_SCREEN_PAIR(sp) == pair) + SET_SCREEN_PAIR(sp, (int) (~0)); /* force attribute update */ + +#ifdef USE_TERM_DRIVER + CallDriver_3(sp, td_initpair, pair, f, b); +#else + if (initialize_pair && InPalette(f) && InPalette(b)) { + const color_t *tp = DefaultPalette; + + TR(TRACE_ATTRS, + ("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)", + (int) pair, + (int) tp[f].red, (int) tp[f].green, (int) tp[f].blue, + (int) tp[b].red, (int) tp[b].green, (int) tp[b].blue)); + + NCURSES_PUTP2("initialize_pair", + TIPARM_7(initialize_pair, + pair, + (int) tp[f].red, + (int) tp[f].green, + (int) tp[f].blue, + (int) tp[b].red, + (int) tp[b].green, + (int) tp[b].blue)); + } +#endif + + returnCode(OK); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx + NCURSES_PAIRS_T pair, + NCURSES_COLOR_T f, + NCURSES_COLOR_T b) +{ + return _nc_init_pair(SP_PARM, pair, f, b); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +init_pair(NCURSES_COLOR_T pair, NCURSES_COLOR_T f, NCURSES_COLOR_T b) +{ + return NCURSES_SP_NAME(init_pair) (CURRENT_SCREEN, pair, f, b); +} +#endif + +#define okRGB(n) ((n) >= 0 && (n) <= 1000) + +NCURSES_EXPORT(int) +_nc_init_color(SCREEN *sp, int color, int r, int g, int b) +{ + int result = ERR; + int maxcolors; + + T((T_CALLED("init_color(%p,%d,%d,%d,%d)"), + (void *) sp, + color, + r, g, b)); + + if (sp == 0 || sp->_direct_color.value) + returnCode(result); + + maxcolors = MaxColors; + + if (InitColor + && sp->_coloron + && (color >= 0 && OkColorHi(color)) + && (okRGB(r) && okRGB(g) && okRGB(b))) { + + sp->_color_table[color].init = 1; + sp->_color_table[color].r = r; + sp->_color_table[color].g = g; + sp->_color_table[color].b = b; + + if (UseHlsPalette) { + rgb2hls(r, g, b, + &sp->_color_table[color].red, + &sp->_color_table[color].green, + &sp->_color_table[color].blue); + } else { + sp->_color_table[color].red = r; + sp->_color_table[color].green = g; + sp->_color_table[color].blue = b; + } + +#ifdef USE_TERM_DRIVER + CallDriver_4(sp, td_initcolor, color, r, g, b); +#else + NCURSES_PUTP2("initialize_color", + TIPARM_4(initialize_color, color, r, g, b)); +#endif + sp->_color_defs = Max(color + 1, sp->_color_defs); + + result = OK; + } + returnCode(result); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(init_color) (NCURSES_SP_DCLx + NCURSES_COLOR_T color, + NCURSES_COLOR_T r, + NCURSES_COLOR_T g, + NCURSES_COLOR_T b) +{ + return _nc_init_color(SP_PARM, color, r, g, b); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +init_color(NCURSES_COLOR_T color, + NCURSES_COLOR_T r, + NCURSES_COLOR_T g, + NCURSES_COLOR_T b) +{ + return NCURSES_SP_NAME(init_color) (CURRENT_SCREEN, color, r, g, b); +} +#endif + +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(can_change_color) (NCURSES_SP_DCL) +{ + int result = FALSE; + + T((T_CALLED("can_change_color(%p)"), (void *) SP_PARM)); + + if (HasTerminal(SP_PARM) && (CanChange != 0)) { + result = TRUE; + } + + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +can_change_color(void) +{ + return NCURSES_SP_NAME(can_change_color) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(has_colors) (NCURSES_SP_DCL0) +{ + int code = FALSE; + + (void) SP_PARM; + T((T_CALLED("has_colors(%p)"), (void *) SP_PARM)); + if (HasTerminal(SP_PARM)) { +#ifdef USE_TERM_DRIVER + code = HasColor; +#else + code = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs) + && (((set_foreground != NULL) + && (set_background != NULL)) + || ((set_a_foreground != NULL) + && (set_a_background != NULL)) + || set_color_pair)) ? TRUE : FALSE); +#endif + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +has_colors(void) +{ + return NCURSES_SP_NAME(has_colors) (CURRENT_SCREEN); +} +#endif + +static int +_nc_color_content(SCREEN *sp, int color, int *r, int *g, int *b) +{ + int result = ERR; + + T((T_CALLED("color_content(%p,%d,%p,%p,%p)"), + (void *) sp, + color, + (void *) r, + (void *) g, + (void *) b)); + + if (sp != 0) { + int maxcolors = MaxColors; + + if (color >= 0 && OkColorHi(color) && sp->_coloron) { + int c_r, c_g, c_b; + + if (sp->_direct_color.value) { + rgb_bits_t *work = &(sp->_direct_color); + +#define max_direct_color(name) ((1 << work->bits.name) - 1) +#define value_direct_color(max) (1000 * ((color >> bitoff) & max)) / max + + int max_r = max_direct_color(red); + int max_g = max_direct_color(green); + int max_b = max_direct_color(blue); + + int bitoff = 0; + + c_b = value_direct_color(max_b); + bitoff += work->bits.blue; + + c_g = value_direct_color(max_g); + bitoff += work->bits.green; + + c_r = value_direct_color(max_r); + + } else { + c_r = sp->_color_table[color].red; + c_g = sp->_color_table[color].green; + c_b = sp->_color_table[color].blue; + } + + if (r) + *r = c_r; + if (g) + *g = c_g; + if (b) + *b = c_b; + + TR(TRACE_ATTRS, ("...color_content(%d,%d,%d,%d)", + color, c_r, c_g, c_b)); + result = OK; + } + } + if (result != OK) { + if (r) + *r = 0; + if (g) + *g = 0; + if (b) + *b = 0; + } + returnCode(result); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(color_content) (NCURSES_SP_DCLx + NCURSES_COLOR_T color, + NCURSES_COLOR_T *r, + NCURSES_COLOR_T *g, + NCURSES_COLOR_T *b) +{ + int my_r, my_g, my_b; + int rc = _nc_color_content(SP_PARM, color, &my_r, &my_g, &my_b); + if (rc == OK) { + *r = limit_COLOR(my_r); + *g = limit_COLOR(my_g); + *b = limit_COLOR(my_b); + } + return rc; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +color_content(NCURSES_COLOR_T color, + NCURSES_COLOR_T *r, + NCURSES_COLOR_T *g, + NCURSES_COLOR_T *b) +{ + return NCURSES_SP_NAME(color_content) (CURRENT_SCREEN, color, r, g, b); +} +#endif + +NCURSES_EXPORT(int) +_nc_pair_content(SCREEN *sp, int pair, int *f, int *b) +{ + int result; + + T((T_CALLED("pair_content(%p,%d,%p,%p)"), + (void *) sp, + (int) pair, + (void *) f, + (void *) b)); + + if (!ValidPair(sp, pair)) { + result = ERR; + } else { + int fg; + int bg; + + ReservePairs(sp, pair); + fg = FORE_OF(sp->_color_pairs[pair]); + bg = BACK_OF(sp->_color_pairs[pair]); +#if NCURSES_EXT_FUNCS + if (isDefaultColor(fg)) + fg = -1; + if (isDefaultColor(bg)) + bg = -1; +#endif + + if (f) + *f = fg; + if (b) + *b = bg; + + TR(TRACE_ATTRS, ("...pair_content(%p,%d,%d,%d)", + (void *) sp, + (int) pair, + (int) fg, (int) bg)); + result = OK; + } + returnCode(result); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx + NCURSES_PAIRS_T pair, + NCURSES_COLOR_T *f, + NCURSES_COLOR_T *b) +{ + int my_f, my_b; + int rc = _nc_pair_content(SP_PARM, pair, &my_f, &my_b); + if (rc == OK) { + *f = limit_COLOR(my_f); + *b = limit_COLOR(my_b); + } + return rc; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +pair_content(NCURSES_COLOR_T pair, NCURSES_COLOR_T *f, NCURSES_COLOR_T *b) +{ + return NCURSES_SP_NAME(pair_content) (CURRENT_SCREEN, pair, f, b); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx + int old_pair, + int pair, + int reverse, + NCURSES_SP_OUTC outc) +{ +#ifdef USE_TERM_DRIVER + CallDriver_4(SP_PARM, td_docolor, old_pair, pair, reverse, outc); +#else + int fg = COLOR_DEFAULT; + int bg = COLOR_DEFAULT; + int old_fg = -1; + int old_bg = -1; + + if (!ValidPair(SP_PARM, pair)) { + return; + } else if (pair != 0) { + if (set_color_pair) { + TPUTS_TRACE("set_color_pair"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_color_pair, pair), + 1, outc); + return; + } else if (SP_PARM != 0) { + if (_nc_pair_content(SP_PARM, pair, &fg, &bg) == ERR) + return; + } + } + + if (old_pair >= 0 + && SP_PARM != 0 + && _nc_pair_content(SP_PARM, old_pair, &old_fg, &old_bg) != ERR) { + if ((isDefaultColor(fg) && !isDefaultColor(old_fg)) + || (isDefaultColor(bg) && !isDefaultColor(old_bg))) { +#if NCURSES_EXT_FUNCS + /* + * A minor optimization - but extension. If "AX" is specified in + * the terminal description, treat it as screen's indicator of ECMA + * SGR 39 and SGR 49, and assume the two sequences are independent. + */ + if (SP_PARM->_has_sgr_39_49 + && isDefaultColor(old_bg) + && !isDefaultColor(old_fg)) { + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[39m", 1, outc); + } else if (SP_PARM->_has_sgr_39_49 + && isDefaultColor(old_fg) + && !isDefaultColor(old_bg)) { + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[49m", 1, outc); + } else +#endif + reset_color_pair(NCURSES_SP_ARG); + } + } else { + reset_color_pair(NCURSES_SP_ARG); + if (old_pair < 0 && pair <= 0) + return; + } + +#if NCURSES_EXT_FUNCS + if (isDefaultColor(fg)) + fg = default_fg(NCURSES_SP_ARG); + if (isDefaultColor(bg)) + bg = default_bg(NCURSES_SP_ARG); +#endif + + if (reverse) { + int xx = fg; + fg = bg; + bg = xx; + } + + TR(TRACE_ATTRS, ("setting colors: pair = %d, fg = %d, bg = %d", pair, + fg, bg)); + + if (!isDefaultColor(fg)) { + set_foreground_color(NCURSES_SP_ARGx fg, outc); + } + if (!isDefaultColor(bg)) { + set_background_color(NCURSES_SP_ARGx bg, outc); + } +#endif +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_do_color(int old_pair, int pair, int reverse, NCURSES_OUTC outc) +{ + SetSafeOutcWrapper(outc); + NCURSES_SP_NAME(_nc_do_color) (CURRENT_SCREEN, + old_pair, + pair, + reverse, + _nc_outc_wrapper); +} +#endif + +#if NCURSES_EXT_COLORS && NCURSES_EXT_FUNCS +NCURSES_EXPORT(int) +NCURSES_SP_NAME(init_extended_pair) (NCURSES_SP_DCLx int pair, int f, int b) +{ + return _nc_init_pair(SP_PARM, pair, f, b); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(init_extended_color) (NCURSES_SP_DCLx + int color, + int r, int g, int b) +{ + return _nc_init_color(SP_PARM, color, r, g, b); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(extended_color_content) (NCURSES_SP_DCLx + int color, + int *r, int *g, int *b) +{ + return _nc_color_content(SP_PARM, color, r, g, b); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(extended_pair_content) (NCURSES_SP_DCLx + int pair, + int *f, int *b) +{ + return _nc_pair_content(SP_PARM, pair, f, b); +} + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(reset_color_pairs) (NCURSES_SP_DCL0) +{ + if (SP_PARM != 0) { + if (SP_PARM->_color_pairs) { + _nc_free_ordered_pairs(SP_PARM); + free(SP_PARM->_color_pairs); + SP_PARM->_color_pairs = 0; + SP_PARM->_pair_alloc = 0; + ReservePairs(SP_PARM, 16); + clearok(CurScreen(SP_PARM), TRUE); + touchwin(StdScreen(SP_PARM)); + } + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +init_extended_pair(int pair, int f, int b) +{ + return NCURSES_SP_NAME(init_extended_pair) (CURRENT_SCREEN, pair, f, b); +} + +NCURSES_EXPORT(int) +init_extended_color(int color, int r, int g, int b) +{ + return NCURSES_SP_NAME(init_extended_color) (CURRENT_SCREEN, + color, + r, g, b); +} + +NCURSES_EXPORT(int) +extended_color_content(int color, int *r, int *g, int *b) +{ + return NCURSES_SP_NAME(extended_color_content) (CURRENT_SCREEN, + color, + r, g, b); +} + +NCURSES_EXPORT(int) +extended_pair_content(int pair, int *f, int *b) +{ + return NCURSES_SP_NAME(extended_pair_content) (CURRENT_SCREEN, pair, f, b); +} + +NCURSES_EXPORT(void) +reset_color_pairs(void) +{ + NCURSES_SP_NAME(reset_color_pairs) (CURRENT_SCREEN); +} +#endif /* NCURSES_SP_FUNCS */ +#endif /* NCURSES_EXT_COLORS */ diff --git a/contrib/ncurses/ncurses/base/lib_colorset.c b/contrib/ncurses/ncurses/base/lib_colorset.c new file mode 100644 index 00000000..387edef6 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_colorset.c @@ -0,0 +1,65 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1998 * + * and: Thomas E. Dickey, 2005-on * + ****************************************************************************/ + +/* +** lib_colorset.c +** +** The routine wcolor_set(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_colorset.c,v 1.16 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wcolor_set(WINDOW *win, NCURSES_PAIRS_T pair_arg, void *opts) +{ + int code = ERR; + int color_pair = pair_arg; + + T((T_CALLED("wcolor_set(%p,%d)"), (void *) win, color_pair)); + set_extended_pair(opts, color_pair); + if (win + && (SP != 0) + && (color_pair >= 0) + && (color_pair < SP->_pair_limit)) { + TR(TRACE_ATTRS, ("... current %ld", (long) GET_WINDOW_PAIR(win))); + SET_WINDOW_PAIR(win, color_pair); + if_EXT_COLORS(win->_color = color_pair); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_delch.c b/contrib/ncurses/ncurses/base/lib_delch.c new file mode 100644 index 00000000..a24cb677 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_delch.c @@ -0,0 +1,70 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2001,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_delch.c +** +** The routine wdelch(). +** +*/ + +#include + +MODULE_ID("$Id: lib_delch.c,v 1.16 2024/10/19 21:20:46 tom Exp $") + +NCURSES_EXPORT(int) +wdelch(WINDOW *win) +{ + int code = ERR; + + T((T_CALLED("wdelch(%p)"), (void *) win)); + + if (win) { + NCURSES_CH_T blank = win->_nc_bkgd; + struct ldat *line = &(win->_line[win->_cury]); + NCURSES_CH_T *end = &(line->text[win->_maxx]); + NCURSES_CH_T *temp1 = &(line->text[win->_curx]); + const NCURSES_CH_T *temp2 = temp1 + 1; + + CHANGED_TO_EOL(line, win->_curx, win->_maxx); + while (temp1 < end) + *temp1++ = *temp2++; + + *temp1 = blank; + + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_delwin.c b/contrib/ncurses/ncurses/base/lib_delwin.c new file mode 100644 index 00000000..28b4c806 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_delwin.c @@ -0,0 +1,103 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2008,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2008 * + ****************************************************************************/ + +/* +** lib_delwin.c +** +** The routine delwin(). +** +*/ + +#include + +MODULE_ID("$Id: lib_delwin.c,v 1.28 2024/07/27 18:57:35 tom Exp $") + +static bool +cannot_delete(const WINDOW *win) +{ + bool result = TRUE; + bool found = FALSE; + SCREEN *scan; + WINDOWLIST *p; + + for (each_screen(scan)) { + for (each_window(scan, p)) { + if (&(p->win) == win) { + result = FALSE; + found = TRUE; + break; + } else if (IS_SUBWIN(&(p->win)) + && p->win._parent == win) { + result = TRUE; + found = TRUE; + break; + } + } + if (found) + break; + } + return result; +} + +NCURSES_EXPORT(int) +delwin(WINDOW *win) +{ + int result = ERR; + + T((T_CALLED("delwin(%p)"), (void *) win)); + + if (_nc_try_global(curses) == 0) { + if (win == 0 + || cannot_delete(win)) { + result = ERR; + } else if (IS_PAD(win)) { + win->_parent = NULL; + result = _nc_freewin(win); + } else { +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(win); +#endif + if (IS_SUBWIN(win)) { + touchwin(win->_parent); + } else if (CurScreen(SP_PARM) != 0) { + touchwin(CurScreen(SP_PARM)); + } + result = _nc_freewin(win); + } + _nc_unlock_global(curses); + } + returnCode(result); +} diff --git a/contrib/ncurses/ncurses/base/lib_dft_fgbg.c b/contrib/ncurses/ncurses/base/lib_dft_fgbg.c new file mode 100644 index 00000000..4dd43bb1 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_dft_fgbg.c @@ -0,0 +1,104 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998-on * + * Juergen Pfeifer 2009 * + ****************************************************************************/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_dft_fgbg.c,v 1.31 2021/04/03 22:27:18 tom Exp $") + +/* + * Modify the behavior of color-pair 0 so that the library doesn't assume that + * it is white on black. This is an extension to XSI curses. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(use_default_colors) (NCURSES_SP_DCL0) +{ + T((T_CALLED("use_default_colors(%p)"), (void *) SP_PARM)); + returnCode(NCURSES_SP_NAME(assume_default_colors) (NCURSES_SP_ARGx -1, -1)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +use_default_colors(void) +{ + return NCURSES_SP_NAME(use_default_colors) (CURRENT_SCREEN); +} +#endif + +/* + * Modify the behavior of color-pair 0 so that the library assumes that it + * is something specific, possibly not white on black. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(assume_default_colors) (NCURSES_SP_DCLx int fg, int bg) +{ + int code = ERR; + + T((T_CALLED("assume_default_colors(%p,%d,%d)"), (void *) SP_PARM, fg, bg)); + if (SP_PARM != 0) { +#ifdef USE_TERM_DRIVER + code = CallDriver_2(SP_PARM, td_defaultcolors, fg, bg); +#else + if ((orig_pair || orig_colors) && !initialize_pair) { + + SP_PARM->_default_color = isDefaultColor(fg) || isDefaultColor(bg); + SP_PARM->_has_sgr_39_49 = (tigetflag("AX") == TRUE); + SP_PARM->_default_fg = isDefaultColor(fg) ? COLOR_DEFAULT : fg; + SP_PARM->_default_bg = isDefaultColor(bg) ? COLOR_DEFAULT : bg; + if (SP_PARM->_color_pairs != 0) { + bool save = SP_PARM->_default_color; + SP_PARM->_assumed_color = TRUE; + SP_PARM->_default_color = TRUE; + NCURSES_SP_NAME(init_pair) (NCURSES_SP_ARGx 0, + (short)fg, + (short)bg); + SP_PARM->_default_color = save; + } + code = OK; + } +#endif + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +assume_default_colors(int fg, int bg) +{ + return NCURSES_SP_NAME(assume_default_colors) (CURRENT_SCREEN, fg, bg); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_driver.c b/contrib/ncurses/ncurses/base/lib_driver.c new file mode 100644 index 00000000..c53802f3 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_driver.c @@ -0,0 +1,148 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2009-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_driver.c,v 1.9 2020/08/29 19:53:35 tom Exp $") + +#ifndef EXP_WIN32_DRIVER +typedef struct DriverEntry { + const char *name; + TERM_DRIVER *driver; +} DRIVER_ENTRY; + +static DRIVER_ENTRY DriverTable[] = +{ +#ifdef _WIN32 + {"win32console", &_nc_WIN_DRIVER}, +#endif + {"tinfo", &_nc_TINFO_DRIVER} /* must be last */ +}; + +NCURSES_EXPORT(int) +_nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB, const char *name, int *errret) +{ + int code = ERR; + size_t i; + TERM_DRIVER *res = (TERM_DRIVER *) 0; + TERM_DRIVER *use = 0; + + T((T_CALLED("_nc_get_driver(%p, %s, %p)"), + (void *) TCB, NonNull(name), (void *) errret)); + + assert(TCB != 0); + + for (i = 0; i < SIZEOF(DriverTable); i++) { + res = DriverTable[i].driver; + if (strcmp(DriverTable[i].name, res->td_name(TCB)) == 0) { + if (res->td_CanHandle(TCB, name, errret)) { + use = res; + break; + } + } + } + if (use != 0) { + TCB->drv = use; + code = OK; + } + returnCode(code); +} +#endif /* !EXP_WIN32_DRIVER */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(has_key) (SCREEN *sp, int keycode) +{ + T((T_CALLED("has_key(%p, %d)"), (void *) sp, keycode)); + returnCode(IsValidTIScreen(sp) ? CallDriver_1(sp, td_kyExist, keycode) : FALSE); +} + +NCURSES_EXPORT(int) +has_key(int keycode) +{ + return NCURSES_SP_NAME(has_key) (CURRENT_SCREEN, keycode); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_mcprint) (SCREEN *sp, char *data, int len) +{ + int code = ERR; + + if (0 != TerminalOf(sp)) + code = CallDriver_2(sp, td_print, data, len); + return (code); +} + +NCURSES_EXPORT(int) +mcprint(char *data, int len) +{ + return NCURSES_SP_NAME(_nc_mcprint) (CURRENT_SCREEN, data, len); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(doupdate) (SCREEN *sp) +{ + int code = ERR; + + T((T_CALLED("doupdate(%p)"), (void *) sp)); + + if (IsValidScreen(sp)) + code = CallDriver(sp, td_update); + + returnCode(code); +} + +NCURSES_EXPORT(int) +doupdate(void) +{ + return NCURSES_SP_NAME(doupdate) (CURRENT_SCREEN); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(mvcur) (SCREEN *sp, int yold, int xold, int ynew, int xnew) +{ + int code = ERR; + TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("mvcur(%p,%d,%d,%d,%d)"), + (void *) sp, yold, xold, ynew, xnew)); + if (HasTerminal(sp)) { + code = CallDriver_4(sp, td_hwcur, yold, xold, ynew, xnew); + } + returnCode(code); +} + +NCURSES_EXPORT(int) +mvcur(int yold, int xold, int ynew, int xnew) +/* optimized cursor move from (yold, xold) to (ynew, xnew) */ +{ + return NCURSES_SP_NAME(mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew); +} diff --git a/contrib/ncurses/ncurses/base/lib_echo.c b/contrib/ncurses/ncurses/base/lib_echo.c new file mode 100644 index 00000000..de7832f4 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_echo.c @@ -0,0 +1,84 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * echo.c + * + * Routines: + * echo() + * noecho() + * + */ + +#include + +MODULE_ID("$Id: lib_echo.c,v 1.10 2023/04/29 18:57:12 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(echo) (NCURSES_SP_DCL0) +{ + T((T_CALLED("echo(%p)"), (void *) SP_PARM)); + if (0 == SP_PARM) + returnCode(ERR); + IsEcho(SP_PARM) = TRUE; + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +echo(void) +{ + return NCURSES_SP_NAME(echo) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(noecho) (NCURSES_SP_DCL0) +{ + T((T_CALLED("noecho(%p)"), (void *) SP_PARM)); + if (0 == SP_PARM) + returnCode(ERR); + IsEcho(SP_PARM) = FALSE; + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +noecho(void) +{ + return NCURSES_SP_NAME(noecho) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_endwin.c b/contrib/ncurses/ncurses/base/lib_endwin.c new file mode 100644 index 00000000..85d2bdba --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_endwin.c @@ -0,0 +1,84 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_endwin.c +** +** The routine endwin(). +** +*/ + +#include + +MODULE_ID("$Id: lib_endwin.c,v 1.28 2023/11/11 21:27:32 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(endwin) (NCURSES_SP_DCL0) +{ + int code = ERR; + + T((T_CALLED("endwin(%p)"), (void *) SP_PARM)); + + if (SP_PARM != NULL) { + if (SP_PARM->_endwin != ewSuspend) { +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB = TCBOf(SP_PARM); + + SP_PARM->_endwin = ewSuspend; + if (TCB && TCB->drv && TCB->drv->td_scexit) + TCB->drv->td_scexit(SP_PARM); +#else + SP_PARM->_endwin = ewSuspend; + SP_PARM->_mouse_wrap(SP_PARM); + _nc_screen_wrap(); + _nc_mvcur_wrap(); /* wrap up cursor addressing */ +#endif + code = OK; + } + if (NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_ARG) == ERR) + code = ERR; + } + + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +endwin(void) +{ + return NCURSES_SP_NAME(endwin) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_erase.c b/contrib/ncurses/ncurses/base/lib_erase.c new file mode 100644 index 00000000..aa9437a1 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_erase.c @@ -0,0 +1,97 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2009,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_erase.c +** +** The routine werase(). +** +*/ + +#include + +MODULE_ID("$Id: lib_erase.c,v 1.20 2022/09/03 21:40:27 tom Exp $") + +NCURSES_EXPORT(int) +werase(WINDOW *win) +{ + int code = ERR; + NCURSES_CH_T *start; + + T((T_CALLED("werase(%p)"), (void *) win)); + + if (win) { + NCURSES_CH_T blank; + NCURSES_CH_T *sp; + int y; + + blank = win->_nc_bkgd; + for (y = 0; y <= win->_maxy; y++) { + NCURSES_CH_T *end; + + start = win->_line[y].text; + end = &start[win->_maxx]; + + /* + * If this is a derived window, we have to handle the case where + * a multicolumn character extends into the window that we are + * erasing. + */ + if_WIDEC({ + if (isWidecExt(start[0])) { + int x = (win->_parent != 0) ? (win->_begx) : 0; + while (x-- > 0) { + if (isWidecBase(start[-1])) { + --start; + break; + } + --start; + } + } + }); + + for (sp = start; sp <= end; sp++) + *sp = blank; + + win->_line[y].firstchar = 0; + win->_line[y].lastchar = win->_maxx; + } + win->_curx = win->_cury = 0; + win->_flags &= ~_WRAPPED; + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_flash.c b/contrib/ncurses/ncurses/base/lib_flash.c new file mode 100644 index 00000000..975d5f56 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_flash.c @@ -0,0 +1,88 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2013,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * flash.c + * + * The routine flash(). + * + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_flash.c,v 1.15 2020/02/02 23:34:34 tom Exp $") + +/* + * flash() + * + * Flash the current terminal's screen if possible. If not, + * sound the audible bell if one exists. + * + */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(flash) (NCURSES_SP_DCL0) +{ + int res = ERR; + + T((T_CALLED("flash(%p)"), (void *) SP_PARM)); +#ifdef USE_TERM_DRIVER + if (SP_PARM != 0) + res = CallDriver_1(SP_PARM, td_doBeepOrFlash, FALSE); +#else + if (HasTerminal(SP_PARM)) { + /* FIXME: should make sure that we are not in altchar mode */ + if (flash_screen) { + res = NCURSES_PUTP2_FLUSH("flash_screen", flash_screen); + } else if (bell) { + res = NCURSES_PUTP2_FLUSH("bell", bell); + } + } +#endif + returnCode(res); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +flash(void) +{ + return NCURSES_SP_NAME(flash) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_freeall.c b/contrib/ncurses/ncurses/base/lib_freeall.c new file mode 100644 index 00000000..0a3ee125 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_freeall.c @@ -0,0 +1,201 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +#include +#include + +#if HAVE_NC_FREEALL + +#if HAVE_LIBDBMALLOC +extern int malloc_errfd; /* FIXME */ +#endif + +MODULE_ID("$Id: lib_freeall.c,v 1.77 2024/07/27 19:22:23 tom Exp $") + +/* + * Free all ncurses data. This is used for testing only (there's no practical + * use for it as an extension). + */ +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_DCL0) +{ + static va_list empty_va; + + T((T_CALLED("_nc_freeall()"))); +#if NO_LEAKS + _nc_globals.leak_checking = TRUE; + if (SP_PARM != 0) { + if (SP_PARM->_oldnum_list != 0) { + FreeAndNull(SP_PARM->_oldnum_list); + } + if (SP_PARM->_panelHook.destroy != 0) { + SP_PARM->_panelHook.destroy(SP_PARM->_panelHook.stdscr_pseudo_panel); + } +#if NCURSES_EXT_COLORS + _nc_new_pair_leaks(SP_PARM); +#endif + } +#endif + if (SP_PARM != 0) { + _nc_lock_global(curses); + + while (WindowList(SP_PARM) != 0) { + WINDOWLIST *p, *q; + bool deleted = FALSE; + + /* Delete only windows that're not a parent */ + for (each_window(SP_PARM, p)) { + WINDOW *p_win = &(p->win); + bool found = FALSE; + + if (IS_PAD(p_win)) + continue; + +#ifndef USE_SP_WINDOWLIST + if (p->screen != SP_PARM) + continue; +#endif + + for (each_window(SP_PARM, q)) { + const WINDOW *q_win = &(q->win); + +#ifndef USE_SP_WINDOWLIST + if (q->screen != SP_PARM) + continue; +#endif + + if ((p != q) + && IS_SUBWIN(q_win) + && (p_win == q_win->_parent)) { + found = TRUE; + break; + } + } + + if (!found) { + if (delwin(p_win) != ERR) + deleted = TRUE; + break; + } + } + + /* + * Don't continue to loop if the list is trashed. + */ + if (!deleted) + break; + } + delscreen(SP_PARM); + _nc_unlock_global(curses); + } + + (void) _nc_printf_string(0, empty_va); +#ifdef TRACE + (void) _nc_trace_buf(-1, (size_t) 0); +#endif +#if USE_WIDEC_SUPPORT + FreeIfNeeded(_nc_wacs); +#endif + _nc_leaks_tinfo(); + +#if HAVE_LIBDBMALLOC + malloc_dump(malloc_errfd); +#elif HAVE_LIBDMALLOC +#elif HAVE_LIBMPATROL + __mp_summary(); +#elif HAVE_PURIFY + purify_all_inuse(); +#endif + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_freeall(void) +{ + NCURSES_SP_NAME(_nc_freeall) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code) +{ + T((T_CALLED("_nc_free_and_exit(%d)"), code)); + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + NCURSES_SP_NAME(_nc_freeall) (NCURSES_SP_ARG); +#ifdef TRACE + curses_trace(0); /* close trace file, freeing its setbuf */ + { + static va_list fake; + free(_nc_varargs("?", fake)); + } +#endif + exit(code); +} + +#else /* !HAVE_NC_FREEALL */ +NCURSES_EXPORT(void) +_nc_freeall(void) +{ +} + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_free_and_exit) (NCURSES_SP_DCLx int code) +{ + if (SP_PARM) { + delscreen(SP_PARM); + } + exit(code); +} +#endif /* HAVE_NC_FREEALL */ + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_free_and_exit(int code) +{ + NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code); +} +#endif + +NCURSES_EXPORT(void) +exit_curses(int code) +{ +#if NO_LEAKS +#if NCURSES_SP_FUNCS + NCURSES_SP_NAME(_nc_free_and_exit) (CURRENT_SCREEN, code); +#else + _nc_free_and_exit(code); /* deprecated... */ +#endif +#endif + exit(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_getch.c b/contrib/ncurses/ncurses/base/lib_getch.c new file mode 100644 index 00000000..3d9a0674 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_getch.c @@ -0,0 +1,802 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_getch.c +** +** The routine getch(). +** +*/ + +#define NEED_KEY_EVENT +#include + +MODULE_ID("$Id: lib_getch.c,v 1.147 2024/08/31 15:54:49 tom Exp $") + +#include + +#if USE_REENTRANT +#define GetEscdelay(sp) *_nc_ptr_Escdelay(sp) +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(ESCDELAY) (void) +{ + return *(_nc_ptr_Escdelay(CURRENT_SCREEN)); +} + +NCURSES_EXPORT(int *) +_nc_ptr_Escdelay(SCREEN *sp) +{ + return ptrEscdelay(sp); +} +#else +#define GetEscdelay(sp) ESCDELAY +NCURSES_EXPORT_VAR(int) ESCDELAY = 1000; +#endif + +#if NCURSES_EXT_FUNCS +NCURSES_EXPORT(int) +NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value) +{ + int code = OK; + if (value < 0) { + code = ERR; + } else { +#if USE_REENTRANT + if (SP_PARM) { + SET_ESCDELAY(value); + } else { + code = ERR; + } +#else + (void) SP_PARM; + ESCDELAY = value; +#endif + } + return code; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +set_escdelay(int value) +{ + int code; + if (value < 0) { + code = ERR; + } else { +#if USE_REENTRANT + code = NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value); +#else + ESCDELAY = value; + code = OK; +#endif + } + return code; +} +#endif +#endif /* NCURSES_EXT_FUNCS */ + +#if NCURSES_EXT_FUNCS +NCURSES_EXPORT(int) +NCURSES_SP_NAME(get_escdelay) (NCURSES_SP_DCL0) +{ +#if !USE_REENTRANT + (void) SP_PARM; +#endif + return GetEscdelay(SP_PARM); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +get_escdelay(void) +{ + return NCURSES_SP_NAME(get_escdelay) (CURRENT_SCREEN); +} +#endif +#endif /* NCURSES_EXT_FUNCS */ + +static int +_nc_use_meta(WINDOW *win) +{ + SCREEN *sp = _nc_screen_of(win); + return (sp ? sp->_use_meta : 0); +} + +#ifdef USE_TERM_DRIVER +# if defined(_NC_WINDOWS_NATIVE) && !defined(EXP_WIN32_DRIVER) +static HANDLE +_nc_get_handle(int fd) +{ + intptr_t value = _get_osfhandle(fd); + return (HANDLE) value; +} +# endif +#endif + +/* + * Check for mouse activity, returning nonzero if we find any. + */ +static int +check_mouse_activity(SCREEN *sp, int delay EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc; + +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp); + rc = TCBOf(sp)->drv->td_testmouse(TCBOf(sp), delay EVENTLIST_2nd(evl)); +# if defined(EXP_WIN32_DRIVER) + /* if we emulate terminfo on console, we have to use the console routine */ + if (IsTermInfoOnConsole(sp)) { + rc = _nc_console_testmouse(sp, + _nc_console_handle(sp->_ifd), + delay EVENTLIST_2nd(evl)); + } else +# elif defined(_NC_WINDOWS_NATIVE) + /* if we emulate terminfo on console, we have to use the console routine */ + if (IsTermInfoOnConsole(sp)) { + HANDLE fd = _nc_get_handle(sp->_ifd); + rc = _nc_mingw_testmouse(sp, fd, delay EVENTLIST_2nd(evl)); + } else +# endif + rc = TCB->drv->td_testmouse(TCB, delay EVENTLIST_2nd(evl)); +#else /* !USE_TERM_DRIVER */ +# if USE_SYSMOUSE + if ((sp->_mouse_type == M_SYSMOUSE) + && (sp->_sysmouse_head < sp->_sysmouse_tail)) { + rc = TW_MOUSE; + } else +# endif + { +# if defined(EXP_WIN32_DRIVER) + rc = _nc_console_testmouse(sp, + _nc_console_handle(sp->_ifd), + delay + EVENTLIST_2nd(evl)); +# else + rc = _nc_timed_wait(sp, + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); +# endif +# if USE_SYSMOUSE + if ((sp->_mouse_type == M_SYSMOUSE) + && (sp->_sysmouse_head < sp->_sysmouse_tail) + && (rc == 0) + && (errno == EINTR)) { + rc |= TW_MOUSE; + } +# endif + } +#endif /* USE_TERM_DRIVER */ + return rc; +} + +static NCURSES_INLINE int +fifo_peek(SCREEN *sp) +{ + int ch = (peek >= 0) ? sp->_fifo[peek] : ERR; + TR(TRACE_IEVENT, ("peeking at %d", peek)); + + p_inc(); + return ch; +} + +static NCURSES_INLINE int +fifo_pull(SCREEN *sp) +{ + int ch = (head >= 0) ? sp->_fifo[head] : ERR; + + TR(TRACE_IEVENT, ("pulling %s from %d", _nc_tracechar(sp, ch), head)); + + if (peek == head) { + h_inc(); + peek = head; + } else { + h_inc(); + } + +#ifdef TRACE + if (USE_TRACEF(TRACE_IEVENT)) { + _nc_fifo_dump(sp); + _nc_unlock_global(tracef); + } +#endif + return ch; +} + +static NCURSES_INLINE int +fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int n; + int ch = 0; + int mask = 0; + + (void) mask; + if (tail < 0) + return ERR; + +#ifdef NCURSES_WGETCH_EVENTS + if (evl +#if USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE + || (sp->_mouse_fd >= 0) +#endif + ) { + mask = check_mouse_activity(sp, -1 EVENTLIST_2nd(evl)); + } else + mask = 0; + + if (mask & TW_EVENT) { + T(("fifo_push: ungetch KEY_EVENT")); + safe_ungetch(sp, KEY_EVENT); + return KEY_EVENT; + } +#elif USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE + if (sp->_mouse_fd >= 0) { + mask = check_mouse_activity(sp, -1 EVENTLIST_2nd(evl)); + } +#endif + +#if USE_GPM_SUPPORT || USE_EMX_MOUSE + if ((sp->_mouse_fd >= 0) && (mask & TW_MOUSE)) { + sp->_mouse_event(sp); + ch = KEY_MOUSE; + n = 1; + } else +#endif +#if USE_SYSMOUSE + if ((sp->_mouse_type == M_SYSMOUSE) + && (sp->_sysmouse_head < sp->_sysmouse_tail)) { + sp->_mouse_event(sp); + ch = KEY_MOUSE; + n = 1; + } else if ((sp->_mouse_type == M_SYSMOUSE) + && (mask <= 0) && errno == EINTR) { + sp->_mouse_event(sp); + ch = KEY_MOUSE; + n = 1; + } else +#endif +#ifdef USE_TERM_DRIVER + if ((sp->_mouse_type == M_TERM_DRIVER) + && (sp->_drv_mouse_head < sp->_drv_mouse_tail)) { + sp->_mouse_event(sp); + ch = KEY_MOUSE; + n = 1; + } else +#endif +#if USE_KLIBC_KBD + if (NC_ISATTY(sp->_ifd) && IsCbreak(sp)) { + ch = _read_kbd(0, 1, !IsRaw(sp)); + n = (ch == -1) ? -1 : 1; + sp->_extended_key = (ch == 0); + } else +#endif + { /* Can block... */ +#if defined(USE_TERM_DRIVER) + int buf; +# if defined(EXP_WIN32_DRIVER) + if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && IsCbreak(sp)) { + _nc_set_read_thread(TRUE); + n = _nc_console_read(sp, + _nc_console_handle(sp->_ifd), + &buf); + _nc_set_read_thread(FALSE); + } else +# elif defined(_NC_WINDOWS_NATIVE) + if (NC_ISATTY(sp->_ifd) && IsTermInfoOnConsole(sp) && IsCbreak(sp)) + n = _nc_mingw_console_read(sp, + _nc_get_handle(sp->_ifd), + &buf); + else +# endif /* EXP_WIN32_DRIVER */ + n = CallDriver_1(sp, td_read, &buf); + ch = buf; +#else /* !USE_TERM_DRIVER */ +#if defined(EXP_WIN32_DRIVER) + int buf; +#endif + unsigned char c2 = 0; + + _nc_set_read_thread(TRUE); +#if defined(EXP_WIN32_DRIVER) + n = _nc_console_read(sp, + _nc_console_handle(sp->_ifd), + &buf); + c2 = buf; +#else + n = (int) read(sp->_ifd, &c2, (size_t) 1); +#endif + _nc_set_read_thread(FALSE); + ch = c2; +#endif /* USE_TERM_DRIVER */ + } + + if ((n == -1) || (n == 0)) { + TR(TRACE_IEVENT, ("read(%d,&ch,1)=%d, errno=%d", sp->_ifd, n, errno)); + ch = ERR; + } + TR(TRACE_IEVENT, ("read %d characters", n)); + + sp->_fifo[tail] = ch; + sp->_fifohold = 0; + if (head == -1) + head = peek = tail; + t_inc(); + TR(TRACE_IEVENT, ("pushed %s at %d", _nc_tracechar(sp, ch), tail)); +#ifdef TRACE + if (USE_TRACEF(TRACE_IEVENT)) { + _nc_fifo_dump(sp); + _nc_unlock_global(tracef); + } +#endif + return ch; +} + +static NCURSES_INLINE void +fifo_clear(SCREEN *sp) +{ + memset(sp->_fifo, 0, sizeof(sp->_fifo)); + head = -1; + tail = peek = 0; +} + +static int kgetch(SCREEN *, bool EVENTLIST_2nd(_nc_eventlist *)); + +static void +recur_wrefresh(WINDOW *win) +{ +#ifdef USE_PTHREADS + SCREEN *sp = _nc_screen_of(win); + bool same_sp; + + if (_nc_use_pthreads) { + _nc_lock_global(curses); + same_sp = (sp == CURRENT_SCREEN); + _nc_unlock_global(curses); + } else { + same_sp = (sp == CURRENT_SCREEN); + } + + if (_nc_use_pthreads && !same_sp) { + SCREEN *save_SP; + + /* temporarily switch to the window's screen to check/refresh */ + _nc_lock_global(curses); + save_SP = CURRENT_SCREEN; + _nc_set_screen(sp); + recur_wrefresh(win); + _nc_set_screen(save_SP); + _nc_unlock_global(curses); + } else +#endif + if ((is_wintouched(win) || (win->_flags & _HASMOVED)) + && !IS_PAD(win)) { + wrefresh(win); + } +} + +static int +recur_wgetnstr(WINDOW *win, char *buf) +{ + SCREEN *sp = _nc_screen_of(win); + int rc; + + if (sp != 0) { +#ifdef USE_PTHREADS + if (_nc_use_pthreads && sp != CURRENT_SCREEN) { + SCREEN *save_SP; + + /* temporarily switch to the window's screen to get cooked input */ + _nc_lock_global(curses); + save_SP = CURRENT_SCREEN; + _nc_set_screen(sp); + rc = recur_wgetnstr(win, buf); + _nc_set_screen(save_SP); + _nc_unlock_global(curses); + } else +#endif + { + sp->_called_wgetch = TRUE; + rc = wgetnstr(win, buf, MAXCOLUMNS); + sp->_called_wgetch = FALSE; + } + } else { + rc = ERR; + } + return rc; +} + +NCURSES_EXPORT(int) +_nc_wgetch(WINDOW *win, + int *result, + int use_meta + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + SCREEN *sp; + int ch; + int rc = 0; +#ifdef NCURSES_WGETCH_EVENTS + int event_delay = -1; +#endif + + T((T_CALLED("_nc_wgetch(%p)"), (void *) win)); + + *result = 0; + + sp = _nc_screen_of(win); + if (win == 0 || sp == 0) { + returnCode(ERR); + } + + if (cooked_key_in_fifo()) { + recur_wrefresh(win); + *result = fifo_pull(sp); + returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); + } +#ifdef NCURSES_WGETCH_EVENTS + if (evl && (evl->count == 0)) + evl = NULL; + event_delay = _nc_eventlist_timeout(evl); +#endif + + /* + * Handle cooked mode. Grab a string from the screen, + * stuff its contents in the FIFO queue, and pop off + * the first character to return it. + */ + if (head == -1 && + !sp->_notty && + !IsRaw(sp) && + !IsCbreak(sp) && + !sp->_called_wgetch) { + char buf[MAXCOLUMNS], *bufp; + + TR(TRACE_IEVENT, ("filling queue in cooked mode")); + + /* ungetch in reverse order */ +#ifdef NCURSES_WGETCH_EVENTS + rc = recur_wgetnstr(win, buf); + if (rc != KEY_EVENT && rc != ERR) + safe_ungetch(sp, '\n'); +#else + if (recur_wgetnstr(win, buf) != ERR) + safe_ungetch(sp, '\n'); +#endif + for (bufp = buf + strlen(buf); bufp > buf; bufp--) + safe_ungetch(sp, bufp[-1]); + +#ifdef NCURSES_WGETCH_EVENTS + /* Return it first */ + if (rc == KEY_EVENT) { + *result = rc; + } else +#endif + *result = fifo_pull(sp); + returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); + } + + if (win->_use_keypad != sp->_keypad_on) + _nc_keypad(sp, win->_use_keypad); + + recur_wrefresh(win); + + if (win->_notimeout || (win->_delay >= 0) || (IsCbreak(sp) > 1)) { + if (head == -1) { /* fifo is empty */ + int delay; + + TR(TRACE_IEVENT, ("timed delay in wgetch()")); + if (IsCbreak(sp) > 1) + delay = (IsCbreak(sp) - 1) * 100; + else + delay = win->_delay; + +#ifdef NCURSES_WGETCH_EVENTS + if (event_delay >= 0 && delay > event_delay) + delay = event_delay; +#endif + + TR(TRACE_IEVENT, ("delay is %d milliseconds", delay)); + + rc = check_mouse_activity(sp, delay EVENTLIST_2nd(evl)); + +#ifdef NCURSES_WGETCH_EVENTS + if (rc & TW_EVENT) { + *result = KEY_EVENT; + returnCode(KEY_CODE_YES); + } +#endif + if (!rc) { + goto check_sigwinch; + } + } + /* else go on to read data available */ + } + + if (win->_use_keypad) { + /* + * This is tricky. We only want to get special-key + * events one at a time. But we want to accumulate + * mouse events until either (a) the mouse logic tells + * us it has picked up a complete gesture, or (b) + * there's a detectable time lapse after one. + * + * Note: if the mouse code starts failing to compose + * press/release events into clicks, you should probably + * increase the wait with mouseinterval(). + */ + int runcount = 0; + + do { + ch = kgetch(sp, win->_notimeout EVENTLIST_2nd(evl)); + if (ch == KEY_MOUSE) { + ++runcount; + if (sp->_mouse_inline(sp)) + break; + } + if (sp->_maxclick < 0) + break; + } while + (ch == KEY_MOUSE + && (((rc = check_mouse_activity(sp, sp->_maxclick + EVENTLIST_2nd(evl))) != 0 + && !(rc & TW_EVENT)) + || !sp->_mouse_parse(sp, runcount))); +#ifdef NCURSES_WGETCH_EVENTS + if ((rc & TW_EVENT) && !(ch == KEY_EVENT)) { + safe_ungetch(sp, ch); + ch = KEY_EVENT; + } +#endif + if (runcount > 0 && ch != KEY_MOUSE) { +#ifdef NCURSES_WGETCH_EVENTS + /* mouse event sequence ended by an event, report event */ + if (ch == KEY_EVENT) { + safe_ungetch(sp, KEY_MOUSE); /* FIXME This interrupts a gesture... */ + } else +#endif + { + /* mouse event sequence ended by keystroke, store keystroke */ + safe_ungetch(sp, ch); + ch = KEY_MOUSE; + } + } + } else { + if (head == -1) + fifo_push(sp EVENTLIST_2nd(evl)); + ch = fifo_pull(sp); + } + + if (ch == ERR) { + check_sigwinch: +#if USE_SIZECHANGE + if (_nc_handle_sigwinch(sp)) { + _nc_update_screensize(sp); + /* resizeterm can push KEY_RESIZE */ + if (cooked_key_in_fifo()) { + *result = fifo_pull(sp); + /* + * Get the ERR from queue -- it is from WINCH, + * so we should take it out, the "error" is handled. + */ + if (fifo_peek(sp) == -1) + fifo_pull(sp); + returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK); + } + } +#endif + returnCode(ERR); + } + + /* + * If echo() is in effect, display the printable version of the + * key on the screen. Carriage return and backspace are treated + * specially by Solaris curses: + * + * If carriage return is defined as a function key in the + * terminfo, e.g., kent, then Solaris may return either ^J (or ^M + * if nonl() is set) or KEY_ENTER depending on the echo() mode. + * We echo before translating carriage return based on nonl(), + * since the visual result simply moves the cursor to column 0. + * + * Backspace is a different matter. Solaris curses does not + * translate it to KEY_BACKSPACE if kbs=^H. This does not depend + * on the stty modes, but appears to be a hardcoded special case. + * This is a difference from ncurses, which uses the terminfo entry. + * However, we provide the same visual result as Solaris, moving the + * cursor to the left. + */ + if (IsEcho(sp) && !IS_PAD(win)) { + chtype backup = (chtype) ((ch == KEY_BACKSPACE) ? '\b' : ch); + if (backup < KEY_MIN) + wechochar(win, backup); + } + + /* + * Simulate ICRNL mode + */ + if ((ch == '\r') && IsNl(sp)) + ch = '\n'; + + /* Strip 8th-bit if so desired. We do this only for characters that + * are in the range 128-255, to provide compatibility with terminals + * that display only 7-bit characters. Note that 'ch' may be a + * function key at this point, so we mustn't strip _those_. + */ + if (!use_meta) + if ((ch < KEY_MIN) && (ch & 0x80)) + ch &= 0x7f; + + T(("wgetch returning : %s", _nc_tracechar(sp, ch))); + + *result = ch; + returnCode(ch >= KEY_MIN ? KEY_CODE_YES : OK); +} + +#ifdef NCURSES_WGETCH_EVENTS +NCURSES_EXPORT(int) +wgetch_events(WINDOW *win, _nc_eventlist * evl) +{ + int code; + int value; + + T((T_CALLED("wgetch_events(%p,%p)"), (void *) win, (void *) evl)); + code = _nc_wgetch(win, + &value, + _nc_use_meta(win) + EVENTLIST_2nd(evl)); + if (code != ERR) + code = value; + returnCode(code); +} +#endif + +NCURSES_EXPORT(int) +wgetch(WINDOW *win) +{ + int code; + int value; + + T((T_CALLED("wgetch(%p)"), (void *) win)); + code = _nc_wgetch(win, + &value, + _nc_use_meta(win) + EVENTLIST_2nd((_nc_eventlist *) 0)); + if (code != ERR) + code = value; + returnCode(code); +} + +/* +** int +** kgetch() +** +** Get an input character, but take care of keypad sequences, returning +** an appropriate code when one matches the input. After each character +** is received, set an alarm call based on ESCDELAY. If no more of the +** sequence is received by the time the alarm goes off, pass through +** the sequence gotten so far. +** +** This function must be called when there are no cooked keys in queue. +** (that is head==-1 || peek==head) +** +*/ + +static int +kgetch(SCREEN *sp, bool forever EVENTLIST_2nd(_nc_eventlist * evl)) +{ + TRIES *ptr; + int ch = 0; + int timeleft = forever ? 9999999 : GetEscdelay(sp); + + TR(TRACE_IEVENT, ("kgetch() called")); + + ptr = sp->_keytry; + + for (;;) { + if (cooked_key_in_fifo() && sp->_fifo[head] >= KEY_MIN) { + break; + } else if (!raw_key_in_fifo()) { + ch = fifo_push(sp EVENTLIST_2nd(evl)); + if (ch == ERR) { + peek = head; /* the keys stay uninterpreted */ + return ERR; + } +#ifdef NCURSES_WGETCH_EVENTS + else if (ch == KEY_EVENT) { + peek = head; /* the keys stay uninterpreted */ + return fifo_pull(sp); /* Remove KEY_EVENT from the queue */ + } +#endif + } + + ch = fifo_peek(sp); + if (ch >= KEY_MIN) { + /* If not first in queue, somebody put this key there on purpose in + * emergency. Consider it higher priority than the unfinished + * keysequence we are parsing. + */ + peek = head; + /* assume the key is the last in fifo */ + t_dec(); /* remove the key */ + return ch; + } + + TR(TRACE_IEVENT, ("ch: %s", _nc_tracechar(sp, (unsigned char) ch))); + while ((ptr != NULL) && (ptr->ch != (unsigned char) ch)) + ptr = ptr->sibling; + + if (ptr == NULL) { + TR(TRACE_IEVENT, ("ptr is null")); + break; + } + TR(TRACE_IEVENT, ("ptr=%p, ch=%d, value=%d", + (void *) ptr, ptr->ch, ptr->value)); + + if (ptr->value != 0) { /* sequence terminated */ + TR(TRACE_IEVENT, ("end of sequence")); + if (peek == tail) { + fifo_clear(sp); + } else { + head = peek; + } + return (ptr->value); + } + + ptr = ptr->child; + + if (!raw_key_in_fifo()) { + int rc; + + TR(TRACE_IEVENT, ("waiting for rest of sequence")); + rc = check_mouse_activity(sp, timeleft EVENTLIST_2nd(evl)); +#ifdef NCURSES_WGETCH_EVENTS + if (rc & TW_EVENT) { + TR(TRACE_IEVENT, ("interrupted by a user event")); + /* FIXME Should have preserved remainder timeleft for reuse... */ + peek = head; /* Restart interpreting later */ + return KEY_EVENT; + } +#endif + if (!rc) { + TR(TRACE_IEVENT, ("ran out of time")); + break; + } + } + } + ch = fifo_pull(sp); + peek = head; + return ch; +} diff --git a/contrib/ncurses/ncurses/base/lib_getstr.c b/contrib/ncurses/ncurses/base/lib_getstr.c new file mode 100644 index 00000000..6730c55d --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_getstr.c @@ -0,0 +1,221 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2011,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_getstr.c +** +** The routine wgetstr(). +** +*/ + +#define NEED_KEY_EVENT +#include + +MODULE_ID("$Id: lib_getstr.c,v 1.40 2024/07/27 19:22:23 tom Exp $") + +/* + * This wipes out the last character, no matter whether it was a tab, control + * or other character, and handles reverse wraparound. + */ +static char * +WipeOut(WINDOW *win, int y, int x, const char *first, char *last, int echoed) +{ + if (last > first) { + *--last = '\0'; + if (echoed) { + int y1 = win->_cury; + int x1 = win->_curx; + + wmove(win, y, x); + waddstr(win, first); + getyx(win, y, x); + while (win->_cury < y1 + || (win->_cury == y1 && win->_curx < x1)) + waddch(win, (chtype) ' '); + + wmove(win, y, x); + } + } + return last; +} + +NCURSES_EXPORT(int) +wgetnstr_events(WINDOW *win, + char *str, + int maxlen, + EVENTLIST_1st(_nc_eventlist * evl)) +{ + SCREEN *sp = _nc_screen_of(win); + TTY buf; + TTY_FLAGS save_flags; + char erasec; + char killc; + const char *oldstr; + int ch; + int y, x; + + T((T_CALLED("wgetnstr(%p,%p,%d)"), (void *) win, (void *) str, maxlen)); + + if (!win || !str) + returnCode(ERR); + + maxlen = _nc_getstr_limit(maxlen); + + NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_ARGx &buf); + + save_flags = sp->_tty_flags; + NCURSES_SP_NAME(nl) (NCURSES_SP_ARG); + NCURSES_SP_NAME(noecho) (NCURSES_SP_ARG); + if (!save_flags._raw) + NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG); + + erasec = NCURSES_SP_NAME(erasechar) (NCURSES_SP_ARG); + killc = NCURSES_SP_NAME(killchar) (NCURSES_SP_ARG); + + oldstr = str; + getyx(win, y, x); + + if (is_wintouched(win) || (win->_flags & _HASMOVED)) + wrefresh(win); + + while ((ch = wgetch_events(win, evl)) != ERR) { + /* + * Some terminals (the Wyse-50 is the most common) generate + * a \n from the down-arrow key. With this logic, it is the + * user's choice whether to set kcud=\n for wgetch(); + * terminating *getstr() with \n should work either way. + */ + if (ch == '\n' + || ch == '\r' + || ch == KEY_DOWN + || ch == KEY_ENTER) { + if (save_flags._echo == TRUE + && win->_cury == win->_maxy + && win->_scroll) + wechochar(win, (chtype) '\n'); + break; + } +#ifdef KEY_EVENT + if (ch == KEY_EVENT) + break; +#endif +#ifdef KEY_RESIZE + if (ch == KEY_RESIZE) + break; +#endif + if (ch == erasec || ch == KEY_LEFT || ch == KEY_BACKSPACE) { + if (str > oldstr) { + str = WipeOut(win, y, x, oldstr, str, save_flags._echo); + } + } else if (ch == killc) { + while (str > oldstr) { + str = WipeOut(win, y, x, oldstr, str, save_flags._echo); + } + } else if (ch >= KEY_MIN + || (str - oldstr >= maxlen)) { + NCURSES_SP_NAME(beep) (NCURSES_SP_ARG); + } else { + *str++ = (char) ch; + if (save_flags._echo == TRUE) { + int oldy = win->_cury; + if (waddch(win, (chtype) ch) == ERR) { + /* + * We can't really use the lower-right + * corner for input, since it'll mess + * up bookkeeping for erases. + */ + win->_flags &= ~_WRAPPED; + waddch(win, (chtype) ' '); + str = WipeOut(win, y, x, oldstr, str, save_flags._echo); + continue; + } else if (IS_WRAPPED(win)) { + /* + * If the last waddch forced a wrap & + * scroll, adjust our reference point + * for erasures. + */ + if (win->_scroll + && oldy == win->_maxy + && win->_cury == win->_maxy) { + if (--y <= 0) { + y = 0; + } + } + win->_flags &= ~_WRAPPED; + } + wrefresh(win); + } + } + } + + win->_curx = 0; + win->_flags &= ~_WRAPPED; + if (win->_cury < win->_maxy) + win->_cury++; + wrefresh(win); + + /* Restore with a single I/O call, to fix minor asymmetry between + * raw/noraw, etc. + */ + sp->_tty_flags = save_flags; + NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + + *str = '\0'; + if (ch == ERR) + returnCode(ch); + + T(("wgetnstr returns %s", _nc_visbuf(oldstr))); + +#ifdef KEY_EVENT + if (ch == KEY_EVENT) + returnCode(ch); +#endif +#ifdef KEY_RESIZE + if (ch == KEY_RESIZE) + returnCode(ch); +#endif + + returnCode(OK); +} + +#ifdef NCURSES_WGETCH_EVENTS +NCURSES_EXPORT(int) +wgetnstr(WINDOW *win, char *str, int maxlen) +{ + returnCode(wgetnstr_events(win, + str, + maxlen, + EVENTLIST_1st((_nc_eventlist *) 0))); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_hline.c b/contrib/ncurses/ncurses/base/lib_hline.c new file mode 100644 index 00000000..938c4998 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_hline.c @@ -0,0 +1,89 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Sven Verdoolaege 2001 * + ****************************************************************************/ + +/* +** lib_hline.c +** +** The routine whline(). +** +*/ + +#include + +MODULE_ID("$Id: lib_hline.c,v 1.16 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +whline(WINDOW *win, chtype ch, int n) +{ + int code = ERR; + + T((T_CALLED("whline(%p,%s,%d)"), (void *) win, _tracechtype(ch), n)); + + if (win) { + struct ldat *line = &(win->_line[win->_cury]); + NCURSES_CH_T wch; + int start = win->_curx; + int end = start + n - 1; + + if (end > win->_maxx) + end = win->_maxx; + + CHANGED_RANGE(line, start, end); + + if (ch == 0) + SetChar2(wch, ACS_HLINE); + else + SetChar2(wch, ch); + wch = _nc_render(win, wch); + +#if USE_WIDEC_SUPPORT + if (start > 0 && isWidecExt(line->text[start])) { + SetChar2(line->text[start - 1], ' '); + } + if (end < win->_maxx && isWidecExt(line->text[end + 1])) { + SetChar2(line->text[end + 1], ' '); + } +#endif + while (end >= start) { + line->text[end] = wch; + end--; + } + + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_immedok.c b/contrib/ncurses/ncurses/base/lib_immedok.c new file mode 100644 index 00000000..23afe5bd --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_immedok.c @@ -0,0 +1,55 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_immedok.c +** +** The routine immedok. +** +*/ + +#include + +MODULE_ID("$Id: lib_immedok.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(void) +immedok(WINDOW *win, bool flag) +{ + T((T_CALLED("immedok(%p,%d)"), (void *) win, flag)); + + if (win) + win->_immed = flag; + + returnVoid; +} diff --git a/contrib/ncurses/ncurses/base/lib_inchstr.c b/contrib/ncurses/ncurses/base/lib_inchstr.c new file mode 100644 index 00000000..38af2393 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_inchstr.c @@ -0,0 +1,69 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_inchstr.c +** +** The routine winchnstr(). +** +*/ + +#include + +MODULE_ID("$Id: lib_inchstr.c,v 1.17 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +winchnstr(WINDOW *win, chtype *str, int n) +{ + int i = 0; + + T((T_CALLED("winchnstr(%p,%p,%d)"), (void *) win, (void *) str, n)); + + if (!win || !str) { + i = ERR; + } else { + int row = win->_cury; + int col = win->_curx; + NCURSES_CH_T *text = win->_line[row].text; + + for (; (n < 0 || (i < n)) && (col + i <= win->_maxx); i++) { + str[i] = (((chtype) CharOf(text[col + i]) & A_CHARTEXT) | + AttrOf(text[col + i])); + } + str[i] = (chtype) 0; + } + + returnCode(i); +} diff --git a/contrib/ncurses/ncurses/base/lib_initscr.c b/contrib/ncurses/ncurses/base/lib_initscr.c new file mode 100644 index 00000000..6b914913 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_initscr.c @@ -0,0 +1,110 @@ +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_initscr.c +** +** The routines initscr(), and termname(). +** +*/ + +#include + +#if HAVE_SYS_TERMIO_H +#include /* needed for ISC */ +#endif + +MODULE_ID("$Id: lib_initscr.c,v 1.48 2020/09/07 14:26:48 tom Exp $") + +NCURSES_EXPORT(WINDOW *) +initscr(void) +{ + WINDOW *result; + + START_TRACE(); + T((T_CALLED("initscr()"))); + + _nc_init_pthreads(); + _nc_lock_global(curses); + + /* Portable applications must not call initscr() more than once */ + if (!_nc_globals.init_screen) { + const char *env; + char *name; + + _nc_globals.init_screen = TRUE; + + env = getenv("TERM"); + (void) VALID_TERM_ENV(env, "unknown"); + + if ((name = strdup(env)) == NULL) { + fprintf(stderr, "Error opening allocating $TERM.\n"); + ExitProgram(EXIT_FAILURE); + } +#ifdef __CYGWIN__ + /* + * 2002/9/21 + * Work around a bug in Cygwin. Full-screen subprocesses run from + * bash, in turn spawned from another full-screen process, will dump + * core when attempting to write to stdout. Opening /dev/tty + * explicitly seems to fix the problem. + */ + if (NC_ISATTY(fileno(stdout))) { + FILE *fp = fopen("/dev/tty", "w"); + if (fp != 0 && NC_ISATTY(fileno(fp))) { + fclose(stdout); + dup2(fileno(fp), STDOUT_FILENO); + stdout = fdopen(STDOUT_FILENO, "w"); + } + } +#endif + if (newterm(name, stdout, stdin) == 0) { + fprintf(stderr, "Error opening terminal: %s.\n", name); + ExitProgram(EXIT_FAILURE); + } + + /* def_shell_mode - done in newterm/_nc_setupscreen */ +#if NCURSES_SP_FUNCS + NCURSES_SP_NAME(def_prog_mode) (CURRENT_SCREEN); +#else + def_prog_mode(); +#endif + free(name); + } + result = stdscr; + _nc_unlock_global(curses); + + returnWin(result); +} diff --git a/contrib/ncurses/ncurses/base/lib_insch.c b/contrib/ncurses/ncurses/base/lib_insch.c new file mode 100644 index 00000000..f1ca96d3 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_insch.c @@ -0,0 +1,165 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2013,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Sven Verdoolaege * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* +** lib_insch.c +** +** The routine winsch(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_insch.c,v 1.38 2024/07/27 19:23:21 tom Exp $") + +/* + * Insert the given character, updating the current location to simplify + * inserting a string. + */ +NCURSES_EXPORT(int) +_nc_insert_ch(SCREEN *sp, WINDOW *win, chtype ch) +{ + int code = OK; + int ch8 = (int) ChCharOf(ch); + NCURSES_CH_T wch; + int count; + int tabsize = ( +#if USE_REENTRANT + sp->_TABSIZE +#else + TABSIZE +#endif + ); + + switch (ch) { + case '\t': + for (count = (tabsize - (win->_curx % tabsize)); count > 0; count--) { + if ((code = _nc_insert_ch(sp, win, ' ')) != OK) + break; + } + break; + case '\n': + case '\r': + case '\b': + SetChar2(wch, ch); + _nc_waddch_nosync(win, wch); + break; + default: + if ( +#if USE_WIDEC_SUPPORT + WINDOW_EXT(win, addch_used) == 0 && +#endif + (isprint(ch8) || + (ChAttrOf(ch) & A_ALTCHARSET) || + (sp != 0 && sp->_legacy_coding && !iscntrl(ch8)))) { + if (win->_curx <= win->_maxx) { + struct ldat *line = &(win->_line[win->_cury]); + NCURSES_CH_T *end = &(line->text[win->_curx]); + NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); + const NCURSES_CH_T *temp2 = temp1 - 1; + + SetChar2(wch, ch); + + CHANGED_TO_EOL(line, win->_curx, win->_maxx); + while (temp1 > end) + *temp1-- = *temp2--; + + *temp1 = _nc_render(win, wch); + win->_curx++; + } + } else if (iscntrl(ch8)) { + NCURSES_CONST char *s; + s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); + while (*s != '\0') { + code = _nc_insert_ch(sp, win, ChAttrOf(ch) | UChar(*s)); + if (code != OK) + break; + ++s; + } + } +#if USE_WIDEC_SUPPORT + else { + /* + * Handle multibyte characters here + */ + SetChar2(wch, ch); + wch = _nc_render(win, wch); + count = _nc_build_wch(win, &wch); + if (count > 0) { + code = _nc_insert_wch(win, &wch); + } else if (count == -1) { + NCURSES_CONST char *s; + /* handle EILSEQ */ + s = NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx (chtype) ch8); + if (strlen(s) > 1) { + while (*s != '\0') { + code = _nc_insert_ch(sp, win, + ChAttrOf(ch) | UChar(*s)); + if (code != OK) + break; + ++s; + } + } else { + code = ERR; + } + } + } +#endif + break; + } + return code; +} + +NCURSES_EXPORT(int) +winsch(WINDOW *win, chtype c) +{ + int code = ERR; + + T((T_CALLED("winsch(%p, %s)"), (void *) win, _tracechtype(c))); + + if (win != 0) { + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; + + code = _nc_insert_ch(_nc_screen_of(win), win, c); + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_insdel.c b/contrib/ncurses/ncurses/base/lib_insdel.c new file mode 100644 index 00000000..7c007397 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_insdel.c @@ -0,0 +1,64 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2003,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_insdel.c +** +** The routine winsdelln(win, n). +** positive n insert n lines above current line +** negative n delete n lines starting from current line +** +*/ + +#include + +MODULE_ID("$Id: lib_insdel.c,v 1.14 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +winsdelln(WINDOW *win, int n) +{ + int code = ERR; + + T((T_CALLED("winsdelln(%p,%d)"), (void *) win, n)); + + if (win) { + if (n != 0) { + _nc_scroll_window(win, -n, win->_cury, win->_maxy, + win->_nc_bkgd); + _nc_synchook(win); + } + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_insnstr.c b/contrib/ncurses/ncurses/base/lib_insnstr.c new file mode 100644 index 00000000..caec48e8 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_insnstr.c @@ -0,0 +1,96 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2004-2009,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* +** lib_insnstr.c +** +** The routine winsnstr(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_insnstr.c,v 1.10 2023/11/21 21:58:03 tom Exp $") + +NCURSES_EXPORT(int) +winsnstr(WINDOW *win, const char *s, int n) +{ + int code = ERR; + const unsigned char *str = (const unsigned char *) s; + + T((T_CALLED("winsnstr(%p,%s,%d)"), (void *) win, _nc_visbufn(s, n), n)); + + if (win != 0 && str != 0 && n != 0) { + SCREEN *sp = _nc_screen_of(win); +#if USE_WIDEC_SUPPORT + /* + * If the output contains "wide" (multibyte) characters, we will not + * really know the width of a character until we get the last byte + * of the character. Since the preceding byte(s) may use more columns + * on the screen than the final character, it is best to route the + * call to the wins_nwstr() function. + */ + if (sp->_screen_unicode) { + size_t nn = (n > 0) ? (size_t) n : strlen(s); + wchar_t *buffer = typeMalloc(wchar_t, nn + 1); + if (buffer != 0) { + mbstate_t state; + size_t n3; + init_mb(state); + n3 = mbstowcs(buffer, s, nn); + if (n3 != (size_t) (-1)) { + buffer[n3] = '\0'; + code = wins_nwstr(win, buffer, (int) n3); + } + free(buffer); + } + } + if (code == ERR) +#endif + { + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; + const unsigned char *cp; + + for (cp = str; (n < 0 || (cp - str) < n) && *cp; cp++) { + _nc_insert_ch(sp, win, (chtype) UChar(*cp)); + } + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + code = OK; + } + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_instr.c b/contrib/ncurses/ncurses/base/lib_instr.c new file mode 100644 index 00000000..b483785c --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_instr.c @@ -0,0 +1,122 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_instr.c +** +** The routine winnstr(). +** +*/ + +#include + +MODULE_ID("$Id: lib_instr.c,v 1.27 2024/07/27 19:22:23 tom Exp $") + +NCURSES_EXPORT(int) +winnstr(WINDOW *win, char *str, int n) +{ + int i = 0; + + T((T_CALLED("winnstr(%p,%p,%d)"), (void *) win, str, n)); + + if (!win || !str) { + i = ERR; + } else { + int row = win->_cury; + int col = win->_curx; + NCURSES_CH_T *text = win->_line[row].text; + + if (n < 0) + n = win->_maxx - col + 1; + + for (; i < n;) { +#if USE_WIDEC_SUPPORT + const cchar_t *cell = &(text[col]); + attr_t attrs; + NCURSES_PAIRS_T pair; + char *tmp; + + if (!isWidecExt(*cell)) { + wchar_t *wch; + int n2; + + n2 = getcchar(cell, 0, 0, 0, 0); + if (n2 > 0 + && (wch = typeCalloc(wchar_t, (unsigned) n2 + 1)) != 0) { + bool done = FALSE; + + if (getcchar(cell, wch, &attrs, &pair, 0) == OK) { + mbstate_t state; + size_t n3; + + init_mb(state); + n3 = wcstombs(0, wch, (size_t) 0); + if (!isEILSEQ(n3) && (n3 != 0) && (n3 <= MB_LEN_MAX)) { + size_t need = n3 + 10 + (size_t) i; + int have = (int) n3 + i; + + /* check for loop-done as well as overflow */ + if (have > n || (int) need <= 0) { + done = TRUE; + } else if ((tmp = typeCalloc(char, need)) == 0) { + done = TRUE; + } else { + size_t i3; + + init_mb(state); + wcstombs(tmp, wch, n3); + for (i3 = 0; i3 < n3; ++i3) + str[i++] = tmp[i3]; + free(tmp); + } + } + } + free(wch); + if (done) + break; + } + } +#else + str[i++] = (char) CharOf(text[col]); +#endif + if (++col > win->_maxx) { + break; + } + } + str[i] = '\0'; /* SVr4 does not seem to count the null */ + } + T(("winnstr returns %s", _nc_visbuf(str))); + returnCode(i); +} diff --git a/contrib/ncurses/ncurses/base/lib_isendwin.c b/contrib/ncurses/ncurses/base/lib_isendwin.c new file mode 100644 index 00000000..a54d500f --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_isendwin.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_endwin.c +** +** The routine endwin(). +** +*/ + +#include + +MODULE_ID("$Id: lib_isendwin.c,v 1.9 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(isendwin) (NCURSES_SP_DCL0) +{ + if (SP_PARM == NULL) + return FALSE; + return (SP_PARM->_endwin == ewSuspend); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +isendwin(void) +{ + return NCURSES_SP_NAME(isendwin) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_leaveok.c b/contrib/ncurses/ncurses/base/lib_leaveok.c new file mode 100644 index 00000000..4d05b2c4 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_leaveok.c @@ -0,0 +1,56 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_leaveok.c +** +** The routine leaveok. +** +*/ + +#include + +MODULE_ID("$Id: lib_leaveok.c,v 1.7 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +leaveok(WINDOW *win, bool flag) +{ + T((T_CALLED("leaveok(%p,%d)"), (void *) win, flag)); + + if (win) { + win->_leaveok = flag; + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_mouse.c b/contrib/ncurses/ncurses/base/lib_mouse.c new file mode 100644 index 00000000..ddb0c8d8 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_mouse.c @@ -0,0 +1,2099 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2008 * + ****************************************************************************/ + +/* + * This module is intended to encapsulate ncurses's interface to pointing + * devices. + * + * The primary method used is xterm's internal mouse-tracking facility. + * Additional methods depend on the platform: + * Alessandro Rubini's GPM server (Linux) + * sysmouse (FreeBSD) + * special-purpose mouse interface for OS/2 EMX. + * + * Notes for implementors of new mouse-interface methods: + * + * The code is logically split into a lower level that accepts event reports + * in a device-dependent format and an upper level that parses mouse gestures + * and filters events. The mediating data structure is a circular queue of + * MEVENT structures. + * + * Functionally, the lower level's job is to pick up primitive events and + * put them on the circular queue. This can happen in one of two ways: + * either (a) _nc_mouse_event() detects a series of incoming mouse reports + * and queues them, or (b) code in lib_getch.c detects the kmous prefix in + * the keyboard input stream and calls _nc_mouse_inline to queue up a series + * of adjacent mouse reports. + * + * In either case, _nc_mouse_parse() should be called after the series is + * accepted to parse the digested mouse reports (low-level MEVENTs) into + * a gesture (a high-level or composite MEVENT). + * + * Don't be too shy about adding new event types or modifiers, if you can find + * room for them in the 32-bit mask. The API is written so that users get + * feedback on which theoretical event types they won't see when they call + * mousemask. There's one bit per button (the RESERVED_EVENT bit) not being + * used yet, and a couple of bits open at the high end. + */ + +#ifdef __EMX__ +# include +# define INCL_DOS +# define INCL_VIO +# define INCL_KBD +# define INCL_MOU +# define INCL_DOSPROCESS +# include /* Need to include before the others */ +#endif + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_mouse.c,v 1.201 2024/10/19 21:03:19 tom Exp $") + +#include + +#if USE_GPM_SUPPORT +#include /* defines KG_* macros */ + +#ifdef HAVE_LIBDL +/* use dynamic loader to avoid linkage dependency */ +#include + +#ifdef RTLD_NOW +#define my_RTLD RTLD_NOW +#else +#ifdef RTLD_LAZY +#define my_RTLD RTLD_LAZY +#else +make an error +#endif +#endif /* RTLD_NOW */ +#endif /* HAVE_LIBDL */ + +#endif /* USE_GPM_SUPPORT */ + +#if USE_SYSMOUSE +#undef buttons /* symbol conflict in consio.h */ +#undef mouse_info /* symbol conflict in consio.h */ +#include +#if defined(__DragonFly_version) || (defined(__FreeBSD__) && (__FreeBSD_version >= 400017)) +#include +#include +#else +#include +#endif +#endif /* use_SYSMOUSE */ + +#if USE_KLIBC_MOUSE +#include +#define pipe(handles) socketpair(AF_LOCAL, SOCK_STREAM, 0, handles) +#define DosWrite(hfile, pbuffer, cbwrite, pcbactual) \ + write(hfile, pbuffer, cbwrite) +#define DosExit(action, result ) /* do nothing */ +#define DosCreateThread(ptid, pfn, param, flag, cbStack) \ + (*(ptid) = _beginthread(pfn, NULL, cbStack, \ + (void *)param), (*(ptid) == -1)) +#endif + +#define MY_TRACE TRACE_ICALLS|TRACE_IEVENT + +#define MASK_RELEASE(x) (mmask_t) NCURSES_MOUSE_MASK(x, 001) +#define MASK_PRESS(x) (mmask_t) NCURSES_MOUSE_MASK(x, 002) +#define MASK_CLICK(x) (mmask_t) NCURSES_MOUSE_MASK(x, 004) +#define MASK_DOUBLE_CLICK(x) (mmask_t) NCURSES_MOUSE_MASK(x, 010) +#define MASK_TRIPLE_CLICK(x) (mmask_t) NCURSES_MOUSE_MASK(x, 020) +#define MASK_RESERVED_EVENT(x) (mmask_t) NCURSES_MOUSE_MASK(x, 040) + +#if NCURSES_MOUSE_VERSION == 1 + +#define BUTTON_CLICKED (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED | BUTTON4_CLICKED) +#define BUTTON_PRESSED (BUTTON1_PRESSED | BUTTON2_PRESSED | BUTTON3_PRESSED | BUTTON4_PRESSED) +#define BUTTON_RELEASED (BUTTON1_RELEASED | BUTTON2_RELEASED | BUTTON3_RELEASED | BUTTON4_RELEASED) +#define BUTTON_DOUBLE_CLICKED (BUTTON1_DOUBLE_CLICKED | BUTTON2_DOUBLE_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON4_DOUBLE_CLICKED) +#define BUTTON_TRIPLE_CLICKED (BUTTON1_TRIPLE_CLICKED | BUTTON2_TRIPLE_CLICKED | BUTTON3_TRIPLE_CLICKED | BUTTON4_TRIPLE_CLICKED) + +#define MAX_BUTTONS 4 + +#else + +#define BUTTON_CLICKED (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED | BUTTON4_CLICKED | BUTTON5_CLICKED) +#define BUTTON_PRESSED (BUTTON1_PRESSED | BUTTON2_PRESSED | BUTTON3_PRESSED | BUTTON4_PRESSED | BUTTON5_PRESSED) +#define BUTTON_RELEASED (BUTTON1_RELEASED | BUTTON2_RELEASED | BUTTON3_RELEASED | BUTTON4_RELEASED | BUTTON5_RELEASED) +#define BUTTON_DOUBLE_CLICKED (BUTTON1_DOUBLE_CLICKED | BUTTON2_DOUBLE_CLICKED | BUTTON3_DOUBLE_CLICKED | BUTTON4_DOUBLE_CLICKED | BUTTON5_DOUBLE_CLICKED) +#define BUTTON_TRIPLE_CLICKED (BUTTON1_TRIPLE_CLICKED | BUTTON2_TRIPLE_CLICKED | BUTTON3_TRIPLE_CLICKED | BUTTON4_TRIPLE_CLICKED | BUTTON5_TRIPLE_CLICKED) + +#if NCURSES_MOUSE_VERSION == 2 +#define MAX_BUTTONS 5 +#else +#define MAX_BUTTONS 11 +#endif + +#endif + +#define INVALID_EVENT -1 +#define NORMAL_EVENT 0 + +#define ValidEvent(ep) ((ep)->id != INVALID_EVENT) +#define Invalidate(ep) (ep)->id = INVALID_EVENT + +#if USE_GPM_SUPPORT + +#ifndef LIBGPM_SONAME +#define LIBGPM_SONAME "libgpm.so" +#endif + +#define GET_DLSYM(name) (my_##name = (TYPE_##name) dlsym(sp->_dlopen_gpm, #name)) + +#endif /* USE_GPM_SUPPORT */ + +static bool _nc_mouse_parse(SCREEN *, int); +static void _nc_mouse_resume(SCREEN *); +static void _nc_mouse_wrap(SCREEN *); + +/* maintain a circular list of mouse events */ + +#define FirstEV(sp) ((sp)->_mouse_events) +#define LastEV(sp) ((sp)->_mouse_events + EV_MAX - 1) + +#undef NEXT +#define NEXT(ep) ((ep >= LastEV(SP_PARM)) \ + ? FirstEV(SP_PARM) \ + : ep + 1) + +#undef PREV +#define PREV(ep) ((ep <= FirstEV(SP_PARM)) \ + ? LastEV(SP_PARM) \ + : ep - 1) + +#define IndexEV(sp, ep) (ep - FirstEV(sp)) + +#define RunParams(sp, eventp, runp) \ + (long) IndexEV(sp, runp), \ + (long) (IndexEV(sp, eventp) + (EV_MAX - 1)) % EV_MAX + +#ifdef TRACE +static void +_trace_slot(SCREEN *sp, const char *tag) +{ + MEVENT *ep; + + _tracef("%s", tag); + + for (ep = FirstEV(sp); ep <= LastEV(sp); ep++) + _tracef("mouse event queue slot %ld = %s", + (long) IndexEV(sp, ep), + _nc_tracemouse(sp, ep)); +} +#endif + +#if USE_EMX_MOUSE + +# define TOP_ROW 0 +# define LEFT_COL 0 + +# define M_FD(sp) sp->_mouse_fd + +static void +write_event(SCREEN *sp, int down, int button, int x, int y) +{ + char buf[6]; + unsigned long ignore; + + _nc_STRCPY(buf, "\033[M", sizeof(buf)); /* should be the same as key_mouse */ + buf[3] = ' ' + (button - 1) + (down ? 0 : 0x40); + buf[4] = ' ' + x - LEFT_COL + 1; + buf[5] = ' ' + y - TOP_ROW + 1; + DosWrite(sp->_emxmouse_wfd, buf, 6, &ignore); +} + +static void +#if USE_KLIBC_MOUSE +mouse_server(void *param) +#else +mouse_server(unsigned long param) +#endif +{ + SCREEN *sp = (SCREEN *) param; + unsigned short fWait = MOU_WAIT; + /* NOPTRRECT mourt = { 0,0,24,79 }; */ + MOUEVENTINFO mouev; + HMOU hmou; + unsigned short mask = MOUSE_BN1_DOWN | MOUSE_BN2_DOWN | MOUSE_BN3_DOWN; + int nbuttons = 3; + int oldstate = 0; + char err[80]; + unsigned long rc; + + /* open the handle for the mouse */ + if (MouOpen(NULL, &hmou) == 0) { + rc = MouSetEventMask(&mask, hmou); + if (rc) { /* retry with 2 buttons */ + mask = MOUSE_BN1_DOWN | MOUSE_BN2_DOWN; + rc = MouSetEventMask(&mask, hmou); + nbuttons = 2; + } + if (rc == 0 && MouDrawPtr(hmou) == 0) { + for (;;) { + /* sit and wait on the event queue */ + rc = MouReadEventQue(&mouev, &fWait, hmou); + if (rc) { + _nc_SPRINTF(err, _nc_SLIMIT(sizeof(err)) + "Error reading mouse queue, rc=%lu.\r\n", rc); + break; + } + if (!sp->_emxmouse_activated) + goto finish; + + /* + * OS/2 numbers a 3-button mouse inconsistently from other + * platforms: + * 1 = left + * 2 = right + * 3 = middle. + */ + if ((mouev.fs ^ oldstate) & MOUSE_BN1_DOWN) + write_event(sp, mouev.fs & MOUSE_BN1_DOWN, + sp->_emxmouse_buttons[1], mouev.col, mouev.row); + if ((mouev.fs ^ oldstate) & MOUSE_BN2_DOWN) + write_event(sp, mouev.fs & MOUSE_BN2_DOWN, + sp->_emxmouse_buttons[3], mouev.col, mouev.row); + if ((mouev.fs ^ oldstate) & MOUSE_BN3_DOWN) + write_event(sp, mouev.fs & MOUSE_BN3_DOWN, + sp->_emxmouse_buttons[2], mouev.col, mouev.row); + + finish: + oldstate = mouev.fs; + } + } else { + _nc_SPRINTF(err, _nc_SLIMIT(sizeof(err)) + "Error setting event mask, buttons=%d, rc=%lu.\r\n", + nbuttons, rc); + } + + DosWrite(2, err, strlen(err), &rc); + MouClose(hmou); + } + DosExit(EXIT_THREAD, 0L); +} + +#endif /* USE_EMX_MOUSE */ + +#if USE_SYSMOUSE +static void +sysmouse_server(SCREEN *sp) +{ + struct mouse_info the_mouse; + MEVENT *work; + + the_mouse.operation = MOUSE_GETINFO; + if (sp != 0 + && sp->_mouse_fd >= 0 + && sp->_sysmouse_tail < FIFO_SIZE + && ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) { + + if (sp->_sysmouse_head > sp->_sysmouse_tail) { + sp->_sysmouse_tail = 0; + sp->_sysmouse_head = 0; + } + work = &(sp->_sysmouse_fifo[sp->_sysmouse_tail]); + memset(work, 0, sizeof(*work)); + work->id = NORMAL_EVENT; /* there's only one mouse... */ + + sp->_sysmouse_old_buttons = sp->_sysmouse_new_buttons; + sp->_sysmouse_new_buttons = the_mouse.u.data.buttons & 0x7; + + if (sp->_sysmouse_new_buttons) { + if (sp->_sysmouse_new_buttons & 1) + work->bstate |= BUTTON1_PRESSED; + if (sp->_sysmouse_new_buttons & 2) + work->bstate |= BUTTON2_PRESSED; + if (sp->_sysmouse_new_buttons & 4) + work->bstate |= BUTTON3_PRESSED; + } else { + if (sp->_sysmouse_old_buttons & 1) + work->bstate |= BUTTON1_RELEASED; + if (sp->_sysmouse_old_buttons & 2) + work->bstate |= BUTTON2_RELEASED; + if (sp->_sysmouse_old_buttons & 4) + work->bstate |= BUTTON3_RELEASED; + } + + /* for cosmetic bug in syscons.c on FreeBSD 3.[34] */ + the_mouse.operation = MOUSE_HIDE; + ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse); + the_mouse.operation = MOUSE_SHOW; + ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse); + + /* + * We're only interested if the button is pressed or released. + * FIXME: implement continuous event-tracking. + */ + if (sp->_sysmouse_new_buttons != sp->_sysmouse_old_buttons) { + sp->_sysmouse_tail += 1; + } + work->x = the_mouse.u.data.x / sp->_sysmouse_char_width; + work->y = the_mouse.u.data.y / sp->_sysmouse_char_height; + } +} + +static void +handle_sysmouse(int sig GCC_UNUSED) +{ + sysmouse_server(CURRENT_SCREEN); +} +#endif /* USE_SYSMOUSE */ + +#if !defined(USE_TERM_DRIVER) || defined(EXP_WIN32_DRIVER) +#define xterm_kmous "\033[M" + +static void +init_xterm_mouse(SCREEN *sp) +{ + sp->_mouse_type = M_XTERM; + sp->_mouse_format = MF_X10; + sp->_mouse_xtermcap = tigetstr("XM"); + if (VALID_STRING(sp->_mouse_xtermcap)) { + char *code = strstr(sp->_mouse_xtermcap, "[?"); + if (code != 0) { + code += 2; + while ((*code >= '0') && (*code <= '9')) { + char *next = code; + while ((*next >= '0') && (*next <= '9')) { + ++next; + } + if (!strncmp(code, "1006", (size_t) (next - code))) { + sp->_mouse_format = MF_SGR1006; + } +#ifdef EXP_XTERM_1005 + if (!strncmp(code, "1005", (size_t) (next - code))) { + sp->_mouse_format = MF_XTERM_1005; + } +#endif + if (*next == ';') { + while (*next == ';') { + ++next; + } + code = next; + } else { + break; + } + } + } + } else { + int code = tigetnum("XM"); + switch (code) { +#ifdef EXP_XTERM_1005 + case 1005: + /* see "xterm+sm+1005" */ + sp->_mouse_xtermcap = "\033[?1005;1000%?%p1%{1}%=%th%el%;"; + sp->_mouse_format = MF_XTERM_1005; + break; +#endif + case 1006: + /* see "xterm+sm+1006" */ + sp->_mouse_xtermcap = "\033[?1006;1000%?%p1%{1}%=%th%el%;"; + sp->_mouse_format = MF_SGR1006; + break; + default: + sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;"; + break; + } + } +} +#endif + +static void +enable_xterm_mouse(SCREEN *sp, int enable) +{ + TPUTS_TRACE(enable + ? "xterm mouse initialization" + : "xterm mouse deinitialization"); +#if USE_EMX_MOUSE + sp->_emxmouse_activated = enable; +#else + NCURSES_PUTP2("xterm-mouse", TIPARM_1(sp->_mouse_xtermcap, enable)); +#endif + sp->_mouse_active = enable; +} + +#if defined(USE_TERM_DRIVER) +static void +enable_win32_mouse(SCREEN *sp, int enable) +{ +#if defined(EXP_WIN32_DRIVER) + enable_xterm_mouse(sp, enable); +#else + sp->_mouse_active = enable; +#endif +} +#endif + +#if USE_GPM_SUPPORT +static bool +allow_gpm_mouse(SCREEN *sp GCC_UNUSED) +{ + bool result = FALSE; + +#if USE_WEAK_SYMBOLS + /* Danger Robinson: do not use dlopen for libgpm if already loaded */ + if ((Gpm_Wgetch) != 0) { + if (!sp->_mouse_gpm_loaded) { + T(("GPM library was already dlopen'd, not by us")); + } + } else +#endif + /* GPM does printf's without checking if stdout is a terminal */ + if (NC_ISATTY(fileno(stdout))) { + const char *list = getenv("NCURSES_GPM_TERMS"); + const char *env = getenv("TERM"); + if (list != 0) { + if (env != 0) { + result = _nc_name_match(list, env, "|:"); + } + } else { + /* GPM checks the beginning of the $TERM variable to decide if it + * should pass xterm events through. There is no real advantage in + * allowing GPM to do this. Recent versions relax that check, and + * pretend that GPM can work with any terminal having the kmous + * capability. Perhaps that works for someone. If so, they can + * set the environment variable (above). + */ + if (env != 0 && strstr(env, "linux") != 0) { + result = TRUE; + } + } + } + return result; +} + +#ifdef HAVE_LIBDL +static void +unload_gpm_library(SCREEN *sp) +{ + if (sp->_dlopen_gpm != 0) { + T(("unload GPM library")); + sp->_mouse_gpm_loaded = FALSE; + sp->_mouse_fd = -1; + } +} + +static void +load_gpm_library(SCREEN *sp) +{ + sp->_mouse_gpm_found = FALSE; + + /* + * If we already had a successful dlopen, reuse it. + */ + if (sp->_dlopen_gpm != 0) { + sp->_mouse_gpm_found = TRUE; + sp->_mouse_gpm_loaded = TRUE; + } else if ((sp->_dlopen_gpm = dlopen(LIBGPM_SONAME, my_RTLD)) != 0) { +#if (defined(__GNUC__) && (__GNUC__ >= 5)) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" +#endif + if (GET_DLSYM(gpm_fd) == 0 || + GET_DLSYM(Gpm_Open) == 0 || + GET_DLSYM(Gpm_Close) == 0 || + GET_DLSYM(Gpm_GetEvent) == 0) { +#if (defined(__GNUC__) && (__GNUC__ >= 5)) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + T(("GPM initialization failed: %s", dlerror())); + unload_gpm_library(sp); + dlclose(sp->_dlopen_gpm); + sp->_dlopen_gpm = 0; + } else { + sp->_mouse_gpm_found = TRUE; + sp->_mouse_gpm_loaded = TRUE; + } + } +} +#endif /* HAVE_LIBDL */ + +static bool +enable_gpm_mouse(SCREEN *sp, bool enable) +{ + bool result; + + T((T_CALLED("enable_gpm_mouse(%d)"), enable)); + + if (enable && !sp->_mouse_active) { +#ifdef HAVE_LIBDL + if (sp->_mouse_gpm_found && !sp->_mouse_gpm_loaded) { + load_gpm_library(sp); + } +#endif + if (sp->_mouse_gpm_loaded) { + int code; + + /* GPM: initialize connection to gpm server */ + sp->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP; + sp->_mouse_gpm_connect.defaultMask = + (unsigned short) (~(sp->_mouse_gpm_connect.eventMask | GPM_HARD)); + sp->_mouse_gpm_connect.minMod = 0; + sp->_mouse_gpm_connect.maxMod = + (unsigned short) (~((1 << KG_SHIFT) | + (1 << KG_SHIFTL) | + (1 << KG_SHIFTR))); + /* + * Note: GPM hardcodes \E[?1001s and \E[?1000h during its open. + * The former is recognized by wscons (SunOS), and the latter by + * xterm. Those will not show up in ncurses' traces. + */ + code = my_Gpm_Open(&sp->_mouse_gpm_connect, 0); + result = (code >= 0); + + /* + * GPM can return a -2 if it is trying to do something with xterm. + * Ignore that, since it conflicts with our use of stdin. + */ + if (code == -2) { + my_Gpm_Close(); + } + } else { + result = FALSE; + } + sp->_mouse_active = result; + T(("GPM open %s", result ? "succeeded" : "failed")); + } else { + if (!enable && sp->_mouse_active) { + /* GPM: close connection to gpm server */ + my_Gpm_Close(); + sp->_mouse_active = FALSE; + T(("GPM closed")); + } + result = enable; + } +#ifdef HAVE_LIBDL + if (!result) { + unload_gpm_library(sp); + } +#endif + returnBool(result); +} +#endif /* USE_GPM_SUPPORT */ + +static void +initialize_mousetype(SCREEN *sp) +{ + T((T_CALLED("initialize_mousetype()"))); + + /* Try gpm first, because gpm may be configured to run in xterm */ +#if USE_GPM_SUPPORT + if (allow_gpm_mouse(sp)) { + if (!sp->_mouse_gpm_loaded) { +#ifdef HAVE_LIBDL + load_gpm_library(sp); +#else /* !HAVE_LIBDL */ + sp->_mouse_gpm_found = TRUE; + sp->_mouse_gpm_loaded = TRUE; +#endif + } + + /* + * The gpm_fd file-descriptor may be negative (xterm). So we have to + * maintain our notion of whether the mouse connection is active + * without testing the file-descriptor. + */ + if (sp->_mouse_gpm_found && enable_gpm_mouse(sp, TRUE)) { + sp->_mouse_type = M_GPM; + sp->_mouse_fd = *(my_gpm_fd); + T(("GPM mouse_fd %d", sp->_mouse_fd)); + returnVoid; + } + } +#endif /* USE_GPM_SUPPORT */ + + /* OS/2 VIO */ +#if USE_EMX_MOUSE + if (!sp->_emxmouse_thread + && strstr(SP_TERMTYPE term_names, "xterm") == 0 + && NonEmpty(key_mouse)) { + int handles[2]; + + if (pipe(handles) < 0) { + perror("mouse pipe error"); + returnVoid; + } else { + int rc; + + if (!sp->_emxmouse_buttons[0]) { + const char *s = getenv("MOUSE_BUTTONS_123"); + + sp->_emxmouse_buttons[0] = 1; + if (s && strlen(s) >= 3) { + sp->_emxmouse_buttons[1] = s[0] - '0'; + sp->_emxmouse_buttons[2] = s[1] - '0'; + sp->_emxmouse_buttons[3] = s[2] - '0'; + } else { + sp->_emxmouse_buttons[1] = 1; + sp->_emxmouse_buttons[2] = 3; + sp->_emxmouse_buttons[3] = 2; + } + } + sp->_emxmouse_wfd = handles[1]; + M_FD(sp) = handles[0]; + /* Needed? */ + setmode(handles[0], O_BINARY); + setmode(handles[1], O_BINARY); + /* Do not use CRT functions, we may single-threaded. */ + rc = DosCreateThread((unsigned long *) &sp->_emxmouse_thread, + mouse_server, (long) sp, 0, 8192); + if (rc) { + printf("mouse thread error %d=%#x", rc, rc); + } else { + sp->_mouse_type = M_XTERM; + } + returnVoid; + } + } +#endif /* USE_EMX_MOUSE */ + +#if USE_SYSMOUSE + { + static char dev_tty[] = "/dev/tty"; + struct mouse_info the_mouse; + char *the_device = 0; + + if (NC_ISATTY(sp->_ifd)) + the_device = ttyname(sp->_ifd); + if (the_device == 0) + the_device = dev_tty; + + sp->_mouse_fd = open(the_device, O_RDWR); + + if (sp->_mouse_fd >= 0) { + /* + * sysmouse does not have a usable user interface for obtaining + * mouse events. The logical way to proceed (reading data on a + * stream) only works if one opens the device as root. Even in + * that mode, careful examination shows we lose events + * occasionally. The interface provided for user programs is to + * establish a signal handler. really. + * + * Take over SIGUSR2 for this purpose since SIGUSR1 is more + * likely to be used by an application. getch() will have to + * handle the misleading EINTR's. + */ + signal(SIGUSR2, SIG_IGN); + the_mouse.operation = MOUSE_MODE; + the_mouse.u.mode.mode = 0; + the_mouse.u.mode.signal = SIGUSR2; + if (ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) { + signal(SIGUSR2, handle_sysmouse); + the_mouse.operation = MOUSE_SHOW; + ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse); + +#if defined(FBIO_MODEINFO) || defined(CONS_MODEINFO) /* FreeBSD > 2.x */ + { +#ifndef FBIO_GETMODE /* FreeBSD 3.x */ +#define FBIO_GETMODE CONS_GET +#define FBIO_MODEINFO CONS_MODEINFO +#endif /* FBIO_GETMODE */ + video_info_t the_video; + + if (ioctl(sp->_mouse_fd, + FBIO_GETMODE, + &the_video.vi_mode) != -1 + && ioctl(sp->_mouse_fd, + FBIO_MODEINFO, + &the_video) != -1) { + sp->_sysmouse_char_width = the_video.vi_cwidth; + sp->_sysmouse_char_height = the_video.vi_cheight; + } + } +#endif /* defined(FBIO_MODEINFO) || defined(CONS_MODEINFO) */ + + if (sp->_sysmouse_char_width <= 0) + sp->_sysmouse_char_width = 8; + if (sp->_sysmouse_char_height <= 0) + sp->_sysmouse_char_height = 16; + sp->_mouse_type = M_SYSMOUSE; + returnVoid; + } + } + } +#endif /* USE_SYSMOUSE */ + +#ifdef USE_TERM_DRIVER + CallDriver(sp, td_initmouse); +#endif +#if !defined(USE_TERM_DRIVER) || defined(EXP_WIN32_DRIVER) + /* we know how to recognize mouse events under "xterm" */ + if (NonEmpty(key_mouse)) { + init_xterm_mouse(sp); + } else if (strstr(SP_TERMTYPE term_names, "xterm") != 0) { + if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK) + init_xterm_mouse(sp); + } +#endif + + returnVoid; +} + +static bool +_nc_mouse_init(SCREEN *sp) +/* initialize the mouse */ +{ + bool result = FALSE; + + T((T_CALLED("_nc_mouse_init(%p)"), (void *) sp)); + + if (sp != 0) { + if (!sp->_mouse_initialized) { + int i; + + sp->_mouse_initialized = TRUE; + + TR(MY_TRACE, ("set _mouse_initialized")); + + sp->_mouse_eventp = FirstEV(sp); + for (i = 0; i < EV_MAX; i++) + Invalidate(sp->_mouse_events + i); + + initialize_mousetype(sp); + + T(("set _mouse_type to %d", sp->_mouse_type)); + } + result = sp->_mouse_initialized; + } + returnCode(result); +} + +/* + * Query to see if there is a pending mouse event. This is called from + * fifo_push() in lib_getch.c + */ +static bool +_nc_mouse_event(SCREEN *sp) +{ + MEVENT *eventp = sp->_mouse_eventp; + bool result = FALSE; + + (void) eventp; + + switch (sp->_mouse_type) { + case M_XTERM: + /* xterm: never have to query, mouse events are in the keyboard stream */ +#if USE_EMX_MOUSE + { + char kbuf[3]; + + int i, res = read(M_FD(sp), &kbuf, 3); /* Eat the prefix */ + if (res != 3) + printf("Got %d chars instead of 3 for prefix.\n", res); + for (i = 0; i < res; i++) { + if (kbuf[i] != key_mouse[i]) + printf("Got char %d instead of %d for prefix.\n", + (int) kbuf[i], (int) key_mouse[i]); + } + result = TRUE; + } +#endif /* USE_EMX_MOUSE */ + break; + +#if USE_GPM_SUPPORT + case M_GPM: + if (sp->_mouse_fd >= 0) { + /* query server for event, return TRUE if we find one */ + Gpm_Event ev; + + switch (my_Gpm_GetEvent(&ev)) { + case 0: + /* Connection closed, drop the mouse. */ + sp->_mouse_fd = -1; + break; + case 1: + /* there's only one mouse... */ + eventp->id = NORMAL_EVENT; + + eventp->bstate = 0; + switch (ev.type & 0x0f) { + case (GPM_DOWN): + if (ev.buttons & GPM_B_LEFT) + eventp->bstate |= BUTTON1_PRESSED; + if (ev.buttons & GPM_B_MIDDLE) + eventp->bstate |= BUTTON2_PRESSED; + if (ev.buttons & GPM_B_RIGHT) + eventp->bstate |= BUTTON3_PRESSED; + break; + case (GPM_UP): + if (ev.buttons & GPM_B_LEFT) + eventp->bstate |= BUTTON1_RELEASED; + if (ev.buttons & GPM_B_MIDDLE) + eventp->bstate |= BUTTON2_RELEASED; + if (ev.buttons & GPM_B_RIGHT) + eventp->bstate |= BUTTON3_RELEASED; + break; + default: + eventp->bstate |= REPORT_MOUSE_POSITION; + break; + } + + eventp->x = ev.x - 1; + eventp->y = ev.y - 1; + eventp->z = 0; + + /* bump the next-free pointer into the circular list */ + sp->_mouse_eventp = NEXT(eventp); + result = TRUE; + break; + } + } + break; +#endif + +#if USE_SYSMOUSE + case M_SYSMOUSE: + if (sp->_sysmouse_head < sp->_sysmouse_tail) { + *eventp = sp->_sysmouse_fifo[sp->_sysmouse_head]; + + /* + * Point the fifo-head to the next possible location. If there + * are none, reset the indices. This may be interrupted by the + * signal handler, doing essentially the same reset. + */ + sp->_sysmouse_head += 1; + if (sp->_sysmouse_head == sp->_sysmouse_tail) { + sp->_sysmouse_tail = 0; + sp->_sysmouse_head = 0; + } + + /* bump the next-free pointer into the circular list */ + sp->_mouse_eventp = eventp = NEXT(eventp); + result = TRUE; + } + break; +#endif /* USE_SYSMOUSE */ + +#ifdef USE_TERM_DRIVER + case M_TERM_DRIVER: + while (sp->_drv_mouse_head < sp->_drv_mouse_tail) { + *eventp = sp->_drv_mouse_fifo[sp->_drv_mouse_head]; + + /* + * Point the fifo-head to the next possible location. If there + * are none, reset the indices. + */ + sp->_drv_mouse_head += 1; + if (sp->_drv_mouse_head == sp->_drv_mouse_tail) { + sp->_drv_mouse_tail = 0; + sp->_drv_mouse_head = 0; + } + + /* bump the next-free pointer into the circular list */ + sp->_mouse_eventp = eventp = NEXT(eventp); + result = TRUE; + } + break; +#endif + + case M_NONE: + break; + } + + return result; /* true if we found an event */ +} + +#if USE_EMX_MOUSE +#define PRESS_POSITION(n) \ + do { \ + eventp->bstate = MASK_PRESS(n); \ + sp->_mouse_bstate |= MASK_PRESS(n); \ + if (button & 0x40) { \ + eventp->bstate = MASK_RELEASE(n); \ + sp->_mouse_bstate &= ~MASK_PRESS(n); \ + } \ + } while (0) +#else +#define PRESS_POSITION(n) \ + do { \ + eventp->bstate = (mmask_t) ((sp->_mouse_bstate & MASK_PRESS(n)) \ + ? REPORT_MOUSE_POSITION \ + : MASK_PRESS(n)); \ + sp->_mouse_bstate |= MASK_PRESS(n); \ + } while (0) +#endif + +static bool +handle_wheel(SCREEN *sp, MEVENT * eventp, int button, int wheel) +{ + bool result = TRUE; + + switch (button & 3) { + case 0: + if (wheel) { + eventp->bstate = MASK_PRESS(4); + /* Do not record in sp->_mouse_bstate; there will be no + * corresponding release event. + */ + } else { + PRESS_POSITION(1); + } + break; + case 1: + if (wheel) { +#if NCURSES_MOUSE_VERSION >= 2 + eventp->bstate = MASK_PRESS(5); + /* See comment above for button 4 */ +#else + /* Ignore this event as it is not a true press of the button */ + eventp->bstate = REPORT_MOUSE_POSITION; +#endif + } else { + PRESS_POSITION(2); + } + break; + case 2: + PRESS_POSITION(3); + break; + default: + /* + * case 3 is sent when the mouse buttons are released. + * + * If the terminal uses xterm mode 1003, a continuous series of + * button-release events is sent as the mouse moves around the screen, + * or as the wheel mouse is rotated. + * + * Return false in this case, so that when running in X10 mode, we will + * recalculate bstate. + */ + eventp->bstate = REPORT_MOUSE_POSITION; + result = FALSE; + break; + } + return result; +} + +static bool +decode_X10_bstate(SCREEN *sp, MEVENT * eventp, unsigned intro) +{ + bool result; + int button = 0; + int wheel = (intro & 96) == 96; + + eventp->bstate = 0; + + if (intro >= 96) { + if (intro >= 160) { + button = (int) (intro - 152); /* buttons 8-11 */ + } else { + button = (int) (intro - 92); /* buttons 4-7 */ + } + } else { + button = (intro & 3); + } + + if (button > MAX_BUTTONS) { + eventp->bstate = REPORT_MOUSE_POSITION; + } else if (!handle_wheel(sp, eventp, (int) intro, wheel)) { + + /* + * Release events aren't reported for individual buttons, just for + * the button set as a whole. However, because there are normally + * no mouse events under xterm that intervene between press and + * release, we can infer the button actually released by looking at + * the previous event. + */ + if (sp->_mouse_bstate & BUTTON_PRESSED) { + int b; + + eventp->bstate = BUTTON_RELEASED; + for (b = 1; b <= MAX_BUTTONS; ++b) { + if (!(sp->_mouse_bstate & MASK_PRESS(b))) + eventp->bstate &= ~MASK_RELEASE(b); + } + sp->_mouse_bstate = 0; + } else { + /* + * xterm will return a stream of release-events to let the + * application know where the mouse is going, if private mode + * 1002 or 1003 is enabled. + */ + eventp->bstate = REPORT_MOUSE_POSITION; + } + } + + if (intro & 4) { + eventp->bstate |= BUTTON_SHIFT; + } + if (intro & 8) { + eventp->bstate |= BUTTON_ALT; + } + if (intro & 16) { + eventp->bstate |= BUTTON_CTRL; + } + result = (eventp->bstate & REPORT_MOUSE_POSITION) ? TRUE : FALSE; + return result; +} + +/* This code requires that your xterm entry contain the kmous capability and + * that it be set to the \E[M documented in the Xterm Control Sequences + * reference. This is how we arrange for mouse events to be reported via a + * KEY_MOUSE return value from wgetch(). After this value is received, + * _nc_mouse_inline() gets called and is immediately responsible for parsing + * the mouse status information following the prefix. + * + * The following quotes from the ctlseqs.ms document in the XTerm distribution, + * describing the mouse tracking feature: + * + * Parameters for all mouse tracking escape sequences generated by xterm encode + * numeric parameters in a single character as value+040. For example, ! is + * 1. + * + * On button press or release, xterm sends ESC [ M CbCxCy. The low two bits of + * Cb encode button information: 0=MB1 pressed, 1=MB2 pressed, 2=MB3 pressed, + * 3=release. The upper bits encode what modifiers were down when the button + * was pressed and are added together. 4=Shift, 8=Meta, 16=Control. Cx and Cy + * are the x and y coordinates of the mouse event. The upper left corner is + * (1,1). + * + * (End quote) By the time we get here, we've eaten the key prefix. FYI, the + * loop below is necessary because mouse click info isn't guaranteed to present + * as a single clist item. + * + * Wheel mice may return buttons 4 and 5 when the wheel is turned. We encode + * those as button presses. + */ +static bool +decode_xterm_X10(SCREEN *sp, MEVENT * eventp) +{ +#define MAX_KBUF 3 + unsigned char kbuf[MAX_KBUF + 1]; + size_t grabbed; + int res; + bool result; + + _nc_set_read_thread(TRUE); + for (grabbed = 0; grabbed < MAX_KBUF; grabbed += (size_t) res) { + + /* For VIO mouse we add extra bit 64 to disambiguate button-up. */ + res = (int) read( +#if USE_EMX_MOUSE + (M_FD(sp) >= 0) ? M_FD(sp) : sp->_ifd, +#else + sp->_ifd, +#endif + kbuf + grabbed, (size_t) (MAX_KBUF - (int) grabbed)); + if (res == -1) + break; + } + _nc_set_read_thread(FALSE); + kbuf[MAX_KBUF] = '\0'; + + TR(TRACE_IEVENT, + ("_nc_mouse_inline sees the following xterm data: '%s'", kbuf)); + + /* there's only one mouse... */ + eventp->id = NORMAL_EVENT; + + result = decode_X10_bstate(sp, eventp, kbuf[0]); + + eventp->x = (kbuf[1] - ' ') - 1; + eventp->y = (kbuf[2] - ' ') - 1; + + return result; +} + +#ifdef EXP_XTERM_1005 +/* + * This is identical to X10/X11 responses except that there are two UTF-8 + * characters storing the ordinates instead of two bytes. + */ +static bool +decode_xterm_1005(SCREEN *sp, MEVENT * eventp) +{ + char kbuf[80]; + size_t grabbed; + size_t limit = (sizeof(kbuf) - 1); + unsigned coords[2]; + bool result; + + coords[0] = 0; + coords[1] = 0; + + _nc_set_read_thread(TRUE); + for (grabbed = 0; grabbed < limit;) { + int res; + + res = (int) read( +#if USE_EMX_MOUSE + (M_FD(sp) >= 0) ? M_FD(sp) : sp->_ifd, +#else + sp->_ifd, +#endif + (kbuf + grabbed), (size_t) 1); + if (res == -1) + break; + grabbed += (size_t) res; + if (grabbed > 1) { + size_t check = 1; + int n; + + for (n = 0; n < 2; ++n) { + int rc; + + if (check >= grabbed) + break; + rc = _nc_conv_to_utf32(&coords[n], kbuf + check, (unsigned) + (grabbed - check)); + if (!rc) + break; + check += (size_t) rc; + } + if (n >= 2) + break; + } + } + _nc_set_read_thread(FALSE); + + TR(TRACE_IEVENT, + ("_nc_mouse_inline sees the following xterm data: %s", + _nc_visbufn(kbuf, (int) grabbed))); + + /* there's only one mouse... */ + eventp->id = NORMAL_EVENT; + + result = decode_X10_bstate(sp, eventp, UChar(kbuf[0])); + + eventp->x = (int) (coords[0] - ' ') - 1; + eventp->y = (int) (coords[1] - ' ') - 1; + + return result; +} +#endif /* EXP_XTERM_1005 */ + +/* + * ECMA-48 section 5.4 + */ +#define isInter(c) ((c) >= 0x20 && (c) <= 0x2f) +#define isParam(c) ((c) >= 0x30 && (c) <= 0x3f) +#define isFinal(c) ((c) >= 0x40 && (c) <= 0x7e) + +#define MAX_PARAMS 9 + +typedef struct { + int nerror; /* nonzero if there are unexpected chars */ + int nparam; /* number of numeric parameters */ + int params[MAX_PARAMS]; + int final; /* the final-character */ +} SGR_DATA; + +static bool +read_SGR(const SCREEN *sp, SGR_DATA * result) +{ + char kbuf[80]; /* bigger than any possible mouse response */ + int grabbed = 0; + int ch = 0; + int now = -1; + int marker = 1; + + memset(result, 0, sizeof(*result)); + _nc_set_read_thread(TRUE); + + do { + int res; + + res = (int) read( +#if USE_EMX_MOUSE + (M_FD(sp) >= 0) ? M_FD(sp) : sp->_ifd, +#else + sp->_ifd, +#endif + (kbuf + grabbed), (size_t) 1); + if (res == -1) + break; + if ((grabbed + MAX_KBUF) >= (int) sizeof(kbuf)) { + result->nerror++; + break; + } + ch = UChar(kbuf[grabbed]); + kbuf[grabbed + 1] = 0; + switch (ch) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (marker) { + ++now; + result->nparam = (now + 1); + } + marker = 0; + result->params[now] = (result->params[now] * 10) + (ch - '0'); + break; + case ';': + if (marker) { + ++now; + result->nparam = (now + 1); + } + marker = 1; + break; + default: + if (ch < 32 || ch > 126) { + /* + * Technically other characters could be interspersed in the + * response. Ignore those for now. + */ + result->nerror++; + continue; + } else if (isFinal(ch)) { + if (marker) { + result->nparam++; + } + result->final = ch; + } else { + result->nerror++; + } + break; + } + ++grabbed; + } while (!isFinal(ch)); + _nc_set_read_thread(FALSE); + + kbuf[++grabbed] = 0; + TR(TRACE_IEVENT, + ("_nc_mouse_inline sees the following xterm data: '%s'", kbuf)); + return (grabbed > 0) && (result->nerror == 0); +} + +static bool +decode_xterm_SGR1006(SCREEN *sp, MEVENT * eventp) +{ + SGR_DATA data; + bool result = FALSE; + if (read_SGR(sp, &data)) { + int b = data.params[0]; + int b3 = 1 + (b & 3); + int wheel = ((b & 64) == 64); + + if (b >= 132) { + b3 = MAX_BUTTONS + 1; + } else if (b >= 128) { + b3 = (b - 120); /* buttons 8-11 */ + } else if (b >= 64) { + b3 = (b - 60); /* buttons 6-7 */ + } + + eventp->id = NORMAL_EVENT; + if (data.final == 'M') { + (void) handle_wheel(sp, eventp, b, wheel); + } else if (b3 > MAX_BUTTONS) { + eventp->bstate = REPORT_MOUSE_POSITION; + } else { + mmask_t pressed = (mmask_t) NCURSES_MOUSE_MASK(b3, NCURSES_BUTTON_PRESSED); + mmask_t release = (mmask_t) NCURSES_MOUSE_MASK(b3, NCURSES_BUTTON_RELEASED); + if (sp->_mouse_bstate & pressed) { + eventp->bstate = release; + sp->_mouse_bstate &= ~pressed; + } else { + eventp->bstate = REPORT_MOUSE_POSITION; + } + } + if (b & 4) { + eventp->bstate |= BUTTON_SHIFT; + } + if (b & 8) { + eventp->bstate |= BUTTON_ALT; + } + if (b & 16) { + eventp->bstate |= BUTTON_CTRL; + } + result = (eventp->bstate & REPORT_MOUSE_POSITION) ? TRUE : FALSE; + eventp->x = (data.params[1] ? (data.params[1] - 1) : 0); + eventp->y = (data.params[2] ? (data.params[2] - 1) : 0); + } + return result; +} + +static bool +_nc_mouse_inline(SCREEN *sp) +/* mouse report received in the keyboard stream -- parse its info */ +{ + bool result = FALSE; + MEVENT *eventp = sp->_mouse_eventp; + + TR(MY_TRACE, ("_nc_mouse_inline() called")); + + if (sp->_mouse_type == M_XTERM) { + switch (sp->_mouse_format) { + case MF_X10: + result = decode_xterm_X10(sp, eventp); + break; + case MF_SGR1006: + result = decode_xterm_SGR1006(sp, eventp); + break; +#ifdef EXP_XTERM_1005 + case MF_XTERM_1005: + result = decode_xterm_1005(sp, eventp); + break; +#endif + } + + TR(MY_TRACE, + ("_nc_mouse_inline: primitive mouse-event %s has slot %ld", + _nc_tracemouse(sp, eventp), + (long) IndexEV(sp, eventp))); + + /* bump the next-free pointer into the circular list */ + sp->_mouse_eventp = NEXT(eventp); + + if (!result) { + /* If this event is from a wheel-mouse, treat it like position + * reports and avoid waiting for the release-events which will + * never come. + */ + if (eventp->bstate & BUTTON_PRESSED) { + int b; + + for (b = 4; b <= MAX_BUTTONS; ++b) { + if ((eventp->bstate & MASK_PRESS(b))) { + result = TRUE; + break; + } + } + } + } + } + + return (result); +} + +static void +mouse_activate(SCREEN *sp, int on) +{ + T((T_CALLED("mouse_activate(%p,%s)"), + (void *) SP_PARM, on ? "on" : "off")); + + if (!on && !sp->_mouse_initialized) + returnVoid; + + if (!_nc_mouse_init(sp)) + returnVoid; + + if (on) { + sp->_mouse_bstate = 0; + switch (sp->_mouse_type) { + case M_XTERM: +#if NCURSES_EXT_FUNCS + NCURSES_SP_NAME(keyok) (NCURSES_SP_ARGx KEY_MOUSE, on); +#endif + enable_xterm_mouse(sp, 1); + break; +#if USE_GPM_SUPPORT + case M_GPM: + if (enable_gpm_mouse(sp, TRUE)) { + sp->_mouse_fd = *(my_gpm_fd); + T(("GPM mouse_fd %d", sp->_mouse_fd)); + } + break; +#endif +#if USE_SYSMOUSE + case M_SYSMOUSE: + signal(SIGUSR2, handle_sysmouse); + sp->_mouse_active = TRUE; + break; +#endif +#ifdef USE_TERM_DRIVER + case M_TERM_DRIVER: + enable_win32_mouse(sp, TRUE); + break; +#endif + case M_NONE: + returnVoid; + default: + T(("unexpected mouse mode")); + break; + } + /* Make runtime binding to cut down on object size of applications that + * do not use the mouse (e.g., 'clear'). + */ + /* *INDENT-EQLS* */ + sp->_mouse_event = _nc_mouse_event; + sp->_mouse_inline = _nc_mouse_inline; + sp->_mouse_parse = _nc_mouse_parse; + sp->_mouse_resume = _nc_mouse_resume; + sp->_mouse_wrap = _nc_mouse_wrap; + } else { + + switch (sp->_mouse_type) { + case M_XTERM: + enable_xterm_mouse(sp, 0); + break; +#if USE_GPM_SUPPORT + case M_GPM: + enable_gpm_mouse(sp, FALSE); + break; +#endif +#if USE_SYSMOUSE + case M_SYSMOUSE: + signal(SIGUSR2, SIG_IGN); + sp->_mouse_active = FALSE; + break; +#endif +#ifdef USE_TERM_DRIVER + case M_TERM_DRIVER: + enable_win32_mouse(sp, FALSE); + break; +#endif + case M_NONE: + returnVoid; + default: + T(("unexpected mouse mode")); + break; + } + } + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + returnVoid; +} + +/************************************************************************** + * + * Device-independent code + * + **************************************************************************/ + +static bool +_nc_mouse_parse(SCREEN *sp, int runcount) +/* parse a run of atomic mouse events into a gesture */ +{ + MEVENT *eventp = sp->_mouse_eventp; + MEVENT *next, *ep; + MEVENT *first_valid = NULL; + MEVENT *first_invalid = NULL; + int n; + int b; + bool merge; + bool endLoop; + + TR(MY_TRACE, ("_nc_mouse_parse(%d) called", runcount)); + + /* + * When we enter this routine, the event list next-free pointer + * points just past a run of mouse events that we know were separated + * in time by less than the critical click interval. The job of this + * routine is to collapse this run into a single higher-level event + * or gesture. + * + * We accomplish this in two passes. The first pass merges press/release + * pairs into click events. The second merges runs of click events into + * double or triple-click events. + * + * It's possible that the run may not resolve to a single event (for + * example, if the user quadruple-clicks). If so, leading events + * in the run are ignored if user does not call getmouse in a loop (getting + * them from newest to older). + * + * Note that this routine is independent of the format of the specific + * format of the pointing-device's reports. We can use it to parse + * gestures on anything that reports press/release events on a per- + * button basis, as long as the device-dependent mouse code puts stuff + * on the queue in MEVENT format. + */ + + /* + * Reset all events that were not set, in case the user sometimes calls + * getmouse only once and other times until there are no more events in + * queue. + * + * This also allows reaching the beginning of the run. + */ + ep = eventp; + for (n = runcount; n < EV_MAX; n++) { + Invalidate(ep); + ep = NEXT(ep); + } + +#ifdef TRACE + if (USE_TRACEF(TRACE_IEVENT)) { + _trace_slot(sp, "before mouse press/release merge:"); + _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d", + RunParams(sp, eventp, ep), + runcount); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + + /* first pass; merge press/release pairs */ + endLoop = FALSE; + while (!endLoop) { + next = NEXT(ep); + if (next == eventp) { + /* Will end the loop, but compact before */ + endLoop = TRUE; + } else { + +#define MASK_CHANGED(x) (!(ep->bstate & MASK_PRESS(x)) \ + == !(next->bstate & MASK_RELEASE(x))) + + if (ValidEvent(ep) && ValidEvent(next) + && ep->x == next->x && ep->y == next->y + && (ep->bstate & BUTTON_PRESSED) + && (!(next->bstate & BUTTON_PRESSED))) { + bool changed = TRUE; + + for (b = 1; b <= MAX_BUTTONS; ++b) { + if (!MASK_CHANGED(b)) { + changed = FALSE; + break; + } + } + + if (changed) { + merge = FALSE; + for (b = 1; b <= MAX_BUTTONS; ++b) { + if ((sp->_mouse_mask2 & MASK_CLICK(b)) + && (ep->bstate & MASK_PRESS(b))) { + next->bstate &= ~MASK_RELEASE(b); + next->bstate |= MASK_CLICK(b); + merge = TRUE; + } + } + if (merge) { + Invalidate(ep); + } + } + } + } + + /* Compact valid events */ + if (!ValidEvent(ep)) { + if ((first_valid != NULL) && (first_invalid == NULL)) { + first_invalid = ep; + } + } else { + if (first_valid == NULL) { + first_valid = ep; + } else if (first_invalid != NULL) { + *first_invalid = *ep; + Invalidate(ep); + first_invalid = NEXT(first_invalid); + } + } + + ep = next; + } + + if (first_invalid != NULL) { + eventp = first_invalid; + } +#ifdef TRACE + if (USE_TRACEF(TRACE_IEVENT)) { + _trace_slot(sp, "before mouse click merge:"); + if (first_valid == NULL) { + _tracef("_nc_mouse_parse: no valid event"); + } else { + _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d", + RunParams(sp, eventp, first_valid), + runcount); + _nc_unlock_global(tracef); + } + } +#endif /* TRACE */ + + /* + * Second pass; merge click runs. We merge click events forward in the + * queue. For example, double click can be changed to triple click. + * + * NOTE: There is a problem with this design! If the application + * allows enough click events to pile up in the circular queue so + * they wrap around, it will cheerfully merge the newest forward + * into the oldest, creating a bogus doubleclick and confusing + * the queue-traversal logic rather badly. Generally this won't + * happen, because calling getmouse() marks old events invalid and + * ineligible for merges. The true solution to this problem would + * be to timestamp each MEVENT and perform the obvious sanity check, + * but the timer element would have to have sub-second resolution, + * which would get us into portability trouble. + */ + first_invalid = NULL; + endLoop = (first_valid == NULL); + ep = first_valid; + while (!endLoop) { + next = NEXT(ep); + + if (next == eventp) { + /* Will end the loop, but check event type and compact before */ + endLoop = TRUE; + } else if (!ValidEvent(next)) { + continue; + } else { + /* merge click events forward */ + if ((ep->bstate & BUTTON_CLICKED) + && (next->bstate & BUTTON_CLICKED)) { + merge = FALSE; + for (b = 1; b <= MAX_BUTTONS; ++b) { + if ((sp->_mouse_mask2 & MASK_DOUBLE_CLICK(b)) + && (ep->bstate & MASK_CLICK(b)) + && (next->bstate & MASK_CLICK(b))) { + next->bstate &= ~MASK_CLICK(b); + next->bstate |= MASK_DOUBLE_CLICK(b); + merge = TRUE; + } + } + if (merge) { + Invalidate(ep); + } + } + + /* merge double-click events forward */ + if ((ep->bstate & BUTTON_DOUBLE_CLICKED) + && (next->bstate & BUTTON_CLICKED)) { + merge = FALSE; + for (b = 1; b <= MAX_BUTTONS; ++b) { + if ((sp->_mouse_mask2 & MASK_TRIPLE_CLICK(b)) + && (ep->bstate & MASK_DOUBLE_CLICK(b)) + && (next->bstate & MASK_CLICK(b))) { + next->bstate &= ~MASK_CLICK(b); + next->bstate |= MASK_TRIPLE_CLICK(b); + merge = TRUE; + } + } + if (merge) { + Invalidate(ep); + } + } + } + + /* Discard event if it does not match event mask */ + if (!(ep->bstate & sp->_mouse_mask2)) { + Invalidate(ep); + } + + /* Compact valid events */ + if (!ValidEvent(ep)) { + if (ep == first_valid) { + first_valid = next; + } else if (first_invalid == NULL) { + first_invalid = ep; + } + } else if (first_invalid != NULL) { + *first_invalid = *ep; + Invalidate(ep); + first_invalid = NEXT(first_invalid); + } + + ep = next; + } + + if (first_invalid == NULL) { + first_invalid = eventp; + } + sp->_mouse_eventp = first_invalid; + +#ifdef TRACE + if (first_valid != NULL) { + if (USE_TRACEF(TRACE_IEVENT)) { + _trace_slot(sp, "after mouse event queue compaction:"); + _tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d", + RunParams(sp, first_invalid, first_valid), + runcount); + _nc_unlock_global(tracef); + } + for (ep = first_valid; ep != first_invalid; ep = NEXT(ep)) { + if (ValidEvent(ep)) + TR(MY_TRACE, + ("_nc_mouse_parse: returning composite mouse event %s at slot %ld", + _nc_tracemouse(sp, ep), + (long) IndexEV(sp, ep))); + } + } +#endif /* TRACE */ + + /* after all this, do we have a valid event? */ + ep = PREV(first_invalid); + return ValidEvent(ep) && ((ep->bstate & sp->_mouse_mask) != 0); +} + +static void +_nc_mouse_wrap(SCREEN *sp) +/* release mouse -- called by endwin() before shellout/exit */ +{ + TR(MY_TRACE, ("_nc_mouse_wrap() called")); + + switch (sp->_mouse_type) { + case M_XTERM: + if (sp->_mouse_mask) + mouse_activate(sp, FALSE); + break; +#if USE_GPM_SUPPORT + /* GPM: pass all mouse events to next client */ + case M_GPM: + if (sp->_mouse_mask) + mouse_activate(sp, FALSE); + break; +#endif +#if USE_SYSMOUSE + case M_SYSMOUSE: + mouse_activate(sp, FALSE); + break; +#endif +#ifdef USE_TERM_DRIVER + case M_TERM_DRIVER: + mouse_activate(sp, FALSE); + break; +#endif + case M_NONE: + break; + } +} + +static void +_nc_mouse_resume(SCREEN *sp) +/* re-connect to mouse -- called by doupdate() after shellout */ +{ + TR(MY_TRACE, ("_nc_mouse_resume() called")); + + switch (sp->_mouse_type) { + case M_XTERM: + /* xterm: re-enable reporting */ + if (sp->_mouse_mask) + mouse_activate(sp, TRUE); + break; + +#if USE_GPM_SUPPORT + case M_GPM: + /* GPM: reclaim our event set */ + if (sp->_mouse_mask) + mouse_activate(sp, TRUE); + break; +#endif + +#if USE_SYSMOUSE + case M_SYSMOUSE: + mouse_activate(sp, TRUE); + break; +#endif + +#ifdef USE_TERM_DRIVER + case M_TERM_DRIVER: + mouse_activate(sp, TRUE); + break; +#endif + + case M_NONE: + break; + } +} + +/************************************************************************** + * + * Mouse interface entry points for the API + * + **************************************************************************/ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(getmouse) (NCURSES_SP_DCLx MEVENT * aevent) +{ + int result = ERR; + MEVENT *eventp; + + T((T_CALLED("getmouse(%p,%p)"), (void *) SP_PARM, (void *) aevent)); + + if ((aevent != 0) && + (SP_PARM != 0) && + (SP_PARM->_mouse_type != M_NONE) && + (eventp = SP_PARM->_mouse_eventp) != 0) { + /* compute the current-event pointer */ + MEVENT *prev = PREV(eventp); + + /* + * Discard events not matching mask (there could be still some if + * _nc_mouse_parse was not called, e.g., when _nc_mouse_inline returns + * false). + */ + while (ValidEvent(prev) && (!(prev->bstate & SP_PARM->_mouse_mask2))) { + Invalidate(prev); + prev = PREV(prev); + } + if (ValidEvent(prev)) { + /* copy the event we find there */ + *aevent = *prev; + + TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld", + _nc_tracemouse(SP_PARM, prev), + (long) IndexEV(SP_PARM, prev))); + + Invalidate(prev); /* so the queue slot becomes free */ + SP_PARM->_mouse_eventp = prev; + result = OK; + } else { + /* Reset the provided event */ + aevent->bstate = 0; + Invalidate(aevent); + aevent->x = 0; + aevent->y = 0; + aevent->z = 0; + } + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +/* grab a copy of the current mouse event */ +NCURSES_EXPORT(int) +getmouse(MEVENT * aevent) +{ + return NCURSES_SP_NAME(getmouse) (CURRENT_SCREEN, aevent); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(ungetmouse) (NCURSES_SP_DCLx MEVENT * aevent) +{ + int result = ERR; + MEVENT *eventp; + + T((T_CALLED("ungetmouse(%p,%p)"), (void *) SP_PARM, (void *) aevent)); + + if (aevent != 0 && + SP_PARM != 0 && + (eventp = SP_PARM->_mouse_eventp) != 0) { + + /* stick the given event in the next-free slot */ + *eventp = *aevent; + + /* bump the next-free pointer into the circular list */ + SP_PARM->_mouse_eventp = NEXT(eventp); + + /* push back the notification event on the keyboard queue */ + result = NCURSES_SP_NAME(ungetch) (NCURSES_SP_ARGx KEY_MOUSE); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +/* enqueue a synthesized mouse event to be seen by the next wgetch() */ +NCURSES_EXPORT(int) +ungetmouse(MEVENT * aevent) +{ + return NCURSES_SP_NAME(ungetmouse) (CURRENT_SCREEN, aevent); +} +#endif + +NCURSES_EXPORT(mmask_t) +NCURSES_SP_NAME(mousemask) (NCURSES_SP_DCLx mmask_t newmask, mmask_t * oldmask) +/* set the mouse event mask */ +{ + mmask_t result = 0; + + T((T_CALLED("mousemask(%p,%#lx,%p)"), + (void *) SP_PARM, + (unsigned long) newmask, + (void *) oldmask)); + + if (SP_PARM != 0) { + if (oldmask) + *oldmask = SP_PARM->_mouse_mask; + + if (newmask || SP_PARM->_mouse_initialized) { + _nc_mouse_init(SP_PARM); + + if (SP_PARM->_mouse_type != M_NONE) { + int b; + + result = newmask & + (REPORT_MOUSE_POSITION + | BUTTON_ALT + | BUTTON_CTRL + | BUTTON_SHIFT + | BUTTON_PRESSED + | BUTTON_RELEASED + | BUTTON_CLICKED + | BUTTON_DOUBLE_CLICKED + | BUTTON_TRIPLE_CLICKED); + + mouse_activate(SP_PARM, (bool) (result != 0)); + + SP_PARM->_mouse_mask = result; + SP_PARM->_mouse_mask2 = result; + + /* + * Make a mask corresponding to the states we will need to + * retain (temporarily) while building up the state that the + * user asked for. + */ + for (b = 1; b <= MAX_BUTTONS; ++b) { + if (SP_PARM->_mouse_mask2 & MASK_TRIPLE_CLICK(b)) + SP_PARM->_mouse_mask2 |= MASK_DOUBLE_CLICK(b); + if (SP_PARM->_mouse_mask2 & MASK_DOUBLE_CLICK(b)) + SP_PARM->_mouse_mask2 |= MASK_CLICK(b); + if (SP_PARM->_mouse_mask2 & MASK_CLICK(b)) + SP_PARM->_mouse_mask2 |= (MASK_PRESS(b) | + MASK_RELEASE(b)); + } + } + } + } + returnMMask(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(mmask_t) +mousemask(mmask_t newmask, mmask_t * oldmask) +{ + return NCURSES_SP_NAME(mousemask) (CURRENT_SCREEN, newmask, oldmask); +} +#endif + +NCURSES_EXPORT(bool) +wenclose(const WINDOW *win, int y, int x) +/* check to see if given window encloses given screen location */ +{ + bool result = FALSE; + + T((T_CALLED("wenclose(%p,%d,%d)"), (const void *) win, y, x)); + + if (win != 0) { + y -= win->_yoffset; + if (IS_PAD(win)) { + if (win->_pad._pad_y >= 0 && + win->_pad._pad_x >= 0 && + win->_pad._pad_top >= 0 && + win->_pad._pad_left >= 0 && + win->_pad._pad_right >= 0 && + win->_pad._pad_bottom >= 0) { + result = ((win->_pad._pad_top <= y && + win->_pad._pad_left <= x && + win->_pad._pad_right >= x && + win->_pad._pad_bottom >= y) ? TRUE : FALSE); + } + } else { + result = ((win->_begy <= y && + win->_begx <= x && + (win->_begx + win->_maxx) >= x && + (win->_begy + win->_maxy) >= y) ? TRUE : FALSE); + } + } + returnBool(result); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(mouseinterval) (NCURSES_SP_DCLx int maxclick) +/* set the maximum mouse interval within which to recognize a click */ +{ + int oldval; + + T((T_CALLED("mouseinterval(%p,%d)"), (void *) SP_PARM, maxclick)); + + if (SP_PARM != 0) { + oldval = SP_PARM->_maxclick; + if (maxclick >= 0) + SP_PARM->_maxclick = maxclick; + } else { + oldval = DEFAULT_MAXCLICK; + } + + returnCode(oldval); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +mouseinterval(int maxclick) +{ + return NCURSES_SP_NAME(mouseinterval) (CURRENT_SCREEN, maxclick); +} +#endif + +/* This may be used by other routines to ask for the existence of mouse + support */ +NCURSES_EXPORT(bool) +_nc_has_mouse(const SCREEN *sp) +{ + return (((0 == sp) || (sp->_mouse_type == M_NONE)) ? FALSE : TRUE); +} + +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(has_mouse) (NCURSES_SP_DCL0) +{ + return _nc_has_mouse(SP_PARM); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +has_mouse(void) +{ + return _nc_has_mouse(CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(bool) +wmouse_trafo(const WINDOW *win, int *pY, int *pX, bool to_screen) +{ + bool result = FALSE; + + T((T_CALLED("wmouse_trafo(%p,%p,%p,%d)"), + (const void *) win, + (void *) pY, + (void *) pX, + to_screen)); + + if (win && pY && pX) { + int y = *pY; + int x = *pX; + + T(("transform input %d,%d", y, x)); + if (to_screen) { + y += win->_begy + win->_yoffset; + x += win->_begx; + if (wenclose(win, y, x)) + result = TRUE; + } else { + if (wenclose(win, y, x)) { + y -= (win->_begy + win->_yoffset); + x -= win->_begx; + result = TRUE; + } + } + if (result) { + *pX = x; + *pY = y; + T(("output transform %d,%d", y, x)); + } + } + returnBool(result); +} diff --git a/contrib/ncurses/ncurses/base/lib_move.c b/contrib/ncurses/ncurses/base/lib_move.c new file mode 100644 index 00000000..d9ba8c0c --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_move.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2004,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_move.c +** +** The routine wmove(). +** +*/ + +#include + +MODULE_ID("$Id: lib_move.c,v 1.14 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wmove(WINDOW *win, int y, int x) +{ + T((T_CALLED("wmove(%p,%d,%d)"), (void *) win, y, x)); + + if (LEGALYX(win, y, x)) { + win->_curx = (NCURSES_SIZE_T) x; + win->_cury = (NCURSES_SIZE_T) y; + + win->_flags &= ~_WRAPPED; + win->_flags |= _HASMOVED; + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_mvwin.c b/contrib/ncurses/ncurses/base/lib_mvwin.c new file mode 100644 index 00000000..66421971 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_mvwin.c @@ -0,0 +1,121 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* +** lib_mvwin.c +** +** The routine mvwin(). +** +*/ + +#include + +MODULE_ID("$Id: lib_mvwin.c,v 1.21 2024/07/27 19:23:59 tom Exp $") + +NCURSES_EXPORT(int) +mvwin(WINDOW *win, int by, int bx) +{ +#if NCURSES_SP_FUNCS + const SCREEN *sp = _nc_screen_of(win); +#endif + + T((T_CALLED("mvwin(%p,%d,%d)"), (void *) win, by, bx)); + + if (!win || IS_PAD(win)) + returnCode(ERR); + + /* + * mvwin() should only modify the indices. See test/demo_menus.c and + * test/movewindow.c for examples. + */ +#if 0 + /* Copying subwindows is allowed, but it is expensive... */ + if (IS_SUBWIN(win)) { + int err = ERR; + WINDOW *parent = win->_parent; + if (parent) { /* Now comes the complicated and costly part, you should really + * try to avoid to move subwindows. Because a subwindow shares + * the text buffers with its parent, one can't do a simple + * memmove of the text buffers. One has to create a copy, then + * to relocate the subwindow and then to do a copy. + */ + if ((by - parent->_begy == win->_pary) && + (bx - parent->_begx == win->_parx)) + err = OK; /* we don't actually move */ + else { + WINDOW *clone = dupwin(win); + if (clone) { + /* now we have the clone, so relocate win */ + + werase(win); /* Erase the original place */ + /* fill with parents background */ + wbkgrnd(win, CHREF(parent->_nc_bkgd)); + wsyncup(win); /* Tell the parent(s) */ + + err = mvderwin(win, + by - parent->_begy, + bx - parent->_begx); + if (err != ERR) { + err = copywin(clone, win, + 0, 0, 0, 0, win->_maxy, win->_maxx, 0); + if (ERR != err) + wsyncup(win); + } + if (ERR == delwin(clone)) + err = ERR; + } + } + } + returnCode(err); + } +#endif + + if (by + win->_maxy > screen_lines(SP_PARM) - 1 + || bx + win->_maxx > screen_columns(SP_PARM) - 1 + || by < 0 + || bx < 0) + returnCode(ERR); + + /* + * Whether or not the window is moved, touch the window's contents so + * that a following call to 'wrefresh()' will paint the window at the + * new location. This ensures that if the caller has refreshed another + * window at the same location, that this one will be displayed. + */ + win->_begy = (NCURSES_SIZE_T) by; + win->_begx = (NCURSES_SIZE_T) bx; + returnCode(touchwin(win)); +} diff --git a/contrib/ncurses/ncurses/base/lib_newterm.c b/contrib/ncurses/ncurses/base/lib_newterm.c new file mode 100644 index 00000000..2ec3c894 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_newterm.c @@ -0,0 +1,376 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_newterm.c +** +** The newterm() function. +** +*/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +#include + +MODULE_ID("$Id: lib_newterm.c,v 1.105 2024/05/11 19:06:59 tom Exp $") + +#ifdef USE_TERM_DRIVER +#define NumLabels InfoOf(SP_PARM).numlabels +#else +#define NumLabels num_labels +#endif + +#ifndef ONLCR /* Allows compilation under the QNX 4.2 OS */ +#define ONLCR 0 +#endif + +/* + * SVr4/XSI Curses specify that hardware echo is turned off in initscr, and not + * restored during the curses session. The library simulates echo in software. + * (The behavior is unspecified if the application enables hardware echo). + * + * The newterm function also initializes terminal settings, and since initscr + * is supposed to behave as if it calls newterm, we do it here. + */ +static NCURSES_INLINE int +_nc_initscr(NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *term = TerminalOf(SP_PARM); + + /* for extended XPG4 conformance requires cbreak() at this point */ + /* (SVr4 curses does this anyway) */ + T((T_CALLED("_nc_initscr(%p) ->term %p"), (void *) SP_PARM, (void *) term)); + if (NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG) == OK) { + TTY buf; + + buf = term->Nttyb; +#ifdef TERMIOS + buf.c_lflag &= (unsigned) ~(ECHO | ECHONL); + buf.c_iflag &= (unsigned) ~(ICRNL | INLCR | IGNCR); + buf.c_oflag &= (unsigned) ~(ONLCR); +#elif HAVE_SGTTY_H + buf.sg_flags &= ~(ECHO | CRMOD); +#elif defined(EXP_WIN32_DRIVER) + buf.dwFlagIn = CONMODE_IN_DEFAULT; + buf.dwFlagOut = CONMODE_OUT_DEFAULT | VT_FLAG_OUT; + if (WINCONSOLE.isTermInfoConsole) { + buf.dwFlagIn |= VT_FLAG_IN; + } +#else + memset(&buf, 0, sizeof(buf)); +#endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) + term->Nttyb = buf; + } + returnCode(result); +} + +/* + * filter() has to be called before either initscr() or newterm(), so there is + * apparently no way to make this flag apply to some terminals and not others, + * aside from possibly delaying a filter() call until some terminals have been + * initialized. + */ +NCURSES_EXPORT(void) +NCURSES_SP_NAME(filter) (NCURSES_SP_DCL0) +{ + START_TRACE(); + T((T_CALLED("filter(%p)"), (void *) SP_PARM)); +#if NCURSES_SP_FUNCS + if (IsPreScreen(SP_PARM)) { + SP_PARM->_filtered = TRUE; + } +#else + _nc_prescreen.filter_mode = TRUE; +#endif + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +filter(void) +{ + START_TRACE(); + T((T_CALLED("filter()"))); + _nc_prescreen.filter_mode = TRUE; + returnVoid; +} +#endif + +#if NCURSES_EXT_FUNCS +/* + * An extension, allowing the application to open a new screen without + * requiring it to also be filtered. + */ +NCURSES_EXPORT(void) +NCURSES_SP_NAME(nofilter) (NCURSES_SP_DCL0) +{ + START_TRACE(); + T((T_CALLED("nofilter(%p)"), (void *) SP_PARM)); +#if NCURSES_SP_FUNCS + if (IsPreScreen(SP_PARM)) { + SP_PARM->_filtered = FALSE; + } +#else + _nc_prescreen.filter_mode = FALSE; +#endif + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +nofilter(void) +{ + START_TRACE(); + T((T_CALLED("nofilter()"))); + _nc_prescreen.filter_mode = FALSE; + returnVoid; +} +#endif +#endif /* NCURSES_EXT_FUNCS */ + +NCURSES_EXPORT(SCREEN *) +NCURSES_SP_NAME(newterm) (NCURSES_SP_DCLx + const char *name, + FILE *ofp, + FILE *ifp) +{ + int errret; + SCREEN *result = 0; + SCREEN *current; + TERMINAL *its_term; + FILE *_ofp = ofp ? ofp : stdout; + FILE *_ifp = ifp ? ifp : stdin; + TERMINAL *new_term = 0; + + START_TRACE(); + T((T_CALLED("newterm(%p, \"%s\", %p,%p)"), + (void *) SP_PARM, + (name ? name : ""), + (void *) ofp, + (void *) ifp)); + +#if NCURSES_SP_FUNCS + assert(SP_PARM != 0); + if (SP_PARM == 0) + returnSP(SP_PARM); +#endif + + _nc_init_pthreads(); + _nc_lock_global(curses); + + current = CURRENT_SCREEN; + its_term = (current ? current->_term : 0); + +#if defined(EXP_WIN32_DRIVER) + _setmode(fileno(_ifp), _O_BINARY); + _setmode(fileno(_ofp), _O_BINARY); +#endif + + INIT_TERM_DRIVER(); + /* this loads the capability entry, then sets LINES and COLS */ + if ( + TINFO_SETUP_TERM(&new_term, name, + fileno(_ofp), &errret, FALSE) != ERR) { + int slk_format; + int filter_mode; + + _nc_set_screen(0); +#ifdef USE_TERM_DRIVER + assert(new_term != 0); +#endif + +#if NCURSES_SP_FUNCS + slk_format = SP_PARM->slk_format; + filter_mode = SP_PARM->_filtered; +#else + slk_format = _nc_globals.slk_format; + filter_mode = _nc_prescreen.filter_mode; +#endif + + /* + * This actually allocates the screen structure, and saves the original + * terminal settings. + */ + if (NCURSES_SP_NAME(_nc_setupscreen) ( +#if NCURSES_SP_FUNCS + &SP_PARM, +#endif + *(ptrLines(SP_PARM)), + *(ptrCols(SP_PARM)), + _ofp, + filter_mode, + slk_format) == ERR) { + _nc_set_screen(current); + result = 0; + } else { + int value; + int cols; + +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB; +#elif !NCURSES_SP_FUNCS + _nc_set_screen(CURRENT_SCREEN); +#endif + assert(SP_PARM != 0); + cols = *(ptrCols(SP_PARM)); +#ifdef USE_TERM_DRIVER + _nc_set_screen(SP_PARM); + TCB = (TERMINAL_CONTROL_BLOCK *) new_term; + TCB->csp = SP_PARM; +#endif + /* + * In setupterm() we did a set_curterm(), but it was before we set + * CURRENT_SCREEN. So the "current" screen's terminal pointer was + * overwritten with a different terminal. Later, in + * _nc_setupscreen(), we set CURRENT_SCREEN and the terminal + * pointer in the new screen. + * + * Restore the terminal-pointer for the pre-existing screen, if + * any. + */ + if (current) + current->_term = its_term; + +#ifdef USE_TERM_DRIVER + SP_PARM->_term = new_term; +#else + new_term = SP_PARM->_term; +#endif + + /* allow user to set maximum escape delay from the environment */ + if ((value = _nc_getenv_num("ESCDELAY")) >= 0) { + value = Min(value, MAX_DELAY_MSECS); +#if NCURSES_EXT_FUNCS + NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_ARGx value); +#else + ESCDELAY = value; +#endif + } + + /* if the terminal type has real soft labels, set those up */ + if (slk_format && NumLabels > 0 && SLK_STDFMT(slk_format)) + _nc_slk_initialize(StdScreen(SP_PARM), cols); + + SP_PARM->_ifd = fileno(_ifp); + NCURSES_SP_NAME(typeahead) (NCURSES_SP_ARGx fileno(_ifp)); +#ifdef TERMIOS + SP_PARM->_use_meta = ((new_term->Ottyb.c_cflag & CSIZE) == CS8 && + !(new_term->Ottyb.c_iflag & ISTRIP)) || + USE_KLIBC_KBD; +#else + SP_PARM->_use_meta = FALSE; +#endif + SP_PARM->_endwin = ewInitial; +#ifndef USE_TERM_DRIVER + /* + * Check whether we can optimize scrolling under dumb terminals in + * case we do not have any of these capabilities, scrolling + * optimization will be useless. + */ + SP_PARM->_scrolling = ((scroll_forward && scroll_reverse) || + ((parm_rindex || + parm_insert_line || + insert_line) && + (parm_index || + parm_delete_line || + delete_line))); +#endif + + NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); /* sets a field in the screen structure */ + + SP_PARM->_keytry = 0; + + /* compute movement costs so we can do better move optimization */ +#ifdef USE_TERM_DRIVER + TCBOf(SP_PARM)->drv->td_scinit(SP_PARM); +#else /* ! USE_TERM_DRIVER */ + /* + * Check for mismatched graphic-rendition capabilities. Most SVr4 + * terminfo trees contain entries that have rmul or rmso equated to + * sgr0 (Solaris curses copes with those entries). We do this only + * for curses, since many termcap applications assume that + * smso/rmso and smul/rmul are paired, and will not function + * properly if we remove rmso or rmul. Curses applications + * shouldn't be looking at this detail. + */ +#define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode)) + SP_PARM->_use_rmso = SGR0_TEST(exit_standout_mode); + SP_PARM->_use_rmul = SGR0_TEST(exit_underline_mode); +#if USE_ITALIC + SP_PARM->_use_ritm = SGR0_TEST(exit_italics_mode); +#endif + + /* compute movement costs so we can do better move optimization */ + _nc_mvcur_init(); + + /* initialize terminal to a sane state */ + _nc_screen_init(); +#endif /* USE_TERM_DRIVER */ + + /* Initialize the terminal line settings. */ + _nc_initscr(NCURSES_SP_ARG); + + _nc_signal_handler(TRUE); + result = SP_PARM; + } + } + _nc_unlock_global(curses); + returnSP(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(SCREEN *) +newterm(const char *name, FILE *ofp, FILE *ifp) +{ + SCREEN *rc; + + _nc_init_pthreads(); + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(newterm) (CURRENT_SCREEN_PRE, name, ofp, ifp); + _nc_forget_prescr(); + _nc_unlock_global(prescreen); + + return rc; +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_newwin.c b/contrib/ncurses/ncurses/base/lib_newwin.c new file mode 100644 index 00000000..ef9da926 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_newwin.c @@ -0,0 +1,399 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_newwin.c +** +** The routines newwin(), subwin() and their dependent +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_newwin.c,v 1.77 2024/09/28 15:55:56 tom Exp $") + +#define window_is(name) ((sp)->_##name == win) + +#if USE_REENTRANT +#define remove_window(name) \ + sp->_##name = 0 +#else +#define remove_window(name) \ + sp->_##name = 0; \ + if (win == name) \ + name = 0 +#endif + +static void +remove_window_from_screen(WINDOW *win) +{ + SCREEN *sp; + +#ifdef USE_SP_WINDOWLIST + if ((sp = _nc_screen_of(win)) != 0) { + if (window_is(curscr)) { + remove_window(curscr); + } else if (window_is(stdscr)) { + remove_window(stdscr); + } else if (window_is(newscr)) { + remove_window(newscr); + } + } +#else + for (each_screen(sp)) { + if (window_is(curscr)) { + remove_window(curscr); + break; + } else if (window_is(stdscr)) { + remove_window(stdscr); + break; + } else if (window_is(newscr)) { + remove_window(newscr); + break; + } + } +#endif +} + +NCURSES_EXPORT(int) +_nc_freewin(WINDOW *win) +{ + int result = ERR; +#ifdef USE_SP_WINDOWLIST + SCREEN *sp = _nc_screen_of(win); /* pretend this is parameter */ +#endif + + T((T_CALLED("_nc_freewin(%p)"), (void *) win)); + + if (win != 0) { + + if (_nc_nonsp_try_global(curses) == 0) { + WINDOWLIST *p, *q; + + q = 0; + for (each_window(sp, p)) { + + if (&(p->win) == win) { + remove_window_from_screen(win); + if (q == 0) + WindowList(sp) = p->next; + else + q->next = p->next; + + if (!IS_SUBWIN(win)) { + int i; + + for (i = 0; i <= win->_maxy; i++) + FreeIfNeeded(win->_line[i].text); + } + free(win->_line); + free(p); + + result = OK; + T(("...deleted win=%p", (void *) win)); + break; + } + q = p; + } + _nc_nonsp_unlock_global(curses); + } + } + returnCode(result); +} + +NCURSES_EXPORT(WINDOW *) +NCURSES_SP_NAME(newwin) (NCURSES_SP_DCLx + int num_lines, int num_columns, int begy, int begx) +{ + WINDOW *win; + NCURSES_CH_T *ptr; + int i; + + T((T_CALLED("newwin(%p, %d,%d,%d,%d)"), (void *) SP_PARM, num_lines, num_columns, + begy, begx)); + + if (begy < 0 + || begx < 0 + || num_lines < 0 + || num_columns < 0 + || SP_PARM == 0) + returnWin(0); + + if (num_lines == 0) + num_lines = SP_PARM->_lines_avail - begy; + if (num_columns == 0) + num_columns = screen_columns(SP_PARM) - begx; + + win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx + num_lines, num_columns, begy, begx, 0); + if (win == 0) + returnWin(0); + + for (i = 0; i < num_lines; i++) { + win->_line[i].text = typeCalloc(NCURSES_CH_T, (unsigned) num_columns); + if (win->_line[i].text == 0) { + (void) _nc_freewin(win); + returnWin(0); + } + for (ptr = win->_line[i].text; + ptr < win->_line[i].text + num_columns; + ptr++) + SetChar(*ptr, BLANK_TEXT, BLANK_ATTR); + } + + returnWin(win); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(WINDOW *) +newwin(int num_lines, int num_columns, int begy, int begx) +{ + WINDOW *win; + _nc_sp_lock_global(curses); + win = NCURSES_SP_NAME(newwin) (CURRENT_SCREEN, + num_lines, num_columns, begy, begx); + _nc_sp_unlock_global(curses); + return (win); +} +#endif + +NCURSES_EXPORT(WINDOW *) +derwin(WINDOW *orig, int num_lines, int num_columns, int begy, int begx) +{ + WINDOW *win; + int i; + int flags = _SUBWIN; +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(orig); +#endif + + T((T_CALLED("derwin(%p,%d,%d,%d,%d)"), (void *) orig, num_lines, num_columns, + begy, begx)); + + /* + * make sure window fits inside the original one + */ + if (begy < 0 || begx < 0 || orig == 0 || num_lines < 0 || num_columns < 0) + returnWin(0); + if (begy + num_lines > orig->_maxy + 1 + || begx + num_columns > orig->_maxx + 1) + returnWin(0); + + if (num_lines == 0) + num_lines = orig->_maxy + 1 - begy; + + if (num_columns == 0) + num_columns = orig->_maxx + 1 - begx; + + if (IS_PAD(orig)) + flags |= _ISPAD; + + win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx num_lines, num_columns, + orig->_begy + begy, + orig->_begx + begx, flags); + if (win == 0) + returnWin(0); + + win->_pary = begy; + win->_parx = begx; + WINDOW_ATTRS(win) = WINDOW_ATTRS(orig); + win->_nc_bkgd = orig->_nc_bkgd; + + for (i = 0; i < num_lines; i++) + win->_line[i].text = &orig->_line[begy++].text[begx]; + + win->_parent = orig; + + returnWin(win); +} + +NCURSES_EXPORT(WINDOW *) +subwin(WINDOW *w, int l, int c, int y, int x) +{ + WINDOW *result = 0; + + T((T_CALLED("subwin(%p, %d, %d, %d, %d)"), (void *) w, l, c, y, x)); + if (w != 0) { + T(("parent has begy = %ld, begx = %ld", (long) w->_begy, (long) w->_begx)); + + result = derwin(w, l, c, y - w->_begy, x - w->_begx); + } + returnWin(result); +} + +NCURSES_EXPORT(WINDOW *) +NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_DCLx + int num_lines, + int num_columns, + int begy, + int begx, + int flags) +{ + int i; + WINDOWLIST *wp; + WINDOW *win; + bool is_padwin = (flags & _ISPAD); + + T((T_CALLED("_nc_makenew(%p,%d,%d,%d,%d)"), + (void *) SP_PARM, num_lines, num_columns, begy, begx)); + + if (SP_PARM == 0) + returnWin(0); + + if (!OK_DIMENSION(num_lines) || !OK_DIMENSION(num_columns)) + returnWin(0); + + if ((wp = typeCalloc(WINDOWLIST, 1)) == 0) + returnWin(0); + + win = &(wp->win); + + if ((win->_line = typeCalloc(struct ldat, ((unsigned) num_lines))) == 0) { + free(wp); + returnWin(0); + } + + _nc_nonsp_lock_global(curses); + + win->_curx = 0; + win->_cury = 0; + win->_maxy = (NCURSES_SIZE_T) (num_lines - 1); + win->_maxx = (NCURSES_SIZE_T) (num_columns - 1); + win->_begy = (NCURSES_SIZE_T) begy; + win->_begx = (NCURSES_SIZE_T) begx; + win->_yoffset = SP_PARM->_topstolen; + + win->_flags = (short) flags; + WINDOW_ATTRS(win) = A_NORMAL; + SetChar(win->_nc_bkgd, BLANK_TEXT, BLANK_ATTR); + + win->_clear = (is_padwin + ? FALSE + : (num_lines == screen_lines(SP_PARM) + && num_columns == screen_columns(SP_PARM))); + win->_idlok = FALSE; + win->_idcok = TRUE; + win->_scroll = FALSE; + win->_leaveok = FALSE; + win->_use_keypad = FALSE; + win->_delay = -1; + win->_immed = FALSE; + win->_sync = 0; + win->_parx = -1; + win->_pary = -1; + win->_parent = 0; + + win->_regtop = 0; + win->_regbottom = (NCURSES_SIZE_T) (num_lines - 1); + + win->_pad._pad_y = -1; + win->_pad._pad_x = -1; + win->_pad._pad_top = -1; + win->_pad._pad_bottom = -1; + win->_pad._pad_left = -1; + win->_pad._pad_right = -1; + + for (i = 0; i < num_lines; i++) { + /* + * This used to do + * + * win->_line[i].firstchar = win->_line[i].lastchar = _NOCHANGE; + * + * which marks the whole window unchanged. That's how + * SVr1 curses did it, but SVr4 curses marks the whole new + * window changed. + * + * With the old SVr1-like code, say you have stdscr full of + * characters, then create a new window with newwin(), + * then do a printw(win, "foo ");, the trailing spaces are + * completely ignored by the following refreshes. So, you + * get "foojunkjunk" on the screen instead of "foo " as + * you actually intended. + * + * SVr4 doesn't do this. Instead the spaces are actually written. + * So that's how we want ncurses to behave. + */ + win->_line[i].firstchar = 0; + win->_line[i].lastchar = (NCURSES_SIZE_T) (num_columns - 1); + + if_USE_SCROLL_HINTS(win->_line[i].oldindex = i); + } + + if (!is_padwin && (begx + num_columns == screen_columns(SP_PARM))) { + win->_flags |= _ENDLINE; + + if (begx == 0 && num_lines == screen_lines(SP_PARM) && begy == 0) + win->_flags |= _FULLWIN; + + if (begy + num_lines == screen_lines(SP_PARM)) + win->_flags |= _SCROLLWIN; + } + + wp->next = WindowList(SP_PARM); + wp->screen = SP_PARM; + WindowList(SP_PARM) = wp; + + T((T_CREATE("window %p"), (void *) win)); + + _nc_nonsp_unlock_global(curses); + returnWin(win); +} + +/* + * wgetch() and other functions with a WINDOW* parameter may use a SCREEN* + * internally, and it is useful to allow those to be invoked without switching + * SCREEN's, e.g., for multi-threaded applications. + */ +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(WINDOW *) +_nc_curscr_of(SCREEN *sp) +{ + return (sp == 0) ? NULL : CurScreen(sp); +} + +NCURSES_EXPORT(WINDOW *) +_nc_newscr_of(SCREEN *sp) +{ + return (sp == 0) ? NULL : NewScreen(sp); +} + +NCURSES_EXPORT(WINDOW *) +_nc_stdscr_of(SCREEN *sp) +{ + return (sp == 0) ? NULL : StdScreen(sp); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_nl.c b/contrib/ncurses/ncurses/base/lib_nl.c new file mode 100644 index 00000000..417b257d --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_nl.c @@ -0,0 +1,96 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * nl.c + * + * Routines: + * nl() + * nonl() + * + */ + +#include + +MODULE_ID("$Id: lib_nl.c,v 1.14 2023/04/29 18:51:49 tom Exp $") + +#ifdef __EMX__ +#include +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(nl) (NCURSES_SP_DCL0) +{ + T((T_CALLED("nl(%p)"), (void *) SP_PARM)); + if (0 == SP_PARM) + returnCode(ERR); + IsNl(SP_PARM) = TRUE; +#ifdef __EMX__ + _nc_flush(); + _fsetmode(NC_OUTPUT(SP_PARM), "t"); +#endif + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +nl(void) +{ + return NCURSES_SP_NAME(nl) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(nonl) (NCURSES_SP_DCL0) +{ + T((T_CALLED("nonl(%p)"), (void *) SP_PARM)); + if (0 == SP_PARM) + returnCode(ERR); + IsNl(SP_PARM) = FALSE; +#ifdef __EMX__ + _nc_flush(); + _fsetmode(NC_OUTPUT(SP_PARM), "b"); +#endif + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +nonl(void) +{ + return NCURSES_SP_NAME(nonl) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_overlay.c b/contrib/ncurses/ncurses/base/lib_overlay.c new file mode 100644 index 00000000..6d21c761 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_overlay.c @@ -0,0 +1,223 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2013,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_overlay.c +** +** The routines overlay(), copywin(), and overwrite(). +** +*/ + +#include + +MODULE_ID("$Id: lib_overlay.c,v 1.34 2023/09/16 16:39:07 tom Exp $") + +static int +overlap(const WINDOW *const src, WINDOW *const dst, int const flag) +{ + int rc = ERR; + + T((T_CALLED("overlap(%p,%p,%d)"), (const void *) src, (void *) dst, flag)); + + if (src != 0 && dst != 0) { + int sx1, sy1, sx2, sy2; + int dx1, dy1, dx2, dy2; + + _nc_lock_global(curses); + + T(("src : begy %ld, begx %ld, maxy %ld, maxx %ld", + (long) src->_begy, + (long) src->_begx, + (long) src->_maxy, + (long) src->_maxx)); + T(("dst : begy %ld, begx %ld, maxy %ld, maxx %ld", + (long) dst->_begy, + (long) dst->_begx, + (long) dst->_maxy, + (long) dst->_maxx)); + + sx1 = src->_begx; + sy1 = src->_begy; + sx2 = sx1 + src->_maxx; + sy2 = sy1 + src->_maxy; + + dx1 = dst->_begx; + dy1 = dst->_begy; + dx2 = dx1 + dst->_maxx; + dy2 = dy1 + dst->_maxy; + + if (dx2 >= sx1 && dx1 <= sx2 && dy2 >= sy1 && dy1 <= sy2) { + int sminrow = Max(sy1, dy1) - sy1; + int smincol = Max(sx1, dx1) - sx1; + int dminrow = Max(sy1, dy1) - dy1; + int dmincol = Max(sx1, dx1) - dx1; + int dmaxrow = Min(sy2, dy2) - dy1; + int dmaxcol = Min(sx2, dx2) - dx1; + + rc = copywin(src, dst, + sminrow, smincol, + dminrow, dmincol, + dmaxrow, dmaxcol, + flag); + } + _nc_unlock_global(curses); + } + returnCode(rc); +} + +/* +** +** overlay(win1, win2) +** +** +** overlay() writes the overlapping area of win1 behind win2 +** on win2 non-destructively. +** +**/ + +NCURSES_EXPORT(int) +overlay(const WINDOW *win1, WINDOW *win2) +{ + T((T_CALLED("overlay(%p,%p)"), (const void *) win1, (void *) win2)); + returnCode(overlap(win1, win2, TRUE)); +} + +/* +** +** overwrite(win1, win2) +** +** +** overwrite() writes the overlapping area of win1 behind win2 +** on win2 destructively. +** +**/ + +NCURSES_EXPORT(int) +overwrite(const WINDOW *win1, WINDOW *win2) +{ + T((T_CALLED("overwrite(%p,%p)"), (const void *) win1, (void *) win2)); + returnCode(overlap(win1, win2, FALSE)); +} + +NCURSES_EXPORT(int) +copywin(const WINDOW *src, WINDOW *dst, + int sminrow, int smincol, + int dminrow, int dmincol, + int dmaxrow, int dmaxcol, + int over) +{ + int rc = ERR; + + T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"), + (const void *) src, + (void *) dst, + sminrow, smincol, + dminrow, dmincol, + dmaxrow, dmaxcol, over)); + + if (src != 0 + && dst != 0 + && dmaxrow >= dminrow + && dmaxcol >= dmincol) { + attr_t bk; + attr_t mask; + + _nc_lock_global(curses); + + bk = AttrOf(dst->_nc_bkgd); + mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0); + + /* make sure rectangle exists in source */ + if ((sminrow + dmaxrow - dminrow) <= (src->_maxy + 1) && + (smincol + dmaxcol - dmincol) <= (src->_maxx + 1)) { + + T(("rectangle exists in source")); + + /* make sure rectangle fits in destination */ + if (dmaxrow <= dst->_maxy && dmaxcol <= dst->_maxx) { + int sx, sy, dx, dy; + bool copied = FALSE; + + T(("rectangle fits in destination")); + + for (dy = dminrow, sy = sminrow; + dy <= dmaxrow; + sy++, dy++) { + bool touched; + + if (dy < 0 || sy < 0) + continue; + + touched = FALSE; + for (dx = dmincol, sx = smincol; + dx <= dmaxcol; + sx++, dx++) { + + if (dx < 0 || sx < 0) + continue; + copied = TRUE; + + if (over) { + if ((CharOf(src->_line[sy].text[sx]) != L(' ')) && + (!CharEq(dst->_line[dy].text[dx], + src->_line[sy].text[sx]))) { + dst->_line[dy].text[dx] = + src->_line[sy].text[sx]; + SetAttr(dst->_line[dy].text[dx], + ((AttrOf(src->_line[sy].text[sx]) & + mask) | bk)); + touched = TRUE; + } + } else { + if (!CharEq(dst->_line[dy].text[dx], + src->_line[sy].text[sx])) { + dst->_line[dy].text[dx] = + src->_line[sy].text[sx]; + touched = TRUE; + } + } + } + if (touched) { + touchline(dst, dminrow, (dmaxrow - dminrow + 1)); + } + } + T(("finished copywin")); + if (copied) + rc = OK; + } + } + _nc_unlock_global(curses); + } + returnCode(rc); +} diff --git a/contrib/ncurses/ncurses/base/lib_pad.c b/contrib/ncurses/ncurses/base/lib_pad.c new file mode 100644 index 00000000..10ac5372 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_pad.c @@ -0,0 +1,349 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * lib_pad.c + * newpad -- create a new pad + * pnoutrefresh -- refresh a pad, no update + * pechochar -- add a char to a pad and refresh + */ + +#include + +MODULE_ID("$Id: lib_pad.c,v 1.51 2024/09/28 15:40:42 tom Exp $") + +NCURSES_EXPORT(WINDOW *) +NCURSES_SP_NAME(newpad) (NCURSES_SP_DCLx int l, int c) +{ + WINDOW *win; + NCURSES_CH_T *ptr; + int i; + + T((T_CALLED("newpad(%p,%d, %d)"), (void *) SP_PARM, l, c)); + + if (l <= 0 || c <= 0) + returnWin(0); + + win = NCURSES_SP_NAME(_nc_makenew) (NCURSES_SP_ARGx l, c, 0, 0, _ISPAD); + if (win == NULL) + returnWin(0); + + for (i = 0; i < l; i++) { + if_USE_SCROLL_HINTS(win->_line[i].oldindex = _NEWINDEX); + if ((win->_line[i].text = typeCalloc(NCURSES_CH_T, ((size_t) c))) == 0) { + (void) _nc_freewin(win); + returnWin(0); + } + for (ptr = win->_line[i].text; ptr < win->_line[i].text + c; ptr++) + SetChar(*ptr, BLANK_TEXT, BLANK_ATTR); + } + + returnWin(win); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(WINDOW *) +newpad(int l, int c) +{ + return NCURSES_SP_NAME(newpad) (CURRENT_SCREEN, l, c); +} +#endif + +NCURSES_EXPORT(WINDOW *) +subpad(WINDOW *orig, int l, int c, int begy, int begx) +{ + WINDOW *win = (WINDOW *) 0; + + T((T_CALLED("subpad(%d, %d)"), l, c)); + + if (orig) { + if (!IS_PAD(orig) + || ((win = derwin(orig, l, c, begy, begx)) == NULL)) + returnWin(0); + } + returnWin(win); +} + +NCURSES_EXPORT(int) +prefresh(WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) +{ +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(win); +#endif + + T((T_CALLED("prefresh()"))); + if (pnoutrefresh(win, pminrow, pmincol, sminrow, smincol, smaxrow, + smaxcol) != ERR + && NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG) != ERR) { + returnCode(OK); + } + returnCode(ERR); +} + +NCURSES_EXPORT(int) +pnoutrefresh(WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) +{ + int i, j; + int m, n; + int pmaxrow; + int pmaxcol; + SCREEN *sp; + +#if USE_SCROLL_HINTS + const int my_len = 2; /* parameterize the threshold for hardscroll */ + NCURSES_SIZE_T displaced; + bool wide; +#endif + + T((T_CALLED("pnoutrefresh(%p, %d, %d, %d, %d, %d, %d)"), + (void *) win, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)); + + if (win == 0) + returnCode(ERR); + + if (!IS_PAD(win)) + returnCode(ERR); + + sp = _nc_screen_of(win); + + /* negative values are interpreted as zero */ + if (pminrow < 0) + pminrow = 0; + if (pmincol < 0) + pmincol = 0; + if (sminrow < 0) + sminrow = 0; + if (smincol < 0) + smincol = 0; + + pmaxrow = pminrow + smaxrow - sminrow; + pmaxcol = pmincol + smaxcol - smincol; + + T((" pminrow + smaxrow - sminrow %ld, win->_maxy %ld", + (long) pmaxrow, (long) win->_maxy)); + T((" pmincol + smaxcol - smincol %ld, win->_maxx %ld", + (long) pmaxcol, (long) win->_maxx)); + + /* + * Trim the caller's screen size back to the actual limits. + */ + if (pmaxrow > win->_maxy) { + smaxrow -= (pmaxrow - win->_maxy); + pmaxrow = pminrow + smaxrow - sminrow; + } + if (pmaxcol > win->_maxx) { + smaxcol -= (pmaxcol - win->_maxx); + pmaxcol = pmincol + smaxcol - smincol; + } + + if (smaxrow >= screen_lines(sp) + || smaxcol >= screen_columns(sp) + || sminrow > smaxrow + || smincol > smaxcol) + returnCode(ERR); + + T(("pad being refreshed")); + +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE)) { + _tracedump("...pad", win); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ +#if USE_SCROLL_HINTS + if (win->_pad._pad_y >= 0) { + displaced = ((pminrow - win->_pad._pad_y) - + (sminrow - win->_pad._pad_top)); + T(("pad being shifted by %d line(s)", displaced)); + } else + displaced = 0; +#endif + + /* + * For pure efficiency, we'd want to transfer scrolling information + * from the pad to newscr whenever the window is wide enough that + * its update will dominate the cost of the update for the horizontal + * band of newscr that it occupies. Unfortunately, this threshold + * tends to be complex to estimate, and in any case scrolling the + * whole band and rewriting the parts outside win's image would look + * really ugly. So. What we do is consider the pad "wide" if it + * either (a) occupies the whole width of newscr, or (b) occupies + * all but at most one column on either vertical edge of the screen + * (this caters to fussy people who put boxes around full-screen + * windows). Note that changing this formula will not break any code, + * merely change the costs of various update cases. + */ +#if USE_SCROLL_HINTS + wide = (smincol < my_len && smaxcol > (NewScreen(sp)->_maxx - my_len)); +#endif + + for (i = pminrow, m = sminrow + win->_yoffset; + i <= pmaxrow && m <= NewScreen(sp)->_maxy; + i++, m++) { + register struct ldat *nline = &NewScreen(sp)->_line[m]; + register struct ldat *oline = &win->_line[i]; + for (j = pmincol, n = smincol; j <= pmaxcol; j++, n++) { + NCURSES_CH_T ch = oline->text[j]; +#if USE_WIDEC_SUPPORT + /* + * Special case for leftmost character of the displayed area. + * Only half of a double-width character may be visible. + */ + if (j == pmincol + && j > 0 + && isWidecExt(ch)) { + SetChar(ch, L(' '), AttrOf(oline->text[j - 1])); + } +#endif + if (!CharEq(ch, nline->text[n])) { + nline->text[n] = ch; + CHANGED_CELL(nline, n); + } + } + +#if USE_SCROLL_HINTS + if (wide) { + int nind = m + displaced; + if (oline->oldindex < 0 + || nind < sminrow + || nind > smaxrow) { + nind = _NEWINDEX; + } else if (displaced) { + register struct ldat *pline = &CurScreen(sp)->_line[nind]; + for (j = 0; j <= my_len; j++) { + int k = NewScreen(sp)->_maxx - j; + if (pline->text[j] != nline->text[j] + || pline->text[k] != nline->text[k]) { + nind = _NEWINDEX; + break; + } + } + } + + nline->oldindex = nind; + } +#endif /* USE_SCROLL_HINTS */ + oline->firstchar = oline->lastchar = _NOCHANGE; + if_USE_SCROLL_HINTS(oline->oldindex = i); + } + + /* + * Clean up debris from scrolling or resizing the pad, so we do not + * accidentally pick up the index value during the next call to this + * procedure. The only rows that should have an index value are those + * that are displayed during this cycle. + */ +#if USE_SCROLL_HINTS + for (i = pminrow - 1; (i >= 0) && (win->_line[i].oldindex >= 0); i--) + win->_line[i].oldindex = _NEWINDEX; + for (i = pmaxrow + 1; (i <= win->_maxy) + && (win->_line[i].oldindex >= 0); i++) + win->_line[i].oldindex = _NEWINDEX; +#endif + + win->_begx = (NCURSES_SIZE_T) smincol; + win->_begy = (NCURSES_SIZE_T) sminrow; + + if (win->_clear) { + win->_clear = FALSE; + NewScreen(sp)->_clear = TRUE; + } + + /* + * Use the pad's current position, if it will be visible. + * If not, don't do anything; it is not an error. + */ + if (win->_leaveok == FALSE + && win->_cury >= pminrow + && win->_curx >= pmincol + && win->_cury <= pmaxrow + && win->_curx <= pmaxcol) { + NewScreen(sp)->_cury = (NCURSES_SIZE_T) (win->_cury - pminrow + + win->_begy + win->_yoffset); + NewScreen(sp)->_curx = (NCURSES_SIZE_T) (win->_curx - pmincol + + win->_begx); + } + NewScreen(sp)->_leaveok = win->_leaveok; + win->_flags &= ~_HASMOVED; + + /* + * Update our cache of the line-numbers that we displayed from the pad. + * We will use this on subsequent calls to this function to derive + * values to stuff into 'oldindex[]' -- for scrolling optimization. + */ + win->_pad._pad_y = (NCURSES_SIZE_T) pminrow; + win->_pad._pad_x = (NCURSES_SIZE_T) pmincol; + win->_pad._pad_top = (NCURSES_SIZE_T) sminrow; + win->_pad._pad_left = (NCURSES_SIZE_T) smincol; + win->_pad._pad_bottom = (NCURSES_SIZE_T) smaxrow; + win->_pad._pad_right = (NCURSES_SIZE_T) smaxcol; + + returnCode(OK); +} + +NCURSES_EXPORT(int) +pechochar(WINDOW *pad, const chtype ch) +{ + T((T_CALLED("pechochar(%p, %s)"), (void *) pad, _tracechtype(ch))); + + if (pad == 0) + returnCode(ERR); + + if (!IS_PAD(pad)) + returnCode(wechochar(pad, ch)); + + waddch(pad, ch); + prefresh(pad, pad->_pad._pad_y, + pad->_pad._pad_x, + pad->_pad._pad_top, + pad->_pad._pad_left, + pad->_pad._pad_bottom, + pad->_pad._pad_right); + + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/base/lib_printw.c b/contrib/ncurses/ncurses/base/lib_printw.c new file mode 100644 index 00000000..0b168cca --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_printw.c @@ -0,0 +1,167 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + ****************************************************************************/ + +/* +** lib_printw.c +** +** The routines printw(), wprintw() and friends. +** +*/ + +#include + +MODULE_ID("$Id: lib_printw.c,v 1.29 2024/07/27 19:22:23 tom Exp $") + +NCURSES_EXPORT(int) +printw(const char *fmt, ...) +{ + va_list argp; + int code; + +#ifdef TRACE + va_list argq; + va_start(argq, fmt); + T((T_CALLED("printw(%s%s)"), + _nc_visbuf(fmt), _nc_varargs(fmt, argq))); + va_end(argq); +#endif + + va_start(argp, fmt); + code = vw_printw(stdscr, fmt, argp); + va_end(argp); + + returnCode(code); +} + +NCURSES_EXPORT(int) +wprintw(WINDOW *win, const char *fmt, ...) +{ + va_list argp; + int code; + +#ifdef TRACE + va_list argq; + va_start(argq, fmt); + T((T_CALLED("wprintw(%p,%s%s)"), + (void *) win, _nc_visbuf(fmt), _nc_varargs(fmt, argq))); + va_end(argq); +#endif + + va_start(argp, fmt); + code = vw_printw(win, fmt, argp); + va_end(argp); + + returnCode(code); +} + +NCURSES_EXPORT(int) +mvprintw(int y, int x, const char *fmt, ...) +{ + int code; + +#ifdef TRACE + va_list argq; + va_start(argq, fmt); + T((T_CALLED("mvprintw(%d,%d,%s%s)"), + y, x, _nc_visbuf(fmt), _nc_varargs(fmt, argq))); + va_end(argq); +#endif + + if ((code = move(y, x)) != ERR) { + va_list argp; + + va_start(argp, fmt); + code = vw_printw(stdscr, fmt, argp); + va_end(argp); + } + returnCode(code); +} + +NCURSES_EXPORT(int) +mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...) +{ + int code; + +#ifdef TRACE + va_list argq; + va_start(argq, fmt); + T((T_CALLED("mvwprintw(%d,%d,%p,%s%s)"), + y, x, (void *) win, _nc_visbuf(fmt), _nc_varargs(fmt, argq))); + va_end(argq); +#endif + + if ((code = wmove(win, y, x)) != ERR) { + va_list argp; + + va_start(argp, fmt); + code = vw_printw(win, fmt, argp); + va_end(argp); + } + returnCode(code); +} + +NCURSES_EXPORT(int) +vwprintw(WINDOW *win, const char *fmt, va_list argp) +{ + const char *buf; + int code = ERR; +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(win); +#endif + + T((T_CALLED("vwprintw(%p,%s,va_list)"), (void *) win, _nc_visbuf(fmt))); + + buf = NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_ARGx fmt, argp); + if (buf != 0) { + code = waddstr(win, buf); + } + returnCode(code); +} + +NCURSES_EXPORT(int) +vw_printw(WINDOW *win, const char *fmt, va_list argp) +{ + const char *buf; + int code = ERR; +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(win); +#endif + + T((T_CALLED("vw_printw(%p,%s,va_list)"), (void *) win, _nc_visbuf(fmt))); + + buf = NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_ARGx fmt, argp); + if (buf != 0) { + code = waddstr(win, buf); + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_redrawln.c b/contrib/ncurses/ncurses/base/lib_redrawln.c new file mode 100644 index 00000000..c99d6992 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_redrawln.c @@ -0,0 +1,88 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997 * + ****************************************************************************/ + +/* + * lib_redrawln.c + * + * The routine wredrawln(). + * + */ + +#include + +MODULE_ID("$Id: lib_redrawln.c,v 1.18 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wredrawln(WINDOW *win, int beg, int num) +{ + int i; + int end; + size_t len; + SCREEN *sp; + + T((T_CALLED("wredrawln(%p,%d,%d)"), (void *) win, beg, num)); + + if (win == 0) + returnCode(ERR); + + sp = _nc_screen_of(win); + + if (beg < 0) + beg = 0; + + if (touchline(win, beg, num) == ERR) + returnCode(ERR); + + if (touchline(CurScreen(sp), beg + win->_begy, num) == ERR) + returnCode(ERR); + + end = beg + num; + if (end > CurScreen(sp)->_maxy + 1 - win->_begy) + end = CurScreen(sp)->_maxy + 1 - win->_begy; + if (end > win->_maxy + 1) + end = win->_maxy + 1; + + len = (size_t) (win->_maxx + 1); + if (len > (size_t) (CurScreen(sp)->_maxx + 1 - win->_begx)) + len = (size_t) (CurScreen(sp)->_maxx + 1 - win->_begx); + len *= sizeof(CurScreen(sp)->_line[0].text[0]); + + for (i = beg; i < end; i++) { + int crow = i + win->_begy; + + memset(CurScreen(sp)->_line[crow].text + win->_begx, 0, len); + NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_ARGx crow); + } + + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/base/lib_refresh.c b/contrib/ncurses/ncurses/base/lib_refresh.c new file mode 100644 index 00000000..e43e28d6 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_refresh.c @@ -0,0 +1,307 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2010,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* + * lib_refresh.c + * + * The routines wrefresh() and wnoutrefresh(). + * + */ + +#include + +MODULE_ID("$Id: lib_refresh.c,v 1.49 2024/09/22 20:17:40 tom Exp $") + +NCURSES_EXPORT(int) +wrefresh(WINDOW *win) +{ + int code; +#if NCURSES_SP_FUNCS + SCREEN *SP_PARM = _nc_screen_of(win); +#endif + + T((T_CALLED("wrefresh(%p)"), (void *) win)); + + if (SP_PARM == NULL || win == NULL) { + code = ERR; + } else if (win == CurScreen(SP_PARM)) { + CurScreen(SP_PARM)->_clear = TRUE; + code = NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG); + } else if ((code = wnoutrefresh(win)) == OK) { + if (win->_clear) + NewScreen(SP_PARM)->_clear = TRUE; + code = NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG); + /* + * Reset the clearok() flag in case it was set for the special + * case in hardscroll.c (if we don't reset it here, we'll get 2 + * refreshes because the flag is copied from stdscr to newscr). + * Resetting the flag shouldn't do any harm, anyway. + */ + win->_clear = FALSE; + } + returnCode(code); +} + +NCURSES_EXPORT(int) +wnoutrefresh(WINDOW *win) +{ + int limit_x; + int src_row, src_col; + int begx; + int begy; + int dst_row, dst_col; +#if USE_SCROLL_HINTS + bool wide; +#endif +#if NCURSES_SP_FUNCS + SCREEN *SP_PARM = _nc_screen_of(win); +#endif + + T((T_CALLED("wnoutrefresh(%p)"), (void *) win)); + + if (SP_PARM == NULL || win == NULL) + returnCode(ERR); + + /* + * Handle pads as a special case. + */ + if (IS_PAD(win)) { + returnCode(pnoutrefresh(win, + win->_pad._pad_y, + win->_pad._pad_x, + win->_pad._pad_top, + win->_pad._pad_left, + win->_pad._pad_bottom, + win->_pad._pad_right)); + } +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE)) { + _tracedump("...win", win); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + + /* put them here so "win == 0" won't break our code */ + begx = win->_begx; + begy = win->_begy; + + NewScreen(SP_PARM)->_nc_bkgd = win->_nc_bkgd; + WINDOW_ATTRS(NewScreen(SP_PARM)) = WINDOW_ATTRS(win); + + /* merge in change information from all subwindows of this window */ + wsyncdown(win); + +#if USE_SCROLL_HINTS + /* + * For pure efficiency, we'd want to transfer scrolling information + * from the window to newscr whenever the window is wide enough that + * its update will dominate the cost of the update for the horizontal + * band of newscr that it occupies. Unfortunately, this threshold + * tends to be complex to estimate, and in any case scrolling the + * whole band and rewriting the parts outside win's image would look + * really ugly. So. What we do is consider the window "wide" if it + * either (a) occupies the whole width of newscr, or (b) occupies + * all but at most one column on either vertical edge of the screen + * (this caters to fussy people who put boxes around full-screen + * windows). Note that changing this formula will not break any code, + * merely change the costs of various update cases. + */ + wide = (begx <= 1 && win->_maxx >= (NewScreen(SP_PARM)->_maxx - 1)); +#endif + + win->_flags &= ~_HASMOVED; + + /* + * Microtweaking alert! This double loop is one of the genuine + * hot spots in the code. Even gcc doesn't seem to do enough + * common-subexpression chunking to make it really tense, + * so we'll force the issue. + */ + + /* limit(dst_col) */ + limit_x = win->_maxx; + /* limit(src_col) */ + if (limit_x > NewScreen(SP_PARM)->_maxx - begx) + limit_x = NewScreen(SP_PARM)->_maxx - begx; + + for (src_row = 0, dst_row = begy + win->_yoffset; + src_row <= win->_maxy && dst_row <= NewScreen(SP_PARM)->_maxy; + src_row++, dst_row++) { + struct ldat *nline = &(NewScreen(SP_PARM)->_line[dst_row]); + struct ldat *oline = &win->_line[src_row]; + + if (oline->firstchar != _NOCHANGE) { + int last_src = oline->lastchar; + + if (last_src > limit_x) + last_src = limit_x; + + src_col = oline->firstchar; + dst_col = src_col + begx; + + if_WIDEC({ + int j; + + /* + * Ensure that we will copy complete multi-column characters + * on the left-boundary. + */ + if (isWidecExt(oline->text[src_col])) { + j = 1 + dst_col - WidecExt(oline->text[src_col]); + if (j < 0) + j = 0; + if (dst_col > j) { + src_col -= (dst_col - j); + dst_col = j; + } + } + + /* + * Ensure that we will copy complete multi-column characters + * on the right-boundary. + */ + j = last_src; + if (WidecExt(oline->text[j])) { + ++j; + while (j <= limit_x) { + if (isWidecBase(oline->text[j])) { + break; + } else { + last_src = j; + } + ++j; + } + } + }); + + if_WIDEC({ + int last_dst = begx + ((last_src < win->_maxx) + ? last_src + : win->_maxx); + int fix_left = dst_col; + int fix_right = last_dst; + int j; + + /* + * Check for boundary cases where we may overwrite part of a + * multi-column character. For those, wipe the remainder of + * the character to blanks. + */ + j = dst_col; + if (isWidecExt(nline->text[j])) { + /* + * On the left, we only care about multi-column characters + * that extend into the changed region. + */ + fix_left = 1 + j - WidecExt(nline->text[j]); + if (fix_left < 0) + fix_left = 0; /* only if cell is corrupt */ + } + + j = last_dst; + if (WidecExt(nline->text[j]) != 0) { + /* + * On the right, any multi-column character is a problem, + * unless it happens to be contained in the change, and + * ending at the right boundary of the change. The + * computation for 'fix_left' accounts for the left-side of + * this character. Find the end of the character. + */ + ++j; + while (j <= NewScreen(SP_PARM)->_maxx && + isWidecExt(nline->text[j])) { + fix_right = j++; + } + } + + /* + * The analysis is simpler if we do the clearing afterwards. + * Do that now. + */ + if (fix_left < dst_col || fix_right > last_dst) { + for (j = fix_left; j <= fix_right; ++j) { + static cchar_t blank = BLANK; + nline->text[j] = blank; + CHANGED_CELL(nline, j); + } + } + }); + + /* + * Copy the changed text. + */ + for (; src_col <= last_src; src_col++, dst_col++) { + if (!CharEq(oline->text[src_col], nline->text[dst_col])) { + nline->text[dst_col] = oline->text[src_col]; + CHANGED_CELL(nline, dst_col); + } + } + + } +#if USE_SCROLL_HINTS + if (wide) { + int oind = oline->oldindex; + + nline->oldindex = ((oind == _NEWINDEX) + ? _NEWINDEX + : (begy + oind + win->_yoffset)); + } +#endif /* USE_SCROLL_HINTS */ + + oline->firstchar = oline->lastchar = _NOCHANGE; + if_USE_SCROLL_HINTS(oline->oldindex = src_row); + } + + if (win->_clear) { + win->_clear = FALSE; + NewScreen(SP_PARM)->_clear = TRUE; + } + + if (!win->_leaveok) { + NewScreen(SP_PARM)->_cury = (NCURSES_SIZE_T) (win->_cury + + win->_begy + win->_yoffset); + NewScreen(SP_PARM)->_curx = (NCURSES_SIZE_T) (win->_curx + win->_begx); + } + NewScreen(SP_PARM)->_leaveok = win->_leaveok; + +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE)) { + _tracedump("newscr", NewScreen(SP_PARM)); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/base/lib_restart.c b/contrib/ncurses/ncurses/base/lib_restart.c new file mode 100644 index 00000000..0c61cb7e --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_restart.c @@ -0,0 +1,115 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2012,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2008 * + ****************************************************************************/ + +/* + * Terminfo-only terminal setup routines: + * + * int restartterm(const char *, int, int *) + */ + +#include + +MODULE_ID("$Id: lib_restart.c,v 1.18 2023/04/29 19:01:25 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(restartterm) (NCURSES_SP_DCLx + NCURSES_CONST char *termp, + int filenum, + int *errret) +{ + int result; +#ifdef USE_TERM_DRIVER + TERMINAL *new_term = 0; +#endif + + START_TRACE(); + T((T_CALLED("restartterm(%p,%s,%d,%p)"), + (void *) SP_PARM, + termp, + filenum, + (void *) errret)); + + if (TINFO_SETUP_TERM(&new_term, termp, filenum, errret, FALSE) != OK) { + result = ERR; + } else if (SP_PARM != 0) { + TTY_FLAGS save_flags = SP_PARM->_tty_flags; + +#ifdef USE_TERM_DRIVER + SP_PARM->_term = new_term; +#endif + if (save_flags._echo) { + NCURSES_SP_NAME(echo) (NCURSES_SP_ARG); + } else { + NCURSES_SP_NAME(noecho) (NCURSES_SP_ARG); + } + + if (save_flags._cbreak) { + NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG); + NCURSES_SP_NAME(noraw) (NCURSES_SP_ARG); + } else if (save_flags._raw) { + NCURSES_SP_NAME(nocbreak) (NCURSES_SP_ARG); + NCURSES_SP_NAME(raw) (NCURSES_SP_ARG); + } else { + NCURSES_SP_NAME(nocbreak) (NCURSES_SP_ARG); + NCURSES_SP_NAME(noraw) (NCURSES_SP_ARG); + } + if (save_flags._nl) { + NCURSES_SP_NAME(nl) (NCURSES_SP_ARG); + } else { + NCURSES_SP_NAME(nonl) (NCURSES_SP_ARG); + } + + NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); + +#if USE_SIZECHANGE + _nc_update_screensize(SP_PARM); +#endif + + result = OK; + } else { + result = ERR; + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +restartterm(NCURSES_CONST char *termp, int filenum, int *errret) +{ + START_TRACE(); + return NCURSES_SP_NAME(restartterm) (CURRENT_SCREEN, termp, filenum, errret); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_scanw.c b/contrib/ncurses/ncurses/base/lib_scanw.c new file mode 100644 index 00000000..1ed36a52 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_scanw.c @@ -0,0 +1,126 @@ +/**************************************************************************** + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2009,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_scanw.c +** +** The routines scanw(), wscanw() and friends. +** +*/ + +#include + +MODULE_ID("$Id: lib_scanw.c,v 1.19 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +vwscanw(WINDOW *win, const char *fmt, va_list argp) +{ + char buf[BUFSIZ]; + int code = ERR; + + if (wgetnstr(win, buf, (int) sizeof(buf) - 1) != ERR) { + if ((code = vsscanf(buf, fmt, argp)) == EOF) { + code = ERR; + } + } + + return code; +} + +NCURSES_EXPORT(int) +vw_scanw(WINDOW *win, const char *fmt, va_list argp) +{ + char buf[BUFSIZ]; + int code = ERR; + + if (wgetnstr(win, buf, (int) sizeof(buf) - 1) != ERR) { + if ((code = vsscanf(buf, fmt, argp)) == EOF) { + code = ERR; + } + } + + return code; +} + +NCURSES_EXPORT(int) +scanw(const char *fmt, ...) +{ + int code; + va_list ap; + + T(("scanw(\"%s\",...) called", fmt)); + + va_start(ap, fmt); + code = vw_scanw(stdscr, fmt, ap); + va_end(ap); + return (code); +} + +NCURSES_EXPORT(int) +wscanw(WINDOW *win, const char *fmt, ...) +{ + int code; + va_list ap; + + T(("wscanw(%p,\"%s\",...) called", (void *) win, fmt)); + + va_start(ap, fmt); + code = vw_scanw(win, fmt, ap); + va_end(ap); + return (code); +} + +NCURSES_EXPORT(int) +mvscanw(int y, int x, const char *fmt, ...) +{ + int code; + va_list ap; + + va_start(ap, fmt); + code = (move(y, x) == OK) ? vw_scanw(stdscr, fmt, ap) : ERR; + va_end(ap); + return (code); +} + +NCURSES_EXPORT(int) +mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...) +{ + int code; + va_list ap; + + va_start(ap, fmt); + code = (wmove(win, y, x) == OK) ? vw_scanw(win, fmt, ap) : ERR; + va_end(ap); + return (code); +} diff --git a/contrib/ncurses/ncurses/base/lib_screen.c b/contrib/ncurses/ncurses/base/lib_screen.c new file mode 100644 index 00000000..c1640bb2 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_screen.c @@ -0,0 +1,1086 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 1998-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996 on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +#include + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_screen.c,v 1.109 2024/10/05 20:47:44 tom Exp $") + +#define MAX_SIZE 0x3fff /* 16k is big enough for a window or pad */ + +#define MARKER '\\' +#define APPEND '+' +#define GUTTER '|' +#define L_CURL '{' +#define R_CURL '}' + +#if USE_STRING_HACKS && HAVE_SNPRINTF +#define ARG_SLIMIT(name) size_t name, +#else +#define ARG_SLIMIT(name) /* nothing */ +#endif + +#define CUR_SLIMIT _nc_SLIMIT(limit - (size_t) (target - base)) +#define TOP_SLIMIT _nc_SLIMIT(sizeof(buffer)) + +/* + * Use 0x888888 as the magic number for new-format files, since it cannot be + * mistaken for the _cury/_curx pair of 16-bit numbers which start the old + * format. It happens to be unused in the file 5.22 database (2015/03/07). + */ +static const char my_magic[] = +{'\210', '\210', '\210', '\210', 0}; + +#if NCURSES_EXT_PUTWIN +typedef enum { + pINT /* int */ + ,pSHORT /* short */ + ,pBOOL /* bool */ + ,pATTR /* attr_t */ + ,pCHAR /* chtype */ + ,pSIZE /* NCURSES_SIZE_T */ +#if NCURSES_WIDECHAR + ,pCCHAR /* cchar_t */ +#endif +} PARAM_TYPE; + +typedef struct { + const char name[11]; + attr_t attr; +} SCR_ATTRS; + +typedef struct { + const char name[17]; + PARAM_TYPE type; + size_t offset; +} SCR_PARAMS; + +#define DATA(name) { { #name }, A_##name } +static const SCR_ATTRS scr_attrs[] = +{ + DATA(NORMAL), + DATA(STANDOUT), + DATA(UNDERLINE), + DATA(REVERSE), + DATA(BLINK), + DATA(DIM), + DATA(BOLD), + DATA(ALTCHARSET), + DATA(INVIS), + DATA(PROTECT), + DATA(HORIZONTAL), + DATA(LEFT), + DATA(LOW), + DATA(RIGHT), + DATA(TOP), + DATA(VERTICAL), + +#ifdef A_ITALIC + DATA(ITALIC), +#endif +}; +#undef DATA + +#define DATA(name, type) { { #name }, type, offsetof(WINDOW, name) } + +static const SCR_PARAMS scr_params[] = +{ + DATA(_cury, pSIZE), + DATA(_curx, pSIZE), + DATA(_maxy, pSIZE), + DATA(_maxx, pSIZE), + DATA(_begy, pSIZE), + DATA(_begx, pSIZE), + DATA(_flags, pSHORT), + DATA(_attrs, pATTR), + DATA(_bkgd, pCHAR), + DATA(_notimeout, pBOOL), + DATA(_clear, pBOOL), + DATA(_leaveok, pBOOL), + DATA(_scroll, pBOOL), + DATA(_idlok, pBOOL), + DATA(_idcok, pBOOL), + DATA(_immed, pBOOL), + DATA(_sync, pBOOL), + DATA(_use_keypad, pBOOL), + DATA(_delay, pINT), + DATA(_regtop, pSIZE), + DATA(_regbottom, pSIZE), + DATA(_pad._pad_y, pSIZE), + DATA(_pad._pad_x, pSIZE), + DATA(_pad._pad_top, pSIZE), + DATA(_pad._pad_left, pSIZE), + DATA(_pad._pad_bottom, pSIZE), + DATA(_pad._pad_right, pSIZE), + DATA(_yoffset, pSIZE), +#if NCURSES_WIDECHAR + DATA(_bkgrnd, pCCHAR), +#if NCURSES_EXT_COLORS + DATA(_color, pINT), +#endif +#endif +}; +#undef DATA + +static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); + +/* + * Allocate and read a line of text. Caller must free it. + */ +static char * +read_txt(FILE *fp) +{ + size_t limit = 1024; + char *result = malloc(limit); + char *buffer; + + if (result != 0) { + int ch = 0; + size_t used = 0; + + clearerr(fp); + result[used] = '\0'; + do { + if (used + 2 >= limit) { + limit += 1024; + buffer = realloc(result, limit); + if (buffer == 0) { + free(result); + result = 0; + break; + } + result = buffer; + } + ch = fgetc(fp); + if (ch == EOF) + break; + result[used++] = (char) ch; + result[used] = '\0'; + } while (ch != '\n'); + + if (ch == '\n') { + result[--used] = '\0'; + TR(TRACE_IEVENT, ("READ:%s", result)); + } else if (used == 0) { + free(result); + result = 0; + } + } + return result; +} + +static char * +decode_attr(char *source, attr_t *target, int *color) +{ + bool found = FALSE; + + TR(TRACE_IEVENT, ("decode_attr '%s'", source)); + + while (*source) { + if (source[0] == MARKER && source[1] == L_CURL) { + source += 2; + found = TRUE; + } else if (source[0] == R_CURL) { + source++; + found = FALSE; + } else if (found) { + char *next = source; + + if (source[0] == GUTTER) { + ++next; + } else if (*next == 'C') { + int value = 0; + unsigned pair; + next++; + while (isdigit(UChar(*next))) { + value = value * 10 + (*next++ - '0'); + } + *target &= ~A_COLOR; + pair = (unsigned) ((value > 256) + ? COLOR_PAIR(255) + : COLOR_PAIR(value)); + *target |= pair; + *color = value; + } else { + size_t n; + + while (isalnum(UChar(*next))) { + ++next; + } + for (n = 0; n < SIZEOF(scr_attrs); ++n) { + if ((size_t) (next - source) == strlen(scr_attrs[n].name)) { + if (scr_attrs[n].attr) { + *target |= scr_attrs[n].attr; + } else { + *target = A_NORMAL; + } + break; + } + } + } + source = next; + } else { + break; + } + } + return source; +} + +static char * +decode_char(char *source, int *target) +{ + int limit = 0; + int base = 16; + const char digits[] = "0123456789abcdef"; + + TR(TRACE_IEVENT, ("decode_char '%s'", source)); + *target = ' '; + switch (*source) { + case MARKER: + switch (*++source) { + case APPEND: + break; + case MARKER: + *target = MARKER; + ++source; + break; + case 's': + *target = ' '; + ++source; + break; + case '0': + case '1': + case '2': + case '3': + base = 8; + limit = 3; + break; + case 'u': + limit = 4; + ++source; + break; + case 'U': + limit = 8; + ++source; + break; + } + if (limit) { + *target = 0; + while (limit-- > 0) { + const char *find = strchr(digits, *source++); + int ch = (find != 0) ? (int) (find - digits) : -1; + *target *= base; + if (ch >= 0 && ch < base) { + *target += ch; + } + } + } + break; + default: + *target = *source++; + break; + } + return source; +} + +static char * +decode_chtype(char *source, chtype fillin, chtype *target) +{ + attr_t attr = ChAttrOf(fillin); + int color = PAIR_NUMBER((int) attr); + int value; + + TR(TRACE_IEVENT, ("decode_chtype '%s'", source)); + source = decode_attr(source, &attr, &color); + source = decode_char(source, &value); + *target = (ChCharOf(value) | attr | (chtype) COLOR_PAIR(color)); + /* FIXME - ignore combining characters */ + return source; +} + +#if NCURSES_WIDECHAR +static char * +decode_cchar(char *source, const cchar_t *fillin, cchar_t *target) +{ + int color; + attr_t attr = fillin->attr; + wchar_t chars[CCHARW_MAX]; + int append = 0; + int value = 0; + + TR(TRACE_IEVENT, ("decode_cchar '%s'", source)); + *target = blank; +#if NCURSES_EXT_COLORS + color = fillin->ext_color; +#else + color = (int) PAIR_NUMBER(attr); +#endif + source = decode_attr(source, &attr, &color); + memset(chars, 0, sizeof(chars)); + source = decode_char(source, &value); + chars[0] = (wchar_t) value; + /* handle combining characters */ + while (source[0] == MARKER && source[1] == APPEND) { + source += 2; + source = decode_char(source, &value); + if (++append < CCHARW_MAX) { + chars[append] = (wchar_t) value; + } + } + setcchar(target, chars, attr, (short) color, &color); + return source; +} +#endif + +static int +read_win(WINDOW *win, FILE *fp) +{ + int code = ERR; + size_t n; + int color; +#if NCURSES_WIDECHAR + NCURSES_CH_T prior; +#endif + chtype prior2; + + memset(win, 0, sizeof(WINDOW)); + for (;;) { + const char *name; + char *value; + char *txt = read_txt(fp); + + if (txt == 0) + break; + if (!strcmp(txt, "rows:")) { + free(txt); + code = OK; + break; + } + if ((value = strchr(txt, '=')) == 0) { + free(txt); + continue; + } + *value++ = '\0'; + name = !strcmp(txt, "flag") ? value : txt; + for (n = 0; n < SIZEOF(scr_params); ++n) { + if (!strcmp(name, scr_params[n].name)) { + void *data = (void *) ((char *) win + scr_params[n].offset); + + switch (scr_params[n].type) { + case pATTR: + (void) decode_attr(value, data, &color); + break; + case pBOOL: + *(bool *) data = TRUE; + break; + case pCHAR: + prior2 = ' '; + decode_chtype(value, prior2, data); + break; + case pINT: + *(int *) data = atoi(value); + break; + case pSHORT: + *(short *) data = (short) atoi(value); + break; + case pSIZE: + *(NCURSES_SIZE_T *) data = (NCURSES_SIZE_T) atoi(value); + break; +#if NCURSES_WIDECHAR + case pCCHAR: + prior = blank; + decode_cchar(value, &prior, data); + break; +#endif + } + break; + } + } + free(txt); + } + return code; +} + +static int +read_row(char *source, NCURSES_CH_T *prior, NCURSES_CH_T *target, int length) +{ + while (*source != '\0' && length > 0) { +#if NCURSES_WIDECHAR + int len; + + source = decode_cchar(source, prior, target); + len = _nc_wacs_width(target->chars[0]); + if (len > 1) { + int n; + + SetWidecExt(CHDEREF(target), 0); + for (n = 1; n < len; ++n) { + target[n] = target[0]; + SetWidecExt(CHDEREF(target), n); + } + target += (len - 1); + length -= (len - 1); + } +#else + source = decode_chtype(source, *prior, target); +#endif + *prior = *target; + ++target; + --length; + } + while (length-- > 0) { + *target++ = blank; + } + /* FIXME - see what error conditions should apply if I need to return ERR */ + return 0; +} +#endif /* NCURSES_EXT_PUTWIN */ + +/* + * Originally, getwin/putwin used fread/fwrite, because they used binary data. + * The new format uses printable ASCII, which does not have as predictable + * sizes. Consequently, we use buffered I/O, e.g., fgetc/fprintf, which need + * special handling if we want to read screen dumps from an older library. + */ +static int +read_block(void *target, size_t length, FILE *fp) +{ + int result = 0; + char *buffer = target; + + clearerr(fp); + while (length-- != 0) { + int ch = fgetc(fp); + if (ch == EOF) { + result = -1; + break; + } + *buffer++ = (char) ch; + } + return result; +} + +NCURSES_EXPORT(WINDOW *) +NCURSES_SP_NAME(getwin) (NCURSES_SP_DCLx FILE *filep) +{ + WINDOW tmp, *nwin; + bool old_format = FALSE; + + T((T_CALLED("getwin(%p)"), (void *) filep)); + + if (filep == 0) { + returnWin(0); + } + + /* + * Read the first 4 bytes to determine first if this is an old-format + * screen-dump, or new-format. + */ + if (read_block(&tmp, (size_t) 4, filep) < 0) { + returnWin(0); + } + /* + * If this is a new-format file, and we do not support it, give up. + */ + if (!memcmp(&tmp, my_magic, (size_t) 4)) { +#if NCURSES_EXT_PUTWIN + if (read_win(&tmp, filep) < 0) +#endif + returnWin(0); + } else if (read_block(((char *) &tmp) + 4, sizeof(WINDOW) - 4, filep) < 0) { + returnWin(0); + } else { + old_format = TRUE; + } + + /* + * Check the window-size: + */ + if (tmp._maxy == 0 || + tmp._maxy > MAX_SIZE || + tmp._maxx == 0 || + tmp._maxx > MAX_SIZE) { + returnWin(0); + } + + if (IS_PAD(&tmp)) { + nwin = NCURSES_SP_NAME(newpad) (NCURSES_SP_ARGx + tmp._maxy + 1, + tmp._maxx + 1); + } else { + nwin = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx + tmp._maxy + 1, + tmp._maxx + 1, 0, 0); + } + + /* + * We deliberately do not restore the _parx, _pary, or _parent + * fields, because the window hierarchy within which they + * made sense is probably gone. + */ + if (nwin != 0) { + int n; + size_t linesize = sizeof(NCURSES_CH_T) * (size_t) (tmp._maxx + 1); + + nwin->_curx = tmp._curx; + nwin->_cury = tmp._cury; + nwin->_maxy = tmp._maxy; + nwin->_maxx = tmp._maxx; + nwin->_begy = tmp._begy; + nwin->_begx = tmp._begx; + nwin->_yoffset = tmp._yoffset; + nwin->_flags = tmp._flags & ~(_SUBWIN); + + WINDOW_ATTRS(nwin) = WINDOW_ATTRS(&tmp); + nwin->_nc_bkgd = tmp._nc_bkgd; + + nwin->_notimeout = tmp._notimeout; + nwin->_clear = tmp._clear; + nwin->_leaveok = tmp._leaveok; + nwin->_idlok = tmp._idlok; + nwin->_idcok = tmp._idcok; + nwin->_immed = tmp._immed; + nwin->_scroll = tmp._scroll; + nwin->_sync = tmp._sync; + nwin->_use_keypad = tmp._use_keypad; + nwin->_delay = tmp._delay; + + nwin->_regtop = tmp._regtop; + nwin->_regbottom = tmp._regbottom; + + if (IS_PAD(&tmp)) + nwin->_pad = tmp._pad; + + if (old_format) { + T(("reading old-format screen dump")); + for (n = 0; n <= nwin->_maxy; n++) { + if (read_block(nwin->_line[n].text, linesize, filep) < 0) { + delwin(nwin); + returnWin(0); + } + } + } +#if NCURSES_EXT_PUTWIN + else { + char *txt = 0; + bool success = TRUE; + NCURSES_CH_T prior = blank; + + T(("reading new-format screen dump")); + for (n = 0; n <= nwin->_maxy; n++) { + long row; + char *next; + + if ((txt = read_txt(filep)) == 0) { + T(("...failed to read string for row %d", n + 1)); + success = FALSE; + break; + } + row = strtol(txt, &next, 10); + if (row != (n + 1) || *next != ':') { + T(("...failed to read row-number %d", n + 1)); + success = FALSE; + break; + } + + if (read_row(++next, &prior, nwin->_line[n].text, tmp._maxx + + 1) < 0) { + T(("...failed to read cells for row %d", n + 1)); + success = FALSE; + break; + } + free(txt); + txt = 0; + } + + if (!success) { + free(txt); + delwin(nwin); + returnWin(0); + } + } +#endif + touchwin(nwin); + } + returnWin(nwin); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(WINDOW *) +getwin(FILE *filep) +{ + return NCURSES_SP_NAME(getwin) (CURRENT_SCREEN, filep); +} +#endif + +#if NCURSES_EXT_PUTWIN +static void +encode_attr(char *target, ARG_SLIMIT(limit) + attr_t source, + attr_t prior, + int source_color, + int prior_color) +{ +#if USE_STRING_HACKS && HAVE_SNPRINTF + char *base = target; +#endif + source &= ~A_CHARTEXT; + prior &= ~A_CHARTEXT; + + *target = '\0'; + if ((source != prior) || (source_color != prior_color)) { + size_t n; + bool first = TRUE; + + *target++ = MARKER; + *target++ = L_CURL; + + for (n = 0; n < SIZEOF(scr_attrs); ++n) { + if ((source & scr_attrs[n].attr) != 0 || + ((source & ALL_BUT_COLOR) == 0 && + (scr_attrs[n].attr == A_NORMAL))) { + if (first) { + first = FALSE; + } else { + *target++ = '|'; + } + _nc_STRCPY(target, scr_attrs[n].name, limit); + target += strlen(target); + } + } + if (source_color != prior_color) { + if (!first) + *target++ = '|'; + _nc_SPRINTF(target, CUR_SLIMIT "C%d", source_color); + target += strlen(target); + } + + *target++ = R_CURL; + *target = '\0'; + } +} + +static void +encode_cell(char *target, ARG_SLIMIT(limit) CARG_CH_T source, CARG_CH_T previous) +{ +#if USE_STRING_HACKS && HAVE_SNPRINTF + char *base = target; +#endif +#if NCURSES_WIDECHAR + size_t n; + int source_pair = GetPair(*source); + int previous_pair = GetPair(*previous); + + *target = '\0'; + if ((previous->attr != source->attr) || (previous_pair != source_pair)) { + encode_attr(target, CUR_SLIMIT + source->attr, + previous->attr, + source_pair, + previous_pair); + } + target += strlen(target); +#if NCURSES_EXT_COLORS + if (previous->ext_color != source->ext_color) { + _nc_SPRINTF(target, CUR_SLIMIT + "%c%cC%d%c", MARKER, L_CURL, source->ext_color, R_CURL); + } +#endif + for (n = 0; n < SIZEOF(source->chars); ++n) { + unsigned uch = (unsigned) source->chars[n]; + if (uch == 0) + continue; + if (n) { + *target++ = MARKER; + *target++ = APPEND; + } + *target++ = MARKER; + if (uch > 0xffff) { + _nc_SPRINTF(target, CUR_SLIMIT "U%08x", uch); + } else if (uch > 0xff) { + _nc_SPRINTF(target, CUR_SLIMIT "u%04x", uch); + } else if (uch < 32 || uch >= 127) { + _nc_SPRINTF(target, CUR_SLIMIT "%03o", uch & 0xff); + } else { + switch (uch) { + case ' ': + _nc_STRCPY(target, "s", limit); + break; + case MARKER: + *target++ = MARKER; + *target = '\0'; + break; + default: + --target; + _nc_SPRINTF(target, CUR_SLIMIT "%c", uch); + break; + } + } + target += strlen(target); + } +#else + chtype ch = CharOfD(source); + + *target = '\0'; + if (AttrOfD(previous) != AttrOfD(source)) { + encode_attr(target, CUR_SLIMIT + AttrOfD(source), + AttrOfD(previous), + GetPair(source), + GetPair(previous)); + } + target += strlen(target); + *target++ = MARKER; + if (ch < 32 || ch >= 127) { + _nc_SPRINTF(target, CUR_SLIMIT "%03o", UChar(ch)); + } else { + switch (ch) { + case ' ': + _nc_STRCPY(target, "s", limit); + break; + case MARKER: + *target++ = MARKER; + *target = '\0'; + break; + default: + --target; + _nc_SPRINTF(target, CUR_SLIMIT "%c", UChar(ch)); + break; + } + } +#endif +} +#endif + +NCURSES_EXPORT(int) +putwin(WINDOW *win, FILE *filep) +{ + int code = ERR; + + T((T_CALLED("putwin(%p,%p)"), (void *) win, (void *) filep)); + +#if NCURSES_EXT_PUTWIN + if (win != 0) { + const char *version = curses_version(); + char buffer[1024]; + NCURSES_CH_T last_cell; + int y; + + memset(&last_cell, 0, sizeof(last_cell)); + + clearerr(filep); + + /* + * Our magic number is technically nonprinting, but aside from that, + * all of the file is printable ASCII. + */ +#define PUTS(s) if (fputs(s, filep) == EOF || ferror(filep)) returnCode(code) + PUTS(my_magic); + PUTS(version); + PUTS("\n"); + for (y = 0; y < (int) SIZEOF(scr_params); ++y) { + const char *name = scr_params[y].name; + const char *data = (char *) win + scr_params[y].offset; + const void *dp = (const void *) data; + attr_t attr; + + *buffer = '\0'; + if (!strncmp(name, "_pad.", (size_t) 5) && !IS_PAD(win)) { + continue; + } + switch (scr_params[y].type) { + case pATTR: + attr = (*(const attr_t *) dp) & ~A_CHARTEXT; + encode_attr(buffer, TOP_SLIMIT + (*(const attr_t *) dp) & ~A_CHARTEXT, + A_NORMAL, + COLOR_PAIR((int) attr), + 0); + break; + case pBOOL: + if (!(*(const bool *) data)) { + continue; + } + _nc_STRCPY(buffer, name, sizeof(buffer)); + name = "flag"; + break; + case pCHAR: + attr = (*(const attr_t *) dp); + encode_attr(buffer, TOP_SLIMIT + * (const attr_t *) dp, + A_NORMAL, + COLOR_PAIR((int) attr), + 0); + break; + case pINT: + if (!(*(const int *) dp)) + continue; + _nc_SPRINTF(buffer, TOP_SLIMIT + "%d", *(const int *) dp); + break; + case pSHORT: + if (!(*(const short *) dp)) + continue; + _nc_SPRINTF(buffer, TOP_SLIMIT + "%d", *(const short *) dp); + break; + case pSIZE: + if (!(*(const NCURSES_SIZE_T *) dp)) + continue; + _nc_SPRINTF(buffer, TOP_SLIMIT + "%d", *(const NCURSES_SIZE_T *) dp); + break; +#if NCURSES_WIDECHAR + case pCCHAR: + encode_cell(buffer, TOP_SLIMIT + (CARG_CH_T) dp, CHREF(last_cell)); + break; +#endif + } + /* + * Only write non-default data. + */ + if (*buffer != '\0') { + if (fprintf(filep, "%s=%s\n", name, buffer) <= 0 + || ferror(filep)) + returnCode(code); + } + } + /* Write row-data */ + fprintf(filep, "rows:\n"); + for (y = 0; y <= win->_maxy; y++) { + NCURSES_CH_T *data = win->_line[y].text; + int x; + if (fprintf(filep, "%d:", y + 1) <= 0 + || ferror(filep)) + returnCode(code); + for (x = 0; x <= win->_maxx; x++) { +#if NCURSES_WIDECHAR + int len = _nc_wacs_width(data[x].chars[0]); + encode_cell(buffer, TOP_SLIMIT CHREF(data[x]), CHREF(last_cell)); + last_cell = data[x]; + PUTS(buffer); + if (len > 1) + x += (len - 1); +#else + encode_cell(buffer, TOP_SLIMIT CHREF(data[x]), CHREF(last_cell)); + last_cell = data[x]; + PUTS(buffer); +#endif + } + PUTS("\n"); + } + code = OK; + } +#else + /* + * This is the original putwin(): + * A straight binary dump is simple, but its format can depend on whether + * ncurses is compiled with wide-character support, and also may depend + * on the version of ncurses, e.g., if the WINDOW structure is extended. + */ + if (win != 0) { + size_t len = (size_t) (win->_maxx + 1); + int y; + + clearerr(filep); + if (fwrite(win, sizeof(WINDOW), (size_t) 1, filep) != 1 + || ferror(filep)) + returnCode(code); + + for (y = 0; y <= win->_maxy; y++) { + if (fwrite(win->_line[y].text, + sizeof(NCURSES_CH_T), len, filep) != len + || ferror(filep)) { + returnCode(code); + } + } + code = OK; + } +#endif + returnCode(code); +} + +/* + * Replace a window covering the whole screen, i.e., newscr or curscr. + */ +static WINDOW * +replace_window(const WINDOW *target, FILE *source) +{ + WINDOW *result = getwin(source); +#if NCURSES_EXT_FUNCS + if (result != NULL) { + if (getmaxx(result) != getmaxx(target) + || getmaxy(result) != getmaxy(target)) { + int code = wresize(result, + 1 + getmaxy(target), + 1 + getmaxx(target)); + if (code != OK) { + delwin(result); + result = NULL; + } + } + } +#endif + return result; +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(scr_restore) (NCURSES_SP_DCLx const char *file) +{ + FILE *fp = 0; + int code = ERR; + + T((T_CALLED("scr_restore(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); + + if (SP_PARM != NULL + && _nc_access(file, R_OK) >= 0 + && (fp = safe_fopen(file, BIN_R)) != 0) { + WINDOW *my_newscr = replace_window(NewScreen(SP_PARM), fp); + (void) fclose(fp); + if (my_newscr != NULL) { + delwin(NewScreen(SP_PARM)); + NewScreen(SP_PARM) = my_newscr; +#if !USE_REENTRANT + newscr = my_newscr; +#endif + code = OK; + } + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +scr_restore(const char *file) +{ + return NCURSES_SP_NAME(scr_restore) (CURRENT_SCREEN, file); +} +#endif + +NCURSES_EXPORT(int) +scr_dump(const char *file) +{ + int result; + FILE *fp = 0; + + T((T_CALLED("scr_dump(%s)"), _nc_visbuf(file))); + + if (_nc_access(file, W_OK) < 0 + || (fp = safe_fopen(file, BIN_W)) == 0) { + result = ERR; + } else { + (void) putwin(newscr, fp); + (void) fclose(fp); + result = OK; + } + returnCode(result); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(scr_init) (NCURSES_SP_DCLx const char *file) +{ + int code = ERR; + + T((T_CALLED("scr_init(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); + + if (SP_PARM != NULL && +#ifdef USE_TERM_DRIVER + InfoOf(SP_PARM).caninit +#else + !(exit_ca_mode && non_rev_rmcup) +#endif + ) { + FILE *fp = 0; + + if (_nc_access(file, R_OK) >= 0 + && (fp = safe_fopen(file, BIN_R)) != 0) { + WINDOW *my_curscr = replace_window(CurScreen(SP_PARM), fp); + (void) fclose(fp); + if (my_curscr != NULL) { + delwin(CurScreen(SP_PARM)); + CurScreen(SP_PARM) = my_curscr; +#if !USE_REENTRANT + curscr = my_curscr; +#endif + code = OK; + } + } + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +scr_init(const char *file) +{ + return NCURSES_SP_NAME(scr_init) (CURRENT_SCREEN, file); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(scr_set) (NCURSES_SP_DCLx const char *file) +{ + int code = ERR; + + T((T_CALLED("scr_set(%p,%s)"), (void *) SP_PARM, _nc_visbuf(file))); + + if (SP_PARM != NULL + && NCURSES_SP_NAME(scr_init) (NCURSES_SP_ARGx file) == OK) { + delwin(NewScreen(SP_PARM)); + NewScreen(SP_PARM) = dupwin(curscr); +#if !USE_REENTRANT + newscr = NewScreen(SP_PARM); +#endif + if (NewScreen(SP_PARM) != 0) { + code = OK; + } + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +scr_set(const char *file) +{ + return NCURSES_SP_NAME(scr_set) (CURRENT_SCREEN, file); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_scroll.c b/contrib/ncurses/ncurses/base/lib_scroll.c new file mode 100644 index 00000000..ecc0ba56 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_scroll.c @@ -0,0 +1,153 @@ +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2010,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-2003 * + * and: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** 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 + +MODULE_ID("$Id: lib_scroll.c,v 1.32 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(void) +_nc_scroll_window(WINDOW *win, + int const n, + int const top, + int const bottom, + NCURSES_CH_T blank) +{ + int limit; + int line; + int j; + size_t to_copy = (sizeof(NCURSES_CH_T) * (size_t) (win->_maxx + 1)); + + TR(TRACE_MOVE, ("_nc_scroll_window(%p, %d, %ld, %ld)", + (void *) win, n, (long) top, (long) bottom)); + + if (top < 0 + || bottom < top + || bottom > win->_maxy) { + TR(TRACE_MOVE, ("nothing to scroll")); + return; + } + + /* + * This used to do a line-text pointer-shuffle instead of text copies. + * That (a) doesn't work when the window is derived and doesn't have + * its own storage, (b) doesn't save you a lot on modern machines + * anyway. Your typical memcpy implementations are coded in + * assembler using a tight BLT loop; for the size of copies we're + * talking here, the total execution time is dominated by the one-time + * setup cost. So there is no point in trying to be excessively + * clever -- esr. + */ +#define BottomLimit(n) ((n) >= 0 && (n) >= top) +#define TopLimit(n) ((n) <= win->_maxy && (n) <= bottom) + + /* shift n lines downwards */ + if (n < 0) { + limit = top - n; + for (line = bottom; line >= limit && BottomLimit(line); line--) { + TR(TRACE_MOVE, ("...copying %d to %d", line + n, line)); + memcpy(win->_line[line].text, + win->_line[line + n].text, + to_copy); + if_USE_SCROLL_HINTS(win->_line[line].oldindex = + win->_line[line + n].oldindex); + } + for (line = top; line < limit && TopLimit(line); line++) { + TR(TRACE_MOVE, ("...filling %d", line)); + for (j = 0; j <= win->_maxx; j++) + win->_line[line].text[j] = blank; + if_USE_SCROLL_HINTS(win->_line[line].oldindex = _NEWINDEX); + } + } + + /* shift n lines upwards */ + if (n > 0) { + limit = bottom - n; + for (line = top; line <= limit && TopLimit(line); line++) { + memcpy(win->_line[line].text, + win->_line[line + n].text, + to_copy); + if_USE_SCROLL_HINTS(win->_line[line].oldindex = + win->_line[line + n].oldindex); + } + for (line = bottom; line > limit && BottomLimit(line); line--) { + for (j = 0; j <= win->_maxx; j++) + win->_line[line].text[j] = blank; + if_USE_SCROLL_HINTS(win->_line[line].oldindex = _NEWINDEX); + } + } + touchline(win, top, bottom - top + 1); + + if_WIDEC({ + if (WINDOW_EXT(win, addch_used) != 0) { + int next = WINDOW_EXT(win, addch_y) + n; + if (next < 0 || next > win->_maxy) { + TR(TRACE_VIRTPUT, + ("Alert discarded multibyte on scroll")); + WINDOW_EXT(win, addch_y) = 0; + } else { + TR(TRACE_VIRTPUT, ("scrolled working position to %d,%d", + WINDOW_EXT(win, addch_y), + WINDOW_EXT(win, addch_x))); + WINDOW_EXT(win, addch_y) = next; + } + } + }) +} + +NCURSES_EXPORT(int) +wscrl(WINDOW *win, int n) +{ + T((T_CALLED("wscrl(%p,%d)"), (void *) win, n)); + + if (!win || !win->_scroll) { + TR(TRACE_MOVE, ("...scrollok is false")); + returnCode(ERR); + } + + if (n != 0) { + _nc_scroll_window(win, n, win->_regtop, win->_regbottom, win->_nc_bkgd); + _nc_synchook(win); + } + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/base/lib_scrollok.c b/contrib/ncurses/ncurses/base/lib_scrollok.c new file mode 100644 index 00000000..c9462c33 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_scrollok.c @@ -0,0 +1,56 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_scrollok.c +** +** The routine scrollok. +** +*/ + +#include + +MODULE_ID("$Id: lib_scrollok.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +scrollok(WINDOW *win, bool flag) +{ + T((T_CALLED("scrollok(%p,%d)"), (void *) win, flag)); + + if (win) { + win->_scroll = flag; + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_scrreg.c b/contrib/ncurses/ncurses/base/lib_scrreg.c new file mode 100644 index 00000000..5207f6f8 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_scrreg.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_scrreg.c +** +** The routine wsetscrreg(). +** +*/ + +#include + +MODULE_ID("$Id: lib_scrreg.c,v 1.12 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wsetscrreg(WINDOW *win, int top, int bottom) +{ + T((T_CALLED("wsetscrreg(%p,%d,%d)"), (void *) win, top, bottom)); + + if (win && + top >= 0 && top <= win->_maxy && + bottom >= 0 && bottom <= win->_maxy && + bottom > top) { + win->_regtop = (NCURSES_SIZE_T) top; + win->_regbottom = (NCURSES_SIZE_T) bottom; + + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_set_term.c b/contrib/ncurses/ncurses/base/lib_set_term.c new file mode 100644 index 00000000..07c90fe1 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_set_term.c @@ -0,0 +1,867 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_set_term.c +** +** The routine set_term(). +** +*/ + +#define NEW_PAIR_INTERNAL 1 + +#include +#include +#include + +#if USE_GPM_SUPPORT +#ifdef HAVE_LIBDL +/* use dynamic loader to avoid linkage dependency */ +#include +#endif +#endif + +#undef CUR +#define CUR SP_TERMTYPE + +MODULE_ID("$Id: lib_set_term.c,v 1.187 2024/11/02 21:00:54 tom Exp $") + +#ifdef USE_TERM_DRIVER +#define MaxColors InfoOf(sp).maxcolors +#define NumLabels InfoOf(sp).numlabels +#else +#define MaxColors max_colors +#define NumLabels num_labels +#endif + +NCURSES_EXPORT(SCREEN *) +set_term(SCREEN *screenp) +{ + SCREEN *oldSP; + SCREEN *newSP; + + T((T_CALLED("set_term(%p)"), (void *) screenp)); + + _nc_lock_global(curses); + + oldSP = CURRENT_SCREEN; + _nc_set_screen(screenp); + newSP = screenp; + + if (newSP != 0) { + TINFO_SET_CURTERM(newSP, newSP->_term); +#if !USE_REENTRANT + curscr = CurScreen(newSP); + newscr = NewScreen(newSP); + stdscr = StdScreen(newSP); + COLORS = newSP->_color_count; + COLOR_PAIRS = newSP->_pair_count; +#endif + } else { + TINFO_SET_CURTERM(oldSP, 0); +#if !USE_REENTRANT + curscr = 0; + newscr = 0; + stdscr = 0; + COLORS = 0; + COLOR_PAIRS = 0; +#endif + } + + _nc_unlock_global(curses); + + T((T_RETURN("%p"), (void *) oldSP)); + return (oldSP); +} + +static void +_nc_free_keytry(TRIES * kt) +{ + if (kt != 0) { + _nc_free_keytry(kt->child); + _nc_free_keytry(kt->sibling); + free(kt); + } +} + +static bool +delink_screen(SCREEN *sp) +{ + SCREEN *last = 0; + SCREEN *temp; + bool result = FALSE; + + for (each_screen(temp)) { + if (temp == sp) { + if (last) + last->_next_screen = sp->_next_screen; + else + _nc_screen_chain = sp->_next_screen; + result = TRUE; + break; + } + last = temp; + } + return result; +} + +/* + * Free the storage associated with the given SCREEN sp. + */ +NCURSES_EXPORT(void) +delscreen(SCREEN *sp) +{ + + T((T_CALLED("delscreen(%p)"), (void *) sp)); + + _nc_lock_global(curses); + if (delink_screen(sp)) { + WINDOWLIST *wl; + bool is_current = (sp == CURRENT_SCREEN); + +#ifdef USE_SP_RIPOFF + if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) { + ripoff_t *rop; + for (rop = safe_ripoff_stack; + rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS; + rop++) { + if (rop->win) { + (void) delwin(rop->win); + rop->win = 0; + } + } + } +#endif + + /* delete all of the windows in this screen */ + rescan: + for (each_window(sp, wl)) { + if (_nc_freewin(&(wl->win)) == OK) { + goto rescan; + } + } + + if (sp->_slk != 0) { + + if (sp->_slk->ent != 0) { + int i; + + for (i = 0; i < sp->_slk->labcnt; ++i) { + FreeIfNeeded(sp->_slk->ent[i].ent_text); + FreeIfNeeded(sp->_slk->ent[i].form_text); + } + free(sp->_slk->ent); + } + free(sp->_slk); + sp->_slk = 0; + } + + _nc_free_keytry(sp->_keytry); + sp->_keytry = 0; + + _nc_free_keytry(sp->_key_ok); + sp->_key_ok = 0; + + FreeIfNeeded(sp->_current_attr); + + _nc_free_ordered_pairs(sp); + FreeIfNeeded(sp->_color_table); + FreeIfNeeded(sp->_color_pairs); + + FreeIfNeeded(sp->_oldnum_list); + FreeIfNeeded(sp->oldhash); + FreeIfNeeded(sp->newhash); + FreeIfNeeded(sp->hashtab); + + FreeIfNeeded(sp->_acs_map); + FreeIfNeeded(sp->_screen_acs_map); + + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term); + FreeIfNeeded(sp->out_buffer); + if (_nc_find_prescr() == sp) { + _nc_forget_prescr(); + } +#if USE_GPM_SUPPORT +#ifdef HAVE_LIBDL + if (sp->_dlopen_gpm != 0) { + dlclose(sp->_dlopen_gpm); + sp->_dlopen_gpm = 0; + } +#endif +#endif /* USE_GPM_SUPPORT */ + free(sp); + + /* + * If this was the current screen, reset everything that the + * application might try to use (except cur_term, which may have + * multiple references in different screens). + */ + if (is_current) { +#if !USE_REENTRANT + curscr = 0; + newscr = 0; + stdscr = 0; + COLORS = 0; + COLOR_PAIRS = 0; +#endif + _nc_set_screen(0); +#if USE_WIDEC_SUPPORT + if (SP == 0) { + FreeIfNeeded(_nc_wacs); + _nc_wacs = 0; + } +#endif + } else { + set_term(CURRENT_SCREEN); + } + } + _nc_unlock_global(curses); + + returnVoid; +} + +static bool +no_mouse_event(SCREEN *sp GCC_UNUSED) +{ + return FALSE; +} + +static bool +no_mouse_inline(SCREEN *sp GCC_UNUSED) +{ + return FALSE; +} + +static bool +no_mouse_parse(SCREEN *sp GCC_UNUSED, int code GCC_UNUSED) +{ + return TRUE; +} + +static void +no_mouse_resume(SCREEN *sp GCC_UNUSED) +{ +} + +static void +no_mouse_wrap(SCREEN *sp GCC_UNUSED) +{ +} + +#if NCURSES_EXT_FUNCS && USE_COLORFGBG +static const char * +extract_fgbg(const char *src, int *result) +{ + const char *dst = 0; + char *tmp = 0; + long value = strtol(src, &tmp, 0); + + if ((dst = tmp) == 0) { + dst = src; + } else if (value >= 0) { + *result = (int) value; + } + while (*dst != 0 && *dst != ';') + dst++; + if (*dst == ';') + dst++; + return dst; +} +#endif + +#define ReturnScreenError() do { _nc_set_screen(0); \ + returnCode(ERR); } while (0) + +/* OS-independent screen initializations */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_setupscreen) ( +#if NCURSES_SP_FUNCS + SCREEN **spp, +#endif + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) +{ +#ifndef USE_TERM_DRIVER + static const TTY null_TTY; /* all zeros iff uninitialized */ +#endif + char *env; + int bottom_stolen = 0; + SCREEN *sp; +#ifndef USE_TERM_DRIVER + bool support_cookies = USE_XMC_SUPPORT; +#endif + + T((T_CALLED("_nc_setupscreen(%d, %d, %p, %d, %d)"), + slines, scolumns, (void *) output, filtered, slk_format)); + + assert(CURRENT_SCREEN == 0); /* has been reset in newterm() ! */ + +#if NCURSES_SP_FUNCS + assert(spp != 0); + sp = *spp; + + if (!sp) { + sp = _nc_alloc_screen_sp(); + T(("_nc_alloc_screen_sp %p", (void *) sp)); + *spp = sp; + } + if (sp == NULL) { + ReturnScreenError(); + } + if ((sp->_acs_map = typeCalloc(chtype, ACS_LEN)) == NULL) { + ReturnScreenError(); + } + if ((sp->_screen_acs_map = typeCalloc(bool, ACS_LEN)) == NULL) { + free(sp->_acs_map); + ReturnScreenError(); + } + + T(("created SP %p", (void *) sp)); + sp->_next_screen = _nc_screen_chain; + _nc_screen_chain = sp; + + if ((sp->_current_attr = typeCalloc(NCURSES_CH_T, 1)) == 0) { + ReturnScreenError(); + } +#else + if (!_nc_alloc_screen() + || ((SP->_acs_map = typeCalloc(chtype, ACS_LEN)) == 0) + || ((SP->_screen_acs_map = typeCalloc(bool, ACS_LEN)) == 0)) { + returnCode(ERR); + } + + T(("created SP %p", (void *) SP)); + + sp = SP; /* fixup so SET_LINES and SET_COLS works */ + sp->_next_screen = _nc_screen_chain; + _nc_screen_chain = sp; + + if ((sp->_current_attr = typeCalloc(NCURSES_CH_T, 1)) == 0) { + returnCode(ERR); + } +#endif + + /* + * We should always check the screensize, just in case. + */ + _nc_set_screen(sp); + sp->_term = cur_term; +#ifdef USE_TERM_DRIVER + TCBOf(sp)->csp = sp; + _nc_get_screensize(sp, sp->_term, &slines, &scolumns); +#else + _nc_get_screensize(sp, &slines, &scolumns); +#endif + SET_LINES(slines); + SET_COLS(scolumns); + + T((T_CREATE("screen %s %dx%d"), + NCURSES_SP_NAME(termname) (NCURSES_SP_ARG), slines, scolumns)); + + sp->_filtered = filtered; + + /* implement filter mode */ + if (filtered) { + slines = 1; + SET_LINES(slines); +#ifdef USE_TERM_DRIVER + CallDriver(sp, td_setfilter); +#else + /* *INDENT-EQLS* */ + clear_screen = ABSENT_STRING; + cursor_address = ABSENT_STRING; + cursor_down = ABSENT_STRING; + cursor_up = ABSENT_STRING; + parm_down_cursor = ABSENT_STRING; + parm_up_cursor = ABSENT_STRING; + row_address = ABSENT_STRING; + cursor_home = carriage_return; + + if (back_color_erase) + clr_eos = ABSENT_STRING; + +#endif + T(("filter screensize %dx%d", slines, scolumns)); + } +#if defined(EXP_WIN32_DRIVER) + T(("setting output mode to binary")); + fflush(output); + _setmode(fileno(output), _O_BINARY); +#endif + sp->_lines = (NCURSES_SIZE_T) slines; + sp->_lines_avail = (NCURSES_SIZE_T) slines; + sp->_columns = (NCURSES_SIZE_T) scolumns; + + fflush(output); + sp->_ofd = output ? fileno(output) : -1; + sp->_ofp = output; +#if defined(EXP_WIN32_DRIVER) + if (output) + _setmode(fileno(output), _O_BINARY); +#endif + sp->out_limit = (size_t) ((2 + slines) * (6 + scolumns)); + if ((sp->out_buffer = malloc(sp->out_limit)) == 0) + sp->out_limit = 0; + sp->out_inuse = 0; + + SP_PRE_INIT(sp); + SetNoPadding(sp); + +#if NCURSES_EXT_FUNCS + sp->_default_color = FALSE; + sp->_has_sgr_39_49 = FALSE; + + /* + * Set our assumption of the terminal's default foreground and background + * colors. The curs_color man-page states that we can assume that the + * background is black. The origin of this assumption appears to be + * terminals that displayed colored text, but no colored backgrounds, e.g., + * the first colored terminals around 1980. More recent ones with better + * technology can display not only colored backgrounds, but all + * combinations. So a terminal might be something other than "white" on + * black (green/black looks monochrome too), but black on white or even + * on ivory. + * + * White-on-black is the simplest thing to use for monochrome. Almost + * all applications that use color paint both text and background, so + * the distinction is moot. But a few do not - which is why we leave this + * configurable (a better solution is to use assume_default_colors() for + * the rare applications that do require that sort of appearance, since + * is appears that more users expect to be able to make a white-on-black + * or black-on-white display under control of the application than not). + */ +#ifdef USE_ASSUMED_COLOR + sp->_default_fg = COLOR_WHITE; + sp->_default_bg = COLOR_BLACK; +#else + sp->_default_fg = COLOR_DEFAULT; + sp->_default_bg = COLOR_DEFAULT; +#endif + + /* + * Allow those assumed/default color assumptions to be overridden at + * runtime: + */ + if ((env = getenv("NCURSES_ASSUMED_COLORS")) != 0) { + int fg, bg; + char sep1, sep2; + int count = sscanf(env, "%d%c%d%c", &fg, &sep1, &bg, &sep2); + if (count >= 1) { + sp->_default_fg = ((fg >= 0 && fg < MaxColors) ? fg : COLOR_DEFAULT); + if (count >= 3) { + sp->_default_bg = ((bg >= 0 && bg < MaxColors) ? bg : COLOR_DEFAULT); + } + TR(TRACE_CHARPUT | TRACE_MOVE, + ("from environment assumed fg=%d, bg=%d", + sp->_default_fg, + sp->_default_bg)); + } + } +#if USE_COLORFGBG + /* + * If rxvt's $COLORFGBG variable is set, use it to specify the assumed + * default colors. Note that rxvt (mis)uses bold colors, equating a bold + * color to that value plus 8. We'll only use the non-bold color for now - + * decide later if it is worth having default attributes as well. + */ + if (getenv("COLORFGBG") != 0) { + const char *p = getenv("COLORFGBG"); + TR(TRACE_CHARPUT | TRACE_MOVE, ("decoding COLORFGBG %s", p)); + p = extract_fgbg(p, &(sp->_default_fg)); + p = extract_fgbg(p, &(sp->_default_bg)); + if (*p) /* assume rxvt was compiled with xpm support */ + extract_fgbg(p, &(sp->_default_bg)); + TR(TRACE_CHARPUT | TRACE_MOVE, ("decoded fg=%d, bg=%d", + sp->_default_fg, sp->_default_bg)); + if (sp->_default_fg >= MaxColors) { + if (set_a_foreground != ABSENT_STRING + && !strcmp(set_a_foreground, "\033[3%p1%dm")) { + set_a_foreground = strdup("\033[3%?%p1%{8}%>%t9%e%p1%d%;m"); + } else { + sp->_default_fg %= MaxColors; + } + } + if (sp->_default_bg >= MaxColors) { + if (set_a_background != ABSENT_STRING + && !strcmp(set_a_background, "\033[4%p1%dm")) { + set_a_background = strdup("\033[4%?%p1%{8}%>%t9%e%p1%d%;m"); + } else { + sp->_default_bg %= MaxColors; + } + } + } +#endif +#endif /* NCURSES_EXT_FUNCS */ + + sp->_maxclick = DEFAULT_MAXCLICK; + sp->_mouse_event = no_mouse_event; + sp->_mouse_inline = no_mouse_inline; + sp->_mouse_parse = no_mouse_parse; + sp->_mouse_resume = no_mouse_resume; + sp->_mouse_wrap = no_mouse_wrap; + sp->_mouse_fd = -1; + + /* + * If we've no magic cookie support, we suppress attributes that xmc would + * affect, i.e., the attributes that affect the rendition of a space. + */ + sp->_ok_attributes = NCURSES_SP_NAME(termattrs) (NCURSES_SP_ARG); + if (NCURSES_SP_NAME(has_colors) (NCURSES_SP_ARG)) { + sp->_ok_attributes |= A_COLOR; + } +#ifdef USE_TERM_DRIVER + _nc_cookie_init(sp); +#else +#if USE_XMC_SUPPORT + /* + * If we have no magic-cookie support compiled-in, or if it is suppressed + * in the environment, reset the support-flag. + */ + if (magic_cookie_glitch >= 0) { + if (getenv("NCURSES_NO_MAGIC_COOKIE") != 0) { + support_cookies = FALSE; + } + } +#endif + + if (!support_cookies && magic_cookie_glitch >= 0) { + T(("will disable attributes to work w/o magic cookies")); + } + + if (magic_cookie_glitch > 0) { /* tvi, wyse */ + + sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT; +#if 0 + /* + * We "should" treat colors as an attribute. The wyse350 (and its + * clones) appear to be the only ones that have both colors and magic + * cookies. + */ + if (has_colors()) { + sp->_xmc_triggers |= A_COLOR; + } +#endif + sp->_xmc_suppress = sp->_xmc_triggers & (chtype) ~(A_BOLD); + + T(("magic cookie attributes %s", _traceattr(sp->_xmc_suppress))); + /* + * Supporting line-drawing may be possible. But make the regular + * video attributes work first. + */ + acs_chars = ABSENT_STRING; + ena_acs = ABSENT_STRING; + enter_alt_charset_mode = ABSENT_STRING; + exit_alt_charset_mode = ABSENT_STRING; +#if USE_XMC_SUPPORT + /* + * To keep the cookie support simple, suppress all of the optimization + * hooks except for clear_screen and the cursor addressing. + */ + if (support_cookies) { + clr_eol = ABSENT_STRING; + clr_eos = ABSENT_STRING; + set_attributes = ABSENT_STRING; + } +#endif + } else if (magic_cookie_glitch == 0) { /* hpterm */ + } + + /* + * If magic cookies are not supported, cancel the strings that set + * video attributes. + */ + if (!support_cookies && magic_cookie_glitch >= 0) { + magic_cookie_glitch = ABSENT_NUMERIC; + set_attributes = ABSENT_STRING; + enter_blink_mode = ABSENT_STRING; + enter_bold_mode = ABSENT_STRING; + enter_dim_mode = ABSENT_STRING; + enter_reverse_mode = ABSENT_STRING; + enter_standout_mode = ABSENT_STRING; + enter_underline_mode = ABSENT_STRING; + } + + /* initialize normal acs before wide, since we use mapping in the latter */ +#if !USE_WIDEC_SUPPORT + if (_nc_unicode_locale() && _nc_locale_breaks_acs(sp->_term)) { + acs_chars = NULL; + ena_acs = NULL; + enter_alt_charset_mode = NULL; + exit_alt_charset_mode = NULL; + set_attributes = NULL; + } +#endif +#endif + + NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG); +#if USE_WIDEC_SUPPORT + sp->_screen_unicode = _nc_unicode_locale(); + if (_nc_wacs == 0) { + _nc_init_wacs(); + } + if (_nc_wacs == 0) { + ReturnScreenError(); + } + + sp->_screen_acs_fix = (sp->_screen_unicode + && _nc_locale_breaks_acs(sp->_term)); +#endif + env = _nc_get_locale(); + sp->_legacy_coding = ((env == 0) + || !strcmp(env, "C") + || !strcmp(env, "POSIX")); + T(("legacy-coding %d", sp->_legacy_coding)); + + sp->_nc_sp_idcok = TRUE; + sp->_nc_sp_idlok = FALSE; + + sp->oldhash = 0; + sp->newhash = 0; + + T(("creating newscr")); + NewScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns, + 0, 0); + if (NewScreen(sp) == 0) { + ReturnScreenError(); + } + T(("creating curscr")); + CurScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns, + 0, 0); + if (CurScreen(sp) == 0) { + ReturnScreenError(); + } +#if !USE_REENTRANT + newscr = NewScreen(sp); + curscr = CurScreen(sp); +#endif +#if USE_SIZECHANGE + sp->_resize = NCURSES_SP_NAME(resizeterm); + sp->_ungetch = safe_ungetch; +#endif + + NewScreen(sp)->_clear = TRUE; + CurScreen(sp)->_clear = FALSE; + + /* + * Get the current tty-modes. setupterm() may already have done this, + * unless we use the term-driver. + */ +#ifndef USE_TERM_DRIVER + if (cur_term != 0 && + !memcmp(&cur_term->Ottyb, &null_TTY, sizeof(TTY))) +#endif + { + NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); + NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); + } + + if (safe_ripoff_sp && safe_ripoff_sp != safe_ripoff_stack) { + ripoff_t *rop; + + for (rop = safe_ripoff_stack; + rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS; + rop++) { + + /* If we must simulate soft labels, grab off the line to be used. + We assume that we must simulate, if it is none of the standard + formats (4-4 or 3-2-3) for which there may be some hardware + support. */ + if (rop->hook == _nc_slk_initialize) { + if (!TerminalOf(sp)) { + continue; + } + if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format))) { + continue; + } + } + if (rop->hook) { + int count; + WINDOW *w; + + count = (rop->line < 0) ? -rop->line : rop->line; + T(("ripping off %i lines at %s", count, + ((rop->line < 0) + ? "bottom" + : "top"))); + + w = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx + count, scolumns, + ((rop->line < 0) + ? sp->_lines_avail - count + : 0), + 0); + if (w) { + rop->win = w; + rop->hook(w, scolumns); + } else { + ReturnScreenError(); + } + if (rop->line < 0) { + bottom_stolen += count; + } else { + sp->_topstolen = (NCURSES_SIZE_T) (sp->_topstolen + count); + } + sp->_lines_avail = (NCURSES_SIZE_T) (sp->_lines_avail - count); + } + } + /* reset the stack */ + safe_ripoff_sp = safe_ripoff_stack; + } + + T(("creating stdscr")); + (void) bottom_stolen; + assert((sp->_lines_avail + sp->_topstolen + bottom_stolen) == slines); + if ((StdScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx + sp->_lines_avail, + scolumns, 0, 0)) == 0) { + ReturnScreenError(); + } + SET_LINES(sp->_lines_avail); +#if !USE_REENTRANT + stdscr = StdScreen(sp); +#endif + sp->_prescreen = FALSE; + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_setupscreen(int slines GCC_UNUSED, + int scolumns GCC_UNUSED, + FILE *output, + int filtered, + int slk_format) +{ + SCREEN *sp = 0; + int rc = NCURSES_SP_NAME(_nc_setupscreen) (&sp, + slines, + scolumns, + output, + filtered, + slk_format); + if (rc != OK) + _nc_set_screen(0); + return rc; +} +#endif + +/* + * The internal implementation interprets line as the number of lines to rip + * off from the top or bottom. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx + int line, + int (*init) (WINDOW *, int)) +{ + int code = ERR; + TR_FUNC_BFR(1); + + START_TRACE(); + T((T_CALLED("ripoffline(%p,%d,%s)"), + (void *) SP_PARM, line, + TR_FUNC_ARG(0, init))); + +#if NCURSES_SP_FUNCS + if (SP_PARM != 0 && SP_PARM->_prescreen) +#endif + { + if (line == 0) { + code = OK; + } else { + if (safe_ripoff_sp == 0) { + safe_ripoff_sp = safe_ripoff_stack; + } + if (safe_ripoff_sp < safe_ripoff_stack + N_RIPS) { + safe_ripoff_sp->line = line; + safe_ripoff_sp->hook = init; + (safe_ripoff_sp)++; + T(("ripped-off %d:%d chunks", + (int) (safe_ripoff_sp - safe_ripoff_stack), N_RIPS)); + code = OK; + } + } + } + + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_ripoffline(int line, int (*init) (WINDOW *, int)) +{ + int rc; + + _nc_init_pthreads(); + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(_nc_ripoffline) (CURRENT_SCREEN_PRE, line, init); + _nc_unlock_global(prescreen); + + return rc; +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(ripoffline) (NCURSES_SP_DCLx + int line, + int (*init) (WINDOW *, int)) +{ + START_TRACE(); + return NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx + (line < 0) ? -1 : 1, + init); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +ripoffline(int line, int (*init) (WINDOW *, int)) +{ + int rc; + + _nc_init_pthreads(); + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(ripoffline) (CURRENT_SCREEN_PRE, line, init); + _nc_unlock_global(prescreen); + + return rc; +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slk.c b/contrib/ncurses/ncurses/base/lib_slk.c new file mode 100644 index 00000000..47e57e0b --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slk.c @@ -0,0 +1,254 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2010,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Authors: * + * Gerhard Fuernkranz 1993 (original) * + * Zeyd M. Ben-Halim 1992,1995 (sic) * + * Eric S. Raymond * + * Juergen Pfeifer 1996-on * + * Thomas E. Dickey * + ****************************************************************************/ + +/* + * lib_slk.c + * Soft key routines. + */ + +#include +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_slk.c,v 1.50 2022/08/20 18:29:22 tom Exp $") + +#ifdef USE_TERM_DRIVER +#define NumLabels InfoOf(SP_PARM).numlabels +#define NoColorVideo InfoOf(SP_PARM).nocolorvideo +#define LabelWidth InfoOf(SP_PARM).labelwidth +#define LabelHeight InfoOf(SP_PARM).labelheight +#else +#define NumLabels num_labels +#define NoColorVideo no_color_video +#define LabelWidth label_width +#define LabelHeight label_height +#endif + +/* + * Free any memory related to soft labels, return an error. + */ +static int +slk_failed(NCURSES_SP_DCL0) +{ + if ((0 != SP_PARM) && SP_PARM->_slk) { + FreeIfNeeded(SP_PARM->_slk->ent); + free(SP_PARM->_slk); + SP_PARM->_slk = (SLK *) 0; + } + return ERR; +} + +NCURSES_EXPORT(int) +_nc_format_slks(NCURSES_SP_DCLx int cols) +{ + int gap, i, x; + int max_length; + + if (!SP_PARM || !SP_PARM->_slk) + return ERR; + + max_length = SP_PARM->_slk->maxlen; + if (SP_PARM->slk_format >= 3) { /* PC style */ + gap = (cols - 3 * (3 + 4 * max_length)) / 2; + + if (gap < 1) + gap = 1; + + for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) { + SP_PARM->_slk->ent[i].ent_x = x; + x += max_length; + x += (i == 3 || i == 7) ? gap : 1; + } + } else { + if (SP_PARM->slk_format == 2) { /* 4-4 */ + gap = cols - (int) (SP_PARM->_slk->maxlab * max_length) - 6; + + if (gap < 1) + gap = 1; + for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) { + SP_PARM->_slk->ent[i].ent_x = x; + x += max_length; + x += (i == 3) ? gap : 1; + } + } else { + if (SP_PARM->slk_format == 1) { /* 1 -> 3-2-3 */ + gap = (cols - (SP_PARM->_slk->maxlab * max_length) - 5) + / 2; + + if (gap < 1) + gap = 1; + for (i = x = 0; i < SP_PARM->_slk->maxlab; i++) { + SP_PARM->_slk->ent[i].ent_x = x; + x += max_length; + x += (i == 2 || i == 4) ? gap : 1; + } + } else { + return slk_failed(NCURSES_SP_ARG); + } + } + } + SP_PARM->_slk->dirty = TRUE; + + return OK; +} + +/* + * Initialize soft labels. + * Called from newterm() + */ +NCURSES_EXPORT(int) +_nc_slk_initialize(WINDOW *stwin, int cols) +{ + int i; + int res = OK; + size_t max_length; + SCREEN *sp; + int numlab; + + T((T_CALLED("_nc_slk_initialize()"))); + + assert(stwin); + + sp = _nc_screen_of(stwin); + if (0 == sp) + returnCode(ERR); + + assert(TerminalOf(SP_PARM)); + + numlab = NumLabels; + + if (SP_PARM->_slk) { /* we did this already, so simply return */ + returnCode(OK); + } else if ((SP_PARM->_slk = typeCalloc(SLK, 1)) == 0) + returnCode(ERR); + + if (!SP_PARM->slk_format) + SP_PARM->slk_format = _nc_globals.slk_format; + + /* + * If we use colors, vidputs() will suppress video attributes that conflict + * with colors. In that case, we're still guaranteed that "reverse" would + * work. + */ + if ((NoColorVideo & 1) == 0) + SetAttr(SP_PARM->_slk->attr, A_STANDOUT); + else + SetAttr(SP_PARM->_slk->attr, A_REVERSE); + + SP_PARM->_slk->maxlab = (short) ((numlab > 0) + ? numlab + : MAX_SKEY(SP_PARM->slk_format)); + SP_PARM->_slk->maxlen = (short) ((numlab > 0) + ? LabelWidth * LabelHeight + : MAX_SKEY_LEN(SP_PARM->slk_format)); + SP_PARM->_slk->labcnt = (short) ((SP_PARM->_slk->maxlab < MAX_SKEY(SP_PARM->slk_format)) + ? MAX_SKEY(SP_PARM->slk_format) + : SP_PARM->_slk->maxlab); + + if (SP_PARM->_slk->maxlen <= 0 + || SP_PARM->_slk->labcnt <= 0 + || (SP_PARM->_slk->ent = typeCalloc(slk_ent, + (size_t) SP_PARM->_slk->labcnt)) + == NULL) { + free(SP_PARM->_slk->ent); + returnCode(slk_failed(NCURSES_SP_ARG)); + } + + max_length = (size_t) SP_PARM->_slk->maxlen; + for (i = 0; i < SP_PARM->_slk->labcnt; i++) { + size_t used = max_length + 1; + + SP_PARM->_slk->ent[i].ent_text = (char *) _nc_doalloc(0, used); + if (SP_PARM->_slk->ent[i].ent_text == 0) + returnCode(slk_failed(NCURSES_SP_ARG)); + memset(SP_PARM->_slk->ent[i].ent_text, 0, used); + + SP_PARM->_slk->ent[i].form_text = (char *) _nc_doalloc(0, used); + if (SP_PARM->_slk->ent[i].form_text == 0) + returnCode(slk_failed(NCURSES_SP_ARG)); + + if (used > 1) { + memset(SP_PARM->_slk->ent[i].form_text, ' ', used - 1); + } + SP_PARM->_slk->ent[i].form_text[used - 1] = '\0'; + + SP_PARM->_slk->ent[i].visible = (char) (i < SP_PARM->_slk->maxlab); + } + + res = _nc_format_slks(NCURSES_SP_ARGx cols); + + if ((SP_PARM->_slk->win = stwin) == NULL) { + returnCode(slk_failed(NCURSES_SP_ARG)); + } + + /* We now reset the format so that the next newterm has again + * per default no SLK keys and may call slk_init again to + * define a new layout. (juergen 03-Mar-1999) + */ + _nc_globals.slk_format = 0; + returnCode(res); +} + +/* + * Restore the soft labels on the screen. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_restore) (NCURSES_SP_DCL0) +{ + T((T_CALLED("slk_restore(%p)"), (void *) SP_PARM)); + + if (0 == SP_PARM) + returnCode(ERR); + if (SP_PARM->_slk == NULL) + returnCode(ERR); + SP_PARM->_slk->hidden = FALSE; + SP_PARM->_slk->dirty = TRUE; + + returnCode(NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_ARG)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_restore(void) +{ + return NCURSES_SP_NAME(slk_restore) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkatr_set.c b/contrib/ncurses/ncurses/base/lib_slkatr_set.c new file mode 100644 index 00000000..7c5a23ac --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkatr_set.c @@ -0,0 +1,81 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1998 * + * and: Thomas E. Dickey 2005-on * + ****************************************************************************/ + +/* + * lib_slkatr_set.c + * Soft key routines. + * Set the label's attributes + */ +#include + +MODULE_ID("$Id: lib_slkatr_set.c,v 1.17 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_attr_set) (NCURSES_SP_DCLx + const attr_t attr, + NCURSES_PAIRS_T pair_arg, + void *opts) +{ + int code = ERR; + int color_pair = pair_arg; + + T((T_CALLED("slk_attr_set(%p,%s,%d)"), + (void *) SP_PARM, + _traceattr(attr), + color_pair)); + + set_extended_pair(opts, color_pair); + if (SP_PARM != 0 + && SP_PARM->_slk != 0 + && color_pair >= 0 + && color_pair < SP_PARM->_pair_limit) { + TR(TRACE_ATTRS, ("... current %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + SetAttr(SP_PARM->_slk->attr, attr); + if (color_pair > 0) { + SetPair(SP_PARM->_slk->attr, color_pair); + } + TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + code = OK; + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_attr_set(const attr_t attr, NCURSES_COLOR_T pair_arg, void *opts) +{ + return NCURSES_SP_NAME(slk_attr_set) (CURRENT_SCREEN, attr, + pair_arg, opts); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkatrof.c b/contrib/ncurses/ncurses/base/lib_slkatrof.c new file mode 100644 index 00000000..2d53ab20 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkatrof.c @@ -0,0 +1,67 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2005,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + * and: Thomas E. Dickey 2005 * + ****************************************************************************/ + +/* + * lib_slkatrof.c + * Soft key routines. + * Switch off labels attributes + */ +#include + +MODULE_ID("$Id: lib_slkatrof.c,v 1.12 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_attroff) (NCURSES_SP_DCLx const chtype attr) +{ + T((T_CALLED("slk_attroff(%p,%s)"), (void *) SP_PARM, _traceattr(attr))); + + if (SP_PARM != 0 && SP_PARM->_slk != 0) { + TR(TRACE_ATTRS, ("... current %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + RemAttr(SP_PARM->_slk->attr, attr); + if ((attr & A_COLOR) != 0) { + SetPair(SP_PARM->_slk->attr, 0); + } + TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + returnCode(OK); + } else + returnCode(ERR); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_attroff(const chtype attr) +{ + return NCURSES_SP_NAME(slk_attroff) (CURRENT_SCREEN, attr); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkatron.c b/contrib/ncurses/ncurses/base/lib_slkatron.c new file mode 100644 index 00000000..accc2f2a --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkatron.c @@ -0,0 +1,67 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + * and: Thomas E. Dickey 2005 * + ****************************************************************************/ + +/* + * lib_slkatron.c + * Soft key routines. + * Switch on labels attributes + */ +#include + +MODULE_ID("$Id: lib_slkatron.c,v 1.13 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_attron) (NCURSES_SP_DCLx const chtype attr) +{ + T((T_CALLED("slk_attron(%p,%s)"), (void *) SP_PARM, _traceattr(attr))); + + if (SP_PARM != 0 && SP_PARM->_slk != 0) { + TR(TRACE_ATTRS, ("... current %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + AddAttr(SP_PARM->_slk->attr, attr); + if ((attr & A_COLOR) != 0) { + SetPair(SP_PARM->_slk->attr, PairNumber(attr)); + } + TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(SP_PARM->_slk->attr)))); + returnCode(OK); + } else + returnCode(ERR); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_attron(const chtype attr) +{ + return NCURSES_SP_NAME(slk_attron) (CURRENT_SCREEN, attr); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkatrset.c b/contrib/ncurses/ncurses/base/lib_slkatrset.c new file mode 100644 index 00000000..11fa7e6f --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkatrset.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2005,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + * and: Thomas E. Dickey 2005 * + ****************************************************************************/ + +/* + * lib_slkatrset.c + * Soft key routines. + * Set the labels attributes + */ +#include + +MODULE_ID("$Id: lib_slkatrset.c,v 1.11 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_attrset) (NCURSES_SP_DCLx const chtype attr) +{ + T((T_CALLED("slk_attrset(%p,%s)"), (void *) SP_PARM, _traceattr(attr))); + + if (SP_PARM != 0 && SP_PARM->_slk != 0) { + SetAttr(SP_PARM->_slk->attr, attr); + returnCode(OK); + } else + returnCode(ERR); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_attrset(const chtype attr) +{ + return NCURSES_SP_NAME(slk_attrset) (CURRENT_SCREEN, attr); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkattr.c b/contrib/ncurses/ncurses/base/lib_slkattr.c new file mode 100644 index 00000000..af49f3bb --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkattr.c @@ -0,0 +1,65 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + * and: Thomas E. Dickey 2005 * + ****************************************************************************/ + +/* + * lib_slkattr.c + * Soft key routines. + * Fetch the labels attributes + */ +#include + +MODULE_ID("$Id: lib_slkattr.c,v 1.12 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(attr_t) +NCURSES_SP_NAME(slk_attr) (NCURSES_SP_DCL0) +{ + T((T_CALLED("slk_attr(%p)"), (void *) SP_PARM)); + + if (SP_PARM != 0 && SP_PARM->_slk != 0) { + attr_t result = AttrOf(SP_PARM->_slk->attr) & ALL_BUT_COLOR; + int pair = GetPair(SP_PARM->_slk->attr); + + result |= (attr_t) ColorPair(pair); + returnAttr(result); + } else + returnAttr(0); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(attr_t) +slk_attr(void) +{ + return NCURSES_SP_NAME(slk_attr) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkclear.c b/contrib/ncurses/ncurses/base/lib_slkclear.c new file mode 100644 index 00000000..10531e4d --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkclear.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2007,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1996-1999 * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * lib_slkclear.c + * Soft key routines. + * Remove soft labels from the screen. + */ +#include + +MODULE_ID("$Id: lib_slkclear.c,v 1.15 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_clear) (NCURSES_SP_DCL0) +{ + int rc = ERR; + + T((T_CALLED("slk_clear(%p)"), (void *) SP_PARM)); + + if (SP_PARM != 0 && SP_PARM->_slk != 0) { + SP_PARM->_slk->hidden = TRUE; + /* For simulated SLK's it looks much more natural to + inherit those attributes from the standard screen */ + SP_PARM->_slk->win->_nc_bkgd = StdScreen(SP_PARM)->_nc_bkgd; + WINDOW_ATTRS(SP_PARM->_slk->win) = WINDOW_ATTRS(StdScreen(SP_PARM)); + if (SP_PARM->_slk->win == StdScreen(SP_PARM)) { + rc = OK; + } else { + werase(SP_PARM->_slk->win); + rc = wrefresh(SP_PARM->_slk->win); + } + } + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_clear(void) +{ + return NCURSES_SP_NAME(slk_clear) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkcolor.c b/contrib/ncurses/ncurses/base/lib_slkcolor.c new file mode 100644 index 00000000..00d1eaa0 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkcolor.c @@ -0,0 +1,91 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1998,2009 * + * and: Thomas E. Dickey 2005-on * + ****************************************************************************/ + +/* + * lib_slkcolor.c + * Soft key routines. + * Set the label's color + */ +#include + +MODULE_ID("$Id: lib_slkcolor.c,v 1.20 2020/02/02 23:34:34 tom Exp $") + +static int +_nc_slk_color(SCREEN *sp, int pair_arg) +{ + int code = ERR; + + T((T_CALLED("slk_color(%p,%d)"), (void *) sp, pair_arg)); + + if (sp != 0 + && sp->_slk != 0 + && pair_arg >= 0 + && pair_arg < sp->_pair_limit) { + TR(TRACE_ATTRS, ("... current is %s", _tracech_t(CHREF(sp->_slk->attr)))); + SetPair(sp->_slk->attr, pair_arg); + TR(TRACE_ATTRS, ("new attribute is %s", _tracech_t(CHREF(sp->_slk->attr)))); + code = OK; + } + returnCode(code); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_color) (NCURSES_SP_DCLx NCURSES_PAIRS_T pair_arg) +{ + return _nc_slk_color(SP_PARM, pair_arg); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_color(NCURSES_PAIRS_T pair_arg) +{ + return NCURSES_SP_NAME(slk_color) (CURRENT_SCREEN, pair_arg); +} +#endif + +#if NCURSES_EXT_COLORS +NCURSES_EXPORT(int) +NCURSES_SP_NAME(extended_slk_color) (NCURSES_SP_DCLx int pair_arg) +{ + return _nc_slk_color(SP_PARM, pair_arg); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +extended_slk_color(int pair_arg) +{ + return NCURSES_SP_NAME(extended_slk_color) (CURRENT_SCREEN, pair_arg); +} +#endif +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkinit.c b/contrib/ncurses/ncurses/base/lib_slkinit.c new file mode 100644 index 00000000..318077fc --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkinit.c @@ -0,0 +1,89 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2009,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * lib_slkinit.c + * Soft key routines. + * Initialize soft labels. Called by the user before initscr(). + */ +#include + +MODULE_ID("$Id: lib_slkinit.c,v 1.16 2022/07/09 18:58:58 tom Exp $") + +#ifdef USE_SP_RIPOFF +#define SoftkeyFormat SP_PARM->slk_format +#else +#define SoftkeyFormat _nc_globals.slk_format +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_init) (NCURSES_SP_DCLx int format) +{ + int code = ERR; + + START_TRACE(); + T((T_CALLED("slk_init(%p,%d)"), (void *) SP_PARM, format)); + + if (format >= 0 + && format <= 3 +#ifdef USE_SP_RIPOFF + && SP_PARM + && SP_PARM->_prescreen +#endif + && !SoftkeyFormat) { + SoftkeyFormat = 1 + format; + code = NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx + -SLK_LINES(SoftkeyFormat), + _nc_slk_initialize); + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_init(int format) +{ + int rc; + + _nc_init_pthreads(); + _nc_lock_global(prescreen); + START_TRACE(); + rc = NCURSES_SP_NAME(slk_init) (CURRENT_SCREEN_PRE, format); + _nc_unlock_global(prescreen); + + return rc; +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slklab.c b/contrib/ncurses/ncurses/base/lib_slklab.c new file mode 100644 index 00000000..894ff26d --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slklab.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2003,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer, 1998,2009 * + * and: Thomas E. Dickey 1998-on * + ****************************************************************************/ + +/* + * lib_slklab.c + * Soft key routines. + * Fetch the label text. + */ +#include + +MODULE_ID("$Id: lib_slklab.c,v 1.11 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(slk_label) (NCURSES_SP_DCLx int n) +{ + T((T_CALLED("slk_label(%p,%d)"), (void *) SP_PARM, n)); + + if (SP_PARM == 0 || SP_PARM->_slk == 0 || n < 1 || n > SP_PARM->_slk->labcnt) + returnPtr(0); + returnPtr(SP_PARM->_slk->ent[n - 1].ent_text); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +slk_label(int n) +{ + return NCURSES_SP_NAME(slk_label) (CURRENT_SCREEN, n); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkrefr.c b/contrib/ncurses/ncurses/base/lib_slkrefr.c new file mode 100644 index 00000000..85b77748 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkrefr.c @@ -0,0 +1,188 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2013,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1996-on * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* + * lib_slkrefr.c + * Write SLK window to the (virtual) screen. + */ +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_slkrefr.c,v 1.33 2024/07/27 19:23:59 tom Exp $") + +#ifdef USE_TERM_DRIVER +#define NumLabels InfoOf(SP_PARM).numlabels +#else +#define NumLabels num_labels +#endif + +/* + * Paint the info line for the PC style SLK emulation. + */ +static void +slk_paint_info(WINDOW *win) +{ + const SCREEN *sp = _nc_screen_of(win); + + if (win && sp && (sp->slk_format == 4)) { + int i; + + (void) mvwhline(win, 0, 0, 0, getmaxx(win)); + wmove(win, 0, 0); + + for (i = 0; i < sp->_slk->maxlab; i++) { + mvwprintw(win, 0, sp->_slk->ent[i].ent_x, "F%d", i + 1); + } + } +} + +/* + * Write the soft labels to the soft-key window. + */ +static void +slk_intern_refresh(SCREEN *sp) +{ + int i; + int fmt; + SLK *slk; + int numlab; + + if (sp == 0) + return; + + slk = sp->_slk; + fmt = sp->slk_format; + numlab = NumLabels; + + if (slk->hidden) + return; + + for (i = 0; i < slk->labcnt; i++) { + if (slk->dirty || slk->ent[i].dirty) { + if (slk->ent[i].visible) { + if (numlab > 0 && SLK_STDFMT(fmt)) { +#ifdef USE_TERM_DRIVER + CallDriver_2(sp, td_hwlabel, i + 1, slk->ent[i].form_text); +#else + if (i < num_labels) { + NCURSES_PUTP2("plab_norm", + TPARM_2(plab_norm, + i + 1, + slk->ent[i].form_text)); + } +#endif + } else { + if (fmt == 4) + slk_paint_info(slk->win); + wmove(slk->win, SLK_LINES(fmt) - 1, slk->ent[i].ent_x); + (void) wattrset(slk->win, (int) AttrOf(slk->attr)); + waddstr(slk->win, slk->ent[i].form_text); + /* if we simulate SLK's, it is looking much more + natural to use the current ATTRIBUTE also + for the label window */ + (void) wattrset(slk->win, (int) WINDOW_ATTRS(StdScreen(sp))); + } + } + slk->ent[i].dirty = FALSE; + } + } + slk->dirty = FALSE; + + if (numlab > 0) { +#ifdef USE_TERM_DRIVER + CallDriver_1(sp, td_hwlabelOnOff, slk->hidden ? FALSE : TRUE); +#else + if (slk->hidden) { + NCURSES_PUTP2("label_off", label_off); + } else { + NCURSES_PUTP2("label_on", label_on); + } +#endif + } +} + +/* + * Refresh the soft labels. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_noutrefresh) (NCURSES_SP_DCL0) +{ + T((T_CALLED("slk_noutrefresh(%p)"), (void *) SP_PARM)); + + if (SP_PARM == 0 || SP_PARM->_slk == 0) + returnCode(ERR); + if (SP_PARM->_slk->hidden) + returnCode(OK); + slk_intern_refresh(SP_PARM); + + returnCode(wnoutrefresh(SP_PARM->_slk->win)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_noutrefresh(void) +{ + return NCURSES_SP_NAME(slk_noutrefresh) (CURRENT_SCREEN); +} +#endif + +/* + * Refresh the soft labels. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_DCL0) +{ + T((T_CALLED("slk_refresh(%p)"), (void *) SP_PARM)); + + if (SP_PARM == 0 || SP_PARM->_slk == 0) + returnCode(ERR); + if (SP_PARM->_slk->hidden) + returnCode(OK); + slk_intern_refresh(SP_PARM); + + returnCode(wrefresh(SP_PARM->_slk->win)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_refresh(void) +{ + return NCURSES_SP_NAME(slk_refresh) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slkset.c b/contrib/ncurses/ncurses/base/lib_slkset.c new file mode 100644 index 00000000..3e777f14 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slkset.c @@ -0,0 +1,157 @@ +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2011,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* + * lib_slkset.c + * Set soft label text. + */ +#include +#include + +#if USE_WIDEC_SUPPORT +#if HAVE_WCTYPE_H +#include +#endif +#endif + +MODULE_ID("$Id: lib_slkset.c,v 1.26 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_set) (NCURSES_SP_DCLx int i, const char *astr, int format) +{ + SLK *slk; + int offset = 0; + int numchrs; + int numcols; + int limit; + const char *str = astr; + const char *p; + + T((T_CALLED("slk_set(%p, %d, \"%s\", %d)"), (void *) SP_PARM, i, str, format)); + + if (SP_PARM == 0 + || (slk = SP_PARM->_slk) == 0 + || i < 1 + || i > slk->labcnt + || format < 0 + || format > 2) + returnCode(ERR); + if (str == 0) + str = ""; + --i; /* Adjust numbering of labels */ + + limit = MAX_SKEY_LEN(SP_PARM->slk_format); + while (isspace(UChar(*str))) + str++; /* skip over leading spaces */ + p = str; + +#if USE_WIDEC_SUPPORT + numcols = 0; + while (*p != 0) { + mbstate_t state; + wchar_t wc; + size_t need; + + init_mb(state); + need = mbrtowc(0, p, strlen(p), &state); + if (need == (size_t) -1) + break; + mbrtowc(&wc, p, need, &state); + if (!iswprint((wint_t) wc)) + break; + if (_nc_wacs_width(wc) + numcols > limit) + break; + numcols += _nc_wacs_width(wc); + p += need; + } + numchrs = (int) (p - str); +#else + while (isprint(UChar(*p))) + p++; /* The first non-print stops */ + + numcols = (int) (p - str); + if (numcols > limit) + numcols = limit; + numchrs = numcols; +#endif + + FreeIfNeeded(slk->ent[i].ent_text); + if ((slk->ent[i].ent_text = strdup(str)) == 0) + returnCode(ERR); + slk->ent[i].ent_text[numchrs] = '\0'; + + if ((slk->ent[i].form_text = (char *) _nc_doalloc(slk->ent[i].form_text, + (size_t) (limit + + numchrs + 1)) + ) == 0) + returnCode(ERR); + + switch (format) { + case 0: /* left-justified */ + offset = 0; + break; + case 1: /* centered */ + offset = (limit - numcols) / 2; + break; + case 2: /* right-justified */ + offset = limit - numcols; + break; + } + if (offset <= 0) + offset = 0; + else + memset(slk->ent[i].form_text, ' ', (size_t) offset); + + memcpy(slk->ent[i].form_text + offset, + slk->ent[i].ent_text, + (size_t) numchrs); + + if (offset < limit) { + memset(slk->ent[i].form_text + offset + numchrs, + ' ', + (size_t) (limit - (offset + numcols))); + } + + slk->ent[i].form_text[numchrs - numcols + limit] = 0; + slk->ent[i].dirty = TRUE; + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_set(int i, const char *astr, int format) +{ + return NCURSES_SP_NAME(slk_set) (CURRENT_SCREEN, i, astr, format); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_slktouch.c b/contrib/ncurses/ncurses/base/lib_slktouch.c new file mode 100644 index 00000000..6696a25f --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_slktouch.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer 1997,2009 * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * lib_slktouch.c + * Soft key routines. + * Force the code to believe that the soft keys have been changed. + */ +#include + +MODULE_ID("$Id: lib_slktouch.c,v 1.9 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(slk_touch) (NCURSES_SP_DCL0) +{ + T((T_CALLED("slk_touch(%p)"), (void *) SP_PARM)); + + if (SP_PARM == 0 || SP_PARM->_slk == 0) + returnCode(ERR); + SP_PARM->_slk->dirty = TRUE; + + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +slk_touch(void) +{ + return NCURSES_SP_NAME(slk_touch) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/lib_touch.c b/contrib/ncurses/ncurses/base/lib_touch.c new file mode 100644 index 00000000..d8d59e13 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_touch.c @@ -0,0 +1,98 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_touch.c +** +** The routines untouchwin(), +** wtouchln(), +** is_linetouched() +** is_wintouched(). +** +*/ + +#include + +MODULE_ID("$Id: lib_touch.c,v 1.16 2020/02/02 23:34:34 tom Exp $") + +#undef is_linetouched + +NCURSES_EXPORT(bool) +is_linetouched(WINDOW *win, int line) +{ + T((T_CALLED("is_linetouched(%p,%d)"), (void *) win, line)); + + /* XSI doesn't define any error, and gcc ultimately made it impossible */ + if (!win || (line > win->_maxy) || (line < 0)) { + returnCode(FALSE); + } + + returnCode(win->_line[line].firstchar != _NOCHANGE ? TRUE : FALSE); +} + +NCURSES_EXPORT(bool) +is_wintouched(WINDOW *win) +{ + T((T_CALLED("is_wintouched(%p)"), (void *) win)); + + if (win) { + int i; + + for (i = 0; i <= win->_maxy; i++) + if (win->_line[i].firstchar != _NOCHANGE) + returnCode(TRUE); + } + returnCode(FALSE); +} + +NCURSES_EXPORT(int) +wtouchln(WINDOW *win, int y, int n, int changed) +{ + int i; + + T((T_CALLED("wtouchln(%p,%d,%d,%d)"), (void *) win, y, n, changed)); + + if (!win || (n < 0) || (y < 0) || (y > win->_maxy)) + returnCode(ERR); + + for (i = y; i < y + n; i++) { + if (i > win->_maxy) + break; + win->_line[i].firstchar = (NCURSES_SIZE_T) (changed ? 0 : _NOCHANGE); + win->_line[i].lastchar = (NCURSES_SIZE_T) (changed + ? win->_maxx + : _NOCHANGE); + } + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/base/lib_ungetch.c b/contrib/ncurses/ncurses/base/lib_ungetch.c new file mode 100644 index 00000000..fcbe6f4a --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_ungetch.c @@ -0,0 +1,94 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2011,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_ungetch.c +** +** The routine ungetch(). +** +*/ + +#include + +MODULE_ID("$Id: lib_ungetch.c,v 1.17 2020/02/02 23:34:34 tom Exp $") + +#include + +#ifdef TRACE +NCURSES_EXPORT(void) +_nc_fifo_dump(SCREEN *sp) +{ + int i; + T(("head = %d, tail = %d, peek = %d", head, tail, peek)); + for (i = 0; i < 10; i++) + T(("char %d = %s", i, _nc_tracechar(sp, sp->_fifo[i]))); +} +#endif /* TRACE */ + +NCURSES_EXPORT(int) +safe_ungetch(SCREEN *sp, int ch) +{ + int rc = ERR; + + T((T_CALLED("ungetch(%p,%s)"), (void *) sp, _nc_tracechar(sp, ch))); + + if (sp != 0 && tail >= 0) { + if (head < 0) { + head = 0; + t_inc(); + peek = tail; /* no raw keys */ + } else { + h_dec(); + } + + sp->_fifo[head] = ch; + T(("ungetch %s ok", _nc_tracechar(sp, ch))); +#ifdef TRACE + if (USE_TRACEF(TRACE_IEVENT)) { + _nc_fifo_dump(sp); + _nc_unlock_global(tracef); + } +#endif + rc = OK; + } + returnCode(rc); +} + +NCURSES_EXPORT(int) +ungetch(int ch) +{ + return safe_ungetch(CURRENT_SCREEN, ch); +} diff --git a/contrib/ncurses/ncurses/base/lib_vline.c b/contrib/ncurses/ncurses/base/lib_vline.c new file mode 100644 index 00000000..ae4af62b --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_vline.c @@ -0,0 +1,89 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Sven Verdoolaege 2001 * + ****************************************************************************/ + +/* +** lib_vline.c +** +** The routine wvline(). +** +*/ + +#include + +MODULE_ID("$Id: lib_vline.c,v 1.15 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wvline(WINDOW *win, chtype ch, int n) +{ + int code = ERR; + + T((T_CALLED("wvline(%p,%s,%d)"), (void *) win, _tracechtype(ch), n)); + + if (win) { + NCURSES_CH_T wch; + int row = win->_cury; + int col = win->_curx; + int end = row + n - 1; + + if (end > win->_maxy) + end = win->_maxy; + + if (ch == 0) + SetChar2(wch, ACS_VLINE); + else + SetChar2(wch, ch); + wch = _nc_render(win, wch); + + while (end >= row) { + struct ldat *line = &(win->_line[end]); +#if USE_WIDEC_SUPPORT + if (col > 0 && isWidecExt(line->text[col])) { + SetChar2(line->text[col - 1], ' '); + } + if (col < win->_maxx && isWidecExt(line->text[col + 1])) { + SetChar2(line->text[col + 1], ' '); + } +#endif + line->text[col] = wch; + CHANGED_CELL(line, col); + end--; + } + + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/lib_wattroff.c b/contrib/ncurses/ncurses/base/lib_wattroff.c new file mode 100644 index 00000000..eac07f08 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_wattroff.c @@ -0,0 +1,65 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2006,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_wattroff.c +** +** The routine wattr_off(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_wattroff.c,v 1.11 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wattr_off(WINDOW *win, attr_t at, void *opts GCC_UNUSED) +{ + T((T_CALLED("wattr_off(%p,%s)"), (void *) win, _traceattr(at))); + if (win) { + T(("... current %s (%d)", + _traceattr(WINDOW_ATTRS(win)), + GET_WINDOW_PAIR(win))); + + if_EXT_COLORS({ + if (at & A_COLOR) + win->_color = 0; + }); + toggle_attr_off(WINDOW_ATTRS(win), at); + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_wattron.c b/contrib/ncurses/ncurses/base/lib_wattron.c new file mode 100644 index 00000000..906021d3 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_wattron.c @@ -0,0 +1,67 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_wattron.c +** +** The routines wattr_on(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_wattron.c,v 1.13 2022/04/15 22:34:38 tom Exp $") + +NCURSES_EXPORT(int) +wattr_on(WINDOW *win, attr_t at, void *opts GCC_UNUSED) +{ + T((T_CALLED("wattr_on(%p,%s)"), (void *) win, _traceattr(at))); + if (win != 0) { + T(("... current %s (%d)", + _traceattr(WINDOW_ATTRS(win)), + GET_WINDOW_PAIR(win))); + + if_EXT_COLORS({ + if (at & A_COLOR) { + win->_color = PairNumber(at); + set_extended_pair(opts, win->_color); + } + }); + toggle_attr_on(WINDOW_ATTRS(win), at); + returnCode(OK); + } else + returnCode(ERR); +} diff --git a/contrib/ncurses/ncurses/base/lib_winch.c b/contrib/ncurses/ncurses/base/lib_winch.c new file mode 100644 index 00000000..91253d10 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_winch.c @@ -0,0 +1,55 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998 * + ****************************************************************************/ + +/* +** lib_winch.c +** +** The routine winch(). +** +*/ + +#include + +MODULE_ID("$Id: lib_winch.c,v 1.9 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(chtype) +winch(WINDOW *win) +{ + T((T_CALLED("winch(%p)"), (void *) win)); + if (win != 0) { + returnChtype((chtype) CharOf(win->_line[win->_cury].text[win->_curx]) + | AttrOf(win->_line[win->_cury].text[win->_curx])); + } else { + returnChtype(0); + } +} diff --git a/contrib/ncurses/ncurses/base/lib_window.c b/contrib/ncurses/ncurses/base/lib_window.c new file mode 100644 index 00000000..5323fbf0 --- /dev/null +++ b/contrib/ncurses/ncurses/base/lib_window.c @@ -0,0 +1,254 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* +** lib_window.c +** +** +*/ + +#include + +MODULE_ID("$Id: lib_window.c,v 1.32 2021/10/23 23:06:24 tom Exp $") + +NCURSES_EXPORT(void) +_nc_synchook(WINDOW *win) +/* hook to be called after each window change */ +{ + if (win->_immed) + wrefresh(win); + if (win->_sync) + wsyncup(win); +} + +NCURSES_EXPORT(int) +mvderwin(WINDOW *win, int y, int x) +/* move a derived window */ +{ + WINDOW *orig; + int rc = ERR; + + T((T_CALLED("mvderwin(%p,%d,%d)"), (void *) win, y, x)); + + if (win != 0 + && (orig = win->_parent) != 0 + && (x >= 0 && y >= 0) + && (x + getmaxx(win) <= getmaxx(orig)) + && (y + getmaxy(win) <= getmaxy(orig))) { + int i; + + wsyncup(win); + win->_parx = x; + win->_pary = y; + for (i = 0; i < getmaxy(win); i++) + win->_line[i].text = &(orig->_line[y++].text[x]); + rc = OK; + } + returnCode(rc); +} + +NCURSES_EXPORT(int) +syncok(WINDOW *win, bool bf) +/* enable/disable automatic wsyncup() on each change to window */ +{ + T((T_CALLED("syncok(%p,%d)"), (void *) win, bf)); + + if (win) { + win->_sync = bf; + returnCode(OK); + } else + returnCode(ERR); +} + +NCURSES_EXPORT(void) +wsyncup(WINDOW *win) +/* mark changed every cell in win's ancestors that is changed in win */ +/* Rewritten by J. Pfeifer, 1-Apr-96 (don't even think that...) */ +{ + WINDOW *wp; + + T((T_CALLED("wsyncup(%p)"), (void *) win)); + if (win && win->_parent) { + for (wp = win; wp->_parent; wp = wp->_parent) { + int y; + WINDOW *pp = wp->_parent; + + assert((wp->_pary <= pp->_maxy) && + ((wp->_pary + wp->_maxy) <= pp->_maxy)); + + for (y = 0; y <= wp->_maxy; y++) { + int left = wp->_line[y].firstchar; + if (left >= 0) { /* line is touched */ + struct ldat *line = &(pp->_line[wp->_pary + y]); + /* left & right character in parent window coordinates */ + int right = wp->_line[y].lastchar + wp->_parx; + left += wp->_parx; + + CHANGED_RANGE(line, left, right); + } + } + } + } + returnVoid; +} + +NCURSES_EXPORT(void) +wsyncdown(WINDOW *win) +/* mark changed every cell in win that is changed in any of its ancestors */ +/* Rewritten by J. Pfeifer, 1-Apr-96 (don't even think that...) */ +{ + T((T_CALLED("wsyncdown(%p)"), (void *) win)); + + if (win != NULL && win->_parent != NULL) { + WINDOW *pp = win->_parent; + int y; + + /* This recursion guarantees, that the changes are propagated down- + wards from the root to our direct parent. */ + wsyncdown(pp); + + /* and now we only have to propagate the changes from our direct + parent, if there are any. */ + assert((win->_pary <= pp->_maxy) && + ((win->_pary + win->_maxy) <= pp->_maxy)); + + for (y = 0; y <= win->_maxy; y++) { + if (pp->_line[win->_pary + y].firstchar >= 0) { /* parent changed */ + struct ldat *line = &(win->_line[y]); + /* left and right character in child coordinates */ + int left = pp->_line[win->_pary + y].firstchar - win->_parx; + int right = pp->_line[win->_pary + y].lastchar - win->_parx; + /* The change may be outside the child's range */ + if (left < 0) + left = 0; + if (right > win->_maxx) + right = win->_maxx; + CHANGED_RANGE(line, left, right); + } + } + } + returnVoid; +} + +NCURSES_EXPORT(void) +wcursyncup(WINDOW *win) +/* sync the cursor in all derived windows to its value in the base window */ +{ + WINDOW *wp; + + T((T_CALLED("wcursyncup(%p)"), (void *) win)); + for (wp = win; wp && wp->_parent; wp = wp->_parent) { + wmove(wp->_parent, wp->_pary + wp->_cury, wp->_parx + wp->_curx); + } + returnVoid; +} + +NCURSES_EXPORT(WINDOW *) +dupwin(WINDOW *win) +/* make an exact duplicate of the given window */ +{ + WINDOW *nwin = 0; + + T((T_CALLED("dupwin(%p)"), (void *) win)); + + if (win != 0) { +#if NCURSES_SP_FUNCS + SCREEN *sp = _nc_screen_of(win); +#endif + _nc_lock_global(curses); + if (IS_PAD(win)) { + nwin = NCURSES_SP_NAME(newpad) (NCURSES_SP_ARGx + win->_maxy + 1, + win->_maxx + 1); + } else { + nwin = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx + win->_maxy + 1, + win->_maxx + 1, + win->_begy, + win->_begx); + } + + if (nwin != 0) { + int i; + size_t linesize; + + nwin->_curx = win->_curx; + nwin->_cury = win->_cury; + nwin->_maxy = win->_maxy; + nwin->_maxx = win->_maxx; + nwin->_begy = win->_begy; + nwin->_begx = win->_begx; + nwin->_yoffset = win->_yoffset; + + nwin->_flags = win->_flags & ~_SUBWIN; + /* Due to the use of newwin(), the clone is not a subwindow. + * The text is really copied into the clone. + */ + + WINDOW_ATTRS(nwin) = WINDOW_ATTRS(win); + nwin->_nc_bkgd = win->_nc_bkgd; + + nwin->_notimeout = win->_notimeout; + nwin->_clear = win->_clear; + nwin->_leaveok = win->_leaveok; + nwin->_scroll = win->_scroll; + nwin->_idlok = win->_idlok; + nwin->_idcok = win->_idcok; + nwin->_immed = win->_immed; + nwin->_sync = win->_sync; + nwin->_use_keypad = win->_use_keypad; + nwin->_delay = win->_delay; + + nwin->_parx = 0; + nwin->_pary = 0; + nwin->_parent = (WINDOW *) 0; + /* See above: the clone isn't a subwindow! */ + + nwin->_regtop = win->_regtop; + nwin->_regbottom = win->_regbottom; + + if (IS_PAD(win)) + nwin->_pad = win->_pad; + + linesize = (unsigned) (win->_maxx + 1) * sizeof(NCURSES_CH_T); + for (i = 0; i <= nwin->_maxy; i++) { + memcpy(nwin->_line[i].text, win->_line[i].text, linesize); + nwin->_line[i].firstchar = win->_line[i].firstchar; + nwin->_line[i].lastchar = win->_line[i].lastchar; + } + } + _nc_unlock_global(curses); + } + returnWin(nwin); +} diff --git a/contrib/ncurses/ncurses/base/nc_panel.c b/contrib/ncurses/ncurses/base/nc_panel.c new file mode 100644 index 00000000..002f118e --- /dev/null +++ b/contrib/ncurses/ncurses/base/nc_panel.c @@ -0,0 +1,54 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2000,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: nc_panel.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(struct panelhook *) +NCURSES_SP_NAME(_nc_panelhook) (NCURSES_SP_DCL0) +{ + return (SP_PARM + ? &(SP_PARM->_panelHook) + : (CURRENT_SCREEN + ? &(CURRENT_SCREEN->_panelHook) + : 0)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(struct panelhook *) +_nc_panelhook(void) +{ + return NCURSES_SP_NAME(_nc_panelhook) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/base/new_pair.c b/contrib/ncurses/ncurses/base/new_pair.c new file mode 100644 index 00000000..9ce0bb7f --- /dev/null +++ b/contrib/ncurses/ncurses/base/new_pair.c @@ -0,0 +1,393 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* new_pair.c + * + * New color-pair functions, alloc_pair and free_pair + */ + +#define NEW_PAIR_INTERNAL 1 +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +#ifdef USE_TERM_DRIVER +#define MaxColors InfoOf(SP_PARM).maxcolors +#else +#define MaxColors max_colors +#endif + +#if NCURSES_EXT_COLORS + +/* fix redefinition versys tic.h */ +#undef entry +#define entry my_entry +#undef ENTRY +#define ENTRY my_ENTRY + +#include + +#endif + +MODULE_ID("$Id: new_pair.c,v 1.25 2024/10/05 20:51:29 tom Exp $") + +#if NCURSES_EXT_COLORS + +#ifdef NEW_PAIR_DEBUG + +static int +prev_len(SCREEN *sp, int pair) +{ + int result = 1; + int base = pair; + colorpair_t *list = sp->_color_pairs; + while (list[pair].prev != base) { + result++; + pair = list[pair].prev; + } + return result; +} + +static int +next_len(SCREEN *sp, int pair) +{ + int result = 1; + int base = pair; + colorpair_t *list = sp->_color_pairs; + while (list[pair].next != base) { + result++; + pair = list[pair].next; + } + return result; +} + +/* + * Trace the contents of LRU color-pairs. + */ +static void +dumpit(SCREEN *sp, int pair, const char *tag) +{ + colorpair_t *list = sp->_color_pairs; + char bigbuf[256 * 20]; + char *p = bigbuf; + int n; + size_t have = sizeof(bigbuf); + + _nc_STRCPY(p, tag, have); + for (n = 0; n < sp->_pair_alloc; ++n) { + if (list[n].mode != cpFREE) { + p += strlen(p); + if ((size_t) (p - bigbuf) + 50 > have) + break; + _nc_SPRINTF(p, _nc_SLIMIT(have - (p - bigbuf)) + " %d%c(%d,%d)", + n, n == pair ? '@' : ':', list[n].next, list[n].prev); + } + } + T(("(%d/%d) %ld - %s", + next_len(sp, 0), + prev_len(sp, 0), + strlen(bigbuf), bigbuf)); + + if (next_len(sp, 0) != prev_len(sp, 0)) { + endwin(); + ExitProgram(EXIT_FAILURE); + } +} +#else +#define dumpit(sp, pair, tag) /* nothing */ +#endif + +static int +compare_data(const void *a, const void *b) +{ + const colorpair_t *p = (const colorpair_t *) a; + const colorpair_t *q = (const colorpair_t *) b; + return ((p->fg == q->fg) + ? (p->bg - q->bg) + : (p->fg - q->fg)); +} + +static int +_nc_find_color_pair(SCREEN *sp, int fg, int bg) +{ + colorpair_t find; + int result = -1; + + find.fg = fg; + find.bg = bg; + if (sp != 0) { + void *pp; + if ((pp = tfind(&find, &sp->_ordered_pairs, compare_data)) != 0) { + const colorpair_t *temp = *(colorpair_t **) pp; + result = (int) (temp - sp->_color_pairs); + } + } + return result; +} + +static void +delink_color_pair(SCREEN *sp, int pair) +{ + colorpair_t *list = sp->_color_pairs; + int prev = list[pair].prev; + int next = list[pair].next; + + /* delink this from its current location */ + if (list[prev].next == pair && + list[next].prev == pair) { + list[prev].next = next; + list[next].prev = prev; + dumpit(sp, pair, "delinked"); + } +} + +/* + * Discard all nodes in the fast-index. + */ +NCURSES_EXPORT(void) +_nc_free_ordered_pairs(SCREEN *sp) +{ + if (sp && sp->_ordered_pairs && sp->_pair_alloc) { + int n; + for (n = 0; n < sp->_pair_alloc; ++n) { + tdelete(&sp->_color_pairs[n], &sp->_ordered_pairs, compare_data); + } + } +} + +/* + * Use this call to update the fast-index when modifying an entry in the color + * pair table. + */ +NCURSES_EXPORT(void) +_nc_reset_color_pair(SCREEN *sp, int pair, const colorpair_t * next) +{ + colorpair_t *last; + + if (ValidPair(sp, pair)) { + bool used; + + ReservePairs(sp, pair); + last = &(sp->_color_pairs[pair]); + delink_color_pair(sp, pair); + if (last->mode > cpFREE && + (last->fg != next->fg || last->bg != next->bg)) { + /* remove the old entry from fast index */ + tdelete(last, &sp->_ordered_pairs, compare_data); + used = FALSE; + } else { + used = (last->mode != cpFREE); + } + if (!used) { + /* create a new entry in fast index */ + *last = *next; + tsearch(last, &sp->_ordered_pairs, compare_data); + } + } +} + +/* + * Use this call to relink the newest pair to the front of the list, keeping + * "0" first. + */ +NCURSES_EXPORT(void) +_nc_set_color_pair(SCREEN *sp, int pair, int mode) +{ + if (ValidPair(sp, pair)) { + colorpair_t *list = sp->_color_pairs; + dumpit(sp, pair, "SET_PAIR"); + list[0].mode = cpKEEP; + if (list[pair].mode <= cpFREE) + sp->_pairs_used++; + list[pair].mode = mode; + if (list[0].next != pair) { + /* link it at the front of the list */ + list[pair].next = list[0].next; + list[list[pair].next].prev = pair; + list[pair].prev = 0; + list[0].next = pair; + } + dumpit(sp, pair, "...after"); + } +} + +/* + * If we reallocate the color-pair array, we have to adjust the fast-index. + */ +NCURSES_EXPORT(void) +_nc_copy_pairs(SCREEN *sp, colorpair_t * target, colorpair_t * source, int length) +{ + int n; + for (n = 0; n < length; ++n) { + const void *find = tfind(source + n, &sp->_ordered_pairs, compare_data); + if (find != 0) { + tdelete(source + n, &sp->_ordered_pairs, compare_data); + tsearch(target + n, &sp->_ordered_pairs, compare_data); + } + } +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(alloc_pair) (NCURSES_SP_DCLx int fg, int bg) +{ + int pair; + + T((T_CALLED("alloc_pair(%d,%d)"), fg, bg)); + if (SP_PARM == 0) { + pair = -1; + } else if ((pair = _nc_find_color_pair(SP_PARM, fg, bg)) < 0) { + /* + * Check if all of the slots have been used. If not, find one and + * use that. + */ + if (SP_PARM->_pairs_used + 1 < SP_PARM->_pair_limit) { + bool found = FALSE; + int hint = SP_PARM->_recent_pair; + + /* + * The linear search is done to allow mixing calls to init_pair() + * and alloc_pair(). The former can make gaps... + */ + for (pair = hint + 1; pair < SP_PARM->_pair_alloc; pair++) { + if (SP_PARM->_color_pairs[pair].mode == cpFREE) { + T(("found gap %d", pair)); + found = TRUE; + break; + } + } + if (!found && (SP_PARM->_pair_alloc < SP_PARM->_pair_limit)) { + pair = SP_PARM->_pair_alloc; + ReservePairs(SP_PARM, pair); + if (SP_PARM->_color_pairs == 0) { + pair = -1; + } else { + found = TRUE; + } + } + if (!found && SP_PARM->_color_pairs != NULL) { + for (pair = 1; pair <= hint; pair++) { + if (SP_PARM->_color_pairs[pair].mode == cpFREE) { + T(("found gap %d", pair)); + found = TRUE; + break; + } + } + } + if (found) { + SP_PARM->_recent_pair = pair; + } else { + pair = ERR; + } + } else { + /* reuse the oldest one */ + pair = SP_PARM->_color_pairs[0].prev; + T(("reusing %d", pair)); + } + + if (_nc_init_pair(SP_PARM, pair, fg, bg) == ERR) + pair = ERR; + } + returnCode(pair); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(find_pair) (NCURSES_SP_DCLx int fg, int bg) +{ + int pair; + + T((T_CALLED("find_pair(%d,%d)"), fg, bg)); + pair = _nc_find_color_pair(SP_PARM, fg, bg); + returnCode(pair); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(free_pair) (NCURSES_SP_DCLx int pair) +{ + int result = ERR; + T((T_CALLED("free_pair(%d)"), pair)); + if (ValidPair(SP_PARM, pair) && pair < SP_PARM->_pair_alloc) { + colorpair_t *cp = &(SP_PARM->_color_pairs[pair]); + if (pair != 0) { + _nc_change_pair(SP_PARM, pair); + delink_color_pair(SP_PARM, pair); + tdelete(cp, &SP_PARM->_ordered_pairs, compare_data); + cp->mode = cpFREE; + result = OK; + SP_PARM->_pairs_used--; + } + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +alloc_pair(int f, int b) +{ + return NCURSES_SP_NAME(alloc_pair) (CURRENT_SCREEN, f, b); +} + +NCURSES_EXPORT(int) +find_pair(int f, int b) +{ + return NCURSES_SP_NAME(find_pair) (CURRENT_SCREEN, f, b); +} + +NCURSES_EXPORT(int) +free_pair(int pair) +{ + return NCURSES_SP_NAME(free_pair) (CURRENT_SCREEN, pair); +} +#endif + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_new_pair_leaks(SCREEN *sp) +{ + if (sp->_color_pairs) { + while (sp->_color_pairs[0].next) { + free_pair(sp->_color_pairs[0].next); + } + } +} +#endif + +#else +void _nc_new_pair(void); +void +_nc_new_pair(void) +{ +} +#endif /* NCURSES_EXT_COLORS */ diff --git a/contrib/ncurses/ncurses/base/resizeterm.c b/contrib/ncurses/ncurses/base/resizeterm.c new file mode 100644 index 00000000..e54b7df6 --- /dev/null +++ b/contrib/ncurses/ncurses/base/resizeterm.c @@ -0,0 +1,541 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* + * This is an extension to the curses library. It provides callers with a hook + * into the NCURSES data to resize windows, primarily for use by programs + * running in an X Window terminal (e.g., xterm). I abstracted this module + * from my application library for NCURSES because it must be compiled with + * the private data structures -- T.Dickey 1995/7/4. + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: resizeterm.c,v 1.56 2024/09/22 20:25:15 tom Exp $") + +/* + * If we're trying to be reentrant, do not want any local statics. + */ +#if USE_REENTRANT +#define EXTRA_ARGS , CurLines, CurCols +#define EXTRA_DCLS , int CurLines, int CurCols +#else +static int current_lines; +static int current_cols; +#define CurLines current_lines +#define CurCols current_cols +#define EXTRA_ARGS /* nothing */ +#define EXTRA_DCLS /* nothing */ +#endif + +#if NCURSES_SP_FUNCS && !defined(USE_SP_WINDOWLIST) +#define UNUSED_SP (void) sp +#else +#define UNUSED_SP /* nothing */ +#endif + +#ifdef TRACE +static void +show_window_sizes(const char *name) +{ + SCREEN *sp; + WINDOWLIST *wp; + + _nc_lock_global(curses); + for (each_screen(sp)) { + _tracef("%s resizing: %p: %2d x %2d (%2d x %2d)", name, (void *) sp, + *(ptrLines(sp)), + *(ptrCols(sp)), + screen_lines(sp), screen_columns(sp)); + for (each_window(sp, wp)) { + _tracef(" window %p is %2ld x %2ld at %2ld,%2ld", + (void *) &(wp->win), + (long) wp->win._maxy + 1, + (long) wp->win._maxx + 1, + (long) wp->win._begy, + (long) wp->win._begx); + } + } + _nc_unlock_global(curses); +} +#endif + +/* + * Return true if the given dimensions do not match the internal terminal + * structure's size. + */ +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_DCLx int ToLines, int ToCols) +{ + T((T_CALLED("is_term_resized(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); + returnCode(ToLines > 0 + && ToCols > 0 + && SP_PARM != NULL + && (ToLines != screen_lines(SP_PARM) + || ToCols != screen_columns(SP_PARM))); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +is_term_resized(int ToLines, int ToCols) +{ + return NCURSES_SP_NAME(is_term_resized) (CURRENT_SCREEN, ToLines, ToCols); +} +#endif + +/* + */ +static ripoff_t * +ripped_window(WINDOW *win) +{ + ripoff_t *result = 0; + ripoff_t *rop; + + if (win != 0) { +#ifdef USE_SP_RIPOFF + SCREEN *sp = _nc_screen_of(win); +#endif + for (each_ripoff(rop)) { + if (rop->win == win && rop->line != 0) { + result = rop; + break; + } + } + } + return result; +} + +/* + * Returns the number of lines from the bottom for the beginning of a ripped + * off window. + */ +static int +ripped_bottom(WINDOW *win) +{ + int result = 0; + + if (win != 0) { + ripoff_t *rop; + +#ifdef USE_SP_RIPOFF + SCREEN *sp = _nc_screen_of(win); +#endif + for (each_ripoff(rop)) { + if (rop->line < 0) { + result -= rop->line; + if (rop->win == win) { + break; + } + } + } + } + return result; +} + +/* + * Return the number of levels of child-windows under the current window. + */ +static int +child_depth(WINDOW *cmp) +{ + int depth = 0; + + if (cmp != 0) { +#ifdef USE_SP_WINDOWLIST + SCREEN *sp = _nc_screen_of(cmp); +#endif + WINDOWLIST *wp; + + for (each_window(sp, wp)) { + WINDOW *tst = &(wp->win); + if (tst->_parent == cmp) { + depth = 1 + child_depth(tst); + break; + } + } + } + return depth; +} + +/* + * Return the number of levels of parent-windows above the current window. + */ +static int +parent_depth(WINDOW *cmp) +{ + int depth = 0; + + if (cmp != 0) { + WINDOW *tst; + while ((tst = cmp->_parent) != 0) { + ++depth; + cmp = tst; + } + } + return depth; +} + +/* + * FIXME: must adjust position so it is within the parent! + */ +static int +adjust_window(WINDOW *win, int ToLines, int ToCols, int stolen EXTRA_DCLS) +{ + int result; + int bottom = CurLines + _nc_screen_of(win)->_topstolen - stolen; + int myLines = win->_maxy + 1; + int myCols = win->_maxx + 1; + const ripoff_t *rop = ripped_window(win); + + T((T_CALLED("adjust_window(%p,%d,%d)%s depth %d/%d currently %ldx%ld at %ld,%ld"), + (void *) win, ToLines, ToCols, + (rop != 0) ? " (rip)" : "", + parent_depth(win), + child_depth(win), + (long) getmaxy(win), (long) getmaxx(win), + (long) getbegy(win) + win->_yoffset, (long) getbegx(win))); + + if (rop != 0 && rop->line < 0) { + /* + * If it is a ripped-off window at the bottom of the screen, simply + * move it to the same relative position. + */ + win->_begy = (NCURSES_SIZE_T) (ToLines - ripped_bottom(win) - 0 - win->_yoffset); + if (rop->hook == _nc_slk_initialize) + _nc_format_slks( +#if NCURSES_SP_FUNCS + _nc_screen_of(win), +#endif + ToCols); + } else if (win->_begy >= bottom) { + /* + * If it is below the bottom of the new screen, move up by the same + * amount that the screen shrank. + */ + win->_begy = (NCURSES_SIZE_T) (win->_begy + (ToLines - CurLines)); + } else { + if (myLines == (CurLines - stolen) + && ToLines != CurLines) { + myLines = ToLines - stolen; + } else if (myLines == CurLines + && ToLines != CurLines) { + myLines = ToLines; + } + } + + if (myLines > ToLines) { + myLines = ToLines; + } + + if (myCols > ToCols) + myCols = ToCols; + + if (myCols == CurCols + && ToCols != CurCols) + myCols = ToCols; + + result = wresize(win, myLines, myCols); + returnCode(result); +} + +/* + * If we're decreasing size, recursively search for windows that have no + * children, decrease those to fit, then decrease the containing window, etc. + */ +static int +decrease_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS) +{ + bool found; + int depth = 0; + WINDOWLIST *wp; + + T((T_CALLED("decrease_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); + UNUSED_SP; + + do { + found = FALSE; + TR(TRACE_UPDATE, ("decreasing size of windows to %dx%d, depth=%d", + ToLines, ToCols, depth)); + for (each_window(SP_PARM, wp)) { + WINDOW *win = &(wp->win); + + if (!IS_PAD(win)) { + if (child_depth(win) == depth) { + found = TRUE; + if (adjust_window(win, ToLines, ToCols, + stolen EXTRA_ARGS) != OK) + returnCode(ERR); + } + } + } + ++depth; + } while (found); + returnCode(OK); +} + +/* + * If we're increasing size, recursively search for windows that have no + * parent, increase those to fit, then increase the contained window, etc. + */ +static int +increase_size(NCURSES_SP_DCLx int ToLines, int ToCols, int stolen EXTRA_DCLS) +{ + bool found; + int depth = 0; + WINDOWLIST *wp; + + T((T_CALLED("increase_size(%p, %d, %d)"), (void *) SP_PARM, ToLines, ToCols)); + UNUSED_SP; + + do { + found = FALSE; + TR(TRACE_UPDATE, ("increasing size of windows to %dx%d, depth=%d", + ToLines, ToCols, depth)); + for (each_window(SP_PARM, wp)) { + WINDOW *win = &(wp->win); + + if (!IS_PAD(win)) { + if (parent_depth(win) == depth) { + found = TRUE; + if (adjust_window(win, ToLines, ToCols, + stolen EXTRA_ARGS) != OK) + returnCode(ERR); + } + } + } + ++depth; + } while (found); + returnCode(OK); +} + +/* + * This function reallocates NCURSES window structures, with no side-effects + * such as ungetch(). + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(resize_term) (NCURSES_SP_DCLx int ToLines, int ToCols) +{ + int result = OK EXTRA_ARGS; + int was_stolen; + + T((T_CALLED("resize_term(%p,%d,%d) old(%d,%d)"), + (void *) SP_PARM, ToLines, ToCols, + (SP_PARM == NULL) ? -1 : screen_lines(SP_PARM), + (SP_PARM == NULL) ? -1 : screen_columns(SP_PARM))); + + if (SP_PARM == NULL || ToLines <= 0 || ToCols <= 0) { + returnCode(ERR); + } + + _nc_nonsp_lock_global(curses); + + was_stolen = (screen_lines(SP_PARM) - SP_PARM->_lines_avail); + if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) { + int myLines = CurLines = screen_lines(SP_PARM); + int myCols = CurCols = screen_columns(SP_PARM); + +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE)) { + show_window_sizes("before"); + _nc_unlock_global(tracef); + } +#endif + if (ToLines > screen_lines(SP_PARM)) { + result = increase_size(NCURSES_SP_ARGx + myLines = ToLines, + myCols, + was_stolen EXTRA_ARGS); + CurLines = myLines; + CurCols = myCols; + } + + if ((result == OK) + && (ToCols > screen_columns(SP_PARM))) { + result = increase_size(NCURSES_SP_ARGx + myLines, + myCols = ToCols, + was_stolen EXTRA_ARGS); + CurLines = myLines; + CurCols = myCols; + } + + if ((result == OK) + && (ToLines < myLines || + ToCols < myCols)) { + result = decrease_size(NCURSES_SP_ARGx + ToLines, + ToCols, + was_stolen EXTRA_ARGS); + } + + if (result == OK) { + screen_lines(SP_PARM) = (NCURSES_SIZE_T) ToLines; + screen_columns(SP_PARM) = (NCURSES_SIZE_T) ToCols; + +#ifdef USE_TERM_DRIVER + CallDriver_2(SP_PARM, td_setsize, ToLines, ToCols); +#else + lines = (NCURSES_INT2) ToLines; + columns = (NCURSES_INT2) ToCols; +#endif + + SP_PARM->_lines_avail = (NCURSES_SIZE_T) (ToLines - was_stolen); + + if (SP_PARM->oldhash) { + FreeAndNull(SP_PARM->oldhash); + } + if (SP_PARM->newhash) { + FreeAndNull(SP_PARM->newhash); + } +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE)) { + SET_LINES(ToLines - was_stolen); + SET_COLS(ToCols); + show_window_sizes("after"); + _nc_unlock_global(tracef); + } +#endif + } + } + + if (result == OK) { + /* + * Always update LINES, to allow for call from lib_doupdate.c which + * needs to have the count adjusted by the stolen (ripped off) lines. + */ + SET_LINES(ToLines - was_stolen); + SET_COLS(ToCols); + } + + _nc_nonsp_unlock_global(curses); + + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +resize_term(int ToLines, int ToCols) +{ + int res; + _nc_sp_lock_global(curses); + res = NCURSES_SP_NAME(resize_term) (CURRENT_SCREEN, ToLines, ToCols); + _nc_sp_unlock_global(curses); + return (res); +} +#endif + +/* + * This function reallocates NCURSES window structures. It is invoked in + * response to a SIGWINCH interrupt. Other user-defined windows may also need + * to be reallocated. + * + * Because this performs memory allocation, it should not (in general) be + * invoked directly from the signal handler. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(resizeterm) (NCURSES_SP_DCLx int ToLines, int ToCols) +{ + int result = ERR; + + T((T_CALLED("resizeterm(%p, %d,%d) old(%d,%d)"), + (void *) SP_PARM, ToLines, ToCols, + (SP_PARM == NULL) ? -1 : screen_lines(SP_PARM), + (SP_PARM == NULL) ? -1 : screen_columns(SP_PARM))); + + if (SP_PARM != NULL && ToLines > 0 && ToCols > 0) { + result = OK; + SP_PARM->_sig_winch = FALSE; + + if (NCURSES_SP_NAME(is_term_resized) (NCURSES_SP_ARGx ToLines, ToCols)) { +#if USE_SIGWINCH + ripoff_t *rop; + bool slk_visible = (SP_PARM != 0 + && SP_PARM->_slk != 0 + && !(SP_PARM->_slk->hidden)); + + if (slk_visible) { + slk_clear(); + } +#endif + result = NCURSES_SP_NAME(resize_term) (NCURSES_SP_ARGx ToLines, ToCols); + +#if USE_SIGWINCH + clearok(CurScreen(SP_PARM), TRUE); /* screen contents are unknown */ + + /* ripped-off lines are a special case: if we did not lengthen + * them, we haven't moved them either. repaint them, too. + * + * for the rest - stdscr and other windows - the client has to + * decide which to repaint, since without panels, ncurses does + * not know which are really on top. + */ + for (each_ripoff(rop)) { + if (rop->win != StdScreen(SP_PARM) + && rop->win != 0 + && rop->line < 0) { + + if (rop->hook != _nc_slk_initialize) { + touchwin(rop->win); + wnoutrefresh(rop->win); + } + } + } + + /* soft-keys are a special case: we _know_ how to repaint them */ + if (slk_visible) { + NCURSES_SP_NAME(slk_restore) (NCURSES_SP_ARG); + NCURSES_SP_NAME(slk_touch) (NCURSES_SP_ARG); + NCURSES_SP_NAME(slk_refresh) (NCURSES_SP_ARG); + } +#endif + } +#if USE_SIGWINCH + safe_ungetch(SP_PARM, KEY_RESIZE); /* so application can know this */ +#endif + } + + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +resizeterm(int ToLines, int ToCols) +{ + return NCURSES_SP_NAME(resizeterm) (CURRENT_SCREEN, ToLines, ToCols); +} +#endif diff --git a/contrib/ncurses/ncurses/base/safe_sprintf.c b/contrib/ncurses/ncurses/base/safe_sprintf.c new file mode 100644 index 00000000..a1ac6472 --- /dev/null +++ b/contrib/ncurses/ncurses/base/safe_sprintf.c @@ -0,0 +1,299 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2012,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + ****************************************************************************/ + +#include +#include + +MODULE_ID("$Id: safe_sprintf.c,v 1.38 2024/07/27 19:22:23 tom Exp $") + +#if USE_SAFE_SPRINTF + +typedef enum { + Flags, Width, Prec, Type, Format +} PRINTF; + +#define VA_INTGR(type) ival = (int) va_arg(ap, type) +#define VA_FLOAT(type) fval = va_arg(ap, type) +#define VA_POINT(type) pval = (void *)va_arg(ap, type) + +/* + * Scan a variable-argument list for printf to determine the number of + * characters that would be emitted. + */ +static int +_nc_printf_length(const char *fmt, va_list ap) +{ + size_t length = BUFSIZ; + char *buffer; + char *format; + int len = 0; + size_t fmt_len; + char fmt_arg[BUFSIZ]; + + if (fmt == 0 || *fmt == '\0') + return 0; + fmt_len = strlen(fmt) + 1; + if ((format = typeMalloc(char, fmt_len)) == 0) + return -1; + if ((buffer = typeMalloc(char, length)) == 0) { + free(format); + return -1; + } + + while (*fmt != '\0') { + if (*fmt == '%') { + static char dummy[] = ""; + PRINTF state = Flags; + char *pval = dummy; /* avoid const-cast */ + double fval = 0.0; + int done = FALSE; + int ival = 0; + int prec = -1; + int type = 0; + int used = 0; + int width = -1; + size_t f = 0; + + format[f++] = *fmt; + while (*++fmt != '\0' && len >= 0 && !done) { + format[f++] = *fmt; + + if (isdigit(UChar(*fmt))) { + int num = *fmt - '0'; + if (state == Flags && num != 0) + state = Width; + if (state == Width) { + if (width < 0) + width = 0; + width = (width * 10) + num; + } else if (state == Prec) { + if (prec < 0) + prec = 0; + prec = (prec * 10) + num; + } + } else if (*fmt == '*') { + VA_INTGR(int); + if (state == Flags) + state = Width; + if (state == Width) { + width = ival; + } else if (state == Prec) { + prec = ival; + } + _nc_SPRINTF(fmt_arg, + _nc_SLIMIT(sizeof(fmt_arg)) + "%d", ival); + fmt_len += strlen(fmt_arg); + if ((format = _nc_doalloc(format, fmt_len)) == 0) { + free(buffer); + return -1; + } + --f; + _nc_STRCPY(&format[f], fmt_arg, fmt_len - f); + f = strlen(format); + } else if (isalpha(UChar(*fmt))) { + done = TRUE; + switch (*fmt) { + case 'Z': /* FALLTHRU */ + case 'h': /* FALLTHRU */ + case 'l': /* FALLTHRU */ + done = FALSE; + type = *fmt; + break; + case 'i': /* FALLTHRU */ + case 'd': /* FALLTHRU */ + case 'u': /* FALLTHRU */ + case 'x': /* FALLTHRU */ + case 'X': /* FALLTHRU */ + if (type == 'l') + VA_INTGR(long); + else if (type == 'Z') + VA_INTGR(size_t); + else + VA_INTGR(int); + used = 'i'; + break; + case 'f': /* FALLTHRU */ + case 'e': /* FALLTHRU */ + case 'E': /* FALLTHRU */ + case 'g': /* FALLTHRU */ + case 'G': /* FALLTHRU */ + VA_FLOAT(double); + used = 'f'; + break; + case 'c': + VA_INTGR(int); + used = 'i'; + break; + case 's': + VA_POINT(char *); + if (prec < 0) + prec = (int) strlen(pval); + if (prec > (int) length) { + length = length + (size_t) prec; + buffer = typeRealloc(char, length, buffer); + if (buffer == 0) { + free(format); + return -1; + } + } + used = 'p'; + break; + case 'p': + VA_POINT(void *); + used = 'p'; + break; + case 'n': + VA_POINT(int *); + used = 0; + break; + default: + break; + } + } else if (*fmt == '.') { + state = Prec; + } else if (*fmt == '%') { + done = TRUE; + used = 'p'; + } + } + format[f] = '\0'; + switch (used) { + case 'i': + _nc_SPRINTF(buffer, _nc_SLIMIT(length) format, ival); + break; + case 'f': + _nc_SPRINTF(buffer, _nc_SLIMIT(length) format, fval); + break; + default: + _nc_SPRINTF(buffer, _nc_SLIMIT(length) format, pval); + break; + } + len += (int) strlen(buffer); + } else { + fmt++; + len++; + } + } + + free(buffer); + free(format); + return len; +} +#endif + +#define my_buffer _nc_globals.safeprint_buf +#define my_length _nc_globals.safeprint_used + +/* + * Wrapper for vsprintf that allocates a buffer big enough to hold the result. + */ +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(_nc_printf_string) (NCURSES_SP_DCLx + const char *fmt, + va_list ap) +{ + char *result = NULL; + + if (SP_PARM != NULL && fmt != NULL) { +#if USE_SAFE_SPRINTF + va_list ap2; + int len; + + begin_va_copy(ap2, ap); + len = _nc_printf_length(fmt, ap2); + end_va_copy(ap2); + + if ((int) my_length < len + 1) { + my_length = (size_t) (2 * (len + 1)); + my_buffer = typeRealloc(char, my_length, my_buffer); + } + if (my_buffer != NULL) { + *my_buffer = '\0'; + if (len >= 0) { + vsprintf(my_buffer, fmt, ap); + } + result = my_buffer; + } +#else +#define MyCols _nc_globals.safeprint_cols +#define MyRows _nc_globals.safeprint_rows + + if (screen_lines(SP_PARM) > MyRows || screen_columns(SP_PARM) > MyCols) { + if (screen_lines(SP_PARM) > MyRows) + MyRows = screen_lines(SP_PARM); + if (screen_columns(SP_PARM) > MyCols) + MyCols = screen_columns(SP_PARM); + my_length = (size_t) (MyRows * (MyCols + 1)) + 1; + if (my_length < 80) + my_length = 80; + my_buffer = typeRealloc(char, my_length, my_buffer); + } + + if (my_buffer != NULL) { +# if HAVE_VSNPRINTF + do { + /* SUSv2, 1997 */ + int used; + va_list ap2; + + begin_va_copy(ap2, ap); + used = vsnprintf(my_buffer, my_length, fmt, ap2); + end_va_copy(ap2); + if (used < (int) my_length) + break; + my_length = (size_t) ((3 * used) / 2); + my_buffer = typeRealloc(char, my_length, my_buffer); + } while (my_buffer != NULL); +# else + /* ISO/ANSI C, 1989 */ + vsprintf(my_buffer, fmt, ap); +# endif + result = my_buffer; + } +#endif + } else if (my_buffer != NULL) { /* see _nc_freeall() */ + free(my_buffer); + my_buffer = NULL; + my_length = 0; + } + return result; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +_nc_printf_string(const char *fmt, va_list ap) +{ + return NCURSES_SP_NAME(_nc_printf_string) (CURRENT_SCREEN, fmt, ap); +} +#endif diff --git a/contrib/ncurses/ncurses/base/sigaction.c b/contrib/ncurses/ncurses/base/sigaction.c new file mode 100644 index 00000000..9688c694 --- /dev/null +++ b/contrib/ncurses/ncurses/base/sigaction.c @@ -0,0 +1,100 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2002,2003 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-2003 * + ****************************************************************************/ + +/* This file provides sigaction() emulation using sigvec() */ +/* Use only if this is non POSIX system */ + +MODULE_ID("$Id: sigaction.c,v 1.15 2020/02/02 23:34:34 tom Exp $") + +static int +_nc_sigaction(int sig, sigaction_t * sigact, sigaction_t * osigact) +{ + return sigvec(sig, sigact, osigact); +} + +static int +_nc_sigemptyset(sigset_t * mask) +{ + *mask = 0; + return 0; +} + +static int +_nc_sigprocmask(int mode, sigset_t * mask, sigset_t * omask) +{ + sigset_t current = sigsetmask(0); + + if (omask) + *omask = current; + + if (mode == SIG_BLOCK) + current |= *mask; + else if (mode == SIG_UNBLOCK) + current &= ~*mask; + else if (mode == SIG_SETMASK) + current = *mask; + + sigsetmask(current); + return 0; +} + +static int +_nc_sigaddset(sigset_t * mask, int sig) +{ + *mask |= sigmask(sig); + return 0; +} + +/* not used in lib_tstp.c */ +#if 0 +static int +_nc_sigsuspend(sigset_t * mask) +{ + return sigpause(*mask); +} + +static int +_nc_sigdelset(sigset_t * mask, int sig) +{ + *mask &= ~sigmask(sig); + return 0; +} + +static int +_nc_sigismember(sigset_t * mask, int sig) +{ + return (*mask & sigmask(sig)) != 0; +} +#endif diff --git a/contrib/ncurses/ncurses/base/tries.c b/contrib/ncurses/ncurses/base/tries.c new file mode 100644 index 00000000..0f8c0516 --- /dev/null +++ b/contrib/ncurses/ncurses/base/tries.c @@ -0,0 +1,147 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997 * + ****************************************************************************/ + +/* +** tries.c +** +** Functions to manage the tree of partial-completions for keycodes. +** +*/ + +#include +#include + +MODULE_ID("$Id: tries.c,v 1.32 2023/06/24 15:36:23 tom Exp $") + +/* + * Expand a keycode into the string that it corresponds to, returning null if + * no match was found, otherwise allocating a string of the result. + */ +NCURSES_EXPORT(char *) +_nc_expand_try(TRIES * tree, unsigned code, int *count, size_t len) +{ + TRIES *ptr = tree; + char *result = 0; + + if (code != 0) { + while (ptr != 0) { + if ((result = _nc_expand_try(ptr->child, code, count, len + 1)) + != 0) { + break; + } + if (ptr->value == code) { + *count -= 1; + if (*count == -1) { + result = typeCalloc(char, len + 2); + break; + } + } + ptr = ptr->sibling; + } + } + if (result != 0) { + if (ptr != 0 && (result[len] = (char) ptr->ch) == 0) + *((unsigned char *) (result + len)) = 128; +#ifdef TRACE + if (len == 0 && USE_TRACEF(TRACE_MAXIMUM)) { + _tracef("expand_key %s %s", + _nc_tracechar(CURRENT_SCREEN, (int) code), + _nc_visbuf(result)); + _nc_unlock_global(tracef); + } +#endif + } + return result; +} + +/* + * Remove a code from the specified tree, freeing the unused nodes. Returns + * true if the code was found/removed. + */ +NCURSES_EXPORT(int) +_nc_remove_key(TRIES ** tree, unsigned code) +{ + T((T_CALLED("_nc_remove_key(%p,%d)"), (void *) tree, code)); + + if (code == 0) + returnCode(FALSE); + + while (*tree != 0) { + if (_nc_remove_key(&(*tree)->child, code)) { + returnCode(TRUE); + } + if ((*tree)->value == code) { + if ((*tree)->child) { + /* don't cut the whole sub-tree */ + (*tree)->value = 0; + } else { + TRIES *to_free = *tree; + *tree = (*tree)->sibling; + free(to_free); + } + returnCode(TRUE); + } + tree = &(*tree)->sibling; + } + returnCode(FALSE); +} + +/* + * Remove a string from the specified tree, freeing the unused nodes. Returns + * true if the string was found/removed. + */ +NCURSES_EXPORT(int) +_nc_remove_string(TRIES ** tree, const char *string) +{ + T((T_CALLED("_nc_remove_string(%p,%s)"), (void *) tree, _nc_visbuf(string))); + + if (!VALID_STRING(string) || *string == 0) + returnCode(FALSE); + + while (*tree != 0) { + if (UChar((*tree)->ch) == UChar(*string)) { + if (string[1] != 0) + returnCode(_nc_remove_string(&(*tree)->child, string + 1)); + if ((*tree)->child == 0) { + TRIES *to_free = *tree; + *tree = (*tree)->sibling; + free(to_free); + returnCode(TRUE); + } else { + returnCode(FALSE); + } + } + tree = &(*tree)->sibling; + } + returnCode(FALSE); +} diff --git a/contrib/ncurses/ncurses/base/use_window.c b/contrib/ncurses/ncurses/base/use_window.c new file mode 100644 index 00000000..4893053b --- /dev/null +++ b/contrib/ncurses/ncurses/base/use_window.c @@ -0,0 +1,54 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2007-2009,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2007 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: use_window.c,v 1.13 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +use_window(WINDOW *win, NCURSES_WINDOW_CB func, void *data) +{ + int code = OK; + TR_FUNC_BFR(1); + + T((T_CALLED("use_window(%p,%s,%p)"), + (void *) win, + TR_FUNC_ARG(0, func), + data)); + + _nc_lock_global(curses); + code = func(win, data); + _nc_unlock_global(curses); + + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/base/version.c b/contrib/ncurses/ncurses/base/version.c new file mode 100644 index 00000000..4d8ee81d --- /dev/null +++ b/contrib/ncurses/ncurses/base/version.c @@ -0,0 +1,43 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1999-2004,2005 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: version.c,v 1.7 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(const char *) +curses_version(void) +{ + T((T_CALLED("curses_version()"))); + returnCPtr("ncurses " NCURSES_VERSION_STRING); +} diff --git a/contrib/ncurses/ncurses/base/vsscanf.c b/contrib/ncurses/ncurses/base/vsscanf.c new file mode 100644 index 00000000..40ee8bb1 --- /dev/null +++ b/contrib/ncurses/ncurses/base/vsscanf.c @@ -0,0 +1,354 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2004,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * State-machine fallback written by Thomas E. Dickey 2002 * + ****************************************************************************/ + +/* + * This function is needed to support vwscanw + */ + +#include + +#if !HAVE_VSSCANF + +MODULE_ID("$Id: vsscanf.c,v 1.22 2023/09/23 18:48:57 tom Exp $") + +#if !(HAVE_VFSCANF || HAVE__DOSCAN) + +#include + +typedef enum { + cUnknown + ,cError /* anything that isn't ANSI */ + ,cAssigned + ,cChar + ,cInt + ,cFloat + ,cDouble + ,cPointer + ,cLong + ,cShort + ,cRange + ,cString +} ChunkType; + +typedef enum { + oUnknown + ,oShort + ,oLong +} OtherType; + +typedef enum { + sUnknown + ,sPercent /* last was '%' beginning a format */ + ,sNormal /* ...somewhere in the middle */ + ,sLeft /* last was left square bracket beginning a range */ + ,sRange /* ...somewhere in the middle */ + ,sFinal /* last finished a format */ +} ScanState; + +static ChunkType +final_ch(int ch, OtherType other) +{ + ChunkType result = cUnknown; + + switch (ch) { + case 'c': + if (other == oUnknown) + result = cChar; + else + result = cError; + break; + case 'd': + case 'i': + case 'X': + case 'x': + switch (other) { + case oUnknown: + result = cInt; + break; + case oShort: + result = cShort; + break; + case oLong: + result = cLong; + break; + } + break; + case 'E': + case 'e': + case 'f': + case 'g': + switch (other) { + case oUnknown: + result = cFloat; + break; + case oShort: + result = cError; + break; + case oLong: + result = cDouble; + break; + } + break; + case 'n': + if (other == oUnknown) + result = cAssigned; + else + result = cError; + break; + case 'p': + if (other == oUnknown) + result = cPointer; + else + result = cError; + break; + case 's': + if (other == oUnknown) + result = cString; + else + result = cError; + break; + } + return result; +} + +static OtherType +other_ch(int ch) +{ + OtherType result = oUnknown; + switch (ch) { + case 'h': + result = oShort; + break; + case 'l': + result = oLong; + break; + } + return result; +} +#endif + +/*VARARGS2*/ +NCURSES_EXPORT(int) +vsscanf(const char *str, const char *format, va_list ap) +{ +#if HAVE_VFSCANF || HAVE__DOSCAN + /* + * This code should work on anything descended from AT&T SVr1. + */ + FILE strbuf; + + strbuf._flag = _IOREAD; + strbuf._ptr = strbuf._base = (unsigned char *) str; + strbuf._cnt = strlen(str); + strbuf._file = _NFILE; + +#if HAVE_VFSCANF + return (vfscanf(&strbuf, format, ap)); +#else + return (_doscan(&strbuf, format, ap)); +#endif +#else + static int can_convert = -1; + + int assigned = 0; + int consumed = 0; + + T((T_CALLED("vsscanf(%s,%s,...)"), + _nc_visbuf2(1, str), + _nc_visbuf2(2, format))); + + /* + * This relies on having a working "%n" format conversion. Check if it + * works. Only very old C libraries do not support it. + * + * FIXME: move this check into the configure script. + */ + if (can_convert < 0) { + int check1; + int check2; + if (sscanf("123", "%d%n", &check1, &check2) > 0 + && check1 == 123 + && check2 == 3) { + can_convert = 1; + } else { + can_convert = 0; + } + } + + if (can_convert) { + size_t len_fmt = strlen(format) + 32; + char *my_fmt = malloc(len_fmt); + ChunkType chunk, ctest; + OtherType other, otest; + ScanState state; + unsigned n; + int eaten; + void *pointer; + + if (my_fmt != 0) { + /* + * Split the original format into chunks, adding a "%n" to the end + * of each (except of course if it used %n), and use that + * information to decide where to start scanning the next chunk. + * + * FIXME: does %n count bytes or characters? If the latter, this + * will require further work for multibyte strings. + */ + while (*format != '\0') { + /* find a chunk */ + state = sUnknown; + chunk = cUnknown; + other = oUnknown; + pointer = 0; + for (n = 0; format[n] != 0 && state != sFinal; ++n) { + my_fmt[n] = format[n]; + switch (state) { + case sUnknown: + if (format[n] == '%') + state = sPercent; + break; + case sPercent: + if (format[n] == '%') { + state = sUnknown; + } else if (format[n] == L_BLOCK) { + state = sLeft; + } else { + state = sNormal; + --n; + } + break; + case sLeft: + state = sRange; + if (format[n] == '^') { + ++n; + my_fmt[n] = format[n]; + } + break; + case sRange: + if (format[n] == R_BLOCK) { + state = sFinal; + chunk = cRange; + } + break; + case sNormal: + if (format[n] == '*') { + state = sUnknown; + } else { + if ((ctest = final_ch(format[n], other)) != cUnknown) { + state = sFinal; + chunk = ctest; + } else if ((otest = other_ch(format[n])) != oUnknown) { + other = otest; + } else if (isalpha(UChar(format[n]))) { + state = sFinal; + chunk = cError; + } + } + break; + case sFinal: + break; + } + } + my_fmt[n] = '\0'; + format += n; + + if (chunk == cUnknown + || chunk == cError) { + if (assigned == 0) + assigned = EOF; + break; + } + + /* add %n, if the format was not that */ + if (chunk != cAssigned) { + _nc_STRCAT(my_fmt, "%n", len_fmt); + } + + switch (chunk) { + case cAssigned: + _nc_STRCAT(my_fmt, "%n", len_fmt); + pointer = &eaten; + break; + case cInt: + pointer = va_arg(ap, int *); + break; + case cShort: + pointer = va_arg(ap, short *); + break; + case cFloat: + pointer = va_arg(ap, float *); + break; + case cDouble: + pointer = va_arg(ap, double *); + break; + case cLong: + pointer = va_arg(ap, long *); + break; + case cPointer: + pointer = va_arg(ap, void *); + break; + case cChar: + case cRange: + case cString: + pointer = va_arg(ap, char *); + break; + case cError: + case cUnknown: + break; + } + /* do the conversion */ + T(("...converting chunk #%d type %d(%s,%s)", + assigned + 1, chunk, + _nc_visbuf2(1, str + consumed), + _nc_visbuf2(2, my_fmt))); + if (sscanf(str + consumed, my_fmt, pointer, &eaten) > 0) + consumed += eaten; + else + break; + ++assigned; + } + free(my_fmt); + } + } + returnCode(assigned); +#endif +} +#else +extern +NCURSES_EXPORT(void) +_nc_vsscanf(void); /* quiet's gcc warning */ +NCURSES_EXPORT(void) +_nc_vsscanf(void) +{ +} /* nonempty for strict ANSI compilers */ +#endif /* !HAVE_VSSCANF */ diff --git a/contrib/ncurses/ncurses/base/wresize.c b/contrib/ncurses/ncurses/base/wresize.c new file mode 100644 index 00000000..576efa52 --- /dev/null +++ b/contrib/ncurses/ncurses/base/wresize.c @@ -0,0 +1,279 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 1998-2010,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: wresize.c,v 1.44 2024/09/28 15:56:07 tom Exp $") + +static int +cleanup_lines(struct ldat *data, int length) +{ + while (--length >= 0) + FreeAndNull(data[length].text); + free(data); + return ERR; +} + +/* + * If we have reallocated the ldat structs, we will have to repair pointers + * used in subwindows. + */ +static void +repair_subwindows(WINDOW *cmp) +{ + WINDOWLIST *wp; + struct ldat *pline = cmp->_line; + int row; +#if NCURSES_SP_FUNCS && defined(USE_SP_WINDOWLIST) + SCREEN *sp = _nc_screen_of(cmp); +#endif + + _nc_lock_global(curses); + + for (each_window(SP_PARM, wp)) { + WINDOW *tst = &(wp->win); + + if (tst->_parent == cmp) { + +#define REPAIR1(field, limit) \ + if (tst->field > cmp->limit) \ + tst->field = cmp->limit + + REPAIR1(_pary, _maxy); + REPAIR1(_parx, _maxx); + +#define REPAIR2(field, limit) \ + if (tst->limit + tst->field > cmp->limit) \ + tst->limit = (NCURSES_SIZE_T) (cmp->limit - tst->field) + + REPAIR2(_pary, _maxy); + REPAIR2(_parx, _maxx); + +#define REPAIR3(field, limit) \ + if (tst->field > tst->limit) \ + tst->field = tst->limit + + REPAIR3(_cury, _maxy); + REPAIR3(_curx, _maxx); + + REPAIR3(_regtop, _maxy); + REPAIR3(_regbottom, _maxy); + + for (row = 0; row <= tst->_maxy; ++row) { + tst->_line[row].text = &pline[tst->_pary + row].text[tst->_parx]; + } + repair_subwindows(tst); + } + } + _nc_unlock_global(curses); +} + +/* + * Reallocate a curses WINDOW struct to either shrink or grow to the specified + * new lines/columns. If it grows, the new character cells are filled with + * blanks. The application is responsible for repainting the blank area. + */ +NCURSES_EXPORT(int) +wresize(WINDOW *win, int ToLines, int ToCols) +{ + int col, row, size_x, size_y; + struct ldat *pline; + struct ldat *new_lines = 0; + +#ifdef TRACE + T((T_CALLED("wresize(%p,%d,%d)"), (void *) win, ToLines, ToCols)); + if (win) { + TR(TRACE_UPDATE, ("...beg (%ld, %ld), max(%ld,%ld), reg(%ld,%ld)", + (long) win->_begy, (long) win->_begx, + (long) win->_maxy, (long) win->_maxx, + (long) win->_regtop, (long) win->_regbottom)); + if (USE_TRACEF(TRACE_UPDATE)) { + _tracedump("...before", win); + _nc_unlock_global(tracef); + } + } +#endif + + if (!win || !OK_DIMENSION(ToLines) || !OK_DIMENSION(ToCols)) + returnCode(ERR); + + ToLines--; + ToCols--; + size_x = win->_maxx; + size_y = win->_maxy; + + if (ToLines == size_y + && ToCols == size_x) + returnCode(OK); + + if (IS_SUBWIN(win)) { + /* + * Check if the new limits will fit into the parent window's size. If + * not, do not resize. We could adjust the location of the subwindow, + * but the application may not like that. + */ + if (win->_pary + ToLines > win->_parent->_maxy + || win->_parx + ToCols > win->_parent->_maxx) { + returnCode(ERR); + } + pline = win->_parent->_line; + } else { + pline = 0; + } + + /* + * Allocate new memory as needed. Do the allocations without modifying + * the original window, in case an allocation fails. Always allocate + * (at least temporarily) the array pointing to the individual lines. + */ + new_lines = typeCalloc(struct ldat, (unsigned) (ToLines + 1)); + if (new_lines == 0) + returnCode(ERR); + + /* + * For each line in the target, allocate or adjust pointers for the + * corresponding text, depending on whether this is a window or a + * subwindow. + */ + for (row = 0; row <= ToLines; ++row) { + int begin = (row > size_y) ? 0 : (size_x + 1); + int end = ToCols; + NCURSES_CH_T *s; + + if (!IS_SUBWIN(win)) { + if (row <= size_y) { + if (ToCols != size_x) { + s = typeMalloc(NCURSES_CH_T, (unsigned) ToCols + 1); + if (s == 0) + returnCode(cleanup_lines(new_lines, row)); + for (col = 0; col <= ToCols; ++col) { + bool valid = (col <= size_x); + if_WIDEC({ + if (col == ToCols + && col < size_x + && isWidecBase(win->_line[row].text[col])) { + valid = FALSE; + } + }); + s[col] = (valid + ? win->_line[row].text[col] + : win->_nc_bkgd); + } + } else { + s = win->_line[row].text; + } + } else { + s = typeMalloc(NCURSES_CH_T, (unsigned) ToCols + 1); + if (s == 0) + returnCode(cleanup_lines(new_lines, row)); + for (col = 0; col <= ToCols; ++col) + s[col] = win->_nc_bkgd; + } + } else if (pline != 0 && pline[win->_pary + row].text != 0) { + s = &pline[win->_pary + row].text[win->_parx]; + } else { + s = 0; + } + + if_USE_SCROLL_HINTS(new_lines[row].oldindex = row); + if (row <= size_y) { + new_lines[row].firstchar = win->_line[row].firstchar; + new_lines[row].lastchar = win->_line[row].lastchar; + } + if ((ToCols != size_x) || (row > size_y)) { + if (end >= begin) { /* growing */ + if (new_lines[row].firstchar < begin) + new_lines[row].firstchar = (NCURSES_SIZE_T) begin; + } else { /* shrinking */ + new_lines[row].firstchar = 0; + } + new_lines[row].lastchar = (NCURSES_SIZE_T) ToCols; + } + new_lines[row].text = s; + } + + /* + * Dispose of unwanted memory. + */ + if (!(win->_flags & _SUBWIN)) { + if (ToCols == size_x) { + for (row = ToLines + 1; row <= size_y; row++) { + FreeAndNull(win->_line[row].text); + } + } else { + for (row = 0; row <= size_y; row++) { + FreeAndNull(win->_line[row].text); + } + } + } + + FreeAndNull(win->_line); + win->_line = new_lines; + + /* + * Finally, adjust the parameters showing screen size and cursor + * position: + */ + win->_maxx = (NCURSES_SIZE_T) ToCols; + win->_maxy = (NCURSES_SIZE_T) ToLines; + + if (win->_regtop > win->_maxy) + win->_regtop = win->_maxy; + if (win->_regbottom > win->_maxy + || win->_regbottom == size_y) + win->_regbottom = win->_maxy; + + if (win->_curx > win->_maxx) + win->_curx = win->_maxx; + if (win->_cury > win->_maxy) + win->_cury = win->_maxy; + + /* + * Check for subwindows of this one, and readjust pointers to our text, + * if needed. + */ + repair_subwindows(win); + +#ifdef TRACE + TR(TRACE_UPDATE, ("...beg (%ld, %ld), max(%ld,%ld), reg(%ld,%ld)", + (long) win->_begy, (long) win->_begx, + (long) win->_maxy, (long) win->_maxx, + (long) win->_regtop, (long) win->_regbottom)); + if (USE_TRACEF(TRACE_UPDATE)) { + _tracedump("...after:", win); + _nc_unlock_global(tracef); + } +#endif + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/build.priv.h b/contrib/ncurses/ncurses/build.priv.h new file mode 100644 index 00000000..9014e74a --- /dev/null +++ b/contrib/ncurses/ncurses/build.priv.h @@ -0,0 +1,108 @@ +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010 * + ****************************************************************************/ + +/* + * $Id: build.priv.h,v 1.12 2020/02/02 23:34:34 tom Exp $ + * + * build.priv.h + * + * This is a reduced version of curses.priv.h, for build-time utilities. + * Because it has fewer dependencies, this simplifies cross-compiling. + * + */ + +#ifndef CURSES_PRIV_H +#define CURSES_PRIV_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if USE_RCS_IDS +#define MODULE_ID(id) static const char Ident[] = id; +#else +#define MODULE_ID(id) /*nothing */ +#endif + +#include +#include +#include + +#include +#include + +#include + +#include /* we'll use -Ipath directive to get the right one! */ + +/* usually in */ +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif + +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif + +#define FreeAndNull(p) do { free(p); p = 0; } while (0) +#define UChar(c) ((unsigned char)(c)) +#define SIZEOF(v) (sizeof(v) / sizeof(v[0])) + +#include +#include + +/* declare these, to avoid needing term.h */ +#if BROKEN_LINKER || USE_REENTRANT +#define NCURSES_ARRAY(name) \ + NCURSES_WRAPPED_VAR(NCURSES_CONST char * const *, name) + + NCURSES_ARRAY(boolnames); + NCURSES_ARRAY(boolfnames); + NCURSES_ARRAY(numnames); + NCURSES_ARRAY(numfnames); + NCURSES_ARRAY(strnames); + NCURSES_ARRAY(strfnames); +#endif + +#if NO_LEAKS + NCURSES_EXPORT(void) _nc_names_leaks(void); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* CURSES_PRIV_H */ diff --git a/contrib/ncurses/ncurses/curses.priv.h b/contrib/ncurses/ncurses/curses.priv.h new file mode 100644 index 00000000..1e148f3d --- /dev/null +++ b/contrib/ncurses/ncurses/curses.priv.h @@ -0,0 +1,2691 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* + * $Id: curses.priv.h,v 1.694 2024/10/19 21:23:40 tom Exp $ + * + * curses.priv.h + * + * Header file for curses library objects which are private to + * the library. + * + */ + +#ifndef CURSES_PRIV_H +#define CURSES_PRIV_H 1 +/* *INDENT-OFF* */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if USE_RCS_IDS +#define MODULE_ID(id) static const char Ident[] = id; +#else +#define MODULE_ID(id) /*nothing*/ +#endif + +#include /* for offsetof */ +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#include +#include + +#include + +#if defined __hpux +# ifndef EILSEQ +# define EILSEQ 47 +# endif +#endif + +#if DECL_ERRNO +extern int errno; +#endif + +/* Some Windows related defines */ + +#undef _NC_WINDOWS +#if (defined(_WIN32) || defined(_WIN64__) || defined(__MSYS__) || defined(__CYGWIN__)) +#define _NC_WINDOWS +#else +#undef EXP_WIN32_DRIVER +#endif + +#undef _NC_CYGWIN +#if (defined(__MSYS__) || defined(__CYGWIN__)) +#define _NC_CYGWIN +#endif + +#undef _NC_WINDOWS_NATIVE +#if (defined(_WIN32) || defined(_WIN64)) +#define _NC_WINDOWS_NATIVE +#endif + +#undef _NC_MINGW +#if (defined(__MINGW32__) || defined(__MINGW64__)) +#define _NC_MINGW +#endif + +#undef _NC_MSC +#ifdef _MSC_VER +#define _NC_MSC +#endif + +/* Some systems have a broken 'select()', but workable 'poll()'. Use that */ +#if HAVE_WORKING_POLL +#define USE_FUNC_POLL 1 +#if HAVE_POLL_H +#include +#else +#include +#endif +#else +#define USE_FUNC_POLL 0 +#endif + +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif + +#if (defined(__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO != 0) && (defined(__GNUC__) && (__GNUC__ < 12)) +# undef PRIxPTR /* gcc bug fixed in 12.x */ +# define PRIxPTR "lX" +# define CASTxPTR(n) (unsigned long)(intptr_t)(void*)(n) +#else +# define CASTxPTR(n) (intptr_t)(n) +#endif + +#ifndef PRIxPTR +# define PRIxPTR "lx" +# undef CASTxPTR +# define CASTxPTR(n) (long)(void*)(n) +#endif + +/* include signal.h before curses.h to work-around defect in glibc 2.1.3 */ +#include + +/* Alessandro Rubini's GPM (general-purpose mouse) */ +#if HAVE_LIBGPM && HAVE_GPM_H +#define USE_GPM_SUPPORT 1 +#else +#define USE_GPM_SUPPORT 0 +#endif + +/* QNX mouse support */ +#if defined(__QNX__) && !defined(__QNXNTO__) +#define USE_QNX_MOUSE 1 +#else +#define USE_QNX_MOUSE 0 +#endif + +/* EMX mouse support */ +#ifdef __EMX__ +#define USE_EMX_MOUSE 1 +#else +#define USE_EMX_MOUSE 0 +#endif + +/* kLIBC keyboard/mouse support */ +#if defined(__OS2__) && defined(__KLIBC__) +#define USE_KLIBC_KBD 1 +#define USE_KLIBC_MOUSE 1 +#else +#define USE_KLIBC_KBD 0 +#define USE_KLIBC_MOUSE 0 +#endif + +#define DEFAULT_MAXCLICK 166 +#define EV_MAX 8 /* size of mouse circular event queue */ + +/* + * If we don't have signals to support it, don't add a sigwinch handler. + * In any case, resizing is an extended feature. Use it if we've got it. + */ +#if !NCURSES_EXT_FUNCS +#undef HAVE_SIZECHANGE +#define HAVE_SIZECHANGE 0 +#endif + +#if HAVE_SIZECHANGE && USE_SIGWINCH && defined(SIGWINCH) +#define USE_SIZECHANGE 1 +#else +#define USE_SIZECHANGE 0 +#undef USE_SIGWINCH +#define USE_SIGWINCH 0 +#endif + +/* + * When building in the MSYS2 environment, the automatic discovery of + * the path separator in configure doesn't work properly. So, if building + * for MinGW, we enforce the correct Windows PATH separator + */ +#if defined(_NC_WINDOWS_NATIVE) || defined(__DJGPP__) +# ifdef NCURSES_PATHSEP +# undef NCURSES_PATHSEP +# endif +# define NCURSES_PATHSEP ';' +#endif + +/* + * When the standard handles have been redirected (such as inside a text editor + * or the less utility), keystrokes must be read from the console rather than + * the redirected handle. The standard output handle suffers from a similar + * problem. Both handles are not closed once opened. The console shall be + * considered reachable throughout the process. + */ +#if defined(_NC_WINDOWS) +#define GetDirectHandle(fileName, shareMode) \ + CreateFile(TEXT(fileName), \ + GENERIC_READ | GENERIC_WRITE, \ + shareMode, \ + 0, \ + OPEN_EXISTING, \ + 0, \ + 0) +#endif + +/* + * The stricmp() function is in MSVCRT, and cannot be called or linked from + * Cygwin runtime-dependent binaries currently. Use the POSIX strcaseccmp() + * function instead which is pretty much the same. + */ +#if defined(_NC_CYGWIN) +#define stricmp(s1, s2) strcasecmp(s1, s2) +#endif + +/* + * Not all platforms have memmove; some have an equivalent bcopy. (Some may + * have neither). + */ +#if USE_OK_BCOPY +#define memmove(d,s,n) bcopy(s,d,n) +#elif USE_MY_MEMMOVE +#define memmove(d,s,n) _nc_memmove(d,s,n) +extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); +#endif + +/* + * If we have va_copy(), use it for assigning va_list's. + */ +#if defined(HAVE___VA_COPY) +#define begin_va_copy(dst,src) __va_copy(dst, src) +#define end_va_copy(dst) va_end(dst) +#elif defined(va_copy) || defined(HAVE_VA_COPY) +#define begin_va_copy(dst,src) va_copy(dst, src) +#define end_va_copy(dst) va_end(dst) +#else +#define begin_va_copy(dst,src) (dst) = (src) +#define end_va_copy(dst) /* nothing */ +#endif + +/* + * Either/both S_ISxxx and/or S_IFxxx are defined in sys/types.h; some systems + * lack one or the other. + */ +#ifndef S_ISDIR +#define S_ISDIR(mode) ((mode & S_IFMT) == S_IFDIR) +#endif + +#ifndef S_ISREG +#define S_ISREG(mode) ((mode & S_IFMT) == S_IFREG) +#endif + +/* + * POSIX ignores the "b", which c89 specified. Some very old systems do not + * accept it. + */ +#if USE_FOPEN_BIN_R +#define BIN_R "rb" +#define BIN_W "wb" +#else +#define BIN_R "r" +#define BIN_W "w" +#endif + +/* + * Scroll hints are useless when hashmap is used + */ +#if !USE_SCROLL_HINTS +#if !USE_HASHMAP +#define USE_SCROLL_HINTS 1 +#else +#define USE_SCROLL_HINTS 0 +#endif +#endif + +#if USE_SCROLL_HINTS +#define if_USE_SCROLL_HINTS(stmt) stmt +#else +#define if_USE_SCROLL_HINTS(stmt) /*nothing*/ +#endif + +#include + +/* + * Options for terminal drivers, etc... + */ +#ifdef USE_TERM_DRIVER +#define NO_TERMINAL "unknown" +#define USE_SP_RIPOFF 1 +#define USE_SP_TERMTYPE 1 +#else +#define NO_TERMINAL 0 +#endif + +#define VALID_TERM_ENV(term_env, no_terminal) \ + (term_env = (NonEmpty(term_env) \ + ? term_env \ + : no_terminal), \ + NonEmpty(term_env)) + +/* + * Originally a terminal-driver option, the window-list is per-screen to allow + * freeing memory used for windows when a screen is deleted. + */ +#define USE_SP_WINDOWLIST 1 + +/* + * Note: ht/cbt expansion flakes out randomly under Linux 1.1.47, but only + * when we're throwing control codes at the screen at high volume. To see + * this, re-enable USE_HARD_TABS and run worm for a while. Other systems + * probably don't want to define this either due to uncertainties about tab + * delays and expansion in raw mode. + */ + +#define TRIES struct tries +typedef TRIES { + TRIES *child; /* ptr to child. NULL if none */ + TRIES *sibling; /* ptr to sibling. NULL if none */ + unsigned char ch; /* character at this node */ + unsigned short value; /* code of string so far. 0 if none. */ +#undef TRIES +} TRIES; + +/* + * Common/troublesome character definitions + */ +#define StringOf(ch) {ch, 0} + +#define CSI_CHR 0x9b +#define ESC_CHR 0x1b + +#define L_BLOCK '[' +#define R_BLOCK ']' +#define L_BRACE '{' +#define R_BRACE '}' +#define S_QUOTE '\'' +#define D_QUOTE '"' + +#define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~" + +/* + * Structure for palette tables + */ + +#define MAXCOLUMNS 135 +#define MAXLINES 66 +#define FIFO_SIZE MAXCOLUMNS+2 /* for nocbreak mode input */ + +#define ACS_LEN 128 + +#define WINDOWLIST struct _win_list + +#if USE_WIDEC_SUPPORT +#define _nc_bkgd _bkgrnd +#else +#undef _XOPEN_SOURCE_EXTENDED +#undef _XPG5 +#define _nc_bkgd _bkgd +#define wgetbkgrnd(win, wch) ((*wch = win->_bkgd) != 0 ? OK : ERR) +#define wbkgrnd wbkgd +#endif + +#undef NCURSES_OPAQUE +#define NCURSES_INTERNALS 1 +#define NCURSES_OPAQUE 0 + +#include /* we'll use -Ipath directive to get the right one! */ + +#if !(defined(NCURSES_WGETCH_EVENTS) && defined(NEED_KEY_EVENT)) +#undef KEY_EVENT /* reduce compiler-warnings with Visual C++ */ +#endif + +typedef struct +{ + int red, green, blue; /* what color_content() returns */ + int r, g, b; /* params to init_color() */ + int init; /* true if we called init_color() */ +} +color_t; + +typedef union { + struct { + unsigned char red; + unsigned char green; + unsigned char blue; + } bits; /* bits per color-value in RGB */ + unsigned value; +} rgb_bits_t; + +/* + * If curses.h did not expose the SCREEN-functions, then we do not need the + * parameter in the corresponding unextended functions. + */ + +#define USE_SP_FUNC_SUPPORT NCURSES_SP_FUNCS +#define USE_EXT_SP_FUNC_SUPPORT (NCURSES_SP_FUNCS && NCURSES_EXT_FUNCS) + +#if NCURSES_SP_FUNCS +#define SP_PARM sp /* use parameter */ +#define NCURSES_SP_ARG SP_PARM +#define NCURSES_SP_DCL SCREEN *NCURSES_SP_ARG +#define NCURSES_SP_DCL0 NCURSES_SP_DCL +#define NCURSES_SP_ARGx NCURSES_SP_ARG, +#define NCURSES_SP_DCLx SCREEN *NCURSES_SP_ARGx +#else +#define SP_PARM SP /* use global variable */ +#define NCURSES_SP_ARG +#define NCURSES_SP_DCL +#define NCURSES_SP_DCL0 void +#define NCURSES_SP_ARGx +#define NCURSES_SP_DCLx +#endif + +#include + +#include +#include + +#define IsPreScreen(sp) (((sp) != 0) && sp->_prescreen) +#define HasTerminal(sp) (((sp) != 0) && (0 != ((sp)->_term))) +#define IsValidScreen(sp) (HasTerminal(sp) && !IsPreScreen(sp)) + +#if USE_REENTRANT +#define CurTerm _nc_prescreen._cur_term +#else +#define CurTerm cur_term +#endif + +#if NCURSES_SP_FUNCS +#define TerminalOf(sp) ((sp) ? ((sp)->_term ? (sp)->_term : CurTerm) : CurTerm) +#else +#define TerminalOf(sp) CurTerm +#endif + +/* + * The legacy layout for TERMTYPE uses "short" for all of the numbers. Moving + * past that, numeric capabilities can be "int" by using a TERMTYPE2 structure + * in TERMINAL, and doing most of the internal work using TERMTYPE2. There are + * a few places (mostly to expose the legacy layout) where the distinction + * needs attention. + */ +#if NCURSES_EXT_COLORS && HAVE_INIT_EXTENDED_COLOR +#define NCURSES_EXT_NUMBERS 1 +#define NCURSES_INT2 int +#define SIZEOF_INT2 4 +#define TerminalType(tp) (tp)->type2 +#else +#define NCURSES_EXT_NUMBERS 0 +#define NCURSES_INT2 short +#define SIZEOF_INT2 2 +#define TerminalType(tp) (tp)->type +#endif + +#define SIZEOF_SHORT 2 + +#ifdef CUR +#undef CUR +#define CUR TerminalType(cur_term). +#endif + +/* + * Reduce dependency on cur_term global by using terminfo data from SCREEN's + * pointer to this data. + */ +#ifdef USE_SP_TERMTYPE +#undef CUR +#endif + +#define SP_TERMTYPE TerminalType(TerminalOf(sp)). + +#include + +#include + +/* + * Simplify ifdef's for the "*_ATTR" macros in case italics are not configured. + */ +#if defined(A_ITALIC) && defined(exit_italics_mode) +#define USE_ITALIC 1 +#else +#define USE_ITALIC 0 +#undef A_ITALIC +#define A_ITALIC 0 +#endif + +/* + * Use these macros internally, to make tracing less verbose. But leave the + * option for compiling the tracing into the library. + */ +#if 1 +#define ColorPair(n) (NCURSES_BITS(n, 0) & A_COLOR) +#define PairNumber(a) (NCURSES_CAST(int,(((unsigned long)(a) & A_COLOR) >> NCURSES_ATTR_SHIFT))) +#else +#define ColorPair(pair) COLOR_PAIR(pair) +#define PairNumber(attr) PAIR_NUMBER(attr) +#endif + +#define unColor(n) unColor2(AttrOf(n)) +#define unColor2(a) ((a) & ALL_BUT_COLOR) + +/* + * Extended-colors stores the color pair in a separate struct-member than the + * attributes. But for compatibility, we handle most cases where a program + * written for non-extended colors stores the color in the attributes by + * checking for a color pair in both places. + */ +#if NCURSES_EXT_COLORS +#define if_EXT_COLORS(stmt) stmt +#define SetPair(value,p) SetPair2((value).ext_color, AttrOf(value), p) +#define SetPair2(c,a,p) c = (p), \ + a = (unColor2(a) | ColorPair(oldColor(c))) +#define GetPair(value) GetPair2((value).ext_color, AttrOf(value)) +#define GetPair2(c,a) ((c) ? (c) : PairNumber(a)) +#define oldColor(p) (((p) > 255) ? 255 : (p)) +#define GET_WINDOW_PAIR(w) GetPair2((w)->_color, (w)->_attrs) +#define SET_WINDOW_PAIR(w,p) (w)->_color = (p) +#define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b)) + +#define VIDPUTS(sp,attr,pair) do { \ + int vid_pair = pair; \ + NCURSES_SP_NAME(vid_puts)( \ + NCURSES_SP_ARGx attr, \ + (NCURSES_PAIRS_T) pair, \ + &vid_pair, \ + NCURSES_OUTC_FUNC); \ + } while (0) + +#else /* !NCURSES_EXT_COLORS */ + +#define if_EXT_COLORS(stmt) /* nothing */ +#define SetPair(value,p) RemAttr(value, A_COLOR), \ + SetAttr(value, AttrOf(value) | ColorPair(p)) +#define GetPair(value) PairNumber(AttrOf(value)) +#define GET_WINDOW_PAIR(w) PairNumber(WINDOW_ATTRS(w)) +#define SET_WINDOW_PAIR(w,p) WINDOW_ATTRS(w) &= ALL_BUT_COLOR, \ + WINDOW_ATTRS(w) |= ColorPair(p) +#define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b)) + +#define VIDPUTS(sp,attr,pair) NCURSES_SP_NAME(vidputs)(NCURSES_SP_ARGx attr, NCURSES_OUTC_FUNC) + +#endif /* NCURSES_EXT_COLORS */ + +#define NCURSES_OUTC_FUNC NCURSES_SP_NAME(_nc_outch) +#define NCURSES_PUTP2(name,value) NCURSES_SP_NAME(_nc_putp)(NCURSES_SP_ARGx name, value) +#define NCURSES_PUTP2_FLUSH(name,value) NCURSES_SP_NAME(_nc_putp_flush)(NCURSES_SP_ARGx name, value) + +#if NCURSES_NO_PADDING +#define GetNoPadding(sp) ((sp) ? (sp)->_no_padding : _nc_prescreen._no_padding) +#define SetNoPadding(sp) _nc_set_no_padding(sp) +extern NCURSES_EXPORT(void) _nc_set_no_padding(SCREEN *); +#else +#define GetNoPadding(sp) FALSE +#define SetNoPadding(sp) /*nothing*/ +#endif + +#define WINDOW_ATTRS(w) ((w)->_attrs) + +#define SCREEN_ATTRS(s) (*((s)->_current_attr)) +#define GET_SCREEN_PAIR(s) GetPair(SCREEN_ATTRS(s)) +#define SET_SCREEN_PAIR(s,p) SetPair(SCREEN_ATTRS(s), p) + +#if USE_REENTRANT || NCURSES_SP_FUNCS +extern NCURSES_EXPORT(int *) _nc_ptr_Lines (SCREEN *); +extern NCURSES_EXPORT(int *) _nc_ptr_Cols (SCREEN *); +extern NCURSES_EXPORT(int *) _nc_ptr_Tabsize (SCREEN *); +extern NCURSES_EXPORT(int *) _nc_ptr_Escdelay (SCREEN *); +#endif + +#if USE_REENTRANT + +#define ptrLines(sp) (sp ? &(sp->_LINES) : &(_nc_prescreen._LINES)) +#define ptrCols(sp) (sp ? &(sp->_COLS) : &(_nc_prescreen._COLS)) +#define ptrTabsize(sp) (sp ? &(sp->_TABSIZE) : &(_nc_prescreen._TABSIZE)) +#define ptrEscdelay(sp) (sp ? &(sp->_ESCDELAY) : &(_nc_prescreen._ESCDELAY)) + +#define SET_LINES(value) *_nc_ptr_Lines(SP_PARM) = value +#define SET_COLS(value) *_nc_ptr_Cols(SP_PARM) = value +#define SET_TABSIZE(value) *_nc_ptr_Tabsize(SP_PARM) = value +#define SET_ESCDELAY(value) *_nc_ptr_Escdelay(SP_PARM) = value + +#else + +#define ptrLines(sp) &LINES +#define ptrCols(sp) &COLS +#define ptrTabsize(sp) &TABSIZE +#define ptrEscdelay(sp) &ESCDELAY + +#define SET_LINES(value) LINES = value +#define SET_COLS(value) COLS = value +#define SET_TABSIZE(value) TABSIZE = value +#define SET_ESCDELAY(value) ESCDELAY = value + +#endif + +#define IS_SUBWIN(w) ((w)->_flags & _SUBWIN) +#define IS_PAD(w) ((w)->_flags & _ISPAD) +#define IS_WRAPPED(w) ((w)->_flags & _WRAPPED) + +#define HasHardTabs() (NonEmpty(clear_all_tabs) && NonEmpty(set_tab)) + +#define TR_MUTEX(data) _tracef("%s@%d: me:%08lX COUNT:%2u/%2d/%6d/%2d/%s%9u: " #data, \ + __FILE__, __LINE__, \ + (unsigned long) (pthread_self()), \ + data.__data.__lock, \ + data.__data.__count, \ + data.__data.__owner, \ + data.__data.__kind, \ + (data.__data.__nusers > 5) ? " OOPS " : "", \ + data.__data.__nusers) +#define TR_GLOBAL_MUTEX(name) TR_MUTEX(_nc_globals.mutex_##name) + +#if USE_WEAK_SYMBOLS +#if defined(__GNUC__) +# if defined __USE_ISOC99 +# define _cat_pragma(exp) _Pragma(#exp) +# define _weak_pragma(exp) _cat_pragma(weak name) +# else +# define _weak_pragma(exp) +# endif +# define _declare(name) __extension__ extern __typeof__(name) name +# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) +#else +# undef USE_WEAK_SYMBOLS +# define USE_WEAK_SYMBOLS 0 +#endif +#endif + +#ifdef USE_PTHREADS + +#if USE_REENTRANT +#include +extern NCURSES_EXPORT(void) _nc_init_pthreads(void); +extern NCURSES_EXPORT(void) _nc_mutex_init(pthread_mutex_t *); +extern NCURSES_EXPORT(int) _nc_mutex_lock(pthread_mutex_t *); +extern NCURSES_EXPORT(int) _nc_mutex_trylock(pthread_mutex_t *); +extern NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t *); +#define _nc_lock_global(name) _nc_mutex_lock(&_nc_globals.mutex_##name) +#define _nc_try_global(name) _nc_mutex_trylock(&_nc_globals.mutex_##name) +#define _nc_unlock_global(name) _nc_mutex_unlock(&_nc_globals.mutex_##name) + +#else +#error POSIX threads requires --enable-reentrant option +#endif + +#ifdef USE_PTHREADS +# if USE_WEAK_SYMBOLS +weak_symbol(pthread_sigmask); +weak_symbol(pthread_kill); +weak_symbol(pthread_self); +weak_symbol(pthread_equal); +weak_symbol(pthread_mutex_init); +weak_symbol(pthread_mutex_lock); +weak_symbol(pthread_mutex_unlock); +weak_symbol(pthread_mutex_trylock); +weak_symbol(pthread_mutexattr_settype); +weak_symbol(pthread_mutexattr_init); +extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); +# undef sigprocmask +# define sigprocmask(a, b, c) _nc_sigprocmask(a, b, c) +# define GetThreadID() (((pthread_self)) ? pthread_self() : (pthread_t) getpid()) +# else +# define GetThreadID() pthread_self() +# endif +#endif + +#if HAVE_NANOSLEEP +#undef HAVE_NANOSLEEP +#define HAVE_NANOSLEEP 0 /* nanosleep suspends all threads */ +#endif + +#else /* !USE_PTHREADS */ + +#if USE_PTHREADS_EINTR +# if USE_WEAK_SYMBOLS +#include +weak_symbol(pthread_sigmask); +weak_symbol(pthread_kill); +weak_symbol(pthread_self); +weak_symbol(pthread_equal); +extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); +# undef sigprocmask +# define sigprocmask(a, b, c) _nc_sigprocmask(a, b, c) +# endif +#endif /* USE_PTHREADS_EINTR */ + +#define _nc_init_pthreads() /* nothing */ +#define _nc_mutex_init(obj) /* nothing */ + +#define _nc_lock_global(name) /* nothing */ +#define _nc_try_global(name) 0 +#define _nc_unlock_global(name) /* nothing */ +#endif /* USE_PTHREADS */ + +#if USE_PTHREADS_EINTR +extern NCURSES_EXPORT(void) _nc_set_read_thread(bool); +#else +#define _nc_set_read_thread(enable) /* nothing */ +#endif + +/* + * When using sp-funcs, locks are targeted to SCREEN-level granularity. + * So the locking is done in the non-sp-func (which calls the sp-func) rather + * than in the sp-func itself. + * + * Use the _nc_nonsp_XXX functions in the function using "NCURSES_SP_NAME()". + * Use the _nc_sp_XXX functions in the function using "#if NCURSES_SP_FUNCS". + */ +#if NCURSES_SP_FUNCS + +#define _nc_nonsp_lock_global(name) /* nothing */ +#define _nc_nonsp_try_global(name) 0 +#define _nc_nonsp_unlock_global(name) /* nothing */ + +#define _nc_sp_lock_global(name) _nc_lock_global(name) +#define _nc_sp_try_global(name) _nc_try_global(name) +#define _nc_sp_unlock_global(name) _nc_unlock_global(name) + +#else + +#define _nc_nonsp_lock_global(name) _nc_lock_global(name) +#define _nc_nonsp_try_global(name) _nc_try_global(name) +#define _nc_nonsp_unlock_global(name) _nc_unlock_global(name) + +#define _nc_sp_lock_global(name) /* nothing */ +#define _nc_sp_try_global(name) 0 +#define _nc_sp_unlock_global(name) /* nothing */ + +#endif + +#if HAVE_CLOCK_GETTIME +# define PRECISE_GETTIME 1 +# define GetClockTime(t) clock_gettime(CLOCK_REALTIME, t) +# define TimeType struct timespec +# define TimeScale 1000000000L /* 1e9 */ +# define sub_secs tv_nsec +#elif HAVE_GETTIMEOFDAY +# define PRECISE_GETTIME 1 +# define GetClockTime(t) gettimeofday(t, 0) +# define TimeType struct timeval +# define TimeScale 1000000L /* 1e6 */ +# define sub_secs tv_usec +#else +# define PRECISE_GETTIME 0 +# define TimeType time_t +#endif + +/* + * Definitions for color pairs + */ + +#define MAX_OF_TYPE(t) (int)(((unsigned t)(~0))>>1) + +#include + +#define isDefaultColor(c) ((c) < 0) +#define COLOR_DEFAULT -1 + +#if defined(USE_BUILD_CC) || (defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T)) + +#undef NCURSES_CH_T /* this is not a termlib feature */ +#define NCURSES_CH_T void /* ...but we need a pointer in SCREEN */ + +#endif /* USE_TERMLIB */ + +#ifndef USE_TERMLIB +struct ldat +{ + NCURSES_CH_T *text; /* text of the line */ + NCURSES_SIZE_T firstchar; /* first changed character in the line */ + NCURSES_SIZE_T lastchar; /* last changed character in the line */ + NCURSES_SIZE_T oldindex; /* index of the line at last update */ +}; +#endif /* USE_TERMLIB */ + +typedef enum { + M_XTERM = -1 /* use xterm's mouse tracking? */ + ,M_NONE = 0 /* no mouse device */ +#if USE_GPM_SUPPORT + ,M_GPM /* use GPM */ +#endif +#if USE_SYSMOUSE + ,M_SYSMOUSE /* FreeBSD sysmouse on console */ +#endif +#ifdef USE_TERM_DRIVER + ,M_TERM_DRIVER /* Win32 console, etc */ +#endif +} MouseType; + +typedef enum { + MF_X10 = 0 /* conventional 3-byte format */ + , MF_SGR1006 /* xterm private mode 1006, SGR-style */ +#ifdef EXP_XTERM_1005 + , MF_XTERM_1005 /* xterm UTF-8 private mode 1005 */ +#endif +} MouseFormat; + +/* + * Structures for scrolling. + */ + +typedef struct { + unsigned long hashval; + int oldcount, newcount; + int oldindex, newindex; +} HASHMAP; + +/* + * Structures for soft labels. + */ + +struct _SLK; + +#if !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) + +typedef struct +{ + char *ent_text; /* text for the label */ + char *form_text; /* formatted text (left/center/...) */ + int ent_x; /* x coordinate of this field */ + char dirty; /* this label has changed */ + char visible; /* field is visible */ +} slk_ent; + +typedef struct _SLK { + bool dirty; /* all labels have changed */ + bool hidden; /* soft labels are hidden */ + WINDOW *win; + slk_ent *ent; + short maxlab; /* number of available labels */ + short labcnt; /* number of allocated labels */ + short maxlen; /* length of labels */ + NCURSES_CH_T attr; /* soft label attribute */ +} SLK; + +#endif /* USE_TERMLIB */ + +#if USE_GPM_SUPPORT +#undef buttons /* term.h defines this, and gpm uses it! */ +#include +#if USE_WEAK_SYMBOLS +weak_symbol(Gpm_Wgetch); +#endif + +#ifdef HAVE_LIBDL +/* link dynamically to GPM */ +typedef int *TYPE_gpm_fd; +typedef int (*TYPE_Gpm_Open) (Gpm_Connect *, int); +typedef int (*TYPE_Gpm_Close) (void); +typedef int (*TYPE_Gpm_GetEvent) (Gpm_Event *); + +#define my_gpm_fd SP_PARM->_mouse_gpm_fd +#define my_Gpm_Open SP_PARM->_mouse_Gpm_Open +#define my_Gpm_Close SP_PARM->_mouse_Gpm_Close +#define my_Gpm_GetEvent SP_PARM->_mouse_Gpm_GetEvent +#else +/* link statically to GPM */ +#define my_gpm_fd &gpm_fd +#define my_Gpm_Open Gpm_Open +#define my_Gpm_Close Gpm_Close +#define my_Gpm_GetEvent Gpm_GetEvent +#endif /* HAVE_LIBDL */ +#endif /* USE_GPM_SUPPORT */ + +/* + * Limit delay-times to 30 seconds, which is consistent with signed 16-bit + * numbers in legacy terminfo. + */ +#define MAX_DELAY_MSECS 30000 + +/* + * Limit screen dimensions read from environment variables. + */ +#define MAX_ENV_LINES 512 +#define MAX_ENV_COLUMNS 512 + +/* + * When converting from terminfo to termcap, check for cases where we can trim + * octal escapes down to 2-character form. It is useful for terminfo format + * also, but not as important. + */ +#define MAX_TC_FIXUPS 10 +#define MIN_TC_FIXUPS 4 + +#define isoctal(c) ((c) >= '0' && (c) <= '7') + +/* + * The filesystem database normally uses a single-letter for the lower level + * of directories. Use a hexadecimal code for filesystems which do not + * preserve mixed-case names. + */ +#if MIXEDCASE_FILENAMES +#define LEAF_FMT "%c" +#define LEAF_LEN 1 +#else +#define LEAF_FMT "%02x" +#define LEAF_LEN 2 +#endif + +/* + * TRACEMSE_FMT is no longer than 80 columns, there are 5 numbers that + * could at most have 10 digits, and the mask contains no more than 32 bits + * with each bit representing less than 15 characters. Usually the whole + * string is less than 80 columns, but this buffer size is an absolute + * limit. + */ +#define TRACECHR_BUF 40 +#define TRACEMSE_MAX (80 + (5 * 10) + (32 * 15)) +#define TRACEMSE_FMT "id %2d at (%2d, %2d, %2d) state %4lx = {" /* } */ + +#ifdef USE_TERM_DRIVER +struct DriverTCB; /* Terminal Control Block forward declaration */ +#define INIT_TERM_DRIVER() _nc_globals.term_driver = _nc_get_driver +#else +#define INIT_TERM_DRIVER() /* nothing */ +#endif + +extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; + +/* The limit reserves one byte for a terminating NUL */ +#define my_getstr_limit (_nc_globals.getstr_limit - 1) +#define _nc_getstr_limit(n) \ + (((n) < 0) \ + ? my_getstr_limit \ + : (((n) > my_getstr_limit) \ + ? my_getstr_limit \ + : (n))) + +/* + * Use screen-specific ripoff data (for softkeys) rather than global. + */ +#ifdef USE_SP_RIPOFF +#define safe_ripoff_sp (sp)->rsp +#define safe_ripoff_stack (sp)->rippedoff +#else +#define safe_ripoff_sp _nc_prescreen.rsp +#define safe_ripoff_stack _nc_prescreen.rippedoff +#endif + +extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen; + +typedef enum { + ewUnknown = 0, + ewInitial, + ewRunning, + ewSuspend +} ENDWIN; + +typedef struct { + int _nl; /* True if NL -> CR/NL is on */ + int _raw; /* True if in raw mode */ + int _cbreak; /* 1 if in cbreak mode */ + /* > 1 if in halfdelay mode */ + int _echo; /* True if echo on */ +} TTY_FLAGS; + +#define IsNl(sp) (sp)->_tty_flags._nl +#define IsRaw(sp) (sp)->_tty_flags._raw +#define IsCbreak(sp) (sp)->_tty_flags._cbreak +#define IsEcho(sp) (sp)->_tty_flags._echo + +/* + * The SCREEN structure. + */ +typedef struct screen { + int _ifd; /* input file descriptor for screen */ + int _ofd; /* output file descriptor for screen */ + FILE *_ofp; /* output file ptr for screen */ + char *out_buffer; /* output buffer */ + size_t out_limit; /* output buffer size */ + size_t out_inuse; /* output buffer current use */ + bool _filtered; /* filter() was called */ + bool _prescreen; /* is in prescreen phase */ + bool _use_env; /* LINES & COLS from environment? */ + int _checkfd; /* filedesc for typeahead check */ + TERMINAL *_term; /* terminal type information */ + TTY _saved_tty; /* savetty/resetty information */ + NCURSES_SIZE_T _lines; /* screen lines */ + NCURSES_SIZE_T _columns; /* screen columns */ + + NCURSES_SIZE_T _lines_avail; /* lines available for stdscr */ + NCURSES_SIZE_T _topstolen; /* lines stolen from top */ + + WINDOW *_curscr; /* current screen */ + WINDOW *_newscr; /* virtual screen to be updated to */ + WINDOW *_stdscr; /* screen's full-window context */ + +#define CurScreen(sp) (sp)->_curscr +#define NewScreen(sp) (sp)->_newscr +#define StdScreen(sp) (sp)->_stdscr + + TRIES *_keytry; /* "Try" for use with keypad mode */ + TRIES *_key_ok; /* Disabled keys via keyok(,FALSE) */ + bool _tried; /* keypad mode was initialized */ + bool _keypad_on; /* keypad mode is currently on */ + + bool _called_wgetch; /* check for recursion in wgetch() */ + int _fifo[FIFO_SIZE]; /* input push-back buffer */ + short _fifohead, /* head of fifo queue */ + _fifotail, /* tail of fifo queue */ + _fifopeek, /* where to peek for next char */ + _fifohold; /* set if breakout marked */ + + int _endwin; /* are we out of window mode? */ + NCURSES_CH_T *_current_attr; /* holds current attributes set */ + int _coloron; /* is color enabled? */ + int _color_defs; /* are colors modified */ + int _cursor; /* visibility of the cursor */ + int _cursrow; /* physical cursor row */ + int _curscol; /* physical cursor column */ + bool _notty; /* true if we cannot switch non-tty */ + TTY_FLAGS _tty_flags; + int _use_meta; /* use the meta key? */ + struct _SLK *_slk; /* ptr to soft key struct / NULL */ + int slk_format; /* selected format for this screen */ + /* cursor movement costs; units are 10ths of milliseconds */ + int _char_padding; /* cost of character put */ + int _cr_cost; /* cost of (carriage_return) */ + int _cup_cost; /* cost of (cursor_address) */ + int _home_cost; /* cost of (cursor_home) */ + int _ll_cost; /* cost of (cursor_to_ll) */ + int _cub1_cost; /* cost of (cursor_left) */ + int _cuf1_cost; /* cost of (cursor_right) */ + int _cud1_cost; /* cost of (cursor_down) */ + int _cuu1_cost; /* cost of (cursor_up) */ + int _cub_cost; /* cost of (parm_cursor_left) */ + int _cuf_cost; /* cost of (parm_cursor_right) */ + int _cud_cost; /* cost of (parm_cursor_down) */ + int _cuu_cost; /* cost of (parm_cursor_up) */ + int _hpa_cost; /* cost of (column_address) */ + int _vpa_cost; /* cost of (row_address) */ + /* used in tty_update.c, must be chars */ + int _ed_cost; /* cost of (clr_eos) */ + int _el_cost; /* cost of (clr_eol) */ + int _el1_cost; /* cost of (clr_bol) */ + int _dch1_cost; /* cost of (delete_character) */ + int _ich1_cost; /* cost of (insert_character) */ + int _dch_cost; /* cost of (parm_dch) */ + int _ich_cost; /* cost of (parm_ich) */ + int _ech_cost; /* cost of (erase_chars) */ + int _rep_cost; /* cost of (repeat_char) */ + int _hpa_ch_cost; /* cost of (column_address) */ + int _cup_ch_cost; /* cost of (cursor_address) */ + int _cuf_ch_cost; /* cost of (parm_cursor_right) */ + int _inline_cost; /* cost of inline-move */ + int _smir_cost; /* cost of (enter_insert_mode) */ + int _rmir_cost; /* cost of (exit_insert_mode) */ + int _ip_cost; /* cost of (insert_padding) */ + /* used in lib_mvcur.c */ + char * _address_cursor; + /* used in tty_update.c */ + int _scrolling; /* 1 if terminal's smart enough to */ + + /* used in lib_color.c */ + rgb_bits_t _direct_color; /* RGB overrides color-table */ + color_t *_color_table; /* screen's color palette */ + int _color_count; /* count of colors in palette */ + colorpair_t *_color_pairs; /* screen's color pair list */ + int _pair_count; /* same as COLOR_PAIRS */ + int _pair_limit; /* actual limit of color-pairs */ + int _pair_alloc; /* current table-size of color-pairs */ + chtype _ok_attributes; /* valid attributes for terminal */ + chtype _xmc_suppress; /* attributes to suppress if xmc */ + chtype _xmc_triggers; /* attributes to process if xmc */ + chtype * _acs_map; /* the real alternate-charset map */ + bool * _screen_acs_map; + + + /* used in lib_vidattr.c */ + bool _use_rmso; /* true if we may use 'rmso' */ + bool _use_rmul; /* true if we may use 'rmul' */ + + /* + * These data correspond to the state of the idcok() and idlok() + * functions. A caveat is in order here: the XSI and SVr4 + * documentation specify that these functions apply to the window which + * is given as an argument. However, ncurses implements this logic + * only for the newscr/curscr update process, _not_ per-window. + */ + bool _nc_sp_idlok; + bool _nc_sp_idcok; + + /* + * These are the data that support the mouse interface. + */ + bool _mouse_initialized; + MouseType _mouse_type; + int _maxclick; + bool (*_mouse_event) (SCREEN *); + bool (*_mouse_inline)(SCREEN *); + bool (*_mouse_parse) (SCREEN *, int); + void (*_mouse_resume)(SCREEN *); + void (*_mouse_wrap) (SCREEN *); + int _mouse_fd; /* file-descriptor, if any */ + bool _mouse_active; /* true if initialized */ + mmask_t _mouse_mask; /* set via mousemask() */ + mmask_t _mouse_mask2; /* OR's in press/release bits */ + mmask_t _mouse_bstate; + MouseFormat _mouse_format; /* type of xterm mouse protocol */ + NCURSES_CONST char *_mouse_xtermcap; /* string to enable/disable mouse */ + MEVENT _mouse_events[EV_MAX]; /* hold the last mouse event seen */ + MEVENT *_mouse_eventp; /* next free slot in event queue */ + + /* + * These are data that support the proper handling of the panel stack on an + * per screen basis. + */ + struct panelhook _panelHook; + + bool _sig_winch; + SCREEN *_next_screen; + + /* hashes for old and new lines */ + unsigned long *oldhash, *newhash; + HASHMAP *hashtab; + int hashtab_len; + int *_oldnum_list; + int _oldnum_size; + + NCURSES_SP_OUTC _outch; /* output handler if not putc */ + NCURSES_OUTC jump; + + ripoff_t rippedoff[N_RIPS]; + ripoff_t *rsp; + + int _legacy_coding; /* see use_legacy_coding() */ + +#if NCURSES_NO_PADDING + bool _no_padding; /* flag to set if padding disabled */ +#endif + +#if USE_HARD_TABS + int _ht_cost; /* cost of (tab) */ + int _cbt_cost; /* cost of (backtab) */ +#endif /* USE_HARD_TABS */ + + /* used in lib_vidattr.c */ +#if USE_ITALIC + bool _use_ritm; /* true if we may use 'ritm' */ +#endif + + /* used in getch/twait */ +#if USE_KLIBC_KBD + bool _extended_key; /* true if an extended key */ +#endif + + /* used in lib_color.c */ +#if NCURSES_EXT_FUNCS + bool _assumed_color; /* use assumed colors */ + bool _default_color; /* use default colors */ + bool _has_sgr_39_49; /* has ECMA default color support */ + int _default_fg; /* assumed default foreground */ + int _default_bg; /* assumed default background */ + int _default_pairs; /* count pairs using default color */ +#endif + + /* system-dependent mouse data */ +#if USE_GPM_SUPPORT + bool _mouse_gpm_loaded; + bool _mouse_gpm_found; +#ifdef HAVE_LIBDL + void *_dlopen_gpm; + TYPE_gpm_fd _mouse_gpm_fd; + TYPE_Gpm_Open _mouse_Gpm_Open; + TYPE_Gpm_Close _mouse_Gpm_Close; + TYPE_Gpm_GetEvent _mouse_Gpm_GetEvent; +#endif + Gpm_Connect _mouse_gpm_connect; +#endif /* USE_GPM_SUPPORT */ + +#if USE_EMX_MOUSE + int _emxmouse_wfd; + int _emxmouse_thread; + int _emxmouse_activated; + char _emxmouse_buttons[4]; +#endif + +#if USE_SYSMOUSE + MEVENT _sysmouse_fifo[FIFO_SIZE]; + int _sysmouse_head; + int _sysmouse_tail; + int _sysmouse_char_width; /* character width */ + int _sysmouse_char_height; /* character height */ + int _sysmouse_old_buttons; + int _sysmouse_new_buttons; +#endif + +#if defined(USE_TERM_DRIVER) || defined(EXP_WIN32_DRIVER) + MEVENT _drv_mouse_fifo[FIFO_SIZE]; + int _drv_mouse_head; + int _drv_mouse_tail; + int _drv_mouse_old_buttons; + int _drv_mouse_new_buttons; +#endif + /* + * This supports automatic resizing + */ +#if USE_SIZECHANGE + int (*_resize)(NCURSES_SP_DCLx int y, int x); + int (*_ungetch)(SCREEN *, int); +#endif + +#ifdef USE_SP_WINDOWLIST + WINDOWLIST* _windowlist; +#define WindowList(sp) (sp)->_windowlist +#endif + +#if USE_REENTRANT + char _ttytype[NAMESIZE]; + int _ESCDELAY; + int _TABSIZE; + int _LINES; + int _COLS; +#endif + +#if NCURSES_SP_FUNCS + bool use_tioctl; +#endif + + /* + * ncurses/ncursesw are the same up to this point. + */ +#if USE_WIDEC_SUPPORT + /* recent versions of 'screen' have partially-working support for + * UTF-8, but do not permit ACS at the same time (see tty_update.c). + */ + bool _screen_acs_fix; + bool _screen_unicode; +#endif + +#if NCURSES_EXT_FUNCS && NCURSES_EXT_COLORS + void *_ordered_pairs; /* index used by alloc_pair() */ + int _pairs_used; /* actual number of color-pairs used */ + int _recent_pair; /* number for most recent free-pair */ +#endif + +#ifdef TRACE + char tracechr_buf[TRACECHR_BUF]; + char tracemse_buf[TRACEMSE_MAX]; +#if USE_REENTRANT + long _outchars; + const char *_tputs_trace; +#endif +#endif +#undef SCREEN +} SCREEN; + +extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; +extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; + + WINDOWLIST { + WINDOWLIST *next; + SCREEN *screen; /* screen containing the window */ + WINDOW win; /* WINDOW_EXT() needs to account for offset */ +#if NCURSES_WIDECHAR + char addch_work[(MB_LEN_MAX * 9) + 1]; + unsigned addch_used; /* number of bytes in addch_work[] */ + int addch_x; /* x-position for addch_work[] */ + int addch_y; /* y-position for addch_work[] */ +#endif +}; + +#define WINDOW_EXT(w,m) (((WINDOWLIST *)((void *)((char *)(w) - offsetof(WINDOWLIST, win))))->m) + +#ifdef USE_SP_WINDOWLIST +#define SP_INIT_WINDOWLIST(sp) WindowList(sp) = 0 +#else +#define SP_INIT_WINDOWLIST(sp) /* nothing */ +#endif + +#define SP_PRE_INIT(sp) \ + sp->_cursrow = -1; \ + sp->_curscol = -1; \ + IsNl(sp) = TRUE; \ + IsRaw(sp) = FALSE; \ + IsCbreak(sp) = 0; \ + IsEcho(sp) = TRUE; \ + sp->_fifohead = -1; \ + sp->_endwin = ewSuspend; \ + sp->_cursor = -1; \ + SP_INIT_WINDOWLIST(sp); \ + sp->_outch = NCURSES_OUTC_FUNC; \ + sp->jump = 0 \ + +/* usually in */ +#ifndef UCHAR_MAX +#define UCHAR_MAX 255 +#endif + +/* The terminfo source is assumed to be 7-bit ASCII */ +#define is7bits(c) ((unsigned)(c) < 128) + +/* Checks for isprint() should be done on 8-bit characters (non-wide) */ +#define is8bits(c) ((unsigned)(c) <= UCHAR_MAX) + +#ifndef Min +#define Min(a,b) ((a) > (b) ? (b) : (a)) +#endif + +#ifndef Max +#define Max(a,b) ((a) < (b) ? (b) : (a)) +#endif + +/* usually in */ +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif + +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif + +#ifndef STDERR_FILENO +#define STDERR_FILENO 2 +#endif + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif + +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif + +#ifndef R_OK +#define R_OK 4 /* Test for read permission. */ +#endif +#ifndef W_OK +#define W_OK 2 /* Test for write permission. */ +#endif +#ifndef X_OK +#define X_OK 1 /* Test for execute permission. */ +#endif +#ifndef F_OK +#define F_OK 0 /* Test for existence. */ +#endif + +#if HAVE_FCNTL_H +#include /* may define O_BINARY */ +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifdef TRACE +#if USE_REENTRANT +#define COUNT_OUTCHARS(n) _nc_count_outchars(n); +#else +#define COUNT_OUTCHARS(n) _nc_outchars += (n); +#endif +#else +#define COUNT_OUTCHARS(n) /* nothing */ +#endif + +#define RESET_OUTCHARS() COUNT_OUTCHARS(-_nc_outchars) + +#define UChar(c) ((unsigned char)(c)) +#define UShort(c) ((unsigned short)(c)) +#define ChCharOf(c) ((chtype)(c) & (chtype)A_CHARTEXT) +#define ChAttrOf(c) ((chtype)(c) & (chtype)A_ATTRIBUTES) + +#define TR_PUTC(c) TR(TRACE_CHARPUT, ("PUTC %#x", UChar(c))) + +#if USE_WIDEC_SUPPORT /* { */ +/* true if the status/errno indicate an illegal multibyte sequence */ +#define isEILSEQ(status) (((size_t)status == (size_t)-1) && (errno == EILSEQ)) + +#define init_mb(state) memset(&(state), 0, sizeof(state)) + +#if NCURSES_EXT_COLORS +#define NulColor , 0 +#else +#define NulColor /* nothing */ +#endif + +#if CCHARW_MAX > 6 +#define NulChar 0,0,0,0,0 +#elif CCHARW_MAX > 5 +#define NulChar 0,0,0,0 /* ncurses7 */ +#elif CCHARW_MAX > 4 +#define NulChar 0,0,0 /* ncurses6 */ +#elif CCHARW_MAX > 3 +#define NulChar 0,0 +#elif CCHARW_MAX > 2 +#define NulChar 0 +#else +#define NulChar /* nothing */ +#endif + +#define CharOf(c) ((c).chars[0]) +#define AttrOf(c) ((c).attr) + +#define AddAttr(c,a) AttrOf(c) |= ((a) & A_ATTRIBUTES) +#define RemAttr(c,a) AttrOf(c) &= ~((a) & A_ATTRIBUTES) +#define SetAttr(c,a) AttrOf(c) = ((a) & A_ATTRIBUTES) | WidecExt(c) + +#define NewChar2(c,a) { a, { c, NulChar } NulColor } +#define NewChar(ch) NewChar2(ChCharOf(ch), ChAttrOf(ch)) + +#if CCHARW_MAX > 1 +#define CharEq(a,b) (((a).attr == (b).attr) \ + && !memcmp((a).chars, \ + (b).chars, \ + CCHARW_MAX * sizeof((b).chars[0])) \ + if_EXT_COLORS(&& (a).ext_color == (b).ext_color)) +#else +#define CharEq(a,b) (!memcmp(&(a), &(b), sizeof(a))) +#endif + +#define SetChar(ch,c,a) do { \ + NCURSES_CH_T *_cp = &(ch); \ + memset(_cp, 0, sizeof(ch)); \ + _cp->chars[0] = (wchar_t) (c); \ + _cp->attr = (a); \ + if_EXT_COLORS(SetPair(ch, PairNumber(a))); \ + } while (0) +#define CHREF(wch) (&(wch)) +#define CHDEREF(wch) (*(wch)) +#define ARG_CH_T NCURSES_CH_T * +#define CARG_CH_T const NCURSES_CH_T * +#define PUTC_DATA char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \ + mbstate_t PUT_st; wchar_t PUTC_ch +#define PUTC_INIT init_mb (PUT_st) +#define PUTC(ch) do { if(!isWidecExt(ch)) { \ + if (Charable(ch)) { \ + TR_PUTC(CharOf(ch)); \ + NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \ + COUNT_OUTCHARS(1); \ + } else { \ + for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { \ + PUTC_ch = (ch).chars[PUTC_i]; \ + if (PUTC_ch == L'\0') \ + break; \ + PUTC_INIT; \ + PUTC_n = (int) wcrtomb(PUTC_buf, \ + (ch).chars[PUTC_i], &PUT_st); \ + if (PUTC_n <= 0) { \ + if (PUTC_ch && is8bits(PUTC_ch) && PUTC_i == 0) { \ + TR_PUTC(CharOf(ch)); \ + NCURSES_OUTC_FUNC (NCURSES_SP_ARGx CharOf(ch)); \ + } \ + break; \ + } else { \ + int PUTC_j; \ + for (PUTC_j = 0; PUTC_j < PUTC_n; ++PUTC_j) { \ + TR_PUTC(PUTC_buf[PUTC_j]); \ + NCURSES_OUTC_FUNC (NCURSES_SP_ARGx PUTC_buf[PUTC_j]); \ + } \ + } \ + } \ + COUNT_OUTCHARS(PUTC_i); \ + } } } while (0) + +#define BLANK NewChar2(' ', WA_NORMAL) +#define ZEROS NewChar2('\0', WA_NORMAL) +#define ISBLANK(ch) ((ch).chars[0] == L' ' && (ch).chars[1] == L'\0') + + /* + * Wide characters cannot be represented in the A_CHARTEXT mask of + * attr_t's but an application might have set a narrow character there. + * But even in that case, it would only be a printable character, or + * zero. Otherwise we can use those bits to tell if a cell is the + * first or extension part of a wide character. + */ +#define WidecExt(ch) (int) (AttrOf(ch) & A_CHARTEXT) +#define isWidecBase(ch) (WidecExt(ch) == 1) +#define isWidecExt(ch) (WidecExt(ch) > 1 && WidecExt(ch) < 32) +#define SetWidecExt(dst, ext) AttrOf(dst) &= ~A_CHARTEXT, \ + AttrOf(dst) |= (attr_t) (ext + 1) + +#define if_WIDEC(code) code +#define Charable(ch) (((SP_PARM->_legacy_coding) \ + || (AttrOf(ch) & A_ALTCHARSET) \ + || (!isWidecExt(ch))) && \ + (ch).chars[1] == L'\0' && \ + _nc_is_charable(CharOf(ch))) + +#define L(ch) L ## ch +#else /* }{ */ +#define CharOf(c) ChCharOf(c) +#define AttrOf(c) ChAttrOf(c) +#define AddAttr(c,a) c |= (a) +#define RemAttr(c,a) c &= ~((a) & A_ATTRIBUTES) +#define SetAttr(c,a) c = ((c) & ~A_ATTRIBUTES) | (a) +#define NewChar(ch) (ch) +#define NewChar2(c,a) ((c) | (a)) +#define CharEq(a,b) ((a) == (b)) +#define SetChar(ch,c,a) ch = (c) | (a) +#define CHREF(wch) wch +#define CHDEREF(wch) wch +#define ARG_CH_T NCURSES_CH_T +#define CARG_CH_T NCURSES_CH_T +#define PUTC_DATA /* nothing */ +#define PUTC(ch) { \ + TR_PUTC(ch); \ + NCURSES_OUTC_FUNC (NCURSES_SP_ARGx (int) ch); \ + } + +#define BLANK (' '|A_NORMAL) +#define ZEROS ('\0'|A_NORMAL) +#define ISBLANK(ch) (CharOf(ch) == ' ') + +#define isWidecExt(ch) (0) +#define if_WIDEC(code) /* nothing */ + +#define Charable(ch) (CharOf(ch) >= ' ' && CharOf(ch) <= '~') +#define L(ch) ch +#endif /* } */ + +#define AttrOfD(ch) AttrOf(CHDEREF(ch)) +#define CharOfD(ch) CharOf(CHDEREF(ch)) +#define SetChar2(wch,ch) SetChar(wch,ChCharOf(ch),ChAttrOf(ch)) + +#define BLANK_ATTR A_NORMAL +#define BLANK_TEXT L(' ') + +#define CHANGED -1 + +#define LEGALYX(w, y, x) \ + ((w) != 0 && \ + ((x) >= 0 && (x) <= (w)->_maxx && \ + (y) >= 0 && (y) <= (w)->_maxy)) + +#define OK_DIMENSION(n) ((NCURSES_SIZE_T)(n) == (n) && (n) > 0) + +#define CHANGED_CELL(line,col) \ + if (line->firstchar == _NOCHANGE) \ + line->firstchar = line->lastchar = (NCURSES_SIZE_T) (col); \ + else if ((col) < line->firstchar) \ + line->firstchar = (NCURSES_SIZE_T) (col); \ + else if ((col) > line->lastchar) \ + line->lastchar = (NCURSES_SIZE_T) (col) + +#define CHANGED_RANGE(line,start,end) \ + if (line->firstchar == _NOCHANGE \ + || line->firstchar > (start)) \ + line->firstchar = (NCURSES_SIZE_T) (start); \ + if (line->lastchar == _NOCHANGE \ + || line->lastchar < (end)) \ + line->lastchar = (NCURSES_SIZE_T) (end) + +#define CHANGED_TO_EOL(line,start,end) \ + if (line->firstchar == _NOCHANGE \ + || line->firstchar > (start)) \ + line->firstchar = (NCURSES_SIZE_T) (start); \ + line->lastchar = (NCURSES_SIZE_T) (end) + +#define SIZEOF(v) (sizeof(v)/sizeof(v[0])) + +#include +#include + +#define FreeIfNeeded(p) if ((p) != 0) free(p) + +/* FreeAndNull() is not a comma-separated expression because some compilers + * do not accept a mixture of void with values. + */ +#define FreeAndNull(p) do { free(p); p = 0; } while (0) + +#ifdef EXP_OOM_TESTING +extern NCURSES_EXPORT(void *) _nc_oom_malloc(size_t size); +extern NCURSES_EXPORT(void *) _nc_oom_calloc(size_t nmemb, size_t size); +extern NCURSES_EXPORT(void *) _nc_oom_realloc(void *ptr, size_t size); +extern NCURSES_EXPORT(void) _nc_oom_free(void *ptr); +extern NCURSES_EXPORT(char *) _nc_oom_strdup(const char *ptr); +#define malloc(size) _nc_oom_malloc(size) +#define calloc(nmemb, size) _nc_oom_calloc(nmemb, size) +#define realloc(ptr, size) _nc_oom_realloc(ptr, size) +#define free(ptr) _nc_oom_free(ptr) +#define strdup(ptr) _nc_oom_strdup(ptr) +#endif + +/* + * Use these for tic/infocmp malloc failures. Generally the ncurses library + * tries to limp along after a failure. + */ +#define TYPE_MALLOC(type, size, name) \ + do { \ + name = typeMalloc(type, size); \ + if (name == 0) \ + _nc_err_abort(MSG_NO_MEMORY); \ + } while (0) + +#define TYPE_CALLOC(type, size, name) \ + do { \ + name = typeCalloc(type, size); \ + if (name == 0) \ + _nc_err_abort(MSG_NO_MEMORY); \ + } while (0) + +#define TYPE_REALLOC(type, size, name) \ + do { \ + name = typeRealloc(type, size, name); \ + if (name == 0) \ + _nc_err_abort(MSG_NO_MEMORY); \ + } while (0) + +/* + * TTY bit definition for converting tabs to spaces. + */ +#ifdef TAB3 +# define OFLAGS_TABS TAB3 /* POSIX specifies TAB3 */ +#else +# ifdef XTABS +# define OFLAGS_TABS XTABS /* XTABS is usually the "same" */ +# else +# ifdef OXTABS +# define OFLAGS_TABS OXTABS /* the traditional BSD equivalent */ +# else +# define OFLAGS_TABS 0 +# endif +# endif +#endif + +#ifdef __TANDEM +#define ROOT_UID 65535 +#endif + +#ifndef ROOT_UID +#define ROOT_UID 0 +#endif + +/* + * Standardize/simplify common loops + */ +#define each_screen(p) p = _nc_screen_chain; p != 0; p = (p)->_next_screen +#define each_window(sp,p) p = WindowList(sp); p != 0; p = (p)->next +#define each_ripoff(p) p = safe_ripoff_stack; (p - safe_ripoff_stack) < N_RIPS; ++p + +/* + * Prefixes for call/return points of library function traces. We use these to + * instrument the public functions so that the traces can be easily transformed + * into regression scripts. + */ +#define T_CALLED(fmt) "called {" fmt +#define T_CREATE(fmt) "create :" fmt +#define T_RETURN(fmt) "return }" fmt + +#define NonNull(s) ((s) != 0 ? s : "") +#define NonEmpty(s) ((s) != 0 && *(s) != '\0') + +#ifdef TRACE + +#if USE_REENTRANT +#define TPUTS_TRACE(s) _nc_set_tputs_trace(s); +#else +#define TPUTS_TRACE(s) _nc_tputs_trace = s; +#endif + +#ifdef HAVE_CONSISTENT_GETENV +#define START_TRACE() \ + if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \ + int t = _nc_getenv_num("NCURSES_TRACE"); \ + if (t >= 0) \ + curses_trace((unsigned) t); \ + } +#else +#define START_TRACE() /* nothing */ +#endif + +/* + * Many of the _tracef() calls use static buffers; lock the trace state before + * trying to fill them. + */ +#if USE_REENTRANT +#define USE_TRACEF(mask) _nc_use_tracef(mask) +extern NCURSES_EXPORT(int) _nc_use_tracef (unsigned); +extern NCURSES_EXPORT(void) _nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE(1,2); +#else +#define USE_TRACEF(mask) (_nc_tracing & (mask)) +#define _nc_locked_tracef _tracef +#endif + +#define TR(n, a) if (USE_TRACEF(n)) _nc_locked_tracef a +#define T(a) TR(TRACE_CALLS, a) +#define TRACE_RETURN(value,type) return _nc_retrace_##type((type)(value)) +#define TRACE_RETURN1(value,dst) return _nc_retrace_##dst(value) +#define TRACE_RETURN2(value,dst,src) return _nc_retrace_##dst##_##src(value) +#define TRACE_RETURN_SP(value,type) return _nc_retrace_##type(SP_PARM, value) + +typedef void VoidFunc(void); + +#define TR_FUNC_LEN ((sizeof(void *) + sizeof(void (*)(void))) * 2 + 4) +#define TR_FUNC_BFR(max) char tr_func_data[max][TR_FUNC_LEN] +#define TR_FUNC_ARG(num,func) _nc_fmt_funcptr(&tr_func_data[num][0], (const char *)&(func), sizeof((func))) + +#define returnAttr(code) TRACE_RETURN(code,attr_t) +#define returnBits(code) TRACE_RETURN(code,unsigned) +#define returnBool(code) TRACE_RETURN(code,bool) +#define returnCPtr(code) TRACE_RETURN1(code,cptr) +#define returnCVoidPtr(code) TRACE_RETURN1(code,cvoid_ptr) +#define returnChar(code) TRACE_RETURN(code,char) +#define returnChtype(code) TRACE_RETURN(code,chtype) +#define returnCode(code) TRACE_RETURN(code,int) +#define returnIntAttr(code) TRACE_RETURN2(code,int,attr_t) +#define returnMMask(code) TRACE_RETURN_SP(code,mmask_t) +#define returnPtr(code) TRACE_RETURN1(code,ptr) +#define returnSP(code) TRACE_RETURN1(code,sp) +#define returnVoid { T((T_RETURN(""))); return; } +#define returnVoidPtr(code) TRACE_RETURN1(code,void_ptr) +#define returnWin(code) TRACE_RETURN1(code,win) + +#define returnDB(rc) do { TR(TRACE_DATABASE,(T_RETURN("code %d"), (rc))); return (rc); } while (0) +#define returnPtrDB(rc) do { TR(TRACE_DATABASE,(T_RETURN("%p"), (rc))); return (rc); } while (0) +#define returnVoidDB do { TR(TRACE_DATABASE,(T_RETURN(""))); return; } while (0) + +extern NCURSES_EXPORT(NCURSES_BOOL) _nc_retrace_bool (int); +extern NCURSES_EXPORT(NCURSES_CONST void *) _nc_retrace_cvoid_ptr (NCURSES_CONST void *); +extern NCURSES_EXPORT(SCREEN *) _nc_retrace_sp (SCREEN *); +extern NCURSES_EXPORT(WINDOW *) _nc_retrace_win (WINDOW *); +extern NCURSES_EXPORT(attr_t) _nc_retrace_attr_t (attr_t); +extern NCURSES_EXPORT(char *) _nc_retrace_ptr (char *); +extern NCURSES_EXPORT(char *) _nc_trace_ttymode(const TTY *tty); +extern NCURSES_EXPORT(char *) _nc_varargs (const char *, va_list); +extern NCURSES_EXPORT(chtype) _nc_retrace_chtype (chtype); +extern NCURSES_EXPORT(const char *) _nc_altcharset_name(attr_t, chtype); +extern NCURSES_EXPORT(const char *) _nc_retrace_cptr (const char *); +extern NCURSES_EXPORT(char) _nc_retrace_char (int); +extern NCURSES_EXPORT(int) _nc_retrace_int (int); +extern NCURSES_EXPORT(int) _nc_retrace_int_attr_t (attr_t); +extern NCURSES_EXPORT(mmask_t) _nc_retrace_mmask_t (SCREEN *, mmask_t); +extern NCURSES_EXPORT(unsigned) _nc_retrace_unsigned (unsigned); +extern NCURSES_EXPORT(void *) _nc_retrace_void_ptr (void *); +extern NCURSES_EXPORT(void) _nc_fifo_dump (SCREEN *); + +extern NCURSES_EXPORT(char *) _nc_fmt_funcptr(char *, const char *, size_t); + +#if USE_REENTRANT +NCURSES_WRAPPED_VAR(long, _nc_outchars); +NCURSES_WRAPPED_VAR(const char *, _nc_tputs_trace); +#define _nc_outchars NCURSES_PUBLIC_VAR(_nc_outchars()) +#define _nc_tputs_trace NCURSES_PUBLIC_VAR(_nc_tputs_trace()) +extern NCURSES_EXPORT(void) _nc_set_tputs_trace (const char *); +extern NCURSES_EXPORT(void) _nc_count_outchars (long); +#else +extern NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace; +extern NCURSES_EXPORT_VAR(long) _nc_outchars; +#endif + +extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing; + +extern NCURSES_EXPORT(char *) _nc_tracebits (void); +extern NCURSES_EXPORT(char *) _tracemouse (const MEVENT *); +extern NCURSES_EXPORT(void) _tracedump (const char *, WINDOW *); + +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(const char *) _nc_viswbuf2 (int, const wchar_t *); +extern NCURSES_EXPORT(const char *) _nc_viswbufn (const wchar_t *, int); +#endif + +extern NCURSES_EXPORT(const char *) _nc_viscbuf2 (int, const NCURSES_CH_T *, int); +extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); + +#else /* !TRACE */ + +#define START_TRACE() /* nothing */ + +#define T(a) +#define TR(n, a) +#define TPUTS_TRACE(s) +#define TR_FUNC_BFR(max) + +#define returnAttr(code) return code +#define returnBits(code) return code +#define returnBool(code) return code +#define returnCPtr(code) return code +#define returnCVoidPtr(code) return code +#define returnChar(code) return ((char) code) +#define returnChtype(code) return code +#define returnCode(code) return code +#define returnIntAttr(code) return code +#define returnMMask(code) return code +#define returnPtr(code) return code +#define returnSP(code) return code +#define returnVoid return +#define returnVoidPtr(code) return code +#define returnWin(code) return code + +#define returnDB(code) return code +#define returnPtrDB(rc) return rc +#define returnVoidDB return + +#endif /* TRACE/!TRACE */ + +/* + * Workaround for defective implementation of gcc attribute warn_unused_result + */ +#if defined(__GNUC__) && defined(_FORTIFY_SOURCE) +#define IGNORE_RC(func) errno = (int) func +#else +#define IGNORE_RC(func) (void) func +#endif /* gcc workarounds */ + +/* + * Return-codes for tgetent() and friends. + */ +#define TGETENT_YES 1 /* entry is found */ +#define TGETENT_NO 0 /* entry is not found */ +#define TGETENT_ERR -1 /* an error occurred */ + +extern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *); +extern NCURSES_EXPORT(const char *) _nc_visbufn (const char *, int); + +#define EMPTY_MODULE(name) \ +extern NCURSES_EXPORT(void) name (void); \ + NCURSES_EXPORT(void) name (void) { } + +#define ALL_BUT_COLOR ((chtype)~(A_COLOR)) +#define NONBLANK_ATTR (A_BOLD | A_DIM | A_BLINK | A_ITALIC) +#define TPARM_ATTR (A_STANDOUT | A_UNDERLINE | A_REVERSE | A_BLINK | A_DIM | A_BOLD | A_ALTCHARSET | A_INVIS | A_PROTECT) +#define XMC_CONFLICT (A_STANDOUT | A_UNDERLINE | A_REVERSE | A_BLINK | A_DIM | A_BOLD | A_INVIS | A_PROTECT | A_ITALIC) +#define XMC_CHANGES(c) ((c) & SP_PARM->_xmc_suppress) + +#define toggle_attr_on(S,at) {\ + if (PairNumber(at) > 0) {\ + (S) = ((S) & ALL_BUT_COLOR) | (attr_t) (at);\ + } else {\ + (S) |= (attr_t) (at);\ + }\ + TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));} + + +#define toggle_attr_off(S,at) {\ + if (PairNumber(at) > 0) {\ + (S) &= ~(at|A_COLOR);\ + } else {\ + (S) &= ~(at);\ + }\ + TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));} + +#define DelCharCost(sp,count) \ + ((parm_dch != 0) \ + ? sp->_dch_cost \ + : ((delete_character != 0) \ + ? (sp->_dch1_cost * count) \ + : INFINITY)) + +#define InsCharCost(sp,count) \ + ((parm_ich != 0) \ + ? sp->_ich_cost \ + : ((enter_insert_mode && exit_insert_mode) \ + ? sp->_smir_cost + sp->_rmir_cost + (sp->_ip_cost * count) \ + : ((insert_character != 0) \ + ? ((sp->_ich1_cost + sp->_ip_cost) * count) \ + : INFINITY))) + +#if USE_XMC_SUPPORT +#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ + attr_t chg = AttrOf(SCREEN_ATTRS(sp)); \ + VIDPUTS(sp, AttrOf(c), GetPair(c)); \ + if (magic_cookie_glitch > 0 \ + && XMC_CHANGES((chg ^ AttrOf(SCREEN_ATTRS(sp))))) { \ + T(("%s @%d before glitch %d,%d", \ + __FILE__, __LINE__, \ + sp->_cursrow, \ + sp->_curscol)); \ + NCURSES_SP_NAME(_nc_do_xmc_glitch)(NCURSES_SP_ARGx chg); \ + } \ + } +#else +#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ + VIDPUTS(sp, AttrOf(c), GetPair(c)); \ + } +#endif + +/* + * Macros to make additional parameter to implement wgetch_events() + */ +#ifdef NCURSES_WGETCH_EVENTS +#define EVENTLIST_0th(param) param +#define EVENTLIST_1st(param) param +#define EVENTLIST_2nd(param) , param +#define TWAIT_MASK (TW_ANY | TW_EVENT) +#else +#define EVENTLIST_0th(param) void +#define EVENTLIST_1st(param) /* nothing */ +#define EVENTLIST_2nd(param) /* nothing */ +#define TWAIT_MASK TW_ANY +#endif + +#if NCURSES_EXPANDED && NCURSES_EXT_FUNCS + +#undef toggle_attr_on +#define toggle_attr_on(S,at) _nc_toggle_attr_on(&(S), at) +extern NCURSES_EXPORT(void) _nc_toggle_attr_on (attr_t *, attr_t); + +#undef toggle_attr_off +#define toggle_attr_off(S,at) _nc_toggle_attr_off(&(S), at) +extern NCURSES_EXPORT(void) _nc_toggle_attr_off (attr_t *, attr_t); + +#undef DelCharCost +#define DelCharCost(sp, count) NCURSES_SP_NAME(_nc_DelCharCost)(NCURSES_SP_ARGx count) + +#undef InsCharCost +#define InsCharCost(sp, count) NCURSES_SP_NAME(_nc_InsCharCost)(NCURSES_SP_ARGx count) + +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_DelCharCost) (NCURSES_SP_DCLx int _c); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_InsCharCost) (NCURSES_SP_DCLx int _c); + +#undef UpdateAttrs +#define UpdateAttrs(sp,c) NCURSES_SP_NAME(_nc_UpdateAttrs)(NCURSES_SP_ARGx CHREF(c)) + +#if USE_WIDEC_SUPPORT || defined(NEED_NCURSES_CH_T) +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_UpdateAttrs) (NCURSES_SP_DCLx CARG_CH_T _c); +#else +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_UpdateAttrs) (NCURSES_SP_DCLx chtype c); +#endif + +#if NCURSES_SP_FUNCS +extern NCURSES_EXPORT(int) _nc_DelCharCost (int); +extern NCURSES_EXPORT(int) _nc_InsCharCost (int); +extern NCURSES_EXPORT(void) _nc_UpdateAttrs (CARG_CH_T); +#endif /* NCURSES_SP_FUNCS */ + +#else + +extern NCURSES_EXPORT(void) _nc_expanded (void); + +#endif + +#if !NCURSES_EXT_FUNCS +#define set_escdelay(value) ESCDELAY = value +#endif + +#if !HAVE_GETCWD +#define getcwd(buf,len) getwd(buf) +#endif + +#define save_ttytype(termp) \ + if (TerminalType(termp).term_names != 0) { \ + _nc_STRNCPY(ttytype, \ + TerminalType(termp).term_names, \ + NAMESIZE - 1); \ + ttytype[NAMESIZE - 1] = '\0'; \ + } + +#if !NCURSES_WCWIDTH_GRAPHICS +extern NCURSES_EXPORT(int) _nc_wacs_width(unsigned); +#else +#define _nc_wacs_width(ch) wcwidth(ch) +#endif + +/* charable.c */ +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(bool) _nc_is_charable(wchar_t); +extern NCURSES_EXPORT(int) _nc_to_char(wint_t); +extern NCURSES_EXPORT(wint_t) _nc_to_widechar(int); +#endif + +/* comp_captab.c */ +typedef struct { + short nte_name; /* offset of name to hash on */ + int nte_type; /* BOOLEAN, NUMBER or STRING */ + short nte_index; /* index of associated variable in its array */ + short nte_link; /* index in table of next hash, or -1 */ +} name_table_data; + +typedef struct +{ + short from; + short to; + short source; +} alias_table_data; + +/* comp_userdefs.c */ +typedef struct { + short ute_name; /* offset of name to hash on */ + unsigned ute_type; /* mask (BOOLEAN, NUMBER, STRING) */ + unsigned ute_argc; /* number of parameters */ + unsigned ute_args; /* bit-mask for string parameters */ + short ute_index; /* index of associated variable in its array */ + short ute_link; /* index in table of next hash, or -1 */ +} user_table_data; + +/* doupdate.c */ +#if USE_XMC_SUPPORT +extern NCURSES_EXPORT(void) _nc_do_xmc_glitch (attr_t); +#endif + +/* hardscroll.c */ +#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG) +extern NCURSES_EXPORT(void) _nc_linedump (void); +#endif + +/* lib_acs.c */ +extern NCURSES_EXPORT(void) _nc_init_acs (void); /* corresponds to traditional 'init_acs()' */ +extern NCURSES_EXPORT(int) _nc_msec_cost (const char *const, int); + +/* lib_addch.c */ +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch); +#endif + +/* lib_addstr.c */ +#if USE_WIDEC_SUPPORT && !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) +extern NCURSES_EXPORT(int) _nc_wchstrlen(const cchar_t *); +#endif + +/* lib_color.c */ +extern NCURSES_EXPORT(int) _nc_init_color(SCREEN *, int, int, int, int); +extern NCURSES_EXPORT(int) _nc_init_pair(SCREEN *, int, int, int); +extern NCURSES_EXPORT(int) _nc_pair_content(SCREEN *, int, int *, int *); +extern NCURSES_EXPORT(bool) _nc_reset_colors(void); +extern NCURSES_EXPORT(void) _nc_reserve_pairs(SCREEN *, int); +extern NCURSES_EXPORT(void) _nc_change_pair(SCREEN *, int); + +#define ReservePairs(sp,want) \ + if ((sp->_color_pairs == 0) || (want >= sp->_pair_alloc)) \ + _nc_reserve_pairs(sp, want) + +/* lib_getch.c */ +extern NCURSES_EXPORT(int) _nc_wgetch(WINDOW *, int *, int EVENTLIST_2nd(_nc_eventlist *)); + +/* lib_insch.c */ +extern NCURSES_EXPORT(int) _nc_insert_ch(SCREEN *, WINDOW *, chtype); + +/* lib_mvcur.c */ +#define INFINITY 1000000 /* cost: too high to use */ + +extern NCURSES_EXPORT(int) _nc_mvcur(int yold, int xold, int ynew, int xnew); + +extern NCURSES_EXPORT(void) _nc_mvcur_init (void); +extern NCURSES_EXPORT(void) _nc_mvcur_resume (void); +extern NCURSES_EXPORT(void) _nc_mvcur_wrap (void); + +extern NCURSES_EXPORT(int) _nc_scrolln (int, int, int, int); + +extern NCURSES_EXPORT(void) _nc_screen_init (void); +extern NCURSES_EXPORT(void) _nc_screen_resume (void); +extern NCURSES_EXPORT(void) _nc_screen_wrap (void); + +/* lib_mouse.c */ +extern NCURSES_EXPORT(bool) _nc_has_mouse (const SCREEN *); + +/* lib_mvcur.c */ +#define INFINITY 1000000 /* cost: too high to use */ +#define BAUDBYTE 9 /* 9 = 7 bits + 1 parity + 1 stop */ + +/* lib_setup.c */ +extern NCURSES_EXPORT(char *) _nc_get_locale(void); +extern NCURSES_EXPORT(int) _nc_unicode_locale(void); +extern NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL *); +extern NCURSES_EXPORT(int) _nc_setupterm(const char *, int, int *, int); +extern NCURSES_EXPORT(void) _nc_tinfo_cmdch(TERMINAL *, int); + +#ifdef USE_PTHREADS +extern NCURSES_EXPORT(SCREEN *) _nc_find_prescr(void); +extern NCURSES_EXPORT(void) _nc_forget_prescr(void); +#else +#define _nc_find_prescr() _nc_prescreen.allocated +#define _nc_forget_prescr() _nc_prescreen.allocated = 0 +#endif + +/* lib_set_term.c */ +extern NCURSES_EXPORT(int) _nc_ripoffline(int, int(*)(WINDOW*, int)); + +/* lib_setup.c */ +#define ExitTerminfo(code) exit_terminfo(code) + +#define SETUP_FAIL ERR + +#define ret_error(rc, fmt, p, q) if (errret) {\ + *errret = rc;\ + q;\ + returnCode(SETUP_FAIL);\ + } else {\ + fprintf(stderr, fmt, p);\ + q;\ + ExitTerminfo(EXIT_FAILURE);\ + } + +#define ret_error1(rc, fmt, p, q) ret_error(rc, "'%s': " fmt, p, q) + +#define ret_error0(rc, msg) if (errret) {\ + *errret = rc;\ + returnCode(SETUP_FAIL);\ + } else {\ + fprintf(stderr, msg);\ + ExitTerminfo(EXIT_FAILURE);\ + } + +/* lib_tstp.c */ +#if USE_SIGWINCH +extern NCURSES_EXPORT(int) _nc_handle_sigwinch(SCREEN *); +#else +#define _nc_handle_sigwinch(a) /* nothing */ +#endif + +/* lib_wacs.c */ +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(void) _nc_init_wacs(void); +#endif + +typedef struct { + char *s_head; /* beginning of the string (may be null) */ + char *s_tail; /* end of the string (may be null) */ + size_t s_size; /* current remaining size available */ + size_t s_init; /* total size available */ +} string_desc; + +/* strings.c */ +extern NCURSES_EXPORT(string_desc *) _nc_str_init (string_desc *, char *, size_t); +extern NCURSES_EXPORT(string_desc *) _nc_str_null (string_desc *, size_t); +extern NCURSES_EXPORT(string_desc *) _nc_str_copy (string_desc *, const string_desc *); +extern NCURSES_EXPORT(bool) _nc_safe_strcat (string_desc *, const char *); +extern NCURSES_EXPORT(bool) _nc_safe_strcpy (string_desc *, const char *); + +#if !HAVE_STRSTR +#define strstr _nc_strstr +extern NCURSES_EXPORT(char *) _nc_strstr (const char *, const char *); +#endif + +/* safe_sprintf.c */ +extern NCURSES_EXPORT(char *) _nc_printf_string (const char *, va_list); + +/* tries.c */ +extern NCURSES_EXPORT(int) _nc_add_to_try (TRIES **, const char *, unsigned); +extern NCURSES_EXPORT(char *) _nc_expand_try (TRIES *, unsigned, int *, size_t); +extern NCURSES_EXPORT(int) _nc_remove_key (TRIES **, unsigned); +extern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *); + +/* elsewhere ... */ +extern NCURSES_EXPORT(SCREEN *) _nc_screen_of (WINDOW *); +extern NCURSES_EXPORT(TERMINAL*) _nc_get_cur_term (void); +extern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int); +extern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t); +extern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *); +extern NCURSES_EXPORT(char *) _nc_tracechar (SCREEN *, int); +extern NCURSES_EXPORT(char *) _nc_tracemouse (SCREEN *, MEVENT const *); +extern NCURSES_EXPORT(char *) _nc_trace_mmask_t (SCREEN *, mmask_t); +extern NCURSES_EXPORT(int) _nc_access (const char *, int); +extern NCURSES_EXPORT(int) _nc_baudrate (int); +extern NCURSES_EXPORT(int) _nc_freewin (WINDOW *); +extern NCURSES_EXPORT(int) _nc_getenv_num (const char *); +extern NCURSES_EXPORT(int) _nc_keypad (SCREEN *, int); +extern NCURSES_EXPORT(int) _nc_ospeed (int); +extern NCURSES_EXPORT(int) _nc_outch (int); +extern NCURSES_EXPORT(int) _nc_putchar (int); +extern NCURSES_EXPORT(int) _nc_putp(const char *, const char *); +extern NCURSES_EXPORT(int) _nc_putp_flush(const char *, const char *); +extern NCURSES_EXPORT(int) _nc_read_termcap_entry (const char *const, TERMTYPE2 *const); +extern NCURSES_EXPORT(int) _nc_setup_tinfo(const char *, TERMTYPE2 *); +extern NCURSES_EXPORT(int) _nc_setupscreen (int, int, FILE *, int, int); +extern NCURSES_EXPORT(int) _nc_timed_wait (const SCREEN *, int, int, int * EVENTLIST_2nd(_nc_eventlist *)); +extern NCURSES_EXPORT(int) _nc_trans_string (char *, const char *); +extern NCURSES_EXPORT(void) _nc_init_termtype (TERMTYPE2 *const); +extern NCURSES_EXPORT(void) _nc_do_color (int, int, int, NCURSES_OUTC); +extern NCURSES_EXPORT(void) _nc_flush (void); +extern NCURSES_EXPORT(void) _nc_free_entry (ENTRY *, const TERMTYPE2 *); +extern NCURSES_EXPORT(void) _nc_freeall (void); +extern NCURSES_EXPORT(void) _nc_hash_map (void); +extern NCURSES_EXPORT(void) _nc_init_keytry (SCREEN *); +extern NCURSES_EXPORT(void) _nc_keep_tic_dir (const char *); +extern NCURSES_EXPORT(void) _nc_make_oldhash (int i); +extern NCURSES_EXPORT(void) _nc_reset_input (FILE *, char *); +extern NCURSES_EXPORT(void) _nc_scroll_oldhash (int n, int top, int bot); +extern NCURSES_EXPORT(void) _nc_scroll_optimize (void); +extern NCURSES_EXPORT(void) _nc_set_buffer (FILE *, int); +extern NCURSES_EXPORT(void) _nc_setenv_num (const char *, int); +extern NCURSES_EXPORT(void) _nc_signal_handler (int); +extern NCURSES_EXPORT(void) _nc_synchook (WINDOW *); +extern NCURSES_EXPORT(void) _nc_trace_tries (TRIES *); + +#if NCURSES_EXT_NUMBERS +extern NCURSES_EXPORT(const TERMTYPE2 *) _nc_fallback2 (const char *); +#else +#define _nc_fallback2(tp) _nc_fallback(tp) +#endif + +extern NCURSES_EXPORT(void) _nc_copy_termtype(TERMTYPE *, const TERMTYPE *); + +#if NCURSES_EXT_NUMBERS +extern NCURSES_EXPORT(void) _nc_copy_termtype2 (TERMTYPE2 *, const TERMTYPE2 *); +extern NCURSES_EXPORT(void) _nc_export_termtype2(TERMTYPE *, const TERMTYPE2 *); +#else +#define _nc_copy_termtype2(dst,src) _nc_copy_termtype((dst),(src)) +#define _nc_export_termtype2(dst,src) /* nothing */ +#define _nc_free_termtype2(t) _nc_free_termtype(t) +/* also... */ +#define _nc_read_entry2 _nc_read_entry +#endif + +#if NO_LEAKS +extern NCURSES_EXPORT(void) _nc_alloc_entry_leaks(void); +extern NCURSES_EXPORT(void) _nc_captoinfo_leaks(void); +extern NCURSES_EXPORT(void) _nc_codes_leaks(void); +extern NCURSES_EXPORT(void) _nc_comp_captab_leaks(void); +extern NCURSES_EXPORT(void) _nc_comp_error_leaks(void); +extern NCURSES_EXPORT(void) _nc_comp_scan_leaks(void); +extern NCURSES_EXPORT(void) _nc_comp_userdefs_leaks(void); +extern NCURSES_EXPORT(void) _nc_db_iterator_leaks(void); +extern NCURSES_EXPORT(void) _nc_keyname_leaks(void); +extern NCURSES_EXPORT(void) _nc_names_leaks(void); +extern NCURSES_EXPORT(void) _nc_tgetent_leak(const TERMINAL *); +extern NCURSES_EXPORT(void) _nc_tgetent_leaks(void); +#endif + +#if !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) +extern NCURSES_EXPORT(NCURSES_CH_T) _nc_render (WINDOW *, NCURSES_CH_T); +extern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T); +extern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, int const, int const, NCURSES_CH_T); +#endif + +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(int) _nc_insert_wch(WINDOW *, const cchar_t *); +#endif + +#if USE_WIDEC_SUPPORT && !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) +extern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *); +#endif + +#if USE_SIZECHANGE +extern NCURSES_EXPORT(void) _nc_update_screensize (SCREEN *); +#endif + +#if HAVE_RESIZETERM +extern NCURSES_EXPORT(void) _nc_resize_margins (WINDOW *); +#else +#define _nc_resize_margins(wp) /* nothing */ +#endif + +#ifdef NCURSES_WGETCH_EVENTS +extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *); +#else +#define wgetch_events(win, evl) wgetch(win) +#define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen) +#endif + +/* + * Wide-character macros to hide some platform-differences. + */ +#if USE_WIDEC_SUPPORT + +#if defined(_NC_WINDOWS_NATIVE) && !defined(_NC_MSC) && !defined(EXP_WIN32_DRIVER) +/* + * MinGW has wide-character functions, but they do not work correctly. + */ +extern int __MINGW_NOTHROW _nc_wctomb(char *, wchar_t); +#define wctomb(s,wc) _nc_wctomb(s,wc) +#define wcrtomb(s,wc,n) _nc_wctomb(s,wc) + +extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *, const char *, size_t); +#define mbtowc(pwc,s,n) _nc_mbtowc(pwc,s,n) + +extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t); +#define mblen(s,n) _nc_mblen(s, n) + +#endif /* _NC_WINDOWS_NATIVE && !_NC_MSC */ + +#if defined(_NC_WINDOWS_NATIVE) || defined(_NC_MINGW) +/* see wcwidth.c */ +extern NCURSES_EXPORT(int) mk_wcwidth(uint32_t); +#define wcwidth(ucs) _nc_wcwidth(ucs) +#endif + +#if HAVE_MBTOWC && HAVE_MBLEN +#define reset_mbytes(state) IGNORE_RC(mblen(NULL, (size_t) 0)), IGNORE_RC(mbtowc(NULL, NULL, (size_t) 0)) +#define count_mbytes(buffer,length,state) mblen(buffer,length) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbtowc(&(wch), buffer, length) +#define state_unused +#elif HAVE_MBRTOWC && HAVE_MBRLEN +#define reset_mbytes(state) init_mb(state) +#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&(state)) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbrtowc(&(wch), buffer, length, &(state)) +#else +make an error +#endif + +#endif /* USE_WIDEC_SUPPORT */ + +/* + * Not everyone has vsscanf(), but we'd like to use it for scanw(). + */ +#if !HAVE_VSSCANF +extern int vsscanf(const char *str, const char *format, va_list __arg); +#endif + +/* scroll indices */ +extern NCURSES_EXPORT_VAR(int *) _nc_oldnums; + +#define USE_SETBUF_0 0 + +#define NC_OUTPUT(sp) ((sp != 0 && sp->_ofp != 0) ? sp->_ofp : stdout) + +/* + * On systems with a broken linker, define 'SP' as a function to force the + * linker to pull in the data-only module with 'SP'. + */ +#define _nc_alloc_screen_sp() typeCalloc(SCREEN, 1) + +#if BROKEN_LINKER +#define SP _nc_screen() +extern NCURSES_EXPORT(SCREEN *) _nc_screen (void); +extern NCURSES_EXPORT(int) _nc_alloc_screen (void); +extern NCURSES_EXPORT(void) _nc_set_screen (SCREEN *); +#define CURRENT_SCREEN _nc_screen() +#else +/* current screen is private data; avoid possible linking conflicts too */ +extern NCURSES_EXPORT_VAR(SCREEN *) SP; +#define CURRENT_SCREEN SP +#define _nc_alloc_screen() ((SP = _nc_alloc_screen_sp()) != 0) +#define _nc_set_screen(sp) SP = sp +#endif + +#if NCURSES_SP_FUNCS +#define CURRENT_SCREEN_PRE (IsPreScreen(CURRENT_SCREEN) ? CURRENT_SCREEN : new_prescr()) +#else +#define CURRENT_SCREEN_PRE CURRENT_SCREEN +#endif + +/* + * We don't want to use the lines or columns capabilities internally, because + * if the application is running multiple screens under X, it is quite possible + * they could all have type xterm but have different sizes! So... + */ +#define screen_lines(sp) (sp)->_lines +#define screen_columns(sp) (sp)->_columns + +extern NCURSES_EXPORT(int) _nc_slk_initialize (WINDOW *, int); +extern NCURSES_EXPORT(int) _nc_format_slks (NCURSES_SP_DCLx int _c); + +/* + * Some constants related to SLK's + */ +#define MAX_SKEY_OLD 8 /* count of soft keys */ +#define MAX_SKEY_LEN_OLD 8 /* max length of soft key text */ +#define MAX_SKEY_PC 12 /* This is what most PC's have */ +#define MAX_SKEY_LEN_PC 5 + +/* Macro to check whether or not we use a standard format */ +#define SLK_STDFMT(fmt) (fmt < 3) +/* Macro to determine height of label window */ +#define SLK_LINES(fmt) (SLK_STDFMT(fmt) ? 1 : ((fmt) - 2)) + +#define MAX_SKEY(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_OLD : MAX_SKEY_PC) +#define MAX_SKEY_LEN(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_LEN_OLD : MAX_SKEY_LEN_PC) + +/* + * Common error messages + */ +#define MSG_NO_MEMORY "Out of memory" +#define MSG_NO_INPUTS "Premature EOF" + +extern NCURSES_EXPORT(int) _nc_set_tty_mode(TTY *); +extern NCURSES_EXPORT(int) _nc_get_tty_mode(TTY *); + +/* timed_wait flag definitions */ +#define TW_NONE 0 +#define TW_INPUT 1 +#define TW_MOUSE 2 +#define TW_ANY (TW_INPUT | TW_MOUSE) +#define TW_EVENT 4 + +#define SetSafeOutcWrapper(outc) \ + SCREEN* sp = CURRENT_SCREEN; \ + struct screen outc_wrapper; \ + if (sp==0) { \ + sp = &outc_wrapper; \ + memset(sp,0,sizeof(struct screen)); \ + sp->_outch = _nc_outc_wrapper; \ + }\ + sp->jump = outc + +#ifdef USE_TERM_DRIVER + +typedef struct _termInfo +{ + bool caninit; + + bool hascolor; + bool initcolor; + bool canchange; + + int tabsize; + + int maxcolors; + int maxpairs; + int nocolorvideo; + + int numbuttons; + int numlabels; + int labelwidth; + int labelheight; + + const color_t* defaultPalette; +} TerminalInfo; + +typedef struct term_driver { + bool isTerminfo; + const char* (*td_name)(struct DriverTCB*); + bool (*td_CanHandle)(struct DriverTCB*, const char*, int*); + void (*td_init)(struct DriverTCB*); + void (*td_release)(struct DriverTCB*); + int (*td_size)(struct DriverTCB*, int* Line, int *Cols); + int (*td_sgmode)(struct DriverTCB*, int setFlag, TTY*); + chtype (*td_conattr)(struct DriverTCB*); + int (*td_hwcur)(struct DriverTCB*, int yold, int xold, int y, int x); + int (*td_mode)(struct DriverTCB*, int progFlag, int defFlag); + bool (*td_rescol)(struct DriverTCB*); + bool (*td_rescolors)(struct DriverTCB*); + void (*td_color)(struct DriverTCB*, int fore, int color, int(*)(SCREEN*, int)); + int (*td_doBeepOrFlash)(struct DriverTCB*, int); + void (*td_initpair)(struct DriverTCB*, int, int, int); + void (*td_initcolor)(struct DriverTCB*, int, int, int, int); + void (*td_docolor)(struct DriverTCB*, int, int, int, int(*)(SCREEN*, int)); + void (*td_initmouse)(struct DriverTCB*); + int (*td_testmouse)(struct DriverTCB*, int EVENTLIST_2nd(_nc_eventlist*)); + void (*td_setfilter)(struct DriverTCB*); + void (*td_hwlabel)(struct DriverTCB*, int, char*); + void (*td_hwlabelOnOff)(struct DriverTCB*, int); + int (*td_update)(struct DriverTCB*); + int (*td_defaultcolors)(struct DriverTCB*, int, int); + int (*td_print)(struct DriverTCB*, char*, int); + int (*td_getsize)(struct DriverTCB*, int*, int*); + int (*td_setsize)(struct DriverTCB*, int, int); + void (*td_initacs)(struct DriverTCB*, chtype*, chtype*); + void (*td_scinit)(SCREEN *); + void (*td_scexit)(SCREEN *); + int (*td_twait)(struct DriverTCB*, int, int, int* EVENTLIST_2nd(_nc_eventlist*)); + int (*td_read)(struct DriverTCB*, int*); + int (*td_nap)(struct DriverTCB*, int); + int (*td_kpad)(struct DriverTCB*, int); + int (*td_kyOk)(struct DriverTCB*, int, int); + bool (*td_kyExist)(struct DriverTCB*, int); + int (*td_cursorSet)(struct DriverTCB*, int); +} TERM_DRIVER; + +typedef struct DriverTCB +{ + TERMINAL term; /* needs to be the first Element !!! */ + TERM_DRIVER* drv; /* The driver for that Terminal */ + SCREEN* csp; /* The screen that owns that Terminal */ + TerminalInfo info; /* Driver independent core capabilities of the Terminal */ + void* prop; /* Driver dependent property storage to be used by the Driver */ + long magic; +} TERMINAL_CONTROL_BLOCK; + +#define NCDRV_MAGIC(id) (0x47110000 | (id&0xffff)) +#define NCDRV_TINFO 0x01 +#define NCDRV_WINCONSOLE 0x02 + +#define TCBOf(sp) ((TERMINAL_CONTROL_BLOCK*)(TerminalOf(sp))) +#define InfoOf(sp) TCBOf(sp)->info +#define CallDriver(sp,method) TCBOf(sp)->drv->method(TCBOf(sp)) +#define CallDriver_1(sp,method,arg1) TCBOf(sp)->drv->method(TCBOf(sp),arg1) +#define CallDriver_2(sp,method,arg1,arg2) TCBOf(sp)->drv->method(TCBOf(sp),arg1,arg2) +#define CallDriver_3(sp,method,arg1,arg2,arg3) TCBOf(sp)->drv->method(TCBOf(sp),arg1,arg2,arg3) +#define CallDriver_4(sp,method,arg1,arg2,arg3,arg4) TCBOf(sp)->drv->method(TCBOf(sp),arg1,arg2,arg3,arg4) + +extern NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette; +extern NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette; + +extern NCURSES_EXPORT(int) _nc_get_driver(TERMINAL_CONTROL_BLOCK*, const char*, int*); +extern NCURSES_EXPORT(void) _nc_get_screensize_ex(SCREEN *, TERMINAL *, int *, int *); +#endif /* USE_TERM_DRIVER */ + +/* + * Entrypoints which are actually provided in the terminal driver, which would + * be an sp-name otherwise. + */ +#ifdef USE_TERM_DRIVER +#define TINFO_HAS_KEY _nc_tinfo_has_key +#define TINFO_DOUPDATE _nc_tinfo_doupdate +#define TINFO_MVCUR _nc_tinfo_mvcur +extern NCURSES_EXPORT(int) TINFO_HAS_KEY(SCREEN*, int); +extern NCURSES_EXPORT(int) TINFO_DOUPDATE(SCREEN *); +extern NCURSES_EXPORT(int) TINFO_MVCUR(SCREEN*, int, int, int, int); +#else +#define TINFO_HAS_KEY NCURSES_SP_NAME(has_key) +#define TINFO_DOUPDATE NCURSES_SP_NAME(doupdate) +#define TINFO_MVCUR NCURSES_SP_NAME(_nc_mvcur) +#endif + +#if defined(EXP_WIN32_DRIVER) +#include +#endif + +/* + * Entrypoints using an extra parameter with the terminal driver. + */ +#ifdef USE_TERM_DRIVER +extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, TERMINAL *, int *, int *); +extern NCURSES_EXPORT(int) _nc_setupterm_ex(TERMINAL **, const char *, int , int *, int); +#define TINFO_GET_SIZE(sp, tp, lp, cp) \ + _nc_get_screensize(sp, tp, lp, cp) +#define TINFO_SET_CURTERM(sp, tp) \ + NCURSES_SP_NAME(set_curterm)(sp, tp) +#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \ + _nc_setupterm_ex(tpp, name, fd, err, reuse) +#else /* !USE_TERM_DRIVER */ +extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, int *, int *); +#define TINFO_GET_SIZE(sp, tp, lp, cp) \ + _nc_get_screensize(sp, lp, cp) +#define TINFO_SET_CURTERM(sp, tp) \ + set_curterm(tp) +#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \ + _nc_setupterm(name, fd, err, reuse) +#endif /* !USE_TERM_DRIVER */ + +#ifdef EXP_WIN32_DRIVER +extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER; +#else +#ifdef USE_TERM_DRIVER +#if defined(USE_WIN32CON_DRIVER) +#include +extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER; +extern NCURSES_EXPORT(int) _nc_mingw_isatty(int fd); +extern NCURSES_EXPORT(int) _nc_mingw_isconsole(int fd); +extern NCURSES_EXPORT(int) _nc_mingw_console_read( + SCREEN *sp, + HANDLE fd, + int *buf); +extern NCURSES_EXPORT(int) _nc_mingw_testmouse( + SCREEN * sp, + HANDLE fd, + int delay EVENTLIST_2nd(_nc_eventlist*)); +#else +#endif +extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER; +#endif /* USE_TERM_DRIVER */ +#endif /* EXP_WIN32_DRIVER */ + +#if defined(USE_TERM_DRIVER) && defined(EXP_WIN32_DRIVER) +#define NC_ISATTY(fd) (0 != _nc_console_isatty(fd)) +#elif defined(USE_TERM_DRIVER) && defined(USE_WIN32CON_DRIVER) +#define NC_ISATTY(fd) _nc_mingw_isatty(fd) +#else +#define NC_ISATTY(fd) isatty(fd) +#endif + +/* + * Perhaps not "real" but possibly not "fake". + */ +#define IsRealTty(fd,value) \ + (NC_ISATTY(fd) \ + && (value = ttyname(fd)) != NULL \ + && strncmp(value, "/dev/pts/", 9)) + +#ifdef USE_TERM_DRIVER +# define IsTermInfo(sp) ((TCBOf(sp) != 0) && ((TCBOf(sp)->drv->isTerminfo))) +# define HasTInfoTerminal(sp) ((0 != TerminalOf(sp)) && IsTermInfo(sp)) +# if defined(EXP_WIN32_DRIVER) +# define IsTermInfoOnConsole(sp) (IsTermInfo(sp) && _nc_console_test(TerminalOf(sp)->Filedes)) +# elif defined(USE_WIN32CON_DRIVER) +# define IsTermInfoOnConsole(sp) (IsTermInfo(sp) && _nc_mingw_isconsole(TerminalOf(sp)->Filedes)) +# else +# define IsTermInfoOnConsole(sp) FALSE +# endif +#else +# define IsTermInfo(sp) TRUE +# define HasTInfoTerminal(sp) (0 != TerminalOf(sp)) +# if defined(EXP_WIN32_DRIVER) +# define IsTermInfoOnConsole(sp) _nc_console_test(TerminalOf(sp)->Filedes) +# else +# define IsTermInfoOnConsole(sp) FALSE +# endif +#endif + +#define IsValidTIScreen(sp) (HasTInfoTerminal(sp)) + +/* + * Exported entrypoints beyond the published API + */ +#if NCURSES_SP_FUNCS +extern NCURSES_EXPORT(WINDOW *) _nc_curscr_of(SCREEN*); +extern NCURSES_EXPORT(WINDOW *) _nc_newscr_of(SCREEN*); +extern NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN*); +extern NCURSES_EXPORT(int) _nc_outc_wrapper(SCREEN*,int); + +#if USE_REENTRANT +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_TABSIZE)(SCREEN*); +extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(longname)(SCREEN*); +#endif + +#if NCURSES_EXT_FUNCS +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_set_tabsize)(SCREEN*, int); +#endif + +/* + * We put the safe versions of various calls here as they are not published + * part of the API up to now + */ +extern NCURSES_EXPORT(TERMINAL*) NCURSES_SP_NAME(_nc_get_cur_term) (SCREEN *sp); +extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(_nc_makenew) (SCREEN*, int, int, int, int, int); +extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(_nc_reset_colors)(SCREEN*); +extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(_nc_printf_string)(SCREEN*, const char *, va_list); +extern NCURSES_EXPORT(chtype) NCURSES_SP_NAME(_nc_acs_char)(SCREEN*,int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_get_tty_mode)(SCREEN*,TTY*); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_mcprint)(SCREEN*,char*, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_msec_cost)(SCREEN*, const char *, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_mvcur)(SCREEN*, int, int, int, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_outch)(SCREEN*, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_putchar)(SCREEN*, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_putp)(SCREEN*, const char *, const char*); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_putp_flush)(SCREEN*, const char *, const char *); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_ripoffline)(SCREEN*, int, int (*)(WINDOW *,int)); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_scrolln)(SCREEN*, int, int, int, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_set_tty_mode)(SCREEN*, TTY*); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_setupscreen)(SCREEN**, int, int, FILE *, int, int); +extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_tgetent)(SCREEN*,char*,const char *); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_do_color)(SCREEN*, int, int, int, NCURSES_SP_OUTC); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_do_xmc_glitch)(SCREEN*, attr_t); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_flush)(SCREEN*); +extern GCC_NORETURN NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_free_and_exit)(SCREEN*, int); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_freeall)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_hash_map)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_init_acs)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_make_oldhash)(SCREEN*, int i); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_mvcur_init)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_mvcur_resume)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_mvcur_wrap)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_screen_init)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_screen_resume)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_screen_wrap)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_scroll_oldhash)(SCREEN*, int n, int top, int bot); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_scroll_optimize)(SCREEN*); +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_set_buffer)(SCREEN*, FILE *, int); + +extern NCURSES_EXPORT(void) _nc_cookie_init(SCREEN *sp); + +#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG) +extern NCURSES_EXPORT(void) NCURSES_SP_NAME(_nc_linedump)(SCREEN*); +#endif + +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(wchar_t *) NCURSES_SP_NAME(_nc_wunctrl)(SCREEN*, cchar_t *); +#endif + +#endif /* NCURSES_SP_FUNCS */ + +#if NCURSES_SP_FUNCS + +#define safe_keyname NCURSES_SP_NAME(keyname) +#define safe_unctrl NCURSES_SP_NAME(unctrl) +#define safe_ungetch NCURSES_SP_NAME(ungetch) + +#else + +#define safe_keyname _nc_keyname +#define safe_unctrl _nc_unctrl +#define safe_ungetch _nc_ungetch + +extern NCURSES_EXPORT(NCURSES_CONST char *) _nc_keyname (SCREEN *, int); +extern NCURSES_EXPORT(int) _nc_ungetch (SCREEN *, int); +extern NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *, chtype); + +#endif + +#ifdef EXP_XTERM_1005 +extern NCURSES_EXPORT(int) _nc_conv_to_utf8(unsigned char *, unsigned, unsigned); +extern NCURSES_EXPORT(int) _nc_conv_to_utf32(unsigned *, const char *, unsigned); +#endif + +#ifdef __cplusplus +} +#endif + +/* *INDENT-ON* */ + +#endif /* CURSES_PRIV_H */ diff --git a/contrib/ncurses/ncurses/fifo_defs.h b/contrib/ncurses/ncurses/fifo_defs.h new file mode 100644 index 00000000..ab9266d6 --- /dev/null +++ b/contrib/ncurses/ncurses/fifo_defs.h @@ -0,0 +1,86 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* + * Common macros for lib_getch.c, lib_ungetch.c + * + * $Id: fifo_defs.h,v 1.9 2020/02/02 23:34:34 tom Exp $ + */ + +#ifndef FIFO_DEFS_H +#define FIFO_DEFS_H 1 + +#define head sp->_fifohead +#define tail sp->_fifotail +/* peek points to next uninterpreted character */ +#define peek sp->_fifopeek + +#define h_inc() { \ + (head >= FIFO_SIZE-1) \ + ? head = 0 \ + : head++; \ + if (head == tail) \ + head = -1, tail = 0; \ + } +#define h_dec() { \ + (head <= 0) \ + ? head = FIFO_SIZE-1 \ + : head--; \ + if (head == tail) \ + tail = -1; \ + } +#define t_inc() { \ + (tail >= FIFO_SIZE-1) \ + ? tail = 0 \ + : tail++; \ + if (tail == head) \ + tail = -1; \ + } +#define t_dec() { \ + (tail <= 0) \ + ? tail = FIFO_SIZE-1 \ + : tail--; \ + if (head == tail) \ + fifo_clear(sp); \ + } +#define p_inc() { \ + (peek >= FIFO_SIZE-1) \ + ? peek = 0 \ + : peek++; \ + } + +#define cooked_key_in_fifo() ((head >= 0) && (peek != head)) +#define raw_key_in_fifo() ((head >= 0) && (peek != tail)) + +#endif /* FIFO_DEFS_H */ diff --git a/contrib/ncurses/ncurses/llib-lncurses b/contrib/ncurses/ncurses/llib-lncurses new file mode 100644 index 00000000..5069c222 --- /dev/null +++ b/contrib/ncurses/ncurses/llib-lncurses @@ -0,0 +1,4506 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tty/hardscroll.c */ + +#include + +#undef _nc_oldnums +int *_nc_oldnums; + +#undef _nc_scroll_optimize_sp +void _nc_scroll_optimize_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_scroll_optimize +void _nc_scroll_optimize(void) + { /* void */ } + +#undef _nc_linedump_sp +void _nc_linedump_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_linedump +void _nc_linedump(void) + { /* void */ } + +/* ./tty/hashmap.c */ + +#undef _nc_hash_map_sp +void _nc_hash_map_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_hash_map +void _nc_hash_map(void) + { /* void */ } + +#undef _nc_make_oldhash_sp +void _nc_make_oldhash_sp( + SCREEN *sp, + int i) + { /* void */ } + +#undef _nc_make_oldhash +void _nc_make_oldhash( + int i) + { /* void */ } + +#undef _nc_scroll_oldhash_sp +void _nc_scroll_oldhash_sp( + SCREEN *sp, + int n, + int top, + int bot) + { /* void */ } + +#undef _nc_scroll_oldhash +void _nc_scroll_oldhash( + int n, + int top, + int bot) + { /* void */ } + +/* ./base/lib_addch.c */ + +#undef _nc_render +chtype _nc_render( + WINDOW *win, + chtype ch) + { return(*(chtype *)0); } + +#undef _nc_waddch_nosync +int _nc_waddch_nosync( + WINDOW *win, + const chtype c) + { return(*(int *)0); } + +#undef waddch +int waddch( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +#undef wechochar +int wechochar( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_addstr.c */ + +#undef waddnstr +int waddnstr( + WINDOW *win, + const char *astr, + int n) + { return(*(int *)0); } + +#undef waddchnstr +int waddchnstr( + WINDOW *win, + const chtype *astr, + int n) + { return(*(int *)0); } + +/* ./base/lib_beep.c */ + +#undef beep_sp +int beep_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef beep +int beep(void) + { return(*(int *)0); } + +/* ./base/lib_bkgd.c */ + +#undef wbkgdset +void wbkgdset( + WINDOW *win, + chtype ch) + { /* void */ } + +#undef wbkgd +int wbkgd( + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +/* ./base/lib_box.c */ + +#undef wborder +int wborder( + WINDOW *win, + chtype ls, + chtype rs, + chtype ts, + chtype bs, + chtype tl, + chtype tr, + chtype bl, + chtype br) + { return(*(int *)0); } + +/* ./base/lib_chgat.c */ + +#undef wchgat +int wchgat( + WINDOW *win, + int n, + attr_t attr, + short pair_arg, + const void *opts) + { return(*(int *)0); } + +/* ./base/lib_clear.c */ + +#undef wclear +int wclear( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clearok.c */ + +#undef clearok +int clearok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_clrbot.c */ + +#undef wclrtobot +int wclrtobot( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clreol.c */ + +#undef wclrtoeol +int wclrtoeol( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_color.c */ + +#undef COLOR_PAIRS +int COLOR_PAIRS; +#undef COLORS +int COLORS; + +#undef _nc_reset_colors_sp +NCURSES_BOOL _nc_reset_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_reset_colors +NCURSES_BOOL _nc_reset_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef start_color_sp +int start_color_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef start_color +int start_color(void) + { return(*(int *)0); } + +#undef _nc_change_pair +void _nc_change_pair( + SCREEN *sp, + int pair) + { /* void */ } + +#undef _nc_reserve_pairs +void _nc_reserve_pairs( + SCREEN *sp, + int want) + { /* void */ } + +#undef _nc_init_pair +int _nc_init_pair( + SCREEN *sp, + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_pair_sp +int init_pair_sp( + SCREEN *sp, + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef init_pair +int init_pair( + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef _nc_init_color +int _nc_init_color( + SCREEN *sp, + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef init_color_sp +int init_color_sp( + SCREEN *sp, + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef init_color +int init_color( + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef can_change_color_sp +NCURSES_BOOL can_change_color_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef can_change_color +NCURSES_BOOL can_change_color(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors_sp +NCURSES_BOOL has_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors +NCURSES_BOOL has_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef color_content_sp +int color_content_sp( + SCREEN *sp, + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef color_content +int color_content( + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef _nc_pair_content +int _nc_pair_content( + SCREEN *sp, + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef pair_content_sp +int pair_content_sp( + SCREEN *sp, + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef pair_content +int pair_content( + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef _nc_do_color_sp +void _nc_do_color_sp( + SCREEN *sp, + int old_pair, + int pair, + int reverse, + NCURSES_OUTC_sp outc) + { /* void */ } + +#undef _nc_do_color +void _nc_do_color( + int old_pair, + int pair, + int reverse, + NCURSES_OUTC outc) + { /* void */ } + +/* ./base/lib_colorset.c */ + +#undef wcolor_set +int wcolor_set( + WINDOW *win, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_delch.c */ + +#undef wdelch +int wdelch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_delwin.c */ + +#undef delwin +int delwin( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_echo.c */ + +#undef echo_sp +int echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef echo +int echo(void) + { return(*(int *)0); } + +#undef noecho_sp +int noecho_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noecho +int noecho(void) + { return(*(int *)0); } + +/* ./base/lib_endwin.c */ + +#undef endwin_sp +int endwin_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef endwin +int endwin(void) + { return(*(int *)0); } + +/* ./base/lib_erase.c */ + +#undef werase +int werase( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_flash.c */ + +#undef flash_sp +int flash_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flash +int flash(void) + { return(*(int *)0); } + +/* ./lib_gen.c */ + +#undef addch +int addch( + const chtype z) + { return(*(int *)0); } + +#undef addchnstr +int addchnstr( + const chtype *a1, + int z) + { return(*(int *)0); } + +#undef addchstr +int addchstr( + const chtype *z) + { return(*(int *)0); } + +#undef addnstr +int addnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef addstr +int addstr( + const char *z) + { return(*(int *)0); } + +#undef attroff +int attroff( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attron +int attron( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attrset +int attrset( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attr_get +int attr_get( + attr_t *a1, + short *a2, + void *z) + { return(*(int *)0); } + +#undef attr_off +int attr_off( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_on +int attr_on( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_set +int attr_set( + attr_t a1, + short a2, + void *z) + { return(*(int *)0); } + +#undef bkgd +int bkgd( + chtype z) + { return(*(int *)0); } + +#undef bkgdset +void bkgdset( + chtype z) + { /* void */ } + +#undef border +int border( + chtype a1, + chtype a2, + chtype a3, + chtype a4, + chtype a5, + chtype a6, + chtype a7, + chtype z) + { return(*(int *)0); } + +#undef box +int box( + WINDOW *a1, + chtype a2, + chtype z) + { return(*(int *)0); } + +#undef chgat +int chgat( + int a1, + attr_t a2, + short a3, + const void *z) + { return(*(int *)0); } + +#undef clear +int clear(void) + { return(*(int *)0); } + +#undef clrtobot +int clrtobot(void) + { return(*(int *)0); } + +#undef clrtoeol +int clrtoeol(void) + { return(*(int *)0); } + +#undef color_set +int color_set( + short a1, + void *z) + { return(*(int *)0); } + +#undef COLOR_PAIR +int COLOR_PAIR( + int z) + { return(*(int *)0); } + +#undef delch +int delch(void) + { return(*(int *)0); } + +#undef deleteln +int deleteln(void) + { return(*(int *)0); } + +#undef echochar +int echochar( + const chtype z) + { return(*(int *)0); } + +#undef erase +int erase(void) + { return(*(int *)0); } + +#undef getbkgd +chtype getbkgd( + WINDOW *z) + { return(*(chtype *)0); } + +#undef getch +int getch(void) + { return(*(int *)0); } + +#undef getnstr +int getnstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef getstr +int getstr( + char *z) + { return(*(int *)0); } + +#undef hline +int hline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef inch +chtype inch(void) + { return(*(chtype *)0); } + +#undef inchnstr +int inchnstr( + chtype *a1, + int z) + { return(*(int *)0); } + +#undef inchstr +int inchstr( + chtype *z) + { return(*(int *)0); } + +#undef innstr +int innstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef insch +int insch( + chtype z) + { return(*(int *)0); } + +#undef insdelln +int insdelln( + int z) + { return(*(int *)0); } + +#undef insertln +int insertln(void) + { return(*(int *)0); } + +#undef insnstr +int insnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef insstr +int insstr( + const char *z) + { return(*(int *)0); } + +#undef instr +int instr( + char *z) + { return(*(int *)0); } + +#undef move +int move( + int a1, + int z) + { return(*(int *)0); } + +#undef mvaddch +int mvaddch( + int a1, + int a2, + const chtype z) + { return(*(int *)0); } + +#undef mvaddchnstr +int mvaddchnstr( + int a1, + int a2, + const chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvaddchstr +int mvaddchstr( + int a1, + int a2, + const chtype *z) + { return(*(int *)0); } + +#undef mvaddnstr +int mvaddnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvaddstr +int mvaddstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvchgat +int mvchgat( + int a1, + int a2, + int a3, + attr_t a4, + short a5, + const void *z) + { return(*(int *)0); } + +#undef mvdelch +int mvdelch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetch +int mvgetch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetnstr +int mvgetnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvgetstr +int mvgetstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvhline +int mvhline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvinch +chtype mvinch( + int a1, + int z) + { return(*(chtype *)0); } + +#undef mvinchnstr +int mvinchnstr( + int a1, + int a2, + chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvinchstr +int mvinchstr( + int a1, + int a2, + chtype *z) + { return(*(int *)0); } + +#undef mvinnstr +int mvinnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsch +int mvinsch( + int a1, + int a2, + chtype z) + { return(*(int *)0); } + +#undef mvinsnstr +int mvinsnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsstr +int mvinsstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvinstr +int mvinstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvvline +int mvvline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvwaddch +int mvwaddch( + WINDOW *a1, + int a2, + int a3, + const chtype z) + { return(*(int *)0); } + +#undef mvwaddchnstr +int mvwaddchnstr( + WINDOW *a1, + int a2, + int a3, + const chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddchstr +int mvwaddchstr( + WINDOW *a1, + int a2, + int a3, + const chtype *z) + { return(*(int *)0); } + +#undef mvwaddnstr +int mvwaddnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddstr +int mvwaddstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwchgat +int mvwchgat( + WINDOW *a1, + int a2, + int a3, + int a4, + attr_t a5, + short a6, + const void *z) + { return(*(int *)0); } + +#undef mvwdelch +int mvwdelch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetch +int mvwgetch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetnstr +int mvwgetnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwgetstr +int mvwgetstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwhline +int mvwhline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef mvwinch +chtype mvwinch( + WINDOW *a1, + int a2, + int z) + { return(*(chtype *)0); } + +#undef mvwinchnstr +int mvwinchnstr( + WINDOW *a1, + int a2, + int a3, + chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwinchstr +int mvwinchstr( + WINDOW *a1, + int a2, + int a3, + chtype *z) + { return(*(int *)0); } + +#undef mvwinnstr +int mvwinnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsch +int mvwinsch( + WINDOW *a1, + int a2, + int a3, + chtype z) + { return(*(int *)0); } + +#undef mvwinsnstr +int mvwinsnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsstr +int mvwinsstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwinstr +int mvwinstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwvline +int mvwvline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef PAIR_NUMBER +int PAIR_NUMBER( + int z) + { return(*(int *)0); } + +#undef redrawwin +int redrawwin( + WINDOW *z) + { return(*(int *)0); } + +#undef refresh +int refresh(void) + { return(*(int *)0); } + +#undef scrl +int scrl( + int z) + { return(*(int *)0); } + +#undef scroll +int scroll( + WINDOW *z) + { return(*(int *)0); } + +#undef setscrreg +int setscrreg( + int a1, + int z) + { return(*(int *)0); } + +#undef standout +int standout(void) + { return(*(int *)0); } + +#undef standend +int standend(void) + { return(*(int *)0); } + +#undef timeout +void timeout( + int z) + { /* void */ } + +#undef touchline +int touchline( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef touchwin +int touchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef untouchwin +int untouchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef vline +int vline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef waddchstr +int waddchstr( + WINDOW *a1, + const chtype *z) + { return(*(int *)0); } + +#undef waddstr +int waddstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef wattron +int wattron( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattroff +int wattroff( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattrset +int wattrset( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattr_get +int wattr_get( + WINDOW *a1, + attr_t *a2, + short *a3, + void *z) + { return(*(int *)0); } + +#undef wattr_set +int wattr_set( + WINDOW *a1, + attr_t a2, + short a3, + void *z) + { return(*(int *)0); } + +#undef wdeleteln +int wdeleteln( + WINDOW *z) + { return(*(int *)0); } + +#undef wgetstr +int wgetstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef winchstr +int winchstr( + WINDOW *a1, + chtype *z) + { return(*(int *)0); } + +#undef winsertln +int winsertln( + WINDOW *z) + { return(*(int *)0); } + +#undef winsstr +int winsstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef winstr +int winstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef wstandout +int wstandout( + WINDOW *z) + { return(*(int *)0); } + +#undef wstandend +int wstandend( + WINDOW *z) + { return(*(int *)0); } + +#undef getattrs +int getattrs( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcurx +int getcurx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcury +int getcury( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegx +int getbegx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegy +int getbegy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxx +int getmaxx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxy +int getmaxy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getparx +int getparx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getpary +int getpary( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetparent +WINDOW *wgetparent( + const WINDOW *z) + { return(*(WINDOW **)0); } + +#undef is_cleared +NCURSES_BOOL is_cleared( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idcok +NCURSES_BOOL is_idcok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idlok +NCURSES_BOOL is_idlok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_immedok +NCURSES_BOOL is_immedok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_keypad +NCURSES_BOOL is_keypad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_leaveok +NCURSES_BOOL is_leaveok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_nodelay +NCURSES_BOOL is_nodelay( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_notimeout +NCURSES_BOOL is_notimeout( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_pad +NCURSES_BOOL is_pad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_scrollok +NCURSES_BOOL is_scrollok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_subwin +NCURSES_BOOL is_subwin( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_syncok +NCURSES_BOOL is_syncok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef wgetdelay +int wgetdelay( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetscrreg +int wgetscrreg( + const WINDOW *a1, + int *a2, + int *z) + { return(*(int *)0); } + +#undef mouse_trafo +NCURSES_BOOL mouse_trafo( + int *a1, + int *a2, + NCURSES_BOOL z) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_getch.c */ + +#undef ESCDELAY +int ESCDELAY; + +#undef set_escdelay_sp +int set_escdelay_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_escdelay +int set_escdelay( + int value) + { return(*(int *)0); } + +#undef get_escdelay_sp +int get_escdelay_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef get_escdelay +int get_escdelay(void) + { return(*(int *)0); } + +#undef _nc_wgetch +int _nc_wgetch( + WINDOW *win, + int *result, + int use_meta) + { return(*(int *)0); } + +#undef wgetch +int wgetch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_getstr.c */ + +#undef wgetnstr +int wgetnstr( + WINDOW *win, + char *str, + int maxlen) + { return(*(int *)0); } + +/* ./base/lib_hline.c */ + +#undef whline +int whline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_immedok.c */ + +#undef immedok +void immedok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +/* ./base/lib_inchstr.c */ + +#undef winchnstr +int winchnstr( + WINDOW *win, + chtype *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_initscr.c */ + +#undef initscr +WINDOW *initscr(void) + { return(*(WINDOW **)0); } + +/* ./base/lib_insch.c */ + +#undef _nc_insert_ch +int _nc_insert_ch( + SCREEN *sp, + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +#undef winsch +int winsch( + WINDOW *win, + chtype c) + { return(*(int *)0); } + +/* ./base/lib_insdel.c */ + +#undef winsdelln +int winsdelln( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_insnstr.c */ + +#undef winsnstr +int winsnstr( + WINDOW *win, + const char *s, + int n) + { return(*(int *)0); } + +/* ./base/lib_instr.c */ + +#undef winnstr +int winnstr( + WINDOW *win, + char *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_isendwin.c */ + +#undef isendwin_sp +NCURSES_BOOL isendwin_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef isendwin +NCURSES_BOOL isendwin(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_leaveok.c */ + +#undef leaveok +int leaveok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_mouse.c */ + +#undef getmouse_sp +int getmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef getmouse +int getmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse_sp +int ungetmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse +int ungetmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef mousemask_sp +mmask_t mousemask_sp( + SCREEN *sp, + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef mousemask +mmask_t mousemask( + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef wenclose +NCURSES_BOOL wenclose( + const WINDOW *win, + int y, + int x) + { return(*(NCURSES_BOOL *)0); } + +#undef mouseinterval_sp +int mouseinterval_sp( + SCREEN *sp, + int maxclick) + { return(*(int *)0); } + +#undef mouseinterval +int mouseinterval( + int maxclick) + { return(*(int *)0); } + +#undef _nc_has_mouse +NCURSES_BOOL _nc_has_mouse( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse_sp +NCURSES_BOOL has_mouse_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse +NCURSES_BOOL has_mouse(void) + { return(*(NCURSES_BOOL *)0); } + +#undef wmouse_trafo +NCURSES_BOOL wmouse_trafo( + const WINDOW *win, + int *pY, + int *pX, + NCURSES_BOOL to_screen) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_move.c */ + +#undef wmove +int wmove( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +/* ./tty/lib_mvcur.c */ + +#undef _nc_msec_cost_sp +int _nc_msec_cost_sp( + SCREEN *sp, + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_msec_cost +int _nc_msec_cost( + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_mvcur_resume_sp +void _nc_mvcur_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_resume +void _nc_mvcur_resume(void) + { /* void */ } + +#undef _nc_mvcur_init_sp +void _nc_mvcur_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_init +void _nc_mvcur_init(void) + { /* void */ } + +#undef _nc_mvcur_wrap_sp +void _nc_mvcur_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_wrap +void _nc_mvcur_wrap(void) + { /* void */ } + +#undef _nc_mvcur_sp +int _nc_mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_mvcur +int _nc_mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur_sp +int mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur +int mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_optimize_enable +int _nc_optimize_enable; + +/* ./base/lib_mvwin.c */ + +#undef mvwin +int mvwin( + WINDOW *win, + int by, + int bx) + { return(*(int *)0); } + +/* ./base/lib_newterm.c */ + +#undef filter_sp +void filter_sp( + SCREEN *sp) + { /* void */ } + +#undef filter +void filter(void) + { /* void */ } + +#undef nofilter_sp +void nofilter_sp( + SCREEN *sp) + { /* void */ } + +#undef nofilter +void nofilter(void) + { /* void */ } + +#undef newterm_sp +SCREEN *newterm_sp( + SCREEN *sp, + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +#undef newterm +SCREEN *newterm( + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +/* ./base/lib_newwin.c */ + +#undef _nc_freewin +int _nc_freewin( + WINDOW *win) + { return(*(int *)0); } + +#undef newwin_sp +WINDOW *newwin_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef newwin +WINDOW *newwin( + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef derwin +WINDOW *derwin( + WINDOW *orig, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef subwin +WINDOW *subwin( + WINDOW *w, + int l, + int c, + int y, + int x) + { return(*(WINDOW **)0); } + +#undef _nc_makenew_sp +WINDOW *_nc_makenew_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx, + int flags) + { return(*(WINDOW **)0); } + +#undef _nc_curscr_of +WINDOW *_nc_curscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_newscr_of +WINDOW *_nc_newscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_stdscr_of +WINDOW *_nc_stdscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +/* ./base/lib_nl.c */ + +#undef nl_sp +int nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nl +int nl(void) + { return(*(int *)0); } + +#undef nonl_sp +int nonl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nonl +int nonl(void) + { return(*(int *)0); } + +/* ./base/lib_overlay.c */ + +#undef overlay +int overlay( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef overwrite +int overwrite( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef copywin +int copywin( + const WINDOW *src, + WINDOW *dst, + int sminrow, + int smincol, + int dminrow, + int dmincol, + int dmaxrow, + int dmaxcol, + int over) + { return(*(int *)0); } + +/* ./base/lib_pad.c */ + +#undef newpad_sp +WINDOW *newpad_sp( + SCREEN *sp, + int l, + int c) + { return(*(WINDOW **)0); } + +#undef newpad +WINDOW *newpad( + int l, + int c) + { return(*(WINDOW **)0); } + +#undef subpad +WINDOW *subpad( + WINDOW *orig, + int l, + int c, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef prefresh +int prefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pnoutrefresh +int pnoutrefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pechochar +int pechochar( + WINDOW *pad, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_printw.c */ + +#undef printw +int printw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wprintw +int wprintw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvprintw +int mvprintw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwprintw +int mvwprintw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef vwprintw +int vwprintw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_printw +int vw_printw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +/* ./base/lib_redrawln.c */ + +#undef wredrawln +int wredrawln( + WINDOW *win, + int beg, + int num) + { return(*(int *)0); } + +/* ./base/lib_refresh.c */ + +#undef wrefresh +int wrefresh( + WINDOW *win) + { return(*(int *)0); } + +#undef wnoutrefresh +int wnoutrefresh( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_restart.c */ + +#undef restartterm_sp +int restartterm_sp( + SCREEN *sp, + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +#undef restartterm +int restartterm( + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +/* ./base/lib_scanw.c */ + +#undef vwscanw +int vwscanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_scanw +int vw_scanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef scanw +int scanw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wscanw +int wscanw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvscanw +int mvscanw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwscanw +int mvwscanw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +/* ./base/lib_screen.c */ + +#undef getwin_sp +WINDOW *getwin_sp( + SCREEN *sp, + FILE *filep) + { return(*(WINDOW **)0); } + +#undef getwin +WINDOW *getwin( + FILE *filep) + { return(*(WINDOW **)0); } + +#undef putwin +int putwin( + WINDOW *win, + FILE *filep) + { return(*(int *)0); } + +#undef scr_restore_sp +int scr_restore_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_restore +int scr_restore( + const char *file) + { return(*(int *)0); } + +#undef scr_dump +int scr_dump( + const char *file) + { return(*(int *)0); } + +#undef scr_init_sp +int scr_init_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_init +int scr_init( + const char *file) + { return(*(int *)0); } + +#undef scr_set_sp +int scr_set_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_set +int scr_set( + const char *file) + { return(*(int *)0); } + +/* ./base/lib_scroll.c */ + +#undef _nc_scroll_window +void _nc_scroll_window( + WINDOW *win, + int const n, + int const top, + int const bottom, + chtype blank) + { /* void */ } + +#undef wscrl +int wscrl( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_scrollok.c */ + +#undef scrollok +int scrollok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_scrreg.c */ + +#undef wsetscrreg +int wsetscrreg( + WINDOW *win, + int top, + int bottom) + { return(*(int *)0); } + +/* ./base/lib_set_term.c */ + +#undef set_term +SCREEN *set_term( + SCREEN *screenp) + { return(*(SCREEN **)0); } + +#undef delscreen +void delscreen( + SCREEN *sp) + { /* void */ } + +#undef _nc_setupscreen_sp +int _nc_setupscreen_sp( + SCREEN **spp, + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_setupscreen +int _nc_setupscreen( + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_ripoffline_sp +int _nc_ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef _nc_ripoffline +int _nc_ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline_sp +int ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline +int ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +/* ./base/lib_slk.c */ + +#undef _nc_format_slks +int _nc_format_slks( + SCREEN *sp, + int cols) + { return(*(int *)0); } + +#undef _nc_slk_initialize +int _nc_slk_initialize( + WINDOW *stwin, + int cols) + { return(*(int *)0); } + +#undef slk_restore_sp +int slk_restore_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_restore +int slk_restore(void) + { return(*(int *)0); } + +/* ./base/lib_slkatr_set.c */ + +#undef slk_attr_set_sp +int slk_attr_set_sp( + SCREEN *sp, + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef slk_attr_set +int slk_attr_set( + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_slkatrof.c */ + +#undef slk_attroff_sp +int slk_attroff_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attroff +int slk_attroff( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatron.c */ + +#undef slk_attron_sp +int slk_attron_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attron +int slk_attron( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatrset.c */ + +#undef slk_attrset_sp +int slk_attrset_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attrset +int slk_attrset( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkattr.c */ + +#undef slk_attr_sp +attr_t slk_attr_sp( + SCREEN *sp) + { return(*(attr_t *)0); } + +#undef slk_attr +attr_t slk_attr(void) + { return(*(attr_t *)0); } + +/* ./base/lib_slkclear.c */ + +#undef slk_clear_sp +int slk_clear_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_clear +int slk_clear(void) + { return(*(int *)0); } + +/* ./base/lib_slkcolor.c */ + +#undef slk_color_sp +int slk_color_sp( + SCREEN *sp, + short pair_arg) + { return(*(int *)0); } + +#undef slk_color +int slk_color( + short pair_arg) + { return(*(int *)0); } + +/* ./base/lib_slkinit.c */ + +#undef slk_init_sp +int slk_init_sp( + SCREEN *sp, + int format) + { return(*(int *)0); } + +#undef slk_init +int slk_init( + int format) + { return(*(int *)0); } + +/* ./base/lib_slklab.c */ + +#undef slk_label_sp +char *slk_label_sp( + SCREEN *sp, + int n) + { return(*(char **)0); } + +#undef slk_label +char *slk_label( + int n) + { return(*(char **)0); } + +/* ./base/lib_slkrefr.c */ + +#undef slk_noutrefresh_sp +int slk_noutrefresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_noutrefresh +int slk_noutrefresh(void) + { return(*(int *)0); } + +#undef slk_refresh_sp +int slk_refresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_refresh +int slk_refresh(void) + { return(*(int *)0); } + +/* ./base/lib_slkset.c */ + +#undef slk_set_sp +int slk_set_sp( + SCREEN *sp, + int i, + const char *astr, + int format) + { return(*(int *)0); } + +#undef slk_set +int slk_set( + int i, + const char *astr, + int format) + { return(*(int *)0); } + +/* ./base/lib_slktouch.c */ + +#undef slk_touch_sp +int slk_touch_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_touch +int slk_touch(void) + { return(*(int *)0); } + +/* ./base/lib_touch.c */ + +#undef is_linetouched +NCURSES_BOOL is_linetouched( + WINDOW *win, + int line) + { return(*(NCURSES_BOOL *)0); } + +#undef is_wintouched +NCURSES_BOOL is_wintouched( + WINDOW *win) + { return(*(NCURSES_BOOL *)0); } + +#undef wtouchln +int wtouchln( + WINDOW *win, + int y, + int n, + int changed) + { return(*(int *)0); } + +/* ./trace/lib_tracedmp.c */ + +#undef _tracedump +void _tracedump( + const char *name, + WINDOW *win) + { /* void */ } + +/* ./trace/lib_tracemse.c */ + +#undef _nc_trace_mmask_t +char *_nc_trace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(char **)0); } + +#undef _nc_tracemouse +char *_nc_tracemouse( + SCREEN *sp, + MEVENT const *ep) + { return(*(char **)0); } + +#undef _nc_retrace_mmask_t +mmask_t _nc_retrace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(mmask_t *)0); } + +#undef _tracemouse +char *_tracemouse( + MEVENT const *ep) + { return(*(char **)0); } + +/* ./tty/lib_tstp.c */ + +#undef _nc_signal_handler +void _nc_signal_handler( + int enable) + { /* void */ } + +/* ./base/lib_ungetch.c */ + +#undef _nc_fifo_dump +void _nc_fifo_dump( + SCREEN *sp) + { /* void */ } + +#undef ungetch_sp +int ungetch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef ungetch +int ungetch( + int ch) + { return(*(int *)0); } + +/* ./tty/lib_vidattr.c */ + +#undef vidputs_sp +int vidputs_sp( + SCREEN *sp, + chtype newmode, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef vidputs +int vidputs( + chtype newmode, + NCURSES_OUTC outc) + { return(*(int *)0); } + +#undef vidattr_sp +int vidattr_sp( + SCREEN *sp, + chtype newmode) + { return(*(int *)0); } + +#undef vidattr +int vidattr( + chtype newmode) + { return(*(int *)0); } + +#undef termattrs_sp +chtype termattrs_sp( + SCREEN *sp) + { return(*(chtype *)0); } + +#undef termattrs +chtype termattrs(void) + { return(*(chtype *)0); } + +/* ./base/lib_vline.c */ + +#undef wvline +int wvline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_wattroff.c */ + +#undef wattr_off +int wattr_off( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_wattron.c */ + +#undef wattr_on +int wattr_on( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_winch.c */ + +#undef winch +chtype winch( + WINDOW *win) + { return(*(chtype *)0); } + +/* ./base/lib_window.c */ + +#undef _nc_synchook +void _nc_synchook( + WINDOW *win) + { /* void */ } + +#undef mvderwin +int mvderwin( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +#undef syncok +int syncok( + WINDOW *win, + NCURSES_BOOL bf) + { return(*(int *)0); } + +#undef wsyncup +void wsyncup( + WINDOW *win) + { /* void */ } + +#undef wsyncdown +void wsyncdown( + WINDOW *win) + { /* void */ } + +#undef wcursyncup +void wcursyncup( + WINDOW *win) + { /* void */ } + +#undef dupwin +WINDOW *dupwin( + WINDOW *win) + { return(*(WINDOW **)0); } + +/* ./base/nc_panel.c */ + +#undef _nc_panelhook_sp +struct panelhook *_nc_panelhook_sp( + SCREEN *sp) + { return(*(struct panelhook **)0); } + +#undef _nc_panelhook +struct panelhook *_nc_panelhook(void) + { return(*(struct panelhook **)0); } + +/* ./base/safe_sprintf.c */ + +#undef _nc_printf_string_sp +char *_nc_printf_string_sp( + SCREEN *sp, + const char *fmt, + va_list ap) + { return(*(char **)0); } + +#undef _nc_printf_string +char *_nc_printf_string( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./tty/tty_update.c */ + +#undef doupdate_sp +int doupdate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef doupdate +int doupdate(void) + { return(*(int *)0); } + +#undef _nc_scrolln_sp +int _nc_scrolln_sp( + SCREEN *sp, + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_scrolln +int _nc_scrolln( + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_screen_resume_sp +void _nc_screen_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_resume +void _nc_screen_resume(void) + { /* void */ } + +#undef _nc_screen_init_sp +void _nc_screen_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_init +void _nc_screen_init(void) + { /* void */ } + +#undef _nc_screen_wrap_sp +void _nc_screen_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_wrap +void _nc_screen_wrap(void) + { /* void */ } + +#undef _nc_do_xmc_glitch_sp +void _nc_do_xmc_glitch_sp( + SCREEN *sp, + attr_t previous) + { /* void */ } + +#undef _nc_do_xmc_glitch +void _nc_do_xmc_glitch( + attr_t previous) + { /* void */ } + +/* ./trace/varargs.c */ + +#undef _nc_varargs +char *_nc_varargs( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./base/vsscanf.c */ + +#undef _nc_vsscanf +void _nc_vsscanf(void) + { /* void */ } + +/* ./base/lib_freeall.c */ + +#undef _nc_freeall +void _nc_freeall(void) + { /* void */ } + +#undef _nc_free_and_exit_sp +void _nc_free_and_exit_sp( + SCREEN *sp, + int code) + { /* void */ } + +#undef _nc_free_and_exit +void _nc_free_and_exit( + int code) + { /* void */ } + +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + +/* ./expanded.c */ + +#undef _nc_toggle_attr_on +void _nc_toggle_attr_on( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_toggle_attr_off +void _nc_toggle_attr_off( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_DelCharCost_sp +int _nc_DelCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost_sp +int _nc_InsCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs_sp +void _nc_UpdateAttrs_sp( + SCREEN *sp, + chtype c) + { /* void */ } + +#undef _nc_DelCharCost +int _nc_DelCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost +int _nc_InsCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs +void _nc_UpdateAttrs( + chtype c) + { /* void */ } + +/* ./base/legacy_coding.c */ + +#undef use_legacy_coding_sp +int use_legacy_coding_sp( + SCREEN *sp, + int level) + { return(*(int *)0); } + +#undef use_legacy_coding +int use_legacy_coding( + int level) + { return(*(int *)0); } + +/* ./base/lib_dft_fgbg.c */ + +#undef use_default_colors_sp +int use_default_colors_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_default_colors +int use_default_colors(void) + { return(*(int *)0); } + +#undef assume_default_colors_sp +int assume_default_colors_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef assume_default_colors +int assume_default_colors( + int fg, + int bg) + { return(*(int *)0); } + +/* ./tinfo/lib_print.c */ + +#undef mcprint_sp +int mcprint_sp( + SCREEN *sp, + char *data, + int len) + { return(*(int *)0); } + +#undef mcprint +int mcprint( + char *data, + int len) + { return(*(int *)0); } + +/* ./base/new_pair.c */ + +#undef _nc_new_pair +void _nc_new_pair(void) + { /* void */ } + +/* ./base/resizeterm.c */ + +#undef is_term_resized_sp +NCURSES_BOOL is_term_resized_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef is_term_resized +NCURSES_BOOL is_term_resized( + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef resize_term_sp +int resize_term_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resize_term +int resize_term( + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm_sp +int resizeterm_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm +int resizeterm( + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./trace/trace_xnames.c */ + +#undef _nc_trace_xnames +void _nc_trace_xnames( + TERMTYPE *tp) + { /* void */ } + +/* ./tinfo/use_screen.c */ + +#undef use_screen +int use_screen( + SCREEN *screen, + NCURSES_SCREEN_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/use_window.c */ + +#undef use_window +int use_window( + WINDOW *win, + NCURSES_WINDOW_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/wresize.c */ + +#undef wresize +int wresize( + WINDOW *win, + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./tinfo/access.c */ + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE *to, + TERMTYPE *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +/* ./codes.c */ + +#undef boolcodes +const char *const boolcodes[] = {0}; +#undef numcodes +const char *const numcodes[] = {0}; +#undef strcodes +const char *const strcodes[] = {0}; + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef acs_map +chtype acs_map[128]; + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef cur_term +TERMINAL *cur_term; + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef stdscr +WINDOW *stdscr; +#undef curscr +WINDOW *curscr; +#undef newscr +WINDOW *newscr; +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef ttytype +char ttytype[256]; +#undef LINES +int LINES; +#undef COLS +int COLS; +#undef TABSIZE +int TABSIZE; + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; +#undef _nc_tputs_trace +const char *_nc_tputs_trace = {0}; +#undef _nc_outchars +long _nc_outchars; + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef boolnames +const char *const boolnames[] = {0}; +#undef boolfnames +const char *const boolfnames[] = {0}; +#undef numnames +const char *const numnames[] = {0}; +#undef numfnames +const char *const numfnames[] = {0}; +#undef strnames +const char *const strnames[] = {0}; +#undef strfnames +const char *const strfnames[] = {0}; + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const chtype *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const chtype *buf, + int len) + { return(*(const char **)0); } + +/* ./tinfo/alloc_entry.c */ + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-lncursest b/contrib/ncurses/ncurses/llib-lncursest new file mode 100644 index 00000000..7c8bac9c --- /dev/null +++ b/contrib/ncurses/ncurses/llib-lncursest @@ -0,0 +1,4627 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 2008-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2008-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tty/hardscroll.c */ + +#include + +#undef _nc_oldnums +int *_nc_oldnums; + +#undef _nc_scroll_optimize_sp +void _nc_scroll_optimize_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_scroll_optimize +void _nc_scroll_optimize(void) + { /* void */ } + +#undef _nc_linedump_sp +void _nc_linedump_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_linedump +void _nc_linedump(void) + { /* void */ } + +/* ./tty/hashmap.c */ + +#undef _nc_hash_map_sp +void _nc_hash_map_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_hash_map +void _nc_hash_map(void) + { /* void */ } + +#undef _nc_make_oldhash_sp +void _nc_make_oldhash_sp( + SCREEN *sp, + int i) + { /* void */ } + +#undef _nc_make_oldhash +void _nc_make_oldhash( + int i) + { /* void */ } + +#undef _nc_scroll_oldhash_sp +void _nc_scroll_oldhash_sp( + SCREEN *sp, + int n, + int top, + int bot) + { /* void */ } + +#undef _nc_scroll_oldhash +void _nc_scroll_oldhash( + int n, + int top, + int bot) + { /* void */ } + +/* ./base/lib_addch.c */ + +#undef _nc_render +chtype _nc_render( + WINDOW *win, + chtype ch) + { return(*(chtype *)0); } + +#undef _nc_waddch_nosync +int _nc_waddch_nosync( + WINDOW *win, + const chtype c) + { return(*(int *)0); } + +#undef waddch +int waddch( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +#undef wechochar +int wechochar( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_addstr.c */ + +#undef waddnstr +int waddnstr( + WINDOW *win, + const char *astr, + int n) + { return(*(int *)0); } + +#undef waddchnstr +int waddchnstr( + WINDOW *win, + const chtype *astr, + int n) + { return(*(int *)0); } + +/* ./base/lib_beep.c */ + +#undef beep_sp +int beep_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef beep +int beep(void) + { return(*(int *)0); } + +/* ./base/lib_bkgd.c */ + +#undef wbkgdset +void wbkgdset( + WINDOW *win, + chtype ch) + { /* void */ } + +#undef wbkgd +int wbkgd( + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +/* ./base/lib_box.c */ + +#undef wborder +int wborder( + WINDOW *win, + chtype ls, + chtype rs, + chtype ts, + chtype bs, + chtype tl, + chtype tr, + chtype bl, + chtype br) + { return(*(int *)0); } + +/* ./base/lib_chgat.c */ + +#undef wchgat +int wchgat( + WINDOW *win, + int n, + attr_t attr, + short pair_arg, + const void *opts) + { return(*(int *)0); } + +/* ./base/lib_clear.c */ + +#undef wclear +int wclear( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clearok.c */ + +#undef clearok +int clearok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_clrbot.c */ + +#undef wclrtobot +int wclrtobot( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clreol.c */ + +#undef wclrtoeol +int wclrtoeol( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_color.c */ + +#undef _nc_COLOR_PAIRS +int _nc_COLOR_PAIRS(void) + { return(*(int *)0); } + +#undef _nc_COLORS +int _nc_COLORS(void) + { return(*(int *)0); } + +#undef _nc_reset_colors_sp +NCURSES_BOOL _nc_reset_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_reset_colors +NCURSES_BOOL _nc_reset_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef start_color_sp +int start_color_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef start_color +int start_color(void) + { return(*(int *)0); } + +#undef _nc_change_pair +void _nc_change_pair( + SCREEN *sp, + int pair) + { /* void */ } + +#undef _nc_reserve_pairs +void _nc_reserve_pairs( + SCREEN *sp, + int want) + { /* void */ } + +#undef _nc_init_pair +int _nc_init_pair( + SCREEN *sp, + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_pair_sp +int init_pair_sp( + SCREEN *sp, + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef init_pair +int init_pair( + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef _nc_init_color +int _nc_init_color( + SCREEN *sp, + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef init_color_sp +int init_color_sp( + SCREEN *sp, + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef init_color +int init_color( + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef can_change_color_sp +NCURSES_BOOL can_change_color_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef can_change_color +NCURSES_BOOL can_change_color(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors_sp +NCURSES_BOOL has_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors +NCURSES_BOOL has_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef color_content_sp +int color_content_sp( + SCREEN *sp, + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef color_content +int color_content( + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef _nc_pair_content +int _nc_pair_content( + SCREEN *sp, + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef pair_content_sp +int pair_content_sp( + SCREEN *sp, + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef pair_content +int pair_content( + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef _nc_do_color_sp +void _nc_do_color_sp( + SCREEN *sp, + int old_pair, + int pair, + int reverse, + NCURSES_OUTC_sp outc) + { /* void */ } + +#undef _nc_do_color +void _nc_do_color( + int old_pair, + int pair, + int reverse, + NCURSES_OUTC outc) + { /* void */ } + +/* ./base/lib_colorset.c */ + +#undef wcolor_set +int wcolor_set( + WINDOW *win, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_delch.c */ + +#undef wdelch +int wdelch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_delwin.c */ + +#undef delwin +int delwin( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_echo.c */ + +#undef echo_sp +int echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef echo +int echo(void) + { return(*(int *)0); } + +#undef noecho_sp +int noecho_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noecho +int noecho(void) + { return(*(int *)0); } + +/* ./base/lib_endwin.c */ + +#undef endwin_sp +int endwin_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef endwin +int endwin(void) + { return(*(int *)0); } + +/* ./base/lib_erase.c */ + +#undef werase +int werase( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_flash.c */ + +#undef flash_sp +int flash_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flash +int flash(void) + { return(*(int *)0); } + +/* ./lib_gen.c */ + +#undef addch +int addch( + const chtype z) + { return(*(int *)0); } + +#undef addchnstr +int addchnstr( + const chtype *a1, + int z) + { return(*(int *)0); } + +#undef addchstr +int addchstr( + const chtype *z) + { return(*(int *)0); } + +#undef addnstr +int addnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef addstr +int addstr( + const char *z) + { return(*(int *)0); } + +#undef attroff +int attroff( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attron +int attron( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attrset +int attrset( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attr_get +int attr_get( + attr_t *a1, + short *a2, + void *z) + { return(*(int *)0); } + +#undef attr_off +int attr_off( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_on +int attr_on( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_set +int attr_set( + attr_t a1, + short a2, + void *z) + { return(*(int *)0); } + +#undef bkgd +int bkgd( + chtype z) + { return(*(int *)0); } + +#undef bkgdset +void bkgdset( + chtype z) + { /* void */ } + +#undef border +int border( + chtype a1, + chtype a2, + chtype a3, + chtype a4, + chtype a5, + chtype a6, + chtype a7, + chtype z) + { return(*(int *)0); } + +#undef box +int box( + WINDOW *a1, + chtype a2, + chtype z) + { return(*(int *)0); } + +#undef chgat +int chgat( + int a1, + attr_t a2, + short a3, + const void *z) + { return(*(int *)0); } + +#undef clear +int clear(void) + { return(*(int *)0); } + +#undef clrtobot +int clrtobot(void) + { return(*(int *)0); } + +#undef clrtoeol +int clrtoeol(void) + { return(*(int *)0); } + +#undef color_set +int color_set( + short a1, + void *z) + { return(*(int *)0); } + +#undef COLOR_PAIR +int COLOR_PAIR( + int z) + { return(*(int *)0); } + +#undef delch +int delch(void) + { return(*(int *)0); } + +#undef deleteln +int deleteln(void) + { return(*(int *)0); } + +#undef echochar +int echochar( + const chtype z) + { return(*(int *)0); } + +#undef erase +int erase(void) + { return(*(int *)0); } + +#undef getbkgd +chtype getbkgd( + WINDOW *z) + { return(*(chtype *)0); } + +#undef getch +int getch(void) + { return(*(int *)0); } + +#undef getnstr +int getnstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef getstr +int getstr( + char *z) + { return(*(int *)0); } + +#undef hline +int hline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef inch +chtype inch(void) + { return(*(chtype *)0); } + +#undef inchnstr +int inchnstr( + chtype *a1, + int z) + { return(*(int *)0); } + +#undef inchstr +int inchstr( + chtype *z) + { return(*(int *)0); } + +#undef innstr +int innstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef insch +int insch( + chtype z) + { return(*(int *)0); } + +#undef insdelln +int insdelln( + int z) + { return(*(int *)0); } + +#undef insertln +int insertln(void) + { return(*(int *)0); } + +#undef insnstr +int insnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef insstr +int insstr( + const char *z) + { return(*(int *)0); } + +#undef instr +int instr( + char *z) + { return(*(int *)0); } + +#undef move +int move( + int a1, + int z) + { return(*(int *)0); } + +#undef mvaddch +int mvaddch( + int a1, + int a2, + const chtype z) + { return(*(int *)0); } + +#undef mvaddchnstr +int mvaddchnstr( + int a1, + int a2, + const chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvaddchstr +int mvaddchstr( + int a1, + int a2, + const chtype *z) + { return(*(int *)0); } + +#undef mvaddnstr +int mvaddnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvaddstr +int mvaddstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvchgat +int mvchgat( + int a1, + int a2, + int a3, + attr_t a4, + short a5, + const void *z) + { return(*(int *)0); } + +#undef mvdelch +int mvdelch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetch +int mvgetch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetnstr +int mvgetnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvgetstr +int mvgetstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvhline +int mvhline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvinch +chtype mvinch( + int a1, + int z) + { return(*(chtype *)0); } + +#undef mvinchnstr +int mvinchnstr( + int a1, + int a2, + chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvinchstr +int mvinchstr( + int a1, + int a2, + chtype *z) + { return(*(int *)0); } + +#undef mvinnstr +int mvinnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsch +int mvinsch( + int a1, + int a2, + chtype z) + { return(*(int *)0); } + +#undef mvinsnstr +int mvinsnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsstr +int mvinsstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvinstr +int mvinstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvvline +int mvvline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvwaddch +int mvwaddch( + WINDOW *a1, + int a2, + int a3, + const chtype z) + { return(*(int *)0); } + +#undef mvwaddchnstr +int mvwaddchnstr( + WINDOW *a1, + int a2, + int a3, + const chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddchstr +int mvwaddchstr( + WINDOW *a1, + int a2, + int a3, + const chtype *z) + { return(*(int *)0); } + +#undef mvwaddnstr +int mvwaddnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddstr +int mvwaddstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwchgat +int mvwchgat( + WINDOW *a1, + int a2, + int a3, + int a4, + attr_t a5, + short a6, + const void *z) + { return(*(int *)0); } + +#undef mvwdelch +int mvwdelch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetch +int mvwgetch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetnstr +int mvwgetnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwgetstr +int mvwgetstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwhline +int mvwhline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef mvwinch +chtype mvwinch( + WINDOW *a1, + int a2, + int z) + { return(*(chtype *)0); } + +#undef mvwinchnstr +int mvwinchnstr( + WINDOW *a1, + int a2, + int a3, + chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwinchstr +int mvwinchstr( + WINDOW *a1, + int a2, + int a3, + chtype *z) + { return(*(int *)0); } + +#undef mvwinnstr +int mvwinnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsch +int mvwinsch( + WINDOW *a1, + int a2, + int a3, + chtype z) + { return(*(int *)0); } + +#undef mvwinsnstr +int mvwinsnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsstr +int mvwinsstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwinstr +int mvwinstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwvline +int mvwvline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef PAIR_NUMBER +int PAIR_NUMBER( + int z) + { return(*(int *)0); } + +#undef redrawwin +int redrawwin( + WINDOW *z) + { return(*(int *)0); } + +#undef refresh +int refresh(void) + { return(*(int *)0); } + +#undef scrl +int scrl( + int z) + { return(*(int *)0); } + +#undef scroll +int scroll( + WINDOW *z) + { return(*(int *)0); } + +#undef setscrreg +int setscrreg( + int a1, + int z) + { return(*(int *)0); } + +#undef standout +int standout(void) + { return(*(int *)0); } + +#undef standend +int standend(void) + { return(*(int *)0); } + +#undef timeout +void timeout( + int z) + { /* void */ } + +#undef touchline +int touchline( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef touchwin +int touchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef untouchwin +int untouchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef vline +int vline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef waddchstr +int waddchstr( + WINDOW *a1, + const chtype *z) + { return(*(int *)0); } + +#undef waddstr +int waddstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef wattron +int wattron( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattroff +int wattroff( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattrset +int wattrset( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattr_get +int wattr_get( + WINDOW *a1, + attr_t *a2, + short *a3, + void *z) + { return(*(int *)0); } + +#undef wattr_set +int wattr_set( + WINDOW *a1, + attr_t a2, + short a3, + void *z) + { return(*(int *)0); } + +#undef wdeleteln +int wdeleteln( + WINDOW *z) + { return(*(int *)0); } + +#undef wgetstr +int wgetstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef winchstr +int winchstr( + WINDOW *a1, + chtype *z) + { return(*(int *)0); } + +#undef winsertln +int winsertln( + WINDOW *z) + { return(*(int *)0); } + +#undef winsstr +int winsstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef winstr +int winstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef wstandout +int wstandout( + WINDOW *z) + { return(*(int *)0); } + +#undef wstandend +int wstandend( + WINDOW *z) + { return(*(int *)0); } + +#undef getattrs +int getattrs( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcurx +int getcurx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcury +int getcury( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegx +int getbegx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegy +int getbegy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxx +int getmaxx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxy +int getmaxy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getparx +int getparx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getpary +int getpary( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetparent +WINDOW *wgetparent( + const WINDOW *z) + { return(*(WINDOW **)0); } + +#undef is_cleared +NCURSES_BOOL is_cleared( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idcok +NCURSES_BOOL is_idcok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idlok +NCURSES_BOOL is_idlok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_immedok +NCURSES_BOOL is_immedok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_keypad +NCURSES_BOOL is_keypad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_leaveok +NCURSES_BOOL is_leaveok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_nodelay +NCURSES_BOOL is_nodelay( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_notimeout +NCURSES_BOOL is_notimeout( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_pad +NCURSES_BOOL is_pad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_scrollok +NCURSES_BOOL is_scrollok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_subwin +NCURSES_BOOL is_subwin( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_syncok +NCURSES_BOOL is_syncok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef wgetdelay +int wgetdelay( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetscrreg +int wgetscrreg( + const WINDOW *a1, + int *a2, + int *z) + { return(*(int *)0); } + +#undef mouse_trafo +NCURSES_BOOL mouse_trafo( + int *a1, + int *a2, + NCURSES_BOOL z) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_getch.c */ + +#undef _nc_ESCDELAY +int _nc_ESCDELAY(void) + { return(*(int *)0); } + +#undef _nc_ptr_Escdelay +int *_nc_ptr_Escdelay( + SCREEN *sp) + { return(*(int **)0); } + +#undef set_escdelay_sp +int set_escdelay_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_escdelay +int set_escdelay( + int value) + { return(*(int *)0); } + +#undef get_escdelay_sp +int get_escdelay_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef get_escdelay +int get_escdelay(void) + { return(*(int *)0); } + +#undef _nc_wgetch +int _nc_wgetch( + WINDOW *win, + int *result, + int use_meta) + { return(*(int *)0); } + +#undef wgetch +int wgetch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_getstr.c */ + +#undef wgetnstr +int wgetnstr( + WINDOW *win, + char *str, + int maxlen) + { return(*(int *)0); } + +/* ./base/lib_hline.c */ + +#undef whline +int whline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_immedok.c */ + +#undef immedok +void immedok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +/* ./base/lib_inchstr.c */ + +#undef winchnstr +int winchnstr( + WINDOW *win, + chtype *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_initscr.c */ + +#undef initscr +WINDOW *initscr(void) + { return(*(WINDOW **)0); } + +/* ./base/lib_insch.c */ + +#undef _nc_insert_ch +int _nc_insert_ch( + SCREEN *sp, + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +#undef winsch +int winsch( + WINDOW *win, + chtype c) + { return(*(int *)0); } + +/* ./base/lib_insdel.c */ + +#undef winsdelln +int winsdelln( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_insnstr.c */ + +#undef winsnstr +int winsnstr( + WINDOW *win, + const char *s, + int n) + { return(*(int *)0); } + +/* ./base/lib_instr.c */ + +#undef winnstr +int winnstr( + WINDOW *win, + char *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_isendwin.c */ + +#undef isendwin_sp +NCURSES_BOOL isendwin_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef isendwin +NCURSES_BOOL isendwin(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_leaveok.c */ + +#undef leaveok +int leaveok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_mouse.c */ + +#undef getmouse_sp +int getmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef getmouse +int getmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse_sp +int ungetmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse +int ungetmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef mousemask_sp +mmask_t mousemask_sp( + SCREEN *sp, + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef mousemask +mmask_t mousemask( + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef wenclose +NCURSES_BOOL wenclose( + const WINDOW *win, + int y, + int x) + { return(*(NCURSES_BOOL *)0); } + +#undef mouseinterval_sp +int mouseinterval_sp( + SCREEN *sp, + int maxclick) + { return(*(int *)0); } + +#undef mouseinterval +int mouseinterval( + int maxclick) + { return(*(int *)0); } + +#undef _nc_has_mouse +NCURSES_BOOL _nc_has_mouse( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse_sp +NCURSES_BOOL has_mouse_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse +NCURSES_BOOL has_mouse(void) + { return(*(NCURSES_BOOL *)0); } + +#undef wmouse_trafo +NCURSES_BOOL wmouse_trafo( + const WINDOW *win, + int *pY, + int *pX, + NCURSES_BOOL to_screen) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_move.c */ + +#undef wmove +int wmove( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +/* ./tty/lib_mvcur.c */ + +#undef _nc_msec_cost_sp +int _nc_msec_cost_sp( + SCREEN *sp, + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_msec_cost +int _nc_msec_cost( + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_mvcur_resume_sp +void _nc_mvcur_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_resume +void _nc_mvcur_resume(void) + { /* void */ } + +#undef _nc_mvcur_init_sp +void _nc_mvcur_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_init +void _nc_mvcur_init(void) + { /* void */ } + +#undef _nc_mvcur_wrap_sp +void _nc_mvcur_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_wrap +void _nc_mvcur_wrap(void) + { /* void */ } + +#undef _nc_mvcur_sp +int _nc_mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_mvcur +int _nc_mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur_sp +int mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur +int mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_optimize_enable +int _nc_optimize_enable; + +/* ./base/lib_mvwin.c */ + +#undef mvwin +int mvwin( + WINDOW *win, + int by, + int bx) + { return(*(int *)0); } + +/* ./base/lib_newterm.c */ + +#undef filter_sp +void filter_sp( + SCREEN *sp) + { /* void */ } + +#undef filter +void filter(void) + { /* void */ } + +#undef nofilter_sp +void nofilter_sp( + SCREEN *sp) + { /* void */ } + +#undef nofilter +void nofilter(void) + { /* void */ } + +#undef newterm_sp +SCREEN *newterm_sp( + SCREEN *sp, + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +#undef newterm +SCREEN *newterm( + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +/* ./base/lib_newwin.c */ + +#undef _nc_freewin +int _nc_freewin( + WINDOW *win) + { return(*(int *)0); } + +#undef newwin_sp +WINDOW *newwin_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef newwin +WINDOW *newwin( + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef derwin +WINDOW *derwin( + WINDOW *orig, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef subwin +WINDOW *subwin( + WINDOW *w, + int l, + int c, + int y, + int x) + { return(*(WINDOW **)0); } + +#undef _nc_makenew_sp +WINDOW *_nc_makenew_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx, + int flags) + { return(*(WINDOW **)0); } + +#undef _nc_curscr_of +WINDOW *_nc_curscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_newscr_of +WINDOW *_nc_newscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_stdscr_of +WINDOW *_nc_stdscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +/* ./base/lib_nl.c */ + +#undef nl_sp +int nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nl +int nl(void) + { return(*(int *)0); } + +#undef nonl_sp +int nonl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nonl +int nonl(void) + { return(*(int *)0); } + +/* ./base/lib_overlay.c */ + +#undef overlay +int overlay( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef overwrite +int overwrite( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef copywin +int copywin( + const WINDOW *src, + WINDOW *dst, + int sminrow, + int smincol, + int dminrow, + int dmincol, + int dmaxrow, + int dmaxcol, + int over) + { return(*(int *)0); } + +/* ./base/lib_pad.c */ + +#undef newpad_sp +WINDOW *newpad_sp( + SCREEN *sp, + int l, + int c) + { return(*(WINDOW **)0); } + +#undef newpad +WINDOW *newpad( + int l, + int c) + { return(*(WINDOW **)0); } + +#undef subpad +WINDOW *subpad( + WINDOW *orig, + int l, + int c, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef prefresh +int prefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pnoutrefresh +int pnoutrefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pechochar +int pechochar( + WINDOW *pad, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_printw.c */ + +#undef printw +int printw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wprintw +int wprintw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvprintw +int mvprintw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwprintw +int mvwprintw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef vwprintw +int vwprintw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_printw +int vw_printw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +/* ./base/lib_redrawln.c */ + +#undef wredrawln +int wredrawln( + WINDOW *win, + int beg, + int num) + { return(*(int *)0); } + +/* ./base/lib_refresh.c */ + +#undef wrefresh +int wrefresh( + WINDOW *win) + { return(*(int *)0); } + +#undef wnoutrefresh +int wnoutrefresh( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_restart.c */ + +#undef restartterm_sp +int restartterm_sp( + SCREEN *sp, + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +#undef restartterm +int restartterm( + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +/* ./base/lib_scanw.c */ + +#undef vwscanw +int vwscanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_scanw +int vw_scanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef scanw +int scanw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wscanw +int wscanw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvscanw +int mvscanw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwscanw +int mvwscanw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +/* ./base/lib_screen.c */ + +#undef getwin_sp +WINDOW *getwin_sp( + SCREEN *sp, + FILE *filep) + { return(*(WINDOW **)0); } + +#undef getwin +WINDOW *getwin( + FILE *filep) + { return(*(WINDOW **)0); } + +#undef putwin +int putwin( + WINDOW *win, + FILE *filep) + { return(*(int *)0); } + +#undef scr_restore_sp +int scr_restore_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_restore +int scr_restore( + const char *file) + { return(*(int *)0); } + +#undef scr_dump +int scr_dump( + const char *file) + { return(*(int *)0); } + +#undef scr_init_sp +int scr_init_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_init +int scr_init( + const char *file) + { return(*(int *)0); } + +#undef scr_set_sp +int scr_set_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_set +int scr_set( + const char *file) + { return(*(int *)0); } + +/* ./base/lib_scroll.c */ + +#undef _nc_scroll_window +void _nc_scroll_window( + WINDOW *win, + int const n, + int const top, + int const bottom, + chtype blank) + { /* void */ } + +#undef wscrl +int wscrl( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_scrollok.c */ + +#undef scrollok +int scrollok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_scrreg.c */ + +#undef wsetscrreg +int wsetscrreg( + WINDOW *win, + int top, + int bottom) + { return(*(int *)0); } + +/* ./base/lib_set_term.c */ + +#undef set_term +SCREEN *set_term( + SCREEN *screenp) + { return(*(SCREEN **)0); } + +#undef delscreen +void delscreen( + SCREEN *sp) + { /* void */ } + +#undef _nc_setupscreen_sp +int _nc_setupscreen_sp( + SCREEN **spp, + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_setupscreen +int _nc_setupscreen( + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_ripoffline_sp +int _nc_ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef _nc_ripoffline +int _nc_ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline_sp +int ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline +int ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +/* ./base/lib_slk.c */ + +#undef _nc_format_slks +int _nc_format_slks( + SCREEN *sp, + int cols) + { return(*(int *)0); } + +#undef _nc_slk_initialize +int _nc_slk_initialize( + WINDOW *stwin, + int cols) + { return(*(int *)0); } + +#undef slk_restore_sp +int slk_restore_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_restore +int slk_restore(void) + { return(*(int *)0); } + +/* ./base/lib_slkatr_set.c */ + +#undef slk_attr_set_sp +int slk_attr_set_sp( + SCREEN *sp, + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef slk_attr_set +int slk_attr_set( + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_slkatrof.c */ + +#undef slk_attroff_sp +int slk_attroff_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attroff +int slk_attroff( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatron.c */ + +#undef slk_attron_sp +int slk_attron_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attron +int slk_attron( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatrset.c */ + +#undef slk_attrset_sp +int slk_attrset_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attrset +int slk_attrset( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkattr.c */ + +#undef slk_attr_sp +attr_t slk_attr_sp( + SCREEN *sp) + { return(*(attr_t *)0); } + +#undef slk_attr +attr_t slk_attr(void) + { return(*(attr_t *)0); } + +/* ./base/lib_slkclear.c */ + +#undef slk_clear_sp +int slk_clear_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_clear +int slk_clear(void) + { return(*(int *)0); } + +/* ./base/lib_slkcolor.c */ + +#undef slk_color_sp +int slk_color_sp( + SCREEN *sp, + short pair_arg) + { return(*(int *)0); } + +#undef slk_color +int slk_color( + short pair_arg) + { return(*(int *)0); } + +/* ./base/lib_slkinit.c */ + +#undef slk_init_sp +int slk_init_sp( + SCREEN *sp, + int format) + { return(*(int *)0); } + +#undef slk_init +int slk_init( + int format) + { return(*(int *)0); } + +/* ./base/lib_slklab.c */ + +#undef slk_label_sp +char *slk_label_sp( + SCREEN *sp, + int n) + { return(*(char **)0); } + +#undef slk_label +char *slk_label( + int n) + { return(*(char **)0); } + +/* ./base/lib_slkrefr.c */ + +#undef slk_noutrefresh_sp +int slk_noutrefresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_noutrefresh +int slk_noutrefresh(void) + { return(*(int *)0); } + +#undef slk_refresh_sp +int slk_refresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_refresh +int slk_refresh(void) + { return(*(int *)0); } + +/* ./base/lib_slkset.c */ + +#undef slk_set_sp +int slk_set_sp( + SCREEN *sp, + int i, + const char *astr, + int format) + { return(*(int *)0); } + +#undef slk_set +int slk_set( + int i, + const char *astr, + int format) + { return(*(int *)0); } + +/* ./base/lib_slktouch.c */ + +#undef slk_touch_sp +int slk_touch_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_touch +int slk_touch(void) + { return(*(int *)0); } + +/* ./base/lib_touch.c */ + +#undef is_linetouched +NCURSES_BOOL is_linetouched( + WINDOW *win, + int line) + { return(*(NCURSES_BOOL *)0); } + +#undef is_wintouched +NCURSES_BOOL is_wintouched( + WINDOW *win) + { return(*(NCURSES_BOOL *)0); } + +#undef wtouchln +int wtouchln( + WINDOW *win, + int y, + int n, + int changed) + { return(*(int *)0); } + +/* ./trace/lib_tracedmp.c */ + +#undef _tracedump +void _tracedump( + const char *name, + WINDOW *win) + { /* void */ } + +/* ./trace/lib_tracemse.c */ + +#undef _nc_trace_mmask_t +char *_nc_trace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(char **)0); } + +#undef _nc_tracemouse +char *_nc_tracemouse( + SCREEN *sp, + MEVENT const *ep) + { return(*(char **)0); } + +#undef _nc_retrace_mmask_t +mmask_t _nc_retrace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(mmask_t *)0); } + +#undef _tracemouse +char *_tracemouse( + MEVENT const *ep) + { return(*(char **)0); } + +/* ./tty/lib_tstp.c */ + +#undef _nc_signal_handler +void _nc_signal_handler( + int enable) + { /* void */ } + +/* ./base/lib_ungetch.c */ + +#undef _nc_fifo_dump +void _nc_fifo_dump( + SCREEN *sp) + { /* void */ } + +#undef ungetch_sp +int ungetch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef ungetch +int ungetch( + int ch) + { return(*(int *)0); } + +/* ./tty/lib_vidattr.c */ + +#undef vidputs_sp +int vidputs_sp( + SCREEN *sp, + chtype newmode, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef vidputs +int vidputs( + chtype newmode, + NCURSES_OUTC outc) + { return(*(int *)0); } + +#undef vidattr_sp +int vidattr_sp( + SCREEN *sp, + chtype newmode) + { return(*(int *)0); } + +#undef vidattr +int vidattr( + chtype newmode) + { return(*(int *)0); } + +#undef termattrs_sp +chtype termattrs_sp( + SCREEN *sp) + { return(*(chtype *)0); } + +#undef termattrs +chtype termattrs(void) + { return(*(chtype *)0); } + +/* ./base/lib_vline.c */ + +#undef wvline +int wvline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_wattroff.c */ + +#undef wattr_off +int wattr_off( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_wattron.c */ + +#undef wattr_on +int wattr_on( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_winch.c */ + +#undef winch +chtype winch( + WINDOW *win) + { return(*(chtype *)0); } + +/* ./base/lib_window.c */ + +#undef _nc_synchook +void _nc_synchook( + WINDOW *win) + { /* void */ } + +#undef mvderwin +int mvderwin( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +#undef syncok +int syncok( + WINDOW *win, + NCURSES_BOOL bf) + { return(*(int *)0); } + +#undef wsyncup +void wsyncup( + WINDOW *win) + { /* void */ } + +#undef wsyncdown +void wsyncdown( + WINDOW *win) + { /* void */ } + +#undef wcursyncup +void wcursyncup( + WINDOW *win) + { /* void */ } + +#undef dupwin +WINDOW *dupwin( + WINDOW *win) + { return(*(WINDOW **)0); } + +/* ./base/nc_panel.c */ + +#undef _nc_panelhook_sp +struct panelhook *_nc_panelhook_sp( + SCREEN *sp) + { return(*(struct panelhook **)0); } + +#undef _nc_panelhook +struct panelhook *_nc_panelhook(void) + { return(*(struct panelhook **)0); } + +/* ./base/safe_sprintf.c */ + +#undef _nc_printf_string_sp +char *_nc_printf_string_sp( + SCREEN *sp, + const char *fmt, + va_list ap) + { return(*(char **)0); } + +#undef _nc_printf_string +char *_nc_printf_string( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./tty/tty_update.c */ + +#undef doupdate_sp +int doupdate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef doupdate +int doupdate(void) + { return(*(int *)0); } + +#undef _nc_scrolln_sp +int _nc_scrolln_sp( + SCREEN *sp, + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_scrolln +int _nc_scrolln( + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_screen_resume_sp +void _nc_screen_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_resume +void _nc_screen_resume(void) + { /* void */ } + +#undef _nc_screen_init_sp +void _nc_screen_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_init +void _nc_screen_init(void) + { /* void */ } + +#undef _nc_screen_wrap_sp +void _nc_screen_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_wrap +void _nc_screen_wrap(void) + { /* void */ } + +#undef _nc_do_xmc_glitch_sp +void _nc_do_xmc_glitch_sp( + SCREEN *sp, + attr_t previous) + { /* void */ } + +#undef _nc_do_xmc_glitch +void _nc_do_xmc_glitch( + attr_t previous) + { /* void */ } + +/* ./trace/varargs.c */ + +#undef _nc_varargs +char *_nc_varargs( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./base/vsscanf.c */ + +#undef _nc_vsscanf +void _nc_vsscanf(void) + { /* void */ } + +/* ./base/lib_freeall.c */ + +#undef _nc_freeall +void _nc_freeall(void) + { /* void */ } + +#undef _nc_free_and_exit_sp +void _nc_free_and_exit_sp( + SCREEN *sp, + int code) + { /* void */ } + +#undef _nc_free_and_exit +void _nc_free_and_exit( + int code) + { /* void */ } + +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + +/* ./expanded.c */ + +#undef _nc_toggle_attr_on +void _nc_toggle_attr_on( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_toggle_attr_off +void _nc_toggle_attr_off( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_DelCharCost_sp +int _nc_DelCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost_sp +int _nc_InsCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs_sp +void _nc_UpdateAttrs_sp( + SCREEN *sp, + chtype c) + { /* void */ } + +#undef _nc_DelCharCost +int _nc_DelCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost +int _nc_InsCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs +void _nc_UpdateAttrs( + chtype c) + { /* void */ } + +/* ./base/legacy_coding.c */ + +#undef use_legacy_coding_sp +int use_legacy_coding_sp( + SCREEN *sp, + int level) + { return(*(int *)0); } + +#undef use_legacy_coding +int use_legacy_coding( + int level) + { return(*(int *)0); } + +/* ./base/lib_dft_fgbg.c */ + +#undef use_default_colors_sp +int use_default_colors_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_default_colors +int use_default_colors(void) + { return(*(int *)0); } + +#undef assume_default_colors_sp +int assume_default_colors_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef assume_default_colors +int assume_default_colors( + int fg, + int bg) + { return(*(int *)0); } + +/* ./tinfo/lib_print.c */ + +#undef mcprint_sp +int mcprint_sp( + SCREEN *sp, + char *data, + int len) + { return(*(int *)0); } + +#undef mcprint +int mcprint( + char *data, + int len) + { return(*(int *)0); } + +/* ./base/new_pair.c */ + +#undef _nc_new_pair +void _nc_new_pair(void) + { /* void */ } + +/* ./base/resizeterm.c */ + +#undef is_term_resized_sp +NCURSES_BOOL is_term_resized_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef is_term_resized +NCURSES_BOOL is_term_resized( + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef resize_term_sp +int resize_term_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resize_term +int resize_term( + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm_sp +int resizeterm_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm +int resizeterm( + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./trace/trace_xnames.c */ + +#undef _nc_trace_xnames +void _nc_trace_xnames( + TERMTYPE *tp) + { /* void */ } + +/* ./tinfo/use_screen.c */ + +#undef use_screen +int use_screen( + SCREEN *screen, + NCURSES_SCREEN_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/use_window.c */ + +#undef use_window +int use_window( + WINDOW *win, + NCURSES_WINDOW_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/wresize.c */ + +#undef wresize +int wresize( + WINDOW *win, + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./tinfo/access.c */ + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE *to, + TERMTYPE *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +/* ./codes.c */ + +#undef _nc_boolcodes +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } + +#undef _nc_numcodes +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } + +#undef _nc_strcodes +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef _nc_acs_map +chtype *_nc_acs_map(void) + { return(*(chtype **)0); } + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef _nc_get_cur_term_sp +TERMINAL *_nc_get_cur_term_sp( + SCREEN *sp) + { return(*(TERMINAL **)0); } + +#undef _nc_get_cur_term +TERMINAL *_nc_get_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef _nc_cur_term +TERMINAL *_nc_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef _nc_stdscr +WINDOW *_nc_stdscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_curscr +WINDOW *_nc_curscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_newscr +WINDOW *_nc_newscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +#undef _nc_init_pthreads +void _nc_init_pthreads(void) + { /* void */ } + +#undef _nc_mutex_init +void _nc_mutex_init( + pthread_mutex_t *obj) + { /* void */ } + +#undef _nc_mutex_lock +int _nc_mutex_lock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_trylock +int _nc_mutex_trylock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_unlock +int _nc_mutex_unlock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef _nc_ttytype +char *_nc_ttytype(void) + { return(*(char **)0); } + +#undef _nc_ptr_Lines +int *_nc_ptr_Lines( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_LINES +int _nc_LINES(void) + { return(*(int *)0); } + +#undef _nc_ptr_Cols +int *_nc_ptr_Cols( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_COLS +int _nc_COLS(void) + { return(*(int *)0); } + +#undef _nc_ptr_Tabsize +int *_nc_ptr_Tabsize( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_TABSIZE +int _nc_TABSIZE(void) + { return(*(int *)0); } + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef _nc_find_prescr +SCREEN *_nc_find_prescr(void) + { return(*(SCREEN **)0); } + +#undef _nc_forget_prescr +void _nc_forget_prescr(void) + { /* void */ } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; + +#undef _nc__nc_tputs_trace +const char *_nc__nc_tputs_trace(void) + { return(*(const char **)0); } + +#undef _nc__nc_outchars +long _nc__nc_outchars(void) + { return(*(long *)0); } + +#undef _nc_set_tputs_trace +void _nc_set_tputs_trace( + const char *s) + { /* void */ } + +#undef _nc_count_outchars +void _nc_count_outchars( + long increment) + { /* void */ } + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +#undef _nc_use_tracef +int _nc_use_tracef( + unsigned mask) + { return(*(int *)0); } + +#undef _nc_locked_tracef +void _nc_locked_tracef( + const char *fmt, + ...) + { /* void */ } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef _nc_boolnames +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } + +#undef _nc_boolfnames +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } + +#undef _nc_numnames +const char *const *_nc_numnames(void) + { return(*(const char **)0); } + +#undef _nc_numfnames +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } + +#undef _nc_strnames +const char *const *_nc_strnames(void) + { return(*(const char **)0); } + +#undef _nc_strfnames +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const chtype *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const chtype *buf, + int len) + { return(*(const char **)0); } + +/* ./tinfo/alloc_entry.c */ + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-lncursestw b/contrib/ncurses/ncurses/llib-lncursestw new file mode 100644 index 00000000..3aa57eee --- /dev/null +++ b/contrib/ncurses/ncurses/llib-lncursestw @@ -0,0 +1,5628 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2009-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2009-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tty/hardscroll.c */ + +#include + +#undef _nc_oldnums +int *_nc_oldnums; + +#undef _nc_scroll_optimize_sp +void _nc_scroll_optimize_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_scroll_optimize +void _nc_scroll_optimize(void) + { /* void */ } + +#undef _nc_linedump_sp +void _nc_linedump_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_linedump +void _nc_linedump(void) + { /* void */ } + +/* ./tty/hashmap.c */ + +#undef _nc_hash_map_sp +void _nc_hash_map_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_hash_map +void _nc_hash_map(void) + { /* void */ } + +#undef _nc_make_oldhash_sp +void _nc_make_oldhash_sp( + SCREEN *sp, + int i) + { /* void */ } + +#undef _nc_make_oldhash +void _nc_make_oldhash( + int i) + { /* void */ } + +#undef _nc_scroll_oldhash_sp +void _nc_scroll_oldhash_sp( + SCREEN *sp, + int n, + int top, + int bot) + { /* void */ } + +#undef _nc_scroll_oldhash +void _nc_scroll_oldhash( + int n, + int top, + int bot) + { /* void */ } + +/* ./base/lib_addch.c */ + +#undef _nc_render +cchar_t _nc_render( + WINDOW *win, + cchar_t ch) + { return(*(cchar_t *)0); } + +#undef _nc_build_wch +int _nc_build_wch( + WINDOW *win, + cchar_t *ch) + { return(*(int *)0); } + +#undef _nc_waddch_nosync +int _nc_waddch_nosync( + WINDOW *win, + const cchar_t c) + { return(*(int *)0); } + +#undef waddch +int waddch( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +#undef wechochar +int wechochar( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_addstr.c */ + +#undef waddnstr +int waddnstr( + WINDOW *win, + const char *astr, + int n) + { return(*(int *)0); } + +#undef waddchnstr +int waddchnstr( + WINDOW *win, + const chtype *astr, + int n) + { return(*(int *)0); } + +#undef _nc_wchstrlen +int _nc_wchstrlen( + const cchar_t *s) + { return(*(int *)0); } + +#undef wadd_wchnstr +int wadd_wchnstr( + WINDOW *win, + const cchar_t *astr, + int n) + { return(*(int *)0); } + +#undef waddnwstr +int waddnwstr( + WINDOW *win, + const wchar_t *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_beep.c */ + +#undef beep_sp +int beep_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef beep +int beep(void) + { return(*(int *)0); } + +/* ./base/lib_bkgd.c */ + +#undef wbkgrndset +void wbkgrndset( + WINDOW *win, + const cchar_t *ch) + { /* void */ } + +#undef wbkgdset +void wbkgdset( + WINDOW *win, + chtype ch) + { /* void */ } + +#undef wbkgrnd +int wbkgrnd( + WINDOW *win, + const cchar_t *ch) + { return(*(int *)0); } + +#undef wbkgd +int wbkgd( + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +/* ./base/lib_box.c */ + +#undef wborder +int wborder( + WINDOW *win, + chtype ls, + chtype rs, + chtype ts, + chtype bs, + chtype tl, + chtype tr, + chtype bl, + chtype br) + { return(*(int *)0); } + +/* ./base/lib_chgat.c */ + +#undef wchgat +int wchgat( + WINDOW *win, + int n, + attr_t attr, + short pair_arg, + const void *opts) + { return(*(int *)0); } + +/* ./base/lib_clear.c */ + +#undef wclear +int wclear( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clearok.c */ + +#undef clearok +int clearok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_clrbot.c */ + +#undef wclrtobot +int wclrtobot( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clreol.c */ + +#undef wclrtoeol +int wclrtoeol( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_color.c */ + +#undef _nc_COLOR_PAIRS +int _nc_COLOR_PAIRS(void) + { return(*(int *)0); } + +#undef _nc_COLORS +int _nc_COLORS(void) + { return(*(int *)0); } + +#undef _nc_reset_colors_sp +NCURSES_BOOL _nc_reset_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_reset_colors +NCURSES_BOOL _nc_reset_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef start_color_sp +int start_color_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef start_color +int start_color(void) + { return(*(int *)0); } + +#undef _nc_change_pair +void _nc_change_pair( + SCREEN *sp, + int pair) + { /* void */ } + +#undef _nc_reserve_pairs +void _nc_reserve_pairs( + SCREEN *sp, + int want) + { /* void */ } + +#undef _nc_init_pair +int _nc_init_pair( + SCREEN *sp, + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_pair_sp +int init_pair_sp( + SCREEN *sp, + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef init_pair +int init_pair( + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef _nc_init_color +int _nc_init_color( + SCREEN *sp, + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef init_color_sp +int init_color_sp( + SCREEN *sp, + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef init_color +int init_color( + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef can_change_color_sp +NCURSES_BOOL can_change_color_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef can_change_color +NCURSES_BOOL can_change_color(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors_sp +NCURSES_BOOL has_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors +NCURSES_BOOL has_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef color_content_sp +int color_content_sp( + SCREEN *sp, + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef color_content +int color_content( + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef _nc_pair_content +int _nc_pair_content( + SCREEN *sp, + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef pair_content_sp +int pair_content_sp( + SCREEN *sp, + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef pair_content +int pair_content( + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef _nc_do_color_sp +void _nc_do_color_sp( + SCREEN *sp, + int old_pair, + int pair, + int reverse, + NCURSES_OUTC_sp outc) + { /* void */ } + +#undef _nc_do_color +void _nc_do_color( + int old_pair, + int pair, + int reverse, + NCURSES_OUTC outc) + { /* void */ } + +#undef init_extended_pair_sp +int init_extended_pair_sp( + SCREEN *sp, + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_extended_color_sp +int init_extended_color_sp( + SCREEN *sp, + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef extended_color_content_sp +int extended_color_content_sp( + SCREEN *sp, + int color, + int *r, + int *g, + int *b) + { return(*(int *)0); } + +#undef extended_pair_content_sp +int extended_pair_content_sp( + SCREEN *sp, + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef reset_color_pairs_sp +void reset_color_pairs_sp( + SCREEN *sp) + { /* void */ } + +#undef init_extended_pair +int init_extended_pair( + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_extended_color +int init_extended_color( + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef extended_color_content +int extended_color_content( + int color, + int *r, + int *g, + int *b) + { return(*(int *)0); } + +#undef extended_pair_content +int extended_pair_content( + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef reset_color_pairs +void reset_color_pairs(void) + { /* void */ } + +/* ./base/lib_colorset.c */ + +#undef wcolor_set +int wcolor_set( + WINDOW *win, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_delch.c */ + +#undef wdelch +int wdelch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_delwin.c */ + +#undef delwin +int delwin( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_echo.c */ + +#undef echo_sp +int echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef echo +int echo(void) + { return(*(int *)0); } + +#undef noecho_sp +int noecho_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noecho +int noecho(void) + { return(*(int *)0); } + +/* ./base/lib_endwin.c */ + +#undef endwin_sp +int endwin_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef endwin +int endwin(void) + { return(*(int *)0); } + +/* ./base/lib_erase.c */ + +#undef werase +int werase( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_flash.c */ + +#undef flash_sp +int flash_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flash +int flash(void) + { return(*(int *)0); } + +/* ./lib_gen.c */ + +#undef addch +int addch( + const chtype z) + { return(*(int *)0); } + +#undef addchnstr +int addchnstr( + const chtype *a1, + int z) + { return(*(int *)0); } + +#undef addchstr +int addchstr( + const chtype *z) + { return(*(int *)0); } + +#undef addnstr +int addnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef addstr +int addstr( + const char *z) + { return(*(int *)0); } + +#undef attroff +int attroff( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attron +int attron( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attrset +int attrset( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attr_get +int attr_get( + attr_t *a1, + short *a2, + void *z) + { return(*(int *)0); } + +#undef attr_off +int attr_off( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_on +int attr_on( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_set +int attr_set( + attr_t a1, + short a2, + void *z) + { return(*(int *)0); } + +#undef bkgd +int bkgd( + chtype z) + { return(*(int *)0); } + +#undef bkgdset +void bkgdset( + chtype z) + { /* void */ } + +#undef border +int border( + chtype a1, + chtype a2, + chtype a3, + chtype a4, + chtype a5, + chtype a6, + chtype a7, + chtype z) + { return(*(int *)0); } + +#undef box +int box( + WINDOW *a1, + chtype a2, + chtype z) + { return(*(int *)0); } + +#undef chgat +int chgat( + int a1, + attr_t a2, + short a3, + const void *z) + { return(*(int *)0); } + +#undef clear +int clear(void) + { return(*(int *)0); } + +#undef clrtobot +int clrtobot(void) + { return(*(int *)0); } + +#undef clrtoeol +int clrtoeol(void) + { return(*(int *)0); } + +#undef color_set +int color_set( + short a1, + void *z) + { return(*(int *)0); } + +#undef COLOR_PAIR +int COLOR_PAIR( + int z) + { return(*(int *)0); } + +#undef delch +int delch(void) + { return(*(int *)0); } + +#undef deleteln +int deleteln(void) + { return(*(int *)0); } + +#undef echochar +int echochar( + const chtype z) + { return(*(int *)0); } + +#undef erase +int erase(void) + { return(*(int *)0); } + +#undef getbkgd +chtype getbkgd( + WINDOW *z) + { return(*(chtype *)0); } + +#undef getch +int getch(void) + { return(*(int *)0); } + +#undef getnstr +int getnstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef getstr +int getstr( + char *z) + { return(*(int *)0); } + +#undef hline +int hline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef inch +chtype inch(void) + { return(*(chtype *)0); } + +#undef inchnstr +int inchnstr( + chtype *a1, + int z) + { return(*(int *)0); } + +#undef inchstr +int inchstr( + chtype *z) + { return(*(int *)0); } + +#undef innstr +int innstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef insch +int insch( + chtype z) + { return(*(int *)0); } + +#undef insdelln +int insdelln( + int z) + { return(*(int *)0); } + +#undef insertln +int insertln(void) + { return(*(int *)0); } + +#undef insnstr +int insnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef insstr +int insstr( + const char *z) + { return(*(int *)0); } + +#undef instr +int instr( + char *z) + { return(*(int *)0); } + +#undef move +int move( + int a1, + int z) + { return(*(int *)0); } + +#undef mvaddch +int mvaddch( + int a1, + int a2, + const chtype z) + { return(*(int *)0); } + +#undef mvaddchnstr +int mvaddchnstr( + int a1, + int a2, + const chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvaddchstr +int mvaddchstr( + int a1, + int a2, + const chtype *z) + { return(*(int *)0); } + +#undef mvaddnstr +int mvaddnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvaddstr +int mvaddstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvchgat +int mvchgat( + int a1, + int a2, + int a3, + attr_t a4, + short a5, + const void *z) + { return(*(int *)0); } + +#undef mvdelch +int mvdelch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetch +int mvgetch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetnstr +int mvgetnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvgetstr +int mvgetstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvhline +int mvhline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvinch +chtype mvinch( + int a1, + int z) + { return(*(chtype *)0); } + +#undef mvinchnstr +int mvinchnstr( + int a1, + int a2, + chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvinchstr +int mvinchstr( + int a1, + int a2, + chtype *z) + { return(*(int *)0); } + +#undef mvinnstr +int mvinnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsch +int mvinsch( + int a1, + int a2, + chtype z) + { return(*(int *)0); } + +#undef mvinsnstr +int mvinsnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsstr +int mvinsstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvinstr +int mvinstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvvline +int mvvline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvwaddch +int mvwaddch( + WINDOW *a1, + int a2, + int a3, + const chtype z) + { return(*(int *)0); } + +#undef mvwaddchnstr +int mvwaddchnstr( + WINDOW *a1, + int a2, + int a3, + const chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddchstr +int mvwaddchstr( + WINDOW *a1, + int a2, + int a3, + const chtype *z) + { return(*(int *)0); } + +#undef mvwaddnstr +int mvwaddnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddstr +int mvwaddstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwchgat +int mvwchgat( + WINDOW *a1, + int a2, + int a3, + int a4, + attr_t a5, + short a6, + const void *z) + { return(*(int *)0); } + +#undef mvwdelch +int mvwdelch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetch +int mvwgetch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetnstr +int mvwgetnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwgetstr +int mvwgetstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwhline +int mvwhline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef mvwinch +chtype mvwinch( + WINDOW *a1, + int a2, + int z) + { return(*(chtype *)0); } + +#undef mvwinchnstr +int mvwinchnstr( + WINDOW *a1, + int a2, + int a3, + chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwinchstr +int mvwinchstr( + WINDOW *a1, + int a2, + int a3, + chtype *z) + { return(*(int *)0); } + +#undef mvwinnstr +int mvwinnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsch +int mvwinsch( + WINDOW *a1, + int a2, + int a3, + chtype z) + { return(*(int *)0); } + +#undef mvwinsnstr +int mvwinsnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsstr +int mvwinsstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwinstr +int mvwinstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwvline +int mvwvline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef PAIR_NUMBER +int PAIR_NUMBER( + int z) + { return(*(int *)0); } + +#undef redrawwin +int redrawwin( + WINDOW *z) + { return(*(int *)0); } + +#undef refresh +int refresh(void) + { return(*(int *)0); } + +#undef scrl +int scrl( + int z) + { return(*(int *)0); } + +#undef scroll +int scroll( + WINDOW *z) + { return(*(int *)0); } + +#undef setscrreg +int setscrreg( + int a1, + int z) + { return(*(int *)0); } + +#undef slk_attr_off +int slk_attr_off( + const attr_t a1, + void *z) + { return(*(int *)0); } + +#undef slk_attr_on +int slk_attr_on( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef standout +int standout(void) + { return(*(int *)0); } + +#undef standend +int standend(void) + { return(*(int *)0); } + +#undef timeout +void timeout( + int z) + { /* void */ } + +#undef touchline +int touchline( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef touchwin +int touchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef untouchwin +int untouchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef vline +int vline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef waddchstr +int waddchstr( + WINDOW *a1, + const chtype *z) + { return(*(int *)0); } + +#undef waddstr +int waddstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef wattron +int wattron( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattroff +int wattroff( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattrset +int wattrset( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattr_get +int wattr_get( + WINDOW *a1, + attr_t *a2, + short *a3, + void *z) + { return(*(int *)0); } + +#undef wattr_set +int wattr_set( + WINDOW *a1, + attr_t a2, + short a3, + void *z) + { return(*(int *)0); } + +#undef wdeleteln +int wdeleteln( + WINDOW *z) + { return(*(int *)0); } + +#undef wgetstr +int wgetstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef winchstr +int winchstr( + WINDOW *a1, + chtype *z) + { return(*(int *)0); } + +#undef winsertln +int winsertln( + WINDOW *z) + { return(*(int *)0); } + +#undef winsstr +int winsstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef winstr +int winstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef wstandout +int wstandout( + WINDOW *z) + { return(*(int *)0); } + +#undef wstandend +int wstandend( + WINDOW *z) + { return(*(int *)0); } + +#undef getattrs +int getattrs( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcurx +int getcurx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcury +int getcury( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegx +int getbegx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegy +int getbegy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxx +int getmaxx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxy +int getmaxy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getparx +int getparx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getpary +int getpary( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetparent +WINDOW *wgetparent( + const WINDOW *z) + { return(*(WINDOW **)0); } + +#undef is_cleared +NCURSES_BOOL is_cleared( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idcok +NCURSES_BOOL is_idcok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idlok +NCURSES_BOOL is_idlok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_immedok +NCURSES_BOOL is_immedok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_keypad +NCURSES_BOOL is_keypad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_leaveok +NCURSES_BOOL is_leaveok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_nodelay +NCURSES_BOOL is_nodelay( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_notimeout +NCURSES_BOOL is_notimeout( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_pad +NCURSES_BOOL is_pad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_scrollok +NCURSES_BOOL is_scrollok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_subwin +NCURSES_BOOL is_subwin( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_syncok +NCURSES_BOOL is_syncok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef wgetdelay +int wgetdelay( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetscrreg +int wgetscrreg( + const WINDOW *a1, + int *a2, + int *z) + { return(*(int *)0); } + +#undef add_wch +int add_wch( + const cchar_t *z) + { return(*(int *)0); } + +#undef add_wchnstr +int add_wchnstr( + const cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef add_wchstr +int add_wchstr( + const cchar_t *z) + { return(*(int *)0); } + +#undef addnwstr +int addnwstr( + const wchar_t *a1, + int z) + { return(*(int *)0); } + +#undef addwstr +int addwstr( + const wchar_t *z) + { return(*(int *)0); } + +#undef bkgrnd +int bkgrnd( + const cchar_t *z) + { return(*(int *)0); } + +#undef bkgrndset +void bkgrndset( + const cchar_t *z) + { /* void */ } + +#undef border_set +int border_set( + const cchar_t *a1, + const cchar_t *a2, + const cchar_t *a3, + const cchar_t *a4, + const cchar_t *a5, + const cchar_t *a6, + const cchar_t *a7, + const cchar_t *z) + { return(*(int *)0); } + +#undef box_set +int box_set( + WINDOW *a1, + const cchar_t *a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef echo_wchar +int echo_wchar( + const cchar_t *z) + { return(*(int *)0); } + +#undef get_wch +int get_wch( + wint_t *z) + { return(*(int *)0); } + +#undef get_wstr +int get_wstr( + wint_t *z) + { return(*(int *)0); } + +#undef getbkgrnd +int getbkgrnd( + cchar_t *z) + { return(*(int *)0); } + +#undef getn_wstr +int getn_wstr( + wint_t *a1, + int z) + { return(*(int *)0); } + +#undef hline_set +int hline_set( + const cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef in_wch +int in_wch( + cchar_t *z) + { return(*(int *)0); } + +#undef in_wchnstr +int in_wchnstr( + cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef in_wchstr +int in_wchstr( + cchar_t *z) + { return(*(int *)0); } + +#undef innwstr +int innwstr( + wchar_t *a1, + int z) + { return(*(int *)0); } + +#undef ins_nwstr +int ins_nwstr( + const wchar_t *a1, + int z) + { return(*(int *)0); } + +#undef ins_wch +int ins_wch( + const cchar_t *z) + { return(*(int *)0); } + +#undef ins_wstr +int ins_wstr( + const wchar_t *z) + { return(*(int *)0); } + +#undef inwstr +int inwstr( + wchar_t *z) + { return(*(int *)0); } + +#undef mvadd_wch +int mvadd_wch( + int a1, + int a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvadd_wchnstr +int mvadd_wchnstr( + int a1, + int a2, + const cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvadd_wchstr +int mvadd_wchstr( + int a1, + int a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvaddnwstr +int mvaddnwstr( + int a1, + int a2, + const wchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvaddwstr +int mvaddwstr( + int a1, + int a2, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvget_wch +int mvget_wch( + int a1, + int a2, + wint_t *z) + { return(*(int *)0); } + +#undef mvget_wstr +int mvget_wstr( + int a1, + int a2, + wint_t *z) + { return(*(int *)0); } + +#undef mvgetn_wstr +int mvgetn_wstr( + int a1, + int a2, + wint_t *a3, + int z) + { return(*(int *)0); } + +#undef mvhline_set +int mvhline_set( + int a1, + int a2, + const cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvin_wch +int mvin_wch( + int a1, + int a2, + cchar_t *z) + { return(*(int *)0); } + +#undef mvin_wchnstr +int mvin_wchnstr( + int a1, + int a2, + cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvin_wchstr +int mvin_wchstr( + int a1, + int a2, + cchar_t *z) + { return(*(int *)0); } + +#undef mvinnwstr +int mvinnwstr( + int a1, + int a2, + wchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvins_nwstr +int mvins_nwstr( + int a1, + int a2, + const wchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvins_wch +int mvins_wch( + int a1, + int a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvins_wstr +int mvins_wstr( + int a1, + int a2, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvinwstr +int mvinwstr( + int a1, + int a2, + wchar_t *z) + { return(*(int *)0); } + +#undef mvvline_set +int mvvline_set( + int a1, + int a2, + const cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvwadd_wch +int mvwadd_wch( + WINDOW *a1, + int a2, + int a3, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvwadd_wchnstr +int mvwadd_wchnstr( + WINDOW *a1, + int a2, + int a3, + const cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwadd_wchstr +int mvwadd_wchstr( + WINDOW *a1, + int a2, + int a3, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvwaddnwstr +int mvwaddnwstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddwstr +int mvwaddwstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvwget_wch +int mvwget_wch( + WINDOW *a1, + int a2, + int a3, + wint_t *z) + { return(*(int *)0); } + +#undef mvwget_wstr +int mvwget_wstr( + WINDOW *a1, + int a2, + int a3, + wint_t *z) + { return(*(int *)0); } + +#undef mvwgetn_wstr +int mvwgetn_wstr( + WINDOW *a1, + int a2, + int a3, + wint_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwhline_set +int mvwhline_set( + WINDOW *a1, + int a2, + int a3, + const cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwin_wch +int mvwin_wch( + WINDOW *a1, + int a2, + int a3, + cchar_t *z) + { return(*(int *)0); } + +#undef mvwin_wchnstr +int mvwin_wchnstr( + WINDOW *a1, + int a2, + int a3, + cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwin_wchstr +int mvwin_wchstr( + WINDOW *a1, + int a2, + int a3, + cchar_t *z) + { return(*(int *)0); } + +#undef mvwinnwstr +int mvwinnwstr( + WINDOW *a1, + int a2, + int a3, + wchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwins_nwstr +int mvwins_nwstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwins_wch +int mvwins_wch( + WINDOW *a1, + int a2, + int a3, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvwins_wstr +int mvwins_wstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvwinwstr +int mvwinwstr( + WINDOW *a1, + int a2, + int a3, + wchar_t *z) + { return(*(int *)0); } + +#undef mvwvline_set +int mvwvline_set( + WINDOW *a1, + int a2, + int a3, + const cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef vline_set +int vline_set( + const cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef wadd_wchstr +int wadd_wchstr( + WINDOW *a1, + const cchar_t *z) + { return(*(int *)0); } + +#undef waddwstr +int waddwstr( + WINDOW *a1, + const wchar_t *z) + { return(*(int *)0); } + +#undef wget_wstr +int wget_wstr( + WINDOW *a1, + wint_t *z) + { return(*(int *)0); } + +#undef wgetbkgrnd +int wgetbkgrnd( + WINDOW *a1, + cchar_t *z) + { return(*(int *)0); } + +#undef win_wchstr +int win_wchstr( + WINDOW *a1, + cchar_t *z) + { return(*(int *)0); } + +#undef wins_wstr +int wins_wstr( + WINDOW *a1, + const wchar_t *z) + { return(*(int *)0); } + +#undef mouse_trafo +NCURSES_BOOL mouse_trafo( + int *a1, + int *a2, + NCURSES_BOOL z) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_getch.c */ + +#undef _nc_ESCDELAY +int _nc_ESCDELAY(void) + { return(*(int *)0); } + +#undef _nc_ptr_Escdelay +int *_nc_ptr_Escdelay( + SCREEN *sp) + { return(*(int **)0); } + +#undef set_escdelay_sp +int set_escdelay_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_escdelay +int set_escdelay( + int value) + { return(*(int *)0); } + +#undef get_escdelay_sp +int get_escdelay_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef get_escdelay +int get_escdelay(void) + { return(*(int *)0); } + +#undef _nc_wgetch +int _nc_wgetch( + WINDOW *win, + int *result, + int use_meta) + { return(*(int *)0); } + +#undef wgetch +int wgetch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_getstr.c */ + +#undef wgetnstr +int wgetnstr( + WINDOW *win, + char *str, + int maxlen) + { return(*(int *)0); } + +/* ./base/lib_hline.c */ + +#undef whline +int whline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_immedok.c */ + +#undef immedok +void immedok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +/* ./base/lib_inchstr.c */ + +#undef winchnstr +int winchnstr( + WINDOW *win, + chtype *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_initscr.c */ + +#undef initscr +WINDOW *initscr(void) + { return(*(WINDOW **)0); } + +/* ./base/lib_insch.c */ + +#undef _nc_insert_ch +int _nc_insert_ch( + SCREEN *sp, + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +#undef winsch +int winsch( + WINDOW *win, + chtype c) + { return(*(int *)0); } + +/* ./base/lib_insdel.c */ + +#undef winsdelln +int winsdelln( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_insnstr.c */ + +#undef winsnstr +int winsnstr( + WINDOW *win, + const char *s, + int n) + { return(*(int *)0); } + +/* ./base/lib_instr.c */ + +#undef winnstr +int winnstr( + WINDOW *win, + char *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_isendwin.c */ + +#undef isendwin_sp +NCURSES_BOOL isendwin_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef isendwin +NCURSES_BOOL isendwin(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_leaveok.c */ + +#undef leaveok +int leaveok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_mouse.c */ + +#undef getmouse_sp +int getmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef getmouse +int getmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse_sp +int ungetmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse +int ungetmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef mousemask_sp +mmask_t mousemask_sp( + SCREEN *sp, + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef mousemask +mmask_t mousemask( + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef wenclose +NCURSES_BOOL wenclose( + const WINDOW *win, + int y, + int x) + { return(*(NCURSES_BOOL *)0); } + +#undef mouseinterval_sp +int mouseinterval_sp( + SCREEN *sp, + int maxclick) + { return(*(int *)0); } + +#undef mouseinterval +int mouseinterval( + int maxclick) + { return(*(int *)0); } + +#undef _nc_has_mouse +NCURSES_BOOL _nc_has_mouse( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse_sp +NCURSES_BOOL has_mouse_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse +NCURSES_BOOL has_mouse(void) + { return(*(NCURSES_BOOL *)0); } + +#undef wmouse_trafo +NCURSES_BOOL wmouse_trafo( + const WINDOW *win, + int *pY, + int *pX, + NCURSES_BOOL to_screen) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_move.c */ + +#undef wmove +int wmove( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +/* ./tty/lib_mvcur.c */ + +#undef _nc_msec_cost_sp +int _nc_msec_cost_sp( + SCREEN *sp, + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_msec_cost +int _nc_msec_cost( + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_mvcur_resume_sp +void _nc_mvcur_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_resume +void _nc_mvcur_resume(void) + { /* void */ } + +#undef _nc_mvcur_init_sp +void _nc_mvcur_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_init +void _nc_mvcur_init(void) + { /* void */ } + +#undef _nc_mvcur_wrap_sp +void _nc_mvcur_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_wrap +void _nc_mvcur_wrap(void) + { /* void */ } + +#undef _nc_mvcur_sp +int _nc_mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_mvcur +int _nc_mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur_sp +int mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur +int mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_optimize_enable +int _nc_optimize_enable; + +/* ./base/lib_mvwin.c */ + +#undef mvwin +int mvwin( + WINDOW *win, + int by, + int bx) + { return(*(int *)0); } + +/* ./base/lib_newterm.c */ + +#undef filter_sp +void filter_sp( + SCREEN *sp) + { /* void */ } + +#undef filter +void filter(void) + { /* void */ } + +#undef nofilter_sp +void nofilter_sp( + SCREEN *sp) + { /* void */ } + +#undef nofilter +void nofilter(void) + { /* void */ } + +#undef newterm_sp +SCREEN *newterm_sp( + SCREEN *sp, + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +#undef newterm +SCREEN *newterm( + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +/* ./base/lib_newwin.c */ + +#undef _nc_freewin +int _nc_freewin( + WINDOW *win) + { return(*(int *)0); } + +#undef newwin_sp +WINDOW *newwin_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef newwin +WINDOW *newwin( + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef derwin +WINDOW *derwin( + WINDOW *orig, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef subwin +WINDOW *subwin( + WINDOW *w, + int l, + int c, + int y, + int x) + { return(*(WINDOW **)0); } + +#undef _nc_makenew_sp +WINDOW *_nc_makenew_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx, + int flags) + { return(*(WINDOW **)0); } + +#undef _nc_curscr_of +WINDOW *_nc_curscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_newscr_of +WINDOW *_nc_newscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_stdscr_of +WINDOW *_nc_stdscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +/* ./base/lib_nl.c */ + +#undef nl_sp +int nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nl +int nl(void) + { return(*(int *)0); } + +#undef nonl_sp +int nonl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nonl +int nonl(void) + { return(*(int *)0); } + +/* ./base/lib_overlay.c */ + +#undef overlay +int overlay( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef overwrite +int overwrite( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef copywin +int copywin( + const WINDOW *src, + WINDOW *dst, + int sminrow, + int smincol, + int dminrow, + int dmincol, + int dmaxrow, + int dmaxcol, + int over) + { return(*(int *)0); } + +/* ./base/lib_pad.c */ + +#undef newpad_sp +WINDOW *newpad_sp( + SCREEN *sp, + int l, + int c) + { return(*(WINDOW **)0); } + +#undef newpad +WINDOW *newpad( + int l, + int c) + { return(*(WINDOW **)0); } + +#undef subpad +WINDOW *subpad( + WINDOW *orig, + int l, + int c, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef prefresh +int prefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pnoutrefresh +int pnoutrefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pechochar +int pechochar( + WINDOW *pad, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_printw.c */ + +#undef printw +int printw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wprintw +int wprintw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvprintw +int mvprintw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwprintw +int mvwprintw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef vwprintw +int vwprintw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_printw +int vw_printw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +/* ./base/lib_redrawln.c */ + +#undef wredrawln +int wredrawln( + WINDOW *win, + int beg, + int num) + { return(*(int *)0); } + +/* ./base/lib_refresh.c */ + +#undef wrefresh +int wrefresh( + WINDOW *win) + { return(*(int *)0); } + +#undef wnoutrefresh +int wnoutrefresh( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_restart.c */ + +#undef restartterm_sp +int restartterm_sp( + SCREEN *sp, + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +#undef restartterm +int restartterm( + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +/* ./base/lib_scanw.c */ + +#undef vwscanw +int vwscanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_scanw +int vw_scanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef scanw +int scanw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wscanw +int wscanw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvscanw +int mvscanw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwscanw +int mvwscanw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +/* ./base/lib_screen.c */ + +#undef getwin_sp +WINDOW *getwin_sp( + SCREEN *sp, + FILE *filep) + { return(*(WINDOW **)0); } + +#undef getwin +WINDOW *getwin( + FILE *filep) + { return(*(WINDOW **)0); } + +#undef putwin +int putwin( + WINDOW *win, + FILE *filep) + { return(*(int *)0); } + +#undef scr_restore_sp +int scr_restore_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_restore +int scr_restore( + const char *file) + { return(*(int *)0); } + +#undef scr_dump +int scr_dump( + const char *file) + { return(*(int *)0); } + +#undef scr_init_sp +int scr_init_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_init +int scr_init( + const char *file) + { return(*(int *)0); } + +#undef scr_set_sp +int scr_set_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_set +int scr_set( + const char *file) + { return(*(int *)0); } + +/* ./base/lib_scroll.c */ + +#undef _nc_scroll_window +void _nc_scroll_window( + WINDOW *win, + int const n, + int const top, + int const bottom, + cchar_t blank) + { /* void */ } + +#undef wscrl +int wscrl( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_scrollok.c */ + +#undef scrollok +int scrollok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_scrreg.c */ + +#undef wsetscrreg +int wsetscrreg( + WINDOW *win, + int top, + int bottom) + { return(*(int *)0); } + +/* ./base/lib_set_term.c */ + +#undef set_term +SCREEN *set_term( + SCREEN *screenp) + { return(*(SCREEN **)0); } + +#undef delscreen +void delscreen( + SCREEN *sp) + { /* void */ } + +#undef _nc_setupscreen_sp +int _nc_setupscreen_sp( + SCREEN **spp, + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_setupscreen +int _nc_setupscreen( + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_ripoffline_sp +int _nc_ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef _nc_ripoffline +int _nc_ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline_sp +int ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline +int ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +/* ./base/lib_slk.c */ + +#undef _nc_format_slks +int _nc_format_slks( + SCREEN *sp, + int cols) + { return(*(int *)0); } + +#undef _nc_slk_initialize +int _nc_slk_initialize( + WINDOW *stwin, + int cols) + { return(*(int *)0); } + +#undef slk_restore_sp +int slk_restore_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_restore +int slk_restore(void) + { return(*(int *)0); } + +/* ./base/lib_slkatr_set.c */ + +#undef slk_attr_set_sp +int slk_attr_set_sp( + SCREEN *sp, + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef slk_attr_set +int slk_attr_set( + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_slkatrof.c */ + +#undef slk_attroff_sp +int slk_attroff_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attroff +int slk_attroff( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatron.c */ + +#undef slk_attron_sp +int slk_attron_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attron +int slk_attron( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatrset.c */ + +#undef slk_attrset_sp +int slk_attrset_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attrset +int slk_attrset( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkattr.c */ + +#undef slk_attr_sp +attr_t slk_attr_sp( + SCREEN *sp) + { return(*(attr_t *)0); } + +#undef slk_attr +attr_t slk_attr(void) + { return(*(attr_t *)0); } + +/* ./base/lib_slkclear.c */ + +#undef slk_clear_sp +int slk_clear_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_clear +int slk_clear(void) + { return(*(int *)0); } + +/* ./base/lib_slkcolor.c */ + +#undef slk_color_sp +int slk_color_sp( + SCREEN *sp, + short pair_arg) + { return(*(int *)0); } + +#undef slk_color +int slk_color( + short pair_arg) + { return(*(int *)0); } + +#undef extended_slk_color_sp +int extended_slk_color_sp( + SCREEN *sp, + int pair_arg) + { return(*(int *)0); } + +#undef extended_slk_color +int extended_slk_color( + int pair_arg) + { return(*(int *)0); } + +/* ./base/lib_slkinit.c */ + +#undef slk_init_sp +int slk_init_sp( + SCREEN *sp, + int format) + { return(*(int *)0); } + +#undef slk_init +int slk_init( + int format) + { return(*(int *)0); } + +/* ./base/lib_slklab.c */ + +#undef slk_label_sp +char *slk_label_sp( + SCREEN *sp, + int n) + { return(*(char **)0); } + +#undef slk_label +char *slk_label( + int n) + { return(*(char **)0); } + +/* ./base/lib_slkrefr.c */ + +#undef slk_noutrefresh_sp +int slk_noutrefresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_noutrefresh +int slk_noutrefresh(void) + { return(*(int *)0); } + +#undef slk_refresh_sp +int slk_refresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_refresh +int slk_refresh(void) + { return(*(int *)0); } + +/* ./base/lib_slkset.c */ + +#undef slk_set_sp +int slk_set_sp( + SCREEN *sp, + int i, + const char *astr, + int format) + { return(*(int *)0); } + +#undef slk_set +int slk_set( + int i, + const char *astr, + int format) + { return(*(int *)0); } + +/* ./base/lib_slktouch.c */ + +#undef slk_touch_sp +int slk_touch_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_touch +int slk_touch(void) + { return(*(int *)0); } + +/* ./base/lib_touch.c */ + +#undef is_linetouched +NCURSES_BOOL is_linetouched( + WINDOW *win, + int line) + { return(*(NCURSES_BOOL *)0); } + +#undef is_wintouched +NCURSES_BOOL is_wintouched( + WINDOW *win) + { return(*(NCURSES_BOOL *)0); } + +#undef wtouchln +int wtouchln( + WINDOW *win, + int y, + int n, + int changed) + { return(*(int *)0); } + +/* ./trace/lib_tracedmp.c */ + +#undef _tracedump +void _tracedump( + const char *name, + WINDOW *win) + { /* void */ } + +/* ./trace/lib_tracemse.c */ + +#undef _nc_trace_mmask_t +char *_nc_trace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(char **)0); } + +#undef _nc_tracemouse +char *_nc_tracemouse( + SCREEN *sp, + MEVENT const *ep) + { return(*(char **)0); } + +#undef _nc_retrace_mmask_t +mmask_t _nc_retrace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(mmask_t *)0); } + +#undef _tracemouse +char *_tracemouse( + MEVENT const *ep) + { return(*(char **)0); } + +/* ./tty/lib_tstp.c */ + +#undef _nc_signal_handler +void _nc_signal_handler( + int enable) + { /* void */ } + +/* ./base/lib_ungetch.c */ + +#undef _nc_fifo_dump +void _nc_fifo_dump( + SCREEN *sp) + { /* void */ } + +#undef ungetch_sp +int ungetch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef ungetch +int ungetch( + int ch) + { return(*(int *)0); } + +/* ./tty/lib_vidattr.c */ + +#undef vidputs_sp +int vidputs_sp( + SCREEN *sp, + chtype newmode, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef vidputs +int vidputs( + chtype newmode, + NCURSES_OUTC outc) + { return(*(int *)0); } + +#undef vidattr_sp +int vidattr_sp( + SCREEN *sp, + chtype newmode) + { return(*(int *)0); } + +#undef vidattr +int vidattr( + chtype newmode) + { return(*(int *)0); } + +#undef termattrs_sp +chtype termattrs_sp( + SCREEN *sp) + { return(*(chtype *)0); } + +#undef termattrs +chtype termattrs(void) + { return(*(chtype *)0); } + +/* ./base/lib_vline.c */ + +#undef wvline +int wvline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_wattroff.c */ + +#undef wattr_off +int wattr_off( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_wattron.c */ + +#undef wattr_on +int wattr_on( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_winch.c */ + +#undef winch +chtype winch( + WINDOW *win) + { return(*(chtype *)0); } + +/* ./base/lib_window.c */ + +#undef _nc_synchook +void _nc_synchook( + WINDOW *win) + { /* void */ } + +#undef mvderwin +int mvderwin( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +#undef syncok +int syncok( + WINDOW *win, + NCURSES_BOOL bf) + { return(*(int *)0); } + +#undef wsyncup +void wsyncup( + WINDOW *win) + { /* void */ } + +#undef wsyncdown +void wsyncdown( + WINDOW *win) + { /* void */ } + +#undef wcursyncup +void wcursyncup( + WINDOW *win) + { /* void */ } + +#undef dupwin +WINDOW *dupwin( + WINDOW *win) + { return(*(WINDOW **)0); } + +/* ./base/nc_panel.c */ + +#undef _nc_panelhook_sp +struct panelhook *_nc_panelhook_sp( + SCREEN *sp) + { return(*(struct panelhook **)0); } + +#undef _nc_panelhook +struct panelhook *_nc_panelhook(void) + { return(*(struct panelhook **)0); } + +/* ./base/safe_sprintf.c */ + +#undef _nc_printf_string_sp +char *_nc_printf_string_sp( + SCREEN *sp, + const char *fmt, + va_list ap) + { return(*(char **)0); } + +#undef _nc_printf_string +char *_nc_printf_string( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./tty/tty_update.c */ + +#undef doupdate_sp +int doupdate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef doupdate +int doupdate(void) + { return(*(int *)0); } + +#undef _nc_scrolln_sp +int _nc_scrolln_sp( + SCREEN *sp, + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_scrolln +int _nc_scrolln( + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_screen_resume_sp +void _nc_screen_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_resume +void _nc_screen_resume(void) + { /* void */ } + +#undef _nc_screen_init_sp +void _nc_screen_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_init +void _nc_screen_init(void) + { /* void */ } + +#undef _nc_screen_wrap_sp +void _nc_screen_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_wrap +void _nc_screen_wrap(void) + { /* void */ } + +#undef _nc_do_xmc_glitch_sp +void _nc_do_xmc_glitch_sp( + SCREEN *sp, + attr_t previous) + { /* void */ } + +#undef _nc_do_xmc_glitch +void _nc_do_xmc_glitch( + attr_t previous) + { /* void */ } + +/* ./trace/varargs.c */ + +#undef _nc_varargs +char *_nc_varargs( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./base/vsscanf.c */ + +#undef _nc_vsscanf +void _nc_vsscanf(void) + { /* void */ } + +/* ./base/lib_freeall.c */ + +#undef _nc_freeall +void _nc_freeall(void) + { /* void */ } + +#undef _nc_free_and_exit_sp +void _nc_free_and_exit_sp( + SCREEN *sp, + int code) + { /* void */ } + +#undef _nc_free_and_exit +void _nc_free_and_exit( + int code) + { /* void */ } + +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + +/* ./widechar/charable.c */ + +#undef _nc_is_charable +NCURSES_BOOL _nc_is_charable( + wchar_t ch) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_to_char +int _nc_to_char( + wint_t ch) + { return(*(int *)0); } + +#undef _nc_to_widechar +wint_t _nc_to_widechar( + int ch) + { return(*(wint_t *)0); } + +/* ./widechar/lib_add_wch.c */ + +#undef wadd_wch +int wadd_wch( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +#undef wecho_wchar +int wecho_wchar( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +/* ./widechar/lib_box_set.c */ + +#undef wborder_set +int wborder_set( + WINDOW *win, + const cchar_t *ls, + const cchar_t *rs, + const cchar_t *ts, + const cchar_t *bs, + const cchar_t *tl, + const cchar_t *tr, + const cchar_t *bl, + const cchar_t *br) + { return(*(int *)0); } + +/* ./widechar/lib_cchar.c */ + +#undef setcchar +int setcchar( + cchar_t *wcval, + const wchar_t *wch, + const attr_t attrs, + short pair_arg, + const void *opts) + { return(*(int *)0); } + +#undef getcchar +int getcchar( + const cchar_t *wcval, + wchar_t *wch, + attr_t *attrs, + short *pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./widechar/lib_erasewchar.c */ + +#undef erasewchar_sp +int erasewchar_sp( + SCREEN *sp, + wchar_t *wch) + { return(*(int *)0); } + +#undef erasewchar +int erasewchar( + wchar_t *wch) + { return(*(int *)0); } + +#undef killwchar_sp +int killwchar_sp( + SCREEN *sp, + wchar_t *wch) + { return(*(int *)0); } + +#undef killwchar +int killwchar( + wchar_t *wch) + { return(*(int *)0); } + +/* ./widechar/lib_get_wch.c */ + +#undef wget_wch +int wget_wch( + WINDOW *win, + wint_t *result) + { return(*(int *)0); } + +/* ./widechar/lib_get_wstr.c */ + +#undef wgetn_wstr +int wgetn_wstr( + WINDOW *win, + wint_t *str, + int maxlen) + { return(*(int *)0); } + +/* ./widechar/lib_hline_set.c */ + +#undef whline_set +int whline_set( + WINDOW *win, + const cchar_t *ch, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_in_wch.c */ + +#undef win_wch +int win_wch( + WINDOW *win, + cchar_t *wcval) + { return(*(int *)0); } + +/* ./widechar/lib_in_wchnstr.c */ + +#undef win_wchnstr +int win_wchnstr( + WINDOW *win, + cchar_t *wchstr, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_ins_wch.c */ + +#undef _nc_insert_wch +int _nc_insert_wch( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +#undef wins_wch +int wins_wch( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +#undef wins_nwstr +int wins_nwstr( + WINDOW *win, + const wchar_t *wstr, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_inwstr.c */ + +#undef winnwstr +int winnwstr( + WINDOW *win, + wchar_t *wstr, + int n) + { return(*(int *)0); } + +#undef winwstr +int winwstr( + WINDOW *win, + wchar_t *wstr) + { return(*(int *)0); } + +/* ./widechar/lib_key_name.c */ + +#undef key_name +const char *key_name( + wchar_t c) + { return(*(const char **)0); } + +/* ./widechar/lib_pecho_wchar.c */ + +#undef pecho_wchar +int pecho_wchar( + WINDOW *pad, + const cchar_t *wch) + { return(*(int *)0); } + +/* ./widechar/lib_slk_wset.c */ + +#undef slk_wset +int slk_wset( + int i, + const wchar_t *astr, + int format) + { return(*(int *)0); } + +/* ./widechar/lib_unget_wch.c */ + +#undef _nc_wcrtomb +size_t _nc_wcrtomb( + char *target, + wchar_t source, + mbstate_t *state) + { return(*(size_t *)0); } + +#undef unget_wch_sp +int unget_wch_sp( + SCREEN *sp, + const wchar_t wch) + { return(*(int *)0); } + +#undef unget_wch +int unget_wch( + const wchar_t wch) + { return(*(int *)0); } + +/* ./widechar/lib_vid_attr.c */ + +#undef vid_puts_sp +int vid_puts_sp( + SCREEN *sp, + attr_t newmode, + short pair_arg, + void *opts, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef vid_puts +int vid_puts( + attr_t newmode, + short pair_arg, + void *opts, + NCURSES_OUTC outc) + { return(*(int *)0); } + +#undef vid_attr_sp +int vid_attr_sp( + SCREEN *sp, + attr_t newmode, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef vid_attr +int vid_attr( + attr_t newmode, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef term_attrs_sp +attr_t term_attrs_sp( + SCREEN *sp) + { return(*(attr_t *)0); } + +#undef term_attrs +attr_t term_attrs(void) + { return(*(attr_t *)0); } + +/* ./widechar/lib_vline_set.c */ + +#undef wvline_set +int wvline_set( + WINDOW *win, + const cchar_t *ch, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_wacs.c */ + +#undef _nc_wacs +cchar_t *_nc_wacs; + +#undef _nc_init_wacs +void _nc_init_wacs(void) + { /* void */ } + +/* ./widechar/lib_wunctrl.c */ + +#undef wunctrl_sp +wchar_t *wunctrl_sp( + SCREEN *sp, + cchar_t *wc) + { return(*(wchar_t **)0); } + +#undef wunctrl +wchar_t *wunctrl( + cchar_t *wc) + { return(*(wchar_t **)0); } + +/* ./expanded.c */ + +#undef _nc_toggle_attr_on +void _nc_toggle_attr_on( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_toggle_attr_off +void _nc_toggle_attr_off( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_DelCharCost_sp +int _nc_DelCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost_sp +int _nc_InsCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs_sp +void _nc_UpdateAttrs_sp( + SCREEN *sp, + const cchar_t *c) + { /* void */ } + +#undef _nc_DelCharCost +int _nc_DelCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost +int _nc_InsCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs +void _nc_UpdateAttrs( + const cchar_t *c) + { /* void */ } + +/* ./base/legacy_coding.c */ + +#undef use_legacy_coding_sp +int use_legacy_coding_sp( + SCREEN *sp, + int level) + { return(*(int *)0); } + +#undef use_legacy_coding +int use_legacy_coding( + int level) + { return(*(int *)0); } + +/* ./base/lib_dft_fgbg.c */ + +#undef use_default_colors_sp +int use_default_colors_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_default_colors +int use_default_colors(void) + { return(*(int *)0); } + +#undef assume_default_colors_sp +int assume_default_colors_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef assume_default_colors +int assume_default_colors( + int fg, + int bg) + { return(*(int *)0); } + +/* ./tinfo/lib_print.c */ + +#undef mcprint_sp +int mcprint_sp( + SCREEN *sp, + char *data, + int len) + { return(*(int *)0); } + +#undef mcprint +int mcprint( + char *data, + int len) + { return(*(int *)0); } + +/* ./base/new_pair.c */ + +#undef _nc_free_ordered_pairs +void _nc_free_ordered_pairs( + SCREEN *sp) + { /* void */ } + +#undef _nc_reset_color_pair +void _nc_reset_color_pair( + SCREEN *sp, + int pair, + colorpair_t *next) + { /* void */ } + +#undef _nc_set_color_pair +void _nc_set_color_pair( + SCREEN *sp, + int pair, + int mode) + { /* void */ } + +#undef _nc_copy_pairs +void _nc_copy_pairs( + SCREEN *sp, + colorpair_t *target, + colorpair_t *source, + int length) + { /* void */ } + +#undef alloc_pair_sp +int alloc_pair_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef find_pair_sp +int find_pair_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef free_pair_sp +int free_pair_sp( + SCREEN *sp, + int pair) + { return(*(int *)0); } + +#undef alloc_pair +int alloc_pair( + int f, + int b) + { return(*(int *)0); } + +#undef find_pair +int find_pair( + int f, + int b) + { return(*(int *)0); } + +#undef free_pair +int free_pair( + int pair) + { return(*(int *)0); } + +/* ./base/resizeterm.c */ + +#undef is_term_resized_sp +NCURSES_BOOL is_term_resized_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef is_term_resized +NCURSES_BOOL is_term_resized( + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef resize_term_sp +int resize_term_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resize_term +int resize_term( + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm_sp +int resizeterm_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm +int resizeterm( + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./trace/trace_xnames.c */ + +#undef _nc_trace_xnames +void _nc_trace_xnames( + TERMTYPE *tp) + { /* void */ } + +/* ./tinfo/use_screen.c */ + +#undef use_screen +int use_screen( + SCREEN *screen, + NCURSES_SCREEN_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/use_window.c */ + +#undef use_window +int use_window( + WINDOW *win, + NCURSES_WINDOW_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/wresize.c */ + +#undef wresize +int wresize( + WINDOW *win, + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./tinfo/access.c */ + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE2 *to, + TERMTYPE2 *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +#undef _nc_copy_termtype2 +void _nc_copy_termtype2( + TERMTYPE2 *dst, + const TERMTYPE2 *src) + { /* void */ } + +#undef _nc_export_termtype2 +void _nc_export_termtype2( + TERMTYPE *dst, + const TERMTYPE2 *src) + { /* void */ } + +/* ./codes.c */ + +#undef _nc_boolcodes +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } + +#undef _nc_numcodes +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } + +#undef _nc_strcodes +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE2 *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback2 +const TERMTYPE2 *_nc_fallback2( + const char *name) + { return(*(const TERMTYPE2 **)0); } + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef _nc_acs_map +chtype *_nc_acs_map(void) + { return(*(chtype **)0); } + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef _nc_get_cur_term_sp +TERMINAL *_nc_get_cur_term_sp( + SCREEN *sp) + { return(*(TERMINAL **)0); } + +#undef _nc_get_cur_term +TERMINAL *_nc_get_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef _nc_cur_term +TERMINAL *_nc_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef _nc_stdscr +WINDOW *_nc_stdscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_curscr +WINDOW *_nc_curscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_newscr +WINDOW *_nc_newscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +#undef _nc_init_pthreads +void _nc_init_pthreads(void) + { /* void */ } + +#undef _nc_mutex_init +void _nc_mutex_init( + pthread_mutex_t *obj) + { /* void */ } + +#undef _nc_mutex_lock +int _nc_mutex_lock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_trylock +int _nc_mutex_trylock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_unlock +int _nc_mutex_unlock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef _nc_ttytype +char *_nc_ttytype(void) + { return(*(char **)0); } + +#undef _nc_ptr_Lines +int *_nc_ptr_Lines( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_LINES +int _nc_LINES(void) + { return(*(int *)0); } + +#undef _nc_ptr_Cols +int *_nc_ptr_Cols( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_COLS +int _nc_COLS(void) + { return(*(int *)0); } + +#undef _nc_ptr_Tabsize +int *_nc_ptr_Tabsize( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_TABSIZE +int _nc_TABSIZE(void) + { return(*(int *)0); } + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef _nc_find_prescr +SCREEN *_nc_find_prescr(void) + { return(*(SCREEN **)0); } + +#undef _nc_forget_prescr +void _nc_forget_prescr(void) + { /* void */ } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; + +#undef _nc__nc_tputs_trace +const char *_nc__nc_tputs_trace(void) + { return(*(const char **)0); } + +#undef _nc__nc_outchars +long _nc__nc_outchars(void) + { return(*(long *)0); } + +#undef _nc_set_tputs_trace +void _nc_set_tputs_trace( + const char *s) + { /* void */ } + +#undef _nc_count_outchars +void _nc_count_outchars( + long increment) + { /* void */ } + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +#undef _nc_use_tracef +int _nc_use_tracef( + unsigned mask) + { return(*(int *)0); } + +#undef _nc_locked_tracef +void _nc_locked_tracef( + const char *fmt, + ...) + { /* void */ } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +#undef _tracecchar_t2 +char *_tracecchar_t2( + int bufnum, + const cchar_t *ch) + { return(*(char **)0); } + +#undef _tracecchar_t +char *_tracecchar_t( + const cchar_t *ch) + { return(*(char **)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef _nc_boolnames +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } + +#undef _nc_boolfnames +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } + +#undef _nc_numnames +const char *const *_nc_numnames(void) + { return(*(const char **)0); } + +#undef _nc_numfnames +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } + +#undef _nc_strnames +const char *const *_nc_strnames(void) + { return(*(const char **)0); } + +#undef _nc_strfnames +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE2 *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE2 *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry2 +int _nc_read_entry2( + const char *const name, + char *const filename, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE2 *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswbuf2 +const char *_nc_viswbuf2( + int bufnum, + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbuf +const char *_nc_viswbuf( + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbufn +const char *_nc_viswbufn( + const wchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswibuf +const char *_nc_viswibuf( + const wint_t *buf) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +/* ./tinfo/alloc_entry.c */ + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE2 *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-lncursesw b/contrib/ncurses/ncurses/llib-lncursesw new file mode 100644 index 00000000..dbf535db --- /dev/null +++ b/contrib/ncurses/ncurses/llib-lncursesw @@ -0,0 +1,5507 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2001-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2001-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tty/hardscroll.c */ + +#include + +#undef _nc_oldnums +int *_nc_oldnums; + +#undef _nc_scroll_optimize_sp +void _nc_scroll_optimize_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_scroll_optimize +void _nc_scroll_optimize(void) + { /* void */ } + +#undef _nc_linedump_sp +void _nc_linedump_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_linedump +void _nc_linedump(void) + { /* void */ } + +/* ./tty/hashmap.c */ + +#undef _nc_hash_map_sp +void _nc_hash_map_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_hash_map +void _nc_hash_map(void) + { /* void */ } + +#undef _nc_make_oldhash_sp +void _nc_make_oldhash_sp( + SCREEN *sp, + int i) + { /* void */ } + +#undef _nc_make_oldhash +void _nc_make_oldhash( + int i) + { /* void */ } + +#undef _nc_scroll_oldhash_sp +void _nc_scroll_oldhash_sp( + SCREEN *sp, + int n, + int top, + int bot) + { /* void */ } + +#undef _nc_scroll_oldhash +void _nc_scroll_oldhash( + int n, + int top, + int bot) + { /* void */ } + +/* ./base/lib_addch.c */ + +#undef _nc_render +cchar_t _nc_render( + WINDOW *win, + cchar_t ch) + { return(*(cchar_t *)0); } + +#undef _nc_build_wch +int _nc_build_wch( + WINDOW *win, + cchar_t *ch) + { return(*(int *)0); } + +#undef _nc_waddch_nosync +int _nc_waddch_nosync( + WINDOW *win, + const cchar_t c) + { return(*(int *)0); } + +#undef waddch +int waddch( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +#undef wechochar +int wechochar( + WINDOW *win, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_addstr.c */ + +#undef waddnstr +int waddnstr( + WINDOW *win, + const char *astr, + int n) + { return(*(int *)0); } + +#undef waddchnstr +int waddchnstr( + WINDOW *win, + const chtype *astr, + int n) + { return(*(int *)0); } + +#undef _nc_wchstrlen +int _nc_wchstrlen( + const cchar_t *s) + { return(*(int *)0); } + +#undef wadd_wchnstr +int wadd_wchnstr( + WINDOW *win, + const cchar_t *astr, + int n) + { return(*(int *)0); } + +#undef waddnwstr +int waddnwstr( + WINDOW *win, + const wchar_t *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_beep.c */ + +#undef beep_sp +int beep_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef beep +int beep(void) + { return(*(int *)0); } + +/* ./base/lib_bkgd.c */ + +#undef wbkgrndset +void wbkgrndset( + WINDOW *win, + const cchar_t *ch) + { /* void */ } + +#undef wbkgdset +void wbkgdset( + WINDOW *win, + chtype ch) + { /* void */ } + +#undef wbkgrnd +int wbkgrnd( + WINDOW *win, + const cchar_t *ch) + { return(*(int *)0); } + +#undef wbkgd +int wbkgd( + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +/* ./base/lib_box.c */ + +#undef wborder +int wborder( + WINDOW *win, + chtype ls, + chtype rs, + chtype ts, + chtype bs, + chtype tl, + chtype tr, + chtype bl, + chtype br) + { return(*(int *)0); } + +/* ./base/lib_chgat.c */ + +#undef wchgat +int wchgat( + WINDOW *win, + int n, + attr_t attr, + short pair_arg, + const void *opts) + { return(*(int *)0); } + +/* ./base/lib_clear.c */ + +#undef wclear +int wclear( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clearok.c */ + +#undef clearok +int clearok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_clrbot.c */ + +#undef wclrtobot +int wclrtobot( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_clreol.c */ + +#undef wclrtoeol +int wclrtoeol( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_color.c */ + +#undef COLOR_PAIRS +int COLOR_PAIRS; +#undef COLORS +int COLORS; + +#undef _nc_reset_colors_sp +NCURSES_BOOL _nc_reset_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_reset_colors +NCURSES_BOOL _nc_reset_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef start_color_sp +int start_color_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef start_color +int start_color(void) + { return(*(int *)0); } + +#undef _nc_change_pair +void _nc_change_pair( + SCREEN *sp, + int pair) + { /* void */ } + +#undef _nc_reserve_pairs +void _nc_reserve_pairs( + SCREEN *sp, + int want) + { /* void */ } + +#undef _nc_init_pair +int _nc_init_pair( + SCREEN *sp, + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_pair_sp +int init_pair_sp( + SCREEN *sp, + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef init_pair +int init_pair( + short pair, + short f, + short b) + { return(*(int *)0); } + +#undef _nc_init_color +int _nc_init_color( + SCREEN *sp, + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef init_color_sp +int init_color_sp( + SCREEN *sp, + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef init_color +int init_color( + short color, + short r, + short g, + short b) + { return(*(int *)0); } + +#undef can_change_color_sp +NCURSES_BOOL can_change_color_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef can_change_color +NCURSES_BOOL can_change_color(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors_sp +NCURSES_BOOL has_colors_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_colors +NCURSES_BOOL has_colors(void) + { return(*(NCURSES_BOOL *)0); } + +#undef color_content_sp +int color_content_sp( + SCREEN *sp, + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef color_content +int color_content( + short color, + short *r, + short *g, + short *b) + { return(*(int *)0); } + +#undef _nc_pair_content +int _nc_pair_content( + SCREEN *sp, + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef pair_content_sp +int pair_content_sp( + SCREEN *sp, + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef pair_content +int pair_content( + short pair, + short *f, + short *b) + { return(*(int *)0); } + +#undef _nc_do_color_sp +void _nc_do_color_sp( + SCREEN *sp, + int old_pair, + int pair, + int reverse, + NCURSES_OUTC_sp outc) + { /* void */ } + +#undef _nc_do_color +void _nc_do_color( + int old_pair, + int pair, + int reverse, + NCURSES_OUTC outc) + { /* void */ } + +#undef init_extended_pair_sp +int init_extended_pair_sp( + SCREEN *sp, + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_extended_color_sp +int init_extended_color_sp( + SCREEN *sp, + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef extended_color_content_sp +int extended_color_content_sp( + SCREEN *sp, + int color, + int *r, + int *g, + int *b) + { return(*(int *)0); } + +#undef extended_pair_content_sp +int extended_pair_content_sp( + SCREEN *sp, + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef reset_color_pairs_sp +void reset_color_pairs_sp( + SCREEN *sp) + { /* void */ } + +#undef init_extended_pair +int init_extended_pair( + int pair, + int f, + int b) + { return(*(int *)0); } + +#undef init_extended_color +int init_extended_color( + int color, + int r, + int g, + int b) + { return(*(int *)0); } + +#undef extended_color_content +int extended_color_content( + int color, + int *r, + int *g, + int *b) + { return(*(int *)0); } + +#undef extended_pair_content +int extended_pair_content( + int pair, + int *f, + int *b) + { return(*(int *)0); } + +#undef reset_color_pairs +void reset_color_pairs(void) + { /* void */ } + +/* ./base/lib_colorset.c */ + +#undef wcolor_set +int wcolor_set( + WINDOW *win, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_delch.c */ + +#undef wdelch +int wdelch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_delwin.c */ + +#undef delwin +int delwin( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_echo.c */ + +#undef echo_sp +int echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef echo +int echo(void) + { return(*(int *)0); } + +#undef noecho_sp +int noecho_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noecho +int noecho(void) + { return(*(int *)0); } + +/* ./base/lib_endwin.c */ + +#undef endwin_sp +int endwin_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef endwin +int endwin(void) + { return(*(int *)0); } + +/* ./base/lib_erase.c */ + +#undef werase +int werase( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_flash.c */ + +#undef flash_sp +int flash_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flash +int flash(void) + { return(*(int *)0); } + +/* ./lib_gen.c */ + +#undef addch +int addch( + const chtype z) + { return(*(int *)0); } + +#undef addchnstr +int addchnstr( + const chtype *a1, + int z) + { return(*(int *)0); } + +#undef addchstr +int addchstr( + const chtype *z) + { return(*(int *)0); } + +#undef addnstr +int addnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef addstr +int addstr( + const char *z) + { return(*(int *)0); } + +#undef attroff +int attroff( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attron +int attron( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attrset +int attrset( + NCURSES_ATTR_T z) + { return(*(int *)0); } + +#undef attr_get +int attr_get( + attr_t *a1, + short *a2, + void *z) + { return(*(int *)0); } + +#undef attr_off +int attr_off( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_on +int attr_on( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef attr_set +int attr_set( + attr_t a1, + short a2, + void *z) + { return(*(int *)0); } + +#undef bkgd +int bkgd( + chtype z) + { return(*(int *)0); } + +#undef bkgdset +void bkgdset( + chtype z) + { /* void */ } + +#undef border +int border( + chtype a1, + chtype a2, + chtype a3, + chtype a4, + chtype a5, + chtype a6, + chtype a7, + chtype z) + { return(*(int *)0); } + +#undef box +int box( + WINDOW *a1, + chtype a2, + chtype z) + { return(*(int *)0); } + +#undef chgat +int chgat( + int a1, + attr_t a2, + short a3, + const void *z) + { return(*(int *)0); } + +#undef clear +int clear(void) + { return(*(int *)0); } + +#undef clrtobot +int clrtobot(void) + { return(*(int *)0); } + +#undef clrtoeol +int clrtoeol(void) + { return(*(int *)0); } + +#undef color_set +int color_set( + short a1, + void *z) + { return(*(int *)0); } + +#undef COLOR_PAIR +int COLOR_PAIR( + int z) + { return(*(int *)0); } + +#undef delch +int delch(void) + { return(*(int *)0); } + +#undef deleteln +int deleteln(void) + { return(*(int *)0); } + +#undef echochar +int echochar( + const chtype z) + { return(*(int *)0); } + +#undef erase +int erase(void) + { return(*(int *)0); } + +#undef getbkgd +chtype getbkgd( + WINDOW *z) + { return(*(chtype *)0); } + +#undef getch +int getch(void) + { return(*(int *)0); } + +#undef getnstr +int getnstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef getstr +int getstr( + char *z) + { return(*(int *)0); } + +#undef hline +int hline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef inch +chtype inch(void) + { return(*(chtype *)0); } + +#undef inchnstr +int inchnstr( + chtype *a1, + int z) + { return(*(int *)0); } + +#undef inchstr +int inchstr( + chtype *z) + { return(*(int *)0); } + +#undef innstr +int innstr( + char *a1, + int z) + { return(*(int *)0); } + +#undef insch +int insch( + chtype z) + { return(*(int *)0); } + +#undef insdelln +int insdelln( + int z) + { return(*(int *)0); } + +#undef insertln +int insertln(void) + { return(*(int *)0); } + +#undef insnstr +int insnstr( + const char *a1, + int z) + { return(*(int *)0); } + +#undef insstr +int insstr( + const char *z) + { return(*(int *)0); } + +#undef instr +int instr( + char *z) + { return(*(int *)0); } + +#undef move +int move( + int a1, + int z) + { return(*(int *)0); } + +#undef mvaddch +int mvaddch( + int a1, + int a2, + const chtype z) + { return(*(int *)0); } + +#undef mvaddchnstr +int mvaddchnstr( + int a1, + int a2, + const chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvaddchstr +int mvaddchstr( + int a1, + int a2, + const chtype *z) + { return(*(int *)0); } + +#undef mvaddnstr +int mvaddnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvaddstr +int mvaddstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvchgat +int mvchgat( + int a1, + int a2, + int a3, + attr_t a4, + short a5, + const void *z) + { return(*(int *)0); } + +#undef mvdelch +int mvdelch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetch +int mvgetch( + int a1, + int z) + { return(*(int *)0); } + +#undef mvgetnstr +int mvgetnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvgetstr +int mvgetstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvhline +int mvhline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvinch +chtype mvinch( + int a1, + int z) + { return(*(chtype *)0); } + +#undef mvinchnstr +int mvinchnstr( + int a1, + int a2, + chtype *a3, + int z) + { return(*(int *)0); } + +#undef mvinchstr +int mvinchstr( + int a1, + int a2, + chtype *z) + { return(*(int *)0); } + +#undef mvinnstr +int mvinnstr( + int a1, + int a2, + char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsch +int mvinsch( + int a1, + int a2, + chtype z) + { return(*(int *)0); } + +#undef mvinsnstr +int mvinsnstr( + int a1, + int a2, + const char *a3, + int z) + { return(*(int *)0); } + +#undef mvinsstr +int mvinsstr( + int a1, + int a2, + const char *z) + { return(*(int *)0); } + +#undef mvinstr +int mvinstr( + int a1, + int a2, + char *z) + { return(*(int *)0); } + +#undef mvvline +int mvvline( + int a1, + int a2, + chtype a3, + int z) + { return(*(int *)0); } + +#undef mvwaddch +int mvwaddch( + WINDOW *a1, + int a2, + int a3, + const chtype z) + { return(*(int *)0); } + +#undef mvwaddchnstr +int mvwaddchnstr( + WINDOW *a1, + int a2, + int a3, + const chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddchstr +int mvwaddchstr( + WINDOW *a1, + int a2, + int a3, + const chtype *z) + { return(*(int *)0); } + +#undef mvwaddnstr +int mvwaddnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddstr +int mvwaddstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwchgat +int mvwchgat( + WINDOW *a1, + int a2, + int a3, + int a4, + attr_t a5, + short a6, + const void *z) + { return(*(int *)0); } + +#undef mvwdelch +int mvwdelch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetch +int mvwgetch( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef mvwgetnstr +int mvwgetnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwgetstr +int mvwgetstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwhline +int mvwhline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef mvwinch +chtype mvwinch( + WINDOW *a1, + int a2, + int z) + { return(*(chtype *)0); } + +#undef mvwinchnstr +int mvwinchnstr( + WINDOW *a1, + int a2, + int a3, + chtype *a4, + int z) + { return(*(int *)0); } + +#undef mvwinchstr +int mvwinchstr( + WINDOW *a1, + int a2, + int a3, + chtype *z) + { return(*(int *)0); } + +#undef mvwinnstr +int mvwinnstr( + WINDOW *a1, + int a2, + int a3, + char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsch +int mvwinsch( + WINDOW *a1, + int a2, + int a3, + chtype z) + { return(*(int *)0); } + +#undef mvwinsnstr +int mvwinsnstr( + WINDOW *a1, + int a2, + int a3, + const char *a4, + int z) + { return(*(int *)0); } + +#undef mvwinsstr +int mvwinsstr( + WINDOW *a1, + int a2, + int a3, + const char *z) + { return(*(int *)0); } + +#undef mvwinstr +int mvwinstr( + WINDOW *a1, + int a2, + int a3, + char *z) + { return(*(int *)0); } + +#undef mvwvline +int mvwvline( + WINDOW *a1, + int a2, + int a3, + chtype a4, + int z) + { return(*(int *)0); } + +#undef PAIR_NUMBER +int PAIR_NUMBER( + int z) + { return(*(int *)0); } + +#undef redrawwin +int redrawwin( + WINDOW *z) + { return(*(int *)0); } + +#undef refresh +int refresh(void) + { return(*(int *)0); } + +#undef scrl +int scrl( + int z) + { return(*(int *)0); } + +#undef scroll +int scroll( + WINDOW *z) + { return(*(int *)0); } + +#undef setscrreg +int setscrreg( + int a1, + int z) + { return(*(int *)0); } + +#undef slk_attr_off +int slk_attr_off( + const attr_t a1, + void *z) + { return(*(int *)0); } + +#undef slk_attr_on +int slk_attr_on( + attr_t a1, + void *z) + { return(*(int *)0); } + +#undef standout +int standout(void) + { return(*(int *)0); } + +#undef standend +int standend(void) + { return(*(int *)0); } + +#undef timeout +void timeout( + int z) + { /* void */ } + +#undef touchline +int touchline( + WINDOW *a1, + int a2, + int z) + { return(*(int *)0); } + +#undef touchwin +int touchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef untouchwin +int untouchwin( + WINDOW *z) + { return(*(int *)0); } + +#undef vline +int vline( + chtype a1, + int z) + { return(*(int *)0); } + +#undef waddchstr +int waddchstr( + WINDOW *a1, + const chtype *z) + { return(*(int *)0); } + +#undef waddstr +int waddstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef wattron +int wattron( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattroff +int wattroff( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattrset +int wattrset( + WINDOW *a1, + int z) + { return(*(int *)0); } + +#undef wattr_get +int wattr_get( + WINDOW *a1, + attr_t *a2, + short *a3, + void *z) + { return(*(int *)0); } + +#undef wattr_set +int wattr_set( + WINDOW *a1, + attr_t a2, + short a3, + void *z) + { return(*(int *)0); } + +#undef wdeleteln +int wdeleteln( + WINDOW *z) + { return(*(int *)0); } + +#undef wgetstr +int wgetstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef winchstr +int winchstr( + WINDOW *a1, + chtype *z) + { return(*(int *)0); } + +#undef winsertln +int winsertln( + WINDOW *z) + { return(*(int *)0); } + +#undef winsstr +int winsstr( + WINDOW *a1, + const char *z) + { return(*(int *)0); } + +#undef winstr +int winstr( + WINDOW *a1, + char *z) + { return(*(int *)0); } + +#undef wstandout +int wstandout( + WINDOW *z) + { return(*(int *)0); } + +#undef wstandend +int wstandend( + WINDOW *z) + { return(*(int *)0); } + +#undef getattrs +int getattrs( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcurx +int getcurx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getcury +int getcury( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegx +int getbegx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getbegy +int getbegy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxx +int getmaxx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getmaxy +int getmaxy( + const WINDOW *z) + { return(*(int *)0); } + +#undef getparx +int getparx( + const WINDOW *z) + { return(*(int *)0); } + +#undef getpary +int getpary( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetparent +WINDOW *wgetparent( + const WINDOW *z) + { return(*(WINDOW **)0); } + +#undef is_cleared +NCURSES_BOOL is_cleared( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idcok +NCURSES_BOOL is_idcok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_idlok +NCURSES_BOOL is_idlok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_immedok +NCURSES_BOOL is_immedok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_keypad +NCURSES_BOOL is_keypad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_leaveok +NCURSES_BOOL is_leaveok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_nodelay +NCURSES_BOOL is_nodelay( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_notimeout +NCURSES_BOOL is_notimeout( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_pad +NCURSES_BOOL is_pad( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_scrollok +NCURSES_BOOL is_scrollok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_subwin +NCURSES_BOOL is_subwin( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef is_syncok +NCURSES_BOOL is_syncok( + const WINDOW *z) + { return(*(NCURSES_BOOL *)0); } + +#undef wgetdelay +int wgetdelay( + const WINDOW *z) + { return(*(int *)0); } + +#undef wgetscrreg +int wgetscrreg( + const WINDOW *a1, + int *a2, + int *z) + { return(*(int *)0); } + +#undef add_wch +int add_wch( + const cchar_t *z) + { return(*(int *)0); } + +#undef add_wchnstr +int add_wchnstr( + const cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef add_wchstr +int add_wchstr( + const cchar_t *z) + { return(*(int *)0); } + +#undef addnwstr +int addnwstr( + const wchar_t *a1, + int z) + { return(*(int *)0); } + +#undef addwstr +int addwstr( + const wchar_t *z) + { return(*(int *)0); } + +#undef bkgrnd +int bkgrnd( + const cchar_t *z) + { return(*(int *)0); } + +#undef bkgrndset +void bkgrndset( + const cchar_t *z) + { /* void */ } + +#undef border_set +int border_set( + const cchar_t *a1, + const cchar_t *a2, + const cchar_t *a3, + const cchar_t *a4, + const cchar_t *a5, + const cchar_t *a6, + const cchar_t *a7, + const cchar_t *z) + { return(*(int *)0); } + +#undef box_set +int box_set( + WINDOW *a1, + const cchar_t *a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef echo_wchar +int echo_wchar( + const cchar_t *z) + { return(*(int *)0); } + +#undef get_wch +int get_wch( + wint_t *z) + { return(*(int *)0); } + +#undef get_wstr +int get_wstr( + wint_t *z) + { return(*(int *)0); } + +#undef getbkgrnd +int getbkgrnd( + cchar_t *z) + { return(*(int *)0); } + +#undef getn_wstr +int getn_wstr( + wint_t *a1, + int z) + { return(*(int *)0); } + +#undef hline_set +int hline_set( + const cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef in_wch +int in_wch( + cchar_t *z) + { return(*(int *)0); } + +#undef in_wchnstr +int in_wchnstr( + cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef in_wchstr +int in_wchstr( + cchar_t *z) + { return(*(int *)0); } + +#undef innwstr +int innwstr( + wchar_t *a1, + int z) + { return(*(int *)0); } + +#undef ins_nwstr +int ins_nwstr( + const wchar_t *a1, + int z) + { return(*(int *)0); } + +#undef ins_wch +int ins_wch( + const cchar_t *z) + { return(*(int *)0); } + +#undef ins_wstr +int ins_wstr( + const wchar_t *z) + { return(*(int *)0); } + +#undef inwstr +int inwstr( + wchar_t *z) + { return(*(int *)0); } + +#undef mvadd_wch +int mvadd_wch( + int a1, + int a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvadd_wchnstr +int mvadd_wchnstr( + int a1, + int a2, + const cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvadd_wchstr +int mvadd_wchstr( + int a1, + int a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvaddnwstr +int mvaddnwstr( + int a1, + int a2, + const wchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvaddwstr +int mvaddwstr( + int a1, + int a2, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvget_wch +int mvget_wch( + int a1, + int a2, + wint_t *z) + { return(*(int *)0); } + +#undef mvget_wstr +int mvget_wstr( + int a1, + int a2, + wint_t *z) + { return(*(int *)0); } + +#undef mvgetn_wstr +int mvgetn_wstr( + int a1, + int a2, + wint_t *a3, + int z) + { return(*(int *)0); } + +#undef mvhline_set +int mvhline_set( + int a1, + int a2, + const cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvin_wch +int mvin_wch( + int a1, + int a2, + cchar_t *z) + { return(*(int *)0); } + +#undef mvin_wchnstr +int mvin_wchnstr( + int a1, + int a2, + cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvin_wchstr +int mvin_wchstr( + int a1, + int a2, + cchar_t *z) + { return(*(int *)0); } + +#undef mvinnwstr +int mvinnwstr( + int a1, + int a2, + wchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvins_nwstr +int mvins_nwstr( + int a1, + int a2, + const wchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvins_wch +int mvins_wch( + int a1, + int a2, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvins_wstr +int mvins_wstr( + int a1, + int a2, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvinwstr +int mvinwstr( + int a1, + int a2, + wchar_t *z) + { return(*(int *)0); } + +#undef mvvline_set +int mvvline_set( + int a1, + int a2, + const cchar_t *a3, + int z) + { return(*(int *)0); } + +#undef mvwadd_wch +int mvwadd_wch( + WINDOW *a1, + int a2, + int a3, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvwadd_wchnstr +int mvwadd_wchnstr( + WINDOW *a1, + int a2, + int a3, + const cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwadd_wchstr +int mvwadd_wchstr( + WINDOW *a1, + int a2, + int a3, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvwaddnwstr +int mvwaddnwstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwaddwstr +int mvwaddwstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvwget_wch +int mvwget_wch( + WINDOW *a1, + int a2, + int a3, + wint_t *z) + { return(*(int *)0); } + +#undef mvwget_wstr +int mvwget_wstr( + WINDOW *a1, + int a2, + int a3, + wint_t *z) + { return(*(int *)0); } + +#undef mvwgetn_wstr +int mvwgetn_wstr( + WINDOW *a1, + int a2, + int a3, + wint_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwhline_set +int mvwhline_set( + WINDOW *a1, + int a2, + int a3, + const cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwin_wch +int mvwin_wch( + WINDOW *a1, + int a2, + int a3, + cchar_t *z) + { return(*(int *)0); } + +#undef mvwin_wchnstr +int mvwin_wchnstr( + WINDOW *a1, + int a2, + int a3, + cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwin_wchstr +int mvwin_wchstr( + WINDOW *a1, + int a2, + int a3, + cchar_t *z) + { return(*(int *)0); } + +#undef mvwinnwstr +int mvwinnwstr( + WINDOW *a1, + int a2, + int a3, + wchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwins_nwstr +int mvwins_nwstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *a4, + int z) + { return(*(int *)0); } + +#undef mvwins_wch +int mvwins_wch( + WINDOW *a1, + int a2, + int a3, + const cchar_t *z) + { return(*(int *)0); } + +#undef mvwins_wstr +int mvwins_wstr( + WINDOW *a1, + int a2, + int a3, + const wchar_t *z) + { return(*(int *)0); } + +#undef mvwinwstr +int mvwinwstr( + WINDOW *a1, + int a2, + int a3, + wchar_t *z) + { return(*(int *)0); } + +#undef mvwvline_set +int mvwvline_set( + WINDOW *a1, + int a2, + int a3, + const cchar_t *a4, + int z) + { return(*(int *)0); } + +#undef vline_set +int vline_set( + const cchar_t *a1, + int z) + { return(*(int *)0); } + +#undef wadd_wchstr +int wadd_wchstr( + WINDOW *a1, + const cchar_t *z) + { return(*(int *)0); } + +#undef waddwstr +int waddwstr( + WINDOW *a1, + const wchar_t *z) + { return(*(int *)0); } + +#undef wget_wstr +int wget_wstr( + WINDOW *a1, + wint_t *z) + { return(*(int *)0); } + +#undef wgetbkgrnd +int wgetbkgrnd( + WINDOW *a1, + cchar_t *z) + { return(*(int *)0); } + +#undef win_wchstr +int win_wchstr( + WINDOW *a1, + cchar_t *z) + { return(*(int *)0); } + +#undef wins_wstr +int wins_wstr( + WINDOW *a1, + const wchar_t *z) + { return(*(int *)0); } + +#undef mouse_trafo +NCURSES_BOOL mouse_trafo( + int *a1, + int *a2, + NCURSES_BOOL z) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_getch.c */ + +#undef ESCDELAY +int ESCDELAY; + +#undef set_escdelay_sp +int set_escdelay_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_escdelay +int set_escdelay( + int value) + { return(*(int *)0); } + +#undef get_escdelay_sp +int get_escdelay_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef get_escdelay +int get_escdelay(void) + { return(*(int *)0); } + +#undef _nc_wgetch +int _nc_wgetch( + WINDOW *win, + int *result, + int use_meta) + { return(*(int *)0); } + +#undef wgetch +int wgetch( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_getstr.c */ + +#undef wgetnstr +int wgetnstr( + WINDOW *win, + char *str, + int maxlen) + { return(*(int *)0); } + +/* ./base/lib_hline.c */ + +#undef whline +int whline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_immedok.c */ + +#undef immedok +void immedok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +/* ./base/lib_inchstr.c */ + +#undef winchnstr +int winchnstr( + WINDOW *win, + chtype *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_initscr.c */ + +#undef initscr +WINDOW *initscr(void) + { return(*(WINDOW **)0); } + +/* ./base/lib_insch.c */ + +#undef _nc_insert_ch +int _nc_insert_ch( + SCREEN *sp, + WINDOW *win, + chtype ch) + { return(*(int *)0); } + +#undef winsch +int winsch( + WINDOW *win, + chtype c) + { return(*(int *)0); } + +/* ./base/lib_insdel.c */ + +#undef winsdelln +int winsdelln( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_insnstr.c */ + +#undef winsnstr +int winsnstr( + WINDOW *win, + const char *s, + int n) + { return(*(int *)0); } + +/* ./base/lib_instr.c */ + +#undef winnstr +int winnstr( + WINDOW *win, + char *str, + int n) + { return(*(int *)0); } + +/* ./base/lib_isendwin.c */ + +#undef isendwin_sp +NCURSES_BOOL isendwin_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef isendwin +NCURSES_BOOL isendwin(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_leaveok.c */ + +#undef leaveok +int leaveok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_mouse.c */ + +#undef getmouse_sp +int getmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef getmouse +int getmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse_sp +int ungetmouse_sp( + SCREEN *sp, + MEVENT *aevent) + { return(*(int *)0); } + +#undef ungetmouse +int ungetmouse( + MEVENT *aevent) + { return(*(int *)0); } + +#undef mousemask_sp +mmask_t mousemask_sp( + SCREEN *sp, + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef mousemask +mmask_t mousemask( + mmask_t newmask, + mmask_t *oldmask) + { return(*(mmask_t *)0); } + +#undef wenclose +NCURSES_BOOL wenclose( + const WINDOW *win, + int y, + int x) + { return(*(NCURSES_BOOL *)0); } + +#undef mouseinterval_sp +int mouseinterval_sp( + SCREEN *sp, + int maxclick) + { return(*(int *)0); } + +#undef mouseinterval +int mouseinterval( + int maxclick) + { return(*(int *)0); } + +#undef _nc_has_mouse +NCURSES_BOOL _nc_has_mouse( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse_sp +NCURSES_BOOL has_mouse_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_mouse +NCURSES_BOOL has_mouse(void) + { return(*(NCURSES_BOOL *)0); } + +#undef wmouse_trafo +NCURSES_BOOL wmouse_trafo( + const WINDOW *win, + int *pY, + int *pX, + NCURSES_BOOL to_screen) + { return(*(NCURSES_BOOL *)0); } + +/* ./base/lib_move.c */ + +#undef wmove +int wmove( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +/* ./tty/lib_mvcur.c */ + +#undef _nc_msec_cost_sp +int _nc_msec_cost_sp( + SCREEN *sp, + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_msec_cost +int _nc_msec_cost( + const char *const cap, + int affcnt) + { return(*(int *)0); } + +#undef _nc_mvcur_resume_sp +void _nc_mvcur_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_resume +void _nc_mvcur_resume(void) + { /* void */ } + +#undef _nc_mvcur_init_sp +void _nc_mvcur_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_init +void _nc_mvcur_init(void) + { /* void */ } + +#undef _nc_mvcur_wrap_sp +void _nc_mvcur_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_mvcur_wrap +void _nc_mvcur_wrap(void) + { /* void */ } + +#undef _nc_mvcur_sp +int _nc_mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_mvcur +int _nc_mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur_sp +int mvcur_sp( + SCREEN *sp, + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef mvcur +int mvcur( + int yold, + int xold, + int ynew, + int xnew) + { return(*(int *)0); } + +#undef _nc_optimize_enable +int _nc_optimize_enable; + +/* ./base/lib_mvwin.c */ + +#undef mvwin +int mvwin( + WINDOW *win, + int by, + int bx) + { return(*(int *)0); } + +/* ./base/lib_newterm.c */ + +#undef filter_sp +void filter_sp( + SCREEN *sp) + { /* void */ } + +#undef filter +void filter(void) + { /* void */ } + +#undef nofilter_sp +void nofilter_sp( + SCREEN *sp) + { /* void */ } + +#undef nofilter +void nofilter(void) + { /* void */ } + +#undef newterm_sp +SCREEN *newterm_sp( + SCREEN *sp, + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +#undef newterm +SCREEN *newterm( + const char *name, + FILE *ofp, + FILE *ifp) + { return(*(SCREEN **)0); } + +/* ./base/lib_newwin.c */ + +#undef _nc_freewin +int _nc_freewin( + WINDOW *win) + { return(*(int *)0); } + +#undef newwin_sp +WINDOW *newwin_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef newwin +WINDOW *newwin( + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef derwin +WINDOW *derwin( + WINDOW *orig, + int num_lines, + int num_columns, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef subwin +WINDOW *subwin( + WINDOW *w, + int l, + int c, + int y, + int x) + { return(*(WINDOW **)0); } + +#undef _nc_makenew_sp +WINDOW *_nc_makenew_sp( + SCREEN *sp, + int num_lines, + int num_columns, + int begy, + int begx, + int flags) + { return(*(WINDOW **)0); } + +#undef _nc_curscr_of +WINDOW *_nc_curscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_newscr_of +WINDOW *_nc_newscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +#undef _nc_stdscr_of +WINDOW *_nc_stdscr_of( + SCREEN *sp) + { return(*(WINDOW **)0); } + +/* ./base/lib_nl.c */ + +#undef nl_sp +int nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nl +int nl(void) + { return(*(int *)0); } + +#undef nonl_sp +int nonl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nonl +int nonl(void) + { return(*(int *)0); } + +/* ./base/lib_overlay.c */ + +#undef overlay +int overlay( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef overwrite +int overwrite( + const WINDOW *win1, + WINDOW *win2) + { return(*(int *)0); } + +#undef copywin +int copywin( + const WINDOW *src, + WINDOW *dst, + int sminrow, + int smincol, + int dminrow, + int dmincol, + int dmaxrow, + int dmaxcol, + int over) + { return(*(int *)0); } + +/* ./base/lib_pad.c */ + +#undef newpad_sp +WINDOW *newpad_sp( + SCREEN *sp, + int l, + int c) + { return(*(WINDOW **)0); } + +#undef newpad +WINDOW *newpad( + int l, + int c) + { return(*(WINDOW **)0); } + +#undef subpad +WINDOW *subpad( + WINDOW *orig, + int l, + int c, + int begy, + int begx) + { return(*(WINDOW **)0); } + +#undef prefresh +int prefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pnoutrefresh +int pnoutrefresh( + WINDOW *win, + int pminrow, + int pmincol, + int sminrow, + int smincol, + int smaxrow, + int smaxcol) + { return(*(int *)0); } + +#undef pechochar +int pechochar( + WINDOW *pad, + const chtype ch) + { return(*(int *)0); } + +/* ./base/lib_printw.c */ + +#undef printw +int printw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wprintw +int wprintw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvprintw +int mvprintw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwprintw +int mvwprintw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef vwprintw +int vwprintw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_printw +int vw_printw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +/* ./base/lib_redrawln.c */ + +#undef wredrawln +int wredrawln( + WINDOW *win, + int beg, + int num) + { return(*(int *)0); } + +/* ./base/lib_refresh.c */ + +#undef wrefresh +int wrefresh( + WINDOW *win) + { return(*(int *)0); } + +#undef wnoutrefresh +int wnoutrefresh( + WINDOW *win) + { return(*(int *)0); } + +/* ./base/lib_restart.c */ + +#undef restartterm_sp +int restartterm_sp( + SCREEN *sp, + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +#undef restartterm +int restartterm( + const char *termp, + int filenum, + int *errret) + { return(*(int *)0); } + +/* ./base/lib_scanw.c */ + +#undef vwscanw +int vwscanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef vw_scanw +int vw_scanw( + WINDOW *win, + const char *fmt, + va_list argp) + { return(*(int *)0); } + +#undef scanw +int scanw( + const char *fmt, + ...) + { return(*(int *)0); } + +#undef wscanw +int wscanw( + WINDOW *win, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvscanw +int mvscanw( + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +#undef mvwscanw +int mvwscanw( + WINDOW *win, + int y, + int x, + const char *fmt, + ...) + { return(*(int *)0); } + +/* ./base/lib_screen.c */ + +#undef getwin_sp +WINDOW *getwin_sp( + SCREEN *sp, + FILE *filep) + { return(*(WINDOW **)0); } + +#undef getwin +WINDOW *getwin( + FILE *filep) + { return(*(WINDOW **)0); } + +#undef putwin +int putwin( + WINDOW *win, + FILE *filep) + { return(*(int *)0); } + +#undef scr_restore_sp +int scr_restore_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_restore +int scr_restore( + const char *file) + { return(*(int *)0); } + +#undef scr_dump +int scr_dump( + const char *file) + { return(*(int *)0); } + +#undef scr_init_sp +int scr_init_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_init +int scr_init( + const char *file) + { return(*(int *)0); } + +#undef scr_set_sp +int scr_set_sp( + SCREEN *sp, + const char *file) + { return(*(int *)0); } + +#undef scr_set +int scr_set( + const char *file) + { return(*(int *)0); } + +/* ./base/lib_scroll.c */ + +#undef _nc_scroll_window +void _nc_scroll_window( + WINDOW *win, + int const n, + int const top, + int const bottom, + cchar_t blank) + { /* void */ } + +#undef wscrl +int wscrl( + WINDOW *win, + int n) + { return(*(int *)0); } + +/* ./base/lib_scrollok.c */ + +#undef scrollok +int scrollok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/lib_scrreg.c */ + +#undef wsetscrreg +int wsetscrreg( + WINDOW *win, + int top, + int bottom) + { return(*(int *)0); } + +/* ./base/lib_set_term.c */ + +#undef set_term +SCREEN *set_term( + SCREEN *screenp) + { return(*(SCREEN **)0); } + +#undef delscreen +void delscreen( + SCREEN *sp) + { /* void */ } + +#undef _nc_setupscreen_sp +int _nc_setupscreen_sp( + SCREEN **spp, + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_setupscreen +int _nc_setupscreen( + int slines, + int scolumns, + FILE *output, + int filtered, + int slk_format) + { return(*(int *)0); } + +#undef _nc_ripoffline_sp +int _nc_ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef _nc_ripoffline +int _nc_ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline_sp +int ripoffline_sp( + SCREEN *sp, + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +#undef ripoffline +int ripoffline( + int line, + int (*init)( + WINDOW *p1, + int p2)) + { return(*(int *)0); } + +/* ./base/lib_slk.c */ + +#undef _nc_format_slks +int _nc_format_slks( + SCREEN *sp, + int cols) + { return(*(int *)0); } + +#undef _nc_slk_initialize +int _nc_slk_initialize( + WINDOW *stwin, + int cols) + { return(*(int *)0); } + +#undef slk_restore_sp +int slk_restore_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_restore +int slk_restore(void) + { return(*(int *)0); } + +/* ./base/lib_slkatr_set.c */ + +#undef slk_attr_set_sp +int slk_attr_set_sp( + SCREEN *sp, + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef slk_attr_set +int slk_attr_set( + const attr_t attr, + short pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_slkatrof.c */ + +#undef slk_attroff_sp +int slk_attroff_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attroff +int slk_attroff( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatron.c */ + +#undef slk_attron_sp +int slk_attron_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attron +int slk_attron( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkatrset.c */ + +#undef slk_attrset_sp +int slk_attrset_sp( + SCREEN *sp, + const chtype attr) + { return(*(int *)0); } + +#undef slk_attrset +int slk_attrset( + const chtype attr) + { return(*(int *)0); } + +/* ./base/lib_slkattr.c */ + +#undef slk_attr_sp +attr_t slk_attr_sp( + SCREEN *sp) + { return(*(attr_t *)0); } + +#undef slk_attr +attr_t slk_attr(void) + { return(*(attr_t *)0); } + +/* ./base/lib_slkclear.c */ + +#undef slk_clear_sp +int slk_clear_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_clear +int slk_clear(void) + { return(*(int *)0); } + +/* ./base/lib_slkcolor.c */ + +#undef slk_color_sp +int slk_color_sp( + SCREEN *sp, + short pair_arg) + { return(*(int *)0); } + +#undef slk_color +int slk_color( + short pair_arg) + { return(*(int *)0); } + +#undef extended_slk_color_sp +int extended_slk_color_sp( + SCREEN *sp, + int pair_arg) + { return(*(int *)0); } + +#undef extended_slk_color +int extended_slk_color( + int pair_arg) + { return(*(int *)0); } + +/* ./base/lib_slkinit.c */ + +#undef slk_init_sp +int slk_init_sp( + SCREEN *sp, + int format) + { return(*(int *)0); } + +#undef slk_init +int slk_init( + int format) + { return(*(int *)0); } + +/* ./base/lib_slklab.c */ + +#undef slk_label_sp +char *slk_label_sp( + SCREEN *sp, + int n) + { return(*(char **)0); } + +#undef slk_label +char *slk_label( + int n) + { return(*(char **)0); } + +/* ./base/lib_slkrefr.c */ + +#undef slk_noutrefresh_sp +int slk_noutrefresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_noutrefresh +int slk_noutrefresh(void) + { return(*(int *)0); } + +#undef slk_refresh_sp +int slk_refresh_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_refresh +int slk_refresh(void) + { return(*(int *)0); } + +/* ./base/lib_slkset.c */ + +#undef slk_set_sp +int slk_set_sp( + SCREEN *sp, + int i, + const char *astr, + int format) + { return(*(int *)0); } + +#undef slk_set +int slk_set( + int i, + const char *astr, + int format) + { return(*(int *)0); } + +/* ./base/lib_slktouch.c */ + +#undef slk_touch_sp +int slk_touch_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef slk_touch +int slk_touch(void) + { return(*(int *)0); } + +/* ./base/lib_touch.c */ + +#undef is_linetouched +NCURSES_BOOL is_linetouched( + WINDOW *win, + int line) + { return(*(NCURSES_BOOL *)0); } + +#undef is_wintouched +NCURSES_BOOL is_wintouched( + WINDOW *win) + { return(*(NCURSES_BOOL *)0); } + +#undef wtouchln +int wtouchln( + WINDOW *win, + int y, + int n, + int changed) + { return(*(int *)0); } + +/* ./trace/lib_tracedmp.c */ + +#undef _tracedump +void _tracedump( + const char *name, + WINDOW *win) + { /* void */ } + +/* ./trace/lib_tracemse.c */ + +#undef _nc_trace_mmask_t +char *_nc_trace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(char **)0); } + +#undef _nc_tracemouse +char *_nc_tracemouse( + SCREEN *sp, + MEVENT const *ep) + { return(*(char **)0); } + +#undef _nc_retrace_mmask_t +mmask_t _nc_retrace_mmask_t( + SCREEN *sp, + mmask_t code) + { return(*(mmask_t *)0); } + +#undef _tracemouse +char *_tracemouse( + MEVENT const *ep) + { return(*(char **)0); } + +/* ./tty/lib_tstp.c */ + +#undef _nc_signal_handler +void _nc_signal_handler( + int enable) + { /* void */ } + +/* ./base/lib_ungetch.c */ + +#undef _nc_fifo_dump +void _nc_fifo_dump( + SCREEN *sp) + { /* void */ } + +#undef ungetch_sp +int ungetch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef ungetch +int ungetch( + int ch) + { return(*(int *)0); } + +/* ./tty/lib_vidattr.c */ + +#undef vidputs_sp +int vidputs_sp( + SCREEN *sp, + chtype newmode, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef vidputs +int vidputs( + chtype newmode, + NCURSES_OUTC outc) + { return(*(int *)0); } + +#undef vidattr_sp +int vidattr_sp( + SCREEN *sp, + chtype newmode) + { return(*(int *)0); } + +#undef vidattr +int vidattr( + chtype newmode) + { return(*(int *)0); } + +#undef termattrs_sp +chtype termattrs_sp( + SCREEN *sp) + { return(*(chtype *)0); } + +#undef termattrs +chtype termattrs(void) + { return(*(chtype *)0); } + +/* ./base/lib_vline.c */ + +#undef wvline +int wvline( + WINDOW *win, + chtype ch, + int n) + { return(*(int *)0); } + +/* ./base/lib_wattroff.c */ + +#undef wattr_off +int wattr_off( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_wattron.c */ + +#undef wattr_on +int wattr_on( + WINDOW *win, + attr_t at, + void *opts) + { return(*(int *)0); } + +/* ./base/lib_winch.c */ + +#undef winch +chtype winch( + WINDOW *win) + { return(*(chtype *)0); } + +/* ./base/lib_window.c */ + +#undef _nc_synchook +void _nc_synchook( + WINDOW *win) + { /* void */ } + +#undef mvderwin +int mvderwin( + WINDOW *win, + int y, + int x) + { return(*(int *)0); } + +#undef syncok +int syncok( + WINDOW *win, + NCURSES_BOOL bf) + { return(*(int *)0); } + +#undef wsyncup +void wsyncup( + WINDOW *win) + { /* void */ } + +#undef wsyncdown +void wsyncdown( + WINDOW *win) + { /* void */ } + +#undef wcursyncup +void wcursyncup( + WINDOW *win) + { /* void */ } + +#undef dupwin +WINDOW *dupwin( + WINDOW *win) + { return(*(WINDOW **)0); } + +/* ./base/nc_panel.c */ + +#undef _nc_panelhook_sp +struct panelhook *_nc_panelhook_sp( + SCREEN *sp) + { return(*(struct panelhook **)0); } + +#undef _nc_panelhook +struct panelhook *_nc_panelhook(void) + { return(*(struct panelhook **)0); } + +/* ./base/safe_sprintf.c */ + +#undef _nc_printf_string_sp +char *_nc_printf_string_sp( + SCREEN *sp, + const char *fmt, + va_list ap) + { return(*(char **)0); } + +#undef _nc_printf_string +char *_nc_printf_string( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./tty/tty_update.c */ + +#undef doupdate_sp +int doupdate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef doupdate +int doupdate(void) + { return(*(int *)0); } + +#undef _nc_scrolln_sp +int _nc_scrolln_sp( + SCREEN *sp, + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_scrolln +int _nc_scrolln( + int n, + int top, + int bot, + int maxy) + { return(*(int *)0); } + +#undef _nc_screen_resume_sp +void _nc_screen_resume_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_resume +void _nc_screen_resume(void) + { /* void */ } + +#undef _nc_screen_init_sp +void _nc_screen_init_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_init +void _nc_screen_init(void) + { /* void */ } + +#undef _nc_screen_wrap_sp +void _nc_screen_wrap_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_screen_wrap +void _nc_screen_wrap(void) + { /* void */ } + +#undef _nc_do_xmc_glitch_sp +void _nc_do_xmc_glitch_sp( + SCREEN *sp, + attr_t previous) + { /* void */ } + +#undef _nc_do_xmc_glitch +void _nc_do_xmc_glitch( + attr_t previous) + { /* void */ } + +/* ./trace/varargs.c */ + +#undef _nc_varargs +char *_nc_varargs( + const char *fmt, + va_list ap) + { return(*(char **)0); } + +/* ./base/vsscanf.c */ + +#undef _nc_vsscanf +void _nc_vsscanf(void) + { /* void */ } + +/* ./base/lib_freeall.c */ + +#undef _nc_freeall +void _nc_freeall(void) + { /* void */ } + +#undef _nc_free_and_exit_sp +void _nc_free_and_exit_sp( + SCREEN *sp, + int code) + { /* void */ } + +#undef _nc_free_and_exit +void _nc_free_and_exit( + int code) + { /* void */ } + +#undef exit_curses +void exit_curses( + int code) + { /* void */ } + +/* ./widechar/charable.c */ + +#undef _nc_is_charable +NCURSES_BOOL _nc_is_charable( + wchar_t ch) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_to_char +int _nc_to_char( + wint_t ch) + { return(*(int *)0); } + +#undef _nc_to_widechar +wint_t _nc_to_widechar( + int ch) + { return(*(wint_t *)0); } + +/* ./widechar/lib_add_wch.c */ + +#undef wadd_wch +int wadd_wch( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +#undef wecho_wchar +int wecho_wchar( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +/* ./widechar/lib_box_set.c */ + +#undef wborder_set +int wborder_set( + WINDOW *win, + const cchar_t *ls, + const cchar_t *rs, + const cchar_t *ts, + const cchar_t *bs, + const cchar_t *tl, + const cchar_t *tr, + const cchar_t *bl, + const cchar_t *br) + { return(*(int *)0); } + +/* ./widechar/lib_cchar.c */ + +#undef setcchar +int setcchar( + cchar_t *wcval, + const wchar_t *wch, + const attr_t attrs, + short pair_arg, + const void *opts) + { return(*(int *)0); } + +#undef getcchar +int getcchar( + const cchar_t *wcval, + wchar_t *wch, + attr_t *attrs, + short *pair_arg, + void *opts) + { return(*(int *)0); } + +/* ./widechar/lib_erasewchar.c */ + +#undef erasewchar_sp +int erasewchar_sp( + SCREEN *sp, + wchar_t *wch) + { return(*(int *)0); } + +#undef erasewchar +int erasewchar( + wchar_t *wch) + { return(*(int *)0); } + +#undef killwchar_sp +int killwchar_sp( + SCREEN *sp, + wchar_t *wch) + { return(*(int *)0); } + +#undef killwchar +int killwchar( + wchar_t *wch) + { return(*(int *)0); } + +/* ./widechar/lib_get_wch.c */ + +#undef wget_wch +int wget_wch( + WINDOW *win, + wint_t *result) + { return(*(int *)0); } + +/* ./widechar/lib_get_wstr.c */ + +#undef wgetn_wstr +int wgetn_wstr( + WINDOW *win, + wint_t *str, + int maxlen) + { return(*(int *)0); } + +/* ./widechar/lib_hline_set.c */ + +#undef whline_set +int whline_set( + WINDOW *win, + const cchar_t *ch, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_in_wch.c */ + +#undef win_wch +int win_wch( + WINDOW *win, + cchar_t *wcval) + { return(*(int *)0); } + +/* ./widechar/lib_in_wchnstr.c */ + +#undef win_wchnstr +int win_wchnstr( + WINDOW *win, + cchar_t *wchstr, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_ins_wch.c */ + +#undef _nc_insert_wch +int _nc_insert_wch( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +#undef wins_wch +int wins_wch( + WINDOW *win, + const cchar_t *wch) + { return(*(int *)0); } + +#undef wins_nwstr +int wins_nwstr( + WINDOW *win, + const wchar_t *wstr, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_inwstr.c */ + +#undef winnwstr +int winnwstr( + WINDOW *win, + wchar_t *wstr, + int n) + { return(*(int *)0); } + +#undef winwstr +int winwstr( + WINDOW *win, + wchar_t *wstr) + { return(*(int *)0); } + +/* ./widechar/lib_key_name.c */ + +#undef key_name +const char *key_name( + wchar_t c) + { return(*(const char **)0); } + +/* ./widechar/lib_pecho_wchar.c */ + +#undef pecho_wchar +int pecho_wchar( + WINDOW *pad, + const cchar_t *wch) + { return(*(int *)0); } + +/* ./widechar/lib_slk_wset.c */ + +#undef slk_wset +int slk_wset( + int i, + const wchar_t *astr, + int format) + { return(*(int *)0); } + +/* ./widechar/lib_unget_wch.c */ + +#undef _nc_wcrtomb +size_t _nc_wcrtomb( + char *target, + wchar_t source, + mbstate_t *state) + { return(*(size_t *)0); } + +#undef unget_wch_sp +int unget_wch_sp( + SCREEN *sp, + const wchar_t wch) + { return(*(int *)0); } + +#undef unget_wch +int unget_wch( + const wchar_t wch) + { return(*(int *)0); } + +/* ./widechar/lib_vid_attr.c */ + +#undef vid_puts_sp +int vid_puts_sp( + SCREEN *sp, + attr_t newmode, + short pair_arg, + void *opts, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef vid_puts +int vid_puts( + attr_t newmode, + short pair_arg, + void *opts, + NCURSES_OUTC outc) + { return(*(int *)0); } + +#undef vid_attr_sp +int vid_attr_sp( + SCREEN *sp, + attr_t newmode, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef vid_attr +int vid_attr( + attr_t newmode, + short pair_arg, + void *opts) + { return(*(int *)0); } + +#undef term_attrs_sp +attr_t term_attrs_sp( + SCREEN *sp) + { return(*(attr_t *)0); } + +#undef term_attrs +attr_t term_attrs(void) + { return(*(attr_t *)0); } + +/* ./widechar/lib_vline_set.c */ + +#undef wvline_set +int wvline_set( + WINDOW *win, + const cchar_t *ch, + int n) + { return(*(int *)0); } + +/* ./widechar/lib_wacs.c */ + +#undef _nc_wacs +cchar_t *_nc_wacs; + +#undef _nc_init_wacs +void _nc_init_wacs(void) + { /* void */ } + +/* ./widechar/lib_wunctrl.c */ + +#undef wunctrl_sp +wchar_t *wunctrl_sp( + SCREEN *sp, + cchar_t *wc) + { return(*(wchar_t **)0); } + +#undef wunctrl +wchar_t *wunctrl( + cchar_t *wc) + { return(*(wchar_t **)0); } + +/* ./expanded.c */ + +#undef _nc_toggle_attr_on +void _nc_toggle_attr_on( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_toggle_attr_off +void _nc_toggle_attr_off( + attr_t *S, + attr_t at) + { /* void */ } + +#undef _nc_DelCharCost_sp +int _nc_DelCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost_sp +int _nc_InsCharCost_sp( + SCREEN *sp, + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs_sp +void _nc_UpdateAttrs_sp( + SCREEN *sp, + const cchar_t *c) + { /* void */ } + +#undef _nc_DelCharCost +int _nc_DelCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_InsCharCost +int _nc_InsCharCost( + int count) + { return(*(int *)0); } + +#undef _nc_UpdateAttrs +void _nc_UpdateAttrs( + const cchar_t *c) + { /* void */ } + +/* ./base/legacy_coding.c */ + +#undef use_legacy_coding_sp +int use_legacy_coding_sp( + SCREEN *sp, + int level) + { return(*(int *)0); } + +#undef use_legacy_coding +int use_legacy_coding( + int level) + { return(*(int *)0); } + +/* ./base/lib_dft_fgbg.c */ + +#undef use_default_colors_sp +int use_default_colors_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_default_colors +int use_default_colors(void) + { return(*(int *)0); } + +#undef assume_default_colors_sp +int assume_default_colors_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef assume_default_colors +int assume_default_colors( + int fg, + int bg) + { return(*(int *)0); } + +/* ./tinfo/lib_print.c */ + +#undef mcprint_sp +int mcprint_sp( + SCREEN *sp, + char *data, + int len) + { return(*(int *)0); } + +#undef mcprint +int mcprint( + char *data, + int len) + { return(*(int *)0); } + +/* ./base/new_pair.c */ + +#undef _nc_free_ordered_pairs +void _nc_free_ordered_pairs( + SCREEN *sp) + { /* void */ } + +#undef _nc_reset_color_pair +void _nc_reset_color_pair( + SCREEN *sp, + int pair, + colorpair_t *next) + { /* void */ } + +#undef _nc_set_color_pair +void _nc_set_color_pair( + SCREEN *sp, + int pair, + int mode) + { /* void */ } + +#undef _nc_copy_pairs +void _nc_copy_pairs( + SCREEN *sp, + colorpair_t *target, + colorpair_t *source, + int length) + { /* void */ } + +#undef alloc_pair_sp +int alloc_pair_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef find_pair_sp +int find_pair_sp( + SCREEN *sp, + int fg, + int bg) + { return(*(int *)0); } + +#undef free_pair_sp +int free_pair_sp( + SCREEN *sp, + int pair) + { return(*(int *)0); } + +#undef alloc_pair +int alloc_pair( + int f, + int b) + { return(*(int *)0); } + +#undef find_pair +int find_pair( + int f, + int b) + { return(*(int *)0); } + +#undef free_pair +int free_pair( + int pair) + { return(*(int *)0); } + +/* ./base/resizeterm.c */ + +#undef is_term_resized_sp +NCURSES_BOOL is_term_resized_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef is_term_resized +NCURSES_BOOL is_term_resized( + int ToLines, + int ToCols) + { return(*(NCURSES_BOOL *)0); } + +#undef resize_term_sp +int resize_term_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resize_term +int resize_term( + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm_sp +int resizeterm_sp( + SCREEN *sp, + int ToLines, + int ToCols) + { return(*(int *)0); } + +#undef resizeterm +int resizeterm( + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./trace/trace_xnames.c */ + +#undef _nc_trace_xnames +void _nc_trace_xnames( + TERMTYPE *tp) + { /* void */ } + +/* ./tinfo/use_screen.c */ + +#undef use_screen +int use_screen( + SCREEN *screen, + NCURSES_SCREEN_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/use_window.c */ + +#undef use_window +int use_window( + WINDOW *win, + NCURSES_WINDOW_CB func, + void *data) + { return(*(int *)0); } + +/* ./base/wresize.c */ + +#undef wresize +int wresize( + WINDOW *win, + int ToLines, + int ToCols) + { return(*(int *)0); } + +/* ./tinfo/access.c */ + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE2 *to, + TERMTYPE2 *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +#undef _nc_copy_termtype2 +void _nc_copy_termtype2( + TERMTYPE2 *dst, + const TERMTYPE2 *src) + { /* void */ } + +#undef _nc_export_termtype2 +void _nc_export_termtype2( + TERMTYPE *dst, + const TERMTYPE2 *src) + { /* void */ } + +/* ./codes.c */ + +#undef boolcodes +const char *const boolcodes[] = {0}; +#undef numcodes +const char *const numcodes[] = {0}; +#undef strcodes +const char *const strcodes[] = {0}; + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE2 *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback2 +const TERMTYPE2 *_nc_fallback2( + const char *name) + { return(*(const TERMTYPE2 **)0); } + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef acs_map +chtype acs_map[128]; + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef cur_term +TERMINAL *cur_term; + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef stdscr +WINDOW *stdscr; +#undef curscr +WINDOW *curscr; +#undef newscr +WINDOW *newscr; +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef ttytype +char ttytype[256]; +#undef LINES +int LINES; +#undef COLS +int COLS; +#undef TABSIZE +int TABSIZE; + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; +#undef _nc_tputs_trace +const char *_nc_tputs_trace = {0}; +#undef _nc_outchars +long _nc_outchars; + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +#undef _tracecchar_t2 +char *_tracecchar_t2( + int bufnum, + const cchar_t *ch) + { return(*(char **)0); } + +#undef _tracecchar_t +char *_tracecchar_t( + const cchar_t *ch) + { return(*(char **)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef boolnames +const char *const boolnames[] = {0}; +#undef boolfnames +const char *const boolfnames[] = {0}; +#undef numnames +const char *const numnames[] = {0}; +#undef numfnames +const char *const numfnames[] = {0}; +#undef strnames +const char *const strnames[] = {0}; +#undef strfnames +const char *const strfnames[] = {0}; + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE2 *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE2 *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry2 +int _nc_read_entry2( + const char *const name, + char *const filename, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap_entry +int _nc_read_termcap_entry( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE2 *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswbuf2 +const char *_nc_viswbuf2( + int bufnum, + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbuf +const char *_nc_viswbuf( + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbufn +const char *_nc_viswbufn( + const wchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswibuf +const char *_nc_viswibuf( + const wint_t *buf) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +/* ./tinfo/alloc_entry.c */ + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE2 *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-ltic b/contrib/ncurses/ncurses/llib-ltic new file mode 100644 index 00000000..9e87aaea --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltic @@ -0,0 +1,203 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 2012-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/alloc_entry.c */ + +#include + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } diff --git a/contrib/ncurses/ncurses/llib-ltict b/contrib/ncurses/ncurses/llib-ltict new file mode 100644 index 00000000..db9090b9 --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltict @@ -0,0 +1,203 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 2013-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2013-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/alloc_entry.c */ + +#include + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } diff --git a/contrib/ncurses/ncurses/llib-ltictw b/contrib/ncurses/ncurses/llib-ltictw new file mode 100644 index 00000000..85db89bc --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltictw @@ -0,0 +1,203 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 2012-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/alloc_entry.c */ + +#include + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE2 *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } diff --git a/contrib/ncurses/ncurses/llib-lticw b/contrib/ncurses/ncurses/llib-lticw new file mode 100644 index 00000000..85db89bc --- /dev/null +++ b/contrib/ncurses/ncurses/llib-lticw @@ -0,0 +1,203 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 2012-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/alloc_entry.c */ + +#include + +#undef _nc_init_entry +void _nc_init_entry( + ENTRY *const tp) + { /* void */ } + +#undef _nc_copy_entry +ENTRY *_nc_copy_entry( + ENTRY *oldp) + { return(*(ENTRY **)0); } + +#undef _nc_save_str +char *_nc_save_str( + const char *string) + { return(*(char **)0); } + +#undef _nc_wrap_entry +void _nc_wrap_entry( + ENTRY *const ep, + NCURSES_BOOL copy_strings) + { /* void */ } + +#undef _nc_merge_entry +void _nc_merge_entry( + ENTRY *const target, + ENTRY *const source) + { /* void */ } + +/* ./tinfo/captoinfo.c */ + +#undef _nc_captoinfo +char *_nc_captoinfo( + const char *cap, + const char *s, + int const parameterized) + { return(*(char **)0); } + +#undef _nc_infotocap +char *_nc_infotocap( + const char *cap, + const char *str, + int const parameterized) + { return(*(char **)0); } + +/* ./tinfo/comp_expand.c */ + +#undef _nc_tic_expand +char *_nc_tic_expand( + const char *srcp, + NCURSES_BOOL tic_format, + int numbers) + { return(*(char **)0); } + +/* ./tinfo/comp_parse.c */ + +#undef _nc_check_termtype2 +void (*_nc_check_termtype2)( + TERMTYPE2 *p1, + NCURSES_BOOL p2); + +#undef _nc_entry_match +NCURSES_BOOL _nc_entry_match( + char *n1, + char *n2) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_read_entry_source +void _nc_read_entry_source( + FILE *fp, + char *buf, + int literal, + NCURSES_BOOL silent, + NCURSES_BOOL (*hook)( + ENTRY *p1)) + { /* void */ } + +#undef _nc_resolve_uses2 +int _nc_resolve_uses2( + NCURSES_BOOL fullresolve, + NCURSES_BOOL literal) + { return(*(int *)0); } + +/* ./tinfo/comp_scan.c */ + +#undef _nc_syntax +int _nc_syntax; +#undef _nc_strict_bsd +int _nc_strict_bsd; +#undef _nc_curr_file_pos +long _nc_curr_file_pos; +#undef _nc_comment_start +long _nc_comment_start; +#undef _nc_comment_end +long _nc_comment_end; +#undef _nc_start_line +long _nc_start_line; +#undef _nc_curr_token +struct token _nc_curr_token; +#undef _nc_disable_period +NCURSES_BOOL _nc_disable_period; + +#undef _nc_reset_input +void _nc_reset_input( + FILE *fp, + char *buf) + { /* void */ } + +#undef _nc_get_token +int _nc_get_token( + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_trans_string +int _nc_trans_string( + char *ptr, + const char *const last) + { return(*(int *)0); } + +#undef _nc_push_token +void _nc_push_token( + int tokclass) + { /* void */ } + +#undef _nc_panic_mode +void _nc_panic_mode( + char ch) + { /* void */ } + +/* ./tinfo/parse_entry.c */ + +#undef _nc_parse_entry +int _nc_parse_entry( + ENTRY *entryp, + int literal, + NCURSES_BOOL silent) + { return(*(int *)0); } + +#undef _nc_capcmp +int _nc_capcmp( + const char *s, + const char *t) + { return(*(int *)0); } + +/* ./tinfo/write_entry.c */ + +#undef _nc_set_writedir +void _nc_set_writedir( + const char *dir) + { /* void */ } + +#undef _nc_write_entry +void _nc_write_entry( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_write_object +int _nc_write_object( + TERMTYPE2 *tp, + char *buffer, + unsigned *offset, + unsigned limit) + { return(*(int *)0); } + +#undef _nc_tic_written +int _nc_tic_written(void) + { return(*(int *)0); } diff --git a/contrib/ncurses/ncurses/llib-ltinfo b/contrib/ncurses/ncurses/llib-ltinfo new file mode 100644 index 00000000..5cfa111a --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltinfo @@ -0,0 +1,1607 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 2012-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/access.c */ + +#include + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE *to, + TERMTYPE *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +/* ./codes.c */ + +#undef boolcodes +const char *const boolcodes[] = {0}; +#undef numcodes +const char *const numcodes[] = {0}; +#undef strcodes +const char *const strcodes[] = {0}; + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef acs_map +chtype acs_map[128]; + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef cur_term +TERMINAL *cur_term; + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef stdscr +WINDOW *stdscr; +#undef curscr +WINDOW *curscr; +#undef newscr +WINDOW *newscr; +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef ttytype +char ttytype[256]; +#undef LINES +int LINES; +#undef COLS +int COLS; +#undef TABSIZE +int TABSIZE; + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; +#undef _nc_tputs_trace +const char *_nc_tputs_trace = {0}; +#undef _nc_outchars +long _nc_outchars; + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef boolnames +const char *const boolnames[] = {0}; +#undef boolfnames +const char *const boolfnames[] = {0}; +#undef numnames +const char *const numnames[] = {0}; +#undef numfnames +const char *const numfnames[] = {0}; +#undef strnames +const char *const strnames[] = {0}; +#undef strfnames +const char *const strfnames[] = {0}; + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap +void _nc_read_termcap(void) + { /* void */ } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const chtype *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const chtype *buf, + int len) + { return(*(const char **)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-ltinfot b/contrib/ncurses/ncurses/llib-ltinfot new file mode 100644 index 00000000..94ca9a7f --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltinfot @@ -0,0 +1,1719 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 2013-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2013-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/access.c */ + +#include + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE *to, + TERMTYPE *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +/* ./codes.c */ + +#undef _nc_boolcodes +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } + +#undef _nc_numcodes +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } + +#undef _nc_strcodes +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef _nc_acs_map +chtype *_nc_acs_map(void) + { return(*(chtype **)0); } + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef _nc_get_cur_term_sp +TERMINAL *_nc_get_cur_term_sp( + SCREEN *sp) + { return(*(TERMINAL **)0); } + +#undef _nc_get_cur_term +TERMINAL *_nc_get_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef _nc_cur_term +TERMINAL *_nc_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef _nc_stdscr +WINDOW *_nc_stdscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_curscr +WINDOW *_nc_curscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_newscr +WINDOW *_nc_newscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +#undef _nc_init_pthreads +void _nc_init_pthreads(void) + { /* void */ } + +#undef _nc_mutex_init +void _nc_mutex_init( + pthread_mutex_t *obj) + { /* void */ } + +#undef _nc_mutex_lock +int _nc_mutex_lock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_trylock +int _nc_mutex_trylock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_unlock +int _nc_mutex_unlock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef _nc_ttytype +char *_nc_ttytype(void) + { return(*(char **)0); } + +#undef _nc_ptr_Lines +int *_nc_ptr_Lines( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_LINES +int _nc_LINES(void) + { return(*(int *)0); } + +#undef _nc_ptr_Cols +int *_nc_ptr_Cols( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_COLS +int _nc_COLS(void) + { return(*(int *)0); } + +#undef _nc_ptr_Tabsize +int *_nc_ptr_Tabsize( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_TABSIZE +int _nc_TABSIZE(void) + { return(*(int *)0); } + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef _nc_find_prescr +SCREEN *_nc_find_prescr(void) + { return(*(SCREEN **)0); } + +#undef _nc_forget_prescr +void _nc_forget_prescr(void) + { /* void */ } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; + +#undef _nc__nc_tputs_trace +const char *_nc__nc_tputs_trace(void) + { return(*(const char **)0); } + +#undef _nc__nc_outchars +long _nc__nc_outchars(void) + { return(*(long *)0); } + +#undef _nc_set_tputs_trace +void _nc_set_tputs_trace( + const char *s) + { /* void */ } + +#undef _nc_count_outchars +void _nc_count_outchars( + long increment) + { /* void */ } + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +#undef _nc_use_tracef +int _nc_use_tracef( + unsigned mask) + { return(*(int *)0); } + +#undef _nc_locked_tracef +void _nc_locked_tracef( + const char *fmt, + ...) + { /* void */ } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef _nc_boolnames +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } + +#undef _nc_boolfnames +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } + +#undef _nc_numnames +const char *const *_nc_numnames(void) + { return(*(const char **)0); } + +#undef _nc_numfnames +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } + +#undef _nc_strnames +const char *const *_nc_strnames(void) + { return(*(const char **)0); } + +#undef _nc_strfnames +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap +void _nc_read_termcap(void) + { /* void */ } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const chtype *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const chtype *buf, + int len) + { return(*(const char **)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-ltinfotw b/contrib/ncurses/ncurses/llib-ltinfotw new file mode 100644 index 00000000..3b21b876 --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltinfotw @@ -0,0 +1,1781 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2012-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/access.c */ + +#include + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE2 *to, + TERMTYPE2 *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +#undef _nc_copy_termtype2 +void _nc_copy_termtype2( + TERMTYPE2 *dst, + const TERMTYPE2 *src) + { /* void */ } + +#undef _nc_export_termtype2 +void _nc_export_termtype2( + TERMTYPE *dst, + const TERMTYPE2 *src) + { /* void */ } + +/* ./codes.c */ + +#undef _nc_boolcodes +const char *const *_nc_boolcodes(void) + { return(*(const char **)0); } + +#undef _nc_numcodes +const char *const *_nc_numcodes(void) + { return(*(const char **)0); } + +#undef _nc_strcodes +const char *const *_nc_strcodes(void) + { return(*(const char **)0); } + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE2 *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback2 +const TERMTYPE2 *_nc_fallback2( + const char *name) + { return(*(const TERMTYPE2 **)0); } + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef _nc_acs_map +chtype *_nc_acs_map(void) + { return(*(chtype **)0); } + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef _nc_get_cur_term_sp +TERMINAL *_nc_get_cur_term_sp( + SCREEN *sp) + { return(*(TERMINAL **)0); } + +#undef _nc_get_cur_term +TERMINAL *_nc_get_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef _nc_cur_term +TERMINAL *_nc_cur_term(void) + { return(*(TERMINAL **)0); } + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef _nc_stdscr +WINDOW *_nc_stdscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_curscr +WINDOW *_nc_curscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_newscr +WINDOW *_nc_newscr(void) + { return(*(WINDOW **)0); } + +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +#undef _nc_init_pthreads +void _nc_init_pthreads(void) + { /* void */ } + +#undef _nc_mutex_init +void _nc_mutex_init( + pthread_mutex_t *obj) + { /* void */ } + +#undef _nc_mutex_lock +int _nc_mutex_lock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_trylock +int _nc_mutex_trylock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +#undef _nc_mutex_unlock +int _nc_mutex_unlock( + pthread_mutex_t *obj) + { return(*(int *)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef _nc_ttytype +char *_nc_ttytype(void) + { return(*(char **)0); } + +#undef _nc_ptr_Lines +int *_nc_ptr_Lines( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_LINES +int _nc_LINES(void) + { return(*(int *)0); } + +#undef _nc_ptr_Cols +int *_nc_ptr_Cols( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_COLS +int _nc_COLS(void) + { return(*(int *)0); } + +#undef _nc_ptr_Tabsize +int *_nc_ptr_Tabsize( + SCREEN *sp) + { return(*(int **)0); } + +#undef _nc_TABSIZE +int _nc_TABSIZE(void) + { return(*(int *)0); } + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef _nc_find_prescr +SCREEN *_nc_find_prescr(void) + { return(*(SCREEN **)0); } + +#undef _nc_forget_prescr +void _nc_forget_prescr(void) + { /* void */ } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; + +#undef _nc__nc_tputs_trace +const char *_nc__nc_tputs_trace(void) + { return(*(const char **)0); } + +#undef _nc__nc_outchars +long _nc__nc_outchars(void) + { return(*(long *)0); } + +#undef _nc_set_tputs_trace +void _nc_set_tputs_trace( + const char *s) + { /* void */ } + +#undef _nc_count_outchars +void _nc_count_outchars( + long increment) + { /* void */ } + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +#undef _nc_use_tracef +int _nc_use_tracef( + unsigned mask) + { return(*(int *)0); } + +#undef _nc_locked_tracef +void _nc_locked_tracef( + const char *fmt, + ...) + { /* void */ } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +#undef _tracecchar_t2 +char *_tracecchar_t2( + int bufnum, + const cchar_t *ch) + { return(*(char **)0); } + +#undef _tracecchar_t +char *_tracecchar_t( + const cchar_t *ch) + { return(*(char **)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef _nc_boolnames +const char *const *_nc_boolnames(void) + { return(*(const char **)0); } + +#undef _nc_boolfnames +const char *const *_nc_boolfnames(void) + { return(*(const char **)0); } + +#undef _nc_numnames +const char *const *_nc_numnames(void) + { return(*(const char **)0); } + +#undef _nc_numfnames +const char *const *_nc_numfnames(void) + { return(*(const char **)0); } + +#undef _nc_strnames +const char *const *_nc_strnames(void) + { return(*(const char **)0); } + +#undef _nc_strfnames +const char *const *_nc_strfnames(void) + { return(*(const char **)0); } + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE2 *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE2 *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry2 +int _nc_read_entry2( + const char *const name, + char *const filename, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap +void _nc_read_termcap(void) + { /* void */ } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE2 *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswbuf2 +const char *_nc_viswbuf2( + int bufnum, + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbuf +const char *_nc_viswbuf( + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbufn +const char *_nc_viswbufn( + const wchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswibuf +const char *_nc_viswibuf( + const wint_t *buf) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/llib-ltinfow b/contrib/ncurses/ncurses/llib-ltinfow new file mode 100644 index 00000000..fd308180 --- /dev/null +++ b/contrib/ncurses/ncurses/llib-ltinfow @@ -0,0 +1,1669 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2012-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2012-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./tinfo/access.c */ + +#include + +#undef _nc_rootname +char *_nc_rootname( + char *path) + { return(*(char **)0); } + +#undef _nc_is_abs_path +NCURSES_BOOL _nc_is_abs_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_pathlast +unsigned _nc_pathlast( + const char *path) + { return(*(unsigned *)0); } + +#undef _nc_basename +char *_nc_basename( + char *path) + { return(*(char **)0); } + +#undef _nc_access +int _nc_access( + const char *path, + int mode) + { return(*(int *)0); } + +#undef _nc_is_dir_path +NCURSES_BOOL _nc_is_dir_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_is_file_path +NCURSES_BOOL _nc_is_file_path( + const char *path) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_env_access +int _nc_env_access(void) + { return(*(int *)0); } + +#undef _nc_safe_fopen +FILE *_nc_safe_fopen( + const char *path, + const char *mode) + { return(*(FILE **)0); } + +#undef _nc_safe_open3 +int _nc_safe_open3( + const char *path, + int flags, + mode_t mode) + { return(*(int *)0); } + +/* ./tinfo/add_tries.c */ + +#undef _nc_add_to_try +int _nc_add_to_try( + TRIES **tree, + const char *str, + unsigned code) + { return(*(int *)0); } + +/* ./tinfo/alloc_ttype.c */ + +#undef _nc_align_termtype +void _nc_align_termtype( + TERMTYPE2 *to, + TERMTYPE2 *from) + { /* void */ } + +#undef _nc_copy_termtype +void _nc_copy_termtype( + TERMTYPE *dst, + const TERMTYPE *src) + { /* void */ } + +#undef _nc_copy_termtype2 +void _nc_copy_termtype2( + TERMTYPE2 *dst, + const TERMTYPE2 *src) + { /* void */ } + +#undef _nc_export_termtype2 +void _nc_export_termtype2( + TERMTYPE *dst, + const TERMTYPE2 *src) + { /* void */ } + +/* ./codes.c */ + +#undef boolcodes +const char *const boolcodes[] = {0}; +#undef numcodes +const char *const numcodes[] = {0}; +#undef strcodes +const char *const strcodes[] = {0}; + +/* ./comp_captab.c */ + +#undef _nc_get_table +const struct name_table_entry *_nc_get_table( + NCURSES_BOOL termcap) + { return(*(const struct name_table_entry **)0); } + +#undef _nc_get_hash_table +const HashValue *_nc_get_hash_table( + NCURSES_BOOL termcap) + { return(*(const HashValue **)0); } + +#undef _nc_get_alias_table +const struct alias *_nc_get_alias_table( + NCURSES_BOOL termcap) + { return(*(const struct alias **)0); } + +#undef _nc_get_hash_info +const HashData *_nc_get_hash_info( + NCURSES_BOOL termcap) + { return(*(const HashData **)0); } + +/* ./tinfo/comp_error.c */ + +#undef _nc_suppress_warnings +NCURSES_BOOL _nc_suppress_warnings; +#undef _nc_curr_line +int _nc_curr_line; +#undef _nc_curr_col +int _nc_curr_col; + +#undef _nc_get_source +const char *_nc_get_source(void) + { return(*(const char **)0); } + +#undef _nc_set_source +void _nc_set_source( + const char *const name) + { /* void */ } + +#undef _nc_set_type +void _nc_set_type( + const char *const name) + { /* void */ } + +#undef _nc_get_type +void _nc_get_type( + char *name) + { /* void */ } + +#undef _nc_warning +void _nc_warning( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_err_abort +void _nc_err_abort( + const char *const fmt, + ...) + { /* void */ } + +#undef _nc_syserr_abort +void _nc_syserr_abort( + const char *const fmt, + ...) + { /* void */ } + +/* ./tinfo/comp_hash.c */ + +#undef _nc_find_entry +struct name_table_entry const *_nc_find_entry( + const char *string, + const HashValue *hash_table) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_type_entry +struct name_table_entry const *_nc_find_type_entry( + const char *string, + int type, + NCURSES_BOOL termcap) + { return(*(struct name_table_entry const **)0); } + +#undef _nc_find_user_entry +struct user_table_entry const *_nc_find_user_entry( + const char *string) + { return(*(struct user_table_entry const **)0); } + +/* ./comp_userdefs.c */ + +#undef _nc_get_userdefs_table +const struct user_table_entry *_nc_get_userdefs_table(void) + { return(*(const struct user_table_entry **)0); } + +#undef _nc_get_hash_user +const HashData *_nc_get_hash_user(void) + { return(*(const HashData **)0); } + +/* ./tinfo/db_iterator.c */ + +#undef _nc_tic_dir +const char *_nc_tic_dir( + const char *path) + { return(*(const char **)0); } + +#undef _nc_keep_tic_dir +void _nc_keep_tic_dir( + const char *path) + { /* void */ } + +#undef _nc_last_db +void _nc_last_db(void) + { /* void */ } + +#undef _nc_next_db +const char *_nc_next_db( + DBDIRS *state, + int *offset) + { return(*(const char **)0); } + +#undef _nc_first_db +void _nc_first_db( + DBDIRS *state, + int *offset) + { /* void */ } + +/* ./tinfo/doalloc.c */ + +#undef _nc_doalloc +void *_nc_doalloc( + void *oldp, + size_t amount) + { return(*(void **)0); } + +/* ./tinfo/entries.c */ + +#undef _nc_head +ENTRY *_nc_head; +#undef _nc_tail +ENTRY *_nc_tail; + +#undef _nc_free_entry +void _nc_free_entry( + ENTRY *headp, + TERMTYPE2 *tterm) + { /* void */ } + +#undef _nc_free_entries +void _nc_free_entries( + ENTRY *headp) + { /* void */ } + +#undef _nc_leaks_tinfo +void _nc_leaks_tinfo(void) + { /* void */ } + +#undef exit_terminfo +void exit_terminfo( + int code) + { /* void */ } + +/* ./fallback.c */ + +#undef _nc_fallback2 +const TERMTYPE2 *_nc_fallback2( + const char *name) + { return(*(const TERMTYPE2 **)0); } + +#undef _nc_fallback +const TERMTYPE *_nc_fallback( + const char *name) + { return(*(const TERMTYPE **)0); } + +/* ./tinfo/free_ttype.c */ + +#undef _nc_free_termtype +void _nc_free_termtype( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype1 +void _nc_free_termtype1( + TERMTYPE *ptr) + { /* void */ } + +#undef _nc_free_termtype2 +void _nc_free_termtype2( + TERMTYPE2 *ptr) + { /* void */ } + +#undef _nc_user_definable +NCURSES_BOOL _nc_user_definable; + +#undef use_extended_names +int use_extended_names( + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./tinfo/getenv_num.c */ + +#undef _nc_getenv_num +int _nc_getenv_num( + const char *name) + { return(*(int *)0); } + +#undef _nc_setenv_num +void _nc_setenv_num( + const char *name, + int value) + { /* void */ } + +/* ./tinfo/home_terminfo.c */ + +#undef _nc_home_terminfo +char *_nc_home_terminfo(void) + { return(*(char **)0); } + +/* ./tinfo/init_keytry.c */ + +#undef _nc_init_keytry +void _nc_init_keytry( + SCREEN *sp) + { /* void */ } + +/* ./tinfo/lib_acs.c */ + +#undef acs_map +chtype acs_map[128]; + +#undef _nc_init_acs_sp +void _nc_init_acs_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_init_acs +void _nc_init_acs(void) + { /* void */ } + +/* ./tinfo/lib_baudrate.c */ + +struct speed { + int given_speed; + int actual_speed; +}; + +#undef _nc_baudrate +int _nc_baudrate( + int OSpeed) + { return(*(int *)0); } + +#undef _nc_ospeed +int _nc_ospeed( + int BaudRate) + { return(*(int *)0); } + +#undef baudrate_sp +int baudrate_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef baudrate +int baudrate(void) + { return(*(int *)0); } + +/* ./tinfo/lib_cur_term.c */ + +#undef cur_term +TERMINAL *cur_term; + +#undef set_curterm_sp +TERMINAL *set_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef set_curterm +TERMINAL *set_curterm( + TERMINAL *termp) + { return(*(TERMINAL **)0); } + +#undef del_curterm_sp +int del_curterm_sp( + SCREEN *sp, + TERMINAL *termp) + { return(*(int *)0); } + +#undef del_curterm +int del_curterm( + TERMINAL *termp) + { return(*(int *)0); } + +/* ./tinfo/lib_data.c */ + +#undef stdscr +WINDOW *stdscr; +#undef curscr +WINDOW *curscr; +#undef newscr +WINDOW *newscr; +#undef _nc_screen_chain +SCREEN *_nc_screen_chain; +#undef SP +SCREEN *SP; +#undef _nc_globals +NCURSES_GLOBALS _nc_globals; +#undef _nc_prescreen +NCURSES_PRESCREEN _nc_prescreen; + +#undef _nc_screen_of +SCREEN *_nc_screen_of( + WINDOW *win) + { return(*(SCREEN **)0); } + +/* ./tinfo/lib_has_cap.c */ + +#undef has_ic_sp +NCURSES_BOOL has_ic_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_ic +NCURSES_BOOL has_ic(void) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il_sp +NCURSES_BOOL has_il_sp( + SCREEN *sp) + { return(*(NCURSES_BOOL *)0); } + +#undef has_il +NCURSES_BOOL has_il(void) + { return(*(NCURSES_BOOL *)0); } + +/* ./tinfo/lib_kernel.c */ + +#undef erasechar_sp +char erasechar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef erasechar +char erasechar(void) + { return(*(char *)0); } + +#undef killchar_sp +char killchar_sp( + SCREEN *sp) + { return(*(char *)0); } + +#undef killchar +char killchar(void) + { return(*(char *)0); } + +#undef flushinp_sp +int flushinp_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef flushinp +int flushinp(void) + { return(*(int *)0); } + +/* ./lib_keyname.c */ + +struct kn { short offset; int code; }; + +#undef keyname_sp +const char *keyname_sp( + SCREEN *sp, + int c) + { return(*(const char **)0); } + +#undef keyname +const char *keyname( + int c) + { return(*(const char **)0); } + +/* ./tinfo/lib_longname.c */ + +#undef longname_sp +char *longname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef longname +char *longname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_napms.c */ + +#undef napms_sp +int napms_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef napms +int napms( + int ms) + { return(*(int *)0); } + +/* ./tinfo/lib_options.c */ + +#undef idlok +int idlok( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef idcok +void idcok( + WINDOW *win, + NCURSES_BOOL flag) + { /* void */ } + +#undef halfdelay_sp +int halfdelay_sp( + SCREEN *sp, + int t) + { return(*(int *)0); } + +#undef halfdelay +int halfdelay( + int t) + { return(*(int *)0); } + +#undef nodelay +int nodelay( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef notimeout +int notimeout( + WINDOW *win, + NCURSES_BOOL f) + { return(*(int *)0); } + +#undef wtimeout +void wtimeout( + WINDOW *win, + int delay) + { /* void */ } + +#undef keypad +int keypad( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef meta +int meta( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef curs_set_sp +int curs_set_sp( + SCREEN *sp, + int vis) + { return(*(int *)0); } + +#undef curs_set +int curs_set( + int vis) + { return(*(int *)0); } + +#undef typeahead_sp +int typeahead_sp( + SCREEN *sp, + int fd) + { return(*(int *)0); } + +#undef typeahead +int typeahead( + int fd) + { return(*(int *)0); } + +#undef has_key_sp +int has_key_sp( + SCREEN *sp, + int keycode) + { return(*(int *)0); } + +#undef has_key +int has_key( + int keycode) + { return(*(int *)0); } + +#undef _nc_putp_flush_sp +int _nc_putp_flush_sp( + SCREEN *sp, + const char *name, + const char *value) + { return(*(int *)0); } + +#undef _nc_keypad +int _nc_keypad( + SCREEN *sp, + int flag) + { return(*(int *)0); } + +/* ./tinfo/lib_raw.c */ + +#undef raw_sp +int raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef raw +int raw(void) + { return(*(int *)0); } + +#undef cbreak_sp +int cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef cbreak +int cbreak(void) + { return(*(int *)0); } + +#undef qiflush_sp +void qiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef qiflush +void qiflush(void) + { /* void */ } + +#undef noraw_sp +int noraw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef noraw +int noraw(void) + { return(*(int *)0); } + +#undef nocbreak_sp +int nocbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef nocbreak +int nocbreak(void) + { return(*(int *)0); } + +#undef noqiflush_sp +void noqiflush_sp( + SCREEN *sp) + { /* void */ } + +#undef noqiflush +void noqiflush(void) + { /* void */ } + +#undef intrflush_sp +int intrflush_sp( + SCREEN *sp, + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef intrflush +int intrflush( + WINDOW *win, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef is_nl_sp +int is_nl_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_raw_sp +int is_raw_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_cbreak_sp +int is_cbreak_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_echo_sp +int is_echo_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef is_nl +int is_nl(void) + { return(*(int *)0); } + +#undef is_raw +int is_raw(void) + { return(*(int *)0); } + +#undef is_cbreak +int is_cbreak(void) + { return(*(int *)0); } + +#undef is_echo +int is_echo(void) + { return(*(int *)0); } + +/* ./tinfo/lib_setup.c */ + +#undef ttytype +char ttytype[256]; +#undef LINES +int LINES; +#undef COLS +int COLS; +#undef TABSIZE +int TABSIZE; + +#undef set_tabsize_sp +int set_tabsize_sp( + SCREEN *sp, + int value) + { return(*(int *)0); } + +#undef set_tabsize +int set_tabsize( + int value) + { return(*(int *)0); } + +#undef _nc_handle_sigwinch +int _nc_handle_sigwinch( + SCREEN *sp) + { return(*(int *)0); } + +#undef use_env_sp +void use_env_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl_sp +void use_tioctl_sp( + SCREEN *sp, + NCURSES_BOOL f) + { /* void */ } + +#undef use_env +void use_env( + NCURSES_BOOL f) + { /* void */ } + +#undef use_tioctl +void use_tioctl( + NCURSES_BOOL f) + { /* void */ } + +#undef _nc_get_screensize +void _nc_get_screensize( + SCREEN *sp, + int *linep, + int *colp) + { /* void */ } + +#undef _nc_update_screensize +void _nc_update_screensize( + SCREEN *sp) + { /* void */ } + +#undef _nc_setup_tinfo +int _nc_setup_tinfo( + const char *const tn, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_tinfo_cmdch +void _nc_tinfo_cmdch( + TERMINAL *termp, + int proto) + { /* void */ } + +#undef _nc_get_locale +char *_nc_get_locale(void) + { return(*(char **)0); } + +#undef _nc_unicode_locale +int _nc_unicode_locale(void) + { return(*(int *)0); } + +#undef _nc_locale_breaks_acs +int _nc_locale_breaks_acs( + TERMINAL *termp) + { return(*(int *)0); } + +#undef _nc_setupterm +int _nc_setupterm( + const char *tname, + int Filedes, + int *errret, + int reuse) + { return(*(int *)0); } + +#undef new_prescr +SCREEN *new_prescr(void) + { return(*(SCREEN **)0); } + +#undef setupterm +int setupterm( + const char *tname, + int Filedes, + int *errret) + { return(*(int *)0); } + +/* ./tinfo/lib_termcap.c */ + +#undef UP +char *UP; +#undef BC +char *BC; + +#undef tgetent_sp +int tgetent_sp( + SCREEN *sp, + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetent +int tgetent( + char *bufp, + const char *name) + { return(*(int *)0); } + +#undef tgetflag_sp +int tgetflag_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetflag +int tgetflag( + const char *id) + { return(*(int *)0); } + +#undef tgetnum_sp +int tgetnum_sp( + SCREEN *sp, + const char *id) + { return(*(int *)0); } + +#undef tgetnum +int tgetnum( + const char *id) + { return(*(int *)0); } + +#undef tgetstr_sp +char *tgetstr_sp( + SCREEN *sp, + const char *id, + char **area) + { return(*(char **)0); } + +#undef tgetstr +char *tgetstr( + const char *id, + char **area) + { return(*(char **)0); } + +/* ./tinfo/lib_termname.c */ + +#undef termname_sp +char *termname_sp( + SCREEN *sp) + { return(*(char **)0); } + +#undef termname +char *termname(void) + { return(*(char **)0); } + +/* ./tinfo/lib_tgoto.c */ + +#undef tgoto +char *tgoto( + const char *string, + int x, + int y) + { return(*(char **)0); } + +/* ./tinfo/lib_ti.c */ + +#undef tigetflag_sp +int tigetflag_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetflag +int tigetflag( + const char *str) + { return(*(int *)0); } + +#undef tigetnum_sp +int tigetnum_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef tigetnum +int tigetnum( + const char *str) + { return(*(int *)0); } + +#undef tigetstr_sp +char *tigetstr_sp( + SCREEN *sp, + const char *str) + { return(*(char **)0); } + +#undef tigetstr +char *tigetstr( + const char *str) + { return(*(char **)0); } + +/* ./tinfo/lib_tparm.c */ + +#undef _nc_tparm_err +int _nc_tparm_err; + +#undef _nc_free_tparm +void _nc_free_tparm( + TERMINAL *termp) + { /* void */ } + +#undef _nc_tparm_analyze +int _nc_tparm_analyze( + TERMINAL *term, + const char *string, + char **p_is_s, + int *_nc_popcount) + { return(*(int *)0); } + +#undef tparm +char *tparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm +char *tiparm( + const char *string, + ...) + { return(*(char **)0); } + +#undef tiparm_s +char *tiparm_s( + int num_expected, + int tparm_type, + const char *string, + ...) + { return(*(char **)0); } + +#undef tiscan_s +int tiscan_s( + int *num_expected, + int *tparm_type, + const char *string) + { return(*(int *)0); } + +#undef _nc_tiparm +char *_nc_tiparm( + int expected, + const char *string, + ...) + { return(*(char **)0); } + +#undef _nc_reset_tparm +void _nc_reset_tparm( + TERMINAL *term) + { /* void */ } + +/* ./tinfo/lib_tputs.c */ + +#undef PC +char PC; +#undef ospeed +short ospeed; +#undef _nc_nulls_sent +int _nc_nulls_sent; + +#undef _nc_set_no_padding +void _nc_set_no_padding( + SCREEN *sp) + { /* void */ } + +#undef delay_output_sp +int delay_output_sp( + SCREEN *sp, + int ms) + { return(*(int *)0); } + +#undef delay_output +int delay_output( + int ms) + { return(*(int *)0); } + +#undef _nc_flush_sp +void _nc_flush_sp( + SCREEN *sp) + { /* void */ } + +#undef _nc_flush +void _nc_flush(void) + { /* void */ } + +#undef _nc_outch_sp +int _nc_outch_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_outch +int _nc_outch( + int ch) + { return(*(int *)0); } + +#undef _nc_putchar_sp +int _nc_putchar_sp( + SCREEN *sp, + int ch) + { return(*(int *)0); } + +#undef _nc_putchar +int _nc_putchar( + int ch) + { return(*(int *)0); } + +#undef putp_sp +int putp_sp( + SCREEN *sp, + const char *string) + { return(*(int *)0); } + +#undef putp +int putp( + const char *string) + { return(*(int *)0); } + +#undef _nc_putp_sp +int _nc_putp_sp( + SCREEN *sp, + const char *name, + const char *string) + { return(*(int *)0); } + +#undef _nc_putp +int _nc_putp( + const char *name, + const char *string) + { return(*(int *)0); } + +#undef tputs_sp +int tputs_sp( + SCREEN *sp, + const char *string, + int affcnt, + NCURSES_OUTC_sp outc) + { return(*(int *)0); } + +#undef _nc_outc_wrapper +int _nc_outc_wrapper( + SCREEN *sp, + int c) + { return(*(int *)0); } + +#undef tputs +int tputs( + const char *string, + int affcnt, + int (*outc)( + int p1)) + { return(*(int *)0); } + +/* ./trace/lib_trace.c */ + +#undef _nc_tracing +unsigned _nc_tracing; +#undef _nc_tputs_trace +const char *_nc_tputs_trace = {0}; +#undef _nc_outchars +long _nc_outchars; + +#undef curses_trace +unsigned curses_trace( + unsigned tracelevel) + { return(*(unsigned *)0); } + +#undef trace +void trace( + const unsigned int tracelevel) + { /* void */ } + +#undef _tracef +void _tracef( + const char *fmt, + ...) + { /* void */ } + +#undef _nc_retrace_bool +NCURSES_BOOL _nc_retrace_bool( + int code) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_retrace_char +char _nc_retrace_char( + int code) + { return(*(char *)0); } + +#undef _nc_retrace_int +int _nc_retrace_int( + int code) + { return(*(int *)0); } + +#undef _nc_retrace_unsigned +unsigned _nc_retrace_unsigned( + unsigned code) + { return(*(unsigned *)0); } + +#undef _nc_retrace_ptr +char *_nc_retrace_ptr( + char *code) + { return(*(char **)0); } + +#undef _nc_retrace_cptr +const char *_nc_retrace_cptr( + const char *code) + { return(*(const char **)0); } + +#undef _nc_retrace_cvoid_ptr +const void *_nc_retrace_cvoid_ptr( + const void *code) + { return(*(const void **)0); } + +#undef _nc_retrace_void_ptr +void *_nc_retrace_void_ptr( + void *code) + { return(*(void **)0); } + +#undef _nc_retrace_sp +SCREEN *_nc_retrace_sp( + SCREEN *code) + { return(*(SCREEN **)0); } + +#undef _nc_retrace_win +WINDOW *_nc_retrace_win( + WINDOW *code) + { return(*(WINDOW **)0); } + +#undef _nc_fmt_funcptr +char *_nc_fmt_funcptr( + char *target, + const char *source, + size_t size) + { return(*(char **)0); } + +/* ./trace/lib_traceatr.c */ + +#undef _traceattr2 +char *_traceattr2( + int bufnum, + chtype newmode) + { return(*(char **)0); } + +#undef _traceattr +char *_traceattr( + attr_t newmode) + { return(*(char **)0); } + +#undef _nc_retrace_int_attr_t +int _nc_retrace_int_attr_t( + attr_t code) + { return(*(int *)0); } + +#undef _nc_retrace_attr_t +attr_t _nc_retrace_attr_t( + attr_t code) + { return(*(attr_t *)0); } + +#undef _nc_altcharset_name +const char *_nc_altcharset_name( + attr_t attr, + chtype ch) + { return(*(const char **)0); } + +#undef _tracechtype2 +char *_tracechtype2( + int bufnum, + chtype ch) + { return(*(char **)0); } + +#undef _tracechtype +char *_tracechtype( + chtype ch) + { return(*(char **)0); } + +#undef _nc_retrace_chtype +chtype _nc_retrace_chtype( + chtype code) + { return(*(chtype *)0); } + +#undef _tracecchar_t2 +char *_tracecchar_t2( + int bufnum, + const cchar_t *ch) + { return(*(char **)0); } + +#undef _tracecchar_t +char *_tracecchar_t( + const cchar_t *ch) + { return(*(char **)0); } + +/* ./trace/lib_tracebits.c */ + +#undef _nc_trace_ttymode +char *_nc_trace_ttymode( + const struct termios *tty) + { return(*(char **)0); } + +#undef _nc_tracebits +char *_nc_tracebits(void) + { return(*(char **)0); } + +/* ./trace/lib_tracechr.c */ + +#undef _nc_tracechar +char *_nc_tracechar( + SCREEN *sp, + int ch) + { return(*(char **)0); } + +#undef _tracechar +char *_tracechar( + int ch) + { return(*(char **)0); } + +/* ./tinfo/lib_ttyflags.c */ + +#undef _nc_get_tty_mode_sp +int _nc_get_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_get_tty_mode +int _nc_get_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode_sp +int _nc_set_tty_mode_sp( + SCREEN *sp, + struct termios *buf) + { return(*(int *)0); } + +#undef _nc_set_tty_mode +int _nc_set_tty_mode( + struct termios *buf) + { return(*(int *)0); } + +#undef def_shell_mode_sp +int def_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_shell_mode +int def_shell_mode(void) + { return(*(int *)0); } + +#undef def_prog_mode_sp +int def_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef def_prog_mode +int def_prog_mode(void) + { return(*(int *)0); } + +#undef reset_prog_mode_sp +int reset_prog_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_prog_mode +int reset_prog_mode(void) + { return(*(int *)0); } + +#undef reset_shell_mode_sp +int reset_shell_mode_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef reset_shell_mode +int reset_shell_mode(void) + { return(*(int *)0); } + +#undef savetty_sp +int savetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef savetty +int savetty(void) + { return(*(int *)0); } + +#undef resetty_sp +int resetty_sp( + SCREEN *sp) + { return(*(int *)0); } + +#undef resetty +int resetty(void) + { return(*(int *)0); } + +/* ./tty/lib_twait.c */ + +#undef _nc_timed_wait +int _nc_timed_wait( + SCREEN *sp, + int mode, + int milliseconds, + int *timeleft) + { return(*(int *)0); } + +/* ./tinfo/name_match.c */ + +#undef _nc_first_name +char *_nc_first_name( + const char *const sp) + { return(*(char **)0); } + +#undef _nc_name_match +int _nc_name_match( + const char *const namelst, + const char *const name, + const char *const delim) + { return(*(int *)0); } + +/* ./names.c */ + +#undef boolnames +const char *const boolnames[] = {0}; +#undef boolfnames +const char *const boolfnames[] = {0}; +#undef numnames +const char *const numnames[] = {0}; +#undef numfnames +const char *const numfnames[] = {0}; +#undef strnames +const char *const strnames[] = {0}; +#undef strfnames +const char *const strfnames[] = {0}; + +/* ./tinfo/obsolete.c */ + +#undef _nc_set_buffer_sp +void _nc_set_buffer_sp( + SCREEN *sp, + FILE *ofp, + int buffered) + { /* void */ } + +#undef _nc_set_buffer +void _nc_set_buffer( + FILE *ofp, + int buffered) + { /* void */ } + +/* ./tinfo/read_entry.c */ + +#undef _nc_init_termtype +void _nc_init_termtype( + TERMTYPE2 *const tp) + { /* void */ } + +#undef _nc_read_termtype +int _nc_read_termtype( + TERMTYPE2 *ptr, + char *buffer, + int limit) + { return(*(int *)0); } + +#undef _nc_read_file_entry +int _nc_read_file_entry( + const char *const filename, + TERMTYPE2 *ptr) + { return(*(int *)0); } + +#undef _nc_read_entry2 +int _nc_read_entry2( + const char *const name, + char *const filename, + TERMTYPE2 *const tp) + { return(*(int *)0); } + +#undef _nc_read_entry +int _nc_read_entry( + const char *const name, + char *const filename, + TERMTYPE *const tp) + { return(*(int *)0); } + +/* ./tinfo/read_termcap.c */ + +#undef _nc_read_termcap +void _nc_read_termcap(void) + { /* void */ } + +/* ./tinfo/strings.c */ + +#undef _nc_str_init +string_desc *_nc_str_init( + string_desc *dst, + char *src, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_null +string_desc *_nc_str_null( + string_desc *dst, + size_t len) + { return(*(string_desc **)0); } + +#undef _nc_str_copy +string_desc *_nc_str_copy( + string_desc *dst, + const string_desc *const src) + { return(*(string_desc **)0); } + +#undef _nc_safe_strcat +NCURSES_BOOL _nc_safe_strcat( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +#undef _nc_safe_strcpy +NCURSES_BOOL _nc_safe_strcpy( + string_desc *dst, + const char *src) + { return(*(NCURSES_BOOL *)0); } + +/* ./trace/trace_buf.c */ + +#undef _nc_trace_buf +char *_nc_trace_buf( + int bufnum, + size_t want) + { return(*(char **)0); } + +#undef _nc_trace_bufcat +char *_nc_trace_bufcat( + int bufnum, + const char *value) + { return(*(char **)0); } + +/* ./trace/trace_tries.c */ + +#undef _nc_trace_tries +void _nc_trace_tries( + TRIES *tree) + { /* void */ } + +/* ./base/tries.c */ + +#undef _nc_expand_try +char *_nc_expand_try( + TRIES *tree, + unsigned code, + int *count, + size_t len) + { return(*(char **)0); } + +#undef _nc_remove_key +int _nc_remove_key( + TRIES **tree, + unsigned code) + { return(*(int *)0); } + +#undef _nc_remove_string +int _nc_remove_string( + TRIES **tree, + const char *string) + { return(*(int *)0); } + +/* ./tinfo/trim_sgr0.c */ + +#undef _nc_trim_sgr0 +char *_nc_trim_sgr0( + TERMTYPE2 *tp) + { return(*(char **)0); } + +/* ./unctrl.c */ + +#undef unctrl_sp +const char *unctrl_sp( + SCREEN *sp, + chtype ch) + { return(*(const char **)0); } + +#undef unctrl +const char *unctrl( + chtype ch) + { return(*(const char **)0); } + +/* ./trace/visbuf.c */ + +#undef _nc_visbuf2 +const char *_nc_visbuf2( + int bufnum, + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbuf +const char *_nc_visbuf( + const char *buf) + { return(*(const char **)0); } + +#undef _nc_visbufn +const char *_nc_visbufn( + const char *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswbuf2 +const char *_nc_viswbuf2( + int bufnum, + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbuf +const char *_nc_viswbuf( + const wchar_t *buf) + { return(*(const char **)0); } + +#undef _nc_viswbufn +const char *_nc_viswbufn( + const wchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viswibuf +const char *_nc_viswibuf( + const wint_t *buf) + { return(*(const char **)0); } + +#undef _nc_viscbuf2 +const char *_nc_viscbuf2( + int bufnum, + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +#undef _nc_viscbuf +const char *_nc_viscbuf( + const cchar_t *buf, + int len) + { return(*(const char **)0); } + +/* ./base/define_key.c */ + +#undef define_key_sp +int define_key_sp( + SCREEN *sp, + const char *str, + int keycode) + { return(*(int *)0); } + +#undef define_key +int define_key( + const char *str, + int keycode) + { return(*(int *)0); } + +/* ./tinfo/hashed_db.c */ + +#undef _nc_hashed_db +void _nc_hashed_db(void) + { /* void */ } + +/* ./base/key_defined.c */ + +#undef key_defined_sp +int key_defined_sp( + SCREEN *sp, + const char *str) + { return(*(int *)0); } + +#undef key_defined +int key_defined( + const char *str) + { return(*(int *)0); } + +/* ./base/keybound.c */ + +#undef keybound_sp +char *keybound_sp( + SCREEN *sp, + int code, + int count) + { return(*(char **)0); } + +#undef keybound +char *keybound( + int code, + int count) + { return(*(char **)0); } + +/* ./base/keyok.c */ + +#undef keyok_sp +int keyok_sp( + SCREEN *sp, + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +#undef keyok +int keyok( + int c, + NCURSES_BOOL flag) + { return(*(int *)0); } + +/* ./base/version.c */ + +#undef curses_version +const char *curses_version(void) + { return(*(const char **)0); } diff --git a/contrib/ncurses/ncurses/modules b/contrib/ncurses/ncurses/modules new file mode 100644 index 00000000..e111712e --- /dev/null +++ b/contrib/ncurses/ncurses/modules @@ -0,0 +1,253 @@ +# $Id: modules,v 1.127 2020/09/12 17:58:12 tom Exp $ +############################################################################## +# Copyright 2019,2020 Thomas E. Dickey # +# Copyright 1998-2013,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# + +@ base +# Library objects +hardscroll lib $(serial) $(HEADER_DEPS) +hashmap lib $(serial) $(HEADER_DEPS) +lib_addch lib $(base) $(HEADER_DEPS) +lib_addstr lib $(base) $(HEADER_DEPS) +lib_beep lib $(base) $(HEADER_DEPS) +lib_bkgd lib $(base) $(HEADER_DEPS) +lib_box lib $(base) $(HEADER_DEPS) +lib_chgat lib $(base) $(HEADER_DEPS) +lib_clear lib $(base) $(HEADER_DEPS) +lib_clearok lib $(base) $(HEADER_DEPS) +lib_clrbot lib $(base) $(HEADER_DEPS) +lib_clreol lib $(base) $(HEADER_DEPS) +lib_color lib $(base) $(HEADER_DEPS) $(INCDIR)/tic.h $(srcdir)/new_pair.h +lib_colorset lib $(base) $(HEADER_DEPS) +lib_delch lib $(base) $(HEADER_DEPS) +lib_delwin lib $(base) $(HEADER_DEPS) +lib_echo lib $(base) $(HEADER_DEPS) +lib_endwin lib $(base) $(HEADER_DEPS) +lib_erase lib $(base) $(HEADER_DEPS) +lib_flash lib $(base) $(HEADER_DEPS) +lib_gen lib . $(HEADER_DEPS) +lib_getch lib $(base) $(HEADER_DEPS) $(srcdir)/fifo_defs.h +lib_getstr lib $(base) $(HEADER_DEPS) +lib_hline lib $(base) $(HEADER_DEPS) +lib_immedok lib $(base) $(HEADER_DEPS) +lib_inchstr lib $(base) $(HEADER_DEPS) +lib_initscr lib $(base) $(HEADER_DEPS) +lib_insch lib $(base) $(HEADER_DEPS) +lib_insdel lib $(base) $(HEADER_DEPS) +lib_insnstr lib $(base) $(HEADER_DEPS) +lib_instr lib $(base) $(HEADER_DEPS) +lib_isendwin lib $(base) $(HEADER_DEPS) +lib_leaveok lib $(base) $(HEADER_DEPS) +lib_mouse lib $(base) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_move lib $(base) $(HEADER_DEPS) +lib_mvcur lib $(serial) $(HEADER_DEPS) $(INCDIR)/tic.h $(srcdir)/../progs/dump_entry.h +lib_mvwin lib $(base) $(HEADER_DEPS) +lib_newterm lib $(base) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_newwin lib $(base) $(HEADER_DEPS) +lib_nl lib $(base) $(HEADER_DEPS) +lib_overlay lib $(base) $(HEADER_DEPS) +lib_pad lib $(base) $(HEADER_DEPS) +lib_printw lib $(base) $(HEADER_DEPS) +lib_redrawln lib $(base) $(HEADER_DEPS) +lib_refresh lib $(base) $(HEADER_DEPS) +lib_restart lib $(base) $(HEADER_DEPS) +lib_scanw lib $(base) $(HEADER_DEPS) +lib_screen lib $(base) $(HEADER_DEPS) +lib_scroll lib $(base) $(HEADER_DEPS) +lib_scrollok lib $(base) $(HEADER_DEPS) +lib_scrreg lib $(base) $(HEADER_DEPS) +lib_set_term lib $(base) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_slk lib $(base) $(HEADER_DEPS) +lib_slkatr_set lib $(base) $(HEADER_DEPS) +lib_slkatrof lib $(base) $(HEADER_DEPS) +lib_slkatron lib $(base) $(HEADER_DEPS) +lib_slkatrset lib $(base) $(HEADER_DEPS) +lib_slkattr lib $(base) $(HEADER_DEPS) +lib_slkclear lib $(base) $(HEADER_DEPS) +lib_slkcolor lib $(base) $(HEADER_DEPS) +lib_slkinit lib $(base) $(HEADER_DEPS) +lib_slklab lib $(base) $(HEADER_DEPS) +lib_slkrefr lib $(base) $(HEADER_DEPS) +lib_slkset lib $(base) $(HEADER_DEPS) +lib_slktouch lib $(base) $(HEADER_DEPS) +lib_touch lib $(base) $(HEADER_DEPS) +lib_tracedmp lib $(trace) $(HEADER_DEPS) +lib_tracemse lib $(trace) $(HEADER_DEPS) +lib_tstp lib $(serial) $(HEADER_DEPS) $(srcdir)/SigAction.h +lib_ungetch lib $(base) $(HEADER_DEPS) $(srcdir)/fifo_defs.h +lib_vidattr lib $(serial) $(HEADER_DEPS) +lib_vline lib $(base) $(HEADER_DEPS) +lib_wattroff lib $(base) $(HEADER_DEPS) +lib_wattron lib $(base) $(HEADER_DEPS) +lib_winch lib $(base) $(HEADER_DEPS) +lib_window lib $(base) $(HEADER_DEPS) +link_test lib . $(HEADER_DEPS) +nc_panel lib $(base) $(HEADER_DEPS) +safe_sprintf lib $(base) $(HEADER_DEPS) +tty_update lib $(serial) $(HEADER_DEPS) +varargs lib $(trace) $(HEADER_DEPS) + +# Modules for porting +vsscanf lib $(base) $(HEADER_DEPS) + +# actually an extension, but with its own configure option (--disable-leaks) +lib_freeall lib $(base) $(HEADER_DEPS) $(INCDIR)/tic.h + +# XSI extensions to the base library (wide-character) +@ widechar +charable lib $(wide) $(HEADER_DEPS) +lib_add_wch lib $(wide) $(HEADER_DEPS) +lib_box_set lib $(wide) $(HEADER_DEPS) +lib_cchar lib $(wide) $(HEADER_DEPS) $(srcdir)/new_pair.h +lib_erasewchar lib $(wide) $(HEADER_DEPS) +lib_get_wch lib $(wide) $(HEADER_DEPS) +lib_get_wstr lib $(wide) $(HEADER_DEPS) +lib_hline_set lib $(wide) $(HEADER_DEPS) +lib_in_wch lib $(wide) $(HEADER_DEPS) +lib_in_wchnstr lib $(wide) $(HEADER_DEPS) +lib_ins_wch lib $(wide) $(HEADER_DEPS) +lib_inwstr lib $(wide) $(HEADER_DEPS) +lib_key_name lib $(wide) $(HEADER_DEPS) +lib_pecho_wchar lib $(wide) $(HEADER_DEPS) +lib_slk_wset lib $(wide) $(HEADER_DEPS) +lib_unget_wch lib $(wide) $(HEADER_DEPS) +lib_vid_attr lib $(wide) $(HEADER_DEPS) +lib_vline_set lib $(wide) $(HEADER_DEPS) +lib_wacs lib $(wide) $(HEADER_DEPS) +lib_wunctrl lib $(wide) $(HEADER_DEPS) + +# Extensions to the base library +@ ext_funcs +expanded lib . $(HEADER_DEPS) +legacy_coding lib $(base) $(HEADER_DEPS) +lib_dft_fgbg lib $(base) $(HEADER_DEPS) +lib_print lib $(tinfo) $(HEADER_DEPS) +new_pair lib $(base) $(HEADER_DEPS) $(srcdir)/new_pair.h +resizeterm lib $(base) $(HEADER_DEPS) +trace_xnames lib $(trace) $(HEADER_DEPS) +use_screen lib $(tinfo) $(HEADER_DEPS) +use_window lib $(base) $(HEADER_DEPS) +wresize lib $(base) $(HEADER_DEPS) + +# Support for termcap (and tic, etc.), which can be a separate library +@ termlib +access lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +add_tries lib $(tinfo) $(HEADER_DEPS) +alloc_ttype lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +codes lib . $(HEADER_DEPS) +comp_captab lib . $(HEADER_DEPS) $(INCDIR)/tic.h ../include/hashsize.h +comp_error lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +comp_hash lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h ../include/hashsize.h +comp_userdefs lib . $(HEADER_DEPS) $(INCDIR)/tic.h ../include/hashsize.h +db_iterator lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +doalloc lib $(tinfo) $(HEADER_DEPS) +entries lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +fallback lib . $(HEADER_DEPS) +free_ttype lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +getenv_num lib $(tinfo) $(HEADER_DEPS) +home_terminfo lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +init_keytry lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h init_keytry.h +lib_acs lib $(tinfo) $(HEADER_DEPS) +lib_baudrate lib $(tinfo) $(HEADER_DEPS) ../include/termcap.h +lib_cur_term lib $(tinfo) $(HEADER_DEPS) ../include/termcap.h +lib_data lib $(tinfo) $(HEADER_DEPS) +lib_has_cap lib $(tinfo) $(HEADER_DEPS) +lib_kernel lib $(tinfo) $(HEADER_DEPS) +lib_keyname lib . $(HEADER_DEPS) $(INCDIR)/tic.h +lib_longname lib $(tinfo) $(HEADER_DEPS) +lib_napms lib $(tinfo) $(HEADER_DEPS) +lib_options lib $(tinfo) $(HEADER_DEPS) +lib_raw lib $(tinfo) $(HEADER_DEPS) +lib_setup lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_termcap lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h ../include/termcap.h $(INCDIR)/capdefaults.c +lib_termname lib $(tinfo) $(HEADER_DEPS) +lib_tgoto lib $(tinfo) $(HEADER_DEPS) ../include/termcap.h +lib_ti lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_tparm lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_tputs lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h ../include/termcap.h +lib_trace lib $(trace) $(HEADER_DEPS) $(INCDIR)/tic.h +lib_traceatr lib $(trace) $(HEADER_DEPS) +lib_tracebits lib $(trace) $(HEADER_DEPS) +lib_tracechr lib $(trace) $(HEADER_DEPS) +lib_ttyflags lib $(tinfo) $(HEADER_DEPS) +lib_twait lib $(serial) $(HEADER_DEPS) +name_match lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +names lib . $(HEADER_DEPS) +obsolete lib $(tinfo) $(HEADER_DEPS) +read_entry lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h $(INCDIR)/hashed_db.h +read_termcap lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +strings lib $(tinfo) $(HEADER_DEPS) +trace_buf lib $(trace) $(HEADER_DEPS) +trace_tries lib $(trace) $(HEADER_DEPS) +tries lib $(base) $(HEADER_DEPS) +trim_sgr0 lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +unctrl lib . $(HEADER_DEPS) +visbuf lib $(trace) $(HEADER_DEPS) $(INCDIR)/tic.h + +# Modules used only for tic, other programs using internal interfaces +@ ticlib +alloc_entry lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +captoinfo lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +comp_expand lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +comp_parse lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +comp_scan lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h +parse_entry lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h ../include/parametrized.h +write_entry lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h $(INCDIR)/hashed_db.h + +# Extensions to the termlib library +@ ext_tinfo +define_key lib $(base) $(HEADER_DEPS) +hashed_db lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h $(INCDIR)/hashed_db.h +key_defined lib $(base) $(HEADER_DEPS) +keybound lib $(base) $(HEADER_DEPS) +keyok lib $(base) $(HEADER_DEPS) +version lib $(base) $(HEADER_DEPS) + +# Porting +@ port_drivers +lib_driver lib $(base) $(HEADER_DEPS) + +@ port_win32con +gettimeofday lib $(win32con) $(HEADER_DEPS) +wcwidth lib $(win32con) $(HEADER_DEPS) +widechars lib $(wide) $(HEADER_DEPS) +win_driver lib $(win32con) $(HEADER_DEPS) + +@ port_win32 +lib_win32con lib $(tinfo) $(HEADER_DEPS) +lib_win32util lib $(tinfo) $(HEADER_DEPS) +wcwidth lib $(win32con) $(HEADER_DEPS) +win32_driver lib $(win32con) $(HEADER_DEPS) + +@ port_tinfo +tinfo_driver lib $(tinfo) $(HEADER_DEPS) $(INCDIR)/tic.h + +# vile:makemode diff --git a/contrib/ncurses/ncurses/new_pair.h b/contrib/ncurses/ncurses/new_pair.h new file mode 100644 index 00000000..91e23017 --- /dev/null +++ b/contrib/ncurses/ncurses/new_pair.h @@ -0,0 +1,139 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * Common type definitions and macros for new_pair.c, lib_color.c + * + * $Id: new_pair.h,v 1.15 2024/10/05 20:57:47 tom Exp $ + */ + +#ifndef NEW_PAIR_H +#define NEW_PAIR_H 1 +/* *INDENT-OFF* */ + +#include +#include + +#include + +#undef SCREEN +#define SCREEN struct screen +SCREEN; + +#define LIMIT_TYPED(n,t) \ + (t)(((n) > MAX_OF_TYPE(t)) \ + ? MAX_OF_TYPE(t) \ + : ((n) < -MAX_OF_TYPE(t)) \ + ? -MAX_OF_TYPE(t) \ + : (n)) + +#define limit_COLOR(n) LIMIT_TYPED(n,NCURSES_COLOR_T) +#define limit_PAIRS(n) LIMIT_TYPED(n,NCURSES_PAIRS_T) + +#define MAX_XCURSES_PAIR MAX_OF_TYPE(NCURSES_PAIRS_T) + +#if NCURSES_EXT_COLORS +#define OPTIONAL_PAIR GCC_UNUSED +#define get_extended_pair(opts, color_pair) \ + if ((opts) != NULL) { \ + *(int*)(opts) = color_pair; \ + } +#define set_extended_pair(opts, color_pair) \ + if ((opts) != NULL) { \ + color_pair = *(const int*)(opts); \ + } +#else +#define OPTIONAL_PAIR /* nothing */ +#define get_extended_pair(opts, color_pair) /* nothing */ +#define set_extended_pair(opts, color_pair) \ + if ((opts) != NULL) { \ + color_pair = -1; \ + } +#endif + +#ifdef NEW_PAIR_INTERNAL + +typedef enum { + cpKEEP = -1, /* color pair 0 */ + cpFREE = 0, /* free for use */ + cpINIT = 1 /* initialized */ +} CPMODE; + +typedef struct _color_pairs +{ + int fg; + int bg; +#if NCURSES_EXT_COLORS + int mode; /* tells if the entry is allocated or free */ + int prev; /* index of previous item */ + int next; /* index of next item */ +#endif +} +colorpair_t; + +#define MakeColorPair(target,f,b) target.fg = f, target.bg = b +#define isSamePair(a,b) ((a).fg == (b).fg && (a).bg == (b).bg) +#define FORE_OF(c) (c).fg +#define BACK_OF(c) (c).bg + +/* + * Ensure that we use color pairs only when colors have been started, and also + * that the index is within the limits of the table which we allocated. + */ +#define ValidPair(sp,pair) \ + ((sp != 0) && (pair >= 0) && (pair < sp->_pair_limit) && sp->_coloron) + +#if NCURSES_EXT_FUNCS && NCURSES_EXT_COLORS +extern NCURSES_EXPORT(void) _nc_copy_pairs(SCREEN*, colorpair_t*, colorpair_t*, int); +extern NCURSES_EXPORT(void) _nc_free_ordered_pairs(SCREEN*); +extern NCURSES_EXPORT(void) _nc_reset_color_pair(SCREEN*, int, const colorpair_t*); +extern NCURSES_EXPORT(void) _nc_set_color_pair(SCREEN*, int, int); +#else +#define _nc_free_ordered_pairs(sp) /* nothing */ +#define _nc_reset_color_pair(sp, pair, data) /* nothing */ +#define _nc_set_color_pair(sp, pair, mode) /* nothing */ +#endif + +#else + +typedef struct _color_pairs colorpair_t; + +#endif /* NEW_PAIR_INTERNAL */ + +#if NO_LEAKS +extern NCURSES_EXPORT(void) _nc_new_pair_leaks(SCREEN*); +#endif + +/* *INDENT-ON* */ + +#endif /* NEW_PAIR_H */ diff --git a/contrib/ncurses/ncurses/report_hashing.c b/contrib/ncurses/ncurses/report_hashing.c new file mode 100644 index 00000000..bed96efb --- /dev/null +++ b/contrib/ncurses/ncurses/report_hashing.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include +#include + +MODULE_ID("$Id: report_hashing.c,v 1.3 2020/02/02 23:34:34 tom Exp $") + +static void +check_names(const char *name, NCURSES_CONST char *const *table, int termcap) +{ + int errs = 0; + int n; + struct name_table_entry const *entry_ptr; + const HashValue *hash_table = _nc_get_hash_table(termcap); + + printf("%s:\n", name); + for (n = 0; table[n] != NULL; ++n) { + entry_ptr = _nc_find_entry(table[n], hash_table); + if (entry_ptr == 0) { + printf(" %s\n", table[n]); + errs++; + } + } + if (errs) + printf("%d errors\n", errs); +} + +int +main(void) +{ +#define CHECK_TI(name) check_names(#name, name, 0) +#define CHECK_TC(name) check_names(#name, name, 1) + + CHECK_TI(boolnames); + CHECK_TI(numnames); + CHECK_TI(strnames); + + CHECK_TC(boolcodes); + CHECK_TC(numcodes); + CHECK_TC(strcodes); + + return EXIT_SUCCESS; +} diff --git a/contrib/ncurses/ncurses/report_offsets.c b/contrib/ncurses/ncurses/report_offsets.c new file mode 100644 index 00000000..034a789a --- /dev/null +++ b/contrib/ncurses/ncurses/report_offsets.c @@ -0,0 +1,274 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#define NEW_PAIR_INTERNAL 1 +#include + +MODULE_ID("$Id: report_offsets.c,v 1.29 2024/05/25 23:00:26 tom Exp $") + +#define show_size(type) \ + flag = 0; \ + last = 0; \ + printf("%5lu " #type "\n", (unsigned long)sizeof(type)) +#define show_name(name) \ + printf("%5lu " #name "\n", (unsigned long)(name)) +#define show_offset(type,member) \ + next = (unsigned long)offsetof(type,member); \ + if (last > next) \ + printf("?? incorrect order for " #type "." #member "\n"); \ + printf("%5lu %c " #type "." #member "\n", next, flag ? *flag : ' '); \ + last = next; \ + flag = 0 + +#if NCURSES_WIDECHAR && NCURSES_EXT_COLORS +#define show_COLORS(type,member) { flag = "c"; show_offset(type,member); } +#else +#define show_COLORS(type,member) /* nothing */ +#endif + +#ifdef USE_TERM_DRIVER +#define show_DRIVER(type,member) { flag = "d"; show_offset(type,member); } +#else +#define show_DRIVER(type,member) /* nothing */ +#endif + +#if NO_LEAKS +#define show_MLEAKS(type,member) { flag = "L"; show_offset(type,member); } +#else +#define show_MLEAKS(type,member) /* nothing */ +#endif + +#define show_NORMAL(type,member) { flag = "n"; show_offset(type,member); } +#define show_OPTION(type,member) { flag = "+"; show_offset(type,member); } + +#if USE_REENTRANT +#define show_REENTR(type,member) { flag = "r"; show_offset(type,member); } +#else +#define show_REENTR(type,member) /* nothing */ +#endif + +#if NCURSES_SP_FUNCS +#define show_SPFUNC(type,member) { flag = "s"; show_offset(type,member); } +#else +#define show_SPFUNC(type,member) /* nothing */ +#endif + +#ifdef USE_PTHREADS +#define show_THREAD(type,member) { flag = "t"; show_offset(type,member); } +#else +#define show_THREAD(type,member) /* nothing */ +#endif + +#ifdef TRACE +#define show_TRACES(type,member) { flag = "T"; show_offset(type,member); } +#else +#define show_TRACES(type,member) /* nothing */ +#endif + +#if USE_WIDEC_SUPPORT +#define show_WIDECH(type,member) { flag = "w"; show_offset(type,member); } +#else +#define show_WIDECH(type,member) /* nothing */ +#endif + +int +main(void) +{ + const char *flag = 0; + unsigned long last, next; + + printf("Size/offsets of data structures:\n"); + + show_size(attr_t); + show_size(chtype); +#if USE_WIDEC_SUPPORT + show_size(cchar_t); +#endif + show_size(color_t); + show_size(colorpair_t); + show_size(mmask_t); + show_size(rgb_bits_t); + show_size(MEVENT); + show_size(NCURSES_BOOL); + show_size(TRIES); + + printf("\n"); + printf("Sizes of buffers/arrays:\n"); +#if USE_WIDEC_SUPPORT + show_name(CCHARW_MAX); +#endif + show_name(EV_MAX); + show_name(FIFO_SIZE); + show_name(NAMESIZE); + show_name(MB_LEN_MAX); + show_name(PATH_MAX); +#ifdef TRACE + show_name(TRACECHR_BUF); + show_name(TRACEMSE_MAX); +#endif + + printf("\n"); + show_size(SCREEN); + show_offset(SCREEN, _ifd); + show_offset(SCREEN, _fifo); + show_offset(SCREEN, _fifohead); + show_offset(SCREEN, _direct_color); + show_offset(SCREEN, _panelHook); + show_offset(SCREEN, jump); + show_offset(SCREEN, rsp); +#if NCURSES_NO_PADDING + show_OPTION(SCREEN, _no_padding); +#endif +#if USE_HARD_TABS + show_OPTION(SCREEN, _ht_cost); +#endif +#if USE_ITALIC + show_OPTION(SCREEN, _use_ritm); +#endif +#if USE_KLIBC_KBD + show_OPTION(SCREEN, _extended_key); +#endif +#if NCURSES_EXT_FUNCS + show_OPTION(SCREEN, _assumed_color); +#endif +#if USE_GPM_SUPPORT + show_OPTION(SCREEN, _mouse_gpm_loaded); +#ifdef HAVE_LIBDL + show_OPTION(SCREEN, _dlopen_gpm); +#endif +#endif +#if USE_EMX_MOUSE + show_OPTION(SCREEN, _emxmouse_wfd); +#endif +#if USE_SYSMOUSE + show_OPTION(SCREEN, _sysmouse_fifo); +#endif + show_DRIVER(SCREEN, _drv_mouse_fifo); +#if USE_SIZECHANGE + show_OPTION(SCREEN, _resize); +#endif +#ifdef USE_SP_WINDOWLIST + show_NORMAL(SCREEN, _windowlist); +#endif + show_REENTR(SCREEN, _ttytype); + show_SPFUNC(SCREEN, use_tioctl); + show_WIDECH(SCREEN, _screen_acs_fix); +#if NCURSES_EXT_FUNCS && NCURSES_EXT_COLORS + show_COLORS(SCREEN, _ordered_pairs); +#endif + show_TRACES(SCREEN, tracechr_buf); + + printf("\n"); + show_size(TERMINAL); + show_offset(TERMINAL, type); + show_offset(TERMINAL, Filedes); + show_offset(TERMINAL, Ottyb); + show_offset(TERMINAL, Nttyb); + show_offset(TERMINAL, _baudrate); + show_offset(TERMINAL, _termname); + show_offset(TERMINAL, tparm_state); +#if HAVE_INIT_EXTENDED_COLOR + show_COLORS(TERMINAL, type2); +#endif + + printf("\n"); + show_size(TERMTYPE); +#if NCURSES_XNAMES + show_OPTION(TERMTYPE, ext_str_table); + show_OPTION(TERMTYPE, ext_Strings); +#endif + + printf("\n"); + show_size(TPARM_STATE); + show_offset(TPARM_STATE, stack); + show_offset(TPARM_STATE, stack_ptr); + show_offset(TPARM_STATE, out_buff); + show_offset(TPARM_STATE, fmt_buff); + show_offset(TPARM_STATE, static_vars); + show_TRACES(TPARM_STATE, tname); + + printf("\n"); + show_size(WINDOW); + show_WIDECH(WINDOW, _bkgrnd); + show_COLORS(WINDOW, _color); + + printf("\n"); + show_size(NCURSES_GLOBALS); + show_offset(NCURSES_GLOBALS, init_signals); + show_offset(NCURSES_GLOBALS, tgetent_cache); + show_offset(NCURSES_GLOBALS, dbd_vars); +#if HAVE_TSEARCH + show_offset(NCURSES_GLOBALS, cached_tparm); +#endif + show_DRIVER(NCURSES_GLOBALS, term_driver); +#ifndef USE_SP_WINDOWLIST + show_NORMAL(NCURSES_GLOBALS, _nc_windowlist); +#endif +#if USE_HOME_TERMINFO + show_OPTION(NCURSES_GLOBALS, home_terminfo); +#endif +#if !USE_SAFE_SPRINTF + show_OPTION(NCURSES_GLOBALS, safeprint_rows); +#endif + show_THREAD(NCURSES_GLOBALS, mutex_curses); +#if USE_PTHREADS_EINTR + show_THREAD(NCURSES_GLOBALS, read_thread); +#endif + show_WIDECH(NCURSES_GLOBALS, key_name); + show_TRACES(NCURSES_GLOBALS, trace_opened); + show_TRACES(NCURSES_GLOBALS, trace_level); + show_MLEAKS(NCURSES_GLOBALS, leak_checking); + + printf("\n"); + show_size(NCURSES_PRESCREEN); + show_offset(NCURSES_PRESCREEN, tparm_state); + show_offset(NCURSES_PRESCREEN, saved_tty); + show_offset(NCURSES_PRESCREEN, use_tioctl); + show_offset(NCURSES_PRESCREEN, _outch); +#ifndef USE_SP_RIPOFF + show_NORMAL(NCURSES_PRESCREEN, rippedoff); +#endif +#if NCURSES_NO_PADDING + show_OPTION(NCURSES_PRESCREEN, _no_padding); +#endif +#if BROKEN_LINKER + show_offset(NCURSES_PRESCREEN, real_acs_map); +#else + show_REENTR(NCURSES_PRESCREEN, real_acs_map); +#endif +#if BROKEN_LINKER || USE_REENTRANT + show_TRACES(NCURSES_PRESCREEN, _outchars); +#endif + + return EXIT_SUCCESS; +} diff --git a/contrib/ncurses/ncurses/term.priv.h b/contrib/ncurses/ncurses/term.priv.h new file mode 100644 index 00000000..1f436b5f --- /dev/null +++ b/contrib/ncurses/ncurses/term.priv.h @@ -0,0 +1,364 @@ +/**************************************************************************** + * Copyright 2021-2023,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: term.priv.h,v 1.13 2024/03/02 20:43:06 tom Exp $ + * + * term.priv.h + * + * Header file for terminfo library objects which are private to + * the library. + */ + +#ifndef _TERM_PRIV_H +#define _TERM_PRIV_H 1 +/* *INDENT-OFF* */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#ifndef __NCURSES_H +#include +#endif + +#undef NCURSES_OPAQUE +#define NCURSES_INTERNALS 1 +#define NCURSES_OPAQUE 0 + +#if HAVE_LIMITS_H +# include /* PATH_MAX, MB_LEN_MAX, etc */ +#elif HAVE_SYS_PARAM_H +# include +#endif + +#include /* sig_atomic_t */ +#include /* time_t */ +#include /* time_t */ + +#ifdef USE_PTHREADS +#if USE_REENTRANT +#include +#endif +#endif + +/* + * If not properly configured to use the system's limits.h, we get gcc's + * fallback for limits.h which sets MB_LEN_MAX to 1, which is never correct. + */ +#if !HAVE_CONSISTENT_MB_LEN_MAX +#undef MB_LEN_MAX +#endif + +#ifndef MB_LEN_MAX +#define MB_LEN_MAX 16 /* should be >= MB_CUR_MAX, but that may be a function */ +#endif + +#ifndef PATH_MAX +# if defined(_POSIX_PATH_MAX) +# define PATH_MAX _POSIX_PATH_MAX +# elif defined(MAXPATHLEN) +# define PATH_MAX MAXPATHLEN +# else +# define PATH_MAX 255 /* the Posix minimum path-size */ +# endif +#endif + +/* + * State of tparm(). + */ +#define STACKSIZE 20 + +typedef struct { + union { + int num; + char * str; + } data; + bool num_type; +} STACK_FRAME; + +#define NUM_VARS 26 + +typedef struct { + const char * tparam_base; + + STACK_FRAME stack[STACKSIZE]; + int stack_ptr; + + char * out_buff; + size_t out_size; + size_t out_used; + + char * fmt_buff; + size_t fmt_size; + + int static_vars[NUM_VARS]; +#ifdef TRACE + const char * tname; +#endif +} TPARM_STATE; + +typedef struct { + char * text; + size_t size; +} TRACEBUF; + +typedef struct { + const char * name; + char * value; +} ITERATOR_VARS; + +/* + * Internals for term.h + */ +typedef struct term { /* describe an actual terminal */ + TERMTYPE type; /* terminal type description */ + short Filedes; /* file description being written to */ + TTY Ottyb; /* original state of the terminal */ + TTY Nttyb; /* current state of the terminal */ + int _baudrate; /* used to compute padding */ + char * _termname; /* used for termname() */ + TPARM_STATE tparm_state; +#if NCURSES_EXT_COLORS + TERMTYPE2 type2; /* extended terminal type description */ +#endif +#undef TERMINAL +} TERMINAL; + +/* + * Internals for soft-keys + */ +typedef struct { + WINDOW * win; /* the window used in the hook */ + int line; /* lines to take, < 0 => from bottom*/ + int (*hook)(WINDOW *, int); /* callback for user */ +} ripoff_t; + +/* + * Internals for tgetent + */ +typedef struct { + long sequence; + bool last_used; + char * fix_sgr0; /* this holds the filtered sgr0 string */ + char * last_bufp; /* help with fix_sgr0 leak */ + TERMINAL * last_term; +} TGETENT_CACHE; + +#define TGETENT_MAX 4 + +#include /* dbdLAST */ + +#ifdef USE_TERM_DRIVER +struct DriverTCB; /* Terminal Control Block forward declaration */ +#endif + +/* + * Global data which is not specific to a screen. + */ +typedef struct { + SIG_ATOMIC_T have_sigtstp; + SIG_ATOMIC_T have_sigwinch; + SIG_ATOMIC_T cleanup_nested; + + bool init_signals; + bool init_screen; + + char * comp_sourcename; + char * comp_termtype; + + bool have_tic_directory; + bool keep_tic_directory; + const char * tic_directory; + + char * dbi_list; + int dbi_size; + + char * first_name; + char ** keyname_table; + int init_keyname; + + int slk_format; + + int getstr_limit; /* getstr_limit based on POSIX LINE_MAX */ + + char * safeprint_buf; + size_t safeprint_used; + + TGETENT_CACHE tgetent_cache[TGETENT_MAX]; + int tgetent_index; + long tgetent_sequence; + int terminal_count; + + char * dbd_blob; /* string-heap for dbd_list[] */ + char ** dbd_list; /* distinct places to look for data */ + int dbd_size; /* length of dbd_list[] */ + time_t dbd_time; /* cache last updated */ + ITERATOR_VARS dbd_vars[dbdLAST]; + +#if HAVE_TSEARCH + void * cached_tparm; + int count_tparm; +#endif /* HAVE_TSEARCH */ + +#ifdef USE_TERM_DRIVER + int (*term_driver)(struct DriverTCB*, const char*, int*); +#endif + +#define WINDOWLIST struct _win_list + +#ifndef USE_SP_WINDOWLIST + WINDOWLIST * _nc_windowlist; +#define WindowList(sp) _nc_globals._nc_windowlist +#endif + +#if USE_HOME_TERMINFO + char * home_terminfo; +#endif + +#if !USE_SAFE_SPRINTF + int safeprint_cols; + int safeprint_rows; +#endif + +#ifdef USE_PTHREADS + pthread_mutex_t mutex_curses; + pthread_mutex_t mutex_prescreen; + pthread_mutex_t mutex_screen; + pthread_mutex_t mutex_update; + pthread_mutex_t mutex_tst_tracef; + pthread_mutex_t mutex_tracef; + int nested_tracef; + int use_pthreads; +#define _nc_use_pthreads _nc_globals.use_pthreads +#if USE_PTHREADS_EINTR + pthread_t read_thread; /* The reading thread */ +#endif +#endif +#if USE_WIDEC_SUPPORT + char key_name[MB_LEN_MAX + 1]; +#endif + +#ifdef TRACE + bool trace_opened; + int trace_level; + FILE * trace_fp; + int trace_fd; + + char * tracearg_buf; + size_t tracearg_used; + + TRACEBUF * tracebuf_ptr; + size_t tracebuf_used; + + char tracechr_buf[40]; + + char * tracedmp_buf; + size_t tracedmp_used; + + unsigned char * tracetry_buf; + size_t tracetry_used; + + char traceatr_color_buf[2][80]; + int traceatr_color_sel; + int traceatr_color_last; +#if !defined(USE_PTHREADS) && USE_REENTRANT + int nested_tracef; +#endif +#endif /* TRACE */ + +#if NO_LEAKS + bool leak_checking; +#endif +} NCURSES_GLOBALS; + +extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; + +#define N_RIPS 5 + +#ifdef USE_PTHREADS +typedef struct _prescreen_list { + struct _prescreen_list *next; + pthread_t id; + struct screen * sp; +} PRESCREEN_LIST; +#endif + +/* + * Global data which can be swept up into a SCREEN when one is created. + * It may be modified before the next SCREEN is created. + */ +typedef struct { +#ifdef USE_PTHREADS + PRESCREEN_LIST *allocated; +#else + struct screen * allocated; +#endif + bool use_env; + bool filter_mode; + attr_t previous_attr; + TPARM_STATE tparm_state; + TTY * saved_tty; /* savetty/resetty information */ + bool use_tioctl; + NCURSES_SP_OUTC _outch; /* output handler if not putc */ +#ifndef USE_SP_RIPOFF + ripoff_t rippedoff[N_RIPS]; + ripoff_t * rsp; +#endif +#if NCURSES_NO_PADDING + bool _no_padding; /* flag to set if padding disabled */ +#endif +#if BROKEN_LINKER || USE_REENTRANT + chtype * real_acs_map; + int _LINES; + int _COLS; + int _TABSIZE; + int _ESCDELAY; + TERMINAL * _cur_term; +#endif +#ifdef TRACE +#if BROKEN_LINKER || USE_REENTRANT + long _outchars; + const char * _tputs_trace; +#endif +#endif +} NCURSES_PRESCREEN; + +extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen; + +extern NCURSES_EXPORT(void) _nc_free_tparm(TERMINAL*); + +#ifdef __cplusplus +} +#endif + +/* *INDENT-ON* */ + +#endif /* _TERM_PRIV_H */ diff --git a/contrib/ncurses/ncurses/tinfo/MKcaptab.awk b/contrib/ncurses/ncurses/tinfo/MKcaptab.awk new file mode 100644 index 00000000..ee4e2e9b --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/MKcaptab.awk @@ -0,0 +1,95 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998-2006,2007 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKcaptab.awk,v 1.21 2020/02/02 23:34:34 tom Exp $ +function add_string(text) { + if (text != "IGNORE") { + offsets[num_strings] = offset; + offset = offset + length(text) + 1; + printf "%s\\0", text; + } else { + offsets[num_strings] = -1; + } + num_strings = num_strings + 1; + if ((num_strings % 3) == 0) { + printf "\\\n"; + } + return offsets[num_strings - 1]; +} +BEGIN { + first = 1; + num_aliases = 0; + num_strings = 0; + offset = 0; +} + +/^[^#]/ { + if (first) { + printf "/* generated by MKcaptab.awk %s(%d) */\n", tablename, bigstrings; + print "" + if (bigstrings) { + printf "static struct alias *_nc_%s_table = 0;\n", tablename; + print ""; + printf "static const char %s_text[] = \"\\\n", tablename; + } else { + printf "static const struct alias _nc_%s_table[] =\n", tablename; + printf "{\n"; + } + first = 0; + } + if ($1 == tablename) { + if ($3 == "IGNORE") { + to = "(char *)NULL"; + } else { + to = "\"" $3 "\""; + } + if (bigstrings) { + c1 = add_string($2); + c2 = add_string($3); + c3 = add_string($4); + aliases[num_aliases] = sprintf("\t{%5d, %5d, %5d},\t /* %s */", c1, c2, c3, $5); + num_aliases = num_aliases + 1; + } else { + printf "\t{\"%s\", %s, \"%s\"},\t /* %s */\n", $2, to, $4, $5; + } + } + } +END { + if (bigstrings) { + printf "\";\n\n"; + printf "static const alias_table_data %s_data[] = {\n", tablename; + for (n = 0; n < num_aliases; ++n) { + printf "%s\n", aliases[n]; + } + printf "};\n\n"; + } else { + printf "\t{(char *)NULL, (char *)NULL, (char *)NULL}\n"; + printf "};\n\n"; + } + } +# vile:sw=4: diff --git a/contrib/ncurses/ncurses/tinfo/MKcaptab.sh b/contrib/ncurses/ncurses/tinfo/MKcaptab.sh new file mode 100755 index 00000000..5f413502 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/MKcaptab.sh @@ -0,0 +1,236 @@ +#!/bin/sh +############################################################################## +# Copyright 2019-2020,2023 Thomas E. Dickey # +# Copyright 2007-2010,2011 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKcaptab.sh,v 1.20 2023/04/22 15:12:57 tom Exp $ + +if test $# != 0 +then + AWK="$1"; shift 1 +else + AWK=awk +fi + +if test $# != 0 +then + OPT1="$1"; shift 1 +else + OPT1="-0" +fi + +if test $# != 0 +then + OPT2="$1"; shift 1 +else + OPT2="tinfo/MKcaptab.awk" +fi + +cat < +#include +#include + +/* *INDENT-OFF* */ +EOF + +cat "$@" |./make_hash 1 info $OPT1 +cat "$@" |./make_hash 3 cap $OPT1 + +cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=capalias + +cat "$@" |$AWK -f $OPT2 bigstrings=$OPT1 tablename=infoalias + +cat <= 0) { \\ + (*actual)[n].field = strings + source[n].field; \\ + } + +static const struct alias * +_nc_build_alias(struct alias **actual, + const alias_table_data * source, + const char *strings, + size_t tablesize) +{ + if (*actual == 0) { + *actual = typeCalloc(struct alias, tablesize + 1); + if (*actual != 0) { + size_t n; + for (n = 0; n < tablesize; ++n) { + add_alias(from); + add_alias(to); + add_alias(source); + } + } + } + return *actual; +} + +#define build_names(root) _nc_build_names(&_nc_##root##_table, \\ + root##_names_data, \\ + root##_names_text) +#define build_alias(root) _nc_build_alias(&_nc_##root##alias_table, \\ + root##alias_data, \\ + root##alias_text, \\ + SIZEOF(root##alias_data)) +#else +#define build_names(root) _nc_ ## root ## _table +#define build_alias(root) _nc_ ## root ## alias_table +#endif + +NCURSES_EXPORT(const struct name_table_entry *) +_nc_get_table(bool termcap) +{ + return termcap ? build_names(cap) : build_names(info); +} + +NCURSES_EXPORT(const HashValue *) +_nc_get_hash_table(bool termcap) +{ + return termcap ? _nc_cap_hash_table : _nc_info_hash_table; +} + +NCURSES_EXPORT(const struct alias *) +_nc_get_alias_table(bool termcap) +{ + return termcap ? build_alias(cap) : build_alias(info); +} + +static HashValue +info_hash(const char *string) +{ + long sum = 0; + + DEBUG(9, ("hashing %s", string)); + while (*string) { + sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8)); + string++; + } + + DEBUG(9, ("sum is %ld", sum)); + return (HashValue) (sum % HASHTABSIZE); +} + +#define TCAP_LEN 2 /* only 1- or 2-character names are used */ + +static HashValue +tcap_hash(const char *string) +{ + char temp[TCAP_LEN + 1]; + int limit = 0; + + while (*string) { + temp[limit++] = *string++; + if (limit >= TCAP_LEN) + break; + } + temp[limit] = '\0'; + return info_hash(temp); +} + +static int +compare_tcap_names(const char *a, const char *b) +{ + return !strncmp(a, b, (size_t) TCAP_LEN); +} + +static int +compare_info_names(const char *a, const char *b) +{ + return !strcmp(a, b); +} + +static const HashData hash_data[2] = +{ + {HASHTABSIZE, _nc_info_hash_table, info_hash, compare_info_names}, + {HASHTABSIZE, _nc_cap_hash_table, tcap_hash, compare_tcap_names} +}; + +NCURSES_EXPORT(const HashData *) +_nc_get_hash_info(bool termcap) +{ + return &hash_data[(termcap != FALSE)]; +} + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_comp_captab_leaks(void) +{ +#if $OPT1 + FreeIfNeeded(_nc_cap_table); + FreeIfNeeded(_nc_info_table); + FreeIfNeeded(_nc_capalias_table); + FreeIfNeeded(_nc_infoalias_table); +#endif +} +#endif /* NO_LEAKS */ +EOF diff --git a/contrib/ncurses/ncurses/tinfo/MKcodes.awk b/contrib/ncurses/ncurses/tinfo/MKcodes.awk new file mode 100644 index 00000000..48f4800b --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/MKcodes.awk @@ -0,0 +1,176 @@ +############################################################################## +# Copyright 2019,2020 Thomas E. Dickey # +# Copyright 2007-2009,2010 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKcodes.awk,v 1.11 2020/02/02 23:34:34 tom Exp $ +function large_item(value) { + result = sprintf("%d,", offset); + offset = offset + length(value) + 1; + offcol = offcol + length(result) + 2; + if (offcol > 70) { + result = result "\n"; + offcol = 0; + } else { + result = result " "; + } + bigstr = bigstr sprintf("\"%s\\0\" ", value); + bigcol = bigcol + length(value) + 5; + if (bigcol > 70) { + bigstr = bigstr "\\\n"; + bigcol = 0; + } + return result; +} + +function small_item(value) { + return sprintf("\t\t\"%s\",\n", value); +} + +function print_strings(name,value) { + printf "DCL(%s) = {\n", name + print value + print "\t\t(NCURSES_CONST char *)0," + print "};" + print "" +} + +function print_offsets(name,value) { + printf "static const short _nc_offset_%s[] = {\n", name + printf "%s", value + print "};" + print "" + printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name + print "" +} + +BEGIN { + print "/* This file was generated by MKcodes.awk */" + print "" + print "#include " + print "" + print "#define IT NCURSES_CONST char * const" + print "" + offset = 0; + offcol = 0; + bigcol = 0; + } + +$1 ~ /^#/ {next;} +$1 ~ /^(cap|info)alias/ {next;} + +$1 == "userdef" {next;} +$1 == "SKIPWARN" {next;} + +$3 == "bool" { + small_boolcodes = small_boolcodes small_item($4); + large_boolcodes = large_boolcodes large_item($4); + } + +$3 == "num" { + small_numcodes = small_numcodes small_item($4); + large_numcodes = large_numcodes large_item($4); + } + +$3 == "str" { + small_strcodes = small_strcodes small_item($4); + large_strcodes = large_strcodes large_item($4); + } + +END { + print "" + print "#if BROKEN_LINKER || USE_REENTRANT" + print "" + if (bigstrings) { + printf "static const char _nc_code_blob[] = \n" + printf "%s;\n", bigstr; + print_offsets("boolcodes", large_boolcodes); + print_offsets("numcodes", large_numcodes); + print_offsets("strcodes", large_strcodes); + print "" + print "static IT *" + print "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)" + print "{" + print " if (*value == 0) {" + print " if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {" + print " unsigned n;" + print " for (n = 0; n < size; ++n) {" + print " (*value)[n] = (NCURSES_CONST char *) _nc_code_blob + offsets[n];" + print " }" + print " }" + print " }" + print " return *value;" + print "}" + print "" + print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return alloc_array(&ptr_##it, _nc_offset_##it, SIZEOF(_nc_offset_##it)); }" + } else { + print "#define DCL(it) static IT data##it[]" + print "" + print_strings("boolcodes", small_boolcodes); + print_strings("numcodes", small_numcodes); + print_strings("strcodes", small_strcodes); + print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return data##it; }" + } + print "" + print "/* remove public definition which conflicts with FIX() */" + print "#undef boolcodes" + print "#undef numcodes" + print "#undef strcodes" + print "" + print "/* add local definition */" + print "FIX(boolcodes)" + print "FIX(numcodes)" + print "FIX(strcodes)" + print "" + print "/* restore the public definition */" + print "" + print "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }" + print "#define boolcodes NCURSES_PUBLIC_VAR(boolcodes())" + print "#define numcodes NCURSES_PUBLIC_VAR(numcodes())" + print "#define strcodes NCURSES_PUBLIC_VAR(strcodes())" + print "" + print "#if NO_LEAKS" + print "NCURSES_EXPORT(void)" + print "_nc_codes_leaks(void)" + print "{" + if (bigstrings) { + print "FREE_FIX(boolcodes)" + print "FREE_FIX(numcodes)" + print "FREE_FIX(strcodes)" + } + print "}" + print "#endif" + print "" + print "#else" + print "" + print "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]" + print "" + print_strings("boolcodes", small_boolcodes); + print_strings("numcodes", small_numcodes); + print_strings("strcodes", small_strcodes); + print "" + print "#endif /* BROKEN_LINKER */" + } diff --git a/contrib/ncurses/ncurses/tinfo/MKfallback.sh b/contrib/ncurses/ncurses/tinfo/MKfallback.sh new file mode 100755 index 00000000..02b36ed7 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/MKfallback.sh @@ -0,0 +1,167 @@ +#!/bin/sh +############################################################################## +# Copyright 2020,2023 Thomas E. Dickey # +# Copyright 1998-2019,2020 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKfallback.sh,v 1.26 2023/04/22 15:12:57 tom Exp $ +# +# MKfallback.sh -- create fallback table for entry reads +# +# This script generates source code for a custom version of read_entry.c +# that (instead of reading capabilities for an argument terminal type +# from an on-disk terminfo tree) tries to match the type with one of a +# specified list of types generated in. +# + +terminfo_dir=$1 +shift + +terminfo_src=$1 +shift + +tic_path=$1 +test -z "$tic_path" && tic_path=tic +shift + +infocmp_path=$1 +test -z "$infocmp_path" && infocmp_path=infocmp +shift + +case "$tic_path" in #(vi +/*) + tic_head=`echo "$tic_path" | sed -e 's,/[^/]*$,,'` + PATH=$tic_head:$PATH + export PATH + ;; +esac + +if test $# != 0 ; then + tmp_info=tmp_info + echo creating temporary terminfo directory... >&2 + + TERMINFO=`pwd`/$tmp_info + export TERMINFO + + TERMINFO_DIRS=$TERMINFO:$terminfo_dir + export TERMINFO_DIRS + + "$tic_path" -x "$terminfo_src" >&2 +else + tmp_info= +fi + +cat < + +EOF + +if [ "$*" ] +then + cat < + +/* fallback entries for: $* */ +EOF + for x in "$@" + do + echo "/* $x */" + "$infocmp_path" -E "$x" | sed -e 's/\/NCURSES_INT2/g' + done + + cat <term_names, name, "|")) { + return(tp); + } + } +EOF +else + echo " /* the fallback list is empty */"; +fi + +cat <&2 + rm -rf $tmp_info +fi diff --git a/contrib/ncurses/ncurses/tinfo/MKkeys_list.sh b/contrib/ncurses/ncurses/tinfo/MKkeys_list.sh new file mode 100755 index 00000000..05ac8cf6 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/MKkeys_list.sh @@ -0,0 +1,71 @@ +#! /bin/sh +# $Id: MKkeys_list.sh,v 1.9 2024/01/19 12:26:30 tom Exp $ +############################################################################## +# Copyright 2019-2022,2024 Thomas E. Dickey # +# Copyright 2001-2003,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# MKkey_defs.sh -- generate list of function-keys for terminfo database +# +# Author: Thomas E. Dickey 2001 +# +# Extract function-key names from the Caps file +# +: ${AWK-awk} +: ${USE_SIGWINCH-0} +if test $# != 0 +then + DATA="$*" +else + DATA=../../include/Caps +fi + +data=data$$ +trap 'rm -f $data; exit 1' 1 2 3 15 +trap 'rm -f $data' 0 +cat $DATA | sed -e 's/[ ][ ]*/ /g' >$data + +cat < 70) { + result = result "\n"; + offcol = 0; + } else { + result = result " "; + } + bigstr = bigstr sprintf("\"%s\\0\" ", value); + bigcol = bigcol + length(value) + 5; + if (bigcol > 70) { + bigstr = bigstr "\\\n"; + bigcol = 0; + } + return result; +} + +function small_item(value) { + return sprintf("\t\t\"%s\",\n", value); +} + +function print_strings(name,value) { + printf "DCL(%s) = {\n", name + print value + print "\t\t(NCURSES_CONST char *)0," + print "};" + print "" +} + +function print_offsets(name,value) { + printf "static const short _nc_offset_%s[] = {\n", name + printf "%s", value + print "};" + print "" + printf "static NCURSES_CONST char ** ptr_%s = 0;\n", name + print "" +} + +BEGIN { + print "/* This file was generated by MKnames.awk */" + print "" + print "#include " + print "" + print "#define IT NCURSES_CONST char * const" + print "" + offset = 0; + offcol = 0; + bigcol = 0; + } + +$1 ~ /^#/ {next;} +$1 ~ /^(cap|info)alias/ {next;} + +$1 == "userdef" {next;} +$1 == "SKIPWARN" {next;} + +$3 == "bool" { + small_boolnames = small_boolnames small_item($2); + large_boolnames = large_boolnames large_item($2); + small_boolfnames = small_boolfnames small_item($1); + large_boolfnames = large_boolfnames large_item($1); + } + +$3 == "num" { + small_numnames = small_numnames small_item($2); + large_numnames = large_numnames large_item($2); + small_numfnames = small_numfnames small_item($1); + large_numfnames = large_numfnames large_item($1); + } + +$3 == "str" { + small_strnames = small_strnames small_item($2); + large_strnames = large_strnames large_item($2); + small_strfnames = small_strfnames small_item($1); + large_strfnames = large_strfnames large_item($1); + } + +END { + print "" + print "#if BROKEN_LINKER || USE_REENTRANT" + print "" + if (bigstrings) { + printf "static const char _nc_name_blob[] = \n" + printf "%s;\n", bigstr; + print_offsets("boolfnames", large_boolfnames); + print_offsets("boolnames", large_boolnames); + print_offsets("numfnames", large_numfnames); + print_offsets("numnames", large_numnames); + print_offsets("strfnames", large_strfnames); + print_offsets("strnames", large_strnames); + print "" + print "static IT *" + print "alloc_array(NCURSES_CONST char ***value, const short *offsets, unsigned size)" + print "{" + print " if (*value == 0) {" + print " if ((*value = typeCalloc(NCURSES_CONST char *, size + 1)) != 0) {" + print " unsigned n;" + print " for (n = 0; n < size; ++n) {" + print " (*value)[n] = (NCURSES_CONST char *) _nc_name_blob + offsets[n];" + print " }" + print " }" + print " }" + print " return *value;" + print "}" + print "" + print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return alloc_array(&ptr_##it, _nc_offset_##it, SIZEOF(_nc_offset_##it)); }" + } else { + print "#define DCL(it) static IT data##it[]" + print "" + print_strings("boolnames", small_boolnames); + print_strings("boolfnames", small_boolfnames); + print_strings("numnames", small_numnames); + print_strings("numfnames", small_numfnames); + print_strings("strnames", small_strnames); + print_strings("strfnames", small_strfnames); + print "#define FIX(it) NCURSES_IMPEXP IT * NCURSES_API NCURSES_PUBLIC_VAR(it)(void) { return data##it; }" + } + print "" + print "/* remove public definition which conflicts with FIX() */" + print "#undef boolnames" + print "#undef boolfnames" + print "#undef numnames" + print "#undef numfnames" + print "#undef strnames" + print "#undef strfnames" + print "" + print "/* add local definition */" + print "FIX(boolnames)" + print "FIX(boolfnames)" + print "FIX(numnames)" + print "FIX(numfnames)" + print "FIX(strnames)" + print "FIX(strfnames)" + print "" + print "/* restore the public definition */" + print "#define boolnames NCURSES_PUBLIC_VAR(boolnames())" + print "#define boolfnames NCURSES_PUBLIC_VAR(boolfnames())" + print "#define numnames NCURSES_PUBLIC_VAR(numnames())" + print "#define numfnames NCURSES_PUBLIC_VAR(numfnames())" + print "#define strnames NCURSES_PUBLIC_VAR(strnames())" + print "#define strfnames NCURSES_PUBLIC_VAR(strfnames())" + print "" + print "#define FREE_FIX(it) if (ptr_##it) { FreeAndNull(ptr_##it); }" + print "" + print "#if NO_LEAKS" + print "NCURSES_EXPORT(void)" + print "_nc_names_leaks(void)" + print "{" + if (bigstrings) { + print "FREE_FIX(boolnames)" + print "FREE_FIX(boolfnames)" + print "FREE_FIX(numnames)" + print "FREE_FIX(numfnames)" + print "FREE_FIX(strnames)" + print "FREE_FIX(strfnames)" + } + print "}" + print "#endif" + print "" + print "#else" + print "" + print "#define DCL(it) NCURSES_EXPORT_VAR(IT) it[]" + print "" + print_strings("boolnames", small_boolnames); + print_strings("boolfnames", small_boolfnames); + print_strings("numnames", small_numnames); + print_strings("numfnames", small_numfnames); + print_strings("strnames", small_strnames); + print_strings("strfnames", small_strfnames); + print "" + print "#endif /* BROKEN_LINKER */" + } diff --git a/contrib/ncurses/ncurses/tinfo/MKuserdefs.sh b/contrib/ncurses/ncurses/tinfo/MKuserdefs.sh new file mode 100755 index 00000000..109dd644 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/MKuserdefs.sh @@ -0,0 +1,146 @@ +#!/bin/sh +############################################################################## +# Copyright 2019,2020 Thomas E. Dickey # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: MKuserdefs.sh,v 1.10 2020/02/02 23:34:34 tom Exp $ +AWK=${1-awk}; shift 1 +OPT1=${1-0}; shift 1 + +cat < +#include +#include + +#if NCURSES_XNAMES +EOF + +cat "$@" | ./make_hash 1 user $OPT1 + +cat < + +#include + +#ifndef USE_ROOT_ACCESS +#if HAVE_SETFSUID +#include +#else +#include +#endif +#endif + +#if HAVE_GETAUXVAL && HAVE_SYS_AUXV_H && defined(__GLIBC__) && (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) +#include +#define USE_GETAUXVAL 1 +#else +#define USE_GETAUXVAL 0 +#endif + +#include + +MODULE_ID("$Id: access.c,v 1.39 2024/09/21 15:12:56 tom Exp $") + +#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c)) + +#ifdef _NC_MSC +# define ACCESS(FN, MODE) access((FN), (MODE)&(R_OK|W_OK)) +#else +# define ACCESS access +#endif + +NCURSES_EXPORT(char *) +_nc_rootname(char *path) +{ + char *result = _nc_basename(path); +#if !MIXEDCASE_FILENAMES || defined(PROG_EXT) + static char *temp; + char *s; + + if ((temp = strdup(result)) != 0) + result = temp; +#if !MIXEDCASE_FILENAMES + for (s = result; *s != '\0'; ++s) { + *s = (char) LOWERCASE(*s); + } +#endif +#if defined(PROG_EXT) + if ((s = strrchr(result, '.')) != 0) { + if (!strcmp(s, PROG_EXT)) + *s = '\0'; + } +#endif +#endif + return result; +} + +/* + * Check if a string appears to be an absolute pathname. + */ +NCURSES_EXPORT(bool) +_nc_is_abs_path(const char *path) +{ +#if defined(__EMX__) || defined(__DJGPP__) +#define is_pathname(s) ((((s) != 0) && ((s)[0] == '/')) \ + || (((s)[0] != 0) && ((s)[1] == ':'))) +#else +#define is_pathname(s) ((s) != 0 && (s)[0] == '/') +#endif + return is_pathname(path); +} + +/* + * Return index of the basename + */ +NCURSES_EXPORT(unsigned) +_nc_pathlast(const char *path) +{ + const char *test = strrchr(path, '/'); +#ifdef __EMX__ + if (test == 0) + test = strrchr(path, '\\'); +#endif + if (test == 0) + test = path; + else + test++; + return (unsigned) (test - path); +} + +NCURSES_EXPORT(char *) +_nc_basename(char *path) +{ + return path + _nc_pathlast(path); +} + +NCURSES_EXPORT(int) +_nc_access(const char *path, int mode) +{ + int result; + + if (path == 0) { + result = -1; + } else if (ACCESS(path, mode) < 0) { + if ((mode & W_OK) != 0 + && errno == ENOENT + && strlen(path) < PATH_MAX) { + char head[PATH_MAX]; + char *leaf; + + _nc_STRCPY(head, path, sizeof(head)); + leaf = _nc_basename(head); + if (leaf == 0) + leaf = head; + *leaf = '\0'; + if (head == leaf) + _nc_STRCPY(head, ".", sizeof(head)); + + result = ACCESS(head, R_OK | W_OK | X_OK); + } else { + result = -1; + } + } else { + result = 0; + } + return result; +} + +NCURSES_EXPORT(bool) +_nc_is_dir_path(const char *path) +{ + bool result = FALSE; + struct stat sb; + + if (stat(path, &sb) == 0 + && S_ISDIR(sb.st_mode)) { + result = TRUE; + } + return result; +} + +NCURSES_EXPORT(bool) +_nc_is_file_path(const char *path) +{ + bool result = FALSE; + struct stat sb; + + if (stat(path, &sb) == 0 + && S_ISREG(sb.st_mode)) { + result = TRUE; + } + return result; +} + +#if HAVE_GETEUID && HAVE_GETEGID +#define is_posix_elevated() \ + (getuid() != geteuid() \ + || getgid() != getegid()) +#else +#define is_posix_elevated() FALSE +#endif + +#if HAVE_ISSETUGID +#define is_elevated() issetugid() +#elif USE_GETAUXVAL && defined(AT_SECURE) +#define is_elevated() \ + (getauxval(AT_SECURE) \ + ? TRUE \ + : (errno != ENOENT \ + ? FALSE \ + : is_posix_elevated())) +#else +#define is_elevated() is_posix_elevated() +#endif + +#if HAVE_SETFSUID +#define lower_privileges() \ + int save_err = errno; \ + setfsuid(getuid()); \ + setfsgid(getgid()); \ + errno = save_err +#define resume_elevation() \ + save_err = errno; \ + setfsuid(geteuid()); \ + setfsgid(getegid()); \ + errno = save_err +#else +#define lower_privileges() /* nothing */ +#define resume_elevation() /* nothing */ +#endif + +/* + * Returns true if not running as root or setuid. We use this check to allow + * applications to use environment variables that are used for searching lists + * of directories, etc. + */ +NCURSES_EXPORT(int) +_nc_env_access(void) +{ + int result = TRUE; + +#if HAVE_GETUID && HAVE_GETEUID +#if !defined(USE_SETUID_ENVIRON) + if (is_elevated()) { + result = FALSE; + } +#endif +#if !defined(USE_ROOT_ENVIRON) + if ((getuid() == ROOT_UID) || (geteuid() == ROOT_UID)) { + result = FALSE; + } +#endif +#endif /* HAVE_GETUID && HAVE_GETEUID */ + return result; +} + +#ifndef USE_ROOT_ACCESS +static int +is_a_file(int fd) +{ + int result = FALSE; + if (fd >= 0) { + struct stat sb; + if (fstat(fd, &sb) == 0) { + switch (sb.st_mode & S_IFMT) { + case S_IFBLK: + case S_IFCHR: + case S_IFDIR: + /* disallow devices and directories */ + break; + default: + /* allow regular files, fifos and sockets */ + result = TRUE; + break; + } + } + } + return result; +} + +/* + * Limit privileges if possible; otherwise disallow access for updating files. + */ +NCURSES_EXPORT(FILE *) +_nc_safe_fopen(const char *path, const char *mode) +{ + FILE *result = NULL; +#if HAVE_SETFSUID + lower_privileges(); + result = fopen(path, mode); + resume_elevation(); +#else + if (!is_elevated() || *mode == 'r') { + result = fopen(path, mode); + } +#endif + if (result != NULL) { + if (!is_a_file(fileno(result))) { + fclose(result); + result = NULL; + } + } + return result; +} + +NCURSES_EXPORT(int) +_nc_safe_open3(const char *path, int flags, mode_t mode) +{ + int result = -1; +#if HAVE_SETFSUID + lower_privileges(); + result = open(path, flags, mode); + resume_elevation(); +#else + if (!is_elevated() || (flags & O_RDONLY)) { + result = open(path, flags, mode); + } +#endif + if (result >= 0) { + if (!is_a_file(result)) { + close(result); + result = -1; + } + } + return result; +} +#endif /* USE_ROOT_ACCESS */ diff --git a/contrib/ncurses/ncurses/tinfo/add_tries.c b/contrib/ncurses/ncurses/tinfo/add_tries.c new file mode 100644 index 00000000..9d215575 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/add_tries.c @@ -0,0 +1,124 @@ +/**************************************************************************** + * Copyright 2019-2020,2023 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998-on * + ****************************************************************************/ + +/* +** add_tries.c +** +** Add keycode/string to tries-tree. +** +*/ + +#include +#include + +MODULE_ID("$Id: add_tries.c,v 1.13 2023/06/24 15:36:13 tom Exp $") + +#define SET_TRY(dst,src) if ((dst->ch = *src++) == 128) dst->ch = '\0' +#define CMP_TRY(a,b) ((a)? (a == b) : (b == 128)) + +NCURSES_EXPORT(int) +_nc_add_to_try(TRIES ** tree, const char *str, unsigned code) +{ + TRIES *ptr, *savedptr; + unsigned const char *txt = (unsigned const char *) str; + + T((T_CALLED("_nc_add_to_try(%p, %s, %u)"), + (void *) *tree, _nc_visbuf(str), code)); + if (!VALID_STRING(str) || *txt == '\0' || code == 0) + returnCode(ERR); + + if ((*tree) != 0) { + ptr = savedptr = (*tree); + + for (;;) { + unsigned char cmp = *txt; + + while (!CMP_TRY(ptr->ch, cmp) + && ptr->sibling != 0) + ptr = ptr->sibling; + + if (CMP_TRY(ptr->ch, cmp)) { + if (*(++txt) == '\0') { + ptr->value = (unsigned short) code; + returnCode(OK); + } + if (ptr->child != 0) + ptr = ptr->child; + else + break; + } else { + if ((ptr->sibling = typeCalloc(TRIES, 1)) == 0) { + returnCode(ERR); + } + + savedptr = ptr = ptr->sibling; + SET_TRY(ptr, txt); + ptr->value = 0; + + break; + } + } /* end for (;;) */ + } else { /* (*tree) == 0 :: First sequence to be added */ + savedptr = ptr = (*tree) = typeCalloc(TRIES, 1); + + if (ptr == 0) { + returnCode(ERR); + } + + SET_TRY(ptr, txt); + ptr->value = 0; + } + + /* at this point, we are adding to the try. ptr->child == 0 */ + + while (*txt) { + ptr->child = typeCalloc(TRIES, 1); + + ptr = ptr->child; + + if (ptr == 0) { + while ((ptr = savedptr) != 0) { + savedptr = ptr->child; + free(ptr); + } + *tree = NULL; + returnCode(ERR); + } + + SET_TRY(ptr, txt); + ptr->value = 0; + } + + ptr->value = (unsigned short) code; + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/tinfo/alloc_entry.c b/contrib/ncurses/ncurses/tinfo/alloc_entry.c new file mode 100644 index 00000000..6280ad4a --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/alloc_entry.c @@ -0,0 +1,414 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 1998-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * alloc_entry.c -- allocation functions for terminfo entries + * + * _nc_copy_entry() + * _nc_init_entry() + * _nc_merge_entry() + * _nc_save_str() + * _nc_wrap_entry() + * + */ + +#include + +#include + +MODULE_ID("$Id: alloc_entry.c,v 1.79 2023/09/15 08:16:12 tom Exp $") + +#define ABSENT_OFFSET -1 +#define CANCELLED_OFFSET -2 + +static char *stringbuf; /* buffer for string capabilities */ +static size_t next_free; /* next free character in stringbuf */ + +NCURSES_EXPORT(void) +_nc_init_entry(ENTRY * const tp) +/* initialize a terminal type data block */ +{ + DEBUG(2, (T_CALLED("_nc_init_entry(tp=%p)"), (void *) tp)); + + if (tp == NULL) { +#if NO_LEAKS + if (stringbuf != NULL) { + FreeAndNull(stringbuf); + } + return; +#else + _nc_err_abort("_nc_init_entry called without initialization"); +#endif + } + + if (stringbuf == NULL) + TYPE_CALLOC(char, (size_t) MAX_ENTRY_SIZE, stringbuf); + + next_free = 0; + + _nc_init_termtype(&(tp->tterm)); + + DEBUG(2, (T_RETURN(""))); +} + +NCURSES_EXPORT(ENTRY *) +_nc_copy_entry(ENTRY * oldp) +{ + ENTRY *newp; + + DEBUG(2, (T_CALLED("_nc_copy_entry(oldp=%p)"), (void *) oldp)); + + newp = typeCalloc(ENTRY, 1); + if (newp != NULL) { + *newp = *oldp; + _nc_copy_termtype2(&(newp->tterm), &(oldp->tterm)); + } + + DEBUG(2, (T_RETURN("%p"), (void *) newp)); + return (newp); +} + +/* save a copy of string in the string buffer */ +NCURSES_EXPORT(char *) +_nc_save_str(const char *string) +{ + char *result = 0; + size_t old_next_free = next_free; + + if (stringbuf != NULL) { + size_t len; + + if (!VALID_STRING(string)) + string = ""; + len = strlen(string) + 1; + + if (len == 1 && next_free != 0) { + /* + * Cheat a little by making an empty string point to the end of the + * previous string. + */ + if (next_free < MAX_ENTRY_SIZE) { + result = (stringbuf + next_free - 1); + } + } else if (next_free + len < MAX_ENTRY_SIZE) { + _nc_STRCPY(&stringbuf[next_free], string, MAX_ENTRY_SIZE); + DEBUG(7, ("Saved string %s", _nc_visbuf(string))); + DEBUG(7, ("at location %d", (int) next_free)); + next_free += len; + result = (stringbuf + old_next_free); + } else { + _nc_warning("Too much data, some is lost: %s", string); + } + } + return result; +} + +NCURSES_EXPORT(void) +_nc_wrap_entry(ENTRY * const ep, bool copy_strings) +/* copy the string parts to allocated storage, preserving pointers to it */ +{ + int offsets[MAX_ENTRY_SIZE / sizeof(short)]; + int useoffsets[MAX_USES]; + unsigned i, n; + unsigned nuses; + TERMTYPE2 *tp; + + DEBUG(2, (T_CALLED("_nc_wrap_entry(ep=%p, copy_strings=%d)"), (void *) + ep, copy_strings)); + if (ep == NULL || stringbuf == NULL) + _nc_err_abort("_nc_wrap_entry called without initialization"); + + nuses = ep->nuses; + tp = &(ep->tterm); + if (copy_strings) { + next_free = 0; /* clear static storage */ + + /* copy term_names, Strings, uses */ + tp->term_names = _nc_save_str(tp->term_names); + for_each_string(i, tp) { + if (VALID_STRING(tp->Strings[i])) { + tp->Strings[i] = _nc_save_str(tp->Strings[i]); + } + } + + for (i = 0; i < nuses; i++) { + if (ep->uses[i].name == 0) { + ep->uses[i].name = _nc_save_str(ep->uses[i].name); + } + } + + free(tp->str_table); + } + + assert(tp->term_names >= stringbuf); + n = (unsigned) (tp->term_names - stringbuf); + for_each_string(i, &(ep->tterm)) { + if (i < SIZEOF(offsets)) { + if (tp->Strings[i] == ABSENT_STRING) { + offsets[i] = ABSENT_OFFSET; + } else if (tp->Strings[i] == CANCELLED_STRING) { + offsets[i] = CANCELLED_OFFSET; + } else { + offsets[i] = (int) (tp->Strings[i] - stringbuf); + } + } + } + + for (i = 0; i < nuses; i++) { + if (ep->uses[i].name == 0) + useoffsets[i] = ABSENT_OFFSET; + else + useoffsets[i] = (int) (ep->uses[i].name - stringbuf); + } + + TYPE_MALLOC(char, next_free, tp->str_table); + (void) memcpy(tp->str_table, stringbuf, next_free); + + tp->term_names = tp->str_table + n; + for_each_string(i, &(ep->tterm)) { + if (i < SIZEOF(offsets)) { + if (offsets[i] == ABSENT_OFFSET) { + tp->Strings[i] = ABSENT_STRING; + } else if (offsets[i] == CANCELLED_OFFSET) { + tp->Strings[i] = CANCELLED_STRING; + } else { + tp->Strings[i] = tp->str_table + offsets[i]; + } + } + } + +#if NCURSES_XNAMES + if (!copy_strings) { + if ((n = (unsigned) NUM_EXT_NAMES(tp)) != 0) { + if (n < SIZEOF(offsets)) { + size_t length = 0; + size_t offset; + for (i = 0; i < n; i++) { + length += strlen(tp->ext_Names[i]) + 1; + offsets[i] = (int) (tp->ext_Names[i] - stringbuf); + } + TYPE_MALLOC(char, length, tp->ext_str_table); + for (i = 0, offset = 0; i < n; i++) { + tp->ext_Names[i] = tp->ext_str_table + offset; + _nc_STRCPY(tp->ext_Names[i], + stringbuf + offsets[i], + length - offset); + offset += strlen(tp->ext_Names[i]) + 1; + } + } + } + } +#endif + + for (i = 0; i < nuses; i++) { + if (useoffsets[i] == ABSENT_OFFSET) { + ep->uses[i].name = 0; + } else { + ep->uses[i].name = strdup(tp->str_table + useoffsets[i]); + } + } + DEBUG(2, (T_RETURN(""))); +} + +NCURSES_EXPORT(void) +_nc_merge_entry(ENTRY * const target, ENTRY * const source) +/* merge capabilities from `from' entry into `to' entry */ +{ + TERMTYPE2 *to = &(target->tterm); + TERMTYPE2 *from = &(source->tterm); +#if NCURSES_XNAMES + TERMTYPE2 copy; + size_t str_size, copy_size; + char *str_table; +#endif + unsigned i; + + if (source == 0 || from == 0 || target == 0 || to == 0) + return; + +#if NCURSES_XNAMES + _nc_copy_termtype2(©, from); + from = © + _nc_align_termtype(to, from); + /* + * compute the maximum size of the string-table. + */ + str_size = strlen(to->term_names) + 1; + for_each_string(i, from) { + if (VALID_STRING(from->Strings[i])) + str_size += strlen(from->Strings[i]) + 1; + } + for_each_string(i, to) { + if (VALID_STRING(to->Strings[i])) + str_size += strlen(to->Strings[i]) + 1; + } + /* allocate a string-table large enough for both source/target, and + * copy all of the strings into that table. In the merge, we will + * select from the original source/target lists to construct a new + * target list. + */ + if (str_size != 0) { + char *str_copied; + if ((str_table = malloc(str_size)) == NULL) + _nc_err_abort(MSG_NO_MEMORY); + str_copied = str_table; + _nc_STRCPY(str_copied, to->term_names, str_size); + to->term_names = str_copied; + copy_size = strlen(str_copied) + 1; + str_copied += copy_size; + str_size -= copy_size; + for_each_string(i, from) { + if (VALID_STRING(from->Strings[i])) { + _nc_STRCPY(str_copied, from->Strings[i], str_size); + from->Strings[i] = str_copied; + copy_size = strlen(str_copied) + 1; + str_copied += copy_size; + str_size -= copy_size; + } + } + for_each_string(i, to) { + if (VALID_STRING(to->Strings[i])) { + _nc_STRCPY(str_copied, to->Strings[i], str_size); + to->Strings[i] = str_copied; + copy_size = strlen(str_copied) + 1; + str_copied += copy_size; + str_size -= copy_size; + } + } + free(to->str_table); + to->str_table = str_table; + free(from->str_table); + } + /* + * Do the same for the extended-strings (i.e., lists of capabilities). + */ + str_size = 0; + for (i = 0; i < NUM_EXT_NAMES(from); ++i) { + if (VALID_STRING(from->ext_Names[i])) + str_size += strlen(from->ext_Names[i]) + 1; + } + for (i = 0; i < NUM_EXT_NAMES(to); ++i) { + if (VALID_STRING(to->ext_Names[i])) + str_size += strlen(to->ext_Names[i]) + 1; + } + /* allocate a string-table large enough for both source/target, and + * copy all of the strings into that table. In the merge, we will + * select from the original source/target lists to construct a new + * target list. + */ + if (str_size != 0) { + char *str_copied; + if ((str_table = malloc(str_size)) == NULL) + _nc_err_abort(MSG_NO_MEMORY); + str_copied = str_table; + for (i = 0; i < NUM_EXT_NAMES(from); ++i) { + if (VALID_STRING(from->ext_Names[i])) { + _nc_STRCPY(str_copied, from->ext_Names[i], str_size); + from->ext_Names[i] = str_copied; + copy_size = strlen(str_copied) + 1; + str_copied += copy_size; + str_size -= copy_size; + } + } + for (i = 0; i < NUM_EXT_NAMES(to); ++i) { + if (VALID_STRING(to->ext_Names[i])) { + _nc_STRCPY(str_copied, to->ext_Names[i], str_size); + to->ext_Names[i] = str_copied; + copy_size = strlen(str_copied) + 1; + str_copied += copy_size; + str_size -= copy_size; + } + } + free(to->ext_str_table); + to->ext_str_table = str_table; + free(from->ext_str_table); + } +#endif + for_each_boolean(i, from) { + if (to->Booleans[i] != (NCURSES_SBOOL) CANCELLED_BOOLEAN) { + int mergebool = from->Booleans[i]; + + if (mergebool == CANCELLED_BOOLEAN) + to->Booleans[i] = FALSE; + else if (mergebool == TRUE) + to->Booleans[i] = (NCURSES_SBOOL) mergebool; + } + } + + for_each_number(i, from) { + if (to->Numbers[i] != CANCELLED_NUMERIC) { + int mergenum = from->Numbers[i]; + + if (mergenum == CANCELLED_NUMERIC) + to->Numbers[i] = ABSENT_NUMERIC; + else if (mergenum != ABSENT_NUMERIC) + to->Numbers[i] = (NCURSES_INT2) mergenum; + } + } + + /* + * Note: the copies of strings this makes don't have their own + * storage. This is OK right now, but will be a problem if we + * we ever want to deallocate entries. + */ + for_each_string(i, from) { + if (to->Strings[i] != CANCELLED_STRING) { + char *mergestring = from->Strings[i]; + + if (mergestring == CANCELLED_STRING) + to->Strings[i] = ABSENT_STRING; + else if (mergestring != ABSENT_STRING) + to->Strings[i] = mergestring; + } + } +#if NCURSES_XNAMES + /* cleanup */ + free(copy.Booleans); + free(copy.Numbers); + free(copy.Strings); + free(copy.ext_Names); +#endif +} + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_alloc_entry_leaks(void) +{ + if (stringbuf != NULL) { + FreeAndNull(stringbuf); + } + next_free = 0; +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/alloc_ttype.c b/contrib/ncurses/ncurses/tinfo/alloc_ttype.c new file mode 100644 index 00000000..ae45b002 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/alloc_ttype.c @@ -0,0 +1,713 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1999-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999-on * + ****************************************************************************/ + +/* + * align_ttype.c -- functions for TERMTYPE + * + * _nc_align_termtype() + * _nc_copy_termtype() + * + */ + +#include + +#include + +MODULE_ID("$Id: alloc_ttype.c,v 1.52 2024/07/27 19:22:23 tom Exp $") + +#if NCURSES_XNAMES +/* + * Merge the a/b lists into dst. Both a/b are sorted (see _nc_extend_names()), + * so we do not have to worry about order dependencies. + */ +static int +merge_names(char **dst, char **a, int na, char **b, int nb) +{ + int n = 0; + while (na > 0 && nb > 0) { + int cmp = strcmp(*a, *b); + if (cmp < 0) { + dst[n++] = *a++; + na--; + } else if (cmp > 0) { + dst[n++] = *b++; + nb--; + } else { + dst[n++] = *a; + a++, b++; + na--, nb--; + } + } + while (na-- > 0) { + dst[n++] = *a++; + } + while (nb-- > 0) { + dst[n++] = *b++; + } + DEBUG(4, ("merge_names -> %d", n)); + return n; +} + +static bool +find_name(char **table, int item, int length, const char *name) +{ + int n; + int result = -1; + + for (n = item; n < length; ++n) { + if (!strcmp(table[n], name)) { + DEBUG(4, ("found name '%s' @%d", name, n)); + result = n; + break; + } + } + if (result < 0) { + DEBUG(4, ("did not find name '%s'", name)); + } + return (result >= 0); +} + +#define EXTEND_NUM(num, ext) \ + DEBUG(4, ("extending " #num " from %d to %d", \ + to->num, (unsigned short) (to->num + (ext - to->ext)))); \ + to->num = (unsigned short) (to->num + (ext - to->ext)) + +static void +realign_data(TERMTYPE2 *to, char **ext_Names, + int ext_Booleans, + int ext_Numbers, + int ext_Strings) +{ + int n, m, base; + int to_Booleans = to->ext_Booleans; + int to_Numbers = to->ext_Numbers; + int to_Strings = to->ext_Strings; + int to1, to2, from; + + DEBUG(4, ("realign_data %d/%d/%d vs %d/%d/%d", + ext_Booleans, + ext_Numbers, + ext_Strings, + to->ext_Booleans, + to->ext_Numbers, + to->ext_Strings)); + + if (to->ext_Booleans != ext_Booleans) { + to1 = 0; + to2 = to_Booleans + to1; + from = 0; + EXTEND_NUM(num_Booleans, ext_Booleans); + TYPE_REALLOC(NCURSES_SBOOL, to->num_Booleans, to->Booleans); + for (n = to->ext_Booleans - 1, + m = ext_Booleans - 1, + base = to->num_Booleans - (m + 1); m >= 0; m--) { + if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) { + to->Booleans[base + m] = to->Booleans[base + n--]; + } else { + to->Booleans[base + m] = FALSE; + } + } + to->ext_Booleans = UShort(ext_Booleans); + } + + if (to->ext_Numbers != ext_Numbers) { + to1 = to_Booleans; + to2 = to_Numbers + to1; + from = ext_Booleans; + EXTEND_NUM(num_Numbers, ext_Numbers); + TYPE_REALLOC(NCURSES_INT2, to->num_Numbers, to->Numbers); + for (n = to->ext_Numbers - 1, + m = ext_Numbers - 1, + base = to->num_Numbers - (m + 1); m >= 0; m--) { + if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) { + to->Numbers[base + m] = to->Numbers[base + n--]; + } else { + to->Numbers[base + m] = ABSENT_NUMERIC; + } + } + to->ext_Numbers = UShort(ext_Numbers); + } + + if (to->ext_Strings != ext_Strings) { + to1 = to_Booleans + to_Numbers; + to2 = to_Strings + to1; + from = ext_Booleans + ext_Numbers; + EXTEND_NUM(num_Strings, ext_Strings); + TYPE_REALLOC(char *, to->num_Strings, to->Strings); + for (n = to->ext_Strings - 1, + m = ext_Strings - 1, + base = to->num_Strings - (m + 1); m >= 0; m--) { + if (find_name(to->ext_Names, to1, to2, ext_Names[m + from])) { + to->Strings[base + m] = to->Strings[base + n--]; + } else { + to->Strings[base + m] = ABSENT_STRING; + } + } + to->ext_Strings = UShort(ext_Strings); + } +} + +/* + * Returns the first index in ext_Names[] for the given token-type + */ +static unsigned +_nc_first_ext_name(const TERMTYPE2 *tp, int token_type) +{ + unsigned first; + + switch (token_type) { + case BOOLEAN: + first = 0; + break; + case NUMBER: + first = tp->ext_Booleans; + break; + case STRING: + first = (unsigned) (tp->ext_Booleans + tp->ext_Numbers); + break; + default: + first = 0; + break; + } + return first; +} + +/* + * Returns the last index in ext_Names[] for the given token-type + */ +static unsigned +_nc_last_ext_name(const TERMTYPE2 *tp, int token_type) +{ + unsigned last; + + switch (token_type) { + case BOOLEAN: + last = tp->ext_Booleans; + break; + case NUMBER: + last = (unsigned) (tp->ext_Booleans + tp->ext_Numbers); + break; + default: + case STRING: + last = NUM_EXT_NAMES(tp); + break; + } + return last; +} + +/* + * Lookup an entry from extended-names, returning -1 if not found + */ +static int +_nc_find_ext_name(const TERMTYPE2 *tp, const char *name, int token_type) +{ + unsigned j; + unsigned first = _nc_first_ext_name(tp, token_type); + unsigned last = _nc_last_ext_name(tp, token_type); + + for (j = first; j < last; j++) { + if (!strcmp(name, tp->ext_Names[j])) { + return (int) j; + } + } + return -1; +} + +/* + * Translate an index into ext_Names[] into the corresponding index into data + * (e.g., Booleans[]). + */ +static int +_nc_ext_data_index(const TERMTYPE2 *tp, int n, int token_type) +{ + switch (token_type) { + case BOOLEAN: + n += (tp->num_Booleans - tp->ext_Booleans); + break; + case NUMBER: + n += (tp->num_Numbers - tp->ext_Numbers) + - (tp->ext_Booleans); + break; + default: + case STRING: + n += (tp->num_Strings - tp->ext_Strings) + - (tp->ext_Booleans + tp->ext_Numbers); + } + return n; +} + +/* + * Adjust tables to remove (not free) an extended name and its corresponding + * data. + */ +static bool +_nc_del_ext_name(TERMTYPE2 *tp, const char *name, int token_type) +{ + int first; + + if ((first = _nc_find_ext_name(tp, name, token_type)) >= 0) { + int j; + int last = (int) NUM_EXT_NAMES(tp) - 1; + + for (j = first; j < last; j++) { + tp->ext_Names[j] = tp->ext_Names[j + 1]; + } + first = _nc_ext_data_index(tp, first, token_type); + switch (token_type) { + case BOOLEAN: + last = tp->num_Booleans - 1; + for (j = first; j < last; j++) + tp->Booleans[j] = tp->Booleans[j + 1]; + tp->ext_Booleans--; + tp->num_Booleans--; + break; + case NUMBER: + last = tp->num_Numbers - 1; + for (j = first; j < last; j++) + tp->Numbers[j] = tp->Numbers[j + 1]; + tp->ext_Numbers--; + tp->num_Numbers--; + break; + case STRING: + last = tp->num_Strings - 1; + for (j = first; j < last; j++) + tp->Strings[j] = tp->Strings[j + 1]; + tp->ext_Strings--; + tp->num_Strings--; + break; + } + return TRUE; + } + return FALSE; +} + +/* + * Adjust tables to insert an extended name, making room for new data. The + * index into the corresponding data array is returned. + */ +static int +_nc_ins_ext_name(TERMTYPE2 *tp, char *name, int token_type) +{ + unsigned first = _nc_first_ext_name(tp, token_type); + unsigned last = _nc_last_ext_name(tp, token_type); + unsigned total = NUM_EXT_NAMES(tp) + 1; + unsigned j, k; + + for (j = first; j < last; j++) { + int cmp = strcmp(name, tp->ext_Names[j]); + if (cmp == 0) + /* already present */ + return _nc_ext_data_index(tp, (int) j, token_type); + if (cmp < 0) { + break; + } + } + + TYPE_REALLOC(char *, total, tp->ext_Names); + for (k = total - 1; k > j; k--) + tp->ext_Names[k] = tp->ext_Names[k - 1]; + tp->ext_Names[j] = name; + j = (unsigned) _nc_ext_data_index(tp, (int) j, token_type); + + switch (token_type) { + case BOOLEAN: + tp->ext_Booleans++; + tp->num_Booleans++; + TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans); + for (k = (unsigned) (tp->num_Booleans - 1); k > j; k--) + tp->Booleans[k] = tp->Booleans[k - 1]; + break; + case NUMBER: + tp->ext_Numbers++; + tp->num_Numbers++; + TYPE_REALLOC(NCURSES_INT2, tp->num_Numbers, tp->Numbers); + for (k = (unsigned) (tp->num_Numbers - 1); k > j; k--) + tp->Numbers[k] = tp->Numbers[k - 1]; + break; + case STRING: + tp->ext_Strings++; + tp->num_Strings++; + TYPE_REALLOC(char *, tp->num_Strings, tp->Strings); + for (k = (unsigned) (tp->num_Strings - 1); k > j; k--) + tp->Strings[k] = tp->Strings[k - 1]; + break; + } + return (int) j; +} + +/* + * Look for strings that are marked cancelled, which happen to be the same name + * as a boolean or number. We'll get this as a special case when we get a + * cancellation of a name that is inherited from another entry. + */ +static void +adjust_cancels(TERMTYPE2 *to, TERMTYPE2 *from) +{ + int first = to->ext_Booleans + to->ext_Numbers; + int last = first + to->ext_Strings; + int j, k; + + DEBUG(3, (T_CALLED("adjust_cancels(%s), from(%s)"), + NonNull(to->term_names), + NonNull(from->term_names))); + for (j = first; j < last;) { + char *name = to->ext_Names[j]; + int j_str = to->num_Strings - first - to->ext_Strings; + + if (to->Strings[j + j_str] == CANCELLED_STRING) { + if (_nc_find_ext_name(from, to->ext_Names[j], BOOLEAN) >= 0) { + if (_nc_del_ext_name(to, name, STRING) + || _nc_del_ext_name(to, name, NUMBER)) { + k = _nc_ins_ext_name(to, name, BOOLEAN); + to->Booleans[k] = FALSE; + } else { + j++; + } + } else if (_nc_find_ext_name(from, to->ext_Names[j], NUMBER) >= 0) { + if (_nc_del_ext_name(to, name, STRING) + || _nc_del_ext_name(to, name, BOOLEAN)) { + k = _nc_ins_ext_name(to, name, NUMBER); + to->Numbers[k] = CANCELLED_NUMERIC; + } else { + j++; + } + } else if (_nc_find_ext_name(from, to->ext_Names[j], STRING) >= 0) { + if (_nc_del_ext_name(to, name, NUMBER) + || _nc_del_ext_name(to, name, BOOLEAN)) { + k = _nc_ins_ext_name(to, name, STRING); + to->Strings[k] = CANCELLED_STRING; + } else { + j++; + } + } else { + j++; + } + } else { + j++; + } + } + DEBUG(3, (T_RETURN(""))); +} + +NCURSES_EXPORT(void) +_nc_align_termtype(TERMTYPE2 *to, TERMTYPE2 *from) +{ + int na; + int nb; + char **ext_Names; + + na = to ? ((int) NUM_EXT_NAMES(to)) : 0; + nb = from ? ((int) NUM_EXT_NAMES(from)) : 0; + + DEBUG(2, (T_CALLED("_nc_align_termtype to(%d:%s), from(%d:%s)"), + na, to ? NonNull(to->term_names) : "?", + nb, from ? NonNull(from->term_names) : "?")); + + if (to != NULL && from != NULL && (na != 0 || nb != 0)) { + int ext_Booleans, ext_Numbers, ext_Strings; + bool used_ext_Names = FALSE; + + if ((na == nb) /* check if the arrays are equivalent */ + &&(to->ext_Booleans == from->ext_Booleans) + && (to->ext_Numbers == from->ext_Numbers) + && (to->ext_Strings == from->ext_Strings)) { + int n; + bool same; + + for (n = 0, same = TRUE; n < na; n++) { + if (strcmp(to->ext_Names[n], from->ext_Names[n])) { + same = FALSE; + break; + } + } + if (same) { + DEBUG(2, (T_RETURN(""))); + return; + } + } + /* + * This is where we pay for having a simple extension representation. + * Allocate a new ext_Names array and merge the two ext_Names arrays + * into it, updating to's counts for booleans, etc. Fortunately we do + * this only for the terminfo compiler (tic) and comparer (infocmp). + */ + TYPE_MALLOC(char *, (size_t)(na + nb), ext_Names); + + if (to->ext_Strings && (from->ext_Booleans + from->ext_Numbers)) + adjust_cancels(to, from); + + if (from->ext_Strings && (to->ext_Booleans + to->ext_Numbers)) + adjust_cancels(from, to); + + ext_Booleans = merge_names(ext_Names, + to->ext_Names, + to->ext_Booleans, + from->ext_Names, + from->ext_Booleans); + ext_Numbers = merge_names(ext_Names + ext_Booleans, + to->ext_Names + + to->ext_Booleans, + to->ext_Numbers, + from->ext_Names + + from->ext_Booleans, + from->ext_Numbers); + ext_Strings = merge_names(ext_Names + ext_Numbers + ext_Booleans, + to->ext_Names + + to->ext_Booleans + + to->ext_Numbers, + to->ext_Strings, + from->ext_Names + + from->ext_Booleans + + from->ext_Numbers, + from->ext_Strings); + /* + * Now we must reallocate the Booleans, etc., to allow the data to be + * overlaid. + */ + if (na != (ext_Booleans + ext_Numbers + ext_Strings)) { + realign_data(to, ext_Names, ext_Booleans, ext_Numbers, ext_Strings); + FreeIfNeeded(to->ext_Names); + to->ext_Names = ext_Names; + DEBUG(2, ("realigned %d extended names for '%s' (to)", + NUM_EXT_NAMES(to), to->term_names)); + used_ext_Names = TRUE; + } + if (nb != (ext_Booleans + ext_Numbers + ext_Strings)) { + nb = (ext_Booleans + ext_Numbers + ext_Strings); + realign_data(from, ext_Names, ext_Booleans, ext_Numbers, ext_Strings); + TYPE_REALLOC(char *, (size_t) nb, from->ext_Names); + memcpy(from->ext_Names, ext_Names, sizeof(char *) * (size_t) nb); + DEBUG(2, ("realigned %d extended names for '%s' (from)", + NUM_EXT_NAMES(from), from->term_names)); + } + if (!used_ext_Names) + free(ext_Names); + } + DEBUG(2, (T_RETURN(""))); +} +#endif + +#define srcINT 1 +#define dstINT 2 + +/* + * TERMTYPE and TERMTYPE2 differ only with regard to the values in Numbers. + * Use 'mode' to decide which to use. + */ +static void +copy_termtype(TERMTYPE2 *dst, const TERMTYPE2 *src, int mode) +{ + unsigned i; + int pass; + char *new_table; + size_t new_table_size; +#if NCURSES_EXT_NUMBERS + short *oldptr = 0; + int *newptr = 0; +#endif + + DEBUG(2, (T_CALLED("copy_termtype(dst=%p, src=%p, mode=%d)"), (void *) + dst, (const void *) src, mode)); + *dst = *src; /* ...to copy the sizes and string-tables */ + + TYPE_MALLOC(NCURSES_SBOOL, NUM_BOOLEANS(dst), dst->Booleans); + TYPE_MALLOC(char *, NUM_STRINGS(dst), dst->Strings); + + memcpy(dst->Booleans, + src->Booleans, + NUM_BOOLEANS(dst) * sizeof(dst->Booleans[0])); + memcpy(dst->Strings, + src->Strings, + NUM_STRINGS(dst) * sizeof(dst->Strings[0])); + + new_table = NULL; + new_table_size = 0; + for (pass = 0; pass < 2; ++pass) { + size_t str_size = 0; + if (src->term_names != NULL) { + if (pass) { + dst->term_names = new_table + str_size; + _nc_STRCPY(dst->term_names + str_size, + src->term_names, + new_table_size - str_size); + } + str_size += strlen(src->term_names) + 1; + } + for_each_string(i, src) { + if (VALID_STRING(src->Strings[i])) { + if (pass) { + _nc_STRCPY(new_table + str_size, + src->Strings[i], + new_table_size - str_size); + dst->Strings[i] = new_table + str_size; + } + str_size += strlen(src->Strings[i]) + 1; + } + } + if (pass) { + dst->str_table = new_table; + } else { + ++str_size; + if ((new_table = malloc(str_size)) == NULL) + _nc_err_abort(MSG_NO_MEMORY); + new_table_size = str_size; + } + } + +#if NCURSES_EXT_NUMBERS + if ((mode & dstINT) == 0) { + DEBUG(2, ("...convert int ->short")); + TYPE_MALLOC(short, NUM_NUMBERS(dst), oldptr); + ((TERMTYPE *) dst)->Numbers = oldptr; + } else { + DEBUG(2, ("...copy without changing size")); + TYPE_MALLOC(int, NUM_NUMBERS(dst), newptr); + dst->Numbers = newptr; + } + if ((mode == srcINT) && (oldptr != 0)) { + DEBUG(2, ("...copy int ->short")); + for (i = 0; i < NUM_NUMBERS(dst); ++i) { + if (src->Numbers[i] > MAX_OF_TYPE(short)) { + oldptr[i] = MAX_OF_TYPE(short); + } else { + oldptr[i] = (short) src->Numbers[i]; + } + } + } else if ((mode == dstINT) && (newptr != 0)) { + DEBUG(2, ("...copy short ->int")); + for (i = 0; i < NUM_NUMBERS(dst); ++i) { + newptr[i] = ((const short *) (src->Numbers))[i]; + } + } else { + DEBUG(2, ("...copy %s without change", + (mode & dstINT) + ? "int" + : "short")); + memcpy(dst->Numbers, + src->Numbers, + NUM_NUMBERS(dst) * ((mode & dstINT) + ? sizeof(int) + : sizeof(short))); + } +#else + (void) mode; + TYPE_MALLOC(short, NUM_NUMBERS(dst), dst->Numbers); + memcpy(dst->Numbers, + src->Numbers, + NUM_NUMBERS(dst) * sizeof(dst->Numbers[0])); +#endif + +#if NCURSES_XNAMES + if ((i = NUM_EXT_NAMES(src)) != 0) { + TYPE_MALLOC(char *, i, dst->ext_Names); + memcpy(dst->ext_Names, src->ext_Names, i * sizeof(char *)); + + new_table = NULL; + new_table_size = 0; + for (pass = 0; pass < 2; ++pass) { + size_t str_size = 0; + char *raw_data = src->ext_str_table; + if (raw_data != NULL) { + for (i = 0; i < src->ext_Strings; ++i) { + size_t skip = strlen(raw_data) + 1; + if (skip != 1) { + if (pass) { + _nc_STRCPY(new_table + str_size, + raw_data, + new_table_size - str_size); + } + str_size += skip; + raw_data += skip; + } + } + } + for (i = 0; i < NUM_EXT_NAMES(dst); ++i) { + if (VALID_STRING(src->ext_Names[i])) { + if (pass) { + _nc_STRCPY(new_table + str_size, + src->ext_Names[i], + new_table_size - str_size); + dst->ext_Names[i] = new_table + str_size; + } + str_size += strlen(src->ext_Names[i]) + 1; + } + } + if (pass) { + dst->ext_str_table = new_table; + } else { + ++str_size; + if ((new_table = calloc(str_size, 1)) == NULL) + _nc_err_abort(MSG_NO_MEMORY); + new_table_size = str_size; + } + } + } else { + dst->ext_Names = 0; + } +#endif + (void) new_table_size; + DEBUG(2, (T_RETURN(""))); +} + +NCURSES_EXPORT(void) +_nc_copy_termtype(TERMTYPE *dst, const TERMTYPE *src) +{ + DEBUG(2, (T_CALLED("_nc_copy_termtype(dst=%p, src=%p)"), (void *) dst, + (const void *) src)); + copy_termtype((TERMTYPE2 *) dst, (const TERMTYPE2 *) src, 0); + DEBUG(2, (T_RETURN(""))); +} + +#if NCURSES_EXT_NUMBERS +NCURSES_EXPORT(void) +_nc_copy_termtype2(TERMTYPE2 *dst, const TERMTYPE2 *src) +{ + DEBUG(2, (T_CALLED("_nc_copy_termtype2(dst=%p, src=%p)"), (void *) dst, + (const void *) src)); + copy_termtype(dst, src, srcINT | dstINT); + DEBUG(2, (T_RETURN(""))); +} + +/* + * Use this for exporting the internal TERMTYPE2 to the legacy format used via + * the CUR macro by applications. + */ +NCURSES_EXPORT(void) +_nc_export_termtype2(TERMTYPE *dst, const TERMTYPE2 *src) +{ + DEBUG(2, (T_CALLED("_nc_export_termtype2(dst=%p, src=%p)"), (void *) + dst, (const void *) src)); + copy_termtype((TERMTYPE2 *) dst, src, srcINT); + DEBUG(2, (T_RETURN(""))); +} +#endif /* NCURSES_EXT_NUMBERS */ diff --git a/contrib/ncurses/ncurses/tinfo/captoinfo.c b/contrib/ncurses/ncurses/tinfo/captoinfo.c new file mode 100644 index 00000000..c3bf0d3c --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/captoinfo.c @@ -0,0 +1,1058 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * captoinfo.c + * + * Provide conversion in both directions between termcap and terminfo. + * + * cap-to-info --- conversion between termcap and terminfo formats + * + * The captoinfo() code was swiped from Ross Ridge's mytinfo package, + * adapted to fit ncurses by Eric S. Raymond . + * + * It has just one entry point: + * + * char *_nc_captoinfo(n, s, parameterized) + * + * Convert value s for termcap string capability named n into terminfo + * format. + * + * This code recognizes all the standard 4.4BSD %-escapes: + * + * %% output `%' + * %d output value as in printf %d + * %2 output value as in printf %2d + * %3 output value as in printf %3d + * %. output value as in printf %c + * %+x add x to value, then do %. + * %>xy if value > x then add y, no output + * %r reverse order of two parameters, no output + * %i increment by one, no output + * %n exclusive-or all parameters with 0140 (Datamedia 2500) + * %B BCD (16*(value/10)) + (value%10), no output + * %D Reverse coding (value - 2*(value%16)), no output (Delta Data). + * + * Also, %02 and %03 are accepted as synonyms for %2 and %3. + * + * Besides all the standard termcap escapes, this translator understands + * the following extended escapes: + * + * used by GNU Emacs termcap libraries + * %a[+*-/=][cp]x GNU arithmetic. + * %m xor the first two parameters by 0177 + * %b backup to previous parameter + * %f skip this parameter + * + * used by the University of Waterloo (MFCF) termcap libraries + * %-x subtract parameter FROM char x and output it as a char + * %ax add the character x to parameter + * + * If #define WATERLOO is on, also enable these translations: + * + * %sx subtract parameter FROM the character x + * + * By default, this Waterloo translations are not compiled in, because + * the Waterloo %s conflicts with the way terminfo uses %s in strings for + * function programming. + * + * Note the two definitions of %a: the GNU definition is translated if the + * characters after the 'a' are valid for it, otherwise the UW definition + * is translated. + */ + +#include + +#include +#include + +MODULE_ID("$Id: captoinfo.c,v 1.104 2024/10/19 21:18:54 tom Exp $") + +#if 0 +#define DEBUG_THIS(p) DEBUG(9, p) +#else +#define DEBUG_THIS(p) /* nothing */ +#endif + +#define MAX_PUSHED 16 /* max # args we can push onto the stack */ + +static int stack[MAX_PUSHED]; /* the stack */ +static int stackptr; /* the next empty place on the stack */ +static int onstack; /* the top of stack */ +static int seenm; /* seen a %m */ +static int seenn; /* seen a %n */ +static int seenr; /* seen a %r */ +static int param; /* current parameter */ +static char *dp; /* pointer to end of the converted string */ + +static char *my_string; +static size_t my_length; + +static char * +init_string(void) +/* initialize 'my_string', 'my_length' */ +{ + if (my_string == 0) + TYPE_MALLOC(char, my_length = 256, my_string); + + *my_string = '\0'; + return my_string; +} + +static char * +save_string(char *d, const char *const s) +{ + size_t have = (size_t) (d - my_string); + size_t need = have + strlen(s) + 2; + if (need > my_length) { + my_string = (char *) _nc_doalloc(my_string, my_length = (need + need)); + if (my_string == 0) + _nc_err_abort(MSG_NO_MEMORY); + d = my_string + have; + } + _nc_STRCPY(d, s, my_length - have); + return d + strlen(d); +} + +static NCURSES_INLINE char * +save_char(char *s, int c) +{ + static char temp[2]; + temp[0] = (char) c; + return save_string(s, temp); +} + +static void +push(void) +/* push onstack on to the stack */ +{ + if (stackptr >= MAX_PUSHED) + _nc_warning("string too complex to convert"); + else + stack[stackptr++] = onstack; +} + +static void +pop(void) +/* pop the top of the stack into onstack */ +{ + if (stackptr == 0) { + if (onstack == 0) + _nc_warning("I'm confused"); + else + onstack = 0; + } else + onstack = stack[--stackptr]; + param++; +} + +static int +cvtchar(register const char *sp) +/* convert a character to a terminfo push */ +{ + unsigned char c = 0; + int len; + + switch (*sp) { + case '\\': + switch (*++sp) { + case '\'': + case '$': + case '\\': + case '%': + c = UChar(*sp); + len = 2; + break; + case '\0': + c = '\\'; + len = 1; + break; + case '0': + case '1': + case '2': + case '3': + len = 1; + while (isdigit(UChar(*sp))) { + c = UChar(8 * c + (*sp++ - '0')); + len++; + } + break; + default: + c = UChar(*sp); + len = (c != '\0') ? 2 : 1; + break; + } + break; + case '^': + len = 2; + c = UChar(*++sp); + if (c == '?') { + c = 127; + } else if (c == '\0') { + len = 1; + } else { + c &= 0x1f; + } + break; + default: + c = UChar(*sp); + len = (c != '\0') ? 1 : 0; + } + if (isgraph(c) && c != ',' && c != '\'' && c != '\\' && c != ':') { + dp = save_string(dp, "%\'"); + dp = save_char(dp, c); + dp = save_char(dp, '\''); + } else if (c != '\0') { + dp = save_string(dp, "%{"); + if (c > 99) + dp = save_char(dp, c / 100 + '0'); + if (c > 9) + dp = save_char(dp, ((int) (c / 10)) % 10 + '0'); + dp = save_char(dp, c % 10 + '0'); + dp = save_char(dp, '}'); + } + return len; +} + +static void +getparm(int parm, int n) +/* push n copies of param on the terminfo stack if not already there */ +{ + int nn; + + if (seenr) { + if (parm == 1) + parm = 2; + else if (parm == 2) + parm = 1; + } + + for (nn = 0; nn < n; ++nn) { + dp = save_string(dp, "%p"); + dp = save_char(dp, '0' + parm); + } + + if (onstack == parm) { + if (n > 1) { + _nc_warning("string may not be optimal"); + dp = save_string(dp, "%Pa"); + while (n-- > 0) { + dp = save_string(dp, "%ga"); + } + } + return; + } + if (onstack != 0) + push(); + + onstack = parm; + + if (seenn && parm < 3) { + dp = save_string(dp, "%{96}%^"); + } + + if (seenm && parm < 3) { + dp = save_string(dp, "%{127}%^"); + } +} + +/* + * Convert a termcap string to terminfo format. + * 'cap' is the relevant terminfo capability index. + * 's' is the string value of the capability. + * 'parameterized' tells what type of translations to do: + * % translations if 1 + * pad translations if >=0 + */ +NCURSES_EXPORT(char *) +_nc_captoinfo(const char *cap, const char *s, int const parameterized) +{ + const char *capstart; + + stackptr = 0; + onstack = 0; + seenm = 0; + seenn = 0; + seenr = 0; + param = 1; + + DEBUG_THIS(("_nc_captoinfo params %d, %s", parameterized, s)); + + dp = init_string(); + + /* skip the initial padding (if we haven't been told not to) */ + capstart = 0; + if (s == 0) + s = ""; + if (parameterized >= 0 && isdigit(UChar(*s))) + for (capstart = s; *s != '\0'; s++) + if (!(isdigit(UChar(*s)) || *s == '*' || *s == '.')) + break; + + while (*s != '\0') { + switch (*s) { + case '%': + s++; + if (parameterized < 1) { + dp = save_char(dp, '%'); + break; + } + switch (*s++) { + case '%': + dp = save_string(dp, "%%"); + break; + case 'r': + if (seenr++ == 1) { + _nc_warning("saw %%r twice in %s", cap); + } + break; + case 'm': + if (seenm++ == 1) { + _nc_warning("saw %%m twice in %s", cap); + } + break; + case 'n': + if (seenn++ == 1) { + _nc_warning("saw %%n twice in %s", cap); + } + break; + case 'i': + dp = save_string(dp, "%i"); + break; + case '6': + case 'B': + getparm(param, 1); + dp = save_string(dp, "%{10}%/%{16}%*"); + getparm(param, 1); + dp = save_string(dp, "%{10}%m%+"); + break; + case '8': + case 'D': + getparm(param, 2); + dp = save_string(dp, "%{2}%*%-"); + break; + case '>': + /* %?%{x}%>%t%{y}%+%; */ + if (s[0] && s[1]) { + getparm(param, 2); + dp = save_string(dp, "%?"); + s += cvtchar(s); + dp = save_string(dp, "%>%t"); + s += cvtchar(s); + dp = save_string(dp, "%+%;"); + } else { + _nc_warning("expected two characters after %%>"); + dp = save_string(dp, "%>"); + } + break; + case 'a': + if ((*s == '=' || *s == '+' || *s == '-' + || *s == '*' || *s == '/') + && (s[1] == 'p' || s[1] == 'c') + && s[2] != '\0') { + int l; + l = 2; + if (*s != '=') + getparm(param, 1); + if (s[1] == 'p') { + getparm(param + s[2] - '@', 1); + if (param != onstack) { + pop(); + param--; + } + l++; + } else + l += cvtchar(s + 2); + switch (*s) { + case '+': + dp = save_string(dp, "%+"); + break; + case '-': + dp = save_string(dp, "%-"); + break; + case '*': + dp = save_string(dp, "%*"); + break; + case '/': + dp = save_string(dp, "%/"); + break; + case '=': + if (seenr) { + if (param == 1) + onstack = 2; + else if (param == 2) + onstack = 1; + else + onstack = param; + } else + onstack = param; + break; + } + s += l; + break; + } + getparm(param, 1); + s += cvtchar(s); + dp = save_string(dp, "%+"); + break; + case '+': + getparm(param, 1); + s += cvtchar(s); + dp = save_string(dp, "%+%c"); + pop(); + break; + case 's': +#ifdef WATERLOO + s += cvtchar(s); + getparm(param, 1); + dp = save_string(dp, "%-"); +#else + getparm(param, 1); + dp = save_string(dp, "%s"); + pop(); +#endif /* WATERLOO */ + break; + case '-': + s += cvtchar(s); + getparm(param, 1); + dp = save_string(dp, "%-%c"); + pop(); + break; + case '.': + getparm(param, 1); + dp = save_string(dp, "%c"); + pop(); + break; + case '0': /* not clear any of the historical termcaps did this */ + if (*s == '3') { + ++s; + goto see03; + } + if (*s == '2') { + ++s; + goto see02; + } + goto invalid; + case '2': + see02: + getparm(param, 1); + dp = save_string(dp, "%2d"); + pop(); + break; + case '3': + see03: + getparm(param, 1); + dp = save_string(dp, "%3d"); + pop(); + break; + case 'd': + getparm(param, 1); + dp = save_string(dp, "%d"); + pop(); + break; + case 'f': + param++; + break; + case 'b': + param--; + break; + case '\\': + dp = save_string(dp, "%\\"); + break; + default: + invalid: + dp = save_char(dp, '%'); + s--; + _nc_warning("unknown %% code %s (%#x) in %s", + unctrl((chtype) *s), UChar(*s), cap); + break; + } + break; + default: + if (*s != '\0') + dp = save_char(dp, *s++); + break; + } + } + + /* + * Now, if we stripped off some leading padding, add it at the end + * of the string as mandatory padding. + */ + if (capstart) { + dp = save_string(dp, "$<"); + for (s = capstart; *s != '\0'; s++) + if (isdigit(UChar(*s)) || *s == '*' || *s == '.') + dp = save_char(dp, *s); + else + break; + dp = save_string(dp, "/>"); + } + + (void) save_char(dp, '\0'); + + DEBUG_THIS(("... _nc_captoinfo %s", NonNull(my_string))); + + return (my_string); +} + +/* + * Check for an expression that corresponds to "%B" (BCD): + * (parameter / 10) * 16 + (parameter % 10) + */ +static int +bcd_expression(const char *str) +{ + static const char fmt[] = "%%p%c%%{10}%%/%%{16}%%*%%p%c%%{10}%%m%%+"; + int len = 0; + char ch1, ch2; + + if (sscanf(str, fmt, &ch1, &ch2) == 2 + && isdigit(UChar(ch1)) + && isdigit(UChar(ch2)) + && (ch1 == ch2)) { + len = 28; +#ifndef NDEBUG + { + char buffer[80]; + int tst; + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) fmt, ch1, ch2); + tst = strlen(buffer) - 1; + assert(len == tst); + } +#endif + } + return len; +} + +static char * +save_tc_char(char *bufptr, int c1) +{ + if (is7bits(c1) && isprint(c1)) { + if (c1 == ':' || c1 == '\\') + bufptr = save_char(bufptr, '\\'); + bufptr = save_char(bufptr, c1); + } else { + char temp[80]; + + if (c1 == (c1 & 0x1f)) { /* iscntrl() returns T on 255 */ + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%.20s", unctrl((chtype) c1)); + } else { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "\\%03o", c1); + } + bufptr = save_string(bufptr, temp); + } + return bufptr; +} + +static char * +save_tc_inequality(char *bufptr, int c1, int c2) +{ + bufptr = save_string(bufptr, "%>"); + bufptr = save_tc_char(bufptr, c1); + bufptr = save_tc_char(bufptr, c2); + return bufptr; +} + +/* + * info-to-cap --- conversion between terminfo and termcap formats + * + * Here are the capabilities infotocap assumes it can translate to: + * + * %% output `%' + * %d output value as in printf %d + * %2 output value as in printf %2d + * %3 output value as in printf %3d + * %. output value as in printf %c + * %+c add character c to value, then do %. + * %>xy if value > x then add y, no output + * %r reverse order of two parameters, no output + * %i increment by one, no output + * %n exclusive-or all parameters with 0140 (Datamedia 2500) + * %B BCD (16*(value/10)) + (value%10), no output + * %D Reverse coding (value - 2*(value%16)), no output (Delta Data). + * %m exclusive-or all parameters with 0177 (not in 4.4BSD) + */ + +#define octal_fixup(n, c) fixups[n].ch = ((fixups[n].ch << 3) | ((c) - '0')) + +/* + * Convert a terminfo string to termcap format. Parameters are as in + * _nc_captoinfo(). + */ +NCURSES_EXPORT(char *) +_nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameterized) +{ + int seenone = 0, seentwo = 0, saw_m = 0, saw_n = 0; + const char *padding; + const char *trimmed = 0; + int in0, in1, in2; + char ch1 = 0, ch2 = 0; + char *bufptr = init_string(); + char octal[4]; + int len; + int digits; + bool syntax_error = FALSE; + int myfix = 0; + struct { + int ch; + int offset; + } fixups[MAX_TC_FIXUPS]; + + DEBUG_THIS(("_nc_infotocap %s params %d, %s", + _nc_strict_bsd ? "strict" : "loose", + parameterized, + _nc_visbuf(str))); + + /* we may have to move some trailing mandatory padding up front */ + padding = str + strlen(str) - 1; + if (padding > str && *padding == '>') { + if (padding > (str + 1) && *--padding == '/') + --padding; + while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*') + padding--; + if (padding > str && *padding == '<' && *--padding == '$') + trimmed = padding; + padding += 2; + + while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*') + bufptr = save_char(bufptr, *padding++); + } + + for (; !syntax_error && + *str && + ((trimmed == 0) || (str < trimmed)); str++) { + int c1, c2; + char *cp = 0; + + if (str[0] == '^') { + if (str[1] == '\0' || (str + 1) == trimmed) { + bufptr = save_string(bufptr, "\\136"); + ++str; + } else if (str[1] == '?') { + /* + * Although the 4.3BSD termcap file has an instance of "kb=^?", + * that appears to be just cut/paste since neither 4.3BSD nor + * 4.4BSD termcap interprets "^?" as DEL. + */ + bufptr = save_string(bufptr, "\\177"); + ++str; + } else { + bufptr = save_char(bufptr, *str++); + bufptr = save_char(bufptr, *str); + } + } else if (str[0] == ':') { + bufptr = save_char(bufptr, '\\'); + bufptr = save_char(bufptr, '0'); + bufptr = save_char(bufptr, '7'); + bufptr = save_char(bufptr, '2'); + } else if (str[0] == '\\') { + if (str[1] == '\0' || (str + 1) == trimmed) { + bufptr = save_string(bufptr, "\\134"); + ++str; + } else if (str[1] == '^') { + bufptr = save_string(bufptr, "\\136"); + ++str; + } else if (str[1] == ',') { + bufptr = save_char(bufptr, *++str); + } else { + int xx1; + + bufptr = save_char(bufptr, *str++); + xx1 = *str; + if (_nc_strict_bsd) { + + if (isoctal(UChar(xx1))) { + int pad = 0; + int xx2; + int fix = 0; + + if (!isoctal(UChar(str[1]))) + pad = 2; + else if (str[1] && !isoctal(UChar(str[2]))) + pad = 1; + + /* + * Test for "\0", "\00" or "\000" and transform those + * into "\200". + */ + if (xx1 == '0' + && ((pad == 2) || (str[1] == '0')) + && ((pad >= 1) || (str[2] == '0'))) { + xx2 = '2'; + } else { + xx2 = '0'; + pad = 0; /* FIXME - optionally pad to 3 digits */ + } + if (myfix < MAX_TC_FIXUPS) { + fix = 3 - pad; + fixups[myfix].ch = 0; + fixups[myfix].offset = (int) (bufptr + - my_string + - 1); + } + while (pad-- > 0) { + bufptr = save_char(bufptr, xx2); + if (myfix < MAX_TC_FIXUPS) { + fixups[myfix].ch <<= 3; + fixups[myfix].ch |= (xx2 - '0'); + } + xx2 = '0'; + } + if (myfix < MAX_TC_FIXUPS) { + int n; + for (n = 0; n < fix; ++n) { + fixups[myfix].ch <<= 3; + fixups[myfix].ch |= (str[n] - '0'); + } + if (fixups[myfix].ch < 32) { + ++myfix; + } + } + } else if (strchr("E\\nrtbf", xx1) == 0) { + switch (xx1) { + case 'e': + xx1 = 'E'; + break; + case 'l': + xx1 = 'n'; + break; + case 's': + bufptr = save_char(bufptr, '0'); + bufptr = save_char(bufptr, '4'); + xx1 = '0'; + break; + case ':': + /* + * Note: termcap documentation claims that ":" + * must be escaped as "\072", however the + * documentation is incorrect - read the code. + * The replacement does not work reliably, + * so the advice is not helpful. + */ + bufptr = save_char(bufptr, '0'); + bufptr = save_char(bufptr, '7'); + xx1 = '2'; + break; + default: + /* should not happen, but handle this anyway */ + _nc_SPRINTF(octal, _nc_SLIMIT(sizeof(octal)) + "%03o", UChar(xx1)); + bufptr = save_char(bufptr, octal[0]); + bufptr = save_char(bufptr, octal[1]); + xx1 = octal[2]; + break; + } + } + } else { + if (myfix < MAX_TC_FIXUPS && isoctal(UChar(xx1))) { + bool will_fix = TRUE; + int n; + + fixups[myfix].ch = 0; + fixups[myfix].offset = (int) (bufptr - my_string - 1); + for (n = 0; n < 3; ++n) { + if (isoctal(str[n])) { + octal_fixup(myfix, str[n]); + } else { + will_fix = FALSE; + break; + } + } + if (will_fix && (fixups[myfix].ch < 32)) + ++myfix; + } + } + bufptr = save_char(bufptr, xx1); + } + } else if (str[0] == '$' && str[1] == '<') { /* discard padding */ + str += 2; + while (isdigit(UChar(*str)) + || *str == '.' + || *str == '*' + || *str == '/' + || *str == '>') + str++; + --str; + } else if (sscanf(str, + "[%%?%%p1%%{8}%%<%%t%d%%p1%%d%%e%%p1%%{16}%%<%%t%d%%p1%%{8}%%-%%d%%e%d;5;%%p1%%d%%;m", + &in0, &in1, &in2) == 3 + && ((in0 == 4 && in1 == 10 && in2 == 48) + || (in0 == 3 && in1 == 9 && in2 == 38))) { + /* dumb-down an optimized case from xterm-256color for termcap */ + if ((str = strstr(str, ";m")) == 0) + break; /* cannot happen */ + ++str; + if (in2 == 48) { + bufptr = save_string(bufptr, "[48;5;%dm"); + } else { + bufptr = save_string(bufptr, "[38;5;%dm"); + } + } else if (str[0] == '%' && str[1] == '%') { /* escaped '%' */ + bufptr = save_string(bufptr, "%%"); + ++str; + } else if (*str != '%' || (parameterized < 1)) { + bufptr = save_char(bufptr, *str); + } else if (sscanf(str, "%%?%%{%d}%%>%%t%%{%d}%%+%%;", &c1, &c2) == 2) { + str = strchr(str, ';'); + bufptr = save_tc_inequality(bufptr, c1, c2); + } else if (sscanf(str, "%%?%%{%d}%%>%%t%%'%c'%%+%%;", &c1, &ch2) == 2) { + str = strchr(str, ';'); + bufptr = save_tc_inequality(bufptr, c1, ch2); + } else if (sscanf(str, "%%?%%'%c'%%>%%t%%{%d}%%+%%;", &ch1, &c2) == 2) { + str = strchr(str, ';'); + bufptr = save_tc_inequality(bufptr, ch1, c2); + } else if (sscanf(str, "%%?%%'%c'%%>%%t%%'%c'%%+%%;", &ch1, &ch2) == 2) { + str = strchr(str, ';'); + bufptr = save_tc_inequality(bufptr, ch1, ch2); + } else if ((len = bcd_expression(str)) != 0) { + str += len; + bufptr = save_string(bufptr, "%B"); + } else if ((sscanf(str, "%%{%d}%%+%%%c", &c1, &ch2) == 2 + || sscanf(str, "%%'%c'%%+%%%c", &ch1, &ch2) == 2) + && ch2 == 'c' + && (cp = strchr(str, '+'))) { + str = cp + 2; + bufptr = save_string(bufptr, "%+"); + + if (ch1) + c1 = ch1; + bufptr = save_tc_char(bufptr, c1); + } + /* FIXME: this "works" for 'delta' */ + else if (strncmp(str, "%{2}%*%-", (size_t) 8) == 0) { + str += 7; + bufptr = save_string(bufptr, "%D"); + } else if (strncmp(str, "%{96}%^", (size_t) 7) == 0) { + str += 6; + if (saw_m++ == 0) { + bufptr = save_string(bufptr, "%n"); + } + } else if (strncmp(str, "%{127}%^", (size_t) 8) == 0) { + str += 7; + if (saw_n++ == 0) { + bufptr = save_string(bufptr, "%m"); + } + } else { /* cm-style format element */ + str++; + switch (*str) { + case '%': + bufptr = save_char(bufptr, '%'); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + bufptr = save_char(bufptr, '%'); + ch1 = 0; + ch2 = 0; + digits = 0; + while (isdigit(UChar(*str))) { + if (++digits > 2) { + syntax_error = TRUE; + break; + } + ch2 = ch1; + ch1 = *str++; + if (digits == 2 && ch2 != '0') { + syntax_error = TRUE; + break; + } else if (_nc_strict_bsd) { + if (ch1 > '3') { + syntax_error = TRUE; + break; + } + } else { + bufptr = save_char(bufptr, ch1); + } + } + if (syntax_error) + break; + /* + * Convert %02 to %2 and %03 to %3 + */ + if (ch2 == '0' && !_nc_strict_bsd) { + ch2 = 0; + bufptr[-2] = bufptr[-1]; + *--bufptr = 0; + } + if (_nc_strict_bsd) { + if (ch2 != 0 && ch2 != '0') { + syntax_error = TRUE; + } else if (ch1 < '2') { + ch1 = 'd'; + } + bufptr = save_char(bufptr, ch1); + } + if (strchr("oxX.", *str)) { + syntax_error = TRUE; /* termcap doesn't have octal, hex */ + } + break; + + case 'd': + bufptr = save_string(bufptr, "%d"); + break; + + case 'c': + bufptr = save_string(bufptr, "%."); + break; + + /* + * %s isn't in termcap, but it is convenient to pass it through + * so we can represent things like terminfo pfkey strings in + * termcap notation. + */ + case 's': + if (_nc_strict_bsd) { + syntax_error = TRUE; + } else { + bufptr = save_string(bufptr, "%s"); + } + break; + + case 'p': + str++; + if (*str == '1') + seenone = 1; + else if (*str == '2') { + if (!seenone && !seentwo) { + bufptr = save_string(bufptr, "%r"); + seentwo++; + } + } else if (*str >= '3') { + syntax_error = TRUE; + } + break; + + case 'i': + bufptr = save_string(bufptr, "%i"); + break; + + default: + bufptr = save_char(bufptr, *str); + syntax_error = TRUE; + break; + } /* endswitch (*str) */ + } /* endelse (*str == '%') */ + + /* + * 'str' always points to the end of what was scanned in this step, + * but that may not be the end of the string. + */ + assert(str != 0); + if (str == 0 || *str == '\0') + break; + + } /* endwhile (*str) */ + + if (!syntax_error && + myfix > 0 && + ((int) strlen(my_string) - (4 * myfix)) < MIN_TC_FIXUPS) { + while (--myfix >= 0) { + char *p = fixups[myfix].offset + my_string; + *p++ = '^'; + *p++ = (char) (fixups[myfix].ch | '@'); + while ((p[0] = p[2]) != '\0') { + ++p; + } + } + } + + DEBUG_THIS(("... _nc_infotocap %s", + syntax_error + ? "" + : _nc_visbuf(my_string))); + + return (syntax_error ? NULL : my_string); +} + +#ifdef MAIN + +int curr_line; + +int +main(int argc, char *argv[]) +{ + int c, tc = FALSE; + + while ((c = getopt(argc, argv, "c")) != EOF) + switch (c) { + case 'c': + tc = TRUE; + break; + } + + curr_line = 0; + for (;;) { + char buf[BUFSIZ]; + + ++curr_line; + if (fgets(buf, sizeof(buf), stdin) == 0) + break; + buf[strlen(buf) - 1] = '\0'; + _nc_set_source(buf); + + if (tc) { + char *cp = _nc_infotocap("to termcap", buf, 1); + + if (cp) + (void) fputs(cp, stdout); + } else + (void) fputs(_nc_captoinfo("to terminfo", buf, 1), stdout); + (void) putchar('\n'); + } + return (0); +} +#endif /* MAIN */ + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_captoinfo_leaks(void) +{ + if (my_string != 0) { + FreeAndNull(my_string); + } + my_length = 0; +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/comp_error.c b/contrib/ncurses/ncurses/tinfo/comp_error.c new file mode 100644 index 00000000..3e6b4022 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/comp_error.c @@ -0,0 +1,173 @@ +/**************************************************************************** + * Copyright 2019-2020,2023 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * comp_error.c -- Error message routines + * + */ + +#include + +#include + +MODULE_ID("$Id: comp_error.c,v 1.44 2023/06/15 20:27:02 tom Exp $") + +NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings = FALSE; +NCURSES_EXPORT_VAR(int) _nc_curr_line = 0; /* current line # in input */ +NCURSES_EXPORT_VAR(int) _nc_curr_col = 0; /* current column # in input */ + +#define SourceName _nc_globals.comp_sourcename +#define TermType _nc_globals.comp_termtype + +NCURSES_EXPORT(const char *) +_nc_get_source(void) +{ + return SourceName; +} + +NCURSES_EXPORT(void) +_nc_set_source(const char *const name) +{ + if (name == NULL) { + free(SourceName); + SourceName = NULL; + } else if (SourceName == NULL) { + SourceName = strdup(name); + } else if (strcmp(name, SourceName)) { + free(SourceName); + SourceName = strdup(name); + } +} + +NCURSES_EXPORT(void) +_nc_set_type(const char *const name) +{ +#define MY_SIZE (size_t) MAX_NAME_SIZE + if (TermType == 0) + TermType = typeMalloc(char, MY_SIZE + 1); + if (TermType != 0) { + TermType[0] = '\0'; + if (name) { + _nc_STRNCAT(TermType, name, MY_SIZE, MY_SIZE); + } + } +} + +NCURSES_EXPORT(void) +_nc_get_type(char *name) +{ +#if NO_LEAKS + if (name == 0 && TermType != 0) { + FreeAndNull(TermType); + return; + } +#endif + if (name != 0) + _nc_STRCPY(name, TermType != 0 ? TermType : "", MAX_NAME_SIZE); +} + +static NCURSES_INLINE void +where_is_problem(void) +{ + fprintf(stderr, "\"%s\"", SourceName ? SourceName : "?"); + if (_nc_curr_line > 0) + fprintf(stderr, ", line %d", _nc_curr_line); + if (_nc_curr_col > 0) + fprintf(stderr, ", col %d", _nc_curr_col); + if (TermType != 0 && TermType[0] != '\0') + fprintf(stderr, ", terminal '%s'", TermType); + fputc(':', stderr); + fputc(' ', stderr); +} + +NCURSES_EXPORT(void) +_nc_warning(const char *const fmt, ...) +{ + va_list argp; + + if (_nc_suppress_warnings) + return; + + where_is_problem(); + va_start(argp, fmt); + vfprintf(stderr, fmt, argp); + fprintf(stderr, "\n"); + va_end(argp); +} + +NCURSES_EXPORT(void) +_nc_err_abort(const char *const fmt, ...) +{ + va_list argp; + + where_is_problem(); + va_start(argp, fmt); + vfprintf(stderr, fmt, argp); + fprintf(stderr, "\n"); + va_end(argp); + exit(EXIT_FAILURE); +} + +NCURSES_EXPORT(void) +_nc_syserr_abort(const char *const fmt, ...) +{ + va_list argp; + + where_is_problem(); + va_start(argp, fmt); + vfprintf(stderr, fmt, argp); + fprintf(stderr, "\n"); + va_end(argp); + +#if defined(TRACE) || !defined(NDEBUG) + /* If we're debugging, try to show where the problem occurred - this + * will dump core. + */ + if (_nc_env_access()) + abort(); +#endif + /* Dumping core in production code is not a good idea. + */ + exit(EXIT_FAILURE); +} + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_comp_error_leaks(void) +{ + FreeAndNull(SourceName); + FreeAndNull(TermType); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/comp_expand.c b/contrib/ncurses/ncurses/tinfo/comp_expand.c new file mode 100644 index 00000000..e971384f --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/comp_expand.c @@ -0,0 +1,227 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998 * + ****************************************************************************/ + +#include + +#include +#include + +MODULE_ID("$Id: comp_expand.c,v 1.35 2023/04/28 20:59:06 tom Exp $") + +#if 0 +#define DEBUG_THIS(p) DEBUG(9, p) +#else +#define DEBUG_THIS(p) /* nothing */ +#endif + +static int +trailing_spaces(const char *src) +{ + while (*src == ' ') + src++; + return *src == 0; +} + +/* this deals with differences over whether 0x7f and 0x80..0x9f are controls */ +#define REALPRINT(s) (UChar(*(s)) < 127 && isprint(UChar(*(s)))) + +#define P_LIMIT(p) (length - (size_t)(p)) + +NCURSES_EXPORT(char *) +_nc_tic_expand(const char *srcp, bool tic_format, int numbers) +{ + static char *buffer; + static size_t length; + + int bufp; + const char *str = VALID_STRING(srcp) ? srcp : "\0\0"; + size_t need = (2 + strlen(str)) * 4; + int ch; + int octals = 0; + struct { + int ch; + int offset; + } fixups[MAX_TC_FIXUPS]; + + if (srcp == 0) { +#if NO_LEAKS + if (buffer != 0) { + FreeAndNull(buffer); + length = 0; + } +#endif + return 0; + } + if (buffer == 0 || need > length) { + if ((buffer = typeRealloc(char, length = need, buffer)) == 0) + return 0; + } + + DEBUG_THIS(("_nc_tic_expand %s:%s:%s", + tic_format ? "ti" : "tc", + numbers ? "#" : "", + _nc_visbuf(srcp))); + bufp = 0; + while ((ch = UChar(*str)) != 0) { + if (ch == '%' && REALPRINT(str + 1)) { + buffer[bufp++] = *str++; + /* + * Though the character literals are more compact, most + * terminal descriptions use numbers and are not easy + * to read in character-literal form. + */ + switch (numbers) { + case -1: + if (str[0] == S_QUOTE + && str[1] != '\\' + && REALPRINT(str + 1) + && str[2] == S_QUOTE) { + _nc_SPRINTF(buffer + bufp, _nc_SLIMIT(P_LIMIT(bufp)) + "{%d}", str[1]); + bufp += (int) strlen(buffer + bufp); + str += 2; + } else { + buffer[bufp++] = *str; + } + break; + /* + * If we have a "%{number}", try to translate it into + * a "%'char'" form, since that will run a little faster + * when we're interpreting it. Also, having one form + * for the constant makes it simpler to compare terminal + * descriptions. + */ + case 1: + if (str[0] == L_BRACE + && isdigit(UChar(str[1]))) { + char *dst = 0; + long value = strtol(str + 1, &dst, 0); + if (dst != 0 + && *dst == R_BRACE + && value < 127 + && isprint((int) value)) { + ch = (int) value; + buffer[bufp++] = S_QUOTE; + if (ch == '\\' + || ch == S_QUOTE) + buffer[bufp++] = '\\'; + buffer[bufp++] = (char) ch; + buffer[bufp++] = S_QUOTE; + str = dst; + } else { + buffer[bufp++] = *str; + } + } else { + buffer[bufp++] = *str; + } + break; + default: + if (*str == ',') /* minitel1 uses this */ + buffer[bufp++] = '\\'; + buffer[bufp++] = *str; + break; + } + } else if (ch == 128) { + buffer[bufp++] = '\\'; + buffer[bufp++] = '0'; + } else if (ch == '\033') { + buffer[bufp++] = '\\'; + buffer[bufp++] = 'E'; + } else if (ch == '\\' && tic_format && (str == srcp || str[-1] != '^')) { + buffer[bufp++] = '\\'; + buffer[bufp++] = '\\'; + } else if (ch == ' ' && tic_format && (str == srcp || + trailing_spaces(str))) { + buffer[bufp++] = '\\'; + buffer[bufp++] = 's'; + } else if ((ch == ',' || ch == '^') && tic_format) { + buffer[bufp++] = '\\'; + buffer[bufp++] = (char) ch; + } else if (REALPRINT(str) + && (ch != ',' + && !(ch == ':' && !tic_format) + && !(ch == '!' && !tic_format) + && ch != '^')) + buffer[bufp++] = (char) ch; + else if (ch == '\r') { + buffer[bufp++] = '\\'; + buffer[bufp++] = 'r'; + } else if (ch == '\n') { + buffer[bufp++] = '\\'; + buffer[bufp++] = 'n'; + } +#define UnCtl(c) ((c) + '@') + else if (UChar(ch) < 32 + && isdigit(UChar(str[1]))) { + _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp)) + "^%c", UnCtl(ch)); + bufp += 2; + } else { + _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp)) + "\\%03o", ch); + if ((octals < MAX_TC_FIXUPS) && + ((tic_format && (ch == 127)) || ch < 32)) { + fixups[octals].ch = UChar(ch); + fixups[octals].offset = bufp; + ++octals; + } + bufp += 4; + } + + str++; + } + + buffer[bufp] = '\0'; + + /* + * If most of a short string is ASCII control characters, reformat the + * string to show those in up-arrow format. For longer strings, it is + * more likely that the characters are just binary coding. + * + * If we're formatting termcap, just use the shorter format (up-arrows). + */ + if (octals != 0 && (!tic_format || (bufp - (4 * octals)) < MIN_TC_FIXUPS)) { + while (--octals >= 0) { + char *p = buffer + fixups[octals].offset; + *p++ = '^'; + *p++ = (char) ((fixups[octals].ch == 127) + ? '?' + : (fixups[octals].ch + (int) '@')); + while ((p[0] = p[2]) != 0) { + ++p; + } + } + } + DEBUG_THIS(("... %s", _nc_visbuf(buffer))); + return (buffer); +} diff --git a/contrib/ncurses/ncurses/tinfo/comp_hash.c b/contrib/ncurses/ncurses/tinfo/comp_hash.c new file mode 100644 index 00000000..4b081afa --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/comp_hash.c @@ -0,0 +1,151 @@ +/**************************************************************************** + * Copyright 2019-2020,2023 Thomas E. Dickey * + * Copyright 1998-2008,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * comp_hash.c --- Routines to deal with the hashtable of capability + * names. + * + */ + +#define USE_TERMLIB 1 +#include + +#include +#include + +MODULE_ID("$Id: comp_hash.c,v 1.55 2023/06/24 13:29:43 tom Exp $") + +/* + * Finds the entry for the given string in the hash table if present. + * Returns a pointer to the entry in the table or 0 if not found. + */ +NCURSES_EXPORT(struct name_table_entry const *) +_nc_find_entry(const char *string, + const HashValue * hash_table) +{ + bool termcap = (hash_table != _nc_get_hash_table(FALSE)); + const HashData *data = _nc_get_hash_info(termcap); + int hashvalue; + struct name_table_entry const *ptr = 0; + struct name_table_entry const *real_table; + + hashvalue = data->hash_of(string); + + if (hashvalue >= 0 + && (unsigned) hashvalue < data->table_size + && data->table_data[hashvalue] >= 0) { + + real_table = _nc_get_table(termcap); + ptr = real_table + data->table_data[hashvalue]; + while (!data->compare_names(ptr->nte_name, string)) { + if (ptr->nte_link < 0) { + ptr = 0; + break; + } + ptr = real_table + (ptr->nte_link + + data->table_data[data->table_size]); + } + } + + return (ptr); +} + +/* + * Finds the entry for the given name with the given type in the given table if + * present (as distinct from _nc_find_entry, which finds the last entry + * regardless of type). + * + * Returns a pointer to the entry in the table or 0 if not found. + */ +NCURSES_EXPORT(struct name_table_entry const *) +_nc_find_type_entry(const char *string, + int type, + bool termcap) +{ + struct name_table_entry const *ptr = NULL; + const HashData *data = _nc_get_hash_info(termcap); + int hashvalue = data->hash_of(string); + + if (hashvalue >= 0 + && (unsigned) hashvalue < data->table_size + && data->table_data[hashvalue] >= 0) { + const struct name_table_entry *const table = _nc_get_table(termcap); + + if (table != NULL) { + ptr = table + data->table_data[hashvalue]; + while (ptr->nte_type != type + || !data->compare_names(ptr->nte_name, string)) { + if (ptr->nte_link < 0) { + ptr = 0; + break; + } + ptr = table + (ptr->nte_link + data->table_data[data->table_size]); + } + } + } + + return ptr; +} + +#if NCURSES_XNAMES +NCURSES_EXPORT(struct user_table_entry const *) +_nc_find_user_entry(const char *string) +{ + const HashData *data = _nc_get_hash_user(); + int hashvalue; + struct user_table_entry const *ptr = 0; + struct user_table_entry const *real_table; + + hashvalue = data->hash_of(string); + + if (hashvalue >= 0 + && (unsigned) hashvalue < data->table_size + && data->table_data[hashvalue] >= 0) { + + real_table = _nc_get_userdefs_table(); + ptr = real_table + data->table_data[hashvalue]; + while (!data->compare_names(ptr->ute_name, string)) { + if (ptr->ute_link < 0) { + ptr = 0; + break; + } + ptr = real_table + (ptr->ute_link + + data->table_data[data->table_size]); + } + } + + return (ptr); +} +#endif /* NCURSES_XNAMES */ diff --git a/contrib/ncurses/ncurses/tinfo/comp_parse.c b/contrib/ncurses/ncurses/tinfo/comp_parse.c new file mode 100644 index 00000000..3cda0893 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/comp_parse.c @@ -0,0 +1,772 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * comp_parse.c -- parser driver loop and use handling. + * + * Use this code by calling _nc_read_entry_source() on as many source + * files as you like (either terminfo or termcap syntax). If you + * want use-resolution, call _nc_resolve_uses2(). To free the list + * storage, do _nc_free_entries(). + */ + +#include + +#include + +#include + +MODULE_ID("$Id: comp_parse.c,v 1.135 2024/07/27 19:15:16 tom Exp $") + +static void sanity_check2(TERMTYPE2 *, bool); +NCURSES_IMPEXP void (NCURSES_API *_nc_check_termtype2) (TERMTYPE2 *, bool) = sanity_check2; + +static void fixup_acsc(TERMTYPE2 *, int); + +static void +enqueue(ENTRY * ep) +/* add an entry to the in-core list */ +{ + ENTRY *newp; + + DEBUG(2, (T_CALLED("enqueue(ep=%p)"), (void *) ep)); + + newp = _nc_copy_entry(ep); + if (newp == 0) + _nc_err_abort(MSG_NO_MEMORY); + + newp->last = _nc_tail; + _nc_tail = newp; + + newp->next = 0; + if (newp->last) + newp->last->next = newp; + DEBUG(2, (T_RETURN(""))); +} + +#define NAMEBUFFER_SIZE (MAX_NAME_SIZE + 2) + +static char * +force_bar(char *dst, char *src) +{ + if (strchr(src, '|') == 0) { + size_t len = strlen(src); + if (len > MAX_NAME_SIZE) + len = MAX_NAME_SIZE; + _nc_STRNCPY(dst, src, MAX_NAME_SIZE); + _nc_STRCPY(dst + len, "|", NAMEBUFFER_SIZE - len); + src = dst; + } + return src; +} +#define ForceBar(dst, src) ((strchr(src, '|') == 0) ? force_bar(dst, src) : src) + +#if NCURSES_USE_TERMCAP && NCURSES_XNAMES +static char * +skip_index(char *name) +{ + char *bar = strchr(name, '|'); + + if (bar != 0 && (bar - name) == 2) + name = bar + 1; + + return name; +} +#endif + +static bool +check_collisions(char *n1, char *n2, int counter) +{ + const char *pstart; + const char *qstart; + char *pend, *qend; + char nc1[NAMEBUFFER_SIZE]; + char nc2[NAMEBUFFER_SIZE]; + + n1 = ForceBar(nc1, n1); + n2 = ForceBar(nc2, n2); + +#if NCURSES_USE_TERMCAP && NCURSES_XNAMES + if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) { + n1 = skip_index(n1); + n2 = skip_index(n2); + } +#endif + + for (pstart = n1; (pend = strchr(pstart, '|')); pstart = pend + 1) { + for (qstart = n2; (qend = strchr(qstart, '|')); qstart = qend + 1) { + if ((pend - pstart == qend - qstart) + && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) { + if (counter > 0) + (void) fprintf(stderr, "Name collision '%.*s' between\n", + (int) (pend - pstart), pstart); + return (TRUE); + } + } + } + + return (FALSE); +} + +static char * +next_name(char *name) +{ + if (*name != '\0') + ++name; + return name; +} + +static char * +name_ending(char *name) +{ + if (*name == '\0') { + name = 0; + } else { + while (*name != '\0' && *name != '|') + ++name; + } + return name; +} + +/* + * Essentially, find the conflict reported in check_collisions() and remove + * it from the second name, unless that happens to be the last alias. + */ +static bool +remove_collision(char *n1, char *n2) +{ + char *p2 = n2; + char *pstart, *qstart, *pend, *qend; + bool removed = FALSE; + +#if NCURSES_USE_TERMCAP && NCURSES_XNAMES + if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) { + n1 = skip_index(n1); + p2 = n2 = skip_index(n2); + } +#endif + + for (pstart = n1; (pend = name_ending(pstart)); pstart = next_name(pend)) { + for (qstart = n2; (qend = name_ending(qstart)); qstart = next_name(qend)) { + if ((pend - pstart == qend - qstart) + && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) { + if (qstart != p2 || *qend == '|') { + if (*qend == '|') + ++qend; + while ((*qstart++ = *qend++) != '\0') ; + fprintf(stderr, "...now\t%s\n", p2); + removed = TRUE; + } else { + fprintf(stderr, "Cannot remove alias '%.*s'\n", + (int) (qend - qstart), qstart); + } + break; + } + } + } + + return removed; +} + +/* do any of the aliases in a pair of terminal names match? */ +NCURSES_EXPORT(bool) +_nc_entry_match(char *n1, char *n2) +{ + return check_collisions(n1, n2, 0); +} + +/**************************************************************************** + * + * Entry compiler and resolution logic + * + ****************************************************************************/ + +NCURSES_EXPORT(void) +_nc_read_entry_source(FILE *fp, char *buf, + int literal, bool silent, + bool(*hook) (ENTRY *)) +/* slurp all entries in the given file into core */ +{ + ENTRY thisentry; + bool oldsuppress = _nc_suppress_warnings; + int immediate = 0; + + DEBUG(2, + (T_CALLED("_nc_read_entry_source(" + "file=%p, buf=%p, literal=%d, silent=%d, hook=%#" + PRIxPTR ")"), + (void *) fp, buf, literal, silent, CASTxPTR(hook))); + + if (silent) + _nc_suppress_warnings = TRUE; /* shut the lexer up, too */ + + _nc_reset_input(fp, buf); + for (;;) { + memset(&thisentry, 0, sizeof(thisentry)); + if (_nc_parse_entry(&thisentry, literal, silent) == ERR) + break; + if (!isalnum(UChar(thisentry.tterm.term_names[0]))) + _nc_err_abort("terminal names must start with letter or digit"); + + /* + * This can be used for immediate compilation of entries with no "use=" + * references to disk. That avoids consuming a lot of memory when the + * resolution code could fetch entries off disk. + */ + if (hook != NULLHOOK && (*hook) (&thisentry)) { + immediate++; + } else { + enqueue(&thisentry); + /* + * The enqueued entry is copied with _nc_copy_termtype(), so we can + * free some of the data from thisentry, i.e., the arrays. + */ + FreeIfNeeded(thisentry.tterm.Booleans); + FreeIfNeeded(thisentry.tterm.Numbers); + FreeIfNeeded(thisentry.tterm.Strings); + FreeIfNeeded(thisentry.tterm.str_table); +#if NCURSES_XNAMES + FreeIfNeeded(thisentry.tterm.ext_Names); + FreeIfNeeded(thisentry.tterm.ext_str_table); +#endif + } + } + + if (_nc_tail) { + /* set up the head pointer */ + for (_nc_head = _nc_tail; _nc_head->last; _nc_head = _nc_head->last) { + /* EMPTY */ ; + } + + DEBUG(2, ("head = %s", _nc_head->tterm.term_names)); + DEBUG(2, ("tail = %s", _nc_tail->tterm.term_names)); + } +#ifdef TRACE + else if (!immediate) + DEBUG(2, ("no entries parsed")); +#endif + + _nc_suppress_warnings = oldsuppress; + DEBUG(2, (T_RETURN(""))); +} + +#if 0 && NCURSES_XNAMES +static unsigned +find_capname(TERMTYPE2 *p, const char *name) +{ + unsigned num_names = NUM_EXT_NAMES(p); + unsigned n; + if (name != 0) { + for (n = 0; n < num_names; ++n) { + if (!strcmp(p->ext_Names[n], name)) + break; + } + } else { + n = num_names + 1; + } + return n; +} + +static int +extended_captype(TERMTYPE2 *p, unsigned which) +{ + int result = UNDEF; + unsigned limit = 0; + limit += p->ext_Booleans; + if (limit != 0 && which < limit) { + result = BOOLEAN; + } else { + limit += p->ext_Numbers; + if (limit != 0 && which < limit) { + result = NUMBER; + } else { + limit += p->ext_Strings; + if (limit != 0 && which < limit) { + result = ((p->Strings[STRCOUNT + which] != CANCELLED_STRING) + ? STRING + : CANCEL); + } else if (which >= limit) { + result = CANCEL; + } + } + } + return result; +} + +static const char * +name_of_captype(int which) +{ + const char *result = "?"; + switch (which) { + case BOOLEAN: + result = "boolean"; + break; + case NUMBER: + result = "number"; + break; + case STRING: + result = "string"; + break; + } + return result; +} + +#define valid_TERMTYPE2(p) \ + ((p) != 0 && \ + (p)->term_names != 0 && \ + (p)->ext_Names != 0) + +/* + * Disallow changing the type of an extended capability when doing a "use" + * if one or the other is a string. + */ +static int +invalid_merge(TERMTYPE2 *to, TERMTYPE2 *from) +{ + int rc = FALSE; + if (valid_TERMTYPE2(to) + && valid_TERMTYPE2(from)) { + char *to_name = _nc_first_name(to->term_names); + char *from_name = strdup(_nc_first_name(from->term_names)); + unsigned num_names = NUM_EXT_NAMES(from); + unsigned n; + + for (n = 0; n < num_names; ++n) { + const char *capname = from->ext_Names[n]; + int tt = extended_captype(to, find_capname(to, capname)); + int tf = extended_captype(from, n); + + if (tt <= STRING + && tf <= STRING + && (tt == STRING) != (tf == STRING)) { + if (from_name != 0 && strcmp(to_name, from_name)) { + _nc_warning("merge of %s to %s changes type of %s from %s to %s", + from_name, + to_name, + from->ext_Names[n], + name_of_captype(tf), + name_of_captype(tt)); + } else { + _nc_warning("merge of %s changes type of %s from %s to %s", + to_name, + from->ext_Names[n], + name_of_captype(tf), + name_of_captype(tt)); + } + rc = TRUE; + } + } + free(from_name); + } + return rc; +} +#define validate_merge(p, q) \ + if (invalid_merge(&((p)->tterm), &((q)->tterm))) \ + return FALSE +#else +#define validate_merge(p, q) /* nothing */ +#endif + +NCURSES_EXPORT(int) +_nc_resolve_uses2(bool fullresolve, bool literal) +/* try to resolve all use capabilities */ +{ + ENTRY *qp, *rp, *lastread = 0; + bool keepgoing; + unsigned i, j; + int total_unresolved, multiples; + + DEBUG(2, (T_CALLED("_nc_resolve_uses2"))); + + /* + * Check for multiple occurrences of the same name. + */ + multiples = 0; + for_entry_list(qp) { + int matchcount = 0; + + for_entry_list2(rp, qp->next) { + if (qp > rp + && check_collisions(qp->tterm.term_names, + rp->tterm.term_names, + matchcount + 1)) { + if (!matchcount++) { + (void) fprintf(stderr, "\t%s\n", rp->tterm.term_names); + } + (void) fprintf(stderr, "and\t%s\n", qp->tterm.term_names); + if (!remove_collision(rp->tterm.term_names, + qp->tterm.term_names)) { + ++multiples; + } + } + } + } + if (multiples > 0) { + DEBUG(2, (T_RETURN("false"))); + return (FALSE); + } + + DEBUG(2, ("NO MULTIPLE NAME OCCURRENCES")); + + /* + * First resolution stage: compute link pointers corresponding to names. + */ + total_unresolved = 0; + _nc_curr_col = -1; + for_entry_list(qp) { + for (i = 0; i < qp->nuses; i++) { + bool foundit; + char *child = _nc_first_name(qp->tterm.term_names); + char *lookfor = qp->uses[i].name; + long lookline = qp->uses[i].line; + + if (lookfor == 0) + continue; + + foundit = FALSE; + + _nc_set_type(child); + + /* first, try to resolve from in-core records */ + for_entry_list(rp) { + if (rp != qp + && _nc_name_match(rp->tterm.term_names, lookfor, "|")) { + DEBUG(2, ("%s: resolving use=%s %p (in core)", + child, lookfor, lookfor)); + + qp->uses[i].link = rp; + foundit = TRUE; + + /* verify that there are no earlier uses */ + for (j = 0; j < i; ++j) { + if (qp->uses[j].link != NULL + && !strcmp(qp->uses[j].link->tterm.term_names, + rp->tterm.term_names)) { + _nc_warning("duplicate use=%s", lookfor); + break; + } + } + } + } + + /* if that didn't work, try to merge in a compiled entry */ + if (!foundit) { + TERMTYPE2 thisterm; + char filename[PATH_MAX]; + + memset(&thisterm, 0, sizeof(thisterm)); + if (_nc_read_entry2(lookfor, filename, &thisterm) == 1) { + DEBUG(2, ("%s: resolving use=%s (compiled)", + child, lookfor)); + + TYPE_MALLOC(ENTRY, 1, rp); + rp->tterm = thisterm; + rp->nuses = 0; + rp->next = lastread; + lastread = rp; + + qp->uses[i].link = rp; + foundit = TRUE; + + /* verify that there are no earlier uses */ + for (j = 0; j < i; ++j) { + if (qp->uses[j].link != NULL + && !strcmp(qp->uses[j].link->tterm.term_names, + rp->tterm.term_names)) { + _nc_warning("duplicate use=%s", lookfor); + break; + } + } + } + } + + /* no good, mark this one unresolvable and complain */ + if (!foundit) { + total_unresolved++; + + _nc_curr_line = (int) lookline; + _nc_warning("resolution of use=%s failed", lookfor); + qp->uses[i].link = 0; + } + } + } + if (total_unresolved) { + /* free entries read in off disk */ + _nc_free_entries(lastread); + DEBUG(2, (T_RETURN("false"))); + return (FALSE); + } + + DEBUG(2, ("NAME RESOLUTION COMPLETED OK")); + + /* + * OK, at this point all (char *) references in `name' members + * have been successfully converted to (ENTRY *) pointers in + * `link' members. Time to do the actual merges. + */ + if (fullresolve) { + do { + ENTRY merged; + + keepgoing = FALSE; + + for_entry_list(qp) { + if (qp->nuses > 0) { + DEBUG(2, ("%s: attempting merge of %d entries", + _nc_first_name(qp->tterm.term_names), + qp->nuses)); + /* + * If any of the use entries we're looking for is + * incomplete, punt. We'll catch this entry on a + * subsequent pass. + */ + for (i = 0; i < qp->nuses; i++) { + if (qp->uses[i].link + && qp->uses[i].link->nuses) { + DEBUG(2, ("%s: use entry %d unresolved", + _nc_first_name(qp->tterm.term_names), i)); + goto incomplete; + } + } + + /* + * First, make sure there is no garbage in the + * merge block. As a side effect, copy into + * the merged entry the name field and string + * table pointer. + */ + _nc_copy_termtype2(&(merged.tterm), &(qp->tterm)); + + /* + * Now merge in each use entry in the proper + * (reverse) order. + */ + for (; qp->nuses; qp->nuses--) { + int n = (int) (qp->nuses - 1); + validate_merge(&merged, qp->uses[n].link); + _nc_merge_entry(&merged, qp->uses[n].link); + free(qp->uses[n].name); + } + + /* + * Now merge in the original entry. + */ + validate_merge(&merged, qp); + _nc_merge_entry(&merged, qp); + + /* + * Replace the original entry with the merged one. + */ + FreeIfNeeded(qp->tterm.Booleans); + FreeIfNeeded(qp->tterm.Numbers); + FreeIfNeeded(qp->tterm.Strings); + FreeIfNeeded(qp->tterm.str_table); +#if NCURSES_XNAMES + FreeIfNeeded(qp->tterm.ext_Names); + FreeIfNeeded(qp->tterm.ext_str_table); +#endif + qp->tterm = merged.tterm; + _nc_wrap_entry(qp, TRUE); + + /* + * We know every entry is resolvable because name resolution + * didn't bomb. So go back for another pass. + */ + /* FALLTHRU */ + incomplete: + keepgoing = TRUE; + } + } + } while + (keepgoing); + + DEBUG(2, ("MERGES COMPLETED OK")); + } + + DEBUG(2, ("RESOLUTION FINISHED")); + + if (fullresolve) { + _nc_curr_col = -1; + for_entry_list(qp) { + _nc_curr_line = (int) qp->startline; + _nc_set_type(_nc_first_name(qp->tterm.term_names)); + /* + * tic overrides this function pointer to provide more verbose + * checking. + */ + if (_nc_check_termtype2 != sanity_check2) { + SCREEN *save_SP = SP; + SCREEN fake_sp; + TERMINAL fake_tm; + TERMINAL *save_tm = cur_term; + + /* + * Setup so that tic can use ordinary terminfo interface to + * obtain capability information. + */ + memset(&fake_sp, 0, sizeof(fake_sp)); + memset(&fake_tm, 0, sizeof(fake_tm)); + fake_sp._term = &fake_tm; + TerminalType(&fake_tm) = qp->tterm; + _nc_set_screen(&fake_sp); + set_curterm(&fake_tm); + + _nc_check_termtype2(&qp->tterm, literal); + + /* + * Checking calls tparm, which can allocate memory. Fix leaks. + */ +#define TPS(name) fake_tm.tparm_state.name + FreeAndNull(TPS(out_buff)); + FreeAndNull(TPS(fmt_buff)); +#undef TPS + + _nc_set_screen(save_SP); + set_curterm(save_tm); + } else { + fixup_acsc(&qp->tterm, literal); + } + } + DEBUG(2, ("SANITY CHECK FINISHED")); + } + + DEBUG(2, (T_RETURN("true"))); + return (TRUE); +} + +/* + * This bit of legerdemain turns all the terminfo variable names into + * references to locations in the arrays Booleans, Numbers, and Strings --- + * precisely what's needed. + */ + +#undef CUR +#define CUR tp-> + +static void +fixup_acsc(TERMTYPE2 *tp, int literal) +{ + if (!literal) { + if (acs_chars == ABSENT_STRING + && PRESENT(enter_alt_charset_mode) + && PRESENT(exit_alt_charset_mode)) + acs_chars = strdup(VT_ACSC); + } +} + +static void +sanity_check2(TERMTYPE2 *tp, bool literal) +{ + if (!PRESENT(exit_attribute_mode)) { +#ifdef __UNUSED__ /* this casts too wide a net */ + bool terminal_entry = !strchr(tp->term_names, '+'); + if (terminal_entry && + (PRESENT(set_attributes) + || PRESENT(enter_standout_mode) + || PRESENT(enter_underline_mode) + || PRESENT(enter_blink_mode) + || PRESENT(enter_bold_mode) + || PRESENT(enter_dim_mode) + || PRESENT(enter_secure_mode) + || PRESENT(enter_protected_mode) + || PRESENT(enter_reverse_mode))) + _nc_warning("no exit_attribute_mode"); +#endif /* __UNUSED__ */ + PAIRED(enter_standout_mode, exit_standout_mode); + PAIRED(enter_underline_mode, exit_underline_mode); +#if defined(enter_italics_mode) && defined(exit_italics_mode) + PAIRED(enter_italics_mode, exit_italics_mode); +#endif + } + + /* we do this check/fix in postprocess_termcap(), but some packagers + * prefer to bypass it... + */ + if (!literal) { + fixup_acsc(tp, literal); + ANDMISSING(enter_alt_charset_mode, acs_chars); + ANDMISSING(exit_alt_charset_mode, acs_chars); + } + + /* listed in structure-member order of first argument */ + PAIRED(enter_alt_charset_mode, exit_alt_charset_mode); + ANDMISSING(enter_blink_mode, exit_attribute_mode); + ANDMISSING(enter_bold_mode, exit_attribute_mode); + PAIRED(exit_ca_mode, enter_ca_mode); + PAIRED(enter_delete_mode, exit_delete_mode); + ANDMISSING(enter_dim_mode, exit_attribute_mode); + PAIRED(enter_insert_mode, exit_insert_mode); + ANDMISSING(enter_secure_mode, exit_attribute_mode); + ANDMISSING(enter_protected_mode, exit_attribute_mode); + ANDMISSING(enter_reverse_mode, exit_attribute_mode); + PAIRED(from_status_line, to_status_line); + PAIRED(meta_off, meta_on); + + PAIRED(prtr_on, prtr_off); + PAIRED(save_cursor, restore_cursor); + PAIRED(enter_xon_mode, exit_xon_mode); + PAIRED(enter_am_mode, exit_am_mode); + ANDMISSING(label_off, label_on); +#if defined(display_clock) && defined(remove_clock) + PAIRED(display_clock, remove_clock); +#endif + ANDMISSING(set_color_pair, initialize_pair); +} + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_leaks_tic(void) +{ + T((T_CALLED("_nc_leaks_tic()"))); + _nc_globals.leak_checking = TRUE; + _nc_alloc_entry_leaks(); + _nc_captoinfo_leaks(); + _nc_comp_scan_leaks(); +#if BROKEN_LINKER || USE_REENTRANT + _nc_names_leaks(); + _nc_codes_leaks(); +#endif + _nc_tic_expand(0, FALSE, 0); + T((T_RETURN(""))); +} + +NCURSES_EXPORT(void) +_nc_free_tic(int code) +{ + T((T_CALLED("_nc_free_tic(%d)"), code)); + _nc_leaks_tic(); + exit_terminfo(code); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/comp_scan.c b/contrib/ncurses/ncurses/tinfo/comp_scan.c new file mode 100644 index 00000000..a4c332a6 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/comp_scan.c @@ -0,0 +1,1063 @@ +/**************************************************************************** +,* Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996 on * + ****************************************************************************/ + +/* + * comp_scan.c --- Lexical scanner for terminfo compiler. + * + * _nc_reset_input() + * _nc_get_token() + * _nc_panic_mode() + * int _nc_syntax; + * int _nc_curr_line; + * long _nc_curr_file_pos; + * long _nc_comment_start; + * long _nc_comment_end; + */ + +#include + +#include +#include + +MODULE_ID("$Id: comp_scan.c,v 1.123 2024/07/27 19:22:23 tom Exp $") + +/* + * Maximum length of string capability we'll accept before raising an error. + * Yes, there is a real capability in /etc/termcap this long, an "is". + */ +#define MAXCAPLEN 600 + +#define iswhite(ch) (ch == ' ' || ch == '\t') + +NCURSES_EXPORT_VAR (int) _nc_syntax = 0; /* termcap or terminfo? */ +NCURSES_EXPORT_VAR (int) _nc_strict_bsd = 1; /* ncurses extended termcap? */ +NCURSES_EXPORT_VAR (long) _nc_curr_file_pos = 0; /* file offset of current line */ +NCURSES_EXPORT_VAR (long) _nc_comment_start = 0; /* start of comment range before name */ +NCURSES_EXPORT_VAR (long) _nc_comment_end = 0; /* end of comment range before name */ +NCURSES_EXPORT_VAR (long) _nc_start_line = 0; /* start line of current entry */ + +NCURSES_EXPORT_VAR (struct token) _nc_curr_token = +{ + 0, 0, 0 +}; + +/***************************************************************************** + * + * Token-grabbing machinery + * + *****************************************************************************/ + +static bool first_column; /* See 'next_char()' below */ +static bool had_newline; +static char separator; /* capability separator */ +static int pushtype; /* type of pushback token */ +static char *pushname; + +#if NCURSES_EXT_FUNCS +NCURSES_EXPORT_VAR (bool) _nc_disable_period = FALSE; /* used by tic -a option */ +#endif + +/***************************************************************************** + * + * Character-stream handling + * + *****************************************************************************/ + +#define LEXBUFSIZ 1024 + +static char *bufptr; /* otherwise, the input buffer pointer */ +static char *bufstart; /* start of buffer so we can compute offsets */ +static FILE *yyin; /* scanner's input file descriptor */ + +/* + * _nc_reset_input() + * + * Resets the input-reading routines. Used on initialization, + * or after a seek has been done. Exactly one argument must be + * non-null. + */ + +NCURSES_EXPORT(void) +_nc_reset_input(FILE *fp, char *buf) +{ + TR(TRACE_DATABASE, + (T_CALLED("_nc_reset_input(fp=%p, buf=%p)"), (void *) fp, buf)); + + pushtype = NO_PUSHBACK; + if (pushname != 0) + pushname[0] = '\0'; + yyin = fp; + bufstart = bufptr = buf; + _nc_curr_file_pos = 0L; + if (fp != 0) + _nc_curr_line = 0; + _nc_curr_col = 0; + + returnVoidDB; +} + +/* + * int last_char() + * + * Returns the final nonblank character on the current input buffer + */ +static int +last_char(int from_end) +{ + size_t len = strlen(bufptr); + int result = 0; + + while (len--) { + if (!isspace(UChar(bufptr[len]))) { + if (from_end <= (int) len) + result = bufptr[(int) len - from_end]; + break; + } + } + return result; +} + +/* + * Read, like fgets(), but error-out if the input contains nulls. + */ +static int +get_text(char *buffer, int length) +{ + int count = 0; + int limit = length - 1; + + while (limit-- > 0) { + int ch = fgetc(yyin); + + if (ch == '\0') { + _nc_err_abort("This is not a text-file"); + } else if (ch == EOF) { + break; + } + ++count; + *buffer++ = (char) ch; + if (ch == '\n') + break; + } + *buffer = '\0'; + return count; +} + +/* + * int next_char() + * + * Returns the next character in the input stream. Comments and leading + * white space are stripped. + * + * The global state variable 'firstcolumn' is set TRUE if the character + * returned is from the first column of the input line. + * + * The global variable _nc_curr_line is incremented for each new line. + * The global variable _nc_curr_file_pos is set to the file offset of the + * beginning of each line. + */ + +static int +next_char(void) +{ + static char *result; + static size_t allocated; + int the_char; + + if (!yyin) { + if (result != 0) { + FreeAndNull(result); + FreeAndNull(pushname); + bufptr = 0; + bufstart = 0; + allocated = 0; + } + /* + * An string with an embedded null will truncate the input. This is + * intentional (we don't read binary files here). + */ + if (bufptr == 0 || *bufptr == '\0') + return (EOF); + if (*bufptr == '\n') { + _nc_curr_line++; + _nc_curr_col = 0; + } else if (*bufptr == '\t') { + _nc_curr_col = (_nc_curr_col | 7); + } + } else if (!bufptr || !*bufptr) { + /* + * In theory this could be recoded to do its I/O one character at a + * time, saving the buffer space. In practice, this turns out to be + * quite hard to get completely right. Try it and see. If you + * succeed, don't forget to hack push_back() correspondingly. + */ + size_t len; + + do { + size_t used = 0; + bufstart = 0; + do { + if (used + (LEXBUFSIZ / 4) >= allocated) { + allocated += (allocated + LEXBUFSIZ); + result = typeRealloc(char, allocated, result); + if (result == 0) + return (EOF); + if (bufstart) + bufstart = result; + } + if (used == 0) + _nc_curr_file_pos = ftell(yyin); + + if (get_text(result + used, (int) (allocated - used))) { + bufstart = result; + if (used == 0) { + if (_nc_curr_line == 0 + && IS_TIC_MAGIC(result)) { + _nc_err_abort("This is a compiled terminal description, not a source"); + } + _nc_curr_line++; + _nc_curr_col = 0; + } + } else { + if (used != 0) + _nc_STRCAT(result, "\n", allocated); + } + if ((bufptr = bufstart) != 0) { + used = strlen(bufptr); + if (used == 0) + return (EOF); + while (iswhite(*bufptr)) { + if (*bufptr == '\t') { + _nc_curr_col = (_nc_curr_col | 7) + 1; + } else { + _nc_curr_col++; + } + bufptr++; + } + + /* + * Treat a trailing the same as a so we + * can read files on OS/2, etc. + */ + if ((len = strlen(bufptr)) > 1) { + if (bufptr[len - 1] == '\n' + && bufptr[len - 2] == '\r') { + len--; + bufptr[len - 1] = '\n'; + bufptr[len] = '\0'; + } + } + } else { + return (EOF); + } + } while (bufptr[len - 1] != '\n'); /* complete a line */ + } while (result[0] == '#'); /* ignore comments */ + } else if (*bufptr == '\t') { + _nc_curr_col = (_nc_curr_col | 7); + } + + first_column = (bufptr == bufstart); + if (first_column) + had_newline = FALSE; + + _nc_curr_col++; + the_char = *bufptr++; + return UChar(the_char); +} + +static void +push_back(int c) +/* push a character back onto the input stream */ +{ + if (bufptr == bufstart) + _nc_syserr_abort("cannot backspace off beginning of line"); + *--bufptr = (char) c; + _nc_curr_col--; +} + +static long +stream_pos(void) +/* return our current character position in the input stream */ +{ + return (yyin ? ftell(yyin) : (bufptr ? (long) (bufptr - bufstart) : 0)); +} + +static bool +end_of_stream(void) +/* are we at end of input? */ +{ + return ((yyin + ? (feof(yyin) && (bufptr == NULL || *bufptr == '\0')) + : (bufptr && *bufptr == '\0')) + ? TRUE : FALSE); +} + +/* Assume we may be looking at a termcap-style continuation */ +static NCURSES_INLINE int +eat_escaped_newline(int ch) +{ + if (ch == '\\') { + while ((ch = next_char()) == '\n' || iswhite(ch)) { + /* EMPTY */ ; + } + } + return ch; +} + +#define TOK_BUF_SIZE MAX_ENTRY_SIZE + +#define OkToAdd() \ + ((tok_ptr - tok_buf) < (TOK_BUF_SIZE - 2)) + +#define AddCh(ch) \ + *tok_ptr++ = (char) ch; \ + *tok_ptr = '\0' + +static char *tok_buf; + +/* + * int + * get_token() + * + * Scans the input for the next token, storing the specifics in the + * global structure 'curr_token' and returning one of the following: + * + * NAMES A line beginning in column 1. 'name' + * will be set to point to everything up to but + * not including the first separator on the line. + * BOOLEAN An entry consisting of a name followed by + * a separator. 'name' will be set to point to + * the name of the capability. + * NUMBER An entry of the form + * name#digits, + * 'name' will be set to point to the capability + * name and 'valnumber' to the number given. + * STRING An entry of the form + * name=characters, + * 'name' is set to the capability name and + * 'valstring' to the string of characters, with + * input translations done. + * CANCEL An entry of the form + * name@, + * 'name' is set to the capability name and + * 'valnumber' to -1. + * EOF The end of the file has been reached. + * + * A `separator' is either a comma or a semicolon, depending on whether + * we are in termcap or terminfo mode. + * + */ + +NCURSES_EXPORT(int) +_nc_get_token(bool silent) +{ + static const char terminfo_punct[] = "@%&*!#"; + + char *after_name; /* after primary name */ + char *after_list; /* after primary and alias list */ + char *numchk; + char *tok_ptr; + char *s; + char numbuf[80]; + int ch, c0, c1; + int dot_flag = FALSE; + int type; + long number; + long token_start; + unsigned found; +#ifdef TRACE + int old_line; + int old_col; +#endif + + DEBUG(3, (T_CALLED("_nc_get_token(silent=%d)"), silent)); + + if (pushtype != NO_PUSHBACK) { + int retval = pushtype; + + _nc_set_type(pushname != 0 ? pushname : ""); + DEBUG(3, ("pushed-back token: `%s', class %d", + _nc_curr_token.tk_name, pushtype)); + + pushtype = NO_PUSHBACK; + if (pushname != 0) + pushname[0] = '\0'; + + /* currtok wasn't altered by _nc_push_token() */ + DEBUG(3, (T_RETURN("%d"), retval)); + return (retval); + } + + if (end_of_stream()) { + yyin = 0; + (void) next_char(); /* frees its allocated memory */ + if (tok_buf != 0) { + if (_nc_curr_token.tk_name == tok_buf) + _nc_curr_token.tk_name = 0; + } + DEBUG(3, (T_RETURN("%d"), EOF)); + return (EOF); + } + + start_token: + token_start = stream_pos(); + while ((ch = next_char()) == '\n' || iswhite(ch)) { + if (ch == '\n') + had_newline = TRUE; + } + + ch = eat_escaped_newline(ch); + _nc_curr_token.tk_valstring = 0; + +#ifdef TRACE + old_line = _nc_curr_line; + old_col = _nc_curr_col; +#endif + if (ch == EOF) + type = EOF; + else { + /* if this is a termcap entry, skip a leading separator */ + if (separator == ':' && ch == ':') + ch = next_char(); + + if (ch == '.' +#if NCURSES_EXT_FUNCS + && !_nc_disable_period +#endif + ) { + dot_flag = TRUE; + DEBUG(8, ("dot-flag set")); + + while ((ch = next_char()) == '.' || iswhite(ch)) { + /* EMPTY */ ; + } + } + + if (ch == EOF) { + type = EOF; + goto end_of_token; + } + + /* have to make some punctuation chars legal for terminfo */ + if (!isalnum(UChar(ch)) +#if NCURSES_EXT_FUNCS + && !(ch == '.' && _nc_disable_period) +#endif + && ((strchr) (terminfo_punct, (char) ch) == 0)) { + if (!silent) + _nc_warning("Illegal character (expected alphanumeric or %s) - '%s'", + terminfo_punct, unctrl(UChar(ch))); + _nc_panic_mode(separator); + goto start_token; + } + + if (tok_buf == 0) + tok_buf = typeMalloc(char, TOK_BUF_SIZE); + +#ifdef TRACE + old_line = _nc_curr_line; + old_col = _nc_curr_col; +#endif + tok_ptr = tok_buf; + AddCh(ch); + + if (first_column) { + _nc_comment_start = token_start; + _nc_comment_end = _nc_curr_file_pos; + _nc_start_line = _nc_curr_line; + + _nc_syntax = ERR; + after_name = 0; + after_list = 0; + while ((ch = next_char()) != '\n') { + if (ch == EOF) { + _nc_err_abort(MSG_NO_INPUTS); + } else if (ch == '|') { + after_list = tok_ptr; + if (after_name == 0) + after_name = tok_ptr; + } else if (ch == ':' && last_char(0) != ',') { + _nc_syntax = SYN_TERMCAP; + separator = ':'; + break; + } else if (ch == ',') { + _nc_syntax = SYN_TERMINFO; + separator = ','; + /* + * If we did not see a '|', then we found a name with no + * aliases or description. + */ + if (after_name == 0) + break; + /* + * We saw a comma, but are not entirely sure this is + * terminfo format, since we can still be parsing the + * description field (for either syntax). + * + * A properly formatted termcap line ends with either a + * colon, or a backslash after a colon. It is possible + * to have a backslash in the middle of a capability, but + * then there would be no leading whitespace on the next + * line - something we want to discourage. + */ + c0 = last_char(0); + c1 = last_char(1); + if (c1 != ':' && c0 != '\\' && c0 != ':') { + bool capability = FALSE; + + /* + * Since it is not termcap, assume the line is terminfo + * format. However, the comma can be embedded in a + * description field. It also can be a separator + * between a description field and a capability. + * + * Improve the guess by checking if the next word after + * the comma does not look like a capability. In that + * case, extend the description past the comma. + */ + for (s = bufptr; isspace(UChar(*s)); ++s) { + ; + } + if (islower(UChar(*s))) { + const char *name = s; + while (isalnum(UChar(*s))) { + ++s; + } + if (*s == '#' || *s == '=' || *s == '@') { + /* + * Checking solely with syntax allows us to + * support extended capabilities with string + * values. + */ + capability = TRUE; + } else if (*s == ',') { + c0 = *s; + *s = '\0'; + /* + * Otherwise, we can handle predefined boolean + * capabilities, still aided by syntax. + */ + if (_nc_find_entry(name, + _nc_get_hash_table(FALSE))) { + capability = TRUE; + } + *s = (char) c0; + } + } + if (capability) { + break; + } + } + } else + ch = eat_escaped_newline(ch); + + if (OkToAdd()) { + AddCh(ch); + } else { + break; + } + } + *tok_ptr = '\0'; + if (_nc_syntax == ERR) { + /* + * Grrr...what we ought to do here is barf, complaining that + * the entry is malformed. But because a couple of name fields + * in the 8.2 termcap file end with |\, we just have to assume + * it is termcap syntax. + */ + _nc_syntax = SYN_TERMCAP; + separator = ':'; + } else if (_nc_syntax == SYN_TERMINFO) { + /* throw away trailing /, *$/ */ + for (--tok_ptr; + iswhite(*tok_ptr) || *tok_ptr == ','; + tok_ptr--) { + /* EMPTY */ ; + } + tok_ptr[1] = '\0'; + } + + /* + * This is the soonest we have the terminal name fetched. Set up + * for following warning messages. If there's no '|', then there + * is no description. + */ + if (after_name != 0) { + ch = *after_name; + *after_name = '\0'; + _nc_set_type(tok_buf); + *after_name = (char) ch; + } + + /* + * Compute the boundary between the aliases and the description + * field for syntax-checking purposes. + */ + if (after_list != 0) { + if (!silent) { + if (*after_list == '\0' || strchr("|", after_list[1]) != NULL) { + _nc_warning("empty longname field"); + } else if (strchr(after_list, ' ') == 0) { + _nc_warning("older tic versions may treat the description field as an alias"); + } + } + } else { + after_list = tok_buf + strlen(tok_buf); + DEBUG(2, ("missing description")); + } + + /* + * Whitespace in a name field other than the long name can confuse + * rdist and some termcap tools. Slashes are a no-no. Other + * special characters can be dangerous due to shell expansion. + */ + for (s = tok_buf; s < after_list; ++s) { + if (isspace(UChar(*s))) { + if (!silent) + _nc_warning("whitespace in name or alias field"); + break; + } else if (*s == '/') { + if (!silent) + _nc_warning("slashes aren't allowed in names or aliases"); + break; + } else if (strchr("$[]!*?", *s)) { + if (!silent) + _nc_warning("dubious character `%c' in name or alias field", *s); + break; + } + } + + _nc_curr_token.tk_name = tok_buf; + type = NAMES; + } else { + if (had_newline && _nc_syntax == SYN_TERMCAP) { + _nc_warning("Missing backslash before newline"); + had_newline = FALSE; + } + while ((ch = next_char()) != EOF) { + if (!isalnum(UChar(ch))) { + if (_nc_syntax == SYN_TERMINFO) { + if (ch != '_') + break; + } else { /* allow ';' for "k;" */ + if (ch != ';') + break; + } + } + if (OkToAdd()) { + AddCh(ch); + } else { + ch = EOF; + break; + } + } + + *tok_ptr++ = '\0'; /* separate name/value in buffer */ + switch (ch) { + case ',': + case ':': + if (ch != separator) + _nc_err_abort("Separator inconsistent with syntax"); + _nc_curr_token.tk_name = tok_buf; + type = BOOLEAN; + break; + case '@': + if ((ch = next_char()) != separator && !silent) + _nc_warning("Missing separator after `%s', have %s", + tok_buf, unctrl(UChar(ch))); + _nc_curr_token.tk_name = tok_buf; + type = CANCEL; + break; + + case '#': + found = 0; + while (isalnum(ch = next_char())) { + numbuf[found++] = (char) ch; + if (found >= sizeof(numbuf) - 1) + break; + } + numbuf[found] = '\0'; + number = strtol(numbuf, &numchk, 0); + if (!silent) { + if (numchk == numbuf) + _nc_warning("no value given for `%s'", tok_buf); + if ((*numchk != '\0') || (ch != separator)) + _nc_warning("Missing separator for `%s'", tok_buf); + if (number < 0) + _nc_warning("value of `%s' cannot be negative", tok_buf); + if (number > MAX_OF_TYPE(NCURSES_INT2)) { + _nc_warning("limiting value of `%s' from %#lx to %#x", + tok_buf, + number, MAX_OF_TYPE(NCURSES_INT2)); + number = MAX_OF_TYPE(NCURSES_INT2); + } + } + _nc_curr_token.tk_name = tok_buf; + _nc_curr_token.tk_valnumber = (int) number; + type = NUMBER; + break; + + case '=': + ch = _nc_trans_string(tok_ptr, tok_buf + TOK_BUF_SIZE); + if (!silent && ch != separator) + _nc_warning("Missing separator"); + _nc_curr_token.tk_name = tok_buf; + _nc_curr_token.tk_valstring = tok_ptr; + type = STRING; + break; + + case EOF: + type = EOF; + break; + default: + /* just to get rid of the compiler warning */ + type = UNDEF; + if (!silent) + _nc_warning("Illegal character - '%s'", unctrl(UChar(ch))); + } + } /* end else (first_column == FALSE) */ + } /* end else (ch != EOF) */ + + end_of_token: + +#ifdef TRACE + if (dot_flag == TRUE) + DEBUG(8, ("Commented out ")); + + if (_nc_tracing >= DEBUG_LEVEL(8)) { + _tracef("parsed %d.%d to %d.%d", + old_line, old_col, + _nc_curr_line, _nc_curr_col); + } + if (_nc_tracing >= DEBUG_LEVEL(7)) { + switch (type) { + case BOOLEAN: + _tracef("Token: Boolean; name='%s'", + _nc_curr_token.tk_name); + break; + + case NUMBER: + _tracef("Token: Number; name='%s', value=%d", + _nc_curr_token.tk_name, + _nc_curr_token.tk_valnumber); + break; + + case STRING: + _tracef("Token: String; name='%s', value=%s", + _nc_curr_token.tk_name, + _nc_visbuf(_nc_curr_token.tk_valstring)); + break; + + case CANCEL: + _tracef("Token: Cancel; name='%s'", + _nc_curr_token.tk_name); + break; + + case NAMES: + + _tracef("Token: Names; value='%s'", + _nc_curr_token.tk_name); + break; + + case EOF: + _tracef("Token: End of file"); + break; + + default: + _nc_warning("Bad token type"); + } + } +#endif + + if (dot_flag == TRUE) /* if commented out, use the next one */ + type = _nc_get_token(silent); + + DEBUG(3, ("token: `%s', class %d", + ((_nc_curr_token.tk_name != 0) + ? _nc_curr_token.tk_name + : ""), + type)); + + DEBUG(3, (T_RETURN("%d"), type)); + return (type); +} + +/* + * char + * trans_string(ptr) + * + * Reads characters using next_char() until encountering a separator, nl, + * or end-of-file. The returned value is the character which caused + * reading to stop. The following translations are done on the input: + * + * ^X goes to ctrl-X (i.e. X & 037) + * {\E,\n,\r,\b,\t,\f} go to + * {ESCAPE,newline,carriage-return,backspace,tab,formfeed} + * {\^,\\} go to {carat,backslash} + * \ddd (for ddd = up to three octal digits) goes to the character ddd + * + * \e == \E + * \0 == \200 + * + */ + +NCURSES_EXPORT(int) +_nc_trans_string(char *ptr, const char *const last) +{ + int count = 0; + int number = 0; + int i, c; + int last_ch = '\0'; + bool ignored = FALSE; + bool long_warning = FALSE; + + while ((c = next_char()) != separator && c != EOF) { + if (ptr >= (last - 1)) { + if (c != EOF) { + while ((c = next_char()) != separator && c != EOF) { + ; + } + } + break; + } + if ((_nc_syntax == SYN_TERMCAP) && c == '\n') + break; + if (c == '^' && last_ch != '%') { + c = next_char(); + if (c == EOF) + _nc_err_abort(MSG_NO_INPUTS); + + if (!(is7bits(c) && isprint(c))) { + _nc_warning("Illegal ^ character - '%s'", unctrl(UChar(c))); + } + if (c == '?' && (_nc_syntax != SYN_TERMCAP)) { + *(ptr++) = '\177'; + } else { + if ((c &= 037) == 0) + c = 128; + *(ptr++) = (char) (c); + } + } else if (c == '\\') { + bool strict_bsd = ((_nc_syntax == SYN_TERMCAP) && _nc_strict_bsd); + + c = next_char(); + if (c == EOF) + _nc_err_abort(MSG_NO_INPUTS); + + if (isoctal(c) || (strict_bsd && isdigit(c))) { + number = c - '0'; + for (i = 0; i < 2; i++) { + c = next_char(); + if (c == EOF) + _nc_err_abort(MSG_NO_INPUTS); + + if (!isoctal(c)) { + if (isdigit(c)) { + if (!strict_bsd) { + _nc_warning("Non-octal digit `%c' in \\ sequence", c); + /* allow the digit; it'll do less harm */ + } + } else { + push_back(c); + break; + } + } + + number = number * 8 + c - '0'; + } + + number = UChar(number); + if (number == 0 && !strict_bsd) + number = 0200; + *(ptr++) = (char) number; + } else { + switch (c) { + case 'E': + *(ptr++) = '\033'; + break; + + case 'n': + *(ptr++) = '\n'; + break; + + case 'r': + *(ptr++) = '\r'; + break; + + case 'b': + *(ptr++) = '\010'; + break; + + case 'f': + *(ptr++) = '\014'; + break; + + case 't': + *(ptr++) = '\t'; + break; + + case '\\': + *(ptr++) = '\\'; + break; + + case '^': + *(ptr++) = '^'; + break; + + case ',': + *(ptr++) = ','; + break; + + case '\n': + continue; + + default: + if ((_nc_syntax == SYN_TERMINFO) || !_nc_strict_bsd) { + switch (c) { + case 'a': + c = '\007'; + break; + case 'e': + c = '\033'; + break; + case 'l': + c = '\n'; + break; + case 's': + c = ' '; + break; + case ':': + c = ':'; + break; + default: + _nc_warning("Illegal character '%s' in \\ sequence", + unctrl(UChar(c))); + break; + } + } + /* FALLTHRU */ + case '|': + *(ptr++) = (char) c; + } /* endswitch (c) */ + } /* endelse (c < '0' || c > '7') */ + } + /* end else if (c == '\\') */ + else if (c == '\n' && (_nc_syntax == SYN_TERMINFO)) { + /* + * Newlines embedded in a terminfo string are ignored, provided + * that the next line begins with whitespace. + */ + ignored = TRUE; + } else { + *(ptr++) = (char) c; + } + + if (!ignored) { + if (_nc_curr_col <= 1) { + push_back(c); + c = '\n'; + break; + } + last_ch = c; + count++; + } + ignored = FALSE; + + if (count > MAXCAPLEN && !long_warning) { + _nc_warning("Very long string found. Missing separator?"); + long_warning = TRUE; + } + } /* end while */ + + *ptr = '\0'; + + return (c); +} + +/* + * _nc_push_token() + * + * Push a token of given type so that it will be reread by the next + * get_token() call. + */ + +NCURSES_EXPORT(void) +_nc_push_token(int tokclass) +{ + /* + * This implementation is kind of bogus, it will fail if we ever do more + * than one pushback at a time between get_token() calls. It relies on the + * fact that _nc_curr_token is static storage that nothing but + * _nc_get_token() touches. + */ + pushtype = tokclass; + if (pushname == 0) + pushname = typeMalloc(char, MAX_NAME_SIZE + 1); + _nc_get_type(pushname); + + DEBUG(3, ("pushing token: `%s', class %d", + ((_nc_curr_token.tk_name != 0) + ? _nc_curr_token.tk_name + : ""), + pushtype)); +} + +/* + * Panic mode error recovery - skip everything until a "ch" is found. + */ +NCURSES_EXPORT(void) +_nc_panic_mode(char ch) +{ + for (;;) { + int c = next_char(); + if (c == ch) + return; + if (c == EOF) + return; + } +} + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_comp_scan_leaks(void) +{ + if (pushname != 0) { + FreeAndNull(pushname); + } + if (tok_buf != 0) { + FreeAndNull(tok_buf); + } +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/db_iterator.c b/contrib/ncurses/ncurses/tinfo/db_iterator.c new file mode 100644 index 00000000..d8eb3ddb --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/db_iterator.c @@ -0,0 +1,460 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2006-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * Iterators for terminal databases. + */ + +#include + +#include +#include + +#if USE_HASHED_DB +#include +#endif + +MODULE_ID("$Id: db_iterator.c,v 1.51 2024/07/27 19:22:23 tom Exp $") + +#define HaveTicDirectory _nc_globals.have_tic_directory +#define KeepTicDirectory _nc_globals.keep_tic_directory +#define TicDirectory _nc_globals.tic_directory +#define my_blob _nc_globals.dbd_blob +#define my_list _nc_globals.dbd_list +#define my_size _nc_globals.dbd_size +#define my_time _nc_globals.dbd_time +#define my_vars _nc_globals.dbd_vars + +static void +add_to_blob(const char *text, size_t limit) +{ + (void) limit; + + if (*text != '\0') { + char *last = my_blob + strlen(my_blob); + if (last != my_blob) + *last++ = NCURSES_PATHSEP; + _nc_STRCPY(last, text, limit); + } +} + +static bool +check_existence(const char *name, struct stat *sb) +{ + bool result = FALSE; + + if (quick_prefix(name)) { + result = TRUE; + } else if (stat(name, sb) == 0 + && (S_ISDIR(sb->st_mode) + || (S_ISREG(sb->st_mode) && sb->st_size))) { + result = TRUE; + } +#if USE_HASHED_DB + else if (strlen(name) < PATH_MAX - sizeof(DBM_SUFFIX)) { + char temp[PATH_MAX]; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%s%s", name, DBM_SUFFIX); + if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode) && sb->st_size) { + result = TRUE; + } + } +#endif + return result; +} + +/* + * Trim newlines (and backslashes preceding those) and tab characters to + * help simplify scripting of the quick-dump feature. Leave spaces and + * other backslashes alone. + */ +static void +trim_formatting(char *source) +{ + char *target = source; + char ch; + + while ((ch = *source++) != '\0') { + if (ch == '\\' && *source == '\n') + continue; + if (ch == '\n' || ch == '\t') + continue; + *target++ = ch; + } + *target = '\0'; +} + +/* + * Store the latest value of an environment variable in my_vars[] so we can + * detect if one changes, invalidating the cached search-list. + */ +static bool +update_getenv(const char *name, DBDIRS which) +{ + bool result = FALSE; + + if (which < dbdLAST) { + char *value; + const char *cached_value = my_vars[which].value; + bool same_value; + + if ((value = getenv(name)) != 0) { + value = strdup(value); + } + same_value = ((value == 0 && cached_value == 0) || + (value != 0 && + cached_value != 0 && + strcmp(value, cached_value) == 0)); + + /* Set variable name to enable checks in cache_expired(). */ + my_vars[which].name = name; + + if (!same_value) { + FreeIfNeeded(my_vars[which].value); + my_vars[which].value = value; + result = TRUE; + } else { + free(value); + } + } + return result; +} + +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP +static char * +cache_getenv(const char *name, DBDIRS which) +{ + char *result = 0; + + (void) update_getenv(name, which); + if (which < dbdLAST) { + result = my_vars[which].value; + } + return result; +} +#endif + +/* + * The cache expires if at least a second has passed since the initial lookup, + * or if one of the environment variables changed. + * + * Only a few applications use multiple lookups of terminal entries, seems that + * aside from bulk I/O such as tic and toe, that leaves interactive programs + * which should not be modifying the terminal databases in a way that would + * invalidate the search-list. + * + * The "1-second" is to allow for user-directed changes outside the program. + */ +static bool +cache_expired(void) +{ + bool result = FALSE; + time_t now = time((time_t *) 0); + + if (now > my_time) { + result = TRUE; + } else { + DBDIRS n; + for (n = (DBDIRS) 0; n < dbdLAST; ++n) { + if (my_vars[n].name != 0 + && update_getenv(my_vars[n].name, n)) { + result = TRUE; + break; + } + } + } + return result; +} + +static void +free_cache(void) +{ + FreeAndNull(my_blob); + FreeAndNull(my_list); +} + +static void +update_tic_dir(const char *update) +{ + free((char *) TicDirectory); + TicDirectory = update; +} + +/* + * Record the "official" location of the terminfo directory, according to + * the place where we're writing to, or the normal default, if not. + */ +NCURSES_EXPORT(const char *) +_nc_tic_dir(const char *path) +{ + T(("_nc_tic_dir %s", NonNull(path))); + if (!KeepTicDirectory) { + if (path != NULL) { + if (path != TicDirectory) + update_tic_dir(strdup(path)); + HaveTicDirectory = TRUE; + } else if (HaveTicDirectory == 0) { + if (use_terminfo_vars()) { + const char *envp; + if ((envp = getenv("TERMINFO")) != 0) + return _nc_tic_dir(envp); + } + } + } + return TicDirectory ? TicDirectory : TERMINFO; +} + +/* + * Special fix to prevent the terminfo directory from being moved after tic + * has chdir'd to it. If we let it be changed, then if $TERMINFO has a + * relative path, we'll lose track of the actual directory. + */ +NCURSES_EXPORT(void) +_nc_keep_tic_dir(const char *path) +{ + _nc_tic_dir(path); + KeepTicDirectory = TRUE; +} + +/* + * Cleanup. + */ +NCURSES_EXPORT(void) +_nc_last_db(void) +{ + if (my_blob != 0 && cache_expired()) { + free_cache(); + } +} + +/* + * This is a simple iterator which allows the caller to step through the + * possible locations for a terminfo directory. ncurses uses this to find + * terminfo files to read. + */ +NCURSES_EXPORT(const char *) +_nc_next_db(DBDIRS * state, int *offset) +{ + const char *result; + + (void) offset; + if ((int) *state < my_size + && my_list != 0 + && my_list[*state] != 0) { + result = my_list[*state]; + (*state)++; + } else { + result = 0; + } + if (result != 0) { + T(("_nc_next_db %d %s", *state, result)); + } + return result; +} + +NCURSES_EXPORT(void) +_nc_first_db(DBDIRS * state, int *offset) +{ + bool cache_has_expired = FALSE; + *state = dbdTIC; + *offset = 0; + + T((T_CALLED("_nc_first_db"))); + + /* build a blob containing all of the strings we will use for a lookup + * table. + */ + if (my_blob == 0 || (cache_has_expired = cache_expired())) { + size_t blobsize = 0; + const char *values[dbdLAST]; + struct stat *my_stat; + int j; + + if (cache_has_expired) + free_cache(); + + for (j = 0; j < dbdLAST; ++j) + values[j] = 0; + + /* + * This is the first item in the list, and is used only when tic is + * writing to the database, as a performance improvement. + */ + values[dbdTIC] = TicDirectory; + +#if NCURSES_USE_DATABASE +#ifdef TERMINFO_DIRS + values[dbdCfgList] = TERMINFO_DIRS; +#endif +#ifdef TERMINFO + values[dbdCfgOnce] = TERMINFO; +#endif +#endif + +#if NCURSES_USE_TERMCAP + values[dbdCfgList2] = TERMPATH; +#endif + + if (use_terminfo_vars()) { +#if NCURSES_USE_DATABASE + values[dbdEnvOnce] = cache_getenv("TERMINFO", dbdEnvOnce); + values[dbdHome] = _nc_home_terminfo(); + (void) cache_getenv("HOME", dbdHome); + values[dbdEnvList] = cache_getenv("TERMINFO_DIRS", dbdEnvList); + +#endif +#if NCURSES_USE_TERMCAP + values[dbdEnvOnce2] = cache_getenv("TERMCAP", dbdEnvOnce2); + /* only use $TERMCAP if it is an absolute path */ + if (values[dbdEnvOnce2] != 0 + && *values[dbdEnvOnce2] != '/') { + values[dbdEnvOnce2] = 0; + } + values[dbdEnvList2] = cache_getenv("TERMPATH", dbdEnvList2); +#endif /* NCURSES_USE_TERMCAP */ + } + + for (j = 0; j < dbdLAST; ++j) { + if (values[j] == 0) + values[j] = ""; + blobsize += 2 + strlen(values[j]); + } + + my_blob = malloc(blobsize); + if (my_blob != 0) { + *my_blob = '\0'; + for (j = 0; j < dbdLAST; ++j) { + add_to_blob(values[j], blobsize); + } + + /* Now, build an array which will be pointers to the distinct + * strings in the blob. + */ + blobsize = 2; + for (j = 0; my_blob[j] != '\0'; ++j) { + if (my_blob[j] == NCURSES_PATHSEP) + ++blobsize; + } + my_list = typeCalloc(char *, blobsize); + my_stat = typeCalloc(struct stat, blobsize); + if (my_list != 0 && my_stat != 0) { + int k = 0; + my_list[k++] = my_blob; + for (j = 0; my_blob[j] != '\0'; ++j) { + if (my_blob[j] == NCURSES_PATHSEP + && ((&my_blob[j] - my_list[k - 1]) != 3 + || !quick_prefix(my_list[k - 1]))) { + my_blob[j] = '\0'; + my_list[k++] = &my_blob[j + 1]; + } + } + + /* + * Eliminate duplicates from the list. + */ + for (j = 0; my_list[j] != 0; ++j) { +#ifdef TERMINFO + if (*my_list[j] == '\0') { + char *my_copy = strdup(TERMINFO); + if (my_copy != 0) + my_list[j] = my_copy; + } +#endif + trim_formatting(my_list[j]); + for (k = 0; k < j; ++k) { + if (!strcmp(my_list[j], my_list[k])) { + T(("duplicate %s", my_list[j])); + k = j - 1; + while ((my_list[j] = my_list[j + 1]) != 0) { + ++j; + } + j = k; + break; + } + } + } + + /* + * Eliminate non-existent databases, and those that happen to + * be symlinked to another location. + */ + for (j = 0; my_list[j] != 0; ++j) { + bool found = check_existence(my_list[j], &my_stat[j]); +#if HAVE_LINK + if (found) { + for (k = 0; k < j; ++k) { + if (my_stat[j].st_dev == my_stat[k].st_dev + && my_stat[j].st_ino == my_stat[k].st_ino) { + found = FALSE; + break; + } + } + } +#endif + if (!found) { + T(("not found %s", my_list[j])); + k = j; + while ((my_list[k] = my_list[k + 1]) != 0) { + ++k; + } + --j; + } + } + my_size = j; + my_time = time((time_t *) 0); + } else { + FreeAndNull(my_blob); + } + free(my_stat); + } + } + returnVoid; +} + +#if NO_LEAKS +void +_nc_db_iterator_leaks(void) +{ + DBDIRS which; + + if (my_blob != 0) + FreeAndNull(my_blob); + if (my_list != 0) + FreeAndNull(my_list); + for (which = 0; (int) which < dbdLAST; ++which) { + my_vars[which].name = 0; + FreeIfNeeded(my_vars[which].value); + my_vars[which].value = 0; + } + update_tic_dir(NULL); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/doalloc.c b/contrib/ncurses/ncurses/tinfo/doalloc.c new file mode 100644 index 00000000..e3b1a2e9 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/doalloc.c @@ -0,0 +1,62 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2002,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998 * + ****************************************************************************/ + +/* + * Wrapper for malloc/realloc. Standard implementations allow realloc with + * a null pointer, but older libraries may not (e.g., SunOS). + * + * Also if realloc fails, we discard the old memory to avoid leaks. + */ + +#include + +MODULE_ID("$Id: doalloc.c,v 1.14 2021/04/24 23:43:39 tom Exp $") + +void * +_nc_doalloc(void *oldp, size_t amount) +{ + void *newp; + + if (oldp != NULL) { + if (amount == 0) { + free(oldp); + newp = NULL; + } else if ((newp = realloc(oldp, amount)) == 0) { + free(oldp); + errno = ENOMEM; /* just in case 'free' reset */ + } + } else { + newp = malloc(amount); + } + return newp; +} diff --git a/contrib/ncurses/ncurses/tinfo/entries.c b/contrib/ncurses/ncurses/tinfo/entries.c new file mode 100644 index 00000000..33c7e40a --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/entries.c @@ -0,0 +1,194 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2006-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + * and: Juergen Pfeifer * + ****************************************************************************/ + +#include + +#include + +#include + +MODULE_ID("$Id: entries.c,v 1.37 2024/10/19 21:23:31 tom Exp $") + +/**************************************************************************** + * + * Entry queue handling + * + ****************************************************************************/ +/* + * The entry list is a doubly linked list with NULLs terminating the lists: + * + * --------- --------- --------- + * | | | | | | offset + * |-------| |-------| |-------| + * | ----+-->| ----+-->| NULL | next + * |-------| |-------| |-------| + * | NULL |<--+---- |<--+---- | last + * --------- --------- --------- + * ^ ^ + * | | + * | | + * _nc_head _nc_tail + */ + +NCURSES_EXPORT_VAR(ENTRY *) _nc_head = 0; +NCURSES_EXPORT_VAR(ENTRY *) _nc_tail = 0; + +static ENTRY * +_nc_delink_entry(ENTRY * headp, const TERMTYPE2 *const tterm) +/* delink the allocated storage for the given list entry */ +{ + ENTRY *ep, *last; + + for (last = 0, ep = headp; ep != 0; last = ep, ep = ep->next) { + if (&(ep->tterm) == tterm) { + if (last != 0) { + last->next = ep->next; + } + if (ep->next != 0) { + ep->next->last = last; + } + if (ep == _nc_head) { + _nc_head = ep->next; + } + if (ep == _nc_tail) { + _nc_tail = last; + } + break; + } + } + return ep; +} + +NCURSES_EXPORT(void) +_nc_free_entry(ENTRY * headp, const TERMTYPE2 *tterm) +/* free the allocated storage consumed by the given list entry */ +{ + ENTRY *ep; + + if ((ep = _nc_delink_entry(headp, tterm)) != 0) { + free(ep); + } +} + +NCURSES_EXPORT(void) +_nc_free_entries(ENTRY * headp) +/* free the allocated storage consumed by list entries */ +{ + (void) headp; /* unused - _nc_head is altered here! */ + + while (_nc_head != 0) { + _nc_free_termtype2(&(_nc_head->tterm)); + } +} + +NCURSES_EXPORT(void) +_nc_leaks_tinfo(void) +{ +#if NO_LEAKS + char *s; +#endif + + T((T_CALLED("_nc_leaks_tinfo()"))); +#if NO_LEAKS + _nc_globals.leak_checking = TRUE; + _nc_free_tparm(cur_term); + _nc_tgetent_leaks(); + +#ifdef USE_PTHREADS + /* + * Discard any prescreen data which is not used for the current screen. + */ + _nc_lock_global(screen); + { + PRESCREEN_LIST *p; + pthread_t id = GetThreadID(); + for (p = _nc_prescreen.allocated; p != 0; p = p->next) { + if (p->id == id && p->sp != CURRENT_SCREEN) { + FreeAndNull(p->sp); + } + } + } + _nc_unlock_global(screen); +#endif + if (TerminalOf(CURRENT_SCREEN) != 0) { + del_curterm(TerminalOf(CURRENT_SCREEN)); + } + _nc_forget_prescr(); + + _nc_comp_captab_leaks(); + _nc_comp_userdefs_leaks(); + _nc_free_entries(_nc_head); + _nc_get_type(0); + _nc_first_name(0); + _nc_db_iterator_leaks(); + _nc_keyname_leaks(); +#if BROKEN_LINKER || USE_REENTRANT + _nc_names_leaks(); + _nc_codes_leaks(); + FreeIfNeeded(_nc_prescreen.real_acs_map); +#endif + _nc_comp_error_leaks(); + + if ((s = _nc_home_terminfo()) != 0) + free(s); + +#ifdef TRACE + T((T_RETURN(""))); + curses_trace(0); + _nc_trace_buf(-1, (size_t) 0); +#endif + +#endif /* NO_LEAKS */ + returnVoid; +} + +#if NO_LEAKS +NCURSES_EXPORT(void) +_nc_free_tinfo(int code) +{ + T((T_CALLED("_nc_free_tinfo(%d)"), code)); + _nc_leaks_tinfo(); + exit(code); +} +#endif + +NCURSES_EXPORT(void) +exit_terminfo(int code) +{ + T((T_CALLED("exit_terminfo(%d)"), code)); +#if NO_LEAKS + _nc_leaks_tinfo(); +#endif + exit(code); +} diff --git a/contrib/ncurses/ncurses/tinfo/free_ttype.c b/contrib/ncurses/ncurses/tinfo/free_ttype.c new file mode 100644 index 00000000..7935152a --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/free_ttype.c @@ -0,0 +1,105 @@ +/**************************************************************************** + * Copyright 2020-2022,2023 Thomas E. Dickey * + * Copyright 1999-2011,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999-on * + ****************************************************************************/ + +/* + * free_ttype.c -- allocation functions for TERMTYPE + * + * _nc_free_termtype() + * use_extended_names() + * + */ + +#include + +#include + +MODULE_ID("$Id: free_ttype.c,v 1.22 2023/04/22 15:12:57 tom Exp $") + +static void +really_free_termtype(TERMTYPE2 *ptr, bool freeStrings) +{ + T(("really_free_termtype(%s) %d", ptr->term_names, freeStrings)); + + if (freeStrings) { + FreeIfNeeded(ptr->str_table); + } + FreeIfNeeded(ptr->Booleans); + FreeIfNeeded(ptr->Numbers); + FreeIfNeeded(ptr->Strings); +#if NCURSES_XNAMES + if (freeStrings) { + FreeIfNeeded(ptr->ext_str_table); + } + FreeIfNeeded(ptr->ext_Names); +#endif + memset(ptr, 0, sizeof(TERMTYPE)); + _nc_free_entry(_nc_head, ptr); +} + +NCURSES_EXPORT(void) +_nc_free_termtype(TERMTYPE *ptr) +{ + really_free_termtype((TERMTYPE2 *) ptr, !NCURSES_EXT_NUMBERS); +} + +/* + * These similar entrypoints are not used outside of ncurses. + */ +NCURSES_EXPORT(void) +_nc_free_termtype1(TERMTYPE *ptr) +{ + really_free_termtype((TERMTYPE2 *) ptr, TRUE); +} + +#if NCURSES_EXT_NUMBERS +NCURSES_EXPORT(void) +_nc_free_termtype2(TERMTYPE2 *ptr) +{ + really_free_termtype(ptr, TRUE); +} +#endif + +#if NCURSES_XNAMES +NCURSES_EXPORT_VAR(bool) _nc_user_definable = TRUE; + +NCURSES_EXPORT(int) +use_extended_names(bool flag) +{ + int oldflag = _nc_user_definable; + + START_TRACE(); + T((T_CALLED("use_extended_names(%d)"), flag)); + _nc_user_definable = flag; + returnBool(oldflag); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/getenv_num.c b/contrib/ncurses/ncurses/tinfo/getenv_num.c new file mode 100644 index 00000000..82c460f0 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/getenv_num.c @@ -0,0 +1,76 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * Copyright 1998-2012,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998 * + ****************************************************************************/ + +/* + * getenv_num.c -- obtain a number from the environment + */ + +#include + +MODULE_ID("$Id: getenv_num.c,v 1.9 2024/07/27 19:23:59 tom Exp $") + +NCURSES_EXPORT(int) +_nc_getenv_num(const char *name) +{ + char *dst = 0; + const char *src = getenv(name); + long value; + + if ((src == 0) + || (value = strtol(src, &dst, 0)) < 0 + || (dst == src) + || (*dst != '\0') + || (int) value < value) + value = -1; + + return (int) value; +} + +NCURSES_EXPORT(void) +_nc_setenv_num(const char *name, int value) +{ + if (name != 0 && value >= 0) { + char buffer[128]; +#if HAVE_SETENV + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%d", value); + setenv(name, buffer, 1); +#elif HAVE_PUTENV + char *s; + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s=%d", name, value); + if ((s = strdup(buffer)) != 0) + putenv(s); +#else +#error expected setenv/putenv functions +#endif + } +} diff --git a/contrib/ncurses/ncurses/tinfo/hashed_db.c b/contrib/ncurses/ncurses/tinfo/hashed_db.c new file mode 100644 index 00000000..b78d98f8 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/hashed_db.c @@ -0,0 +1,342 @@ +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 2006-2011,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2006-on * + ****************************************************************************/ + +#include +#include +#include + +#if USE_HASHED_DB + +MODULE_ID("$Id: hashed_db.c,v 1.19 2020/02/02 23:34:34 tom Exp $") + +#if HASHED_DB_API >= 2 +static DBC *cursor; +#endif + +typedef struct _myconn { + struct _myconn *next; + DB *db; + char *path; + bool modify; +} MYCONN; + +static MYCONN *connections; + +static void +cleanup(void) +{ + while (connections != 0) { + _nc_db_close(connections->db); + } +} + +static DB * +find_connection(const char *path, bool modify) +{ + DB *result = 0; + MYCONN *p; + + for (p = connections; p != 0; p = p->next) { + if (!strcmp(p->path, path) && p->modify == modify) { + result = p->db; + break; + } + } + + return result; +} + +static void +drop_connection(DB * db) +{ + MYCONN *p, *q; + + for (p = connections, q = 0; p != 0; q = p, p = p->next) { + if (p->db == db) { + if (q != 0) + q->next = p->next; + else + connections = p->next; + free(p->path); + free(p); + break; + } + } +} + +static void +make_connection(DB * db, const char *path, bool modify) +{ + MYCONN *p = typeCalloc(MYCONN, 1); + + if (p != 0) { + p->db = db; + p->path = strdup(path); + p->modify = modify; + if (p->path != 0) { + p->next = connections; + connections = p; + } else { + free(p); + } + } +} + +/* + * Open the database. + */ +NCURSES_EXPORT(DB *) +_nc_db_open(const char *path, bool modify) +{ + DB *result = 0; + int code; + + if (connections == 0) + atexit(cleanup); + + if ((result = find_connection(path, modify)) == 0) { + +#if HASHED_DB_API >= 4 + db_create(&result, NULL, 0); + if ((code = result->open(result, + NULL, + path, + NULL, + DB_HASH, + modify ? DB_CREATE : DB_RDONLY, + 0644)) != 0) { + result = 0; + } +#elif HASHED_DB_API >= 3 + db_create(&result, NULL, 0); + if ((code = result->open(result, + path, + NULL, + DB_HASH, + modify ? DB_CREATE : DB_RDONLY, + 0644)) != 0) { + result = 0; + } +#elif HASHED_DB_API >= 2 + if ((code = db_open(path, + DB_HASH, + modify ? DB_CREATE : DB_RDONLY, + 0644, + (DB_ENV *) 0, + (DB_INFO *) 0, + &result)) != 0) { + result = 0; + } +#else + if ((result = dbopen(path, + modify ? (O_CREAT | O_RDWR) : O_RDONLY, + 0644, + DB_HASH, + NULL)) == 0) { + code = errno; + } +#endif + if (result != 0) { + make_connection(result, path, modify); + T(("opened %s", path)); + } else { + T(("cannot open %s: %s", path, strerror(code))); + } + } + return result; +} + +/* + * Close the database. Do not attempt to use the 'db' handle after this call. + */ +NCURSES_EXPORT(int) +_nc_db_close(DB * db) +{ + int result; + + drop_connection(db); +#if HASHED_DB_API >= 2 + result = db->close(db, 0); +#else + result = db->close(db); +#endif + return result; +} + +/* + * Write a record to the database. + * + * Returns 0 on success. + * + * FIXME: the FreeBSD cap_mkdb program assumes the database could have + * duplicates. There appears to be no good reason for that (review/fix). + */ +NCURSES_EXPORT(int) +_nc_db_put(DB * db, DBT * key, DBT * data) +{ + int result; +#if HASHED_DB_API >= 2 + /* remove any pre-existing value, since we do not want duplicates */ + (void) db->del(db, NULL, key, 0); + result = db->put(db, NULL, key, data, DB_NOOVERWRITE); +#else + result = db->put(db, key, data, R_NOOVERWRITE); +#endif + return result; +} + +/* + * Read a record from the database. + * + * Returns 0 on success. + */ +NCURSES_EXPORT(int) +_nc_db_get(DB * db, DBT * key, DBT * data) +{ + int result; + + memset(data, 0, sizeof(*data)); +#if HASHED_DB_API >= 2 + result = db->get(db, NULL, key, data, 0); +#else + result = db->get(db, key, data, 0); +#endif + return result; +} + +/* + * Read the first record from the database, ignoring order. + * + * Returns 0 on success. + */ +NCURSES_EXPORT(int) +_nc_db_first(DB * db, DBT * key, DBT * data) +{ + int result; + + memset(key, 0, sizeof(*key)); + memset(data, 0, sizeof(*data)); +#if HASHED_DB_API >= 2 + if ((result = db->cursor(db, NULL, &cursor, 0)) == 0) { + result = cursor->c_get(cursor, key, data, DB_FIRST); + } +#else + result = db->seq(db, key, data, 0); +#endif + return result; +} + +/* + * Read the next record from the database, ignoring order. + * + * Returns 0 on success. + */ +NCURSES_EXPORT(int) +_nc_db_next(DB * db, DBT * key, DBT * data) +{ + int result; + +#if HASHED_DB_API >= 2 + (void) db; + if (cursor != 0) { + result = cursor->c_get(cursor, key, data, DB_NEXT); + } else { + result = -1; + } +#else + result = db->seq(db, key, data, R_NEXT); +#endif + return result; +} + +/* + * Check if a record is a terminfo index record. Index records are those that + * contain only an alias pointing to a list of aliases. + */ +NCURSES_EXPORT(bool) +_nc_db_have_index(DBT * key, DBT * data, char **buffer, int *size) +{ + bool result = FALSE; + int used = (int) data->size - 1; + char *have = (char *) data->data; + + (void) key; + if (*have++ == 2) { + result = TRUE; + } + /* + * Update params in any case for consistency with _nc_db_have_data(). + */ + *buffer = have; + *size = used; + return result; +} + +/* + * Check if a record is the terminfo data record. Ignore index records, e.g., + * those that contain only an alias pointing to a list of aliases. + */ +NCURSES_EXPORT(bool) +_nc_db_have_data(DBT * key, DBT * data, char **buffer, int *size) +{ + bool result = FALSE; + int used = (int) data->size - 1; + char *have = (char *) data->data; + + if (*have++ == 0) { + if (data->size > key->size + && IS_TIC_MAGIC(have)) { + result = TRUE; + } + } + /* + * Update params in any case to make it simple to follow a index record + * to the data record. + */ + *buffer = have; + *size = used; + return result; +} + +#else + +extern +NCURSES_EXPORT(void) +_nc_hashed_db(void); + +NCURSES_EXPORT(void) +_nc_hashed_db(void) +{ +} + +#endif /* USE_HASHED_DB */ diff --git a/contrib/ncurses/ncurses/tinfo/home_terminfo.c b/contrib/ncurses/ncurses/tinfo/home_terminfo.c new file mode 100644 index 00000000..3c381b9f --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/home_terminfo.c @@ -0,0 +1,67 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * home_terminfo.c -- return the $HOME/.terminfo string, expanded + */ + +#include +#include + +MODULE_ID("$Id: home_terminfo.c,v 1.18 2024/07/27 19:23:21 tom Exp $") + +/* ncurses extension...fall back on user's private directory */ + +#define MyBuffer _nc_globals.home_terminfo + +NCURSES_EXPORT(char *) +_nc_home_terminfo(void) +{ + char *result = 0; +#if USE_HOME_TERMINFO + if (use_terminfo_vars()) { + + if (MyBuffer == 0) { + const char *home; + + if ((home = getenv("HOME")) != 0) { + size_t want = (strlen(home) + sizeof(PRIVATE_INFO)); + TYPE_MALLOC(char, want, MyBuffer); + _nc_SPRINTF(MyBuffer, _nc_SLIMIT(want) PRIVATE_INFO, home); + } + } + result = MyBuffer; + } +#endif + return result; +} diff --git a/contrib/ncurses/ncurses/tinfo/init_keytry.c b/contrib/ncurses/ncurses/tinfo/init_keytry.c new file mode 100644 index 00000000..5f4c5499 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/init_keytry.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1999-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +#include +#include /* struct tinfo_fkeys */ + +MODULE_ID("$Id: init_keytry.c,v 1.21 2024/07/27 19:23:59 tom Exp $") + +/* +** _nc_init_keytry() +** +** Construct the try for the current terminal's keypad keys. +** +*/ + +/* + * Internal entrypoints use SCREEN* parameter to obtain capabilities rather + * than cur_term. + */ +#undef CUR +#define CUR SP_TERMTYPE + +#if BROKEN_LINKER +#undef _nc_tinfo_fkeys +#endif + +/* LINT_PREPRO +#if 0*/ +#include +/* LINT_PREPRO +#endif*/ + +#if BROKEN_LINKER +const struct tinfo_fkeys * +_nc_tinfo_fkeysf(void) +{ + return _nc_tinfo_fkeys; +} +#endif + +NCURSES_EXPORT(void) +_nc_init_keytry(SCREEN *sp) +{ + T(("_nc_init_keytry(%p)", (void *) sp)); + + /* The sp->_keytry value is initialized in newterm(), where the sp + * structure is created, because we can not tell where keypad() or + * mouse_activate() (which will call keyok()) are first called. + */ + + if (sp != 0) { + unsigned n; + + for (n = 0; _nc_tinfo_fkeys[n].code; n++) { + if (_nc_tinfo_fkeys[n].offset < STRCOUNT) { + (void) _nc_add_to_try(&(sp->_keytry), + CUR Strings[_nc_tinfo_fkeys[n].offset], + _nc_tinfo_fkeys[n].code); + } + } +#if NCURSES_XNAMES + /* + * Add any of the extended strings to the tries if their name begins + * with 'k', i.e., they follow the convention of other terminfo key + * names. + */ + { + TERMTYPE *tp = &(sp->_term->type); + for (n = STRCOUNT; n < NUM_STRINGS(tp); ++n) { + const char *name = ExtStrname(tp, (int) n, strnames); + const char *value = tp->Strings[n]; + if (name != 0 + && *name == 'k' + && VALID_STRING(value) + && NCURSES_SP_NAME(key_defined) (NCURSES_SP_ARGx + value) == 0) { + (void) _nc_add_to_try(&(sp->_keytry), + value, + n - STRCOUNT + KEY_MAX); + } + } + } +#endif +#ifdef TRACE + _nc_trace_tries(sp->_keytry); +#endif + } +} diff --git a/contrib/ncurses/ncurses/tinfo/lib_acs.c b/contrib/ncurses/ncurses/tinfo/lib_acs.c new file mode 100644 index 00000000..4ede53f6 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_acs.c @@ -0,0 +1,326 @@ +/**************************************************************************** + * Copyright 2018-2019,2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2008 * + ****************************************************************************/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_acs.c,v 1.50 2020/02/02 23:34:34 tom Exp $") + +#if BROKEN_LINKER || USE_REENTRANT +#define MyBuffer _nc_prescreen.real_acs_map +NCURSES_EXPORT(chtype *) +NCURSES_PUBLIC_VAR(acs_map) (void) +{ + if (MyBuffer == 0) + MyBuffer = typeCalloc(chtype, ACS_LEN); + return MyBuffer; +} +#undef MyBuffer +#else +NCURSES_EXPORT_VAR (chtype) acs_map[ACS_LEN] = +{ + 0 +}; +#endif + +#ifdef USE_TERM_DRIVER +NCURSES_EXPORT(chtype) +NCURSES_SP_NAME(_nc_acs_char) (NCURSES_SP_DCLx int c) +{ + chtype *map; + if (c < 0 || c >= ACS_LEN) + return (chtype) 0; + map = (SP_PARM != 0) ? SP_PARM->_acs_map : +#if BROKEN_LINKER || USE_REENTRANT + _nc_prescreen.real_acs_map +#else + acs_map +#endif + ; + return map[c]; +} +#endif /* USE_TERM_DRIVER */ + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_DCL0) +{ + chtype *fake_map = acs_map; + chtype *real_map = SP_PARM != 0 ? SP_PARM->_acs_map : fake_map; + int j; + + T(("initializing ACS map")); + + /* + * If we're using this from curses (rather than terminfo), we are storing + * the mapping information in the SCREEN struct so we can decide how to + * render it. + */ + if (real_map != fake_map) { + for (j = 1; j < ACS_LEN; ++j) { + real_map[j] = 0; + fake_map[j] = A_ALTCHARSET | (chtype) j; + if (SP_PARM) + SP_PARM->_screen_acs_map[j] = FALSE; + } + } else { + for (j = 1; j < ACS_LEN; ++j) { + real_map[j] = 0; + } + } + + /* + * Initializations for a UNIX-like multi-terminal environment. Use + * ASCII chars and count on the terminfo description to do better. + */ + real_map['l'] = '+'; /* should be upper left corner */ + real_map['m'] = '+'; /* should be lower left corner */ + real_map['k'] = '+'; /* should be upper right corner */ + real_map['j'] = '+'; /* should be lower right corner */ + real_map['u'] = '+'; /* should be tee pointing left */ + real_map['t'] = '+'; /* should be tee pointing right */ + real_map['v'] = '+'; /* should be tee pointing up */ + real_map['w'] = '+'; /* should be tee pointing down */ + real_map['q'] = '-'; /* should be horizontal line */ + real_map['x'] = '|'; /* should be vertical line */ + real_map['n'] = '+'; /* should be large plus or crossover */ + real_map['o'] = '~'; /* should be scan line 1 */ + real_map['s'] = '_'; /* should be scan line 9 */ + real_map['`'] = '+'; /* should be diamond */ + real_map['a'] = ':'; /* should be checker board (stipple) */ + real_map['f'] = '\''; /* should be degree symbol */ + real_map['g'] = '#'; /* should be plus/minus */ + real_map['~'] = 'o'; /* should be bullet */ + real_map[','] = '<'; /* should be arrow pointing left */ + real_map['+'] = '>'; /* should be arrow pointing right */ + real_map['.'] = 'v'; /* should be arrow pointing down */ + real_map['-'] = '^'; /* should be arrow pointing up */ + real_map['h'] = '#'; /* should be board of squares */ + real_map['i'] = '#'; /* should be lantern symbol */ + real_map['0'] = '#'; /* should be solid square block */ + /* these defaults were invented for ncurses */ + real_map['p'] = '-'; /* should be scan line 3 */ + real_map['r'] = '-'; /* should be scan line 7 */ + real_map['y'] = '<'; /* should be less-than-or-equal-to */ + real_map['z'] = '>'; /* should be greater-than-or-equal-to */ + real_map['{'] = '*'; /* should be greek pi */ + real_map['|'] = '!'; /* should be not-equal */ + real_map['}'] = 'f'; /* should be pound-sterling symbol */ + /* thick-line-drawing */ + real_map['L'] = '+'; /* upper left corner */ + real_map['M'] = '+'; /* lower left corner */ + real_map['K'] = '+'; /* upper right corner */ + real_map['J'] = '+'; /* lower right corner */ + real_map['T'] = '+'; /* tee pointing left */ + real_map['U'] = '+'; /* tee pointing right */ + real_map['V'] = '+'; /* tee pointing up */ + real_map['W'] = '+'; /* tee pointing down */ + real_map['Q'] = '-'; /* horizontal line */ + real_map['X'] = '|'; /* vertical line */ + real_map['N'] = '+'; /* large plus or crossover */ + /* double-line-drawing */ + real_map['C'] = '+'; /* upper left corner */ + real_map['D'] = '+'; /* lower left corner */ + real_map['B'] = '+'; /* upper right corner */ + real_map['A'] = '+'; /* lower right corner */ + real_map['G'] = '+'; /* tee pointing left */ + real_map['F'] = '+'; /* tee pointing right */ + real_map['H'] = '+'; /* tee pointing up */ + real_map['I'] = '+'; /* tee pointing down */ + real_map['R'] = '-'; /* horizontal line */ + real_map['Y'] = '|'; /* vertical line */ + real_map['E'] = '+'; /* large plus or crossover */ + +#ifdef USE_TERM_DRIVER + CallDriver_2(SP_PARM, td_initacs, real_map, fake_map); +#else + if (ena_acs != NULL) { + NCURSES_PUTP2("ena_acs", ena_acs); + } +#if NCURSES_EXT_FUNCS && defined(enter_pc_charset_mode) && defined(exit_pc_charset_mode) + /* + * Linux console "supports" the "PC ROM" character set by the coincidence + * that smpch/rmpch and smacs/rmacs have the same values. ncurses has + * no codepage support (see SCO Merge for an example). Outside of the + * values defined in acsc, there are no definitions for the "PC ROM" + * character set (assumed by some applications to be codepage 437), but we + * allow those applications to use those codepoints. + * + * test/blue.c uses this feature. + */ +#define PCH_KLUDGE(a,b) (a != 0 && b != 0 && !strcmp(a,b)) + if (PCH_KLUDGE(enter_pc_charset_mode, enter_alt_charset_mode) && + PCH_KLUDGE(exit_pc_charset_mode, exit_alt_charset_mode)) { + size_t i; + for (i = 1; i < ACS_LEN; ++i) { + if (real_map[i] == 0) { + real_map[i] = (chtype) i; + if (real_map != fake_map) { + if (SP != 0) + SP->_screen_acs_map[i] = TRUE; + } + } + } + } +#endif + + if (acs_chars != NULL) { + size_t i = 0; + size_t length = strlen(acs_chars); + + while (i + 1 < length) { + if (acs_chars[i] != 0 && UChar(acs_chars[i]) < ACS_LEN) { + real_map[UChar(acs_chars[i])] = UChar(acs_chars[i + 1]) | A_ALTCHARSET; + T(("#%d real_map[%s] = %s", + (int) i, + _tracechar(UChar(acs_chars[i])), + _tracechtype(real_map[UChar(acs_chars[i])]))); + if (SP != 0) { + SP->_screen_acs_map[UChar(acs_chars[i])] = TRUE; + } + } + i += 2; + } + } +#ifdef TRACE + /* Show the equivalent mapping, noting if it does not match the + * given attribute, whether by re-ordering or duplication. + */ + if (USE_TRACEF(TRACE_CALLS)) { + size_t n, m; + char show[ACS_LEN * 2 + 1]; + for (n = 1, m = 0; n < ACS_LEN; n++) { + if (real_map[n] != 0) { + show[m++] = (char) n; + show[m++] = (char) ChCharOf(real_map[n]); + } + } + show[m] = 0; + if (acs_chars == NULL || strcmp(acs_chars, show)) + _tracef("%s acs_chars %s", + (acs_chars == NULL) ? "NULL" : "READ", + _nc_visbuf(acs_chars)); + _tracef("%s acs_chars %s", + (acs_chars == NULL) + ? "NULL" + : (strcmp(acs_chars, show) + ? "DIFF" + : "SAME"), + _nc_visbuf(show)); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ +#endif +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_init_acs(void) +{ + NCURSES_SP_NAME(_nc_init_acs) (CURRENT_SCREEN); +} +#endif + +#if !NCURSES_WCWIDTH_GRAPHICS +NCURSES_EXPORT(int) +_nc_wacs_width(unsigned ch) +{ + int result; + switch (ch) { + case 0x00a3: /* FALLTHRU - ncurses pound-sterling symbol */ + case 0x00b0: /* FALLTHRU - VT100 degree symbol */ + case 0x00b1: /* FALLTHRU - VT100 plus/minus */ + case 0x00b7: /* FALLTHRU - VT100 bullet */ + case 0x03c0: /* FALLTHRU - ncurses greek pi */ + case 0x2190: /* FALLTHRU - Teletype arrow pointing left */ + case 0x2191: /* FALLTHRU - Teletype arrow pointing up */ + case 0x2192: /* FALLTHRU - Teletype arrow pointing right */ + case 0x2193: /* FALLTHRU - Teletype arrow pointing down */ + case 0x2260: /* FALLTHRU - ncurses not-equal */ + case 0x2264: /* FALLTHRU - ncurses less-than-or-equal-to */ + case 0x2265: /* FALLTHRU - ncurses greater-than-or-equal-to */ + case 0x23ba: /* FALLTHRU - VT100 scan line 1 */ + case 0x23bb: /* FALLTHRU - ncurses scan line 3 */ + case 0x23bc: /* FALLTHRU - ncurses scan line 7 */ + case 0x23bd: /* FALLTHRU - VT100 scan line 9 */ + case 0x2500: /* FALLTHRU - VT100 horizontal line */ + case 0x2501: /* FALLTHRU - thick horizontal line */ + case 0x2502: /* FALLTHRU - VT100 vertical line */ + case 0x2503: /* FALLTHRU - thick vertical line */ + case 0x250c: /* FALLTHRU - VT100 upper left corner */ + case 0x250f: /* FALLTHRU - thick upper left corner */ + case 0x2510: /* FALLTHRU - VT100 upper right corner */ + case 0x2513: /* FALLTHRU - thick upper right corner */ + case 0x2514: /* FALLTHRU - VT100 lower left corner */ + case 0x2517: /* FALLTHRU - thick lower left corner */ + case 0x2518: /* FALLTHRU - VT100 lower right corner */ + case 0x251b: /* FALLTHRU - thick lower right corner */ + case 0x251c: /* FALLTHRU - VT100 tee pointing left */ + case 0x2523: /* FALLTHRU - thick tee pointing left */ + case 0x2524: /* FALLTHRU - VT100 tee pointing right */ + case 0x252b: /* FALLTHRU - thick tee pointing right */ + case 0x252c: /* FALLTHRU - VT100 tee pointing down */ + case 0x2533: /* FALLTHRU - thick tee pointing down */ + case 0x2534: /* FALLTHRU - VT100 tee pointing up */ + case 0x253b: /* FALLTHRU - thick tee pointing up */ + case 0x253c: /* FALLTHRU - VT100 large plus or crossover */ + case 0x254b: /* FALLTHRU - thick large plus or crossover */ + case 0x2550: /* FALLTHRU - double horizontal line */ + case 0x2551: /* FALLTHRU - double vertical line */ + case 0x2554: /* FALLTHRU - double upper left corner */ + case 0x2557: /* FALLTHRU - double upper right corner */ + case 0x255a: /* FALLTHRU - double lower left corner */ + case 0x255d: /* FALLTHRU - double lower right corner */ + case 0x2560: /* FALLTHRU - double tee pointing right */ + case 0x2563: /* FALLTHRU - double tee pointing left */ + case 0x2566: /* FALLTHRU - double tee pointing down */ + case 0x2569: /* FALLTHRU - double tee pointing up */ + case 0x256c: /* FALLTHRU - double large plus or crossover */ + case 0x2592: /* FALLTHRU - VT100 checker board (stipple) */ + case 0x25ae: /* FALLTHRU - Teletype solid square block */ + case 0x25c6: /* FALLTHRU - VT100 diamond */ + case 0x2603: /* FALLTHRU - Teletype lantern symbol */ + result = 1; + break; + default: + result = wcwidth(ch); + break; + } + return result; +} +#endif /* !NCURSES_WCWIDTH_GRAPHICS */ diff --git a/contrib/ncurses/ncurses/tinfo/lib_baudrate.c b/contrib/ncurses/ncurses/tinfo/lib_baudrate.c new file mode 100644 index 00000000..311c41ac --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_baudrate.c @@ -0,0 +1,317 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * lib_baudrate.c + * + */ + +#include +#include /* ospeed */ +#if defined(__FreeBSD__) || defined(__OpenBSD__) +#include +#endif + +/* + * These systems use similar header files, which define B1200 as 1200, etc., + * but can be overridden by defining USE_OLD_TTY so B1200 is 9, which makes all + * of the indices up to B115200 fit nicely in a 'short', allowing us to retain + * ospeed's type for compatibility. + */ +#if NCURSES_OSPEED_COMPAT && \ + ((defined(__FreeBSD__) && (__FreeBSD_version < 700000)) || \ + defined(__NetBSD__) || \ + ((defined(__OpenBSD__) && OpenBSD < 201510)) || \ + defined(__APPLE__)) +#undef B0 +#undef B50 +#undef B75 +#undef B110 +#undef B134 +#undef B150 +#undef B200 +#undef B300 +#undef B600 +#undef B1200 +#undef B1800 +#undef B2400 +#undef B4800 +#undef B9600 +#undef B19200 +#undef EXTA +#undef B38400 +#undef EXTB +#undef B57600 +#undef B115200 +#undef B230400 +#undef B460800 +#undef B921600 +#define USE_OLD_TTY +#include +#else +#undef USE_OLD_TTY +#endif /* USE_OLD_TTY */ + +MODULE_ID("$Id: lib_baudrate.c,v 1.45 2020/09/05 21:15:32 tom Exp $") + +/* + * int + * baudrate() + * + * Returns the current terminal's baud rate. + * + */ + +struct speed { + int given_speed; /* values for 'ospeed' */ + int actual_speed; /* the actual speed */ +}; + +#if !defined(EXP_WIN32_DRIVER) +#define DATA(number) { B##number, number } + +static struct speed const speeds[] = +{ + DATA(0), + DATA(50), + DATA(75), + DATA(110), + DATA(134), + DATA(150), + DATA(200), + DATA(300), + DATA(600), + DATA(1200), + DATA(1800), + DATA(2400), + DATA(4800), + DATA(9600), +#ifdef B19200 + DATA(19200), +#elif defined(EXTA) + {EXTA, 19200}, +#endif +#ifdef B28800 + DATA(28800), +#endif +#ifdef B38400 + DATA(38400), +#elif defined(EXTB) + {EXTB, 38400}, +#endif +#ifdef B57600 + DATA(57600), +#endif + /* ifdef to prevent overflow when OLD_TTY is not available */ +#if !(NCURSES_OSPEED_COMPAT && defined(__FreeBSD__) && (__FreeBSD_version > 700000)) +#ifdef B76800 + DATA(76800), +#endif +#ifdef B115200 + DATA(115200), +#endif +#ifdef B153600 + DATA(153600), +#endif +#ifdef B230400 + DATA(230400), +#endif +#ifdef B307200 + DATA(307200), +#endif +#ifdef B460800 + DATA(460800), +#endif +#ifdef B500000 + DATA(500000), +#endif +#ifdef B576000 + DATA(576000), +#endif +#ifdef B921600 + DATA(921600), +#endif +#ifdef B1000000 + DATA(1000000), +#endif +#ifdef B1152000 + DATA(1152000), +#endif +#ifdef B1500000 + DATA(1500000), +#endif +#ifdef B2000000 + DATA(2000000), +#endif +#ifdef B2500000 + DATA(2500000), +#endif +#ifdef B3000000 + DATA(3000000), +#endif +#ifdef B3500000 + DATA(3500000), +#endif +#ifdef B4000000 + DATA(4000000), +#endif +#endif +}; +#endif /* !EXP_WIN32_DRIVER */ + +NCURSES_EXPORT(int) +_nc_baudrate(int OSpeed) +{ +#if defined(EXP_WIN32_DRIVER) + /* On Windows this is a noop */ + (void) OSpeed; + return (OK); +#else +#if !USE_REENTRANT + static int last_OSpeed; + static int last_baudrate; +#endif + + int result = ERR; + + if (OSpeed < 0) + OSpeed = (NCURSES_OSPEED) OSpeed; + if (OSpeed < 0) + OSpeed = (unsigned short) OSpeed; +#if !USE_REENTRANT + if (OSpeed == last_OSpeed) { + result = last_baudrate; + } +#endif + if (result == ERR) { + if (OSpeed >= 0) { + unsigned i; + + for (i = 0; i < SIZEOF(speeds); i++) { + if (speeds[i].given_speed > OSpeed) { + break; + } + if (speeds[i].given_speed == OSpeed) { + result = speeds[i].actual_speed; + break; + } + } + } +#if !USE_REENTRANT + if (OSpeed != last_OSpeed) { + last_OSpeed = OSpeed; + last_baudrate = result; + } +#endif + } + return (result); +#endif /* !EXP_WIN32_DRIVER */ +} + +NCURSES_EXPORT(int) +_nc_ospeed(int BaudRate) +{ + int result = 1; +#if defined(EXP_WIN32_DRIVER) + (void) BaudRate; +#else + if (BaudRate >= 0) { + unsigned i; + + for (i = 0; i < SIZEOF(speeds); i++) { + if (speeds[i].actual_speed == BaudRate) { + result = speeds[i].given_speed; + break; + } + } + } +#endif + return (result); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(baudrate) (NCURSES_SP_DCL0) +{ + int result; + + T((T_CALLED("baudrate(%p)"), (void *) SP_PARM)); + +#if defined(EXP_WIN32_DRIVER) + result = OK; +#else + /* + * In debugging, allow the environment symbol to override when we're + * redirecting to a file, so we can construct repeatable test-cases + * that take into account costs that depend on baudrate. + */ +#ifdef TRACE + if (IsValidTIScreen(SP_PARM) + && !NC_ISATTY(fileno((SP_PARM && SP_PARM->_ofp) ? SP_PARM->_ofp : stdout)) + && getenv("BAUDRATE") != 0) { + int ret; + if ((ret = _nc_getenv_num("BAUDRATE")) <= 0) + ret = 9600; + ospeed = (NCURSES_OSPEED) _nc_ospeed(ret); + returnCode(ret); + } +#endif + + if (IsValidTIScreen(SP_PARM)) { +#ifdef USE_OLD_TTY + result = (int) cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb)); + ospeed = (NCURSES_OSPEED) _nc_ospeed(result); +#else /* !USE_OLD_TTY */ +#ifdef TERMIOS + ospeed = (NCURSES_OSPEED) cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb)); +#else + ospeed = (NCURSES_OSPEED) TerminalOf(SP_PARM)->Nttyb.sg_ospeed; +#endif + result = _nc_baudrate(ospeed); +#endif + TerminalOf(SP_PARM)->_baudrate = result; + } else { + result = ERR; + } +#endif /* !EXP_WIN32_DRIVER */ + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +baudrate(void) +{ + return NCURSES_SP_NAME(baudrate) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_cur_term.c b/contrib/ncurses/ncurses/tinfo/lib_cur_term.c new file mode 100644 index 00000000..1f8db2c1 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_cur_term.c @@ -0,0 +1,200 @@ +/**************************************************************************** +,* Copyright 2020-2021,2022 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997 * + ****************************************************************************/ +/* + * Module that "owns" the 'cur_term' variable: + * + * TERMINAL *set_curterm(TERMINAL *) + * int del_curterm(TERMINAL *) + */ + +#include +#include /* ospeed */ +#include /* VALID_STRING */ + +MODULE_ID("$Id: lib_cur_term.c,v 1.49 2022/05/28 17:56:55 tom Exp $") + +#undef CUR +#define CUR TerminalType(termp). + +#if USE_REENTRANT + +NCURSES_EXPORT(TERMINAL *) +NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_DCL0) +{ + return ((0 != TerminalOf(SP_PARM)) ? TerminalOf(SP_PARM) : CurTerm); +} + +#if NCURSES_SP_FUNCS + +NCURSES_EXPORT(TERMINAL *) +_nc_get_cur_term(void) +{ + return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(TERMINAL *) +NCURSES_PUBLIC_VAR(cur_term) (void) +{ +#if NCURSES_SP_FUNCS + return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN); +#else + return NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG); +#endif +} + +#else +NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0; +#endif + +NCURSES_EXPORT(TERMINAL *) +NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL *termp) +{ + TERMINAL *oldterm; + + T((T_CALLED("set_curterm(%p)"), (void *) termp)); + + _nc_lock_global(curses); + oldterm = cur_term; + if (SP_PARM) + SP_PARM->_term = termp; +#if USE_REENTRANT + CurTerm = termp; +#else + cur_term = termp; +#endif + if (termp != 0) { +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp; + ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate); + if (TCB->drv && + TCB->drv->isTerminfo && + TerminalType(termp).Strings) { + PC = (char) (VALID_STRING(pad_char) ? pad_char[0] : 0); + } + TCB->csp = SP_PARM; +#else + ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate); + if (TerminalType(termp).Strings) { + PC = (char) (VALID_STRING(pad_char) ? pad_char[0] : 0); + } +#endif +#if !USE_REENTRANT + save_ttytype(termp); +#endif + } + _nc_unlock_global(curses); + + T((T_RETURN("%p"), (void *) oldterm)); + return (oldterm); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(TERMINAL *) +set_curterm(TERMINAL *termp) +{ + return NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN, termp); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL *termp) +{ + int rc = ERR; + + T((T_CALLED("del_curterm(%p, %p)"), (void *) SP_PARM, (void *) termp)); + + if (termp != 0) { +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp; +#endif + TERMINAL *cur = ( +#if USE_REENTRANT + NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG) +#else + cur_term +#endif + ); + +#if NCURSES_EXT_NUMBERS +#if NCURSES_EXT_COLORS + _nc_free_termtype1(&termp->type); +#else + _nc_free_termtype2(&termp->type); +#endif +#endif + _nc_free_termtype2(&TerminalType(termp)); + if (termp == cur) + NCURSES_SP_NAME(set_curterm) (NCURSES_SP_ARGx 0); + + FreeIfNeeded(termp->_termname); +#if USE_HOME_TERMINFO + if (_nc_globals.home_terminfo != 0) { + FreeAndNull(_nc_globals.home_terminfo); + } +#endif +#ifdef USE_TERM_DRIVER + if (TCB->drv) + TCB->drv->td_release(TCB); +#endif +#if NO_LEAKS + /* discard memory used in tgetent's cache for this terminal */ + _nc_tgetent_leak(termp); +#endif + if (--_nc_globals.terminal_count == 0) { + _nc_free_tparm(termp); + } + + free(termp->tparm_state.fmt_buff); + free(termp->tparm_state.out_buff); + free(termp); + + rc = OK; + } + + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +del_curterm(TERMINAL *termp) +{ + int rc; + + _nc_lock_global(curses); + rc = NCURSES_SP_NAME(del_curterm) (CURRENT_SCREEN, termp); + _nc_unlock_global(curses); + + return (rc); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_data.c b/contrib/ncurses/ncurses/tinfo/lib_data.c new file mode 100644 index 00000000..b817f49b --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_data.c @@ -0,0 +1,405 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* +** lib_data.c +** +** Common data that may/may not be allocated, but is referenced globally +** +*/ + +#include + +MODULE_ID("$Id: lib_data.c,v 1.89 2024/02/24 18:11:38 tom Exp $") + +/* + * OS/2's native linker complains if we don't initialize public data when + * constructing a dll (reported by J.J.G.Ripoll). + */ +#if USE_REENTRANT +NCURSES_EXPORT(WINDOW *) +NCURSES_PUBLIC_VAR(stdscr) (void) +{ + return CURRENT_SCREEN ? StdScreen(CURRENT_SCREEN) : 0; +} +NCURSES_EXPORT(WINDOW *) +NCURSES_PUBLIC_VAR(curscr) (void) +{ + return CURRENT_SCREEN ? CurScreen(CURRENT_SCREEN) : 0; +} +NCURSES_EXPORT(WINDOW *) +NCURSES_PUBLIC_VAR(newscr) (void) +{ + return CURRENT_SCREEN ? NewScreen(CURRENT_SCREEN) : 0; +} +#else +NCURSES_EXPORT_VAR(WINDOW *) stdscr = 0; +NCURSES_EXPORT_VAR(WINDOW *) curscr = 0; +NCURSES_EXPORT_VAR(WINDOW *) newscr = 0; +#endif + +NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain = 0; + +/* + * The variable 'SP' will be defined as a function on systems that cannot link + * data-only modules, since it is used in a lot of places within ncurses and we + * cannot guarantee that any application will use any particular function. We + * put the WINDOW variables in this module, because it appears that any + * application that uses them will also use 'SP'. + * + * This module intentionally does not reference other ncurses modules, to avoid + * module coupling that increases the size of the executable. + */ +#if BROKEN_LINKER +static SCREEN *my_screen; + +NCURSES_EXPORT(SCREEN *) +_nc_screen(void) +{ + return my_screen; +} + +NCURSES_EXPORT(int) +_nc_alloc_screen(void) +{ + my_screen = _nc_alloc_screen_sp(); + T(("_nc_alloc_screen_sp %p", my_screen)); + return (my_screen != 0); +} + +NCURSES_EXPORT(void) +_nc_set_screen(SCREEN *sp) +{ + my_screen = sp; +} + +#else + +NCURSES_EXPORT_VAR(SCREEN *) SP = NULL; /* Some linkers require initialized data... */ +#endif +/* *INDENT-OFF* */ +#define CHARS_0s { '\0' } + +#define TGETENT_0 { 0L, FALSE, NULL, NULL, NULL } +#define TGETENT_0s { TGETENT_0, TGETENT_0, TGETENT_0, TGETENT_0 } + +NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = { + 0, /* have_sigtstp */ + 0, /* have_sigwinch */ + 0, /* cleanup_nested */ + + FALSE, /* init_signals */ + FALSE, /* init_screen */ + + NULL, /* comp_sourcename */ + NULL, /* comp_termtype */ + + FALSE, /* have_tic_directory */ + FALSE, /* keep_tic_directory */ + 0, /* tic_directory */ + + NULL, /* dbi_list */ + 0, /* dbi_size */ + + NULL, /* first_name */ + NULL, /* keyname_table */ + 0, /* init_keyname */ + + 0, /* slk_format */ + + 2048, /* getstr_limit */ + + NULL, /* safeprint_buf */ + 0, /* safeprint_used */ + + TGETENT_0s, /* tgetent_cache */ + 0, /* tgetent_index */ + 0, /* tgetent_sequence */ + 0, /* terminal_count */ + + 0, /* dbd_blob */ + 0, /* dbd_list */ + 0, /* dbd_size */ + 0, /* dbd_time */ + { { 0, 0 } }, /* dbd_vars */ + +#if HAVE_TSEARCH + NULL, /* cached_tparm */ + 0, /* count_tparm */ +#endif /* HAVE_TSEARCH */ + +#ifdef USE_TERM_DRIVER + 0, /* term_driver */ +#endif + +#ifndef USE_SP_WINDOWLIST + 0, /* _nc_windowlist */ +#endif + +#if USE_HOME_TERMINFO + NULL, /* home_terminfo */ +#endif + +#if !USE_SAFE_SPRINTF + 0, /* safeprint_cols */ + 0, /* safeprint_rows */ +#endif + +#ifdef USE_PTHREADS + PTHREAD_MUTEX_INITIALIZER, /* mutex_curses */ + PTHREAD_MUTEX_INITIALIZER, /* mutex_prescreen */ + PTHREAD_MUTEX_INITIALIZER, /* mutex_screen */ + PTHREAD_MUTEX_INITIALIZER, /* mutex_update */ + PTHREAD_MUTEX_INITIALIZER, /* mutex_tst_tracef */ + PTHREAD_MUTEX_INITIALIZER, /* mutex_tracef */ + 0, /* nested_tracef */ + 0, /* use_pthreads */ +#if USE_PTHREADS_EINTR + 0, /* read_thread */ +#endif +#endif +#if USE_WIDEC_SUPPORT + CHARS_0s, /* key_name */ +#endif +#ifdef TRACE + FALSE, /* trace_opened */ + 0, /* trace_level */ + NULL, /* trace_fp */ + -1, /* trace_fd */ + + NULL, /* tracearg_buf */ + 0, /* tracearg_used */ + + NULL, /* tracebuf_ptr */ + 0, /* tracebuf_used */ + + CHARS_0s, /* tracechr_buf */ + + NULL, /* tracedmp_buf */ + 0, /* tracedmp_used */ + + NULL, /* tracetry_buf */ + 0, /* tracetry_used */ + + { CHARS_0s, CHARS_0s }, /* traceatr_color_buf */ + 0, /* traceatr_color_sel */ + -1, /* traceatr_color_last */ +#if !defined(USE_PTHREADS) && USE_REENTRANT + 0, /* nested_tracef */ +#endif +#endif /* TRACE */ +#if NO_LEAKS + FALSE, /* leak_checking */ +#endif +}; + +#define STACK_FRAME_0 { { 0 }, 0 } +#define STACK_FRAME_0s { STACK_FRAME_0 } +#define NUM_VARS_0s { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + +#define RIPOFF_0 { 0,0,0 } +#define RIPOFF_0s { RIPOFF_0 } + +NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = { + NULL, /* allocated */ + TRUE, /* use_env */ + FALSE, /* filter_mode */ + A_NORMAL, /* previous_attr */ + { /* tparm_state */ + NULL, /* tparam_base */ + + STACK_FRAME_0s, /* stack */ + 0, /* stack_ptr */ + + NULL, /* out_buff */ + 0, /* out_size */ + 0, /* out_used */ + + NULL, /* fmt_buff */ + 0, /* fmt_size */ + + NUM_VARS_0s, /* static_vars */ +#ifdef TRACE + NULL, /* tname */ +#endif + }, + NULL, /* saved_tty */ + FALSE, /* use_tioctl */ + 0, /* _outch */ +#ifndef USE_SP_RIPOFF + RIPOFF_0s, /* ripoff */ + NULL, /* rsp */ +#endif +#if NCURSES_NO_PADDING + FALSE, /* flag to set if padding disabled */ +#endif +#if BROKEN_LINKER || USE_REENTRANT + NULL, /* real_acs_map */ + 0, /* LINES */ + 0, /* COLS */ + 8, /* TABSIZE */ + 1000, /* ESCDELAY */ + 0, /* cur_term */ +#endif +#ifdef TRACE +#if BROKEN_LINKER || USE_REENTRANT + 0L, /* _outchars */ + NULL, /* _tputs_trace */ +#endif +#endif +}; +/* *INDENT-ON* */ + +/* + * wgetch() and other functions with a WINDOW* parameter may use a SCREEN* + * internally, and it is useful to allow those to be invoked without switching + * SCREEN's, e.g., for multi-threaded applications. + */ +NCURSES_EXPORT(SCREEN *) +_nc_screen_of(WINDOW *win) +{ + SCREEN *sp = 0; + + if (win != 0) { + sp = WINDOW_EXT(win, screen); + } + return (sp); +} + +/******************************************************************************/ +#ifdef USE_PTHREADS +static void +init_global_mutexes(void) +{ + static bool initialized = FALSE; + + if (!initialized) { + initialized = TRUE; + _nc_mutex_init(&_nc_globals.mutex_curses); + _nc_mutex_init(&_nc_globals.mutex_prescreen); + _nc_mutex_init(&_nc_globals.mutex_screen); + _nc_mutex_init(&_nc_globals.mutex_update); + _nc_mutex_init(&_nc_globals.mutex_tst_tracef); + _nc_mutex_init(&_nc_globals.mutex_tracef); + } +} + +NCURSES_EXPORT(void) +_nc_init_pthreads(void) +{ + if (_nc_use_pthreads) + return; +# if USE_WEAK_SYMBOLS + if ((pthread_mutex_init) == 0) + return; + if ((pthread_mutex_lock) == 0) + return; + if ((pthread_mutex_unlock) == 0) + return; + if ((pthread_mutex_trylock) == 0) + return; + if ((pthread_mutexattr_settype) == 0) + return; +# endif + _nc_use_pthreads = 1; + init_global_mutexes(); +} + +/* + * Use recursive mutexes if we have them - they're part of Unix98. + * For the cases where we do not, _nc_mutex_trylock() is used to avoid a + * deadlock, at the expense of memory leaks and unexpected failures that + * may not be handled by typical clients. + * + * FIXME - need configure check for PTHREAD_MUTEX_RECURSIVE, define it to + * PTHREAD_MUTEX_NORMAL if not supported. + */ +NCURSES_EXPORT(void) +_nc_mutex_init(pthread_mutex_t * obj) +{ + pthread_mutexattr_t recattr; + + if (_nc_use_pthreads) { + pthread_mutexattr_init(&recattr); + pthread_mutexattr_settype(&recattr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(obj, &recattr); + } +} + +NCURSES_EXPORT(int) +_nc_mutex_lock(pthread_mutex_t * obj) +{ + int rc = 0; + if (_nc_use_pthreads != 0) + rc = pthread_mutex_lock(obj); + return rc; +} + +NCURSES_EXPORT(int) +_nc_mutex_trylock(pthread_mutex_t * obj) +{ + int rc = 0; + if (_nc_use_pthreads != 0) + rc = pthread_mutex_trylock(obj); + return rc; +} + +NCURSES_EXPORT(int) +_nc_mutex_unlock(pthread_mutex_t * obj) +{ + int rc = 0; + if (_nc_use_pthreads != 0) + rc = pthread_mutex_unlock(obj); + return rc; +} +#endif /* USE_PTHREADS */ + +#if defined(USE_PTHREADS) || USE_PTHREADS_EINTR +#if USE_WEAK_SYMBOLS +/* + * NB: sigprocmask(2) is global but pthread_sigmask(3p) + * only for the calling thread. + */ +NCURSES_EXPORT(int) +_nc_sigprocmask(int how, const sigset_t * newmask, sigset_t * oldmask) +{ + if ((pthread_sigmask)) + return pthread_sigmask(how, newmask, oldmask); + else + return (sigprocmask) (how, newmask, oldmask); +} +#endif +#endif /* USE_PTHREADS */ diff --git a/contrib/ncurses/ncurses/tinfo/lib_has_cap.c b/contrib/ncurses/ncurses/tinfo/lib_has_cap.c new file mode 100644 index 00000000..cbf68b31 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_has_cap.c @@ -0,0 +1,95 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-2003 * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_has_cap.c +** +** The routines to query terminal capabilities +** +*/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_has_cap.c,v 1.11 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(has_ic) (NCURSES_SP_DCL0) +{ + bool code = FALSE; + + T((T_CALLED("has_ic(%p)"), (void *) SP_PARM)); + + if (HasTInfoTerminal(SP_PARM)) { + code = ((insert_character || parm_ich + || (enter_insert_mode && exit_insert_mode)) + && (delete_character || parm_dch)) ? TRUE : FALSE; + } + + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +has_ic(void) +{ + return NCURSES_SP_NAME(has_ic) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(bool) +NCURSES_SP_NAME(has_il) (NCURSES_SP_DCL0) +{ + bool code = FALSE; + T((T_CALLED("has_il(%p)"), (void *) SP_PARM)); + if (HasTInfoTerminal(SP_PARM)) { + code = ((insert_line || parm_insert_line) + && (delete_line || parm_delete_line)) ? TRUE : FALSE; + } + + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(bool) +has_il(void) +{ + return NCURSES_SP_NAME(has_il) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_kernel.c b/contrib/ncurses/ncurses/tinfo/lib_kernel.c new file mode 100644 index 00000000..46f652b0 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_kernel.c @@ -0,0 +1,201 @@ +/**************************************************************************** + * Copyright 2020-2022,2023 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 2002 * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * lib_kernel.c + * + * Misc. low-level routines: + * erasechar() + * killchar() + * flushinp() + * + * The baudrate() and delay_output() functions could logically live here, + * but are in other modules to reduce the static-link size of programs + * that use only these facilities. + */ + +#include + +MODULE_ID("$Id: lib_kernel.c,v 1.36 2023/06/10 13:29:06 tom Exp $") + +#ifdef TERMIOS +static int +_nc_vdisable(void) +{ + int value = -1; +#if defined(_POSIX_VDISABLE) && HAVE_UNISTD_H + value = _POSIX_VDISABLE; +#endif +#if defined(_PC_VDISABLE) && HAVE_FPATHCONF + if (value == -1) { + value = (int) fpathconf(0, _PC_VDISABLE); + if (value == -1) { + value = 0377; + } + } +#elif defined(VDISABLE) + if (value == -1) + value = VDISABLE; +#endif + return value; +} +#endif /* TERMIOS */ + +/* + * erasechar() + * + * Return erase character as given in cur_term->Ottyb. + * + */ + +NCURSES_EXPORT(char) +NCURSES_SP_NAME(erasechar) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp = TerminalOf(SP_PARM); + + T((T_CALLED("erasechar(%p)"), (void *) SP_PARM)); + + if (termp != 0) { +#ifdef TERMIOS + result = termp->Ottyb.c_cc[VERASE]; + if (result == _nc_vdisable()) + result = ERR; +#elif defined(EXP_WIN32_DRIVER) + result = ERR; +#else + result = termp->Ottyb.sg_erase; +#endif + } + returnChar((char) result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char) +erasechar(void) +{ + return NCURSES_SP_NAME(erasechar) (CURRENT_SCREEN); +} +#endif + +/* + * killchar() + * + * Return kill character as given in cur_term->Ottyb. + * + */ + +NCURSES_EXPORT(char) +NCURSES_SP_NAME(killchar) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp = TerminalOf(SP_PARM); + + T((T_CALLED("killchar(%p)"), (void *) SP_PARM)); + + if (termp != 0) { +#ifdef TERMIOS + result = termp->Ottyb.c_cc[VKILL]; + if (result == _nc_vdisable()) + result = ERR; +#elif defined(EXP_WIN32_DRIVER) + result = ERR; +#else + result = termp->Ottyb.sg_kill; +#endif + } + returnChar((char) result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char) +killchar(void) +{ + return NCURSES_SP_NAME(killchar) (CURRENT_SCREEN); +} +#endif + +static void +flush_input(int fd) +{ +#ifdef TERMIOS + tcflush(fd, TCIFLUSH); +#else /* !TERMIOS */ + errno = 0; + do { +#if defined(EXP_WIN32_DRIVER) + _nc_console_flush(_nc_console_fd2handle(fd)); +#else + ioctl(fd, TIOCFLUSH, 0); +#endif + } while + (errno == EINTR); +#endif +} + +/* + * flushinp() + * + * Flush any input on tty + */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(flushinp) (NCURSES_SP_DCL0) +{ + T((T_CALLED("flushinp(%p)"), (void *) SP_PARM)); + + if (SP_PARM != 0) { + if (NC_ISATTY(SP_PARM->_ifd)) + flush_input(SP_PARM->_ifd); + else if (NC_ISATTY(SP_PARM->_ofd)) + flush_input(SP_PARM->_ofd); + if (SP_PARM) { + SP_PARM->_fifohead = -1; + SP_PARM->_fifotail = 0; + SP_PARM->_fifopeek = 0; + } + returnCode(OK); + } + returnCode(ERR); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +flushinp(void) +{ + return NCURSES_SP_NAME(flushinp) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_longname.c b/contrib/ncurses/ncurses/tinfo/lib_longname.c new file mode 100644 index 00000000..9dc6d71e --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_longname.c @@ -0,0 +1,104 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_longname.c +** +** The routine longname(). +** +*/ + +#include + +MODULE_ID("$Id: lib_longname.c,v 1.15 2021/04/03 22:36:21 tom Exp $") + +#if USE_REENTRANT +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(longname) (NCURSES_SP_DCL0) +{ + static char empty[] = + {'\0'}; + + T((T_CALLED("longname(%p)"), (void *) SP_PARM)); + + if (SP_PARM) { + char *ptr; + + for (ptr = SP_PARM->_ttytype + strlen(SP_PARM->_ttytype); + ptr > SP_PARM->_ttytype; + ptr--) + if (*ptr == '|') + returnPtr(ptr + 1); + returnPtr(SP_PARM->_ttytype); + } + return empty; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +longname(void) +{ + return NCURSES_SP_NAME(longname) (CURRENT_SCREEN); +} +#endif + +#else + +/* a dummy entrypoint is simpler than generating a conditional in curses.h */ +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(longname) (NCURSES_SP_DCL0) +{ + (void) SP_PARM; + return longname(); +} +#endif + +NCURSES_EXPORT(char *) +longname(void) +{ + char *ptr; + + T((T_CALLED("longname()"))); + + for (ptr = ttytype + strlen(ttytype); + ptr > ttytype; + ptr--) + if (*ptr == '|') + returnPtr(ptr + 1); + returnPtr(ttytype); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_napms.c b/contrib/ncurses/ncurses/tinfo/lib_napms.c new file mode 100644 index 00000000..1a1920ca --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_napms.c @@ -0,0 +1,97 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * lib_napms.c + * + * The routine napms. + * + * (This file was originally written by Eric Raymond; however except for + * comments, none of the original code remains - T.Dickey). + */ + +#include + +#if HAVE_NANOSLEEP +#include +#if HAVE_SYS_TIME_H +#include /* needed for MacOS X DP3 */ +#endif +#endif + +MODULE_ID("$Id: lib_napms.c,v 1.29 2024/08/31 15:55:00 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(napms) (NCURSES_SP_DCLx int ms) +{ + T((T_CALLED("napms(%d)"), ms)); + + if (ms > MAX_DELAY_MSECS) + ms = MAX_DELAY_MSECS; + +#ifdef USE_TERM_DRIVER + CallDriver_1(SP_PARM, td_nap, ms); +#else /* !USE_TERM_DRIVER */ +#if NCURSES_SP_FUNCS + (void) sp; +#endif +#if HAVE_NANOSLEEP + { + struct timespec request, remaining; + request.tv_sec = ms / 1000; + request.tv_nsec = (ms % 1000) * 1000000; + while (nanosleep(&request, &remaining) == -1 + && errno == EINTR) { + request = remaining; + } + } +#elif defined(_NC_WINDOWS_NATIVE) + Sleep((DWORD) ms); +#else + _nc_timed_wait(0, 0, ms, (int *) 0 EVENTLIST_2nd(0)); +#endif +#endif /* !USE_TERM_DRIVER */ + + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +napms(int ms) +{ + return NCURSES_SP_NAME(napms) (CURRENT_SCREEN, ms); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_options.c b/contrib/ncurses/ncurses/tinfo/lib_options.c new file mode 100644 index 00000000..6a8bb394 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_options.c @@ -0,0 +1,378 @@ +/**************************************************************************** + * Copyright 2020-2021,2023 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_options.c +** +** The routines to handle option setting. +** +*/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_options.c,v 1.83 2023/04/29 18:56:12 tom Exp $") + +NCURSES_EXPORT(int) +idlok(WINDOW *win, bool flag) +{ + int res = ERR; + T((T_CALLED("idlok(%p,%d)"), (void *) win, flag)); + + if (win) { + SCREEN *sp = _nc_screen_of(win); + if (sp != 0 +#ifdef USE_TERM_DRIVER + && IsTermInfo(sp) +#endif + ) { + sp->_nc_sp_idlok = + win->_idlok = (flag && (NCURSES_SP_NAME(has_il) (NCURSES_SP_ARG) + || change_scroll_region)); + res = OK; + } + } + returnCode(res); +} + +NCURSES_EXPORT(void) +idcok(WINDOW *win, bool flag) +{ + T((T_CALLED("idcok(%p,%d)"), (void *) win, flag)); + + if (win) { + SCREEN *sp = _nc_screen_of(win); + sp->_nc_sp_idcok = win->_idcok = (flag && NCURSES_SP_NAME(has_ic) (NCURSES_SP_ARG)); + } + returnVoid; +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(halfdelay) (NCURSES_SP_DCLx int t) +{ + T((T_CALLED("halfdelay(%p,%d)"), (void *) SP_PARM, t)); + + if (t < 1 || t > 255 || !SP_PARM || !IsValidTIScreen(SP_PARM)) + returnCode(ERR); + + NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG); + IsCbreak(SP_PARM) = t + 1; + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +halfdelay(int t) +{ + return NCURSES_SP_NAME(halfdelay) (CURRENT_SCREEN, t); +} +#endif + +NCURSES_EXPORT(int) +nodelay(WINDOW *win, bool flag) +{ + T((T_CALLED("nodelay(%p,%d)"), (void *) win, flag)); + + if (win) { + if (flag == TRUE) + win->_delay = 0; + else + win->_delay = -1; + returnCode(OK); + } else + returnCode(ERR); +} + +NCURSES_EXPORT(int) +notimeout(WINDOW *win, bool f) +{ + T((T_CALLED("notimeout(%p,%d)"), (void *) win, f)); + + if (win) { + win->_notimeout = f; + returnCode(OK); + } else + returnCode(ERR); +} + +NCURSES_EXPORT(void) +wtimeout(WINDOW *win, int delay) +{ + T((T_CALLED("wtimeout(%p,%d)"), (void *) win, delay)); + + if (win) { + win->_delay = delay; + } + returnVoid; +} + +NCURSES_EXPORT(int) +keypad(WINDOW *win, bool flag) +{ + T((T_CALLED("keypad(%p,%d)"), (void *) win, flag)); + + if (win) { + win->_use_keypad = flag; + returnCode(_nc_keypad(_nc_screen_of(win), flag)); + } else + returnCode(ERR); +} + +NCURSES_EXPORT(int) +meta(WINDOW *win GCC_UNUSED, bool flag) +{ + int result = ERR; + SCREEN *sp = (win == 0) ? CURRENT_SCREEN : _nc_screen_of(win); + + /* Ok, we stay relaxed and don't signal an error if win is NULL */ + T((T_CALLED("meta(%p,%d)"), (void *) win, flag)); + + /* Ok, we stay relaxed and don't signal an error if win is NULL */ + + if (sp != 0) { + sp->_use_meta = flag; +#ifdef USE_TERM_DRIVER + if (IsTermInfo(sp)) { + if (flag) { + NCURSES_PUTP2("meta_on", meta_on); + } else { + NCURSES_PUTP2("meta_off", meta_off); + } + } +#else + if (flag) { + NCURSES_PUTP2("meta_on", meta_on); + } else { + NCURSES_PUTP2("meta_off", meta_off); + } +#endif + result = OK; + } + returnCode(result); +} + +/* curs_set() moved here to narrow the kernel interface */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(curs_set) (NCURSES_SP_DCLx int vis) +{ + int code = ERR; + T((T_CALLED("curs_set(%p,%d)"), (void *) SP_PARM, vis)); + + if (SP_PARM != 0 && vis >= 0 && vis <= 2) { + int cursor = SP_PARM->_cursor; + if (vis == cursor) { + code = cursor; + } else { +#ifdef USE_TERM_DRIVER + code = CallDriver_1(SP_PARM, td_cursorSet, vis); +#else + if (IsValidTIScreen(SP_PARM)) { + switch (vis) { + case 2: + code = NCURSES_PUTP2_FLUSH("cursor_visible", + cursor_visible); + break; + case 1: + code = NCURSES_PUTP2_FLUSH("cursor_normal", + cursor_normal); + break; + case 0: + code = NCURSES_PUTP2_FLUSH("cursor_invisible", + cursor_invisible); + break; + } + } else { + code = ERR; + } +#endif + if (code != ERR) + code = (cursor == -1 ? 1 : cursor); + SP_PARM->_cursor = vis; + } + } + returnCode(code); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +curs_set(int vis) +{ + return (NCURSES_SP_NAME(curs_set) (CURRENT_SCREEN, vis)); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(typeahead) (NCURSES_SP_DCLx int fd) +{ + T((T_CALLED("typeahead(%p, %d)"), (void *) SP_PARM, fd)); + if (SP_PARM && IsValidTIScreen(SP_PARM)) { + SP_PARM->_checkfd = fd; + returnCode(OK); + } else { + returnCode(ERR); + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +typeahead(int fd) +{ + return NCURSES_SP_NAME(typeahead) (CURRENT_SCREEN, fd); +} +#endif + +/* +** has_key() +** +** Return TRUE if the current terminal has the given key +** +*/ + +#if NCURSES_EXT_FUNCS +static int +has_key_internal(int keycode, TRIES * tp) +{ + if (tp == 0) + return (FALSE); + else if (tp->value == keycode) + return (TRUE); + else + return (has_key_internal(keycode, tp->child) + || has_key_internal(keycode, tp->sibling)); +} + +#ifdef USE_TERM_DRIVER +NCURSES_EXPORT(int) +TINFO_HAS_KEY(SCREEN *sp, int keycode) +{ + return IsValidTIScreen(sp) ? + has_key_internal(keycode, sp->_keytry) : 0; +} +#else +NCURSES_EXPORT(int) +NCURSES_SP_NAME(has_key) (NCURSES_SP_DCLx int keycode) +{ + T((T_CALLED("has_key(%p,%d)"), (void *) SP_PARM, keycode)); + returnCode(SP != 0 ? has_key_internal(keycode, SP_PARM->_keytry) : FALSE); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +has_key(int keycode) +{ + return NCURSES_SP_NAME(has_key) (CURRENT_SCREEN, keycode); +} +#endif +#endif +#endif /* NCURSES_EXT_FUNCS */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_DCLx + const char *name, const char *value) +{ + int rc = NCURSES_PUTP2(name, value); + if (rc != ERR) { + _nc_flush(); + } + return rc; +} + +#if 0 && NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_putp_flush(const char *name, const char *value) +{ + return NCURSES_SP_NAME(_nc_putp_flush) (CURRENT_SCREEN, name, value); +} +#endif + +/* Turn the keypad on/off + * + * Note: we flush the output because changing this mode causes some terminals + * to emit different escape sequences for cursor and keypad keys. If we don't + * flush, then the next wgetch may get the escape sequence that corresponds to + * the terminal state _before_ switching modes. + */ +NCURSES_EXPORT(int) +_nc_keypad(SCREEN *sp, int flag) +{ + int rc = ERR; + + if (sp != 0) { +#ifdef USE_PTHREADS + /* + * We might have this situation in a multithreaded application that + * has wgetch() reading in more than one thread. putp() and below + * may use SP explicitly. + */ + if (_nc_use_pthreads && sp != CURRENT_SCREEN) { + SCREEN *save_sp; + + /* cannot use use_screen(), since that is not in tinfo library */ + _nc_lock_global(curses); + save_sp = CURRENT_SCREEN; + _nc_set_screen(sp); + rc = _nc_keypad(sp, flag); + _nc_set_screen(save_sp); + _nc_unlock_global(curses); + } else +#endif + { +#ifdef USE_TERM_DRIVER + rc = CallDriver_1(sp, td_kpad, flag); + if (rc == OK) + sp->_keypad_on = flag; +#else + if (flag) { + (void) NCURSES_PUTP2_FLUSH("keypad_xmit", keypad_xmit); + } else if (keypad_local) { + (void) NCURSES_PUTP2_FLUSH("keypad_local", keypad_local); + } + + if (flag && !sp->_tried) { + _nc_init_keytry(sp); + sp->_tried = TRUE; + } + sp->_keypad_on = flag; + rc = OK; +#endif + } + } + return (rc); +} diff --git a/contrib/ncurses/ncurses/tinfo/lib_print.c b/contrib/ncurses/ncurses/tinfo/lib_print.c new file mode 100644 index 00000000..17072a2f --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_print.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2011,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_print.c,v 1.33 2024/08/31 10:46:01 Rafael.Kitover Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len) +/* ship binary character data to the printer via mc4/mc5/mc5p */ +{ + int result; + char *mybuf = NULL; + const char *switchon; + size_t onsize, offsize; + size_t need; + + errno = 0; + if (!HasTInfoTerminal(SP_PARM) + || len <= 0 + || (!prtr_non && (!prtr_on || !prtr_off))) { + errno = ENODEV; + return (ERR); + } + + if (prtr_non) { + switchon = TIPARM_1(prtr_non, len); + onsize = strlen(switchon); + offsize = 0; + } else { + switchon = prtr_on; + onsize = strlen(prtr_on); + offsize = strlen(prtr_off); + } + + need = onsize + (size_t) len + offsize; + + if (switchon == 0 + || (mybuf = typeMalloc(char, need + 1)) == 0) { + free(mybuf); + errno = ENOMEM; + return (ERR); + } + + _nc_STRCPY(mybuf, switchon, need); + memcpy(mybuf + onsize, data, (size_t) len); + if (offsize) + _nc_STRCPY(mybuf + onsize + len, prtr_off, need); + + /* + * We're relying on the atomicity of UNIX writes here. The + * danger is that output from a refresh() might get interspersed + * with the printer data after the write call returns but before the + * data has actually been shipped to the terminal. If the write(2) + * operation is truly atomic we're protected from this. + */ + result = (int) write(SP_PARM->_ofd, mybuf, need); + + /* + * By giving up our scheduler slot here we increase the odds that the + * kernel will ship the contiguous clist items from the last write + * immediately. + */ +#ifndef _NC_WINDOWS_NATIVE + (void) sleep(0); +#endif + free(mybuf); + return (result); +} + +#if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER) +NCURSES_EXPORT(int) +mcprint(char *data, int len) +{ + return NCURSES_SP_NAME(mcprint) (CURRENT_SCREEN, data, len); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_raw.c b/contrib/ncurses/ncurses/tinfo/lib_raw.c new file mode 100644 index 00000000..7a76d92e --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_raw.c @@ -0,0 +1,431 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1998-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * raw.c + * + * Routines: + * raw() + * cbreak() + * noraw() + * nocbreak() + * qiflush() + * noqiflush() + * intrflush() + * + */ + +#include + +MODULE_ID("$Id: lib_raw.c,v 1.31 2024/05/25 20:18:20 Branden.Robinson Exp $") + +#if HAVE_SYS_TERMIO_H +#include /* needed for ISC */ +#endif + +#ifdef __EMX__ +#include +#define _nc_setmode(mode) setmode(SP_PARM->_ifd, mode) +#else +#define _nc_setmode(mode) /* nothing */ +#endif + +#if USE_KLIBC_KBD +#define INCL_KBD +#include +#endif + +#define COOKED_INPUT (IXON|BRKINT|PARMRK) + +#ifdef TRACE +#define BEFORE(N) if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s before bits: %s", N, _nc_tracebits()) +#define AFTER(N) if (USE_TRACEF(TRACE_BITS)) _nc_locked_tracef("%s after bits: %s", N, _nc_tracebits()) +#else +#define BEFORE(s) +#define AFTER(s) +#endif /* TRACE */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("raw(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("raw"); + _nc_setmode(O_BINARY); + + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag &= (unsigned) ~(ICANON | ISIG | IEXTEN); + buf.c_iflag &= (unsigned) ~(COOKED_INPUT); + buf.c_cc[VMIN] = 1; + buf.c_cc[VTIME] = 0; +#elif defined(EXP_WIN32_DRIVER) + buf.dwFlagIn &= (unsigned long) ~CONMODE_NORAW; +#else + buf.sg_flags |= RAW; +#endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { +#if USE_KLIBC_KBD + KBDINFO kbdinfo; + + kbdinfo.cb = sizeof(kbdinfo); + KbdGetStatus(&kbdinfo, 0); + + kbdinfo.cb = sizeof(kbdinfo); + kbdinfo.fsMask &= ~KEYBOARD_ASCII_MODE; + kbdinfo.fsMask |= KEYBOARD_BINARY_MODE; + KbdSetStatus(&kbdinfo, 0); +#endif + if (SP_PARM) { + IsRaw(SP_PARM) = TRUE; + IsCbreak(SP_PARM) = 1; + } + termp->Nttyb = buf; + } + AFTER("raw"); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +raw(void) +{ + return NCURSES_SP_NAME(raw) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("cbreak(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("cbreak"); + _nc_setmode(O_BINARY); + + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag &= (unsigned) ~ICANON; + buf.c_iflag &= (unsigned) ~ICRNL; + buf.c_cc[VMIN] = 1; + buf.c_cc[VTIME] = 0; +#elif defined(EXP_WIN32_DRIVER) + buf.dwFlagIn |= CONMODE_NORAW; + buf.dwFlagIn &= (unsigned long) ~CONMODE_NOCBREAK; +#else + buf.sg_flags |= CBREAK; +#endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { + if (SP_PARM) { + IsCbreak(SP_PARM) = 1; + } + termp->Nttyb = buf; + } + AFTER("cbreak"); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +cbreak(void) +{ + return NCURSES_SP_NAME(cbreak) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0) +{ + TERMINAL *termp; + + T((T_CALLED("qiflush(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + int result; + + BEFORE("qiflush"); + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag &= (unsigned) ~(NOFLSH); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); +#else + result = ERR; + /* FIXME */ +#endif + if (result == OK) + termp->Nttyb = buf; + AFTER("qiflush"); + } + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +qiflush(void) +{ + NCURSES_SP_NAME(qiflush) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("noraw(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("noraw"); + _nc_setmode(O_TEXT); + + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag |= ISIG | ICANON | + (termp->Ottyb.c_lflag & IEXTEN); + buf.c_iflag |= COOKED_INPUT; +#elif defined(EXP_WIN32_DRIVER) + buf.dwFlagIn |= CONMODE_NORAW; +#else + buf.sg_flags &= ~(RAW | CBREAK); +#endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { +#if USE_KLIBC_KBD + KBDINFO kbdinfo; + + kbdinfo.cb = sizeof(kbdinfo); + KbdGetStatus(&kbdinfo, 0); + + kbdinfo.cb = sizeof(kbdinfo); + kbdinfo.fsMask &= ~KEYBOARD_BINARY_MODE; + kbdinfo.fsMask |= KEYBOARD_ASCII_MODE; + KbdSetStatus(&kbdinfo, 0); +#endif + if (SP_PARM) { + IsRaw(SP_PARM) = FALSE; + IsCbreak(SP_PARM) = 0; + } + termp->Nttyb = buf; + } + AFTER("noraw"); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +noraw(void) +{ + return NCURSES_SP_NAME(noraw) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(nocbreak) (NCURSES_SP_DCL0) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("nocbreak(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("nocbreak"); + _nc_setmode(O_TEXT); + + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag |= ICANON; + buf.c_iflag |= ICRNL; +#elif defined(EXP_WIN32_DRIVER) + buf.dwFlagIn |= (CONMODE_NOCBREAK | CONMODE_NORAW); +#else + buf.sg_flags &= ~CBREAK; +#endif + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { + if (SP_PARM) { + IsCbreak(SP_PARM) = 0; + } + termp->Nttyb = buf; + } + AFTER("nocbreak"); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +nocbreak(void) +{ + return NCURSES_SP_NAME(nocbreak) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0) +{ + TERMINAL *termp; + + T((T_CALLED("noqiflush(%p)"), (void *) SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + int result; + + BEFORE("noqiflush"); + buf = termp->Nttyb; +#ifdef TERMIOS + buf.c_lflag |= NOFLSH; + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); +#else + /* FIXME */ + result = ERR; +#endif + if (result == OK) + termp->Nttyb = buf; + AFTER("noqiflush"); + } + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +noqiflush(void) +{ + NCURSES_SP_NAME(noqiflush) (CURRENT_SCREEN); +} +#endif + +/* + * This call does the same thing as the qiflush()/noqiflush() pair. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(intrflush) (NCURSES_SP_DCLx WINDOW *win GCC_UNUSED, bool flag) +{ + int result = ERR; + TERMINAL *termp; + + T((T_CALLED("intrflush(%p,%d)"), (void *) SP_PARM, flag)); + if (SP_PARM == 0) + returnCode(ERR); + + if ((termp = TerminalOf(SP_PARM)) != 0) { + TTY buf; + + BEFORE("intrflush"); + buf = termp->Nttyb; +#ifdef TERMIOS + if (flag) + buf.c_lflag &= (unsigned) ~(NOFLSH); + else + buf.c_lflag |= (NOFLSH); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); +#else + /* FIXME */ +#endif + if (result == OK) { + termp->Nttyb = buf; + } + AFTER("intrflush"); + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +intrflush(WINDOW *win GCC_UNUSED, bool flag) +{ + return NCURSES_SP_NAME(intrflush) (CURRENT_SCREEN, win, flag); +} +#endif + +#if NCURSES_EXT_FUNCS +/* *INDENT-OFF* */ + +/* + * SCREEN is always opaque, but nl/raw/cbreak/echo set properties in it. + * As an extension, provide a way to query the properties. + * + * There are other properties which could be queried, e.g., filter, keypad, + * use_env, use_meta, but these particular properties are saved/restored within + * the wgetnstr() and wgetn_wstr() functions, which requires that the higher + * level curses library knows about the internal state of the lower level + * terminfo library. + */ + +#define is_TEST(show,what) \ + NCURSES_EXPORT(int) \ + NCURSES_SP_NAME(show) (NCURSES_SP_DCL0) \ + { \ + return ((SP_PARM != NULL) ? (what(SP_PARM) ? 1 : 0) : -1); \ + } + +is_TEST(is_nl, IsNl) +is_TEST(is_raw, IsRaw) +is_TEST(is_cbreak, IsCbreak) +is_TEST(is_echo, IsEcho) + +#if NCURSES_SP_FUNCS +#undef is_TEST +#define is_TEST(show) \ + NCURSES_EXPORT(int) \ + show(void) \ + { \ + return NCURSES_SP_NAME(show) (CURRENT_SCREEN); \ + } +is_TEST(is_nl) +is_TEST(is_raw) +is_TEST(is_cbreak) +is_TEST(is_echo) +#endif + +/* *INDENT-ON* */ +#endif /* extensions */ diff --git a/contrib/ncurses/ncurses/tinfo/lib_setup.c b/contrib/ncurses/ncurses/tinfo/lib_setup.c new file mode 100644 index 00000000..54fbe752 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_setup.c @@ -0,0 +1,1210 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * Terminal setup routines common to termcap and terminfo: + * + * use_env(bool) + * use_tioctl(bool) + * setupterm(char *, int, int *) + */ + +#include +#include /* for MAX_NAME_SIZE */ + +#if HAVE_LOCALE_H +#include +#endif + +MODULE_ID("$Id: lib_setup.c,v 1.245 2024/10/19 21:17:36 tom Exp $") + +/**************************************************************************** + * + * Terminal size computation + * + ****************************************************************************/ + +#if HAVE_SIZECHANGE +# if !defined(sun) || !TERMIOS +# if HAVE_SYS_IOCTL_H +# include +# endif +# endif +#endif + +#if NEED_PTEM_H + /* On SCO, they neglected to define struct winsize in termios.h -- it is only + * in termio.h and ptem.h (the former conflicts with other definitions). + */ +# include +# include +#endif + +#if HAVE_LANGINFO_CODESET +#include +#endif + +/* + * SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS, + * Solaris, IRIX) define TIOCGWINSZ and struct winsize. + */ +#ifdef TIOCGSIZE +# define IOCTL_WINSIZE TIOCGSIZE +# define STRUCT_WINSIZE struct ttysize +# define WINSIZE_ROWS(n) (int)n.ts_lines +# define WINSIZE_COLS(n) (int)n.ts_cols +#else +# ifdef TIOCGWINSZ +# define IOCTL_WINSIZE TIOCGWINSZ +# define STRUCT_WINSIZE struct winsize +# define WINSIZE_ROWS(n) (int)n.ws_row +# define WINSIZE_COLS(n) (int)n.ws_col +# endif +#endif + +/* + * Reduce explicit use of "cur_term" global variable. + */ +#undef CUR +#define CUR TerminalType(termp). + +/* + * Wrap global variables in this module. + */ +#if USE_REENTRANT + +NCURSES_EXPORT(char *) +NCURSES_PUBLIC_VAR(ttytype) (void) +{ + static char empty[] = ""; + char *result = empty; + +#if NCURSES_SP_FUNCS + if (CURRENT_SCREEN) { + TERMINAL *termp = TerminalOf(CURRENT_SCREEN); + if (termp != 0) { + result = TerminalType(termp).term_names; + } + } +#else + if (cur_term != 0) { + result = TerminalType(cur_term).term_names; + } +#endif + return result; +} + +NCURSES_EXPORT(int *) +_nc_ptr_Lines(SCREEN *sp) +{ + return ptrLines(sp); +} + +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(LINES) (void) +{ + return *_nc_ptr_Lines(CURRENT_SCREEN); +} + +NCURSES_EXPORT(int *) +_nc_ptr_Cols(SCREEN *sp) +{ + return ptrCols(sp); +} + +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(COLS) (void) +{ + return *_nc_ptr_Cols(CURRENT_SCREEN); +} + +NCURSES_EXPORT(int *) +_nc_ptr_Tabsize(SCREEN *sp) +{ + return ptrTabsize(sp); +} + +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(TABSIZE) (void) +{ + return *_nc_ptr_Tabsize(CURRENT_SCREEN); +} +#else +NCURSES_EXPORT_VAR(char) ttytype[NAMESIZE] = ""; +NCURSES_EXPORT_VAR(int) LINES = 0; +NCURSES_EXPORT_VAR(int) COLS = 0; +NCURSES_EXPORT_VAR(int) TABSIZE = 8; +#endif + +#if NCURSES_EXT_FUNCS +NCURSES_EXPORT(int) +NCURSES_SP_NAME(set_tabsize) (NCURSES_SP_DCLx int value) +{ + int code = OK; + if (value <= 0) { + code = ERR; + } else { +#if USE_REENTRANT + if (SP_PARM) { + SP_PARM->_TABSIZE = value; + } else { + code = ERR; + } +#else + (void) SP_PARM; + TABSIZE = value; +#endif + } + return code; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +set_tabsize(int value) +{ + return NCURSES_SP_NAME(set_tabsize) (CURRENT_SCREEN, value); +} +#endif +#endif /* NCURSES_EXT_FUNCS */ + +#if USE_SIGWINCH +/* + * If we have a pending SIGWINCH, set the flag in each screen. + */ +NCURSES_EXPORT(int) +_nc_handle_sigwinch(SCREEN *sp) +{ + SCREEN *scan; + + if (_nc_globals.have_sigwinch) { + _nc_globals.have_sigwinch = 0; + + for (each_screen(scan)) { + scan->_sig_winch = TRUE; + } + } + + return (sp ? sp->_sig_winch : 0); +} + +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f) +{ + START_TRACE(); + T((T_CALLED("use_env(%p,%d)"), (void *) SP_PARM, (int) f)); +#if NCURSES_SP_FUNCS + if (IsPreScreen(SP_PARM)) { + SP_PARM->_use_env = f; + } +#else + _nc_prescreen.use_env = f; +#endif + returnVoid; +} + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f) +{ + START_TRACE(); + T((T_CALLED("use_tioctl(%p,%d)"), (void *) SP_PARM, (int) f)); +#if NCURSES_SP_FUNCS + if (IsPreScreen(SP_PARM)) { + SP_PARM->use_tioctl = f; + } +#else + _nc_prescreen.use_tioctl = f; +#endif + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +use_env(bool f) +{ + START_TRACE(); + T((T_CALLED("use_env(%d)"), (int) f)); + _nc_prescreen.use_env = f; + returnVoid; +} + +NCURSES_EXPORT(void) +use_tioctl(bool f) +{ + START_TRACE(); + T((T_CALLED("use_tioctl(%d)"), (int) f)); + _nc_prescreen.use_tioctl = f; + returnVoid; +} +#endif + +#if !(defined(USE_TERM_DRIVER) || defined(EXP_WIN32_DRIVER)) +static void +_nc_default_screensize(TERMINAL *termp, int *linep, int *colp) +{ + /* if we can't get dynamic info about the size, use static */ + if (*linep <= 0) { + *linep = (int) lines; + } + if (*colp <= 0) { + *colp = (int) columns; + } + + /* the ultimate fallback, assume fixed 24x80 size */ + if (*linep <= 0) { + *linep = 24; + } + if (*colp <= 0) { + *colp = 80; + } +} + +#if defined(USE_CHECK_SIZE) && defined(user6) && defined(user7) +static const char * +skip_csi(const char *value) +{ + if (UChar(*value) == CSI_CHR) { + ++value; + } else if (*value == ESC_CHR && value[1] == L_BLOCK) { + value += 2; + } + return value; +} + +static bool +is_expected(const char *value, const char *expected) +{ + bool result = FALSE; + if (VALID_STRING(value)) { + const char *skipped = skip_csi(value); + if (skipped != value) { + if (!strcmp(skipped, expected)) + result = TRUE; + } + } + return result; +} + +static bool +get_position(const TERMINAL *termp, int fd, int *row, int *col) +{ + bool result = FALSE; + size_t need = strlen(user7); + int have; + + have = (int) write(fd, user7, need); + + if (have == (int) need) { + int y, x; + char buf[20]; + char *s; + char cc; + const char *skipped; + + s = memset(buf, '\0', sizeof(buf)); + do { + size_t ask = (sizeof(buf) - 1 - (size_t) (s - buf)); + int got = (int) read(fd, s, ask); + if (got == 0) + break; + s += got; + *s = '\0'; + } while (strchr(buf, 'R') == NULL && (size_t) (s + 1 - buf) < sizeof(buf)); + T(("CPR response %s", _nc_visbuf(buf))); + skipped = skip_csi(buf); + cc = '\0'; + if (skipped != buf + && *skipped != '\0' + && sscanf(skip_csi(buf), "%d;%d%c", &y, &x, &cc) == 3 + && (cc == 'R')) { + *row = y; + *col = x; + result = TRUE; + } + } + T(("get_position %s %d,%d", result ? "OK" : "ERR", *row, *col)); + return result; +} + +static bool +set_position(NCURSES_SP_DCLx const TERMINAL *termp, int row, int col) +{ + bool result; + const char *actual = TIPARM_2(cursor_address, row, col); + T((T_CALLED("set_position %d,%d)"), row, col)); +#if NCURSES_SP_FUNCS + result = (NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "set_position", + actual) == OK); + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); +#else + /* This does not support padding because without sp-funcs, we have only + * the interface using stdio, but we are not guaranteed that Filedes + * is the same as fileno(stdout). + */ + result = FALSE; + if (actual != NULL) { + size_t want = strlen(actual); + int have = (int) write(termp->Filedes, actual, want); + result = ((int) want == have); + } +#endif + returnBool(result); +} + +/* + * This is a little more complicated than one might expect, because we do this + * before setting up the terminal modes, etc., and cannot use the timeout or + * buffering functions. + * + * We check if the terminal description has the ECMA-48 CPR (cursor position + * report) in u7 and the response in u6. The two variations of is_expected() + * cover the termcap style and terminfo style, and are equivalent as far as we + * are concerned. For analyzing the response, we wait (a short time) for 'R' + * to be echoed, and then check if we received two integers in the response. + * + * In principle, this could run on "any" ECMA-48 terminal, but in practice, + * there is a scenario using GNU screen where it uses ncurses with a partially + * configured pseudo-terminal, and the CPR response goes to the wrong place. + * So we do a simple check to exclude pseudo-terminals. + */ +static void +_nc_check_screensize(SCREEN *sp, TERMINAL *termp, int *linep, int *colp) +{ + int fd = termp->Filedes; + TTY saved; + const char *name = NULL; + + if (IsRealTty(fd, name) + && VALID_STRING(cursor_address) + && is_expected(user7, "6n") + && (is_expected(user6, "%i%d;%dR") || + is_expected(user6, "%i%p1%d;%p2%dR")) + && GET_TTY(fd, &saved) == OK) { + int current_y = -1, current_x = -1; + int updated_y = -1, updated_x = -1; + TTY alter = saved; + +#if NCURSES_SP_FUNCS + if (sp == NULL) { + sp = new_prescr(); + sp->_term = termp; + NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); + } +#else + (void) sp; +#endif + + T(("trying CPR (u7/u6) with %s", name)); + alter.c_lflag &= (unsigned) ~(ECHO | ICANON | ISIG | IEXTEN); + alter.c_iflag &= (unsigned) ~(IXON | BRKINT | PARMRK); + alter.c_cc[VMIN] = 0; + alter.c_cc[VTIME] = 1; + SET_TTY(fd, &alter); + + if (get_position(termp, fd, ¤t_y, ¤t_x) + && set_position(NCURSES_SP_ARGx termp, 9999, 9999) + && get_position(termp, fd, &updated_y, &updated_x)) { + *linep = updated_y; + *colp = updated_x; + set_position(NCURSES_SP_ARGx termp, current_y, current_x); + } + /* restore tty modes */ + SET_TTY(fd, &saved); + } else { + T(("NOT trying CPR with fd %d (%s): %s", + fd, NonNull(name), NC_ISATTY(fd) ? "tty" : "not a tty")); + } + + _nc_default_screensize(termp, linep, colp); +} +#else /* !USE_CHECK_SIZE */ +#define _nc_check_screensize(sp, termp, linep, colp) /* nothing */ +#endif +#endif /* !(defined(USE_TERM_DRIVER) || defined(EXP_WIN32_DRIVER)) */ + +NCURSES_EXPORT(void) +_nc_get_screensize(SCREEN *sp, +#ifdef USE_TERM_DRIVER + TERMINAL *termp, +#endif + int *linep, int *colp) +/* Obtain lines/columns values from the environment and/or terminfo entry */ +{ +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB; + int my_tabsize; + + assert(termp != 0 && linep != 0 && colp != 0); + TCB = (TERMINAL_CONTROL_BLOCK *) termp; + + my_tabsize = TCB->info.tabsize; + TCB->drv->td_size(TCB, linep, colp); + +#if USE_REENTRANT + if (sp != 0) { + sp->_TABSIZE = my_tabsize; + } +#else + (void) sp; + TABSIZE = my_tabsize; +#endif + T(("TABSIZE = %d", my_tabsize)); +#else /* !USE_TERM_DRIVER */ + TERMINAL *termp = cur_term; + int my_tabsize; + bool useEnv = _nc_prescreen.use_env; + bool useTioctl = _nc_prescreen.use_tioctl; + + T((T_CALLED("_nc_get_screensize (%p)"), (void *) sp)); +#ifdef EXP_WIN32_DRIVER + /* If we are here, then Windows console is used in terminfo mode. + We need to figure out the size using the console API + */ + _nc_console_size(linep, colp); + T(("screen size: winconsole lines = %d columns = %d", *linep, *colp)); +#else + /* figure out the size of the screen */ + T(("screen size: terminfo lines = %d columns = %d", lines, columns)); + + *linep = (int) lines; + *colp = (int) columns; +#endif + +#if NCURSES_SP_FUNCS + if (sp) { + useEnv = sp->_use_env; + useTioctl = sp->use_tioctl; + } +#endif + + T(("useEnv:%d useTioctl:%d", useEnv, useTioctl)); + if (useEnv || useTioctl) { +#ifdef __EMX__ + { + int screendata[2]; + _scrsize(screendata); + *colp = screendata[0]; + *linep = ((sp != 0 && sp->_filtered) + ? 1 + : screendata[1]); + T(("EMX screen size: environment LINES = %d COLUMNS = %d", + *linep, *colp)); + } +#endif +#if HAVE_SIZECHANGE + /* try asking the OS */ + if (NC_ISATTY(cur_term->Filedes)) { + STRUCT_WINSIZE size; + + errno = 0; + do { + if (ioctl(cur_term->Filedes, IOCTL_WINSIZE, &size) >= 0) { + *linep = ((sp != 0 && sp->_filtered) + ? 1 + : WINSIZE_ROWS(size)); + *colp = WINSIZE_COLS(size); + T(("SYS screen size: environment LINES = %d COLUMNS = %d", + *linep, *colp)); + break; + } + } while + (errno == EINTR); + } +#endif /* HAVE_SIZECHANGE */ + + if (useEnv) { + int value; + + if (useTioctl) { + /* + * If environment variables are used, update them. + */ + if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) { + _nc_setenv_num("LINES", *linep); + } + if (_nc_getenv_num("COLUMNS") > 0) { + _nc_setenv_num("COLUMNS", *colp); + } + } + + /* + * Finally, look for environment variables. + * + * Solaris lets users override either dimension with an environment + * variable. + */ + if ((value = _nc_getenv_num("LINES")) > 0) { + *linep = Min(value, MAX_ENV_LINES); + T(("screen size: environment LINES = %d", *linep)); + } + if ((value = _nc_getenv_num("COLUMNS")) > 0) { + *colp = Min(value, MAX_ENV_COLUMNS); + T(("screen size: environment COLUMNS = %d", *colp)); + } + + _nc_default_screensize(termp, linep, colp); + } else { + _nc_check_screensize(sp, termp, linep, colp); + } + + /* + * Put the derived values back in the screen-size caps, so + * tigetnum() and tgetnum() will do the right thing. + */ + lines = (NCURSES_INT2) (*linep); + columns = (NCURSES_INT2) (*colp); +#if NCURSES_EXT_NUMBERS +#define OldNumber(termp,name) \ + (termp)->type.Numbers[(&name - (termp)->type2.Numbers)] + OldNumber(termp, lines) = (short) (*linep); + OldNumber(termp, columns) = (short) (*colp); +#endif + } else { + _nc_check_screensize(sp, termp, linep, colp); + } + + T(("screen size is %dx%d", *linep, *colp)); + + if (VALID_NUMERIC(init_tabs)) + my_tabsize = (int) init_tabs; + else + my_tabsize = 8; + +#if USE_REENTRANT + if (sp != 0) + sp->_TABSIZE = my_tabsize; +#else + TABSIZE = my_tabsize; +#endif + T(("TABSIZE = %d", TABSIZE)); + returnVoid; +#endif /* USE_TERM_DRIVER */ +} + +#if USE_SIZECHANGE +NCURSES_EXPORT(void) +_nc_update_screensize(SCREEN *sp) +{ + int new_lines; + int new_cols; + +#ifdef USE_TERM_DRIVER + int old_lines; + int old_cols; + + assert(sp != 0); + + CallDriver_2(sp, td_getsize, &old_lines, &old_cols); + +#else + TERMINAL *termp = cur_term; + int old_lines = lines; + int old_cols = columns; +#endif + + if (sp != 0) { + TINFO_GET_SIZE(sp, sp->_term, &new_lines, &new_cols); + /* + * See is_term_resized() and resizeterm(). + * We're doing it this way because those functions belong to the upper + * ncurses library, while this resides in the lower terminfo library. + */ + if (sp->_resize != 0) { + if ((new_lines != old_lines) || (new_cols != old_cols)) { + sp->_resize(NCURSES_SP_ARGx new_lines, new_cols); + } else if (sp->_sig_winch && (sp->_ungetch != 0)) { + sp->_ungetch(SP_PARM, KEY_RESIZE); /* so application can know this */ + } + sp->_sig_winch = FALSE; + } + } +} +#endif /* USE_SIZECHANGE */ + +/**************************************************************************** + * + * Terminal setup + * + ****************************************************************************/ + +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP +/* + * Return 1 if entry found, 0 if not found, -1 if database not accessible, + * just like tgetent(). + */ +int +_nc_setup_tinfo(const char *const tn, TERMTYPE2 *const tp) +{ + char filename[PATH_MAX]; + int status = _nc_read_entry2(tn, filename, tp); + + /* + * If we have an entry, force all of the cancelled strings to null + * pointers so we don't have to test them in the rest of the library. + * (The terminfo compiler bypasses this logic, since it must know if + * a string is cancelled, for merging entries). + */ + if (status == TGETENT_YES) { + unsigned n; + T(("_nc_setup_tinfo - resetting invalid booleans/strings")); + for_each_boolean(n, tp) { + if (!VALID_BOOLEAN(tp->Booleans[n])) + tp->Booleans[n] = FALSE; + } + for_each_string(n, tp) { + if (tp->Strings[n] == CANCELLED_STRING) + tp->Strings[n] = ABSENT_STRING; + } + } + return (status); +} +#endif + +/* + * Take the real command character out of the CC environment variable + * and substitute it in for the prototype given in 'command_character'. + */ +void +_nc_tinfo_cmdch(TERMINAL *termp, int proto) +{ + char *tmp; + + /* + * Only use the character if the string is a single character, + * since it is fairly common for developers to set the C compiler + * name as an environment variable - using the same symbol. + */ + if ((tmp = getenv("CC")) != 0 && strlen(tmp) == 1) { + unsigned i; + char CC = *tmp; + + for_each_string(i, &(termp->type)) { + tmp = termp->type.Strings[i]; + if (VALID_STRING(tmp)) { + for (; *tmp; ++tmp) { + if (UChar(*tmp) == proto) + *tmp = CC; + } + } + } + } +} + +/* + * Find the locale which is in effect. + */ +NCURSES_EXPORT(char *) +_nc_get_locale(void) +{ + char *env; +#if HAVE_LOCALE_H + /* + * This is preferable to using getenv() since it ensures that we are using + * the locale which was actually initialized by the application. + */ + env = setlocale(LC_CTYPE, 0); +#else + if (((env = getenv("LANG")) != 0 && *env != '\0') + || ((env = getenv("LC_CTYPE")) != 0 && *env != '\0') + || ((env = getenv("LC_ALL")) != 0 && *env != '\0')) { + ; + } +#endif + T(("_nc_get_locale %s", _nc_visbuf(env))); + return env; +} + +/* + * Check if we are running in a UTF-8 locale. + */ +NCURSES_EXPORT(int) +_nc_unicode_locale(void) +{ + static bool initialized = FALSE; + static int result = 0; + + if (!initialized) { +#if defined(_NC_WINDOWS_NATIVE) && USE_WIDEC_SUPPORT + result = 1; +#elif HAVE_LANGINFO_CODESET + char *env = nl_langinfo(CODESET); + result = !strcmp(env, "UTF-8"); + T(("_nc_unicode_locale(%s) ->%d", env, result)); +#else + char *env = _nc_get_locale(); + if (env != 0) { + if (strstr(env, ".UTF-8") != 0) { + result = 1; + T(("_nc_unicode_locale(%s) ->%d", env, result)); + } + } +#endif + initialized = TRUE; + } + return result; +} + +#define CONTROL_N(s) ((s) != 0 && strstr(s, "\016") != 0) +#define CONTROL_O(s) ((s) != 0 && strstr(s, "\017") != 0) + +/* + * Check for known broken cases where a UTF-8 locale breaks the alternate + * character set. + */ +NCURSES_EXPORT(int) +_nc_locale_breaks_acs(TERMINAL *termp) +{ + const char *env_name = "NCURSES_NO_UTF8_ACS"; + const char *env; + int value; + int result = 0; + + T((T_CALLED("_nc_locale_breaks_acs:%d"), result)); + if (getenv(env_name) != 0) { + result = _nc_getenv_num(env_name); + } else if ((value = tigetnum("U8")) >= 0) { + result = value; /* use extension feature */ + } else if ((env = getenv("TERM")) != 0) { + if (strstr(env, "linux")) { + result = 1; /* always broken */ + } else if (strstr(env, "screen") != 0 + && ((env = getenv("TERMCAP")) != 0 + && strstr(env, "screen") != 0) + && strstr(env, "hhII00") != 0) { + if (CONTROL_N(enter_alt_charset_mode) || + CONTROL_O(enter_alt_charset_mode) || + CONTROL_N(set_attributes) || + CONTROL_O(set_attributes)) { + result = 1; + } + } + } + returnCode(result); +} + +NCURSES_EXPORT(int) +TINFO_SETUP_TERM(TERMINAL **tp, + const char *tname, + int Filedes, + int *errret, + int reuse) +{ +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB = 0; +#endif + TERMINAL *termp; + SCREEN *sp = 0; + char *myname; + int code = ERR; + + START_TRACE(); + +#ifdef USE_TERM_DRIVER + T((T_CALLED("_nc_setupterm_ex(%p,%s,%d,%p)"), + (void *) tp, _nc_visbuf(tname), Filedes, (void *) errret)); + + if (tp == 0) { + ret_error0(TGETENT_ERR, + "Invalid parameter, internal error.\n"); + } else + termp = *tp; +#else + termp = cur_term; + T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, (void *) errret)); +#endif + + if (tname == 0) { + tname = getenv("TERM"); +#if defined(EXP_WIN32_DRIVER) + if (!VALID_TERM_ENV(tname, NO_TERMINAL)) { + T(("Failure with TERM=%s", NonNull(tname))); + ret_error0(TGETENT_ERR, "TERM environment variable not set.\n"); + } +#elif defined(USE_TERM_DRIVER) + if (!NonEmpty(tname)) + tname = "unknown"; +#else + if (!NonEmpty(tname)) { + T(("Failure with TERM=%s", NonNull(tname))); + ret_error0(TGETENT_ERR, "TERM environment variable not set.\n"); + } +#endif + } + myname = strdup(tname); + if (myname == NULL || strlen(myname) > MAX_NAME_SIZE) { + ret_error(TGETENT_ERR, + "TERM environment must be 1..%d characters.\n", + MAX_NAME_SIZE, + free(myname)); + } + + T(("your terminal name is %s", myname)); + + /* + * Allow output redirection. This is what SVr3 does. If stdout is + * directed to a file, screen updates go to standard error. + */ + if (Filedes == STDOUT_FILENO && !NC_ISATTY(Filedes)) + Filedes = STDERR_FILENO; +#if defined(EXP_WIN32_DRIVER) + if (Filedes != STDERR_FILENO && NC_ISATTY(Filedes)) + _setmode(Filedes, _O_BINARY); +#endif + + /* + * Check if we have already initialized to use this terminal. If so, we + * do not need to re-read the terminfo entry, or obtain TTY settings. + * + * This is an improvement on SVr4 curses. If an application mixes curses + * and termcap calls, it may call both initscr and tgetent. This is not + * really a good thing to do, but can happen if someone tries using ncurses + * with the readline library. The problem we are fixing is that when + * tgetent calls setupterm, the resulting Ottyb struct in cur_term is + * zeroed. A subsequent call to endwin uses the zeroed terminal settings + * rather than the ones saved in initscr. So we check if cur_term appears + * to contain terminal settings for the same output file as our current + * call - and copy those terminal settings. (SVr4 curses does not do this, + * however applications that are working around the problem will still work + * properly with this feature). + */ + if (reuse + && (termp != 0) + && termp->Filedes == Filedes + && termp->_termname != 0 + && !strcmp(termp->_termname, myname) + && _nc_name_match(TerminalType(termp).term_names, myname, "|")) { + T(("reusing existing terminal information and mode-settings")); + code = OK; +#ifdef USE_TERM_DRIVER + TCB = (TERMINAL_CONTROL_BLOCK *) termp; +#endif + } else { +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *my_tcb; + termp = 0; + if ((my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1)) != 0) + termp = &(my_tcb->term); +#else + int status; + + termp = typeCalloc(TERMINAL, 1); +#endif + if (termp == 0) { + ret_error1(TGETENT_ERR, + "Not enough memory to create terminal structure.\n", + myname, free(myname)); + } + ++_nc_globals.terminal_count; +#if HAVE_SYSCONF + { + long limit; +#ifdef LINE_MAX + limit = LINE_MAX; +#else + limit = _nc_globals.getstr_limit; +#endif +#ifdef _SC_LINE_MAX + if (limit < sysconf(_SC_LINE_MAX)) + limit = sysconf(_SC_LINE_MAX); +#endif + if (_nc_globals.getstr_limit < (int) limit) + _nc_globals.getstr_limit = (int) limit; + } +#endif /* HAVE_SYSCONF */ + T(("using %d for getstr limit", _nc_globals.getstr_limit)); + +#ifdef USE_TERM_DRIVER + INIT_TERM_DRIVER(); + /* + * _nc_get_driver() will call td_CanHandle() for each driver, and win_driver + * needs file descriptor to do the test, so set it before calling. + */ + termp->Filedes = (short) Filedes; + TCB = (TERMINAL_CONTROL_BLOCK *) termp; + code = _nc_globals.term_driver(TCB, myname, errret); + if (code == OK) { + termp->_termname = strdup(myname); + } else { + ret_error1(errret ? *errret : TGETENT_ERR, + "Could not find any driver to handle terminal.\n", + myname, free(myname)); + } +#else +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP + status = _nc_setup_tinfo(myname, &TerminalType(termp)); + T(("_nc_setup_tinfo returns %d", status)); +#else + T(("no database available")); + status = TGETENT_NO; +#endif + + /* try fallback list if entry on disk */ + if (status != TGETENT_YES) { + const TERMTYPE2 *fallback = _nc_fallback2(myname); + + if (fallback) { + T(("found fallback entry")); + _nc_copy_termtype2(&(TerminalType(termp)), fallback); + status = TGETENT_YES; + } + } + + if (status != TGETENT_YES) { + del_curterm(termp); + if (status == TGETENT_ERR) { + free(myname); + ret_error0(status, "terminals database is inaccessible\n"); + } else if (status == TGETENT_NO) { + ret_error1(status, "unknown terminal type.\n", + myname, free(myname)); + } else { + free(myname); + ret_error0(status, "unexpected return-code\n"); + } + } +#if NCURSES_EXT_NUMBERS + _nc_export_termtype2(&termp->type, &TerminalType(termp)); +#endif +#if !USE_REENTRANT + save_ttytype(termp); +#endif + + termp->Filedes = (short) Filedes; + termp->_termname = strdup(myname); + + set_curterm(termp); + + if (VALID_STRING(command_character)) + _nc_tinfo_cmdch(termp, UChar(*command_character)); + + /* + * If an application calls setupterm() rather than initscr() or + * newterm(), we will not have the def_prog_mode() call in + * _nc_setupscreen(). Do it now anyway, so we can initialize the + * baudrate. Also get the shell-mode so that erasechar() works. + */ + if (NC_ISATTY(Filedes)) { + NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); + NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); + NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); + } + code = OK; +#endif + } + +#ifdef USE_TERM_DRIVER + *tp = termp; + NCURSES_SP_NAME(set_curterm) (sp, termp); + TCB->drv->td_init(TCB); +#else + sp = SP; +#endif + + /* + * We should always check the screensize, just in case. + */ + TINFO_GET_SIZE(sp, termp, ptrLines(sp), ptrCols(sp)); + + if (errret) + *errret = TGETENT_YES; + +#ifndef USE_TERM_DRIVER + if (generic_type) { + /* + * BSD 4.3's termcap contains mis-typed "gn" for wy99. Do a sanity + * check before giving up. + */ + if ((VALID_STRING(cursor_address) + || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home))) + && VALID_STRING(clear_screen)) { + ret_error1(TGETENT_YES, "terminal is not really generic.\n", + myname, free(myname)); + } else { + del_curterm(termp); + ret_error1(TGETENT_NO, "I need something more specific.\n", + myname, free(myname)); + } + } else if (hard_copy) { + ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", + myname, free(myname)); + } +#endif + free(myname); + returnCode(code); +} + +#ifdef USE_PTHREADS +/* + * Returns a non-null pointer unless a new screen should be allocated because + * no match was found in the pre-screen cache. + */ +NCURSES_EXPORT(SCREEN *) +_nc_find_prescr(void) +{ + SCREEN *result = 0; + PRESCREEN_LIST *p; + pthread_t id = GetThreadID(); + for (p = _nc_prescreen.allocated; p != 0; p = p->next) { + if (p->id == id) { + result = p->sp; + break; + } + } + return result; +} + +/* + * Tells ncurses to forget that this thread was associated with the pre-screen + * cache. It does not modify the pre-screen cache itself, since that is used + * for creating new screens. + */ +NCURSES_EXPORT(void) +_nc_forget_prescr(void) +{ + PRESCREEN_LIST *p, *q; + pthread_t id = GetThreadID(); + _nc_lock_global(screen); + for (p = _nc_prescreen.allocated, q = 0; p != 0; q = p, p = p->next) { + if (p->id == id) { + if (q) { + q->next = p->next; + } else { + _nc_prescreen.allocated = p->next; + } + free(p); + break; + } + } + _nc_unlock_global(screen); +} +#endif /* USE_PTHREADS */ + +#if NCURSES_SP_FUNCS +/* + * In case of handling multiple screens, we need to have a screen before + * initialization in _nc_setupscreen takes place. This is to extend the + * substitute for some of the stuff in _nc_prescreen, especially for slk and + * ripoff handling which should be done per screen. + */ +NCURSES_EXPORT(SCREEN *) +new_prescr(void) +{ + SCREEN *sp; + + START_TRACE(); + T((T_CALLED("new_prescr()"))); + + _nc_lock_global(screen); + if ((sp = _nc_find_prescr()) == 0) { + sp = _nc_alloc_screen_sp(); + T(("_nc_alloc_screen_sp %p", (void *) sp)); + if (sp != 0) { +#ifdef USE_PTHREADS + PRESCREEN_LIST *p = typeCalloc(PRESCREEN_LIST, 1); + if (p != 0) { + p->id = GetThreadID(); + p->sp = sp; + p->next = _nc_prescreen.allocated; + _nc_prescreen.allocated = p; + } +#else + _nc_prescreen.allocated = sp; +#endif + sp->rsp = sp->rippedoff; + sp->_filtered = _nc_prescreen.filter_mode; + sp->_use_env = _nc_prescreen.use_env; +#if NCURSES_NO_PADDING + sp->_no_padding = _nc_prescreen._no_padding; +#endif + sp->slk_format = 0; + sp->_slk = 0; + sp->_prescreen = TRUE; + SP_PRE_INIT(sp); +#if USE_REENTRANT + sp->_TABSIZE = _nc_prescreen._TABSIZE; + sp->_ESCDELAY = _nc_prescreen._ESCDELAY; +#endif + } + } else { + T(("_nc_alloc_screen_sp %p (reuse)", (void *) sp)); + } + _nc_unlock_global(screen); + returnSP(sp); +} +#endif + +#ifdef USE_TERM_DRIVER +/* + * This entrypoint is called from tgetent() to allow a special case of reusing + * the same TERMINAL data (see comment). + */ +NCURSES_EXPORT(int) +_nc_setupterm(const char *tname, + int Filedes, + int *errret, + int reuse) +{ + int rc = ERR; + TERMINAL *termp = 0; + + _nc_init_pthreads(); + _nc_lock_global(prescreen); + START_TRACE(); + if (TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse) == OK) { + _nc_forget_prescr(); + if (NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp) != 0) { + rc = OK; + } + } + _nc_unlock_global(prescreen); + + return rc; +} +#endif + +/* + * setupterm(termname, Filedes, errret) + * + * Find and read the appropriate object file for the terminal + * Make cur_term point to the structure. + */ +NCURSES_EXPORT(int) +setupterm(const char *tname, int Filedes, int *errret) +{ + START_TRACE(); + return _nc_setupterm(tname, Filedes, errret, FALSE); +} diff --git a/contrib/ncurses/ncurses/tinfo/lib_termcap.c b/contrib/ncurses/ncurses/tinfo/lib_termcap.c new file mode 100644 index 00000000..a5ac2ecc --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_termcap.c @@ -0,0 +1,429 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + * * + * some of the code in here was contributed by: * + * Magnus Bengtsson, d6mbeng@dtek.chalmers.se (Nov'93) * + * (but it has changed a lot) * + ****************************************************************************/ + +#define __INTERNAL_CAPS_VISIBLE +#include + +#include +#include +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_termcap.c,v 1.90 2024/07/27 19:22:23 tom Exp $") + +NCURSES_EXPORT_VAR(char *) UP = 0; +NCURSES_EXPORT_VAR(char *) BC = 0; + +#define MyCache _nc_globals.tgetent_cache +#define CacheInx _nc_globals.tgetent_index +#define CacheSeq _nc_globals.tgetent_sequence + +#define FIX_SGR0 MyCache[CacheInx].fix_sgr0 +#define LAST_TRM MyCache[CacheInx].last_term +#define LAST_BUF MyCache[CacheInx].last_bufp +#define LAST_USE MyCache[CacheInx].last_used +#define LAST_SEQ MyCache[CacheInx].sequence + +/* + * Termcap names are matched only using the first two bytes. + * Ignore any extended names longer than two bytes, to avoid problems + * with legacy code which passes in parameters whose use is long forgotten. + */ +#define ValidCap(cap) (((cap)[0] != '\0') && ((cap)[1] != '\0')) +#define SameCap(a,b) (((a)[0] == (b)[0]) && ((a)[1] == (b)[1])) +#define ValidExt(ext) (ValidCap(ext) && (ext)[2] == '\0') + +/*************************************************************************** + * + * tgetent(bufp, term) + * + * In termcap, this function reads in the entry for terminal `term' into the + * buffer pointed to by bufp. It must be called before any of the functions + * below are called. + * In this terminfo emulation, tgetent() simply calls setupterm() (which + * does a bit more than tgetent() in termcap does), and returns its return + * value (1 if successful, 0 if no terminal with the given name could be + * found, or -1 if no terminal descriptions have been installed on the + * system). The bufp argument is ignored. + * + ***************************************************************************/ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name) +{ + int rc = ERR; + int n; + bool found_cache = FALSE; +#ifdef USE_TERM_DRIVER + TERMINAL *termp = 0; +#endif + + START_TRACE(); + T((T_CALLED("tgetent()"))); + + TINFO_SETUP_TERM(&termp, name, STDOUT_FILENO, &rc, TRUE); + +#ifdef USE_TERM_DRIVER + if (termp == 0 || + !((TERMINAL_CONTROL_BLOCK *) termp)->drv->isTerminfo) + returnCode(rc); +#endif + + /* + * In general we cannot tell if the fixed sgr0 is still used by the + * caller, but if tgetent() is called with the same buffer, that is + * good enough, since the previous data would be invalidated by the + * current call. + * + * bufp may be a null pointer, e.g., GNU termcap. That allocates data, + * which is good until the next tgetent() call. The conventional termcap + * is inconvenient because of the fixed buffer size, but because it uses + * caller-supplied buffers, can have multiple terminal descriptions in + * use at a given time. + */ + for (n = 0; n < TGETENT_MAX; ++n) { + bool same_result = (MyCache[n].last_used && MyCache[n].last_bufp == bufp); + if (same_result) { + CacheInx = n; + if (FIX_SGR0 != 0) { + FreeAndNull(FIX_SGR0); + } + /* + * Also free the terminfo data that we loaded (much bigger leak). + */ + if (LAST_TRM != 0 && LAST_TRM != TerminalOf(SP_PARM)) { + const TERMINAL *trm = LAST_TRM; + NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx LAST_TRM); + for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) + if (LAST_TRM == trm) + LAST_TRM = 0; + CacheInx = n; + } + found_cache = TRUE; + break; + } + } + if (!found_cache) { + int best = 0; + + for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { + if (LAST_SEQ < MyCache[best].sequence) { + best = CacheInx; + } + } + CacheInx = best; + } + if (rc == 1) { + LAST_TRM = TerminalOf(SP_PARM); + LAST_SEQ = ++CacheSeq; + } else { + LAST_TRM = 0; + } + + PC = 0; + UP = 0; + BC = 0; + FIX_SGR0 = 0; /* don't free it - application may still use */ + + if (rc == 1) { + + if (cursor_left) + if ((backspaces_with_bs = (char) !strcmp(cursor_left, "\b")) == 0) + backspace_if_not_bs = cursor_left; + + /* we're required to export these */ + if (pad_char != NULL) + PC = pad_char[0]; + if (cursor_up != NULL) + UP = cursor_up; + if (backspace_if_not_bs != NULL) + BC = backspace_if_not_bs; + + if ((FIX_SGR0 = _nc_trim_sgr0(&TerminalType(TerminalOf(SP_PARM)))) + != 0) { + if (!strcmp(FIX_SGR0, exit_attribute_mode)) { + if (FIX_SGR0 != exit_attribute_mode) { + free(FIX_SGR0); + } + FIX_SGR0 = 0; + } + } + LAST_BUF = bufp; + LAST_USE = TRUE; + + SetNoPadding(SP_PARM); + (void) NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); /* sets ospeed as a side-effect */ + +/* LINT_PREPRO +#if 0*/ +#include +/* LINT_PREPRO +#endif*/ + + } + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +tgetent(char *bufp, const char *name) +{ + return NCURSES_SP_NAME(tgetent) (CURRENT_SCREEN, bufp, name); +} +#endif + +#if 0 +static bool +same_tcname(const char *a, const char *b) +{ + bool code = SameCap(a, b); + fprintf(stderr, "compare(%s,%s) %s\n", a, b, code ? "same" : "diff"); + return code; +} + +#else +#define same_tcname(a,b) SameCap(a,b) +#endif + +/*************************************************************************** + * + * tgetflag(str) + * + * Look up boolean termcap capability str and return its value (TRUE=1 if + * present, FALSE=0 if not). + * + ***************************************************************************/ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx const char *id) +{ + int result = 0; /* Solaris returns zero for missing flag */ + + T((T_CALLED("tgetflag(%p, %s)"), (void *) SP_PARM, id)); + if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { + TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); + struct name_table_entry const *entry_ptr; + int j = -1; + + entry_ptr = _nc_find_type_entry(id, BOOLEAN, TRUE); + if (entry_ptr != 0) { + j = entry_ptr->nte_index; + } +#if NCURSES_XNAMES + else { + int i; + for_each_ext_boolean(i, tp) { + const char *capname = ExtBoolname(tp, i, boolcodes); + if (same_tcname(id, capname) && ValidExt(capname)) { + j = i; + break; + } + } + } +#endif + if (j >= 0) { + /* note: setupterm forces invalid booleans to false */ + result = tp->Booleans[j]; + } + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +tgetflag(const char *id) +{ + return NCURSES_SP_NAME(tgetflag) (CURRENT_SCREEN, id); +} +#endif + +/*************************************************************************** + * + * tgetnum(str) + * + * Look up numeric termcap capability str and return its value, or -1 if + * not given. + * + ***************************************************************************/ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx const char *id) +{ + int result = ABSENT_NUMERIC; + + T((T_CALLED("tgetnum(%p, %s)"), (void *) SP_PARM, id)); + if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { + TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); + struct name_table_entry const *entry_ptr; + int j = -1; + + entry_ptr = _nc_find_type_entry(id, NUMBER, TRUE); + if (entry_ptr != 0) { + j = entry_ptr->nte_index; + } +#if NCURSES_XNAMES + else { + int i; + for_each_ext_number(i, tp) { + const char *capname = ExtNumname(tp, i, numcodes); + if (same_tcname(id, capname) && ValidExt(capname)) { + j = i; + break; + } + } + } +#endif + if (j >= 0) { + if (VALID_NUMERIC(tp->Numbers[j])) + result = tp->Numbers[j]; + } + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +tgetnum(const char *id) +{ + return NCURSES_SP_NAME(tgetnum) (CURRENT_SCREEN, id); +} +#endif + +/*************************************************************************** + * + * tgetstr(str, area) + * + * Look up string termcap capability str and return a pointer to its value, + * or NULL if not given. + * + ***************************************************************************/ + +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx const char *id, char **area) +{ + char *result = NULL; + + T((T_CALLED("tgetstr(%s,%p)"), id, (void *) area)); + if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { + TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); + struct name_table_entry const *entry_ptr; + int j = -1; + + entry_ptr = _nc_find_type_entry(id, STRING, TRUE); + if (entry_ptr != 0) { + j = entry_ptr->nte_index; + } +#if NCURSES_XNAMES + else { + int i; + for_each_ext_string(i, tp) { + const char *capname = ExtStrname(tp, i, strcodes); + if (same_tcname(id, capname) && ValidExt(capname)) { + j = i; + break; + } + } + } +#endif + if (j >= 0) { + result = tp->Strings[j]; + TR(TRACE_DATABASE, ("found match %d: %s", j, _nc_visbuf(result))); + /* setupterm forces canceled strings to null */ + if (VALID_STRING(result)) { + if (result == exit_attribute_mode + && FIX_SGR0 != 0) { + result = FIX_SGR0; + TR(TRACE_DATABASE, ("altered to : %s", _nc_visbuf(result))); + } + if (area != 0 + && *area != 0) { + _nc_STRCPY(*area, result, 1024); + result = *area; + *area += strlen(*area) + 1; + } + } + } + } + returnPtr(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +tgetstr(const char *id, char **area) +{ + return NCURSES_SP_NAME(tgetstr) (CURRENT_SCREEN, id, area); +} +#endif + +#if NO_LEAKS +#undef CacheInx +#define CacheInx num +NCURSES_EXPORT(void) +_nc_tgetent_leak(const TERMINAL *const termp) +{ + if (termp != 0) { + int num; + for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { + if (LAST_TRM == termp) { + FreeAndNull(FIX_SGR0); + if (LAST_TRM != 0) { + LAST_TRM = 0; + } + break; + } + } + } +} + +NCURSES_EXPORT(void) +_nc_tgetent_leaks(void) +{ + int num; + for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { + if (LAST_TRM != 0) { + del_curterm(LAST_TRM); + _nc_tgetent_leak(LAST_TRM); + } + } +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_termname.c b/contrib/ncurses/ncurses/tinfo/lib_termname.c new file mode 100644 index 00000000..2d80bb34 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_termname.c @@ -0,0 +1,59 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2003,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_termname.c,v 1.13 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(termname) (NCURSES_SP_DCL0) +{ + char *name = 0; + + T((T_CALLED("termname(%p)"), (void *) SP_PARM)); + +#if NCURSES_SP_FUNCS + if (TerminalOf(SP_PARM) != 0) { + name = TerminalOf(SP_PARM)->_termname; + } +#else + if (cur_term != 0) + name = cur_term->_termname; +#endif + + returnPtr(name); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +termname(void) +{ + return NCURSES_SP_NAME(termname) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_tgoto.c b/contrib/ncurses/ncurses/tinfo/lib_tgoto.c new file mode 100644 index 00000000..58b561fa --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_tgoto.c @@ -0,0 +1,222 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * Copyright 2000-2008,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include + +#include +#include + +MODULE_ID("$Id: lib_tgoto.c,v 1.23 2023/04/16 17:19:40 tom Exp $") + +#if !PURE_TERMINFO +static bool +is_termcap(const char *string) +{ + bool result = TRUE; + + if (string == 0 || *string == '\0') { + result = FALSE; /* tparm() handles empty strings */ + } else { + while ((*string != '\0') && result) { + if (*string == '%') { + switch (*++string) { + case 'p': + result = FALSE; + break; + case '\0': + string--; + break; + } + } else if (string[0] == '$' && string[1] == '<') { + result = FALSE; + } + string++; + } + } + return result; +} + +static char * +tgoto_internal(const char *string, int x, int y) +{ + static char *result; + static size_t length; + + int swap_arg; + int param[3]; + size_t used = 0; + size_t need = 10; + int *value = param; + bool need_BC = FALSE; + + if (BC) + need += strlen(BC); + + param[0] = y; + param[1] = x; + param[2] = 0; + + while (*string != 0) { + if ((used + need) > length) { + length += (used + need); + if ((result = typeRealloc(char, length, result)) == 0) { + length = 0; + break; + } + } + if (*string == '%') { + const char *fmt = 0; + + switch (*++string) { + case '\0': + string--; + break; + case 'd': + fmt = "%d"; + break; + case '2': + fmt = "%02d"; + *value %= 100; + break; + case '3': + fmt = "%03d"; + *value %= 1000; + break; + case '+': + *value += UChar(*++string); + /* FALLTHRU */ + case '.': + /* + * Guard against tputs() seeing a truncated string. The + * termcap documentation refers to a similar fixup for \n + * and \r, but I don't see that it could work -TD + */ + if (*value == 0) { + if (BC != 0) { + *value += 1; + need_BC = TRUE; + } else { + /* tputs will pretend this is \0, which will almost + * always work since ANSI-compatible terminals ignore + * the character. ECMA-48 does not document a C1 + * control for this value. A few (obsolete) terminals + * can use this value in special cases, such as cursor + * addressing using single-byte coordinates. + */ + *value = 0200; + } + } + result[used++] = (char) *value++; + break; + case '%': + result[used++] = *string; + break; + case 'r': + swap_arg = param[0]; + param[0] = param[1]; + param[1] = swap_arg; + break; + case 'i': + param[0] += 1; + param[1] += 1; + break; + case '>': + if (*value > string[1]) + *value += string[2]; + string += 2; + break; + case 'n': /* Datamedia 2500 */ + param[0] ^= 0140; + param[1] ^= 0140; + break; + case 'B': /* BCD */ + *value = 16 * (*value / 10) + (*value % 10); + break; + case 'D': /* Reverse coding (Delta Data) */ + *value -= 2 * (*value % 16); + break; + } + if (fmt != 0) { + _nc_SPRINTF(result + used, _nc_SLIMIT(length - used) + fmt, *value++); + used += strlen(result + used); + fmt = 0; + } + if (value - param > 2) { + value = param + 2; + *value = 0; + } + } else { + result[used++] = *string; + } + string++; + } + if (result != 0) { + if (need_BC) { + _nc_STRCPY(result + used, BC, length - used); + used += strlen(BC); + } + result[used] = '\0'; + } + return result; +} +#endif + +/* + * Retained solely for upward compatibility. Note the intentional reversing of + * the last two arguments when invoking tparm(). + */ +NCURSES_EXPORT(char *) +tgoto(const char *string, int x, int y) +{ + char *result; + + T((T_CALLED("tgoto(%s, %d, %d)"), _nc_visbuf(string), x, y)); +#if !PURE_TERMINFO + if (is_termcap(string)) + result = tgoto_internal(string, x, y); + else +#endif + if ((result = TIPARM_2(string, y, x)) == NULL) { + /* + * Because termcap did not provide a more general solution such as + * tparm(), it was necessary to handle single-parameter capabilities + * using tgoto(). The internal _nc_tiparm() function returns a NULL + * for that case; retry for the single-parameter case. + */ + if ((result = TIPARM_1(string, y)) == NULL) { + result = TIPARM_0(string); + } + } + returnPtr(result); +} diff --git a/contrib/ncurses/ncurses/tinfo/lib_ti.c b/contrib/ncurses/ncurses/tinfo/lib_ti.c new file mode 100644 index 00000000..5cb77b85 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_ti.c @@ -0,0 +1,188 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +#include + +#include + +MODULE_ID("$Id: lib_ti.c,v 1.34 2020/02/02 23:34:34 tom Exp $") + +#if 0 +static bool +same_name(const char *a, const char *b) +{ + fprintf(stderr, "compare(%s,%s)\n", a, b); + return !strcmp(a, b); +} +#else +#define same_name(a,b) !strcmp(a,b) +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx const char *str) +{ + int result = ABSENT_BOOLEAN; + + T((T_CALLED("tigetflag(%p, %s)"), (void *) SP_PARM, str)); + + if (HasTInfoTerminal(SP_PARM)) { + TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); + struct name_table_entry const *entry_ptr; + int j = -1; + + entry_ptr = _nc_find_type_entry(str, BOOLEAN, FALSE); + if (entry_ptr != 0) { + j = entry_ptr->nte_index; + } +#if NCURSES_XNAMES + else { + int i; + for_each_ext_boolean(i, tp) { + const char *capname = ExtBoolname(tp, i, boolnames); + if (same_name(str, capname)) { + j = i; + break; + } + } + } +#endif + if (j >= 0) { + /* note: setupterm forces invalid booleans to false */ + result = tp->Booleans[j]; + } + } + + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +tigetflag(const char *str) +{ + return NCURSES_SP_NAME(tigetflag) (CURRENT_SCREEN, str); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx const char *str) +{ + int result = CANCELLED_NUMERIC; /* Solaris returns a -1 on error */ + + T((T_CALLED("tigetnum(%p, %s)"), (void *) SP_PARM, str)); + + if (HasTInfoTerminal(SP_PARM)) { + TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); + struct name_table_entry const *entry_ptr; + int j = -1; + + entry_ptr = _nc_find_type_entry(str, NUMBER, FALSE); + if (entry_ptr != 0) { + j = entry_ptr->nte_index; + } +#if NCURSES_XNAMES + else { + int i; + for_each_ext_number(i, tp) { + const char *capname = ExtNumname(tp, i, numnames); + if (same_name(str, capname)) { + j = i; + break; + } + } + } +#endif + if (j >= 0) { + if (VALID_NUMERIC(tp->Numbers[j])) + result = tp->Numbers[j]; + else + result = ABSENT_NUMERIC; + } + } + + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +tigetnum(const char *str) +{ + return NCURSES_SP_NAME(tigetnum) (CURRENT_SCREEN, str); +} +#endif + +NCURSES_EXPORT(char *) +NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx const char *str) +{ + char *result = CANCELLED_STRING; + + T((T_CALLED("tigetstr(%p, %s)"), (void *) SP_PARM, str)); + + if (HasTInfoTerminal(SP_PARM)) { + TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); + struct name_table_entry const *entry_ptr; + int j = -1; + + entry_ptr = _nc_find_type_entry(str, STRING, FALSE); + if (entry_ptr != 0) { + j = entry_ptr->nte_index; + } +#if NCURSES_XNAMES + else { + int i; + for_each_ext_string(i, tp) { + const char *capname = ExtStrname(tp, i, strnames); + if (same_name(str, capname)) { + j = i; + break; + } + } + } +#endif + if (j >= 0) { + /* note: setupterm forces cancelled strings to null */ + result = tp->Strings[j]; + } + } + + returnPtr(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(char *) +tigetstr(const char *str) +{ + return NCURSES_SP_NAME(tigetstr) (CURRENT_SCREEN, str); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_tparm.c b/contrib/ncurses/ncurses/tinfo/lib_tparm.c new file mode 100644 index 00000000..2d8d3268 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_tparm.c @@ -0,0 +1,1408 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey, 1996 on * + ****************************************************************************/ + +/* + * tparm.c + * + */ + +#define entry _ncu_entry +#define ENTRY _ncu_ENTRY + +#include + +#undef entry +#undef ENTRY + +#if HAVE_TSEARCH +#include +#endif + +#include +#include + +MODULE_ID("$Id: lib_tparm.c,v 1.154 2024/07/27 19:22:23 tom Exp $") + +/* + * char * + * tparm(string, ...) + * + * Substitute the given parameters into the given string by the following + * rules (taken from terminfo(5)): + * + * Cursor addressing and other strings requiring parame- + * ters in the terminal are described by a parameterized string + * capability, with escapes like %x in it. For example, to + * address the cursor, the cup capability is given, using two + * parameters: the row and column to address to. (Rows and + * columns are numbered from zero and refer to the physical + * screen visible to the user, not to any unseen memory.) If + * the terminal has memory relative cursor addressing, that can + * be indicated by + * + * The parameter mechanism uses a stack and special % + * codes to manipulate it. Typically a sequence will push one + * of the parameters onto the stack and then print it in some + * format. Often more complex operations are necessary. + * + * The % encodings have the following meanings: + * + * %% outputs `%' + * %c print pop() like %c in printf() + * %s print pop() like %s in printf() + * %[[:]flags][width[.precision]][doxXs] + * as in printf, flags are [-+#] and space + * The ':' is used to avoid making %+ or %- + * patterns (see below). + * + * %p[1-9] push ith parm + * %P[a-z] set dynamic variable [a-z] to pop() + * %g[a-z] get dynamic variable [a-z] and push it + * %P[A-Z] set static variable [A-Z] to pop() + * %g[A-Z] get static variable [A-Z] and push it + * %l push strlen(pop) + * %'c' push char constant c + * %{nn} push integer constant nn + * + * %+ %- %* %/ %m + * arithmetic (%m is mod): push(pop() op pop()) + * %& %| %^ bit operations: push(pop() op pop()) + * %= %> %< logical operations: push(pop() op pop()) + * %A %O logical and & or operations for conditionals + * %! %~ unary operations push(op pop()) + * %i add 1 to first two parms (for ANSI terminals) + * + * %? expr %t thenpart %e elsepart %; + * if-then-else, %e elsepart is optional. + * else-if's are possible ala Algol 68: + * %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e b5 %; + * + * For those of the above operators which are binary and not commutative, + * the stack works in the usual way, with + * %gx %gy %m + * resulting in x mod y, not the reverse. + */ + +NCURSES_EXPORT_VAR(int) _nc_tparm_err = 0; + +#define TPS(var) tps->var +#define popcount _nc_popcount /* workaround for NetBSD 6.0 defect */ + +#define get_tparm_state(term) \ + (term != NULL \ + ? &(term->tparm_state) \ + : &(_nc_prescreen.tparm_state)) + +#define isUPPER(c) ((c) >= 'A' && (c) <= 'Z') +#define isLOWER(c) ((c) >= 'a' && (c) <= 'z') +#define tc_BUMP() if (level < 0 && number < 2) number++ + +typedef struct { + const char *format; /* format-string can be used as cache-key */ + int tparm_type; /* bit-set for each string-parameter */ + int num_actual; + int num_parsed; + int num_popped; + TPARM_ARG param[NUM_PARM]; + char *p_is_s[NUM_PARM]; +} TPARM_DATA; + +#if HAVE_TSEARCH +#define MyCache _nc_globals.cached_tparm +#define MyCount _nc_globals.count_tparm +static int which_tparm; +static TPARM_DATA **delete_tparm; +#endif /* HAVE_TSEARCH */ + +static char dummy[] = ""; /* avoid const-cast */ + +#if HAVE_TSEARCH +static int +cmp_format(const void *p, const void *q) +{ + const char *a = *(char *const *) p; + const char *b = *(char *const *) q; + return strcmp(a, b); +} +#endif + +#if HAVE_TSEARCH +static void +visit_nodes(const void *nodep, VISIT which, int depth) +{ + (void) depth; + if (which == preorder || which == leaf) { + delete_tparm[which_tparm] = *(TPARM_DATA **) nodep; + which_tparm++; + } +} +#endif + +NCURSES_EXPORT(void) +_nc_free_tparm(TERMINAL *termp) +{ + TPARM_STATE *tps = get_tparm_state(termp); +#if HAVE_TSEARCH + if (MyCount != 0) { + delete_tparm = typeCalloc(TPARM_DATA *, MyCount); + if (delete_tparm != NULL) { + which_tparm = 0; + twalk(MyCache, visit_nodes); + for (which_tparm = 0; which_tparm < MyCount; ++which_tparm) { + TPARM_DATA *ptr = delete_tparm[which_tparm]; + if (ptr != NULL) { + tdelete(ptr, &MyCache, cmp_format); + free((char *) ptr->format); + free(ptr); + } + } + which_tparm = 0; + twalk(MyCache, visit_nodes); + FreeAndNull(delete_tparm); + } + MyCount = 0; + which_tparm = 0; + } +#endif + FreeAndNull(TPS(out_buff)); + TPS(out_size) = 0; + TPS(out_used) = 0; + + FreeAndNull(TPS(fmt_buff)); + TPS(fmt_size) = 0; +} + +static int +tparm_error(TPARM_STATE *tps, const char *message) +{ + (void) tps; + (void) message; + DEBUG(2, ("%s: %s", message, _nc_visbuf(TPS(tparam_base)))); + return ++_nc_tparm_err; +} + +#define get_space(tps, need) \ +{ \ + size_t need2get = need + TPS(out_used); \ + if (need2get > TPS(out_size)) { \ + TPS(out_size) = need2get * 2; \ + TYPE_REALLOC(char, TPS(out_size), TPS(out_buff)); \ + } \ +} + +#if NCURSES_EXPANDED +static NCURSES_INLINE void + (get_space) (TPARM_STATE *tps, size_t need) { + get_space(tps, need); +} + +#undef get_space +#endif + +#define save_text(tps, fmt, s, len) \ +{ \ + size_t s_len = (size_t) len + strlen(s) + strlen(fmt); \ + get_space(tps, s_len + 1); \ + _nc_SPRINTF(TPS(out_buff) + TPS(out_used), \ + _nc_SLIMIT(TPS(out_size) - TPS(out_used)) \ + fmt, s); \ + TPS(out_used) += strlen(TPS(out_buff) + TPS(out_used)); \ +} + +#if NCURSES_EXPANDED +static NCURSES_INLINE void + (save_text) (TPARM_STATE *tps, const char *fmt, const char *s, int len) { + save_text(tps, fmt, s, len); +} + +#undef save_text +#endif + +#define save_number(tps, fmt, number, len) \ +{ \ + size_t s_len = (size_t) len + 30 + strlen(fmt); \ + get_space(tps, s_len + 1); \ + _nc_SPRINTF(TPS(out_buff) + TPS(out_used), \ + _nc_SLIMIT(TPS(out_size) - TPS(out_used)) \ + fmt, number); \ + TPS(out_used) += strlen(TPS(out_buff) + TPS(out_used)); \ +} + +#if NCURSES_EXPANDED +static NCURSES_INLINE void + (save_number) (TPARM_STATE *tps, const char *fmt, int number, int len) { + save_number(tps, fmt, number, len); +} + +#undef save_number +#endif + +#define save_char(tps, c) \ +{ \ + get_space(tps, (size_t) 1); \ + TPS(out_buff)[TPS(out_used)++] = (char) ((c == 0) ? 0200 : c); \ +} + +#if NCURSES_EXPANDED +static NCURSES_INLINE void + (save_char) (TPARM_STATE *tps, int c) { + save_char(tps, c); +} + +#undef save_char +#endif + +#define npush(tps, x) \ +{ \ + if (TPS(stack_ptr) < STACKSIZE) { \ + TPS(stack)[TPS(stack_ptr)].num_type = TRUE; \ + TPS(stack)[TPS(stack_ptr)].data.num = x; \ + TPS(stack_ptr)++; \ + } else { \ + (void) tparm_error(tps, "npush: stack overflow"); \ + } \ +} + +#if NCURSES_EXPANDED +static NCURSES_INLINE void + (npush) (TPARM_STATE *tps, int x) { + npush(tps, x); +} + +#undef npush +#endif + +#define spush(tps, x) \ +{ \ + if (TPS(stack_ptr) < STACKSIZE) { \ + TPS(stack)[TPS(stack_ptr)].num_type = FALSE; \ + TPS(stack)[TPS(stack_ptr)].data.str = x; \ + TPS(stack_ptr)++; \ + } else { \ + (void) tparm_error(tps, "spush: stack overflow"); \ + } \ +} + +#if NCURSES_EXPANDED +static NCURSES_INLINE void + (spush) (TPARM_STATE *tps, char *x) { + spush(tps, x); +} + +#undef spush +#endif + +#define npop(tps) \ + ((TPS(stack_ptr)-- > 0) \ + ? ((TPS(stack)[TPS(stack_ptr)].num_type) \ + ? TPS(stack)[TPS(stack_ptr)].data.num \ + : 0) \ + : (tparm_error(tps, "npop: stack underflow"), \ + TPS(stack_ptr) = 0)) + +#if NCURSES_EXPANDED +static NCURSES_INLINE int + (npop) (TPARM_STATE *tps) { + return npop(tps); +} +#undef npop +#endif + +#define spop(tps) \ + ((TPS(stack_ptr)-- > 0) \ + ? ((!TPS(stack)[TPS(stack_ptr)].num_type \ + && TPS(stack)[TPS(stack_ptr)].data.str != 0) \ + ? TPS(stack)[TPS(stack_ptr)].data.str \ + : dummy) \ + : (tparm_error(tps, "spop: stack underflow"), \ + dummy)) + +#if NCURSES_EXPANDED +static NCURSES_INLINE char * + (spop) (TPARM_STATE *tps) { + return spop(tps); +} +#undef spop +#endif + +static NCURSES_INLINE const char * +parse_format(const char *s, char *format, int *len) +{ + *len = 0; + if (format != 0) { + bool done = FALSE; + bool allowminus = FALSE; + bool dot = FALSE; + bool err = FALSE; + char *fmt = format; + int my_width = 0; + int my_prec = 0; + int value = 0; + + *len = 0; + *format++ = '%'; + while (*s != '\0' && !done) { + switch (*s) { + case 'c': /* FALLTHRU */ + case 'd': /* FALLTHRU */ + case 'o': /* FALLTHRU */ + case 'x': /* FALLTHRU */ + case 'X': /* FALLTHRU */ + case 's': +#ifdef EXP_XTERM_1005 + case 'u': +#endif + *format++ = *s; + done = TRUE; + break; + case '.': + *format++ = *s++; + if (dot) { + err = TRUE; + } else { /* value before '.' is the width */ + dot = TRUE; + my_width = value; + } + value = 0; + break; + case '#': + *format++ = *s++; + break; + case ' ': + *format++ = *s++; + break; + case ':': + s++; + allowminus = TRUE; + break; + case '-': + if (allowminus) { + *format++ = *s++; + } else { + done = TRUE; + } + break; + default: + if (isdigit(UChar(*s))) { + value = (value * 10) + (*s - '0'); + if (value > 10000) + err = TRUE; + *format++ = *s++; + } else { + done = TRUE; + } + } + } + + /* + * If we found an error, ignore (and remove) the flags. + */ + if (err) { + my_width = my_prec = value = 0; + format = fmt; + *format++ = '%'; + *format++ = *s; + } + + /* + * Any value after '.' is the precision. If we did not see '.', then + * the value is the width. + */ + if (dot) + my_prec = value; + else + my_width = value; + + *format = '\0'; + /* return maximum string length in print */ + *len = (my_width > my_prec) ? my_width : my_prec; + } + return s; +} + +/* + * Analyze the string to see how many parameters we need from the varargs list, + * and what their types are. We will only accept string parameters if they + * appear as a %l or %s format following an explicit parameter reference (e.g., + * %p2%s). All other parameters are numbers. + * + * 'number' counts coarsely the number of pop's we see in the string, and + * 'popcount' shows the highest parameter number in the string. We would like + * to simply use the latter count, but if we are reading termcap strings, there + * may be cases that we cannot see the explicit parameter numbers. + */ +NCURSES_EXPORT(int) +_nc_tparm_analyze(TERMINAL *term, const char *string, char **p_is_s, int *popcount) +{ + TPARM_STATE *tps = get_tparm_state(term); + size_t len2; + int i; + int lastpop = -1; + int len; + int number = 0; + int level = -1; + const char *cp = string; + + if (cp == 0) + return 0; + + if ((len2 = strlen(cp)) + 2 > TPS(fmt_size)) { + TPS(fmt_size) += len2 + 2; + TPS(fmt_buff) = typeRealloc(char, TPS(fmt_size), TPS(fmt_buff)); + if (TPS(fmt_buff) == 0) + return 0; + } + + memset(p_is_s, 0, sizeof(p_is_s[0]) * NUM_PARM); + *popcount = 0; + + while ((cp - string) < (int) len2) { + if (*cp == '%') { + cp++; + cp = parse_format(cp, TPS(fmt_buff), &len); + switch (*cp) { + default: + break; + + case 'd': /* FALLTHRU */ + case 'o': /* FALLTHRU */ + case 'x': /* FALLTHRU */ + case 'X': /* FALLTHRU */ + case 'c': /* FALLTHRU */ +#ifdef EXP_XTERM_1005 + case 'u': +#endif + if (lastpop <= 0) { + tc_BUMP(); + } + level -= 1; + lastpop = -1; + break; + + case 'l': + case 's': + if (lastpop > 0) { + level -= 1; + p_is_s[lastpop - 1] = dummy; + } + tc_BUMP(); + break; + + case 'p': + cp++; + i = (UChar(*cp) - '0'); + if (i >= 0 && i <= NUM_PARM) { + ++level; + lastpop = i; + if (lastpop > *popcount) + *popcount = lastpop; + } + break; + + case 'P': + ++cp; + break; + + case 'g': + ++level; + cp++; + break; + + case S_QUOTE: + ++level; + cp += 2; + lastpop = -1; + break; + + case L_BRACE: + ++level; + cp++; + while (isdigit(UChar(*cp))) { + cp++; + } + break; + + case '+': + case '-': + case '*': + case '/': + case 'm': + case 'A': + case 'O': + case '&': + case '|': + case '^': + case '=': + case '<': + case '>': + tc_BUMP(); + level -= 1; /* pop 2, operate, push 1 */ + lastpop = -1; + break; + + case '!': + case '~': + tc_BUMP(); + lastpop = -1; + break; + + case 'i': + /* will add 1 to first (usually two) parameters */ + break; + } + } + if (*cp != '\0') + cp++; + } + + if (number > NUM_PARM) + number = NUM_PARM; + return number; +} + +/* + * Analyze the capability string, finding the number of parameters and their + * types. + * + * TODO: cache the result so that this is done once per capability per term. + */ +static int +tparm_setup(TERMINAL *term, const char *string, TPARM_DATA *result) +{ + TPARM_STATE *tps = get_tparm_state(term); + int rc = OK; + + TPS(out_used) = 0; + memset(result, 0, sizeof(*result)); + + if (!VALID_STRING(string)) { + TR(TRACE_CALLS, ("%s: format is invalid", TPS(tname))); + rc = ERR; + } else { +#if HAVE_TSEARCH + TPARM_DATA *fs; + void *ft; + + result->format = string; + if ((ft = tfind(result, &MyCache, cmp_format)) != 0) { + size_t len2; + fs = *(TPARM_DATA **) ft; + *result = *fs; + if ((len2 = strlen(string)) + 2 > TPS(fmt_size)) { + TPS(fmt_size) += len2 + 2; + TPS(fmt_buff) = typeRealloc(char, TPS(fmt_size), TPS(fmt_buff)); + if (TPS(fmt_buff) == 0) + return ERR; + } + } else +#endif + { + /* + * Find the highest parameter-number referred to in the format + * string. Use this value to limit the number of arguments copied + * from the variable-length argument list. + */ + result->num_parsed = _nc_tparm_analyze(term, string, + result->p_is_s, + &(result->num_popped)); + if (TPS(fmt_buff) == 0) { + TR(TRACE_CALLS, ("%s: error in analysis", TPS(tname))); + rc = ERR; + } else { + int n; + + if (result->num_parsed > NUM_PARM) + result->num_parsed = NUM_PARM; + if (result->num_popped > NUM_PARM) + result->num_popped = NUM_PARM; + result->num_actual = Max(result->num_popped, result->num_parsed); + + for (n = 0; n < result->num_actual; ++n) { + if (result->p_is_s[n]) + result->tparm_type |= (1 << n); + } +#if HAVE_TSEARCH + if ((fs = typeCalloc(TPARM_DATA, 1)) != 0) { + *fs = *result; + if ((fs->format = strdup(string)) != 0) { + if (tsearch(fs, &MyCache, cmp_format) != 0) { + ++MyCount; + } else { + free(fs); + rc = ERR; + } + } else { + free(fs); + rc = ERR; + } + } else { + rc = ERR; + } +#endif + } + } + } + + return rc; +} + +/* + * A few caps (such as plab_norm) have string-valued parms. We'll have to + * assume that the caller knows the difference, since a char* and an int may + * not be the same size on the stack. The normal prototype for tparm uses 9 + * long's, which is consistent with our va_arg() usage. + */ +static void +tparm_copy_valist(TPARM_DATA *data, int use_TPARM_ARG, va_list ap) +{ + int i; + + for (i = 0; i < data->num_actual; i++) { + if (data->p_is_s[i] != 0) { + char *value = va_arg(ap, char *); + if (value == 0) + value = dummy; + data->p_is_s[i] = value; + data->param[i] = 0; + } else if (use_TPARM_ARG) { + data->param[i] = va_arg(ap, TPARM_ARG); + } else { + data->param[i] = (TPARM_ARG) va_arg(ap, int); + } + } +} + +/* + * This is a termcap compatibility hack. If there are no explicit pop + * operations in the string, load the stack in such a way that successive pops + * will grab successive parameters. That will make the expansion of (for + * example) \E[%d;%dH work correctly in termcap style, which means tparam() + * will expand termcap strings OK. + */ +static bool +tparm_tc_compat(TPARM_STATE *tps, TPARM_DATA *data) +{ + bool termcap_hack = FALSE; + + TPS(stack_ptr) = 0; + + if (data->num_popped == 0) { + int i; + + termcap_hack = TRUE; + for (i = data->num_parsed - 1; i >= 0; i--) { + if (data->p_is_s[i]) { + spush(tps, data->p_is_s[i]); + } else { + npush(tps, (int) data->param[i]); + } + } + } + return termcap_hack; +} + +#ifdef TRACE +static void +tparm_trace_call(TPARM_STATE *tps, const char *string, TPARM_DATA *data) +{ + if (USE_TRACEF(TRACE_CALLS)) { + int i; + for (i = 0; i < data->num_actual; i++) { + if (data->p_is_s[i] != 0) { + save_text(tps, ", %s", _nc_visbuf(data->p_is_s[i]), 0); + } else if ((long) data->param[i] > MAX_OF_TYPE(NCURSES_INT2) || + (long) data->param[i] < 0) { + _tracef("BUG: problem with tparm parameter #%d of %d", + i + 1, data->num_actual); + break; + } else { + save_number(tps, ", %d", (int) data->param[i], 0); + } + } + _tracef(T_CALLED("%s(%s%s)"), TPS(tname), _nc_visbuf(string), TPS(out_buff)); + TPS(out_used) = 0; + _nc_unlock_global(tracef); + } +} + +#else +#define tparm_trace_call(tps, string, data) /* nothing */ +#endif /* TRACE */ + +#define init_vars(name) \ + if (!name##_used) { \ + name##_used = TRUE; \ + memset(name##_vars, 0, sizeof(name##_vars)); \ + } + +static NCURSES_INLINE char * +tparam_internal(TPARM_STATE *tps, const char *string, TPARM_DATA *data) +{ + int number; + int len; + int level; + int x, y; + int i; + const char *s; + const char *cp = string; + size_t len2 = strlen(cp); + bool incremented_two = FALSE; + bool termcap_hack = tparm_tc_compat(tps, data); + /* + * SVr4 curses stores variables 'A' to 'Z' in the TERMINAL structure (so + * they are initialized once to zero), and variables 'a' to 'z' on the + * stack in tparm, referring to the former as "static" and the latter as + * "dynamic". However, it makes no check to ensure that the "dynamic" + * variables are initialized. + * + * Solaris xpg4 curses makes no distinction between the upper/lower, and + * stores the common set of 26 variables on the stack, without initializing + * them. + * + * In ncurses, both sets of variables are initialized on the first use. + */ + bool dynamic_used = FALSE; + int dynamic_vars[NUM_VARS]; + + tparm_trace_call(tps, string, data); + + if (TPS(fmt_buff) == NULL) { + T((T_RETURN(""))); + return NULL; + } + + while ((cp - string) < (int) len2) { + if (*cp != '%') { + save_char(tps, UChar(*cp)); + } else { + TPS(tparam_base) = cp++; + cp = parse_format(cp, TPS(fmt_buff), &len); + switch (*cp) { + default: + break; + case '%': + save_char(tps, '%'); + break; + + case 'd': /* FALLTHRU */ + case 'o': /* FALLTHRU */ + case 'x': /* FALLTHRU */ + case 'X': /* FALLTHRU */ + x = npop(tps); + save_number(tps, TPS(fmt_buff), x, len); + break; + + case 'c': /* FALLTHRU */ + x = npop(tps); + save_char(tps, x); + break; + +#ifdef EXP_XTERM_1005 + case 'u': + { + unsigned char target[10]; + unsigned source = (unsigned) npop(tps); + int rc = _nc_conv_to_utf8(target, source, (unsigned) + sizeof(target)); + int n; + for (n = 0; n < rc; ++n) { + save_char(tps, target[n]); + } + } + break; +#endif + case 'l': + s = spop(tps); + npush(tps, (int) strlen(s)); + break; + + case 's': + s = spop(tps); + save_text(tps, TPS(fmt_buff), s, len); + break; + + case 'p': + cp++; + i = (UChar(*cp) - '1'); + if (i >= 0 && i < NUM_PARM) { + if (data->p_is_s[i]) { + spush(tps, data->p_is_s[i]); + } else { + npush(tps, (int) data->param[i]); + } + } + break; + + case 'P': + cp++; + if (isUPPER(*cp)) { + i = (UChar(*cp) - 'A'); + TPS(static_vars)[i] = npop(tps); + } else if (isLOWER(*cp)) { + i = (UChar(*cp) - 'a'); + init_vars(dynamic); + dynamic_vars[i] = npop(tps); + } + break; + + case 'g': + cp++; + if (isUPPER(*cp)) { + i = (UChar(*cp) - 'A'); + npush(tps, TPS(static_vars)[i]); + } else if (isLOWER(*cp)) { + i = (UChar(*cp) - 'a'); + init_vars(dynamic); + npush(tps, dynamic_vars[i]); + } + break; + + case S_QUOTE: + cp++; + npush(tps, UChar(*cp)); + cp++; + break; + + case L_BRACE: + number = 0; + cp++; + while (isdigit(UChar(*cp))) { + number = (number * 10) + (UChar(*cp) - '0'); + cp++; + } + npush(tps, number); + break; + + case '+': + y = npop(tps); + x = npop(tps); + npush(tps, x + y); + break; + + case '-': + y = npop(tps); + x = npop(tps); + npush(tps, x - y); + break; + + case '*': + y = npop(tps); + x = npop(tps); + npush(tps, x * y); + break; + + case '/': + y = npop(tps); + x = npop(tps); + npush(tps, y ? (x / y) : 0); + break; + + case 'm': + y = npop(tps); + x = npop(tps); + npush(tps, y ? (x % y) : 0); + break; + + case 'A': + y = npop(tps); + x = npop(tps); + npush(tps, y && x); + break; + + case 'O': + y = npop(tps); + x = npop(tps); + npush(tps, y || x); + break; + + case '&': + y = npop(tps); + x = npop(tps); + npush(tps, x & y); + break; + + case '|': + y = npop(tps); + x = npop(tps); + npush(tps, x | y); + break; + + case '^': + y = npop(tps); + x = npop(tps); + npush(tps, x ^ y); + break; + + case '=': + y = npop(tps); + x = npop(tps); + npush(tps, x == y); + break; + + case '<': + y = npop(tps); + x = npop(tps); + npush(tps, x < y); + break; + + case '>': + y = npop(tps); + x = npop(tps); + npush(tps, x > y); + break; + + case '!': + x = npop(tps); + npush(tps, !x); + break; + + case '~': + x = npop(tps); + npush(tps, ~x); + break; + + case 'i': + /* + * Increment the first two parameters -- if they are numbers + * rather than strings. As a side effect, assign into the + * stack; if this is termcap, then the stack was populated + * using the termcap hack above rather than via the terminfo + * 'p' case. + */ + if (!incremented_two) { + incremented_two = TRUE; + if (data->p_is_s[0] == 0) { + data->param[0]++; + if (termcap_hack) + TPS(stack)[0].data.num = (int) data->param[0]; + } + if (data->p_is_s[1] == 0) { + data->param[1]++; + if (termcap_hack) + TPS(stack)[1].data.num = (int) data->param[1]; + } + } + break; + + case '?': + break; + + case 't': + x = npop(tps); + if (!x) { + /* scan forward for %e or %; at level zero */ + cp++; + level = 0; + while (*cp) { + if (*cp == '%') { + cp++; + if (*cp == '?') + level++; + else if (*cp == ';') { + if (level > 0) + level--; + else + break; + } else if (*cp == 'e' && level == 0) + break; + } + + if (*cp) + cp++; + } + } + break; + + case 'e': + /* scan forward for a %; at level zero */ + cp++; + level = 0; + while (*cp) { + if (*cp == '%') { + cp++; + if (*cp == '?') + level++; + else if (*cp == ';') { + if (level > 0) + level--; + else + break; + } + } + + if (*cp) + cp++; + } + break; + + case ';': + break; + + } /* endswitch (*cp) */ + } /* endelse (*cp == '%') */ + + if (*cp == '\0') + break; + + cp++; + } /* endwhile (*cp) */ + + get_space(tps, (size_t) 1); + TPS(out_buff)[TPS(out_used)] = '\0'; + + if (TPS(stack_ptr) && !_nc_tparm_err) { + DEBUG(2, ("tparm: stack has %d item%s on return", + TPS(stack_ptr), + TPS(stack_ptr) == 1 ? "" : "s")); + _nc_tparm_err++; + } + + T((T_RETURN("%s"), _nc_visbuf(TPS(out_buff)))); + return (TPS(out_buff)); +} + +#ifdef CUR +/* + * Only a few standard capabilities accept string parameters. The others that + * are parameterized accept only numeric parameters. + */ +static bool +check_string_caps(const TPARM_DATA *data, const char *string) +{ + bool result = FALSE; + +#define CHECK_CAP(name) (VALID_STRING(name) && !strcmp(name, string)) + + /* + * Disallow string parameters unless we can check them against a terminal + * description. + */ + if (cur_term != NULL) { + int want_type = 0; + + if (CHECK_CAP(pkey_key)) + want_type = 2; /* function key #1, type string #2 */ + else if (CHECK_CAP(pkey_local)) + want_type = 2; /* function key #1, execute string #2 */ + else if (CHECK_CAP(pkey_xmit)) + want_type = 2; /* function key #1, transmit string #2 */ + else if (CHECK_CAP(plab_norm)) + want_type = 2; /* label #1, show string #2 */ +#ifdef pkey_plab + else if (CHECK_CAP(pkey_plab)) + want_type = 6; /* function key #1, type string #2, show string #3 */ +#endif +#if NCURSES_XNAMES + else { + const char *check; + + check = tigetstr("Cs"); + if (CHECK_CAP(check)) + want_type = 1; /* style #1 */ + + check = tigetstr("Ms"); + if (CHECK_CAP(check)) + want_type = 3; /* storage unit #1, content #2 */ + } +#endif + + if (want_type == data->tparm_type) { + result = TRUE; + } else { + T(("unexpected string-parameter")); + } + } + return result; +} + +#define ValidCap(allow_strings) (myData.tparm_type == 0 || \ + (allow_strings && \ + check_string_caps(&myData, string))) +#else +#define ValidCap(allow_strings) 1 +#endif + +#if NCURSES_TPARM_VARARGS + +NCURSES_EXPORT(char *) +tparm(const char *string, ...) +{ + TPARM_STATE *tps = get_tparm_state(cur_term); + TPARM_DATA myData; + char *result = NULL; + + _nc_tparm_err = 0; +#ifdef TRACE + tps->tname = "tparm"; +#endif /* TRACE */ + + if (tparm_setup(cur_term, string, &myData) == OK && ValidCap(TRUE)) { + va_list ap; + + va_start(ap, string); + tparm_copy_valist(&myData, TRUE, ap); + va_end(ap); + + result = tparam_internal(tps, string, &myData); + } + return result; +} + +#else /* !NCURSES_TPARM_VARARGS */ + +NCURSES_EXPORT(char *) +tparm(const char *string, + TPARM_ARG a1, + TPARM_ARG a2, + TPARM_ARG a3, + TPARM_ARG a4, + TPARM_ARG a5, + TPARM_ARG a6, + TPARM_ARG a7, + TPARM_ARG a8, + TPARM_ARG a9) +{ + TPARM_STATE *tps = get_tparm_state(cur_term); + TPARM_DATA myData; + char *result = NULL; + + _nc_tparm_err = 0; +#ifdef TRACE + tps->tname = "tparm"; +#endif /* TRACE */ + +#define string_ok (sizeof(char*) <= sizeof(TPARM_ARG)) + + if (tparm_setup(cur_term, string, &myData) == OK && ValidCap(string_ok)) { + + myData.param[0] = a1; + myData.param[1] = a2; + myData.param[2] = a3; + myData.param[3] = a4; + myData.param[4] = a5; + myData.param[5] = a6; + myData.param[6] = a7; + myData.param[7] = a8; + myData.param[8] = a9; + + result = tparam_internal(tps, string, &myData); + } + return result; +} + +#endif /* NCURSES_TPARM_VARARGS */ + +NCURSES_EXPORT(char *) +tiparm(const char *string, ...) +{ + TPARM_STATE *tps = get_tparm_state(cur_term); + TPARM_DATA myData; + char *result = NULL; + + _nc_tparm_err = 0; +#ifdef TRACE + tps->tname = "tiparm"; +#endif /* TRACE */ + + if (tparm_setup(cur_term, string, &myData) == OK && ValidCap(TRUE)) { + va_list ap; + + va_start(ap, string); + tparm_copy_valist(&myData, FALSE, ap); + va_end(ap); + + result = tparam_internal(tps, string, &myData); + } + return result; +} + +/* + * Use tparm if the formatting string matches the expected number of parameters + * counting string-parameters. + */ +NCURSES_EXPORT(char *) +tiparm_s(int num_expected, int tparm_type, const char *string, ...) +{ + TPARM_STATE *tps = get_tparm_state(cur_term); + TPARM_DATA myData; + char *result = NULL; + + _nc_tparm_err = 0; +#ifdef TRACE + tps->tname = "tiparm_s"; +#endif /* TRACE */ + if (num_expected >= 0 && + num_expected <= 9 && + tparm_type >= 0 && + tparm_type < 7 && /* limit to 2 string parameters */ + tparm_setup(cur_term, string, &myData) == OK && + myData.tparm_type == tparm_type && + myData.num_actual == num_expected) { + va_list ap; + + va_start(ap, string); + tparm_copy_valist(&myData, FALSE, ap); + va_end(ap); + + result = tparam_internal(tps, string, &myData); + } + return result; +} + +/* + * Analyze the formatting string, return the analysis. + */ +NCURSES_EXPORT(int) +tiscan_s(int *num_expected, int *tparm_type, const char *string) +{ + TPARM_DATA myData; + int result = ERR; + +#ifdef TRACE + TPARM_STATE *tps = get_tparm_state(cur_term); + tps->tname = "tiscan_s"; +#endif /* TRACE */ + + if (tparm_setup(cur_term, string, &myData) == OK) { + *num_expected = myData.num_actual; + *tparm_type = myData.tparm_type; + result = OK; + } + return result; +} + +/* + * The internal-use flavor ensures that parameters are numbers, not strings. + * In addition to ensuring that they are numbers, it ensures that the parameter + * count is consistent with intended usage. + * + * Unlike the general-purpose tparm/tiparm, these internal calls are fairly + * well defined: + * + * expected == 0 - not applicable + * expected == 1 - set color, or vertical/horizontal addressing + * expected == 2 - cursor addressing + * expected == 4 - initialize color or color pair + * expected == 9 - set attributes + * + * Only for the last case (set attributes) should a parameter be optional. + * Also, a capability which calls for more parameters than expected should be + * ignored. + * + * Return a null if the parameter-checks fail. Otherwise, return a pointer to + * the formatted capability string. + */ +NCURSES_EXPORT(char *) +_nc_tiparm(int expected, const char *string, ...) +{ + TPARM_STATE *tps = get_tparm_state(cur_term); + TPARM_DATA myData; + char *result = NULL; + + _nc_tparm_err = 0; + T((T_CALLED("_nc_tiparm(%d, %s, ...)"), expected, _nc_visbuf(string))); +#ifdef TRACE + tps->tname = "_nc_tiparm"; +#endif /* TRACE */ + + if (tparm_setup(cur_term, string, &myData) == OK && ValidCap(FALSE)) { +#ifdef CUR + if (myData.num_actual != expected && cur_term != NULL) { + int needed = expected; + if (CHECK_CAP(to_status_line)) { + needed = 0; /* allow for xterm's status line */ + } else if (CHECK_CAP(set_a_background)) { + needed = 0; /* allow for monochrome fakers */ + } else if (CHECK_CAP(set_a_foreground)) { + needed = 0; + } else if (CHECK_CAP(set_background)) { + needed = 0; + } else if (CHECK_CAP(set_foreground)) { + needed = 0; + } +#if NCURSES_XNAMES + else { + const char *check; + + check = tigetstr("xm"); + if (CHECK_CAP(check)) { + needed = 3; + } + check = tigetstr("S0"); + if (CHECK_CAP(check)) { + needed = 0; /* used in screen-base */ + } + } +#endif + if (myData.num_actual >= needed && myData.num_actual <= expected) + expected = myData.num_actual; + } +#endif + if (myData.num_actual == 0 && expected) { + T(("missing parameter%s, expected %s%d", + expected > 1 ? "s" : "", + expected == 9 ? "up to " : "", + expected)); + } else if (myData.num_actual > expected) { + T(("too many parameters, have %d, expected %d", + myData.num_actual, + expected)); + } else if (expected != 9 && myData.num_actual != expected) { + T(("expected %d parameters, have %d", + myData.num_actual, + expected)); + } else { + va_list ap; + + va_start(ap, string); + tparm_copy_valist(&myData, FALSE, ap); + va_end(ap); + + result = tparam_internal(tps, string, &myData); + } + } + returnPtr(result); +} + +/* + * Improve tic's checks by resetting the terminfo "static variables" before + * calling functions which may update them. + */ +NCURSES_EXPORT(void) +_nc_reset_tparm(TERMINAL *term) +{ + TPARM_STATE *tps = get_tparm_state(term); + memset(TPS(static_vars), 0, sizeof(TPS(static_vars))); +} diff --git a/contrib/ncurses/ncurses/tinfo/lib_tputs.c b/contrib/ncurses/ncurses/tinfo/lib_tputs.c new file mode 100644 index 00000000..6a89a2a9 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_tputs.c @@ -0,0 +1,460 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * tputs.c + * delay_output() + * _nc_outch() + * tputs() + * + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +#include +#include /* ospeed */ +#include + +MODULE_ID("$Id: lib_tputs.c,v 1.113 2024/09/14 23:11:32 tom Exp $") + +NCURSES_EXPORT_VAR(char) PC = 0; /* used by termcap library */ +NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed = 0; /* used by termcap library */ + +NCURSES_EXPORT_VAR(int) _nc_nulls_sent = 0; + +#if NCURSES_NO_PADDING +NCURSES_EXPORT(void) +_nc_set_no_padding(SCREEN *sp) +{ + bool no_padding = (getenv("NCURSES_NO_PADDING") != 0); + + if (sp) + sp->_no_padding = no_padding; + else + _nc_prescreen._no_padding = no_padding; + + TR(TRACE_CHARPUT | TRACE_MOVE, ("padding will%s be used", + GetNoPadding(sp) ? " not" : "")); +} +#endif + +#if NCURSES_SP_FUNCS +#define SetOutCh(func) if (SP_PARM) SP_PARM->_outch = func; else _nc_prescreen._outch = func +#define GetOutCh() (SP_PARM ? SP_PARM->_outch : _nc_prescreen._outch) +#else +#define SetOutCh(func) static_outch = func +#define GetOutCh() static_outch +static NCURSES_SP_OUTC static_outch = NCURSES_SP_NAME(_nc_outch); +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(delay_output) (NCURSES_SP_DCLx int ms) +{ + T((T_CALLED("delay_output(%p,%d)"), (void *) SP_PARM, ms)); + + if (ms > MAX_DELAY_MSECS) + ms = MAX_DELAY_MSECS; + + if (!HasTInfoTerminal(SP_PARM)) + returnCode(ERR); + + if (no_pad_char) { + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + napms(ms); + } else { + NCURSES_SP_OUTC my_outch = GetOutCh(); + register int nullcount; + + nullcount = (ms * _nc_baudrate(ospeed)) / (BAUDBYTE * 1000); + for (_nc_nulls_sent += nullcount; nullcount > 0; nullcount--) + my_outch(NCURSES_SP_ARGx PC); + if (my_outch == NCURSES_SP_NAME(_nc_outch)) + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + } + + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +delay_output(int ms) +{ + return NCURSES_SP_NAME(delay_output) (CURRENT_SCREEN, ms); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_DCL0) +{ + T((T_CALLED("_nc_flush(%p)"), (void *) SP_PARM)); + if (SP_PARM != 0 && SP_PARM->_ofd >= 0) { + TR(TRACE_CHARPUT, ("ofd:%d inuse:%lu buffer:%p", + SP_PARM->_ofd, + (unsigned long) SP_PARM->out_inuse, + SP_PARM->out_buffer)); + if (SP_PARM->out_inuse) { + char *buf = SP_PARM->out_buffer; + size_t amount = SP_PARM->out_inuse; + + TR(TRACE_CHARPUT, ("flushing %ld/%ld bytes", + (unsigned long) amount, _nc_outchars)); + while (amount) { + ssize_t res = write(SP_PARM->_ofd, buf, amount); + if (res > 0) { + /* if the write was incomplete, try again */ + amount -= (size_t) res; + buf += res; + } else if (errno == EAGAIN) { + continue; + } else if (errno == EINTR) { + continue; + } else { + break; /* an error we can not recover from */ + } + } + } else if (SP_PARM->out_buffer == 0) { + TR(TRACE_CHARPUT, ("flushing stdout/stderr")); + fflush(stdout); + fflush(stderr); + } + } else { + TR(TRACE_CHARPUT, ("flushing stdout/stderr")); + fflush(stdout); + fflush(stderr); + } + if (SP_PARM != 0) + SP_PARM->out_inuse = 0; + returnVoid; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_flush(void) +{ + NCURSES_SP_NAME(_nc_flush) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_DCLx int ch) +{ + int rc = OK; + + COUNT_OUTCHARS(1); + + if (HasTInfoTerminal(SP_PARM) + && SP_PARM != 0) { + if (SP_PARM->out_buffer != 0) { + if (SP_PARM->out_inuse + 1 >= SP_PARM->out_limit) + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + SP_PARM->out_buffer[SP_PARM->out_inuse++] = (char) ch; + } else { + char tmp = (char) ch; + /* + * POSIX says write() is safe in a signal handler, but the + * buffered I/O is not. + */ + if (write(fileno(NC_OUTPUT(SP_PARM)), &tmp, (size_t) 1) == -1) + rc = ERR; + } + } else { + char tmp = (char) ch; + if (write(fileno(stdout), &tmp, (size_t) 1) == -1) + rc = ERR; + } + return rc; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_outch(int ch) +{ + return NCURSES_SP_NAME(_nc_outch) (CURRENT_SCREEN, ch); +} +#endif + +/* + * This is used for the putp special case. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_putchar) (NCURSES_SP_DCLx int ch) +{ + (void) SP_PARM; + return putchar(ch); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_putchar(int ch) +{ + return putchar(ch); +} +#endif + +/* + * putp is special - per documentation it calls tputs with putchar as the + * parameter for outputting characters. This means that it uses stdio, which + * is not signal-safe. Applications call this entrypoint; we do not call it + * from within the library. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(putp) (NCURSES_SP_DCLx const char *string) +{ + return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + string, 1, NCURSES_SP_NAME(_nc_putchar)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +putp(const char *string) +{ + return NCURSES_SP_NAME(putp) (CURRENT_SCREEN, string); +} +#endif + +/* + * Use these entrypoints rather than "putp" within the library. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_DCLx + const char *name GCC_UNUSED, + const char *string) +{ + int rc = ERR; + + if (string != 0) { + TPUTS_TRACE(name); + rc = NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + string, 1, NCURSES_SP_NAME(_nc_outch)); + } + return rc; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_putp(const char *name, const char *string) +{ + return NCURSES_SP_NAME(_nc_putp) (CURRENT_SCREEN, name, string); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(tputs) (NCURSES_SP_DCLx + const char *string, + int affcnt, + NCURSES_SP_OUTC outc) +{ + NCURSES_SP_OUTC my_outch = GetOutCh(); + bool always_delay = FALSE; + bool normal_delay = FALSE; + int number; +#if BSD_TPUTS + int trailpad; +#endif /* BSD_TPUTS */ + +#ifdef TRACE + if (USE_TRACEF(TRACE_TPUTS)) { + char addrbuf[32]; + TR_FUNC_BFR(1); + + if (outc == NCURSES_SP_NAME(_nc_outch)) { + _nc_STRCPY(addrbuf, "_nc_outch", sizeof(addrbuf)); + } else { + _nc_SPRINTF(addrbuf, _nc_SLIMIT(sizeof(addrbuf)) "%s", + TR_FUNC_ARG(0, outc)); + } + if (_nc_tputs_trace) { + _tracef("tputs(%s = %s, %d, %s) called", _nc_tputs_trace, + _nc_visbuf(string), affcnt, addrbuf); + } else { + _tracef("tputs(%s, %d, %s) called", _nc_visbuf(string), affcnt, addrbuf); + } + TPUTS_TRACE(NULL); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + + if (!VALID_STRING(string)) + return ERR; + + if (SP_PARM != 0 && HasTInfoTerminal(SP_PARM)) { + if ( +#if NCURSES_SP_FUNCS + (SP_PARM != 0 && SP_PARM->_term == 0) +#else + cur_term == 0 +#endif + ) { + always_delay = FALSE; + normal_delay = TRUE; + } else { + always_delay = (string == bell) || (string == flash_screen); + normal_delay = + !xon_xoff + && padding_baud_rate +#if NCURSES_NO_PADDING + && !GetNoPadding(SP_PARM) +#endif + && (_nc_baudrate(ospeed) >= padding_baud_rate); + } + } +#if BSD_TPUTS + /* + * This ugly kluge deals with the fact that some ancient BSD programs + * (like nethack) actually do the likes of tputs("50") to get delays. + */ + trailpad = 0; + if (isdigit(UChar(*string))) { + while (isdigit(UChar(*string))) { + trailpad = trailpad * 10 + (*string - '0'); + string++; + } + trailpad *= 10; + if (*string == '.') { + string++; + if (isdigit(UChar(*string))) { + trailpad += (*string - '0'); + string++; + } + while (isdigit(UChar(*string))) + string++; + } + + if (*string == '*') { + trailpad *= affcnt; + string++; + } + } +#endif /* BSD_TPUTS */ + + SetOutCh(outc); /* redirect delay_output() */ + while (*string) { + if (*string != '$') + (*outc) (NCURSES_SP_ARGx *string); + else { + string++; + if (*string != '<') { + (*outc) (NCURSES_SP_ARGx '$'); + if (*string) + (*outc) (NCURSES_SP_ARGx *string); + } else { + bool mandatory; + + string++; + if ((!isdigit(UChar(*string)) && *string != '.') + || !strchr(string, '>')) { + (*outc) (NCURSES_SP_ARGx '$'); + (*outc) (NCURSES_SP_ARGx '<'); + continue; + } + + number = 0; + while (isdigit(UChar(*string))) { + number = number * 10 + (*string - '0'); + string++; + } + number *= 10; + if (*string == '.') { + string++; + if (isdigit(UChar(*string))) { + number += (*string - '0'); + string++; + } + while (isdigit(UChar(*string))) + string++; + } + + mandatory = FALSE; + while (*string == '*' || *string == '/') { + if (*string == '*') { + number *= affcnt; + string++; + } else { /* if (*string == '/') */ + mandatory = TRUE; + string++; + } + } + + if (number > 0 + && (always_delay + || normal_delay + || mandatory)) + NCURSES_SP_NAME(delay_output) (NCURSES_SP_ARGx number / 10); + + } /* endelse (*string == '<') */ + } /* endelse (*string == '$') */ + + if (*string == '\0') + break; + + string++; + } + +#if BSD_TPUTS + /* + * Emit any BSD-style prefix padding that we've accumulated now. + */ + if (trailpad > 0 + && (always_delay || normal_delay)) + NCURSES_SP_NAME(delay_output) (NCURSES_SP_ARGx trailpad / 10); +#endif /* BSD_TPUTS */ + + SetOutCh(my_outch); + return OK; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_outc_wrapper(SCREEN *sp, int c) +{ + if (0 == sp) { + return fputc(c, stdout); + } else { + return sp->jump(c); + } +} + +NCURSES_EXPORT(int) +tputs(const char *string, int affcnt, int (*outc) (int)) +{ + SetSafeOutcWrapper(outc); + return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx string, affcnt, _nc_outc_wrapper); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_ttyflags.c b/contrib/ncurses/ncurses/tinfo/lib_ttyflags.c new file mode 100644 index 00000000..6363a805 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_ttyflags.c @@ -0,0 +1,330 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * def_prog_mode() + * def_shell_mode() + * reset_prog_mode() + * reset_shell_mode() + * savetty() + * resetty() + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_ttyflags.c,v 1.36 2020/09/05 22:54:47 tom Exp $") + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_DCLx TTY * buf) +{ + TERMINAL *termp = TerminalOf(SP_PARM); + int result = OK; + + if (buf == 0 || termp == 0) { + result = ERR; + } else { + +#ifdef USE_TERM_DRIVER + if (SP_PARM != 0) { + result = CallDriver_2(SP_PARM, td_sgmode, FALSE, buf); + } else { + result = ERR; + } +#else + for (;;) { + if (GET_TTY(termp->Filedes, buf) != 0) { + if (errno == EINTR) + continue; + result = ERR; + } + break; + } +#endif + + TR(TRACE_BITS, ("_nc_get_tty_mode(%d): %s", + termp ? termp->Filedes : -1, + _nc_trace_ttymode(buf))); + } + if (result == ERR && buf != 0) + memset(buf, 0, sizeof(*buf)); + + return (result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_get_tty_mode(TTY * buf) +{ + return NCURSES_SP_NAME(_nc_get_tty_mode) (CURRENT_SCREEN, buf); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_DCLx TTY * buf) +{ + int result = OK; + + if (buf == 0 || SP_PARM == 0) { + result = ERR; + } else { + TERMINAL *termp = TerminalOf(SP_PARM); + + if (0 == termp) { + result = ERR; + } else { +#ifdef USE_TERM_DRIVER + result = CallDriver_2(SP_PARM, td_sgmode, TRUE, buf); +#else + for (;;) { + if ((SET_TTY(termp->Filedes, buf) != 0) +#if USE_KLIBC_KBD + && !NC_ISATTY(termp->Filedes) +#endif + ) { + if (errno == EINTR) + continue; + if ((errno == ENOTTY) && (SP_PARM != 0)) + SP_PARM->_notty = TRUE; + result = ERR; + } + break; + } +#endif + } + TR(TRACE_BITS, ("_nc_set_tty_mode(%d): %s", + termp ? termp->Filedes : -1, + _nc_trace_ttymode(buf))); + } + return (result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_set_tty_mode(TTY * buf) +{ + return NCURSES_SP_NAME(_nc_set_tty_mode) (CURRENT_SCREEN, buf); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_DCL0) +{ + int rc = ERR; + TERMINAL *termp = TerminalOf(SP_PARM); + + T((T_CALLED("def_shell_mode(%p) ->term %p"), + (void *) SP_PARM, (void *) termp)); + + if (termp != 0) { +#ifdef USE_TERM_DRIVER + rc = CallDriver_2(SP_PARM, td_mode, FALSE, TRUE); +#else + /* + * If XTABS was on, remove the tab and backtab capabilities. + */ + if (_nc_get_tty_mode(&termp->Ottyb) == OK) { +#ifdef TERMIOS + if (termp->Ottyb.c_oflag & OFLAGS_TABS) + tab = back_tab = NULL; +#elif defined(EXP_WIN32_DRIVER) + /* noop */ +#else + if (termp->Ottyb.sg_flags & XTABS) + tab = back_tab = NULL; +#endif + rc = OK; + } +#endif + } + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +def_shell_mode(void) +{ + return NCURSES_SP_NAME(def_shell_mode) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_DCL0) +{ + int rc = ERR; + TERMINAL *termp = TerminalOf(SP_PARM); + + T((T_CALLED("def_prog_mode(%p) ->term %p"), (void *) SP_PARM, (void *) termp)); + + if (termp != 0) { +#ifdef USE_TERM_DRIVER + rc = CallDriver_2(SP_PARM, td_mode, TRUE, TRUE); +#else + /* + * Turn off the XTABS bit in the tty structure if it was on. + */ + if (_nc_get_tty_mode(&termp->Nttyb) == OK) { +#ifdef TERMIOS + termp->Nttyb.c_oflag &= (unsigned) (~OFLAGS_TABS); +#elif defined(EXP_WIN32_DRIVER) + /* noop */ +#else + termp->Nttyb.sg_flags &= (unsigned) (~XTABS); +#endif + rc = OK; + } +#endif + } + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +def_prog_mode(void) +{ + return NCURSES_SP_NAME(def_prog_mode) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_DCL0) +{ + int rc = ERR; + TERMINAL *termp = TerminalOf(SP_PARM); + + T((T_CALLED("reset_prog_mode(%p) ->term %p"), (void *) SP_PARM, (void *) termp)); + + if (termp != 0) { +#ifdef USE_TERM_DRIVER + rc = CallDriver_2(SP_PARM, td_mode, TRUE, FALSE); +#else + if (_nc_set_tty_mode(&termp->Nttyb) == OK) { + if (SP_PARM) { + if (SP_PARM->_keypad_on) + _nc_keypad(SP_PARM, TRUE); + } + rc = OK; + } +#endif + } + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +reset_prog_mode(void) +{ + return NCURSES_SP_NAME(reset_prog_mode) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_DCL0) +{ + int rc = ERR; + TERMINAL *termp = TerminalOf(SP_PARM); + + T((T_CALLED("reset_shell_mode(%p) ->term %p"), + (void *) SP_PARM, (void *) termp)); + + if (termp != 0) { +#ifdef USE_TERM_DRIVER + rc = CallDriver_2(SP_PARM, td_mode, FALSE, FALSE); +#else + if (SP_PARM) { + _nc_keypad(SP_PARM, FALSE); + _nc_flush(); + } + rc = _nc_set_tty_mode(&termp->Ottyb); +#endif + } + returnCode(rc); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +reset_shell_mode(void) +{ + return NCURSES_SP_NAME(reset_shell_mode) (CURRENT_SCREEN); +} +#endif + +static TTY * +saved_tty(NCURSES_SP_DCL0) +{ + TTY *result = 0; + + if (SP_PARM != 0) { + result = (TTY *) & (SP_PARM->_saved_tty); + } else { + if (_nc_prescreen.saved_tty == 0) { + _nc_prescreen.saved_tty = typeCalloc(TTY, 1); + } + result = _nc_prescreen.saved_tty; + } + return result; +} + +/* +** savetty() and resetty() +** +*/ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(savetty) (NCURSES_SP_DCL0) +{ + T((T_CALLED("savetty(%p)"), (void *) SP_PARM)); + returnCode(NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_ARGx saved_tty(NCURSES_SP_ARG))); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +savetty(void) +{ + return NCURSES_SP_NAME(savetty) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(resetty) (NCURSES_SP_DCL0) +{ + T((T_CALLED("resetty(%p)"), (void *) SP_PARM)); + returnCode(NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx saved_tty(NCURSES_SP_ARG))); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +resetty(void) +{ + return NCURSES_SP_NAME(resetty) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/lib_win32con.c b/contrib/ncurses/ncurses/tinfo/lib_win32con.c new file mode 100644 index 00000000..ece50f0d --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_win32con.c @@ -0,0 +1,1252 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* + * TODO - GetMousePos(POINT * result) from ntconio.c + */ + +#include + +MODULE_ID("$Id: lib_win32con.c,v 1.16 2024/10/19 21:06:11 tom Exp $") + +#if defined(_NC_WINDOWS) + +#ifdef _NC_MINGW +#include +#else +#include +#endif + +#include + +#if USE_WIDEC_SUPPORT +#define write_screen WriteConsoleOutputW +#define read_screen ReadConsoleOutputW +#else +#define write_screen WriteConsoleOutput +#define read_screen ReadConsoleOutput +#endif + +static bool read_screen_data(void); + +#define GenMap(vKey,key) MAKELONG(key, vKey) +static const LONG keylist[] = +{ + GenMap(VK_PRIOR, KEY_PPAGE), + GenMap(VK_NEXT, KEY_NPAGE), + GenMap(VK_END, KEY_END), + GenMap(VK_HOME, KEY_HOME), + GenMap(VK_LEFT, KEY_LEFT), + GenMap(VK_UP, KEY_UP), + GenMap(VK_RIGHT, KEY_RIGHT), + GenMap(VK_DOWN, KEY_DOWN), + GenMap(VK_DELETE, KEY_DC), + GenMap(VK_INSERT, KEY_IC) +}; +static const LONG ansi_keys[] = +{ + GenMap(VK_PRIOR, 'I'), + GenMap(VK_NEXT, 'Q'), + GenMap(VK_END, 'O'), + GenMap(VK_HOME, 'H'), + GenMap(VK_LEFT, 'K'), + GenMap(VK_UP, 'H'), + GenMap(VK_RIGHT, 'M'), + GenMap(VK_DOWN, 'P'), + GenMap(VK_DELETE, 'S'), + GenMap(VK_INSERT, 'R') +}; +#define array_length(a) (sizeof(a)/sizeof(a[0])) +#define N_INI ((int)array_length(keylist)) +#define FKEYS 24 +#define MAPSIZE (FKEYS + N_INI) + +/* A process can only have a single console, so it is safe + to maintain all the information about it in a single + static structure. + */ +NCURSES_EXPORT_VAR(ConsoleInfo) _nc_CONSOLE; +static bool console_initialized = FALSE; + +#define EnsureInit() (void)(console_initialized ? TRUE : _nc_console_checkinit(TRUE, TRUE)) + +#define REQUIRED_MAX_V (DWORD)10 +#define REQUIRED_MIN_V (DWORD)0 +#define REQUIRED_BUILD (DWORD)17763 +/* + This function returns 0 if the Windows version has no support for + the modern Console interface, otherwise it returns 1 + */ +NCURSES_EXPORT(int) +_nc_console_vt_supported(void) +{ + OSVERSIONINFO osvi; + int res = 0; + + T((T_CALLED("lib_win32con::_nc_console_vt_supported"))); + ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + GetVersionEx(&osvi); + T(("GetVersionEx returnedMajor=%ld, Minor=%ld, Build=%ld", + osvi.dwMajorVersion, + osvi.dwMinorVersion, + osvi.dwBuildNumber)); + if (osvi.dwMajorVersion >= REQUIRED_MAX_V) { + if (osvi.dwMajorVersion == REQUIRED_MAX_V) { + if (((osvi.dwMinorVersion == REQUIRED_MIN_V) && + (osvi.dwBuildNumber >= REQUIRED_BUILD)) || + ((osvi.dwMinorVersion > REQUIRED_MIN_V))) + res = 1; + } else + res = 1; + } + returnCode(res); +} + +NCURSES_EXPORT(void) +_nc_console_size(int *Lines, int *Cols) +{ + EnsureInit(); + if (Lines != NULL && Cols != NULL) { + if (WINCONSOLE.buffered) { + *Lines = (int) (WINCONSOLE.SBI.dwSize.Y); + *Cols = (int) (WINCONSOLE.SBI.dwSize.X); + } else { + *Lines = (int) (WINCONSOLE.SBI.srWindow.Bottom + 1 - + WINCONSOLE.SBI.srWindow.Top); + *Cols = (int) (WINCONSOLE.SBI.srWindow.Right + 1 - + WINCONSOLE.SBI.srWindow.Left); + } + } +} + +/* Convert a file descriptor into a HANDLE + That's not necessarily a console HANDLE +*/ +NCURSES_EXPORT(HANDLE) +_nc_console_handle(int fd) +{ + intptr_t value = _get_osfhandle(fd); + return (HANDLE) value; +} + +/* Validate that a HANDLE is actually a + console HANDLE +*/ +static BOOL +IsConsoleHandle(HANDLE hdl) +{ + DWORD dwFlag = 0; + BOOL result = FALSE; + + T((T_CALLED("lib_win32con::IsConsoleHandle(HANDLE=%p"), hdl)); + + EnsureInit(); + + if (!GetConsoleMode(hdl, &dwFlag)) { + T(("GetConsoleMode failed")); + } else { + result = TRUE; + } + + returnBool(result); +} + +/* This is used when running in terminfo mode to discover, + whether or not the "terminal" is actually a Windows + Console. It is the responsibility of the console to deal + with the terminal escape sequences that are sent by + terminfo. + */ +NCURSES_EXPORT(int) +_nc_console_test(int fd) +{ + int code = 0; + HANDLE hdl = INVALID_HANDLE_VALUE; + T((T_CALLED("lib_win32con::_nc_console_test(%d)"), fd)); + hdl = _nc_console_handle(fd); + code = (int) IsConsoleHandle(hdl); + returnCode(code); +} + +#define OutHandle() ((WINCONSOLE.isTermInfoConsole || WINCONSOLE.progMode) ? WINCONSOLE.hdl : WINCONSOLE.out) + +NCURSES_EXPORT(void) +_nc_console_selectActiveHandle(void) +{ + if (WINCONSOLE.lastOut != WINCONSOLE.hdl) { + WINCONSOLE.lastOut = WINCONSOLE.hdl; + SetConsoleActiveScreenBuffer(WINCONSOLE.lastOut); + } +} + +NCURSES_EXPORT(HANDLE) +_nc_console_fd2handle(int fd) +{ + HANDLE hdl = _nc_console_handle(fd); + if (hdl == WINCONSOLE.inp) { + T(("lib_win32con:validateHandle %d -> WINCONSOLE.inp", fd)); + } else if (hdl == WINCONSOLE.hdl) { + T(("lib_win32con:validateHandle %d -> WINCONSOLE.hdl", fd)); + } else if (hdl == WINCONSOLE.out) { + T(("lib_win32con:validateHandle %d -> WINCONSOLE.out", fd)); + } else { + T(("lib_win32con:validateHandle %d maps to unknown HANDLE", fd)); + hdl = INVALID_HANDLE_VALUE; + } +#if 1 + assert(hdl != INVALID_HANDLE_VALUE); +#endif + if (hdl != INVALID_HANDLE_VALUE) { + if (hdl != WINCONSOLE.inp && (!WINCONSOLE.isTermInfoConsole && WINCONSOLE.progMode)) { + if (hdl == WINCONSOLE.out && hdl != WINCONSOLE.hdl) { + T(("lib_win32con:validateHandle forcing WINCONSOLE.out -> WINCONSOLE.hdl")); + hdl = WINCONSOLE.hdl; + } + } + } + return hdl; +} + +NCURSES_EXPORT(int) +_nc_console_setmode(HANDLE hdl, const TTY * arg) +{ + DWORD dwFlag = 0; + int code = ERR; + HANDLE alt; + + if (arg) { +#ifdef TRACE + TTY TRCTTY; +#define TRCTTYOUT(flag) TRCTTY.dwFlagOut = flag +#define TRCTTYIN(flag) TRCTTY.dwFlagIn = flag +#else +#define TRCTTYOUT(flag) +#define TRCTTYIN(flag) +#endif + T(("lib_win32con:_nc_console_setmode %s", _nc_trace_ttymode(arg))); + if (hdl == WINCONSOLE.inp) { + dwFlag = arg->dwFlagIn | ENABLE_MOUSE_INPUT | VT_FLAG_IN; + if (WINCONSOLE.isTermInfoConsole) + dwFlag |= (VT_FLAG_IN); + else + dwFlag &= (DWORD) ~ (VT_FLAG_IN); + TRCTTYIN(dwFlag); + SetConsoleMode(hdl, dwFlag); + + alt = OutHandle(); + dwFlag = arg->dwFlagOut; + if (WINCONSOLE.isTermInfoConsole) + dwFlag |= (VT_FLAG_OUT); + else + dwFlag |= (VT_FLAG_OUT); + TRCTTYOUT(dwFlag); + SetConsoleMode(alt, dwFlag); + } else { + dwFlag = arg->dwFlagOut; + if (WINCONSOLE.isTermInfoConsole) + dwFlag |= (VT_FLAG_OUT); + else + dwFlag |= (VT_FLAG_OUT); + TRCTTYOUT(dwFlag); + SetConsoleMode(hdl, dwFlag); + + alt = WINCONSOLE.inp; + dwFlag = arg->dwFlagIn | ENABLE_MOUSE_INPUT; + if (WINCONSOLE.isTermInfoConsole) + dwFlag |= (VT_FLAG_IN); + else + dwFlag &= (DWORD) ~ (VT_FLAG_IN); + TRCTTYIN(dwFlag); + SetConsoleMode(alt, dwFlag); + T(("effective mode set %s", _nc_trace_ttymode(&TRCTTY))); + } + code = OK; + } + return (code); +} + +NCURSES_EXPORT(int) +_nc_console_getmode(HANDLE hdl, TTY * arg) +{ + int code = ERR; + + if (arg) { + DWORD dwFlag = 0; + HANDLE alt; + + if (hdl == WINCONSOLE.inp) { + if (GetConsoleMode(hdl, &dwFlag)) { + arg->dwFlagIn = dwFlag; + alt = OutHandle(); + if (GetConsoleMode(alt, &dwFlag)) { + arg->dwFlagOut = dwFlag; + code = OK; + } + } + } else { + if (GetConsoleMode(hdl, &dwFlag)) { + arg->dwFlagOut = dwFlag; + alt = WINCONSOLE.inp; + if (GetConsoleMode(alt, &dwFlag)) { + arg->dwFlagIn = dwFlag; + code = OK; + } + } + } + } + T(("lib_win32con:_nc_console_getmode %s", _nc_trace_ttymode(arg))); + return (code); +} + +NCURSES_EXPORT(int) +_nc_console_flush(HANDLE hdl) +{ + int code = OK; + + T((T_CALLED("lib_win32con::_nc_console_flush(hdl=%p"), hdl)); + + if (hdl != INVALID_HANDLE_VALUE) { + if (hdl == WINCONSOLE.hdl || + hdl == WINCONSOLE.inp || + hdl == WINCONSOLE.out) { + if (!FlushConsoleInputBuffer(WINCONSOLE.inp)) + code = ERR; + } else { + code = ERR; + T(("_nc_console_flush not requesting a handle owned by console.")); + } + } + returnCode(code); +} + +NCURSES_EXPORT(WORD) +_nc_console_MapColor(bool fore, int color) +{ + static const int _cmap[] = + {0, 4, 2, 6, 1, 5, 3, 7}; + int a; + if (color < 0 || color > 7) + a = fore ? 7 : 0; + else + a = _cmap[color]; + if (!fore) + a = a << 4; + return (WORD) a; +} + +/* + * Attempt to save the screen contents. PDCurses does this if + * PDC_RESTORE_SCREEN is set, giving the same visual appearance on + * restoration as if the library had allocated a console buffer. MSDN + * says that the data which can be read is limited to 64Kb (and may be + * less). + */ +static bool +save_original_screen(void) +{ + bool result = FALSE; + + WINCONSOLE.save_region.Top = 0; + WINCONSOLE.save_region.Left = 0; + WINCONSOLE.save_region.Bottom = (SHORT) (WINCONSOLE.SBI.dwSize.Y - 1); + WINCONSOLE.save_region.Right = (SHORT) (WINCONSOLE.SBI.dwSize.X - 1); + + if (read_screen_data()) { + result = TRUE; + } else { + + WINCONSOLE.save_region.Top = WINCONSOLE.SBI.srWindow.Top; + WINCONSOLE.save_region.Left = WINCONSOLE.SBI.srWindow.Left; + WINCONSOLE.save_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom; + WINCONSOLE.save_region.Right = WINCONSOLE.SBI.srWindow.Right; + + WINCONSOLE.window_only = TRUE; + + if (read_screen_data()) { + result = TRUE; + } + } + + T(("... save original screen contents %s", result ? "ok" : "err")); + return result; +} + +#if 0 +static bool +restore_original_screen(void) +{ + COORD bufferCoord; + bool result = FALSE; + SMALL_RECT save_region = WINCONSOLE.save_region; + + T(("... restoring %s", + WINCONSOLE.window_only ? "window" : "entire buffer")); + + bufferCoord.X = (SHORT) (WINCONSOLE.window_only ? + WINCONSOLE.SBI.srWindow.Left : 0); + bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ? + WINCONSOLE.SBI.srWindow.Top : 0); + + if (write_screen(WINCONSOLE.hdl, + WINCONSOLE.save_screen, + WINCONSOLE.save_size, + bufferCoord, + &save_region)) { + result = TRUE; + mvcur(-1, -1, LINES - 2, 0); + T(("... restore original screen contents ok %dx%d (%d,%d - %d,%d)", + WINCONSOLE.save_size.Y, + WINCONSOLE.save_size.X, + save_region.Top, + save_region.Left, + save_region.Bottom, + save_region.Right)); + } else { + T(("... restore original screen contents err")); + } + return result; +} +#endif + +static bool +read_screen_data(void) +{ + bool result = FALSE; + COORD bufferCoord; + size_t want; + + WINCONSOLE.save_size.X = (SHORT) (WINCONSOLE.save_region.Right + - WINCONSOLE.save_region.Left + 1); + WINCONSOLE.save_size.Y = (SHORT) (WINCONSOLE.save_region.Bottom + - WINCONSOLE.save_region.Top + 1); + + want = (size_t) (WINCONSOLE.save_size.X * WINCONSOLE.save_size.Y); + + if ((WINCONSOLE.save_screen = malloc(want * sizeof(CHAR_INFO))) != 0) { + bufferCoord.X = (SHORT) (WINCONSOLE.window_only ? + WINCONSOLE.SBI.srWindow.Left : 0); + bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ? + WINCONSOLE.SBI.srWindow.Top : 0); + + T(("... reading console %s %dx%d into %d,%d - %d,%d at %d,%d", + WINCONSOLE.window_only ? "window" : "buffer", + WINCONSOLE.save_size.Y, WINCONSOLE.save_size.X, + WINCONSOLE.save_region.Top, + WINCONSOLE.save_region.Left, + WINCONSOLE.save_region.Bottom, + WINCONSOLE.save_region.Right, + bufferCoord.Y, + bufferCoord.X)); + + if (read_screen(WINCONSOLE.hdl, + WINCONSOLE.save_screen, + WINCONSOLE.save_size, + bufferCoord, + &WINCONSOLE.save_region)) { + result = TRUE; + } else { + T((" error %#lx", (unsigned long) GetLastError())); + FreeAndNull(WINCONSOLE.save_screen); + } + } + + return result; +} + +NCURSES_EXPORT(bool) +_nc_console_get_SBI(void) +{ + bool rc = FALSE; + if (GetConsoleScreenBufferInfo(WINCONSOLE.hdl, &(WINCONSOLE.SBI))) { + T(("GetConsoleScreenBufferInfo")); + T(("... buffer(X:%d Y:%d)", + WINCONSOLE.SBI.dwSize.X, + WINCONSOLE.SBI.dwSize.Y)); + T(("... window(X:%d Y:%d)", + WINCONSOLE.SBI.dwMaximumWindowSize.X, + WINCONSOLE.SBI.dwMaximumWindowSize.Y)); + T(("... cursor(X:%d Y:%d)", + WINCONSOLE.SBI.dwCursorPosition.X, + WINCONSOLE.SBI.dwCursorPosition.Y)); + T(("... display(Top:%d Bottom:%d Left:%d Right:%d)", + WINCONSOLE.SBI.srWindow.Top, + WINCONSOLE.SBI.srWindow.Bottom, + WINCONSOLE.SBI.srWindow.Left, + WINCONSOLE.SBI.srWindow.Right)); + if (WINCONSOLE.buffered) { + WINCONSOLE.origin.X = 0; + WINCONSOLE.origin.Y = 0; + } else { + WINCONSOLE.origin.X = WINCONSOLE.SBI.srWindow.Left; + WINCONSOLE.origin.Y = WINCONSOLE.SBI.srWindow.Top; + } + rc = TRUE; + } else { + T(("GetConsoleScreenBufferInfo ERR")); + } + return rc; +} + +#define MIN_WIDE 80 +#define MIN_HIGH 24 + +/* + * In "normal" mode, reset the buffer- and window-sizes back to their original values. + */ +NCURSES_EXPORT(void) +_nc_console_set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info) +{ + SMALL_RECT rect; + COORD coord; + bool changed = FALSE; + + T((T_CALLED("lib_win32con::_nc_console_set_scrollback(%s)"), + (normal + ? "normal" + : "application"))); + + T(("... SBI.srWindow %d,%d .. %d,%d", + info->srWindow.Top, + info->srWindow.Left, + info->srWindow.Bottom, + info->srWindow.Right)); + T(("... SBI.dwSize %dx%d", + info->dwSize.Y, + info->dwSize.X)); + + if (normal) { + rect = info->srWindow; + coord = info->dwSize; + if (memcmp(info, &WINCONSOLE.SBI, sizeof(*info)) != 0) { + changed = TRUE; + WINCONSOLE.SBI = *info; + } + } else { + int high = info->srWindow.Bottom - info->srWindow.Top + 1; + int wide = info->srWindow.Right - info->srWindow.Left + 1; + + if (high < MIN_HIGH) { + T(("... height %d < %d", high, MIN_HIGH)); + high = MIN_HIGH; + changed = TRUE; + } + if (wide < MIN_WIDE) { + T(("... width %d < %d", wide, MIN_WIDE)); + wide = MIN_WIDE; + changed = TRUE; + } + + rect.Left = + rect.Top = 0; + rect.Right = (SHORT) (wide - 1); + rect.Bottom = (SHORT) (high - 1); + + coord.X = (SHORT) wide; + coord.Y = (SHORT) high; + + if (info->dwSize.Y != high || + info->dwSize.X != wide || + info->srWindow.Top != 0 || + info->srWindow.Left != 0) { + changed = TRUE; + } + + } + + if (changed) { + T(("... coord %d,%d", coord.Y, coord.X)); + T(("... rect %d,%d - %d,%d", + rect.Top, rect.Left, + rect.Bottom, rect.Right)); + SetConsoleScreenBufferSize(WINCONSOLE.hdl, coord); /* dwSize */ + SetConsoleWindowInfo(WINCONSOLE.hdl, TRUE, &rect); /* srWindow */ + _nc_console_get_SBI(); + } + returnVoid; +} + +static ULONGLONG +tdiff(FILETIME fstart, FILETIME fend) +{ + ULARGE_INTEGER ustart; + ULARGE_INTEGER uend; + ULONGLONG diff; + + ustart.LowPart = fstart.dwLowDateTime; + ustart.HighPart = fstart.dwHighDateTime; + uend.LowPart = fend.dwLowDateTime; + uend.HighPart = fend.dwHighDateTime; + + diff = (uend.QuadPart - ustart.QuadPart) / 10000; + return diff; +} + +static int +Adjust(int milliseconds, int diff) +{ + if (milliseconds != INFINITY) { + milliseconds -= diff; + if (milliseconds < 0) + milliseconds = 0; + } + return milliseconds; +} + +#define BUTTON_MASK (FROM_LEFT_1ST_BUTTON_PRESSED | \ + FROM_LEFT_2ND_BUTTON_PRESSED | \ + FROM_LEFT_3RD_BUTTON_PRESSED | \ + FROM_LEFT_4TH_BUTTON_PRESSED | \ + RIGHTMOST_BUTTON_PRESSED) + +static mmask_t +decode_mouse(SCREEN *sp, int mask) +{ + mmask_t result = 0; + + (void) sp; + assert(sp && console_initialized); + + if (mask & FROM_LEFT_1ST_BUTTON_PRESSED) + result |= BUTTON1_PRESSED; + if (mask & FROM_LEFT_2ND_BUTTON_PRESSED) + result |= BUTTON2_PRESSED; + if (mask & FROM_LEFT_3RD_BUTTON_PRESSED) + result |= BUTTON3_PRESSED; + if (mask & FROM_LEFT_4TH_BUTTON_PRESSED) + result |= BUTTON4_PRESSED; + + if (mask & RIGHTMOST_BUTTON_PRESSED) { + switch (WINCONSOLE.numButtons) { + case 1: + result |= BUTTON1_PRESSED; + break; + case 2: + result |= BUTTON2_PRESSED; + break; + case 3: + result |= BUTTON3_PRESSED; + break; + case 4: + result |= BUTTON4_PRESSED; + break; + } + } + + return result; +} + +#define AdjustY() (WINCONSOLE.buffered ? 0 : (int) WINCONSOLE.SBI.srWindow.Top) + +static bool +handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer) +{ + MEVENT work; + bool result = FALSE; + + assert(sp); + + sp->_drv_mouse_old_buttons = sp->_drv_mouse_new_buttons; + sp->_drv_mouse_new_buttons = mer.dwButtonState & BUTTON_MASK; + + /* + * We're only interested if the button is pressed or released. + * FIXME: implement continuous event-tracking. + */ + if (sp->_drv_mouse_new_buttons != sp->_drv_mouse_old_buttons) { + memset(&work, 0, sizeof(work)); + + if (sp->_drv_mouse_new_buttons) { + work.bstate |= decode_mouse(sp, sp->_drv_mouse_new_buttons); + } else { + /* cf: BUTTON_PRESSED, BUTTON_RELEASED */ + work.bstate |= (decode_mouse(sp, sp->_drv_mouse_old_buttons) + >> 1); + result = TRUE; + } + + work.x = mer.dwMousePosition.X; + work.y = mer.dwMousePosition.Y - AdjustY(); + + sp->_drv_mouse_fifo[sp->_drv_mouse_tail] = work; + sp->_drv_mouse_tail += 1; + } + return result; +} + +static int +rkeycompare(const void *el1, const void *el2) +{ + WORD key1 = (LOWORD((*((const LONG *) el1)))) & 0x7fff; + WORD key2 = (LOWORD((*((const LONG *) el2)))) & 0x7fff; + + return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1)); +} + +static int +keycompare(const void *el1, const void *el2) +{ + WORD key1 = HIWORD((*((const LONG *) el1))); + WORD key2 = HIWORD((*((const LONG *) el2))); + + return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1)); +} + +static int +MapKey(WORD vKey) +{ + int code = -1; + + if (!WINCONSOLE.isTermInfoConsole) { + WORD nKey = 0; + void *res; + LONG key = GenMap(vKey, 0); + + res = bsearch(&key, + WINCONSOLE.map, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + keycompare); + if (res) { + key = *((LONG *) res); + nKey = LOWORD(key); + code = (int) (nKey & 0x7fff); + if (nKey & 0x8000) + code = -code; + } + } + return code; +} + +static int +AnsiKey(WORD vKey) +{ + int code = -1; + + if (!WINCONSOLE.isTermInfoConsole) { + WORD nKey = 0; + void *res; + LONG key = GenMap(vKey, 0); + + res = bsearch(&key, + WINCONSOLE.ansi_map, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + keycompare); + if (res) { + key = *((LONG *) res); + nKey = LOWORD(key); + code = (int) (nKey & 0x7fff); + if (nKey & 0x8000) + code = -code; + } + } + return code; +} + +NCURSES_EXPORT(int) +_nc_console_keyok(int keycode, int flag) +{ + int code = ERR; + WORD nKey; + WORD vKey; + void *res; + LONG key = GenMap(0, (WORD) keycode); + + T((T_CALLED("lib_win32con::_nc_console_keyok(%d, %d)"), keycode, flag)); + + res = bsearch(&key, + WINCONSOLE.rmap, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + rkeycompare); + if (res) { + key = *((LONG *) res); + vKey = HIWORD(key); + nKey = (LOWORD(key)) & 0x7fff; + if (!flag) + nKey |= 0x8000; + *(LONG *) res = GenMap(vKey, nKey); + } + returnCode(code); +} + +NCURSES_EXPORT(bool) +_nc_console_keyExist(int keycode) +{ + WORD nKey; + void *res; + bool found = FALSE; + LONG key = GenMap(0, (WORD) keycode); + + T((T_CALLED("lib_win32con::_nc_console_keyExist(%d)"), keycode)); + res = bsearch(&key, + WINCONSOLE.rmap, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + rkeycompare); + if (res) { + key = *((LONG *) res); + nKey = LOWORD(key); + if (!(nKey & 0x8000)) + found = TRUE; + } + returnCode(found); +} + +NCURSES_EXPORT(int) +_nc_console_twait( + SCREEN *sp, + HANDLE hdl, + int mode, + int milliseconds, + int *timeleft + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + INPUT_RECORD inp_rec; + BOOL b; + DWORD nRead = 0, rc = (DWORD) (-1); + int code = 0; + FILETIME fstart; + FILETIME fend; + int diff; + bool isNoDelay = (milliseconds == 0); + +#ifdef NCURSES_WGETCH_EVENTS + (void) evl; /* TODO: implement wgetch-events */ +#endif + +#define IGNORE_CTRL_KEYS (SHIFT_PRESSED|LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED| \ + LEFT_CTRL_PRESSED|RIGHT_CTRL_PRESSED) +#define CONSUME() ReadConsoleInput(hdl, &inp_rec, 1, &nRead) + + assert(sp); + + TR(TRACE_IEVENT, ("start twait: hdl=%p, %d milliseconds, mode: %d", + hdl, milliseconds, mode)); + + if (milliseconds < 0) + milliseconds = INFINITY; + + memset(&inp_rec, 0, sizeof(inp_rec)); + + while (true) { + if (!isNoDelay) { + GetSystemTimeAsFileTime(&fstart); + rc = WaitForSingleObject(hdl, (DWORD) milliseconds); + GetSystemTimeAsFileTime(&fend); + diff = (int) tdiff(fstart, fend); + milliseconds = Adjust(milliseconds, diff); + if (milliseconds < 0) + break; + } + + if (isNoDelay || (rc == WAIT_OBJECT_0)) { + if (mode) { + nRead = 0; + b = GetNumberOfConsoleInputEvents(hdl, &nRead); + if (!b) { + T(("twait:err GetNumberOfConsoleInputEvents")); + } + if (isNoDelay && b) { + T(("twait: Events Available: %ld", nRead)); + if (nRead == 0) { + code = 0; + goto end; + } else { + DWORD n = 0; + INPUT_RECORD *pInpRec = + TypeAlloca(INPUT_RECORD, nRead); + if (pInpRec != NULL) { + DWORD i; + BOOL f; + memset(pInpRec, 0, sizeof(INPUT_RECORD) * nRead); + f = PeekConsoleInput(hdl, pInpRec, nRead, &n); + if (f) { + for (i = 0; i < n; i++) { + if (pInpRec[i].EventType == KEY_EVENT) { + if (pInpRec[i].Event.KeyEvent.bKeyDown) { + DWORD ctrlMask = + (pInpRec[i].Event.KeyEvent.dwControlKeyState & + IGNORE_CTRL_KEYS); + if (!ctrlMask) { + code = TW_INPUT; + goto end; + } + } + } + } + } else { + T(("twait:err PeekConsoleInput")); + } + code = 0; + goto end; + } else { + T(("twait:err could not alloca input records")); + } + } + } + if (b && nRead > 0) { + b = PeekConsoleInput(hdl, &inp_rec, 1, &nRead); + if (!b) { + T(("twait:err PeekConsoleInput")); + } + if (b && nRead > 0) { + switch (inp_rec.EventType) { + case KEY_EVENT: + if (mode & TW_INPUT) { + WORD vk = + inp_rec.Event.KeyEvent.wVirtualKeyCode; + char ch = + inp_rec.Event.KeyEvent.uChar.AsciiChar; + T(("twait:event KEY_EVENT")); + T(("twait vk=%d, ch=%d, keydown=%d", + vk, ch, inp_rec.Event.KeyEvent.bKeyDown)); + if (inp_rec.Event.KeyEvent.bKeyDown) { + T(("twait:event KeyDown")); + if (!WINCONSOLE.isTermInfoConsole && + (0 == ch)) { + int nKey = MapKey(vk); + if (nKey < 0) { + CONSUME(); + continue; + } + } + code = TW_INPUT; + goto end; + } else { + CONSUME(); + } + } + continue; + case MOUSE_EVENT: + T(("twait:event MOUSE_EVENT")); + if (decode_mouse(sp, + (inp_rec.Event.MouseEvent.dwButtonState + & BUTTON_MASK)) == 0) { + CONSUME(); + } else if (mode & TW_MOUSE) { + code = TW_MOUSE; + goto end; + } + continue; + /* e.g., FOCUS_EVENT */ + default: + T(("twait:event Tyoe %d", inp_rec.EventType)); + CONSUME(); + _nc_console_selectActiveHandle(); + continue; + } + } + } + } + continue; + } else { + if (rc != WAIT_TIMEOUT) { + code = -1; + break; + } else { + code = 0; + break; + } + } + } + end: + + TR(TRACE_IEVENT, ("end twait: returned %d (%lu), remaining time %d msec", + code, GetLastError(), milliseconds)); + + if (timeleft) + *timeleft = milliseconds; + + return code; +} + +NCURSES_EXPORT(int) +_nc_console_testmouse( + const SCREEN *sp, + HANDLE hdl, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc = 0; + + assert(sp); + + if (sp->_drv_mouse_head < sp->_drv_mouse_tail) { + rc = TW_MOUSE; + } else { + rc = _nc_console_twait(sp, + hdl, + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); + } + return rc; +} + +NCURSES_EXPORT(int) +_nc_console_read( + SCREEN *sp, + HANDLE hdl, + int *buf) +{ + int rc = -1; + INPUT_RECORD inp_rec; + BOOL b; + DWORD nRead; + WORD vk; + + assert(sp); + assert(buf); + + memset(&inp_rec, 0, sizeof(inp_rec)); + + T((T_CALLED("lib_win32con::_nc_console_read(%p)"), sp)); + + while ((b = ReadConsoleInput(hdl, &inp_rec, 1, &nRead))) { + if (b && nRead > 0) { + if (rc < 0) + rc = 0; + rc = rc + (int) nRead; + if (inp_rec.EventType == KEY_EVENT) { + if (!inp_rec.Event.KeyEvent.bKeyDown) + continue; + *buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar; + vk = inp_rec.Event.KeyEvent.wVirtualKeyCode; + /* + * There are 24 virtual function-keys, and typically + * 12 function-keys on a keyboard. Use the shift-modifier + * to provide the remaining 12 keys. + */ + if (vk >= VK_F1 && vk <= VK_F12) { + if (inp_rec.Event.KeyEvent.dwControlKeyState & + SHIFT_PRESSED) { + vk = (WORD) (vk + 12); + } + } + if (*buf == 0) { + int key = MapKey(vk); + if (key < 0) + continue; + if (sp->_keypad_on) { + *buf = key; + } else { + ungetch('\0'); + *buf = AnsiKey(vk); + } + } + break; + } else if (inp_rec.EventType == MOUSE_EVENT) { + if (handle_mouse(sp, + inp_rec.Event.MouseEvent)) { + *buf = KEY_MOUSE; + break; + } + } + continue; + } + } + returnCode(rc); +} + +/* Our replacement for the systems _isatty to include also + a test for mintty. This is called from the NC_ISATTY macro + defined in curses.priv.h + + Return codes: + - 0 : Not a TTY + - 1 : A Windows character device detected by _isatty + - 2 : A future implementation may return 2 for mintty + */ +NCURSES_EXPORT(int) +_nc_console_isatty(int fd) +{ + int result = 0; + T((T_CALLED("lib_win32con::_nc_console_isatty(%d"), fd)); + + if (_isatty(fd)) + result = 1; +#ifdef _NC_CHECK_MINTTY + else { + if (_nc_console_checkmintty(fd, NULL)) { + result = 2; + fprintf(stderr, + "ncurses on Windows must run in a Windows console.\n" + "On newer versions of Windows, the calling program should create a PTY-like.\n" + "device using the CreatePseudoConsole Windows API call.\n"); + exit(EXIT_FAILURE); + } + } +#endif + returnCode(result); +} + +NCURSES_EXPORT(bool) +_nc_console_checkinit(bool initFlag, bool assumeTermInfo) +{ + bool res = FALSE; + + T((T_CALLED("lib_win32con::_nc_console_checkinit(initFlag=%d, assumeTermInfo=%d)"), + initFlag, assumeTermInfo)); + + if (!initFlag) { + res = console_initialized; + } else { + /* initialize once, or not at all */ + if (!console_initialized) { + int i; + DWORD num_buttons; + WORD a; + BOOL buffered = FALSE; + BOOL b; + + START_TRACE(); + WINCONSOLE.isTermInfoConsole = assumeTermInfo; + + WINCONSOLE.map = (LPDWORD) malloc(sizeof(DWORD) * MAPSIZE); + WINCONSOLE.rmap = (LPDWORD) malloc(sizeof(DWORD) * MAPSIZE); + WINCONSOLE.ansi_map = (LPDWORD) malloc(sizeof(DWORD) * MAPSIZE); + + for (i = 0; i < (N_INI + FKEYS); i++) { + if (i < N_INI) { + WINCONSOLE.rmap[i] = WINCONSOLE.map[i] = + (DWORD) keylist[i]; + WINCONSOLE.ansi_map[i] = (DWORD) ansi_keys[i]; + } else { + WINCONSOLE.rmap[i] = WINCONSOLE.map[i] = + (DWORD) GenMap((VK_F1 + (i - N_INI)), + (KEY_F(1) + (i - N_INI))); + WINCONSOLE.ansi_map[i] = + (DWORD) GenMap((VK_F1 + (i - N_INI)), + (';' + (i - N_INI))); + } + } + qsort(WINCONSOLE.ansi_map, + (size_t) (MAPSIZE), + sizeof(keylist[0]), + keycompare); + qsort(WINCONSOLE.map, + (size_t) (MAPSIZE), + sizeof(keylist[0]), + keycompare); + qsort(WINCONSOLE.rmap, + (size_t) (MAPSIZE), + sizeof(keylist[0]), + rkeycompare); + + if (GetNumberOfConsoleMouseButtons(&num_buttons)) { + WINCONSOLE.numButtons = (int) num_buttons; + } else { + WINCONSOLE.numButtons = 1; + } + + a = _nc_console_MapColor(true, COLOR_WHITE) | + _nc_console_MapColor(false, COLOR_BLACK); + for (i = 0; i < CON_NUMPAIRS; i++) + WINCONSOLE.pairs[i] = a; + +#define SaveConsoleMode(handle, value) \ + GetConsoleMode(WINCONSOLE.handle, &WINCONSOLE.originalMode.value) + + if (WINCONSOLE.isTermInfoConsole) { + WINCONSOLE.inp = GetStdHandle(STD_INPUT_HANDLE); + WINCONSOLE.out = GetStdHandle(STD_OUTPUT_HANDLE); + WINCONSOLE.hdl = WINCONSOLE.out; + + SaveConsoleMode(inp, dwFlagIn); + SaveConsoleMode(out, dwFlagOut); + + } else { + b = AllocConsole(); + + if (!b) + b = AttachConsole(ATTACH_PARENT_PROCESS); + + WINCONSOLE.inp = GetDirectHandle("CONIN$", FILE_SHARE_READ); + WINCONSOLE.out = GetDirectHandle("CONOUT$", FILE_SHARE_WRITE); + + SaveConsoleMode(inp, dwFlagIn); + SaveConsoleMode(out, dwFlagOut); + + if (getenv("NCGDB") || getenv("NCURSES_CONSOLE2")) { + WINCONSOLE.hdl = WINCONSOLE.out; + T(("... will not buffer console")); + } else { + T(("... creating console buffer")); + WINCONSOLE.hdl = + CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + CONSOLE_TEXTMODE_BUFFER, + NULL); + buffered = TRUE; + } + } + + /* We set binary I/O even when using the console + driver to cover the situation, that the + TERM variable is set to #win32con, but actually + Windows supports virtual terminal processing. + So if terminfo functions are used in this setup, + they actually may work. + */ + _setmode(fileno(stdin), _O_BINARY); + _setmode(fileno(stdout), _O_BINARY); + + if (WINCONSOLE.hdl != INVALID_HANDLE_VALUE) { + WINCONSOLE.buffered = buffered; + _nc_console_get_SBI(); + WINCONSOLE.save_SBI = WINCONSOLE.SBI; + if (!buffered) { + save_original_screen(); + _nc_console_set_scrollback(FALSE, &WINCONSOLE.SBI); + } + GetConsoleCursorInfo(WINCONSOLE.hdl, &WINCONSOLE.save_CI); + T(("... initial cursor is %svisible, %d%%", + (WINCONSOLE.save_CI.bVisible ? "" : "not-"), + (int) WINCONSOLE.save_CI.dwSize)); + } + + WINCONSOLE.initialized = TRUE; + console_initialized = TRUE; + } + res = (WINCONSOLE.hdl != INVALID_HANDLE_VALUE); + } + returnBool(res); +} + +#endif // _NC_WINDOWS diff --git a/contrib/ncurses/ncurses/tinfo/lib_win32util.c b/contrib/ncurses/ncurses/tinfo/lib_win32util.c new file mode 100644 index 00000000..92d9e8a3 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/lib_win32util.c @@ -0,0 +1,134 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * and: Thomas E. Dickey * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_win32util.c,v 1.5 2024/08/31 15:55:16 tom Exp $") + +#ifdef _NC_WINDOWS_NATIVE +#include + +#ifdef _NC_CHECK_MINTTY +#define PSAPI_VERSION 2 +#include +#include + +#define array_length(a) (sizeof(a)/sizeof(a[0])) + +/* This function tests, whether or not the ncurses application + is running as a descendant of MSYS2/cygwin mintty terminal + application. mintty doesn't use Windows Console for its screen + I/O, so the native Windows _isatty doesn't recognize it as + character device. But we can discover we are at the end of an + Pipe and can query the server side of the pipe, looking whether + or not this is mintty. + For now we terminate the program if we discover that situation. + Although in theory it would be possible, to remotely manipulate + the terminal state of mintty, this is out of scope for now and + not worth the significant effort. + */ +NCURSES_EXPORT(int) +_nc_console_checkmintty(int fd, LPHANDLE pMinTTY) +{ + HANDLE handle = _nc_console_handle(fd); + DWORD dw; + int code = 0; + + T((T_CALLED("lib_winhelper::_nc_console_checkmintty(%d, %p)"), fd, pMinTTY)); + + if (handle != INVALID_HANDLE_VALUE) { + dw = GetFileType(handle); + if (dw == FILE_TYPE_PIPE) { + if (GetNamedPipeInfo(handle, 0, 0, 0, 0)) { + ULONG pPid; + /* Requires NT6 */ + if (GetNamedPipeServerProcessId(handle, &pPid)) { + TCHAR buf[MAX_PATH]; + DWORD len = 0; + /* These security attributes may allow us to + create a remote thread in mintty to manipulate + the terminal state remotely */ + HANDLE pHandle = OpenProcess(PROCESS_CREATE_THREAD + | PROCESS_QUERY_INFORMATION + | PROCESS_VM_OPERATION + | PROCESS_VM_WRITE + | PROCESS_VM_READ, + FALSE, + pPid); + if (pMinTTY) + *pMinTTY = INVALID_HANDLE_VALUE; + if (pHandle != INVALID_HANDLE_VALUE) { + if ((len = GetProcessImageFileName(pHandle, + buf, + (DWORD) + array_length(buf)))) { + TCHAR *pos = _tcsrchr(buf, _T('\\')); + if (pos) { + pos++; + if (_tcsnicmp(pos, _TEXT("mintty.exe"), 10) + == 0) { + if (pMinTTY) + *pMinTTY = pHandle; + code = 1; + } + } + } + } + } + } + } + } + returnCode(code); +} +#endif /* _NC_CHECK_MINTTY */ + +#if HAVE_GETTIMEOFDAY == 2 +#define JAN1970 116444736000000000LL /* the value for 01/01/1970 00:00 */ + +NCURSES_EXPORT(int) +_nc_gettimeofday(struct timeval *tv, void *tz GCC_UNUSED) +{ + union { + FILETIME ft; + long long since1601; /* time since 1 Jan 1601 in 100ns units */ + } data; + + GetSystemTimeAsFileTime(&data.ft); + tv->tv_usec = (long) ((data.since1601 / 10LL) % 1000000LL); + tv->tv_sec = (long) ((data.since1601 - JAN1970) / 10000000LL); + return (0); +} +#endif // HAVE_GETTIMEOFDAY == 2 + +#endif // _NC_WINDOWS_NATIVE diff --git a/contrib/ncurses/ncurses/tinfo/make_hash.c b/contrib/ncurses/ncurses/tinfo/make_hash.c new file mode 100644 index 00000000..78a684cc --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/make_hash.c @@ -0,0 +1,445 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * Copyright 2009-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * make_hash.c --- build-time program for constructing comp_captab.c + */ + +#include + +#include +#include + +#include + +MODULE_ID("$Id: make_hash.c,v 1.34 2024/03/02 19:35:40 tom Exp $") + +/* + * _nc_make_hash_table() + * + * Takes the entries in table[] and hashes them into hash_table[] + * by name. There are CAPTABSIZE entries in the predefined table[] + * and HASHTABSIZE slots in hash_table[]. + * + */ + +#undef MODULE_ID +#define MODULE_ID(id) /*nothing */ +#include + +#define L_PAREN "(" +#define R_PAREN ")" +#define L_BRACE "{" +#define R_BRACE "}" + +static const char *typenames[] = +{"BOOLEAN", "NUMBER", "STRING"}; + +static void +failed(const char *s) +{ + perror(s); + exit(EXIT_FAILURE); +} + +static char * +strmalloc(char *s) +{ + size_t need = strlen(s) + 1; + char *result = malloc(need); + if (result == 0) + failed("strmalloc"); + _nc_STRCPY(result, s, need); + return result; +} + +/* + * int hash_function(string) + * + * Computes the hashing function on the given string. + * + * The current hash function is the sum of each consecutive pair + * of characters, taken as two-byte integers, mod HASHTABSIZE. + * + */ + +static int +hash_function(const char *string) +{ + long sum = 0; + + while (*string) { + sum += (long) (UChar(*string) + (UChar(*(string + 1)) << 8)); + string++; + } + + return (int) (sum % HASHTABSIZE); +} + +#define UNUSED -1 + +static void +_nc_make_hash_table(struct user_table_entry *table, + HashValue * hash_table, + unsigned tablesize) +{ + unsigned i; + int hashvalue; + int collisions = 0; + + for (i = 0; i < HASHTABSIZE; i++) { + hash_table[i] = UNUSED; + } + for (i = 0; i < tablesize; i++) { + hashvalue = hash_function(table[i].ute_name); + + if (hash_table[hashvalue] >= 0) + collisions++; + + if (hash_table[hashvalue] != UNUSED) { + table[i].ute_link = hash_table[hashvalue]; + } + hash_table[hashvalue] = (HashValue) i; + } + + printf("/* %d collisions out of %d entries */\n", collisions, tablesize); +} + +/* + * This filter reads from standard input a list of tab-delimited columns, + * (e.g., from Caps.filtered) computes the hash-value of a specified column and + * writes the hashed tables to standard output. + * + * By compiling the hash table at build time, we're able to make the entire + * set of terminfo and termcap tables readonly (and also provide some runtime + * performance enhancement). + */ + +#define MAX_COLUMNS BUFSIZ /* this _has_ to be worst-case */ + +static int +count_columns(char **list) +{ + int result = 0; + if (list != 0) { + while (*list++) { + ++result; + } + } + return result; +} + +static char ** +parse_columns(char *buffer) +{ + static char **list; + + int col = 0; + + if (buffer == 0) { + free(list); + list = 0; + return 0; + } + + if (*buffer != '#') { + if (list == 0) { + list = typeCalloc(char *, (MAX_COLUMNS + 1)); + if (list == 0) + return (0); + } + while (*buffer != '\0') { + char *s; + for (s = buffer; (*s != '\0') && !isspace(UChar(*s)); s++) + /*EMPTY */ ; + if (s != buffer) { + char mark = *s; + *s = '\0'; + if ((s - buffer) > 1 + && (*buffer == '"') + && (s[-1] == '"')) { /* strip the quotes */ + assert(s > buffer + 1); + s[-1] = '\0'; + buffer++; + } + list[col] = buffer; + col++; + if (mark == '\0') + break; + while (*++s && isspace(UChar(*s))) + /*EMPTY */ ; + buffer = s; + } else + break; + } + } + return col ? list : 0; +} + +#define SetType(n,t) \ + if (is_user) \ + name_table[n].ute_type |= (int)(1 << (t)); \ + else \ + name_table[n].ute_type = (t) + +#define GetType(n) \ + (is_user \ + ? get_type(name_table[n].ute_type) \ + : typenames[name_table[n].ute_type]) + +static char * +get_type(int type_mask) +{ + static char result[80]; + unsigned n; + _nc_STRCPY(result, L_PAREN, sizeof(result)); + for (n = 0; n < 3; ++n) { + if ((1 << n) & type_mask) { + size_t want = 5 + strlen(typenames[n]); + if (want > sizeof(result)) { + fprintf(stderr, "Buffer is not large enough for %s + %s\n", + result, typenames[n]); + exit(EXIT_FAILURE); + } + if (result[1]) + _nc_STRCAT(result, "|", sizeof(result)); + _nc_STRCAT(result, "1<<", sizeof(result)); + _nc_STRCAT(result, typenames[n], sizeof(result)); + } + } + _nc_STRCAT(result, R_PAREN, sizeof(result)); + return result; +} + +int +main(int argc, char **argv) +{ + unsigned tablesize = CAPTABSIZE; + struct user_table_entry *name_table = typeCalloc(struct + user_table_entry, tablesize); + HashValue *hash_table = typeCalloc(HashValue, HASHTABSIZE); + const char *root_name; + int column = 0; + int bigstring = 0; + unsigned n; + unsigned nn; + unsigned tableused = 0; + bool is_user; + const char *table_name; + char buffer[BUFSIZ]; + + short BoolCount = 0; + short NumCount = 0; + short StrCount = 0; + + /* The first argument is the column-number (starting with 0). + * The second is the root name of the tables to generate. + */ + if (argc <= 3 + || (column = atoi(argv[1])) <= 0 + || (column >= MAX_COLUMNS) + || *(root_name = argv[2]) == 0 + || (bigstring = atoi(argv[3])) < 0 + || name_table == 0 + || hash_table == 0) { + fprintf(stderr, "usage: make_hash column root_name bigstring\n"); + exit(EXIT_FAILURE); + } + is_user = (*root_name == 'u'); + table_name = (is_user ? "user" : "name"); + + /* + * Read the table into our arrays. + */ + for (n = 0; (n < tablesize) && fgets(buffer, BUFSIZ, stdin);) { + char **list; + char *nlp = strchr(buffer, '\n'); + if (nlp) + *nlp = '\0'; + else + buffer[sizeof(buffer) - 2] = '\0'; + list = parse_columns(buffer); + if (list == 0) /* blank or comment */ + continue; + if (is_user) { + if (strcmp(list[0], "userdef")) + continue; + } else if (!strcmp(list[0], "userdef")) { + continue; + } + if (column < 0 || column > count_columns(list)) { + fprintf(stderr, "expected %d columns, have %d:\n%s\n", + column, + count_columns(list), + buffer); + exit(EXIT_FAILURE); + } + nn = tableused; + if (is_user) { + unsigned j; + for (j = 0; j < tableused; ++j) { + if (!strcmp(list[column], name_table[j].ute_name)) { + nn = j; + break; + } + } + } + if (nn == tableused) { + name_table[nn].ute_link = -1; /* end-of-hash */ + name_table[nn].ute_name = strmalloc(list[column]); + ++tableused; + } + + if (!strcmp(list[2], "bool")) { + SetType(nn, BOOLEAN); + name_table[nn].ute_index = BoolCount++; + } else if (!strcmp(list[2], "num")) { + SetType(nn, NUMBER); + name_table[nn].ute_index = NumCount++; + } else if (!strcmp(list[2], "str")) { + SetType(nn, STRING); + name_table[nn].ute_index = StrCount++; + if (is_user) { + if (*list[3] != '-') { + unsigned j; + name_table[nn].ute_argc = (unsigned) strlen(list[3]); + for (j = 0; j < name_table[nn].ute_argc; ++j) { + if (list[3][j] == 's') { + name_table[nn].ute_args |= (1U << j); + } + } + } + } + } else { + fprintf(stderr, "Unknown type: %s\n", list[2]); + exit(EXIT_FAILURE); + } + n++; + } + if (tablesize > tableused) + tablesize = tableused; + _nc_make_hash_table(name_table, hash_table, tablesize); + + /* + * Write the compiled tables to standard output + */ + if (bigstring) { + int len = 0; + int nxt; + + printf("static const char %s_names_text[] = \\\n", root_name); + for (n = 0; n < tablesize; n++) { + nxt = (int) strlen(name_table[n].ute_name) + 5; + if (nxt + len > 72) { + printf("\\\n"); + len = 0; + } + printf("\"%s\\0\" ", name_table[n].ute_name); + len += nxt; + } + printf(";\n\n"); + + len = 0; + printf("static %s_table_data const %s_names_data[] =\n", + table_name, + root_name); + printf("%s\n", L_BRACE); + for (n = 0; n < tablesize; n++) { + printf("\t%s %15d,\t%10s,", L_BRACE, len, GetType(n)); + if (is_user) + printf("\t%d,%d,", + name_table[n].ute_argc, + name_table[n].ute_args); + printf("\t%3d, %3d %s%c\n", + name_table[n].ute_index, + name_table[n].ute_link, + R_BRACE, + n < tablesize - 1 ? ',' : ' '); + len += (int) strlen(name_table[n].ute_name) + 1; + } + printf("%s;\n\n", R_BRACE); + printf("static struct %s_table_entry *_nc_%s_table = 0;\n\n", + table_name, + root_name); + } else { + + printf("static struct %s_table_entry const _nc_%s_table[] =\n", + table_name, + root_name); + printf("%s\n", L_BRACE); + for (n = 0; n < tablesize; n++) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "\"%s\"", + name_table[n].ute_name); + printf("\t%s %15s,\t%10s,", L_BRACE, buffer, GetType(n)); + if (is_user) + printf("\t%d,%d,", + name_table[n].ute_argc, + name_table[n].ute_args); + printf("\t%3d, %3d %s%c\n", + name_table[n].ute_index, + name_table[n].ute_link, + R_BRACE, + n < tablesize - 1 ? ',' : ' '); + } + printf("%s;\n\n", R_BRACE); + } + + printf("static const HashValue _nc_%s_hash_table[%d] =\n", + root_name, + HASHTABSIZE + 1); + printf("%s\n", L_BRACE); + for (n = 0; n < HASHTABSIZE; n++) { + printf("\t%3d,\n", hash_table[n]); + } + printf("\t0\t/* base-of-table */\n"); + printf("%s;\n\n", R_BRACE); + + if (!is_user) { + printf("#if (BOOLCOUNT!=%d)||(NUMCOUNT!=%d)||(STRCOUNT!=%d)\n", + BoolCount, NumCount, StrCount); + printf("#error\t--> term.h and comp_captab.c disagree about the <--\n"); + printf("#error\t--> numbers of booleans, numbers and/or strings <--\n"); + printf("#endif\n\n"); + } + + free(hash_table); + for (n = 0; (n < tablesize); ++n) { + free((void *) name_table[n].ute_name); + } + free(name_table); + parse_columns(0); + + return EXIT_SUCCESS; +} diff --git a/contrib/ncurses/ncurses/tinfo/make_keys.c b/contrib/ncurses/ncurses/tinfo/make_keys.c new file mode 100644 index 00000000..b8eb9343 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/make_keys.c @@ -0,0 +1,167 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2011,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + ****************************************************************************/ + +/* + * This replaces an awk script which translated keys.list into keys.tries by + * making the output show the indices into the TERMTYPE Strings array. Doing + * it that way lets us cut down on the size of the init_keytry() function. + */ + +#define USE_TERMLIB 1 +#include + +MODULE_ID("$Id: make_keys.c,v 1.23 2021/08/18 20:55:25 tom Exp $") + +#include + +static unsigned +unknown(void) +{ + static unsigned result = 0; + + if (result == 0) { + unsigned n; + for (n = 0; strnames[n] != 0; n++) { + ++result; + } + for (n = 0; strfnames[n] != 0; n++) { + ++result; + } + } + return result; +} + +static unsigned +lookup(const char *name) +{ + unsigned n; + bool found = FALSE; + for (n = 0; strnames[n] != 0; n++) { + if (!strcmp(name, strnames[n])) { + found = TRUE; + break; + } + } + if (!found) { + for (n = 0; strfnames[n] != 0; n++) { + if (!strcmp(name, strfnames[n])) { + found = TRUE; + break; + } + } + } + return found ? n : unknown(); +} + +static void +make_keys(FILE *ifp, FILE *ofp) +{ + char buffer[BUFSIZ]; + char from[256]; + char to[256]; + unsigned ignore = unknown(); + unsigned maxlen = 16; + int scanned; + + while (fgets(buffer, (int) sizeof(buffer), ifp) != 0) { + if (*buffer == '#') + continue; + + to[sizeof(to) - 1] = '\0'; + from[sizeof(from) - 1] = '\0'; + + scanned = sscanf(buffer, "%255s %255s", to, from); + if (scanned == 2) { + unsigned code = lookup(from); + if (code == ignore) + continue; + if (strlen(from) > maxlen) + maxlen = (unsigned) strlen(from); + fprintf(ofp, "\t{ %4u, %-*.*s },\t/* %s */\n", + code, + (int) maxlen, (int) maxlen, + to, + from); + } + } +} + +static void +write_list(FILE *ofp, const char **list) +{ + while (*list != 0) + fprintf(ofp, "%s\n", *list++); +} + +int +main(int argc, char *argv[]) +{ + static const char *prefix[] = + { + "#ifndef _INIT_KEYTRY_H", + "#define _INIT_KEYTRY_H 1", + "", + "/* This file was generated by MAKE_KEYS */", + "", + "#include ", + "", + "#if BROKEN_LINKER", + "static", + "#endif", + "const struct tinfo_fkeys _nc_tinfo_fkeys[] = {", + 0 + }; + static const char *suffix[] = + { + "\t{ 0, 0} };", + "", + "#endif /* _INIT_KEYTRY_H */", + 0 + }; + + write_list(stdout, prefix); + if (argc > 1) { + int n; + for (n = 1; n < argc; n++) { + FILE *fp = fopen(argv[n], "r"); + if (fp != 0) { + make_keys(fp, stdout); + fclose(fp); + } + } + } else { + make_keys(stdin, stdout); + } + write_list(stdout, suffix); + return EXIT_SUCCESS; +} diff --git a/contrib/ncurses/ncurses/tinfo/name_match.c b/contrib/ncurses/ncurses/tinfo/name_match.c new file mode 100644 index 00000000..71e584d7 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/name_match.c @@ -0,0 +1,126 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2013,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999-on * + ****************************************************************************/ + +#include +#include + +MODULE_ID("$Id: name_match.c,v 1.25 2020/02/02 23:34:34 tom Exp $") + +#define FirstName _nc_globals.first_name + +#if NCURSES_USE_TERMCAP && NCURSES_XNAMES +static const char * +skip_index(const char *name) +{ + if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) { + const char *bar = strchr(name, '|'); + if (bar != 0 && (bar - name) == 2) + name = bar + 1; + } + return name; +} +#endif + +/* + * Get the primary name from the given name list. For terminfo, this is the + * first name. For termcap, this may be the second name, if the first one + * happens to be two characters. + */ +NCURSES_EXPORT(char *) +_nc_first_name(const char *const sp) +{ +#if NO_LEAKS + if (sp == 0) { + if (FirstName != 0) { + FreeAndNull(FirstName); + } + } else +#endif + { + if (FirstName == 0) + FirstName = typeMalloc(char, MAX_NAME_SIZE + 1); + + if (FirstName != 0) { + unsigned n; + const char *src = sp; +#if NCURSES_USE_TERMCAP && NCURSES_XNAMES + src = skip_index(sp); +#endif + for (n = 0; n < MAX_NAME_SIZE; n++) { + if ((FirstName[n] = src[n]) == '\0' + || (FirstName[n] == '|')) + break; + } + FirstName[n] = '\0'; + } + } + return (FirstName); +} + +/* + * Is the given name matched in namelist? + */ +NCURSES_EXPORT(int) +_nc_name_match(const char *const namelst, const char *const name, const char *const delim) +{ + const char *s; + + if ((s = namelst) != 0) { + while (*s != '\0') { + const char *d, *t; + int code, found; + + for (d = name; *d != '\0'; d++) { + if (*s != *d) + break; + s++; + } + found = FALSE; + for (code = TRUE; *s != '\0'; code = FALSE, s++) { + for (t = delim; *t != '\0'; t++) { + if (*s == *t) { + found = TRUE; + break; + } + } + if (found) + break; + } + if (code && *d == '\0') + return code; + if (*s++ == 0) + break; + } + } + return FALSE; +} diff --git a/contrib/ncurses/ncurses/tinfo/obsolete.c b/contrib/ncurses/ncurses/tinfo/obsolete.c new file mode 100644 index 00000000..cc62f18c --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/obsolete.c @@ -0,0 +1,335 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2013-2014,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2013-on * + ****************************************************************************/ + +/* +** Support for obsolete/unusual features. +*/ + +#include + +MODULE_ID("$Id: obsolete.c,v 1.11 2023/10/21 15:38:47 tom Exp $") + +/* + * Obsolete entrypoint retained for binary compatibility. + */ +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_DCLx FILE *ofp, int buffered) +{ +#if NCURSES_SP_FUNCS + (void) SP_PARM; +#endif + (void) ofp; + (void) buffered; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_set_buffer(FILE *ofp, int buffered) +{ + NCURSES_SP_NAME(_nc_set_buffer) (CURRENT_SCREEN, ofp, buffered); +} +#endif + +#if !HAVE_STRDUP +NCURSES_EXPORT(char *) +_nc_strdup(const char *s) +{ + char *result = 0; + if (s != 0) { + size_t need = strlen(s); + result = malloc(need + 1); + if (result != 0) { + _nc_STRCPY(result, s, need); + } + } + return result; +} +#endif + +#if USE_MY_MEMMOVE +#define DST ((char *)s1) +#define SRC ((const char *)s2) +NCURSES_EXPORT(void *) +_nc_memmove(void *s1, const void *s2, size_t n) +{ + if (n != 0) { + if ((DST + n > SRC) && (SRC + n > DST)) { + static char *bfr; + static size_t length; + register size_t j; + if (length < n) { + length = (n * 3) / 2; + bfr = typeRealloc(char, length, bfr); + } + for (j = 0; j < n; j++) + bfr[j] = SRC[j]; + s2 = bfr; + } + while (n-- != 0) + DST[n] = SRC[n]; + } + return s1; +} +#endif /* USE_MY_MEMMOVE */ + +#ifdef EXP_XTERM_1005 +NCURSES_EXPORT(int) +_nc_conv_to_utf8(unsigned char *target, unsigned source, unsigned limit) +{ +#define CH(n) UChar((source) >> ((n) * 8)) + int rc = 0; + + if (source <= 0x0000007f) + rc = 1; + else if (source <= 0x000007ff) + rc = 2; + else if (source <= 0x0000ffff) + rc = 3; + else if (source <= 0x001fffff) + rc = 4; + else if (source <= 0x03ffffff) + rc = 5; + else /* (source <= 0x7fffffff) */ + rc = 6; + + if ((unsigned) rc > limit) { /* whatever it is, we cannot decode it */ + rc = 0; + } + + if (target != 0) { + switch (rc) { + case 1: + target[0] = CH(0); + break; + + case 2: + target[1] = UChar(0x80 | (CH(0) & 0x3f)); + target[0] = UChar(0xc0 | (CH(0) >> 6) | ((CH(1) & 0x07) << 2)); + break; + + case 3: + target[2] = UChar(0x80 | (CH(0) & 0x3f)); + target[1] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + target[0] = UChar(0xe0 | ((int) (CH(1) & 0xf0) >> 4)); + break; + + case 4: + target[3] = UChar(0x80 | (CH(0) & 0x3f)); + target[2] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + target[1] = UChar(0x80 | + ((int) (CH(1) & 0xf0) >> 4) | + ((int) (CH(2) & 0x03) << 4)); + target[0] = UChar(0xf0 | ((int) (CH(2) & 0x1f) >> 2)); + break; + + case 5: + target[4] = UChar(0x80 | (CH(0) & 0x3f)); + target[3] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + target[2] = UChar(0x80 | + ((int) (CH(1) & 0xf0) >> 4) | + ((int) (CH(2) & 0x03) << 4)); + target[1] = UChar(0x80 | (CH(2) >> 2)); + target[0] = UChar(0xf8 | (CH(3) & 0x03)); + break; + + case 6: + target[5] = UChar(0x80 | (CH(0) & 0x3f)); + target[4] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + target[3] = UChar(0x80 | (CH(1) >> 4) | ((CH(2) & 0x03) << 4)); + target[2] = UChar(0x80 | (CH(2) >> 2)); + target[1] = UChar(0x80 | (CH(3) & 0x3f)); + target[0] = UChar(0xfc | ((int) (CH(3) & 0x40) >> 6)); + break; + } + } + + return rc; /* number of bytes needed in target */ +#undef CH +} + +NCURSES_EXPORT(int) +_nc_conv_to_utf32(unsigned *target, const char *source, unsigned limit) +{ +#define CH(n) UChar((*target) >> ((n) * 8)) + int rc = 0; + int j; + unsigned mask = 0; + + /* + * Find the number of bytes we will need from the source. + */ + if ((*source & 0x80) == 0) { + rc = 1; + mask = (unsigned) *source; + } else if ((*source & 0xe0) == 0xc0) { + rc = 2; + mask = (unsigned) (*source & 0x1f); + } else if ((*source & 0xf0) == 0xe0) { + rc = 3; + mask = (unsigned) (*source & 0x0f); + } else if ((*source & 0xf8) == 0xf0) { + rc = 4; + mask = (unsigned) (*source & 0x07); + } else if ((*source & 0xfc) == 0xf8) { + rc = 5; + mask = (unsigned) (*source & 0x03); + } else if ((*source & 0xfe) == 0xfc) { + rc = 6; + mask = (unsigned) (*source & 0x01); + } + + if ((unsigned) rc > limit) { /* whatever it is, we cannot decode it */ + rc = 0; + } + + /* + * sanity-check. + */ + if (rc > 1) { + for (j = 1; j < rc; j++) { + if ((source[j] & 0xc0) != 0x80) + break; + } + if (j != rc) { + rc = 0; + } + } + + if (target != 0) { + int shift = 0; + *target = 0; + for (j = 1; j < rc; j++) { + *target |= (unsigned) (source[rc - j] & 0x3f) << shift; + shift += 6; + } + *target |= mask << shift; + } + return rc; +#undef CH +} +#endif /* EXP_XTERM_1005 */ + +#ifdef EXP_OOM_TESTING +/* + * Out-of-memory testing, suitable for checking if initialization (and limited + * running) recovers from errors due to insufficient memory. In practice, this + * is unlikely except with artificially constructed tests (or poorly behaved + * applications). + */ +#undef malloc +#undef calloc +#undef realloc +#undef free +#undef strdup + +#define TR_OOM(stmt) T(stmt) + +static long oom_limit = -1; +static long oom_count = 0; + +static bool +oom_check(void) +{ + static bool initialized = FALSE; + static bool triggered = FALSE; + bool result = FALSE; + + if (!initialized) { + char *env = getenv("NCURSES_OOM_TESTING"); + initialized = TRUE; + if (env != NULL) { + char *check; + oom_limit = strtol(env, &check, 0); + if (check != NULL && *check != '\0') + oom_limit = 0; + } + } + ++oom_count; + if (oom_limit >= 0) { + result = (oom_count > oom_limit); + if (result && !triggered) { + triggered = TRUE; + TR_OOM(("out-of-memory")); + } + } + return result; +} + +NCURSES_EXPORT(void *) +_nc_oom_malloc(size_t size) +{ + char *result = (oom_check() + ? NULL + : malloc(size)); + TR_OOM(("oom #%ld malloc(%ld) %p", oom_count, size, result)); + return result; +} + +NCURSES_EXPORT(void *) +_nc_oom_calloc(size_t nmemb, size_t size) +{ + char *result = (oom_check() + ? NULL + : calloc(nmemb, size)); + TR_OOM(("oom #%ld calloc(%ld, %ld) %p", oom_count, nmemb, size, result)); + return result; +} + +NCURSES_EXPORT(void *) +_nc_oom_realloc(void *ptr, size_t size) +{ + char *result = (oom_check() + ? NULL + : realloc(ptr, size)); + TR_OOM(("oom #%ld realloc(%p, %ld) %p", oom_count, ptr, size, result)); + return result; +} + +NCURSES_EXPORT(void) +_nc_oom_free(void *ptr) +{ + ++oom_count; + TR_OOM(("oom #%ld free(%p)", oom_count, ptr)); + free(ptr); +} + +NCURSES_EXPORT(char *) +_nc_oom_strdup(const char *ptr) +{ + char *result = (oom_check() + ? NULL + : strdup(ptr)); + TR_OOM(("oom #%ld strdup(%p) %p", oom_count, ptr, result)); + return result; +} +#endif /* EXP_OOM_TESTING */ diff --git a/contrib/ncurses/ncurses/tinfo/parse_entry.c b/contrib/ncurses/ncurses/tinfo/parse_entry.c new file mode 100644 index 00000000..23433697 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/parse_entry.c @@ -0,0 +1,1158 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * parse_entry.c -- compile one terminfo or termcap entry + * + * Get an exact in-core representation of an entry. Don't + * try to resolve use or tc capabilities, that is someone + * else's job. Depends on the lexical analyzer to get tokens + * from the input stream. + */ + +#define __INTERNAL_CAPS_VISIBLE +#include + +#include +#include + +MODULE_ID("$Id: parse_entry.c,v 1.110 2024/10/19 21:22:04 tom Exp $") + +#ifdef LINT +static short const parametrized[] = +{0}; +#else +#include +#endif + +static void postprocess_termcap(TERMTYPE2 *, bool); +static void postprocess_terminfo(TERMTYPE2 *); +static struct name_table_entry const *lookup_fullname(const char *name); + +#if NCURSES_XNAMES + +static struct name_table_entry const * +_nc_extend_names(ENTRY * entryp, const char *name, int token_type) +{ + static struct name_table_entry temp; + TERMTYPE2 *tp = &(entryp->tterm); + unsigned offset = 0; + unsigned actual; + unsigned tindex; + unsigned first, last, n; + bool found; + + switch (token_type) { + case BOOLEAN: + first = 0; + last = tp->ext_Booleans; + offset = tp->ext_Booleans; + tindex = tp->num_Booleans; + break; + case NUMBER: + first = tp->ext_Booleans; + last = tp->ext_Numbers + first; + offset = (unsigned) (tp->ext_Booleans + tp->ext_Numbers); + tindex = tp->num_Numbers; + break; + case STRING: + first = (unsigned) (tp->ext_Booleans + tp->ext_Numbers); + last = tp->ext_Strings + first; + offset = (unsigned) (tp->ext_Booleans + tp->ext_Numbers + tp->ext_Strings); + tindex = tp->num_Strings; + break; + case CANCEL: + actual = NUM_EXT_NAMES(tp); + for (n = 0; n < actual; n++) { + if (!strcmp(name, tp->ext_Names[n])) { + if (n > (unsigned) (tp->ext_Booleans + tp->ext_Numbers)) { + token_type = STRING; + } else if (n > tp->ext_Booleans) { + token_type = NUMBER; + } else { + token_type = BOOLEAN; + } + return _nc_extend_names(entryp, name, token_type); + } + } + /* Well, we are given a cancel for a name that we don't recognize */ + return _nc_extend_names(entryp, name, STRING); + default: + return NULL; + } + + /* Adjust the 'offset' (insertion-point) to keep the lists of extended + * names sorted. + */ + for (n = first, found = FALSE; n < last; n++) { + int cmp = strcmp(tp->ext_Names[n], name); + if (cmp == 0) + found = TRUE; + if (cmp >= 0) { + offset = n; + tindex = n - first; + switch (token_type) { + case BOOLEAN: + tindex += BOOLCOUNT; + break; + case NUMBER: + tindex += NUMCOUNT; + break; + case STRING: + tindex += STRCOUNT; + break; + } + break; + } + } + +#define for_each_value(max) \ + for (last = (unsigned) (max - 1); last > tindex; last--) + + if (!found) { + char *saved; + + if ((saved = _nc_save_str(name)) == NULL) + return NULL; + + switch (token_type) { + case BOOLEAN: + tp->ext_Booleans++; + tp->num_Booleans++; + TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans); + for_each_value(tp->num_Booleans) + tp->Booleans[last] = tp->Booleans[last - 1]; + break; + case NUMBER: + tp->ext_Numbers++; + tp->num_Numbers++; + TYPE_REALLOC(NCURSES_INT2, tp->num_Numbers, tp->Numbers); + for_each_value(tp->num_Numbers) + tp->Numbers[last] = tp->Numbers[last - 1]; + break; + case STRING: + tp->ext_Strings++; + tp->num_Strings++; + TYPE_REALLOC(char *, tp->num_Strings, tp->Strings); + for_each_value(tp->num_Strings) + tp->Strings[last] = tp->Strings[last - 1]; + break; + } + actual = NUM_EXT_NAMES(tp); + TYPE_REALLOC(char *, actual, tp->ext_Names); + while (--actual > offset) + tp->ext_Names[actual] = tp->ext_Names[actual - 1]; + tp->ext_Names[offset] = saved; + } + + temp.nte_name = tp->ext_Names[offset]; + temp.nte_type = token_type; + temp.nte_index = (short) tindex; + temp.nte_link = -1; + + return &temp; +} + +static const char * +usertype2s(int mask) +{ + const char *result = "unknown"; + if (mask & (1 << BOOLEAN)) { + result = "boolean"; + } else if (mask & (1 << NUMBER)) { + result = "number"; + } else if (mask & (1 << STRING)) { + result = "string"; + } + return result; +} + +static bool +expected_type(const char *name, int token_type, bool silent) +{ + struct user_table_entry const *entry = _nc_find_user_entry(name); + bool result = TRUE; + if ((entry != 0) && (token_type != CANCEL)) { + int have_type = (1 << token_type); + if (!(entry->ute_type & have_type)) { + if (!silent) + _nc_warning("expected %s-type for %s, have %s", + usertype2s(entry->ute_type), + name, + usertype2s(have_type)); + result = FALSE; + } + } + return result; +} +#endif /* NCURSES_XNAMES */ + +/* + * A valid entry name uses characters from the "portable character set" + * (more commonly referred to as US-ASCII), and disallows some of the + * punctuation characters: + * + * '/' is a pathname separator + * '\' may be a pathname separator, but more important, is an escape + * '|' delimits names and description + * '#' denotes a numeric value + * '=' denotes a string value + * '@' denotes a cancelled symbol + * ',' separates terminfo capabilities + * ':' separates termcap capabilities + * + * Termcap capability names may begin with a '#' or '@' (since they have + * exactly two characters). + */ +static bool +valid_entryname(const char *name) +{ + bool result = TRUE; + bool first = TRUE; + int ch; + while ((ch = UChar(*name++)) != '\0') { + if (ch <= ' ' || ch > '~' || strchr("/\\|=,:", ch) != NULL) { + result = FALSE; + break; + } + if (!first && strchr("#@", ch) != NULL) { + result = FALSE; + break; + } + first = FALSE; + } + return result; +} + +/* + * int + * _nc_parse_entry(entry, literal, silent) + * + * Compile one entry. Doesn't try to resolve use or tc capabilities. + * + * found-forward-use = FALSE + * re-initialise internal arrays + * get_token(); + * if the token was not a name in column 1, complain and die + * save names in entry's string table + * while (get_token() is not EOF and not NAMES) + * check for existence and type-correctness + * enter cap into structure + * if STRING + * save string in entry's string table + * push back token + */ + +#define BAD_TC_USAGE if (!bad_tc_usage) \ + { bad_tc_usage = TRUE; \ + _nc_warning("Legacy termcap allows only a trailing tc= clause"); } + +#define MAX_NUMBER MAX_OF_TYPE(NCURSES_INT2) + +NCURSES_EXPORT(int) +_nc_parse_entry(ENTRY * entryp, int literal, bool silent) +{ + int token_type; + struct name_table_entry const *entry_ptr; + char *ptr, *base; + const char *name; + bool bad_tc_usage = FALSE; + + TR(TRACE_DATABASE, + (T_CALLED("_nc_parse_entry(entry=%p, literal=%d, silent=%d)"), + (void *) entryp, literal, silent)); + + token_type = _nc_get_token(silent); + + if (token_type == EOF) + returnDB(EOF); + if (token_type != NAMES) + _nc_err_abort("Entry does not start with terminal names in column one"); + + _nc_init_entry(entryp); + + entryp->cstart = _nc_comment_start; + entryp->cend = _nc_comment_end; + entryp->startline = _nc_start_line; + DEBUG(2, ("Comment range is %ld to %ld", entryp->cstart, entryp->cend)); + + /* + * Strip off the 2-character termcap name, if present. Originally termcap + * used that as an indexing aid. We can retain 2-character terminfo names, + * but note that they would be lost if we translate to/from termcap. This + * feature is supposedly obsolete since "newer" BSD implementations do not + * use it; however our reference for this feature is SunOS 4.x, which + * implemented it. Note that the resulting terminal type was never the + * 2-character name, but was instead the first alias after that. + */ +#define ok_TC2(s) (isgraph(UChar(s)) && (s) != '|') + ptr = _nc_curr_token.tk_name; + if (_nc_syntax == SYN_TERMCAP +#if NCURSES_XNAMES + && !_nc_user_definable +#endif + ) { + if (ok_TC2(ptr[0]) && ok_TC2(ptr[1]) && (ptr[2] == '|')) { + ptr += 3; + _nc_curr_token.tk_name[2] = '\0'; + } + } + + entryp->tterm.str_table = entryp->tterm.term_names = _nc_save_str(ptr); + + if (entryp->tterm.str_table == 0) + returnDB(ERR); + + DEBUG(2, ("Starting '%s'", ptr)); + + /* + * We do this because the one-token lookahead in the parse loop + * results in the terminal type getting prematurely set to correspond + * to that of the next entry. + */ + name = _nc_first_name(entryp->tterm.term_names); + if (!valid_entryname(name)) { + _nc_warning("invalid entry name \"%s\"", name); + name = "invalid"; + } + _nc_set_type(name); + + /* check for overly-long names and aliases */ + for (base = entryp->tterm.term_names; (ptr = strchr(base, '|')) != 0; + base = ptr + 1) { + if (ptr - base > MAX_ALIAS) { + _nc_warning("%s `%.*s' may be too long", + (base == entryp->tterm.term_names) + ? "primary name" + : "alias", + (int) (ptr - base), base); + } + } + + entryp->nuses = 0; + + for (token_type = _nc_get_token(silent); + token_type != EOF && token_type != NAMES; + token_type = _nc_get_token(silent)) { + bool is_use = (strcmp(_nc_curr_token.tk_name, "use") == 0); + bool is_tc = !is_use && (strcmp(_nc_curr_token.tk_name, "tc") == 0); + if (is_use || is_tc) { + char *saved; + + if (!VALID_STRING(_nc_curr_token.tk_valstring) + || _nc_curr_token.tk_valstring[0] == '\0') { + _nc_warning("missing name for use-clause"); + continue; + } else if (!valid_entryname(_nc_curr_token.tk_valstring)) { + _nc_warning("invalid name for use-clause \"%s\"", + _nc_curr_token.tk_valstring); + continue; + } else if (entryp->nuses >= MAX_USES) { + _nc_warning("too many use-clauses, ignored \"%s\"", + _nc_curr_token.tk_valstring); + continue; + } + if ((saved = _nc_save_str(_nc_curr_token.tk_valstring)) != NULL) { + entryp->uses[entryp->nuses].name = saved; + entryp->uses[entryp->nuses].line = _nc_curr_line; + entryp->nuses++; + if (entryp->nuses > 1 && is_tc) { + BAD_TC_USAGE + } + } + } else { + /* normal token lookup */ + entry_ptr = _nc_find_entry(_nc_curr_token.tk_name, + _nc_get_hash_table(_nc_syntax)); + + /* + * Our kluge to handle aliasing. The reason it is done + * this ugly way, with a linear search, is so the hashing + * machinery doesn't have to be made really complicated + * (also we get better warnings this way). No point in + * making this case fast, aliased caps aren't common now + * and will get rarer. + */ + if (entry_ptr == NOTFOUND) { + const struct alias *ap; + + if (_nc_syntax == SYN_TERMCAP) { + if (entryp->nuses != 0) { + BAD_TC_USAGE + } + for (ap = _nc_get_alias_table(TRUE); ap->from; ap++) + if (strcmp(ap->from, _nc_curr_token.tk_name) == 0) { + if (ap->to == (char *) 0) { + _nc_warning("%s (%s termcap extension) ignored", + ap->from, ap->source); + goto nexttok; + } + + entry_ptr = _nc_find_entry(ap->to, + _nc_get_hash_table(TRUE)); + if (entry_ptr && !silent) + _nc_warning("%s (%s termcap extension) aliased to %s", + ap->from, ap->source, ap->to); + break; + } + } else { /* if (_nc_syntax == SYN_TERMINFO) */ + for (ap = _nc_get_alias_table(FALSE); ap->from; ap++) + if (strcmp(ap->from, _nc_curr_token.tk_name) == 0) { + if (ap->to == (char *) 0) { + _nc_warning("%s (%s terminfo extension) ignored", + ap->from, ap->source); + goto nexttok; + } + + entry_ptr = _nc_find_entry(ap->to, + _nc_get_hash_table(FALSE)); + if (entry_ptr && !silent) + _nc_warning("%s (%s terminfo extension) aliased to %s", + ap->from, ap->source, ap->to); + break; + } + + if (entry_ptr == NOTFOUND) { + entry_ptr = lookup_fullname(_nc_curr_token.tk_name); + } + } + } +#if NCURSES_XNAMES + /* + * If we have extended-names active, we will automatically + * define a name based on its context. + */ + if (entry_ptr == NOTFOUND + && _nc_user_definable) { + if (expected_type(_nc_curr_token.tk_name, token_type, silent)) { + if ((entry_ptr = _nc_extend_names(entryp, + _nc_curr_token.tk_name, + token_type)) != 0) { + if (_nc_tracing >= DEBUG_LEVEL(1)) { + _nc_warning("extended capability '%s'", + _nc_curr_token.tk_name); + } + } + } else { + /* ignore it: we have already printed error message */ + continue; + } + } +#endif /* NCURSES_XNAMES */ + + /* can't find this cap name, not even as an alias */ + if (entry_ptr == NOTFOUND) { + if (!silent) + _nc_warning("unknown capability '%s'", + _nc_curr_token.tk_name); + continue; + } + + /* deal with bad type/value combinations. */ + if (token_type == CANCEL) { + /* + * Prefer terminfo in this (long-obsolete) ambiguity: + */ + if (!strcmp("ma", _nc_curr_token.tk_name)) { + entry_ptr = _nc_find_type_entry("ma", NUMBER, + _nc_syntax != 0); + assert(entry_ptr != 0); + } + } else if (entry_ptr->nte_type != token_type) { + /* + * Nasty special cases here handle situations in which type + * information can resolve name clashes. Normal lookup + * finds the last instance in the capability table of a + * given name, regardless of type. find_type_entry looks + * for a first matching instance with given type. So as + * long as all ambiguous names occur in pairs of distinct + * type, this will do the job. + */ + + if (token_type == NUMBER + && !strcmp("ma", _nc_curr_token.tk_name)) { + /* tell max_attributes from arrow_key_map */ + entry_ptr = _nc_find_type_entry("ma", NUMBER, + _nc_syntax != 0); + assert(entry_ptr != 0); + + } else if (token_type == STRING + && !strcmp("MT", _nc_curr_token.tk_name)) { + /* map terminfo's string MT to MT */ + entry_ptr = _nc_find_type_entry("MT", STRING, + _nc_syntax != 0); + assert(entry_ptr != 0); + + } else if (token_type == BOOLEAN + && entry_ptr->nte_type == STRING) { + /* treat strings without following "=" as empty strings */ + token_type = STRING; + } else { + /* we couldn't recover; skip this token */ + if (!silent) { + const char *type_name; + switch (entry_ptr->nte_type) { + case BOOLEAN: + type_name = "boolean"; + break; + case STRING: + type_name = "string"; + break; + case NUMBER: + type_name = "numeric"; + break; + default: + type_name = "unknown"; + break; + } + _nc_warning("wrong type used for %s capability '%s'", + type_name, _nc_curr_token.tk_name); + } + continue; + } + } + + /* now we know that the type/value combination is OK */ + switch (token_type) { + case CANCEL: + switch (entry_ptr->nte_type) { + case BOOLEAN: + entryp->tterm.Booleans[entry_ptr->nte_index] = CANCELLED_BOOLEAN; + break; + + case NUMBER: + entryp->tterm.Numbers[entry_ptr->nte_index] = CANCELLED_NUMERIC; + break; + + case STRING: + entryp->tterm.Strings[entry_ptr->nte_index] = CANCELLED_STRING; + break; + } + break; + + case BOOLEAN: + entryp->tterm.Booleans[entry_ptr->nte_index] = TRUE; + break; + + case NUMBER: +#if !NCURSES_EXT_NUMBERS + if (_nc_curr_token.tk_valnumber > MAX_NUMBER) { + entryp->tterm.Numbers[entry_ptr->nte_index] = MAX_NUMBER; + } else +#endif + { + entryp->tterm.Numbers[entry_ptr->nte_index] = + (NCURSES_INT2) _nc_curr_token.tk_valnumber; + } + break; + + case STRING: + ptr = _nc_curr_token.tk_valstring; + if (_nc_syntax == SYN_TERMCAP) { + int n = entry_ptr->nte_index; + ptr = _nc_captoinfo(_nc_curr_token.tk_name, + ptr, + (n < (int) SIZEOF(parametrized)) + ? parametrized[n] + : 0); + } + entryp->tterm.Strings[entry_ptr->nte_index] = _nc_save_str(ptr); + break; + + default: + if (!silent) + _nc_warning("unknown token type"); + _nc_panic_mode((char) ((_nc_syntax == SYN_TERMCAP) ? ':' : ',')); + continue; + } + } /* end else cur_token.name != "use" */ + nexttok: + continue; /* cannot have a label w/o statement */ + } /* endwhile (not EOF and not NAMES) */ + + _nc_push_token(token_type); + _nc_set_type(_nc_first_name(entryp->tterm.term_names)); + + /* + * Try to deduce as much as possible from extension capabilities + * (this includes obsolete BSD capabilities). Sigh...it would be more + * space-efficient to call this after use resolution, but it has + * to be done before entry allocation is wrapped up. + */ + if (!literal) { + if (_nc_syntax == SYN_TERMCAP) { + bool has_base_entry = FALSE; + + /* + * Don't insert defaults if this is a `+' entry meant only + * for inclusion in other entries (not sure termcap ever + * had these, actually). + */ + if (strchr(entryp->tterm.term_names, '+')) { + has_base_entry = TRUE; + } else { + unsigned i; + /* + * Otherwise, look for a base entry that will already + * have picked up defaults via translation. + */ + for (i = 0; i < entryp->nuses; i++) { + if (entryp->uses[i].name != 0 + && !strchr(entryp->uses[i].name, '+')) + has_base_entry = TRUE; + } + } + + postprocess_termcap(&entryp->tterm, has_base_entry); + } else + postprocess_terminfo(&entryp->tterm); + } + _nc_wrap_entry(entryp, FALSE); + + returnDB(OK); +} + +NCURSES_EXPORT(int) +_nc_capcmp(const char *s, const char *t) +/* compare two string capabilities, stripping out padding */ +{ + bool ok_s = VALID_STRING(s); + bool ok_t = VALID_STRING(t); + + if (ok_s && ok_t) { + for (;;) { + if (s[0] == '$' && s[1] == '<') { + for (s += 2;; s++) { + if (!(isdigit(UChar(*s)) + || *s == '.' + || *s == '*' + || *s == '/' + || *s == '>')) { + break; + } + } + } + + if (t[0] == '$' && t[1] == '<') { + for (t += 2;; t++) { + if (!(isdigit(UChar(*t)) + || *t == '.' + || *t == '*' + || *t == '/' + || *t == '>')) { + break; + } + } + } + + /* we've now pushed s and t past any padding they pointed at */ + + if (*s == '\0' && *t == '\0') + return (0); + + if (*s != *t) + return (*t - *s); + + /* else *s == *t but one is not NUL, so continue */ + s++, t++; + } + } else if (ok_s || ok_t) { + return 1; + } + return 0; +} + +static void +append_acs0(string_desc * dst, int code, const char *src, size_t off) +{ + if (src != 0 && off < strlen(src)) { + char temp[3]; + temp[0] = (char) code; + temp[1] = src[off]; + temp[2] = 0; + _nc_safe_strcat(dst, temp); + } +} + +static void +append_acs(string_desc * dst, int code, const char *src) +{ + if (VALID_STRING(src) && strlen(src) == 1) { + append_acs0(dst, code, src, 0); + } +} + +/* + * The ko capability, if present, consists of a comma-separated capability + * list. For each capability, we may assume there is a keycap that sends the + * string which is the value of that capability. + */ +#define DATA(from, to) { { from }, { to } } +typedef struct { + const char from[3]; + const char to[6]; +} assoc; +static assoc const ko_xlate[] = +{ + DATA("al", "kil1"), /* insert line key -> KEY_IL */ + DATA("bt", "kcbt"), /* back tab -> KEY_BTAB */ + DATA("cd", "ked"), /* clear-to-eos key -> KEY_EOL */ + DATA("ce", "kel"), /* clear-to-eol key -> KEY_EOS */ + DATA("cl", "kclr"), /* clear key -> KEY_CLEAR */ + DATA("ct", "tbc"), /* clear all tabs -> KEY_CATAB */ + DATA("dc", "kdch1"), /* delete char -> KEY_DC */ + DATA("dl", "kdl1"), /* delete line -> KEY_DL */ + DATA("do", "kcud1"), /* down key -> KEY_DOWN */ + DATA("ei", "krmir"), /* exit insert key -> KEY_EIC */ + DATA("ho", "khome"), /* home key -> KEY_HOME */ + DATA("ic", "kich1"), /* insert char key -> KEY_IC */ + DATA("im", "kIC"), /* insert-mode key -> KEY_SIC */ + DATA("le", "kcub1"), /* le key -> KEY_LEFT */ + DATA("nd", "kcuf1"), /* nd key -> KEY_RIGHT */ + DATA("nl", "kent"), /* new line key -> KEY_ENTER */ + DATA("st", "khts"), /* set-tab key -> KEY_STAB */ + DATA("ta", ""), + DATA("up", "kcuu1"), /* up-arrow key -> KEY_UP */ +}; + +/* + * This routine fills in string caps that either had defaults under + * termcap or can be manufactured from obsolete termcap capabilities. + * It was lifted from Ross Ridge's mytinfo package. + */ + +static const char C_CR[] = "\r"; +static const char C_LF[] = "\n"; +static const char C_BS[] = "\b"; +static const char C_HT[] = "\t"; + +/* + * This bit of legerdemain turns all the terminfo variable names into + * references to locations in the arrays Booleans, Numbers, and Strings --- + * precisely what's needed. + */ + +#undef CUR +#define CUR tp-> + +static void +postprocess_termcap(TERMTYPE2 *tp, bool has_base) +{ + char buf[MAX_LINE * 2 + 2]; + string_desc result; + + TR(TRACE_DATABASE, + (T_CALLED("postprocess_termcap(tp=%p, has_base=%d)"), + (void *) tp, has_base)); + + /* + * TERMCAP DEFAULTS AND OBSOLETE-CAPABILITY TRANSLATIONS + * + * This first part of the code is the functional inverse of the + * fragment in capdefaults.c. + * ---------------------------------------------------------------------- + */ + + /* if there was a tc entry, assume we picked up defaults via that */ + if (!has_base) { + if (WANTED(init_3string) && PRESENT(termcap_init2)) + init_3string = _nc_save_str(termcap_init2); + + if (WANTED(reset_2string) && PRESENT(termcap_reset)) + reset_2string = _nc_save_str(termcap_reset); + + if (WANTED(carriage_return)) { + if (carriage_return_delay > 0) { + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%s$<%d>", C_CR, carriage_return_delay); + carriage_return = _nc_save_str(buf); + } else + carriage_return = _nc_save_str(C_CR); + } + if (WANTED(cursor_left)) { + if (backspace_delay > 0) { + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%s$<%d>", C_BS, backspace_delay); + cursor_left = _nc_save_str(buf); + } else if (backspaces_with_bs == 1) + cursor_left = _nc_save_str(C_BS); + else if (PRESENT(backspace_if_not_bs)) + cursor_left = backspace_if_not_bs; + } + /* vi doesn't use "do", but it does seem to use nl (or '\n') instead */ + if (WANTED(cursor_down)) { + if (PRESENT(linefeed_if_not_lf)) + cursor_down = linefeed_if_not_lf; + else if (linefeed_is_newline != 1) { + if (new_line_delay > 0) { + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%s$<%d>", C_LF, new_line_delay); + cursor_down = _nc_save_str(buf); + } else + cursor_down = _nc_save_str(C_LF); + } + } + if (WANTED(scroll_forward) && crt_no_scrolling != 1) { + if (PRESENT(linefeed_if_not_lf)) + cursor_down = linefeed_if_not_lf; + else if (linefeed_is_newline != 1) { + if (new_line_delay > 0) { + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%s$<%d>", C_LF, new_line_delay); + scroll_forward = _nc_save_str(buf); + } else + scroll_forward = _nc_save_str(C_LF); + } + } + if (WANTED(newline)) { + if (linefeed_is_newline == 1) { + if (new_line_delay > 0) { + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%s$<%d>", C_LF, new_line_delay); + newline = _nc_save_str(buf); + } else + newline = _nc_save_str(C_LF); + } else if (PRESENT(carriage_return) && PRESENT(scroll_forward)) { + _nc_str_init(&result, buf, sizeof(buf)); + if (_nc_safe_strcat(&result, carriage_return) + && _nc_safe_strcat(&result, scroll_forward)) + newline = _nc_save_str(buf); + } else if (PRESENT(carriage_return) && PRESENT(cursor_down)) { + _nc_str_init(&result, buf, sizeof(buf)); + if (_nc_safe_strcat(&result, carriage_return) + && _nc_safe_strcat(&result, cursor_down)) + newline = _nc_save_str(buf); + } + } + } + + /* + * Inverse of capdefaults.c code ends here. + * ---------------------------------------------------------------------- + * + * TERMCAP-TO TERMINFO MAPPINGS FOR SOURCE TRANSLATION + * + * These translations will *not* be inverted by tgetent(). + */ + + if (!has_base) { + /* + * We wait until now to decide if we've got a working cr because even + * one that doesn't work can be used for newline. Unfortunately the + * space allocated for it is wasted. + */ + if (return_does_clr_eol == 1 || no_correctly_working_cr == 1) + carriage_return = ABSENT_STRING; + + /* + * Supposedly most termcap entries have ta now and '\t' is no longer a + * default, but it doesn't seem to be true... + */ + if (WANTED(tab)) { + if (horizontal_tab_delay > 0) { + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "%s$<%d>", C_HT, horizontal_tab_delay); + tab = _nc_save_str(buf); + } else + tab = _nc_save_str(C_HT); + } + if (init_tabs == ABSENT_NUMERIC && has_hardware_tabs == TRUE) + init_tabs = 8; + + /* + * Assume we can beep with ^G unless we're given bl@. + */ + if (WANTED(bell)) + bell = _nc_save_str("\007"); + } + + /* + * Translate the old termcap :pt: capability to it#8 + ht=\t + */ + if (has_hardware_tabs == TRUE) { + if (init_tabs != 8 && init_tabs != ABSENT_NUMERIC) + _nc_warning("hardware tabs with a width other than 8: %d", init_tabs); + else { + if (PRESENT(tab) && _nc_capcmp(tab, C_HT)) + _nc_warning("hardware tabs with a non-^I tab string %s", + _nc_visbuf(tab)); + else { + if (WANTED(tab)) + tab = _nc_save_str(C_HT); + init_tabs = 8; + } + } + } + /* + * Now translate the ko capability, if there is one. This + * isn't from mytinfo... + */ + if (PRESENT(other_non_function_keys)) { + char *base; + char *bp, *cp, *dp; + struct name_table_entry const *from_ptr; + struct name_table_entry const *to_ptr; + char buf2[MAX_TERMINFO_LENGTH]; + bool foundim; + + /* we're going to use this for a special case later */ + dp = strchr(other_non_function_keys, 'i'); + foundim = (dp != 0) && (dp[1] == 'm'); + + /* look at each comma-separated capability in the ko string... */ + for (base = other_non_function_keys; + (cp = strchr(base, ',')) != 0; + base = cp + 1) { + size_t len = (unsigned) (cp - base); + size_t n; + assoc const *ap = 0; + + for (n = 0; n < SIZEOF(ko_xlate); ++n) { + if (len == strlen(ko_xlate[n].from) + && strncmp(ko_xlate[n].from, base, len) == 0) { + ap = ko_xlate + n; + break; + } + } + if (ap == 0) { + _nc_warning("unknown capability `%.*s' in ko string", + (int) len, base); + continue; + } else if (ap->to[0] == '\0') /* ignore it */ + continue; + + /* now we know we found a match in ko_table, so... */ + + from_ptr = _nc_find_entry(ap->from, _nc_get_hash_table(TRUE)); + to_ptr = _nc_find_entry(ap->to, _nc_get_hash_table(FALSE)); + + if (!from_ptr || !to_ptr) /* should never happen! */ + _nc_err_abort("ko translation table is invalid, I give up"); + + if (WANTED(tp->Strings[from_ptr->nte_index])) { + _nc_warning("no value for ko capability %s", ap->from); + continue; + } + + if (tp->Strings[to_ptr->nte_index]) { + const char *s = tp->Strings[from_ptr->nte_index]; + const char *t = tp->Strings[to_ptr->nte_index]; + /* There's no point in warning about it if it is the same + * string; that's just an inefficiency. + */ + if (VALID_STRING(s) && VALID_STRING(t) && strcmp(s, t) != 0) + _nc_warning("%s (%s) already has an explicit value %s, ignoring ko", + ap->to, ap->from, t); + continue; + } + + /* + * The magic moment -- copy the mapped key string over, + * stripping out padding. + */ + bp = tp->Strings[from_ptr->nte_index]; + if (VALID_STRING(bp)) { + for (dp = buf2; *bp; bp++) { + if (bp[0] == '$' && bp[1] == '<') { + while (*bp && *bp != '>') { + ++bp; + } + } else + *dp++ = *bp; + } + *dp = '\0'; + + tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2); + } else { + tp->Strings[to_ptr->nte_index] = bp; + } + } + + /* + * Note: ko=im and ko=ic both want to grab the `Insert' + * keycap. There's a kich1 but no ksmir, so the ic capability + * got mapped to kich1 and im to kIC to avoid a collision. + * If the description has im but not ic, hack kIC back to kich1. + */ + if (foundim && WANTED(key_ic) && PRESENT(key_sic)) { + key_ic = key_sic; + key_sic = ABSENT_STRING; + } + } + + if (!has_base) { + if (!hard_copy) { + if (WANTED(key_backspace)) + key_backspace = _nc_save_str(C_BS); + if (WANTED(key_left)) + key_left = _nc_save_str(C_BS); + if (WANTED(key_down)) + key_down = _nc_save_str(C_LF); + } + } + + /* + * Translate XENIX forms characters. + */ + if (PRESENT(acs_ulcorner) || + PRESENT(acs_llcorner) || + PRESENT(acs_urcorner) || + PRESENT(acs_lrcorner) || + PRESENT(acs_ltee) || + PRESENT(acs_rtee) || + PRESENT(acs_btee) || + PRESENT(acs_ttee) || + PRESENT(acs_hline) || + PRESENT(acs_vline) || + PRESENT(acs_plus)) { + char buf2[MAX_TERMCAP_LENGTH]; + + _nc_str_init(&result, buf2, sizeof(buf2)); + _nc_safe_strcat(&result, acs_chars); + + append_acs(&result, 'j', acs_lrcorner); + append_acs(&result, 'k', acs_urcorner); + append_acs(&result, 'l', acs_ulcorner); + append_acs(&result, 'm', acs_llcorner); + append_acs(&result, 'n', acs_plus); + append_acs(&result, 'q', acs_hline); + append_acs(&result, 't', acs_ltee); + append_acs(&result, 'u', acs_rtee); + append_acs(&result, 'v', acs_btee); + append_acs(&result, 'w', acs_ttee); + append_acs(&result, 'x', acs_vline); + + if (buf2[0]) { + acs_chars = _nc_save_str(buf2); + _nc_warning("acsc string synthesized from XENIX capabilities"); + } + } else if (acs_chars == ABSENT_STRING + && PRESENT(enter_alt_charset_mode) + && PRESENT(exit_alt_charset_mode)) { + acs_chars = _nc_save_str(VT_ACSC); + } + returnVoidDB; +} + +static void +postprocess_terminfo(TERMTYPE2 *tp) +{ + TR(TRACE_DATABASE, + (T_CALLED("postprocess_terminfo(tp=%p)"), + (void *) tp)); + + /* + * TERMINFO-TO-TERMINFO MAPPINGS FOR SOURCE TRANSLATION + * ---------------------------------------------------------------------- + */ + + /* + * Translate AIX forms characters. + */ + if (PRESENT(box_chars_1)) { + char buf2[MAX_TERMCAP_LENGTH]; + string_desc result; + + _nc_str_init(&result, buf2, sizeof(buf2)); + _nc_safe_strcat(&result, acs_chars); + + append_acs0(&result, 'l', box_chars_1, 0); /* ACS_ULCORNER */ + append_acs0(&result, 'q', box_chars_1, 1); /* ACS_HLINE */ + append_acs0(&result, 'k', box_chars_1, 2); /* ACS_URCORNER */ + append_acs0(&result, 'x', box_chars_1, 3); /* ACS_VLINE */ + append_acs0(&result, 'j', box_chars_1, 4); /* ACS_LRCORNER */ + append_acs0(&result, 'm', box_chars_1, 5); /* ACS_LLCORNER */ + append_acs0(&result, 'w', box_chars_1, 6); /* ACS_TTEE */ + append_acs0(&result, 'u', box_chars_1, 7); /* ACS_RTEE */ + append_acs0(&result, 'v', box_chars_1, 8); /* ACS_BTEE */ + append_acs0(&result, 't', box_chars_1, 9); /* ACS_LTEE */ + append_acs0(&result, 'n', box_chars_1, 10); /* ACS_PLUS */ + + if (buf2[0]) { + acs_chars = _nc_save_str(buf2); + _nc_warning("acsc string synthesized from AIX capabilities"); + box_chars_1 = ABSENT_STRING; + } + } + /* + * ---------------------------------------------------------------------- + */ + returnVoidDB; +} + +/* + * Do a linear search through the terminfo tables to find a given full-name. + * We don't expect to do this often, so there's no hashing function. + * + * In effect, this scans through the 3 lists of full-names, and looks them + * up in _nc_info_table, which is organized so that the nte_index fields are + * sorted, but the nte_type fields are not necessarily grouped together. + */ +static struct name_table_entry const * +lookup_fullname(const char *find) +{ + int state = -1; + + for (;;) { + int count = 0; + NCURSES_CONST char *const *names; + + switch (++state) { + case BOOLEAN: + names = boolfnames; + break; + case STRING: + names = strfnames; + break; + case NUMBER: + names = numfnames; + break; + default: + return NOTFOUND; + } + + for (count = 0; names[count] != 0; count++) { + if (!strcmp(names[count], find)) { + struct name_table_entry const *entry_ptr = _nc_get_table(FALSE); + while (entry_ptr->nte_type != state + || entry_ptr->nte_index != count) + entry_ptr++; + return entry_ptr; + } + } + } +} + +/* parse_entry.c ends here */ diff --git a/contrib/ncurses/ncurses/tinfo/read_entry.c b/contrib/ncurses/ncurses/tinfo/read_entry.c new file mode 100644 index 00000000..9fcbaab2 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/read_entry.c @@ -0,0 +1,933 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * read_entry.c -- Routine for reading in a compiled terminfo file + */ + +#include +#include + +#include + +MODULE_ID("$Id: read_entry.c,v 1.173 2024/07/27 23:07:02 tom Exp $") + +#define MyNumber(n) (short) LOW_MSB(n) + +#define SIZEOF_32BITS 4 + +#if NCURSES_USE_DATABASE +#if NCURSES_EXT_NUMBERS +static size_t +convert_16bits(const char *buf, NCURSES_INT2 *Numbers, int count) +{ + int i; + size_t j; + size_t size = SIZEOF_SHORT; + for (i = 0; i < count; i++) { + unsigned mask = 0xff; + unsigned char ch = 0; + Numbers[i] = 0; + for (j = 0; j < size; ++j) { + ch = UChar(*buf++); + Numbers[i] |= (ch << (8 * j)); + mask <<= 8; + } + if (ch & 0x80) { + while (mask != 0) { + Numbers[i] |= (int) mask; + mask <<= 8; + } + } + TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); + } + return size; +} + +static size_t +convert_32bits(const char *buf, NCURSES_INT2 *Numbers, int count) +{ + int i; + size_t j; + size_t size = SIZEOF_INT2; + unsigned char ch; + + assert(sizeof(NCURSES_INT2) == size); + for (i = 0; i < count; i++) { + Numbers[i] = 0; + for (j = 0; j < size; ++j) { + ch = UChar(*buf++); + Numbers[i] |= (ch << (8 * j)); + } + /* "unsigned" and NCURSES_INT2 are the same size - no sign-extension */ + TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); + } + return size; +} +#else +static size_t +convert_32bits(const char *buf, NCURSES_INT2 *Numbers, int count) +{ + int i, j; + unsigned char ch; + for (i = 0; i < count; i++) { + int value = 0; + for (j = 0; j < SIZEOF_32BITS; ++j) { + ch = UChar(*buf++); + value |= (ch << (8 * j)); + } + if (value == -1) + Numbers[i] = ABSENT_NUMERIC; + else if (value == -2) + Numbers[i] = CANCELLED_NUMERIC; + else if (value > MAX_OF_TYPE(NCURSES_INT2)) + Numbers[i] = MAX_OF_TYPE(NCURSES_INT2); + else + Numbers[i] = (short) value; + TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); + } + return SIZEOF_SHORT; +} + +static size_t +convert_16bits(const char *buf, NCURSES_INT2 *Numbers, int count) +{ + int i; + for (i = 0; i < count; i++) { + if (IS_NEG1(buf + 2 * i)) + Numbers[i] = ABSENT_NUMERIC; + else if (IS_NEG2(buf + 2 * i)) + Numbers[i] = CANCELLED_NUMERIC; + else + Numbers[i] = MyNumber(buf + 2 * i); + TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i])); + } + return SIZEOF_SHORT; +} +#endif + +static bool +convert_strings(char *buf, char **Strings, int count, int size, + char *table, bool always) +{ + int i; + char *p; + bool success = TRUE; + + for (i = 0; i < count; i++) { + if (IS_NEG1(buf + 2 * i)) { + Strings[i] = ABSENT_STRING; + } else if (IS_NEG2(buf + 2 * i)) { + Strings[i] = CANCELLED_STRING; + } else if (MyNumber(buf + 2 * i) > size) { + Strings[i] = ABSENT_STRING; + } else { + int nn = MyNumber(buf + 2 * i); + if (nn >= 0 && nn < size) { + Strings[i] = (nn + table); + TR(TRACE_DATABASE, ("Strings[%d] = %s", i, + _nc_visbuf(Strings[i]))); + } else { + TR(TRACE_DATABASE, + ("found out-of-range index %d to Strings[%d]", nn, i)); + success = FALSE; + break; + } + } + + /* make sure all strings are NUL terminated */ + if (VALID_STRING(Strings[i])) { + for (p = Strings[i]; p < table + size; p++) + if (*p == '\0') + break; + /* if there is no NUL, ignore the string */ + if (p >= table + size) { + Strings[i] = ABSENT_STRING; + } else if (p == Strings[i] && always) { + TR(TRACE_DATABASE, + ("found empty but required Strings[%d]", i)); + success = FALSE; + break; + } + } else if (always) { /* names are always needed */ + TR(TRACE_DATABASE, + ("found invalid but required Strings[%d]", i)); + success = FALSE; + break; + } + } + if (!success) { + _nc_warning("corrupt data found in convert_strings"); + } + return success; +} + +static int +fake_read(const char *src, int *offset, int limit, char *dst, unsigned want) +{ + int have = (limit - *offset); + + if (have > 0) { + if ((int) want > have) + want = (unsigned) have; + memcpy(dst, src + *offset, (size_t) want); + *offset += (int) want; + } else { + want = 0; + } + return (int) want; +} + +#define Read(buf, count) fake_read(buffer, &offset, limit, (char *) buf, (unsigned) count) + +#define read_shorts(buf, count) \ + (Read(buf, (count)*SIZEOF_SHORT) == (int) (count)*SIZEOF_SHORT) + +#define read_numbers(buf, count) \ + (Read(buf, (count)*(unsigned)size_of_numbers) == (int) (count)*size_of_numbers) + +#define even_boundary(value) \ + if ((value) % 2 != 0) Read(buf, 1) +#endif + +NCURSES_EXPORT(void) +_nc_init_termtype(TERMTYPE2 *const tp) +{ + unsigned i; + + DEBUG(2, (T_CALLED("_nc_init_termtype(tp=%p)"), (void *) tp)); + +#if NCURSES_XNAMES + tp->num_Booleans = BOOLCOUNT; + tp->num_Numbers = NUMCOUNT; + tp->num_Strings = STRCOUNT; + tp->ext_Booleans = 0; + tp->ext_Numbers = 0; + tp->ext_Strings = 0; +#endif + if (tp->Booleans == 0) + TYPE_MALLOC(NCURSES_SBOOL, BOOLCOUNT, tp->Booleans); + if (tp->Numbers == 0) + TYPE_MALLOC(NCURSES_INT2, NUMCOUNT, tp->Numbers); + if (tp->Strings == 0) + TYPE_MALLOC(char *, STRCOUNT, tp->Strings); + + for_each_boolean(i, tp) + tp->Booleans[i] = FALSE; + + for_each_number(i, tp) + tp->Numbers[i] = ABSENT_NUMERIC; + + for_each_string(i, tp) + tp->Strings[i] = ABSENT_STRING; + + DEBUG(2, (T_RETURN(""))); +} + +#if NCURSES_USE_DATABASE +#if NCURSES_XNAMES +static bool +valid_shorts(char *buffer, int limit) +{ + bool result = FALSE; + int n; + for (n = 0; n < limit; ++n) { + if (MyNumber(buffer + (n * 2)) > 0) { + result = TRUE; + break; + } + } + return result; +} +#endif + +/* + * Return TGETENT_YES if read, TGETENT_NO if not found or garbled. + */ +NCURSES_EXPORT(int) +_nc_read_termtype(TERMTYPE2 *ptr, char *buffer, int limit) +{ + int offset = 0; + int name_size, bool_count, num_count, str_count, str_size; + int i; + char buf[MAX_ENTRY_SIZE + 2]; + char *string_table; + unsigned want, have; + size_t (*convert_numbers) (const char *, NCURSES_INT2 *, int); + int size_of_numbers; + int max_entry_size = MAX_ENTRY_SIZE; + + TR(TRACE_DATABASE, + (T_CALLED("_nc_read_termtype(ptr=%p, buffer=%p, limit=%d)"), + (void *) ptr, buffer, limit)); + + TR(TRACE_DATABASE, ("READ termtype header @%d", offset)); + + memset(ptr, 0, sizeof(*ptr)); + + /* grab the header */ + if (!read_shorts(buf, 6) + || !IS_TIC_MAGIC(buf)) { + returnDB(TGETENT_NO); + } +#if NCURSES_EXT_NUMBERS + if (LOW_MSB(buf) == MAGIC2) { + convert_numbers = convert_32bits; + size_of_numbers = SIZEOF_INT2; + } else { + max_entry_size = MAX_ENTRY_SIZE1; + convert_numbers = convert_16bits; + size_of_numbers = SIZEOF_SHORT; + } +#else + if (LOW_MSB(buf) == MAGIC2) { + convert_numbers = convert_32bits; + size_of_numbers = SIZEOF_32BITS; + } else { + convert_numbers = convert_16bits; + size_of_numbers = SIZEOF_INT2; + } +#endif + + /* *INDENT-EQLS* */ + name_size = MyNumber(buf + 2); + bool_count = MyNumber(buf + 4); + num_count = MyNumber(buf + 6); + str_count = MyNumber(buf + 8); + str_size = MyNumber(buf + 10); + + TR(TRACE_DATABASE, + ("TERMTYPE name_size=%d, bool=%d/%d, num=%d/%d str=%d/%d(%d)", + name_size, bool_count, BOOLCOUNT, num_count, NUMCOUNT, + str_count, STRCOUNT, str_size)); + if (name_size < 0 + || bool_count < 0 + || num_count < 0 + || str_count < 0 + || bool_count > BOOLCOUNT + || num_count > NUMCOUNT + || str_count > STRCOUNT + || str_size < 0) { + returnDB(TGETENT_NO); + } + + want = (unsigned) (str_size + name_size + 1); + /* try to allocate space for the string table */ + if (str_count * SIZEOF_SHORT >= max_entry_size + || (string_table = typeMalloc(char, want)) == 0) { + returnDB(TGETENT_NO); + } + + /* grab the name (a null-terminated string) */ + want = Min(MAX_NAME_SIZE, (unsigned) name_size); + ptr->str_table = string_table; + ptr->term_names = string_table; + if ((have = (unsigned) Read(ptr->term_names, want)) != want) { + memset(ptr->term_names + have, 0, (size_t) (want - have)); + } + ptr->term_names[want] = '\0'; + string_table += (want + 1); + + if (have > MAX_NAME_SIZE) + offset = (int) (have - MAX_NAME_SIZE); + + /* grab the booleans */ + TYPE_CALLOC(NCURSES_SBOOL, Max(BOOLCOUNT, bool_count), ptr->Booleans); + if (Read(ptr->Booleans, (unsigned) bool_count) < bool_count) { + returnDB(TGETENT_NO); + } + + /* + * If booleans end on an odd byte, skip it. The machine they + * originally wrote terminfo on must have been a 16-bit + * word-oriented machine that would trap out if you tried a + * word access off a 2-byte boundary. + */ + even_boundary(name_size + bool_count); + + /* grab the numbers */ + TYPE_CALLOC(NCURSES_INT2, Max(NUMCOUNT, num_count), ptr->Numbers); + if (!read_numbers(buf, num_count)) { + returnDB(TGETENT_NO); + } + convert_numbers(buf, ptr->Numbers, num_count); + + TYPE_CALLOC(char *, Max(STRCOUNT, str_count), ptr->Strings); + + if (str_count) { + /* grab the string offsets */ + if (!read_shorts(buf, str_count)) { + returnDB(TGETENT_NO); + } + /* finally, grab the string table itself */ + if (Read(string_table, (unsigned) str_size) != str_size) { + returnDB(TGETENT_NO); + } + if (!convert_strings(buf, ptr->Strings, str_count, str_size, + string_table, FALSE)) { + returnDB(TGETENT_NO); + } + } +#if NCURSES_XNAMES + + ptr->num_Booleans = BOOLCOUNT; + ptr->num_Numbers = NUMCOUNT; + ptr->num_Strings = STRCOUNT; + + /* + * Read extended entries, if any, after the normal end of terminfo data. + */ + even_boundary(str_size); + TR(TRACE_DATABASE, ("READ extended_header @%d", offset)); + if (_nc_user_definable && read_shorts(buf, 5) && valid_shorts(buf, 5)) { + int ext_bool_count = MyNumber(buf + 0); + int ext_num_count = MyNumber(buf + 2); + int ext_str_count = MyNumber(buf + 4); + int ext_str_usage = MyNumber(buf + 6); + int ext_str_limit = MyNumber(buf + 8); + unsigned need = (unsigned) (ext_bool_count + ext_num_count + ext_str_count); + int base = 0; + + if ((int) need >= (max_entry_size / 2) + || ext_str_usage >= max_entry_size + || ext_str_limit >= max_entry_size + || ext_bool_count < 0 + || ext_num_count < 0 + || ext_str_count < 0 + || ext_str_usage < 0 + || ext_str_limit < 0) { + returnDB(TGETENT_NO); + } + + ptr->num_Booleans = UShort(BOOLCOUNT + ext_bool_count); + ptr->num_Numbers = UShort(NUMCOUNT + ext_num_count); + ptr->num_Strings = UShort(STRCOUNT + ext_str_count); + + TYPE_REALLOC(NCURSES_SBOOL, ptr->num_Booleans, ptr->Booleans); + TYPE_REALLOC(NCURSES_INT2, ptr->num_Numbers, ptr->Numbers); + TYPE_REALLOC(char *, ptr->num_Strings, ptr->Strings); + + TR(TRACE_DATABASE, ("extended header: " + "bool %d, " + "number %d, " + "string %d(%d:%d)", + ext_bool_count, + ext_num_count, + ext_str_count, + ext_str_usage, + ext_str_limit)); + + TR(TRACE_DATABASE, ("READ %d extended-booleans @%d", + ext_bool_count, offset)); + if ((ptr->ext_Booleans = UShort(ext_bool_count)) != 0) { + if (Read(ptr->Booleans + BOOLCOUNT, (unsigned) + ext_bool_count) != ext_bool_count) { + returnDB(TGETENT_NO); + } + } + even_boundary(ext_bool_count); + + TR(TRACE_DATABASE, ("READ %d extended-numbers @%d", + ext_num_count, offset)); + if ((ptr->ext_Numbers = UShort(ext_num_count)) != 0) { + if (!read_numbers(buf, ext_num_count)) { + returnDB(TGETENT_NO); + } + TR(TRACE_DATABASE, ("Before converting extended-numbers")); + convert_numbers(buf, ptr->Numbers + NUMCOUNT, ext_num_count); + } + + TR(TRACE_DATABASE, ("READ extended-offsets @%d", offset)); + if ((ext_str_count + (int) need) >= (max_entry_size / 2)) { + returnDB(TGETENT_NO); + } + if ((ext_str_count || need) + && !read_shorts(buf, ext_str_count + (int) need)) { + returnDB(TGETENT_NO); + } + + TR(TRACE_DATABASE, ("READ %d bytes of extended-strings @%d", + ext_str_limit, offset)); + + if (ext_str_limit) { + ptr->ext_str_table = typeMalloc(char, (size_t) ext_str_limit); + if (ptr->ext_str_table == 0) { + returnDB(TGETENT_NO); + } + if (Read(ptr->ext_str_table, (unsigned) ext_str_limit) != ext_str_limit) { + returnDB(TGETENT_NO); + } + TR(TRACE_DATABASE, ("first extended-string is %s", _nc_visbuf(ptr->ext_str_table))); + } + + if ((ptr->ext_Strings = UShort(ext_str_count)) != 0) { + int check = (ext_bool_count + ext_num_count + ext_str_count); + + TR(TRACE_DATABASE, + ("Before computing extended-string capabilities " + "str_count=%d, ext_str_count=%d", + str_count, ext_str_count)); + if (!convert_strings(buf, ptr->Strings + str_count, ext_str_count, + ext_str_limit, ptr->ext_str_table, FALSE)) { + returnDB(TGETENT_NO); + } + for (i = ext_str_count - 1; i >= 0; i--) { + TR(TRACE_DATABASE, ("MOVE from [%d:%d] %s", + i, i + str_count, + _nc_visbuf(ptr->Strings[i + str_count]))); + ptr->Strings[i + STRCOUNT] = ptr->Strings[i + str_count]; + if (VALID_STRING(ptr->Strings[i + STRCOUNT])) { + base += (int) (strlen(ptr->Strings[i + STRCOUNT]) + 1); + ++check; + } + TR(TRACE_DATABASE, ("... to [%d] %s", + i + STRCOUNT, + _nc_visbuf(ptr->Strings[i + STRCOUNT]))); + } + TR(TRACE_DATABASE, ("Check table-size: %d/%d", check, ext_str_usage)); +#if 0 + /* + * Phasing in a proper check will be done "later". + */ + if (check != ext_str_usage) + returnDB(TGETENT_NO); +#endif + } + + if (need) { + if (ext_str_count >= (max_entry_size / 2)) { + returnDB(TGETENT_NO); + } + TYPE_CALLOC(char *, need, ptr->ext_Names); + TR(TRACE_DATABASE, + ("ext_NAMES starting @%d in extended_strings, first = %s", + base, _nc_visbuf(ptr->ext_str_table + base))); + if (!convert_strings(buf + (2 * ext_str_count), + ptr->ext_Names, + (int) need, + ext_str_limit, ptr->ext_str_table + base, + TRUE)) { + returnDB(TGETENT_NO); + } + } + + TR(TRACE_DATABASE, + ("...done reading terminfo bool %d(%d) num %d(%d) str %d(%d)", + ptr->num_Booleans, ptr->ext_Booleans, + ptr->num_Numbers, ptr->ext_Numbers, + ptr->num_Strings, ptr->ext_Strings)); + + TR(TRACE_DATABASE, ("extend: num_Booleans:%d", ptr->num_Booleans)); + } else +#endif /* NCURSES_XNAMES */ + { + TR(TRACE_DATABASE, ("...done reading terminfo bool %d num %d str %d", + bool_count, num_count, str_count)); +#if NCURSES_XNAMES + TR(TRACE_DATABASE, ("normal: num_Booleans:%d", ptr->num_Booleans)); +#endif + } + + for (i = bool_count; i < BOOLCOUNT; i++) + ptr->Booleans[i] = FALSE; + for (i = num_count; i < NUMCOUNT; i++) + ptr->Numbers[i] = ABSENT_NUMERIC; + for (i = str_count; i < STRCOUNT; i++) + ptr->Strings[i] = ABSENT_STRING; + + returnDB(TGETENT_YES); +} + +/* + * int + * _nc_read_file_entry(filename, ptr) + * + * Read the compiled terminfo entry in the given file into the + * structure pointed to by ptr, allocating space for the string + * table. + */ +NCURSES_EXPORT(int) +_nc_read_file_entry(const char *const filename, TERMTYPE2 *ptr) +/* return 1 if read, 0 if not found or garbled */ +{ + FILE *fp = 0; + int code; + + if (_nc_access(filename, R_OK) < 0 + || (fp = safe_fopen(filename, BIN_R)) == 0) { + TR(TRACE_DATABASE, ("cannot open terminfo %s (errno=%d)", filename, errno)); + code = TGETENT_NO; + } else { + int limit; + char buffer[MAX_ENTRY_SIZE + 1]; + + limit = (int) fread(buffer, sizeof(char), sizeof(buffer), fp); + if (limit > 0) { + const char *old_source = _nc_get_source(); + + TR(TRACE_DATABASE, ("read terminfo %s", filename)); + if (old_source == NULL) + _nc_set_source(filename); + if ((code = _nc_read_termtype(ptr, buffer, limit)) == TGETENT_NO) { + _nc_free_termtype2(ptr); + } + _nc_set_source(old_source); + } else { + code = TGETENT_NO; + } + fclose(fp); + } + + return (code); +} + +#if USE_HASHED_DB +/* + * Return if if we can build the filename of a ".db" file. + */ +static bool +make_db_filename(char *filename, unsigned limit, const char *const path) +{ + static const char suffix[] = DBM_SUFFIX; + + size_t lens = sizeof(suffix) - 1; + size_t size = strlen(path); + size_t test = lens + size; + bool result = FALSE; + + if (test < limit) { + if (size >= lens + && !strcmp(path + size - lens, suffix)) + _nc_STRCPY(filename, path, limit); + else + _nc_SPRINTF(filename, _nc_SLIMIT(limit) "%s%s", path, suffix); + result = TRUE; + } + return result; +} +#endif + +/* + * Return true if we can build the name of a filesystem entry. + */ +static bool +make_dir_filename(char *filename, + unsigned limit, + const char *const path, + const char *name) +{ + bool result = FALSE; + +#if NCURSES_USE_TERMCAP + if (_nc_is_dir_path(path)) +#endif + { + unsigned need = (unsigned) (LEAF_LEN + 3 + strlen(path) + strlen(name)); + + if (need <= limit) { + _nc_SPRINTF(filename, _nc_SLIMIT(limit) + "%s/" LEAF_FMT "/%s", path, *name, name); + result = TRUE; + } + } + return result; +} + +static int +lookup_b64(int *target, const char **source) +{ + int result = 3; + int j; + /* + * ncurses' quickdump writes only RFC 4648 "url/filename-safe" encoding, + * but accepts RFC-3548 + */ + for (j = 0; j < 4; ++j) { + int ch = UChar(**source); + *source += 1; + if (ch >= 'A' && ch <= 'Z') { + target[j] = (ch - 'A'); + } else if (ch >= 'a' && ch <= 'z') { + target[j] = 26 + (ch - 'a'); + } else if (ch >= '0' && ch <= '9') { + target[j] = 52 + (ch - '0'); + } else if (ch == '-' || ch == '+') { + target[j] = 62; + } else if (ch == '_' || ch == '/') { + target[j] = 63; + } else if (ch == '=') { + target[j] = 64; + result--; + } else { + result = -1; + break; + } + } + return result; +} + +static int +decode_hex(const char **source) +{ + int result = 0; + int nibble; + + for (nibble = 0; nibble < 2; ++nibble) { + int ch = UChar(**source); + result <<= 4; + *source += 1; + if (ch >= '0' && ch <= '9') { + ch -= '0'; + } else if (ch >= 'A' && ch <= 'F') { + ch -= 'A'; + ch += 10; + } else if (ch >= 'a' && ch <= 'f') { + ch -= 'a'; + ch += 10; + } else { + result = -1; + break; + } + result |= ch; + } + return result; +} + +static int +decode_quickdump(char *target, const char *source) +{ + const char *base = target; + int result = 0; + + if (!strncmp(source, "b64:", (size_t) 4)) { + source += 4; + while (*source != '\0') { + int bits[4]; + int ch = lookup_b64(bits, &source); + if (ch < 0 || (ch + target - base) >= MAX_ENTRY_SIZE) { + result = 0; + break; + } + result += ch; + *target++ = (char) ((bits[0] << 2) | (bits[1] >> 4)); + if (bits[2] < 64) { + *target++ = (char) ((bits[1] << 4) | (bits[2] >> 2)); + if (bits[3] < 64) { + *target++ = (char) ((bits[2] << 6) | bits[3]); + } + } + } + } else if (!strncmp(source, "hex:", (size_t) 4)) { + source += 4; + while (*source != '\0') { + int ch = decode_hex(&source); + if (ch < 0 || (target - base) >= MAX_ENTRY_SIZE) { + result = 0; + break; + } + *target++ = (char) ch; + ++result; + } + } + return result; +} + +/* + * Build a terminfo pathname and try to read the data. Returns TGETENT_YES on + * success, TGETENT_NO on failure. + */ +static int +_nc_read_tic_entry(char *filename, + unsigned limit, + const char *const path, + const char *name, + TERMTYPE2 *const tp) +{ + int code = TGETENT_NO; +#if USE_HASHED_DB + DB *capdbp; +#endif + char buffer[MAX_ENTRY_SIZE + 1]; + int used; + + TR(TRACE_DATABASE, + (T_CALLED("_nc_read_tic_entry(file=%p, path=%s, name=%s)"), + filename, path, name)); + + assert(TGETENT_YES == TRUE); /* simplify call for _nc_name_match */ + + if ((used = decode_quickdump(buffer, path)) != 0 + && (code = _nc_read_termtype(tp, buffer, used)) == TGETENT_YES + && (code = _nc_name_match(tp->term_names, name, "|")) == TGETENT_YES) { + TR(TRACE_DATABASE, ("loaded quick-dump for %s", name)); + /* shorten name shown by infocmp */ + _nc_STRCPY(filename, "$TERMINFO", limit); + } else +#if USE_HASHED_DB + if (make_db_filename(filename, limit, path) + && (capdbp = _nc_db_open(filename, FALSE)) != 0) { + + DBT key, data; + int reccnt = 0; + char *save = strdup(name); + + if (save == 0) + returnDB(code); + + memset(&key, 0, sizeof(key)); + key.data = save; + key.size = strlen(save); + + /* + * This lookup could return termcap data, which we do not want. We are + * looking for compiled (binary) terminfo data. + * + * cgetent uses a two-level lookup. On the first it uses the given + * name to return a record containing only the aliases for an entry. + * On the second (using that list of aliases as a key), it returns the + * content of the terminal description. We expect second lookup to + * return data beginning with the same set of aliases. + * + * For compiled terminfo, the list of aliases in the second case will + * be null-terminated. A termcap entry will not be, and will run on + * into the description. So we can easily distinguish between the two + * (source/binary) by checking the lengths. + */ + while (_nc_db_get(capdbp, &key, &data) == 0) { + char *have = (char *) data.data; + used = (int) data.size - 1; + + if (*have++ == 0) { + if (data.size > key.size + && IS_TIC_MAGIC(have)) { + code = _nc_read_termtype(tp, have, used); + if (code == TGETENT_NO) { + _nc_free_termtype2(tp); + } + } + break; + } + + /* + * Just in case we have a corrupt database, do not waste time with + * it. + */ + if (++reccnt >= 3) + break; + + /* + * Prepare for the second level. + */ + key.data = have; + key.size = used; + } + + free(save); + } else /* may be either filesystem or flat file */ +#endif + if (make_dir_filename(filename, limit, path, name)) { + code = _nc_read_file_entry(filename, tp); + } +#if NCURSES_USE_TERMCAP + if (code != TGETENT_YES) { + code = _nc_read_termcap_entry(name, tp); + _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX) + "%.*s", PATH_MAX - 1, _nc_get_source()); + } +#endif + returnDB(code); +} +#endif /* NCURSES_USE_DATABASE */ + +/* + * Find and read the compiled entry for a given terminal type, if it exists. + * We take pains here to make sure no combination of environment variables and + * terminal type name can be used to overrun the file buffer. + */ +NCURSES_EXPORT(int) +_nc_read_entry2(const char *const name, char *const filename, TERMTYPE2 *const tp) +{ + int code = TGETENT_NO; + + if (name == 0) + return _nc_read_entry2("", filename, tp); + + _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX) + "%.*s", PATH_MAX - 1, name); + + if (strlen(name) == 0 + || strcmp(name, ".") == 0 + || strcmp(name, "..") == 0 + || _nc_pathlast(name) != 0 + || strchr(name, NCURSES_PATHSEP) != 0) { + TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", name)); + } else { +#if NCURSES_USE_DATABASE + DBDIRS state; + int offset; + const char *path; + + _nc_first_db(&state, &offset); + code = TGETENT_ERR; + while ((path = _nc_next_db(&state, &offset)) != 0) { + code = _nc_read_tic_entry(filename, PATH_MAX, path, name, tp); + if (code == TGETENT_YES) { + _nc_last_db(); + break; + } + } +#elif NCURSES_USE_TERMCAP + if (code != TGETENT_YES) { + code = _nc_read_termcap_entry(name, tp); + _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX) + "%.*s", PATH_MAX - 1, _nc_get_source()); + } +#endif + } + return code; +} + +#if NCURSES_EXT_NUMBERS +NCURSES_EXPORT(int) +_nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp) +{ + TERMTYPE2 dummy; + int rc; + rc = _nc_read_entry2(name, filename, &dummy); + if (rc == TGETENT_YES) + _nc_export_termtype2(tp, &dummy); + return rc; +} +#endif diff --git a/contrib/ncurses/ncurses/tinfo/read_termcap.c b/contrib/ncurses/ncurses/tinfo/read_termcap.c new file mode 100644 index 00000000..1a294848 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/read_termcap.c @@ -0,0 +1,1202 @@ +/**************************************************************************** + * Copyright 2018-2021,2023 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * Termcap compatibility support + * + * If your OS integrator didn't install a terminfo database, you can call + * _nc_read_termcap_entry() to support reading and translating capabilities + * from the system termcap file. This is a kludge; it will bulk up and slow + * down every program that uses ncurses, and translated termcap entries cannot + * use full terminfo capabilities. Don't use it unless you absolutely have to; + * instead, get your system people to run tic(1) from root on the terminfo + * master included with ncurses to translate it into a terminfo database. + * + * If USE_GETCAP is enabled, we use what is effectively a copy of the 4.4BSD + * getcap code to fetch entries. There are disadvantages to this; mainly that + * getcap(3) does its own resolution, meaning that entries read in in this way + * can't reference the terminfo tree. The only thing it buys is faster startup + * time, getcap(3) is much faster than our tic parser. + */ + +#include + +#include +#include +#include + +MODULE_ID("$Id: read_termcap.c,v 1.104 2023/06/24 21:53:16 tom Exp $") + +#if !PURE_TERMINFO + +#define TC_SUCCESS 0 +#define TC_NOT_FOUND -1 +#define TC_SYS_ERR -2 +#define TC_REF_LOOP -3 +#define TC_UNRESOLVED -4 /* this is not returned by BSD cgetent */ + +static const char * +get_termpath(void) +{ + const char *result; + + if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0) + result = TERMPATH; + TR(TRACE_DATABASE, ("TERMPATH is %s", result)); + return result; +} + +/* + * Note: + * getcap(), cgetent(), etc., are BSD functions. A copy of those was added to + * this file in November 1995, derived from the BSD4.4 Lite sources. + * + * The initial adaptation uses 518 lines from that source. + * The current source (in 2009) uses 183 lines of BSD4.4 Lite (441 ignoring + * whitespace). + */ +#if USE_GETCAP + +#if HAVE_BSD_CGETENT +#define _nc_cgetcap cgetcap +#define _nc_cgetent(buf, oline, db_array, name) cgetent(buf, db_array, name) +#define _nc_cgetmatch cgetmatch +#define _nc_cgetset cgetset +#else +static int _nc_cgetmatch(char *, const char *); +static int _nc_getent(char **, unsigned *, int *, int, char **, int, const char + *, int, char *); +static int _nc_nfcmp(const char *, char *); + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Casey Leedom of Lawrence Livermore National Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* static char sccsid[] = "@(#)getcap.c 8.3 (Berkeley) 3/25/94"; */ + +#define BFRAG 1024 +#define BSIZE 1024 +#define MAX_RECURSION 32 /* maximum getent recursion */ + +static size_t topreclen; /* toprec length */ +static char *toprec; /* Additional record specified by cgetset() */ +static int gottoprec; /* Flag indicating retrieval of toprecord */ + +/* + * Cgetset() allows the addition of a user specified buffer to be added to the + * database array, in effect "pushing" the buffer on top of the virtual + * database. 0 is returned on success, -1 on failure. + */ +static int +_nc_cgetset(const char *ent) +{ + if (ent == 0) { + FreeIfNeeded(toprec); + toprec = 0; + topreclen = 0; + return (0); + } + topreclen = strlen(ent); + if ((toprec = typeMalloc(char, topreclen + 1)) == 0) { + errno = ENOMEM; + return (-1); + } + gottoprec = 0; + _nc_STRCPY(toprec, ent, topreclen); + return (0); +} + +/* + * Cgetcap searches the capability record buf for the capability cap with type + * `type'. A pointer to the value of cap is returned on success, 0 if the + * requested capability couldn't be found. + * + * Specifying a type of ':' means that nothing should follow cap (:cap:). In + * this case a pointer to the terminating ':' or NUL will be returned if cap is + * found. + * + * If (cap, '@') or (cap, terminator, '@') is found before (cap, terminator) + * return 0. + */ +static char * +_nc_cgetcap(char *buf, const char *cap, int type) +{ + register const char *cp; + register char *bp; + + bp = buf; + for (;;) { + /* + * Skip past the current capability field - it is either the + * name field if this is the first time through the loop, or + * the remainder of a field whose name failed to match cap. + */ + for (;;) { + if (*bp == '\0') + return (0); + else if (*bp++ == ':') + break; + } + + /* + * Try to match (cap, type) in buf. + */ + for (cp = cap; *cp == *bp && *bp != '\0'; cp++, bp++) + continue; + if (*cp != '\0') + continue; + if (*bp == '@') + return (0); + if (type == ':') { + if (*bp != '\0' && *bp != ':') + continue; + return (bp); + } + if (*bp != type) + continue; + bp++; + return (*bp == '@' ? 0 : bp); + } + /* NOTREACHED */ +} + +/* + * Cgetent extracts the capability record name from the NULL terminated file + * array db_array and returns a pointer to a malloc'd copy of it in buf. Buf + * must be retained through all subsequent calls to cgetcap, cgetnum, cgetflag, + * and cgetstr, but may then be freed. + * + * Returns: + * + * positive # on success (i.e., the index in db_array) + * TC_NOT_FOUND if the requested record couldn't be found + * TC_SYS_ERR if a system error was encountered (e.g.,couldn't open a file) + * TC_REF_LOOP if a potential reference loop is detected + * TC_UNRESOLVED if we had too many recurrences to resolve + */ +static int +_nc_cgetent(char **buf, int *oline, char **db_array, const char *name) +{ + unsigned dummy; + + return (_nc_getent(buf, &dummy, oline, 0, db_array, -1, name, 0, 0)); +} + +/* + * Getent implements the functions of cgetent. If fd is non-negative, + * *db_array has already been opened and fd is the open file descriptor. We + * do this to save time and avoid using up file descriptors for tc= + * recursions. + * + * Getent returns the same success/failure codes as cgetent. On success, a + * pointer to a malloc'd capability record with all tc= capabilities fully + * expanded and its length (not including trailing ASCII NUL) are left in + * *cap and *len. + * + * Basic algorithm: + * + Allocate memory incrementally as needed in chunks of size BFRAG + * for capability buffer. + * + Recurse for each tc=name and interpolate result. Stop when all + * names interpolated, a name can't be found, or depth exceeds + * MAX_RECURSION. + */ +#define DOALLOC(size) typeRealloc(char, size, record) +static int +_nc_getent( + char **cap, /* termcap-content */ + unsigned *len, /* length, needed for recursion */ + int *beginning, /* line-number at match */ + int in_array, /* index in 'db_array[] */ + char **db_array, /* list of files to search */ + int fd, + const char *name, + int depth, + char *nfield) +{ + register char *r_end, *rp; + int myfd = FALSE; + char *record = 0; + int tc_not_resolved; + int current; + int lineno; + + /* + * Return with ``loop detected'' error if we've recurred more than + * MAX_RECURSION times. + */ + if (depth > MAX_RECURSION) + return (TC_REF_LOOP); + + /* + * Check if we have a top record from cgetset(). + */ + if (depth == 0 && toprec != 0 && _nc_cgetmatch(toprec, name) == 0) { + if ((record = DOALLOC(topreclen + BFRAG)) == 0) { + errno = ENOMEM; + return (TC_SYS_ERR); + } + _nc_STRCPY(record, toprec, topreclen + BFRAG); + rp = record + topreclen + 1; + r_end = rp + BFRAG; + current = in_array; + } else { + int foundit; + + /* + * Allocate first chunk of memory. + */ + if ((record = DOALLOC(BFRAG)) == 0) { + errno = ENOMEM; + return (TC_SYS_ERR); + } + rp = r_end = record + BFRAG; + foundit = FALSE; + + /* + * Loop through database array until finding the record. + */ + for (current = in_array; db_array[current] != 0; current++) { + int eof = FALSE; + + /* + * Open database if not already open. + */ + if (fd >= 0) { + (void) lseek(fd, (off_t) 0, SEEK_SET); + } else if ((_nc_access(db_array[current], R_OK) < 0) + || (fd = safe_open2(db_array[current], O_RDONLY)) < 0) { + /* No error on unfound file. */ + if (errno == ENOENT) + continue; + free(record); + return (TC_SYS_ERR); + } else { + myfd = TRUE; + } + lineno = 0; + + /* + * Find the requested capability record ... + */ + { + char buf[2048]; + register char *b_end = buf; + register char *bp = buf; + register int c; + + /* + * Loop invariants: + * There is always room for one more character in record. + * R_end always points just past end of record. + * Rp always points just past last character in record. + * B_end always points just past last character in buf. + * Bp always points at next character in buf. + */ + + for (;;) { + int first = lineno + 1; + + /* + * Read in a line implementing (\, newline) + * line continuation. + */ + rp = record; + for (;;) { + if (bp >= b_end) { + int n; + + n = (int) read(fd, buf, sizeof(buf)); + if (n <= 0) { + if (myfd) + (void) close(fd); + if (n < 0) { + free(record); + return (TC_SYS_ERR); + } + fd = -1; + eof = TRUE; + break; + } + b_end = buf + n; + bp = buf; + } + + c = *bp++; + if (c == '\n') { + lineno++; + /* + * Unlike BSD 4.3, this ignores a backslash at the + * end of a comment-line. That makes it consistent + * with the rest of ncurses -TD + */ + if (rp == record + || *record == '#' + || *(rp - 1) != '\\') + break; + } + *rp++ = (char) c; + + /* + * Enforce loop invariant: if no room + * left in record buffer, try to get + * some more. + */ + if (rp >= r_end) { + unsigned pos; + size_t newsize; + + pos = (unsigned) (rp - record); + newsize = (size_t) (r_end - record + BFRAG); + record = DOALLOC(newsize); + if (record == 0) { + if (myfd) + (void) close(fd); + errno = ENOMEM; + return (TC_SYS_ERR); + } + r_end = record + newsize; + rp = record + pos; + } + } + /* loop invariant lets us do this */ + *rp++ = '\0'; + + /* + * If encountered eof check next file. + */ + if (eof) + break; + + /* + * Toss blank lines and comments. + */ + if (*record == '\0' || *record == '#') + continue; + + /* + * See if this is the record we want ... + */ + if (_nc_cgetmatch(record, name) == 0 + && (nfield == 0 + || !_nc_nfcmp(nfield, record))) { + foundit = TRUE; + *beginning = first; + break; /* found it! */ + } + } + } + if (foundit) + break; + } + + if (!foundit) { + free(record); + return (TC_NOT_FOUND); + } + } + + /* + * Got the capability record, but now we have to expand all tc=name + * references in it ... + */ + { + register char *newicap, *s; + register int newilen; + unsigned ilen; + int diff, iret, tclen, oline; + char *icap = 0, *scan, *tc, *tcstart, *tcend; + + /* + * Loop invariants: + * There is room for one more character in record. + * R_end points just past end of record. + * Rp points just past last character in record. + * Scan points at remainder of record that needs to be + * scanned for tc=name constructs. + */ + scan = record; + tc_not_resolved = FALSE; + for (;;) { + if ((tc = _nc_cgetcap(scan, "tc", '=')) == 0) { + break; + } + + /* + * Find end of tc=name and stomp on the trailing `:' + * (if present) so we can use it to call ourselves. + */ + s = tc; + while (*s != '\0') { + if (*s++ == ':') { + *(s - 1) = '\0'; + break; + } + } + tcstart = tc - 3; + tclen = (int) (s - tcstart); + tcend = s; + + icap = 0; + iret = _nc_getent(&icap, &ilen, &oline, current, db_array, fd, + tc, depth + 1, 0); + newicap = icap; /* Put into a register. */ + newilen = (int) ilen; + if (iret != TC_SUCCESS) { + /* an error */ + if (iret < TC_NOT_FOUND) { + if (myfd) + (void) close(fd); + free(record); + FreeIfNeeded(icap); + return (iret); + } + if (iret == TC_UNRESOLVED) { + tc_not_resolved = TRUE; + /* couldn't resolve tc */ + } else if (iret == TC_NOT_FOUND) { + *(s - 1) = ':'; + scan = s - 1; + tc_not_resolved = TRUE; + continue; + } + } + + /* not interested in name field of tc'ed record */ + s = newicap; + while (*s != '\0' && *s++ != ':') ; + newilen -= (int) (s - newicap); + newicap = s; + + /* make sure interpolated record is `:'-terminated */ + s += newilen; + if (*(s - 1) != ':') { + *s = ':'; /* overwrite NUL with : */ + newilen++; + } + + /* + * Make sure there's enough room to insert the + * new record. + */ + diff = newilen - tclen; + if (diff >= r_end - rp) { + unsigned pos, tcpos, tcposend; + size_t newsize; + + pos = (unsigned) (rp - record); + newsize = (size_t) (r_end - record + diff + BFRAG); + tcpos = (unsigned) (tcstart - record); + tcposend = (unsigned) (tcend - record); + record = DOALLOC(newsize); + if (record == 0) { + if (myfd) + (void) close(fd); + free(icap); + errno = ENOMEM; + return (TC_SYS_ERR); + } + r_end = record + newsize; + rp = record + pos; + tcstart = record + tcpos; + tcend = record + tcposend; + } + + /* + * Insert tc'ed record into our record. + */ + s = tcstart + newilen; + memmove(s, tcend, (size_t) (rp - tcend)); + memmove(tcstart, newicap, (size_t) newilen); + rp += diff; + free(icap); + + /* + * Start scan on `:' so next cgetcap works properly + * (cgetcap always skips first field). + */ + scan = s - 1; + } + } + + /* + * Close file (if we opened it), give back any extra memory, and + * return capability, length and success. + */ + if (myfd) + (void) close(fd); + *len = (unsigned) (rp - record - 1); /* don't count NUL */ + if (r_end > rp) { + if ((record = DOALLOC((size_t) (rp - record))) == 0) { + errno = ENOMEM; + return (TC_SYS_ERR); + } + } + + *cap = record; + if (tc_not_resolved) { + return (TC_UNRESOLVED); + } + return (current); +} + +/* + * Cgetmatch will return 0 if name is one of the names of the capability + * record buf, -1 if not. + */ +static int +_nc_cgetmatch(char *buf, const char *name) +{ + register const char *np; + register char *bp; + + /* + * Start search at beginning of record. + */ + bp = buf; + for (;;) { + /* + * Try to match a record name. + */ + np = name; + for (;;) { + if (*np == '\0') { + if (*bp == '|' || *bp == ':' || *bp == '\0') + return (0); + else + break; + } else if (*bp++ != *np++) { + break; + } + } + + /* + * Match failed, skip to next name in record. + */ + bp--; /* a '|' or ':' may have stopped the match */ + for (;;) { + if (*bp == '\0' || *bp == ':') + return (-1); /* match failed totally */ + else if (*bp++ == '|') + break; /* found next name */ + } + } +} + +/* + * Compare name field of record. + */ +static int +_nc_nfcmp(const char *nf, char *rec) +{ + char *cp, tmp; + int ret; + + for (cp = rec; *cp != ':'; cp++) ; + + tmp = *(cp + 1); + *(cp + 1) = '\0'; + ret = strcmp(nf, rec); + *(cp + 1) = tmp; + + return (ret); +} +#endif /* HAVE_BSD_CGETENT */ + +/* + * Since ncurses provides its own 'tgetent()', we cannot use the native one. + * So we reproduce the logic to get down to cgetent() -- or our cut-down + * version of that -- to circumvent the problem of configuring against the + * termcap library. + */ +#define USE_BSD_TGETENT 1 + +#if USE_BSD_TGETENT +/* + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgment: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* static char sccsid[] = "@(#)termcap.c 8.1 (Berkeley) 6/4/93" */ + +#define PBUFSIZ 512 /* max length of filename path */ +#define PVECSIZ 32 /* max number of names in path */ +#define TBUFSIZ (2048*2) + +/* + * On entry, srcp points to a non ':' character which is the beginning of the + * token, if any. We'll try to return a string that doesn't end with a ':'. + */ +static char * +get_tc_token(char **srcp, int *endp) +{ + int ch; + bool found = FALSE; + char *s, *base; + char *tok = 0; + + *endp = TRUE; + for (s = base = *srcp; *s != '\0';) { + ch = *s++; + if (ch == '\\') { + if (*s == '\0') { + break; + } else if (*s++ == '\n') { + while (isspace(UChar(*s))) + s++; + } else { + found = TRUE; + } + } else if (ch == ':') { + if (found) { + tok = base; + s[-1] = '\0'; + *srcp = s; + *endp = FALSE; + break; + } + base = s; + } else if (isgraph(UChar(ch))) { + found = TRUE; + } + } + + /* malformed entry may end without a ':' */ + if (tok == 0 && found) { + tok = base; + } + + return tok; +} + +static char * +copy_tc_token(char *dst, const char *src, size_t len) +{ + int ch; + + while ((ch = *src++) != '\0') { + if (ch == '\\' && *src == '\n') { + while (isspace(UChar(*src))) + src++; + continue; + } + if (--len == 0) { + dst = 0; + break; + } + *dst++ = (char) ch; + } + return dst; +} + +/* + * Get an entry for terminal name in buffer bp from the termcap file. + */ +static int +_nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name) +{ + static char *the_source; + + register char *p; + register char *cp; + char *dummy = NULL; + CGETENT_CONST char **fname; + char *home; + int i; + char pathbuf[PBUFSIZ]; /* holds raw path of filenames */ + CGETENT_CONST char *pathvec[PVECSIZ]; /* point to names in pathbuf */ + const char *termpath; + string_desc desc; + + *lineno = 1; + fname = pathvec; + p = pathbuf; + cp = use_terminfo_vars()? getenv("TERMCAP") : NULL; + + /* + * TERMCAP can have one of two things in it. It can be the name of a file + * to use instead of /etc/termcap. In this case it better start with a + * "/". Or it can be an entry to use so we don't have to read the file. + * In this case it has to already have the newlines crunched out. If + * TERMCAP does not hold a file name then a path of names is searched + * instead. The path is found in the TERMPATH variable, or becomes + * "$HOME/.termcap /etc/termcap" if no TERMPATH exists. + */ + _nc_str_init(&desc, pathbuf, sizeof(pathbuf)); + if (cp == NULL) { + _nc_safe_strcpy(&desc, get_termpath()); + } else if (!_nc_is_abs_path(cp)) { /* TERMCAP holds an entry */ + if ((termpath = get_termpath()) != 0) { + _nc_safe_strcat(&desc, termpath); + } else { + char temp[PBUFSIZ]; + temp[0] = 0; + if ((home = getenv("HOME")) != 0 && *home != '\0' + && strchr(home, ' ') == 0 + && strlen(home) < sizeof(temp) - 10) { /* setup path */ + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%s/", home); /* $HOME first */ + } + /* if no $HOME look in current directory */ + _nc_STRCAT(temp, ".termcap", sizeof(temp)); + _nc_safe_strcat(&desc, temp); + _nc_safe_strcat(&desc, " "); + _nc_safe_strcat(&desc, get_termpath()); + } + } else { /* user-defined name in TERMCAP */ + _nc_safe_strcat(&desc, cp); /* still can be tokenized */ + } + + *fname++ = pathbuf; /* tokenize path into vector of names */ + while (*++p) { + if (*p == ' ' || *p == NCURSES_PATHSEP) { + *p = '\0'; + while (*++p) + if (*p != ' ' && *p != NCURSES_PATHSEP) + break; + if (*p == '\0') + break; + *fname++ = p; + if (fname >= pathvec + PVECSIZ) { + fname--; + break; + } + } + } + *fname = 0; /* mark end of vector */ +#if !HAVE_BSD_CGETENT + (void) _nc_cgetset(0); +#endif + if (_nc_is_abs_path(cp)) { + if (_nc_cgetset(cp) < 0) { + return (TC_SYS_ERR); + } + } + + i = _nc_cgetent(&dummy, lineno, pathvec, name); + + /* ncurses' termcap-parsing routines cannot handle multiple adjacent + * empty fields, and mistakenly use the last valid cap entry instead of + * the first (breaks tc= includes) + */ + *bp = '\0'; + if (i >= 0) { + char *pd, *ps, *tok; + int endflag = FALSE; + char *list[1023]; + size_t n, count = 0; + + pd = bp; + ps = dummy; + while (!endflag && (tok = get_tc_token(&ps, &endflag)) != 0) { + bool ignore = FALSE; + + for (n = 1; n < count; n++) { + char *s = list[n]; + if (s[0] == tok[0] + && s[1] == tok[1]) { + ignore = TRUE; + break; + } + } + if (ignore != TRUE) { + list[count++] = tok; + pd = copy_tc_token(pd, tok, (size_t) (TBUFSIZ - (2 + pd - bp))); + if (pd == 0) { + i = -1; + break; + } + *pd++ = ':'; + *pd = '\0'; + } + } + } + + FreeIfNeeded(dummy); + FreeIfNeeded(the_source); + the_source = 0; + + /* This is not related to the BSD cgetent(), but to fake up a suitable + * filename for ncurses' error reporting. (If we are not using BSD + * cgetent, then it is the actual filename). + */ + if (i >= 0) { +#if HAVE_BSD_CGETENT + char temp[PATH_MAX]; + + _nc_str_init(&desc, temp, sizeof(temp)); + _nc_safe_strcpy(&desc, pathvec[i]); + _nc_safe_strcat(&desc, ".db"); + if (_nc_access(temp, R_OK) == 0) { + _nc_safe_strcpy(&desc, pathvec[i]); + } + if ((the_source = strdup(temp)) != 0) + *sourcename = the_source; +#else + if ((the_source = strdup(pathvec[i])) != 0) + *sourcename = the_source; +#endif + } + + return (i); +} +#endif /* USE_BSD_TGETENT */ +#endif /* USE_GETCAP */ + +#define MAXPATHS 32 + +/* + * Add a filename to the list in 'termpaths[]', checking that we really have + * a right to open the file. + */ +#if !USE_GETCAP +static int +add_tc(char *termpaths[], char *path, int count) +{ + char *save = strchr(path, NCURSES_PATHSEP); + if (save != 0) + *save = '\0'; + if (count < MAXPATHS + && _nc_access(path, R_OK) == 0) { + termpaths[count++] = path; + TR(TRACE_DATABASE, ("Adding termpath %s", path)); + } + termpaths[count] = 0; + if (save != 0) + *save = NCURSES_PATHSEP; + return count; +} +#define ADD_TC(path, count) filecount = add_tc(termpaths, path, count) +#endif /* !USE_GETCAP */ + +NCURSES_EXPORT(int) +_nc_read_termcap_entry(const char *const tn, TERMTYPE2 *const tp) +{ + int found = TGETENT_NO; + ENTRY *ep; +#if USE_GETCAP_CACHE + char cwd_buf[PATH_MAX]; +#endif +#if USE_GETCAP + char *p, tc[TBUFSIZ]; + char *tc_buf = 0; +#define MY_SIZE sizeof(tc) - 1 + int status; + static char *source; + static int lineno; + + TR(TRACE_DATABASE, ("read termcap entry for %s", tn)); + + if (strlen(tn) == 0 + || strcmp(tn, ".") == 0 + || strcmp(tn, "..") == 0 + || _nc_pathlast(tn) != 0) { + TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", tn)); + return TGETENT_NO; + } + + if (use_terminfo_vars() && (p = getenv("TERMCAP")) != 0 + && !_nc_is_abs_path(p) && _nc_name_match(p, tn, "|:")) { + /* TERMCAP holds a termcap entry */ + tc_buf = strdup(p); + _nc_set_source("TERMCAP"); + } else { + /* we're using getcap(3) */ + if ((status = _nc_tgetent(tc, &source, &lineno, tn)) < 0) + return (status == TC_NOT_FOUND ? TGETENT_NO : TGETENT_ERR); + + _nc_curr_line = lineno; + _nc_set_source(source); + tc_buf = tc; + } + if (tc_buf == 0) + return (TGETENT_ERR); + _nc_read_entry_source((FILE *) 0, tc_buf, FALSE, TRUE, NULLHOOK); + if (tc_buf != tc) + free(tc_buf); +#else + /* + * Here is what the 4.4BSD termcap(3) page prescribes: + * + * It will look in the environment for a TERMCAP variable. If found, and + * the value does not begin with a slash, and the terminal type name is the + * same as the environment string TERM, the TERMCAP string is used instead + * of reading a termcap file. If it does begin with a slash, the string is + * used as a path name of the termcap file to search. If TERMCAP does not + * begin with a slash and name is different from TERM, tgetent() searches + * the files $HOME/.termcap and /usr/share/misc/termcap, in that order, + * unless the environment variable TERMPATH exists, in which case it + * specifies a list of file pathnames (separated by spaces or colons) to be + * searched instead. + * + * It goes on to state: + * + * Whenever multiple files are searched and a tc field occurs in the + * requested entry, the entry it names must be found in the same file or + * one of the succeeding files. + * + * However, this restriction is relaxed in ncurses; tc references to + * previous files are permitted. + * + * This routine returns 1 if an entry is found, 0 if not found, and -1 if + * the database is not accessible. + */ + FILE *fp; + char *tc, *termpaths[MAXPATHS]; + int filecount = 0; + int j, k; + bool use_buffer = FALSE; + bool normal = TRUE; + char *tc_buf = 0; + char pathbuf[PATH_MAX]; + char *copied = 0; + char *cp; + struct stat test_stat[MAXPATHS]; + + termpaths[filecount] = 0; + if (use_terminfo_vars() && (tc = getenv("TERMCAP")) != 0) { + if (_nc_is_abs_path(tc)) { /* interpret as a filename */ + ADD_TC(tc, 0); + normal = FALSE; + } else if (_nc_name_match(tc, tn, "|:")) { /* treat as a capability file */ + tc_buf = strdup(tc); + use_buffer = (tc_buf != 0); + normal = FALSE; + } + } + + if (normal) { /* normal case */ + char envhome[PATH_MAX], *h; + + if ((copied = strdup(get_termpath())) != 0) { + for (cp = copied; *cp; cp++) { + if (*cp == NCURSES_PATHSEP) + *cp = '\0'; + else if (cp == copied || cp[-1] == '\0') { + ADD_TC(cp, filecount); + } + } + } +#define PRIVATE_CAP "%.*s/.termcap" + + if (use_terminfo_vars() && (h = getenv("HOME")) != NULL && *h != '\0' + && (strlen(h) + sizeof(PRIVATE_CAP)) < PATH_MAX) { + /* user's .termcap, if any, should override it */ + _nc_STRCPY(envhome, h, sizeof(envhome)); + _nc_SPRINTF(pathbuf, _nc_SLIMIT(sizeof(pathbuf)) + PRIVATE_CAP, + (int) (sizeof(pathbuf) - sizeof(PRIVATE_CAP)), + envhome); + ADD_TC(pathbuf, filecount); + } + } + + /* + * Probably /etc/termcap is a symlink to /usr/share/misc/termcap. + * Avoid reading the same file twice. + */ +#if HAVE_LINK + for (j = 0; j < filecount; j++) { + bool omit = FALSE; + if (stat(termpaths[j], &test_stat[j]) != 0 + || !S_ISREG(test_stat[j].st_mode)) { + omit = TRUE; + } else { + for (k = 0; k < j; k++) { + if (test_stat[k].st_dev == test_stat[j].st_dev + && test_stat[k].st_ino == test_stat[j].st_ino) { + omit = TRUE; + break; + } + } + } + if (omit) { + TR(TRACE_DATABASE, ("Path %s is a duplicate", termpaths[j])); + for (k = j + 1; k < filecount; k++) { + termpaths[k - 1] = termpaths[k]; + test_stat[k - 1] = test_stat[k]; + } + --filecount; + --j; + } + } +#endif + + /* parse the sources */ + if (use_buffer) { + _nc_set_source("TERMCAP"); + + /* + * We don't suppress warning messages here. The presumption is + * that since it is just a single entry, they won't be a pain. + */ + _nc_read_entry_source((FILE *) 0, tc_buf, FALSE, FALSE, NULLHOOK); + free(tc_buf); + } else { + int i; + + for (i = 0; i < filecount; i++) { + + TR(TRACE_DATABASE, ("Looking for %s in %s", tn, termpaths[i])); + if (_nc_access(termpaths[i], R_OK) == 0 + && (fp = safe_fopen(termpaths[i], "r")) != (FILE *) 0) { + _nc_set_source(termpaths[i]); + + /* + * Suppress warning messages. Otherwise you get 400 lines of + * crap from archaic termcap files as ncurses complains about + * all the obsolete capabilities. + */ + _nc_read_entry_source(fp, (char *) 0, FALSE, TRUE, NULLHOOK); + + (void) fclose(fp); + } + } + } + if (copied != 0) + free(copied); +#endif /* USE_GETCAP */ + + if (_nc_head == 0) + return (TGETENT_ERR); + + /* resolve all use references */ + if (_nc_resolve_uses2(TRUE, FALSE) != TRUE) + return (TGETENT_ERR); + + /* find a terminal matching tn, if we can */ +#if USE_GETCAP_CACHE + if (getcwd(cwd_buf, sizeof(cwd_buf)) != 0) { + _nc_set_writedir((char *) 0); /* note: this does a chdir */ +#endif + for_entry_list(ep) { + if (_nc_name_match(ep->tterm.term_names, tn, "|:")) { + /* + * Make a local copy of the terminal capabilities, delinked + * from the list. + */ + *tp = ep->tterm; + _nc_free_entry(_nc_head, &(ep->tterm)); + + /* + * OK, now try to write the type to user's terminfo directory. + * Next time he loads this, it will come through terminfo. + * + * Advantage: Second and subsequent fetches of this entry will + * be very fast. + * + * Disadvantage: After the first time a termcap type is loaded + * by its user, editing it in the /etc/termcap file, or in + * TERMCAP, or in a local ~/.termcap, will be ineffective + * unless the terminfo entry is explicitly removed. + */ +#if USE_GETCAP_CACHE + (void) _nc_write_entry(tp); +#endif + found = TGETENT_YES; + break; + } + } +#if USE_GETCAP_CACHE + chdir(cwd_buf); + } +#endif + + return (found); +} +#else +extern +NCURSES_EXPORT(void) +_nc_read_termcap(void); +NCURSES_EXPORT(void) +_nc_read_termcap(void) +{ +} +#endif /* PURE_TERMINFO */ diff --git a/contrib/ncurses/ncurses/tinfo/strings.c b/contrib/ncurses/ncurses/tinfo/strings.c new file mode 100644 index 00000000..03f59c24 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/strings.c @@ -0,0 +1,144 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2000-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* +** lib_mvcur.c +**/ + +#include +#include + +MODULE_ID("$Id: strings.c,v 1.11 2023/05/27 20:13:10 tom Exp $") + +/**************************************************************************** + * Useful string functions (especially for mvcur) + ****************************************************************************/ + +#if !HAVE_STRSTR +NCURSES_EXPORT(char *) +_nc_strstr(const char *haystack, const char *needle) +{ + size_t len1 = strlen(haystack); + size_t len2 = strlen(needle); + char *result = 0; + + while ((len1 != 0) && (len1-- >= len2)) { + if (!strncmp(haystack, needle, len2)) { + result = (char *) haystack; + break; + } + haystack++; + } + return result; +} +#endif + +/* + * Initialize the descriptor so we can append to it. Note that 'src' may + * be a null pointer (see _nc_str_null), so the corresponding strcat and + * strcpy calls have to allow for this. + */ +NCURSES_EXPORT(string_desc *) +_nc_str_init(string_desc * dst, char *src, size_t len) +{ + if (dst != 0) { + dst->s_head = src; + dst->s_tail = src; + dst->s_size = len - 1; + dst->s_init = dst->s_size; + if (src != 0) + *src = 0; + } + return dst; +} + +/* + * Initialize the descriptor for only tracking the amount of memory used. + */ +NCURSES_EXPORT(string_desc *) +_nc_str_null(string_desc * dst, size_t len) +{ + return _nc_str_init(dst, 0, len); +} + +/* + * Copy a descriptor + */ +NCURSES_EXPORT(string_desc *) +_nc_str_copy(string_desc * dst, const string_desc * const src) +{ + *dst = *src; + return dst; +} + +/* + * Replaces strcat into a fixed buffer, returning false on failure. + */ +NCURSES_EXPORT(bool) +_nc_safe_strcat(string_desc * dst, const char *src) +{ + if (PRESENT(src)) { + size_t len = strlen(src); + + if (len < dst->s_size) { + if (dst->s_tail != 0) { + _nc_STRCPY(dst->s_tail, src, dst->s_size); + dst->s_tail += len; + } + dst->s_size -= len; + return TRUE; + } + } + return FALSE; +} + +/* + * Replaces strcpy into a fixed buffer, returning false on failure. + */ +NCURSES_EXPORT(bool) +_nc_safe_strcpy(string_desc * dst, const char *src) +{ + if (PRESENT(src)) { + size_t len = strlen(src); + + if (len < dst->s_size) { + if (dst->s_head != 0) { + _nc_STRCPY(dst->s_head, src, dst->s_size); + dst->s_tail = dst->s_head + len; + } + dst->s_size = dst->s_init - len; + return TRUE; + } + } + return FALSE; +} diff --git a/contrib/ncurses/ncurses/tinfo/tinfo_driver.c b/contrib/ncurses/ncurses/tinfo/tinfo_driver.c new file mode 100644 index 00000000..1ed9c052 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/tinfo_driver.c @@ -0,0 +1,1554 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2008-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * and: Thomas E. Dickey * + ****************************************************************************/ + +#include +#define CUR TerminalType((TERMINAL*)TCB). +#include +#include /* ospeed */ + +#if HAVE_NANOSLEEP +#include +#if HAVE_SYS_TIME_H +#include /* needed for MacOS X DP3 */ +#endif +#endif + +#if HAVE_SIZECHANGE +# if !defined(sun) || !TERMIOS +# if HAVE_SYS_IOCTL_H +# include +# endif +# endif +#endif + +MODULE_ID("$Id: tinfo_driver.c,v 1.76 2024/08/31 10:46:01 Rafael.Kitover Exp $") + +/* + * SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS, + * Solaris, IRIX) define TIOCGWINSZ and struct winsize. + */ +#ifdef TIOCGSIZE +# define IOCTL_WINSIZE TIOCGSIZE +# define STRUCT_WINSIZE struct ttysize +# define WINSIZE_ROWS(n) (int)n.ts_lines +# define WINSIZE_COLS(n) (int)n.ts_cols +#else +# ifdef TIOCGWINSZ +# define IOCTL_WINSIZE TIOCGWINSZ +# define STRUCT_WINSIZE struct winsize +# define WINSIZE_ROWS(n) (int)n.ws_row +# define WINSIZE_COLS(n) (int)n.ws_col +# endif +#endif + +/* + * These should be screen structure members. They need to be globals for + * historical reasons. So we assign them in start_color() and also in + * set_term()'s screen-switching logic. + */ +#if USE_REENTRANT +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(COLOR_PAIRS) (void) +{ + return CURRENT_SCREEN ? CURRENT_SCREEN->_pair_count : -1; +} +NCURSES_EXPORT(int) +NCURSES_PUBLIC_VAR(COLORS) (void) +{ + return CURRENT_SCREEN ? CURRENT_SCREEN->_color_count : -1; +} +#else +NCURSES_EXPORT_VAR(int) COLOR_PAIRS = 0; +NCURSES_EXPORT_VAR(int) COLORS = 0; +#endif + +#define TCBMAGIC NCDRV_MAGIC(NCDRV_TINFO) +#define AssertTCB() assert(TCB!=0 && TCB->magic==TCBMAGIC) +#define SetSP() assert(TCB->csp!=0); sp = TCB->csp; (void) sp + +/* + * This routine needs to do all the work to make curscr look + * like newscr. + */ +static int +drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB) +{ + AssertTCB(); + return TINFO_DOUPDATE(TCB->csp); +} + +static const char * +drv_Name(TERMINAL_CONTROL_BLOCK * TCB) +{ + (void) TCB; + return "tinfo"; +} + +static void +get_baudrate(TERMINAL *termp) +{ + int my_ospeed; + int result; + if (GET_TTY(termp->Filedes, &termp->Nttyb) == OK) { +#ifdef TERMIOS + termp->Nttyb.c_oflag &= (unsigned) (~OFLAGS_TABS); +#elif defined(EXP_WIN32_DRIVER) + /* noop */ +#else + termp->Nttyb.sg_flags &= (unsigned) (~XTABS); +#endif + } +#ifdef USE_OLD_TTY + result = (int) cfgetospeed(&(termp->Nttyb)); + my_ospeed = (NCURSES_OSPEED) _nc_ospeed(result); +#else /* !USE_OLD_TTY */ +#ifdef TERMIOS + my_ospeed = (NCURSES_OSPEED) cfgetospeed(&(termp->Nttyb)); +#elif defined(EXP_WIN32_DRIVER) + /* noop */ + my_ospeed = 0; +#else + my_ospeed = (NCURSES_OSPEED) termp->Nttyb.sg_ospeed; +#endif + result = _nc_baudrate(my_ospeed); +#endif + termp->_baudrate = result; + ospeed = (NCURSES_OSPEED) my_ospeed; +} + +#undef SETUP_FAIL +#define SETUP_FAIL FALSE + +#define NO_COPY {} + +static bool +drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret) +{ + bool result = FALSE; + int status; + TERMINAL *termp; + SCREEN *sp; + + START_TRACE(); + T((T_CALLED("tinfo::drv_CanHandle(%p)"), (void *) TCB)); + + assert(TCB != 0 && tname != 0); + termp = (TERMINAL *) TCB; + sp = TCB->csp; + TCB->magic = TCBMAGIC; + +#if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP) + status = _nc_setup_tinfo(tname, &TerminalType(termp)); + T(("_nc_setup_tinfo returns %d", status)); +#else + T(("no database available")); + status = TGETENT_NO; +#endif + + /* try fallback list if entry on disk */ + if (status != TGETENT_YES) { + const TERMTYPE2 *fallback = _nc_fallback2(tname); + + if (fallback) { + T(("found fallback entry")); + TerminalType(termp) = *fallback; + status = TGETENT_YES; + } + } + + if (status != TGETENT_YES) { + NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx termp); + if (status == TGETENT_ERR) { + ret_error0(status, "terminals database is inaccessible\n"); + } else if (status == TGETENT_NO) { + ret_error1(status, "unknown terminal type.\n", + tname, NO_COPY); + } else { + ret_error0(status, "unexpected return-code\n"); + } + } + result = TRUE; +#if NCURSES_EXT_NUMBERS + _nc_export_termtype2(&termp->type, &TerminalType(termp)); +#endif +#if !USE_REENTRANT + save_ttytype(termp); +#endif + + if (VALID_STRING(command_character)) + _nc_tinfo_cmdch(termp, UChar(*command_character)); + + /* + * If an application calls setupterm() rather than initscr() or + * newterm(), we will not have the def_prog_mode() call in + * _nc_setupscreen(). Do it now anyway, so we can initialize the + * baudrate. + */ + if (sp == 0 && NC_ISATTY(termp->Filedes)) { + get_baudrate(termp); + } +#if NCURSES_EXT_NUMBERS +#define cleanup_termtype() \ + _nc_free_termtype2(&TerminalType(termp)); \ + _nc_free_termtype(&termp->type) +#else +#define cleanup_termtype() \ + _nc_free_termtype2(&TerminalType(termp)) +#endif + + if (generic_type) { + /* + * BSD 4.3's termcap contains mis-typed "gn" for wy99. Do a sanity + * check before giving up. + */ + if ((VALID_STRING(cursor_address) + || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home))) + && VALID_STRING(clear_screen)) { + cleanup_termtype(); + ret_error1(TGETENT_YES, "terminal is not really generic.\n", + tname, NO_COPY); + } else { + cleanup_termtype(); + ret_error1(TGETENT_NO, "I need something more specific.\n", + tname, NO_COPY); + } + } + if (hard_copy) { + cleanup_termtype(); + ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", + tname, NO_COPY); + } + + returnBool(result); +} + +static int +drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, int beepFlag) +{ + SCREEN *sp; + int res = ERR; + + AssertTCB(); + SetSP(); + + /* FIXME: should make sure that we are not in altchar mode */ + if (beepFlag) { + if (bell) { + res = NCURSES_PUTP2("bell", bell); + NCURSES_SP_NAME(_nc_flush) (sp); + } else if (flash_screen) { + res = NCURSES_PUTP2("flash_screen", flash_screen); + NCURSES_SP_NAME(_nc_flush) (sp); + } + } else { + if (flash_screen) { + res = NCURSES_PUTP2("flash_screen", flash_screen); + NCURSES_SP_NAME(_nc_flush) (sp); + } else if (bell) { + res = NCURSES_PUTP2("bell", bell); + NCURSES_SP_NAME(_nc_flush) (sp); + } + } + return res; +} + +/* + * SVr4 curses is known to interchange color codes (1,4) and (3,6), possibly + * to maintain compatibility with a pre-ANSI scheme. The same scheme is + * also used in the FreeBSD syscons. + */ +static int +toggled_colors(int c) +{ + if (c < 16) { + static const int table[] = + {0, 4, 2, 6, 1, 5, 3, 7, + 8, 12, 10, 14, 9, 13, 11, 15}; + c = table[c]; + } + return c; +} + +static int +drv_print(TERMINAL_CONTROL_BLOCK * TCB, char *data, int len) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +#if NCURSES_EXT_FUNCS + return NCURSES_SP_NAME(mcprint) (TCB->csp, data, len); +#else + return ERR; +#endif +} + +static int +drv_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, int fg, int bg) +{ + SCREEN *sp; + int code = ERR; + + AssertTCB(); + SetSP(); + + if (sp != 0 && orig_pair && orig_colors && (initialize_pair != 0)) { +#if NCURSES_EXT_FUNCS + sp->_default_color = isDefaultColor(fg) || isDefaultColor(bg); + sp->_has_sgr_39_49 = (NCURSES_SP_NAME(tigetflag) (NCURSES_SP_ARGx + "AX") + == TRUE); + sp->_default_fg = isDefaultColor(fg) ? COLOR_DEFAULT : fg; + sp->_default_bg = isDefaultColor(bg) ? COLOR_DEFAULT : bg; + if (sp->_color_pairs != 0) { + bool save = sp->_default_color; + sp->_default_color = TRUE; + NCURSES_SP_NAME(init_pair) (NCURSES_SP_ARGx + 0, + (short)fg, + (short)bg); + sp->_default_color = save; + } +#endif + code = OK; + } + return (code); +} + +static void +drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB, + int fore, + int color, + NCURSES_SP_OUTC outc) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); + + if (fore) { + if (set_a_foreground) { + TPUTS_TRACE("set_a_foreground"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_a_foreground, color), 1, outc); + } else { + TPUTS_TRACE("set_foreground"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_foreground, + toggled_colors(color)), 1, outc); + } + } else { + if (set_a_background) { + TPUTS_TRACE("set_a_background"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_a_background, color), 1, outc); + } else { + TPUTS_TRACE("set_background"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_background, + toggled_colors(color)), 1, outc); + } + } +} + +static bool +drv_rescol(TERMINAL_CONTROL_BLOCK * TCB) +{ + bool result = FALSE; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + if (orig_pair != 0) { + NCURSES_PUTP2("orig_pair", orig_pair); + result = TRUE; + } + return result; +} + +static bool +drv_rescolors(TERMINAL_CONTROL_BLOCK * TCB) +{ + int result = FALSE; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + if (orig_colors != 0) { + NCURSES_PUTP2("orig_colors", orig_colors); + result = TRUE; + } + return result; +} + +static int +drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp) +{ + SCREEN *sp; + bool useEnv = TRUE; + bool useTioctl = TRUE; + + AssertTCB(); + sp = TCB->csp; /* can be null here */ + + if (sp) { + useEnv = sp->_use_env; + useTioctl = sp->use_tioctl; + } else { + useEnv = _nc_prescreen.use_env; + useTioctl = _nc_prescreen.use_tioctl; + } + +#ifdef EXP_WIN32_DRIVER + /* If we are here, then Windows console is used in terminfo mode. + We need to figure out the size using the console API + */ + _nc_console_size(linep, colp); + T(("screen size: winconsole lines = %d columns = %d", *linep, *colp)); +#else + /* figure out the size of the screen */ + T(("screen size: terminfo lines = %d columns = %d", lines, columns)); + + *linep = (int) lines; + *colp = (int) columns; +#endif + if (useEnv || useTioctl) { + int value; + +#ifdef __EMX__ + { + int screendata[2]; + _scrsize(screendata); + *colp = screendata[0]; + *linep = ((sp != 0 && sp->_filtered) + ? 1 + : screendata[1]); + T(("EMX screen size: environment LINES = %d COLUMNS = %d", + *linep, *colp)); + } +#endif +#if HAVE_SIZECHANGE + /* try asking the OS */ + { + TERMINAL *termp = (TERMINAL *) TCB; + if (NC_ISATTY(termp->Filedes)) { + STRUCT_WINSIZE size; + + errno = 0; + do { + if (ioctl(termp->Filedes, IOCTL_WINSIZE, &size) >= 0) { + *linep = ((sp != 0 && sp->_filtered) + ? 1 + : WINSIZE_ROWS(size)); + *colp = WINSIZE_COLS(size); + T(("SYS screen size: environment LINES = %d COLUMNS = %d", + *linep, *colp)); + break; + } + } while + (errno == EINTR); + } + } +#endif /* HAVE_SIZECHANGE */ + + if (useEnv) { + if (useTioctl) { + /* + * If environment variables are used, update them. + */ + if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) { + _nc_setenv_num("LINES", *linep); + } + if (_nc_getenv_num("COLUMNS") > 0) { + _nc_setenv_num("COLUMNS", *colp); + } + } + + /* + * Finally, look for environment variables. + * + * Solaris lets users override either dimension with an environment + * variable. + */ + if ((value = _nc_getenv_num("LINES")) > 0) { + *linep = Min(value, MAX_ENV_LINES); + T(("screen size: environment LINES = %d", *linep)); + } + if ((value = _nc_getenv_num("COLUMNS")) > 0) { + *colp = Min(value, MAX_ENV_COLUMNS); + T(("screen size: environment COLUMNS = %d", *colp)); + } + } + + /* if we can't get dynamic info about the size, use static */ + if (*linep <= 0) { + *linep = (int) lines; + } + if (*colp <= 0) { + *colp = (int) columns; + } + + /* the ultimate fallback, assume fixed 24x80 size */ + if (*linep <= 0) { + *linep = 24; + } + if (*colp <= 0) { + *colp = 80; + } + + /* + * Put the derived values back in the screen-size caps, so + * tigetnum() and tgetnum() will do the right thing. + */ + lines = (short) (*linep); + columns = (short) (*colp); + } + + T(("screen size is %dx%d", *linep, *colp)); + return OK; +} + +static int +drv_getsize(TERMINAL_CONTROL_BLOCK * TCB, int *l, int *c) +{ + AssertTCB(); + assert(l != 0 && c != 0); + *l = lines; + *c = columns; + return OK; +} + +static int +drv_setsize(TERMINAL_CONTROL_BLOCK * TCB, int l, int c) +{ + AssertTCB(); + lines = (short) l; + columns = (short) c; + return OK; +} + +static int +drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) +{ + SCREEN *sp = TCB->csp; + TERMINAL *_term = (TERMINAL *) TCB; + int result = OK; + + AssertTCB(); + if (setFlag) { + for (;;) { + if (SET_TTY(_term->Filedes, buf) != 0) { + if (errno == EINTR) + continue; + if (errno == ENOTTY) { + if (sp) + sp->_notty = TRUE; + } + result = ERR; + } + break; + } + } else { + for (;;) { + if (GET_TTY(_term->Filedes, buf) != 0) { + if (errno == EINTR) + continue; + result = ERR; + } + break; + } + } + return result; +} + +static int +drv_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) +{ + SCREEN *sp; + TERMINAL *_term = (TERMINAL *) TCB; + int code = ERR; + + AssertTCB(); + sp = TCB->csp; + + if (progFlag) /* prog mode */ + { + if (defFlag) { + /* def_prog_mode */ + /* + * Turn off the XTABS bit in the tty structure if it was on. + */ + if ((drv_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) { +#ifdef TERMIOS + _term->Nttyb.c_oflag &= (unsigned) ~OFLAGS_TABS; +#elif defined(EXP_WIN32_DRIVER) + /* noop */ +#else + _term->Nttyb.sg_flags &= (unsigned) ~XTABS; +#endif + code = OK; + } + } else { + /* reset_prog_mode */ + if (drv_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) { + if (sp) { + if (sp->_keypad_on) + _nc_keypad(sp, TRUE); + } + code = OK; + } + } + } else { /* shell mode */ + if (defFlag) { + /* def_shell_mode */ + /* + * If XTABS was on, remove the tab and backtab capabilities. + */ + if (drv_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) { +#ifdef TERMIOS + if (_term->Ottyb.c_oflag & OFLAGS_TABS) + tab = back_tab = NULL; +#elif defined(EXP_WIN32_DRIVER) + /* noop */ +#else + if (_term->Ottyb.sg_flags & XTABS) + tab = back_tab = NULL; +#endif + code = OK; + } + } else { + /* reset_shell_mode */ + if (sp) { + _nc_keypad(sp, FALSE); + NCURSES_SP_NAME(_nc_flush) (sp); + } + code = drv_sgmode(TCB, TRUE, &(_term->Ottyb)); + } + } + return (code); +} + +static void +drv_wrap(SCREEN *sp) +{ + if (sp) { + sp->_mouse_wrap(sp); + NCURSES_SP_NAME(_nc_screen_wrap) (sp); + NCURSES_SP_NAME(_nc_mvcur_wrap) (sp); /* wrap up cursor addressing */ + } +} + +static void +drv_release(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED) +{ +} + +# define SGR0_TEST(mode) (mode != 0) && (exit_attribute_mode == 0 || strcmp(mode, exit_attribute_mode)) + +static void +drv_screen_init(SCREEN *sp) +{ + TERMINAL_CONTROL_BLOCK *TCB = TCBOf(sp); + + AssertTCB(); + + /* + * Check for mismatched graphic-rendition capabilities. Most SVr4 + * terminfo trees contain entries that have rmul or rmso equated to + * sgr0 (Solaris curses copes with those entries). We do this only + * for curses, since many termcap applications assume that + * smso/rmso and smul/rmul are paired, and will not function + * properly if we remove rmso or rmul. Curses applications + * shouldn't be looking at this detail. + */ + sp->_use_rmso = SGR0_TEST(exit_standout_mode); + sp->_use_rmul = SGR0_TEST(exit_underline_mode); + + /* + * Check whether we can optimize scrolling under dumb terminals in + * case we do not have any of these capabilities, scrolling + * optimization will be useless. + */ + sp->_scrolling = ((scroll_forward && scroll_reverse) || + ((parm_rindex || + parm_insert_line || + insert_line) && + (parm_index || + parm_delete_line || + delete_line))); + + NCURSES_SP_NAME(baudrate) (sp); + + NCURSES_SP_NAME(_nc_mvcur_init) (sp); + /* initialize terminal to a sane state */ + NCURSES_SP_NAME(_nc_screen_init) (sp); +} + +static void +drv_init(TERMINAL_CONTROL_BLOCK * TCB) +{ + TERMINAL *trm; + + AssertTCB(); + + trm = (TERMINAL *) TCB; + + TCB->info.initcolor = VALID_STRING(initialize_color); + TCB->info.canchange = can_change; + TCB->info.hascolor = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs) + && (((set_foreground != NULL) + && (set_background != NULL)) + || ((set_a_foreground != NULL) + && (set_a_background != NULL)) + || set_color_pair)) ? TRUE : FALSE); + + TCB->info.caninit = !(exit_ca_mode && non_rev_rmcup); + + TCB->info.maxpairs = VALID_NUMERIC(max_pairs) ? max_pairs : 0; + TCB->info.maxcolors = VALID_NUMERIC(max_colors) ? max_colors : 0; + TCB->info.numlabels = VALID_NUMERIC(num_labels) ? num_labels : 0; + TCB->info.labelwidth = VALID_NUMERIC(label_width) ? label_width : 0; + TCB->info.labelheight = VALID_NUMERIC(label_height) ? label_height : 0; + TCB->info.nocolorvideo = VALID_NUMERIC(no_color_video) ? no_color_video + : 0; + TCB->info.tabsize = VALID_NUMERIC(init_tabs) ? (int) init_tabs : 8; + + TCB->info.defaultPalette = hue_lightness_saturation ? _nc_hls_palette : _nc_cga_palette; + + /* + * If an application calls setupterm() rather than initscr() or + * newterm(), we will not have the def_prog_mode() call in + * _nc_setupscreen(). Do it now anyway, so we can initialize the + * baudrate. + */ + if (NC_ISATTY(trm->Filedes)) { + TCB->drv->td_mode(TCB, TRUE, TRUE); + } +} + +#define MAX_PALETTE 8 +#define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE) + +static void +drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, int pair, int f, int b) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); + + if ((initialize_pair != NULL) && InPalette(f) && InPalette(b)) { + const color_t *tp = InfoOf(sp).defaultPalette; + + TR(TRACE_ATTRS, + ("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)", + pair, + tp[f].red, tp[f].green, tp[f].blue, + tp[b].red, tp[b].green, tp[b].blue)); + + NCURSES_PUTP2("initialize_pair", + TIPARM_7(initialize_pair, + pair, + tp[f].red, tp[f].green, tp[f].blue, + tp[b].red, tp[b].green, tp[b].blue)); + } +} + +static int +default_fg(SCREEN *sp) +{ +#if NCURSES_EXT_FUNCS + return (sp != 0) ? sp->_default_fg : COLOR_WHITE; +#else + return COLOR_WHITE; +#endif +} + +static int +default_bg(SCREEN *sp) +{ +#if NCURSES_EXT_FUNCS + return sp != 0 ? sp->_default_bg : COLOR_BLACK; +#else + return COLOR_BLACK; +#endif +} + +static void +drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB, + int color, int r, int g, int b) +{ + SCREEN *sp = TCB->csp; + + AssertTCB(); + if (initialize_color != NULL) { + NCURSES_PUTP2("initialize_color", + TIPARM_4(initialize_color, color, r, g, b)); + } +} + +static void +drv_do_color(TERMINAL_CONTROL_BLOCK * TCB, + int old_pair, + int pair, + int reverse, + NCURSES_SP_OUTC outc) +{ + SCREEN *sp = TCB->csp; + int fg = COLOR_DEFAULT; + int bg = COLOR_DEFAULT; + int old_fg, old_bg; + + AssertTCB(); + if (sp == 0) + return; + + if (pair < 0 || pair >= COLOR_PAIRS) { + return; + } else if (pair != 0) { + if (set_color_pair) { + TPUTS_TRACE("set_color_pair"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(set_color_pair, pair), 1, outc); + return; + } else if (sp != 0) { + _nc_pair_content(SP_PARM, pair, &fg, &bg); + } + } + + if (old_pair >= 0 + && sp != 0 + && _nc_pair_content(SP_PARM, old_pair, &old_fg, &old_bg) != ERR) { + if ((isDefaultColor(fg) && !isDefaultColor(old_fg)) + || (isDefaultColor(bg) && !isDefaultColor(old_bg))) { +#if NCURSES_EXT_FUNCS + /* + * A minor optimization - but extension. If "AX" is specified in + * the terminal description, treat it as screen's indicator of ECMA + * SGR 39 and SGR 49, and assume the two sequences are independent. + */ + if (sp->_has_sgr_39_49 + && isDefaultColor(old_bg) + && !isDefaultColor(old_fg)) { + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[39m", 1, outc); + } else if (sp->_has_sgr_39_49 + && isDefaultColor(old_fg) + && !isDefaultColor(old_bg)) { + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx "\033[49m", 1, outc); + } else +#endif + drv_rescol(TCB); + } + } else { + drv_rescol(TCB); + if (old_pair < 0) + return; + } + +#if NCURSES_EXT_FUNCS + if (isDefaultColor(fg)) + fg = default_fg(sp); + if (isDefaultColor(bg)) + bg = default_bg(sp); +#endif + + if (reverse) { + int xx = fg; + fg = bg; + bg = xx; + } + + TR(TRACE_ATTRS, ("setting colors: pair = %d, fg = %d, bg = %d", pair, + fg, bg)); + + if (!isDefaultColor(fg)) { + drv_setcolor(TCB, TRUE, fg, outc); + } + if (!isDefaultColor(bg)) { + drv_setcolor(TCB, FALSE, bg, outc); + } +} + +#define xterm_kmous "\033[M" +static void +init_xterm_mouse(SCREEN *sp) +{ + sp->_mouse_type = M_XTERM; + sp->_mouse_xtermcap = NCURSES_SP_NAME(tigetstr) (NCURSES_SP_ARGx "XM"); + if (!VALID_STRING(sp->_mouse_xtermcap)) + sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;"; +} + +static void +drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); + + /* we know how to recognize mouse events under "xterm" */ + if (sp != 0) { + if (NonEmpty(key_mouse)) { + init_xterm_mouse(sp); + } else if (strstr(SP_TERMTYPE term_names, "xterm") != 0) { + if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK) + init_xterm_mouse(sp); + } + } +} + +static int +drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc = 0; + SCREEN *sp; + + AssertTCB(); + SetSP(); + +#if USE_SYSMOUSE + if ((sp->_mouse_type == M_SYSMOUSE) + && (sp->_sysmouse_head < sp->_sysmouse_tail)) { + rc = TW_MOUSE; + } else +#endif + { +#ifdef EXP_WIN32_DRIVER + rc = _nc_console_testmouse(sp, + _nc_console_handle(sp->_ifd), + delay + EVENTLIST_2nd(evl)); +#else + rc = TCBOf(sp)->drv->td_twait(TCBOf(sp), + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); +#endif +#if USE_SYSMOUSE + if ((sp->_mouse_type == M_SYSMOUSE) + && (sp->_sysmouse_head < sp->_sysmouse_tail) + && (rc == 0) + && (errno == EINTR)) { + rc |= TW_MOUSE; + } +#endif + } + return rc; +} + +static int +drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB, int yold, int xold, int ynew, int xnew) +{ + SCREEN *sp = TCB->csp; + AssertTCB(); + return NCURSES_SP_NAME(_nc_mvcur) (sp, yold, xold, ynew, xnew); +} + +static void +drv_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, int labnum, char *text) +{ + SCREEN *sp = TCB->csp; + + AssertTCB(); + if (labnum > 0 && labnum <= num_labels) { + NCURSES_PUTP2("plab_norm", + TPARM_2(plab_norm, labnum, text)); + } +} + +static void +drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, int OnFlag) +{ + SCREEN *sp = TCB->csp; + + AssertTCB(); + if (OnFlag) { + NCURSES_PUTP2("label_on", label_on); + } else { + NCURSES_PUTP2("label_off", label_off); + } +} + +static chtype +drv_conattr(TERMINAL_CONTROL_BLOCK * TCB) +{ + SCREEN *sp = TCB->csp; + chtype attrs = A_NORMAL; + + AssertTCB(); + if (enter_alt_charset_mode) + attrs |= A_ALTCHARSET; + + if (enter_blink_mode) + attrs |= A_BLINK; + + if (enter_bold_mode) + attrs |= A_BOLD; + + if (enter_dim_mode) + attrs |= A_DIM; + + if (enter_reverse_mode) + attrs |= A_REVERSE; + + if (enter_standout_mode) + attrs |= A_STANDOUT; + + if (enter_protected_mode) + attrs |= A_PROTECT; + + if (enter_secure_mode) + attrs |= A_INVIS; + + if (enter_underline_mode) + attrs |= A_UNDERLINE; + + if (sp && sp->_coloron) + attrs |= A_COLOR; + +#if USE_ITALIC + if (enter_italics_mode) + attrs |= A_ITALIC; +#endif + + return (attrs); +} + +static void +drv_setfilter(TERMINAL_CONTROL_BLOCK * TCB) +{ + AssertTCB(); + + /* *INDENT-EQLS* */ + clear_screen = ABSENT_STRING; + cursor_address = ABSENT_STRING; + cursor_down = ABSENT_STRING; + cursor_up = ABSENT_STRING; + parm_down_cursor = ABSENT_STRING; + parm_up_cursor = ABSENT_STRING; + row_address = ABSENT_STRING; + cursor_home = carriage_return; + + if (back_color_erase) + clr_eos = ABSENT_STRING; +} + +static void +drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map) +{ + SCREEN *sp = TCB->csp; + + AssertTCB(); + assert(sp != 0); + if (ena_acs != NULL) { + NCURSES_PUTP2("ena_acs", ena_acs); + } +#if NCURSES_EXT_FUNCS + /* + * Linux console "supports" the "PC ROM" character set by the coincidence + * that smpch/rmpch and smacs/rmacs have the same values. ncurses has + * no codepage support (see SCO Merge for an example). Outside of the + * values defined in acsc, there are no definitions for the "PC ROM" + * character set (assumed by some applications to be codepage 437), but we + * allow those applications to use those codepoints. + * + * test/blue.c uses this feature. + */ +#define PCH_KLUDGE(a,b) (a != 0 && b != 0 && !strcmp(a,b)) + if (PCH_KLUDGE(enter_pc_charset_mode, enter_alt_charset_mode) && + PCH_KLUDGE(exit_pc_charset_mode, exit_alt_charset_mode)) { + size_t i; + for (i = 1; i < ACS_LEN; ++i) { + if (real_map[i] == 0) { + real_map[i] = (chtype) i; + if (real_map != fake_map) { + if (sp != 0) + sp->_screen_acs_map[i] = TRUE; + } + } + } + } +#endif + + if (acs_chars != NULL) { + size_t i = 0; + size_t length = strlen(acs_chars); + + while (i + 1 < length) { + if (acs_chars[i] != 0 && UChar(acs_chars[i]) < ACS_LEN) { + real_map[UChar(acs_chars[i])] = UChar(acs_chars[i + 1]) | A_ALTCHARSET; + T(("#%d real_map[%s] = %s", + (int) i, + _tracechar(UChar(acs_chars[i])), + _tracechtype(real_map[UChar(acs_chars[i])]))); + if (sp != 0) { + sp->_screen_acs_map[UChar(acs_chars[i])] = TRUE; + } + } + i += 2; + } + } +#ifdef TRACE + /* Show the equivalent mapping, noting if it does not match the + * given attribute, whether by re-ordering or duplication. + */ + if (USE_TRACEF(TRACE_CALLS)) { + size_t n, m; + char show[ACS_LEN * 2 + 1]; + for (n = 1, m = 0; n < ACS_LEN; n++) { + if (real_map[n] != 0) { + show[m++] = (char) n; + show[m++] = (char) ChCharOf(real_map[n]); + } + } + show[m] = 0; + if (acs_chars == NULL || strcmp(acs_chars, show)) + _tracef("%s acs_chars %s", + (acs_chars == NULL) ? "NULL" : "READ", + _nc_visbuf(acs_chars)); + _tracef("%s acs_chars %s", + (acs_chars == NULL) + ? "NULL" + : (strcmp(acs_chars, show) + ? "DIFF" + : "SAME"), + _nc_visbuf(show)); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ +} + +#define ENSURE_TINFO(sp) (TCBOf(sp)->drv->isTerminfo) + +NCURSES_EXPORT(void) +_nc_cookie_init(SCREEN *sp) +{ + bool support_cookies = USE_XMC_SUPPORT; + TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) (sp->_term); + + if (sp == 0 || !ENSURE_TINFO(sp)) + return; + +#if USE_XMC_SUPPORT + /* + * If we have no magic-cookie support compiled-in, or if it is suppressed + * in the environment, reset the support-flag. + */ + if (magic_cookie_glitch >= 0) { + if (getenv("NCURSES_NO_MAGIC_COOKIE") != 0) { + support_cookies = FALSE; + } + } +#endif + + if (!support_cookies && magic_cookie_glitch >= 0) { + T(("will disable attributes to work w/o magic cookies")); + } + + if (magic_cookie_glitch > 0) { /* tvi, wyse */ + + sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT; +#if 0 + /* + * We "should" treat colors as an attribute. The wyse350 (and its + * clones) appear to be the only ones that have both colors and magic + * cookies. + */ + if (has_colors()) { + sp->_xmc_triggers |= A_COLOR; + } +#endif + sp->_xmc_suppress = sp->_xmc_triggers & (chtype) ~(A_BOLD); + + T(("magic cookie attributes %s", _traceattr(sp->_xmc_suppress))); + /* + * Supporting line-drawing may be possible. But make the regular + * video attributes work first. + */ + acs_chars = ABSENT_STRING; + ena_acs = ABSENT_STRING; + enter_alt_charset_mode = ABSENT_STRING; + exit_alt_charset_mode = ABSENT_STRING; +#if USE_XMC_SUPPORT + /* + * To keep the cookie support simple, suppress all of the optimization + * hooks except for clear_screen and the cursor addressing. + */ + if (support_cookies) { + clr_eol = ABSENT_STRING; + clr_eos = ABSENT_STRING; + set_attributes = ABSENT_STRING; + } +#endif + } else if (magic_cookie_glitch == 0) { /* hpterm */ + } + + /* + * If magic cookies are not supported, cancel the strings that set + * video attributes. + */ + if (!support_cookies && magic_cookie_glitch >= 0) { + magic_cookie_glitch = ABSENT_NUMERIC; + set_attributes = ABSENT_STRING; + enter_blink_mode = ABSENT_STRING; + enter_bold_mode = ABSENT_STRING; + enter_dim_mode = ABSENT_STRING; + enter_reverse_mode = ABSENT_STRING; + enter_standout_mode = ABSENT_STRING; + enter_underline_mode = ABSENT_STRING; + } + + /* initialize normal acs before wide, since we use mapping in the latter */ +#if !USE_WIDEC_SUPPORT + if (_nc_unicode_locale() && _nc_locale_breaks_acs(sp->_term)) { + acs_chars = NULL; + ena_acs = NULL; + enter_alt_charset_mode = NULL; + exit_alt_charset_mode = NULL; + set_attributes = NULL; + } +#endif +} + +static int +drv_twait(TERMINAL_CONTROL_BLOCK * TCB, + int mode, + int milliseconds, + int *timeleft + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +#ifdef EXP_WIN32_DRIVER + return _nc_console_twait(sp, + _nc_console_handle(sp->_ifd), + mode, + milliseconds, + timeleft EVENTLIST_2nd(evl)); +#else + return _nc_timed_wait(sp, mode, milliseconds, timeleft EVENTLIST_2nd(evl)); +#endif +} + +static int +drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) +{ + SCREEN *sp; + int n; +#ifndef EXP_WIN32_DRIVER + unsigned char c2 = 0; +#endif + + AssertTCB(); + assert(buf); + SetSP(); + + _nc_set_read_thread(TRUE); +#ifdef EXP_WIN32_DRIVER + n = _nc_console_read(sp, + _nc_console_handle(sp->_ifd), + buf); +#else + n = (int) read(sp->_ifd, &c2, (size_t) 1); +#endif + _nc_set_read_thread(FALSE); +#ifndef EXP_WIN32_DRIVER + *buf = (int) c2; +#endif + return n; +} + +static int +drv_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms) +{ +#if HAVE_NANOSLEEP + { + struct timespec request, remaining; + request.tv_sec = ms / 1000; + request.tv_nsec = (ms % 1000) * 1000000; + while (nanosleep(&request, &remaining) == -1 + && errno == EINTR) { + request = remaining; + } + } +#elif defined(EXP_WIN32_DRIVER) + Sleep((DWORD) ms); +#else + _nc_timed_wait(0, 0, ms, (int *) 0 EVENTLIST_2nd(0)); +#endif + return OK; +} + +static int +__nc_putp(SCREEN *sp, const char *name GCC_UNUSED, const char *value) +{ + int rc = ERR; + + if (value) { + rc = NCURSES_PUTP2(name, value); + } + return rc; +} + +static int +__nc_putp_flush(SCREEN *sp, const char *name, const char *value) +{ + int rc = __nc_putp(sp, name, value); + if (rc != ERR) { + NCURSES_SP_NAME(_nc_flush) (sp); + } + return rc; +} + +static int +drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag) +{ + int ret = ERR; + SCREEN *sp; + + AssertTCB(); + + sp = TCB->csp; + + if (sp) { + if (flag) { + (void) __nc_putp_flush(sp, "keypad_xmit", keypad_xmit); + } else if (!flag && keypad_local) { + (void) __nc_putp_flush(sp, "keypad_local", keypad_local); + } + if (flag && !sp->_tried) { + _nc_init_keytry(sp); + sp->_tried = TRUE; + } + ret = OK; + } + + return ret; +} + +static int +drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag) +{ + SCREEN *sp; + int code = ERR; + int count = 0; + char *s; + + AssertTCB(); + SetSP(); + + if (c >= 0) { + unsigned ch = (unsigned) c; + if (flag) { + while ((s = _nc_expand_try(sp->_key_ok, + ch, &count, (size_t) 0)) != 0) { + if (_nc_remove_key(&(sp->_key_ok), ch)) { + code = _nc_add_to_try(&(sp->_keytry), s, ch); + free(s); + count = 0; + if (code != OK) + break; + } else { + free(s); + } + } + } else { + while ((s = _nc_expand_try(sp->_keytry, + ch, &count, (size_t) 0)) != 0) { + if (_nc_remove_key(&(sp->_keytry), ch)) { + code = _nc_add_to_try(&(sp->_key_ok), s, ch); + free(s); + count = 0; + if (code != OK) + break; + } else { + free(s); + } + } + } + } + return (code); +} + +static int +drv_cursorSet(TERMINAL_CONTROL_BLOCK * TCB, int vis) +{ + SCREEN *sp; + int code = ERR; + + AssertTCB(); + SetSP(); + + T((T_CALLED("tinfo:drv_cursorSet(%p,%d)"), (void *) SP_PARM, vis)); + + if (SP_PARM != 0 && IsTermInfo(SP_PARM)) { + switch (vis) { + case 2: + code = NCURSES_PUTP2_FLUSH("cursor_visible", cursor_visible); + break; + case 1: + code = NCURSES_PUTP2_FLUSH("cursor_normal", cursor_normal); + break; + case 0: + code = NCURSES_PUTP2_FLUSH("cursor_invisible", cursor_invisible); + break; + } + } else { + code = ERR; + } + returnCode(code); +} + +static bool +drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int key) +{ + bool res = FALSE; + + AssertTCB(); + if (TCB->csp) + res = TINFO_HAS_KEY(TCB->csp, key) == 0 ? FALSE : TRUE; + + return res; +} + +NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_TINFO_DRIVER = { + TRUE, + drv_Name, /* Name */ + drv_CanHandle, /* CanHandle */ + drv_init, /* init */ + drv_release, /* release */ + drv_size, /* size */ + drv_sgmode, /* sgmode */ + drv_conattr, /* conattr */ + drv_mvcur, /* hwcur */ + drv_mode, /* mode */ + drv_rescol, /* rescol */ + drv_rescolors, /* rescolors */ + drv_setcolor, /* color */ + drv_dobeepflash, /* doBeepOrFlash */ + drv_initpair, /* initpair */ + drv_initcolor, /* initcolor */ + drv_do_color, /* docolor */ + drv_initmouse, /* initmouse */ + drv_testmouse, /* testmouse */ + drv_setfilter, /* setfilter */ + drv_hwlabel, /* hwlabel */ + drv_hwlabelOnOff, /* hwlabelOnOff */ + drv_doupdate, /* update */ + drv_defaultcolors, /* defaultcolors */ + drv_print, /* print */ + drv_getsize, /* getsize */ + drv_setsize, /* setsize */ + drv_initacs, /* initacs */ + drv_screen_init, /* scinit */ + drv_wrap, /* scexit */ + drv_twait, /* twait */ + drv_read, /* read */ + drv_nap, /* nap */ + drv_kpad, /* kpad */ + drv_keyok, /* kyOk */ + drv_kyExist, /* kyExist */ + drv_cursorSet /* cursorSet */ +}; + +#ifdef EXP_WIN32_DRIVER +/* + * The terminfo driver is mandatory and must always be present. + * So this is the natural place for the driver initialisation + * logic. + */ + +typedef struct DriverEntry { + const char *name; + TERM_DRIVER *driver; +} DRIVER_ENTRY; + +static DRIVER_ENTRY DriverTable[] = +{ +#ifdef USE_WIN32CON_DRIVER + {"win32console", &_nc_WIN_DRIVER}, +#endif + {"tinfo", &_nc_TINFO_DRIVER} /* must be last */ +}; + +NCURSES_EXPORT(int) +_nc_get_driver(TERMINAL_CONTROL_BLOCK * TCB, const char *name, int *errret) +{ + int code = ERR; + size_t i; + TERM_DRIVER *res = (TERM_DRIVER *) 0; + TERM_DRIVER *use = 0; + + T((T_CALLED("_nc_get_driver(%p, %s, %p)"), + (void *) TCB, NonNull(name), (void *) errret)); + + assert(TCB != 0); + + for (i = 0; i < SIZEOF(DriverTable); i++) { + res = DriverTable[i].driver; +#ifdef _NC_WINDOWS + if ((i + 1) == SIZEOF(DriverTable)) { + /* For Windows >= 10.0.17763 Windows Console interface implements + virtual Terminal functionality. + If on Windows td_CanHandle returned FALSE although the terminal + name is empty, we default to ms-terminal as tinfo TERM type. + */ + if (name == 0 || *name == 0 || (strcmp(name, "unknown") == 0)) { + name = MS_TERMINAL; + T(("Set TERM=%s", name)); + } + } +#endif + if (strcmp(DriverTable[i].name, res->td_name(TCB)) == 0) { + if (res->td_CanHandle(TCB, name, errret)) { + use = res; + break; + } + } + } + if (use != 0) { + TCB->drv = use; + code = OK; + } + returnCode(code); +} +#endif /* EXP_WIN32_DRIVER */ diff --git a/contrib/ncurses/ncurses/tinfo/trim_sgr0.c b/contrib/ncurses/ncurses/tinfo/trim_sgr0.c new file mode 100644 index 00000000..1c557090 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/trim_sgr0.c @@ -0,0 +1,335 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 2005-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey * + ****************************************************************************/ + +#include + +#include + +#include + +MODULE_ID("$Id: trim_sgr0.c,v 1.25 2024/10/19 21:18:18 tom Exp $") + +#undef CUR +#define CUR tp-> + +static char * +set_attribute_9(const TERMTYPE2 *tp, int flag) +{ + const char *value; + char *result; + + value = TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag); + if (PRESENT(value)) + result = strdup(value); + else + result = 0; + return result; +} + +static int +is_csi(const char *s) +{ + int result = 0; + if (s != 0) { + if (UChar(s[0]) == CSI_CHR) + result = 1; + else if (s[0] == ESC_CHR && s[1] == L_BLOCK) + result = 2; + } + return result; +} + +static char * +skip_zero(char *s) +{ + if (s[0] == '0') { + if (s[1] == ';') + s += 2; + else if (isalpha(UChar(s[1]))) + s += 1; + } + return s; +} + +static const char * +skip_delay(const char *s) +{ + if (s[0] == '$' && s[1] == '<') { + s += 2; + while (isdigit(UChar(*s)) || *s == '/') + ++s; + if (*s == '>') + ++s; + } + return s; +} + +/* + * Improve similar_sgr a little by moving the attr-string from the beginning + * to the end of the s-string. + */ +static bool +rewrite_sgr(char *s, const char *attr) +{ + if (s != 0) { + if (PRESENT(attr)) { + size_t len_s = strlen(s); + size_t len_a = strlen(attr); + + if (len_s > len_a && !strncmp(attr, s, len_a)) { + unsigned n; + TR(TRACE_DATABASE, ("rewrite:\n\t%s", s)); + for (n = 0; n < len_s - len_a; ++n) { + s[n] = s[n + len_a]; + } + _nc_STRCPY(s + n, attr, strlen(s) + 1); + TR(TRACE_DATABASE, ("to:\n\t%s", s)); + } + } + return TRUE; + } + return FALSE; /* oops */ +} + +static bool +similar_sgr(char *a, char *b) +{ + bool result = FALSE; + if (a != 0 && b != 0) { + int csi_a = is_csi(a); + int csi_b = is_csi(b); + size_t len_a; + size_t len_b; + + TR(TRACE_DATABASE, ("similar_sgr:\n\t%s\n\t%s", + _nc_visbuf2(1, a), + _nc_visbuf2(2, b))); + if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) { + a += csi_a; + b += csi_b; + if (*a != *b) { + a = skip_zero(a); + b = skip_zero(b); + } + } + len_a = strlen(a); + len_b = strlen(b); + if (len_a && len_b) { + if (len_a > len_b) + result = (strncmp(a, b, len_b) == 0); + else + result = (strncmp(a, b, len_a) == 0); + } + TR(TRACE_DATABASE, ("...similar_sgr: %d\n\t%s\n\t%s", result, + _nc_visbuf2(1, a), + _nc_visbuf2(2, b))); + } + return result; +} + +static unsigned +chop_out(char *string, unsigned i, unsigned j) +{ + TR(TRACE_DATABASE, ("chop_out %d..%d from %s", i, j, _nc_visbuf(string))); + while (string[j] != '\0') { + string[i++] = string[j++]; + } + string[i] = '\0'; + return i; +} + +/* + * Compare, ignoring delays. Some of the delay values are inconsistent, and + * we do not want to be stopped by that. + * + * Returns the number of chars from 'full' that we matched. If any mismatch + * occurs, return zero. + */ +static unsigned +compare_part(const char *part, const char *full) +{ + const char *next_part; + const char *next_full; + unsigned used_full = 0; + unsigned used_delay = 0; + + while (*part != 0) { + if (*part != *full) { + used_full = 0; + break; + } + + /* + * Adjust the return-value to allow the rare case of + * stringstring + * to remove the whole piece. The most common case is a delay at the + * end of the string. The adjusted string will retain the delay, which + * is conservative. + */ + if (used_delay != 0) { + used_full += used_delay; + used_delay = 0; + } + if (*part == '$' && *full == '$') { + next_part = skip_delay(part); + next_full = skip_delay(full); + if (next_part != part && next_full != full) { + used_delay += (unsigned) (next_full - full); + full = next_full; + part = next_part; + continue; + } + } + ++used_full; + ++part; + ++full; + } + return used_full; +} + +/* + * While 'sgr0' is the "same" as termcap 'me', there is a compatibility issue. + * The sgr/sgr0 capabilities include setting/clearing alternate character set + * mode. A termcap application cannot use sgr, so sgr0 strings that reset + * alternate character set mode will be misinterpreted. Here, we remove those + * from the more common ISO/ANSI/VT100 entries, which have sgr0 agreeing with + * sgr. + * + * This function returns the modified sgr0 if it can be modified, a null if + * an error occurs, or the original sgr0 if no change is needed. + */ +NCURSES_EXPORT(char *) +_nc_trim_sgr0(TERMTYPE2 *tp) +{ + char *result = exit_attribute_mode; + + T((T_CALLED("_nc_trim_sgr0()"))); + + if (PRESENT(exit_attribute_mode) + && PRESENT(set_attributes)) { + char *on = set_attribute_9(tp, 1); + char *off = set_attribute_9(tp, 0); + char *end = strdup(exit_attribute_mode); + char *tmp; + + TR(TRACE_DATABASE, ("checking if we can trim sgr0 based on sgr")); + TR(TRACE_DATABASE, ("sgr0 %s", _nc_visbuf(end))); + TR(TRACE_DATABASE, ("sgr(9:off) %s", _nc_visbuf(off))); + TR(TRACE_DATABASE, ("sgr(9:on) %s", _nc_visbuf(on))); + + if (!rewrite_sgr(on, enter_alt_charset_mode) + || !rewrite_sgr(off, exit_alt_charset_mode) + || !rewrite_sgr(end, exit_alt_charset_mode)) { + FreeIfNeeded(off); + } else if (similar_sgr(off, end) + && !similar_sgr(off, on)) { + bool found = FALSE; + size_t i, j; + + TR(TRACE_DATABASE, ("adjusting sgr(9:off) : %s", _nc_visbuf(off))); + result = off; + /* + * If rmacs is a substring of sgr(0), remove that chunk. + */ + if (PRESENT(exit_alt_charset_mode)) { + size_t k; + + TR(TRACE_DATABASE, ("scan for rmacs %s", _nc_visbuf(exit_alt_charset_mode))); + j = strlen(off); + k = strlen(exit_alt_charset_mode); + if (j > k) { + for (i = 0; i <= (j - k); ++i) { + unsigned k2 = compare_part(exit_alt_charset_mode, + off + i); + if (k2 != 0) { + found = TRUE; + chop_out(off, (unsigned) i, (unsigned) (i + k2)); + break; + } + } + } + } + /* + * SGR 10 would reset to normal font. + */ + if (!found) { + if ((i = (size_t) is_csi(off)) != 0 + && off[strlen(off) - 1] == 'm') { + TR(TRACE_DATABASE, ("looking for SGR 10 in %s", + _nc_visbuf(off))); + tmp = skip_zero(off + i); + if (tmp[0] == '1' + && skip_zero(tmp + 1) != tmp + 1) { + i = (size_t) (tmp - off); + if (off[i - 1] == ';') + i--; + j = (size_t) (skip_zero(tmp + 1) - off); + (void) chop_out(off, (unsigned) i, (unsigned) j); + found = TRUE; + } + } + } + if (!found + && (tmp = strstr(end, off)) != 0 + && strcmp(end, off) != 0) { + i = (size_t) (tmp - end); + j = strlen(off); + tmp = strdup(end); + chop_out(tmp, (unsigned) i, (unsigned) j); + free(off); + result = tmp; + } + TR(TRACE_DATABASE, ("...adjusted sgr0 : %s", _nc_visbuf(result))); + if (!strcmp(result, exit_attribute_mode)) { + TR(TRACE_DATABASE, ("...same result, discard")); + free(result); + result = exit_attribute_mode; + } + } else { + /* + * Either the sgr does not reference alternate character set, + * or it is incorrect. That's too hard to decide right now. + */ + free(off); + } + FreeIfNeeded(end); + FreeIfNeeded(on); + } else { + /* + * Possibly some applications are confused if sgr0 contains rmacs, + * but that would be a different bug report -TD + */ + } + + returnPtr(result); +} diff --git a/contrib/ncurses/ncurses/tinfo/use_screen.c b/contrib/ncurses/ncurses/tinfo/use_screen.c new file mode 100644 index 00000000..a4bf9327 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/use_screen.c @@ -0,0 +1,63 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2007-2009,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2007 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: use_screen.c,v 1.12 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +use_screen(SCREEN *screen, NCURSES_SCREEN_CB func, void *data) +{ + SCREEN *save_SP; + int code = OK; + TR_FUNC_BFR(1); + + T((T_CALLED("use_screen(%p,%s,%p)"), + (void *) screen, + TR_FUNC_ARG(0, func), + (void *) data)); + + /* + * FIXME - add a flag so a given thread can check if _it_ has already + * recurred through this point, return an error if so. + */ + _nc_lock_global(curses); + save_SP = CURRENT_SCREEN; + set_term(screen); + + code = func(screen, data); + + set_term(save_SP); + _nc_unlock_global(curses); + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/tinfo/write_entry.c b/contrib/ncurses/ncurses/tinfo/write_entry.c new file mode 100644 index 00000000..4903ece9 --- /dev/null +++ b/contrib/ncurses/ncurses/tinfo/write_entry.c @@ -0,0 +1,967 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * write_entry.c -- write a terminfo structure onto the file system + */ + +#include +#include + +#include + +MODULE_ID("$Id: write_entry.c,v 1.136 2024/10/19 21:19:32 tom Exp $") + +#if 1 +#define TRACE_OUT(p) DEBUG(2, p) +#define TRACE_NUM(n) if (VALID_NUMERIC(Numbers[n])) { \ + TRACE_OUT(("put Numbers[%u]=%d", (unsigned) (n), Numbers[n])); } +#else +#define TRACE_OUT(p) /*nothing */ +#define TRACE_NUM(n) /* nothing */ +#endif + +/* + * FIXME: special case to work around Cygwin bug in link(), which updates + * the target file's timestamp. + */ +#if HAVE_LINK && !USE_SYMLINKS && !MIXEDCASE_FILENAMES && defined(__CYGWIN__) +#define LINK_TOUCHES 1 +#else +#define LINK_TOUCHES 0 +#endif + +static int total_written; +static int total_parts; +static int total_size; + +static int make_db_root(const char *); + +#if !USE_HASHED_DB +static void +write_file(char *filename, TERMTYPE2 *tp) +{ + char buffer[MAX_ENTRY_SIZE]; + unsigned limit = sizeof(buffer); + unsigned offset = 0; + + if (_nc_write_object(tp, buffer, &offset, limit) == ERR) { + _nc_warning("entry is larger than %u bytes", limit); + } else { + FILE *fp = ((_nc_access(filename, W_OK) == 0) + ? safe_fopen(filename, BIN_W) + : 0); + size_t actual; + + if (fp == 0) { + perror(filename); + _nc_syserr_abort("cannot open %s/%s", _nc_tic_dir(0), filename); + } + + actual = fwrite(buffer, sizeof(char), (size_t) offset, fp); + if (actual != offset) { + int myerr = ferror(fp) ? errno : 0; + if (myerr) { + _nc_syserr_abort("error writing %s/%s: %s", + _nc_tic_dir(NULL), + filename, + strerror(myerr)); + } else { + _nc_syserr_abort("error writing %s/%s: %u bytes vs actual %lu", + _nc_tic_dir(NULL), + filename, + offset, + (unsigned long) actual); + } + } else { + fclose(fp); + DEBUG(1, ("Created %s", filename)); + } + } +} + +/* + * Check for access rights to destination directories + * Create any directories which don't exist. + * + * Note: there's no reason to return the result of make_db_root(), since + * this function is called only in instances where that has to succeed. + */ +static void +check_writeable(int code) +{ + static const char dirnames[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + static bool verified[sizeof(dirnames)]; + + const char *s = 0; + + if (code == 0 || (s = (strchr) (dirnames, code)) == 0) { + _nc_err_abort("Illegal terminfo subdirectory \"" LEAF_FMT "\"", code); + } else if (!verified[s - dirnames]) { + char dir[sizeof(LEAF_FMT)]; + _nc_SPRINTF(dir, _nc_SLIMIT(sizeof(dir)) LEAF_FMT, code); + if (make_db_root(dir) < 0) { + _nc_err_abort("%s/%s: permission denied", _nc_tic_dir(NULL), dir); + } else { + verified[s - dirnames] = TRUE; + } + } +} +#endif /* !USE_HASHED_DB */ + +static int +make_db_path(char *dst, const char *src, size_t limit) +{ + int rc = -1; + const char *top = _nc_tic_dir(NULL); + + if (src == top || _nc_is_abs_path(src)) { + if (strlen(src) + 1 <= limit) { + _nc_STRCPY(dst, src, limit); + rc = 0; + } + } else { + size_t len_top = strlen(top); + size_t len_src = strlen(src); + if ((len_top + len_src + 6) <= limit) { + _nc_SPRINTF(dst, _nc_SLIMIT(limit) "%.*s/%.*s", + (int) len_top, top, + (int) len_src, src); + rc = 0; + } + } +#if USE_HASHED_DB + if (rc == 0) { + static const char suffix[] = DBM_SUFFIX; + size_t have = strlen(dst); + size_t need = strlen(suffix); + if (have > need && strcmp(dst + (int) (have - need), suffix)) { + if (have + need <= limit) { + _nc_STRCAT(dst, suffix, limit); + } else { + rc = -1; + } + } else if (_nc_is_dir_path(dst)) { + rc = -1; + } + } +#endif + return rc; +} + +/* + * Make a database-root if it doesn't exist. + */ +static int +make_db_root(const char *path) +{ + int rc; + char fullpath[PATH_MAX]; + + if ((rc = make_db_path(fullpath, path, sizeof(fullpath))) == 0) { +#if USE_HASHED_DB + DB *capdbp; + + if ((capdbp = _nc_db_open(fullpath, TRUE)) == NULL) { + rc = -1; + } else if (_nc_db_close(capdbp) < 0) { + rc = -1; + } +#else + struct stat statbuf; + + if ((rc = stat(path, &statbuf)) == -1) { + rc = mkdir(path +#ifndef _NC_WINDOWS_NATIVE + ,0777 +#endif + ); + } else if (_nc_access(path, R_OK | W_OK | X_OK) < 0) { + rc = -1; /* permission denied */ + } else if (!(S_ISDIR(statbuf.st_mode))) { + rc = -1; /* not a directory */ + } +#endif + } + return rc; +} + +/* + * Set the write directory for compiled entries. + */ +NCURSES_EXPORT(void) +_nc_set_writedir(const char *dir) +{ + const char *destination; + char actual[PATH_MAX]; + bool specific = (dir != NULL); + + if (!specific && use_terminfo_vars()) + dir = getenv("TERMINFO"); + + if (dir != NULL) + (void) _nc_tic_dir(dir); + + destination = _nc_tic_dir(NULL); + if (make_db_root(destination) < 0) { + bool success = FALSE; + + if (!specific) { + char *home = _nc_home_terminfo(); + + if (home != NULL) { + destination = home; + if (make_db_root(destination) == 0) + success = TRUE; + } + } + if (!success) { + _nc_err_abort("%s: permission denied (errno %d)", + destination, errno); + } + } + + /* + * Note: because of this code, this logic should be exercised + * *once only* per run. + */ +#if USE_HASHED_DB + make_db_path(actual, destination, sizeof(actual)); +#else + if (chdir(_nc_tic_dir(destination)) < 0 + || getcwd(actual, sizeof(actual)) == NULL) + _nc_err_abort("%s: not a directory", destination); +#endif + _nc_keep_tic_dir(actual); +} + +/* + * Save the compiled version of a description in the filesystem. + * + * make a copy of the name-list + * break it up into first-name and all-but-last-name + * creat(first-name) + * write object information to first-name + * close(first-name) + * for each name in all-but-last-name + * link to first-name + * + * Using 'time()' to obtain a reference for file timestamps is unreliable, + * e.g., with NFS, because the filesystem may have a different time + * reference. We check for pre-existence of links by latching the first + * timestamp from a file that we create. + * + * The _nc_warning() calls will report a correct line number only if + * _nc_curr_line is properly set before the write_entry() call. + */ + +NCURSES_EXPORT(void) +_nc_write_entry(TERMTYPE2 *const tp) +{ +#if USE_HASHED_DB + + char buffer[MAX_ENTRY_SIZE + 1]; + unsigned limit = sizeof(buffer); + unsigned offset = 0; + +#else /* !USE_HASHED_DB */ + + struct stat statbuf; + char filename[PATH_MAX]; + char linkname[PATH_MAX]; +#if USE_SYMLINKS + char symlinkname[PATH_MAX]; +#if !HAVE_LINK +#undef HAVE_LINK +#define HAVE_LINK 1 +#endif +#endif /* USE_SYMLINKS */ + + unsigned limit2 = sizeof(filename) - (2 + LEAF_LEN); + char saved = '\0'; + + static int call_count; + static time_t start_time; /* time at start of writes */ + +#endif /* USE_HASHED_DB */ + + char name_list[MAX_TERMINFO_LENGTH]; + char *first_name, *other_names; + char *ptr; + char *term_names = tp->term_names; + size_t name_size = strlen(term_names); + + if (name_size == 0) { + _nc_syserr_abort("no terminal name found."); + } else if (name_size >= sizeof(name_list) - 1) { + _nc_syserr_abort("terminal name too long: %s", term_names); + } + + _nc_STRCPY(name_list, term_names, sizeof(name_list)); + DEBUG(7, ("Name list = '%s'", name_list)); + + first_name = name_list; + + ptr = &name_list[name_size - 1]; + other_names = ptr + 1; + + while (ptr > name_list && *ptr != '|') + ptr--; + + if (ptr != name_list) { + *ptr = '\0'; + + for (ptr = name_list; *ptr != '\0' && *ptr != '|'; ptr++) { + /* EMPTY */ ; + } + + if (*ptr == '\0') + other_names = ptr; + else { + *ptr = '\0'; + other_names = ptr + 1; + } + } + + DEBUG(7, ("First name = '%s'", first_name)); + DEBUG(7, ("Other names = '%s'", other_names)); + + _nc_set_type(first_name); + +#if USE_HASHED_DB + if (_nc_write_object(tp, buffer + 1, &offset, limit - 1) != ERR) { + DB *capdb = _nc_db_open(_nc_tic_dir(NULL), TRUE); + DBT key, data; + + if (capdb != NULL) { + buffer[0] = 0; + + memset(&key, 0, sizeof(key)); + key.data = term_names; + key.size = name_size; + + memset(&data, 0, sizeof(data)); + data.data = buffer; + data.size = offset + 1; + + _nc_db_put(capdb, &key, &data); + + buffer[0] = 2; + + key.data = name_list; + key.size = strlen(name_list); + + _nc_STRCPY(buffer + 1, + term_names, + sizeof(buffer) - 1); + data.size = name_size + 1; + + total_size += (int) data.size; + total_parts++; + _nc_db_put(capdb, &key, &data); + + while (*other_names != '\0') { + ptr = other_names++; + assert(ptr < buffer + sizeof(buffer) - 1); + while (*other_names != '|' && *other_names != '\0') + other_names++; + + if (*other_names != '\0') + *(other_names++) = '\0'; + + key.data = ptr; + key.size = strlen(ptr); + + total_size += (int) data.size; + total_parts++; + _nc_db_put(capdb, &key, &data); + } + } + } +#else /* !USE_HASHED_DB */ + if (call_count++ == 0) { + start_time = 0; + } + + if (strlen(first_name) >= limit2) { + _nc_warning("terminal name too long."); + saved = first_name[limit2]; + first_name[limit2] = '\0'; + } + + _nc_SPRINTF(filename, _nc_SLIMIT(sizeof(filename)) + LEAF_FMT "/%.*s", UChar(first_name[0]), + (int) (sizeof(filename) - (LEAF_LEN + 2)), + first_name); + + if (saved) + first_name[limit2] = saved; + + /* + * Has this primary name been written since the first call to + * write_entry()? If so, the newer write will step on the older, + * so warn the user. + */ + if (start_time > 0 && + stat(filename, &statbuf) >= 0 + && statbuf.st_mtime >= start_time) { +#if HAVE_LINK && !USE_SYMLINKS + /* + * If the file has more than one link, the reason for the previous + * write could be that the current primary name used to be an alias for + * the previous entry. In that case, unlink the file so that we will + * not modify the previous entry as we write this one. + */ + if (statbuf.st_nlink > 1) { + _nc_warning("name redefined."); + unlink(filename); + } else { + _nc_warning("name multiply defined."); + } +#else + _nc_warning("name multiply defined."); +#endif + } + + check_writeable(first_name[0]); + write_file(filename, tp); + + if (start_time == 0) { + if (stat(filename, &statbuf) == -1 + || (start_time = statbuf.st_mtime) == 0) { + _nc_syserr_abort("error obtaining time from %s/%s", + _nc_tic_dir(NULL), filename); + } + } + while (*other_names != '\0') { + ptr = other_names++; + while (*other_names != '|' && *other_names != '\0') + other_names++; + + if (*other_names != '\0') + *(other_names++) = '\0'; + + if (strlen(ptr) > sizeof(linkname) - (2 + LEAF_LEN)) { + _nc_warning("terminal alias %s too long.", ptr); + continue; + } + if (strchr(ptr, '/') != NULL) { + _nc_warning("cannot link alias %s.", ptr); + continue; + } + + check_writeable(ptr[0]); + _nc_SPRINTF(linkname, _nc_SLIMIT(sizeof(linkname)) + LEAF_FMT "/%.*s", ptr[0], + (int) sizeof(linkname) - (2 + LEAF_LEN), ptr); + + if (strcmp(filename, linkname) == 0) { + _nc_warning("self-synonym ignored"); + } +#if !LINK_TOUCHES + else if (stat(linkname, &statbuf) >= 0 && + statbuf.st_mtime < start_time) { + _nc_warning("alias %s multiply defined.", ptr); + } +#endif + else if (_nc_access(linkname, W_OK) == 0) +#if HAVE_LINK + { + int code; +#if USE_SYMLINKS +#define MY_SIZE sizeof(symlinkname) - 1 + if (first_name[0] == linkname[0]) { + _nc_STRNCPY(symlinkname, first_name, MY_SIZE); + } else { + _nc_STRCPY(symlinkname, "../", sizeof(symlinkname)); + _nc_STRNCPY(symlinkname + 3, filename, MY_SIZE - 3); + } + symlinkname[MY_SIZE] = '\0'; +#endif /* USE_SYMLINKS */ +#if HAVE_REMOVE + code = remove(linkname); +#else + code = unlink(linkname); +#endif + if (code != 0 && errno == ENOENT) + code = 0; +#if USE_SYMLINKS + if (symlink(symlinkname, linkname) < 0) +#else + if (link(filename, linkname) < 0) +#endif /* USE_SYMLINKS */ + { + /* + * If there wasn't anything there, and we cannot + * link to the target because it is the same as the + * target, then the source must be on a filesystem + * that uses caseless filenames, such as Win32, etc. + */ + if (code == 0 && errno == EEXIST) + _nc_warning("can't link %s to %s", filename, linkname); + else if (code == 0 && (errno == EPERM || errno == ENOENT)) + write_file(linkname, tp); + else { +#if MIXEDCASE_FILENAMES + _nc_syserr_abort("cannot link %s to %s", filename, linkname); +#else + _nc_warning("cannot link %s to %s (errno=%d)", filename, + linkname, errno); +#endif + } + } else { + DEBUG(1, ("Linked %s", linkname)); + } + } +#else /* just make copies */ + write_file(linkname, tp); +#endif /* HAVE_LINK */ + } +#endif /* USE_HASHED_DB */ +} + +static size_t +fake_write(char *dst, + unsigned *offset, + size_t limit, + const char *src, + size_t want, + size_t size) +{ + size_t have = (limit - *offset); + + want *= size; + if (have > 0) { + if (want > have) + want = have; + memcpy(dst + *offset, src, want); + *offset += (unsigned) want; + } else { + want = 0; + } + return (want / size); +} + +#define Write(buf, size, count) fake_write(buffer, offset, (size_t) limit, (char *) buf, (size_t) count, (size_t) size) + +#undef LITTLE_ENDIAN /* BSD/OS defines this as a feature macro */ +#define HI(x) ((x) / 256) +#define LO(x) ((x) % 256) +#define LITTLE_ENDIAN(p, x) (p)[0] = (unsigned char)LO(x), \ + (p)[1] = (unsigned char)HI(x) + +#define WRITE_STRING(str) (Write(str, sizeof(char), strlen(str) + 1) == strlen(str) + 1) + +static int +compute_offsets(char **Strings, size_t strmax, short *offsets) +{ + int nextfree = 0; + size_t i; + + for (i = 0; i < strmax; i++) { + if (Strings[i] == ABSENT_STRING) { + offsets[i] = -1; + } else if (Strings[i] == CANCELLED_STRING) { + offsets[i] = -2; + } else { + offsets[i] = (short) nextfree; + nextfree += (int) strlen(Strings[i]) + 1; + TRACE_OUT(("put Strings[%d]=%s(%d)", (int) i, + _nc_visbuf(Strings[i]), (int) nextfree)); + } + } + return nextfree; +} + +static size_t +convert_shorts(unsigned char *buf, short *Numbers, size_t count) +{ + size_t i; + for (i = 0; i < count; i++) { + if (Numbers[i] == ABSENT_NUMERIC) { /* HI/LO won't work */ + buf[2 * i] = buf[2 * i + 1] = 0377; + } else if (Numbers[i] == CANCELLED_NUMERIC) { /* HI/LO won't work */ + buf[2 * i] = 0376; + buf[2 * i + 1] = 0377; + } else { + LITTLE_ENDIAN(buf + 2 * i, Numbers[i]); + TRACE_OUT(("put Numbers[%u]=%d", (unsigned) i, Numbers[i])); + } + } + return SIZEOF_SHORT; +} + +#if NCURSES_EXT_NUMBERS +static size_t +convert_16bit(unsigned char *buf, NCURSES_INT2 *Numbers, size_t count) +{ + size_t i, j; + size_t size = SIZEOF_SHORT; + for (i = 0; i < count; i++) { + unsigned value = (unsigned) Numbers[i]; + TRACE_NUM(i); + for (j = 0; j < size; ++j) { + *buf++ = value & 0xff; + value >>= 8; + } + } + return size; +} + +static size_t +convert_32bit(unsigned char *buf, NCURSES_INT2 *Numbers, size_t count) +{ + size_t i, j; + size_t size = SIZEOF_INT2; + for (i = 0; i < count; i++) { + unsigned value = (unsigned) Numbers[i]; + TRACE_NUM(i); + for (j = 0; j < size; ++j) { + *buf++ = value & 0xff; + value >>= 8; + } + } + return size; +} +#endif + +#define even_boundary(value) \ + ((value) % 2 != 0 && Write(&zero, sizeof(char), 1) != 1) + +#if NCURSES_XNAMES +static unsigned +extended_Booleans(const TERMTYPE2 *tp) +{ + unsigned result = 0; + unsigned i; + + for (i = 0; i < tp->ext_Booleans; ++i) { + if (tp->Booleans[BOOLCOUNT + i] == TRUE) + result = (i + 1); + } + return result; +} + +static unsigned +extended_Numbers(const TERMTYPE2 *tp) +{ + unsigned result = 0; + unsigned i; + + for (i = 0; i < tp->ext_Numbers; ++i) { + if (tp->Numbers[NUMCOUNT + i] != ABSENT_NUMERIC) + result = (i + 1); + } + return result; +} + +static unsigned +extended_Strings(const TERMTYPE2 *tp) +{ + unsigned short result = 0; + unsigned short i; + + for (i = 0; i < tp->ext_Strings; ++i) { + if (tp->Strings[STRCOUNT + i] != ABSENT_STRING) + result = (unsigned short) (i + 1); + } + return result; +} + +/* + * _nc_align_termtype() will extend entries that are referenced in a use= + * clause - discard the unneeded data. + */ +static bool +extended_object(const TERMTYPE2 *tp) +{ + bool result = FALSE; + + if (_nc_user_definable) { + result = ((extended_Booleans(tp) + + extended_Numbers(tp) + + extended_Strings(tp)) != 0); + } + return result; +} +#endif + +NCURSES_EXPORT(int) +_nc_write_object(TERMTYPE2 *tp, char *buffer, unsigned *offset, unsigned limit) +{ + char *namelist; + size_t namelen, boolmax, nummax, strmax, numlen; + char zero = '\0'; + size_t i; + int nextfree; + short offsets[MAX_ENTRY_SIZE / 2]; + unsigned char buf[MAX_ENTRY_SIZE]; + unsigned last_bool = BOOLWRITE; + unsigned last_num = NUMWRITE; + unsigned last_str = STRWRITE; +#if NCURSES_EXT_NUMBERS + bool need_ints = FALSE; + size_t (*convert_numbers) (unsigned char *, NCURSES_INT2 *, size_t); +#else +#define convert_numbers convert_shorts +#endif + +#if NCURSES_XNAMES + /* + * Normally we limit the list of values to exclude the "obsolete" + * capabilities. However, if we are accepting extended names, add + * these as well, since they are used for supporting translation + * to/from termcap. + */ + if (_nc_user_definable) { + last_bool = BOOLCOUNT; + last_num = NUMCOUNT; + last_str = STRCOUNT; + } +#endif + + namelist = tp->term_names; + namelen = strlen(namelist) + 1; + + boolmax = 0; + for (i = 0; i < last_bool; i++) { + if (tp->Booleans[i] == TRUE) { + boolmax = i + 1; + } + } + + nummax = 0; + for (i = 0; i < last_num; i++) { + if (tp->Numbers[i] != ABSENT_NUMERIC) { + nummax = i + 1; +#if NCURSES_EXT_NUMBERS + if (tp->Numbers[i] > MAX_OF_TYPE(NCURSES_COLOR_T)) { + need_ints = TRUE; + } +#endif + } + } + + strmax = 0; + for (i = 0; i < last_str; i++) { + if (tp->Strings[i] != ABSENT_STRING) + strmax = i + 1; + } + + nextfree = compute_offsets(tp->Strings, strmax, offsets); + + /* fill in the header */ +#if NCURSES_EXT_NUMBERS + if (need_ints) { + convert_numbers = convert_32bit; + LITTLE_ENDIAN(buf, MAGIC2); + } else { + convert_numbers = convert_16bit; + LITTLE_ENDIAN(buf, MAGIC); + } +#else + LITTLE_ENDIAN(buf, MAGIC); +#endif + namelen = Min(namelen, MAX_NAME_SIZE + 1); + LITTLE_ENDIAN(buf + 2, namelen); + LITTLE_ENDIAN(buf + 4, boolmax); + LITTLE_ENDIAN(buf + 6, nummax); + LITTLE_ENDIAN(buf + 8, strmax); + LITTLE_ENDIAN(buf + 10, nextfree); + + /* write out the header */ + TRACE_OUT(("Header of %s @%d", namelist, *offset)); + if (Write(buf, 12, 1) != 1 + || Write(namelist, sizeof(char), namelen) != namelen) { + return (ERR); + } + + for (i = 0; i < boolmax; i++) { + if (tp->Booleans[i] == TRUE) { + buf[i] = TRUE; + } else { + buf[i] = FALSE; + } + } + if (Write(buf, sizeof(char), boolmax) != boolmax) { + return (ERR); + } + + if (even_boundary(namelen + boolmax)) { + return (ERR); + } + + TRACE_OUT(("Numerics begin at %04x", *offset)); + + /* the numerics */ + numlen = convert_numbers(buf, tp->Numbers, nummax); + if (Write(buf, numlen, nummax) != nummax) { + return (ERR); + } + + TRACE_OUT(("String offsets begin at %04x", *offset)); + + /* the string offsets */ + convert_shorts(buf, offsets, strmax); + if (Write(buf, SIZEOF_SHORT, strmax) != strmax) { + return (ERR); + } + + TRACE_OUT(("String table begins at %04x", *offset)); + + /* the strings */ + for (i = 0; i < strmax; i++) { + if (VALID_STRING(tp->Strings[i])) { + if (!WRITE_STRING(tp->Strings[i])) { + return (ERR); + } + } + } + +#if NCURSES_XNAMES + if (extended_object(tp)) { + unsigned ext_total = (unsigned) NUM_EXT_NAMES(tp); + unsigned ext_usage = ext_total; + + if (even_boundary(nextfree)) { + return (ERR); + } + + nextfree = compute_offsets(tp->Strings + STRCOUNT, + (size_t) tp->ext_Strings, + offsets); + TRACE_OUT(("after extended string capabilities, nextfree=%d", nextfree)); + + if (tp->ext_Strings >= SIZEOF(offsets)) { + return (ERR); + } + + nextfree += compute_offsets(tp->ext_Names, + (size_t) ext_total, + offsets + tp->ext_Strings); + TRACE_OUT(("after extended capnames, nextfree=%d", nextfree)); + strmax = tp->ext_Strings + ext_total; + for (i = 0; i < tp->ext_Strings; ++i) { + if (VALID_STRING(tp->Strings[i + STRCOUNT])) { + ext_usage++; + } + } + TRACE_OUT(("will write %u/%lu strings", ext_usage, (unsigned long) strmax)); + + /* + * Write the extended header + */ + LITTLE_ENDIAN(buf + 0, tp->ext_Booleans); + LITTLE_ENDIAN(buf + 2, tp->ext_Numbers); + LITTLE_ENDIAN(buf + 4, tp->ext_Strings); + LITTLE_ENDIAN(buf + 6, ext_usage); + LITTLE_ENDIAN(buf + 8, nextfree); + TRACE_OUT(("WRITE extended-header @%d", *offset)); + if (Write(buf, 10, 1) != 1) { + return (ERR); + } + + TRACE_OUT(("WRITE %d booleans @%d", tp->ext_Booleans, *offset)); + if (tp->ext_Booleans + && Write(tp->Booleans + BOOLCOUNT, sizeof(char), + tp->ext_Booleans) != tp->ext_Booleans) { + return (ERR); + } + + if (even_boundary(tp->ext_Booleans)) { + return (ERR); + } + + TRACE_OUT(("WRITE %d numbers @%d", tp->ext_Numbers, *offset)); + if (tp->ext_Numbers) { + numlen = convert_numbers(buf, tp->Numbers + NUMCOUNT, (size_t) tp->ext_Numbers); + if (Write(buf, numlen, tp->ext_Numbers) != tp->ext_Numbers) { + return (ERR); + } + } + + /* + * Convert the offsets for the ext_Strings and ext_Names tables, + * in that order. + */ + convert_shorts(buf, offsets, strmax); + TRACE_OUT(("WRITE offsets @%d", *offset)); + if (Write(buf, SIZEOF_SHORT, strmax) != strmax) { + return (ERR); + } + + /* + * Write the string table after the offset tables so we do not + * have to do anything about alignment. + */ + for (i = 0; i < tp->ext_Strings; i++) { + if (VALID_STRING(tp->Strings[i + STRCOUNT])) { + TRACE_OUT(("WRITE ext_Strings[%d]=%s", (int) i, + _nc_visbuf(tp->Strings[i + STRCOUNT]))); + if (!WRITE_STRING(tp->Strings[i + STRCOUNT])) { + return (ERR); + } + } + } + + /* + * Write the extended names + */ + for (i = 0; i < ext_total; i++) { + TRACE_OUT(("WRITE ext_Names[%d]=%s", (int) i, tp->ext_Names[i])); + if (!WRITE_STRING(tp->ext_Names[i])) { + return (ERR); + } + } + + } +#endif /* NCURSES_XNAMES */ + + total_written++; + total_parts++; + total_size = total_size + (int) (*offset + 1); + return (OK); +} + +/* + * Returns the total number of entries written by this process + */ +NCURSES_EXPORT(int) +_nc_tic_written(void) +{ + TR(TRACE_DATABASE, ("_nc_tic_written %d entries, %d parts, %d size", + total_written, total_parts, total_size)); + return total_written; +} diff --git a/contrib/ncurses/ncurses/trace/README b/contrib/ncurses/ncurses/trace/README new file mode 100644 index 00000000..0a33300e --- /dev/null +++ b/contrib/ncurses/ncurses/trace/README @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- Copyright 2020 Thomas E. Dickey -- +-- Copyright 1998,2006 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README,v 1.3 2020/02/02 23:34:34 tom Exp $ +------------------------------------------------------------------------------- + +The files in this directory (trace) support both the terminfo and ncurses +libraries. Most of the functions are linked in only when the libraries +are compiled with TRACE defined. diff --git a/contrib/ncurses/ncurses/trace/lib_trace.c b/contrib/ncurses/ncurses/trace/lib_trace.c new file mode 100644 index 00000000..680187de --- /dev/null +++ b/contrib/ncurses/ncurses/trace/lib_trace.c @@ -0,0 +1,459 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* + * lib_trace.c - Tracing/Debugging routines + * + * The _tracef() function is originally from pcurses (by Pavel Curtis) in 1982. + * pcurses allowed one to enable/disable tracing using traceon() and traceoff() + * functions. ncurses provides a trace() function which allows one to + * selectively enable or disable several tracing features. + */ + +#include +#include + +#include + +MODULE_ID("$Id: lib_trace.c,v 1.107 2024/08/31 10:48:22 tom Exp $") + +NCURSES_EXPORT_VAR(unsigned) _nc_tracing = 0; /* always define this */ + +#ifdef TRACE + +#if USE_REENTRANT +NCURSES_EXPORT(const char *) +NCURSES_PUBLIC_VAR(_nc_tputs_trace) (void) +{ + return CURRENT_SCREEN ? CURRENT_SCREEN->_tputs_trace : _nc_prescreen._tputs_trace; +} +NCURSES_EXPORT(long) +NCURSES_PUBLIC_VAR(_nc_outchars) (void) +{ + return CURRENT_SCREEN ? CURRENT_SCREEN->_outchars : _nc_prescreen._outchars; +} +NCURSES_EXPORT(void) +_nc_set_tputs_trace(const char *s) +{ + if (CURRENT_SCREEN) + CURRENT_SCREEN->_tputs_trace = s; + else + _nc_prescreen._tputs_trace = s; +} +NCURSES_EXPORT(void) +_nc_count_outchars(long increment) +{ + if (CURRENT_SCREEN) + CURRENT_SCREEN->_outchars += increment; + else + _nc_prescreen._outchars += increment; +} +#else +NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace = ""; +NCURSES_EXPORT_VAR(long) _nc_outchars = 0; +#endif + +#define MyFP _nc_globals.trace_fp +#define MyFD _nc_globals.trace_fd +#define MyInit _nc_globals.trace_opened +#define MyLevel _nc_globals.trace_level +#define MyNested _nc_globals.nested_tracef +#endif /* TRACE */ + +#if USE_REENTRANT +#define Locked(statement) \ + do { \ + _nc_lock_global(tst_tracef); \ + statement; \ + _nc_unlock_global(tst_tracef); \ + } while (0) +#else +#define Locked(statement) statement +#endif + +NCURSES_EXPORT(unsigned) +curses_trace(unsigned tracelevel) +{ + unsigned result; + +#if defined(TRACE) + int bit; + +#define DATA(name) { name, #name } + static struct { + unsigned mask; + const char *name; + } trace_names[] = { + DATA(TRACE_TIMES), + DATA(TRACE_TPUTS), + DATA(TRACE_UPDATE), + DATA(TRACE_MOVE), + DATA(TRACE_CHARPUT), + DATA(TRACE_CALLS), + DATA(TRACE_VIRTPUT), + DATA(TRACE_IEVENT), + DATA(TRACE_BITS), + DATA(TRACE_ICALLS), + DATA(TRACE_CCALLS), + DATA(TRACE_DATABASE), + DATA(TRACE_ATTRS) + }; +#undef DATA + + Locked(result = _nc_tracing); + + if ((MyFP == 0) && tracelevel) { + MyInit = TRUE; + if (MyFD >= 0) { + MyFP = fdopen(MyFD, BIN_W); + } else { + char myFile[80]; + + _nc_STRCPY(myFile, "trace", sizeof(myFile)); + if (_nc_is_dir_path(myFile)) { + _nc_STRCAT(myFile, ".log", sizeof(myFile)); + } +#define SAFE_MODE (O_CREAT | O_EXCL | O_RDWR) + if (_nc_access(myFile, W_OK) < 0 + || (MyFD = safe_open3(myFile, SAFE_MODE, 0600)) < 0 + || (MyFP = fdopen(MyFD, BIN_W)) == 0) { + ; /* EMPTY */ + } + } + Locked(_nc_tracing = tracelevel); + /* Try to set line-buffered mode, or (failing that) unbuffered, + * so that the trace-output gets flushed automatically at the + * end of each line. This is useful in case the program dies. + */ + if (MyFP != 0) { +#if HAVE_SETVBUF /* ANSI */ + (void) setvbuf(MyFP, (char *) 0, _IOLBF, (size_t) 0); +#elif HAVE_SETBUF /* POSIX */ + (void) setbuffer(MyFP, (char *) 0); +#endif + } + _tracef("TRACING NCURSES version %s.%d (tracelevel=%#x)", + NCURSES_VERSION, + NCURSES_VERSION_PATCH, + tracelevel); + +#define SPECIAL_MASK(mask) \ + if ((tracelevel & mask) == mask) \ + _tracef("- %s (%u)", #mask, mask) + + for (bit = 0; bit < TRACE_SHIFT; ++bit) { + unsigned mask = (1U << bit) & tracelevel; + if ((mask & trace_names[bit].mask) != 0) { + _tracef("- %s (%u)", trace_names[bit].name, mask); + } + } + SPECIAL_MASK(TRACE_MAXIMUM); + else + SPECIAL_MASK(TRACE_ORDINARY); + + if (tracelevel > TRACE_MAXIMUM) { + _tracef("- DEBUG_LEVEL(%u)", tracelevel >> TRACE_SHIFT); + } + } else if (tracelevel == 0) { + if (MyFP != 0) { + MyFD = dup(MyFD); /* allow reopen of same file */ + fclose(MyFP); + MyFP = 0; + } + Locked(_nc_tracing = tracelevel); + } else if (_nc_tracing != tracelevel) { + Locked(_nc_tracing = tracelevel); + _tracef("tracelevel=%#x", tracelevel); + } +#else + (void) tracelevel; + result = 0; +#endif + return result; +} + +#if defined(TRACE) +NCURSES_EXPORT(void) +trace(const unsigned int tracelevel) +{ + curses_trace(tracelevel); +} + +static void +_nc_va_tracef(const char *fmt, va_list ap) +{ + static const char Called[] = T_CALLED(""); + static const char Return[] = T_RETURN(""); + + bool before = FALSE; + bool after = FALSE; + unsigned doit = _nc_tracing; + int save_err = errno; + FILE *fp = MyFP; + +#ifdef TRACE + /* verbose-trace in the command-line utilities relies on this */ + if (fp == 0 && !MyInit && _nc_tracing >= DEBUG_LEVEL(1)) + fp = stderr; +#endif + + if (strlen(fmt) >= sizeof(Called) - 1) { + if (!strncmp(fmt, Called, sizeof(Called) - 1)) { + before = TRUE; + MyLevel++; + } else if (!strncmp(fmt, Return, sizeof(Return) - 1)) { + after = TRUE; + } + if (before || after) { + if ((MyLevel <= 1) + || (doit & TRACE_ICALLS) != 0) + doit &= (TRACE_CALLS | TRACE_CCALLS); + else + doit = 0; + } + } + + if (doit != 0 && fp != 0) { +#ifdef USE_PTHREADS + /* + * TRACE_ICALLS is "really" needed to show normal use with threaded + * applications, since anything can be running during a napms(), + * making it appear in the hierarchical trace as it other functions + * are being called. + * + * Rather than add the complication of a per-thread stack, just + * show the thread-id in each line of the trace. + */ +# if USE_WEAK_SYMBOLS + if ((pthread_self)) +# endif + fprintf(fp, "%#" PRIxPTR ":", +#ifdef _NC_WINDOWS_NATIVE + CASTxPTR(pthread_self().p) +#else + CASTxPTR(pthread_self()) +#endif + ); +#endif + if (before || after) { + int n; + for (n = 1; n < MyLevel; n++) + fputs("+ ", fp); + } + vfprintf(fp, fmt, ap); + fputc('\n', fp); + fflush(fp); + } + + if (after && MyLevel) + MyLevel--; + + errno = save_err; +} + +NCURSES_EXPORT(void) +_tracef(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + _nc_va_tracef(fmt, ap); + va_end(ap); +} + +/* Trace 'bool' return-values */ +NCURSES_EXPORT(NCURSES_BOOL) +_nc_retrace_bool(int code) +{ + T((T_RETURN("%s"), code ? "TRUE" : "FALSE")); + return code; +} + +/* Trace 'char' return-values */ +NCURSES_EXPORT(char) +_nc_retrace_char(int code) +{ + T((T_RETURN("%c"), code)); + return (char) code; +} + +/* Trace 'int' return-values */ +NCURSES_EXPORT(int) +_nc_retrace_int(int code) +{ + T((T_RETURN("%d"), code)); + return code; +} + +/* Trace 'unsigned' return-values */ +NCURSES_EXPORT(unsigned) +_nc_retrace_unsigned(unsigned code) +{ + T((T_RETURN("%#x"), code)); + return code; +} + +/* Trace 'char*' return-values */ +NCURSES_EXPORT(char *) +_nc_retrace_ptr(char *code) +{ + T((T_RETURN("%s"), _nc_visbuf(code))); + return code; +} + +/* Trace 'const char*' return-values */ +NCURSES_EXPORT(const char *) +_nc_retrace_cptr(const char *code) +{ + T((T_RETURN("%s"), _nc_visbuf(code))); + return code; +} + +/* Trace 'NCURSES_CONST void*' return-values */ +NCURSES_EXPORT(NCURSES_CONST void *) +_nc_retrace_cvoid_ptr(NCURSES_CONST void *code) +{ + T((T_RETURN("%p"), code)); + return code; +} + +/* Trace 'void*' return-values */ +NCURSES_EXPORT(void *) +_nc_retrace_void_ptr(void *code) +{ + T((T_RETURN("%p"), code)); + return code; +} + +/* Trace 'SCREEN *' return-values */ +NCURSES_EXPORT(SCREEN *) +_nc_retrace_sp(SCREEN *code) +{ + T((T_RETURN("%p"), (void *) code)); + return code; +} + +/* Trace 'WINDOW *' return-values */ +NCURSES_EXPORT(WINDOW *) +_nc_retrace_win(WINDOW *code) +{ + T((T_RETURN("%p"), (void *) code)); + return code; +} + +NCURSES_EXPORT(char *) +_nc_fmt_funcptr(char *target, const char *source, size_t size) +{ + size_t n; + char *dst = target; + bool leading = TRUE; + + union { + int value; + char bytes[sizeof(int)]; + } byteorder; + + byteorder.value = 0x1234; + + *dst++ = '0'; + *dst++ = 'x'; + + for (n = 0; n < size; ++n) { + unsigned ch = ((byteorder.bytes[0] == 0x34) + ? UChar(source[size - n - 1]) + : UChar(source[n])); + if (ch != 0 || (n + 1) >= size) + leading = FALSE; + if (!leading) { + _nc_SPRINTF(dst, _nc_SLIMIT(TR_FUNC_LEN - (size_t) (dst - target)) + "%02x", ch & 0xff); + dst += 2; + } + } + *dst = '\0'; + return target; +} + +#if USE_REENTRANT +/* + * Check if the given trace-mask is enabled. + * + * This function may be called from within one of the functions that fills + * in parameters for _tracef(), but in that case we do not want to lock the + * mutex, since it is already locked. + */ +NCURSES_EXPORT(int) +_nc_use_tracef(unsigned mask) +{ + bool result = FALSE; + + _nc_lock_global(tst_tracef); + if (!MyNested++) { + if ((result = (_nc_tracing & (mask))) != 0 + && _nc_try_global(tracef) == 0) { + /* we will call _nc_locked_tracef(), no nesting so far */ + } else { + /* we will not call _nc_locked_tracef() */ + MyNested = 0; + } + } else { + /* we may call _nc_locked_tracef(), but with nested_tracef > 0 */ + result = (_nc_tracing & (mask)); + } + _nc_unlock_global(tst_tracef); + return result; +} + +/* + * We call this if _nc_use_tracef() returns true, which means we must unlock + * the tracef mutex. + */ +NCURSES_EXPORT(void) +_nc_locked_tracef(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + _nc_va_tracef(fmt, ap); + va_end(ap); + + if (--(MyNested) == 0) { + _nc_unlock_global(tracef); + } +} +#endif /* USE_REENTRANT */ + +#endif /* TRACE */ diff --git a/contrib/ncurses/ncurses/trace/lib_traceatr.c b/contrib/ncurses/ncurses/trace/lib_traceatr.c new file mode 100644 index 00000000..aa3a9ddb --- /dev/null +++ b/contrib/ncurses/ncurses/trace/lib_traceatr.c @@ -0,0 +1,418 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 1998-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey 1996-on * + * and: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer * + ****************************************************************************/ + +/* + * lib_traceatr.c - Tracing/Debugging routines (attributes) + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_traceatr.c,v 1.97 2024/07/27 19:08:04 tom Exp $") + +#define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name)) + +#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size) +#define COLOR_BUF_SIZE(num) (sizeof(my_buffer[num])) + +#ifdef TRACE + +static const char l_brace[] = StringOf(L_BRACE); +static const char r_brace[] = StringOf(R_BRACE); + +#ifndef USE_TERMLIB + +#define my_buffer _nc_globals.traceatr_color_buf +#define my_select _nc_globals.traceatr_color_sel +#define my_cached _nc_globals.traceatr_color_last + +static char * +color_of(int c) +{ + if (c != my_cached) { + my_cached = c; + my_select = !my_select; + if (isDefaultColor(c)) + _nc_STRCPY(my_buffer[my_select], "default", + COLOR_BUF_SIZE(my_select)); + else + _nc_SPRINTF(my_buffer[my_select], + _nc_SLIMIT(COLOR_BUF_SIZE(my_select)) + "color%d", c); + } + return my_buffer[my_select]; +} + +#undef my_buffer +#undef my_select +#endif /* !USE_TERMLIB */ + +NCURSES_EXPORT(char *) +_traceattr2(int bufnum, chtype newmode) +{ +#define DATA(name) { name, { #name } } + static const struct { + unsigned int val; + const char name[14]; + } names[] = + { + DATA(A_STANDOUT), + DATA(A_UNDERLINE), + DATA(A_REVERSE), + DATA(A_BLINK), + DATA(A_DIM), + DATA(A_BOLD), + DATA(A_ALTCHARSET), + DATA(A_INVIS), + DATA(A_PROTECT), + DATA(A_CHARTEXT), + DATA(A_NORMAL), + DATA(A_COLOR), +#if USE_ITALIC + DATA(A_ITALIC), +#endif + } +#ifndef USE_TERMLIB + , + colors[] = + { + DATA(COLOR_BLACK), + DATA(COLOR_RED), + DATA(COLOR_GREEN), + DATA(COLOR_YELLOW), + DATA(COLOR_BLUE), + DATA(COLOR_MAGENTA), + DATA(COLOR_CYAN), + DATA(COLOR_WHITE), + } +#endif /* !USE_TERMLIB */ + ; +#undef DATA + char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); + + if (result != 0) { + size_t n; + unsigned save_nc_tracing = _nc_tracing; + + _nc_tracing = 0; + + _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); + + for (n = 0; n < SIZEOF(names); n++) { + + if ((newmode & names[n].val) != 0) { + if (result[1] != '\0') + (void) _nc_trace_bufcat(bufnum, "|"); + result = _nc_trace_bufcat(bufnum, names[n].name); + + if (names[n].val == A_COLOR) { + char temp[80]; + short pairnum = (short) PairNumber(newmode); +#ifdef USE_TERMLIB + /* pair_content lives in libncurses */ + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "{%d}", pairnum); +#else + NCURSES_COLOR_T fg, bg; + + if (pair_content(pairnum, &fg, &bg) == OK) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "{%d = {%s, %s}}", + pairnum, + COLOR_OF(fg), + COLOR_OF(bg)); + } else { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "{%d}", pairnum); + } +#endif + result = _nc_trace_bufcat(bufnum, temp); + } + } + } + if (ChAttrOf(newmode) == A_NORMAL) { + if (result != 0 && result[1] != '\0') + (void) _nc_trace_bufcat(bufnum, "|"); + (void) _nc_trace_bufcat(bufnum, "A_NORMAL"); + } + + _nc_tracing = save_nc_tracing; + result = _nc_trace_bufcat(bufnum, r_brace); + } + return result; +} + +NCURSES_EXPORT(char *) +_traceattr(attr_t newmode) +{ + return _traceattr2(0, newmode); +} + +/* Trace 'int' return-values */ +NCURSES_EXPORT(int) +_nc_retrace_int_attr_t(attr_t code) +{ + T((T_RETURN("%s"), _traceattr(code))); + return (int) code; +} + +/* Trace 'attr_t' return-values */ +NCURSES_EXPORT(attr_t) +_nc_retrace_attr_t(attr_t code) +{ + T((T_RETURN("%s"), _traceattr(code))); + return code; +} + +const char * +_nc_altcharset_name(attr_t attr, chtype ch) +{ +#define DATA(code, name) { code, { #name } } + typedef struct { + unsigned int val; + const char name[13]; + } ALT_NAMES; +#if NCURSES_SP_FUNCS + SCREEN *sp = CURRENT_SCREEN; +#endif + static const ALT_NAMES names[] = + { + DATA('l', ACS_ULCORNER), /* upper left corner */ + DATA('m', ACS_LLCORNER), /* lower left corner */ + DATA('k', ACS_URCORNER), /* upper right corner */ + DATA('j', ACS_LRCORNER), /* lower right corner */ + DATA('t', ACS_LTEE), /* tee pointing right */ + DATA('u', ACS_RTEE), /* tee pointing left */ + DATA('v', ACS_BTEE), /* tee pointing up */ + DATA('w', ACS_TTEE), /* tee pointing down */ + DATA('q', ACS_HLINE), /* horizontal line */ + DATA('x', ACS_VLINE), /* vertical line */ + DATA('n', ACS_PLUS), /* large plus or crossover */ + DATA('o', ACS_S1), /* scan line 1 */ + DATA('s', ACS_S9), /* scan line 9 */ + DATA('`', ACS_DIAMOND), /* diamond */ + DATA('a', ACS_CKBOARD), /* checker board (stipple) */ + DATA('f', ACS_DEGREE), /* degree symbol */ + DATA('g', ACS_PLMINUS), /* plus/minus */ + DATA('~', ACS_BULLET), /* bullet */ + DATA(',', ACS_LARROW), /* arrow pointing left */ + DATA('+', ACS_RARROW), /* arrow pointing right */ + DATA('.', ACS_DARROW), /* arrow pointing down */ + DATA('-', ACS_UARROW), /* arrow pointing up */ + DATA('h', ACS_BOARD), /* board of squares */ + DATA('i', ACS_LANTERN), /* lantern symbol */ + DATA('0', ACS_BLOCK), /* solid square block */ + DATA('p', ACS_S3), /* scan line 3 */ + DATA('r', ACS_S7), /* scan line 7 */ + DATA('y', ACS_LEQUAL), /* less/equal */ + DATA('z', ACS_GEQUAL), /* greater/equal */ + DATA('{', ACS_PI), /* Pi */ + DATA('|', ACS_NEQUAL), /* not equal */ + DATA('}', ACS_STERLING), /* UK pound sign */ + }; +#undef DATA + + const char *result = 0; + +#if NCURSES_SP_FUNCS + (void) sp; +#endif + if (SP_PARM != 0 && (attr & A_ALTCHARSET) && (acs_chars != 0)) { + char *cp; + const char *found = 0; + + for (cp = acs_chars; cp[0] && cp[1]; cp += 2) { + if (ChCharOf(UChar(cp[1])) == ChCharOf(ch)) { + found = cp; + /* don't exit from loop - there may be redefinitions */ + } + } + + if (found != 0) { + size_t n; + + ch = ChCharOf(UChar(*found)); + for (n = 0; n < SIZEOF(names); ++n) { + if (names[n].val == ch) { + result = names[n].name; + break; + } + } + } + } + return result; +} + +NCURSES_EXPORT(char *) +_tracechtype2(int bufnum, chtype ch) +{ + char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); + + if (result != 0) { + const char *found; + attr_t attr = ChAttrOf(ch); + + _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); + if ((found = _nc_altcharset_name(attr, ch)) != 0) { + (void) _nc_trace_bufcat(bufnum, found); + attr &= ~A_ALTCHARSET; + } else + (void) _nc_trace_bufcat(bufnum, + _nc_tracechar(CURRENT_SCREEN, + (int) ChCharOf(ch))); + + if (attr != A_NORMAL) { + (void) _nc_trace_bufcat(bufnum, " | "); + (void) _nc_trace_bufcat(bufnum, + _traceattr2(bufnum + 20, attr)); + } + + result = _nc_trace_bufcat(bufnum, r_brace); + } + return result; +} + +NCURSES_EXPORT(char *) +_tracechtype(chtype ch) +{ + return _tracechtype2(0, ch); +} + +/* Trace 'chtype' return-values */ +NCURSES_EXPORT(chtype) +_nc_retrace_chtype(chtype code) +{ + T((T_RETURN("%s"), _tracechtype(code))); + return code; +} + +#if USE_WIDEC_SUPPORT +NCURSES_EXPORT(char *) +_tracecchar_t2(int bufnum, const cchar_t *ch) +{ + char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); + + if (result != 0) { + _nc_STRCPY(result, l_brace, TRACE_BUF_SIZE(bufnum)); + if (ch != 0) { + const char *found; + attr_t attr = AttrOfD(ch); + + if ((found = _nc_altcharset_name(attr, (chtype) CharOfD(ch))) != 0) { + (void) _nc_trace_bufcat(bufnum, found); + attr &= ~A_ALTCHARSET; + } else if (isWidecExt(CHDEREF(ch))) { + (void) _nc_trace_bufcat(bufnum, "{NAC}"); + attr &= ~A_CHARTEXT; + } else { + PUTC_DATA; + int n; + int assume_unicode = _nc_unicode_locale()? 128 : 255; + + (void) _nc_trace_bufcat(bufnum, "{ "); + for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { + PUTC_ch = ch->chars[PUTC_i]; + if (PUTC_ch == L'\0') { + if (PUTC_i == 0) + (void) _nc_trace_bufcat(bufnum, "\\000"); + break; + } + PUTC_INIT; + PUTC_n = (int) wcrtomb(PUTC_buf, ch->chars[PUTC_i], &PUT_st); + if (PUTC_n <= 0) { + if (PUTC_ch != L'\0') { + /* it could not be a multibyte sequence */ + (void) _nc_trace_bufcat(bufnum, + _nc_tracechar(CURRENT_SCREEN, + UChar(ch->chars[PUTC_i]))); + } + break; + } else if (ch->chars[PUTC_i] > assume_unicode) { + char temp[80]; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "{%d:\\u%04lx}", + _nc_wacs_width(ch->chars[PUTC_i]), + (unsigned long) ch->chars[PUTC_i]); + (void) _nc_trace_bufcat(bufnum, temp); + attr &= ~A_CHARTEXT; /* ignore WidecExt(ch) */ + } else { + for (n = 0; n < PUTC_n; n++) { + if (n) + (void) _nc_trace_bufcat(bufnum, ", "); + (void) _nc_trace_bufcat(bufnum, + _nc_tracechar(CURRENT_SCREEN, + UChar(PUTC_buf[n]))); + } + } + } + (void) _nc_trace_bufcat(bufnum, " }"); + } + if (attr != A_NORMAL) { + (void) _nc_trace_bufcat(bufnum, " | "); + (void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr)); + } +#if NCURSES_EXT_COLORS + /* + * Just in case the extended color is different from the chtype + * value, trace both. + */ + if (ch->ext_color != PairNumber(attr)) { + char temp[80]; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + " X_COLOR{%d:%d}", ch->ext_color, PairNumber(attr)); + (void) _nc_trace_bufcat(bufnum, temp); + } +#endif + } + + result = _nc_trace_bufcat(bufnum, r_brace); + } + return result; +} + +NCURSES_EXPORT(char *) +_tracecchar_t(const cchar_t *ch) +{ + return _tracecchar_t2(0, ch); +} +#endif + +#else +EMPTY_MODULE(_nc_lib_traceatr) +#endif /* TRACE */ diff --git a/contrib/ncurses/ncurses/trace/lib_tracebits.c b/contrib/ncurses/ncurses/trace/lib_tracebits.c new file mode 100644 index 00000000..4bc50f3b --- /dev/null +++ b/contrib/ncurses/ncurses/trace/lib_tracebits.c @@ -0,0 +1,303 @@ +/**************************************************************************** + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 1998-2012,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_tracebits.c,v 1.31 2020/11/14 23:38:11 tom Exp $") + +#if HAVE_SYS_TERMIO_H +#include /* needed for ISC */ +#endif + +#ifdef __EMX__ +#include +#endif + +/* may be undefined if we're using termio.h */ +#ifndef TOSTOP +#define TOSTOP 0 +#endif + +#ifndef IEXTEN +#define IEXTEN 0 +#endif + +#ifndef ONLCR +#define ONLCR 0 +#endif + +#ifndef OCRNL +#define OCRNL 0 +#endif + +#ifndef ONOCR +#define ONOCR 0 +#endif + +#ifndef ONLRET +#define ONLRET 0 +#endif + +#ifdef TRACE + +#if defined(EXP_WIN32_DRIVER) +#define BITNAMELEN 36 +#else +#define BITNAMELEN 8 +#endif + +typedef struct { + unsigned int val; + const char name[BITNAMELEN]; +} BITNAMES; + +#define TRACE_BUF_SIZE(num) (_nc_globals.tracebuf_ptr[num].size) + +static void +lookup_bits(char *buf, const BITNAMES * table, const char *label, unsigned int val) +{ + const BITNAMES *sp; + + _nc_STRCAT(buf, label, TRACE_BUF_SIZE(0)); + _nc_STRCAT(buf, ": {", TRACE_BUF_SIZE(0)); + for (sp = table; sp->name[0]; sp++) + if (sp->val != 0 + && (val & sp->val) == sp->val) { + _nc_STRCAT(buf, sp->name, TRACE_BUF_SIZE(0)); + _nc_STRCAT(buf, ", ", TRACE_BUF_SIZE(0)); + } + if (buf[strlen(buf) - 2] == ',') + buf[strlen(buf) - 2] = '\0'; + _nc_STRCAT(buf, "} ", TRACE_BUF_SIZE(0)); +} + +NCURSES_EXPORT(char *) +_nc_trace_ttymode(const TTY * tty) +/* describe the state of the terminal control bits exactly */ +{ + char *buf; + +#ifdef TERMIOS +#define DATA(name) { name, { #name } } +#define DATA2(name,name2) { name, { #name2 } } +#define DATAX() { 0, { "" } } + static const BITNAMES iflags[] = + { + DATA(BRKINT), + DATA(IGNBRK), + DATA(IGNPAR), + DATA(PARMRK), + DATA(INPCK), + DATA(ISTRIP), + DATA(INLCR), + DATA(IGNCR), + DATA(ICRNL), + DATA(IXON), + DATA(IXOFF), + DATAX() +#define ALLIN (BRKINT|IGNBRK|IGNPAR|PARMRK|INPCK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IXOFF) + }, oflags[] = + { + DATA(OPOST), + DATA2(OFLAGS_TABS, XTABS), + DATA(ONLCR), + DATA(OCRNL), + DATA(ONOCR), + DATA(ONLRET), + DATAX() +#define ALLOUT (OPOST|OFLAGS_TABS|ONLCR|OCRNL|ONOCR|ONLRET|OFLAGS_TABS) + }, cflags[] = + { + DATA(CLOCAL), + DATA(CREAD), + DATA(CSTOPB), +#if !defined(CS5) || !defined(CS8) + DATA(CSIZE), +#endif + DATA(HUPCL), + DATA(PARENB), + DATA2(PARODD | PARENB, PARODD), + DATAX() +#define ALLCTRL (CLOCAL|CREAD|CSIZE|CSTOPB|HUPCL|PARENB|PARODD) + }, lflags[] = + { + DATA(ECHO), + DATA2(ECHOE | ECHO, ECHOE), + DATA2(ECHOK | ECHO, ECHOK), + DATA(ECHONL), + DATA(ICANON), + DATA(ISIG), + DATA(NOFLSH), + DATA(TOSTOP), + DATA(IEXTEN), + DATAX() +#define ALLLOCAL (ECHO|ECHONL|ICANON|ISIG|NOFLSH|TOSTOP|IEXTEN) + }; + + buf = _nc_trace_buf(0, + 8 + sizeof(iflags) + + 8 + sizeof(oflags) + + 8 + sizeof(cflags) + + 8 + sizeof(lflags) + + 8); + if (buf != 0) { + + if (tty->c_iflag & ALLIN) + lookup_bits(buf, iflags, "iflags", tty->c_iflag); + + if (tty->c_oflag & ALLOUT) + lookup_bits(buf, oflags, "oflags", tty->c_oflag); + + if (tty->c_cflag & ALLCTRL) + lookup_bits(buf, cflags, "cflags", tty->c_cflag); + +#if defined(CS5) && defined(CS8) + { + static const struct { + int value; + const char name[5]; + } csizes[] = { +#define CS_DATA(name) { name, { #name " " } } + CS_DATA(CS5), +#ifdef CS6 + CS_DATA(CS6), +#endif +#ifdef CS7 + CS_DATA(CS7), +#endif + CS_DATA(CS8), + }; + const char *result = "CSIZE? "; + int value = (int) (tty->c_cflag & CSIZE); + unsigned n; + + if (value != 0) { + for (n = 0; n < SIZEOF(csizes); n++) { + if (csizes[n].value == value) { + result = csizes[n].name; + break; + } + } + } + _nc_STRCAT(buf, result, TRACE_BUF_SIZE(0)); + } +#endif + + if (tty->c_lflag & ALLLOCAL) + lookup_bits(buf, lflags, "lflags", tty->c_lflag); + } +#elif defined(EXP_WIN32_DRIVER) +#define DATA(name) { name, { #name } } + static const BITNAMES dwFlagsOut[] = + { + DATA(ENABLE_PROCESSED_OUTPUT), + DATA(ENABLE_WRAP_AT_EOL_OUTPUT), + DATA(ENABLE_VIRTUAL_TERMINAL_PROCESSING), + DATA(DISABLE_NEWLINE_AUTO_RETURN), + DATA(ENABLE_LVB_GRID_WORLDWIDE) + }; + static const BITNAMES dwFlagsIn[] = + { + DATA(ENABLE_PROCESSED_INPUT), + DATA(ENABLE_LINE_INPUT), + DATA(ENABLE_ECHO_INPUT), + DATA(ENABLE_MOUSE_INPUT), + DATA(ENABLE_INSERT_MODE), + DATA(ENABLE_QUICK_EDIT_MODE), + DATA(ENABLE_EXTENDED_FLAGS), + DATA(ENABLE_AUTO_POSITION), + DATA(ENABLE_VIRTUAL_TERMINAL_INPUT) + }; + + buf = _nc_trace_buf(0, + 8 + sizeof(dwFlagsOut) + + 8 + sizeof(dwFlagsIn)); + if (buf != 0) { + lookup_bits(buf, dwFlagsIn, "dwIn", tty->dwFlagIn); + lookup_bits(buf, dwFlagsOut, "dwOut", tty->dwFlagOut); + } +#else + /* reference: ttcompat(4M) on SunOS 4.1 */ +#ifndef EVENP +#define EVENP 0 +#endif +#ifndef LCASE +#define LCASE 0 +#endif +#ifndef LLITOUT +#define LLITOUT 0 +#endif +#ifndef ODDP +#define ODDP 0 +#endif +#ifndef TANDEM +#define TANDEM 0 +#endif + + static const BITNAMES cflags[] = + { + DATA(CBREAK), + DATA(CRMOD), + DATA(ECHO), + DATA(EVENP), + DATA(LCASE), + DATA(LLITOUT), + DATA(ODDP), + DATA(RAW), + DATA(TANDEM), + DATA(XTABS), + DATAX() +#define ALLCTRL (CBREAK|CRMOD|ECHO|EVENP|LCASE|LLITOUT|ODDP|RAW|TANDEM|XTABS) + }; + + buf = _nc_trace_buf(0, + 8 + sizeof(cflags)); + if (buf != 0) { + if (tty->sg_flags & ALLCTRL) { + lookup_bits(buf, cflags, "cflags", tty->sg_flags); + } + } +#endif + return (buf); +} + +NCURSES_EXPORT(char *) +_nc_tracebits(void) +{ + return _nc_trace_ttymode(&(cur_term->Nttyb)); +} +#else +EMPTY_MODULE(_nc_empty_lib_tracebits) +#endif /* TRACE */ diff --git a/contrib/ncurses/ncurses/trace/lib_tracechr.c b/contrib/ncurses/ncurses/trace/lib_tracechr.c new file mode 100644 index 00000000..9c879dc6 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/lib_tracechr.c @@ -0,0 +1,90 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 1998-2009,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * lib_tracechr.c - Tracing/Debugging routines + */ +#include + +#include + +MODULE_ID("$Id: lib_tracechr.c,v 1.24 2024/02/04 00:11:35 tom Exp $") + +#ifdef TRACE + +#define MyBufSize sizeof(_nc_globals.tracechr_buf) + +NCURSES_EXPORT(char *) +_nc_tracechar(SCREEN *sp, int ch) +{ + NCURSES_CONST char *name; + char *MyBuffer = ((sp != 0) + ? sp->tracechr_buf + : _nc_globals.tracechr_buf); + + if ((ch > KEY_MIN && !_nc_unicode_locale()) || ch < 0) { + name = safe_keyname(SP_PARM, ch); + if (name == 0 || *name == '\0') + name = "NULL"; + _nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize) + "'%.30s' = \\x%02x", name, ch); + } else if (!is8bits(ch) + || (_nc_unicode_locale() && !is7bits(ch)) + || !isprint(UChar(ch))) { + /* + * workaround for glibc bug: + * sprintf changes the result from unctrl() to an empty string if it + * does not correspond to a valid multibyte sequence. + */ + _nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize) + "\\x%02x", ch); + } else { + name = safe_unctrl(SP_PARM, (chtype) ch); + if (name == 0 || *name == 0) + name = "null"; /* shouldn't happen */ + _nc_SPRINTF(MyBuffer, _nc_SLIMIT(MyBufSize) + "'%.30s' = \\x%02x", name, ch); + } + return (MyBuffer); +} + +NCURSES_EXPORT(char *) +_tracechar(int ch) +{ + return _nc_tracechar(CURRENT_SCREEN, ch); +} +#else +EMPTY_MODULE(_nc_lib_tracechr) +#endif diff --git a/contrib/ncurses/ncurses/trace/lib_tracedmp.c b/contrib/ncurses/ncurses/trace/lib_tracedmp.c new file mode 100644 index 00000000..529148bb --- /dev/null +++ b/contrib/ncurses/ncurses/trace/lib_tracedmp.c @@ -0,0 +1,187 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + * and: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* + * lib_tracedmp.c - Tracing/Debugging routines + */ + +#include +#include + +MODULE_ID("$Id: lib_tracedmp.c,v 1.37 2023/06/24 15:49:45 tom Exp $") + +#ifdef TRACE + +#define my_buffer _nc_globals.tracedmp_buf +#define my_length _nc_globals.tracedmp_used + +NCURSES_EXPORT(void) +_tracedump(const char *name, WINDOW *win) +{ + int i, j, n, width; + + /* compute narrowest possible display width */ + for (width = i = 0; i <= win->_maxy; ++i) { + n = 0; + for (j = 0; j <= win->_maxx; ++j) { + if (CharOf(win->_line[i].text[j]) != L(' ') + || AttrOf(win->_line[i].text[j]) != A_NORMAL + || GetPair(win->_line[i].text[j]) != 0) { + n = j; + } + } + + if (n > width) + width = n; + } + if (width < win->_maxx) + ++width; + if (++width + 1 > (int) my_length) { + my_length = (unsigned) (2 * (width + 1)); + my_buffer = typeRealloc(char, my_length, my_buffer); + } + if (my_buffer == 0) + return; + + for (n = 0; n <= win->_maxy; ++n) { + char *ep = my_buffer; + bool havecolors; + + /* + * Dump A_CHARTEXT part. It is more important to make the grid line up + * in the trace file than to represent control- and wide-characters, so + * we map those to '.' and '?' respectively. + */ + for (j = 0; j < width; ++j) { + chtype test = (chtype) CharOf(win->_line[n].text[j]); + ep[j] = (char) ((UChar(test) == test +#if USE_WIDEC_SUPPORT + && (win->_line[n].text[j].chars[1] == 0) +#endif + ) + ? (iscntrl(UChar(test)) + ? '.' + : UChar(test)) + : '?'); + } + ep[j] = '\0'; + _tracef("%s[%2d] %3ld%3ld ='%s'", + name, n, + (long) win->_line[n].firstchar, + (long) win->_line[n].lastchar, + ep); + + /* if there are multi-column characters on the line, print them now */ + if_WIDEC({ + bool multicolumn = FALSE; + for (j = 0; j < width; ++j) + if (WidecExt(win->_line[n].text[j]) != 0) { + multicolumn = TRUE; + break; + } + if (multicolumn) { + ep = my_buffer; + for (j = 0; j < width; ++j) { + int test = WidecExt(win->_line[n].text[j]); + if (test) { + ep[j] = (char) (test + '0'); + } else { + ep[j] = ' '; + } + } + ep[j] = '\0'; + _tracef("%*s[%2d]%*s='%s'", (int) strlen(name), + "widec", n, 8, " ", my_buffer); + } + }); + + /* dump A_COLOR part, will screw up if there are more than 96 */ + havecolors = FALSE; + for (j = 0; j < width; ++j) + if (GetPair(win->_line[n].text[j]) != 0) { + havecolors = TRUE; + break; + } + if (havecolors) { + ep = my_buffer; + for (j = 0; j < width; ++j) { + int pair = GetPair(win->_line[n].text[j]); + if (pair >= 52) + ep[j] = '?'; + else if (pair >= 36) + ep[j] = (char) (pair + 'A'); + else if (pair >= 10) + ep[j] = (char) (pair + 'a'); + else if (pair >= 1) + ep[j] = (char) (pair + '0'); + else + ep[j] = ' '; + } + ep[j] = '\0'; + _tracef("%*s[%2d]%*s='%s'", (int) strlen(name), + "colors", n, 8, " ", my_buffer); + } + + for (i = 0; i < 4; ++i) { + const char *hex = " 123456789ABCDEF"; + attr_t mask = (attr_t) (0xf << ((i + 4) * 4)); + bool haveattrs = FALSE; + + for (j = 0; j < width; ++j) + if (AttrOf(win->_line[n].text[j]) & mask) { + haveattrs = TRUE; + break; + } + if (haveattrs) { + ep = my_buffer; + for (j = 0; j < width; ++j) + ep[j] = hex[(AttrOf(win->_line[n].text[j]) & mask) >> + ((i + 4) * 4)]; + ep[j] = '\0'; + _tracef("%*s%d[%2d]%*s='%s'", (int) strlen(name) - + 1, "attrs", i, n, 8, " ", my_buffer); + } + } + } +#if NO_LEAKS + free(my_buffer); + my_buffer = 0; + my_length = 0; +#endif +} + +#else +EMPTY_MODULE(_nc_lib_tracedmp) +#endif /* TRACE */ diff --git a/contrib/ncurses/ncurses/trace/lib_tracemse.c b/contrib/ncurses/ncurses/trace/lib_tracemse.c new file mode 100644 index 00000000..33d4d3d3 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/lib_tracemse.c @@ -0,0 +1,158 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * lib_tracemse.c - Tracing/Debugging routines (mouse events) + */ + +#include + +MODULE_ID("$Id: lib_tracemse.c,v 1.23 2020/02/02 23:34:34 tom Exp $") + +#ifdef TRACE + +#define my_buffer sp->tracemse_buf + +NCURSES_EXPORT(char *) +_nc_trace_mmask_t(SCREEN *sp, mmask_t code) +{ +#define SHOW(m, s) \ + if ((code & m) == m) { \ + size_t n = strlen(my_buffer); \ + if (n && (my_buffer[n-1] != '{')) \ + _nc_STRCAT(my_buffer, ", ", sizeof(my_buffer)); \ + _nc_STRCAT(my_buffer, s, sizeof(my_buffer)); \ + } + + SHOW(BUTTON1_RELEASED, "release-1"); + SHOW(BUTTON1_PRESSED, "press-1"); + SHOW(BUTTON1_CLICKED, "click-1"); + SHOW(BUTTON1_DOUBLE_CLICKED, "doubleclick-1"); + SHOW(BUTTON1_TRIPLE_CLICKED, "tripleclick-1"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON1_RESERVED_EVENT, "reserved-1"); +#endif + + SHOW(BUTTON2_RELEASED, "release-2"); + SHOW(BUTTON2_PRESSED, "press-2"); + SHOW(BUTTON2_CLICKED, "click-2"); + SHOW(BUTTON2_DOUBLE_CLICKED, "doubleclick-2"); + SHOW(BUTTON2_TRIPLE_CLICKED, "tripleclick-2"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON2_RESERVED_EVENT, "reserved-2"); +#endif + + SHOW(BUTTON3_RELEASED, "release-3"); + SHOW(BUTTON3_PRESSED, "press-3"); + SHOW(BUTTON3_CLICKED, "click-3"); + SHOW(BUTTON3_DOUBLE_CLICKED, "doubleclick-3"); + SHOW(BUTTON3_TRIPLE_CLICKED, "tripleclick-3"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON3_RESERVED_EVENT, "reserved-3"); +#endif + + SHOW(BUTTON4_RELEASED, "release-4"); + SHOW(BUTTON4_PRESSED, "press-4"); + SHOW(BUTTON4_CLICKED, "click-4"); + SHOW(BUTTON4_DOUBLE_CLICKED, "doubleclick-4"); + SHOW(BUTTON4_TRIPLE_CLICKED, "tripleclick-4"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON4_RESERVED_EVENT, "reserved-4"); +#endif + +#if NCURSES_MOUSE_VERSION == 2 + SHOW(BUTTON5_RELEASED, "release-5"); + SHOW(BUTTON5_PRESSED, "press-5"); + SHOW(BUTTON5_CLICKED, "click-5"); + SHOW(BUTTON5_DOUBLE_CLICKED, "doubleclick-5"); + SHOW(BUTTON5_TRIPLE_CLICKED, "tripleclick-5"); +#endif + + SHOW(BUTTON_CTRL, "ctrl"); + SHOW(BUTTON_SHIFT, "shift"); + SHOW(BUTTON_ALT, "alt"); + SHOW(ALL_MOUSE_EVENTS, "all-events"); + SHOW(REPORT_MOUSE_POSITION, "position"); + +#undef SHOW + + if (my_buffer[strlen(my_buffer) - 1] == ' ') + my_buffer[strlen(my_buffer) - 2] = '\0'; + + return (my_buffer); +} + +NCURSES_EXPORT(char *) +_nc_tracemouse(SCREEN *sp, MEVENT const *ep) +{ + char *result = 0; + + if (sp != 0) { + _nc_SPRINTF(my_buffer, _nc_SLIMIT(sizeof(my_buffer)) + TRACEMSE_FMT, + ep->id, + ep->x, + ep->y, + ep->z, + (unsigned long) ep->bstate); + + (void) _nc_trace_mmask_t(sp, ep->bstate); + _nc_STRCAT(my_buffer, "}", sizeof(my_buffer)); + result = (my_buffer); + } + return result; +} + +NCURSES_EXPORT(mmask_t) +_nc_retrace_mmask_t(SCREEN *sp, mmask_t code) +{ + if (sp != 0) { + *my_buffer = '\0'; + T((T_RETURN("{%s}"), _nc_trace_mmask_t(sp, code))); + } else { + T((T_RETURN("{?}"))); + } + return code; +} + +NCURSES_EXPORT(char *) +_tracemouse(MEVENT const *ep) +{ + return _nc_tracemouse(CURRENT_SCREEN, ep); +} + +#else /* !TRACE */ +EMPTY_MODULE(_nc_lib_tracemouse) +#endif diff --git a/contrib/ncurses/ncurses/trace/trace_buf.c b/contrib/ncurses/ncurses/trace/trace_buf.c new file mode 100644 index 00000000..91b12e45 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/trace_buf.c @@ -0,0 +1,125 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 1998-2011,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + ****************************************************************************/ +/* + * trace_buf.c - Tracing/Debugging buffers (attributes) + */ + +#include + +MODULE_ID("$Id: trace_buf.c,v 1.22 2023/06/24 13:37:25 tom Exp $") + +#ifdef TRACE + +#define MyList _nc_globals.tracebuf_ptr +#define MySize _nc_globals.tracebuf_used + +static char * +_nc_trace_alloc(int bufnum, size_t want) +{ + char *result = 0; + + if (bufnum >= 0) { + if ((size_t) (bufnum + 1) > MySize) { + size_t need = (size_t) (bufnum + 1) * 2; + if ((MyList = typeRealloc(TRACEBUF, need, MyList)) != 0) { + while (need > MySize) + MyList[MySize++].text = 0; + } + } + + if (MyList != 0) { + if (MyList[bufnum].text == 0 + || want > MyList[bufnum].size) { + MyList[bufnum].text = typeRealloc(char, want, MyList[bufnum].text); + if (MyList[bufnum].text != 0) + MyList[bufnum].size = want; + } + result = MyList[bufnum].text; + } + } +#if NO_LEAKS + else { + if (MySize) { + if (MyList) { + while (MySize--) { + if (MyList[MySize].text != 0) { + free(MyList[MySize].text); + } + } + free(MyList); + MyList = 0; + } + MySize = 0; + } + } +#endif + return result; +} + +/* + * (re)Allocate a buffer big enough for the caller's wants. + */ +NCURSES_EXPORT(char *) +_nc_trace_buf(int bufnum, size_t want) +{ + char *result = _nc_trace_alloc(bufnum, want); + if (result != 0) + *result = '\0'; + return result; +} + +/* + * Append a new string to an existing buffer. + */ +NCURSES_EXPORT(char *) +_nc_trace_bufcat(int bufnum, const char *value) +{ + char *buffer; + + if (value == NULL) + value = ""; + buffer = _nc_trace_alloc(bufnum, (size_t) 0); + if (buffer != 0) { + size_t have = strlen(buffer); + size_t need = strlen(value) + have; + + buffer = _nc_trace_alloc(bufnum, 1 + need); + if (buffer != 0) + _nc_STRCPY(buffer + have, value, need); + + } + return buffer; +} +#else +EMPTY_MODULE(_nc_empty_trace_buf) +#endif /* TRACE */ diff --git a/contrib/ncurses/ncurses/trace/trace_tries.c b/contrib/ncurses/ncurses/trace/trace_tries.c new file mode 100644 index 00000000..14f704b4 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/trace_tries.c @@ -0,0 +1,82 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1999-2011,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999 * + ****************************************************************************/ +/* + * trace_tries.c - Tracing/Debugging buffers (keycode tries-trees) + */ + +#include + +MODULE_ID("$Id: trace_tries.c,v 1.18 2020/02/02 23:34:34 tom Exp $") + +#ifdef TRACE +#define my_buffer _nc_globals.tracetry_buf +#define my_length _nc_globals.tracetry_used + +static void +recur_tries(TRIES * tree, unsigned level) +{ + if (level > my_length) { + my_length = (level + 1) * 4; + my_buffer = (unsigned char *) _nc_doalloc(my_buffer, my_length); + } + + if (my_buffer != 0) { + while (tree != 0) { + if ((my_buffer[level] = tree->ch) == 0) + my_buffer[level] = 128; + my_buffer[level + 1] = 0; + if (tree->value != 0) { + _tracef("%5d: %s (%s)", tree->value, + _nc_visbuf((char *) my_buffer), keyname(tree->value)); + } + if (tree->child) + recur_tries(tree->child, level + 1); + tree = tree->sibling; + } + } +} + +NCURSES_EXPORT(void) +_nc_trace_tries(TRIES * tree) +{ + if ((my_buffer = typeMalloc(unsigned char, my_length = 80)) != 0) { + _tracef("BEGIN tries %p", (void *) tree); + recur_tries(tree, 0); + _tracef(". . . tries %p", (void *) tree); + free(my_buffer); + } +} + +#else +EMPTY_MODULE(_nc_empty_trace_tries) +#endif diff --git a/contrib/ncurses/ncurses/trace/trace_xnames.c b/contrib/ncurses/ncurses/trace/trace_xnames.c new file mode 100644 index 00000000..2d743368 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/trace_xnames.c @@ -0,0 +1,79 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1999-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1999 * + ****************************************************************************/ +/* + * trace_xnames.c - Tracing/Debugging buffers (TERMTYPE extended names) + */ + +#include + +MODULE_ID("$Id: trace_xnames.c,v 1.8 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(void) +_nc_trace_xnames(TERMTYPE *tp GCC_UNUSED) +{ +#ifdef TRACE +#if NCURSES_XNAMES + int limit = tp->ext_Booleans + tp->ext_Numbers + tp->ext_Strings; + + if (limit) { + int n; + int begin_num = tp->ext_Booleans; + int begin_str = tp->ext_Booleans + tp->ext_Numbers; + + _tracef("extended names (%s) %d = %d+%d+%d of %d+%d+%d", + tp->term_names, + limit, + tp->ext_Booleans, tp->ext_Numbers, tp->ext_Strings, + tp->num_Booleans, tp->num_Numbers, tp->num_Strings); + + for (n = 0; n < limit; n++) { + int m; + + if ((m = n - begin_str) >= 0) { + _tracef("[%d] %s = %s", n, + tp->ext_Names[n], + _nc_visbuf(tp->Strings[tp->num_Strings + m - tp->ext_Strings])); + } else if ((m = n - begin_num) >= 0) { + _tracef("[%d] %s = %d (num)", n, + tp->ext_Names[n], + tp->Numbers[tp->num_Numbers + m - tp->ext_Numbers]); + } else { + _tracef("[%d] %s = %d (bool)", n, + tp->ext_Names[n], + tp->Booleans[tp->num_Booleans + n - tp->ext_Booleans]); + } + } + } +#endif +#endif +} diff --git a/contrib/ncurses/ncurses/trace/varargs.c b/contrib/ncurses/ncurses/trace/varargs.c new file mode 100644 index 00000000..0fc56477 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/varargs.c @@ -0,0 +1,190 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 2001-2008,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2001 * + ****************************************************************************/ + +#include + +#include + +MODULE_ID("$Id: varargs.c,v 1.14 2024/07/27 19:23:59 tom Exp $") + +#ifdef TRACE + +#define MAX_PARMS 10 + +typedef enum { + atUnknown = 0, atInteger, atFloat, atPoint, atString +} ARGTYPE; + +#define VA_INT(type) ival = (int) va_arg(ap, type) +#define VA_FLT(type) fval = va_arg(ap, type) +#define VA_PTR(type) pval = (char *)va_arg(ap, type) +#define VA_STR(type) sval = va_arg(ap, type) + +#define MyBuffer _nc_globals.tracearg_buf +#define MyLength _nc_globals.tracearg_used + +/* + * Returns a string that represents the parameter list of a printf-style call. + */ +NCURSES_EXPORT(char *) +_nc_varargs(const char *fmt, va_list ap) +{ + char buffer[BUFSIZ]; + const char *param; + int n; + + if (fmt == 0 || *fmt == '\0') + return NULL; + if (MyLength == 0) + MyBuffer = typeMalloc(char, MyLength = BUFSIZ); + if (MyBuffer == 0) + return NULL; + *MyBuffer = '\0'; + + while (*fmt != '\0') { + if (*fmt == '%') { + const char *pval = 0; /* avoid const-cast */ + const char *sval = ""; + double fval = 0.0; + int done = FALSE; + int ival = 0; + int type = 0; + ARGTYPE parm[MAX_PARMS]; + int parms = 0; + ARGTYPE used = atUnknown; + + while (*++fmt != '\0' && !done) { + + if (*fmt == '*') { + VA_INT(int); + if (parms < MAX_PARMS) + parm[parms++] = atInteger; + } else if (isalpha(UChar(*fmt))) { + done = TRUE; + switch (*fmt) { + case 'Z': /* FALLTHRU */ + case 'h': /* FALLTHRU */ + case 'l': /* FALLTHRU */ + done = FALSE; + type = *fmt; + break; + case 'i': /* FALLTHRU */ + case 'd': /* FALLTHRU */ + case 'u': /* FALLTHRU */ + case 'x': /* FALLTHRU */ + case 'X': /* FALLTHRU */ + if (type == 'l') + VA_INT(long); + else if (type == 'Z') + VA_INT(size_t); + else + VA_INT(int); + used = atInteger; + break; + case 'f': /* FALLTHRU */ + case 'e': /* FALLTHRU */ + case 'E': /* FALLTHRU */ + case 'g': /* FALLTHRU */ + case 'G': /* FALLTHRU */ + VA_FLT(double); + used = atFloat; + break; + case 'c': + VA_INT(int); + used = atInteger; + break; + case 's': + VA_STR(const char *); + used = atString; + break; + case 'p': + VA_PTR(void *); + used = atPoint; + break; + case 'n': + VA_PTR(int *); + used = atPoint; + break; + default: + break; + } + } else if (*fmt == '%') { + done = TRUE; + } + if (used != atUnknown && parms < MAX_PARMS) { + parm[parms++] = used; + for (n = 0; n < parms; ++n) { + used = parm[n]; + param = buffer; + switch (used) { + case atInteger: + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%d", ival); + break; + case atFloat: + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%f", fval); + break; + case atPoint: + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%p", pval); + break; + case atString: + param = _nc_visbuf2(1, sval); + break; + case atUnknown: + default: + _nc_STRCPY(buffer, "?", sizeof(buffer)); + break; + } + MyLength += strlen(param) + 2; + MyBuffer = typeRealloc(char, MyLength, MyBuffer); + if (MyBuffer != 0) { + _nc_SPRINTF(MyBuffer + strlen(MyBuffer), + _nc_SLIMIT(MyLength - strlen(MyBuffer)) + ", %s", param); + } + } + } + used = atUnknown; + } + } else { + fmt++; + } + } + + return (MyBuffer ? MyBuffer : NULL); +} +#else +EMPTY_MODULE(_nc_varargs) +#endif diff --git a/contrib/ncurses/ncurses/trace/visbuf.c b/contrib/ncurses/ncurses/trace/visbuf.c new file mode 100644 index 00000000..590e4230 --- /dev/null +++ b/contrib/ncurses/ncurses/trace/visbuf.c @@ -0,0 +1,380 @@ +/**************************************************************************** + * Copyright 2019-2021,2023 Thomas E. Dickey * + * Copyright 2001-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + * and: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* + * visbuf.c - Tracing/Debugging support routines + */ + +#define NEED_NCURSES_CH_T +#include + +#include +#include + +MODULE_ID("$Id: visbuf.c,v 1.54 2023/05/27 20:13:10 tom Exp $") + +#define NUM_VISBUFS 4 + +#define NormalLen(len) (size_t) (((size_t)(len) + 1) * 4) +#define WideLen(len) (size_t) (((size_t)(len) + 1) * 4 * (size_t) MB_CUR_MAX) + +#ifdef TRACE +static const char d_quote[] = StringOf(D_QUOTE); +static const char l_brace[] = StringOf(L_BRACE); +static const char r_brace[] = StringOf(R_BRACE); +#endif + +#if USE_STRING_HACKS && HAVE_SNPRINTF +#define VisChar(tp, chr, limit) _nc_vischar(tp, chr, limit) +#define LIMIT_ARG ,size_t limit +#else +#define VisChar(tp, chr, limit) _nc_vischar(tp, chr) +#define LIMIT_ARG /* nothing */ +#endif + +static char * +_nc_vischar(char *tp, unsigned c LIMIT_ARG) +{ + if (tp == NULL) { + return NULL; + } else if (c == '"' || c == '\\') { + *tp++ = '\\'; + *tp++ = (char) c; + } else if (is7bits((int) c) && (isgraph((int) c) || c == ' ')) { + *tp++ = (char) c; + } else if (c == '\n') { + *tp++ = '\\'; + *tp++ = 'n'; + } else if (c == '\r') { + *tp++ = '\\'; + *tp++ = 'r'; + } else if (c == '\b') { + *tp++ = '\\'; + *tp++ = 'b'; + } else if (c == '\t') { + *tp++ = '\\'; + *tp++ = 't'; + } else if (c == '\033') { + *tp++ = '\\'; + *tp++ = 'e'; + } else if (UChar(c) == 0x7f) { + *tp++ = '\\'; + *tp++ = '^'; + *tp++ = '?'; + } else if (is7bits(c) && iscntrl(UChar(c))) { + *tp++ = '\\'; + *tp++ = '^'; + *tp++ = (char) ('@' + c); + } else { + _nc_SPRINTF(tp, _nc_SLIMIT(limit) + "\\%03lo", (unsigned long) ChCharOf(c)); + tp += strlen(tp); + } + *tp = 0; + return tp; +} + +static const char * +_nc_visbuf2n(int bufnum, const char *buf, int len) +{ + const char *vbuf = 0; + char *tp; + int count; + + if (buf == 0) + return ("(null)"); + if (buf == CANCELLED_STRING) + return ("(cancelled)"); + + if (len < 0) + len = (int) strlen(buf); + + count = len; +#ifdef TRACE + vbuf = tp = _nc_trace_buf(bufnum, NormalLen(len)); +#else + { + static char *mybuf[NUM_VISBUFS]; + int c; + + if (bufnum < 0) { + for (c = 0; c < NUM_VISBUFS; ++c) { + FreeAndNull(mybuf[c]); + } + tp = 0; + } else { + mybuf[bufnum] = typeRealloc(char, NormalLen(len), mybuf[bufnum]); + vbuf = tp = mybuf[bufnum]; + } + } +#endif + if (tp != 0) { + int c; + + *tp++ = D_QUOTE; + while ((--count >= 0) && (c = *buf++) != '\0') { + tp = VisChar(tp, UChar(c), NormalLen(len)); + } + *tp++ = D_QUOTE; + *tp = '\0'; + } else { + vbuf = ("(_nc_visbuf2n failed)"); + } + return (vbuf); +} + +NCURSES_EXPORT(const char *) +_nc_visbuf2(int bufnum, const char *buf) +{ + return _nc_visbuf2n(bufnum, buf, -1); +} + +NCURSES_EXPORT(const char *) +_nc_visbuf(const char *buf) +{ + return _nc_visbuf2(0, buf); +} + +NCURSES_EXPORT(const char *) +_nc_visbufn(const char *buf, int len) +{ + return _nc_visbuf2n(0, buf, len); +} + +#ifdef TRACE +#if USE_WIDEC_SUPPORT + +#if defined(USE_TERMLIB) +#define _nc_wchstrlen _my_wchstrlen +static int +_nc_wchstrlen(const cchar_t *s) +{ + int result = 0; + while (CharOf(s[result]) != L'\0') { + result++; + } + return result; +} +#endif + +static const char * +_nc_viswbuf2n(int bufnum, const wchar_t *buf, int len) +{ + const char *vbuf; + char *tp; + int count; + + if (buf == 0) + return ("(null)"); + + if (len < 0) + len = (int) wcslen(buf); + + count = len; +#ifdef TRACE + vbuf = tp = _nc_trace_buf(bufnum, WideLen(len)); +#else + { + static char *mybuf[NUM_VISBUFS]; + mybuf[bufnum] = typeRealloc(char, WideLen(len), mybuf[bufnum]); + vbuf = tp = mybuf[bufnum]; + } +#endif + if (tp != 0) { + wchar_t c; + + *tp++ = D_QUOTE; + while ((--count >= 0) && (c = *buf++) != '\0') { + char temp[CCHARW_MAX + 80]; + int j = wctomb(temp, c), k; + if (j <= 0) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "\\u%08X", (unsigned) c); + j = (int) strlen(temp); + } + for (k = 0; k < j; ++k) { + tp = VisChar(tp, UChar(temp[k]), WideLen(len)); + } + } + *tp++ = D_QUOTE; + *tp = '\0'; + } else { + vbuf = ("(_nc_viswbuf2n failed)"); + } + return (vbuf); +} + +NCURSES_EXPORT(const char *) +_nc_viswbuf2(int bufnum, const wchar_t *buf) +{ + return _nc_viswbuf2n(bufnum, buf, -1); +} + +NCURSES_EXPORT(const char *) +_nc_viswbuf(const wchar_t *buf) +{ + return _nc_viswbuf2(0, buf); +} + +NCURSES_EXPORT(const char *) +_nc_viswbufn(const wchar_t *buf, int len) +{ + return _nc_viswbuf2n(0, buf, len); +} + +/* this special case is used for wget_wstr() */ +NCURSES_EXPORT(const char *) +_nc_viswibuf(const wint_t *buf) +{ + static wchar_t *mybuf; + static unsigned mylen; + unsigned n; + + for (n = 0; buf[n] != 0; ++n) { + ; /* empty */ + } + if (mylen < ++n) { + mylen = n + 80; + if (mybuf != 0) + mybuf = typeRealloc(wchar_t, mylen, mybuf); + else + mybuf = typeMalloc(wchar_t, mylen); + } + if (mybuf != 0) { + for (n = 0; buf[n] != 0; ++n) { + mybuf[n] = (wchar_t) buf[n]; + } + mybuf[n] = L'\0'; + } + + return _nc_viswbuf2(0, mybuf); +} +#endif /* USE_WIDEC_SUPPORT */ + +/* use these functions for displaying parts of a line within a window */ +NCURSES_EXPORT(const char *) +_nc_viscbuf2(int bufnum, const NCURSES_CH_T *buf, int len) +{ + char *result = _nc_trace_buf(bufnum, (size_t) BUFSIZ); + + if (result != 0) { + int first = 0; + +#if USE_WIDEC_SUPPORT + if (len < 0) + len = _nc_wchstrlen(buf); +#endif /* USE_WIDEC_SUPPORT */ + + /* + * Display one or more strings followed by attributes. + */ + while (first < len) { + attr_t attr = AttrOf(buf[first]); + int last = len - 1; + int j; + + for (j = first + 1; j < len; ++j) { + if (!SameAttrOf(buf[j], buf[first])) { + last = j - 1; + break; + } + } + + (void) _nc_trace_bufcat(bufnum, l_brace); + (void) _nc_trace_bufcat(bufnum, d_quote); + for (j = first; j <= last; ++j) { + const char *found = _nc_altcharset_name(attr, (chtype) + CharOf(buf[j])); + if (found != 0) { + (void) _nc_trace_bufcat(bufnum, found); + attr &= ~A_ALTCHARSET; + } else +#if USE_WIDEC_SUPPORT + if (!isWidecExt(buf[j])) { + PUTC_DATA; + + for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { + int k; + char temp[80]; + + PUTC_ch = buf[j].chars[PUTC_i]; + if (PUTC_ch == L'\0') { + if (PUTC_i == 0) + (void) _nc_trace_bufcat(bufnum, "\\000"); + break; + } + PUTC_INIT; + PUTC_n = (int) wcrtomb(PUTC_buf, + buf[j].chars[PUTC_i], &PUT_st); + if (PUTC_n <= 0 || buf[j].chars[PUTC_i] > 255) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "{%d:\\u%lx}", + _nc_wacs_width(buf[j].chars[PUTC_i]), + (unsigned long) buf[j].chars[PUTC_i]); + (void) _nc_trace_bufcat(bufnum, temp); + break; + } + for (k = 0; k < PUTC_n; k++) { + VisChar(temp, UChar(PUTC_buf[k]), sizeof(temp)); + (void) _nc_trace_bufcat(bufnum, temp); + } + } + } +#else + { + char temp[80]; + VisChar(temp, UChar(buf[j]), sizeof(temp)); + (void) _nc_trace_bufcat(bufnum, temp); + } +#endif /* USE_WIDEC_SUPPORT */ + } + (void) _nc_trace_bufcat(bufnum, d_quote); + if (attr != A_NORMAL) { + (void) _nc_trace_bufcat(bufnum, " | "); + (void) _nc_trace_bufcat(bufnum, _traceattr2(bufnum + 20, attr)); + } + result = _nc_trace_bufcat(bufnum, r_brace); + first = last + 1; + } + } + return result; +} + +NCURSES_EXPORT(const char *) +_nc_viscbuf(const NCURSES_CH_T *buf, int len) +{ + return _nc_viscbuf2(0, buf, len); +} +#endif /* TRACE */ diff --git a/contrib/ncurses/ncurses/tty/MKexpanded.sh b/contrib/ncurses/ncurses/tty/MKexpanded.sh new file mode 100755 index 00000000..0072be2c --- /dev/null +++ b/contrib/ncurses/ncurses/tty/MKexpanded.sh @@ -0,0 +1,136 @@ +#! /bin/sh +############################################################################## +# Copyright 2019-2020,2021 Thomas E. Dickey # +# Copyright 1998-2015,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey, 1997-on +# +# $Id: MKexpanded.sh,v 1.24 2022/02/05 17:27:18 tom Exp $ +# +# Script to generate 'expanded.c', a dummy source that contains functions +# corresponding to complex macros used in this library. By making functions, +# we simplify analysis and debugging. + +if test $# != 0; then +preprocessor="$1" +else +preprocessor="cc -E" +fi +shift +if test $# != 0 ; then + preprocessor="$preprocessor $*" +else + preprocessor="$preprocessor -DHAVE_CONFIG_H -I. -I../include" +fi + +TMP=gen$$.c +trap "rm -f $TMP; exit 1" 1 2 3 15 +trap "rm -f $TMP" 0 + +cat < + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +#if NCURSES_EXPANDED +EOF + +cat >$TMP < +#undef NCURSES_EXPANDED /* this probably is set in ncurses_cfg.h */ +#include +/* these are names we'd like to see */ +#undef ALL_BUT_COLOR +#undef PAIR_NUMBER +#undef TRUE +#undef FALSE +/* this is a marker */ +IGNORE +NCURSES_EXPORT(void) +_nc_toggle_attr_on (attr_t *S, attr_t at) +{ + toggle_attr_on(*S,at); +} + +NCURSES_EXPORT(void) +_nc_toggle_attr_off (attr_t *S, attr_t at) +{ + toggle_attr_off(*S,at); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_DelCharCost) (NCURSES_SP_DCLx int count) +{ + return DelCharCost(SP_PARM, count); +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_InsCharCost) (NCURSES_SP_DCLx int count) +{ + return InsCharCost(SP_PARM, count); +} + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_UpdateAttrs) (NCURSES_SP_DCLx CARG_CH_T c) +{ + UpdateAttrs(SP_PARM, CHDEREF(c)); +} + +@if_NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_DelCharCost (int count) +{ + return NCURSES_SP_NAME(_nc_DelCharCost) (CURRENT_SCREEN, count); +} + +NCURSES_EXPORT(int) +_nc_InsCharCost (int count) +{ + return NCURSES_SP_NAME(_nc_InsCharCost)(CURRENT_SCREEN, count); +} + +NCURSES_EXPORT(void) +_nc_UpdateAttrs (CARG_CH_T c) +{ + NCURSES_SP_NAME(_nc_UpdateAttrs)(CURRENT_SCREEN,c); +} +@endif +EOF + +$preprocessor $TMP 2>/dev/null | \ + sed -e '1,/^IGNORE$/d' -e 's/^@/#/' -e 's/^#[ ]*if_/#if /' -e "s,$TMP,expanded.c," + +cat < 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Alexander V Lukyanov 1997-1998 * + ****************************************************************************/ + +/****************************************************************************** + +NAME + hardscroll.c -- hardware-scrolling optimization for ncurses + +SYNOPSIS + void _nc_scroll_optimize(void) + +DESCRIPTION + OVERVIEW + +This algorithm for computes optimum hardware scrolling to transform an +old screen (curscr) into a new screen (newscr) via vertical line moves. + +Because the screen has a `grain' (there are insert/delete/scroll line +operations but no insert/delete/scroll column operations), it is efficient +break the update algorithm into two pieces: a first stage that does only line +moves, optimizing the end product of user-invoked insertions, deletions, and +scrolls; and a second phase (corresponding to the present doupdate code in +ncurses) that does only line transformations. + +The common case we want hardware scrolling for is to handle line insertions +and deletions in screen-oriented text-editors. This two-stage approach will +accomplish that at a low computation and code-size cost. + + LINE-MOVE COMPUTATION + +Now, to a discussion of the line-move computation. + +For expository purposes, consider the screen lines to be represented by +integers 0..23 (with the understanding that the value of 23 may vary). +Let a new line introduced by insertion, scrolling, or at the bottom of +the screen following a line delete be given the index -1. + +Assume that the real screen starts with lines 0..23. Now, we have +the following possible line-oriented operations on the screen: + +Insertion: inserts a line at a given screen row, forcing all lines below +to scroll forward. The last screen line is lost. For example, an insertion +at line 5 would produce: 0..4 -1 5..23. + +Deletion: deletes a line at a given screen row, forcing all lines below +to scroll forward. The last screen line is made new. For example, a deletion +at line 7 would produce: 0..6 8..23 -1. + +Scroll up: move a range of lines up 1. The bottom line of the range +becomes new. For example, scrolling up the region from 9 to 14 will +produce 0..8 10..14 -1 15..23. + +Scroll down: move a range of lines down 1. The top line of the range +becomes new. For example, scrolling down the region from 12 to 16 will produce +0..11 -1 12..15 17..23. + +Now, an obvious property of all these operations is that they preserve the +order of old lines, though not their position in the sequence. + +The key trick of this algorithm is that the original line indices described +above are actually maintained as _line[].oldindex fields in the window +structure, and stick to each line through scroll and insert/delete operations. + +Thus, it is possible at update time to look at the oldnum fields and compute +an optimal set of il/dl/scroll operations that will take the real screen +lines to the virtual screen lines. Once these vertical moves have been done, +we can hand off to the second stage of the update algorithm, which does line +transformations. + +Note that the move computation does not need to have the full generality +of a diff algorithm (which it superficially resembles) because lines cannot +be moved out of order. + + THE ALGORITHM + +The scrolling is done in two passes. The first pass is from top to bottom +scroling hunks UP. The second one is from bottom to top scrolling hunks DOWN. +Obviously enough, no lines to be scrolled will be destroyed. (lav) + +HOW TO TEST THIS: + +Use the following production: + +hardscroll: hardscroll.c + $(CC) -g -DSCROLLDEBUG hardscroll.c -o hardscroll + +Then just type scramble vectors and watch. The following test loads are +a representative sample of cases: + +----------------------------- CUT HERE ------------------------------------ +# No lines moved + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 +# +# A scroll up + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 -1 +# +# A scroll down +-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 +# +# An insertion (after line 12) + 0 1 2 3 4 5 6 7 8 9 10 11 12 -1 13 14 15 16 17 18 19 20 21 22 +# +# A simple deletion (line 10) + 0 1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 21 22 23 -1 +# +# A more complex case +-1 -1 -1 -1 -1 3 4 5 6 7 -1 -1 8 9 10 11 12 13 14 15 16 17 -1 -1 +----------------------------- CUT HERE ------------------------------------ + +AUTHOR + Eric S. Raymond , November 1994 + New algorithm by Alexander V. Lukyanov , Aug 1997 + +*****************************************************************************/ + +#include + +MODULE_ID("$Id: hardscroll.c,v 1.58 2023/09/09 16:04:08 Nicholas.Marriott Exp $") + +#if defined(SCROLLDEBUG) || defined(HASHDEBUG) + +# undef screen_lines +# define screen_lines(sp) MAXLINES +NCURSES_EXPORT_VAR (int) + oldnums[MAXLINES]; +# define OLDNUM(sp,n) oldnums[n] +# define _tracef printf +# undef TR +# define TR(n, a) if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); } + +extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing; + +#else /* no debug */ + +/* OLDNUM(n) indicates which line will be shifted to the position n. + if OLDNUM(n) == _NEWINDEX, then the line n in new, not shifted from + somewhere. */ +NCURSES_EXPORT_VAR (int *) + _nc_oldnums = 0; /* obsolete: keep for ABI compat */ + +# if USE_HASHMAP +# define oldnums(sp) (sp)->_oldnum_list +# define OLDNUM(sp,n) oldnums(sp)[n] +# else /* !USE_HASHMAP */ +# define OLDNUM(sp,n) NewScreen(sp)->_line[n].oldindex +# endif /* !USE_HASHMAP */ + +#define OLDNUM_SIZE(sp) (sp)->_oldnum_size + +#endif /* defined(SCROLLDEBUG) || defined(HASHDEBUG) */ + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_scroll_optimize) (NCURSES_SP_DCL0) +/* scroll optimization to transform curscr to newscr */ +{ + int i; + int start, end, shift; + + TR(TRACE_ICALLS, (T_CALLED("_nc_scroll_optimize(%p)"), (void *) SP_PARM)); + +#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG) +#if USE_HASHMAP + /* get enough storage */ + assert(OLDNUM_SIZE(SP_PARM) >= 0); + assert(screen_lines(SP_PARM) > 0); + if ((oldnums(SP_PARM) == 0) + || (OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM))) { + int need_lines = ((OLDNUM_SIZE(SP_PARM) < screen_lines(SP_PARM)) + ? screen_lines(SP_PARM) + : OLDNUM_SIZE(SP_PARM)); + int *new_oldnums = typeRealloc(int, + (size_t) need_lines, + oldnums(SP_PARM)); + if (!new_oldnums) { + TR(TRACE_ICALLS, (T_RETURN(""))); + return; + } + oldnums(SP_PARM) = new_oldnums; + OLDNUM_SIZE(SP_PARM) = need_lines; + } + /* calculate the indices */ + NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_ARG); + if (SP_PARM->hashtab_len < screen_lines(SP_PARM)) { + TR(TRACE_ICALLS, (T_RETURN(""))); + return; + } +#endif +#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */ + +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE | TRACE_MOVE)) { + NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_ARG); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + + /* pass 1 - from top to bottom scrolling up */ + for (i = 0; i < screen_lines(SP_PARM);) { + while (i < screen_lines(SP_PARM) + && (OLDNUM(SP_PARM, i) == _NEWINDEX || OLDNUM(SP_PARM, i) <= i)) + i++; + if (i >= screen_lines(SP_PARM)) + break; + + shift = OLDNUM(SP_PARM, i) - i; /* shift > 0 */ + start = i; + + i++; + while (i < screen_lines(SP_PARM) + && OLDNUM(SP_PARM, i) != _NEWINDEX + && OLDNUM(SP_PARM, i) - i == shift) + i++; + end = i - 1 + shift; + + TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", start, end, shift)); +#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG) + if (NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_ARGx + shift, + start, + end, + screen_lines(SP_PARM) - 1) == ERR) { + TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll")); + continue; + } +#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */ + } + + /* pass 2 - from bottom to top scrolling down */ + for (i = screen_lines(SP_PARM) - 1; i >= 0;) { + while (i >= 0 + && (OLDNUM(SP_PARM, i) == _NEWINDEX + || OLDNUM(SP_PARM, i) >= i)) { + i--; + } + if (i < 0) + break; + + shift = OLDNUM(SP_PARM, i) - i; /* shift < 0 */ + end = i; + + i--; + while (i >= 0 + && OLDNUM(SP_PARM, i) != _NEWINDEX + && OLDNUM(SP_PARM, i) - i == shift) { + i--; + } + start = i + 1 - (-shift); + + TR(TRACE_UPDATE | TRACE_MOVE, ("scroll [%d, %d] by %d", start, end, shift)); +#if !defined(SCROLLDEBUG) && !defined(HASHDEBUG) + if (NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_ARGx + shift, + start, + end, + screen_lines(SP_PARM) - 1) == ERR) { + TR(TRACE_UPDATE | TRACE_MOVE, ("unable to scroll")); + continue; + } +#endif /* !defined(SCROLLDEBUG) && !defined(HASHDEBUG) */ + } + TR(TRACE_ICALLS, (T_RETURN(""))); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_scroll_optimize(void) +{ + NCURSES_SP_NAME(_nc_scroll_optimize) (CURRENT_SCREEN); +} +#endif + +#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG) +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_linedump) (NCURSES_SP_DCL0) +/* dump the state of the real and virtual oldnum fields */ +{ + if (USE_TRACEF(TRACE_UPDATE | TRACE_MOVE)) { + char *buf = 0; + size_t want = ((size_t) screen_lines(SP_PARM) + 1) * 4; + (void) SP_PARM; + + if ((buf = typeMalloc(char, want)) != 0) { + int n; + + *buf = '\0'; + for (n = 0; n < screen_lines(SP_PARM); n++) { + int number = OLDNUM(SP_PARM, n); + if (number >= -99 && number < 999) { + _nc_SPRINTF(buf + strlen(buf), + _nc_SLIMIT(want - strlen(buf)) + " %02d", number); + } else { + _nc_STRCAT(buf, " ??", want - strlen(buf)); + } + } + free(buf); + } + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_linedump(void) +{ + NCURSES_SP_NAME(_nc_linedump) (CURRENT_SCREEN); +} +#endif + +#endif /* defined(TRACE) || defined(SCROLLDEBUG) */ + +#ifdef SCROLLDEBUG + +int +main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) +{ + char line[BUFSIZ], *st; + +#ifdef TRACE + _nc_tracing = TRACE_MOVE; +#endif + for (;;) { + int n; + + for (n = 0; n < screen_lines(sp); n++) + oldnums[n] = _NEWINDEX; + + /* grab the test vector */ + if (fgets(line, sizeof(line), stdin) == (char *) NULL) + exit(EXIT_SUCCESS); + + /* parse it */ + n = 0; + if (line[0] == '#') { + (void) fputs(line, stderr); + continue; + } + st = strtok(line, " "); + do { + oldnums[n++] = atoi(st); + } while + ((st = strtok((char *) NULL, " ")) != 0); + + /* display it */ + (void) fputs("Initial input:\n", stderr); + _nc_linedump(); + + _nc_scroll_optimize(); + } +} + +#endif /* SCROLLDEBUG */ + +/* hardscroll.c ends here */ diff --git a/contrib/ncurses/ncurses/tty/hashmap.c b/contrib/ncurses/ncurses/tty/hashmap.c new file mode 100644 index 00000000..3b396a0c --- /dev/null +++ b/contrib/ncurses/ncurses/tty/hashmap.c @@ -0,0 +1,594 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/****************************************************************************** + +NAME + hashmap.c -- fill in scramble vector based on text hashes + +SYNOPSIS + void _nc_hash_map(void) + +DESCRIPTION: + This code attempts to recognize pairs of old and new lines in the physical +and virtual screens. When a line pair is recognized, the old line index is +placed in the oldindex member of the virtual screen line, to be used by the +vertical-motion optimizer portion of the update logic (see hardscroll.c). + + Line pairs are recognized by applying a modified Heckel's algorithm, +sped up by hashing. If a line hash is unique in both screens, those +lines must be a pair. Then if the lines just before or after the pair +are the same or similar, they are a pair too. + + We don't worry about false pairs produced by hash collisions, on the +assumption that such cases are rare and will only make the latter stages +of update less efficient, not introduce errors. + +HOW TO TEST THIS: + +Use the following production: + +hashmap: hashmap.c + $(CC) -g -DHASHDEBUG hashmap.c hardscroll.c ../objects/lib_trace.o -o hashmap + +AUTHOR + Eric S. Raymond , May 1996 + Bug fixes and improvements by Alexander V. Lukyanov , 1997 + +*****************************************************************************/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: hashmap.c,v 1.72 2024/07/27 19:22:23 tom Exp $") + +#ifdef HASHDEBUG + +# define _tracef printf +# undef TR +# ifdef TRACE +# define TR(n, a) if (_nc_tracing & (n)) { _tracef a ; putchar('\n'); } +# else +# define TR(n, a) { _tracef a ; putchar('\n'); } +# endif +# undef screen_lines +# define screen_lines(sp) MAXLINES +# define TEXTWIDTH(sp) 1 +static int oldnums[MAXLINES], reallines[MAXLINES]; +static NCURSES_CH_T oldtext[MAXLINES][TEXTWIDTH(sp)]; +static NCURSES_CH_T newtext[MAXLINES][TEXTWIDTH(sp)]; +# define OLDNUM(sp,n) oldnums[n] +# define OLDTEXT(sp,n) oldtext[n] +# define NEWTEXT(sp,m) newtext[m] +# define PENDING(sp,n) 1 + +#else /* !HASHDEBUG */ + +# define OLDNUM(sp,n) (sp)->_oldnum_list[n] +# define OLDTEXT(sp,n) CurScreen(sp)->_line[n].text +# define NEWTEXT(sp,m) NewScreen(sp)->_line[m].text +# define TEXTWIDTH(sp) (CurScreen(sp)->_maxx + 1) +# define PENDING(sp,n) (NewScreen(sp)->_line[n].firstchar != _NOCHANGE) + +#endif /* !HASHDEBUG */ + +#define oldhash(sp) ((sp)->oldhash) +#define newhash(sp) ((sp)->newhash) +#define hashtab(sp) ((sp)->hashtab) +#define lines_alloc(sp) ((sp)->hashtab_len) + +#if USE_WIDEC_SUPPORT +#define HASH_VAL(ch) (ch.chars[0]) +#else +#define HASH_VAL(ch) (ch) +#endif + +static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); + +static NCURSES_INLINE unsigned long +hash(SCREEN *sp, const NCURSES_CH_T *text) +{ + int i; + unsigned long result = 0; + (void) sp; + + for (i = TEXTWIDTH(sp); i > 0; i--) { + NCURSES_CH_T ch = *text++; + result += (result << 5) + (unsigned long) HASH_VAL(ch); + } + return result; +} + +/* approximate update cost */ +static int +update_cost(SCREEN *sp, NCURSES_CH_T *from, NCURSES_CH_T *to) +{ + int cost = 0; + int i; + (void) sp; + + for (i = TEXTWIDTH(sp); i > 0; i--, from++, to++) + if (!(CharEq(*from, *to))) + cost++; + + return cost; +} + +static int +update_cost_from_blank(SCREEN *sp, NCURSES_CH_T *to) +{ + int cost = 0; + int i; + NCURSES_CH_T blank = blankchar; + (void) sp; + + if (back_color_erase) + SetPair(blank, GetPair(stdscr->_nc_bkgd)); + + for (i = TEXTWIDTH(sp); i > 0; i--, to++) + if (!(CharEq(blank, *to))) + cost++; + + return cost; +} + +/* + * Returns true when moving line 'from' to line 'to' seems to be cost + * effective. 'blank' indicates whether the line 'to' would become blank. + */ +static NCURSES_INLINE bool +cost_effective(SCREEN *sp, const int from, const int to, const int blank) +{ + int new_from; + + if (from == to) + return FALSE; + + new_from = OLDNUM(sp, from); + if (new_from == _NEWINDEX) + new_from = from; + + /* + * On the left side of >= is the cost before moving; + * on the right side -- cost after moving. + */ + return (((blank ? update_cost_from_blank(sp, NEWTEXT(sp, to)) + : update_cost(sp, OLDTEXT(sp, to), NEWTEXT(sp, to))) + + update_cost(sp, OLDTEXT(sp, new_from), NEWTEXT(sp, from))) + >= ((new_from == from ? update_cost_from_blank(sp, NEWTEXT(sp, from)) + : update_cost(sp, OLDTEXT(sp, new_from), NEWTEXT(sp, from))) + + update_cost(sp, OLDTEXT(sp, from), NEWTEXT(sp, to)))) + ? TRUE : FALSE; +} + +static void +grow_hunks(SCREEN *sp) +{ + int back_limit; /* limits for cells to fill */ + int back_ref_limit; /* limit for references */ + int i; + int next_hunk; + + /* + * This is tricky part. We have unique pairs to use as anchors. + * Use these to deduce the presence of spans of identical lines. + */ + back_limit = 0; + back_ref_limit = 0; + + i = 0; + while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX) + i++; + for (; i < screen_lines(sp); i = next_hunk) { + int forward_limit; + int forward_ref_limit; + int end; + int start = i; + int shift = OLDNUM(sp, i) - i; + + /* get forward limit */ + i = start + 1; + while (i < screen_lines(sp) + && OLDNUM(sp, i) != _NEWINDEX + && OLDNUM(sp, i) - i == shift) + i++; + end = i; + while (i < screen_lines(sp) && OLDNUM(sp, i) == _NEWINDEX) + i++; + next_hunk = i; + forward_limit = i; + if (i >= screen_lines(sp) || OLDNUM(sp, i) >= i) + forward_ref_limit = i; + else + forward_ref_limit = OLDNUM(sp, i); + + i = start - 1; + /* grow back */ + if (shift < 0) + back_limit = back_ref_limit + (-shift); + while (i >= back_limit) { + if (newhash(sp)[i] == oldhash(sp)[i + shift] + || cost_effective(sp, i + shift, i, shift < 0)) { + OLDNUM(sp, i) = i + shift; + TR(TRACE_UPDATE | TRACE_MOVE, + ("connected new line %d to old line %d (backward continuation)", + i, i + shift)); + } else { + TR(TRACE_UPDATE | TRACE_MOVE, + ("not connecting new line %d to old line %d (backward continuation)", + i, i + shift)); + break; + } + i--; + } + + i = end; + /* grow forward */ + if (shift > 0) + forward_limit = forward_ref_limit - shift; + while (i < forward_limit) { + if (newhash(sp)[i] == oldhash(sp)[i + shift] + || cost_effective(sp, i + shift, i, shift > 0)) { + OLDNUM(sp, i) = i + shift; + TR(TRACE_UPDATE | TRACE_MOVE, + ("connected new line %d to old line %d (forward continuation)", + i, i + shift)); + } else { + TR(TRACE_UPDATE | TRACE_MOVE, + ("not connecting new line %d to old line %d (forward continuation)", + i, i + shift)); + break; + } + i++; + } + + back_ref_limit = back_limit = i; + if (shift > 0) + back_ref_limit += shift; + } +} + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_hash_map) (NCURSES_SP_DCL0) +{ + HASHMAP *hsp; + register int i; + + if (screen_lines(SP_PARM) > lines_alloc(SP_PARM)) { + if (hashtab(SP_PARM)) + free(hashtab(SP_PARM)); + hashtab(SP_PARM) = typeMalloc(HASHMAP, + ((size_t) screen_lines(SP_PARM) + 1) * 2); + if (!hashtab(SP_PARM)) { + if (oldhash(SP_PARM)) { + FreeAndNull(oldhash(SP_PARM)); + } + lines_alloc(SP_PARM) = 0; + return; + } + lines_alloc(SP_PARM) = screen_lines(SP_PARM); + } + + if (oldhash(SP_PARM) && newhash(SP_PARM)) { + /* re-hash only changed lines */ + for (i = 0; i < screen_lines(SP_PARM); i++) { + if (PENDING(SP_PARM, i)) + newhash(SP_PARM)[i] = hash(SP_PARM, NEWTEXT(SP_PARM, i)); + } + } else { + /* re-hash all */ + if (oldhash(SP_PARM) == 0) + oldhash(SP_PARM) = typeCalloc(unsigned long, + (size_t) screen_lines(SP_PARM)); + if (newhash(SP_PARM) == 0) + newhash(SP_PARM) = typeCalloc(unsigned long, + (size_t) screen_lines(SP_PARM)); + if (!oldhash(SP_PARM) || !newhash(SP_PARM)) { + FreeAndNull(oldhash(SP_PARM)); + FreeAndNull(newhash(SP_PARM)); + return; /* malloc failure */ + } + for (i = 0; i < screen_lines(SP_PARM); i++) { + newhash(SP_PARM)[i] = hash(SP_PARM, NEWTEXT(SP_PARM, i)); + oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i)); + } + } + +#ifdef HASH_VERIFY + for (i = 0; i < screen_lines(SP_PARM); i++) { + if (newhash(SP_PARM)[i] != hash(SP_PARM, NEWTEXT(SP_PARM, i))) + fprintf(stderr, "error in newhash[%d]\n", i); + if (oldhash(SP_PARM)[i] != hash(SP_PARM, OLDTEXT(SP_PARM, i))) + fprintf(stderr, "error in oldhash[%d]\n", i); + } +#endif + + /* + * Set up and count line-hash values. + */ + memset(hashtab(SP_PARM), '\0', + sizeof(*(hashtab(SP_PARM))) + * ((size_t) screen_lines(SP_PARM) + 1) * 2); + for (i = 0; i < screen_lines(SP_PARM); i++) { + unsigned long hashval = oldhash(SP_PARM)[i]; + + for (hsp = hashtab(SP_PARM); hsp->hashval; hsp++) + if (hsp->hashval == hashval) + break; + hsp->hashval = hashval; /* in case this is a new entry */ + hsp->oldcount++; + hsp->oldindex = i; + } + for (i = 0; i < screen_lines(SP_PARM); i++) { + unsigned long hashval = newhash(SP_PARM)[i]; + + for (hsp = hashtab(SP_PARM); hsp->hashval; hsp++) + if (hsp->hashval == hashval) + break; + hsp->hashval = hashval; /* in case this is a new entry */ + hsp->newcount++; + hsp->newindex = i; + + OLDNUM(SP_PARM, i) = _NEWINDEX; /* initialize old indices array */ + } + + /* + * Mark line pairs corresponding to unique hash pairs. + * + * We don't mark lines with offset 0, because it can make fail + * extending hunks by cost_effective. Otherwise, it does not + * have any side effects. + */ + for (hsp = hashtab(SP_PARM); hsp->hashval; hsp++) + if (hsp->oldcount == 1 && hsp->newcount == 1 + && hsp->oldindex != hsp->newindex) { + TR(TRACE_UPDATE | TRACE_MOVE, + ("new line %d is hash-identical to old line %d (unique)", + hsp->newindex, hsp->oldindex)); + OLDNUM(SP_PARM, hsp->newindex) = hsp->oldindex; + } + + grow_hunks(SP_PARM); + + /* + * Eliminate bad or impossible shifts -- this includes removing + * those hunks which could not grow because of conflicts, as well + * those which are to be moved too far, they are likely to destroy + * more than carry. + */ + for (i = 0; i < screen_lines(SP_PARM);) { + int start, shift, size; + + while (i < screen_lines(SP_PARM) && OLDNUM(SP_PARM, i) == _NEWINDEX) + i++; + if (i >= screen_lines(SP_PARM)) + break; + start = i; + shift = OLDNUM(SP_PARM, i) - i; + i++; + while (i < screen_lines(SP_PARM) + && OLDNUM(SP_PARM, i) != _NEWINDEX + && OLDNUM(SP_PARM, i) - i == shift) + i++; + size = i - start; + if (size < 3 || size + Min(size / 8, 2) < abs(shift)) { + while (start < i) { + OLDNUM(SP_PARM, start) = _NEWINDEX; + start++; + } + } + } + + /* After clearing invalid hunks, try grow the rest. */ + grow_hunks(SP_PARM); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_hash_map(void) +{ + NCURSES_SP_NAME(_nc_hash_map) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_DCLx int i) +{ + if (oldhash(SP_PARM)) + oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i)); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_make_oldhash(int i) +{ + NCURSES_SP_NAME(_nc_make_oldhash) (CURRENT_SCREEN, i); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_scroll_oldhash) (NCURSES_SP_DCLx int n, int top, int bot) +{ + size_t size; + int i; + + if (!oldhash(SP_PARM)) + return; + + size = sizeof(*(oldhash(SP_PARM))) * (size_t) (bot - top + 1 - abs(n)); + if (n > 0) { + memmove(oldhash(SP_PARM) + top, oldhash(SP_PARM) + top + n, size); + for (i = bot; i > bot - n; i--) + oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i)); + } else { + memmove(oldhash(SP_PARM) + top - n, oldhash(SP_PARM) + top, size); + for (i = top; i < top - n; i++) + oldhash(SP_PARM)[i] = hash(SP_PARM, OLDTEXT(SP_PARM, i)); + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_scroll_oldhash(int n, int top, int bot) +{ + NCURSES_SP_NAME(_nc_scroll_oldhash) (CURRENT_SCREEN, n, top, bot); +} +#endif + +#ifdef HASHDEBUG +static void +usage(void) +{ + static const char *table[] = + { + "hashmap test-driver", + "", + "# comment", + "l get initial line number vector", + "n use following letters as text of new lines", + "o use following letters as text of old lines", + "d dump state of test arrays", + "h apply hash mapper and see scroll optimization", + "? this message" + }; + size_t n; + for (n = 0; n < sizeof(table) / sizeof(table[0]); n++) + fprintf(stderr, "%s\n", table[n]); +} + +int +main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) +{ + char line[BUFSIZ], *st; + int n; + + if (setupterm(NULL, fileno(stdout), (int *) 0) == ERR) + return EXIT_FAILURE; + (void) _nc_alloc_screen(); + + for (n = 0; n < screen_lines(sp); n++) { + reallines[n] = n; + oldnums[n] = _NEWINDEX; + CharOf(oldtext[n][0]) = CharOf(newtext[n][0]) = '.'; + } + + if (NC_ISATTY(fileno(stdin))) + usage(); + +#ifdef TRACE + _nc_tracing = TRACE_MOVE; +#endif + for (;;) { + /* grab a test command */ + if (fgets(line, sizeof(line), stdin) == (char *) NULL) + break; + + switch (line[0]) { + case '#': /* comment */ + (void) fputs(line, stderr); + break; + + case 'l': /* get initial line number vector */ + for (n = 0; n < screen_lines(sp); n++) { + reallines[n] = n; + oldnums[n] = _NEWINDEX; + } + n = 0; + st = strtok(line, " "); + do { + oldnums[n++] = atoi(st); + } while + ((st = strtok((char *) NULL, " ")) != 0); + break; + + case 'n': /* use following letters as text of new lines */ + for (n = 0; n < screen_lines(sp); n++) + CharOf(newtext[n][0]) = '.'; + for (n = 0; n < screen_lines(sp); n++) + if (line[n + 1] == '\n') + break; + else + CharOf(newtext[n][0]) = line[n + 1]; + break; + + case 'o': /* use following letters as text of old lines */ + for (n = 0; n < screen_lines(sp); n++) + CharOf(oldtext[n][0]) = '.'; + for (n = 0; n < screen_lines(sp); n++) + if (line[n + 1] == '\n') + break; + else + CharOf(oldtext[n][0]) = line[n + 1]; + break; + + case 'd': /* dump state of test arrays */ +#ifdef TRACE + _nc_linedump(); +#endif + (void) fputs("Old lines: [", stdout); + for (n = 0; n < screen_lines(sp); n++) + putchar(CharOf(oldtext[n][0])); + putchar(']'); + putchar('\n'); + (void) fputs("New lines: [", stdout); + for (n = 0; n < screen_lines(sp); n++) + putchar(CharOf(newtext[n][0])); + putchar(']'); + putchar('\n'); + break; + + case 'h': /* apply hash mapper and see scroll optimization */ + _nc_hash_map(); + (void) fputs("Result:\n", stderr); +#ifdef TRACE + _nc_linedump(); +#endif + _nc_scroll_optimize(); + (void) fputs("Done.\n", stderr); + break; + default: + case '?': + usage(); + break; + } + } + exit_curses(EXIT_SUCCESS); +} + +#endif /* HASHDEBUG */ + +/* hashmap.c ends here */ diff --git a/contrib/ncurses/ncurses/tty/lib_mvcur.c b/contrib/ncurses/ncurses/tty/lib_mvcur.c new file mode 100644 index 00000000..8fad93c7 --- /dev/null +++ b/contrib/ncurses/ncurses/tty/lib_mvcur.c @@ -0,0 +1,1435 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* +** lib_mvcur.c +** +** The routines for moving the physical cursor and scrolling: +** +** void _nc_mvcur_init(void) +** +** void _nc_mvcur_resume(void) +** +** int mvcur(int old_y, int old_x, int new_y, int new_x) +** +** void _nc_mvcur_wrap(void) +** +** Comparisons with older movement optimizers: +** SVr3 curses mvcur() can't use cursor_to_ll or auto_left_margin. +** 4.4BSD curses can't use cuu/cud/cuf/cub/hpa/vpa/tab/cbt for local +** motions. It doesn't use tactics based on auto_left_margin. Weirdly +** enough, it doesn't use its own hardware-scrolling routine to scroll up +** destination lines for out-of-bounds addresses! +** old ncurses optimizer: less accurate cost computations (in fact, +** it was broken and had to be commented out!). +** +** Compile with -DMAIN to build an interactive tester/timer for the movement +** optimizer. You can use it to investigate the optimizer's behavior. +** You can also use it for tuning the formulas used to determine whether +** or not full optimization is attempted. +** +** This code has a nasty tendency to find bugs in terminfo entries, because it +** exercises the non-cup movement capabilities heavily. If you think you've +** found a bug, try deleting subsets of the following capabilities (arranged +** in decreasing order of suspiciousness): it, tab, cbt, hpa, vpa, cuu, cud, +** cuf, cub, cuu1, cud1, cuf1, cub1. It may be that one or more are wrong. +** +** Note: you should expect this code to look like a resource hog in a profile. +** That's because it does a lot of I/O, through the tputs() calls. The I/O +** cost swamps the computation overhead (and as machines get faster, this +** will become even more true). Comments in the test exerciser at the end +** go into detail about tuning and how you can gauge the optimizer's +** effectiveness. +**/ + +/**************************************************************************** + * + * Constants and macros for optimizer tuning. + * + ****************************************************************************/ + +/* + * The average overhead of a full optimization computation in character + * transmission times. If it is too high, the algorithm will be a bit + * over-biased toward using cup rather than local motions; if it is too + * low, the algorithm may spend more time than is strictly optimal + * looking for non-cup motions. Profile the optimizer using the `t' + * command of the exerciser (see below), and round to the nearest integer. + * + * Yes, I (esr) thought about computing expected overhead dynamically, say + * by derivation from a running average of optimizer times. But the + * whole point of this optimization is to *decrease* the frequency of + * system calls. :-) + */ +#define COMPUTE_OVERHEAD 1 /* I use a 90MHz Pentium @ 9.6Kbps */ + +/* + * LONG_DIST is the distance we consider to be just as costly to move over as a + * cup sequence is to emit. In other words, it is the length of a cup sequence + * adjusted for average computation overhead. The magic number is the length + * of "\033[yy;xxH", the typical cup sequence these days. + */ +#define LONG_DIST (8 - COMPUTE_OVERHEAD) + +/* + * Tell whether a motion is optimizable by local motions. Needs to be cheap to + * compute. In general, all the fast moves go to either the right or left edge + * of the screen. So any motion to a location that is (a) further away than + * LONG_DIST and (b) further inward from the right or left edge than LONG_DIST, + * we'll consider nonlocal. + */ +#define NOT_LOCAL(sp, fy, fx, ty, tx) ((tx > LONG_DIST) \ + && (tx < screen_columns(sp) - 1 - LONG_DIST) \ + && (abs(ty-fy) + abs(tx-fx) > LONG_DIST)) + +/**************************************************************************** + * + * External interfaces + * + ****************************************************************************/ + +/* + * For this code to work OK, the following components must live in the + * screen structure: + * + * int _char_padding; // cost of character put + * int _cr_cost; // cost of (carriage_return) + * int _cup_cost; // cost of (cursor_address) + * int _home_cost; // cost of (cursor_home) + * int _ll_cost; // cost of (cursor_to_ll) + *#if USE_HARD_TABS + * int _ht_cost; // cost of (tab) + * int _cbt_cost; // cost of (back_tab) + *#endif USE_HARD_TABS + * int _cub1_cost; // cost of (cursor_left) + * int _cuf1_cost; // cost of (cursor_right) + * int _cud1_cost; // cost of (cursor_down) + * int _cuu1_cost; // cost of (cursor_up) + * int _cub_cost; // cost of (parm_cursor_left) + * int _cuf_cost; // cost of (parm_cursor_right) + * int _cud_cost; // cost of (parm_cursor_down) + * int _cuu_cost; // cost of (parm_cursor_up) + * int _hpa_cost; // cost of (column_address) + * int _vpa_cost; // cost of (row_address) + * int _ech_cost; // cost of (erase_chars) + * int _rep_cost; // cost of (repeat_char) + * + * The USE_HARD_TABS switch controls whether it is reliable to use tab/backtabs + * for local motions. On many systems, it is not, due to uncertainties about + * tab delays and whether or not tabs will be expanded in raw mode. If you + * have parm_right_cursor, tab motions don't win you a lot anyhow. + */ + +#include +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_mvcur.c,v 1.161 2023/09/16 16:29:02 tom Exp $") + +#define WANT_CHAR(sp, y, x) NewScreen(sp)->_line[y].text[x] /* desired state */ + +#if NCURSES_SP_FUNCS +#define BAUDRATE(sp) sp->_term->_baudrate /* bits per second */ +#else +#define BAUDRATE(sp) cur_term->_baudrate /* bits per second */ +#endif + +#if defined(MAIN) || defined(NCURSES_TEST) +#include + +static bool profiling = FALSE; +static float diff; +#endif /* MAIN */ + +#undef NCURSES_OUTC_FUNC +#define NCURSES_OUTC_FUNC myOutCh + +#define OPT_SIZE 512 + +static int normalized_cost(NCURSES_SP_DCLx const char *const cap, int affcnt); + +/**************************************************************************** + * + * Initialization/wrapup (including cost pre-computation) + * + ****************************************************************************/ + +#ifdef TRACE +static int +trace_cost_of(NCURSES_SP_DCLx const char *capname, const char *cap, int affcnt) +{ + int result = NCURSES_SP_NAME(_nc_msec_cost) (NCURSES_SP_ARGx cap, affcnt); + TR(TRACE_CHARPUT | TRACE_MOVE, + ("CostOf %s %d %s", capname, result, _nc_visbuf(cap))); + return result; +} +#define CostOf(cap,affcnt) trace_cost_of(NCURSES_SP_ARGx #cap, cap, affcnt) + +static int +trace_normalized_cost(NCURSES_SP_DCLx const char *capname, const char *cap, int affcnt) +{ + int result = normalized_cost(NCURSES_SP_ARGx cap, affcnt); + TR(TRACE_CHARPUT | TRACE_MOVE, + ("NormalizedCost %s %d %s", capname, result, _nc_visbuf(cap))); + return result; +} +#define NormalizedCost(cap,affcnt) trace_normalized_cost(NCURSES_SP_ARGx #cap, cap, affcnt) + +#else + +#define CostOf(cap,affcnt) NCURSES_SP_NAME(_nc_msec_cost)(NCURSES_SP_ARGx cap, affcnt) +#define NormalizedCost(cap,affcnt) normalized_cost(NCURSES_SP_ARGx cap, affcnt) + +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_msec_cost) (NCURSES_SP_DCLx const char *const cap, int affcnt) +/* compute the cost of a given operation */ +{ + if (cap == 0) + return (INFINITY); + else { + const char *cp; + float cum_cost = 0.0; + + for (cp = cap; *cp; cp++) { + /* extract padding, either mandatory or required */ + if (cp[0] == '$' && cp[1] == '<' && strchr(cp, '>')) { + float number = 0.0; + int state = 0; + + for (cp += 2; *cp != '>'; cp++) { + if (isdigit(UChar(*cp))) { + switch (state) { + case 0: + number = number * 10 + (float) (*cp - '0'); + break; + case 2: + number += (float) ((*cp - '0') / 10.0); + ++state; + break; + } + } else if (*cp == '*') { + /* padding is always a suffix */ + if (state < 4) { + number *= (float) affcnt; + state = 4; + } + } else if (*cp == '.') { + /* a single decimal point is allowed */ + state = (state == 0) ? 2 : 3; + } + if (number > MAX_DELAY_MSECS) { + number = MAX_DELAY_MSECS; + break; + } + } + +#if NCURSES_NO_PADDING + if (!GetNoPadding(SP_PARM)) +#endif + cum_cost += number * 10; + } else if (SP_PARM) { + cum_cost += (float) SP_PARM->_char_padding; + } + } + + return ((int) cum_cost); + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_msec_cost(const char *const cap, int affcnt) +{ + return NCURSES_SP_NAME(_nc_msec_cost) (CURRENT_SCREEN, cap, affcnt); +} +#endif + +static int +normalized_cost(NCURSES_SP_DCLx const char *const cap, int affcnt) +/* compute the effective character-count for an operation (round up) */ +{ + int cost = NCURSES_SP_NAME(_nc_msec_cost) (NCURSES_SP_ARGx cap, affcnt); + if (cost != INFINITY) + cost = (cost + SP_PARM->_char_padding - 1) / SP_PARM->_char_padding; + return cost; +} + +static void +reset_scroll_region(NCURSES_SP_DCL0) +/* Set the scroll-region to a known state (the default) */ +{ + if (change_scroll_region) { + NCURSES_PUTP2("change_scroll_region", + TIPARM_2(change_scroll_region, + 0, screen_lines(SP_PARM) - 1)); + } +} + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_DCL0) +/* what to do at initialization time and after each shellout */ +{ + if (!SP_PARM || !IsTermInfo(SP_PARM)) + return; + + /* initialize screen for cursor access */ + if (enter_ca_mode) { + NCURSES_PUTP2("enter_ca_mode", enter_ca_mode); + } + + /* + * Doing this here rather than in _nc_mvcur_wrap() ensures that + * ncurses programs will see a reset scroll region even if a + * program that messed with it died ungracefully. + * + * This also undoes the effects of terminal init strings that assume + * they know the screen size. This is useful when you're running + * a vt100 emulation through xterm. + */ + reset_scroll_region(NCURSES_SP_ARG); + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + + /* restore cursor shape */ + if (SP_PARM->_cursor != -1) { + int cursor = SP_PARM->_cursor; + SP_PARM->_cursor = -1; + NCURSES_SP_NAME(curs_set) (NCURSES_SP_ARGx cursor); + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_mvcur_resume(void) +{ + NCURSES_SP_NAME(_nc_mvcur_resume) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_mvcur_init) (NCURSES_SP_DCL0) +/* initialize the cost structure */ +{ + if (SP_PARM->_ofp && NC_ISATTY(fileno(SP_PARM->_ofp))) { + SP_PARM->_char_padding = ((BAUDBYTE * 1000 * 10) + / (BAUDRATE(SP_PARM) > 0 + ? BAUDRATE(SP_PARM) + : 9600)); + } else { + SP_PARM->_char_padding = 1; /* must be nonzero */ + } + if (SP_PARM->_char_padding <= 0) + SP_PARM->_char_padding = 1; /* must be nonzero */ + TR(TRACE_CHARPUT | TRACE_MOVE, ("char_padding %d msecs", SP_PARM->_char_padding)); + + /* non-parameterized local-motion strings */ + SP_PARM->_cr_cost = CostOf(carriage_return, 0); + SP_PARM->_home_cost = CostOf(cursor_home, 0); + SP_PARM->_ll_cost = CostOf(cursor_to_ll, 0); +#if USE_HARD_TABS + if (getenv("NCURSES_NO_HARD_TABS") == 0 + && dest_tabs_magic_smso == 0 + && HasHardTabs()) { + SP_PARM->_ht_cost = CostOf(tab, 0); + SP_PARM->_cbt_cost = CostOf(back_tab, 0); + } else { + SP_PARM->_ht_cost = INFINITY; + SP_PARM->_cbt_cost = INFINITY; + } +#endif /* USE_HARD_TABS */ + SP_PARM->_cub1_cost = CostOf(cursor_left, 0); + SP_PARM->_cuf1_cost = CostOf(cursor_right, 0); + SP_PARM->_cud1_cost = CostOf(cursor_down, 0); + SP_PARM->_cuu1_cost = CostOf(cursor_up, 0); + + SP_PARM->_smir_cost = CostOf(enter_insert_mode, 0); + SP_PARM->_rmir_cost = CostOf(exit_insert_mode, 0); + SP_PARM->_ip_cost = 0; + if (insert_padding) { + SP_PARM->_ip_cost = CostOf(insert_padding, 0); + } + + /* + * Assumption: if the terminal has memory_relative addressing, the + * initialization strings or smcup will set single-page mode so we + * can treat it like absolute screen addressing. This seems to be true + * for all cursor_mem_address terminal types in the terminfo database. + */ + SP_PARM->_address_cursor = cursor_address ? cursor_address : cursor_mem_address; + + /* + * Parametrized local-motion strings. This static cost computation + * depends on the following assumptions: + * + * (1) They never have * padding. In the entire master terminfo database + * as of March 1995, only the obsolete Zenith Z-100 pc violates this. + * (Proportional padding is found mainly in insert, delete and scroll + * capabilities). + * + * (2) The average case of cup has two two-digit parameters. Strictly, + * the average case for a 24 * 80 screen has ((10*10*(1 + 1)) + + * (14*10*(1 + 2)) + (10*70*(2 + 1)) + (14*70*4)) / (24*80) = 3.458 + * digits of parameters. On a 25x80 screen the average is 3.6197. + * On larger screens the value gets much closer to 4. + * + * (3) The average case of cub/cuf/hpa/ech/rep has 2 digits of parameters + * (strictly, (((10 * 1) + (70 * 2)) / 80) = 1.8750). + * + * (4) The average case of cud/cuu/vpa has 2 digits of parameters + * (strictly, (((10 * 1) + (14 * 2)) / 24) = 1.5833). + * + * All these averages depend on the assumption that all parameter values + * are equally probable. + */ + SP_PARM->_cup_cost = CostOf(TIPARM_2(SP_PARM->_address_cursor, 23, 23), 1); + SP_PARM->_cub_cost = CostOf(TIPARM_1(parm_left_cursor, 23), 1); + SP_PARM->_cuf_cost = CostOf(TIPARM_1(parm_right_cursor, 23), 1); + SP_PARM->_cud_cost = CostOf(TIPARM_1(parm_down_cursor, 23), 1); + SP_PARM->_cuu_cost = CostOf(TIPARM_1(parm_up_cursor, 23), 1); + SP_PARM->_hpa_cost = CostOf(TIPARM_1(column_address, 23), 1); + SP_PARM->_vpa_cost = CostOf(TIPARM_1(row_address, 23), 1); + + /* non-parameterized screen-update strings */ + SP_PARM->_ed_cost = NormalizedCost(clr_eos, 1); + SP_PARM->_el_cost = NormalizedCost(clr_eol, 1); + SP_PARM->_el1_cost = NormalizedCost(clr_bol, 1); + SP_PARM->_dch1_cost = NormalizedCost(delete_character, 1); + SP_PARM->_ich1_cost = NormalizedCost(insert_character, 1); + + /* + * If this is a bce-terminal, we want to bias the choice so we use clr_eol + * rather than spaces at the end of a line. + */ + if (back_color_erase) + SP_PARM->_el_cost = 0; + + /* parameterized screen-update strings */ + SP_PARM->_dch_cost = NormalizedCost(TIPARM_1(parm_dch, 23), 1); + SP_PARM->_ich_cost = NormalizedCost(TIPARM_1(parm_ich, 23), 1); + SP_PARM->_ech_cost = NormalizedCost(TIPARM_1(erase_chars, 23), 1); + SP_PARM->_rep_cost = NormalizedCost(TIPARM_2(repeat_char, ' ', 23), 1); + + SP_PARM->_cup_ch_cost = NormalizedCost(TIPARM_2(SP_PARM->_address_cursor, + 23, 23), + 1); + SP_PARM->_hpa_ch_cost = NormalizedCost(TIPARM_1(column_address, 23), 1); + SP_PARM->_cuf_ch_cost = NormalizedCost(TIPARM_1(parm_right_cursor, 23), 1); + SP_PARM->_inline_cost = Min(SP_PARM->_cup_ch_cost, + Min(SP_PARM->_hpa_ch_cost, + SP_PARM->_cuf_ch_cost)); + + /* + * If save_cursor is used within enter_ca_mode, we should not use it for + * scrolling optimization, since the corresponding restore_cursor is not + * nested on the various terminals (vt100, xterm, etc.) which use this + * feature. + */ + if (save_cursor != 0 + && enter_ca_mode != 0 + && strstr(enter_ca_mode, save_cursor) != 0) { + T(("...suppressed sc/rc capability due to conflict with smcup/rmcup")); + save_cursor = 0; + restore_cursor = 0; + } + + /* + * A different, possibly better way to arrange this would be to set the + * SCREEN's _endwin at window initialization time and let this be called by + * doupdate's return-from-shellout code. + */ + NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_mvcur_init(void) +{ + NCURSES_SP_NAME(_nc_mvcur_init) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_mvcur_wrap) (NCURSES_SP_DCL0) +/* wrap up cursor-addressing mode */ +{ + if (!SP_PARM || !IsTermInfo(SP_PARM)) + return; + + /* leave cursor at screen bottom */ + TINFO_MVCUR(NCURSES_SP_ARGx -1, -1, screen_lines(SP_PARM) - 1, 0); + + /* set cursor to normal mode */ + if (SP_PARM->_cursor != -1) { + int cursor = SP_PARM->_cursor; + NCURSES_SP_NAME(curs_set) (NCURSES_SP_ARGx 1); + SP_PARM->_cursor = cursor; + } + + if (exit_ca_mode) { + NCURSES_PUTP2("exit_ca_mode", exit_ca_mode); + } + /* + * Reset terminal's tab counter. There's a long-time bug that + * if you exit a "curses" program such as vi or more, tab + * forward, and then backspace, the cursor doesn't go to the + * right place. The problem is that the kernel counts the + * escape sequences that reset things as column positions. + * Utter a \r to reset this invisibly. + */ + NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_ARGx '\r'); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_mvcur_wrap(void) +{ + NCURSES_SP_NAME(_nc_mvcur_wrap) (CURRENT_SCREEN); +} +#endif + +/**************************************************************************** + * + * Optimized cursor movement + * + ****************************************************************************/ + +/* + * Perform repeated-append, returning cost + */ +static NCURSES_INLINE int +repeated_append(string_desc * target, int total, int num, int repeat, const char *src) +{ + size_t need = (size_t) repeat * strlen(src); + + if (need < target->s_size) { + while (repeat-- > 0) { + if (_nc_safe_strcat(target, src)) { + total += num; + } else { + total = INFINITY; + break; + } + } + } else { + total = INFINITY; + } + return total; +} + +#ifndef NO_OPTIMIZE +#define NEXTTAB(fr) (fr + init_tabs - (fr % init_tabs)) + +/* + * Assume back_tab (CBT) does not wrap backwards at the left margin, return + * a negative value at that point to simplify the loop. + */ +#define LASTTAB(fr) ((fr > 0) ? ((fr - 1) / init_tabs) * init_tabs : -1) + +static int +relative_move(NCURSES_SP_DCLx + string_desc * target, + int from_y, + int from_x, + int to_y, + int to_x, + int ovw) +/* move via local motions (cuu/cuu1/cud/cud1/cub1/cub/cuf1/cuf/vpa/hpa) */ +{ + string_desc save; + int n, vcost = 0, hcost = 0; + + (void) _nc_str_copy(&save, target); + + if (to_y != from_y) { + vcost = INFINITY; + + if (row_address != 0 + && _nc_safe_strcat(target, TIPARM_1(row_address, to_y))) { + vcost = SP_PARM->_vpa_cost; + } + + if (to_y > from_y) { + n = (to_y - from_y); + + if (parm_down_cursor + && SP_PARM->_cud_cost < vcost + && _nc_safe_strcat(_nc_str_copy(target, &save), + TIPARM_1(parm_down_cursor, n))) { + vcost = SP_PARM->_cud_cost; + } + + if (cursor_down + && (*cursor_down != '\n') + && (n * SP_PARM->_cud1_cost < vcost)) { + vcost = repeated_append(_nc_str_copy(target, &save), 0, + SP_PARM->_cud1_cost, n, cursor_down); + } + } else { /* (to_y < from_y) */ + n = (from_y - to_y); + + if (parm_up_cursor + && SP_PARM->_cuu_cost < vcost + && _nc_safe_strcat(_nc_str_copy(target, &save), + TIPARM_1(parm_up_cursor, n))) { + vcost = SP_PARM->_cuu_cost; + } + + if (cursor_up && (n * SP_PARM->_cuu1_cost < vcost)) { + vcost = repeated_append(_nc_str_copy(target, &save), 0, + SP_PARM->_cuu1_cost, n, cursor_up); + } + } + + if (vcost == INFINITY) + return (INFINITY); + } + + save = *target; + + if (to_x != from_x) { + char str[OPT_SIZE]; + string_desc check; + + hcost = INFINITY; + + if (column_address + && _nc_safe_strcat(_nc_str_copy(target, &save), + TIPARM_1(column_address, to_x))) { + hcost = SP_PARM->_hpa_cost; + } + + if (to_x > from_x) { + n = to_x - from_x; + + if (parm_right_cursor + && SP_PARM->_cuf_cost < hcost + && _nc_safe_strcat(_nc_str_copy(target, &save), + TIPARM_1(parm_right_cursor, n))) { + hcost = SP_PARM->_cuf_cost; + } + + if (cursor_right) { + int lhcost = 0; + + (void) _nc_str_init(&check, str, sizeof(str)); + +#if USE_HARD_TABS + /* use hard tabs, if we have them, to do as much as possible */ + if (init_tabs > 0 && tab) { + int nxt, fr; + + for (fr = from_x; (nxt = NEXTTAB(fr)) <= to_x; fr = nxt) { + lhcost = repeated_append(&check, lhcost, + SP_PARM->_ht_cost, 1, tab); + if (lhcost == INFINITY) + break; + } + + n = to_x - fr; + from_x = fr; + } +#endif /* USE_HARD_TABS */ + + if (n <= 0 || n >= (int) check.s_size) + ovw = FALSE; +#if BSD_TPUTS + /* + * If we're allowing BSD-style padding in tputs, don't generate + * a string with a leading digit. Otherwise, that will be + * interpreted as a padding value rather than sent to the + * screen. + */ + if (ovw + && n > 0 + && n < (int) check.s_size + && vcost == 0 + && str[0] == '\0') { + int wanted = CharOf(WANT_CHAR(SP_PARM, to_y, from_x)); + if (is8bits(wanted) && isdigit(wanted)) + ovw = FALSE; + } +#endif + /* + * If we have no attribute changes, overwrite is cheaper. + * Note: must suppress this by passing in ovw = FALSE whenever + * WANT_CHAR would return invalid data. In particular, this + * is true between the time a hardware scroll has been done + * and the time the structure WANT_CHAR would access has been + * updated. + */ + if (ovw && to_y >= 0) { + int i; + + for (i = 0; i < n; i++) { + NCURSES_CH_T ch = WANT_CHAR(SP_PARM, to_y, from_x + i); + if (!SameAttrOf(ch, SCREEN_ATTRS(SP_PARM)) +#if USE_WIDEC_SUPPORT + || !Charable(ch) +#endif + ) { + ovw = FALSE; + break; + } + } + } + if (ovw && to_y >= 0) { + int i; + + for (i = 0; i < n; i++) + *check.s_tail++ = (char) CharOf(WANT_CHAR(SP_PARM, to_y, + from_x + i)); + *check.s_tail = '\0'; + check.s_size -= (size_t) n; + lhcost += n * SP_PARM->_char_padding; + } else { + lhcost = repeated_append(&check, lhcost, SP_PARM->_cuf1_cost, + n, cursor_right); + } + + if (lhcost < hcost + && _nc_safe_strcat(_nc_str_copy(target, &save), str)) { + hcost = lhcost; + } + } + } else { /* (to_x < from_x) */ + n = from_x - to_x; + + if (parm_left_cursor + && SP_PARM->_cub_cost < hcost + && _nc_safe_strcat(_nc_str_copy(target, &save), + TIPARM_1(parm_left_cursor, n))) { + hcost = SP_PARM->_cub_cost; + } + + if (cursor_left) { + int lhcost = 0; + + (void) _nc_str_init(&check, str, sizeof(str)); + +#if USE_HARD_TABS + if (init_tabs > 0 && back_tab) { + int nxt, fr; + + for (fr = from_x; (nxt = LASTTAB(fr)) >= to_x; fr = nxt) { + lhcost = repeated_append(&check, lhcost, + SP_PARM->_cbt_cost, + 1, back_tab); + if (lhcost == INFINITY) + break; + } + + n = fr - to_x; + } +#endif /* USE_HARD_TABS */ + + lhcost = repeated_append(&check, lhcost, + SP_PARM->_cub1_cost, + n, cursor_left); + + if (lhcost < hcost + && _nc_safe_strcat(_nc_str_copy(target, &save), str)) { + hcost = lhcost; + } + } + } + + if (hcost == INFINITY) + return (INFINITY); + } + + return (vcost + hcost); +} +#endif /* !NO_OPTIMIZE */ + +/* + * With the machinery set up above, it is conceivable that + * onscreen_mvcur could be modified into a recursive function that does + * an alpha-beta search of motion space, as though it were a chess + * move tree, with the weight function being boolean and the search + * depth equated to length of string. However, this would jack up the + * computation cost a lot, especially on terminals without a cup + * capability constraining the search tree depth. So we settle for + * the simpler method below. + */ + +static NCURSES_INLINE int +onscreen_mvcur(NCURSES_SP_DCLx + int yold, int xold, + int ynew, int xnew, int ovw, + NCURSES_SP_OUTC myOutCh) +/* onscreen move from (yold, xold) to (ynew, xnew) */ +{ + string_desc result; + char buffer[OPT_SIZE]; + int tactic = 0, newcost, usecost = INFINITY; + int t5_cr_cost; + +#if defined(MAIN) || defined(NCURSES_TEST) + struct timeval before, after; + + gettimeofday(&before, NULL); +#endif /* MAIN */ + +#define NullResult _nc_str_null(&result, sizeof(buffer)) +#define InitResult _nc_str_init(&result, buffer, sizeof(buffer)) + + /* tactic #0: use direct cursor addressing */ + if (_nc_safe_strcpy(InitResult, TIPARM_2(SP_PARM->_address_cursor, + ynew, xnew))) { + tactic = 0; + usecost = SP_PARM->_cup_cost; + +#if defined(TRACE) || defined(NCURSES_TEST) + if (!(_nc_optimize_enable & OPTIMIZE_MVCUR)) + goto nonlocal; +#endif /* TRACE */ + + /* + * We may be able to tell in advance that the full optimization + * will probably not be worth its overhead. Also, don't try to + * use local movement if the current attribute is anything but + * A_NORMAL...there are just too many ways this can screw up + * (like, say, local-movement \n getting mapped to some obscure + * character because A_ALTCHARSET is on). + */ + if (yold == -1 || xold == -1 || NOT_LOCAL(SP_PARM, yold, xold, ynew, xnew)) { +#if defined(MAIN) || defined(NCURSES_TEST) + if (!profiling) { + (void) fputs("nonlocal\n", stderr); + goto nonlocal; /* always run the optimizer if profiling */ + } +#else + goto nonlocal; +#endif /* MAIN */ + } + } +#ifndef NO_OPTIMIZE + /* tactic #1: use local movement */ + if (yold != -1 && xold != -1 + && ((newcost = relative_move(NCURSES_SP_ARGx + NullResult, + yold, xold, + ynew, xnew, ovw)) != INFINITY) + && newcost < usecost) { + tactic = 1; + usecost = newcost; + } + + /* tactic #2: use carriage-return + local movement */ + if (yold != -1 && carriage_return + && ((newcost = relative_move(NCURSES_SP_ARGx + NullResult, + yold, 0, + ynew, xnew, ovw)) != INFINITY) + && SP_PARM->_cr_cost + newcost < usecost) { + tactic = 2; + usecost = SP_PARM->_cr_cost + newcost; + } + + /* tactic #3: use home-cursor + local movement */ + if (cursor_home + && ((newcost = relative_move(NCURSES_SP_ARGx + NullResult, + 0, 0, + ynew, xnew, ovw)) != INFINITY) + && SP_PARM->_home_cost + newcost < usecost) { + tactic = 3; + usecost = SP_PARM->_home_cost + newcost; + } + + /* tactic #4: use home-down + local movement */ + if (cursor_to_ll + && ((newcost = relative_move(NCURSES_SP_ARGx + NullResult, + screen_lines(SP_PARM) - 1, 0, + ynew, xnew, ovw)) != INFINITY) + && SP_PARM->_ll_cost + newcost < usecost) { + tactic = 4; + usecost = SP_PARM->_ll_cost + newcost; + } + + /* + * tactic #5: use left margin for wrap to right-hand side, + * unless strange wrap behavior indicated by xenl might hose us. + */ + t5_cr_cost = (xold > 0 ? SP_PARM->_cr_cost : 0); + if (auto_left_margin && !eat_newline_glitch + && yold > 0 && cursor_left + && ((newcost = relative_move(NCURSES_SP_ARGx + NullResult, + yold - 1, screen_columns(SP_PARM) - 1, + ynew, xnew, ovw)) != INFINITY) + && t5_cr_cost + SP_PARM->_cub1_cost + newcost < usecost) { + tactic = 5; + usecost = t5_cr_cost + SP_PARM->_cub1_cost + newcost; + } + + /* + * These cases are ordered by estimated relative frequency. + */ + if (tactic) + InitResult; + switch (tactic) { + case 1: + (void) relative_move(NCURSES_SP_ARGx + &result, + yold, xold, + ynew, xnew, ovw); + break; + case 2: + (void) _nc_safe_strcpy(&result, carriage_return); + (void) relative_move(NCURSES_SP_ARGx + &result, + yold, 0, + ynew, xnew, ovw); + break; + case 3: + (void) _nc_safe_strcpy(&result, cursor_home); + (void) relative_move(NCURSES_SP_ARGx + &result, 0, 0, + ynew, xnew, ovw); + break; + case 4: + (void) _nc_safe_strcpy(&result, cursor_to_ll); + (void) relative_move(NCURSES_SP_ARGx + &result, + screen_lines(SP_PARM) - 1, 0, + ynew, xnew, ovw); + break; + case 5: + if (xold > 0) + (void) _nc_safe_strcat(&result, carriage_return); + (void) _nc_safe_strcat(&result, cursor_left); + (void) relative_move(NCURSES_SP_ARGx + &result, + yold - 1, screen_columns(SP_PARM) - 1, + ynew, xnew, ovw); + break; + } +#endif /* !NO_OPTIMIZE */ + + nonlocal: +#if defined(MAIN) || defined(NCURSES_TEST) + gettimeofday(&after, NULL); + diff = after.tv_usec - before.tv_usec + + (after.tv_sec - before.tv_sec) * 1000000; + if (!profiling) + (void) fprintf(stderr, + "onscreen: %d microsec, %f 28.8Kbps char-equivalents\n", + (int) diff, diff / 288); +#endif /* MAIN */ + + if (usecost != INFINITY) { + TR(TRACE_MOVE, ("mvcur tactic %d", tactic)); + TPUTS_TRACE("mvcur"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + buffer, 1, myOutCh); + SP_PARM->_cursrow = ynew; + SP_PARM->_curscol = xnew; + return (OK); + } else + return (ERR); +} + +/* + * optimized cursor move from (yold, xold) to (ynew, xnew) + */ +static int +_nc_real_mvcur(NCURSES_SP_DCLx + int yold, int xold, + int ynew, int xnew, + NCURSES_SP_OUTC myOutCh, + int ovw) +{ + NCURSES_CH_T oldattr; + int code; + + TR(TRACE_CALLS | TRACE_MOVE, (T_CALLED("_nc_real_mvcur(%p,%d,%d,%d,%d)"), + (void *) SP_PARM, yold, xold, ynew, xnew)); + + if (SP_PARM == 0) { + code = ERR; + } else if (yold == ynew && xold == xnew) { + code = OK; + } else { + + /* + * Most work here is rounding for terminal boundaries getting the + * column position implied by wraparound or the lack thereof and + * rolling up the screen to get ynew on the screen. + */ + if (xnew >= screen_columns(SP_PARM)) { + ynew += xnew / screen_columns(SP_PARM); + xnew %= screen_columns(SP_PARM); + } + + /* + * Force restore even if msgr is on when we're in an alternate + * character set -- these have a strong tendency to screw up the CR & + * LF used for local character motions! + */ + oldattr = SCREEN_ATTRS(SP_PARM); + if ((AttrOf(oldattr) & A_ALTCHARSET) + || (AttrOf(oldattr) && !move_standout_mode)) { + TR(TRACE_CHARPUT, ("turning off (%#lx) %s before move", + (unsigned long) AttrOf(oldattr), + _traceattr(AttrOf(oldattr)))); + VIDPUTS(SP_PARM, A_NORMAL, 0); + } + + if (xold >= screen_columns(SP_PARM)) { + + int l = (xold + 1) / screen_columns(SP_PARM); + + yold += l; + if (yold >= screen_lines(SP_PARM)) + l -= (yold - screen_lines(SP_PARM) - 1); + + if (l > 0) { + if (carriage_return) { + NCURSES_PUTP2("carriage_return", carriage_return); + } else { + myOutCh(NCURSES_SP_ARGx '\r'); + } + xold = 0; + + while (l > 0) { + if (newline) { + NCURSES_PUTP2("newline", newline); + } else { + myOutCh(NCURSES_SP_ARGx '\n'); + } + l--; + } + } + } + + if (yold > screen_lines(SP_PARM) - 1) + yold = screen_lines(SP_PARM) - 1; + if (ynew > screen_lines(SP_PARM) - 1) + ynew = screen_lines(SP_PARM) - 1; + + /* destination location is on screen now */ + code = onscreen_mvcur(NCURSES_SP_ARGx yold, xold, ynew, xnew, ovw, myOutCh); + + /* + * Restore attributes if we disabled them before moving. + */ + if (!SameAttrOf(oldattr, SCREEN_ATTRS(SP_PARM))) { + TR(TRACE_CHARPUT, ("turning on (%#lx) %s after move", + (unsigned long) AttrOf(oldattr), + _traceattr(AttrOf(oldattr)))); + VIDPUTS(SP_PARM, AttrOf(oldattr), GetPair(oldattr)); + } + } + returnCode(code); +} + +/* + * These entrypoints are used within the library. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_mvcur) (NCURSES_SP_DCLx + int yold, int xold, + int ynew, int xnew) +{ + int rc; + rc = _nc_real_mvcur(NCURSES_SP_ARGx yold, xold, ynew, xnew, + NCURSES_SP_NAME(_nc_outch), + TRUE); + /* + * With the terminal-driver, we cannot distinguish between internal and + * external calls. Flush the output if the screen has not been + * initialized, e.g., when used from low-level terminfo programs. + */ + if ((SP_PARM != 0) && (SP_PARM->_endwin == ewInitial)) + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + return rc; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_mvcur(int yold, int xold, + int ynew, int xnew) +{ + return NCURSES_SP_NAME(_nc_mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew); +} +#endif + +#if defined(USE_TERM_DRIVER) +/* + * The terminal driver does not support the external "mvcur()". + */ +NCURSES_EXPORT(int) +TINFO_MVCUR(NCURSES_SP_DCLx int yold, int xold, int ynew, int xnew) +{ + int rc; + rc = _nc_real_mvcur(NCURSES_SP_ARGx + yold, xold, + ynew, xnew, + NCURSES_SP_NAME(_nc_outch), + TRUE); + if ((SP_PARM != 0) && (SP_PARM->_endwin == ewInitial)) + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + return rc; +} + +#else /* !USE_TERM_DRIVER */ + +/* + * These entrypoints support users of the library. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(mvcur) (NCURSES_SP_DCLx int yold, int xold, int ynew, + int xnew) +{ + return _nc_real_mvcur(NCURSES_SP_ARGx + yold, xold, + ynew, xnew, + NCURSES_SP_NAME(_nc_putchar), + FALSE); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +mvcur(int yold, int xold, int ynew, int xnew) +{ + return NCURSES_SP_NAME(mvcur) (CURRENT_SCREEN, yold, xold, ynew, xnew); +} +#endif +#endif /* USE_TERM_DRIVER */ + +#if defined(TRACE) || defined(NCURSES_TEST) +NCURSES_EXPORT_VAR(int) _nc_optimize_enable = OPTIMIZE_ALL; +#endif + +#if defined(MAIN) || defined(NCURSES_TEST) +/**************************************************************************** + * + * Movement optimizer test code + * + ****************************************************************************/ + +#include +#include +#include + +NCURSES_EXPORT_VAR(const char *) _nc_progname = "mvcur"; + +static unsigned long xmits; + +/* these override lib_tputs.c */ +NCURSES_EXPORT(int) +tputs(const char *string, int affcnt GCC_UNUSED, int (*outc) (int) GCC_UNUSED) +/* stub tputs() that dumps sequences in a visible form */ +{ + if (profiling) + xmits += strlen(string); + else + (void) fputs(_nc_visbuf(string), stdout); + return (OK); +} + +NCURSES_EXPORT(int) +putp(const char *string) +{ + return (tputs(string, 1, _nc_outch)); +} + +NCURSES_EXPORT(int) +_nc_outch(int ch) +{ + putc(ch, stdout); + return OK; +} + +NCURSES_EXPORT(int) +delay_output(int ms GCC_UNUSED) +{ + return OK; +} + +static char tname[PATH_MAX]; + +static void +load_term(void) +{ + (void) setupterm(tname, STDOUT_FILENO, NULL); +} + +static int +roll(int n) +{ + int i, j; + + i = (RAND_MAX / n) * n; + while ((j = rand()) >= i) + continue; + return (j % n); +} + +int +main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED) +{ + _nc_STRCPY(tname, getenv("TERM"), sizeof(tname)); + load_term(); + _nc_setupscreen(lines, columns, stdout, FALSE, 0); + baudrate(); + + _nc_mvcur_init(); + + (void) puts("The mvcur tester. Type ? for help"); + + fputs("smcup:", stdout); + putchar('\n'); + + for (;;) { + int fy, fx, ty, tx, n, i; + char buf[BUFSIZ], capname[BUFSIZ]; + + if (fputs("> ", stdout) == EOF) + break; + if (fgets(buf, sizeof(buf), stdin) == 0) + break; + +#define PUTS(s) (void) puts(s) +#define PUTF(s,t) (void) printf(s,t) + if (buf[0] == '?') { + PUTS("? -- display this help message"); + PUTS("fy fx ty tx -- (4 numbers) display (fy,fx)->(ty,tx) move"); + PUTS("s[croll] n t b m -- display scrolling sequence"); + PUTF("r[eload] -- reload terminal info for %s\n", + termname()); + PUTS("l[oad] -- load terminal info for type "); + PUTS("d[elete] -- delete named capability"); + PUTS("i[nspect] -- display terminal capabilities"); + PUTS("c[ost] -- dump cursor-optimization cost table"); + PUTS("o[optimize] -- toggle movement optimization"); + PUTS("t[orture] -- torture-test with random moves"); + PUTS("q[uit] -- quit the program"); + } else if (sscanf(buf, "%d %d %d %d", &fy, &fx, &ty, &tx) == 4) { + struct timeval before, after; + + putchar('"'); + + gettimeofday(&before, NULL); + mvcur(fy, fx, ty, tx); + gettimeofday(&after, NULL); + + printf("\" (%ld msec)\n", + (long) (after.tv_usec - before.tv_usec + + (after.tv_sec - before.tv_sec) + * 1000000)); + } else if (sscanf(buf, "s %d %d %d %d", &fy, &fx, &ty, &tx) == 4) { + struct timeval before, after; + + putchar('"'); + + gettimeofday(&before, NULL); + _nc_scrolln(fy, fx, ty, tx); + gettimeofday(&after, NULL); + + printf("\" (%ld msec)\n", + (long) (after.tv_usec - before.tv_usec + (after.tv_sec - + before.tv_sec) + * 1000000)); + } else if (buf[0] == 'r') { + _nc_STRCPY(tname, termname(), sizeof(tname)); + load_term(); + } else if (sscanf(buf, "l %s", tname) == 1) { + load_term(); + } else if (sscanf(buf, "d %s", capname) == 1) { + struct name_table_entry const *np = _nc_find_entry(capname, + _nc_get_hash_table(FALSE)); + + if (np == NULL) + (void) printf("No such capability as \"%s\"\n", capname); + else { + switch (np->nte_type) { + case BOOLEAN: + cur_term->type.Booleans[np->nte_index] = FALSE; + (void) + printf("Boolean capability `%s' (%d) turned off.\n", + np->nte_name, np->nte_index); + break; + + case NUMBER: + cur_term->type.Numbers[np->nte_index] = ABSENT_NUMERIC; + (void) printf("Number capability `%s' (%d) set to -1.\n", + np->nte_name, np->nte_index); + break; + + case STRING: + cur_term->type.Strings[np->nte_index] = ABSENT_STRING; + (void) printf("String capability `%s' (%d) deleted.\n", + np->nte_name, np->nte_index); + break; + } + } + } else if (buf[0] == 'i') { + dump_init(NULL, F_TERMINFO, S_TERMINFO, + FALSE, 70, 0, 0, FALSE, FALSE, 0); + dump_entry(&TerminalType(cur_term), FALSE, TRUE, 0, 0); + putchar('\n'); + } else if (buf[0] == 'o') { + if (_nc_optimize_enable & OPTIMIZE_MVCUR) { + _nc_optimize_enable &= ~OPTIMIZE_MVCUR; + (void) puts("Optimization is now off."); + } else { + _nc_optimize_enable |= OPTIMIZE_MVCUR; + (void) puts("Optimization is now on."); + } + } + /* + * You can use the `t' test to profile and tune the movement + * optimizer. Use iteration values in three digits or more. + * At above 5000 iterations the profile timing averages are stable + * to within a millisecond or three. + * + * The `overhead' field of the report will help you pick a + * COMPUTE_OVERHEAD figure appropriate for your processor and + * expected line speed. The `total estimated time' is + * computation time plus a character-transmission time + * estimate computed from the number of transmits and the baud + * rate. + * + * Use this together with the `o' command to get a read on the + * optimizer's effectiveness. Compare the total estimated times + * for `t' runs of the same length in both optimized and un-optimized + * modes. As long as the optimized times are less, the optimizer + * is winning. + */ + else if (sscanf(buf, "t %d", &n) == 1) { + float cumtime = 0.0, perchar; + int speeds[] = + {2400, 9600, 14400, 19200, 28800, 38400, 0}; + + srand((unsigned) (getpid() + time((time_t *) 0))); + profiling = TRUE; + xmits = 0; + for (i = 0; i < n; i++) { + /* + * This does a move test between two random locations, + * Random moves probably short-change the optimizer, + * which will work better on the short moves probably + * typical of doupdate()'s usage pattern. Still, + * until we have better data... + */ +#ifdef FIND_COREDUMP + int from_y = roll(lines); + int to_y = roll(lines); + int from_x = roll(columns); + int to_x = roll(columns); + + printf("(%d,%d) -> (%d,%d)\n", from_y, from_x, to_y, to_x); + mvcur(from_y, from_x, to_y, to_x); +#else + mvcur(roll(lines), roll(columns), roll(lines), roll(columns)); +#endif /* FIND_COREDUMP */ + if (diff) + cumtime += diff; + } + profiling = FALSE; + + /* + * Average milliseconds per character optimization time. + * This is the key figure to watch when tuning the optimizer. + */ + perchar = cumtime / n; + + (void) printf("%d moves (%ld chars) in %d msec, %f msec each:\n", + n, xmits, (int) cumtime, perchar); + + for (i = 0; speeds[i]; i++) { + /* + * Total estimated time for the moves, computation and + * transmission both. Transmission time is an estimate + * assuming 9 bits/char, 8 bits + 1 stop bit. + */ + float totalest = cumtime + xmits * 9 * 1e6 / speeds[i]; + + /* + * Per-character optimization overhead in character transmits + * at the current speed. Round this to the nearest integer + * to figure COMPUTE_OVERHEAD for the speed. + */ + float overhead = speeds[i] * perchar / 1e6; + + (void) + printf("%6d bps: %3.2f char-xmits overhead; total estimated time %15.2f\n", + speeds[i], overhead, totalest); + } + } else if (buf[0] == 'c') { + (void) printf("char padding: %d\n", CURRENT_SCREEN->_char_padding); + (void) printf("cr cost: %d\n", CURRENT_SCREEN->_cr_cost); + (void) printf("cup cost: %d\n", CURRENT_SCREEN->_cup_cost); + (void) printf("home cost: %d\n", CURRENT_SCREEN->_home_cost); + (void) printf("ll cost: %d\n", CURRENT_SCREEN->_ll_cost); +#if USE_HARD_TABS + (void) printf("ht cost: %d\n", CURRENT_SCREEN->_ht_cost); + (void) printf("cbt cost: %d\n", CURRENT_SCREEN->_cbt_cost); +#endif /* USE_HARD_TABS */ + (void) printf("cub1 cost: %d\n", CURRENT_SCREEN->_cub1_cost); + (void) printf("cuf1 cost: %d\n", CURRENT_SCREEN->_cuf1_cost); + (void) printf("cud1 cost: %d\n", CURRENT_SCREEN->_cud1_cost); + (void) printf("cuu1 cost: %d\n", CURRENT_SCREEN->_cuu1_cost); + (void) printf("cub cost: %d\n", CURRENT_SCREEN->_cub_cost); + (void) printf("cuf cost: %d\n", CURRENT_SCREEN->_cuf_cost); + (void) printf("cud cost: %d\n", CURRENT_SCREEN->_cud_cost); + (void) printf("cuu cost: %d\n", CURRENT_SCREEN->_cuu_cost); + (void) printf("hpa cost: %d\n", CURRENT_SCREEN->_hpa_cost); + (void) printf("vpa cost: %d\n", CURRENT_SCREEN->_vpa_cost); + } else if (buf[0] == 'x' || buf[0] == 'q') + break; + else + (void) puts("Invalid command."); + } + + (void) fputs("rmcup:", stdout); + _nc_mvcur_wrap(); + putchar('\n'); + + return (0); +} + +#endif /* MAIN */ + +/* lib_mvcur.c ends here */ diff --git a/contrib/ncurses/ncurses/tty/lib_tstp.c b/contrib/ncurses/ncurses/tty/lib_tstp.c new file mode 100644 index 00000000..dd925c7e --- /dev/null +++ b/contrib/ncurses/ncurses/tty/lib_tstp.c @@ -0,0 +1,428 @@ +/**************************************************************************** + * Copyright 2020-2021,2022 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1995-on * + ****************************************************************************/ + +/* +** lib_tstp.c +** +** The routine _nc_signal_handler(). +** +*/ +#include + +#include + +MODULE_ID("$Id: lib_tstp.c,v 1.54 2022/12/24 22:22:10 tom Exp $") + +#if defined(SIGTSTP) && (HAVE_SIGACTION || HAVE_SIGVEC) +#define USE_SIGTSTP 1 +#else +#define USE_SIGTSTP 0 +#endif + +#ifdef TRACE +static const char * +signal_name(int sig) +{ + switch (sig) { +#ifdef SIGALRM + case SIGALRM: + return "SIGALRM"; +#endif +#ifdef SIGCONT + case SIGCONT: + return "SIGCONT"; +#endif + case SIGINT: + return "SIGINT"; +#ifdef SIGQUIT + case SIGQUIT: + return "SIGQUIT"; +#endif + case SIGTERM: + return "SIGTERM"; +#ifdef SIGTSTP + case SIGTSTP: + return "SIGTSTP"; +#endif +#ifdef SIGTTOU + case SIGTTOU: + return "SIGTTOU"; +#endif +#ifdef SIGWINCH + case SIGWINCH: + return "SIGWINCH"; +#endif + default: + return "unknown signal"; + } +} +#endif + +/* + * Note: This code is fragile! Its problem is that different OSs + * handle restart of system calls interrupted by signals differently. + * The ncurses code needs signal-call restart to happen -- otherwise, + * interrupted wgetch() calls will return FAIL, probably making the + * application think the input stream has ended and it should + * terminate. In particular, you know you have this problem if, when + * you suspend an ncurses-using lynx with ^Z and resume, it dies + * immediately. + * + * Default behavior of POSIX sigaction(2) is not to restart + * interrupted system calls, but Linux's sigaction does it anyway (at + * least, on and after the 1.1.47 I (esr) use). Thus this code works + * OK under Linux. The 4.4BSD sigaction(2) supports a (non-portable) + * SA_RESTART flag that forces the right behavior. Thus, this code + * should work OK under BSD/OS, NetBSD, and FreeBSD (let us know if it + * does not). + * + * Stock System Vs (and anything else using a strict-POSIX + * sigaction(2) without SA_RESTART) may have a problem. Possible + * solutions: + * + * sigvec restarts by default (SV_INTERRUPT flag to not restart) + * signal restarts by default in SVr4 (assuming you link with -lucb) + * and BSD, but not SVr3. + * sigset restarts, but is only available under SVr4/Solaris. + * + * The signal(3) call is mandated by the ANSI standard, and its + * interaction with sigaction(2) is described in the POSIX standard + * (3.3.4.2, page 72,line 934). According to section 8.1, page 191, + * however, signal(3) itself is not required by POSIX.1. And POSIX is + * silent on whether it is required to restart signals. + * + * So. The present situation is, we use sigaction(2) with no + * guarantee of restart anywhere but on Linux and BSD. We could + * switch to signal(3) and collar Linux, BSD, and SVr4. Any way + * we slice it, System V UNIXes older than SVr4 will probably lose + * (this may include XENIX). + * + * This implementation will probably be changed to use signal(3) in + * the future. If nothing else, it is simpler... + */ + +#if USE_SIGTSTP +static void +handle_SIGTSTP(int dummy GCC_UNUSED) +{ + SCREEN *sp = CURRENT_SCREEN; + sigset_t mask, omask; + sigaction_t act, oact; + +#ifdef SIGTTOU + int sigttou_blocked; +#endif + + _nc_globals.have_sigtstp = 1; + T(("handle_SIGTSTP() called")); + + /* + * The user may have changed the prog_mode tty bits, so save them. + * + * But first try to detect whether we still are in the foreground + * process group - if not, an interactive shell may already have + * taken ownership of the tty and modified the settings when our + * parent was stopped before us, and we would likely pick up the + * settings already modified by the shell. + * + * Don't do this if we're not in curses - + */ + if (sp != 0 && (sp->_endwin == ewRunning)) +#if HAVE_TCGETPGRP + if (tcgetpgrp(STDIN_FILENO) == getpgrp()) +#endif + NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG); + + /* + * Block window change and timer signals. The latter + * is because applications use timers to decide when + * to repaint the screen. + */ + (void) sigemptyset(&mask); +#ifdef SIGALRM + (void) sigaddset(&mask, SIGALRM); +#endif +#if USE_SIGWINCH + (void) sigaddset(&mask, SIGWINCH); +#endif + (void) sigprocmask(SIG_BLOCK, &mask, &omask); + +#ifdef SIGTTOU + sigttou_blocked = sigismember(&omask, SIGTTOU); + if (!sigttou_blocked) { + (void) sigemptyset(&mask); + (void) sigaddset(&mask, SIGTTOU); + (void) sigprocmask(SIG_BLOCK, &mask, NULL); + } +#endif + + /* + * End window mode, which also resets the terminal state to the + * original (pre-curses) modes. + */ + NCURSES_SP_NAME(endwin) (NCURSES_SP_ARG); + + /* Unblock SIGTSTP. */ + (void) sigemptyset(&mask); + (void) sigaddset(&mask, SIGTSTP); +#ifdef SIGTTOU + if (!sigttou_blocked) { + /* Unblock this too if it wasn't blocked on entry */ + (void) sigaddset(&mask, SIGTTOU); + } +#endif + (void) sigprocmask(SIG_UNBLOCK, &mask, NULL); + + /* Now we want to resend SIGSTP to this process and suspend it */ + act.sa_handler = SIG_DFL; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; +#ifdef SA_RESTART + act.sa_flags |= SA_RESTART; +#endif /* SA_RESTART */ + sigaction(SIGTSTP, &act, &oact); + kill(getpid(), SIGTSTP); + + /* Process gets suspended...time passes...process resumes */ + + T(("SIGCONT received")); + sigaction(SIGTSTP, &oact, NULL); + NCURSES_SP_NAME(flushinp) (NCURSES_SP_ARG); + + /* + * If the user modified the tty state while suspended, he wants + * those changes to stick. So save the new "default" terminal state. + */ + NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG); + + /* + * This relies on the fact that doupdate() will restore the + * program-mode tty state, and issue enter_ca_mode if need be. + */ + NCURSES_SP_NAME(doupdate) (NCURSES_SP_ARG); + + /* Reset the signals. */ + (void) sigprocmask(SIG_SETMASK, &omask, NULL); +} +#endif /* USE_SIGTSTP */ + +static void +handle_SIGINT(int sig) +{ + SCREEN *sp = CURRENT_SCREEN; + + /* + * Much of this is unsafe from a signal handler. But we'll _try_ to clean + * up the screen and terminal settings on the way out. + * + * There are at least the following problems: + * 1) Walking the SCREEN list is unsafe, since all list management + * is done without any signal blocking. + * 2) On systems which have REENTRANT turned on, set_term() uses + * _nc_lock_global() which could deadlock or misbehave in other ways. + * 3) endwin() calls all sorts of stuff, many of which use stdio or + * other library functions which are clearly unsafe. + */ + if (!_nc_globals.cleanup_nested++ + && (sig == SIGINT || sig == SIGTERM)) { +#if HAVE_SIGACTION || HAVE_SIGVEC + sigaction_t act; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + act.sa_handler = SIG_IGN; + if (sigaction(sig, &act, NULL) == 0) +#else + if (signal(sig, SIG_IGN) != SIG_ERR) +#endif + { + SCREEN *scan; + for (each_screen(scan)) { + if (scan->_ofp != 0 + && NC_ISATTY(fileno(scan->_ofp))) { + scan->_outch = NCURSES_SP_NAME(_nc_outch); + } + set_term(scan); + NCURSES_SP_NAME(endwin) (NCURSES_SP_ARG); + if (sp) + sp->_endwin = ewInitial; /* in case of reuse */ + } + } + } + _exit(EXIT_FAILURE); +} + +# ifndef _nc_set_read_thread +NCURSES_EXPORT(void) +_nc_set_read_thread(bool enable) +{ + _nc_lock_global(curses); + if (enable) { +# if USE_WEAK_SYMBOLS + if ((pthread_self) && (pthread_kill) && (pthread_equal)) +# endif + _nc_globals.read_thread = pthread_self(); + } else { + _nc_globals.read_thread = 0; + } + _nc_unlock_global(curses); +} +# endif + +#if USE_SIGWINCH + +static void +handle_SIGWINCH(int sig GCC_UNUSED) +{ + _nc_globals.have_sigwinch = 1; +# if USE_PTHREADS_EINTR + if (_nc_globals.read_thread) { + if (!pthread_equal(pthread_self(), _nc_globals.read_thread)) + pthread_kill(_nc_globals.read_thread, SIGWINCH); + _nc_globals.read_thread = 0; + } +# endif +} +#endif /* USE_SIGWINCH */ + +/* + * If the given signal is still in its default state, set it to the given + * handler. + */ +static int +CatchIfDefault(int sig, void (*handler) (int)) +{ + int result; +#if HAVE_SIGACTION || HAVE_SIGVEC + sigaction_t old_act; + sigaction_t new_act; + + memset(&new_act, 0, sizeof(new_act)); + sigemptyset(&new_act.sa_mask); +#ifdef SA_RESTART +#ifdef SIGWINCH + if (sig != SIGWINCH) +#endif + new_act.sa_flags |= SA_RESTART; +#endif /* SA_RESTART */ + new_act.sa_handler = handler; + + if (sigaction(sig, NULL, &old_act) == 0 + && (old_act.sa_handler == SIG_DFL + || old_act.sa_handler == handler +#if USE_SIGWINCH + || (sig == SIGWINCH && old_act.sa_handler == SIG_IGN) +#endif + )) { + (void) sigaction(sig, &new_act, NULL); + result = TRUE; + } else { + result = FALSE; + } +#else /* !HAVE_SIGACTION */ + void (*ohandler) (int); + + ohandler = signal(sig, SIG_IGN); + if (ohandler == SIG_DFL + || ohandler == handler +#if USE_SIGWINCH + || (sig == SIGWINCH && ohandler == SIG_IGN) +#endif + ) { + signal(sig, handler); + result = TRUE; + } else { + signal(sig, ohandler); + result = FALSE; + } +#endif + T(("CatchIfDefault - will %scatch %s", + result ? "" : "not ", signal_name(sig))); + return result; +} + +/* + * This is invoked once at the beginning (e.g., from 'initscr()'), to + * initialize the signal catchers, and thereafter when spawning a shell (and + * returning) to disable/enable the SIGTSTP (i.e., ^Z) catcher. + * + * If the application has already set one of the signals, we'll not modify it + * (during initialization). + * + * The XSI document implies that we shouldn't keep the SIGTSTP handler if + * the caller later changes its mind, but that doesn't seem correct. + */ +NCURSES_EXPORT(void) +_nc_signal_handler(int enable) +{ + T((T_CALLED("_nc_signal_handler(%d)"), enable)); +#if USE_SIGTSTP /* Xenix 2.x doesn't have SIGTSTP, for example */ + { + static bool ignore_tstp = FALSE; + + if (!ignore_tstp) { + static sigaction_t new_sigaction, old_sigaction; + + if (!enable) { + new_sigaction.sa_handler = SIG_IGN; + sigaction(SIGTSTP, &new_sigaction, &old_sigaction); + } else if (new_sigaction.sa_handler != SIG_DFL) { + sigaction(SIGTSTP, &old_sigaction, NULL); + } else if (sigaction(SIGTSTP, NULL, &old_sigaction) == 0 + && (old_sigaction.sa_handler == SIG_DFL)) { + sigemptyset(&new_sigaction.sa_mask); +#ifdef SA_RESTART + new_sigaction.sa_flags |= SA_RESTART; +#endif /* SA_RESTART */ + new_sigaction.sa_handler = handle_SIGTSTP; + (void) sigaction(SIGTSTP, &new_sigaction, NULL); + } else { + ignore_tstp = TRUE; + } + } + } +#endif /* !USE_SIGTSTP */ + + if (!_nc_globals.init_signals) { + if (enable) { + CatchIfDefault(SIGINT, handle_SIGINT); + CatchIfDefault(SIGTERM, handle_SIGINT); +#if USE_SIGWINCH + CatchIfDefault(SIGWINCH, handle_SIGWINCH); +#endif + _nc_globals.init_signals = TRUE; + } + } + returnVoid; +} diff --git a/contrib/ncurses/ncurses/tty/lib_twait.c b/contrib/ncurses/ncurses/tty/lib_twait.c new file mode 100644 index 00000000..3c21f801 --- /dev/null +++ b/contrib/ncurses/ncurses/tty/lib_twait.c @@ -0,0 +1,523 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2015,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* +** lib_twait.c +** +** The routine _nc_timed_wait(). +** +** (This file was originally written by Eric Raymond; however except for +** comments, none of the original code remains - T.Dickey). +*/ + +#include + +#if defined __HAIKU__ && defined __BEOS__ +#undef __BEOS__ +#endif + +#ifdef __BEOS__ +#undef false +#undef true +#include +#endif + +#if USE_KLIBC_KBD +#define INCL_KBD +#include +#endif + +#if USE_FUNC_POLL +# if HAVE_SYS_TIME_H +# include +# endif +#elif HAVE_SELECT +# if HAVE_SYS_TIME_H && HAVE_SYS_TIME_SELECT +# include +# endif +# if HAVE_SYS_SELECT_H +# include +# endif +#endif +#if HAVE_SYS_TIME_H +# include +#endif +#undef CUR + +MODULE_ID("$Id: lib_twait.c,v 1.82 2024/10/05 22:47:12 tom Exp $") + +/* + * Returns an elapsed time, in milliseconds (if possible). + */ +static long +_nc_gettime(TimeType * t0, int first) +{ + long res; + +#if PRECISE_GETTIME + TimeType t1; + if (GetClockTime(&t1) == -1) { + *t0 = t1; + res = first ? 0 : 1; + } else if (first) { + *t0 = t1; + res = 0; + } else { + /* .tv_sec and .tv_usec are unsigned, be careful when subtracting */ + if (t0->sub_secs > t1.sub_secs) { + t1.sub_secs += TimeScale; + t1.tv_sec--; + } + res = (long) ((t1.tv_sec - t0->tv_sec) * 1000L + + (t1.sub_secs - t0->sub_secs) / (TimeScale / 1000L)); + } +#else + time_t t1 = time((time_t *) 0); + if (first) { + *t0 = t1; + } + res = (long) ((t1 - *t0) * 1000); +#endif + TR(TRACE_IEVENT, ("%s time: %ld msec", first ? "get" : "elapsed", res)); + return res; +} + +#ifdef NCURSES_WGETCH_EVENTS +NCURSES_EXPORT(int) +_nc_eventlist_timeout(_nc_eventlist * evl) +{ + int event_delay = -1; + + if (evl != 0) { + int n; + + for (n = 0; n < evl->count; ++n) { + _nc_event *ev = evl->events[n]; + + if (ev->type == _NC_EVENT_TIMEOUT_MSEC) { + event_delay = (int) ev->data.timeout_msec; + if (event_delay < 0) + event_delay = INT_MAX; /* FIXME Is this defined? */ + } + } + } + return event_delay; +} +#endif /* NCURSES_WGETCH_EVENTS */ + +#if (USE_FUNC_POLL || HAVE_SELECT) +# define MAYBE_UNUSED +#else +# define MAYBE_UNUSED GCC_UNUSED +#endif + +#if (USE_FUNC_POLL || HAVE_SELECT) +# define MAYBE_UNUSED +#else +# define MAYBE_UNUSED GCC_UNUSED +#endif + +/* + * Wait a specified number of milliseconds, returning nonzero if the timer + * didn't expire before there is activity on the specified file descriptors. + * The file-descriptors are specified by the mode: + * TW_NONE 0 - none (absolute time) + * TW_INPUT 1 - ncurses' normal input-descriptor + * TW_MOUSE 2 - mouse descriptor, if any + * TW_ANY 3 - either input or mouse. + * TW_EVENT 4 - + * Experimental: if NCURSES_WGETCH_EVENTS is defined, (mode & 4) determines + * whether to pay attention to evl argument. If set, the smallest of + * millisecond and of timeout of evl is taken. + * + * We return a mask that corresponds to the mode (e.g., 2 for mouse activity). + * + * If the milliseconds given are -1, the wait blocks until activity on the + * descriptors. + */ +NCURSES_EXPORT(int) +_nc_timed_wait(const SCREEN *sp MAYBE_UNUSED, + int mode MAYBE_UNUSED, + int milliseconds, + int *timeleft + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int count; + int result = TW_NONE; + TimeType t0; +#if (USE_FUNC_POLL || HAVE_SELECT) + int fd; +#endif + +#ifdef NCURSES_WGETCH_EVENTS + int timeout_is_event = 0; + int n; +#endif + +#if USE_FUNC_POLL +#define MIN_FDS 2 + struct pollfd fd_list[MIN_FDS]; + struct pollfd *fds = fd_list; +#elif defined(__BEOS__) +#elif HAVE_SELECT + fd_set set; +#endif + +#if USE_KLIBC_KBD + fd_set saved_set; + KBDKEYINFO ki; + struct timeval tv; +#endif + + long starttime, returntime; + +#ifdef NCURSES_WGETCH_EVENTS + (void) timeout_is_event; +#endif + + TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d", + milliseconds, mode)); + +#ifdef NCURSES_WGETCH_EVENTS + if (mode & TW_EVENT) { + int event_delay = _nc_eventlist_timeout(evl); + + if (event_delay >= 0 + && (milliseconds >= event_delay || milliseconds < 0)) { + milliseconds = event_delay; + timeout_is_event = 1; + } + } +#endif + +#if PRECISE_GETTIME && HAVE_NANOSLEEP + retry: +#endif + starttime = _nc_gettime(&t0, TRUE); + + count = 0; + (void) count; + +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl) + evl->result_flags = 0; +#endif + +#if USE_FUNC_POLL + memset(fd_list, 0, sizeof(fd_list)); + +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl) { + if (fds == fd_list) + fds = typeMalloc(struct pollfd, MIN_FDS + evl->count); + if (fds == 0) + return TW_NONE; + } +#endif + + if (mode & TW_INPUT) { + fds[count].fd = sp->_ifd; + fds[count].events = POLLIN; + count++; + } + if ((mode & TW_MOUSE) + && (fd = sp->_mouse_fd) >= 0) { + fds[count].fd = fd; + fds[count].events = POLLIN; + count++; + } +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl) { + for (n = 0; n < evl->count; ++n) { + _nc_event *ev = evl->events[n]; + + if (ev->type == _NC_EVENT_FILE + && (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) { + fds[count].fd = ev->data.fev.fd; + fds[count].events = POLLIN; + count++; + } + } + } +#endif + + result = poll(fds, (size_t) count, milliseconds); + +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl) { + int c; + + if (!result) + count = 0; + + for (n = 0; n < evl->count; ++n) { + _nc_event *ev = evl->events[n]; + + if (ev->type == _NC_EVENT_FILE + && (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) { + ev->data.fev.result = 0; + for (c = 0; c < count; c++) + if (fds[c].fd == ev->data.fev.fd + && fds[c].revents & POLLIN) { + ev->data.fev.result |= _NC_EVENT_FILE_READABLE; + evl->result_flags |= _NC_EVENT_FILE_READABLE; + } + } else if (ev->type == _NC_EVENT_TIMEOUT_MSEC + && !result && timeout_is_event) { + evl->result_flags |= _NC_EVENT_TIMEOUT_MSEC; + } + } + } +#endif + +#elif defined(__BEOS__) + /* + * BeOS's select() is declared in socket.h, so the configure script does + * not see it. That's just as well, since that function works only for + * sockets. This (using snooze and ioctl) was distilled from Be's patch + * for ncurses which uses a separate thread to simulate select(). + * + * FIXME: the return values from the ioctl aren't very clear if we get + * interrupted. + * + * FIXME: this assumes mode&1 if milliseconds < 0 (see lib_getch.c). + */ + result = TW_NONE; + if (mode & TW_INPUT) { + int step = (milliseconds < 0) ? 0 : 5000; + bigtime_t d; + bigtime_t useconds = milliseconds * 1000; + int n, howmany; + + if (useconds <= 0) /* we're here to go _through_ the loop */ + useconds = 1; + + for (d = 0; d < useconds; d += step) { + n = 0; + howmany = ioctl(0, 'ichr', &n); + if (howmany >= 0 && n > 0) { + result = 1; + break; + } + if (useconds > 1 && step > 0) { + snooze(step); + milliseconds -= (step / 1000); + if (milliseconds <= 0) { + milliseconds = 0; + break; + } + } + } + } else if (milliseconds > 0) { + snooze(milliseconds * 1000); + milliseconds = 0; + } +#elif HAVE_SELECT + /* + * select() modifies the fd_set arguments; do this in the + * loop. + */ + FD_ZERO(&set); + +#if !USE_KLIBC_KBD + if (mode & TW_INPUT) { + FD_SET(sp->_ifd, &set); + count = sp->_ifd + 1; + } +#endif + if ((mode & TW_MOUSE) + && (fd = sp->_mouse_fd) >= 0) { + FD_SET(fd, &set); + count = Max(fd, count) + 1; + } +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl) { + for (n = 0; n < evl->count; ++n) { + _nc_event *ev = evl->events[n]; + + if (ev->type == _NC_EVENT_FILE + && (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) { + FD_SET(ev->data.fev.fd, &set); + count = Max(ev->data.fev.fd + 1, count); + } + } + } +#endif + +#if USE_KLIBC_KBD + for (saved_set = set;; set = saved_set) { + if ((mode & TW_INPUT) + && (sp->_extended_key + || (KbdPeek(&ki, 0) == 0 + && (ki.fbStatus & KBDTRF_FINAL_CHAR_IN)))) { + FD_ZERO(&set); + FD_SET(sp->_ifd, &set); + result = 1; + break; + } + + tv.tv_sec = 0; + tv.tv_usec = (milliseconds == 0) ? 0 : (10 * 1000); + + if ((result = select(count, &set, NULL, NULL, &tv)) != 0) + break; + + /* Time out ? */ + if (milliseconds >= 0 && _nc_gettime(&t0, FALSE) >= milliseconds) { + result = 0; + break; + } + } +#else + if (milliseconds >= 0) { + struct timeval ntimeout; + ntimeout.tv_sec = milliseconds / 1000; + ntimeout.tv_usec = (milliseconds % 1000) * 1000; + result = select(count, &set, NULL, NULL, &ntimeout); + } else { + result = select(count, &set, NULL, NULL, NULL); + } +#endif + +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl) { + evl->result_flags = 0; + for (n = 0; n < evl->count; ++n) { + _nc_event *ev = evl->events[n]; + + if (ev->type == _NC_EVENT_FILE + && (ev->data.fev.flags & _NC_EVENT_FILE_READABLE)) { + ev->data.fev.result = 0; + if (FD_ISSET(ev->data.fev.fd, &set)) { + ev->data.fev.result |= _NC_EVENT_FILE_READABLE; + evl->result_flags |= _NC_EVENT_FILE_READABLE; + } + } else if (ev->type == _NC_EVENT_TIMEOUT_MSEC + && !result && timeout_is_event) + evl->result_flags |= _NC_EVENT_TIMEOUT_MSEC; + } + } +#endif + +#endif /* USE_FUNC_POLL, etc */ + + returntime = _nc_gettime(&t0, FALSE); + + if (milliseconds >= 0) + milliseconds -= (int) (returntime - starttime); + +#ifdef NCURSES_WGETCH_EVENTS + if (evl) { + evl->result_flags = 0; + for (n = 0; n < evl->count; ++n) { + _nc_event *ev = evl->events[n]; + + if (ev->type == _NC_EVENT_TIMEOUT_MSEC) { + long diff = (returntime - starttime); + if (ev->data.timeout_msec <= diff) + ev->data.timeout_msec = 0; + else + ev->data.timeout_msec -= diff; + } + + } + } +#endif + +#if PRECISE_GETTIME && HAVE_NANOSLEEP + /* + * If the timeout hasn't expired, and we've gotten no data, + * this is probably a system where 'select()' needs to be left + * alone so that it can complete. Make this process sleep, + * then come back for more. + */ + if (result == 0 && milliseconds > 100) { + napms(100); /* FIXME: this won't be right if I recur! */ + milliseconds -= 100; + goto retry; + } +#endif + + /* return approximate time left in milliseconds */ + if (timeleft) + *timeleft = milliseconds; + + TR(TRACE_IEVENT, ("end twait: returned %d (%d), remaining time %d msec", + result, errno, milliseconds)); + + /* + * Both 'poll()' and 'select()' return the number of file descriptors + * that are active. Translate this back to the mask that denotes which + * file-descriptors, so that we don't need all of this system-specific + * code everywhere. + */ + if (result != 0) { + if (result > 0) { + result = 0; +#if USE_FUNC_POLL + for (count = 0; count < MIN_FDS; count++) { + if ((mode & (1 << count)) + && (fds[count].revents & POLLIN)) { + result |= (1 << count); + } + } +#elif defined(__BEOS__) + result = TW_INPUT; /* redundant, but simple */ +#elif HAVE_SELECT + if ((mode & TW_MOUSE) + && (fd = sp->_mouse_fd) >= 0 + && FD_ISSET(fd, &set)) + result |= TW_MOUSE; + if ((mode & TW_INPUT) + && FD_ISSET(sp->_ifd, &set)) + result |= TW_INPUT; +#endif + } else + result = 0; + } +#ifdef NCURSES_WGETCH_EVENTS + if ((mode & TW_EVENT) && evl && evl->result_flags) + result |= TW_EVENT; +#endif + +#if USE_FUNC_POLL +#ifdef NCURSES_WGETCH_EVENTS + if (fds != fd_list) + free((char *) fds); +#endif +#endif + + return (result); +} diff --git a/contrib/ncurses/ncurses/tty/lib_vidattr.c b/contrib/ncurses/ncurses/tty/lib_vidattr.c new file mode 100644 index 00000000..2c7a0b27 --- /dev/null +++ b/contrib/ncurses/ncurses/tty/lib_vidattr.c @@ -0,0 +1,433 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/* + * vidputs(newmode, outc) + * + * newmode is taken to be the logical 'or' of the symbols in curses.h + * representing graphic renditions. The terminal is set to be in all of + * the given modes, if possible. + * + * if the new attribute is normal + * if exit-alt-char-set exists + * emit it + * emit exit-attribute-mode + * else if set-attributes exists + * use it to set exactly what you want + * else + * if exit-attribute-mode exists + * turn off everything + * else + * turn off those which can be turned off and aren't in + * newmode. + * turn on each mode which should be on and isn't, one by one + * + * NOTE that this algorithm won't achieve the desired mix of attributes + * in some cases, but those are probably just those cases in which it is + * actually impossible, anyway, so... + * + * NOTE that we cannot assume that there's no interaction between color + * and other attribute resets. So each time we reset color (or other + * attributes) we'll have to be prepared to restore the other. + */ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_vidattr.c,v 1.79 2023/04/28 20:59:26 tom Exp $") + +#define doPut(mode) \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc) + +#define TurnOn(mask, mode) \ + if ((turn_on & mask) && mode) { \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \ + } + +#define TurnOff(mask, mode) \ + if ((turn_off & mask) && mode) { \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \ + turn_off &= ~mask; \ + } + + /* if there is no current screen, assume we *can* do color */ +#define SetColorsIf(why, old_attr) \ + if (can_color && (why)) { \ + int old_pair = PairNumber(old_attr); \ + TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, pair)); \ + if ((pair != old_pair) \ + || (fix_pair0 && (pair == 0)) \ + || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \ + NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \ + (short) old_pair, \ + (short) pair, \ + reverse, outc); \ + } \ + } + +#define PreviousAttr _nc_prescreen.previous_attr + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(vidputs) (NCURSES_SP_DCLx + chtype newmode, + NCURSES_SP_OUTC outc) +{ + attr_t turn_on, turn_off; + int pair; + bool reverse = FALSE; + bool can_color = (SP_PARM == 0 || SP_PARM->_coloron); +#if NCURSES_EXT_FUNCS + bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color); +#else +#define fix_pair0 FALSE +#endif + + newmode &= A_ATTRIBUTES; + + T((T_CALLED("vidputs(%p,%s)"), (void *) SP_PARM, _traceattr(newmode))); + + if (!IsValidTIScreen(SP_PARM)) + returnCode(ERR); + + /* this allows us to go on whether or not newterm() has been called */ + if (SP_PARM) + PreviousAttr = AttrOf(SCREEN_ATTRS(SP_PARM)); + + TR(TRACE_ATTRS, ("previous attribute was %s", _traceattr(PreviousAttr))); + + if ((SP_PARM != 0) + && (magic_cookie_glitch > 0)) { +#if USE_XMC_SUPPORT + static const chtype table[] = + { + A_STANDOUT, + A_UNDERLINE, + A_REVERSE, + A_BLINK, + A_DIM, + A_BOLD, + A_INVIS, + A_PROTECT, +#if USE_ITALIC + A_ITALIC, +#endif + }; + unsigned n; + int used = 0; +#ifdef max_attributes /* not in U/Win */ + int limit = (max_attributes <= 0) ? 1 : max_attributes; +#else + int limit = 1; +#endif + chtype retain = 0; + + /* + * Limit the number of attribute bits set in the newmode according to + * the terminfo max_attributes value. + */ + for (n = 0; n < SIZEOF(table); ++n) { + if ((table[n] & SP_PARM->_ok_attributes) == 0) { + newmode &= ~table[n]; + } else if ((table[n] & newmode) != 0) { + if (used++ >= limit) { + newmode &= ~table[n]; + if (newmode == retain) + break; + } else { + retain = newmode; + } + } + } +#else + newmode &= ~(SP_PARM->_xmc_suppress); +#endif + TR(TRACE_ATTRS, ("suppressed attribute is %s", _traceattr(newmode))); + } + + /* + * If we have a terminal that cannot combine color with video + * attributes, use the colors in preference. + */ + if (((newmode & A_COLOR) != 0 + || fix_pair0) + && (no_color_video > 0)) { + /* + * If we had chosen the A_xxx definitions to correspond to the + * no_color_video mask, we could simply shift it up and mask off the + * attributes. But we did not (actually copied Solaris' definitions). + * However, this is still simpler/faster than a lookup table. + * + * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK, + * A_DIM, A_BOLD which are 1:1 with no_color_video. The bits that + * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and + * A_ALTCHARSET (256) down 2 to line up. We use the NCURSES_BITS + * macro so this will work properly for the wide-character layout. + */ + unsigned value = (unsigned) no_color_video; + attr_t mask = NCURSES_BITS((value & 63) + | ((value & 192) << 1) + | ((value & 256) >> 2), 8); + + if ((mask & A_REVERSE) != 0 + && (newmode & A_REVERSE) != 0) { + reverse = TRUE; + mask &= ~A_REVERSE; + } + newmode &= ~mask; + } + + if (newmode == PreviousAttr) + returnCode(OK); + + pair = PairNumber(newmode); + + if (reverse) { + newmode &= ~A_REVERSE; + } + + turn_off = (~newmode & PreviousAttr) & ALL_BUT_COLOR; + turn_on = (newmode & ~(PreviousAttr & TPARM_ATTR)) & ALL_BUT_COLOR; + + SetColorsIf(((pair == 0) && !fix_pair0), PreviousAttr); + + if (newmode == A_NORMAL) { + if ((PreviousAttr & A_ALTCHARSET) && exit_alt_charset_mode) { + doPut(exit_alt_charset_mode); + PreviousAttr &= ~A_ALTCHARSET; + } + if (PreviousAttr) { + if (exit_attribute_mode) { + doPut(exit_attribute_mode); + } else { + if (!SP_PARM || SP_PARM->_use_rmul) { + TurnOff(A_UNDERLINE, exit_underline_mode); + } + if (!SP_PARM || SP_PARM->_use_rmso) { + TurnOff(A_STANDOUT, exit_standout_mode); + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + TurnOff(A_ITALIC, exit_italics_mode); + } +#endif + (void) turn_off; + } + PreviousAttr &= ALL_BUT_COLOR; + } + + SetColorsIf((pair != 0) || fix_pair0, PreviousAttr); + } else if (set_attributes) { + if (turn_on || turn_off) { + TPUTS_TRACE("set_attributes"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_9(set_attributes, + (newmode & A_STANDOUT) != 0, + (newmode & A_UNDERLINE) != 0, + (newmode & A_REVERSE) != 0, + (newmode & A_BLINK) != 0, + (newmode & A_DIM) != 0, + (newmode & A_BOLD) != 0, + (newmode & A_INVIS) != 0, + (newmode & A_PROTECT) != 0, + (newmode & A_ALTCHARSET) != 0), + 1, outc); + PreviousAttr &= ALL_BUT_COLOR; + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + if (turn_on & A_ITALIC) { + TurnOn(A_ITALIC, enter_italics_mode); + } else if (turn_off & A_ITALIC) { + TurnOff(A_ITALIC, exit_italics_mode); + } + (void) turn_off; + } +#endif + SetColorsIf((pair != 0) || fix_pair0, PreviousAttr); + } else { + + TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off))); + + TurnOff(A_ALTCHARSET, exit_alt_charset_mode); + + if (!SP_PARM || SP_PARM->_use_rmul) { + TurnOff(A_UNDERLINE, exit_underline_mode); + } + + if (!SP_PARM || SP_PARM->_use_rmso) { + TurnOff(A_STANDOUT, exit_standout_mode); + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + TurnOff(A_ITALIC, exit_italics_mode); + } +#endif + if (turn_off && exit_attribute_mode) { + doPut(exit_attribute_mode); + turn_on |= (newmode & ALL_BUT_COLOR); + PreviousAttr &= ALL_BUT_COLOR; + } + SetColorsIf((pair != 0) || fix_pair0, PreviousAttr); + + TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on))); + /* *INDENT-OFF* */ + TurnOn(A_ALTCHARSET, enter_alt_charset_mode); + TurnOn(A_BLINK, enter_blink_mode); + TurnOn(A_BOLD, enter_bold_mode); + TurnOn(A_DIM, enter_dim_mode); + TurnOn(A_REVERSE, enter_reverse_mode); + TurnOn(A_STANDOUT, enter_standout_mode); + TurnOn(A_PROTECT, enter_protected_mode); + TurnOn(A_INVIS, enter_secure_mode); + TurnOn(A_UNDERLINE, enter_underline_mode); +#if USE_ITALIC + TurnOn(A_ITALIC, enter_italics_mode); +#endif +#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode) + TurnOn(A_HORIZONTAL, enter_horizontal_hl_mode); + TurnOn(A_LEFT, enter_left_hl_mode); + TurnOn(A_LOW, enter_low_hl_mode); + TurnOn(A_RIGHT, enter_right_hl_mode); + TurnOn(A_TOP, enter_top_hl_mode); + TurnOn(A_VERTICAL, enter_vertical_hl_mode); +#endif + /* *INDENT-ON* */ + } + + if (reverse) + newmode |= A_REVERSE; + + if (SP_PARM) + SetAttr(SCREEN_ATTRS(SP_PARM), newmode); + else + PreviousAttr = newmode; + + returnCode(OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +vidputs(chtype newmode, NCURSES_OUTC outc) +{ + SetSafeOutcWrapper(outc); + return NCURSES_SP_NAME(vidputs) (CURRENT_SCREEN, + newmode, + _nc_outc_wrapper); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(vidattr) (NCURSES_SP_DCLx chtype newmode) +{ + T((T_CALLED("vidattr(%p,%s)"), (void *) SP_PARM, _traceattr(newmode))); + returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx + newmode, + NCURSES_SP_NAME(_nc_putchar))); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +vidattr(chtype newmode) +{ + return NCURSES_SP_NAME(vidattr) (CURRENT_SCREEN, newmode); +} +#endif + +NCURSES_EXPORT(chtype) +NCURSES_SP_NAME(termattrs) (NCURSES_SP_DCL0) +{ + chtype attrs = A_NORMAL; + + T((T_CALLED("termattrs(%p)"), (void *) SP_PARM)); + + if (HasTerminal(SP_PARM)) { +#ifdef USE_TERM_DRIVER + attrs = CallDriver(SP_PARM, td_conattr); +#else /* ! USE_TERM_DRIVER */ + + if (enter_alt_charset_mode) + attrs |= A_ALTCHARSET; + + if (enter_blink_mode) + attrs |= A_BLINK; + + if (enter_bold_mode) + attrs |= A_BOLD; + + if (enter_dim_mode) + attrs |= A_DIM; + + if (enter_reverse_mode) + attrs |= A_REVERSE; + + if (enter_standout_mode) + attrs |= A_STANDOUT; + + if (enter_protected_mode) + attrs |= A_PROTECT; + + if (enter_secure_mode) + attrs |= A_INVIS; + + if (enter_underline_mode) + attrs |= A_UNDERLINE; + + if (SP_PARM->_coloron) + attrs |= A_COLOR; + +#if USE_ITALIC + if (enter_italics_mode) + attrs |= A_ITALIC; +#endif + +#endif /* USE_TERM_DRIVER */ + } + returnChtype(attrs); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(chtype) +termattrs(void) +{ + return NCURSES_SP_NAME(termattrs) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/tty/tty_update.c b/contrib/ncurses/ncurses/tty/tty_update.c new file mode 100644 index 00000000..0427024c --- /dev/null +++ b/contrib/ncurses/ncurses/tty/tty_update.c @@ -0,0 +1,2292 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * + ****************************************************************************/ + +/*----------------------------------------------------------------- + * + * lib_doupdate.c + * + * The routine doupdate() and its dependents. + * All physical output is concentrated here (except _nc_outch() + * in lib_tputs.c). + * + *-----------------------------------------------------------------*/ + +#define NEW_PAIR_INTERNAL 1 + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +#if defined __HAIKU__ && defined __BEOS__ +#undef __BEOS__ +#endif + +#ifdef __BEOS__ +#undef false +#undef true +#include +#endif + +#if defined(TRACE) && HAVE_SYS_TIMES_H && HAVE_TIMES +#define USE_TRACE_TIMES 1 +#else +#define USE_TRACE_TIMES 0 +#endif + +#if HAVE_SYS_TIME_H && HAVE_SYS_TIME_SELECT +#include +#endif + +#if USE_TRACE_TIMES +#include +#endif + +#if USE_FUNC_POLL +#elif HAVE_SELECT +#if HAVE_SYS_SELECT_H +#include +#endif +#endif + +#include + +MODULE_ID("$Id: tty_update.c,v 1.316 2024/02/04 00:09:34 tom Exp $") + +/* + * This define controls the line-breakout optimization. Every once in a + * while during screen refresh, we want to check for input and abort the + * update if there's some waiting. CHECK_INTERVAL controls the number of + * changed lines to be emitted between input checks. + * + * Note: Input-check-and-abort is no longer done if the screen is being + * updated from scratch. This is a feature, not a bug. + */ +#define CHECK_INTERVAL 5 + +#define FILL_BCE(sp) (sp->_coloron && !sp->_default_color && !back_color_erase) + +static const NCURSES_CH_T blankchar = NewChar(BLANK_TEXT); +static NCURSES_CH_T normal = NewChar(BLANK_TEXT); + +/* + * Enable checking to see if doupdate and friends are tracking the true + * cursor position correctly. NOTE: this is a debugging hack which will + * work ONLY on ANSI-compatible terminals! + */ +/* #define POSITION_DEBUG */ + +static NCURSES_INLINE NCURSES_CH_T ClrBlank(NCURSES_SP_DCLx WINDOW *win); + +#if NCURSES_SP_FUNCS +static int ClrBottom(SCREEN *, int total); +static void ClearScreen(SCREEN *, NCURSES_CH_T blank); +static void ClrUpdate(SCREEN *); +static void DelChar(SCREEN *, int count); +static void InsStr(SCREEN *, NCURSES_CH_T *line, int count); +static void TransformLine(SCREEN *, int const lineno); +#else +static int ClrBottom(int total); +static void ClearScreen(NCURSES_CH_T blank); +static void ClrUpdate(void); +static void DelChar(int count); +static void InsStr(NCURSES_CH_T *line, int count); +static void TransformLine(int const lineno); +#endif + +#ifdef POSITION_DEBUG +/**************************************************************************** + * + * Debugging code. Only works on ANSI-standard terminals. + * + ****************************************************************************/ + +static void +position_check(NCURSES_SP_DCLx int expected_y, int expected_x, const char *legend) +/* check to see if the real cursor position matches the virtual */ +{ + char buf[20]; + char *s; + int y, x; + + if (!_nc_tracing || (expected_y < 0 && expected_x < 0)) + return; + + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + memset(buf, '\0', sizeof(buf)); + NCURSES_PUTP2_FLUSH("cpr", "\033[6n"); /* only works on ANSI-compatibles */ + *(s = buf) = 0; + do { + int ask = sizeof(buf) - 1 - (s - buf); + int got = read(0, s, ask); + if (got == 0) + break; + s += got; + } while (strchr(buf, 'R') == 0); + _tracef("probe returned %s", _nc_visbuf(buf)); + + /* try to interpret as a position report */ + if (sscanf(buf, "\033[%d;%dR", &y, &x) != 2) { + _tracef("position probe failed in %s", legend); + } else { + if (expected_x < 0) + expected_x = x - 1; + if (expected_y < 0) + expected_y = y - 1; + if (y - 1 != expected_y || x - 1 != expected_x) { + NCURSES_SP_NAME(beep) (NCURSES_SP_ARG); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_2("\033[%d;%dH", + expected_y + 1, + expected_x + 1), + 1, NCURSES_SP_NAME(_nc_outch)); + _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s", + y - 1, x - 1, expected_y, expected_x, legend); + } else { + _tracef("position matches OK in %s", legend); + } + } +} +#else +#define position_check(expected_y, expected_x, legend) /* nothing */ +#endif /* POSITION_DEBUG */ + +/**************************************************************************** + * + * Optimized update code + * + ****************************************************************************/ + +static NCURSES_INLINE void +GoTo(NCURSES_SP_DCLx int const row, int const col) +{ + TR(TRACE_MOVE, ("GoTo(%p, %d, %d) from (%d, %d)", + (void *) SP_PARM, row, col, SP_PARM->_cursrow, SP_PARM->_curscol)); + + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, "GoTo"); + + TINFO_MVCUR(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, + row, col); + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, "GoTo2"); +} + +#if !NCURSES_WCWIDTH_GRAPHICS +#define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && wcwidth(ch) > 1) +#endif /* !NCURSES_WCWIDTH_GRAPHICS */ + +static NCURSES_INLINE void +PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) +{ + int chlen = 1; + NCURSES_CH_T my_ch; +#if USE_WIDEC_SUPPORT + PUTC_DATA; +#endif + NCURSES_CH_T tilde; + NCURSES_CH_T attr = CHDEREF(ch); + + TR(TRACE_CHARPUT, ("PutAttrChar(%s) at (%d, %d)", + _tracech_t(ch), + SP_PARM->_cursrow, SP_PARM->_curscol)); +#if USE_WIDEC_SUPPORT + /* + * If this is not a valid character, there is nothing more to do. + */ + if (isWidecExt(CHDEREF(ch))) { + TR(TRACE_CHARPUT, ("...skip")); + return; + } + /* + * Determine the number of character cells which the 'ch' value will use + * on the screen. It should be at least one. + */ + if ((chlen = _nc_wacs_width(CharOf(CHDEREF(ch)))) <= 0) { + static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); + + /* + * If the character falls into any of these special cases, do + * not force the result to a blank: + * + * a) it is printable (this works around a bug in wcwidth()). + * b) use_legacy_coding() has been called to modify the treatment + * of codes 128-255. + * c) the acs_map[] has been initialized to allow codes 0-31 + * to be rendered. This supports Linux console's "PC" + * characters. Codes 128-255 are allowed though this is + * not checked. + */ + if (is8bits(CharOf(CHDEREF(ch))) + && (!is7bits(CharOf(CHDEREF(ch))) && _nc_unicode_locale()) + && (isprint(CharOf(CHDEREF(ch))) + || (SP_PARM->_legacy_coding > 0 && CharOf(CHDEREF(ch)) >= 160) + || (SP_PARM->_legacy_coding > 1 && CharOf(CHDEREF(ch)) >= 128) + || (AttrOf(attr) & A_ALTCHARSET + && ((CharOfD(ch) < ACS_LEN + && SP_PARM->_acs_map != 0 + && SP_PARM->_acs_map[CharOfD(ch)] != 0) + || (CharOfD(ch) >= 128))))) { + ; + } else { + ch = CHREF(blank); + TR(TRACE_CHARPUT, ("forced to blank")); + } + chlen = 1; + } +#endif + + if ((AttrOf(attr) & A_ALTCHARSET) + && SP_PARM->_acs_map != 0 + && ((CharOfD(ch) < ACS_LEN) +#if !NCURSES_WCWIDTH_GRAPHICS + || is_wacs_value(CharOfD(ch)) +#endif + )) { + int c8; + my_ch = CHDEREF(ch); /* work around const param */ + c8 = CharOf(my_ch); +#if USE_WIDEC_SUPPORT + /* + * This is crude & ugly, but works most of the time. It checks if the + * acs_chars string specified that we have a mapping for this + * character, and uses the wide-character mapping when we expect the + * normal one to be broken (by mis-design ;-). + */ + if (SP_PARM->_screen_unicode + && _nc_wacs[CharOf(my_ch)].chars[0]) { + if (SP_PARM->_screen_acs_map[CharOf(my_ch)]) { + if (SP_PARM->_screen_acs_fix) { + RemAttr(attr, A_ALTCHARSET); + my_ch = _nc_wacs[CharOf(my_ch)]; + } + } else { + RemAttr(attr, A_ALTCHARSET); + my_ch = _nc_wacs[CharOf(my_ch)]; + } +#if !NCURSES_WCWIDTH_GRAPHICS + if (!(AttrOf(attr) & A_ALTCHARSET)) { + chlen = 1; + } +#endif /* !NCURSES_WCWIDTH_GRAPHICS */ + } else +#endif + if (!SP_PARM->_screen_acs_map[c8]) { + /* + * If we found no mapping for a given alternate-character set item + * in the terminal description, attempt to use the ASCII fallback + * code which is populated in the _acs_map[] array. If that did + * not correspond to a line-drawing, etc., graphics character, the + * array entry would be empty. + */ + chtype temp = UChar(SP_PARM->_acs_map[c8]); + if (temp) { + RemAttr(attr, A_ALTCHARSET); + SetChar(my_ch, temp, AttrOf(attr)); + } + } + + /* + * If we (still) have alternate character set, it is the normal 8bit + * flavor. The _screen_acs_map[] array tells if the character was + * really in acs_chars, needed because of the way wide/normal line + * drawing flavors are integrated. + */ + if (AttrOf(attr) & A_ALTCHARSET) { + int j = CharOfD(ch); + chtype temp = UChar(SP_PARM->_acs_map[j]); + + if (temp != 0) { + SetChar(my_ch, temp, AttrOf(attr)); + } else { + my_ch = CHDEREF(ch); + RemAttr(attr, A_ALTCHARSET); + } + } + ch = CHREF(my_ch); + } +#if USE_WIDEC_SUPPORT && !NCURSES_WCWIDTH_GRAPHICS + else if (chlen > 1 && is_wacs_value(CharOfD(ch))) { + chlen = 1; + } +#endif + if (tilde_glitch && (CharOfD(ch) == L('~'))) { + SetChar(tilde, L('`'), AttrOf(attr)); + ch = CHREF(tilde); + } + + UpdateAttrs(SP_PARM, attr); + PUTC(CHDEREF(ch)); +#if !USE_WIDEC_SUPPORT + COUNT_OUTCHARS(1); +#endif + SP_PARM->_curscol += chlen; + if (char_padding) { + NCURSES_PUTP2("char_padding", char_padding); + } +} + +static bool +check_pending(NCURSES_SP_DCL0) +/* check for pending input */ +{ + bool have_pending = FALSE; + + /* + * Only carry out this check when the flag is zero, otherwise we'll + * have the refreshing slow down drastically (or stop) if there's an + * unread character available. + */ + if (SP_PARM->_fifohold != 0) + return FALSE; + + if (SP_PARM->_checkfd >= 0) { +#if USE_FUNC_POLL + struct pollfd fds[1]; + fds[0].fd = SP_PARM->_checkfd; + fds[0].events = POLLIN; + if (poll(fds, (size_t) 1, 0) > 0) { + have_pending = TRUE; + } +#elif defined(__BEOS__) + /* + * BeOS's select() is declared in socket.h, so the configure script does + * not see it. That's just as well, since that function works only for + * sockets. This (using snooze and ioctl) was distilled from Be's patch + * for ncurses which uses a separate thread to simulate select(). + * + * FIXME: the return values from the ioctl aren't very clear if we get + * interrupted. + */ + int n = 0; + int howmany = ioctl(0, 'ichr', &n); + if (howmany >= 0 && n > 0) { + have_pending = TRUE; + } +#elif HAVE_SELECT + fd_set fdset; + struct timeval ktimeout; + + ktimeout.tv_sec = + ktimeout.tv_usec = 0; + + FD_ZERO(&fdset); + FD_SET(SP_PARM->_checkfd, &fdset); + if (select(SP_PARM->_checkfd + 1, &fdset, NULL, NULL, &ktimeout) != 0) { + have_pending = TRUE; + } +#endif + } + if (have_pending) { + SP_PARM->_fifohold = 5; + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + } + return FALSE; +} + +/* put char at lower right corner */ +static void +PutCharLR(NCURSES_SP_DCLx const ARG_CH_T ch) +{ + if (!auto_right_margin) { + /* we can put the char directly */ + PutAttrChar(NCURSES_SP_ARGx ch); + } else if (enter_am_mode && exit_am_mode) { + int oldcol = SP_PARM->_curscol; + /* we can suppress automargin */ + NCURSES_PUTP2("exit_am_mode", exit_am_mode); + + PutAttrChar(NCURSES_SP_ARGx ch); + SP_PARM->_curscol = oldcol; + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, + "exit_am_mode"); + + NCURSES_PUTP2("enter_am_mode", enter_am_mode); + } else if ((enter_insert_mode && exit_insert_mode) + || insert_character || parm_ich) { + GoTo(NCURSES_SP_ARGx + screen_lines(SP_PARM) - 1, + screen_columns(SP_PARM) - 2); + PutAttrChar(NCURSES_SP_ARGx ch); + GoTo(NCURSES_SP_ARGx + screen_lines(SP_PARM) - 1, + screen_columns(SP_PARM) - 2); + InsStr(NCURSES_SP_ARGx + NewScreen(SP_PARM)->_line[screen_lines(SP_PARM) - 1].text + + screen_columns(SP_PARM) - 2, 1); + } +} + +/* + * Wrap the cursor position, i.e., advance to the beginning of the next line. + */ +static void +wrap_cursor(NCURSES_SP_DCL0) +{ + if (eat_newline_glitch) { + /* + * xenl can manifest two different ways. The vt100 way is that, when + * you'd expect the cursor to wrap, it stays hung at the right margin + * (on top of the character just emitted) and doesn't wrap until the + * *next* graphic char is emitted. The c100 way is to ignore LF + * received just after an am wrap. + * + * An aggressive way to handle this would be to emit CR/LF after the + * char and then assume the wrap is done, you're on the first position + * of the next line, and the terminal out of its weird state. Here + * it is safe to just tell the code that the cursor is in hyperspace and + * let the next mvcur() call straighten things out. + */ + SP_PARM->_curscol = -1; + SP_PARM->_cursrow = -1; + } else if (auto_right_margin) { + SP_PARM->_curscol = 0; + SP_PARM->_cursrow++; + /* + * We've actually moved - but may have to work around problems with + * video attributes not working. + */ + if (!move_standout_mode && AttrOf(SCREEN_ATTRS(SP_PARM))) { + TR(TRACE_CHARPUT, ("turning off (%#lx) %s before wrapping", + (unsigned long) AttrOf(SCREEN_ATTRS(SP_PARM)), + _traceattr(AttrOf(SCREEN_ATTRS(SP_PARM))))); + VIDPUTS(SP_PARM, A_NORMAL, 0); + } + } else { + SP_PARM->_curscol--; + } + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, + "wrap_cursor"); +} + +static NCURSES_INLINE void +PutChar(NCURSES_SP_DCLx const ARG_CH_T ch) +/* insert character, handling automargin stuff */ +{ + if (SP_PARM->_cursrow == screen_lines(SP_PARM) - 1 && + SP_PARM->_curscol == screen_columns(SP_PARM) - 1) { + PutCharLR(NCURSES_SP_ARGx ch); + } else { + PutAttrChar(NCURSES_SP_ARGx ch); + } + + if (SP_PARM->_curscol >= screen_columns(SP_PARM)) + wrap_cursor(NCURSES_SP_ARG); + + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, "PutChar"); +} + +/* + * Check whether the given character can be output by clearing commands. This + * includes test for being a space and not including any 'bad' attributes, such + * as A_REVERSE. All attribute flags which don't affect appearance of a space + * or can be output by clearing (A_COLOR in case of bce-terminal) are excluded. + */ +static NCURSES_INLINE bool +can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch) +{ + if (!back_color_erase && SP_PARM->_coloron) { +#if NCURSES_EXT_FUNCS + int pair; + + if (!SP_PARM->_default_color) + return FALSE; + if (!(isDefaultColor(SP_PARM->_default_fg) && + isDefaultColor(SP_PARM->_default_bg))) + return FALSE; + if ((pair = GetPair(CHDEREF(ch))) != 0) { + NCURSES_COLOR_T fg, bg; + if (NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx + (short) pair, + &fg, &bg) == ERR + || !(isDefaultColor(fg) && isDefaultColor(bg))) { + return FALSE; + } + } +#else + if (AttrOfD(ch) & A_COLOR) + return FALSE; +#endif + } + return (ISBLANK(CHDEREF(ch)) && + (AttrOfD(ch) & ~(NONBLANK_ATTR | A_COLOR)) == BLANK_ATTR); +} + +/* + * Issue a given span of characters from an array. + * Must be functionally equivalent to: + * for (i = 0; i < num; i++) + * PutChar(ntext[i]); + * but can leave the cursor positioned at the middle of the interval. + * + * Returns: 0 - cursor is at the end of interval + * 1 - cursor is somewhere in the middle + * + * This code is optimized using ech and rep. + */ +static int +EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T *ntext, int num) +{ + int i; + + TR(TRACE_CHARPUT, ("EmitRange %d:%s", num, _nc_viscbuf(ntext, num))); + + if (erase_chars || repeat_char) { + while (num > 0) { + int runcount; + NCURSES_CH_T ntext0; + + while (num > 1 && !CharEq(ntext[0], ntext[1])) { + PutChar(NCURSES_SP_ARGx CHREF(ntext[0])); + ntext++; + num--; + } + ntext0 = ntext[0]; + if (num == 1) { + PutChar(NCURSES_SP_ARGx CHREF(ntext0)); + return 0; + } + runcount = 2; + + while (runcount < num && CharEq(ntext[runcount], ntext0)) + runcount++; + + /* + * The cost expression in the middle isn't exactly right. + * _cup_ch_cost is an upper bound on the cost for moving to the + * end of the erased area, but not the cost itself (which we + * can't compute without emitting the move). This may result + * in erase_chars not getting used in some situations for + * which it would be marginally advantageous. + */ + if (erase_chars + && runcount > SP_PARM->_ech_cost + SP_PARM->_cup_ch_cost + && can_clear_with(NCURSES_SP_ARGx CHREF(ntext0))) { + UpdateAttrs(SP_PARM, ntext0); + NCURSES_PUTP2("erase_chars", TIPARM_1(erase_chars, runcount)); + + /* + * If this is the last part of the given interval, + * don't bother moving cursor, since it can be the + * last update on the line. + */ + if (runcount < num) { + GoTo(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol + runcount); + } else { + return 1; /* cursor stays in the middle */ + } + } else if (repeat_char != 0 && +#if BSD_TPUTS + !isdigit(UChar(CharOf(ntext0))) && +#endif +#if USE_WIDEC_SUPPORT + (!SP_PARM->_screen_unicode && + (CharOf(ntext0) < ((AttrOf(ntext0) & A_ALTCHARSET) + ? ACS_LEN + : 256))) && +#endif + runcount > SP_PARM->_rep_cost) { + NCURSES_CH_T temp; + bool wrap_possible = (SP_PARM->_curscol + runcount >= + screen_columns(SP_PARM)); + int rep_count = runcount; + + if (wrap_possible) + rep_count--; + + UpdateAttrs(SP_PARM, ntext0); + temp = ntext0; + if ((AttrOf(temp) & A_ALTCHARSET) && + SP_PARM->_acs_map != 0 && + (SP_PARM->_acs_map[CharOf(temp)] & A_CHARTEXT) != 0) { + SetChar(temp, + (SP_PARM->_acs_map[CharOf(ntext0)] & A_CHARTEXT), + AttrOf(ntext0) | A_ALTCHARSET); + } + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_2(repeat_char, + CharOf(temp), + rep_count), + 1, + NCURSES_SP_NAME(_nc_outch)); + SP_PARM->_curscol += rep_count; + + if (wrap_possible) + PutChar(NCURSES_SP_ARGx CHREF(ntext0)); + } else { + for (i = 0; i < runcount; i++) + PutChar(NCURSES_SP_ARGx CHREF(ntext[i])); + } + ntext += runcount; + num -= runcount; + } + return 0; + } + + for (i = 0; i < num; i++) + PutChar(NCURSES_SP_ARGx CHREF(ntext[i])); + return 0; +} + +/* + * Output the line in the given range [first .. last] + * + * If there's a run of identical characters that's long enough to justify + * cursor movement, use that also. + * + * Returns: same as EmitRange + */ +static int +PutRange(NCURSES_SP_DCLx + const NCURSES_CH_T *otext, + const NCURSES_CH_T *ntext, + int row, + int first, int last) +{ + int rc; + + TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)", + (void *) SP_PARM, + (const void *) otext, + (const void *) ntext, + row, first, last)); + + if (otext != ntext + && (last - first + 1) > SP_PARM->_inline_cost) { + int i, j, same; + + for (j = first, same = 0; j <= last; j++) { + if (!same && isWidecExt(otext[j])) + continue; + if (CharEq(otext[j], ntext[j])) { + same++; + } else { + if (same > SP_PARM->_inline_cost) { + EmitRange(NCURSES_SP_ARGx ntext + first, j - same - first); + GoTo(NCURSES_SP_ARGx row, first = j); + } + same = 0; + } + } + i = EmitRange(NCURSES_SP_ARGx ntext + first, j - same - first); + /* + * Always return 1 for the next GoTo() after a PutRange() if we found + * identical characters at end of interval + */ + rc = (same == 0 ? i : 1); + } else { + rc = EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1); + } + return rc; +} + +/* leave unbracketed here so 'indent' works */ +#define MARK_NOCHANGE(win,row) \ + win->_line[row].firstchar = _NOCHANGE; \ + win->_line[row].lastchar = _NOCHANGE; \ + if_USE_SCROLL_HINTS(win->_line[row].oldindex = row) + +NCURSES_EXPORT(int) +TINFO_DOUPDATE(NCURSES_SP_DCL0) +{ + int i; + int nonempty; +#if USE_TRACE_TIMES + struct tms before, after; +#endif /* USE_TRACE_TIMES */ + + T((T_CALLED("_nc_tinfo:doupdate(%p)"), (void *) SP_PARM)); + + _nc_lock_global(update); + + if (SP_PARM == 0) { + _nc_unlock_global(update); + returnCode(ERR); + } +#if !USE_REENTRANT + /* + * It is "legal" but unlikely that an application could assign a new + * value to one of the standard windows. Check for that possibility + * and try to recover. + * + * We do not allow applications to assign new values in the reentrant + * model. + */ +#if NCURSES_SP_FUNCS + if (SP_PARM == CURRENT_SCREEN) { +#endif +#define SyncScreens(internal,exported) \ + if (internal == 0) internal = exported; \ + if (internal != exported) exported = internal + + SyncScreens(CurScreen(SP_PARM), curscr); + SyncScreens(NewScreen(SP_PARM), newscr); + SyncScreens(StdScreen(SP_PARM), stdscr); +#if NCURSES_SP_FUNCS + } +#endif +#endif /* !USE_REENTRANT */ + + if (CurScreen(SP_PARM) == 0 + || NewScreen(SP_PARM) == 0 + || StdScreen(SP_PARM) == 0) { + _nc_unlock_global(update); + returnCode(ERR); + } +#ifdef TRACE + if (USE_TRACEF(TRACE_UPDATE)) { + if (CurScreen(SP_PARM)->_clear) + _tracef("curscr is clear"); + else + _tracedump("curscr", CurScreen(SP_PARM)); + _tracedump("newscr", NewScreen(SP_PARM)); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + + _nc_signal_handler(FALSE); + + if (SP_PARM->_fifohold) + SP_PARM->_fifohold--; + +#if USE_SIZECHANGE + if ((SP_PARM->_endwin == ewSuspend) + || _nc_handle_sigwinch(SP_PARM)) { + /* + * This is a transparent extension: XSI does not address it, + * and applications need not know that ncurses can do it. + * + * Check if the terminal size has changed while curses was off + * (this can happen in an xterm, for example), and resize the + * ncurses data structures accordingly. + */ + _nc_update_screensize(SP_PARM); + } +#endif + + if (SP_PARM->_endwin == ewSuspend) { + + T(("coming back from shell mode")); + NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); + + NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG); + NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); + SP_PARM->_mouse_resume(SP_PARM); + + SP_PARM->_endwin = ewRunning; + } +#if USE_TRACE_TIMES + /* zero the metering machinery */ + RESET_OUTCHARS(); + (void) times(&before); +#endif /* USE_TRACE_TIMES */ + + /* + * This is the support for magic-cookie terminals. The theory: we scan + * the virtual screen looking for attribute turnons. Where we find one, + * check to make sure it is realizable by seeing if the required number of + * un-attributed blanks are present before and after the attributed range; + * try to shift the range boundaries over blanks (not changing the screen + * display) so this becomes true. If it is, shift the beginning attribute + * change appropriately (the end one, if we've gotten this far, is + * guaranteed room for its cookie). If not, nuke the added attributes out + * of the span. + */ +#if USE_XMC_SUPPORT + if (magic_cookie_glitch > 0) { + int j, k; + attr_t rattr = A_NORMAL; + + for (i = 0; i < screen_lines(SP_PARM); i++) { + for (j = 0; j < screen_columns(SP_PARM); j++) { + bool failed = FALSE; + NCURSES_CH_T *thisline = NewScreen(SP_PARM)->_line[i].text; + attr_t thisattr = AttrOf(thisline[j]) & SP_PARM->_xmc_triggers; + attr_t turnon = thisattr & ~rattr; + + /* is an attribute turned on here? */ + if (turnon == 0) { + rattr = thisattr; + continue; + } + + TR(TRACE_ATTRS, ("At (%d, %d): from %s...", i, j, _traceattr(rattr))); + TR(TRACE_ATTRS, ("...to %s", _traceattr(turnon))); + + /* + * If the attribute change location is a blank with a "safe" + * attribute, undo the attribute turnon. This may ensure + * there's enough room to set the attribute before the first + * non-blank in the run. + */ +#define SAFE(scr,a) (!((a) & (scr)->_xmc_triggers)) + if (ISBLANK(thisline[j]) && SAFE(SP_PARM, turnon)) { + RemAttr(thisline[j], turnon); + continue; + } + + /* check that there's enough room at start of span */ + for (k = 1; k <= magic_cookie_glitch; k++) { + if (j - k < 0 + || !ISBLANK(thisline[j - k]) + || !SAFE(SP_PARM, AttrOf(thisline[j - k]))) { + failed = TRUE; + TR(TRACE_ATTRS, ("No room at start in %d,%d%s%s", + i, j - k, + (ISBLANK(thisline[j - k]) + ? "" + : ":nonblank"), + (SAFE(SP_PARM, AttrOf(thisline[j - k])) + ? "" + : ":unsafe"))); + break; + } + } + if (!failed) { + bool end_onscreen = FALSE; + int m, n = j; + + /* find end of span, if it is onscreen */ + for (m = i; m < screen_lines(SP_PARM); m++) { + for (; n < screen_columns(SP_PARM); n++) { + attr_t testattr = + AttrOf(NewScreen(SP_PARM)->_line[m].text[n]); + if ((testattr & SP_PARM->_xmc_triggers) == rattr) { + end_onscreen = TRUE; + TR(TRACE_ATTRS, + ("Range attributed with %s ends at (%d, %d)", + _traceattr(turnon), m, n)); + goto foundit; + } + } + n = 0; + } + TR(TRACE_ATTRS, + ("Range attributed with %s ends offscreen", + _traceattr(turnon))); + foundit:; + + if (end_onscreen) { + NCURSES_CH_T *lastline = + NewScreen(SP_PARM)->_line[m].text; + + /* + * If there are safely-attributed blanks at the end of + * the range, shorten the range. This will help ensure + * that there is enough room at end of span. + */ + while (n >= 0 + && ISBLANK(lastline[n]) + && SAFE(SP_PARM, AttrOf(lastline[n]))) { + RemAttr(lastline[n--], turnon); + } + + /* check that there's enough room at end of span */ + for (k = 1; k <= magic_cookie_glitch; k++) { + if (n + k >= screen_columns(SP_PARM) + || !ISBLANK(lastline[n + k]) + || !SAFE(SP_PARM, AttrOf(lastline[n + k]))) { + failed = TRUE; + TR(TRACE_ATTRS, + ("No room at end in %d,%d%s%s", + i, j - k, + (ISBLANK(lastline[n + k]) + ? "" + : ":nonblank"), + (SAFE(SP_PARM, AttrOf(lastline[n + k])) + ? "" + : ":unsafe"))); + break; + } + } + } + } + + if (failed) { + int p, q = j; + + TR(TRACE_ATTRS, + ("Clearing %s beginning at (%d, %d)", + _traceattr(turnon), i, j)); + + /* turn off new attributes over span */ + for (p = i; p < screen_lines(SP_PARM); p++) { + for (; q < screen_columns(SP_PARM); q++) { + attr_t testattr = AttrOf(newscr->_line[p].text[q]); + if ((testattr & SP_PARM->_xmc_triggers) == rattr) + goto foundend; + RemAttr(NewScreen(SP_PARM)->_line[p].text[q], turnon); + } + q = 0; + } + foundend:; + } else { + TR(TRACE_ATTRS, + ("Cookie space for %s found before (%d, %d)", + _traceattr(turnon), i, j)); + + /* + * Back up the start of range so there's room for cookies + * before the first nonblank character. + */ + for (k = 1; k <= magic_cookie_glitch; k++) + AddAttr(thisline[j - k], turnon); + } + + rattr = thisattr; + } + } + +#ifdef TRACE + /* show altered highlights after magic-cookie check */ + if (USE_TRACEF(TRACE_UPDATE)) { + _tracef("After magic-cookie check..."); + _tracedump("newscr", NewScreen(SP_PARM)); + _nc_unlock_global(tracef); + } +#endif /* TRACE */ + } +#endif /* USE_XMC_SUPPORT */ + + nonempty = 0; + if (CurScreen(SP_PARM)->_clear || NewScreen(SP_PARM)->_clear) { /* force refresh ? */ + ClrUpdate(NCURSES_SP_ARG); + CurScreen(SP_PARM)->_clear = FALSE; /* reset flag */ + NewScreen(SP_PARM)->_clear = FALSE; /* reset flag */ + } else { + int changedlines = CHECK_INTERVAL; + + if (check_pending(NCURSES_SP_ARG)) + goto cleanup; + + nonempty = Min(screen_lines(SP_PARM), NewScreen(SP_PARM)->_maxy + 1); + + if (SP_PARM->_scrolling) { + NCURSES_SP_NAME(_nc_scroll_optimize) (NCURSES_SP_ARG); + } + + nonempty = ClrBottom(NCURSES_SP_ARGx nonempty); + + TR(TRACE_UPDATE, ("Transforming lines, nonempty %d", nonempty)); + for (i = 0; i < nonempty; i++) { + /* + * Here is our line-breakout optimization. + */ + if (changedlines == CHECK_INTERVAL) { + if (check_pending(NCURSES_SP_ARG)) + goto cleanup; + changedlines = 0; + } + + /* + * newscr->line[i].firstchar is normally set + * by wnoutrefresh. curscr->line[i].firstchar + * is normally set by _nc_scroll_window in the + * vertical-movement optimization code, + */ + if (NewScreen(SP_PARM)->_line[i].firstchar != _NOCHANGE + || CurScreen(SP_PARM)->_line[i].firstchar != _NOCHANGE) { + TransformLine(NCURSES_SP_ARGx i); + changedlines++; + } + + /* mark line changed successfully */ + if (i <= NewScreen(SP_PARM)->_maxy) { + MARK_NOCHANGE(NewScreen(SP_PARM), i); + } + if (i <= CurScreen(SP_PARM)->_maxy) { + MARK_NOCHANGE(CurScreen(SP_PARM), i); + } + } + } + + /* put everything back in sync */ + for (i = nonempty; i <= NewScreen(SP_PARM)->_maxy; i++) { + MARK_NOCHANGE(NewScreen(SP_PARM), i); + } + for (i = nonempty; i <= CurScreen(SP_PARM)->_maxy; i++) { + MARK_NOCHANGE(CurScreen(SP_PARM), i); + } + + if (!NewScreen(SP_PARM)->_leaveok) { + CurScreen(SP_PARM)->_curx = NewScreen(SP_PARM)->_curx; + CurScreen(SP_PARM)->_cury = NewScreen(SP_PARM)->_cury; + + GoTo(NCURSES_SP_ARGx CurScreen(SP_PARM)->_cury, CurScreen(SP_PARM)->_curx); + } + + cleanup: + /* + * We would like to keep the physical screen in normal mode in case we get + * other processes writing to the screen. This goal cannot be met for + * magic cookies since it interferes with attributes that may propagate + * past the current position. + */ +#if USE_XMC_SUPPORT + if (magic_cookie_glitch != 0) +#endif + UpdateAttrs(SP_PARM, normal); + + NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG); + WINDOW_ATTRS(CurScreen(SP_PARM)) = WINDOW_ATTRS(NewScreen(SP_PARM)); + +#if USE_TRACE_TIMES + (void) times(&after); + TR(TRACE_TIMES, + ("Update cost: %ld chars, %ld clocks system time, %ld clocks user time", + _nc_outchars, + (long) (after.tms_stime - before.tms_stime), + (long) (after.tms_utime - before.tms_utime))); +#endif /* USE_TRACE_TIMES */ + + _nc_signal_handler(TRUE); + + _nc_unlock_global(update); + returnCode(OK); +} + +#if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER) +NCURSES_EXPORT(int) +doupdate(void) +{ + return TINFO_DOUPDATE(CURRENT_SCREEN); +} +#endif + +/* + * ClrBlank(win) + * + * Returns the attributed character that corresponds to the "cleared" + * screen. If the terminal has the back-color-erase feature, this will be + * colored according to the wbkgd() call. + * + * We treat 'curscr' specially because it isn't supposed to be set directly + * in the wbkgd() call. Assume 'stdscr' for this case. + */ +#define BCE_ATTRS (A_NORMAL|A_COLOR) +#define BCE_BKGD(sp,win) (((win) == CurScreen(sp) ? StdScreen(sp) : (win))->_nc_bkgd) + +static NCURSES_INLINE NCURSES_CH_T +ClrBlank(NCURSES_SP_DCLx WINDOW *win) +{ + NCURSES_CH_T blank = blankchar; + if (back_color_erase) + AddAttr(blank, (AttrOf(BCE_BKGD(SP_PARM, win)) & BCE_ATTRS)); + return blank; +} + +/* +** ClrUpdate() +** +** Update by clearing and redrawing the entire screen. +** +*/ + +static void +ClrUpdate(NCURSES_SP_DCL0) +{ + TR(TRACE_UPDATE, (T_CALLED("ClrUpdate"))); + if (0 != SP_PARM) { + int i; + NCURSES_CH_T blank = ClrBlank(NCURSES_SP_ARGx StdScreen(SP_PARM)); + int nonempty = Min(screen_lines(SP_PARM), + NewScreen(SP_PARM)->_maxy + 1); + + ClearScreen(NCURSES_SP_ARGx blank); + + TR(TRACE_UPDATE, ("updating screen from scratch")); + + nonempty = ClrBottom(NCURSES_SP_ARGx nonempty); + + for (i = 0; i < nonempty; i++) + TransformLine(NCURSES_SP_ARGx i); + } + TR(TRACE_UPDATE, (T_RETURN(""))); +} + +/* +** ClrToEOL(blank) +** +** Clear to end of current line, starting at the cursor position +*/ + +static void +ClrToEOL(NCURSES_SP_DCLx NCURSES_CH_T blank, int needclear) +{ + if (CurScreen(SP_PARM) != 0 + && SP_PARM->_cursrow >= 0) { + int j; + + for (j = SP_PARM->_curscol; j < screen_columns(SP_PARM); j++) { + if (j >= 0) { + NCURSES_CH_T *cp = + &(CurScreen(SP_PARM)->_line[SP_PARM->_cursrow].text[j]); + + if (!CharEq(*cp, blank)) { + *cp = blank; + needclear = TRUE; + } + } + } + } + + if (needclear) { + UpdateAttrs(SP_PARM, blank); + if (clr_eol && SP_PARM->_el_cost <= (screen_columns(SP_PARM) - SP_PARM->_curscol)) { + NCURSES_PUTP2("clr_eol", clr_eol); + } else { + int count = (screen_columns(SP_PARM) - SP_PARM->_curscol); + while (count-- > 0) + PutChar(NCURSES_SP_ARGx CHREF(blank)); + } + } +} + +/* +** ClrToEOS(blank) +** +** Clear to end of screen, starting at the cursor position +*/ + +static void +ClrToEOS(NCURSES_SP_DCLx NCURSES_CH_T blank) +{ + int row, col; + + row = SP_PARM->_cursrow; + col = SP_PARM->_curscol; + + if (row < 0) + row = 0; + if (col < 0) + col = 0; + + UpdateAttrs(SP_PARM, blank); + TPUTS_TRACE("clr_eos"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + clr_eos, + screen_lines(SP_PARM) - row, + NCURSES_SP_NAME(_nc_outch)); + + while (col < screen_columns(SP_PARM)) + CurScreen(SP_PARM)->_line[row].text[col++] = blank; + + for (row++; row < screen_lines(SP_PARM); row++) { + for (col = 0; col < screen_columns(SP_PARM); col++) + CurScreen(SP_PARM)->_line[row].text[col] = blank; + } +} + +/* + * ClrBottom(total) + * + * Test if clearing the end of the screen would satisfy part of the + * screen-update. Do this by scanning backwards through the lines in the + * screen, checking if each is blank, and one or more are changed. + */ +static int +ClrBottom(NCURSES_SP_DCLx int total) +{ + int top = total; + int last = Min(screen_columns(SP_PARM), NewScreen(SP_PARM)->_maxx + 1); + NCURSES_CH_T blank = NewScreen(SP_PARM)->_line[total - 1].text[last - 1]; + + if (clr_eos && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { + int row; + + for (row = total - 1; row >= 0; row--) { + int col; + bool ok; + + for (col = 0, ok = TRUE; ok && col < last; col++) { + ok = (CharEq(NewScreen(SP_PARM)->_line[row].text[col], blank)); + } + if (!ok) + break; + + for (col = 0; ok && col < last; col++) { + ok = (CharEq(CurScreen(SP_PARM)->_line[row].text[col], blank)); + } + if (!ok) + top = row; + } + + /* don't use clr_eos for just one line if clr_eol available */ + if (top < total) { + GoTo(NCURSES_SP_ARGx top, 0); + ClrToEOS(NCURSES_SP_ARGx blank); + if (SP_PARM->oldhash && SP_PARM->newhash) { + for (row = top; row < screen_lines(SP_PARM); row++) + SP_PARM->oldhash[row] = SP_PARM->newhash[row]; + } + } + } + return top; +} + +#if USE_XMC_SUPPORT +#if USE_WIDEC_SUPPORT +#define check_xmc_transition(sp, a, b) \ + ((((a)->attr ^ (b)->attr) & ~((a)->attr) & (sp)->_xmc_triggers) != 0) +#define xmc_turn_on(sp,a,b) check_xmc_transition(sp,&(a), &(b)) +#else +#define xmc_turn_on(sp,a,b) ((((a)^(b)) & ~(a) & (sp)->_xmc_triggers) != 0) +#endif + +#define xmc_new(sp,r,c) NewScreen(sp)->_line[r].text[c] +#define xmc_turn_off(sp,a,b) xmc_turn_on(sp,b,a) +#endif /* USE_XMC_SUPPORT */ + +/* +** TransformLine(lineno) +** +** Transform the given line in curscr to the one in newscr, using +** Insert/Delete Character if idcok && has_ic(). +** +** firstChar = position of first different character in line +** oLastChar = position of last different character in old line +** nLastChar = position of last different character in new line +** +** move to firstChar +** overwrite chars up to Min(oLastChar, nLastChar) +** if oLastChar < nLastChar +** insert newLine[oLastChar+1..nLastChar] +** else +** delete oLastChar - nLastChar spaces +*/ + +static void +TransformLine(NCURSES_SP_DCLx int const lineno) +{ + int firstChar, oLastChar, nLastChar; + NCURSES_CH_T *newLine = NewScreen(SP_PARM)->_line[lineno].text; + NCURSES_CH_T *oldLine = CurScreen(SP_PARM)->_line[lineno].text; + int n; + bool attrchanged = FALSE; + + TR(TRACE_UPDATE, (T_CALLED("TransformLine(%p, %d)"), (void *) SP_PARM, lineno)); + + /* copy new hash value to old one */ + if (SP_PARM->oldhash && SP_PARM->newhash) + SP_PARM->oldhash[lineno] = SP_PARM->newhash[lineno]; + + /* + * If we have colors, there is the possibility of having two color pairs + * that display as the same colors. For instance, Lynx does this. Check + * for this case, and update the old line with the new line's colors when + * they are equivalent. + */ + if (SP_PARM->_coloron) { + int oldPair; + int newPair; + + for (n = 0; n < screen_columns(SP_PARM); n++) { + if (!CharEq(newLine[n], oldLine[n])) { + oldPair = GetPair(oldLine[n]); + newPair = GetPair(newLine[n]); + if (oldPair != newPair + && unColor(oldLine[n]) == unColor(newLine[n])) { + if (oldPair < SP_PARM->_pair_alloc + && newPair < SP_PARM->_pair_alloc + && (isSamePair(SP_PARM->_color_pairs[oldPair], + SP_PARM->_color_pairs[newPair]))) { + SetPair(oldLine[n], GetPair(newLine[n])); + } + } + } + } + } + + if (ceol_standout_glitch && clr_eol) { + firstChar = 0; + while (firstChar < screen_columns(SP_PARM)) { + if (!SameAttrOf(newLine[firstChar], oldLine[firstChar])) { + attrchanged = TRUE; + break; + } + firstChar++; + } + } + + firstChar = 0; + + if (attrchanged) { /* we may have to disregard the whole line */ + GoTo(NCURSES_SP_ARGx lineno, firstChar); + ClrToEOL(NCURSES_SP_ARGx + ClrBlank(NCURSES_SP_ARGx + CurScreen(SP_PARM)), FALSE); + PutRange(NCURSES_SP_ARGx + oldLine, newLine, lineno, 0, + screen_columns(SP_PARM) - 1); +#if USE_XMC_SUPPORT + + /* + * This is a very simple loop to paint characters which may have the + * magic cookie glitch embedded. It doesn't know much about video + * attributes which are continued from one line to the next. It + * assumes that we have filtered out requests for attribute changes + * that do not get mapped to blank positions. + * + * FIXME: we are not keeping track of where we put the cookies, so this + * will work properly only once, since we may overwrite a cookie in a + * following operation. + */ + } else if (magic_cookie_glitch > 0) { + GoTo(NCURSES_SP_ARGx lineno, firstChar); + for (n = 0; n < screen_columns(SP_PARM); n++) { + int m = n + magic_cookie_glitch; + + /* check for turn-on: + * If we are writing an attributed blank, where the + * previous cell is not attributed. + */ + if (ISBLANK(newLine[n]) + && ((n > 0 + && xmc_turn_on(SP_PARM, newLine[n - 1], newLine[n])) + || (n == 0 + && lineno > 0 + && xmc_turn_on(SP_PARM, + xmc_new(SP_PARM, lineno - 1, + screen_columns(SP_PARM) - 1), + newLine[n])))) { + n = m; + } + + PutChar(NCURSES_SP_ARGx CHREF(newLine[n])); + + /* check for turn-off: + * If we are writing an attributed non-blank, where the + * next cell is blank, and not attributed. + */ + if (!ISBLANK(newLine[n]) + && ((n + 1 < screen_columns(SP_PARM) + && xmc_turn_off(SP_PARM, newLine[n], newLine[n + 1])) + || (n + 1 >= screen_columns(SP_PARM) + && lineno + 1 < screen_lines(SP_PARM) + && xmc_turn_off(SP_PARM, + newLine[n], + xmc_new(SP_PARM, lineno + 1, 0))))) { + n = m; + } + + } +#endif + } else { + NCURSES_CH_T blank; + + /* it may be cheap to clear leading whitespace with clr_bol */ + blank = newLine[0]; + if (clr_bol && can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { + int oFirstChar, nFirstChar; + + for (oFirstChar = 0; + oFirstChar < screen_columns(SP_PARM); + oFirstChar++) + if (!CharEq(oldLine[oFirstChar], blank)) + break; + for (nFirstChar = 0; + nFirstChar < screen_columns(SP_PARM); + nFirstChar++) + if (!CharEq(newLine[nFirstChar], blank)) + break; + + if (nFirstChar == oFirstChar) { + firstChar = nFirstChar; + /* find the first differing character */ + while (firstChar < screen_columns(SP_PARM) + && CharEq(newLine[firstChar], oldLine[firstChar])) + firstChar++; + } else if (oFirstChar > nFirstChar) { + firstChar = nFirstChar; + } else { /* oFirstChar < nFirstChar */ + firstChar = oFirstChar; + if (SP_PARM->_el1_cost < nFirstChar - oFirstChar) { + if (nFirstChar >= screen_columns(SP_PARM) + && SP_PARM->_el_cost <= SP_PARM->_el1_cost) { + GoTo(NCURSES_SP_ARGx lineno, 0); + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("clr_eol", clr_eol); + } else { + GoTo(NCURSES_SP_ARGx lineno, nFirstChar - 1); + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("clr_bol", clr_bol); + } + + while (firstChar < nFirstChar) + oldLine[firstChar++] = blank; + } + } + } else { + /* find the first differing character */ + while (firstChar < screen_columns(SP_PARM) + && CharEq(newLine[firstChar], oldLine[firstChar])) + firstChar++; + } + /* if there wasn't one, we're done */ + if (firstChar >= screen_columns(SP_PARM)) { + TR(TRACE_UPDATE, (T_RETURN(""))); + return; + } + + blank = newLine[screen_columns(SP_PARM) - 1]; + + if (!can_clear_with(NCURSES_SP_ARGx CHREF(blank))) { + /* find the last differing character */ + nLastChar = screen_columns(SP_PARM) - 1; + + while (nLastChar > firstChar + && CharEq(newLine[nLastChar], oldLine[nLastChar])) + nLastChar--; + + if (nLastChar >= firstChar) { + GoTo(NCURSES_SP_ARGx lineno, firstChar); + PutRange(NCURSES_SP_ARGx + oldLine, + newLine, + lineno, + firstChar, + nLastChar); + memcpy(oldLine + firstChar, + newLine + firstChar, + (unsigned) (nLastChar - firstChar + 1) * sizeof(NCURSES_CH_T)); + } + TR(TRACE_UPDATE, (T_RETURN(""))); + return; + } + + /* find last non-blank character on old line */ + oLastChar = screen_columns(SP_PARM) - 1; + while (oLastChar > firstChar && CharEq(oldLine[oLastChar], blank)) + oLastChar--; + + /* find last non-blank character on new line */ + nLastChar = screen_columns(SP_PARM) - 1; + while (nLastChar > firstChar && CharEq(newLine[nLastChar], blank)) + nLastChar--; + + if ((nLastChar == firstChar) + && (SP_PARM->_el_cost < (oLastChar - nLastChar))) { + GoTo(NCURSES_SP_ARGx lineno, firstChar); + if (!CharEq(newLine[firstChar], blank)) + PutChar(NCURSES_SP_ARGx CHREF(newLine[firstChar])); + ClrToEOL(NCURSES_SP_ARGx blank, FALSE); + } else if ((nLastChar != oLastChar) + && (!CharEq(newLine[nLastChar], oldLine[oLastChar]) + || !(SP_PARM->_nc_sp_idcok + && NCURSES_SP_NAME(has_ic) (NCURSES_SP_ARG)))) { + GoTo(NCURSES_SP_ARGx lineno, firstChar); + if ((oLastChar - nLastChar) > SP_PARM->_el_cost) { + if (PutRange(NCURSES_SP_ARGx + oldLine, + newLine, + lineno, + firstChar, + nLastChar)) { + GoTo(NCURSES_SP_ARGx lineno, nLastChar + 1); + } + ClrToEOL(NCURSES_SP_ARGx blank, FALSE); + } else { + n = Max(nLastChar, oLastChar); + PutRange(NCURSES_SP_ARGx + oldLine, + newLine, + lineno, + firstChar, + n); + } + } else { + int nLastNonblank = nLastChar; + int oLastNonblank = oLastChar; + + /* find the last characters that really differ */ + /* can be -1 if no characters differ */ + while (CharEq(newLine[nLastChar], oldLine[oLastChar])) { + /* don't split a wide char */ + if (isWidecExt(newLine[nLastChar]) && + !CharEq(newLine[nLastChar - 1], oldLine[oLastChar - 1])) + break; + nLastChar--; + oLastChar--; + if (nLastChar == -1 || oLastChar == -1) + break; + } + + n = Min(oLastChar, nLastChar); + if (n >= firstChar) { + GoTo(NCURSES_SP_ARGx lineno, firstChar); + PutRange(NCURSES_SP_ARGx + oldLine, + newLine, + lineno, + firstChar, + n); + } + + if (oLastChar < nLastChar) { + int m = Max(nLastNonblank, oLastNonblank); +#if USE_WIDEC_SUPPORT + if (n) { + while (isWidecExt(newLine[n + 1]) && n) { + --n; + --oLastChar; /* increase cost */ + } + } else if (n >= firstChar && + isWidecBase(newLine[n])) { + while (isWidecExt(newLine[n + 1])) { + ++n; + ++oLastChar; /* decrease cost */ + } + } +#endif + GoTo(NCURSES_SP_ARGx lineno, n + 1); + if ((nLastChar < nLastNonblank) + || InsCharCost(SP_PARM, nLastChar - oLastChar) > (m - n)) { + PutRange(NCURSES_SP_ARGx + oldLine, + newLine, + lineno, + n + 1, + m); + } else { + InsStr(NCURSES_SP_ARGx &newLine[n + 1], nLastChar - oLastChar); + } + } else if (oLastChar > nLastChar) { + GoTo(NCURSES_SP_ARGx lineno, n + 1); + if (DelCharCost(SP_PARM, oLastChar - nLastChar) + > SP_PARM->_el_cost + nLastNonblank - (n + 1)) { + if (PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno, + n + 1, nLastNonblank)) { + GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1); + } + ClrToEOL(NCURSES_SP_ARGx blank, FALSE); + } else { + /* + * The delete-char sequence will + * effectively shift in blanks from the + * right margin of the screen. Ensure + * that they are the right color by + * setting the video attributes from + * the last character on the row. + */ + UpdateAttrs(SP_PARM, blank); + DelChar(NCURSES_SP_ARGx oLastChar - nLastChar); + } + } + } + } + + /* update the code's internal representation */ + if (screen_columns(SP_PARM) > firstChar) + memcpy(oldLine + firstChar, + newLine + firstChar, + (unsigned) (screen_columns(SP_PARM) - firstChar) * sizeof(NCURSES_CH_T)); + TR(TRACE_UPDATE, (T_RETURN(""))); + return; +} + +/* +** ClearScreen(blank) +** +** Clear the physical screen and put cursor at home +** +*/ + +static void +ClearScreen(NCURSES_SP_DCLx NCURSES_CH_T blank) +{ + int i, j; + bool fast_clear = (clear_screen || clr_eos || clr_eol); + + TR(TRACE_UPDATE, ("ClearScreen() called")); + +#if NCURSES_EXT_FUNCS + if (SP_PARM->_coloron + && !SP_PARM->_default_color) { + NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx + (short) GET_SCREEN_PAIR(SP_PARM), + 0, + FALSE, + NCURSES_SP_NAME(_nc_outch)); + if (!back_color_erase) { + fast_clear = FALSE; + } + } +#endif + + if (fast_clear) { + if (clear_screen) { + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("clear_screen", clear_screen); + SP_PARM->_cursrow = SP_PARM->_curscol = 0; + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, + "ClearScreen"); + } else if (clr_eos) { + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + GoTo(NCURSES_SP_ARGx 0, 0); + UpdateAttrs(SP_PARM, blank); + TPUTS_TRACE("clr_eos"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + clr_eos, + screen_lines(SP_PARM), + NCURSES_SP_NAME(_nc_outch)); + } else if (clr_eol) { + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + UpdateAttrs(SP_PARM, blank); + for (i = 0; i < screen_lines(SP_PARM); i++) { + GoTo(NCURSES_SP_ARGx i, 0); + NCURSES_PUTP2("clr_eol", clr_eol); + } + GoTo(NCURSES_SP_ARGx 0, 0); + } + } else { + UpdateAttrs(SP_PARM, blank); + for (i = 0; i < screen_lines(SP_PARM); i++) { + GoTo(NCURSES_SP_ARGx i, 0); + for (j = 0; j < screen_columns(SP_PARM); j++) + PutChar(NCURSES_SP_ARGx CHREF(blank)); + } + GoTo(NCURSES_SP_ARGx 0, 0); + } + + for (i = 0; i < screen_lines(SP_PARM); i++) { + for (j = 0; j < screen_columns(SP_PARM); j++) + CurScreen(SP_PARM)->_line[i].text[j] = blank; + } + + TR(TRACE_UPDATE, ("screen cleared")); +} + +/* +** InsStr(line, count) +** +** Insert the count characters pointed to by line. +** +*/ + +static void +InsStr(NCURSES_SP_DCLx NCURSES_CH_T *line, int count) +{ + TR(TRACE_UPDATE, ("InsStr(%p, %p,%d) called", + (void *) SP_PARM, + (void *) line, count)); + + /* Prefer parm_ich as it has the smallest cost - no need to shift + * the whole line on each character. */ + /* The order must match that of InsCharCost. */ + if (parm_ich) { + TPUTS_TRACE("parm_ich"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_ich, count), + 1, + NCURSES_SP_NAME(_nc_outch)); + while (count > 0) { + PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); + line++; + count--; + } + } else if (enter_insert_mode && exit_insert_mode) { + NCURSES_PUTP2("enter_insert_mode", enter_insert_mode); + while (count > 0) { + PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); + if (insert_padding) { + NCURSES_PUTP2("insert_padding", insert_padding); + } + line++; + count--; + } + NCURSES_PUTP2("exit_insert_mode", exit_insert_mode); + } else { + while (count > 0) { + NCURSES_PUTP2("insert_character", insert_character); + PutAttrChar(NCURSES_SP_ARGx CHREF(*line)); + if (insert_padding) { + NCURSES_PUTP2("insert_padding", insert_padding); + } + line++; + count--; + } + } + position_check(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, "InsStr"); +} + +/* +** DelChar(count) +** +** Delete count characters at current position +** +*/ + +static void +DelChar(NCURSES_SP_DCLx int count) +{ + TR(TRACE_UPDATE, ("DelChar(%p, %d) called, position = (%ld,%ld)", + (void *) SP_PARM, count, + (long) NewScreen(SP_PARM)->_cury, + (long) NewScreen(SP_PARM)->_curx)); + + if (parm_dch) { + TPUTS_TRACE("parm_dch"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_dch, count), + 1, + NCURSES_SP_NAME(_nc_outch)); + } else { + int n; + + for (n = 0; n < count; n++) { + NCURSES_PUTP2("delete_character", delete_character); + } + } +} + +/* + * Physical-scrolling support + * + * This code was adapted from Keith Bostic's hardware scrolling + * support for 4.4BSD curses. I (esr) translated it to use terminfo + * capabilities, narrowed the call interface slightly, and cleaned + * up some convoluted tests. I also added support for the memory_above + * memory_below, and non_dest_scroll_region capabilities. + * + * For this code to work, we must have either + * change_scroll_region and scroll forward/reverse commands, or + * insert and delete line capabilities. + * When the scrolling region has been set, the cursor has to + * be at the last line of the region to make the scroll up + * happen, or on the first line of region to scroll down. + * + * This code makes one aesthetic decision in the opposite way from + * BSD curses. BSD curses preferred pairs of il/dl operations + * over scrolls, allegedly because il/dl looked faster. We, on + * the other hand, prefer scrolls because (a) they're just as fast + * on many terminals and (b) using them avoids bouncing an + * unchanged bottom section of the screen up and down, which is + * visually nasty. + * + * (lav): added more cases, used dl/il when bot==maxy and in csr case. + * + * I used assumption that capabilities il/il1/dl/dl1 work inside + * changed scroll region not shifting screen contents outside of it. + * If there are any terminals behaving different way, it would be + * necessary to add some conditions to scroll_csr_forward/backward. + */ + +/* Try to scroll up assuming given csr (miny, maxy). Returns ERR on failure */ +static int +scroll_csr_forward(NCURSES_SP_DCLx + int n, + int top, + int bot, + int miny, + int maxy, + NCURSES_CH_T blank) +{ + int i; + + if (n == 1 && scroll_forward && top == miny && bot == maxy) { + GoTo(NCURSES_SP_ARGx bot, 0); + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("scroll_forward", scroll_forward); + } else if (n == 1 && delete_line && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("delete_line", delete_line); + } else if (parm_index && top == miny && bot == maxy) { + GoTo(NCURSES_SP_ARGx bot, 0); + UpdateAttrs(SP_PARM, blank); + TPUTS_TRACE("parm_index"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_index, n), + n, + NCURSES_SP_NAME(_nc_outch)); + } else if (parm_delete_line && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + TPUTS_TRACE("parm_delete_line"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_delete_line, n), + n, + NCURSES_SP_NAME(_nc_outch)); + } else if (scroll_forward && top == miny && bot == maxy) { + GoTo(NCURSES_SP_ARGx bot, 0); + UpdateAttrs(SP_PARM, blank); + for (i = 0; i < n; i++) { + NCURSES_PUTP2("scroll_forward", scroll_forward); + } + } else if (delete_line && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + for (i = 0; i < n; i++) { + NCURSES_PUTP2("delete_line", delete_line); + } + } else + return ERR; + +#if NCURSES_EXT_FUNCS + if (FILL_BCE(SP_PARM)) { + int j; + for (i = 0; i < n; i++) { + GoTo(NCURSES_SP_ARGx bot - i, 0); + for (j = 0; j < screen_columns(SP_PARM); j++) + PutChar(NCURSES_SP_ARGx CHREF(blank)); + } + } +#endif + return OK; +} + +/* Try to scroll down assuming given csr (miny, maxy). Returns ERR on failure */ +/* n > 0 */ +static int +scroll_csr_backward(NCURSES_SP_DCLx + int n, + int top, + int bot, + int miny, + int maxy, + NCURSES_CH_T blank) +{ + int i; + + if (n == 1 && scroll_reverse && top == miny && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("scroll_reverse", scroll_reverse); + } else if (n == 1 && insert_line && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + NCURSES_PUTP2("insert_line", insert_line); + } else if (parm_rindex && top == miny && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + TPUTS_TRACE("parm_rindex"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_rindex, n), + n, + NCURSES_SP_NAME(_nc_outch)); + } else if (parm_insert_line && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + TPUTS_TRACE("parm_insert_line"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_insert_line, n), + n, + NCURSES_SP_NAME(_nc_outch)); + } else if (scroll_reverse && top == miny && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + for (i = 0; i < n; i++) { + NCURSES_PUTP2("scroll_reverse", scroll_reverse); + } + } else if (insert_line && bot == maxy) { + GoTo(NCURSES_SP_ARGx top, 0); + UpdateAttrs(SP_PARM, blank); + for (i = 0; i < n; i++) { + NCURSES_PUTP2("insert_line", insert_line); + } + } else + return ERR; + +#if NCURSES_EXT_FUNCS + if (FILL_BCE(SP_PARM)) { + int j; + for (i = 0; i < n; i++) { + GoTo(NCURSES_SP_ARGx top + i, 0); + for (j = 0; j < screen_columns(SP_PARM); j++) + PutChar(NCURSES_SP_ARGx CHREF(blank)); + } + } +#endif + return OK; +} + +/* scroll by using delete_line at del and insert_line at ins */ +/* n > 0 */ +static int +scroll_idl(NCURSES_SP_DCLx int n, int del, int ins, NCURSES_CH_T blank) +{ + int i; + + if (!((parm_delete_line || delete_line) && (parm_insert_line || insert_line))) + return ERR; + + GoTo(NCURSES_SP_ARGx del, 0); + UpdateAttrs(SP_PARM, blank); + if (n == 1 && delete_line) { + NCURSES_PUTP2("delete_line", delete_line); + } else if (parm_delete_line) { + TPUTS_TRACE("parm_delete_line"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_delete_line, n), + n, + NCURSES_SP_NAME(_nc_outch)); + } else { /* if (delete_line) */ + for (i = 0; i < n; i++) { + NCURSES_PUTP2("delete_line", delete_line); + } + } + + GoTo(NCURSES_SP_ARGx ins, 0); + UpdateAttrs(SP_PARM, blank); + if (n == 1 && insert_line) { + NCURSES_PUTP2("insert_line", insert_line); + } else if (parm_insert_line) { + TPUTS_TRACE("parm_insert_line"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_1(parm_insert_line, n), + n, + NCURSES_SP_NAME(_nc_outch)); + } else { /* if (insert_line) */ + for (i = 0; i < n; i++) { + NCURSES_PUTP2("insert_line", insert_line); + } + } + + return OK; +} + +/* + * Note: some terminals require the cursor to be within the scrolling margins + * before setting them. Generally, the cursor must be at the appropriate end + * of the scrolling margins when issuing an indexing operation (it is not + * apparent whether it must also be at the left margin; we do this just to be + * safe). To make the related cursor movement a little faster, we use the + * save/restore cursor capabilities if the terminal has them. + */ +NCURSES_EXPORT(int) +NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx + int n, + int top, + int bot, + int maxy) +/* scroll region from top to bot by n lines */ +{ + NCURSES_CH_T blank; + int i; + bool cursor_saved = FALSE; + int res; + + TR(TRACE_MOVE, ("_nc_scrolln(%p, %d, %d, %d, %d)", + (void *) SP_PARM, n, top, bot, maxy)); + + if (!IsValidScreen(SP_PARM)) + return (ERR); + + blank = ClrBlank(NCURSES_SP_ARGx StdScreen(SP_PARM)); + +#if USE_XMC_SUPPORT + /* + * If we scroll, we might remove a cookie. + */ + if (magic_cookie_glitch > 0) { + return (ERR); + } +#endif + + if (n > 0) { /* scroll up (forward) */ + /* + * Explicitly clear if stuff pushed off top of region might + * be saved by the terminal. + */ + res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, 0, maxy, blank); + + if (res == ERR && change_scroll_region) { + if ((((n == 1 && scroll_forward) || parm_index) + && (SP_PARM->_cursrow == bot || SP_PARM->_cursrow == bot - 1)) + && save_cursor && restore_cursor) { + cursor_saved = TRUE; + NCURSES_PUTP2("save_cursor", save_cursor); + } + NCURSES_PUTP2("change_scroll_region", + TIPARM_2(change_scroll_region, top, bot)); + if (cursor_saved) { + NCURSES_PUTP2("restore_cursor", restore_cursor); + } else { + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + } + + res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, top, bot, blank); + + NCURSES_PUTP2("change_scroll_region", + TIPARM_2(change_scroll_region, 0, maxy)); + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + } + + if (res == ERR && SP_PARM->_nc_sp_idlok) + res = scroll_idl(NCURSES_SP_ARGx n, top, bot - n + 1, blank); + + /* + * Clear the newly shifted-in text. + */ + if (res != ERR + && (non_dest_scroll_region || (memory_below && bot == maxy))) { + static const NCURSES_CH_T blank2 = NewChar(BLANK_TEXT); + if (bot == maxy && clr_eos) { + GoTo(NCURSES_SP_ARGx bot - n + 1, 0); + ClrToEOS(NCURSES_SP_ARGx blank2); + } else { + for (i = 0; i < n; i++) { + GoTo(NCURSES_SP_ARGx bot - i, 0); + ClrToEOL(NCURSES_SP_ARGx blank2, FALSE); + } + } + } + + } else { /* (n < 0) - scroll down (backward) */ + res = scroll_csr_backward(NCURSES_SP_ARGx -n, top, bot, 0, maxy, blank); + + if (res == ERR && change_scroll_region) { + if (top != 0 + && (SP_PARM->_cursrow == top || + SP_PARM->_cursrow == top - 1) + && save_cursor && restore_cursor) { + cursor_saved = TRUE; + NCURSES_PUTP2("save_cursor", save_cursor); + } + NCURSES_PUTP2("change_scroll_region", + TIPARM_2(change_scroll_region, top, bot)); + if (cursor_saved) { + NCURSES_PUTP2("restore_cursor", restore_cursor); + } else { + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + } + + res = scroll_csr_backward(NCURSES_SP_ARGx + -n, top, bot, top, bot, blank); + + NCURSES_PUTP2("change_scroll_region", + TIPARM_2(change_scroll_region, 0, maxy)); + SP_PARM->_cursrow = SP_PARM->_curscol = -1; + } + + if (res == ERR && SP_PARM->_nc_sp_idlok) + res = scroll_idl(NCURSES_SP_ARGx -n, bot + n + 1, top, blank); + + /* + * Clear the newly shifted-in text. + */ + if (res != ERR + && (non_dest_scroll_region || (memory_above && top == 0))) { + static const NCURSES_CH_T blank2 = NewChar(BLANK_TEXT); + for (i = 0; i < -n; i++) { + GoTo(NCURSES_SP_ARGx i + top, 0); + ClrToEOL(NCURSES_SP_ARGx blank2, FALSE); + } + } + } + + if (res == ERR) + return (ERR); + + _nc_scroll_window(CurScreen(SP_PARM), n, + (NCURSES_SIZE_T) top, + (NCURSES_SIZE_T) bot, + blank); + + /* shift hash values too - they can be reused */ + NCURSES_SP_NAME(_nc_scroll_oldhash) (NCURSES_SP_ARGx n, top, bot); + + return (OK); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +_nc_scrolln(int n, int top, int bot, int maxy) +{ + return NCURSES_SP_NAME(_nc_scrolln) (CURRENT_SCREEN, n, top, bot, maxy); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_DCL0) +{ + assert(SP_PARM); + + /* make sure terminal is in a sane known state */ + SetAttr(SCREEN_ATTRS(SP_PARM), A_NORMAL); + NewScreen(SP_PARM)->_clear = TRUE; + + /* reset color pairs and definitions */ + if (SP_PARM->_coloron || SP_PARM->_color_defs) + NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG); + + /* restore user-defined colors, if any */ + if (SP_PARM->_color_defs < 0 && !SP_PARM->_direct_color.value) { + int n; + SP_PARM->_color_defs = -(SP_PARM->_color_defs); + for (n = 0; n < SP_PARM->_color_defs; ++n) { + if (SP_PARM->_color_table[n].init) { + _nc_init_color(SP_PARM, + n, + SP_PARM->_color_table[n].r, + SP_PARM->_color_table[n].g, + SP_PARM->_color_table[n].b); + } + } + } + + if (exit_attribute_mode) + NCURSES_PUTP2("exit_attribute_mode", exit_attribute_mode); + else { + /* turn off attributes */ + if (exit_alt_charset_mode) + NCURSES_PUTP2("exit_alt_charset_mode", exit_alt_charset_mode); + if (exit_standout_mode) + NCURSES_PUTP2("exit_standout_mode", exit_standout_mode); + if (exit_underline_mode) + NCURSES_PUTP2("exit_underline_mode", exit_underline_mode); + } + if (exit_insert_mode) + NCURSES_PUTP2("exit_insert_mode", exit_insert_mode); + if (enter_am_mode && exit_am_mode) { + if (auto_right_margin) { + NCURSES_PUTP2("enter_am_mode", enter_am_mode); + } else { + NCURSES_PUTP2("exit_am_mode", exit_am_mode); + } + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_screen_resume(void) +{ + NCURSES_SP_NAME(_nc_screen_resume) (CURRENT_SCREEN); +} +#endif + +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_screen_init) (NCURSES_SP_DCL0) +{ + NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_screen_init(void) +{ + NCURSES_SP_NAME(_nc_screen_init) (CURRENT_SCREEN); +} +#endif + +/* wrap up screen handling */ +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_screen_wrap) (NCURSES_SP_DCL0) +{ + if (SP_PARM != 0) { + + UpdateAttrs(SP_PARM, normal); +#if NCURSES_EXT_FUNCS + if (SP_PARM->_coloron + && !SP_PARM->_default_color) { + static const NCURSES_CH_T blank = NewChar(BLANK_TEXT); + SP_PARM->_default_color = TRUE; + NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx + -1, + 0, + FALSE, + NCURSES_SP_NAME(_nc_outch)); + SP_PARM->_default_color = FALSE; + + TINFO_MVCUR(NCURSES_SP_ARGx + SP_PARM->_cursrow, + SP_PARM->_curscol, + screen_lines(SP_PARM) - 1, + 0); + + ClrToEOL(NCURSES_SP_ARGx blank, TRUE); + } +#endif + if (SP_PARM->_color_defs) { + NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG); + } + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_screen_wrap(void) +{ + NCURSES_SP_NAME(_nc_screen_wrap) (CURRENT_SCREEN); +} +#endif + +#if USE_XMC_SUPPORT +NCURSES_EXPORT(void) +NCURSES_SP_NAME(_nc_do_xmc_glitch) (NCURSES_SP_DCLx attr_t previous) +{ + if (SP_PARM != 0) { + attr_t chg = XMC_CHANGES(previous ^ AttrOf(SCREEN_ATTRS(SP_PARM))); + + while (chg != 0) { + if (chg & 1) { + SP_PARM->_curscol += magic_cookie_glitch; + if (SP_PARM->_curscol >= SP_PARM->_columns) + wrap_cursor(NCURSES_SP_ARG); + TR(TRACE_UPDATE, ("bumped to %d,%d after cookie", + SP_PARM->_cursrow, SP_PARM->_curscol)); + } + chg >>= 1; + } + } +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(void) +_nc_do_xmc_glitch(attr_t previous) +{ + NCURSES_SP_NAME(_nc_do_xmc_glitch) (CURRENT_SCREEN, previous); +} +#endif + +#endif /* USE_XMC_SUPPORT */ diff --git a/contrib/ncurses/ncurses/wcwidth.h b/contrib/ncurses/ncurses/wcwidth.h new file mode 100644 index 00000000..5d181cdf --- /dev/null +++ b/contrib/ncurses/ncurses/wcwidth.h @@ -0,0 +1,820 @@ +/* $Id: wcwidth.h,v 1.7 2024/09/21 15:49:15 tom Exp $ */ + +/* + * Copyright 2002-2023,2024 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + *----------------------------------------------------------------------------- + * This is an updated version of Markus Kuhn's implementation of wcwidth. + * + * Originally added to xterm in 2000 (patch #141), there were a couple of + * updates from Kuhn until 2005 (patch #202), renaming entrypoints and applying + * data from Unicode.org (e.g., 3.2, 4.0, 4.1.0). The Unicode data is + * transformed into tables in this file by a script "uniset" written by Kuhn. + * + * While Kuhn implemented the original CJK variant, it was unused by xterm + * until Jungshik Shin used it in 2002 to implement the -cjk_width command-line + * option. + * + * Kuhn added a check for the vertical forms block (double-width) in 2007; + * other updates were derived from the Unicode.org data (release 5.0). + * + * Since then, additional updates have been made: + * + data-type fixes + * + new Unicode releases (6.2.0, 9.0.0, etc), + * + additional special symbol blocks have been added to the special cases. + * + soft-hyphen behavior has been made configurable. + * + added table shows when a character is not part of Unicode. + * + * Kuhn's original header follows giving the design information: + *----------------------------------------------------------------------------- + * This is an implementation of wcwidth() and wcswidth() (defined in + * IEEE Std 1002.1-2001) for Unicode. + * + * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html + * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html + * + * In fixed-width output devices, Latin characters all occupy a single + * "cell" position of equal width, whereas ideographic CJK characters + * occupy two such cells. Interoperability between terminal-line + * applications and (teletype-style) character terminals using the + * UTF-8 encoding requires agreement on which character should advance + * the cursor by how many cell positions. No established formal + * standards exist at present on which Unicode character shall occupy + * how many cell positions on character terminals. These routines are + * a first attempt of defining such behavior based on simple rules + * applied to data provided by the Unicode Consortium. + * + * For some graphical characters, the Unicode standard explicitly + * defines a character-cell width via the definition of the East Asian + * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. + * In all these cases, there is no ambiguity about which width a + * terminal shall use. For characters in the East Asian Ambiguous (A) + * class, the width choice depends purely on a preference of backward + * compatibility with either historic CJK or Western practice. + * Choosing single-width for these characters is easy to justify as + * the appropriate long-term solution, as the CJK practice of + * displaying these characters as double-width comes from historic + * implementation simplicity (8-bit encoded characters were displayed + * single-width and 16-bit ones double-width, even for Greek, + * Cyrillic, etc.) and not any typographic considerations. + * + * Much less clear is the choice of width for the Not East Asian + * (Neutral) class. Existing practice does not dictate a width for any + * of these characters. It would nevertheless make sense + * typographically to allocate two character cells to characters such + * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be + * represented adequately with a single-width glyph. The following + * routines at present merely assign a single-cell width to all + * neutral characters, in the interest of simplicity. This is not + * entirely satisfactory and should be reconsidered before + * establishing a formal standard in this area. At the moment, the + * decision which Not East Asian (Neutral) characters should be + * represented by double-width glyphs cannot yet be answered by + * applying a simple rule from the Unicode database content. Setting + * up a proper standard for the behavior of UTF-8 character terminals + * will require a careful analysis not only of each Unicode character, + * but also of each presentation form, something the author of these + * routines has avoided to do so far. + * + * http://www.unicode.org/unicode/reports/tr11/ + * + * Markus Kuhn -- 2007-05-25 (Unicode 5.0) + * + * Permission to use, copy, modify, and distribute this software + * for any purpose and without fee is hereby granted. The author + * disclaims all warranties with regard to this software. + * + * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c + *----------------------------------------------------------------------------- + */ + +#ifndef _WCWIDTH_H_incl +#define _WCWIDTH_H_incl 1 + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include +#include + +struct interval { + unsigned long first; + unsigned long last; +}; + +static int use_latin1 = 1; + +/* auxiliary function for binary search in interval table */ +static int bisearch(unsigned long ucs, const struct interval *table, int max) +{ + + if (ucs >= table[0].first && ucs <= table[max].last) { + int min = 0; + + while (max >= min) { + int mid; + + mid = (min + max) / 2; + if (ucs > table[mid].last) + min = mid + 1; + else if (ucs < table[mid].first) + max = mid - 1; + else + return 1; + } + } + + return 0; +} + +/* + * Provide a way to change the behavior of soft-hyphen. + */ +NCURSES_EXPORT(void) mk_wcwidth_init(int mode) +{ + use_latin1 = (mode == 0); +} + +/* The following two functions define the column width of an ISO 10646 + * character as follows: + * + * - The null character (U+0000) has a column width of 0. + * + * - Other C0/C1 control characters and DEL will lead to a return + * value of -1. + * + * - Non-spacing and enclosing combining characters (general + * category code Mn or Me in the Unicode database) have a + * column width of 0. + * + * - A few spacing combining marks have a column width of 0. + * + * - SOFT HYPHEN (U+00AD) has a column width of 1 in Latin-1, 0 in Unicode. + * An initialization function is used to switch between the two. + * + * - Other format characters (general category code Cf in the Unicode + * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. + * + * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) + * have a column width of 0. + * + * - Hangul Jamo Extended-B medial vowels and final consonants for old + * Korean (U+D7B0-U+D7FF) have a column width of 0. + * + * - Spacing characters in the East Asian Wide (W) or East Asian + * Full-width (F) category as defined in Unicode Technical + * Report #11 have a column width of 2. In that report, some codes + * were unassigned. Characters in these blocks use a column width of 1: + * 4DC0..4DFF; Yijing Hexagram Symbols + * A960..A97F; Hangul Jamo Extended-A + * + * - All remaining characters (including all printable + * ISO 8859-1 and WGL4 characters, Unicode control characters, + * etc.) have a column width of 1. + * + * - Codes which do not correspond to a Unicode character have a column + * width of -1. + * + * This implementation assumes that wchar_t characters are encoded + * in ISO 10646. + */ + +NCURSES_EXPORT(int) mk_wcwidth(uint32_t ucs) +{ + unsigned long cmp = (unsigned long) ucs; + + /* sorted list of non-overlapping intervals of formatting characters */ + /* generated by + * uniset +cat=Cf -00AD -0600-0605 -061C -06DD -070F c + */ + /* *INDENT-OFF* */ + /* generated by run-uniset_ctl 1.1 */ + static const struct interval formatting[] = { + { 0x0890, 0x0891 }, { 0x08E2, 0x08E2 }, { 0x180E, 0x180E }, + { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2064 }, + { 0x2066, 0x206F }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, + { 0x110BD, 0x110BD }, { 0x110CD, 0x110CD }, { 0x13430, 0x1343F }, + { 0x1BCA0, 0x1BCA3 }, { 0x1D173, 0x1D17A }, { 0xE0001, 0xE0001 }, + { 0xE0020, 0xE007F } + }; + /* *INDENT-OFF* */ + + /* sorted list of non-overlapping intervals of non-spacing characters */ + /* generated by + * uniset +cat=Me +cat=Mn +0600-0605 +061C +06DD +070F +1160-11FF +D7B0-D7C6 +D7CB-D7FB c + */ + /* *INDENT-OFF* */ + /* generated by run-uniset 1.9 */ + static const struct interval combining[] = { + { 0x0300, 0x036F }, { 0x0483, 0x0489 }, { 0x0591, 0x05BD }, + { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, + { 0x05C7, 0x05C7 }, { 0x0600, 0x0605 }, { 0x0610, 0x061A }, + { 0x061C, 0x061C }, { 0x064B, 0x065F }, { 0x0670, 0x0670 }, + { 0x06D6, 0x06DD }, { 0x06DF, 0x06E4 }, { 0x06E7, 0x06E8 }, + { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, + { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, + { 0x07FD, 0x07FD }, { 0x0816, 0x0819 }, { 0x081B, 0x0823 }, + { 0x0825, 0x0827 }, { 0x0829, 0x082D }, { 0x0859, 0x085B }, + { 0x0898, 0x089F }, { 0x08CA, 0x08E1 }, { 0x08E3, 0x0902 }, + { 0x093A, 0x093A }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, + { 0x094D, 0x094D }, { 0x0951, 0x0957 }, { 0x0962, 0x0963 }, + { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, + { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x09FE, 0x09FE }, + { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, + { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A51, 0x0A51 }, + { 0x0A70, 0x0A71 }, { 0x0A75, 0x0A75 }, { 0x0A81, 0x0A82 }, + { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, + { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0AFA, 0x0AFF }, + { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, + { 0x0B41, 0x0B44 }, { 0x0B4D, 0x0B4D }, { 0x0B55, 0x0B56 }, + { 0x0B62, 0x0B63 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, + { 0x0BCD, 0x0BCD }, { 0x0C00, 0x0C00 }, { 0x0C04, 0x0C04 }, + { 0x0C3C, 0x0C3C }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, + { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0C62, 0x0C63 }, + { 0x0C81, 0x0C81 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, + { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 }, + { 0x0D00, 0x0D01 }, { 0x0D3B, 0x0D3C }, { 0x0D41, 0x0D44 }, + { 0x0D4D, 0x0D4D }, { 0x0D62, 0x0D63 }, { 0x0D81, 0x0D81 }, + { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, + { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, + { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EBC }, { 0x0EC8, 0x0ECE }, + { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, + { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, + { 0x0F86, 0x0F87 }, { 0x0F8D, 0x0F97 }, { 0x0F99, 0x0FBC }, + { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1037 }, + { 0x1039, 0x103A }, { 0x103D, 0x103E }, { 0x1058, 0x1059 }, + { 0x105E, 0x1060 }, { 0x1071, 0x1074 }, { 0x1082, 0x1082 }, + { 0x1085, 0x1086 }, { 0x108D, 0x108D }, { 0x109D, 0x109D }, + { 0x1160, 0x11FF }, { 0x135D, 0x135F }, { 0x1712, 0x1714 }, + { 0x1732, 0x1733 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, + { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, + { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, + { 0x180F, 0x180F }, { 0x1885, 0x1886 }, { 0x18A9, 0x18A9 }, + { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, + { 0x1939, 0x193B }, { 0x1A17, 0x1A18 }, { 0x1A1B, 0x1A1B }, + { 0x1A56, 0x1A56 }, { 0x1A58, 0x1A5E }, { 0x1A60, 0x1A60 }, + { 0x1A62, 0x1A62 }, { 0x1A65, 0x1A6C }, { 0x1A73, 0x1A7C }, + { 0x1A7F, 0x1A7F }, { 0x1AB0, 0x1ACE }, { 0x1B00, 0x1B03 }, + { 0x1B34, 0x1B34 }, { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, + { 0x1B42, 0x1B42 }, { 0x1B6B, 0x1B73 }, { 0x1B80, 0x1B81 }, + { 0x1BA2, 0x1BA5 }, { 0x1BA8, 0x1BA9 }, { 0x1BAB, 0x1BAD }, + { 0x1BE6, 0x1BE6 }, { 0x1BE8, 0x1BE9 }, { 0x1BED, 0x1BED }, + { 0x1BEF, 0x1BF1 }, { 0x1C2C, 0x1C33 }, { 0x1C36, 0x1C37 }, + { 0x1CD0, 0x1CD2 }, { 0x1CD4, 0x1CE0 }, { 0x1CE2, 0x1CE8 }, + { 0x1CED, 0x1CED }, { 0x1CF4, 0x1CF4 }, { 0x1CF8, 0x1CF9 }, + { 0x1DC0, 0x1DFF }, { 0x20D0, 0x20F0 }, { 0x2CEF, 0x2CF1 }, + { 0x2D7F, 0x2D7F }, { 0x2DE0, 0x2DFF }, { 0x302A, 0x302D }, + { 0x3099, 0x309A }, { 0xA66F, 0xA672 }, { 0xA674, 0xA67D }, + { 0xA69E, 0xA69F }, { 0xA6F0, 0xA6F1 }, { 0xA802, 0xA802 }, + { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, + { 0xA82C, 0xA82C }, { 0xA8C4, 0xA8C5 }, { 0xA8E0, 0xA8F1 }, + { 0xA8FF, 0xA8FF }, { 0xA926, 0xA92D }, { 0xA947, 0xA951 }, + { 0xA980, 0xA982 }, { 0xA9B3, 0xA9B3 }, { 0xA9B6, 0xA9B9 }, + { 0xA9BC, 0xA9BD }, { 0xA9E5, 0xA9E5 }, { 0xAA29, 0xAA2E }, + { 0xAA31, 0xAA32 }, { 0xAA35, 0xAA36 }, { 0xAA43, 0xAA43 }, + { 0xAA4C, 0xAA4C }, { 0xAA7C, 0xAA7C }, { 0xAAB0, 0xAAB0 }, + { 0xAAB2, 0xAAB4 }, { 0xAAB7, 0xAAB8 }, { 0xAABE, 0xAABF }, + { 0xAAC1, 0xAAC1 }, { 0xAAEC, 0xAAED }, { 0xAAF6, 0xAAF6 }, + { 0xABE5, 0xABE5 }, { 0xABE8, 0xABE8 }, { 0xABED, 0xABED }, + { 0xD7B0, 0xD7C6 }, { 0xD7CB, 0xD7FB }, { 0xFB1E, 0xFB1E }, + { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE2F }, { 0x101FD, 0x101FD }, + { 0x102E0, 0x102E0 }, { 0x10376, 0x1037A }, { 0x10A01, 0x10A03 }, + { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, + { 0x10A3F, 0x10A3F }, { 0x10AE5, 0x10AE6 }, { 0x10D24, 0x10D27 }, + { 0x10EAB, 0x10EAC }, { 0x10EFD, 0x10EFF }, { 0x10F46, 0x10F50 }, + { 0x10F82, 0x10F85 }, { 0x11001, 0x11001 }, { 0x11038, 0x11046 }, + { 0x11070, 0x11070 }, { 0x11073, 0x11074 }, { 0x1107F, 0x11081 }, + { 0x110B3, 0x110B6 }, { 0x110B9, 0x110BA }, { 0x110C2, 0x110C2 }, + { 0x11100, 0x11102 }, { 0x11127, 0x1112B }, { 0x1112D, 0x11134 }, + { 0x11173, 0x11173 }, { 0x11180, 0x11181 }, { 0x111B6, 0x111BE }, + { 0x111C9, 0x111CC }, { 0x111CF, 0x111CF }, { 0x1122F, 0x11231 }, + { 0x11234, 0x11234 }, { 0x11236, 0x11237 }, { 0x1123E, 0x1123E }, + { 0x11241, 0x11241 }, { 0x112DF, 0x112DF }, { 0x112E3, 0x112EA }, + { 0x11300, 0x11301 }, { 0x1133B, 0x1133C }, { 0x11340, 0x11340 }, + { 0x11366, 0x1136C }, { 0x11370, 0x11374 }, { 0x11438, 0x1143F }, + { 0x11442, 0x11444 }, { 0x11446, 0x11446 }, { 0x1145E, 0x1145E }, + { 0x114B3, 0x114B8 }, { 0x114BA, 0x114BA }, { 0x114BF, 0x114C0 }, + { 0x114C2, 0x114C3 }, { 0x115B2, 0x115B5 }, { 0x115BC, 0x115BD }, + { 0x115BF, 0x115C0 }, { 0x115DC, 0x115DD }, { 0x11633, 0x1163A }, + { 0x1163D, 0x1163D }, { 0x1163F, 0x11640 }, { 0x116AB, 0x116AB }, + { 0x116AD, 0x116AD }, { 0x116B0, 0x116B5 }, { 0x116B7, 0x116B7 }, + { 0x1171D, 0x1171F }, { 0x11722, 0x11725 }, { 0x11727, 0x1172B }, + { 0x1182F, 0x11837 }, { 0x11839, 0x1183A }, { 0x1193B, 0x1193C }, + { 0x1193E, 0x1193E }, { 0x11943, 0x11943 }, { 0x119D4, 0x119D7 }, + { 0x119DA, 0x119DB }, { 0x119E0, 0x119E0 }, { 0x11A01, 0x11A0A }, + { 0x11A33, 0x11A38 }, { 0x11A3B, 0x11A3E }, { 0x11A47, 0x11A47 }, + { 0x11A51, 0x11A56 }, { 0x11A59, 0x11A5B }, { 0x11A8A, 0x11A96 }, + { 0x11A98, 0x11A99 }, { 0x11C30, 0x11C36 }, { 0x11C38, 0x11C3D }, + { 0x11C3F, 0x11C3F }, { 0x11C92, 0x11CA7 }, { 0x11CAA, 0x11CB0 }, + { 0x11CB2, 0x11CB3 }, { 0x11CB5, 0x11CB6 }, { 0x11D31, 0x11D36 }, + { 0x11D3A, 0x11D3A }, { 0x11D3C, 0x11D3D }, { 0x11D3F, 0x11D45 }, + { 0x11D47, 0x11D47 }, { 0x11D90, 0x11D91 }, { 0x11D95, 0x11D95 }, + { 0x11D97, 0x11D97 }, { 0x11EF3, 0x11EF4 }, { 0x11F00, 0x11F01 }, + { 0x11F36, 0x11F3A }, { 0x11F40, 0x11F40 }, { 0x11F42, 0x11F42 }, + { 0x13440, 0x13440 }, { 0x13447, 0x13455 }, { 0x16AF0, 0x16AF4 }, + { 0x16B30, 0x16B36 }, { 0x16F4F, 0x16F4F }, { 0x16F8F, 0x16F92 }, + { 0x16FE4, 0x16FE4 }, { 0x1BC9D, 0x1BC9E }, { 0x1CF00, 0x1CF2D }, + { 0x1CF30, 0x1CF46 }, { 0x1D167, 0x1D169 }, { 0x1D17B, 0x1D182 }, + { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, + { 0x1DA00, 0x1DA36 }, { 0x1DA3B, 0x1DA6C }, { 0x1DA75, 0x1DA75 }, + { 0x1DA84, 0x1DA84 }, { 0x1DA9B, 0x1DA9F }, { 0x1DAA1, 0x1DAAF }, + { 0x1E000, 0x1E006 }, { 0x1E008, 0x1E018 }, { 0x1E01B, 0x1E021 }, + { 0x1E023, 0x1E024 }, { 0x1E026, 0x1E02A }, { 0x1E08F, 0x1E08F }, + { 0x1E130, 0x1E136 }, { 0x1E2AE, 0x1E2AE }, { 0x1E2EC, 0x1E2EF }, + { 0x1E4EC, 0x1E4EF }, { 0x1E8D0, 0x1E8D6 }, { 0x1E944, 0x1E94A }, + { 0xE0100, 0xE01EF } + }; + /* *INDENT-ON* */ + + /* sorted list of non-overlapping intervals of non-characters */ + /* generated by + * uniset +0000..DFFF -4e00..9fd5 +F900..10FFFD unknown +2028..2029 c + */ + /* *INDENT-OFF* */ + /* generated by run-uniset_unk 1.6 */ + static const struct interval unknowns[] = { + { 0x0378, 0x0379 }, { 0x0380, 0x0383 }, { 0x038B, 0x038B }, + { 0x038D, 0x038D }, { 0x03A2, 0x03A2 }, { 0x0530, 0x0530 }, + { 0x0557, 0x0558 }, { 0x058B, 0x058C }, { 0x0590, 0x0590 }, + { 0x05C8, 0x05CF }, { 0x05EB, 0x05EE }, { 0x05F5, 0x05FF }, + { 0x070E, 0x070E }, { 0x074B, 0x074C }, { 0x07B2, 0x07BF }, + { 0x07FB, 0x07FC }, { 0x082E, 0x082F }, { 0x083F, 0x083F }, + { 0x085C, 0x085D }, { 0x085F, 0x085F }, { 0x086B, 0x086F }, + { 0x088F, 0x088F }, { 0x0892, 0x0897 }, { 0x0984, 0x0984 }, + { 0x098D, 0x098E }, { 0x0991, 0x0992 }, { 0x09A9, 0x09A9 }, + { 0x09B1, 0x09B1 }, { 0x09B3, 0x09B5 }, { 0x09BA, 0x09BB }, + { 0x09C5, 0x09C6 }, { 0x09C9, 0x09CA }, { 0x09CF, 0x09D6 }, + { 0x09D8, 0x09DB }, { 0x09DE, 0x09DE }, { 0x09E4, 0x09E5 }, + { 0x09FF, 0x0A00 }, { 0x0A04, 0x0A04 }, { 0x0A0B, 0x0A0E }, + { 0x0A11, 0x0A12 }, { 0x0A29, 0x0A29 }, { 0x0A31, 0x0A31 }, + { 0x0A34, 0x0A34 }, { 0x0A37, 0x0A37 }, { 0x0A3A, 0x0A3B }, + { 0x0A3D, 0x0A3D }, { 0x0A43, 0x0A46 }, { 0x0A49, 0x0A4A }, + { 0x0A4E, 0x0A50 }, { 0x0A52, 0x0A58 }, { 0x0A5D, 0x0A5D }, + { 0x0A5F, 0x0A65 }, { 0x0A77, 0x0A80 }, { 0x0A84, 0x0A84 }, + { 0x0A8E, 0x0A8E }, { 0x0A92, 0x0A92 }, { 0x0AA9, 0x0AA9 }, + { 0x0AB1, 0x0AB1 }, { 0x0AB4, 0x0AB4 }, { 0x0ABA, 0x0ABB }, + { 0x0AC6, 0x0AC6 }, { 0x0ACA, 0x0ACA }, { 0x0ACE, 0x0ACF }, + { 0x0AD1, 0x0ADF }, { 0x0AE4, 0x0AE5 }, { 0x0AF2, 0x0AF8 }, + { 0x0B00, 0x0B00 }, { 0x0B04, 0x0B04 }, { 0x0B0D, 0x0B0E }, + { 0x0B11, 0x0B12 }, { 0x0B29, 0x0B29 }, { 0x0B31, 0x0B31 }, + { 0x0B34, 0x0B34 }, { 0x0B3A, 0x0B3B }, { 0x0B45, 0x0B46 }, + { 0x0B49, 0x0B4A }, { 0x0B4E, 0x0B54 }, { 0x0B58, 0x0B5B }, + { 0x0B5E, 0x0B5E }, { 0x0B64, 0x0B65 }, { 0x0B78, 0x0B81 }, + { 0x0B84, 0x0B84 }, { 0x0B8B, 0x0B8D }, { 0x0B91, 0x0B91 }, + { 0x0B96, 0x0B98 }, { 0x0B9B, 0x0B9B }, { 0x0B9D, 0x0B9D }, + { 0x0BA0, 0x0BA2 }, { 0x0BA5, 0x0BA7 }, { 0x0BAB, 0x0BAD }, + { 0x0BBA, 0x0BBD }, { 0x0BC3, 0x0BC5 }, { 0x0BC9, 0x0BC9 }, + { 0x0BCE, 0x0BCF }, { 0x0BD1, 0x0BD6 }, { 0x0BD8, 0x0BE5 }, + { 0x0BFB, 0x0BFF }, { 0x0C0D, 0x0C0D }, { 0x0C11, 0x0C11 }, + { 0x0C29, 0x0C29 }, { 0x0C3A, 0x0C3B }, { 0x0C45, 0x0C45 }, + { 0x0C49, 0x0C49 }, { 0x0C4E, 0x0C54 }, { 0x0C57, 0x0C57 }, + { 0x0C5B, 0x0C5C }, { 0x0C5E, 0x0C5F }, { 0x0C64, 0x0C65 }, + { 0x0C70, 0x0C76 }, { 0x0C8D, 0x0C8D }, { 0x0C91, 0x0C91 }, + { 0x0CA9, 0x0CA9 }, { 0x0CB4, 0x0CB4 }, { 0x0CBA, 0x0CBB }, + { 0x0CC5, 0x0CC5 }, { 0x0CC9, 0x0CC9 }, { 0x0CCE, 0x0CD4 }, + { 0x0CD7, 0x0CDC }, { 0x0CDF, 0x0CDF }, { 0x0CE4, 0x0CE5 }, + { 0x0CF0, 0x0CF0 }, { 0x0CF4, 0x0CFF }, { 0x0D0D, 0x0D0D }, + { 0x0D11, 0x0D11 }, { 0x0D45, 0x0D45 }, { 0x0D49, 0x0D49 }, + { 0x0D50, 0x0D53 }, { 0x0D64, 0x0D65 }, { 0x0D80, 0x0D80 }, + { 0x0D84, 0x0D84 }, { 0x0D97, 0x0D99 }, { 0x0DB2, 0x0DB2 }, + { 0x0DBC, 0x0DBC }, { 0x0DBE, 0x0DBF }, { 0x0DC7, 0x0DC9 }, + { 0x0DCB, 0x0DCE }, { 0x0DD5, 0x0DD5 }, { 0x0DD7, 0x0DD7 }, + { 0x0DE0, 0x0DE5 }, { 0x0DF0, 0x0DF1 }, { 0x0DF5, 0x0E00 }, + { 0x0E3B, 0x0E3E }, { 0x0E5C, 0x0E80 }, { 0x0E83, 0x0E83 }, + { 0x0E85, 0x0E85 }, { 0x0E8B, 0x0E8B }, { 0x0EA4, 0x0EA4 }, + { 0x0EA6, 0x0EA6 }, { 0x0EBE, 0x0EBF }, { 0x0EC5, 0x0EC5 }, + { 0x0EC7, 0x0EC7 }, { 0x0ECF, 0x0ECF }, { 0x0EDA, 0x0EDB }, + { 0x0EE0, 0x0EFF }, { 0x0F48, 0x0F48 }, { 0x0F6D, 0x0F70 }, + { 0x0F98, 0x0F98 }, { 0x0FBD, 0x0FBD }, { 0x0FCD, 0x0FCD }, + { 0x0FDB, 0x0FFF }, { 0x10C6, 0x10C6 }, { 0x10C8, 0x10CC }, + { 0x10CE, 0x10CF }, { 0x1249, 0x1249 }, { 0x124E, 0x124F }, + { 0x1257, 0x1257 }, { 0x1259, 0x1259 }, { 0x125E, 0x125F }, + { 0x1289, 0x1289 }, { 0x128E, 0x128F }, { 0x12B1, 0x12B1 }, + { 0x12B6, 0x12B7 }, { 0x12BF, 0x12BF }, { 0x12C1, 0x12C1 }, + { 0x12C6, 0x12C7 }, { 0x12D7, 0x12D7 }, { 0x1311, 0x1311 }, + { 0x1316, 0x1317 }, { 0x135B, 0x135C }, { 0x137D, 0x137F }, + { 0x139A, 0x139F }, { 0x13F6, 0x13F7 }, { 0x13FE, 0x13FF }, + { 0x169D, 0x169F }, { 0x16F9, 0x16FF }, { 0x1716, 0x171E }, + { 0x1737, 0x173F }, { 0x1754, 0x175F }, { 0x176D, 0x176D }, + { 0x1771, 0x1771 }, { 0x1774, 0x177F }, { 0x17DE, 0x17DF }, + { 0x17EA, 0x17EF }, { 0x17FA, 0x17FF }, { 0x181A, 0x181F }, + { 0x1879, 0x187F }, { 0x18AB, 0x18AF }, { 0x18F6, 0x18FF }, + { 0x191F, 0x191F }, { 0x192C, 0x192F }, { 0x193C, 0x193F }, + { 0x1941, 0x1943 }, { 0x196E, 0x196F }, { 0x1975, 0x197F }, + { 0x19AC, 0x19AF }, { 0x19CA, 0x19CF }, { 0x19DB, 0x19DD }, + { 0x1A1C, 0x1A1D }, { 0x1A5F, 0x1A5F }, { 0x1A7D, 0x1A7E }, + { 0x1A8A, 0x1A8F }, { 0x1A9A, 0x1A9F }, { 0x1AAE, 0x1AAF }, + { 0x1ACF, 0x1AFF }, { 0x1B4D, 0x1B4F }, { 0x1B7F, 0x1B7F }, + { 0x1BF4, 0x1BFB }, { 0x1C38, 0x1C3A }, { 0x1C4A, 0x1C4C }, + { 0x1C89, 0x1C8F }, { 0x1CBB, 0x1CBC }, { 0x1CC8, 0x1CCF }, + { 0x1CFB, 0x1CFF }, { 0x1F16, 0x1F17 }, { 0x1F1E, 0x1F1F }, + { 0x1F46, 0x1F47 }, { 0x1F4E, 0x1F4F }, { 0x1F58, 0x1F58 }, + { 0x1F5A, 0x1F5A }, { 0x1F5C, 0x1F5C }, { 0x1F5E, 0x1F5E }, + { 0x1F7E, 0x1F7F }, { 0x1FB5, 0x1FB5 }, { 0x1FC5, 0x1FC5 }, + { 0x1FD4, 0x1FD5 }, { 0x1FDC, 0x1FDC }, { 0x1FF0, 0x1FF1 }, + { 0x1FF5, 0x1FF5 }, { 0x1FFF, 0x1FFF }, { 0x2028, 0x2029 }, + { 0x2065, 0x2065 }, { 0x2072, 0x2073 }, { 0x208F, 0x208F }, + { 0x209D, 0x209F }, { 0x20C1, 0x20CF }, { 0x20F1, 0x20FF }, + { 0x218C, 0x218F }, { 0x2427, 0x243F }, { 0x244B, 0x245F }, + { 0x2B74, 0x2B75 }, { 0x2B96, 0x2B96 }, { 0x2CF4, 0x2CF8 }, + { 0x2D26, 0x2D26 }, { 0x2D28, 0x2D2C }, { 0x2D2E, 0x2D2F }, + { 0x2D68, 0x2D6E }, { 0x2D71, 0x2D7E }, { 0x2D97, 0x2D9F }, + { 0x2DA7, 0x2DA7 }, { 0x2DAF, 0x2DAF }, { 0x2DB7, 0x2DB7 }, + { 0x2DBF, 0x2DBF }, { 0x2DC7, 0x2DC7 }, { 0x2DCF, 0x2DCF }, + { 0x2DD7, 0x2DD7 }, { 0x2DDF, 0x2DDF }, { 0x2E5E, 0x2E7F }, + { 0x2E9A, 0x2E9A }, { 0x2EF4, 0x2EFF }, { 0x2FD6, 0x2FEF }, + { 0x3040, 0x3040 }, { 0x3097, 0x3098 }, { 0x3100, 0x3104 }, + { 0x3130, 0x3130 }, { 0x318F, 0x318F }, { 0x31E4, 0x31EE }, + { 0x321F, 0x321F }, { 0x4DB6, 0x4DBF }, { 0x9FD6, 0x9FFF }, + { 0xA48D, 0xA48F }, { 0xA4C7, 0xA4CF }, { 0xA62C, 0xA63F }, + { 0xA6F8, 0xA6FF }, { 0xA7CB, 0xA7CF }, { 0xA7D2, 0xA7D2 }, + { 0xA7D4, 0xA7D4 }, { 0xA7DA, 0xA7F1 }, { 0xA82D, 0xA82F }, + { 0xA83A, 0xA83F }, { 0xA878, 0xA87F }, { 0xA8C6, 0xA8CD }, + { 0xA8DA, 0xA8DF }, { 0xA954, 0xA95E }, { 0xA97D, 0xA97F }, + { 0xA9CE, 0xA9CE }, { 0xA9DA, 0xA9DD }, { 0xA9FF, 0xA9FF }, + { 0xAA37, 0xAA3F }, { 0xAA4E, 0xAA4F }, { 0xAA5A, 0xAA5B }, + { 0xAAC3, 0xAADA }, { 0xAAF7, 0xAB00 }, { 0xAB07, 0xAB08 }, + { 0xAB0F, 0xAB10 }, { 0xAB17, 0xAB1F }, { 0xAB27, 0xAB27 }, + { 0xAB2F, 0xAB2F }, { 0xAB6C, 0xAB6F }, { 0xABEE, 0xABEF }, + { 0xABFA, 0xABFF }, { 0xD7A4, 0xD7AF }, { 0xD7C7, 0xD7CA }, + { 0xD7FC, 0xDFFF }, { 0xFA6E, 0xFA6F }, { 0xFADA, 0xFAFF }, + { 0xFB07, 0xFB12 }, { 0xFB18, 0xFB1C }, { 0xFB37, 0xFB37 }, + { 0xFB3D, 0xFB3D }, { 0xFB3F, 0xFB3F }, { 0xFB42, 0xFB42 }, + { 0xFB45, 0xFB45 }, { 0xFBC3, 0xFBD2 }, { 0xFD90, 0xFD91 }, + { 0xFDC8, 0xFDCE }, { 0xFDD0, 0xFDEF }, { 0xFE1A, 0xFE1F }, + { 0xFE53, 0xFE53 }, { 0xFE67, 0xFE67 }, { 0xFE6C, 0xFE6F }, + { 0xFE75, 0xFE75 }, { 0xFEFD, 0xFEFE }, { 0xFF00, 0xFF00 }, + { 0xFFBF, 0xFFC1 }, { 0xFFC8, 0xFFC9 }, { 0xFFD0, 0xFFD1 }, + { 0xFFD8, 0xFFD9 }, { 0xFFDD, 0xFFDF }, { 0xFFE7, 0xFFE7 }, + { 0xFFEF, 0xFFF8 }, { 0xFFFE, 0xFFFF }, { 0x1000C, 0x1000C }, + { 0x10027, 0x10027 }, { 0x1003B, 0x1003B }, { 0x1003E, 0x1003E }, + { 0x1004E, 0x1004F }, { 0x1005E, 0x1007F }, { 0x100FB, 0x100FF }, + { 0x10103, 0x10106 }, { 0x10134, 0x10136 }, { 0x1018F, 0x1018F }, + { 0x1019D, 0x1019F }, { 0x101A1, 0x101CF }, { 0x101FE, 0x1027F }, + { 0x1029D, 0x1029F }, { 0x102D1, 0x102DF }, { 0x102FC, 0x102FF }, + { 0x10324, 0x1032C }, { 0x1034B, 0x1034F }, { 0x1037B, 0x1037F }, + { 0x1039E, 0x1039E }, { 0x103C4, 0x103C7 }, { 0x103D6, 0x103FF }, + { 0x1049E, 0x1049F }, { 0x104AA, 0x104AF }, { 0x104D4, 0x104D7 }, + { 0x104FC, 0x104FF }, { 0x10528, 0x1052F }, { 0x10564, 0x1056E }, + { 0x1057B, 0x1057B }, { 0x1058B, 0x1058B }, { 0x10593, 0x10593 }, + { 0x10596, 0x10596 }, { 0x105A2, 0x105A2 }, { 0x105B2, 0x105B2 }, + { 0x105BA, 0x105BA }, { 0x105BD, 0x105FF }, { 0x10737, 0x1073F }, + { 0x10756, 0x1075F }, { 0x10768, 0x1077F }, { 0x10786, 0x10786 }, + { 0x107B1, 0x107B1 }, { 0x107BB, 0x107FF }, { 0x10806, 0x10807 }, + { 0x10809, 0x10809 }, { 0x10836, 0x10836 }, { 0x10839, 0x1083B }, + { 0x1083D, 0x1083E }, { 0x10856, 0x10856 }, { 0x1089F, 0x108A6 }, + { 0x108B0, 0x108DF }, { 0x108F3, 0x108F3 }, { 0x108F6, 0x108FA }, + { 0x1091C, 0x1091E }, { 0x1093A, 0x1093E }, { 0x10940, 0x1097F }, + { 0x109B8, 0x109BB }, { 0x109D0, 0x109D1 }, { 0x10A04, 0x10A04 }, + { 0x10A07, 0x10A0B }, { 0x10A14, 0x10A14 }, { 0x10A18, 0x10A18 }, + { 0x10A36, 0x10A37 }, { 0x10A3B, 0x10A3E }, { 0x10A49, 0x10A4F }, + { 0x10A59, 0x10A5F }, { 0x10AA0, 0x10ABF }, { 0x10AE7, 0x10AEA }, + { 0x10AF7, 0x10AFF }, { 0x10B36, 0x10B38 }, { 0x10B56, 0x10B57 }, + { 0x10B73, 0x10B77 }, { 0x10B92, 0x10B98 }, { 0x10B9D, 0x10BA8 }, + { 0x10BB0, 0x10BFF }, { 0x10C49, 0x10C7F }, { 0x10CB3, 0x10CBF }, + { 0x10CF3, 0x10CF9 }, { 0x10D28, 0x10D2F }, { 0x10D3A, 0x10E5F }, + { 0x10E7F, 0x10E7F }, { 0x10EAA, 0x10EAA }, { 0x10EAE, 0x10EAF }, + { 0x10EB2, 0x10EFC }, { 0x10F28, 0x10F2F }, { 0x10F5A, 0x10F6F }, + { 0x10F8A, 0x10FAF }, { 0x10FCC, 0x10FDF }, { 0x10FF7, 0x10FFF }, + { 0x1104E, 0x11051 }, { 0x11076, 0x1107E }, { 0x110C3, 0x110CC }, + { 0x110CE, 0x110CF }, { 0x110E9, 0x110EF }, { 0x110FA, 0x110FF }, + { 0x11135, 0x11135 }, { 0x11148, 0x1114F }, { 0x11177, 0x1117F }, + { 0x111E0, 0x111E0 }, { 0x111F5, 0x111FF }, { 0x11212, 0x11212 }, + { 0x11242, 0x1127F }, { 0x11287, 0x11287 }, { 0x11289, 0x11289 }, + { 0x1128E, 0x1128E }, { 0x1129E, 0x1129E }, { 0x112AA, 0x112AF }, + { 0x112EB, 0x112EF }, { 0x112FA, 0x112FF }, { 0x11304, 0x11304 }, + { 0x1130D, 0x1130E }, { 0x11311, 0x11312 }, { 0x11329, 0x11329 }, + { 0x11331, 0x11331 }, { 0x11334, 0x11334 }, { 0x1133A, 0x1133A }, + { 0x11345, 0x11346 }, { 0x11349, 0x1134A }, { 0x1134E, 0x1134F }, + { 0x11351, 0x11356 }, { 0x11358, 0x1135C }, { 0x11364, 0x11365 }, + { 0x1136D, 0x1136F }, { 0x11375, 0x113FF }, { 0x1145C, 0x1145C }, + { 0x11462, 0x1147F }, { 0x114C8, 0x114CF }, { 0x114DA, 0x1157F }, + { 0x115B6, 0x115B7 }, { 0x115DE, 0x115FF }, { 0x11645, 0x1164F }, + { 0x1165A, 0x1165F }, { 0x1166D, 0x1167F }, { 0x116BA, 0x116BF }, + { 0x116CA, 0x116FF }, { 0x1171B, 0x1171C }, { 0x1172C, 0x1172F }, + { 0x11747, 0x117FF }, { 0x1183C, 0x1189F }, { 0x118F3, 0x118FE }, + { 0x11907, 0x11908 }, { 0x1190A, 0x1190B }, { 0x11914, 0x11914 }, + { 0x11917, 0x11917 }, { 0x11936, 0x11936 }, { 0x11939, 0x1193A }, + { 0x11947, 0x1194F }, { 0x1195A, 0x1199F }, { 0x119A8, 0x119A9 }, + { 0x119D8, 0x119D9 }, { 0x119E5, 0x119FF }, { 0x11A48, 0x11A4F }, + { 0x11AA3, 0x11AAF }, { 0x11AF9, 0x11AFF }, { 0x11B0A, 0x11BFF }, + { 0x11C09, 0x11C09 }, { 0x11C37, 0x11C37 }, { 0x11C46, 0x11C4F }, + { 0x11C6D, 0x11C6F }, { 0x11C90, 0x11C91 }, { 0x11CA8, 0x11CA8 }, + { 0x11CB7, 0x11CFF }, { 0x11D07, 0x11D07 }, { 0x11D0A, 0x11D0A }, + { 0x11D37, 0x11D39 }, { 0x11D3B, 0x11D3B }, { 0x11D3E, 0x11D3E }, + { 0x11D48, 0x11D4F }, { 0x11D5A, 0x11D5F }, { 0x11D66, 0x11D66 }, + { 0x11D69, 0x11D69 }, { 0x11D8F, 0x11D8F }, { 0x11D92, 0x11D92 }, + { 0x11D99, 0x11D9F }, { 0x11DAA, 0x11EDF }, { 0x11EF9, 0x11EFF }, + { 0x11F11, 0x11F11 }, { 0x11F3B, 0x11F3D }, { 0x11F5A, 0x11FAF }, + { 0x11FB1, 0x11FBF }, { 0x11FF2, 0x11FFE }, { 0x1239A, 0x123FF }, + { 0x1246F, 0x1246F }, { 0x12475, 0x1247F }, { 0x12544, 0x12F8F }, + { 0x12FF3, 0x12FFF }, { 0x13456, 0x143FF }, { 0x14647, 0x167FF }, + { 0x16A39, 0x16A3F }, { 0x16A5F, 0x16A5F }, { 0x16A6A, 0x16A6D }, + { 0x16ABF, 0x16ABF }, { 0x16ACA, 0x16ACF }, { 0x16AEE, 0x16AEF }, + { 0x16AF6, 0x16AFF }, { 0x16B46, 0x16B4F }, { 0x16B5A, 0x16B5A }, + { 0x16B62, 0x16B62 }, { 0x16B78, 0x16B7C }, { 0x16B90, 0x16E3F }, + { 0x16E9B, 0x16EFF }, { 0x16F4B, 0x16F4E }, { 0x16F88, 0x16F8E }, + { 0x16FA0, 0x16FDF }, { 0x16FE5, 0x16FEF }, { 0x16FF2, 0x187FF }, + { 0x18CD6, 0x1AFEF }, { 0x1AFF4, 0x1AFF4 }, { 0x1AFFC, 0x1AFFC }, + { 0x1AFFF, 0x1AFFF }, { 0x1B123, 0x1B131 }, { 0x1B133, 0x1B14F }, + { 0x1B153, 0x1B154 }, { 0x1B156, 0x1B163 }, { 0x1B168, 0x1B16F }, + { 0x1B2FC, 0x1BBFF }, { 0x1BC6B, 0x1BC6F }, { 0x1BC7D, 0x1BC7F }, + { 0x1BC89, 0x1BC8F }, { 0x1BC9A, 0x1BC9B }, { 0x1BCA4, 0x1CEFF }, + { 0x1CF2E, 0x1CF2F }, { 0x1CF47, 0x1CF4F }, { 0x1CFC4, 0x1CFFF }, + { 0x1D0F6, 0x1D0FF }, { 0x1D127, 0x1D128 }, { 0x1D1EB, 0x1D1FF }, + { 0x1D246, 0x1D2BF }, { 0x1D2D4, 0x1D2DF }, { 0x1D2F4, 0x1D2FF }, + { 0x1D357, 0x1D35F }, { 0x1D379, 0x1D3FF }, { 0x1D455, 0x1D455 }, + { 0x1D49D, 0x1D49D }, { 0x1D4A0, 0x1D4A1 }, { 0x1D4A3, 0x1D4A4 }, + { 0x1D4A7, 0x1D4A8 }, { 0x1D4AD, 0x1D4AD }, { 0x1D4BA, 0x1D4BA }, + { 0x1D4BC, 0x1D4BC }, { 0x1D4C4, 0x1D4C4 }, { 0x1D506, 0x1D506 }, + { 0x1D50B, 0x1D50C }, { 0x1D515, 0x1D515 }, { 0x1D51D, 0x1D51D }, + { 0x1D53A, 0x1D53A }, { 0x1D53F, 0x1D53F }, { 0x1D545, 0x1D545 }, + { 0x1D547, 0x1D549 }, { 0x1D551, 0x1D551 }, { 0x1D6A6, 0x1D6A7 }, + { 0x1D7CC, 0x1D7CD }, { 0x1DA8C, 0x1DA9A }, { 0x1DAA0, 0x1DAA0 }, + { 0x1DAB0, 0x1DEFF }, { 0x1DF1F, 0x1DF24 }, { 0x1DF2B, 0x1DFFF }, + { 0x1E007, 0x1E007 }, { 0x1E019, 0x1E01A }, { 0x1E022, 0x1E022 }, + { 0x1E025, 0x1E025 }, { 0x1E02B, 0x1E02F }, { 0x1E06E, 0x1E08E }, + { 0x1E090, 0x1E0FF }, { 0x1E12D, 0x1E12F }, { 0x1E13E, 0x1E13F }, + { 0x1E14A, 0x1E14D }, { 0x1E150, 0x1E28F }, { 0x1E2AF, 0x1E2BF }, + { 0x1E2FA, 0x1E2FE }, { 0x1E300, 0x1E4CF }, { 0x1E4FA, 0x1E7DF }, + { 0x1E7E7, 0x1E7E7 }, { 0x1E7EC, 0x1E7EC }, { 0x1E7EF, 0x1E7EF }, + { 0x1E7FF, 0x1E7FF }, { 0x1E8C5, 0x1E8C6 }, { 0x1E8D7, 0x1E8FF }, + { 0x1E94C, 0x1E94F }, { 0x1E95A, 0x1E95D }, { 0x1E960, 0x1EC70 }, + { 0x1ECB5, 0x1ED00 }, { 0x1ED3E, 0x1EDFF }, { 0x1EE04, 0x1EE04 }, + { 0x1EE20, 0x1EE20 }, { 0x1EE23, 0x1EE23 }, { 0x1EE25, 0x1EE26 }, + { 0x1EE28, 0x1EE28 }, { 0x1EE33, 0x1EE33 }, { 0x1EE38, 0x1EE38 }, + { 0x1EE3A, 0x1EE3A }, { 0x1EE3C, 0x1EE41 }, { 0x1EE43, 0x1EE46 }, + { 0x1EE48, 0x1EE48 }, { 0x1EE4A, 0x1EE4A }, { 0x1EE4C, 0x1EE4C }, + { 0x1EE50, 0x1EE50 }, { 0x1EE53, 0x1EE53 }, { 0x1EE55, 0x1EE56 }, + { 0x1EE58, 0x1EE58 }, { 0x1EE5A, 0x1EE5A }, { 0x1EE5C, 0x1EE5C }, + { 0x1EE5E, 0x1EE5E }, { 0x1EE60, 0x1EE60 }, { 0x1EE63, 0x1EE63 }, + { 0x1EE65, 0x1EE66 }, { 0x1EE6B, 0x1EE6B }, { 0x1EE73, 0x1EE73 }, + { 0x1EE78, 0x1EE78 }, { 0x1EE7D, 0x1EE7D }, { 0x1EE7F, 0x1EE7F }, + { 0x1EE8A, 0x1EE8A }, { 0x1EE9C, 0x1EEA0 }, { 0x1EEA4, 0x1EEA4 }, + { 0x1EEAA, 0x1EEAA }, { 0x1EEBC, 0x1EEEF }, { 0x1EEF2, 0x1EFFF }, + { 0x1F02C, 0x1F02F }, { 0x1F094, 0x1F09F }, { 0x1F0AF, 0x1F0B0 }, + { 0x1F0C0, 0x1F0C0 }, { 0x1F0D0, 0x1F0D0 }, { 0x1F0F6, 0x1F0FF }, + { 0x1F1AE, 0x1F1E5 }, { 0x1F203, 0x1F20F }, { 0x1F23C, 0x1F23F }, + { 0x1F249, 0x1F24F }, { 0x1F252, 0x1F25F }, { 0x1F266, 0x1F2FF }, + { 0x1F6D8, 0x1F6DB }, { 0x1F6ED, 0x1F6EF }, { 0x1F6FD, 0x1F6FF }, + { 0x1F777, 0x1F77A }, { 0x1F7DA, 0x1F7DF }, { 0x1F7EC, 0x1F7EF }, + { 0x1F7F1, 0x1F7FF }, { 0x1F80C, 0x1F80F }, { 0x1F848, 0x1F84F }, + { 0x1F85A, 0x1F85F }, { 0x1F888, 0x1F88F }, { 0x1F8AE, 0x1F8AF }, + { 0x1F8B2, 0x1F8FF }, { 0x1FA54, 0x1FA5F }, { 0x1FA6E, 0x1FA6F }, + { 0x1FA7D, 0x1FA7F }, { 0x1FA89, 0x1FA8F }, { 0x1FABE, 0x1FABE }, + { 0x1FAC6, 0x1FACD }, { 0x1FADC, 0x1FADF }, { 0x1FAE9, 0x1FAEF }, + { 0x1FAF9, 0x1FAFF }, { 0x1FB93, 0x1FB93 }, { 0x1FBCB, 0x1FBEF }, + { 0x1FBFA, 0x1FFFF }, { 0x2A6D7, 0x2F7FF }, { 0x2FA1E, 0xE0000 }, + { 0xE0002, 0xE001F }, { 0xE0080, 0xE00FF }, { 0xE01F0, 0x10FFFD } + }; + /* *INDENT-ON* */ + + /* sorted list of non-overlapping intervals of non-characters */ + /* generated by + * uniset +WIDTH-W -cat=Cn -cat=Mn c + */ + /* *INDENT-OFF* */ + /* generated by run-uniset_dbl 1.2 */ + static const struct interval doublewidth[] = { + { 0x1100, 0x115F }, { 0x231A, 0x231B }, { 0x2329, 0x232A }, + { 0x23E9, 0x23EC }, { 0x23F0, 0x23F0 }, { 0x23F3, 0x23F3 }, + { 0x25FD, 0x25FE }, { 0x2614, 0x2615 }, { 0x2648, 0x2653 }, + { 0x267F, 0x267F }, { 0x2693, 0x2693 }, { 0x26A1, 0x26A1 }, + { 0x26AA, 0x26AB }, { 0x26BD, 0x26BE }, { 0x26C4, 0x26C5 }, + { 0x26CE, 0x26CE }, { 0x26D4, 0x26D4 }, { 0x26EA, 0x26EA }, + { 0x26F2, 0x26F3 }, { 0x26F5, 0x26F5 }, { 0x26FA, 0x26FA }, + { 0x26FD, 0x26FD }, { 0x2705, 0x2705 }, { 0x270A, 0x270B }, + { 0x2728, 0x2728 }, { 0x274C, 0x274C }, { 0x274E, 0x274E }, + { 0x2753, 0x2755 }, { 0x2757, 0x2757 }, { 0x2795, 0x2797 }, + { 0x27B0, 0x27B0 }, { 0x27BF, 0x27BF }, { 0x2B1B, 0x2B1C }, + { 0x2B50, 0x2B50 }, { 0x2B55, 0x2B55 }, { 0x2E80, 0x2E99 }, + { 0x2E9B, 0x2EF3 }, { 0x2F00, 0x2FD5 }, { 0x2FF0, 0x3029 }, + { 0x302E, 0x303E }, { 0x3041, 0x3096 }, { 0x309B, 0x30FF }, + { 0x3105, 0x312F }, { 0x3131, 0x318E }, { 0x3190, 0x31E3 }, + { 0x31EF, 0x321E }, { 0x3220, 0x3247 }, { 0x3250, 0x4DBF }, + { 0x4E00, 0xA48C }, { 0xA490, 0xA4C6 }, { 0xA960, 0xA97C }, + { 0xAC00, 0xD7A3 }, { 0xF900, 0xFAFF }, { 0xFE10, 0xFE19 }, + { 0xFE30, 0xFE52 }, { 0xFE54, 0xFE66 }, { 0xFE68, 0xFE6B }, + { 0xFF01, 0xFF60 }, { 0xFFE0, 0xFFE6 }, { 0x16FE0, 0x16FE3 }, + { 0x16FF0, 0x16FF1 }, { 0x17000, 0x187F7 }, { 0x18800, 0x18CD5 }, + { 0x18D00, 0x18D08 }, { 0x1AFF0, 0x1AFF3 }, { 0x1AFF5, 0x1AFFB }, + { 0x1AFFD, 0x1AFFE }, { 0x1B000, 0x1B122 }, { 0x1B132, 0x1B132 }, + { 0x1B150, 0x1B152 }, { 0x1B155, 0x1B155 }, { 0x1B164, 0x1B167 }, + { 0x1B170, 0x1B2FB }, { 0x1F004, 0x1F004 }, { 0x1F0CF, 0x1F0CF }, + { 0x1F18E, 0x1F18E }, { 0x1F191, 0x1F19A }, { 0x1F200, 0x1F202 }, + { 0x1F210, 0x1F23B }, { 0x1F240, 0x1F248 }, { 0x1F250, 0x1F251 }, + { 0x1F260, 0x1F265 }, { 0x1F300, 0x1F320 }, { 0x1F32D, 0x1F335 }, + { 0x1F337, 0x1F37C }, { 0x1F37E, 0x1F393 }, { 0x1F3A0, 0x1F3CA }, + { 0x1F3CF, 0x1F3D3 }, { 0x1F3E0, 0x1F3F0 }, { 0x1F3F4, 0x1F3F4 }, + { 0x1F3F8, 0x1F43E }, { 0x1F440, 0x1F440 }, { 0x1F442, 0x1F4FC }, + { 0x1F4FF, 0x1F53D }, { 0x1F54B, 0x1F54E }, { 0x1F550, 0x1F567 }, + { 0x1F57A, 0x1F57A }, { 0x1F595, 0x1F596 }, { 0x1F5A4, 0x1F5A4 }, + { 0x1F5FB, 0x1F64F }, { 0x1F680, 0x1F6C5 }, { 0x1F6CC, 0x1F6CC }, + { 0x1F6D0, 0x1F6D2 }, { 0x1F6D5, 0x1F6D7 }, { 0x1F6DC, 0x1F6DF }, + { 0x1F6EB, 0x1F6EC }, { 0x1F6F4, 0x1F6FC }, { 0x1F7E0, 0x1F7EB }, + { 0x1F7F0, 0x1F7F0 }, { 0x1F90C, 0x1F93A }, { 0x1F93C, 0x1F945 }, + { 0x1F947, 0x1F9FF }, { 0x1FA70, 0x1FA7C }, { 0x1FA80, 0x1FA88 }, + { 0x1FA90, 0x1FABD }, { 0x1FABF, 0x1FAC5 }, { 0x1FACE, 0x1FADB }, + { 0x1FAE0, 0x1FAE8 }, { 0x1FAF0, 0x1FAF8 }, { 0x20000, 0x2FFFD }, + { 0x30000, 0x3FFFD } + }; + /* *INDENT-ON* */ + + int result; + +#define Lookup(cmp, table) \ + bisearch(cmp, table, \ + (int) (sizeof(table) / sizeof(struct interval) - 1)) + + /* test for 8-bit control characters */ + if (cmp == 0) { + result = 0; + } else if (cmp < 32 || (cmp >= 0x7f && cmp < 0xa0)) { + result = -1; + } else if (cmp == 0xad) { + result = use_latin1; + } else if (Lookup(cmp, formatting)) { + /* treat formatting characters like control characters */ + result = -1; + } else if (Lookup(cmp, combining)) { + /* binary search in table of non-spacing characters */ + result = 0; + } else { + /* if we arrive here, cmp is not a combining or C0/C1 control character */ + result = 1; + + if (Lookup(cmp, doublewidth)) { + result = 2; + } else if (cmp >= unknowns[0].first && Lookup(cmp, unknowns)) { + result = -1; + } + } + return result; +} + + +NCURSES_EXPORT(int) mk_wcswidth(const uint32_t *pwcs, size_t n) +{ + int width = 0; + + for (; *pwcs && n-- > 0; pwcs++) { + int w; + + if ((w = mk_wcwidth(*pwcs)) < 0) + return -1; + else + width += w; + } + + return width; +} + + +/* + * The following functions are the same as mk_wcwidth() and + * mk_wcwidth_cjk(), except that spacing characters in the East Asian + * Ambiguous (A) category as defined in Unicode Technical Report #11 + * have a column width of 2. This variant might be useful for users of + * CJK legacy encodings who want to migrate to UCS without changing + * the traditional terminal character-width behaviour. It is not + * otherwise recommended for general use. + */ +NCURSES_EXPORT(int) mk_wcwidth_cjk(uint32_t ucs) +{ + /* sorted list of non-overlapping intervals of East Asian Ambiguous + * characters, generated by + * + * uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf \ + * +E000..F8FF \ + * +F0000..FFFFD \ + * +100000..10FFFD c + * + * "WIDTH-A" is a file extracted from EastAsianWidth.txt by selecting + * only those with width "A", and omitting: + * + * 0xAD + * all lines with "COMBINING" + */ + /* *INDENT-OFF* */ + /* generated by run-uniset_cjk 1.5 */ + static const struct interval ambiguous[] = { + { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, + { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, + { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, + { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, + { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, + { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, + { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, + { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, + { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, + { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, + { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, + { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, + { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, + { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, + { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, + { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, + { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, + { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, + { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, + { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, + { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, + { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, + { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, + { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, + { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, + { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, + { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, + { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, + { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, + { 0x2189, 0x2189 }, { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, + { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, + { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, + { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, + { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, + { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, + { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, + { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, + { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, + { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, + { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, + { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, + { 0x24EB, 0x254B }, { 0x2550, 0x2573 }, { 0x2580, 0x258F }, + { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, + { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, + { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, + { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, + { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, + { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, + { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, + { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, + { 0x269E, 0x269F }, { 0x26BF, 0x26BF }, { 0x26C6, 0x26CD }, + { 0x26CF, 0x26D3 }, { 0x26D5, 0x26E1 }, { 0x26E3, 0x26E3 }, + { 0x26E8, 0x26E9 }, { 0x26EB, 0x26F1 }, { 0x26F4, 0x26F4 }, + { 0x26F6, 0x26F9 }, { 0x26FB, 0x26FC }, { 0x26FE, 0x26FF }, + { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0x2B56, 0x2B59 }, + { 0x3248, 0x324F }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD }, + { 0x1F100, 0x1F10A }, { 0x1F110, 0x1F12D }, { 0x1F130, 0x1F169 }, + { 0x1F170, 0x1F18D }, { 0x1F18F, 0x1F190 }, { 0x1F19B, 0x1F1AC }, + { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } + }; + /* *INDENT-ON* */ + + /* binary search in table of non-spacing characters */ + if (Lookup((unsigned long) ucs, ambiguous)) + return 2; + + return mk_wcwidth(ucs); +} + + +NCURSES_EXPORT(int) mk_wcswidth_cjk(const uint32_t *pwcs, size_t n) +{ + int width = 0; + + for (; *pwcs && n-- > 0; pwcs++) { + int w; + + if ((w = mk_wcwidth_cjk(*pwcs)) < 0) + return -1; + else + width += w; + } + + return width; +} + +#ifdef __cplusplus +} +#endif + +#endif /* _WCWIDTH_H_incl 1 */ diff --git a/contrib/ncurses/ncurses/widechar/charable.c b/contrib/ncurses/ncurses/widechar/charable.c new file mode 100644 index 00000000..55d4890c --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/charable.c @@ -0,0 +1,85 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2003-2005,2008 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* +** Support functions for wide/narrow conversion. +*/ + +#include + +MODULE_ID("$Id: charable.c,v 1.8 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(bool) _nc_is_charable(wchar_t ch) +{ + bool result; +#if HAVE_WCTOB + result = (wctob((wint_t) ch) == (int) ch); +#else + result = (_nc_to_char(ch) >= 0); +#endif + return result; +} + +NCURSES_EXPORT(int) _nc_to_char(wint_t ch) +{ + int result; +#if HAVE_WCTOB + result = wctob(ch); +#elif HAVE_WCTOMB + char temp[MB_LEN_MAX]; + result = wctomb(temp, ch); + if (strlen(temp) == 1) + result = UChar(temp[0]); + else + result = -1; +#else +#error expected either wctob/wctomb +#endif + return result; +} + +NCURSES_EXPORT(wint_t) _nc_to_widechar(int ch) +{ + wint_t result; +#if HAVE_BTOWC + result = btowc(ch); +#elif HAVE_MBTOWC + wchar_t convert; + char temp[2]; + temp[0] = ch; + temp[1] = '\0'; + if (mbtowc(&convert, temp, 1) >= 0) + result = convert; + else + result = WEOF; +#else +#error expected either btowc/mbtowc +#endif + return result; +} diff --git a/contrib/ncurses/ncurses/widechar/lib_add_wch.c b/contrib/ncurses/ncurses/widechar/lib_add_wch.c new file mode 100644 index 00000000..f8160135 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_add_wch.c @@ -0,0 +1,450 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2004-2011,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* +** lib_add_wch.c +** +** The routine wadd_wch(). +** +*/ + +#include + +#if HAVE_WCTYPE_H +#include +#endif + +MODULE_ID("$Id: lib_add_wch.c,v 1.19 2024/07/27 19:22:23 tom Exp $") + +/* clone/adapt lib_addch.c */ +static const cchar_t blankchar = NewChar(BLANK_TEXT); + +/* + * Ugly microtweaking alert. Everything from here to end of module is + * likely to be speed-critical -- profiling data sure says it is! + * Most of the important screen-painting functions are shells around + * wadd_wch(). So we make every effort to reduce function-call overhead + * by inlining stuff, even at the cost of making wrapped copies for + * export. Also we supply some internal versions that don't call the + * window sync hook, for use by string-put functions. + */ + +/* Return bit mask for clearing color pair number if given ch has color */ +#define COLOR_MASK(ch) (~(attr_t)(((ch) & A_COLOR) ? A_COLOR : 0)) + +static NCURSES_INLINE cchar_t +render_char(WINDOW *win, cchar_t ch) +/* compute a rendition of the given char correct for the current context */ +{ + attr_t a = WINDOW_ATTRS(win); + int pair = GetPair(ch); + + if (ISBLANK(ch) + && AttrOf(ch) == A_NORMAL + && pair == 0) { + /* color/pair in attrs has precedence over bkgrnd */ + ch = win->_nc_bkgd; + SetAttr(ch, a | AttrOf(win->_nc_bkgd)); + if ((pair = GET_WINDOW_PAIR(win)) == 0) + pair = GetPair(win->_nc_bkgd); + SetPair(ch, pair); + } else { + /* color in attrs has precedence over bkgrnd */ + a |= AttrOf(win->_nc_bkgd) & COLOR_MASK(a); + /* color in ch has precedence */ + if (pair == 0) { + if ((pair = GET_WINDOW_PAIR(win)) == 0) + pair = GetPair(win->_nc_bkgd); + } + AddAttr(ch, (a & COLOR_MASK(AttrOf(ch)))); + SetPair(ch, pair); + } + + TR(TRACE_VIRTPUT, + ("render_char bkg %s (%d), attrs %s (%d) -> ch %s (%d)", + _tracech_t2(1, CHREF(win->_nc_bkgd)), + GetPair(win->_nc_bkgd), + _traceattr(WINDOW_ATTRS(win)), + GET_WINDOW_PAIR(win), + _tracech_t2(3, CHREF(ch)), + GetPair(ch))); + + return (ch); +} + +/* check if position is legal; if not, return error */ +#ifndef NDEBUG /* treat this like an assertion */ +#define CHECK_POSITION(win, x, y) \ + if (y > win->_maxy \ + || x > win->_maxx \ + || y < 0 \ + || x < 0) { \ + TR(TRACE_VIRTPUT, ("Alert! Win=%p _curx = %d, _cury = %d " \ + "(_maxx = %d, _maxy = %d)", win, x, y, \ + win->_maxx, win->_maxy)); \ + return(ERR); \ + } +#else +#define CHECK_POSITION(win, x, y) /* nothing */ +#endif + +static bool +newline_forces_scroll(const WINDOW *win, NCURSES_SIZE_T *ypos) +{ + bool result = FALSE; + + if (*ypos >= win->_regtop && *ypos == win->_regbottom) { + *ypos = win->_regbottom; + result = TRUE; + } else { + *ypos = (NCURSES_SIZE_T) (*ypos + 1); + } + return result; +} + +/* + * The _WRAPPED flag is useful only for telling an application that we've just + * wrapped the cursor. We don't do anything with this flag except set it when + * wrapping, and clear it whenever we move the cursor. If we try to wrap at + * the lower-right corner of a window, we cannot move the cursor (since that + * wouldn't be legal). So we return an error (which is what SVr4 does). + * Unlike SVr4, we can successfully add a character to the lower-right corner + * (Solaris 2.6 does this also, however). + */ +static int +wrap_to_next_line(WINDOW *win) +{ + win->_flags |= _WRAPPED; + if (newline_forces_scroll(win, &(win->_cury))) { + win->_curx = win->_maxx; + if (!win->_scroll) + return (ERR); + scroll(win); + } + win->_curx = 0; + return (OK); +} + +static int wadd_wch_literal(WINDOW *, cchar_t); +/* + * Fill the given number of cells with blanks using the current background + * rendition. This saves/restores the current x-position. + */ +static void +fill_cells(WINDOW *win, int count) +{ + cchar_t blank = blankchar; + int save_x = win->_curx; + int save_y = win->_cury; + + while (count-- > 0) { + if (wadd_wch_literal(win, blank) == ERR) + break; + } + win->_curx = (NCURSES_SIZE_T) save_x; + win->_cury = (NCURSES_SIZE_T) save_y; +} + +static int +wadd_wch_literal(WINDOW *win, cchar_t ch) +{ + int x; + int y; + struct ldat *line; + + x = win->_curx; + y = win->_cury; + + CHECK_POSITION(win, x, y); + + ch = render_char(win, ch); + + line = win->_line + y; + + CHANGED_CELL(line, x); + + /* + * Non-spacing characters are added to the current cell. + * + * Spacing characters that are wider than one column require some display + * adjustments. + */ + { + int len = _nc_wacs_width(CharOf(ch)); + int i; + int j; + wchar_t *chars; + + if (len == 0) { /* non-spacing */ + if ((x > 0 && y >= 0) + || (win->_maxx >= 0 && win->_cury >= 1)) { + if (x > 0 && y >= 0) { + for (j = x - 1; j > 0; --j) { + if (!isWidecExt(win->_line[y].text[j])) { + break; + } + } + chars = (win->_line[y].text[j].chars); + } else { + chars = (win->_line[y - 1].text[win->_maxx].chars); + } + for (i = 0; i < CCHARW_MAX; ++i) { + if (chars[i] == 0) { + TR(TRACE_VIRTPUT, + ("added non-spacing %d: %x", + x, (int) CharOf(ch))); + chars[i] = CharOf(ch); + break; + } + } + } + goto testwrapping; + } else if (len > 1) { /* multi-column characters */ + /* + * Check if the character will fit on the current line. If it does + * not fit, fill in the remainder of the line with blanks. and + * move to the next line. + */ + if (len > win->_maxx + 1) { + TR(TRACE_VIRTPUT, ("character will not fit")); + return ERR; + } else if (x + len > win->_maxx + 1) { + int count = win->_maxx + 1 - x; + TR(TRACE_VIRTPUT, ("fill %d remaining cells", count)); + fill_cells(win, count); + if (wrap_to_next_line(win) == ERR) + return ERR; + x = win->_curx; + y = win->_cury; + line = win->_line + y; + } + /* + * Check for cells which are orphaned by adding this character, set + * those to blanks. + * + * FIXME: this actually could fill j-i cells, more complicated to + * setup though. + */ + for (i = 0; i < len; ++i) { + if (isWidecBase(win->_line[y].text[x + i])) { + break; + } else if (isWidecExt(win->_line[y].text[x + i])) { + for (j = i; x + j <= win->_maxx; ++j) { + if (!isWidecExt(win->_line[y].text[x + j])) { + TR(TRACE_VIRTPUT, ("fill %d orphan cells", j)); + fill_cells(win, j); + break; + } + } + break; + } + } + /* + * Finally, add the cells for this character. + */ + for (i = 0; i < len; ++i) { + cchar_t value = ch; + SetWidecExt(value, i); + TR(TRACE_VIRTPUT, ("multicolumn %d:%d (%d,%d)", + i + 1, len, + win->_begy + y, win->_begx + x)); + line->text[x] = value; + CHANGED_CELL(line, x); + ++x; + } + goto testwrapping; + } + } + + /* + * Single-column characters. + */ + line->text[x++] = ch; + /* + * This label is used only for wide-characters. + */ + testwrapping: + + TR(TRACE_VIRTPUT, ("cell (%ld, %ld..%d) = %s", + (long) win->_cury, (long) win->_curx, x - 1, + _tracech_t(CHREF(ch)))); + + if (x > win->_maxx) { + return wrap_to_next_line(win); + } + win->_curx = (NCURSES_SIZE_T) x; + return OK; +} + +static NCURSES_INLINE int +wadd_wch_nosync(WINDOW *win, cchar_t ch) +/* the workhorse function -- add a character to the given window */ +{ + NCURSES_SIZE_T x, y; + const wchar_t *s; + int tabsize = 8; +#if USE_REENTRANT + SCREEN *sp = _nc_screen_of(win); +#endif + + /* + * If we are using the alternate character set, forget about locale. + * Otherwise, if the locale claims the code is printable, treat it that + * way. + */ + if ((AttrOf(ch) & A_ALTCHARSET) + || iswprint((wint_t) CharOf(ch))) + return wadd_wch_literal(win, ch); + + /* + * Handle carriage control and other codes that are not printable, or are + * known to expand to more than one character according to unctrl(). + */ + x = win->_curx; + y = win->_cury; + + switch (CharOf(ch)) { + case '\t': +#if USE_REENTRANT + tabsize = *ptrTabsize(sp); +#else + tabsize = TABSIZE; +#endif + x = (NCURSES_SIZE_T) (x + (tabsize - (x % tabsize))); + /* + * Space-fill the tab on the bottom line so that we'll get the + * "correct" cursor position. + */ + if ((!win->_scroll && (y == win->_regbottom)) + || (x <= win->_maxx)) { + cchar_t blank = blankchar; + AddAttr(blank, AttrOf(ch)); + while (win->_curx < x) { + if (wadd_wch_literal(win, blank) == ERR) + return (ERR); + } + break; + } else { + wclrtoeol(win); + win->_flags |= _WRAPPED; + if (newline_forces_scroll(win, &y)) { + x = win->_maxx; + if (win->_scroll) { + scroll(win); + x = 0; + } + } else { + x = 0; + } + } + break; + case '\n': + wclrtoeol(win); + if (newline_forces_scroll(win, &y)) { + if (win->_scroll) + scroll(win); + else + return (ERR); + } + /* FALLTHRU */ + case '\r': + x = 0; + win->_flags &= ~_WRAPPED; + break; + case '\b': + if (x == 0) + return (OK); + x--; + win->_flags &= ~_WRAPPED; + break; + default: + if ((s = wunctrl(&ch)) != 0) { + while (*s) { + cchar_t sch; + SetChar(sch, *s++, AttrOf(ch)); + if_EXT_COLORS(SetPair(sch, GetPair(ch))); + if (wadd_wch_literal(win, sch) == ERR) + return ERR; + } + return OK; + } + return ERR; + } + + win->_curx = x; + win->_cury = y; + + return OK; +} + +/* + * The versions below call _nc_synchook(). We wanted to avoid this in the + * version exported for string puts; they'll call _nc_synchook once at end + * of run. + */ + +/* These are actual entry points */ + +NCURSES_EXPORT(int) +wadd_wch(WINDOW *win, const cchar_t *wch) +{ + int code = ERR; + + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wadd_wch(%p, %s)"), + (void *) win, + _tracecchar_t(wch))); + + if (win && (wadd_wch_nosync(win, *wch) != ERR)) { + _nc_synchook(win); + code = OK; + } + + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} + +NCURSES_EXPORT(int) +wecho_wchar(WINDOW *win, const cchar_t *wch) +{ + int code = ERR; + + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_CALLED("wechochar(%p, %s)"), + (void *) win, + _tracecchar_t(wch))); + + if (win && (wadd_wch_nosync(win, *wch) != ERR)) { + bool save_immed = win->_immed; + win->_immed = TRUE; + _nc_synchook(win); + win->_immed = save_immed; + code = OK; + } + TR(TRACE_VIRTPUT | TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_box_set.c b/contrib/ncurses/ncurses/widechar/lib_box_set.c new file mode 100644 index 00000000..ef2e1a7d --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_box_set.c @@ -0,0 +1,114 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2002-2009,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Authors: Sven Verdoolaege and Thomas Dickey 2001,2002 * + ****************************************************************************/ + +/* +** lib_box_set.c +** +** The routine wborder_set(). +** +*/ + +#include + +MODULE_ID("$Id: lib_box_set.c,v 1.7 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wborder_set(WINDOW *win, + const ARG_CH_T ls, const ARG_CH_T rs, + const ARG_CH_T ts, const ARG_CH_T bs, + const ARG_CH_T tl, const ARG_CH_T tr, + const ARG_CH_T bl, const ARG_CH_T br) +{ + NCURSES_SIZE_T i; + NCURSES_SIZE_T endx, endy; + NCURSES_CH_T wls, wrs, wts, wbs, wtl, wtr, wbl, wbr; + + T((T_CALLED("wborder_set(%p,%s,%s,%s,%s,%s,%s,%s,%s)"), + (void *) win, + _tracech_t2(1, ls), + _tracech_t2(2, rs), + _tracech_t2(3, ts), + _tracech_t2(4, bs), + _tracech_t2(5, tl), + _tracech_t2(6, tr), + _tracech_t2(7, bl), + _tracech_t2(8, br))); + + if (!win) + returnCode(ERR); + +#define RENDER_WITH_DEFAULT(ch,def) w ##ch = _nc_render(win, (ch == 0) ? *(const ARG_CH_T)def : *ch) + + RENDER_WITH_DEFAULT(ls, WACS_VLINE); + RENDER_WITH_DEFAULT(rs, WACS_VLINE); + RENDER_WITH_DEFAULT(ts, WACS_HLINE); + RENDER_WITH_DEFAULT(bs, WACS_HLINE); + RENDER_WITH_DEFAULT(tl, WACS_ULCORNER); + RENDER_WITH_DEFAULT(tr, WACS_URCORNER); + RENDER_WITH_DEFAULT(bl, WACS_LLCORNER); + RENDER_WITH_DEFAULT(br, WACS_LRCORNER); + + T(("using %s, %s, %s, %s, %s, %s, %s, %s", + _tracech_t2(1, CHREF(wls)), + _tracech_t2(2, CHREF(wrs)), + _tracech_t2(3, CHREF(wts)), + _tracech_t2(4, CHREF(wbs)), + _tracech_t2(5, CHREF(wtl)), + _tracech_t2(6, CHREF(wtr)), + _tracech_t2(7, CHREF(wbl)), + _tracech_t2(8, CHREF(wbr)))); + + endx = win->_maxx; + endy = win->_maxy; + + for (i = 0; i <= endx; i++) { + win->_line[0].text[i] = wts; + win->_line[endy].text[i] = wbs; + } + win->_line[endy].firstchar = win->_line[0].firstchar = 0; + win->_line[endy].lastchar = win->_line[0].lastchar = endx; + + for (i = 0; i <= endy; i++) { + win->_line[i].text[0] = wls; + win->_line[i].text[endx] = wrs; + win->_line[i].firstchar = 0; + win->_line[i].lastchar = endx; + } + win->_line[0].text[0] = wtl; + win->_line[0].text[endx] = wtr; + win->_line[endy].text[0] = wbl; + win->_line[endy].text[endx] = wbr; + + _nc_synchook(win); + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_cchar.c b/contrib/ncurses/ncurses/widechar/lib_cchar.c new file mode 100644 index 00000000..81bef8ad --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_cchar.c @@ -0,0 +1,158 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2001-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* +** lib_cchar.c +** +** The routines setcchar() and getcchar(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_cchar.c,v 1.39 2024/07/27 19:22:23 tom Exp $") + +/* + * The SuSv2 description leaves some room for interpretation. We'll assume wch + * points to a string which is L'\0' terminated, contains at least one + * character with strictly positive width, which must be the first, and + * contains no characters of negative width. + */ +NCURSES_EXPORT(int) +setcchar(cchar_t *wcval, + const wchar_t *wch, + const attr_t attrs, + NCURSES_PAIRS_T pair_arg, + const void *opts) +{ + int code = OK; + int color_pair = pair_arg; + unsigned len; + + TR(TRACE_CCALLS, (T_CALLED("setcchar(%p,%s,attrs=%lu,pair=%d,%p)"), + (void *) wcval, _nc_viswbuf(wch), + (unsigned long) attrs, color_pair, opts)); + + set_extended_pair(opts, color_pair); + if (wch == NULL + || ((len = (unsigned) wcslen(wch)) > 1 && _nc_wacs_width(wch[0]) < 0) + || color_pair < 0) { + code = ERR; + } else { + unsigned i; + + if (len > CCHARW_MAX) + len = CCHARW_MAX; + + /* + * If we have a following spacing-character, stop at that point. We + * are only interested in adding non-spacing characters. + */ + for (i = 1; i < len; ++i) { + if (_nc_wacs_width(wch[i]) != 0) { + len = i; + break; + } + } + + memset(wcval, 0, sizeof(*wcval)); + + if (len != 0) { + SetAttr(*wcval, attrs); + SetPair(CHDEREF(wcval), color_pair); + memcpy(&wcval->chars, wch, len * sizeof(wchar_t)); + TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len, + _tracecchar_t(wcval))); + } + } + + TR(TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} + +NCURSES_EXPORT(int) +getcchar(const cchar_t *wcval, + wchar_t *wch, + attr_t *attrs, + NCURSES_PAIRS_T *pair_arg, + void *opts) +{ + int code = ERR; + + TR(TRACE_CCALLS, (T_CALLED("getcchar(%p,%p,%p,%p,%p)"), + (const void *) wcval, + (void *) wch, + (void *) attrs, + (void *) pair_arg, + opts)); + +#if !NCURSES_EXT_COLORS + if (opts != NULL) { + ; /* empty */ + } else +#endif + if (wcval != NULL) { + const wchar_t *wp; + int len; + +#if HAVE_WMEMCHR + len = ((wp = wmemchr(wcval->chars, L'\0', (size_t) CCHARW_MAX)) + ? (int) (wp - wcval->chars) + : CCHARW_MAX); +#else + len = wcsnlen(wcval->chars, CCHARW_MAX); +#endif + if (wch == NULL) { + /* + * If the value is a null, set the length to 1. + * If the value is not a null, return the length plus 1 for null. + */ + code = (len < CCHARW_MAX) ? (len + 1) : CCHARW_MAX; + } else if (attrs == 0 || pair_arg == 0) { + code = ERR; + } else if (len >= 0) { + int color_pair; + + TR(TRACE_CCALLS, ("copy %d wchars, first is %s", len, + _tracecchar_t(wcval))); + *attrs = AttrOf(*wcval) & A_ATTRIBUTES; + color_pair = GetPair(*wcval); + get_extended_pair(opts, color_pair); + *pair_arg = limit_PAIRS(color_pair); + wmemcpy(wch, wcval->chars, (size_t) len); + wch[len] = L'\0'; + if (*pair_arg >= 0) + code = OK; + } + } + + TR(TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_erasewchar.c b/contrib/ncurses/ncurses/widechar/lib_erasewchar.c new file mode 100644 index 00000000..197f80b5 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_erasewchar.c @@ -0,0 +1,96 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2002-2010,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2002 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_erasewchar.c,v 1.5 2021/05/22 23:51:14 tom Exp $") + +/* + * erasewchar() + * + * Return erase character as given in cur_term->Ottyb. + */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(erasewchar) (NCURSES_SP_DCLx wchar_t *wch); +NCURSES_EXPORT(int) +NCURSES_SP_NAME(erasewchar) (NCURSES_SP_DCLx wchar_t *wch) +{ + int value; + int result = ERR; + + T((T_CALLED("erasewchar()"))); + if ((value = NCURSES_SP_NAME(erasechar) (NCURSES_SP_ARG)) != ERR) { + *wch = (wchar_t) value; + result = OK; + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +erasewchar(wchar_t *wch) +{ + return NCURSES_SP_NAME(erasewchar) (CURRENT_SCREEN, wch); +} +#endif + +/* + * killwchar() + * + * Return kill character as given in cur_term->Ottyb. + */ + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(killwchar) (NCURSES_SP_DCLx wchar_t *wch); +NCURSES_EXPORT(int) +NCURSES_SP_NAME(killwchar) (NCURSES_SP_DCLx wchar_t *wch) +{ + int value; + int result = ERR; + + T((T_CALLED("killwchar()"))); + if ((value = NCURSES_SP_NAME(killchar) (NCURSES_SP_ARG)) != ERR) { + *wch = (wchar_t) value; + result = OK; + } + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +killwchar(wchar_t *wch) +{ + return NCURSES_SP_NAME(killwchar) (CURRENT_SCREEN, wch); +} +#endif diff --git a/contrib/ncurses/ncurses/widechar/lib_get_wch.c b/contrib/ncurses/ncurses/widechar/lib_get_wch.c new file mode 100644 index 00000000..9f10d3bc --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_get_wch.c @@ -0,0 +1,121 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2002-2011,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2002-on * + ****************************************************************************/ + +/* +** lib_get_wch.c +** +** The routine get_wch(). +** +*/ + +#include +#include + +MODULE_ID("$Id: lib_get_wch.c,v 1.26 2021/04/17 16:12:54 tom Exp $") + +NCURSES_EXPORT(int) +wget_wch(WINDOW *win, wint_t *result) +{ + SCREEN *sp; + int code; + int value = 0; +#ifndef state_unused + mbstate_t state; +#endif + + T((T_CALLED("wget_wch(%p)"), (void *) win)); + + /* + * We can get a stream of single-byte characters and KEY_xxx codes from + * _nc_wgetch(), while we want to return a wide character or KEY_xxx code. + */ + _nc_lock_global(curses); + sp = _nc_screen_of(win); + + if (sp != 0) { + size_t count = 0; + + for (;;) { + char buffer[(MB_LEN_MAX * 9) + 1]; /* allow some redundant shifts */ + + T(("reading %d of %d", (int) count + 1, (int) sizeof(buffer))); + code = _nc_wgetch(win, &value, TRUE EVENTLIST_2nd((_nc_eventlist + *) 0)); + if (code == ERR) { + break; + } else if (code == KEY_CODE_YES) { + /* + * If we were processing an incomplete multibyte character, + * return an error since we have a KEY_xxx code which + * interrupts it. For some cases, we could improve this by + * writing a new version of lib_getch.c(!), but it is not clear + * whether the improvement would be worth the effort. + */ + if (count != 0) { + safe_ungetch(SP_PARM, value); + code = ERR; + } + break; + } else if (count + 1 >= sizeof(buffer)) { + safe_ungetch(SP_PARM, value); + code = ERR; + break; + } else { + int status; + + buffer[count++] = (char) UChar(value); + reset_mbytes(state); + status = count_mbytes(buffer, count, state); + if (status >= 0) { + wchar_t wch; + reset_mbytes(state); + if (check_mbytes(wch, buffer, count, state) != status) { + code = ERR; /* the two calls should match */ + safe_ungetch(SP_PARM, value); + } + value = wch; + break; + } + } + } + } else { + code = ERR; + } + + if (result != 0) + *result = (wint_t) value; + + _nc_unlock_global(curses); + T(("result %#o", value)); + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_get_wstr.c b/contrib/ncurses/ncurses/widechar/lib_get_wstr.c new file mode 100644 index 00000000..4aa9a0c4 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_get_wstr.c @@ -0,0 +1,227 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2002-2009,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* +** lib_get_wstr.c +** +** The routine wgetn_wstr(). +** +*/ + +#include + +MODULE_ID("$Id: lib_get_wstr.c,v 1.22 2024/07/27 19:22:23 tom Exp $") + +static int +wadd_wint(WINDOW *win, const wint_t *src) +{ + cchar_t tmp; + wchar_t wch[2]; + + wch[0] = (wchar_t) (*src); + wch[1] = 0; + setcchar(&tmp, wch, A_NORMAL, (short) 0, NULL); + return wadd_wch(win, &tmp); +} + +/* + * This wipes out the last character, no matter whether it was a tab, control + * or other character, and handles reverse wraparound. + */ +static wint_t * +WipeOut(WINDOW *win, int y, int x, const wint_t *first, wint_t *last, int echoed) +{ + if (last > first) { + *--last = '\0'; + if (echoed) { + int y1 = win->_cury; + int x1 = win->_curx; + int n; + + wmove(win, y, x); + for (n = 0; first[n] != 0; ++n) { + wadd_wint(win, first + n); + } + getyx(win, y, x); + while (win->_cury < y1 + || (win->_cury == y1 && win->_curx < x1)) + waddch(win, (chtype) ' '); + + wmove(win, y, x); + } + } + return last; +} + +NCURSES_EXPORT(int) +wgetn_wstr(WINDOW *win, wint_t *str, int maxlen) +{ + SCREEN *sp = _nc_screen_of(win); + TTY buf; + TTY_FLAGS save_flags; + wchar_t erasec = 0; + wchar_t killc = 0; + wint_t *oldstr = str; + wint_t *tmpstr = str; + wint_t ch; + int y, x, code; + + T((T_CALLED("wgetn_wstr(%p,%p, %d)"), (void *) win, (void *) str, maxlen)); + + if (!win) + returnCode(ERR); + + maxlen = _nc_getstr_limit(maxlen); + + _nc_get_tty_mode(&buf); + + save_flags = sp->_tty_flags; + NCURSES_SP_NAME(nl) (NCURSES_SP_ARG); + NCURSES_SP_NAME(noecho) (NCURSES_SP_ARG); + if (!save_flags._raw) + NCURSES_SP_NAME(cbreak) (NCURSES_SP_ARG); + + NCURSES_SP_NAME(erasewchar) (NCURSES_SP_ARGx &erasec); + NCURSES_SP_NAME(killwchar) (NCURSES_SP_ARGx &killc); + + getyx(win, y, x); + + if (is_wintouched(win) || (win->_flags & _HASMOVED)) + wrefresh(win); + + while ((code = wget_wch(win, &ch)) != ERR) { + /* + * Map special characters into key-codes. + */ + if (ch == '\r') + ch = '\n'; + if (ch == '\n') { + code = KEY_CODE_YES; + ch = KEY_ENTER; + } + if (ch != 0 && ch < KEY_MIN) { + if (ch == (wint_t) erasec) { + ch = KEY_BACKSPACE; + code = KEY_CODE_YES; + } + if (ch == (wint_t) killc) { + ch = KEY_EOL; + code = KEY_CODE_YES; + } + } + if (code == KEY_CODE_YES) { + /* + * Some terminals (the Wyse-50 is the most common) generate a \n + * from the down-arrow key. With this logic, it is the user's + * choice whether to set kcud=\n for wget_wch(); terminating + * *getn_wstr() with \n should work either way. + */ + if (ch == KEY_DOWN || ch == KEY_ENTER) { + if (save_flags._echo == TRUE + && win->_cury == win->_maxy + && win->_scroll) + wechochar(win, (chtype) '\n'); + break; + } + if (ch == KEY_LEFT || ch == KEY_BACKSPACE) { + if (tmpstr > oldstr) { + tmpstr = WipeOut(win, y, x, oldstr, tmpstr, save_flags._echo); + } + } else if (ch == KEY_EOL) { + while (tmpstr > oldstr) { + tmpstr = WipeOut(win, y, x, oldstr, tmpstr, save_flags._echo); + } + } else { + beep(); + } + } else if (tmpstr - oldstr >= maxlen) { + beep(); + } else { + *tmpstr++ = ch; + *tmpstr = 0; + if (save_flags._echo == TRUE) { + int oldy = win->_cury; + + if (wadd_wint(win, tmpstr - 1) == ERR) { + /* + * We can't really use the lower-right corner for input, + * since it'll mess up bookkeeping for erases. + */ + win->_flags &= ~_WRAPPED; + waddch(win, (chtype) ' '); + tmpstr = WipeOut(win, y, x, oldstr, tmpstr, save_flags._echo); + continue; + } else if (IS_WRAPPED(win)) { + /* + * If the last waddch forced a wrap & scroll, adjust our + * reference point for erasures. + */ + if (win->_scroll + && oldy == win->_maxy + && win->_cury == win->_maxy) { + if (--y <= 0) { + y = 0; + } + } + win->_flags &= ~_WRAPPED; + } + wrefresh(win); + } + } + } + + win->_curx = 0; + win->_flags &= ~_WRAPPED; + if (win->_cury < win->_maxy) + win->_cury++; + wrefresh(win); + + /* Restore with a single I/O call, to fix minor asymmetry between + * raw/noraw, etc. + */ + sp->_tty_flags = save_flags; + (void) _nc_set_tty_mode(&buf); + + *tmpstr = 0; + if (code == ERR) { + if (tmpstr == oldstr) { + *tmpstr++ = WEOF; + *tmpstr = 0; + } + returnCode(ERR); + } + + T(("wgetn_wstr returns %s", _nc_viswibuf(oldstr))); + + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_hline_set.c b/contrib/ncurses/ncurses/widechar/lib_hline_set.c new file mode 100644 index 00000000..8d5e0263 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_hline_set.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2002-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey 2002 * + ****************************************************************************/ + +/* +** lib_hline_set.c +** +** The routine whline_set(). +** +*/ + +#include + +MODULE_ID("$Id: lib_hline_set.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +whline_set(WINDOW *win, const cchar_t *ch, int n) +{ + int code = ERR; + + T((T_CALLED("whline_set(%p,%s,%d)"), (void *) win, _tracecchar_t(ch), n)); + + if (win) { + struct ldat *line = &(win->_line[win->_cury]); + NCURSES_CH_T wch; + int start = win->_curx; + int end = start + n - 1; + + if (end > win->_maxx) + end = win->_maxx; + + CHANGED_RANGE(line, start, end); + + if (ch == 0) + wch = *WACS_HLINE; + else + wch = *ch; + wch = _nc_render(win, wch); + + while (end >= start) { + line->text[end] = wch; + end--; + } + + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_in_wch.c b/contrib/ncurses/ncurses/widechar/lib_in_wch.c new file mode 100644 index 00000000..1d273322 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_in_wch.c @@ -0,0 +1,65 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2002-2009,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey * + ****************************************************************************/ + +/* +** lib_in_wch.c +** +** The routine win_wch(). +** +*/ + +#include + +MODULE_ID("$Id: lib_in_wch.c,v 1.7 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +win_wch(WINDOW *win, cchar_t *wcval) +{ + int code = OK; + + TR(TRACE_CCALLS, (T_CALLED("win_wch(%p,%p)"), (void *) win, (void *) wcval)); + + if (win != 0 + && wcval != 0) { + int row, col; + + getyx(win, row, col); + + *wcval = win->_line[row].text[col]; + TR(TRACE_CCALLS, ("data %s", _tracecchar_t(wcval))); + } else { + code = ERR; + } + TR(TRACE_CCALLS, (T_RETURN("%d"), code)); + return (code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_in_wchnstr.c b/contrib/ncurses/ncurses/widechar/lib_in_wchnstr.c new file mode 100644 index 00000000..fd453b65 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_in_wchnstr.c @@ -0,0 +1,77 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 2002-2007,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey * + ****************************************************************************/ + +/* +** lib_in_wchnstr.c +** +** The routine win_wchnstr(). +** +*/ + +#include + +MODULE_ID("$Id: lib_in_wchnstr.c,v 1.10 2024/07/27 19:23:21 tom Exp $") + +NCURSES_EXPORT(int) +win_wchnstr(WINDOW *win, cchar_t *wchstr, int n) +{ + int code = OK; + + T((T_CALLED("win_wchnstr(%p,%p,%d)"), (void *) win, (void *) wchstr, n)); + if (win != 0 + && wchstr != 0) { + const NCURSES_CH_T *src; + int row, col; + int j, k, limit; + + getyx(win, row, col); + limit = getmaxx(win) - col; + src = &(win->_line[row].text[col]); + + if (n < 0) { + n = limit; + } else if (n > limit) { + n = limit; + } + for (j = k = 0; j < n; ++j) { + if (j == 0 || !WidecExt(src[j]) || isWidecBase(src[j])) { + wchstr[k++] = src[j]; + } + } + memset(&(wchstr[k]), 0, sizeof(*wchstr)); + T(("result = %s", _nc_viscbuf(wchstr, n))); + } else { + code = ERR; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_ins_wch.c b/contrib/ncurses/ncurses/widechar/lib_ins_wch.c new file mode 100644 index 00000000..8d489991 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_ins_wch.c @@ -0,0 +1,153 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2002-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey 2002 * + ****************************************************************************/ + +/* +** lib_ins_wch.c +** +** The routine wins_wch(). +** +*/ + +#include + +MODULE_ID("$Id: lib_ins_wch.c,v 1.30 2024/07/27 19:22:23 tom Exp $") + +/* + * Insert the given character, updating the current location to simplify + * inserting a string. + */ +NCURSES_EXPORT(int) +_nc_insert_wch(WINDOW *win, const cchar_t *wch) +{ + int cells = _nc_wacs_width(CharOf(CHDEREF(wch))); + int code = OK; + + if (cells < 0) { + code = winsch(win, (chtype) CharOf(CHDEREF(wch))); + } else { + if (cells == 0) + cells = 1; + + if (win->_curx <= win->_maxx) { + int cell; + struct ldat *line = &(win->_line[win->_cury]); + NCURSES_CH_T *end = &(line->text[win->_curx]); + NCURSES_CH_T *temp1 = &(line->text[win->_maxx]); + const NCURSES_CH_T *temp2 = temp1 - cells; + + CHANGED_TO_EOL(line, win->_curx, win->_maxx); + while (temp1 > end) + *temp1-- = *temp2--; + + *temp1 = _nc_render(win, *wch); + for (cell = 1; cell < cells; ++cell) { + SetWidecExt(temp1[cell], cell); + } + + win->_curx = (NCURSES_SIZE_T) (win->_curx + cells); + } + } + return code; +} + +NCURSES_EXPORT(int) +wins_wch(WINDOW *win, const cchar_t *wch) +{ + int code = ERR; + + T((T_CALLED("wins_wch(%p, %s)"), (void *) win, _tracecchar_t(wch))); + + if (win != 0) { + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; + + code = _nc_insert_wch(win, wch); + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + } + returnCode(code); +} + +NCURSES_EXPORT(int) +wins_nwstr(WINDOW *win, const wchar_t *wstr, int n) +{ + int code = ERR; + + T((T_CALLED("wins_nwstr(%p,%s,%d)"), + (void *) win, _nc_viswbufn(wstr, n), n)); + + if (win != 0 + && wstr != 0 + && n != 0) { + + if (n < 0) { + n = INT_MAX; + } + code = OK; + + if (n > 0) { + const wchar_t *cp; + SCREEN *sp = _nc_screen_of(win); + NCURSES_SIZE_T oy = win->_cury; + NCURSES_SIZE_T ox = win->_curx; + + for (cp = wstr; ((cp - wstr) < n) && (*cp != L'\0'); cp++) { + int len = _nc_wacs_width(*cp); + + if ((len >= 0 && len != 1) || !is7bits(*cp)) { + cchar_t tmp_cchar; + wchar_t tmp_wchar = *cp; + memset(&tmp_cchar, 0, sizeof(tmp_cchar)); + (void) setcchar(&tmp_cchar, + &tmp_wchar, + WA_NORMAL, + (short) 0, + (void *) 0); + code = _nc_insert_wch(win, &tmp_cchar); + } else { + /* tabs, other ASCII stuff */ + code = _nc_insert_ch(sp, win, (chtype) (*cp)); + } + if (code != OK) + break; + } + + win->_curx = ox; + win->_cury = oy; + _nc_synchook(win); + } + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_inwstr.c b/contrib/ncurses/ncurses/widechar/lib_inwstr.c new file mode 100644 index 00000000..77feece8 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_inwstr.c @@ -0,0 +1,107 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 2002-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey * + ****************************************************************************/ + +/* +** lib_inwstr.c +** +** The routines winnwstr() and winwstr(). +** +*/ + +#include + +MODULE_ID("$Id: lib_inwstr.c,v 1.11 2024/07/27 19:02:27 tom Exp $") + +NCURSES_EXPORT(int) +winnwstr(WINDOW *win, wchar_t *wstr, int n) +{ + int count = 0; + const cchar_t *text; + + T((T_CALLED("winnwstr(%p,%p,%d)"), (void *) win, (void *) wstr, n)); + if (wstr != 0) { + if (win) { + int row, col; + int last = 0; + bool done = FALSE; + + getyx(win, row, col); + + text = win->_line[row].text; + while (count < n && !done && count != ERR) { + + if (!isWidecExt(text[col])) { + int inx; + wchar_t wch; + + for (inx = 0; (inx < CCHARW_MAX) + && ((wch = text[col].chars[inx]) != 0); + ++inx) { + if (count + 1 > n) { + done = TRUE; + if (last == 0) { + count = ERR; /* error if we store nothing */ + } else { + count = last; /* only store complete chars */ + } + break; + } + wstr[count++] = wch; + } + } + last = count; + if (++col > win->_maxx) { + break; + } + } + } + if (count > 0) { + wstr[count] = '\0'; + T(("winnwstr returns %s", _nc_viswbuf(wstr))); + } + } + returnCode(count); +} + +NCURSES_EXPORT(int) +winwstr(WINDOW *win, wchar_t *wstr) +{ + int result = ERR; + + T((T_CALLED("winwstr(%p,%p)"), (void *) win, (void *) wstr)); + if (win != 0) { + result = winnwstr(win, wstr, + CCHARW_MAX * (win->_maxx - win->_curx + 1)); + } + returnCode(result); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_key_name.c b/contrib/ncurses/ncurses/widechar/lib_key_name.c new file mode 100644 index 00000000..c85909fe --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_key_name.c @@ -0,0 +1,67 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 2007-2008,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* +** lib_key_name.c +** +** The routine key_name(). +** +*/ + +#include + +MODULE_ID("$Id: lib_key_name.c,v 1.7 2024/07/27 19:23:59 tom Exp $") + +#define MyData _nc_globals.key_name + +NCURSES_EXPORT(NCURSES_CONST char *) +key_name(wchar_t c) +{ + cchar_t my_cchar; + const wchar_t *my_wchars; + size_t len; + NCURSES_CONST char *result = NULL; + + memset(&my_cchar, 0, sizeof(my_cchar)); + my_cchar.chars[0] = c; + my_cchar.chars[1] = L'\0'; + + my_wchars = wunctrl(&my_cchar); + /* + * wunctrl() could return a wide character rather than just a "printable" + * representation. Check for that and return a corresponding multibyte + * character string. + */ + len = wcstombs(MyData, my_wchars, sizeof(MyData) - 1); + if (!isEILSEQ(len) && (len != 0) && (len <= MB_LEN_MAX)) { + MyData[len] = '\0'; + result = MyData; + } + return result; +} diff --git a/contrib/ncurses/ncurses/widechar/lib_pecho_wchar.c b/contrib/ncurses/ncurses/widechar/lib_pecho_wchar.c new file mode 100644 index 00000000..502967fd --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_pecho_wchar.c @@ -0,0 +1,58 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2004,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_pecho_wchar.c,v 1.4 2021/10/23 17:07:56 tom Exp $") + +NCURSES_EXPORT(int) +pecho_wchar(WINDOW *pad, const cchar_t *wch) +{ + T((T_CALLED("pecho_wchar(%p, %s)"), (void *) pad, _tracech_t(wch))); + + if (pad == 0) + returnCode(ERR); + + if (!IS_PAD(pad)) + returnCode(wecho_wchar(pad, wch)); + + wadd_wch(pad, wch); + prefresh(pad, pad->_pad._pad_y, + pad->_pad._pad_x, + pad->_pad._pad_top, + pad->_pad._pad_left, + pad->_pad._pad_bottom, + pad->_pad._pad_right); + + returnCode(OK); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_slk_wset.c b/contrib/ncurses/ncurses/widechar/lib_slk_wset.c new file mode 100644 index 00000000..5aa75ff9 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_slk_wset.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2003-2011,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * lib_slk_wset.c + * Set soft label text. + */ +#include + +#if HAVE_WCTYPE_H +#include +#endif + +MODULE_ID("$Id: lib_slk_wset.c,v 1.15 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +slk_wset(int i, const wchar_t *astr, int format) +{ + int result = ERR; + const wchar_t *str; + mbstate_t state; + + T((T_CALLED("slk_wset(%d, %s, %d)"), i, _nc_viswbuf(astr), format)); + + if (astr != 0) { + size_t arglen; + + init_mb(state); + str = astr; + + if ((arglen = wcsrtombs(NULL, &str, (size_t) 0, &state)) != (size_t) -1) { + char *mystr; + + if ((mystr = (char *) _nc_doalloc(0, arglen + 1)) != 0) { + str = astr; + if (wcsrtombs(mystr, &str, arglen, &state) != (size_t) -1) { + /* glibc documentation claims that the terminating L'\0' + * is written, but it is not... + */ + mystr[arglen] = 0; + result = slk_set(i, mystr, format); + } + free(mystr); + } + } + } + returnCode(result); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_unget_wch.c b/contrib/ncurses/ncurses/widechar/lib_unget_wch.c new file mode 100644 index 00000000..1a81fecc --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_unget_wch.c @@ -0,0 +1,115 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2002-2011,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2002 * + ****************************************************************************/ + +/* +** lib_unget_wch.c +** +** The routine unget_wch(). +** +*/ + +#include + +MODULE_ID("$Id: lib_unget_wch.c,v 1.18 2023/06/03 12:50:52 tom Exp $") + +/* + * Wrapper for wcrtomb() which obtains the length needed for the given + * wide-character 'source'. + */ +NCURSES_EXPORT(size_t) +_nc_wcrtomb(char *target, wchar_t source, mbstate_t * state) +{ + int result; + + if (target == 0) { + wchar_t temp[2]; + const wchar_t *tempp = temp; + temp[0] = source; + temp[1] = 0; + result = (int) wcsrtombs(NULL, &tempp, (size_t) 0, state); + } else { + result = (int) wcrtomb(target, source, state); + } + if (!isEILSEQ(result) && ((result == 0) || (result > MB_LEN_MAX))) + result = 1; + return (size_t) result; +} + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(unget_wch) (NCURSES_SP_DCLx const wchar_t wch) +{ + int result = OK; + mbstate_t state; + size_t length; + + T((T_CALLED("unget_wch(%p, %#lx)"), (void *) SP_PARM, (unsigned long) wch)); + + init_mb(state); + length = _nc_wcrtomb(0, wch, &state); + + if (length != (size_t) (-1) + && length != 0) { + char *string; + + if ((string = (char *) malloc(length)) != 0) { + int n; + + init_mb(state); + /* ignore the result, since we already validated the character */ + IGNORE_RC((int) wcrtomb(string, wch, &state)); + + for (n = (int) (length - 1); n >= 0; --n) { + if (NCURSES_SP_NAME(ungetch) (NCURSES_SP_ARGx + UChar(string[n])) !=OK) { + result = ERR; + break; + } + } + free(string); + } else { + result = ERR; + } + } else { + result = ERR; + } + + returnCode(result); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +unget_wch(const wchar_t wch) +{ + return NCURSES_SP_NAME(unget_wch) (CURRENT_SCREEN, wch); +} +#endif diff --git a/contrib/ncurses/ncurses/widechar/lib_vid_attr.c b/contrib/ncurses/ncurses/widechar/lib_vid_attr.c new file mode 100644 index 00000000..f108b307 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_vid_attr.c @@ -0,0 +1,369 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * Copyright 2002-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include + +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_vid_attr.c,v 1.31 2023/04/28 20:59:34 tom Exp $") + +#define doPut(mode) \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc) + +#define TurnOn(mask, mode) \ + if ((turn_on & mask) && mode) { \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \ + } + +#define TurnOff(mask, mode) \ + if ((turn_off & mask) && mode) { \ + TPUTS_TRACE(#mode); \ + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx mode, 1, outc); \ + turn_off &= ~mask; \ + } + + /* if there is no current screen, assume we *can* do color */ +#define SetColorsIf(why, old_attr, old_pair) \ + if (can_color && (why)) { \ + TR(TRACE_ATTRS, ("old pair = %d -- new pair = %d", old_pair, color_pair)); \ + if ((color_pair != old_pair) \ + || (fix_pair0 && (color_pair == 0)) \ + || (reverse ^ ((old_attr & A_REVERSE) != 0))) { \ + NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_ARGx \ + old_pair, color_pair, \ + reverse, outc); \ + } \ + } + +#define set_color(mode, pair) \ + mode &= ALL_BUT_COLOR; \ + mode |= (attr_t) ColorPair(pair) + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(vid_puts) (NCURSES_SP_DCLx + attr_t newmode, + NCURSES_PAIRS_T pair_arg, + void *opts OPTIONAL_PAIR, + NCURSES_SP_OUTC outc) +{ + int color_pair = pair_arg; +#if NCURSES_EXT_COLORS + static attr_t previous_attr = A_NORMAL; + static int previous_pair = 0; + + attr_t turn_on, turn_off; + bool reverse = FALSE; + bool can_color = (SP_PARM == 0 || SP_PARM->_coloron); +#if NCURSES_EXT_FUNCS + bool fix_pair0 = (SP_PARM != 0 && SP_PARM->_coloron && !SP_PARM->_default_color); +#else +#define fix_pair0 FALSE +#endif + + if (!IsValidTIScreen(SP_PARM)) + returnCode(ERR); + + newmode &= A_ATTRIBUTES; + set_extended_pair(opts, color_pair); + T((T_CALLED("vid_puts(%s,%d)"), _traceattr(newmode), color_pair)); + + /* this allows us to go on whether or not newterm() has been called */ + if (SP_PARM) { + previous_attr = AttrOf(SCREEN_ATTRS(SP_PARM)); + previous_pair = GetPair(SCREEN_ATTRS(SP_PARM)); + } + + TR(TRACE_ATTRS, ("previous attribute was %s, %d", + _traceattr(previous_attr), previous_pair)); + +#if !USE_XMC_SUPPORT + if ((SP_PARM != 0) + && (magic_cookie_glitch > 0)) + newmode &= ~(SP_PARM->_xmc_suppress); +#endif + + /* + * If we have a terminal that cannot combine color with video + * attributes, use the colors in preference. + */ + if ((color_pair != 0 + || fix_pair0) + && (no_color_video > 0)) { + /* + * If we had chosen the A_xxx definitions to correspond to the + * no_color_video mask, we could simply shift it up and mask off the + * attributes. But we did not (actually copied Solaris' definitions). + * However, this is still simpler/faster than a lookup table. + * + * The 63 corresponds to A_STANDOUT, A_UNDERLINE, A_REVERSE, A_BLINK, + * A_DIM, A_BOLD which are 1:1 with no_color_video. The bits that + * correspond to A_INVIS, A_PROTECT (192) must be shifted up 1 and + * A_ALTCHARSET (256) down 2 to line up. We use the NCURSES_BITS + * macro so this will work properly for the wide-character layout. + */ + unsigned value = (unsigned) no_color_video; + attr_t mask = NCURSES_BITS((value & 63) + | ((value & 192) << 1) + | ((value & 256) >> 2), 8); + + if ((mask & A_REVERSE) != 0 + && (newmode & A_REVERSE) != 0) { + reverse = TRUE; + mask &= ~A_REVERSE; + } + newmode &= ~mask; + } + + if (newmode == previous_attr + && color_pair == previous_pair) + returnCode(OK); + + if (reverse) { + newmode &= ~A_REVERSE; + } + + turn_off = (~newmode & previous_attr) & ALL_BUT_COLOR; + turn_on = (newmode & ~(previous_attr & TPARM_ATTR)) & ALL_BUT_COLOR; + + SetColorsIf(((color_pair == 0) && !fix_pair0), previous_attr, previous_pair); + + if (newmode == A_NORMAL) { + if ((previous_attr & A_ALTCHARSET) && exit_alt_charset_mode) { + doPut(exit_alt_charset_mode); + previous_attr &= ~A_ALTCHARSET; + } + if (previous_attr) { + if (exit_attribute_mode) { + doPut(exit_attribute_mode); + } else { + if (!SP_PARM || SP_PARM->_use_rmul) { + TurnOff(A_UNDERLINE, exit_underline_mode); + } + if (!SP_PARM || SP_PARM->_use_rmso) { + TurnOff(A_STANDOUT, exit_standout_mode); + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + TurnOff(A_ITALIC, exit_italics_mode); + } +#endif + (void) turn_off; + } + previous_attr &= ALL_BUT_COLOR; + previous_pair = 0; + } + + SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair); + } else if (set_attributes) { + if (turn_on || turn_off) { + TPUTS_TRACE("set_attributes"); + NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx + TIPARM_9(set_attributes, + (newmode & A_STANDOUT) != 0, + (newmode & A_UNDERLINE) != 0, + (newmode & A_REVERSE) != 0, + (newmode & A_BLINK) != 0, + (newmode & A_DIM) != 0, + (newmode & A_BOLD) != 0, + (newmode & A_INVIS) != 0, + (newmode & A_PROTECT) != 0, + (newmode & A_ALTCHARSET) != 0), + 1, outc); + previous_attr &= ALL_BUT_COLOR; + previous_pair = 0; + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + if (turn_on & A_ITALIC) { + TurnOn(A_ITALIC, enter_italics_mode); + } else if (turn_off & A_ITALIC) { + TurnOff(A_ITALIC, exit_italics_mode); + } + (void) turn_off; + } +#endif + SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair); + } else { + + TR(TRACE_ATTRS, ("turning %s off", _traceattr(turn_off))); + + TurnOff(A_ALTCHARSET, exit_alt_charset_mode); + + if (!SP_PARM || SP_PARM->_use_rmul) { + TurnOff(A_UNDERLINE, exit_underline_mode); + } + + if (!SP_PARM || SP_PARM->_use_rmso) { + TurnOff(A_STANDOUT, exit_standout_mode); + } +#if USE_ITALIC + if (!SP_PARM || SP_PARM->_use_ritm) { + TurnOff(A_ITALIC, exit_italics_mode); + } +#endif + if (turn_off && exit_attribute_mode) { + doPut(exit_attribute_mode); + turn_on |= (newmode & ALL_BUT_COLOR); + previous_attr &= ALL_BUT_COLOR; + previous_pair = 0; + } + SetColorsIf((color_pair != 0) || fix_pair0, previous_attr, previous_pair); + + TR(TRACE_ATTRS, ("turning %s on", _traceattr(turn_on))); + /* *INDENT-OFF* */ + TurnOn(A_ALTCHARSET, enter_alt_charset_mode); + TurnOn(A_BLINK, enter_blink_mode); + TurnOn(A_BOLD, enter_bold_mode); + TurnOn(A_DIM, enter_dim_mode); + TurnOn(A_REVERSE, enter_reverse_mode); + TurnOn(A_STANDOUT, enter_standout_mode); + TurnOn(A_PROTECT, enter_protected_mode); + TurnOn(A_INVIS, enter_secure_mode); + TurnOn(A_UNDERLINE, enter_underline_mode); +#if USE_ITALIC + TurnOn(A_ITALIC, enter_italics_mode); +#endif +#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode) + TurnOn(A_HORIZONTAL, enter_horizontal_hl_mode); + TurnOn(A_LEFT, enter_left_hl_mode); + TurnOn(A_LOW, enter_low_hl_mode); + TurnOn(A_RIGHT, enter_right_hl_mode); + TurnOn(A_TOP, enter_top_hl_mode); + TurnOn(A_VERTICAL, enter_vertical_hl_mode); +#endif + /* *INDENT-ON* */ + } + + if (reverse) + newmode |= A_REVERSE; + + if (SP_PARM) { + SetAttr(SCREEN_ATTRS(SP_PARM), newmode); + SetPair(SCREEN_ATTRS(SP_PARM), color_pair); + } else { + previous_attr = newmode; + previous_pair = color_pair; + } + + returnCode(OK); +#else + T((T_CALLED("vid_puts(%s,%d)"), _traceattr(newmode), color_pair)); + (void) opts; + set_color(newmode, color_pair); + returnCode(NCURSES_SP_NAME(vidputs) (NCURSES_SP_ARGx newmode, outc)); +#endif +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +vid_puts(attr_t newmode, + NCURSES_PAIRS_T pair_arg, + void *opts GCC_UNUSED, + NCURSES_OUTC outc) +{ + SetSafeOutcWrapper(outc); + return NCURSES_SP_NAME(vid_puts) (CURRENT_SCREEN, + newmode, + pair_arg, + opts, + _nc_outc_wrapper); +} +#endif + +#undef vid_attr +NCURSES_EXPORT(int) +NCURSES_SP_NAME(vid_attr) (NCURSES_SP_DCLx + attr_t newmode, + NCURSES_PAIRS_T pair_arg, + void *opts) +{ + T((T_CALLED("vid_attr(%s,%d)"), _traceattr(newmode), (int) pair_arg)); + returnCode(NCURSES_SP_NAME(vid_puts) (NCURSES_SP_ARGx + newmode, + pair_arg, + opts, + NCURSES_SP_NAME(_nc_putchar))); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +vid_attr(attr_t newmode, NCURSES_PAIRS_T pair_arg, void *opts) +{ + return NCURSES_SP_NAME(vid_attr) (CURRENT_SCREEN, newmode, pair_arg, opts); +} +#endif + +/* + * This implementation uses the same mask values for A_xxx and WA_xxx, so + * we can use termattrs() for part of the logic. + */ +NCURSES_EXPORT(attr_t) +NCURSES_SP_NAME(term_attrs) (NCURSES_SP_DCL0) +{ + attr_t attrs = 0; + + T((T_CALLED("term_attrs()"))); + if (SP_PARM) { + attrs = NCURSES_SP_NAME(termattrs) (NCURSES_SP_ARG); + +#if USE_WIDEC_SUPPORT && defined(enter_horizontal_hl_mode) + /* these are only supported for wide-character mode */ + if (enter_horizontal_hl_mode) + attrs |= WA_HORIZONTAL; + if (enter_left_hl_mode) + attrs |= WA_LEFT; + if (enter_low_hl_mode) + attrs |= WA_LOW; + if (enter_right_hl_mode) + attrs |= WA_RIGHT; + if (enter_top_hl_mode) + attrs |= WA_TOP; + if (enter_vertical_hl_mode) + attrs |= WA_VERTICAL; +#endif + } + + returnAttr(attrs); +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(attr_t) +term_attrs(void) +{ + return NCURSES_SP_NAME(term_attrs) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/ncurses/widechar/lib_vline_set.c b/contrib/ncurses/ncurses/widechar/lib_vline_set.c new file mode 100644 index 00000000..f7bb5819 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_vline_set.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2002-2010,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey 2002 * + ****************************************************************************/ + +/* +** lib_vline_set.c +** +** The routine wvline_set(). +** +*/ + +#include + +MODULE_ID("$Id: lib_vline_set.c,v 1.6 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT(int) +wvline_set(WINDOW *win, const cchar_t *ch, int n) +{ + int code = ERR; + + T((T_CALLED("wvline(%p,%s,%d)"), (void *) win, _tracecchar_t(ch), n)); + + if (win) { + NCURSES_CH_T wch; + int row = win->_cury; + int col = win->_curx; + int end = row + n - 1; + + if (end > win->_maxy) + end = win->_maxy; + + if (ch == 0) + wch = *WACS_VLINE; + else + wch = *ch; + wch = _nc_render(win, wch); + + while (end >= row) { + struct ldat *line = &(win->_line[end]); + line->text[col] = wch; + CHANGED_CELL(line, col); + end--; + } + + _nc_synchook(win); + code = OK; + } + returnCode(code); +} diff --git a/contrib/ncurses/ncurses/widechar/lib_wacs.c b/contrib/ncurses/ncurses/widechar/lib_wacs.c new file mode 100644 index 00000000..5b6f6da2 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_wacs.c @@ -0,0 +1,148 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2002-2015,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas Dickey 2002 * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: lib_wacs.c,v 1.20 2020/02/02 23:34:34 tom Exp $") + +NCURSES_EXPORT_VAR(cchar_t) * _nc_wacs = 0; + +NCURSES_EXPORT(void) +_nc_init_wacs(void) +{ + /* *INDENT-OFF* */ + static const struct { + unsigned map; + int value[2]; + } table[] = { + /* VT100 symbols */ + { 'l', { '+', 0x250c }}, /* upper left corner */ + { 'm', { '+', 0x2514 }}, /* lower left corner */ + { 'k', { '+', 0x2510 }}, /* upper right corner */ + { 'j', { '+', 0x2518 }}, /* lower right corner */ + { 't', { '+', 0x251c }}, /* tee pointing left */ + { 'u', { '+', 0x2524 }}, /* tee pointing right */ + { 'v', { '+', 0x2534 }}, /* tee pointing up */ + { 'w', { '+', 0x252c }}, /* tee pointing down */ + { 'q', { '-', 0x2500 }}, /* horizontal line */ + { 'x', { '|', 0x2502 }}, /* vertical line */ + { 'n', { '+', 0x253c }}, /* large plus or crossover */ + { 'o', { '~', 0x23ba }}, /* scan line 1 */ + { 's', { '_', 0x23bd }}, /* scan line 9 */ + { '`', { '+', 0x25c6 }}, /* diamond */ + { 'a', { ':', 0x2592 }}, /* checker board (stipple) */ + { 'f', { '\'', 0x00b0 }}, /* degree symbol */ + { 'g', { '#', 0x00b1 }}, /* plus/minus */ + { '~', { 'o', 0x00b7 }}, /* bullet */ + /* Teletype 5410v1 symbols */ + { ',', { '<', 0x2190 }}, /* arrow pointing left */ + { '+', { '>', 0x2192 }}, /* arrow pointing right */ + { '.', { 'v', 0x2193 }}, /* arrow pointing down */ + { '-', { '^', 0x2191 }}, /* arrow pointing up */ + { 'h', { '#', 0x2592 }}, /* board of squares */ + { 'i', { '#', 0x2603 }}, /* lantern symbol */ + { '0', { '#', 0x25ae }}, /* solid square block */ + /* these defaults were invented for ncurses */ + { 'p', { '-', 0x23bb }}, /* scan line 3 */ + { 'r', { '-', 0x23bc }}, /* scan line 7 */ + { 'y', { '<', 0x2264 }}, /* less-than-or-equal-to */ + { 'z', { '>', 0x2265 }}, /* greater-than-or-equal-to */ + { '{', { '*', 0x03c0 }}, /* greek pi */ + { '|', { '!', 0x2260 }}, /* not-equal */ + { '}', { 'f', 0x00a3 }}, /* pound-sterling symbol */ + /* thick-line-drawing */ + { 'L', { '+', 0x250f }}, /* upper left corner */ + { 'M', { '+', 0x2517 }}, /* lower left corner */ + { 'K', { '+', 0x2513 }}, /* upper right corner */ + { 'J', { '+', 0x251b }}, /* lower right corner */ + { 'T', { '+', 0x2523 }}, /* tee pointing left */ + { 'U', { '+', 0x252b }}, /* tee pointing right */ + { 'V', { '+', 0x253b }}, /* tee pointing up */ + { 'W', { '+', 0x2533 }}, /* tee pointing down */ + { 'Q', { '-', 0x2501 }}, /* horizontal line */ + { 'X', { '|', 0x2503 }}, /* vertical line */ + { 'N', { '+', 0x254b }}, /* large plus or crossover */ + /* double-line-drawing */ + { 'C', { '+', 0x2554 }}, /* upper left corner */ + { 'D', { '+', 0x255a }}, /* lower left corner */ + { 'B', { '+', 0x2557 }}, /* upper right corner */ + { 'A', { '+', 0x255d }}, /* lower right corner */ + { 'G', { '+', 0x2563 }}, /* tee pointing left */ + { 'F', { '+', 0x2560 }}, /* tee pointing right */ + { 'H', { '+', 0x2569 }}, /* tee pointing up */ + { 'I', { '+', 0x2566 }}, /* tee pointing down */ + { 'R', { '-', 0x2550 }}, /* horizontal line */ + { 'Y', { '|', 0x2551 }}, /* vertical line */ + { 'E', { '+', 0x256c }}, /* large plus or crossover */ + }; + /* *INDENT-ON* */ + + int active = _nc_unicode_locale(); + + /* + * If we're running in a UTF-8 locale, will use the Unicode equivalents + * rather than the terminfo information. Actually the terminfo should + * be the rule, but there are people who are offended by the notion that + * a Unicode-capable terminal would have something resembling a mode. + * So the smacs/rmacs may be disabled -- sometime. + */ + T(("initializing WIDE-ACS map (Unicode is%s active)", + active ? "" : " not")); + + if ((_nc_wacs = typeCalloc(cchar_t, ACS_LEN)) != 0) { + unsigned n; + + for (n = 0; n < SIZEOF(table); ++n) { + unsigned m; +#if NCURSES_WCWIDTH_GRAPHICS + int wide = wcwidth((wchar_t) table[n].value[active]); +#else + int wide = 1; +#endif + + m = table[n].map; + if (active && (wide == 1)) { + SetChar(_nc_wacs[m], table[n].value[1], A_NORMAL); + } else if (acs_map[m] & A_ALTCHARSET) { + SetChar(_nc_wacs[m], m, A_ALTCHARSET); + } else { + SetChar(_nc_wacs[m], table[n].value[0], A_NORMAL); + } + + T(("#%d, width:%d SetChar(%c, %s) = %s", + n, wide, m, + _tracechar(table[n].value[active]), + _tracecchar_t(&_nc_wacs[m]))); + } + } +} diff --git a/contrib/ncurses/ncurses/widechar/lib_wunctrl.c b/contrib/ncurses/ncurses/widechar/lib_wunctrl.c new file mode 100644 index 00000000..b1c4f1a4 --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/lib_wunctrl.c @@ -0,0 +1,72 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 2001-2011,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* +** lib_wunctrl.c +** +** The routine wunctrl(). +** +*/ + +#include + +MODULE_ID("$Id: lib_wunctrl.c,v 1.18 2024/07/27 19:23:21 tom Exp $") + +NCURSES_EXPORT(wchar_t *) +NCURSES_SP_NAME(wunctrl) (NCURSES_SP_DCLx cchar_t *wc) +{ + static wchar_t str[CCHARW_MAX + 1]; + wchar_t *result; + + if (wc == 0) { + result = 0; + } else if (SP_PARM != 0 && Charable(*wc)) { + wchar_t *wsp; + const char *p = + NCURSES_SP_NAME(unctrl) (NCURSES_SP_ARGx + (unsigned) _nc_to_char((wint_t)CharOf(*wc))); + + for (wsp = str; *p; ++p) { + *wsp++ = (wchar_t) _nc_to_widechar(*p); + } + *wsp = 0; + result = str; + } else { + result = wc->chars; + } + return result; +} + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(wchar_t *) +wunctrl(cchar_t *wc) +{ + return NCURSES_SP_NAME(wunctrl) (CURRENT_SCREEN, wc); +} +#endif diff --git a/contrib/ncurses/ncurses/widechar/widechars.c b/contrib/ncurses/ncurses/widechar/widechars.c new file mode 100644 index 00000000..0c676b1a --- /dev/null +++ b/contrib/ncurses/ncurses/widechar/widechars.c @@ -0,0 +1,153 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * Copyright 2012,2013 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +#include + +#if USE_WIDEC_SUPPORT + +MODULE_ID("$Id: widechars.c,v 1.10 2024/08/31 15:55:27 tom Exp $") + +#if defined(_NC_MINGW) +/* + * MinGW has wide-character functions, but they do not work correctly. + */ + +int +_nc_mbtowc(wchar_t *pwc, const char *s, size_t n) +{ + int result; + int count; + int try; + + if (s != 0 && n != 0) { + /* + * MultiByteToWideChar() can decide to return more than one + * wide-character. We want only one. Ignore any trailing null, both + * in the initial count and in the conversion. + */ + count = 0; + for (try = 1; try <= (int) n; ++try) { + count = MultiByteToWideChar(CP_UTF8, + MB_ERR_INVALID_CHARS, + s, + try, + pwc, + 0); + TR(TRACE_BITS, ("...try %d:%d", try, count)); + if (count > 0) { + break; + } + } + if (count < 1 || count > 2) { + result = -1; + } else { + wchar_t actual[2]; + memset(&actual, 0, sizeof(actual)); + count = MultiByteToWideChar(CP_UTF8, + MB_ERR_INVALID_CHARS, + s, + try, + actual, + 2); + TR(TRACE_BITS, ("\twin32 ->%#x, %#x", actual[0], actual[1])); + *pwc = actual[0]; + if (actual[1] != 0) + result = -1; + else + result = try; + } + } else { + result = 0; + } + + return result; +} + +int +_nc_mblen(const char *s, size_t n) +{ + int result = -1; + int count; + wchar_t temp; + + if (s != 0 && n != 0) { + count = _nc_mbtowc(&temp, s, n); + if (count == 1) { + int check = WideCharToMultiByte(CP_UTF8, + 0, + &temp, + 1, + NULL, + 0, /* compute length only */ + NULL, + NULL); + TR(TRACE_BITS, ("\tcheck ->%d\n", check)); + if (check > 0 && (size_t) check <= n) { + result = check; + } + } + } else { + result = 0; + } + + return result; +} + +int __MINGW_NOTHROW +_nc_wctomb(char *s, wchar_t wc) +{ + int result; + int check; + + check = WideCharToMultiByte(CP_UTF8, + 0, + &wc, + 1, + NULL, + 0, /* compute length only */ + NULL, + NULL); + if (check > 0) { + result = WideCharToMultiByte(CP_UTF8, + 0, + &wc, + 1, + s, + check + 1, + NULL, + NULL); + } else { + result = -1; + } + return result; +} + +#endif /* _NC_MINGW */ + +#endif /* USE_WIDEC_SUPPORT */ diff --git a/contrib/ncurses/ncurses/win32con/gettimeofday.c b/contrib/ncurses/ncurses/win32con/gettimeofday.c new file mode 100644 index 00000000..603a6f46 --- /dev/null +++ b/contrib/ncurses/ncurses/win32con/gettimeofday.c @@ -0,0 +1,57 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2008-2010,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +#ifdef WINVER +# undef WINVER +#endif +#define WINVER 0x0501 + +#include + +#include + +MODULE_ID("$Id: gettimeofday.c,v 1.7 2023/02/25 20:05:36 tom Exp $") + +#if HAVE_GETTIMEOFDAY == 2 +#define JAN1970 116444736000000000LL /* the value for 01/01/1970 00:00 */ + +NCURSES_EXPORT(int) +gettimeofday(struct timeval *tv, void *tz GCC_UNUSED) +{ + union { + FILETIME ft; + long long since1601; /* time since 1 Jan 1601 in 100ns units */ + } data; + + GetSystemTimeAsFileTime(&data.ft); + tv->tv_usec = (long) ((data.since1601 / 10LL) % 1000000LL); + tv->tv_sec = (long) ((data.since1601 - JAN1970) / 10000000LL); + return (0); +} +#endif // HAVE_GETTIMEOFDAY == 2 diff --git a/contrib/ncurses/ncurses/win32con/wcwidth.c b/contrib/ncurses/ncurses/win32con/wcwidth.c new file mode 100644 index 00000000..1a540182 --- /dev/null +++ b/contrib/ncurses/ncurses/win32con/wcwidth.c @@ -0,0 +1,52 @@ +/**************************************************************************** + * Copyright 2020,2024 Thomas E. Dickey * + * Copyright 2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +#include + +MODULE_ID("$Id: wcwidth.c,v 1.5 2024/05/04 18:31:39 tom Exp $") + +#if USE_WIDEC_SUPPORT +#define mk_wcwidth(ucs) _nc_wcwidth(ucs) +#define mk_wcswidth(pwcs, n) _nc_wcswidth(pwcs, n) +#define mk_wcwidth_cjk(ucs) _nc_wcwidth_cjk(ucs) +#define mk_wcswidth_cjk(pwcs, n) _nc_wcswidth_cjk(pwcs, n) + +NCURSES_EXPORT(void) mk_wcwidth_init(int); +NCURSES_EXPORT(int) mk_wcwidth(uint32_t); +NCURSES_EXPORT(int) mk_wcswidth(const uint32_t *, size_t); +NCURSES_EXPORT(int) mk_wcwidth_cjk(uint32_t); +NCURSES_EXPORT(int) mk_wcswidth_cjk(const uint32_t *, size_t); + +#include +#else +void _nc_empty_wcwidth(void); +void +_nc_empty_wcwidth(void) +{ +} +#endif diff --git a/contrib/ncurses/ncurses/win32con/win32_driver.c b/contrib/ncurses/ncurses/win32con/win32_driver.c new file mode 100644 index 00000000..0a43588b --- /dev/null +++ b/contrib/ncurses/ncurses/win32con/win32_driver.c @@ -0,0 +1,1225 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * Copyright 2008-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* + * TODO - improve screen-repainting performance, using implied wraparound to reduce write's + * TODO - make it optional whether screen is restored or not when non-buffered + */ + +#include +#ifdef _NC_WINDOWS +#if (defined(__MINGW32__) || defined(__MINGW64__)) +#include +#else +#include +#endif +#include + +#define CUR TerminalType(my_term). + +MODULE_ID("$Id: win32_driver.c,v 1.4 2023/09/16 16:29:24 tom Exp $") + +#define WINMAGIC NCDRV_MAGIC(NCDRV_WINCONSOLE) +#define EXP_OPTIMIZE 0 + +static bool console_initialized = FALSE; + +#define AssertTCB() assert(TCB != 0 && (TCB->magic == WINMAGIC)) +#define validateConsoleHandle() (AssertTCB() , console_initialized ||\ + (console_initialized=\ + _nc_console_checkinit(TRUE,FALSE))) +#define SetSP() assert(TCB->csp != 0); sp = TCB->csp; (void) sp +#define AdjustY() (WINCONSOLE.buffered ?\ + 0 : (int) WINCONSOLE.SBI.srWindow.Top) +#define RevAttr(attr) (WORD) (((attr) & 0xff00) | \ + ((((attr) & 0x07) << 4) | \ + (((attr) & 0x70) >> 4))) + +#if USE_WIDEC_SUPPORT +#define write_screen WriteConsoleOutputW +#define read_screen ReadConsoleOutputW +#else +#define write_screen WriteConsoleOutput +#define read_screen ReadConsoleOutput +#endif + +static WORD +MapAttr(WORD res, attr_t ch) +{ + if (ch & A_COLOR) { + int p; + + p = PairNumber(ch); + if (p > 0 && p < CON_NUMPAIRS) { + WORD a; + a = WINCONSOLE.pairs[p]; + res = (WORD) ((res & 0xff00) | a); + } + } + + if (ch & A_REVERSE) { + res = RevAttr(res); + } + + if (ch & A_STANDOUT) { + res = RevAttr(res) | BACKGROUND_INTENSITY; + } + + if (ch & A_BOLD) + res |= FOREGROUND_INTENSITY; + + if (ch & A_DIM) + res |= BACKGROUND_INTENSITY; + + return res; +} + +#if 0 /* def TRACE */ +static void +dump_screen(const char *fn, int ln) +{ + int max_cells = (WINCONSOLE.SBI.dwSize.Y * + (1 + WINCONSOLE.SBI.dwSize.X)) + 1; + char output[max_cells]; + CHAR_INFO save_screen[max_cells]; + COORD save_size; + SMALL_RECT save_region; + COORD bufferCoord; + + T(("dump_screen %s@%d", fn, ln)); + + save_region.Top = WINCONSOLE.SBI.srWindow.Top; + save_region.Left = WINCONSOLE.SBI.srWindow.Left; + save_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom; + save_region.Right = WINCONSOLE.SBI.srWindow.Right; + + save_size.X = (SHORT) (save_region.Right - save_region.Left + 1); + save_size.Y = (SHORT) (save_region.Bottom - save_region.Top + 1); + + bufferCoord.X = bufferCoord.Y = 0; + + if (read_screen(WINCONSOLE.hdl, + save_screen, + save_size, + bufferCoord, + &save_region)) { + int i, j; + int ij = 0; + int k = 0; + + for (i = save_region.Top; i <= save_region.Bottom; ++i) { + for (j = save_region.Left; j <= save_region.Right; ++j) { + output[k++] = save_screen[ij++].Char.AsciiChar; + } + output[k++] = '\n'; + } + output[k] = 0; + + T(("DUMP: %d,%d - %d,%d", + save_region.Top, + save_region.Left, + save_region.Bottom, + save_region.Right)); + T(("%s", output)); + } +} + +#else +#define dump_screen(fn,ln) /* nothing */ +#endif + +#if USE_WIDEC_SUPPORT +/* + * TODO: support surrogate pairs + * TODO: support combining characters + * TODO: support acsc + * TODO: _nc_wacs should be part of sp. + */ +static BOOL +con_write16(TERMINAL_CONTROL_BLOCK * TCB, + int y, int x, cchar_t *str, int limit) +{ + int actual = 0; + CHAR_INFO *ci = TypeAlloca(CHAR_INFO, limit); + COORD loc, siz; + SMALL_RECT rec; + int i; + cchar_t ch; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + for (i = actual = 0; i < limit; i++) { + ch = str[i]; + if (isWidecExt(ch)) + continue; + ci[actual].Char.UnicodeChar = CharOf(ch); + ci[actual].Attributes = MapAttr(WINCONSOLE.SBI.wAttributes, + AttrOf(ch)); + if (AttrOf(ch) & A_ALTCHARSET) { + if (_nc_wacs) { + int which = CharOf(ch); + if (which > 0 + && which < ACS_LEN + && CharOf(_nc_wacs[which]) != 0) { + ci[actual].Char.UnicodeChar = CharOf(_nc_wacs[which]); + } else { + ci[actual].Char.UnicodeChar = ' '; + } + } + } + ++actual; + } + + loc.X = (SHORT) 0; + loc.Y = (SHORT) 0; + siz.X = (SHORT) actual; + siz.Y = 1; + + rec.Left = (SHORT) x; + rec.Top = (SHORT) (y + AdjustY()); + rec.Right = (SHORT) (x + limit - 1); + rec.Bottom = rec.Top; + + return write_screen(WINCONSOLE.hdl, ci, siz, loc, &rec); +} +#define con_write(tcb, y, x, str, n) con_write16(tcb, y, x, str, n) +#else +static BOOL +con_write8(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n) +{ + CHAR_INFO *ci = TypeAlloca(CHAR_INFO, n); + COORD loc, siz; + SMALL_RECT rec; + int i; + chtype ch; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + for (i = 0; i < n; i++) { + ch = str[i]; + ci[i].Char.AsciiChar = ChCharOf(ch); + ci[i].Attributes = MapAttr(WINCONSOLE.SBI.wAttributes, + ChAttrOf(ch)); + if (ChAttrOf(ch) & A_ALTCHARSET) { + if (sp->_acs_map) + ci[i].Char.AsciiChar = + ChCharOf(NCURSES_SP_NAME(_nc_acs_char) (sp, ChCharOf(ch))); + } + } + + loc.X = (short) 0; + loc.Y = (short) 0; + siz.X = (short) n; + siz.Y = 1; + + rec.Left = (short) x; + rec.Top = (short) y; + rec.Right = (short) (x + n - 1); + rec.Bottom = rec.Top; + + return write_screen(WINCONSOLE.hdl, ci, siz, loc, &rec); +} +#define con_write(tcb, y, x, str, n) con_write8(tcb, y, x, str, n) +#endif + +#if EXP_OPTIMIZE +/* + * Comparing new/current screens, determine the last column-index for a change + * beginning on the given row,col position. Unlike a serial terminal, there is + * no cost for "moving" the "cursor" on the line as we update it. + */ +static int +find_end_of_change(SCREEN *sp, int row, int col) +{ + int result = col; + struct ldat *curdat = CurScreen(sp)->_line + row; + struct ldat *newdat = NewScreen(sp)->_line + row; + + while (col <= newdat->lastchar) { +#if USE_WIDEC_SUPPORT + if (isWidecExt(curdat->text[col]) || + isWidecExt(newdat->text[col])) { + result = col; + } else if (memcmp(&curdat->text[col], + &newdat->text[col], + sizeof(curdat->text[0]))) { + result = col; + } else { + break; + } +#else + if (curdat->text[col] != newdat->text[col]) { + result = col; + } else { + break; + } +#endif + ++col; + } + return result; +} + +/* + * Given a row,col position at the end of a change-chunk, look for the + * beginning of the next change-chunk. + */ +static int +find_next_change(SCREEN *sp, int row, int col) +{ + struct ldat *curdat = CurScreen(sp)->_line + row; + struct ldat *newdat = NewScreen(sp)->_line + row; + int result = newdat->lastchar + 1; + + while (++col <= newdat->lastchar) { +#if USE_WIDEC_SUPPORT + if (isWidecExt(curdat->text[col]) != + isWidecExt(newdat->text[col])) { + result = col; + break; + } else if (memcmp(&curdat->text[col], + &newdat->text[col], + sizeof(curdat->text[0]))) { + result = col; + break; + } +#else + if (curdat->text[col] != newdat->text[col]) { + result = col; + break; + } +#endif + } + return result; +} + +#define EndChange(first) \ + find_end_of_change(sp, y, first) +#define NextChange(last) \ + find_next_change(sp, y, last) + +#endif /* EXP_OPTIMIZE */ + +#define MARK_NOCHANGE(win,row) \ + win->_line[row].firstchar = _NOCHANGE; \ + win->_line[row].lastchar = _NOCHANGE + +static bool +restore_original_screen(void) +{ + COORD bufferCoord; + bool result = FALSE; + SMALL_RECT save_region = WINCONSOLE.save_region; + + T(("... restoring %s", WINCONSOLE.window_only ? + "window" : "entire buffer")); + + bufferCoord.X = (SHORT) (WINCONSOLE.window_only ? + WINCONSOLE.SBI.srWindow.Left : 0); + bufferCoord.Y = (SHORT) (WINCONSOLE.window_only ? + WINCONSOLE.SBI.srWindow.Top : 0); + + if (write_screen(WINCONSOLE.hdl, + WINCONSOLE.save_screen, + WINCONSOLE.save_size, + bufferCoord, + &save_region)) { + result = TRUE; + mvcur(-1, -1, LINES - 2, 0); + T(("... restore original screen contents ok %dx%d (%d,%d - %d,%d)", + WINCONSOLE.save_size.Y, + WINCONSOLE.save_size.X, + save_region.Top, + save_region.Left, + save_region.Bottom, + save_region.Right)); + } else { + T(("... restore original screen contents err")); + } + return result; +} + +static const char * +wcon_name(TERMINAL_CONTROL_BLOCK * TCB) +{ + (void) TCB; + return "win32console"; +} + +static int +wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB) +{ + int result = ERR; + int y, nonempty, n, x0, x1, Width, Height; + SCREEN *sp; + + T((T_CALLED("win32con::wcon_doupdate(%p)"), TCB)); + if (validateConsoleHandle()) { + SetSP(); + + Width = screen_columns(sp); + Height = screen_lines(sp); + nonempty = Min(Height, NewScreen(sp)->_maxy + 1); + + T(("... %dx%d clear cur:%d new:%d", + Height, Width, + CurScreen(sp)->_clear, + NewScreen(sp)->_clear)); + + if (SP_PARM->_endwin == ewSuspend) { + + T(("coming back from shell mode")); + NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); + + NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG); + NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); + SP_PARM->_mouse_resume(SP_PARM); + + SP_PARM->_endwin = ewRunning; + } + + if ((CurScreen(sp)->_clear || NewScreen(sp)->_clear)) { + int x; +#if USE_WIDEC_SUPPORT + cchar_t *empty = TypeAlloca(cchar_t, Width); + wchar_t blank[2] = + { + L' ', L'\0' + }; + + for (x = 0; x < Width; x++) + setcchar(&empty[x], blank, 0, 0, 0); +#else + chtype *empty = TypeAlloca(chtype, Width); + + for (x = 0; x < Width; x++) + empty[x] = ' '; +#endif + + for (y = 0; y < nonempty; y++) { + con_write(TCB, y, 0, empty, Width); + memcpy(empty, + CurScreen(sp)->_line[y].text, + (size_t) Width * sizeof(empty[0])); + } + CurScreen(sp)->_clear = FALSE; + NewScreen(sp)->_clear = FALSE; + touchwin(NewScreen(sp)); + T(("... cleared %dx%d lines @%d of screen", nonempty, Width, + AdjustY())); + } + + for (y = 0; y < nonempty; y++) { + x0 = NewScreen(sp)->_line[y].firstchar; + if (x0 != _NOCHANGE) { +#if EXP_OPTIMIZE + int x2; + int limit = NewScreen(sp)->_line[y].lastchar; + while ((x1 = EndChange(x0)) <= limit) { + while ((x2 = NextChange(x1)) <= + limit && x2 <= (x1 + 2)) { + x1 = x2; + } + n = x1 - x0 + 1; + memcpy(&CurScreen(sp)->_line[y].text[x0], + &NewScreen(sp)->_line[y].text[x0], + n * sizeof(CurScreen(sp)->_line[y].text[x0])); + con_write(TCB, + y, + x0, + &CurScreen(sp)->_line[y].text[x0], n); + x0 = NextChange(x1); + } + + /* mark line changed successfully */ + if (y <= NewScreen(sp)->_maxy) { + MARK_NOCHANGE(NewScreen(sp), y); + } + if (y <= CurScreen(sp)->_maxy) { + MARK_NOCHANGE(CurScreen(sp), y); + } +#else + x1 = NewScreen(sp)->_line[y].lastchar; + n = x1 - x0 + 1; + if (n > 0) { + memcpy(&CurScreen(sp)->_line[y].text[x0], + &NewScreen(sp)->_line[y].text[x0], + (size_t) n * + sizeof(CurScreen(sp)->_line[y].text[x0])); + con_write(TCB, + y, + x0, + &CurScreen(sp)->_line[y].text[x0], n); + + /* mark line changed successfully */ + if (y <= NewScreen(sp)->_maxy) { + MARK_NOCHANGE(NewScreen(sp), y); + } + if (y <= CurScreen(sp)->_maxy) { + MARK_NOCHANGE(CurScreen(sp), y); + } + } +#endif + } + } + + /* put everything back in sync */ + for (y = nonempty; y <= NewScreen(sp)->_maxy; y++) { + MARK_NOCHANGE(NewScreen(sp), y); + } + for (y = nonempty; y <= CurScreen(sp)->_maxy; y++) { + MARK_NOCHANGE(CurScreen(sp), y); + } + + if (!NewScreen(sp)->_leaveok) { + CurScreen(sp)->_curx = NewScreen(sp)->_curx; + CurScreen(sp)->_cury = NewScreen(sp)->_cury; + + TCB->drv->td_hwcur(TCB, + 0, + 0, + CurScreen(sp)->_cury, + CurScreen(sp)->_curx); + } + _nc_console_selectActiveHandle(); + result = OK; + } + returnCode(result); +} + +static bool +wcon_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, + const char *tname, + int *errret GCC_UNUSED) +{ + bool code = FALSE; + + T((T_CALLED("win32con::wcon_CanHandle(%p)"), TCB)); + + assert((TCB != 0) && (tname != 0)); + + TCB->magic = WINMAGIC; + + if (tname == 0 || *tname == 0) { + if (!_nc_console_vt_supported()) + code = TRUE; + } else if (tname != 0 && *tname == '#') { + /* + * Use "#" (a character which cannot begin a terminal's name) to + * select specific driver from the table. + * + * In principle, we could have more than one non-terminfo driver, + * e.g., "win32gui". + */ + size_t n = strlen(tname + 1); + if (n != 0 + && ((strncmp(tname + 1, "win32console", n) == 0) + || (strncmp(tname + 1, "win32con", n) == 0))) { + code = TRUE; + } + } else if (tname != 0 && stricmp(tname, "unknown") == 0) { + code = TRUE; + } + + /* + * This is intentional, to avoid unnecessary breakage of applications + * using symbols. + */ + if (code && (TerminalType(&TCB->term).Booleans == 0)) { + _nc_init_termtype(&TerminalType(&TCB->term)); +#if NCURSES_EXT_NUMBERS + _nc_export_termtype2(&TCB->term.type, &TerminalType(&TCB->term)); +#endif + } + + if (!code) { + if (_nc_console_test(0)) { + T(("isTermInfoConsole=TRUE")); + WINCONSOLE.isTermInfoConsole = TRUE; + } + } + returnBool(code); +} + +static int +wcon_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, + int beepFlag) +{ + SCREEN *sp; + int res = ERR; + + int high = (WINCONSOLE.SBI.srWindow.Bottom - + WINCONSOLE.SBI.srWindow.Top + 1); + int wide = (WINCONSOLE.SBI.srWindow.Right - + WINCONSOLE.SBI.srWindow.Left + 1); + int max_cells = (high * wide); + int i; + + CHAR_INFO *this_screen = TypeAlloca(CHAR_INFO, max_cells); + CHAR_INFO *that_screen = TypeAlloca(CHAR_INFO, max_cells); + COORD this_size; + SMALL_RECT this_region; + COORD bufferCoord; + + if (validateConsoleHandle()) { + SetSP(); + this_region.Top = WINCONSOLE.SBI.srWindow.Top; + this_region.Left = WINCONSOLE.SBI.srWindow.Left; + this_region.Bottom = WINCONSOLE.SBI.srWindow.Bottom; + this_region.Right = WINCONSOLE.SBI.srWindow.Right; + + this_size.X = (SHORT) wide; + this_size.Y = (SHORT) high; + + bufferCoord.X = this_region.Left; + bufferCoord.Y = this_region.Top; + + if (!beepFlag && + read_screen(WINCONSOLE.hdl, + this_screen, + this_size, + bufferCoord, + &this_region)) { + + memcpy(that_screen, + this_screen, + sizeof(CHAR_INFO) * (size_t) max_cells); + + for (i = 0; i < max_cells; i++) { + that_screen[i].Attributes = + RevAttr(that_screen[i].Attributes); + } + + write_screen(WINCONSOLE.hdl, that_screen, this_size, + bufferCoord, &this_region); + Sleep(200); + write_screen(WINCONSOLE.hdl, this_screen, this_size, + bufferCoord, &this_region); + + } else { + MessageBeep(MB_ICONWARNING); /* MB_OK might be better */ + } + res = OK; + } + return res; +} + +static int +wcon_print(TERMINAL_CONTROL_BLOCK * TCB, + char *data GCC_UNUSED, + int len GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); + + return ERR; +} + +static int +wcon_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, + int fg GCC_UNUSED, + int bg GCC_UNUSED) +{ + SCREEN *sp; + int code = ERR; + + AssertTCB(); + SetSP(); + + return (code); +} + +static void +wcon_setcolor(TERMINAL_CONTROL_BLOCK * TCB, + int fore, + int color, + int (*outc) (SCREEN *, int) GCC_UNUSED) +{ + (void) TCB; + if (validateConsoleHandle()) { + WORD a = _nc_console_MapColor(fore, color); + a |= (WORD) ((WINCONSOLE.SBI.wAttributes) & (fore ? 0xfff8 : 0xff8f)); + SetConsoleTextAttribute(WINCONSOLE.hdl, a); + _nc_console_get_SBI(); + } +} + +static bool +wcon_rescol(TERMINAL_CONTROL_BLOCK * TCB) +{ + bool res = FALSE; + + (void) TCB; + if (validateConsoleHandle()) { + WORD a = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN; + SetConsoleTextAttribute(WINCONSOLE.hdl, a); + _nc_console_get_SBI(); + res = TRUE; + } + return res; +} + +static bool +wcon_rescolors(TERMINAL_CONTROL_BLOCK * TCB) +{ + int result = FALSE; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + return result; +} + +static int +wcon_size(TERMINAL_CONTROL_BLOCK * TCB, int *Lines, int *Cols) +{ + int result = ERR; + + T((T_CALLED("win32con::wcon_size(%p)"), TCB)); + + if (validateConsoleHandle() && + (Lines != NULL) && (Cols != NULL)) { + _nc_console_size(Lines, Cols); + result = OK; + } + returnCode(result); +} + +static int +wcon_setsize(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, + int l GCC_UNUSED, + int c GCC_UNUSED) +{ + AssertTCB(); + return ERR; +} + +static int +wcon_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) +{ + int result = ERR; + + T((T_CALLED("win32con::wcon_sgmode(TCB=(%p),setFlag=%d,TTY=(%p)"), + TCB, setFlag, buf)); + if (buf != NULL && validateConsoleHandle()) { + + if (setFlag) { + _nc_console_setmode(WINCONSOLE.hdl, buf); + TCB->term.Nttyb = *buf; + } else { + _nc_console_getmode(WINCONSOLE.hdl, &(TCB->term.Nttyb)); + *buf = TCB->term.Nttyb; + } + result = OK; + } + returnCode(result); +} + +#define MIN_WIDE 80 +#define MIN_HIGH 24 + +static int +wcon_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) +{ + SCREEN *sp; + TERMINAL *_term = (TERMINAL *) TCB; + int code = ERR; + + if (validateConsoleHandle()) { + sp = TCB->csp; + + T((T_CALLED("win32con::wcon_mode(%p, progFlag=%d, defFlag=%d)"), + TCB, progFlag, defFlag)); + + WINCONSOLE.progMode = progFlag; + WINCONSOLE.lastOut = progFlag ? WINCONSOLE.hdl : WINCONSOLE.out; + SetConsoleActiveScreenBuffer(WINCONSOLE.lastOut); + + if (progFlag) /* prog mode */ { + if (defFlag) { + if ((wcon_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) { + code = OK; + } + } else { + /* reset_prog_mode */ + if (wcon_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) { + if (sp) { + if (sp->_keypad_on) + _nc_keypad(sp, TRUE); + } + if (!WINCONSOLE.buffered) { + _nc_console_set_scrollback(FALSE, &WINCONSOLE.SBI); + } + code = OK; + } + } + T(("... buffered:%d, clear:%d", + WINCONSOLE.buffered, CurScreen(sp)->_clear)); + } else { /* shell mode */ + if (defFlag) { + /* def_shell_mode */ + if (wcon_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) { + code = OK; + } + } else { + /* reset_shell_mode */ + if (sp) { + _nc_keypad(sp, FALSE); + NCURSES_SP_NAME(_nc_flush) (sp); + } + code = wcon_sgmode(TCB, TRUE, &(_term->Ottyb)); + if (!WINCONSOLE.buffered) { + _nc_console_set_scrollback(TRUE, &WINCONSOLE.save_SBI); + if (!restore_original_screen()) + code = ERR; + } + SetConsoleCursorInfo(WINCONSOLE.hdl, &WINCONSOLE.save_CI); + } + } + + } + returnCode(code); +} + +static void +wcon_screen_init(SCREEN *sp GCC_UNUSED) +{ +} + +static void +wcon_wrap(SCREEN *sp GCC_UNUSED) +{ +} + +static void +wcon_release(TERMINAL_CONTROL_BLOCK * TCB) +{ + T((T_CALLED("win32con::wcon_release(%p)"), TCB)); + + AssertTCB(); + if (TCB->prop) + free(TCB->prop); + + returnVoid; +} + +static void +wcon_init(TERMINAL_CONTROL_BLOCK * TCB) +{ + T((T_CALLED("win32con::wcon_init(%p)"), TCB)); + + AssertTCB(); + + if (!(console_initialized = _nc_console_checkinit(TRUE, FALSE))) { + returnVoid; + } + + if (TCB) { + TCB->info.initcolor = TRUE; + TCB->info.canchange = FALSE; + TCB->info.hascolor = TRUE; + TCB->info.caninit = TRUE; + + TCB->info.maxpairs = CON_NUMPAIRS; + TCB->info.maxcolors = 8; + TCB->info.numlabels = 0; + TCB->info.labelwidth = 0; + TCB->info.labelheight = 0; + TCB->info.nocolorvideo = 1; + TCB->info.tabsize = 8; + + TCB->info.numbuttons = WINCONSOLE.numButtons; + TCB->info.defaultPalette = _nc_cga_palette; + + } + returnVoid; +} + +static void +wcon_initpair(TERMINAL_CONTROL_BLOCK * TCB, + int pair, + int f, + int b) +{ + SCREEN *sp; + + if (validateConsoleHandle()) { + SetSP(); + + if ((pair > 0) && (pair < CON_NUMPAIRS) && (f >= 0) && (f < 8) + && (b >= 0) && (b < 8)) { + WINCONSOLE.pairs[pair] = + _nc_console_MapColor(true, f) | + _nc_console_MapColor(false, b); + } + } +} + +static void +wcon_initcolor(TERMINAL_CONTROL_BLOCK * TCB, + int color GCC_UNUSED, + int r GCC_UNUSED, + int g GCC_UNUSED, + int b GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_do_color(TERMINAL_CONTROL_BLOCK * TCB, + int old_pair GCC_UNUSED, + int pair GCC_UNUSED, + int reverse GCC_UNUSED, + int (*outc) (SCREEN *, int) GCC_UNUSED +) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_initmouse(TERMINAL_CONTROL_BLOCK * TCB) +{ + SCREEN *sp; + + T((T_CALLED("win32con::wcon_initmouse(%p)"), TCB)); + + if (validateConsoleHandle()) { + SetSP(); + + sp->_mouse_type = M_TERM_DRIVER; + } + returnVoid; +} + +static int +wcon_testmouse(TERMINAL_CONTROL_BLOCK * TCB, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc = 0; + SCREEN *sp; + + T((T_CALLED("win32con::wcon_testmouse(%p)"), TCB)); + if (validateConsoleHandle()) { + SetSP(); + + if (sp->_drv_mouse_head < sp->_drv_mouse_tail) { + rc = TW_MOUSE; + } else { + rc = TCBOf(sp)->drv->td_twait(TCBOf(sp), + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); + } + } + + returnCode(rc); +} + +static int +wcon_mvcur(TERMINAL_CONTROL_BLOCK * TCB, + int yold GCC_UNUSED, int xold GCC_UNUSED, + int y, int x) +{ + int ret = ERR; + + (void) TCB; + if (validateConsoleHandle()) { + COORD loc; + loc.X = (short) x; + loc.Y = (short) (y + AdjustY()); + SetConsoleCursorPosition(WINCONSOLE.hdl, loc); + ret = OK; + } + return ret; +} + +static void +wcon_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, + int labnum GCC_UNUSED, + char *text GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, + int OnFlag GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static chtype +wcon_conattr(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED) +{ + chtype res = A_NORMAL; + res |= (A_BOLD | A_DIM | A_REVERSE | A_STANDOUT | A_COLOR); + return res; +} + +static void +wcon_setfilter(TERMINAL_CONTROL_BLOCK * TCB) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_initacs(TERMINAL_CONTROL_BLOCK * TCB, + chtype *real_map GCC_UNUSED, + chtype *fake_map GCC_UNUSED) +{ +#define DATA(a,b) { a, b } + static struct { + int acs_code; + int use_code; + } table[] = { + DATA('a', 0xb1), /* ACS_CKBOARD */ + DATA('f', 0xf8), /* ACS_DEGREE */ + DATA('g', 0xf1), /* ACS_PLMINUS */ + DATA('j', 0xd9), /* ACS_LRCORNER */ + DATA('l', 0xda), /* ACS_ULCORNER */ + DATA('k', 0xbf), /* ACS_URCORNER */ + DATA('m', 0xc0), /* ACS_LLCORNER */ + DATA('n', 0xc5), /* ACS_PLUS */ + DATA('q', 0xc4), /* ACS_HLINE */ + DATA('t', 0xc3), /* ACS_LTEE */ + DATA('u', 0xb4), /* ACS_RTEE */ + DATA('v', 0xc1), /* ACS_BTEE */ + DATA('w', 0xc2), /* ACS_TTEE */ + DATA('x', 0xb3), /* ACS_VLINE */ + DATA('y', 0xf3), /* ACS_LEQUAL */ + DATA('z', 0xf2), /* ACS_GEQUAL */ + DATA('0', 0xdb), /* ACS_BLOCK */ + DATA('{', 0xe3), /* ACS_PI */ + DATA('}', 0x9c), /* ACS_STERLING */ + DATA(',', 0xae), /* ACS_LARROW */ + DATA('+', 0xaf), /* ACS_RARROW */ + DATA('~', 0xf9), /* ACS_BULLET */ + }; +#undef DATA + unsigned n; + + SCREEN *sp; + if (validateConsoleHandle()) { + SetSP(); + + for (n = 0; n < SIZEOF(table); ++n) { + real_map[table[n].acs_code] = + (chtype) table[n].use_code | A_ALTCHARSET; + if (sp != 0) + sp->_screen_acs_map[table[n].acs_code] = TRUE; + } + } +} + +static int +wcon_twait(TERMINAL_CONTROL_BLOCK * TCB, + int mode, + int milliseconds, + int *timeleft + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + SCREEN *sp; + int code = 0; + + if (validateConsoleHandle()) { + SetSP(); + + code = _nc_console_twait(sp, + WINCONSOLE.inp, + mode, + milliseconds, + timeleft EVENTLIST_2nd(evl)); + } + return code; +} + +static int +wcon_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) +{ + SCREEN *sp; + int n = -1; + + T((T_CALLED("win32con::wcon_read(%p)"), TCB)); + + assert(buf); + if (validateConsoleHandle()) { + SetSP(); + + n = _nc_console_read(sp, WINCONSOLE.inp, buf); + } + returnCode(n); +} + +static int +wcon_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms) +{ + T((T_CALLED("win32con::wcon_nap(%p, %d)"), TCB, ms)); + Sleep((DWORD) ms); + returnCode(OK); +} + +static int +wcon_cursorSet(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int mode) +{ + int res = -1; + + T((T_CALLED("win32con:wcon_cursorSet(%d)"), mode)); + if (validateConsoleHandle()) { + CONSOLE_CURSOR_INFO this_CI = WINCONSOLE.save_CI; + switch (mode) { + case 0: + this_CI.bVisible = FALSE; + break; + case 1: + break; + case 2: + this_CI.dwSize = 100; + break; + } + SetConsoleCursorInfo(WINCONSOLE.hdl, &this_CI); + } + returnCode(res); +} + +static bool +wcon_kyExist(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int keycode) +{ + bool found = FALSE; + + T((T_CALLED("win32con::wcon_kyExist(%d)"), keycode)); + found = _nc_console_keyExist(keycode); + returnBool(found); +} + +static int +wcon_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag GCC_UNUSED) +{ + SCREEN *sp; + int code = ERR; + + T((T_CALLED("win32con::wcon_kpad(%p, %d)"), TCB, flag)); + + if (validateConsoleHandle()) { + SetSP(); + + if (sp) { + code = OK; + } + } + returnCode(code); +} + +static int +wcon_keyok(TERMINAL_CONTROL_BLOCK * TCB, + int keycode, + int flag) +{ + int code = ERR; + SCREEN *sp; + + T((T_CALLED("win32con::wcon_keyok(%p, %d, %d)"), TCB, keycode, flag)); + + if (validateConsoleHandle()) { + SetSP(); + if (sp) { + code = _nc_console_keyok(keycode, flag); + } + } + returnCode(code); +} + +NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_WIN_DRIVER = { + FALSE, + wcon_name, /* Name */ + wcon_CanHandle, /* CanHandle */ + wcon_init, /* init */ + wcon_release, /* release */ + wcon_size, /* size */ + wcon_sgmode, /* sgmode */ + wcon_conattr, /* conattr */ + wcon_mvcur, /* hwcur */ + wcon_mode, /* mode */ + wcon_rescol, /* rescol */ + wcon_rescolors, /* rescolors */ + wcon_setcolor, /* color */ + wcon_dobeepflash, /* DoBeepFlash */ + wcon_initpair, /* initpair */ + wcon_initcolor, /* initcolor */ + wcon_do_color, /* docolor */ + wcon_initmouse, /* initmouse */ + wcon_testmouse, /* testmouse */ + wcon_setfilter, /* setfilter */ + wcon_hwlabel, /* hwlabel */ + wcon_hwlabelOnOff, /* hwlabelOnOff */ + wcon_doupdate, /* update */ + wcon_defaultcolors, /* defaultcolors */ + wcon_print, /* print */ + wcon_size, /* getsize */ + wcon_setsize, /* setsize */ + wcon_initacs, /* initacs */ + wcon_screen_init, /* scinit */ + wcon_wrap, /* scexit */ + wcon_twait, /* twait */ + wcon_read, /* read */ + wcon_nap, /* nap */ + wcon_kpad, /* kpad */ + wcon_keyok, /* kyOk */ + wcon_kyExist, /* kyExist */ + wcon_cursorSet /* cursorSet */ +}; + +#endif /* _NC_WINDOWS */ diff --git a/contrib/ncurses/ncurses/win32con/win_driver.c b/contrib/ncurses/ncurses/win32con/win_driver.c new file mode 100644 index 00000000..fc606403 --- /dev/null +++ b/contrib/ncurses/ncurses/win32con/win_driver.c @@ -0,0 +1,2281 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2008-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* + * TODO - GetMousePos(POINT * result) from ntconio.c + * TODO - implement nodelay + * TODO - improve screen-repainting performance, using implied wraparound to reduce write's + * TODO - make it optional whether screen is restored or not when non-buffered + */ + +#include + +#ifdef _WIN32 +#include +#else +#include +#include +#endif + +#include + +#define PSAPI_VERSION 2 +#include + +#define CUR TerminalType(my_term). + +#define CONTROL_PRESSED (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) + +MODULE_ID("$Id: win_driver.c,v 1.75 2024/07/20 17:04:48 tom Exp $") + +#define TypeAlloca(type,count) (type*) _alloca(sizeof(type) * (size_t) (count)) + +#define WINMAGIC NCDRV_MAGIC(NCDRV_WINCONSOLE) + +#define EXP_OPTIMIZE 0 + +#define array_length(a) (sizeof(a)/sizeof(a[0])) + +static bool InitConsole(void); +static bool okConsoleHandle(TERMINAL_CONTROL_BLOCK *); + +#define AssertTCB() assert(TCB != 0 && (TCB->magic == WINMAGIC)) +#define SetSP() assert(TCB->csp != 0); sp = TCB->csp; (void) sp + +#define GenMap(vKey,key) MAKELONG(key, vKey) + +#define AdjustY() (CON.buffered ? 0 : (int) CON.SBI.srWindow.Top) + +#if USE_WIDEC_SUPPORT +#define write_screen WriteConsoleOutputW +#define read_screen ReadConsoleOutputW +#else +#define write_screen WriteConsoleOutput +#define read_screen ReadConsoleOutput +#endif +/* *INDENT-OFF* */ +static const LONG keylist[] = +{ + GenMap(VK_PRIOR, KEY_PPAGE), + GenMap(VK_NEXT, KEY_NPAGE), + GenMap(VK_END, KEY_END), + GenMap(VK_HOME, KEY_HOME), + GenMap(VK_LEFT, KEY_LEFT), + GenMap(VK_UP, KEY_UP), + GenMap(VK_RIGHT, KEY_RIGHT), + GenMap(VK_DOWN, KEY_DOWN), + GenMap(VK_DELETE, KEY_DC), + GenMap(VK_INSERT, KEY_IC) +}; +static const LONG ansi_keys[] = +{ + GenMap(VK_PRIOR, 'I'), + GenMap(VK_NEXT, 'Q'), + GenMap(VK_END, 'O'), + GenMap(VK_HOME, 'H'), + GenMap(VK_LEFT, 'K'), + GenMap(VK_UP, 'H'), + GenMap(VK_RIGHT, 'M'), + GenMap(VK_DOWN, 'P'), + GenMap(VK_DELETE, 'S'), + GenMap(VK_INSERT, 'R') +}; +/* *INDENT-ON* */ +#define N_INI ((int)array_length(keylist)) +#define FKEYS 24 +#define MAPSIZE (FKEYS + N_INI) +#define NUMPAIRS 64 + +/* A process can only have a single console, so it is safe + to maintain all the information about it in a single + static structure. + */ +static struct { + BOOL initialized; + BOOL buffered; + BOOL window_only; + BOOL progMode; + BOOL isTermInfoConsole; + HANDLE out; + HANDLE inp; + HANDLE hdl; + HANDLE lastOut; + int numButtons; + DWORD ansi_map[MAPSIZE]; + DWORD map[MAPSIZE]; + DWORD rmap[MAPSIZE]; + WORD pairs[NUMPAIRS]; + COORD origin; + CHAR_INFO *save_screen; + COORD save_size; + SMALL_RECT save_region; + CONSOLE_SCREEN_BUFFER_INFO SBI; + CONSOLE_SCREEN_BUFFER_INFO save_SBI; + CONSOLE_CURSOR_INFO save_CI; +} CON; + +static BOOL console_initialized = FALSE; + +static WORD +MapColor(bool fore, int color) +{ + static const int _cmap[] = + {0, 4, 2, 6, 1, 5, 3, 7}; + int a; + if (color < 0 || color > 7) + a = fore ? 7 : 0; + else + a = _cmap[color]; + if (!fore) + a = a << 4; + return (WORD) a; +} + +#define RevAttr(attr) \ + (WORD) (((attr) & 0xff00) | \ + ((((attr) & 0x07) << 4) | \ + (((attr) & 0x70) >> 4))) + +static WORD +MapAttr(WORD res, attr_t ch) +{ + if (ch & A_COLOR) { + int p; + + p = PairNumber(ch); + if (p > 0 && p < NUMPAIRS) { + WORD a; + a = CON.pairs[p]; + res = (WORD) ((res & 0xff00) | a); + } + } + + if (ch & A_REVERSE) { + res = RevAttr(res); + } + + if (ch & A_STANDOUT) { + res = RevAttr(res) | BACKGROUND_INTENSITY; + } + + if (ch & A_BOLD) + res |= FOREGROUND_INTENSITY; + + if (ch & A_DIM) + res |= BACKGROUND_INTENSITY; + + return res; +} + +#if 0 /* def TRACE */ +static void +dump_screen(const char *fn, int ln) +{ + int max_cells = (CON.SBI.dwSize.Y * (1 + CON.SBI.dwSize.X)) + 1; + char output[max_cells]; + CHAR_INFO save_screen[max_cells]; + COORD save_size; + SMALL_RECT save_region; + COORD bufferCoord; + + T(("dump_screen %s@%d", fn, ln)); + + save_region.Top = CON.SBI.srWindow.Top; + save_region.Left = CON.SBI.srWindow.Left; + save_region.Bottom = CON.SBI.srWindow.Bottom; + save_region.Right = CON.SBI.srWindow.Right; + + save_size.X = (SHORT) (save_region.Right - save_region.Left + 1); + save_size.Y = (SHORT) (save_region.Bottom - save_region.Top + 1); + + bufferCoord.X = bufferCoord.Y = 0; + + if (read_screen(CON.hdl, + save_screen, + save_size, + bufferCoord, + &save_region)) { + int i, j; + int ij = 0; + int k = 0; + + for (i = save_region.Top; i <= save_region.Bottom; ++i) { + for (j = save_region.Left; j <= save_region.Right; ++j) { + output[k++] = save_screen[ij++].Char.AsciiChar; + } + output[k++] = '\n'; + } + output[k] = 0; + + T(("DUMP: %d,%d - %d,%d", + save_region.Top, + save_region.Left, + save_region.Bottom, + save_region.Right)); + T(("%s", output)); + } +} + +#else +#define dump_screen(fn,ln) /* nothing */ +#endif + +#if USE_WIDEC_SUPPORT +/* + * TODO: support surrogate pairs + * TODO: support combining characters + * TODO: support acsc + * TODO: _nc_wacs should be part of sp. + */ +static BOOL +con_write16(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, cchar_t *str, int limit) +{ + int actual = 0; + CHAR_INFO *ci = TypeAlloca(CHAR_INFO, limit); + COORD loc, siz; + SMALL_RECT rec; + int i; + cchar_t ch; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + for (i = actual = 0; i < limit; i++) { + ch = str[i]; + if (isWidecExt(ch)) + continue; + ci[actual].Char.UnicodeChar = CharOf(ch); + ci[actual].Attributes = MapAttr(CON.SBI.wAttributes, + AttrOf(ch)); + if (AttrOf(ch) & A_ALTCHARSET) { + if (_nc_wacs) { + int which = CharOf(ch); + if (which > 0 + && which < ACS_LEN + && CharOf(_nc_wacs[which]) != 0) { + ci[actual].Char.UnicodeChar = CharOf(_nc_wacs[which]); + } else { + ci[actual].Char.UnicodeChar = ' '; + } + } + } + ++actual; + } + + loc.X = (SHORT) 0; + loc.Y = (SHORT) 0; + siz.X = (SHORT) actual; + siz.Y = 1; + + rec.Left = (SHORT) x; + rec.Top = (SHORT) (y + AdjustY()); + rec.Right = (SHORT) (x + limit - 1); + rec.Bottom = rec.Top; + + return write_screen(CON.hdl, ci, siz, loc, &rec); +} +#define con_write(tcb, y, x, str, n) con_write16(tcb, y, x, str, n) +#else +static BOOL +con_write8(TERMINAL_CONTROL_BLOCK * TCB, int y, int x, chtype *str, int n) +{ + CHAR_INFO *ci = TypeAlloca(CHAR_INFO, n); + COORD loc, siz; + SMALL_RECT rec; + int i; + chtype ch; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + for (i = 0; i < n; i++) { + ch = str[i]; + ci[i].Char.AsciiChar = ChCharOf(ch); + ci[i].Attributes = MapAttr(CON.SBI.wAttributes, + ChAttrOf(ch)); + if (ChAttrOf(ch) & A_ALTCHARSET) { + if (sp->_acs_map) + ci[i].Char.AsciiChar = + ChCharOf(NCURSES_SP_NAME(_nc_acs_char) (sp, ChCharOf(ch))); + } + } + + loc.X = (short) 0; + loc.Y = (short) 0; + siz.X = (short) n; + siz.Y = 1; + + rec.Left = (short) x; + rec.Top = (short) y; + rec.Right = (short) (x + n - 1); + rec.Bottom = rec.Top; + + return write_screen(CON.hdl, ci, siz, loc, &rec); +} +#define con_write(tcb, y, x, str, n) con_write8(tcb, y, x, str, n) +#endif + +#if EXP_OPTIMIZE +/* + * Comparing new/current screens, determine the last column-index for a change + * beginning on the given row,col position. Unlike a serial terminal, there is + * no cost for "moving" the "cursor" on the line as we update it. + */ +static int +find_end_of_change(SCREEN *sp, int row, int col) +{ + int result = col; + struct ldat *curdat = CurScreen(sp)->_line + row; + struct ldat *newdat = NewScreen(sp)->_line + row; + + while (col <= newdat->lastchar) { +#if USE_WIDEC_SUPPORT + if (isWidecExt(curdat->text[col]) || isWidecExt(newdat->text[col])) { + result = col; + } else if (memcmp(&curdat->text[col], + &newdat->text[col], + sizeof(curdat->text[0]))) { + result = col; + } else { + break; + } +#else + if (curdat->text[col] != newdat->text[col]) { + result = col; + } else { + break; + } +#endif + ++col; + } + return result; +} + +/* + * Given a row,col position at the end of a change-chunk, look for the + * beginning of the next change-chunk. + */ +static int +find_next_change(SCREEN *sp, int row, int col) +{ + struct ldat *curdat = CurScreen(sp)->_line + row; + struct ldat *newdat = NewScreen(sp)->_line + row; + int result = newdat->lastchar + 1; + + while (++col <= newdat->lastchar) { +#if USE_WIDEC_SUPPORT + if (isWidecExt(curdat->text[col]) != isWidecExt(newdat->text[col])) { + result = col; + break; + } else if (memcmp(&curdat->text[col], + &newdat->text[col], + sizeof(curdat->text[0]))) { + result = col; + break; + } +#else + if (curdat->text[col] != newdat->text[col]) { + result = col; + break; + } +#endif + } + return result; +} + +#define EndChange(first) \ + find_end_of_change(sp, y, first) +#define NextChange(last) \ + find_next_change(sp, y, last) + +#endif /* EXP_OPTIMIZE */ + +#define MARK_NOCHANGE(win,row) \ + win->_line[row].firstchar = _NOCHANGE; \ + win->_line[row].lastchar = _NOCHANGE + +static void +selectActiveHandle(void) +{ + if (CON.lastOut != CON.hdl) { + CON.lastOut = CON.hdl; + SetConsoleActiveScreenBuffer(CON.lastOut); + } +} + +static bool +restore_original_screen(void) +{ + COORD bufferCoord; + bool result = FALSE; + SMALL_RECT save_region = CON.save_region; + + T(("... restoring %s", CON.window_only ? "window" : "entire buffer")); + + bufferCoord.X = (SHORT) (CON.window_only ? CON.SBI.srWindow.Left : 0); + bufferCoord.Y = (SHORT) (CON.window_only ? CON.SBI.srWindow.Top : 0); + + if (write_screen(CON.hdl, + CON.save_screen, + CON.save_size, + bufferCoord, + &save_region)) { + result = TRUE; + mvcur(-1, -1, LINES - 2, 0); + T(("... restore original screen contents ok %dx%d (%d,%d - %d,%d)", + CON.save_size.Y, + CON.save_size.X, + save_region.Top, + save_region.Left, + save_region.Bottom, + save_region.Right)); + } else { + T(("... restore original screen contents err")); + } + return result; +} + +static const char * +wcon_name(TERMINAL_CONTROL_BLOCK * TCB) +{ + (void) TCB; + return "win32console"; +} + +static int +wcon_doupdate(TERMINAL_CONTROL_BLOCK * TCB) +{ + int result = ERR; + int y, nonempty, n, x0, x1, Width, Height; + SCREEN *sp; + + T((T_CALLED("win32con::wcon_doupdate(%p)"), TCB)); + if (okConsoleHandle(TCB)) { + SetSP(); + + Width = screen_columns(sp); + Height = screen_lines(sp); + nonempty = Min(Height, NewScreen(sp)->_maxy + 1); + + T(("... %dx%d clear cur:%d new:%d", + Height, Width, + CurScreen(sp)->_clear, + NewScreen(sp)->_clear)); + + if (SP_PARM->_endwin == ewSuspend) { + + T(("coming back from shell mode")); + NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG); + + NCURSES_SP_NAME(_nc_mvcur_resume) (NCURSES_SP_ARG); + NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG); + SP_PARM->_mouse_resume(SP_PARM); + + SP_PARM->_endwin = ewRunning; + } + + if ((CurScreen(sp)->_clear || NewScreen(sp)->_clear)) { + int x; +#if USE_WIDEC_SUPPORT + cchar_t *empty = TypeAlloca(cchar_t, Width); + wchar_t blank[2] = + { + L' ', L'\0' + }; + + for (x = 0; x < Width; x++) + setcchar(&empty[x], blank, 0, 0, 0); +#else + chtype *empty = TypeAlloca(chtype, Width); + + for (x = 0; x < Width; x++) + empty[x] = ' '; +#endif + + for (y = 0; y < nonempty; y++) { + con_write(TCB, y, 0, empty, Width); + memcpy(empty, + CurScreen(sp)->_line[y].text, + (size_t) Width * sizeof(empty[0])); + } + CurScreen(sp)->_clear = FALSE; + NewScreen(sp)->_clear = FALSE; + touchwin(NewScreen(sp)); + T(("... cleared %dx%d lines @%d of screen", nonempty, Width, + AdjustY())); + } + + for (y = 0; y < nonempty; y++) { + x0 = NewScreen(sp)->_line[y].firstchar; + if (x0 != _NOCHANGE) { +#if EXP_OPTIMIZE + int x2; + int limit = NewScreen(sp)->_line[y].lastchar; + while ((x1 = EndChange(x0)) <= limit) { + while ((x2 = NextChange(x1)) <= limit && x2 <= (x1 + 2)) { + x1 = x2; + } + n = x1 - x0 + 1; + memcpy(&CurScreen(sp)->_line[y].text[x0], + &NewScreen(sp)->_line[y].text[x0], + n * sizeof(CurScreen(sp)->_line[y].text[x0])); + con_write(TCB, + y, + x0, + &CurScreen(sp)->_line[y].text[x0], n); + x0 = NextChange(x1); + } + + /* mark line changed successfully */ + if (y <= NewScreen(sp)->_maxy) { + MARK_NOCHANGE(NewScreen(sp), y); + } + if (y <= CurScreen(sp)->_maxy) { + MARK_NOCHANGE(CurScreen(sp), y); + } +#else + x1 = NewScreen(sp)->_line[y].lastchar; + n = x1 - x0 + 1; + if (n > 0) { + memcpy(&CurScreen(sp)->_line[y].text[x0], + &NewScreen(sp)->_line[y].text[x0], + (size_t) n * sizeof(CurScreen(sp)->_line[y].text[x0])); + con_write(TCB, + y, + x0, + &CurScreen(sp)->_line[y].text[x0], n); + + /* mark line changed successfully */ + if (y <= NewScreen(sp)->_maxy) { + MARK_NOCHANGE(NewScreen(sp), y); + } + if (y <= CurScreen(sp)->_maxy) { + MARK_NOCHANGE(CurScreen(sp), y); + } + } +#endif + } + } + + /* put everything back in sync */ + for (y = nonempty; y <= NewScreen(sp)->_maxy; y++) { + MARK_NOCHANGE(NewScreen(sp), y); + } + for (y = nonempty; y <= CurScreen(sp)->_maxy; y++) { + MARK_NOCHANGE(CurScreen(sp), y); + } + + if (!NewScreen(sp)->_leaveok) { + CurScreen(sp)->_curx = NewScreen(sp)->_curx; + CurScreen(sp)->_cury = NewScreen(sp)->_cury; + + TCB->drv->td_hwcur(TCB, + 0, 0, + CurScreen(sp)->_cury, CurScreen(sp)->_curx); + } + selectActiveHandle(); + result = OK; + } + returnCode(result); +} + +#ifdef __MINGW32__ +#define SysISATTY(fd) _isatty(fd) +#else +#define SysISATTY(fd) isatty(fd) +#endif + +static bool +wcon_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, + const char *tname, + int *errret GCC_UNUSED) +{ + bool code = FALSE; + + T((T_CALLED("win32con::wcon_CanHandle(%p)"), TCB)); + + assert((TCB != 0) && (tname != 0)); + + TCB->magic = WINMAGIC; + + if (tname == 0 || *tname == 0) + code = TRUE; + else if (tname != 0 && *tname == '#') { + /* + * Use "#" (a character which cannot begin a terminal's name) to + * select specific driver from the table. + * + * In principle, we could have more than one non-terminfo driver, + * e.g., "win32gui". + */ + size_t n = strlen(tname + 1); + if (n != 0 + && ((strncmp(tname + 1, "win32console", n) == 0) + || (strncmp(tname + 1, "win32con", n) == 0))) { + code = TRUE; + } + } else if (tname != 0 && stricmp(tname, "unknown") == 0) { + code = TRUE; + } else if (SysISATTY(TCB->term.Filedes)) { + code = TRUE; + } + + /* + * This is intentional, to avoid unnecessary breakage of applications + * using symbols. + */ + if (code && (TerminalType(&TCB->term).Booleans == 0)) { + _nc_init_termtype(&TerminalType(&TCB->term)); +#if NCURSES_EXT_NUMBERS + _nc_export_termtype2(&TCB->term.type, &TerminalType(&TCB->term)); +#endif + } + + if (!code) { + if (_nc_mingw_isconsole(0)) + CON.isTermInfoConsole = TRUE; + } + returnBool(code); +} + +static int +wcon_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, + int beepFlag) +{ + SCREEN *sp; + int res = ERR; + + int high = (CON.SBI.srWindow.Bottom - CON.SBI.srWindow.Top + 1); + int wide = (CON.SBI.srWindow.Right - CON.SBI.srWindow.Left + 1); + int max_cells = (high * wide); + int i; + + CHAR_INFO *this_screen = TypeAlloca(CHAR_INFO, max_cells); + CHAR_INFO *that_screen = TypeAlloca(CHAR_INFO, max_cells); + COORD this_size; + SMALL_RECT this_region; + COORD bufferCoord; + + if (okConsoleHandle(TCB)) { + SetSP(); + this_region.Top = CON.SBI.srWindow.Top; + this_region.Left = CON.SBI.srWindow.Left; + this_region.Bottom = CON.SBI.srWindow.Bottom; + this_region.Right = CON.SBI.srWindow.Right; + + this_size.X = (SHORT) wide; + this_size.Y = (SHORT) high; + + bufferCoord.X = this_region.Left; + bufferCoord.Y = this_region.Top; + + if (!beepFlag && + read_screen(CON.hdl, + this_screen, + this_size, + bufferCoord, + &this_region)) { + + memcpy(that_screen, + this_screen, + sizeof(CHAR_INFO) * (size_t) max_cells); + + for (i = 0; i < max_cells; i++) { + that_screen[i].Attributes = RevAttr(that_screen[i].Attributes); + } + + write_screen(CON.hdl, that_screen, this_size, bufferCoord, &this_region); + Sleep(200); + write_screen(CON.hdl, this_screen, this_size, bufferCoord, &this_region); + + } else { + MessageBeep(MB_ICONWARNING); /* MB_OK might be better */ + } + res = OK; + } + return res; +} + +static int +wcon_print(TERMINAL_CONTROL_BLOCK * TCB, + char *data GCC_UNUSED, + int len GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); + + return ERR; +} + +static int +wcon_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, + int fg GCC_UNUSED, + int bg GCC_UNUSED) +{ + SCREEN *sp; + int code = ERR; + + AssertTCB(); + SetSP(); + + return (code); +} + +static bool +get_SBI(void) +{ + bool rc = FALSE; + if (GetConsoleScreenBufferInfo(CON.hdl, &(CON.SBI))) { + T(("GetConsoleScreenBufferInfo")); + T(("... buffer(X:%d Y:%d)", + CON.SBI.dwSize.X, + CON.SBI.dwSize.Y)); + T(("... window(X:%d Y:%d)", + CON.SBI.dwMaximumWindowSize.X, + CON.SBI.dwMaximumWindowSize.Y)); + T(("... cursor(X:%d Y:%d)", + CON.SBI.dwCursorPosition.X, + CON.SBI.dwCursorPosition.Y)); + T(("... display(Top:%d Bottom:%d Left:%d Right:%d)", + CON.SBI.srWindow.Top, + CON.SBI.srWindow.Bottom, + CON.SBI.srWindow.Left, + CON.SBI.srWindow.Right)); + if (CON.buffered) { + CON.origin.X = 0; + CON.origin.Y = 0; + } else { + CON.origin.X = CON.SBI.srWindow.Left; + CON.origin.Y = CON.SBI.srWindow.Top; + } + rc = TRUE; + } else { + T(("GetConsoleScreenBufferInfo ERR")); + } + return rc; +} + +static void +wcon_setcolor(TERMINAL_CONTROL_BLOCK * TCB, + int fore, + int color, + int (*outc) (SCREEN *, int) GCC_UNUSED) +{ + if (okConsoleHandle(TCB)) { + WORD a = MapColor(fore, color); + a |= (WORD) ((CON.SBI.wAttributes) & (fore ? 0xfff8 : 0xff8f)); + SetConsoleTextAttribute(CON.hdl, a); + get_SBI(); + } +} + +static bool +wcon_rescol(TERMINAL_CONTROL_BLOCK * TCB) +{ + bool res = FALSE; + + if (okConsoleHandle(TCB)) { + WORD a = FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN; + SetConsoleTextAttribute(CON.hdl, a); + get_SBI(); + res = TRUE; + } + return res; +} + +static bool +wcon_rescolors(TERMINAL_CONTROL_BLOCK * TCB) +{ + int result = FALSE; + SCREEN *sp; + + AssertTCB(); + SetSP(); + + return result; +} + +static int +wcon_size(TERMINAL_CONTROL_BLOCK * TCB, int *Lines, int *Cols) +{ + int result = ERR; + + T((T_CALLED("win32con::wcon_size(%p)"), TCB)); + + if (okConsoleHandle(TCB) && + Lines != NULL && + Cols != NULL) { + if (CON.buffered) { + *Lines = (int) (CON.SBI.dwSize.Y); + *Cols = (int) (CON.SBI.dwSize.X); + } else { + *Lines = (int) (CON.SBI.srWindow.Bottom + 1 - + CON.SBI.srWindow.Top); + *Cols = (int) (CON.SBI.srWindow.Right + 1 - + CON.SBI.srWindow.Left); + } + result = OK; + } + returnCode(result); +} + +static int +wcon_setsize(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, + int l GCC_UNUSED, + int c GCC_UNUSED) +{ + AssertTCB(); + return ERR; +} + +static int +wcon_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf) +{ + DWORD dwFlag = 0; + tcflag_t iflag; + tcflag_t lflag; + int result = ERR; + + if (buf != NULL && okConsoleHandle(TCB)) { + + if (setFlag) { + iflag = buf->c_iflag; + lflag = buf->c_lflag; + + GetConsoleMode(CON.inp, &dwFlag); + + if (lflag & ICANON) + dwFlag |= ENABLE_LINE_INPUT; + else + dwFlag &= (DWORD) (~ENABLE_LINE_INPUT); + + if (lflag & ECHO) + dwFlag |= ENABLE_ECHO_INPUT; + else + dwFlag &= (DWORD) (~ENABLE_ECHO_INPUT); + + if (iflag & BRKINT) + dwFlag |= ENABLE_PROCESSED_INPUT; + else + dwFlag &= (DWORD) (~ENABLE_PROCESSED_INPUT); + + dwFlag |= ENABLE_MOUSE_INPUT; + + buf->c_iflag = iflag; + buf->c_lflag = lflag; + SetConsoleMode(CON.inp, dwFlag); + TCB->term.Nttyb = *buf; + } else { + iflag = TCB->term.Nttyb.c_iflag; + lflag = TCB->term.Nttyb.c_lflag; + GetConsoleMode(CON.inp, &dwFlag); + + if (dwFlag & ENABLE_LINE_INPUT) + lflag |= ICANON; + else + lflag &= (tcflag_t) (~ICANON); + + if (dwFlag & ENABLE_ECHO_INPUT) + lflag |= ECHO; + else + lflag &= (tcflag_t) (~ECHO); + + if (dwFlag & ENABLE_PROCESSED_INPUT) + iflag |= BRKINT; + else + iflag &= (tcflag_t) (~BRKINT); + + TCB->term.Nttyb.c_iflag = iflag; + TCB->term.Nttyb.c_lflag = lflag; + + *buf = TCB->term.Nttyb; + } + result = OK; + } + return result; +} + +#define MIN_WIDE 80 +#define MIN_HIGH 24 + +/* + * In "normal" mode, reset the buffer- and window-sizes back to their original values. + */ +static void +set_scrollback(bool normal, CONSOLE_SCREEN_BUFFER_INFO * info) +{ + SMALL_RECT rect; + COORD coord; + bool changed = FALSE; + + T((T_CALLED("win32con::set_scrollback(%s)"), + (normal + ? "normal" + : "application"))); + + T(("... SBI.srWindow %d,%d .. %d,%d", + info->srWindow.Top, + info->srWindow.Left, + info->srWindow.Bottom, + info->srWindow.Right)); + T(("... SBI.dwSize %dx%d", + info->dwSize.Y, + info->dwSize.X)); + + if (normal) { + rect = info->srWindow; + coord = info->dwSize; + if (memcmp(info, &CON.SBI, sizeof(*info)) != 0) { + changed = TRUE; + CON.SBI = *info; + } + } else { + int high = info->srWindow.Bottom - info->srWindow.Top + 1; + int wide = info->srWindow.Right - info->srWindow.Left + 1; + + if (high < MIN_HIGH) { + T(("... height %d < %d", high, MIN_HIGH)); + high = MIN_HIGH; + changed = TRUE; + } + if (wide < MIN_WIDE) { + T(("... width %d < %d", wide, MIN_WIDE)); + wide = MIN_WIDE; + changed = TRUE; + } + + rect.Left = + rect.Top = 0; + rect.Right = (SHORT) (wide - 1); + rect.Bottom = (SHORT) (high - 1); + + coord.X = (SHORT) wide; + coord.Y = (SHORT) high; + + if (info->dwSize.Y != high || + info->dwSize.X != wide || + info->srWindow.Top != 0 || + info->srWindow.Left != 0) { + changed = TRUE; + } + + } + + if (changed) { + T(("... coord %d,%d", coord.Y, coord.X)); + T(("... rect %d,%d - %d,%d", + rect.Top, rect.Left, + rect.Bottom, rect.Right)); + SetConsoleScreenBufferSize(CON.hdl, coord); /* dwSize */ + SetConsoleWindowInfo(CON.hdl, TRUE, &rect); /* srWindow */ + get_SBI(); + } + returnVoid; +} + +static int +wcon_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag) +{ + SCREEN *sp; + TERMINAL *_term = (TERMINAL *) TCB; + int code = ERR; + + if (okConsoleHandle(TCB)) { + sp = TCB->csp; + + T((T_CALLED("win32con::wcon_mode(%p, prog=%d, def=%d)"), + TCB, progFlag, defFlag)); + + CON.progMode = progFlag; + CON.lastOut = progFlag ? CON.hdl : CON.out; + SetConsoleActiveScreenBuffer(CON.lastOut); + + if (progFlag) /* prog mode */ { + if (defFlag) { + if ((wcon_sgmode(TCB, FALSE, &(_term->Nttyb)) == OK)) { + _term->Nttyb.c_oflag &= (tcflag_t) (~OFLAGS_TABS); + code = OK; + } + } else { + /* reset_prog_mode */ + if (wcon_sgmode(TCB, TRUE, &(_term->Nttyb)) == OK) { + if (sp) { + if (sp->_keypad_on) + _nc_keypad(sp, TRUE); + } + if (!CON.buffered) { + set_scrollback(FALSE, &CON.SBI); + } + code = OK; + } + } + T(("... buffered:%d, clear:%d", CON.buffered, CurScreen(sp)->_clear)); + } else { /* shell mode */ + if (defFlag) { + /* def_shell_mode */ + if (wcon_sgmode(TCB, FALSE, &(_term->Ottyb)) == OK) { + code = OK; + } + } else { + /* reset_shell_mode */ + if (sp) { + _nc_keypad(sp, FALSE); + NCURSES_SP_NAME(_nc_flush) (sp); + } + code = wcon_sgmode(TCB, TRUE, &(_term->Ottyb)); + if (!CON.buffered) { + set_scrollback(TRUE, &CON.save_SBI); + if (!restore_original_screen()) + code = ERR; + } + SetConsoleCursorInfo(CON.hdl, &CON.save_CI); + } + } + + } + returnCode(code); +} + +static void +wcon_screen_init(SCREEN *sp GCC_UNUSED) +{ +} + +static void +wcon_wrap(SCREEN *sp GCC_UNUSED) +{ +} + +static int +rkeycompare(const void *el1, const void *el2) +{ + WORD key1 = (LOWORD((*((const LONG *) el1)))) & 0x7fff; + WORD key2 = (LOWORD((*((const LONG *) el2)))) & 0x7fff; + + return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1)); +} + +static int +keycompare(const void *el1, const void *el2) +{ + WORD key1 = HIWORD((*((const LONG *) el1))); + WORD key2 = HIWORD((*((const LONG *) el2))); + + return ((key1 < key2) ? -1 : ((key1 == key2) ? 0 : 1)); +} + +static int +MapKey(WORD vKey) +{ + WORD nKey = 0; + void *res; + LONG key = GenMap(vKey, 0); + int code = -1; + + res = bsearch(&key, + CON.map, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + keycompare); + if (res) { + key = *((LONG *) res); + nKey = LOWORD(key); + code = (int) (nKey & 0x7fff); + if (nKey & 0x8000) + code = -code; + } + return code; +} + +static int +AnsiKey(WORD vKey) +{ + WORD nKey = 0; + void *res; + LONG key = GenMap(vKey, 0); + int code = -1; + + res = bsearch(&key, + CON.ansi_map, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + keycompare); + if (res) { + key = *((LONG *) res); + nKey = LOWORD(key); + code = (int) (nKey & 0x7fff); + if (nKey & 0x8000) + code = -code; + } + return code; +} + +static void +wcon_release(TERMINAL_CONTROL_BLOCK * TCB) +{ + T((T_CALLED("win32con::wcon_release(%p)"), TCB)); + + AssertTCB(); + if (TCB->prop) + free(TCB->prop); + + returnVoid; +} + +static bool +read_screen_data(void) +{ + bool result = FALSE; + COORD bufferCoord; + size_t want; + + CON.save_size.X = (SHORT) (CON.save_region.Right + - CON.save_region.Left + 1); + CON.save_size.Y = (SHORT) (CON.save_region.Bottom + - CON.save_region.Top + 1); + + want = (size_t) (CON.save_size.X * CON.save_size.Y); + + if ((CON.save_screen = malloc(want * sizeof(CHAR_INFO))) != 0) { + bufferCoord.X = (SHORT) (CON.window_only ? CON.SBI.srWindow.Left : 0); + bufferCoord.Y = (SHORT) (CON.window_only ? CON.SBI.srWindow.Top : 0); + + T(("... reading console %s %dx%d into %d,%d - %d,%d at %d,%d", + CON.window_only ? "window" : "buffer", + CON.save_size.Y, CON.save_size.X, + CON.save_region.Top, + CON.save_region.Left, + CON.save_region.Bottom, + CON.save_region.Right, + bufferCoord.Y, + bufferCoord.X)); + + if (read_screen(CON.hdl, + CON.save_screen, + CON.save_size, + bufferCoord, + &CON.save_region)) { + result = TRUE; + } else { + T((" error %#lx", (unsigned long) GetLastError())); + FreeAndNull(CON.save_screen); + } + } + + return result; +} + +/* + * Attempt to save the screen contents. PDCurses does this if + * PDC_RESTORE_SCREEN is set, giving the same visual appearance on + * restoration as if the library had allocated a console buffer. MSDN + * says that the data which can be read is limited to 64Kb (and may be + * less). + */ +static bool +save_original_screen(void) +{ + bool result = FALSE; + + CON.save_region.Top = 0; + CON.save_region.Left = 0; + CON.save_region.Bottom = (SHORT) (CON.SBI.dwSize.Y - 1); + CON.save_region.Right = (SHORT) (CON.SBI.dwSize.X - 1); + + if (read_screen_data()) { + result = TRUE; + } else { + + CON.save_region.Top = CON.SBI.srWindow.Top; + CON.save_region.Left = CON.SBI.srWindow.Left; + CON.save_region.Bottom = CON.SBI.srWindow.Bottom; + CON.save_region.Right = CON.SBI.srWindow.Right; + + CON.window_only = TRUE; + + if (read_screen_data()) { + result = TRUE; + } + } + + T(("... save original screen contents %s", result ? "ok" : "err")); + return result; +} + +static void +wcon_init(TERMINAL_CONTROL_BLOCK * TCB) +{ + T((T_CALLED("win32con::wcon_init(%p)"), TCB)); + + AssertTCB(); + + if (TCB) { + if (!InitConsole()) { + returnVoid; + } + + TCB->info.initcolor = TRUE; + TCB->info.canchange = FALSE; + TCB->info.hascolor = TRUE; + TCB->info.caninit = TRUE; + + TCB->info.maxpairs = NUMPAIRS; + TCB->info.maxcolors = 8; + TCB->info.numlabels = 0; + TCB->info.labelwidth = 0; + TCB->info.labelheight = 0; + TCB->info.nocolorvideo = 1; + TCB->info.tabsize = 8; + + TCB->info.numbuttons = CON.numButtons; + TCB->info.defaultPalette = _nc_cga_palette; + + } + returnVoid; +} + +static void +wcon_initpair(TERMINAL_CONTROL_BLOCK * TCB, + int pair, + int f, + int b) +{ + SCREEN *sp; + + if (okConsoleHandle(TCB)) { + SetSP(); + + if ((pair > 0) && (pair < NUMPAIRS) && (f >= 0) && (f < 8) + && (b >= 0) && (b < 8)) { + CON.pairs[pair] = MapColor(true, f) | MapColor(false, b); + } + } +} + +static void +wcon_initcolor(TERMINAL_CONTROL_BLOCK * TCB, + int color GCC_UNUSED, + int r GCC_UNUSED, + int g GCC_UNUSED, + int b GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_do_color(TERMINAL_CONTROL_BLOCK * TCB, + int old_pair GCC_UNUSED, + int pair GCC_UNUSED, + int reverse GCC_UNUSED, + int (*outc) (SCREEN *, int) GCC_UNUSED +) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_initmouse(TERMINAL_CONTROL_BLOCK * TCB) +{ + SCREEN *sp; + + if (okConsoleHandle(TCB)) { + SetSP(); + + sp->_mouse_type = M_TERM_DRIVER; + } +} + +static int +wcon_testmouse(TERMINAL_CONTROL_BLOCK * TCB, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc = 0; + SCREEN *sp; + + if (okConsoleHandle(TCB)) { + SetSP(); + + if (sp->_drv_mouse_head < sp->_drv_mouse_tail) { + rc = TW_MOUSE; + } else { + rc = TCBOf(sp)->drv->td_twait(TCBOf(sp), + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); + } + } + + return rc; +} + +static int +wcon_mvcur(TERMINAL_CONTROL_BLOCK * TCB, + int yold GCC_UNUSED, int xold GCC_UNUSED, + int y, int x) +{ + int ret = ERR; + if (okConsoleHandle(TCB)) { + COORD loc; + loc.X = (short) x; + loc.Y = (short) (y + AdjustY()); + SetConsoleCursorPosition(CON.hdl, loc); + ret = OK; + } + return ret; +} + +static void +wcon_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, + int labnum GCC_UNUSED, + char *text GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, + int OnFlag GCC_UNUSED) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static chtype +wcon_conattr(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED) +{ + chtype res = A_NORMAL; + res |= (A_BOLD | A_DIM | A_REVERSE | A_STANDOUT | A_COLOR); + return res; +} + +static void +wcon_setfilter(TERMINAL_CONTROL_BLOCK * TCB) +{ + SCREEN *sp; + + AssertTCB(); + SetSP(); +} + +static void +wcon_initacs(TERMINAL_CONTROL_BLOCK * TCB, + chtype *real_map GCC_UNUSED, + chtype *fake_map GCC_UNUSED) +{ +#define DATA(a,b) { a, b } + static struct { + int acs_code; + int use_code; + } table[] = { + DATA('a', 0xb1), /* ACS_CKBOARD */ + DATA('f', 0xf8), /* ACS_DEGREE */ + DATA('g', 0xf1), /* ACS_PLMINUS */ + DATA('j', 0xd9), /* ACS_LRCORNER */ + DATA('l', 0xda), /* ACS_ULCORNER */ + DATA('k', 0xbf), /* ACS_URCORNER */ + DATA('m', 0xc0), /* ACS_LLCORNER */ + DATA('n', 0xc5), /* ACS_PLUS */ + DATA('q', 0xc4), /* ACS_HLINE */ + DATA('t', 0xc3), /* ACS_LTEE */ + DATA('u', 0xb4), /* ACS_RTEE */ + DATA('v', 0xc1), /* ACS_BTEE */ + DATA('w', 0xc2), /* ACS_TTEE */ + DATA('x', 0xb3), /* ACS_VLINE */ + DATA('y', 0xf3), /* ACS_LEQUAL */ + DATA('z', 0xf2), /* ACS_GEQUAL */ + DATA('0', 0xdb), /* ACS_BLOCK */ + DATA('{', 0xe3), /* ACS_PI */ + DATA('}', 0x9c), /* ACS_STERLING */ + DATA(',', 0xae), /* ACS_LARROW */ + DATA('+', 0xaf), /* ACS_RARROW */ + DATA('~', 0xf9), /* ACS_BULLET */ + }; +#undef DATA + unsigned n; + + SCREEN *sp; + if (okConsoleHandle(TCB)) { + SetSP(); + + for (n = 0; n < SIZEOF(table); ++n) { + real_map[table[n].acs_code] = (chtype) table[n].use_code | A_ALTCHARSET; + if (sp != 0) + sp->_screen_acs_map[table[n].acs_code] = TRUE; + } + } +} + +static ULONGLONG +tdiff(FILETIME fstart, FILETIME fend) +{ + ULARGE_INTEGER ustart; + ULARGE_INTEGER uend; + ULONGLONG diff; + + ustart.LowPart = fstart.dwLowDateTime; + ustart.HighPart = fstart.dwHighDateTime; + uend.LowPart = fend.dwLowDateTime; + uend.HighPart = fend.dwHighDateTime; + + diff = (uend.QuadPart - ustart.QuadPart) / 10000; + return diff; +} + +static int +Adjust(int milliseconds, int diff) +{ + if (milliseconds != INFINITY) { + milliseconds -= diff; + if (milliseconds < 0) + milliseconds = 0; + } + return milliseconds; +} + +#define BUTTON_MASK (FROM_LEFT_1ST_BUTTON_PRESSED | \ + FROM_LEFT_2ND_BUTTON_PRESSED | \ + FROM_LEFT_3RD_BUTTON_PRESSED | \ + FROM_LEFT_4TH_BUTTON_PRESSED | \ + RIGHTMOST_BUTTON_PRESSED) + +static mmask_t +decode_mouse(SCREEN *sp, int mask) +{ + mmask_t result = 0; + + (void) sp; + assert(sp && console_initialized); + + if (mask & FROM_LEFT_1ST_BUTTON_PRESSED) + result |= BUTTON1_PRESSED; + if (mask & FROM_LEFT_2ND_BUTTON_PRESSED) + result |= BUTTON2_PRESSED; + if (mask & FROM_LEFT_3RD_BUTTON_PRESSED) + result |= BUTTON3_PRESSED; + if (mask & FROM_LEFT_4TH_BUTTON_PRESSED) + result |= BUTTON4_PRESSED; + + if (mask & RIGHTMOST_BUTTON_PRESSED) { + switch (CON.numButtons) { + case 1: + result |= BUTTON1_PRESSED; + break; + case 2: + result |= BUTTON2_PRESSED; + break; + case 3: + result |= BUTTON3_PRESSED; + break; + case 4: + result |= BUTTON4_PRESSED; + break; + } + } + + return result; +} + +static int +console_twait( + SCREEN *sp, + HANDLE fd, + int mode, + int milliseconds, + int *timeleft + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + INPUT_RECORD inp_rec; + BOOL b; + DWORD nRead = 0, rc = (DWORD) (-1); + int code = 0; + FILETIME fstart; + FILETIME fend; + int diff; + bool isImmed = (milliseconds == 0); + +#ifdef NCURSES_WGETCH_EVENTS + (void) evl; /* TODO: implement wgetch-events */ +#endif + +#define CONSUME() ReadConsoleInput(fd,&inp_rec,1,&nRead) + + assert(sp); + + TR(TRACE_IEVENT, ("start twait: %d milliseconds, mode: %d", + milliseconds, mode)); + + if (milliseconds < 0) + milliseconds = INFINITY; + + memset(&inp_rec, 0, sizeof(inp_rec)); + + while (true) { + GetSystemTimeAsFileTime(&fstart); + rc = WaitForSingleObject(fd, (DWORD) milliseconds); + GetSystemTimeAsFileTime(&fend); + diff = (int) tdiff(fstart, fend); + milliseconds = Adjust(milliseconds, diff); + + if (!isImmed && milliseconds <= 0) + break; + + if (rc == WAIT_OBJECT_0) { + if (mode) { + b = GetNumberOfConsoleInputEvents(fd, &nRead); + if (b && nRead > 0) { + b = PeekConsoleInput(fd, &inp_rec, 1, &nRead); + if (b && nRead > 0) { + switch (inp_rec.EventType) { + case KEY_EVENT: + if (mode & TW_INPUT) { + WORD vk = inp_rec.Event.KeyEvent.wVirtualKeyCode; + char ch = inp_rec.Event.KeyEvent.uChar.AsciiChar; + + if (inp_rec.Event.KeyEvent.bKeyDown) { + if (0 == ch) { + int nKey = MapKey(vk); + if (nKey < 0) { + CONSUME(); + continue; + } + } + code = TW_INPUT; + goto end; + } else { + CONSUME(); + } + } + continue; + case MOUSE_EVENT: + if (decode_mouse(sp, + (inp_rec.Event.MouseEvent.dwButtonState + & BUTTON_MASK)) == 0) { + CONSUME(); + } else if (mode & TW_MOUSE) { + code = TW_MOUSE; + goto end; + } + continue; + /* e.g., FOCUS_EVENT */ + default: + CONSUME(); + selectActiveHandle(); + continue; + } + } + } + } + continue; + } else { + if (rc != WAIT_TIMEOUT) { + code = -1; + break; + } else { + code = 0; + break; + } + } + } + end: + + TR(TRACE_IEVENT, ("end twait: returned %d (%d), remaining time %d msec", + code, errno, milliseconds)); + + if (timeleft) + *timeleft = milliseconds; + + return code; +} + +static int +wcon_twait(TERMINAL_CONTROL_BLOCK * TCB, + int mode, + int milliseconds, + int *timeleft + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + SCREEN *sp; + int code = 0; + + if (okConsoleHandle(TCB)) { + SetSP(); + + code = console_twait(sp, + CON.inp, + mode, + milliseconds, + timeleft EVENTLIST_2nd(evl)); + } + return code; +} + +static bool +handle_mouse(SCREEN *sp, MOUSE_EVENT_RECORD mer) +{ + MEVENT work; + bool result = FALSE; + + assert(sp); + + sp->_drv_mouse_old_buttons = sp->_drv_mouse_new_buttons; + sp->_drv_mouse_new_buttons = mer.dwButtonState & BUTTON_MASK; + + /* + * We're only interested if the button is pressed or released. + * FIXME: implement continuous event-tracking. + */ + if (sp->_drv_mouse_new_buttons != sp->_drv_mouse_old_buttons) { + + memset(&work, 0, sizeof(work)); + + if (sp->_drv_mouse_new_buttons) { + + work.bstate |= decode_mouse(sp, sp->_drv_mouse_new_buttons); + + } else { + + /* cf: BUTTON_PRESSED, BUTTON_RELEASED */ + work.bstate |= (decode_mouse(sp, + sp->_drv_mouse_old_buttons) + >> 1); + + result = TRUE; + } + + work.x = mer.dwMousePosition.X; + work.y = mer.dwMousePosition.Y - AdjustY(); + + sp->_drv_mouse_fifo[sp->_drv_mouse_tail] = work; + sp->_drv_mouse_tail += 1; + } + + return result; +} + +static int +wcon_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf) +{ + SCREEN *sp; + int n = -1; + + T((T_CALLED("win32con::wcon_read(%p)"), TCB)); + + assert(buf); + if (okConsoleHandle(TCB)) { + SetSP(); + + n = _nc_mingw_console_read(sp, CON.inp, buf); + } + returnCode(n); +} + +static int +wcon_nap(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int ms) +{ + T((T_CALLED("win32con::wcon_nap(%p, %d)"), TCB, ms)); + Sleep((DWORD) ms); + returnCode(OK); +} + +static int +wcon_cursorSet(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int mode) +{ + int res = -1; + + T((T_CALLED("win32con:wcon_cursorSet(%d)"), mode)); + if (okConsoleHandle(TCB)) { + CONSOLE_CURSOR_INFO this_CI = CON.save_CI; + switch (mode) { + case 0: + this_CI.bVisible = FALSE; + break; + case 1: + break; + case 2: + this_CI.dwSize = 100; + break; + } + SetConsoleCursorInfo(CON.hdl, &this_CI); + } + returnCode(res); +} + +static bool +wcon_kyExist(TERMINAL_CONTROL_BLOCK * TCB GCC_UNUSED, int keycode) +{ + WORD nKey; + void *res; + bool found = FALSE; + LONG key = GenMap(0, (WORD) keycode); + + T((T_CALLED("win32con::wcon_kyExist(%d)"), keycode)); + res = bsearch(&key, + CON.rmap, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + rkeycompare); + if (res) { + key = *((LONG *) res); + nKey = LOWORD(key); + if (!(nKey & 0x8000)) + found = TRUE; + } + returnCode(found); +} + +static int +wcon_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag GCC_UNUSED) +{ + SCREEN *sp; + int code = ERR; + + T((T_CALLED("win32con::wcon_kpad(%p, %d)"), TCB, flag)); + + if (okConsoleHandle(TCB)) { + SetSP(); + + if (sp) { + code = OK; + } + } + returnCode(code); +} + +static int +wcon_keyok(TERMINAL_CONTROL_BLOCK * TCB, + int keycode, + int flag) +{ + int code = ERR; + SCREEN *sp; + WORD nKey; + WORD vKey; + void *res; + LONG key = GenMap(0, (WORD) keycode); + + T((T_CALLED("win32con::wcon_keyok(%p, %d, %d)"), TCB, keycode, flag)); + + if (okConsoleHandle(TCB)) { + SetSP(); + + if (sp) { + res = bsearch(&key, + CON.rmap, + (size_t) (N_INI + FKEYS), + sizeof(keylist[0]), + rkeycompare); + if (res) { + key = *((LONG *) res); + vKey = HIWORD(key); + nKey = (LOWORD(key)) & 0x7fff; + if (!flag) + nKey |= 0x8000; + *(LONG *) res = GenMap(vKey, nKey); + } + } + } + returnCode(code); +} + +NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_WIN_DRIVER = { + FALSE, + wcon_name, /* Name */ + wcon_CanHandle, /* CanHandle */ + wcon_init, /* init */ + wcon_release, /* release */ + wcon_size, /* size */ + wcon_sgmode, /* sgmode */ + wcon_conattr, /* conattr */ + wcon_mvcur, /* hwcur */ + wcon_mode, /* mode */ + wcon_rescol, /* rescol */ + wcon_rescolors, /* rescolors */ + wcon_setcolor, /* color */ + wcon_dobeepflash, /* DoBeepFlash */ + wcon_initpair, /* initpair */ + wcon_initcolor, /* initcolor */ + wcon_do_color, /* docolor */ + wcon_initmouse, /* initmouse */ + wcon_testmouse, /* testmouse */ + wcon_setfilter, /* setfilter */ + wcon_hwlabel, /* hwlabel */ + wcon_hwlabelOnOff, /* hwlabelOnOff */ + wcon_doupdate, /* update */ + wcon_defaultcolors, /* defaultcolors */ + wcon_print, /* print */ + wcon_size, /* getsize */ + wcon_setsize, /* setsize */ + wcon_initacs, /* initacs */ + wcon_screen_init, /* scinit */ + wcon_wrap, /* scexit */ + wcon_twait, /* twait */ + wcon_read, /* read */ + wcon_nap, /* nap */ + wcon_kpad, /* kpad */ + wcon_keyok, /* kyOk */ + wcon_kyExist, /* kyExist */ + wcon_cursorSet /* cursorSet */ +}; + +/* --------------------------------------------------------- */ + +static HANDLE +get_handle(int fd) +{ + intptr_t value = _get_osfhandle(fd); + return (HANDLE) value; +} + +#if WINVER >= 0x0600 +/* This function tests, whether or not the ncurses application + is running as a descendant of MSYS2/cygwin mintty terminal + application. mintty doesn't use Windows Console for its screen + I/O, so the native Windows _isatty doesn't recognize it as + character device. But we can discover we are at the end of an + Pipe and can query to server side of the pipe, looking whether + or not this is mintty. + */ +static int +_ismintty(int fd, LPHANDLE pMinTTY) +{ + HANDLE handle = get_handle(fd); + DWORD dw; + int code = 0; + + T((T_CALLED("win32con::_ismintty(%d, %p)"), fd, pMinTTY)); + + if (handle != INVALID_HANDLE_VALUE) { + dw = GetFileType(handle); + if (dw == FILE_TYPE_PIPE) { + if (GetNamedPipeInfo(handle, 0, 0, 0, 0)) { + ULONG pPid; + /* Requires NT6 */ + if (GetNamedPipeServerProcessId(handle, &pPid)) { + TCHAR buf[MAX_PATH]; + DWORD len = 0; + /* These security attributes may allow us to + create a remote thread in mintty to manipulate + the terminal state remotely */ + HANDLE pHandle = OpenProcess( + PROCESS_CREATE_THREAD + | PROCESS_QUERY_INFORMATION + | PROCESS_VM_OPERATION + | PROCESS_VM_WRITE + | PROCESS_VM_READ, + FALSE, + pPid); + if (pMinTTY) + *pMinTTY = INVALID_HANDLE_VALUE; + if (pHandle != INVALID_HANDLE_VALUE) { + if ((len = GetProcessImageFileName( + pHandle, + buf, + (DWORD) + array_length(buf)))) { + TCHAR *pos = _tcsrchr(buf, _T('\\')); + if (pos) { + pos++; + if (_tcsnicmp(pos, _TEXT("mintty.exe"), 10) + == 0) { + if (pMinTTY) + *pMinTTY = pHandle; + code = 1; + } + } + } + } + } + } + } + } + returnCode(code); +} +#endif + +/* Borrowed from ansicon project. + Check whether or not an I/O handle is associated with + a Windows console. +*/ +static BOOL +IsConsoleHandle(HANDLE hdl) +{ + DWORD dwFlag = 0; + BOOL result; + + if (!GetConsoleMode(hdl, &dwFlag)) { + result = (int) WriteConsoleA(hdl, NULL, 0, &dwFlag, NULL); + } else { + result = (int) (dwFlag & ENABLE_PROCESSED_OUTPUT); + } + return result; +} + +/* Our replacement for the systems _isatty to include also + a test for mintty. This is called from the NC_ISATTY macro + defined in curses.priv.h + */ +int +_nc_mingw_isatty(int fd) +{ + int result = 0; + + if (SysISATTY(fd)) { + result = 1; + } else { +#if WINVER >= 0x0600 + result = _ismintty(fd, NULL); +#endif + } + return result; +} + +/* This is used when running in terminfo mode to discover, + whether or not the "terminal" is actually a Windows + Console. It is the responsibility of the console to deal + with the terminal escape sequences that are sent by + terminfo. + */ +int +_nc_mingw_isconsole(int fd) +{ + HANDLE hdl = get_handle(fd); + int code = 0; + + T((T_CALLED("win32con::_nc_mingw_isconsole(%d)"), fd)); + + code = (int) IsConsoleHandle(hdl); + + returnCode(code); +} + +#define TC_PROLOGUE(fd) \ + SCREEN *sp; \ + TERMINAL *term = 0; \ + int code = ERR; \ + if (_nc_screen_chain == 0) \ + return 0; \ + for (each_screen(sp)) { \ + if (sp->_term && (sp->_term->Filedes == fd)) { \ + term = sp->_term; \ + break; \ + } \ + } \ + assert(term != 0) + +int +_nc_mingw_tcsetattr( + int fd, + int optional_action GCC_UNUSED, + const struct termios *arg) +{ + TC_PROLOGUE(fd); + + if (_nc_mingw_isconsole(fd)) { + DWORD dwFlag = 0; + HANDLE ofd = get_handle(fd); + if (ofd != INVALID_HANDLE_VALUE) { + if (arg) { + if (arg->c_lflag & ICANON) + dwFlag |= ENABLE_LINE_INPUT; + else + dwFlag = dwFlag & (DWORD) (~ENABLE_LINE_INPUT); + + if (arg->c_lflag & ECHO) + dwFlag = dwFlag | ENABLE_ECHO_INPUT; + else + dwFlag = dwFlag & (DWORD) (~ENABLE_ECHO_INPUT); + + if (arg->c_iflag & BRKINT) + dwFlag |= ENABLE_PROCESSED_INPUT; + else + dwFlag = dwFlag & (DWORD) (~ENABLE_PROCESSED_INPUT); + } + dwFlag |= ENABLE_MOUSE_INPUT; + SetConsoleMode(ofd, dwFlag); + code = OK; + } + } + if (arg) + term->Nttyb = *arg; + + return code; +} + +int +_nc_mingw_tcgetattr(int fd, struct termios *arg) +{ + TC_PROLOGUE(fd); + + if (_nc_mingw_isconsole(fd)) { + if (arg) + *arg = term->Nttyb; + } + return code; +} + +int +_nc_mingw_tcflush(int fd, int queue) +{ + int code = ERR; + + if (_nc_mingw_isconsole(fd)) { + if (queue == TCIFLUSH) { + code = (FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)) + ? OK + : (int) GetLastError()); + } + } + return code; +} + +int +_nc_mingw_testmouse( + SCREEN *sp, + HANDLE fd, + int delay + EVENTLIST_2nd(_nc_eventlist * evl)) +{ + int rc = 0; + + assert(sp); + + if (sp->_drv_mouse_head < sp->_drv_mouse_tail) { + rc = TW_MOUSE; + } else { + rc = console_twait(sp, + fd, + TWAIT_MASK, + delay, + (int *) 0 + EVENTLIST_2nd(evl)); + } + return rc; +} + +int +_nc_mingw_console_read( + SCREEN *sp, + HANDLE fd, + int *buf) +{ + int rc = -1; + INPUT_RECORD inp_rec; + BOOL b; + DWORD nRead; + WORD vk; + + assert(sp); + assert(buf); + + memset(&inp_rec, 0, sizeof(inp_rec)); + + T((T_CALLED("_nc_mingw_console_read(%p)"), sp)); + + while ((b = ReadConsoleInput(fd, &inp_rec, 1, &nRead))) { + if (b && nRead > 0) { + if (rc < 0) + rc = 0; + rc = rc + (int) nRead; + if (inp_rec.EventType == KEY_EVENT) { + if (!inp_rec.Event.KeyEvent.bKeyDown) + continue; + *buf = (int) inp_rec.Event.KeyEvent.uChar.AsciiChar; + vk = inp_rec.Event.KeyEvent.wVirtualKeyCode; + /* + * There are 24 virtual function-keys (defined in winuser.h), + * and typically 12 function-keys on a keyboard. Use the + * shift-modifier to provide the remaining keys. + */ + if (vk >= VK_F1 && vk <= VK_F12) { + if (inp_rec.Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED) { + vk = (WORD) (vk + 12); + } + } + if (*buf == 0) { + int key = MapKey(vk); + if (key < 0) + continue; + if (sp->_keypad_on) { + *buf = key; + } else { + ungetch('\0'); + *buf = AnsiKey(vk); + } + } else if (vk == VK_BACK) { + if (!(inp_rec.Event.KeyEvent.dwControlKeyState + & (SHIFT_PRESSED | CONTROL_PRESSED))) { + *buf = KEY_BACKSPACE; + } + } + break; + } else if (inp_rec.EventType == MOUSE_EVENT) { + if (handle_mouse(sp, + inp_rec.Event.MouseEvent)) { + *buf = KEY_MOUSE; + break; + } + } + continue; + } + } + returnCode(rc); +} + +static bool +InitConsole(void) +{ + /* initialize once, or not at all */ + if (!console_initialized) { + int i; + DWORD num_buttons; + WORD a; + BOOL buffered = TRUE; + BOOL b; + + START_TRACE(); + + for (i = 0; i < (N_INI + FKEYS); i++) { + if (i < N_INI) { + CON.rmap[i] = CON.map[i] = + (DWORD) keylist[i]; + CON.ansi_map[i] = (DWORD) ansi_keys[i]; + } else { + CON.rmap[i] = CON.map[i] = + (DWORD) GenMap((VK_F1 + (i - N_INI)), + (KEY_F(1) + (i - N_INI))); + CON.ansi_map[i] = + (DWORD) GenMap((VK_F1 + (i - N_INI)), + (';' + (i - N_INI))); + } + } + qsort(CON.ansi_map, + (size_t) (MAPSIZE), + sizeof(keylist[0]), + keycompare); + qsort(CON.map, + (size_t) (MAPSIZE), + sizeof(keylist[0]), + keycompare); + qsort(CON.rmap, + (size_t) (MAPSIZE), + sizeof(keylist[0]), + rkeycompare); + + if (GetNumberOfConsoleMouseButtons(&num_buttons)) { + CON.numButtons = (int) num_buttons; + } else { + CON.numButtons = 1; + } + + a = MapColor(true, COLOR_WHITE) | MapColor(false, COLOR_BLACK); + for (i = 0; i < NUMPAIRS; i++) + CON.pairs[i] = a; + + b = AllocConsole(); + + if (!b) + b = AttachConsole(ATTACH_PARENT_PROCESS); + + CON.inp = GetDirectHandle("CONIN$", FILE_SHARE_READ); + CON.out = GetDirectHandle("CONOUT$", FILE_SHARE_WRITE); + + if (getenv("NCGDB") || getenv("NCURSES_CONSOLE2")) { + T(("... will not buffer console")); + buffered = FALSE; + CON.hdl = CON.out; + } else { + T(("... creating console buffer")); + CON.hdl = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + CONSOLE_TEXTMODE_BUFFER, + NULL); + } + + if (CON.hdl != INVALID_HANDLE_VALUE) { + CON.buffered = buffered; + get_SBI(); + CON.save_SBI = CON.SBI; + if (!buffered) { + save_original_screen(); + set_scrollback(FALSE, &CON.SBI); + } + GetConsoleCursorInfo(CON.hdl, &CON.save_CI); + T(("... initial cursor is %svisible, %d%%", + (CON.save_CI.bVisible ? "" : "not-"), + (int) CON.save_CI.dwSize)); + } + + console_initialized = TRUE; + } + return (CON.hdl != INVALID_HANDLE_VALUE); +} + +static bool +okConsoleHandle(TERMINAL_CONTROL_BLOCK * TCB) +{ + return ((TCB != 0) && + (TCB->magic == WINMAGIC) && + InitConsole()); +} + +/* + * While a constructor would ensure that this module is initialized, that will + * interfere with applications that may combine this with GUI interfaces. + */ +#if 0 +static +__attribute__((constructor)) + void _enter_console(void) +{ + (void) InitConsole(); +} +#endif diff --git a/contrib/ncurses/package/debian-mingw/changelog b/contrib/ncurses/package/debian-mingw/changelog new file mode 100644 index 00000000..fb081e98 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/changelog @@ -0,0 +1,11 @@ +ncurses6td (6.5+20241102) unstable; urgency=low + + * latest weekly patch + + -- Thomas E. Dickey Sat, 02 Nov 2024 05:59:53 -0400 + +ncurses6 (5.9+20131005) unstable; urgency=low + + * initial release + + -- Thomas E. Dickey Sat, 05 Oct 2013 13:35:29 -0400 diff --git a/contrib/ncurses/package/debian-mingw/compat b/contrib/ncurses/package/debian-mingw/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/package/debian-mingw/control b/contrib/ncurses/package/debian-mingw/control new file mode 100644 index 00000000..e442255c --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/control @@ -0,0 +1,22 @@ +Source: ncurses6td +Section: libdevel +Priority: optional +Maintainer: Thomas E. Dickey +Homepage: https://invisible-island.net/ncurses/ +Build-Depends: debhelper (>= 7), + gcc-mingw-w64-i686, + g++-mingw-w64-i686, + binutils-mingw-w64-i686 +Standards-Version: 4.6.1.0 + +Package: mingw32-ncurses6td +Architecture: any +Conflicts: mingw32-ncurses6 +Provides: mingw32-ncurses6 +Replaces: mingw32-ncurses6 +Depends: ${misc:Depends} +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package is used for testing ABI 6 with the MinGW 32-bit port. diff --git a/contrib/ncurses/package/debian-mingw/copyright b/contrib/ncurses/package/debian-mingw/copyright new file mode 100644 index 00000000..32396640 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/copyright @@ -0,0 +1,100 @@ +Upstream source https://invisible-island.net/ncurses/ncurses.html +This package is used for testing builds of ncurses. + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 by Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 1996-2023,2024 by Thomas E. Dickey +License: X11 + +Files: doc/html/NCURSES-Programming-HOWTO.html +Copyright: 2001 by Pradeep Padala +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + +------------------------------------------------------------------------------- +Files: progs/tset.c ncurses/tinfo/read_termcap.c +Copyright: 1980,1991,1992,1993 The Regents of the University of California. +License: BSD + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/package/debian-mingw/mingw32-ncurses6td.lintian-overrides b/contrib/ncurses/package/debian-mingw/mingw32-ncurses6td.lintian-overrides new file mode 100644 index 00000000..8dea2a95 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/mingw32-ncurses6td.lintian-overrides @@ -0,0 +1,7 @@ +mingw32-ncurses6td: latest-debian-changelog-entry-changed-to-native + +mingw32-ncurses6td: non-standard-dir-in-usr +mingw32-ncurses6td: file-in-unusual-dir + +mingw32-ncurses6td: binary-without-manpage +mingw32-ncurses6td: executable-not-elf-or-script diff --git a/contrib/ncurses/package/debian-mingw/rules b/contrib/ncurses/package/debian-mingw/rules new file mode 100755 index 00000000..aada7641 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/rules @@ -0,0 +1,150 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +MY_ABI=6 + +BUILD_CC = gcc + +CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +TARGET = i686-w64-mingw32 +MINGW_BIN = /usr/bin +MINGW_TOP = /usr/$(TARGET) +MINGW_TMP = $(CURDIR)/debian/mingw32-ncurses$(MY_ABI)td + +CFLAGS = $(CC_NORMAL) + +verbose = # -v + +CONFIG_OPTIONS = \ + --disable-db-install \ + --disable-echo \ + --disable-getcap \ + --disable-hard-tabs \ + --disable-leaks \ + --disable-macros \ + --disable-overwrite \ + --disable-termcap \ + --enable-interop \ + --enable-opaque-curses \ + --enable-opaque-form \ + --enable-opaque-menu \ + --enable-opaque-panel \ + --enable-pc-files \ + --enable-term-driver \ + --enable-warnings \ + --enable-widec \ + --verbose \ + --with-abi-version=$(MY_ABI) \ + --with-cxx-shared \ + --with-develop \ + --with-fallbacks=unknown,ms-terminal,xterm-256color \ + --with-tic-path=/usr/bin/tic$(MY_ABI) \ + --with-infocmp-path=/usr/bin/infocmp$(MY_ABI) \ + --with-shared \ + --with-trace \ + --with-xterm-kbs=DEL \ + --without-ada \ + --without-debug \ + --without-manpages \ + --without-progs \ + --without-tests + +export CFLAGS BUILD_CC + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +configure: configure-stamp +configure-stamp: + dh_testdir + + CC=$(TARGET)-gcc \ + CFLAGS="$(CFLAGS)" \ + ./configure \ + --host=$(TARGET) \ + --target=$(TARGET) \ + --prefix=$(MINGW_TOP) \ + --with-build-cc=$(BUILD_CC) \ + --with-config-suffix=td \ + --with-pc-suffix=$(MY_ABI)td \ + --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig \ + $(CONFIG_OPTIONS) + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f makefile ] || $(MAKE) distclean + + rm -f configure-stamp build-stamp install-stamp + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_prep + dh_installdirs $(verbose) + + $(MAKE) install.libs DESTDIR=$(MINGW_TMP) + + mkdir -p $(MINGW_TMP)$(MINGW_BIN) + for name in $(MINGW_TMP)$(MINGW_TOP)/bin/*-config; \ + do \ + base=`basename $$name`; \ + ln -v $$name $(MINGW_TMP)$(MINGW_BIN)/$(TARGET)-$$base; \ + done + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# No binary-indep target. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot $(verbose) + dh_lintian $(verbose) + dh_installdocs $(verbose) + dh_installchangelogs $(verbose) NEWS + # dh_strip + dh_compress $(verbose) + dh_fixperms $(verbose) + dh_installdeb $(verbose) + dh_shlibdeps $(verbose) + dh_gencontrol $(verbose) + dh_md5sums $(verbose) + dh_builddeb $(verbose) + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/contrib/ncurses/package/debian-mingw/source/format b/contrib/ncurses/package/debian-mingw/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/package/debian-mingw/watch b/contrib/ncurses/package/debian-mingw/watch new file mode 100644 index 00000000..11c22c5a --- /dev/null +++ b/contrib/ncurses/package/debian-mingw/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/ncurses/current/ncurses\.tar.gz \ + debian uupdate diff --git a/contrib/ncurses/package/debian-mingw64/changelog b/contrib/ncurses/package/debian-mingw64/changelog new file mode 100644 index 00000000..fb081e98 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/changelog @@ -0,0 +1,11 @@ +ncurses6td (6.5+20241102) unstable; urgency=low + + * latest weekly patch + + -- Thomas E. Dickey Sat, 02 Nov 2024 05:59:53 -0400 + +ncurses6 (5.9+20131005) unstable; urgency=low + + * initial release + + -- Thomas E. Dickey Sat, 05 Oct 2013 13:35:29 -0400 diff --git a/contrib/ncurses/package/debian-mingw64/compat b/contrib/ncurses/package/debian-mingw64/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/package/debian-mingw64/control b/contrib/ncurses/package/debian-mingw64/control new file mode 100644 index 00000000..7094a176 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/control @@ -0,0 +1,22 @@ +Source: ncurses6td +Section: libdevel +Priority: optional +Maintainer: Thomas E. Dickey +Homepage: https://invisible-island.net/ncurses/ +Build-Depends: debhelper (>= 7), + gcc-mingw-w64-x86-64, + g++-mingw-w64-x86-64, + binutils-mingw-w64-x86-64 +Standards-Version: 4.6.1.0 + +Package: mingw64-ncurses6td +Architecture: any +Conflicts: mingw64-ncurses6 +Provides: mingw64-ncurses6 +Replaces: mingw64-ncurses6 +Depends: ${misc:Depends} +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package is used for testing ABI 6 with the MinGW 64-bit port. diff --git a/contrib/ncurses/package/debian-mingw64/copyright b/contrib/ncurses/package/debian-mingw64/copyright new file mode 100644 index 00000000..32396640 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/copyright @@ -0,0 +1,100 @@ +Upstream source https://invisible-island.net/ncurses/ncurses.html +This package is used for testing builds of ncurses. + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 by Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 1996-2023,2024 by Thomas E. Dickey +License: X11 + +Files: doc/html/NCURSES-Programming-HOWTO.html +Copyright: 2001 by Pradeep Padala +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + +------------------------------------------------------------------------------- +Files: progs/tset.c ncurses/tinfo/read_termcap.c +Copyright: 1980,1991,1992,1993 The Regents of the University of California. +License: BSD + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/package/debian-mingw64/mingw64-ncurses6td.lintian-overrides b/contrib/ncurses/package/debian-mingw64/mingw64-ncurses6td.lintian-overrides new file mode 100644 index 00000000..f475ec0f --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/mingw64-ncurses6td.lintian-overrides @@ -0,0 +1,7 @@ +mingw64-ncurses6td: latest-debian-changelog-entry-changed-to-native + +mingw64-ncurses6td: non-standard-dir-in-usr +mingw64-ncurses6td: file-in-unusual-dir + +mingw64-ncurses6td: binary-without-manpage +mingw64-ncurses6td: executable-not-elf-or-script diff --git a/contrib/ncurses/package/debian-mingw64/rules b/contrib/ncurses/package/debian-mingw64/rules new file mode 100755 index 00000000..29c80b41 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/rules @@ -0,0 +1,150 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +MY_ABI=6 + +BUILD_CC = gcc + +CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +TARGET = x86_64-w64-mingw32 +MINGW_BIN = /usr/bin +MINGW_TOP = /usr/$(TARGET) +MINGW_TMP = $(CURDIR)/debian/mingw64-ncurses$(MY_ABI)td + +CFLAGS = $(CC_NORMAL) + +verbose = # -v + +CONFIG_OPTIONS = \ + --disable-db-install \ + --disable-echo \ + --disable-getcap \ + --disable-hard-tabs \ + --disable-leaks \ + --disable-macros \ + --disable-overwrite \ + --disable-termcap \ + --enable-interop \ + --enable-opaque-curses \ + --enable-opaque-form \ + --enable-opaque-menu \ + --enable-opaque-panel \ + --enable-pc-files \ + --enable-term-driver \ + --enable-warnings \ + --enable-widec \ + --verbose \ + --with-abi-version=$(MY_ABI) \ + --with-cxx-shared \ + --with-develop \ + --with-fallbacks=unknown,ms-terminal,xterm-256color \ + --with-tic-path=/usr/bin/tic$(MY_ABI) \ + --with-infocmp-path=/usr/bin/infocmp$(MY_ABI) \ + --with-shared \ + --with-trace \ + --with-xterm-kbs=DEL \ + --without-ada \ + --without-debug \ + --without-manpages \ + --without-progs \ + --without-tests + +export CFLAGS BUILD_CC + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +configure: configure-stamp +configure-stamp: + dh_testdir + + CC=$(TARGET)-gcc \ + CFLAGS="$(CFLAGS)" \ + ./configure \ + --host=$(TARGET) \ + --target=$(TARGET) \ + --prefix=$(MINGW_TOP) \ + --with-build-cc=$(BUILD_CC) \ + --with-config-suffix=td \ + --with-pc-suffix=$(MY_ABI)td \ + --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig \ + $(CONFIG_OPTIONS) + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f makefile ] || $(MAKE) distclean + + rm -f configure-stamp build-stamp install-stamp + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_prep + dh_installdirs $(verbose) + + $(MAKE) install.libs DESTDIR=$(MINGW_TMP) + + mkdir -p $(MINGW_TMP)$(MINGW_BIN) + for name in $(MINGW_TMP)$(MINGW_TOP)/bin/*-config; \ + do \ + base=`basename $$name`; \ + ln -v $$name $(MINGW_TMP)$(MINGW_BIN)/$(TARGET)-$$base; \ + done + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# No binary-indep target. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot $(verbose) + dh_lintian $(verbose) + dh_installdocs $(verbose) + dh_installchangelogs $(verbose) NEWS + # dh_strip + dh_compress $(verbose) + dh_fixperms $(verbose) + dh_installdeb $(verbose) + dh_shlibdeps $(verbose) + dh_gencontrol $(verbose) + dh_md5sums $(verbose) + dh_builddeb $(verbose) + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/contrib/ncurses/package/debian-mingw64/source/format b/contrib/ncurses/package/debian-mingw64/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/package/debian-mingw64/watch b/contrib/ncurses/package/debian-mingw64/watch new file mode 100644 index 00000000..11c22c5a --- /dev/null +++ b/contrib/ncurses/package/debian-mingw64/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/ncurses/current/ncurses\.tar.gz \ + debian uupdate diff --git a/contrib/ncurses/package/debian/changelog b/contrib/ncurses/package/debian/changelog new file mode 100644 index 00000000..f7518ac9 --- /dev/null +++ b/contrib/ncurses/package/debian/changelog @@ -0,0 +1,11 @@ +ncurses6td (6.5+20241102) unstable; urgency=low + + * latest weekly patch + + -- Thomas E. Dickey Sat, 02 Nov 2024 05:59:53 -0400 + +ncurses6 (5.9+20120608) unstable; urgency=low + + * initial release + + -- Thomas E. Dickey Fri, 08 Jun 2012 07:54:29 -0400 diff --git a/contrib/ncurses/package/debian/compat b/contrib/ncurses/package/debian/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/package/debian/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/package/debian/control b/contrib/ncurses/package/debian/control new file mode 100644 index 00000000..3b99ac17 --- /dev/null +++ b/contrib/ncurses/package/debian/control @@ -0,0 +1,56 @@ +Source: ncurses6td +Section: libdevel +Priority: optional +Maintainer: Thomas E. Dickey +Homepage: https://invisible-island.net/ncurses/ +Build-Depends: debhelper (>= 8.1.3) +Standards-Version: 4.6.1.0 + +Package: ncurses6td +Architecture: any +Conflicts: ncurses6 (>= 6.5) +Provides: ncurses6 (= 6.5) +Replaces: ncurses6 (>= 6.5) +Depends: ${misc:Depends}, libc6 (>= 2.4) +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package is used for testing ABI 6. + +Package: ncursest6td +Architecture: any +Conflicts: ncursest6 (>= 6.5) +Provides: ncursest6 (= 6.5) +Replaces: ncursest6 (>= 6.5) +Depends: ${misc:Depends}, libc6 (>= 2.4) +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package is used for testing ABI 6 with pthreads. + +Package: ncurses6td-doc +Section: doc +Architecture: all +Conflicts: ncurses6-doc +Provides: ncurses6-doc +Replaces: ncurses6-doc +Depends: groff-base +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package is used for testing ncurses6 document packaging. + +Package: ncurses6td-doc-html +Section: doc +Architecture: all +Conflicts: ncurses6-doc-html +Provides: ncurses6-doc-html +Replaces: ncurses6-doc-html +Description: shared libraries for terminal handling + The ncurses library routines are a terminal-independent method of + updating character screens with reasonable optimization. + . + This package is used for testing ncurses6 document packaging. diff --git a/contrib/ncurses/package/debian/copyright b/contrib/ncurses/package/debian/copyright new file mode 100644 index 00000000..32396640 --- /dev/null +++ b/contrib/ncurses/package/debian/copyright @@ -0,0 +1,100 @@ +Upstream source https://invisible-island.net/ncurses/ncurses.html +This package is used for testing builds of ncurses. + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 by Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 1996-2023,2024 by Thomas E. Dickey +License: X11 + +Files: doc/html/NCURSES-Programming-HOWTO.html +Copyright: 2001 by Pradeep Padala +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + +------------------------------------------------------------------------------- +Files: progs/tset.c ncurses/tinfo/read_termcap.c +Copyright: 1980,1991,1992,1993 The Regents of the University of California. +License: BSD + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/package/debian/ncurses6td.lintian-overrides b/contrib/ncurses/package/debian/ncurses6td.lintian-overrides new file mode 100644 index 00000000..dd49fcde --- /dev/null +++ b/contrib/ncurses/package/debian/ncurses6td.lintian-overrides @@ -0,0 +1,9 @@ +# This is intentional. +ncurses6td: package-name-doesnt-match-sonames libformw6-6 libmenuw6-6 libncurses++w6-6 libncursesw6-6 libpanelw6-6 libticw6-6 libtinfow6-6 + +# This is intentional. +ncurses6td: binary-without-manpage +ncurses6td: non-dev-pkg-with-shlib-symlink +ncurses6td: embedded-library ncurses [usr/lib/x86_64-linux-gnu/libtinfow6.so.6.5] + +# vile: confmode diff --git a/contrib/ncurses/package/debian/ncurses6td.triggers b/contrib/ncurses/package/debian/ncurses6td.triggers new file mode 100644 index 00000000..dd866036 --- /dev/null +++ b/contrib/ncurses/package/debian/ncurses6td.triggers @@ -0,0 +1 @@ +activate-noawait ldconfig diff --git a/contrib/ncurses/package/debian/ncursest6td.lintian-overrides b/contrib/ncurses/package/debian/ncursest6td.lintian-overrides new file mode 100644 index 00000000..0a5eccc1 --- /dev/null +++ b/contrib/ncurses/package/debian/ncursest6td.lintian-overrides @@ -0,0 +1,9 @@ +# This is intentional. +ncursest6td: package-name-doesnt-match-sonames libformtw6-6 libmenutw6-6 libncurses++tw6-6 libncursestw6-6 libpaneltw6-6 libtictw6-6 libtinfotw6-6 + +# This is intentional. +ncursest6td: binary-without-manpage +ncursest6td: non-dev-pkg-with-shlib-symlink +ncursest6td: embedded-library ncurses [usr/lib/x86_64-linux-gnu/libtinfotw6.so.6.5] + +# vile: confmode diff --git a/contrib/ncurses/package/debian/ncursest6td.triggers b/contrib/ncurses/package/debian/ncursest6td.triggers new file mode 100644 index 00000000..dd866036 --- /dev/null +++ b/contrib/ncurses/package/debian/ncursest6td.triggers @@ -0,0 +1 @@ +activate-noawait ldconfig diff --git a/contrib/ncurses/package/debian/rules b/contrib/ncurses/package/debian/rules new file mode 100755 index 00000000..f1f10fe6 --- /dev/null +++ b/contrib/ncurses/package/debian/rules @@ -0,0 +1,289 @@ +#!/usr/bin/make -f +# $Id: rules,v 1.57 2024/06/08 17:51:52 tom Exp $ + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +SHELL = /bin/bash +DPKG_EXPORT_BUILDFLAGS = 1 + +export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +include /usr/share/dpkg/buildflags.mk + +# packages +PACKAGES.indep = ncurses6td-doc ncurses6td-doc-html +PACKAGES.arch = ncurses6td ncursest6td + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) + +CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +MY_ABI=6 +MY_DIR=/usr +BINDIR=$(MY_DIR)/bin +LIBDIR=$(MY_DIR)/lib/$(DEB_HOST_MULTIARCH) +MYDATA=/usr/local/ncurses/share/terminfo +NORMAL_DIR=$(CURDIR)/debian/ncurses$(MY_ABI) +THREAD_DIR=$(CURDIR)/debian/ncursest$(MY_ABI) + +CFLAGS += $(CC_NORMAL) + +ifneq ($(MY_DIR),/usr) + RPATH_ENV = RPATH_LIST=../lib:$(LIBDIR) + RPATH_OPT = --enable-rpath +else + RPATH_ENV = + RPATH_OPT = --disable-rpath --disable-rpath-hack +endif + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +verbose = # -v + +configure = \ + $(RPATH_ENV) \ + CFLAGS="$(CFLAGS)" \ + CPPFLAGS="$(CPPFLAGS)" \ + LDFLAGS="$(LDFLAGS)" ../../configure $(RPATH_OPT) \ + --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --prefix=$(MY_DIR) \ + --libdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \ + --disable-echo \ + --disable-getcap \ + --disable-leaks \ + --disable-macros \ + --disable-overwrite \ + --disable-relink \ + --disable-root-access \ + --disable-root-environ \ + --disable-termcap \ + --enable-check-size \ + --enable-hard-tabs \ + --enable-opaque-curses \ + --enable-opaque-form \ + --enable-opaque-menu \ + --enable-opaque-panel \ + --enable-pc-files \ + --enable-stdnoreturn \ + --enable-warnings \ + --enable-wgetch-events \ + --enable-widec \ + --enable-xmc-glitch \ + --program-suffix=$(MY_ABI) \ + --verbose \ + --with-abi-version=$(MY_ABI) \ + --with-config-suffix=td \ + --with-pc-suffix=td \ + --with-cxx-shared \ + --with-default-terminfo-dir=$(MYDATA) \ + --with-develop \ + --with-extra-suffix=$(MY_ABI) \ + --with-shared \ + --with-terminfo-dirs=$(MYDATA):/lib/terminfo:/usr/share/terminfo \ + --with-termlib \ + --with-ticlib \ + --with-trace \ + --with-versioned-syms \ + --with-xterm-kbs=DEL \ + --without-ada \ + --without-debug \ + --with-manpage-aliases \ + --with-manpage-symlinks \ + --without-normal + +NCURSES6_DIR = $(CURDIR)/debian/ncurses6td +NCURSEST6_DIR = $(CURDIR)/debian/ncursest6td + +.PHONY: all config build install binary clean config-indep config-arch \ + build-indep build-arch install-indep install-arch binary-indep \ + binary-arch + +all: build + +config: config-indep config-arch +build: build-indep build-arch +install: install-indep install-arch +binary: binary-indep binary-arch +clean: + pwd; ls -l + dh_testdir + dh_testroot + dh_clean $(verbose) + rm -rf t + +config-indep: $(PACKAGES.indep:%=config-%-stamp) +config-arch: $(PACKAGES.arch:%=config-%-stamp) + +build-indep: $(PACKAGES.indep:%=build-%-stamp) +build-arch: $(PACKAGES.arch:%=build-%-stamp) + +install-indep: $(PACKAGES.indep:%=install-%-stamp) +install-arch: $(PACKAGES.arch:%=install-%-stamp) + +# make the doc-package installable by renaming everything to avoid clashing +patch-ncurses6td-stamp: + dh_testdir + sed -i.bak \ + -e 's/-config\.1$$/dev-config.1/;t' \ + -e 's/\.3ncurses$$/.3ncurses6/' \ + -e 's/\.3curses$$/.3curses6/' \ + -e 's/\.3form$$/.3form6/' \ + -e 's/\.3menu$$/.3menu6/' \ + -e 's/\.3panel$$/.3panel6/' \ + -e 's/\.\([157]\)$$/6.\1/' \ + man/man_db.renames.in + diff -u man/man_db.renames.in.bak man/man_db.renames.in || true + touch $@ + +config-ncurses6td-stamp: patch-ncurses6td-stamp + dh_testdir + rm -rf t/ncurses6td + mkdir -p t/ncurses6td + cd t/ncurses6td; $(configure) + touch $@ + +config-ncursest6td-stamp: patch-ncurses6td-stamp + dh_testdir + rm -rf t/ncursest6td + mkdir -p t/ncursest6td + cd t/ncursest6td; $(configure) \ + --enable-interop \ + --enable-sp-funcs \ + --program-suffix=t$(MY_ABI) \ + --with-pthread + touch $@ + +config-ncurses6td-doc-stamp \ +config-ncurses6td-doc-html-stamp: config-ncurses6td-stamp + touch $@ + +build-ncurses6td-stamp: config-ncurses6td-stamp + dh_testdir + + $(MAKE) -C t/ncurses6td + + touch $@ + +build-ncursest6td-stamp: config-ncursest6td-stamp + dh_testdir + + $(MAKE) -C t/ncursest6td + + touch $@ + +build-ncurses6td-doc-stamp \ +build-ncurses6td-doc-html-stamp: build-ncurses6td-stamp + touch $@ + +install-ncurses6td-stamp: build-ncurses6td-stamp + dh_testdir + dh_testroot + dh_installdirs $(verbose) + dh_prep $(verbose) -pncurses6td + + $(MAKE) -C t/ncurses6td install.libs install.progs DESTDIR=$(NCURSES6_DIR) + $(MAKE) -C t/ncurses6td/test ncurses LOCAL_LIBDIR=$(LIBDIR) + + mv t/ncurses6td/test/ncurses $(NCURSES6_DIR)$(BINDIR)/ncurses$(MY_ABI) + + touch $@ + +install-ncursest6td-stamp: build-ncursest6td-stamp + dh_testdir + dh_testroot + dh_installdirs $(verbose) + dh_prep $(verbose) -pncursest6td + + $(MAKE) -C t/ncursest6td install.libs install.progs DESTDIR=$(NCURSEST6_DIR) + $(MAKE) -C t/ncursest6td/test ncurses LOCAL_LIBDIR=$(LIBDIR) + + mv t/ncursest6td/test/ncurses $(NCURSEST6_DIR)$(BINDIR)/ncursest$(MY_ABI) + + touch $@ + +install-ncurses6td-doc-stamp: build-ncurses6td-stamp + dh_testdir + dh_testroot + dh_installdirs $(verbose) + dh_prep $(verbose) -pncurses6td-doc + + $(MAKE) -C t/ncurses6td install.man DESTDIR=$(NCURSES6_DIR)-doc + find $(NCURSES6_DIR)-doc -name 'ncursesw6-config.*' -print -delete + + cd $(NCURSES6_DIR)-doc/usr/share/man/man1 && ln -sf tset6.1.gz reset6.1.gz + + touch $@ + +HTML_DESTDIR=$(NCURSES6_DIR)-doc-html/usr/share/doc/ncurses6td-doc-html +install-ncurses6td-doc-html-stamp: build-ncurses6td-stamp + dh_testdir + dh_testroot + dh_installdirs $(verbose) + dh_prep $(verbose) -pncurses6td-doc-html + + cd doc/html && find * -type d | sort | xargs -I{} mkdir -p -v $(HTML_DESTDIR)/{} + cd doc/html && find * -type f -name '*.html' | sort | xargs -I{} install -m 644 -p -v -T {} $(HTML_DESTDIR)/{} + find $(HTML_DESTDIR) -type d -empty -delete -print + find $(HTML_DESTDIR) -type d -empty -delete -print + + touch $@ + +# Build architecture-independent files here. +binary-indep: install-indep +ifneq ($(PACKAGES.indep),) + rm -f $(PACKAGES.indep:%=install-%-stamp) + dh_testdir + dh_testroot + dh_lintian $(verbose) $(PACKAGES.arch:%=-p%) + dh_installdocs $(verbose) $(PACKAGES.indep:%=-p%) + dh_installman $(verbose) $(PACKAGES.indep:%=-p%) + dh_installexamples $(verbose) $(PACKAGES.indep:%=-p%) + dh_installchangelogs $(verbose) $(PACKAGES.indep:%=-p%) NEWS + dh_compress $(verbose) $(PACKAGES.indep:%=-p%) + dh_fixperms $(verbose) $(PACKAGES.indep:%=-p%) + dh_installdeb $(verbose) $(PACKAGES.indep:%=-p%) + dh_gencontrol $(verbose) $(PACKAGES.indep:%=-p%) + dh_md5sums $(verbose) $(PACKAGES.indep:%=-p%) + dh_builddeb $(verbose) $(PACKAGES.indep:%=-p%) +endif + +# Build architecture-dependent files here. +binary-arch: install-arch +ifneq ($(PACKAGES.arch),) + rm -f $(PACKAGES.arch:%=install-%-stamp) + dh_testdir + dh_testroot + + version=`set -x; awk 'BEGIN{major=minor=0} /^NCURSES_MAJOR/{major=$$3} /^NCURSES_MINOR/{minor=$$3} END{print major "." minor}' < dist.mk`; \ + sed -i \ + -e "s, usr/lib, usr/lib/$(DEB_HOST_MULTIARCH)," \ + -e "s,6\.1,$${version}," \ + debian/*.lintian-overrides + + dh_lintian $(verbose) $(PACKAGES.arch:%=-p%) + dh_installdocs $(verbose) $(PACKAGES.arch:%=-p%) + dh_installchangelogs $(verbose) $(PACKAGES.arch:%=-p%) NEWS + dh_strip $(verbose) $(PACKAGES.arch:%=-p%) + dh_compress $(verbose) $(PACKAGES.arch:%=-p%) + dh_fixperms $(verbose) $(PACKAGES.arch:%=-p%) + dh_installdeb $(verbose) $(PACKAGES.arch:%=-p%) + dh_makeshlibs $(verbose) $(PACKAGES.arch:%=-p%) + dh_shlibdeps $(verbose) $(PACKAGES.arch:%=-p%) + dh_gencontrol $(verbose) $(PACKAGES.arch:%=-p%) + dh_md5sums $(verbose) $(PACKAGES.arch:%=-p%) + dh_builddeb $(verbose) $(PACKAGES.arch:%=-p%) +endif diff --git a/contrib/ncurses/package/debian/source/format b/contrib/ncurses/package/debian/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/package/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/package/debian/watch b/contrib/ncurses/package/debian/watch new file mode 100644 index 00000000..11c22c5a --- /dev/null +++ b/contrib/ncurses/package/debian/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/ncurses/current/ncurses\.tar.gz \ + debian uupdate diff --git a/contrib/ncurses/package/mingw-ncurses.nsi b/contrib/ncurses/package/mingw-ncurses.nsi new file mode 100644 index 00000000..cdc9f27e --- /dev/null +++ b/contrib/ncurses/package/mingw-ncurses.nsi @@ -0,0 +1,190 @@ +; $Id: mingw-ncurses.nsi,v 1.674 2024/11/02 09:59:53 tom Exp $ + +; TODO add examples +; TODO bump ABI to 6 + +; Define the application name +!define APPNAME "ncurses" +!define EXENAME "ncurses.exe" + +!define VERSION_MAJOR "6" +!define VERSION_MINOR "5" +!define VERSION_YYYY "2024" +!define VERSION_MMDD "1102" +!define VERSION_PATCH ${VERSION_YYYY}${VERSION_MMDD} + +!define MY_ABI "5" +!define MY_MODEL "w" + +!define SUBKEY "ncurses" + +!define INSTALL "${APPNAME} (Console)" +!define VERSION ${VERSION_MAJOR}.${VERSION_MINOR} +!define VERSION_FULL ${VERSION}-${VERSION_PATCH} + +; Main Install settings +Name "${INSTALL}" +InstallDir "c:\mingw" +InstallDirRegKey HKLM "Software\${SUBKEY}" "$INSTDIR\bin" +OutFile "NSIS-Output\${APPNAME}-${VERSION_FULL}-setup.exe" + +CRCCheck on +SetCompressor /SOLID lzma + +VIAddVersionKey ProductName "${SUBKEY}" +VIAddVersionKey CompanyName "https://invisible-island.net" +VIAddVersionKey FileDescription "NCurses Installer (MinGW)" +VIAddVersionKey FileVersion ${VERSION_FULL} +VIAddVersionKey ProductVersion ${VERSION_FULL} +VIAddVersionKey Comments "This installer was built with NSIS and cross-compiling to MinGW." +VIAddVersionKey InternalName "${APPNAME}-${VERSION_FULL}-setup.exe" +; This is a dotted set of numbers limited to 16-bits each +VIProductVersion "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_YYYY}.${VERSION_MMDD}" + +; Modern interface settings +!include "MUI.nsh" + +!define MUI_ABORTWARNING +;!define MUI_FINISHPAGE_RUN +;"$INSTDIR\bin\${EXENAME}" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\COPYING" +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +; Set languages (first is default language) +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_RESERVEFILE_LANGDLL + +InstType "Full" ; SectionIn 1 +InstType "Typical" ; SectionIn 2 +InstType "Minimal" ; SectionIn 3 + +Section "${APPNAME}" Section1 + + SectionIn 1 2 3 + + ; Set Section properties + SetOverwrite on + + ; Set Section Files and Shortcuts + SetOutPath "$INSTDIR\bin" + + File ".\bin\*.dll" + + SetOutPath "$INSTDIR\share\${APPNAME}" + File /oname=README.txt "..\README" + File /oname=README-mingw.txt "..\README.mingw" + + CreateDirectory "$SMPROGRAMS\${INSTALL}" + CreateShortCut "$SMPROGRAMS\${INSTALL}\${APPNAME}.lnk" "$INSTDIR\bin\${EXENAME}" + CreateShortCut "$SMPROGRAMS\${INSTALL}\Uninstall.lnk" "$INSTDIR\uninstall.exe" + +SectionEnd + +Section "development" Section2 + + SectionIn 1 2 + + ; Set Section properties + SetOverwrite on + + ; Set Section Files and Shortcuts + SetOutPath "$INSTDIR\share\${APPNAME}" + + SetOutPath "$INSTDIR\include\${APPNAME}${MY_MODEL}" + + File ".\include\${APPNAME}${MY_MODEL}\*.h" + + SetOutPath "$INSTDIR\lib" + + File ".\lib\*.a" + +SectionEnd + +Section "examples" Section3 + + SectionIn 1 + + ; Set Section properties + SetOverwrite on + + ; Set Section Files and Shortcuts + SetOutPath "$INSTDIR\lib\${APPNAME}" + +SectionEnd + +Section -FinishSection + + WriteRegStr HKLM "Software\${SUBKEY}" "" "$INSTDIR" + WriteRegStr HKLM "Software\${SUBKEY}" "Environment" "" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" "DisplayName" "${APPNAME} ${VERSION_FULL} (Console)" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" "UninstallString" "$INSTDIR\uninstall.exe" + WriteUninstaller "$INSTDIR\uninstall.exe" + +SectionEnd + +; Modern install component descriptions +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${Section1} "${SUBKEY} runtime" + !insertmacro MUI_DESCRIPTION_TEXT ${Section2} "Development headers and libraries" + !insertmacro MUI_DESCRIPTION_TEXT ${Section3} "Examples" +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;Uninstall section +Section Uninstall + + ;Remove from registry... + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALL}" + DeleteRegKey HKLM "SOFTWARE\${SUBKEY}" + + ; Delete self + Delete "$INSTDIR\uninstall.exe" + + ; Delete Shortcuts + Delete "$SMPROGRAMS\${INSTALL}\${APPNAME}.lnk" + Delete "$SMPROGRAMS\${INSTALL}\Uninstall.lnk" + + ; Clean up application + Delete "$INSTDIR\bin\libform${MY_MODEL}${MY_ABI}.dll" + Delete "$INSTDIR\bin\libmenu${MY_MODEL}${MY_ABI}.dll" + Delete "$INSTDIR\bin\libncurses++${MY_MODEL}${MY_ABI}.dll" + Delete "$INSTDIR\bin\libncurses${MY_MODEL}${MY_ABI}.dll" + Delete "$INSTDIR\bin\libpanel${MY_MODEL}${MY_ABI}.dll" + + Delete "$INSTDIR\include\${APPNAME}${MY_MODEL}\*.h" + + Delete "$INSTDIR\lib\libform${MY_MODEL}.a" + Delete "$INSTDIR\lib\libmenu${MY_MODEL}.a" + Delete "$INSTDIR\lib\libncurses++${MY_MODEL}.a" + Delete "$INSTDIR\lib\libncurses${MY_MODEL}.a" + Delete "$INSTDIR\lib\libpanel${MY_MODEL}.a" + + Delete "$INSTDIR\lib\libform${MY_MODEL}.dll.a" + Delete "$INSTDIR\lib\libmenu${MY_MODEL}.dll.a" + Delete "$INSTDIR\lib\libncurses++${MY_MODEL}.dll.a" + Delete "$INSTDIR\lib\libncurses${MY_MODEL}.dll.a" + Delete "$INSTDIR\lib\libpanel${MY_MODEL}.dll.a" + + Delete "$INSTDIR\lib\${APPNAME}\*.exe" + + Delete "$INSTDIR\share\${APPNAME}\*.*" + + ; Remove remaining directories + RMDir "$SMPROGRAMS\${INSTALL}" + RMDir "$INSTDIR\share\${APPNAME}" + RMDir "$INSTDIR\share" + RMDir "$INSTDIR\lib\${APPNAME}" + RMDir "$INSTDIR\lib" + RMDir "$INSTDIR\include\${APPNAME}${MY_MODEL}" + RMDir "$INSTDIR\include" + RMDir "$INSTDIR\bin" + RMDir "$INSTDIR\" + +SectionEnd \ No newline at end of file diff --git a/contrib/ncurses/package/mingw-ncurses.spec b/contrib/ncurses/package/mingw-ncurses.spec new file mode 100644 index 00000000..d6b94a08 --- /dev/null +++ b/contrib/ncurses/package/mingw-ncurses.spec @@ -0,0 +1,163 @@ +%?mingw_package_header + +Summary: shared libraries for terminal handling +Name: mingw32-ncurses6 +Version: 6.5 +Release: 20241102 +License: X11 +Group: Development/Libraries +URL: https://invisible-island.net/ncurses/ +Source: https://invisible-island.net/archives/ncurses/ncurses-%{version}-%{release}.tgz + +BuildRequires: mingw32-filesystem >= 95 +BuildRequires: mingw32-gcc +BuildRequires: mingw32-binutils + +BuildRequires: mingw64-filesystem >= 95 +BuildRequires: mingw64-gcc +BuildRequires: mingw64-binutils + +%global MY_ABI 6 + +%define CC_NORMAL -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +%define CC_STRICT %{CC_NORMAL} -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +%description -n mingw32-ncurses6 +Cross-compiling support for ncurses to mingw32. + +The ncurses library routines are a terminal-independent method of +updating character screens with reasonable optimization. + +This package is used for testing ABI 6 with cross-compiles to MinGW. + +%package -n mingw64-ncurses6 +Summary: Curses library for MinGW64 + +%description -n mingw64-ncurses6 +Cross-compiling support for ncurses to mingw64. + +The ncurses library routines are a terminal-independent method of +updating character screens with reasonable optimization. + +This package is used for testing ABI %{MY_ABI} with cross-compiles to MinGW. + +%prep + +%define CFG_OPTS \\\ + --disable-db-install \\\ + --disable-echo \\\ + --disable-getcap \\\ + --disable-hard-tabs \\\ + --disable-leaks \\\ + --disable-macros \\\ + --disable-overwrite \\\ + --disable-termcap \\\ + --enable-interop \\\ + --enable-opaque-curses \\\ + --enable-opaque-form \\\ + --enable-opaque-menu \\\ + --enable-opaque-panel \\\ + --enable-pc-files \\\ + --enable-sp-funcs \\\ + --enable-term-driver \\\ + --enable-warnings \\\ + --enable-wgetch-events \\\ + --enable-widec \\\ + --with-config-suffix=dev \\\ + --verbose \\\ + --with-cxx-shared \\\ + --with-develop \\\ + --with-fallbacks=unknown,xterm \\\ + --with-tic-path=/usr/bin/tic%{MY_ABI} \\\ + --with-infocmp-path=/usr/bin/infocmp%{MY_ABI} \\\ + --with-install-prefix=$RPM_BUILD_ROOT \\\ + --with-pc-suffix=%{MY_ABI} \\\ + --with-pcre2 \\\ + --with-shared \\\ + --with-tparm-arg=intptr_t \\\ + --with-trace \\\ + --with-xterm-kbs=DEL \\\ + --without-ada \\\ + --without-debug \\\ + --without-manpages \\\ + --without-progs \\\ + --without-tests + +%define debug_package %{nil} +%setup -q -n ncurses-%{version}-%{release} + +%build +mkdir BUILD-W32 +pushd BUILD-W32 +CFLAGS="%{CC_NORMAL}" \ +CC=%{mingw32_cc} \ +%mingw32_configure %{CFG_OPTS} \ + --with-pkg-config-libdir=%{mingw32_libdir}/pkgconfig +make +popd + +mkdir BUILD-W64 +pushd BUILD-W64 +CFLAGS="%{CC_NORMAL}" \ +CC=%{mingw64_cc} \ +%mingw64_configure %{CFG_OPTS} \ + --with-pkg-config-libdir=%{mingw64_libdir}/pkgconfig +make +popd + +%install +rm -rf $RPM_BUILD_ROOT + +mkdir -p $RPM_BUILD_ROOT%{_bindir} + +pushd BUILD-W32 +%{mingw32_make} install.libs +for name in $RPM_BUILD_ROOT%{mingw32_bindir}/*-config; \ + do \ + base=`basename $name`; \ + ln -v $name $RPM_BUILD_ROOT%{_bindir}/%{mingw32_target}-$base; \ + done +popd + +pushd BUILD-W64 +%{mingw64_make} install.libs +for name in $RPM_BUILD_ROOT%{mingw64_bindir}/*-config; \ + do \ + base=`basename $name`; \ + ln -v $name $RPM_BUILD_ROOT%{_bindir}/%{mingw64_target}-$base; \ + done +popd + +%files -n mingw32-ncurses6 +%defattr(-,root,root,-) +%{_bindir}/%{mingw32_target}-* +%{mingw32_bindir}/* +%{mingw32_includedir}/* +%{mingw32_libdir}/* + +%files -n mingw64-ncurses6 +%defattr(-,root,root,-) +%{_bindir}/%{mingw64_target}-* +%{mingw64_bindir}/* +%{mingw64_includedir}/* +%{mingw64_libdir}/* + +%changelog + +* Sat Feb 25 2023 Thomas Dickey +- amend URLs per rpmlint + +* Sun Jun 30 2019 Thomas E. Dickey +- use tic-path and infocmp-path options for fallbacks + +* Sat Feb 10 2018 Thomas E. Dickey +- add several development features + +* Tue Dec 26 2017 Thomas E. Dickey +- add --with-config-suffix option + +* Sat Sep 20 2014 Thomas E. Dickey +- adjust install-rules for ncurses*-config + +* Sat Aug 03 2013 Thomas E. Dickey +- initial version, using mingw-pdcurses package as a guide. diff --git a/contrib/ncurses/package/ncurses.map b/contrib/ncurses/package/ncurses.map new file mode 100644 index 00000000..68de9c43 --- /dev/null +++ b/contrib/ncurses/package/ncurses.map @@ -0,0 +1,1233 @@ +# $Id: ncurses.map,v 1.58 2024/04/27 14:33:24 tom Exp $ +# script for shared library symbol-versioning using ld +# +# This file was generated by ncu-mapsyms +# Configure options (5.0.19991023) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.1.20000708) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.2.20001021) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.3.20021019) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.4.20040208) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.5.20051010) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.6.20061217) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace +# Configure options (6.0.current) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace + +NCURSES_5.0.19991023 { + global: + COLORS; + COLOR_PAIR; + COLOR_PAIRS; + ESCDELAY; + PAIR_NUMBER; + TYPE_ALNUM; + TYPE_ALPHA; + TYPE_ENUM; + TYPE_INTEGER; + TYPE_IPV4; + TYPE_NUMERIC; + TYPE_REGEXP; + _nc_Default_Field; # deprecated in ABI6 + _nc_Default_Form; # deprecated in ABI6 + _nc_free_and_exit; + _nc_has_mouse; # deprecated in ABI6 + _nc_panelhook; + _nc_ripoffline; + addch; + addchnstr; + addchstr; + addnstr; + addstr; + attr_get; + attr_off; + attr_on; + attr_set; + attroff; + attron; + attrset; + beep; + bkgd; + bkgdset; + border; + bottom_panel; + box; + can_change_color; + chgat; + clear; + clearok; + clrtobot; + clrtoeol; + color_content; + color_set; + copywin; + current_field; + current_item; + data_ahead; + data_behind; + del_panel; + delch; + deleteln; + delscreen; + delwin; + derwin; + doupdate; + dup_field; + dupwin; + dynamic_field_info; + echo; + echochar; + endwin; + field_arg; + field_back; + field_buffer; + field_count; + field_fore; + field_index; + field_info; + field_init; + field_just; + field_opts; + field_opts_off; + field_opts_on; + field_pad; + field_status; + field_term; + field_type; + field_userptr; + filter; + flash; + form_driver; + form_fields; + form_init; + form_opts; + form_opts_off; + form_opts_on; + form_page; + form_request_by_name; + form_request_name; + form_sub; + form_term; + form_userptr; + form_win; + free_field; + free_fieldtype; + free_form; + free_item; + free_menu; + getbkgd; + getch; + getmouse; + getnstr; + getstr; + getwin; + has_colors; + hide_panel; + hline; + immedok; + inch; + inchnstr; + inchstr; + init_color; + init_pair; + initscr; + innstr; + insch; + insdelln; + insertln; + insnstr; + insstr; + instr; + is_linetouched; + is_wintouched; + isendwin; + item_count; + item_description; + item_index; + item_init; + item_name; + item_opts; + item_opts_off; + item_opts_on; + item_term; + item_userptr; + item_value; + item_visible; + leaveok; + link_field; + link_fieldtype; + mcprint; + menu_back; + menu_driver; + menu_fore; + menu_format; + menu_grey; + menu_init; + menu_items; + menu_mark; + menu_opts; + menu_opts_off; + menu_opts_on; + menu_pad; + menu_pattern; + menu_request_by_name; + menu_request_name; + menu_spacing; + menu_sub; + menu_term; + menu_userptr; + menu_win; + mouse_trafo; + mouseinterval; + mousemask; + move; + move_field; + move_panel; + mvaddch; + mvaddchnstr; + mvaddchstr; + mvaddnstr; + mvaddstr; + mvchgat; + mvcur; + mvdelch; + mvderwin; + mvgetch; + mvgetnstr; + mvgetstr; + mvhline; + mvinch; + mvinchnstr; + mvinchstr; + mvinnstr; + mvinsch; + mvinsnstr; + mvinsstr; + mvinstr; + mvprintw; + mvscanw; + mvvline; + mvwaddch; + mvwaddchnstr; + mvwaddchstr; + mvwaddnstr; + mvwaddstr; + mvwchgat; + mvwdelch; + mvwgetch; + mvwgetnstr; + mvwgetstr; + mvwhline; + mvwin; + mvwinch; + mvwinchnstr; + mvwinchstr; + mvwinnstr; + mvwinsch; + mvwinsnstr; + mvwinsstr; + mvwinstr; + mvwprintw; + mvwscanw; + mvwvline; + new_field; + new_fieldtype; + new_form; + new_item; + new_menu; + new_page; + new_panel; + newpad; + newterm; + newwin; + nl; + noecho; + nonl; + overlay; + overwrite; + pair_content; + panel_above; + panel_below; + panel_hidden; + panel_userptr; + panel_window; + pechochar; + pnoutrefresh; + pos_form_cursor; + pos_menu_cursor; + post_form; + post_menu; + prefresh; + printw; + putwin; + redrawwin; + refresh; + replace_panel; + resizeterm; + restartterm; + ripoffline; + scale_form; + scale_menu; + scanw; + scr_dump; + scr_init; + scr_restore; + scr_set; + scrl; + scroll; + scrollok; + set_current_field; + set_current_item; + set_field_back; + set_field_buffer; + set_field_fore; + set_field_init; + set_field_just; + set_field_opts; + set_field_pad; + set_field_status; + set_field_term; + set_field_type; + set_field_userptr; + set_fieldtype_arg; + set_fieldtype_choice; + set_form_fields; + set_form_init; + set_form_opts; + set_form_page; + set_form_sub; + set_form_term; + set_form_userptr; + set_form_win; + set_item_init; + set_item_opts; + set_item_term; + set_item_userptr; + set_item_value; + set_max_field; + set_menu_back; + set_menu_fore; + set_menu_format; + set_menu_grey; + set_menu_init; + set_menu_items; + set_menu_mark; + set_menu_opts; + set_menu_pad; + set_menu_pattern; + set_menu_spacing; + set_menu_sub; + set_menu_term; + set_menu_userptr; + set_menu_win; + set_new_page; + set_panel_userptr; + set_term; + set_top_row; + setscrreg; + show_panel; + slk_attr; + slk_attr_off; + slk_attr_on; + slk_attr_set; + slk_attroff; + slk_attron; + slk_attrset; + slk_clear; + slk_color; + slk_init; + slk_label; + slk_noutrefresh; + slk_refresh; + slk_restore; + slk_set; + slk_touch; + standend; + standout; + start_color; + subpad; + subwin; + syncok; + termattrs; + timeout; + top_panel; + top_row; + ungetch; + ungetmouse; + unpost_form; + unpost_menu; + untouchwin; + update_panels; + use_default_colors; + vid_attr; + vidattr; + vidputs; + vline; + vw_printw; + vw_scanw; + vwprintw; + vwscanw; + waddch; + waddchnstr; + waddchstr; + waddnstr; + waddstr; + wattr_get; + wattr_off; + wattr_on; + wattr_set; + wattroff; + wattron; + wattrset; + wbkgd; + wbkgdset; + wborder; + wchgat; + wclear; + wclrtobot; + wclrtoeol; + wcolor_set; + wcursyncup; + wdelch; + wdeleteln; + wechochar; + wenclose; + werase; + wgetch; + wgetnstr; + wgetstr; + whline; + winch; + winchnstr; + winchstr; + winnstr; + winsch; + winsdelln; + winsertln; + winsnstr; + winsstr; + winstr; + wmouse_trafo; + wmove; + wnoutrefresh; + wprintw; + wredrawln; + wrefresh; + wresize; + wscanw; + wscrl; + wsetscrreg; + wstandend; + wstandout; + wsyncdown; + wsyncup; + wtouchln; + wvline; + local: + _nc_Calculate_Item_Length_and_Width; + _nc_Connect_Items; + _nc_Copy_Argument; + _nc_Copy_Type; + _nc_Default_FieldType; + _nc_Default_Item; + _nc_Default_Menu; + _nc_Disconnect_Items; + _nc_Draw_Menu; + _nc_First_Active_Field; + _nc_Free_Argument; + _nc_Free_Type; + _nc_Internal_Validation; + _nc_Link_Items; + _nc_Make_Argument; + _nc_Match_Next_Character_In_Item_Name; + _nc_New_TopRow_and_CurrentItem; + _nc_Position_Form_Cursor; + _nc_Post_Item; + _nc_Refresh_Current_Field; + _nc_Set_Current_Field; + _nc_Set_Form_Page; + _nc_Show_Menu; + _nc_Synchronize_Attributes; + _nc_Synchronize_Options; + _nc_background; + _nc_do_color; + _nc_expanded; + _nc_freewin; + _nc_hash_map; + _nc_lib_traceatr; + _nc_lib_tracedmp; + _nc_lib_tracemouse; + _nc_make_oldhash; + _nc_makenew; + _nc_memmove; + _nc_menu_cursor_pos; + _nc_msec_cost; + _nc_mvcur_init; + _nc_mvcur_resume; + _nc_mvcur_wrap; + _nc_oldnums; + _nc_outstr; + _nc_printf_string; + _nc_render; + _nc_screen_init; + _nc_screen_resume; + _nc_screen_wrap; + _nc_scroll_oldhash; + _nc_scroll_optimize; + _nc_scroll_window; + _nc_scrolln; + _nc_setupscreen; + _nc_sigaction; + _nc_signal_handler; + _nc_slk_format; + _nc_slk_initialize; + _nc_synchook; + _nc_trace_xnames; + _nc_vsscanf; + _nc_waddch_nosync; +}; + +NCURSES_5.1.20000708 { + global: + assume_default_colors; + erase; + touchline; + touchwin; +} NCURSES_5.0.19991023; + +NCURSES_5.3.20021019 { + global: + is_term_resized; + resize_term; + local: + _nc_reset_colors; + _nc_varargs; + _nc_wgetch; +} NCURSES_5.1.20000708; + +NCURSES_5.4.20040208 { + global: + _nc_optimize_enable; + local: + _nc_Touchline; + _nc_Touchpan; + _nc_Wnoutrefresh; + _nc_dPanel; + _nc_dStack; + _nc_fifo_dump; + _nc_insert_ch; + _nc_linedump; + _nc_my_visbuf; + _tracedump; + _tracemouse; +} NCURSES_5.3.20021019; + +NCURSES_5.5.20051010 { + local: + _nc_Calculate_Text_Width; + _nc_retrace_field; + _nc_retrace_field_ptr; + _nc_retrace_field_type; + _nc_retrace_form; + _nc_retrace_form_hook; + _nc_retrace_item; + _nc_retrace_item_opts; + _nc_retrace_item_ptr; + _nc_retrace_menu; + _nc_retrace_menu_hook; + _nc_retrace_menu_opts; + _nc_retrace_panel; +} NCURSES_5.4.20040208; + +NCURSES_5.6.20061217 { + global: + getbegx; + getbegy; + getcurx; + getcury; + getmaxx; + getmaxy; + getparx; + getpary; + nofilter; + use_legacy_coding; + wgetch_events; + wgetnstr_events; +} NCURSES_5.5.20051010; + +NCURSES_5.7.20081102 { + global: + getattrs; + is_cleared; + is_idcok; + is_idlok; + is_immedok; + is_keypad; + is_leaveok; + is_nodelay; + is_notimeout; + is_scrollok; + is_syncok; + set_escdelay; + use_screen; + use_window; + wgetparent; + wgetscrreg; + local: + _nc_tracemouse; + _nc_ungetch; +} NCURSES_5.6.20061217; + +NCURSES_5.8.20110226 { + global: + _nc_panelhook_sp; + assume_default_colors_sp; + beep_sp; + can_change_color_sp; + ceiling_panel; + color_content_sp; + doupdate_sp; + echo_sp; + endwin_sp; + filter_sp; + flash_sp; + get_escdelay; + get_escdelay_sp; + getmouse_sp; + getwin_sp; + ground_panel; + has_colors_sp; + has_mouse; + has_mouse_sp; + init_color_sp; + init_pair_sp; + is_pad; + is_subwin; + is_term_resized_sp; + isendwin_sp; + mcprint_sp; + mouseinterval_sp; + mousemask_sp; + mvcur_sp; + new_form_sp; + new_menu_sp; + newpad_sp; + newterm_sp; + newwin_sp; + nl_sp; + noecho_sp; + nofilter_sp; + nonl_sp; + pair_content_sp; + resize_term_sp; + resizeterm_sp; + restartterm_sp; + ripoffline_sp; + scr_init_sp; + scr_restore_sp; + scr_set_sp; + set_escdelay_sp; + slk_attr_set_sp; + slk_attr_sp; + slk_attroff_sp; + slk_attron_sp; + slk_attrset_sp; + slk_clear_sp; + slk_color_sp; + slk_init_sp; + slk_label_sp; + slk_noutrefresh_sp; + slk_refresh_sp; + slk_restore_sp; + slk_set_sp; + slk_touch_sp; + start_color_sp; + termattrs_sp; + ungetch_sp; + ungetmouse_sp; + update_panels_sp; + use_default_colors_sp; + use_legacy_coding_sp; + vidattr_sp; + vidputs_sp; + local: + _nc_TYPE_ALNUM; + _nc_TYPE_ALPHA; + _nc_TYPE_ENUM; + _nc_TYPE_INTEGER; + _nc_TYPE_IPV4; + _nc_TYPE_NUMERIC; + _nc_TYPE_REGEXP; + _nc_curscr_of; + _nc_do_color_sp; + _nc_form_cursor; + _nc_format_slks; + _nc_free_and_exit_sp; + _nc_freeall_sp; + _nc_fty_generic; + _nc_generic_fieldtype; + _nc_get_fieldbuffer; + _nc_hash_map_sp; + _nc_linedump_sp; + _nc_make_oldhash_sp; + _nc_makenew_sp; + _nc_msec_cost_sp; + _nc_mvcur_init_sp; + _nc_mvcur_resume_sp; + _nc_mvcur_wrap_sp; + _nc_newscr_of; + _nc_printf_string_sp; + _nc_reset_colors_sp; + _nc_retrace_mmask_t; + _nc_ripoffline_sp; + _nc_screen_init_sp; + _nc_screen_resume_sp; + _nc_screen_wrap_sp; + _nc_scroll_oldhash_sp; + _nc_scroll_optimize_sp; + _nc_scrolln_sp; + _nc_set_generic_fieldtype; + _nc_setupscreen_sp; + _nc_stdscr_of; +} NCURSES_5.7.20081102; + +NCURSES_5.9.20150530 { + global: + wgetdelay; + local: + _nc_mvcur; + _nc_mvcur_sp; + _nc_trace_mmask_t; +} NCURSES_5.8.20110226; + +NCURSES_6.1.20171230 { + global: + alloc_pair; + alloc_pair_sp; + extended_color_content; + extended_color_content_sp; + extended_pair_content; + extended_pair_content_sp; + find_pair; + find_pair_sp; + free_pair; + free_pair_sp; + init_extended_color; + init_extended_color_sp; + init_extended_pair; + init_extended_pair_sp; + reset_color_pairs; + reset_color_pairs_sp; + unfocus_current_field; + local: + _nc_Unset_Current_Field; + _nc_change_pair; + _nc_init_color; + _nc_init_pair; + _nc_pair_content; + _nc_reset_color_pair; + _nc_set_color_pair; +} NCURSES_5.9.20150530; + +NCURSES_6.2.20200212 { + global: + exit_curses; + local: + _*; +} NCURSES_6.1.20171230; + +NCURSES_TIC_5.0.19991023 { + global: + _nc_capcmp; + _nc_check_termtype; + _nc_entry_match; + _nc_infotocap; + _nc_read_entry_source; + _nc_reset_input; + _nc_resolve_uses; + _nc_set_writedir; + _nc_syntax; + _nc_tic_expand; + _nc_tic_written; + _nc_trans_string; + _nc_write_entry; + local: + _nc_captoinfo; + _nc_comment_end; + _nc_comment_start; + _nc_copy_entry; + _nc_curr_file_pos; + _nc_curr_token; + _nc_get_token; + _nc_init_entry; + _nc_merge_entry; + _nc_panic_mode; + _nc_parse_entry; + _nc_push_token; + _nc_save_str; + _nc_start_line; + _nc_wrap_entry; +}; + +NCURSES_TIC_5.1.20000708 { + global: + _nc_disable_period; +} NCURSES_TIC_5.0.19991023; + +NCURSES_TIC_5.5.20051010 { + global: + _nc_alloc_entry_leaks; + _nc_captoinfo_leaks; + _nc_check_termtype2; + _nc_comp_scan_leaks; + _nc_resolve_uses2; +} NCURSES_TIC_5.1.20000708; + +NCURSES_TIC_5.7.20081102 { + global: + _nc_free_tic; + local: + _nc_comp_captab_leaks; + _nc_leaks_tic; +} NCURSES_TIC_5.5.20051010; + +NCURSES_TIC_5.9.20150530 { + global: + _nc_strict_bsd; +} NCURSES_TIC_5.7.20081102; + +NCURSES_TIC_6.1.20171230 { + global: + _nc_read_entry2; + _nc_write_object; + local: + _*; +} NCURSES_TIC_5.9.20150530; + +NCURSES_TINFO_5.0.19991023 { + global: + BC; + COLS; + LINES; + PC; + SP; + TABSIZE; + UP; + _nc_access; + _nc_add_to_try; + _nc_copy_termtype; + _nc_curr_col; + _nc_curr_line; + _nc_doalloc; + _nc_err_abort; + _nc_fallback; + _nc_find_entry; + _nc_find_type_entry; + _nc_first_name; + _nc_free_entries; + _nc_free_termtype; + _nc_free_tparm; + _nc_freeall; + _nc_get_hash_table; + _nc_get_table; + _nc_get_tty_mode; + _nc_get_type; + _nc_getenv_num; + _nc_head; + _nc_home_terminfo; + _nc_info_hash_table; + _nc_init_acs; + _nc_keep_tic_dir; + _nc_keypad; + _nc_name_match; + _nc_outch; + _nc_read_entry; + _nc_read_file_entry; + _nc_screen_chain; + _nc_set_buffer; + _nc_set_source; + _nc_set_tty_mode; + _nc_set_type; + _nc_suppress_warnings; + _nc_syserr_abort; + _nc_tail; + _nc_tic_dir; + _nc_timed_wait; + _nc_tinfo_fkeysf; + _nc_trace_buf; + _nc_tracing; + _nc_update_screensize; + _nc_visbuf; + _nc_visbuf2; + _nc_warning; + _tracechar; + acs_map; + baudrate; + boolcodes; + boolfnames; + boolnames; + cbreak; + cur_term; + curs_set; + curscr; + curses_version; + def_prog_mode; + def_shell_mode; + define_key; + del_curterm; + delay_output; + erasechar; + flushinp; + halfdelay; + has_ic; + has_il; + has_key; + idcok; + idlok; + intrflush; + keybound; + keyname; + keyok; + keypad; + killchar; + longname; + meta; + napms; + newscr; + nocbreak; + nodelay; + noqiflush; + noraw; + notimeout; + numcodes; + numfnames; + numnames; + ospeed; + putp; + qiflush; + raw; + reset_prog_mode; + reset_shell_mode; + resetty; + savetty; + set_curterm; + setupterm; + stdscr; + strcodes; + strfnames; + strnames; + termname; + tgetent; + tgetflag; + tgetnum; + tgetstr; + tgoto; + tigetflag; + tigetnum; + tigetstr; + tparm; + tputs; + trace; + ttytype; + typeahead; + unctrl; + use_env; + wtimeout; + local: + _nc_baudrate; + _nc_cap_hash_table; + _nc_capalias_table; + _nc_expand_try; + _nc_infoalias_table; + _nc_init_keytry; + _nc_key_names; + _nc_nulls_sent; + _nc_ospeed; + _nc_read_termcap; + _nc_read_termcap_entry; + _nc_remove_key; + _nc_remove_string; + _nc_trace_tries; + _nc_tracebits; +}; + +NCURSES_TINFO_5.1.20000708 { + global: + _nc_align_termtype; + _nc_flush; + _nc_tinfo_fkeys; + _nc_user_definable; + use_extended_names; +} NCURSES_TINFO_5.0.19991023; + +NCURSES_TINFO_5.2.20001021 { + global: + _nc_basename; + _nc_env_access; + _nc_safe_strcat; + _nc_safe_strcpy; + _nc_str_copy; + _nc_str_init; + _nc_str_null; +} NCURSES_TINFO_5.1.20000708; + +NCURSES_TINFO_5.3.20021019 { + global: + _nc_rootname; + _nc_tparm_err; + _nc_visbufn; +} NCURSES_TINFO_5.2.20001021; + +NCURSES_TINFO_5.4.20040208 { + global: + _nc_get_locale; + _nc_locale_breaks_acs; + _nc_outchars; + _nc_pathlast; + _nc_retrace_attr_t; + _nc_retrace_bool; + _nc_retrace_chtype; + _nc_retrace_int; + _nc_retrace_ptr; + _nc_retrace_sp; + _nc_retrace_unsigned; + _nc_retrace_win; + _nc_tparm_analyze; + _nc_tputs_trace; + _nc_trace_bufcat; + _nc_unicode_locale; + _traceattr; + _traceattr2; + _tracechtype; + _tracechtype2; + _tracef; + key_defined; + local: + _nc_altcharset_name; + _nc_trace_ttymode; +} NCURSES_TINFO_5.3.20021019; + +NCURSES_TINFO_5.5.20051010 { + global: + _nc_get_source; + _nc_retrace_cptr; + _nc_retrace_cvoid_ptr; + _nc_retrace_void_ptr; + _nc_setupterm; + _nc_trim_sgr0; + local: + _nc_delink_entry; + _nc_free_entry; +} NCURSES_TINFO_5.4.20040208; + +NCURSES_TINFO_5.6.20061217 { + global: + _nc_db_close; + _nc_db_first; + _nc_db_have_data; + _nc_db_next; + _nc_db_open; + _nc_db_put; + _nc_eventlist_timeout; + _nc_first_db; + _nc_handle_sigwinch; + _nc_is_abs_path; + _nc_is_dir_path; + _nc_is_file_path; + _nc_keyname_leaks; + _nc_last_db; + _nc_next_db; + _nc_read_termtype; + _nc_tgetent_leaks; + _nc_viscbuf; + local: + _nc_db_get; + _nc_db_have_index; + _nc_hashed_db; + _nc_viscbuf2; +} NCURSES_TINFO_5.5.20051010; + +NCURSES_TINFO_5.7.20081102 { + global: + _nc_free_tinfo; + _nc_get_alias_table; + _nc_get_screensize; + _nc_globals; + _nc_leaks_tinfo; + _nc_prescreen; + _nc_screen_of; + _nc_set_no_padding; + _nc_tracechar; + set_tabsize; + local: + _nc_keyname; + _nc_unctrl; +} NCURSES_TINFO_5.6.20061217; + +NCURSES_TINFO_5.8.20110226 { + global: + _nc_flush_sp; + _nc_get_tty_mode_sp; + _nc_init_acs_sp; + _nc_outc_wrapper; + _nc_outch_sp; + _nc_putp; + _nc_putp_flush; + _nc_putp_flush_sp; + _nc_putp_sp; + _nc_retrace_int_attr_t; + _nc_set_buffer_sp; + _nc_set_tty_mode_sp; + baudrate_sp; + cbreak_sp; + curs_set_sp; + def_prog_mode_sp; + def_shell_mode_sp; + define_key_sp; + del_curterm_sp; + delay_output_sp; + erasechar_sp; + flushinp_sp; + halfdelay_sp; + has_ic_sp; + has_il_sp; + has_key_sp; + intrflush_sp; + key_defined_sp; + keybound_sp; + keyname_sp; + keyok_sp; + killchar_sp; + longname_sp; + napms_sp; + new_prescr; + nocbreak_sp; + noqiflush_sp; + noraw_sp; + putp_sp; + qiflush_sp; + raw_sp; + reset_prog_mode_sp; + reset_shell_mode_sp; + resetty_sp; + savetty_sp; + set_curterm_sp; + set_tabsize_sp; + termname_sp; + tgetent_sp; + tgetflag_sp; + tgetnum_sp; + tgetstr_sp; + tigetflag_sp; + tigetnum_sp; + tigetstr_sp; + tiparm; + tputs_sp; + typeahead_sp; + unctrl_sp; + use_env_sp; + local: + _nc_get_hash_info; + _nc_retrace_char; + _nc_setup_tinfo; + _nc_tinfo_cmdch; +} NCURSES_TINFO_5.7.20081102; + +NCURSES_TINFO_5.9.20150530 { + global: + _nc_init_termtype; + _nc_putchar; + _nc_putchar_sp; + use_tioctl; + use_tioctl_sp; + local: + _nc_comp_error_leaks; + _nc_db_iterator_leaks; + _nc_setenv_num; +} NCURSES_TINFO_5.8.20110226; + +NCURSES_TINFO_6.1.20171230 { + global: + _nc_copy_termtype2; + _nc_export_termtype2; + _nc_fallback2; + _nc_free_termtype2; +} NCURSES_TINFO_5.9.20150530; + +NCURSES_TINFO_6.2.20200212 { + global: + _nc_find_user_entry; + _nc_fmt_funcptr; + _nc_wacs_width; + curses_trace; + exit_terminfo; +} NCURSES_TINFO_6.1.20171230; + +NCURSES_TINFO_6.2.20211010 { + global: + _nc_reset_tparm; + _nc_safe_fopen; + _nc_safe_open3; + _nc_tiparm; +} NCURSES_TINFO_6.2.20200212; + +NCURSES_TINFO_6.5.20240427 { + global: + is_cbreak; + is_cbreak_sp; + is_echo; + is_echo_sp; + is_nl; + is_nl_sp; + is_raw; + is_raw_sp; + tiparm_s; + tiscan_s; + local: + _*; +} NCURSES_TINFO_6.2.20211010; diff --git a/contrib/ncurses/package/ncurses.spec b/contrib/ncurses/package/ncurses.spec new file mode 100644 index 00000000..4ff6f729 --- /dev/null +++ b/contrib/ncurses/package/ncurses.spec @@ -0,0 +1,185 @@ +Summary: shared libraries for terminal handling +Name: ncurses6 +Version: 6.5 +Release: 20241102 +License: X11 +Group: Development/Libraries +URL: https://invisible-island.net/ncurses/ +Source: https://invisible-island.net/archives/ncurses/ncurses-%{version}-%{release}.tgz + +%global MY_ABI 6 + +# save value before redefining +%global sys_libdir %{_libdir} + +# was redefined... +#global _prefix /usr/local/ncurses#{MY_ABI} + +%global MY_PKG %{sys_libdir}/pkgconfig +%define MYDATA /usr/local/ncurses/share/terminfo + +%description +The ncurses library routines are a terminal-independent method of +updating character screens with reasonable optimization. + +This package is used for testing ABI %{MY_ABI}. + +%prep + +%global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0) +%global is_fedora %(test -f /usr/bin/dnf && echo 1 || echo 0) +%global is_centos %(test -f /etc/centos-release && echo 1 || echo 0) +%global is_redhat %(test -f /etc/redhat-release && echo 1 || echo 0) +%global is_scilinux %(test -f /etc/sl-release && echo 1 || echo 0) +%global is_suse %(test -f /etc/SuSE-release && echo 1 || echo 0) + +%if %{is_redhat} +# generate debug/debug-source packages. +%else +%define debug_package %{nil} +%endif + +%if %{is_mandriva} +%define _disable_ld_as_needed 1 +%define _disable_ld_no_undefined 1 +# libtool is not used here... +%define _disable_libtoolize 1 +%define _disable_ld_build_id 1 +%endif + +%if %{is_fedora} || %{is_scilinux} || %{is_centos} +# workaround for toolset breakage in Fedora 28 +%define _test_relink --enable-relink +%else +%define _test_relink --disable-relink +%endif + +%setup -q -n ncurses-%{version}-%{release} + +%build +%define CFG_OPTS \\\ + --target %{_target_platform} \\\ + --prefix=%{_prefix} \\\ + --bindir=%{_bindir} \\\ + --includedir=%{_includedir} \\\ + --libdir=%{_libdir} \\\ + --includedir='${prefix}/include' \\\ + --disable-echo \\\ + --disable-getcap \\\ + --disable-leaks \\\ + --disable-macros \\\ + --disable-overwrite \\\ + --disable-root-access \\\ + --disable-root-environ \\\ + --disable-rpath \\\ + --disable-termcap \\\ + %{_test_relink} \\\ + --enable-hard-tabs \\\ + --enable-opaque-curses \\\ + --enable-opaque-form \\\ + --enable-opaque-menu \\\ + --enable-opaque-panel \\\ + --enable-pc-files \\\ + --enable-stdnoreturn \\\ + --enable-warnings \\\ + --enable-wgetch-events \\\ + --enable-widec \\\ + --enable-xmc-glitch \\\ + --program-suffix=%{MY_ABI} \\\ + --verbose \\\ + --with-abi-version=%{MY_ABI} \\\ + --with-config-suffix=dev \\\ + --with-cxx-shared \\\ + --with-default-terminfo-dir=%{MYDATA} \\\ + --with-develop \\\ + --with-extra-suffix=%{MY_ABI} \\\ + --with-install-prefix=$RPM_BUILD_ROOT \\\ + --with-pkg-config-libdir=%{MY_PKG} \\\ + --with-shared \\\ + --with-terminfo-dirs=%{MYDATA}:/usr/share/terminfo \\\ + --with-termlib \\\ + --with-ticlib \\\ + --with-trace \\\ + --with-versioned-syms \\\ + --with-xterm-kbs=DEL \\\ + --without-ada \\\ + --without-debug \\\ + --without-normal + +%configure %{CFG_OPTS} + +make + +%install +rm -rf $RPM_BUILD_ROOT + +make install.libs install.progs +rm -f test/ncurses +( cd test && make ncurses LOCAL_LIBDIR=%{_libdir} && mv ncurses $RPM_BUILD_ROOT/%{_bindir}/ncurses%{MY_ABI} ) + +%if %{is_mandriva} +# check this first because Mageia has the /etc/redhat-release file... +%else +%if %{is_fedora} +%ldconfig_scriptlets libs +%ldconfig_scriptlets c++-libs +%endif +%endif + +%files +%defattr(-,root,root,-) +%{_bindir}/* +%{_includedir}/* +%{_libdir}/* + +%changelog + +* Sat Feb 25 2023 Thomas Dickey +- amend URLs per rpmlint + +* Sat Oct 16 2021 Thomas Dickey +- disable rpath to address QA_RPATHS=1 warning. + +* Tue Dec 24 2019 Thomas Dickey +- drop custom CC_NORMAL warning flags because setting CFLAGS interferes with + matching Fedora's PIE/PIC configuration. Also, generate debug/debug-source + packages. + +* Sat Nov 16 2019 Thomas Dickey +- modify clean-rule to work around Fedora NFS bugs. + +* Sat Aug 25 2018 Thomas E. Dickey +- split spec-file into ncurses6 and ncursest6 to work around toolset breakage + in Fedora 28 + +* Sat Jun 02 2018 Thomas E. Dickey +- build-fix for Mageia + +* Sat May 26 2018 Thomas E. Dickey +- use predefined configure-macro +- separate ncurses6/ncursest6 packages + +* Sat Feb 10 2018 Thomas E. Dickey +- add ncursest6 package +- add several development features + +* Mon Jan 01 2018 Thomas E. Dickey +- drop redundant files pattern for "*.pc" + +* Tue Dec 26 2017 Thomas E. Dickey +- add --with-config-suffix option + +* Sun Apr 26 2015 Thomas E. Dickey +- move package to /usr + +* Sun Apr 12 2015 Thomas E. Dickey +- factor-out MY_ABI + +* Sat Mar 09 2013 Thomas E. Dickey +- add --with-cxx-shared option to demonstrate c++ binding as shared library + +* Sat Oct 27 2012 Thomas E. Dickey +- add ncurses program as "ncurses6" to provide demonstration. + +* Fri Jun 08 2012 Thomas E. Dickey +- initial version. diff --git a/contrib/ncurses/package/ncurses.sym b/contrib/ncurses/package/ncurses.sym new file mode 100644 index 00000000..aaa1621f --- /dev/null +++ b/contrib/ncurses/package/ncurses.sym @@ -0,0 +1,900 @@ +# $Id: ncurses.sym,v 1.39 2023/08/12 15:29:01 tom Exp $ +# script for shared library symbol-visibility using libtool +# +# This file was generated by ncu-mapsyms +# Configure options (5.0.19991023) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.1.20000708) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.2.20001021) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.3.20021019) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.4.20040208) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.5.20051010) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.6.20061217) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace +# Configure options (6.0.20161029) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-termlib --with-ticlib --with-trace +BC +COLORS +COLOR_PAIR +COLOR_PAIRS +COLS +ESCDELAY +LINES +PAIR_NUMBER +PC +SP +TABSIZE +TYPE_ALNUM +TYPE_ALPHA +TYPE_ENUM +TYPE_INTEGER +TYPE_IPV4 +TYPE_NUMERIC +TYPE_REGEXP +UP +_nc_Default_Field +_nc_Default_Form +_nc_access +_nc_add_to_try +_nc_align_termtype +_nc_alloc_entry_leaks +_nc_basename +_nc_capcmp +_nc_captoinfo_leaks +_nc_check_termtype +_nc_check_termtype2 +_nc_comp_scan_leaks +_nc_copy_termtype +_nc_copy_termtype2 +_nc_curr_col +_nc_curr_line +_nc_db_close +_nc_db_first +_nc_db_have_data +_nc_db_next +_nc_db_open +_nc_db_put +_nc_disable_period +_nc_doalloc +_nc_entry_match +_nc_env_access +_nc_err_abort +_nc_eventlist_timeout +_nc_export_termtype2 +_nc_fallback +_nc_fallback2 +_nc_find_entry +_nc_find_type_entry +_nc_find_user_entry +_nc_first_db +_nc_first_name +_nc_flush +_nc_flush_sp +_nc_fmt_funcptr +_nc_free_and_exit +_nc_free_entries +_nc_free_termtype +_nc_free_termtype2 +_nc_free_tic +_nc_free_tinfo +_nc_free_tparm +_nc_freeall +_nc_get_alias_table +_nc_get_hash_table +_nc_get_locale +_nc_get_screensize +_nc_get_source +_nc_get_table +_nc_get_tty_mode +_nc_get_tty_mode_sp +_nc_get_type +_nc_getenv_num +_nc_globals +_nc_handle_sigwinch +_nc_has_mouse +_nc_head +_nc_home_terminfo +_nc_info_hash_table +_nc_infotocap +_nc_init_acs +_nc_init_acs_sp +_nc_init_termtype +_nc_is_abs_path +_nc_is_dir_path +_nc_is_file_path +_nc_keep_tic_dir +_nc_keyname_leaks +_nc_keypad +_nc_last_db +_nc_leaks_tinfo +_nc_locale_breaks_acs +_nc_name_match +_nc_next_db +_nc_optimize_enable +_nc_outc_wrapper +_nc_outch +_nc_outch_sp +_nc_outchars +_nc_panelhook +_nc_panelhook_sp +_nc_pathlast +_nc_prescreen +_nc_putchar +_nc_putchar_sp +_nc_putp +_nc_putp_flush +_nc_putp_flush_sp +_nc_putp_sp +_nc_read_entry +_nc_read_entry2 +_nc_read_entry_source +_nc_read_file_entry +_nc_read_termtype +_nc_reset_input +_nc_reset_tparm +_nc_resolve_uses +_nc_resolve_uses2 +_nc_retrace_attr_t +_nc_retrace_bool +_nc_retrace_chtype +_nc_retrace_cptr +_nc_retrace_cvoid_ptr +_nc_retrace_int +_nc_retrace_int_attr_t +_nc_retrace_ptr +_nc_retrace_sp +_nc_retrace_unsigned +_nc_retrace_void_ptr +_nc_retrace_win +_nc_ripoffline +_nc_rootname +_nc_safe_fopen +_nc_safe_open3 +_nc_safe_strcat +_nc_safe_strcpy +_nc_screen_chain +_nc_screen_of +_nc_set_buffer +_nc_set_buffer_sp +_nc_set_no_padding +_nc_set_source +_nc_set_tty_mode +_nc_set_tty_mode_sp +_nc_set_type +_nc_set_writedir +_nc_setupterm +_nc_str_copy +_nc_str_init +_nc_str_null +_nc_strict_bsd +_nc_suppress_warnings +_nc_syntax +_nc_syserr_abort +_nc_tail +_nc_tgetent_leaks +_nc_tic_dir +_nc_tic_expand +_nc_tic_written +_nc_timed_wait +_nc_tinfo_fkeys +_nc_tinfo_fkeysf +_nc_tiparm +_nc_tparm_analyze +_nc_tparm_err +_nc_tputs_trace +_nc_trace_buf +_nc_trace_bufcat +_nc_tracechar +_nc_tracing +_nc_trans_string +_nc_trim_sgr0 +_nc_unicode_locale +_nc_update_screensize +_nc_user_definable +_nc_visbuf +_nc_visbuf2 +_nc_visbufn +_nc_viscbuf +_nc_wacs_width +_nc_warning +_nc_write_entry +_nc_write_object +_traceattr +_traceattr2 +_tracechar +_tracechtype +_tracechtype2 +_tracef +acs_map +addch +addchnstr +addchstr +addnstr +addstr +alloc_pair +alloc_pair_sp +assume_default_colors +assume_default_colors_sp +attr_get +attr_off +attr_on +attr_set +attroff +attron +attrset +baudrate +baudrate_sp +beep +beep_sp +bkgd +bkgdset +boolcodes +boolfnames +boolnames +border +bottom_panel +box +can_change_color +can_change_color_sp +cbreak +cbreak_sp +ceiling_panel +chgat +clear +clearok +clrtobot +clrtoeol +color_content +color_content_sp +color_set +copywin +cur_term +current_field +current_item +curs_set +curs_set_sp +curscr +curses_trace +curses_version +data_ahead +data_behind +def_prog_mode +def_prog_mode_sp +def_shell_mode +def_shell_mode_sp +define_key +define_key_sp +del_curterm +del_curterm_sp +del_panel +delay_output +delay_output_sp +delch +deleteln +delscreen +delwin +derwin +doupdate +doupdate_sp +dup_field +dupwin +dynamic_field_info +echo +echo_sp +echochar +endwin +endwin_sp +erase +erasechar +erasechar_sp +exit_curses +exit_terminfo +extended_color_content +extended_color_content_sp +extended_pair_content +extended_pair_content_sp +field_arg +field_back +field_buffer +field_count +field_fore +field_index +field_info +field_init +field_just +field_opts +field_opts_off +field_opts_on +field_pad +field_status +field_term +field_type +field_userptr +filter +filter_sp +find_pair +find_pair_sp +flash +flash_sp +flushinp +flushinp_sp +form_driver +form_fields +form_init +form_opts +form_opts_off +form_opts_on +form_page +form_request_by_name +form_request_name +form_sub +form_term +form_userptr +form_win +free_field +free_fieldtype +free_form +free_item +free_menu +free_pair +free_pair_sp +get_escdelay +get_escdelay_sp +getattrs +getbegx +getbegy +getbkgd +getch +getcurx +getcury +getmaxx +getmaxy +getmouse +getmouse_sp +getnstr +getparx +getpary +getstr +getwin +getwin_sp +ground_panel +halfdelay +halfdelay_sp +has_colors +has_colors_sp +has_ic +has_ic_sp +has_il +has_il_sp +has_key +has_key_sp +has_mouse +has_mouse_sp +hide_panel +hline +idcok +idlok +immedok +inch +inchnstr +inchstr +init_color +init_color_sp +init_extended_color +init_extended_color_sp +init_extended_pair +init_extended_pair_sp +init_pair +init_pair_sp +initscr +innstr +insch +insdelln +insertln +insnstr +insstr +instr +intrflush +intrflush_sp +is_cbreak +is_cbreak_sp +is_cleared +is_echo +is_echo_sp +is_idcok +is_idlok +is_immedok +is_keypad +is_leaveok +is_linetouched +is_nl +is_nl_sp +is_nodelay +is_notimeout +is_pad +is_raw +is_raw_sp +is_scrollok +is_subwin +is_syncok +is_term_resized +is_term_resized_sp +is_wintouched +isendwin +isendwin_sp +item_count +item_description +item_index +item_init +item_name +item_opts +item_opts_off +item_opts_on +item_term +item_userptr +item_value +item_visible +key_defined +key_defined_sp +keybound +keybound_sp +keyname +keyname_sp +keyok +keyok_sp +keypad +killchar +killchar_sp +leaveok +link_field +link_fieldtype +longname +longname_sp +mcprint +mcprint_sp +menu_back +menu_driver +menu_fore +menu_format +menu_grey +menu_init +menu_items +menu_mark +menu_opts +menu_opts_off +menu_opts_on +menu_pad +menu_pattern +menu_request_by_name +menu_request_name +menu_spacing +menu_sub +menu_term +menu_userptr +menu_win +meta +mouse_trafo +mouseinterval +mouseinterval_sp +mousemask +mousemask_sp +move +move_field +move_panel +mvaddch +mvaddchnstr +mvaddchstr +mvaddnstr +mvaddstr +mvchgat +mvcur +mvcur_sp +mvdelch +mvderwin +mvgetch +mvgetnstr +mvgetstr +mvhline +mvinch +mvinchnstr +mvinchstr +mvinnstr +mvinsch +mvinsnstr +mvinsstr +mvinstr +mvprintw +mvscanw +mvvline +mvwaddch +mvwaddchnstr +mvwaddchstr +mvwaddnstr +mvwaddstr +mvwchgat +mvwdelch +mvwgetch +mvwgetnstr +mvwgetstr +mvwhline +mvwin +mvwinch +mvwinchnstr +mvwinchstr +mvwinnstr +mvwinsch +mvwinsnstr +mvwinsstr +mvwinstr +mvwprintw +mvwscanw +mvwvline +napms +napms_sp +new_field +new_fieldtype +new_form +new_form_sp +new_item +new_menu +new_menu_sp +new_page +new_panel +new_prescr +newpad +newpad_sp +newscr +newterm +newterm_sp +newwin +newwin_sp +nl +nl_sp +nocbreak +nocbreak_sp +nodelay +noecho +noecho_sp +nofilter +nofilter_sp +nonl +nonl_sp +noqiflush +noqiflush_sp +noraw +noraw_sp +notimeout +numcodes +numfnames +numnames +ospeed +overlay +overwrite +pair_content +pair_content_sp +panel_above +panel_below +panel_hidden +panel_userptr +panel_window +pechochar +pnoutrefresh +pos_form_cursor +pos_menu_cursor +post_form +post_menu +prefresh +printw +putp +putp_sp +putwin +qiflush +qiflush_sp +raw +raw_sp +redrawwin +refresh +replace_panel +reset_color_pairs +reset_color_pairs_sp +reset_prog_mode +reset_prog_mode_sp +reset_shell_mode +reset_shell_mode_sp +resetty +resetty_sp +resize_term +resize_term_sp +resizeterm +resizeterm_sp +restartterm +restartterm_sp +ripoffline +ripoffline_sp +savetty +savetty_sp +scale_form +scale_menu +scanw +scr_dump +scr_init +scr_init_sp +scr_restore +scr_restore_sp +scr_set +scr_set_sp +scrl +scroll +scrollok +set_current_field +set_current_item +set_curterm +set_curterm_sp +set_escdelay +set_escdelay_sp +set_field_back +set_field_buffer +set_field_fore +set_field_init +set_field_just +set_field_opts +set_field_pad +set_field_status +set_field_term +set_field_type +set_field_userptr +set_fieldtype_arg +set_fieldtype_choice +set_form_fields +set_form_init +set_form_opts +set_form_page +set_form_sub +set_form_term +set_form_userptr +set_form_win +set_item_init +set_item_opts +set_item_term +set_item_userptr +set_item_value +set_max_field +set_menu_back +set_menu_fore +set_menu_format +set_menu_grey +set_menu_init +set_menu_items +set_menu_mark +set_menu_opts +set_menu_pad +set_menu_pattern +set_menu_spacing +set_menu_sub +set_menu_term +set_menu_userptr +set_menu_win +set_new_page +set_panel_userptr +set_tabsize +set_tabsize_sp +set_term +set_top_row +setscrreg +setupterm +show_panel +slk_attr +slk_attr_off +slk_attr_on +slk_attr_set +slk_attr_set_sp +slk_attr_sp +slk_attroff +slk_attroff_sp +slk_attron +slk_attron_sp +slk_attrset +slk_attrset_sp +slk_clear +slk_clear_sp +slk_color +slk_color_sp +slk_init +slk_init_sp +slk_label +slk_label_sp +slk_noutrefresh +slk_noutrefresh_sp +slk_refresh +slk_refresh_sp +slk_restore +slk_restore_sp +slk_set +slk_set_sp +slk_touch +slk_touch_sp +standend +standout +start_color +start_color_sp +stdscr +strcodes +strfnames +strnames +subpad +subwin +syncok +termattrs +termattrs_sp +termname +termname_sp +tgetent +tgetent_sp +tgetflag +tgetflag_sp +tgetnum +tgetnum_sp +tgetstr +tgetstr_sp +tgoto +tigetflag +tigetflag_sp +tigetnum +tigetnum_sp +tigetstr +tigetstr_sp +timeout +tiparm +tiparm_s +tiscan_s +top_panel +top_row +touchline +touchwin +tparm +tputs +tputs_sp +trace +ttytype +typeahead +typeahead_sp +unctrl +unctrl_sp +unfocus_current_field +ungetch +ungetch_sp +ungetmouse +ungetmouse_sp +unpost_form +unpost_menu +untouchwin +update_panels +update_panels_sp +use_default_colors +use_default_colors_sp +use_env +use_env_sp +use_extended_names +use_legacy_coding +use_legacy_coding_sp +use_screen +use_tioctl +use_tioctl_sp +use_window +vid_attr +vidattr +vidattr_sp +vidputs +vidputs_sp +vline +vw_printw +vw_scanw +vwprintw +vwscanw +waddch +waddchnstr +waddchstr +waddnstr +waddstr +wattr_get +wattr_off +wattr_on +wattr_set +wattroff +wattron +wattrset +wbkgd +wbkgdset +wborder +wchgat +wclear +wclrtobot +wclrtoeol +wcolor_set +wcursyncup +wdelch +wdeleteln +wechochar +wenclose +werase +wgetch +wgetch_events +wgetdelay +wgetnstr +wgetnstr_events +wgetparent +wgetscrreg +wgetstr +whline +winch +winchnstr +winchstr +winnstr +winsch +winsdelln +winsertln +winsnstr +winsstr +winstr +wmouse_trafo +wmove +wnoutrefresh +wprintw +wredrawln +wrefresh +wresize +wscanw +wscrl +wsetscrreg +wstandend +wstandout +wsyncdown +wsyncup +wtimeout +wtouchln +wvline diff --git a/contrib/ncurses/package/ncursest.map b/contrib/ncurses/package/ncursest.map new file mode 100644 index 00000000..1dfbe532 --- /dev/null +++ b/contrib/ncurses/package/ncursest.map @@ -0,0 +1,1199 @@ +# $Id: ncursest.map,v 1.56 2024/04/27 14:33:24 tom Exp $ +# script for shared library symbol-versioning using ld +# +# This file was generated by ncu-mapsyms +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace +# Configure options (6.0.current) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace + +NCURSES_TIC_5.0.19991023 { + global: + _nc_capcmp; + _nc_check_termtype; + _nc_entry_match; + _nc_infotocap; + _nc_read_entry_source; + _nc_reset_input; + _nc_resolve_uses; + _nc_screen; + _nc_set_writedir; + _nc_syntax; + _nc_tic_expand; + _nc_tic_written; + _nc_trans_string; + _nc_write_entry; + local: + _nc_captoinfo; + _nc_comment_end; + _nc_comment_start; + _nc_copy_entry; + _nc_curr_file_pos; + _nc_curr_token; + _nc_get_token; + _nc_init_entry; + _nc_merge_entry; + _nc_panic_mode; + _nc_parse_entry; + _nc_push_token; + _nc_save_str; + _nc_start_line; + _nc_wrap_entry; +}; + +NCURSES_TIC_5.1.20000708 { + global: + _nc_disable_period; +} NCURSES_TIC_5.0.19991023; + +NCURSES_TIC_5.5.20051010 { + global: + _nc_alloc_entry_leaks; + _nc_captoinfo_leaks; + _nc_check_termtype2; + _nc_comp_scan_leaks; + _nc_resolve_uses2; +} NCURSES_TIC_5.1.20000708; + +NCURSES_TIC_5.7.20081102 { + global: + _nc_free_tic; + local: + _nc_comp_captab_leaks; + _nc_leaks_tic; +} NCURSES_TIC_5.5.20051010; + +NCURSES_TIC_5.9.20150530 { + global: + _nc_strict_bsd; +} NCURSES_TIC_5.7.20081102; + +NCURSES_TIC_6.1.20171230 { + global: + _nc_read_entry2; + _nc_write_object; + local: + _*; +} NCURSES_TIC_5.9.20150530; + +NCURSES_TINFO_5.0.19991023 { + global: + BC; + PC; + SP; + UP; + _nc_access; + _nc_add_to_try; + _nc_copy_termtype; + _nc_curr_col; + _nc_curr_line; + _nc_doalloc; + _nc_err_abort; + _nc_fallback; + _nc_find_entry; + _nc_find_type_entry; + _nc_first_name; + _nc_free_entries; + _nc_free_termtype; + _nc_free_tparm; + _nc_freeall; + _nc_get_hash_table; + _nc_get_table; + _nc_get_tty_mode; + _nc_get_type; + _nc_getenv_num; + _nc_head; + _nc_home_terminfo; + _nc_init_acs; + _nc_keep_tic_dir; + _nc_keypad; + _nc_name_match; + _nc_outch; + _nc_read_entry; + _nc_read_file_entry; + _nc_screen_chain; + _nc_set_buffer; + _nc_set_source; + _nc_set_tty_mode; + _nc_set_type; + _nc_suppress_warnings; + _nc_syserr_abort; + _nc_tail; + _nc_tic_dir; + _nc_timed_wait; + _nc_tinfo_fkeysf; + _nc_trace_buf; + _nc_tracing; + _nc_update_screensize; + _nc_visbuf; + _nc_visbuf2; + _nc_warning; + _tracechar; + baudrate; + cbreak; + curs_set; + curses_version; + def_prog_mode; + def_shell_mode; + define_key; + del_curterm; + delay_output; + erasechar; + flushinp; + halfdelay; + has_ic; + has_il; + has_key; + idcok; + idlok; + intrflush; + keybound; + keyname; + keyok; + keypad; + killchar; + longname; + meta; + napms; + nocbreak; + nodelay; + noqiflush; + noraw; + notimeout; + ospeed; + putp; + qiflush; + raw; + reset_prog_mode; + reset_shell_mode; + resetty; + savetty; + set_curterm; + setupterm; + termname; + tgetent; + tgetflag; + tgetnum; + tgetstr; + tgoto; + tigetflag; + tigetnum; + tigetstr; + tparm; + tputs; + trace; + typeahead; + unctrl; + use_env; + wtimeout; + local: + _nc_baudrate; + _nc_expand_try; + _nc_init_keytry; + _nc_nulls_sent; + _nc_ospeed; + _nc_read_termcap; + _nc_read_termcap_entry; + _nc_remove_key; + _nc_remove_string; + _nc_trace_tries; + _nc_tracebits; +}; + +NCURSES_TINFO_5.1.20000708 { + global: + _nc_align_termtype; + _nc_flush; + _nc_tinfo_fkeys; + _nc_user_definable; + use_extended_names; +} NCURSES_TINFO_5.0.19991023; + +NCURSES_TINFO_5.2.20001021 { + global: + _nc_basename; + _nc_env_access; + _nc_safe_strcat; + _nc_safe_strcpy; + _nc_str_copy; + _nc_str_init; + _nc_str_null; +} NCURSES_TINFO_5.1.20000708; + +NCURSES_TINFO_5.3.20021019 { + global: + _nc_rootname; + _nc_tparm_err; + _nc_visbufn; +} NCURSES_TINFO_5.2.20001021; + +NCURSES_TINFO_5.4.20040208 { + global: + _nc_get_locale; + _nc_locale_breaks_acs; + _nc_pathlast; + _nc_retrace_attr_t; + _nc_retrace_bool; + _nc_retrace_chtype; + _nc_retrace_int; + _nc_retrace_ptr; + _nc_retrace_sp; + _nc_retrace_unsigned; + _nc_retrace_win; + _nc_tparm_analyze; + _nc_trace_bufcat; + _nc_unicode_locale; + _traceattr; + _traceattr2; + _tracechtype; + _tracechtype2; + _tracef; + key_defined; + local: + _nc_altcharset_name; + _nc_trace_ttymode; +} NCURSES_TINFO_5.3.20021019; + +NCURSES_TINFO_5.5.20051010 { + global: + _nc_get_source; + _nc_retrace_cptr; + _nc_retrace_cvoid_ptr; + _nc_retrace_void_ptr; + _nc_setupterm; + _nc_trim_sgr0; + local: + _nc_delink_entry; + _nc_free_entry; +} NCURSES_TINFO_5.4.20040208; + +NCURSES_TINFO_5.6.20061217 { + global: + _nc_db_close; + _nc_db_first; + _nc_db_have_data; + _nc_db_next; + _nc_db_open; + _nc_db_put; + _nc_eventlist_timeout; + _nc_first_db; + _nc_handle_sigwinch; + _nc_is_abs_path; + _nc_is_dir_path; + _nc_is_file_path; + _nc_keyname_leaks; + _nc_last_db; + _nc_next_db; + _nc_read_termtype; + _nc_tgetent_leaks; + _nc_viscbuf; + local: + _nc_db_get; + _nc_db_have_index; + _nc_hashed_db; + _nc_viscbuf2; +} NCURSES_TINFO_5.5.20051010; + +NCURSES_TINFO_5.7.20081102 { + global: + _nc_COLS; + _nc_LINES; + _nc_TABSIZE; + _nc__nc_outchars; + _nc_acs_map; + _nc_boolcodes; + _nc_boolfnames; + _nc_boolnames; + _nc_codes_leaks; + _nc_count_outchars; + _nc_cur_term; + _nc_curscr; + _nc_free_tinfo; + _nc_get_alias_table; + _nc_get_screensize; + _nc_globals; + _nc_init_pthreads; + _nc_leaks_tinfo; + _nc_locked_tracef; + _nc_mutex_lock; + _nc_mutex_trylock; + _nc_mutex_unlock; + _nc_names_leaks; + _nc_newscr; + _nc_numcodes; + _nc_numfnames; + _nc_numnames; + _nc_prescreen; + _nc_ptr_Cols; + _nc_ptr_Lines; + _nc_screen_of; + _nc_set_no_padding; + _nc_set_tputs_trace; + _nc_stdscr; + _nc_strcodes; + _nc_strfnames; + _nc_strnames; + _nc_tracechar; + _nc_ttytype; + _nc_use_tracef; + set_tabsize; + local: + _nc__nc_tputs_trace; + _nc_keyname; + _nc_mutex_init; + _nc_unctrl; +} NCURSES_TINFO_5.6.20061217; + +NCURSES_TINFO_5.8.20110226 { + global: + _nc_flush_sp; + _nc_get_tty_mode_sp; + _nc_init_acs_sp; + _nc_outc_wrapper; + _nc_outch_sp; + _nc_putp; + _nc_putp_flush; + _nc_putp_flush_sp; + _nc_putp_sp; + _nc_retrace_int_attr_t; + _nc_set_buffer_sp; + _nc_set_tty_mode_sp; + _nc_sigprocmask; + baudrate_sp; + cbreak_sp; + curs_set_sp; + def_prog_mode_sp; + def_shell_mode_sp; + define_key_sp; + del_curterm_sp; + delay_output_sp; + erasechar_sp; + flushinp_sp; + halfdelay_sp; + has_ic_sp; + has_il_sp; + has_key_sp; + intrflush_sp; + key_defined_sp; + keybound_sp; + keyname_sp; + keyok_sp; + killchar_sp; + longname_sp; + napms_sp; + new_prescr; + nocbreak_sp; + noqiflush_sp; + noraw_sp; + putp_sp; + qiflush_sp; + raw_sp; + reset_prog_mode_sp; + reset_shell_mode_sp; + resetty_sp; + savetty_sp; + set_curterm_sp; + set_tabsize_sp; + termname_sp; + tgetent_sp; + tgetflag_sp; + tgetnum_sp; + tgetstr_sp; + tigetflag_sp; + tigetnum_sp; + tigetstr_sp; + tiparm; + tputs_sp; + typeahead_sp; + unctrl_sp; + use_env_sp; + local: + _nc_get_cur_term; + _nc_get_cur_term_sp; + _nc_get_hash_info; + _nc_ptr_Tabsize; + _nc_retrace_char; + _nc_setup_tinfo; + _nc_tinfo_cmdch; +} NCURSES_TINFO_5.7.20081102; + +NCURSES_TINFO_5.9.20150530 { + global: + _nc_init_termtype; + _nc_putchar; + _nc_putchar_sp; + use_tioctl; + use_tioctl_sp; + local: + _nc_comp_error_leaks; + _nc_db_iterator_leaks; + _nc_setenv_num; +} NCURSES_TINFO_5.8.20110226; + +NCURSES_TINFO_6.1.20171230 { + global: + _nc_copy_termtype2; + _nc_export_termtype2; + _nc_fallback2; + _nc_find_prescr; + _nc_forget_prescr; + _nc_free_termtype2; +} NCURSES_TINFO_5.9.20150530; + +NCURSES_TINFO_6.2.20200212 { + global: + _nc_find_user_entry; + _nc_fmt_funcptr; + _nc_wacs_width; + curses_trace; + exit_terminfo; +} NCURSES_TINFO_6.1.20171230; + +NCURSES_TINFO_6.2.20211010 { + global: + _nc_reset_tparm; + _nc_safe_fopen; + _nc_safe_open3; + _nc_tiparm; +} NCURSES_TINFO_6.2.20200212; + +NCURSES_TINFO_6.5.20240427 { + global: + is_cbreak; + is_cbreak_sp; + is_echo; + is_echo_sp; + is_nl; + is_nl_sp; + is_raw; + is_raw_sp; + tiparm_s; + tiscan_s; + local: + _*; +} NCURSES_TINFO_6.2.20211010; + +NCURSEST_5.7.20081102 { + global: + COLOR_PAIR; + PAIR_NUMBER; + TYPE_ALNUM; + TYPE_ALPHA; + TYPE_ENUM; + TYPE_INTEGER; + TYPE_IPV4; + TYPE_NUMERIC; + TYPE_REGEXP; + _nc_COLORS; + _nc_COLOR_PAIRS; + _nc_Default_Field; # deprecated in ABI6 + _nc_Default_Form; # deprecated in ABI6 + _nc_ESCDELAY; + _nc_free_and_exit; + _nc_has_mouse; # deprecated in ABI6 + _nc_optimize_enable; + _nc_panelhook; + _nc_ripoffline; + addch; + addchnstr; + addchstr; + addnstr; + addstr; + assume_default_colors; + attr_get; + attr_off; + attr_on; + attr_set; + attroff; + attron; + attrset; + beep; + bkgd; + bkgdset; + border; + bottom_panel; + box; + can_change_color; + chgat; + clear; + clearok; + clrtobot; + clrtoeol; + color_content; + color_set; + copywin; + current_field; + current_item; + data_ahead; + data_behind; + del_panel; + delch; + deleteln; + delscreen; + delwin; + derwin; + doupdate; + dup_field; + dupwin; + dynamic_field_info; + echo; + echochar; + endwin; + erase; + field_arg; + field_back; + field_buffer; + field_count; + field_fore; + field_index; + field_info; + field_init; + field_just; + field_opts; + field_opts_off; + field_opts_on; + field_pad; + field_status; + field_term; + field_type; + field_userptr; + filter; + flash; + form_driver; + form_fields; + form_init; + form_opts; + form_opts_off; + form_opts_on; + form_page; + form_request_by_name; + form_request_name; + form_sub; + form_term; + form_userptr; + form_win; + free_field; + free_fieldtype; + free_form; + free_item; + free_menu; + getattrs; + getbegx; + getbegy; + getbkgd; + getch; + getcurx; + getcury; + getmaxx; + getmaxy; + getmouse; + getnstr; + getparx; + getpary; + getstr; + getwin; + has_colors; + hide_panel; + hline; + immedok; + inch; + inchnstr; + inchstr; + init_color; + init_pair; + initscr; + innstr; + insch; + insdelln; + insertln; + insnstr; + insstr; + instr; + is_cleared; + is_idcok; + is_idlok; + is_immedok; + is_keypad; + is_leaveok; + is_linetouched; + is_nodelay; + is_notimeout; + is_scrollok; + is_syncok; + is_term_resized; + is_wintouched; + isendwin; + item_count; + item_description; + item_index; + item_init; + item_name; + item_opts; + item_opts_off; + item_opts_on; + item_term; + item_userptr; + item_value; + item_visible; + leaveok; + link_field; + link_fieldtype; + mcprint; + menu_back; + menu_driver; + menu_fore; + menu_format; + menu_grey; + menu_init; + menu_items; + menu_mark; + menu_opts; + menu_opts_off; + menu_opts_on; + menu_pad; + menu_pattern; + menu_request_by_name; + menu_request_name; + menu_spacing; + menu_sub; + menu_term; + menu_userptr; + menu_win; + mouse_trafo; + mouseinterval; + mousemask; + move; + move_field; + move_panel; + mvaddch; + mvaddchnstr; + mvaddchstr; + mvaddnstr; + mvaddstr; + mvchgat; + mvcur; + mvdelch; + mvderwin; + mvgetch; + mvgetnstr; + mvgetstr; + mvhline; + mvinch; + mvinchnstr; + mvinchstr; + mvinnstr; + mvinsch; + mvinsnstr; + mvinsstr; + mvinstr; + mvprintw; + mvscanw; + mvvline; + mvwaddch; + mvwaddchnstr; + mvwaddchstr; + mvwaddnstr; + mvwaddstr; + mvwchgat; + mvwdelch; + mvwgetch; + mvwgetnstr; + mvwgetstr; + mvwhline; + mvwin; + mvwinch; + mvwinchnstr; + mvwinchstr; + mvwinnstr; + mvwinsch; + mvwinsnstr; + mvwinsstr; + mvwinstr; + mvwprintw; + mvwscanw; + mvwvline; + new_field; + new_fieldtype; + new_form; + new_item; + new_menu; + new_page; + new_panel; + newpad; + newterm; + newwin; + nl; + noecho; + nofilter; + nonl; + overlay; + overwrite; + pair_content; + panel_above; + panel_below; + panel_hidden; + panel_userptr; + panel_window; + pechochar; + pnoutrefresh; + pos_form_cursor; + pos_menu_cursor; + post_form; + post_menu; + prefresh; + printw; + putwin; + redrawwin; + refresh; + replace_panel; + resize_term; + resizeterm; + restartterm; + ripoffline; + scale_form; + scale_menu; + scanw; + scr_dump; + scr_init; + scr_restore; + scr_set; + scrl; + scroll; + scrollok; + set_current_field; + set_current_item; + set_escdelay; + set_field_back; + set_field_buffer; + set_field_fore; + set_field_init; + set_field_just; + set_field_opts; + set_field_pad; + set_field_status; + set_field_term; + set_field_type; + set_field_userptr; + set_fieldtype_arg; + set_fieldtype_choice; + set_form_fields; + set_form_init; + set_form_opts; + set_form_page; + set_form_sub; + set_form_term; + set_form_userptr; + set_form_win; + set_item_init; + set_item_opts; + set_item_term; + set_item_userptr; + set_item_value; + set_max_field; + set_menu_back; + set_menu_fore; + set_menu_format; + set_menu_grey; + set_menu_init; + set_menu_items; + set_menu_mark; + set_menu_opts; + set_menu_pad; + set_menu_pattern; + set_menu_spacing; + set_menu_sub; + set_menu_term; + set_menu_userptr; + set_menu_win; + set_new_page; + set_panel_userptr; + set_term; + set_top_row; + setscrreg; + show_panel; + slk_attr; + slk_attr_set; + slk_attroff; + slk_attron; + slk_attrset; + slk_clear; + slk_color; + slk_init; + slk_label; + slk_noutrefresh; + slk_refresh; + slk_restore; + slk_set; + slk_touch; + standend; + standout; + start_color; + subpad; + subwin; + syncok; + termattrs; + timeout; + top_panel; + top_row; + touchline; + touchwin; + ungetch; + ungetmouse; + unpost_form; + unpost_menu; + untouchwin; + update_panels; + use_default_colors; + use_legacy_coding; + use_screen; + use_window; + vidattr; + vidputs; + vline; + vw_printw; + vw_scanw; + vwprintw; + vwscanw; + waddch; + waddchnstr; + waddchstr; + waddnstr; + waddstr; + wattr_get; + wattr_off; + wattr_on; + wattr_set; + wattroff; + wattron; + wattrset; + wbkgd; + wbkgdset; + wborder; + wchgat; + wclear; + wclrtobot; + wclrtoeol; + wcolor_set; + wcursyncup; + wdelch; + wdeleteln; + wechochar; + wenclose; + werase; + wgetch; + wgetch_events; + wgetnstr; + wgetnstr_events; + wgetparent; + wgetscrreg; + wgetstr; + whline; + winch; + winchnstr; + winchstr; + winnstr; + winsch; + winsdelln; + winsertln; + winsnstr; + winsstr; + winstr; + wmouse_trafo; + wmove; + wnoutrefresh; + wprintw; + wredrawln; + wrefresh; + wresize; + wscanw; + wscrl; + wsetscrreg; + wstandend; + wstandout; + wsyncdown; + wsyncup; + wtouchln; + wvline; + local: + _nc_Calculate_Item_Length_and_Width; + _nc_Calculate_Text_Width; + _nc_Connect_Items; + _nc_Copy_Argument; + _nc_Copy_Type; + _nc_Default_FieldType; + _nc_Default_Item; + _nc_Default_Menu; + _nc_Disconnect_Items; + _nc_Draw_Menu; + _nc_First_Active_Field; + _nc_Free_Argument; + _nc_Free_Type; + _nc_Internal_Validation; + _nc_Link_Items; + _nc_Make_Argument; + _nc_Match_Next_Character_In_Item_Name; + _nc_New_TopRow_and_CurrentItem; + _nc_Position_Form_Cursor; + _nc_Post_Item; + _nc_Refresh_Current_Field; + _nc_Set_Current_Field; + _nc_Set_Form_Page; + _nc_Show_Menu; + _nc_Synchronize_Attributes; + _nc_Synchronize_Options; + _nc_Touchline; + _nc_Touchpan; + _nc_Wnoutrefresh; + _nc_dPanel; + _nc_dStack; + _nc_do_color; + _nc_expanded; + _nc_fifo_dump; + _nc_freewin; + _nc_hash_map; + _nc_insert_ch; + _nc_linedump; + _nc_make_oldhash; + _nc_makenew; + _nc_memmove; + _nc_menu_cursor_pos; + _nc_msec_cost; + _nc_mvcur_init; + _nc_mvcur_resume; + _nc_mvcur_wrap; + _nc_my_visbuf; + _nc_oldnums; + _nc_printf_string; + _nc_render; + _nc_reset_colors; + _nc_retrace_field; + _nc_retrace_field_ptr; + _nc_retrace_field_type; + _nc_retrace_form; + _nc_retrace_form_hook; + _nc_retrace_item; + _nc_retrace_item_opts; + _nc_retrace_item_ptr; + _nc_retrace_menu; + _nc_retrace_menu_hook; + _nc_retrace_menu_opts; + _nc_retrace_panel; + _nc_screen_init; + _nc_screen_resume; + _nc_screen_wrap; + _nc_scroll_oldhash; + _nc_scroll_optimize; + _nc_scroll_window; + _nc_scrolln; + _nc_setupscreen; + _nc_signal_handler; + _nc_slk_initialize; + _nc_synchook; + _nc_trace_xnames; + _nc_tracemouse; + _nc_ungetch; + _nc_varargs; + _nc_vsscanf; + _nc_waddch_nosync; + _nc_wgetch; + _tracedump; + _tracemouse; +}; + +NCURSEST_5.8.20110226 { + global: + _nc_panelhook_sp; + assume_default_colors_sp; + beep_sp; + can_change_color_sp; + ceiling_panel; + color_content_sp; + doupdate_sp; + echo_sp; + endwin_sp; + filter_sp; + flash_sp; + get_escdelay; + get_escdelay_sp; + getmouse_sp; + getwin_sp; + ground_panel; + has_colors_sp; + has_mouse; + has_mouse_sp; + init_color_sp; + init_pair_sp; + is_pad; + is_subwin; + is_term_resized_sp; + isendwin_sp; + mcprint_sp; + mouseinterval_sp; + mousemask_sp; + mvcur_sp; + new_form_sp; + new_menu_sp; + newpad_sp; + newterm_sp; + newwin_sp; + nl_sp; + noecho_sp; + nofilter_sp; + nonl_sp; + pair_content_sp; + resize_term_sp; + resizeterm_sp; + restartterm_sp; + ripoffline_sp; + scr_init_sp; + scr_restore_sp; + scr_set_sp; + set_escdelay_sp; + slk_attr_set_sp; + slk_attr_sp; + slk_attroff_sp; + slk_attron_sp; + slk_attrset_sp; + slk_clear_sp; + slk_color_sp; + slk_init_sp; + slk_label_sp; + slk_noutrefresh_sp; + slk_refresh_sp; + slk_restore_sp; + slk_set_sp; + slk_touch_sp; + start_color_sp; + termattrs_sp; + ungetch_sp; + ungetmouse_sp; + update_panels_sp; + use_default_colors_sp; + use_legacy_coding_sp; + vidattr_sp; + vidputs_sp; + local: + _nc_TYPE_ALNUM; + _nc_TYPE_ALPHA; + _nc_TYPE_ENUM; + _nc_TYPE_INTEGER; + _nc_TYPE_IPV4; + _nc_TYPE_NUMERIC; + _nc_TYPE_REGEXP; + _nc_curscr_of; + _nc_do_color_sp; + _nc_form_cursor; + _nc_format_slks; + _nc_free_and_exit_sp; + _nc_freeall_sp; + _nc_fty_generic; + _nc_generic_fieldtype; + _nc_get_fieldbuffer; + _nc_hash_map_sp; + _nc_linedump_sp; + _nc_make_oldhash_sp; + _nc_makenew_sp; + _nc_msec_cost_sp; + _nc_mvcur_init_sp; + _nc_mvcur_resume_sp; + _nc_mvcur_wrap_sp; + _nc_newscr_of; + _nc_printf_string_sp; + _nc_ptr_Escdelay; + _nc_reset_colors_sp; + _nc_retrace_mmask_t; + _nc_ripoffline_sp; + _nc_screen_init_sp; + _nc_screen_resume_sp; + _nc_screen_wrap_sp; + _nc_scroll_oldhash_sp; + _nc_scroll_optimize_sp; + _nc_scrolln_sp; + _nc_set_generic_fieldtype; + _nc_setupscreen_sp; + _nc_stdscr_of; +} NCURSEST_5.7.20081102; + +NCURSEST_5.9.20150530 { + global: + wgetdelay; + local: + _nc_mvcur; + _nc_mvcur_sp; + _nc_trace_mmask_t; +} NCURSEST_5.8.20110226; + +NCURSEST_6.1.20171230 { + global: + alloc_pair; + alloc_pair_sp; + extended_color_content; + extended_color_content_sp; + extended_pair_content; + extended_pair_content_sp; + find_pair; + find_pair_sp; + free_pair; + free_pair_sp; + init_extended_color; + init_extended_color_sp; + init_extended_pair; + init_extended_pair_sp; + reset_color_pairs; + reset_color_pairs_sp; + unfocus_current_field; + local: + _nc_Unset_Current_Field; + _nc_change_pair; + _nc_init_color; + _nc_init_pair; + _nc_pair_content; + _nc_reset_color_pair; + _nc_set_color_pair; +} NCURSEST_5.9.20150530; + +NCURSEST_6.2.20200212 { + global: + exit_curses; + local: + _*; +} NCURSEST_6.1.20171230; + diff --git a/contrib/ncurses/package/ncursest.spec b/contrib/ncurses/package/ncursest.spec new file mode 100644 index 00000000..8c4b8bc3 --- /dev/null +++ b/contrib/ncurses/package/ncursest.spec @@ -0,0 +1,187 @@ +Summary: Curses library with POSIX thread support. +Name: ncursest6 +Version: 6.5 +Release: 20241102 +License: X11 +Group: Development/Libraries +Source: ncurses-%{version}-%{release}.tgz +# URL: https://invisible-island.net/ncurses/ + +%global MY_ABI 6 + +# save value before redefining +%global sys_libdir %{_libdir} + +# was redefined... +#global _prefix /usr/local/ncurses#{MY_ABI} + +%global MY_PKG %{sys_libdir}/pkgconfig +%define MYDATA /usr/local/ncurses/share/terminfo + +%description +The ncurses library routines are a terminal-independent method of +updating character screens with reasonable optimization. + +This package is used for testing ABI %{MY_ABI} with POSIX threads. + +%prep + +%global is_mandriva %(test -f /etc/mandriva-release && echo 1 || echo 0) +%global is_fedora %(test -f /usr/bin/dnf && echo 1 || echo 0) +%global is_centos %(test -f /etc/centos-release && echo 1 || echo 0) +%global is_redhat %(test -f /etc/redhat-release && echo 1 || echo 0) +%global is_scilinux %(test -f /etc/sl-release && echo 1 || echo 0) +%global is_suse %(test -f /etc/SuSE-release && echo 1 || echo 0) + +%if %{is_redhat} +# generate debug/debug-source packages. +%else +%define debug_package %{nil} +%endif + +%if %{is_mandriva} +%define _disable_ld_as_needed 1 +%define _disable_ld_no_undefined 1 +# libtool is not used here... +%define _disable_libtoolize 1 +%define _disable_ld_build_id 1 +%endif + +%if %{is_fedora} || %{is_scilinux} || %{is_centos} +# workaround for toolset breakage in Fedora 28 +%define _test_relink --enable-relink +%else +%define _test_relink --disable-relink +%endif + +%setup -q -n ncurses-%{version}-%{release} + +%build +%define CFG_OPTS \\\ + --target %{_target_platform} \\\ + --prefix=%{_prefix} \\\ + --bindir=%{_bindir} \\\ + --includedir=%{_includedir} \\\ + --libdir=%{_libdir} \\\ + --includedir='${prefix}/include' \\\ + --disable-echo \\\ + --disable-getcap \\\ + --disable-leaks \\\ + --disable-macros \\\ + --disable-overwrite \\\ + %{_test_relink} \\\ + --disable-termcap \\\ + --enable-hard-tabs \\\ + --enable-opaque-curses \\\ + --enable-opaque-form \\\ + --enable-opaque-menu \\\ + --enable-opaque-panel \\\ + --enable-pc-files \\\ + --enable-rpath \\\ + --enable-warnings \\\ + --enable-wgetch-events \\\ + --enable-widec \\\ + --enable-xmc-glitch \\\ + --program-suffix=%{MY_ABI} \\\ + --verbose \\\ + --with-abi-version=%{MY_ABI} \\\ + --with-config-suffix=dev \\\ + --with-cxx-shared \\\ + --with-default-terminfo-dir=%{MYDATA} \\\ + --with-develop \\\ + --with-extra-suffix=%{MY_ABI} \\\ + --with-install-prefix=$RPM_BUILD_ROOT \\\ + --with-pkg-config-libdir=%{MY_PKG} \\\ + --with-shared \\\ + --with-terminfo-dirs=%{MYDATA}:/usr/share/terminfo \\\ + --with-termlib \\\ + --with-ticlib \\\ + --with-trace \\\ + --with-versioned-syms \\\ + --with-xterm-kbs=DEL \\\ + --without-ada \\\ + --without-debug \\\ + --without-normal + +%configure %{CFG_OPTS} \ + --enable-interop \ + --enable-sp-funcs \ + --program-suffix=t%{MY_ABI} \ + --with-pthread +make + +%install +rm -rf $RPM_BUILD_ROOT + +make install.libs install.progs +rm -f test/ncurses +( cd test && make ncurses LOCAL_LIBDIR=%{_libdir} && mv ncurses $RPM_BUILD_ROOT/%{_bindir}/ncursest%{MY_ABI} ) + +%if %{is_mandriva} +# check this first because Mageia has the /etc/redhat-release file... +%else +%if %{is_fedora} +%ldconfig_scriptlets libs +%ldconfig_scriptlets c++-libs +%endif +%endif + +%clean +if rm -rf $RPM_BUILD_ROOT; then + echo OK +else + find $RPM_BUILD_ROOT -type f | grep -F -v /.nfs && exit 1 +fi +exit 0 + +%files +%defattr(-,root,root,-) +%{_bindir}/* +%{_includedir}/* +%{_libdir}/* + +%changelog + +* Tue Dec 24 2019 Thomas Dickey +- drop custom CC_NORMAL warning flags because setting CFLAGS interferes with + matching Fedora's PIE/PIC configuration. Also, generate debug/debug-source + packages. + +* Sat Nov 16 2019 Thomas Dickey +- modify clean-rule to work around Fedora NFS bugs. + +* Sat Aug 25 2018 Thomas E. Dickey +- split spec-file into ncurses6 and ncursest6 to work around toolset breakage + in Fedora 28 + +* Sat Jun 02 2018 Thomas E. Dickey +- build-fix for Mageia + +* Sat May 26 2018 Thomas E. Dickey +- use predefined configure-macro +- separate ncurses6/ncursest6 packages + +* Sat Feb 10 2018 Thomas E. Dickey +- add ncursest6 package +- add several development features + +* Mon Jan 01 2018 Thomas E. Dickey +- drop redundant files pattern for "*.pc" + +* Tue Dec 26 2017 Thomas E. Dickey +- add --with-config-suffix option + +* Sun Apr 26 2015 Thomas E. Dickey +- move package to /usr + +* Sun Apr 12 2015 Thomas E. Dickey +- factor-out MY_ABI + +* Sat Mar 09 2013 Thomas E. Dickey +- add --with-cxx-shared option to demonstrate c++ binding as shared library + +* Sat Oct 27 2012 Thomas E. Dickey +- add ncurses program as "ncurses6" to provide demonstration. + +* Fri Jun 08 2012 Thomas E. Dickey +- initial version. diff --git a/contrib/ncurses/package/ncursest.sym b/contrib/ncurses/package/ncursest.sym new file mode 100644 index 00000000..9423d379 --- /dev/null +++ b/contrib/ncurses/package/ncursest.sym @@ -0,0 +1,897 @@ +# $Id: ncursest.sym,v 1.43 2023/08/12 15:28:50 tom Exp $ +# script for shared library symbol-visibility using libtool +# +# This file was generated by ncu-mapsyms +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace +# Configure options (6.0.20161029) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace +BC +COLOR_PAIR +PAIR_NUMBER +PC +SP +TYPE_ALNUM +TYPE_ALPHA +TYPE_ENUM +TYPE_INTEGER +TYPE_IPV4 +TYPE_NUMERIC +TYPE_REGEXP +UP +_nc_COLORS +_nc_COLOR_PAIRS +_nc_COLS +_nc_Default_Field +_nc_Default_Form +_nc_ESCDELAY +_nc_LINES +_nc_TABSIZE +_nc__nc_outchars +_nc_access +_nc_acs_map +_nc_add_to_try +_nc_align_termtype +_nc_alloc_entry_leaks +_nc_basename +_nc_boolcodes +_nc_boolfnames +_nc_boolnames +_nc_capcmp +_nc_captoinfo_leaks +_nc_check_termtype +_nc_check_termtype2 +_nc_codes_leaks +_nc_comp_scan_leaks +_nc_copy_termtype +_nc_copy_termtype2 +_nc_count_outchars +_nc_cur_term +_nc_curr_col +_nc_curr_line +_nc_curscr +_nc_db_close +_nc_db_first +_nc_db_have_data +_nc_db_next +_nc_db_open +_nc_db_put +_nc_disable_period +_nc_doalloc +_nc_entry_match +_nc_env_access +_nc_err_abort +_nc_eventlist_timeout +_nc_export_termtype2 +_nc_fallback +_nc_fallback2 +_nc_find_entry +_nc_find_prescr +_nc_find_type_entry +_nc_find_user_entry +_nc_first_db +_nc_first_name +_nc_flush +_nc_flush_sp +_nc_fmt_funcptr +_nc_forget_prescr +_nc_free_and_exit +_nc_free_entries +_nc_free_termtype +_nc_free_termtype2 +_nc_free_tic +_nc_free_tinfo +_nc_free_tparm +_nc_freeall +_nc_get_alias_table +_nc_get_hash_table +_nc_get_locale +_nc_get_screensize +_nc_get_source +_nc_get_table +_nc_get_tty_mode +_nc_get_tty_mode_sp +_nc_get_type +_nc_getenv_num +_nc_globals +_nc_handle_sigwinch +_nc_has_mouse +_nc_head +_nc_home_terminfo +_nc_infotocap +_nc_init_acs +_nc_init_acs_sp +_nc_init_pthreads +_nc_init_termtype +_nc_is_abs_path +_nc_is_dir_path +_nc_is_file_path +_nc_keep_tic_dir +_nc_keyname_leaks +_nc_keypad +_nc_last_db +_nc_leaks_tinfo +_nc_locale_breaks_acs +_nc_locked_tracef +_nc_mutex_lock +_nc_mutex_trylock +_nc_mutex_unlock +_nc_name_match +_nc_names_leaks +_nc_newscr +_nc_next_db +_nc_numcodes +_nc_numfnames +_nc_numnames +_nc_optimize_enable +_nc_outc_wrapper +_nc_outch +_nc_outch_sp +_nc_panelhook +_nc_panelhook_sp +_nc_pathlast +_nc_prescreen +_nc_ptr_Cols +_nc_ptr_Lines +_nc_putchar +_nc_putchar_sp +_nc_putp +_nc_putp_flush +_nc_putp_flush_sp +_nc_putp_sp +_nc_read_entry +_nc_read_entry2 +_nc_read_entry_source +_nc_read_file_entry +_nc_read_termtype +_nc_reset_input +_nc_reset_tparm +_nc_resolve_uses +_nc_resolve_uses2 +_nc_retrace_attr_t +_nc_retrace_bool +_nc_retrace_chtype +_nc_retrace_cptr +_nc_retrace_cvoid_ptr +_nc_retrace_int +_nc_retrace_int_attr_t +_nc_retrace_ptr +_nc_retrace_sp +_nc_retrace_unsigned +_nc_retrace_void_ptr +_nc_retrace_win +_nc_ripoffline +_nc_rootname +_nc_safe_fopen +_nc_safe_open3 +_nc_safe_strcat +_nc_safe_strcpy +_nc_screen +_nc_screen_chain +_nc_screen_of +_nc_set_buffer +_nc_set_buffer_sp +_nc_set_no_padding +_nc_set_source +_nc_set_tputs_trace +_nc_set_tty_mode +_nc_set_tty_mode_sp +_nc_set_type +_nc_set_writedir +_nc_setupterm +_nc_sigprocmask +_nc_stdscr +_nc_str_copy +_nc_str_init +_nc_str_null +_nc_strcodes +_nc_strfnames +_nc_strict_bsd +_nc_strnames +_nc_suppress_warnings +_nc_syntax +_nc_syserr_abort +_nc_tail +_nc_tgetent_leaks +_nc_tic_dir +_nc_tic_expand +_nc_tic_written +_nc_timed_wait +_nc_tinfo_fkeys +_nc_tinfo_fkeysf +_nc_tiparm +_nc_tparm_analyze +_nc_tparm_err +_nc_trace_buf +_nc_trace_bufcat +_nc_tracechar +_nc_tracing +_nc_trans_string +_nc_trim_sgr0 +_nc_ttytype +_nc_unicode_locale +_nc_update_screensize +_nc_use_tracef +_nc_user_definable +_nc_visbuf +_nc_visbuf2 +_nc_visbufn +_nc_viscbuf +_nc_wacs_width +_nc_warning +_nc_write_entry +_nc_write_object +_traceattr +_traceattr2 +_tracechar +_tracechtype +_tracechtype2 +_tracef +addch +addchnstr +addchstr +addnstr +addstr +alloc_pair +alloc_pair_sp +assume_default_colors +assume_default_colors_sp +attr_get +attr_off +attr_on +attr_set +attroff +attron +attrset +baudrate +baudrate_sp +beep +beep_sp +bkgd +bkgdset +border +bottom_panel +box +can_change_color +can_change_color_sp +cbreak +cbreak_sp +ceiling_panel +chgat +clear +clearok +clrtobot +clrtoeol +color_content +color_content_sp +color_set +copywin +current_field +current_item +curs_set +curs_set_sp +curses_trace +curses_version +data_ahead +data_behind +def_prog_mode +def_prog_mode_sp +def_shell_mode +def_shell_mode_sp +define_key +define_key_sp +del_curterm +del_curterm_sp +del_panel +delay_output +delay_output_sp +delch +deleteln +delscreen +delwin +derwin +doupdate +doupdate_sp +dup_field +dupwin +dynamic_field_info +echo +echo_sp +echochar +endwin +endwin_sp +erase +erasechar +erasechar_sp +exit_curses +exit_terminfo +extended_color_content +extended_color_content_sp +extended_pair_content +extended_pair_content_sp +field_arg +field_back +field_buffer +field_count +field_fore +field_index +field_info +field_init +field_just +field_opts +field_opts_off +field_opts_on +field_pad +field_status +field_term +field_type +field_userptr +filter +filter_sp +find_pair +find_pair_sp +flash +flash_sp +flushinp +flushinp_sp +form_driver +form_fields +form_init +form_opts +form_opts_off +form_opts_on +form_page +form_request_by_name +form_request_name +form_sub +form_term +form_userptr +form_win +free_field +free_fieldtype +free_form +free_item +free_menu +free_pair +free_pair_sp +get_escdelay +get_escdelay_sp +getattrs +getbegx +getbegy +getbkgd +getch +getcurx +getcury +getmaxx +getmaxy +getmouse +getmouse_sp +getnstr +getparx +getpary +getstr +getwin +getwin_sp +ground_panel +halfdelay +halfdelay_sp +has_colors +has_colors_sp +has_ic +has_ic_sp +has_il +has_il_sp +has_key +has_key_sp +has_mouse +has_mouse_sp +hide_panel +hline +idcok +idlok +immedok +inch +inchnstr +inchstr +init_color +init_color_sp +init_extended_color +init_extended_color_sp +init_extended_pair +init_extended_pair_sp +init_pair +init_pair_sp +initscr +innstr +insch +insdelln +insertln +insnstr +insstr +instr +intrflush +intrflush_sp +is_cbreak +is_cbreak_sp +is_cleared +is_echo +is_echo_sp +is_idcok +is_idlok +is_immedok +is_keypad +is_leaveok +is_linetouched +is_nl +is_nl_sp +is_nodelay +is_notimeout +is_pad +is_raw +is_raw_sp +is_scrollok +is_subwin +is_syncok +is_term_resized +is_term_resized_sp +is_wintouched +isendwin +isendwin_sp +item_count +item_description +item_index +item_init +item_name +item_opts +item_opts_off +item_opts_on +item_term +item_userptr +item_value +item_visible +key_defined +key_defined_sp +keybound +keybound_sp +keyname +keyname_sp +keyok +keyok_sp +keypad +killchar +killchar_sp +leaveok +link_field +link_fieldtype +longname +longname_sp +mcprint +mcprint_sp +menu_back +menu_driver +menu_fore +menu_format +menu_grey +menu_init +menu_items +menu_mark +menu_opts +menu_opts_off +menu_opts_on +menu_pad +menu_pattern +menu_request_by_name +menu_request_name +menu_spacing +menu_sub +menu_term +menu_userptr +menu_win +meta +mouse_trafo +mouseinterval +mouseinterval_sp +mousemask +mousemask_sp +move +move_field +move_panel +mvaddch +mvaddchnstr +mvaddchstr +mvaddnstr +mvaddstr +mvchgat +mvcur +mvcur_sp +mvdelch +mvderwin +mvgetch +mvgetnstr +mvgetstr +mvhline +mvinch +mvinchnstr +mvinchstr +mvinnstr +mvinsch +mvinsnstr +mvinsstr +mvinstr +mvprintw +mvscanw +mvvline +mvwaddch +mvwaddchnstr +mvwaddchstr +mvwaddnstr +mvwaddstr +mvwchgat +mvwdelch +mvwgetch +mvwgetnstr +mvwgetstr +mvwhline +mvwin +mvwinch +mvwinchnstr +mvwinchstr +mvwinnstr +mvwinsch +mvwinsnstr +mvwinsstr +mvwinstr +mvwprintw +mvwscanw +mvwvline +napms +napms_sp +new_field +new_fieldtype +new_form +new_form_sp +new_item +new_menu +new_menu_sp +new_page +new_panel +new_prescr +newpad +newpad_sp +newterm +newterm_sp +newwin +newwin_sp +nl +nl_sp +nocbreak +nocbreak_sp +nodelay +noecho +noecho_sp +nofilter +nofilter_sp +nonl +nonl_sp +noqiflush +noqiflush_sp +noraw +noraw_sp +notimeout +ospeed +overlay +overwrite +pair_content +pair_content_sp +panel_above +panel_below +panel_hidden +panel_userptr +panel_window +pechochar +pnoutrefresh +pos_form_cursor +pos_menu_cursor +post_form +post_menu +prefresh +printw +putp +putp_sp +putwin +qiflush +qiflush_sp +raw +raw_sp +redrawwin +refresh +replace_panel +reset_color_pairs +reset_color_pairs_sp +reset_prog_mode +reset_prog_mode_sp +reset_shell_mode +reset_shell_mode_sp +resetty +resetty_sp +resize_term +resize_term_sp +resizeterm +resizeterm_sp +restartterm +restartterm_sp +ripoffline +ripoffline_sp +savetty +savetty_sp +scale_form +scale_menu +scanw +scr_dump +scr_init +scr_init_sp +scr_restore +scr_restore_sp +scr_set +scr_set_sp +scrl +scroll +scrollok +set_current_field +set_current_item +set_curterm +set_curterm_sp +set_escdelay +set_escdelay_sp +set_field_back +set_field_buffer +set_field_fore +set_field_init +set_field_just +set_field_opts +set_field_pad +set_field_status +set_field_term +set_field_type +set_field_userptr +set_fieldtype_arg +set_fieldtype_choice +set_form_fields +set_form_init +set_form_opts +set_form_page +set_form_sub +set_form_term +set_form_userptr +set_form_win +set_item_init +set_item_opts +set_item_term +set_item_userptr +set_item_value +set_max_field +set_menu_back +set_menu_fore +set_menu_format +set_menu_grey +set_menu_init +set_menu_items +set_menu_mark +set_menu_opts +set_menu_pad +set_menu_pattern +set_menu_spacing +set_menu_sub +set_menu_term +set_menu_userptr +set_menu_win +set_new_page +set_panel_userptr +set_tabsize +set_tabsize_sp +set_term +set_top_row +setscrreg +setupterm +show_panel +slk_attr +slk_attr_set +slk_attr_set_sp +slk_attr_sp +slk_attroff +slk_attroff_sp +slk_attron +slk_attron_sp +slk_attrset +slk_attrset_sp +slk_clear +slk_clear_sp +slk_color +slk_color_sp +slk_init +slk_init_sp +slk_label +slk_label_sp +slk_noutrefresh +slk_noutrefresh_sp +slk_refresh +slk_refresh_sp +slk_restore +slk_restore_sp +slk_set +slk_set_sp +slk_touch +slk_touch_sp +standend +standout +start_color +start_color_sp +subpad +subwin +syncok +termattrs +termattrs_sp +termname +termname_sp +tgetent +tgetent_sp +tgetflag +tgetflag_sp +tgetnum +tgetnum_sp +tgetstr +tgetstr_sp +tgoto +tigetflag +tigetflag_sp +tigetnum +tigetnum_sp +tigetstr +tigetstr_sp +timeout +tiparm +tiparm_s +tiscan_s +top_panel +top_row +touchline +touchwin +tparm +tputs +tputs_sp +trace +typeahead +typeahead_sp +unctrl +unctrl_sp +unfocus_current_field +ungetch +ungetch_sp +ungetmouse +ungetmouse_sp +unpost_form +unpost_menu +untouchwin +update_panels +update_panels_sp +use_default_colors +use_default_colors_sp +use_env +use_env_sp +use_extended_names +use_legacy_coding +use_legacy_coding_sp +use_screen +use_tioctl +use_tioctl_sp +use_window +vidattr +vidattr_sp +vidputs +vidputs_sp +vline +vw_printw +vw_scanw +vwprintw +vwscanw +waddch +waddchnstr +waddchstr +waddnstr +waddstr +wattr_get +wattr_off +wattr_on +wattr_set +wattroff +wattron +wattrset +wbkgd +wbkgdset +wborder +wchgat +wclear +wclrtobot +wclrtoeol +wcolor_set +wcursyncup +wdelch +wdeleteln +wechochar +wenclose +werase +wgetch +wgetch_events +wgetdelay +wgetnstr +wgetnstr_events +wgetparent +wgetscrreg +wgetstr +whline +winch +winchnstr +winchstr +winnstr +winsch +winsdelln +winsertln +winsnstr +winsstr +winstr +wmouse_trafo +wmove +wnoutrefresh +wprintw +wredrawln +wrefresh +wresize +wscanw +wscrl +wsetscrreg +wstandend +wstandout +wsyncdown +wsyncup +wtimeout +wtouchln +wvline diff --git a/contrib/ncurses/package/ncursestw.map b/contrib/ncurses/package/ncursestw.map new file mode 100644 index 00000000..116957f5 --- /dev/null +++ b/contrib/ncurses/package/ncursestw.map @@ -0,0 +1,1321 @@ +# $Id: ncursestw.map,v 1.59 2024/04/27 14:33:24 tom Exp $ +# script for shared library symbol-versioning using ld +# +# This file was generated by ncu-mapsyms +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace +# Configure options (6.0.current) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace + +NCURSES_TIC_5.0.19991023 { + global: + _nc_capcmp; + _nc_check_termtype; + _nc_entry_match; + _nc_infotocap; + _nc_read_entry_source; + _nc_reset_input; + _nc_resolve_uses; + _nc_screen; + _nc_set_writedir; + _nc_syntax; + _nc_tic_expand; + _nc_tic_written; + _nc_trans_string; + _nc_write_entry; + local: + _nc_captoinfo; + _nc_comment_end; + _nc_comment_start; + _nc_copy_entry; + _nc_curr_file_pos; + _nc_curr_token; + _nc_get_token; + _nc_init_entry; + _nc_merge_entry; + _nc_panic_mode; + _nc_parse_entry; + _nc_push_token; + _nc_save_str; + _nc_start_line; + _nc_wrap_entry; +}; + +NCURSES_TIC_5.1.20000708 { + global: + _nc_disable_period; +} NCURSES_TIC_5.0.19991023; + +NCURSES_TIC_5.5.20051010 { + global: + _nc_alloc_entry_leaks; + _nc_captoinfo_leaks; + _nc_check_termtype2; + _nc_comp_scan_leaks; + _nc_resolve_uses2; +} NCURSES_TIC_5.1.20000708; + +NCURSES_TIC_5.7.20081102 { + global: + _nc_free_tic; + local: + _nc_comp_captab_leaks; + _nc_leaks_tic; +} NCURSES_TIC_5.5.20051010; + +NCURSES_TIC_5.9.20150530 { + global: + _nc_strict_bsd; +} NCURSES_TIC_5.7.20081102; + +NCURSES_TIC_6.1.20171230 { + global: + _nc_read_entry2; + _nc_write_object; + local: + _*; +} NCURSES_TIC_5.9.20150530; + +NCURSES_TINFO_5.0.19991023 { + global: + BC; + PC; + SP; + UP; + _nc_access; + _nc_add_to_try; + _nc_copy_termtype; + _nc_curr_col; + _nc_curr_line; + _nc_doalloc; + _nc_err_abort; + _nc_fallback; + _nc_find_entry; + _nc_find_type_entry; + _nc_first_name; + _nc_free_entries; + _nc_free_termtype; + _nc_free_tparm; + _nc_freeall; + _nc_get_hash_table; + _nc_get_table; + _nc_get_tty_mode; + _nc_get_type; + _nc_getenv_num; + _nc_head; + _nc_home_terminfo; + _nc_init_acs; + _nc_keep_tic_dir; + _nc_keypad; + _nc_name_match; + _nc_outch; + _nc_read_entry; + _nc_read_file_entry; + _nc_screen_chain; + _nc_set_buffer; + _nc_set_source; + _nc_set_tty_mode; + _nc_set_type; + _nc_suppress_warnings; + _nc_syserr_abort; + _nc_tail; + _nc_tic_dir; + _nc_timed_wait; + _nc_tinfo_fkeysf; + _nc_trace_buf; + _nc_tracing; + _nc_update_screensize; + _nc_visbuf; + _nc_visbuf2; + _nc_warning; + _tracechar; + baudrate; + cbreak; + curs_set; + curses_version; + def_prog_mode; + def_shell_mode; + define_key; + del_curterm; + delay_output; + erasechar; + flushinp; + halfdelay; + has_ic; + has_il; + has_key; + idcok; + idlok; + intrflush; + keybound; + keyname; + keyok; + keypad; + killchar; + longname; + meta; + napms; + nocbreak; + nodelay; + noqiflush; + noraw; + notimeout; + ospeed; + putp; + qiflush; + raw; + reset_prog_mode; + reset_shell_mode; + resetty; + savetty; + set_curterm; + setupterm; + termname; + tgetent; + tgetflag; + tgetnum; + tgetstr; + tgoto; + tigetflag; + tigetnum; + tigetstr; + tparm; + tputs; + trace; + typeahead; + unctrl; + use_env; + wtimeout; + local: + _nc_baudrate; + _nc_expand_try; + _nc_init_keytry; + _nc_nulls_sent; + _nc_ospeed; + _nc_read_termcap; + _nc_read_termcap_entry; + _nc_remove_key; + _nc_remove_string; + _nc_trace_tries; + _nc_tracebits; +}; + +NCURSES_TINFO_5.1.20000708 { + global: + _nc_align_termtype; + _nc_flush; + _nc_tinfo_fkeys; + _nc_user_definable; + use_extended_names; +} NCURSES_TINFO_5.0.19991023; + +NCURSES_TINFO_5.2.20001021 { + global: + _nc_basename; + _nc_env_access; + _nc_safe_strcat; + _nc_safe_strcpy; + _nc_str_copy; + _nc_str_init; + _nc_str_null; +} NCURSES_TINFO_5.1.20000708; + +NCURSES_TINFO_5.3.20021019 { + global: + _nc_rootname; + _nc_tparm_err; + _nc_visbufn; +} NCURSES_TINFO_5.2.20001021; + +NCURSES_TINFO_5.4.20040208 { + global: + _nc_get_locale; + _nc_locale_breaks_acs; + _nc_pathlast; + _nc_retrace_attr_t; + _nc_retrace_bool; + _nc_retrace_chtype; + _nc_retrace_int; + _nc_retrace_ptr; + _nc_retrace_sp; + _nc_retrace_unsigned; + _nc_retrace_win; + _nc_tparm_analyze; + _nc_trace_bufcat; + _nc_unicode_locale; + _traceattr; + _traceattr2; + _tracechtype; + _tracechtype2; + _tracef; + key_defined; + local: + _nc_altcharset_name; + _nc_trace_ttymode; +} NCURSES_TINFO_5.3.20021019; + +NCURSES_TINFO_5.5.20051010 { + global: + _nc_get_source; + _nc_retrace_cptr; + _nc_retrace_cvoid_ptr; + _nc_retrace_void_ptr; + _nc_setupterm; + _nc_trim_sgr0; + local: + _nc_delink_entry; + _nc_free_entry; +} NCURSES_TINFO_5.4.20040208; + +NCURSES_TINFO_5.6.20061217 { + global: + _nc_db_close; + _nc_db_first; + _nc_db_have_data; + _nc_db_next; + _nc_db_open; + _nc_db_put; + _nc_eventlist_timeout; + _nc_first_db; + _nc_handle_sigwinch; + _nc_is_abs_path; + _nc_is_dir_path; + _nc_is_file_path; + _nc_keyname_leaks; + _nc_last_db; + _nc_next_db; + _nc_read_termtype; + _nc_tgetent_leaks; + _nc_viscbuf; + local: + _nc_db_get; + _nc_db_have_index; + _nc_hashed_db; + _nc_viscbuf2; +} NCURSES_TINFO_5.5.20051010; + +NCURSES_TINFO_5.7.20081102 { + global: + _nc_COLS; + _nc_LINES; + _nc_TABSIZE; + _nc__nc_outchars; + _nc_acs_map; + _nc_boolcodes; + _nc_boolfnames; + _nc_boolnames; + _nc_codes_leaks; + _nc_count_outchars; + _nc_cur_term; + _nc_curscr; + _nc_free_tinfo; + _nc_get_alias_table; + _nc_get_screensize; + _nc_globals; + _nc_init_pthreads; + _nc_leaks_tinfo; + _nc_locked_tracef; + _nc_mutex_lock; + _nc_mutex_trylock; + _nc_mutex_unlock; + _nc_names_leaks; + _nc_newscr; + _nc_numcodes; + _nc_numfnames; + _nc_numnames; + _nc_prescreen; + _nc_ptr_Cols; + _nc_ptr_Lines; + _nc_screen_of; + _nc_set_no_padding; + _nc_set_tputs_trace; + _nc_stdscr; + _nc_strcodes; + _nc_strfnames; + _nc_strnames; + _nc_tracechar; + _nc_ttytype; + _nc_use_tracef; + _nc_viswbuf; + _nc_viswbufn; + _nc_viswibuf; + _tracecchar_t; + _tracecchar_t2; + set_tabsize; + local: + _nc__nc_tputs_trace; + _nc_keyname; + _nc_mutex_init; + _nc_unctrl; + _nc_viswbuf2; +} NCURSES_TINFO_5.6.20061217; + +NCURSES_TINFO_5.8.20110226 { + global: + _nc_flush_sp; + _nc_get_tty_mode_sp; + _nc_init_acs_sp; + _nc_outc_wrapper; + _nc_outch_sp; + _nc_putp; + _nc_putp_flush; + _nc_putp_flush_sp; + _nc_putp_sp; + _nc_retrace_int_attr_t; + _nc_set_buffer_sp; + _nc_set_tty_mode_sp; + _nc_sigprocmask; + baudrate_sp; + cbreak_sp; + curs_set_sp; + def_prog_mode_sp; + def_shell_mode_sp; + define_key_sp; + del_curterm_sp; + delay_output_sp; + erasechar_sp; + flushinp_sp; + halfdelay_sp; + has_ic_sp; + has_il_sp; + has_key_sp; + intrflush_sp; + key_defined_sp; + keybound_sp; + keyname_sp; + keyok_sp; + killchar_sp; + longname_sp; + napms_sp; + new_prescr; + nocbreak_sp; + noqiflush_sp; + noraw_sp; + putp_sp; + qiflush_sp; + raw_sp; + reset_prog_mode_sp; + reset_shell_mode_sp; + resetty_sp; + savetty_sp; + set_curterm_sp; + set_tabsize_sp; + termname_sp; + tgetent_sp; + tgetflag_sp; + tgetnum_sp; + tgetstr_sp; + tigetflag_sp; + tigetnum_sp; + tigetstr_sp; + tiparm; + tputs_sp; + typeahead_sp; + unctrl_sp; + use_env_sp; + local: + _nc_get_cur_term; + _nc_get_cur_term_sp; + _nc_get_hash_info; + _nc_ptr_Tabsize; + _nc_retrace_char; + _nc_setup_tinfo; + _nc_tinfo_cmdch; +} NCURSES_TINFO_5.7.20081102; + +NCURSES_TINFO_5.9.20150530 { + global: + _nc_init_termtype; + _nc_putchar; + _nc_putchar_sp; + use_tioctl; + use_tioctl_sp; + local: + _nc_comp_error_leaks; + _nc_db_iterator_leaks; + _nc_setenv_num; +} NCURSES_TINFO_5.8.20110226; + +NCURSES_TINFO_6.1.20171230 { + global: + _nc_copy_termtype2; + _nc_export_termtype2; + _nc_fallback2; + _nc_find_prescr; + _nc_forget_prescr; + _nc_free_termtype2; +} NCURSES_TINFO_5.9.20150530; + +NCURSES_TINFO_6.2.20200212 { + global: + _nc_find_user_entry; + _nc_fmt_funcptr; + _nc_wacs_width; + curses_trace; + exit_terminfo; +} NCURSES_TINFO_6.1.20171230; + +NCURSES_TINFO_6.2.20211010 { + global: + _nc_reset_tparm; + _nc_tiparm; + _nc_safe_fopen; + _nc_safe_open3; + erasewchar_sp; + killwchar_sp; +} NCURSES_TINFO_6.2.20200212; + +NCURSES_TINFO_6.5.20240427 { + global: + is_cbreak; + is_cbreak_sp; + is_echo; + is_echo_sp; + is_nl; + is_nl_sp; + is_raw; + is_raw_sp; + tiparm_s; + tiscan_s; + local: + _*; +} NCURSES_TINFO_6.2.20211010; + +NCURSESTW_5.7.20081102 { + global: + COLOR_PAIR; + PAIR_NUMBER; + TYPE_ALNUM; + TYPE_ALPHA; + TYPE_ENUM; + TYPE_INTEGER; + TYPE_IPV4; + TYPE_NUMERIC; + TYPE_REGEXP; + _nc_COLORS; + _nc_COLOR_PAIRS; + _nc_Default_Field; # deprecated in ABI6 + _nc_Default_Form; # deprecated in ABI6 + _nc_ESCDELAY; + _nc_free_and_exit; + _nc_has_mouse; # deprecated in ABI6 + _nc_optimize_enable; + _nc_panelhook; + _nc_ripoffline; + _nc_wacs; + _nc_wcrtomb; + add_wch; + add_wchnstr; + add_wchstr; + addch; + addchnstr; + addchstr; + addnstr; + addnwstr; + addstr; + addwstr; + assume_default_colors; + attr_get; + attr_off; + attr_on; + attr_set; + attroff; + attron; + attrset; + beep; + bkgd; + bkgdset; + bkgrnd; + bkgrndset; + border; + border_set; + bottom_panel; + box; + box_set; + can_change_color; + chgat; + clear; + clearok; + clrtobot; + clrtoeol; + color_content; + color_set; + copywin; + current_field; + current_item; + data_ahead; + data_behind; + del_panel; + delch; + deleteln; + delscreen; + delwin; + derwin; + doupdate; + dup_field; + dupwin; + dynamic_field_info; + echo; + echo_wchar; + echochar; + endwin; + erase; + erasewchar; + field_arg; + field_back; + field_buffer; + field_count; + field_fore; + field_index; + field_info; + field_init; + field_just; + field_opts; + field_opts_off; + field_opts_on; + field_pad; + field_status; + field_term; + field_type; + field_userptr; + filter; + flash; + form_driver; + form_fields; + form_init; + form_opts; + form_opts_off; + form_opts_on; + form_page; + form_request_by_name; + form_request_name; + form_sub; + form_term; + form_userptr; + form_win; + free_field; + free_fieldtype; + free_form; + free_item; + free_menu; + get_wch; + get_wstr; + getattrs; + getbegx; + getbegy; + getbkgd; + getbkgrnd; + getcchar; + getch; + getcurx; + getcury; + getmaxx; + getmaxy; + getmouse; + getn_wstr; + getnstr; + getparx; + getpary; + getstr; + getwin; + has_colors; + hide_panel; + hline; + hline_set; + immedok; + in_wch; + in_wchnstr; + in_wchstr; + inch; + inchnstr; + inchstr; + init_color; + init_pair; + initscr; + innstr; + innwstr; + ins_nwstr; + ins_wch; + ins_wstr; + insch; + insdelln; + insertln; + insnstr; + insstr; + instr; + inwstr; + is_cleared; + is_idcok; + is_idlok; + is_immedok; + is_keypad; + is_leaveok; + is_linetouched; + is_nodelay; + is_notimeout; + is_scrollok; + is_syncok; + is_term_resized; + is_wintouched; + isendwin; + item_count; + item_description; + item_index; + item_init; + item_name; + item_opts; + item_opts_off; + item_opts_on; + item_term; + item_userptr; + item_value; + item_visible; + key_name; + killwchar; + leaveok; + link_field; + link_fieldtype; + mcprint; + menu_back; + menu_driver; + menu_fore; + menu_format; + menu_grey; + menu_init; + menu_items; + menu_mark; + menu_opts; + menu_opts_off; + menu_opts_on; + menu_pad; + menu_pattern; + menu_request_by_name; + menu_request_name; + menu_spacing; + menu_sub; + menu_term; + menu_userptr; + menu_win; + mouse_trafo; + mouseinterval; + mousemask; + move; + move_field; + move_panel; + mvadd_wch; + mvadd_wchnstr; + mvadd_wchstr; + mvaddch; + mvaddchnstr; + mvaddchstr; + mvaddnstr; + mvaddnwstr; + mvaddstr; + mvaddwstr; + mvchgat; + mvcur; + mvdelch; + mvderwin; + mvget_wch; + mvget_wstr; + mvgetch; + mvgetn_wstr; + mvgetnstr; + mvgetstr; + mvhline; + mvhline_set; + mvin_wch; + mvin_wchnstr; + mvin_wchstr; + mvinch; + mvinchnstr; + mvinchstr; + mvinnstr; + mvinnwstr; + mvins_nwstr; + mvins_wch; + mvins_wstr; + mvinsch; + mvinsnstr; + mvinsstr; + mvinstr; + mvinwstr; + mvprintw; + mvscanw; + mvvline; + mvvline_set; + mvwadd_wch; + mvwadd_wchnstr; + mvwadd_wchstr; + mvwaddch; + mvwaddchnstr; + mvwaddchstr; + mvwaddnstr; + mvwaddnwstr; + mvwaddstr; + mvwaddwstr; + mvwchgat; + mvwdelch; + mvwget_wch; + mvwget_wstr; + mvwgetch; + mvwgetn_wstr; + mvwgetnstr; + mvwgetstr; + mvwhline; + mvwhline_set; + mvwin; + mvwin_wch; + mvwin_wchnstr; + mvwin_wchstr; + mvwinch; + mvwinchnstr; + mvwinchstr; + mvwinnstr; + mvwinnwstr; + mvwins_nwstr; + mvwins_wch; + mvwins_wstr; + mvwinsch; + mvwinsnstr; + mvwinsstr; + mvwinstr; + mvwinwstr; + mvwprintw; + mvwscanw; + mvwvline; + mvwvline_set; + new_field; + new_fieldtype; + new_form; + new_item; + new_menu; + new_page; + new_panel; + newpad; + newterm; + newwin; + nl; + noecho; + nofilter; + nonl; + overlay; + overwrite; + pair_content; + panel_above; + panel_below; + panel_hidden; + panel_userptr; + panel_window; + pecho_wchar; + pechochar; + pnoutrefresh; + pos_form_cursor; + pos_menu_cursor; + post_form; + post_menu; + prefresh; + printw; + putwin; + redrawwin; + refresh; + replace_panel; + resize_term; + resizeterm; + restartterm; + ripoffline; + scale_form; + scale_menu; + scanw; + scr_dump; + scr_init; + scr_restore; + scr_set; + scrl; + scroll; + scrollok; + set_current_field; + set_current_item; + set_escdelay; + set_field_back; + set_field_buffer; + set_field_fore; + set_field_init; + set_field_just; + set_field_opts; + set_field_pad; + set_field_status; + set_field_term; + set_field_type; + set_field_userptr; + set_fieldtype_arg; + set_fieldtype_choice; + set_form_fields; + set_form_init; + set_form_opts; + set_form_page; + set_form_sub; + set_form_term; + set_form_userptr; + set_form_win; + set_item_init; + set_item_opts; + set_item_term; + set_item_userptr; + set_item_value; + set_max_field; + set_menu_back; + set_menu_fore; + set_menu_format; + set_menu_grey; + set_menu_init; + set_menu_items; + set_menu_mark; + set_menu_opts; + set_menu_pad; + set_menu_pattern; + set_menu_spacing; + set_menu_sub; + set_menu_term; + set_menu_userptr; + set_menu_win; + set_new_page; + set_panel_userptr; + set_term; + set_top_row; + setcchar; + setscrreg; + show_panel; + slk_attr; + slk_attr_off; + slk_attr_on; + slk_attr_set; + slk_attroff; + slk_attron; + slk_attrset; + slk_clear; + slk_color; + slk_init; + slk_label; + slk_noutrefresh; + slk_refresh; + slk_restore; + slk_set; + slk_touch; + slk_wset; + standend; + standout; + start_color; + subpad; + subwin; + syncok; + term_attrs; + termattrs; + timeout; + top_panel; + top_row; + touchline; + touchwin; + unget_wch; + ungetch; + ungetmouse; + unpost_form; + unpost_menu; + untouchwin; + update_panels; + use_default_colors; + use_legacy_coding; + use_screen; + use_window; + vid_attr; + vid_puts; + vidattr; + vidputs; + vline; + vline_set; + vw_printw; + vw_scanw; + vwprintw; + vwscanw; + wadd_wch; + wadd_wchnstr; + wadd_wchstr; + waddch; + waddchnstr; + waddchstr; + waddnstr; + waddnwstr; + waddstr; + waddwstr; + wattr_get; + wattr_off; + wattr_on; + wattr_set; + wattroff; + wattron; + wattrset; + wbkgd; + wbkgdset; + wbkgrnd; + wbkgrndset; + wborder; + wborder_set; + wchgat; + wclear; + wclrtobot; + wclrtoeol; + wcolor_set; + wcursyncup; + wdelch; + wdeleteln; + wecho_wchar; + wechochar; + wenclose; + werase; + wget_wch; + wget_wstr; + wgetbkgrnd; + wgetch; + wgetch_events; + wgetn_wstr; + wgetnstr; + wgetnstr_events; + wgetparent; + wgetscrreg; + wgetstr; + whline; + whline_set; + win_wch; + win_wchnstr; + win_wchstr; + winch; + winchnstr; + winchstr; + winnstr; + winnwstr; + wins_nwstr; + wins_wch; + wins_wstr; + winsch; + winsdelln; + winsertln; + winsnstr; + winsstr; + winstr; + winwstr; + wmouse_trafo; + wmove; + wnoutrefresh; + wprintw; + wredrawln; + wrefresh; + wresize; + wscanw; + wscrl; + wsetscrreg; + wstandend; + wstandout; + wsyncdown; + wsyncup; + wtouchln; + wunctrl; + wvline; + wvline_set; + local: + _nc_Calculate_Item_Length_and_Width; + _nc_Calculate_Text_Width; + _nc_Connect_Items; + _nc_Copy_Argument; + _nc_Copy_Type; + _nc_Default_FieldType; + _nc_Default_Item; + _nc_Default_Menu; + _nc_Disconnect_Items; + _nc_Draw_Menu; + _nc_First_Active_Field; + _nc_Free_Argument; + _nc_Free_Type; + _nc_Internal_Validation; + _nc_Link_Items; + _nc_Make_Argument; + _nc_Match_Next_Character_In_Item_Name; + _nc_New_TopRow_and_CurrentItem; + _nc_Position_Form_Cursor; + _nc_Post_Item; + _nc_Refresh_Current_Field; + _nc_Set_Current_Field; + _nc_Set_Form_Page; + _nc_Show_Menu; + _nc_Synchronize_Attributes; + _nc_Synchronize_Options; + _nc_Touchline; + _nc_Touchpan; + _nc_Widen_String; + _nc_Wnoutrefresh; + _nc_build_wch; + _nc_dPanel; + _nc_dStack; + _nc_do_color; + _nc_expanded; + _nc_fifo_dump; + _nc_freewin; + _nc_hash_map; + _nc_init_wacs; + _nc_insert_ch; + _nc_is_charable; + _nc_linedump; + _nc_make_oldhash; + _nc_makenew; + _nc_memmove; + _nc_menu_cursor_pos; + _nc_msec_cost; + _nc_mvcur_init; + _nc_mvcur_resume; + _nc_mvcur_wrap; + _nc_my_visbuf; + _nc_oldnums; + _nc_printf_string; + _nc_render; + _nc_reset_colors; + _nc_retrace_field; + _nc_retrace_field_ptr; + _nc_retrace_field_type; + _nc_retrace_form; + _nc_retrace_form_hook; + _nc_retrace_item; + _nc_retrace_item_opts; + _nc_retrace_item_ptr; + _nc_retrace_menu; + _nc_retrace_menu_hook; + _nc_retrace_menu_opts; + _nc_retrace_panel; + _nc_screen_init; + _nc_screen_resume; + _nc_screen_wrap; + _nc_scroll_oldhash; + _nc_scroll_optimize; + _nc_scroll_window; + _nc_scrolln; + _nc_setupscreen; + _nc_signal_handler; + _nc_slk_initialize; + _nc_synchook; + _nc_to_char; + _nc_to_widechar; + _nc_trace_xnames; + _nc_tracemouse; + _nc_ungetch; + _nc_varargs; + _nc_vsscanf; + _nc_waddch_nosync; + _nc_wchstrlen; + _nc_wgetch; + _tracedump; + _tracemouse; +}; + +NCURSESTW_5.8.20110226 { + global: + _nc_panelhook_sp; + assume_default_colors_sp; + beep_sp; + can_change_color_sp; + ceiling_panel; + color_content_sp; + doupdate_sp; + echo_sp; + endwin_sp; + filter_sp; + flash_sp; + get_escdelay; + get_escdelay_sp; + getmouse_sp; + getwin_sp; + ground_panel; + has_colors_sp; + has_mouse; + has_mouse_sp; + init_color_sp; + init_pair_sp; + is_pad; + is_subwin; + is_term_resized_sp; + isendwin_sp; + mcprint_sp; + mouseinterval_sp; + mousemask_sp; + mvcur_sp; + new_form_sp; + new_menu_sp; + newpad_sp; + newterm_sp; + newwin_sp; + nl_sp; + noecho_sp; + nofilter_sp; + nonl_sp; + pair_content_sp; + resize_term_sp; + resizeterm_sp; + restartterm_sp; + ripoffline_sp; + scr_init_sp; + scr_restore_sp; + scr_set_sp; + set_escdelay_sp; + slk_attr_set_sp; + slk_attr_sp; + slk_attroff_sp; + slk_attron_sp; + slk_attrset_sp; + slk_clear_sp; + slk_color_sp; + slk_init_sp; + slk_label_sp; + slk_noutrefresh_sp; + slk_refresh_sp; + slk_restore_sp; + slk_set_sp; + slk_touch_sp; + start_color_sp; + term_attrs_sp; + termattrs_sp; + unget_wch_sp; + ungetch_sp; + ungetmouse_sp; + update_panels_sp; + use_default_colors_sp; + use_legacy_coding_sp; + vid_attr_sp; + vid_puts_sp; + vidattr_sp; + vidputs_sp; + wunctrl_sp; + local: + _nc_TYPE_ALNUM; + _nc_TYPE_ALPHA; + _nc_TYPE_ENUM; + _nc_TYPE_INTEGER; + _nc_TYPE_IPV4; + _nc_TYPE_NUMERIC; + _nc_TYPE_REGEXP; + _nc_curscr_of; + _nc_do_color_sp; + _nc_form_cursor; + _nc_format_slks; + _nc_free_and_exit_sp; + _nc_freeall_sp; + _nc_fty_generic; + _nc_generic_fieldtype; + _nc_get_fieldbuffer; + _nc_hash_map_sp; + _nc_insert_wch; + _nc_linedump_sp; + _nc_make_oldhash_sp; + _nc_makenew_sp; + _nc_msec_cost_sp; + _nc_mvcur_init_sp; + _nc_mvcur_resume_sp; + _nc_mvcur_wrap_sp; + _nc_newscr_of; + _nc_printf_string_sp; + _nc_ptr_Escdelay; + _nc_reset_colors_sp; + _nc_retrace_mmask_t; + _nc_ripoffline_sp; + _nc_screen_init_sp; + _nc_screen_resume_sp; + _nc_screen_wrap_sp; + _nc_scroll_oldhash_sp; + _nc_scroll_optimize_sp; + _nc_scrolln_sp; + _nc_set_generic_fieldtype; + _nc_setupscreen_sp; + _nc_stdscr_of; +} NCURSESTW_5.7.20081102; + +NCURSESTW_5.9.20150530 { + global: + form_driver_w; + wgetdelay; + local: + _nc_mvcur; + _nc_mvcur_sp; + _nc_trace_mmask_t; +} NCURSESTW_5.8.20110226; + +NCURSESTW_6.1.20171230 { + global: + alloc_pair; + alloc_pair_sp; + extended_color_content; + extended_color_content_sp; + extended_pair_content; + extended_pair_content_sp; + extended_slk_color; + extended_slk_color_sp; + find_pair; + find_pair_sp; + free_pair; + free_pair_sp; + init_extended_color; + init_extended_color_sp; + init_extended_pair; + init_extended_pair_sp; + reset_color_pairs; + reset_color_pairs_sp; + unfocus_current_field; + local: + _nc_Unset_Current_Field; + _nc_change_pair; + _nc_init_color; + _nc_init_pair; + _nc_pair_content; + _nc_reset_color_pair; + _nc_set_color_pair; +} NCURSESTW_5.9.20150530; + +NCURSESTW_6.2.20200212 { + global: + exit_curses; + local: + _*; +} NCURSESTW_6.1.20171230; diff --git a/contrib/ncurses/package/ncursestw.sym b/contrib/ncurses/package/ncursestw.sym new file mode 100644 index 00000000..b05baecc --- /dev/null +++ b/contrib/ncurses/package/ncursestw.sym @@ -0,0 +1,1011 @@ +# $Id: ncursestw.sym,v 1.43 2023/08/12 15:29:11 tom Exp $ +# script for shared library symbol-visibility using libtool +# +# This file was generated by ncu-mapsyms +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace +# Configure options (6.0.20161029) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-reentrant --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-broken_linker --with-hashed-db --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-weak-symbols --enable-widec --with-pthread --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-wgetch-events --enable-widec --with-hashed-db --with-pthread --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-weak-symbols --enable-widec --with-broken_linker --with-pthread --with-termlib --with-ticlib --with-trace +BC +COLOR_PAIR +PAIR_NUMBER +PC +SP +TYPE_ALNUM +TYPE_ALPHA +TYPE_ENUM +TYPE_INTEGER +TYPE_IPV4 +TYPE_NUMERIC +TYPE_REGEXP +UP +_nc_COLORS +_nc_COLOR_PAIRS +_nc_COLS +_nc_Default_Field +_nc_Default_Form +_nc_ESCDELAY +_nc_LINES +_nc_TABSIZE +_nc__nc_outchars +_nc_access +_nc_acs_map +_nc_add_to_try +_nc_align_termtype +_nc_alloc_entry_leaks +_nc_basename +_nc_boolcodes +_nc_boolfnames +_nc_boolnames +_nc_capcmp +_nc_captoinfo_leaks +_nc_check_termtype +_nc_check_termtype2 +_nc_codes_leaks +_nc_comp_scan_leaks +_nc_copy_termtype +_nc_copy_termtype2 +_nc_count_outchars +_nc_cur_term +_nc_curr_col +_nc_curr_line +_nc_curscr +_nc_db_close +_nc_db_first +_nc_db_have_data +_nc_db_next +_nc_db_open +_nc_db_put +_nc_disable_period +_nc_doalloc +_nc_entry_match +_nc_env_access +_nc_err_abort +_nc_eventlist_timeout +_nc_export_termtype2 +_nc_fallback +_nc_fallback2 +_nc_find_entry +_nc_find_prescr +_nc_find_type_entry +_nc_find_user_entry +_nc_first_db +_nc_first_name +_nc_flush +_nc_flush_sp +_nc_fmt_funcptr +_nc_forget_prescr +_nc_free_and_exit +_nc_free_entries +_nc_free_termtype +_nc_free_termtype2 +_nc_free_tic +_nc_free_tinfo +_nc_free_tparm +_nc_freeall +_nc_get_alias_table +_nc_get_hash_table +_nc_get_locale +_nc_get_screensize +_nc_get_source +_nc_get_table +_nc_get_tty_mode +_nc_get_tty_mode_sp +_nc_get_type +_nc_getenv_num +_nc_globals +_nc_handle_sigwinch +_nc_has_mouse +_nc_head +_nc_home_terminfo +_nc_infotocap +_nc_init_acs +_nc_init_acs_sp +_nc_init_pthreads +_nc_init_termtype +_nc_is_abs_path +_nc_is_dir_path +_nc_is_file_path +_nc_keep_tic_dir +_nc_keyname_leaks +_nc_keypad +_nc_last_db +_nc_leaks_tinfo +_nc_locale_breaks_acs +_nc_locked_tracef +_nc_mutex_lock +_nc_mutex_trylock +_nc_mutex_unlock +_nc_name_match +_nc_names_leaks +_nc_newscr +_nc_next_db +_nc_numcodes +_nc_numfnames +_nc_numnames +_nc_optimize_enable +_nc_outc_wrapper +_nc_outch +_nc_outch_sp +_nc_panelhook +_nc_panelhook_sp +_nc_pathlast +_nc_prescreen +_nc_ptr_Cols +_nc_ptr_Lines +_nc_putchar +_nc_putchar_sp +_nc_putp +_nc_putp_flush +_nc_putp_flush_sp +_nc_putp_sp +_nc_read_entry +_nc_read_entry2 +_nc_read_entry_source +_nc_read_file_entry +_nc_read_termtype +_nc_reset_input +_nc_reset_tparm +_nc_resolve_uses +_nc_resolve_uses2 +_nc_retrace_attr_t +_nc_retrace_bool +_nc_retrace_chtype +_nc_retrace_cptr +_nc_retrace_cvoid_ptr +_nc_retrace_int +_nc_retrace_int_attr_t +_nc_retrace_ptr +_nc_retrace_sp +_nc_retrace_unsigned +_nc_retrace_void_ptr +_nc_retrace_win +_nc_ripoffline +_nc_rootname +_nc_safe_fopen +_nc_safe_open3 +_nc_safe_strcat +_nc_safe_strcpy +_nc_screen +_nc_screen_chain +_nc_screen_of +_nc_set_buffer +_nc_set_buffer_sp +_nc_set_no_padding +_nc_set_source +_nc_set_tputs_trace +_nc_set_tty_mode +_nc_set_tty_mode_sp +_nc_set_type +_nc_set_writedir +_nc_setupterm +_nc_sigprocmask +_nc_stdscr +_nc_str_copy +_nc_str_init +_nc_str_null +_nc_strcodes +_nc_strfnames +_nc_strict_bsd +_nc_strnames +_nc_suppress_warnings +_nc_syntax +_nc_syserr_abort +_nc_tail +_nc_tgetent_leaks +_nc_tic_dir +_nc_tic_expand +_nc_tic_written +_nc_timed_wait +_nc_tinfo_fkeys +_nc_tinfo_fkeysf +_nc_tiparm +_nc_tparm_analyze +_nc_tparm_err +_nc_trace_buf +_nc_trace_bufcat +_nc_tracechar +_nc_tracing +_nc_trans_string +_nc_trim_sgr0 +_nc_ttytype +_nc_unicode_locale +_nc_update_screensize +_nc_use_tracef +_nc_user_definable +_nc_visbuf +_nc_visbuf2 +_nc_visbufn +_nc_viscbuf +_nc_viswbuf +_nc_viswbufn +_nc_viswibuf +_nc_wacs +_nc_wacs_width +_nc_warning +_nc_wcrtomb +_nc_write_entry +_nc_write_object +_traceattr +_traceattr2 +_tracecchar_t +_tracecchar_t2 +_tracechar +_tracechtype +_tracechtype2 +_tracef +add_wch +add_wchnstr +add_wchstr +addch +addchnstr +addchstr +addnstr +addnwstr +addstr +addwstr +alloc_pair +alloc_pair_sp +assume_default_colors +assume_default_colors_sp +attr_get +attr_off +attr_on +attr_set +attroff +attron +attrset +baudrate +baudrate_sp +beep +beep_sp +bkgd +bkgdset +bkgrnd +bkgrndset +border +border_set +bottom_panel +box +box_set +can_change_color +can_change_color_sp +cbreak +cbreak_sp +ceiling_panel +chgat +clear +clearok +clrtobot +clrtoeol +color_content +color_content_sp +color_set +copywin +current_field +current_item +curs_set +curs_set_sp +curses_trace +curses_version +data_ahead +data_behind +def_prog_mode +def_prog_mode_sp +def_shell_mode +def_shell_mode_sp +define_key +define_key_sp +del_curterm +del_curterm_sp +del_panel +delay_output +delay_output_sp +delch +deleteln +delscreen +delwin +derwin +doupdate +doupdate_sp +dup_field +dupwin +dynamic_field_info +echo +echo_sp +echo_wchar +echochar +endwin +endwin_sp +erase +erasechar +erasechar_sp +erasewchar +erasewchar_sp +exit_curses +exit_terminfo +extended_color_content +extended_color_content_sp +extended_pair_content +extended_pair_content_sp +extended_slk_color +extended_slk_color_sp +field_arg +field_back +field_buffer +field_count +field_fore +field_index +field_info +field_init +field_just +field_opts +field_opts_off +field_opts_on +field_pad +field_status +field_term +field_type +field_userptr +filter +filter_sp +find_pair +find_pair_sp +flash +flash_sp +flushinp +flushinp_sp +form_driver +form_driver_w +form_fields +form_init +form_opts +form_opts_off +form_opts_on +form_page +form_request_by_name +form_request_name +form_sub +form_term +form_userptr +form_win +free_field +free_fieldtype +free_form +free_item +free_menu +free_pair +free_pair_sp +get_escdelay +get_escdelay_sp +get_wch +get_wstr +getattrs +getbegx +getbegy +getbkgd +getbkgrnd +getcchar +getch +getcurx +getcury +getmaxx +getmaxy +getmouse +getmouse_sp +getn_wstr +getnstr +getparx +getpary +getstr +getwin +getwin_sp +ground_panel +halfdelay +halfdelay_sp +has_colors +has_colors_sp +has_ic +has_ic_sp +has_il +has_il_sp +has_key +has_key_sp +has_mouse +has_mouse_sp +hide_panel +hline +hline_set +idcok +idlok +immedok +in_wch +in_wchnstr +in_wchstr +inch +inchnstr +inchstr +init_color +init_color_sp +init_extended_color +init_extended_color_sp +init_extended_pair +init_extended_pair_sp +init_pair +init_pair_sp +initscr +innstr +innwstr +ins_nwstr +ins_wch +ins_wstr +insch +insdelln +insertln +insnstr +insstr +instr +intrflush +intrflush_sp +inwstr +is_cbreak +is_cbreak_sp +is_cleared +is_echo +is_echo_sp +is_idcok +is_idlok +is_immedok +is_keypad +is_leaveok +is_linetouched +is_nl +is_nl_sp +is_nodelay +is_notimeout +is_pad +is_raw +is_raw_sp +is_scrollok +is_subwin +is_syncok +is_term_resized +is_term_resized_sp +is_wintouched +isendwin +isendwin_sp +item_count +item_description +item_index +item_init +item_name +item_opts +item_opts_off +item_opts_on +item_term +item_userptr +item_value +item_visible +key_defined +key_defined_sp +key_name +keybound +keybound_sp +keyname +keyname_sp +keyok +keyok_sp +keypad +killchar +killchar_sp +killwchar +killwchar_sp +leaveok +link_field +link_fieldtype +longname +longname_sp +mcprint +mcprint_sp +menu_back +menu_driver +menu_fore +menu_format +menu_grey +menu_init +menu_items +menu_mark +menu_opts +menu_opts_off +menu_opts_on +menu_pad +menu_pattern +menu_request_by_name +menu_request_name +menu_spacing +menu_sub +menu_term +menu_userptr +menu_win +meta +mouse_trafo +mouseinterval +mouseinterval_sp +mousemask +mousemask_sp +move +move_field +move_panel +mvadd_wch +mvadd_wchnstr +mvadd_wchstr +mvaddch +mvaddchnstr +mvaddchstr +mvaddnstr +mvaddnwstr +mvaddstr +mvaddwstr +mvchgat +mvcur +mvcur_sp +mvdelch +mvderwin +mvget_wch +mvget_wstr +mvgetch +mvgetn_wstr +mvgetnstr +mvgetstr +mvhline +mvhline_set +mvin_wch +mvin_wchnstr +mvin_wchstr +mvinch +mvinchnstr +mvinchstr +mvinnstr +mvinnwstr +mvins_nwstr +mvins_wch +mvins_wstr +mvinsch +mvinsnstr +mvinsstr +mvinstr +mvinwstr +mvprintw +mvscanw +mvvline +mvvline_set +mvwadd_wch +mvwadd_wchnstr +mvwadd_wchstr +mvwaddch +mvwaddchnstr +mvwaddchstr +mvwaddnstr +mvwaddnwstr +mvwaddstr +mvwaddwstr +mvwchgat +mvwdelch +mvwget_wch +mvwget_wstr +mvwgetch +mvwgetn_wstr +mvwgetnstr +mvwgetstr +mvwhline +mvwhline_set +mvwin +mvwin_wch +mvwin_wchnstr +mvwin_wchstr +mvwinch +mvwinchnstr +mvwinchstr +mvwinnstr +mvwinnwstr +mvwins_nwstr +mvwins_wch +mvwins_wstr +mvwinsch +mvwinsnstr +mvwinsstr +mvwinstr +mvwinwstr +mvwprintw +mvwscanw +mvwvline +mvwvline_set +napms +napms_sp +new_field +new_fieldtype +new_form +new_form_sp +new_item +new_menu +new_menu_sp +new_page +new_panel +new_prescr +newpad +newpad_sp +newterm +newterm_sp +newwin +newwin_sp +nl +nl_sp +nocbreak +nocbreak_sp +nodelay +noecho +noecho_sp +nofilter +nofilter_sp +nonl +nonl_sp +noqiflush +noqiflush_sp +noraw +noraw_sp +notimeout +ospeed +overlay +overwrite +pair_content +pair_content_sp +panel_above +panel_below +panel_hidden +panel_userptr +panel_window +pecho_wchar +pechochar +pnoutrefresh +pos_form_cursor +pos_menu_cursor +post_form +post_menu +prefresh +printw +putp +putp_sp +putwin +qiflush +qiflush_sp +raw +raw_sp +redrawwin +refresh +replace_panel +reset_color_pairs +reset_color_pairs_sp +reset_prog_mode +reset_prog_mode_sp +reset_shell_mode +reset_shell_mode_sp +resetty +resetty_sp +resize_term +resize_term_sp +resizeterm +resizeterm_sp +restartterm +restartterm_sp +ripoffline +ripoffline_sp +savetty +savetty_sp +scale_form +scale_menu +scanw +scr_dump +scr_init +scr_init_sp +scr_restore +scr_restore_sp +scr_set +scr_set_sp +scrl +scroll +scrollok +set_current_field +set_current_item +set_curterm +set_curterm_sp +set_escdelay +set_escdelay_sp +set_field_back +set_field_buffer +set_field_fore +set_field_init +set_field_just +set_field_opts +set_field_pad +set_field_status +set_field_term +set_field_type +set_field_userptr +set_fieldtype_arg +set_fieldtype_choice +set_form_fields +set_form_init +set_form_opts +set_form_page +set_form_sub +set_form_term +set_form_userptr +set_form_win +set_item_init +set_item_opts +set_item_term +set_item_userptr +set_item_value +set_max_field +set_menu_back +set_menu_fore +set_menu_format +set_menu_grey +set_menu_init +set_menu_items +set_menu_mark +set_menu_opts +set_menu_pad +set_menu_pattern +set_menu_spacing +set_menu_sub +set_menu_term +set_menu_userptr +set_menu_win +set_new_page +set_panel_userptr +set_tabsize +set_tabsize_sp +set_term +set_top_row +setcchar +setscrreg +setupterm +show_panel +slk_attr +slk_attr_off +slk_attr_on +slk_attr_set +slk_attr_set_sp +slk_attr_sp +slk_attroff +slk_attroff_sp +slk_attron +slk_attron_sp +slk_attrset +slk_attrset_sp +slk_clear +slk_clear_sp +slk_color +slk_color_sp +slk_init +slk_init_sp +slk_label +slk_label_sp +slk_noutrefresh +slk_noutrefresh_sp +slk_refresh +slk_refresh_sp +slk_restore +slk_restore_sp +slk_set +slk_set_sp +slk_touch +slk_touch_sp +slk_wset +standend +standout +start_color +start_color_sp +subpad +subwin +syncok +term_attrs +term_attrs_sp +termattrs +termattrs_sp +termname +termname_sp +tgetent +tgetent_sp +tgetflag +tgetflag_sp +tgetnum +tgetnum_sp +tgetstr +tgetstr_sp +tgoto +tigetflag +tigetflag_sp +tigetnum +tigetnum_sp +tigetstr +tigetstr_sp +timeout +tiparm +tiparm_s +tiscan_s +top_panel +top_row +touchline +touchwin +tparm +tputs +tputs_sp +trace +typeahead +typeahead_sp +unctrl +unctrl_sp +unfocus_current_field +unget_wch +unget_wch_sp +ungetch +ungetch_sp +ungetmouse +ungetmouse_sp +unpost_form +unpost_menu +untouchwin +update_panels +update_panels_sp +use_default_colors +use_default_colors_sp +use_env +use_env_sp +use_extended_names +use_legacy_coding +use_legacy_coding_sp +use_screen +use_tioctl +use_tioctl_sp +use_window +vid_attr +vid_attr_sp +vid_puts +vid_puts_sp +vidattr +vidattr_sp +vidputs +vidputs_sp +vline +vline_set +vw_printw +vw_scanw +vwprintw +vwscanw +wadd_wch +wadd_wchnstr +wadd_wchstr +waddch +waddchnstr +waddchstr +waddnstr +waddnwstr +waddstr +waddwstr +wattr_get +wattr_off +wattr_on +wattr_set +wattroff +wattron +wattrset +wbkgd +wbkgdset +wbkgrnd +wbkgrndset +wborder +wborder_set +wchgat +wclear +wclrtobot +wclrtoeol +wcolor_set +wcursyncup +wdelch +wdeleteln +wecho_wchar +wechochar +wenclose +werase +wget_wch +wget_wstr +wgetbkgrnd +wgetch +wgetch_events +wgetdelay +wgetn_wstr +wgetnstr +wgetnstr_events +wgetparent +wgetscrreg +wgetstr +whline +whline_set +win_wch +win_wchnstr +win_wchstr +winch +winchnstr +winchstr +winnstr +winnwstr +wins_nwstr +wins_wch +wins_wstr +winsch +winsdelln +winsertln +winsnstr +winsstr +winstr +winwstr +wmouse_trafo +wmove +wnoutrefresh +wprintw +wredrawln +wrefresh +wresize +wscanw +wscrl +wsetscrreg +wstandend +wstandout +wsyncdown +wsyncup +wtimeout +wtouchln +wunctrl +wunctrl_sp +wvline +wvline_set diff --git a/contrib/ncurses/package/ncursesw.map b/contrib/ncurses/package/ncursesw.map new file mode 100644 index 00000000..55834182 --- /dev/null +++ b/contrib/ncurses/package/ncursesw.map @@ -0,0 +1,1342 @@ +# $Id: ncursesw.map,v 1.62 2024/04/27 14:33:24 tom Exp $ +# script for shared library symbol-versioning using ld +# +# This file was generated by ncu-mapsyms +# Configure options (5.1.20000708) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.2.20001021) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.3.20021019) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.4.20040208) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.5.20051010) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.6.20061217) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace +# Configure options (6.0.current) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace + +NCURSES_TIC_5.0.19991023 { + global: + _nc_capcmp; + _nc_check_termtype; + _nc_entry_match; + _nc_infotocap; + _nc_read_entry_source; + _nc_reset_input; + _nc_resolve_uses; + _nc_set_writedir; + _nc_syntax; + _nc_tic_expand; + _nc_tic_written; + _nc_trans_string; + _nc_write_entry; + local: + _nc_captoinfo; + _nc_comment_end; + _nc_comment_start; + _nc_copy_entry; + _nc_curr_file_pos; + _nc_curr_token; + _nc_get_token; + _nc_init_entry; + _nc_merge_entry; + _nc_panic_mode; + _nc_parse_entry; + _nc_push_token; + _nc_save_str; + _nc_start_line; + _nc_wrap_entry; +}; + +NCURSES_TIC_5.1.20000708 { + global: + _nc_disable_period; +} NCURSES_TIC_5.0.19991023; + +NCURSES_TIC_5.5.20051010 { + global: + _nc_alloc_entry_leaks; + _nc_captoinfo_leaks; + _nc_check_termtype2; + _nc_comp_scan_leaks; + _nc_resolve_uses2; +} NCURSES_TIC_5.1.20000708; + +NCURSES_TIC_5.7.20081102 { + global: + _nc_free_tic; + local: + _nc_comp_captab_leaks; + _nc_leaks_tic; +} NCURSES_TIC_5.5.20051010; + +NCURSES_TIC_5.9.20150530 { + global: + _nc_strict_bsd; +} NCURSES_TIC_5.7.20081102; + +NCURSES_TIC_6.1.20171230 { + global: + _nc_read_entry2; + _nc_write_object; + local: + _*; +} NCURSES_TIC_5.9.20150530; + +NCURSES_TINFO_5.0.19991023 { + global: + BC; + COLS; + LINES; + PC; + SP; + TABSIZE; + UP; + _nc_access; + _nc_add_to_try; + _nc_copy_termtype; + _nc_curr_col; + _nc_curr_line; + _nc_doalloc; + _nc_err_abort; + _nc_fallback; + _nc_find_entry; + _nc_find_type_entry; + _nc_first_name; + _nc_free_entries; + _nc_free_termtype; + _nc_free_tparm; + _nc_freeall; + _nc_get_hash_table; + _nc_get_table; + _nc_get_tty_mode; + _nc_get_type; + _nc_getenv_num; + _nc_head; + _nc_home_terminfo; + _nc_info_hash_table; + _nc_init_acs; + _nc_keep_tic_dir; + _nc_keypad; + _nc_name_match; + _nc_outch; + _nc_read_entry; + _nc_read_file_entry; + _nc_screen_chain; + _nc_set_buffer; + _nc_set_source; + _nc_set_tty_mode; + _nc_set_type; + _nc_suppress_warnings; + _nc_syserr_abort; + _nc_tail; + _nc_tic_dir; + _nc_timed_wait; + _nc_trace_buf; + _nc_tracing; + _nc_update_screensize; + _nc_visbuf; + _nc_visbuf2; + _nc_warning; + _tracechar; + acs_map; + baudrate; + boolcodes; + boolfnames; + boolnames; + cbreak; + cur_term; + curs_set; + curscr; + curses_version; + def_prog_mode; + def_shell_mode; + define_key; + del_curterm; + delay_output; + erasechar; + flushinp; + halfdelay; + has_ic; + has_il; + has_key; + idcok; + idlok; + intrflush; + keybound; + keyname; + keyok; + keypad; + killchar; + longname; + meta; + napms; + newscr; + nocbreak; + nodelay; + noqiflush; + noraw; + notimeout; + numcodes; + numfnames; + numnames; + ospeed; + putp; + qiflush; + raw; + reset_prog_mode; + reset_shell_mode; + resetty; + savetty; + set_curterm; + setupterm; + stdscr; + strcodes; + strfnames; + strnames; + termname; + tgetent; + tgetflag; + tgetnum; + tgetstr; + tgoto; + tigetflag; + tigetnum; + tigetstr; + tparm; + tputs; + trace; + ttytype; + typeahead; + unctrl; + use_env; + wtimeout; + local: + _nc_baudrate; + _nc_cap_hash_table; + _nc_capalias_table; + _nc_expand_try; + _nc_infoalias_table; + _nc_init_keytry; + _nc_key_names; + _nc_nulls_sent; + _nc_ospeed; + _nc_read_termcap; + _nc_read_termcap_entry; + _nc_remove_key; + _nc_remove_string; + _nc_trace_tries; + _nc_tracebits; +}; + +NCURSES_TINFO_5.1.20000708 { + global: + _nc_align_termtype; + _nc_flush; + _nc_tinfo_fkeys; + _nc_user_definable; + _nc_utf8_outch; + use_extended_names; +} NCURSES_TINFO_5.0.19991023; + +NCURSES_TINFO_5.2.20001021 { + global: + _nc_basename; + _nc_env_access; + _nc_safe_strcat; + _nc_safe_strcpy; + _nc_str_copy; + _nc_str_init; + _nc_str_null; +} NCURSES_TINFO_5.1.20000708; + +NCURSES_TINFO_5.3.20021019 { + global: + _nc_rootname; + _nc_tparm_err; + _nc_visbufn; +} NCURSES_TINFO_5.2.20001021; + +NCURSES_TINFO_5.4.20040208 { + global: + _nc_altcharset_name; + _nc_get_locale; + _nc_locale_breaks_acs; + _nc_outchars; + _nc_pathlast; + _nc_retrace_attr_t; + _nc_retrace_bool; + _nc_retrace_chtype; + _nc_retrace_int; + _nc_retrace_ptr; + _nc_retrace_sp; + _nc_retrace_unsigned; + _nc_retrace_win; + _nc_tparm_analyze; + _nc_tputs_trace; + _nc_trace_bufcat; + _nc_unicode_locale; + _nc_viswbuf; + _nc_viswbufn; + _traceattr; + _traceattr2; + _tracecchar_t; + _tracecchar_t2; + _tracechtype; + _tracechtype2; + _tracef; + key_defined; + local: + _nc_trace_ttymode; + _nc_viswbuf2; +} NCURSES_TINFO_5.3.20021019; + +NCURSES_TINFO_5.5.20051010 { + global: + _nc_get_source; + _nc_retrace_cptr; + _nc_retrace_cvoid_ptr; + _nc_retrace_void_ptr; + _nc_setupterm; + _nc_trim_sgr0; + _nc_viswibuf; + local: + _nc_delink_entry; + _nc_free_entry; +} NCURSES_TINFO_5.4.20040208; + +NCURSES_TINFO_5.6.20061217 { + global: + _nc_db_close; + _nc_db_first; + _nc_db_have_data; + _nc_db_next; + _nc_db_open; + _nc_db_put; + _nc_eventlist_timeout; + _nc_first_db; + _nc_handle_sigwinch; + _nc_is_abs_path; + _nc_is_dir_path; + _nc_is_file_path; + _nc_keyname_leaks; + _nc_last_db; + _nc_next_db; + _nc_read_termtype; + _nc_tgetent_leaks; + _nc_viscbuf; + local: + _nc_db_get; + _nc_db_have_index; + _nc_hashed_db; + _nc_viscbuf2; +} NCURSES_TINFO_5.5.20051010; + +NCURSES_TINFO_5.7.20081102 { + global: + _nc_free_tinfo; + _nc_get_alias_table; + _nc_get_screensize; + _nc_globals; + _nc_leaks_tinfo; + _nc_prescreen; + _nc_screen_of; + _nc_set_no_padding; + _nc_tracechar; + set_tabsize; + local: + _nc_keyname; + _nc_unctrl; +} NCURSES_TINFO_5.6.20061217; + +NCURSES_TINFO_5.8.20110226 { + global: + _nc_flush_sp; + _nc_get_tty_mode_sp; + _nc_init_acs_sp; + _nc_outc_wrapper; + _nc_outch_sp; + _nc_putp; + _nc_putp_flush; + _nc_putp_flush_sp; + _nc_putp_sp; + _nc_retrace_int_attr_t; + _nc_set_buffer_sp; + _nc_set_tty_mode_sp; + baudrate_sp; + cbreak_sp; + curs_set_sp; + def_prog_mode_sp; + def_shell_mode_sp; + define_key_sp; + del_curterm_sp; + delay_output_sp; + erasechar_sp; + flushinp_sp; + halfdelay_sp; + has_ic_sp; + has_il_sp; + has_key_sp; + intrflush_sp; + key_defined_sp; + keybound_sp; + keyname_sp; + keyok_sp; + killchar_sp; + longname_sp; + napms_sp; + new_prescr; + nocbreak_sp; + noqiflush_sp; + noraw_sp; + putp_sp; + qiflush_sp; + raw_sp; + reset_prog_mode_sp; + reset_shell_mode_sp; + resetty_sp; + savetty_sp; + set_curterm_sp; + set_tabsize_sp; + termname_sp; + tgetent_sp; + tgetflag_sp; + tgetnum_sp; + tgetstr_sp; + tigetflag_sp; + tigetnum_sp; + tigetstr_sp; + tiparm; + tputs_sp; + typeahead_sp; + unctrl_sp; + use_env_sp; + local: + _nc_get_hash_info; + _nc_retrace_char; + _nc_setup_tinfo; + _nc_tinfo_cmdch; +} NCURSES_TINFO_5.7.20081102; + +NCURSES_TINFO_5.9.20150530 { + global: + _nc_init_termtype; + _nc_putchar; + _nc_putchar_sp; + use_tioctl; + use_tioctl_sp; + local: + _nc_comp_error_leaks; + _nc_db_iterator_leaks; + _nc_setenv_num; +} NCURSES_TINFO_5.8.20110226; + +NCURSES_TINFO_6.1.20171230 { + global: + _nc_copy_termtype2; + _nc_export_termtype2; + _nc_fallback2; + _nc_free_termtype2; +} NCURSES_TINFO_5.9.20150530; + +NCURSES_TINFO_6.2.20200212 { + global: + _nc_find_user_entry; + _nc_fmt_funcptr; + _nc_wacs_width; + curses_trace; + exit_terminfo; +} NCURSES_TINFO_6.1.20171230; + +NCURSES_TINFO_6.2.20211010 { + global: + _nc_reset_tparm; + _nc_tiparm; + _nc_safe_fopen; + _nc_safe_open3; + erasewchar_sp; + killwchar_sp; +} NCURSES_TINFO_6.2.20200212; + +NCURSES_TINFO_6.5.20240427 { + global: + is_cbreak; + is_cbreak_sp; + is_echo; + is_echo_sp; + is_nl; + is_nl_sp; + is_raw; + is_raw_sp; + tiparm_s; + tiscan_s; + local: + _*; +} NCURSES_TINFO_6.2.20211010; + +NCURSESW_5.1.20000708 { + global: + COLORS; + COLOR_PAIR; + COLOR_PAIRS; + ESCDELAY; + PAIR_NUMBER; + TYPE_ALNUM; + TYPE_ALPHA; + TYPE_ENUM; + TYPE_INTEGER; + TYPE_IPV4; + TYPE_NUMERIC; + TYPE_REGEXP; + _nc_Default_Field; # deprecated in ABI6 + _nc_Default_Form; # deprecated in ABI6 + _nc_free_and_exit; + _nc_has_mouse; # deprecated in ABI6 + _nc_panelhook; + _nc_ripoffline; + addch; + addchnstr; + addchstr; + addnstr; + addstr; + assume_default_colors; + attr_get; + attr_off; + attr_on; + attr_set; + attroff; + attron; + attrset; + beep; + bkgd; + bkgdset; + border; + bottom_panel; + box; + can_change_color; + chgat; + clear; + clearok; + clrtobot; + clrtoeol; + color_content; + color_set; + copywin; + current_field; + current_item; + data_ahead; + data_behind; + del_panel; + delch; + deleteln; + delscreen; + delwin; + derwin; + doupdate; + dup_field; + dupwin; + dynamic_field_info; + echo; + echochar; + endwin; + erase; + field_arg; + field_back; + field_buffer; + field_count; + field_fore; + field_index; + field_info; + field_init; + field_just; + field_opts; + field_opts_off; + field_opts_on; + field_pad; + field_status; + field_term; + field_type; + field_userptr; + filter; + flash; + form_driver; + form_fields; + form_init; + form_opts; + form_opts_off; + form_opts_on; + form_page; + form_request_by_name; + form_request_name; + form_sub; + form_term; + form_userptr; + form_win; + free_field; + free_fieldtype; + free_form; + free_item; + free_menu; + getbkgd; + getch; + getmouse; + getnstr; + getstr; + getwin; + has_colors; + hide_panel; + hline; + immedok; + inch; + inchnstr; + inchstr; + init_color; + init_pair; + initscr; + innstr; + insch; + insdelln; + insertln; + insnstr; + insstr; + instr; + is_linetouched; + is_wintouched; + isendwin; + item_count; + item_description; + item_index; + item_init; + item_name; + item_opts; + item_opts_off; + item_opts_on; + item_term; + item_userptr; + item_value; + item_visible; + leaveok; + link_field; + link_fieldtype; + mcprint; + menu_back; + menu_driver; + menu_fore; + menu_format; + menu_grey; + menu_init; + menu_items; + menu_mark; + menu_opts; + menu_opts_off; + menu_opts_on; + menu_pad; + menu_pattern; + menu_request_by_name; + menu_request_name; + menu_spacing; + menu_sub; + menu_term; + menu_userptr; + menu_win; + mouse_trafo; + mouseinterval; + mousemask; + move; + move_field; + move_panel; + mvaddch; + mvaddchnstr; + mvaddchstr; + mvaddnstr; + mvaddstr; + mvchgat; + mvcur; + mvdelch; + mvderwin; + mvgetch; + mvgetnstr; + mvgetstr; + mvhline; + mvinch; + mvinchnstr; + mvinchstr; + mvinnstr; + mvinsch; + mvinsnstr; + mvinsstr; + mvinstr; + mvprintw; + mvscanw; + mvvline; + mvwaddch; + mvwaddchnstr; + mvwaddchstr; + mvwaddnstr; + mvwaddstr; + mvwchgat; + mvwdelch; + mvwgetch; + mvwgetnstr; + mvwgetstr; + mvwhline; + mvwin; + mvwinch; + mvwinchnstr; + mvwinchstr; + mvwinnstr; + mvwinsch; + mvwinsnstr; + mvwinsstr; + mvwinstr; + mvwprintw; + mvwscanw; + mvwvline; + new_field; + new_fieldtype; + new_form; + new_item; + new_menu; + new_page; + new_panel; + newpad; + newterm; + newwin; + nl; + noecho; + nonl; + overlay; + overwrite; + pair_content; + panel_above; + panel_below; + panel_hidden; + panel_userptr; + panel_window; + pechochar; + pnoutrefresh; + pos_form_cursor; + pos_menu_cursor; + post_form; + post_menu; + prefresh; + printw; + putwin; + redrawwin; + refresh; + replace_panel; + resizeterm; + restartterm; + ripoffline; + scale_form; + scale_menu; + scanw; + scr_dump; + scr_init; + scr_restore; + scr_set; + scrl; + scroll; + scrollok; + set_current_field; + set_current_item; + set_field_back; + set_field_buffer; + set_field_fore; + set_field_init; + set_field_just; + set_field_opts; + set_field_pad; + set_field_status; + set_field_term; + set_field_type; + set_field_userptr; + set_fieldtype_arg; + set_fieldtype_choice; + set_form_fields; + set_form_init; + set_form_opts; + set_form_page; + set_form_sub; + set_form_term; + set_form_userptr; + set_form_win; + set_item_init; + set_item_opts; + set_item_term; + set_item_userptr; + set_item_value; + set_max_field; + set_menu_back; + set_menu_fore; + set_menu_format; + set_menu_grey; + set_menu_init; + set_menu_items; + set_menu_mark; + set_menu_opts; + set_menu_pad; + set_menu_pattern; + set_menu_spacing; + set_menu_sub; + set_menu_term; + set_menu_userptr; + set_menu_win; + set_new_page; + set_panel_userptr; + set_term; + set_top_row; + setscrreg; + show_panel; + slk_attr; + slk_attr_off; + slk_attr_on; + slk_attr_set; + slk_attroff; + slk_attron; + slk_attrset; + slk_clear; + slk_color; + slk_init; + slk_label; + slk_noutrefresh; + slk_refresh; + slk_restore; + slk_set; + slk_touch; + standend; + standout; + start_color; + subpad; + subwin; + syncok; + termattrs; + timeout; + top_panel; + top_row; + touchline; + touchwin; + ungetch; + ungetmouse; + unpost_form; + unpost_menu; + untouchwin; + update_panels; + use_default_colors; + vid_attr; + vidattr; + vidputs; + vline; + vw_printw; + vw_scanw; + vwprintw; + vwscanw; + waddch; + waddchnstr; + waddchstr; + waddnstr; + waddstr; + wattr_get; + wattr_off; + wattr_on; + wattr_set; + wattroff; + wattron; + wattrset; + wbkgd; + wbkgdset; + wborder; + wchgat; + wclear; + wclrtobot; + wclrtoeol; + wcolor_set; + wcursyncup; + wdelch; + wdeleteln; + wechochar; + wenclose; + werase; + wgetch; + wgetnstr; + wgetstr; + whline; + winch; + winchnstr; + winchstr; + winnstr; + winsch; + winsdelln; + winsertln; + winsnstr; + winsstr; + winstr; + wmouse_trafo; + wmove; + wnoutrefresh; + wprintw; + wredrawln; + wrefresh; + wresize; + wscanw; + wscrl; + wsetscrreg; + wstandend; + wstandout; + wsyncdown; + wsyncup; + wtouchln; + wvline; + local: + _nc_Calculate_Item_Length_and_Width; + _nc_Connect_Items; + _nc_Copy_Argument; + _nc_Copy_Type; + _nc_Default_FieldType; + _nc_Default_Item; + _nc_Default_Menu; + _nc_Disconnect_Items; + _nc_Draw_Menu; + _nc_First_Active_Field; + _nc_Free_Argument; + _nc_Free_Type; + _nc_Internal_Validation; + _nc_Link_Items; + _nc_Make_Argument; + _nc_Match_Next_Character_In_Item_Name; + _nc_New_TopRow_and_CurrentItem; + _nc_Position_Form_Cursor; + _nc_Post_Item; + _nc_Refresh_Current_Field; + _nc_Set_Current_Field; + _nc_Set_Form_Page; + _nc_Show_Menu; + _nc_Synchronize_Attributes; + _nc_Synchronize_Options; + _nc_background; + _nc_do_color; + _nc_expanded; + _nc_freewin; + _nc_hash_map; + _nc_make_oldhash; + _nc_makenew; + _nc_memmove; + _nc_menu_cursor_pos; + _nc_msec_cost; + _nc_mvcur_init; + _nc_mvcur_resume; + _nc_mvcur_wrap; + _nc_oldnums; + _nc_outstr; + _nc_printf_string; + _nc_render; + _nc_screen_init; + _nc_screen_resume; + _nc_screen_wrap; + _nc_scroll_oldhash; + _nc_scroll_optimize; + _nc_scroll_window; + _nc_scrolln; + _nc_setupscreen; + _nc_sigaction; + _nc_signal_handler; + _nc_slk_format; + _nc_slk_initialize; + _nc_synchook; + _nc_vsscanf; + _nc_waddch_nosync; +}; + +NCURSESW_5.3.20021019 { + global: + _nc_wacs; + _nc_wchstrlen; + add_wch; + add_wchnstr; + add_wchstr; + addnwstr; + addwstr; + bkgrnd; + bkgrndset; + border_set; + box_set; + echo_wchar; + erasewchar; + get_wch; + get_wstr; + getbkgrnd; + getcchar; + getn_wstr; + hline_set; + in_wch; + in_wchnstr; + in_wchstr; + innwstr; + ins_nwstr; + ins_wch; + ins_wstr; + inwstr; + is_term_resized; + key_name; + killwchar; + mvadd_wch; + mvadd_wchnstr; + mvadd_wchstr; + mvaddnwstr; + mvaddwstr; + mvget_wch; + mvget_wstr; + mvgetn_wstr; + mvhline_set; + mvin_wch; + mvin_wchnstr; + mvin_wchstr; + mvinnwstr; + mvins_nwstr; + mvins_wch; + mvins_wstr; + mvinwstr; + mvvline_set; + mvwadd_wch; + mvwadd_wchnstr; + mvwadd_wchstr; + mvwaddnwstr; + mvwaddwstr; + mvwget_wch; + mvwget_wstr; + mvwgetn_wstr; + mvwhline_set; + mvwin_wch; + mvwin_wchnstr; + mvwin_wchstr; + mvwinnwstr; + mvwins_nwstr; + mvwins_wch; + mvwins_wstr; + mvwinwstr; + mvwvline_set; + resize_term; + setcchar; + term_attrs; + unget_wch; + vid_puts; + vline_set; + wadd_wch; + wadd_wchnstr; + wadd_wchstr; + waddnwstr; + waddwstr; + wbkgrnd; + wbkgrndset; + wborder_set; + wecho_wchar; + wget_wch; + wget_wstr; + wgetn_wstr; + whline_set; + win_wch; + win_wchnstr; + win_wchstr; + winnwstr; + wins_nwstr; + wins_wch; + wins_wstr; + winwstr; + wunctrl; + wvline_set; + local: + _nc_init_wacs; + _nc_reset_colors; + _nc_varargs; + _nc_wgetch; +} NCURSESW_5.1.20000708; + +NCURSESW_5.4.20040208 { + global: + _nc_optimize_enable; + pecho_wchar; + slk_wset; + local: + _nc_Touchline; + _nc_Touchpan; + _nc_Wnoutrefresh; + _nc_dPanel; + _nc_dStack; + _nc_fifo_dump; + _nc_insert_ch; + _nc_is_charable; + _nc_linedump; + _nc_my_visbuf; + _nc_to_char; + _nc_to_widechar; + _nc_trace_xnames; + _tracedump; + _tracemouse; +} NCURSESW_5.3.20021019; + +NCURSESW_5.5.20051010 { + global: + _nc_wcrtomb; + local: + _nc_Calculate_Text_Width; + _nc_Widen_String; + _nc_build_wch; + _nc_retrace_field; + _nc_retrace_field_ptr; + _nc_retrace_field_type; + _nc_retrace_form; + _nc_retrace_form_hook; + _nc_retrace_item; + _nc_retrace_item_opts; + _nc_retrace_item_ptr; + _nc_retrace_menu; + _nc_retrace_menu_hook; + _nc_retrace_menu_opts; + _nc_retrace_panel; +} NCURSESW_5.4.20040208; + +NCURSESW_5.6.20061217 { + global: + getbegx; + getbegy; + getcurx; + getcury; + getmaxx; + getmaxy; + getparx; + getpary; + nofilter; + use_legacy_coding; + wgetbkgrnd; + wgetch_events; + wgetnstr_events; +} NCURSESW_5.5.20051010; + +NCURSESW_5.7.20081102 { + global: + getattrs; + is_cleared; + is_idcok; + is_idlok; + is_immedok; + is_keypad; + is_leaveok; + is_nodelay; + is_notimeout; + is_scrollok; + is_syncok; + set_escdelay; + use_screen; + use_window; + wgetparent; + wgetscrreg; + local: + _nc_tracemouse; + _nc_ungetch; +} NCURSESW_5.6.20061217; + +NCURSESW_5.8.20110226 { + global: + _nc_panelhook_sp; + assume_default_colors_sp; + beep_sp; + can_change_color_sp; + ceiling_panel; + color_content_sp; + doupdate_sp; + echo_sp; + endwin_sp; + filter_sp; + flash_sp; + get_escdelay; + get_escdelay_sp; + getmouse_sp; + getwin_sp; + ground_panel; + has_colors_sp; + has_mouse; + has_mouse_sp; + init_color_sp; + init_pair_sp; + is_pad; + is_subwin; + is_term_resized_sp; + isendwin_sp; + mcprint_sp; + mouseinterval_sp; + mousemask_sp; + mvcur_sp; + new_form_sp; + new_menu_sp; + newpad_sp; + newterm_sp; + newwin_sp; + nl_sp; + noecho_sp; + nofilter_sp; + nonl_sp; + pair_content_sp; + resize_term_sp; + resizeterm_sp; + restartterm_sp; + ripoffline_sp; + scr_init_sp; + scr_restore_sp; + scr_set_sp; + set_escdelay_sp; + slk_attr_set_sp; + slk_attr_sp; + slk_attroff_sp; + slk_attron_sp; + slk_attrset_sp; + slk_clear_sp; + slk_color_sp; + slk_init_sp; + slk_label_sp; + slk_noutrefresh_sp; + slk_refresh_sp; + slk_restore_sp; + slk_set_sp; + slk_touch_sp; + start_color_sp; + term_attrs_sp; + termattrs_sp; + unget_wch_sp; + ungetch_sp; + ungetmouse_sp; + update_panels_sp; + use_default_colors_sp; + use_legacy_coding_sp; + vid_attr_sp; + vid_puts_sp; + vidattr_sp; + vidputs_sp; + wunctrl_sp; + local: + _nc_TYPE_ALNUM; + _nc_TYPE_ALPHA; + _nc_TYPE_ENUM; + _nc_TYPE_INTEGER; + _nc_TYPE_IPV4; + _nc_TYPE_NUMERIC; + _nc_TYPE_REGEXP; + _nc_curscr_of; + _nc_do_color_sp; + _nc_form_cursor; + _nc_format_slks; + _nc_free_and_exit_sp; + _nc_freeall_sp; + _nc_fty_generic; + _nc_generic_fieldtype; + _nc_get_fieldbuffer; + _nc_hash_map_sp; + _nc_insert_wch; + _nc_linedump_sp; + _nc_make_oldhash_sp; + _nc_makenew_sp; + _nc_msec_cost_sp; + _nc_mvcur_init_sp; + _nc_mvcur_resume_sp; + _nc_mvcur_wrap_sp; + _nc_newscr_of; + _nc_printf_string_sp; + _nc_reset_colors_sp; + _nc_retrace_mmask_t; + _nc_ripoffline_sp; + _nc_screen_init_sp; + _nc_screen_resume_sp; + _nc_screen_wrap_sp; + _nc_scroll_oldhash_sp; + _nc_scroll_optimize_sp; + _nc_scrolln_sp; + _nc_set_generic_fieldtype; + _nc_setupscreen_sp; + _nc_stdscr_of; +} NCURSESW_5.7.20081102; + +NCURSESW_5.9.20150530 { + global: + form_driver_w; + wgetdelay; + local: + _nc_mvcur; + _nc_mvcur_sp; + _nc_trace_mmask_t; +} NCURSESW_5.8.20110226; + +NCURSESW_6.1.20171230 { + global: + alloc_pair; + alloc_pair_sp; + extended_color_content; + extended_color_content_sp; + extended_pair_content; + extended_pair_content_sp; + extended_slk_color; + extended_slk_color_sp; + find_pair; + find_pair_sp; + free_pair; + free_pair_sp; + init_extended_color; + init_extended_color_sp; + init_extended_pair; + init_extended_pair_sp; + reset_color_pairs; + reset_color_pairs_sp; + unfocus_current_field; + local: + _nc_Unset_Current_Field; + _nc_change_pair; + _nc_init_color; + _nc_init_pair; + _nc_pair_content; + _nc_reset_color_pair; + _nc_set_color_pair; +} NCURSESW_5.9.20150530; + +NCURSESW_6.2.20200212 { + global: + exit_curses; + local: + _*; +} NCURSESW_6.1.20171230; diff --git a/contrib/ncurses/package/ncursesw.sym b/contrib/ncurses/package/ncursesw.sym new file mode 100644 index 00000000..8ef771f9 --- /dev/null +++ b/contrib/ncurses/package/ncursesw.sym @@ -0,0 +1,1008 @@ +# $Id: ncursesw.sym,v 1.42 2023/08/12 15:28:30 tom Exp $ +# script for shared library symbol-visibility using libtool +# +# This file was generated by ncu-mapsyms +# Configure options (5.1.20000708) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.2.20001021) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.3.20021019) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.4.20040208) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.5.20051010) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.6.20061217) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.7.20081102) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.8.20110226) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20110404) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace --without-cxx-binding +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace --without-cxx-binding +# Configure options (5.9.20150530) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace +# Configure options (6.0.20161029) +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-getcap --enable-getcap-cache --enable-hard-tabs --enable-termcap --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-interop --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-broken_linker --with-hashed-db --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-sp-funcs --enable-widec --with-termlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-wgetch-events --enable-widec --with-hashed-db --with-termlib --with-ticlib --with-trace +# --disable-getcap --disable-leaks --disable-root-environ --disable-termcap --enable-hard-tabs --enable-widec --with-broken_linker --with-termlib --with-ticlib --with-trace +BC +COLORS +COLOR_PAIR +COLOR_PAIRS +COLS +ESCDELAY +LINES +PAIR_NUMBER +PC +SP +TABSIZE +TYPE_ALNUM +TYPE_ALPHA +TYPE_ENUM +TYPE_INTEGER +TYPE_IPV4 +TYPE_NUMERIC +TYPE_REGEXP +UP +_nc_Default_Field +_nc_Default_Form +_nc_access +_nc_add_to_try +_nc_align_termtype +_nc_alloc_entry_leaks +_nc_altcharset_name +_nc_basename +_nc_capcmp +_nc_captoinfo_leaks +_nc_check_termtype +_nc_check_termtype2 +_nc_comp_scan_leaks +_nc_copy_termtype +_nc_copy_termtype2 +_nc_curr_col +_nc_curr_line +_nc_db_close +_nc_db_first +_nc_db_have_data +_nc_db_next +_nc_db_open +_nc_db_put +_nc_disable_period +_nc_doalloc +_nc_entry_match +_nc_env_access +_nc_err_abort +_nc_eventlist_timeout +_nc_export_termtype2 +_nc_fallback +_nc_fallback2 +_nc_find_entry +_nc_find_type_entry +_nc_find_user_entry +_nc_first_db +_nc_first_name +_nc_flush +_nc_flush_sp +_nc_fmt_funcptr +_nc_free_and_exit +_nc_free_entries +_nc_free_termtype +_nc_free_termtype2 +_nc_free_tic +_nc_free_tinfo +_nc_free_tparm +_nc_freeall +_nc_get_alias_table +_nc_get_hash_table +_nc_get_locale +_nc_get_screensize +_nc_get_source +_nc_get_table +_nc_get_tty_mode +_nc_get_tty_mode_sp +_nc_get_type +_nc_getenv_num +_nc_globals +_nc_handle_sigwinch +_nc_has_mouse +_nc_head +_nc_home_terminfo +_nc_info_hash_table +_nc_infotocap +_nc_init_acs +_nc_init_acs_sp +_nc_init_termtype +_nc_is_abs_path +_nc_is_dir_path +_nc_is_file_path +_nc_keep_tic_dir +_nc_keyname_leaks +_nc_keypad +_nc_last_db +_nc_leaks_tinfo +_nc_locale_breaks_acs +_nc_name_match +_nc_next_db +_nc_optimize_enable +_nc_outc_wrapper +_nc_outch +_nc_outch_sp +_nc_outchars +_nc_panelhook +_nc_panelhook_sp +_nc_pathlast +_nc_prescreen +_nc_putchar +_nc_putchar_sp +_nc_putp +_nc_putp_flush +_nc_putp_flush_sp +_nc_putp_sp +_nc_read_entry +_nc_read_entry2 +_nc_read_entry_source +_nc_read_file_entry +_nc_read_termtype +_nc_reset_input +_nc_reset_tparm +_nc_resolve_uses +_nc_resolve_uses2 +_nc_retrace_attr_t +_nc_retrace_bool +_nc_retrace_chtype +_nc_retrace_cptr +_nc_retrace_cvoid_ptr +_nc_retrace_int +_nc_retrace_int_attr_t +_nc_retrace_ptr +_nc_retrace_sp +_nc_retrace_unsigned +_nc_retrace_void_ptr +_nc_retrace_win +_nc_ripoffline +_nc_rootname +_nc_safe_fopen +_nc_safe_open3 +_nc_safe_strcat +_nc_safe_strcpy +_nc_screen_chain +_nc_screen_of +_nc_set_buffer +_nc_set_buffer_sp +_nc_set_no_padding +_nc_set_source +_nc_set_tty_mode +_nc_set_tty_mode_sp +_nc_set_type +_nc_set_writedir +_nc_setupterm +_nc_str_copy +_nc_str_init +_nc_str_null +_nc_strict_bsd +_nc_suppress_warnings +_nc_syntax +_nc_syserr_abort +_nc_tail +_nc_tgetent_leaks +_nc_tic_dir +_nc_tic_expand +_nc_tic_written +_nc_timed_wait +_nc_tinfo_fkeys +_nc_tiparm +_nc_tparm_analyze +_nc_tparm_err +_nc_tputs_trace +_nc_trace_buf +_nc_trace_bufcat +_nc_tracechar +_nc_tracing +_nc_trans_string +_nc_trim_sgr0 +_nc_unicode_locale +_nc_update_screensize +_nc_user_definable +_nc_utf8_outch +_nc_visbuf +_nc_visbuf2 +_nc_visbufn +_nc_viscbuf +_nc_viswbuf +_nc_viswbufn +_nc_viswibuf +_nc_wacs +_nc_wacs_width +_nc_warning +_nc_wchstrlen +_nc_wcrtomb +_nc_write_entry +_nc_write_object +_traceattr +_traceattr2 +_tracecchar_t +_tracecchar_t2 +_tracechar +_tracechtype +_tracechtype2 +_tracef +acs_map +add_wch +add_wchnstr +add_wchstr +addch +addchnstr +addchstr +addnstr +addnwstr +addstr +addwstr +alloc_pair +alloc_pair_sp +assume_default_colors +assume_default_colors_sp +attr_get +attr_off +attr_on +attr_set +attroff +attron +attrset +baudrate +baudrate_sp +beep +beep_sp +bkgd +bkgdset +bkgrnd +bkgrndset +boolcodes +boolfnames +boolnames +border +border_set +bottom_panel +box +box_set +can_change_color +can_change_color_sp +cbreak +cbreak_sp +ceiling_panel +chgat +clear +clearok +clrtobot +clrtoeol +color_content +color_content_sp +color_set +copywin +cur_term +current_field +current_item +curs_set +curs_set_sp +curscr +curses_trace +curses_version +data_ahead +data_behind +def_prog_mode +def_prog_mode_sp +def_shell_mode +def_shell_mode_sp +define_key +define_key_sp +del_curterm +del_curterm_sp +del_panel +delay_output +delay_output_sp +delch +deleteln +delscreen +delwin +derwin +doupdate +doupdate_sp +dup_field +dupwin +dynamic_field_info +echo +echo_sp +echo_wchar +echochar +endwin +endwin_sp +erase +erasechar +erasechar_sp +erasewchar +erasewchar_sp +exit_curses +exit_terminfo +extended_color_content +extended_color_content_sp +extended_pair_content +extended_pair_content_sp +extended_slk_color +extended_slk_color_sp +field_arg +field_back +field_buffer +field_count +field_fore +field_index +field_info +field_init +field_just +field_opts +field_opts_off +field_opts_on +field_pad +field_status +field_term +field_type +field_userptr +filter +filter_sp +find_pair +find_pair_sp +flash +flash_sp +flushinp +flushinp_sp +form_driver +form_driver_w +form_fields +form_init +form_opts +form_opts_off +form_opts_on +form_page +form_request_by_name +form_request_name +form_sub +form_term +form_userptr +form_win +free_field +free_fieldtype +free_form +free_item +free_menu +free_pair +free_pair_sp +get_escdelay +get_escdelay_sp +get_wch +get_wstr +getattrs +getbegx +getbegy +getbkgd +getbkgrnd +getcchar +getch +getcurx +getcury +getmaxx +getmaxy +getmouse +getmouse_sp +getn_wstr +getnstr +getparx +getpary +getstr +getwin +getwin_sp +ground_panel +halfdelay +halfdelay_sp +has_colors +has_colors_sp +has_ic +has_ic_sp +has_il +has_il_sp +has_key +has_key_sp +has_mouse +has_mouse_sp +hide_panel +hline +hline_set +idcok +idlok +immedok +in_wch +in_wchnstr +in_wchstr +inch +inchnstr +inchstr +init_color +init_color_sp +init_extended_color +init_extended_color_sp +init_extended_pair +init_extended_pair_sp +init_pair +init_pair_sp +initscr +innstr +innwstr +ins_nwstr +ins_wch +ins_wstr +insch +insdelln +insertln +insnstr +insstr +instr +intrflush +intrflush_sp +inwstr +is_cbreak +is_cbreak_sp +is_cleared +is_echo +is_echo_sp +is_idcok +is_idlok +is_immedok +is_keypad +is_leaveok +is_linetouched +is_nl +is_nl_sp +is_nodelay +is_notimeout +is_pad +is_raw +is_raw_sp +is_scrollok +is_subwin +is_syncok +is_term_resized +is_term_resized_sp +is_wintouched +isendwin +isendwin_sp +item_count +item_description +item_index +item_init +item_name +item_opts +item_opts_off +item_opts_on +item_term +item_userptr +item_value +item_visible +key_defined +key_defined_sp +key_name +keybound +keybound_sp +keyname +keyname_sp +keyok +keyok_sp +keypad +killchar +killchar_sp +killwchar +killwchar_sp +leaveok +link_field +link_fieldtype +longname +longname_sp +mcprint +mcprint_sp +menu_back +menu_driver +menu_fore +menu_format +menu_grey +menu_init +menu_items +menu_mark +menu_opts +menu_opts_off +menu_opts_on +menu_pad +menu_pattern +menu_request_by_name +menu_request_name +menu_spacing +menu_sub +menu_term +menu_userptr +menu_win +meta +mouse_trafo +mouseinterval +mouseinterval_sp +mousemask +mousemask_sp +move +move_field +move_panel +mvadd_wch +mvadd_wchnstr +mvadd_wchstr +mvaddch +mvaddchnstr +mvaddchstr +mvaddnstr +mvaddnwstr +mvaddstr +mvaddwstr +mvchgat +mvcur +mvcur_sp +mvdelch +mvderwin +mvget_wch +mvget_wstr +mvgetch +mvgetn_wstr +mvgetnstr +mvgetstr +mvhline +mvhline_set +mvin_wch +mvin_wchnstr +mvin_wchstr +mvinch +mvinchnstr +mvinchstr +mvinnstr +mvinnwstr +mvins_nwstr +mvins_wch +mvins_wstr +mvinsch +mvinsnstr +mvinsstr +mvinstr +mvinwstr +mvprintw +mvscanw +mvvline +mvvline_set +mvwadd_wch +mvwadd_wchnstr +mvwadd_wchstr +mvwaddch +mvwaddchnstr +mvwaddchstr +mvwaddnstr +mvwaddnwstr +mvwaddstr +mvwaddwstr +mvwchgat +mvwdelch +mvwget_wch +mvwget_wstr +mvwgetch +mvwgetn_wstr +mvwgetnstr +mvwgetstr +mvwhline +mvwhline_set +mvwin +mvwin_wch +mvwin_wchnstr +mvwin_wchstr +mvwinch +mvwinchnstr +mvwinchstr +mvwinnstr +mvwinnwstr +mvwins_nwstr +mvwins_wch +mvwins_wstr +mvwinsch +mvwinsnstr +mvwinsstr +mvwinstr +mvwinwstr +mvwprintw +mvwscanw +mvwvline +mvwvline_set +napms +napms_sp +new_field +new_fieldtype +new_form +new_form_sp +new_item +new_menu +new_menu_sp +new_page +new_panel +new_prescr +newpad +newpad_sp +newscr +newterm +newterm_sp +newwin +newwin_sp +nl +nl_sp +nocbreak +nocbreak_sp +nodelay +noecho +noecho_sp +nofilter +nofilter_sp +nonl +nonl_sp +noqiflush +noqiflush_sp +noraw +noraw_sp +notimeout +numcodes +numfnames +numnames +ospeed +overlay +overwrite +pair_content +pair_content_sp +panel_above +panel_below +panel_hidden +panel_userptr +panel_window +pecho_wchar +pechochar +pnoutrefresh +pos_form_cursor +pos_menu_cursor +post_form +post_menu +prefresh +printw +putp +putp_sp +putwin +qiflush +qiflush_sp +raw +raw_sp +redrawwin +refresh +replace_panel +reset_color_pairs +reset_color_pairs_sp +reset_prog_mode +reset_prog_mode_sp +reset_shell_mode +reset_shell_mode_sp +resetty +resetty_sp +resize_term +resize_term_sp +resizeterm +resizeterm_sp +restartterm +restartterm_sp +ripoffline +ripoffline_sp +savetty +savetty_sp +scale_form +scale_menu +scanw +scr_dump +scr_init +scr_init_sp +scr_restore +scr_restore_sp +scr_set +scr_set_sp +scrl +scroll +scrollok +set_current_field +set_current_item +set_curterm +set_curterm_sp +set_escdelay +set_escdelay_sp +set_field_back +set_field_buffer +set_field_fore +set_field_init +set_field_just +set_field_opts +set_field_pad +set_field_status +set_field_term +set_field_type +set_field_userptr +set_fieldtype_arg +set_fieldtype_choice +set_form_fields +set_form_init +set_form_opts +set_form_page +set_form_sub +set_form_term +set_form_userptr +set_form_win +set_item_init +set_item_opts +set_item_term +set_item_userptr +set_item_value +set_max_field +set_menu_back +set_menu_fore +set_menu_format +set_menu_grey +set_menu_init +set_menu_items +set_menu_mark +set_menu_opts +set_menu_pad +set_menu_pattern +set_menu_spacing +set_menu_sub +set_menu_term +set_menu_userptr +set_menu_win +set_new_page +set_panel_userptr +set_tabsize +set_tabsize_sp +set_term +set_top_row +setcchar +setscrreg +setupterm +show_panel +slk_attr +slk_attr_off +slk_attr_on +slk_attr_set +slk_attr_set_sp +slk_attr_sp +slk_attroff +slk_attroff_sp +slk_attron +slk_attron_sp +slk_attrset +slk_attrset_sp +slk_clear +slk_clear_sp +slk_color +slk_color_sp +slk_init +slk_init_sp +slk_label +slk_label_sp +slk_noutrefresh +slk_noutrefresh_sp +slk_refresh +slk_refresh_sp +slk_restore +slk_restore_sp +slk_set +slk_set_sp +slk_touch +slk_touch_sp +slk_wset +standend +standout +start_color +start_color_sp +stdscr +strcodes +strfnames +strnames +subpad +subwin +syncok +term_attrs +term_attrs_sp +termattrs +termattrs_sp +termname +termname_sp +tgetent +tgetent_sp +tgetflag +tgetflag_sp +tgetnum +tgetnum_sp +tgetstr +tgetstr_sp +tgoto +tigetflag +tigetflag_sp +tigetnum +tigetnum_sp +tigetstr +tigetstr_sp +timeout +tiparm +tiparm_s +tiscan_s +top_panel +top_row +touchline +touchwin +tparm +tputs +tputs_sp +trace +ttytype +typeahead +typeahead_sp +unctrl +unctrl_sp +unfocus_current_field +unget_wch +unget_wch_sp +ungetch +ungetch_sp +ungetmouse +ungetmouse_sp +unpost_form +unpost_menu +untouchwin +update_panels +update_panels_sp +use_default_colors +use_default_colors_sp +use_env +use_env_sp +use_extended_names +use_legacy_coding +use_legacy_coding_sp +use_screen +use_tioctl +use_tioctl_sp +use_window +vid_attr +vid_attr_sp +vid_puts +vid_puts_sp +vidattr +vidattr_sp +vidputs +vidputs_sp +vline +vline_set +vw_printw +vw_scanw +vwprintw +vwscanw +wadd_wch +wadd_wchnstr +wadd_wchstr +waddch +waddchnstr +waddchstr +waddnstr +waddnwstr +waddstr +waddwstr +wattr_get +wattr_off +wattr_on +wattr_set +wattroff +wattron +wattrset +wbkgd +wbkgdset +wbkgrnd +wbkgrndset +wborder +wborder_set +wchgat +wclear +wclrtobot +wclrtoeol +wcolor_set +wcursyncup +wdelch +wdeleteln +wecho_wchar +wechochar +wenclose +werase +wget_wch +wget_wstr +wgetbkgrnd +wgetch +wgetch_events +wgetdelay +wgetn_wstr +wgetnstr +wgetnstr_events +wgetparent +wgetscrreg +wgetstr +whline +whline_set +win_wch +win_wchnstr +win_wchstr +winch +winchnstr +winchstr +winnstr +winnwstr +wins_nwstr +wins_wch +wins_wstr +winsch +winsdelln +winsertln +winsnstr +winsstr +winstr +winwstr +wmouse_trafo +wmove +wnoutrefresh +wprintw +wredrawln +wrefresh +wresize +wscanw +wscrl +wsetscrreg +wstandend +wstandout +wsyncdown +wsyncup +wtimeout +wtouchln +wunctrl +wunctrl_sp +wvline +wvline_set diff --git a/contrib/ncurses/panel/Makefile.in b/contrib/ncurses/panel/Makefile.in new file mode 100644 index 00000000..8516611d --- /dev/null +++ b/contrib/ncurses/panel/Makefile.in @@ -0,0 +1,208 @@ +# $Id: Makefile.in,v 1.77 2024/08/10 18:19:45 tom Exp $ +############################################################################## +# Copyright 2020-2021,2024 Thomas E. Dickey # +# Copyright 1998-2015,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for panels source code. +# +# This makes the following: +# libraries (normal/debug/profile/shared) +# +# The variable 'srcdir' refers to the source-distribution, and can be set with +# the configure script by "--srcdir=DIR". +# +# The rules are organized to produce the libraries for the configured models, + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ +THIS = Makefile + +x = @EXEEXT@ +o = .@OBJEXT@ + +MODEL = @DFT_LWR_MODEL@ +DESTDIR = @DESTDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +datarootdir = @datarootdir@ +datadir = @datadir@ +includesubdir = @includesubdir@ + +INCLUDEDIR = $(DESTDIR)$(includedir@MERGE_PREFIX@)$(includesubdir) +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) + +PACKAGE = @PACKAGE@ + +LIBTOOL = @LIBTOOL@ +LIBTOOL_OPTS = @LIBTOOL_OPTS@ @EXPORT_SYMS@ +LIBTOOL_CLEAN = @LIB_CLEAN@ +LIBTOOL_COMPILE = @LIB_COMPILE@ +LIBTOOL_LINK = @LIB_LINK@ +LIBTOOL_INSTALL = @LIB_INSTALL@ +LIBTOOL_UNINSTALL = @LIB_UNINSTALL@ +LT_UNDEF = @LT_UNDEF@ + +INSTALL = @INSTALL@ +INSTALL_LIB = @INSTALL@ @INSTALL_LIB@ +INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ +INSTALL_DATA = @INSTALL_DATA@ + +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AWK = @AWK@ +LD = @LD@ +LN_S = @LN_S@ + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +CC = @CC@ +CPP = @CPP@ +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ + +INCDIR = $(top_srcdir)/include +BASE_DIR = $(top_srcdir)/ncurses +CPPFLAGS = -I$(BASE_DIR) -DHAVE_CONFIG_H -DBUILDING_PANEL @CPPFLAGS@ + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +CFLAGS_LIBTOOL = $(CCFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +LINK = $(LIBTOOL_LINK) +LDFLAGS = @LDFLAGS@ @LD_MODEL@ @LIBS@ + +SHLIB_DIRS = -L../lib +SHLIB_LIST = $(SHLIB_DIRS) -lncurses@USE_LIB_SUFFIX@ @SHLIB_LIST@ + +RPATH_LIST = @RPATH_LIST@ +RESULTING_SYMS = @RESULTING_SYMS@ +VERSIONED_SYMS = @VERSIONED_SYMS@ +MK_SHARED_LIB = @MK_SHARED_LIB@ + +NCURSES_MAJOR = @NCURSES_MAJOR@ +NCURSES_MINOR = @NCURSES_MINOR@ +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ + +RANLIB = @LIB_PREP@ + +LIBRARIES = @Libs_To_Make@ + +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ +LINT_LIBS = -lpanel -lncurses @LIBS@ + +AUTO_SRC = \ + ../include/panel.h + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : clean +@MAKE_PHONY@.PHONY : distclean +@MAKE_PHONY@.PHONY : install +@MAKE_PHONY@.PHONY : install.libs +@MAKE_PHONY@.PHONY : libs +@MAKE_PHONY@.PHONY : mostlyclean +@MAKE_PHONY@.PHONY : realclean +@MAKE_PHONY@.PHONY : sources +@MAKE_PHONY@.PHONY : uninstall +@MAKE_PHONY@.PHONY : uninstall.libs + +all \ +libs \ +install :: $(AUTO_SRC) $(LIBRARIES) + +sources: $(AUTO_SRC) + +$(BINDIR) \ +$(LIBDIR) : + mkdir -p $@ + +# make a copy to simplify include-paths while still keeping panel's include +# file in this directory. +../include/panel.h : $(srcdir)/panel.h + -rm -f $@ + cp $(srcdir)/panel.h $@ + +HEADER_DEPS = \ + ../include/curses.h \ + ../include/ncurses_cfg.h \ + ../include/ncurses_def.h \ + ../include/ncurses_dll.h \ + ../include/term.h \ + ../include/unctrl.h \ + $(BASE_DIR)/curses.priv.h \ + $(BASE_DIR)/new_pair.h \ + $(INCDIR)/nc_alloc.h \ + $(INCDIR)/nc_panel.h \ + $(INCDIR)/nc_string.h \ + $(INCDIR)/nc_termios.h \ + $(INCDIR)/nc_tparm.h \ + $(INCDIR)/term_entry.h \ + $(srcdir)/panel.priv.h \ + $(srcdir)/panel.h + +tags: + $(CTAGS) *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + +clean :: mostlyclean + -rm -f $(AUTO_SRC) + -rm -rf .libs *.dSYM + +distclean :: clean + -rm -f Makefile + +realclean :: distclean + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/panel/headers b/contrib/ncurses/panel/headers new file mode 100644 index 00000000..b598d139 --- /dev/null +++ b/contrib/ncurses/panel/headers @@ -0,0 +1,33 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996 +# +$(srcdir)/panel.h +# vile:makemode diff --git a/contrib/ncurses/panel/llib-lpanel b/contrib/ncurses/panel/llib-lpanel new file mode 100644 index 00000000..afdea20c --- /dev/null +++ b/contrib/ncurses/panel/llib-lpanel @@ -0,0 +1,199 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./panel.c */ + +#include + +#undef _nc_retrace_panel +PANEL *_nc_retrace_panel( + PANEL *pan) + { return(*(PANEL **)0); } + +#undef _nc_my_visbuf +const char *_nc_my_visbuf( + const void *ptr, + int n) + { return(*(const char **)0); } + +#undef _nc_dPanel +void _nc_dPanel( + const char *text, + const PANEL *pan) + { /* void */ } + +#undef _nc_dStack +void _nc_dStack( + const char *fmt, + int num, + const PANEL *pan) + { /* void */ } + +#undef _nc_Wnoutrefresh +void _nc_Wnoutrefresh( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchpan +void _nc_Touchpan( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchline +void _nc_Touchline( + const PANEL *pan, + int start, + int count) + { /* void */ } + +/* ./p_above.c */ + +#undef ground_panel +PANEL *ground_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_above +PANEL *panel_above( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_below.c */ + +#undef ceiling_panel +PANEL *ceiling_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_below +PANEL *panel_below( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_bottom.c */ + +#undef bottom_panel +int bottom_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_delete.c */ + +#undef del_panel +int del_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hide.c */ + +#undef hide_panel +int hide_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hidden.c */ + +#undef panel_hidden +int panel_hidden( + const PANEL *pan) + { return(*(int *)0); } + +/* ./p_move.c */ + +#undef move_panel +int move_panel( + PANEL *pan, + int starty, + int startx) + { return(*(int *)0); } + +/* ./p_new.c */ + +#undef new_panel +PANEL *new_panel( + WINDOW *win) + { return(*(PANEL **)0); } + +/* ./p_replace.c */ + +#undef replace_panel +int replace_panel( + PANEL *pan, + WINDOW *win) + { return(*(int *)0); } + +/* ./p_show.c */ + +#undef show_panel +int show_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_top.c */ + +#undef top_panel +int top_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_update.c */ + +#undef update_panels_sp +void update_panels_sp( + SCREEN *sp) + { /* void */ } + +#undef update_panels +void update_panels(void) + { /* void */ } + +/* ./p_user.c */ + +#undef set_panel_userptr +int set_panel_userptr( + PANEL *pan, + const void *uptr) + { return(*(int *)0); } + +#undef panel_userptr +const void *panel_userptr( + const PANEL *pan) + { return(*(const void **)0); } + +/* ./p_win.c */ + +#undef panel_window +WINDOW *panel_window( + const PANEL *pan) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/panel/llib-lpanelt b/contrib/ncurses/panel/llib-lpanelt new file mode 100644 index 00000000..0b996832 --- /dev/null +++ b/contrib/ncurses/panel/llib-lpanelt @@ -0,0 +1,199 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./panel.c */ + +#include + +#undef _nc_retrace_panel +PANEL *_nc_retrace_panel( + PANEL *pan) + { return(*(PANEL **)0); } + +#undef _nc_my_visbuf +const char *_nc_my_visbuf( + const void *ptr, + int n) + { return(*(const char **)0); } + +#undef _nc_dPanel +void _nc_dPanel( + const char *text, + const PANEL *pan) + { /* void */ } + +#undef _nc_dStack +void _nc_dStack( + const char *fmt, + int num, + const PANEL *pan) + { /* void */ } + +#undef _nc_Wnoutrefresh +void _nc_Wnoutrefresh( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchpan +void _nc_Touchpan( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchline +void _nc_Touchline( + const PANEL *pan, + int start, + int count) + { /* void */ } + +/* ./p_above.c */ + +#undef ground_panel +PANEL *ground_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_above +PANEL *panel_above( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_below.c */ + +#undef ceiling_panel +PANEL *ceiling_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_below +PANEL *panel_below( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_bottom.c */ + +#undef bottom_panel +int bottom_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_delete.c */ + +#undef del_panel +int del_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hide.c */ + +#undef hide_panel +int hide_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hidden.c */ + +#undef panel_hidden +int panel_hidden( + const PANEL *pan) + { return(*(int *)0); } + +/* ./p_move.c */ + +#undef move_panel +int move_panel( + PANEL *pan, + int starty, + int startx) + { return(*(int *)0); } + +/* ./p_new.c */ + +#undef new_panel +PANEL *new_panel( + WINDOW *win) + { return(*(PANEL **)0); } + +/* ./p_replace.c */ + +#undef replace_panel +int replace_panel( + PANEL *pan, + WINDOW *win) + { return(*(int *)0); } + +/* ./p_show.c */ + +#undef show_panel +int show_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_top.c */ + +#undef top_panel +int top_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_update.c */ + +#undef update_panels_sp +void update_panels_sp( + SCREEN *sp) + { /* void */ } + +#undef update_panels +void update_panels(void) + { /* void */ } + +/* ./p_user.c */ + +#undef set_panel_userptr +int set_panel_userptr( + PANEL *pan, + const void *uptr) + { return(*(int *)0); } + +#undef panel_userptr +const void *panel_userptr( + const PANEL *pan) + { return(*(const void **)0); } + +/* ./p_win.c */ + +#undef panel_window +WINDOW *panel_window( + const PANEL *pan) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/panel/llib-lpaneltw b/contrib/ncurses/panel/llib-lpaneltw new file mode 100644 index 00000000..0b996832 --- /dev/null +++ b/contrib/ncurses/panel/llib-lpaneltw @@ -0,0 +1,199 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2010-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./panel.c */ + +#include + +#undef _nc_retrace_panel +PANEL *_nc_retrace_panel( + PANEL *pan) + { return(*(PANEL **)0); } + +#undef _nc_my_visbuf +const char *_nc_my_visbuf( + const void *ptr, + int n) + { return(*(const char **)0); } + +#undef _nc_dPanel +void _nc_dPanel( + const char *text, + const PANEL *pan) + { /* void */ } + +#undef _nc_dStack +void _nc_dStack( + const char *fmt, + int num, + const PANEL *pan) + { /* void */ } + +#undef _nc_Wnoutrefresh +void _nc_Wnoutrefresh( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchpan +void _nc_Touchpan( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchline +void _nc_Touchline( + const PANEL *pan, + int start, + int count) + { /* void */ } + +/* ./p_above.c */ + +#undef ground_panel +PANEL *ground_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_above +PANEL *panel_above( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_below.c */ + +#undef ceiling_panel +PANEL *ceiling_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_below +PANEL *panel_below( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_bottom.c */ + +#undef bottom_panel +int bottom_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_delete.c */ + +#undef del_panel +int del_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hide.c */ + +#undef hide_panel +int hide_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hidden.c */ + +#undef panel_hidden +int panel_hidden( + const PANEL *pan) + { return(*(int *)0); } + +/* ./p_move.c */ + +#undef move_panel +int move_panel( + PANEL *pan, + int starty, + int startx) + { return(*(int *)0); } + +/* ./p_new.c */ + +#undef new_panel +PANEL *new_panel( + WINDOW *win) + { return(*(PANEL **)0); } + +/* ./p_replace.c */ + +#undef replace_panel +int replace_panel( + PANEL *pan, + WINDOW *win) + { return(*(int *)0); } + +/* ./p_show.c */ + +#undef show_panel +int show_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_top.c */ + +#undef top_panel +int top_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_update.c */ + +#undef update_panels_sp +void update_panels_sp( + SCREEN *sp) + { /* void */ } + +#undef update_panels +void update_panels(void) + { /* void */ } + +/* ./p_user.c */ + +#undef set_panel_userptr +int set_panel_userptr( + PANEL *pan, + const void *uptr) + { return(*(int *)0); } + +#undef panel_userptr +const void *panel_userptr( + const PANEL *pan) + { return(*(const void **)0); } + +/* ./p_win.c */ + +#undef panel_window +WINDOW *panel_window( + const PANEL *pan) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/panel/llib-lpanelw b/contrib/ncurses/panel/llib-lpanelw new file mode 100644 index 00000000..7ed8b3c3 --- /dev/null +++ b/contrib/ncurses/panel/llib-lpanelw @@ -0,0 +1,199 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2002-2010,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2002-on * + ****************************************************************************/ +/* LINTLIBRARY */ + +/* ./panel.c */ + +#include + +#undef _nc_retrace_panel +PANEL *_nc_retrace_panel( + PANEL *pan) + { return(*(PANEL **)0); } + +#undef _nc_my_visbuf +const char *_nc_my_visbuf( + const void *ptr, + int n) + { return(*(const char **)0); } + +#undef _nc_dPanel +void _nc_dPanel( + const char *text, + const PANEL *pan) + { /* void */ } + +#undef _nc_dStack +void _nc_dStack( + const char *fmt, + int num, + const PANEL *pan) + { /* void */ } + +#undef _nc_Wnoutrefresh +void _nc_Wnoutrefresh( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchpan +void _nc_Touchpan( + const PANEL *pan) + { /* void */ } + +#undef _nc_Touchline +void _nc_Touchline( + const PANEL *pan, + int start, + int count) + { /* void */ } + +/* ./p_above.c */ + +#undef ground_panel +PANEL *ground_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_above +PANEL *panel_above( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_below.c */ + +#undef ceiling_panel +PANEL *ceiling_panel( + SCREEN *sp) + { return(*(PANEL **)0); } + +#undef panel_below +PANEL *panel_below( + const PANEL *pan) + { return(*(PANEL **)0); } + +/* ./p_bottom.c */ + +#undef bottom_panel +int bottom_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_delete.c */ + +#undef del_panel +int del_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hide.c */ + +#undef hide_panel +int hide_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_hidden.c */ + +#undef panel_hidden +int panel_hidden( + const PANEL *pan) + { return(*(int *)0); } + +/* ./p_move.c */ + +#undef move_panel +int move_panel( + PANEL *pan, + int starty, + int startx) + { return(*(int *)0); } + +/* ./p_new.c */ + +#undef new_panel +PANEL *new_panel( + WINDOW *win) + { return(*(PANEL **)0); } + +/* ./p_replace.c */ + +#undef replace_panel +int replace_panel( + PANEL *pan, + WINDOW *win) + { return(*(int *)0); } + +/* ./p_show.c */ + +#undef show_panel +int show_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_top.c */ + +#undef top_panel +int top_panel( + PANEL *pan) + { return(*(int *)0); } + +/* ./p_update.c */ + +#undef update_panels_sp +void update_panels_sp( + SCREEN *sp) + { /* void */ } + +#undef update_panels +void update_panels(void) + { /* void */ } + +/* ./p_user.c */ + +#undef set_panel_userptr +int set_panel_userptr( + PANEL *pan, + const void *uptr) + { return(*(int *)0); } + +#undef panel_userptr +const void *panel_userptr( + const PANEL *pan) + { return(*(const void **)0); } + +/* ./p_win.c */ + +#undef panel_window +WINDOW *panel_window( + const PANEL *pan) + { return(*(WINDOW **)0); } diff --git a/contrib/ncurses/panel/modules b/contrib/ncurses/panel/modules new file mode 100644 index 00000000..4b0c9d88 --- /dev/null +++ b/contrib/ncurses/panel/modules @@ -0,0 +1,52 @@ +# $Id: modules,v 1.11 2020/02/02 23:34:34 tom Exp $ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998-2006,2010 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1995-on +# + +@ base +# Library objects +panel lib $(srcdir) $(HEADER_DEPS) +p_above lib $(srcdir) $(HEADER_DEPS) +p_below lib $(srcdir) $(HEADER_DEPS) +p_bottom lib $(srcdir) $(HEADER_DEPS) +p_delete lib $(srcdir) $(HEADER_DEPS) +p_hide lib $(srcdir) $(HEADER_DEPS) +p_hidden lib $(srcdir) $(HEADER_DEPS) +p_move lib $(srcdir) $(HEADER_DEPS) +p_new lib $(srcdir) $(HEADER_DEPS) +p_replace lib $(srcdir) $(HEADER_DEPS) +p_show lib $(srcdir) $(HEADER_DEPS) +p_top lib $(srcdir) $(HEADER_DEPS) +p_update lib $(srcdir) $(HEADER_DEPS) +p_user lib $(srcdir) $(HEADER_DEPS) +p_win lib $(srcdir) $(HEADER_DEPS) + +# vile:makemode diff --git a/contrib/ncurses/panel/p_above.c b/contrib/ncurses/panel/p_above.c new file mode 100644 index 00000000..2a6fde55 --- /dev/null +++ b/contrib/ncurses/panel/p_above.c @@ -0,0 +1,85 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999,2008 * + ****************************************************************************/ + +/* p_above.c + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_above.c,v 1.11 2020/05/24 01:40:20 anonymous.maarten Exp $") + +#if NCURSES_SP_FUNCS +PANEL_EXPORT(PANEL *) +ground_panel(SCREEN * sp) +{ + T((T_CALLED("ground_panel(%p)"), (void *)sp)); + if (sp) + { + struct panelhook *ph = NCURSES_SP_NAME(_nc_panelhook) (sp); + + if (_nc_bottom_panel) /* this is the pseudo panel */ + returnPanel(_nc_bottom_panel->above); + else + returnPanel(0); + } + else + { + if (0 == CURRENT_SCREEN) + returnPanel(0); + else + returnPanel(ground_panel(CURRENT_SCREEN)); + } +} +#endif + +PANEL_EXPORT(PANEL *) +panel_above(const PANEL * pan) +{ + PANEL *result; + + T((T_CALLED("panel_above(%p)"), (const void *)pan)); + if (pan) + result = pan->above; + else + { +#if NCURSES_SP_FUNCS + result = ground_panel(CURRENT_SCREEN); +#else + /* if top and bottom are equal, we have no or only the pseudo panel; + if not, we return the panel above the pseudo panel */ + result = EMPTY_STACK()? (PANEL *) 0 : _nc_bottom_panel->above; +#endif + } + returnPanel(result); +} diff --git a/contrib/ncurses/panel/p_below.c b/contrib/ncurses/panel/p_below.c new file mode 100644 index 00000000..100393d5 --- /dev/null +++ b/contrib/ncurses/panel/p_below.c @@ -0,0 +1,86 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999,2008 * + ****************************************************************************/ + +/* p_below.c + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_below.c,v 1.11 2020/05/24 01:40:20 anonymous.maarten Exp $") + +#if NCURSES_SP_FUNCS +PANEL_EXPORT(PANEL *) +ceiling_panel(SCREEN * sp) +{ + T((T_CALLED("ceiling_panel(%p)"), (void *)sp)); + if (sp) + { + struct panelhook *ph = NCURSES_SP_NAME(_nc_panelhook) (sp); + + /* if top and bottom are equal, we have no or only the pseudo panel */ + returnPanel(EMPTY_STACK()? (PANEL *) 0 : _nc_top_panel); + } + else + { + if (0 == CURRENT_SCREEN) + returnPanel(0); + else + returnPanel(ceiling_panel(CURRENT_SCREEN)); + } +} +#endif + +PANEL_EXPORT(PANEL *) +panel_below(const PANEL * pan) +{ + PANEL *result; + + T((T_CALLED("panel_below(%p)"), (const void *)pan)); + if (pan) + { + GetHook(pan); + /* we must not return the pseudo panel */ + result = Is_Pseudo(pan->below) ? (PANEL *) 0 : pan->below; + } + else + { +#if NCURSES_SP_FUNCS + result = ceiling_panel(CURRENT_SCREEN); +#else + /* if top and bottom are equal, we have no or only the pseudo panel */ + result = EMPTY_STACK()? (PANEL *) 0 : _nc_top_panel; +#endif + } + returnPanel(result); +} diff --git a/contrib/ncurses/panel/p_bottom.c b/contrib/ncurses/panel/p_bottom.c new file mode 100644 index 00000000..3ca9c77e --- /dev/null +++ b/contrib/ncurses/panel/p_bottom.c @@ -0,0 +1,75 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2008,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999,2008 * + ****************************************************************************/ + +/* p_bottom.c + * Place a panel on bottom of the stack; may already be in the stack + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_bottom.c,v 1.17 2021/06/17 21:20:30 tom Exp $") + +PANEL_EXPORT(int) +bottom_panel(PANEL * pan) +{ + int err = OK; + + T((T_CALLED("bottom_panel(%p)"), (void *)pan)); + if (pan) + { + GetHook(pan); + if (!Is_Bottom(pan)) + { + + dBug(("--> bottom_panel %s", USER_PTR(pan->user, 1))); + + HIDE_PANEL(pan, err, OK); + assert(_nc_bottom_panel == _nc_stdscr_pseudo_panel); + + dStack("", 1, pan); + + pan->below = _nc_bottom_panel; + pan->above = _nc_bottom_panel->above; + if (pan->above) + pan->above->below = pan; + _nc_bottom_panel->above = pan; + + dStack("", 9, pan); + } + } + else + err = ERR; + + returnCode(err); +} diff --git a/contrib/ncurses/panel/p_delete.c b/contrib/ncurses/panel/p_delete.c new file mode 100644 index 00000000..da3dcdf9 --- /dev/null +++ b/contrib/ncurses/panel/p_delete.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1999,2008 * + ****************************************************************************/ + +/* p_delete.c + * Remove a panel from stack, if in it, and free struct + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_delete.c,v 1.17 2020/12/26 18:25:34 tom Exp $") + +PANEL_EXPORT(int) +del_panel(PANEL *pan) +{ + int err = OK; + + T((T_CALLED("del_panel(%p)"), (void *)pan)); + if (pan) + { + GetHook(pan); + HIDE_PANEL(pan, err, OK); + dBug(("...discard ptr=%s", USER_PTR(pan->user, 1))); + dBug(("...deleted pan=%p", (void *)pan)); + free((void *)pan); + } + else + err = ERR; + + returnCode(err); +} diff --git a/contrib/ncurses/panel/p_hidden.c b/contrib/ncurses/panel/p_hidden.c new file mode 100644 index 00000000..43057fa5 --- /dev/null +++ b/contrib/ncurses/panel/p_hidden.c @@ -0,0 +1,55 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999,2008 * + ****************************************************************************/ + +/* p_hidden.c + * Test whether or not panel is hidden + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_hidden.c,v 1.11 2020/05/24 01:40:20 anonymous.maarten Exp $") + +PANEL_EXPORT(int) +panel_hidden(const PANEL * pan) +{ + int rc = ERR; + + T((T_CALLED("panel_hidden(%p)"), (const void *)pan)); + if (pan) + { + GetHook(pan); + rc = (IS_LINKED(pan) ? FALSE : TRUE); + } + returnCode(rc); +} diff --git a/contrib/ncurses/panel/p_hide.c b/contrib/ncurses/panel/p_hide.c new file mode 100644 index 00000000..6a372ace --- /dev/null +++ b/contrib/ncurses/panel/p_hide.c @@ -0,0 +1,63 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* p_hide.c + * Remove a panel from the stack + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_hide.c,v 1.14 2020/09/26 18:02:35 tom Exp $") + +PANEL_EXPORT(int) +hide_panel(register PANEL * pan) +{ + int err = ERR; + + T((T_CALLED("hide_panel(%p)"), (void *)pan)); + + if (pan) + { + GetHook(pan); + + dBug(("--> hide_panel %s", USER_PTR(pan->user, 1))); + dStack("", 1, pan); + + HIDE_PANEL(pan, err, ERR); + + err = OK; + + dStack("", 9, pan); + } + returnCode(err); +} diff --git a/contrib/ncurses/panel/p_move.c b/contrib/ncurses/panel/p_move.c new file mode 100644 index 00000000..7ff6fa7e --- /dev/null +++ b/contrib/ncurses/panel/p_move.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2008,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999,2009 * + ****************************************************************************/ + +/* p_move.c + * Move a panel to a new location + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_move.c,v 1.13 2020/05/24 01:40:20 anonymous.maarten Exp $") + +PANEL_EXPORT(int) +move_panel(PANEL * pan, int starty, int startx) +{ + int rc = ERR; + + T((T_CALLED("move_panel(%p,%d,%d)"), (void *)pan, starty, startx)); + + if (pan) + { + GetHook(pan); + if (IS_LINKED(pan)) + { + Touchpan(pan); + PANEL_UPDATE(pan, (PANEL *) 0); + } + rc = mvwin(pan->win, starty, startx); + } + returnCode(rc); +} diff --git a/contrib/ncurses/panel/p_new.c b/contrib/ncurses/panel/p_new.c new file mode 100644 index 00000000..cf116403 --- /dev/null +++ b/contrib/ncurses/panel/p_new.c @@ -0,0 +1,129 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999 * + * and: Thomas E. Dickey 2000-on * + ****************************************************************************/ + +/* p_new.c + * Creation of a new panel + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_new.c,v 1.24 2021/10/23 15:12:06 tom Exp $") + +#ifdef TRACE +static char *stdscr_id; +static char *new_id; + +static PANEL * +AllocPanel(const char *name) +{ + PANEL *result = typeMalloc(PANEL, 1); + + _tracef("create :%s %p", name, (void *)result); + return result; +} +#define InitUser(name) \ + if (!name ## _id) \ + name ## _id = strdup(#name); \ + pan->user = name ## _id; \ + _tracef("create :user_ptr %p", pan->user) +#else +#define AllocPanel(name) typeMalloc(PANEL, 1) +#define InitUser(name) \ + pan->user = (void *)0 +#endif + +/*+------------------------------------------------------------------------- + Get root (i.e. stdscr's) panel. + Establish the pseudo panel for stdscr if necessary. +--------------------------------------------------------------------------*/ +static PANEL * +root_panel(NCURSES_SP_DCL0) +{ +#if NCURSES_SP_FUNCS + struct panelhook *ph = NCURSES_SP_NAME(_nc_panelhook) (sp); + +#elif NO_LEAKS + struct panelhook *ph = _nc_panelhook(); +#endif + + if (_nc_stdscr_pseudo_panel == (PANEL *)0) + { + + assert(SP_PARM && SP_PARM->_stdscr && !_nc_bottom_panel && !_nc_top_panel); +#if NO_LEAKS + ph->destroy = del_panel; +#endif + _nc_stdscr_pseudo_panel = AllocPanel("root_panel"); + if (_nc_stdscr_pseudo_panel != 0) + { + PANEL *pan = _nc_stdscr_pseudo_panel; + WINDOW *win = SP_PARM->_stdscr; + + pan->win = win; + pan->below = (PANEL *)0; + pan->above = (PANEL *)0; + InitUser(stdscr); + _nc_bottom_panel = _nc_top_panel = pan; + } + } + return _nc_stdscr_pseudo_panel; +} + +PANEL_EXPORT(PANEL *) +new_panel(WINDOW *win) +{ + PANEL *pan = (PANEL *)0; + + GetWindowHook(win); + + T((T_CALLED("new_panel(%p)"), (void *)win)); + + if (!win) + returnPanel(pan); + + if (!_nc_stdscr_pseudo_panel) + (void)root_panel(NCURSES_SP_ARG); + assert(_nc_stdscr_pseudo_panel); + + if ((pan = AllocPanel("new_panel")) != NULL) + { + pan->win = win; + pan->above = (PANEL *)0; + pan->below = (PANEL *)0; + InitUser(new); + (void)show_panel(pan); + } + returnPanel(pan); +} diff --git a/contrib/ncurses/panel/p_replace.c b/contrib/ncurses/panel/p_replace.c new file mode 100644 index 00000000..a2d56ae6 --- /dev/null +++ b/contrib/ncurses/panel/p_replace.c @@ -0,0 +1,61 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* p_replace.c + * Replace a panels window. + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_replace.c,v 1.13 2020/05/24 01:40:20 anonymous.maarten Exp $") + +PANEL_EXPORT(int) +replace_panel(PANEL * pan, WINDOW *win) +{ + int rc = ERR; + + T((T_CALLED("replace_panel(%p,%p)"), (void *)pan, (void *)win)); + + if (pan) + { + GetHook(pan); + if (IS_LINKED(pan)) + { + Touchpan(pan); + PANEL_UPDATE(pan, (PANEL *) 0); + } + pan->win = win; + rc = OK; + } + returnCode(rc); +} diff --git a/contrib/ncurses/panel/p_show.c b/contrib/ncurses/panel/p_show.c new file mode 100644 index 00000000..3503bec1 --- /dev/null +++ b/contrib/ncurses/panel/p_show.c @@ -0,0 +1,73 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* p_show.c + * Place a panel on top of the stack; may already be in the stack + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_show.c,v 1.17 2021/06/17 21:20:30 tom Exp $") + +PANEL_EXPORT(int) +show_panel(PANEL * pan) +{ + int err = ERR; + + T((T_CALLED("show_panel(%p)"), (void *)pan)); + + if (pan) + { + GetHook(pan); + + if (Is_Top(pan)) + returnCode(OK); + + dBug(("--> show_panel %s", USER_PTR(pan->user, 1))); + + HIDE_PANEL(pan, err, OK); + + dStack("", 1, pan); + assert(_nc_bottom_panel == _nc_stdscr_pseudo_panel); + + _nc_top_panel->above = pan; + pan->below = _nc_top_panel; + pan->above = (PANEL *) 0; + _nc_top_panel = pan; + + err = OK; + + dStack("", 9, pan); + } + returnCode(err); +} diff --git a/contrib/ncurses/panel/p_top.c b/contrib/ncurses/panel/p_top.c new file mode 100644 index 00000000..17abd768 --- /dev/null +++ b/contrib/ncurses/panel/p_top.c @@ -0,0 +1,47 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2005,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* p_top.c + * Place a panel on top of the stack. + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_top.c,v 1.8 2020/05/24 01:40:20 anonymous.maarten Exp $") + +PANEL_EXPORT(int) +top_panel(PANEL * pan) +{ + T((T_CALLED("top_panel(%p)"), (void *)pan)); + returnCode(show_panel(pan)); +} diff --git a/contrib/ncurses/panel/p_update.c b/contrib/ncurses/panel/p_update.c new file mode 100644 index 00000000..40212965 --- /dev/null +++ b/contrib/ncurses/panel/p_update.c @@ -0,0 +1,79 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1997-1999,2008 * + ****************************************************************************/ + +/* p_update.c + * wnoutrefresh windows in an orderly fashion + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_update.c,v 1.13 2020/05/24 01:40:20 anonymous.maarten Exp $") + +PANEL_EXPORT(void) +NCURSES_SP_NAME(update_panels) (NCURSES_SP_DCL0) +{ + PANEL *pan; + + T((T_CALLED("update_panels(%p)"), (void *)SP_PARM)); + dBug(("--> update_panels")); + + if (SP_PARM) + { + GetScreenHook(SP_PARM); + + pan = _nc_bottom_panel; + while (pan && pan->above) + { + PANEL_UPDATE(pan, pan->above); + pan = pan->above; + } + + pan = _nc_bottom_panel; + while (pan) + { + Wnoutrefresh(pan); + pan = pan->above; + } + } + + returnVoid; +} + +#if NCURSES_SP_FUNCS +PANEL_EXPORT(void) +update_panels(void) +{ + NCURSES_SP_NAME(update_panels) (CURRENT_SCREEN); +} +#endif diff --git a/contrib/ncurses/panel/p_user.c b/contrib/ncurses/panel/p_user.c new file mode 100644 index 00000000..8d650979 --- /dev/null +++ b/contrib/ncurses/panel/p_user.c @@ -0,0 +1,57 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 1998-2005,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* p_user.c + * Set/Get panels user pointer + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_user.c,v 1.11 2021/06/17 21:20:30 tom Exp $") + +PANEL_EXPORT(int) +set_panel_userptr(PANEL * pan, NCURSES_CONST void *uptr) +{ + T((T_CALLED("set_panel_userptr(%p,%p)"), (void *)pan, (NCURSES_CONST void *)uptr)); + if (!pan) + returnCode(ERR); + pan->user = uptr; + returnCode(OK); +} + +PANEL_EXPORT(NCURSES_CONST void *) +panel_userptr(const PANEL * pan) +{ + T((T_CALLED("panel_userptr(%p)"), (const void *)pan)); + returnCVoidPtr(pan ? pan->user : (NCURSES_CONST void *)0); +} diff --git a/contrib/ncurses/panel/p_win.c b/contrib/ncurses/panel/p_win.c new file mode 100644 index 00000000..d1889885 --- /dev/null +++ b/contrib/ncurses/panel/p_win.c @@ -0,0 +1,47 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2005,2010 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + ****************************************************************************/ + +/* p_win.c + * Return a panels window. + */ +#include "panel.priv.h" + +MODULE_ID("$Id: p_win.c,v 1.8 2020/05/24 01:40:20 anonymous.maarten Exp $") + +PANEL_EXPORT(WINDOW *) +panel_window(const PANEL * pan) +{ + T((T_CALLED("panel_window(%p)"), (const void *)pan)); + returnWin(pan ? pan->win : (WINDOW *)0); +} diff --git a/contrib/ncurses/panel/panel.c b/contrib/ncurses/panel/panel.c new file mode 100644 index 00000000..1b2d6e83 --- /dev/null +++ b/contrib/ncurses/panel/panel.c @@ -0,0 +1,162 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1996-1999,2008 * + * and: Thomas E. Dickey * + ****************************************************************************/ + +/* panel.c -- implementation of panels library, some core routines */ +#include "panel.priv.h" + +MODULE_ID("$Id: panel.c,v 1.30 2020/09/26 18:05:17 tom Exp $") + +/*+------------------------------------------------------------------------- + _nc_retrace_panel (pan) +--------------------------------------------------------------------------*/ +#ifdef TRACE +PANEL_EXPORT(PANEL *) +_nc_retrace_panel(PANEL * pan) +{ + T((T_RETURN("%p"), (void *)pan)); + return pan; +} +#endif + +/*+------------------------------------------------------------------------- + _nc_my_visbuf(ptr) +--------------------------------------------------------------------------*/ +#ifdef TRACE +#ifndef TRACE_TXT +PANEL_EXPORT(const char *) +_nc_my_visbuf(const void *ptr, int n) +{ + char temp[32]; + + if (ptr != 0) + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%p", ptr); + else + _nc_STRCPY(temp, "", sizeof(temp)); + return _nc_visbuf2(n, temp); +} +#endif +#endif + +/*+------------------------------------------------------------------------- + dPanel(text,pan) +--------------------------------------------------------------------------*/ +#ifdef TRACE +PANEL_EXPORT(void) +_nc_dPanel(const char *text, const PANEL * pan) +{ + _tracef("%s id=%s b=%s a=%s y=%d x=%d", + text, USER_PTR(pan->user, 1), + (pan->below) ? USER_PTR(pan->below->user, 2) : "--", + (pan->above) ? USER_PTR(pan->above->user, 3) : "--", + PSTARTY(pan), PSTARTX(pan)); +} +#endif + +/*+------------------------------------------------------------------------- + dStack(fmt,num,pan) +--------------------------------------------------------------------------*/ +#ifdef TRACE +PANEL_EXPORT(void) +_nc_dStack(const char *fmt, int num, const PANEL * pan) +{ + char s80[80]; + + GetPanelHook(pan); + + _nc_SPRINTF(s80, _nc_SLIMIT(sizeof(s80)) fmt, num, pan); + _tracef("%s b=%s t=%s", s80, + (_nc_bottom_panel) ? USER_PTR(_nc_bottom_panel->user, 1) : "--", + (_nc_top_panel) ? USER_PTR(_nc_top_panel->user, 2) : "--"); + if (pan) + _tracef("pan id=%s", USER_PTR(pan->user, 1)); + pan = _nc_bottom_panel; + while (pan) + { + dPanel("stk", pan); + pan = pan->above; + } +} +#endif + +/*+------------------------------------------------------------------------- + Wnoutrefresh(pan) - debugging hook for wnoutrefresh +--------------------------------------------------------------------------*/ +#ifdef TRACE +PANEL_EXPORT(void) +_nc_Wnoutrefresh(const PANEL * pan) +{ + dPanel("wnoutrefresh", pan); + wnoutrefresh(pan->win); +} +#endif + +/*+------------------------------------------------------------------------- + Touchpan(pan) +--------------------------------------------------------------------------*/ +#ifdef TRACE +PANEL_EXPORT(void) +_nc_Touchpan(const PANEL * pan) +{ + dPanel("Touchpan", pan); + touchwin(pan->win); +} +#endif + +/*+------------------------------------------------------------------------- + Touchline(pan,start,count) +--------------------------------------------------------------------------*/ +#ifdef TRACE +PANEL_EXPORT(void) +_nc_Touchline(const PANEL * pan, int start, int count) +{ + char s80[80]; + + _nc_SPRINTF(s80, _nc_SLIMIT(sizeof(s80)) "Touchline s=%d c=%d", start, count); + dPanel(s80, pan); + touchline(pan->win, start, count); +} +#endif + +#ifndef TRACE +# ifndef __GNUC__ + /* Some C compilers need something defined in a source file */ +extern void _nc_dummy_panel(void); +void +_nc_dummy_panel(void) +{ +} +# endif +#endif diff --git a/contrib/ncurses/panel/panel.h b/contrib/ncurses/panel/panel.h new file mode 100644 index 00000000..62acc8ff --- /dev/null +++ b/contrib/ncurses/panel/panel.h @@ -0,0 +1,100 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2009,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1995 * + * and: Eric S. Raymond * + * and: Juergen Pfeifer 1996-1999,2008 * + ****************************************************************************/ + +/* $Id: panel.h,v 1.14 2020/07/04 20:38:43 tom Exp $ */ + +/* panel.h -- interface file for panels library */ + +#ifndef NCURSES_PANEL_H_incl +#define NCURSES_PANEL_H_incl 1 + +#include + +typedef struct panel +#if !NCURSES_OPAQUE_PANEL +{ + WINDOW *win; + struct panel *below; + struct panel *above; + NCURSES_CONST void *user; +} +#endif /* !NCURSES_OPAQUE_PANEL */ +PANEL; + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined(BUILDING_PANEL) +# define PANEL_IMPEXP NCURSES_EXPORT_GENERAL_EXPORT +#else +# define PANEL_IMPEXP NCURSES_EXPORT_GENERAL_IMPORT +#endif + +#define PANEL_WRAPPED_VAR(type,name) extern PANEL_IMPEXP type NCURSES_PUBLIC_VAR(name)(void) + +#define PANEL_EXPORT(type) PANEL_IMPEXP type NCURSES_API +#define PANEL_EXPORT_VAR(type) PANEL_IMPEXP type + +extern PANEL_EXPORT(WINDOW*) panel_window (const PANEL *); +extern PANEL_EXPORT(void) update_panels (void); +extern PANEL_EXPORT(int) hide_panel (PANEL *); +extern PANEL_EXPORT(int) show_panel (PANEL *); +extern PANEL_EXPORT(int) del_panel (PANEL *); +extern PANEL_EXPORT(int) top_panel (PANEL *); +extern PANEL_EXPORT(int) bottom_panel (PANEL *); +extern PANEL_EXPORT(PANEL*) new_panel (WINDOW *); +extern PANEL_EXPORT(PANEL*) panel_above (const PANEL *); +extern PANEL_EXPORT(PANEL*) panel_below (const PANEL *); +extern PANEL_EXPORT(int) set_panel_userptr (PANEL *, NCURSES_CONST void *); +extern PANEL_EXPORT(NCURSES_CONST void*) panel_userptr (const PANEL *); +extern PANEL_EXPORT(int) move_panel (PANEL *, int, int); +extern PANEL_EXPORT(int) replace_panel (PANEL *,WINDOW *); +extern PANEL_EXPORT(int) panel_hidden (const PANEL *); + +#if NCURSES_SP_FUNCS +extern PANEL_EXPORT(PANEL *) ground_panel(SCREEN *); +extern PANEL_EXPORT(PANEL *) ceiling_panel(SCREEN *); + +extern PANEL_EXPORT(void) NCURSES_SP_NAME(update_panels) (SCREEN*); +#endif + +#if defined(__cplusplus) +} +#endif + +#endif /* NCURSES_PANEL_H_incl */ + +/* end of panel.h */ diff --git a/contrib/ncurses/panel/panel.priv.h b/contrib/ncurses/panel/panel.priv.h new file mode 100644 index 00000000..029a4f33 --- /dev/null +++ b/contrib/ncurses/panel/panel.priv.h @@ -0,0 +1,212 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* $Id: panel.priv.h,v 1.30 2020/09/26 18:05:32 tom Exp $ */ + +#ifndef NCURSES_PANEL_PRIV_H +#define NCURSES_PANEL_PRIV_H 1 +/* *INDENT-OFF* */ + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +struct screen; /* forward declaration */ + +#include "curses.priv.h" /* includes nc_panel.h */ + +#define NCURSES_OPAQUE_PANEL 0 + +#include "panel.h" + +#ifdef TRACE + extern PANEL_EXPORT(const char *) _nc_my_visbuf (const void *, int); +# ifdef TRACE_TXT +# define USER_PTR(ptr,n) _nc_visbuf2(n, (const char *)ptr) +# else +# define USER_PTR(ptr,n) _nc_my_visbuf((const char *)ptr, n) +# endif + +# define returnPanel(code) TRACE_RETURN1(code,panel) + + extern PANEL_EXPORT(PANEL *) _nc_retrace_panel (PANEL *); + extern PANEL_EXPORT(void) _nc_dPanel (const char*, const PANEL*); + extern PANEL_EXPORT(void) _nc_dStack (const char*, int, const PANEL*); + extern PANEL_EXPORT(void) _nc_Wnoutrefresh (const PANEL*); + extern PANEL_EXPORT(void) _nc_Touchpan (const PANEL*); + extern PANEL_EXPORT(void) _nc_Touchline (const PANEL*, int, int); + +# define dBug(x) _tracef x +# define dPanel(text,pan) _nc_dPanel(text,pan) +# define dStack(fmt,num,pan) _nc_dStack(fmt,num,pan) +# define Wnoutrefresh(pan) _nc_Wnoutrefresh(pan) +# define Touchpan(pan) _nc_Touchpan(pan) +# define Touchline(pan,start,count) _nc_Touchline(pan,start,count) +#else /* !TRACE */ +# define returnPanel(code) return code +# define dBug(x) +# define dPanel(text,pan) +# define dStack(fmt,num,pan) +# define Wnoutrefresh(pan) wnoutrefresh((pan)->win) +# define Touchpan(pan) touchwin((pan)->win) +# define Touchline(pan,start,count) touchline((pan)->win,start,count) +#endif + +#if NCURSES_SP_FUNCS +#define GetScreenHook(sp) \ + struct panelhook* ph = NCURSES_SP_NAME(_nc_panelhook)(sp) +#define GetPanelHook(pan) \ + GetScreenHook(pan ? _nc_screen_of((pan)->win) : 0) +#define GetWindowHook(win) \ + SCREEN* sp = _nc_screen_of(win); \ + GetScreenHook(sp) +#define GetHook(pan) SCREEN* sp = _nc_screen_of(pan->win); \ + GetScreenHook(sp) + +#define _nc_stdscr_pseudo_panel ((ph)->stdscr_pseudo_panel) +#define _nc_top_panel ((ph)->top_panel) +#define _nc_bottom_panel ((ph)->bottom_panel) + +#else /* !NCURSES_SP_FUNCS */ + +#define GetScreenHook(sp) /* nothing */ +#define GetPanelHook(pan) /* nothing */ +#define GetWindowHook(win) /* nothing */ +#define GetHook(pan) /* nothing */ + +#define _nc_stdscr_pseudo_panel _nc_panelhook()->stdscr_pseudo_panel +#define _nc_top_panel _nc_panelhook()->top_panel +#define _nc_bottom_panel _nc_panelhook()->bottom_panel + +#endif /* NCURSES_SP_FUNCS */ + +#define EMPTY_STACK() (_nc_top_panel == _nc_bottom_panel) +#define Is_Bottom(p) (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_bottom_panel->above == (p))) +#define Is_Top(p) (((p) != (PANEL*)0) && !EMPTY_STACK() && (_nc_top_panel == (p))) +#define Is_Pseudo(p) (((p) != (PANEL*)0) && ((p) == _nc_bottom_panel)) + +/*+------------------------------------------------------------------------- + IS_LINKED(pan) - check to see if panel is in the stack +--------------------------------------------------------------------------*/ +/* This works! The only case where it would fail is, when the list has + only one element. But this could only be the pseudo panel at the bottom */ +#define IS_LINKED(p) (((p)->above || (p)->below ||((p)==_nc_bottom_panel)) ? TRUE : FALSE) + +#define PSTARTX(pan) ((pan)->win->_begx) +#define PENDX(pan) ((pan)->win->_begx + getmaxx((pan)->win) - 1) +#define PSTARTY(pan) ((pan)->win->_begy) +#define PENDY(pan) ((pan)->win->_begy + getmaxy((pan)->win) - 1) + +/*+------------------------------------------------------------------------- + PANELS_OVERLAPPED(pan1,pan2) - check panel overlapped +---------------------------------------------------------------------------*/ +#define PANELS_OVERLAPPED(pan1,pan2) \ +(( !(pan1) || !(pan2) || \ + PSTARTY(pan1) > PENDY(pan2) || PENDY(pan1) < PSTARTY(pan2) ||\ + PSTARTX(pan1) > PENDX(pan2) || PENDX(pan1) < PSTARTX(pan2) ) \ + ? FALSE : TRUE) + + +/*+------------------------------------------------------------------------- + Compute the intersection rectangle of two overlapping rectangles +---------------------------------------------------------------------------*/ +#define COMPUTE_INTERSECTION(pan1,pan2,ix1,ix2,iy1,iy2)\ + ix1 = (PSTARTX(pan1) < PSTARTX(pan2)) ? PSTARTX(pan2) : PSTARTX(pan1);\ + ix2 = (PENDX(pan1) < PENDX(pan2)) ? PENDX(pan1) : PENDX(pan2);\ + iy1 = (PSTARTY(pan1) < PSTARTY(pan2)) ? PSTARTY(pan2) : PSTARTY(pan1);\ + iy2 = (PENDY(pan1) < PENDY(pan2)) ? PENDY(pan1) : PENDY(pan2);\ + assert((ix1<=ix2) && (iy1<=iy2)) + + +/*+------------------------------------------------------------------------- + Walk through the panel stack starting at the given location and + check for intersections; overlapping panels are "touched", so they + are incrementally overwriting cells that should be hidden. + If the "touch" flag is set, the panel gets touched before it is + updated. +---------------------------------------------------------------------------*/ +#define PANEL_UPDATE(pan,panstart)\ +{ PANEL* pan2 = ((panstart) ? (panstart) : _nc_bottom_panel);\ + while(pan2 && pan2->win) {\ + if ((pan2 != pan) && PANELS_OVERLAPPED(pan,pan2)) {\ + int y, ix1, ix2, iy1, iy2;\ + COMPUTE_INTERSECTION(pan, pan2, ix1, ix2, iy1, iy2);\ + for(y = iy1; y <= iy2; y++) {\ + if (is_linetouched(pan->win,y - PSTARTY(pan))) {\ + struct ldat* line = &(pan2->win->_line[y - PSTARTY(pan2)]);\ + CHANGED_RANGE(line, ix1 - PSTARTX(pan2), ix2 - PSTARTX(pan2));\ + }\ + }\ + }\ + pan2 = pan2->above;\ + }\ +} + +/*+------------------------------------------------------------------------- + Remove panel from stack. +---------------------------------------------------------------------------*/ +#define PANEL_UNLINK(pan,err) \ +{ err = ERR;\ + if (pan) {\ + if (IS_LINKED(pan)) {\ + if ((pan)->below)\ + (pan)->below->above = (pan)->above;\ + if ((pan)->above)\ + (pan)->above->below = (pan)->below;\ + if ((pan) == _nc_bottom_panel) \ + _nc_bottom_panel = (pan)->above;\ + if ((pan) == _nc_top_panel) \ + _nc_top_panel = (pan)->below;\ + err = OK;\ + }\ + (pan)->above = (pan)->below = (PANEL*)0;\ + }\ +} + +#define HIDE_PANEL(pan,err,err_if_unlinked)\ + if (IS_LINKED(pan)) {\ + Touchpan(pan);\ + PANEL_UPDATE(pan,(PANEL*)0);\ + PANEL_UNLINK(pan,err);\ + } \ + else {\ + err = err_if_unlinked;\ + } + +#if NCURSES_SP_FUNCS +/* These may become later renamed and part of panel.h and the public API */ +extern PANEL_EXPORT(void) NCURSES_SP_NAME(_nc_update_panels)(SCREEN*); +#endif +/* *INDENT-ON* */ + +#endif /* NCURSES_PANEL_PRIV_H */ diff --git a/contrib/ncurses/progs/MKtermsort.sh b/contrib/ncurses/progs/MKtermsort.sh new file mode 100755 index 00000000..4e58c50a --- /dev/null +++ b/contrib/ncurses/progs/MKtermsort.sh @@ -0,0 +1,186 @@ +#!/bin/sh +# $Id: MKtermsort.sh,v 1.17 2022/02/05 20:39:41 tom Exp $ +# +# MKtermsort.sh -- generate indirection vectors for the various sort methods +# +############################################################################## +# Copyright 2020-2021,2022 Thomas E. Dickey # +# Copyright 1998-2015,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# The output of this script is C source for nine arrays that list three sort +# orders for each of the three different classes of terminfo capabilities. +# +# keep the order independent of locale: +if test "${LANGUAGE+set}" = set; then LANGUAGE=C; export LANGUAGE; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +if test "${LC_COLLATE+set}" = set; then LC_COLLATE=C; export LC_COLLATE; fi +# +AWK=${1-awk} +DATA=${2-../include/Caps} + +data=data$$ +trap 'rm -f $data; exit 1' 1 2 3 15 +sed -e 's/[ ][ ]*/ /g' < "$DATA" >$data +DATA=$data + +cat < + +#ifndef DUMP_ENTRY_H +typedef unsigned PredType; +typedef unsigned PredIdx; +#endif + +EOF + +echo "static const PredIdx bool_terminfo_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "bool" {printf("%s\t%d\n", $2, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx num_terminfo_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "num" {printf("%s\t%d\n", $2, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx str_terminfo_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "str" {printf("%s\t%d\n", $2, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx bool_variable_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "bool" {printf("%s\t%d\n", $1, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx num_variable_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "num" {printf("%s\t%d\n", $1, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx str_variable_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "str" {printf("%s\t%d\n", $1, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx bool_termcap_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "bool" {printf("%s\t%d\n", $4, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx num_termcap_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "num" {printf("%s\t%d\n", $4, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const PredIdx str_termcap_sort[] = {"; +$AWK <$DATA ' +BEGIN {i = 0;} +/^#/ {next;} +$3 == "str" {printf("%s\t%d\n", $4, i++);} +' | sort | $AWK '{print "\t", $2, ",\t/* ", $1, " */";}'; +echo "};"; +echo ""; + +echo "static const bool bool_from_termcap[] = {"; +$AWK <$DATA ' +BEGIN { count = 0; valid = 0; } +$3 == "bool" && substr($7, 1, 1) == "-" {print "\tFALSE,\t/* ", $2, " */"; count++; } +$3 == "bool" && substr($7, 1, 1) == "Y" {print "\tTRUE,\t/* ", $2, " */"; valid = count++; } +END { printf "#define OK_bool_from_termcap %d\n", valid; } +' +echo "};"; +echo ""; + +echo "static const bool num_from_termcap[] = {"; +$AWK <$DATA ' +BEGIN { count = 0; valid = 0; } +$3 == "num" && substr($7, 1, 1) == "-" {print "\tFALSE,\t/* ", $2, " */"; count++; } +$3 == "num" && substr($7, 1, 1) == "Y" {print "\tTRUE,\t/* ", $2, " */"; valid = count++; } +END { printf "#define OK_num_from_termcap %d\n", valid; } +' +echo "};"; +echo ""; + +echo "static const bool str_from_termcap[] = {"; +$AWK <$DATA ' +BEGIN { count = 0; valid = 0; } +$3 == "str" && substr($7, 1, 1) == "-" {print "\tFALSE,\t/* ", $2, " */"; count++; } +$3 == "str" && substr($7, 1, 1) == "Y" {print "\tTRUE,\t/* ", $2, " */"; valid = count++; } +END { printf "#define OK_str_from_termcap %d\n", valid; } +' + +cat <$@ + echo "#define __TRANSFORM_H 1" >>$@ + echo "#include " >>$@ + echo "extern bool same_program(const char *, const char *);" >>$@ + -$(SHELL) -c 'if test -n "$x" ; then echo "#define SUFFIX_IGNORED \"$x\"">>$@; fi' + echo "#define PROG_CAPTOINFO \"$(define_captoinfo)\"" >>$@ + echo "#define PROG_INFOTOCAP \"$(define_infotocap)\"" >>$@ + echo "#define PROG_CLEAR \"$(define_clear)\"" >>$@ + echo "#define PROG_RESET \"$(define_reset)\"" >>$@ + echo "#define PROG_INIT \"$(define_init)\"" >>$@ + echo "#endif /* __TRANSFORM_H */" >>$@ + +install.progs: $(AUTO_SRC) $(PROGS) $(BINDIR) +@MAKE_TERMINFO@ $(LIBTOOL_INSTALL) $(INSTALL_PROG) tic$x $(BINDIR)/$(actual_tic) +@MAKE_TERMINFO@ $(LIBTOOL_INSTALL) $(INSTALL_PROG) toe$x $(BINDIR)/$(actual_toe) +@MAKE_TERMINFO@ @echo "linking $(actual_infotocap) to $(actual_tic)" +@MAKE_TERMINFO@ -@rm -f $(BINDIR)/$(actual_infotocap) +@MAKE_TERMINFO@ ( cd $(BINDIR) && $(LN_S) $(actual_tic) $(actual_infotocap) ) +@MAKE_TERMINFO@ @echo "linking $(actual_captoinfo) to $(actual_tic)" +@MAKE_TERMINFO@ -@rm -f $(BINDIR)/$(actual_captoinfo) +@MAKE_TERMINFO@ ( cd $(BINDIR) && $(LN_S) $(actual_tic) $(actual_captoinfo) ) + $(LIBTOOL_INSTALL) $(INSTALL_PROG) infocmp$x $(BINDIR)/$(actual_infocmp) + $(LIBTOOL_INSTALL) $(INSTALL_PROG) clear$x $(BINDIR)/$(actual_clear) + $(LIBTOOL_INSTALL) $(INSTALL_PROG) tabs$x $(BINDIR)/$(actual_tabs) + $(LIBTOOL_INSTALL) $(INSTALL_PROG) tput$x $(BINDIR)/$(actual_tput) + $(LIBTOOL_INSTALL) $(INSTALL_PROG) tset$x $(BINDIR)/$(actual_tset) + @echo "linking $(actual_reset) to $(actual_tset)" + -@rm -f $(BINDIR)/$(actual_reset) + ( cd $(BINDIR) && $(LN_S) $(actual_tset) $(actual_reset) ) + +uninstall.progs: +@MAKE_TERMINFO@ -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_tic) +@MAKE_TERMINFO@ -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_toe) +@MAKE_TERMINFO@ -@rm -f $(BINDIR)/$(actual_captoinfo) +@MAKE_TERMINFO@ -@rm -f $(BINDIR)/$(actual_infotocap) + -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_infocmp) + -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_clear) + -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_tabs) + -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_tput) + -@$(LIBTOOL_CLEAN) rm -f $(BINDIR)/$(actual_tset) + -@rm -f $(BINDIR)/$(actual_reset) + +$(BINDIR) : + mkdir -p $@ + +# +# Utilities normally built by make all start here +# + +DEPS_TIC = \ + $(MODEL)/tic$o \ + $(MODEL)/dump_entry$o \ + $(MODEL)/tparm_type$o \ + $(MODEL)/transform$o + +tic$x: $(DEPS_TIC) $(DEPS_CURSES) transform.h + @ECHO_LD@ $(LINK) $(DEPS_TIC) $(LDFLAGS_TIC) -o $@ + +DEPS_TOE = \ + $(MODEL)/toe$o + +toe$x: $(DEPS_TOE) $(DEPS_CURSES) + @ECHO_LD@ $(LINK) $(DEPS_TOE) $(LDFLAGS_TIC) -o $@ + +DEPS_CLEAR = \ + $(MODEL)/clear$o \ + $(MODEL)/clear_cmd$o \ + $(MODEL)/tty_settings$o + +clear$x: $(DEPS_CLEAR) $(DEPS_CURSES) + @ECHO_LD@ $(LINK) $(DEPS_CLEAR) $(LDFLAGS_TINFO) -o $@ + +DEPS_TABS = \ + $(MODEL)/tabs$o \ + $(MODEL)/tty_settings$o + +tabs$x: $(DEPS_TABS) $(DEPS_TABS) + @ECHO_LD@ $(LINK) $(DEPS_TABS) $(LDFLAGS_TINFO) -o $@ + +DEPS_TPUT = \ + $(MODEL)/tput$o \ + $(MODEL)/clear_cmd$o \ + $(MODEL)/reset_cmd$o \ + $(MODEL)/tparm_type$o \ + $(MODEL)/transform$o \ + $(MODEL)/tty_settings$o + +tput$x: $(DEPS_TPUT) $(DEPS_CURSES) transform.h + @ECHO_LD@ $(LINK) $(DEPS_TPUT) $(LDFLAGS_TINFO) -o $@ + +DEPS_INFOCMP = \ + $(MODEL)/infocmp$o \ + $(MODEL)/dump_entry$o + +infocmp$x: $(DEPS_INFOCMP) $(DEPS_CURSES) + @ECHO_LD@ $(LINK) $(DEPS_INFOCMP) $(LDFLAGS_TIC) -o $@ + +DEPS_TSET = \ + $(MODEL)/tset$o \ + $(MODEL)/reset_cmd$o \ + $(MODEL)/transform$o \ + $(MODEL)/tty_settings$o + +tset$x: $(DEPS_TSET) $(DEPS_CURSES) transform.h + @ECHO_LD@ $(LINK) $(DEPS_TSET) $(LDFLAGS_TINFO) -o $@ + +termsort.h: $(srcdir)/MKtermsort.sh + $(SHELL) $(srcdir)/MKtermsort.sh $(AWK) $(srcdir)/../include/@TERMINFO_CAPS@ >$@ + +# +# Utility productions start here +# + +tags: + $(CTAGS) *.[ch] + +@MAKE_UPPER_TAGS@TAGS: +@MAKE_UPPER_TAGS@ $(ETAGS) *.[ch] + +mostlyclean :: + -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace + +clean :: mostlyclean + -$(SHELL) -c "if test -n '$x' ; then $(MAKE) clean x=''; fi" + -rm -f $(AUTO_SRC) + -rm -f $(PROGS) + -rm -rf .libs *.dSYM + +distclean :: clean + -rm -f Makefile + +realclean :: distclean + +# These rules are used to allow "make -n" to work on a clean directory-tree +../include/hashsize.h \ +../include/parametrized.h \ +../include/term.h : + ( cd ../include && $(MAKE) $(TOP_MFLAGS) ) +$(DEPS_CURSES) : + ( cd ../ncurses && $(MAKE) $(TOP_MFLAGS) ) + +lint: +@MAKE_TERMINFO@ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tic.c $(srcdir)/dump_entry.c $(LINT_LIBS) +@MAKE_TERMINFO@ $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/toe.c $(LINT_LIBS) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/clear.c $(LINT_LIBS) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/infocmp.c $(srcdir)/dump_entry.c $(LINT_LIBS) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tabs.c $(LINT_LIBS) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tput.c $(LINT_LIBS) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/tset.c $(LINT_LIBS) + +# Verify that each header-file can be compiled without including another. +check: + @$(SHELL) -c "for header in *.h;\ + do \ + echo \"** testing \$${header}\" ; \ + echo \"#include <\$${header}>\" >headers.c; \ + echo \"int main(void) { return 0; }\" >>headers.c; \ + $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ + done" + -@rm -f headers.* + +############################################################################### +# The remainder of this file is automatically generated during configuration +############################################################################### diff --git a/contrib/ncurses/progs/capconvert b/contrib/ncurses/progs/capconvert new file mode 100755 index 00000000..4b5b321a --- /dev/null +++ b/contrib/ncurses/progs/capconvert @@ -0,0 +1,260 @@ +#!/bin/sh +############################################################################## +# Copyright 2019-2021,2022 Thomas E. Dickey # +# Copyright 1998-2011,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: capconvert,v 1.12 2022/07/16 21:00:27 tom Exp $ +# +# capconvert -- automated conversion from termcap to terminfo +# + +echo "This script tries to automatically set you up so that your applications" +echo "that now use termcap can use terminfo and the ncurses library." +echo "" + +# Note, except for telling if we're running under xterm we don't use TERM at +# all. This is because BSD users not infrequently have multiple termtypes +# selected by conditionals in tset -- unless they're xterm users, in which +# case they're on a workstation and probably don't. + +# Check to make sure TERMINFO is not already defined +if test -n "$TERMINFO" +then + echo "TERMINFO is already defined in your environment. This means" + echo "you already have a local terminfo tree, so you do not need any" + echo "conversion." + if test ! -d "$TERMINFO" ; then + echo "Caution: TERMINFO does not point to a directory!" + fi + exit; +fi + +# Check to see if terminfo is present in one of the standard locations. +terminfo=no +for p in $TERMINFO \ + /usr/lib/terminfo \ + /usr/share/lib/terminfo \ + /usr/share/terminfo \ + /usr/local/lib/terminfo \ + /usr/local/share/terminfo +do + if test -d "$p" ; then + terminfo=yes + break + fi +done + +if test $terminfo = yes +then + echo "Your system already has a system-wide terminfo tree." + echo "" + if test -z "$TERMCAP" + then + echo "You have no TERMCAP variable set, so we are done." + # Assumes the terminfo master covers all canned terminal types + exit; + fi + case $TERM in + xterm | xterm-*) + echo "You are running xterm, which usually sets TERMCAP itself." + echo "We can ignore this, because terminfo knows about xterm." + echo "So you will just use the system-wide terminfo tree." + exit + ;; + *) + echo "We will have to make a local one for you anyway, to capture the effect" + echo "of your TERMCAP variable." + ;; + esac +else + echo "No system-wide terminfo tree. We will make you a local one." +fi +echo ""; + +# Check if test -x works (it is not portable, but useful) +OPT="-x" +TMP=test$$; touch $TMP && chmod 755 $TMP +if test $OPT $TMP ; then + chmod 644 $TMP + test $OPT $TMP && OPT="-f" +else + OPT="-f" +fi +rm -f $TMP + +# First step -- go find tic +TIC= +IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:" +for x in $PATH . +do + if test "$OPT" "$x"/tic + then + TIC=$x/tic + break + fi +done +IFS="$save_ifs" + +if test -n "$TIC" +then + echo "I see tic at $TIC." + case $TIC in # (vi + ./tic) + if test $OPT ../misc/shlib ; then + TIC="../misc/shlib $TIC" + fi + ;; + esac +else + echo "You do not have tic installed anywhere I can see, please fix that." + exit; +fi +echo ""; + +# We have tic. Either there's no system terminfo tree or there is one but +# the user has a TERMCAP variable that may modify a stock description. +# + +# Make the user a terminfo directory +if test -d "$HOME"/.terminfo +then + echo "It appears you already have a private terminfo directory" + echo "at $HOME/.terminfo; this seems odd, because TERMINFO" + echo "is not defined. I am not going to second-guess this -- if you" + echo "really want me to try auto-configuring for you, remove or" + echo "rename $HOME/terminfo and run me again." + exit; +else + echo "I am creating your private terminfo directory at $HOME/.terminfo" + mkdir "$HOME"/.terminfo + # Ensure that that's where tic's compilation results. + # This isn't strictly necessary with a 1.9.7 or later tic. + TERMINFO="$HOME/.terminfo"; export TERMINFO +fi +echo ""; + +# Find a terminfo source to work from +if test -f ../misc/terminfo.src +then + echo "I see the terminfo master source is handy; I will use that." + master=../misc/terminfo.src +else + # Ooops...looks like we're running from somewhere other than the + # progs directory of an ncurses source tree. + master=`find "$HOME" -name "*terminfo.src" -print` + mcount=`find "$HOME" -name "*terminfo.src" | wc -l` + case $mcount in + 0) + echo "I can not find a terminfo source file anywhere under your home directory." + echo "There should be a file called terminfo.src somewhere in your" + echo "ncurses distribution; please put it in your home directotry" + echo "and run me again (it does not have to live there permanently)." + exit; + ;; + 1) + echo "I see a file called $master." + echo "I am going to assume this is the terminfo source included with" + echo "the ncurses distribution. If this assumption is wrong, please" + echo "interrupt me now! OK to continue?" + read answer; + ;; + 2) + echo "I see more than one possible terminfo source. Here they are:" + echo "$master" | sed "/^/s// /"; + while : + do + echo "Please tell me which one to use:" + read master; + if test -f "$master" + then + break + else + echo "That file does not exist. Try again?"; + fi + done + ;; + esac +fi +echo ""; + +# Now that we have a master, compile it into the local tree +echo "OK, now I will make your private terminfo tree. This may take a bit..." +# +# Kluge alert: we compile terminfo.src in two pieces because a lot of machines +# with < 16MB RAM choke on tic's core-hog habits. +trap 'rm -f tsplit$$.*; exit 1' 1 2 3 15 +trap 'rm -f tsplit$$.*' 0 +sed -n "$master" \ + -e '1,/SPLIT HERE/w 'tsplit$$.01 \ + -e '/SPLIT HERE/,$w 'tsplit$$.02 \ + 2>/dev/null +for x in tsplit$$.*; do eval $TIC "$x"; done +rm tsplit$$.* +trap EXIT INT QUIT TERM HUP +# +echo "You now have a private tree under $HOME/.terminfo;" +echo "the ncurses library will automatically read from it," +echo "and ncurses tic will automatically compile entries to it." + +# We're done unless user has a .termcap file or equivalent named by TERMCAP +if test -z "$TERMCAP" +then + echo "You have no TERMCAP set, so we are done." +fi + +# OK, here comes the nasty case...user has a TERMCAP. Instead of +# trying to follow all the convolutions of the relationship between +# TERM and TERMCAP (partly because it is too painful, and partly because +# we don't actually know what TERM will be nor even if it always has +# the same value for this user) we do the following three steps... + +if test -f "$HOME"/.termcap +then + echo "I see you have a \$HOME/.termcap file. I will compile that." + eval $TIC "$HOME"/.termcap + echo "Done." + echo "Note that editing $HOME/.termcap will no longer change the data curses sees." +elif test -f "$TERMCAP" +then + echo "Your TERMCAP names the file $TERMCAP. I will compile that." + eval $TIC "$TERMCAP" + echo "Done." + echo "Note that editing $TERMCAP will no longer change the data curses sees." +else + echo "Your TERMCAP value appears to be an entry in termcap format." + echo "I will compile it." + echo "$TERMCAP" >myterm$$ + eval $TIC myterm$$ + rm myterm$$ + echo "Done." + echo "Note that editing TERMCAP will no longer change the data curses sees." +fi +echo "To do that, decompile the terminal description you want with infocmp(1)," +echo "edit to taste, and recompile using tic(1)." + +# capconvert ends here + diff --git a/contrib/ncurses/progs/clear.c b/contrib/ncurses/progs/clear.c new file mode 100644 index 00000000..e0de8ce4 --- /dev/null +++ b/contrib/ncurses/progs/clear.c @@ -0,0 +1,108 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * clear.c -- clears the terminal's screen + */ + +#define USE_LIBTINFO +#include +#include + +MODULE_ID("$Id: clear.c,v 1.25 2024/10/19 22:00:53 tom Exp $") + +const char *_nc_progname = "clear"; + +static GCC_NORETURN void +usage(void) +{ +#define KEEP(s) s "\n" + static const char msg[] = + { + KEEP("") + KEEP("Options:") + KEEP(" -T TERM use this instead of $TERM") + KEEP(" -V print curses-version") + KEEP(" -x do not try to clear scrollback") + }; +#undef KEEP + (void) fprintf(stderr, "Usage: %s [options]\n", _nc_progname); + fputs(msg, stderr); + ExitProgram(EXIT_FAILURE); +} + +int +main( + int argc GCC_UNUSED, + char *argv[]GCC_UNUSED) +{ + TTY tty_settings; + int fd; + int c; + NCURSES_CONST char *term; + bool opt_x = FALSE; /* clear scrollback if possible */ + + _nc_progname = _nc_rootname(argv[0]); + term = getenv("TERM"); + + while ((c = getopt(argc, argv, "T:Vx")) != -1) { + switch (c) { + case 'T': + use_env(FALSE); + use_tioctl(TRUE); + term = optarg; + break; + case 'V': + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + case 'x': /* do not try to clear scrollback */ + opt_x = TRUE; + break; + default: + usage(); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(); + + fd = save_tty_settings(&tty_settings, FALSE); + + setupterm(term, fd, (int *) 0); + + ExitProgram((clear_cmd(opt_x) == ERR) + ? EXIT_FAILURE + : EXIT_SUCCESS); +} diff --git a/contrib/ncurses/progs/clear.sh b/contrib/ncurses/progs/clear.sh new file mode 100755 index 00000000..1d899f11 --- /dev/null +++ b/contrib/ncurses/progs/clear.sh @@ -0,0 +1,30 @@ +#!/bin/sh +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 1998,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +exec tput clear diff --git a/contrib/ncurses/progs/clear_cmd.c b/contrib/ncurses/progs/clear_cmd.c new file mode 100644 index 00000000..3d80515c --- /dev/null +++ b/contrib/ncurses/progs/clear_cmd.c @@ -0,0 +1,60 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * clear.c -- clears the terminal's screen + */ + +#define USE_LIBTINFO +#include + +MODULE_ID("$Id: clear_cmd.c,v 1.5 2020/02/02 23:34:34 tom Exp $") + +static int +putch(int c) +{ + return putchar(c); +} + +int +clear_cmd(bool legacy) +{ + int retval = tputs(clear_screen, lines > 0 ? lines : 1, putch); + if (!legacy) { + /* Clear the scrollback buffer if possible. */ + char *E3 = tigetstr("E3"); + if (E3) + (void) tputs(E3, lines > 0 ? lines : 1, putch); + } + return retval; +} diff --git a/contrib/ncurses/progs/clear_cmd.h b/contrib/ncurses/progs/clear_cmd.h new file mode 100644 index 00000000..b1de8145 --- /dev/null +++ b/contrib/ncurses/progs/clear_cmd.h @@ -0,0 +1,45 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * $Id: clear_cmd.h,v 1.3 2020/02/02 23:34:34 tom Exp $ + * + * Utility functions for clearing terminal. + */ +#ifndef CLEAR_CMD_H +#define CLEAR_CMD_H 1 + +#include +extern int clear_cmd(bool); + +#endif /* CLEAR_CMD_H */ diff --git a/contrib/ncurses/progs/dump_entry.c b/contrib/ncurses/progs/dump_entry.c new file mode 100644 index 00000000..652c9e32 --- /dev/null +++ b/contrib/ncurses/progs/dump_entry.c @@ -0,0 +1,1829 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996 on * + ****************************************************************************/ + +#define __INTERNAL_CAPS_VISIBLE +#include + +#include +#include /* this C file is generated */ +#include /* so is this */ + +MODULE_ID("$Id: dump_entry.c,v 1.197 2024/10/19 22:00:53 tom Exp $") + +#define DISCARD(string) string = ABSENT_STRING +#define PRINTF (void) printf +#define WRAPPED 32 + +#define OkIndex(index,array) ((int)(index) >= 0 && (int)(index) < (int) SIZEOF(array)) +#define TcOutput() (outform == F_TERMCAP || outform == F_TCONVERR) + +typedef struct { + char *text; + size_t used; + size_t size; +} DYNBUF; + +static int tversion; /* terminfo version */ +static int outform; /* output format to use */ +static int sortmode; /* sort mode to use */ +static int width = 60; /* max line width for listings */ +static int height = 65535; /* max number of lines for listings */ +static int column; /* current column, limited by 'width' */ +static int oldcol; /* last value of column before wrap */ +static bool pretty; /* true if we format if-then-else strings */ +static bool wrapped; /* true if we wrap too-long strings */ +static bool did_wrap; /* true if last wrap_concat did wrapping */ +static bool checking; /* true if we are checking for tic */ +static int quickdump; /* true if we are dumping compiled data */ + +static char *save_sgr; + +static DYNBUF outbuf; +static DYNBUF tmpbuf; + +/* indirection pointers for implementing sort and display modes */ +static const PredIdx *bool_indirect, *num_indirect, *str_indirect; +static NCURSES_CONST char *const *bool_names; +static NCURSES_CONST char *const *num_names; +static NCURSES_CONST char *const *str_names; + +static const char *separator = "", *trailer = ""; +static int indent = 8; + +/* cover various ports and variants of terminfo */ +#define V_ALLCAPS 0 /* all capabilities (SVr4, XSI, ncurses) */ +#define V_SVR1 1 /* SVR1, Ultrix */ +#define V_HPUX 2 /* HP-UX */ +#define V_AIX 3 /* AIX */ +#define V_BSD 4 /* BSD */ + +#if NCURSES_XNAMES +#define OBSOLETE(n) (!_nc_user_definable && (n[0] == 'O' && n[1] == 'T')) +#else +#define OBSOLETE(n) (n[0] == 'O' && n[1] == 'T') +#endif + +#define isObsolete(f,n) ((f == F_TERMINFO || f == F_VARIABLE) && (sortmode != S_VARIABLE) && OBSOLETE(n)) + +#if NCURSES_XNAMES +#define BoolIndirect(j) ((j >= BOOLCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : bool_indirect[j])) +#define NumIndirect(j) ((j >= NUMCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : num_indirect[j])) +#define StrIndirect(j) ((j >= STRCOUNT) ? (j) : ((sortmode == S_NOSORT) ? j : str_indirect[j])) +#else +#define BoolIndirect(j) ((sortmode == S_NOSORT) ? (j) : bool_indirect[j]) +#define NumIndirect(j) ((sortmode == S_NOSORT) ? (j) : num_indirect[j]) +#define StrIndirect(j) ((sortmode == S_NOSORT) ? (j) : str_indirect[j]) +#endif + +static GCC_NORETURN void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + +static void +strncpy_DYN(DYNBUF * dst, const char *src, size_t need) +{ + size_t want = need + dst->used + 1; + if (want > dst->size) { + dst->size += (want + 1024); /* be generous */ + dst->text = typeRealloc(char, dst->size, dst->text); + if (dst->text == 0) + failed("strncpy_DYN"); + } + _nc_STRNCPY(dst->text + dst->used, src, need + 1); + dst->used += need; + dst->text[dst->used] = 0; +} + +static void +strcpy_DYN(DYNBUF * dst, const char *src) +{ + if (src == 0) { + dst->used = 0; + strcpy_DYN(dst, ""); + } else { + strncpy_DYN(dst, src, strlen(src)); + } +} + +#if NO_LEAKS +static void +free_DYN(DYNBUF * p) +{ + if (p->text != 0) + free(p->text); + p->text = 0; + p->size = 0; + p->used = 0; +} + +void +_nc_leaks_dump_entry(void) +{ + free_DYN(&outbuf); + free_DYN(&tmpbuf); +} +#endif + +#define NameTrans(check,result) \ + if ((np->nte_index <= OK_ ## check) \ + && check[np->nte_index]) \ + return (result[np->nte_index]) + +NCURSES_CONST char * +nametrans(const char *name) +/* translate a capability name to termcap from terminfo */ +{ + const struct name_table_entry *np; + + if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) { + switch (np->nte_type) { + case BOOLEAN: + NameTrans(bool_from_termcap, boolcodes); + break; + + case NUMBER: + NameTrans(num_from_termcap, numcodes); + break; + + case STRING: + NameTrans(str_from_termcap, strcodes); + break; + } + } + + return (0); +} + +void +dump_init(const char *version, + int mode, + int sort, + bool wrap_strings, + int twidth, + int theight, + unsigned traceval, + bool formatted, + bool check, + int quick) +/* set up for entry display */ +{ + width = twidth; + height = theight; + pretty = formatted; + wrapped = wrap_strings; + checking = check; + quickdump = (quick & 3); + + did_wrap = (width <= 0); + + /* versions */ + if (version == 0) + tversion = V_ALLCAPS; + else if (!strcmp(version, "SVr1") || !strcmp(version, "SVR1") + || !strcmp(version, "Ultrix")) + tversion = V_SVR1; + else if (!strcmp(version, "HP")) + tversion = V_HPUX; + else if (!strcmp(version, "AIX")) + tversion = V_AIX; + else if (!strcmp(version, "BSD")) + tversion = V_BSD; + else + tversion = V_ALLCAPS; + + /* implement display modes */ + switch (outform = mode) { + case F_LITERAL: + case F_TERMINFO: + bool_names = boolnames; + num_names = numnames; + str_names = strnames; + separator = (twidth > 0 && theight > 1) ? ", " : ","; + trailer = "\n\t"; + break; + + case F_VARIABLE: + bool_names = boolfnames; + num_names = numfnames; + str_names = strfnames; + separator = (twidth > 0 && theight > 1) ? ", " : ","; + trailer = "\n\t"; + break; + + case F_TERMCAP: + case F_TCONVERR: + bool_names = boolcodes; + num_names = numcodes; + str_names = strcodes; + separator = ":"; + trailer = "\\\n\t:"; + break; + } + indent = 8; + + /* implement sort modes */ + switch (sortmode = sort) { + case S_NOSORT: + if (traceval) + (void) fprintf(stderr, + "%s: sorting by term structure order\n", _nc_progname); + break; + + case S_TERMINFO: + if (traceval) + (void) fprintf(stderr, + "%s: sorting by terminfo name order\n", _nc_progname); + bool_indirect = bool_terminfo_sort; + num_indirect = num_terminfo_sort; + str_indirect = str_terminfo_sort; + break; + + case S_VARIABLE: + if (traceval) + (void) fprintf(stderr, + "%s: sorting by C variable order\n", _nc_progname); + bool_indirect = bool_variable_sort; + num_indirect = num_variable_sort; + str_indirect = str_variable_sort; + break; + + case S_TERMCAP: + if (traceval) + (void) fprintf(stderr, + "%s: sorting by termcap name order\n", _nc_progname); + bool_indirect = bool_termcap_sort; + num_indirect = num_termcap_sort; + str_indirect = str_termcap_sort; + break; + } + + if (traceval) + (void) fprintf(stderr, + "%s: width = %d, tversion = %d, outform = %d\n", + _nc_progname, width, tversion, outform); +} + +static TERMTYPE2 *cur_type; + +static int +dump_predicate(PredType type, PredIdx idx) +/* predicate function to use for ordinary decompilation */ +{ + switch (type) { + case BOOLEAN: + return (cur_type->Booleans[idx] == FALSE) + ? FAIL : cur_type->Booleans[idx]; + + case NUMBER: + return (cur_type->Numbers[idx] == ABSENT_NUMERIC) + ? FAIL : cur_type->Numbers[idx]; + + case STRING: + return (cur_type->Strings[idx] != ABSENT_STRING) + ? (int) TRUE : FAIL; + } + + return (FALSE); /* pacify compiler */ +} + +static void set_obsolete_termcaps(TERMTYPE2 *tp); + +/* is this the index of a function key string? */ +#define FNKEY(i) \ + (((i) >= STR_IDX(key_f0) && \ + (i) <= STR_IDX(key_f9)) || \ + ((i) >= STR_IDX(key_f11) && \ + (i) <= STR_IDX(key_f63))) + +/* + * If we configure with a different Caps file, the offsets into the arrays + * will change. So we use an address expression. + */ +#define BOOL_IDX(name) (PredType) (&(name) - &(CUR Booleans[0])) +#define NUM_IDX(name) (PredType) (&(name) - &(CUR Numbers[0])) +#define STR_IDX(name) (PredType) (&(name) - &(CUR Strings[0])) + +static bool +version_filter(PredType type, PredIdx idx) +/* filter out capabilities we may want to suppress */ +{ + switch (tversion) { + case V_ALLCAPS: /* SVr4, XSI Curses */ + return (TRUE); + + case V_SVR1: /* System V Release 1, Ultrix */ + switch (type) { + case BOOLEAN: + return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE); + case NUMBER: + return ((idx <= NUM_IDX(width_status_line)) ? TRUE : FALSE); + case STRING: + return ((idx <= STR_IDX(prtr_non)) ? TRUE : FALSE); + } + break; + + case V_HPUX: /* Hewlett-Packard */ + switch (type) { + case BOOLEAN: + return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE); + case NUMBER: + return ((idx <= NUM_IDX(label_width)) ? TRUE : FALSE); + case STRING: + if (idx <= STR_IDX(prtr_non)) + return (TRUE); + else if (FNKEY(idx)) /* function keys */ + return (TRUE); + else if (idx == STR_IDX(plab_norm) + || idx == STR_IDX(label_on) + || idx == STR_IDX(label_off)) + return (TRUE); + else + return (FALSE); + } + break; + + case V_AIX: /* AIX */ + switch (type) { + case BOOLEAN: + return ((idx <= BOOL_IDX(xon_xoff)) ? TRUE : FALSE); + case NUMBER: + return ((idx <= NUM_IDX(width_status_line)) ? TRUE : FALSE); + case STRING: + if (idx <= STR_IDX(prtr_non)) + return (TRUE); + else if (FNKEY(idx)) /* function keys */ + return (TRUE); + else + return (FALSE); + } + break; + +#define is_termcap(type) (OkIndex(idx, type##_from_termcap) && \ + type##_from_termcap[idx]) + + case V_BSD: /* BSD */ + switch (type) { + case BOOLEAN: + return is_termcap(bool); + case NUMBER: + return is_termcap(num); + case STRING: + return is_termcap(str); + } + break; + } + + return (FALSE); /* pacify the compiler */ +} + +static void +trim_trailing(void) +{ + while (outbuf.used > 0 && outbuf.text[outbuf.used - 1] == ' ') + outbuf.text[--outbuf.used] = '\0'; +} + +static void +force_wrap(void) +{ + oldcol = column; + trim_trailing(); + strcpy_DYN(&outbuf, trailer); + column = indent; +} + +static int +op_length(const char *src, int offset) +{ + int result = 0; + + if (offset > 0 && src[offset - 1] == '\\') { + result = 0; + } else { + int ch; + + result++; /* for '%' mark */ + ch = src[offset + result]; + if (TcOutput()) { + if (ch == '>') { + result += 3; + } else if (ch == '+') { + result += 2; + } else { + result++; + } + } else if (ch == '\'') { + result += 3; + } else if (ch == L_CURL[0]) { + int n = result; + while ((ch = src[offset + n]) != '\0') { + if (ch == R_CURL[0]) { + result = ++n; + break; + } + n++; + } + } else if (strchr("pPg", ch) != 0) { + result += 2; + } else { + result++; /* ordinary operator */ + } + } + return result; +} + +/* + * When wrapping too-long strings, avoid splitting a backslash sequence, or + * a terminfo '%' operator. That will leave things a little ragged, but avoids + * a stray backslash at the end of the line, as well as making the result a + * little more readable. + */ +static int +find_split(const char *src, int step, int size) +{ + int result = size; + + if (size > 0) { + /* check if that would split a backslash-sequence */ + int mark = size; + int n; + + for (n = size - 1; n > 0; --n) { + int ch = UChar(src[step + n]); + if (ch == '\\') { + if (n > 0 && src[step + n - 1] == ch) + --n; + mark = n; + break; + } else if (!isalnum(ch)) { + break; + } + } + if (mark < size) { + result = mark; + } else { + /* check if that would split a backslash-sequence */ + for (n = size - 1; n > 0; --n) { + int ch = UChar(src[step + n]); + if (ch == '%') { + int need = op_length(src, step + n); + if ((n + need) > size) { + mark = n; + } + break; + } + } + if (mark < size) { + result = mark; + } + } + } + return result; +} + +/* + * If we are going to wrap lines, we cannot leave literal spaces because that + * would be ambiguous if we split on that space. + */ +static char * +fill_spaces(const char *src) +{ + const char *fill = "\\s"; + size_t need = strlen(src); + size_t size = strlen(fill); + char *result = 0; + int pass; + size_t s, d; + for (pass = 0; pass < 2; ++pass) { + for (s = d = 0; src[s] != '\0'; ++s) { + if (src[s] == ' ') { + if (pass) { + _nc_STRCPY(&result[d], fill, need + 1 - d); + d += size; + } else { + need += size; + } + } else { + if (pass) { + result[d++] = src[s]; + } else { + ++d; + } + } + } + if (pass) { + result[d] = '\0'; + } else { + result = calloc(need + 1, sizeof(char)); + if (result == 0) + failed("fill_spaces"); + } + } + return result; +} + +typedef enum { + wOFF = 0 + ,w1ST = 1 + ,w2ND = 2 + ,wEND = 4 + ,wERR = 8 +} WRAPMODE; + +#define wrap_1ST(mode) ((mode)&w1ST) +#define wrap_END(mode) ((mode)&wEND) +#define wrap_ERR(mode) ((mode)&wERR) + +static void +wrap_concat(const char *src, int need, unsigned mode) +{ + int gaps = (int) strlen(separator); + int want = gaps + need; + + did_wrap = (width <= 0); + if (wrap_1ST(mode) + && column > indent + && column + want > width) { + force_wrap(); + } + if ((wrap_END(mode) && !wrap_ERR(mode)) && + wrapped && + (width >= 0) && + (column + want) > width) { + int step = 0; + int used = width > WRAPPED ? width : WRAPPED; + int base = 0; + char *p, align[9]; + const char *my_t = trailer; + char *fill = fill_spaces(src); + int last = (int) strlen(fill); + + need = last; + + if (TcOutput()) + trailer = "\\\n\t "; + + if (!TcOutput() && (p = strchr(fill, '=')) != 0) { + base = (int) (p + 1 - fill); + if (base > 8) + base = 8; + _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " "); + } else if (column > 8) { + base = column - 8; + if (base > 8) + base = 8; + _nc_SPRINTF(align, _nc_SLIMIT(align) "%*s", base, " "); + } else { + align[base] = '\0'; + } + /* "pretty" overrides wrapping if it already split the line */ + if (!pretty || strchr(fill, '\n') == 0) { + int tag = 0; + + if (TcOutput() && outbuf.used && !wrap_1ST(mode)) { + tag = 3; + } + + while ((column + (need + gaps)) > used) { + int size = used - tag; + if (step) { + strcpy_DYN(&outbuf, align); + size -= base; + } + if (size > (last - step)) { + size = (last - step); + } + size = find_split(fill, step, size); + strncpy_DYN(&outbuf, fill + step, (size_t) size); + step += size; + need -= size; + if (need > 0) { + force_wrap(); + did_wrap = TRUE; + tag = 0; + } + } + } + if (need > 0) { + if (step) + strcpy_DYN(&outbuf, align); + strcpy_DYN(&outbuf, fill + step); + } + if (wrap_END(mode)) + strcpy_DYN(&outbuf, separator); + trailer = my_t; + force_wrap(); + + free(fill); + } else { + strcpy_DYN(&outbuf, src); + if (wrap_END(mode)) + strcpy_DYN(&outbuf, separator); + column += (int) strlen(src); + } +} + +static void +wrap_concat1(const char *src) +{ + int need = (int) strlen(src); + wrap_concat(src, need, w1ST | wEND); +} + +static void +wrap_concat3(const char *name, const char *eqls, const char *value) +{ + int nlen = (int) strlen(name); + int elen = (int) strlen(eqls); + int vlen = (int) strlen(value); + + wrap_concat(name, nlen + elen + vlen, w1ST); + wrap_concat(eqls, elen + vlen, w2ND); + wrap_concat(value, vlen, wEND); +} + +#define IGNORE_SEP_TRAIL(first,last,sep_trail) \ + if ((size_t)(last - first) > sizeof(sep_trail)-1 \ + && !strncmp(first, sep_trail, sizeof(sep_trail)-1)) \ + first += sizeof(sep_trail)-2 + +/* Returns the nominal length of the buffer assuming it is termcap format, + * i.e., the continuation sequence is treated as a single character ":". + * + * There are several implementations of termcap which read the text into a + * fixed-size buffer. Generally they strip the newlines from the text, but may + * not do it until after the buffer is read. Also, "tc=" resolution may be + * expanded in the same buffer. This function is useful for measuring the size + * of the best fixed-buffer implementation; the worst case may be much worse. + */ +#ifdef TEST_TERMCAP_LENGTH +static int +termcap_length(const char *src) +{ + static const char pattern[] = ":\\\n\t:"; + + int len = 0; + const char *const t = src + strlen(src); + + while (*src != '\0') { + IGNORE_SEP_TRAIL(src, t, pattern); + src++; + len++; + } + return len; +} +#else +#define termcap_length(src) strlen(src) +#endif + +static void +indent_DYN(DYNBUF * buffer, int level) +{ + int n; + + for (n = 0; n < level; n++) + strncpy_DYN(buffer, "\t", (size_t) 1); +} + +/* + * Check if the current line which was begun consists only of a tab and the + * given leading text. + */ +static bool +leading_DYN(const DYNBUF * buffer, const char *leading) +{ + bool result = FALSE; + size_t need = strlen(leading); + if (buffer->used > need) { + need = buffer->used - need; + if (!strcmp(buffer->text + need, leading)) { + result = TRUE; + while (--need != 0) { + if (buffer->text[need] == '\n') { + break; + } + if (buffer->text[need] != '\t') { + result = FALSE; + break; + } + } + } + } + return result; +} + +bool +has_params(const char *src, bool formatting) +{ + bool result = FALSE; + int len = (int) strlen(src); + int n; + bool ifthen = FALSE; + bool params = FALSE; + + for (n = 0; n < len - 1; ++n) { + if (!strncmp(src + n, "%p", (size_t) 2)) { + params = TRUE; + } else if (!strncmp(src + n, "%;", (size_t) 2)) { + ifthen = TRUE; + result = params; + break; + } + } + if (!ifthen) { + if (formatting) { + result = ((len > 50) && params); + } else { + result = params; + } + } + return result; +} + +static char * +fmt_complex(TERMTYPE2 *tterm, const char *capability, char *src, int level) +{ + bool percent = FALSE; + bool params = has_params(src, TRUE); + + while (*src != '\0') { + switch (*src) { + case '^': + percent = FALSE; + strncpy_DYN(&tmpbuf, src++, (size_t) 1); + break; + case '\\': + percent = FALSE; + strncpy_DYN(&tmpbuf, src++, (size_t) 1); + break; + case '%': + percent = TRUE; + break; + case '?': /* "if" */ + case 't': /* "then" */ + case 'e': /* "else" */ + if (percent) { + percent = FALSE; + tmpbuf.text[tmpbuf.used - 1] = '\n'; + /* treat a "%e" as else-if, on the same level */ + if (*src == 'e') { + indent_DYN(&tmpbuf, level); + strncpy_DYN(&tmpbuf, "%", (size_t) 1); + strncpy_DYN(&tmpbuf, src, (size_t) 1); + src++; + params = has_params(src, TRUE); + if (!params && *src != '\0' && *src != '%') { + strncpy_DYN(&tmpbuf, "\n", (size_t) 1); + indent_DYN(&tmpbuf, level + 1); + } + } else { + indent_DYN(&tmpbuf, level + 1); + strncpy_DYN(&tmpbuf, "%", (size_t) 1); + strncpy_DYN(&tmpbuf, src, (size_t) 1); + if (*src++ == '?') { + src = fmt_complex(tterm, capability, src, level + 1); + if (*src != '\0' && *src != '%') { + strncpy_DYN(&tmpbuf, "\n", (size_t) 1); + indent_DYN(&tmpbuf, level + 1); + } + } else if (level == 1) { + if (checking) + _nc_warning("%s: %%%c without %%? in %s", + _nc_first_name(tterm->term_names), + *src, capability); + } + } + continue; + } + break; + case ';': /* "endif" */ + if (percent) { + percent = FALSE; + if (level > 1) { + tmpbuf.text[tmpbuf.used - 1] = '\n'; + indent_DYN(&tmpbuf, level); + strncpy_DYN(&tmpbuf, "%", (size_t) 1); + strncpy_DYN(&tmpbuf, src++, (size_t) 1); + if (src[0] == '%' + && src[1] != '\0' + && (strchr("?e;", src[1])) == 0) { + tmpbuf.text[tmpbuf.used++] = '\n'; + indent_DYN(&tmpbuf, level); + } + return src; + } + if (checking) + _nc_warning("%s: %%; without %%? in %s", + _nc_first_name(tterm->term_names), + capability); + } + break; + case 'p': + if (percent && params && !leading_DYN(&tmpbuf, "%")) { + tmpbuf.text[tmpbuf.used - 1] = '\n'; + indent_DYN(&tmpbuf, level + 1); + strncpy_DYN(&tmpbuf, "%", (size_t) 1); + } + percent = FALSE; + break; + case ' ': + strncpy_DYN(&tmpbuf, "\\s", (size_t) 2); + ++src; + continue; + default: + percent = FALSE; + break; + } + strncpy_DYN(&tmpbuf, src++, (size_t) 1); + } + return src; +} + +/* + * Make "large" numbers a little easier to read by showing them in hexadecimal + * if they are "close" to a power of two. + */ +static const char * +number_format(int value) +{ + const char *result = "%d"; + + if ((outform != F_TERMCAP) && (value > 255)) { + unsigned long lv = (unsigned long) value; + int bits = sizeof(unsigned long) * 8; + int nn; + + for (nn = 8; nn < bits; ++nn) { + unsigned long mm; + + mm = 1UL << nn; + if ((mm - 16) <= lv && (mm + 16) > lv) { + result = "%#x"; + break; + } + } + } + return result; +} + +#define SAME_CAP(n,cap) (&tterm->Strings[n] == &cap) +#define EXTRA_CAP 20 + +int +fmt_entry(TERMTYPE2 *tterm, + PredFunc pred, + int content_only, + int suppress_untranslatable, + int infodump, + int numbers) +{ + PredIdx i, j; + char buffer[MAX_TERMINFO_LENGTH + EXTRA_CAP]; + NCURSES_CONST char *name; + int predval, len; + PredIdx num_bools = 0; + PredIdx num_values = 0; + PredIdx num_strings = 0; + bool outcount = 0; + +#define WRAP_CONCAT1(s) wrap_concat1(s); outcount = TRUE +#define WRAP_CONCAT WRAP_CONCAT1(buffer) + + len = 12; /* terminfo file-header */ + + if (pred == 0) { + cur_type = tterm; + pred = dump_predicate; + } + + strcpy_DYN(&outbuf, 0); + if (content_only) { + column = indent; /* workaround to prevent empty lines */ + } else { + strcpy_DYN(&outbuf, tterm->term_names); + + /* + * Colon is legal in terminfo descriptions, but not in termcap. + */ + if (!infodump) { + char *p = outbuf.text; + while (*p) { + if (*p == ':') { + *p = '='; + } + ++p; + } + } + strcpy_DYN(&outbuf, separator); + column = (int) outbuf.used; + if (height > 1) + force_wrap(); + } + + for_each_boolean(j, tterm) { + i = BoolIndirect(j); + name = ExtBoolname(tterm, (int) i, bool_names); + assert(strlen(name) < sizeof(buffer) - EXTRA_CAP); + + if (!version_filter(BOOLEAN, i)) + continue; + else if (isObsolete(outform, name)) + continue; + + predval = pred(BOOLEAN, i); + if (predval != FAIL) { + _nc_STRCPY(buffer, name, sizeof(buffer)); + if (predval <= 0) + _nc_STRCAT(buffer, "@", sizeof(buffer)); + else if (i + 1 > num_bools) + num_bools = i + 1; + WRAP_CONCAT; + } + } + + if (column != indent && height > 1) + force_wrap(); + + for_each_number(j, tterm) { + i = NumIndirect(j); + name = ExtNumname(tterm, (int) i, num_names); + assert(strlen(name) < sizeof(buffer) - EXTRA_CAP); + + if (!version_filter(NUMBER, i)) + continue; + else if (isObsolete(outform, name)) + continue; + + predval = pred(NUMBER, i); + if (predval != FAIL) { + if (tterm->Numbers[i] < 0) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%s@", name); + } else { + size_t nn; + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%s#", name); + nn = strlen(buffer); + _nc_SPRINTF(buffer + nn, _nc_SLIMIT(sizeof(buffer) - nn) + number_format(tterm->Numbers[i]), + tterm->Numbers[i]); + if (i + 1 > num_values) + num_values = i + 1; + } + WRAP_CONCAT; + } + } + + if (column != indent && height > 1) + force_wrap(); + + len += (int) (num_bools + + num_values * 2 + + strlen(tterm->term_names) + 1); + if (len & 1) + len++; + +#undef CUR +#define CUR tterm-> + if (outform == F_TERMCAP) { + if (VALID_STRING(termcap_reset)) { + if (VALID_STRING(init_3string) + && !strcmp(init_3string, termcap_reset)) + DISCARD(init_3string); + + if (VALID_STRING(reset_2string) + && !strcmp(reset_2string, termcap_reset)) + DISCARD(reset_2string); + } + } + + for_each_string(j, tterm) { + char *capability; + i = StrIndirect(j); + name = ExtStrname(tterm, (int) i, str_names); + assert(strlen(name) < sizeof(buffer) - EXTRA_CAP); + + capability = tterm->Strings[i]; + + if (!version_filter(STRING, i)) + continue; + else if (isObsolete(outform, name)) + continue; + +#if NCURSES_XNAMES + /* + * Extended names can be longer than 2 characters, but termcap programs + * cannot read those (filter them out). + */ + if (outform == F_TERMCAP && (strlen(name) > 2)) + continue; +#endif + + if (outform == F_TERMCAP) { + /* + * Some older versions of vi want rmir/smir to be defined + * for ich/ich1 to work. If they're not defined, force + * them to be output as defined and empty. + */ + if (PRESENT(insert_character) || PRESENT(parm_ich)) { + if (SAME_CAP(i, enter_insert_mode) + && enter_insert_mode == ABSENT_STRING) { + _nc_STRCPY(buffer, "im=", sizeof(buffer)); + WRAP_CONCAT; + continue; + } + + if (SAME_CAP(i, exit_insert_mode) + && exit_insert_mode == ABSENT_STRING) { + _nc_STRCPY(buffer, "ei=", sizeof(buffer)); + WRAP_CONCAT; + continue; + } + } + /* + * termcap applications such as screen will be confused if sgr0 + * is translated to a string containing rmacs. Filter that out. + */ + if (PRESENT(exit_attribute_mode)) { + if (SAME_CAP(i, exit_attribute_mode)) { + char *trimmed_sgr0; + char *my_sgr = set_attributes; + + set_attributes = save_sgr; + + trimmed_sgr0 = _nc_trim_sgr0(tterm); + if (strcmp(capability, trimmed_sgr0)) { + capability = trimmed_sgr0; + } else { + if (trimmed_sgr0 != exit_attribute_mode) + free(trimmed_sgr0); + } + + set_attributes = my_sgr; + } + } + } + + predval = pred(STRING, i); + buffer[0] = '\0'; + + if (predval != FAIL) { + if (VALID_STRING(capability) + && i + 1 > num_strings) + num_strings = i + 1; + + if (!VALID_STRING(capability)) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%s@", name); + WRAP_CONCAT; + } else if (TcOutput()) { + char *srccap = _nc_tic_expand(capability, TRUE, numbers); + int params = ((i < (int) SIZEOF(parametrized)) + ? parametrized[i] + : ((*srccap == 'k') + ? 0 + : has_params(srccap, FALSE))); + const char *cv = _nc_infotocap(name, srccap, params); + + if (cv == 0) { + if (outform == F_TCONVERR) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%s=!!! %s WILL NOT CONVERT !!!", + name, srccap); + WRAP_CONCAT; + } else if (suppress_untranslatable) { + continue; + } else { + const char *s = srccap; + char *d = buffer; + int need = 3 + (int) strlen(name); + while ((*d = *s++) != 0) { + if ((d - buffer + 2) >= (int) sizeof(buffer)) { + fprintf(stderr, + "%s: value for %s is too long\n", + _nc_progname, + name); + *d = '\0'; + break; + } + if (*d == ':') { + *d++ = '\\'; + *d = ':'; + } else if (*d == '\\') { + if ((*++d = *s++) == '\0') + break; + } + d++; + *d = '\0'; + } + need += (int) (d - buffer); + wrap_concat("..", need, w1ST | wERR); + need -= 2; + wrap_concat(name, need, wOFF | wERR); + need -= (int) strlen(name); + wrap_concat("=", need, w2ND | wERR); + need -= 1; + wrap_concat(buffer, need, wEND | wERR); + outcount = TRUE; + } + } else { + wrap_concat3(name, "=", cv); + } + len += (int) strlen(capability) + 1; + } else { + char *src = _nc_tic_expand(capability, + outform == F_TERMINFO, numbers); + + strcpy_DYN(&tmpbuf, 0); + strcpy_DYN(&tmpbuf, name); + strcpy_DYN(&tmpbuf, "="); + if (pretty + && (outform == F_TERMINFO + || outform == F_VARIABLE)) { + fmt_complex(tterm, name, src, 1); + } else { + strcpy_DYN(&tmpbuf, src); + } + len += (int) strlen(capability) + 1; + WRAP_CONCAT1(tmpbuf.text); + } + } + /* e.g., trimmed_sgr0 */ + if (VALID_STRING(capability) && + capability != tterm->Strings[i]) + free(capability); + } + len += (int) (num_strings * 2); + + /* + * This piece of code should be an effective inverse of the functions + * postprocess_terminfo() and postprocess_terminfo() in parse_entry.c. + * Much more work should be done on this to support dumping termcaps. + */ + if (tversion == V_HPUX) { + if (VALID_STRING(memory_lock)) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "meml=%s", memory_lock); + WRAP_CONCAT; + } + if (VALID_STRING(memory_unlock)) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "memu=%s", memory_unlock); + WRAP_CONCAT; + } + } else if (tversion == V_AIX) { + if (VALID_STRING(acs_chars)) { + bool box_ok = TRUE; + const char *acstrans = "lqkxjmwuvtn"; + const char *cp; + const char *sp; + char *tp, boxchars[11]; + + tp = boxchars; + for (cp = acstrans; *cp; cp++) { + sp = (strchr) (acs_chars, *cp); + if (sp) + *tp++ = sp[1]; + else { + box_ok = FALSE; + break; + } + } + tp[0] = '\0'; + + if (box_ok) { + char *tmp = _nc_tic_expand(boxchars, + (outform == F_TERMINFO), + numbers); + _nc_STRCPY(buffer, "box1=", sizeof(buffer)); + while (*tmp != '\0') { + size_t have = strlen(buffer); + size_t next = strlen(tmp); + size_t want = have + next + 1; + size_t last = next; + char save = '\0'; + + /* + * If the expanded string is too long for the buffer, + * chop it off and save the location where we chopped it. + */ + if (want >= sizeof(buffer)) { + save = tmp[last]; + tmp[last] = '\0'; + } + _nc_STRCAT(buffer, tmp, sizeof(buffer)); + + /* + * If we chopped the buffer, replace the missing piece and + * shift everything to append the remainder. + */ + if (save != '\0') { + next = 0; + tmp[last] = save; + while ((tmp[next] = tmp[last + next]) != '\0') { + ++next; + } + } else { + break; + } + } + WRAP_CONCAT; + } + } + } + + /* + * kludge: trim off trailer to avoid an extra blank line + * in infocmp -u output when there are no string differences + */ + if (outcount) { + bool trimmed = FALSE; + j = (PredIdx) outbuf.used; + if (wrapped && did_wrap) { + /* EMPTY */ ; + } else if (j >= 2 + && outbuf.text[j - 1] == '\t' + && outbuf.text[j - 2] == '\n') { + outbuf.used -= 2; + trimmed = TRUE; + } else if (j >= 4 + && outbuf.text[j - 1] == ':' + && outbuf.text[j - 2] == '\t' + && outbuf.text[j - 3] == '\n' + && outbuf.text[j - 4] == '\\') { + outbuf.used -= 4; + trimmed = TRUE; + } + if (trimmed) { + outbuf.text[outbuf.used] = '\0'; + column = oldcol; + strcpy_DYN(&outbuf, " "); + } + } +#if 0 + fprintf(stderr, "num_bools = %d\n", num_bools); + fprintf(stderr, "num_values = %d\n", num_values); + fprintf(stderr, "num_strings = %d\n", num_strings); + fprintf(stderr, "term_names=%s, len=%d, strlen(outbuf)=%d, outbuf=%s\n", + tterm->term_names, len, outbuf.used, outbuf.text); +#endif + /* + * Here's where we use infodump to trigger a more stringent length check + * for termcap-translation purposes. + * Return the length of the raw entry, without tc= expansions, + * It gives an idea of which entries are deadly to even *scan past*, + * as opposed to *use*. + */ + return (infodump ? len : (int) termcap_length(outbuf.text)); +} + +static bool +kill_string(TERMTYPE2 *tterm, const char *const cap) +{ + unsigned n; + for (n = 0; n < NUM_STRINGS(tterm); ++n) { + if (cap == tterm->Strings[n]) { + tterm->Strings[n] = ABSENT_STRING; + return TRUE; + } + } + return FALSE; +} + +static char * +find_string(TERMTYPE2 *tterm, const char *name) +{ + PredIdx n; + for (n = 0; n < NUM_STRINGS(tterm); ++n) { + if (version_filter(STRING, n) + && !strcmp(name, strnames[n])) { + char *cap = tterm->Strings[n]; + if (VALID_STRING(cap)) { + return cap; + } + break; + } + } + return ABSENT_STRING; +} + +/* + * This is used to remove function-key labels from a termcap entry to + * make it smaller. + */ +static int +kill_labels(TERMTYPE2 *tterm, int target) +{ + int n; + int result = 0; + char name[20]; + + for (n = 0; n <= 10; ++n) { + const char *cap; + + _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "lf%d", n); + cap = find_string(tterm, name); + if (VALID_STRING(cap) + && kill_string(tterm, cap)) { + target -= (int) (strlen(cap) + 5); + ++result; + if (target < 0) + break; + } + } + return result; +} + +/* + * This is used to remove function-key definitions from a termcap entry to + * make it smaller. + */ +static int +kill_fkeys(TERMTYPE2 *tterm, int target) +{ + int n; + int result = 0; + char name[20]; + + for (n = 60; n >= 0; --n) { + const char *cap; + + _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n); + cap = find_string(tterm, name); + if (VALID_STRING(cap) + && kill_string(tterm, cap)) { + target -= (int) (strlen(cap) + 5); + ++result; + if (target < 0) + break; + } + } + return result; +} + +/* + * Check if the given acsc string is a 1-1 mapping, i.e., just-like-vt100. + * Also, since this is for termcap, we only care about the line-drawing map. + */ +#define isLine(c) (strchr("lmkjtuvwqxn", c) != 0) + +static bool +one_one_mapping(const char *mapping) +{ + bool result = TRUE; + + if (VALID_STRING(mapping)) { + int n = 0; + while (mapping[n] != '\0' && mapping[n + 1] != '\0') { + if (isLine(mapping[n]) && + mapping[n] != mapping[n + 1]) { + result = FALSE; + break; + } + n += 2; + } + } + return result; +} + +#define FMT_ENTRY() \ + fmt_entry(tterm, pred, \ + 0, \ + suppress_untranslatable, \ + infodump, numbers) + +#define SHOW_WHY PRINTF + +static bool +purged_acs(TERMTYPE2 *tterm) +{ + bool result = FALSE; + + if (VALID_STRING(acs_chars)) { + if (!one_one_mapping(acs_chars)) { + enter_alt_charset_mode = ABSENT_STRING; + exit_alt_charset_mode = ABSENT_STRING; + SHOW_WHY("# (rmacs/smacs removed for consistency)\n"); + } + result = TRUE; + } + return result; +} + +static void +encode_b64(char *target, const char *source, unsigned state, int *saved) +{ + /* RFC-4648 */ + static const char data[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" "-_"; + int ch = UChar(source[state]); + + switch (state % 3) { + case 0: + *target++ = data[(ch >> 2) & 077]; + *saved = (ch << 4); + break; + case 1: + *target++ = data[((ch >> 4) | *saved) & 077]; + *saved = (ch << 2); + break; + case 2: + *target++ = data[((ch >> 6) | *saved) & 077]; + *target++ = data[ch & 077]; + *saved = 0; + break; + } + *target = '\0'; +} + +/* + * Dump a single entry. + */ +void +dump_entry(TERMTYPE2 *tterm, + int suppress_untranslatable, + int limited, + int numbers, + PredFunc pred) +{ + TERMTYPE2 save_tterm; + int critlen; + const char *legend; + bool infodump; + + if (quickdump) { + char bigbuf[65536]; + unsigned offset = 0; + + separator = ""; + trailer = "\n"; + indent = 0; + + if (_nc_write_object(tterm, bigbuf, &offset, sizeof(bigbuf)) == OK) { + char numbuf[80]; + unsigned n; + + if (quickdump & 1) { + if (outbuf.used) + wrap_concat1("\n"); + wrap_concat1("hex:"); + for (n = 0; n < offset; ++n) { + _nc_SPRINTF(numbuf, _nc_SLIMIT(sizeof(numbuf)) + "%02X", UChar(bigbuf[n])); + wrap_concat1(numbuf); + } + } + if (quickdump & 2) { + static const char padding[] = + {0, 0}; + int value = 0; + + if (outbuf.used) + wrap_concat1("\n"); + wrap_concat1("b64:"); + for (n = 0; n < offset; ++n) { + encode_b64(numbuf, bigbuf, n, &value); + wrap_concat1(numbuf); + } + switch (n % 3) { + case 0: + break; + case 1: + encode_b64(numbuf, padding, 1, &value); + wrap_concat1(numbuf); + wrap_concat1("=="); + break; + case 2: + encode_b64(numbuf, padding, 1, &value); + wrap_concat1(numbuf); + wrap_concat1("="); + break; + } + } + } + return; + } + + if (TcOutput()) { + critlen = MAX_TERMCAP_LENGTH; + legend = "older termcap"; + infodump = FALSE; + set_obsolete_termcaps(tterm); + } else { + critlen = MAX_TERMINFO_LENGTH; + legend = "terminfo"; + infodump = TRUE; + } + + save_sgr = set_attributes; + + if ((FMT_ENTRY() > critlen) + && TcOutput() + && limited) { + + save_tterm = *tterm; + if (!suppress_untranslatable) { + SHOW_WHY("# (untranslatable capabilities removed to fit entry within %d bytes)\n", + critlen); + suppress_untranslatable = TRUE; + } + if (FMT_ENTRY() > critlen) { + /* + * We pick on sgr because it is a nice long string capability that + * is really just an optimization hack. Another good candidate is + * acsc since it is both long and unused by BSD termcap. + */ + bool changed = FALSE; + +#if NCURSES_XNAMES + /* + * Extended names are most likely function-key definitions. Drop + * those first. + */ + unsigned n; + for (n = STRCOUNT; n < NUM_STRINGS(tterm); n++) { + const char *name = ExtStrname(tterm, (int) n, strnames); + + if (VALID_STRING(tterm->Strings[n])) { + set_attributes = ABSENT_STRING; + /* we remove long names anyway - only report the short */ + if (strlen(name) <= 2) { + SHOW_WHY("# (%s removed to fit entry within %d bytes)\n", + name, + critlen); + } + changed = TRUE; + if (FMT_ENTRY() <= critlen) + break; + } + } +#endif + if (VALID_STRING(set_attributes)) { + set_attributes = ABSENT_STRING; + SHOW_WHY("# (sgr removed to fit entry within %d bytes)\n", + critlen); + changed = TRUE; + } + if (!changed || (FMT_ENTRY() > critlen)) { + if (purged_acs(tterm)) { + acs_chars = ABSENT_STRING; + SHOW_WHY("# (acsc removed to fit entry within %d bytes)\n", + critlen); + changed = TRUE; + } + } + if (!changed || (FMT_ENTRY() > critlen)) { + int oldversion = tversion; + int len; + + tversion = V_BSD; + SHOW_WHY("# (terminfo-only capabilities suppressed to fit entry within %d bytes)\n", + critlen); + + len = FMT_ENTRY(); + if (len > critlen + && kill_labels(tterm, len - critlen)) { + SHOW_WHY("# (some labels capabilities suppressed to fit entry within %d bytes)\n", + critlen); + len = FMT_ENTRY(); + } + if (len > critlen + && kill_fkeys(tterm, len - critlen)) { + SHOW_WHY("# (some function-key capabilities suppressed to fit entry within %d bytes)\n", + critlen); + len = FMT_ENTRY(); + } + if (len > critlen) { + (void) fprintf(stderr, + "%s: %s entry is %d bytes long\n", + _nc_progname, + _nc_first_name(tterm->term_names), + len); + SHOW_WHY("# WARNING: this entry, %d bytes long, may core-dump %s libraries!\n", + len, legend); + } + tversion = oldversion; + } + set_attributes = save_sgr; + *tterm = save_tterm; + } + } else if (!version_filter(STRING, STR_IDX(acs_chars))) { + save_tterm = *tterm; + if (purged_acs(tterm)) { + (void) FMT_ENTRY(); + } + *tterm = save_tterm; + } +} + +void +dump_uses(const char *value, bool infodump) +/* dump "use=" clauses in the appropriate format */ +{ + char buffer[MAX_TERMINFO_LENGTH + EXTRA_CAP]; + int limit = (VALID_STRING(value) ? (int) strlen(value) : 0); + const char *cap = infodump ? "use" : "tc"; + + if (TcOutput()) + trim_trailing(); + if (limit == 0) { + _nc_warning("empty \"%s\" field", cap); + value = ""; + } else if (limit > MAX_ALIAS) { + _nc_warning("\"%s\" field too long (%d), limit to %d", + cap, limit, MAX_ALIAS); + limit = MAX_ALIAS; + } + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%s=%.*s", cap, limit, value); + wrap_concat1(buffer); +} + +int +show_entry(void) +{ + /* + * Trim any remaining whitespace. + */ + if (outbuf.used != 0) { + bool infodump = !TcOutput(); + char delim = (char) (infodump ? ',' : ':'); + int j; + + for (j = (int) outbuf.used - 1; j > 0; --j) { + char ch = outbuf.text[j]; + if (ch == '\n') { + ; + } else if (isspace(UChar(ch))) { + outbuf.used = (size_t) j; + } else if (!infodump && ch == '\\') { + outbuf.used = (size_t) j; + } else if (ch == delim && (outbuf.text[j - 1] != '\\')) { + outbuf.used = (size_t) (j + 1); + } else { + break; + } + } + outbuf.text[outbuf.used] = '\0'; + } + if (outbuf.text != 0) { + (void) fputs(outbuf.text, stdout); + putchar('\n'); + } + return (int) outbuf.used; +} + +void +compare_entry(PredHook hook, + TERMTYPE2 *tp GCC_UNUSED, + bool quiet) +/* compare two entries */ +{ + PredIdx i, j; + NCURSES_CONST char *name; + + if (!quiet) + fputs(" comparing booleans.\n", stdout); + for_each_boolean(j, tp) { + i = BoolIndirect(j); + name = ExtBoolname(tp, (int) i, bool_names); + + if (isObsolete(outform, name)) + continue; + + (*hook) (CMP_BOOLEAN, i, name); + } + + if (!quiet) + fputs(" comparing numbers.\n", stdout); + for_each_number(j, tp) { + i = NumIndirect(j); + name = ExtNumname(tp, (int) i, num_names); + + if (isObsolete(outform, name)) + continue; + + (*hook) (CMP_NUMBER, i, name); + } + + if (!quiet) + fputs(" comparing strings.\n", stdout); + for_each_string(j, tp) { + i = StrIndirect(j); + name = ExtStrname(tp, (int) i, str_names); + + if (isObsolete(outform, name)) + continue; + + (*hook) (CMP_STRING, i, name); + } + + /* (void) fputs(" comparing use entries.\n", stdout); */ + (*hook) (CMP_USE, 0, "use"); + +} + +#define NOTSET(s) ((s) == 0) + +/* + * This bit of legerdemain turns all the terminfo variable names into + * references to locations in the arrays Booleans, Numbers, and Strings --- + * precisely what's needed. + */ +#undef CUR +#define CUR tp-> + +static void +set_obsolete_termcaps(TERMTYPE2 *tp) +{ +#include "capdefaults.c" +} + +/* + * Convert an alternate-character-set string to canonical form: sorted and + * unique. + */ +void +repair_acsc(TERMTYPE2 *tp) +{ + if (VALID_STRING(acs_chars)) { + size_t n; + char mapped[256]; + unsigned source; + unsigned target; + bool fix_needed = FALSE; + + for (n = 0, source = 0; acs_chars[n] != 0; n++) { + target = UChar(acs_chars[n]); + if (source >= target) { + fix_needed = TRUE; + break; + } + source = target; + if (acs_chars[n + 1]) + n++; + } + + if (fix_needed) { + size_t m; + char extra = 0; + + memset(mapped, 0, sizeof(mapped)); + for (n = 0; acs_chars[n] != 0; n++) { + source = UChar(acs_chars[n]); + if ((target = (unsigned char) acs_chars[n + 1]) != 0) { + mapped[source] = (char) target; + n++; + } else { + extra = (char) source; + } + } + for (n = m = 0; n < sizeof(mapped); n++) { + if (mapped[n]) { + acs_chars[m++] = (char) n; + acs_chars[m++] = mapped[n]; + } + } + if (extra) + acs_chars[m++] = extra; /* garbage in, garbage out */ + acs_chars[m] = 0; + } + } +} diff --git a/contrib/ncurses/progs/dump_entry.h b/contrib/ncurses/progs/dump_entry.h new file mode 100644 index 00000000..39e856fb --- /dev/null +++ b/contrib/ncurses/progs/dump_entry.h @@ -0,0 +1,94 @@ +/**************************************************************************** + * Copyright 2018-2020,2021 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * $Id: dump_entry.h,v 1.44 2021/04/18 19:56:09 tom Exp $ + * + * Dump control definitions and variables + */ + +#ifndef DUMP_ENTRY_H +#define DUMP_ENTRY_H 1 + +#define NCURSES_OPAQUE 0 +#define NCURSES_INTERNALS 1 +#include +#include + +/* capability output formats */ +#define F_TERMINFO 0 /* use terminfo names */ +#define F_VARIABLE 1 /* use C variable names */ +#define F_TERMCAP 2 /* termcap names with capability conversion */ +#define F_TCONVERR 3 /* as T_TERMCAP, no skip of untranslatables */ +#define F_LITERAL 4 /* like F_TERMINFO, but no smart defaults */ + +/* capability sort modes */ +#define S_DEFAULT 0 /* sort by terminfo name (implicit) */ +#define S_NOSORT 1 /* don't sort */ +#define S_TERMINFO 2 /* sort by terminfo names (explicit) */ +#define S_VARIABLE 3 /* sort by C variable names */ +#define S_TERMCAP 4 /* sort by termcap names */ + +/* capability types for the comparison hook */ +#define CMP_BOOLEAN 0 /* comparison on booleans */ +#define CMP_NUMBER 1 /* comparison on numerics */ +#define CMP_STRING 2 /* comparison on strings */ +#define CMP_USE 3 /* comparison on use capabilities */ + +#ifndef _TERMSORT_H +typedef unsigned PredType; +typedef unsigned PredIdx; +#endif + +typedef int (*PredFunc) (PredType, PredIdx); +typedef void (*PredHook) (PredType, PredIdx, const char *); + +extern NCURSES_CONST char *nametrans(const char *); +extern bool has_params(const char *, bool); +extern int fmt_entry(TERMTYPE2 *, PredFunc, int, int, int, int); +extern int show_entry(void); +extern void compare_entry(PredHook, TERMTYPE2 *, bool); +extern void dump_entry(TERMTYPE2 *, int, int, int, PredFunc); +extern void dump_init(const char *, int, int, bool, int, int, unsigned, bool, + bool, int); +extern void dump_uses(const char *, bool); +extern void repair_acsc(TERMTYPE2 *tp); + +#define L_CURL "{" +#define R_CURL "}" + +#define FAIL -1 + +#endif /* DUMP_ENTRY_H */ diff --git a/contrib/ncurses/progs/infocmp.c b/contrib/ncurses/progs/infocmp.c new file mode 100644 index 00000000..f763ac54 --- /dev/null +++ b/contrib/ncurses/progs/infocmp.c @@ -0,0 +1,2026 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * infocmp.c -- decompile an entry, or compare two entries + * written by Eric S. Raymond + * and Thomas E Dickey + */ + +#include + +#include + +MODULE_ID("$Id: infocmp.c,v 1.166 2024/10/19 21:43:11 tom Exp $") + +#ifndef ACTUAL_TIC +#define ACTUAL_TIC "tic" +#endif + +#define MAX_STRING 1024 /* maximum formatted string */ + +const char *_nc_progname = "infocmp"; + +typedef char path[PATH_MAX]; + +/*************************************************************************** + * + * The following control variables, together with the contents of the + * terminfo entries, completely determine the actions of the program. + * + ***************************************************************************/ + +static ENTRY *entries; /* terminfo entries */ +static int termcount; /* count of terminal entries */ + +static const char usage_string[] = \ +"Usage: %s [options] [-A directory] [-B directory] [termname...]"; + +static bool limited = TRUE; /* "-r" option is not set */ +static bool quiet = FALSE; +static bool literal = FALSE; +static const char *bool_sep = ":"; +static const char *s_absent = "NULL"; +static const char *s_cancel = "NULL"; +static const char *tversion; /* terminfo version selected */ +static unsigned itrace; /* trace flag for debugging */ +static int mwidth = 60; +static int mheight = 65535; +static int numbers = 0; /* format "%'char'" to/from "%{number}" */ +static int outform = F_TERMINFO; /* output format */ +static int sortmode; /* sort_mode */ + +/* main comparison mode */ +static int compare; +#define C_DEFAULT 0 /* don't force comparison mode */ +#define C_DIFFERENCE 1 /* list differences between two terminals */ +#define C_COMMON 2 /* list common capabilities */ +#define C_NAND 3 /* list capabilities in neither terminal */ +#define C_USEALL 4 /* generate relative use-form entry */ +static bool ignorepads; /* ignore pad prefixes when diffing */ + +#if NO_LEAKS + +typedef struct { + ENTRY *head; + ENTRY *tail; +} ENTERED; + +static ENTERED *entered; + +#undef ExitProgram +static GCC_NORETURN void ExitProgram(int code); +/* prototype is to get gcc to accept the noreturn attribute */ +static void +ExitProgram(int code) +{ + int n; + + for (n = 0; n < termcount; ++n) { + ENTRY *new_head = _nc_head; + ENTRY *new_tail = _nc_tail; + _nc_head = entered[n].head; + _nc_tail = entered[n].tail; + _nc_free_entries(entered[n].head); + _nc_head = new_head; + _nc_tail = new_tail; + } + _nc_leaks_dump_entry(); + free(entries); + free(entered); + _nc_free_tic(code); +} +#endif + +static void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + +static void +canonical_name(const char *source, char *target) +/* extract the terminal type's primary name */ +{ + int limit = NAMESIZE; + + while (--limit > 0) { + char ch = *source++; + if (ch == '|') + break; + *target++ = ch; + } + *target = '\0'; +} + +static bool +no_boolean(int value) +{ + bool result = (value == ABSENT_BOOLEAN); + if (!strcmp(s_absent, s_cancel)) + result = !VALID_BOOLEAN(value); + return result; +} + +static bool +no_numeric(int value) +{ + bool result = (value == ABSENT_NUMERIC); + if (!strcmp(s_absent, s_cancel)) + result = !VALID_NUMERIC(value); + return result; +} + +static bool +no_string(const char *const value) +{ + bool result = (value == ABSENT_STRING); + if (!strcmp(s_absent, s_cancel)) + result = !VALID_STRING(value); + return result; +} + +/*************************************************************************** + * + * Predicates for dump function + * + ***************************************************************************/ + +static int +capcmp(PredIdx idx, const char *s, const char *t) +/* capability comparison function */ +{ + if (!VALID_STRING(s) && !VALID_STRING(t)) + return (s != t); + else if (!VALID_STRING(s) || !VALID_STRING(t)) + return (1); + + if ((idx == acs_chars_index) || !ignorepads) + return (strcmp(s, t)); + else + return (_nc_capcmp(s, t)); +} + +/* + * Predicate function to use for "use=" decompilation. + * + * Return value is used in fmt_entry: + * FAIL show nothing for this capability. + * FALSE show cancel for booleans (a compromise) + * TRUE show capability + * + * The only difference between FALSE/TRUE returns is in the treatment of + * booleans. + */ +static int +use_predicate(unsigned type, PredIdx idx) +{ + int result = FAIL; + ENTRY *ep; + + switch (type) { + case BOOLEAN: + { + /* + * This assumes that multiple use entries are supposed + * to contribute the logical or of their boolean capabilities. + * This is true if we take the semantics of multiple uses to + * be 'each capability gets the first non-default value found + * in the sequence of use entries'. + * + * Note that cancelled or absent booleans are stored as FALSE, + * unlike numbers and strings, whose cancelled/absent state is + * recorded in the terminfo database. + */ + if (idx < NUM_BOOLEANS(&(entries[0].tterm))) { + int is_set = FALSE; + + for (ep = &entries[1]; ep < entries + termcount; ep++) { + if (idx < NUM_BOOLEANS(&(ep->tterm)) + && (is_set = ep->tterm.Booleans[idx])) { + break; + } + } + if (is_set != entries[0].tterm.Booleans[idx]) + result = (!is_set); + } + } + break; + + case NUMBER: + { + /* + * We take the semantics of multiple uses to be 'each + * capability gets the first non-default value found + * in the sequence of use entries'. + */ + if (idx < NUM_NUMBERS(&(entries[0].tterm))) { + int value = ABSENT_NUMERIC; + + for (ep = &entries[1]; ep < entries + termcount; ep++) + if (idx < NUM_NUMBERS(&(ep->tterm)) + && VALID_NUMERIC(ep->tterm.Numbers[idx])) { + value = ep->tterm.Numbers[idx]; + break; + } + + if (value != entries[0].tterm.Numbers[idx]) + result = (value != ABSENT_NUMERIC); + } + } + break; + + case STRING: + { + const char *termstr = entries[0].tterm.Strings[idx]; + const char *usestr = ABSENT_STRING; + + /* + * We take the semantics of multiple uses to be 'each + * capability gets the first non-default value found + * in the sequence of use entries'. + */ + if (idx < NUM_STRINGS(&(entries[0].tterm))) { + for (ep = &entries[1]; ep < entries + termcount; ep++) + if (idx < NUM_STRINGS(&(ep->tterm)) + && ep->tterm.Strings[idx]) { + usestr = ep->tterm.Strings[idx]; + break; + } + + if (usestr == CANCELLED_STRING && termstr == ABSENT_STRING) + result = (FAIL); + else if (usestr == CANCELLED_STRING && termstr == CANCELLED_STRING) + result = (TRUE); + else if (usestr == ABSENT_STRING && termstr == ABSENT_STRING) + result = (FAIL); + else if (!usestr || !termstr || capcmp(idx, usestr, termstr)) + result = (TRUE); + } + } + break; + + default: + result = FALSE; + break; + } + + return (result); +} + +static bool +useeq(const ENTRY * e1, const ENTRY * e2) +/* are the use references in two entries equivalent? */ +{ + unsigned i, j; + + if (e1->nuses != e2->nuses) + return (FALSE); + + /* Ugh...this is quadratic again */ + for (i = 0; i < e1->nuses; i++) { + bool foundmatch = FALSE; + + /* search second entry for given use reference */ + for (j = 0; j < e2->nuses; j++) + if (!strcmp(e1->uses[i].name, e2->uses[j].name)) { + foundmatch = TRUE; + break; + } + + if (!foundmatch) + return (FALSE); + } + + return (TRUE); +} + +static bool +entryeq(const TERMTYPE2 *t1, const TERMTYPE2 *t2) +/* are two entries equivalent? */ +{ + unsigned i; + + for (i = 0; i < NUM_BOOLEANS(t1); i++) + if (t1->Booleans[i] != t2->Booleans[i]) + return (FALSE); + + for (i = 0; i < NUM_NUMBERS(t1); i++) + if (t1->Numbers[i] != t2->Numbers[i]) + return (FALSE); + + for (i = 0; i < NUM_STRINGS(t1); i++) + if (capcmp((PredIdx) i, t1->Strings[i], t2->Strings[i])) + return (FALSE); + + return (TRUE); +} + +#define TIC_EXPAND(result) _nc_tic_expand(result, outform==F_TERMINFO, numbers) + +static void +print_uses(const ENTRY * ep, FILE *fp) +/* print an entry's use references */ +{ + if (!ep->nuses) { + fputs("NULL", fp); + } else { + unsigned i; + + for (i = 0; i < ep->nuses; i++) { + fputs(ep->uses[i].name, fp); + if (i < ep->nuses - 1) + fputs(" ", fp); + } + } +} + +static const char * +dump_boolean(int val) +/* display the value of a boolean capability */ +{ + switch (val) { + case ABSENT_BOOLEAN: + return (s_absent); + case CANCELLED_BOOLEAN: + return (s_cancel); + case FALSE: + return ("F"); + case TRUE: + return ("T"); + default: + return ("?"); + } +} + +static void +dump_numeric(int val, char *buf) +/* display the value of a numeric capability */ +{ + switch (val) { + case ABSENT_NUMERIC: + _nc_STRCPY(buf, s_absent, MAX_STRING); + break; + case CANCELLED_NUMERIC: + _nc_STRCPY(buf, s_cancel, MAX_STRING); + break; + default: + _nc_SPRINTF(buf, _nc_SLIMIT(MAX_STRING) "%d", val); + break; + } +} + +static void +dump_string(const char *val, char *buf) +/* display the value of a string capability */ +{ + if (val == ABSENT_STRING) + _nc_STRCPY(buf, s_absent, MAX_STRING); + else if (val == CANCELLED_STRING) + _nc_STRCPY(buf, s_cancel, MAX_STRING); + else { + _nc_SPRINTF(buf, _nc_SLIMIT(MAX_STRING) + "'%.*s'", MAX_STRING - 3, TIC_EXPAND(val)); + } +} + +/* + * Show "comparing..." message for the given terminal names. + */ +static void +show_comparing(char **names) +{ + if (itrace) { + switch (compare) { + case C_DIFFERENCE: + (void) fprintf(stderr, "%s: dumping differences\n", _nc_progname); + break; + + case C_COMMON: + (void) fprintf(stderr, "%s: dumping common capabilities\n", _nc_progname); + break; + + case C_NAND: + (void) fprintf(stderr, "%s: dumping differences\n", _nc_progname); + break; + } + } + if (*names) { + printf("comparing %s", *names++); + if (*names) { + printf(" to %s", *names++); + while (*names) { + printf(", %s", *names++); + } + } + printf(".\n"); + } +} + +/* + * ncurses stores two types of non-standard capabilities: + * a) capabilities listed past the "STOP-HERE" comment in the Caps file. + * These are used in the terminfo source file to provide data for termcaps, + * e.g., when there is no equivalent capability in terminfo, as well as for + * widely-used non-standard capabilities. + * b) user-definable capabilities, via "tic -x". + * + * However, if "-x" is omitted from the tic command, both types of + * non-standard capability are not loaded into the terminfo database. This + * macro is used for limit-checks against the symbols that tic uses to omit + * the two types of non-standard entry. + */ +#if NCURSES_XNAMES +#define check_user_definable(n,limit) if (!_nc_user_definable && (n) > (limit)) break +#else +#define check_user_definable(n,limit) if ((n) > (limit)) break +#endif + +/* + * Use these macros to simplify loops on C_COMMON and C_NAND: + */ +#define for_each_entry() while (entries[extra].tterm.term_names) +#define next_entry (&(entries[extra++].tterm)) + +static void +compare_predicate(PredType type, PredIdx idx, const char *name) +/* predicate function to use for entry difference reports */ +{ + const ENTRY *e1 = &entries[0]; + const ENTRY *e2 = &entries[1]; + char buf1[MAX_STRING]; + char buf2[MAX_STRING]; + int b1, b2; + int n1, n2; + const char *s1, *s2; + bool found; + int extra = 1; + + switch (type) { + case CMP_BOOLEAN: + check_user_definable(idx, BOOLWRITE); + b1 = e1->tterm.Booleans[idx]; + switch (compare) { + case C_DIFFERENCE: + b2 = next_entry->Booleans[idx]; + if (!(no_boolean(b1) && no_boolean(b2)) && (b1 != b2)) + (void) printf("\t%s: %s%s%s.\n", + name, + dump_boolean(b1), + bool_sep, + dump_boolean(b2)); + break; + + case C_COMMON: + if (b1 != ABSENT_BOOLEAN) { + found = TRUE; + for_each_entry() { + b2 = next_entry->Booleans[idx]; + if (b1 != b2) { + found = FALSE; + break; + } + } + if (found) { + (void) printf("\t%s= %s.\n", name, dump_boolean(b1)); + } + } + break; + + case C_NAND: + if (b1 == ABSENT_BOOLEAN) { + found = TRUE; + for_each_entry() { + b2 = next_entry->Booleans[idx]; + if (b1 != b2) { + found = FALSE; + break; + } + } + if (found) { + (void) printf("\t!%s.\n", name); + } + } + break; + } + break; + + case CMP_NUMBER: + check_user_definable(idx, NUMWRITE); + n1 = e1->tterm.Numbers[idx]; + switch (compare) { + case C_DIFFERENCE: + n2 = next_entry->Numbers[idx]; + if (!(no_numeric(n1) && no_numeric(n2)) && n1 != n2) { + dump_numeric(n1, buf1); + dump_numeric(n2, buf2); + (void) printf("\t%s: %s, %s.\n", name, buf1, buf2); + } + break; + + case C_COMMON: + if (n1 != ABSENT_NUMERIC) { + found = TRUE; + for_each_entry() { + n2 = next_entry->Numbers[idx]; + if (n1 != n2) { + found = FALSE; + break; + } + } + if (found) { + dump_numeric(n1, buf1); + (void) printf("\t%s= %s.\n", name, buf1); + } + } + break; + + case C_NAND: + if (n1 == ABSENT_NUMERIC) { + found = TRUE; + for_each_entry() { + n2 = next_entry->Numbers[idx]; + if (n1 != n2) { + found = FALSE; + break; + } + } + if (found) { + (void) printf("\t!%s.\n", name); + } + } + break; + } + break; + + case CMP_STRING: + check_user_definable(idx, STRWRITE); + s1 = e1->tterm.Strings[idx]; + switch (compare) { + case C_DIFFERENCE: + s2 = next_entry->Strings[idx]; + if (!(no_string(s1) && no_string(s2)) && capcmp(idx, s1, s2)) { + dump_string(s1, buf1); + dump_string(s2, buf2); + if (strcmp(buf1, buf2)) + (void) printf("\t%s: %s, %s.\n", name, buf1, buf2); + } + break; + + case C_COMMON: + if (s1 != ABSENT_STRING) { + found = TRUE; + for_each_entry() { + s2 = next_entry->Strings[idx]; + if (capcmp(idx, s1, s2) != 0) { + found = FALSE; + break; + } + } + if (found) { + (void) printf("\t%s= '%s'.\n", name, TIC_EXPAND(s1)); + } + } + break; + + case C_NAND: + if (s1 == ABSENT_STRING) { + found = TRUE; + for_each_entry() { + s2 = next_entry->Strings[idx]; + if (s2 != s1) { + found = FALSE; + break; + } + } + if (found) { + (void) printf("\t!%s.\n", name); + } + } + break; + } + break; + + case CMP_USE: + /* unlike the other modes, this compares *all* use entries */ + switch (compare) { + case C_DIFFERENCE: + if (!useeq(e1, e2)) { + (void) fputs("\tuse: ", stdout); + print_uses(e1, stdout); + fputs(", ", stdout); + print_uses(e2, stdout); + fputs(".\n", stdout); + } + break; + + case C_COMMON: + if (e1->nuses) { + found = TRUE; + for_each_entry() { + e2 = &entries[extra++]; + if (e2->nuses != e1->nuses || !useeq(e1, e2)) { + found = FALSE; + break; + } + } + if (found) { + (void) fputs("\tuse: ", stdout); + print_uses(e1, stdout); + fputs(".\n", stdout); + } + } + break; + + case C_NAND: + if (!e1->nuses) { + found = TRUE; + for_each_entry() { + e2 = &entries[extra++]; + if (e2->nuses != e1->nuses) { + found = FALSE; + break; + } + } + if (found) { + (void) printf("\t!use.\n"); + } + } + break; + } + } +} + +/*************************************************************************** + * + * Init string analysis + * + ***************************************************************************/ + +#define DATA(from, to) { { from }, { to } } +#define DATAX() DATA("", "") + +typedef struct { + const char from[4]; + const char to[12]; +} assoc; + +static const assoc std_caps[] = +{ + /* these are specified by X.364 and iBCS2 */ + DATA("\033c", "RIS"), /* full reset */ + DATA("\0337", "SC"), /* save cursor */ + DATA("\0338", "RC"), /* restore cursor */ + DATA("\033[r", "RSR"), /* not an X.364 mnemonic */ + DATA("\033[m", "SGR0"), /* not an X.364 mnemonic */ + DATA("\033[2J", "ED2"), /* clear page */ + + /* this group is specified by ISO 2022 */ + DATA("\033(0", "ISO DEC G0"), /* enable DEC graphics for G0 */ + DATA("\033(A", "ISO UK G0"), /* enable UK chars for G0 */ + DATA("\033(B", "ISO US G0"), /* enable US chars for G0 */ + DATA("\033)0", "ISO DEC G1"), /* enable DEC graphics for G1 */ + DATA("\033)A", "ISO UK G1"), /* enable UK chars for G1 */ + DATA("\033)B", "ISO US G1"), /* enable US chars for G1 */ + + /* these are DEC private controls widely supported by emulators */ + DATA("\033=", "DECPAM"), /* application keypad mode */ + DATA("\033>", "DECPNM"), /* normal keypad mode */ + DATA("\033<", "DECANSI"), /* enter ANSI mode */ + DATA("\033[!p", "DECSTR"), /* soft reset */ + DATA("\033 F", "S7C1T"), /* 7-bit controls */ + + DATAX() +}; + +static const assoc std_modes[] = +/* ECMA \E[ ... [hl] modes recognized by many emulators */ +{ + DATA("2", "AM"), /* keyboard action mode */ + DATA("4", "IRM"), /* insert/replace mode */ + DATA("12", "SRM"), /* send/receive mode */ + DATA("20", "LNM"), /* linefeed mode */ + DATAX() +}; + +static const assoc private_modes[] = +/* DEC \E[ ... [hl] modes recognized by many emulators */ +{ + DATA("1", "CKM"), /* application cursor keys */ + DATA("2", "ANM"), /* set VT52 mode */ + DATA("3", "COLM"), /* 132-column mode */ + DATA("4", "SCLM"), /* smooth scroll */ + DATA("5", "SCNM"), /* reverse video mode */ + DATA("6", "OM"), /* origin mode */ + DATA("7", "AWM"), /* wraparound mode */ + DATA("8", "ARM"), /* auto-repeat mode */ + DATAX() +}; + +static const assoc ecma_highlights[] = +/* recognize ECMA attribute sequences */ +{ + DATA("0", "NORMAL"), /* normal */ + DATA("1", "+BOLD"), /* bold on */ + DATA("2", "+DIM"), /* dim on */ + DATA("3", "+ITALIC"), /* italic on */ + DATA("4", "+UNDERLINE"), /* underline on */ + DATA("5", "+BLINK"), /* blink on */ + DATA("6", "+FASTBLINK"), /* fastblink on */ + DATA("7", "+REVERSE"), /* reverse on */ + DATA("8", "+INVISIBLE"), /* invisible on */ + DATA("9", "+DELETED"), /* deleted on */ + DATA("10", "MAIN-FONT"), /* select primary font */ + DATA("11", "ALT-FONT-1"), /* select alternate font 1 */ + DATA("12", "ALT-FONT-2"), /* select alternate font 2 */ + DATA("13", "ALT-FONT-3"), /* select alternate font 3 */ + DATA("14", "ALT-FONT-4"), /* select alternate font 4 */ + DATA("15", "ALT-FONT-5"), /* select alternate font 5 */ + DATA("16", "ALT-FONT-6"), /* select alternate font 6 */ + DATA("17", "ALT-FONT-7"), /* select alternate font 7 */ + DATA("18", "ALT-FONT-1"), /* select alternate font 1 */ + DATA("19", "ALT-FONT-1"), /* select alternate font 1 */ + DATA("20", "FRAKTUR"), /* Fraktur font */ + DATA("21", "DOUBLEUNDER"), /* double underline */ + DATA("22", "-DIM"), /* dim off */ + DATA("23", "-ITALIC"), /* italic off */ + DATA("24", "-UNDERLINE"), /* underline off */ + DATA("25", "-BLINK"), /* blink off */ + DATA("26", "-FASTBLINK"), /* fastblink off */ + DATA("27", "-REVERSE"), /* reverse off */ + DATA("28", "-INVISIBLE"), /* invisible off */ + DATA("29", "-DELETED"), /* deleted off */ + DATAX() +}; + +#undef DATA + +static int +skip_csi(const char *cap) +{ + int result = 0; + if (cap[0] == '\033' && cap[1] == '[') + result = 2; + else if (UChar(cap[0]) == 0233) + result = 1; + return result; +} + +static bool +same_param(const char *table, const char *param, size_t length) +{ + bool result = FALSE; + if (strncmp(table, param, length) == 0) { + result = !isdigit(UChar(param[length])); + } + return result; +} + +static char * +lookup_params(const assoc * table, char *dst, char *src) +{ + char *result = 0; + const char *ep = strtok(src, ";"); + + if (ep != 0) { + const assoc *ap; + + do { + bool found = FALSE; + + for (ap = table; ap->from[0]; ap++) { + size_t tlen = strlen(ap->from); + + if (same_param(ap->from, ep, tlen)) { + _nc_STRCAT(dst, ap->to, MAX_TERMINFO_LENGTH); + found = TRUE; + break; + } + } + + if (!found) + _nc_STRCAT(dst, ep, MAX_TERMINFO_LENGTH); + _nc_STRCAT(dst, ";", MAX_TERMINFO_LENGTH); + } while + ((ep = strtok((char *) 0, ";"))); + + dst[strlen(dst) - 1] = '\0'; + + result = dst; + } + return result; +} + +static void +analyze_string(const char *name, const char *cap, TERMTYPE2 *tp) +{ + char buf2[MAX_TERMINFO_LENGTH]; + const char *sp; + const assoc *ap; + int tp_lines = tp->Numbers[2]; + + if (!VALID_STRING(cap)) + return; + (void) printf("%s: ", name); + + for (sp = cap; *sp; sp++) { + int i; + int csi; + size_t len = 0; + size_t next; + const char *expansion = 0; + char buf3[MAX_TERMINFO_LENGTH]; + + /* first, check other capabilities in this entry */ + for (i = 0; i < STRCOUNT; i++) { + const char *cp = tp->Strings[i]; + + /* don't use function-key capabilities */ + if (strnames[i] == NULL) + continue; + if (strnames[i][0] == 'k' && strnames[i][1] == 'f') + continue; + + if (VALID_STRING(cp) && + cp[0] != '\0' && + cp != cap) { + len = strlen(cp); + _nc_STRNCPY(buf2, sp, len); + buf2[len] = '\0'; + + if (_nc_capcmp(cp, buf2)) + continue; + +#define ISRS(s) (!strncmp((s), "is", (size_t) 2) || !strncmp((s), "rs", (size_t) 2)) + /* + * Theoretically we just passed the test for translation + * (equality once the padding is stripped). However, there + * are a few more hoops that need to be jumped so that + * identical pairs of initialization and reset strings + * don't just refer to each other. + */ + if (ISRS(name) || ISRS(strnames[i])) + if (cap < cp) + continue; +#undef ISRS + + expansion = strnames[i]; + break; + } + } + + /* now check the standard capabilities */ + if (!expansion) { + csi = skip_csi(sp); + for (ap = std_caps; ap->from[0]; ap++) { + size_t adj = (size_t) (csi ? 2 : 0); + + len = strlen(ap->from); + if (csi && skip_csi(ap->from) != csi) + continue; + if (len > adj + && strncmp(ap->from + adj, sp + csi, len - adj) == 0) { + expansion = ap->to; + len -= adj; + len += (size_t) csi; + break; + } + } + } + + /* now check for standard-mode sequences */ + if (!expansion + && (csi = skip_csi(sp)) != 0 + && (len = (strspn) (sp + csi, "0123456789;")) + && (len < sizeof(buf3)) + && (next = (size_t) csi + len) + && ((sp[next] == 'h') || (sp[next] == 'l'))) { + + _nc_STRCPY(buf2, + ((sp[next] == 'h') + ? "ECMA+" + : "ECMA-"), + sizeof(buf2)); + _nc_STRNCPY(buf3, sp + csi, len); + buf3[len] = '\0'; + + expansion = lookup_params(std_modes, buf2, buf3); + } + + /* now check for private-mode sequences */ + if (!expansion + && (csi = skip_csi(sp)) != 0 + && sp[csi] == '?' + && (len = (strspn) (sp + csi + 1, "0123456789;")) + && (len < sizeof(buf3)) + && (next = (size_t) csi + 1 + len) + && ((sp[next] == 'h') || (sp[next] == 'l'))) { + + _nc_STRCPY(buf2, + ((sp[next] == 'h') + ? "DEC+" + : "DEC-"), + sizeof(buf2)); + _nc_STRNCPY(buf3, sp + csi + 1, len); + buf3[len] = '\0'; + + expansion = lookup_params(private_modes, buf2, buf3); + } + + /* now check for ECMA highlight sequences */ + if (!expansion + && (csi = skip_csi(sp)) != 0 + && (len = (strspn) (sp + csi, "0123456789;")) != 0 + && (len < sizeof(buf3)) + && (next = (size_t) csi + len) + && sp[next] == 'm') { + + _nc_STRCPY(buf2, "SGR:", sizeof(buf2)); + _nc_STRNCPY(buf3, sp + csi, len); + buf3[len] = '\0'; + len += (size_t) csi + 1; + + expansion = lookup_params(ecma_highlights, buf2, buf3); + } + + if (!expansion + && (csi = skip_csi(sp)) != 0 + && sp[csi] == 'm') { + len = (size_t) csi + 1; + _nc_STRCPY(buf2, "SGR:", sizeof(buf2)); + _nc_STRCAT(buf2, ecma_highlights[0].to, sizeof(buf2)); + expansion = buf2; + } + + /* now check for scroll region reset */ + if (!expansion + && (csi = skip_csi(sp)) != 0) { + if (sp[csi] == 'r') { + expansion = "RSR"; + len = 1; + } else { + _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "1;%dr", tp_lines); + len = strlen(buf2); + if (strncmp(buf2, sp + csi, len) == 0) + expansion = "RSR"; + } + len += (size_t) csi; + } + + /* now check for home-down */ + if (!expansion + && (csi = skip_csi(sp)) != 0) { + _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "%d;1H", tp_lines); + len = strlen(buf2); + if (strncmp(buf2, sp + csi, len) == 0) { + expansion = "LL"; + } else { + _nc_SPRINTF(buf2, _nc_SLIMIT(sizeof(buf2)) "%dH", tp_lines); + len = strlen(buf2); + if (strncmp(buf2, sp + csi, len) == 0) { + expansion = "LL"; + } + } + len += (size_t) csi; + } + + /* now look at the expansion we got, if any */ + if (expansion) { + printf("{%s}", expansion); + sp += len - 1; + } else { + /* couldn't match anything */ + buf2[0] = *sp; + buf2[1] = '\0'; + fputs(TIC_EXPAND(buf2), stdout); + } + } + putchar('\n'); +} + +/*************************************************************************** + * + * File comparison + * + ***************************************************************************/ + +static void +file_comparison(int argc, char *argv[]) +{ +#define MAXCOMPARE 2 + /* someday we may allow comparisons on more files */ + int filecount = 0; + ENTRY *heads[MAXCOMPARE]; + ENTRY *qp, *rp; + int i, n; + + memset(heads, 0, sizeof(heads)); + dump_init((char *) 0, F_LITERAL, S_TERMINFO, + FALSE, 0, 65535, itrace, FALSE, FALSE, FALSE); + + for (n = 0; n < argc && n < MAXCOMPARE; n++) { + if (freopen(argv[n], "r", stdin) == 0) + _nc_err_abort("Can't open %s", argv[n]); + +#if NO_LEAKS + entered[n].head = _nc_head; + entered[n].tail = _nc_tail; +#endif + _nc_head = _nc_tail = 0; + + /* parse entries out of the source file */ + _nc_set_source(argv[n]); + _nc_read_entry_source(stdin, NULL, TRUE, literal, NULLHOOK); + + if (itrace) + (void) fprintf(stderr, "Resolving file %d...\n", n - 0); + + /* maybe do use resolution */ + if (!_nc_resolve_uses2(!limited, literal)) { + (void) fprintf(stderr, + "There are unresolved use entries in %s:\n", + argv[n]); + for_entry_list(qp) { + if (qp->nuses) { + (void) fputs(qp->tterm.term_names, stderr); + (void) fputc('\n', stderr); + } + } + ExitProgram(EXIT_FAILURE); + } + + heads[filecount] = _nc_head; + filecount++; + } + + /* OK, all entries are in core. Ready to do the comparison */ + if (itrace) + (void) fprintf(stderr, "Entries are now in core...\n"); + + /* The entry-matching loop. Sigh, this is intrinsically quadratic. */ + for (qp = heads[0]; qp; qp = qp->next) { + for (rp = heads[1]; rp; rp = rp->next) + if (_nc_entry_match(qp->tterm.term_names, rp->tterm.term_names)) { + if (qp->ncrosslinks < MAX_CROSSLINKS) + qp->crosslinks[qp->ncrosslinks] = rp; + qp->ncrosslinks++; + + if (rp->ncrosslinks < MAX_CROSSLINKS) + rp->crosslinks[rp->ncrosslinks] = qp; + rp->ncrosslinks++; + } + } + + /* now we have two circular lists with crosslinks */ + if (itrace) + (void) fprintf(stderr, "Name matches are done...\n"); + + for (qp = heads[0]; qp; qp = qp->next) { + if (qp->ncrosslinks > 1) { + (void) fprintf(stderr, + "%s in file 1 (%s) has %d matches in file 2 (%s):\n", + _nc_first_name(qp->tterm.term_names), + argv[0], + qp->ncrosslinks, + argv[1]); + for (i = 0; i < qp->ncrosslinks; i++) + (void) fprintf(stderr, + "\t%s\n", + _nc_first_name((qp->crosslinks[i])->tterm.term_names)); + } + } + + for (rp = heads[1]; rp; rp = rp->next) { + if (rp->ncrosslinks > 1) { + (void) fprintf(stderr, + "%s in file 2 (%s) has %d matches in file 1 (%s):\n", + _nc_first_name(rp->tterm.term_names), + argv[1], + rp->ncrosslinks, + argv[0]); + for (i = 0; i < rp->ncrosslinks; i++) + (void) fprintf(stderr, + "\t%s\n", + _nc_first_name((rp->crosslinks[i])->tterm.term_names)); + } + } + + (void) printf("In file 1 (%s) only:\n", argv[0]); + for (qp = heads[0]; qp; qp = qp->next) + if (qp->ncrosslinks == 0) + (void) printf("\t%s\n", + _nc_first_name(qp->tterm.term_names)); + + (void) printf("In file 2 (%s) only:\n", argv[1]); + for (rp = heads[1]; rp; rp = rp->next) + if (rp->ncrosslinks == 0) + (void) printf("\t%s\n", + _nc_first_name(rp->tterm.term_names)); + + (void) printf("The following entries are equivalent:\n"); + for (qp = heads[0]; qp; qp = qp->next) { + if (qp->ncrosslinks == 1) { + rp = qp->crosslinks[0]; + + repair_acsc(&qp->tterm); + repair_acsc(&rp->tterm); +#if NCURSES_XNAMES + _nc_align_termtype(&qp->tterm, &rp->tterm); +#endif + if (entryeq(&qp->tterm, &rp->tterm) && useeq(qp, rp)) { + char name1[NAMESIZE], name2[NAMESIZE]; + + canonical_name(qp->tterm.term_names, name1); + canonical_name(rp->tterm.term_names, name2); + + (void) printf("%s = %s\n", name1, name2); + } + } + } + + (void) printf("Differing entries:\n"); + termcount = 2; + for (qp = heads[0]; qp; qp = qp->next) { + + if (qp->ncrosslinks == 1) { + rp = qp->crosslinks[0]; +#if NCURSES_XNAMES + /* sorry - we have to do this on each pass */ + _nc_align_termtype(&qp->tterm, &rp->tterm); +#endif + if (!(entryeq(&qp->tterm, &rp->tterm) && useeq(qp, rp))) { + char name1[NAMESIZE], name2[NAMESIZE]; + char *names[3]; + + names[0] = name1; + names[1] = name2; + names[2] = 0; + + entries[0] = *qp; + entries[1] = *rp; + + canonical_name(qp->tterm.term_names, name1); + canonical_name(rp->tterm.term_names, name2); + + switch (compare) { + case C_DIFFERENCE: + show_comparing(names); + compare_entry(compare_predicate, &entries->tterm, quiet); + break; + + case C_COMMON: + show_comparing(names); + compare_entry(compare_predicate, &entries->tterm, quiet); + break; + + case C_NAND: + show_comparing(names); + compare_entry(compare_predicate, &entries->tterm, quiet); + break; + + } + } + } + } +} + +static void +usage(void) +{ +#define DATA(s) s "\n" + static const char head[] = + { + DATA("") + DATA("Options:") + }; +#undef DATA + /* length is given here so the compiler can make everything readonly */ +#define DATA(s) s + static const char options[][46] = + { + " -0 print single-row" + ," -1 print single-column" + ," -C use termcap-names" + ," -D print database locations" + ," -E format output as C tables" + ," -F compare terminfo-files" + ," -G format %{number} to %'char'" + ," -I use terminfo-names" + ," -K use termcap-names and BSD syntax" + ," -L use long names" + ," -R subset (see manpage)" + ," -T eliminate size limits (test)" + ," -U do not post-process entries" + ," -V print version" + ," -W wrap long strings per -w[n]" +#if NCURSES_XNAMES + ," -a with -F, list commented-out caps" +#endif + ," -c list common capabilities" + ," -d list different capabilities" + ," -e format output for C initializer" + ," -f with -1, format complex strings" + ," -g format %'char' to %{number}" + ," -i analyze initialization/reset" + ," -l output terminfo names" + ," -n list capabilities in neither" + ," -p ignore padding specifiers" + ," -Q number dump compiled description" + ," -q brief listing, removes headers" + ," -r with -C, output in termcap form" + ," -r with -F, resolve use-references" + ," -s [d|i|l|c] sort fields" +#if NCURSES_XNAMES + ," -t suppress commented-out capabilities" +#endif + ," -u produce source with 'use='" + ," -v number (verbose)" + ," -w number (width)" +#if NCURSES_XNAMES + ," -x unknown capabilities are user-defined" +#endif + }; +#undef DATA + const size_t last = SIZEOF(options); + const size_t left = (last + 1) / 2; + size_t n; + FILE *fp = stderr; + + fprintf(fp, usage_string, _nc_progname); + fputs(head, fp); + for (n = 0; n < left; n++) { + size_t m = n + left; + if (m < last) + fprintf(fp, "%-40.40s%s\n", options[n], options[m]); + else + fprintf(fp, "%s\n", options[n]); + } + ExitProgram(EXIT_FAILURE); +} + +static char * +any_initializer(const char *fmt, const char *type) +{ + static char *initializer; + static size_t need; + char *s; + + if (initializer == 0) { + need = (strlen(entries->tterm.term_names) + + strlen(type) + + strlen(fmt)); + initializer = (char *) malloc(need + 1); + if (initializer == 0) + failed("any_initializer"); + } + + _nc_STRCPY(initializer, entries->tterm.term_names, need); + for (s = initializer; *s != 0 && *s != '|'; s++) { + if (!isalnum(UChar(*s))) + *s = '_'; + } + *s = 0; + _nc_SPRINTF(s, _nc_SLIMIT(need) fmt, type); + return initializer; +} + +static char * +name_initializer(const char *type) +{ + return any_initializer("_%s_data", type); +} + +static char * +string_variable(const char *type) +{ + return any_initializer("_s_%s", type); +} + +/* dump C initializers for the terminal type */ +static void +dump_initializers(const TERMTYPE2 *term) +{ + unsigned n; + const char *str = 0; + + printf("\nstatic char %s[] = \"%s\";\n\n", + name_initializer("alias"), entries->tterm.term_names); + + for_each_string(n, term) { + if (VALID_STRING(term->Strings[n])) { + char buf[MAX_STRING], *sp, *tp; + + tp = buf; +#define TP_LIMIT ((MAX_STRING - 5) - (size_t)(tp - buf)) + *tp++ = '"'; + for (sp = term->Strings[n]; + *sp != 0 && TP_LIMIT > 2; + sp++) { + if (isascii(UChar(*sp)) + && isprint(UChar(*sp)) + && *sp != '\\' + && *sp != '"') + *tp++ = *sp; + else { + _nc_SPRINTF(tp, _nc_SLIMIT(TP_LIMIT) "\\%03o", UChar(*sp)); + tp += 4; + } + } + *tp++ = '"'; + *tp = '\0'; + (void) printf("static char %-20s[] = %s;\n", + string_variable(ExtStrname(term, (int) n, strnames)), + buf); + } + } + printf("\n"); + + (void) printf("static char %s[] = %s\n", name_initializer("bool"), L_CURL); + + for_each_boolean(n, term) { + switch ((int) (term->Booleans[n])) { + case TRUE: + str = "TRUE"; + break; + + case FALSE: + str = "FALSE"; + break; + + case ABSENT_BOOLEAN: + str = "ABSENT_BOOLEAN"; + break; + + case CANCELLED_BOOLEAN: + str = "CANCELLED_BOOLEAN"; + break; + } + (void) printf("\t/* %3u: %-8s */\t%s,\n", + n, ExtBoolname(term, (int) n, boolnames), str); + } + (void) printf("%s;\n", R_CURL); + + (void) printf("static short %s[] = %s\n", name_initializer("number"), L_CURL); + + for_each_number(n, term) { + char buf[BUFSIZ]; + switch (term->Numbers[n]) { + case ABSENT_NUMERIC: + str = "ABSENT_NUMERIC"; + break; + case CANCELLED_NUMERIC: + str = "CANCELLED_NUMERIC"; + break; + default: + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) "%d", term->Numbers[n]); + str = buf; + break; + } + (void) printf("\t/* %3u: %-8s */\t%s,\n", n, + ExtNumname(term, (int) n, numnames), str); + } + (void) printf("%s;\n", R_CURL); + + (void) printf("static char * %s[] = %s\n", name_initializer("string"), L_CURL); + + for_each_string(n, term) { + + if (term->Strings[n] == ABSENT_STRING) + str = "ABSENT_STRING"; + else if (term->Strings[n] == CANCELLED_STRING) + str = "CANCELLED_STRING"; + else { + str = string_variable(ExtStrname(term, (int) n, strnames)); + } + (void) printf("\t/* %3u: %-8s */\t%s,\n", n, + ExtStrname(term, (int) n, strnames), str); + } + (void) printf("%s;\n", R_CURL); + +#if NCURSES_XNAMES + if ((NUM_BOOLEANS(term) != BOOLCOUNT) + || (NUM_NUMBERS(term) != NUMCOUNT) + || (NUM_STRINGS(term) != STRCOUNT)) { + (void) printf("static char * %s[] = %s\n", + name_initializer("string_ext"), L_CURL); + for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { + (void) printf("\t/* %3u: bool */\t\"%s\",\n", + n, ExtBoolname(term, (int) n, boolnames)); + } + for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { + (void) printf("\t/* %3u: num */\t\"%s\",\n", + n, ExtNumname(term, (int) n, numnames)); + } + for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { + (void) printf("\t/* %3u: str */\t\"%s\",\n", + n, ExtStrname(term, (int) n, strnames)); + } + (void) printf("%s;\n", R_CURL); + } +#endif +} + +/* dump C initializers for the terminal type */ +static void +dump_termtype(const TERMTYPE2 *term) +{ + (void) printf("\t%s\n\t\t%s,\n", L_CURL, name_initializer("alias")); + (void) printf("\t\t(char *)0,\t/* pointer to string table */\n"); + + (void) printf("\t\t%s,\n", name_initializer("bool")); + (void) printf("\t\t%s,\n", name_initializer("number")); + + (void) printf("\t\t%s,\n", name_initializer("string")); + +#if NCURSES_XNAMES + (void) printf("#if NCURSES_XNAMES\n"); + (void) printf("\t\t(char *)0,\t/* pointer to extended string table */\n"); + (void) printf("\t\t%s,\t/* ...corresponding names */\n", + ((NUM_BOOLEANS(term) != BOOLCOUNT) + || (NUM_NUMBERS(term) != NUMCOUNT) + || (NUM_STRINGS(term) != STRCOUNT)) + ? name_initializer("string_ext") + : "(char **)0"); + + (void) printf("\t\t%d,\t\t/* count total Booleans */\n", NUM_BOOLEANS(term)); + (void) printf("\t\t%d,\t\t/* count total Numbers */\n", NUM_NUMBERS(term)); + (void) printf("\t\t%d,\t\t/* count total Strings */\n", NUM_STRINGS(term)); + + (void) printf("\t\t%d,\t\t/* count extensions to Booleans */\n", + NUM_BOOLEANS(term) - BOOLCOUNT); + (void) printf("\t\t%d,\t\t/* count extensions to Numbers */\n", + NUM_NUMBERS(term) - NUMCOUNT); + (void) printf("\t\t%d,\t\t/* count extensions to Strings */\n", + NUM_STRINGS(term) - STRCOUNT); + + (void) printf("#endif /* NCURSES_XNAMES */\n"); +#else + (void) term; +#endif /* NCURSES_XNAMES */ + (void) printf("\t%s\n", R_CURL); +} + +static int +optarg_to_number(void) +{ + char *temp = 0; + long value = strtol(optarg, &temp, 0); + + if (temp == 0 || temp == optarg || *temp != 0) { + fprintf(stderr, "Expected a number, not \"%s\"\n", optarg); + ExitProgram(EXIT_FAILURE); + } + return (int) value; +} + +static char * +terminal_env(void) +{ + char *terminal; + + if ((terminal = getenv("TERM")) == 0) { + (void) fprintf(stderr, + "%s: environment variable TERM not set\n", + _nc_progname); + exit(EXIT_FAILURE); + } + return terminal; +} + +/* + * Show the databases that infocmp knows about. The location to which it writes is + */ +static void +show_databases(void) +{ + DBDIRS state; + int offset; + const char *path2; + + _nc_first_db(&state, &offset); + while ((path2 = _nc_next_db(&state, &offset)) != 0) { + printf("%s\n", path2); + } + _nc_last_db(); +} + +/*************************************************************************** + * + * Main sequence + * + ***************************************************************************/ + +#if NO_LEAKS +#define MAIN_LEAKS() \ + _nc_free_termtype2(&entries[0].tterm); \ + _nc_free_termtype2(&entries[1].tterm); \ + free(myargv); \ + free(tfile); \ + free(tname) +#else +#define MAIN_LEAKS() /* nothing */ +#endif + +int +main(int argc, char *argv[]) +{ + /* Avoid "local data >32k" error with mwcc */ + /* Also avoid overflowing smaller stacks on systems like AmigaOS */ + path *tfile = 0; + char **tname = 0; + size_t maxterms; + + char **myargv; + + char *firstdir, *restdir; + int c; + bool formatted = FALSE; + bool filecompare = FALSE; + int initdump = 0; + bool init_analyze = FALSE; + bool suppress_untranslatable = FALSE; + int quickdump = 0; + bool wrap_strings = FALSE; + + /* where is the terminfo database location going to default to? */ + restdir = firstdir = 0; + +#if NCURSES_XNAMES + use_extended_names(FALSE); +#endif + _nc_strict_bsd = 0; + + _nc_progname = _nc_rootname(argv[0]); + + /* make sure we have enough space to add two terminal entries */ + myargv = typeCalloc(char *, (size_t) (argc + 3)); + if (myargv == 0) + failed("myargv"); + + memcpy(myargv, argv, (sizeof(char *) * (size_t) argc)); + argv = myargv; + + while ((c = getopt(argc, + argv, + "01A:aB:CcDdEeFfGgIiKLlnpQ:qR:rs:TtUuVv:Ww:x")) != -1) { + switch (c) { + case '0': + mwidth = 65535; + mheight = 1; + break; + + case '1': + mwidth = 0; + break; + + case 'A': + firstdir = optarg; + break; + +#if NCURSES_XNAMES + case 'a': + _nc_disable_period = TRUE; + use_extended_names(TRUE); + break; +#endif + case 'B': + restdir = optarg; + break; + + case 'K': + _nc_strict_bsd = 1; + /* FALLTHRU */ + case 'C': + outform = F_TERMCAP; + tversion = "BSD"; + if (sortmode == S_DEFAULT) + sortmode = S_TERMCAP; + break; + + case 'D': + show_databases(); + ExitProgram(EXIT_SUCCESS); + break; + + case 'c': + compare = C_COMMON; + break; + + case 'd': + compare = C_DIFFERENCE; + break; + + case 'E': + initdump |= 2; + break; + + case 'e': + initdump |= 1; + break; + + case 'F': + filecompare = TRUE; + break; + + case 'f': + formatted = TRUE; + break; + + case 'G': + numbers = 1; + break; + + case 'g': + numbers = -1; + break; + + case 'I': + outform = F_TERMINFO; + if (sortmode == S_DEFAULT) + sortmode = S_VARIABLE; + tversion = 0; + break; + + case 'i': + init_analyze = TRUE; + break; + + case 'L': + outform = F_VARIABLE; + if (sortmode == S_DEFAULT) + sortmode = S_VARIABLE; + break; + + case 'l': + outform = F_TERMINFO; + break; + + case 'n': + compare = C_NAND; + break; + + case 'p': + ignorepads = TRUE; + break; + + case 'Q': + quickdump = optarg_to_number(); + break; + + case 'q': + quiet = TRUE; + s_absent = "-"; + s_cancel = "@"; + bool_sep = ", "; + break; + + case 'R': + tversion = optarg; + break; + + case 'r': + tversion = 0; + break; + + case 's': + if (*optarg == 'd') + sortmode = S_NOSORT; + else if (*optarg == 'i') + sortmode = S_TERMINFO; + else if (*optarg == 'l') + sortmode = S_VARIABLE; + else if (*optarg == 'c') + sortmode = S_TERMCAP; + else { + (void) fprintf(stderr, + "%s: unknown sort mode\n", + _nc_progname); + ExitProgram(EXIT_FAILURE); + } + break; + + case 'T': + limited = FALSE; + break; + +#if NCURSES_XNAMES + case 't': + _nc_disable_period = FALSE; + suppress_untranslatable = TRUE; + break; +#endif + + case 'U': + literal = TRUE; + break; + + case 'u': + compare = C_USEALL; + break; + + case 'V': + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + + case 'v': + itrace = (unsigned) optarg_to_number(); + use_verbosity(itrace); + break; + + case 'W': + wrap_strings = TRUE; + break; + + case 'w': + mwidth = optarg_to_number(); + break; + +#if NCURSES_XNAMES + case 'x': + use_extended_names(TRUE); + break; +#endif + + default: + usage(); + } + } + + maxterms = (size_t) (argc + 2 - optind); + if ((tfile = typeMalloc(path, maxterms)) == 0) + failed("tfile"); + if ((tname = typeCalloc(char *, maxterms)) == 0) + failed("tname"); + if ((entries = typeCalloc(ENTRY, maxterms)) == 0) + failed("entries"); +#if NO_LEAKS + if ((entered = typeCalloc(ENTERED, maxterms)) == 0) + failed("entered"); +#endif + + if (tfile == 0 + || tname == 0 + || entries == 0) { + fprintf(stderr, "%s: not enough memory\n", _nc_progname); + ExitProgram(EXIT_FAILURE); + } + + /* by default, sort by terminfo name */ + if (sortmode == S_DEFAULT) + sortmode = S_TERMINFO; + + /* make sure we have at least one terminal name to work with */ + if (optind >= argc) + argv[argc++] = terminal_env(); + + /* if user is after a comparison, make sure we have two entries */ + if (compare != C_DEFAULT && optind >= argc - 1) + argv[argc++] = terminal_env(); + + /* exactly one terminal name with no options means display it */ + /* exactly two terminal names with no options means do -d */ + if (compare == C_DEFAULT) { + switch (argc - optind) { + default: + fprintf(stderr, "%s: too many names to compare\n", _nc_progname); + ExitProgram(EXIT_FAILURE); + case 1: + break; + case 2: + compare = C_DIFFERENCE; + break; + } + } + + /* set up for display */ + dump_init(tversion, outform, sortmode, + wrap_strings, mwidth, mheight, itrace, + formatted, FALSE, quickdump); + + if (!filecompare) { + /* grab the entries */ + termcount = 0; + for (; optind < argc; optind++) { + const char *directory = termcount ? restdir : firstdir; + int status; + + tname[termcount] = argv[optind]; + + if (directory) { +#if NCURSES_USE_DATABASE +#if MIXEDCASE_FILENAMES +#define LEAF_FMT "%c" +#else +#define LEAF_FMT "%02x" +#endif + _nc_SPRINTF(tfile[termcount], + _nc_SLIMIT(sizeof(path)) + "%s/" LEAF_FMT "/%s", + directory, + UChar(*argv[optind]), argv[optind]); + if (itrace) + (void) fprintf(stderr, + "%s: reading entry %s from file %s\n", + _nc_progname, + argv[optind], tfile[termcount]); + + status = _nc_read_file_entry(tfile[termcount], + &entries[termcount].tterm); +#else + (void) fprintf(stderr, "%s: terminfo files not supported\n", + _nc_progname); + MAIN_LEAKS(); + ExitProgram(EXIT_FAILURE); +#endif + } else { + if (itrace) + (void) fprintf(stderr, + "%s: reading entry %s from database\n", + _nc_progname, + tname[termcount]); + + status = _nc_read_entry2(tname[termcount], + tfile[termcount], + &entries[termcount].tterm); + } + + if (status <= 0) { + switch (status) { + case TGETENT_NO: + (void) fprintf(stderr, + "%s: error: no match in terminfo" + " database for terminal type" + " \"%s\"\n", + _nc_progname, + tname[termcount]); + break; + case TGETENT_ERR: + /* + * Several database files might be checked; their + * file names are not exposed via this API. The + * best we can do is report how the final one + * attempted failed. Also, tfile[termcount] is + * deeply misleading when a hashed database is used. + */ + (void) fprintf(stderr, + "%s: error: unable to open terminfo" + " database: %s\n", + _nc_progname, + strerror(errno)); + break; + default: + assert(0 == "unhandled _nc_read_entry2 return"); + } + MAIN_LEAKS(); + ExitProgram(EXIT_FAILURE); + } + repair_acsc(&entries[termcount].tterm); + termcount++; + } + +#if NCURSES_XNAMES + if (termcount > 1) { + /* + * User-defined capabilities in different terminal descriptions + * may have the same name/type but different indices. Line up + * the names to use comparable indices. We may have more than two + * entries to compare when processing the "-u" option. + */ + for (c = 1; c < termcount; ++c) + _nc_align_termtype(&entries[c].tterm, &entries[0].tterm); + } +#endif + + /* dump as C initializer for the terminal type */ + if (initdump) { + if (initdump & 1) + dump_termtype(&entries[0].tterm); + if (initdump & 2) + dump_initializers(&entries[0].tterm); + } + + /* analyze the init strings */ + else if (init_analyze) { +#undef CUR +#define CUR entries[0].tterm. + analyze_string("is1", init_1string, &entries[0].tterm); + analyze_string("is2", init_2string, &entries[0].tterm); + analyze_string("is3", init_3string, &entries[0].tterm); + analyze_string("rs1", reset_1string, &entries[0].tterm); + analyze_string("rs2", reset_2string, &entries[0].tterm); + analyze_string("rs3", reset_3string, &entries[0].tterm); + analyze_string("smcup", enter_ca_mode, &entries[0].tterm); + analyze_string("rmcup", exit_ca_mode, &entries[0].tterm); + analyze_string("smkx", keypad_xmit, &entries[0].tterm); + analyze_string("rmkx", keypad_local, &entries[0].tterm); +#undef CUR + } else { + int i; + int len; + + /* + * Here's where the real work gets done + */ + switch (compare) { + case C_DEFAULT: + if (itrace) + (void) fprintf(stderr, + "%s: about to dump %s\n", + _nc_progname, + tname[0]); + if (!quiet) + (void) + printf("#\tReconstructed via %s from file: %s\n", + _nc_progname, tfile[0]); + dump_entry(&entries[0].tterm, + suppress_untranslatable, + limited, + numbers, + NULL); + len = show_entry(); + if (itrace) + (void) fprintf(stderr, "%s: length %d\n", _nc_progname, len); + break; + + case C_DIFFERENCE: + show_comparing(tname); + compare_entry(compare_predicate, &entries->tterm, quiet); + break; + + case C_COMMON: + show_comparing(tname); + compare_entry(compare_predicate, &entries->tterm, quiet); + break; + + case C_NAND: + show_comparing(tname); + compare_entry(compare_predicate, &entries->tterm, quiet); + break; + + case C_USEALL: + if (itrace) + (void) fprintf(stderr, "%s: dumping use entry\n", _nc_progname); + dump_entry(&entries[0].tterm, + suppress_untranslatable, + limited, + numbers, + use_predicate); + for (i = 1; i < termcount; i++) + dump_uses(tname[i], !(outform == F_TERMCAP + || outform == F_TCONVERR)); + len = show_entry(); + if (itrace) + (void) fprintf(stderr, "%s: length %d\n", _nc_progname, len); + break; + } + } + } else if (compare == C_USEALL) { + (void) fprintf(stderr, "Sorry, -u doesn't work with -F\n"); + } else if (compare == C_DEFAULT) { + (void) fprintf(stderr, + "Use `" ACTUAL_TIC " -[CI] ' for this.\n"); + } else if (argc - optind != 2) { + (void) fprintf(stderr, + "File comparison needs exactly two file arguments.\n"); + } else { + file_comparison(argc - optind, argv + optind); + } + + MAIN_LEAKS(); + ExitProgram(EXIT_SUCCESS); +} + +/* infocmp.c ends here */ diff --git a/contrib/ncurses/progs/modules b/contrib/ncurses/progs/modules new file mode 100644 index 00000000..c3689794 --- /dev/null +++ b/contrib/ncurses/progs/modules @@ -0,0 +1,50 @@ +# $Id: modules,v 1.29 2024/06/15 23:34:33 tom Exp $ +# Program modules (some are in ncurses lib!) +############################################################################## +# Copyright 2020-2021,2024 Thomas E. Dickey # +# Copyright 1998-2014,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1995-on +# + +@ base +clear progs $(srcdir) $(HEADER_DEPS) $(srcdir)/clear_cmd.h $(srcdir)/tty_settings.h +tic progs $(srcdir) $(HEADER_DEPS) $(INCDIR)/hashed_db.h $(srcdir)/dump_entry.h $(srcdir)/tparm_type.h ../include/parametrized.h transform.h +toe progs $(srcdir) $(HEADER_DEPS) $(INCDIR)/hashed_db.h +clear_cmd progs $(srcdir) $(HEADER_DEPS) $(srcdir)/clear_cmd.h +dump_entry progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_entry.h ../include/capdefaults.c ../include/parametrized.h termsort.h +infocmp progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_entry.h +reset_cmd progs $(srcdir) $(HEADER_DEPS) $(srcdir)/reset_cmd.h $(srcdir)/tty_settings.h +tabs progs $(srcdir) $(HEADER_DEPS) $(srcdir)/tty_settings.h +tparm_type progs $(srcdir) $(HEADER_DEPS) $(srcdir)/tparm_type.h +tput progs $(srcdir) $(HEADER_DEPS) $(srcdir)/clear_cmd.h $(srcdir)/reset_cmd.h $(srcdir)/tparm_type.h $(srcdir)/tty_settings.h transform.h +tset progs $(srcdir) $(HEADER_DEPS) ../include/termcap.h $(srcdir)/reset_cmd.h $(srcdir)/tty_settings.h transform.h +transform progs $(srcdir) $(HEADER_DEPS) transform.h +tty_settings progs $(srcdir) $(HEADER_DEPS) $(srcdir)/tty_settings.h + +# vile:makemode diff --git a/contrib/ncurses/progs/progs.priv.h b/contrib/ncurses/progs/progs.priv.h new file mode 100644 index 00000000..fea18b8d --- /dev/null +++ b/contrib/ncurses/progs/progs.priv.h @@ -0,0 +1,137 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2015,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1997-on * + ****************************************************************************/ +/* + * $Id: progs.priv.h,v 1.62 2024/04/08 17:28:28 tom Exp $ + * + * progs.priv.h + * + * Header file for curses utility programs + */ + +#ifndef PROGS_PRIV_H +#define PROGS_PRIV_H 1 + +#include + +#include + +#if HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# if defined(_FILE_OFFSET_BITS) && defined(HAVE_STRUCT_DIRENT64) +# if !defined(_LP64) && (_FILE_OFFSET_BITS == 64) +# define DIRENT struct dirent64 +# else +# define DIRENT struct dirent +# endif +# else +# define DIRENT struct dirent +# endif +#else +# define DIRENT struct direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +#endif + +#if HAVE_GETOPT_H +#include +#elif !defined(HAVE_GETOPT_HEADER) +/* 'getopt()' may be prototyped in , but declaring its + * variables doesn't hurt. + */ +extern char *optarg; +extern int optind; +#endif /* HAVE_GETOPT_H */ + +#include + +#if HAVE_NC_FREEALL +#undef ExitProgram +#ifdef USE_LIBTINFO +#define ExitProgram(code) exit_terminfo(code) +#else +#define ExitProgram(code) _nc_free_tic(code) +#endif +#endif + +/* error-returns for tput */ +#define ErrUsage 2 +#define ErrTermType 3 +#define ErrCapName 4 +#define ErrSystem(n) (4 + (n)) + +/* We use isascii only to guard against use of 7-bit ctype tables in the + * isprint test in infocmp. + */ +#if !HAVE_ISASCII +# undef isascii +# if ('z'-'a' == 25) && ('z' < 127) && ('Z'-'A' == 25) && ('Z' < 127) && ('9' < 127) +# define isascii(c) (UChar(c) <= 127) +# else +# define isascii(c) 1 /* not really ascii anyway */ +# endif +#endif + +#define VtoTrace(opt) (unsigned) ((opt > 0) ? opt : (opt == 0)) + +/* + * If configured for tracing, the debug- and trace-output are merged together + * in the trace file for "upper" levels of the verbose option. + */ +#ifdef TRACE +#define use_verbosity(level) do { \ + set_trace_level(level); \ + if (_nc_tracing > DEBUG_LEVEL(2)) \ + _nc_tracing |= TRACE_MAXIMUM; \ + else if (_nc_tracing == DEBUG_LEVEL(2)) \ + _nc_tracing |= TRACE_ORDINARY; \ + if (level >= 2) \ + curses_trace(_nc_tracing); \ + } while (0) +#else +#define use_verbosity(level) do { set_trace_level(level); } while (0) +#endif + +#ifndef CUR +#define CUR ((TERMTYPE *)(cur_term))-> +#endif + +#endif /* PROGS_PRIV_H */ diff --git a/contrib/ncurses/progs/reset_cmd.c b/contrib/ncurses/progs/reset_cmd.c new file mode 100644 index 00000000..6ae3b673 --- /dev/null +++ b/contrib/ncurses/progs/reset_cmd.c @@ -0,0 +1,697 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include +#include + +#include +#include +#include + +#if HAVE_SIZECHANGE +# if !defined(sun) || !TERMIOS +# if HAVE_SYS_IOCTL_H +# include +# endif +# endif +#endif + +#if NEED_PTEM_H +/* they neglected to define struct winsize in termios.h -- it is only + in termio.h */ +#include +#include +#endif + +MODULE_ID("$Id: reset_cmd.c,v 1.37 2024/04/08 17:29:34 tom Exp $") + +/* + * SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS, + * Solaris, IRIX) define TIOCGWINSZ and struct winsize. + */ +#ifdef TIOCGSIZE +# define IOCTL_GET_WINSIZE TIOCGSIZE +# define IOCTL_SET_WINSIZE TIOCSSIZE +# define STRUCT_WINSIZE struct ttysize +# define WINSIZE_ROWS(n) n.ts_lines +# define WINSIZE_COLS(n) n.ts_cols +#else +# ifdef TIOCGWINSZ +# define IOCTL_GET_WINSIZE TIOCGWINSZ +# define IOCTL_SET_WINSIZE TIOCSWINSZ +# define STRUCT_WINSIZE struct winsize +# define WINSIZE_ROWS(n) n.ws_row +# define WINSIZE_COLS(n) n.ws_col +# endif +#endif + +#define set_flags(target, mask) target |= mask +#define clear_flags(target, mask) target &= ~((unsigned)(mask)) + +static FILE *my_file; + +static bool use_reset = FALSE; /* invoked as reset */ +static bool use_init = FALSE; /* invoked as init */ + +static GCC_NORETURN void +failed(const char *msg) +{ + int code = errno; + + (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code)); + restore_tty_settings(); + (void) fprintf(my_file, "\n"); + fflush(my_file); + ExitProgram(ErrSystem(code)); + /* NOTREACHED */ +} + +static bool +cat_file(char *file) +{ + FILE *fp; + size_t nr; + char buf[BUFSIZ]; + bool sent = FALSE; + + if (file != 0) { + if ((fp = safe_fopen(file, "r")) == 0) + failed(file); + + while ((nr = fread(buf, sizeof(char), sizeof(buf), fp)) != 0) { + if (fwrite(buf, sizeof(char), nr, my_file) != nr) { + failed(file); + } + sent = TRUE; + } + fclose(fp); + } + return sent; +} + +static int +out_char(int c) +{ + return putc(c, my_file); +} + +/************************************************************************** + * Mode-setting logic + **************************************************************************/ + +/* some BSD systems have these built in, some systems are missing + * one or more definitions. The safest solution is to override unless the + * commonly-altered ones are defined. + */ +#if !(defined(CERASE) && defined(CINTR) && defined(CKILL) && defined(CQUIT)) +#undef CEOF +#undef CERASE +#undef CINTR +#undef CKILL +#undef CLNEXT +#undef CRPRNT +#undef CQUIT +#undef CSTART +#undef CSTOP +#undef CSUSP +#endif + +/* control-character defaults */ +#ifndef CEOF +#define CEOF CTRL('D') +#endif +#ifndef CERASE +#define CERASE CTRL('H') +#endif +#ifndef CINTR +#define CINTR 127 /* ^? */ +#endif +#ifndef CKILL +#define CKILL CTRL('U') +#endif +#ifndef CLNEXT +#define CLNEXT CTRL('v') +#endif +#ifndef CRPRNT +#define CRPRNT CTRL('r') +#endif +#ifndef CQUIT +#define CQUIT CTRL('\\') +#endif +#ifndef CSTART +#define CSTART CTRL('Q') +#endif +#ifndef CSTOP +#define CSTOP CTRL('S') +#endif +#ifndef CSUSP +#define CSUSP CTRL('Z') +#endif + +#if defined(_POSIX_VDISABLE) +#define DISABLED(val) (((_POSIX_VDISABLE != -1) \ + && ((val) == _POSIX_VDISABLE)) \ + || ((val) <= 0)) +#else +#define DISABLED(val) ((int)(val) <= 0) +#endif + +#define CHK(val, dft) (unsigned char) (DISABLED(val) ? dft : val) + +#define reset_char(item, value) \ + tty_settings->c_cc[item] = CHK(tty_settings->c_cc[item], value) + +/* + * Simplify ifdefs + */ +#ifndef BSDLY +#define BSDLY 0 +#endif +#ifndef CRDLY +#define CRDLY 0 +#endif +#ifndef ECHOCTL +#define ECHOCTL 0 +#endif +#ifndef ECHOKE +#define ECHOKE 0 +#endif +#ifndef ECHOPRT +#define ECHOPRT 0 +#endif +#ifndef FFDLY +#define FFDLY 0 +#endif +#ifndef IMAXBEL +#define IMAXBEL 0 +#endif +#ifndef IUCLC +#define IUCLC 0 +#endif +#ifndef IXANY +#define IXANY 0 +#endif +#ifndef NLDLY +#define NLDLY 0 +#endif +#ifndef OCRNL +#define OCRNL 0 +#endif +#ifndef OFDEL +#define OFDEL 0 +#endif +#ifndef OFILL +#define OFILL 0 +#endif +#ifndef OLCUC +#define OLCUC 0 +#endif +#ifndef ONLCR +#define ONLCR 0 +#endif +#ifndef ONLRET +#define ONLRET 0 +#endif +#ifndef ONOCR +#define ONOCR 0 +#endif +#ifndef OXTABS +#define OXTABS 0 +#endif +#ifndef TAB3 +#define TAB3 0 +#endif +#ifndef TABDLY +#define TABDLY 0 +#endif +#ifndef TOSTOP +#define TOSTOP 0 +#endif +#ifndef VTDLY +#define VTDLY 0 +#endif +#ifndef XCASE +#define XCASE 0 +#endif + +/* + * Reset the terminal mode bits to a sensible state. Very useful after + * a child program dies in raw mode. + */ +void +reset_tty_settings(int fd, TTY * tty_settings, int noset) +{ + unsigned mask; +#ifdef TIOCMGET + int modem_bits; +#endif + + GET_TTY(fd, tty_settings); + +#ifdef TERMIOS +#if defined(VDISCARD) && defined(CDISCARD) + reset_char(VDISCARD, CDISCARD); +#endif + reset_char(VEOF, CEOF); + reset_char(VERASE, CERASE); +#if defined(VERASE2) && defined(CERASE2) + reset_char(VERASE2, CERASE2); +#endif +#if defined(VFLUSH) && defined(CFLUSH) + reset_char(VFLUSH, CFLUSH); +#endif + reset_char(VINTR, CINTR); + reset_char(VKILL, CKILL); +#if defined(VLNEXT) && defined(CLNEXT) + reset_char(VLNEXT, CLNEXT); +#endif + reset_char(VQUIT, CQUIT); +#if defined(VREPRINT) && defined(CRPRNT) + reset_char(VREPRINT, CRPRNT); +#endif +#if defined(VSTART) && defined(CSTART) + reset_char(VSTART, CSTART); +#endif +#if defined(VSTOP) && defined(CSTOP) + reset_char(VSTOP, CSTOP); +#endif +#if defined(VSUSP) && defined(CSUSP) + reset_char(VSUSP, CSUSP); +#endif +#if defined(VWERASE) && defined(CWERASE) + reset_char(VWERASE, CWERASE); +#endif + + clear_flags(tty_settings->c_iflag, (IGNBRK + | PARMRK + | INPCK + | ISTRIP + | INLCR + | IGNCR + | IUCLC + | IXANY + | IXOFF)); + + set_flags(tty_settings->c_iflag, (BRKINT + | IGNPAR + | ICRNL + | IXON + | IMAXBEL)); + + clear_flags(tty_settings->c_oflag, (0 + | OLCUC + | OCRNL + | ONOCR + | ONLRET + | OFILL + | OFDEL + | NLDLY + | CRDLY + | TABDLY + | BSDLY + | VTDLY + | FFDLY)); + + set_flags(tty_settings->c_oflag, (OPOST + | ONLCR)); + + mask = (CSIZE | CSTOPB | PARENB | PARODD); +#ifdef TIOCMGET + /* leave clocal alone if this appears to use a modem */ + if (ioctl(fd, TIOCMGET, &modem_bits) == -1) + mask |= CLOCAL; +#else + /* cannot check - use the behavior from tset */ + mask |= CLOCAL; +#endif + clear_flags(tty_settings->c_cflag, mask); + + set_flags(tty_settings->c_cflag, (CS8 | CREAD)); + clear_flags(tty_settings->c_lflag, (ECHONL + | NOFLSH + | TOSTOP + | ECHOPRT + | XCASE)); + + set_flags(tty_settings->c_lflag, (ISIG + | ICANON + | ECHO + | ECHOE + | ECHOK + | ECHOCTL + | ECHOKE)); +#endif /* TERMIOS */ + + if (!noset) { + SET_TTY(fd, tty_settings); + } +} + +/* + * Returns a "good" value for the erase character. This is loosely based on + * the BSD4.4 logic. + */ +static int +default_erase(void) +{ + int result; + + if (over_strike + && VALID_STRING(key_backspace) + && strlen(key_backspace) == 1) { + result = key_backspace[0]; + } else { + result = CERASE; + } + + return result; +} + +/* + * Update the values of the erase, interrupt, and kill characters in the TTY + * parameter. + * + * SVr4 tset (e.g., Solaris 2.5) only modifies the intr, quit or erase + * characters if they're unset, or if we specify them as options. This differs + * from BSD 4.4 tset, which always sets erase. + */ +void +set_control_chars(TTY * tty_settings, int my_erase, int my_intr, int my_kill) +{ +#if defined(EXP_WIN32_DRIVER) + /* noop */ + (void) tty_settings; + (void) my_erase; + (void) my_intr; + (void) my_kill; +#else + if (DISABLED(tty_settings->c_cc[VERASE]) || my_erase >= 0) { + tty_settings->c_cc[VERASE] = UChar((my_erase >= 0) + ? my_erase + : default_erase()); + } + + if (DISABLED(tty_settings->c_cc[VINTR]) || my_intr >= 0) { + tty_settings->c_cc[VINTR] = UChar((my_intr >= 0) + ? my_intr + : CINTR); + } + + if (DISABLED(tty_settings->c_cc[VKILL]) || my_kill >= 0) { + tty_settings->c_cc[VKILL] = UChar((my_kill >= 0) + ? my_kill + : CKILL); + } +#endif +} + +/* + * Set up various conversions in the TTY parameter, including parity, tabs, + * returns, echo, and case, according to the termcap entry. + */ +void +set_conversions(TTY * tty_settings) +{ +#if defined(EXP_WIN32_DRIVER) + /* FIXME */ +#else + set_flags(tty_settings->c_oflag, ONLCR); + set_flags(tty_settings->c_iflag, ICRNL); + set_flags(tty_settings->c_lflag, ECHO); + set_flags(tty_settings->c_oflag, OXTABS); + + /* test used to be tgetflag("NL") */ + if (VALID_STRING(newline) && newline[0] == '\n' && !newline[1]) { + /* Newline, not linefeed. */ + clear_flags(tty_settings->c_oflag, ONLCR); + clear_flags(tty_settings->c_iflag, ICRNL); + } +#if OXTABS + /* test used to be tgetflag("pt") */ + if (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs)) + clear_flags(tty_settings->c_oflag, OXTABS); +#endif /* OXTABS */ + set_flags(tty_settings->c_lflag, (ECHOE | ECHOK)); +#endif +} + +static bool +sent_string(const char *s) +{ + bool sent = FALSE; + if (VALID_STRING(s)) { + tputs(s, 0, out_char); + sent = TRUE; + } + return sent; +} + +static bool +to_left_margin(void) +{ + if (VALID_STRING(carriage_return)) { + sent_string(carriage_return); + } else { + out_char('\r'); + } + return TRUE; +} + +/* + * Set the hardware tabs on the terminal, using the 'ct' (clear all tabs), + * 'st' (set one tab) and 'ch' (horizontal cursor addressing) capabilities. + * This is done before 'if' and 'is', so they can recover in case of error. + * + * Return TRUE if we set any tab stops, FALSE if not. + */ +static bool +reset_tabstops(int wide) +{ + if ((init_tabs != 8) + && VALID_NUMERIC(init_tabs) + && VALID_STRING(set_tab) + && VALID_STRING(clear_all_tabs)) { + int c; + + to_left_margin(); + tputs(clear_all_tabs, 0, out_char); + if (init_tabs > 1) { + if (init_tabs > wide) + init_tabs = (short) wide; + for (c = init_tabs; c < wide; c += init_tabs) { + fprintf(my_file, "%*s", init_tabs, " "); + tputs(set_tab, 0, out_char); + } + to_left_margin(); + } + return (TRUE); + } + return (FALSE); +} + +/* Output startup string. */ +bool +send_init_strings(int fd GCC_UNUSED, TTY * old_settings) +{ + int i; + bool need_flush = FALSE; + + (void) old_settings; +#if TAB3 + if (old_settings != 0 && + old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) { + old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET); + SET_TTY(fd, old_settings); + } +#endif + if (use_reset || use_init) { + if (VALID_STRING(init_prog)) { + IGNORE_RC(system(init_prog)); + } + + need_flush |= sent_string((use_reset && (reset_1string != 0)) + ? reset_1string + : init_1string); + + need_flush |= sent_string((use_reset && (reset_2string != 0)) + ? reset_2string + : init_2string); + + if (VALID_STRING(clear_margins)) { + need_flush |= sent_string(clear_margins); + } +#if defined(set_lr_margin) + else if (VALID_STRING(set_lr_margin)) { + need_flush |= sent_string(TIPARM_2(set_lr_margin, 0, columns - 1)); + } +#endif +#if defined(set_left_margin_parm) && defined(set_right_margin_parm) + else if (VALID_STRING(set_left_margin_parm) + && VALID_STRING(set_right_margin_parm)) { + need_flush |= sent_string(TIPARM_1(set_left_margin_parm, 0)); + need_flush |= sent_string(TIPARM_1(set_right_margin_parm, + columns - 1)); + } +#endif + else if (VALID_STRING(set_left_margin) + && VALID_STRING(set_right_margin)) { + need_flush |= to_left_margin(); + need_flush |= sent_string(set_left_margin); + if (VALID_STRING(parm_right_cursor)) { + need_flush |= sent_string(TIPARM_1(parm_right_cursor, + columns - 1)); + } else { + for (i = 0; i < columns - 1; i++) { + out_char(' '); + need_flush = TRUE; + } + } + need_flush |= sent_string(set_right_margin); + need_flush |= to_left_margin(); + } + + need_flush |= reset_tabstops(columns); + + need_flush |= cat_file((use_reset && reset_file) ? reset_file : init_file); + + need_flush |= sent_string((use_reset && (reset_3string != 0)) + ? reset_3string + : init_3string); + } + + return need_flush; +} + +/* + * Tell the user if a control key has been changed from the default value. + */ +static void +show_tty_change(TTY * old_settings, + TTY * new_settings, + const char *name, + int which, + unsigned def) +{ + unsigned older = 0, newer = 0; + char *p; + +#if defined(EXP_WIN32_DRIVER) + /* noop */ + (void) old_settings; + (void) new_settings; + (void) name; + (void) which; + (void) def; +#else + newer = new_settings->c_cc[which]; + older = old_settings->c_cc[which]; + + if (older == newer && older == def) + return; +#endif + (void) fprintf(stderr, "%s %s ", name, older == newer ? "is" : "set to"); + + if (DISABLED(newer)) { + (void) fprintf(stderr, "undef.\n"); + /* + * Check 'delete' before 'backspace', since the key_backspace value + * is ambiguous. + */ + } else if (newer == 0177) { + (void) fprintf(stderr, "delete.\n"); + } else if ((p = key_backspace) != 0 + && newer == (unsigned char) p[0] + && p[1] == '\0') { + (void) fprintf(stderr, "backspace.\n"); + } else if (newer < 040) { + newer ^= 0100; + (void) fprintf(stderr, "control-%c (^%c).\n", UChar(newer), UChar(newer)); + } else + (void) fprintf(stderr, "%c.\n", UChar(newer)); +} + +/************************************************************************** + * Miscellaneous. + **************************************************************************/ + +void +reset_start(FILE *fp, bool is_reset, bool is_init) +{ + my_file = fp; + use_reset = is_reset; + use_init = is_init; +} + +void +reset_flush(void) +{ + if (my_file != 0) + fflush(my_file); +} + +void +print_tty_chars(TTY * old_settings, TTY * new_settings) +{ +#if defined(EXP_WIN32_DRIVER) + /* noop */ +#else + show_tty_change(old_settings, new_settings, "Erase", VERASE, CERASE); + show_tty_change(old_settings, new_settings, "Kill", VKILL, CKILL); + show_tty_change(old_settings, new_settings, "Interrupt", VINTR, CINTR); +#endif +} + +#if HAVE_SIZECHANGE +/* + * Set window size if not set already, but update our copy of the values if the + * size was set. + */ +void +set_window_size(int fd, NCURSES_INT2 *high, NCURSES_INT2 *wide) +{ + STRUCT_WINSIZE win; + (void) ioctl(fd, IOCTL_GET_WINSIZE, &win); + if (WINSIZE_ROWS(win) == 0 && + WINSIZE_COLS(win) == 0) { + if (*high > 0 && *wide > 0) { + WINSIZE_ROWS(win) = (unsigned short) *high; + WINSIZE_COLS(win) = (unsigned short) *wide; + (void) ioctl(fd, IOCTL_SET_WINSIZE, &win); + } + } else if (WINSIZE_ROWS(win) > 0 && + WINSIZE_COLS(win) > 0) { + *high = (short) WINSIZE_ROWS(win); + *wide = (short) WINSIZE_COLS(win); + } +} +#endif diff --git a/contrib/ncurses/progs/reset_cmd.h b/contrib/ncurses/progs/reset_cmd.h new file mode 100644 index 00000000..43aee28f --- /dev/null +++ b/contrib/ncurses/progs/reset_cmd.h @@ -0,0 +1,66 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E Dickey * + ****************************************************************************/ + +/* + * $Id: reset_cmd.h,v 1.11 2024/04/08 17:29:34 tom Exp $ + * + * Utility functions for resetting terminal. + */ +#ifndef RESET_CMD_H +#define RESET_CMD_H 1 +/* *INDENT-OFF* */ + +#define USE_LIBTINFO +#define __INTERNAL_CAPS_VISIBLE /* we need to see has_hardware_tabs */ +#include + +#undef CTRL +#define CTRL(x) ((x) & 0x1f) + +extern bool send_init_strings(int /* fd */, TTY * /* old_settings */); +extern void print_tty_chars(TTY * /* old_settings */, TTY * /* new_settings */); +extern void reset_flush(void); +extern void reset_start(FILE * /* fp */, bool /* is_reset */, bool /* is_init */ ); +extern void reset_tty_settings(int /* fd */, TTY * /* tty_settings */, int /* noset */); +extern void set_control_chars(TTY * /* tty_settings */, int /* erase */, int /* intr */, int /* kill */); +extern void set_conversions(TTY * /* tty_settings */); + +#if HAVE_SIZECHANGE +extern void set_window_size(int /* fd */, NCURSES_INT2 * /* high */, NCURSES_INT2 * /* wide */); +#endif + +extern const char *_nc_progname; + +/* *INDENT-ON* */ + +#endif /* RESET_CMD_H */ diff --git a/contrib/ncurses/progs/tabs.c b/contrib/ncurses/progs/tabs.c new file mode 100644 index 00000000..42560ea3 --- /dev/null +++ b/contrib/ncurses/progs/tabs.c @@ -0,0 +1,710 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 2008-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 2008 * + ****************************************************************************/ + +/* + * tabs.c -- set terminal hard-tabstops + */ + +#define USE_LIBTINFO +#include +#include + +MODULE_ID("$Id: tabs.c,v 1.55 2024/10/19 21:45:18 tom Exp $") + +static GCC_NORETURN void usage(void); + +const char *_nc_progname; +static int max_cols; + +static void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + +static int +putch(int c) +{ + return putchar(c); +} + +static char * +skip_csi(char *value) +{ + if (UChar(*value) == 0x9b) + ++value; + else if (!strncmp(value, "\033[", 2)) + value += 2; + return value; +} + +/* + * If the terminal uses ANSI clear_all_tabs, then it is not necessary to first + * move to the left margin before clearing tabs. + */ +static bool +ansi_clear_tabs(void) +{ + bool result = FALSE; + if (VALID_STRING(clear_all_tabs)) { + const char *param = skip_csi(clear_all_tabs); + if (!strcmp(param, "3g")) + result = TRUE; + } + return result; +} + +static void +do_tabs(const int *tab_list) +{ + int last = 1; + int stop; + bool first = TRUE; + + while ((stop = *tab_list++) > 0) { + if (first) { + first = FALSE; + putchar('\r'); + } + if (last < stop) { + while (last++ < stop) { + if (last > max_cols) + break; + putchar(' '); + } + } + if (stop <= max_cols) { + tputs(set_tab, 1, putch); + last = stop; + } else { + break; + } + } + putchar('\r'); +} + +/* + * Decode a list of tab-stops from a string, returning an array of integers. + * If the margin is positive (because the terminal does not support margins), + * work around this by adding the margin to the decoded values. + */ +static int * +decode_tabs(const char *tab_list, int margin) +{ + int *result = typeCalloc(int, strlen(tab_list) + (unsigned) max_cols); + int n = 0; + int value = 0; + int prior = 0; + int ch; + + if (result == NULL) + failed("decode_tabs"); + + if (margin < 0) + margin = 0; + + while ((ch = *tab_list++) != '\0') { + if (isdigit(UChar(ch))) { + value *= 10; + value += (ch - '0'); + if (value > max_cols) + value = max_cols; + } else if (ch == ',') { + result[n] = value + prior + margin; + if (n > 0 && result[n] <= result[n - 1]) { + fprintf(stderr, + "%s: tab-stops are not in increasing order: %d %d\n", + _nc_progname, value, result[n - 1]); + free(result); + result = 0; + break; + } + ++n; + value = 0; + prior = 0; + } else if (ch == '+') { + if (n) + prior = result[n - 1]; + } + } + + if (result != 0) { + /* + * If there is only one value, then it is an option such as "-8". + */ + if ((n == 0) && (value > 0)) { + int step = value; + value = 1; + while (n < max_cols - 1) { + result[n++] = value + margin; + value += step; + } + } + + /* + * Add the last value, if any. + */ + result[n++] = value + prior + margin; + result[n] = 0; + } + + return result; +} + +static void +print_ruler(const int *const tab_list, const char *new_line) +{ + int last = 0; + int n; + + /* first print a readable ruler */ + for (n = 0; n < max_cols; n += 10) { + int ch = 1 + (n / 10); + char buffer[20]; + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "----+----%c", + ((ch < 10) + ? (ch + '0') + : (ch + 'A' - 10))); + printf("%.*s", ((max_cols - n) > 10) ? 10 : (max_cols - n), buffer); + } + printf("%s", new_line); + + /* now, print '*' for each stop */ + for (n = 0, last = 0; (tab_list[n] > 0) && (last < max_cols); ++n) { + int stop = tab_list[n]; + + while (++last < stop) { + if (last <= max_cols) { + putchar('-'); + } else { + break; + } + } + if (last <= max_cols) { + putchar('*'); + last = stop; + } else { + break; + } + } + while (++last <= max_cols) + putchar('-'); + printf("%s", new_line); +} + +/* + * Write an '*' on each tabstop, to demonstrate whether it lines up with the + * ruler. + */ +static void +write_tabs(const int *tab_list, const char *new_line) +{ + int stop; + + while ((stop = *tab_list++) > 0 && stop <= max_cols) { + fputs((stop == 1) ? "*" : "\t*", stdout); + }; + /* also show a tab _past_ the stops */ + if (stop < max_cols) + fputs("\t+", stdout); + fputs(new_line, stdout); +} + +/* + * Trim leading/trailing blanks, as well as blanks after a comma. + * Convert embedded blanks to commas. + */ +static char * +trimmed_tab_list(const char *source) +{ + char *result = strdup(source); + if (result != 0) { + int j, k, last; + + for (j = k = last = 0; result[j] != 0; ++j) { + int ch = UChar(result[j]); + if (isspace(ch)) { + if (last == '\0') { + continue; + } else if (isdigit(last) || last == ',') { + ch = ','; + } + } else if (ch == ',') { + ; + } else { + if (last == ',') + result[k++] = (char) last; + result[k++] = (char) ch; + } + last = ch; + } + result[k] = '\0'; + } + return result; +} + +static bool +comma_is_needed(const char *source) +{ + bool result = FALSE; + + if (source != 0) { + size_t len = strlen(source); + if (len != 0) + result = (source[len - 1] != ','); + } else { + result = FALSE; + } + return result; +} + +/* + * Add a command-line parameter to the tab-list. It can be blank- or comma- + * separated (or a mixture). For simplicity, empty tabs are ignored, e.g., + * tabs 1,,6,11 + * tabs 1,6,11 + * are treated the same. + */ +static const char * +add_to_tab_list(char **append, const char *value) +{ + char *result = *append; + char *copied = trimmed_tab_list(value); + + if (copied != 0 && *copied != '\0') { + const char *comma = ","; + size_t need = 1 + strlen(copied); + + if (*copied == ',') + comma = ""; + else if (!comma_is_needed(*append)) + comma = ""; + + need += strlen(comma); + if (*append != 0) + need += strlen(*append); + + result = malloc(need); + if (result == 0) + failed("add_to_tab_list"); + + *result = '\0'; + if (*append != 0) { + _nc_STRCPY(result, *append, need); + free(*append); + } + _nc_STRCAT(result, comma, need); + _nc_STRCAT(result, copied, need); + + *append = result; + } + free(copied); + return result; +} + +/* + * If the terminal supports it, (re)set the left margin and return true. + * Otherwise, return false. + */ +static bool +do_set_margin(int margin, bool no_op) +{ + bool result = FALSE; + + if (margin == 0) { /* 0 is special case for resetting */ + if (VALID_STRING(clear_margins)) { + result = TRUE; + if (!no_op) + tputs(clear_margins, 1, putch); + } + } else if (margin-- < 0) { /* margin will be 0-based from here on */ + result = TRUE; + } else if (VALID_STRING(set_left_margin)) { + result = TRUE; + if (!no_op) { + /* + * assuming we're on the first column of the line, move the cursor + * to the column at which we will set a margin. + */ + if (VALID_STRING(column_address)) { + tputs(TIPARM_1(column_address, margin), 1, putch); + } else if (margin >= 1) { + if (VALID_STRING(parm_right_cursor)) { + tputs(TIPARM_1(parm_right_cursor, margin), 1, putch); + } else { + while (margin-- > 0) + putch(' '); + } + } + tputs(set_left_margin, 1, putch); + } + } +#if defined(set_left_margin_parm) && defined(set_right_margin_parm) + else if (VALID_STRING(set_left_margin_parm)) { + result = TRUE; + if (!no_op) { + if (VALID_STRING(set_right_margin_parm)) { + tputs(TIPARM_1(set_left_margin_parm, margin), 1, putch); + } else { + tputs(TIPARM_2(set_left_margin_parm, margin, max_cols), 1, putch); + } + } + } +#endif +#if defined(set_lr_margin) + else if (VALID_STRING(set_lr_margin)) { + result = TRUE; + if (!no_op) { + tputs(TIPARM_2(set_lr_margin, margin, max_cols), 1, putch); + } + } +#endif + return result; +} + +/* + * Check for illegal characters in the tab-list. + */ +static bool +legal_tab_list(const char *tab_list) +{ + bool result = TRUE; + + if (tab_list != 0 && *tab_list != '\0') { + if (comma_is_needed(tab_list)) { + int n; + + for (n = 0; tab_list[n] != '\0'; ++n) { + int ch = UChar(tab_list[n]); + + if (!(isdigit(ch) || ch == ',' || ch == '+')) { + fprintf(stderr, + "%s: unexpected character found '%c'\n", + _nc_progname, ch); + result = FALSE; + break; + } + } + } else { + fprintf(stderr, "%s: trailing comma found '%s'\n", _nc_progname, tab_list); + result = FALSE; + } + } else { + /* if no list given, default to "tabs -8" */ + } + return result; +} + +static char * +skip_list(char *value) +{ + while (*value != '\0' && + (isdigit(UChar(*value)) || + isspace(UChar(*value)) || + strchr("+,", UChar(*value)) != 0)) { + ++value; + } + return value; +} + +static void +usage(void) +{ +#define DATA(s) s "\n" + static const char msg[] = + { + DATA("") + DATA("Options:") + DATA(" -0 reset tabs") + DATA(" -8 set tabs to standard interval") + DATA(" -a Assembler, IBM S/370, first format") + DATA(" -a2 Assembler, IBM S/370, second format") + DATA(" -c COBOL, normal format") + DATA(" -c2 COBOL compact format") + DATA(" -c3 COBOL compact format extended") + DATA(" -d debug (show ruler with expected/actual tab positions)") + DATA(" -f FORTRAN") + DATA(" -n no-op (do not modify terminal settings)") + DATA(" -p PL/I") + DATA(" -s SNOBOL") + DATA(" -u UNIVAC 1100 Assembler") + DATA(" -T name use terminal type 'name'") + DATA(" -V print version") + DATA("") + DATA("A tabstop-list is an ordered list of column numbers, e.g., 1,11,21") + DATA("or 1,+10,+10 which is the same.") + }; +#undef DATA + FILE *fp = stderr; + + fflush(stdout); + fprintf(fp, "Usage: %s [options] [tabstop-list]\n", _nc_progname); + fputs(msg, fp); + ExitProgram(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + int rc = EXIT_FAILURE; + bool debug = FALSE; + bool no_op = FALSE; + bool change_tty = FALSE; + int n, ch; + NCURSES_CONST char *term_name = 0; + char *append = 0; + const char *tab_list = 0; + const char *new_line = "\n"; + int margin = -1; + TTY tty_settings; + int fd; + + _nc_progname = _nc_rootname(argv[0]); + + if ((term_name = getenv("TERM")) == 0) + term_name = "ansi+tabs"; + + /* cannot use getopt, since some options are two-character */ + for (n = 1; n < argc; ++n) { + char *option = argv[n]; + switch (option[0]) { + case '-': + while ((ch = *++option) != '\0') { + switch (ch) { + case 'a': + switch (*++option) { + default: + case '\0': + tab_list = "1,10,16,36,72"; + option--; + /* Assembler, IBM S/370, first format */ + break; + case '2': + tab_list = "1,10,16,40,72"; + /* Assembler, IBM S/370, second format */ + break; + } + break; + case 'c': + switch (*++option) { + default: + case '\0': + tab_list = "1,8,12,16,20,55"; + option--; + /* COBOL, normal format */ + break; + case '2': + tab_list = "1,6,10,14,49"; + /* COBOL compact format */ + break; + case '3': + tab_list = "1,6,10,14,18,22,26,30,34,38,42,46,50,54,58,62,67"; + /* COBOL compact format extended */ + break; + } + break; + case 'd': /* ncurses extension */ + debug = TRUE; + break; + case 'f': + tab_list = "1,7,11,15,19,23"; + /* FORTRAN */ + break; + case 'n': /* ncurses extension */ + no_op = TRUE; + break; + case 'p': + tab_list = "1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61"; + /* PL/I */ + break; + case 's': + tab_list = "1,10,55"; + /* SNOBOL */ + break; + case 'u': + tab_list = "1,12,20,44"; + /* UNIVAC 1100 Assembler */ + break; + case 'T': + ++n; + if (*++option != '\0') { + term_name = option; + } else { + term_name = argv[n]; + option--; + } + option += ((int) strlen(option)) - 1; + continue; + case 'V': + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + default: + if (isdigit(UChar(*option))) { + char *copy = strdup(option); + *skip_list(copy) = '\0'; + tab_list = copy; + option = skip_list(option) - 1; + } else { + usage(); + } + break; + } + } + break; + case '+': + if ((ch = *++option) != '\0') { + int digits = 0; + int number = 0; + + switch (ch) { + case 'm': + /* + * The "+mXXX" option is unimplemented because only the long-obsolete + * att510d implements smgl, which is needed to support + * this option. + */ + while ((ch = *++option) != '\0') { + if (isdigit(UChar(ch))) { + ++digits; + number = number * 10 + (ch - '0'); + } else { + usage(); + } + } + if (digits == 0) + number = 10; + margin = number; + break; + default: + /* special case of relative stops separated by spaces? */ + if (option == argv[n] + 1) { + tab_list = add_to_tab_list(&append, argv[n]); + } + break; + } + } + break; + default: + if (append != 0) { + if (tab_list != (const char *) append) { + /* one of the predefined options was used */ + free(append); + append = 0; + } + } + tab_list = add_to_tab_list(&append, option); + break; + } + } + + fd = save_tty_settings(&tty_settings, FALSE); + + setupterm(term_name, fd, (int *) 0); + + max_cols = (columns > 0) ? columns : 80; + if (margin > 0) + max_cols -= margin; + + if (!VALID_STRING(clear_all_tabs)) { + fprintf(stderr, + "%s: terminal type '%s' cannot reset tabs\n", + _nc_progname, term_name); + } else if (!VALID_STRING(set_tab)) { + fprintf(stderr, + "%s: terminal type '%s' cannot set tabs\n", + _nc_progname, term_name); + } else if (legal_tab_list(tab_list)) { + int *list; + + if (tab_list == NULL) + tab_list = add_to_tab_list(&append, "8"); + + if (!no_op) { +#if defined(TERMIOS) && defined(OCRNL) + /* set tty modes to -ocrnl to allow \r */ + if (isatty(STDOUT_FILENO)) { + TTY new_settings = tty_settings; + new_settings.c_oflag &= (unsigned) ~OCRNL; + update_tty_settings(&tty_settings, &new_settings); + change_tty = TRUE; + new_line = "\r\n"; + } +#endif + + if (!ansi_clear_tabs()) + putch('\r'); + tputs(clear_all_tabs, 1, putch); + } + + if (margin >= 0) { + putch('\r'); + if (margin > 0) { + /* reset existing margin before setting margin, to reduce + * problems moving left of the current margin. + */ + if (do_set_margin(0, no_op)) + putch('\r'); + } + if (do_set_margin(margin, no_op)) + margin = -1; + } + + list = decode_tabs(tab_list, margin); + + if (list != 0) { + if (!no_op) + do_tabs(list); + if (debug) { + fflush(stderr); + printf("tabs %s%s", tab_list, new_line); + print_ruler(list, new_line); + write_tabs(list, new_line); + } + free(list); + } else if (debug) { + fflush(stderr); + printf("tabs %s%s", tab_list, new_line); + } + if (!no_op) { + if (change_tty) { + restore_tty_settings(); + } + } + rc = EXIT_SUCCESS; + } + if (append != 0) + free(append); + ExitProgram(rc); +} diff --git a/contrib/ncurses/progs/tic.c b/contrib/ncurses/progs/tic.c new file mode 100644 index 00000000..6f588fd7 --- /dev/null +++ b/contrib/ncurses/progs/tic.c @@ -0,0 +1,3371 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996 on * + ****************************************************************************/ + +/* + * tic.c --- Main program for terminfo compiler + * by Eric S. Raymond + * and Thomas E Dickey + * + */ + +#include +#include + +#include +#include +#include +#include +#include + +MODULE_ID("$Id: tic.c,v 1.326 2024/10/19 21:31:50 tom Exp $") + +#define STDIN_NAME "" + +const char *_nc_progname = "tic"; + +static FILE *log_fp; +static FILE *tmp_fp; +static bool capdump = FALSE; /* running as infotocap? */ +static bool infodump = FALSE; /* running as captoinfo? */ +static bool showsummary = FALSE; +static unsigned debug_level; +static char **namelst = 0; +static const char *to_remove; + +#if NCURSES_XNAMES +static bool using_extensions = FALSE; +#endif + +static void (*save_check_termtype) (TERMTYPE2 *, bool); +static void check_termtype(TERMTYPE2 *tt, bool); + +static const char usage_string[] = "\ +[-e names] \ +[-o dir] \ +[-R name] \ +[-v[n]] \ +[-V] \ +[-w[n]] \ +[-\ +1\ +a\ +C\ +D\ +c\ +f\ +G\ +g\ +I\ +K\ +L\ +N\ +r\ +s\ +T\ +t\ +U\ +x\ +] \ +source-file\n"; + +#if NO_LEAKS +static void +free_namelist(char **src) +{ + if (src != 0) { + int n; + for (n = 0; src[n] != 0; ++n) + free(src[n]); + free(src); + } +} +#endif + +static void +cleanup(void) +{ +#if NO_LEAKS + free_namelist(namelst); + _nc_leaks_dump_entry(); +#endif + if (tmp_fp != 0) + fclose(tmp_fp); + if (to_remove != 0) { + int rc; + +#if HAVE_REMOVE + rc = remove(to_remove); +#else + rc = unlink(to_remove); +#endif + if (rc != 0) + perror(to_remove); + } +} + +static void +failed(const char *msg) +{ + perror(msg); + ExitProgram(EXIT_FAILURE); +} + +static void +usage(void) +{ +#define DATA(s) s "\n" + static const char options_string[] = + { + DATA("Options:") + DATA(" -0 format translation output all capabilities on one line") + DATA(" -1 format translation output one capability per line") +#if NCURSES_XNAMES + DATA(" -a retain commented-out capabilities (sets -x also)") +#endif + DATA(" -C translate entries to termcap source form") + DATA(" -D print list of tic's database locations (first must be writable)") + DATA(" -c check only, validate input without compiling or translating") + DATA(" -e translate/compile only entries named by comma-separated list") + DATA(" -f format complex strings for readability") + DATA(" -G format %{number} to %'char'") + DATA(" -g format %'char' to %{number}") + DATA(" -I translate entries to terminfo source form") + DATA(" -K translate entries to termcap source form with BSD syntax") + DATA(" -L translate entries to full terminfo source form") + DATA(" -N disable smart defaults for source translation") + DATA(" -o

set output directory for compiled entry writes") + DATA(" -Q[n] dump compiled description") + DATA(" -q brief listing, removes headers") + DATA(" -R restrict translation to given terminfo/termcap version") + DATA(" -r force resolution of all use entries in source translation") + DATA(" -s print summary statistics") + DATA(" -T remove size-restrictions on compiled description") +#if NCURSES_XNAMES + DATA(" -t suppress commented-out capabilities") +#endif + DATA(" -U suppress post-processing of entries") + DATA(" -V print version") + DATA(" -W wrap long strings according to -w[n] option") + DATA(" -v[n] set verbosity level") + DATA(" -w[n] set format width for translation output") +#if NCURSES_XNAMES + DATA(" -x treat unknown capabilities as user-defined") +#endif + DATA("") + DATA("Parameters:") + DATA(" file to translate or compile") + }; +#undef DATA + + fprintf(stderr, "Usage: %s %s\n", _nc_progname, usage_string); + fputs(options_string, stderr); + ExitProgram(EXIT_FAILURE); +} + +#define L_BRACE '{' +#define R_BRACE '}' +#define S_QUOTE '\'' + +static void +write_it(ENTRY * ep) +{ + unsigned n; + int ch; + char *s, *d; + const char *t; + char result[MAX_ENTRY_SIZE]; + + /* + * Look for strings that contain %{number}, convert them to %'char', + * which is shorter and runs a little faster. + */ + for (n = 0; n < STRCOUNT; n++) { + s = ep->tterm.Strings[n]; + if (VALID_STRING(s) + && strchr(s, L_BRACE) != 0) { + d = result; + t = s; + while ((ch = *t++) != 0) { + *d++ = (char) ch; + if (ch == '\\') { + if ((*d++ = *t++) == '\0') + break; + } else if ((ch == '%') + && (*t == L_BRACE)) { + char *v = 0; + long value = strtol(t + 1, &v, 0); + if (v != 0 + && *v == R_BRACE + && value > 0 + && value != '\\' /* FIXME */ + && value < 127 + && isprint((int) value)) { + *d++ = S_QUOTE; + *d++ = (char) value; + *d++ = S_QUOTE; + t = (v + 1); + } + } + } + *d = 0; + if (strlen(result) < strlen(s)) + _nc_STRCPY(s, result, strlen(s) + 1); + } + } + + _nc_set_type(_nc_first_name(ep->tterm.term_names)); + _nc_curr_line = (int) ep->startline; + _nc_write_entry(&ep->tterm); +} + +static bool +immedhook(ENTRY * ep GCC_UNUSED) +/* write out entries with no use capabilities immediately to save storage */ +{ +#if !HAVE_BIG_CORE + /* + * This is strictly a core-economy kluge. The really clean way to handle + * compilation is to slurp the whole file into core and then do all the + * name-collision checks and entry writes in one swell foop. But the + * terminfo master file is large enough that some core-poor systems swap + * like crazy when you compile it this way...there have been reports of + * this process taking *three hours*, rather than the twenty seconds or + * less typical on my development box. + * + * So. This hook *immediately* writes out the referenced entry if it + * has no use capabilities. The compiler main loop refrains from + * adding the entry to the in-core list when this hook fires. If some + * other entry later needs to reference an entry that got written + * immediately, that's OK; the resolution code will fetch it off disk + * when it can't find it in core. + * + * Name collisions will still be detected, just not as cleanly. The + * write_entry() code complains before overwriting an entry that + * postdates the time of tic's first call to write_entry(). Thus + * it will complain about overwriting entries newly made during the + * tic run, but not about overwriting ones that predate it. + * + * The reason this is a hook, and not in line with the rest of the + * compiler code, is that the support for termcap fallback cannot assume + * it has anywhere to spool out these entries! + * + * The _nc_set_type() call here requires a compensating one in + * _nc_parse_entry(). + * + * If you define HAVE_BIG_CORE, you'll disable this kluge. This will + * make tic a bit faster (because the resolution code won't have to do + * disk I/O nearly as often). + */ + if (ep->nuses == 0) { + int oldline = _nc_curr_line; + + write_it(ep); + _nc_curr_line = oldline; + free(ep->tterm.str_table); + return (TRUE); + } +#endif /* HAVE_BIG_CORE */ + return (FALSE); +} + +static void +put_translate(int c) +/* emit a comment char, translating terminfo names to termcap names */ +{ + static bool in_name = FALSE; + static size_t used; + + if (in_name) { + static size_t have; + static char *namebuf, *suffix; + + if (used + 1 >= have) { + have += 132; + if ((namebuf = typeRealloc(char, have, namebuf)) == NULL) + failed("put_translate namebuf"); + if ((suffix = typeRealloc(char, have, suffix)) == NULL) + failed("put_translate suffix"); + } + if (c == '\n' || c == '@') { + namebuf[used++] = '\0'; + (void) putchar('<'); + (void) fputs(namebuf, stdout); + putchar(c); + in_name = FALSE; + } else if (c != '>') { + namebuf[used++] = (char) c; + } else { /* ah! candidate name! */ + char *up; + NCURSES_CONST char *tp; + + namebuf[used++] = '\0'; + in_name = FALSE; + + suffix[0] = '\0'; + if ((up = strchr(namebuf, '#')) != 0 + || (up = strchr(namebuf, '=')) != 0 + || ((up = strchr(namebuf, '@')) != 0 && up[1] == '>')) { + _nc_STRCPY(suffix, up, have); + *up = '\0'; + } + + if ((tp = nametrans(namebuf)) != 0) { + (void) putchar(':'); + (void) fputs(tp, stdout); + (void) fputs(suffix, stdout); + (void) putchar(':'); + } else { + /* couldn't find a translation, just dump the name */ + (void) putchar('<'); + (void) fputs(namebuf, stdout); + (void) fputs(suffix, stdout); + (void) putchar('>'); + } + } + } else { + used = 0; + if (c == '<') { + in_name = TRUE; + } else { + putchar(c); + } + } +} + +/* Returns a string, stripped of leading/trailing whitespace */ +static char * +stripped(char *src) +{ + char *dst = 0; + + while (isspace(UChar(*src))) + src++; + + if (*src != '\0') { + if ((dst = strdup(src)) == NULL) { + failed("strdup"); + } else { + size_t len = strlen(dst); + while (--len != 0 && isspace(UChar(dst[len]))) + dst[len] = '\0'; + } + } + return dst; +} + +static FILE * +open_tempfile(char *filename) +{ + FILE *result = 0; + + _nc_STRCPY(filename, "/tmp/XXXXXX", PATH_MAX); +#if HAVE_MKSTEMP + { + int oldmask = (int) umask(077); + int fd = mkstemp(filename); + if (fd >= 0) + result = fdopen(fd, "w"); + umask((mode_t) oldmask); + } +#else + if (tmpnam(filename) != 0) + result = safe_fopen(filename, "w"); +#endif + return result; +} + +static FILE * +copy_input(FILE *source, const char *filename, char *alt_file) +{ + char my_altfile[PATH_MAX]; + FILE *result = 0; + FILE *target; + + if (alt_file == NULL) + alt_file = my_altfile; + + if (source == NULL) { + failed("copy_input (source)"); + } else if ((target = open_tempfile(alt_file)) == NULL) { + failed("copy_input (target)"); + } else { + clearerr(source); + for (;;) { + int ch = fgetc(source); + if (feof(source)) { + break; + } else if (ferror(source)) { + failed(filename); + } else if (ch == 0) { + /* don't loop in case someone wants to convert /dev/zero */ + fprintf(stderr, "%s: %s is not a text-file\n", _nc_progname, filename); + ExitProgram(EXIT_FAILURE); + } + fputc(ch, target); + } + fclose(source); + /* + * rewind() does not force the target file's data to disk (not does + * fflush()...). So open a second stream on the data and then close + * the one that we were writing on before starting to read from the + * second stream. + */ + result = safe_fopen(alt_file, "r+"); + fclose(target); + to_remove = strdup(alt_file); + } + return result; +} + +static FILE * +open_input(const char *filename, char *alt_file) +{ + FILE *fp; + struct stat sb; + int mode; + + if (!strcmp(filename, "-")) { + fp = copy_input(stdin, STDIN_NAME, alt_file); + } else if (stat(filename, &sb) == -1) { + fprintf(stderr, "%s: cannot open '%s': %s\n", _nc_progname, + filename, strerror(errno)); + ExitProgram(EXIT_FAILURE); + } else if ((mode = (sb.st_mode & S_IFMT)) == S_IFDIR + || (mode != S_IFREG && mode != S_IFCHR && mode != S_IFIFO)) { + fprintf(stderr, "%s: cannot open '%s'; it is not a file\n", + _nc_progname, filename); + ExitProgram(EXIT_FAILURE); + } else { + fp = safe_fopen(filename, "r"); + + if (fp == NULL) { + fprintf(stderr, "%s: cannot open '%s': %s\n", _nc_progname, + filename, strerror(errno)); + ExitProgram(EXIT_FAILURE); + } + if (mode != S_IFREG) { + if (alt_file != 0) { + FILE *fp2 = copy_input(fp, filename, alt_file); + fp = fp2; + } else { + fprintf(stderr, "%s: cannot open '%s'; it is not a" + " file\n", _nc_progname, filename); + ExitProgram(EXIT_FAILURE); + } + } + } + return fp; +} + +/* Parse the "-e" option-value into a list of names */ +static char ** +make_namelist(char *src) +{ + char **dst = 0; + + char *s, *base; + unsigned pass, n, nn; + char buffer[BUFSIZ]; + + if (src == NULL) { + /* EMPTY */ ; + } else if (strchr(src, '/') != 0) { /* a filename */ + FILE *fp = open_input(src, (char *) 0); + + for (pass = 1; pass <= 2; pass++) { + nn = 0; + while (fgets(buffer, sizeof(buffer), fp) != 0) { + if ((s = stripped(buffer)) != 0) { + if (dst != 0) + dst[nn] = s; + else + free(s); + nn++; + } + } + if (pass == 1) { + if ((dst = typeCalloc(char *, nn + 1)) == NULL) + failed("make_namelist"); + rewind(fp); + } + } + fclose(fp); + } else { /* literal list of names */ + for (pass = 1; pass <= 2; pass++) { + for (n = nn = 0, base = src;; n++) { + int mark = src[n]; + if (mark == ',' || mark == '\0') { + if (pass == 1) { + nn++; + } else { + src[n] = '\0'; + if ((s = stripped(base)) != 0) + dst[nn++] = s; + base = &src[n + 1]; + } + } + if (mark == '\0') + break; + } + if (pass == 1) { + if ((dst = typeCalloc(char *, nn + 1)) == NULL) + failed("make_namelist"); + } + } + } + if (showsummary && (dst != 0)) { + fprintf(log_fp, "Entries that will be compiled:\n"); + for (n = 0; dst[n] != 0; n++) + fprintf(log_fp, "%u:%s\n", n + 1, dst[n]); + } + return dst; +} + +static bool +matches(char **needle, const char *haystack) +/* does entry in needle list match |-separated field in haystack? */ +{ + bool code = FALSE; + + if (needle != 0) { + size_t n; + + for (n = 0; needle[n] != 0; n++) { + if (_nc_name_match(haystack, needle[n], "|")) { + code = TRUE; + break; + } + } + } else + code = TRUE; + return (code); +} + +static char * +valid_db_path(const char *nominal) +{ + struct stat sb; +#if USE_HASHED_DB + char suffix[] = DBM_SUFFIX; + size_t need = strlen(nominal) + sizeof(suffix); + char *result = malloc(need); + + if (result == NULL) + failed("valid_db_path"); + _nc_STRCPY(result, nominal, need); + if (strcmp(result + need - sizeof(suffix), suffix)) { + _nc_STRCAT(result, suffix, need); + } +#else + char *result = strdup(nominal); +#endif + + DEBUG(1, ("** stat(%s)", result)); + if (stat(result, &sb) >= 0) { +#if USE_HASHED_DB + if (!S_ISREG(sb.st_mode) + || access(result, R_OK | W_OK) != 0) { + DEBUG(1, ("...not a writable file")); + free(result); + result = 0; + } +#else + if (!S_ISDIR(sb.st_mode) + || access(result, R_OK | W_OK | X_OK) != 0) { + DEBUG(1, ("...not a writable directory")); + free(result); + result = 0; + } +#endif + } else { + /* check if parent is directory and is writable */ + unsigned leaf = _nc_pathlast(result); + + DEBUG(1, ("...not found")); + if (leaf) { + char save = result[leaf]; + result[leaf] = 0; + if (stat(result, &sb) >= 0 + && S_ISDIR(sb.st_mode) + && access(result, R_OK | W_OK | X_OK) == 0) { + result[leaf] = save; + } else { + DEBUG(1, ("...parent directory %s is not writable", result)); + free(result); + result = 0; + } + } else { + DEBUG(1, ("... no parent directory")); + free(result); + result = 0; + } + } + return result; +} + +/* + * Show the databases to which tic could write. The location to which it + * writes is always the first one. If none are writable, print an error + * message. + */ +static void +show_databases(const char *outdir) +{ + bool specific = (outdir != 0) || getenv("TERMINFO") != 0; + char *result; + const char *tried = 0; + + if (outdir == NULL) { + outdir = _nc_tic_dir(NULL); + } + if ((result = valid_db_path(outdir)) != 0) { + printf("%s\n", result); + free(result); + } else { + tried = outdir; + } + + if ((outdir = _nc_home_terminfo())) { + if ((result = valid_db_path(outdir)) != 0) { + printf("%s\n", result); + free(result); + } else if (!specific) { + tried = outdir; + } + } + + /* + * If we can write in neither location, give an error message. + */ + if (tried) { + fflush(stdout); + fprintf(stderr, "%s: %s (no permission)\n", _nc_progname, tried); + ExitProgram(EXIT_FAILURE); + } +} + +static void +add_digit(int *target, int source) +{ + *target = (*target * 10) + (source - '0'); +} + +int +main(int argc, char *argv[]) +{ + char my_tmpname[PATH_MAX]; + int v_opt = -1; + int smart_defaults = TRUE; + char *termcap; + ENTRY *qp; + + int this_opt, last_opt = '?'; + + int outform = F_TERMINFO; /* output format */ + int sortmode = S_TERMINFO; /* sort_mode */ + + int width = 60; + int height = 65535; + bool formatted = FALSE; /* reformat complex strings? */ + bool literal = FALSE; /* suppress post-processing? */ + int numbers = 0; /* format "%'char'" to/from "%{number}" */ + bool forceresolve = FALSE; /* force resolution */ + bool limited = TRUE; + char *tversion = (char *) NULL; + const char *source_file; + char *outdir = (char *) NULL; + bool check_only = FALSE; + bool suppress_untranslatable = FALSE; + int quickdump = 0; + bool quiet = FALSE; + bool wrap_strings = FALSE; + + log_fp = stderr; + + _nc_progname = _nc_rootname(argv[0]); + atexit(cleanup); + + if ((infodump = same_program(_nc_progname, PROG_CAPTOINFO)) != FALSE) { + outform = F_TERMINFO; + sortmode = S_TERMINFO; + } + if ((capdump = same_program(_nc_progname, PROG_INFOTOCAP)) != FALSE) { + outform = F_TERMCAP; + sortmode = S_TERMCAP; + } +#if NCURSES_XNAMES + /* set this directly to avoid interaction with -v and -D options */ + _nc_user_definable = FALSE; +#endif + _nc_strict_bsd = 0; + + /* + * Processing arguments is a little complicated, since someone made a + * design decision to allow the numeric values for -w, -v options to + * be optional. + */ + while ((this_opt = getopt(argc, argv, + "0123456789CDIKLNQR:TUVWace:fGgo:qrstvwx")) != -1) { + if (isdigit(this_opt)) { + switch (last_opt) { + case 'Q': + add_digit(&quickdump, this_opt); + break; + case 'v': + add_digit(&v_opt, this_opt); + break; + case 'w': + add_digit(&width, this_opt); + break; + default: + switch (this_opt) { + case '0': + last_opt = this_opt; + width = 65535; + height = 1; + break; + case '1': + last_opt = this_opt; + width = 0; + break; + default: + usage(); + } + } + continue; + } + switch (this_opt) { + case 'K': + _nc_strict_bsd = 1; + /* the initial version of -K in 20110730 fell-thru here, but the + * same flag is useful when reading sources -TD + */ + break; + case 'C': + capdump = TRUE; + outform = F_TERMCAP; + sortmode = S_TERMCAP; + break; + case 'D': + debug_level = VtoTrace(v_opt); + use_verbosity(debug_level); + show_databases(outdir); + ExitProgram(EXIT_SUCCESS); + break; + case 'I': + infodump = TRUE; + outform = F_TERMINFO; + sortmode = S_TERMINFO; + break; + case 'L': + infodump = TRUE; + outform = F_VARIABLE; + sortmode = S_VARIABLE; + break; + case 'N': + smart_defaults = FALSE; + literal = TRUE; + break; + case 'Q': + quickdump = 0; + break; + case 'R': + tversion = optarg; + break; + case 'T': + limited = FALSE; + break; + case 'U': + literal = TRUE; + break; + case 'V': + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + case 'W': + wrap_strings = TRUE; + break; + case 'c': + check_only = TRUE; + break; + case 'e': + namelst = make_namelist(optarg); + break; + case 'f': + formatted = TRUE; + break; + case 'G': + numbers = 1; + break; + case 'g': + numbers = -1; + break; + case 'o': + outdir = optarg; + break; + case 'q': + quiet = TRUE; + break; + case 'r': + forceresolve = TRUE; + break; + case 's': + showsummary = TRUE; + break; + case 'v': + v_opt = 0; + break; + case 'w': + width = 0; + break; +#if NCURSES_XNAMES + case 't': + _nc_disable_period = FALSE; + suppress_untranslatable = TRUE; + break; + case 'a': + _nc_disable_period = TRUE; + /* FALLTHRU */ + case 'x': + using_extensions = TRUE; + break; +#endif + default: + usage(); + } + last_opt = this_opt; + } + + /* + * If the -v option is set, it may override the $NCURSES_TRACE environment + * variable, e.g., for -v3 and up. + */ + debug_level = VtoTrace(v_opt); + use_verbosity(debug_level); + + /* + * Do this after setting debug_level, since the function calls START_TRACE, + * which uses the $NCURSES_TRACE environment variable if _nc_tracing bits + * for tracing are zero. + */ +#if NCURSES_XNAMES + if (using_extensions) { + use_extended_names(TRUE); + } +#endif + + if (_nc_tracing) { + save_check_termtype = _nc_check_termtype2; + _nc_check_termtype2 = check_termtype; + } +#if !HAVE_BIG_CORE + /* + * Aaargh! immedhook seriously hoses us! + * + * One problem with immedhook is it means we can't do -e. Problem + * is that we can't guarantee that for each terminal listed, all the + * terminals it depends on will have been kept in core for reference + * resolution -- in fact it is certain the primitive types at the end + * of reference chains *won't* be in core unless they were explicitly + * in the select list themselves. + */ + if (namelst && (!infodump && !capdump)) { + (void) fprintf(stderr, + "%s: Sorry, -e can't be used without -I or -C\n", + _nc_progname); + ExitProgram(EXIT_FAILURE); + } +#endif /* HAVE_BIG_CORE */ + + if (optind < argc) { + source_file = argv[optind++]; + if (optind < argc) { + fprintf(stderr, + "%s: Too many file names. Usage:\n\t%s %s", + _nc_progname, + _nc_progname, + usage_string); + ExitProgram(EXIT_FAILURE); + } + } else { + if (infodump == TRUE) { + /* captoinfo's no-argument case */ + source_file = "/etc/termcap"; + if ((termcap = getenv("TERMCAP")) != 0 + && (namelst = make_namelist(getenv("TERM"))) != 0) { + if (access(termcap, F_OK) == 0) { + /* file exists */ + source_file = termcap; + } else { + if ((tmp_fp = open_tempfile(my_tmpname)) != 0) { + source_file = my_tmpname; + fprintf(tmp_fp, "%s\n", termcap); + fclose(tmp_fp); + tmp_fp = open_input(source_file, (char *) 0); + to_remove = source_file; + } else { + failed("tmpnam"); + } + } + } + } else { + /* tic */ + fprintf(stderr, + "%s: File name needed. Usage:\n\t%s %s", + _nc_progname, + _nc_progname, + usage_string); + ExitProgram(EXIT_FAILURE); + } + } + + if (tmp_fp == NULL) { + char my_altfile[PATH_MAX]; + tmp_fp = open_input(source_file, my_altfile); + if (!strcmp(source_file, "-")) { + source_file = STDIN_NAME; + } + } + + if (infodump || check_only) { + dump_init(tversion, + (smart_defaults + ? outform + : F_LITERAL), + sortmode, + wrap_strings, width, height, + debug_level, formatted || check_only, check_only, quickdump); + } else if (capdump) { + dump_init(tversion, + outform, + sortmode, + wrap_strings, width, height, + debug_level, FALSE, FALSE, FALSE); + } + + /* parse entries out of the source file */ + _nc_set_source(source_file); +#if !HAVE_BIG_CORE + if (!(check_only || infodump || capdump)) + _nc_set_writedir(outdir); +#endif /* HAVE_BIG_CORE */ + _nc_read_entry_source(tmp_fp, (char *) NULL, + !smart_defaults || literal, FALSE, + ((check_only || infodump || capdump) + ? NULLHOOK + : immedhook)); + + /* do use resolution */ + if (check_only || (!infodump && !capdump) || forceresolve) { + if (!_nc_resolve_uses2(TRUE, literal) && !check_only) { + ExitProgram(EXIT_FAILURE); + } + } + + /* length check */ + if (check_only && limited && (capdump || infodump)) { + for_entry_list(qp) { + if (matches(namelst, qp->tterm.term_names)) { + int len = fmt_entry(&qp->tterm, NULL, FALSE, TRUE, infodump, numbers); + + if (len > (infodump ? MAX_TERMINFO_LENGTH : MAX_TERMCAP_LENGTH)) + (void) fprintf(stderr, + "%s: resolved %s entry is %d bytes long\n", + _nc_progname, + _nc_first_name(qp->tterm.term_names), + len); + } + } + } + + /* write or dump all entries */ + if (check_only) { + /* this is in case infotocap() generates warnings */ + _nc_curr_col = _nc_curr_line = -1; + + for_entry_list(qp) { + if (matches(namelst, qp->tterm.term_names)) { + /* this is in case infotocap() generates warnings */ + _nc_set_type(_nc_first_name(qp->tterm.term_names)); + _nc_curr_line = (int) qp->startline; + repair_acsc(&qp->tterm); + dump_entry(&qp->tterm, suppress_untranslatable, + limited, numbers, NULL); + } + } + } else { + if (!infodump && !capdump) { + _nc_set_writedir(outdir); + for_entry_list(qp) { + if (matches(namelst, qp->tterm.term_names)) + write_it(qp); + } + } else { + /* this is in case infotocap() generates warnings */ + _nc_curr_col = _nc_curr_line = -1; + + for_entry_list(qp) { + if (matches(namelst, qp->tterm.term_names)) { + long j = qp->cend - qp->cstart; + int len = 0; + + /* this is in case infotocap() generates warnings */ + _nc_set_type(_nc_first_name(qp->tterm.term_names)); + + if (!quiet) { + (void) fseek(tmp_fp, qp->cstart, SEEK_SET); + while (j-- > 0) { + int ch = fgetc(tmp_fp); + if (ch == EOF || ferror(tmp_fp)) { + break; + } else if (infodump) { + (void) putchar(ch); + } else { + put_translate(ch); + } + } + } + + repair_acsc(&qp->tterm); + dump_entry(&qp->tterm, suppress_untranslatable, + limited, numbers, NULL); + for (j = 0; j < (long) qp->nuses; j++) + dump_uses(qp->uses[j].name, !capdump); + len = show_entry(); + if (debug_level != 0 && !limited) + printf("# length=%d\n", len); + } + } + if (!namelst && _nc_tail && !quiet) { + int c, oldc = '\0'; + bool in_comment = FALSE; + bool trailing_comment = FALSE; + + (void) fseek(tmp_fp, _nc_tail->cend, SEEK_SET); + while ((c = fgetc(tmp_fp)) != EOF) { + if (oldc == '\n') { + if (c == '#') { + trailing_comment = TRUE; + in_comment = TRUE; + } else { + in_comment = FALSE; + } + } + if (trailing_comment + && (in_comment || (oldc == '\n' && c == '\n'))) + putchar(c); + oldc = c; + } + } + } + } + + /* Show the directory into which entries were written, and the total + * number of entries + */ + if (showsummary + && (!(check_only || infodump || capdump))) { + int total = _nc_tic_written(); + if (total != 0) + fprintf(log_fp, "%d entries written to %s\n", + total, + _nc_tic_dir(NULL)); + else + fprintf(log_fp, "No entries written\n"); + } + ExitProgram(EXIT_SUCCESS); +} + +/* + * This bit of legerdemain turns all the terminfo variable names into + * references to locations in the arrays Booleans, Numbers, and Strings --- + * precisely what's needed (see comp_parse.c). + */ +#undef CUR +#define CUR tp-> + +/* + * Check if the alternate character-set capabilities are consistent. + */ +static void +check_acs(const TERMTYPE2 *tp) +{ + int vt100_smacs = 0; + int vt100_rmacs = 0; + int vt100_enacs = 0; + + /* + * ena_acs is not always necessary, but if it is present, the enter/exit + * capabilities should be. + */ + ANDMISSING(ena_acs, enter_alt_charset_mode); + ANDMISSING(ena_acs, exit_alt_charset_mode); + PAIRED(exit_alt_charset_mode, exit_alt_charset_mode); + + /* + * vt100-like is frequently used, but perhaps ena_acs is missing, etc. + */ + if (VALID_STRING(enter_alt_charset_mode)) { + vt100_smacs = (!strcmp("\033(0", enter_alt_charset_mode) + ? 2 + : (!strcmp("\016", enter_alt_charset_mode) + ? 1 + : 0)); + } + if (VALID_STRING(exit_alt_charset_mode)) { + vt100_rmacs = (!strcmp("\033(B", exit_alt_charset_mode) + ? 2 + : (!strcmp("\017", exit_alt_charset_mode) + ? 1 + : 0)); + } + if (VALID_STRING(ena_acs)) { + vt100_enacs = (!strcmp("\033(B\033)0", ena_acs) + ? 2 + : 0); + } + if (vt100_rmacs && vt100_smacs && (vt100_rmacs != vt100_smacs)) { + _nc_warning("rmacs/smacs are inconsistent"); + } + if ((vt100_rmacs == 2) && (vt100_smacs == 2) && vt100_enacs) { + _nc_warning("rmacs/smacs make enacs redundant"); + } + if ((vt100_rmacs == 1) && (vt100_smacs == 1) && !vt100_enacs) { + _nc_warning("VT100-style rmacs/smacs require enacs"); + } + + if (VALID_STRING(acs_chars)) { + const char *boxes = "lmkjtuvwqxn"; + char mapped[256]; + char missing[256]; + const char *p; + char *q; + + memset(mapped, 0, sizeof(mapped)); + memset(missing, 0, sizeof(missing)); + for (p = acs_chars; *p != '\0'; p += 2) { + if (p[1] == '\0') { + _nc_warning("acsc has odd number of characters"); + break; + } + mapped[UChar(p[0])] = p[1]; + } + + if (mapped[UChar('I')] && !mapped[UChar('i')]) { + _nc_warning("acsc refers to 'I', which is probably an error"); + } + + for (p = boxes, q = missing; *p != '\0'; ++p) { + if (!mapped[UChar(p[0])]) { + *q++ = p[0]; + } + } + *q = '\0'; + + assert(strlen(missing) <= strlen(boxes)); + if (*missing != '\0' && strcmp(missing, boxes)) { + _nc_warning("acsc is missing some line-drawing mapping: %s", missing); + } + } +} + +static char * +safe_strdup(const char *value) +{ + if (value == NULL) + value = ""; + return strdup(value); +} + +static bool +same_color(NCURSES_CONST char *oldcap, NCURSES_CONST char *newcap, int limit) +{ + bool result = FALSE; + if (limit > 16) + limit = 16; + if (limit >= 8) { + int n; + int same; + for (n = same = 0; n < limit; ++n) { + char *oldvalue = safe_strdup(TIPARM_1(oldcap, n)); + char *newvalue = safe_strdup(TIPARM_1(newcap, n)); + same += !strcmp(oldvalue, newvalue); + free(oldvalue); + free(newvalue); + } + result = (same == limit); + } + return result; +} + +/* + * Check if the color capabilities are consistent + */ +static void +check_colors(TERMTYPE2 *tp) +{ + char *value; + + if ((max_colors > 0) != (max_pairs > 0) + || ((max_colors > max_pairs) && !VALID_STRING(initialize_pair))) + _nc_warning("inconsistent values for max_colors (%d) and max_pairs (%d)", + max_colors, max_pairs); + + PAIRED(set_foreground, set_background); + PAIRED(set_a_foreground, set_a_background); + PAIRED(set_color_pair, initialize_pair); + + if (VALID_STRING(set_foreground) + && VALID_STRING(set_a_foreground)) { + if (!_nc_capcmp(set_foreground, set_a_foreground)) { + _nc_warning("expected setf/setaf to be different"); + } else if (same_color(set_foreground, set_a_foreground, max_colors)) { + _nc_warning("setf/setaf are equivalent"); + } + } + + if (VALID_STRING(set_background) + && VALID_STRING(set_a_background)) { + if (!_nc_capcmp(set_background, set_a_background)) { + _nc_warning("expected setb/setab to be different"); + } else if (same_color(set_background, set_a_background, max_colors)) { + _nc_warning("setb/setab are equivalent"); + } + } + + /* see: has_colors() */ + if (VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs) + && ((VALID_STRING(set_foreground) + && VALID_STRING(set_background)) + || (VALID_STRING(set_a_foreground) + && VALID_STRING(set_a_background)) + || set_color_pair)) { + if (!VALID_STRING(orig_pair) && !VALID_STRING(orig_colors)) + _nc_warning("expected either op/oc string for resetting colors"); + } + if (can_change) { + if (!VALID_STRING(initialize_pair) && + !VALID_STRING(initialize_color)) { + _nc_warning("expected initc or initp because ccc is given"); + } + } else { + if (VALID_STRING(initialize_pair) || + VALID_STRING(initialize_color)) { + _nc_warning("expected ccc because initc is given"); + } + } + value = tigetstr("RGB"); + if (VALID_STRING(value)) { + int r, g, b; + char bad; + int code = sscanf(value, "%d/%d/%d%c", &r, &g, &b, &bad); + if (code != 3 || r <= 0 || g <= 0 || b <= 0) { + _nc_warning("unexpected value for RGB capability: %s", value); + } + } +} + +static int +csi_length(const char *value) +{ + int result = 0; + + if (value[0] == '\033' && value[1] == '[') { + result = 2; + } else if (UChar(value[0]) == 0x9a) { + result = 1; + } + return result; +} + +static char +keypad_final(const char *string) +{ + char result = '\0'; + + if (VALID_STRING(string) + && *string++ == '\033' + && *string++ == 'O' + && strlen(string) == 1) { + result = *string; + } + + return result; +} + +static long +keypad_index(const char *string) +{ + int ch; + long result = -1; + + if ((ch = keypad_final(string)) != '\0') { + const char *list = "PQRSwxymtuvlqrsPpn"; /* app-keypad except "Enter" */ + const char *test = (strchr) (list, ch); + if (test != 0) + result = (long) (test - list); + } + return result; +} + +/* + * list[] is down, up, left, right + * "left" may be ^H rather than \E[D + * "down" may be ^J rather than \E[B + * But up/right are generally consistently escape sequences for ANSI terminals. + */ +static void +check_ansi_cursor(char *list[4]) +{ + int j, k; + bool skip[4]; + bool repeated = FALSE; + + for (j = 0; j < 4; ++j) { + skip[j] = FALSE; + for (k = 0; k < j; ++k) { + if (!strcmp(list[j], list[k])) { + char *value = _nc_tic_expand(list[k], TRUE, 0); + _nc_warning("repeated cursor control %s", value); + repeated = TRUE; + } + } + } + if (!repeated) { + const char *up = list[1]; + size_t prefix = (size_t) csi_length(up); + size_t suffix; + + if (prefix) { + suffix = prefix; + while (up[suffix] && isdigit(UChar(up[suffix]))) + ++suffix; + } + if (prefix && up[suffix] == 'A') { + skip[1] = TRUE; + if (!strcmp(list[0], "\n")) + skip[0] = TRUE; + if (!strcmp(list[2], "\b")) + skip[2] = TRUE; + + for (j = 0; j < 4; ++j) { + int want; + + if (skip[j] || strlen(list[j]) == 1) + continue; + if (memcmp(list[j], up, prefix)) { + char *value = _nc_tic_expand(list[j], TRUE, 0); + _nc_warning("inconsistent prefix for %s", value); + continue; + } + if (strlen(list[j]) < suffix) { + char *value = _nc_tic_expand(list[j], TRUE, 0); + _nc_warning("inconsistent length for %s, expected %d", + value, (int) suffix + 1); + continue; + } + want = "BADC"[j]; + if (list[j][suffix] != want) { + char *value = _nc_tic_expand(list[j], TRUE, 0); + _nc_warning("inconsistent suffix for %s, expected %c, have %c", + value, want, list[j][suffix]); + } + } + } + } +} + +#define EXPECTED(name) if (!PRESENT(name)) _nc_warning("expected " #name) +#define UNEXPECTED(name) if (PRESENT(name)) _nc_warning("unexpected " #name ", for %s", why) + +static void +check_noaddress(const TERMTYPE2 *tp, const char *why) +{ + UNEXPECTED(column_address); + UNEXPECTED(cursor_address); + UNEXPECTED(cursor_home); + UNEXPECTED(cursor_mem_address); + UNEXPECTED(cursor_to_ll); + UNEXPECTED(row_address); + UNEXPECTED(row_address); +} + +static void +check_cursor(TERMTYPE2 *tp) +{ + int count; + char *list[4]; + + if (hard_copy) { + check_noaddress(tp, "hard_copy"); + } else if (generic_type) { + check_noaddress(tp, "generic_type"); + } else if (strchr(tp->term_names, '+') == NULL) { + int y = 0; + int x = 0; + if (PRESENT(column_address)) + ++y; + if (PRESENT(cursor_address)) + y = x = 10; + if (PRESENT(cursor_home)) + ++y, ++x; + if (PRESENT(cursor_mem_address)) + y = x = 10; + if (PRESENT(cursor_to_ll)) + ++y, ++x; + if (PRESENT(row_address)) + ++x; + if (PRESENT(cursor_down)) + ++y; + if (PRESENT(cursor_up)) + ++y; + if (PRESENT(cursor_left)) + ++x; + if (PRESENT(cursor_right)) + ++x; + if (x < 2 && y < 2) { + _nc_warning("terminal lacks cursor addressing"); + } else { + if (x < 2) + _nc_warning("terminal lacks cursor column-addressing"); + if (y < 2) + _nc_warning("terminal lacks cursor row-addressing"); + } + } + + /* it is rare to have an insert-line feature without a matching delete */ + ANDMISSING(parm_insert_line, insert_line); + ANDMISSING(parm_delete_line, delete_line); + ANDMISSING(parm_insert_line, parm_delete_line); + + /* if we have a parameterized form, then the non-parameterized is easy */ + ANDMISSING(parm_down_cursor, cursor_down); + ANDMISSING(parm_up_cursor, cursor_up); + ANDMISSING(parm_left_cursor, cursor_left); + ANDMISSING(parm_right_cursor, cursor_right); + + /* Given any of a set of cursor movement, the whole set should be present. + * Technically this is not true (we could use cursor_address to fill in + * unsupported controls), but it is likely. + */ + count = 0; + if (PRESENT(parm_down_cursor)) { + list[count++] = parm_down_cursor; + } + if (PRESENT(parm_up_cursor)) { + list[count++] = parm_up_cursor; + } + if (PRESENT(parm_left_cursor)) { + list[count++] = parm_left_cursor; + } + if (PRESENT(parm_right_cursor)) { + list[count++] = parm_right_cursor; + } + if (count == 4) { + check_ansi_cursor(list); + } else if (count != 0) { + EXPECTED(parm_down_cursor); + EXPECTED(parm_up_cursor); + EXPECTED(parm_left_cursor); + EXPECTED(parm_right_cursor); + } + + count = 0; + if (PRESENT(cursor_down)) { + list[count++] = cursor_down; + } + if (PRESENT(cursor_up)) { + list[count++] = cursor_up; + } + if (PRESENT(cursor_left)) { + list[count++] = cursor_left; + } + if (PRESENT(cursor_right)) { + list[count++] = cursor_right; + } + if (count == 4) { + check_ansi_cursor(list); + } else if (count != 0) { + count = 0; + if (PRESENT(cursor_down) && strcmp(cursor_down, "\n")) + ++count; + if (PRESENT(cursor_left) && strcmp(cursor_left, "\b")) + ++count; + if (PRESENT(cursor_up) && strlen(cursor_up) > 1) + ++count; + if (PRESENT(cursor_right) && strlen(cursor_right) > 1) + ++count; + if (count) { + EXPECTED(cursor_down); + EXPECTED(cursor_up); + EXPECTED(cursor_left); + EXPECTED(cursor_right); + } + } +} + +#define MAX_KP 5 +/* + * Do a quick sanity-check for vt100-style keypads to see if the 5-key keypad + * is mapped inconsistently. + */ +static void +check_keypad(const TERMTYPE2 *tp) +{ + char show[80]; + + if (VALID_STRING(key_a1) && + VALID_STRING(key_a3) && + VALID_STRING(key_b2) && + VALID_STRING(key_c1) && + VALID_STRING(key_c3)) { + char final[MAX_KP + 1]; + long list[MAX_KP]; + int increase = 0; + int j; + + final[0] = keypad_final(key_a1); + final[1] = keypad_final(key_a3); + final[2] = keypad_final(key_b2); + final[3] = keypad_final(key_c1); + final[4] = keypad_final(key_c3); + final[5] = '\0'; + + /* special case: legacy coding using 1,2,3,0,. on the bottom */ + assert(strlen(final) <= MAX_KP); + if (!strcmp(final, "qsrpn")) + return; + + list[0] = keypad_index(key_a1); + list[1] = keypad_index(key_a3); + list[2] = keypad_index(key_b2); + list[3] = keypad_index(key_c1); + list[4] = keypad_index(key_c3); + + /* check that they're all vt100 keys */ + for (j = 0; j < MAX_KP; ++j) { + if (list[j] < 0) { + return; + } + } + + /* check if they're all in increasing order */ + for (j = 1; j < MAX_KP; ++j) { + if (list[j] > list[j - 1]) { + ++increase; + } + } + + if (increase != (MAX_KP - 1)) { + long last; + + show[0] = '\0'; + + for (j = 0, last = -1; j < MAX_KP; ++j) { + int k; + int kk; + long test; + + for (k = 0, kk = -1, test = 100; k < 5; ++k) { + if (list[k] > last && + list[k] < test) { + test = list[k]; + kk = k; + } + } + last = test; + assert(strlen(show) < (MAX_KP * 4)); + switch (kk) { + case 0: + _nc_STRCAT(show, " ka1", sizeof(show)); + break; + case 1: + _nc_STRCAT(show, " ka3", sizeof(show)); + break; + case 2: + _nc_STRCAT(show, " kb2", sizeof(show)); + break; + case 3: + _nc_STRCAT(show, " kc1", sizeof(show)); + break; + case 4: + _nc_STRCAT(show, " kc3", sizeof(show)); + break; + } + } + + _nc_warning("vt100 keypad order inconsistent: %s", show); + } + + } else if (VALID_STRING(key_a1) || + VALID_STRING(key_a3) || + VALID_STRING(key_b2) || + VALID_STRING(key_c1) || + VALID_STRING(key_c3)) { + show[0] = '\0'; + if (keypad_index(key_a1) >= 0) + _nc_STRCAT(show, " ka1", sizeof(show)); + if (keypad_index(key_a3) >= 0) + _nc_STRCAT(show, " ka3", sizeof(show)); + if (keypad_index(key_b2) >= 0) + _nc_STRCAT(show, " kb2", sizeof(show)); + if (keypad_index(key_c1) >= 0) + _nc_STRCAT(show, " kc1", sizeof(show)); + if (keypad_index(key_c3) >= 0) + _nc_STRCAT(show, " kc3", sizeof(show)); + if (*show != '\0') + _nc_warning("vt100 keypad map incomplete:%s", show); + } + + /* + * These warnings are useful for consistency checks - it is possible that + * there are real terminals with mismatches in these + */ + ANDMISSING(key_ic, key_dc); +} + +static void +check_printer(TERMTYPE2 *tp) +{ + (void) tp; +#if defined(enter_doublewide_mode) && defined(exit_doublewide_mode) + PAIRED(enter_doublewide_mode, exit_doublewide_mode); +#endif +#if defined(enter_italics_mode) && defined(exit_italics_mode) + PAIRED(enter_italics_mode, exit_italics_mode); +#endif +#if defined(enter_leftward_mode) && defined(exit_leftward_mode) + PAIRED(enter_leftward_mode, exit_leftward_mode); +#endif +#if defined(enter_micro_mode) && defined(exit_micro_mode) + PAIRED(enter_micro_mode, exit_micro_mode); +#endif +#if defined(enter_shadow_mode) && defined(exit_shadow_mode) + PAIRED(enter_shadow_mode, exit_shadow_mode); +#endif +#if defined(enter_subscript_mode) && defined(exit_subscript_mode) + PAIRED(enter_subscript_mode, exit_subscript_mode); +#endif +#if defined(enter_superscript_mode) && defined(exit_superscript_mode) + PAIRED(enter_superscript_mode, exit_superscript_mode); +#endif +#if defined(enter_upward_mode) && defined(exit_upward_mode) + PAIRED(enter_upward_mode, exit_upward_mode); +#endif + +#if defined(start_char_set_def) && defined(stop_char_set_def) + ANDMISSING(start_char_set_def, stop_char_set_def); +#endif + + /* + * If we have a parameterized form, then the non-parameterized is easy. + * note: parameterized/non-parameterized margin settings are unrelated. + */ +#if defined(parm_down_micro) && defined(micro_down) + ANDMISSING(parm_down_micro, micro_down); +#endif +#if defined(parm_left_micro) && defined(micro_left) + ANDMISSING(parm_left_micro, micro_left); +#endif +#if defined(parm_right_micro) && defined(micro_right) + ANDMISSING(parm_right_micro, micro_right); +#endif +#if defined(parm_up_micro) && defined(micro_up) + ANDMISSING(parm_up_micro, micro_up); +#endif +} + +#if NCURSES_XNAMES +static bool +uses_SGR_39_49(const char *value) +{ + return (strstr(value, "39;49") != 0 + || strstr(value, "49;39") != 0); +} + +/* + * Check consistency of termcap extensions related to "screen". + */ +static void +check_screen(TERMTYPE2 *tp) +{ + if (_nc_user_definable) { + int have_XT = tigetflag("XT"); + int have_XM = tigetflag("XM"); + int have_bce = back_color_erase; + bool have_kmouse = FALSE; + bool use_sgr_39_49 = FALSE; + const char *name_39_49 = "orig_pair or orig_colors"; + const char *name = _nc_first_name(tp->term_names); + bool is_screen = !strncmp(name, "screen", 6); + bool screen_base = (is_screen + && strchr(name, '.') == NULL); + + if (!VALID_BOOLEAN(have_bce)) { + have_bce = FALSE; + } + if (!VALID_BOOLEAN(have_XM)) { + have_XM = FALSE; + } + if (!VALID_BOOLEAN(have_XT)) { + have_XT = FALSE; + } + if (VALID_STRING(key_mouse)) { + have_kmouse = !strcmp("\033[M", key_mouse); + } + if (have_bce) { + if (VALID_STRING(orig_pair)) { + name_39_49 = "orig_pair"; + use_sgr_39_49 = uses_SGR_39_49(orig_pair); + } + if (!use_sgr_39_49 && VALID_STRING(orig_colors)) { + name_39_49 = "orig_colors"; + use_sgr_39_49 = uses_SGR_39_49(orig_colors); + } + } + + if (have_XM && have_XT) { + _nc_warning("screen's XT capability conflicts with XM"); + } else if (have_XT && screen_base) { + _nc_warning("screen's \"screen\" entries should not have XT set"); + } else if (have_XT) { + char *s; + + if (!have_kmouse && is_screen) { + if (VALID_STRING(key_mouse)) { + _nc_warning("value of kmous inconsistent with screen's usage"); + } else { + _nc_warning("expected kmous capability with XT"); + } + } + if (max_colors > 0) { + if (!have_bce) { + _nc_warning("expected bce capability with XT"); + } else if (!use_sgr_39_49) { + _nc_warning("expected %s capability with XT " + "to have 39/49 parameters", name_39_49); + } + } + if (VALID_STRING(to_status_line) + && (s = strchr(to_status_line, ';')) != NULL + && *++s == '\0') + _nc_warning("\"tsl\" capability is redundant, given XT"); + } else { + if (have_kmouse + && !have_XM + && !screen_base && strchr(name, '+') == NULL) { + _nc_warning("expected XT to be set, given kmous"); + } + } + } +} +#else +#define check_screen(tp) /* nothing */ +#endif + +/* + * Returns the expected number of parameters for the given capability. + */ +static int +expected_params(const char *name) +{ +#define DATA(name,count) { { name }, count } + /* *INDENT-OFF* */ + static const struct { + const char name[9]; + int count; + } table[] = { + DATA( "S0", 1 ), /* 'screen' extension */ + DATA( "birep", 2 ), + DATA( "chr", 1 ), + DATA( "colornm", 1 ), + DATA( "cpi", 1 ), + DATA( "csnm", 1 ), + DATA( "csr", 2 ), + DATA( "cub", 1 ), + DATA( "cud", 1 ), + DATA( "cuf", 1 ), + DATA( "cup", 2 ), + DATA( "cuu", 1 ), + DATA( "cvr", 1 ), + DATA( "cwin", 5 ), + DATA( "dch", 1 ), + DATA( "defc", 3 ), + DATA( "dial", 1 ), + DATA( "dispc", 1 ), + DATA( "dl", 1 ), + DATA( "ech", 1 ), + DATA( "getm", 1 ), + DATA( "hpa", 1 ), + DATA( "ich", 1 ), + DATA( "il", 1 ), + DATA( "indn", 1 ), + DATA( "initc", 4 ), + DATA( "initp", 7 ), + DATA( "lpi", 1 ), + DATA( "mc5p", 1 ), + DATA( "mrcup", 2 ), + DATA( "mvpa", 1 ), + DATA( "pfkey", 2 ), + DATA( "pfloc", 2 ), + DATA( "pfx", 2 ), + DATA( "pfxl", 3 ), + DATA( "pln", 2 ), + DATA( "qdial", 1 ), + DATA( "rcsd", 1 ), + DATA( "rep", 2 ), + DATA( "rin", 1 ), + DATA( "sclk", 3 ), + DATA( "scp", 1 ), + DATA( "scs", 1 ), + DATA( "scsd", 2 ), + DATA( "setab", 1 ), + DATA( "setaf", 1 ), + DATA( "setb", 1 ), + DATA( "setcolor", 1 ), + DATA( "setf", 1 ), + DATA( "sgr", 9 ), + DATA( "sgr1", 6 ), + DATA( "slength", 1 ), + DATA( "slines", 1 ), + DATA( "smgbp", 1 ), /* 2 if smgtp is not given */ + DATA( "smglp", 1 ), + DATA( "smglr", 2 ), + DATA( "smgrp", 1 ), + DATA( "smgtb", 2 ), + DATA( "smgtp", 1 ), + DATA( "tsl", 1 ), + DATA( "u6", -1 ), + DATA( "vpa", 1 ), + DATA( "wind", 4 ), + DATA( "wingo", 1 ), + }; + /* *INDENT-ON* */ +#undef DATA + + unsigned n; + int result = 0; /* function-keys, etc., use none */ + + for (n = 0; n < SIZEOF(table); n++) { + if (!strcmp(name, table[n].name)) { + result = table[n].count; + break; + } + } + + return result; +} + +/* + * Check for user-capabilities that happen to be used in ncurses' terminal + * database. + */ +#if NCURSES_XNAMES +static struct user_table_entry const * +lookup_user_capability(const char *name) +{ + struct user_table_entry const *result = 0; + if (*name != 'k') { + result = _nc_find_user_entry(name); + } + return result; +} +#endif + +/* + * If a given name is likely to be a user-capability, return the number of + * parameters it would be used with. If not, return -1. + * + * ncurses assumes that u6 could be used for getting the cursor-position, but + * that is not implemented. Make a special case for that, to quiet needless + * warnings. + * + * The other string-capability extensions (see terminfo.src) which could have + * parameters such as "Ss", "%u", are not used by ncurses. But we check those + * anyway, to validate the terminfo database. + */ +static int +is_user_capability(const char *name) +{ + int result = -1; + if (name[0] == 'u' && + (name[1] >= '0' && name[1] <= '9') && + name[2] == '\0') { + result = (name[1] == '6') ? 2 : 0; + } +#if NCURSES_XNAMES + else if (using_extensions) { + struct user_table_entry const *p = lookup_user_capability(name); + if (p != 0) { + result = (int) p->ute_argc; + } + } +#endif + return result; +} + +static bool +line_capability(const char *name) +{ + bool result = FALSE; + static const char *table[] = + { + "csr", /* change_scroll_region */ + "clear", /* clear_screen */ + "ed", /* clr_eos */ + "cwin", /* create_window */ + "cup", /* cursor_address */ + "cud1", /* cursor_down */ + "home", /* cursor_home */ + "mrcup", /* cursor_mem_address */ + "ll", /* cursor_to_ll */ + "cuu1", /* cursor_up */ + "dl1", /* delete_line */ + "hd", /* down_half_line */ + "flash", /* flash_screen */ + "ff", /* form_feed */ + "il1", /* insert_line */ + "nel", /* newline */ + "dl", /* parm_delete_line */ + "cud", /* parm_down_cursor */ + "indn", /* parm_index */ + "il", /* parm_insert_line */ + "rin", /* parm_rindex */ + "cuu", /* parm_up_cursor */ + "mc0", /* print_screen */ + "vpa", /* row_address */ + "ind", /* scroll_forward */ + "ri", /* scroll_reverse */ + "hu", /* up_half_line */ + }; + size_t n; + for (n = 0; n < SIZEOF(table); ++n) { + if (!strcmp(name, table[n])) { + result = TRUE; + break; + } + } + return result; +} + +/* + * Make a quick sanity check for the parameters which are used in the given + * strings. If there are no "%p" tokens, then there should be no other "%" + * markers. + */ +static void +check_params(const TERMTYPE2 *tp, const char *name, const char *value, int extended) +{ + int expected = expected_params(name); + int actual = 0; + int n; + bool params[1 + NUM_PARM]; + const char *s = value; + +#ifdef set_left_margin_parm + if (!strcmp(name, "smgrp") + && !VALID_STRING(set_left_margin_parm)) + expected = 2; +#endif +#ifdef set_right_margin_parm + if (!strcmp(name, "smglp") + && !VALID_STRING(set_right_margin_parm)) + expected = 2; +#endif +#ifdef set_top_margin_parm + if (!strcmp(name, "smgbp") + && !VALID_STRING(set_top_margin_parm)) + expected = 2; +#endif +#ifdef set_bottom_margin_parm + if (!strcmp(name, "smgtp") + && !VALID_STRING(set_bottom_margin_parm)) + expected = 2; +#endif + + for (n = 0; n <= NUM_PARM; n++) + params[n] = FALSE; + + while (*s != 0) { + if (*s == '%') { + if (*++s == '\0') { + _nc_warning("expected character after %% in %s", name); + break; + } else if (*s == 'p') { + if (*++s == '\0' || !isdigit((int) *s)) { + _nc_warning("expected digit after %%p in %s", name); + return; + } else { + n = (*s - '0'); + if (n > actual) + actual = n; + params[n] = TRUE; + } + } + } + s++; + } + +#if NCURSES_XNAMES + if (extended) { + int check = is_user_capability(name); + if (check != actual && (check >= 0 && actual >= 0)) { + _nc_warning("extended %s capability has %d parameters, expected %d", + name, actual, check); + } else if (debug_level > 1) { + _nc_warning("extended %s capability has %d parameters, as expected", + name, actual); + } + expected = actual; + } +#else + (void) extended; +#endif + + if (params[0]) { + _nc_warning("%s refers to parameter 0 (%%p0), which is not allowed", name); + } + if (value == set_attributes || expected < 0) { + ; + } else if (expected != actual) { + _nc_warning("%s uses %d parameters, expected %d", name, + actual, expected); + for (n = 1; n < actual; n++) { + if (!params[n]) + _nc_warning("%s omits parameter %d", name, n); + } + } + + /* + * Counting "%p" markers does not account for termcap expressions which + * may not have been fully translated. Also, tparm does its own analysis. + * Report differences here. + */ + _nc_reset_tparm(NULL); + if (actual >= 0) { + char *p_is_s[NUM_PARM]; + int popcount; + int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount); + if (analyzed < popcount) { + analyzed = popcount; + } + if (actual != analyzed && expected != analyzed) { +#if NCURSES_XNAMES + int user_cap = is_user_capability(name); + if ((user_cap == analyzed) && using_extensions) { + ; /* ignore */ + } else if (user_cap >= 0) { + _nc_warning("tparm will use %d parameters for %s, expected %d", + analyzed, name, user_cap); + } else +#endif + { + _nc_warning("tparm analyzed %d parameters for %s, expected %d", + analyzed, name, actual); + } + } else if (expected > 0 + && actual == expected + && guess_tparm_type(expected, p_is_s) == Numbers) { + int limit = 1; + + if (!strcmp(name, "setf") + || !strcmp(name, "setb") + || !strcmp(name, "setaf") + || !strcmp(name, "setab")) { + if ((limit = max_colors) > 256) + limit = 256; + } else if (line_capability(name)) { + limit = 24; + } else if (is_user_capability(name) < 0) { + limit = 80; + } + for (n = 0; n < limit; ++n) { + _nc_reset_tparm(NULL); + (void) TPARM_9(value, n, n, n, n, n, n, n, n, n); + if (_nc_tparm_err) { + _nc_warning("problem%s in tparm(%s, %d, ...)", + (_nc_tparm_err == 1) ? "" : "s", + name, n); + if (debug_level < 2) + break; + } + } + } + } +} + +/* + * Check for DEC VT100 private mode for reverse video. + */ +static const char * +skip_DECSCNM(const char *value, int *flag) +{ + *flag = -1; + if (value != 0) { + int skip = csi_length(value); + if (skip > 0 && + value[skip++] == '?' && + value[skip++] == '5') { + if (value[skip] == 'h') { + *flag = 1; + } else if (value[skip] == 'l') { + *flag = 0; + } + value += skip + 1; + } + } + return value; +} + +static void +check_delays(const TERMTYPE2 *tp, const char *name, const char *value) +{ + const char *p, *q; + const char *first = 0; + const char *last = 0; + + for (p = value; *p != '\0'; ++p) { + if (p[0] == '$' && p[1] == '<') { + const char *base = p + 2; + const char *mark = 0; + bool mixed = FALSE; + int proportional = 0; + int mandatory = 0; + + first = p; + + for (q = base; *q != '\0'; ++q) { + if (*q == '>') { + if (mark == NULL) + mark = q; + break; + } else if (*q == '*' || *q == '/') { + if (*q == '*') + ++proportional; + if (*q == '/') + ++mandatory; + if (mark == NULL) + mark = q; + } else if (!(isalnum(UChar(*q)) || strchr("+-.", *q) != 0)) { + break; + } else if (proportional || mandatory) { + mixed = TRUE; + } + } + last = *q ? (q + 1) : q; + if (*q != '\0') { + float check_f; + char check_c; + int rc = sscanf(base, "%f%c", &check_f, &check_c); + if ((rc != 2) || (mark != NULL && (check_c != *mark)) || mixed) { + _nc_warning("syntax error in %s delay '%.*s'", name, + (int) (q - base), base); + } else if (*name == 'k') { + _nc_warning("function-key %s has delay", name); + } else if (proportional && !line_capability(name)) { + _nc_warning("non-line capability using proportional delay: %s", name); + } else if (!xon_xoff && + !mandatory && + strchr(_nc_first_name(tp->term_names), '+') == NULL) { + _nc_warning("%s in %s is used since no xon/xoff", + (proportional + ? "proportional delay" + : "delay"), + name); + } + } else { + p = q - 1; /* restart scan */ + } + } + } + + if (!strcmp(name, "flash") || + !strcmp(name, "beep")) { + + if (first != 0) { + if (first == value || *last == 0) { + /* + * Delay is on one end or the other. + */ + _nc_warning("expected delay embedded within %s", name); + } + } else { + int flag; + + /* + * Check for missing delay when using VT100 reverse-video. + * A real VT100 might not need this, but terminal emulators do. + */ + if ((p = skip_DECSCNM(value, &flag)) != 0 && + flag > 0 && + skip_DECSCNM(p, &flag) != 0 && + flag == 0) { + _nc_warning("expected a delay in %s", name); + } + } + } +} + +static char * +check_1_infotocap(const char *name, NCURSES_CONST char *value, int count) +{ + int k; + int ignored; + long numbers[1 + NUM_PARM]; + char *strings[1 + NUM_PARM]; + char *p_is_s[NUM_PARM]; + char *result; + char blob[NUM_PARM * 10]; + char *next = blob; + TParams expect; + TParams actual; + int nparam; + + *next++ = '\0'; + for (k = 1; k <= NUM_PARM; k++) { + numbers[k] = count; + _nc_SPRINTF(next, + _nc_SLIMIT(sizeof(blob) - (size_t) (next - blob)) + "XYZ%d", count); + strings[k] = next; + next += strlen(next) + 1; + } + + _nc_reset_tparm(NULL); + expect = tparm_type(name); + nparam = _nc_tparm_analyze(NULL, value, p_is_s, &ignored); + actual = guess_tparm_type(nparam, p_is_s); + + if (expect != actual) { + _nc_warning("%s has mismatched parameters", name); + actual = Other; + } + + _nc_reset_tparm(NULL); + switch (actual) { + case Str: + result = TPARM_1(value, strings[1]); + break; + case Num_Str: + result = TPARM_2(value, numbers[1], strings[2]); + break; + case Str_Str: + result = TPARM_2(value, strings[1], strings[2]); + break; + case Num_Str_Str: + result = TPARM_3(value, numbers[1], strings[2], strings[3]); + break; + case Numbers: +#define myParam(n) numbers[n] + result = TIPARM_9(value, + myParam(1), + myParam(2), + myParam(3), + myParam(4), + myParam(5), + myParam(6), + myParam(7), + myParam(8), + myParam(9)); +#undef myParam + break; + case Other: + default: +#define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n]) + result = TPARM_9(value, + myParam(1), + myParam(2), + myParam(3), + myParam(4), + myParam(5), + myParam(6), + myParam(7), + myParam(8), + myParam(9)); +#undef myParam + break; + } + return strdup(result); +} + +#define IsDelay(ch) ((ch) == '.' || isdigit(UChar(ch))) + +static const char * +parse_delay_value(const char *src, double *delays, int *always) +{ + int star = 0; + + *delays = 0.0; + if (always) + *always = 0; + + while (isdigit(UChar(*src))) { + (*delays) = (*delays) * 10 + (*src++ - '0'); + } + if (*src == '.') { + int gotdot = 1; + + ++src; + while (isdigit(UChar(*src))) { + gotdot *= 10; + (*delays) += (*src++ - '0') / gotdot; + } + } + while (*src == '*' || *src == '/') { + if (always == NULL && *src == '/') + break; + if (*src++ == '*') { + star = 1; + } else { + *always = 1; + } + } + if (star) + *delays = -(*delays); + return src; +} + +static const char * +parse_ti_delay(const char *ti, double *delays) +{ + *delays = 0.0; + while (*ti != '\0') { + if (*ti == '\\') { + ++ti; + } + if (ti[0] == '$' + && ti[1] == '<' + && IsDelay(UChar(ti[2]))) { + int ignored; + const char *last = parse_delay_value(ti + 2, delays, &ignored); + if (*last == '>') { + ti = last; + } + } else { + ++ti; + } + } + return ti; +} + +static const char * +parse_tc_delay(const char *tc, double *delays) +{ + return parse_delay_value(tc, delays, (int *) 0); +} + +/* + * Compare terminfo- and termcap-strings, factoring out delays. + */ +static bool +same_ti_tc(const char *ti, const char *tc, bool * embedded) +{ + bool same = TRUE; + double ti_delay = 0.0; + double tc_delay = 0.0; + const char *ti_last; + + *embedded = FALSE; + ti_last = parse_ti_delay(ti, &ti_delay); + tc = parse_tc_delay(tc, &tc_delay); + + while ((ti < ti_last) && *tc) { + if (*ti == '\\' && ispunct(UChar(ti[1]))) { + ++ti; + if ((*ti == '^') && !strncmp(tc, "\\136", 4)) { + ti += 1; + tc += 4; + continue; + } + } else if (ti[0] == '$' && ti[1] == '<') { + double no_delay; + const char *ss = parse_ti_delay(ti, &no_delay); + if (ss != ti) { + *embedded = TRUE; + ti = ss; + continue; + } + } + if (*tc == '\\' && ispunct(UChar(tc[1]))) { + ++tc; + } + if (*ti++ != *tc++) { + same = FALSE; + break; + } + } + + if (*embedded) { + if (same) { + same = FALSE; + } else { + *embedded = FALSE; /* report only one problem */ + } + } + + return same; +} + +/* + * Check terminfo to termcap translation. + */ +static void +check_infotocap(TERMTYPE2 *tp, int i, const char *value) +{ + const char *name = ExtStrname(tp, i, strnames); + char *ti_value = NULL; + + assert(SIZEOF(parametrized) == STRCOUNT); + if (!VALID_STRING(value) || (ti_value = strdup(value)) == NULL) { + _nc_warning("tic-expansion of %s failed", name); + } else { + char *tc_value; + bool embedded; + int params = ((i < (int) SIZEOF(parametrized)) + ? parametrized[i] + : ((*value == 'k') + ? 0 + : has_params(value, FALSE))); + + if ((tc_value = _nc_infotocap(name, ti_value, params)) == ABSENT_STRING) { + _nc_warning("tic-conversion of %s failed", name); + } else if (params > 0) { + int limit = 5; + int count; + bool first = TRUE; + + if (!strcmp(name, "setf") + || !strcmp(name, "setb") + || !strcmp(name, "setaf") + || !strcmp(name, "setab")) { + if ((limit = max_colors) > 256) + limit = 256; + } + for (count = 0; count < limit; ++count) { + char *ti_check = check_1_infotocap(name, ti_value, count); + char *tc_check = check_1_infotocap(name, tc_value, count); + + if (strcmp(ti_check, tc_check)) { + if (first) { + fprintf(stderr, "check_infotocap(%s)\n", name); + fprintf(stderr, "...ti '%s'\n", _nc_visbuf2(0, ti_value)); + fprintf(stderr, "...tc '%s'\n", _nc_visbuf2(0, tc_value)); + first = FALSE; + } + _nc_warning("tparm-conversion of %s(%d) differs between\n\tterminfo %s\n\ttermcap %s", + name, count, + _nc_visbuf2(0, ti_check), + _nc_visbuf2(1, tc_check)); + } + free(ti_check); + free(tc_check); + } + } else if (params == 0 && !same_ti_tc(ti_value, tc_value, &embedded)) { + if (embedded) { + _nc_warning("termcap equivalent of %s cannot use embedded delay", name); + } else { + _nc_warning("tic-conversion of %s changed value\n\tfrom %s\n\tto %s", + name, ti_value, tc_value); + } + } + free(ti_value); + } +} + +static char * +skip_delay(char *s) +{ + while (*s == '/' || isdigit(UChar(*s))) + ++s; + return s; +} + +/* + * Skip a delay altogether, e.g., when comparing a simple string to sgr, + * the latter may have a worst-case delay on the end. + */ +static char * +ignore_delays(char *s) +{ + int delaying = 0; + + do { + switch (*s) { + case '$': + if (delaying == 0) + delaying = 1; + break; + case '<': + if (delaying == 1) + delaying = 2; + break; + case '\0': + delaying = 0; + break; + default: + if (delaying) { + s = skip_delay(s); + if (*s == '>') + ++s; + delaying = 0; + } + break; + } + if (delaying) + ++s; + } while (delaying); + return s; +} + +#define DATA(name) { #name } +static const char sgr_names[][11] = +{ + DATA(none), + DATA(standout), + DATA(underline), + DATA(reverse), + DATA(blink), + DATA(dim), + DATA(bold), + DATA(invis), + DATA(protect), + DATA(altcharset), + "" +}; +#undef DATA + +/* + * An sgr string may contain several settings other than the one we're + * interested in, essentially sgr0 + rmacs + whatever. As long as the + * "whatever" is contained in the sgr string, that is close enough for our + * sanity check. + */ +static bool +similar_sgr(int num, char *a, char *b) +{ + char *base_a = a; + const char *base_b = b; + int delaying = 0; + + while (*b != 0) { + while (*a != *b) { + if (*a == 0) { + if (num < 0) { + ; + } else if (b[0] == '$' + && b[1] == '<') { + _nc_warning("did not find delay %s", _nc_visbuf(b)); + } else { + _nc_warning("checking sgr(%s) %s\n\tcompare to %s\n\tunmatched %s", + sgr_names[num], _nc_visbuf2(1, base_a), + _nc_visbuf2(2, base_b), + _nc_visbuf2(3, b)); + } + return FALSE; + } else if (delaying) { + a = skip_delay(a); + b = skip_delay(b); + } else if ((*b == '0' || (*b == ';')) && *a == 'm') { + b++; + } else { + a++; + } + } + switch (*a) { + case '$': + if (delaying == 0) + delaying = 1; + break; + case '<': + if (delaying == 1) + delaying = 2; + break; + default: + delaying = 0; + break; + } + a++; + b++; + } + /* ignore delays on the end of the string */ + a = ignore_delays(a); + return ((num != 0) || (*a == 0)); +} + +static void +check_tparm_err(int num) +{ + if (_nc_tparm_err) + _nc_warning("tparam error in sgr(%d): %s", num, sgr_names[num]); +} + +static char * +check_sgr(const TERMTYPE2 *tp, const char *zero, int num, char *cap, const char *name) +{ + char *test; + + _nc_tparm_err = 0; + test = TIPARM_9(set_attributes, + num == 1, + num == 2, + num == 3, + num == 4, + num == 5, + num == 6, + num == 7, + num == 8, + num == 9); + if (test != 0) { + if (PRESENT(cap)) { + if (!similar_sgr(num, test, cap)) { + _nc_warning("%s differs from sgr(%d)\n\t%s=%s\n\tsgr(%d)=%s", + name, num, + name, _nc_visbuf2(1, cap), + num, _nc_visbuf2(2, test)); + } + } else if (_nc_capcmp(test, zero)) { + _nc_warning("sgr(%d) present, but not %s", num, name); + } + } else if (PRESENT(cap)) { + _nc_warning("sgr(%d) missing, but %s present", num, name); + } + check_tparm_err(num); + return test; +} + +#define CHECK_SGR(num,name) check_sgr(tp, zero, num, name, #name) + +#ifdef TRACE +/* + * If tic is compiled with TRACE, we'll be able to see the output from the + * DEBUG() macro. But since it doesn't use traceon(), it always goes to + * the standard error. Use this function to make it simpler to follow the + * resulting debug traces. + */ +static void +show_where(unsigned level) +{ + if (_nc_tracing >= DEBUG_LEVEL(level)) { + char my_name[MAX_NAME_SIZE]; + _nc_get_type(my_name); + _tracef("\"%s\", line %d, '%s'", + _nc_get_source(), + _nc_curr_line, my_name); + } +} + +#else +#define show_where(level) /* nothing */ +#endif + +typedef struct { + int keycode; + const char *name; + const char *value; +} NAME_VALUE; + +static NAME_VALUE * +get_fkey_list(TERMTYPE2 *tp) +{ + NAME_VALUE *result = typeMalloc(NAME_VALUE, NUM_STRINGS(tp) + 1); + const struct tinfo_fkeys *all_fkeys = _nc_tinfo_fkeys; + int used = 0; + unsigned j; + + if (result == NULL) + failed("get_fkey_list"); + + for (j = 0; all_fkeys[j].code; j++) { + char *a = tp->Strings[all_fkeys[j].offset]; + if (VALID_STRING(a)) { + result[used].keycode = (int) all_fkeys[j].code; + result[used].name = strnames[all_fkeys[j].offset]; + result[used].value = a; + ++used; + } + } +#if NCURSES_XNAMES + for (j = STRCOUNT; j < NUM_STRINGS(tp); ++j) { + const char *name = ExtStrname(tp, (int) j, strnames); + if (*name == 'k') { + result[used].keycode = -1; + result[used].name = name; + result[used].value = tp->Strings[j]; + ++used; + } + } +#endif + result[used].keycode = 0; + return result; +} + +static void +show_fkey_name(const NAME_VALUE * data) +{ + if (data->keycode > 0) { + fprintf(stderr, " %s", keyname(data->keycode)); + fprintf(stderr, " (capability \"%s\")", data->name); + } else { + fprintf(stderr, " capability \"%s\"", data->name); + } +} + +/* + * A terminal entry may contain more than one keycode assigned to a given + * string (e.g., KEY_END and KEY_LL). But curses will only return one (the + * last one assigned). + */ +static void +check_conflict(TERMTYPE2 *tp) +{ + if (!(_nc_syntax == SYN_TERMCAP && capdump)) { + char *check = calloc((size_t) (NUM_STRINGS(tp) + 1), sizeof(char)); + NAME_VALUE *given = get_fkey_list(tp); + unsigned j, k; + bool conflict = FALSE; + + if (check == NULL) + failed("check_conflict"); + + for (j = 0; given[j].keycode; ++j) { + const char *a = given[j].value; + bool first = TRUE; + + if (!VALID_STRING(a)) + continue; + + for (k = j + 1; given[k].keycode; k++) { + const char *b = given[k].value; + + if (!VALID_STRING(b)) + continue; + if (check[k]) + continue; + + if (!_nc_capcmp(a, b)) { + check[j] = 1; + check[k] = 1; + if (first) { + if (!conflict) { + _nc_warning("conflicting key definitions (using the last)"); + conflict = TRUE; + } + fprintf(stderr, "..."); + show_fkey_name(given + j); + fprintf(stderr, " is the same as"); + show_fkey_name(given + k); + first = FALSE; + } else { + fprintf(stderr, ", "); + show_fkey_name(given + k); + } + } + } + if (!first) + fprintf(stderr, "\n"); + } +#if NCURSES_XNAMES + if (using_extensions) { + /* *INDENT-OFF* */ + static struct { + const char *xcurses; + const char *shifted; + } table[] = { + { "kDC", NULL }, + { "kDN", "kind" }, + { "kEND", NULL }, + { "kHOM", NULL }, + { "kLFT", NULL }, + { "kNXT", NULL }, + { "kPRV", NULL }, + { "kRIT", NULL }, + { "kUP", "kri" }, + { NULL, NULL }, + }; + /* *INDENT-ON* */ + /* + * SVr4 curses defines the "xcurses" names listed above except for + * the special cases in the "shifted" column. When using these + * names for xterm's extensions, that was confusing, and resulted + * in adding extended capabilities with "2" (shift) suffix. This + * check warns about unnecessary use of extensions for this quirk. + */ + for (j = 0; given[j].keycode; ++j) { + const char *find = given[j].name; + int value; + char ch; + + if (!VALID_STRING(given[j].value)) + continue; + + for (k = 0; table[k].xcurses; ++k) { + const char *test = table[k].xcurses; + size_t size = strlen(test); + + if (!strncmp(find, test, size) && strcmp(find, test)) { + switch (sscanf(find + size, "%d%c", &value, &ch)) { + case 1: + if (value == 2) { + _nc_warning("expected '%s' rather than '%s'", + (table[k].shifted + ? table[k].shifted + : test), find); + } else if (value < 2 || value > 15) { + _nc_warning("expected numeric 2..15 '%s'", find); + } + break; + default: + _nc_warning("expected numeric suffix for '%s'", find); + break; + } + break; + } + } + } + } +#endif + free(given); + free(check); + } +} + +/* + * Exiting a video mode should not duplicate sgr0 + */ +static void +check_exit_attribute(const char *name, char *test, char *trimmed, char *untrimmed) +{ + if (VALID_STRING(test) && (trimmed != 0)) { + if (similar_sgr(-1, trimmed, test) || + similar_sgr(-1, untrimmed, test)) { + _nc_warning("%s matches exit_attribute_mode", name); + } + } +} + +/* + * Returns true if the string looks like a standard SGR string. + */ +static bool +is_sgr_string(char *value) +{ + bool result = FALSE; + + if (VALID_STRING(value)) { + int skip = csi_length(value); + + if (skip) { + int ch; + + result = TRUE; + value += skip; + while ((ch = UChar(*value++)) != '\0') { + if (isdigit(ch) || ch == ';') { + ; + } else if (ch == 'm' && *value == '\0') { + ; + } else { + result = FALSE; + break; + } + } + } + } + return result; +} + +/* + * Check if the given capability contains a given SGR attribute. + */ +static void +check_sgr_param(TERMTYPE2 *tp, int code, const char *name, const char *const value) +{ + if (VALID_STRING(value)) { + int ncv = ((code != 0) ? (1 << (code - 1)) : 0); + char *test = tgoto(value, 0, 0); + if (is_sgr_string(test)) { + int param = 0; + int count = 0; + int skips = 0; + int color = (value == set_a_foreground || + value == set_a_background || + value == set_foreground || + value == set_background); + while (*test != 0) { + if (isdigit(UChar(*test))) { + param = 10 * param + (*test - '0'); + ++count; + } else { + if (count) { + /* + * Avoid unnecessary warning for xterm 256color codes. + */ + if (color && (param == 38 || param == 48)) + skips = 3; + if ((skips-- <= 0) && (param == code)) + break; + } + count = 0; + param = 0; + } + ++test; + } + if (count != 0 && param == code) { + if (code == 0 || + no_color_video < 0 || + !(no_color_video & ncv)) { + _nc_warning("\"%s\" SGR-attribute used in %s", + sgr_names[code], + name); + } + } + } + } +} + +#if NCURSES_XNAMES +static int +standard_type(const char *name) +{ + int result = -1; + const struct name_table_entry *np; + + if ((np = _nc_find_entry(name, _nc_get_hash_table(0))) != 0) { + result = np->nte_type; + } + return result; +} + +static const char * +name_of_type(int type) +{ + const char *result = "unknown"; + switch (type) { + case BOOLEAN: + result = "boolean"; + break; + case NUMBER: + result = "number"; + break; + case STRING: + result = "string"; + break; + } + return result; +} + +static void +check_user_capability_type(const char *name, int actual) +{ + if (lookup_user_capability(name) == 0) { + int expected = standard_type(name); + if (expected >= 0) { + _nc_warning("expected %s to be %s, but actually %s", + name, + name_of_type(actual), + name_of_type(expected) + ); + } else if (*name != 'k') { + _nc_warning("undocumented %s capability %s", + name_of_type(actual), + name); + } + } +} +#endif + +#define IN_DELAY "0123456789*/." + +static bool +check_ANSI_cap(const char *value, int nparams, char final) +{ + bool result = FALSE; + if (VALID_STRING(value) && csi_length(value) > 0) { + char *p_is_s[NUM_PARM]; + int popcount; + int analyzed = _nc_tparm_analyze(NULL, value, p_is_s, &popcount); + if (analyzed < popcount) { + analyzed = popcount; + } + if (analyzed == nparams) { + bool numbers = TRUE; + int p; + for (p = 0; p < nparams; ++p) { + if (p_is_s[p]) { + numbers = FALSE; + break; + } + } + if (numbers) { + int in_delay = 0; + p = (int) strlen(value); + while (p-- > 0) { + char ch = value[p]; + if (ch == final) { + result = TRUE; + break; + } + switch (in_delay) { + case 0: + if (ch == '>') + in_delay = 1; + break; + case 1: + if (strchr(IN_DELAY, value[p]) != NULL) + break; + if (ch != '<') + p = 0; + in_delay = 2; + break; + case 2: + if (ch != '$') + p = 0; + in_delay = 0; + break; + } + } + } + } + } + return result; +} + +static const char * +skip_Delay(const char *value) +{ + const char *result = value; + + if (*value == '$') { + ++result; + if (*result++ == '<') { + while (strchr(IN_DELAY, *result) != NULL) + ++result; + if (*result++ != '>') { + result = value; + } + } else { + result = value; + } + } + return result; +} + +static bool +isValidString(const char *value, const char *expect) +{ + bool result = FALSE; + if (VALID_STRING(value)) { + if (!strcmp(value, expect)) + result = TRUE; + } + return result; +} + +static bool +isValidEscape(const char *value, const char *expect) +{ + bool result = FALSE; + if (VALID_STRING(value)) { + if (*value == '\033') { + size_t need = strlen(expect); + size_t have = strlen(value) - 1; + if (have >= need && !strncmp(value + 1, expect, need)) { + if (*skip_Delay(value + need + 1) == '\0') { + result = TRUE; + } + } + } + } + return result; +} + +static int +guess_ANSI_VTxx(const TERMTYPE2 *tp) +{ + int result = -1; + int checks = 0; + + /* VT100s have scrolling region, but ANSI (ECMA-48) does not specify */ + if (check_ANSI_cap(change_scroll_region, 2, 'r') && + (isValidEscape(scroll_forward, "D") || + isValidString(scroll_forward, "\n") || + isValidEscape(scroll_forward, "6")) && + (isValidEscape(scroll_reverse, "M") || + isValidEscape(scroll_reverse, "9"))) { + checks |= 2; + } + if (check_ANSI_cap(cursor_address, 2, 'H') && + check_ANSI_cap(cursor_up, 0, 'A') && + (check_ANSI_cap(cursor_down, 0, 'B') || + isValidString(cursor_down, "\n")) && + check_ANSI_cap(cursor_right, 0, 'C') && + (check_ANSI_cap(cursor_left, 0, 'D') || + isValidString(cursor_left, "\b")) && + check_ANSI_cap(clr_eos, 0, 'J') && + check_ANSI_cap(clr_bol, 0, 'K') && + check_ANSI_cap(clr_eol, 0, 'K')) { + checks |= 1; + } + if (checks == 3) + result = 1; + if (checks == 1) + result = 0; + return result; +} + +/* + * u6/u7 and u8/u9 are query/response extensions which most terminals support. + * In particular, any ECMA-48 terminal should support these, though the details + * for u9 are implementation dependent. + */ +#if defined(user6) && defined(user7) && defined(user8) && defined(user9) +static void +check_user_6789(const TERMTYPE2 *tp) +{ + /* + * Check if the terminal is known to not + */ +#define NO_QUERY(longname,shortname) \ + if (PRESENT(longname)) _nc_warning(#shortname " is not supported") + if (tigetflag("NQ") > 0) { + NO_QUERY(user6, u6); + NO_QUERY(user7, u7); + NO_QUERY(user8, u8); + NO_QUERY(user9, u9); + return; + } + + PAIRED(user6, user7); + PAIRED(user8, user9); + + if (strchr(tp->term_names, '+') != NULL) + return; + + switch (guess_ANSI_VTxx(tp)) { + case 1: + if (!PRESENT(user8)) { + _nc_warning("expected u8/u9 for device-attributes"); + } + /* FALLTHRU */ + case 0: + if (!PRESENT(user6)) { + _nc_warning("expected u6/u7 for cursor-position"); + } + break; + } +} +#else +#define check_user_6789(tp) /* nothing */ +#endif + +/* other sanity-checks (things that we don't want in the normal + * logic that reads a terminfo entry) + */ +static void +check_termtype(TERMTYPE2 *tp, bool literal) +{ + unsigned j; + + check_conflict(tp); + + for_each_string(j, tp) { + const char *a = tp->Strings[j]; + if (VALID_STRING(a)) { + const char *name = ExtStrname(tp, (int) j, strnames); + /* + * If we expect parameters, or if there might be parameters, + * check for consistent number of parameters. + */ + if (j >= SIZEOF(parametrized) || + is_user_capability(name) >= 0 || + parametrized[j] > 0) { + check_params(tp, name, a, (j >= STRCOUNT)); + } + check_delays(tp, ExtStrname(tp, (int) j, strnames), a); + if (capdump) { + check_infotocap(tp, (int) j, a); + } + } + } +#if NCURSES_XNAMES + /* in extended mode, verify that each extension is expected type */ + for_each_ext_boolean(j, tp) { + check_user_capability_type(ExtBoolname(tp, (int) j, strnames), BOOLEAN); + } + for_each_ext_number(j, tp) { + check_user_capability_type(ExtNumname(tp, (int) j, strnames), NUMBER); + } + for_each_ext_string(j, tp) { + check_user_capability_type(ExtStrname(tp, (int) j, strnames), STRING); + } +#endif /* NCURSES_XNAMES */ + + check_acs(tp); + check_colors(tp); + check_cursor(tp); + check_keypad(tp); + check_printer(tp); + check_screen(tp); + check_user_6789(tp); + + /* + * These are probably both or none. + */ + PAIRED(parm_index, parm_rindex); + PAIRED(parm_ich, parm_dch); + + /* + * These may be mismatched because the terminal description relies on + * restoring the cursor visibility by resetting it. + */ + ANDMISSING(cursor_invisible, cursor_normal); + ANDMISSING(cursor_visible, cursor_normal); + + if (PRESENT(cursor_visible) && PRESENT(cursor_normal) + && !_nc_capcmp(cursor_visible, cursor_normal)) + _nc_warning("cursor_visible is same as cursor_normal"); + + /* + * From XSI & O'Reilly, we gather that sc/rc are required if csr is + * given, because the cursor position after the scrolling operation is + * performed is undefined. + */ + ANDMISSING(change_scroll_region, save_cursor); + ANDMISSING(change_scroll_region, restore_cursor); + + /* + * If we can clear tabs, we should be able to initialize them. + */ + ANDMISSING(clear_all_tabs, set_tab); + + if (PRESENT(set_attributes)) { + char *zero = 0; + + _nc_tparm_err = 0; + if (PRESENT(exit_attribute_mode)) { + zero = strdup(CHECK_SGR(0, exit_attribute_mode)); + } else { + zero = strdup(TIPARM_9(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, 0)); + } + check_tparm_err(0); + + if (zero != 0) { + CHECK_SGR(1, enter_standout_mode); + CHECK_SGR(2, enter_underline_mode); + CHECK_SGR(3, enter_reverse_mode); + CHECK_SGR(4, enter_blink_mode); + CHECK_SGR(5, enter_dim_mode); + CHECK_SGR(6, enter_bold_mode); + CHECK_SGR(7, enter_secure_mode); + CHECK_SGR(8, enter_protected_mode); + CHECK_SGR(9, enter_alt_charset_mode); + free(zero); + } else { + _nc_warning("sgr(0) did not return a value"); + } + } else if (PRESENT(exit_attribute_mode) && + set_attributes != CANCELLED_STRING) { + if (_nc_syntax == SYN_TERMINFO) + _nc_warning("missing sgr string"); + } +#define CHECK_SGR0(name) check_exit_attribute(#name, name, check_sgr0, exit_attribute_mode) + if (PRESENT(exit_attribute_mode)) { + char *check_sgr0 = _nc_trim_sgr0(tp); + + if (check_sgr0 == NULL || *check_sgr0 == '\0') { + _nc_warning("trimmed sgr0 is empty"); + } else { + show_where(2); + if (check_sgr0 != exit_attribute_mode) { + DEBUG(2, + ("will trim sgr0\n\toriginal sgr0=%s\n\ttrimmed sgr0=%s", + _nc_visbuf2(1, exit_attribute_mode), + _nc_visbuf2(2, check_sgr0))); + } else { + DEBUG(2, + ("will not trim sgr0\n\toriginal sgr0=%s", + _nc_visbuf(exit_attribute_mode))); + } + } +#if defined(exit_italics_mode) + CHECK_SGR0(exit_italics_mode); +#endif + CHECK_SGR0(exit_standout_mode); + CHECK_SGR0(exit_underline_mode); + if (check_sgr0 != exit_attribute_mode) { + free(check_sgr0); + } + } +#define CHECK_SGR_PARAM(code, name) check_sgr_param(tp, (int)code, #name, name) + for (j = 0; *sgr_names[j] != '\0'; ++j) { + CHECK_SGR_PARAM(j, set_a_foreground); + CHECK_SGR_PARAM(j, set_a_background); + CHECK_SGR_PARAM(j, set_foreground); + CHECK_SGR_PARAM(j, set_background); + } +#ifdef TRACE + show_where(2); + if (!auto_right_margin) { + DEBUG(2, + ("can write to lower-right directly")); + } else if (PRESENT(enter_am_mode) && PRESENT(exit_am_mode)) { + DEBUG(2, + ("can write to lower-right by suppressing automargin")); + } else if ((PRESENT(enter_insert_mode) && PRESENT(exit_insert_mode)) + || PRESENT(insert_character) || PRESENT(parm_ich)) { + DEBUG(2, + ("can write to lower-right by using inserts")); + } else { + DEBUG(2, + ("cannot write to lower-right")); + } +#endif + + /* + * Some standard applications (e.g., vi) and some non-curses + * applications (e.g., jove) get confused if we have both ich1 and + * smir/rmir. Let's be nice and warn about that, too, even though + * ncurses handles it. + */ + if ((PRESENT(enter_insert_mode) || PRESENT(exit_insert_mode)) + && PRESENT(insert_character)) { + _nc_warning("non-curses applications may be confused by ich1 with smir/rmir"); + } + + /* + * Finally, do the non-verbose checks + */ + if (save_check_termtype != 0) + save_check_termtype(tp, literal); +} diff --git a/contrib/ncurses/progs/toe.c b/contrib/ncurses/progs/toe.c new file mode 100644 index 00000000..f46224a9 --- /dev/null +++ b/contrib/ncurses/progs/toe.c @@ -0,0 +1,779 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * toe.c --- table of entries report generator + */ + +#include + +#include + +#if USE_HASHED_DB +#include +#endif + +MODULE_ID("$Id: toe.c,v 1.90 2024/10/19 22:00:53 tom Exp $") + +#define isDotname(name) (!strcmp(name, ".") || !strcmp(name, "..")) + +typedef struct { + int db_index; + unsigned long checksum; + char *term_name; + char *description; +} TERMDATA; + +const char *_nc_progname; + +static TERMDATA *ptr_termdata; /* array of terminal data */ +static size_t use_termdata; /* actual usage in ptr_termdata[] */ +static size_t len_termdata; /* allocated size of ptr_termdata[] */ + +#if NO_LEAKS +#undef ExitProgram +static GCC_NORETURN void ExitProgram(int code); +static void +ExitProgram(int code) +{ + _nc_free_entries(_nc_head); + _nc_free_tic(code); +} +#endif + +static GCC_NORETURN void failed(const char *); + +static void +failed(const char *msg) +{ + perror(msg); + ExitProgram(EXIT_FAILURE); +} + +static char * +strmalloc(const char *value) +{ + char *result = strdup(value); + if (result == 0) { + failed("strmalloc"); + } + return result; +} + +static TERMDATA * +new_termdata(void) +{ + size_t want = use_termdata + 1; + + if (want >= len_termdata) { + len_termdata = (2 * want) + 10; + ptr_termdata = typeRealloc(TERMDATA, len_termdata, ptr_termdata); + if (ptr_termdata == 0) + failed("ptr_termdata"); + } + + return ptr_termdata + use_termdata++; +} + +static int +compare_termdata(const void *a, const void *b) +{ + const TERMDATA *p = (const TERMDATA *) a; + const TERMDATA *q = (const TERMDATA *) b; + int result = strcmp(p->term_name, q->term_name); + + if (result == 0) { + result = (p->db_index - q->db_index); + } + return result; +} + +/* + * Sort the array of TERMDATA and print it. If more than one database is being + * reported, add a column to show which database has a given entry. + */ +static void +show_termdata(int eargc, char **eargv) +{ + if (use_termdata) { + size_t n; + + if (eargc > 1) { + int j; + + for (j = 0; j < eargc; ++j) { + int k; + + for (k = 0; k <= j; ++k) { + printf("--"); + } + printf("> "); + printf("%s\n", eargv[j]); + } + } + if (use_termdata > 1) + qsort(ptr_termdata, use_termdata, sizeof(TERMDATA), compare_termdata); + for (n = 0; n < use_termdata; ++n) { + int nk = -1; + + /* + * If there is more than one database, show how they differ. + */ + if (eargc > 1) { + unsigned long check = 0; + int k = 0; + for (;;) { + char mark = ((check == 0 + || (check != ptr_termdata[n].checksum)) + ? '*' + : '+'); + + for (; k < ptr_termdata[n].db_index; ++k) { + printf("--"); + } + + /* + * If this is the first entry, or its checksum differs + * from the first entry's checksum, print "*". Otherwise + * it looks enough like a duplicate to print "+". + */ + printf("%c-", mark); + check = ptr_termdata[n].checksum; + if (mark == '*' && nk < 0) + nk = (int) n; + + ++k; + if ((n + 1) >= use_termdata + || strcmp(ptr_termdata[n].term_name, + ptr_termdata[n + 1].term_name)) { + break; + } + ++n; + } + for (; k < eargc; ++k) { + printf("--"); + } + printf(":\t"); + } + if (nk < 0) + nk = (int) n; + + (void) printf("%-10s\t%s\n", + ptr_termdata[n].term_name, + ptr_termdata[nk].description); + } + } +} + +static void +free_termdata(void) +{ + if (ptr_termdata != 0) { + while (use_termdata != 0) { + --use_termdata; + free(ptr_termdata[use_termdata].term_name); + free(ptr_termdata[use_termdata].description); + } + free(ptr_termdata); + ptr_termdata = 0; + } + use_termdata = 0; + len_termdata = 0; +} + +static char ** +allocArgv(size_t count) +{ + char **result = typeCalloc(char *, count + 1); + if (result == 0) + failed("realloc eargv"); + + assert(result != 0); + return result; +} + +static void +freeArgv(char **argv) +{ + if (argv) { + int count = 0; + while (argv[count]) { + free(argv[count++]); + } + free(argv); + } +} + +#if USE_HASHED_DB +static bool +make_db_name(char *dst, const char *src, unsigned limit) +{ + static const char suffix[] = DBM_SUFFIX; + + bool result = FALSE; + size_t lens = sizeof(suffix) - 1; + size_t size = strlen(src); + size_t need = lens + size; + + if (need <= limit) { + if (size >= lens + && !strcmp(src + size - lens, suffix)) { + _nc_STRCPY(dst, src, PATH_MAX); + } else { + _nc_SPRINTF(dst, _nc_SLIMIT(PATH_MAX) "%.*s%s", + (int) (PATH_MAX - sizeof(suffix)), + src, suffix); + } + result = TRUE; + } + return result; +} +#endif + +typedef void (DescHook) (int /* db_index */ , + int /* db_limit */ , + const char * /* term_name */ , + const TERMTYPE2 * /* term */ ); + +static const char * +term_description(const TERMTYPE2 *tp) +{ + const char *desc; + + if (tp->term_names == 0 + || (desc = strrchr(tp->term_names, '|')) == 0 + || (*++desc == '\0')) { + desc = "(No description)"; + } + + return desc; +} + +/* display a description for the type */ +static void +deschook(int db_index, int db_limit, const char *term_name, const TERMTYPE2 *tp) +{ + (void) db_index; + (void) db_limit; + (void) printf("%-10s\t%s\n", term_name, term_description(tp)); +} + +static unsigned long +string_sum(const char *value) +{ + unsigned long result = 0; + + if ((intptr_t) value == (intptr_t) (-1)) { + result = ~result; + } else if (value) { + while (*value) { + result += UChar(*value); + ++value; + } + } + return result; +} + +static unsigned long +checksum_of(const TERMTYPE2 *tp) +{ + unsigned long result = string_sum(tp->term_names); + unsigned i; + + for (i = 0; i < NUM_BOOLEANS(tp); i++) { + result += (unsigned long) (tp->Booleans[i]); + } + for (i = 0; i < NUM_NUMBERS(tp); i++) { + result += (unsigned long) (tp->Numbers[i]); + } + for (i = 0; i < NUM_STRINGS(tp); i++) { + result += string_sum(tp->Strings[i]); + } + return result; +} + +/* collect data, to sort before display */ +static void +sorthook(int db_index, int db_limit, const char *term_name, const TERMTYPE2 *tp) +{ + TERMDATA *data = new_termdata(); + + data->db_index = db_index; + data->checksum = ((db_limit > 1) ? checksum_of(tp) : 0); + data->term_name = strmalloc(term_name); + data->description = strmalloc(term_description(tp)); +} + +#if NCURSES_USE_TERMCAP +/* + * Check if the buffer contents are printable ASCII, ensuring that we do not + * accidentally pick up incompatible binary content from a hashed database. + */ +static bool +is_termcap(char *buffer) +{ + bool result = TRUE; + while (*buffer != '\0') { + int ch = UChar(*buffer++); + if (ch == '\t') + continue; + if (ch < ' ' || ch > '~') { + result = FALSE; + break; + } + } + return result; +} + +static void +show_termcap(int db_index, int db_limit, char *buffer, DescHook hook) +{ + TERMTYPE2 data; + char *next = strchr(buffer, ':'); + char *last; + char *list = buffer; + + if (next) + *next = '\0'; + + last = strrchr(buffer, '|'); + if (last) + ++last; + + memset(&data, 0, sizeof(data)); + data.term_names = strmalloc(buffer); + while ((next = strtok(list, "|")) != 0) { + if (next != last) + hook(db_index, db_limit, next, &data); + list = 0; + } + free(data.term_names); +} +#endif + +#if NCURSES_USE_DATABASE +static char * +copy_entryname(const DIRENT * src) +{ + size_t len = NAMLEN(src); + char *result = malloc(len + 1); + if (result == 0) + failed("copy entryname"); + memcpy(result, src->d_name, len); + result[len] = '\0'; + + return result; +} +#endif + +static int +typelist(int eargc, char *eargv[], + int verbosity, + DescHook hook) +/* apply a function to each entry in given terminfo directories */ +{ + int i; + + for (i = 0; i < eargc; i++) { +#if NCURSES_USE_DATABASE + if (_nc_is_dir_path(eargv[i])) { + char *cwd_buf = 0; + DIR *termdir; + const DIRENT *subdir; + + if ((termdir = opendir(eargv[i])) == 0) { + (void) fflush(stdout); + (void) fprintf(stderr, + "%s: can't open terminfo directory %s\n", + _nc_progname, eargv[i]); + continue; + } + + if (verbosity) + (void) printf("#\n#%s:\n#\n", eargv[i]); + + while ((subdir = readdir(termdir)) != 0) { + size_t cwd_len; + char *name_1; + DIR *entrydir; + const DIRENT *entry; + + name_1 = copy_entryname(subdir); + if (isDotname(name_1)) { + free(name_1); + continue; + } + + cwd_len = NAMLEN(subdir) + strlen(eargv[i]) + 3; + cwd_buf = typeRealloc(char, cwd_len, cwd_buf); + if (cwd_buf == 0) + failed("realloc cwd_buf"); + + assert(cwd_buf != 0); + + _nc_SPRINTF(cwd_buf, _nc_SLIMIT(cwd_len) + "%s/%s/", eargv[i], name_1); + free(name_1); + + if (chdir(cwd_buf) != 0) + continue; + + entrydir = opendir("."); + if (entrydir == 0) { + perror(cwd_buf); + continue; + } + while ((entry = readdir(entrydir)) != 0) { + char *name_2; + TERMTYPE2 lterm; + char *cn; + int status; + + name_2 = copy_entryname(entry); + if (isDotname(name_2) || !_nc_is_file_path(name_2)) { + free(name_2); + continue; + } + + status = _nc_read_file_entry(name_2, <erm); + if (status <= 0) { + (void) fflush(stdout); + (void) fprintf(stderr, + "%s: couldn't open terminfo file %s.\n", + _nc_progname, name_2); + free(name_2); + continue; + } + + /* only visit things once, by primary name */ + cn = _nc_first_name(lterm.term_names); + if (!strcmp(cn, name_2)) { + /* apply the selected hook function */ + hook(i, eargc, cn, <erm); + } + _nc_free_termtype2(<erm); + free(name_2); + } + closedir(entrydir); + } + closedir(termdir); + if (cwd_buf != 0) + free(cwd_buf); + continue; + } +#if USE_HASHED_DB + else { + DB *capdbp; + char filename[PATH_MAX]; + + if (verbosity) + (void) printf("#\n#%s:\n#\n", eargv[i]); + + if (make_db_name(filename, eargv[i], sizeof(filename))) { + if ((capdbp = _nc_db_open(filename, FALSE)) != 0) { + DBT key, data; + int code; + + code = _nc_db_first(capdbp, &key, &data); + while (code == 0) { + TERMTYPE2 lterm; + int used; + char *have; + char *cn; + + if (_nc_db_have_data(&key, &data, &have, &used)) { + if (_nc_read_termtype(<erm, have, used) > 0) { + /* only visit things once, by primary name */ + cn = _nc_first_name(lterm.term_names); + /* apply the selected hook function */ + hook(i, eargc, cn, <erm); + _nc_free_termtype2(<erm); + } + } + code = _nc_db_next(capdbp, &key, &data); + } + + _nc_db_close(capdbp); + continue; + } + } + } +#endif /* USE_HASHED_DB */ +#endif /* NCURSES_USE_DATABASE */ +#if NCURSES_USE_TERMCAP +#if HAVE_BSD_CGETENT + { + CGETENT_CONST char *db_array[2]; + char *buffer = 0; + + if (verbosity) + (void) printf("#\n#%s:\n#\n", eargv[i]); + + db_array[0] = eargv[i]; + db_array[1] = 0; + + if (cgetfirst(&buffer, db_array) > 0) { + if (is_termcap(buffer)) { + show_termcap(i, eargc, buffer, hook); + free(buffer); + while (cgetnext(&buffer, db_array) > 0) { + show_termcap(i, eargc, buffer, hook); + free(buffer); + } + } + cgetclose(); + continue; + } + } +#else + /* scan termcap text-file only */ + if (_nc_is_file_path(eargv[i])) { + char buffer[2048]; + FILE *fp; + + if (verbosity) + (void) printf("#\n#%s:\n#\n", eargv[i]); + + if ((fp = safe_fopen(eargv[i], "r")) != 0) { + while (fgets(buffer, sizeof(buffer), fp) != 0) { + if (!is_termcap(buffer)) + break; + if (*buffer == '#') + continue; + if (isspace(UChar(*buffer))) + continue; + show_termcap(i, eargc, buffer, hook); + } + fclose(fp); + } + } +#endif +#endif + } + + if (hook == sorthook) { + show_termdata(eargc, eargv); + free_termdata(); + } + + return (EXIT_SUCCESS); +} + +static void +usage(void) +{ + (void) fprintf(stderr, "usage: %s [-ahsuUV] [-v n] [file...]\n", _nc_progname); + ExitProgram(EXIT_FAILURE); +} + +int +main(int argc, char *argv[]) +{ + bool all_dirs = FALSE; + bool direct_dependencies = FALSE; + bool invert_dependencies = FALSE; + bool header = FALSE; + const char *report_file = 0; + int code; + int this_opt, last_opt = '?'; + unsigned v_opt = 0; + DescHook *hook = deschook; + + _nc_progname = _nc_rootname(argv[0]); + + while ((this_opt = getopt(argc, argv, "0123456789ahsu:vU:V")) != -1) { + /* handle optional parameter */ + if (isdigit(this_opt)) { + switch (last_opt) { + case 'v': + v_opt = (unsigned) (this_opt - '0'); + break; + default: + if (isdigit(last_opt)) + v_opt *= 10; + else + v_opt = 0; + v_opt += (unsigned) (this_opt - '0'); + last_opt = this_opt; + } + continue; + } + switch (this_opt) { + case 'a': + all_dirs = TRUE; + break; + case 'h': + header = TRUE; + break; + case 's': + hook = sorthook; + break; + case 'u': + direct_dependencies = TRUE; + report_file = optarg; + break; + case 'v': + v_opt = 1; + break; + case 'U': + invert_dependencies = TRUE; + report_file = optarg; + break; + case 'V': + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + default: + usage(); + } + } + use_verbosity(v_opt); + + if (report_file != 0) { + if (freopen(report_file, "r", stdin) == 0) { + (void) fflush(stdout); + fprintf(stderr, "%s: can't open %s\n", _nc_progname, report_file); + ExitProgram(EXIT_FAILURE); + } + + /* parse entries out of the source file */ + _nc_set_source(report_file); + _nc_read_entry_source(stdin, 0, FALSE, FALSE, NULLHOOK); + } + + /* maybe we want a direct-dependency listing? */ + if (direct_dependencies) { + ENTRY *qp; + + for_entry_list(qp) { + if (qp->nuses) { + unsigned j; + + (void) printf("%s:", _nc_first_name(qp->tterm.term_names)); + for (j = 0; j < qp->nuses; j++) + (void) printf(" %s", qp->uses[j].name); + putchar('\n'); + } + } + + ExitProgram(EXIT_SUCCESS); + } + + /* maybe we want a reverse-dependency listing? */ + if (invert_dependencies) { + ENTRY *qp, *rp; + + for_entry_list(qp) { + int matchcount = 0; + + for_entry_list(rp) { + unsigned i; + + if (rp->nuses == 0) + continue; + + for (i = 0; i < rp->nuses; i++) + if (_nc_name_match(qp->tterm.term_names, + rp->uses[i].name, "|")) { + if (matchcount++ == 0) + (void) printf("%s:", + _nc_first_name(qp->tterm.term_names)); + (void) printf(" %s", + _nc_first_name(rp->tterm.term_names)); + } + } + if (matchcount) + putchar('\n'); + } + + ExitProgram(EXIT_SUCCESS); + } + + /* + * If we get this far, user wants a simple terminal type listing. + */ + if (optind < argc) { + code = typelist(argc - optind, argv + optind, header, hook); + } else if (all_dirs) { + DBDIRS state; + int offset; + int pass; + char **eargv = 0; + + code = EXIT_FAILURE; + for (pass = 0; pass < 2; ++pass) { + size_t count = 0; + const char *path; + + _nc_first_db(&state, &offset); + while ((path = _nc_next_db(&state, &offset)) != 0) { + if (quick_prefix(path)) + continue; + if (pass) { + eargv[count] = strmalloc(path); + } + ++count; + } + if (!pass) { + eargv = allocArgv(count); + if (eargv == 0) + failed("eargv"); + } else { + code = typelist((int) count, eargv, header, hook); + freeArgv(eargv); + } + } + } else { + DBDIRS state; + int offset; + const char *path; + char **eargv = allocArgv((size_t) 2); + size_t count = 0; + + if (eargv == 0) + failed("eargv"); + _nc_first_db(&state, &offset); + if ((path = _nc_next_db(&state, &offset)) != 0) { + if (!quick_prefix(path)) + eargv[count++] = strmalloc(path); + } + + code = typelist((int) count, eargv, header, hook); + + freeArgv(eargv); + } + _nc_last_db(); + + ExitProgram(code); +} diff --git a/contrib/ncurses/progs/tparm_type.c b/contrib/ncurses/progs/tparm_type.c new file mode 100644 index 00000000..4fed96a5 --- /dev/null +++ b/contrib/ncurses/progs/tparm_type.c @@ -0,0 +1,109 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2014,2015 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#include + +MODULE_ID("$Id: tparm_type.c,v 1.5 2023/04/08 15:57:01 tom Exp $") + +/* + * Lookup the type of call we should make to tparm(). This ignores the actual + * terminfo capability (bad, because it is not extensible), but makes this + * code portable to platforms where sizeof(int) != sizeof(char *). + */ +TParams +tparm_type(const char *name) +{ +#define TD(code, longname, ti, tc) \ + {code, {longname} }, \ + {code, {ti} }, \ + {code, {tc} } +#define XD(code, onlyname) TD(code, onlyname, onlyname, onlyname) + TParams result = Numbers; + /* *INDENT-OFF* */ + static const struct { + TParams code; + const char name[12]; + } table[] = { + TD(Num_Str, "pkey_key", "pfkey", "pk"), + TD(Num_Str, "pkey_local", "pfloc", "pl"), + TD(Num_Str, "pkey_xmit", "pfx", "px"), + TD(Num_Str, "plab_norm", "pln", "pn"), + TD(Num_Str_Str, "pkey_plab", "pfxl", "xl"), +#if NCURSES_XNAMES + XD(Str, "Cs"), + XD(Str_Str, "Ms"), +#endif + }; + /* *INDENT-ON* */ + + unsigned n; + for (n = 0; n < SIZEOF(table); n++) { + if (!strcmp(name, table[n].name)) { + result = table[n].code; + break; + } + } + return result; +} + +TParams +guess_tparm_type(int nparam, char **p_is_s) +{ + TParams result = Other; + switch (nparam) { + case 0: + case 1: + if (!p_is_s[0]) + result = Numbers; + if (p_is_s[0]) + result = Str; + break; + case 2: + if (!p_is_s[0] && !p_is_s[1]) + result = Numbers; + if (!p_is_s[0] && p_is_s[1]) + result = Num_Str; + if (p_is_s[0] && p_is_s[1]) + result = Str_Str; + break; + case 3: + if (!p_is_s[0] && !p_is_s[1] && !p_is_s[2]) + result = Numbers; + if (!p_is_s[0] && p_is_s[1] && p_is_s[2]) + result = Num_Str_Str; + break; + default: + break; + } + return result; +} diff --git a/contrib/ncurses/progs/tparm_type.h b/contrib/ncurses/progs/tparm_type.h new file mode 100644 index 00000000..2f7bd077 --- /dev/null +++ b/contrib/ncurses/progs/tparm_type.h @@ -0,0 +1,57 @@ +/**************************************************************************** + * Copyright 2020,2023 Thomas E. Dickey * + * Copyright 2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +/* + * $Id: tparm_type.h,v 1.4 2023/04/08 15:41:20 tom Exp $ + * + * determine expected/actual number of parameters to setup for tparm + */ +#ifndef TPARM_TYPE_H +#define TPARM_TYPE_H 1 + +#define USE_LIBTINFO +#include + +typedef enum { + Other = -1 + ,Numbers = 0 + ,Str + ,Num_Str + ,Num_Str_Str + ,Str_Str +} TParams; + +extern TParams tparm_type(const char *name); +extern TParams guess_tparm_type(int nparam, char **p_is_s); + +#endif /* TPARM_TYPE_H */ diff --git a/contrib/ncurses/progs/tput.c b/contrib/ncurses/progs/tput.c new file mode 100644 index 00000000..f9321b60 --- /dev/null +++ b/contrib/ncurses/progs/tput.c @@ -0,0 +1,506 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * tput.c -- shellscript access to terminal capabilities + * + * by Eric S. Raymond , portions based on code from + * Ross Ridge's mytinfo package. + */ + +#include +#include +#include + +#include +#include + +MODULE_ID("$Id: tput.c,v 1.104 2024/04/20 22:20:51 tom Exp $") + +#define PUTS(s) fputs(s, stdout) + +const char *_nc_progname = "tput"; + +static bool opt_v = FALSE; /* quiet, do not show warnings */ +static bool opt_x = FALSE; /* clear scrollback if possible */ + +static bool is_init = FALSE; +static bool is_reset = FALSE; +static bool is_clear = FALSE; + +static GCC_NORETURN void +quit(int status, const char *fmt, ...) +{ + va_list argp; + + va_start(argp, fmt); + fprintf(stderr, "%s: ", _nc_progname); + vfprintf(stderr, fmt, argp); + fprintf(stderr, "\n"); + va_end(argp); + ExitProgram(status); +} + +static GCC_NORETURN void +usage(const char *optstring) +{ +#define KEEP(s) s "\n" + static const char msg[] = + { + KEEP("") + KEEP("Options:") + KEEP(" -S << read commands from standard input") + KEEP(" -T TERM use this instead of $TERM") + KEEP(" -V print curses-version") + KEEP(" -v verbose, show warnings") + KEEP(" -x do not try to clear scrollback") + KEEP("") + KEEP("Commands:") + KEEP(" clear clear the screen") + KEEP(" init initialize the terminal") + KEEP(" reset reinitialize the terminal") + KEEP(" capname unlike clear/init/reset, print value for capability \"capname\"") + }; +#undef KEEP + (void) fprintf(stderr, "Usage: %s [options] [command]\n", _nc_progname); + if (optstring != NULL) { + const char *s = msg; + while (*s != '\0') { + fputc(UChar(*s), stderr); + if (!strncmp(s, " -", 3)) { + if (strchr(optstring, s[3]) == NULL) + s = strchr(s, '\n') + 1; + } else if (!strncmp(s, "\n\nC", 3)) + break; + ++s; + } + } else { + fputs(msg, stderr); + } + ExitProgram(ErrUsage); +} + +static char * +check_aliases(char *name, bool program) +{ + static char my_init[] = "init"; + static char my_reset[] = "reset"; + static char my_clear[] = "clear"; + + char *result = name; + if ((is_init = same_program(name, program ? PROG_INIT : my_init))) + result = my_init; + if ((is_reset = same_program(name, program ? PROG_RESET : my_reset))) + result = my_reset; + if ((is_clear = same_program(name, program ? PROG_CLEAR : my_clear))) + result = my_clear; + return result; +} + +static int +exit_code(int token, int value) +{ + int result = 99; + + switch (token) { + case BOOLEAN: + result = !value; /* TRUE=0, FALSE=1 */ + break; + case NUMBER: + result = 0; /* always zero */ + break; + case STRING: + result = value; /* 0=normal, 1=missing */ + break; + } + return result; +} + +/* + * Returns nonzero on error. + */ +static int +tput_cmd(int fd, TTY * settings, int argc, char **argv, int *used) +{ + NCURSES_CONST char *name; + char *s; + int status; +#if !PURE_TERMINFO + bool termcap = FALSE; +#endif + + name = check_aliases(argv[0], FALSE); + *used = 1; + if (is_reset || is_init) { + TTY oldmode = *settings; + + int terasechar = -1; /* new erase character */ + int intrchar = -1; /* new interrupt character */ + int tkillchar = -1; /* new kill character */ + + if (is_reset) { + reset_start(stdout, TRUE, FALSE); + reset_tty_settings(fd, settings, FALSE); + } else { + reset_start(stdout, FALSE, TRUE); + } + +#if HAVE_SIZECHANGE + { + NCURSES_INT2 my_rows = lines; + NCURSES_INT2 my_cols = columns; + set_window_size(fd, &my_rows, &my_cols); + lines = my_rows; + columns = my_cols; + } +#else + (void) fd; +#endif + set_control_chars(settings, terasechar, intrchar, tkillchar); + set_conversions(settings); + + if (send_init_strings(fd, &oldmode)) { + reset_flush(); + } + + update_tty_settings(&oldmode, settings); + return 0; + } + + if (strcmp(name, "longname") == 0) { + PUTS(longname()); + return 0; + } +#if !PURE_TERMINFO + retry: +#endif + if (strcmp(name, "clear") == 0) { + return (clear_cmd(opt_x) == ERR) ? ErrUsage : 0; + } else if ((status = tigetflag(name)) != -1) { + return exit_code(BOOLEAN, status); + } else if ((status = tigetnum(name)) != CANCELLED_NUMERIC) { + (void) printf("%d\n", status); + return exit_code(NUMBER, 0); + } else if ((s = tigetstr(name)) == CANCELLED_STRING) { +#if !PURE_TERMINFO + if (!termcap) { + const struct name_table_entry *np; + + termcap = TRUE; + if ((np = _nc_find_entry(name, _nc_get_hash_table(termcap))) != 0) { + switch (np->nte_type) { + case BOOLEAN: + name = boolnames[np->nte_index]; + break; + + case NUMBER: + name = numnames[np->nte_index]; + break; + + case STRING: + name = strnames[np->nte_index]; + break; + } + goto retry; + } + } +#endif + quit(ErrCapName, "unknown terminfo capability '%s'", name); + } else if (VALID_STRING(s)) { + if (argc > 1) { + int k; + int narg; + int analyzed; + int provided; + int popcount; + long numbers[1 + NUM_PARM]; + char *strings[1 + NUM_PARM]; + char *p_is_s[NUM_PARM]; + TParams paramType; + + /* Nasty hack time. The tparm function needs to see numeric + * parameters as numbers, not as pointers to their string + * representations + */ + + for (k = 1; (k < argc) && (k <= NUM_PARM); k++) { + char *tmp = 0; + strings[k] = argv[k]; + numbers[k] = strtol(argv[k], &tmp, 0); + if (tmp == 0 || *tmp != 0) + numbers[k] = 0; + } + for (k = argc; k <= NUM_PARM; k++) { + numbers[k] = 0; + strings[k] = 0; + } + + paramType = tparm_type(name); +#if NCURSES_XNAMES + /* + * If the capability is an extended one, analyze the string. + */ + if (paramType == Numbers) { + struct name_table_entry const *entry_ptr; + entry_ptr = _nc_find_type_entry(name, STRING, FALSE); + if (entry_ptr == NULL) { + paramType = Other; + } + } +#endif + + popcount = 0; + _nc_reset_tparm(NULL); + /* + * Count the number of numeric parameters which are provided. + */ + provided = 0; + for (narg = 1; narg < argc; ++narg) { + char *ending = NULL; + long check = strtol(argv[narg], &ending, 0); + if (check < 0 || ending == argv[narg] || *ending != '\0') + break; + provided = narg; + } + switch (paramType) { + case Str: + s = TPARM_1(s, strings[1]); + analyzed = 1; + if (provided == 0 && argc >= 1) + provided++; + break; + case Str_Str: + s = TPARM_2(s, strings[1], strings[2]); + analyzed = 2; + if (provided == 0 && argc >= 1) + provided++; + if (provided == 1 && argc >= 2) + provided++; + break; + case Num_Str: + s = TPARM_2(s, numbers[1], strings[2]); + analyzed = 2; + if (provided == 1 && argc >= 2) + provided++; + break; + case Num_Str_Str: + s = TPARM_3(s, numbers[1], strings[2], strings[3]); + analyzed = 3; + if (provided == 1 && argc >= 2) + provided++; + if (provided == 2 && argc >= 3) + provided++; + break; + case Numbers: + analyzed = _nc_tparm_analyze(NULL, s, p_is_s, &popcount); +#define myParam(n) numbers[n] + s = TIPARM_9(s, + myParam(1), + myParam(2), + myParam(3), + myParam(4), + myParam(5), + myParam(6), + myParam(7), + myParam(8), + myParam(9)); +#undef myParam + break; + case Other: + /* FALLTHRU */ + default: + analyzed = _nc_tparm_analyze(NULL, s, p_is_s, &popcount); +#define myParam(n) (p_is_s[n - 1] != 0 ? ((TPARM_ARG) strings[n]) : numbers[n]) + s = TPARM_9(s, + myParam(1), + myParam(2), + myParam(3), + myParam(4), + myParam(5), + myParam(6), + myParam(7), + myParam(8), + myParam(9)); +#undef myParam + break; + } + if (analyzed < popcount) { + analyzed = popcount; + } + if (opt_v && (analyzed != provided)) { + fprintf(stderr, "%s: %s parameters for \"%s\"\n", + _nc_progname, + (analyzed < provided ? "extra" : "missing"), + argv[0]); + } + *used += provided; + } + + /* use putp() in order to perform padding */ + putp(s); + return exit_code(STRING, 0); + } + return exit_code(STRING, 1); +} + +int +main(int argc, char **argv) +{ + char *term; + int errret; + bool cmdline = TRUE; + int c; + char buf[BUFSIZ]; + int result = 0; + int fd; + int used; + TTY old_settings; + TTY tty_settings; + bool is_alias; + bool need_tty; + + _nc_progname = check_aliases(_nc_rootname(argv[0]), TRUE); + is_alias = (is_clear || is_reset || is_init); + + term = getenv("TERM"); + + while ((c = getopt(argc, argv, is_alias ? "T:Vvx" : "ST:Vvx")) != -1) { + switch (c) { + case 'S': + cmdline = FALSE; + break; + case 'T': + use_env(FALSE); + use_tioctl(TRUE); + term = optarg; + break; + case 'V': + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + case 'v': /* verbose */ + opt_v = TRUE; + break; + case 'x': /* do not try to clear scrollback */ + opt_x = TRUE; + break; + default: + usage(is_alias ? "TVx" : NULL); + /* NOTREACHED */ + } + } + + need_tty = ((is_reset || is_init) || + (optind < argc && + (!strcmp(argv[optind], "reset") || + !strcmp(argv[optind], "init")))); + + /* + * Modify the argument list to omit the options we processed. + */ + if (is_alias) { + if (optind-- < argc) { + argc -= optind; + argv += optind; + } + argv[0] = strdup(_nc_progname); + } else { + argc -= optind; + argv += optind; + } + + if (term == 0 || *term == '\0') + quit(ErrUsage, "No value for $TERM and no -T specified"); + + fd = save_tty_settings(&tty_settings, need_tty); + old_settings = tty_settings; + + if (setupterm(term, fd, &errret) != OK && errret <= 0) + quit(ErrTermType, "unknown terminal \"%s\"", term); + + if (cmdline) { + int code = 0; + if ((argc <= 0) && !is_alias) + usage(NULL); + while (argc > 0) { + tty_settings = old_settings; + code = tput_cmd(fd, &tty_settings, argc, argv, &used); + if (code != 0) + break; + argc -= used; + argv += used; + } + ExitProgram(code); + } + + while (fgets(buf, sizeof(buf), stdin) != 0) { + size_t need = strlen(buf); + char **argvec = typeCalloc(char *, need + 1); + char **argnow; + int argnum = 0; + char *cp; + + if (argvec == NULL) { + quit(ErrSystem(1), strerror(errno)); + } + + /* split the buffer into tokens */ + for (cp = buf; *cp; cp++) { + if (isspace(UChar(*cp))) { + *cp = '\0'; + } else if (cp == buf || cp[-1] == '\0') { + argvec[argnum++] = cp; + if (argnum >= (int) need) + break; + } + } + + argnow = argvec; + while (argnum > 0) { + int code; + tty_settings = old_settings; + code = tput_cmd(fd, &tty_settings, argnum, argnow, &used); + if (code != 0) { + if (result == 0) + result = ErrSystem(0); /* will return value >4 */ + ++result; + } + argnum -= used; + argnow += used; + } + free(argvec); + } + + ExitProgram(result); +} diff --git a/contrib/ncurses/progs/transform.c b/contrib/ncurses/progs/transform.c new file mode 100644 index 00000000..67caf2d2 --- /dev/null +++ b/contrib/ncurses/progs/transform.c @@ -0,0 +1,80 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2009-2010,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ +#include +#include + +#include + +MODULE_ID("$Id: transform.c,v 1.4 2020/02/02 23:34:34 tom Exp $") + +#ifdef SUFFIX_IGNORED +static void +trim_suffix(const char *a, size_t *len) +{ + const char ignore[] = SUFFIX_IGNORED; + + if (sizeof(ignore) != 0) { + bool trim = FALSE; + size_t need = (sizeof(ignore) - 1); + + if (*len > need) { + size_t first = *len - need; + size_t n; + trim = TRUE; + for (n = first; n < *len; ++n) { + if (tolower(UChar(a[n])) != tolower(UChar(ignore[n - first]))) { + trim = FALSE; + break; + } + } + if (trim) { + *len -= need; + } + } + } +} +#else +#define trim_suffix(a, len) /* nothing */ +#endif + +bool +same_program(const char *a, const char *b) +{ + size_t len_a = strlen(a); + size_t len_b = strlen(b); + + trim_suffix(a, &len_a); + trim_suffix(b, &len_b); + + return (len_a == len_b) && (strncmp(a, b, len_a) == 0); +} diff --git a/contrib/ncurses/progs/tset.c b/contrib/ncurses/progs/tset.c new file mode 100644 index 00000000..c143504d --- /dev/null +++ b/contrib/ncurses/progs/tset.c @@ -0,0 +1,921 @@ +/**************************************************************************** + * Copyright 2020-2021,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Zeyd M. Ben-Halim 1992,1995 * + * and: Eric S. Raymond * + * and: Thomas E. Dickey 1996-on * + ****************************************************************************/ + +/* + * Notes: + * The initial adaptation from 4.4BSD Lite sources in September 1995 used 686 + * lines from that version, and made changes/additions for 150 lines. There + * was no reformatting, so with/without ignoring whitespace, the amount of + * change is the same. + * + * Comparing with current (2009) source, excluding this comment: + * a) 209 lines match identically to the 4.4BSD Lite sources, with 771 lines + * changed/added. + * a) Ignoring whitespace, the current version still uses 516 lines from the + * 4.4BSD Lite sources, with 402 lines changed/added. + * + * Raymond's original comment on this follows... + */ + +/* + * tset.c - terminal initialization utility + * + * This code was mostly swiped from 4.4BSD tset, with some obsolescent + * cruft removed and substantial portions rewritten. A Regents of the + * University of California copyright applies to some portions of the + * code, and is reproduced below: + */ +/*- + * Copyright (c) 1980, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#if HAVE_GETTTYNAM +#include +#endif +#ifdef NeXT +char *ttyname(int fd); +#endif + +MODULE_ID("$Id: tset.c,v 1.136 2024/10/19 21:40:28 tom Exp $") + +#ifndef environ +extern char **environ; +#endif + +const char *_nc_progname = "tset"; + +#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c)) + +static GCC_NORETURN void exit_error(void); + +static int +CaselessCmp(const char *a, const char *b) +{ /* strcasecmp isn't portable */ + while (*a && *b) { + int cmp = LOWERCASE(*a) - LOWERCASE(*b); + if (cmp != 0) + break; + a++, b++; + } + return LOWERCASE(*a) - LOWERCASE(*b); +} + +static GCC_NORETURN void +exit_error(void) +{ + restore_tty_settings(); + (void) fprintf(stderr, "\n"); + fflush(stderr); + ExitProgram(EXIT_FAILURE); + /* NOTREACHED */ +} + +static GCC_NORETURN void +err(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + (void) fprintf(stderr, "%s: ", _nc_progname); + (void) vfprintf(stderr, fmt, ap); + va_end(ap); + exit_error(); + /* NOTREACHED */ +} + +static GCC_NORETURN void +failed(const char *msg) +{ + char temp[BUFSIZ]; + size_t len = strlen(_nc_progname) + 2; + + if ((int) len < (int) sizeof(temp) - 12) { + _nc_STRCPY(temp, _nc_progname, sizeof(temp)); + _nc_STRCAT(temp, ": ", sizeof(temp)); + } else { + _nc_STRCPY(temp, "tset: ", sizeof(temp)); + } + _nc_STRNCAT(temp, msg, sizeof(temp), sizeof(temp) - strlen(temp) - 2); + perror(temp); + exit_error(); + /* NOTREACHED */ +} + +/* Prompt the user for a terminal type. */ +static const char * +askuser(const char *dflt) +{ + static char answer[256]; + + /* We can get recalled; if so, don't continue uselessly. */ + clearerr(stdin); + if (feof(stdin) || ferror(stdin)) { + (void) fprintf(stderr, "\n"); + exit_error(); + /* NOTREACHED */ + } + + for (;;) { + char *p; + + if (dflt) + (void) fprintf(stderr, "Terminal type? [%s] ", dflt); + else + (void) fprintf(stderr, "Terminal type? "); + (void) fflush(stderr); + + if (fgets(answer, sizeof(answer), stdin) == 0) { + if (dflt == 0) { + exit_error(); + /* NOTREACHED */ + } + return (dflt); + } + + if ((p = strchr(answer, '\n')) != 0) + *p = '\0'; + if (answer[0]) + return (answer); + if (dflt != 0) + return (dflt); + } +} + +/************************************************************************** + * + * Mapping logic begins here + * + **************************************************************************/ + +/* Baud rate conditionals for mapping. */ +#define GT 0x01 +#define EQ 0x02 +#define LT 0x04 +#define NOT 0x08 +#define GE (GT | EQ) +#define LE (LT | EQ) + +typedef struct map { + struct map *next; /* Linked list of maps. */ + const char *porttype; /* Port type, or "" for any. */ + const char *type; /* Terminal type to select. */ + int conditional; /* Baud rate conditionals bitmask. */ + int speed; /* Baud rate to compare against. */ +} MAP; + +static MAP *cur, *maplist; + +#define DATA(name,value) { { name }, value } + +typedef struct speeds { + const char string[8]; + int speed; +} SPEEDS; + +#if defined(EXP_WIN32_DRIVER) +static const SPEEDS speeds[] = +{ + {"0", 0} +}; +#else +static const SPEEDS speeds[] = +{ + DATA("0", B0), + DATA("50", B50), + DATA("75", B75), + DATA("110", B110), + DATA("134", B134), + DATA("134.5", B134), + DATA("150", B150), + DATA("200", B200), + DATA("300", B300), + DATA("600", B600), + DATA("1200", B1200), + DATA("1800", B1800), + DATA("2400", B2400), + DATA("4800", B4800), + DATA("9600", B9600), + /* sgttyb may define up to this point */ +#ifdef B19200 + DATA("19200", B19200), +#endif +#ifdef B38400 + DATA("38400", B38400), +#endif +#ifdef B19200 + DATA("19200", B19200), +#endif +#ifdef B38400 + DATA("38400", B38400), +#endif +#ifdef B19200 + DATA("19200", B19200), +#else +#ifdef EXTA + DATA("19200", EXTA), +#endif +#endif +#ifdef B38400 + DATA("38400", B38400), +#else +#ifdef EXTB + DATA("38400", EXTB), +#endif +#endif +#ifdef B57600 + DATA("57600", B57600), +#endif +#ifdef B76800 + DATA("76800", B57600), +#endif +#ifdef B115200 + DATA("115200", B115200), +#endif +#ifdef B153600 + DATA("153600", B153600), +#endif +#ifdef B230400 + DATA("230400", B230400), +#endif +#ifdef B307200 + DATA("307200", B307200), +#endif +#ifdef B460800 + DATA("460800", B460800), +#endif +#ifdef B500000 + DATA("500000", B500000), +#endif +#ifdef B576000 + DATA("576000", B576000), +#endif +#ifdef B921600 + DATA("921600", B921600), +#endif +#ifdef B1000000 + DATA("1000000", B1000000), +#endif +#ifdef B1152000 + DATA("1152000", B1152000), +#endif +#ifdef B1500000 + DATA("1500000", B1500000), +#endif +#ifdef B2000000 + DATA("2000000", B2000000), +#endif +#ifdef B2500000 + DATA("2500000", B2500000), +#endif +#ifdef B3000000 + DATA("3000000", B3000000), +#endif +#ifdef B3500000 + DATA("3500000", B3500000), +#endif +#ifdef B4000000 + DATA("4000000", B4000000), +#endif +}; +#undef DATA +#endif + +static int +tbaudrate(char *rate) +{ + const SPEEDS *sp = 0; + size_t n; + + /* The baudrate number can be preceded by a 'B', which is ignored. */ + if (*rate == 'B') + ++rate; + + for (n = 0; n < SIZEOF(speeds); ++n) { + if (n > 0 && (speeds[n].speed <= speeds[n - 1].speed)) { + /* if the speeds are not increasing, likely a numeric overflow */ + break; + } + if (!CaselessCmp(rate, speeds[n].string)) { + sp = speeds + n; + break; + } + } + if (sp == 0) + err("unknown baud rate %s", rate); + return (sp->speed); +} + +/* + * Syntax for -m: + * [port-type][test baudrate]:terminal-type + * The baud rate tests are: >, <, @, =, ! + */ +static void +add_mapping(const char *port, char *arg) +{ + MAP *mapp; + char *copy, *p; + const char *termp; + char *base = 0; + + copy = strdup(arg); + mapp = typeMalloc(MAP, 1); + if (copy == 0 || mapp == 0) + failed("malloc"); + + assert(copy != 0); + assert(mapp != 0); + + mapp->next = 0; + if (maplist == 0) + cur = maplist = mapp; + else { + cur->next = mapp; + cur = mapp; + } + + mapp->porttype = arg; + mapp->conditional = 0; + + arg = strpbrk(arg, "><@=!:"); + + if (arg == 0) { /* [?]term */ + mapp->type = mapp->porttype; + mapp->porttype = 0; + goto done; + } + + if (arg == mapp->porttype) /* [><@=! baud]:term */ + termp = mapp->porttype = 0; + else + termp = base = arg; + + for (;; ++arg) { /* Optional conditionals. */ + switch (*arg) { + case '<': + if (mapp->conditional & GT) + goto badmopt; + mapp->conditional |= LT; + break; + case '>': + if (mapp->conditional & LT) + goto badmopt; + mapp->conditional |= GT; + break; + case '@': + case '=': /* Not documented. */ + mapp->conditional |= EQ; + break; + case '!': + mapp->conditional |= NOT; + break; + default: + goto next; + } + } + + next: + if (*arg == ':') { + if (mapp->conditional) + goto badmopt; + ++arg; + } else { /* Optional baudrate. */ + arg = strchr(p = arg, ':'); + if (arg == 0) + goto badmopt; + *arg++ = '\0'; + mapp->speed = tbaudrate(p); + } + + mapp->type = arg; + + /* Terminate porttype, if specified. */ + if (termp != 0) + *base = '\0'; + + /* If a NOT conditional, reverse the test. */ + if (mapp->conditional & NOT) + mapp->conditional = ~mapp->conditional & (EQ | GT | LT); + + /* If user specified a port with an option flag, set it. */ + done: + if (port) { + if (mapp->porttype) { + badmopt: + err("illegal -m option format: %s", copy); + } + mapp->porttype = port; + } + free(copy); +#ifdef MAPDEBUG + (void) printf("port: %s\n", mapp->porttype ? mapp->porttype : "ANY"); + (void) printf("type: %s\n", mapp->type); + (void) printf("conditional: "); + p = ""; + if (mapp->conditional & GT) { + (void) printf("GT"); + p = "/"; + } + if (mapp->conditional & EQ) { + (void) printf("%sEQ", p); + p = "/"; + } + if (mapp->conditional & LT) + (void) printf("%sLT", p); + (void) printf("\nspeed: %d\n", mapp->speed); +#endif +} + +/* + * Return the type of terminal to use for a port of type 'type', as specified + * by the first applicable mapping in 'map'. If no mappings apply, return + * 'type'. + */ +static const char * +mapped(const char *type) +{ + MAP *mapp; + int match; + + for (mapp = maplist; mapp; mapp = mapp->next) + if (mapp->porttype == 0 || !strcmp(mapp->porttype, type)) { + switch (mapp->conditional) { + case 0: /* No test specified. */ + match = TRUE; + break; + case EQ: + match = ((int) ospeed == mapp->speed); + break; + case GE: + match = ((int) ospeed >= mapp->speed); + break; + case GT: + match = ((int) ospeed > mapp->speed); + break; + case LE: + match = ((int) ospeed <= mapp->speed); + break; + case LT: + match = ((int) ospeed < mapp->speed); + break; + default: + match = FALSE; + } + if (match) + return (mapp->type); + } + /* No match found; return given type. */ + return (type); +} + +/************************************************************************** + * + * Entry fetching + * + **************************************************************************/ + +/* + * Figure out what kind of terminal we're dealing with, and then read in + * its termcap entry. + */ +static const char * +get_termcap_entry(int fd, char *userarg) +{ + int errret; + const char *p; + const char *ttype; +#if HAVE_PATH_TTYS +#if HAVE_GETTTYNAM + struct ttyent *t; +#else + FILE *fp; +#endif + char *ttypath; +#endif /* HAVE_PATH_TTYS */ + + (void) fd; + + if (userarg) { + ttype = userarg; + goto found; + } + + /* Try the environment. */ + if ((ttype = getenv("TERM")) != 0) + goto map; + +#if HAVE_PATH_TTYS + if ((ttypath = ttyname(fd)) != 0) { + p = _nc_basename(ttypath); +#if HAVE_GETTTYNAM + /* + * We have the 4.3BSD library call getttynam(3); that means + * there's an /etc/ttys to look up device-to-type mappings in. + * Try ttyname(3); check for dialup or other mapping. + */ + if ((t = getttynam(p))) { + ttype = t->ty_type; + goto map; + } +#else + if ((fp = fopen("/etc/ttytype", "r")) != 0 + || (fp = fopen("/etc/ttys", "r")) != 0) { + char buffer[BUFSIZ]; + char *s, *t, *d; + + while (fgets(buffer, sizeof(buffer) - 1, fp) != 0) { + for (s = buffer, t = d = 0; *s; s++) { + if (isspace(UChar(*s))) + *s = '\0'; + else if (t == 0) + t = s; + else if (d == 0 && s != buffer && s[-1] == '\0') + d = s; + } + if (t != 0 && d != 0 && !strcmp(d, p)) { + ttype = strdup(t); + fclose(fp); + goto map; + } + } + fclose(fp); + } +#endif /* HAVE_GETTTYNAM */ + } +#endif /* HAVE_PATH_TTYS */ + + /* If still undefined, use "unknown". */ + ttype = "unknown"; + + map:ttype = mapped(ttype); + + /* + * If not a path, remove TERMCAP from the environment so we get a + * real entry from /etc/termcap. This prevents us from being fooled + * by out of date stuff in the environment. + */ + found: + if ((p = getenv("TERMCAP")) != 0 && !_nc_is_abs_path(p)) { + /* 'unsetenv("TERMCAP")' is not portable. + * The 'environ' array is better. + */ + int n; + for (n = 0; environ[n] != 0; n++) { + if (!strncmp("TERMCAP=", environ[n], (size_t) 8)) { + while ((environ[n] = environ[n + 1]) != 0) { + n++; + } + break; + } + } + } + + /* + * ttype now contains a pointer to the type of the terminal. + * If the first character is '?', ask the user. + */ + if (ttype[0] == '?') { + if (ttype[1] != '\0') + ttype = askuser(ttype + 1); + else + ttype = askuser(0); + } + /* Find the terminfo entry. If it doesn't exist, ask the user. */ + while (setupterm((NCURSES_CONST char *) ttype, fd, &errret) + != OK) { + if (errret == 0) { + (void) fprintf(stderr, "%s: unknown terminal type %s\n", + _nc_progname, ttype); + ttype = 0; + } else { + (void) fprintf(stderr, + "%s: can't initialize terminal type %s (error %d)\n", + _nc_progname, ttype, errret); + ttype = 0; + } + ttype = askuser(ttype); + } +#if BROKEN_LINKER + tgetflag("am"); /* force lib_termcap.o to be linked for 'ospeed' */ +#endif + return (ttype); +} + +/************************************************************************** + * + * Main sequence + * + **************************************************************************/ + +/* + * Convert the obsolete argument forms into something that getopt can handle. + * This means that -e, -i and -k get default arguments supplied for them. + */ +static void +obsolete(char **argv) +{ + for (; *argv; ++argv) { + const char *parm = argv[0]; + + if (parm[0] == '-' && parm[1] == '\0') { + argv[0] = strdup("-q"); + continue; + } + + if ((parm[0] != '-') + || (argv[1] && argv[1][0] != '-') + || (parm[1] != 'e' && parm[1] != 'i' && parm[1] != 'k') + || (parm[2] != '\0')) + continue; + switch (argv[0][1]) { + case 'e': + argv[0] = strdup("-e^H"); + break; + case 'i': + argv[0] = strdup("-i^C"); + break; + case 'k': + argv[0] = strdup("-k^U"); + break; + } + } +} + +static void +print_shell_commands(const char *ttype) +{ + const char *p; + int len; + char *var; + char *leaf; + /* + * Figure out what shell we're using. A hack, we look for an + * environmental variable SHELL ending in "csh". + */ + if ((var = getenv("SHELL")) != 0 + && ((len = (int) strlen(leaf = _nc_basename(var))) >= 3) + && !strcmp(leaf + len - 3, "csh")) + p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n"; + else + p = "TERM=%s;\n"; + (void) printf(p, ttype); +} + +static void +usage(void) +{ +#define SKIP(s) /* nothing */ +#define KEEP(s) s "\n" + static const char msg[] = + { + KEEP("") + KEEP("Options:") + SKIP(" -a arpanet (obsolete)") + KEEP(" -c set control characters") + SKIP(" -d dialup (obsolete)") + KEEP(" -e ch erase character") + KEEP(" -I no initialization strings") + KEEP(" -i ch interrupt character") + KEEP(" -k ch kill character") + KEEP(" -m mapping map identifier to type") + SKIP(" -p plugboard (obsolete)") + KEEP(" -Q do not output control key settings") + KEEP(" -q display term only, do no changes") + KEEP(" -r display term on stderr") + SKIP(" -S (obsolete)") + KEEP(" -s output TERM set command") + KEEP(" -V print curses-version") + KEEP(" -w set window-size") + KEEP("") + KEEP("If neither -c/-w are given, both are assumed.") + }; +#undef KEEP +#undef SKIP + (void) fprintf(stderr, "Usage: %s [options] [terminal]\n", _nc_progname); + fputs(msg, stderr); + ExitProgram(EXIT_FAILURE); + /* NOTREACHED */ +} + +static char +arg_to_char(void) +{ + return (char) ((optarg[0] == '^' && optarg[1] != '\0') + ? ((optarg[1] == '?') ? '\177' : CTRL(optarg[1])) + : optarg[0]); +} + +int +main(int argc, char **argv) +{ + int ch, noinit, noset, quiet, Sflag, sflag, showterm; + const char *ttype; + int terasechar = -1; /* new erase character */ + int intrchar = -1; /* new interrupt character */ + int tkillchar = -1; /* new kill character */ + int my_fd; + bool opt_c = FALSE; /* set control-chars */ + bool opt_w = FALSE; /* set window-size */ + TTY mode, oldmode; + + _nc_progname = _nc_rootname(*argv); + obsolete(argv); + noinit = noset = quiet = Sflag = sflag = showterm = 0; + while ((ch = getopt(argc, argv, "a:cd:e:Ii:k:m:p:qQrSsVw")) != -1) { + switch (ch) { + case 'c': /* set control-chars */ + opt_c = TRUE; + break; + case 'a': /* OBSOLETE: map identifier to type */ + add_mapping("arpanet", optarg); + break; + case 'd': /* OBSOLETE: map identifier to type */ + add_mapping("dialup", optarg); + break; + case 'e': /* erase character */ + terasechar = arg_to_char(); + break; + case 'I': /* no initialization strings */ + noinit = 1; + break; + case 'i': /* interrupt character */ + intrchar = arg_to_char(); + break; + case 'k': /* kill character */ + tkillchar = arg_to_char(); + break; + case 'm': /* map identifier to type */ + add_mapping(0, optarg); + break; + case 'p': /* OBSOLETE: map identifier to type */ + add_mapping("plugboard", optarg); + break; + case 'Q': /* don't output control key settings */ + quiet = 1; + break; + case 'q': /* display term only */ + noset = 1; + break; + case 'r': /* display term on stderr */ + showterm = 1; + break; + case 'S': /* OBSOLETE: output TERM & TERMCAP */ + Sflag = 1; + break; + case 's': /* output TERM set command */ + sflag = 1; + break; + case 'V': /* print curses-version */ + puts(curses_version()); + ExitProgram(EXIT_SUCCESS); + case 'w': /* set window-size */ + opt_w = TRUE; + break; + case '?': + default: + usage(); + } + } + + argc -= optind; + argv += optind; + + if (argc > 1) + usage(); + + if (!opt_c && !opt_w) + opt_c = opt_w = TRUE; + + my_fd = save_tty_settings(&mode, TRUE); + oldmode = mode; +#ifdef TERMIOS + ospeed = (NCURSES_OSPEED) cfgetospeed(&mode); +#elif defined(EXP_WIN32_DRIVER) + ospeed = 0; +#else + ospeed = (NCURSES_OSPEED) mode.sg_ospeed; +#endif + + if (same_program(_nc_progname, PROG_RESET)) { + reset_start(stderr, TRUE, FALSE); + reset_tty_settings(my_fd, &mode, noset); + } else { + reset_start(stderr, FALSE, TRUE); + } + + ttype = get_termcap_entry(my_fd, *argv); + + if (!noset) { +#if HAVE_SIZECHANGE + if (opt_w) { + NCURSES_INT2 my_rows = lines; + NCURSES_INT2 my_cols = columns; + set_window_size(my_fd, &my_rows, &my_cols); + lines = my_rows; + columns = my_cols; + } +#endif + if (opt_c) { + set_control_chars(&mode, terasechar, intrchar, tkillchar); + set_conversions(&mode); + + if (!noinit) { + if (send_init_strings(my_fd, &oldmode)) { + const char *name; + + (void) putc('\r', stderr); + (void) fflush(stderr); + if (IsRealTty(my_fd, name)) { + (void) napms(1000); /* Settle the terminal. */ + } + } + } + + update_tty_settings(&oldmode, &mode); + } + } + + if (noset) { + (void) printf("%s\n", ttype); + } else { + if (showterm) + (void) fprintf(stderr, "Terminal type is %s.\n", ttype); + /* + * If erase, kill and interrupt characters could have been + * modified and not -Q, display the changes. + */ + if (!quiet) { + print_tty_chars(&oldmode, &mode); + } + } + + if (Sflag) + err("The -S option is not supported under terminfo."); + + if (sflag) { + print_shell_commands(ttype); + } + + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/progs/tty_settings.c b/contrib/ncurses/progs/tty_settings.c new file mode 100644 index 00000000..a9eb8cd8 --- /dev/null +++ b/contrib/ncurses/progs/tty_settings.c @@ -0,0 +1,107 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ + +#define USE_LIBTINFO +#include + +#include + +MODULE_ID("$Id: tty_settings.c,v 1.7 2021/10/08 23:53:32 tom Exp $") + +static int my_fd; +static TTY original_settings; +static bool can_restore = FALSE; + +static void +failed(const char *msg) +{ + int code = errno; + + (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code)); + restore_tty_settings(); + (void) fprintf(stderr, "\n"); + ExitProgram(ErrSystem(code)); + /* NOTREACHED */ +} + +static bool +get_tty_settings(int fd, TTY * tty_settings) +{ + bool success = TRUE; + my_fd = fd; + if (fd < 0 || GET_TTY(my_fd, tty_settings) < 0) { + success = FALSE; + } + return success; +} + +/* + * Open a file descriptor on the current terminal, to obtain its settings. + * stderr is less likely to be redirected than stdout; try that first. + */ +int +save_tty_settings(TTY * tty_settings, bool need_tty) +{ + if (!get_tty_settings(STDERR_FILENO, tty_settings) && + !get_tty_settings(STDOUT_FILENO, tty_settings) && + !get_tty_settings(STDIN_FILENO, tty_settings)) { + if (need_tty) { + int fd = open("/dev/tty", O_RDWR); + if (!get_tty_settings(fd, tty_settings)) { + failed("terminal attributes"); + } + } else { + my_fd = fileno(stdout); + } + } else { + can_restore = TRUE; + original_settings = *tty_settings; + } + return my_fd; +} + +void +restore_tty_settings(void) +{ + if (can_restore) + SET_TTY(my_fd, &original_settings); +} + +/* Set the modes if they've changed. */ +void +update_tty_settings(TTY * old_settings, TTY * new_settings) +{ + if (memcmp(new_settings, old_settings, sizeof(TTY))) { + SET_TTY(my_fd, new_settings); + } +} diff --git a/contrib/ncurses/progs/tty_settings.h b/contrib/ncurses/progs/tty_settings.h new file mode 100644 index 00000000..bd3bcdb3 --- /dev/null +++ b/contrib/ncurses/progs/tty_settings.h @@ -0,0 +1,51 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E Dickey * + ****************************************************************************/ + +/* + * $Id: tty_settings.h,v 1.3 2020/02/02 23:34:34 tom Exp $ + * + * Utility functions for saving/restoring terminal settings. + */ +#ifndef TTY_SETTINGS_H +#define TTY_SETTINGS_H 1 +/* *INDENT-OFF* */ + +#include + +extern int save_tty_settings(TTY * /* tty_settings */, bool /* need_tty */ ); +extern void restore_tty_settings(void); +extern void update_tty_settings(TTY * /* old_settings */, TTY * /* new_settings */ ); + +/* *INDENT-ON* */ + +#endif /* TTY_SETTINGS_H */ diff --git a/contrib/ncurses/test/Makefile.in b/contrib/ncurses/test/Makefile.in new file mode 100644 index 00000000..ac0468c2 --- /dev/null +++ b/contrib/ncurses/test/Makefile.in @@ -0,0 +1,177 @@ +# $Id: Makefile.in,v 1.131 2024/08/10 18:19:56 tom Exp $ +############################################################################## +# Copyright 2020-2021,2024 Thomas E. Dickey # +# Copyright 1998-2017,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1996-on +# +# Makefile for ncurses tests. + +# turn off _all_ suffix rules; we'll generate our own +.SUFFIXES: + +SHELL = @SHELL@ +VPATH = @srcdir@ + +@SET_MAKE@ + +destdir = +x = @EXEEXT@ +o = .@OBJEXT@ + +PACKAGE = @PACKAGE@ + +MODEL = ../@DFT_OBJ_SUBDIR@ +top_srcdir = @top_srcdir@ +srcdir = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ + +bindir = @bindir@ +libexecdir = @libexecdir@ +libdir = @libdir@ +datarootdir = @datarootdir@ +datadir = @datadir@ + +real_bindir = $(libexecdir)/$(PACKAGE) + +BINDIR = $(DESTDIR)$(bindir@MERGE_PREFIX@) +LIBEXECDIR = $(DESTDIR)$(libexecdir@MERGE_PREFIX@) +LIBDIR = $(DESTDIR)$(libdir@MERGE_PREFIX@) +DATADIR = $(DESTDIR)$(datadir@MERGE_PREFIX@) + +REAL_BINDIR = $(LIBEXECDIR)/$(PACKAGE) + +LIBTOOL = @LIBTOOL@ +LIBTOOL_OPTS = @LIBTOOL_OPTS@ +LIBTOOL_CLEAN = @LIB_CLEAN@ +LIBTOOL_COMPILE = @LIB_COMPILE@ +LIBTOOL_LINK = @LIB_LINK@ + +INSTALL = @INSTALL@ @INSTALL_OPT_O@ +INSTALL_PROG = @INSTALL_PROGRAM@ @INSTALL_OPT_S@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_DATA = @INSTALL_DATA@ +transform = @program_transform_name@ +TRANSFORM = sed 's/$x$$//'|sed '$(transform)'|sed 's/$$/$x/' + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +CC = @CC@ +CPP = @CPP@ + +CFLAGS = @CFLAGS@ @EXTRA_CFLAGS@ +CPPFLAGS = -I. -I$(srcdir) -I../test -DHAVE_CONFIG_H -DDATA_DIR=\"$(datadir)\" @CPPFLAGS@ + +CCFLAGS = $(CPPFLAGS) $(CFLAGS) + +CFLAGS_LIBTOOL = $(CCFLAGS) +CFLAGS_NORMAL = $(CCFLAGS) -DNCURSES_STATIC +CFLAGS_DEBUG = $(CCFLAGS) -DNCURSES_STATIC @CC_G_OPT@ -DTRACE +CFLAGS_PROFILE = $(CCFLAGS) -DNCURSES_STATIC -pg +CFLAGS_SHARED = $(CCFLAGS) @CC_SHARED_OPTS@ + +CFLAGS_DEFAULT = $(CFLAGS_@DFT_UPR_MODEL@) + +REL_VERSION = @cf_cv_rel_version@ +ABI_VERSION = @cf_cv_abi_version@ +LOCAL_LIBDIR = @top_builddir@/lib +LOCAL_LIBS = @TEST_DEPS@ +MATH_LIB = @MATH_LIB@ +TEST_LIBS = @TEST_LIBS@ + +LD = @LD@ +LINK = @LINK_TESTS@ $(LIBTOOL_LINK) $(CFLAGS) + +LDFLAGS = @LD_MODEL@ @LOCAL_LDFLAGS@ @LDFLAGS@ + +LDFLAGS_LIBTOOL = $(LDFLAGS) $(CFLAGS_LIBTOOL) +LDFLAGS_NORMAL = $(LDFLAGS) $(CFLAGS_NORMAL) +LDFLAGS_DEBUG = $(LDFLAGS) $(CFLAGS_DEBUG) +LDFLAGS_PROFILE = $(LDFLAGS) $(CFLAGS_PROFILE) +LDFLAGS_SHARED = $(LDFLAGS) $(CFLAGS_SHARED) @LD_SHARED_OPTS@ + +TEST_ARGS = @LDFLAGS_STATIC@ @TEST_ARGS@ @LDFLAGS_SHARED@ + +# use these for linking with all of the libraries +LIBS_DEFAULT = $(TEST_ARGS) @LIBS@ $(TEST_LIBS) +LDFLAGS_DEFAULT = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_DEFAULT) + +# use these for linking with the (n)curses library and possibly pthreads +LIBS_THREADS = `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-l@FORM_NAME@.*-l@PANEL_NAME@[^ ]*//'` $(TEST_LIBS) @PTHREAD@ +LDFLAGS_THREADS = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_THREADS) + +# use these for linking with the (n)curses library +LIBS_CURSES = `echo "$(TEST_ARGS) @LIBS@" | sed -e 's/-l@FORM_NAME@.*-l@PANEL_NAME@[^ ]*//'` $(TEST_LIBS) +LDFLAGS_CURSES = $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_CURSES) + +# use these when we need the math library +LDFLAGS_CURSES_M= $(LDFLAGS_CURSES) $(MATH_LIB) + +# use these for linking with the tinfo library if we have it, or curses library if not +LIBS_TINFO = @LDFLAGS_STATIC@ @TINFO_LIBS@ @LDFLAGS_SHARED@ @LIBS@ $(TEST_LIBS) +LDFLAGS_TINFO = @TINFO_LDFLAGS@ $(LDFLAGS_@DFT_UPR_MODEL@) $(LIBS_TINFO) + +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ +LINT_LIBS = -lform -lmenu -lpanel -lncurses @LIBS@ + +INCDIR = $(top_srcdir)/include +incdir = ../include + +HEADER_DEPS = \ + $(incdir)/curses.h \ + $(incdir)/term.h \ + $(incdir)/ncurses_cfg.h \ + $(incdir)/ncurses_def.h \ + $(incdir)/ncurses_dll.h \ + $(incdir)/term.h \ + $(incdir)/unctrl.h \ + $(INCDIR)/nc_alloc.h + +################################################################################ + +@MAKE_PHONY@.PHONY : all +@MAKE_PHONY@.PHONY : check + +all:: + +# Verify that each header-file can be compiled without including another. +check:: + @$(SHELL) -c "for header in *.h;\ + do \ + echo \"** testing \$${header}\" ; \ + echo \"#include <\$${header}>\" >headers.c; \ + echo \"int main(void) { return 0; }\" >>headers.c; \ + $(CC) -c $(CFLAGS) $(CPPFLAGS) headers.c; \ + done" + -@rm -f headers.* + +# The rest is generated from the "programs" and "modules" files... diff --git a/contrib/ncurses/test/README b/contrib/ncurses/test/README new file mode 100644 index 00000000..885349dd --- /dev/null +++ b/contrib/ncurses/test/README @@ -0,0 +1,858 @@ +------------------------------------------------------------------------------- +-- Copyright 2018-2023,2024 Thomas E. Dickey -- +-- Copyright 1998-2017,2018 Free Software Foundation, Inc. -- +-- -- +-- Permission is hereby granted, free of charge, to any person obtaining a -- +-- copy of this software and associated documentation files (the -- +-- "Software"), to deal in the Software without restriction, including -- +-- without limitation the rights to use, copy, modify, merge, publish, -- +-- distribute, distribute with modifications, sublicense, and/or sell copies -- +-- of the Software, and to permit persons to whom the Software is furnished -- +-- to do so, subject to the following conditions: -- +-- -- +-- The above copyright notice and this permission notice shall be included -- +-- in all copies or substantial portions of the Software. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -- +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -- +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -- +-- NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -- +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -- +-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -- +-- USE OR OTHER DEALINGS IN THE SOFTWARE. -- +-- -- +-- Except as contained in this notice, the name(s) of the above copyright -- +-- holders shall not be used in advertising or otherwise to promote the -- +-- sale, use or other dealings in this Software without prior written -- +-- authorization. -- +------------------------------------------------------------------------------- +-- $Id: README,v 1.82 2024/04/27 18:35:01 tom Exp $ +------------------------------------------------------------------------------- + +The programs in this directory are used to test and demonstrate ncurses. +Some are interesting in themselves, while others merely show how some of +the library calls are used. Some date back to the initial releases of +ncurses during the mid-1990s, such as: + + blue - Blue Moon, a nifty solitaire (uses color) + bs.c - the game of Battleships (uses color) + firework.c - multi-colored fireworks (uses color) + gdc.c - Great Digital Clock (uses color) + hanoi.c - the game of hanoi (uses color essentially) + knight.c - the game of Knight's Tour (uses color) + lrtest.c - test of access to the lower-right corner + ncurses.c - multi-test program (uses color) + newdemo.c - another test from PDCurses (uses color) + rain.c - rain drops keep falling on my head... + tclock.c - analog/digital clock + testcurs.c - a test from the PDCurses people (uses color) + tracemunch - Perl script to make trace scripts easier to read + worm.c - worms run all over your screen (uses color) + xmas.c - Xmas greeting card + +Besides being built as part of ncurses, the programs are also packaged as +"ncurses-examples". Despite the name, the programs have been adjusted to +allow them to build with other curses implementations, to provide a way to +compare those with ncurses. + +You can build the programs by + + ./configure + make + +The configure script has several options which allow you to tell it more +about the curses implementation for which you are building the examples. +Use + + ./configure --help + +to list the options. + +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- + +These programs provide examples of use, but do not comprise a complete set of +tests. Here is a list of library externals, noting those that are used: + +libform: +------- +TYPE_ALNUM test: demo_forms +TYPE_ALPHA test: demo_forms dup_field move_field ncurses +TYPE_ENUM test: demo_forms +TYPE_INTEGER test: demo_forms +TYPE_IPV4 test: demo_forms +TYPE_NUMERIC test: demo_forms +TYPE_REGEXP test: demo_forms +current_field test: demo_forms dup_field edit_field move_field ncurses +data_ahead test: demo_forms +data_behind test: demo_forms +dup_field test: dup_field +dynamic_field_info test: demo_forms +field_arg test: demo_forms +field_back test: demo_forms edit_field +field_buffer test: cardfile demo_forms ncurses +field_count test: demo_forms dup_field move_field +field_fore test: demo_forms +field_index test: demo_forms +field_info test: edit_field ncurses +field_init - +field_just - +field_opts test: demo_forms dup_field move_field ncurses +field_opts_off test: cardfile demo_forms form_driver_w +field_opts_on test: demo_forms +field_pad test: demo_forms +field_status test: demo_forms +field_term - +field_type test: demo_forms +field_userptr test: dup_field edit_field move_field ncurses +form_driver test: cardfile demo_forms dup_field edit_field move_field ncurses +form_driver_w test: form_driver_w +form_fields test: cardfile demo_forms dup_field move_field +form_init - +form_opts - +form_opts_off - +form_opts_on - +form_page test: demo_forms +form_request_by_name - +form_request_name test: dup_field edit_field move_field +form_sub test: cardfile demo_forms dup_field move_field ncurses +form_term - +form_userptr - +form_win test: cardfile demo_forms dup_field edit_field form_driver_w move_field ncurses +free_field test: cardfile demo_forms dup_field form_driver_w move_field ncurses +free_fieldtype test: ncurses +free_form test: cardfile demo_forms dup_field form_driver_w move_field ncurses +link_field - +link_fieldtype - +move_field test: move_field +new_field test: cardfile demo_forms dup_field form_driver_w move_field ncurses +new_fieldtype test: ncurses +new_form test: cardfile demo_forms dup_field form_driver_w move_field ncurses +new_form_sp - +new_page test: demo_forms +pos_form_cursor - +post_form test: cardfile demo_forms dup_field form_driver_w move_field ncurses +scale_form test: demo_forms ncurses +set_current_field test: demo_forms +set_field_back test: cardfile demo_forms dup_field edit_field form_driver_w move_field ncurses +set_field_buffer test: cardfile demo_forms dup_field edit_field move_field ncurses +set_field_fore test: demo_forms +set_field_init - +set_field_just test: cardfile demo_forms +set_field_opts test: demo_forms dup_field move_field ncurses +set_field_pad test: demo_forms +set_field_status test: demo_forms +set_field_term - +set_field_type test: demo_forms dup_field move_field ncurses +set_field_userptr test: edit_field ncurses +set_fieldtype_arg - +set_fieldtype_choice - +set_form_fields test: dup_field move_field +set_form_init - +set_form_opts - +set_form_page - +set_form_sub test: cardfile demo_forms ncurses +set_form_term - +set_form_userptr - +set_form_win test: cardfile demo_forms ncurses +set_max_field test: demo_forms +set_new_page test: demo_forms +unfocus_current_field - +unpost_form test: cardfile demo_forms dup_field form_driver_w move_field ncurses + +libmenu: +------- +current_item test: demo_menus ncurses +free_item test: demo_menus ncurses +free_menu test: demo_menus ncurses +item_count test: demo_menus +item_description - +item_index test: demo_menus ncurses +item_init - +item_name test: demo_menus ncurses +item_opts - +item_opts_off - +item_opts_on - +item_term - +item_userptr test: demo_menus +item_value test: demo_menus ncurses +item_visible - +menu_back - +menu_driver test: demo_menus ncurses +menu_fore - +menu_format - +menu_grey - +menu_init - +menu_items test: demo_menus ncurses +menu_mark test: demo_menus +menu_opts - +menu_opts_off test: demo_menus ncurses +menu_opts_on test: demo_menus +menu_pad - +menu_pattern test: demo_menus +menu_request_by_name - +menu_request_name - +menu_spacing test: demo_menus +menu_sub test: demo_menus +menu_term - +menu_userptr - +menu_win test: demo_menus ncurses +new_item test: demo_menus ncurses +new_menu test: demo_menus ncurses +new_menu_sp - +pos_menu_cursor lib: menu +post_menu test: demo_menus ncurses +scale_menu test: demo_menus ncurses +set_current_item - +set_item_init test: demo_menus +set_item_opts - +set_item_term test: demo_menus +set_item_userptr test: demo_menus +set_item_value test: demo_menus ncurses +set_menu_back test: demo_menus +set_menu_fore test: demo_menus +set_menu_format test: demo_menus ncurses +set_menu_grey - +set_menu_init test: demo_menus +set_menu_items - +set_menu_mark test: demo_menus +set_menu_opts - +set_menu_pad - +set_menu_pattern - +set_menu_spacing - +set_menu_sub test: demo_menus ncurses +set_menu_term test: demo_menus +set_menu_userptr - +set_menu_win test: demo_menus ncurses +set_top_row - +top_row - +unpost_menu test: demo_menus ncurses + +libncurses: +---------- +BC test: demo_termcap +COLORS test: color_content demo_new_pair dots_curses dots_xcurses echochar ncurses pair_content picsmap savescreen xmas +COLOR_PAIR test: background blue bs cardfile clip_printw demo_forms demo_menus demo_panels dots_curses dup_field echochar filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas +COLOR_PAIRS test: demo_new_pair dots_curses dots_xcurses echochar ncurses newdemo pair_content +COLS test: cardfile combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs ditto dots_curses dots_xcurses echochar filter firework foldkeys hashtest inch_wide inchs ins_wide inserts lrtest movewindow ncurses newdemo padview picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view worm +ESCDELAY test: test_opaque +LINES test: cardfile combine demo_defkey demo_keyok demo_menus demo_panels demo_tabs ditto dots_curses dots_xcurses echochar firework hanoi hashtest inch_wide inchs ins_wide inserts lrtest move_field movewindow ncurses newdemo padview picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view worm xmas +PAIR_NUMBER test: dump_window ncurses +PC test: demo_termcap +SP lib: form +TABSIZE test: test_opaque +UP test: demo_termcap +acs_map test: back_ground background gdc ins_wide inserts knight movewindow ncurses newdemo savescreen test_add_wchstr test_addchstr test_addstr test_addwstr testcurs +add_wch test: combine demo_new_pair demo_panels ncurses picsmap savescreen test_add_wchstr test_addwstr +add_wchnstr test: test_add_wchstr +add_wchstr test: test_add_wchstr view +addch test: back_ground background blue bs color_content demo_tabs dots_curses echochar hashtest ncurses padview pair_content picsmap savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_opaque testaddch view worm +addchnstr test: test_addchstr +addchstr test: test_addchstr +addnstr test: test_addstr +addnwstr test: dots_xcurses ncurses test_addwstr +addstr test: blue bs cardfile filter gdc hanoi lrtest ncurses test_addstr +addwstr test: blue combine test_addwstr +alloc_pair test: demo_new_pair dots_xcurses +alloc_pair_sp - +assume_default_colors test: back_ground background ncurses +assume_default_colors_sp - +attr_get - +attr_off test: combine dots_xcurses ncurses +attr_on test: combine dots_xcurses ncurses +attr_set test: ncurses +attroff test: blue dots_curses echochar filter gdc ncurses tclock +attron test: blue bs dots_curses echochar filter gdc ncurses +attrset test: bs filter firework gdc hanoi insdelln ncurses picsmap rain tclock testaddch testcurs +baudrate test: ncurses +baudrate_sp test: sp_tinfo +beep test: blue bs cardfile chgat clip_printw demo_forms demo_menus demo_new_pair demo_panels dup_field edit_field firstlast hanoi inch_wide inchs ins_wide insdelln inserts knight move_field movewindow ncurses padview popup_msg rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view xmas +beep_sp lib: ncurses +bkgd test: background cardfile demo_forms dup_field move_field ncurses padview savescreen tclock view +bkgdset test: background ncurses testaddch +bkgrnd test: ncurses +bkgrndset test: back_ground ncurses +boolcodes test: demo_termcap test_arrays progs: dump_entry +boolfnames test: demo_terminfo test_arrays progs: dump_entry +boolnames test: demo_terminfo test_arrays progs: dump_entry infocmp +border - +border_set - +box test: cardfile chgat clip_printw demo_forms demo_menus demo_panels ditto inch_wide inchs ins_wide insdelln inserts lrtest ncurses newdemo popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs +box_set test: ncurses +can_change_color test: color_content extended_color ncurses +can_change_color_sp test: extended_color +cbreak test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dup_field extended_color filter firework foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs view worm xmas +cbreak_sp test: sp_tinfo +chgat test: chgat +clear test: blue bs filter gdc ncurses padview testcurs xmas +clearok test: bs knight +clrtobot test: demo_menus move_field ncurses view +clrtoeol test: blue bs demo_altkeys filter foldkeys form_driver_w hanoi hashtest movewindow ncurses padview test_mouse view +color_content test: color_content ncurses picsmap +color_content_sp - +color_set test: color_set dots_xcurses extended_color ncurses +copywin test: ncurses testcurs +cur_term test: demo_termcap demo_terminfo dots dots_mvcur filter list_keys lrtest sp_tinfo test_sgr test_tparm test_vid_puts test_vidputs progs: clear_cmd reset_cmd tabs tput tset +curs_set test: demo_new_pair echochar firework gdc hanoi lrtest ncurses newdemo picsmap rain savescreen tclock testcurs worm xmas +curs_set_sp test: sp_tinfo +curscr test: demo_panels knight lrtest ncurses popup_msg savescreen tclock +curses_trace test: demo_menus hashtest lrtest ncurses padview redraw test_sgr test_termattrs test_vid_puts test_vidputs testcurs view worm progs: infocmp tic toe +curses_version test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs demo_termcap demo_terminfo ditto dots dots_curses dots_mvcur dots_termcap dots_xcurses dup_field echochar extended_color filter firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight list_keys lrtest move_field movewindow ncurses newdemo padview pair_content picsmap railroad rain redraw savescreen sp_tinfo tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_arrays test_delwin test_endwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_setupterm test_sgr test_termattrs test_tparm test_unget_wch test_vid_puts test_vidputs testaddch testcurs testscanw view worm xmas progs: clear infocmp tabs tic toe tput tset +def_prog_mode test: bs ncurses +def_prog_mode_sp test: sp_tinfo +def_shell_mode - +def_shell_mode_sp test: sp_tinfo +define_key test: demo_altkeys demo_defkey foldkeys +define_key_sp test: sp_tinfo +del_curterm test: demo_terminfo sp_tinfo test_sgr test_tparm +del_curterm_sp lib: ncurses +delay_output test: newdemo +delay_output_sp test: sp_tinfo +delch - +deleteln test: insdelln +delscreen test: ditto dots_mvcur test_delwin +delwin test: cardfile chgat clip_printw demo_forms demo_panels dup_field inch_wide inchs ins_wide insdelln inserts move_field ncurses newdemo padview popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view +derwin test: cardfile chgat clip_printw demo_forms demo_menus ditto inch_wide inchs ins_wide insdelln inserts movewindow ncurses test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque +doupdate test: cardfile demo_menus demo_panels ditto ins_wide inserts knight movewindow ncurses padview popup_msg redraw savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr +doupdate_sp lib: ncurses +dupwin test: popup_msg +echo test: bs hanoi ncurses test_get_wstr test_getstr testcurs testscanw +echo_sp lib: ncurses +echo_wchar test: ncurses +echochar test: echochar ncurses +endwin test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dots_curses dots_mvcur dots_xcurses dup_field echochar extended_color filter firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_endwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testaddch testcurs testscanw view worm xmas +endwin_sp lib: ncurses +erase test: cardfile demo_menus filter firework firstlast hanoi lrtest ncurses picsmap tclock test_opaque testcurs +erasechar test: ncurses +erasechar_sp test: sp_tinfo +erasewchar test: ncurses +erasewchar_sp lib: ncurses +exit_curses test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dots_curses dots_xcurses dup_field echochar extended_color filter firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_endwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_setupterm test_termattrs test_unget_wch testaddch testcurs testscanw view worm xmas +exit_terminfo test: demo_termcap demo_terminfo dots dots_mvcur dots_termcap list_keys railroad sp_tinfo test_arrays test_sgr test_tparm test_vid_puts test_vidputs +extended_color_content test: color_content extended_color +extended_color_content_sp test: extended_color +extended_pair_content test: extended_color pair_content +extended_pair_content_sp test: extended_color +extended_slk_color test: extended_color +extended_slk_color_sp test: extended_color +filter test: filter +filter_sp - +find_pair test: demo_new_pair +find_pair_sp - +flash test: cardfile filter lrtest movewindow ncurses tclock testcurs +flash_sp - +flushinp test: ncurses newdemo testcurs +flushinp_sp test: sp_tinfo +free_pair test: demo_new_pair +free_pair_sp - +get_escdelay - +get_escdelay_sp - +get_wch test: form_driver_w test_unget_wch +get_wstr test: test_get_wstr +getattrs - +getbegx test: chgat clip_printw demo_menus demo_panels dump_window insdelln move_field movewindow ncurses newdemo redraw testcurs +getbegy test: chgat clip_printw demo_menus demo_panels dump_window insdelln move_field movewindow ncurses newdemo redraw testcurs +getbkgd test: ncurses +getbkgrnd test: ncurses +getcchar test: demo_new_pair ncurses savescreen view +getch test: back_ground background blue bs chgat color_content color_set combine demo_altkeys demo_new_pair demo_tabs extended_color filter firework firstlast foldkeys hanoi hashtest insdelln lrtest padview pair_content picsmap savescreen tclock test_endwin test_mouse test_opaque test_unget_wch testaddch testcurs view xmas +getcurx test: bs chgat clip_printw combine demo_altkeys demo_defkey demo_panels dump_window extended_color filter firstlast foldkeys insdelln move_field movewindow ncurses redraw savescreen test_get_wstr test_getstr test_opaque testcurs view +getcury test: bs chgat clip_printw demo_altkeys demo_defkey demo_panels dump_window extended_color filter firstlast foldkeys insdelln move_field movewindow ncurses popup_msg redraw savescreen test_mouse test_opaque testcurs view +getmaxx test: chgat clip_printw demo_panels dump_window firstlast inch_wide inchs insdelln movewindow ncurses newdemo popup_msg redraw test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs +getmaxy test: chgat clip_printw demo_forms demo_panels dump_window firstlast inch_wide inchs insdelln movewindow ncurses newdemo popup_msg redraw test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque testcurs +getmouse test: bs demo_menus knight movewindow ncurses test_mouse testcurs +getmouse_sp - +getn_wstr test: test_get_wstr +getnstr test: filter ncurses test_getstr +getparx test: movewindow +getpary test: movewindow +getstr test: test_getstr +getwin test: ncurses +getwin_sp - +halfdelay test: padview view +halfdelay_sp test: sp_tinfo +has_colors test: back_ground background bs cardfile chgat clip_printw color_content color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar extended_color filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testcurs view worm xmas +has_colors_sp lib: ncurses +has_ic test: lrtest ncurses +has_ic_sp test: sp_tinfo +has_il test: ncurses +has_il_sp test: sp_tinfo +has_key - +has_key_sp test: sp_tinfo +has_mouse - +has_mouse_sp - +hline test: gdc ncurses +hline_set - +idcok test: test_opaque +idlok test: ncurses padview test_opaque testscanw view +immedok test: test_opaque +in_wch test: inch_wide +in_wchnstr test: inch_wide +in_wchstr test: inch_wide +inch test: inchs +inchnstr test: inchs +inchstr test: inchs +init_color test: color_content ncurses +init_color_sp - +init_extended_color test: color_content extended_color +init_extended_color_sp test: extended_color +init_extended_pair test: extended_color ncurses pair_content picsmap +init_extended_pair_sp test: extended_color +init_pair test: back_ground background blue bs cardfile chgat clip_printw color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas +init_pair_sp lib: ncurses +initscr test: back_ground background blue bs cardfile chgat clip_printw color_content color_set combine demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs dots_curses dots_xcurses dup_field echochar filter firework firstlast form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_endwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testaddch testcurs testscanw view worm xmas +innstr test: test_instr +innwstr test: test_inwstr +ins_nwstr test: ins_wide +ins_wch test: ins_wide +ins_wstr test: ins_wide +insch test: ins_wide inserts +insdelln test: insdelln +insertln test: insdelln +insnstr test: inserts +insstr test: inserts +instr test: test_instr +intrflush test: demo_forms dup_field move_field movewindow +intrflush_sp test: sp_tinfo +inwstr test: test_inwstr +is_cbreak - +is_cbreak_sp - +is_cleared test: test_opaque +is_echo - +is_echo_sp - +is_idcok test: test_opaque +is_idlok test: test_opaque +is_immedok test: test_opaque +is_keypad test: ncurses test_opaque +is_leaveok test: test_opaque +is_linetouched lib: form +is_nl - +is_nl_sp - +is_nodelay test: test_opaque +is_notimeout test: test_opaque +is_pad test: test_opaque +is_raw - +is_raw_sp - +is_scrollok test: ncurses test_opaque +is_subwin test: test_opaque +is_syncok test: test_opaque +is_term_resized - +is_term_resized_sp - +is_wintouched lib: ncurses +isendwin - +isendwin_sp - +key_defined test: demo_defkey foldkeys +key_defined_sp test: sp_tinfo +key_name test: key_names ncurses test_unget_wch +keybound test: demo_altkeys demo_defkey +keybound_sp test: sp_tinfo +keyname test: combine demo_altkeys demo_defkey demo_keyok demo_menus dup_field edit_field foldkeys keynames move_field movewindow ncurses padview redraw test_getstr test_unget_wch testcurs view progs: tic +keyname_sp test: sp_tinfo +keyok test: demo_keyok foldkeys +keyok_sp test: sp_tinfo +keypad test: bs cardfile chgat clip_printw combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels ditto dup_field filter firework foldkeys form_driver_w hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses padview popup_msg redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs testscanw view +killchar test: ncurses +killchar_sp test: sp_tinfo +killwchar test: ncurses +killwchar_sp lib: ncurses +leaveok test: hanoi test_opaque +longname test: ncurses testcurs progs: tput +longname_sp test: sp_tinfo +mcprint - +mcprint_sp - +meta test: key_names keynames ncurses +mouse_trafo lib: form +mouseinterval test: test_mouse +mouseinterval_sp - +mousemask test: bs demo_forms demo_menus knight movewindow ncurses test_mouse testcurs +mousemask_sp - +move test: blue bs cardfile chgat combine demo_altkeys demo_menus demo_new_pair demo_tabs dots_curses dots_xcurses echochar filter foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts knight lrtest move_field movewindow ncurses picsmap savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque testscanw view xmas +mvadd_wch test: ncurses test_add_wchstr test_addwstr +mvadd_wchnstr test: test_add_wchstr +mvadd_wchstr test: test_add_wchstr +mvaddch test: bs gdc hanoi lrtest ncurses rain tclock test_add_wchstr test_addchstr test_addstr test_addwstr xmas +mvaddchnstr test: gdc test_addchstr +mvaddchstr test: test_addchstr +mvaddnstr test: test_addstr +mvaddnwstr test: test_addwstr +mvaddstr test: bs demo_forms gdc hanoi knight ncurses rain tclock test_addstr testcurs xmas +mvaddwstr test: test_addwstr +mvchgat test: chgat +mvcur test: dots_mvcur redraw +mvcur_sp - +mvdelch - +mvderwin test: movewindow +mvget_wch - +mvget_wstr test: test_get_wstr +mvgetch - +mvgetn_wstr test: test_get_wstr +mvgetnstr test: test_getstr +mvgetstr test: test_getstr +mvhline test: ncurses +mvhline_set test: ncurses +mvin_wch test: inch_wide +mvin_wchnstr test: inch_wide +mvin_wchstr test: inch_wide +mvinch test: inchs +mvinchnstr test: gdc inchs +mvinchstr test: inchs +mvinnstr test: test_instr +mvinnwstr test: test_inwstr +mvins_nwstr test: ins_wide +mvins_wch test: ins_wide +mvins_wstr test: ins_wide +mvinsch test: ins_wide inserts +mvinsnstr test: inserts +mvinsstr test: inserts +mvinstr test: test_instr +mvinwstr test: test_inwstr +mvprintw test: back_ground background bs firework form_driver_w hanoi move_field ncurses padview savescreen tclock view +mvscanw - +mvvline test: ncurses +mvvline_set test: ncurses +mvwadd_wch test: test_add_wchstr test_addwstr +mvwadd_wchnstr test: test_add_wchstr +mvwadd_wchstr test: inch_wide test_add_wchstr +mvwaddch test: movewindow ncurses newdemo test_add_wchstr test_addchstr test_addstr test_addwstr testcurs xmas +mvwaddchnstr test: test_addchstr +mvwaddchstr test: inchs test_addchstr +mvwaddnstr test: newdemo test_addstr testcurs +mvwaddnwstr test: test_addwstr +mvwaddstr test: ditto firstlast ins_wide inserts knight ncurses newdemo test_addstr test_addwstr test_instr testcurs xmas +mvwaddwstr test: test_addwstr test_inwstr +mvwchgat test: chgat +mvwdelch test: ncurses +mvwget_wch - +mvwget_wstr test: test_get_wstr +mvwgetch test: inch_wide inchs test_get_wstr test_getstr test_instr test_inwstr test_opaque +mvwgetn_wstr test: test_get_wstr +mvwgetnstr test: test_getstr +mvwgetstr test: test_getstr +mvwhline test: movewindow ncurses +mvwhline_set - +mvwin test: cardfile demo_menus movewindow ncurses testcurs xmas +mvwin_wch test: inch_wide +mvwin_wchnstr test: inch_wide +mvwin_wchstr test: inch_wide +mvwinch test: dump_window inchs newdemo testcurs +mvwinchnstr test: inchs +mvwinchstr test: inchs +mvwinnstr test: test_instr testcurs +mvwinnwstr test: test_inwstr +mvwins_nwstr test: ins_wide +mvwins_wch test: ins_wide +mvwins_wstr test: ins_wide +mvwinsch test: ins_wide inserts +mvwinsnstr test: inserts +mvwinsstr test: inserts testcurs +mvwinstr test: test_instr +mvwinwstr test: test_inwstr +mvwprintw test: demo_menus demo_panels inch_wide inchs ncurses test_delwin test_instr test_inwstr testcurs +mvwscanw test: testcurs +mvwvline test: ins_wide inserts movewindow ncurses test_add_wchstr test_addchstr test_addstr test_addwstr +mvwvline_set - +napms test: demo_panels ditto dots dots_curses dots_mvcur dots_termcap dots_xcurses echochar extended_color firework firstlast gdc hanoi lrtest ncurses padview picsmap railroad rain tclock test_opaque testcurs view worm xmas progs: tset +napms_sp test: sp_tinfo +new_prescr test: sp_tinfo +newpad test: ncurses padview popup_msg testcurs +newpad_sp lib: ncurses +newscr lib: ncurses +newterm test: demo_altkeys demo_new_pair ditto dots_mvcur extended_color filter foldkeys gdc key_names keynames redraw test_delwin test_endwin test_mouse test_setupterm test_termattrs +newterm_sp - +newwin test: cardfile chgat clip_printw demo_defkey demo_forms demo_keyok demo_menus demo_panels ditto firstlast inch_wide inchs ins_wide insdelln inserts knight movewindow ncurses newdemo popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque testcurs view xmas +newwin_sp lib: ncurses +nl test: demo_forms dup_field move_field ncurses rain testcurs +nl_sp lib: ncurses +nocbreak test: testcurs +nocbreak_sp test: sp_tinfo +nodelay test: demo_new_pair ditto extended_color firework gdc lrtest ncurses newdemo padview rain tclock test_opaque view worm xmas +noecho test: back_ground background bs cardfile chgat clip_printw color_content color_set combine demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_new_pair demo_panels demo_tabs ditto dup_field extended_color firework firstlast foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts knight lrtest move_field movewindow ncurses padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs view worm xmas +noecho_sp lib: ncurses +nofilter - +nofilter_sp - +nonl test: bs demo_forms dup_field hashtest move_field movewindow ncurses padview test_mouse view worm xmas +nonl_sp lib: ncurses +noqiflush - +noqiflush_sp test: sp_tinfo +noraw test: demo_forms demo_menus dup_field move_field ncurses test_mouse testcurs +noraw_sp test: sp_tinfo +notimeout test: ncurses test_opaque +numcodes test: demo_termcap test_arrays progs: dump_entry +numfnames test: demo_terminfo test_arrays progs: dump_entry +numnames test: demo_terminfo test_arrays progs: dump_entry infocmp +ospeed test: demo_termcap progs: tset +overlay test: ncurses testcurs xmas +overwrite test: ncurses savescreen +pair_content test: back_ground background color_set pair_content +pair_content_sp lib: ncurses +pecho_wchar - +pechochar - +pnoutrefresh test: ncurses padview popup_msg +prefresh test: testcurs +printw test: back_ground background blue bs color_content color_set combine demo_altkeys demo_defkey demo_keyok demo_tabs extended_color filter foldkeys ncurses pair_content savescreen test_delwin test_unget_wch testcurs testscanw view +putp test: filter test_mouse test_sgr progs: tput +putp_sp test: sp_tinfo +putwin test: ncurses +qiflush - +qiflush_sp test: sp_tinfo +raw test: demo_forms dup_field move_field ncurses redraw test_mouse testcurs +raw_sp test: sp_tinfo +redrawwin test: combine padview redraw view +refresh test: blue bs color_content demo_defkey demo_forms demo_keyok demo_menus demo_panels demo_tabs dots_curses dots_mvcur dots_xcurses dup_field echochar filter firstlast form_driver_w gdc hanoi hashtest lrtest move_field movewindow ncurses pair_content picsmap savescreen tclock test_delwin test_endwin test_mouse testcurs view xmas +reset_color_pairs test: picsmap +reset_color_pairs_sp - +reset_prog_mode test: filter ncurses +reset_prog_mode_sp test: sp_tinfo +reset_shell_mode test: bs filter savescreen test_setupterm +reset_shell_mode_sp test: sp_tinfo +resetty - +resetty_sp test: sp_tinfo +resize_term - +resize_term_sp - +resizeterm - +resizeterm_sp lib: ncurses +restartterm test: test_setupterm +restartterm_sp - +ripoffline test: demo_menus ncurses +ripoffline_sp - +savetty - +savetty_sp test: sp_tinfo +scanw test: testcurs testscanw +scr_dump test: combine savescreen +scr_init test: savescreen +scr_init_sp - +scr_restore test: savescreen +scr_restore_sp - +scr_set test: savescreen +scr_set_sp - +scrl test: view +scroll test: testcurs +scrollok test: clip_printw color_content demo_altkeys demo_defkey demo_keyok demo_new_pair demo_panels ditto foldkeys hashtest knight ncurses pair_content picsmap redraw test_delwin test_opaque test_unget_wch testcurs testscanw view +set_curterm test: list_keys sp_tinfo +set_curterm_sp test: sp_tinfo +set_escdelay test: test_opaque +set_escdelay_sp lib: ncurses +set_tabsize test: demo_tabs test_opaque +set_tabsize_sp test: sp_tinfo +set_term lib: ncurses +setcchar test: back_ground combine demo_new_pair demo_panels ins_wide ncurses picsmap savescreen test_add_wchstr test_addwstr +setscrreg test: view +setupterm test: demo_terminfo dots list_keys sp_tinfo test_setupterm test_sgr test_termattrs test_tparm test_vid_puts test_vidputs progs: clear tabs tput tset +slk_attr - +slk_attr_off - +slk_attr_on - +slk_attr_set test: ncurses +slk_attr_set_sp - +slk_attr_sp - +slk_attroff lib: ncurses +slk_attroff_sp - +slk_attron lib: ncurses +slk_attron_sp - +slk_attrset test: extended_color ncurses +slk_attrset_sp - +slk_clear test: ncurses +slk_clear_sp - +slk_color test: ncurses +slk_color_sp - +slk_init test: extended_color ncurses +slk_init_sp - +slk_label test: ncurses +slk_label_sp - +slk_noutrefresh test: extended_color ncurses +slk_noutrefresh_sp - +slk_refresh test: ncurses +slk_refresh_sp lib: ncurses +slk_restore test: ncurses +slk_restore_sp lib: ncurses +slk_set test: extended_color ncurses +slk_set_sp - +slk_touch test: extended_color ncurses +slk_touch_sp lib: ncurses +slk_wset test: ncurses +standend test: blue gdc ncurses +standout test: blue ncurses +start_color test: back_ground background blue bs cardfile chgat clip_printw color_content color_set demo_forms demo_menus demo_new_pair demo_panels dots_curses dots_xcurses dup_field echochar extended_color filter firework gdc hanoi ins_wide insdelln inserts knight move_field ncurses newdemo padview pair_content picsmap rain savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr testaddch testcurs view worm xmas +start_color_sp - +stdscr test: back_ground background bs chgat clip_printw color_content combine demo_altkeys demo_forms demo_menus demo_new_pair demo_panels ditto dup_field edit_field extended_color filter firework foldkeys form_driver_w gdc hanoi hashtest inch_wide inchs ins_wide insdelln inserts key_names keynames knight lrtest move_field movewindow ncurses padview pair_content picsmap rain redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque test_unget_wch testcurs testscanw view worm xmas +strcodes test: demo_termcap test_arrays progs: dump_entry +strfnames test: demo_terminfo list_keys test_arrays progs: dump_entry +strnames test: demo_terminfo foldkeys list_keys test_arrays test_tparm progs: dump_entry infocmp tic +subpad test: testcurs +subwin test: movewindow ncurses newdemo testcurs +syncok test: test_opaque +term_attrs test: ncurses test_termattrs +term_attrs_sp - +termattrs test: ncurses test_termattrs testcurs +termattrs_sp lib: ncurses +termname test: list_keys ncurses testcurs +termname_sp test: sp_tinfo +tgetent test: demo_termcap dots_termcap railroad +tgetent_sp test: sp_tinfo +tgetflag test: demo_termcap +tgetflag_sp test: sp_tinfo +tgetnum test: demo_termcap dots_termcap railroad +tgetnum_sp test: sp_tinfo +tgetstr test: demo_termcap dots_termcap railroad +tgetstr_sp test: sp_tinfo +tgoto test: dots_termcap railroad test_mouse progs: tic +tigetflag test: demo_terminfo savescreen progs: tic tput +tigetflag_sp test: sp_tinfo +tigetnum test: demo_tabs demo_terminfo dots dots_mvcur ncurses savescreen progs: tput +tigetnum_sp test: sp_tinfo +tigetstr test: blue demo_defkey demo_new_pair demo_terminfo foldkeys list_keys savescreen test_mouse test_sgr test_tparm testcurs progs: clear_cmd tic tput +tigetstr_sp test: sp_tinfo +timeout test: filter rain savescreen +tiparm test: test_tparm +tiparm_s test: test_tparm +tiscan_s test: test_tparm +touchline test: chgat clip_printw insdelln +touchwin test: chgat clip_printw demo_menus filter firstlast inch_wide inchs ins_wide insdelln inserts movewindow ncurses popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin test_get_wstr test_getstr test_instr test_inwstr test_opaque xmas +tparm test: dots dots_mvcur test_sgr test_tparm progs: tic tput +tputs test: dots dots_mvcur dots_termcap railroad test_tparm test_vid_puts test_vidputs progs: clear_cmd reset_cmd tabs +tputs_sp test: sp_tinfo +trace - +ttytype test: demo_terminfo test_sgr +typeahead test: testcurs +typeahead_sp test: sp_tinfo +unctrl test: ncurses redraw test_add_wchstr test_addchstr test_mouse testcurs +unctrl_sp test: sp_tinfo +unget_wch test: test_unget_wch +unget_wch_sp - +ungetch test: bs knight test_unget_wch +ungetch_sp lib: ncurses +ungetmouse lib: menu +ungetmouse_sp - +untouchwin lib: form +use_default_colors test: back_ground background dots_curses dots_xcurses filter firework gdc hanoi knight ncurses picsmap rain tclock worm xmas +use_default_colors_sp - +use_env test: dots dots_curses dots_mvcur dots_xcurses ncurses progs: clear tput +use_env_sp test: sp_tinfo +use_extended_names test: demo_termcap demo_terminfo list_keys progs: infocmp tic +use_legacy_coding - +use_legacy_coding_sp - +use_screen test: ditto +use_tioctl test: ncurses progs: clear tput +use_tioctl_sp test: sp_tinfo +use_window test: rain worm +vid_attr test: test_vid_puts +vid_attr_sp - +vid_puts test: test_vid_puts +vid_puts_sp lib: ncurses +vidattr test: test_vidputs +vidattr_sp - +vidputs test: test_vidputs +vidputs_sp - +vline test: gdc ncurses +vline_set - +vw_printw test: clip_printw movewindow test_mouse +vw_scanw - +vwprintw - +vwscanw - +wadd_wch test: inch_wide ncurses test_add_wchstr test_addwstr +wadd_wchnstr test: savescreen test_add_wchstr +wadd_wchstr test: test_add_wchstr +waddch test: demo_forms demo_panels ditto firstlast inch_wide inchs knight ncurses padview popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque view worm +waddchnstr test: test_addchstr +waddchstr test: test_addchstr +waddnstr test: demo_forms test_addstr +waddnwstr test: ncurses test_addwstr +waddstr test: chgat clip_printw demo_forms demo_panels firstlast ins_wide insdelln knight ncurses popup_msg redraw test_add_wchstr test_addstr test_addwstr testcurs +waddwstr test: ins_wide ncurses padview test_add_wchstr test_addwstr test_get_wstr view +wattr_get test: ncurses +wattr_off lib: ncurses +wattr_on lib: ncurses +wattr_set test: ncurses +wattroff test: clip_printw demo_forms ncurses testcurs xmas +wattron test: clip_printw testcurs xmas +wattrset test: clip_printw demo_forms insdelln ncurses newdemo padview test_get_wstr test_getstr testcurs xmas +wbkgd test: cardfile demo_forms demo_menus ncurses newdemo padview testcurs +wbkgdset test: demo_panels ins_wide inserts ncurses test_add_wchstr test_addchstr test_addstr test_addwstr +wbkgrnd lib: ncurses +wbkgrndset lib: ncurses +wborder test: ncurses +wborder_set test: ncurses +wchgat test: chgat test_get_wstr test_getstr view +wclear test: ncurses test_opaque testcurs +wclrtobot test: firstlast inch_wide inchs ncurses test_delwin test_instr test_inwstr testcurs +wclrtoeol test: chgat clip_printw demo_defkey demo_keyok demo_menus demo_panels firstlast inch_wide inchs ins_wide insdelln inserts knight ncurses test_add_wchstr test_addchstr test_addstr test_addwstr test_instr test_inwstr testcurs +wcolor_set lib: ncurses +wcursyncup lib: form +wdelch test: ncurses testcurs +wdeleteln test: insdelln testcurs +wecho_wchar lib: ncurses +wechochar lib: ncurses +wenclose test: ncurses +werase test: cardfile demo_forms demo_menus demo_panels dup_field firstlast knight move_field ncurses newdemo popup_msg test_get_wstr test_getstr test_opaque testcurs view xmas +wget_wch test: ins_wide ncurses test_add_wchstr test_addwstr +wget_wstr test: test_get_wstr +wgetbkgrnd lib: ncurses +wgetch test: cardfile chgat clip_printw demo_defkey demo_keyok demo_menus demo_panels ditto dump_window dup_field edit_field gdc insdelln inserts knight move_field movewindow ncurses newdemo popup_msg rain redraw test_addchstr test_addstr test_delwin test_opaque testcurs worm +wgetdelay test: test_opaque +wgetn_wstr test: ncurses test_get_wstr +wgetnstr test: ncurses test_getstr +wgetparent test: test_opaque +wgetscrreg test: test_opaque +wgetstr test: test_getstr +whline test: testcurs +whline_set lib: ncurses +win_wch test: inch_wide savescreen +win_wchnstr test: inch_wide view +win_wchstr test: inch_wide +winch test: inchs knight testcurs +winchnstr test: inchs +winchstr test: inchs +winnstr test: demo_altkeys demo_defkey foldkeys test_instr +winnwstr test: test_inwstr +wins_nwstr test: ins_wide +wins_wch test: ins_wide +wins_wstr test: ins_wide +winsch test: ins_wide inserts testcurs +winsdelln test: insdelln +winsertln test: insdelln testcurs +winsnstr test: inserts +winsstr test: inserts +winstr test: test_instr +winwstr test: test_inwstr +wmouse_trafo test: ncurses +wmove test: chgat clip_printw demo_altkeys demo_defkey demo_keyok demo_menus demo_panels dump_window extended_color firstlast foldkeys inch_wide inchs ins_wide insdelln inserts knight movewindow ncurses newdemo padview picsmap redraw savescreen test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque testcurs view worm +wnoutrefresh test: demo_menus ditto inch_wide inchs ins_wide inserts knight movewindow ncurses padview popup_msg redraw test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_opaque +wprintw test: chgat clip_printw demo_defkey demo_forms demo_keyok demo_menus demo_panels inch_wide inchs ins_wide insdelln inserts knight ncurses test_add_wchstr test_addchstr test_addstr test_addwstr test_get_wstr test_getstr test_instr test_inwstr test_mouse test_opaque testcurs +wredrawln test: redraw +wrefresh test: chgat clip_printw demo_forms demo_keyok demo_menus demo_panels dup_field firstlast ins_wide insdelln inserts knight lrtest move_field movewindow ncurses newdemo popup_msg redraw savescreen tclock test_add_wchstr test_addchstr test_addstr test_addwstr test_delwin testcurs worm xmas +wresize test: cardfile demo_menus ncurses +wscanw test: testcurs +wscrl test: ncurses testcurs +wsetscrreg test: ncurses test_delwin testcurs +wstandend test: ncurses test_opaque xmas +wstandout test: ncurses test_opaque xmas +wsyncdown test: movewindow +wsyncup lib: form +wtimeout test: ncurses +wtouchln lib: ncurses +wunctrl lib: ncurses +wunctrl_sp - +wvline test: testcurs +wvline_set lib: ncurses + +libpanel: +-------- +bottom_panel test: demo_panels ncurses +ceiling_panel - +del_panel test: demo_panels ncurses +ground_panel - +hide_panel test: demo_panels ncurses +move_panel test: demo_panels ncurses +new_panel test: cardfile demo_panels ncurses +panel_above test: demo_panels +panel_below test: demo_panels +panel_hidden test: demo_panels +panel_userptr test: demo_panels ncurses +panel_window test: cardfile demo_panels ncurses +replace_panel test: demo_panels +set_panel_userptr test: demo_panels ncurses +show_panel test: demo_panels ncurses +top_panel test: cardfile demo_panels ncurses +update_panels test: cardfile demo_panels ncurses +update_panels_sp - + +-- vile:txtmode diff --git a/contrib/ncurses/test/aclocal.m4 b/contrib/ncurses/test/aclocal.m4 new file mode 100644 index 00000000..6b27fdd0 --- /dev/null +++ b/contrib/ncurses/test/aclocal.m4 @@ -0,0 +1,5098 @@ +dnl*************************************************************************** +dnl Copyright 2018-2023,2024 Thomas E. Dickey * +dnl Copyright 2003-2017,2018 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl $Id: aclocal.m4,v 1.228 2024/08/11 09:11:30 tom Exp $ +dnl +dnl Author: Thomas E. Dickey +dnl +dnl Macros used in NCURSES test programs auto-configuration script. +dnl +dnl These macros are maintained separately from NCURSES. The copyright on +dnl this file applies to the aggregation of macros and does not affect use of +dnl these macros in other applications. +dnl +dnl See these pages for additional information: +dnl https://invisible-island.net/autoconf/ +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl +dnl --------------------------------------------------------------------------- +dnl --------------------------------------------------------------------------- +dnl AM_LANGINFO_CODESET version: 7 updated: 2023/01/11 04:05:23 +dnl ------------------- +dnl Inserted as requested by gettext 0.10.40 +dnl File from /usr/share/aclocal +dnl codeset.m4 +dnl ==================== +dnl serial AM1 +dnl +dnl From Bruno Haible. +AC_DEFUN([AM_LANGINFO_CODESET], +[ +AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([ +$ac_includes_default +#include ], + [char* cs = nl_langinfo(CODESET); (void)cs], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test "$am_cv_langinfo_codeset" = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49 +dnl ------------------ +dnl Conditionally generate script according to whether we're using a given autoconf. +dnl +dnl $1 = version to compare against +dnl $2 = code to use if AC_ACVERSION is at least as high as $1. +dnl $3 = code to use if AC_ACVERSION is older than $1. +define([CF_ACVERSION_CHECK], +[ +ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl +ifdef([m4_version_compare], +[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])], +[CF_ACVERSION_COMPARE( +AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])), +AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53 +dnl -------------------- +dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1, +dnl MAJOR2, MINOR2, TERNARY2, +dnl PRINTABLE2, not FOUND, FOUND) +define([CF_ACVERSION_COMPARE], +[ifelse(builtin([eval], [$2 < $5]), 1, +[ifelse([$8], , ,[$8])], +[ifelse([$9], , ,[$9])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_CFLAGS version: 15 updated: 2020/12/31 10:54:15 +dnl ------------- +dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +dnl +dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS, +dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily +dnl confused by the quotes (which require backslashes to keep them usable). +AC_DEFUN([CF_ADD_CFLAGS], +[ +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $1 +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags) + ;; + esac + CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags) + ;; + esac + ;; + (*) + CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags) + ;; + esac + ;; +(yes) + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[[^"]]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)]) + CF_APPEND_TEXT(CFLAGS,$cf_new_cflags) +fi + +if test -n "$cf_new_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)]) + CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags) +fi + +if test -n "$cf_new_extra_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)]) + CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags) +fi + +AC_SUBST(EXTRA_CPPFLAGS) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_INCDIR version: 17 updated: 2021/09/04 06:35:04 +dnl ------------- +dnl Add an include-directory to $CPPFLAGS. Don't add /usr/include, since it is +dnl redundant. We don't normally need to add -I/usr/local/include for gcc, +dnl but old versions (and some misinstalled ones) need that. To make things +dnl worse, gcc 3.x may give error messages if -I/usr/local/include is added to +dnl the include-path). +AC_DEFUN([CF_ADD_INCDIR], +[ +if test -n "$1" ; then + for cf_add_incdir in $1 + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + CF_APPEND_TEXT(CPPFLAGS,-I$cf_add_incdir) + AC_TRY_COMPILE([#include ], + [printf("Hello")], + [], + [cf_have_incdir=yes]) + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + CF_VERBOSE(adding $cf_add_incdir to include-path) + ifelse([$2],,CPPFLAGS,[$2])="$ifelse([$2],,CPPFLAGS,[$2]) -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05 +dnl ---------- +dnl Add a library, used to enforce consistency. +dnl +dnl $1 = library to add, without the "-l" +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBDIR version: 11 updated: 2020/12/31 20:19:42 +dnl ------------- +dnl Adds to the library-path +dnl +dnl Some machines have trouble with multiple -L options. +dnl +dnl $1 is the (list of) directory(s) to add +dnl $2 is the optional name of the variable to update (default LDFLAGS) +dnl +AC_DEFUN([CF_ADD_LIBDIR], +[ +if test -n "$1" ; then + for cf_add_libdir in $1 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + CF_VERBOSE(adding $cf_add_libdir to library-path) + ifelse([$2],,LDFLAGS,[$2])="-L$cf_add_libdir $ifelse([$2],,LDFLAGS,[$2])" + fi + fi + done +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33 +dnl ----------- +dnl Add one or more libraries, used to enforce consistency. Libraries are +dnl prepended to an existing list, since their dependencies are assumed to +dnl already exist in the list. +dnl +dnl $1 = libraries to add, with the "-l", etc. +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIBS],[ +cf_add_libs="[$]ifelse($2,,LIBS,[$2])" +# reverse order +cf_add_0lib= +for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +ifelse($2,,LIBS,[$2])="$cf_add_libs" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIB_AFTER version: 3 updated: 2013/07/09 21:27:22 +dnl ---------------- +dnl Add a given library after another, e.g., following the one it satisfies a +dnl dependency for. +dnl +dnl $1 = the first library +dnl $2 = its dependency +AC_DEFUN([CF_ADD_LIB_AFTER],[ +CF_VERBOSE(...before $LIBS) +LIBS=`echo "$LIBS" | sed -e "s/[[ ]][[ ]]*/ /g" -e "s%$1 %$1 $2 %" -e 's% % %g'` +CF_VERBOSE(...after $LIBS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_SUBDIR_PATH version: 5 updated: 2020/12/31 20:19:42 +dnl ------------------ +dnl Append to a search-list for a nonstandard header/lib-file +dnl $1 = the variable to return as result +dnl $2 = the package name +dnl $3 = the subdirectory, e.g., bin, include or lib +dnl $4 = the directory under which we will test for subdirectories +dnl $5 = a directory that we do not want $4 to match +AC_DEFUN([CF_ADD_SUBDIR_PATH], +[ +test "x$4" != "x$5" && \ +test -d "$4" && \ +ifelse([$5],NONE,,[{ test -z "$5" || test "x$5" = xNONE || test "x$4" != "x$5"; } &&]) { + test -n "$verbose" && echo " ... testing for $3-directories under $4" + test -d "$4/$3" && $1="[$]$1 $4/$3" + test -d "$4/$3/$2" && $1="[$]$1 $4/$3/$2" + test -d "$4/$3/$2/$3" && $1="[$]$1 $4/$3/$2/$3" + test -d "$4/$2/$3" && $1="[$]$1 $4/$2/$3" + test -d "$4/$2/$3/$2" && $1="[$]$1 $4/$2/$3/$2" +} +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_CFLAGS version: 3 updated: 2021/09/05 17:25:40 +dnl ---------------- +dnl Use CF_ADD_CFLAGS after first checking for potential redefinitions. +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +define([CF_APPEND_CFLAGS], +[ +for cf_add_cflags in $1 +do + case "x$cf_add_cflags" in + (x-[[DU]]*) + CF_REMOVE_CFLAGS($cf_add_cflags,CFLAGS,[$2]) + CF_REMOVE_CFLAGS($cf_add_cflags,CPPFLAGS,[$2]) + ;; + esac + CF_ADD_CFLAGS([$cf_add_cflags],[$2]) +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55 +dnl -------------- +dnl use this macro for appending text without introducing an extra blank at +dnl the beginning +define([CF_APPEND_TEXT], +[ + test -n "[$]$1" && $1="[$]$1 " + $1="[$]{$1}$2" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31 +dnl -------------- +dnl Allow user to disable a normally-on option. +AC_DEFUN([CF_ARG_DISABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31 +dnl ------------- +dnl Allow user to enable a normally-off option. +AC_DEFUN([CF_ARG_ENABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14 +dnl ------------- +dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus +dnl values. +dnl +dnl Parameters: +dnl $1 = option name +dnl $2 = help-string +dnl $3 = action to perform if option is not default +dnl $4 = action if perform if option is default +dnl $5 = default option value (either 'yes' or 'no') +AC_DEFUN([CF_ARG_OPTION], +[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes) + if test "$enableval" != "$5" ; then +ifelse([$3],,[ :]dnl +,[ $3]) ifelse([$4],,,[ + else + $4]) + fi],[enableval=$5 ifelse([$4],,,[ + $4 +])dnl +])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_C11_NORETURN version: 4 updated: 2023/02/18 17:41:25 +dnl --------------- +AC_DEFUN([CF_C11_NORETURN], +[ +AC_MSG_CHECKING(if you want to use C11 _Noreturn feature) +CF_ARG_ENABLE(stdnoreturn, + [ --enable-stdnoreturn enable C11 _Noreturn feature for diagnostics], + [enable_stdnoreturn=yes], + [enable_stdnoreturn=no]) +AC_MSG_RESULT($enable_stdnoreturn) + +if test $enable_stdnoreturn = yes; then +AC_CACHE_CHECK([for C11 _Noreturn feature], cf_cv_c11_noreturn, + [AC_TRY_COMPILE([ +$ac_includes_default +#include +static _Noreturn void giveup(void) { exit(0); } + ], + [if (feof(stdin)) giveup()], + cf_cv_c11_noreturn=yes, + cf_cv_c11_noreturn=no) + ]) +else + cf_cv_c11_noreturn=no, +fi + +if test "$cf_cv_c11_noreturn" = yes; then + AC_DEFINE(HAVE_STDNORETURN_H, 1,[Define if header is available and working]) + AC_DEFINE_UNQUOTED(STDC_NORETURN,_Noreturn,[Define if C11 _Noreturn keyword is supported]) + HAVE_STDNORETURN_H=1 +else + HAVE_STDNORETURN_H=0 +fi + +AC_SUBST(HAVE_STDNORETURN_H) +AC_SUBST(STDC_NORETURN) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CC_ENV_FLAGS version: 11 updated: 2023/02/20 11:15:46 +dnl --------------- +dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content +dnl into CC. This will not help with broken scripts that wrap the compiler +dnl with options, but eliminates a more common category of user confusion. +dnl +dnl In particular, it addresses the problem of being able to run the C +dnl preprocessor in a consistent manner. +dnl +dnl Caveat: this also disallows blanks in the pathname for the compiler, but +dnl the nuisance of having inconsistent settings for compiler and preprocessor +dnl outweighs that limitation. +AC_DEFUN([CF_CC_ENV_FLAGS], +[ +# This should have been defined by AC_PROG_CC +: "${CC:=cc}" + +AC_MSG_CHECKING(\$CFLAGS variable) +case "x$CFLAGS" in +(*-[[IUD]]*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options) + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + CF_ADD_CFLAGS($cf_arg) + done + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac + +AC_MSG_CHECKING(\$CC variable) +case "$CC" in +(*[[\ \ ]]-*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options) + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'` + cf_flags=`echo "$CC" | sed -e "s%^$cf_prog%%"` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[[IUDfgOW]]*) + CF_ADD_CFLAGS($cf_arg) + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + CF_VERBOSE(resulting CC: '$CC') + CF_VERBOSE(resulting CFLAGS: '$CFLAGS') + CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS') + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CACHE version: 13 updated: 2020/12/31 10:54:15 +dnl -------------- +dnl Check if we're accidentally using a cache from a different machine. +dnl Derive the system name, as a check for reusing the autoconf cache. +dnl +dnl If we've packaged config.guess and config.sub, run that (since it does a +dnl better job than uname). Normally we'll use AC_CANONICAL_HOST, but allow +dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM +dnl which is useful in cross-compiles. +dnl +dnl Note: we would use $ac_config_sub, but that is one of the places where +dnl autoconf 2.5x broke compatibility with autoconf 2.13 +AC_DEFUN([CF_CHECK_CACHE], +[ +if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then + ifelse([$1],,[AC_CANONICAL_HOST],[$1]) + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.]) +AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"]) + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name) + +if test ".$system_name" != ".$cf_cv_system_name" ; then + AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)) + AC_MSG_ERROR("Please remove config.cache and try again.") +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CFLAGS version: 4 updated: 2021/01/02 19:22:58 +dnl --------------- +dnl Conditionally add to $CFLAGS and $CPPFLAGS values which are derived from +dnl a build-configuration such as imake. These have the pitfall that they +dnl often contain compiler-specific options which we cannot use, mixed with +dnl preprocessor options that we usually can. +AC_DEFUN([CF_CHECK_CFLAGS], +[ +CF_VERBOSE(checking additions to CFLAGS) +cf_check_cflags="$CFLAGS" +cf_check_cppflags="$CPPFLAGS" +CF_ADD_CFLAGS($1,yes) +if test "x$cf_check_cflags" != "x$CFLAGS" ; then +AC_TRY_LINK([#include ],[printf("Hello world");],, + [CF_VERBOSE(test-compile failed. Undoing change to \$CFLAGS) + if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then + CF_VERBOSE(but keeping change to \$CPPFLAGS) + fi + CFLAGS="$cf_check_cflags"]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CURSES_LIB version: 4 updated: 2021/09/05 17:25:40 +dnl ------------------- +dnl $1 = nominal library name, used also for header lookup +dnl $2 = suffix to append to library name +dnl $3 = function to check for using AC_CHECK_LIB +dnl $4 = optional parameter list for $3 +AC_DEFUN([CF_CHECK_CURSES_LIB], +[ +AC_REQUIRE([CF_PKG_CONFIG]) + +cf_have_curses_lib=no + +: ${NCURSES_CONFIG_PKG:=none} +if test "x${NCURSES_CONFIG_PKG}" = xnone; then + : +elif test "x${PKG_CONFIG:=none}" != xnone; then + AC_MSG_CHECKING(pkg-config for $1$2) + if "$PKG_CONFIG" --exists "$1$2" ; then + AC_MSG_RESULT(yes) + + AC_MSG_CHECKING(if the $1$2 package files work) + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + CF_APPEND_CFLAGS(`$PKG_CONFIG --cflags "$1$2"`) + CF_ADD_LIBS(`$PKG_CONFIG --libs "$1$2"`) + + AC_TRY_LINK([#include <$1.h>], + [(void) $3 ( ]ifelse([$4],,,[[$4]])[ );], + [AC_TRY_RUN([#include <$1.h> + int main(void) + { (void) $3 ( ]ifelse([$4],,,[[$4]])[ ); return 0; }], + [cf_have_curses_lib=yes], + [cf_have_curses_lib=no], + [cf_have_curses_lib=maybe])], + [cf_have_curses_lib=no]) + AC_MSG_RESULT($cf_have_curses_lib) + test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes + if test "$cf_have_curses_lib" = "yes" + then + CF_UPPER(cf_upper,have_lib$1) + AC_DEFINE_UNQUOTED($cf_upper,1) + else + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + fi + fi +fi +if test "$cf_have_curses_lib" = no; then + AC_CHECK_LIB($1$2,$3,[ + CF_UPPER(cf_upper,have_lib$1) + CF_ADD_LIBS(-l$1$2) + AC_DEFINE_UNQUOTED($cf_upper,1)]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CLANG_COMPILER version: 9 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Check if the given compiler is really clang. clang's C driver defines +dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does +dnl not ignore some gcc options. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = CLANG_COMPILER (default) +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_CLANG_COMPILER],[ +ifelse([$2],,CLANG_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + AC_TRY_COMPILE([],[ +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif +],[ifelse([$2],,CLANG_COMPILER,[$2])=yes +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2])) +fi + +CLANG_VERSION=none + +if test "x$ifelse([$2],,CLANG_COMPILER,[$2])" = "xyes" ; then + case "$CC" in + (c[[1-9]][[0-9]]|*/c[[1-9]][[0-9]]) + AC_MSG_WARN(replacing broken compiler alias $CC) + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + AC_MSG_CHECKING(version of $CC) + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + AC_MSG_RESULT($CLANG_VERSION) + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + AC_MSG_CHECKING(if option $cf_clang_opt works) + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + AC_TRY_LINK([ + #include ],[ + printf("hello!\\n");],[ + cf_clang_optok=yes],[ + cf_clang_optok=no]) + AC_MSG_RESULT($cf_clang_optok) + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + CF_VERBOSE(adding option $cf_clang_opt) + CF_APPEND_TEXT(CFLAGS,$cf_clang_opt) + fi + done +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_CONST_X_STRING version: 8 updated: 2023/12/01 17:22:50 +dnl ----------------- +dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most +dnl character-strings. +dnl +dnl It is ambiguous because the specification accommodated the pre-ANSI +dnl compilers bundled by more than one vendor in lieu of providing a standard C +dnl compiler other than by costly add-ons. Because of this, the specification +dnl did not take into account the use of const for telling the compiler that +dnl string literals would be in readonly memory. +dnl +dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to +dnl let the compiler decide how to represent Xt's strings which were #define'd. +dnl That does not solve the problem of using the block of Xt's strings which +dnl are compiled into the library (and is less efficient than one might want). +dnl +dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both +dnl when compiling the library and compiling using the library, to tell the +dnl compiler that String is const. +AC_DEFUN([CF_CONST_X_STRING], +[ +AC_REQUIRE([AC_PATH_XTRA]) + +CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING]) + +AC_TRY_COMPILE( +[ +#include +#include +], +[String foo = malloc(1); free((void*)foo)],[ + +AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[ + AC_TRY_COMPILE( + [ +#undef _CONST_X_STRING +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + ],[String foo = malloc(1); *foo = 0],[ + cf_cv_const_x_string=no + ],[ + cf_cv_const_x_string=yes + ]) +]) + +CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING]) + +case "$cf_cv_const_x_string" in +(no) + CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES) + ;; +(*) + CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING) + ;; +esac + +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_ACS_MAP version: 8 updated: 2021/01/04 19:45:09 +dnl ----------------- +dnl Check for likely values of acs_map[]: +AC_DEFUN([CF_CURSES_ACS_MAP], +[ +AC_REQUIRE([CF_NCURSES_WRAP_PREFIX])dnl +AC_CACHE_CHECK(for alternate character set array, cf_cv_curses_acs_map,[ +cf_cv_curses_acs_map=unknown +for name in acs_map _acs_map __acs_map ${NCURSES_WRAP_PREFIX}acs_map +do +AC_TRY_LINK([ +#include <${cf_cv_ncurses_header:-curses.h}> +],[ +${name}['k'] = ACS_PLUS +],[cf_cv_curses_acs_map=$name; break]) +done +]) + +test "$cf_cv_curses_acs_map" != unknown && AC_DEFINE_UNQUOTED(CURSES_ACS_ARRAY,$cf_cv_curses_acs_map,[Define as needed to override ncurses prefix _nc_]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_CHECK_DATA version: 10 updated: 2021/01/04 19:45:09 +dnl -------------------- +dnl Check if curses.h defines the given data/variable. +dnl Use this after CF_NCURSES_CONFIG or CF_CURSES_CONFIG. +dnl +dnl $1 = data item(s) to check for +dnl $2 = action on success, e.g., "break" to quit checking a series of choices +AC_DEFUN([CF_CURSES_CHECK_DATA], +[ +for cf_data in $1 +do +AC_MSG_CHECKING(for data $cf_data declaration in ${cf_cv_ncurses_header:-curses.h}) + +AC_TRY_COMPILE(CF__CURSES_HEAD, +CF__CURSES_DATA(foo,$cf_data) +,[cf_result=yes +],[cf_result=no]) +AC_MSG_RESULT($cf_result) + +if test "$cf_result" = yes ; then + CF_UPPER(cf_result,have_curses_data_$cf_data) + AC_DEFINE_UNQUOTED($cf_result) + ifelse($2,,,[$2]) +else + AC_MSG_CHECKING(for data $cf_data in library) + # BSD linkers insist on making weak linkage, but resolve at runtime. + AC_TRY_RUN(CF__CURSES_HEAD +[ +extern char $cf_data; +int main(void) +{ + ]CF__CURSES_DATA(foo,$cf_data)[ + ${cf_cv_main_return:-return}(foo == 0); +}],[cf_result=yes +],[cf_result=no],[ + # cross-compiling + AC_TRY_LINK(CF__CURSES_HEAD +[extern char $cf_data;],[ + do { + ]CF__CURSES_DATA(foo,$cf_data)[ + ${cf_cv_main_return:-return}(foo == 0); + } while (0) +],[cf_result=yes],[cf_result=no]) +]) + AC_MSG_RESULT($cf_result) + if test "$cf_result" = yes ; then + CF_UPPER(cf_result,decl_curses_data_$cf_data) + AC_DEFINE_UNQUOTED($cf_result) + # do not exit loop here, since we prefer system's declarations + fi +fi +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_CHECK_TYPE version: 5 updated: 2021/01/04 19:45:09 +dnl -------------------- +dnl Check if curses.h defines the given type +AC_DEFUN([CF_CURSES_CHECK_TYPE], +[ +AC_MSG_CHECKING(for type $1 in ${cf_cv_ncurses_header:-curses.h}) +AC_TRY_COMPILE([ +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}>],[ +$1 foo +],cf_result=yes,cf_result=no) +AC_MSG_RESULT($cf_result) +if test "$cf_result" = yes ; then + CF_UPPER(cf_result,have_type_$1) + AC_DEFINE_UNQUOTED($cf_result,1,[Define to 1 if we have type $1]) +else + AC_DEFINE_UNQUOTED($1,$2,[Define to appropriate type if $1 is not declared]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_CONFIG version: 2 updated: 2006/10/29 11:06:27 +dnl ---------------- +dnl Tie together the configure-script macros for curses. It may be ncurses, +dnl but unless asked, we do not make a special search for ncurses. However, +dnl still check for the ncurses version number, for use in other macros. +AC_DEFUN([CF_CURSES_CONFIG], +[ +CF_CURSES_CPPFLAGS +CF_NCURSES_VERSION +CF_CURSES_LIBS +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_CPPFLAGS version: 14 updated: 2021/01/02 09:31:20 +dnl ------------------ +dnl Look for the curses headers. +AC_DEFUN([CF_CURSES_CPPFLAGS],[ + +AC_CACHE_CHECK(for extra include directories,cf_cv_curses_incdir,[ +cf_cv_curses_incdir=no +case "$host_os" in +(hpux10.*) + if test "x$cf_cv_screen" = "xcurses_colr" + then + test -d /usr/include/curses_colr && \ + cf_cv_curses_incdir="-I/usr/include/curses_colr" + fi + ;; +(sunos3*|sunos4*) + if test "x$cf_cv_screen" = "xcurses_5lib" + then + test -d /usr/5lib && \ + test -d /usr/5include && \ + cf_cv_curses_incdir="-I/usr/5include" + fi + ;; +esac +]) +if test "$cf_cv_curses_incdir" != no +then + CF_APPEND_TEXT(CPPFLAGS,$cf_cv_curses_incdir) +fi + +CF_CURSES_HEADER +CF_TERM_HEADER +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_FUNCS version: 21 updated: 2024/06/11 20:24:35 +dnl --------------- +dnl Curses-functions are a little complicated, since a lot of them are macros. +dnl +dnl $1 is a list of functions to test +AC_DEFUN([CF_CURSES_FUNCS], +[ +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl +AC_REQUIRE([CF_XOPEN_CURSES]) +AC_REQUIRE([CF_CURSES_TERM_H]) +AC_REQUIRE([CF_CURSES_UNCTRL_H]) + +AC_FOREACH([AC_Func], [$1], + [AH_TEMPLATE(AS_TR_CPP(HAVE_[]AC_Func), + [Define if you have the `]AC_Func[' function.])])dnl + +for cf_func in $1 +do + CF_UPPER(cf_tr_func,$cf_func) + AC_MSG_CHECKING(for ${cf_func}) + CF_MSG_LOG(${cf_func}) + AC_CACHE_VAL(cf_cv_func_$cf_func,[ + eval cf_result='$ac_cv_func_'$cf_func + if test ".$cf_result" != ".no"; then + AC_TRY_LINK(CF__CURSES_HEAD, + [ +#ifndef ${cf_func} +long foo = (long)(&${cf_func}); +fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo); +if (foo + 1234L > 5678L) + ${cf_cv_main_return:-return}(foo != 0); +#endif + ], + [cf_result=yes], + [cf_result=no]) + fi + eval 'cf_cv_func_'$cf_func'="$cf_result"' + ]) + # use the computed/retrieved cache-value: + eval 'cf_result=$cf_cv_func_'$cf_func + AC_MSG_RESULT($cf_result) + if test "$cf_result" != no; then + AC_DEFINE_UNQUOTED(HAVE_${cf_tr_func}) + fi +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_HEADER version: 6 updated: 2022/12/02 20:06:52 +dnl ---------------- +dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common +dnl variations of ncurses' installs. +dnl +dnl $1 = ncurses when looking for ncurses, or is empty +AC_DEFUN([CF_CURSES_HEADER],[ +AC_CACHE_CHECK(if we have identified curses headers,cf_cv_ncurses_header,[ +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h ifelse($1,,,[$1/ncurses.h]) \ + curses.h ifelse($1,,,[$1/curses.h]) ifelse($1,,[ncurses/ncurses.h ncurses/curses.h]) +do +AC_TRY_COMPILE([#include <${cf_header}>], + [initscr(); endwin()], + [cf_cv_ncurses_header=$cf_header; break],[]) +done +]) + +if test "$cf_cv_ncurses_header" = none ; then + AC_MSG_ERROR(No curses header-files found) +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. +AC_CHECK_HEADERS($cf_cv_ncurses_header) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_LIBS version: 45 updated: 2022/12/02 20:06:52 +dnl -------------- +dnl Look for the curses libraries. Older curses implementations may require +dnl termcap/termlib to be linked as well. Call CF_CURSES_CPPFLAGS first. +AC_DEFUN([CF_CURSES_LIBS],[ + +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl +AC_MSG_CHECKING(if we have identified curses libraries) +AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); endwin()], + cf_result=yes, + cf_result=no) +AC_MSG_RESULT($cf_result) + +if test "$cf_result" = no ; then +case "$host_os" in +(freebsd*) + AC_CHECK_LIB(mytinfo,tgoto,[CF_ADD_LIBS(-lmytinfo)]) + ;; +(hpux10.*) + # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr + # next (1998), and xcurses "newer" (2000). There is no header file for + # Hcurses; the subdirectory curses_colr has the headers (curses.h and + # term.h) for cur_colr + if test "x$cf_cv_screen" = "xcurses_colr" + then + AC_CHECK_LIB(cur_colr,initscr,[ + CF_ADD_LIBS(-lcur_colr) + ac_cv_func_initscr=yes + ],[ + AC_CHECK_LIB(Hcurses,initscr,[ + # HP's header uses __HP_CURSES, but user claims _HP_CURSES. + CF_ADD_LIBS(-lHcurses) + CF_APPEND_TEXT(CPPFLAGS,-D__HP_CURSES -D_HP_CURSES) + ac_cv_func_initscr=yes + ])]) + fi + ;; +(linux*) + case `arch 2>/dev/null` in + (x86_64) + if test -d /lib64 + then + CF_ADD_LIBDIR(/lib64) + else + CF_ADD_LIBDIR(/lib) + fi + ;; + (*) + CF_ADD_LIBDIR(/lib) + ;; + esac + ;; +(sunos3*|sunos4*) + if test "x$cf_cv_screen" = "xcurses_5lib" + then + if test -d /usr/5lib ; then + CF_ADD_LIBDIR(/usr/5lib) + CF_ADD_LIBS(-lcurses -ltermcap) + fi + fi + ac_cv_func_initscr=yes + ;; +esac + +if test ".$ac_cv_func_initscr" != .yes ; then + cf_save_LIBS="$LIBS" + + if test ".${cf_cv_ncurses_version:-no}" != .no + then + cf_check_list="ncurses curses cursesX" + else + cf_check_list="cursesX curses ncurses" + fi + + # Check for library containing tgoto. Do this before curses library + # because it may be needed to link the test-case for initscr. + if test "x$cf_term_lib" = x + then + AC_CHECK_FUNC(tgoto,[cf_term_lib=predefined],[ + for cf_term_lib in $cf_check_list otermcap termcap tinfo termlib unknown + do + AC_CHECK_LIB($cf_term_lib,tgoto,[ + : "${cf_nculib_root:=$cf_term_lib}" + break + ]) + done + ]) + fi + + # Check for library containing initscr + test "$cf_term_lib" != predefined && test "$cf_term_lib" != unknown && LIBS="-l$cf_term_lib $cf_save_LIBS" + if test "x$cf_curs_lib" = x + then + for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown + do + LIBS="-l$cf_curs_lib $cf_save_LIBS" + if test "$cf_term_lib" = unknown || test "$cf_term_lib" = "$cf_curs_lib" ; then + AC_MSG_CHECKING(if we can link with $cf_curs_lib library) + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr()], + [cf_result=yes], + [cf_result=no]) + AC_MSG_RESULT($cf_result) + test "$cf_result" = yes && break + elif test "$cf_curs_lib" = "$cf_term_lib" ; then + cf_result=no + elif test "$cf_term_lib" != predefined ; then + AC_MSG_CHECKING(if we need both $cf_curs_lib and $cf_term_lib libraries) + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); endwin();], + [cf_result=no], + [ + LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS" + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr()], + [cf_result=yes], + [cf_result=error]) + ]) + AC_MSG_RESULT($cf_result) + test "$cf_result" != error && break + fi + done + fi + test "$cf_curs_lib" = unknown && AC_MSG_ERROR(no curses library found) +fi +fi + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_TERM_H version: 16 updated: 2024/01/07 06:34:16 +dnl ---------------- +dnl SVr4 curses should have term.h as well (where it puts the definitions of +dnl the low-level interface). This may not be true in old/broken implementations, +dnl as well as in misconfigured systems (e.g., gcc configured for Solaris 2.4 +dnl running with Solaris 2.5.1). +AC_DEFUN([CF_CURSES_TERM_H], +[ +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl + +AC_CACHE_CHECK(for term.h, cf_cv_term_header,[ + +# If we found , look for , but always look +# for if we do not find the variant. + +cf_header_list="term.h ncurses/term.h ncursesw/term.h" + +case "${cf_cv_ncurses_header:-curses.h}" in +(*/*) + cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h + cf_header_list="$cf_header_item $cf_header_list" + ;; +esac + +for cf_header in $cf_header_list +do + AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}> +#include <${cf_header}>], + [WINDOW *x; (void)x], + [cf_cv_term_header=$cf_header + break], + [cf_cv_term_header=no]) +done + +case "$cf_cv_term_header" in +(no) + # If curses is ncurses, some packagers still mess it up by trying to make + # us use GNU termcap. This handles the most common case. + for cf_header in ncurses/term.h ncursesw/term.h + do + AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}> +#ifdef NCURSES_VERSION +#include <${cf_header}> +#else +#error expected NCURSES_VERSION to be defined +#endif], + [WINDOW *x; (void)x], + [cf_cv_term_header=$cf_header + break], + [cf_cv_term_header=no]) + done + ;; +esac +]) + +case "$cf_cv_term_header" in +(term.h) + AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h]) + ;; +(ncurses/term.h) + AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h]) + ;; +(ncursesw/term.h) + AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h]) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_UNCTRL_H version: 8 updated: 2021/01/02 09:31:20 +dnl ------------------ +dnl Any X/Open curses implementation must have unctrl.h, but ncurses packages +dnl may put it in a subdirectory (along with ncurses' other headers, of +dnl course). Packages which put the headers in inconsistent locations are +dnl broken). +AC_DEFUN([CF_CURSES_UNCTRL_H], +[ +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl + +AC_CACHE_CHECK(for unctrl.h, cf_cv_unctrl_header,[ + +# If we found , look for , but always look +# for if we do not find the variant. + +cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h" + +case "${cf_cv_ncurses_header:-curses.h}" in +(*/*) + cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h + cf_header_list="$cf_header_item $cf_header_list" + ;; +esac + +for cf_header in $cf_header_list +do + AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}> +#include <${cf_header}>], + [WINDOW *x; (void)x], + [cf_cv_unctrl_header=$cf_header + break], + [cf_cv_unctrl_header=no]) +done +]) + +case "$cf_cv_unctrl_header" in +(no) + AC_MSG_WARN(unctrl.h header not found) + ;; +esac + +case "$cf_cv_unctrl_header" in +(unctrl.h) + AC_DEFINE(HAVE_UNCTRL_H,1,[Define to 1 if we have unctrl.h]) + ;; +(ncurses/unctrl.h) + AC_DEFINE(HAVE_NCURSES_UNCTRL_H,1,[Define to 1 if we have ncurses/unctrl.h]) + ;; +(ncursesw/unctrl.h) + AC_DEFINE(HAVE_NCURSESW_UNCTRL_H,1,[Define to 1 if we have ncursesw/unctrl.h]) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_WACS_MAP version: 8 updated: 2021/01/04 19:45:09 +dnl ------------------ +dnl Check for likely values of wacs_map[]. +AC_DEFUN([CF_CURSES_WACS_MAP], +[ +AC_CACHE_CHECK(for wide alternate character set array, cf_cv_curses_wacs_map,[ + cf_cv_curses_wacs_map=unknown + for name in wacs_map _wacs_map __wacs_map _nc_wacs _wacs_char + do + AC_TRY_LINK([ +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}>], + [void *foo = &(${name}['k']); (void)foo], + [cf_cv_curses_wacs_map=$name + break]) + done]) + +test "$cf_cv_curses_wacs_map" != unknown && AC_DEFINE_UNQUOTED(CURSES_WACS_ARRAY,$cf_cv_curses_wacs_map,[Define to name of (n)curses wide-character array]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CURSES_WACS_SYMBOLS version: 4 updated: 2021/01/04 19:45:09 +dnl ---------------------- +dnl Do a check to see if the WACS_xxx constants are defined compatibly with +dnl X/Open Curses. In particular, NetBSD's implementation of the WACS_xxx +dnl constants is broken since those constants do not point to cchar_t's. +AC_DEFUN([CF_CURSES_WACS_SYMBOLS], +[ +AC_REQUIRE([CF_CURSES_WACS_MAP]) + +AC_CACHE_CHECK(for wide alternate character constants, cf_cv_curses_wacs_symbols,[ +cf_cv_curses_wacs_symbols=no +if test "$cf_cv_curses_wacs_map" != unknown +then + AC_TRY_LINK([ +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}>], + [cchar_t *foo = WACS_PLUS; + ${cf_cv_curses_wacs_map}['k'] = *WACS_PLUS; (void)foo], + [cf_cv_curses_wacs_symbols=yes]) +else + AC_TRY_LINK([ +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}>], + [cchar_t *foo = WACS_PLUS; (void)foo], + [cf_cv_curses_wacs_symbols=yes]) +fi +]) + +test "$cf_cv_curses_wacs_symbols" != no && AC_DEFINE(CURSES_WACS_SYMBOLS,1,[Define to 1 if (n)curses supports wide-character WACS_ symbols]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DIRNAME version: 5 updated: 2020/12/31 20:19:42 +dnl ---------- +dnl "dirname" is not portable, so we fake it with a shell script. +AC_DEFUN([CF_DIRNAME],[$1=`echo "$2" | sed -e 's%/[[^/]]*$%%'`])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_ECHO version: 14 updated: 2021/09/04 06:35:04 +dnl --------------- +dnl You can always use "make -n" to see the actual options, but it is hard to +dnl pick out/analyze warning messages when the compile-line is long. +dnl +dnl Sets: +dnl ECHO_LT - symbol to control if libtool is verbose +dnl ECHO_LD - symbol to prefix "cc -o" lines +dnl RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o) +dnl SHOW_CC - symbol to put before explicit "cc -c" lines +dnl ECHO_CC - symbol to put before any "cc" line +dnl +AC_DEFUN([CF_DISABLE_ECHO],[ +AC_MSG_CHECKING(if you want to see long compiling messages) +CF_ARG_DISABLE(echo, + [ --disable-echo do not display "compiling" commands], + [ + ECHO_LT='--silent' + ECHO_LD='@echo linking [$]@;' + RULE_CC='@echo compiling [$]<' + SHOW_CC='@echo compiling [$]@' + ECHO_CC='@' +],[ + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' +]) +AC_MSG_RESULT($enableval) +AC_SUBST(ECHO_LT) +AC_SUBST(ECHO_LD) +AC_SUBST(RULE_CC) +AC_SUBST(SHOW_CC) +AC_SUBST(ECHO_CC) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_LEAKS version: 9 updated: 2021/04/03 16:41:50 +dnl ---------------- +dnl Combine no-leak checks with the libraries or tools that are used for the +dnl checks. +AC_DEFUN([CF_DISABLE_LEAKS],[ + +AC_REQUIRE([CF_WITH_DMALLOC]) +AC_REQUIRE([CF_WITH_DBMALLOC]) +AC_REQUIRE([CF_WITH_VALGRIND]) + +AC_MSG_CHECKING(if you want to perform memory-leak testing) +AC_ARG_ENABLE(leaks, + [ --disable-leaks test: free permanent memory, analyze leaks], + [enable_leaks=$enableval], + [enable_leaks=yes]) +dnl with_no_leaks is more readable... +if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi +AC_MSG_RESULT($with_no_leaks) + +if test "$enable_leaks" = no ; then + AC_DEFINE(NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.]) + AC_DEFINE(YY_NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_RPATH_HACK version: 3 updated: 2021/01/05 20:14:44 +dnl --------------------- +dnl The rpath-hack makes it simpler to build programs, particularly with the +dnl *BSD ports which may have essential libraries in unusual places. But it +dnl can interfere with building an executable for the base system. Use this +dnl option in that case. +AC_DEFUN([CF_DISABLE_RPATH_HACK], +[ +AC_MSG_CHECKING(if rpath-hack should be disabled) +CF_ARG_DISABLE(rpath-hack, + [ --disable-rpath-hack don't add rpath options for additional libraries], + [enable_rpath_hack=no], + [enable_rpath_hack=yes]) +dnl TODO - drop cf_disable_rpath_hack +if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi +AC_MSG_RESULT($cf_disable_rpath_hack) + +if test "$enable_rpath_hack" = yes ; then + CF_RPATH_HACK +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_STRING_HACKS version: 6 updated: 2021/01/05 19:23:48 +dnl ---------------------- +dnl On a few platforms, the compiler and/or loader nags with untruthful +dnl comments stating that "most" uses of strcat/strcpy/sprintf are incorrect, +dnl and implying that most uses of the recommended alternatives are correct. +dnl +dnl Factually speaking, no one has actually counted the number of uses of these +dnl functions versus the total of incorrect uses. Samples of a few thousand +dnl instances are meaningless compared to the hundreds of millions of lines of +dnl existing C code. +dnl +dnl strlcat/strlcpy are (as of 2012) non-standard, and are available on some +dnl platforms, in implementations of varying quality. Likewise, snprintf is +dnl standard - but evolved through phases, and older implementations are likely +dnl to yield surprising results, as documented in manpages on various systems. +AC_DEFUN([CF_ENABLE_STRING_HACKS], +[ +AC_MSG_CHECKING(if you want to work around bogus compiler/loader warnings) +AC_ARG_ENABLE(string-hacks, + [ --enable-string-hacks work around bogus compiler/loader warnings], + [enable_string_hacks=$enableval], + [enable_string_hacks=no]) +AC_MSG_RESULT($enable_string_hacks) + +if test "x$enable_string_hacks" = "xyes"; then + AC_DEFINE(USE_STRING_HACKS,1,[Define to 1 to work around bogus compiler/loader warnings]) + AC_MSG_WARN(enabling string-hacks to work around bogus compiler/loader warnings) + AC_CHECK_FUNC(strlcat,[ + AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function]) + ],[ + AC_CHECK_LIB(bsd,strlcat,[ + CF_ADD_LIB(bsd) + AC_CHECK_HEADERS(bsd/string.h) + AC_DEFINE(HAVE_STRLCAT,1,[Define to 1 if we have strlcat function]) + ]) + ]) + AC_CHECK_FUNCS( strlcpy snprintf ) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_WARNINGS version: 9 updated: 2021/01/05 19:40:50 +dnl ------------------ +dnl Configure-option to enable gcc warnings +dnl +dnl $1 = extra options to add, if supported +dnl $2 = option for checking attributes. By default, this is done when +dnl warnings are enabled. For other values: +dnl yes: always do this, e.g., to use in generated library-headers +dnl no: never do this +AC_DEFUN([CF_ENABLE_WARNINGS],[ +if test "$GCC" = yes || test "$GXX" = yes +then +CF_FIX_WARNINGS(CFLAGS) +CF_FIX_WARNINGS(CPPFLAGS) +CF_FIX_WARNINGS(LDFLAGS) +AC_MSG_CHECKING(if you want to turn on gcc warnings) +CF_ARG_ENABLE(warnings, + [ --enable-warnings test: turn on gcc compiler warnings], + [enable_warnings=yes], + [enable_warnings=no]) +AC_MSG_RESULT($enable_warnings) +if test "$enable_warnings" = "yes" +then + ifelse($2,,[CF_GCC_ATTRIBUTES]) + CF_GCC_WARNINGS($1) +fi +ifelse($2,yes,[CF_GCC_ATTRIBUTES]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIND_LIBRARY version: 11 updated: 2021/01/02 09:31:20 +dnl --------------- +dnl Look for a non-standard library, given parameters for AC_TRY_LINK. We +dnl prefer a standard location, and use -L options only if we do not find the +dnl library in the standard library location(s). +dnl $1 = library name +dnl $2 = library class, usually the same as library name +dnl $3 = includes +dnl $4 = code fragment to compile/link +dnl $5 = corresponding function-name +dnl $6 = flag, nonnull if failure should not cause an error-exit +dnl +dnl Sets the variable "$cf_libdir" as a side-effect, so we can see if we had +dnl to use a -L option. +AC_DEFUN([CF_FIND_LIBRARY], +[ + eval 'cf_cv_have_lib_'"$1"'=no' + cf_libdir="" + AC_CHECK_FUNC($5, + eval 'cf_cv_have_lib_'"$1"'=yes',[ + cf_save_LIBS="$LIBS" + AC_MSG_CHECKING(for $5 in -l$1) + LIBS="-l$1 $LIBS" + AC_TRY_LINK([$3],[$4], + [AC_MSG_RESULT(yes) + eval 'cf_cv_have_lib_'"$1"'=yes' + ], + [AC_MSG_RESULT(no) + CF_LIBRARY_PATH(cf_search,$2) + for cf_libdir in $cf_search + do + AC_MSG_CHECKING(for -l$1 in $cf_libdir) + LIBS="-L$cf_libdir -l$1 $cf_save_LIBS" + AC_TRY_LINK([$3],[$4], + [AC_MSG_RESULT(yes) + eval 'cf_cv_have_lib_'"$1"'=yes' + break], + [AC_MSG_RESULT(no) + LIBS="$cf_save_LIBS"]) + done + ]) + ]) +eval 'cf_found_library="[$]cf_cv_have_lib_'"$1"\" +ifelse($6,,[ +if test "$cf_found_library" = no ; then + AC_MSG_ERROR(Cannot link $1 library) +fi +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIND_LINKAGE version: 22 updated: 2020/12/31 20:19:42 +dnl --------------- +dnl Find a library (specifically the linkage used in the code fragment), +dnl searching for it if it is not already in the library path. +dnl See also CF_ADD_SEARCHPATH. +dnl +dnl Parameters (4-on are optional): +dnl $1 = headers for library entrypoint +dnl $2 = code fragment for library entrypoint +dnl $3 = the library name without the "-l" option or ".so" suffix. +dnl $4 = action to perform if successful (default: update CPPFLAGS, etc) +dnl $5 = action to perform if not successful +dnl $6 = module name, if not the same as the library name +dnl $7 = extra libraries +dnl +dnl Sets these variables: +dnl $cf_cv_find_linkage_$3 - yes/no according to whether linkage is found +dnl $cf_cv_header_path_$3 - include-directory if needed +dnl $cf_cv_library_path_$3 - library-directory if needed +dnl $cf_cv_library_file_$3 - library-file if needed, e.g., -l$3 +AC_DEFUN([CF_FIND_LINKAGE],[ + +# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these +# will be set on completion of the AC_TRY_LINK below. +cf_cv_header_path_$3= +cf_cv_library_path_$3= + +CF_MSG_LOG([Starting [FIND_LINKAGE]($3,$6)]) + +cf_save_LIBS="$LIBS" + +AC_TRY_LINK([$1],[$2],[ + cf_cv_find_linkage_$3=yes + cf_cv_header_path_$3=/usr/include + cf_cv_library_path_$3=/usr/lib +],[ + +LIBS="-l$3 $7 $cf_save_LIBS" + +AC_TRY_LINK([$1],[$2],[ + cf_cv_find_linkage_$3=yes + cf_cv_header_path_$3=/usr/include + cf_cv_library_path_$3=/usr/lib + cf_cv_library_file_$3="-l$3" +],[ + cf_cv_find_linkage_$3=no + LIBS="$cf_save_LIBS" + + CF_VERBOSE(find linkage for $3 library) + CF_MSG_LOG([Searching for headers in [FIND_LINKAGE]($3,$6)]) + + cf_save_CPPFLAGS="$CPPFLAGS" + cf_test_CPPFLAGS="$CPPFLAGS" + + CF_HEADER_PATH(cf_search,ifelse([$6],,[$3],[$6])) + for cf_cv_header_path_$3 in $cf_search + do + if test -d "$cf_cv_header_path_$3" ; then + CF_VERBOSE(... testing $cf_cv_header_path_$3) + CPPFLAGS="$cf_save_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-I$cf_cv_header_path_$3) + AC_TRY_COMPILE([$1],[$2],[ + CF_VERBOSE(... found $3 headers in $cf_cv_header_path_$3) + cf_cv_find_linkage_$3=maybe + cf_test_CPPFLAGS="$CPPFLAGS" + break],[ + CPPFLAGS="$cf_save_CPPFLAGS" + ]) + fi + done + + if test "$cf_cv_find_linkage_$3" = maybe ; then + + CF_MSG_LOG([Searching for $3 library in [FIND_LINKAGE]($3,$6)]) + + cf_save_LIBS="$LIBS" + cf_save_LDFLAGS="$LDFLAGS" + + ifelse([$6],,,[ + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-l$3 $7 $cf_save_LIBS" + AC_TRY_LINK([$1],[$2],[ + CF_VERBOSE(... found $3 library in system) + cf_cv_find_linkage_$3=yes]) + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + ]) + + if test "$cf_cv_find_linkage_$3" != yes ; then + CF_LIBRARY_PATH(cf_search,$3) + for cf_cv_library_path_$3 in $cf_search + do + if test -d "$cf_cv_library_path_$3" ; then + CF_VERBOSE(... testing $cf_cv_library_path_$3) + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-l$3 $7 $cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_$3" + AC_TRY_LINK([$1],[$2],[ + CF_VERBOSE(... found $3 library in $cf_cv_library_path_$3) + cf_cv_find_linkage_$3=yes + cf_cv_library_file_$3="-l$3" + break],[ + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS" + ]) + fi + done + CPPFLAGS="$cf_save_CPPFLAGS" + LDFLAGS="$cf_save_LDFLAGS" + fi + + else + cf_cv_find_linkage_$3=no + fi + ],$7) +]) + +LIBS="$cf_save_LIBS" + +if test "$cf_cv_find_linkage_$3" = yes ; then +ifelse([$4],,[ + CF_ADD_INCDIR($cf_cv_header_path_$3) + CF_ADD_LIBDIR($cf_cv_library_path_$3) + CF_ADD_LIB($3) +],[$4]) +else +ifelse([$5],,AC_MSG_WARN(Cannot find $3 library),[$5]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FIX_WARNINGS version: 4 updated: 2021/12/16 18:22:31 +dnl --------------- +dnl Warning flags do not belong in CFLAGS, CPPFLAGS, etc. Any of gcc's +dnl "-Werror" flags can interfere with configure-checks. Those go into +dnl EXTRA_CFLAGS. +dnl +dnl $1 = variable name to repair +define([CF_FIX_WARNINGS],[ +if test "$GCC" = yes || test "$GXX" = yes +then + case [$]$1 in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in [$]$1 + do + case "x$cf_temp_scan" in + (x-Werror=format*) + CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan) + ;; + (x-Werror=*) + CF_APPEND_TEXT(EXTRA_CFLAGS,$cf_temp_scan) + ;; + (*) + CF_APPEND_TEXT(cf_temp_flags,$cf_temp_scan) + ;; + esac + done + if test "x[$]$1" != "x$cf_temp_flags" + then + CF_VERBOSE(repairing $1: [$]$1) + $1="$cf_temp_flags" + CF_VERBOSE(... fixed [$]$1) + CF_VERBOSE(... extra $EXTRA_CFLAGS) + fi + ;; + esac +fi +AC_SUBST(EXTRA_CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_CURSES_VERSION version: 9 updated: 2023/01/05 18:06:10 +dnl ---------------------- +dnl Solaris has a data item 'curses_version', which confuses AC_CHECK_FUNCS. +dnl It's a character string "SVR4", not documented. +AC_DEFUN([CF_FUNC_CURSES_VERSION], +[ +AC_CACHE_CHECK(for function curses_version, cf_cv_func_curses_version,[ +AC_TRY_RUN([ +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + char temp[1024]; + sprintf(temp, "%.999s\\n", curses_version()); + ${cf_cv_main_return:-return}(0); +}] +,[cf_cv_func_curses_version=yes] +,[cf_cv_func_curses_version=no] +,[cf_cv_func_curses_version=unknown]) +rm -f core]) +test "$cf_cv_func_curses_version" = yes && AC_DEFINE(HAVE_CURSES_VERSION,1,[Define to 1 if we have curses_version function]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_GETTIME version: 3 updated: 2024/05/11 13:40:02 +dnl --------------- +dnl Check for gettimeofday or clock_gettime. In 2023, the former is still more +dnl widely supported, but "deprecated" (2008), so we will use the latter if it +dnl is available, to reduce compiler warnings. +AC_DEFUN([CF_FUNC_GETTIME],[ +cf_save_libs="$LIBS" +AC_CHECK_FUNC(clock_gettime, + cf_cv_test_clock_gettime=yes, + AC_CHECK_LIB(rt, clock_gettime, + [LIBS="-lrt $LIBS" + cf_cv_test_clock_gettime=yes], + cf_cv_test_clock_gettime=no)) + +if test "$cf_cv_test_clock_gettime" = yes ; then +AC_CACHE_CHECK(if clock_gettime links,cf_cv_func_clock_gettime,[ + AC_TRY_LINK([ +$ac_includes_default +#include + ], + [struct timespec ts; + int rc = clock_gettime(CLOCK_REALTIME, &ts) + + clock_gettime(CLOCK_MONOTONIC, &ts); + (void) rc; (void)ts], + [cf_cv_func_clock_gettime=yes], + [cf_cv_func_clock_gettime=no]) +]) +else + cf_cv_func_clock_gettime=no +fi + +if test "$cf_cv_func_clock_gettime" = yes +then + AC_DEFINE(HAVE_CLOCK_GETTIME,1,[Define to 1 if we have clock_gettime function]) +else +AC_CHECK_FUNC(gettimeofday, + AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]),[ + +AC_CHECK_LIB(bsd, gettimeofday, + AC_DEFINE(HAVE_GETTIMEOFDAY,1,[Define to 1 if we have gettimeofday function]) + CF_ADD_LIB(bsd))])dnl CLIX: bzero, select, gettimeofday +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_OPENPTY version: 7 updated: 2023/12/03 09:21:34 +dnl --------------- +dnl Check for openpty() function, along with header. It may need the +dnl "util" library as well. +AC_DEFUN([CF_FUNC_OPENPTY], +[ +AC_CHECK_LIB(util,openpty,cf_cv_lib_util=yes,cf_cv_lib_util=no) +AC_CACHE_CHECK(for openpty header,cf_cv_func_openpty,[ + cf_save_LIBS="$LIBS" + test "$cf_cv_lib_util" = yes && { CF_ADD_LIB(util) } + for cf_header in pty.h libutil.h util.h + do + AC_TRY_LINK([ +#include <$cf_header> +],[ + int x = openpty((int *)0, (int *)0, (char *)0, + (struct termios *)0, (struct winsize *)0); + (void)x; +],[ + cf_cv_func_openpty=$cf_header + break +],[ + cf_cv_func_openpty=no +]) + done + LIBS="$cf_save_LIBS" +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_ATTRIBUTES version: 24 updated: 2021/03/20 12:00:25 +dnl ----------------- +dnl Test for availability of useful gcc __attribute__ directives to quiet +dnl compiler warnings. Though useful, not all are supported -- and contrary +dnl to documentation, unrecognized directives cause older compilers to barf. +AC_DEFUN([CF_GCC_ATTRIBUTES], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([CF_C11_NORETURN])dnl + +if test "$GCC" = yes || test "$GXX" = yes +then +cat > conftest.i < "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[[]] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + CF_UPPER(cf_ATTRIBUTE,$cf_attribute) + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&AC_FD_CC + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <>confdefs.h + case "$cf_attribute" in + (noreturn) + AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc]) + ;; + (printf) + cf_value='/* nothing */' + if test "$cf_printf_attribute" != no ; then + cf_value='__attribute__((format(printf,fmt,var)))' + AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc]) + ;; + (scanf) + cf_value='/* nothing */' + if test "$cf_scanf_attribute" != no ; then + cf_value='__attribute__((format(scanf,fmt,var)))' + AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc]) + ;; + (unused) + AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc]) + ;; + esac + fi + done +else + ${FGREP-fgrep} define conftest.i >>confdefs.h +fi +rm -rf ./conftest* +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_VERSION version: 9 updated: 2023/03/05 14:30:13 +dnl -------------- +dnl Find version of gcc, and (because icc/clang pretend to be gcc without being +dnl compatible), attempt to determine if icc/clang is actually used. +AC_DEFUN([CF_GCC_VERSION],[ +AC_REQUIRE([AC_PROG_CC]) +GCC_VERSION=none +if test "$GCC" = yes ; then + AC_MSG_CHECKING(version of $CC) + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^[[^(]]*([[^)]][[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + AC_MSG_RESULT($GCC_VERSION) +fi +CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS) +CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_WARNINGS version: 41 updated: 2021/01/01 16:53:59 +dnl --------------- +dnl Check if the compiler supports useful warning options. There's a few that +dnl we don't use, simply because they're too noisy: +dnl +dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x) +dnl -Winline (usually not worthwhile) +dnl -Wredundant-decls (system headers make this too noisy) +dnl -Wtraditional (combines too many unrelated messages, only a few useful) +dnl -Wwrite-strings (too noisy, but should review occasionally). This +dnl is enabled for ncurses using "--enable-const". +dnl -pedantic +dnl +dnl Parameter: +dnl $1 is an optional list of gcc warning flags that a particular +dnl application might want to use, e.g., "no-unused" for +dnl -Wno-unused +dnl Special: +dnl If $with_ext_const is "yes", add a check for -Wwrite-strings +dnl +AC_DEFUN([CF_GCC_WARNINGS], +[ +AC_REQUIRE([CF_GCC_VERSION]) +if test "x$have_x" = xyes; then CF_CONST_X_STRING fi +cat > "conftest.$ac_ext" <], +[int x = optind; char *y = optarg; (void)x; (void)y], +[cf_cv_getopt_header=$cf_header + break]) +done +]) +if test "$cf_cv_getopt_header" != none ; then + AC_DEFINE(HAVE_GETOPT_HEADER,1,[Define to 1 if getopt variables are declared in header]) +fi +if test "$cf_cv_getopt_header" = getopt.h ; then + AC_DEFINE(NEED_GETOPT_H,1,[Define to 1 if we must include getopt.h]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GLOB_FULLPATH version: 2 updated: 2024/08/03 12:34:02 +dnl ---------------- +dnl Use this in case-statements to check for pathname syntax, i.e., absolute +dnl pathnames. The "x" is assumed since we provide an alternate form for DOS. +AC_DEFUN([CF_GLOB_FULLPATH],[ +AC_REQUIRE([CF_WITH_SYSTYPE])dnl +case "$cf_cv_system_name" in +(cygwin*|msys*|mingw32*|mingw64|os2*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER='[[a-zA-Z]]:[[\\/]]*' + ;; +(*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER=$GLOB_FULLPATH_POSIX + ;; +esac +AC_SUBST(GLOB_FULLPATH_POSIX) +AC_SUBST(GLOB_FULLPATH_OTHER) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GNU_SOURCE version: 10 updated: 2018/12/10 20:09:41 +dnl ------------- +dnl Check if we must define _GNU_SOURCE to get a reasonable value for +dnl _XOPEN_SOURCE, upon which many POSIX definitions depend. This is a defect +dnl (or misfeature) of glibc2, which breaks portability of many applications, +dnl since it is interwoven with GNU extensions. +dnl +dnl Well, yes we could work around it... +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +AC_DEFUN([CF_GNU_SOURCE], +[ +cf_gnu_xopen_source=ifelse($1,,500,$1) + +AC_CACHE_CHECK(if this is the GNU C library,cf_cv_gnu_library,[ +AC_TRY_COMPILE([#include ],[ + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif], + [cf_cv_gnu_library=yes], + [cf_cv_gnu_library=no]) +]) + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[ + cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + AC_TRY_COMPILE([#include ],[ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif], + [cf_cv_gnu_library_219=yes], + [cf_cv_gnu_library_219=no]) + CPPFLAGS="$cf_save" + ]) + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[ + CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source) + AC_TRY_COMPILE([ + #include + #include + ],[ + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif], + [cf_cv_gnu_dftsrc_219=yes], + [cf_cv_gnu_dftsrc_219=no]) + ]) + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[ + AC_TRY_COMPILE([#include ],[ + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif], + [cf_cv_gnu_source=no], + [cf_save="$CPPFLAGS" + CF_ADD_CFLAGS(-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif], + [cf_cv_gnu_source=no], + [cf_cv_gnu_source=yes]) + CPPFLAGS="$cf_save" + ]) + ]) + + if test "$cf_cv_gnu_source" = yes + then + AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[ + CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif], + [cf_cv_default_source=no], + [cf_cv_default_source=yes]) + ]) + if test "$cf_cv_default_source" = yes + then + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + fi + fi + fi + +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HEADER_PATH version: 15 updated: 2021/01/01 13:31:04 +dnl -------------- +dnl Construct a search-list of directories for a nonstandard header-file +dnl +dnl Parameters +dnl $1 = the variable to return as result +dnl $2 = the package name +AC_DEFUN([CF_HEADER_PATH], +[ +$1= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + CF_ADD_SUBDIR_PATH($1,$2,include,$cf_header_path,NONE) + cf_header_path_list="$cf_header_path_list [$]$1" + ;; + esac + done +fi + +# add the variations for the package we are looking for +CF_SUBDIR_PATH($1,$2,include) + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && $1="[$]$1 $includedir" + test -d "$includedir/$2" && $1="[$]$1 $includedir/$2" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && $1="[$]$1 $oldincludedir" + test -d "$oldincludedir/$2" && $1="[$]$1 $oldincludedir/$2" +} + +$1="[$]$1 $cf_header_path_list" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54 +dnl --------------- +dnl Insert text into the help-message, for readability, from AC_ARG_WITH. +AC_DEFUN([CF_HELP_MESSAGE], +[CF_ACVERSION_CHECK(2.53,[],[ +AC_DIVERT_HELP($1)])dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INHERIT_SCRIPT version: 2 updated: 2003/03/01 23:50:42 +dnl ----------------- +dnl If we do not have a given script, look for it in the parent directory. +AC_DEFUN([CF_INHERIT_SCRIPT], +[ +test -f $1 || ( test -f ../$1 && cp ../$1 ./ ) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPTS version: 3 updated: 2023/06/03 15:17:30 +dnl --------------- +dnl prompt for/fill-in useful install-program options +AC_DEFUN([CF_INSTALL_OPTS], +[ +CF_INSTALL_OPT_S +CF_INSTALL_OPT_P +CF_INSTALL_OPT_O +CF_INSTALL_OPT_STRIP_PROG +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_O version: 3 updated: 2020/12/31 20:19:42 +dnl ---------------- +dnl Almost all "install" programs default to the current user's ownership. +dnl Almost - MINIX is an exception. +AC_DEFUN([CF_INSTALL_OPT_O], +[ +AC_MSG_CHECKING(if install needs to be told about ownership) +case `$ac_config_guess` in +(*minix) + with_install_o=yes + ;; +(*) + with_install_o=no + ;; +esac + +AC_MSG_RESULT($with_install_o) +if test "x$with_install_o" = xyes +then + INSTALL_OPT_O="`id root|sed -e 's/uid=[[0-9]]*(/ -o /' -e 's/gid=[[0-9]]*(/ -g /' -e 's/ [[^=[:space:]]][[^=[:space:]]]*=.*/ /' -e 's/)//g'`" +else + INSTALL_OPT_O= +fi + +AC_SUBST(INSTALL_OPT_O) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_P version: 3 updated: 2021/01/01 13:31:04 +dnl ---------------- +dnl Some install-programs accept a "-p" option to preserve file modification +dnl timestamps. That can be useful as an install option, as well as a way to +dnl avoid the need for ranlib after copying a static archive. +AC_DEFUN([CF_INSTALL_OPT_P], +[ +: "${INSTALL:=install}" +AC_CACHE_CHECK(if install accepts -p option, cf_cv_install_p,[ + rm -rf ./conftest* + date >conftest.in + mkdir conftest.out + sleep 3 + if $INSTALL -p conftest.in conftest.out 2>/dev/null + then + if test -f conftest.out/conftest.in + then + test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \ + test conftest.out/conftest.in -nt conftest.in 2>conftest.err + if test -s conftest.err + then + cf_cv_install_p=no + else + cf_cv_install_p=yes + fi + else + cf_cv_install_p=no + fi + else + cf_cv_install_p=no + fi + rm -rf ./conftest* +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_S version: 3 updated: 2021/01/05 19:23:48 +dnl ---------------- +dnl By default, we should strip executables which are installed, but leave the +dnl ability to suppress that for unit-testing. +AC_DEFUN([CF_INSTALL_OPT_S], +[ +AC_MSG_CHECKING(if you want to install stripped executables) +CF_ARG_DISABLE(stripping, + [ --disable-stripping do not strip (debug info) installed executables], + [enable_stripping=no], + [enable_stripping=yes]) +AC_MSG_RESULT($enable_stripping) + +if test "$enable_stripping" = yes +then + INSTALL_OPT_S="-s" +else + INSTALL_OPT_S= +fi +AC_SUBST(INSTALL_OPT_S) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_OPT_STRIP_PROG version: 1 updated: 2023/06/03 15:17:30 +dnl ------------------------- +dnl Provide an option for overriding the strip program used in install "-s" +dnl +dnl coreutils install provides a --strip-program option +dnl FreeBSD uses STRIPBIN environment variable, while NetBSD and OpenBSD use +dnl STRIP environment variable. Other versions of install do not support this. +AC_DEFUN([CF_INSTALL_OPT_STRIP_PROG], +[ +AC_REQUIRE([CF_INSTALL_OPT_S]) +if test -n "$INSTALL_OPT_S" +then + AC_MSG_CHECKING(if you want to specify strip-program) + AC_ARG_WITH(strip-program, + [ --with-strip-program=XX specify program to use when stripping in install], + [with_strip_program=$withval], + [with_strip_program=no]) + AC_MSG_RESULT($with_strip_program) + if test "$with_strip_program" != no + then + AC_MSG_CHECKING(if strip-program is supported with this installer) + cf_install_program=`echo "$INSTALL" | sed -e 's%[[ ]]*[[ ]]-.%%'` + check_install_strip=no + if test -f "$cf_install_program" + then + check_install_version=`"$cf_install_program" --version 2>/dev/null | head -n 1 | grep coreutils` + if test -n "$check_install_version" + then + check_install_strip="option" + else + for check_strip_variable in STRIPBIN STRIP + do + if strings "$cf_install_program" | grep "^$check_strip_variable[$]" >/dev/null + then + check_install_strip="environ" + break + fi + done + fi + fi + AC_MSG_RESULT($check_install_strip) + case "$check_install_strip" in + (no) + AC_MSG_WARN($cf_install_program does not support strip program option) + with_strip_program=no + ;; + (environ) + cat >install.tmp <<-CF_EOF + #! $SHELL + STRIPBIN="$with_strip_program" \\ + STRIP="$with_strip_program" \\ + $INSTALL "[$]@" + CF_EOF + INSTALL="`pwd`/install.tmp" + chmod +x "$INSTALL" + CF_VERBOSE(created $INSTALL) + ;; + (option) + INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" + ;; + esac + fi +fi +AC_SUBST(INSTALL_OPT_S) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INSTALL_PREFIX version: 1 updated: 2024/08/10 20:16:32 +dnl ----------------- +dnl Special option for use by system-builders: the install-prefix is used to +dnl adjust the location into which the actual install is done, so that an +dnl archive can be built without modifying the host system's configuration. +AC_DEFUN([CF_INSTALL_PREFIX],[ +AC_MSG_CHECKING(for an installation directory prefix) +AC_ARG_WITH(install-prefix, + [ --with-install-prefix=DESTDIR use DESTDIR as installation directory prefix], + [case "x$withval" in + (xyes|xno) + ;; + (*) DESTDIR="$withval" + ;; + esac]) +AC_MSG_RESULT([${DESTDIR:-(none)}]) +AC_SUBST(DESTDIR) + +AC_MSG_CHECKING(if installation directory prefix should be merged) +CF_ARG_ENABLE(install-prefix, + [ --enable-install-prefix merge DESTDIR with installation prefix], + cf_install_prefix=yes, + cf_install_prefix=no) +AC_MSG_RESULT($cf_install_prefix) + +if test "$cf_install_prefix" = yes ; then + MERGE_PREFIX=':$(prefix)%=%' +else + MERGE_PREFIX='' +fi + +AC_SUBST(MERGE_PREFIX) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INTEL_COMPILER version: 9 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Check if the given compiler is really the Intel compiler for Linux. It +dnl tries to imitate gcc, but does not return an error when it finds a mismatch +dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_INTEL_COMPILER],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +ifelse([$2],,INTEL_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + case "$host_os" in + (linux*|gnu*) + AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc" + AC_TRY_COMPILE([],[ +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif +],[ifelse([$2],,INTEL_COMPILER,[$2])=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2])) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LD_RPATH_OPT version: 9 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl For the given system and compiler, find the compiler flags to pass to the +dnl loader to use the "rpath" feature. +AC_DEFUN([CF_LD_RPATH_OPT], +[ +AC_REQUIRE([CF_CHECK_CACHE]) + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + AC_MSG_CHECKING(for an rpath option) + case "$cf_cv_system_name" in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[[2-9]].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + AC_MSG_RESULT($LD_RPATH_OPT) + + case "x$LD_RPATH_OPT" in + (x-R*) + AC_MSG_CHECKING(if we need a space after rpath option) + cf_save_LIBS="$LIBS" + CF_ADD_LIBS(${LD_RPATH_OPT}$libdir) + AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes) + LIBS="$cf_save_LIBS" + AC_MSG_RESULT($cf_rpath_space) + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LIBRARY_PATH version: 11 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Construct a search-list of directories for a nonstandard library-file +dnl +dnl Parameters +dnl $1 = the variable to return as result +dnl $2 = the package name +AC_DEFUN([CF_LIBRARY_PATH], +[ +$1= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + CF_ADD_SUBDIR_PATH($1,$2,lib,$cf_library_path,NONE) + cf_library_path_list="$cf_library_path_list [$]$1" + ;; + esac + done +fi + +CF_SUBDIR_PATH($1,$2,lib) + +$1="$cf_library_path_list [$]$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_PHONY version: 3 updated: 2021/01/08 16:08:21 +dnl ------------- +dnl Check if the make-program handles a ".PHONY" target, e.g,. a target which +dnl acts as a placeholder. +dnl +dnl The ".PHONY" feature was proposed in 2011 here +dnl https://www.austingroupbugs.net/view.php?id=523 +dnl and is scheduled for release in P1003.1 Issue 8 (late 2022). +dnl +dnl This is not supported by SVr4 make (or SunOS 4, 4.3SD, etc), but works with +dnl a few others (i.e., GNU make and the non-POSIX "BSD" make): +dnl +dnl + This is a GNU make feature (since April 1988, but in turn from binutils, +dnl date unspecified). +dnl +dnl + It was adopted in NetBSD make in June 1995. +dnl +dnl + The other BSD make programs are derived from the NetBSD make (and for +dnl that reason are not actually different "implementations"). +dnl +dnl + Some features of NetBSD make were actually adapted from pmake, which +dnl began as a modified GNU make starting in 1993. +dnl +dnl + Version 3.8 of the dmake program in January 1992 also implemented this +dnl GNU make extension, but is less well known than the BSD make. +AC_DEFUN([CF_MAKE_PHONY],[ +AC_CACHE_CHECK(for \".PHONY\" make-support, cf_cv_make_PHONY,[ + rm -rf conftest* + ( + mkdir conftest || exit 1 + cd conftest + cat >makefile <<'CF_EOF' +.PHONY: always +DATA=0 +always: always.out + @echo "** making [$]@ [$](DATA)" +once: once.out + @echo "** making [$]@ [$](DATA)" +always.out: + @echo "** making [$]@ [$](DATA)" + echo [$](DATA) > [$]@ +once.out: + @echo "** making [$]@ [$](DATA)" + echo [$](DATA) > [$]@ +CF_EOF + for cf_data in 1 2 3 + do + ${MAKE:-make} always DATA=$cf_data + ${MAKE:-make} once DATA=$cf_data + ${MAKE:-make} -t always once + if test -f always ; then + echo "no (case 1)" > ../conftest.tmp + elif test ! -f always.out ; then + echo "no (case 2)" > ../conftest.tmp + elif test ! -f once.out ; then + echo "no (case 3)" > ../conftest.tmp + elif ! cmp -s always.out once.out ; then + echo "no (case 4)" > ../conftest.tmp + diff always.out once.out + else + cf_check="`cat always.out`" + if test "x$cf_check" != "x$cf_data" ; then + echo "no (case 5)" > ../conftest.tmp + else + echo yes > ../conftest.tmp + rm -f ./*.out + continue + fi + fi + break + done + ) >&AC_FD_CC 2>&1 + cf_cv_make_PHONY="`cat conftest.tmp`" + rm -rf conftest* +]) +MAKE_NO_PHONY="#" +MAKE_PHONY="#" +test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY= +test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY= +AC_SUBST(MAKE_NO_PHONY) +AC_SUBST(MAKE_PHONY) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32 +dnl ------------ +dnl Generate tags/TAGS targets for makefiles. Do not generate TAGS if we have +dnl a monocase filesystem. +AC_DEFUN([CF_MAKE_TAGS],[ +AC_REQUIRE([CF_MIXEDCASE_FILENAMES]) + +AC_CHECK_PROGS(CTAGS, exctags ctags) +AC_CHECK_PROGS(ETAGS, exetags etags) + +AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no) + +if test "$cf_cv_mixedcase" = yes ; then + AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no) +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +AC_SUBST(CTAGS) +AC_SUBST(ETAGS) + +AC_SUBST(MAKE_UPPER_TAGS) +AC_SUBST(MAKE_LOWER_TAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MATH_LIB version: 11 updated: 2022/07/27 19:01:48 +dnl ----------- +dnl Checks for libraries. At least one UNIX system, Apple Macintosh +dnl Rhapsody 5.5, does not have -lm. We cannot use the simpler +dnl AC_CHECK_LIB(m,sin), because that fails for C++. +AC_DEFUN([CF_MATH_LIB], +[ +AC_CACHE_CHECK(if -lm needed for math functions, + cf_cv_need_libm,[ + AC_TRY_LINK([ + #include + #include + #include + ], + [double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)], + [cf_cv_need_libm=no], + [cf_cv_need_libm=yes])]) + +if test "$cf_cv_need_libm" = yes +then + + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lm" + AC_CACHE_CHECK(if -lm is available for math functions, + cf_cv_have_libm,[ + AC_TRY_LINK([ + #include + #include + #include + ], + [double x = rand(); printf("result = %g\\n", ]ifelse([$2],,sin(x),$2)[)], + [cf_cv_have_libm=yes], + [cf_cv_have_libm=no])]) + LIBS="$cf_save_LIBS" + + if test "$cf_cv_have_libm" = yes + then + ifelse($1,,[CF_ADD_LIB(m)],[$1=-lm]) + fi +else + cf_cv_have_libm=yes +fi + +if test "$cf_cv_have_libm" = yes +then + AC_DEFINE(HAVE_MATH_FUNCS,1,[Define to 1 if math functions are available]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_MIXEDCASE_FILENAMES version: 9 updated: 2021/01/01 16:53:59 +dnl ---------------------- +dnl Check if the file-system supports mixed-case filenames. If we're able to +dnl create a lowercase name and see it as uppercase, it doesn't support that. +AC_DEFUN([CF_MIXEDCASE_FILENAMES], +[ +AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[ +if test "$cross_compiling" = yes ; then + case "$target_alias" in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi +]) +test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32 +dnl ---------- +dnl Write a debug message to config.log, along with the line number in the +dnl configure script. +AC_DEFUN([CF_MSG_LOG],[ +echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_CC_CHECK version: 6 updated: 2023/02/18 17:47:58 +dnl ------------------- +dnl Check if we can compile with ncurses' header file +dnl $1 is the cache variable to set +dnl $2 is the header-file to include +dnl $3 is the root name (ncurses or ncursesw) +AC_DEFUN([CF_NCURSES_CC_CHECK],[ + AC_TRY_COMPILE([ +]ifelse($3,ncursesw,[ +#define _XOPEN_SOURCE_EXTENDED +#undef HAVE_LIBUTF8_H /* in case we used CF_UTF8_LIB */ +#define HAVE_LIBUTF8_H /* to force ncurses' header file to use cchar_t */ +])[ +#include <$2>],[ +#ifdef NCURSES_VERSION +]ifelse($3,ncursesw,[ +#ifndef WACS_BSSB + #error WACS_BSSB is not defined +#endif +])[ +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + ] + ,[$1=$2] + ,[$1=no]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_CONFIG version: 28 updated: 2021/08/28 15:20:37 +dnl ----------------- +dnl Tie together the configure-script macros for ncurses, preferring these in +dnl order: +dnl a) ".pc" files for pkg-config, using $NCURSES_CONFIG_PKG +dnl b) the "-config" script from ncurses, using $NCURSES_CONFIG +dnl c) just plain libraries +dnl +dnl $1 is the root library name (default: "ncurses") +AC_DEFUN([CF_NCURSES_CONFIG],[ +AC_REQUIRE([CF_PKG_CONFIG]) +cf_ncuconfig_root=ifelse($1,,ncurses,$1) +cf_have_ncuconfig=no + +if test "x${PKG_CONFIG:=none}" != xnone; then + AC_MSG_CHECKING(pkg-config for $cf_ncuconfig_root) + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + AC_MSG_RESULT(yes) + + AC_MSG_CHECKING(if the $cf_ncuconfig_root package files work) + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[[89]]9@@*-W*) + CF_ADD_CFLAGS($cf_pkg_cflags) + CF_ADD_LIBS($cf_pkg_libs) + + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); mousemask(0,0); tigetstr((char *)0);], + [AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); }], + [cf_test_ncuconfig=yes], + [cf_test_ncuconfig=no], + [cf_test_ncuconfig=maybe])], + [cf_test_ncuconfig=no]) + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[[^ ]]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[[^ ]]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + + CF_APPEND_CFLAGS($cf_pkg_cflags) + CF_ADD_LIBS($cf_pkg_libs) + + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); mousemask(0,0); tigetstr((char *)0);], + [AC_TRY_RUN([#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); }], + [cf_have_ncuconfig=yes], + [cf_have_ncuconfig=no], + [cf_have_ncuconfig=maybe])], + [cf_have_ncuconfig=no]) + AC_MSG_RESULT($cf_have_ncuconfig) + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + CF_TERM_HEADER + fi + + else + AC_MSG_RESULT(no) + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + + CF_ACVERSION_CHECK(2.52, + [AC_CHECK_TOOLS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)], + [AC_PATH_PROGS(NCURSES_CONFIG, ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config, none)]) + + if test "$NCURSES_CONFIG" != none ; then + + CF_APPEND_CFLAGS(`$NCURSES_CONFIG --cflags`) + CF_ADD_LIBS(`$NCURSES_CONFIG --libs`) + + # even with config script, some packages use no-override for curses.h + CF_CURSES_HEADER(ifelse($1,,ncurses,$1)) + + dnl like CF_NCURSES_CPPFLAGS + AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) + + dnl like CF_NCURSES_LIBS + CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_ncuconfig_root) + AC_DEFINE_UNQUOTED($cf_nculib_ROOT) + + dnl like CF_NCURSES_VERSION + cf_cv_ncurses_version="`$NCURSES_CONFIG --version`" + + else + + CF_NCURSES_CPPFLAGS(ifelse($1,,ncurses,$1)) + CF_NCURSES_LIBS(ifelse($1,,ncurses,$1)) + + fi +else + NCURSES_CONFIG=none +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_CPPFLAGS version: 22 updated: 2021/01/02 09:31:20 +dnl ------------------- +dnl Look for the SVr4 curses clone 'ncurses' in the standard places, adjusting +dnl the CPPFLAGS variable so we can include its header. +dnl +dnl The header files may be installed as either curses.h, or ncurses.h (would +dnl be obsolete, except that some packagers prefer this name to distinguish it +dnl from a "native" curses implementation). If not installed for overwrite, +dnl the curses.h file would be in an ncurses subdirectory (e.g., +dnl /usr/include/ncurses), but someone may have installed overwriting the +dnl vendor's curses. Only very old versions (pre-1.9.2d, the first autoconf'd +dnl version) of ncurses don't define either __NCURSES_H or NCURSES_VERSION in +dnl the header. +dnl +dnl If the installer has set $CFLAGS or $CPPFLAGS so that the ncurses header +dnl is already in the include-path, don't even bother with this, since we cannot +dnl easily determine which file it is. In this case, it has to be . +dnl +dnl The optional parameter gives the root name of the library, in case it is +dnl not installed as the default curses library. That is how the +dnl wide-character version of ncurses is installed. +AC_DEFUN([CF_NCURSES_CPPFLAGS], +[AC_REQUIRE([CF_WITH_CURSES_DIR]) + +AC_PROVIDE([CF_CURSES_CPPFLAGS])dnl +cf_ncuhdr_root=ifelse($1,,ncurses,$1) + +test -n "$cf_cv_curses_dir" && \ +test "$cf_cv_curses_dir" != "no" && { \ + CF_ADD_INCDIR($cf_cv_curses_dir/include/$cf_ncuhdr_root) +} + +AC_CACHE_CHECK(for $cf_ncuhdr_root header in include-path, cf_cv_ncurses_h,[ + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + CF_NCURSES_CC_CHECK(cf_cv_ncurses_h,$cf_header,$1) + test "$cf_cv_ncurses_h" != no && break + done +]) + +CF_NCURSES_HEADER +CF_TERM_HEADER + +# some applications need this, but should check for NCURSES_VERSION +AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) + +CF_NCURSES_VERSION +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_EXT_FUNCS version: 4 updated: 2012/10/06 16:39:58 +dnl -------------------- +dnl Since 2007/11/17, ncurses has defined NCURSES_EXT_FUNCS; earlier versions +dnl may provide these functions. Define the symbol if it is not defined, and +dnl if it is valid. +AC_DEFUN([CF_NCURSES_EXT_FUNCS], +[ +AC_CACHE_CHECK(for ncurses extended functions,cf_cv_ncurses_ext_funcs,[ +AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}>], +[ +int x = NCURSES_EXT_FUNCS +],[cf_cv_ncurses_ext_funcs=defined],[ +AC_TRY_LINK([ +#include <${cf_cv_ncurses_header:-curses.h}>], +[ + (void) assume_default_colors (0, 0); + (void) curses_version (); + (void) define_key (0, 0); + (void) is_term_resized (0, 0); + (void) key_defined (0); + (void) keybound (0, 0); + (void) keyok (0, 0); + (void) resize_term (0, 0); + (void) resizeterm (0, 0); + (void) use_default_colors (); + (void) use_extended_names (0); + (void) wresize (0, 0, 0);], + [cf_cv_ncurses_ext_funcs=yes], + [cf_cv_ncurses_ext_funcs=no]) +]) +]) +test "$cf_cv_ncurses_ext_funcs" = yes && AC_DEFINE(NCURSES_EXT_FUNCS,1,[Define to 1 if we have ncurses extensions]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_HEADER version: 7 updated: 2021/01/04 19:33:05 +dnl ----------------- +dnl Find a "curses" header file, e.g,. "curses.h", or one of the more common +dnl variations of ncurses' installs. +dnl +dnl See also CF_CURSES_HEADER, which sets the same cache variable. +AC_DEFUN([CF_NCURSES_HEADER],[ + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +AC_CACHE_CHECK(for $cf_ncuhdr_root include-path, cf_cv_ncurses_h2,[ + test -n "$verbose" && echo + CF_HEADER_PATH(cf_search,$cf_ncuhdr_root) + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + CF_ADD_INCDIR($cf_incdir) + for cf_header in \ + ncurses.h \ + curses.h + do + CF_NCURSES_CC_CHECK(cf_cv_ncurses_h2,$cf_header,$1) + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&AC_FD_MSG + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&AC_FD_MSG + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && AC_MSG_ERROR(not found) + ]) + + CF_DIRNAME(cf_1st_incdir,$cf_cv_ncurses_h2) + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + CF_ADD_INCDIR($cf_1st_incdir) + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + AC_DEFINE(HAVE_NCURSES_H,1,[Define to 1 if we have ncurses.h]) + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + AC_DEFINE(HAVE_NCURSES_NCURSES_H,1,[Define to 1 if we have ncurses/ncurses.h]) + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + AC_DEFINE(HAVE_NCURSESW_NCURSES_H,1,[Define to 1 if we have ncursesw/ncurses.h]) + ;; +esac + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_LIBS version: 21 updated: 2021/09/04 06:37:12 +dnl --------------- +dnl Look for the ncurses library. This is a little complicated on Linux, +dnl because it may be linked with the gpm (general purpose mouse) library. +dnl Some distributions have gpm linked with (bsd) curses, which makes it +dnl unusable with ncurses. However, we don't want to link with gpm unless +dnl ncurses has a dependency, since gpm is normally set up as a shared library, +dnl and the linker will record a dependency. +dnl +dnl The optional parameter gives the root name of the library, in case it is +dnl not installed as the default curses library. That is how the +dnl wide-character version of ncurses is installed. +AC_DEFUN([CF_NCURSES_LIBS], +[AC_REQUIRE([CF_NCURSES_CPPFLAGS]) + +cf_nculib_root=ifelse($1,,ncurses,$1) + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +AC_CHECK_LIB(gpm,Gpm_Open, + [AC_CHECK_LIB(gpm,initscr, + [LIBS="$cf_ncurses_SAVE"], + [cf_ncurses_LIBS="-lgpm"])]) + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + AC_CHECK_LIB(mytinfo,tgoto,[cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS"]) + fi + ;; +esac + +CF_ADD_LIBS($cf_ncurses_LIBS) + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + CF_ADD_LIBS(-l$cf_nculib_root) +else + CF_FIND_LIBRARY($cf_nculib_root,$cf_nculib_root, + [#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr()], + initscr) +fi + +if test -n "$cf_ncurses_LIBS" ; then + AC_MSG_CHECKING(if we can link $cf_nculib_root without $cf_ncurses_LIBS) + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + AC_TRY_LINK([#include <${cf_cv_ncurses_header:-curses.h}>], + [initscr(); mousemask(0,0); tigetstr((char *)0);], + [AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no) + LIBS="$cf_ncurses_SAVE"]) +fi + +CF_UPPER(cf_nculib_ROOT,HAVE_LIB$cf_nculib_root) +AC_DEFINE_UNQUOTED($cf_nculib_ROOT) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_PTHREADS version: 3 updated: 2024/07/06 13:57:42 +dnl ------------------- +dnl Use this followup check, e.g., in CF_WITH_NCURSES_ETC, to ensure that we +dnl link with pthreads if ncurses uses it. +AC_DEFUN([CF_NCURSES_PTHREADS],[ +AC_CHECK_FUNC(_nc_init_pthreads, + cf_cv_ncurses_pthreads=yes, + cf_cv_ncurses_pthreads=no) +if test "$cf_cv_ncurses_pthreads" = yes +then + CF_ADD_LIBS(-lpthread) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_VERSION version: 18 updated: 2024/01/07 06:34:16 +dnl ------------------ +dnl Check for the version of ncurses, to aid in reporting bugs, etc. +dnl Call CF_CURSES_CPPFLAGS first, or CF_NCURSES_CPPFLAGS. We don't use +dnl AC_REQUIRE since that does not work with the shell's if/then/else/fi. +AC_DEFUN([CF_NCURSES_VERSION], +[ +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl +AC_CACHE_CHECK(for ncurses version, cf_cv_ncurses_version,[ + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + AC_TRY_RUN([ +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +}],[ + cf_cv_ncurses_version=`cat $cf_tempfile`],,[ + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&AC_FD_CC | grep '^Autoconf ' >conftest.out" + AC_TRY_EVAL(cf_try) + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[[^"]]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi +]) + rm -f "$cf_tempfile" +]) +test "$cf_cv_ncurses_version" = no || AC_DEFINE(NCURSES,1,[Define to 1 if we are using ncurses headers/libraries]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NCURSES_WRAP_PREFIX version: 1 updated: 2009/03/28 16:08:10 +dnl ---------------------- +dnl Check for ncurses "wrap-prefix" used for public variables which have been +dnl wrapped with a function to help with concurrency control. +AC_DEFUN([CF_NCURSES_WRAP_PREFIX], +[ +AC_MSG_CHECKING(for ncurses wrap-prefix) +AC_ARG_WITH(ncurses-wrap-prefix, + [ --with-ncurses-wrap-prefix naming-prefix for ncurses wrapped-variables], + [NCURSES_WRAP_PREFIX=$withval], + [NCURSES_WRAP_PREFIX=_nc_]) +AC_MSG_RESULT($NCURSES_WRAP_PREFIX) + +AC_SUBST(NCURSES_WRAP_PREFIX) +]) +dnl --------------------------------------------------------------------------- +dnl CF_NETBSD_FORM_H version: 2 updated: 2012/10/06 16:39:58 +dnl ---------------- +dnl Check for NetBSD's form.h, which is incompatible with SVr4 and ncurses. +dnl Some workarounds are needed in client programs to allow them to compile. +AC_DEFUN([CF_NETBSD_FORM_H],[ +AC_CACHE_CHECK(for NetBSD form.h,cf_cv_netbsd_form_h,[ +AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}> +#include +],[ + FORM *form; + int y = current_field(form)->cursor_ypos; + int x = current_field(form)->cursor_xpos; +],[cf_cv_netbsd_form_h=yes +],[cf_cv_netbsd_form_h=no]) +]) + +test "$cf_cv_netbsd_form_h" = yes && AC_DEFINE(HAVE_NETBSD_FORM_H,1,[Define to 1 if we appear to be using NetBSD form.h]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NETBSD_MENU_H version: 2 updated: 2012/10/06 16:39:58 +dnl ---------------- +dnl Check for NetBSD's menu.h, which is incompatible with SVr4 and ncurses. +dnl Some workarounds are needed in client programs to allow them to compile. +AC_DEFUN([CF_NETBSD_MENU_H],[ +AC_CACHE_CHECK(for NetBSD menu.h,cf_cv_netbsd_menu_h,[ +AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}> +#include +],[ + MENU *menu; + int y = menu->max_item_width; +],[cf_cv_netbsd_menu_h=yes +],[cf_cv_netbsd_menu_h=no]) +]) + +test "$cf_cv_netbsd_menu_h" = yes && AC_DEFINE(HAVE_NETBSD_MENU_H,1,[Define to 1 if we appear to be using NetBSD menu.h]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NO_LEAKS_OPTION version: 9 updated: 2021/06/13 19:45:41 +dnl ------------------ +dnl see CF_WITH_NO_LEAKS +dnl +dnl $1 = option/name +dnl $2 = help-text +dnl $3 = symbol to define if the option is set +dnl $4 = additional actions to take if the option is set +AC_DEFUN([CF_NO_LEAKS_OPTION],[ +AC_MSG_CHECKING(if you want to use $1 for testing) +AC_ARG_WITH($1, + [$2], + [case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_$1=yes + AC_DEFINE_UNQUOTED($3,1,"Define to 1 if you want to use $1 for testing.")ifelse([$4],,[ + $4 +]) + ;; + esac], + [with_$1=]) +AC_MSG_RESULT(${with_$1:-no}) + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + CF_ADD_CFLAGS([-g]) + ;; + esac + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATH_SYNTAX version: 19 updated: 2024/08/03 13:08:58 +dnl -------------- +dnl Check the argument to see that it looks like a pathname. Rewrite it if it +dnl begins with one of the prefix/exec_prefix variables, and then again if the +dnl result begins with 'NONE'. This is necessary to work around autoconf's +dnl delayed evaluation of those symbols. +AC_DEFUN([CF_PATH_SYNTAX],[ +AC_REQUIRE([CF_GLOB_FULLPATH])dnl + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x[$]$1" in +(x\[$]\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\[$]\{*prefix\}*|x\[$]\{*dir\}*) + eval $1="[$]$1" + case "x[$]$1" in + (xNONE/*) + $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + $1=`echo "[$]$1" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PDCURSES_X11 version: 15 updated: 2021/01/02 09:31:20 +dnl --------------- +dnl Configure for PDCurses' X11 library +AC_DEFUN([CF_PDCURSES_X11],[ +AC_REQUIRE([CF_X_ATHENA]) + +CF_ACVERSION_CHECK(2.52, + [AC_CHECK_TOOLS(XCURSES_CONFIG, xcurses-config, none)], + [AC_PATH_PROGS(XCURSES_CONFIG, xcurses-config, none)]) + +if test "$XCURSES_CONFIG" != none ; then + +CF_ADD_CFLAGS(`$XCURSES_CONFIG --cflags`) +CF_ADD_LIBS(`$XCURSES_CONFIG --libs`) + +cf_cv_lib_XCurses=yes + +else + +LDFLAGS="$LDFLAGS $X_LIBS" +CF_CHECK_CFLAGS($X_CFLAGS) +AC_CHECK_LIB(X11,XOpenDisplay, + [CF_ADD_LIBS(-lX11)],, + [$X_PRE_LIBS $LIBS $X_EXTRA_LIBS]) +AC_CACHE_CHECK(for XCurses library,cf_cv_lib_XCurses,[ +CF_ADD_LIBS(-lXCurses) +AC_TRY_LINK([ +#include +char *XCursesProgramName = "test"; +],[XCursesExit();], +[cf_cv_lib_XCurses=yes], +[cf_cv_lib_XCurses=no]) +]) + +fi + +if test "$cf_cv_lib_XCurses" = yes ; then + AC_DEFINE(UNIX,1,[Define to 1 if using PDCurses on Unix]) + AC_DEFINE(XCURSES,1,[Define to 1 if using PDCurses on Unix]) + AC_CHECK_HEADER(xcurses.h, AC_DEFINE(HAVE_XCURSES,1,[Define to 1 if using PDCurses on Unix])) +else + AC_MSG_ERROR(Cannot link with XCurses) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PKG_CONFIG version: 13 updated: 2023/10/28 11:59:01 +dnl ------------- +dnl Check for the package-config program, unless disabled by command-line. +dnl +dnl Sets $PKG_CONFIG to the pathname of the pkg-config program. +AC_DEFUN([CF_PKG_CONFIG], +[ +AC_MSG_CHECKING(if you want to use pkg-config) +AC_ARG_WITH(pkg-config, + [[ --with-pkg-config[=CMD] enable/disable use of pkg-config and its name CMD]], + [cf_pkg_config=$withval], + [cf_pkg_config=yes]) +AC_MSG_RESULT($cf_pkg_config) + +case "$cf_pkg_config" in +(no) + PKG_CONFIG=none + ;; +(yes) + CF_ACVERSION_CHECK(2.52, + [AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)], + [AC_PATH_PROG(PKG_CONFIG, pkg-config, none)]) + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + CF_PATH_SYNTAX(PKG_CONFIG) +elif test "x$cf_pkg_config" != xno ; then + AC_MSG_WARN(pkg-config is not installed) +fi + +AC_SUBST(PKG_CONFIG) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_C_SOURCE version: 12 updated: 2023/02/18 17:41:25 +dnl ----------------- +dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed. +dnl +dnl POSIX.1-1990 _POSIX_SOURCE +dnl POSIX.1-1990 and _POSIX_SOURCE and +dnl POSIX.2-1992 C-Language _POSIX_C_SOURCE=2 +dnl Bindings Option +dnl POSIX.1b-1993 _POSIX_C_SOURCE=199309L +dnl POSIX.1c-1996 _POSIX_C_SOURCE=199506L +dnl X/Open 2000 _POSIX_C_SOURCE=200112L +dnl +dnl Parameters: +dnl $1 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_POSIX_C_SOURCE], +[AC_REQUIRE([CF_POSIX_VISIBLE])dnl + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1]) + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE) +CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE) + +AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[ + CF_MSG_LOG(if the symbol is already defined go no further) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif], + [cf_cv_posix_c_source=no], + [cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[[12]]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + AC_TRY_COMPILE([#include ],[ +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif],[], + cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE") + fi + CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE) + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source) + CF_MSG_LOG(if the second compile does not leave our definition intact error) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif],, + [cf_cv_posix_c_source=no]) + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + ]) +]) + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_ADD_CFLAGS($cf_cv_posix_c_source) +fi + +fi # cf_cv_posix_visible + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17 +dnl ---------------- +dnl POSIX documents test-macros which an application may set before any system +dnl headers are included to make features available. +dnl +dnl Some BSD platforms (originally FreeBSD, but copied by a few others) +dnl diverged from POSIX in 2002 by setting symbols which make all of the most +dnl recent features visible in the system header files unless the application +dnl overrides the corresponding test-macros. Doing that introduces portability +dnl problems. +dnl +dnl This macro makes a special check for the symbols used for this, to avoid a +dnl conflicting definition. +AC_DEFUN([CF_POSIX_VISIBLE], +[ +AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[ +AC_TRY_COMPILE([#include ],[ +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif +],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PRG_RULES version: 2 updated: 2021/01/01 13:31:04 +dnl ------------ +dnl Append definitions and rules for the given programs to the subdirectory +dnl Makefiles, and the recursion rule for the top-level Makefile. +dnl +dnl parameters +dnl $1 = script to run +dnl $2 = list of subdirectories +dnl +dnl variables +dnl $AWK +AC_DEFUN([CF_PRG_RULES], +[ +for cf_dir in $2 +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + elif test -f "$srcdir/$cf_dir/programs" ; then + $AWK -f $1 "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile + fi +done + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54 +dnl ---------- +dnl standard check for CC, plus followup sanity checks +dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name +AC_DEFUN([CF_PROG_CC],[ +CF_ACVERSION_CHECK(2.53, + [AC_MSG_WARN(this will incorrectly handle gnatgcc choice) + AC_REQUIRE([AC_PROG_CC])], + []) +ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)]) +CF_GCC_VERSION +CF_ACVERSION_CHECK(2.52, + [AC_PROG_CC_STDC], + [CF_ANSI_CC_REQD]) +CF_CC_ENV_FLAGS +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_INSTALL version: 11 updated: 2024/08/03 13:08:58 +dnl --------------- +dnl Force $INSTALL to be an absolute-path. Otherwise, edit_man.sh and the +dnl misc/tabset install won't work properly. Usually this happens only when +dnl using the fallback mkinstalldirs script +AC_DEFUN([CF_PROG_INSTALL], +[AC_PROG_INSTALL +AC_REQUIRE([CF_GLOB_FULLPATH])dnl +case x$INSTALL in +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(*) + CF_DIRNAME(cf_dir,$INSTALL) + test -z "$cf_dir" && cf_dir=. + INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LINT version: 5 updated: 2022/08/20 15:44:13 +dnl ------------ +AC_DEFUN([CF_PROG_LINT], +[ +AC_CHECK_PROGS(LINT, lint cppcheck splint) +case "x$LINT" in +(xcppcheck|x*/cppcheck) + test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" + ;; +esac +AC_SUBST(LINT_OPTS) +AC_SUBST(LINT_LIBS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_CFLAGS version: 3 updated: 2021/09/05 17:25:40 +dnl ---------------- +dnl Remove a given option from CFLAGS/CPPFLAGS +dnl $1 = option to remove +dnl $2 = variable to update +dnl $3 = nonempty to allow verbose message +define([CF_REMOVE_CFLAGS], +[ +cf_tmp_cflag=`echo "x$1" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x[$]$2" | sed -e 's/^.//' -e 's/[[ ]][[ ]]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[[^ ]][[^ ]]*\\)\?%%" -e 's/^[[ ]]*//' -e 's%[[ ]][[ ]]*-D% -D%g' -e 's%[[ ]][[ ]]*-I% -I%g'` + test "[$]$2" != "$cf_old_cflag" || break + ifelse([$3],,,[CF_VERBOSE(removing old option $1 from $2)]) + $2="$cf_old_cflag" +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 +dnl ---------------- +dnl Remove all -U and -D options that refer to the given symbol from a list +dnl of C compiler options. This works around the problem that not all +dnl compilers process -U and -D options from left-to-right, so a -U option +dnl cannot be used to cancel the effect of a preceding -D option. +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = symbol to remove +define([CF_REMOVE_DEFINE], +[ +$1=`echo "$2" | \ + sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ + -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45 +dnl --------------------- +dnl Restore flags saved in CF_SAVE_XTRA_FLAGS +dnl $1 = name of current macro +define([CF_RESTORE_XTRA_FLAGS], +[ +LIBS="$cf_save_LIBS_$1" +CFLAGS="$cf_save_CFLAGS_$1" +CPPFLAGS="$cf_save_CPPFLAGS_$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RPATH_HACK version: 13 updated: 2021/01/03 18:30:50 +dnl ------------- +AC_DEFUN([CF_RPATH_HACK], +[AC_REQUIRE([AC_PROG_FGREP])dnl +AC_REQUIRE([CF_LD_RPATH_OPT])dnl + +AC_MSG_CHECKING(for updated LDFLAGS) +if test -n "$LD_RPATH_OPT" ; then + AC_MSG_RESULT(maybe) + + AC_CHECK_PROGS(cf_ldd_prog,ldd,no) + cf_rpath_list="/usr/lib /lib" + if test "$cf_ldd_prog" != no + then + cf_rpath_oops= + +AC_TRY_LINK([#include ], + [printf("Hello");], + [cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq` + cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort | uniq`]) + + # If we passed the link-test, but get a "not found" on a given library, + # this could be due to inept reconfiguration of gcc to make it only + # partly honor /usr/local/lib (or whatever). Sometimes this behavior + # is intentional, e.g., installing gcc in /usr/bin and suppressing the + # /usr/local libraries. + if test -n "$cf_rpath_oops" + then + for cf_rpath_src in $cf_rpath_oops + do + for cf_rpath_dir in \ + /usr/local \ + /usr/pkg \ + /opt/sfw + do + if test -f "$cf_rpath_dir/lib/$cf_rpath_src" + then + CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src) + LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib" + break + fi + done + done + fi + fi + + CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS) + + CF_RPATH_HACK_2(LDFLAGS) + CF_RPATH_HACK_2(LIBS) + + CF_VERBOSE(...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS) +else + AC_MSG_RESULT(no) +fi +AC_SUBST(EXTRA_LDFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RPATH_HACK_2 version: 8 updated: 2021/01/01 13:31:04 +dnl --------------- +dnl Do one set of substitutions for CF_RPATH_HACK, adding an rpath option to +dnl EXTRA_LDFLAGS for each -L option found. +dnl +dnl $cf_rpath_list contains a list of directories to ignore. +dnl +dnl $1 = variable name to update. The LDFLAGS variable should be the only one, +dnl but LIBS often has misplaced -L options. +AC_DEFUN([CF_RPATH_HACK_2], +[ +CF_VERBOSE(...checking $1 [$]$1) + +cf_rpath_dst= +for cf_rpath_src in [$]$1 +do + case "$cf_rpath_src" in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + CF_VERBOSE(...Filter $cf_rpath_src ->$cf_rpath_tmp) + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +$1=$cf_rpath_dst + +CF_VERBOSE(...checked $1 [$]$1) +AC_SUBST(EXTRA_LDFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44 +dnl ------------------ +dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers +dnl and libraries which do not update those variables. +dnl +dnl $1 = name of current macro +define([CF_SAVE_XTRA_FLAGS], +[ +cf_save_LIBS_$1="$LIBS" +cf_save_CFLAGS_$1="$CFLAGS" +cf_save_CPPFLAGS_$1="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[[IUD]]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SIGWINCH version: 7 updated: 2023/02/18 17:41:25 +dnl ----------- +dnl Use this macro after CF_XOPEN_SOURCE, but do not require it (not all +dnl programs need this test). +dnl +dnl This is really a Mac OS X 10.4.3 workaround. Defining _POSIX_C_SOURCE +dnl forces SIGWINCH to be undefined (breaks xterm, ncurses). Oddly, the struct +dnl winsize declaration is left alone - we may revisit this if Apple choose to +dnl break that part of the interface as well. +AC_DEFUN([CF_SIGWINCH], +[ +AC_CACHE_CHECK(if SIGWINCH is defined,cf_cv_define_sigwinch,[ + AC_TRY_COMPILE([ +#include +#include +],[int x = SIGWINCH; (void)x], + [cf_cv_define_sigwinch=yes], + [AC_TRY_COMPILE([ +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include +],[int x = SIGWINCH; (void)x], + [cf_cv_define_sigwinch=maybe], + [cf_cv_define_sigwinch=no]) +]) +]) + +if test "$cf_cv_define_sigwinch" = maybe ; then +AC_CACHE_CHECK(for actual SIGWINCH definition,cf_cv_fixup_sigwinch,[ +cf_cv_fixup_sigwinch=unknown +cf_sigwinch=32 +while test "$cf_sigwinch" != 1 +do + AC_TRY_COMPILE([ +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include +],[ +#if SIGWINCH != $cf_sigwinch +#error SIGWINCH is not $cf_sigwinch +#endif +int x = SIGWINCH; (void)x], + [cf_cv_fixup_sigwinch=$cf_sigwinch + break]) + +cf_sigwinch="`expr "$cf_sigwinch" - 1`" +done +]) + + if test "$cf_cv_fixup_sigwinch" != unknown ; then + CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch" + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SIG_ATOMIC_T version: 5 updated: 2020/03/10 18:53:47 +dnl --------------- +dnl signal handler, but there are some gcc dependencies in that recommendation. +dnl Try anyway. +AC_DEFUN([CF_SIG_ATOMIC_T], +[ +AC_MSG_CHECKING(for signal global datatype) +AC_CACHE_VAL(cf_cv_sig_atomic_t,[ + for cf_type in \ + "volatile sig_atomic_t" \ + "sig_atomic_t" \ + "int" + do + AC_TRY_COMPILE([ +#include +#include +#include + +extern $cf_type x; +$cf_type x; +static void handler(int sig) +{ + (void)sig; + x = 5; +}], + [signal(SIGINT, handler); + x = 1], + [cf_cv_sig_atomic_t=$cf_type], + [cf_cv_sig_atomic_t=no]) + test "$cf_cv_sig_atomic_t" != no && break + done + ]) +AC_MSG_RESULT($cf_cv_sig_atomic_t) +test "$cf_cv_sig_atomic_t" != no && AC_DEFINE_UNQUOTED(SIG_ATOMIC_T, $cf_cv_sig_atomic_t,[Define to signal global datatype]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SUBDIR_PATH version: 7 updated: 2014/12/04 04:33:06 +dnl -------------- +dnl Construct a search-list for a nonstandard header/lib-file +dnl $1 = the variable to return as result +dnl $2 = the package name +dnl $3 = the subdirectory, e.g., bin, include or lib +AC_DEFUN([CF_SUBDIR_PATH], +[ +$1= + +CF_ADD_SUBDIR_PATH($1,$2,$3,$prefix,NONE) + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + [$]HOME +do + CF_ADD_SUBDIR_PATH($1,$2,$3,$cf_subdir_prefix,$prefix) +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SYS_TIME_SELECT version: 6 updated: 2015/04/18 08:56:57 +dnl ------------------ +dnl Check if we can include with ; this breaks on +dnl older SCO configurations. +AC_DEFUN([CF_SYS_TIME_SELECT], +[ +AC_MSG_CHECKING(if sys/time.h works with sys/select.h) +AC_CACHE_VAL(cf_cv_sys_time_select,[ +AC_TRY_COMPILE([ +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +],[],[cf_cv_sys_time_select=yes], + [cf_cv_sys_time_select=no]) + ]) +AC_MSG_RESULT($cf_cv_sys_time_select) +test "$cf_cv_sys_time_select" = yes && AC_DEFINE(HAVE_SYS_TIME_SELECT,1,[Define to 1 if we can include with ]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TERM_HEADER version: 6 updated: 2021/01/02 09:31:20 +dnl -------------- +dnl Look for term.h, which is part of X/Open curses. It defines the interface +dnl to terminfo database. Usually it is in the same include-path as curses.h, +dnl but some packagers change this, breaking various applications. +AC_DEFUN([CF_TERM_HEADER],[ +AC_CACHE_CHECK(for terminfo header, cf_cv_term_header,[ +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[[^.]]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +AC_TRY_COMPILE([#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> +],[int x = auto_left_margin; (void)x],[ + cf_cv_term_header="$cf_test"],[ + cf_cv_term_header=unknown + ]) + test "$cf_cv_term_header" != unknown && break +done +]) + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + AC_DEFINE(HAVE_TERM_H,1,[Define to 1 if we have term.h]) + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + AC_DEFINE(HAVE_NCURSES_TERM_H,1,[Define to 1 if we have ncurses/term.h]) + ;; +(ncursesw/term.h) + AC_DEFINE(HAVE_NCURSESW_TERM_H,1,[Define to 1 if we have ncursesw/term.h]) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TOP_BUILDDIR version: 2 updated: 2013/07/27 17:38:32 +dnl --------------- +dnl Define a top_builddir symbol, for applications that need an absolute path. +AC_DEFUN([CF_TOP_BUILDDIR], +[ +top_builddir=ifelse($1,,`pwd`,$1) +AC_SUBST(top_builddir) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TPUTS_PROTO version: 4 updated: 2021/01/04 19:45:09 +dnl -------------- +dnl Check for type of function-pointer passed to tputs. Some old +dnl implementations used functions that had different prototypes, making it +dnl hard to compile portable programs using tputs. +AC_DEFUN([CF_TPUTS_PROTO],[ +CF_CURSES_FUNCS(tputs) +if test "x$cf_cv_func_tputs" = xyes +then + cf_done=no + for cf_arg in int char + do + for cf_ret in int void + do + if test "$cf_ret" = void + then + cf_return="/* nothing */" + else + cf_return="return value" + fi + AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_cv_term_header> + +static $cf_ret outc($cf_arg value) { $cf_return; } +],[ + tputs("hello", 0, outc); + ${cf_cv_main_return:-return}(0); +],[ + CF_VERBOSE([prototype $cf_ret func($cf_arg value)]) + cat >>confdefs.h </dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "$1" 2>/dev/null`" + CF_VERBOSE(package $1 CFLAGS: $cf_pkgconfig_incs) + CF_VERBOSE(package $1 LIBS: $cf_pkgconfig_libs) + CF_ADD_CFLAGS($cf_pkgconfig_incs) + CF_ADD_LIBS($cf_pkgconfig_libs) + ifelse([$2],,:,[$2]) +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + ifelse([$3],,:,[$3]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_TRY_XOPEN_SOURCE version: 4 updated: 2022/09/10 15:16:16 +dnl ------------------- +dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we +dnl can define it successfully. +AC_DEFUN([CF_TRY_XOPEN_SOURCE],[ +AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[ + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY, + [cf_cv_xopen_source=no], + [cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE) + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY, + [cf_cv_xopen_source=no], + [cf_cv_xopen_source=$cf_XOPEN_SOURCE]) + CPPFLAGS="$cf_save" + ]) +]) + +if test "$cf_cv_xopen_source" != no ; then + CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE) + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE) + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + CF_APPEND_CFLAGS($cf_temp_xopen_source) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59 +dnl -------- +dnl Make an uppercase version of a variable +dnl $1=uppercase($2) +AC_DEFUN([CF_UPPER], +[ +$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTF8_LIB version: 11 updated: 2024/08/10 10:23:45 +dnl ----------- +dnl Check for multibyte support, and if not found, utf8 compatibility library +AC_DEFUN([CF_UTF8_LIB], +[ +AC_CHECK_HEADERS(wchar.h) +AC_CACHE_CHECK(for multibyte character support,cf_cv_utf8_lib,[ + cf_save_LIBS="$LIBS" + AC_TRY_LINK([ +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif +],[putwc(0,0);], + [cf_cv_utf8_lib=yes], + [CF_FIND_LINKAGE([ +#include ],[putwc(0,0);],utf8, + [cf_cv_utf8_lib=add-on], + [cf_cv_utf8_lib=no]) +])]) + +# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between +# ncurses/ncursesw: +if test "$cf_cv_utf8_lib" = "add-on" ; then + AC_DEFINE(HAVE_LIBUTF8_H,1,[Define to 1 if we should include libutf8.h]) + CF_ADD_INCDIR($cf_cv_header_path_utf8) + CF_ADD_LIBDIR($cf_cv_library_path_utf8) + CF_ADD_LIBS($cf_cv_library_file_utf8) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12 +dnl ---------- +dnl Use AC_VERBOSE w/o the warnings +AC_DEFUN([CF_VERBOSE], +[test -n "$verbose" && echo " $1" 1>&AC_FD_MSG +CF_MSG_LOG([$1]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WCHAR_TYPE version: 5 updated: 2023/12/03 09:21:34 +dnl ------------- +dnl Check if type wide-character type $1 is declared, and if so, which header +dnl file is needed. The second parameter is used to set a shell variable when +dnl the type is not found. The first parameter sets a shell variable for the +dnl opposite sense. +AC_DEFUN([CF_WCHAR_TYPE], +[ +# This is needed on Tru64 5.0 to declare $1 +AC_CACHE_CHECK(if we must include wchar.h to declare $1,cf_cv_$1,[ +AC_TRY_COMPILE([ +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif], + [$1 state; (void)state], + [cf_cv_$1=no], + [AC_TRY_COMPILE([ +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif], + [$1 value; (void) value], + [cf_cv_$1=yes], + [cf_cv_$1=unknown])])]) + +if test "$cf_cv_$1" = yes ; then + AC_DEFINE(NEED_WCHAR_H,1,[Define to 1 if we must include wchar.h]) + NEED_WCHAR_H=1 +fi + +ifelse([$2],,,[ +# if we do not find $1 in either place, use substitution to provide a fallback. +if test "$cf_cv_$1" = unknown ; then + $2=1 +fi +]) +ifelse($3,,,[ +# if we find $1 in either place, use substitution to provide a fallback. +if test "$cf_cv_$1" != unknown ; then + $3=1 +fi +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_CURSES_DIR version: 4 updated: 2021/01/02 19:22:58 +dnl ------------------ +dnl Wrapper for AC_ARG_WITH to specify directory under which to look for curses +dnl libraries. +AC_DEFUN([CF_WITH_CURSES_DIR],[ + +AC_MSG_CHECKING(for specific curses-directory) +AC_ARG_WITH(curses-dir, + [ --with-curses-dir=DIR directory in which (n)curses is installed], + [cf_cv_curses_dir=$withval], + [cf_cv_curses_dir=no]) +AC_MSG_RESULT($cf_cv_curses_dir) + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + CF_PATH_SYNTAX(withval) + if test -d "$cf_cv_curses_dir" + then + CF_ADD_INCDIR($cf_cv_curses_dir/include) + CF_ADD_LIBDIR($cf_cv_curses_dir/lib) + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl ---------------- +dnl Configure-option for dbmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DBMALLOC],[ +CF_NO_LEAKS_OPTION(dbmalloc, + [ --with-dbmalloc test: use Conor Cahill's dbmalloc library], + [USE_DBMALLOC]) + +if test "$with_dbmalloc" = yes ; then + AC_CHECK_HEADER(dbmalloc.h, + [AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl --------------- +dnl Configure-option for dmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DMALLOC],[ +CF_NO_LEAKS_OPTION(dmalloc, + [ --with-dmalloc test: use Gray Watson's dmalloc library], + [USE_DMALLOC]) + +if test "$with_dmalloc" = yes ; then + AC_CHECK_HEADER(dmalloc.h, + [AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_LIB_BASENAME version: 2 updated: 2023/11/22 20:48:30 +dnl -------------------- +dnl Allow for overriding the basename of a library, i.e., the part to which +dnl prefixes/suffixes are attached. +dnl +dnl $1 = variable to set +dnl $2 = option name +dnl $3 = default basename for library, if omitted use $2 +AC_DEFUN([CF_WITH_LIB_BASENAME], +[ +AC_MSG_CHECKING(for desired basename for $2 library) +AC_ARG_WITH($2-libname, + [[ --with-$2-libname[=XXX] override ifelse($3,,$2,$3) basename of library]], + [with_lib_basename=$withval], + [with_lib_basename=ifelse($3,,$2,$3)]) +$1="$with_lib_basename" + +case "x[$]$1" in +(x|xno|xnone|xyes) + $1=ifelse($3,,$2,$3) + ;; +(*) + ;; +esac + +AC_MSG_RESULT([$]$1) +AC_SUBST($1) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_NCURSES_ETC version: 6 updated: 2023/01/16 10:10:06 +dnl ------------------- +dnl Use this macro for programs which use any variant of "curses", e.g., +dnl "ncurses", and "PDCurses". Programs that can use curses and some unrelated +dnl library (such as slang) should use a "--with-screen=XXX" option. +dnl +dnl This does not use AC_DEFUN, because that would tell autoconf to run each +dnl of the macros inside this one - before this macro. +define([CF_WITH_NCURSES_ETC],[ +CF_WITH_CURSES_DIR + +cf_cv_screen=curses + +AC_MSG_CHECKING(for specified curses library type) +AC_ARG_WITH(screen, + [ --with-screen=XXX use specified curses-libraries], + [cf_cv_screen=$withval],[ + +AC_ARG_WITH(ncursesw, + [ --with-ncursesw use wide ncurses-libraries], + [cf_cv_screen=ncursesw],[ + +AC_ARG_WITH(ncurses, + [ --with-ncurses use ncurses-libraries], + [cf_cv_screen=ncurses],[ + +AC_ARG_WITH(pdcurses, + [ --with-pdcurses compile/link with pdcurses X11 library], + [cf_cv_screen=pdcurses],[ + +AC_ARG_WITH(curses-colr, + [ --with-curses-colr compile/link with HPUX 10.x color-curses], + [cf_cv_screen=curses_colr],[ + +AC_ARG_WITH(curses-5lib, + [ --with-curses-5lib compile/link with SunOS 5lib curses], + [cf_cv_screen=curses_5lib])])])])])]) + +AC_MSG_RESULT($cf_cv_screen) + +case $cf_cv_screen in +(curses|curses_*) + CF_CURSES_CONFIG + ;; +(ncursesw*) + CF_UTF8_LIB + CF_NCURSES_CONFIG($cf_cv_screen) + ;; +(ncurses*) + CF_NCURSES_CONFIG($cf_cv_screen) + ;; +(pdcurses) + CF_PDCURSES_X11 + ;; +(*) + AC_MSG_ERROR(unexpected screen-value: $cf_cv_screen) + ;; +esac + +CF_NCURSES_PTHREADS($cf_cv_screen) +AC_SUBST(cf_cv_screen) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_SCREEN_PDCURSES version: 1 updated: 2020/08/28 16:56:27 +dnl ----------------------- +dnl Call this macro before CF_ENABLE_WARNINGS for configure scripts which use +dnl the "--with-screen=pdcurses" selection. Doing that allows the configure +dnl script to search for the X11/Xt header files to declare (or not) the +dnl symbol needed to enable "const" in those header files. If that configure +dnl option is not used, then those checks are unnecessary. +AC_DEFUN([CF_WITH_SCREEN_PDCURSES],[ +AC_PROVIDE([AC_PATH_XTRA]) +AC_PROVIDE([AC_PATH_X]) +if test -n "$with_screen" && test "x$with_screen" = "xpdcurses" +then + AC_PATH_X + AC_PATH_XTRA +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_SYSTYPE version: 1 updated: 2013/01/26 16:26:12 +dnl --------------- +dnl For testing, override the derived host system-type which is used to decide +dnl things such as the linker commands used to build shared libraries. This is +dnl normally chosen automatically based on the type of system which you are +dnl building on. We use it for testing the configure script. +dnl +dnl This is different from the --host option: it is used only for testing parts +dnl of the configure script which would not be reachable with --host since that +dnl relies on the build environment being real, rather than mocked up. +AC_DEFUN([CF_WITH_SYSTYPE],[ +CF_CHECK_CACHE([AC_CANONICAL_SYSTEM]) +AC_ARG_WITH(system-type, + [ --with-system-type=XXX test: override derived host system-type], +[AC_MSG_WARN(overriding system type to $withval) + cf_cv_system_name=$withval + host_os=$withval +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_VALGRIND version: 1 updated: 2006/12/14 18:00:21 +dnl ---------------- +AC_DEFUN([CF_WITH_VALGRIND],[ +CF_NO_LEAKS_OPTION(valgrind, + [ --with-valgrind test: use valgrind], + [USE_VALGRIND]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_X11_RGB version: 3 updated: 2023/10/28 11:59:01 +dnl --------------- +dnl Handle configure option "--with-x11-rgb", setting these shell +dnl variables: +dnl +dnl $RGB_PATH is the option value, used for finding the X11 rgb file. +dnl $no_x11_rgb is a "#" (comment) if "--without-x11-rgb" is given. +dnl +dnl Most Linux's use this: +dnl /usr/share/X11/rgb.txt +dnl Debian uses this: +dnl /etc/X11/rgb.txt +dnl DragonFlyBSD ports uses this: +dnl /usr/pkg/lib/X11/rgb.txt +dnl FreeBSD ports use these: +dnl /usr/local/lib/X11/rgb.txt +dnl /usr/local/share/X11/rgb.txt +dnl Mandriva has these: +dnl /usr/lib/X11/rgb.txt +dnl /usr/lib64/X11/rgb.txt +dnl NetBSD has these +dnl /usr/X11R7/lib/X11/rgb.txt +dnl OpenSolaris uses +dnl 32-bit: +dnl /usr/X11/etc/X11/rgb.txt +dnl /usr/X11/share/X11/rgb.txt +dnl /usr/X11/lib/X11/rgb.txt +dnl OSX uses +dnl /opt/local/share/X11/rgb.txt (MacPorts) +dnl /opt/X11/share/X11/rgb.txt (non-ports) +dnl 64-bit: +dnl /usr/X11/etc/X11/rgb.txt +dnl /usr/X11/share/X11/rgb.txt (perhaps) +dnl /usr/X11/lib/amd64/X11/rgb.txt +dnl Solaris10 uses (in this order): +dnl /usr/openwin/lib/X11/rgb.txt +dnl /usr/X11/lib/X11/rgb.txt +AC_DEFUN([CF_WITH_X11_RGB],[ +AC_MSG_CHECKING(for X11 rgb file) +AC_ARG_WITH(x11-rgb, + [ --with-x11-rgb=FILE obtain X11 color definitions from FILE (default: EPREFIX/lib/X11/rgb.txt)], + [RGB_PATH=$withval], + [RGB_PATH=auto]) + +if test "x[$]RGB_PATH" = xauto +then + RGB_PATH='${exec_prefix}/lib/X11/rgb.txt' + for cf_path in \ + /opt/local/share/X11/rgb.txt \ + /opt/X11/share/X11/rgb.txt \ + /usr/share/X11/rgb.txt \ + /usr/X11/share/X11/rgb.txt \ + /usr/X11/lib/X11/rgb.txt \ + /usr/lib/X11/rgb.txt \ + /etc/X11/rgb.txt \ + /usr/pkg/lib/X11/rgb.txt \ + /usr/X11R7/lib/X11/rgb.txt \ + /usr/X11R6/lib/X11/rgb.txt \ + /usr/X11R5/lib/X11/rgb.txt \ + /usr/X11R4/lib/X11/rgb.txt \ + /usr/local/lib/X11/rgb.txt \ + /usr/local/share/X11/rgb.txt \ + /usr/lib64/X11/rgb.txt + do + if test -f "$cf_path" ; then + RGB_PATH="$cf_path" + break + fi + done +else + cf_path=$RGB_PATH + CF_PATH_SYNTAX(cf_path) +fi + +AC_MSG_RESULT($RGB_PATH) +AC_SUBST(RGB_PATH) +AC_DEFINE_UNQUOTED(RGB_PATH,"$cf_path",[Define to the full pathname of rgb.txt]) + +no_x11_rgb= +if test "$RGB_PATH" = no +then + no_x11_rgb="#" +fi +AC_SUBST(no_x11_rgb) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_XOPEN_CURSES version: 20 updated: 2024/01/07 06:54:12 +dnl --------------- +dnl Test if we should define X/Open source for curses, needed on Digital Unix +dnl 4.x, to see the extended functions, but breaks on IRIX 6.x. +dnl +dnl The getbegyx() check is needed for HPUX, which omits legacy macros such +dnl as getbegy(). The latter is better design, but the former is standard. +AC_DEFUN([CF_XOPEN_CURSES], +[ +AC_REQUIRE([CF_CURSES_CPPFLAGS])dnl +AC_CACHE_CHECK(definition to turn on extended curses functions,cf_cv_need_xopen_extension,[ +cf_cv_need_xopen_extension=unknown +AC_TRY_LINK([ +$ac_includes_default +#include <${cf_cv_ncurses_header:-curses.h}>],[ +#if defined(NCURSES_VERSION_PATCH) +#if (NCURSES_VERSION_PATCH < 20100501) && (NCURSES_VERSION_PATCH >= 20100403) + #error disallow ncurses versions between 2020/04/03 and 2010/05/01 +#endif +#endif +#ifdef NCURSES_WIDECHAR +#error prefer to fall-through on the second checks +#endif + static char dummy[10]; + cchar_t check; + int check2 = curs_set((int)sizeof(check)); + long x = winnstr(stdscr, dummy, 5); + int x1, y1; + (void)check2; + getbegyx(stdscr, y1, x1); + (void)x; + (void)y1; + (void)x1; + ], + [cf_cv_need_xopen_extension=none], + [ + for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR + do + AC_TRY_LINK([ +#define $cf_try_xopen_extension 1 +$ac_includes_default +#include <${cf_cv_ncurses_header:-curses.h}>],[ + static char dummy[10]; + cchar_t check; + int check2 = curs_set((int)sizeof(check)); + long x = winnstr(stdscr, dummy, 5); + int x1, y1; + getbegyx(stdscr, y1, x1); + (void)check2; + (void)x; + (void)y1; + (void)x1; + ], + [cf_cv_need_xopen_extension=$cf_try_xopen_extension; break]) + done + ]) +]) + +case "$cf_cv_need_xopen_extension" in +(*_*) + CF_APPEND_TEXT(CPPFLAGS,-D$cf_cv_need_xopen_extension) + ;; +esac + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_XOPEN_SOURCE version: 67 updated: 2023/09/06 18:55:27 +dnl --------------- +dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions, +dnl or adapt to the vendor's definitions to get equivalent functionality, +dnl without losing the common non-POSIX features. +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +dnl $2 is the nominal value for _POSIX_C_SOURCE +dnl +dnl The default case prefers _XOPEN_SOURCE over _POSIX_C_SOURCE if the +dnl implementation predefines it, because X/Open and most implementations agree +dnl that the latter is a legacy or "aligned" value. +dnl +dnl Because _XOPEN_SOURCE is preferred, if defining _POSIX_C_SOURCE turns +dnl that off, then refrain from setting _POSIX_C_SOURCE explicitly. +dnl +dnl References: +dnl https://pubs.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_02.html +dnl https://docs.oracle.com/cd/E19253-01/816-5175/standards-5/index.html +dnl https://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html +AC_DEFUN([CF_XOPEN_SOURCE],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([CF_POSIX_VISIBLE]) + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=ifelse([$1],,500,[$1]) +cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2]) +cf_xopen_source= + +case "$host_os" in +(aix[[4-7]]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(darwin[[0-8]].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[[56]].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin|msys|mingw*|linux*uclibc) + CF_GNU_SOURCE($cf_XOPEN_SOURCE) + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[[6-9]]*) + # OpenBSD 6.x has broken locale support, both compile-time and runtime. + # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + # Abusing the conformance level is a workaround. + AC_MSG_WARN(this system does not provide usable locale support) + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=700 + ;; +(openbsd[[4-5]]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[[45]]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + CF_TRY_XOPEN_SOURCE + cf_save_xopen_cppflags="$CPPFLAGS" + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + # Some of these niche implementations use copy/paste, double-check... + if test "$cf_cv_xopen_source" = no ; then + CF_VERBOSE(checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE) + AC_TRY_COMPILE(CF__XOPEN_SOURCE_HEAD,CF__XOPEN_SOURCE_BODY,,[ + AC_MSG_WARN(_POSIX_C_SOURCE definition is not usable) + CPPFLAGS="$cf_save_xopen_cppflags"]) + fi + ;; +esac + +if test -n "$cf_xopen_source" ; then + CF_APPEND_CFLAGS($cf_xopen_source,true) +fi + +dnl In anything but the default case, we may have system-specific setting +dnl which is still not guaranteed to provide all of the entrypoints that +dnl _XOPEN_SOURCE would yield. +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + AC_MSG_CHECKING(if _XOPEN_SOURCE really is set) + AC_TRY_COMPILE([#include ],[ +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif], + [cf_XOPEN_SOURCE_set=yes], + [cf_XOPEN_SOURCE_set=no]) + AC_MSG_RESULT($cf_XOPEN_SOURCE_set) + if test "$cf_XOPEN_SOURCE_set" = yes + then + AC_TRY_COMPILE([#include ],[ +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#error (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#endif], + [cf_XOPEN_SOURCE_set_ok=yes], + [cf_XOPEN_SOURCE_set_ok=no]) + if test "$cf_XOPEN_SOURCE_set_ok" = no + then + AC_MSG_WARN(_XOPEN_SOURCE is lower than requested) + fi + else + CF_TRY_XOPEN_SOURCE + fi +fi +fi # cf_cv_posix_visible +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_ATHENA version: 25 updated: 2023/01/11 04:05:23 +dnl ----------- +dnl Check for Xaw (Athena) libraries +dnl +dnl Sets $cf_x_athena according to the flavor of Xaw which is used. +AC_DEFUN([CF_X_ATHENA], +[ +cf_x_athena=${cf_x_athena:-Xaw} + +AC_MSG_CHECKING(if you want to link with Xaw 3d library) +withval= +AC_ARG_WITH(Xaw3d, + [ --with-Xaw3d link with Xaw 3d library]) +if test "$withval" = yes ; then + cf_x_athena=Xaw3d + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if you want to link with Xaw 3d xft library) +withval= +AC_ARG_WITH(Xaw3dxft, + [ --with-Xaw3dxft link with Xaw 3d xft library]) +if test "$withval" = yes ; then + cf_x_athena=Xaw3dxft + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if you want to link with neXT Athena library) +withval= +AC_ARG_WITH(neXtaw, + [ --with-neXtaw link with neXT Athena library]) +if test "$withval" = yes ; then + cf_x_athena=neXtaw + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if you want to link with Athena-Plus library) +withval= +AC_ARG_WITH(XawPlus, + [ --with-XawPlus link with Athena-Plus library]) +if test "$withval" = yes ; then + cf_x_athena=XawPlus + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +cf_x_athena_lib="" + +if test "$PKG_CONFIG" != none ; then + cf_athena_list= + test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6" + for cf_athena_pkg in \ + $cf_athena_list \ + ${cf_x_athena} \ + ${cf_x_athena}-devel \ + lib${cf_x_athena} \ + lib${cf_x_athena}-devel + do + CF_TRY_PKG_CONFIG($cf_athena_pkg,[ + cf_x_athena_lib="$cf_pkgconfig_libs" + CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena) + AC_DEFINE_UNQUOTED($cf_x_athena_LIBS) + + CF_TRIM_X_LIBS + +AC_CACHE_CHECK(for usable $cf_x_athena/Xmu package,cf_cv_xaw_compat,[ +AC_TRY_LINK([ +$ac_includes_default +#include +],[ +int check = XmuCompareISOLatin1("big", "small"); +(void)check; +],[cf_cv_xaw_compat=yes],[cf_cv_xaw_compat=no])]) + + if test "$cf_cv_xaw_compat" = no + then + # workaround for broken ".pc" files... + case "$cf_x_athena_lib" in + (*-lXmu*) + ;; + (*) + CF_VERBOSE(work around broken package) + cf_save_xmu="$LIBS" + cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^[ ][ ]*//' -e 's/ .*//'` + CF_TRY_PKG_CONFIG(xmu,[ + LIBS="$cf_save_xmu" + CF_ADD_LIB_AFTER($cf_first_lib,$cf_pkgconfig_libs) + ],[ + CF_ADD_LIB_AFTER($cf_first_lib,-lXmu) + ]) + CF_TRIM_X_LIBS + ;; + esac + fi + + break]) + done +fi + +if test -z "$cf_x_athena_lib" ; then + CF_X_EXT + CF_X_TOOLKIT + CF_X_ATHENA_CPPFLAGS($cf_x_athena) + CF_X_ATHENA_LIBS($cf_x_athena) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_X_ATHENA_CPPFLAGS version: 9 updated: 2020/12/31 10:54:15 +dnl -------------------- +dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of +dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw. +AC_DEFUN([CF_X_ATHENA_CPPFLAGS], +[ +AC_REQUIRE([AC_PATH_XTRA]) +cf_x_athena_root=ifelse([$1],,Xaw,[$1]) +cf_x_athena_inc="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + if test -z "$cf_x_athena_inc" ; then + CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS]) + cf_test=X11/$cf_x_athena_root/SimpleMenu.h + if test "$cf_path" != default ; then + CF_APPEND_TEXT(CPPFLAGS,-I$cf_path/include) + AC_MSG_CHECKING(for $cf_test in $cf_path) + else + AC_MSG_CHECKING(for $cf_test) + fi + AC_TRY_COMPILE([ +#include +#include <$cf_test>],[], + [cf_result=yes], + [cf_result=no]) + AC_MSG_RESULT($cf_result) + CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS]) + if test "$cf_result" = yes ; then + test "$cf_path" = default && cf_x_athena_inc=default + test "$cf_path" != default && cf_x_athena_inc="$cf_path/include" + break + fi + fi +done + +if test -z "$cf_x_athena_inc" ; then + AC_MSG_WARN([Unable to find Athena header files]) +elif test "$cf_x_athena_inc" != default ; then + CF_APPEND_TEXT(CPPFLAGS,-I$cf_x_athena_inc) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_ATHENA_LIBS version: 14 updated: 2023/01/11 04:05:23 +dnl ---------------- +dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of +dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw. +AC_DEFUN([CF_X_ATHENA_LIBS], +[AC_REQUIRE([CF_X_TOOLKIT]) +cf_x_athena_root=ifelse([$1],,Xaw,[$1]) +cf_x_athena_lib="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + for cf_lib in \ + ${cf_x_athena_root} \ + ${cf_x_athena_root}7 \ + ${cf_x_athena_root}6 + do + for cf_libs in \ + "-l$cf_lib -lXmu" \ + "-l$cf_lib -lXpm -lXmu" \ + "-l${cf_lib}_s -lXmu_s" + do + test -n "$cf_x_athena_lib" && break + + CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_LIBS]) + cf_test=XawSimpleMenuAddGlobalActions + test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs" + CF_ADD_LIBS($cf_libs) + AC_MSG_CHECKING(for $cf_test in $cf_libs) + AC_TRY_LINK([ +$ac_includes_default +#include +#include +],[ +$cf_test((XtAppContext) 0)], + [cf_result=yes], + [cf_result=no]) + AC_MSG_RESULT($cf_result) + CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_LIBS]) + + if test "$cf_result" = yes ; then + cf_x_athena_lib="$cf_libs" + break + fi + done # cf_libs + test -n "$cf_x_athena_lib" && break + done # cf_lib +done + +if test -z "$cf_x_athena_lib" ; then + AC_MSG_ERROR( +[Unable to successfully link Athena library (-l$cf_x_athena_root) with test program]) +fi + +CF_ADD_LIBS($cf_x_athena_lib) +CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena) +AC_DEFINE_UNQUOTED($cf_x_athena_LIBS) +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_EXT version: 3 updated: 2010/06/02 05:03:05 +dnl -------- +AC_DEFUN([CF_X_EXT],[ +CF_TRY_PKG_CONFIG(Xext,,[ + AC_CHECK_LIB(Xext,XextCreateExtension, + [CF_ADD_LIB(Xext)])]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_X_TOOLKIT version: 27 updated: 2023/01/11 04:05:23 +dnl ------------ +dnl Check for X Toolkit libraries +AC_DEFUN([CF_X_TOOLKIT], +[ +AC_REQUIRE([AC_PATH_XTRA]) +AC_REQUIRE([CF_CHECK_CACHE]) + +# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and +# in some cases has installed dummy files in the former, other cases replaced +# it with a link to the new location). This complicates the configure script. +# Check for that pitfall, and recover using pkg-config +# +# If none of these are set, the configuration is almost certainly broken. +if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}" +then + CF_TRY_PKG_CONFIG(x11,,[AC_MSG_WARN(unable to find X11 library)]) + CF_TRY_PKG_CONFIG(ice,,[AC_MSG_WARN(unable to find ICE library)]) + CF_TRY_PKG_CONFIG(sm,,[AC_MSG_WARN(unable to find SM library)]) + CF_TRY_PKG_CONFIG(xt,,[AC_MSG_WARN(unable to find Xt library)]) +else + LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS" +fi + +cf_have_X_LIBS=no + +CF_TRY_PKG_CONFIG(xt,[ + + case "x$LIBS" in + (*-lX11*) + ;; + (*) +# we have an "xt" package, but it may omit Xt's dependency on X11 +AC_CACHE_CHECK(for usable X dependency,cf_cv_xt_x11_compat,[ +AC_TRY_LINK([ +$ac_includes_default +#include +],[ + int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0); + int rc2 = XClearWindow((Display*) 0, (Window) 0); + int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0); + int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0); +],[cf_cv_xt_x11_compat=yes],[cf_cv_xt_x11_compat=no])]) + if test "$cf_cv_xt_x11_compat" = no + then + CF_VERBOSE(work around broken X11 dependency) + # 2010/11/19 - good enough until a working Xt on Xcb is delivered. + CF_TRY_PKG_CONFIG(x11,,[CF_ADD_LIB_AFTER(-lXt,-lX11)]) + fi + ;; + esac + +AC_CACHE_CHECK(for usable X Toolkit package,cf_cv_xt_ice_compat,[ +AC_TRY_LINK([ +$ac_includes_default +#include +],[int num = IceConnectionNumber(0); (void) num +],[cf_cv_xt_ice_compat=yes],[cf_cv_xt_ice_compat=no])]) + + if test "$cf_cv_xt_ice_compat" = no + then + # workaround for broken ".pc" files used for X Toolkit. + case "x$X_PRE_LIBS" in + (*-lICE*) + case "x$LIBS" in + (*-lICE*) + ;; + (*) + CF_VERBOSE(work around broken ICE dependency) + CF_TRY_PKG_CONFIG(ice, + [CF_TRY_PKG_CONFIG(sm)], + [CF_ADD_LIB_AFTER(-lXt,$X_PRE_LIBS)]) + ;; + esac + ;; + esac + fi + + cf_have_X_LIBS=yes +],[ + + LDFLAGS="$X_LIBS $LDFLAGS" + CF_CHECK_CFLAGS($X_CFLAGS) + + AC_CHECK_FUNC(XOpenDisplay,,[ + AC_CHECK_LIB(X11,XOpenDisplay, + [CF_ADD_LIB(X11)])]) + + AC_CHECK_FUNC(XtAppInitialize,,[ + AC_CHECK_LIB(Xt, XtAppInitialize, + [AC_DEFINE(HAVE_LIBXT,1,[Define to 1 if we can compile with the Xt library]) + cf_have_X_LIBS=Xt + LIBS="-lXt $LIBS"])]) +]) + +if test "$cf_have_X_LIBS" = no ; then + AC_MSG_WARN( +[Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF__CURSES_DATA version: 3 updated: 2021/01/04 19:45:09 +dnl --------------- +dnl Attempt to make a copy of a curses data item. This is needed in the +dnl check-data configure tests when using ncurses, because the symbol may be +dnl actually a function return-value. That could happen if the linker is +dnl broken (does not resolve data-only references), or if ncurses is configured +dnl to support re-entrant code. +dnl $1 = target +dnl $2 = source +define([CF__CURSES_DATA],[ +#if defined($2) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT)) + const void *$1 = (const void *)($2); +#else + const void *$1 = &($2); +#endif + fprintf(stderr, "testing linkage of $2:%p\\n", (const void *)$1); +])dnl +dnl --------------------------------------------------------------------------- +dnl CF__CURSES_HEAD version: 2 updated: 2010/10/23 15:54:49 +dnl --------------- +dnl Define a reusable chunk which includes and when they +dnl are both available. +define([CF__CURSES_HEAD],[ +#ifdef HAVE_XCURSES +#include +char * XCursesProgramName = "test"; +#else +#include <${cf_cv_ncurses_header:-curses.h}> +#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif +#endif +]) +dnl --------------------------------------------------------------------------- +dnl CF__XOPEN_SOURCE_BODY version: 2 updated: 2023/02/18 17:41:25 +dnl --------------------- +dnl body of test when test-compiling for _XOPEN_SOURCE check +define([CF__XOPEN_SOURCE_BODY], +[ +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif +]) +dnl --------------------------------------------------------------------------- +dnl CF__XOPEN_SOURCE_HEAD version: 2 updated: 2023/02/18 17:41:25 +dnl --------------------- +dnl headers to include when test-compiling for _XOPEN_SOURCE check +define([CF__XOPEN_SOURCE_HEAD], +[ +$ac_includes_default +]) diff --git a/contrib/ncurses/test/back_ground.c b/contrib/ncurses/test/back_ground.c new file mode 100644 index 00000000..bc866a1a --- /dev/null +++ b/contrib/ncurses/test/back_ground.c @@ -0,0 +1,320 @@ +/**************************************************************************** + * Copyright 2021-2022,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: back_ground.c,v 1.12 2024/09/28 16:19:19 tom Exp $ + */ + +#include + +#if USE_WIDEC_SUPPORT + +#define NEED_COLOR_CODE 1 +#define NEED_COLOR_NAME 1 +#include +#include + +static int default_bg = COLOR_BLACK; +static int default_fg = COLOR_WHITE; +static wchar_t fill_char = L' '; + +static wchar_t +decode_wchar(const char *value) +{ + long result; + char *next = NULL; + int radix = 0; + + if (!strncmp(value, "U+", 2)) { + value += 2; + radix = 16; + } + result = strtol(value, &next, radix); + if (next == value || (next == NULL || *next != '\0')) { + fprintf(stderr, "decoding wchar_t: %s\n", value); + exit(EXIT_FAILURE); + } + return (wchar_t) result; +} + +static void +test_background(void) +{ + NCURSES_COLOR_T f, b; + int row; + int chr; + wchar_t blank[2]; + wchar_t graphics[2]; + cchar_t data; + + if (pair_content(0, &f, &b) == ERR) { + printw("pair 0 contains no data\n"); + } else { + printw("pair 0 contains (%d,%d)\n", (int) f, (int) b); + } + dump_window(stdscr); + + blank[0] = fill_char; + blank[1] = L'\0'; + + printw("Initializing pair 1 to red/%s\n", color_name(default_bg)); + init_pair(1, COLOR_RED, (NCURSES_COLOR_T) default_bg); + setcchar(&data, blank, A_NORMAL, 1, NULL); + bkgrndset(&data); + printw("RED/BLACK\n"); + dump_window(stdscr); + + printw("Initializing pair 2 to %s/blue\n", color_name(default_fg)); + init_pair(2, (NCURSES_COLOR_T) default_fg, COLOR_BLUE); + setcchar(&data, blank, A_NORMAL, 2, NULL); + bkgrndset(&data); + printw("This line should be %s/blue\n", color_name(default_fg)); + dump_window(stdscr); + + printw("Initializing pair 3 to %s/cyan (ACS_HLINE)\n", color_name(default_fg)); + init_pair(3, (NCURSES_COLOR_T) default_fg, COLOR_CYAN); + printw("...and drawing a box which should be followed by lines\n"); + graphics[0] = ACS_HLINE & A_CHARTEXT; + graphics[1] = L'\0'; + setcchar(&data, graphics, A_ALTCHARSET, 3, NULL); + bkgrndset(&data); + /* + * Characters from vt100 line-drawing should be mapped to line-drawing, + * since A_ALTCHARSET is set in the background, and the character part + * of the background is replaced by the nonblank characters written. + * + * Characters not in the line-drawing range are usually sent as-is. + * + * With SVr4 curses it is possible to rely on this to mix uppercase text + * with the (lowercase) line-drawing characters. ncurses uses some of + * the uppercase characters for encoding thick- and double-lines. + */ + row = 7; + mvprintw(row++, 10, "l"); + for (chr = 0; chr < 32; ++chr) + AddCh(' '); + printw("x\n"); + chr = 32; + while (chr < 128) { + if ((chr % 32) == 0) + mvprintw(row++, 10, "x"); + AddCh((chr == 127) ? ' ' : chr); + if ((++chr % 32) == 0) + printw("x\n"); + } + mvprintw(row++, 10, "m"); + for (chr = 0; chr < 32; ++chr) + AddCh(' '); + printw("j\n"); + dump_window(stdscr); + + setcchar(&data, blank, A_NORMAL, 0, NULL); + bkgrndset(&data); + printw("Default Colors\n"); + dump_window(stdscr); + + printw("Resetting colors to pair 1\n"); + setcchar(&data, blank, A_NORMAL, 1, NULL); + bkgrndset(&data); + printw("This line should be red/%s\n", color_name(default_bg)); + dump_window(stdscr); + + printw("Setting screen to pair 0\n"); + setcchar(&data, blank, A_NORMAL, 0, NULL); + bkgrndset(&data); + dump_window(stdscr); + + printw("Setting screen to pair 1\n"); + setcchar(&data, blank, A_NORMAL, 1, NULL); + bkgrndset(&data); + dump_window(stdscr); + + printw("Setting screen to pair 2\n"); + setcchar(&data, blank, A_NORMAL, 2, NULL); + bkgrndset(&data); + dump_window(stdscr); + + printw("Setting screen to pair 3\n"); + setcchar(&data, blank, A_NORMAL, 3, NULL); + bkgrndset(&data); + dump_window(stdscr); + + printw("Setting screen to pair 0\n"); + setcchar(&data, blank, A_NORMAL, 0, NULL); + bkgrndset(&data); + dump_window(stdscr); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: background [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_ASSUME_DEFAULT_COLORS + ," -a invoke assume_default_colors, repeat to use in init_pair" +#endif + ," -b XXX specify background color" + ," -c XXX specify background character" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors, repeat to use in init_pair" +#endif + ," -f XXX specify foreground color" + ," -l FILE log window-dumps to this file" + ," -w fill background with stipple pattern" + ," -W CODE fill background with this Unicode value" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ +#if HAVE_ASSUME_DEFAULT_COLORS + int a_option = 0; +#endif +#if HAVE_USE_DEFAULT_COLORS + int d_option = 0; +#endif + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "ab:c:df:l:wW:")) != -1) { + switch (ch) { +#if HAVE_ASSUME_DEFAULT_COLORS + case 'a': + ++a_option; + break; +#endif + case 'b': + default_bg = color_code(optarg); + break; + case 'c': + if (strlen(optarg) > 1) { + char *check = NULL; + long value = strtol(optarg, &check, 0); + if (*check != '\0') + usage(FALSE); + fill_char = (wchar_t) value; + } else { + fill_char = (wchar_t) *optarg; + } + break; +#if HAVE_USE_DEFAULT_COLORS + case 'd': + ++d_option; + break; +#endif + case 'f': + default_fg = color_code(optarg); + break; + case 'l': + if (!open_dump(optarg)) + usage(FALSE); + break; + case 'w': + fill_char = L'\u2591'; + break; + case 'W': + fill_char = decode_wchar(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } +#if HAVE_USE_DEFAULT_COLORS && HAVE_ASSUME_DEFAULT_COLORS + if (a_option && d_option) { + fprintf(stderr, "Use either -a or -d option, but not both\n"); + ExitProgram(EXIT_FAILURE); + } +#endif + + initscr(); + cbreak(); + noecho(); + + if (has_colors()) { + start_color(); + +#if HAVE_USE_DEFAULT_COLORS + if (d_option) { + printw("Using default colors...\n"); + use_default_colors(); + if (d_option > 1) { + default_fg = -1; + default_bg = -1; + } + } +#endif +#if HAVE_ASSUME_DEFAULT_COLORS + if (a_option) { + printw("Using assumed colors %s/%s...\n", + color_name(default_fg), + color_name(default_bg)); + assume_default_colors(default_fg, default_bg); + if (a_option > 1) { + default_fg = -1; + default_bg = -1; + } + } +#endif + + test_background(); + + } else { + printw("This demo requires a color terminal"); + getch(); + } + endwin(); + close_dump(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the wide-curses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* USE_WIDEC_SUPPORT */ diff --git a/contrib/ncurses/test/background.c b/contrib/ncurses/test/background.c new file mode 100644 index 00000000..63144cda --- /dev/null +++ b/contrib/ncurses/test/background.c @@ -0,0 +1,264 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 2003-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: background.c,v 1.27 2024/09/22 22:34:49 tom Exp $ + */ + +#define NEED_COLOR_CODE 1 +#define NEED_COLOR_NAME 1 +#include +#include + +static int default_bg = COLOR_BLACK; +static int default_fg = COLOR_WHITE; +static unsigned char fill_char = ' '; + +static void +test_background(void) +{ + NCURSES_COLOR_T f, b; + int row; + int chr; + + printw("Background character %#x\n", fill_char); + if (pair_content(0, &f, &b) == ERR) { + printw("pair 0 contains no data\n"); + } else { + printw("pair 0 contains (%d,%d)\n", (int) f, (int) b); + } + dump_window(stdscr); + + printw("Initializing pair 1 to red/%s\n", color_name(default_bg)); + init_pair(1, COLOR_RED, (NCURSES_COLOR_T) default_bg); + bkgdset((chtype) (fill_char | COLOR_PAIR(1))); + printw("RED/BLACK\n"); + dump_window(stdscr); + + printw("Initializing pair 2 to %s/blue\n", color_name(default_fg)); + init_pair(2, (NCURSES_COLOR_T) default_fg, COLOR_BLUE); + bkgdset((chtype) (fill_char | COLOR_PAIR(2))); + printw("This line should be %s/blue\n", color_name(default_fg)); + dump_window(stdscr); + + printw("Initializing pair 3 to %s/cyan (ACS_HLINE)\n", color_name(default_fg)); + init_pair(3, (NCURSES_COLOR_T) default_fg, COLOR_CYAN); + printw("...and drawing a box which should be followed by lines\n"); + bkgdset(ACS_HLINE | (chtype) COLOR_PAIR(3)); + /* + * Characters from vt100 line-drawing should be mapped to line-drawing, + * since A_ALTCHARSET is set in the background, and the character part + * of the background is replaced by the nonblank characters written. + * + * Characters not in the line-drawing range are usually sent as-is. + * + * With SVr4 curses it is possible to rely on this to mix uppercase text + * with the (lowercase) line-drawing characters. ncurses uses some of + * the uppercase characters for encoding thick- and double-lines. + */ + row = 7; + mvprintw(row++, 10, "l"); + for (chr = 0; chr < 32; ++chr) + AddCh(' '); + printw("x\n"); + chr = 32; + while (chr < 128) { + if ((chr % 32) == 0) + mvprintw(row++, 10, "x"); + AddCh((chr == 127) ? ' ' : chr); + if ((++chr % 32) == 0) + printw("x\n"); + } + mvprintw(row++, 10, "m"); + for (chr = 0; chr < 32; ++chr) + AddCh(' '); + printw("j\n"); + dump_window(stdscr); + + bkgdset((chtype) (fill_char | COLOR_PAIR(0))); + printw("Default Colors\n"); + dump_window(stdscr); + + printw("Resetting colors to pair 1\n"); + bkgdset((chtype) (fill_char | COLOR_PAIR(1))); + printw("This line should be red/%s\n", color_name(default_bg)); + dump_window(stdscr); + + printw("Setting screen to pair 0\n"); + bkgd((chtype) (fill_char | COLOR_PAIR(0))); + dump_window(stdscr); + + printw("Setting screen to pair 1\n"); + bkgd((chtype) (fill_char | COLOR_PAIR(1))); + dump_window(stdscr); + + printw("Setting screen to pair 2\n"); + bkgd((chtype) (fill_char | COLOR_PAIR(2))); + dump_window(stdscr); + + printw("Setting screen to pair 3\n"); + bkgd((chtype) (fill_char | COLOR_PAIR(3))); + dump_window(stdscr); + + printw("Setting screen to pair 0\n"); + bkgd((chtype) (fill_char | COLOR_PAIR(0))); + dump_window(stdscr); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: background [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_ASSUME_DEFAULT_COLORS + ," -a invoke assume_default_colors, repeat to use in init_pair" +#endif + ," -b XXX specify background color" + ," -c XXX specify background character" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors, repeat to use in init_pair" +#endif + ," -f XXX specify foreground color" + ," -l FILE log window-dumps to this file" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ +#if HAVE_ASSUME_DEFAULT_COLORS + int a_option = 0; +#endif +#if HAVE_USE_DEFAULT_COLORS + int d_option = 0; +#endif + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "ab:c:df:l:")) != -1) { + switch (ch) { +#if HAVE_ASSUME_DEFAULT_COLORS + case 'a': + ++a_option; + break; +#endif + case 'b': + default_bg = color_code(optarg); + break; + case 'c': + if (strlen(optarg) > 1) { + char *check = NULL; + long value = strtol(optarg, &check, 0); + if (*check != '\0') + usage(FALSE); + fill_char = (unsigned char) value; + } else { + fill_char = (unsigned char) *optarg; + } + break; +#if HAVE_USE_DEFAULT_COLORS + case 'd': + ++d_option; + break; +#endif + case 'f': + default_fg = color_code(optarg); + break; + case 'l': + if (!open_dump(optarg)) + usage(FALSE); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } +#if HAVE_USE_DEFAULT_COLORS && HAVE_ASSUME_DEFAULT_COLORS + if (a_option && d_option) { + fprintf(stderr, "Use either -a or -d option, but not both\n"); + ExitProgram(EXIT_FAILURE); + } +#endif + + initscr(); + cbreak(); + noecho(); + + if (has_colors()) { + start_color(); + +#if HAVE_USE_DEFAULT_COLORS + if (d_option) { + printw("Using default colors...\n"); + use_default_colors(); + if (d_option > 1) { + default_fg = -1; + default_bg = -1; + } + } +#endif +#if HAVE_ASSUME_DEFAULT_COLORS + if (a_option) { + printw("Using assumed colors %s/%s...\n", + color_name(default_fg), + color_name(default_bg)); + assume_default_colors(default_fg, default_bg); + if (a_option > 1) { + default_fg = -1; + default_bg = -1; + } + } +#endif + + test_background(); + + } else { + printw("This demo requires a color terminal"); + getch(); + } + endwin(); + close_dump(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/blue.c b/contrib/ncurses/test/blue.c new file mode 100644 index 00000000..e02f48bd --- /dev/null +++ b/contrib/ncurses/test/blue.c @@ -0,0 +1,542 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/***************************************************************************** + * * + * B l u e M o o n * + * ================= * + * V2.2 * + * A patience game by T.A.Lister * + * Integral screen support by Eric S. Raymond * + * * + *****************************************************************************/ + +/* + * $Id: blue.c,v 1.56 2024/10/05 19:26:24 tom Exp $ + */ + +#include + +#include + +#if HAVE_LANGINFO_CODESET +#include +#endif + +#define NOCARD (-1) + +#define ACE 0 +#define KING 12 +#define SUIT_LENGTH 13 + +#define HEARTS 0 +#define SPADES 1 +#define DIAMONDS 2 +#define CLUBS 3 +#define NSUITS 4 + +#define GRID_WIDTH 14 /* 13+1 */ +#define GRID_LENGTH 56 /* 4*(13+1) */ +#define PACK_SIZE 52 + +#define BASEROW 1 +#define PROMPTROW 11 + +#define RED_ON_WHITE 1 +#define BLACK_ON_WHITE 2 +#define BLUE_ON_WHITE 3 + +static GCC_NORETURN void die(int onsig); + +static int deck_size = PACK_SIZE; /* initial deck */ +static int deck[PACK_SIZE]; + +static int grid[GRID_LENGTH]; /* card layout grid */ +static int freeptr[4]; /* free card space pointers */ + +static int deal_number = 0; + +static chtype ranks[SUIT_LENGTH][2] = +{ + {' ', 'A'}, + {' ', '2'}, + {' ', '3'}, + {' ', '4'}, + {' ', '5'}, + {' ', '6'}, + {' ', '7'}, + {' ', '8'}, + {' ', '9'}, + {'1', '0'}, + {' ', 'J'}, + {' ', 'Q'}, + {' ', 'K'} +}; + +static int letters[4] = +{ + 'h', /* hearts */ + 's', /* spades */ + 'd', /* diamonds */ + 'c', /* clubs */ +}; + +#if HAVE_LANGINFO_CODESET + +#if HAVE_TIGETSTR +static int glyphs[] = +{ + '\003', /* hearts */ + '\006', /* spades */ + '\004', /* diamonds */ + '\005', /* clubs */ +}; +#endif + +#if USE_WIDEC_SUPPORT +static int uglyphs[] = +{ + 0x2665, /* hearts */ + 0x2660, /* spades */ + 0x2666, /* diamonds */ + 0x2663 /* clubs */ +}; +#endif +#endif /* HAVE_LANGINFO_CODESET */ + +static int *suits = letters; /* this may change to glyphs below */ + +static void +die(int onsig) +{ + (void) signal(onsig, SIG_IGN); + endwin(); + ExitProgram(EXIT_SUCCESS); +} + +static void +init_vars(void) +{ + int i; + + deck_size = PACK_SIZE; + for (i = 0; i < PACK_SIZE; i++) + deck[i] = i; + for (i = 0; i < 4; i++) + freeptr[i] = i * GRID_WIDTH; +} + +static void +shuffle(int size) +{ + int numswaps, swapnum; + + numswaps = size * 10; /* an arbitrary figure */ + + for (swapnum = 0; swapnum < numswaps; swapnum++) { + int i = rand() % size; + int j = rand() % size; + int temp = deck[i]; + deck[i] = deck[j]; + deck[j] = temp; + } +} + +static void +deal_cards(void) +{ + int card = 0, value, csuit, crank, suit, aces[4]; + + memset(aces, 0, sizeof(aces)); + for (suit = HEARTS; suit <= CLUBS; suit++) { + int ptr = freeptr[suit]; + grid[ptr++] = NOCARD; /* 1st card space is blank */ + while ((ptr % GRID_WIDTH) != 0) { + value = deck[card++]; + crank = value % SUIT_LENGTH; + csuit = value / SUIT_LENGTH; + if (crank == ACE) + aces[csuit] = ptr; + grid[ptr++] = value; + } + } + + if (deal_number == 1) /* shift the aces down to the 1st column */ + for (suit = HEARTS; suit <= CLUBS; suit++) { + grid[suit * GRID_WIDTH] = suit * SUIT_LENGTH; + grid[aces[suit]] = NOCARD; + freeptr[suit] = aces[suit]; + } +} + +static void +printcard(int value) +{ + AddCh(' '); + if (value == NOCARD) { + (void) addstr(" "); + } else { + int which = (value / SUIT_LENGTH); + int isuit = (value % SUIT_LENGTH); + chtype color = (chtype) COLOR_PAIR(((which % 2) == 0) + ? RED_ON_WHITE + : BLACK_ON_WHITE); + + AddCh(ranks[isuit][0] | (chtype) COLOR_PAIR(BLUE_ON_WHITE)); + AddCh(ranks[isuit][1] | (chtype) COLOR_PAIR(BLUE_ON_WHITE)); + +#ifdef NCURSES_VERSION + (attron) ((int) color); /* quieter compiler warnings */ +#else + attron(color); /* PDCurses, etc., either no macro or wrong */ +#endif +#if USE_WIDEC_SUPPORT + { + wchar_t values[2]; + values[0] = (wchar_t) suits[which]; + values[1] = 0; + addwstr(values); + } +#else + AddCh(suits[which]); +#endif +#ifdef NCURSES_VERSION + (attroff) ((int) color); +#else + attroff(color); +#endif + } + AddCh(' '); +} + +static void +display_cards(int deal) +{ + int row, card; + + clear(); + (void) printw( + "Blue Moon 2.1 - by Tim Lister & Eric Raymond - Deal %d.\n", + deal); + for (row = HEARTS; row <= CLUBS; row++) { + move(BASEROW + row + row + 2, 1); + for (card = 0; card < GRID_WIDTH; card++) + printcard(grid[row * GRID_WIDTH + card]); + } + + move(PROMPTROW + 2, 0); + refresh(); +#define P(x) (void)printw("%s\n", x) + P(" This 52-card solitaire starts with the entire deck shuffled and dealt"); + P("out in four rows. The aces are then moved to the left end of the layout,"); + P("making 4 initial free spaces. You may move to a space only the card that"); + P("matches the left neighbor in suit, and is one greater in rank. Kings are"); + P("high, so no cards may be placed to their right (they create dead spaces)."); + P(" When no moves can be made, cards still out of sequence are reshuffled"); + P("and dealt face up after the ends of the partial sequences, leaving a card"); + P("space after each sequence, so that each row looks like a partial sequence"); + P("followed by a space, followed by enough cards to make a row of 14. "); + P(" A moment's reflection will show that this game cannot take more than 13"); + P("deals. A good score is 1-3 deals, 4-7 is average, 8 or more is poor. "); +#undef P + refresh(); +} + +static int +find(int card) +{ + int i; + + if ((card < 0) || (card >= PACK_SIZE)) + return (NOCARD); + for (i = 0; i < GRID_LENGTH; i++) + if (grid[i] == card) + return i; + return (NOCARD); +} + +static void +movecard(int src, int dst) +{ + grid[dst] = grid[src]; + grid[src] = NOCARD; + + move(BASEROW + (dst / GRID_WIDTH) * 2 + 2, (dst % GRID_WIDTH) * 5 + 1); + printcard(grid[dst]); + + move(BASEROW + (src / GRID_WIDTH) * 2 + 2, (src % GRID_WIDTH) * 5 + 1); + printcard(grid[src]); + + refresh(); +} + +static void +play_game(void) +{ + int dead = 0, i, j; + char c; + int selection[4], card; + + while (dead < 4) { + dead = 0; + for (i = 0; i < 4; i++) { + card = grid[freeptr[i] - 1]; + + if (((card % SUIT_LENGTH) == KING) + || + (card == NOCARD)) + selection[i] = NOCARD; + else + selection[i] = find(card + 1); + + if (selection[i] == NOCARD) + dead++; + }; + + if (dead < 4) { + char live[NSUITS + 1], *lp = live; + + for (i = 0; i < 4; i++) { + if (selection[i] != NOCARD) { + move(BASEROW + (selection[i] / GRID_WIDTH) * 2 + 3, + (selection[i] % GRID_WIDTH) * 5); + (void) printw(" %c ", (*lp++ = (char) ('a' + i))); + } + }; + *lp = '\0'; + + if (strlen(live) == 1) { + move(PROMPTROW, 0); + (void) printw( + "Making forced moves... "); + refresh(); + (void) sleep(1); + c = live[0]; + } else { + char buf[BUFSIZ]; + + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "Type [%s] to move, r to redraw, q or INTR to quit: ", + live); + + do { + move(PROMPTROW, 0); + (void) addstr(buf); + move(PROMPTROW, (int) strlen(buf)); + clrtoeol(); + AddCh(' '); + } while + (((c = (char) getch()) < 'a' || c > 'd') + && (c != 'r') + && (c != 'q')); + } + + for (j = 0; j < 4; j++) + if (selection[j] != NOCARD) { + move(BASEROW + (selection[j] / GRID_WIDTH) * 2 + 3, + (selection[j] % GRID_WIDTH) * 5); + (void) printw(" "); + } + + if (c == 'r') + display_cards(deal_number); + else if (c == 'q') + die(SIGINT); + else { + i = c - 'a'; + if (selection[i] == NOCARD) + beep(); + else { + movecard(selection[i], freeptr[i]); + freeptr[i] = selection[i]; + } + } + } + } + + move(PROMPTROW, 0); + (void) standout(); + (void) printw("Finished deal %d - type any character to continue...", deal_number); + (void) standend(); + (void) getch(); +} + +static int +collect_discards(void) +{ + int row, col, cardno = 0, gridno; + + for (row = HEARTS; row <= CLUBS; row++) { + int finish = 0; + for (col = 1; col < GRID_WIDTH; col++) { + gridno = row * GRID_WIDTH + col; + + if ((grid[gridno] != (grid[gridno - 1] + 1)) && (finish == 0)) { + finish = 1; + freeptr[row] = gridno; + }; + + if ((finish != 0) && (grid[gridno] != NOCARD)) + deck[cardno++] = grid[gridno]; + } + } + return cardno; +} + +static void +game_finished(int deal) +{ + clear(); + (void) printw("You finished the game in %d deals. This is ", deal); + (void) standout(); + if (deal < 2) + (void) addstr("excellent"); + else if (deal < 4) + (void) addstr("good"); + else if (deal < 8) + (void) addstr("average"); + else + (void) addstr("poor"); + (void) standend(); + (void) addstr(". "); + refresh(); +} + +#if HAVE_LANGINFO_CODESET +/* + * This program first appeared in ncurses in January 1995. At that point, the + * Linux console was able to display CP437 graphic characters, e.g., in the + * range 0-31. As of 2016, most Linux consoles are running with the UTF-8 + * (partial) support. Incidentally, that makes all of the cards diamonds. + */ +static void +use_pc_display(void) +{ + const char *check = nl_langinfo(CODESET); + if (!strcmp(check, "UTF-8")) { +#if USE_WIDEC_SUPPORT + suits = uglyphs; +#endif + } else { +#if HAVE_TIGETSTR + if (!strcmp(check, "IBM437") || + !strcmp(check, "CP437") || + !strcmp(check, "IBM850") || + !strcmp(check, "CP850")) { + const char *smacs = tigetstr("smacs"); + const char *smpch = tigetstr("smpch"); + /* + * The ncurses library makes this check to decide whether to allow + * the alternate character set for the (normally) nonprinting codes. + */ + if (smacs != 0 && smpch != 0 && !strcmp(smacs, smpch)) { + suits = glyphs; + } + } +#endif + } +} +#else +#define use_pc_display() /* nothing */ +#endif /* HAVE_LANGINFO_CODESET */ + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: blue [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + use_pc_display(); + + InitAndCatch(initscr(), die); + + start_color(); + init_pair(RED_ON_WHITE, COLOR_RED, COLOR_WHITE); + init_pair(BLUE_ON_WHITE, COLOR_BLUE, COLOR_WHITE); + init_pair(BLACK_ON_WHITE, COLOR_BLACK, COLOR_WHITE); + + cbreak(); + + if (argc == 2) + srand((unsigned) atoi(argv[1])); + else + srand((unsigned) time((time_t *) 0)); + + init_vars(); + + do { + deal_number++; + shuffle(deck_size); + deal_cards(); + display_cards(deal_number); + play_game(); + } + while + ((deck_size = collect_discards()) != 0); + + game_finished(deal_number); + + die(SIGINT); + /*NOTREACHED */ +} + +/* blue.c ends here */ diff --git a/contrib/ncurses/test/bs.6 b/contrib/ncurses/test/bs.6 new file mode 100644 index 00000000..03021f65 --- /dev/null +++ b/contrib/ncurses/test/bs.6 @@ -0,0 +1,95 @@ +.\"*************************************************************************** +.\" Copyright 2020-2021,2024 Thomas E. Dickey * +.\" Copyright 1998,2006 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: bs.6,v 1.8 2024/06/15 20:32:28 tom Exp $ +.TH BATTLESHIPS 6 2024-06-15 ncurses-examples Games +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +bs \- +battleships game +.SH SYNOPSIS +battle [ \-b | \-s ] [ \-c ] +.SH DESCRIPTION +This program allows you to play the familiar Battleships game against the +computer on a 10x10 board. +The interface is visual and largely self-explanatory; +you place your ships and pick your shots by moving the +cursor around the \*(``sea\*('' with the rogue/hack motion keys hjklyubn. +.PP +Note that when selecting a ship to place, +you must type the capital letter +(these are, after all, capital ships). +During ship placement, +the \*(``r\*('' command +may be used to ignore the current position and randomly place your currently +selected ship. +The \*(``R\*('' command will place all remaining ships randomly. +The ^L command (form feed, +ASCII 12) will force a screen redraw). +.PP +The command-line arguments control game modes. + +.nf + \-b selects a \*(``blitz\*('' variant + \-s selects a \*(``salvo\*('' variant + \-c permits ships to be placed adjacently +.fi + +The \*(``blitz\*('' variant allows a side to shoot +for as long as it continues to score hits. +.PP +The \*(``salvo\*('' game allows a player one shot per turn +for each of his/her ships still afloat. +This puts a premium scoring hits early and knocking out some +ships and also makes much harder the situation where you face a superior force +with only your PT-boat. +.PP +Normally, ships must be separated by at least one square of open water. +The \-c option disables this check and allows them to close-pack. +.PP +The algorithm the computer uses +once it has found a ship to sink is provably optimal. +The dispersion criterion for the random-fire algorithm may not be. +.SH AUTHORS +Originally written by Bruce Holloway in 1986. +Salvo mode added by Chuck A. DeGaul (cbosgd!cad). +Visual user interface, +\*(``closepack\*('' option, +code rewrite, +and manual page by Eric S. Raymond + August 1989. diff --git a/contrib/ncurses/test/bs.c b/contrib/ncurses/test/bs.c new file mode 100644 index 00000000..e258ea6a --- /dev/null +++ b/contrib/ncurses/test/bs.c @@ -0,0 +1,1285 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * bs.c - original author: Bruce Holloway + * salvo option by: Chuck A DeGaul + * with improved user interface, autoconfiguration and code cleanup + * by Eric S. Raymond + * v1.2 with color support and minor portability fixes, November 1990 + * v2.0 featuring strict ANSI/POSIX conformance, November 1993. + * v2.1 with ncurses mouse support, September 1995 + * + * $Id: bs.c,v 1.80 2024/10/05 19:26:24 tom Exp $ + */ + +#include + +#include + +#ifndef SIGIOT +#define SIGIOT SIGABRT +#endif + +static int getcoord(int); + +/* + * Constants for tuning the random-fire algorithm. It prefers moves that + * diagonal-stripe the board with a stripe separation of srchstep. If + * no such preferred moves are found, srchstep is decremented. + */ +#define BEGINSTEP 3 /* initial value of srchstep */ + +/* miscellaneous constants */ +#define SHIPTYPES 5 +#define OTHER (1-turn) +#define PLAYER 0 +#define COMPUTER 1 +#define MARK_HIT 'H' +#define MARK_MISS 'o' +#define CTRLC '\003' /* used as terminate command */ +#define FF '\014' /* used as redraw command */ + +#define is_QUIT(c) ((c) == CTRLC || (c) == QUIT) + +/* coordinate handling */ +#define BWIDTH 10 +#define BDEPTH 10 + +/* display symbols */ +#define SHOWHIT '*' +#define SHOWSPLASH ' ' +#define IS_SHIP(c) (isupper(UChar(c)) ? TRUE : FALSE) + +/* how to position us on player board */ +#define PYBASE 3 +#define PXBASE 3 +#define PY(y) (PYBASE + (y)) +#define PX(x) (PXBASE + (x)*3) +#define pgoto(y, x) (void)move(PY(y), PX(x)) + +/* how to position us on cpu board */ +#define CYBASE 3 +#define CXBASE 48 +#define CY(y) (CYBASE + (y)) +#define CX(x) (CXBASE + (x)*3) +#define CYINV(y) ((y) - CYBASE) +#define CXINV(x) (((x) - CXBASE) / 3) +#define cgoto(y, x) (void)move(CY(y), CX(x)) + +#define ONBOARD(x, y) (x >= 0 && x < BWIDTH && y >= 0 && y < BDEPTH) + +/* other board locations */ +#define COLWIDTH 80 +#define PROMPTLINE 21 /* prompt line */ +#define SYBASE CYBASE + BDEPTH + 3 /* move key diagram */ +#define SXBASE 63 +#define MYBASE SYBASE - 1 /* diagram caption */ +#define MXBASE 64 +#define HYBASE SYBASE - 1 /* help area */ +#define HXBASE 0 + +/* this will need to be changed if BWIDTH changes */ +static char numbers[] = " 0 1 2 3 4 5 6 7 8 9"; + +static char carrier[] = "Aircraft Carrier"; +static char battle[] = "Battleship"; +static char sub[] = "Submarine"; +static char destroy[] = "Destroyer"; +static char ptboat[] = "PT Boat"; + +static char *your_name; +static char dftname[] = "stranger"; + +/* direction constants */ +typedef enum { + dir_E = 0 + ,dir_SE + ,dir_S + ,dir_SW + ,dir_W + ,dir_NW + ,dir_N + ,dir_NE + ,dir_MAX +} DIRECTIONS; +static int xincr[dir_MAX + 2] = +{1, 1, 0, -1, -1, -1, 0, 1}; +static int yincr[dir_MAX + 2] = +{0, 1, 1, 1, 0, -1, -1, -1}; + +/* current ship position and direction */ +static int curx = (BWIDTH / 2); +static int cury = (BDEPTH / 2); + +typedef struct { + char *name; /* name of the ship type */ + int hits; /* how many times has this ship been hit? */ + char symbol; /* symbol for game purposes */ + int length; /* length of ship */ + int x, y; /* coordinates of ship start point */ + int dir; /* direction of `bow' */ + bool placed; /* has it been placed on the board? */ +} ship_t; + +static bool checkplace(int b, const ship_t * ss, int vis); + +#define SHIPIT(name, symbol, length) { name, 0, symbol, length, 0,0, 0, FALSE } + +/* "ply=player", "cpu=computer" */ +static ship_t plyship[SHIPTYPES] = +{ + SHIPIT(carrier, 'A', 5), + SHIPIT(battle, 'B', 4), + SHIPIT(destroy, 'D', 3), + SHIPIT(sub, 'S', 3), + SHIPIT(ptboat, 'P', 2), +}; + +static ship_t cpuship[SHIPTYPES] = +{ + SHIPIT(carrier, 'A', 5), + SHIPIT(battle, 'B', 4), + SHIPIT(destroy, 'D', 3), + SHIPIT(sub, 'S', 3), + SHIPIT(ptboat, 'P', 2), +}; + +/* "Hits" board, and main board. */ +static char hits[2][BWIDTH][BDEPTH]; +static char board[2][BWIDTH][BDEPTH]; + +static int turn; /* 0=player, 1=computer */ +static int plywon = 0, cpuwon = 0; /* How many games has each won? */ + +static int salvo, blitz, closepack; + +#define PR (void)addstr + +static GCC_NORETURN void uninitgame(int sig); + +static void +uninitgame(int sig GCC_UNUSED) +/* end the game, either normally or due to signal */ +{ + clear(); + (void) refresh(); + (void) reset_shell_mode(); + (void) echo(); + (void) endwin(); + free(your_name); + ExitProgram(sig ? EXIT_FAILURE : EXIT_SUCCESS); +} + +static void +announceopts(void) +/* announce which game options are enabled */ +{ + if (salvo || blitz || closepack) { + (void) printw("Playing optional game ("); + if (salvo) + (void) printw("salvo, "); + else + (void) printw("nosalvo, "); + if (blitz) + (void) printw("blitz "); + else + (void) printw("noblitz, "); + if (closepack) + (void) printw("closepack)"); + else + (void) printw("noclosepack)"); + } else + (void) printw( + "Playing standard game (noblitz, nosalvo, noclosepack)"); +} + +static void +intro(void) +{ + const char *tmpname; + + srand((unsigned) (time(0L) + getpid())); /* Kick the random number generator */ + + InitAndCatch(initscr(), uninitgame); + + if ((tmpname = getlogin()) != 0 && + (your_name = strdup(tmpname)) != 0) { + your_name[0] = (char) toupper(UChar(your_name[0])); + } else { + your_name = strdup(dftname); + } + + keypad(stdscr, TRUE); + (void) def_prog_mode(); + (void) nonl(); + (void) cbreak(); + (void) noecho(); + +#ifdef PENGUIN + (void) clear(); + MvAddStr(4, 29, "Welcome to Battleship!"); + (void) move(8, 0); + PR(" \\\n"); + PR(" \\ \\ \\\n"); + PR(" \\ \\ \\ \\ \\_____________\n"); + PR(" \\ \\ \\_____________ \\ \\/ |\n"); + PR(" \\ \\/ \\ \\/ |\n"); + PR(" \\/ \\_____/ |__\n"); + PR(" ________________/ |\n"); + PR(" \\ S.S. Penguin |\n"); + PR(" \\ /\n"); + PR(" \\___________________________________________________/\n"); + + MvAddStr(22, 27, "Hit any key to continue..."); + (void) refresh(); + (void) getch(); +#endif /* PENGUIN */ + +#ifdef A_COLOR + start_color(); + + init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); + init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); + init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); + init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); + init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); + init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); + init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); + init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); +#endif /* A_COLOR */ + +#ifdef NCURSES_MOUSE_VERSION + (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL); +#endif /* NCURSES_MOUSE_VERSION */ +} + +/* VARARGS1 */ +static void +prompt(int n, NCURSES_CONST char *f, const char *s) +/* print a message at the prompt line */ +{ + (void) move(PROMPTLINE + n, 0); + (void) clrtoeol(); + (void) printw(f, s); + (void) refresh(); +} + +static void +error(NCURSES_CONST char *s) +{ + (void) move(PROMPTLINE + 2, 0); + (void) clrtoeol(); + if (s) { + (void) addstr(s); + (void) beep(); + } +} + +static void +placeship(int b, ship_t * ss, int vis) +{ + int l; + + for (l = 0; l < ss->length; ++l) { + int newx = ss->x + l * xincr[ss->dir]; + int newy = ss->y + l * yincr[ss->dir]; + + board[b][newx][newy] = ss->symbol; + if (vis) { + pgoto(newy, newx); + AddCh(ss->symbol); + } + } + ss->hits = 0; +} + +static int +rnd(int n) +{ + return (((rand() & 0x7FFF) % n)); +} + +static void +randomplace(int b, ship_t * ss) +/* generate a valid random ship placement into px,py */ +{ + + do { + ss->dir = rnd(2) ? dir_E : dir_S; + ss->x = rnd(BWIDTH - (ss->dir == dir_E ? ss->length : 0)); + ss->y = rnd(BDEPTH - (ss->dir == dir_S ? ss->length : 0)); + } while + (!checkplace(b, ss, FALSE)); +} + +static void +initgame(void) +{ + int i, j, unplaced; + ship_t *ss; + + (void) clear(); + MvAddStr(0, 35, "BATTLESHIPS"); + (void) move(PROMPTLINE + 2, 0); + announceopts(); + + memset(board, 0, sizeof(char) * BWIDTH * BDEPTH * 2); + memset(hits, 0, sizeof(char) * BWIDTH * BDEPTH * 2); + for (i = 0; i < SHIPTYPES; i++) { + ss = cpuship + i; + + ss->x = + ss->y = + ss->dir = + ss->hits = 0; + ss->placed = FALSE; + + ss = plyship + i; + + ss->x = + ss->y = + ss->dir = + ss->hits = 0; + ss->placed = FALSE; + } + + /* draw empty boards */ + MvAddStr(PYBASE - 2, PXBASE + 5, "Main Board"); + MvAddStr(PYBASE - 1, PXBASE - 3, numbers); + for (i = 0; i < BDEPTH; ++i) { + MvAddCh(PYBASE + i, PXBASE - 3, (chtype) (i + 'A')); +#ifdef A_COLOR + if (has_colors()) + attron(COLOR_PAIR(COLOR_BLUE)); +#endif /* A_COLOR */ + AddCh(' '); + for (j = 0; j < BWIDTH; j++) + (void) addstr(" . "); +#ifdef A_COLOR + (void) attrset(0); +#endif /* A_COLOR */ + AddCh(' '); + AddCh(i + 'A'); + } + MvAddStr(PYBASE + BDEPTH, PXBASE - 3, numbers); + MvAddStr(CYBASE - 2, CXBASE + 7, "Hit/Miss Board"); + MvAddStr(CYBASE - 1, CXBASE - 3, numbers); + for (i = 0; i < BDEPTH; ++i) { + MvAddCh(CYBASE + i, CXBASE - 3, (chtype) (i + 'A')); +#ifdef A_COLOR + if (has_colors()) + attron(COLOR_PAIR(COLOR_BLUE)); +#endif /* A_COLOR */ + AddCh(' '); + for (j = 0; j < BWIDTH; j++) + (void) addstr(" . "); +#ifdef A_COLOR + (void) attrset(0); +#endif /* A_COLOR */ + AddCh(' '); + AddCh(i + 'A'); + } + + MvAddStr(CYBASE + BDEPTH, CXBASE - 3, numbers); + + MvPrintw(HYBASE, HXBASE, + "To position your ships: move the cursor to a spot, then"); + MvPrintw(HYBASE + 1, HXBASE, + "type the first letter of a ship type to select it, then"); + MvPrintw(HYBASE + 2, HXBASE, + "type a direction ([hjkl] or [4862]), indicating how the"); + MvPrintw(HYBASE + 3, HXBASE, + "ship should be pointed. You may also type a ship letter"); + MvPrintw(HYBASE + 4, HXBASE, + "followed by `r' to position it randomly, or type `R' to"); + MvPrintw(HYBASE + 5, HXBASE, + "place all remaining ships randomly."); + + MvAddStr(MYBASE, MXBASE, "Aiming keys:"); + MvAddStr(SYBASE, SXBASE, "y k u 7 8 9"); + MvAddStr(SYBASE + 1, SXBASE, " \\|/ \\|/ "); + MvAddStr(SYBASE + 2, SXBASE, "h-+-l 4-+-6"); + MvAddStr(SYBASE + 3, SXBASE, " /|\\ /|\\ "); + MvAddStr(SYBASE + 4, SXBASE, "b j n 1 2 3"); + + /* have the computer place ships */ + for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++) { + randomplace(COMPUTER, ss); + placeship(COMPUTER, ss, FALSE); + } + + do { + char c, docked[SHIPTYPES + 2], *cp = docked; + + ss = (ship_t *) NULL; + + /* figure which ships still wait to be placed */ + *cp++ = 'R'; + for (i = 0; i < SHIPTYPES; i++) + if (!plyship[i].placed) + *cp++ = plyship[i].symbol; + *cp = '\0'; + + /* get a command letter */ + prompt(1, "Type one of [%s] to pick a ship.", docked + 1); + do { + c = (char) getcoord(PLAYER); + } while + (!(strchr) (docked, c)); + + if (c == 'R') + (void) ungetch('R'); + else { + /* map that into the corresponding symbol */ + for (ss = plyship; ss < plyship + SHIPTYPES; ss++) + if (ss->symbol == c) + break; + + prompt(1, "Type one of [hjklrR] to place your %s.", ss->name); + pgoto(cury, curx); + } + + do { + c = (char) getch(); + } while + (!(strchr("hjkl8462rR", c) || c == FF || is_QUIT(c))); + + if (is_QUIT(c)) { + uninitgame(0); + } else if (c == FF) { + (void) clearok(stdscr, TRUE); + (void) refresh(); + } else if (ss == 0) { + beep(); /* simple to verify, unlikely to happen */ + } else if (c == 'r') { + prompt(1, "Random-placing your %s", ss->name); + randomplace(PLAYER, ss); + placeship(PLAYER, ss, TRUE); + error((char *) NULL); + ss->placed = TRUE; + } else if (c == 'R') { + prompt(1, "Placing the rest of your fleet at random...", ""); + for (ss = plyship; ss < plyship + SHIPTYPES; ss++) + if (!ss->placed) { + randomplace(PLAYER, ss); + placeship(PLAYER, ss, TRUE); + ss->placed = TRUE; + } + error((char *) NULL); + } else if (strchr("hjkl8462", c)) { + ss->x = curx; + ss->y = cury; + + switch (c) { + case 'k': + case '8': + ss->dir = dir_N; + break; + case 'j': + case '2': + ss->dir = dir_S; + break; + case 'h': + case '4': + ss->dir = dir_W; + break; + case 'l': + case '6': + ss->dir = dir_E; + break; + } + + if (checkplace(PLAYER, ss, TRUE)) { + placeship(PLAYER, ss, TRUE); + error((char *) NULL); + ss->placed = TRUE; + } + } + + for (unplaced = i = 0; i < SHIPTYPES; i++) + unplaced += !plyship[i].placed; + } while + (unplaced); + + turn = rnd(2); + + MvPrintw(HYBASE, HXBASE, + "To fire, move the cursor to your chosen aiming point "); + MvPrintw(HYBASE + 1, HXBASE, + "and strike any key other than a motion key. "); + MvPrintw(HYBASE + 2, HXBASE, + " "); + MvPrintw(HYBASE + 3, HXBASE, + " "); + MvPrintw(HYBASE + 4, HXBASE, + " "); + MvPrintw(HYBASE + 5, HXBASE, + " "); + + (void) prompt(0, "Press any key to start...", ""); + (void) getch(); +} + +static int +getcoord(int atcpu) +{ + if (atcpu) + cgoto(cury, curx); + else + pgoto(cury, curx); + (void) refresh(); + + for (;;) { + int ny, nx, c; + + if (atcpu) { + MvPrintw(CYBASE + BDEPTH + 1, CXBASE + 11, "(%d, %c)", + curx, 'A' + cury); + cgoto(cury, curx); + } else { + MvPrintw(PYBASE + BDEPTH + 1, PXBASE + 11, "(%d, %c)", + curx, 'A' + cury); + pgoto(cury, curx); + } + + switch (c = getch()) { + case 'k': + case '8': + case KEY_UP: + ny = cury + BDEPTH - 1; + nx = curx; + break; + case 'j': + case '2': + case KEY_DOWN: + ny = cury + 1; + nx = curx; + break; + case 'h': + case '4': + case KEY_LEFT: + ny = cury; + nx = curx + BWIDTH - 1; + break; + case 'l': + case '6': + case KEY_RIGHT: + ny = cury; + nx = curx + 1; + break; + case 'y': + case '7': + case KEY_A1: + ny = cury + BDEPTH - 1; + nx = curx + BWIDTH - 1; + break; + case 'b': + case '1': + case KEY_C1: + ny = cury + 1; + nx = curx + BWIDTH - 1; + break; + case 'u': + case '9': + case KEY_A3: + ny = cury + BDEPTH - 1; + nx = curx + 1; + break; + case 'n': + case '3': + case KEY_C3: + ny = cury + 1; + nx = curx + 1; + break; + case FF: + nx = curx; + ny = cury; + (void) clearok(stdscr, TRUE); + (void) refresh(); + break; +#ifdef NCURSES_MOUSE_VERSION + case KEY_MOUSE: + { + MEVENT myevent; + + getmouse(&myevent); + if (atcpu + && myevent.y >= CY(0) && myevent.y <= CY(BDEPTH) + && myevent.x >= CX(0) && myevent.x <= CX(BDEPTH)) { + curx = CXINV(myevent.x); + cury = CYINV(myevent.y); + return (' '); + } else { + beep(); + continue; + } + } + /* no fall through */ +#endif /* NCURSES_MOUSE_VERSION */ + + default: + if (atcpu) + MvAddStr(CYBASE + BDEPTH + 1, CXBASE + 11, " "); + else + MvAddStr(PYBASE + BDEPTH + 1, PXBASE + 11, " "); + return (c); + } + + curx = nx % BWIDTH; + cury = ny % BDEPTH; + } +} + +static bool +collidecheck(int b, int y, int x) +/* is this location on the selected zboard adjacent to a ship? */ +{ + bool collide; + + /* anything on the square */ + if ((collide = IS_SHIP(board[b][x][y])) != FALSE) + return (collide); + + /* anything on the neighbors */ + if (!closepack) { + int i; + + for (i = 0; i < dir_MAX; i++) { + int xend, yend; + + yend = y + yincr[i]; + xend = x + xincr[i]; + if (ONBOARD(xend, yend) + && IS_SHIP(board[b][xend][yend])) { + collide = TRUE; + break; + } + } + } + return (collide); +} + +static bool +checkplace(int b, const ship_t * ss, int vis) +{ + int l, xend, yend; + + /* first, check for board edges */ + xend = ss->x + (ss->length - 1) * xincr[ss->dir]; + yend = ss->y + (ss->length - 1) * yincr[ss->dir]; + if (!ONBOARD(xend, yend)) { + if (vis) + switch (rnd(3)) { + case 0: + error("Ship is hanging from the edge of the world"); + break; + case 1: + error("Try fitting it on the board"); + break; + case 2: + error("Figure I won't find it if you put it there?"); + break; + } + return (FALSE); + } + + for (l = 0; l < ss->length; ++l) { + if (collidecheck(b, ss->y + l * yincr[ss->dir], ss->x + l * xincr[ss->dir])) { + if (vis) + switch (rnd(3)) { + case 0: + error("There's already a ship there"); + break; + case 1: + error("Collision alert! Aaaaaagh!"); + break; + case 2: + error("Er, Admiral, what about the other ship?"); + break; + } + return (FALSE); + } + } + return (TRUE); +} + +static int +awinna(void) +{ + int i, j; + + for (i = 0; i < 2; ++i) { + ship_t *ss = (i) ? cpuship : plyship; + for (j = 0; j < SHIPTYPES; ++j, ++ss) + if (ss->length > ss->hits) + break; + if (j == SHIPTYPES) + return (OTHER); + } + return (-1); +} + +static ship_t * +hitship(int x, int y) +/* register a hit on the targeted ship */ +{ + ship_t *sb, *ss; + char sym; + int oldx, oldy; + + getyx(stdscr, oldy, oldx); + sb = (turn) ? plyship : cpuship; + if ((sym = board[OTHER][x][y]) == 0) + return ((ship_t *) NULL); + for (ss = sb; ss < sb + SHIPTYPES; ++ss) + if (ss->symbol == sym) { + if (++ss->hits < ss->length) /* still afloat? */ + return ((ship_t *) NULL); + else { /* sunk! */ + int i; + + if (!closepack) { + int j; + + for (j = -1; j <= 1; j++) { + int bx = ss->x + j * xincr[(ss->dir + 2) % dir_MAX]; + int by = ss->y + j * yincr[(ss->dir + 2) % dir_MAX]; + + for (i = -1; i <= ss->length; ++i) { + int x1, y1; + + x1 = bx + i * xincr[ss->dir]; + y1 = by + i * yincr[ss->dir]; + if (ONBOARD(x1, y1)) { + hits[turn][x1][y1] = MARK_MISS; + if (turn % 2 == PLAYER) { + cgoto(y1, x1); +#ifdef A_COLOR + if (has_colors()) + attron(COLOR_PAIR(COLOR_GREEN)); +#endif /* A_COLOR */ + AddCh(MARK_MISS); +#ifdef A_COLOR + (void) attrset(0); +#endif /* A_COLOR */ + } else { + pgoto(y1, x1); + AddCh(SHOWSPLASH); + } + } + } + } + } + + for (i = 0; i < ss->length; ++i) { + int x1 = ss->x + i * xincr[ss->dir]; + int y1 = ss->y + i * yincr[ss->dir]; + + hits[turn][x1][y1] = ss->symbol; + if (turn % 2 == PLAYER) { + cgoto(y1, x1); + AddCh(ss->symbol); + } else { + pgoto(y1, x1); +#ifdef A_COLOR + if (has_colors()) + attron(COLOR_PAIR(COLOR_RED)); +#endif /* A_COLOR */ + AddCh(SHOWHIT); +#ifdef A_COLOR + (void) attrset(0); +#endif /* A_COLOR */ + } + } + + (void) move(oldy, oldx); + return (ss); + } + } + (void) move(oldy, oldx); + return ((ship_t *) NULL); +} + +static bool +plyturn(void) +{ + ship_t *ss; + bool hit; + NCURSES_CONST char *m = NULL; + + prompt(1, "Where do you want to shoot? ", ""); + for (;;) { + (void) getcoord(COMPUTER); + if (hits[PLAYER][curx][cury]) { + prompt(1, "You shelled this spot already! Try again.", ""); + beep(); + } else + break; + } + hit = IS_SHIP(board[COMPUTER][curx][cury]); + hits[PLAYER][curx][cury] = (char) (hit ? MARK_HIT : MARK_MISS); + cgoto(cury, curx); +#ifdef A_COLOR + if (has_colors()) { + if (hit) + attron(COLOR_PAIR(COLOR_RED)); + else + attron(COLOR_PAIR(COLOR_GREEN)); + } +#endif /* A_COLOR */ + AddCh(hits[PLAYER][curx][cury]); +#ifdef A_COLOR + (void) attrset(0); +#endif /* A_COLOR */ + + prompt(1, "You %s.", hit ? "scored a hit" : "missed"); + if (hit && (ss = hitship(curx, cury))) { + switch (rnd(5)) { + case 0: + m = " You sank my %s!"; + break; + case 1: + m = " I have this sinking feeling about my %s...."; + break; + case 2: + m = " My %s has gone to Davy Jones's locker!"; + break; + case 3: + m = " Glub, glub -- my %s is headed for the bottom!"; + break; + case 4: + m = " You'll pick up survivors from my %s, I hope...!"; + break; + } + if (m != 0) { + (void) printw(m, ss->name); + } + (void) beep(); + } + return (hit); +} + +static int +sgetc(const char *s) +{ + (void) refresh(); + + for (;;) { + int ch = getch(); + const char *s1; + + if (islower(ch)) + ch = toupper(ch); + if (is_QUIT(ch)) + uninitgame(0); + for (s1 = s; *s1 && ch != *s1; ++s1) { + /* EMPTY */ ; + } + if (*s1) { + AddCh(ch); + (void) refresh(); + return (ch); + } + } +} + +static void +randomfire(int *px, int *py) +/* random-fire routine -- implements simple diagonal-striping strategy */ +{ + static int turncount = 0; + static int srchstep = BEGINSTEP; + static int huntoffs; /* Offset on search strategy */ + int ypossible[BWIDTH * BDEPTH], xpossible[BWIDTH * BDEPTH], nposs; + int ypreferred[BWIDTH * BDEPTH], xpreferred[BWIDTH * BDEPTH], npref; + int x, y, i; + + if (turncount++ == 0) + huntoffs = rnd(srchstep); + + /* first, list all possible moves */ + nposs = npref = 0; + for (x = 0; x < BWIDTH; x++) + for (y = 0; y < BDEPTH; y++) + if (!hits[COMPUTER][x][y]) { + xpossible[nposs] = x; + ypossible[nposs] = y; + nposs++; + if (((x + huntoffs) % srchstep) != (y % srchstep)) { + xpreferred[npref] = x; + ypreferred[npref] = y; + npref++; + } + } + + if (npref) { + i = rnd(npref); + + *px = xpreferred[i]; + *py = ypreferred[i]; + } else if (nposs) { + i = rnd(nposs); + + *px = xpossible[i]; + *py = ypossible[i]; + + if (srchstep > 1) + --srchstep; + } else { + error("No moves possible?? Help!"); + ExitProgram(EXIT_FAILURE); + /*NOTREACHED */ + } +} + +#define S_MISS 0 +#define S_HIT 1 +#define S_SUNK -1 + +static int +cpufire(int x, int y) +/* fire away at given location */ +{ + bool hit, sunk; + ship_t *ss = NULL; + + hit = (bool) board[PLAYER][x][y]; + hits[COMPUTER][x][y] = (hit ? MARK_HIT : MARK_MISS); + MvPrintw(PROMPTLINE, 0, + "I shoot at %c%d. I %s!", y + 'A', x, hit ? "hit" : + "miss"); + if ((sunk = (hit && (ss = hitship(x, y)))) != 0) + (void) printw(" I've sunk your %s", ss->name); + (void) clrtoeol(); + + pgoto(y, x); +#ifdef A_COLOR + if (has_colors()) { + if (hit) + attron(COLOR_PAIR(COLOR_RED)); + else + attron(COLOR_PAIR(COLOR_GREEN)); + } +#endif /* A_COLOR */ + AddCh((hit ? SHOWHIT : SHOWSPLASH)); +#ifdef A_COLOR + (void) attrset(0); +#endif /* A_COLOR */ + + return hit ? (sunk ? S_SUNK : S_HIT) : S_MISS; +} + +/* + * This code implements a fairly irregular FSM, so please forgive the rampant + * unstructuredness below. The five labels are states which need to be held + * between computer turns. + * + * The FSM is not externally reset to RANDOM_FIRE if the player wins. Instead, + * the other states check for "impossible" conditions which signify a new + * game, then if found transition to RANDOM_FIRE. + */ +static bool +cputurn(void) +{ +#define POSSIBLE(x, y) (ONBOARD(x, y) && !hits[COMPUTER][x][y]) +#define RANDOM_FIRE 0 +#define RANDOM_HIT 1 +#define HUNT_DIRECT 2 +#define FIRST_PASS 3 +#define REVERSE_JUMP 4 +#define SECOND_PASS 5 + static int next = RANDOM_FIRE; + static bool used[5]; + static ship_t ts; + int navail, x, y, d, n; + int hit = S_MISS; + + switch (next) { + case RANDOM_FIRE: /* last shot was random and missed */ + refire: + randomfire(&x, &y); + if (!(hit = cpufire(x, y))) + next = RANDOM_FIRE; + else { + ts.x = x; + ts.y = y; + ts.hits = 1; + next = (hit == S_SUNK) ? RANDOM_FIRE : RANDOM_HIT; + } + break; + + case RANDOM_HIT: /* last shot was random and hit */ + used[dir_E / 2] = + used[dir_S / 2] = + used[dir_W / 2] = + used[dir_N / 2] = FALSE; + /* FALLTHROUGH */ + + case HUNT_DIRECT: /* last shot hit, we're looking for ship's long axis */ + for (d = navail = 0; d < (dir_MAX) / 2; d++) { + x = ts.x + xincr[d * 2]; + y = ts.y + yincr[d * 2]; + if (!used[d] && POSSIBLE(x, y)) + navail++; + else + used[d] = TRUE; + } + if (navail == 0) /* no valid places for shots adjacent... */ + goto refire; /* ...so we must random-fire */ + else { + n = rnd(navail) + 1; + for (d = 0; d < (dir_MAX) / 2 && used[d]; d++) ; + /* used[d] is first that == 0 */ + for (; n > 1; n--) + while (d < (dir_MAX) / 2 && used[++d]) ; + /* used[d] is next that == 0 */ + + assert(d < (dir_MAX) / 2); + assert(used[d] == FALSE); + + used[d] = TRUE; + x = ts.x + xincr[d * 2]; + y = ts.y + yincr[d * 2]; + + assert(POSSIBLE(x, y)); + + if (!(hit = cpufire(x, y))) + next = HUNT_DIRECT; + else { + ts.x = x; + ts.y = y; + ts.dir = d * 2; + ts.hits++; + next = (hit == S_SUNK) ? RANDOM_FIRE : FIRST_PASS; + } + } + break; + + case FIRST_PASS: /* we have a start and a direction now */ + x = ts.x + xincr[ts.dir]; + y = ts.y + yincr[ts.dir]; + if (POSSIBLE(x, y) && (hit = cpufire(x, y))) { + ts.x = x; + ts.y = y; + ts.hits++; + next = (hit == S_SUNK) ? RANDOM_FIRE : FIRST_PASS; + } else + next = REVERSE_JUMP; + break; + + case REVERSE_JUMP: /* nail down the ship's other end */ + d = (ts.dir + (dir_MAX) / 2) % dir_MAX; + x = ts.x + ts.hits * xincr[d]; + y = ts.y + ts.hits * yincr[d]; + if (POSSIBLE(x, y) && (hit = cpufire(x, y))) { + ts.x = x; + ts.y = y; + ts.dir = d; + ts.hits++; + next = (hit == S_SUNK) ? RANDOM_FIRE : SECOND_PASS; + } else + next = RANDOM_FIRE; + break; + + case SECOND_PASS: /* continue shooting after reversing */ + x = ts.x + xincr[ts.dir]; + y = ts.y + yincr[ts.dir]; + if (POSSIBLE(x, y) && (hit = cpufire(x, y))) { + ts.x = x; + ts.y = y; + ts.hits++; + next = (hit == S_SUNK) ? RANDOM_FIRE : SECOND_PASS; + break; + } else + next = RANDOM_FIRE; + break; + } + + /* pause between shots in salvo */ + if (salvo) { + (void) refresh(); + (void) sleep(1); + } +#ifdef DEBUG + MvPrintw(PROMPTLINE + 2, 0, + "New state %d, x=%d, y=%d, d=%d", + next, x, y, d); +#endif /* DEBUG */ + return ((hit) ? TRUE : FALSE); +} + +static int +playagain(void) +{ + int j; + ship_t *ss; + + for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++) + for (j = 0; j < ss->length; j++) { + cgoto(ss->y + j * yincr[ss->dir], ss->x + j * xincr[ss->dir]); + AddCh(ss->symbol); + } + + if (awinna()) + ++cpuwon; + else + ++plywon; + j = 18 + (int) strlen(your_name); + if (plywon >= 10) + ++j; + if (cpuwon >= 10) + ++j; + MvPrintw(1, (COLWIDTH - j) / 2, + "%s: %d Computer: %d", your_name, plywon, cpuwon); + + prompt(2, (awinna())? "Want to be humiliated again, %s [yn]? " + : "Going to give me a chance for revenge, %s [yn]? ", your_name); + return (sgetc("YN") == 'Y'); +} + +static int +scount(int who) +{ + register int i, shots; + register ship_t *sp; + + if (who) + sp = cpuship; /* count cpu shots */ + else + sp = plyship; /* count player shots */ + + for (i = 0, shots = 0; i < SHIPTYPES; i++, sp++) { + if (sp->hits >= sp->length) + continue; /* dead ship */ + else + shots++; + } + return (shots); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: bs [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -b play a blitz game" + ," -c ships may be adjacent" + ," -s play a salvo game" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON "bcs")) != -1) { + switch (ch) { + case 'b': + blitz = 1; + if (salvo == 1) { + (void) fprintf(stderr, + "Bad Arg: -b and -s are mutually exclusive\n"); + ExitProgram(EXIT_FAILURE); + } + break; + case 's': + salvo = 1; + if (blitz == 1) { + (void) fprintf(stderr, + "Bad Arg: -s and -b are mutually exclusive\n"); + ExitProgram(EXIT_FAILURE); + } + break; + case 'c': + closepack = 1; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + intro(); + do { + initgame(); + while (awinna() == -1) { + if (!blitz) { + if (!salvo) { + if (turn) + (void) cputurn(); + else + (void) plyturn(); + } else { + register int i; + + i = scount(turn); + while (i--) { + if (turn) { + if (cputurn() && awinna() != -1) + i = 0; + } else { + if (plyturn() && awinna() != -1) + i = 0; + } + } + } + } else + while ((turn ? cputurn() : plyturn()) && awinna() == -1) { + /* EMPTY */ ; + } + turn = OTHER; + } + } while + (playagain()); + uninitgame(0); + /*NOTREACHED */ +} + +/* bs.c ends here */ diff --git a/contrib/ncurses/test/bulgarian-utf8-tabs.txt b/contrib/ncurses/test/bulgarian-utf8-tabs.txt new file mode 100644 index 00000000..65e42bb1 --- /dev/null +++ b/contrib/ncurses/test/bulgarian-utf8-tabs.txt @@ -0,0 +1,6 @@ +Показване на помощна информация -- 1 +Създаване на дялове -- 2 +Избор на дял и форматиране -- 3 +Записване в избрания дял -- 4 +Инсталиране на LILO -- 5 +Изход от програмата -- 6 diff --git a/contrib/ncurses/test/bulgarian-utf8.txt b/contrib/ncurses/test/bulgarian-utf8.txt new file mode 100644 index 00000000..046c059c --- /dev/null +++ b/contrib/ncurses/test/bulgarian-utf8.txt @@ -0,0 +1,6 @@ +Показване на помощна информация -- 1 +Създаване на дялове -- 2 +Избор на дял и форматиране -- 3 +Записване в избрания дял -- 4 +Инсталиране на LILO -- 5 +Изход от програмата -- 6 diff --git a/contrib/ncurses/test/cardfile.c b/contrib/ncurses/test/cardfile.c new file mode 100644 index 00000000..2652ba9f --- /dev/null +++ b/contrib/ncurses/test/cardfile.c @@ -0,0 +1,635 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1999-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: cardfile.c,v 1.52 2024/10/05 19:26:24 tom Exp $ + * + * File format: text beginning in column 1 is a title; other text is content. + */ + +#include + +#if USE_LIBFORM && USE_LIBPANEL + +#include +#include + +#define VISIBLE_CARDS 10 +#define OFFSET_CARD 2 +#define pair_1 1 +#define pair_2 2 + +#define isVisible(cardp) ((cardp)->panel != 0) + +enum { + MY_CTRL_x = MAX_FORM_COMMAND + ,MY_CTRL_N + ,MY_CTRL_P + ,MY_CTRL_Q + ,MY_CTRL_W +}; + +typedef struct _card { + struct _card *link; + PANEL *panel; + FORM *form; + char *title; + char *content; +} CARD; + +static CARD *all_cards; +static bool try_color = FALSE; +static char default_name[] = "cardfile.dat"; + +static void +failed(const char *s) +{ + perror(s); + endwin(); + ExitProgram(EXIT_FAILURE); +} + +static const char * +skip(const char *buffer) +{ + while (isspace(UChar(*buffer))) + buffer++; + return buffer; +} + +static void +trim(char *buffer) +{ + size_t n = strlen(buffer); + while (n-- && isspace(UChar(buffer[n]))) + buffer[n] = 0; +} + +/*******************************************************************************/ + +static CARD * +add_title(const char *title) +{ + CARD *card, *p, *q; + + for (p = all_cards, q = 0; p != 0; q = p, p = p->link) { + int cmp = strcmp(p->title, title); + if (cmp == 0) + return p; + if (cmp > 0) + break; + } + + card = typeCalloc(CARD, (size_t) 1); + card->title = strdup(title); + card->content = strdup(""); + + if (q == 0) { + card->link = all_cards; + all_cards = card; + } else { + card->link = q->link; + q->link = card; + } + + return card; +} + +static void +add_content(CARD * card, const char *content) +{ + size_t total; + + content = skip(content); + if ((total = strlen(content)) != 0) { + size_t offset; + + if (card->content != 0 && (offset = strlen(card->content)) != 0) { + total += 1 + offset; + card->content = typeRealloc(char, total + 1, card->content); + if (card->content) { + _nc_STRCPY(card->content + offset, " ", total + 1 - offset); + offset++; + } + } else { + offset = 0; + if (card->content != 0) + free(card->content); + card->content = typeMalloc(char, total + 1); + } + if (card->content) + _nc_STRCPY(card->content + offset, content, total + 1 - offset); + else + failed("add_content"); + } +} + +static CARD * +new_card(void) +{ + CARD *card = add_title(""); + add_content(card, ""); + return card; +} + +static CARD * +find_card(const char *title) +{ + CARD *card; + + for (card = all_cards; card != 0; card = card->link) + if (!strcmp(card->title, title)) + break; + + return card; +} + +static void +read_data(const char *fname) +{ + FILE *fp; + + if ((fp = fopen(fname, "r")) != 0) { + CARD *card = 0; + char buffer[BUFSIZ]; + + while (fgets(buffer, sizeof(buffer), fp)) { + trim(buffer); + if (isspace(UChar(*buffer))) { + if (card == 0) + card = add_title(""); + add_content(card, buffer); + } else if ((card = find_card(buffer)) == 0) { + card = add_title(buffer); + } + } + fclose(fp); + } +} + +/*******************************************************************************/ + +static void +write_data(const char *fname) +{ + FILE *fp; + + if (!strcmp(fname, default_name)) + fname = "cardfile.out"; + + if ((fp = fopen(fname, "w")) != 0) { + CARD *p = 0; + + for (p = all_cards; p != 0; p = p->link) { + FIELD **f = form_fields(p->form); + int n; + + for (n = 0; f[n] != 0; n++) { + char *s = field_buffer(f[n], 0); + if (s != 0 + && (s = strdup(s)) != 0) { + trim(s); + fprintf(fp, "%s%s\n", n ? "\t" : "", s); + free(s); + } + } + } + fclose(fp); + } +} + +/*******************************************************************************/ + +/* + * Count the cards + */ +static int +count_cards(void) +{ + CARD *p; + int count = 0; + + for (p = all_cards; p != 0; p = p->link) + count++; + + return count; +} + +/* + * Shuffle the panels to keep them in a natural hierarchy. + */ +static void +order_cards(CARD * first, int depth) +{ + if (first) { + if (depth && first->link) + order_cards(first->link, depth - 1); + if (isVisible(first)) + top_panel(first->panel); + } +} + +/* + * Return the next card in the list + */ +static CARD * +next_card(CARD * now) +{ + if (now->link != 0) { + CARD *tst = now->link; + if (isVisible(tst)) + now = tst; + else + (void) next_card(tst); + } + return now; +} + +/* + * Return the previous card in the list + */ +static CARD * +prev_card(CARD * now) +{ + CARD *p; + for (p = all_cards; p != 0; p = p->link) { + if (p->link == now) { + if (!isVisible(p)) + p = prev_card(p); + return p; + } + } + return now; +} + +/* + * Returns the first card in the list that we will display. + */ +static CARD * +first_card(CARD * now) +{ + if (now != NULL && !isVisible(now)) + now = next_card(now); + return now; +} + +/*******************************************************************************/ + +static int +form_virtualize(WINDOW *w) +{ + int c = wgetch(w); + + switch (c) { + case CTRL('W'): + return (MY_CTRL_W); + case CTRL('N'): + return (MY_CTRL_N); + case CTRL('P'): + return (MY_CTRL_P); + case QUIT: + case ESCAPE: + return (MY_CTRL_Q); + + case KEY_BACKSPACE: + return (REQ_DEL_PREV); + case KEY_DC: + return (REQ_DEL_CHAR); + case KEY_LEFT: + return (REQ_LEFT_CHAR); + case KEY_RIGHT: + return (REQ_RIGHT_CHAR); + + case KEY_DOWN: + case KEY_NEXT: + return (REQ_NEXT_FIELD); + case KEY_UP: + case KEY_PREVIOUS: + return (REQ_PREV_FIELD); + + default: + return (c); + } +} + +static FIELD ** +make_fields(const CARD * p, int form_high, int form_wide) +{ + FIELD **f = typeCalloc(FIELD *, (size_t) 3); + + f[0] = new_field(1, form_wide, 0, 0, 0, 0); + set_field_back(f[0], A_REVERSE); + set_field_buffer(f[0], 0, p->title); + field_opts_off(f[0], O_BLANK); + + f[1] = new_field(form_high - 1, form_wide, 1, 0, 0, 0); + set_field_buffer(f[1], 0, p->content); + set_field_just(f[1], JUSTIFY_LEFT); + field_opts_off(f[1], O_BLANK); + + f[2] = 0; + return f; +} + +static void +show_legend(void) +{ + erase(); + move(LINES - 3, 0); + addstr("^Q/ESC -- exit form ^W -- writes data to file\n"); + addstr("^N -- go to next card ^P -- go to previous card\n"); + addstr("Arrow keys move left/right within a field, up/down between fields"); +} + +#if (defined(KEY_RESIZE) && HAVE_WRESIZE) || NO_LEAKS +static void +free_form_fields(FIELD **f) +{ + int n; + + for (n = 0; f[n] != 0; ++n) { + free_field(f[n]); + } + free(f); +} +#endif + +/*******************************************************************************/ + +static void +cardfile(const char *fname) +{ + WINDOW *win; + CARD *p; + CARD *top_card; + int visible_cards; + int panel_wide; + int panel_high; + int form_wide; + int form_high; + int y; + int x; + int finished = FALSE; + + show_legend(); + + /* decide how many cards we can display */ + visible_cards = count_cards(); + while ( + (panel_wide = COLS - (visible_cards * OFFSET_CARD)) < 10 || + (panel_high = LINES - (visible_cards * OFFSET_CARD) - 5) < 5) { + --visible_cards; + } + form_wide = panel_wide - 2; + form_high = panel_high - 2; + y = (visible_cards - 1) * OFFSET_CARD; + x = 0; + + /* make a panel for each CARD */ + for (p = all_cards; p != 0; p = p->link) { + + if ((win = newwin(panel_high, panel_wide, y, x)) == 0) + break; + + wbkgd(win, (chtype) COLOR_PAIR(pair_2)); + keypad(win, TRUE); + p->panel = new_panel(win); + box(win, 0, 0); + + p->form = new_form(make_fields(p, form_high, form_wide)); + set_form_win(p->form, win); + set_form_sub(p->form, derwin(win, form_high, form_wide, 1, 1)); + post_form(p->form); + + y -= OFFSET_CARD; + x += OFFSET_CARD; + } + + top_card = first_card(all_cards); + order_cards(top_card, visible_cards); + + while (!finished) { + int ch = ERR; + + update_panels(); + doupdate(); + + ch = form_virtualize(panel_window(top_card->panel)); + switch (form_driver(top_card->form, ch)) { + case E_OK: + break; + case E_UNKNOWN_COMMAND: + switch (ch) { + case MY_CTRL_Q: + finished = TRUE; + break; + case MY_CTRL_P: + top_card = prev_card(top_card); + order_cards(top_card, visible_cards); + break; + case MY_CTRL_N: + top_card = next_card(top_card); + order_cards(top_card, visible_cards); + break; + case MY_CTRL_W: + form_driver(top_card->form, REQ_VALIDATION); + write_data(fname); + break; +#if defined(KEY_RESIZE) && HAVE_WRESIZE + case KEY_RESIZE: + /* resizeterm already did "something" reasonable, but it cannot + * know much about layout. So let's make it nicer. + */ + panel_wide = COLS - (visible_cards * OFFSET_CARD); + panel_high = LINES - (visible_cards * OFFSET_CARD) - 5; + + form_wide = panel_wide - 2; + form_high = panel_high - 2; + + y = (visible_cards - 1) * OFFSET_CARD; + x = 0; + + show_legend(); + for (p = all_cards; p != 0; p = p->link) { + FIELD **oldf = form_fields(p->form); + WINDOW *olds = form_sub(p->form); + + if (!isVisible(p)) + continue; + win = form_win(p->form); + + /* move and resize the card as needed + * FIXME: if the windows are shrunk too much, this won't do + */ + mvwin(win, y, x); + wresize(win, panel_high, panel_wide); + + /* reconstruct each form. Forms are not resizable, and + * there appears to be no good way to reload the text in + * a resized window. + */ + werase(win); + + unpost_form(p->form); + free_form(p->form); + + p->form = new_form(make_fields(p, form_high, form_wide)); + set_form_win(p->form, win); + set_form_sub(p->form, derwin(win, form_high, form_wide, + 1, 1)); + post_form(p->form); + + free_form_fields(oldf); + delwin(olds); + + box(win, 0, 0); + + y -= OFFSET_CARD; + x += OFFSET_CARD; + } + break; +#endif + default: + beep(); + break; + } + break; + default: + flash(); + break; + } + } +#if NO_LEAKS + while (all_cards != 0) { + p = all_cards; + all_cards = all_cards->link; + + if (isVisible(p)) { + FIELD **f = form_fields(p->form); + + unpost_form(p->form); /* ...so we can free it */ + free_form(p->form); /* this also disconnects the fields */ + + free_form_fields(f); + + del_panel(p->panel); + } + free(p->title); + free(p->content); + free(p); + } +#endif +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: cardfile [options] file" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -c use color if terminal supports it" + }; + size_t n; + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} + +/*******************************************************************************/ +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "c")) != -1) { + switch (ch) { + case 'c': + try_color = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + initscr(); + cbreak(); + noecho(); + + if (try_color) { + if (has_colors()) { + start_color(); + init_pair(pair_1, COLOR_WHITE, COLOR_BLUE); + init_pair(pair_2, COLOR_WHITE, COLOR_CYAN); + bkgd((chtype) COLOR_PAIR(pair_1)); + } else { + try_color = FALSE; + } + } + + if (optind + 1 == argc) { + int n; + for (n = 1; n < argc; n++) + read_data(argv[n]); + if (count_cards() == 0) + new_card(); + cardfile(argv[1]); + } else { + read_data(default_name); + if (count_cards() == 0) + new_card(); + cardfile(default_name); + } + + endwin(); + + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the curses form and panel libraries\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/cardfile.dat b/contrib/ncurses/test/cardfile.dat new file mode 100644 index 00000000..deb4b76a --- /dev/null +++ b/contrib/ncurses/test/cardfile.dat @@ -0,0 +1,13 @@ +title 1 + Some text for title1 + and some more text +title 2 + The quicker brown fox ran all over the lazy dog. +put a card before the first two + This is an example of a simple cardfile. +show a fourth card + The fourth card + has a large amount of data, + more than the other cards. + At least, that is what I thought it should do, since I want to see how well + the forms package handles justification. diff --git a/contrib/ncurses/test/chgat.c b/contrib/ncurses/test/chgat.c new file mode 100644 index 00000000..da5ebab8 --- /dev/null +++ b/contrib/ncurses/test/chgat.c @@ -0,0 +1,407 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2006-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: chgat.c,v 1.23 2024/10/06 22:35:55 tom Exp $ + * + * test-driver for chgat/wchgat/mvchgat/mvwchgat + */ + +#include + +#if HAVE_CHGAT + +#include + +#define SHOW(n) ((n) == ERR ? "ERR" : "OK") +#define COLOR_DEFAULT (-1) + +#if defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH < 20060715 +#define touch_if_needed(win, row) touchline(win, row, 1) +#else +#define touch_if_needed(win, row) /* nothing */ +#endif + +typedef struct { + size_t c; + size_t v; + short pair; + attr_t attr; + int count; + int ch; + const char *c_msg; + const char *v_msg; + int y_val; + int x_val; + int y_beg, x_beg; + int y_max, x_max; +} STATUS; + +static const char * +color_params(size_t state, short *pair) +{ + /* *INDENT-OFF* */ + static struct { + short pair; + short fg, bg; + const char *msg; + } table[] = { + { 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" }, + { 1, COLOR_RED, COLOR_BLACK, "red/black" }, + { 2, COLOR_WHITE, COLOR_BLUE, "white/blue" }, + }; + /* *INDENT-ON* */ + + const char *result = 0; + + if (has_colors()) { + static bool first = TRUE; + + if (first) { + size_t n; + + start_color(); + for (n = 0; n < SIZEOF(table); ++n) { + init_pair(table[n].pair, table[n].fg, table[n].bg); + } + } + if (state < SIZEOF(table)) { + *pair = table[state].pair; + result = table[state].msg; + } + } + return result; +} + +static const char * +video_params(size_t state, attr_t *attr) +{ + /* *INDENT-OFF* */ + static struct { + attr_t attr; + const char *msg; + } table[] = { + { WA_NORMAL, "normal" }, + { WA_BOLD, "bold" }, + { WA_REVERSE, "reverse" }, + { WA_UNDERLINE, "underline" }, + { WA_BLINK, "blink" }, + }; + /* *INDENT-ON* */ + + const char *result = 0; + + if (state < SIZEOF(table)) { + *attr = table[state].attr; + result = table[state].msg; + } + return result; +} + +/* fill the window with a test-pattern */ +static void +fill_window(WINDOW *win) +{ + int y, x; + int y0 = -1, x0 = -1; + + getyx(win, y, x); + wmove(win, 0, 0); + while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) { + int y1, x1; + getyx(win, y1, x1); + if (y1 == y0 && x1 == x0) + break; + x0 = x1; + y0 = y1; + } + wmove(win, y, x); +} + +static void +show_status(WINDOW *win, STATUS * sp) +{ + int y, x; + + getyx(win, y, x); + wmove(win, 0, 0); + wprintw(win, "Count %d", sp->count); + if (sp->v_msg != 0) + wprintw(win, " Video %s", sp->v_msg); + if (sp->c_msg != 0) + wprintw(win, " Color %s", sp->c_msg); + wclrtoeol(win); + wmove(win, y, x); +} + +static void +do_subwindow(WINDOW *win, const STATUS * sp, void func(WINDOW *)) +{ + WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2, + sp->y_beg + 1, sp->x_beg + 1); + + if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) { + WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1); + + if (win2 != 0) { + box(win1, 0, 0); + wrefresh(win1); + func(win2); + + delwin(win2); + } else { + beep(); + } + delwin(win1); + touchwin(win); + } else { + if (win1 != 0) + delwin(win1); + beep(); + } +} + +static void +init_status(WINDOW *win, STATUS * sp) +{ + memset(sp, 0, sizeof(*sp)); + sp->c = 99; + sp->v = 99; + sp->ch = ' '; + + keypad(win, TRUE); + fill_window(win); + + getbegyx(win, sp->y_beg, sp->x_beg); + getmaxyx(win, sp->y_max, sp->x_max); +} + +static void +show_help(WINDOW *win) +{ + static NCURSES_CONST char *msgs[] = + { + "Basic commands:" + ,"Use h/j/k/l or arrow keys to move the cursor." + ,"Set the count parameter for chgat by entering digits 0-9." + ,"" + ,"Other commands:" + ,"space toggles through the set of video attributes and colors." + ,"t touches (forces repaint) of the current line." + ,". calls *chgat at the current position with the given count." + ,", calls *chgat at the window beginning with the given count." + ,"= resets count to zero." + ,"- negates count." + ,"? shows this help-window" + ,0 + }; + + popup_msg(win, msgs); +} + +static void +update_status(WINDOW *win, STATUS * sp) +{ + switch (sp->ch) { + case ' ': /* next test-iteration */ + if (has_colors()) { + if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) { + sp->c_msg = color_params(sp->c = 0, &(sp->pair)); + if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { + sp->v_msg = video_params(sp->v = 0, &(sp->attr)); + } + } + } else { + if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { + sp->v_msg = video_params(sp->v = 0, &(sp->attr)); + } + } + sp->count = 0; + show_status(win, sp); + break; + case KEY_LEFT: + case 'h': + if (sp->x_val > 0) + wmove(win, sp->y_val, --(sp->x_val)); + break; + case KEY_DOWN: + case 'j': + if (sp->y_val < sp->y_max) + wmove(win, ++(sp->y_val), sp->x_val); + break; + case KEY_UP: + case 'k': + if (sp->y_val > 0) + wmove(win, --(sp->y_val), sp->x_val); + break; + case KEY_RIGHT: + case 'l': + if (sp->x_val < sp->x_max) + wmove(win, sp->y_val, ++(sp->x_val)); + break; + case 't': + touchline(win, sp->y_val, 1); + break; + case '=': + sp->count = 0; + show_status(win, sp); + break; + case '-': + sp->count = -(sp->count); + show_status(win, sp); + break; + case HELP_KEY_1: + show_help(win); + break; + default: + if (isdigit(sp->ch)) { + sp->count = (sp->count * 10) + (sp->ch - '0'); + show_status(win, sp); + } else { + beep(); + } + break; + } +} + +static void +test_wchgat(WINDOW *win) +{ + STATUS st; + + init_status(win, &st); + + do { + switch (st.ch) { + case '.': /* change from current position */ + wchgat(win, st.count, st.attr, st.pair, (void *) 0); + touch_if_needed(win, st.y_val); + break; + case ',': /* change from beginning of window */ + mvwchgat(win, 0, 0, st.count, st.attr, st.pair, (void *) 0); + touch_if_needed(win, 0); + wmove(win, st.y_val, st.x_val); + break; + case 'w': + do_subwindow(win, &st, test_wchgat); + break; + case 'q': + return; + default: + update_status(win, &st); + break; + } + } while ((st.ch = wgetch(win)) != ERR); +} + +static void +test_chgat(void) +{ + STATUS st; + + init_status(stdscr, &st); + + do { + switch (st.ch) { + case '.': /* change from current position */ + chgat(st.count, st.attr, st.pair, (void *) 0); + touch_if_needed(stdscr, st.y_val); + break; + case ',': /* change from beginning of window */ + mvchgat(0, 0, st.count, st.attr, st.pair, (void *) 0); + touch_if_needed(stdscr, 0); + move(st.y_val, st.x_val); + break; + case 'w': + do_subwindow(stdscr, &st, test_wchgat); + break; + case 'q': + return; + default: + update_status(stdscr, &st); + break; + } + } while ((st.ch = getch()) != ERR); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: chgat [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + initscr(); + cbreak(); + noecho(); + + test_chgat(); + endwin(); + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses chgat function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/clip_printw.c b/contrib/ncurses/test/clip_printw.c new file mode 100644 index 00000000..d45e85d1 --- /dev/null +++ b/contrib/ncurses/test/clip_printw.c @@ -0,0 +1,476 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2008-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: clip_printw.c,v 1.25 2024/10/06 22:36:25 tom Exp $ + * + * demonstrate how to use printw with/without wrapping. + */ + +#include +#include + +#ifdef HAVE_VW_PRINTW + +#define SHOW(n) ((n) == ERR ? "ERR" : "OK") +#define COLOR_DEFAULT (-1) + +#define X_BASE 0 +#define Y_BASE 1 +#define MARGIN 1 +#define Y_TOP (Y_BASE + MARGIN) + +typedef struct { + unsigned c; + unsigned v; + bool single; + int status; + int pair; + attr_t attr; + int count; + int ch; + const char *c_msg; + const char *v_msg; + int y_val; + int x_val; + int y_beg, x_beg; + int y_max, x_max; +} STATUS; + +static int +clip_wprintw(WINDOW *win, bool single, NCURSES_CONST char *fmt, ...) +{ + int y0, x0, y1, x1, width; + WINDOW *sub; + va_list ap; + int rc; + + getyx(win, y0, x0); + width = getmaxx(win) - x0; + if (single) { + /* + * Allocate a single-line derived window extending from the current + * cursor position to the end of the current line in the given window. + * Disable scrolling in the derived window. + */ + sub = derwin(win, 1, width, y0, x0); + } else { + /* + * Allow printw to wrap through the entire window. + */ + sub = derwin(win, getmaxy(win), getmaxx(win), 0, 0); + wmove(sub, y0, x0); + } + scrollok(sub, FALSE); + + /* + * Print the text. + */ + va_start(ap, fmt); + rc = vw_printw(sub, fmt, ap); + va_end(ap); + + getyx(sub, y1, x1); + delwin(sub); + + if (single) { + wmove(win, y1 + y0, x1 + x0); + } else { + wmove(win, y1, x1); + } + + return rc; +} + +static const char * +color_params(unsigned state, int *pair) +{ + /* *INDENT-OFF* */ + static struct { + int pair; + int fg, bg; + const char *msg; + } table[] = { + { 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" }, + { 1, COLOR_RED, COLOR_BLACK, "red/black" }, + { 2, COLOR_WHITE, COLOR_BLUE, "white/blue" }, + }; + /* *INDENT-ON* */ + + const char *result = 0; + + if (has_colors()) { + static bool first = TRUE; + + if (first) { + unsigned n; + + start_color(); + for (n = 0; n < SIZEOF(table); ++n) { + init_pair((short) table[n].pair, + (short) table[n].fg, + (short) table[n].bg); + } + } + if (state < SIZEOF(table)) { + *pair = table[state].pair; + result = table[state].msg; + } + } + return result; +} + +static const char * +video_params(unsigned state, attr_t *attr) +{ + /* *INDENT-OFF* */ + static struct { + attr_t attr; + const char *msg; + } table[] = { + { WA_NORMAL, "normal" }, + { WA_BOLD, "bold" }, + { WA_REVERSE, "reverse" }, + { WA_UNDERLINE, "underline" }, + { WA_BLINK, "blink" }, + }; + /* *INDENT-ON* */ + + const char *result = 0; + + if (state < SIZEOF(table)) { + *attr = table[state].attr; + result = table[state].msg; + } + return result; +} + +/* fill the window with a test-pattern */ +static void +fill_window(WINDOW *win) +{ + int y_top = (win == stdscr) ? Y_BASE : MARGIN; + int y, x; + int y0 = -1, x0 = -1; + + getyx(win, y, x); + wmove(win, y_top, 0); + while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) { + int y1, x1; + getyx(win, y1, x1); + if (y1 == y0 && x1 == x0) + break; + x0 = x1; + y0 = y1; + } + wmove(win, y, x); +} + +static void +show_status(WINDOW *win, STATUS * sp) +{ + int y, x; + + getyx(win, y, x); + wattron(win, A_REVERSE); + wmove(win, 0, 0); + wprintw(win, "Clip %s", sp->single ? "line" : "window"); + wprintw(win, " Count %d", sp->count); + if (sp->v_msg != 0) + wprintw(win, " Video %s", sp->v_msg); + if (sp->c_msg != 0) + wprintw(win, " Color %s", sp->c_msg); + wprintw(win, " (%d)", sp->status); + wclrtoeol(win); + wattroff(win, A_REVERSE); + wmove(win, y, x); +} + +static void +do_subwindow(WINDOW *win, const STATUS * sp, void func(WINDOW *)) +{ + WINDOW *win1 = newwin(sp->y_max - (2 * MARGIN), + sp->x_max - (2 * MARGIN), + sp->y_beg + MARGIN, + sp->x_beg + MARGIN); + + if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) { + WINDOW *win2 = derwin(win1, + sp->y_max - (2 * MARGIN) - 2, + sp->x_max - (2 * MARGIN) - 2, + (win == stdscr) ? Y_BASE : Y_BASE, + MARGIN); + + if (win2 != 0) { + box(win1, 0, 0); + wrefresh(win1); + func(win2); + + delwin(win2); + } else { + beep(); + } + delwin(win1); + touchwin(win); + } else { + if (win1) + delwin(win1); + beep(); + } +} + +/* + * The status line is within the same window as the test-data. + */ +static void +init_status(WINDOW *win, STATUS * sp) +{ + memset(sp, 0, sizeof(*sp)); + sp->single = TRUE; + sp->c = 99; + sp->v = 99; + sp->ch = ' '; + + keypad(win, TRUE); + fill_window(win); + + getbegyx(win, sp->y_beg, sp->x_beg); + getmaxyx(win, sp->y_max, sp->x_max); + + wmove(win, sp->y_val = Y_BASE, sp->x_val = 0); +} + +static void +show_help(WINDOW *win) +{ + static NCURSES_CONST char *msgs[] = + { + "Basic commands:" + ,"Use h/j/k/l or arrow keys to move the cursor." + ,"Set the count parameter for clip_wprintw by entering digits 0-9." + ,"" + ,"Other commands:" + ,"space toggles through the set of video attributes and colors." + ,"q exit subwindow, quit if last window." + ,"s toggles single-line updates versus entire windows." + ,"t touches (forces repaint) of the current line." + ,"w create subwindow." + ,". calls vw_printw at the current position with the given count." + ,"= resets count to zero." + ,"? shows this help-window" + ,0 + }; + + popup_msg(win, msgs); +} + +static void +update_status(WINDOW *win, STATUS * sp) +{ + int margin = 0; + + switch (sp->ch) { + case ' ': /* next test-iteration */ + if (has_colors()) { + if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) { + sp->c_msg = color_params(sp->c = 0, &(sp->pair)); + if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { + sp->v_msg = video_params(sp->v = 0, &(sp->attr)); + } + } + } else { + if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { + sp->v_msg = video_params(sp->v = 0, &(sp->attr)); + } + } + sp->count = 0; + show_status(win, sp); + break; + case KEY_HOME: + case '^': + wmove(win, sp->y_val, sp->x_val = margin); + break; + case KEY_END: + case '$': + wmove(win, sp->y_val, sp->x_val = (sp->x_max - margin - 1)); + break; + case KEY_PPAGE: + case CTRL('B'): + wmove(win, sp->y_val = Y_BASE, sp->x_val); + break; + case KEY_NPAGE: + case CTRL('F'): + wmove(win, sp->y_val = (sp->y_max - margin - 1), sp->x_val); + break; + case KEY_LEFT: + case 'h': + if (sp->x_val > margin) + wmove(win, sp->y_val, --(sp->x_val)); + break; + case KEY_DOWN: + case 'j': + if (sp->y_val < (sp->y_max - margin)) + wmove(win, ++(sp->y_val), sp->x_val); + break; + case KEY_UP: + case 'k': + if (sp->y_val > Y_BASE) + wmove(win, --(sp->y_val), sp->x_val); + break; + case KEY_RIGHT: + case 'l': + if (sp->x_val < (sp->x_max - margin)) + wmove(win, sp->y_val, ++(sp->x_val)); + break; + case 't': + touchline(win, sp->y_val, 1); + break; + case '=': + sp->count = 0; + show_status(win, sp); + break; + case 's': + sp->single = !sp->single; + show_status(win, sp); + break; + case HELP_KEY_1: + show_help(win); + break; + default: + if (isdigit(sp->ch)) { + sp->count = (sp->count * 10) + (sp->ch - '0'); + show_status(win, sp); + } else { + beep(); + } + break; + } +} + +static void +test_clipping(WINDOW *win) +{ + STATUS st; + char fmt[80]; + char *buffer; + unsigned j, need; + + init_status(win, &st); + + do { + switch (st.ch) { + case '.': /* change from current position */ + (void) wattrset(win, AttrArg(COLOR_PAIR(st.pair), st.attr)); + if (st.count > 0) { + need = (unsigned) st.count + 1; + _nc_SPRINTF(fmt, _nc_SLIMIT(sizeof(fmt)) "%%c%%%ds%%c", st.count); + } else { + int want = getmaxx(win); + if (want < 10) + want = 10; + need = (unsigned) want - 1; + _nc_STRCPY(fmt, "%c%s%c", sizeof(fmt)); + } + if ((buffer = typeMalloc(char, need + 1)) != 0) { + for (j = 0; j < need; ++j) { + buffer[j] = (char) ('A' + (j % 26)); + } + buffer[need - 1] = '\0'; + st.status = clip_wprintw(win, st.single, fmt, '[', buffer, ']'); + free(buffer); + } + break; + case 'w': + do_subwindow(win, &st, test_clipping); + break; + case 'q': + return; + default: + update_status(win, &st); + break; + } + } while ((st.ch = wgetch(win)) != ERR); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: clip_printw [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + initscr(); + cbreak(); + noecho(); + + test_clipping(stdscr); + endwin(); + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses vw_printw function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/color_content.c b/contrib/ncurses/test/color_content.c new file mode 100644 index 00000000..d08dffb0 --- /dev/null +++ b/contrib/ncurses/test/color_content.c @@ -0,0 +1,324 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: color_content.c,v 1.19 2023/02/25 16:48:02 tom Exp $ + */ + +#define NEED_TIME_H +#include + +#if USE_EXTENDED_COLOR +typedef int my_color_t; +#else +typedef NCURSES_COLOR_T my_color_t; +#endif + +typedef struct { + my_color_t r; + my_color_t g; + my_color_t b; +} MYCOLOR; + +static int f_opt; +static int i_opt; +static int l_opt; +static int n_opt; +static int p_opt; +static int r_opt; +static int s_opt; + +#if USE_EXTENDED_COLOR +static int x_opt; +#endif + +static MYCOLOR *expected; + +static TimeType initial_time; +static TimeType finish_time; + +static void +failed(const char *msg) +{ + printw("%s", msg); + getch(); + endwin(); + ExitProgram(EXIT_FAILURE); +} + +#if USE_EXTENDED_COLOR +static int +InitColor(int pair, int r, int g, int b) +{ + int rc; + if (x_opt) { + rc = init_extended_color(pair, r, g, b); + } else { + rc = init_color((NCURSES_PAIRS_T) pair, + (NCURSES_COLOR_T) r, + (NCURSES_COLOR_T) g, + (NCURSES_COLOR_T) b); + } + return rc; +} + +static int +ColorContent(int color, int *rp, int *gp, int *bp) +{ + int rc; + if (x_opt) { + rc = extended_color_content(color, rp, gp, bp); + } else { + NCURSES_COLOR_T r, g, b; + if ((rc = color_content((NCURSES_COLOR_T) color, &r, &g, &b)) == OK) { + *rp = r; + *gp = g; + *bp = b; + } + } + return rc; +} +#else +#define InitColor(color,r,g,b) init_color((NCURSES_COLOR_T)color,(NCURSES_COLOR_T)r,(NCURSES_COLOR_T)g,(NCURSES_COLOR_T)b) +#define ColorContent(color,rp,gp,bp) color_content((NCURSES_COLOR_T)color,rp,gp,bp) +#endif + +static my_color_t +random_color(void) +{ + return (my_color_t) (rand() % 1000); +} + +static void +setup_test(void) +{ + setlocale(LC_ALL, ""); + initscr(); + cbreak(); + noecho(); + scrollok(stdscr, TRUE); + if (has_colors()) { + start_color(); + if (!can_change_color() && !p_opt) + failed("this terminal cannot initialize colors"); + + if (!f_opt) + f_opt = 0; + if (!l_opt) + l_opt = COLORS; + if (l_opt <= 0) + failed("color limit must be greater than zero"); + + if (!n_opt) { + int color; + size_t need = (size_t) ((l_opt > COLORS) ? l_opt : COLORS) + 1; + + expected = typeCalloc(MYCOLOR, need); + if (s_opt) { + int r; + int g; + int b; + color = f_opt; + for (r = 0; r < 1000; ++r) { + for (g = 0; g < 1000; ++g) { + for (b = 0; b < 1000; ++b) { + if (color < l_opt) { + InitColor(color, r, g, b); + expected[color].r = (my_color_t) r; + expected[color].g = (my_color_t) g; + expected[color].b = (my_color_t) b; + ++color; + } else { + break; + } + } + } + } + } else { + for (color = f_opt; color < l_opt; ++color) { + expected[color].r = random_color(); + expected[color].g = random_color(); + expected[color].b = random_color(); + InitColor(color, + expected[color].r, + expected[color].g, + expected[color].b); + } + } + } + } else { + failed("This demo requires a color terminal"); + } + GetClockTime(&initial_time); +} + +static void +run_test(void) +{ + int color; + bool success = TRUE; + for (color = f_opt; color < l_opt; ++color) { + my_color_t r; + my_color_t g; + my_color_t b; + if (ColorContent(color, &r, &g, &b) == OK) { + if (expected != 0) { + if (r != expected[color].r) + success = FALSE; + if (g != expected[color].g) + success = FALSE; + if (b != expected[color].b) + success = FALSE; + } + } + } + if (i_opt) { + addch(success ? '.' : '?'); + refresh(); + } +} + +static void +finish_test(void) +{ + getch(); + endwin(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: color_content [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f COLOR first color value to test (default: 0)" + ," -i interactive, showing test-progress" + ," -l COLOR last color value to test (default: max_colors-1)" + ," -n do not initialize color pairs" + ," -p print data for color content instead of testing" + ," -r COUNT repeat for given count" + ," -s initialize pairs sequentially rather than random" +#if USE_EXTENDED_COLOR + ," -x use extended color pairs/values" +#endif + }; + size_t n; + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:il:npr:sx")) != -1) { + switch (ch) { + case 'f': + if ((f_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 'i': + i_opt = 1; + break; + case 'l': + if ((l_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 'n': + n_opt = 1; + break; + case 'p': + p_opt = 1; + break; + case 'r': + if ((r_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 's': + s_opt = 1; + break; +#if USE_EXTENDED_COLOR + case 'x': + x_opt = 1; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + if (r_opt <= 0) + r_opt = 1; + + setup_test(); + if (p_opt) { + int i; + endwin(); + for (i = 0; i < COLORS; ++i) { + my_color_t r, g, b; + if (ColorContent(i, &r, &g, &b) == OK) { + printf("%d: %d %d %d\n", i, r, g, b); + } else { + printf("%d: ? ?\n", i); + } + } + } else { + int repeat; + + for (repeat = 0; repeat < r_opt; ++repeat) { + run_test(); + if (i_opt) { + addch('.'); + refresh(); + } + } + + if (i_opt) { + addch('\n'); + } + printw("DONE: "); + GetClockTime(&finish_time); + printw("%.03f seconds", ElapsedSeconds(&finish_time, &initial_time)); + finish_test(); + } + + free(expected); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/color_name.h b/contrib/ncurses/test/color_name.h new file mode 100644 index 00000000..4ef5faea --- /dev/null +++ b/contrib/ncurses/test/color_name.h @@ -0,0 +1,104 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 2011-2012,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: color_name.h,v 1.10 2024/10/05 19:26:24 tom Exp $ + */ + +#ifndef __COLORNAME_H +#define __COLORNAME_H 1 + +#ifndef __TEST_PRIV_H +#include +#endif + +static NCURSES_CONST char *const the_color_names[] = +{ + "black", + "red", + "green", + "yellow", + "blue", + "magenta", + "cyan", + "white", + "BLACK", + "RED", + "GREEN", + "YELLOW", + "BLUE", + "MAGENTA", + "CYAN", + "WHITE" +}; + +#ifdef NEED_COLOR_CODE +static int +color_code(const char *color) +{ + int result = 0; + char *endp = 0; + + if ((result = (int) strtol(color, &endp, 0)) >= 0 + && (endp == 0 || *endp == 0)) { + ; + } else if (!strcmp(color, "default")) { + result = -1; + } else { + size_t n; + for (n = 0; n < SIZEOF(the_color_names); ++n) { + if (!strcmp(the_color_names[n], color)) { + result = (int) n; + break; + } + } + } + return result; +} +#endif /* NEED_COLOR_CODE */ + +#ifdef NEED_COLOR_NAME +static const char * +color_name(int color) +{ + static char temp[20]; + const char *result = 0; + + if (color >= (int) SIZEOF(the_color_names)) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%d", color); + result = temp; + } else if (color < 0) { + result = "default"; + } else { + result = the_color_names[color]; + } + return result; +} +#endif /* NEED_COLOR_NAME */ + +#endif /* __COLORNAME_H */ diff --git a/contrib/ncurses/test/color_set.c b/contrib/ncurses/test/color_set.c new file mode 100644 index 00000000..5510a0fd --- /dev/null +++ b/contrib/ncurses/test/color_set.c @@ -0,0 +1,129 @@ +/**************************************************************************** + * Copyright 2020,2020,2022 Thomas E. Dickey * + * Copyright 2003-2012,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: color_set.c,v 1.12 2022/12/10 23:36:59 tom Exp $ + */ + +#include + +#if HAVE_COLOR_SET + +#define SHOW(n) ((n) == ERR ? "ERR" : "OK") + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: color_set [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + NCURSES_COLOR_T f, b; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + initscr(); + cbreak(); + noecho(); + + if (has_colors()) { + int i; + + start_color(); + + (void) pair_content(0, &f, &b); + printw("pair 0 contains (%d,%d)\n", (int) f, (int) b); + getch(); + + printw("Initializing pair 1 to red/black\n"); + init_pair(1, COLOR_RED, COLOR_BLACK); + i = color_set(1, NULL); + printw("RED/BLACK (%s)\n", SHOW(i)); + getch(); + + printw("Initializing pair 2 to white/blue\n"); + init_pair(2, COLOR_WHITE, COLOR_BLUE); + i = color_set(2, NULL); + printw("WHITE/BLUE (%s)\n", SHOW(i)); + getch(); + + printw("Resetting colors to pair 0\n"); + i = color_set(0, NULL); + printw("Default Colors (%s)\n", SHOW(i)); + getch(); + + printw("Resetting colors to pair 1\n"); + i = color_set(1, NULL); + printw("RED/BLACK (%s)\n", SHOW(i)); + getch(); + + } else { + printw("This demo requires a color terminal"); + getch(); + } + endwin(); + + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the curses color_set function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/combine.c b/contrib/ncurses/test/combine.c new file mode 100644 index 00000000..eca72b80 --- /dev/null +++ b/contrib/ncurses/test/combine.c @@ -0,0 +1,313 @@ +/**************************************************************************** + * Copyright 2021,2022 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: combine.c,v 1.23 2022/12/10 22:28:50 tom Exp $ + */ + +#include + +#if USE_WIDEC_SUPPORT + +#include +#include +#include + +static int c_opt; +static int r_opt; + +static int +next_char(int value) +{ + do { + ++value; + } while (!iswprint((wint_t) value)); + return value; +} + +static int +prev_char(int value) +{ + do { + --value; + } while (!iswprint((wint_t) value)); + return value; +} + +static void +do_row(int row, int base_ch, int over_ch) +{ + int col = 0; + bool done = FALSE; + bool reverse = (r_opt && !(row % 2)); + + move(row, col); + printw("[U+%04X]", over_ch); + do { + if (c_opt) { + wchar_t source[2]; + cchar_t target; + attr_t attr = reverse ? A_REVERSE : A_NORMAL; + + source[1] = 0; + + source[0] = (wchar_t) base_ch; + setcchar(&target, source, attr, 0, NULL); + add_wch(&target); + + source[0] = (wchar_t) over_ch; + setcchar(&target, source, attr, 0, NULL); + add_wch(&target); + } else { + wchar_t data[3]; + + data[0] = (wchar_t) base_ch; + data[1] = (wchar_t) over_ch; + data[2] = 0; + if (reverse) + attr_on(A_REVERSE, NULL); + addwstr(data); + if (reverse) + attr_off(A_REVERSE, NULL); + } + col = getcurx(stdscr); + base_ch = next_char(base_ch); + done = (col + 1 >= COLS); + } while (!done); +} + +#define LAST_OVER 0x6f + +static int +next_over(int value) +{ + if (++value > LAST_OVER) + value = 0; + return value; +} + +static int +prev_over(int value) +{ + if (--value < 0) + value = LAST_OVER; + return value; +} + +static void +do_all(int left_at, int over_it) +{ + int row; + + for (row = 0; row < LINES; ++row) { + do_row(row, left_at, 0x300 + over_it); + over_it = next_over(over_it); + } +} + +static void +show_help(WINDOW *current) +{ + /* *INDENT-OFF* */ + static struct { + int key; + CONST_FMT char * msg; + } help[] = { + { HELP_KEY_1, "Show this screen" }, + { CTRL('L'), "Repaint screen" }, + { '$', "Scroll to end of combining-character range" }, + { '+', "Scroll to next combining-character in range" }, + { KEY_DOWN, "(same as \"+\")" }, + { '-', "Scroll to previous combining-character in range" }, + { KEY_UP, "(same as \"-\")" }, + { '0', "Scroll to beginning of combining-character range" }, + { 'c', "Toggle command-line option \"-c\"" }, + { 'd', "Dump screen using scr_dump unless \"-l\" option used" }, + { 'h', "Scroll test-data left one column" }, + { 'j', "Scroll test-data down one row" }, + { 'k', "Scroll test-data up one row" }, + { 'l', "Scroll test-data right one column" }, + { 'q', "Quit" }, + { ESCAPE, "(same as \"q\")" }, + { QUIT, "(same as \"q\")" }, + { 'r', "Toggle command-line option \"-r\"" }, + }; + /* *INDENT-ON* */ + + char **msgs = typeCalloc(char *, SIZEOF(help) + 3); + size_t s; + int d = 0; + + msgs[d++] = strdup("Test diacritic combining-characters range " + "U+0300..U+036F"); + msgs[d++] = strdup(""); + for (s = 0; s < SIZEOF(help); ++s) { + char *name = strdup(keyname(help[s].key)); + size_t need = (11 + strlen(name) + strlen(help[s].msg)); + msgs[d] = typeMalloc(char, need); + _nc_SPRINTF(msgs[d], _nc_SLIMIT(need) "%-10s%s", name, help[s].msg); + free(name); + ++d; + } + popup_msg2(current, msgs); + for (s = 0; msgs[s] != 0; ++s) { + free(msgs[s]); + } + free(msgs); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: combine [options]" + ,"" + ,USAGE_COMMON + ,"Demonstrate combining-characters." + ,"" + ,"Options:" + ," -c use cchar_t data rather than wchar_t string" + ," -l FILE log window-dumps to this file" + ," -r draw even-numbered rows in reverse-video" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int left_at = ' '; + int over_it = 0; + bool done = FALSE; + bool log_option = FALSE; + const char *dump_log = "combine.log"; + + while ((ch = getopt(argc, argv, OPTS_COMMON "cl:r")) != -1) { + switch (ch) { + case 'c': + c_opt = TRUE; + break; + case 'l': + log_option = TRUE; + if (!open_dump(optarg)) + usage(FALSE); + break; + case 'r': + r_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + + do { + do_all(left_at, over_it); + switch (getch()) { + case HELP_KEY_1: + show_help(stdscr); + break; + case 'q': + case QUIT: + case ESCAPE: + done = TRUE; + break; + case CTRL('L'): + redrawwin(stdscr); + break; + case 'd': + if (log_option) + dump_window(stdscr); +#if HAVE_SCR_DUMP + else + scr_dump(dump_log); +#endif + break; + case 'h': + if (left_at > ' ') + left_at = prev_char(left_at); + break; + case 'l': + left_at = next_char(left_at); + break; + case 'c': + c_opt = !c_opt; + break; + case 'r': + r_opt = !r_opt; + break; + case KEY_HOME: + case '0': + over_it = 0; + break; + case KEY_END: + case '$': + over_it = LAST_OVER; + break; + case KEY_UP: + case 'k': + case '-': + over_it = prev_over(over_it); + break; + case KEY_DOWN: + case 'j': + case '+': + over_it = next_over(over_it); + break; + } + } while (!done); + + endwin(); + + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires wide-curses functions\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/configure b/contrib/ncurses/test/configure new file mode 100755 index 00000000..719adb5c --- /dev/null +++ b/contrib/ncurses/test/configure @@ -0,0 +1,25116 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by Autoconf 2.52.20240618. +# +# Copyright 2003-2022,2023 Thomas E. Dickey +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr="expr" +else + as_expr="false" +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln' +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset="unset" +else + as_unset="false" +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: "${ac_max_here_lines=38}" + +ac_unique_file="ncurses.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${datarootdir}/info' +mandir='${datarootdir}/man' + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo "$ac_feature" | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo "$ac_feature" | sed 's/-/_/g'` + case "$ac_option" in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst \ + | --runs | --run | --ru) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* \ + | --runs=* | --run=* | --ru=*) + runstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo "$ac_package" | sed 's/-/_/g'` + case "$ac_option" in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo "$ac_package" | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*dir | -dvi* | -doc* | -html* | -local* | -pdf* | -ps* ) + echo "$as_me: WARNING: unsupported option: $ac_option" >&2 + ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export "$ac_envvar" ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option}" "${host_alias=$ac_option}" "${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo "$ac_prev" | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo "$ac_var"` + case "$ac_val" in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo "$ac_var"` + case "$ac_val" in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: should be removed in autoconf 3.0. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat < if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +EOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue + cd "$ac_subdir" + # A "../" for each directory in /$ac_subdir. + ac_dots=`echo "$ac_subdir" | + sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'` + + case "$srcdir" in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir="$srcdir" ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_sub_srcdir="$srcdir/$ac_subdir" ;; + *) # Relative path. + ac_sub_srcdir="$ac_dots$srcdir/$ac_subdir" ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f "$ac_sub_srcdir/configure.gnu"; then + echo + $SHELL "$ac_sub_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_sub_srcdir/configure"; then + echo + $SHELL "$ac_sub_srcdir/configure" --help=recursive + elif test -f "$ac_sub_srcdir/configure.ac" || + test -f "$ac_sub_srcdir/configure.in"; then + echo + "$ac_configure" --help + else + echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2 + fi + cd "$ac_popdir" + done +fi + +test -n "$ac_init_help" && exit 0 +if "$ac_init_version"; then + cat <<\EOF + +Copyright 2003-2022,2023 Thomas E. Dickey +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +EOF + exit 0 +fi +exec 5>config.log +cat >&5 </dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +PATH = $PATH + +_ASUNAME +} >&5 + +cat >&5 <\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + echo >&5 + echo "## ----------------- ##" >&5 + echo "## Cache variables. ##" >&5 + echo "## ----------------- ##" >&5 + echo >&5 + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} >&5 + sed "/^$/d" confdefs.h >conftest.log + if test -s conftest.log; then + echo >&5 + echo "## ------------ ##" >&5 + echo "## confdefs.h. ##" >&5 + echo "## ------------ ##" >&5 + echo >&5 + cat conftest.log >&5 + fi + (echo; echo) >&5 + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" >&5 + echo "$as_me: exit $exit_status" >&5 + rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' "$ac_signal" +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:939: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + cat "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:950: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:958: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case "$ac_old_set,$ac_new_set" in + set,) + { echo "$as_me:974: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:978: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:984: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:986: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:988: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. It doesn't matter if + # we pass some twice (in addition to the command line arguments). + if test "$ac_new_set" = set; then + case "$ac_new_val" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val" + ;; + esac + fi +done +if "$ac_cache_corrupted"; then + { echo "$as_me:1007: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:1009: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in + *c*,-n*) ECHO_N= + ECHO_C= # newlines do not sed ;-) only broken shells would use this case anyway + ECHO_T=' ' + ;; + *c*,* ) ECHO_N=-n + ECHO_C= + ECHO_T= + ;; + *) ECHO_N= + ECHO_C='\c' + ECHO_T= + ;; +esac +echo "#! $SHELL" >conftest.sh +echo "exit 0" >>conftest.sh +chmod +x conftest.sh +if { (echo "$as_me:1038: PATH=\".;.\"; conftest.sh") >&5 + (PATH=".;."; conftest.sh) 2>&5 + ac_status=$? + echo "$as_me:1041: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + ac_path_separator=';' +else + ac_path_separator=: +fi +PATH_SEPARATOR="$ac_path_separator" +rm -f conftest.sh + +ac_config_headers="$ac_config_headers ncurses_cfg.h:ncurses_tst.hin" + +test -f config.guess || ( test -f ../config.guess && cp ../config.guess ./ ) + +test -f config.sub || ( test -f ../config.sub && cp ../config.sub ./ ) + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:1073: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:1083: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:1087: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:1096: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub "$ac_cv_build_alias"` || + { { echo "$as_me:1100: error: $ac_config_sub $ac_cv_build_alias failed." >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1105: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo "$ac_cv_build" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +echo "$as_me:1112: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub "$ac_cv_host_alias"` || + { { echo "$as_me:1121: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1126: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$ac_cv_host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +if test -f "$srcdir/config.guess" || test -f "$ac_aux_dir/config.guess" ; then + echo "$as_me:1134: checking target system type" >&5 +echo $ECHO_N "checking target system type... $ECHO_C" >&6 +if test "${ac_cv_target+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_target_alias=$target_alias +test "x$ac_cv_target_alias" = "x" && + ac_cv_target_alias=$ac_cv_host_alias +ac_cv_target=`$ac_config_sub "$ac_cv_target_alias"` || + { { echo "$as_me:1143: error: $ac_config_sub $ac_cv_target_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1148: result: $ac_cv_target" >&5 +echo "${ECHO_T}$ac_cv_target" >&6 +target=$ac_cv_target +target_cpu=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +target_vendor=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +target_os=`echo "$ac_cv_target" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && +cat >>confdefs.h <&6 +else + cf_cv_system_name="$system_name" +fi + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && echo "$as_me:1180: result: Configuring for $cf_cv_system_name" >&5 +echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6 + +if test ".$system_name" != ".$cf_cv_system_name" ; then + echo "$as_me:1184: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5 +echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6 + { { echo "$as_me:1186: error: \"Please remove config.cache and try again.\"" >&5 +echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;} + { (exit 1); exit 1; }; } +fi + +# Check whether --with-system-type or --without-system-type was given. +if test "${with_system_type+set}" = set; then + withval="$with_system_type" + { echo "$as_me:1194: WARNING: overriding system type to $withval" >&5 +echo "$as_me: WARNING: overriding system type to $withval" >&2;} + cf_cv_system_name=$withval + host_os=$withval + +fi; + +echo "$as_me:1201: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\EOF +all: + @echo 'ac_maketemp="${MAKE}"' +EOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:1221: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:1225: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:1239: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="${ac_tool_prefix}gcc" +echo "$as_me:1254: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1262: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1265: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:1274: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="gcc" +echo "$as_me:1289: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1297: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1300: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:1313: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="${ac_tool_prefix}cc" +echo "$as_me:1328: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1336: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1339: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:1348: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="cc" +echo "$as_me:1363: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1371: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1374: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:1387: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue +fi +ac_cv_prog_CC="cc" +echo "$as_me:1407: found $ac_dir/$ac_word" >&5 +break +done + +if test "$ac_prog_rejected" = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" ${1+"$@"} + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1429: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1432: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:1443: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +echo "$as_me:1458: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1466: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1469: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:1482: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="$ac_prog" +echo "$as_me:1497: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1505: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1508: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + +test -z "$CC" && { { echo "$as_me:1520: error: no acceptable cc found in \$PATH" >&5 +echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:1525:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo "$2"` +{ (eval echo "$as_me:1528: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:1531: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:1533: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:1536: \$? = $ac_status" >&5 + (exit "$ac_status"); } +{ (eval echo "$as_me:1538: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:1541: \$? = $ac_status" >&5 + (exit "$ac_status"); } + +cat >"conftest.$ac_ext" <<_ACEOF +#line 1545 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:1561: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *"conftest[^"]*"//'` +if { (eval echo "$as_me:1564: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:1567: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. +for ac_file in `ls a.exe conftest.exe 2>/dev/null; + ls a.out conftest 2>/dev/null; + ls a.* conftest.* 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +{ { echo "$as_me:1590: error: C compiler cannot create executables" >&5 +echo "$as_me: error: C compiler cannot create executables" >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:1596: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1601: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:1607: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1610: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:1617: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:1625: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe "conftest$ac_cv_exeext" +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1632: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:1634: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:1637: checking for executable suffix" >&5 +echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 +if { (eval echo "$as_me:1639: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:1642: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:1658: error: cannot compute EXEEXT: cannot compile and link" >&5 +echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f "conftest$ac_cv_exeext" +echo "$as_me:1664: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f "conftest.$ac_ext" +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:1670: checking for object suffix" >&5 +echo $ECHO_N "checking for object suffix... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 1676 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:1688: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1691: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +{ { echo "$as_me:1703: error: cannot compute OBJEXT: cannot compile" >&5 +echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f "conftest.$ac_cv_objext" "conftest.$ac_ext" +fi +echo "$as_me:1710: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:1714: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 1720 "configure" +#include "confdefs.h" + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1735: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1738: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1741: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1744: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_compiler_gnu=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:1756: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:1762: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 1768 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1780: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1783: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1786: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1789: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_prog_cc_g=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:1799: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >"conftest.$ac_ext" <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1826: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1829: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1832: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1835: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 1847 "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1860: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1863: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1866: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1869: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +continue +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + cat >"conftest.$ac_ext" <<_ACEOF +#line 1879 "configure" +#include "confdefs.h" +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1891: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1894: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1897: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1900: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done +rm -rf conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo "$ac_declaration" >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +GCC_VERSION=none +if test "$GCC" = yes ; then + echo "$as_me:1930: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^[^(]*([^)][^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + echo "$as_me:1934: result: $GCC_VERSION" >&5 +echo "${ECHO_T}$GCC_VERSION" >&6 +fi + +INTEL_COMPILER=no + +if test "$GCC" = yes ; then + case "$host_os" in + (linux*|gnu*) + echo "$as_me:1943: checking if this is really Intel C compiler" >&5 +echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -no-gcc" + cat >"conftest.$ac_ext" <<_ACEOF +#line 1948 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __INTEL_COMPILER +#else +#error __INTEL_COMPILER is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:1965: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1968: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:1971: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1974: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + INTEL_COMPILER=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:1985: result: $INTEL_COMPILER" >&5 +echo "${ECHO_T}$INTEL_COMPILER" >&6 + ;; + esac +fi + +CLANG_COMPILER=no + +if test "$GCC" = yes ; then + echo "$as_me:1994: checking if this is really Clang C compiler" >&5 +echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 1998 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __clang__ +#else +#error __clang__ is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2015: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2018: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2021: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2024: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + CLANG_COMPILER=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:2034: result: $CLANG_COMPILER" >&5 +echo "${ECHO_T}$CLANG_COMPILER" >&6 +fi + +CLANG_VERSION=none + +if test "x$CLANG_COMPILER" = "xyes" ; then + case "$CC" in + (c[1-9][0-9]|*/c[1-9][0-9]) + { echo "$as_me:2043: WARNING: replacing broken compiler alias $CC" >&5 +echo "$as_me: WARNING: replacing broken compiler alias $CC" >&2;} + CFLAGS="$CFLAGS -std=`echo "$CC" | sed -e 's%.*/%%'`" + CC=clang + ;; + esac + + echo "$as_me:2050: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + CLANG_VERSION="`$CC --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(CLANG[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$CLANG_VERSION" && CLANG_VERSION=unknown + echo "$as_me:2054: result: $CLANG_VERSION" >&5 +echo "${ECHO_T}$CLANG_VERSION" >&6 + + for cf_clang_opt in \ + -Qunused-arguments \ + -Wno-error=implicit-function-declaration + do + echo "$as_me:2061: checking if option $cf_clang_opt works" >&5 +echo $ECHO_N "checking if option $cf_clang_opt works... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $cf_clang_opt" + cat >"conftest.$ac_ext" <<_ACEOF +#line 2066 "configure" +#include "confdefs.h" + + #include +int +main (void) +{ + + printf("hello!\\n"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:2080: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:2083: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:2086: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2089: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_clang_optok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_clang_optok=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:2100: result: $cf_clang_optok" >&5 +echo "${ECHO_T}$cf_clang_optok" >&6 + CFLAGS="$cf_save_CFLAGS" + if test "$cf_clang_optok" = yes; then + test -n "$verbose" && echo " adding option $cf_clang_opt" 1>&6 + +echo "${as_me:-configure}:2106: testing adding option $cf_clang_opt ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_clang_opt" + + fi + done +fi + +echo "$as_me:2115: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >"conftest.$ac_ext" <<_ACEOF +#line 2123 "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (char **p, int i) +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main (void) +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2170: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2173: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2176: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2179: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" +done +rm -f "conftest.$ac_ext" "conftest.$ac_objext" +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:2196: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:2199: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# This should have been defined by AC_PROG_CC +: "${CC:=cc}" + +echo "$as_me:2207: checking \$CFLAGS variable" >&5 +echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 +case "x$CFLAGS" in +(*-[IUD]*) + echo "$as_me:2211: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2213: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;} + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + done + ;; +(*) + echo "$as_me:2321: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +echo "$as_me:2326: checking \$CC variable" >&5 +echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 +case "$CC" in +(*[\ \ ]-*) + echo "$as_me:2330: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2332: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;} + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'` + cf_flags=`echo "$CC" | sed -e "s%^$cf_prog%%"` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[IUDfgOW]*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + test -n "$verbose" && echo " resulting CC: '$CC'" 1>&6 + +echo "${as_me:-configure}:2449: testing resulting CC: '$CC' ..." 1>&5 + + test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 + +echo "${as_me:-configure}:2453: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 + + test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 + +echo "${as_me:-configure}:2457: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 + + ;; +(*) + echo "$as_me:2461: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +echo "$as_me:2466: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6 +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >"conftest.$ac_ext" <<_ACEOF +#line 2474 "configure" +#include "confdefs.h" +#ifndef __cplusplus +static $ac_kw int static_foo (void) {return 0; } +$ac_kw int foo (void) {return 0; } +#endif + +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:2483: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2486: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:2489: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2492: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_c_inline=$ac_kw; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:2503: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6 +case $ac_cv_c_inline in + inline | yes) ;; + no) +cat >>confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_GREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$GREP"; then + ac_cv_prog_GREP="$GREP" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_GREP="$ac_prog" +echo "$as_me:2537: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +GREP=$ac_cv_prog_GREP +if test -n "$GREP"; then + echo "$as_me:2545: result: $GREP" >&5 +echo "${ECHO_T}$GREP" >&6 +else + echo "$as_me:2548: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$GREP" && break +done +test -n "$GREP" || GREP=": " + +echo "$as_me:2556: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + for ac_prog in gegrep egrep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2568: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_EGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $EGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_EGREP="$EGREP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_EGREP="$ac_dir/$ac_word" + echo "$as_me:2585: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +EGREP=$ac_cv_path_EGREP + +if test -n "$EGREP"; then + echo "$as_me:2596: result: $EGREP" >&5 +echo "${ECHO_T}$EGREP" >&6 +else + echo "$as_me:2599: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$EGREP" && break +done +test -n "$EGREP" || EGREP=": " + + test "x$ac_cv_path_EGREP" = "x:" && { { echo "$as_me:2607: error: cannot find workable egrep" >&5 +echo "$as_me: error: cannot find workable egrep" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:2612: result: $ac_cv_path_EGREP" >&5 +echo "${ECHO_T}$ac_cv_path_EGREP" >&6 + EGREP="$ac_cv_path_EGREP" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" +echo "$as_me:2622: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2643 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:2648: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2654: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2677 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:2681: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2687: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:2724: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2734 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:2739: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2745: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err "conftest.$ac_ext" + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >"conftest.$ac_ext" <<_ACEOF +#line 2768 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:2772: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2778: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err "conftest.$ac_ext" + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err "conftest.$ac_ext" +if $ac_preproc_ok; then + : +else + { { echo "$as_me:2806: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS "conftest.$ac_ext" >&5' +ac_link='$CC -o "conftest$ac_exeext" $CFLAGS $CPPFLAGS $LDFLAGS "conftest.$ac_ext" $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return="return" + +for ac_prog in mawk gawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:2822: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AWK="$ac_prog" +echo "$as_me:2837: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:2845: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:2848: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +case "$cf_cv_system_name" in +(cygwin*|msys*|mingw32*|mingw64|os2*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER='[a-zA-Z]:[\\/]*' + ;; +(*) + GLOB_FULLPATH_POSIX='/*' + GLOB_FULLPATH_OTHER=$GLOB_FULLPATH_POSIX + ;; +esac + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:2878: checking for a BSD compatible install" >&5 +echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_IFS=$IFS; IFS=$ac_path_separator + for ac_dir in $PATH; do + IFS=$ac_save_IFS + # Account for people who put trailing slashes in PATH elements. + case $ac_dir/ in + / | ./ | .// | /cC/* \ + | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ + | /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if $as_executable_p "$ac_dir/$ac_prog"; then + if test $ac_prog = install && + grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:2927: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case x$INSTALL in +(x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(*) + cf_dir=`echo "$INSTALL" | sed -e 's%/[^/]*$%%'` + test -z "$cf_dir" && cf_dir=. + INSTALL="`cd \"$cf_dir\" && pwd`"/"`echo "$INSTALL" | sed -e 's%^.*/%%'`" + ;; +esac + +echo "$as_me:2948: checking if you want to install stripped executables" >&5 +echo $ECHO_N "checking if you want to install stripped executables... $ECHO_C" >&6 + +# Check whether --enable-stripping or --disable-stripping was given. +if test "${enable_stripping+set}" = set; then + enableval="$enable_stripping" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_stripping=no + else + enable_stripping=yes + fi +else + enableval=yes + enable_stripping=yes + +fi; +echo "$as_me:2965: result: $enable_stripping" >&5 +echo "${ECHO_T}$enable_stripping" >&6 + +if test "$enable_stripping" = yes +then + INSTALL_OPT_S="-s" +else + INSTALL_OPT_S= +fi + +: "${INSTALL:=install}" +echo "$as_me:2976: checking if install accepts -p option" >&5 +echo $ECHO_N "checking if install accepts -p option... $ECHO_C" >&6 +if test "${cf_cv_install_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -rf ./conftest* + date >conftest.in + mkdir conftest.out + sleep 3 + if $INSTALL -p conftest.in conftest.out 2>/dev/null + then + if test -f conftest.out/conftest.in + then + test conftest.in -nt conftest.out/conftest.in 2>conftest.err && \ + test conftest.out/conftest.in -nt conftest.in 2>conftest.err + if test -s conftest.err + then + cf_cv_install_p=no + else + cf_cv_install_p=yes + fi + else + cf_cv_install_p=no + fi + else + cf_cv_install_p=no + fi + rm -rf ./conftest* + +fi +echo "$as_me:3007: result: $cf_cv_install_p" >&5 +echo "${ECHO_T}$cf_cv_install_p" >&6 + +echo "$as_me:3010: checking if install needs to be told about ownership" >&5 +echo $ECHO_N "checking if install needs to be told about ownership... $ECHO_C" >&6 +case `$ac_config_guess` in +(*minix) + with_install_o=yes + ;; +(*) + with_install_o=no + ;; +esac + +echo "$as_me:3021: result: $with_install_o" >&5 +echo "${ECHO_T}$with_install_o" >&6 +if test "x$with_install_o" = xyes +then + INSTALL_OPT_O="`id root|sed -e 's/uid=[0-9]*(/ -o /' -e 's/gid=[0-9]*(/ -g /' -e 's/ [^=[:space:]][^=[:space:]]*=.*/ /' -e 's/)//g'`" +else + INSTALL_OPT_O= +fi + +if test -n "$INSTALL_OPT_S" +then + echo "$as_me:3032: checking if you want to specify strip-program" >&5 +echo $ECHO_N "checking if you want to specify strip-program... $ECHO_C" >&6 + +# Check whether --with-strip-program or --without-strip-program was given. +if test "${with_strip_program+set}" = set; then + withval="$with_strip_program" + with_strip_program=$withval +else + with_strip_program=no +fi; + echo "$as_me:3042: result: $with_strip_program" >&5 +echo "${ECHO_T}$with_strip_program" >&6 + if test "$with_strip_program" != no + then + echo "$as_me:3046: checking if strip-program is supported with this installer" >&5 +echo $ECHO_N "checking if strip-program is supported with this installer... $ECHO_C" >&6 + cf_install_program=`echo "$INSTALL" | sed -e 's%[ ]*[ ]-.%%'` + check_install_strip=no + if test -f "$cf_install_program" + then + check_install_version=`"$cf_install_program" --version 2>/dev/null | head -n 1 | grep coreutils` + if test -n "$check_install_version" + then + check_install_strip="option" + else + for check_strip_variable in STRIPBIN STRIP + do + if strings "$cf_install_program" | grep "^$check_strip_variable$" >/dev/null + then + check_install_strip="environ" + break + fi + done + fi + fi + echo "$as_me:3067: result: $check_install_strip" >&5 +echo "${ECHO_T}$check_install_strip" >&6 + case "$check_install_strip" in + (no) + { echo "$as_me:3071: WARNING: $cf_install_program does not support strip program option" >&5 +echo "$as_me: WARNING: $cf_install_program does not support strip program option" >&2;} + with_strip_program=no + ;; + (environ) + cat >install.tmp <<-CF_EOF + #! $SHELL + STRIPBIN="$with_strip_program" \\ + STRIP="$with_strip_program" \\ + $INSTALL "$@" + CF_EOF + INSTALL="`pwd`/install.tmp" + chmod +x "$INSTALL" + test -n "$verbose" && echo " created $INSTALL" 1>&6 + +echo "${as_me:-configure}:3086: testing created $INSTALL ..." 1>&5 + + ;; + (option) + INSTALL_OPT_S="$INSTALL_OPT_S --strip-program=\"$with_strip_program\"" + ;; + esac + fi +fi + +for ac_prog in lint cppcheck splint +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3100: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LINT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LINT"; then + ac_cv_prog_LINT="$LINT" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LINT="$ac_prog" +echo "$as_me:3115: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LINT=$ac_cv_prog_LINT +if test -n "$LINT"; then + echo "$as_me:3123: result: $LINT" >&5 +echo "${ECHO_T}$LINT" >&6 +else + echo "$as_me:3126: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LINT" && break +done + +case "x$LINT" in +(xcppcheck|x*/cppcheck) + test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" + ;; +esac + +echo "$as_me:3139: checking for \".PHONY\" make-support" >&5 +echo $ECHO_N "checking for \".PHONY\" make-support... $ECHO_C" >&6 +if test "${cf_cv_make_PHONY+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + rm -rf conftest* + ( + mkdir conftest || exit 1 + cd conftest + cat >makefile <<'CF_EOF' +.PHONY: always +DATA=0 +always: always.out + @echo "** making $@ $(DATA)" +once: once.out + @echo "** making $@ $(DATA)" +always.out: + @echo "** making $@ $(DATA)" + echo $(DATA) > $@ +once.out: + @echo "** making $@ $(DATA)" + echo $(DATA) > $@ +CF_EOF + for cf_data in 1 2 3 + do + ${MAKE:-make} always DATA=$cf_data + ${MAKE:-make} once DATA=$cf_data + ${MAKE:-make} -t always once + if test -f always ; then + echo "no (case 1)" > ../conftest.tmp + elif test ! -f always.out ; then + echo "no (case 2)" > ../conftest.tmp + elif test ! -f once.out ; then + echo "no (case 3)" > ../conftest.tmp + elif ! cmp -s always.out once.out ; then + echo "no (case 4)" > ../conftest.tmp + diff always.out once.out + else + cf_check="`cat always.out`" + if test "x$cf_check" != "x$cf_data" ; then + echo "no (case 5)" > ../conftest.tmp + else + echo yes > ../conftest.tmp + rm -f ./*.out + continue + fi + fi + break + done + ) >&5 2>&1 + cf_cv_make_PHONY="`cat conftest.tmp`" + rm -rf conftest* + +fi +echo "$as_me:3194: result: $cf_cv_make_PHONY" >&5 +echo "${ECHO_T}$cf_cv_make_PHONY" >&6 +MAKE_NO_PHONY="#" +MAKE_PHONY="#" +test "x$cf_cv_make_PHONY" = xyes && MAKE_PHONY= +test "x$cf_cv_make_PHONY" != xyes && MAKE_NO_PHONY= + +echo "$as_me:3201: checking if filesystem supports mixed-case filenames" >&5 +echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6 +if test "${cf_cv_mixedcase+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes ; then + case "$target_alias" in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*|darwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi + +fi +echo "$as_me:3228: result: $cf_cv_mixedcase" >&5 +echo "${ECHO_T}$cf_cv_mixedcase" >&6 +test "$cf_cv_mixedcase" = yes && +cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + +for ac_prog in exctags ctags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3239: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CTAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CTAGS"; then + ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CTAGS="$ac_prog" +echo "$as_me:3254: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CTAGS=$ac_cv_prog_CTAGS +if test -n "$CTAGS"; then + echo "$as_me:3262: result: $CTAGS" >&5 +echo "${ECHO_T}$CTAGS" >&6 +else + echo "$as_me:3265: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CTAGS" && break +done + +for ac_prog in exetags etags +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3276: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ETAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ETAGS"; then + ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ETAGS="$ac_prog" +echo "$as_me:3291: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ETAGS=$ac_cv_prog_ETAGS +if test -n "$ETAGS"; then + echo "$as_me:3299: result: $ETAGS" >&5 +echo "${ECHO_T}$ETAGS" >&6 +else + echo "$as_me:3302: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ETAGS" && break +done + +# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args. +set dummy ${CTAGS:-ctags}; ac_word=$2 +echo "$as_me:3311: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_LOWER_TAGS"; then + ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_LOWER_TAGS="yes" +echo "$as_me:3326: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no" +fi +fi +MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS +if test -n "$MAKE_LOWER_TAGS"; then + echo "$as_me:3335: result: $MAKE_LOWER_TAGS" >&5 +echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 +else + echo "$as_me:3338: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cf_cv_mixedcase" = yes ; then + # Extract the first word of "${ETAGS:-etags}", so it can be a program name with args. +set dummy ${ETAGS:-etags}; ac_word=$2 +echo "$as_me:3345: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_UPPER_TAGS"; then + ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_UPPER_TAGS="yes" +echo "$as_me:3360: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no" +fi +fi +MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS +if test -n "$MAKE_UPPER_TAGS"; then + echo "$as_me:3369: result: $MAKE_UPPER_TAGS" >&5 +echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 +else + echo "$as_me:3372: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +echo "$as_me:3392: checking if -lm needed for math functions" >&5 +echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6 +if test "${cf_cv_need_libm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 3399 "configure" +#include "confdefs.h" + + #include + #include + #include + +int +main (void) +{ +double x = rand(); printf("result = %g\\n", pow(sin(x),x)) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:3415: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:3418: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:3421: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3424: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_libm=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_need_libm=yes +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:3434: result: $cf_cv_need_libm" >&5 +echo "${ECHO_T}$cf_cv_need_libm" >&6 + +if test "$cf_cv_need_libm" = yes +then + + cf_save_LIBS="$LIBS" + LIBS="$LIBS -lm" + echo "$as_me:3442: checking if -lm is available for math functions" >&5 +echo $ECHO_N "checking if -lm is available for math functions... $ECHO_C" >&6 +if test "${cf_cv_have_libm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 3449 "configure" +#include "confdefs.h" + + #include + #include + #include + +int +main (void) +{ +double x = rand(); printf("result = %g\\n", pow(sin(x),x)) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:3465: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:3468: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:3471: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3474: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_libm=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_libm=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:3484: result: $cf_cv_have_libm" >&5 +echo "${ECHO_T}$cf_cv_have_libm" >&6 + LIBS="$cf_save_LIBS" + + if test "$cf_cv_have_libm" = yes + then + MATH_LIB=-lm + fi +else + cf_cv_have_libm=yes +fi + +if test "$cf_cv_have_libm" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_MATH_FUNCS 1 +EOF + +fi + +top_builddir=`pwd` + +CC_G_OPT="-g" +CC_SHARED_OPTS=unknown +CPPFLAGS="$CPPFLAGS" +DFT_DEP_SUFFIX="" +DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'` +DFT_UPR_MODEL="NORMAL" +LD="ld" +LDFLAGS_SHARED="" +LDFLAGS_STATIC="" +LD_MODEL="" +LD_SHARED_OPTS="" +LIBTOOL="" +LIBTOOL_OPTS="" +LIB_CLEAN="" +LIB_COMPILE="" +LIB_LINK='${CC}' +LINK_TESTS="" +LOCAL_LDFLAGS="" +PACKAGE="ncurses-examples" +PTHREAD="-lm" +TEST_ARGS="" +TEST_DEPS="" +TEST_LIBS="" +TINFO_LDFLAGS='' +TINFO_LIBS='$(LIBS_CURSES)' +cf_cv_abi_version="" +cf_cv_rel_version="" +includesubdir="" + +cf_cv_screen=curses +cf_cv_libtype= + +echo "$as_me:3539: checking for fgrep" >&5 +echo $ECHO_N "checking for fgrep... $ECHO_C" >&6 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + for ac_prog in gfgrep fgrep +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:3551: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FGREP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FGREP in + [\\/]* | ?:[\\/]*) + ac_cv_path_FGREP="$FGREP" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_FGREP="$ac_dir/$ac_word" + echo "$as_me:3568: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +FGREP=$ac_cv_path_FGREP + +if test -n "$FGREP"; then + echo "$as_me:3579: result: $FGREP" >&5 +echo "${ECHO_T}$FGREP" >&6 +else + echo "$as_me:3582: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$FGREP" && break +done +test -n "$FGREP" || FGREP=": " + + test "x$ac_cv_path_FGREP" = "x:" && { { echo "$as_me:3590: error: cannot find workable fgrep" >&5 +echo "$as_me: error: cannot find workable fgrep" >&2;} + { (exit 1); exit 1; }; } + fi +fi +echo "$as_me:3595: result: $ac_cv_path_FGREP" >&5 +echo "${ECHO_T}$ac_cv_path_FGREP" >&6 + FGREP="$ac_cv_path_FGREP" + +echo "$as_me:3599: checking if you want to use C11 _Noreturn feature" >&5 +echo $ECHO_N "checking if you want to use C11 _Noreturn feature... $ECHO_C" >&6 + +# Check whether --enable-stdnoreturn or --disable-stdnoreturn was given. +if test "${enable_stdnoreturn+set}" = set; then + enableval="$enable_stdnoreturn" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_stdnoreturn=yes + else + enable_stdnoreturn=no + fi +else + enableval=no + enable_stdnoreturn=no + +fi; +echo "$as_me:3616: result: $enable_stdnoreturn" >&5 +echo "${ECHO_T}$enable_stdnoreturn" >&6 + +if test $enable_stdnoreturn = yes; then +echo "$as_me:3620: checking for C11 _Noreturn feature" >&5 +echo $ECHO_N "checking for C11 _Noreturn feature... $ECHO_C" >&6 +if test "${cf_cv_c11_noreturn+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 3626 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +static _Noreturn void giveup(void) { exit(0); } + +int +main (void) +{ +if (feof(stdin)) giveup() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:3642: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3645: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:3648: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3651: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_c11_noreturn=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_c11_noreturn=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:3662: result: $cf_cv_c11_noreturn" >&5 +echo "${ECHO_T}$cf_cv_c11_noreturn" >&6 +else + cf_cv_c11_noreturn=no, +fi + +if test "$cf_cv_c11_noreturn" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_STDNORETURN_H 1 +EOF + +cat >>confdefs.h < conftest.i <&5 +echo "$as_me: checking for $CC __attribute__ directives..." >&6;} +cat > "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + +cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&5 + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3757: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:3759: result: ... $cf_attribute" >&5 +echo "${ECHO_T}... $cf_attribute" >&6 + cat conftest.h >>confdefs.h + case "$cf_attribute" in + (noreturn) + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_PRINTF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_SCANF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf ./conftest* +fi + +echo "$as_me:3818: checking if you want to work around bogus compiler/loader warnings" >&5 +echo $ECHO_N "checking if you want to work around bogus compiler/loader warnings... $ECHO_C" >&6 + +# Check whether --enable-string-hacks or --disable-string-hacks was given. +if test "${enable_string_hacks+set}" = set; then + enableval="$enable_string_hacks" + enable_string_hacks=$enableval +else + enable_string_hacks=no +fi; +echo "$as_me:3828: result: $enable_string_hacks" >&5 +echo "${ECHO_T}$enable_string_hacks" >&6 + +if test "x$enable_string_hacks" = "xyes"; then + +cat >>confdefs.h <<\EOF +#define USE_STRING_HACKS 1 +EOF + + { echo "$as_me:3837: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&5 +echo "$as_me: WARNING: enabling string-hacks to work around bogus compiler/loader warnings" >&2;} + echo "$as_me:3839: checking for strlcat" >&5 +echo $ECHO_N "checking for strlcat... $ECHO_C" >&6 +if test "${ac_cv_func_strlcat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 3845 "configure" +#include "confdefs.h" +#define strlcat autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef strlcat + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strlcat (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_strlcat) || defined (__stub___strlcat) +#error found stub for strlcat +#endif + + return strlcat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:3876: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:3879: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:3882: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3885: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_strlcat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_strlcat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:3895: result: $ac_cv_func_strlcat" >&5 +echo "${ECHO_T}$ac_cv_func_strlcat" >&6 +if test "$ac_cv_func_strlcat" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_STRLCAT 1 +EOF + +else + + echo "$as_me:3905: checking for strlcat in -lbsd" >&5 +echo $ECHO_N "checking for strlcat in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_strlcat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 3913 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char strlcat (void); +int +main (void) +{ +strlcat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:3932: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:3935: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:3938: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3941: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_strlcat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_strlcat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:3952: result: $ac_cv_lib_bsd_strlcat" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_strlcat" >&6 +if test "$ac_cv_lib_bsd_strlcat" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +for ac_header in bsd/string.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:3975: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 3981 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:3985: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:3991: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:4010: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define HAVE_STRLCAT 1 +EOF + +fi + +fi + +for ac_func in strlcpy snprintf +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:4031: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 4037 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:4068: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4071: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:4074: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4077: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:4087: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6 +if test "${cf_cv_posix_visible+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 4106 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4125: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4128: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4131: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4134: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_visible=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_visible=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:4145: result: $cf_cv_posix_visible" >&5 +echo "${ECHO_T}$cf_cv_posix_visible" >&6 + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=600 +cf_POSIX_C_SOURCE=199506L +cf_xopen_source= + +case "$host_os" in +(aix[4-7]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(darwin[0-8].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[56].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*gnu|linux*gnuabi64|linux*gnuabin32|linux*gnueabi|linux*gnueabihf|linux*gnux32|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin|msys|mingw*|linux*uclibc) + +cf_gnu_xopen_source=$cf_XOPEN_SOURCE + +echo "$as_me:4187: checking if this is the GNU C library" >&5 +echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6 +if test "${cf_cv_gnu_library+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 4194 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4213: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4216: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4219: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4222: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_library=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_library=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:4233: result: $cf_cv_gnu_library" >&5 +echo "${ECHO_T}$cf_cv_gnu_library" >&6 + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + echo "$as_me:4241: checking if _DEFAULT_SOURCE can be used as a basis" >&5 +echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6 +if test "${cf_cv_gnu_library_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4253 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4272: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4275: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4278: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4281: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_library_219=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_library_219=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +echo "$as_me:4293: result: $cf_cv_gnu_library_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_library_219" >&6 + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + echo "$as_me:4298: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_dftsrc_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4403 "configure" +#include "confdefs.h" + + #include + #include + +int +main (void) +{ + + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4423: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4426: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4429: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4432: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_dftsrc_219=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_dftsrc_219=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:4443: result: $cf_cv_gnu_dftsrc_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6 + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + echo "$as_me:4452: checking if we must define _GNU_SOURCE" >&5 +echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4459 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4474: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4477: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4480: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4483: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_GNU_SOURCE +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4590 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4605: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4608: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4611: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4614: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_gnu_source=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:4629: result: $cf_cv_gnu_source" >&5 +echo "${ECHO_T}$cf_cv_gnu_source" >&6 + + if test "$cf_cv_gnu_source" = yes + then + echo "$as_me:4634: checking if we should also define _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_default_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4644 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4659: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4662: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4665: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4668: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_default_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_default_source=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:4679: result: $cf_cv_default_source" >&5 +echo "${ECHO_T}$cf_cv_default_source" >&6 + if test "$cf_cv_default_source" = yes + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + fi + fi + fi + +fi + + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:4716: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:4722: testing if the symbol is already defined go no further ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4725 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4740: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4743: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4746: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4749: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 4770 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4785: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4788: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4791: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4794: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + +echo "${as_me:-configure}:4805: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:4813: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 4816 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:4831: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4834: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:4837: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4840: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:4856: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[6-9]*) + # OpenBSD 6.x has broken locale support, both compile-time and runtime. + # see https://www.mail-archive.com/bugs@openbsd.org/msg13200.html + # Abusing the conformance level is a workaround. + { echo "$as_me:4973: WARNING: this system does not provide usable locale support" >&5 +echo "$as_me: WARNING: this system does not provide usable locale support" >&2;} + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=700 + ;; +(openbsd[4-5]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[45]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + +echo "$as_me:5005: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5012 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5030: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5033: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5036: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5039: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5051 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5069: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5072: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5075: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5078: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:5093: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +for cf_add_cflags in $cf_temp_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + + cf_save_xopen_cppflags="$CPPFLAGS" + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:5253: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:5259: testing if the symbol is already defined go no further ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5262 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5277: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5280: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5283: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5286: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 5307 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +#error _POSIX_SOURCE is defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5322: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5325: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5328: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5331: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + +echo "${as_me:-configure}:5342: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:5350: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5353 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +#error _POSIX_C_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5368: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5371: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5374: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5377: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_posix_c_source=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:5393: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + # Some of these niche implementations use copy/paste, double-check... + if test "$cf_cv_xopen_source" = no ; then + test -n "$verbose" && echo " checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE" 1>&6 + +echo "${as_me:-configure}:5506: testing checking if _POSIX_C_SOURCE interferes with _XOPEN_SOURCE ..." 1>&5 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5509 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5527: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5530: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5533: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5536: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + { echo "$as_me:5543: WARNING: _POSIX_C_SOURCE definition is not usable" >&5 +echo "$as_me: WARNING: _POSIX_C_SOURCE definition is not usable" >&2;} + CPPFLAGS="$cf_save_xopen_cppflags" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + ;; +esac + +if test -n "$cf_xopen_source" ; then + +for cf_add_cflags in $cf_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + test -n "$verbose" && echo " removing old option $cf_add_cflags from CFLAGS" 1>&6 + +echo "${as_me:-configure}:5566: testing removing old option $cf_add_cflags from CFLAGS ..." 1>&5 + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + test -n "$verbose" && echo " removing old option $cf_add_cflags from CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:5578: testing removing old option $cf_add_cflags from CPPFLAGS ..." 1>&5 + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:5666: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:5676: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:5686: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + echo "$as_me:5698: checking if _XOPEN_SOURCE really is set" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 5701 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5716: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5719: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5722: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5725: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_XOPEN_SOURCE_set=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_XOPEN_SOURCE_set=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:5734: result: $cf_XOPEN_SOURCE_set" >&5 +echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6 + if test "$cf_XOPEN_SOURCE_set" = yes + then + cat >"conftest.$ac_ext" <<_ACEOF +#line 5739 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#error (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +#endif + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5754: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5757: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5760: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5763: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_XOPEN_SOURCE_set_ok=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_XOPEN_SOURCE_set_ok=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + if test "$cf_XOPEN_SOURCE_set_ok" = no + then + { echo "$as_me:5774: WARNING: _XOPEN_SOURCE is lower than requested" >&5 +echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} + fi + else + +echo "$as_me:5779: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5786 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5804: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5807: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5810: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5813: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 5825 "configure" +#include "confdefs.h" + +$ac_includes_default + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +#error _XOPEN_SOURCE is not defined +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:5843: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5846: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:5849: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5852: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:5867: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +for cf_add_cflags in $cf_temp_xopen_source +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +fi + + fi +fi +fi # cf_cv_posix_visible + +echo "$as_me:6014: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6020 "configure" +#include "confdefs.h" +#include +#include +#include +#include + +_ACEOF +if { (eval echo "$as_me:6028: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6034: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_stdc=no +fi +rm -f conftest.err "conftest.$ac_ext" + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >"conftest.$ac_ext" <<_ACEOF +#line 6056 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >"conftest.$ac_ext" <<_ACEOF +#line 6074 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6095 "configure" +#include "confdefs.h" +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main (void) +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + $ac_main_return(2); + $ac_main_return (0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:6121: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6124: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:6126: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6129: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_header_stdc=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +fi +fi +echo "$as_me:6142: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6158: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6164 "configure" +#include "confdefs.h" +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6170: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6173: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6176: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6179: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Header=no" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:6189: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking whether exit is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_exit+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6205 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +#ifndef exit + (void) exit; +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6220: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6223: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6226: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6229: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_have_decl_exit=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_have_decl_exit=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:6239: result: $ac_cv_have_decl_exit" >&5 +echo "${ECHO_T}$ac_cv_have_decl_exit" >&6 + +echo "$as_me:6242: checking for signal global datatype" >&5 +echo $ECHO_N "checking for signal global datatype... $ECHO_C" >&6 +if test "${cf_cv_sig_atomic_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + for cf_type in \ + "volatile sig_atomic_t" \ + "sig_atomic_t" \ + "int" + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 6254 "configure" +#include "confdefs.h" + +#include +#include +#include + +extern $cf_type x; +$cf_type x; +static void handler(int sig) +{ + (void)sig; + x = 5; +} +int +main (void) +{ +signal(SIGINT, handler); + x = 1 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6278: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6281: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6284: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6287: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_sig_atomic_t=$cf_type +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_sig_atomic_t=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_sig_atomic_t" != no && break + done + +fi + +echo "$as_me:6301: result: $cf_cv_sig_atomic_t" >&5 +echo "${ECHO_T}$cf_cv_sig_atomic_t" >&6 +test "$cf_cv_sig_atomic_t" != no && +cat >>confdefs.h <&5 +echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6 +if test "${cf_cv_define_sigwinch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 6317 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6332: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6335: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6338: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6341: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_define_sigwinch=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 6348 "configure" +#include "confdefs.h" + +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include + +int +main (void) +{ +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6366: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6369: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6372: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6375: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_define_sigwinch=maybe +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_define_sigwinch=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:6389: result: $cf_cv_define_sigwinch" >&5 +echo "${ECHO_T}$cf_cv_define_sigwinch" >&6 + +if test "$cf_cv_define_sigwinch" = maybe ; then +echo "$as_me:6393: checking for actual SIGWINCH definition" >&5 +echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6 +if test "${cf_cv_fixup_sigwinch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_fixup_sigwinch=unknown +cf_sigwinch=32 +while test "$cf_sigwinch" != 1 +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 6404 "configure" +#include "confdefs.h" + +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include + +int +main (void) +{ + +#if SIGWINCH != $cf_sigwinch +#error SIGWINCH is not $cf_sigwinch +#endif +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6426: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6429: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6432: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6435: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_fixup_sigwinch=$cf_sigwinch + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +cf_sigwinch="`expr "$cf_sigwinch" - 1`" +done + +fi +echo "$as_me:6449: result: $cf_cv_fixup_sigwinch" >&5 +echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6 + + if test "$cf_cv_fixup_sigwinch" != unknown ; then + CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch" + fi +fi + +# Checks for CODESET support. + +echo "$as_me:6459: checking for nl_langinfo and CODESET" >&5 +echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 +if test "${am_cv_langinfo_codeset+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 6465 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +int +main (void) +{ +char* cs = nl_langinfo(CODESET); (void)cs + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:6479: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6482: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:6485: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6488: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + am_cv_langinfo_codeset=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +am_cv_langinfo_codeset=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:6499: result: $am_cv_langinfo_codeset" >&5 +echo "${ECHO_T}$am_cv_langinfo_codeset" >&6 + if test "$am_cv_langinfo_codeset" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LANGINFO_CODESET 1 +EOF + + fi + +echo "$as_me:6509: checking if you want to use pkg-config" >&5 +echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6 + +# Check whether --with-pkg-config or --without-pkg-config was given. +if test "${with_pkg_config+set}" = set; then + withval="$with_pkg_config" + cf_pkg_config=$withval +else + cf_pkg_config=yes +fi; +echo "$as_me:6519: result: $cf_pkg_config" >&5 +echo "${ECHO_T}$cf_pkg_config" >&6 + +case "$cf_pkg_config" in +(no) + PKG_CONFIG=none + ;; +(yes) + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +echo "$as_me:6531: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:6548: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG + +if test -n "$PKG_CONFIG"; then + echo "$as_me:6559: result: $PKG_CONFIG" >&5 +echo "${ECHO_T}$PKG_CONFIG" >&6 +else + echo "$as_me:6562: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:6571: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:6588: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none" + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG + +if test -n "$ac_pt_PKG_CONFIG"; then + echo "$as_me:6600: result: $ac_pt_PKG_CONFIG" >&5 +echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 +else + echo "$as_me:6603: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + PKG_CONFIG=$ac_pt_PKG_CONFIG +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$PKG_CONFIG" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval PKG_CONFIG="$PKG_CONFIG" + case "x$PKG_CONFIG" in + (xNONE/*) + PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + PKG_CONFIG=`echo "$PKG_CONFIG" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:6644: error: expected a pathname, not \"$PKG_CONFIG\"" >&5 +echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +elif test "x$cf_pkg_config" != xno ; then + { echo "$as_me:6651: WARNING: pkg-config is not installed" >&5 +echo "$as_me: WARNING: pkg-config is not installed" >&2;} +fi + +echo "$as_me:6655: checking if you want to see long compiling messages" >&5 +echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6 + +# Check whether --enable-echo or --disable-echo was given. +if test "${enable_echo+set}" = set; then + enableval="$enable_echo" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + + ECHO_LT='--silent' + ECHO_LD='@echo linking $@;' + RULE_CC='@echo compiling $<' + SHOW_CC='@echo compiling $@' + ECHO_CC='@' + + else + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + + fi +else + enableval=yes + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + +fi; +echo "$as_me:6689: result: $enableval" >&5 +echo "${ECHO_T}$enableval" >&6 + +echo "$as_me:6692: checking for an installation directory prefix" >&5 +echo $ECHO_N "checking for an installation directory prefix... $ECHO_C" >&6 + +# Check whether --with-install-prefix or --without-install-prefix was given. +if test "${with_install_prefix+set}" = set; then + withval="$with_install_prefix" + case "x$withval" in + (xyes|xno) + ;; + (*) DESTDIR="$withval" + ;; + esac +fi; +echo "$as_me:6705: result: ${DESTDIR:-(none)}" >&5 +echo "${ECHO_T}${DESTDIR:-(none)}" >&6 + +echo "$as_me:6708: checking if installation directory prefix should be merged" >&5 +echo $ECHO_N "checking if installation directory prefix should be merged... $ECHO_C" >&6 + +# Check whether --enable-install-prefix or --disable-install-prefix was given. +if test "${enable_install_prefix+set}" = set; then + enableval="$enable_install_prefix" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + cf_install_prefix=yes + else + cf_install_prefix=no + fi +else + enableval=no + cf_install_prefix=no + +fi; +echo "$as_me:6725: result: $cf_install_prefix" >&5 +echo "${ECHO_T}$cf_install_prefix" >&6 + +if test "$cf_install_prefix" = yes ; then + MERGE_PREFIX=':$(prefix)%=%' +else + MERGE_PREFIX='' +fi + +echo "$as_me:6734: checking for ncurses wrap-prefix" >&5 +echo $ECHO_N "checking for ncurses wrap-prefix... $ECHO_C" >&6 + +# Check whether --with-ncurses-wrap-prefix or --without-ncurses-wrap-prefix was given. +if test "${with_ncurses_wrap_prefix+set}" = set; then + withval="$with_ncurses_wrap_prefix" + NCURSES_WRAP_PREFIX=$withval +else + NCURSES_WRAP_PREFIX=_nc_ +fi; +echo "$as_me:6744: result: $NCURSES_WRAP_PREFIX" >&5 +echo "${ECHO_T}$NCURSES_WRAP_PREFIX" >&6 + +echo "$as_me:6747: checking if you want to check for wide-character functions" >&5 +echo $ECHO_N "checking if you want to check for wide-character functions... $ECHO_C" >&6 + +# Check whether --enable-widec or --disable-widec was given. +if test "${enable_widec+set}" = set; then + enableval="$enable_widec" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_enable_widec=no + else + cf_enable_widec=yes + fi +else + enableval=yes + cf_enable_widec=yes + +fi; +echo "$as_me:6764: result: $cf_enable_widec" >&5 +echo "${ECHO_T}$cf_enable_widec" >&6 + +echo "$as_me:6767: checking for specific curses-directory" >&5 +echo $ECHO_N "checking for specific curses-directory... $ECHO_C" >&6 + +# Check whether --with-curses-dir or --without-curses-dir was given. +if test "${with_curses_dir+set}" = set; then + withval="$with_curses_dir" + cf_cv_curses_dir=$withval +else + cf_cv_curses_dir=no +fi; +echo "$as_me:6777: result: $cf_cv_curses_dir" >&5 +echo "${ECHO_T}$cf_cv_curses_dir" >&6 + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$withval" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval withval="$withval" + case "x$withval" in + (xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + withval=`echo "$withval" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:6806: error: expected a pathname, not \"$withval\"" >&5 +echo "$as_me: error: expected a pathname, not \"$withval\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + if test -d "$cf_cv_curses_dir" + then + +if test -n "$cf_cv_curses_dir/include" ; then + for cf_add_incdir in $cf_cv_curses_dir/include + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 6842 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:6854: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6857: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:6860: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6863: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:6880: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +if test -n "$cf_cv_curses_dir/lib" ; then + for cf_add_libdir in $cf_cv_curses_dir/lib + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:6916: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + fi +fi + +cf_cv_screen=curses + +echo "$as_me:6929: checking for specified curses library type" >&5 +echo $ECHO_N "checking for specified curses library type... $ECHO_C" >&6 + +# Check whether --with-screen or --without-screen was given. +if test "${with_screen+set}" = set; then + withval="$with_screen" + cf_cv_screen=$withval +else + +# Check whether --with-ncursesw or --without-ncursesw was given. +if test "${with_ncursesw+set}" = set; then + withval="$with_ncursesw" + cf_cv_screen=ncursesw +else + +# Check whether --with-ncurses or --without-ncurses was given. +if test "${with_ncurses+set}" = set; then + withval="$with_ncurses" + cf_cv_screen=ncurses +else + +# Check whether --with-pdcurses or --without-pdcurses was given. +if test "${with_pdcurses+set}" = set; then + withval="$with_pdcurses" + cf_cv_screen=pdcurses +else + +# Check whether --with-curses-colr or --without-curses-colr was given. +if test "${with_curses_colr+set}" = set; then + withval="$with_curses_colr" + cf_cv_screen=curses_colr +else + +# Check whether --with-curses-5lib or --without-curses-5lib was given. +if test "${with_curses_5lib+set}" = set; then + withval="$with_curses_5lib" + cf_cv_screen=curses_5lib +fi; +fi; +fi; +fi; +fi; +fi; + +echo "$as_me:6973: result: $cf_cv_screen" >&5 +echo "${ECHO_T}$cf_cv_screen" >&6 + +case $cf_cv_screen in +(curses|curses_*) + +echo "$as_me:6979: checking for extra include directories" >&5 +echo $ECHO_N "checking for extra include directories... $ECHO_C" >&6 +if test "${cf_cv_curses_incdir+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_curses_incdir=no +case "$host_os" in +(hpux10.*) + if test "x$cf_cv_screen" = "xcurses_colr" + then + test -d /usr/include/curses_colr && \ + cf_cv_curses_incdir="-I/usr/include/curses_colr" + fi + ;; +(sunos3*|sunos4*) + if test "x$cf_cv_screen" = "xcurses_5lib" + then + test -d /usr/5lib && \ + test -d /usr/5include && \ + cf_cv_curses_incdir="-I/usr/5include" + fi + ;; +esac + +fi +echo "$as_me:7005: result: $cf_cv_curses_incdir" >&5 +echo "${ECHO_T}$cf_cv_curses_incdir" >&6 +if test "$cf_cv_curses_incdir" != no +then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_curses_incdir" + +fi + +echo "$as_me:7015: checking if we have identified curses headers" >&5 +echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 +if test "${cf_cv_ncurses_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h \ + curses.h ncurses/ncurses.h ncurses/curses.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 7027 "configure" +#include "confdefs.h" +#include <${cf_header}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:7039: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7042: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:7045: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7048: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_header=$cf_header; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:7059: result: $cf_cv_ncurses_header" >&5 +echo "${ECHO_T}$cf_cv_ncurses_header" >&6 + +if test "$cf_cv_ncurses_header" = none ; then + { { echo "$as_me:7063: error: No curses header-files found" >&5 +echo "$as_me: error: No curses header-files found" >&2;} + { (exit 1); exit 1; }; } +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. + +for ac_header in $cf_cv_ncurses_header +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:7073: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7079 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:7083: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:7089: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:7108: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 7136 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:7151: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7154: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:7157: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7160: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:7176: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +echo "$as_me:7208: checking for ncurses version" >&5 +echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6 +if test "${cf_cv_ncurses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + if test "$cross_compiling" = yes; then + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out" + { (eval echo "$as_me:7234: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:7237: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7247 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:7274: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7277: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:7279: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7282: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_ncurses_version=`cat $cf_tempfile` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f "$cf_tempfile" + +fi +echo "$as_me:7296: result: $cf_cv_ncurses_version" >&5 +echo "${ECHO_T}$cf_cv_ncurses_version" >&6 +test "$cf_cv_ncurses_version" = no || +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +echo "$as_me:7303: checking if we have identified curses libraries" >&5 +echo $ECHO_N "checking if we have identified curses libraries... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 7306 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7318: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7321: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7324: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7327: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +echo "$as_me:7336: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +if test "$cf_result" = no ; then +case "$host_os" in +(freebsd*) + echo "$as_me:7342: checking for tgoto in -lmytinfo" >&5 +echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6 +if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmytinfo $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 7350 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7369: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7372: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7375: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7378: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_mytinfo_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_mytinfo_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:7389: result: $ac_cv_lib_mytinfo_tgoto" >&5 +echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6 +if test "$ac_cv_lib_mytinfo_tgoto" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lmytinfo; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + ;; +(hpux10.*) + # Looking at HPUX 10.20, the Hcurses library is the oldest (1997), cur_colr + # next (1998), and xcurses "newer" (2000). There is no header file for + # Hcurses; the subdirectory curses_colr has the headers (curses.h and + # term.h) for cur_colr + if test "x$cf_cv_screen" = "xcurses_colr" + then + echo "$as_me:7419: checking for initscr in -lcur_colr" >&5 +echo $ECHO_N "checking for initscr in -lcur_colr... $ECHO_C" >&6 +if test "${ac_cv_lib_cur_colr_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcur_colr $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 7427 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7446: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7449: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7452: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7455: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_cur_colr_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_cur_colr_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:7466: result: $ac_cv_lib_cur_colr_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_cur_colr_initscr" >&6 +if test "$ac_cv_lib_cur_colr_initscr" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lcur_colr; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + ac_cv_func_initscr=yes + +else + + echo "$as_me:7490: checking for initscr in -lHcurses" >&5 +echo $ECHO_N "checking for initscr in -lHcurses... $ECHO_C" >&6 +if test "${ac_cv_lib_Hcurses_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lHcurses $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 7498 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7517: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7520: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7523: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7526: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_Hcurses_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_Hcurses_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:7537: result: $ac_cv_lib_Hcurses_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_Hcurses_initscr" >&6 +if test "$ac_cv_lib_Hcurses_initscr" = yes; then + + # HP's header uses __HP_CURSES, but user claims _HP_CURSES. + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lHcurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D__HP_CURSES -D_HP_CURSES" + + ac_cv_func_initscr=yes + +fi + +fi + + fi + ;; +(linux*) + case `arch 2>/dev/null` in + (x86_64) + if test -d /lib64 + then + +if test -n "/lib64" ; then + for cf_add_libdir in /lib64 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:7595: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + else + +if test -n "/lib" ; then + for cf_add_libdir in /lib + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:7624: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + fi + ;; + (*) + +if test -n "/lib" ; then + for cf_add_libdir in /lib + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:7655: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + + ;; + esac + ;; +(sunos3*|sunos4*) + if test "x$cf_cv_screen" = "xcurses_5lib" + then + if test -d /usr/5lib ; then + +if test -n "/usr/5lib" ; then + for cf_add_libdir in /usr/5lib + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:7690: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lcurses -ltermcap; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + fi + fi + ac_cv_func_initscr=yes + ;; +esac + +if test ".$ac_cv_func_initscr" != .yes ; then + cf_save_LIBS="$LIBS" + + if test ".${cf_cv_ncurses_version:-no}" != .no + then + cf_check_list="ncurses curses cursesX" + else + cf_check_list="cursesX curses ncurses" + fi + + # Check for library containing tgoto. Do this before curses library + # because it may be needed to link the test-case for initscr. + if test "x$cf_term_lib" = x + then + echo "$as_me:7734: checking for tgoto" >&5 +echo $ECHO_N "checking for tgoto... $ECHO_C" >&6 +if test "${ac_cv_func_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7740 "configure" +#include "confdefs.h" +#define tgoto autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef tgoto + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_tgoto) || defined (__stub___tgoto) +#error found stub for tgoto +#endif + + return tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7771: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7774: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7777: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7780: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:7790: result: $ac_cv_func_tgoto" >&5 +echo "${ECHO_T}$ac_cv_func_tgoto" >&6 +if test "$ac_cv_func_tgoto" = yes; then + cf_term_lib=predefined +else + + for cf_term_lib in $cf_check_list otermcap termcap tinfo termlib unknown + do + as_ac_Lib=`echo "ac_cv_lib_$cf_term_lib''_tgoto" | $as_tr_sh` +echo "$as_me:7799: checking for tgoto in -l$cf_term_lib" >&5 +echo $ECHO_N "checking for tgoto in -l$cf_term_lib... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$cf_term_lib $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 7807 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7826: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7829: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7832: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7835: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Lib=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:7846: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then + + : "${cf_nculib_root:=$cf_term_lib}" + break + +fi + + done + +fi + + fi + + # Check for library containing initscr + test "$cf_term_lib" != predefined && test "$cf_term_lib" != unknown && LIBS="-l$cf_term_lib $cf_save_LIBS" + if test "x$cf_curs_lib" = x + then + for cf_curs_lib in $cf_check_list xcurses jcurses pdcurses unknown + do + LIBS="-l$cf_curs_lib $cf_save_LIBS" + if test "$cf_term_lib" = unknown || test "$cf_term_lib" = "$cf_curs_lib" ; then + echo "$as_me:7869: checking if we can link with $cf_curs_lib library" >&5 +echo $ECHO_N "checking if we can link with $cf_curs_lib library... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 7872 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7884: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7887: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7890: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7893: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:7902: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + test "$cf_result" = yes && break + elif test "$cf_curs_lib" = "$cf_term_lib" ; then + cf_result=no + elif test "$cf_term_lib" != predefined ; then + echo "$as_me:7908: checking if we need both $cf_curs_lib and $cf_term_lib libraries" >&5 +echo $ECHO_N "checking if we need both $cf_curs_lib and $cf_term_lib libraries... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 7911 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); endwin(); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7923: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7926: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7929: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7932: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + LIBS="-l$cf_curs_lib -l$cf_term_lib $cf_save_LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 7941 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:7953: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7956: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:7959: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7962: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=error +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:7974: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + test "$cf_result" != error && break + fi + done + fi + test "$cf_curs_lib" = unknown && { { echo "$as_me:7980: error: no curses library found" >&5 +echo "$as_me: error: no curses library found" >&2;} + { (exit 1); exit 1; }; } +fi +fi + + ;; +(ncursesw*) + +for ac_header in wchar.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:7992: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 7998 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:8002: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:8008: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:8027: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for multibyte character support... $ECHO_C" >&6 +if test "${cf_cv_utf8_lib+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LIBS="$LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 8045 "configure" +#include "confdefs.h" + +$ac_includes_default +#ifdef HAVE_WCHAR_H +#include +#endif + +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8062: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8065: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8068: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8071: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_utf8_lib=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +# If the linkage is not already in the $CPPFLAGS/$LDFLAGS configuration, these +# will be set on completion of the AC_TRY_LINK below. +cf_cv_header_path_utf8= +cf_cv_library_path_utf8= + +echo "${as_me:-configure}:8083: testing Starting FIND_LINKAGE(utf8,) ..." 1>&5 + +cf_save_LIBS="$LIBS" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 8088 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8101: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8104: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8107: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8110: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_find_linkage_utf8=yes + cf_cv_header_path_utf8=/usr/include + cf_cv_library_path_utf8=/usr/lib + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +LIBS="-lutf8 $cf_save_LIBS" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 8124 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8137: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8140: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8143: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8146: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_find_linkage_utf8=yes + cf_cv_header_path_utf8=/usr/include + cf_cv_library_path_utf8=/usr/lib + cf_cv_library_file_utf8="-lutf8" + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_find_linkage_utf8=no + LIBS="$cf_save_LIBS" + + test -n "$verbose" && echo " find linkage for utf8 library" 1>&6 + +echo "${as_me:-configure}:8163: testing find linkage for utf8 library ..." 1>&5 + +echo "${as_me:-configure}:8165: testing Searching for headers in FIND_LINKAGE(utf8,) ..." 1>&5 + + cf_save_CPPFLAGS="$CPPFLAGS" + cf_test_CPPFLAGS="$CPPFLAGS" + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/utf8" && cf_search="$cf_search $cf_header_path/include/utf8" + test -d "$cf_header_path/include/utf8/include" && cf_search="$cf_search $cf_header_path/include/utf8/include" + test -d "$cf_header_path/utf8/include" && cf_search="$cf_search $cf_header_path/utf8/include" + test -d "$cf_header_path/utf8/include/utf8" && cf_search="$cf_search $cf_header_path/utf8/include/utf8" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/utf8" && cf_search="$cf_search $prefix/include/utf8" + test -d "$prefix/include/utf8/include" && cf_search="$cf_search $prefix/include/utf8/include" + test -d "$prefix/utf8/include" && cf_search="$cf_search $prefix/utf8/include" + test -d "$prefix/utf8/include/utf8" && cf_search="$cf_search $prefix/utf8/include/utf8" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/include/utf8" + test -d "$cf_subdir_prefix/include/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/include/utf8/include" + test -d "$cf_subdir_prefix/utf8/include" && cf_search="$cf_search $cf_subdir_prefix/utf8/include" + test -d "$cf_subdir_prefix/utf8/include/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/include/utf8" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/utf8" && cf_search="$cf_search $includedir/utf8" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/utf8" && cf_search="$cf_search $oldincludedir/utf8" +} + +cf_search="$cf_search $cf_header_path_list" + + for cf_cv_header_path_utf8 in $cf_search + do + if test -d "$cf_cv_header_path_utf8" ; then + test -n "$verbose" && echo " ... testing $cf_cv_header_path_utf8" 1>&6 + +echo "${as_me:-configure}:8256: testing ... testing $cf_cv_header_path_utf8 ..." 1>&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_cv_header_path_utf8" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8264 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8277: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8280: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8283: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8286: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " ... found utf8 headers in $cf_cv_header_path_utf8" 1>&6 + +echo "${as_me:-configure}:8291: testing ... found utf8 headers in $cf_cv_header_path_utf8 ..." 1>&5 + + cf_cv_find_linkage_utf8=maybe + cf_test_CPPFLAGS="$CPPFLAGS" + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi + done + + if test "$cf_cv_find_linkage_utf8" = maybe ; then + +echo "${as_me:-configure}:8309: testing Searching for utf8 library in FIND_LINKAGE(utf8,) ..." 1>&5 + + cf_save_LIBS="$LIBS" + cf_save_LDFLAGS="$LDFLAGS" + + if test "$cf_cv_find_linkage_utf8" != yes ; then + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/utf8" && cf_search="$cf_search $cf_library_path/lib/utf8" + test -d "$cf_library_path/lib/utf8/lib" && cf_search="$cf_search $cf_library_path/lib/utf8/lib" + test -d "$cf_library_path/utf8/lib" && cf_search="$cf_search $cf_library_path/utf8/lib" + test -d "$cf_library_path/utf8/lib/utf8" && cf_search="$cf_search $cf_library_path/utf8/lib/utf8" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/utf8" && cf_search="$cf_search $prefix/lib/utf8" + test -d "$prefix/lib/utf8/lib" && cf_search="$cf_search $prefix/lib/utf8/lib" + test -d "$prefix/utf8/lib" && cf_search="$cf_search $prefix/utf8/lib" + test -d "$prefix/utf8/lib/utf8" && cf_search="$cf_search $prefix/utf8/lib/utf8" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8" + test -d "$cf_subdir_prefix/lib/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/utf8/lib" + test -d "$cf_subdir_prefix/utf8/lib" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib" + test -d "$cf_subdir_prefix/utf8/lib/utf8" && cf_search="$cf_search $cf_subdir_prefix/utf8/lib/utf8" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_cv_library_path_utf8 in $cf_search + do + if test -d "$cf_cv_library_path_utf8" ; then + test -n "$verbose" && echo " ... testing $cf_cv_library_path_utf8" 1>&6 + +echo "${as_me:-configure}:8384: testing ... testing $cf_cv_library_path_utf8 ..." 1>&5 + + CPPFLAGS="$cf_test_CPPFLAGS" + LIBS="-lutf8 $cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS -L$cf_cv_library_path_utf8" + cat >"conftest.$ac_ext" <<_ACEOF +#line 8390 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +putwc(0,0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8403: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8406: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8409: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8412: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " ... found utf8 library in $cf_cv_library_path_utf8" 1>&6 + +echo "${as_me:-configure}:8417: testing ... found utf8 library in $cf_cv_library_path_utf8 ..." 1>&5 + + cf_cv_find_linkage_utf8=yes + cf_cv_library_file_utf8="-lutf8" + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + LDFLAGS="$cf_save_LDFLAGS" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + fi + done + CPPFLAGS="$cf_save_CPPFLAGS" + LDFLAGS="$cf_save_LDFLAGS" + fi + + else + cf_cv_find_linkage_utf8=no + fi + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +LIBS="$cf_save_LIBS" + +if test "$cf_cv_find_linkage_utf8" = yes ; then +cf_cv_utf8_lib=add-on +else +cf_cv_utf8_lib=no +fi + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:8459: result: $cf_cv_utf8_lib" >&5 +echo "${ECHO_T}$cf_cv_utf8_lib" >&6 + +# HAVE_LIBUTF8_H is used by ncurses if curses.h is shared between +# ncurses/ncursesw: +if test "$cf_cv_utf8_lib" = "add-on" ; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBUTF8_H 1 +EOF + +if test -n "$cf_cv_header_path_utf8" ; then + for cf_add_incdir in $cf_cv_header_path_utf8 + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8497 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:8509: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:8512: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:8515: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8518: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:8535: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +if test -n "$cf_cv_library_path_utf8" ; then + for cf_add_libdir in $cf_cv_library_path_utf8 + do + if test "$cf_add_libdir" = /usr/lib ; then + : + elif test -d "$cf_add_libdir" + then + cf_have_libdir=no + if test -n "$LDFLAGS$LIBS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_libdir in $LDFLAGS $LIBS ; do + if test ".$cf_test_libdir" = ".-L$cf_add_libdir" ; then + cf_have_libdir=yes; break + fi + done + fi + if test "$cf_have_libdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_libdir to library-path" 1>&6 + +echo "${as_me:-configure}:8571: testing adding $cf_add_libdir to library-path ..." 1>&5 + + LDFLAGS="-L$cf_add_libdir $LDFLAGS" + fi + fi + done +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_library_file_utf8; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +cf_ncuconfig_root=$cf_cv_screen +cf_have_ncuconfig=no + +if test "x${PKG_CONFIG:=none}" != xnone; then + echo "$as_me:8601: checking pkg-config for $cf_ncuconfig_root" >&5 +echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + echo "$as_me:8604: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:8607: checking if the $cf_ncuconfig_root package files work" >&5 +echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6 + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[89]9@@*-W*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkg_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8740 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8752: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8755: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8758: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8761: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_test_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 8767 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:8774: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8777: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:8779: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8782: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_test_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + +for cf_add_cflags in $cf_pkg_cflags +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 8956 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:8968: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8971: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:8974: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8977: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 8983 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:8990: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8993: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:8995: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8998: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:9015: result: $cf_have_ncuconfig" >&5 +echo "${ECHO_T}$cf_have_ncuconfig" >&6 + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + +echo "$as_me:9031: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 9049 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9064: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9067: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9070: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9073: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:9089: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + + fi + + else + echo "$as_me:9124: result: no" >&5 +echo "${ECHO_T}no" >&6 + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + +if test -n "$ac_tool_prefix"; then + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:9140: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NCURSES_CONFIG"; then + ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog" +echo "$as_me:9155: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG +if test -n "$NCURSES_CONFIG"; then + echo "$as_me:9163: result: $NCURSES_CONFIG" >&5 +echo "${ECHO_T}$NCURSES_CONFIG" >&6 +else + echo "$as_me:9166: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$NCURSES_CONFIG" && break + done +fi +if test -z "$NCURSES_CONFIG"; then + ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:9179: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_NCURSES_CONFIG"; then + ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog" +echo "$as_me:9194: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG +if test -n "$ac_ct_NCURSES_CONFIG"; then + echo "$as_me:9202: result: $ac_ct_NCURSES_CONFIG" >&5 +echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 +else + echo "$as_me:9205: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_NCURSES_CONFIG" && break +done +test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none" + + NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG +fi + + if test "$NCURSES_CONFIG" != none ; then + +for cf_add_cflags in `$NCURSES_CONFIG --cflags` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + # even with config script, some packages use no-override for curses.h + +echo "$as_me:9362: checking if we have identified curses headers" >&5 +echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 +if test "${cf_cv_ncurses_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h $cf_cv_screen/ncurses.h \ + curses.h $cf_cv_screen/curses.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 9374 "configure" +#include "confdefs.h" +#include <${cf_header}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9386: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9389: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9392: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9395: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_header=$cf_header; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:9406: result: $cf_cv_ncurses_header" >&5 +echo "${ECHO_T}$cf_cv_ncurses_header" >&6 + +if test "$cf_cv_ncurses_header" = none ; then + { { echo "$as_me:9410: error: No curses header-files found" >&5 +echo "$as_me: error: No curses header-files found" >&2;} + { (exit 1); exit 1; }; } +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. + +for ac_header in $cf_cv_ncurses_header +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:9420: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 9426 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:9430: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:9436: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:9455: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF +#line 9511 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9523: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9526: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9529: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9532: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:9549: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +} + +echo "$as_me:9568: checking for $cf_ncuhdr_root header in include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 9580 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9604: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9607: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9610: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9613: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + test "$cf_cv_ncurses_h" != no && break + done + +fi +echo "$as_me:9628: result: $cf_cv_ncurses_h" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h" >&6 + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +echo "$as_me:9635: checking for $cf_ncuhdr_root include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$verbose" && echo + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root" + test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root" + test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root" +} + +cf_search="$cf_search $cf_header_path_list" + + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + +if test -n "$cf_incdir" ; then + for cf_add_incdir in $cf_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 9756 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9768: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9771: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9774: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9777: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:9794: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + + for cf_header in \ + ncurses.h \ + curses.h + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 9817 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9841: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9844: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9847: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9850: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h2=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h2=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6 + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6 + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:9871: error: not found" >&5 +echo "$as_me: error: not found" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:9876: result: $cf_cv_ncurses_h2" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h2" >&6 + + cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'` + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + +if test -n "$cf_1st_incdir" ; then + for cf_add_incdir in $cf_1st_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 9912 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:9924: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9927: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:9930: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9933: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:9950: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_H 1 +EOF + + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_NCURSES_H 1 +EOF + + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_NCURSES_H 1 +EOF + + ;; +esac + +echo "$as_me:9998: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 10016 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:10031: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:10034: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:10037: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10040: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:10056: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +# some applications need this, but should check for NCURSES_VERSION + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +echo "$as_me:10094: checking for ncurses version" >&5 +echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6 +if test "${cf_cv_ncurses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + if test "$cross_compiling" = yes; then + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out" + { (eval echo "$as_me:10120: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:10123: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10133 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:10160: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10163: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:10165: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10168: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_ncurses_version=`cat $cf_tempfile` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f "$cf_tempfile" + +fi +echo "$as_me:10182: result: $cf_cv_ncurses_version" >&5 +echo "${ECHO_T}$cf_cv_ncurses_version" >&6 +test "$cf_cv_ncurses_version" = no || +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_root=$cf_cv_screen + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +echo "$as_me:10195: checking for Gpm_Open in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 10203 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Open (void); +int +main (void) +{ +Gpm_Open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10222: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10225: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10228: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10231: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:10242: result: $ac_cv_lib_gpm_Gpm_Open" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6 +if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then + echo "$as_me:10245: checking for initscr in -lgpm" >&5 +echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 10253 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10272: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10275: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10278: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10281: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:10292: result: $ac_cv_lib_gpm_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6 +if test "$ac_cv_lib_gpm_initscr" = yes; then + LIBS="$cf_ncurses_SAVE" +else + cf_ncurses_LIBS="-lgpm" +fi + +fi + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + echo "$as_me:10307: checking for tgoto in -lmytinfo" >&5 +echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6 +if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmytinfo $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 10315 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10334: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10337: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10340: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10343: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_mytinfo_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_mytinfo_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:10354: result: $ac_cv_lib_mytinfo_tgoto" >&5 +echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6 +if test "$ac_cv_lib_mytinfo_tgoto" = yes; then + cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS" +fi + + fi + ;; +esac + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no' + cf_libdir="" + echo "$as_me:10403: checking for initscr" >&5 +echo $ECHO_N "checking for initscr... $ECHO_C" >&6 +if test "${ac_cv_func_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10409 "configure" +#include "confdefs.h" +#define initscr autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef initscr + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_initscr) || defined (__stub___initscr) +#error found stub for initscr +#endif + + return initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10440: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10443: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10446: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10449: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:10459: result: $ac_cv_func_initscr" >&5 +echo "${ECHO_T}$ac_cv_func_initscr" >&6 +if test "$ac_cv_func_initscr" = yes; then + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' +else + + cf_save_LIBS="$LIBS" + echo "$as_me:10466: checking for initscr in -l$cf_nculib_root" >&5 +echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6 + LIBS="-l$cf_nculib_root $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 10470 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10482: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10485: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10488: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10491: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:10493: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:10500: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root" + test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root" + test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_libdir in $cf_search + do + echo "$as_me:10568: checking for -l$cf_nculib_root in $cf_libdir" >&5 +echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6 + LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 10572 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10584: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10587: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10590: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10593: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:10595: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:10602: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_save_LIBS" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi + +eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\" + +if test "$cf_found_library" = no ; then + { { echo "$as_me:10617: error: Cannot link $cf_nculib_root library" >&5 +echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +if test -n "$cf_ncurses_LIBS" ; then + echo "$as_me:10625: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5 +echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6 + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + cat >"conftest.$ac_ext" <<_ACEOF +#line 10635 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10647: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10650: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10653: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10656: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:10658: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:10663: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_ncurses_SAVE" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo $ECHO_N "checking pkg-config for $cf_ncuconfig_root... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists $cf_ncuconfig_root ; then + echo "$as_me:10691: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:10694: checking if the $cf_ncuconfig_root package files work" >&5 +echo $ECHO_N "checking if the $cf_ncuconfig_root package files work... $ECHO_C" >&6 + cf_have_ncuconfig=unknown + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + + cf_pkg_cflags="`$PKG_CONFIG --cflags $cf_ncuconfig_root`" + cf_pkg_libs="`$PKG_CONFIG --libs $cf_ncuconfig_root`" + + # while -W for passing linker flags is prevalent, it is not "standard". + # At least one wrapper for c89/c99 (in Apple's xcode) has its own + # incompatible _and_ non-standard -W option which gives an error. Work + # around that pitfall. + case "x${CC}@@${cf_pkg_libs}@${cf_pkg_cflags}" in + (x*c[89]9@@*-W*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkg_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 10827 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:10839: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10842: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:10845: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10848: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_test_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 10854 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:10861: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10864: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:10866: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10869: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_test_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_test_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + + if test "x$cf_test_ncuconfig" != xyes; then + cf_temp=`echo "x$cf_pkg_cflags" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_cflags="$cf_temp" + cf_temp=`echo "x$cf_pkg_libs" | sed -e s/^x// -e 's/-W[^ ]*//g'` + cf_pkg_libs="$cf_temp" + fi + ;; + esac + +for cf_add_cflags in $cf_pkg_cflags +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkg_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11043 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:11055: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11058: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:11061: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11064: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_ncuconfig=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 11070 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> + int main(void) + { const char *xx = curses_version(); return (xx == 0); } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:11077: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11080: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:11082: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11085: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_ncuconfig=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_ncuconfig=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:11102: result: $cf_have_ncuconfig" >&5 +echo "${ECHO_T}$cf_have_ncuconfig" >&6 + test "$cf_have_ncuconfig" = maybe && cf_have_ncuconfig=yes + if test "$cf_have_ncuconfig" != "yes" + then + CPPFLAGS="$cf_save_CPPFLAGS" + LIBS="$cf_save_LIBS" + NCURSES_CONFIG_PKG=none + else + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + + NCURSES_CONFIG_PKG=$cf_ncuconfig_root + +echo "$as_me:11118: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 11136 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11151: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11154: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11157: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11160: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:11176: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + + fi + + else + echo "$as_me:11211: result: no" >&5 +echo "${ECHO_T}no" >&6 + NCURSES_CONFIG_PKG=none + fi +else + NCURSES_CONFIG_PKG=none +fi + +if test "x$cf_have_ncuconfig" = "xno"; then + cf_ncurses_config="${cf_ncuconfig_root}${NCURSES_CONFIG_SUFFIX}-config"; echo "Looking for ${cf_ncurses_config}" + +if test -n "$ac_tool_prefix"; then + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:11227: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NCURSES_CONFIG"; then + ac_cv_prog_NCURSES_CONFIG="$NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_NCURSES_CONFIG="$ac_tool_prefix$ac_prog" +echo "$as_me:11242: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +NCURSES_CONFIG=$ac_cv_prog_NCURSES_CONFIG +if test -n "$NCURSES_CONFIG"; then + echo "$as_me:11250: result: $NCURSES_CONFIG" >&5 +echo "${ECHO_T}$NCURSES_CONFIG" >&6 +else + echo "$as_me:11253: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$NCURSES_CONFIG" && break + done +fi +if test -z "$NCURSES_CONFIG"; then + ac_ct_NCURSES_CONFIG=$NCURSES_CONFIG + for ac_prog in ${cf_ncurses_config} ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}6-config ${cf_ncuconfig_root}5-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:11266: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_NCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_NCURSES_CONFIG"; then + ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_ct_NCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_NCURSES_CONFIG="$ac_prog" +echo "$as_me:11281: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_NCURSES_CONFIG=$ac_cv_prog_ac_ct_NCURSES_CONFIG +if test -n "$ac_ct_NCURSES_CONFIG"; then + echo "$as_me:11289: result: $ac_ct_NCURSES_CONFIG" >&5 +echo "${ECHO_T}$ac_ct_NCURSES_CONFIG" >&6 +else + echo "$as_me:11292: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_NCURSES_CONFIG" && break +done +test -n "$ac_ct_NCURSES_CONFIG" || ac_ct_NCURSES_CONFIG="none" + + NCURSES_CONFIG=$ac_ct_NCURSES_CONFIG +fi + + if test "$NCURSES_CONFIG" != none ; then + +for cf_add_cflags in `$NCURSES_CONFIG --cflags` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$NCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + # even with config script, some packages use no-override for curses.h + +echo "$as_me:11449: checking if we have identified curses headers" >&5 +echo $ECHO_N "checking if we have identified curses headers... $ECHO_C" >&6 +if test "${cf_cv_ncurses_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_ncurses_header=none +for cf_header in \ + ncurses.h $cf_cv_screen/ncurses.h \ + curses.h $cf_cv_screen/curses.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 11461 "configure" +#include "confdefs.h" +#include <${cf_header}> +int +main (void) +{ +initscr(); endwin() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11473: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11476: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11479: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11482: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_header=$cf_header; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:11493: result: $cf_cv_ncurses_header" >&5 +echo "${ECHO_T}$cf_cv_ncurses_header" >&6 + +if test "$cf_cv_ncurses_header" = none ; then + { { echo "$as_me:11497: error: No curses header-files found" >&5 +echo "$as_me: error: No curses header-files found" >&2;} + { (exit 1); exit 1; }; } +fi + +# cheat, to get the right #define's for HAVE_NCURSES_H, etc. + +for ac_header in $cf_cv_ncurses_header +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:11507: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 11513 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:11517: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:11523: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:11542: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_ncuconfig_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF +#line 11598 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11610: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11613: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11616: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11619: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:11636: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +} + +echo "$as_me:11655: checking for $cf_ncuhdr_root header in include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root header in include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_header_list="$cf_ncuhdr_root/curses.h $cf_ncuhdr_root/ncurses.h" + { test "$cf_ncuhdr_root" = ncurses || test "$cf_ncuhdr_root" = ncursesw; } && cf_header_list="$cf_header_list curses.h ncurses.h" + for cf_header in $cf_header_list + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11667 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11691: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11694: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11697: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11700: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + test "$cf_cv_ncurses_h" != no && break + done + +fi +echo "$as_me:11715: result: $cf_cv_ncurses_h" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h" >&6 + +if test "$cf_cv_ncurses_h" != no ; then + cf_cv_ncurses_header=$cf_cv_ncurses_h +else + +echo "$as_me:11722: checking for $cf_ncuhdr_root include-path" >&5 +echo $ECHO_N "checking for $cf_ncuhdr_root include-path... $ECHO_C" >&6 +if test "${cf_cv_ncurses_h2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$verbose" && echo + +cf_search= + +# collect the current set of include-directories from compiler flags +cf_header_path_list="" +if test -n "${CFLAGS}${CPPFLAGS}" ; then + for cf_header_path in $CPPFLAGS $CFLAGS + do + case "$cf_header_path" in + (-I*) + cf_header_path=`echo ".$cf_header_path" |sed -e 's/^...//' -e 's,/include$,,'` + +test "x$cf_header_path" != "xNONE" && \ +test -d "$cf_header_path" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $cf_header_path" + test -d "$cf_header_path/include" && cf_search="$cf_search $cf_header_path/include" + test -d "$cf_header_path/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root" + test -d "$cf_header_path/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/include/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include" + test -d "$cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_header_path/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + + cf_header_path_list="$cf_header_path_list $cf_search" + ;; + esac + done +fi + +# add the variations for the package we are looking for + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for include-directories under $prefix" + test -d "$prefix/include" && cf_search="$cf_search $prefix/include" + test -d "$prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root" + test -d "$prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/include/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include" + test -d "$prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for include-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/include" && cf_search="$cf_search $cf_subdir_prefix/include" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root" + test -d "$cf_subdir_prefix/include/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/include/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include" + test -d "$cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_ncuhdr_root/include/$cf_ncuhdr_root" +} + +done + +test "$includedir" != NONE && \ +test "$includedir" != "/usr/include" && \ +test -d "$includedir" && { + test -d "$includedir" && cf_search="$cf_search $includedir" + test -d "$includedir/$cf_ncuhdr_root" && cf_search="$cf_search $includedir/$cf_ncuhdr_root" +} + +test "$oldincludedir" != NONE && \ +test "$oldincludedir" != "/usr/include" && \ +test -d "$oldincludedir" && { + test -d "$oldincludedir" && cf_search="$cf_search $oldincludedir" + test -d "$oldincludedir/$cf_ncuhdr_root" && cf_search="$cf_search $oldincludedir/$cf_ncuhdr_root" +} + +cf_search="$cf_search $cf_header_path_list" + + test -n "$verbose" && echo "search path $cf_search" + cf_save2_CPPFLAGS="$CPPFLAGS" + for cf_incdir in $cf_search + do + +if test -n "$cf_incdir" ; then + for cf_add_incdir in $cf_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11843 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11855: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11858: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11861: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11864: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:11881: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + + for cf_header in \ + ncurses.h \ + curses.h + do + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11904 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ + +#ifdef NCURSES_VERSION + +printf("%s\\n", NCURSES_VERSION); +#else +#ifdef __NCURSES_H +printf("old\\n"); +#else + #error __NCURSES_H is not defined +#endif +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:11928: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:11931: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:11934: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11937: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_h2=$cf_header + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_h2=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + + if test "$cf_cv_ncurses_h2" != no ; then + cf_cv_ncurses_h2=$cf_incdir/$cf_header + test -n "$verbose" && echo $ECHO_N " ... found $ECHO_C" 1>&6 + break + fi + test -n "$verbose" && echo " ... tested $cf_incdir/$cf_header" 1>&6 + done + CPPFLAGS="$cf_save2_CPPFLAGS" + test "$cf_cv_ncurses_h2" != no && break + done + test "$cf_cv_ncurses_h2" = no && { { echo "$as_me:11958: error: not found" >&5 +echo "$as_me: error: not found" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:11963: result: $cf_cv_ncurses_h2" >&5 +echo "${ECHO_T}$cf_cv_ncurses_h2" >&6 + + cf_1st_incdir=`echo "$cf_cv_ncurses_h2" | sed -e 's%/[^/]*$%%'` + cf_cv_ncurses_header="`basename "$cf_cv_ncurses_h2"`" + if test "`basename "$cf_1st_incdir"`" = "$cf_ncuhdr_root" ; then + cf_cv_ncurses_header="$cf_ncuhdr_root/$cf_cv_ncurses_header" + fi + +if test -n "$cf_1st_incdir" ; then + for cf_add_incdir in $cf_1st_incdir + do + while test "$cf_add_incdir" != /usr/include + do + if test -d "$cf_add_incdir" + then + cf_have_incdir=no + if test -n "$CFLAGS$CPPFLAGS" ; then + # a loop is needed to ensure we can add subdirs of existing dirs + for cf_test_incdir in $CFLAGS $CPPFLAGS ; do + if test ".$cf_test_incdir" = ".-I$cf_add_incdir" ; then + cf_have_incdir=yes; break + fi + done + fi + + if test "$cf_have_incdir" = no ; then + if test "$cf_add_incdir" = /usr/local/include ; then + if test "$GCC" = yes + then + cf_save_CPPFLAGS=$CPPFLAGS + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_add_incdir" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 11999 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello") + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12011: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12014: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12017: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12020: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_incdir=yes +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS=$cf_save_CPPFLAGS + fi + fi + fi + + if test "$cf_have_incdir" = no ; then + test -n "$verbose" && echo " adding $cf_add_incdir to include-path" 1>&6 + +echo "${as_me:-configure}:12037: testing adding $cf_add_incdir to include-path ..." 1>&5 + + CPPFLAGS="$CPPFLAGS -I$cf_add_incdir" + + cf_top_incdir=`echo "$cf_add_incdir" | sed -e 's%/include/.*$%/include%'` + test "$cf_top_incdir" = "$cf_add_incdir" && break + cf_add_incdir="$cf_top_incdir" + else + break + fi + else + break + fi + done + done +fi + +fi + +# Set definitions to allow ifdef'ing for ncurses.h + +case "$cf_cv_ncurses_header" in +(*ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_H 1 +EOF + + ;; +esac + +case "$cf_cv_ncurses_header" in +(ncurses/curses.h|ncurses/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_NCURSES_H 1 +EOF + + ;; +(ncursesw/curses.h|ncursesw/ncurses.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_NCURSES_H 1 +EOF + + ;; +esac + +echo "$as_me:12085: checking for terminfo header" >&5 +echo $ECHO_N "checking for terminfo header... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +case "${cf_cv_ncurses_header}" in +(*/ncurses.h|*/ncursesw.h) + cf_term_header=`echo "$cf_cv_ncurses_header" | sed -e 's%ncurses[^.]*\.h$%term.h%'` + ;; +(*) + cf_term_header=term.h + ;; +esac + +for cf_test in $cf_term_header "ncurses/term.h" "ncursesw/term.h" +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 12103 "configure" +#include "confdefs.h" +#include +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_test> + +int +main (void) +{ +int x = auto_left_margin; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:12118: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:12121: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:12124: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12127: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_term_header="$cf_test" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_term_header=unknown + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + test "$cf_cv_term_header" != unknown && break +done + +fi +echo "$as_me:12143: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +# Set definitions to allow ifdef'ing to accommodate subdirectories + +case "$cf_cv_term_header" in +(*term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +esac + +case "$cf_cv_term_header" in +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +# some applications need this, but should check for NCURSES_VERSION + +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +echo "$as_me:12181: checking for ncurses version" >&5 +echo $ECHO_N "checking for ncurses version... $ECHO_C" >&6 +if test "${cf_cv_ncurses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_ncurses_version=no + cf_tempfile=out$$ + rm -f "$cf_tempfile" + if test "$cross_compiling" = yes; then + + # This will not work if the preprocessor splits the line after the + # Autoconf token. The 'unproto' program does that. + cat > "conftest.$ac_ext" < +#undef Autoconf +#ifdef NCURSES_VERSION +Autoconf NCURSES_VERSION +#else +#ifdef __NCURSES_H +Autoconf "old" +#endif +; +#endif +EOF + cf_try="$ac_cpp conftest.$ac_ext 2>&5 | grep '^Autoconf ' >conftest.out" + { (eval echo "$as_me:12207: \"$cf_try\"") >&5 + (eval $cf_try) 2>&5 + ac_status=$? + echo "$as_me:12210: \$? = $ac_status" >&5 + (exit "$ac_status"); } + if test -f conftest.out ; then + cf_out=`sed -e 's%^Autoconf %%' -e 's%^[^"]*"%%' -e 's%".*%%' conftest.out` + test -n "$cf_out" && cf_cv_ncurses_version="$cf_out" + rm -f conftest.out + fi + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 12220 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + FILE *fp = fopen("$cf_tempfile", "w"); +#ifdef NCURSES_VERSION +# ifdef NCURSES_VERSION_PATCH + fprintf(fp, "%s.%d\\n", NCURSES_VERSION, NCURSES_VERSION_PATCH); +# else + fprintf(fp, "%s\\n", NCURSES_VERSION); +# endif +#else +# ifdef __NCURSES_H + fprintf(fp, "old\\n"); +# else + #error expected ncurses header to define __NCURSES_H +# endif +#endif + ${cf_cv_main_return:-return}(0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:12247: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12250: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:12252: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12255: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_ncurses_version=`cat $cf_tempfile` +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + rm -f "$cf_tempfile" + +fi +echo "$as_me:12269: result: $cf_cv_ncurses_version" >&5 +echo "${ECHO_T}$cf_cv_ncurses_version" >&6 +test "$cf_cv_ncurses_version" = no || +cat >>confdefs.h <<\EOF +#define NCURSES 1 +EOF + +cf_nculib_root=$cf_cv_screen + # This works, except for the special case where we find gpm, but + # ncurses is in a nonstandard location via $LIBS, and we really want + # to link gpm. +cf_ncurses_LIBS="" +cf_ncurses_SAVE="$LIBS" +echo "$as_me:12282: checking for Gpm_Open in -lgpm" >&5 +echo $ECHO_N "checking for Gpm_Open in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_Gpm_Open+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 12290 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char Gpm_Open (void); +int +main (void) +{ +Gpm_Open (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12309: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12312: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12315: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12318: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_Gpm_Open=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_Gpm_Open=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:12329: result: $ac_cv_lib_gpm_Gpm_Open" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_Gpm_Open" >&6 +if test "$ac_cv_lib_gpm_Gpm_Open" = yes; then + echo "$as_me:12332: checking for initscr in -lgpm" >&5 +echo $ECHO_N "checking for initscr in -lgpm... $ECHO_C" >&6 +if test "${ac_cv_lib_gpm_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgpm $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 12340 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); +int +main (void) +{ +initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12359: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12362: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12365: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12368: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_gpm_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_gpm_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:12379: result: $ac_cv_lib_gpm_initscr" >&5 +echo "${ECHO_T}$ac_cv_lib_gpm_initscr" >&6 +if test "$ac_cv_lib_gpm_initscr" = yes; then + LIBS="$cf_ncurses_SAVE" +else + cf_ncurses_LIBS="-lgpm" +fi + +fi + +case "$host_os" in +(freebsd*) + # This is only necessary if you are linking against an obsolete + # version of ncurses (but it should do no harm, since it is static). + if test "$cf_nculib_root" = ncurses ; then + echo "$as_me:12394: checking for tgoto in -lmytinfo" >&5 +echo $ECHO_N "checking for tgoto in -lmytinfo... $ECHO_C" >&6 +if test "${ac_cv_lib_mytinfo_tgoto+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lmytinfo $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 12402 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char tgoto (void); +int +main (void) +{ +tgoto (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12421: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12424: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12427: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12430: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_mytinfo_tgoto=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_mytinfo_tgoto=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:12441: result: $ac_cv_lib_mytinfo_tgoto" >&5 +echo "${ECHO_T}$ac_cv_lib_mytinfo_tgoto" >&6 +if test "$ac_cv_lib_mytinfo_tgoto" = yes; then + cf_ncurses_LIBS="-lmytinfo $cf_ncurses_LIBS" +fi + + fi + ;; +esac + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_ncurses_LIBS; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test -n "$cf_cv_curses_dir" && test "$cf_cv_curses_dir" != "no" +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_nculib_root; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=no' + cf_libdir="" + echo "$as_me:12490: checking for initscr" >&5 +echo $ECHO_N "checking for initscr... $ECHO_C" >&6 +if test "${ac_cv_func_initscr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 12496 "configure" +#include "confdefs.h" +#define initscr autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef initscr + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char initscr (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_initscr) || defined (__stub___initscr) +#error found stub for initscr +#endif + + return initscr (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12527: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12530: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12533: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12536: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_initscr=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_initscr=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:12546: result: $ac_cv_func_initscr" >&5 +echo "${ECHO_T}$ac_cv_func_initscr" >&6 +if test "$ac_cv_func_initscr" = yes; then + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' +else + + cf_save_LIBS="$LIBS" + echo "$as_me:12553: checking for initscr in -l$cf_nculib_root" >&5 +echo $ECHO_N "checking for initscr in -l$cf_nculib_root... $ECHO_C" >&6 + LIBS="-l$cf_nculib_root $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 12557 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12569: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12572: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12575: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12578: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:12580: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:12587: result: no" >&5 +echo "${ECHO_T}no" >&6 + +cf_search= +cf_library_path_list="" +if test -n "${LDFLAGS}${LIBS}" ; then + for cf_library_path in $LDFLAGS $LIBS + do + case "$cf_library_path" in + (-L*) + cf_library_path=`echo ".$cf_library_path" |sed -e 's/^...//' -e 's,/lib$,,'` + +test "x$cf_library_path" != "xNONE" && \ +test -d "$cf_library_path" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_library_path" + test -d "$cf_library_path/lib" && cf_search="$cf_search $cf_library_path/lib" + test -d "$cf_library_path/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root" + test -d "$cf_library_path/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/lib/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib" + test -d "$cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_library_path/$cf_nculib_root/lib/$cf_nculib_root" +} + + cf_library_path_list="$cf_library_path_list $cf_search" + ;; + esac + done +fi + +cf_search= + +test "x$prefix" != "xNONE" && \ +test -d "$prefix" && \ + { + test -n "$verbose" && echo " ... testing for lib-directories under $prefix" + test -d "$prefix/lib" && cf_search="$cf_search $prefix/lib" + test -d "$prefix/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/lib/$cf_nculib_root" + test -d "$prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/lib/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib" && cf_search="$cf_search $prefix/$cf_nculib_root/lib" + test -d "$prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +for cf_subdir_prefix in \ + /usr \ + /usr/local \ + /usr/pkg \ + /opt \ + /opt/local \ + $HOME +do + +test "x$cf_subdir_prefix" != "x$prefix" && \ +test -d "$cf_subdir_prefix" && \ +{ test -z "$prefix" || test "x$prefix" = xNONE || test "x$cf_subdir_prefix" != "x$prefix"; } && { + test -n "$verbose" && echo " ... testing for lib-directories under $cf_subdir_prefix" + test -d "$cf_subdir_prefix/lib" && cf_search="$cf_search $cf_subdir_prefix/lib" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root" + test -d "$cf_subdir_prefix/lib/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/lib/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib" + test -d "$cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" && cf_search="$cf_search $cf_subdir_prefix/$cf_nculib_root/lib/$cf_nculib_root" +} + +done + +cf_search="$cf_library_path_list $cf_search" + + for cf_libdir in $cf_search + do + echo "$as_me:12655: checking for -l$cf_nculib_root in $cf_libdir" >&5 +echo $ECHO_N "checking for -l$cf_nculib_root in $cf_libdir... $ECHO_C" >&6 + LIBS="-L$cf_libdir -l$cf_nculib_root $cf_save_LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 12659 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr() + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12671: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12674: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12677: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12680: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:12682: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + eval 'cf_cv_have_lib_'"$cf_nculib_root"'=yes' + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:12689: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_save_LIBS" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi + +eval 'cf_found_library="$cf_cv_have_lib_'"$cf_nculib_root"\" + +if test "$cf_found_library" = no ; then + { { echo "$as_me:12704: error: Cannot link $cf_nculib_root library" >&5 +echo "$as_me: error: Cannot link $cf_nculib_root library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +if test -n "$cf_ncurses_LIBS" ; then + echo "$as_me:12712: checking if we can link $cf_nculib_root without $cf_ncurses_LIBS" >&5 +echo $ECHO_N "checking if we can link $cf_nculib_root without $cf_ncurses_LIBS... $ECHO_C" >&6 + cf_ncurses_SAVE="$LIBS" + for p in $cf_ncurses_LIBS ; do + q=`echo "$LIBS" | sed -e "s%$p %%" -e "s%$p$%%"` + if test "$q" != "$LIBS" ; then + LIBS="$q" + fi + done + cat >"conftest.$ac_ext" <<_ACEOF +#line 12722 "configure" +#include "confdefs.h" +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +initscr(); mousemask(0,0); tigetstr((char *)0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12734: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12737: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12740: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12743: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + echo "$as_me:12745: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:12750: result: no" >&5 +echo "${ECHO_T}no" >&6 + LIBS="$cf_ncurses_SAVE" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +cf_nculib_ROOT=`echo "HAVE_LIB$cf_nculib_root" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval "`${MAKE-make} acfindx 2>/dev/null | grep -v make`" + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/opt/local/include +/opt/X11/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >"conftest.$ac_ext" <<_ACEOF +#line 12874 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:12878: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:12884: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err "conftest.$ac_ext" +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 12917 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:12929: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12932: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:12935: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12938: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib dll; do + if test -r "$ac_dir/libXt.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:12976: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:12986: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\EOF +#define X_DISPLAY_MISSING 1 +EOF + + X_CFLAGS= + X_PRE_LIBS= + X_LIBS= + X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:13013: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >"conftest.$ac_ext" <<_ACEOF +#line 13017 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13029: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13032: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13035: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13038: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_R_nospace=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + if test $ac_R_nospace = yes; then + echo "$as_me:13048: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >"conftest.$ac_ext" <<_ACEOF +#line 13054 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13066: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13069: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13072: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13075: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_R_space=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + if test $ac_R_space = yes; then + echo "$as_me:13085: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:13089: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >"conftest.$ac_ext" <<_ACEOF +#line 13109 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13128: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13131: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13134: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13137: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:13143: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13151 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (void); +int +main (void) +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13170: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13173: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13176: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13179: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13190: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test "$ac_cv_lib_dnet_dnet_ntoa" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:13197: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13205 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (void); +int +main (void) +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13224: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13227: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13230: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13233: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13244: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test "$ac_cv_lib_dnet_stub_dnet_ntoa" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:13263: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 13269 "configure" +#include "confdefs.h" +#define gethostbyname autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef gethostbyname + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +#error found stub for gethostbyname +#endif + + return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13300: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13303: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13306: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13309: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_gethostbyname=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:13319: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:13323: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13331 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); +int +main (void) +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13350: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13353: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13356: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13359: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13370: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test "$ac_cv_lib_nsl_gethostbyname" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:13377: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13385 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); +int +main (void) +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13404: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13407: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13410: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13413: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13424: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test "$ac_cv_lib_bsd_gethostbyname" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the nameserver (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:13440: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 13446 "configure" +#include "confdefs.h" +#define connect autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef connect + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +#error found stub for connect +#endif + + return connect (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13477: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13480: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13483: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13486: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_connect=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:13496: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:13500: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13508 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (void); +int +main (void) +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13527: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13530: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13533: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13536: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_socket_connect=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13547: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test "$ac_cv_lib_socket_connect" = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:13556: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 13562 "configure" +#include "confdefs.h" +#define remove autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef remove + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +#error found stub for remove +#endif + + return remove (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13593: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13596: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13599: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13602: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_remove=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:13612: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:13616: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13624 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (void); +int +main (void) +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13643: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13646: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13649: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13652: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_posix_remove=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13663: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test "$ac_cv_lib_posix_remove" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:13672: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 13678 "configure" +#include "confdefs.h" +#define shmat autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef shmat + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +#error found stub for shmat +#endif + + return shmat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13709: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13712: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13715: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13718: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_shmat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:13728: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:13732: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13740 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (void); +int +main (void) +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13759: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13762: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13765: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13768: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_ipc_shmat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13779: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test "$ac_cv_lib_ipc_shmat" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:13797: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 13805 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (void); +int +main (void) +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:13824: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13827: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:13830: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13833: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:13844: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test "$ac_cv_lib_ICE_IceConnectionNumber" = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + +cf_x_athena=${cf_x_athena:-Xaw} + +echo "$as_me:13856: checking if you want to link with Xaw 3d library" >&5 +echo $ECHO_N "checking if you want to link with Xaw 3d library... $ECHO_C" >&6 +withval= + +# Check whether --with-Xaw3d or --without-Xaw3d was given. +if test "${with_Xaw3d+set}" = set; then + withval="$with_Xaw3d" + +fi; +if test "$withval" = yes ; then + cf_x_athena=Xaw3d + echo "$as_me:13867: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:13870: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:13874: checking if you want to link with Xaw 3d xft library" >&5 +echo $ECHO_N "checking if you want to link with Xaw 3d xft library... $ECHO_C" >&6 +withval= + +# Check whether --with-Xaw3dxft or --without-Xaw3dxft was given. +if test "${with_Xaw3dxft+set}" = set; then + withval="$with_Xaw3dxft" + +fi; +if test "$withval" = yes ; then + cf_x_athena=Xaw3dxft + echo "$as_me:13885: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:13888: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:13892: checking if you want to link with neXT Athena library" >&5 +echo $ECHO_N "checking if you want to link with neXT Athena library... $ECHO_C" >&6 +withval= + +# Check whether --with-neXtaw or --without-neXtaw was given. +if test "${with_neXtaw+set}" = set; then + withval="$with_neXtaw" + +fi; +if test "$withval" = yes ; then + cf_x_athena=neXtaw + echo "$as_me:13903: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:13906: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:13910: checking if you want to link with Athena-Plus library" >&5 +echo $ECHO_N "checking if you want to link with Athena-Plus library... $ECHO_C" >&6 +withval= + +# Check whether --with-XawPlus or --without-XawPlus was given. +if test "${with_XawPlus+set}" = set; then + withval="$with_XawPlus" + +fi; +if test "$withval" = yes ; then + cf_x_athena=XawPlus + echo "$as_me:13921: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:13924: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +cf_x_athena_lib="" + +if test "$PKG_CONFIG" != none ; then + cf_athena_list= + test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6" + for cf_athena_pkg in \ + $cf_athena_list \ + ${cf_x_athena} \ + ${cf_x_athena}-devel \ + lib${cf_x_athena} \ + lib${cf_x_athena}-devel + do + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "$cf_athena_pkg"; then + test -n "$verbose" && echo " found package $cf_athena_pkg" 1>&6 + +echo "${as_me:-configure}:13944: testing found package $cf_athena_pkg ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "$cf_athena_pkg" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "$cf_athena_pkg" 2>/dev/null`" + test -n "$verbose" && echo " package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13950: testing package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package $cf_athena_pkg LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13954: testing package $cf_athena_pkg LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_x_athena_lib="$cf_pkgconfig_libs" + +cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&6 + +echo "${as_me:-configure}:14085: testing ..trimmed $LIBS ..." 1>&5 + + ;; + esac + done + +echo "$as_me:14091: checking for usable $cf_x_athena/Xmu package" >&5 +echo $ECHO_N "checking for usable $cf_x_athena/Xmu package... $ECHO_C" >&6 +if test "${cf_cv_xaw_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 14098 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ + +int check = XmuCompareISOLatin1("big", "small"); +(void)check; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:14116: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14119: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:14122: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14125: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xaw_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xaw_compat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:14135: result: $cf_cv_xaw_compat" >&5 +echo "${ECHO_T}$cf_cv_xaw_compat" >&6 + + if test "$cf_cv_xaw_compat" = no + then + # workaround for broken ".pc" files... + case "$cf_x_athena_lib" in + (*-lXmu*) + ;; + (*) + test -n "$verbose" && echo " work around broken package" 1>&6 + +echo "${as_me:-configure}:14147: testing work around broken package ..." 1>&5 + + cf_save_xmu="$LIBS" + cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^ *//' -e 's/ .*//'` + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xmu"; then + test -n "$verbose" && echo " found package xmu" 1>&6 + +echo "${as_me:-configure}:14155: testing found package xmu ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xmu" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "xmu" 2>/dev/null`" + test -n "$verbose" && echo " package xmu CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:14161: testing package xmu CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xmu LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:14165: testing package xmu LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + LIBS="$cf_save_xmu" + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:14285: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%$cf_first_lib %$cf_first_lib $cf_pkgconfig_libs %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:14290: testing ...after $LIBS ..." 1>&5 + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:14298: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%$cf_first_lib %$cf_first_lib -lXmu %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:14303: testing ...after $LIBS ..." 1>&5 + +fi + + for cf_trim_lib in Xmu Xt X11 + do + case "$LIBS" in + (*-l$cf_trim_lib\ *-l$cf_trim_lib*) + LIBS=`echo "$LIBS " | sed -e 's/ / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'` + test -n "$verbose" && echo " ..trimmed $LIBS" 1>&6 + +echo "${as_me:-configure}:14314: testing ..trimmed $LIBS ..." 1>&5 + + ;; + esac + done + + ;; + esac + fi + + break +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + : +fi + + done +fi + +if test -z "$cf_x_athena_lib" ; then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "Xext"; then + test -n "$verbose" && echo " found package Xext" 1>&6 + +echo "${as_me:-configure}:14339: testing found package Xext ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "Xext" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "Xext" 2>/dev/null`" + test -n "$verbose" && echo " package Xext CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:14345: testing package Xext CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package Xext LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:14349: testing package Xext LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + echo "$as_me:14470: checking for XextCreateExtension in -lXext" >&5 +echo $ECHO_N "checking for XextCreateExtension in -lXext... $ECHO_C" >&6 +if test "${ac_cv_lib_Xext_XextCreateExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 14478 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XextCreateExtension (void); +int +main (void) +{ +XextCreateExtension (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:14497: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14500: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:14503: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14506: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_Xext_XextCreateExtension=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_Xext_XextCreateExtension=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:14517: result: $ac_cv_lib_Xext_XextCreateExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_Xext_XextCreateExtension" >&6 +if test "$ac_cv_lib_Xext_XextCreateExtension" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lXext; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + +# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and +# in some cases has installed dummy files in the former, other cases replaced +# it with a link to the new location). This complicates the configure script. +# Check for that pitfall, and recover using pkg-config +# +# If none of these are set, the configuration is almost certainly broken. +if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}" +then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "x11"; then + test -n "$verbose" && echo " found package x11" 1>&6 + +echo "${as_me:-configure}:14553: testing found package x11 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "x11" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "x11" 2>/dev/null`" + test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:14559: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:14563: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:14683: WARNING: unable to find X11 library" >&5 +echo "$as_me: WARNING: unable to find X11 library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "ice"; then + test -n "$verbose" && echo " found package ice" 1>&6 + +echo "${as_me:-configure}:14690: testing found package ice ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "ice" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "ice" 2>/dev/null`" + test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:14696: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:14700: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:14820: WARNING: unable to find ICE library" >&5 +echo "$as_me: WARNING: unable to find ICE library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "sm"; then + test -n "$verbose" && echo " found package sm" 1>&6 + +echo "${as_me:-configure}:14827: testing found package sm ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "sm" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "sm" 2>/dev/null`" + test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:14833: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:14837: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:14957: WARNING: unable to find SM library" >&5 +echo "$as_me: WARNING: unable to find SM library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xt"; then + test -n "$verbose" && echo " found package xt" 1>&6 + +echo "${as_me:-configure}:14964: testing found package xt ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xt" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "xt" 2>/dev/null`" + test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:14970: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:14974: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:15094: WARNING: unable to find Xt library" >&5 +echo "$as_me: WARNING: unable to find Xt library" >&2;} +fi + +else + LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS" +fi + +cf_have_X_LIBS=no + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "xt"; then + test -n "$verbose" && echo " found package xt" 1>&6 + +echo "${as_me:-configure}:15107: testing found package xt ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "xt" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "xt" 2>/dev/null`" + test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:15113: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:15117: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + case "x$LIBS" in + (*-lX11*) + ;; + (*) +# we have an "xt" package, but it may omit Xt's dependency on X11 +echo "$as_me:15238: checking for usable X dependency" >&5 +echo $ECHO_N "checking for usable X dependency... $ECHO_C" >&6 +if test "${cf_cv_xt_x11_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 15245 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ + + int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0); + int rc2 = XClearWindow((Display*) 0, (Window) 0); + int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0); + int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15265: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15268: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15271: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15274: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xt_x11_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xt_x11_compat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:15284: result: $cf_cv_xt_x11_compat" >&5 +echo "${ECHO_T}$cf_cv_xt_x11_compat" >&6 + if test "$cf_cv_xt_x11_compat" = no + then + test -n "$verbose" && echo " work around broken X11 dependency" 1>&6 + +echo "${as_me:-configure}:15290: testing work around broken X11 dependency ..." 1>&5 + + # 2010/11/19 - good enough until a working Xt on Xcb is delivered. + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "x11"; then + test -n "$verbose" && echo " found package x11" 1>&6 + +echo "${as_me:-configure}:15297: testing found package x11 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "x11" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "x11" 2>/dev/null`" + test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:15303: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:15307: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:15430: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt -lX11 %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:15435: testing ...after $LIBS ..." 1>&5 + +fi + + fi + ;; + esac + +echo "$as_me:15443: checking for usable X Toolkit package" >&5 +echo $ECHO_N "checking for usable X Toolkit package... $ECHO_C" >&6 +if test "${cf_cv_xt_ice_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 15450 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ +int num = IceConnectionNumber(0); (void) num + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15466: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15469: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15472: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15475: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_xt_ice_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_xt_ice_compat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:15485: result: $cf_cv_xt_ice_compat" >&5 +echo "${ECHO_T}$cf_cv_xt_ice_compat" >&6 + + if test "$cf_cv_xt_ice_compat" = no + then + # workaround for broken ".pc" files used for X Toolkit. + case "x$X_PRE_LIBS" in + (*-lICE*) + case "x$LIBS" in + (*-lICE*) + ;; + (*) + test -n "$verbose" && echo " work around broken ICE dependency" 1>&6 + +echo "${as_me:-configure}:15499: testing work around broken ICE dependency ..." 1>&5 + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "ice"; then + test -n "$verbose" && echo " found package ice" 1>&6 + +echo "${as_me:-configure}:15504: testing found package ice ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "ice" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "ice" 2>/dev/null`" + test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:15510: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:15514: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists "sm"; then + test -n "$verbose" && echo " found package sm" 1>&6 + +echo "${as_me:-configure}:15633: testing found package sm ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags "sm" 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs "sm" 2>/dev/null`" + test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:15639: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:15643: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + : +fi + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:15772: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt $X_PRE_LIBS %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:15777: testing ...after $LIBS ..." 1>&5 + +fi + + ;; + esac + ;; + esac + fi + + cf_have_X_LIBS=yes + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + LDFLAGS="$X_LIBS $LDFLAGS" + +test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6 + +echo "${as_me:-configure}:15797: testing checking additions to CFLAGS ..." 1>&5 + +cf_check_cflags="$CFLAGS" +cf_check_cppflags="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $X_CFLAGS +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:15882: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:15892: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:15902: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +if test "x$cf_check_cflags" != "x$CFLAGS" ; then +cat >"conftest.$ac_ext" <<_ACEOF +#line 15911 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello world"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15923: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15926: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15929: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15932: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6 + +echo "${as_me:-configure}:15940: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5 + + if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then + test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:15945: testing but keeping change to \$CPPFLAGS ..." 1>&5 + + fi + CFLAGS="$cf_check_cflags" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + + echo "$as_me:15953: checking for XOpenDisplay" >&5 +echo $ECHO_N "checking for XOpenDisplay... $ECHO_C" >&6 +if test "${ac_cv_func_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 15959 "configure" +#include "confdefs.h" +#define XOpenDisplay autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XOpenDisplay + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_XOpenDisplay) || defined (__stub___XOpenDisplay) +#error found stub for XOpenDisplay +#endif + + return XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:15990: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15993: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:15996: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15999: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_XOpenDisplay=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:16009: result: $ac_cv_func_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_func_XOpenDisplay" >&6 +if test "$ac_cv_func_XOpenDisplay" = yes; then + : +else + + echo "$as_me:16015: checking for XOpenDisplay in -lX11" >&5 +echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6 +if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lX11 $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 16023 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16042: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16045: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16048: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16051: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_X11_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_X11_XOpenDisplay=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:16062: result: $ac_cv_lib_X11_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6 +if test "$ac_cv_lib_X11_XOpenDisplay" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + + echo "$as_me:16086: checking for XtAppInitialize" >&5 +echo $ECHO_N "checking for XtAppInitialize... $ECHO_C" >&6 +if test "${ac_cv_func_XtAppInitialize+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 16092 "configure" +#include "confdefs.h" +#define XtAppInitialize autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XtAppInitialize + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XtAppInitialize (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_XtAppInitialize) || defined (__stub___XtAppInitialize) +#error found stub for XtAppInitialize +#endif + + return XtAppInitialize (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16123: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16126: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16129: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16132: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_XtAppInitialize=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_XtAppInitialize=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:16142: result: $ac_cv_func_XtAppInitialize" >&5 +echo "${ECHO_T}$ac_cv_func_XtAppInitialize" >&6 +if test "$ac_cv_func_XtAppInitialize" = yes; then + : +else + + echo "$as_me:16148: checking for XtAppInitialize in -lXt" >&5 +echo $ECHO_N "checking for XtAppInitialize in -lXt... $ECHO_C" >&6 +if test "${ac_cv_lib_Xt_XtAppInitialize+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXt $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 16156 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XtAppInitialize (void); +int +main (void) +{ +XtAppInitialize (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16175: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16178: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16181: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16184: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_Xt_XtAppInitialize=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_Xt_XtAppInitialize=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:16195: result: $ac_cv_lib_Xt_XtAppInitialize" >&5 +echo "${ECHO_T}$ac_cv_lib_Xt_XtAppInitialize" >&6 +if test "$ac_cv_lib_Xt_XtAppInitialize" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBXT 1 +EOF + + cf_have_X_LIBS=Xt + LIBS="-lXt $LIBS" +fi + +fi + +fi + +if test "$cf_have_X_LIBS" = no ; then + { echo "$as_me:16212: WARNING: Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile." >&5 +echo "$as_me: WARNING: Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile." >&2;} +fi + +cf_x_athena_root=$cf_x_athena +cf_x_athena_inc="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + if test -z "$cf_x_athena_inc" ; then + +cf_save_LIBS_CF_X_ATHENA_CPPFLAGS="$LIBS" +cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS="$CFLAGS" +cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + + cf_test=X11/$cf_x_athena_root/SimpleMenu.h + if test "$cf_path" != default ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_path/include" + + echo "$as_me:16253: checking for $cf_test in $cf_path" >&5 +echo $ECHO_N "checking for $cf_test in $cf_path... $ECHO_C" >&6 + else + echo "$as_me:16256: checking for $cf_test" >&5 +echo $ECHO_N "checking for $cf_test... $ECHO_C" >&6 + fi + cat >"conftest.$ac_ext" <<_ACEOF +#line 16260 "configure" +#include "confdefs.h" + +#include +#include <$cf_test> +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:16274: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16277: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:16280: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16283: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:16292: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +LIBS="$cf_save_LIBS_CF_X_ATHENA_CPPFLAGS" +CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS" +CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS" + + if test "$cf_result" = yes ; then + test "$cf_path" = default && cf_x_athena_inc=default + test "$cf_path" != default && cf_x_athena_inc="$cf_path/include" + break + fi + fi +done + +if test -z "$cf_x_athena_inc" ; then + { echo "$as_me:16308: WARNING: Unable to find Athena header files" >&5 +echo "$as_me: WARNING: Unable to find Athena header files" >&2;} +elif test "$cf_x_athena_inc" != default ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_x_athena_inc" + +fi + +cf_x_athena_root=$cf_x_athena +cf_x_athena_lib="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + for cf_lib in \ + ${cf_x_athena_root} \ + ${cf_x_athena_root}7 \ + ${cf_x_athena_root}6 + do + for cf_libs in \ + "-l$cf_lib -lXmu" \ + "-l$cf_lib -lXpm -lXmu" \ + "-l${cf_lib}_s -lXmu_s" + do + test -n "$cf_x_athena_lib" && break + +cf_save_LIBS_CF_X_ATHENA_LIBS="$LIBS" +cf_save_CFLAGS_CF_X_ATHENA_LIBS="$CFLAGS" +cf_save_CPPFLAGS_CF_X_ATHENA_LIBS="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + + cf_test=XawSimpleMenuAddGlobalActions + test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + echo "$as_me:16373: checking for $cf_test in $cf_libs" >&5 +echo $ECHO_N "checking for $cf_test in $cf_libs... $ECHO_C" >&6 + cat >"conftest.$ac_ext" <<_ACEOF +#line 16376 "configure" +#include "confdefs.h" + +$ac_includes_default +#include +#include + +int +main (void) +{ + +$cf_test((XtAppContext) 0) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16393: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16396: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16399: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16402: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:16411: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +LIBS="$cf_save_LIBS_CF_X_ATHENA_LIBS" +CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_LIBS" +CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_LIBS" + + if test "$cf_result" = yes ; then + cf_x_athena_lib="$cf_libs" + break + fi + done # cf_libs + test -n "$cf_x_athena_lib" && break + done # cf_lib +done + +if test -z "$cf_x_athena_lib" ; then + { { echo "$as_me:16428: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&5 +echo "$as_me: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&2;} + { (exit 1); exit 1; }; } +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_x_athena_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_XCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$XCURSES_CONFIG"; then + ac_cv_prog_XCURSES_CONFIG="$XCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_XCURSES_CONFIG="$ac_tool_prefix$ac_prog" +echo "$as_me:16477: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +XCURSES_CONFIG=$ac_cv_prog_XCURSES_CONFIG +if test -n "$XCURSES_CONFIG"; then + echo "$as_me:16485: result: $XCURSES_CONFIG" >&5 +echo "${ECHO_T}$XCURSES_CONFIG" >&6 +else + echo "$as_me:16488: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$XCURSES_CONFIG" && break + done +fi +if test -z "$XCURSES_CONFIG"; then + ac_ct_XCURSES_CONFIG=$XCURSES_CONFIG + for ac_prog in xcurses-config +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:16501: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_XCURSES_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_XCURSES_CONFIG"; then + ac_cv_prog_ac_ct_XCURSES_CONFIG="$ac_ct_XCURSES_CONFIG" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_XCURSES_CONFIG="$ac_prog" +echo "$as_me:16516: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_XCURSES_CONFIG=$ac_cv_prog_ac_ct_XCURSES_CONFIG +if test -n "$ac_ct_XCURSES_CONFIG"; then + echo "$as_me:16524: result: $ac_ct_XCURSES_CONFIG" >&5 +echo "${ECHO_T}$ac_ct_XCURSES_CONFIG" >&6 +else + echo "$as_me:16527: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_XCURSES_CONFIG" && break +done +test -n "$ac_ct_XCURSES_CONFIG" || ac_ct_XCURSES_CONFIG="none" + + XCURSES_CONFIG=$ac_ct_XCURSES_CONFIG +fi + +if test "$XCURSES_CONFIG" != none ; then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in `$XCURSES_CONFIG --cflags` +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$XCURSES_CONFIG --libs`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cf_cv_lib_XCurses=yes + +else + +LDFLAGS="$LDFLAGS $X_LIBS" + +test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6 + +echo "${as_me:-configure}:16662: testing checking additions to CFLAGS ..." 1>&5 + +cf_check_cflags="$CFLAGS" +cf_check_cppflags="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $X_CFLAGS +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:16747: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:16757: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:16767: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +if test "x$cf_check_cflags" != "x$CFLAGS" ; then +cat >"conftest.$ac_ext" <<_ACEOF +#line 16776 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello world"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16788: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16791: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16794: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16797: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6 + +echo "${as_me:-configure}:16805: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5 + + if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then + test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:16810: testing but keeping change to \$CPPFLAGS ..." 1>&5 + + fi + CFLAGS="$cf_check_cflags" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +echo "$as_me:16818: checking for XOpenDisplay in -lX11" >&5 +echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6 +if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lX11 $X_PRE_LIBS $LIBS $X_EXTRA_LIBS $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 16826 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16845: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16848: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16851: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16854: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_X11_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_X11_XOpenDisplay=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:16865: result: $ac_cv_lib_X11_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6 +if test "$ac_cv_lib_X11_XOpenDisplay" = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +echo "$as_me:16887: checking for XCurses library" >&5 +echo $ECHO_N "checking for XCurses library... $ECHO_C" >&6 +if test "${cf_cv_lib_XCurses+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lXCurses; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cat >"conftest.$ac_ext" <<_ACEOF +#line 16910 "configure" +#include "confdefs.h" + +#include +char *XCursesProgramName = "test"; + +int +main (void) +{ +XCursesExit(); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:16925: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16928: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:16931: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16934: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_lib_XCurses=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_lib_XCurses=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:16945: result: $cf_cv_lib_XCurses" >&5 +echo "${ECHO_T}$cf_cv_lib_XCurses" >&6 + +fi + +if test "$cf_cv_lib_XCurses" = yes ; then + +cat >>confdefs.h <<\EOF +#define UNIX 1 +EOF + +cat >>confdefs.h <<\EOF +#define XCURSES 1 +EOF + + echo "$as_me:16960: checking for xcurses.h" >&5 +echo $ECHO_N "checking for xcurses.h... $ECHO_C" >&6 +if test "${ac_cv_header_xcurses_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 16966 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:16970: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:16976: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_xcurses_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_xcurses_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:16995: result: $ac_cv_header_xcurses_h" >&5 +echo "${ECHO_T}$ac_cv_header_xcurses_h" >&6 +if test "$ac_cv_header_xcurses_h" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_XCURSES 1 +EOF + +fi + +else + { { echo "$as_me:17006: error: Cannot link with XCurses" >&5 +echo "$as_me: error: Cannot link with XCurses" >&2;} + { (exit 1); exit 1; }; } +fi + + ;; +(*) + { { echo "$as_me:17013: error: unexpected screen-value: $cf_cv_screen" >&5 +echo "$as_me: error: unexpected screen-value: $cf_cv_screen" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +echo "$as_me:17019: checking for _nc_init_pthreads" >&5 +echo $ECHO_N "checking for _nc_init_pthreads... $ECHO_C" >&6 +if test "${ac_cv_func__nc_init_pthreads+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17025 "configure" +#include "confdefs.h" +#define _nc_init_pthreads autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef _nc_init_pthreads + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char _nc_init_pthreads (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub__nc_init_pthreads) || defined (__stub____nc_init_pthreads) +#error found stub for _nc_init_pthreads +#endif + + return _nc_init_pthreads (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17056: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17059: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17062: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17065: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func__nc_init_pthreads=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func__nc_init_pthreads=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:17075: result: $ac_cv_func__nc_init_pthreads" >&5 +echo "${ECHO_T}$ac_cv_func__nc_init_pthreads" >&6 +if test "$ac_cv_func__nc_init_pthreads" = yes; then + cf_cv_ncurses_pthreads=yes +else + cf_cv_ncurses_pthreads=no +fi + +if test "$cf_cv_ncurses_pthreads" = yes +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpthread; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +case $cf_cv_screen in +(ncurses*) + cf_cv_libtype=`echo "$cf_cv_screen" | sed -e 's/^ncurses//'` + ;; +esac + +echo "$as_me:17110: checking for X11 rgb file" >&5 +echo $ECHO_N "checking for X11 rgb file... $ECHO_C" >&6 + +# Check whether --with-x11-rgb or --without-x11-rgb was given. +if test "${with_x11_rgb+set}" = set; then + withval="$with_x11_rgb" + RGB_PATH=$withval +else + RGB_PATH=auto +fi; + +if test "x$RGB_PATH" = xauto +then + RGB_PATH='${exec_prefix}/lib/X11/rgb.txt' + for cf_path in \ + /opt/local/share/X11/rgb.txt \ + /opt/X11/share/X11/rgb.txt \ + /usr/share/X11/rgb.txt \ + /usr/X11/share/X11/rgb.txt \ + /usr/X11/lib/X11/rgb.txt \ + /usr/lib/X11/rgb.txt \ + /etc/X11/rgb.txt \ + /usr/pkg/lib/X11/rgb.txt \ + /usr/X11R7/lib/X11/rgb.txt \ + /usr/X11R6/lib/X11/rgb.txt \ + /usr/X11R5/lib/X11/rgb.txt \ + /usr/X11R4/lib/X11/rgb.txt \ + /usr/local/lib/X11/rgb.txt \ + /usr/local/share/X11/rgb.txt \ + /usr/lib64/X11/rgb.txt + do + if test -f "$cf_path" ; then + RGB_PATH="$cf_path" + break + fi + done +else + cf_path=$RGB_PATH + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case "x$cf_path" in +(x\$\(*\)*|x\'*\'*) + ;; +(x.|x$GLOB_FULLPATH_POSIX|x$GLOB_FULLPATH_OTHER) + ;; +(x\$\{*prefix\}*|x\$\{*dir\}*) + eval cf_path="$cf_path" + case "x$cf_path" in + (xNONE/*) + cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(xno|xNONE/*) + cf_path=`echo "$cf_path" | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:17172: error: expected a pathname, not \"$cf_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi + +echo "$as_me:17180: result: $RGB_PATH" >&5 +echo "${ECHO_T}$RGB_PATH" >&6 + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for desired basename for form library... $ECHO_C" >&6 + +# Check whether --with-form-libname or --without-form-libname was given. +if test "${with_form_libname+set}" = set; then + withval="$with_form_libname" + with_lib_basename=$withval +else + with_lib_basename=form +fi; +FORM_NAME="$with_lib_basename" + +case "x$FORM_NAME" in +(x|xno|xnone|xyes) + FORM_NAME=form + ;; +(*) + ;; +esac + +echo "$as_me:17241: result: $FORM_NAME" >&5 +echo "${ECHO_T}$FORM_NAME" >&6 + +echo "$as_me:17244: checking for desired basename for menu library" >&5 +echo $ECHO_N "checking for desired basename for menu library... $ECHO_C" >&6 + +# Check whether --with-menu-libname or --without-menu-libname was given. +if test "${with_menu_libname+set}" = set; then + withval="$with_menu_libname" + with_lib_basename=$withval +else + with_lib_basename=menu +fi; +MENU_NAME="$with_lib_basename" + +case "x$MENU_NAME" in +(x|xno|xnone|xyes) + MENU_NAME=menu + ;; +(*) + ;; +esac + +echo "$as_me:17264: result: $MENU_NAME" >&5 +echo "${ECHO_T}$MENU_NAME" >&6 + +echo "$as_me:17267: checking for desired basename for panel library" >&5 +echo $ECHO_N "checking for desired basename for panel library... $ECHO_C" >&6 + +# Check whether --with-panel-libname or --without-panel-libname was given. +if test "${with_panel_libname+set}" = set; then + withval="$with_panel_libname" + with_lib_basename=$withval +else + with_lib_basename=panel +fi; +PANEL_NAME="$with_lib_basename" + +case "x$PANEL_NAME" in +(x|xno|xnone|xyes) + PANEL_NAME=panel + ;; +(*) + ;; +esac + +echo "$as_me:17287: result: $PANEL_NAME" >&5 +echo "${ECHO_T}$PANEL_NAME" >&6 + +echo "$as_me:17290: checking if you want to check for panel functions" >&5 +echo $ECHO_N "checking if you want to check for panel functions... $ECHO_C" >&6 + +# Check whether --enable-panel or --disable-panel was given. +if test "${enable_panel+set}" = set; then + enableval="$enable_panel" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_enable_panel=no + else + cf_enable_panel=$cf_default_panel + fi +else + enableval=yes + cf_enable_panel=$cf_default_panel + +fi; +echo "$as_me:17307: result: $cf_enable_panel" >&5 +echo "${ECHO_T}$cf_enable_panel" >&6 +if test $cf_enable_panel = yes +then + +cf_have_curses_lib=no + +: ${NCURSES_CONFIG_PKG:=none} +if test "x${NCURSES_CONFIG_PKG}" = xnone; then + : +elif test "x${PKG_CONFIG:=none}" != xnone; then + echo "$as_me:17318: checking pkg-config for $PANEL_NAME$cf_cv_libtype" >&5 +echo $ECHO_N "checking pkg-config for $PANEL_NAME$cf_cv_libtype... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists "$PANEL_NAME$cf_cv_libtype" ; then + echo "$as_me:17321: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:17324: checking if the $PANEL_NAME$cf_cv_libtype package files work" >&5 +echo $ECHO_N "checking if the $PANEL_NAME$cf_cv_libtype package files work... $ECHO_C" >&6 + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + +for cf_add_cflags in `$PKG_CONFIG --cflags "$PANEL_NAME$cf_cv_libtype"` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$PKG_CONFIG --libs "$PANEL_NAME$cf_cv_libtype"`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 17474 "configure" +#include "confdefs.h" +#include <$PANEL_NAME.h> +int +main (void) +{ +(void) new_panel ( 0 ); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17486: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17489: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17492: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17495: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_curses_lib=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17501 "configure" +#include "confdefs.h" +#include <$PANEL_NAME.h> + int main(void) + { (void) new_panel ( 0 ); return 0; } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:17508: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17511: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:17513: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17516: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_curses_lib=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_curses_lib=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_curses_lib=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:17533: result: $cf_have_curses_lib" >&5 +echo "${ECHO_T}$cf_have_curses_lib" >&6 + test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes + if test "$cf_have_curses_lib" = "yes" + then + +cf_upper=`echo "have_lib$PANEL_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for new_panel in -l$PANEL_NAME$cf_cv_libtype... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$PANEL_NAME$cf_cv_libtype $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 17562 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char new_panel (void); +int +main (void) +{ +new_panel (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17581: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17584: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17587: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17590: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Lib=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:17601: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then + +cf_upper=`echo "have_lib$PANEL_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$PANEL_NAME$cf_cv_libtype; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to check for menu functions... $ECHO_C" >&6 + +# Check whether --enable-menu or --disable-menu was given. +if test "${enable_menu+set}" = set; then + enableval="$enable_menu" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_enable_menu=no + else + cf_enable_menu=$cf_default_menu + fi +else + enableval=yes + cf_enable_menu=$cf_default_menu + +fi; +echo "$as_me:17651: result: $cf_enable_menu" >&5 +echo "${ECHO_T}$cf_enable_menu" >&6 +if test $cf_enable_menu = yes +then + case $cf_cv_screen in + (ncurses*) + ;; + (curses*) + +echo "$as_me:17660: checking for NetBSD menu.h" >&5 +echo $ECHO_N "checking for NetBSD menu.h... $ECHO_C" >&6 +if test "${cf_cv_netbsd_menu_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 17667 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +#include + +int +main (void) +{ + + MENU *menu; + int y = menu->max_item_width; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:17685: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:17688: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:17691: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17694: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_netbsd_menu_h=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_netbsd_menu_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:17706: result: $cf_cv_netbsd_menu_h" >&5 +echo "${ECHO_T}$cf_cv_netbsd_menu_h" >&6 + +test "$cf_cv_netbsd_menu_h" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_NETBSD_MENU_H 1 +EOF + + ;; + esac + +cf_have_curses_lib=no + +: ${NCURSES_CONFIG_PKG:=none} +if test "x${NCURSES_CONFIG_PKG}" = xnone; then + : +elif test "x${PKG_CONFIG:=none}" != xnone; then + echo "$as_me:17723: checking pkg-config for $MENU_NAME$cf_cv_libtype" >&5 +echo $ECHO_N "checking pkg-config for $MENU_NAME$cf_cv_libtype... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists "$MENU_NAME$cf_cv_libtype" ; then + echo "$as_me:17726: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:17729: checking if the $MENU_NAME$cf_cv_libtype package files work" >&5 +echo $ECHO_N "checking if the $MENU_NAME$cf_cv_libtype package files work... $ECHO_C" >&6 + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + +for cf_add_cflags in `$PKG_CONFIG --cflags "$MENU_NAME$cf_cv_libtype"` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$PKG_CONFIG --libs "$MENU_NAME$cf_cv_libtype"`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 17879 "configure" +#include "confdefs.h" +#include <$MENU_NAME.h> +int +main (void) +{ +(void) menu_driver ( 0,0 ); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17891: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17894: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17897: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17900: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_curses_lib=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 17906 "configure" +#include "confdefs.h" +#include <$MENU_NAME.h> + int main(void) + { (void) menu_driver ( 0,0 ); return 0; } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:17913: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17916: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:17918: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17921: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_curses_lib=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_curses_lib=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_curses_lib=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:17938: result: $cf_have_curses_lib" >&5 +echo "${ECHO_T}$cf_have_curses_lib" >&6 + test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes + if test "$cf_have_curses_lib" = "yes" + then + +cf_upper=`echo "have_lib$MENU_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for menu_driver in -l$MENU_NAME$cf_cv_libtype... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$MENU_NAME$cf_cv_libtype $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 17967 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char menu_driver (void); +int +main (void) +{ +menu_driver (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:17986: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:17989: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:17992: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:17995: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Lib=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:18006: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then + +cf_upper=`echo "have_lib$MENU_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$MENU_NAME$cf_cv_libtype; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to check for form functions... $ECHO_C" >&6 + +# Check whether --enable-form or --disable-form was given. +if test "${enable_form+set}" = set; then + enableval="$enable_form" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_enable_form=no + else + cf_enable_form=$cf_default_form + fi +else + enableval=yes + cf_enable_form=$cf_default_form + +fi; +echo "$as_me:18056: result: $cf_enable_form" >&5 +echo "${ECHO_T}$cf_enable_form" >&6 +if test $cf_enable_form = yes +then + case $cf_cv_screen in + (ncurses*) + ;; + (curses*) + +echo "$as_me:18065: checking for NetBSD form.h" >&5 +echo $ECHO_N "checking for NetBSD form.h... $ECHO_C" >&6 +if test "${cf_cv_netbsd_form_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 18072 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +#include + +int +main (void) +{ + + FORM *form; + int y = current_field(form)->cursor_ypos; + int x = current_field(form)->cursor_xpos; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:18091: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18094: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:18097: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18100: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_netbsd_form_h=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_netbsd_form_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:18112: result: $cf_cv_netbsd_form_h" >&5 +echo "${ECHO_T}$cf_cv_netbsd_form_h" >&6 + +test "$cf_cv_netbsd_form_h" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_NETBSD_FORM_H 1 +EOF + + ;; + esac + +cf_have_curses_lib=no + +: ${NCURSES_CONFIG_PKG:=none} +if test "x${NCURSES_CONFIG_PKG}" = xnone; then + : +elif test "x${PKG_CONFIG:=none}" != xnone; then + echo "$as_me:18129: checking pkg-config for $FORM_NAME$cf_cv_libtype" >&5 +echo $ECHO_N "checking pkg-config for $FORM_NAME$cf_cv_libtype... $ECHO_C" >&6 + if "$PKG_CONFIG" --exists "$FORM_NAME$cf_cv_libtype" ; then + echo "$as_me:18132: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + + echo "$as_me:18135: checking if the $FORM_NAME$cf_cv_libtype package files work" >&5 +echo $ECHO_N "checking if the $FORM_NAME$cf_cv_libtype package files work... $ECHO_C" >&6 + + cf_save_CFLAGS="$CFLAGS" + cf_save_CPPFLAGS="$CPPFLAGS" + cf_save_LIBS="$LIBS" + +for cf_add_cflags in `$PKG_CONFIG --cflags "$FORM_NAME$cf_cv_libtype"` +do + case "x$cf_add_cflags" in + (x-[DU]*) + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CFLAGS" != "$cf_old_cflag" || break + + CFLAGS="$cf_old_cflag" +done + +cf_tmp_cflag=`echo "x$cf_add_cflags" | sed -e 's/^.//' -e 's/=.*//'` +while true +do + cf_old_cflag=`echo "x$CPPFLAGS" | sed -e 's/^.//' -e 's/[ ][ ]*-/ -/g' -e "s%$cf_tmp_cflag\\(=[^ ][^ ]*\\)\?%%" -e 's/^[ ]*//' -e 's%[ ][ ]*-D% -D%g' -e 's%[ ][ ]*-I% -I%g'` + test "$CPPFLAGS" != "$cf_old_cflag" || break + + CPPFLAGS="$cf_old_cflag" +done + + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_add_cflags +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +done + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in `$PKG_CONFIG --libs "$FORM_NAME$cf_cv_libtype"`; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 18285 "configure" +#include "confdefs.h" +#include <$FORM_NAME.h> +int +main (void) +{ +(void) form_driver ( 0,0 ); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18297: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18300: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18303: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18306: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + if test "$cross_compiling" = yes; then + cf_have_curses_lib=maybe +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18312 "configure" +#include "confdefs.h" +#include <$FORM_NAME.h> + int main(void) + { (void) form_driver ( 0,0 ); return 0; } +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:18319: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18322: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:18324: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18327: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_have_curses_lib=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_curses_lib=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_have_curses_lib=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + echo "$as_me:18344: result: $cf_have_curses_lib" >&5 +echo "${ECHO_T}$cf_have_curses_lib" >&6 + test "$cf_have_curses_lib" = maybe && cf_have_curses_lib=yes + if test "$cf_have_curses_lib" = "yes" + then + +cf_upper=`echo "have_lib$FORM_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for form_driver in -l$FORM_NAME$cf_cv_libtype... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$FORM_NAME$cf_cv_libtype $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 18373 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char form_driver (void); +int +main (void) +{ +form_driver (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18392: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18395: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18398: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18401: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_Lib=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:18412: result: `eval echo '${'"$as_ac_Lib"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Lib"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Lib"'}'`" = yes; then + +cf_upper=`echo "have_lib$FORM_NAME" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$FORM_NAME$cf_cv_libtype; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18456 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:18460: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:18466: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:18485: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18501 "configure" +#include "confdefs.h" +#include +#include +#include + +int +main (void) +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:18517: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18520: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:18523: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18526: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_header_time=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:18536: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +for ac_header in \ +locale.h \ +math.h \ +stdarg.h \ +sys/ioctl.h \ +sys/select.h \ +sys/time.h \ +termios.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:18557: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18563 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:18567: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:18573: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:18592: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18611 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:18615: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:18621: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:18640: result: `eval echo '${'"$as_ac_Header"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_Header"'}'`" >&6 +if test "`eval echo '${'"$as_ac_Header"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for header declaring getopt variables... $ECHO_C" >&6 +if test "${cf_cv_getopt_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_getopt_header=none +for cf_header in stdio.h stdlib.h unistd.h getopt.h +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 18660 "configure" +#include "confdefs.h" + +#include <$cf_header> +int +main (void) +{ +int x = optind; char *y = optarg; (void)x; (void)y + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:18673: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:18676: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:18679: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18682: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_getopt_header=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:18694: result: $cf_cv_getopt_header" >&5 +echo "${ECHO_T}$cf_cv_getopt_header" >&6 +if test "$cf_cv_getopt_header" != none ; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETOPT_HEADER 1 +EOF + +fi +if test "$cf_cv_getopt_header" = getopt.h ; then + +cat >>confdefs.h <<\EOF +#define NEED_GETOPT_H 1 +EOF + +fi + +cf_save_libs="$LIBS" +echo "$as_me:18712: checking for clock_gettime" >&5 +echo $ECHO_N "checking for clock_gettime... $ECHO_C" >&6 +if test "${ac_cv_func_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18718 "configure" +#include "confdefs.h" +#define clock_gettime autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef clock_gettime + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char clock_gettime (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_clock_gettime) || defined (__stub___clock_gettime) +#error found stub for clock_gettime +#endif + + return clock_gettime (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18749: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18752: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18755: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18758: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:18768: result: $ac_cv_func_clock_gettime" >&5 +echo "${ECHO_T}$ac_cv_func_clock_gettime" >&6 +if test "$ac_cv_func_clock_gettime" = yes; then + cf_cv_test_clock_gettime=yes +else + echo "$as_me:18773: checking for clock_gettime in -lrt" >&5 +echo $ECHO_N "checking for clock_gettime in -lrt... $ECHO_C" >&6 +if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 18781 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char clock_gettime (void); +int +main (void) +{ +clock_gettime (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18800: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18803: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18806: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18809: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_rt_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_rt_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:18820: result: $ac_cv_lib_rt_clock_gettime" >&5 +echo "${ECHO_T}$ac_cv_lib_rt_clock_gettime" >&6 +if test "$ac_cv_lib_rt_clock_gettime" = yes; then + LIBS="-lrt $LIBS" + cf_cv_test_clock_gettime=yes +else + cf_cv_test_clock_gettime=no +fi + +fi + +if test "$cf_cv_test_clock_gettime" = yes ; then +echo "$as_me:18832: checking if clock_gettime links" >&5 +echo $ECHO_N "checking if clock_gettime links... $ECHO_C" >&6 +if test "${cf_cv_func_clock_gettime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 18839 "configure" +#include "confdefs.h" + +$ac_includes_default +#include + +int +main (void) +{ +struct timespec ts; + int rc = clock_gettime(CLOCK_REALTIME, &ts) + + clock_gettime(CLOCK_MONOTONIC, &ts); + (void) rc; (void)ts + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18857: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18860: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18863: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18866: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_clock_gettime=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_clock_gettime=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:18877: result: $cf_cv_func_clock_gettime" >&5 +echo "${ECHO_T}$cf_cv_func_clock_gettime" >&6 +else + cf_cv_func_clock_gettime=no +fi + +if test "$cf_cv_func_clock_gettime" = yes +then + +cat >>confdefs.h <<\EOF +#define HAVE_CLOCK_GETTIME 1 +EOF + +else +echo "$as_me:18891: checking for gettimeofday" >&5 +echo $ECHO_N "checking for gettimeofday... $ECHO_C" >&6 +if test "${ac_cv_func_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 18897 "configure" +#include "confdefs.h" +#define gettimeofday autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef gettimeofday + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gettimeofday) || defined (__stub___gettimeofday) +#error found stub for gettimeofday +#endif + + return gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18928: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18931: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18934: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18937: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_gettimeofday=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:18947: result: $ac_cv_func_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_func_gettimeofday" >&6 +if test "$ac_cv_func_gettimeofday" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + +else + +echo "$as_me:18957: checking for gettimeofday in -lbsd" >&5 +echo $ECHO_N "checking for gettimeofday in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gettimeofday+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 18965 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gettimeofday (void); +int +main (void) +{ +gettimeofday (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:18984: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18987: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:18990: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18993: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_gettimeofday=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_gettimeofday=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:19004: result: $ac_cv_lib_bsd_gettimeofday" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gettimeofday" >&6 +if test "$ac_cv_lib_bsd_gettimeofday" = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_GETTIMEOFDAY 1 +EOF + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lbsd; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi +fi + +for ac_func in \ +getopt \ +snprintf \ +strdup \ +strstr \ +tsearch \ + +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:19042: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 19048 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19079: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19082: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19085: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19088: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:19098: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if we can use termcap.h... $ECHO_C" >&6 +if test "${cf_cv_have_termcap_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 19116 "configure" +#include "confdefs.h" + +#include +#ifdef NCURSES_VERSION +#undef NCURSES_VERSION +#endif +#include +#ifndef NCURSES_VERSION +#error wrong header +#endif + +int +main (void) +{ +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19137: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19140: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19143: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19146: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_termcap_h=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_termcap_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:19156: result: $cf_cv_have_termcap_h" >&5 +echo "${ECHO_T}$cf_cv_have_termcap_h" >&6 +if test "x$cf_cv_have_termcap_h" = xyes +then + +cat >>confdefs.h <<\EOF +#define HAVE_TERMCAP_H 1 +EOF + +else +echo "$as_me:19166: checking if we can use ncurses/termcap.h" >&5 +echo $ECHO_N "checking if we can use ncurses/termcap.h... $ECHO_C" >&6 +if test "${cf_cv_have_ncurses_termcap_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 19173 "configure" +#include "confdefs.h" + +#include +#ifdef NCURSES_VERSION +#undef NCURSES_VERSION +#endif +#include +#ifndef NCURSES_VERSION +#error wrong header +#endif + +int +main (void) +{ +return 0; + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19194: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19197: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19200: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19203: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_have_ncurses_termcap_h=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_have_ncurses_termcap_h=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:19213: result: $cf_cv_have_ncurses_termcap_h" >&5 +echo "${ECHO_T}$cf_cv_have_ncurses_termcap_h" >&6 +test "x$cf_cv_have_ncurses_termcap_h" = xyes && +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERMCAP_H 1 +EOF + +fi + +if test "x$ac_cv_func_getopt" = xno; then + { { echo "$as_me:19223: error: getopt is required for building programs" >&5 +echo "$as_me: error: getopt is required for building programs" >&2;} + { (exit 1); exit 1; }; } +fi + +if test "$cf_enable_widec" = yes; then + +for ac_func in \ +mblen \ +mbrlen \ +mbrtowc \ +mbsrtowcs \ +mbstowcs \ +mbtowc \ +wcsrtombs \ +wcstombs \ + +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:19242: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 19248 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19279: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19282: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19285: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19288: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +eval "$as_ac_var=no" +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:19298: result: `eval echo '${'"$as_ac_var"'}'`" >&5 +echo "${ECHO_T}`eval echo '${'"$as_ac_var"'}'`" >&6 +if test "`eval echo '${'"$as_ac_var"'}'`" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking definition to turn on extended curses functions... $ECHO_C" >&6 +if test "${cf_cv_need_xopen_extension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_need_xopen_extension=unknown +cat >"conftest.$ac_ext" <<_ACEOF +#line 19318 "configure" +#include "confdefs.h" + +$ac_includes_default +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + +#if defined(NCURSES_VERSION_PATCH) +#if (NCURSES_VERSION_PATCH < 20100501) && (NCURSES_VERSION_PATCH >= 20100403) + #error disallow ncurses versions between 2020/04/03 and 2010/05/01 +#endif +#endif +#ifdef NCURSES_WIDECHAR +#error prefer to fall-through on the second checks +#endif + static char dummy[10]; + cchar_t check; + int check2 = curs_set((int)sizeof(check)); + long x = winnstr(stdscr, dummy, 5); + int x1, y1; + (void)check2; + getbegyx(stdscr, y1, x1); + (void)x; + (void)y1; + (void)x1; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19351: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19354: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19357: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19360: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_xopen_extension=none +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + for cf_try_xopen_extension in _XOPEN_SOURCE_EXTENDED NCURSES_WIDECHAR + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 19370 "configure" +#include "confdefs.h" + +#define $cf_try_xopen_extension 1 +$ac_includes_default +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + + static char dummy[10]; + cchar_t check; + int check2 = curs_set((int)sizeof(check)); + long x = winnstr(stdscr, dummy, 5); + int x1, y1; + getbegyx(stdscr, y1, x1); + (void)check2; + (void)x; + (void)y1; + (void)x1; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19396: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19399: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19402: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19405: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_need_xopen_extension=$cf_try_xopen_extension; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:19419: result: $cf_cv_need_xopen_extension" >&5 +echo "${ECHO_T}$cf_cv_need_xopen_extension" >&6 + +case "$cf_cv_need_xopen_extension" in +(*_*) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D$cf_cv_need_xopen_extension" + + ;; +esac + +echo "$as_me:19431: checking for term.h" >&5 +echo $ECHO_N "checking for term.h... $ECHO_C" >&6 +if test "${cf_cv_term_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# If we found , look for , but always look +# for if we do not find the variant. + +cf_header_list="term.h ncurses/term.h ncursesw/term.h" + +case "${cf_cv_ncurses_header:-curses.h}" in +(*/*) + cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`term.h + cf_header_list="$cf_header_item $cf_header_list" + ;; +esac + +for cf_header in $cf_header_list +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 19452 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +#include <${cf_header}> +int +main (void) +{ +WINDOW *x; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19466: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19469: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19472: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19475: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_term_header=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_term_header=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +case "$cf_cv_term_header" in +(no) + # If curses is ncurses, some packagers still mess it up by trying to make + # us use GNU termcap. This handles the most common case. + for cf_header in ncurses/term.h ncursesw/term.h + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 19494 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +#ifdef NCURSES_VERSION +#include <${cf_header}> +#else +#error expected NCURSES_VERSION to be defined +#endif +int +main (void) +{ +WINDOW *x; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19512: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19515: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19518: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19521: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_term_header=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_term_header=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done + ;; +esac + +fi +echo "$as_me:19536: result: $cf_cv_term_header" >&5 +echo "${ECHO_T}$cf_cv_term_header" >&6 + +case "$cf_cv_term_header" in +(term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_TERM_H 1 +EOF + + ;; +(ncurses/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_TERM_H 1 +EOF + + ;; +(ncursesw/term.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_TERM_H 1 +EOF + + ;; +esac + +echo "$as_me:19563: checking for unctrl.h" >&5 +echo $ECHO_N "checking for unctrl.h... $ECHO_C" >&6 +if test "${cf_cv_unctrl_header+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# If we found , look for , but always look +# for if we do not find the variant. + +cf_header_list="unctrl.h ncurses/unctrl.h ncursesw/unctrl.h" + +case "${cf_cv_ncurses_header:-curses.h}" in +(*/*) + cf_header_item=`echo "${cf_cv_ncurses_header:-curses.h}" | sed -e 's%\..*%%' -e 's%/.*%/%'`unctrl.h + cf_header_list="$cf_header_item $cf_header_list" + ;; +esac + +for cf_header in $cf_header_list +do + cat >"conftest.$ac_ext" <<_ACEOF +#line 19584 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +#include <${cf_header}> +int +main (void) +{ +WINDOW *x; (void)x + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19598: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19601: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19604: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19607: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_unctrl_header=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_unctrl_header=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +done + +fi +echo "$as_me:19620: result: $cf_cv_unctrl_header" >&5 +echo "${ECHO_T}$cf_cv_unctrl_header" >&6 + +case "$cf_cv_unctrl_header" in +(no) + { echo "$as_me:19625: WARNING: unctrl.h header not found" >&5 +echo "$as_me: WARNING: unctrl.h header not found" >&2;} + ;; +esac + +case "$cf_cv_unctrl_header" in +(unctrl.h) + +cat >>confdefs.h <<\EOF +#define HAVE_UNCTRL_H 1 +EOF + + ;; +(ncurses/unctrl.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSES_UNCTRL_H 1 +EOF + + ;; +(ncursesw/unctrl.h) + +cat >>confdefs.h <<\EOF +#define HAVE_NCURSESW_UNCTRL_H 1 +EOF + + ;; +esac + +for cf_func in \ +_nc_tparm_analyze \ +_tracef \ +alloc_pair \ +assume_default_colors \ +chgat \ +color_content \ +color_set \ +copywin \ +curses_trace \ +delscreen \ +dupwin \ +exit_curses \ +exit_terminfo \ +filter \ +getbegx \ +getcurx \ +getmaxx \ +getnstr \ +getparx \ +getwin \ +halfdelay \ +init_extended_color \ +mvderwin \ +mvvline \ +mvwin \ +mvwvline \ +napms \ +newpad \ +putwin \ +reset_color_pairs \ +resize_term \ +resizeterm \ +restartterm \ +ripoffline \ +scr_dump \ +setupterm \ +slk_color \ +slk_init \ +termattrs \ +termname \ +tgetent \ +tigetnum \ +tigetstr \ +tiparm \ +tiparm_s \ +tiscan_s \ +tputs_sp \ +typeahead \ +unget_wch \ +use_default_colors \ +use_env \ +use_extended_names \ +use_screen \ +use_window \ +vid_puts \ +vidputs \ +vsscanf \ +vw_printw \ +wchgat \ +winsdelln \ +winsstr \ +wresize \ +wsyncdown \ + +do + +cf_tr_func=`echo "$cf_func" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + echo "$as_me:19723: checking for ${cf_func}" >&5 +echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6 + +echo "${as_me:-configure}:19726: testing ${cf_func} ..." 1>&5 + + if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + eval cf_result='$ac_cv_func_'$cf_func + if test ".$cf_result" != ".no"; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 19735 "configure" +#include "confdefs.h" + +#ifdef HAVE_XCURSES +#include +char * XCursesProgramName = "test"; +#else +#include <${cf_cv_ncurses_header:-curses.h}> +#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif +#endif + +int +main (void) +{ + +#ifndef ${cf_func} +long foo = (long)(&${cf_func}); +fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo); +if (foo + 1234L > 5678L) + ${cf_cv_main_return:-return}(foo != 0); +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19768: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19771: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19774: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19777: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + fi + eval 'cf_cv_func_'$cf_func'="$cf_result"' + +fi + + # use the computed/retrieved cache-value: + eval 'cf_result=$cf_cv_func_'$cf_func + echo "$as_me:19793: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + if test "$cf_result" != no; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for ${cf_func}... $ECHO_C" >&6 + +echo "${as_me:-configure}:19811: testing ${cf_func} ..." 1>&5 + + if eval "test \"\${cf_cv_func_$cf_func+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + eval cf_result='$ac_cv_func_'$cf_func + if test ".$cf_result" != ".no"; then + cat >"conftest.$ac_ext" <<_ACEOF +#line 19820 "configure" +#include "confdefs.h" + +#ifdef HAVE_XCURSES +#include +char * XCursesProgramName = "test"; +#else +#include <${cf_cv_ncurses_header:-curses.h}> +#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif +#endif + +int +main (void) +{ + +#ifndef ${cf_func} +long foo = (long)(&${cf_func}); +fprintf(stderr, "testing linkage of $cf_func:%p\\n", (void *)foo); +if (foo + 1234L > 5678L) + ${cf_cv_main_return:-return}(foo != 0); +#endif + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:19853: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19856: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:19859: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19862: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + fi + eval 'cf_cv_func_'$cf_func'="$cf_result"' + +fi + + # use the computed/retrieved cache-value: + eval 'cf_result=$cf_cv_func_'$cf_func + echo "$as_me:19878: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + if test "$cf_result" != no; then + cat >>confdefs.h <"conftest.$ac_ext" <<_ACEOF +#line 19902 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +#include <$cf_cv_term_header> + +static $cf_ret outc($cf_arg value) { $cf_return; } + +int +main (void) +{ + + tputs("hello", 0, outc); + ${cf_cv_main_return:-return}(0); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19922: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19925: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19928: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19931: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + test -n "$verbose" && echo " prototype $cf_ret func($cf_arg value)" 1>&6 + +echo "${as_me:-configure}:19936: testing prototype $cf_ret func($cf_arg value) ..." 1>&5 + + cat >>confdefs.h <&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + done + test "$cf_done" = yes && break + done +fi + +echo "$as_me:19956: checking for ncurses extended functions" >&5 +echo $ECHO_N "checking for ncurses extended functions... $ECHO_C" >&6 +if test "${cf_cv_ncurses_ext_funcs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 19963 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + +int x = NCURSES_EXT_FUNCS + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:19978: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:19981: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:19984: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19987: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_ext_funcs=defined +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + +cat >"conftest.$ac_ext" <<_ACEOF +#line 19995 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + + (void) assume_default_colors (0, 0); + (void) curses_version (); + (void) define_key (0, 0); + (void) is_term_resized (0, 0); + (void) key_defined (0); + (void) keybound (0, 0); + (void) keyok (0, 0); + (void) resize_term (0, 0); + (void) resizeterm (0, 0); + (void) use_default_colors (); + (void) use_extended_names (0); + (void) wresize (0, 0, 0); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20020: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20023: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20026: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20029: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_ncurses_ext_funcs=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_ncurses_ext_funcs=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:20043: result: $cf_cv_ncurses_ext_funcs" >&5 +echo "${ECHO_T}$cf_cv_ncurses_ext_funcs" >&6 +test "$cf_cv_ncurses_ext_funcs" = yes && +cat >>confdefs.h <<\EOF +#define NCURSES_EXT_FUNCS 1 +EOF + +if test "$cf_enable_widec" = yes +then + # workaround for systems with ncurses before 20111029, due to change of + # feature test macro from _XPG5 to _XOPEN_SOURCE + if test -n "$cf_cv_ncurses_version" && test "x$cf_cv_ncurses_version" != xno + then + cf_define_xpg5=no + echo "$as_me:20057: checking if _XPG5 should be defined to enable wide-characters" >&5 +echo $ECHO_N "checking if _XPG5 should be defined to enable wide-characters... $ECHO_C" >&6 + + cat >"conftest.$ac_ext" <<_ACEOF +#line 20061 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +int x = _XPG5 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20074: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20077: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20080: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20083: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_save_cppflags="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_XPG5" + cat >"conftest.$ac_ext" <<_ACEOF +#line 20092 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +int x = _XPG5 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20105: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20108: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20111: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20114: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_define_xpg5=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + CPPFLAGS="$cf_save_cppflags" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + echo "$as_me:20125: result: $cf_define_xpg5" >&5 +echo "${ECHO_T}$cf_define_xpg5" >&6 + + if test "$cf_define_xpg5" = yes + then + CPPFLAGS="$CPPFLAGS -D_XPG5" + fi + fi + + echo "$as_me:20134: checking for wide-character functions" >&5 +echo $ECHO_N "checking for wide-character functions... $ECHO_C" >&6 +if test "${cf_cv_widechar_funcs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 20141 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + + static wchar_t src_wchar[2]; + static cchar_t dst_cchar; + setcchar(&dst_cchar, src_wchar, A_NORMAL, 0, (void *) 0); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20158: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20161: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20164: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20167: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_widechar_funcs=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_widechar_funcs=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:20178: result: $cf_cv_widechar_funcs" >&5 +echo "${ECHO_T}$cf_cv_widechar_funcs" >&6 + if test "$cf_cv_widechar_funcs" != no ; then + +cat >>confdefs.h <<\EOF +#define USE_WIDEC_SUPPORT 1 +EOF + + else + cat >>confdefs.h <<\EOF +#define USE_WIDEC_SUPPORT 0 +EOF + + fi +else + cat >>confdefs.h <<\EOF +#define USE_WIDEC_SUPPORT 0 +EOF + +fi + +echo "$as_me:20199: checking if $cf_cv_screen library uses pthreads" >&5 +echo $ECHO_N "checking if $cf_cv_screen library uses pthreads... $ECHO_C" >&6 +if test "${cf_cv_use_pthreads+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 20206 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> +extern void _nc_init_pthreads(void); + +int +main (void) +{ + + initscr(); + _nc_init_pthreads(); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20224: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20227: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20230: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20233: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_use_pthreads=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_use_pthreads=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +fi +echo "$as_me:20244: result: $cf_cv_use_pthreads" >&5 +echo "${ECHO_T}$cf_cv_use_pthreads" >&6 +test $cf_cv_use_pthreads = yes && +cat >>confdefs.h <<\EOF +#define USE_PTHREADS 1 +EOF + +echo "$as_me:20251: checking if sys/time.h works with sys/select.h" >&5 +echo $ECHO_N "checking if sys/time.h works with sys/select.h... $ECHO_C" >&6 +if test "${cf_cv_sys_time_select+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 20258 "configure" +#include "confdefs.h" + +#include +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20278: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20281: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20284: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20287: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_sys_time_select=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_sys_time_select=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi + +echo "$as_me:20299: result: $cf_cv_sys_time_select" >&5 +echo "${ECHO_T}$cf_cv_sys_time_select" >&6 +test "$cf_cv_sys_time_select" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_SYS_TIME_SELECT 1 +EOF + +# special check for test/ditto.c + +echo "$as_me:20308: checking for openpty in -lutil" >&5 +echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6 +if test "${ac_cv_lib_util_openpty+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 20316 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char openpty (void); +int +main (void) +{ +openpty (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20335: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20338: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20341: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20344: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_util_openpty=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_util_openpty=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20355: result: $ac_cv_lib_util_openpty" >&5 +echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6 +if test "$ac_cv_lib_util_openpty" = yes; then + cf_cv_lib_util=yes +else + cf_cv_lib_util=no +fi + +echo "$as_me:20363: checking for openpty header" >&5 +echo $ECHO_N "checking for openpty header... $ECHO_C" >&6 +if test "${cf_cv_func_openpty+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save_LIBS="$LIBS" + test "$cf_cv_lib_util" = yes && { +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + } + for cf_header in pty.h libutil.h util.h + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 20390 "configure" +#include "confdefs.h" + +#include <$cf_header> + +int +main (void) +{ + + int x = openpty((int *)0, (int *)0, (char *)0, + (struct termios *)0, (struct winsize *)0); + (void)x; + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20408: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20411: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20414: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20417: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_func_openpty=$cf_header + break + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_func_openpty=no + +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done + LIBS="$cf_save_LIBS" + +fi +echo "$as_me:20435: result: $cf_cv_func_openpty" >&5 +echo "${ECHO_T}$cf_cv_func_openpty" >&6 + +if test "$cf_cv_func_openpty" != no ; then + +cat >>confdefs.h < +EOF + +cat >>confdefs.h <<\EOF +#define USE_XTERM_PTY 1 +EOF + + if test "x$cf_cv_lib_util" = xyes ; then + +cf_add_libs="$TEST_LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lutil; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +TEST_LIBS="$cf_add_libs" + + fi +fi + +echo "$as_me:20469: checking for function curses_version" >&5 +echo $ECHO_N "checking for function curses_version... $ECHO_C" >&6 +if test "${cf_cv_func_curses_version+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes; then + cf_cv_func_curses_version=unknown +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20479 "configure" +#include "confdefs.h" + +$ac_includes_default + +#include <${cf_cv_ncurses_header:-curses.h}> + +int main(void) +{ + char temp[1024]; + sprintf(temp, "%.999s\\n", curses_version()); + ${cf_cv_main_return:-return}(0); +} + +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:20495: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20498: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:20500: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20503: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_func_curses_version=yes + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_func_curses_version=no + +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f core +fi +echo "$as_me:20518: result: $cf_cv_func_curses_version" >&5 +echo "${ECHO_T}$cf_cv_func_curses_version" >&6 +test "$cf_cv_func_curses_version" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_CURSES_VERSION 1 +EOF + +echo "$as_me:20525: checking for alternate character set array" >&5 +echo $ECHO_N "checking for alternate character set array... $ECHO_C" >&6 +if test "${cf_cv_curses_acs_map+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_curses_acs_map=unknown +for name in acs_map _acs_map __acs_map ${NCURSES_WRAP_PREFIX}acs_map +do +cat >"conftest.$ac_ext" <<_ACEOF +#line 20535 "configure" +#include "confdefs.h" + +#include <${cf_cv_ncurses_header:-curses.h}> + +int +main (void) +{ + +${name}['k'] = ACS_PLUS + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20551: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20554: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20557: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20560: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_curses_acs_map=$name; break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +done + +fi +echo "$as_me:20571: result: $cf_cv_curses_acs_map" >&5 +echo "${ECHO_T}$cf_cv_curses_acs_map" >&6 + +test "$cf_cv_curses_acs_map" != unknown && +cat >>confdefs.h <&5 +echo $ECHO_N "checking for wide alternate character set array... $ECHO_C" >&6 +if test "${cf_cv_curses_wacs_map+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_curses_wacs_map=unknown + for name in wacs_map _wacs_map __wacs_map _nc_wacs _wacs_char + do + cat >"conftest.$ac_ext" <<_ACEOF +#line 20591 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +void *foo = &(${name}['k']); (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20607: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20610: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20613: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20616: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_curses_wacs_map=$name + break +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + done +fi +echo "$as_me:20627: result: $cf_cv_curses_wacs_map" >&5 +echo "${ECHO_T}$cf_cv_curses_wacs_map" >&6 + +test "$cf_cv_curses_wacs_map" != unknown && +cat >>confdefs.h <&5 +echo $ECHO_N "checking for wide alternate character constants... $ECHO_C" >&6 +if test "${cf_cv_curses_wacs_symbols+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_curses_wacs_symbols=no +if test "$cf_cv_curses_wacs_map" != unknown +then + cat >"conftest.$ac_ext" <<_ACEOF +#line 20645 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +cchar_t *foo = WACS_PLUS; + ${cf_cv_curses_wacs_map}['k'] = *WACS_PLUS; (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20662: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20665: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20668: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20671: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_curses_wacs_symbols=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 20681 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ +cchar_t *foo = WACS_PLUS; (void)foo + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:20697: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20700: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:20703: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20706: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_curses_wacs_symbols=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi + +fi +echo "$as_me:20717: result: $cf_cv_curses_wacs_symbols" >&5 +echo "${ECHO_T}$cf_cv_curses_wacs_symbols" >&6 + +test "$cf_cv_curses_wacs_symbols" != no && +cat >>confdefs.h <<\EOF +#define CURSES_WACS_SYMBOLS 1 +EOF + +fi + +echo "$as_me:20727: checking for type attr_t in ${cf_cv_ncurses_header:-curses.h}" >&5 +echo $ECHO_N "checking for type attr_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 20730 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + +attr_t foo + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20748: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20751: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20754: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20757: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:20766: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 +if test "$cf_result" = yes ; then + +cf_result=`echo "have_type_attr_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <>confdefs.h <&5 +echo $ECHO_N "checking if we must include wchar.h to declare mbstate_t... $ECHO_C" >&6 +if test "${cf_cv_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 20794 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +mbstate_t state; (void)state + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20812: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20815: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20818: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20821: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_mbstate_t=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 20828 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +mbstate_t value; (void) value + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20847: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20850: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20853: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20856: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_mbstate_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_mbstate_t=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:20868: result: $cf_cv_mbstate_t" >&5 +echo "${ECHO_T}$cf_cv_mbstate_t" >&6 + +if test "$cf_cv_mbstate_t" = yes ; then + +cat >>confdefs.h <<\EOF +#define NEED_WCHAR_H 1 +EOF + + NEED_WCHAR_H=1 +fi + +# if we do not find mbstate_t in either place, use substitution to provide a fallback. +if test "$cf_cv_mbstate_t" = unknown ; then + NCURSES_MBSTATE_T=1 +fi + +# if we find mbstate_t in either place, use substitution to provide a fallback. +if test "$cf_cv_mbstate_t" != unknown ; then + NCURSES_OK_MBSTATE_T=1 +fi + +# This is needed on Tru64 5.0 to declare wchar_t +echo "$as_me:20891: checking if we must include wchar.h to declare wchar_t" >&5 +echo $ECHO_N "checking if we must include wchar.h to declare wchar_t... $ECHO_C" >&6 +if test "${cf_cv_wchar_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 20898 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wchar_t state; (void)state + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20916: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20919: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20922: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20925: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wchar_t=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 20932 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wchar_t value; (void) value + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:20951: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:20954: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:20957: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20960: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wchar_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_wchar_t=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:20972: result: $cf_cv_wchar_t" >&5 +echo "${ECHO_T}$cf_cv_wchar_t" >&6 + +if test "$cf_cv_wchar_t" = yes ; then + +cat >>confdefs.h <<\EOF +#define NEED_WCHAR_H 1 +EOF + + NEED_WCHAR_H=1 +fi + +# if we do not find wchar_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wchar_t" = unknown ; then + NCURSES_WCHAR_T=1 +fi + +# if we find wchar_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wchar_t" != unknown ; then + NCURSES_OK_WCHAR_T=1 +fi + +# This is needed on Tru64 5.0 to declare wint_t +echo "$as_me:20995: checking if we must include wchar.h to declare wint_t" >&5 +echo $ECHO_N "checking if we must include wchar.h to declare wint_t... $ECHO_C" >&6 +if test "${cf_cv_wint_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >"conftest.$ac_ext" <<_ACEOF +#line 21002 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wint_t state; (void)state + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21020: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21023: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21026: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21029: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wint_t=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cat >"conftest.$ac_ext" <<_ACEOF +#line 21036 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +int +main (void) +{ +wint_t value; (void) value + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21055: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21058: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21061: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21064: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_cv_wint_t=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_cv_wint_t=unknown +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +fi +echo "$as_me:21076: result: $cf_cv_wint_t" >&5 +echo "${ECHO_T}$cf_cv_wint_t" >&6 + +if test "$cf_cv_wint_t" = yes ; then + +cat >>confdefs.h <<\EOF +#define NEED_WCHAR_H 1 +EOF + + NEED_WCHAR_H=1 +fi + +# if we do not find wint_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wint_t" = unknown ; then + NCURSES_WINT_T=1 +fi + +# if we find wint_t in either place, use substitution to provide a fallback. +if test "$cf_cv_wint_t" != unknown ; then + NCURSES_OK_WINT_T=1 +fi + + if test "$NCURSES_OK_MBSTATE_T" = 0 ; then + +echo "$as_me:21100: checking for type mbstate_t in ${cf_cv_ncurses_header:-curses.h}" >&5 +echo $ECHO_N "checking for type mbstate_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 21103 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + +mbstate_t foo + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21121: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21124: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21127: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21130: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:21139: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 +if test "$cf_result" = yes ; then + +cf_result=`echo "have_type_mbstate_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <>confdefs.h <&5 +echo $ECHO_N "checking for type wchar_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 21164 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + +wchar_t foo + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21182: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21185: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21188: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21191: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:21200: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 +if test "$cf_result" = yes ; then + +cf_result=`echo "have_type_wchar_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <>confdefs.h <&5 +echo $ECHO_N "checking for type wint_t in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6 +cat >"conftest.$ac_ext" <<_ACEOF +#line 21225 "configure" +#include "confdefs.h" + +#ifndef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED +#endif +#include <${cf_cv_ncurses_header:-curses.h}> +int +main (void) +{ + +wint_t foo + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21243: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21246: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21249: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21252: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:21261: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 +if test "$cf_result" = yes ; then + +cf_result=`echo "have_type_wint_t" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <>confdefs.h <&5 +echo $ECHO_N "checking for data $cf_data declaration in ${cf_cv_ncurses_header:-curses.h}... $ECHO_C" >&6 + +cat >"conftest.$ac_ext" <<_ACEOF +#line 21294 "configure" +#include "confdefs.h" + +#ifdef HAVE_XCURSES +#include +char * XCursesProgramName = "test"; +#else +#include <${cf_cv_ncurses_header:-curses.h}> +#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif +#endif + +int +main (void) +{ + +#if defined($cf_data) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT)) + const void *foo = (const void *)($cf_data); +#else + const void *foo = &($cf_data); +#endif + fprintf(stderr, "testing linkage of $cf_data:%p\\n", (const void *)foo); + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:21327: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:21330: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:21333: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21336: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" +echo "$as_me:21346: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +if test "$cf_result" = yes ; then + +cf_result=`echo "have_curses_data_$cf_data" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for data $cf_data in library... $ECHO_C" >&6 + # BSD linkers insist on making weak linkage, but resolve at runtime. + if test "$cross_compiling" = yes; then + + # cross-compiling + cat >"conftest.$ac_ext" <<_ACEOF +#line 21365 "configure" +#include "confdefs.h" + +#ifdef HAVE_XCURSES +#include +char * XCursesProgramName = "test"; +#else +#include <${cf_cv_ncurses_header:-curses.h}> +#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif +#endif + +extern char $cf_data; +int +main (void) +{ + + do { + +#if defined($cf_data) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT)) + const void *foo = (const void *)($cf_data); +#else + const void *foo = &($cf_data); +#endif + fprintf(stderr, "testing linkage of $cf_data:%p\\n", (const void *)foo); + + ${cf_cv_main_return:-return}(foo == 0); + } while (0) + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21404: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21407: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21410: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21413: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 21425 "configure" +#include "confdefs.h" + +#ifdef HAVE_XCURSES +#include +char * XCursesProgramName = "test"; +#else +#include <${cf_cv_ncurses_header:-curses.h}> +#if defined(NCURSES_VERSION) && defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(NCURSES_VERSION) && defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif +#endif + +extern char $cf_data; +int main(void) +{ + +#if defined($cf_data) && ((defined(NCURSES_WRAPPED_VAR) && (NCURSES_VERSION_PATCH < 20200208)) || defined(NCURSES_BROKEN_LINKER) || defined(NCURSES_REENTRANT)) + const void *foo = (const void *)($cf_data); +#else + const void *foo = &($cf_data); +#endif + fprintf(stderr, "testing linkage of $cf_data:%p\\n", (const void *)foo); + + ${cf_cv_main_return:-return}(foo == 0); +} +_ACEOF +rm -f "conftest$ac_exeext" +if { (eval echo "$as_me:21457: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21460: \$? = $ac_status" >&5 + (exit "$ac_status"); } && { ac_try='"./conftest$ac_exeext"' + { (eval echo "$as_me:21462: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21465: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_result=yes + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_result=no +fi +rm -f core ./core.* ./*.core "conftest$ac_exeext" "conftest.$ac_objext" "conftest.$ac_ext" +fi + echo "$as_me:21477: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + if test "$cf_result" = yes ; then + +cf_result=`echo "decl_curses_data_$cf_data" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval "`${MAKE-make} acfindx 2>/dev/null | grep -v make`" + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/opt/local/include +/opt/X11/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >"conftest.$ac_ext" <<_ACEOF +#line 21598 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:21602: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:21608: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err "conftest.$ac_ext" +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >"conftest.$ac_ext" <<_ACEOF +#line 21641 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21653: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21656: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21659: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21662: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib dll; do + if test -r "$ac_dir/libXt.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:21700: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:21710: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + + if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\EOF +#define X_DISPLAY_MISSING 1 +EOF + + X_CFLAGS= + X_PRE_LIBS= + X_LIBS= + X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:21737: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >"conftest.$ac_ext" <<_ACEOF +#line 21741 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21753: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21756: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21759: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21762: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_R_nospace=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + if test $ac_R_nospace = yes; then + echo "$as_me:21772: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >"conftest.$ac_ext" <<_ACEOF +#line 21778 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21790: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21793: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21796: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21799: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_R_space=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + if test $ac_R_space = yes; then + echo "$as_me:21809: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:21813: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >"conftest.$ac_ext" <<_ACEOF +#line 21833 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21852: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21855: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21858: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21861: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +echo "$as_me:21867: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 21875 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (void); +int +main (void) +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21894: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21897: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21900: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21903: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:21914: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test "$ac_cv_lib_dnet_dnet_ntoa" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:21921: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 21929 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (void); +int +main (void) +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:21948: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21951: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:21954: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21957: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:21968: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test "$ac_cv_lib_dnet_stub_dnet_ntoa" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:21987: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 21993 "configure" +#include "confdefs.h" +#define gethostbyname autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef gethostbyname + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) +#error found stub for gethostbyname +#endif + + return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22024: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22027: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22030: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22033: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_gethostbyname=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22043: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:22047: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22055 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); +int +main (void) +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22074: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22077: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22080: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22083: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22094: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test "$ac_cv_lib_nsl_gethostbyname" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:22101: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22109 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); +int +main (void) +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22128: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22131: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22134: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22137: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22148: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test "$ac_cv_lib_bsd_gethostbyname" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the nameserver (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:22164: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22170 "configure" +#include "confdefs.h" +#define connect autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef connect + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_connect) || defined (__stub___connect) +#error found stub for connect +#endif + + return connect (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22201: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22204: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22207: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22210: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_connect=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22220: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:22224: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22232 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (void); +int +main (void) +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22251: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22254: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22257: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22260: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_socket_connect=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22271: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test "$ac_cv_lib_socket_connect" = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:22280: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22286 "configure" +#include "confdefs.h" +#define remove autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef remove + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_remove) || defined (__stub___remove) +#error found stub for remove +#endif + + return remove (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22317: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22320: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22323: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22326: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_remove=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22336: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:22340: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22348 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (void); +int +main (void) +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22367: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22370: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22373: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22376: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_posix_remove=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22387: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test "$ac_cv_lib_posix_remove" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:22396: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 22402 "configure" +#include "confdefs.h" +#define shmat autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef shmat + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (void); + +int +main (void) +{ + +/* The GNU C library defines stubs for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shmat) || defined (__stub___shmat) +#error found stub for shmat +#endif + + return shmat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22433: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22436: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22439: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22442: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_func_shmat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +fi +echo "$as_me:22452: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:22456: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22464 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (void); +int +main (void) +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22483: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22486: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22489: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22492: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_ipc_shmat=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22503: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test "$ac_cv_lib_ipc_shmat" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:22521: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 22529 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (void); +int +main (void) +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:22548: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22551: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:22554: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22557: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22568: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test "$ac_cv_lib_ICE_IceConnectionNumber" = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + +if test "$GCC" = yes || test "$GXX" = yes +then + case $CFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $CFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$CFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing CFLAGS: $CFLAGS" 1>&6 + +echo "${as_me:-configure}:22615: testing repairing CFLAGS: $CFLAGS ..." 1>&5 + + CFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $CFLAGS" 1>&6 + +echo "${as_me:-configure}:22620: testing ... fixed $CFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:22624: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + case $CPPFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $CPPFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$CPPFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing CPPFLAGS: $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:22663: testing repairing CPPFLAGS: $CPPFLAGS ..." 1>&5 + + CPPFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:22668: testing ... fixed $CPPFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:22672: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +if test "$GCC" = yes || test "$GXX" = yes +then + case $LDFLAGS in + (*-Werror=*) + cf_temp_flags= + for cf_temp_scan in $LDFLAGS + do + case "x$cf_temp_scan" in + (x-Werror=format*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + (x-Werror=*) + + test -n "$EXTRA_CFLAGS" && EXTRA_CFLAGS="$EXTRA_CFLAGS " + EXTRA_CFLAGS="${EXTRA_CFLAGS}$cf_temp_scan" + + ;; + (*) + + test -n "$cf_temp_flags" && cf_temp_flags="$cf_temp_flags " + cf_temp_flags="${cf_temp_flags}$cf_temp_scan" + + ;; + esac + done + if test "x$LDFLAGS" != "x$cf_temp_flags" + then + test -n "$verbose" && echo " repairing LDFLAGS: $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:22711: testing repairing LDFLAGS: $LDFLAGS ..." 1>&5 + + LDFLAGS="$cf_temp_flags" + test -n "$verbose" && echo " ... fixed $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:22716: testing ... fixed $LDFLAGS ..." 1>&5 + + test -n "$verbose" && echo " ... extra $EXTRA_CFLAGS" 1>&6 + +echo "${as_me:-configure}:22720: testing ... extra $EXTRA_CFLAGS ..." 1>&5 + + fi + ;; + esac +fi + +echo "$as_me:22727: checking if you want to turn on gcc warnings" >&5 +echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6 + +# Check whether --enable-warnings or --disable-warnings was given. +if test "${enable_warnings+set}" = set; then + enableval="$enable_warnings" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_warnings=yes + else + enable_warnings=no + fi +else + enableval=no + enable_warnings=no + +fi; +echo "$as_me:22744: result: $enable_warnings" >&5 +echo "${ECHO_T}$enable_warnings" >&6 +if test "$enable_warnings" = "yes" +then + +if test "$GCC" = yes || test "$GXX" = yes +then +cat > conftest.i <&5 +echo "$as_me: checking for $CC __attribute__ directives..." >&6;} +cat > "conftest.$ac_ext" < +#include "confdefs.h" +#include "conftest.h" +#include "conftest.i" +#if GCC_PRINTF +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#else +#define GCC_PRINTFLIKE(fmt,var) /*nothing*/ +#endif +#if GCC_SCANF +#define GCC_SCANFLIKE(fmt,var) __attribute__((format(scanf,fmt,var))) +#else +#define GCC_SCANFLIKE(fmt,var) /*nothing*/ +#endif +extern void wow(char *,...) GCC_SCANFLIKE(1,2); +extern GCC_NORETURN void oops(char *,...) GCC_PRINTFLIKE(1,2); +extern GCC_NORETURN void foo(void); +int main(int argc GCC_UNUSED, char *argv[] GCC_UNUSED) { (void)argc; (void)argv; return 0; } +EOF + cf_printf_attribute=no + cf_scanf_attribute=no + for cf_attribute in scanf printf unused noreturn + do + +cf_ATTRIBUTE=`echo "$cf_attribute" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cf_directive="__attribute__(($cf_attribute))" + echo "checking for $CC $cf_directive" 1>&5 + + case "$cf_attribute" in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22823: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:22825: result: ... $cf_attribute" >&5 +echo "${ECHO_T}... $cf_attribute" >&6 + cat conftest.h >>confdefs.h + case "$cf_attribute" in + (noreturn) + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_PRINTF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_SCANF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf ./conftest* +fi + +if test "x$have_x" = xyes; then + +cf_save_LIBS_CF_CONST_X_STRING="$LIBS" +cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS" +cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + +cat >"conftest.$ac_ext" <<_ACEOF +#line 22903 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +String foo = malloc(1); free((void*)foo) + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22918: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22921: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22924: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22927: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + +echo "$as_me:22930: checking for X11/Xt const-feature" >&5 +echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6 +if test "${cf_cv_const_x_string+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >"conftest.$ac_ext" <<_ACEOF +#line 22937 "configure" +#include "confdefs.h" + +#undef _CONST_X_STRING +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + +int +main (void) +{ +String foo = malloc(1); *foo = 0 + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" +if { (eval echo "$as_me:22955: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22958: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest.$ac_objext"' + { (eval echo "$as_me:22961: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22964: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + + cf_cv_const_x_string=no + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 + + cf_cv_const_x_string=yes + +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + +fi +echo "$as_me:22979: result: $cf_cv_const_x_string" >&5 +echo "${ECHO_T}$cf_cv_const_x_string" >&6 + +LIBS="$cf_save_LIBS_CF_CONST_X_STRING" +CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING" +CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING" + +case "$cf_cv_const_x_string" in +(no) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES" + + ;; +(*) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING" + + ;; +esac + +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest.$ac_ext" + fi +cat > "conftest.$ac_ext" <&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS="$EXTRA_CFLAGS -Wall" + for cf_opt in \ + wd1419 \ + wd1683 \ + wd1684 \ + wd193 \ + wd593 \ + wd279 \ + wd810 \ + wd869 \ + wd981 + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:23040: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23043: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:23045: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown" +then + { echo "$as_me:23053: checking for $CC warning options..." >&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + cf_warn_CONST="" + test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings" + cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs" + test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings= + for cf_opt in W Wall \ + Wbad-function-cast \ + Wcast-align \ + Wcast-qual \ + Wdeclaration-after-statement \ + Wextra \ + Winline \ + Wmissing-declarations \ + Wmissing-prototypes \ + Wnested-externs \ + Wpointer-arith \ + Wshadow \ + Wstrict-prototypes \ + Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wno-unknown-pragmas + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:23076: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23079: \$? = $ac_status" >&5 + (exit "$ac_status"); }; then + test -n "$verbose" && echo "$as_me:23081: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + case "$cf_opt" in + (Winline) + case "$GCC_VERSION" in + ([34].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:23089: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + (Wpointer-arith) + case "$GCC_VERSION" in + ([12].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:23099: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + esac + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +fi +rm -rf ./conftest* + +fi + +fi + +echo "$as_me:23116: checking if you want to use dmalloc for testing" >&5 +echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dmalloc or --without-dmalloc was given. +if test "${with_dmalloc+set}" = set; then + withval="$with_dmalloc" + case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_dmalloc=yes + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_dmalloc:-no}" >&6 + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +if test "$with_dmalloc" = yes ; then + echo "$as_me:23252: checking for dmalloc.h" >&5 +echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23258 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:23262: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:23268: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_dmalloc_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:23287: result: $ac_cv_header_dmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6 +if test "$ac_cv_header_dmalloc_h" = yes; then + +echo "$as_me:23291: checking for dmalloc_debug in -ldmalloc" >&5 +echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldmalloc $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 23299 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dmalloc_debug (void); +int +main (void) +{ +dmalloc_debug (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23318: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23321: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23324: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23327: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dmalloc_dmalloc_debug=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dmalloc_dmalloc_debug=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:23338: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5 +echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6 +if test "$ac_cv_lib_dmalloc_dmalloc_debug" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dbmalloc or --without-dbmalloc was given. +if test "${with_dbmalloc+set}" = set; then + withval="$with_dbmalloc" + case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_dbmalloc=yes + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_dbmalloc:-no}" >&6 + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +if test "$with_dbmalloc" = yes ; then + echo "$as_me:23489: checking for dbmalloc.h" >&5 +echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dbmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >"conftest.$ac_ext" <<_ACEOF +#line 23495 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:23499: \"$ac_cpp "conftest.$ac_ext"\"") >&5 + (eval $ac_cpp "conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + $EGREP -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:23505: \$? = $ac_status" >&5 + (exit "$ac_status"); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dbmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat "conftest.$ac_ext" >&5 + ac_cv_header_dbmalloc_h=no +fi +rm -f conftest.err "conftest.$ac_ext" +fi +echo "$as_me:23524: result: $ac_cv_header_dbmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6 +if test "$ac_cv_header_dbmalloc_h" = yes; then + +echo "$as_me:23528: checking for debug_malloc in -ldbmalloc" >&5 +echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldbmalloc $LIBS" +cat >"conftest.$ac_ext" <<_ACEOF +#line 23536 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char debug_malloc (void); +int +main (void) +{ +debug_malloc (); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23555: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23558: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23561: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23564: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + ac_cv_lib_dbmalloc_debug_malloc=yes +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +ac_cv_lib_dbmalloc_debug_malloc=no +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:23575: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5 +echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6 +if test "$ac_cv_lib_dbmalloc_debug_malloc" = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6 + +# Check whether --with-valgrind or --without-valgrind was given. +if test "${with_valgrind+set}" = set; then + withval="$with_valgrind" + case "x$withval" in + (x|xno) ;; + (*) + : "${with_cflags:=-g}" + : "${enable_leaks:=no}" + with_valgrind=yes + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_valgrind:-no}" >&6 + +case ".$with_cflags" in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case "$cf_fix_cppflags" in +(no) + case "$cf_add_cflags" in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case "$cf_add_cflags" in + (-D*) + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test "$cf_fix_cppflags" = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case "$cf_add_cflags" in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo "${cf_add_cflags}" |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +echo "$as_me:23725: checking if you want to perform memory-leak testing" >&5 +echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6 + +# Check whether --enable-leaks or --disable-leaks was given. +if test "${enable_leaks+set}" = set; then + enableval="$enable_leaks" + enable_leaks=$enableval +else + enable_leaks=yes +fi; +if test "x$enable_leaks" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi +echo "$as_me:23736: result: $with_no_leaks" >&5 +echo "${ECHO_T}$with_no_leaks" >&6 + +if test "$enable_leaks" = no ; then + +cat >>confdefs.h <<\EOF +#define NO_LEAKS 1 +EOF + +cat >>confdefs.h <<\EOF +#define YY_NO_LEAKS 1 +EOF + +fi + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + echo "$as_me:23754: checking for an rpath option" >&5 +echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6 + case "$cf_cv_system_name" in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[2-9].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + echo "$as_me:23785: result: $LD_RPATH_OPT" >&5 +echo "${ECHO_T}$LD_RPATH_OPT" >&6 + + case "x$LD_RPATH_OPT" in + (x-R*) + echo "$as_me:23790: checking if we need a space after rpath option" >&5 +echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6 + cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >"conftest.$ac_ext" <<_ACEOF +#line 23811 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23823: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23826: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23829: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23832: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_rpath_space=no +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +cf_rpath_space=yes +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + LIBS="$cf_save_LIBS" + echo "$as_me:23842: result: $cf_rpath_space" >&5 +echo "${ECHO_T}$cf_rpath_space" >&6 + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi + +echo "$as_me:23849: checking if rpath-hack should be disabled" >&5 +echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6 + +# Check whether --enable-rpath-hack or --disable-rpath-hack was given. +if test "${enable_rpath_hack+set}" = set; then + enableval="$enable_rpath_hack" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_rpath_hack=no + else + enable_rpath_hack=yes + fi +else + enableval=yes + enable_rpath_hack=yes + +fi; +if test "x$enable_rpath_hack" = xno; then cf_disable_rpath_hack=yes; else cf_disable_rpath_hack=no; fi +echo "$as_me:23867: result: $cf_disable_rpath_hack" >&5 +echo "${ECHO_T}$cf_disable_rpath_hack" >&6 + +if test "$enable_rpath_hack" = yes ; then + +echo "$as_me:23872: checking for updated LDFLAGS" >&5 +echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6 +if test -n "$LD_RPATH_OPT" ; then + echo "$as_me:23875: result: maybe" >&5 +echo "${ECHO_T}maybe" >&6 + + for ac_prog in ldd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:23882: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$cf_ldd_prog"; then + ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_cf_ldd_prog="$ac_prog" +echo "$as_me:23897: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +cf_ldd_prog=$ac_cv_prog_cf_ldd_prog +if test -n "$cf_ldd_prog"; then + echo "$as_me:23905: result: $cf_ldd_prog" >&5 +echo "${ECHO_T}$cf_ldd_prog" >&6 +else + echo "$as_me:23908: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$cf_ldd_prog" && break +done +test -n "$cf_ldd_prog" || cf_ldd_prog="no" + + cf_rpath_list="/usr/lib /lib" + if test "$cf_ldd_prog" != no + then + cf_rpath_oops= + +cat >"conftest.$ac_ext" <<_ACEOF +#line 23922 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello"); + ; + return 0; +} +_ACEOF +rm -f "conftest.$ac_objext" "conftest$ac_exeext" +if { (eval echo "$as_me:23934: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23937: \$? = $ac_status" >&5 + (exit "$ac_status"); } && + { ac_try='test -s "conftest$ac_exeext"' + { (eval echo "$as_me:23940: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23943: \$? = $ac_status" >&5 + (exit "$ac_status"); }; }; then + cf_rpath_oops=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} ' not found' | sed -e 's% =>.*$%%' |sort | uniq` + cf_rpath_list=`"$cf_ldd_prog" "conftest$ac_exeext" | ${FGREP-fgrep} / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq` +else + echo "$as_me: failed program was:" >&5 +cat "conftest.$ac_ext" >&5 +fi +rm -f "conftest.$ac_objext" "conftest$ac_exeext" "conftest.$ac_ext" + + # If we passed the link-test, but get a "not found" on a given library, + # this could be due to inept reconfiguration of gcc to make it only + # partly honor /usr/local/lib (or whatever). Sometimes this behavior + # is intentional, e.g., installing gcc in /usr/bin and suppressing the + # /usr/local libraries. + if test -n "$cf_rpath_oops" + then + for cf_rpath_src in $cf_rpath_oops + do + for cf_rpath_dir in \ + /usr/local \ + /usr/pkg \ + /opt/sfw + do + if test -f "$cf_rpath_dir/lib/$cf_rpath_src" + then + test -n "$verbose" && echo " ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6 + +echo "${as_me:-configure}:23971: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5 + + LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib" + break + fi + done + done + fi + fi + + test -n "$verbose" && echo " ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 + +echo "${as_me:-configure}:23983: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 + +test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:23987: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5 + +cf_rpath_dst= +for cf_rpath_src in $LDFLAGS +do + case "$cf_rpath_src" in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6 + +echo "${as_me:-configure}:24024: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5 + + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +LDFLAGS=$cf_rpath_dst + +test -n "$verbose" && echo " ...checked LDFLAGS $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:24037: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5 + +test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6 + +echo "${as_me:-configure}:24041: testing ...checking LIBS $LIBS ..." 1>&5 + +cf_rpath_dst= +for cf_rpath_src in $LIBS +do + case "$cf_rpath_src" in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6 + +echo "${as_me:-configure}:24078: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5 + + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +LIBS=$cf_rpath_dst + +test -n "$verbose" && echo " ...checked LIBS $LIBS" 1>&6 + +echo "${as_me:-configure}:24091: testing ...checked LIBS $LIBS ..." 1>&5 + + test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 + +echo "${as_me:-configure}:24095: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 + +else + echo "$as_me:24098: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi + +TEST_ARGS="$LIBS" +LIBS= + +ac_config_files="$ac_config_files Makefile" +ac_config_commands="$ac_config_commands default" +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +: "${CONFIG_STATUS=./config.status}" +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:24188: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >"$CONFIG_STATUS" <<_ACEOF +#! $SHELL +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +me=\`echo "\$0" | sed -e 's,.*\\/,,'\` + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +ac_cs_invocation="\$0 \$@" + +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS +_ACEOF + +cat >>"$CONFIG_STATUS" <<\_ACEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr="expr" +else + as_expr="false" +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln' +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset="unset" +else + as_unset="false" +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +exec 6>&1 + +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>"$CONFIG_STATUS" +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>"$CONFIG_STATUS" +fi + +cat >>"$CONFIG_STATUS" <<\EOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +EOF + +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +EOF +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:24369: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:24388: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +exec 5>>config.log +cat >&5 << _ACEOF + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by $as_me 2.52.20240618, executed with + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + > "$ac_cs_invocation" +on `(hostname || uname -n) 2>/dev/null | sed 1q` + +_ACEOF +EOF + +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + "ncurses_cfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS ncurses_cfg.h:ncurses_tst.hin" ;; + *) { { echo "$as_me:24438: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if "$ac_need_defaults"; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: "${TMPDIR=/tmp}" +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +EOF + +cat >>"$CONFIG_STATUS" <"\$tmp"/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datarootdir@,$datarootdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@runstatedir@,$runstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@DEFS@,$DEFS,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@target@,$target,;t t +s,@target_cpu@,$target_cpu,;t t +s,@target_vendor@,$target_vendor,;t t +s,@target_os@,$target_os,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t +s,@CPP@,$CPP,;t t +s,@GREP@,$GREP,;t t +s,@EGREP@,$EGREP,;t t +s,@AWK@,$AWK,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@GLOB_FULLPATH_POSIX@,$GLOB_FULLPATH_POSIX,;t t +s,@GLOB_FULLPATH_OTHER@,$GLOB_FULLPATH_OTHER,;t t +s,@INSTALL_OPT_S@,$INSTALL_OPT_S,;t t +s,@INSTALL_OPT_O@,$INSTALL_OPT_O,;t t +s,@LINT@,$LINT,;t t +s,@LINT_OPTS@,$LINT_OPTS,;t t +s,@LINT_LIBS@,$LINT_LIBS,;t t +s,@MAKE_NO_PHONY@,$MAKE_NO_PHONY,;t t +s,@MAKE_PHONY@,$MAKE_PHONY,;t t +s,@CTAGS@,$CTAGS,;t t +s,@ETAGS@,$ETAGS,;t t +s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t +s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t +s,@MATH_LIB@,$MATH_LIB,;t t +s,@top_builddir@,$top_builddir,;t t +s,@CC_G_OPT@,$CC_G_OPT,;t t +s,@CC_SHARED_OPTS@,$CC_SHARED_OPTS,;t t +s,@DFT_DEP_SUFFIX@,$DFT_DEP_SUFFIX,;t t +s,@DFT_OBJ_SUBDIR@,$DFT_OBJ_SUBDIR,;t t +s,@DFT_UPR_MODEL@,$DFT_UPR_MODEL,;t t +s,@LD@,$LD,;t t +s,@LDFLAGS_SHARED@,$LDFLAGS_SHARED,;t t +s,@LDFLAGS_STATIC@,$LDFLAGS_STATIC,;t t +s,@LD_MODEL@,$LD_MODEL,;t t +s,@LD_SHARED_OPTS@,$LD_SHARED_OPTS,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@LIBTOOL_OPTS@,$LIBTOOL_OPTS,;t t +s,@LIB_CLEAN@,$LIB_CLEAN,;t t +s,@LIB_COMPILE@,$LIB_COMPILE,;t t +s,@LIB_LINK@,$LIB_LINK,;t t +s,@LINK_TESTS@,$LINK_TESTS,;t t +s,@LOCAL_LDFLAGS@,$LOCAL_LDFLAGS,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@PTHREAD@,$PTHREAD,;t t +s,@TEST_ARGS@,$TEST_ARGS,;t t +s,@TEST_DEPS@,$TEST_DEPS,;t t +s,@TEST_LIBS@,$TEST_LIBS,;t t +s,@TINFO_LDFLAGS@,$TINFO_LDFLAGS,;t t +s,@TINFO_LIBS@,$TINFO_LIBS,;t t +s,@cf_cv_abi_version@,$cf_cv_abi_version,;t t +s,@cf_cv_rel_version@,$cf_cv_rel_version,;t t +s,@includesubdir@,$includesubdir,;t t +s,@FGREP@,$FGREP,;t t +s,@HAVE_STDNORETURN_H@,$HAVE_STDNORETURN_H,;t t +s,@STDC_NORETURN@,$STDC_NORETURN,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t +s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t +s,@ECHO_LT@,$ECHO_LT,;t t +s,@ECHO_LD@,$ECHO_LD,;t t +s,@RULE_CC@,$RULE_CC,;t t +s,@SHOW_CC@,$SHOW_CC,;t t +s,@ECHO_CC@,$ECHO_CC,;t t +s,@DESTDIR@,$DESTDIR,;t t +s,@MERGE_PREFIX@,$MERGE_PREFIX,;t t +s,@NCURSES_WRAP_PREFIX@,$NCURSES_WRAP_PREFIX,;t t +s,@NCURSES_CONFIG@,$NCURSES_CONFIG,;t t +s,@ac_ct_NCURSES_CONFIG@,$ac_ct_NCURSES_CONFIG,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@XCURSES_CONFIG@,$XCURSES_CONFIG,;t t +s,@ac_ct_XCURSES_CONFIG@,$ac_ct_XCURSES_CONFIG,;t t +s,@cf_cv_screen@,$cf_cv_screen,;t t +s,@RGB_PATH@,$RGB_PATH,;t t +s,@no_x11_rgb@,$no_x11_rgb,;t t +s,@FORM_NAME@,$FORM_NAME,;t t +s,@MENU_NAME@,$MENU_NAME,;t t +s,@PANEL_NAME@,$PANEL_NAME,;t t +s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t +s,@cf_ldd_prog@,$cf_ldd_prog,;t t +s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t +CEOF + +EOF + + cat >>"$CONFIG_STATUS" <<\EOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while "$ac_more_lines"; do + if test "$ac_beg" -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag + else + sed "${ac_end}q" "$tmp"/subs.sed >"$tmp"/subs.frag + fi + if test ! -s "$tmp"/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && sed -e 's/\\\\*$//g' -e 's/$/\\/' -e 's/;t t\\/;t t/' -e 't' -e '3,'$ac_max_sed_lines's/$/\\/' "$tmp"/subs.frag) >"$tmp"/subs-$ac_sed_frag.sed + # It is possible to make a multiline substitution using escaped newlines. + # Ensure that we do not split the substitution between script fragments. + ac_BEG=$ac_end + ac_END=`expr "$ac_end" + "$ac_max_sed_lines"` + sed "1,${ac_BEG}d; ${ac_END}p; q" "$tmp"/subs.sed >"$tmp"/subs.next + if test -s "$tmp"/subs.next; then + grep '^s,@[^@,][^@,]*@,.*$' "$tmp"/subs.next | grep -v '^s,@.*;t t$' >"$tmp"/subs.edit + if test ! -s "$tmp"/subs.edit; then + grep "^s,@[^@,][^@,]*@,.*,;t t$" "$tmp"/subs.next >"$tmp"/subs.edit + if test ! -s "$tmp"/subs.edit; then + if test "$ac_beg" -gt 1; then + ac_end=`expr "$ac_end" - 1` + continue + fi + fi + fi + fi + + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f \"$tmp\"/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f \"$tmp\"/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr "$ac_sed_frag" + 1` + ac_beg=$ac_end + ac_end=`expr "$ac_end" + "$ac_max_sed_lines"` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="cat" + fi +fi # test -n "$CONFIG_FILES" + +EOF +cat >>"$CONFIG_STATUS" <<\EOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + - | *:- | *:-:* ) # input from stdin + cat >"$tmp"/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + ac_dir_suffix="/`echo "$ac_dir"|sed 's,^\./,,'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$srcdir" in + .) ac_srcdir=. + if test -z "$ac_dots"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo "$ac_dots" | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) + ac_srcdir="$srcdir$ac_dir_suffix"; + ac_top_srcdir="$srcdir" ;; + *) # Relative path. + ac_srcdir="$ac_dots$srcdir$ac_dir_suffix" + ac_top_srcdir="$ac_dots$srcdir" ;; + esac + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_dots$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:24754: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + configure_input="Generated automatically from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo "$tmp"/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:24772: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:24785: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +EOF +cat >>"$CONFIG_STATUS" <<\EOF + ac_warn_datarootdir=no + if test x"$ac_file" != x-; then + for ac_item in $ac_file_inputs + do + ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' "$ac_item"` + if test -n "$ac_seen"; then + ac_used=`grep '@datarootdir@' "$ac_item"` + if test -z "$ac_used"; then + { echo "$as_me:24801: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + fi + ac_seen=`grep '${datarootdir}' "$ac_item"` + if test -n "$ac_seen"; then + { echo "$as_me:24810: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + done + fi + +if test "x$ac_warn_datarootdir" = xyes; then + ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'" +fi + +EOF +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >"$tmp"/out + rm -f "$tmp"/stdin +EOF +test -n "${FGREP}" || FGREP="grep -F" +test -n "${EGREP}" || EGREP="grep -E" +cat >>"$CONFIG_STATUS" <>"$CONFIG_STATUS" <<\EOF + if test x"$ac_file" != x-; then + cp "$tmp/out" "$ac_file" + + for ac_name in prefix exec_prefix datarootdir + do + ac_seen=`$FGREP -n '${'$ac_name'[:=].*}' "$ac_file"` + if test -n "$ac_seen"; then + ac_init=`$EGREP '[ ]*'$ac_name'[ ]*=' "$ac_file"` + if test -z "$ac_init"; then + ac_seen=`echo "$ac_seen" |sed -e 's,^,'"$ac_file"':,'` + { echo "$as_me:24855: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&5 +echo "$as_me: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&2;} + fi + fi + done + $EGREP -n '@[a-z_][a-z_0-9]+@' "$ac_file" >"$tmp"/out + $EGREP -n '@[A-Z_][A-Z_0-9]+@' "$ac_file" >>"$tmp"/out + if test -s "$tmp"/out; then + ac_seen=`sed -e 's,^,'"$ac_file"':,' < "$tmp"/out` + { echo "$as_me:24866: WARNING: Some variables may not be substituted: +$ac_seen" >&5 +echo "$as_me: WARNING: Some variables may not be substituted: +$ac_seen" >&2;} + fi + else + cat "$tmp"/out + fi + rm -f "$tmp"/out + +done +EOF +cat >>"$CONFIG_STATUS" <<\EOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_iB='\([ ]\),\1#\2define\3' +ac_iC=' ' +ac_iD='\4,;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + - | *:- | *:-:* ) # input from stdin + cat >"$tmp"/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:24915: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo "$tmp"/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:24926: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:24939: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >"$tmp"/in + +EOF + +# Transform confdefs.h into a list of #define's. We won't use it as a sed +# script, but as data to insert where we see @DEFS@. We expect AC_SAVE_DEFS to +# be either 'cat' or 'sort'. +cat confdefs.h | uniq >conftest.vals + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +echo ' rm -f conftest.frag' >> "$CONFIG_STATUS" +while grep . conftest.vals >/dev/null +do + # Write chunks of a limited-size here document to conftest.frag. + echo ' cat >> conftest.frag <> "$CONFIG_STATUS" + sed "${ac_max_here_lines}q" conftest.vals | sed -e 's/#ifdef.*/#if 0/' >> "$CONFIG_STATUS" + echo 'CEOF' >> "$CONFIG_STATUS" + sed "1,${ac_max_here_lines}d" conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +# Run sed to substitute the contents of conftest.frag into $tmp/in at the +# marker @DEFS@. +echo ' cat >> conftest.edit < "$tmp"/out +rm -f "$tmp"/in +mv "$tmp"/out "$tmp"/in +rm -f conftest.edit conftest.frag +' >> "$CONFIG_STATUS" + +cat >>"$CONFIG_STATUS" <<\EOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated automatically by configure. */" >"$tmp"/config.h + else + echo "/* $ac_file. Generated automatically by configure. */" >"$tmp"/config.h + fi + cat "$tmp"/in >>"$tmp"/config.h + rm -f "$tmp"/in + if test x"$ac_file" != x-; then + if cmp -s "$ac_file" "$tmp/config.h" 2>/dev/null; then + { echo "$as_me:24997: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + fi + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" + fi + else + cat "$tmp"/config.h + rm -f "$tmp"/config.h + fi +done +EOF +cat >>"$CONFIG_STATUS" <<\EOF +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + + case "$ac_dest" in + default ) + +for cf_dir in . +do + if test ! -d "$srcdir/$cf_dir" ; then + continue + elif test -f "$srcdir/$cf_dir/programs" ; then + $AWK -f $srcdir/mk-test.awk INSTALL=yes ECHO_LINK="$ECHO_LD" "$srcdir/$cf_dir/programs" >>$cf_dir/Makefile + fi +done + + cat >>Makefile <>Makefile <>Makefile <>"$CONFIG_STATUS" <<\EOF + +{ (exit 0); exit 0; } +EOF +chmod +x "$CONFIG_STATUS" +ac_clean_files=$ac_clean_files_save + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL "$CONFIG_STATUS" || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + "$ac_cs_success" || { (exit 1); exit 1; } +fi + diff --git a/contrib/ncurses/test/configure.in b/contrib/ncurses/test/configure.in new file mode 100644 index 00000000..5f5c279a --- /dev/null +++ b/contrib/ncurses/test/configure.in @@ -0,0 +1,541 @@ +dnl*************************************************************************** +dnl Copyright 2018-2023,2024 Thomas E. Dickey * +dnl Copyright 1998-2017,2018 Free Software Foundation, Inc. * +dnl * +dnl Permission is hereby granted, free of charge, to any person obtaining a * +dnl copy of this software and associated documentation files (the * +dnl "Software"), to deal in the Software without restriction, including * +dnl without limitation the rights to use, copy, modify, merge, publish, * +dnl distribute, distribute with modifications, sublicense, and/or sell * +dnl copies of the Software, and to permit persons to whom the Software is * +dnl furnished to do so, subject to the following conditions: * +dnl * +dnl The above copyright notice and this permission notice shall be included * +dnl in all copies or substantial portions of the Software. * +dnl * +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +dnl IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +dnl DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +dnl OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +dnl THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +dnl * +dnl Except as contained in this notice, the name(s) of the above copyright * +dnl holders shall not be used in advertising or otherwise to promote the * +dnl sale, use or other dealings in this Software without prior written * +dnl authorization. * +dnl*************************************************************************** +dnl +dnl Author: Thomas E. Dickey 1996-on +dnl +dnl $Id: configure.in,v 1.178 2024/08/11 09:08:54 tom Exp $ +dnl This is a simple configuration-script for the ncurses test programs that +dnl allows the test-directory to be separately configured against a reference +dnl system (i.e., sysvr4 curses) +dnl +dnl If you're configuring ncurses, you shouldn't need to use this script. +dnl It's only for testing purposes. +dnl +dnl For additional information, see +dnl https://invisible-island.net/autoconf/ +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl https://invisible-island.net/ncurses/ncurses-examples.html +dnl --------------------------------------------------------------------------- +AC_PREREQ(2.52.20210509) +AC_INIT(ncurses.c) +AC_CONFIG_HEADER(ncurses_cfg.h:ncurses_tst.hin) + +CF_INHERIT_SCRIPT(config.guess) +CF_INHERIT_SCRIPT(config.sub) + +CF_HELP_MESSAGE(General Options:) + +CF_WITH_SYSTYPE +AC_PROG_MAKE_SET +CF_PROG_CC +AC_C_INLINE +AC_PROG_CPP +AC_PROG_AWK +CF_PROG_INSTALL +CF_INSTALL_OPTS +CF_PROG_LINT +CF_MAKE_PHONY +CF_MAKE_TAGS + +CF_MATH_LIB(MATH_LIB,pow(sin(x),x)) +AC_SUBST(MATH_LIB) + +dnl Things that we don't need (or must override) if we're not building ncurses +CF_TOP_BUILDDIR +CC_G_OPT="-g" AC_SUBST(CC_G_OPT) +CC_SHARED_OPTS=unknown AC_SUBST(CC_SHARED_OPTS) +CPPFLAGS="$CPPFLAGS" AC_SUBST(CPPFLAGS) +DFT_DEP_SUFFIX="" AC_SUBST(DFT_DEP_SUFFIX) +DFT_OBJ_SUBDIR=`pwd|sed -e's:.*/::'` AC_SUBST(DFT_OBJ_SUBDIR) +DFT_UPR_MODEL="NORMAL" AC_SUBST(DFT_UPR_MODEL) +LD="ld" AC_SUBST(LD) +LDFLAGS_SHARED="" AC_SUBST(LDFLAGS_SHARED) +LDFLAGS_STATIC="" AC_SUBST(LDFLAGS_STATIC) +LD_MODEL="" AC_SUBST(LD_MODEL) +LD_SHARED_OPTS="" AC_SUBST(LD_SHARED_OPTS) +LIBTOOL="" AC_SUBST(LIBTOOL) +LIBTOOL_OPTS="" AC_SUBST(LIBTOOL_OPTS) +LIB_CLEAN="" AC_SUBST(LIB_CLEAN) +LIB_COMPILE="" AC_SUBST(LIB_COMPILE) +LIB_LINK='${CC}' AC_SUBST(LIB_LINK) +LINK_TESTS="" AC_SUBST(LINK_TESTS) +LOCAL_LDFLAGS="" AC_SUBST(LOCAL_LDFLAGS) +PACKAGE="ncurses-examples" AC_SUBST(PACKAGE) +PTHREAD="-lm" AC_SUBST(PTHREAD) +TEST_ARGS="" AC_SUBST(TEST_ARGS) +TEST_DEPS="" AC_SUBST(TEST_DEPS) +TEST_LIBS="" AC_SUBST(TEST_LIBS) +TINFO_LDFLAGS='' AC_SUBST(TINFO_LDFLAGS) +TINFO_LIBS='$(LIBS_CURSES)' AC_SUBST(TINFO_LIBS) +cf_cv_abi_version="" AC_SUBST(cf_cv_abi_version) +cf_cv_rel_version="" AC_SUBST(cf_cv_rel_version) +includesubdir="" AC_SUBST(includesubdir) + +cf_cv_screen=curses +cf_cv_libtype= + +AC_EXEEXT +AC_OBJEXT + +CF_GCC_ATTRIBUTES +CF_ENABLE_STRING_HACKS +CF_XOPEN_SOURCE(600) +AC_CHECK_DECL(exit) +CF_SIG_ATOMIC_T + +# Work around breakage on OS X +CF_SIGWINCH + +# Checks for CODESET support. +AM_LANGINFO_CODESET + +dnl --------------------------------------------------------------------------- +CF_PKG_CONFIG +CF_DISABLE_ECHO +CF_INSTALL_PREFIX + +dnl --------------------------------------------------------------------------- +CF_HELP_MESSAGE(Curses Version-dependent Options:) +CF_NCURSES_WRAP_PREFIX + +AC_MSG_CHECKING(if you want to check for wide-character functions) +CF_ARG_DISABLE(widec, + [ --disable-widec disable checks for wide-character functions], + cf_enable_widec=no, + cf_enable_widec=yes, + yes) +AC_MSG_RESULT($cf_enable_widec) + +dnl --------------------------------------------------------------------------- +CF_HELP_MESSAGE(Curses Version-dependent Options:) +CF_WITH_NCURSES_ETC + +case $cf_cv_screen in +(ncurses*) + cf_cv_libtype=`echo "$cf_cv_screen" | sed -e 's/^ncurses//'` + ;; +esac + +CF_WITH_X11_RGB + +dnl If we've not specified a library, assume we're using sysvr4 libraries +dnl installed conventionally (e.g., SunOS 5.x - solaris). + +dnl Autoconf builds up the $LIBS in reverse order + +cf_curses_headers= + +case $cf_cv_screen in +(pdcurses) + cf_default_panel=no + cf_default_form=no + cf_default_menu=no + cf_default_tinfo=no + ;; +(xcurses|bsdcurses) + cf_default_panel=no + cf_default_form=no + cf_default_menu=no + cf_default_tinfo=yes + ;; +(*) + cf_default_panel=yes + cf_default_form=yes + cf_default_menu=yes + cf_default_tinfo=yes + case $cf_cv_screen in + (ncurses*) + cf_curses_headers="nc_alloc.h nomacros.h term_entry.h" + ;; + esac + ;; +esac + +CF_WITH_LIB_BASENAME(FORM_NAME,form) +CF_WITH_LIB_BASENAME(MENU_NAME,menu) +CF_WITH_LIB_BASENAME(PANEL_NAME,panel) + +AC_MSG_CHECKING(if you want to check for panel functions) +CF_ARG_DISABLE(panel, + [ --disable-panel disable checks for panel functions], + cf_enable_panel=no, + cf_enable_panel=$cf_default_panel, + yes) +AC_MSG_RESULT($cf_enable_panel) +if test $cf_enable_panel = yes +then + CF_CHECK_CURSES_LIB($PANEL_NAME,$cf_cv_libtype,new_panel,0) + cf_curses_headers="$cf_curses_headers panel.h" +fi + +AC_MSG_CHECKING(if you want to check for menu functions) +CF_ARG_DISABLE(menu, + [ --disable-menu disable checks for menu functions], + cf_enable_menu=no, + cf_enable_menu=$cf_default_menu, + yes) +AC_MSG_RESULT($cf_enable_menu) +if test $cf_enable_menu = yes +then + case $cf_cv_screen in + (ncurses*) + ;; + (curses*) + CF_NETBSD_MENU_H + ;; + esac + CF_CHECK_CURSES_LIB($MENU_NAME,$cf_cv_libtype,menu_driver,[0,0]) + cf_curses_headers="$cf_curses_headers menu.h" +fi + +AC_MSG_CHECKING(if you want to check for form functions) +CF_ARG_DISABLE(form, + [ --disable-form disable checks for form functions], + cf_enable_form=no, + cf_enable_form=$cf_default_form, + yes) +AC_MSG_RESULT($cf_enable_form) +if test $cf_enable_form = yes +then + case $cf_cv_screen in + (ncurses*) + ;; + (curses*) + CF_NETBSD_FORM_H + ;; + esac + CF_CHECK_CURSES_LIB($FORM_NAME,$cf_cv_libtype,form_driver,[0,0]) + cf_curses_headers="$cf_curses_headers form.h" +fi + +# look for curses-related headers +AC_CHECK_HEADERS( $cf_curses_headers ) + +AC_HEADER_TIME +AC_CHECK_HEADERS( \ +locale.h \ +math.h \ +stdarg.h \ +sys/ioctl.h \ +sys/select.h \ +sys/time.h \ +termios.h \ +) + +CF_GETOPT_HEADER +CF_FUNC_GETTIME + +AC_CHECK_FUNCS( \ +getopt \ +snprintf \ +strdup \ +strstr \ +tsearch \ +) + +# use a compile-check to work with ncurses*-config and subdirectory includes +AC_CACHE_CHECK(if we can use termcap.h,cf_cv_have_termcap_h,[ + AC_TRY_COMPILE([ +#include +#ifdef NCURSES_VERSION +#undef NCURSES_VERSION +#endif +#include +#ifndef NCURSES_VERSION +#error wrong header +#endif +], + [return 0;], + [cf_cv_have_termcap_h=yes], + [cf_cv_have_termcap_h=no])]) +if test "x$cf_cv_have_termcap_h" = xyes +then + AC_DEFINE(HAVE_TERMCAP_H,1,[Define to 1 if we can use termcap.h]) +else +AC_CACHE_CHECK(if we can use ncurses/termcap.h,cf_cv_have_ncurses_termcap_h,[ + AC_TRY_COMPILE([ +#include +#ifdef NCURSES_VERSION +#undef NCURSES_VERSION +#endif +#include +#ifndef NCURSES_VERSION +#error wrong header +#endif +], + [return 0;], + [cf_cv_have_ncurses_termcap_h=yes], + [cf_cv_have_ncurses_termcap_h=no])]) +test "x$cf_cv_have_ncurses_termcap_h" = xyes && AC_DEFINE(HAVE_NCURSES_TERMCAP_H,1,[Define to 1 if we can use ncurses/termcap.h]) +fi + +if test "x$ac_cv_func_getopt" = xno; then + AC_MSG_ERROR(getopt is required for building programs) +fi + +if test "$cf_enable_widec" = yes; then +AC_CHECK_FUNCS( \ +mblen \ +mbrlen \ +mbrtowc \ +mbsrtowcs \ +mbstowcs \ +mbtowc \ +wcsrtombs \ +wcstombs \ +) +fi + +CF_CURSES_FUNCS( \ +_nc_tparm_analyze \ +_tracef \ +alloc_pair \ +assume_default_colors \ +chgat \ +color_content \ +color_set \ +copywin \ +curses_trace \ +delscreen \ +dupwin \ +exit_curses \ +exit_terminfo \ +filter \ +getbegx \ +getcurx \ +getmaxx \ +getnstr \ +getparx \ +getwin \ +halfdelay \ +init_extended_color \ +mvderwin \ +mvvline \ +mvwin \ +mvwvline \ +napms \ +newpad \ +putwin \ +reset_color_pairs \ +resize_term \ +resizeterm \ +restartterm \ +ripoffline \ +scr_dump \ +setupterm \ +slk_color \ +slk_init \ +termattrs \ +termname \ +tgetent \ +tigetnum \ +tigetstr \ +tiparm \ +tiparm_s \ +tiscan_s \ +tputs_sp \ +typeahead \ +unget_wch \ +use_default_colors \ +use_env \ +use_extended_names \ +use_screen \ +use_window \ +vid_puts \ +vidputs \ +vsscanf \ +vw_printw \ +wchgat \ +winsdelln \ +winsstr \ +wresize \ +wsyncdown \ +) + +CF_TPUTS_PROTO +CF_NCURSES_EXT_FUNCS + +if test "$cf_enable_widec" = yes +then + # workaround for systems with ncurses before 20111029, due to change of + # feature test macro from _XPG5 to _XOPEN_SOURCE + if test -n "$cf_cv_ncurses_version" && test "x$cf_cv_ncurses_version" != xno + then + cf_define_xpg5=no + AC_MSG_CHECKING(if _XPG5 should be defined to enable wide-characters) + + AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}>], + [int x = _XPG5],, + [cf_save_cppflags="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -D_XPG5" + AC_TRY_COMPILE([ +#include <${cf_cv_ncurses_header:-curses.h}>], + [int x = _XPG5], + [cf_define_xpg5=yes]) + CPPFLAGS="$cf_save_cppflags"]) + AC_MSG_RESULT($cf_define_xpg5) + + if test "$cf_define_xpg5" = yes + then + CPPFLAGS="$CPPFLAGS -D_XPG5" + fi + fi + + AC_CACHE_CHECK(for wide-character functions,cf_cv_widechar_funcs,[ + AC_TRY_LINK([ +#include <${cf_cv_ncurses_header:-curses.h}>], + [ + static wchar_t src_wchar[2]; + static cchar_t dst_cchar; + setcchar(&dst_cchar, src_wchar, A_NORMAL, 0, (void *) 0); + ], + [cf_cv_widechar_funcs=yes], + [cf_cv_widechar_funcs=no]) + ]) + if test "$cf_cv_widechar_funcs" != no ; then + AC_DEFINE(USE_WIDEC_SUPPORT,1,[Define to 1 to enable wide-character support in (n)curses]) + else + AC_DEFINE(USE_WIDEC_SUPPORT,0) + fi +else + AC_DEFINE(USE_WIDEC_SUPPORT,0) +fi + +AC_CACHE_CHECK(if $cf_cv_screen library uses pthreads,cf_cv_use_pthreads,[ +AC_TRY_LINK([ +#include <${cf_cv_ncurses_header:-curses.h}> +extern void _nc_init_pthreads(void); +], +[ + initscr(); + _nc_init_pthreads(); + ], + [cf_cv_use_pthreads=yes], + [cf_cv_use_pthreads=no]) +]) +test $cf_cv_use_pthreads = yes && AC_DEFINE(USE_PTHREADS,1,[Define to 1 if $cf_cv_screen library uses pthreads]) + +CF_SYS_TIME_SELECT + +# special check for test/ditto.c +CF_FUNC_OPENPTY +if test "$cf_cv_func_openpty" != no ; then + AC_DEFINE_UNQUOTED(USE_OPENPTY_HEADER,<$cf_cv_func_openpty>,[Define to actual header for openpty function]) + AC_DEFINE(USE_XTERM_PTY,1,[Define to 1 if we should assume xterm pseudoterminal interface]) + if test "x$cf_cv_lib_util" = xyes ; then + CF_ADD_LIB(util,TEST_LIBS) + fi +fi + +CF_FUNC_CURSES_VERSION + +CF_CURSES_ACS_MAP +if test "$cf_enable_widec" = yes; then + CF_CURSES_WACS_MAP + CF_CURSES_WACS_SYMBOLS +fi + +CF_CURSES_CHECK_TYPE(attr_t,long) + +if test "$cf_enable_widec" = yes; then + CF_WCHAR_TYPE(mbstate_t, NCURSES_MBSTATE_T, NCURSES_OK_MBSTATE_T) + CF_WCHAR_TYPE(wchar_t, NCURSES_WCHAR_T, NCURSES_OK_WCHAR_T) + CF_WCHAR_TYPE(wint_t, NCURSES_WINT_T, NCURSES_OK_WINT_T) + + if test "$NCURSES_OK_MBSTATE_T" = 0 ; then + CF_CURSES_CHECK_TYPE(mbstate_t,long) + fi + + if test "$NCURSES_OK_WCHAR_T" = 0 ; then + CF_CURSES_CHECK_TYPE(wchar_t,long) + fi + + if test "$NCURSES_OK_WINT_T" = 0 ; then + CF_CURSES_CHECK_TYPE(wint_t,long) + fi +fi + +CF_CURSES_CHECK_DATA(\ +TABSIZE \ +curscr \ +ospeed \ +boolnames \ +boolfnames \ +ttytype) + +dnl --------------------------------------------------------------------------- +CF_HELP_MESSAGE(Testing/development Options:) +CF_WITH_SCREEN_PDCURSES +CF_ENABLE_WARNINGS(Wno-unknown-pragmas) +CF_DISABLE_LEAKS +CF_DISABLE_RPATH_HACK + +TEST_ARGS="$LIBS" +LIBS= + +dnl --------------------------------------------------------------------------- + +AC_OUTPUT(Makefile,[ +CF_PRG_RULES([$srcdir/mk-test.awk INSTALL=yes ECHO_LINK="$ECHO_LD"], .) + cat >>Makefile <>Makefile <>Makefile < + +#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS + +#define MY_LOGFILE "demo_altkeys.log" +#define MY_KEYS (KEY_MAX + 1) + +/* + * Log the most recently-written line to our logfile + */ +static void +log_last_line(WINDOW *win) +{ + FILE *fp; + + if ((fp = fopen(MY_LOGFILE, "a")) != 0) { + char temp[256]; + int y, x, n; + int need = sizeof(temp) - 1; + + if (need > COLS) + need = COLS; + getyx(win, y, x); + wmove(win, y - 1, 0); + n = winnstr(win, temp, need); + while (n-- > 0) { + if (isspace(UChar(temp[n]))) + temp[n] = '\0'; + else + break; + } + wmove(win, y, x); + fprintf(fp, "%s\n", temp); + fclose(fp); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_altkeys [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int n; + int ch; + TimeType previous; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + unlink(MY_LOGFILE); + + setlocale(LC_ALL, ""); + if (newterm(0, stdout, stdin) == 0) { + fprintf(stderr, "Cannot initialize terminal\n"); + ExitProgram(EXIT_FAILURE); + } + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + scrollok(stdscr, TRUE); + keypad(stdscr, TRUE); + move(0, 0); + + /* we do the define_key() calls after keypad(), since the first call to + * keypad() initializes the corresponding data. + */ + for (n = 0; n < 255; ++n) { + char temp[10]; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\033%c", n); + define_key(temp, n + MY_KEYS); + } + for (n = KEY_MIN; n < KEY_MAX; ++n) { + char *value; + if ((value = keybound(n, 0)) != 0) { + size_t need = strlen(value) + 2; + char *temp = typeMalloc(char, need); + _nc_SPRINTF(temp, _nc_SLIMIT(need) "\033%s", value); + define_key(temp, n + MY_KEYS); + free(temp); + free(value); + } + } + + GetClockTime(&previous); + + while ((ch = getch()) != ERR) { + bool escaped = (ch >= MY_KEYS); + const char *name = keyname(escaped ? (ch - MY_KEYS) : ch); + TimeType current; + + GetClockTime(¤t); + printw("%6.03f ", ElapsedSeconds(&previous, ¤t)); + previous = current; + printw("Keycode %d, name %s%s\n", + ch, + escaped ? "ESC-" : "", + name != 0 ? name : ""); + log_last_line(stdscr); + clrtoeol(); + if (ch == 'q') + break; + } + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/demo_defkey.c b/contrib/ncurses/test/demo_defkey.c new file mode 100644 index 00000000..215f79b0 --- /dev/null +++ b/contrib/ncurses/test/demo_defkey.c @@ -0,0 +1,316 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2002-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: demo_defkey.c,v 1.36 2024/10/05 18:20:04 tom Exp $ + * + * Demonstrate the define_key() function. + * Thomas Dickey - 2002/11/23 + */ + +#include + +#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS + +#define MY_LOGFILE "demo_defkey.log" + +/* + * Log the most recently-written line to our logfile + */ +static void +log_last_line(WINDOW *win) +{ + FILE *fp; + + if ((fp = fopen(MY_LOGFILE, "a")) != 0) { + char temp[256]; + int y, x, n; + int need = sizeof(temp) - 1; + if (need > COLS) + need = COLS; + getyx(win, y, x); + wmove(win, y - 1, 0); + n = winnstr(win, temp, need); + while (n-- > 0) { + if (isspace(UChar(temp[n]))) + temp[n] = '\0'; + else + break; + } + wmove(win, y, x); + fprintf(fp, "%s\n", temp); + fclose(fp); + } +} + +/* + * Convert a character to visible form. + */ +static char * +visichar(int ch) +{ + static char temp[20]; + + ch = UChar(ch); + assert(ch >= 0 && ch < 256); + if (ch == '\\') { + _nc_STRCPY(temp, "\\\\", sizeof(temp)); + } else if (ch == '\033') { + _nc_STRCPY(temp, "\\E", sizeof(temp)); + } else if (ch < ' ') { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", ch); + } else if (ch >= 127) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "\\%03o", ch); + } else { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%c", ch); + } + return temp; +} + +/* + * Convert a string to visible form. + */ +static char * +visible(const char *string) +{ + char *result = 0; + + if (VALID_STRING(string) && *string != '\0') { + int pass; + int n; + size_t need = 1; + + for (pass = 0; pass < 2; ++pass) { + for (n = 0; string[n] != '\0'; ++n) { + char temp[80]; + _nc_STRNCPY(temp, visichar(string[n]), sizeof(temp) - 2); + if (pass) { + _nc_STRCAT(result, temp, need); + } else { + need += strlen(temp); + } + } + if (!pass) + result = typeCalloc(char, need); + } + } else { + result = typeCalloc(char, (size_t) 1); + } + return result; +} + +static void +really_define_key(WINDOW *win, const char *new_string, int code) +{ + int rc; + const char *code_name = keyname(code); + char *old_string; + char *vis_string = 0; + char temp[80]; + + if (code_name == 0) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "Keycode %d", code); + code_name = temp; + } + + if ((old_string = keybound(code, 0)) != 0) { + wprintw(win, "%s is %s\n", + code_name, + vis_string = visible(old_string)); + } else { + wprintw(win, "%s is not bound\n", + code_name); + } + log_last_line(win); + + free(vis_string); + vis_string = visible(new_string); + if ((rc = key_defined(new_string)) > 0) { + wprintw(win, "%s was bound to %s\n", vis_string, keyname(rc)); + log_last_line(win); + } else if (new_string != 0 && rc < 0) { + wprintw(win, "%s conflicts with longer strings\n", vis_string); + log_last_line(win); + } + rc = define_key(new_string, code); + if (rc == ERR) { + wprintw(win, "%s unchanged\n", code_name); + log_last_line(win); + } else if (new_string != 0) { + wprintw(win, "%s is now bound to %s\n", + vis_string, + code_name); + log_last_line(win); + } else if (old_string != 0) { + wprintw(win, "%s deleted\n", code_name); + log_last_line(win); + } + if (vis_string != 0) + free(vis_string); + if (old_string != 0) + free(old_string); +} + +static void +duplicate(WINDOW *win, NCURSES_CONST char *name, int code) +{ + char *value = tigetstr(name); + + if (VALID_STRING(value)) { + const char *prefix = 0; + + if (!(strncmp) (value, "\033[", (size_t) 2)) { + prefix = "\033O"; + } else if (!(strncmp) (value, "\033O", (size_t) 2)) { + prefix = "\033["; + } + if (prefix != 0) { + char temp[BUFSIZ]; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%s%s", prefix, value + 2); + really_define_key(win, temp, code); + } + } +} + +static void +redefine(WINDOW *win, const char *string, int code) +{ + really_define_key(win, string, code); +} + +static void +remove_definition(WINDOW *win, int code) +{ + really_define_key(win, 0, code); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_defkey [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + char *fkeys[12]; + int n; + int ch; + WINDOW *win; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + unlink(MY_LOGFILE); + + setlocale(LC_ALL, ""); + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + printw("This demo is best on xterm: it reverses the definitions for f1-f12,\n"); + printw("adds duplicate definitions for cursor application and normal modes,\n"); + printw("and removes any definitions for the mini keypad. Type any of those:\n"); + refresh(); + + win = newwin(LINES - 3, COLS, 3, 0); + scrollok(win, TRUE); + keypad(win, TRUE); + wmove(win, 0, 0); + + /* we do the define_key() calls after keypad(), since the first call to + * keypad() initializes the corresponding data. + */ + for (n = 0; n < 12; ++n) { + char name[20]; + _nc_SPRINTF(name, _nc_SLIMIT(sizeof(name)) "kf%d", n + 1); + fkeys[n] = tigetstr(name); + } + for (n = 0; n < 12; ++n) { + redefine(win, fkeys[11 - n], KEY_F(n + 1)); + } + + duplicate(win, "kcub1", KEY_LEFT); + duplicate(win, "kcuu1", KEY_UP); + duplicate(win, "kcud1", KEY_DOWN); + duplicate(win, "kcuf1", KEY_RIGHT); + + remove_definition(win, KEY_A1); + remove_definition(win, KEY_A3); + remove_definition(win, KEY_B2); + remove_definition(win, KEY_C1); + remove_definition(win, KEY_C3); + + really_define_key(win, "\033O", 1023); + + while ((ch = wgetch(win)) != ERR) { + const char *name = keyname(ch); + wprintw(win, "Keycode %d, name %s\n", + ch, + name != 0 ? name : ""); + log_last_line(win); + wclrtoeol(win); + if (ch == 'q') + break; + } + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/demo_forms.c b/contrib/ncurses/test/demo_forms.c new file mode 100644 index 00000000..a9737590 --- /dev/null +++ b/contrib/ncurses/test/demo_forms.c @@ -0,0 +1,651 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2003-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: demo_forms.c,v 1.67 2024/10/06 21:15:12 tom Exp $ + * + * Demonstrate a variety of functions from the form library. + * Thomas Dickey - 2003/4/26 + */ + +#include + +#if USE_LIBFORM + +#include + +typedef struct { + char *name; + char *value; +} MY_DATA; + +static MY_DATA *my_data; + +static int d_option = 0; +static int j_value = 0; +static int m_value = 0; +static int o_value = 0; +static char *t_value = 0; + +static void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + +static void +chomp(char *value) +{ + size_t have = strlen(value); + while (have != 0 && (value[have - 1] == '\n' || value[have - 1] == '\r')) { + value[--have] = '\0'; + } +} + +static int +trimmed(const char *value) +{ + int result = (int) strlen(value); + while (result > 0 && isspace(UChar(value[result - 1]))) { + --result; + } + return result; +} + +static char * +get_data(const char *name) +{ + char *result = t_value; + if (my_data != 0) { + int n; + for (n = 0; my_data[n].name != 0; ++n) { + if (!strcmp(name, my_data[n].name)) { + result = my_data[n].value; + break; + } + } + } + return result; +} + +/* + * Read (possibly) multi-line data with name+value pairs. + */ +static void +read_data(const char *filename) +{ + FILE *fp = fopen(filename, "r"); + + if (fp != 0) { + char buffer[BUFSIZ]; + char *colon; + int more = 0; + int item = 0; + + my_data = typeCalloc(MY_DATA, (size_t) 100); /* FIXME */ + while (fgets(buffer, sizeof(buffer), fp) != 0) { + chomp(buffer); + if (more) { + if (strcmp(buffer, ".")) { + char *prior = my_data[more - 1].value; + size_t need = strlen(buffer) + 2 + strlen(prior); + char *value = typeRealloc(char, need, prior); + if (value == 0) + failed("realloc"); + _nc_STRCAT(value, "\n", need); + _nc_STRCAT(value, buffer, need); + my_data[more - 1].value = value; + } else { + more = 0; + } + } else if (*buffer == '#') { + continue; + } else if ((colon = strchr(buffer, ':')) != 0) { + char *name; + char *value; + *colon++ = '\0'; + name = strdup(buffer); + value = strdup(colon); + if (name == 0 || value == 0) + failed("strdup"); + my_data[item].name = name; + my_data[item].value = value; + more = ++item; + } else { + failed("expected a colon"); + } + } + fclose(fp); + } else { + failed(filename); + } +} + +static FIELD * +make_label(NCURSES_CONST char *label, int frow, int fcol) +{ + FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0); + + if (f) { + set_field_buffer(f, 0, label); + set_field_opts(f, (int) ((unsigned) field_opts(f) & (unsigned) ~O_ACTIVE)); + } + return (f); +} + +/* + * Define each field with an extra one, for reflecting "actual" text. + */ +static FIELD * +make_field(const char *label, int frow, int fcol, int rows, int cols) +{ + FIELD *f = new_field(rows, cols, frow, fcol, o_value, 1); + + if (f) { + set_field_back(f, A_UNDERLINE); + /* + * If -j and -d options are combined, -j loses. It is documented in + * "Character User Interface Programming", page 12-15 that setting + * O_STATIC off makes the form library ignore justification. + */ + set_field_just(f, j_value); + if (d_option) { + if (has_colors()) { + set_field_fore(f, (chtype) COLOR_PAIR(2)); + set_field_back(f, (A_UNDERLINE | (chtype) COLOR_PAIR(3))); + } else { + set_field_fore(f, A_BOLD); + } + /* + * The field_opts_off() call dumps core with Solaris curses, + * but that is a known bug in Solaris' form library -TD + */ + field_opts_off(f, O_STATIC); + set_max_field(f, m_value); + } + + init_edit_field(f, get_data(label)); + } + return (f); +} + +static void +display_form(FORM *f) +{ + WINDOW *w; + int rows, cols; + + scale_form(f, &rows, &cols); + + /* + * Put the form at the upper-left corner of the display, with just a box + * around it. + */ + if ((w = newwin(rows + 2, cols + 4, 0, 0)) != (WINDOW *) 0) { + set_form_win(f, w); + set_form_sub(f, derwin(w, rows, cols, 1, 2)); + box(w, 0, 0); + keypad(w, TRUE); + + if (post_form(f) != E_OK) + wrefresh(w); + } +} + +static void +erase_form(FORM *f) +{ + WINDOW *w = form_win(f); + WINDOW *s = form_sub(f); + + unpost_form(f); + werase(w); + wrefresh(w); + delwin(s); + delwin(w); +} + +static void +show_insert_mode(bool insert_mode) +{ + MvAddStr(5, 57, (insert_mode + ? "form_status: insert " + : "form_status: overlay")); +} + +#define O_SELECTABLE (O_ACTIVE | O_VISIBLE) + +static FIELD * +another_field(NCURSES_CONST FORM *form, NCURSES_CONST FIELD *const field) +{ + FIELD **f = form_fields(form); + FIELD *result = 0; + int n; + + for (n = 0; f[n] != 0; ++n) { + if (f[n] != field) { + result = f[n]; + field_opts_on(result, O_SELECTABLE); + break; + } + } + return result; +} + +static int +my_form_driver(FORM *form, int c) +{ + static bool insert_mode = TRUE; + FIELD *field; + + switch (c) { + case MY_QUIT: + if (form_driver(form, REQ_VALIDATION) == E_OK) + return (TRUE); + break; + case MY_HELP: + help_edit_field(); + break; + case MY_EDT_MODE: + if ((field = current_field(form)) != 0) { + set_current_field(form, another_field(form, field)); + if ((unsigned) field_opts(field) & O_EDIT) { + field_opts_off(field, O_EDIT); + set_field_status(field, 0); + } else { + field_opts_on(field, O_EDIT); + } + set_current_field(form, field); + } + break; + case MY_INS_MODE: + /* there should be a form_status() function, but there is none */ + if (!insert_mode) { + if (form_driver(form, REQ_INS_MODE) == E_OK) { + insert_mode = TRUE; + } + } else { + if (form_driver(form, REQ_OVL_MODE) == E_OK) { + insert_mode = FALSE; + } + } + show_insert_mode(insert_mode); + refresh(); + break; + default: + beep(); + break; + } + return (FALSE); +} + +static void +show_current_field(WINDOW *win, NCURSES_CONST FORM *form) +{ + NCURSES_CONST FIELD *field; + int field_rows, field_cols, field_max; + int currow, curcol; + + if (has_colors()) { + wbkgd(win, (chtype) COLOR_PAIR(1)); + } + werase(win); + form_getyx(form, currow, curcol); + wprintw(win, "Cursor: %d,%d", currow, curcol); + if (data_ahead(form)) + waddstr(win, " ahead"); + if (data_behind(form)) + waddstr(win, " behind"); + waddch(win, '\n'); + + if ((field = current_field(form)) != 0) { + NCURSES_CONST FIELDTYPE *type; + int nbuf; + + wprintw(win, "Page %d%s, Field %d/%d%s:", + form_page(form), + new_page(field) ? "*" : "", + field_index(field), field_count(form), + field_arg(field) ? "(arg)" : ""); + if ((type = field_type(field)) != 0) { + if (type == TYPE_ALNUM) + waddstr(win, "ALNUM"); + else if (type == TYPE_ALPHA) + waddstr(win, "ALPHA"); + else if (type == TYPE_ENUM) + waddstr(win, "ENUM"); + else if (type == TYPE_INTEGER) + waddstr(win, "INTEGER"); +#ifdef NCURSES_VERSION + else if (type == TYPE_IPV4) + waddstr(win, "IPV4"); +#endif + else if (type == TYPE_NUMERIC) + waddstr(win, "NUMERIC"); + else if (type == TYPE_REGEXP) + waddstr(win, "REGEXP"); + else + waddstr(win, "other"); + } + + if ((unsigned) field_opts(field) & O_EDIT) + waddstr(win, " editable"); + else + waddstr(win, " readonly"); + + if (field_status(field)) + waddstr(win, " modified"); + + if (dynamic_field_info(field, &field_rows, &field_cols, &field_max) + != ERR) { + wprintw(win, " size %dx%d (max %d)", + field_rows, field_cols, field_max); + } + + waddch(win, ' '); + (void) wattrset(win, AttrArg(field_fore(field), 0)); + waddstr(win, "fore"); + wattroff(win, (int) field_fore(field)); + + waddch(win, '/'); + + (void) wattrset(win, AttrArg(field_back(field), 0)); + waddstr(win, "back"); + wattroff(win, (int) field_back(field)); + + wprintw(win, ", pad '%c'", field_pad(field)); + + waddstr(win, "\n"); + for (nbuf = 0; nbuf <= 2; ++nbuf) { + NCURSES_CONST char *buffer; + if ((buffer = field_buffer(field, nbuf)) != 0) { + wprintw(win, "buffer %d:", nbuf); + (void) wattrset(win, A_REVERSE); + if (nbuf) { + waddnstr(win, buffer, trimmed(buffer)); + } else { + waddstr(win, buffer); + } + wattroff(win, A_REVERSE); + waddstr(win, "\n"); + } + } + } + wrefresh(win); +} + +static void +demo_forms(void) +{ + FORM *form; + FIELD *f[100]; /* will memset to zero */ + int c; + unsigned n = 0; + int pg; + NCURSES_CONST char *fname; + static NCURSES_CONST char *my_enum[] = + {"first", "second", "third", 0}; + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif + + help_edit_field(); + + MvAddStr(4, 57, "Forms Entry Test"); + show_insert_mode(TRUE); + + refresh(); + + /* describe the form */ + memset(f, 0, sizeof(f)); + for (pg = 0; pg < 4; ++pg) { + char label[80]; + _nc_SPRINTF(label, _nc_SLIMIT(sizeof(label)) + "Sample Form Page %d", pg + 1); + f[n++] = make_label(label, 0, 15); + set_new_page(f[n - 1], TRUE); + + switch (pg) { + default: + fname = "Last Name"; + f[n++] = make_label(fname, 2, 0); + f[n++] = make_field(fname, 3, 0, 1, 18); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + fname = "First Name"; + f[n++] = make_label(fname, 2, 20); + f[n++] = make_field(fname, 3, 20, 1, 12); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + fname = "Middle Name"; + f[n++] = make_label(fname, 2, 34); + f[n++] = make_field(fname, 3, 34, 1, 12); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + break; + + case 1: + fname = "Last Name"; + f[n++] = make_label(fname, 2, 0); + f[n++] = make_field(fname, 3, 0, 1, 12); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + fname = "First Name"; + f[n++] = make_label(fname, 2, 14); + f[n++] = make_field(fname, 3, 14, 1, 12); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + fname = "MI"; + f[n++] = make_label(fname, 2, 28); + f[n++] = make_field(fname, 3, 28, 1, 1); + set_field_pad(f[n - 1], '?'); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + fname = "First/Second/Third"; + f[n++] = make_label(fname, 2, 32); + f[n++] = make_field(fname, 3, 32, 1, 12); + set_field_type(f[n - 1], TYPE_ENUM, my_enum, 0, 0); + break; + + case 2: + fname = "Host Name"; + f[n++] = make_label(fname, 2, 0); + f[n++] = make_field(fname, 3, 0, 1, 24); + set_field_type(f[n - 1], TYPE_ALNUM, 1); + +#ifdef NCURSES_VERSION + fname = "IP Address"; + f[n++] = make_label(fname, 2, 26); + f[n++] = make_field(fname, 3, 26, 1, 16); + set_field_type(f[n - 1], TYPE_IPV4, 1); +#endif + break; + + case 3: + fname = "Four digits"; + f[n++] = make_label(fname, 2, 0); + f[n++] = make_field(fname, 3, 0, 1, 10); + set_field_type(f[n - 1], TYPE_INTEGER, 4, 0, 0); + + fname = "Numeric"; + f[n++] = make_label(fname, 2, 13); + f[n++] = make_field(fname, 3, 13, 1, 12); + set_field_type(f[n - 1], TYPE_NUMERIC, 3, -10000.0, 100000000.0); + + fname = "Phone number"; + f[n++] = make_label(fname, 2, 27); + f[n++] = make_field(fname, 3, 27, 1, 16); + set_field_type(f[n - 1], TYPE_REGEXP, + "^([0-9]-)?[0-9]{3}-[0-9]{3}-[0-9]{4} *$");; + break; + } + + fname = "Comments"; + f[n++] = make_label(fname, 5, 0); + f[n++] = make_field(fname, 6, 0, 4, 46); + init_edit_field(f[n - 1], get_data(fname)); + } + + f[n] = (FIELD *) 0; + + if ((form = new_form(f)) != 0) { + NCURSES_CONST WINDOW *w; + WINDOW *also; + int finished = 0; + + display_form(form); + + w = form_win(form); + also = newwin(getmaxy(stdscr) - getmaxy(w), COLS, getmaxy(w), 0); + show_current_field(also, form); + + while (!finished) { + switch (edit_field(form, &c)) { + case E_OK: + break; + case E_UNKNOWN_COMMAND: + finished = my_form_driver(form, c); + break; + default: + beep(); + break; + } + show_current_field(also, form); + } + + erase_form(form); + + free_form(form); + } + for (c = 0; f[c] != 0; c++) { + free_edit_field(f[c]); + free_field(f[c]); + } + noraw(); + nl(); + +#ifdef NCURSES_MOUSE_VERSION + mousemask(0, (mmask_t *) 0); +#endif +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: demo_forms [options] [data file]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -d make fields dynamic" + ," -j NUM justify (1=left, 2=center, 3=right)" + ," -m NUM set maximum size of dynamic fields" + ," -o NUM specify number of offscreen rows in new_field()" + ," -t NUM specify text to fill fields initially" + }; + unsigned int j; + for (j = 0; j < SIZEOF(tbl); ++j) + fprintf(stderr, "%s\n", tbl[j]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "dj:m:o:t:")) != -1) { + switch (ch) { + case 'd': + d_option = TRUE; + break; + case 'j': + j_value = atoi(optarg); + if (j_value < NO_JUSTIFICATION + || j_value > JUSTIFY_RIGHT) + usage(FALSE); + break; + case 'm': + m_value = atoi(optarg); + break; + case 'o': + o_value = atoi(optarg); + break; + case 't': + t_value = optarg; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + while (optind < argc) { + read_data(argv[optind++]); + } + + initscr(); + cbreak(); + noecho(); + raw(); + nonl(); /* lets us read ^M's */ + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + init_pair(2, COLOR_GREEN, COLOR_BLACK); + init_pair(3, COLOR_CYAN, COLOR_BLACK); + bkgd((chtype) COLOR_PAIR(1)); + refresh(); + } + + demo_forms(); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses form library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/demo_forms.txt b/contrib/ncurses/test/demo_forms.txt new file mode 100644 index 00000000..0763fc03 --- /dev/null +++ b/contrib/ncurses/test/demo_forms.txt @@ -0,0 +1,20 @@ +# $Id: demo_forms.txt,v 1.3 2013/06/08 14:10:15 tom Exp $ +First Name:John +. +Middle Name:Don +. +MI:D +. +Last Name:Smith +. +Comments:Hello +World! +. +Host Name:localhost@localdomain +. +IP Address:192.168.1.100 +. +Four digits:1234 +. +Numeric:32768 +. diff --git a/contrib/ncurses/test/demo_keyok.c b/contrib/ncurses/test/demo_keyok.c new file mode 100644 index 00000000..f26d2c9d --- /dev/null +++ b/contrib/ncurses/test/demo_keyok.c @@ -0,0 +1,123 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2002-2006,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: demo_keyok.c,v 1.10 2024/08/24 17:16:49 tom Exp $ + * + * Demonstrate the keyok() function. + * Thomas Dickey - 2002/11/23 + */ + +#include + +#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_keyok [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int lastch = ERR; + int prior = ERR; + int ch; + WINDOW *win; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + printw("Typing any function key will disable it, but typing it twice in\n"); + printw("a row will turn it back on (just for a demo)."); + refresh(); + + win = newwin(LINES - 2, COLS, 2, 0); + scrollok(win, TRUE); + keypad(win, TRUE); + wmove(win, 0, 0); + + while ((ch = wgetch(win)) != ERR) { + const char *name = keyname(ch); + if (ch == QUIT) + break; + if (ch == ESCAPE && prior == ch) + break; + prior = ch; + wprintw(win, "Keycode %d, name %s\n", + ch, + name != 0 ? name : ""); + wclrtoeol(win); + wrefresh(win); + if (ch >= KEY_MIN) { + keyok(ch, FALSE); + lastch = ch; + } else if (lastch >= KEY_MIN) { + keyok(lastch, TRUE); + } + } + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/demo_menus.c b/contrib/ncurses/test/demo_menus.c new file mode 100644 index 00000000..b5428f88 --- /dev/null +++ b/contrib/ncurses/test/demo_menus.c @@ -0,0 +1,1063 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2003-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: demo_menus.c,v 1.83 2024/10/19 21:53:57 tom Exp $ + * + * Demonstrate a variety of functions from the menu library. + * Thomas Dickey - 2005/4/9 + */ +/* +item_description - +item_init - +item_opts - +item_opts_off - +item_opts_on - +item_term - +item_visible - +menu_back - +menu_fore - +menu_format - +menu_grey - +menu_init - +menu_opts - +menu_pad - +menu_request_by_name - +menu_request_name - +menu_term - +menu_userptr - +set_current_item - +set_item_opts - +set_menu_grey - +set_menu_items - +set_menu_opts - +set_menu_pad - +set_menu_pattern - +set_menu_spacing - +set_menu_userptr - +set_top_row - +top_row - +*/ + +#include + +#if USE_LIBMENU + +#include + +#include +#include + +#ifdef NCURSES_VERSION +#ifdef TRACE +static unsigned save_trace = TRACE_ORDINARY | TRACE_CALLS; +static MENU *mpTrace; +#endif +#endif + +typedef enum { + eBanner = -1 + ,eFile + ,eSelect +#ifdef TRACE + ,eTrace +#endif + ,eMAX +} MenuNo; + +#define okMenuNo(n) (((n) > eBanner) && ((n) < eMAX)) + +#define MENU_Y 1 + +typedef struct { + NCURSES_CONST char *name; + void (*func) (int); + unsigned mask; +} MENU_DATA; + +static void call_files(int); + +static MENU *mpBanner; +static MENU *mpFile; +static MENU *mpSelect; + +static WINDOW *status; + +static bool loaded_file = FALSE; + +static char empty[1]; + +#ifdef TRACE +static GCC_NORETURN void failed(const char *s); + +static void +failed(const char *s) +{ + perror(s); + endwin(); + ExitProgram(EXIT_FAILURE); +} +#endif + +/* Common function to allow ^T to toggle trace-mode in the middle of a test + * so that trace-files can be made smaller. + */ +static int +wGetchar(WINDOW *win) +{ + int c; +#ifdef TRACE + while ((c = wgetch(win)) == CTRL('T')) { + if (_nc_tracing) { + save_trace = _nc_tracing; + Trace(("TOGGLE-TRACING OFF")); + _nc_tracing = 0; + } else { + _nc_tracing = save_trace; + } + curses_trace(_nc_tracing); + if (_nc_tracing) + Trace(("TOGGLE-TRACING ON")); + } +#else + c = wgetch(win); +#endif + return c; +} +#define Getchar() wGetchar(stdscr) + +static int +menu_virtualize(int c) +{ + int result; + + if (c == '\n' || c == KEY_EXIT) + result = (MAX_COMMAND + 1); + else if (c == 'u') + result = (REQ_SCR_ULINE); + else if (c == 'd') + result = (REQ_SCR_DLINE); + else if (c == 'b' || c == KEY_NPAGE) + result = (REQ_SCR_UPAGE); + else if (c == 'f' || c == KEY_PPAGE) + result = (REQ_SCR_DPAGE); + else if (c == 'l' || c == KEY_LEFT || c == KEY_BTAB) + result = (REQ_LEFT_ITEM); + else if (c == 'n' || c == KEY_DOWN) + result = (REQ_NEXT_ITEM); + else if (c == 'p' || c == KEY_UP) + result = (REQ_PREV_ITEM); + else if (c == 'r' || c == KEY_RIGHT || c == '\t') + result = (REQ_RIGHT_ITEM); + else if (c == ' ') + result = (REQ_TOGGLE_ITEM); + else { + if (c != KEY_MOUSE) + beep(); + result = (c); + } + return result; +} + +static int +menu_getc(NCURSES_CONST MENU * m) +{ + return wGetchar(menu_win(m)); +} + +static int +menu_offset(MenuNo number) +{ + int result = 0; + + if (okMenuNo(number)) { + int spc_rows; +#ifdef NCURSES_VERSION + int spc_desc, spc_cols; + menu_spacing(mpBanner, &spc_desc, &spc_rows, &spc_cols); +#else + spc_rows = 0; +#endif + + /* FIXME: MENU.itemlen seems the only way to get actual width of items */ + result = (number - (eBanner + 1)) * (menu_itemwidth(mpBanner) + spc_rows); + } + return result; +} + +static void +my_menu_init(MENU * menu) +{ + Trace(("called MenuHook my_menu_init")); + mvwprintw(status, 2, 0, "menu_init %p", (const void *) menu); + wclrtoeol(status); + wrefresh(status); +} + +static void +my_menu_term(MENU * menu) +{ + Trace(("called MenuHook my_menu_term")); + mvwprintw(status, 2, 0, "menu_term %p", (const void *) menu); + wclrtoeol(status); + wrefresh(status); +} + +static void +my_item_init(MENU * menu) +{ + NCURSES_CONST ITEM *item = current_item(menu); + const char *name = item_name(item); + + Trace(("called MenuHook my_item_init (%s)", name)); + mvwprintw(status, 2, 0, "item_init %s", name); + wclrtoeol(status); + wrefresh(status); +} + +static void +my_item_term(MENU * menu) +{ + NCURSES_CONST ITEM *item = current_item(menu); + const char *name = item_name(item); + + Trace(("called MenuHook my_item_term (%s)", name)); + mvwprintw(status, 2, 0, "item_term %s", name); + wclrtoeol(status); + wrefresh(status); +} + +static MENU * +menu_create(ITEM ** items, int count, int ncols, MenuNo number) +{ + MENU *result; + WINDOW *menuwin; + int mrows, mcols; + int y = okMenuNo(number) ? MENU_Y : 0; + int x = menu_offset(number); + int margin = (y == MENU_Y) ? 1 : 0; + int maxcol = (ncols + x) < COLS ? ncols : (COLS - x - 1); + int maxrow = (count + 1) / ncols; + + if ((maxrow + y) >= (LINES - 4)) + maxrow = LINES - 4 - y; + + result = new_menu(items); + + if (has_colors()) { + set_menu_fore(result, (chtype) COLOR_PAIR(1)); + set_menu_back(result, (chtype) COLOR_PAIR(2)); + } + + set_menu_format(result, maxrow, maxcol); + scale_menu(result, &mrows, &mcols); + + if (mcols + (2 * margin + x) >= COLS) + mcols = COLS - (2 * margin + x); + + menuwin = newwin(mrows + (2 * margin), mcols + (2 * margin), y, x); + set_menu_win(result, menuwin); + keypad(menuwin, TRUE); + if (margin) + box(menuwin, 0, 0); + + set_menu_sub(result, derwin(menuwin, mrows, mcols, margin, margin)); + +#ifdef TRACE + if (number == eTrace) + menu_opts_off(result, O_ONEVALUE); + else + menu_opts_on(result, O_ONEVALUE); +#endif +#if defined(NCURSES_MOUSE_VERSION) && defined(O_MOUSE_MENU) + menu_opts_on(result, O_MOUSE_MENU); +#endif + + post_menu(result); + + set_menu_init(result, my_menu_init); + set_menu_term(result, my_menu_term); + set_item_init(result, my_item_init); + set_item_term(result, my_item_term); + return result; +} + +static void +menu_destroy(MENU * m, int itemsToo) +{ + Trace(("menu_destroy %p", (void *) m)); + if (m != 0) { + ITEM **items = menu_items(m); + const char *blob = 0; + int count; + + count = item_count(m); + Trace(("menu_destroy %p count %d", (void *) m, count)); + if ((count > 0) && (m == mpSelect)) { + blob = item_name(*items); + } + + unpost_menu(m); + free_menu(m); + + /* free the extra data allocated in build_select_menu() */ + if ((count > 0) && (m == mpSelect)) { + if (blob && loaded_file) { + Trace(("freeing blob %p", blob)); + free((void *) blob); + } + } + if (count > 0 && itemsToo) { + if (itemsToo & 1) { + ITEM **ip = items; + if (ip != 0) { + while (*ip) + free_item(*ip++); + } + } + if (itemsToo & 2) + free(items); + } + } +} + +/* force the given menu to appear */ +static void +menu_display(NCURSES_CONST MENU * m) +{ + touchwin(menu_win(m)); + wrefresh(menu_win(m)); +} + +/*****************************************************************************/ + +static void +build_file_menu(MenuNo number) +{ + static MENU_DATA table[] = + { + {"Exit", call_files, 0}, + {(char *) 0, 0, 0} + }; + static ITEM *items[SIZEOF(table)]; + + ITEM **ip = items; + int n; + + for (n = 0; table[n].name != 0; ++n) { + *ip = new_item(table[n].name, empty); + set_item_userptr(*ip, (void *) &table[n]); + ++ip; + } + *ip = (ITEM *) 0; + + mpFile = menu_create(items, SIZEOF(table) - 1, 1, number); +} + +static int +perform_file_menu(int cmd) +{ + return menu_driver(mpFile, cmd); +} + +/*****************************************************************************/ + +static void +call_select(int code) +{ + (void) code; + Trace(("Selected item %d", code)); +} + +static void +build_select_menu(MenuNo number, char *filename) +{ +#define MY_DATA(name) { name, call_select, 0 } + static MENU_DATA table[] = + { + MY_DATA("Lions"), + MY_DATA("Tigers"), + MY_DATA("Bears"), + MY_DATA("(Oh my!)"), + MY_DATA("Newts"), + MY_DATA("Platypi"), + MY_DATA("Lemurs"), + MY_DATA("(Oh really?!)"), + MY_DATA("Leopards"), + MY_DATA("Panthers"), + MY_DATA("Pumas"), + MY_DATA("Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs"), + MY_DATA("Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs, Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs"), + {(char *) 0, 0, 0} + }; + static ITEM **items; + + ITEM **ip; + MENU_DATA *ap = 0; + MENU_DATA *myList = 0; + int i; + size_t count = 0; + + if (filename != 0) { + struct stat sb; + if (stat(filename, &sb) == 0 + && (sb.st_mode & S_IFMT) == S_IFREG + && sb.st_size != 0) { + size_t size = (size_t) sb.st_size; + char *blob = typeMalloc(char, size + 1); + MENU_DATA *list = typeCalloc(MENU_DATA, size + 1); + + items = typeCalloc(ITEM *, size + 1); + Trace(("build_select_menu blob=%p, items=%p", + (void *) blob, + (void *) items)); + if (blob != 0 && list != 0) { + FILE *fp = fopen(filename, "r"); + if (fp != 0) { + if (fread(blob, sizeof(char), size, fp) == size) { + bool mark = TRUE; + unsigned j, k; + for (j = k = 0; j < size; ++j) { + if (mark) { + list[k++].name = blob + j; + mark = FALSE; + } + if (blob[j] == '\n') { + blob[j] = '\0'; + if (k > 0 && *list[k - 1].name == '\0') + --k; + mark = TRUE; + } else if (blob[j] == '\t') { + blob[j] = ' '; /* menu items are printable */ + } + } + list[k].name = 0; + count = k; + ap = myList = list; + } + fclose(fp); + } + loaded_file = TRUE; + } + if (ap == 0) + free(items); + } + } + if (ap == 0) { + count = SIZEOF(table) - 1; + items = typeCalloc(ITEM *, count + 1); + ap = table; + } + + ip = items; + for (i = 0; ap[i].name != 0; ++i) { + ap[i].func = call_select; + ap[i].mask = (unsigned) i; + *ip = new_item(ap[i].name, empty); + set_item_userptr(*ip, (void *) &table[i]); + ++ip; + } + *ip = 0; + + mpSelect = menu_create(items, (int) count, 1, number); + if (myList != 0) + free(myList); +} + +static int +perform_select_menu(int cmd) +{ + return menu_driver(mpSelect, cmd); +} + +/*****************************************************************************/ + +#ifdef TRACE + +static void +call_trace(int code) +{ + (void) code; + Trace(("Updating trace mask %d", code)); +} + +#define T_TBL(name) { #name, call_trace, name } +static MENU_DATA t_tbl[] = +{ + + T_TBL(TRACE_DISABLE), + T_TBL(TRACE_TIMES), + T_TBL(TRACE_TPUTS), + T_TBL(TRACE_UPDATE), + T_TBL(TRACE_MOVE), + T_TBL(TRACE_CHARPUT), + T_TBL(TRACE_ORDINARY), + T_TBL(TRACE_CALLS), + T_TBL(TRACE_VIRTPUT), + T_TBL(TRACE_IEVENT), + T_TBL(TRACE_BITS), + T_TBL(TRACE_ICALLS), + T_TBL(TRACE_CCALLS), + T_TBL(TRACE_DATABASE), + T_TBL(TRACE_ATTRS), + T_TBL(TRACE_MAXIMUM), + { + (char *) 0, 0, 0 + } +}; + +static void +build_trace_menu(MenuNo number) +{ + static ITEM *items[SIZEOF(t_tbl)]; + + ITEM **ip = items; + int n; + + for (n = 0; t_tbl[n].name != 0; n++) { + *ip = new_item(t_tbl[n].name, empty); + set_item_userptr(*ip, (void *) &t_tbl[n]); + ++ip; + } + *ip = (ITEM *) 0; + + mpTrace = menu_create(items, SIZEOF(t_tbl) - 1, 2, number); +} + +static char * +tracetrace(unsigned tlevel) +{ + static char *buf; + static size_t need = 12; + int n; + + if (buf == 0) { + for (n = 0; t_tbl[n].name != 0; n++) + need += strlen(t_tbl[n].name) + 2; + buf = typeMalloc(char, need); + if (!buf) + failed("tracetrace"); + } + _nc_SPRINTF(buf, _nc_SLIMIT(need) "0x%02x = {", tlevel); + if (tlevel == 0) { + _nc_STRCAT(buf, t_tbl[0].name ? t_tbl[0].name : "", need); + _nc_STRCAT(buf, ", ", need); + } else { + for (n = 1; t_tbl[n].name != 0; n++) + if ((tlevel & t_tbl[n].mask) == t_tbl[n].mask) { + _nc_STRCAT(buf, t_tbl[n].name, need); + _nc_STRCAT(buf, ", ", need); + } + } + if (buf[strlen(buf) - 2] == ',') + buf[strlen(buf) - 2] = '\0'; + _nc_STRCAT(buf, "}", need); + return buf; +} + +/* fake a dynamically reconfigurable menu using the 0th entry to deselect + * the others + */ +static bool +update_trace_menu(NCURSES_CONST MENU * m) +{ + ITEM **items; + NCURSES_CONST ITEM *i; + bool changed = FALSE; + + items = menu_items(m); + i = current_item(m); + if (i == items[0]) { + if (item_value(i)) { + ITEM **p; + for (p = items + 1; *p != 0; p++) + if (item_value(*p)) { + set_item_value(*p, FALSE); + changed = TRUE; + } + } + } + return changed; +} + +static int +perform_trace_menu(int cmd) +/* interactively set the trace level */ +{ + ITEM **ip; + int result; + + for (ip = menu_items(mpTrace); *ip; ip++) { + NCURSES_CONST MENU_DATA *td = (MENU_DATA *) item_userptr(*ip); + unsigned mask = td->mask; + if (mask == 0) + set_item_value(*ip, _nc_tracing == 0); + else if ((mask & _nc_tracing) == mask) + set_item_value(*ip, TRUE); + } + + result = menu_driver(mpTrace, cmd); + + if (result == E_OK) { + if (update_trace_menu(mpTrace) || cmd == REQ_TOGGLE_ITEM) { + unsigned newtrace = 0; + for (ip = menu_items(mpTrace); *ip; ip++) { + if (item_value(*ip)) { + NCURSES_CONST MENU_DATA *td = (MENU_DATA *) item_userptr(*ip); + newtrace |= td->mask; + } + } + curses_trace(newtrace); + Trace(("trace level interactively set to %s", tracetrace(_nc_tracing))); + + MvWPrintw(status, 1, 0, + "Trace level is %s\n", tracetrace(_nc_tracing)); + wrefresh(status); + } + } + return result; +} +#endif /* TRACE */ + +/*****************************************************************************/ + +static int +menu_number(void) +{ + return item_index(current_item(mpBanner)) - (eBanner + 1); +} + +static MENU * +current_menu(void) +{ + MENU *result; + + switch (menu_number()) { + case eFile: + result = mpFile; + break; + case eSelect: + result = mpSelect; + break; +#ifdef TRACE + case eTrace: + result = mpTrace; + break; +#endif + default: + result = 0; + break; + } + return result; +} + +static void +call_menus(int code) +{ + (void) code; + Trace(("Activated menu %d\n", code)); +} + +static void +build_menus(char *filename) +{ + static MENU_DATA table[] = + { + {"File", call_menus, 0}, + {"Select", call_menus, 1}, +#ifdef TRACE + {"Trace", call_menus, 2}, +#endif + {(char *) 0, 0, 0} + }; + static ITEM *items[SIZEOF(table)]; + + ITEM **ip = items; + int n; + + for (n = 0; table[n].name != 0; ++n) { + *ip = new_item(table[n].name, empty); + set_item_userptr(*ip, (void *) &table[n]); + ++ip; + } + *ip = (ITEM *) 0; + + mpBanner = menu_create(items, SIZEOF(table) - 1, SIZEOF(table) - 1, eBanner); + set_menu_mark(mpBanner, ">"); + + build_file_menu(eFile); + build_select_menu(eSelect, filename); +#ifdef TRACE + build_trace_menu(eTrace); +#endif +} + +static int +move_menu(NCURSES_CONST MENU * menu, + NCURSES_CONST MENU * current, + int by_y, int by_x) +{ + WINDOW *top_win = menu_win(menu); + WINDOW *sub_win = menu_sub(menu); + int y0, x0; + int y1, x1; + int result; + + getbegyx(top_win, y0, x0); + y0 += by_y; + x0 += by_x; + + getbegyx(sub_win, y1, x1); + y1 += by_y; + x1 += by_x; + + if ((result = mvwin(top_win, y0, x0)) != ERR) { +#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH < 20060218) + sub_win->_begy = y1; + sub_win->_begx = x1; +#else + mvwin(sub_win, y1, x1); +#endif + if (menu == current) { + touchwin(top_win); + wnoutrefresh(top_win); + } + } + return result; +} + +/* + * Move the menus around on the screen, to test mvwin(). + */ +static void +move_menus(NCURSES_CONST MENU * current, int by_y, int by_x) +{ + if (move_menu(mpBanner, current, by_y, by_x) != ERR) { + erase(); + wnoutrefresh(stdscr); + move_menu(mpFile, current, by_y, by_x); + move_menu(mpSelect, current, by_y, by_x); +#ifdef TRACE + move_menu(mpTrace, current, by_y, by_x); +#endif + doupdate(); + } +} + +#if defined(KEY_RESIZE) && NCURSES_EXT_FUNCS +static void +resize_menu(MENU ** menu) +{ +#if 0 + WINDOW *win = menu_win(*menu); + WINDOW *sub = menu_sub(*menu); +#endif + (void) menu; +} + +static void +resize_menus(MENU * current) +{ + (void) current; + + werase(status); + wnoutrefresh(status); + wresize(status, 1, COLS); + mvwin(status, LINES - 1, 0); + + resize_menu(&mpBanner); + resize_menu(&mpFile); + resize_menu(&mpSelect); +#ifdef TRACE + resize_menu(&mpTrace); +#endif +} +#endif /* defined(KEY_RESIZE) && NCURSES_EXT_FUNCS */ + +static void +show_status(int ch, NCURSES_CONST MENU * menu) +{ + wmove(status, 0, 0); + wprintw(status, "key %s, menu %d, mark %s, match %s", + keyname(ch), + menu_number(), + menu_mark(menu), + menu_pattern(menu)); + wclrtoeol(status); + wrefresh(status); +} + +static void +perform_menus(void) +{ + MENU *this_menu; + MENU *last_menu = mpFile; + int code = E_UNKNOWN_COMMAND; + int cmd; + int ch = ERR; + +#ifdef NCURSES_MOUSE_VERSION + mousemask(BUTTON1_CLICKED, (mmask_t *) 0); +#endif + + menu_display(last_menu); + + for (;;) { + + if (ch != ERR) + show_status(ch, last_menu); + + ch = menu_getc(mpBanner); + + /* + * Provide for moving the menu around in the screen using shifted + * cursor keys. + */ + switch (ch) { + case KEY_SF: + move_menus(last_menu, 1, 0); + continue; + case KEY_SR: + move_menus(last_menu, -1, 0); + continue; + case KEY_SLEFT: + move_menus(last_menu, 0, -1); + continue; + case KEY_SRIGHT: + move_menus(last_menu, 0, 1); + continue; +#if defined(KEY_RESIZE) && NCURSES_EXT_FUNCS + case KEY_RESIZE: + resize_menus(last_menu); + continue; +#endif + } + cmd = menu_virtualize(ch); + + switch (cmd) { + /* + * The banner menu acts solely to select one of the other menus. + * Move between its items, wrapping at the left/right limits. + */ + case REQ_LEFT_ITEM: + case REQ_RIGHT_ITEM: + code = menu_driver(mpBanner, cmd); + if (code == E_REQUEST_DENIED) { + if (menu_number() > 0) + code = menu_driver(mpBanner, REQ_FIRST_ITEM); + else + code = menu_driver(mpBanner, REQ_LAST_ITEM); + } + break; + default: + switch (menu_number()) { + case eFile: + code = perform_file_menu(cmd); + break; + case eSelect: + code = perform_select_menu(cmd); + break; +#ifdef TRACE + case eTrace: + code = perform_trace_menu(cmd); + break; +#endif + } + +#if defined(NCURSES_MOUSE_VERSION) && defined(O_MOUSE_MENU) + if ((code == E_REQUEST_DENIED) && (cmd == KEY_MOUSE)) { + (void) menu_getc(mpBanner); + code = menu_driver(mpBanner, cmd); + if (code == E_REQUEST_DENIED) { + MEVENT event; + if (menu_getc(mpBanner) == KEY_MOUSE) + getmouse(&event); /* give up */ + } + } +#endif + + break; + } + + if (code == E_OK) { + this_menu = current_menu(); + if (this_menu != last_menu) { + move(1, 0); + clrtobot(); + box(menu_win(this_menu), 0, 0); + refresh(); + + /* force the current menu to appear */ + menu_display(this_menu); + + last_menu = this_menu; + } + } + wrefresh(menu_win(last_menu)); + if (code == E_UNKNOWN_COMMAND + || code == E_NOT_POSTED) { + NCURSES_CONST ITEM *item = current_item(last_menu); + MENU_DATA *td = (MENU_DATA *) item_userptr(item); + td->func((int) td->mask); + } + if (code == E_REQUEST_DENIED) + beep(); + } +} + +static void +destroy_menus(void) +{ + menu_destroy(mpFile, 1); + menu_destroy(mpSelect, 3); +#ifdef TRACE + menu_destroy(mpTrace, 1); +#endif + menu_destroy(mpBanner, 1); +} + +#if HAVE_RIPOFFLINE +static int +rip_footer(WINDOW *win, int cols) +{ + wbkgd(win, A_REVERSE); + werase(win); + wmove(win, 0, 0); + wprintw(win, "footer: %d columns", cols); + wnoutrefresh(win); + return OK; +} + +static int +rip_header(WINDOW *win, int cols) +{ + wbkgd(win, A_REVERSE); + werase(win); + wmove(win, 0, 0); + wprintw(win, "header: %d columns", cols); + wnoutrefresh(win); + return OK; +} +#endif /* HAVE_RIPOFFLINE */ + +static void +call_files(int code) +{ + switch (code) { + case 0: + destroy_menus(); + endwin(); + printf("DONE!\n"); + ExitProgram(EXIT_SUCCESS); + } +} + +static void +usage(int ok) +{ + static const char *const tbl[] = + { + "Usage: demo_menus [options] [menu-file]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_RIPOFFLINE + ," -F rip-off footer line (can repeat)" + ," -H rip-off header line (can repeat)" +#endif +#ifdef TRACE + ," -t mask specify default trace-level (may toggle with ^T)" +#endif + }; + size_t n; + for (n = 0; n < SIZEOF(tbl); n++) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + START_TRACE(); + + while ((ch = getopt(argc, argv, OPTS_COMMON "FHt:")) != -1) { + switch (ch) { +#if HAVE_RIPOFFLINE + case 'F': + ripoffline(-1, rip_footer); + break; + case 'H': + ripoffline(1, rip_header); + break; +#endif /* HAVE_RIPOFFLINE */ +#ifdef TRACE + case 't': + curses_trace((unsigned) strtoul(optarg, 0, 0)); + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + initscr(); + noraw(); + cbreak(); + noecho(); + + if (has_colors()) { + start_color(); + init_pair(1, COLOR_RED, COLOR_BLACK); + init_pair(2, COLOR_BLUE, COLOR_WHITE); + } + status = newwin(3, COLS, LINES - 3, 0); + build_menus(argc > 1 ? argv[1] : 0); + perform_menus(); + destroy_menus(); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the curses menu library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/demo_new_pair.c b/contrib/ncurses/test/demo_new_pair.c new file mode 100644 index 00000000..89a4da80 --- /dev/null +++ b/contrib/ncurses/test/demo_new_pair.c @@ -0,0 +1,410 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: demo_new_pair.c,v 1.29 2024/10/05 18:21:44 tom Exp $ + * + * Demonstrate the alloc_pair() function. + */ + +#include +#include +#include + +#if HAVE_TIGETSTR +#if HAVE_ALLOC_PAIR && USE_WIDEC_SUPPORT + +#include +#include +#include + +#define MAX_BITS 8 /* all but A_ALTCHARSET */ +#define MAX_ATTR ((1< 0) { + if (now < COLOR_PAIRS) { + int fg, bg; + our_content(now, &fg, &bg); + if (init_pair((short) now, (short) fg, (short) bg) != OK) + now = ERR; + } else { + now %= COLOR_PAIRS; + } + result = now; + } + return result; +} + +static time_t +now(void) +{ + return time((time_t *) 0); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_new_pair [options]" + ,"" + ,"Repeatedly print using all possible color combinations." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -g use getcchar to check setcchar" + ," -i use init_pair rather than alloc_pair" + ," -p start in paged-mode" + ," -s start in single-step mode" + ," -w print a wide-character cell" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} + +#define use_pages() \ + paged_mode = TRUE, single_mode = TRUE + +#define use_single() \ + paged_mode = FALSE, single_mode = TRUE + +#define update_modes() \ + scrollok(stdscr, !paged_mode); \ + nodelay(stdscr, !single_mode || paged_mode) +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static const char *help[] = + { + "This program iterates over the possible color combinations,", + "allocating or initializing color pairs. For best results,", + "choose screen-width dividing evenly into the number of colors,", + "e.g.,", + "", + " 32x64,32x128 256 colors", + " 24x44,24x88 88 colors", + " 32x64,24x128 16 colors", + "", + "Keys:", + " c toggle between coloring and de-coloring cells", + " p show one page at a time", + " s show one character at a time", + " display char/page without pausing", + " v/V cycle through video attributes", + " w toggle between \"#\" and a double-width equivalent", + " ? print this screen (exit on any character).", + "", + "To exit this program, press ^Q, ^[ or \"q\".", + 0 + }; + + bool done = FALSE; + bool check_set = FALSE; + bool clobber = FALSE; + bool hascolor = FALSE; + bool use_init = FALSE; + bool use_wide = FALSE; + bool paged_mode = FALSE; + bool single_mode = FALSE; + int video_mode = 0; + int current; + int ch; + wchar_t wch[2]; + time_t start = now(); + long total_cells = 0; + FILE *output = 0; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "gipsw")) != -1) { + switch (ch) { + case 'g': + check_set = TRUE; + break; + case 'i': + use_init = TRUE; + break; + case 'p': + use_pages(); + break; + case 's': + use_single(); + break; + case 'w': + use_wide = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if (isatty(fileno(stderr))) { + output = stderr; + } else if ((ch = open("/dev/tty", O_WRONLY)) >= 0) { + output = fdopen(ch, "w"); + } else { + fprintf(stderr, "cannot open terminal for output\n"); + ExitProgram(EXIT_FAILURE); + } + if (newterm(NULL, output, stdin) == 0) { + fprintf(stderr, "Cannot initialize terminal\n"); + fclose(output); + ExitProgram(EXIT_FAILURE); + } + (void) cbreak(); /* read chars without wait for \n */ + (void) noecho(); /* don't echo input */ + update_modes(); + curs_set(0); + + keypad(stdscr, TRUE); + + if ((hascolor = has_colors())) { + start_color(); + current = 1; + } else { + current = 0; + } + + /* + * Repeatedly cycle through all colors, initializing pairs as needed. + * Provide for single-stepping, or page-at-a-time, as well as quitting. + */ + while (!done) { + cchar_t temp; + attr_t my_attrs; + int my_pair; + + switch (getch()) { + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + case 'p': + /* step-by-page */ + use_pages(); + update_modes(); + break; + case 's': + /* step-by-char */ + use_single(); + update_modes(); + break; + case ' ': + single_mode = FALSE; + update_modes(); + break; + case QUIT: + case ESCAPE: + case 'q': + done = TRUE; + continue; + case 'c': + clobber = !clobber; + continue; + case 'v': + if (--video_mode < 0) + video_mode = MAX_ATTR; + continue; + case 'V': + if (video_mode > MAX_ATTR) + video_mode = 0; + continue; + case 'w': + use_wide = !use_wide; + continue; + case ERR: + break; + default: + beep(); + break; + } + if (hascolor) { + my_attrs = next_attr(video_mode); + if (clobber) { + int fg, bg; + our_content(current, &fg, &bg); + my_pair = find_pair(fg, bg); + if (my_pair > 0) { + free_pair(my_pair); + } + my_pair = 0; + } else { + my_pair = (use_init + ? next_color(current) + : make_color(current)); + } + } else { + my_attrs = next_attr(current); + my_pair = 0; + } + if (my_pair < 0) + break; + wch[0] = use_wide ? 0xff03 : '#'; + wch[1] = 0; + setcchar(&temp, wch, my_attrs, + (short) my_pair, + (use_init ? NULL : (void *) &my_pair)); + + if (check_set) { + int problem = 0; + wchar_t chk_wch[2]; + attr_t chk_attrs = 0; + short chk_pair = 0; + int chk_pair2 = 0; + +#define AllButColor(a) ((a) & (A_ATTRIBUTES & ~A_COLOR)) + + if (getcchar(&temp, NULL, &chk_attrs, &chk_pair, + (use_init ? NULL : (void *) &chk_pair2)) != 2) { + problem = 1; + } else if (getcchar(&temp, chk_wch, &chk_attrs, &chk_pair, + (use_init ? NULL : (void *) &chk_pair2)) != OK) { + problem = 2; + } else if (chk_wch[0] != wch[0]) { + problem = 3; + } else if (AllButColor(my_attrs) != AllButColor(chk_attrs)) { + problem = 4; + } else if (my_pair != chk_pair) { + problem = 4; + } else if (!use_init && (my_pair != chk_pair2)) { + problem = 5; + } + if (problem) { + wch[0] = (wchar_t) (problem + '0'); + setcchar(&temp, wch, my_attrs, + (short) my_pair, + (use_init ? NULL : (void *) &my_pair)); + } + } + + /* + * At the end of a page, move the cursor to the home position. + */ + if ((add_wch(&temp) == ERR) && paged_mode) { + nodelay(stdscr, !single_mode); + move(0, 0); + } + total_cells += 1 + (use_wide ? 1 : 0); + ++current; + } + stop_curses(); + fclose(output); + + printf("%.1f cells/second\n", + (double) (total_cells) / (double) (now() - start)); + + ExitProgram(EXIT_SUCCESS); +} + +#else /* !(HAVE_ALLOC_PAIR && USE_WIDEC_SUPPORT) */ +int +main(void) +{ + printf("This program requires the ncurses alloc_pair function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_ALLOC_PAIR && USE_WIDEC_SUPPORT */ +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + printf("This program requires the terminfo functions such as tigetstr\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/demo_panels.c b/contrib/ncurses/test/demo_panels.c new file mode 100644 index 00000000..0553a824 --- /dev/null +++ b/contrib/ncurses/test/demo_panels.c @@ -0,0 +1,834 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 2003-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: demo_panels.c,v 1.50 2024/10/06 20:01:21 tom Exp $ + * + * Demonstrate a variety of functions from the panel library. + */ + +#include + +#if USE_LIBPANEL + +#include + +#define LAST_POS '@' +#define TEMP_POS '>' + +typedef void (*InitPanel) (void); +typedef void (*FillPanel) (NCURSES_CONST PANEL *); + +static bool use_colors = FALSE; +static bool unboxed = FALSE; +static FILE *log_in; +static FILE *log_out; + +static void +close_input(void) +{ + if (log_in != 0) { + fclose(log_in); + log_in = 0; + } +} + +static void +close_output(void) +{ + if (log_out != 0) { + fclose(log_out); + log_out = 0; + } +} + +static WINDOW * +statusline(void) +{ + WINDOW *result = stdscr; + + wmove(result, LINES - 1, 0); + wclrtoeol(result); + return result; +} + +static void +pflush(void) +{ + update_panels(); + doupdate(); +} + +static void +saywhat(NCURSES_CONST char *text) +{ + WINDOW *win = statusline(); + if (text != 0 && *text != '\0') { + waddstr(win, text); + waddstr(win, "; "); + } + waddstr(win, "press any key to continue"); +} + +static void +show_position(NCURSES_CONST char *text, + NCURSES_CONST char *also, + int which, + int ypos, + int xpos) +{ + WINDOW *win = statusline(); + + wprintw(win, "%s for panel %d now %d,%d%s", text, which, ypos, xpos, also); + wmove(stdscr, ypos, xpos); +} + +static int +get_position(NCURSES_CONST char *text, + NCURSES_CONST char *also, + int which, + int *xpos, + int *ypos) +{ + int result = 0; + int x1, y1; + char cmd; + + getyx(stdscr, y1, x1); + (void) statusline(); + + show_position(text, also, which, y1, x1); + + if (log_in != 0) { + if (fscanf(log_in, "%c%d,%d\n", &cmd, &y1, &x1) == 3) { + switch (cmd) { + case LAST_POS: + result = 1; + (void) wgetch(stdscr); + break; + case TEMP_POS: + result = 0; + wrefresh(stdscr); + napms(100); + break; + default: + result = -1; + break; + } + } else { + result = -1; + } + } else { + + switch (wgetch(stdscr)) { + case QUIT: + case ESCAPE: + case ERR: + result = -1; + break; + case ' ': + result = 1; + break; + case KEY_UP: + if (y1 > 0) { + --y1; + } else { + beep(); + } + break; + case KEY_DOWN: + if (y1 < getmaxy(stdscr)) { + ++y1; + } else { + beep(); + } + break; + case KEY_LEFT: + if (x1 > 0) { + --x1; + } else { + beep(); + } + break; + case KEY_RIGHT: + if (x1 < getmaxx(stdscr)) { + ++x1; + } else { + beep(); + } + break; + } + } + + wmove(stdscr, y1, x1); + *ypos = y1; + *xpos = x1; + + if (result >= 0) { + if (log_out) + fprintf(log_out, "%c%d,%d\n", + ((result > 0) + ? LAST_POS + : TEMP_POS), + y1, x1); + } + return result; +} + +static PANEL * +mkpanel(short color, int rows, int cols, int tly, int tlx) +{ + WINDOW *win; + PANEL *pan = 0; + char *userdata = typeMalloc(char, 6); + + if ((win = newwin(rows, cols, tly, tlx)) != 0) { + keypad(win, TRUE); + if ((pan = new_panel(win)) == 0) { + delwin(win); + } else if (use_colors) { + short fg = (short) ((color == COLOR_BLUE) + ? COLOR_WHITE + : COLOR_BLACK); + short bg = color; + + init_pair(color, fg, bg); + wbkgdset(win, (chtype) (COLOR_PAIR(color) | ' ')); + } else if (!unboxed) { + wbkgdset(win, A_BOLD | ' '); + } + } + _nc_SPRINTF(userdata, _nc_SLIMIT(4) "p%d", color % 8); + set_panel_userptr(pan, (NCURSES_CONST void *) userdata); + return pan; +} + +static void +my_remove_panel(PANEL **pans, int which) +{ + if (pans[which] != 0) { + PANEL *pan = pans[which]; + WINDOW *win = panel_window(pan); + char *user = (char *) panel_userptr(pan); + + free(user); + del_panel(pan); + delwin(win); + + pans[which] = 0; + } +} + +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define ABS(a) ((a) < 0 ? -(a) : (a)) + +static void +my_create_panel(PANEL **pans, int which, FillPanel myFill) +{ + int code; + short pair = (short) which; + short fg = (short) ((pair == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK); + short bg = pair; + int x0, y0, x1, y1; + + init_pair(pair, fg, bg); + + /* remove the old panel, if any */ + my_remove_panel(pans, which); + + /* get the position of one corner */ + wmove(stdscr, getmaxy(stdscr) / 2, getmaxx(stdscr) / 2); + getyx(stdscr, y0, x0); + while ((code = get_position("First corner", "", which, &x0, &y0)) == 0) { + ; + } + + if (code > 0) { + char also[80]; + _nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (first %d,%d)", y0, x0); + /* get the position of the opposite corner */ + while ((code = get_position("Opposite corner", + also, which, &x1, &y1)) == 0) { + ; + } + + if (code > 0) { + int tly = MIN(y0, y1); + int tlx = MIN(x0, x1); + PANEL *pan = mkpanel(pair, + ABS(y1 - y0) + 1, + ABS(x1 - x0) + 1, + tly, tlx); + /* finish */ + myFill(pan); + pans[which] = pan; + pflush(); + wmove(stdscr, y1, x1); + } + } +} + +static void +my_move_panel(PANEL **pans, int which, bool continuous) +{ + if (pans[which] != 0) { + int code; + int y0, x0; + int y1, x1; + NCURSES_CONST WINDOW *win = panel_window(pans[which]); + char also[80]; + + getbegyx(win, y0, x0); + _nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (start %d,%d)", y0, x0); + wmove(stdscr, y0, x0); + while ((code = get_position("Move panel", also, which, &x1, &y1)) == 0) { + if (continuous) { + move_panel(pans[which], y1, x1); + pflush(); + } + } + if (code > 0) { + move_panel(pans[which], y1, x1); + } + } +} + +static void +my_resize_panel(PANEL **pans, int which, FillPanel myFill) +{ + if (pans[which] != 0) { + int code; + int y0, x0; + int y1, x1; + WINDOW *win = panel_window(pans[which]); + char also[80]; + + getbegyx(win, y0, x0); + _nc_SPRINTF(also, _nc_SLIMIT(sizeof(also)) " (start %d,%d)", y0, x0); + wmove(stdscr, y0, x0); + while ((code = get_position("Resize panel", + also, which, &x1, &y1)) == 0) { + ; + } + if (code > 0) { + WINDOW *next = newwin(ABS(y1 - y0) + 1, + ABS(x1 - x0) + 1, + MIN(y0, y1), + MIN(x0, x1)); + if (next != 0) { + keypad(next, TRUE); + if (use_colors) { + wbkgdset(next, (chtype) (COLOR_PAIR(which) | ' ')); + } else if (!unboxed) { + wbkgdset(next, A_BOLD | ' '); + } + replace_panel(pans[which], next); + myFill(pans[which]); + delwin(win); + } + } + } +} + +static void +init_panel(void) +{ + register int y, x; + + for (y = 0; y < LINES - 1; y++) { + for (x = 0; x < COLS; x++) + wprintw(stdscr, "%d", (y + x) % 10); + } +} + +static void +fill_panel(NCURSES_CONST PANEL *pan) +{ + WINDOW *win = panel_window(pan); + const char *userptr = (const char *) panel_userptr(pan); + int num = (userptr && *userptr) ? userptr[1] : '?'; + int y, x; + + wmove(win, 1, 1); + wprintw(win, "-pan%c-", num); + wclrtoeol(win); + box(win, 0, 0); + for (y = 2; y < getmaxy(win) - 1; y++) { + for (x = 1; x < getmaxx(win) - 1; x++) { + wmove(win, y, x); + waddch(win, UChar(num)); + } + } +} + +static void +fill_unboxed(NCURSES_CONST PANEL *pan) +{ + WINDOW *win = panel_window(pan); + const char *userptr = (const char *) panel_userptr(pan); + int num = (userptr && *userptr) ? userptr[1] : '?'; + int y, x; + + for (y = 0; y < getmaxy(win); y++) { + for (x = 0; x < getmaxx(win); x++) { + wmove(win, y, x); + waddch(win, UChar(num)); + } + } +} + +#if USE_WIDEC_SUPPORT +static void +make_fullwidth_digit(cchar_t *target, int digit) +{ + wchar_t source[2]; + + source[0] = (wchar_t) (digit + 0xff10); + source[1] = 0; + setcchar(target, source, A_NORMAL, 0, 0); +} + +static void +init_wide_panel(void) +{ + int digit; + cchar_t temp[10]; + + for (digit = 0; digit < 10; ++digit) + make_fullwidth_digit(&temp[digit], digit); + + do { + int y, x; + getyx(stdscr, y, x); + digit = (y + x / 2) % 10; + } while (add_wch(&temp[digit]) != ERR); +} + +static void +fill_wide_panel(NCURSES_CONST PANEL *pan) +{ + WINDOW *win = panel_window(pan); + int num = ((const char *) panel_userptr(pan))[1]; + int y, x; + + wmove(win, 1, 1); + wprintw(win, "-pan%c-", num); + wclrtoeol(win); + box(win, 0, 0); + for (y = 2; y < getmaxy(win) - 1; y++) { + for (x = 1; x < getmaxx(win) - 1; x++) { + wmove(win, y, x); + waddch(win, UChar(num)); + } + } +} +#endif + +#define MAX_PANELS 5 + +static int +which_panel(PANEL *px[MAX_PANELS + 1], NCURSES_CONST PANEL *pan) +{ + int result = 0; + int j; + + for (j = 1; j <= MAX_PANELS; ++j) { + if (px[j] == pan) { + result = j; + break; + } + } + return result; +} + +static void +show_help(WINDOW *win) +{ + static const char *help[] = + { + "", + "Commands are letter/digit pairs. Digits are the panel number.", + "", + " b - put the panel on the bottom of the stack", + " c - create the panel", + " d - delete the panel", + " h - hide the panel", + " m - move the panel (M for continuous move)", + " r - resize the panel", + " s - show the panel", + " t - put the panel on the top of the stack" + }; + int j; + + for (j = 0; j < (int) SIZEOF(help); ++j) { + if (wprintw(win, "%s\n", help[j]) == ERR) + break; + } +} + +static void +show_panels(PANEL *px[MAX_PANELS + 1]) +{ + struct { + bool valid; + bool hidden; + PANEL *above; + PANEL *below; + } table[MAX_PANELS + 1]; + + WINDOW *win; + int j; + + memset(table, 0, sizeof(table)); + for (j = 1; j <= MAX_PANELS; ++j) { + table[j].valid = (px[j] != 0); + if (table[j].valid) { + table[j].hidden = panel_hidden(px[j]); + table[j].above = panel_above(px[j]); + table[j].below = panel_below(px[j]); + } + } + + if ((win = newwin(LINES - 1, COLS, 0, 0)) != 0) { + PANEL *pan; + + keypad(win, TRUE); + if ((pan = new_panel(win)) != 0) { + werase(win); + MvWPrintw(win, 0, 0, "Panels:\n"); + for (j = 1; j <= MAX_PANELS; ++j) { + if (table[j].valid) { + wprintw(win, " %d:", j); + if (table[j].hidden) { + waddstr(win, " hidden"); + } else { + if (table[j].above) { + wprintw(win, " above %d", + which_panel(px, table[j].above)); + } + if (table[j].below) { + wprintw(win, "%s below %d", + table[j].above ? "," : "", + which_panel(px, table[j].below)); + } + } + waddch(win, '\n'); + } + } + show_help(win); + wgetch(win); + del_panel(pan); + pflush(); + } + delwin(win); + } +} + +#define wrapper(func) \ +static int my_##func(PANEL *pan) \ +{ \ + int code = ERR; \ + if (pan != 0) { \ + code = func(pan); \ + } \ + return code; \ +} +/* *INDENT-OFF* */ +wrapper(bottom_panel) +wrapper(hide_panel) +wrapper(show_panel) +wrapper(top_panel) +/* *INDENT-ON* */ + +static void +do_panel(PANEL *px[MAX_PANELS + 1], + NCURSES_CONST char *cmd, + FillPanel myFill) +{ + int which = cmd[1] - '0'; + + if (which < 1 || which > MAX_PANELS) { + beep(); + return; + } + + if (log_in != 0) { + pflush(); + } + + saywhat(cmd); + switch (*cmd) { + case 'b': + my_bottom_panel(px[which]); + break; + case 'c': + my_create_panel(px, which, myFill); + break; + case 'd': + my_remove_panel(px, which); + break; + case 'h': + my_hide_panel(px[which]); + break; + case 'm': + my_move_panel(px, which, FALSE); + break; + case 'M': + my_move_panel(px, which, TRUE); + break; + case 'r': + my_resize_panel(px, which, myFill); + break; + case 's': + my_show_panel(px[which]); + break; + case 't': + my_top_panel(px[which]); + break; + } +} + +static bool +ok_letter(int ch) +{ + return isalpha(UChar(ch)) && strchr("bcdhmMrst", ch) != 0; +} + +static bool +ok_digit(int ch) +{ + return isdigit(UChar(ch)) && (ch >= '1') && (ch - '0' <= MAX_PANELS); +} + +/* + * A command consists of one or more letter/digit pairs separated by a space. + * Digits are limited to 1..MAX_PANELS. + * + * End the command with a newline. Reject other characters. + */ +static bool +get_command(PANEL *px[MAX_PANELS + 1], char *buffer, int limit) +{ + int length = 0; + int y0, x0; + WINDOW *win; + + getyx(stdscr, y0, x0); + win = statusline(); + waddstr(win, "Command:"); + buffer[length = 0] = '\0'; + + if (log_in != 0) { + if (fgets(buffer, limit - 3, log_in) != 0) { + length = (int) strlen(buffer); + while (length > 0 && isspace(UChar(buffer[length - 1]))) + buffer[--length] = '\0'; + waddstr(win, buffer); + } else { + close_input(); + } + (void) wgetch(win); + } else { + int c0 = 0; + for (;;) { + int ch = wgetch(win); + if (ch == ERR || ch == QUIT || ch == ESCAPE) { + buffer[0] = '\0'; + break; + } else if (ch == CTRL('L')) { + wrefresh(curscr); + } else if (ch == '\n' || ch == KEY_ENTER) { + break; + } else if (ch == HELP_KEY_1) { + show_panels(px); + } else if (length + 3 < limit) { + if (ch >= KEY_MIN) { + beep(); + } else if (ok_letter(UChar(ch))) { + if (isalpha(UChar(c0))) { + beep(); + } else if (isdigit(UChar(c0))) { + wprintw(win, " %c", ch); + buffer[length++] = ' '; + buffer[length++] = (char) (c0 = ch); + } else { + wprintw(win, "%c", ch); + buffer[length++] = (char) (c0 = ch); + } + } else if (ok_digit(ch)) { + if (isalpha(UChar(c0))) { + wprintw(win, "%c", ch); + buffer[length++] = (char) (c0 = ch); + } else { + beep(); + } + } else if (ch == ' ') { + if (isdigit(UChar(c0))) { + wprintw(win, "%c", ch); + buffer[length++] = (char) (c0 = ch); + } else { + beep(); + } + } else { + beep(); + } + } else { + beep(); + } + } + } + + wmove(stdscr, y0, x0); + + buffer[length] = '\0'; + if (log_out && length) { + fprintf(log_out, "%s\n", buffer); + } + return (length != 0); +} + +static void +demo_panels(InitPanel myInit, FillPanel myFill) +{ + int itmp; + PANEL *px[MAX_PANELS + 1]; + char buffer[BUFSIZ]; + + scrollok(stdscr, FALSE); /* we don't want stdscr to scroll! */ + refresh(); + + myInit(); + memset(px, 0, sizeof(px)); + + while (get_command(px, buffer, sizeof(buffer))) { + int limit = (int) strlen(buffer); + for (itmp = 0; itmp < limit; itmp += 3) { + do_panel(px, buffer + itmp, myFill); + } + pflush(); + } +#if NO_LEAKS + for (itmp = 1; itmp <= MAX_PANELS; ++itmp) { + my_remove_panel(px, itmp); + } +#endif +} + +static void +usage(int ok) +{ + static const char *const tbl[] = + { + "Usage: demo_panels [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -i file read commands from file" + ," -o file record commands in file" + ," -m do not use colors" +#if USE_WIDEC_SUPPORT + ," -w use wide-characters in panels and background" +#endif + ," -x do not enclose panels in boxes" + }; + size_t n; + for (n = 0; n < SIZEOF(tbl); n++) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + bool monochrome = FALSE; + InitPanel myInit = init_panel; + FillPanel myFill = fill_panel; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "i:o:mwx")) != -1) { + switch (ch) { + case 'i': + log_in = fopen(optarg, "r"); + break; + case 'o': + log_out = fopen(optarg, "w"); + break; + case 'm': + monochrome = TRUE; + break; +#if USE_WIDEC_SUPPORT + case 'w': + myInit = init_wide_panel; + myFill = fill_wide_panel; + break; +#endif + case 'x': + unboxed = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (unboxed) + myFill = fill_unboxed; + + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + + use_colors = monochrome ? FALSE : has_colors(); + if (use_colors) + start_color(); + + demo_panels(myInit, myFill); + endwin(); + + close_input(); + close_output(); + + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the curses panel library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/demo_tabs.c b/contrib/ncurses/test/demo_tabs.c new file mode 100644 index 00000000..16c1ad57 --- /dev/null +++ b/contrib/ncurses/test/demo_tabs.c @@ -0,0 +1,127 @@ +/**************************************************************************** + * Copyright 2019-2020,2022 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: demo_tabs.c,v 1.10 2022/12/04 00:40:11 tom Exp $ + * + * A simple demo of tabs in curses. + */ +#define USE_CURSES +#define USE_TINFO +#include + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_tabs [options]" + ,"" + ,"Print a grid to test tab-stops with the curses interface" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -l COUNT total number of lines to show" + ," -t NUM set TABSIZE variable to the given value" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int tabstop; + int ch, col, row, step; + int line_limit = -1; + int curses_stops = -1; + + while ((ch = getopt(argc, argv, OPTS_COMMON "l:t:")) != -1) { + switch (ch) { + case 'l': + line_limit = atoi(optarg); + break; + case 't': + curses_stops = atoi(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + initscr(); + noecho(); + cbreak(); + if (curses_stops > 0) + set_tabsize(curses_stops); +#if HAVE_TIGETNUM + tabstop = tigetnum("it"); + if (tabstop <= 0) +#endif + tabstop = 8; + for (row = 0; row < LINES; ++row) { + move(row, 0); + for (col = step = 0; col < COLS - 1; ++col) { + if (row == 0) { + chtype ct = '-'; + if ((col % tabstop) == 0) + ct = '+'; + addch(ct); + } else if (col + 1 < row) { + addch('*'); + } else { + printw("%x", step); + col = (row + (tabstop * ++step)); + col /= tabstop; + col *= tabstop; + col -= 1; + if ((col + tabstop) < COLS) + addch('\t'); + refresh(); + } + } + addch('\n'); + if (line_limit > 0 && row >= line_limit) + break; + } + getch(); + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/demo_termcap.c b/contrib/ncurses/test/demo_termcap.c new file mode 100644 index 00000000..67140665 --- /dev/null +++ b/contrib/ncurses/test/demo_termcap.c @@ -0,0 +1,933 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2005-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: demo_termcap.c,v 1.70 2024/10/06 20:05:09 tom Exp $ + * + * A simple demo of the termcap interface. + */ +#define USE_TINFO +#include +#include + +#if NCURSES_XNAMES +#if HAVE_TERM_ENTRY_H +#include +#else +#undef NCURSES_XNAMES +#define NCURSES_XNAMES 0 +#endif +#endif + +#if defined(NCURSES_VERSION) +#if HAVE_NCURSES_TERMCAP_H +#include +#elif HAVE_TERMCAP_H +#include +#endif +#endif + +static GCC_NORETURN void failed(const char *); + +static void +failed(const char *msg) +{ + fprintf(stderr, "%s\n", msg); + ExitProgram(EXIT_FAILURE); +} + +#if HAVE_TGETENT + +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) +#define USE_CODE_LISTS 1 +#else +#define USE_CODE_LISTS 0 +#endif + +#define FCOLS 8 +#define FNAME(type) "%s %-*s = ", #type, FCOLS + +static bool b_opt = FALSE; +static bool n_opt = FALSE; +static bool s_opt = FALSE; +static bool q_opt = FALSE; +#ifdef NCURSES_VERSION +static bool x_opt = FALSE; +static bool y_opt = FALSE; +#endif + +static char *d_opt; +static char *e_opt; +static char **db_list; +static int db_item; + +static char *my_blob; +static char **my_boolcodes; +static char **my_numcodes; +static char **my_numvalues; +static char **my_strcodes; +static char **my_strvalues; + +static long total_values; +static long total_b_values; +static long total_n_values; +static long total_s_values; + +#define isCapName(c) (isgraph(c) && strchr("^=:\\", c) == 0) +#define EachCapName(n) n = 33; n < 127; ++n + +static char * +make_dbitem(const char *const p, const char *const q) +{ + size_t need = strlen(e_opt) + 2 + (size_t) (p - q); + char *result = malloc(need); + _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q); + return result; +} + +static void +make_dblist(void) +{ + if (d_opt && e_opt) { + int pass; + + for (pass = 0; pass < 2; ++pass) { + char *p, *q; + size_t count = 0; + + for (p = q = d_opt; *p != '\0'; ++p) { + if (*p == ':') { + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + q = p + 1; + } + } + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + if (!pass) { + db_list = typeCalloc(char *, count + 1); + } + } + } +} + +static char * +next_dbitem(void) +{ + char *result = 0; + + if (db_list) { + if ((result = db_list[db_item]) == 0) { + db_item = 0; + result = db_list[0]; + } else { + db_item++; + } + } + if (result != 0) + printf("** %s\n", result); + return result; +} + +#if NO_LEAKS +static void +free_dblist(void) +{ + if (db_list) { + int n; + for (n = 0; db_list[n]; ++n) + free(db_list[n]); + free(db_list); + db_list = 0; + } +} +#endif /* NO_LEAKS */ + +static void +show_string(const char *name, const char *value) +{ + printf(FNAME(str), name); + if (value == ((char *) -1)) { + printf("CANCELLED"); + } else if (value == ((char *) 0)) { + printf("ABSENT"); + } else { + while (*value != 0) { + int ch = UChar(*value++); + switch (ch) { + case '\177': + fputs("^?", stdout); + break; + case '\033': + fputs("\\E", stdout); + break; + case '\b': + fputs("\\b", stdout); + break; + case '\f': + fputs("\\f", stdout); + break; + case '\n': + fputs("\\n", stdout); + break; + case '\r': + fputs("\\r", stdout); + break; + case ' ': + fputs("\\s", stdout); + break; + case '\t': + fputs("\\t", stdout); + break; + case '^': + fputs("\\^", stdout); + break; + case ':': + fputs("\\072", stdout); + break; + case '\\': + fputs("\\\\", stdout); + break; + default: + if (isgraph(ch)) + fputc(ch, stdout); + else if (ch < 32) + printf("^%c", ch + '@'); + else + printf("\\%03o", ch); + break; + } + } + } + printf("\n"); +} + +static void +show_number(const char *name, int value) +{ + printf(FNAME(num), name); + printf(" %d\n", value); +} + +static void +dumpit(NCURSES_CONST char *cap) +{ + /* + * One of the limitations of the termcap interface is that the library + * cannot determine the size of the buffer passed via tgetstr(), nor the + * amount of space remaining. This demo simply reuses the whole buffer + * for each call; a normal termcap application would try to use the buffer + * to hold all of the strings extracted from the terminal entry. + */ + char area[1024], *ap = area; + NCURSES_CONST char *str; + int num; + + if ((str = tgetstr(cap, &ap)) != 0) { + total_values++; + total_s_values++; + if (!q_opt) { + /* + * Note that the strings returned are mostly terminfo format, since + * ncurses does not convert except for a handful of special cases. + */ + show_string(cap, str); + } + } else if ((num = tgetnum(cap)) >= 0) { + total_values++; + total_n_values++; + if (!q_opt) { + show_number(cap, num); + } + } else if (tgetflag(cap) > 0) { + total_values++; + total_b_values++; + if (!q_opt) { + printf(FNAME(flg), cap); + printf("%s\n", "true"); + } + } + + if (!q_opt) + fflush(stdout); +} + +static void +brute_force(NCURSES_CONST char *name) +{ + char buffer[1024]; + + if (db_list) { + putenv(next_dbitem()); + } + if (!q_opt) + printf("Terminal type \"%s\"\n", name); + if (tgetent(buffer, name) >= 0) { + char cap[3]; + int c1, c2; + + cap[2] = 0; + for (EachCapName(c1)) { + cap[0] = (char) c1; + if (isCapName(c1)) { + for (EachCapName(c2)) { + cap[1] = (char) c2; + if (isCapName(c2)) { + dumpit(cap); + } + } + } + } + } +} + +#if NCURSES_XNAMES +static void +dump_xname(NCURSES_CONST char *cap) +{ + if (strlen(cap) == 2) + dumpit(cap); +} +#endif + +static void +demo_termcap(NCURSES_CONST char *name) +{ + char buffer[1024]; + + if (db_list) { + putenv(next_dbitem()); + } + if (!q_opt) + printf("Terminal type \"%s\"\n", name); + if (tgetent(buffer, name) >= 0) { + NCURSES_CONST char *cap; + unsigned n; + + if (b_opt) { + for (n = 0;; ++n) { + cap = my_boolcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } + + if (n_opt) { + for (n = 0;; ++n) { + cap = my_numcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } + + if (s_opt) { + for (n = 0;; ++n) { + cap = my_strcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } +#ifdef NCURSES_VERSION + if (x_opt && (my_blob == 0) && y_opt) { +#if NCURSES_XNAMES + NCURSES_CONST TERMTYPE *term = (TERMTYPE *) cur_term; + if (term != 0 + && ((NUM_BOOLEANS(term) != BOOLCOUNT) + || (NUM_NUMBERS(term) != NUMCOUNT) + || (NUM_STRINGS(term) != STRCOUNT))) { + for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { + dump_xname(ExtBoolname(term, (int) n, boolnames)); + } + for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { + dump_xname(ExtNumname(term, (int) n, numnames)); + } + for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { + dump_xname(ExtStrname(term, (int) n, strnames)); + } + } +#endif + } +#endif + } +} + +typedef enum { + pDefault = 0 + ,pComment + ,pDescription + ,pEscaped + ,pNewline + ,pName + ,pNumber + ,pString +} STATE; + +static void +parse_description(const char *input_name) +{ + static char empty[1] = + {0}; + + FILE *fp; + struct stat sb; + size_t count_bools = 0; + size_t count_nums = 0; + size_t count_strs = 0; + size_t len; + size_t j, k; + STATE state; + + if (stat(input_name, &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG) { + failed("input is not a file"); + } + + if (sb.st_size == 0) { + failed("input is empty"); + } + + /* + * None of the arrays could be larger than the input-file, and since it + * is small, just allocate the maximum for simplicity. + */ + if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0 || + (my_boolcodes = typeCalloc(char *, sb.st_size)) == 0 || + (my_numcodes = typeCalloc(char *, sb.st_size)) == 0 || + (my_numvalues = typeCalloc(char *, sb.st_size)) == 0 || + (my_strcodes = typeCalloc(char *, sb.st_size)) == 0 || + (my_strvalues = typeCalloc(char *, sb.st_size)) == 0) { + failed("cannot allocate memory for input-file"); + } + + if ((fp = fopen(input_name, "r")) == 0) { + failed("cannot open input-file"); + } else { + len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp); + my_blob[sb.st_size] = '\0'; + fclose(fp); + } + + /* + * First, get rid of comments and escaped newlines, as well as repeated + * colons to construct a canonical entry. + * + * FIXME: actually this should make an additional pass just to strip + * comment-lines and escaped newlines. But it is workable for infocmp + * output. + */ + state = pNewline; + for (j = k = 0; j < len; ++j) { + int ch = my_blob[j]; + if (ch == '\t') { + ch = ' '; + } + switch (state) { + case pNewline: + if (ch == ' ') { + continue; + } + if (ch == '#') { + state = pComment; + continue; + } + state = pDefault; + /* FALLTHRU */ + case pDefault: + switch (ch) { + case '|': + state = pDescription; + continue; + case '\\': + state = pEscaped; + continue; + case '\n': + state = pNewline; + continue; + case ' ': + case ':': + break; + default: + state = pName; + break; + } + my_blob[k++] = (char) ch; + break; + case pComment: + if (ch == '\n') + state = pNewline; + break; + case pDescription: + switch (ch) { + case ':': + state = pDefault; + break; + case '\n': + state = pNewline; + break; + } + break; + case pEscaped: + if (ch != '\n') { + my_blob[k++] = (char) ch; + state = pDefault; + } else { + state = pNewline; + } + break; + case pName: + switch (ch) { + case '\n': + state = pNewline; + continue; + case ' ': + case ':': + state = pDefault; + break; + case '#': + state = pNumber; + break; + case '|': + state = pDescription; + continue; + } + my_blob[k++] = (char) ch; + break; + case pNumber: + switch (ch) { + case '\n': + state = pNewline; + continue; + case ':': + state = pDefault; + break; + case ' ': + state = pDefault; + continue; + } + my_blob[k++] = (char) ch; + break; + case pString: + switch (ch) { + case '\\': + if (my_blob[j + 1] == '\0') { + state = pDefault; + continue; + } + break; + case '\n': + state = pNewline; + continue; + case ':': + state = pDefault; + break; + } + my_blob[k++] = (char) ch; + break; + default: + /* not used */ + break; + } + } + my_blob[k] = '\0'; + + /* + * Then, parse what's left, making indexes of the names and values. + */ + state = pDefault; + for (j = 0; my_blob[j] != '\0'; ++j) { + switch (state) { + case pDefault: + switch (my_blob[j]) { + case '\\': + state = pEscaped; + break; + case ':': + my_blob[j] = '\0'; + if (my_blob[j + 1] != '\0' && my_blob[j + 1] != ':') + state = pName; + break; + case ' ': + break; + default: + break; + } + case pEscaped: + break; + case pName: + state = pDefault; + /* + * Commented-out capabilities might be accessible (they are in + * ncurses). + */ + if (my_blob[j] == '.' && my_blob[j + 1] == '.') { + j += 2; + } + if (my_blob[j + 1] != '\0') { + switch (my_blob[j + 2]) { + case '#': + my_numvalues[count_nums] = &my_blob[j + 3]; + my_numcodes[count_nums++] = &my_blob[j]; + my_blob[j + 2] = '\0'; + state = pNumber; + j += 2; + break; + case '=': + my_strvalues[count_strs] = &my_blob[j + 3]; + my_strcodes[count_strs++] = &my_blob[j]; + my_blob[j + 2] = '\0'; + state = pString; + j += 2; + break; + default: + if (my_blob[j + 2] == '@') { + /* + * We cannot get the type for a cancelled item + * directly, but can infer it assuming the input + * came from infocmp, which puts the data in a + * known order. + */ + if (count_strs) { + my_strvalues[count_strs] = empty; + my_strcodes[count_strs++] = &my_blob[j]; + } else if (count_nums) { + my_numvalues[count_nums] = empty; + my_numcodes[count_nums++] = &my_blob[j]; + } else { + my_boolcodes[count_bools++] = &my_blob[j]; + } + } else { + my_boolcodes[count_bools++] = &my_blob[j]; + } + j++; + break; + } + } + break; + case pNumber: + if (!isdigit(UChar(my_blob[j]))) { + --j; + state = pDefault; + } + break; + case pString: + switch (my_blob[j]) { + case '\\': + if (my_blob[j + 1] == '\0') { + state = pDefault; + continue; + } else { + ++j; + } + break; + case '\n': + state = pNewline; + continue; + case ':': + --j; + state = pDefault; + break; + } + break; + case pNewline: + case pComment: + case pDescription: + default: + break; + } + } + my_boolcodes[count_bools] = 0; + my_numcodes[count_nums] = 0; + my_numvalues[count_nums] = 0; + my_strcodes[count_strs] = 0; + my_strvalues[count_strs] = 0; + +#if 0 + printf("bools:%d\n", (int) count_bools); + for (j = 0; my_boolcodes[j]; ++j) + printf("%5d:%s\n", (int) j, my_boolcodes[j]); + + printf("numbers:%d\n", (int) count_nums); + for (j = 0; my_numcodes[j]; ++j) + printf("%5d:%s(%s)\n", (int) j, my_numcodes[j], my_numvalues[j]); + + printf("strings:%d\n", (int) count_strs); + for (j = 0; my_strcodes[j]; ++j) + printf("%5d:%s(%s)\n", (int) j, my_strcodes[j], my_strvalues[j]); +#endif +} + +#if USE_CODE_LISTS +static char ** +copy_code_list(NCURSES_CONST char *const *list) +{ + int pass; + size_t count; + size_t length = 1; + char **result = 0; + char *unused = 0; + + for (pass = 0; pass < 2; ++pass) { + for (count = 0; list[count] != 0; ++count) { + size_t chunk = strlen(list[count]) + 1; + if (pass == 0) { + length += chunk; + } else { + result[count] = unused; + _nc_STRCPY(unused, list[count], length); + unused += chunk; + } + } + if (pass == 0) { + char *blob = malloc(length); + result = typeCalloc(char *, count + 1); + unused = blob; + if (blob == 0 || result == 0) + failed("copy_code_list failed"); + } + } + + return result; +} + +#if NO_LEAKS +static void +free_code_list(char **list) +{ + if (list) { + free(list[0]); + free(list); + } +} +#endif /* NO_LEAKS */ +#endif /* USE_CODE_LISTS */ + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_termcap [options] [terminal]" + ,"" + ,"If no options are given, print all (boolean, numeric, string)" + ,"capabilities for the given terminal, using short names." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -a try all names, print capabilities found" + ," -b print boolean-capabilities" + ," -d LIST colon-separated list of databases to use" + ," -e NAME environment variable to set with -d option" + ," -i NAME terminal description to use as names for \"-a\" option, etc." + ," -n print numeric-capabilities" + ," -q quiet (prints only counts)" + ," -r COUNT repeat for given count" + ," -s print string-capabilities" + ," -v print termcap-variables" +#ifdef NCURSES_VERSION + ," -x print extended capabilities" +#endif + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int n; + NCURSES_CONST char *name; + bool a_opt = FALSE; +#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED) + bool v_opt = FALSE; +#endif + NCURSES_CONST char *input_name = 0; + + int repeat; + int r_opt = 1; + + while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:i:nqr:svxy")) != -1) { + switch (ch) { + case 'a': + a_opt = TRUE; + break; + case 'b': + b_opt = TRUE; + break; + case 'd': + d_opt = optarg; + break; + case 'e': + e_opt = optarg; + break; + case 'i': + input_name = optarg; + break; + case 'n': + n_opt = TRUE; + break; + case 'q': + q_opt = TRUE; + break; + case 'r': + if ((r_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 's': + s_opt = TRUE; + break; +#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED) + case 'v': + v_opt = TRUE; + break; +#endif +#ifdef NCURSES_VERSION +#if NCURSES_XNAMES + case 'x': + x_opt = TRUE; + break; + case 'y': + y_opt = TRUE; + x_opt = TRUE; + break; +#endif +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + +#if HAVE_USE_EXTENDED_NAMES + use_extended_names(x_opt); +#endif + + if (!(b_opt || n_opt || s_opt)) { + b_opt = TRUE; + n_opt = TRUE; + s_opt = TRUE; + } + + make_dblist(); + + if (a_opt) { + for (repeat = 0; repeat < r_opt; ++repeat) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + brute_force(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + brute_force(name); + } else { + static NCURSES_CONST char dumb[] = "dumb"; + brute_force(dumb); + } + } + } else { + if (input_name != 0) { + parse_description(input_name); + } +#if USE_CODE_LISTS + else { + my_boolcodes = copy_code_list(boolcodes); + my_numcodes = copy_code_list(numcodes); + my_strcodes = copy_code_list(strcodes); + } +#else + else { + failed("no capability-lists available (use -i option)"); + } +#endif /* USE_CODE_LISTS */ + for (repeat = 0; repeat < r_opt; ++repeat) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + demo_termcap(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + demo_termcap(name); + } else { + static NCURSES_CONST char dumb[] = "dumb"; + demo_termcap(dumb); + } + } + } + + printf("%ld values (%ld booleans, %ld numbers, %ld strings)\n", + total_values, total_b_values, total_n_values, total_s_values); + +#if defined(NCURSES_VERSION) || defined(HAVE_CURSES_DATA_OSPEED) + if (v_opt) { + show_number("PC", PC); + show_string("UP", UP); + show_string("BC", BC); + show_number("ospeed", (int) ospeed); + } +#endif + +#if NO_LEAKS + free_dblist(); +#if USE_CODE_LISTS + free_code_list(my_boolcodes); + free_code_list(my_numcodes); + free_code_list(my_strcodes); +#endif +#endif /* NO_LEAKS */ + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + failed("This program requires termcap"); +} +#endif diff --git a/contrib/ncurses/test/demo_terminfo.c b/contrib/ncurses/test/demo_terminfo.c new file mode 100644 index 00000000..8841711f --- /dev/null +++ b/contrib/ncurses/test/demo_terminfo.c @@ -0,0 +1,965 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2009-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: demo_terminfo.c,v 1.59 2024/10/06 21:16:43 tom Exp $ + * + * A simple demo of the terminfo interface. + */ +#define USE_TINFO +#include +#include + +#if NCURSES_XNAMES +#if HAVE_TERM_ENTRY_H +#include +#else +#undef NCURSES_XNAMES +#define NCURSES_XNAMES 0 +#endif +#endif + +static GCC_NORETURN void failed(const char *); + +static void +failed(const char *msg) +{ + fprintf(stderr, "%s\n", msg); + ExitProgram(EXIT_FAILURE); +} + +#if HAVE_TIGETSTR + +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) +#define USE_CODE_LISTS 1 +#else +#define USE_CODE_LISTS 0 +#endif + +static bool a_opt = FALSE; +static bool b_opt = FALSE; +static bool f_opt = FALSE; +static bool n_opt = FALSE; +static bool q_opt = FALSE; +static bool s_opt = FALSE; +#ifdef NCURSES_VERSION +static bool x_opt = FALSE; +static bool y_opt = FALSE; +#endif + +static char *d_opt; +static char *e_opt; +static char **db_list; +static int db_item; + +static char *my_blob; +static char **my_boolcodes; +static char **my_numcodes; +static char **my_numvalues; +static char **my_strcodes; +static char **my_strvalues; + +static long total_values; +static long total_b_values; +static long total_n_values; +static long total_s_values; + +#define FCOLS 8 +#define FNAME(type) "%s %-*s = ", #type, f_opt ? 24 : FCOLS + +static char * +make_dbitem(const char *const p, const char *const q) +{ + size_t need = strlen(e_opt) + 2 + (size_t) (p - q); + char *result = malloc(need); + _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q); + return result; +} + +static void +make_dblist(void) +{ + if (d_opt && e_opt) { + int pass; + + for (pass = 0; pass < 2; ++pass) { + char *p, *q; + size_t count = 0; + + for (p = q = d_opt; *p != '\0'; ++p) { + if (*p == ':') { + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + q = p + 1; + } + } + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + if (!pass) { + db_list = typeCalloc(char *, count + 1); + } + } + } +} + +static char * +next_dbitem(void) +{ + char *result = 0; + + if (db_list) { + if ((result = db_list[db_item]) == 0) { + db_item = 0; + result = db_list[0]; + } else { + db_item++; + } + } + if (result != 0) + printf("** %s\n", result); + return result; +} + +#if NO_LEAKS +static void +free_dblist(void) +{ + if (db_list) { + int n; + for (n = 0; db_list[n]; ++n) + free(db_list[n]); + free(db_list); + db_list = 0; + } +} +#endif + +static void +dumpit(NCURSES_CONST char *cap, const char *show) +{ + const char *str; + int num; + + if ((str = tigetstr(cap)) != 0 && (str != (char *) -1)) { + total_values++; + total_s_values++; + if (!q_opt) { + printf(FNAME(str), show ? show : cap); + while (*str != 0) { + int ch = UChar(*str++); + switch (ch) { + case '\177': + fputs("^?", stdout); + break; + case '\033': + fputs("\\E", stdout); + break; + case '\b': + fputs("\\b", stdout); + break; + case '\f': + fputs("\\f", stdout); + break; + case '\n': + fputs("\\n", stdout); + break; + case '\r': + fputs("\\r", stdout); + break; + case ' ': + fputs("\\s", stdout); + break; + case '\t': + fputs("\\t", stdout); + break; + case '^': + fputs("\\^", stdout); + break; + case ':': + fputs("\\072", stdout); + break; + case '\\': + fputs("\\\\", stdout); + break; + default: + if (isgraph(ch)) + fputc(ch, stdout); + else if (ch < 32) + printf("^%c", ch + '@'); + else + printf("\\%03o", ch); + break; + } + } + printf("\n"); + } + } else if ((num = tigetnum(cap)) >= 0) { + total_values++; + total_n_values++; + if (!q_opt) { + printf(FNAME(num), show ? show : cap); + printf(" %d\n", num); + } + } else if ((num = tigetflag(cap)) >= 0) { + total_values++; + total_b_values++; + if (!q_opt) { + printf(FNAME(flg), show ? show : cap); + printf("%s\n", num ? "true" : "false"); + } + } + + if (!q_opt) + fflush(stdout); +} + +#define isCapName(c) (isalnum(UChar(c)) || ((c) == '_')) +#define LegalItem(c,n) (n) + +static void +brute_force(NCURSES_CONST char *name) +{ +#define MAX_FORCE 5 /* omit "colors", since CPU-time is a problem */ + static const char legal[] = "\ +0123456789\ +ABCDEFGHIJKLMNOPQRSTUVWXYZ\ +abcdefghijklmnopqrstuvwxyz_"; + int length; + int j, k; + bool carry; + bool changed; + char cap[MAX_FORCE + 1]; + int item[MAX_FORCE + 1]; + + if (db_list) { + putenv(next_dbitem()); + } + if (!q_opt) + printf("Terminal type \"%s\"\n", name); + setupterm((NCURSES_CONST char *) name, 1, (int *) 0); + if (!q_opt) { + if (strcmp(name, ttytype)) + printf("... actual \"%s\"\n", ttytype); + } + + for (length = 1; length <= MAX_FORCE; ++length) { + /* set all digits to zeros */ + for (j = 0; j < length; ++j) { + item[j] = LegalItem(j, 0); + } + + do { + changed = FALSE; + /* copy digits to cap-name */ + for (j = 0; j < length; ++j) { + cap[j] = legal[item[j]]; + } + cap[length] = '\0'; + dumpit(cap, NULL); + + k = length - 1; + do { + carry = FALSE; + for (; k >= 0; --k) { + item[k] += 1; + if (legal[item[k]]) { + changed = TRUE; + break; + } + if (k > 0 && + legal[item[k - 1] + 1]) { + for (j = k; j < length; ++j) { + item[j] = LegalItem(j, 0); + } + carry = TRUE; + changed = TRUE; + } + } + } while (carry); + } while (changed); + } + del_curterm(cur_term); +} + +#if USE_CODE_LISTS +#define fullname(type,n) f_opt ? type##fnames[n] : cap +#else +#define fullname(type,n) cap +#endif + +static void +demo_terminfo(NCURSES_CONST char *name) +{ + unsigned n; + NCURSES_CONST char *cap; + + if (db_list) { + putenv(next_dbitem()); + } + if (!q_opt) + printf("Terminal type \"%s\"\n", name); + setupterm(name, 1, (int *) 0); + + if (b_opt) { + for (n = 0;; ++n) { + cap = my_boolcodes[n]; + if (cap == 0) + break; + dumpit(cap, fullname(bool, n)); + } + } + + if (n_opt) { + for (n = 0;; ++n) { + cap = my_numcodes[n]; + if (cap == 0) + break; + dumpit(cap, fullname(num, n)); + } + } + + if (s_opt) { + for (n = 0;; ++n) { + cap = my_strcodes[n]; + if (cap == 0) + break; + dumpit(cap, fullname(str, n)); + } + } +#ifdef NCURSES_VERSION + if (x_opt && (my_blob == 0)) { + if (y_opt) { +#if NCURSES_XNAMES + const TERMTYPE *term = (TERMTYPE *) cur_term; + if (term != 0 + && ((NUM_BOOLEANS(term) != BOOLCOUNT) + || (NUM_NUMBERS(term) != NUMCOUNT) + || (NUM_STRINGS(term) != STRCOUNT))) { + for (n = BOOLCOUNT; n < NUM_BOOLEANS(term); ++n) { + dumpit(ExtBoolname(term, (int) n, boolnames), NULL); + } + for (n = NUMCOUNT; n < NUM_NUMBERS(term); ++n) { + dumpit(ExtNumname(term, (int) n, numnames), NULL); + } + for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { + dumpit(ExtStrname(term, (int) n, strnames), NULL); + } + } +#endif + } else { + char temp[80]; + static const char *xterm_keys[] = + { + "kDC", "kDN", "kEND", "kHOM", "kIC", + "kLFT", "kNXT", "kPRV", "kRIT", "kUP", + }; + for (n = 0; n < SIZEOF(xterm_keys); ++n) { + int mod; + for (mod = 0; mod < 8; ++mod) { + if (mod == 0) { + /* these happen to be standard - avoid duplicates */ + if (!strcmp(xterm_keys[n], "kDC") || + !strcmp(xterm_keys[n], "kEND") || + !strcmp(xterm_keys[n], "kHOM") || + !strcmp(xterm_keys[n], "kLFT") || + !strcmp(xterm_keys[n], "kRIT")) { + continue; + } + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%.*s", 8, xterm_keys[n]); + } else { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%.*s%d", 8, xterm_keys[n], mod); + } + dumpit(temp, NULL); + } + } + } + } +#endif + del_curterm(cur_term); +} + +typedef enum { + pDefault = 0 + ,pComment + ,pDescription + ,pEscaped + ,pNewline + ,pName + ,pNumber + ,pString +} STATE; + +static void +parse_description(const char *input_name) +{ + static char empty[1] = + {0}; + + FILE *fp; + struct stat sb; + size_t count_bools = 0; + size_t count_nums = 0; + size_t count_strs = 0; + size_t len; + size_t j, k, jl; + STATE state; + + if (stat(input_name, &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG) { + failed("input is not a file"); + } + + if (sb.st_size == 0) { + failed("input is empty"); + } + + /* + * None of the arrays could be larger than the input-file, and since it + * is small, just allocate the maximum for simplicity. + */ + if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0 || + (my_boolcodes = typeCalloc(char *, sb.st_size)) == 0 || + (my_numcodes = typeCalloc(char *, sb.st_size)) == 0 || + (my_numvalues = typeCalloc(char *, sb.st_size)) == 0 || + (my_strcodes = typeCalloc(char *, sb.st_size)) == 0 || + (my_strvalues = typeCalloc(char *, sb.st_size)) == 0) { + failed("cannot allocate memory for input-file"); + } + + if ((fp = fopen(input_name, "r")) == 0) { + failed("cannot open input-file"); + } else { + len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp); + my_blob[sb.st_size] = '\0'; + fclose(fp); + } + + /* + * First, get rid of comments and escaped newlines, as well as repeated + * colons to construct a canonical entry. + */ + state = pNewline; + for (j = k = 0; j < len; ++j) { + int ch = my_blob[j]; + if (ch == '\t') { + ch = ' '; + } + switch (state) { + case pNewline: + if (ch == ' ') { + continue; + } + if (ch == '#') { + state = pComment; + continue; + } + state = pDefault; + /* FALLTHRU */ + case pDefault: + switch (ch) { + case '|': + state = pDescription; + continue; + case '\\': + state = pEscaped; + continue; + case '\n': + state = pNewline; + continue; + case ' ': + break; + case ',': + my_blob[k++] = (char) ch; + break; + default: + if (isalpha(UChar(ch))) + state = pName; + else + fprintf(stderr, "OOPS @%d:%.20s\n", __LINE__, my_blob + j); + my_blob[k++] = (char) ch; + break; + } + break; + case pComment: + if (ch == '\n') + state = pNewline; + break; + case pDescription: + switch (ch) { + case ',': + state = pDefault; + break; + case '\n': + state = pNewline; + break; + } + break; + case pEscaped: + if (ch != '\n') { + my_blob[k++] = (char) ch; + state = pDefault; + } else { + state = pNewline; + } + break; + case pName: + switch (ch) { + case '\n': + state = pNewline; + continue; + case ' ': + case ',': + state = pDefault; + break; + case '#': + state = pNumber; + break; + case '=': + state = pString; + break; + case '|': + state = pDescription; + continue; + } + my_blob[k++] = (char) ch; + break; + case pNumber: + switch (ch) { + case '\n': + state = pNewline; + continue; + case ',': + state = pDefault; + break; + case ' ': + state = pDefault; + continue; + } + my_blob[k++] = (char) ch; + break; + case pString: + switch (ch) { + case '\n': + state = pNewline; + break; + case ',': + state = pDefault; + my_blob[k++] = (char) ch; + break; + default: + my_blob[k++] = (char) ch; + break; + } + break; + default: + /* not used */ + break; + } + } + my_blob[k] = '\0'; + + /* + * Then, parse what's left, making indexes of the names and values. + */ + state = pDefault; + for (j = 0; my_blob[j] != '\0'; ++j) { + switch (state) { + case pDefault: + switch (my_blob[j]) { + case '\\': + state = pEscaped; + break; + case ',': + my_blob[j] = '\0'; + if (my_blob[j + 1] != '\0' && my_blob[j + 1] != ',') + state = pName; + break; + case ' ': + break; + default: + break; + } + case pEscaped: + break; + case pName: + state = pDefault; + if (isalpha(UChar(my_blob[j]))) { + for (jl = 1; isalnum(UChar(my_blob[j + jl])); ++jl) { + ; + } + } else { + jl = 0; + } + if (jl != 0) { + switch (my_blob[j + jl]) { + case '#': + my_numvalues[count_nums] = &my_blob[j + jl + 1]; + my_numcodes[count_nums++] = &my_blob[j]; + my_blob[j + jl] = '\0'; + state = pNumber; + j += jl; + break; + case '=': + my_strvalues[count_strs] = &my_blob[j + jl + 1]; + my_strcodes[count_strs++] = &my_blob[j]; + my_blob[j + jl] = '\0'; + state = pString; + j += jl; + break; + default: + if (my_blob[j + jl] == '@') { + /* + * We cannot get the type for a cancelled item + * directly, but can infer it assuming the input + * came from infocmp, which puts the data in a + * known order. + */ + if (count_strs) { + my_strvalues[count_strs] = empty; + my_strcodes[count_strs++] = &my_blob[j]; + } else if (count_nums) { + my_numvalues[count_nums] = empty; + my_numcodes[count_nums++] = &my_blob[j]; + } else { + my_boolcodes[count_bools++] = &my_blob[j]; + } + my_blob[j + jl] = '\0'; + j += jl + 1; + } else { + my_boolcodes[count_bools++] = &my_blob[j]; + my_blob[j + jl] = '\0'; + j += jl; + } + state = (isCapName(my_blob[j + 1]) + ? pName + : pDefault); + break; + } + } + break; + case pNumber: + if (!isdigit(UChar(my_blob[j]))) { + --j; + state = pDefault; + } + break; + case pString: + switch (my_blob[j]) { + case '\\': + if (my_blob[j + 1] != '\0') { + ++j; + } else { + --j; + state = pDefault; + } + break; + case ',': + --j; + state = pDefault; + break; + } + break; + case pNewline: + case pComment: + case pDescription: + default: + break; + } + } + my_boolcodes[count_bools] = 0; + my_numcodes[count_nums] = 0; + my_numvalues[count_nums] = 0; + my_strcodes[count_strs] = 0; + my_strvalues[count_strs] = 0; + +#if 0 + printf("# bools:%d\n", (int) count_bools); + for (j = 0; my_boolcodes[j]; ++j) + printf("\t%s,\n", my_boolcodes[j]); + + printf("# numbers:%d\n", (int) count_nums); + for (j = 0; my_numcodes[j]; ++j) + printf("\t%s#%s,\n", my_numcodes[j], my_numvalues[j]); + + printf("# strings:%d\n", (int) count_strs); + for (j = 0; my_strcodes[j]; ++j) + printf("\t%s=%s,\n", my_strcodes[j], my_strvalues[j]); +#endif +} + +#if USE_CODE_LISTS +static char ** +copy_code_list(NCURSES_CONST char *const *list) +{ + int pass; + size_t count; + size_t length = 1; + char **result = 0; + char *unused = 0; + + for (pass = 0; pass < 2; ++pass) { + for (count = 0; list[count] != 0; ++count) { + size_t chunk = strlen(list[count]) + 1; + if (pass == 0) { + length += chunk; + } else { + result[count] = unused; + _nc_STRCPY(unused, list[count], length); + unused += chunk; + } + } + if (pass == 0) { + char *blob = malloc(length); + result = typeCalloc(char *, count + 1); + unused = blob; + if (blob == 0 || result == 0) + failed("copy_code_list failed"); + } + } + + return result; +} + +#if NO_LEAKS +static void +free_code_list(char **list) +{ + if (list) { + free(list[0]); + free(list); + } +} +#endif +#endif /* USE_CODE_LISTS */ + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: demo_terminfo [options] [terminal]" + ,"" + ,"If no options are given, print all (boolean, numeric, string)" + ,"capabilities for the given terminal, using short names." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -a try all names, print capabilities found" + ," -b print boolean-capabilities" + ," -d LIST colon-separated list of databases to use" + ," -e NAME environment variable to set with -d option" + ," -f print full names" + ," -i NAME terminal description to use as names for \"-a\" option" + ," -n print numeric-capabilities" + ," -q quiet (prints only counts)" + ," -r COUNT repeat for given count" + ," -s print string-capabilities" +#ifdef NCURSES_VERSION + ," -x print extended capabilities" + ," -y direct-lookup names of extended capabilities" +#endif + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int n; + int repeat; + NCURSES_CONST char *name; + int r_opt = 1; + const char *input_name = 0; + + while ((ch = getopt(argc, argv, OPTS_COMMON "abd:e:fi:nqr:sxy")) != -1) { + switch (ch) { + case 'a': + a_opt = TRUE; + break; + case 'b': + b_opt = TRUE; + break; + case 'd': + d_opt = optarg; + break; + case 'e': + e_opt = optarg; + break; + case 'f': + f_opt = TRUE; + break; + case 'i': + input_name = optarg; + break; + case 'n': + n_opt = TRUE; + break; + case 'q': + q_opt = TRUE; + break; + case 'r': + if ((r_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 's': + s_opt = TRUE; + break; + case 'x': +#ifdef NCURSES_VERSION + x_opt = TRUE; +#endif + break; +#ifdef NCURSES_VERSION + case 'y': + y_opt = TRUE; + x_opt = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + +#if HAVE_USE_EXTENDED_NAMES + use_extended_names(x_opt); +#endif + + if (!(b_opt || n_opt || s_opt)) { + b_opt = TRUE; + n_opt = TRUE; + s_opt = TRUE; + } + + make_dblist(); + + if (a_opt) { + for (repeat = 0; repeat < r_opt; ++repeat) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + brute_force(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + brute_force(name); + } else { + static NCURSES_CONST char dumb[] = "dumb"; + brute_force(dumb); + } + } + } else { + if (input_name != 0) { + parse_description(input_name); + } +#if USE_CODE_LISTS + else { + my_boolcodes = copy_code_list(boolnames); + my_numcodes = copy_code_list(numnames); + my_strcodes = copy_code_list(strnames); + } +#else + else { + failed("no capability-lists available (use -i option)"); + } +#endif /* USE_CODE_LISTS */ + for (repeat = 0; repeat < r_opt; ++repeat) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + demo_terminfo(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + demo_terminfo(name); + } else { + static NCURSES_CONST char dumb[] = "dumb"; + demo_terminfo(dumb); + } + } + } + +#define PLURAL(n) n, (n != 1) ? "s" : "" + printf("%ld value%s (%ld boolean%s, %ld number%s, %ld string%s)\n", + PLURAL(total_values), + PLURAL(total_b_values), + PLURAL(total_n_values), + PLURAL(total_s_values)); + +#if NO_LEAKS + free_dblist(); + if (input_name != 0) { + if (my_blob != 0) { + free(my_blob); + free(my_boolcodes); + free(my_numcodes); + free(my_numvalues); + free(my_strcodes); + free(my_strvalues); + } + } +#if USE_CODE_LISTS + else { + free_code_list(my_boolcodes); + free_code_list(my_numcodes); + free_code_list(my_strcodes); + } +#endif +#endif /* NO_LEAKS */ + + ExitProgram(EXIT_SUCCESS); +} + +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + failed("This program requires the terminfo functions such as tigetstr"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/ditto.c b/contrib/ncurses/test/ditto.c new file mode 100644 index 00000000..acac8377 --- /dev/null +++ b/contrib/ncurses/test/ditto.c @@ -0,0 +1,504 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey (1998-on) + * + * $Id: ditto.c,v 1.59 2023/09/23 17:08:43 tom Exp $ + * + * The program illustrates how to set up multiple screens from a single + * program. + * + * If openpty() is supported, the command line parameters are titles for + * the windows showing each screen's data. + * + * If openpty() is not supported, you must invoke the program by specifying + * another terminal on the same machine by specifying its device, e.g., + * ditto /dev/ttyp1 + */ +#include +#include + +#if HAVE_DELSCREEN + +#ifdef USE_PTHREADS +#include +#endif + +#ifdef USE_XTERM_PTY +#include USE_OPENPTY_HEADER +#endif + +#define MAX_FIFO 256 + +#define THIS_FIFO(n) ((n) % MAX_FIFO) +#define NEXT_FIFO(n) THIS_FIFO((n) + 1) + +typedef struct { + unsigned long sequence; + int head; + int tail; + int data[MAX_FIFO]; +} FIFO; + +typedef struct { + unsigned long sequence; +} PEEK; + +/* + * Data "owned" for a single screen. Each screen is divided into windows that + * show the text read from each terminal. Input from a given screen will also + * be read into one window per screen. + */ +typedef struct { + FILE *input; + FILE *output; + SCREEN *screen; /* this screen - curses internal data */ + int which1; /* this screen's index in DITTO[] array */ + int length; /* length of windows[] and peeks[] */ + char **titles; /* per-window titles */ + WINDOW **parents; /* display boxes around each screen's data */ + WINDOW **windows; /* display data from each screen */ + PEEK *peeks; /* indices for each screen's fifo */ + FIFO fifo; /* fifo for this screen */ +#ifdef USE_PTHREADS + pthread_t thread; +#endif +} DITTO; + +#ifdef USE_PTHREADS +#define LockIt() pthread_mutex_lock(&pending_mutex) +#define UnlockIt() pthread_mutex_unlock(&pending_mutex) +pthread_mutex_t pending_mutex; +#else +#define LockIt() /* nothing */ +#define UnlockIt() /* nothing */ +#endif + +/* + * Structure used to pass multiple parameters via the use_screen() + * single-parameter interface. + */ +typedef struct { + int source; /* which screen did character come from */ + int target; /* which screen is character going to */ + DITTO *ditto; /* data for all screens */ +} DDATA; + +static void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + +/* Add to the head of the fifo, checking for overflow. */ +static void +put_fifo(FIFO * fifo, int value) +{ + int next = NEXT_FIFO(fifo->head); + if (next == fifo->tail) + fifo->tail = NEXT_FIFO(fifo->tail); + fifo->data[next] = value; + fifo->head = next; + fifo->sequence += 1; +} + +/* Get data from the tail (oldest part) of the fifo, returning -1 if no data. + * Since each screen can peek into the fifo, we do not update the tail index, + * but modify the peek-index. + * + * FIXME - test/workaround for case where fifo gets more than a buffer + * ahead of peek. + */ +static int +peek_fifo(FIFO * fifo, PEEK * peek) +{ + int result = -1; + if (peek->sequence < fifo->sequence) { + result = fifo->data[THIS_FIFO(peek->sequence)]; + peek->sequence += 1; + } + return result; +} + +static FILE * +open_tty(char *path) +{ + FILE *fp; +#ifdef USE_XTERM_PTY + int amaster; + int aslave; + char slave_name[1024]; + char s_option[sizeof(slave_name) + 80]; + const char *xterm_prog = 0; + + if ((xterm_prog = getenv("XTERM_PROG")) == 0) + xterm_prog = "xterm"; + + if (openpty(&amaster, &aslave, slave_name, 0, 0) != 0 + || strlen(slave_name) > sizeof(slave_name) - 1) + failed("openpty"); + if (strrchr(slave_name, '/') == 0) { + errno = EISDIR; + failed(slave_name); + } + _nc_SPRINTF(s_option, _nc_SLIMIT(sizeof(s_option)) + "-S%s/%d", slave_name, aslave); + if (fork()) { + execlp(xterm_prog, xterm_prog, s_option, "-title", path, (char *) 0); + _exit(0); + } + fp = fdopen(amaster, "r+"); + if (fp == 0) + failed(path); +#else + struct stat sb; + + if (stat(path, &sb) == -1) + failed(path); + if ((sb.st_mode & S_IFMT) != S_IFCHR) { + errno = ENOTTY; + failed(path); + } + fp = fopen(path, "r+"); + if (fp == 0) + failed(path); + printf("opened %s\n", path); +#endif + assert(fp != 0); + return fp; +} + +static int +init_screen( +#if HAVE_USE_WINDOW + SCREEN *sp GCC_UNUSED, +#endif + void *arg) +{ + DITTO *target = (DITTO *) arg; + int high, wide; + int k; + + cbreak(); + noecho(); + scrollok(stdscr, TRUE); + box(stdscr, 0, 0); + + target->parents = typeCalloc(WINDOW *, (size_t) target->length); + target->windows = typeCalloc(WINDOW *, (size_t) target->length); + target->peeks = typeCalloc(PEEK, (size_t) target->length); + + high = (LINES - 2) / target->length; + wide = (COLS - 2); + for (k = 0; k < target->length; ++k) { + WINDOW *outer = newwin(high, wide, 1 + (high * k), 1); + WINDOW *inner = derwin(outer, high - 2, wide - 2, 1, 1); + + box(outer, 0, 0); + MvWAddStr(outer, 0, 2, target->titles[k]); + wnoutrefresh(outer); + + scrollok(inner, TRUE); + keypad(inner, TRUE); +#ifndef USE_PTHREADS + nodelay(inner, TRUE); +#endif + + target->parents[k] = outer; + target->windows[k] = inner; + } + doupdate(); + return TRUE; +} + +static void +free_screen(DITTO * target) +{ + free(target->parents); + free(target->windows); + free(target->peeks); +} + +static void +open_screen(DITTO * target, char **source, int length, int which1) +{ + if (which1 != 0) { + target->input = + target->output = open_tty(source[which1]); + } else { + target->input = stdin; + target->output = stdout; + } + + target->which1 = which1; + target->titles = source; + target->length = length; + target->fifo.head = -1; + target->screen = newterm((char *) 0, /* assume $TERM is the same */ + target->output, + target->input); + + if (target->screen == 0) + failed("newterm"); + + (void) USING_SCREEN(target->screen, init_screen, target); +} + +static int +close_screen( +#if HAVE_USE_WINDOW + SCREEN *sp GCC_UNUSED, +#endif + void *arg GCC_UNUSED) +{ +#if HAVE_USE_WINDOW + (void) sp; +#endif + (void) arg; + return endwin(); +} + +/* + * Read data from the 'source' screen. + */ +static int +read_screen( +#if HAVE_USE_WINDOW + SCREEN *sp GCC_UNUSED, +#endif + void *arg) +{ + DDATA *data = (DDATA *) arg; + DITTO *ditto = &(data->ditto[data->source]); + WINDOW *win = ditto->windows[data->source]; + int ch = wgetch(win); + + if (ch > 0 && ch < 256) + put_fifo(&(ditto->fifo), ch); + else + ch = ERR; + + return ch; +} + +/* + * Write all of the data that's in fifos for the 'target' screen. + */ +static int +write_screen( +#if HAVE_USE_WINDOW + SCREEN *sp GCC_UNUSED, +#endif + void *arg GCC_UNUSED) +{ + DDATA *data = (DDATA *) arg; + DITTO *ditto = &(data->ditto[data->target]); + bool changed = FALSE; + int which; + + for (which = 0; which < ditto->length; ++which) { + WINDOW *win = ditto->windows[which]; + FIFO *fifo = &(data->ditto[which].fifo); + PEEK *peek = &(ditto->peeks[which]); + int ch; + + while ((ch = peek_fifo(fifo, peek)) > 0) { + changed = TRUE; + + waddch(win, (chtype) ch); + wnoutrefresh(win); + } + } + + if (changed) + doupdate(); + return OK; +} + +static void +show_ditto(DITTO * data, int count, DDATA * ddata) +{ + int n; + + (void) data; + for (n = 0; n < count; n++) { + ddata->target = n; + USING_SCREEN(data[n].screen, write_screen, (void *) ddata); + } +} + +#ifdef USE_PTHREADS +static void * +handle_screen(void *arg) +{ + DDATA ddata; + + memset(&ddata, 0, sizeof(ddata)); + ddata.ditto = (DITTO *) arg; + ddata.source = ddata.ditto->which1; + ddata.ditto -= ddata.source; /* -> base of array */ + + for (;;) { + int ch = read_screen(ddata.ditto->screen, &ddata); + if (ch == CTRL('D')) { + int later = (ddata.source ? ddata.source : -1); + int j; + + for (j = ddata.ditto->length - 1; j > 0; --j) { + if (j != later) { + pthread_cancel(ddata.ditto[j].thread); + } + } + if (later > 0) { + pthread_cancel(ddata.ditto[later].thread); + } + break; + } + show_ditto(ddata.ditto, ddata.ditto->length, &ddata); + } + return NULL; +} +#endif + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: ditto [terminal [terminal2 ...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int j; + int ch; + DITTO *data; +#ifndef USE_PTHREADS + int count; +#endif + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if ((data = typeCalloc(DITTO, (size_t) argc)) == 0) + failed("calloc data"); + + assert(data != 0); + + for (j = 0; j < argc; j++) { + open_screen(&data[j], argv, argc, j); + } + +#ifdef USE_PTHREADS + pthread_mutex_init(&pending_mutex, NULL); + /* + * For multi-threaded operation, set up a reader for each of the screens. + * That uses blocking I/O rather than polling for input, so no calls to + * napms() are needed. + */ + for (j = 0; j < argc; j++) { + (void) pthread_create(&(data[j].thread), NULL, handle_screen, + &data[j]); + } + pthread_join(data[1].thread, NULL); +#else + /* + * Loop, reading characters from any of the inputs and writing to all + * of the screens. + */ + for (count = 0;; ++count) { + DDATA ddata; + int which = (count % argc); + + napms(20); + + ddata.source = which; + ddata.ditto = data; + + ch = USING_SCREEN(data[which].screen, read_screen, &ddata); + if (ch == CTRL('D')) { + break; + } else if (ch != ERR) { + show_ditto(data, argc, &ddata); + } + } +#endif + + /* + * Cleanup and exit + */ + for (j = argc - 1; j >= 0; j--) { + LockIt(); + USING_SCREEN(data[j].screen, close_screen, 0); + fprintf(data[j].output, "**Closed\r\n"); + + /* + * Closing before a delscreen() helps ncurses determine that there + * is no valid output buffer, and can remove the setbuf() data. + */ + fflush(data[j].output); + fclose(data[j].output); + delscreen(data[j].screen); + free_screen(&data[j]); + UnlockIt(); + } + free(data); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the curses delscreen function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/dots.c b/contrib/ncurses/test/dots.c new file mode 100644 index 00000000..1b84eaf8 --- /dev/null +++ b/contrib/ncurses/test/dots.c @@ -0,0 +1,251 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 1999-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey 1999 + * + * $Id: dots.c,v 1.46 2024/10/06 21:17:54 tom Exp $ + * + * A simple demo of the terminfo interface. + */ +#define USE_TINFO +#include + +#if HAVE_SETUPTERM + +#include + +static bool interrupted = FALSE; +static long total_chars = 0; +static time_t started; + +static +TPUTS_PROTO(outc, c) +{ + int rc = c; + + if (interrupted) { + char tmp = (char) c; + if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1) + rc = EOF; + } else { + rc = putc(c, stdout); + } + TPUTS_RETURN(rc); +} + +static bool +outs(NCURSES_CONST char *s) +{ + if (VALID_STRING(s)) { + tputs(s, 1, outc); + return TRUE; + } + return FALSE; +} + +static void +cleanup(void) +{ + outs(exit_attribute_mode); + if (!outs(orig_colors)) + outs(orig_pair); + outs(clear_screen); + outs(cursor_normal); + + fflush(stdout); + fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n", + total_chars, + ((double) (total_chars) / (double) (time((time_t *) 0) - started))); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static int +get_number(NCURSES_CONST char *cap, int map) +{ + int result = map; + if (cap != 0) { + int check = tigetnum(cap); + if (check > 0) + result = check; + } + return result; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: dots [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -T TERM override $TERM" +#if HAVE_USE_ENV + ," -e allow environment $LINES / $COLUMNS" +#endif + ," -f use tigetnum rather than mapping" + ," -m SIZE set margin (default: 2)" + ," -r SECS self-interrupt/exit after specified number of seconds" + ," -s MSECS delay 1% of the time (default: 1 msecs)" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + double r; + double c; + int my_colors; + int f_option = 0; + int m_option = 2; + int r_option = 0; + int s_option = 1; + size_t need; + char *my_env; + + while ((ch = getopt(argc, argv, OPTS_COMMON "T:efm:r:s:")) != -1) { + switch (ch) { + case 'T': + need = 6 + strlen(optarg); + if ((my_env = malloc(need)) != NULL) { + _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg); + putenv(my_env); + } + break; +#if HAVE_USE_ENV + case 'e': + use_env(TRUE); + break; +#endif + case 'f': + f_option = 1; + break; + case 'm': + m_option = atoi(optarg); + break; + case 'r': + r_option = atoi(optarg); + break; + case 's': + s_option = atoi(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + SetupAlarm(r_option); + InitAndCatch(setupterm((char *) 0, 1, (int *) 0), onsig); + + srand((unsigned) time(0)); + + outs(clear_screen); + outs(cursor_invisible); + +#define GetNumber(ln,sn) get_number(f_option ? #sn : 0, ln) + my_colors = GetNumber(max_colors, colors); + if (my_colors > 1) { + if (!VALID_STRING(set_a_foreground) + || !VALID_STRING(set_a_background) + || (!VALID_STRING(orig_colors) && !VALID_STRING(orig_pair))) + my_colors = -1; + } + + r = (double) (GetNumber(lines, lines) - (m_option * 2)); + c = (double) (GetNumber(columns, cols) - (m_option * 2)); + started = time((time_t *) 0); + + while (!interrupted) { + int x = (int) (c * ranf()) + m_option; + int y = (int) (r * ranf()) + m_option; + int p = (ranf() > 0.9) ? '*' : ' '; + + tputs(tparm3(cursor_address, y, x), 1, outc); + if (my_colors > 0) { + int z = (int) (ranf() * my_colors); + if (ranf() > 0.01) { + tputs(tparm2(set_a_foreground, z), 1, outc); + } else { + tputs(tparm2(set_a_background, z), 1, outc); + if (s_option) + napms(s_option); + } + } else if (VALID_STRING(exit_attribute_mode) + && VALID_STRING(enter_reverse_mode)) { + if (ranf() <= 0.01) { + outs((ranf() > 0.6) + ? enter_reverse_mode + : exit_attribute_mode); + if (s_option) + napms(s_option); + } + } + outc(p); + fflush(stdout); + ++total_chars; + } + cleanup(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + fprintf(stderr, "This program requires terminfo\n"); + exit(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/dots_curses.c b/contrib/ncurses/test/dots_curses.c new file mode 100644 index 00000000..1a553213 --- /dev/null +++ b/contrib/ncurses/test/dots_curses.c @@ -0,0 +1,237 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: dots_curses.c,v 1.25 2023/01/07 17:21:48 tom Exp $ + * + * A simple demo of the curses interface used for comparison with termcap. + */ +#include + +#if !defined(_NC_WINDOWS) +#include +#endif + +#include + +static bool interrupted = FALSE; +static long total_chars = 0; +static time_t started; + +static void +cleanup(void) +{ + endwin(); + + fflush(stdout); + fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n", + total_chars, + ((double) (total_chars) / (double) (time((time_t *) 0) - started))); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static int +mypair(int fg, int bg) +{ + int pair = (fg * COLORS) + bg; + return (pair >= COLOR_PAIRS) ? -1 : pair; +} + +static void +set_colors(int fg, int bg) +{ + int pair = mypair(fg, bg); + if (pair > 0) { + attron(COLOR_PAIR(mypair(fg, bg))); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: dots_curses [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -T TERM override $TERM" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors()" +#endif +#if HAVE_USE_ENV + ," -e allow environment $LINES / $COLUMNS" +#endif + ," -m SIZE set margin (default: 2)" + ," -r SECS self-interrupt/exit after specified number of seconds" + ," -s MSECS delay 1% of the time (default: 1 msecs)" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int fg, bg; + double r; + double c; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + int m_option = 2; + int r_option = 0; + int s_option = 1; + size_t need; + char *my_env; + + while ((ch = getopt(argc, argv, OPTS_COMMON "T:dem:r:s:")) != -1) { + switch (ch) { + case 'T': + need = 6 + strlen(optarg); + if ((my_env = malloc(need)) != NULL) { + _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg); + putenv(my_env); + } + break; +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif +#if HAVE_USE_ENV + case 'e': + use_env(TRUE); + break; +#endif + case 'm': + m_option = atoi(optarg); + break; + case 'r': + r_option = atoi(optarg); + break; + case 's': + s_option = atoi(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + srand((unsigned) time(0)); + + SetupAlarm(r_option); + InitAndCatch(initscr(), onsig); + + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option) + use_default_colors(); +#endif + for (fg = 0; fg < COLORS; fg++) { + for (bg = 0; bg < COLORS; bg++) { + int pair; + if (interrupted) { + cleanup(); + ExitProgram(EXIT_FAILURE); + } + pair = mypair(fg, bg); + if (pair > 0) + init_pair((short) pair, (short) fg, (short) bg); + } + } + } + + r = (double) (LINES - (m_option * 2)); + c = (double) (COLS - (m_option * 2)); + started = time((time_t *) 0); + + fg = COLOR_WHITE; + bg = COLOR_BLACK; + while (!interrupted) { + int x = (int) (c * ranf()) + m_option; + int y = (int) (r * ranf()) + m_option; + int p = (ranf() > 0.9) ? '*' : ' '; + + move(y, x); + if (has_colors()) { + int z = (int) (ranf() * COLORS); + if (ranf() > 0.01) { + set_colors(fg = z, bg); + attron(COLOR_PAIR(mypair(fg, bg))); + } else { + set_colors(fg, bg = z); + if (s_option) + napms(s_option); + } + } else { + if (ranf() <= 0.01) { + if (ranf() > 0.6) { + attron(A_REVERSE); + } else { + attroff(A_REVERSE); + } + if (s_option) + napms(s_option); + } + } + AddCh(p); + refresh(); + ++total_chars; + } + cleanup(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/dots_mvcur.c b/contrib/ncurses/test/dots_mvcur.c new file mode 100644 index 00000000..2595d8ad --- /dev/null +++ b/contrib/ncurses/test/dots_mvcur.c @@ -0,0 +1,268 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2007-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey - 2007 + * + * $Id: dots_mvcur.c,v 1.32 2024/10/06 21:17:54 tom Exp $ + * + * A simple demo of the terminfo interface, and mvcur. + */ +#define USE_TINFO +#include + +#if HAVE_SETUPTERM + +#include + +static bool interrupted = FALSE; +static long total_chars = 0; +static time_t started; + +static +TPUTS_PROTO(outc, c) +{ + int rc = c; + + if (interrupted) { + char tmp = (char) c; + if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1) + rc = EOF; + } else { + if (putc(c, stdout) == EOF) + rc = EOF; + } + TPUTS_RETURN(rc); +} + +static bool +outs(NCURSES_CONST char *s) +{ + if (VALID_STRING(s)) { + tputs(s, 1, outc); + return TRUE; + } + return FALSE; +} + +static void +cleanup(void) +{ + outs(exit_attribute_mode); + if (!outs(orig_colors)) + outs(orig_pair); + outs(clear_screen); + outs(cursor_normal); + + fflush(stdout); + fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n", + total_chars, + ((double) (total_chars) / (double) (time((time_t *) 0) - started))); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static int +get_number(NCURSES_CONST char *cap, int map) +{ + int result = map; + if (cap != 0) { + int check = tigetnum(cap); + if (check > 0) + result = check; + } + return result; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: dots_termcap [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -T TERM override $TERM" +#if HAVE_USE_ENV + ," -e allow environment $LINES / $COLUMNS" +#endif + ," -f use tigetnum rather than mapping" + ," -m SIZE set margin (default: 2)" + ," -r SECS self-interrupt/exit after specified number of seconds" + ," -s MSECS delay 1% of the time (default: 1 msecs)" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int x0 = 1, y0 = 1; + int ch; + double r; + double c; + SCREEN *sp; + int my_colors; + int f_option = 0; + int m_option = 2; + int r_option = 0; + int s_option = 1; + size_t need; + char *my_env; + + while ((ch = getopt(argc, argv, OPTS_COMMON "T:efm:r:s:")) != -1) { + switch (ch) { + case 'T': + need = 6 + strlen(optarg); + if ((my_env = malloc(need)) != NULL) { + _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg); + putenv(my_env); + } + break; +#if HAVE_USE_ENV + case 'e': + use_env(TRUE); + break; +#endif + case 'f': + f_option = 1; + break; + case 'm': + m_option = atoi(optarg); + break; + case 'r': + r_option = atoi(optarg); + break; + case 's': + s_option = atoi(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + SetupAlarm(r_option); + InitAndCatch((sp = newterm((char *) 0, stdout, stdin)), onsig); + refresh(); /* needed with Solaris curses to cancel endwin */ + + if (sp == 0) { + fprintf(stderr, "Cannot initialize terminal\n"); + ExitProgram(EXIT_FAILURE); + } + + srand((unsigned) time(0)); + + outs(clear_screen); + outs(cursor_home); + outs(cursor_invisible); + +#define GetNumber(ln,sn) get_number(f_option ? #sn : 0, ln) + my_colors = GetNumber(max_colors, colors); + if (my_colors > 1) { + if (!VALID_STRING(set_a_foreground) + || !VALID_STRING(set_a_background) + || (!VALID_STRING(orig_colors) && !VALID_STRING(orig_pair))) + my_colors = -1; + } + + r = (double) (GetNumber(lines, lines) - (m_option * 2)); + c = (double) (GetNumber(columns, cols) - (m_option * 2)); + started = time((time_t *) 0); + + while (!interrupted) { + int x = (int) (c * ranf()) + m_option; + int y = (int) (r * ranf()) + m_option; + int p = (ranf() > 0.9) ? '*' : ' '; + + if (mvcur(y0, x0, y, x) != ERR) { + x0 = x; + y0 = y; + } + + if (my_colors > 0) { + int z = (int) (ranf() * my_colors); + if (ranf() > 0.01) { + tputs(tparm2(set_a_foreground, z), 1, outc); + } else { + tputs(tparm2(set_a_background, z), 1, outc); + if (s_option) + napms(s_option); + } + } else if (VALID_STRING(exit_attribute_mode) + && VALID_STRING(enter_reverse_mode)) { + if (ranf() <= 0.01) { + outs((ranf() > 0.6) + ? enter_reverse_mode + : exit_attribute_mode); + if (s_option) + napms(s_option); + } + } + outc(p); + ++x0; + fflush(stdout); + ++total_chars; + } + cleanup(); + endwin(); + delscreen(sp); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + fprintf(stderr, "This program requires terminfo\n"); + exit(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/dots_termcap.c b/contrib/ncurses/test/dots_termcap.c new file mode 100644 index 00000000..050bdc98 --- /dev/null +++ b/contrib/ncurses/test/dots_termcap.c @@ -0,0 +1,344 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2013-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: dots_termcap.c,v 1.35 2024/10/06 21:18:35 tom Exp $ + * + * A simple demo of the termcap interface. + */ +#define USE_TINFO +#include + +#if !defined(_NC_WINDOWS_NATIVE) +#include +#endif + +#if HAVE_TGETENT + +#include + +static bool interrupted = FALSE; +static long total_chars = 0; +static time_t started; + +static char *t_AB; +static char *t_AF; +static char *t_cl; +static char *t_cm; +static char *t_me; +static char *t_mr; +static char *t_oc; +static char *t_op; +static char *t_ve; +static char *t_vi; + +static struct { + NCURSES_CONST char *name; + char **value; +} my_caps[] = { + + { + "AB", &t_AB + }, + { + "AF", &t_AF + }, + { + "cl", &t_cl + }, + { + "cm", &t_cm + }, + { + "me", &t_me + }, + { + "mr", &t_mr + }, + { + "oc", &t_oc + }, + { + "op", &t_op + }, + { + "ve", &t_ve + }, + { + "vi", &t_vi + }, +}; + +static +TPUTS_PROTO(outc, c) +{ + int rc = c; + + if (interrupted) { + char tmp = (char) c; + if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1) + rc = EOF; + } else { + rc = putc(c, stdout); + } + TPUTS_RETURN(rc); +} + +static bool +outs(NCURSES_CONST char *s) +{ + if (VALID_STRING(s)) { + tputs(s, 1, outc); + return TRUE; + } + return FALSE; +} + +static void +cleanup(void) +{ + outs(t_me); + if (!outs(t_oc)) + outs(t_op); + outs(t_cl); + outs(t_ve); + + fflush(stdout); + fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n", + total_chars, + ((double) (total_chars) / (double) (time((time_t *) 0) - started))); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +/* + * napms is a curses function which happens to be usable without initializing + * the screen, but if this program happened to be build with a "real" termcap + * library, there is nothing like napms. + */ +#if HAVE_NAPMS +#define my_napms(ms) napms(ms) +#else +static void +my_napms(int ms) +{ + if (ms > 0) { +#if defined(_NC_WINDOWS_NATIVE) + Sleep((unsigned int) ms); +#else + struct timeval data; + data.tv_sec = 0; + data.tv_usec = ms * 1000; + select(0, NULL, NULL, NULL, &data); +#endif + } +} +#endif + +static int +get_number(NCURSES_CONST char *cap, const char *env) +{ + int result = tgetnum(cap); + const char *value = env ? getenv(env) : 0; + if (value != 0 && *value != 0) { + char *next = 0; + long check = strtol(value, &next, 10); + if (check > 0 && *next == '\0') + result = (int) check; + } + return result; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: dots_termcap [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -T TERM override $TERM" + ," -e allow environment $LINES / $COLUMNS" + ," -m SIZE set margin (default: 2)" + ," -r SECS self-interrupt/exit after specified number of seconds" + ," -s MSECS delay 1% of the time (default: 1 msecs)" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int num_colors; + int num_lines; + int num_columns; + int e_option = 0; + int m_option = 2; + int r_option = 0; + int s_option = 1; + double r; + double c; + char buffer[1024]; + char area[1024]; + NCURSES_CONST char *name; + size_t need; + char *my_env; + + while ((ch = getopt(argc, argv, OPTS_COMMON "T:em:r:s:")) != -1) { + switch (ch) { + case 'T': + need = 6 + strlen(optarg); + if ((my_env = malloc(need)) != NULL) { + _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg); + putenv(my_env); + } + break; + case 'e': + e_option = 1; + break; + case 'm': + m_option = atoi(optarg); + break; + case 'r': + r_option = atoi(optarg); + break; + case 's': + s_option = atoi(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if ((name = getenv("TERM")) == 0) { + fprintf(stderr, "TERM is not set\n"); + ExitProgram(EXIT_FAILURE); + } + + srand((unsigned) time(0)); + + SetupAlarm((unsigned) r_option); + InitAndCatch(ch = tgetent(buffer, name), onsig); + if (ch < 0) { + fprintf(stderr, "terminal description not found\n"); + ExitProgram(EXIT_FAILURE); + } else { + size_t t; + char *ap = area; + for (t = 0; t < SIZEOF(my_caps); ++t) { + *(my_caps[t].value) = tgetstr((NCURSES_CONST char *) + my_caps[t].name, &ap); + } + } + + num_colors = tgetnum("Co"); +#define GetNumber(cap,env) get_number(cap, e_option ? env : 0) + num_lines = GetNumber("li", "LINES"); + num_columns = GetNumber("co", "COLUMNS"); + + outs(t_cl); + outs(t_vi); + if (num_colors > 1) { + if (!VALID_STRING(t_AF) + || !VALID_STRING(t_AB) + || (!VALID_STRING(t_oc) && !VALID_STRING(t_op))) + num_colors = -1; + } + + r = (double) (num_lines - (2 * m_option)); + c = (double) (num_columns - (2 * m_option)); + started = time((time_t *) 0); + + while (!interrupted) { + int x = (int) (c * ranf()) + m_option; + int y = (int) (r * ranf()) + m_option; + int p = (ranf() > 0.9) ? '*' : ' '; + + tputs(tgoto(t_cm, x, y), 1, outc); + if (num_colors > 0) { + int z = (int) (ranf() * num_colors); + if (ranf() > 0.01) { + tputs(tgoto(t_AF, 0, z), 1, outc); + } else { + tputs(tgoto(t_AB, 0, z), 1, outc); + if (s_option) + my_napms(s_option); + } + } else if (VALID_STRING(t_me) + && VALID_STRING(t_mr)) { + if (ranf() <= 0.01) { + outs((ranf() > 0.6) + ? t_mr + : t_me); + if (s_option) + my_napms(s_option); + } + } + outc(p); + fflush(stdout); + ++total_chars; + } + cleanup(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + fprintf(stderr, "This program requires termcap\n"); + exit(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/dots_xcurses.c b/contrib/ncurses/test/dots_xcurses.c new file mode 100644 index 00000000..2472dc60 --- /dev/null +++ b/contrib/ncurses/test/dots_xcurses.c @@ -0,0 +1,286 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: dots_xcurses.c,v 1.30 2024/08/31 15:55:52 tom Exp $ + * + * A simple demo of the wide-curses interface used for comparison with termcap. + */ +#include + +#if !defined(_NC_WINDOWS_NATIVE) +#include +#endif + +#include + +#if USE_WIDEC_SUPPORT + +#if HAVE_ALLOC_PAIR +#define NewPair(n) x_option ? ((void *)&(n)) : NULL +#else +#define NewPair(n) NULL +#endif + +#define InitPair(p,fg,bg) init_pair((short) (p), (short) (fg), (short) (bg)) + +static bool interrupted = FALSE; +static long total_chars = 0; +static time_t started; + +#if HAVE_ALLOC_PAIR +static bool x_option = FALSE; +#endif + +static void +cleanup(void) +{ + endwin(); + + fflush(stdout); + fprintf(stderr, "\n\n%ld total cells, rate %.2f/sec\n", + total_chars, + ((double) (total_chars) / (double) (time((time_t *) 0) - started))); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static int +mypair(int fg, int bg) +{ + int result; +#if HAVE_ALLOC_PAIR + if (x_option) { + result = alloc_pair(fg, bg); + } else +#endif + { + int pair = (fg * COLORS) + bg; + result = (pair >= COLOR_PAIRS) ? -1 : pair; + } + return result; +} + +static void +set_colors(int fg, int bg) +{ + int pair = mypair(fg, bg); + if (pair > 0) { + (void) color_set((short) pair, NewPair(pair)); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: dots_xcurses [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -T TERM override $TERM" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors()" +#endif +#if HAVE_USE_ENV + ," -e allow environment $LINES / $COLUMNS" +#endif + ," -m SIZE set margin (default: 2)" + ," -r SECS self-interrupt/exit after specified number of seconds" + ," -s MSECS delay 1% of the time (default: 1 msecs)" +#if HAVE_ALLOC_PAIR + ," -x use alloc_pair() rather than init_pair()" +#endif + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int fg, bg, ch; + wchar_t wch[2]; + double r; + double c; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + int m_option = 2; + int r_option = 0; + int s_option = 1; + size_t need; + char *my_env; + + while ((ch = getopt(argc, argv, OPTS_COMMON "T:dem:r:s:x")) != -1) { + switch (ch) { + case 'T': + need = 6 + strlen(optarg); + if ((my_env = malloc(need)) != NULL) { + _nc_SPRINTF(my_env, _nc_SLIMIT(need) "TERM=%s", optarg); + putenv(my_env); + } + break; +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif +#if HAVE_USE_ENV + case 'e': + use_env(TRUE); + break; +#endif + case 'm': + m_option = atoi(optarg); + break; + case 'r': + r_option = atoi(optarg); + break; + case 's': + s_option = atoi(optarg); + break; +#if HAVE_ALLOC_PAIR + case 'x': + x_option = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + srand((unsigned) time(0)); + + SetupAlarm(r_option); + InitAndCatch(initscr(), onsig); + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option) + use_default_colors(); +#endif +#if HAVE_ALLOC_PAIR + if (x_option) { + ; /* nothing */ + } else +#endif + { + for (fg = 0; fg < COLORS; fg++) { + for (bg = 0; bg < COLORS; bg++) { + int pair; + if (interrupted) { + cleanup(); + ExitProgram(EXIT_FAILURE); + } + pair = mypair(fg, bg); + if (pair > 0) { + InitPair(pair, fg, bg); + } + } + } + } + } + + r = (double) (LINES - (2 * m_option)); + c = (double) (COLS - (2 * m_option)); + started = time((time_t *) 0); + + fg = COLOR_WHITE; + bg = COLOR_BLACK; + wch[1] = 0; + while (!interrupted) { + int x = (int) (c * ranf()) + m_option; + int y = (int) (r * ranf()) + m_option; + int p = (ranf() > 0.9) ? '*' : ' '; + + move(y, x); + if (has_colors()) { + int z = (int) (ranf() * COLORS); + if (ranf() > 0.01) { + set_colors(fg = z, bg); + } else { + set_colors(fg, bg = z); + if (s_option) + napms(s_option); + } + } else { + if (ranf() <= 0.01) { + if (ranf() > 0.6) { + attr_on(WA_REVERSE, NULL); + } else { + attr_off(WA_REVERSE, NULL); + } + if (s_option) + napms(s_option); + } + } + wch[0] = (wchar_t) p; + addnwstr(wch, 1); + refresh(); + ++total_chars; + } + cleanup(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/dump_window.c b/contrib/ncurses/test/dump_window.c new file mode 100644 index 00000000..eed4dbcb --- /dev/null +++ b/contrib/ncurses/test/dump_window.c @@ -0,0 +1,179 @@ +/**************************************************************************** + * Copyright 2018-2020,2023 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: dump_window.c,v 1.5 2023/11/11 00:30:50 tom Exp $ + */ +#include + +static FILE *dumpfp; + +int +open_dump(const char *fn) +{ + int result = 0; + close_dump(); + if ((dumpfp = fopen(fn, "a")) != 0) + result = 1; + return result; +} + +void +close_dump(void) +{ + if (dumpfp != 0) { + fclose(dumpfp); + dumpfp = 0; + } +} + +void +dump_window(WINDOW *w) +{ + wgetch(w); + if (dumpfp != 0) { + int y, x; + int oldy, oldx; + int maxy, maxx; + int pass; + char *cvec = 0; + char *avec = 0; + char *pvec = 0; + int ccnt = 0; + int acnt = 0; + int pcnt = 0; + int endy = -1; + int endx = -1; + + fprintf(dumpfp, "Window %p\n", (void *) w); + + getyx(w, oldy, oldx); + getmaxyx(w, maxy, maxx); + fprintf(dumpfp, "size (%dx%d)\n", maxy, maxx); + getbegyx(w, y, x); + fprintf(dumpfp, "begin (%dx%d)\n", maxy, maxx); + getyx(w, y, x); + fprintf(dumpfp, "position (%d,%d)\n", y, x); + + if (maxy > 0 && maxx > 0) { + for (pass = 0; pass < 2; ++pass) { + for (y = 0; y < maxy; ++y) { + + if (cvec) + memset(cvec, 0, (size_t) maxx + 1); + if (avec) + memset(avec, 0, (size_t) maxx + 1); + if (pvec) + memset(pvec, 0, (size_t) maxx + 1); + + for (x = 0; x < maxx; ++x) { + chtype data = mvwinch(w, y, x); + chtype temp; + char cc = (char) ((data & 0xff) ? (data & 0xff) : ' '); + char aa; + char pp; + + temp = ((data & A_ATTRIBUTES) & (chtype) (~A_COLOR)); + if (temp) { + if (temp & A_ALTCHARSET) { + aa = (temp & A_BOLD) ? 'A' : 'a'; + } else if (temp & A_STANDOUT) { + aa = (temp & A_BOLD) ? 'S' : 's'; + } else if (temp & A_REVERSE) { + aa = (temp & A_BOLD) ? 'R' : 'r'; + } else if (temp & A_UNDERLINE) { + aa = (temp & A_BOLD) ? 'U' : 'u'; + } else { + aa = (temp & A_BOLD) ? 'b' : '?'; + } + } else { + aa = ' '; + } + if (data & A_COLOR) { + if (PAIR_NUMBER((int) data) < 8) { + pp = (char) ('0' + PAIR_NUMBER((int) data)); + } else { + pp = '*'; + } + } else { + pp = ' '; + } + + if (pass) { + if (cvec) + cvec[x] = cc; + if (avec) + avec[x] = aa; + if (pvec) + pvec[x] = pp; + } else { + if (cc != ' ' || aa != ' ' || pp != ' ') { + if (endx < x) + endx = x; + if (endy < y) + endy = y; + } + ccnt += (cc != ' '); + acnt += (aa != ' '); + pcnt += (pp != ' '); + } + } + if (pass) { + fprintf(dumpfp, "%3d", y + 1); + if (cvec) + fprintf(dumpfp, "\tc|%.*s|\n", maxx, cvec); + if (avec) + fprintf(dumpfp, "\ta|%.*s|\n", maxx, avec); + if (pvec) + fprintf(dumpfp, "\tp|%.*s|\n", maxx, pvec); + } + } + if (pass) { + free(cvec); + free(avec); + free(pvec); + } else { + fprintf(dumpfp, "%d cells with characters\n", ccnt); + fprintf(dumpfp, "%d cells with video-attributes\n", acnt); + fprintf(dumpfp, "%d cells with color-attributes\n", pcnt); + if (endy < 0 || endx < 0) + break; + /* reduce the dump a little, ignore really blank cells */ + maxx = endx + 1; + maxy = endy + 1; + if (ccnt) + cvec = malloc((size_t) maxx + 1); + if (acnt) + avec = malloc((size_t) maxx + 1); + if (pcnt) + pvec = malloc((size_t) maxx + 1); + } + } + } + wmove(w, oldy, oldx); + } +} diff --git a/contrib/ncurses/test/dump_window.h b/contrib/ncurses/test/dump_window.h new file mode 100644 index 00000000..865249e2 --- /dev/null +++ b/contrib/ncurses/test/dump_window.h @@ -0,0 +1,40 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: dump_window.h,v 1.2 2020/02/02 23:34:34 tom Exp $ + */ +#ifndef DUMP_WINDOW_H_incl +#define DUMP_WINDOW_H_incl 1 + +#include + +extern int open_dump(const char *fn); +extern void close_dump(void); +extern void dump_window(WINDOW *w); + +#endif /* DUMP_WINDOW_H_incl */ diff --git a/contrib/ncurses/test/dup_field.c b/contrib/ncurses/test/dup_field.c new file mode 100644 index 00000000..7ef7151f --- /dev/null +++ b/contrib/ncurses/test/dup_field.c @@ -0,0 +1,450 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: dup_field.c,v 1.11 2024/10/06 20:07:19 tom Exp $ + * + * Demonstrate dup_field(). + */ + +#include + +#if USE_LIBFORM + +#include +#include + +#define DO_DEMO CTRL('F') /* actual key for toggling demo-mode */ +#define MY_DEMO EDIT_FIELD('f') /* internal request-code */ + +static char empty[] = ""; +static FIELD *all_fields[100]; +/* *INDENT-OFF* */ +static struct { + int code; + int result; + const char *help; +} commands[] = { + { CTRL('A'), REQ_BEG_FIELD, "go to beginning of field" }, + { CTRL('D'), REQ_DOWN_FIELD, "move downward to field" }, + { CTRL('E'), REQ_END_FIELD, "go to end of field" }, + { CTRL('H'), REQ_DEL_PREV, "delete previous character" }, + { CTRL('I'), REQ_NEXT_FIELD, "go to next field" }, + { CTRL('K'), REQ_CLR_EOF, "clear to end of field" }, + { CTRL('N'), REQ_NEXT_FIELD, "go to next field" }, + { CTRL('P'), REQ_PREV_FIELD, "go to previous field" }, + { CTRL('Q'), MY_QUIT, "exit form" }, + { CTRL('U'), REQ_UP_FIELD, "move upward to field" }, + { CTRL('W'), REQ_NEXT_WORD, "go to next word" }, + { CTRL('X'), REQ_CLR_FIELD, "clear field" }, + { CTRL('['), MY_QUIT, "exit form" }, + { HELP_KEY_2, MY_HELP, "show this screen", }, + { KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" }, + { KEY_BTAB, REQ_PREV_FIELD, "go to previous field" }, + { KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character" }, + { KEY_END, REQ_LAST_FIELD, "go to last field" }, + { KEY_HOME, REQ_FIRST_FIELD, "go to first field" }, + { KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character" }, + { KEY_NEXT, REQ_NEXT_FIELD, "go to next field" }, + { KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field" }, + { KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character" }, + { KEY_UP, REQ_UP_CHAR, "move up 1 character" }, + { DO_DEMO, MY_DEMO, "duplicate current field" } +}; +/* *INDENT-ON* */ + +static void +my_help_edit_field(void) +{ + int used = 0; + unsigned n; + char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); + + msgs[used++] = strdup("Defined form edit/traversal keys:"); + for (n = 0; n < SIZEOF(commands); ++n) { + char *msg; + const char *name; + const char *code = keyname(commands[n].code); + size_t need = 5; +#ifdef NCURSES_VERSION + if ((name = form_request_name(commands[n].result)) == 0) +#endif + name = commands[n].help; + need = 5 + strlen(code) + strlen(name); + msg = typeMalloc(char, need); + _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); + msgs[used++] = msg; + } + msgs[used++] = + strdup("Arrow keys move within a field as you would expect."); + msgs[used] = 0; + popup_msg2(stdscr, msgs); + for (n = 0; msgs[n] != 0; ++n) { + free(msgs[n]); + } + free(msgs); +} + +static FIELD * +make_label(const char *label, int frow, int fcol) +{ + FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0); + + if (f) { + set_field_buffer(f, 0, label); + set_field_opts(f, (int) ((unsigned) field_opts(f) & (unsigned) ~O_ACTIVE)); + } + return (f); +} + +static FIELD * +make_field(int frow, int fcol, int rows, int cols) +{ + FIELD *f = new_field(rows, cols, frow, fcol, 0, 1); + + if (f) { + set_field_back(f, A_UNDERLINE); + init_edit_field(f, empty); + } + return (f); +} + +static void +erase_form(FORM *f) +{ + WINDOW *w = form_win(f); + WINDOW *s = form_sub(f); + + unpost_form(f); + werase(w); + wrefresh(w); + delwin(s); +} + +static FieldAttrs * +my_field_attrs(NCURSES_CONST FIELD *f) +{ + return (FieldAttrs *) field_userptr(f); +} + +static int +buffer_length(NCURSES_CONST FIELD *f) +{ + return my_field_attrs(f)->row_lengths[0]; +} + +static void +set_buffer_length(NCURSES_CONST FIELD *f, int length) +{ + my_field_attrs(f)->row_lengths[0] = length; +} + +static int +offset_in_field(NCURSES_CONST FORM *form) +{ + NCURSES_CONST FIELD *field = current_field(form); + int currow, curcol; + + form_getyx(form, currow, curcol); + return curcol + currow * (int) field->dcols; +} + +static void +inactive_field(FIELD *f) +{ + set_field_back(f, my_field_attrs(f)->background); +} + +static int +my_edit_field(FORM *form, int *result) +{ + int ch = wgetch(form_win(form)); + int status; + FIELD *before; + unsigned n; + int before_row; + int before_col; + int before_off = offset_in_field(form); + + form_getyx(form, before_row, before_col); + before = current_field(form); + set_field_back(before, A_NORMAL); + if (ch <= KEY_MAX) { + set_field_back(before, A_REVERSE); + } else if (ch <= MAX_FORM_COMMAND) { + inactive_field(before); + } + + *result = ch; + for (n = 0; n < SIZEOF(commands); ++n) { + if (commands[n].code == ch) { + *result = commands[n].result; + break; + } + } + + status = form_driver(form, *result); + + if (status == E_OK) { + bool modified = TRUE; + int length = buffer_length(before); + + if (length < before_off) + length = before_off; + switch (*result) { + case REQ_CLR_EOF: + length = before_off; + break; + case REQ_CLR_EOL: + if ((int) (before_row + 1) == (int) (before->rows)) + length = before_off; + break; + case REQ_CLR_FIELD: + length = 0; + break; + case REQ_DEL_CHAR: + if (length > before_off) + --length; + break; + case REQ_DEL_PREV: + if (length > 0) { + if (before_col > 0) { + --length; + } else if (before_row > 0) { + length -= (int) before->cols + before_col; + } + } + break; + case REQ_NEW_LINE: + length += (int) before->cols; + break; + + default: + modified = (ch < MIN_FORM_COMMAND + && isprint(UChar(ch))); + break; + } + + /* + * If we do not force a re-validation, then field_buffer 0 will + * be lagging by one character. + */ + if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result + < MIN_FORM_COMMAND) + ++length; + + set_buffer_length(before, length); + } + + if (current_field(form) != before) + inactive_field(before); + return status; +} + +static FIELD ** +copy_fields(FIELD **source, FIELD *extra, size_t length) +{ + FIELD **target = typeCalloc(FIELD *, length + 1); + memcpy(target, source, length * sizeof(FIELD *)); + target[length] = extra; + return target; +} + +static void +do_demo(FORM *form) +{ + int count = field_count(form); + FIELD *my_field = current_field(form); + FIELD **old_fields = form_fields(form); + + if (count > 0 && old_fields != NULL && my_field != NULL) { + FIELD **new_fields = copy_fields(old_fields, + dup_field(my_field, + form_field_row(my_field) + + 1, + form_field_col(my_field)), + (size_t) count); + if (new_fields != NULL) + set_form_fields(form, new_fields); + } +} + +static int +my_form_driver(FORM *form, int c) +{ + switch (c) { + case MY_QUIT: + if (form_driver(form, REQ_VALIDATION) == E_OK) + return (TRUE); + break; + case MY_HELP: + my_help_edit_field(); + break; + case MY_DEMO: + do_demo(form); + break; + default: + beep(); + break; + } + return (FALSE); +} + +static void +demo_forms(void) +{ + FORM *form; + int c; + unsigned n = 0; + const char *fname; + + /* describe the form */ + all_fields[n++] = make_label("Sample Form", 0, 15); + + fname = "Last Name"; + all_fields[n++] = make_label(fname, 2, 0); + all_fields[n++] = make_field(3, 0, 1, 18); + set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); + + fname = "First Name"; + all_fields[n++] = make_label(fname, 2, 20); + all_fields[n++] = make_field(3, 20, 1, 12); + set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); + + fname = "Middle Name"; + all_fields[n++] = make_label(fname, 2, 34); + all_fields[n++] = make_field(3, 34, 1, 12); + set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); + + fname = "Comments"; + all_fields[n++] = make_label(fname, 5, 0); + all_fields[n++] = make_field(6, 0, 4, 46); + init_edit_field(all_fields[n - 1], empty); + + all_fields[n] = (FIELD *) 0; + + if ((form = new_form(all_fields)) != 0) { + int finished = 0; + + post_form(form); + + while (!finished) { + switch (my_edit_field(form, &c)) { + case E_OK: + break; + case E_UNKNOWN_COMMAND: + finished = my_form_driver(form, c); + break; + default: + beep(); + break; + } + } + + erase_form(form); + + free_form(form); + } + for (c = 0; all_fields[c] != 0; c++) { + free_edit_field(all_fields[c]); + free_field(all_fields[c]); + } + noraw(); + nl(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: dup_field [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + initscr(); + cbreak(); + noecho(); + raw(); + nonl(); /* lets us read ^M's */ + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + init_pair(2, COLOR_GREEN, COLOR_BLACK); + init_pair(3, COLOR_CYAN, COLOR_BLACK); + bkgd((chtype) COLOR_PAIR(1)); + refresh(); + } + + demo_forms(); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses form library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/echochar.c b/contrib/ncurses/test/echochar.c new file mode 100644 index 00000000..08497069 --- /dev/null +++ b/contrib/ncurses/test/echochar.c @@ -0,0 +1,184 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 2006-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: echochar.c,v 1.26 2023/05/27 20:13:10 tom Exp $ + * + * Demonstrate the echochar function (compare to dots.c). + * Thomas Dickey - 2006/11/4 + */ + +#include + +#include + +static bool interrupted = FALSE; +static long total_chars = 0; +static time_t started; + +static void +cleanup(void) +{ + stop_curses(); + + printf("\n\n%ld total cells, rate %.2f/sec\n", + total_chars, + ((double) (total_chars) / (double) (time((time_t *) 0) - started))); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static void +set_color(const char *const my_pairs, int fg, int bg) +{ + int pair = (fg * COLORS) + bg; + if (pair < COLOR_PAIRS) { + if (!my_pairs[pair]) { + init_pair((short) pair, + (short) fg, + (short) bg); + } + attron(COLOR_PAIR(pair)); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: echochar" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -r use addch/refresh rather than echochar()" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + double r; + double c; + bool use_colors; + bool opt_r = FALSE; + char *my_pairs = 0; + int last_fg = 0; + int last_bg = 0; + + while ((ch = getopt(argc, argv, OPTS_COMMON "r")) != -1) { + switch (ch) { + case 'r': + opt_r = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + InitAndCatch(initscr(), onsig); + + use_colors = has_colors(); + if (use_colors) { + start_color(); + if (COLOR_PAIRS > 0) { + my_pairs = typeCalloc(char, (size_t) COLOR_PAIRS); + } + use_colors = (my_pairs != 0); + } + + srand((unsigned) time(0)); + + curs_set(0); + + r = (double) (LINES - 4); + c = (double) (COLS - 4); + started = time((time_t *) 0); + + while (!interrupted) { + int x = (int) (c * ranf()) + 2; + int y = (int) (r * ranf()) + 2; + int p = (ranf() > 0.9) ? '*' : ' '; + + move(y, x); + if (use_colors > 0) { + int z = (int) (ranf() * COLORS); + if (ranf() > 0.01) { + set_color(my_pairs, z, last_bg); + last_fg = z; + } else { + set_color(my_pairs, last_fg, z); + last_bg = z; + napms(1); + } + } else { + if (ranf() <= 0.01) { + if (ranf() > 0.6) + attron(A_REVERSE); + else + attroff(A_REVERSE); + napms(1); + } + } + if (opt_r) { + AddCh(UChar(p)); + refresh(); + } else { + echochar(UChar(p)); + } + ++total_chars; + } + cleanup(); + free(my_pairs); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/edit_field.c b/contrib/ncurses/test/edit_field.c new file mode 100644 index 00000000..e62a51fd --- /dev/null +++ b/contrib/ncurses/test/edit_field.c @@ -0,0 +1,438 @@ +/**************************************************************************** + * Copyright 2019-2020,2024 Thomas E. Dickey * + * Copyright 2003-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: edit_field.c,v 1.32 2024/06/29 17:49:56 tom Exp $ + * + * A wrapper for form_driver() which keeps track of the user's editing changes + * for each field, and makes the resulting length available as a + * null-terminated string in field_buffer(field,1). + * + * Thomas Dickey - 2003/4/26. + */ + +#include + +#if USE_LIBFORM + +#include +#include + +static struct { + int code; + int result; + const char *help; +} commands[] = { + + { + CTRL('A'), REQ_NEXT_CHOICE, "" + }, + { + CTRL('B'), REQ_PREV_WORD, "go to previous word" + }, + { + CTRL('C'), REQ_CLR_EOL, "clear to end of line" + }, + { + CTRL('D'), REQ_DOWN_FIELD, "move downward to field" + }, + { + CTRL('E'), REQ_END_FIELD, "go to end of field" + }, + { + CTRL('F'), REQ_NEXT_PAGE, "go to next page" + }, + { + CTRL('G'), REQ_DEL_WORD, "delete current word" + }, + { + CTRL('H'), REQ_DEL_PREV, "delete previous character" + }, + { + CTRL('I'), REQ_INS_CHAR, "insert character" + }, + { + CTRL('K'), REQ_CLR_EOF, "clear to end of field" + }, + { + CTRL('L'), REQ_LEFT_FIELD, "go to field to left" + }, + { + CTRL('M'), REQ_NEW_LINE, "insert/overlay new line" + }, + { + CTRL('N'), REQ_NEXT_FIELD, "go to next field" + }, + { + CTRL('O'), REQ_INS_LINE, "insert blank line at cursor" + }, + { + CTRL('P'), REQ_PREV_FIELD, "go to previous field" + }, + { + CTRL('Q'), MY_QUIT, "exit form" + }, + { + CTRL('R'), REQ_RIGHT_FIELD, "go to field to right" + }, + { + CTRL('S'), REQ_BEG_FIELD, "go to beginning of field" + }, + { + CTRL('T'), MY_EDT_MODE, "toggle O_EDIT mode, clear field status", + }, + { + CTRL('U'), REQ_UP_FIELD, "move upward to field" + }, + { + CTRL('V'), REQ_DEL_CHAR, "delete character" + }, + { + CTRL('W'), REQ_NEXT_WORD, "go to next word" + }, + { + CTRL('X'), REQ_CLR_FIELD, "clear field" + }, + { + CTRL('Y'), REQ_DEL_LINE, "delete line" + }, + { + CTRL('Z'), REQ_PREV_CHOICE, "" + }, + { + CTRL('['), MY_QUIT, "exit form" + }, + { + CTRL(']'), MY_INS_MODE, "toggle REQ_INS_MODE/REQ_OVL_MODE", + }, + { + HELP_KEY_2, MY_HELP, "show this screen", + }, + { + KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" + }, + { + KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character" + }, + { + KEY_END, REQ_LAST_FIELD, "go to last field" + }, + { + KEY_HOME, REQ_FIRST_FIELD, "go to first field" + }, + { + KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character" + }, + { + KEY_LL, REQ_LAST_FIELD, "go to last field" + }, + { + KEY_NEXT, REQ_NEXT_FIELD, "go to next field" + }, + { + KEY_NPAGE, REQ_NEXT_PAGE, "go to next page" + }, + { + KEY_PPAGE, REQ_PREV_PAGE, "go to previous page" + }, + { + KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field" + }, + { + KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character" + }, + { + KEY_UP, REQ_UP_CHAR, "move up 1 character" + } +}; + +/* + * Display a temporary window listing the keystroke-commands we recognize. + */ +void +help_edit_field(void) +{ + int used = 0; + unsigned n; + char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); + + msgs[used++] = strdup("Defined form edit/traversal keys:"); + for (n = 0; n < SIZEOF(commands); ++n) { + char *msg; + const char *name; + const char *code = keyname(commands[n].code); + size_t need = 5; +#ifdef NCURSES_VERSION + if ((name = form_request_name(commands[n].result)) == 0) +#endif + name = commands[n].help; + need = 5 + strlen(code) + strlen(name); + msg = typeMalloc(char, need); + _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); + msgs[used++] = msg; + } + msgs[used++] = + strdup("Arrow keys move within a field as you would expect."); + msgs[used] = 0; + popup_msg2(stdscr, msgs); + for (n = 0; msgs[n] != 0; ++n) { + free(msgs[n]); + } + free(msgs); +} + +static int +offset_in_field(FORM *form) +{ + FIELD *field = current_field(form); + int currow, curcol; + + form_getyx(form, currow, curcol); + return curcol + currow * (int) field->dcols; +} + +static void +inactive_field(FIELD *f) +{ + set_field_back(f, field_attrs(f)->background); +} + +FieldAttrs * +field_attrs(FIELD *f) +{ + return (FieldAttrs *) field_userptr(f); +} + +static int +buffer_length(FIELD *f) +{ + return field_attrs(f)->row_lengths[0]; +} + +static void +set_buffer_length(FIELD *f, int length) +{ + field_attrs(f)->row_lengths[0] = length; +} + +/* + * The userptr is used in edit_field.c's inactive_field(), as well as for + * keeping track of the actual lengths of lines in a multiline field. + */ +void +init_edit_field(FIELD *f, char *value) +{ + char empty[1]; + FieldAttrs *ptr = field_attrs(f); + if (ptr == 0) { + int rows, cols, frow, fcol, nrow, nbuf; + + ptr = typeCalloc(FieldAttrs, (size_t) 1); + ptr->background = field_back(f); + if (field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf) == E_OK) { + ptr->row_count = nrow; + ptr->row_lengths = typeCalloc(int, (size_t) nrow + 1); + } + } + if (value == 0) { + value = empty; + *value = '\0'; + } + set_field_userptr(f, (void *) ptr); + set_field_buffer(f, 0, value); /* will be formatted */ + set_field_buffer(f, 1, value); /* will be unformatted */ + set_buffer_length(f, (int) strlen(value)); +} + +int +edit_field(FORM *form, int *result) +{ + int ch = wgetch(form_win(form)); + int status; + FIELD *before; + unsigned n; + int length; + int before_row; + int before_col; + int before_off = offset_in_field(form); + + form_getyx(form, before_row, before_col); + before = current_field(form); + set_field_back(before, A_NORMAL); + if (ch <= KEY_MAX) { + set_field_back(before, A_REVERSE); + } else if (ch <= MAX_FORM_COMMAND) { + inactive_field(before); + } + + *result = ch; + for (n = 0; n < SIZEOF(commands); ++n) { + if (commands[n].code == ch) { + *result = commands[n].result; + break; + } + } + + status = form_driver(form, *result); + + if (status == E_OK) { + bool modified = TRUE; + + length = buffer_length(before); + if (length < before_off) + length = before_off; + switch (*result) { + case REQ_CLR_EOF: + length = before_off; + break; + case REQ_CLR_EOL: + if ((int) (before_row + 1) == (int) (before->rows)) + length = before_off; + break; + case REQ_CLR_FIELD: + length = 0; + break; + case REQ_DEL_CHAR: + if (length > before_off) + --length; + break; + case REQ_DEL_PREV: + if (length > 0) { + if (before_col > 0) { + --length; + } else if (before_row > 0) { + length -= (int) before->cols + before_col; + } + } + break; + case REQ_NEW_LINE: + length += (int) before->cols; + break; +#if 0 + /* FIXME: finish these */ + case REQ_DEL_LINE: /* delete line */ + case REQ_DEL_WORD: /* delete word at cursor */ + case REQ_INS_CHAR: /* insert blank char at cursor */ + case REQ_INS_LINE: /* insert blank line at cursor */ + case REQ_INS_MODE: /* begin insert mode */ + case REQ_OVL_MODE: /* begin overlay mode */ +#endif + /* ignore all of the motion commands */ + case REQ_SCR_BCHAR: /* FALLTHRU */ + case REQ_SCR_BHPAGE: /* FALLTHRU */ + case REQ_SCR_BLINE: /* FALLTHRU */ + case REQ_SCR_BPAGE: /* FALLTHRU */ + case REQ_SCR_FCHAR: /* FALLTHRU */ + case REQ_SCR_FHPAGE: /* FALLTHRU */ + case REQ_SCR_FLINE: /* FALLTHRU */ + case REQ_SCR_FPAGE: /* FALLTHRU */ + case REQ_SCR_HBHALF: /* FALLTHRU */ + case REQ_SCR_HBLINE: /* FALLTHRU */ + case REQ_SCR_HFHALF: /* FALLTHRU */ + case REQ_SCR_HFLINE: /* FALLTHRU */ + case REQ_BEG_FIELD: /* FALLTHRU */ + case REQ_BEG_LINE: /* FALLTHRU */ + case REQ_DOWN_CHAR: /* FALLTHRU */ + case REQ_DOWN_FIELD: /* FALLTHRU */ + case REQ_END_FIELD: /* FALLTHRU */ + case REQ_END_LINE: /* FALLTHRU */ + case REQ_FIRST_FIELD: /* FALLTHRU */ + case REQ_FIRST_PAGE: /* FALLTHRU */ + case REQ_LAST_FIELD: /* FALLTHRU */ + case REQ_LAST_PAGE: /* FALLTHRU */ + case REQ_LEFT_CHAR: /* FALLTHRU */ + case REQ_LEFT_FIELD: /* FALLTHRU */ + case REQ_NEXT_CHAR: /* FALLTHRU */ + case REQ_NEXT_CHOICE: /* FALLTHRU */ + case REQ_NEXT_FIELD: /* FALLTHRU */ + case REQ_NEXT_LINE: /* FALLTHRU */ + case REQ_NEXT_PAGE: /* FALLTHRU */ + case REQ_NEXT_WORD: /* FALLTHRU */ + case REQ_PREV_CHAR: /* FALLTHRU */ + case REQ_PREV_CHOICE: /* FALLTHRU */ + case REQ_PREV_FIELD: /* FALLTHRU */ + case REQ_PREV_LINE: /* FALLTHRU */ + case REQ_PREV_PAGE: /* FALLTHRU */ + case REQ_PREV_WORD: /* FALLTHRU */ + case REQ_RIGHT_CHAR: /* FALLTHRU */ + case REQ_RIGHT_FIELD: /* FALLTHRU */ + case REQ_SFIRST_FIELD: /* FALLTHRU */ + case REQ_SLAST_FIELD: /* FALLTHRU */ + case REQ_SNEXT_FIELD: /* FALLTHRU */ + case REQ_SPREV_FIELD: /* FALLTHRU */ + case REQ_UP_CHAR: /* FALLTHRU */ + case REQ_UP_FIELD: /* FALLTHRU */ + case REQ_VALIDATION: /* FALLTHRU */ + modified = FALSE; + break; + + default: + modified = FALSE; + if (ch >= MIN_FORM_COMMAND) { + beep(); + } else if (isprint(ch)) { + modified = TRUE; + } + break; + } + + /* + * If we do not force a re-validation, then field_buffer 0 will + * be lagging by one character. + */ + if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result + < MIN_FORM_COMMAND) + ++length; + + set_buffer_length(before, length); + } + + if (current_field(form) != before) + inactive_field(before); + return status; +} + +void +free_edit_field(FIELD *f) +{ + FieldAttrs *ptr = field_attrs(f); + if (ptr != 0) { + free(ptr->row_lengths); + free(ptr); + } +} +#else + +extern void no_edit_field(void); + +void +no_edit_field(void) +{ +} + +#endif diff --git a/contrib/ncurses/test/edit_field.h b/contrib/ncurses/test/edit_field.h new file mode 100644 index 00000000..ad9e6a59 --- /dev/null +++ b/contrib/ncurses/test/edit_field.h @@ -0,0 +1,59 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 2003-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: edit_field.h,v 1.11 2020/02/02 23:34:34 tom Exp $ + * + * Interface of edit_field.c + */ + +#ifndef EDIT_FORM_H_incl +#define EDIT_FORM_H_incl 1 + +#include + +#define EDIT_FIELD(c) (MAX_FORM_COMMAND + c) + +#define MY_HELP EDIT_FIELD('h') +#define MY_QUIT EDIT_FIELD('q') +#define MY_EDT_MODE EDIT_FIELD('e') +#define MY_INS_MODE EDIT_FIELD('t') + +typedef struct { + chtype background; + int row_count; + int *row_lengths; +} FieldAttrs; + +extern FieldAttrs *field_attrs(FIELD *field); +extern void init_edit_field(FIELD *field, char *value); +extern void help_edit_field(void); +extern int edit_field(FORM *form, int *result); +extern void free_edit_field(FIELD *field); + +#endif /* EDIT_FORM_H_incl */ diff --git a/contrib/ncurses/test/escherknot.xbm b/contrib/ncurses/test/escherknot.xbm new file mode 100644 index 00000000..80bc471b --- /dev/null +++ b/contrib/ncurses/test/escherknot.xbm @@ -0,0 +1,473 @@ +#define escherknot_width 216 +#define escherknot_height 208 + +static char escherknot_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0x5f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x6f, 0xf6, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xff, 0x3a, 0x13, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0d, 0x02, 0x51, 0x71, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2f, 0x20, 0xd9, 0x88, + 0x9b, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x82, + 0xac, 0x44, 0x4e, 0x1c, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1e, 0x40, 0x02, 0x44, 0x60, 0xe2, 0xfc, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x25, 0x09, 0x90, 0x22, 0x13, 0xb7, 0x9a, 0x1e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x40, 0x10, 0x89, + 0x18, 0xe3, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x04, 0x08, + 0x01, 0x10, 0xc8, 0xa8, 0xd5, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x80, 0x20, 0x40, 0x82, 0x00, 0x66, 0x9c, 0xec, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x08, 0x08, 0x24, 0x12, 0x93, 0x5b, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x12, 0x80, 0x04, 0x01, 0x00, 0x80, + 0x19, 0x33, 0xfa, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x80, 0x80, 0x00, + 0x20, 0x08, 0x12, 0xc4, 0x68, 0x26, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x02, 0x04, 0x24, 0x00, 0x01, 0x40, 0x24, 0x8c, 0xcd, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x80, 0x49, 0x10, 0x90, 0x00, 0x21, 0x20, 0x08, 0x11, 0x43, 0xd9, + 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, + 0xff, 0xff, 0x0b, 0x00, 0x60, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x30, 0xb9, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x97, 0x04, 0x08, 0xfe, 0x05, 0x30, 0x10, 0x12, 0x20, 0x20, + 0x04, 0x00, 0x80, 0x48, 0x0c, 0xa3, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3e, 0x92, 0x20, 0x49, 0x40, 0x3e, 0x0e, 0x82, + 0x00, 0x84, 0x25, 0x01, 0x80, 0x00, 0x80, 0xc8, 0x34, 0xed, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x25, 0x01, 0x04, 0x01, 0x08, + 0xd0, 0x17, 0x00, 0x80, 0x25, 0x01, 0xad, 0x04, 0x12, 0x20, 0x23, 0x4c, + 0x6a, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x02, 0x48, + 0x92, 0x20, 0x41, 0x92, 0x9e, 0x80, 0x24, 0x24, 0x29, 0x00, 0x04, 0x00, + 0x10, 0x98, 0xcc, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x4f, 0x10, 0x01, 0x90, 0x24, 0x40, 0x12, 0xf0, 0x00, 0x24, 0x41, 0x0b, + 0xa9, 0x10, 0x00, 0x00, 0x04, 0xd9, 0x96, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0x00, 0x92, 0x48, 0x02, 0x04, 0x09, 0xc0, 0x84, 0x8f, + 0x29, 0x2d, 0xf8, 0xa9, 0x02, 0x00, 0x00, 0x20, 0x90, 0xf4, 0x1e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x24, 0x91, 0x04, 0x50, 0x22, 0x24, + 0x1b, 0x12, 0x7a, 0x48, 0xca, 0x03, 0x21, 0x10, 0x00, 0x00, 0x48, 0x93, + 0xff, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x24, 0x92, 0x20, + 0x81, 0xda, 0x24, 0xc8, 0x16, 0xd0, 0xe7, 0x50, 0xd2, 0xbf, 0x03, 0x00, + 0x80, 0x00, 0x30, 0x29, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, + 0x20, 0x80, 0x24, 0x41, 0x12, 0x2a, 0x41, 0xb2, 0x80, 0x33, 0x0e, 0x7e, + 0x88, 0x1c, 0x01, 0x00, 0xa0, 0x24, 0x69, 0x75, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x82, 0x44, 0x11, 0x24, 0x09, 0x90, 0xa4, 0x4d, 0xd2, 0x92, + 0x9e, 0xd3, 0x83, 0x6b, 0x62, 0x00, 0x00, 0x10, 0x22, 0xff, 0x7f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x42, 0x04, 0x92, 0x24, 0x6b, 0x53, 0x32, + 0x59, 0x90, 0x16, 0xfa, 0xb4, 0xf4, 0xff, 0x0f, 0x01, 0x00, 0x90, 0x68, + 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x90, 0x24, 0x11, 0x24, + 0x49, 0xda, 0x82, 0xc5, 0x92, 0xd2, 0xd0, 0x9e, 0x1e, 0x00, 0x78, 0x0a, + 0x00, 0x00, 0x05, 0xd2, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x02, + 0x44, 0xb2, 0x65, 0xea, 0x49, 0x9e, 0x2c, 0x4b, 0x1a, 0xd2, 0xeb, 0xe3, + 0xff, 0xc7, 0x09, 0x00, 0x20, 0x68, 0xff, 0xd6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x90, 0x40, 0x92, 0x24, 0x09, 0x5f, 0xd2, 0x64, 0x59, 0x72, + 0x56, 0x7f, 0xfd, 0xdf, 0x1f, 0x12, 0x00, 0x20, 0x49, 0x92, 0xde, 0x01, + 0x00, 0x00, 0x00, 0x80, 0x41, 0x92, 0x4c, 0x92, 0x24, 0x25, 0xc9, 0x8b, + 0x2e, 0xcb, 0x92, 0x4b, 0x5a, 0x2f, 0x75, 0xf4, 0x04, 0x00, 0x00, 0x41, + 0xf6, 0x74, 0x01, 0x00, 0x00, 0x00, 0x40, 0x49, 0x02, 0x00, 0xba, 0xb6, + 0xfd, 0x49, 0xf8, 0x74, 0x6d, 0x4b, 0x72, 0xed, 0xdb, 0xff, 0xcf, 0x53, + 0x00, 0x00, 0x48, 0xb6, 0xd7, 0x03, 0x00, 0x00, 0x00, 0x60, 0x48, 0x10, + 0xc9, 0x93, 0x24, 0x00, 0x7b, 0xc3, 0xa6, 0x69, 0x58, 0x5a, 0xfb, 0xfa, + 0xa5, 0xbe, 0x16, 0x00, 0x00, 0x92, 0xa4, 0xfd, 0x03, 0x00, 0x00, 0x00, + 0x30, 0x01, 0x20, 0x5d, 0xa2, 0xfe, 0x7f, 0x01, 0x4f, 0x1a, 0xcd, 0x6b, + 0x6a, 0xa9, 0x5f, 0xff, 0xf3, 0x24, 0x01, 0x40, 0xc0, 0xb4, 0xf4, 0x03, + 0x00, 0x00, 0x00, 0x2c, 0x88, 0x84, 0x89, 0xb6, 0x00, 0x24, 0x7d, 0x69, + 0xf2, 0x34, 0xad, 0x99, 0x2d, 0xf7, 0xff, 0x9f, 0x4b, 0x00, 0x00, 0x92, + 0xa6, 0xad, 0x07, 0x00, 0x00, 0x00, 0x06, 0x91, 0x24, 0xe9, 0xa4, 0xfd, + 0xa5, 0xa9, 0x4b, 0x93, 0xe7, 0x34, 0x63, 0xf9, 0xfc, 0xd5, 0xef, 0x16, + 0x00, 0x40, 0x90, 0xb4, 0xbd, 0x07, 0x00, 0x00, 0x00, 0x6a, 0x80, 0x4c, + 0x96, 0xbe, 0x2d, 0xfd, 0x2f, 0x7c, 0x5e, 0x9c, 0x67, 0xad, 0xa5, 0xfd, + 0xff, 0xbf, 0x29, 0x00, 0x00, 0x92, 0x76, 0xed, 0x06, 0x00, 0x00, 0x00, + 0x05, 0x12, 0x48, 0x53, 0x25, 0x65, 0x25, 0xf4, 0xe5, 0xd3, 0x72, 0x9c, + 0x35, 0xdf, 0xf6, 0x7f, 0xf5, 0x56, 0x00, 0x00, 0x92, 0xa4, 0xed, 0x0f, + 0x00, 0x00, 0x80, 0x49, 0x20, 0x59, 0x38, 0xec, 0xff, 0xff, 0xad, 0x2f, + 0x5d, 0xd3, 0x33, 0xe6, 0x24, 0xed, 0xff, 0xdf, 0x2d, 0x01, 0x40, 0x80, + 0x24, 0xbd, 0x07, 0x00, 0x00, 0xc0, 0x48, 0x24, 0x49, 0x87, 0x37, 0x21, + 0xa0, 0xbd, 0xf4, 0x79, 0x4f, 0xc7, 0x9c, 0xde, 0xf6, 0xff, 0xff, 0x5b, + 0x08, 0x00, 0x92, 0xfc, 0xe9, 0x0e, 0x00, 0x00, 0x20, 0x89, 0x40, 0xd3, + 0xf4, 0x49, 0xff, 0xff, 0xe7, 0x2f, 0xcf, 0x79, 0x9c, 0x53, 0xb2, 0x35, + 0xff, 0xff, 0x37, 0x00, 0x40, 0x90, 0x24, 0xef, 0x0e, 0x00, 0x00, 0x30, + 0x91, 0x49, 0x32, 0x2d, 0xff, 0x6b, 0xb7, 0xbd, 0xbc, 0x3c, 0xef, 0x79, + 0xce, 0xde, 0xd6, 0xfd, 0xff, 0x9f, 0x00, 0x00, 0x92, 0xa6, 0xad, 0x0b, + 0x00, 0x00, 0x30, 0x11, 0x89, 0x8c, 0xcb, 0x5b, 0xba, 0xaf, 0xf6, 0xd7, + 0xe7, 0x35, 0xe7, 0x59, 0xb3, 0xfb, 0xff, 0xff, 0x7f, 0x04, 0x40, 0x80, + 0xe4, 0xb9, 0x1f, 0x00, 0x00, 0x48, 0x22, 0x91, 0x66, 0x79, 0xeb, 0xff, + 0xff, 0xdf, 0xbe, 0xbe, 0xe7, 0x8c, 0x75, 0x6b, 0x4a, 0xfa, 0xbf, 0x7f, + 0x00, 0x00, 0x82, 0x24, 0xef, 0x0e, 0x00, 0x00, 0x4c, 0x22, 0xb2, 0x79, + 0x5e, 0xfa, 0x5b, 0xa9, 0xfd, 0xeb, 0xf5, 0x9c, 0x3d, 0xc6, 0xcc, 0xee, + 0xed, 0x01, 0xf8, 0x00, 0x40, 0x82, 0xb6, 0xa9, 0x1b, 0x00, 0x00, 0x94, + 0x64, 0x66, 0x8e, 0xd3, 0x97, 0xfe, 0xff, 0xd7, 0xdf, 0x9f, 0x7b, 0xf3, + 0x3c, 0x35, 0x59, 0x6b, 0x00, 0x70, 0x00, 0x00, 0x40, 0xe4, 0xed, 0x1e, + 0x00, 0x00, 0x92, 0xc4, 0x34, 0xf3, 0xfc, 0xfd, 0x5f, 0xad, 0x7d, 0xfa, + 0x7a, 0xce, 0x8e, 0xb3, 0x76, 0x2f, 0xfd, 0x00, 0xe0, 0x04, 0x00, 0x9a, + 0x26, 0xaf, 0x1e, 0x00, 0x00, 0x13, 0x88, 0xcc, 0xb5, 0x3f, 0xbf, 0xff, + 0xff, 0xd7, 0xef, 0xef, 0xbd, 0x79, 0x6a, 0xde, 0xec, 0xab, 0x01, 0xc0, + 0x00, 0x00, 0x40, 0xb6, 0xbd, 0x1b, 0x00, 0x00, 0x05, 0x91, 0xeb, 0x5c, + 0xeb, 0xeb, 0xff, 0xff, 0xff, 0x7e, 0xef, 0x6b, 0xef, 0xcd, 0x99, 0xb3, + 0xe4, 0x07, 0x80, 0x00, 0x40, 0x49, 0xb2, 0xe5, 0x1a, 0x00, 0x80, 0x20, + 0x32, 0xb1, 0xe7, 0x79, 0x7f, 0xf7, 0xff, 0xfd, 0xeb, 0xbd, 0xfe, 0x2c, + 0x3d, 0x6b, 0xb6, 0xaf, 0x06, 0x80, 0x00, 0x00, 0x41, 0x96, 0xfe, 0x1e, + 0x00, 0x80, 0x44, 0xb2, 0x9b, 0xf9, 0xde, 0xff, 0xff, 0xff, 0x7f, 0xbf, + 0xf7, 0xbb, 0xb3, 0x77, 0xce, 0xce, 0xb6, 0x0d, 0x80, 0x01, 0x00, 0x49, + 0xf2, 0x94, 0x1f, 0x00, 0x40, 0x49, 0x44, 0xe6, 0x9e, 0x77, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbf, 0xf7, 0x7e, 0xd6, 0xbc, 0xd9, 0xba, 0x3b, 0x80, + 0x00, 0x00, 0x64, 0x93, 0xf7, 0x1b, 0x00, 0x40, 0x89, 0xec, 0x7e, 0x67, + 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xdb, 0x99, 0x33, 0x37, + 0xd3, 0x36, 0x80, 0x01, 0x80, 0x24, 0xda, 0xd6, 0x1e, 0x00, 0x20, 0x90, + 0x99, 0x99, 0x7b, 0xef, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbd, 0x37, + 0x63, 0xf3, 0x66, 0xdb, 0x7a, 0x80, 0x00, 0x00, 0x24, 0x59, 0xde, 0x1f, + 0x00, 0x60, 0x12, 0xb3, 0xf7, 0xdd, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xf7, 0xfe, 0x6e, 0xce, 0xdd, 0x6d, 0xd7, 0x80, 0x00, 0x80, 0x20, + 0xcb, 0xfb, 0x1f, 0x00, 0x10, 0x20, 0x6e, 0x66, 0x76, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xef, 0xde, 0xdb, 0x9b, 0x99, 0xb3, 0x5d, 0x6b, 0x81, + 0x00, 0x40, 0x96, 0x59, 0x6a, 0x1f, 0x00, 0x98, 0xc4, 0xe4, 0xdf, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0x6f, 0x7b, 0x37, 0x7f, + 0xb3, 0xdd, 0x83, 0x00, 0x00, 0xb0, 0xed, 0xef, 0x1d, 0x00, 0x10, 0x88, + 0x9e, 0xdd, 0xcd, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xed, + 0x6c, 0xe6, 0xcc, 0x76, 0x6d, 0xc1, 0x00, 0x40, 0x91, 0x24, 0x7b, 0x1f, + 0x00, 0x08, 0xd1, 0xf1, 0x66, 0x76, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xdf, 0xbd, 0xbf, 0xd9, 0xdd, 0xdd, 0xb6, 0x47, 0x00, 0x00, 0xd8, + 0xb4, 0xad, 0x1f, 0x00, 0x24, 0x24, 0x6f, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xb7, 0x9d, 0x33, 0xd9, 0x96, 0x4e, + 0x00, 0x20, 0x49, 0xf7, 0xfd, 0x1e, 0x00, 0x48, 0xe4, 0xac, 0xb9, 0xdd, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdd, 0x76, 0xb6, + 0xb7, 0xfd, 0x7a, 0x00, 0x00, 0x44, 0x96, 0xb7, 0x1f, 0x00, 0x02, 0x9a, + 0xbe, 0x6f, 0x77, 0xff, 0xff, 0x7f, 0x61, 0xd9, 0xff, 0xff, 0xff, 0xfd, + 0xdd, 0x66, 0xed, 0x66, 0x5b, 0x37, 0x00, 0x90, 0x64, 0xb9, 0xf6, 0x1f, + 0x00, 0x02, 0xc9, 0xf3, 0xee, 0xfd, 0xff, 0xff, 0x2f, 0x24, 0x4f, 0xfe, + 0xff, 0xff, 0x7f, 0x37, 0xdb, 0xcd, 0x7c, 0xff, 0x3a, 0x00, 0x88, 0x24, + 0xdb, 0xde, 0x1a, 0x00, 0x13, 0x31, 0x6f, 0xbb, 0xdf, 0xff, 0xff, 0x21, + 0xa0, 0x64, 0xf3, 0xff, 0xff, 0xe7, 0xff, 0x96, 0xbb, 0x9b, 0xa5, 0x1d, + 0x00, 0x60, 0x32, 0xe9, 0xdb, 0x0f, 0x00, 0x65, 0xe6, 0x3c, 0xfb, 0xf6, + 0xff, 0x7f, 0x10, 0xa4, 0xb5, 0x9d, 0xfe, 0xdf, 0xdf, 0xdd, 0x6d, 0x32, + 0xb3, 0x7d, 0x0d, 0x00, 0x0b, 0x93, 0x7c, 0x7b, 0x0f, 0x00, 0x89, 0xdc, + 0xb3, 0xed, 0xfb, 0xff, 0x1f, 0x10, 0x90, 0x92, 0xd9, 0xfe, 0x7f, 0xff, + 0x77, 0xdb, 0xee, 0x6e, 0xdb, 0x0e, 0x00, 0x20, 0xdd, 0x66, 0x6f, 0x0f, + 0x80, 0x91, 0x5a, 0xfb, 0xbe, 0xef, 0xff, 0x0f, 0x10, 0xda, 0x92, 0xee, + 0xff, 0xff, 0xff, 0xf7, 0xb7, 0xcd, 0xee, 0xde, 0x07, 0x00, 0x24, 0x49, + 0xb6, 0xed, 0x0f, 0x00, 0x12, 0x6b, 0xcd, 0xf3, 0xbe, 0xff, 0x07, 0x08, + 0x48, 0xda, 0x76, 0xb7, 0xff, 0xff, 0xdd, 0x6e, 0xba, 0x99, 0x65, 0x03, + 0x40, 0x92, 0xe4, 0xba, 0xbd, 0x0e, 0x80, 0x62, 0xed, 0x7d, 0x5f, 0xf7, + 0xff, 0x01, 0x08, 0x28, 0xc9, 0x26, 0xbb, 0xff, 0xff, 0xff, 0x99, 0xb7, + 0xbb, 0x7d, 0x03, 0x00, 0x89, 0x64, 0xdb, 0xf6, 0x07, 0x40, 0x0c, 0x35, + 0xe7, 0x79, 0xdd, 0xff, 0x01, 0x84, 0xa5, 0x7d, 0xba, 0xdd, 0xfe, 0x7f, + 0xbf, 0xbf, 0x6d, 0x76, 0xdb, 0x01, 0x00, 0x48, 0x36, 0xdb, 0xd6, 0x07, + 0xc0, 0x88, 0xb4, 0xb6, 0xbf, 0xff, 0x7f, 0x00, 0x0c, 0x24, 0x44, 0xdb, + 0xed, 0xff, 0xdf, 0xef, 0x6e, 0xdb, 0x6e, 0xb7, 0x00, 0x80, 0x44, 0x93, + 0xed, 0x5b, 0x07, 0x40, 0x91, 0xd2, 0xfa, 0xfc, 0xf6, 0x7f, 0x00, 0x02, + 0xb4, 0x35, 0xd9, 0xef, 0xff, 0xff, 0xfb, 0xef, 0xb6, 0xc9, 0xe4, 0x00, + 0x10, 0x24, 0xd9, 0x6d, 0xfb, 0x03, 0x00, 0x27, 0xfe, 0xd3, 0xd6, 0xdb, + 0x3f, 0x00, 0xa2, 0x94, 0xb4, 0xdb, 0x7c, 0xff, 0xff, 0xbf, 0xd9, 0xad, + 0xdb, 0x7d, 0x00, 0x40, 0x32, 0xd9, 0xb6, 0xef, 0x03, 0x60, 0xe4, 0x5a, + 0x5f, 0x5f, 0xff, 0x1f, 0x00, 0x02, 0x52, 0x92, 0xec, 0xb6, 0xff, 0xff, + 0xef, 0xff, 0x6d, 0xb6, 0x3b, 0x00, 0x28, 0x90, 0xcc, 0xbe, 0xfd, 0x03, + 0xa0, 0x88, 0xeb, 0xf9, 0xfd, 0xf5, 0x1f, 0x00, 0x82, 0x53, 0xbb, 0x6d, + 0xf7, 0xff, 0xf9, 0xff, 0x6f, 0xdb, 0x6d, 0x1b, 0x00, 0x04, 0xc9, 0x66, + 0xdb, 0x57, 0x03, 0xa0, 0x52, 0xaf, 0xa7, 0x97, 0xff, 0x0f, 0x00, 0x51, + 0x48, 0xda, 0x66, 0xdb, 0xff, 0xf8, 0xdf, 0xed, 0xbe, 0xed, 0x0e, 0x00, + 0x92, 0x64, 0x32, 0xeb, 0xf6, 0x01, 0x20, 0x63, 0xbd, 0xbc, 0xfc, 0xfa, + 0x0f, 0x00, 0x09, 0x20, 0x89, 0x3e, 0xff, 0xff, 0xe0, 0x7f, 0xdf, 0x6f, + 0xdb, 0x07, 0x00, 0x01, 0x24, 0xbb, 0xed, 0xfe, 0x01, 0xa0, 0xce, 0xf5, + 0xf6, 0xdb, 0xdf, 0x07, 0x00, 0x41, 0xad, 0x5f, 0xf2, 0xed, 0xff, 0xc0, + 0xff, 0xbf, 0xdd, 0x92, 0x03, 0x00, 0x44, 0xb2, 0xd9, 0x7d, 0xfb, 0x01, + 0xe0, 0xaa, 0xdf, 0x9b, 0x7f, 0xfb, 0x07, 0x80, 0x28, 0x21, 0x64, 0xbb, + 0x7f, 0x7f, 0x80, 0xff, 0xf6, 0xbb, 0xee, 0x03, 0x80, 0x22, 0x99, 0xed, + 0xb6, 0xff, 0x00, 0x90, 0xb8, 0x5e, 0x5b, 0x6b, 0xed, 0x03, 0x00, 0x01, + 0xa6, 0x6d, 0xdb, 0xf6, 0x7f, 0x00, 0xff, 0xff, 0xf6, 0xcd, 0x00, 0x40, + 0x10, 0xc9, 0x6c, 0xff, 0xf7, 0x00, 0xa0, 0xe3, 0x72, 0xeb, 0xef, 0xff, + 0x03, 0x80, 0xe0, 0x90, 0x24, 0xdb, 0xbd, 0x3f, 0x00, 0xfe, 0xdb, 0x6f, + 0xfb, 0x00, 0x00, 0x89, 0x4c, 0xb6, 0xd9, 0x7e, 0x00, 0x70, 0xaf, 0xaf, + 0x6f, 0xb5, 0xde, 0x03, 0x80, 0x94, 0x92, 0xb6, 0xf9, 0xf6, 0x3f, 0x00, + 0xfc, 0xbf, 0xdd, 0x7b, 0x00, 0x10, 0x48, 0x26, 0xb3, 0xdf, 0x7f, 0x00, + 0x70, 0xd8, 0xae, 0xfd, 0xff, 0xf7, 0x03, 0x80, 0x00, 0xd2, 0x36, 0xcf, + 0xdf, 0x3f, 0x00, 0xb8, 0x6d, 0xdf, 0x16, 0x00, 0x48, 0x44, 0xb2, 0xfb, + 0x6c, 0x3f, 0x00, 0x50, 0x75, 0xfd, 0xa5, 0xd5, 0xfe, 0x01, 0x40, 0xd1, + 0x12, 0xa2, 0x7d, 0xfb, 0x1f, 0x00, 0xf0, 0xff, 0xbf, 0x0d, 0x00, 0x20, + 0x12, 0x9b, 0xcd, 0xf6, 0x3f, 0x00, 0x90, 0xd5, 0xa7, 0xfd, 0x77, 0xab, + 0x03, 0x40, 0x1c, 0xc8, 0xbe, 0x6d, 0xfb, 0x1f, 0x00, 0xe0, 0xff, 0xee, + 0x07, 0x00, 0x04, 0x91, 0xc9, 0x7e, 0xbf, 0x1f, 0x00, 0x30, 0x57, 0xbf, + 0xa6, 0xde, 0xfd, 0x01, 0x40, 0x40, 0x6b, 0xd3, 0x6e, 0xef, 0x0f, 0x00, + 0xc0, 0xeb, 0x7d, 0x03, 0x00, 0x90, 0xc8, 0x6c, 0x76, 0xfb, 0x0f, 0x00, + 0x70, 0x5c, 0xe5, 0xf7, 0xfa, 0xeb, 0x01, 0x40, 0x50, 0x49, 0x92, 0xf4, + 0xfd, 0x0f, 0x00, 0xc0, 0xff, 0xdb, 0x01, 0x80, 0x44, 0x44, 0x66, 0xbb, + 0x6f, 0x0f, 0x00, 0xd0, 0xf1, 0x95, 0xf6, 0x6f, 0xad, 0x01, 0x40, 0x08, + 0x78, 0xdb, 0xb6, 0xef, 0x0f, 0x00, 0x00, 0xdf, 0xd6, 0x00, 0x00, 0x20, + 0x32, 0xb3, 0xdb, 0xfd, 0x0f, 0x00, 0x10, 0xd7, 0xf7, 0xb6, 0xd8, 0xeb, + 0x03, 0x20, 0x43, 0x27, 0xd9, 0xb6, 0xfd, 0x0f, 0x00, 0x00, 0xff, 0x7e, + 0x00, 0x40, 0x12, 0x93, 0xd9, 0xec, 0xb6, 0x07, 0x00, 0x70, 0x55, 0xdd, + 0xf6, 0x6f, 0xbb, 0x01, 0x40, 0x28, 0xa1, 0x6f, 0xb6, 0xb7, 0x0f, 0x00, + 0x00, 0xde, 0x1f, 0x00, 0x80, 0x88, 0xd8, 0xcc, 0x66, 0xff, 0x03, 0x00, + 0x70, 0xf4, 0xf5, 0xdb, 0xaa, 0xee, 0x01, 0x60, 0x28, 0x2d, 0x49, 0xf7, + 0xf6, 0x07, 0x00, 0x00, 0x7c, 0x0f, 0x00, 0x08, 0x48, 0x66, 0x6e, 0xfb, + 0xef, 0x03, 0x00, 0xd0, 0xd5, 0xdf, 0x52, 0xff, 0xda, 0x03, 0x20, 0xa3, + 0xa5, 0xd9, 0xb2, 0xff, 0x07, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x20, 0x22, + 0x33, 0x37, 0xbf, 0xfd, 0x01, 0x00, 0x70, 0x5f, 0xf7, 0xfe, 0xab, 0x6b, + 0x02, 0xa0, 0xa8, 0xb4, 0x6d, 0xdf, 0xf6, 0x07, 0x00, 0x00, 0xf8, 0x01, + 0x00, 0x12, 0x33, 0x11, 0xd9, 0xdd, 0xff, 0x01, 0x00, 0x70, 0x75, 0xd5, + 0x52, 0xea, 0x8a, 0x03, 0x20, 0x84, 0x36, 0x69, 0xba, 0xdb, 0x07, 0x00, + 0x00, 0xf0, 0x01, 0x00, 0x81, 0xc8, 0xcc, 0xdd, 0xed, 0xff, 0x00, 0x00, + 0x60, 0xd5, 0xdf, 0xf6, 0xae, 0x6b, 0x03, 0x00, 0xa1, 0xa4, 0x6d, 0xdf, + 0xfe, 0x07, 0x00, 0x00, 0x60, 0x00, 0x40, 0x44, 0xc6, 0xcc, 0x64, 0xb7, + 0xfd, 0x00, 0x00, 0xe0, 0x55, 0xf7, 0xd6, 0xea, 0xba, 0x07, 0x20, 0x94, + 0x94, 0x6d, 0xfb, 0xdb, 0x07, 0x00, 0x00, 0x20, 0x00, 0x20, 0x20, 0x32, + 0x76, 0x77, 0xff, 0x7f, 0x00, 0x00, 0x60, 0x7d, 0xd5, 0xb6, 0x3f, 0xaf, + 0x06, 0xa0, 0xa4, 0x95, 0x6c, 0x9b, 0xee, 0x07, 0x00, 0x00, 0x18, 0x00, + 0x10, 0x92, 0x15, 0x73, 0xbb, 0xd9, 0x3f, 0x00, 0x00, 0xe0, 0xf5, 0xff, + 0xf7, 0x6a, 0xa9, 0x06, 0x80, 0xa2, 0xb4, 0x6d, 0xfb, 0xfb, 0x07, 0x00, + 0x00, 0x04, 0x00, 0x84, 0x88, 0xc8, 0x99, 0xdd, 0xff, 0x3f, 0x00, 0x00, + 0xe0, 0x8b, 0xff, 0x96, 0x6a, 0xb6, 0x0a, 0xa0, 0x94, 0x96, 0x64, 0xdb, + 0xee, 0x07, 0x00, 0x00, 0x03, 0x08, 0x20, 0x60, 0x66, 0xec, 0xee, 0xb6, + 0x1d, 0x00, 0x00, 0xc0, 0x7e, 0xa5, 0xf4, 0xab, 0x55, 0x0d, 0x20, 0xe7, + 0xd4, 0x6d, 0xdb, 0xfb, 0x07, 0x00, 0x80, 0x00, 0x00, 0x09, 0x12, 0x33, + 0x67, 0x77, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xfa, 0xff, 0xb7, 0x7a, 0x55, + 0x19, 0x90, 0x91, 0xd4, 0x64, 0xdb, 0xee, 0x07, 0x00, 0x40, 0x00, 0x81, + 0x04, 0x88, 0x91, 0x3b, 0xbb, 0xfd, 0x0f, 0x00, 0x00, 0xc0, 0xab, 0xbf, + 0xed, 0x4e, 0xbb, 0x32, 0x20, 0x94, 0x96, 0x6c, 0xff, 0xfa, 0x03, 0x00, + 0x30, 0x40, 0x20, 0x20, 0x64, 0xcc, 0xdc, 0xdd, 0xff, 0x07, 0x00, 0x00, + 0xc0, 0xeb, 0xea, 0xfd, 0xd5, 0xaa, 0x2a, 0x20, 0xd7, 0xb0, 0x6d, 0x93, + 0xef, 0x07, 0x00, 0x08, 0x00, 0x08, 0x01, 0x23, 0xee, 0xee, 0xee, 0xfb, + 0x03, 0x00, 0x00, 0xc0, 0xfe, 0xff, 0x2d, 0xdd, 0x6a, 0x49, 0xd0, 0x90, + 0x9a, 0x64, 0xdf, 0xea, 0x07, 0x00, 0x03, 0x80, 0x40, 0x8c, 0x98, 0x33, + 0xb3, 0xbb, 0xff, 0x01, 0x00, 0x00, 0xc0, 0xa5, 0x7b, 0x6d, 0xa7, 0x56, + 0xc5, 0xa0, 0x94, 0x94, 0x6f, 0xd3, 0xbb, 0x07, 0x80, 0x10, 0x0c, 0x12, + 0x40, 0xc6, 0xb9, 0xdb, 0xfb, 0xfd, 0x01, 0x00, 0x00, 0x80, 0x97, 0xee, + 0xdf, 0xba, 0x54, 0x1a, 0xa1, 0xe5, 0xd2, 0x64, 0x7e, 0xee, 0x07, 0x60, + 0x02, 0x80, 0x00, 0x31, 0x62, 0xcc, 0xdc, 0xee, 0x7f, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xdb, 0xaa, 0xb5, 0x8a, 0x86, 0x98, 0x96, 0x6d, 0x9b, + 0xea, 0x07, 0x98, 0x00, 0x22, 0x44, 0x88, 0x39, 0x77, 0x77, 0xff, 0x7f, + 0x00, 0x00, 0x00, 0x80, 0x7d, 0x77, 0xba, 0x7b, 0x2d, 0x55, 0x3c, 0xa6, + 0xb4, 0x6c, 0xf6, 0xaf, 0x07, 0x07, 0x90, 0x88, 0x20, 0x42, 0x9c, 0xbb, + 0xbb, 0xbb, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x4b, 0xbd, 0xbf, 0x55, 0x53, + 0xa5, 0xb2, 0xa1, 0xb4, 0xc9, 0x9f, 0xda, 0xcf, 0x28, 0x24, 0x42, 0x08, + 0x31, 0xe6, 0xcc, 0xdd, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xef, + 0xb7, 0xbd, 0xde, 0x12, 0xd1, 0xac, 0x95, 0x4d, 0xf2, 0x56, 0x9f, 0x88, + 0x80, 0x10, 0xc2, 0x9c, 0x73, 0x77, 0xef, 0xfe, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0xbf, 0xfb, 0xed, 0xeb, 0x35, 0x95, 0x72, 0xa2, 0x35, 0xcd, 0xb6, + 0xd6, 0x2f, 0x21, 0x24, 0x04, 0x31, 0xc6, 0x98, 0x33, 0xf7, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x6a, 0x7f, 0x5b, 0xab, 0x2d, 0x28, 0x23, + 0x65, 0xd9, 0xb6, 0x55, 0x5f, 0x88, 0x08, 0x43, 0x0c, 0x61, 0xde, 0xdd, + 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x76, 0xff, 0x4d, 0xd7, 0x4d, + 0x4a, 0xa5, 0x29, 0x2d, 0xdb, 0xbe, 0x55, 0x1f, 0x22, 0x42, 0x28, 0xc2, + 0x39, 0xe7, 0xee, 0xee, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x7f, + 0xfb, 0xb6, 0xb6, 0x95, 0x70, 0x2e, 0xa5, 0xd9, 0x24, 0x5d, 0x5f, 0x8a, + 0x28, 0x88, 0x31, 0x9e, 0x39, 0x73, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xec, 0xb7, 0xdf, 0x6c, 0xb5, 0x65, 0x26, 0xa3, 0x39, 0x9b, 0xfc, + 0x85, 0x5d, 0x21, 0x04, 0x63, 0x1c, 0xe6, 0xdd, 0xbd, 0xfb, 0xff, 0xff, + 0x01, 0x00, 0x00, 0x00, 0xb8, 0xfa, 0xb6, 0x6f, 0x4d, 0x9a, 0x28, 0x59, + 0x4d, 0xd3, 0x2f, 0xf5, 0x3f, 0x8c, 0xd1, 0x18, 0xc6, 0x31, 0xf6, 0xdd, + 0xfe, 0xff, 0xfe, 0x01, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, 0xb9, 0xb6, + 0x25, 0xe1, 0x4d, 0x69, 0xba, 0x6c, 0xad, 0x3c, 0x41, 0x14, 0x84, 0xe9, + 0x9e, 0x37, 0xf7, 0xff, 0xff, 0xfb, 0x03, 0x00, 0x00, 0x00, 0x70, 0x5d, + 0x3d, 0x9f, 0x3d, 0x6d, 0x26, 0x52, 0x59, 0xb6, 0x6d, 0xab, 0x7f, 0x14, + 0x82, 0xe1, 0x39, 0xe6, 0xdd, 0xfb, 0xff, 0xbf, 0xff, 0x01, 0x00, 0x00, + 0x00, 0xf0, 0xf6, 0x6f, 0x77, 0xcd, 0x92, 0xd0, 0x52, 0x4b, 0xb3, 0x49, + 0x0b, 0x3a, 0x41, 0x61, 0x38, 0x9e, 0x73, 0xee, 0xdc, 0xff, 0xff, 0xfd, + 0x03, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xd7, 0x65, 0xda, 0x66, 0x63, 0x9d, + 0xf2, 0x36, 0x7b, 0x6a, 0x7f, 0x14, 0x18, 0x8e, 0xe7, 0xd9, 0x7b, 0xff, + 0xff, 0xef, 0xff, 0x03, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xdd, 0xb6, + 0xc9, 0x4c, 0x46, 0x9a, 0x64, 0xcb, 0x5b, 0xed, 0x06, 0xc6, 0xe3, 0x71, + 0xde, 0xbd, 0xff, 0xff, 0x7f, 0xff, 0x07, 0x00, 0x00, 0x00, 0xc0, 0x7f, + 0x7f, 0xff, 0x59, 0x37, 0x75, 0xbb, 0x96, 0x66, 0xdb, 0x56, 0xf7, 0xe0, + 0xf2, 0x74, 0x9e, 0x77, 0xef, 0xfd, 0xff, 0xeb, 0xed, 0x03, 0x00, 0x00, + 0x00, 0xc0, 0xea, 0xdf, 0xb3, 0xdb, 0xde, 0xc6, 0x81, 0xb0, 0x6c, 0xba, + 0xb4, 0xf6, 0x38, 0x18, 0x3c, 0xe7, 0x9c, 0xfb, 0xff, 0x7f, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x80, 0xff, 0xf7, 0x6e, 0x66, 0xd9, 0x99, 0xac, + 0xa4, 0xcd, 0x96, 0xa5, 0xea, 0x03, 0xa7, 0xcf, 0x79, 0xef, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0xef, 0xdf, + 0x6f, 0xef, 0x72, 0x65, 0xd9, 0xb6, 0xad, 0xe8, 0xc1, 0xe1, 0xf1, 0xbe, + 0x7b, 0xef, 0xff, 0xdf, 0x7a, 0xfb, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0x5f, 0xdd, 0x9d, 0xac, 0x99, 0x84, 0x29, 0xcd, 0x3c, 0x4f, 0x9d, 0x7d, + 0x3c, 0x9e, 0xe7, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xef, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xfe, 0xff, 0x77, 0x7b, 0x33, 0xe7, 0x5a, 0x49, 0x9b, 0x65, + 0x59, 0x75, 0x07, 0x97, 0xf7, 0xbb, 0xef, 0xff, 0xff, 0xdb, 0xfe, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xf7, 0x3f, 0xe7, 0xcf, 0x9c, 0x51, + 0x4d, 0xb0, 0x6d, 0x4b, 0xc9, 0xd3, 0xf5, 0x79, 0xfe, 0xfb, 0xff, 0xff, + 0xdb, 0xda, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, 0xde, + 0xdd, 0xf3, 0x4d, 0x52, 0x36, 0xcb, 0xd2, 0x3a, 0x7e, 0x3c, 0xde, 0xe7, + 0xbe, 0xff, 0x7f, 0xda, 0xff, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xfb, 0xdd, 0x73, 0x8f, 0xa5, 0x9a, 0xe6, 0xd9, 0xb6, 0xe2, 0x4e, + 0xc7, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xf6, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0xee, 0x79, 0xb2, 0xb2, 0x2c, 0x9f, + 0xb6, 0x54, 0xfe, 0xfb, 0x79, 0xbf, 0xff, 0xff, 0x5f, 0xda, 0xff, 0xfa, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xf7, 0xbf, 0xe7, 0x4b, + 0xb4, 0x69, 0xd3, 0x2c, 0x25, 0xbd, 0xbc, 0xcf, 0xf7, 0xfd, 0xff, 0xd7, + 0xf6, 0xfe, 0xdf, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, 0x9d, + 0xf1, 0x3e, 0x57, 0x25, 0xcb, 0xb6, 0x6d, 0xa9, 0xb5, 0xef, 0xfb, 0xff, + 0xff, 0xff, 0xd5, 0xda, 0xd6, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xfb, 0xcf, 0xf5, 0x25, 0x65, 0xd9, 0x66, 0x5b, 0x4a, 0xfa, + 0xf9, 0x7e, 0xff, 0xff, 0xff, 0xf6, 0xd6, 0xdf, 0xfa, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xef, 0x3e, 0xf7, 0x9f, 0x5b, 0x92, 0x6c, + 0xdb, 0x52, 0xe5, 0xbe, 0xdf, 0xff, 0xff, 0xbf, 0x51, 0xda, 0xfa, 0x7f, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7b, 0x9f, 0xe7, + 0x4c, 0xb3, 0x4d, 0xd3, 0x54, 0xd9, 0xe7, 0xfb, 0xff, 0xff, 0x5f, 0xdc, + 0xfa, 0xdf, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f, + 0xe7, 0xf9, 0x3a, 0xd3, 0xa6, 0xe9, 0xb6, 0xa5, 0xca, 0xf9, 0xfd, 0xff, + 0xff, 0x83, 0x42, 0xd2, 0xff, 0xfb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0xfd, 0xbf, 0xef, 0x4f, 0xd5, 0x64, 0xdb, 0x26, 0x4d, 0x30, + 0x7f, 0xff, 0xff, 0xff, 0x91, 0xda, 0xdb, 0xda, 0xdf, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xbf, 0xff, 0x7d, 0xbe, 0xb5, 0x6d, 0x97, + 0x6d, 0x93, 0x56, 0xdf, 0xff, 0xff, 0x7f, 0x81, 0x4a, 0xda, 0x7f, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xef, 0xeb, 0xbb, + 0xa6, 0x4d, 0x73, 0xcd, 0x92, 0xaa, 0xfe, 0xff, 0xff, 0x1f, 0x01, 0x6a, + 0x5b, 0xfb, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xfd, 0xbf, 0x5f, 0x3b, 0xdb, 0x36, 0xbb, 0x26, 0x4c, 0xf9, 0xff, 0xff, + 0x0f, 0xa3, 0x2a, 0xe9, 0x7f, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xee, 0xff, 0xff, 0xfe, 0xfe, 0xcc, 0x91, 0xec, 0x93, 0x6d, 0x93, + 0xf2, 0xff, 0xff, 0x03, 0x00, 0x6a, 0x6d, 0x6f, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xf7, 0x6f, 0x76, 0xb6, 0xcd, + 0x76, 0xc9, 0x2a, 0xe9, 0xff, 0xff, 0x00, 0x02, 0x24, 0xed, 0xf9, 0xed, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xdf, 0xff, + 0xd9, 0x66, 0x9b, 0x6c, 0x93, 0x54, 0xc5, 0xff, 0x3f, 0x00, 0x01, 0x95, + 0xb5, 0xaf, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xff, 0xff, 0xfd, 0xae, 0x7d, 0xde, 0x6d, 0xf6, 0xa1, 0x8a, 0xff, 0x0f, + 0x00, 0x81, 0x90, 0xb4, 0xfd, 0xfd, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xcd, 0xb2, 0xdb, 0x2c, 0xcb, + 0x54, 0xfe, 0x01, 0x00, 0x01, 0xd2, 0xb6, 0xb7, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x39, 0xdb, 0x76, + 0xb3, 0x4b, 0xb6, 0x0a, 0xfe, 0x00, 0x00, 0x01, 0x48, 0xda, 0xfe, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xcf, 0xb9, 0x6d, 0xb6, 0xd9, 0xa5, 0x75, 0x1c, 0x00, 0x80, 0x80, 0x20, + 0xdb, 0xda, 0xbe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0x77, 0x96, 0xd9, 0x26, 0xb3, 0x4d, 0x82, 0x11, 0x00, + 0x80, 0x80, 0x24, 0x6d, 0xff, 0xf7, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xbb, 0x67, 0xdb, 0xdd, 0x36, 0xd9, + 0x54, 0x60, 0x00, 0xc0, 0x00, 0x92, 0x65, 0x6b, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x4f, 0x7d, 0x96, + 0xd9, 0x6c, 0x36, 0xad, 0xc2, 0x00, 0x60, 0x00, 0xc8, 0xb6, 0x6d, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xc8, 0x76, 0xbb, 0xcb, 0x64, 0x52, 0x02, 0x03, 0x10, 0x00, 0x64, + 0xda, 0xff, 0xfb, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0x5f, 0xd7, 0x4d, 0x33, 0x99, 0xdd, 0x96, 0x04, 0x2c, + 0x1c, 0x40, 0x22, 0xdb, 0xb6, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xdf, 0xb5, 0xed, 0xe6, 0x36, 0x9b, + 0x6c, 0x29, 0xf0, 0x03, 0x00, 0x99, 0x6c, 0xfb, 0xfd, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x7f, 0x35, 0xbb, + 0xec, 0x76, 0x33, 0x91, 0x02, 0x00, 0x00, 0x00, 0x64, 0x67, 0xdf, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, + 0xbf, 0x6f, 0x9b, 0x9d, 0xc9, 0xce, 0x36, 0x49, 0x00, 0x00, 0x00, 0x93, + 0xb1, 0xdd, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0xff, 0x6a, 0x76, 0xbb, 0xdd, 0xd9, 0x64, 0x12, 0x01, + 0x00, 0x40, 0x98, 0xdd, 0x6d, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xdf, 0x66, 0x73, 0x33, 0xbb, + 0x9d, 0x4d, 0x00, 0x00, 0x00, 0x63, 0xe6, 0xf6, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xed, 0xfd, + 0xee, 0xee, 0x36, 0x73, 0x2b, 0x04, 0x00, 0xa0, 0x38, 0x75, 0xbf, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7f, 0xd9, 0xec, 0xce, 0x66, 0x66, 0x66, 0x22, 0x04, 0x00, 0xc6, + 0x99, 0xbb, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5e, 0xb3, 0xdb, 0xb9, 0xcd, 0xc9, 0x88, 0x89, + 0x00, 0x68, 0x31, 0xee, 0xdd, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xbe, 0xbb, 0x9b, 0x3f, + 0xbb, 0x33, 0x23, 0x04, 0x00, 0x8c, 0xf3, 0xee, 0xff, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x67, + 0x76, 0x77, 0xb2, 0x66, 0xce, 0x0c, 0xd1, 0xd6, 0xe3, 0x79, 0xf7, 0xff, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xfd, 0xef, 0xe6, 0xee, 0xce, 0x9c, 0x31, 0x16, 0x00, 0x3c, + 0x9e, 0xfb, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x9f, 0xdb, 0xdc, 0x9d, 0x99, 0x33, 0xc6, + 0xc1, 0xff, 0x8f, 0xe7, 0xbb, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf7, 0xbd, 0xbb, 0x33, + 0x7b, 0xee, 0x18, 0x1e, 0x50, 0xf0, 0xf9, 0xfe, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x7b, + 0xf7, 0x77, 0xf7, 0xe6, 0x9c, 0xe3, 0xf0, 0x4d, 0xff, 0x7c, 0xef, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xdf, 0x76, 0x7f, 0xcf, 0x9e, 0x73, 0x8f, 0x07, 0xff, 0x0b, + 0xdf, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xee, 0xcd, 0xdd, 0x9d, 0x7b, 0xf7, 0x7c, + 0x7a, 0x00, 0xf0, 0xe7, 0xfd, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0xbf, 0xdd, 0x7b, + 0x6b, 0x9e, 0xf3, 0xe1, 0xff, 0xff, 0x7d, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, + 0xb7, 0xbb, 0x7b, 0xee, 0x79, 0x8f, 0x0f, 0xfa, 0x2f, 0xff, 0xf7, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7e, 0xff, 0x77, 0xef, 0xdd, 0x77, 0x7c, 0xfe, 0x02, 0xe8, + 0xcf, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xef, 0xee, 0xdd, 0xb3, 0xcf, 0xf3, + 0xf1, 0xff, 0xff, 0xf9, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfb, 0xff, 0xbf, + 0xef, 0xbe, 0xcf, 0x8f, 0xfe, 0x5f, 0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xbf, 0xbb, 0xf7, 0xde, 0x79, 0x3e, 0xff, 0x52, 0xd2, 0xdf, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe0, 0xef, 0xef, 0xef, 0x3c, 0xef, 0xf9, 0xf8, 0xff, 0xff, + 0xf7, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xee, 0xdc, 0xf7, 0xfe, 0xe7, + 0x97, 0xfe, 0xff, 0xfe, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, + 0xef, 0xbf, 0x3e, 0xff, 0xda, 0xf6, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xbf, 0xf7, 0xfe, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xde, 0xbd, 0xef, 0xfb, 0xd7, 0xff, 0xbf, + 0xfd, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xf7, 0x7d, 0xbf, + 0xff, 0xd2, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xbf, + 0xef, 0xfb, 0xfd, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xef, 0xbe, 0xf7, 0xef, 0xef, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xdf, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0xfe, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; diff --git a/contrib/ncurses/test/extended_color.c b/contrib/ncurses/test/extended_color.c new file mode 100644 index 00000000..746c0359 --- /dev/null +++ b/contrib/ncurses/test/extended_color.c @@ -0,0 +1,260 @@ +/**************************************************************************** + * Copyright 2018-2020,2022 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: extended_color.c,v 1.20 2022/12/10 22:28:50 tom Exp $ + */ + +#include + +#if USE_EXTENDED_COLOR + +#define SHOW(n) ((n) == ERR ? "ERR" : "OK") + +#if USE_SP_FUNCS +static bool opt_s = FALSE; +#define if_opt_s(a,b) (opt_s ? (a) : (b)) +#else +#define if_opt_s(a,b) (b) +#endif + +static void +failed(const char *name) +{ + printw("...%s failed", name); + getch(); + endwin(); + ExitProgram(EXIT_FAILURE); +} + +static void +do_pair_content(SCREEN *sp, int pair) +{ + int i, f, b; + + (void) sp; + i = if_opt_s(extended_pair_content_sp(sp, pair, &f, &b), + extended_pair_content(0, &f, &b)); + if (i != OK) + failed("pair_content"); + printw("pair %d contains (%d,%d)\n", pair, f, b); + getch(); +} + +static void +do_init_pair(SCREEN *sp, int pair, int fg, int bg) +{ + int i; + + (void) sp; + i = if_opt_s(init_extended_pair_sp(sp, pair, fg, bg), + init_extended_pair(pair, fg, bg)); + if (i != OK) + failed("init_pair"); +} + +static void +do_init_color(SCREEN *sp, int color, int adjust) +{ + int r, g, b; + int i; + + (void) sp; + i = if_opt_s(extended_color_content_sp(sp, color, &r, &g, &b), + extended_color_content(color, &r, &g, &b)); + if (i != OK) + failed("color_content"); + + r = (adjust + 1000 + r) % 1000; + g = (adjust + 1000 + g) % 1000; + b = (adjust + 1000 + b) % 1000; + + i = if_opt_s(init_extended_color_sp(sp, color, r, g, b), + init_extended_color(color, r, g, b)); + if (i != OK) + failed("init_color"); +} + +static void +do_color_set(const char *expected, int pair) +{ + int i = color_set((short) pair, (void *) &pair); + printw("%s (%s)\n", expected, SHOW(i)); + if (i != OK) + failed("color_set"); + getch(); +} + +static void +show_1_rgb(SCREEN *sp, const char *name, int color, int y, int x) +{ + int r, g, b; + int i; + + (void) sp; + i = if_opt_s(extended_color_content_sp(sp, color, &r, &g, &b), + extended_color_content(color, &r, &g, &b)); + wmove(stdscr, y, x); + if (i == OK) { + printw("%-8s %3d/%3d/%3d", name, r, g, b); + } else { + printw("%-8s %s", name, SHOW(i)); + } +} + +static void +show_rgb(SCREEN *sp) +{ + int y, x; + getyx(stdscr, y, x); + show_1_rgb(sp, "RED", COLOR_RED, y + 1, x); + show_1_rgb(sp, "GREEN", COLOR_GREEN, y + 2, x); + show_1_rgb(sp, "BLUE", COLOR_BLUE, y + 3, x); + wmove(stdscr, y, x); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: extended_color" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -s use sp-funcs" + }; + size_t n; + for (n = 0; n < SIZEOF(tbl); ++n) { + fprintf(stderr, "%s\n", tbl[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int i; + SCREEN *sp; + + while ((ch = getopt(argc, argv, OPTS_COMMON "s")) != -1) { + switch (ch) { +#if USE_SP_FUNCS + case 's': + opt_s = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + slk_init(1); + sp = newterm(NULL, stdout, stdin); + cbreak(); + noecho(); + + if (!has_colors()) { + endwin(); + fprintf(stderr, "This demo requires a color terminal\n"); + ExitProgram(EXIT_FAILURE); + } + + start_color(); + + do_pair_content(sp, 0); + + printw("Initializing pair 1 to red/black\n"); + do_init_pair(sp, 1, COLOR_RED, COLOR_BLACK); + do_color_set("RED/BLACK", 1); + + printw("Initializing pair 2 to white/blue\n"); + do_init_pair(sp, 2, COLOR_WHITE, COLOR_BLUE); + do_color_set("WHITE/BLUE", 2); + + printw("Initializing pair 3 to green/black\n"); + do_init_pair(sp, 3, COLOR_GREEN, COLOR_BLACK); + do_color_set("GREEN/BLACK", 3); + + printw("Resetting colors to pair 0\n"); + do_color_set("Default Colors", 0); + + printw("Resetting colors to pair 1\n"); + do_color_set("RED/BLACK", 1); + + printw("Drawing soft-key tabs with pair 2\n"); + slk_attrset(A_BOLD); /* reverse-video is hard to see */ + (void) if_opt_s(extended_slk_color_sp(sp, 2), + extended_slk_color(2)); + for (i = 1; i <= 8; ++i) { + char temp[80]; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "(SLK-%d)", i); + slk_set(i, temp, 0); + } + slk_touch(); + slk_noutrefresh(); + + i = if_opt_s(can_change_color_sp(sp), + can_change_color()); + if (i) { + do_color_set("Default Colors", 0); + printw("Press any key to stop...\n"); + nodelay(stdscr, TRUE); + while (getch() == ERR) { + show_rgb(sp); + do_init_color(sp, COLOR_RED, 1); + do_init_color(sp, COLOR_BLUE, -1); + napms(50); + } + printw("...done"); + nodelay(stdscr, FALSE); + getch(); + } + + endwin(); + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the ncurses extended color/pair functions\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/filter.c b/contrib/ncurses/test/filter.c new file mode 100644 index 00000000..53adf687 --- /dev/null +++ b/contrib/ncurses/test/filter.c @@ -0,0 +1,435 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey 1998 + * + * $Id: filter.c,v 1.39 2024/10/05 19:26:24 tom Exp $ + * + * An example of the 'filter()' function in ncurses, this program prompts + * for commands and executes them (like a command shell). It illustrates + * how ncurses can be used to implement programs that are not full-screen. + * + * Ncurses differs slightly from SVr4 curses. The latter does not flush its + * state when exiting program mode, so the attributes on the command lines of + * this program 'bleed' onto the executed commands. Rather than use the + * reset_shell_mode() and reset_prog_mode() functions, we could invoke endwin() + * and refresh(), but that does not work any better. + */ +#define NEED_KEY_EVENT +#include + +#if HAVE_FILTER + +#include + +static int +show_prompt(int underline, bool clocked) +{ + int limit = COLS; + + move(0, 0); + attrset(A_NORMAL); + clrtoeol(); + attrset(A_BOLD); + addstr("Command: "); + + limit -= getcurx(stdscr); + + if (clocked) { + if (limit >= 3) { + time_t now = time((time_t *) 0); + const struct tm *my = localtime(&now); + char buffer[80]; + int skip, y, x; + int margin; + + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%02d:%02d:%02d", + my->tm_hour, + my->tm_min, + my->tm_sec); + + if (limit > 9) { + skip = 0; + } else if (limit > 6) { + skip = 3; + } else { + skip = 6; + } + /* + * Write the clock message on the right-margin so we can show the + * results of resizing the screen. + */ + getyx(stdscr, y, x); + margin = (int) strlen(buffer) - skip; + limit -= margin; + move(0, COLS - margin); + addstr(buffer); + move(y, x); + } + } + attron(underline); + return limit; +} + +static int +new_command(char *buffer, int length, int underline, bool clocked, bool polled) +{ + int code = OK; + + if (polled) { + bool done = FALSE; + bool first = TRUE; + int y = 0, x = 0; + int n; + int mark = 0; + int used = 0; + const int gap = 2; + + timeout(20); /* no one types 50CPS... */ + while (!done) { + int limit; + int ch = getch(); + + buffer[used] = '\0'; + + limit = show_prompt(underline, clocked); + if (first) { + getyx(stdscr, y, x); + first = FALSE; + } else { + int left = 0; + + /* + * if the screen is too narrow to show the whole buffer, + * shift the editing point left/right as needed. + */ + move(y, x); + if ((used + gap) > limit) { + while ((mark - left + gap) > limit) { + left += limit / 2; + } + } + printw("%.*s", limit, buffer + left); + move(y, x + mark - left); + } + + switch (ch) { + case ERR: + continue; + case '\004': + code = ERR; + done = TRUE; + break; + case KEY_ENTER: + case '\n': + done = TRUE; + break; + case KEY_BACKSPACE: + case '\b': + if (used) { + if (mark < used) { + /* getnstr does not do this */ + if (mark > 0) { + --mark; + for (n = mark; n < used; ++n) { + buffer[n] = buffer[n + 1]; + } + } else { + flash(); + } + } else { + /* getnstr does this */ + mark = --used; + buffer[used] = '\0'; + } + } else { + flash(); + } + break; + /* + * Unlike getnstr, this function can move the cursor into the + * middle of the buffer and insert/delete at that point. + */ + case KEY_HOME: + mark = 0; + break; + case KEY_END: + mark = used; + break; + case KEY_LEFT: + if (mark > 0) { + mark--; + } else { + flash(); + } + break; + case KEY_RIGHT: + if (mark < used) { + mark++; + } else { + flash(); + } + break; +#ifdef KEY_EVENT + case KEY_EVENT: + continue; +#endif +#ifdef KEY_RESIZE + case KEY_RESIZE: + /* + * Unlike getnstr, this function "knows" what the whole screen + * is supposed to look like, and can handle resize events. + */ + continue; +#endif + case '\t': + ch = ' '; + /* FALLTHRU */ + default: + if (ch >= KEY_MIN) { + flash(); + continue; + } + if (mark < used) { + /* getnstr does not do this... */ + for (n = used + 1; n > mark; --n) { + buffer[n] = buffer[n - 1]; + } + buffer[mark] = (char) ch; + used++; + mark++; + } else { + /* getnstr does this part */ + buffer[used] = (char) ch; + mark = ++used; + } + break; + } + } + } else { + show_prompt(underline, clocked); + + code = getnstr(buffer, length); + /* + * If this returns anything except ERR/OK, it would be one of ncurses's + * extensions. Fill the buffer with something harmless that the shell + * will execute as a comment. + */ +#ifdef KEY_EVENT + if (code == KEY_EVENT) + _nc_STRCPY(buffer, "# event!", length); +#endif +#ifdef KEY_RESIZE + if (code == KEY_RESIZE) { + _nc_STRCPY(buffer, "# resize!", length); + getch(); + } +#endif + } + attroff(underline); + attroff(A_BOLD); + refresh(); + + return code; +} + +#ifdef NCURSES_VERSION +/* + * Cancel xterm's alternate-screen mode (from dialog -TD) + */ +#define isprivate(s) ((s) != 0 && strstr(s, "\033[?") != 0) +static void +cancel_altscreen(void) +{ + if (isatty(fileno(stdout)) + && key_mouse != 0 /* xterm and kindred */ + && isprivate(enter_ca_mode) + && isprivate(exit_ca_mode)) { + /* + * initscr() or newterm() already wrote enter_ca_mode as a side effect + * of initializing the screen. It would be nice to not even do that, + * but we do not really have access to the correct copy of the + * terminfo description until those functions have been invoked. + */ + (void) refresh(); + (void) putp(exit_ca_mode); + (void) fflush(stdout); + /* + * Prevent ncurses from switching "back" to the normal screen when + * exiting from this program. That would move the cursor to the + * original location saved in xterm. Normally curses sets the cursor + * position to the first line after the display, but the alternate + * screen switching is done after that point. + * + * Cancelling the strings altogether also works around the buggy + * implementation of alternate-screen in rxvt, etc., which clear more + * of the display than they should. + */ + enter_ca_mode = 0; + exit_ca_mode = 0; + } +} +#endif + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: filter [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#ifdef NCURSES_VERSION + ," -a suppress xterm alternate-screen by amending smcup/rmcup" +#endif + ," -c show current time on prompt line with \"Command\"" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + ," -i use initscr() rather than newterm()" + ," -p poll for individual characters rather than using getnstr" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + char buffer[80]; + int underline; +#ifdef NCURSES_VERSION + bool a_option = FALSE; +#endif + bool c_option = FALSE; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + bool i_option = FALSE; + bool p_option = FALSE; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "adcip")) != -1) { + switch (ch) { +#ifdef NCURSES_VERSION + case 'a': + a_option = TRUE; + break; +#endif + case 'c': + c_option = TRUE; + break; +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case 'i': + i_option = TRUE; + break; + case 'p': + p_option = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + printf("starting filter program using %s...\n", + i_option ? "initscr" : "newterm"); + filter(); + if (i_option) { + initscr(); + } else { + if (newterm((char *) 0, stdout, stdin) == 0) { + fprintf(stderr, "cannot initialize terminal\n"); + ExitProgram(EXIT_FAILURE); + } + } +#ifdef NCURSES_VERSION + if (a_option) { + cancel_altscreen(); + } +#endif + cbreak(); + keypad(stdscr, TRUE); + + if (has_colors()) { + int background = COLOR_BLACK; + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() != ERR)) + background = -1; +#endif + init_pair(1, COLOR_CYAN, (short) background); + underline = COLOR_PAIR(1); + } else { + underline = A_UNDERLINE; + } + + for (;;) { + int code = new_command(buffer, sizeof(buffer) - 1, + underline, c_option, p_option); + if (code == ERR || *buffer == '\0') + break; + reset_shell_mode(); + printf("\n"); + fflush(stdout); + IGNORE_RC(system(buffer)); + reset_prog_mode(); + touchwin(stdscr); + erase(); + refresh(); + } + clear(); + refresh(); + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the filter function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_FILTER */ diff --git a/contrib/ncurses/test/firework.c b/contrib/ncurses/test/firework.c new file mode 100644 index 00000000..54e4036c --- /dev/null +++ b/contrib/ncurses/test/firework.c @@ -0,0 +1,241 @@ +/**************************************************************************** + * Copyright 2019-2020,2022 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: firework.c,v 1.40 2022/12/04 00:40:11 tom Exp $ + */ +#include + +#include + +static short my_bg = COLOR_BLACK; + +static void +cleanup(void) +{ + stop_curses(); +} + +static void +onsig(int n GCC_UNUSED) +{ + cleanup(); + ExitProgram(EXIT_FAILURE); +} + +static void +showit(void) +{ + int ch; + napms(120); + if ((ch = getch()) != ERR) { +#ifdef KEY_RESIZE + if (ch == KEY_RESIZE) { + erase(); + } else +#endif + if (ch == 'q') { + cleanup(); + ExitProgram(EXIT_SUCCESS); + } else if (ch == 's') { + nodelay(stdscr, FALSE); + } else if (ch == ' ') { + nodelay(stdscr, TRUE); + } + } +} + +static short +get_colour(chtype *bold) +{ + int attr; + attr = (rand() % 16) + 1; + + *bold = A_NORMAL; + if (attr > 8) { + *bold = A_BOLD; + attr &= 7; + } + return (short) (attr); +} + +static +void +explode(int row, int col) +{ + chtype bold; + erase(); + MvPrintw(row, col, "-"); + showit(); + + init_pair(1, get_colour(&bold), my_bg); + (void) attrset(AttrArg(COLOR_PAIR(1), bold)); + MvPrintw(row - 1, col - 1, " - "); + MvPrintw(row + 0, col - 1, "-+-"); + MvPrintw(row + 1, col - 1, " - "); + showit(); + + init_pair(1, get_colour(&bold), my_bg); + (void) attrset(AttrArg(COLOR_PAIR(1), bold)); + MvPrintw(row - 2, col - 2, " --- "); + MvPrintw(row - 1, col - 2, "-+++-"); + MvPrintw(row + 0, col - 2, "-+#+-"); + MvPrintw(row + 1, col - 2, "-+++-"); + MvPrintw(row + 2, col - 2, " --- "); + showit(); + + init_pair(1, get_colour(&bold), my_bg); + (void) attrset(AttrArg(COLOR_PAIR(1), bold)); + MvPrintw(row - 2, col - 2, " +++ "); + MvPrintw(row - 1, col - 2, "++#++"); + MvPrintw(row + 0, col - 2, "+# #+"); + MvPrintw(row + 1, col - 2, "++#++"); + MvPrintw(row + 2, col - 2, " +++ "); + showit(); + + init_pair(1, get_colour(&bold), my_bg); + (void) attrset(AttrArg(COLOR_PAIR(1), bold)); + MvPrintw(row - 2, col - 2, " # "); + MvPrintw(row - 1, col - 2, "## ##"); + MvPrintw(row + 0, col - 2, "# #"); + MvPrintw(row + 1, col - 2, "## ##"); + MvPrintw(row + 2, col - 2, " # "); + showit(); + + init_pair(1, get_colour(&bold), my_bg); + (void) attrset(AttrArg(COLOR_PAIR(1), bold)); + MvPrintw(row - 2, col - 2, " # # "); + MvPrintw(row - 1, col - 2, "# #"); + MvPrintw(row + 0, col - 2, " "); + MvPrintw(row + 1, col - 2, "# #"); + MvPrintw(row + 2, col - 2, " # # "); + showit(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: firework [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors, repeat to use in init_pair" +#endif + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int start, end; + int row, diff; + int flag = 0; + int direction; + unsigned seed; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + + while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + InitAndCatch(initscr(), onsig); + noecho(); + cbreak(); + keypad(stdscr, TRUE); + nodelay(stdscr, TRUE); + + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() == OK)) + my_bg = -1; +#endif + } + curs_set(0); + + seed = (unsigned) time((time_t *) 0); + srand(seed); + for (;;) { + do { + start = rand() % (COLS - 3); + end = rand() % (COLS - 3); + start = (start < 2) ? 2 : start; + end = (end < 2) ? 2 : end; + direction = (start > end) ? -1 : 1; + diff = abs(start - end); + } while (diff < 2 || diff >= LINES - 2); + (void) attrset(AttrArg(0, A_NORMAL)); + for (row = 1; row < diff; row++) { + MvPrintw(LINES - row, start + (row * direction), + (direction < 0) ? "\\" : "/"); + if (flag++) { + showit(); + erase(); + flag = 0; + } + } + if (flag++) { + showit(); + flag = 0; + } + seed = (unsigned) time((time_t *) 0); + srand(seed); + explode(LINES - row, start + (diff * direction)); + erase(); + showit(); + } +} diff --git a/contrib/ncurses/test/firstlast.c b/contrib/ncurses/test/firstlast.c new file mode 100644 index 00000000..c66c2b85 --- /dev/null +++ b/contrib/ncurses/test/firstlast.c @@ -0,0 +1,173 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * This test was written by Alexander V. Lukyanov to demonstrate difference + * between ncurses 4.1 and SVR4 curses + * + * $Id: firstlast.c,v 1.10 2022/12/10 23:31:31 tom Exp $ + */ + +#include + +static void +fill(WINDOW *w, const char *str) +{ + const char *s; + int x0 = -1, y0 = -1; + int x1, y1; + int maxx, maxy, limit; + + getmaxyx(w, maxy, maxx); + wmove(w, 0, 0); + limit = maxy * maxx; + + for (;;) { + for (s = str; *s; s++) { + getyx(w, y1, x1); + if (waddch(w, UChar(*s)) == ERR + || (x1 == x0 && y1 == y0)) { + wmove(w, 0, 0); + return; + } + /* waddch() should return ERR at the lower-right corner */ + if (--limit < 0) { + beep(); + if (*str == '?') + return; + napms(500); + wmove(w, maxy - 1, 0); + str = "?"; + limit = maxx + 1; + } + x0 = x1; + y0 = y1; + } + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: firstlast [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *large, *small; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + initscr(); + noecho(); + + large = newwin(20, 60, 2, 10); + small = newwin(10, 30, 7, 25); + + /* test 1 - addch */ + fill(large, "LargeWindow"); + + refresh(); + wrefresh(large); + wrefresh(small); + + MvWAddStr(small, 5, 5, " Test String "); + wrefresh(small); + getch(); + + touchwin(large); + wrefresh(large); + + MvWAddStr(small, 5, 5, " Test <***************> String "); + wrefresh(small); + + /* DIFFERENCE! */ + getch(); + + /* test 2: erase */ + erase(); + refresh(); + getch(); + + /* test 3: clrtoeol */ + werase(small); + wrefresh(small); + touchwin(large); + wrefresh(large); + wmove(small, 5, 0); + waddstr(small, " clrtoeol>"); + wclrtoeol(small); + wrefresh(small); + + /* DIFFERENCE! */ ; + getch(); + + /* test 4: clrtobot */ + werase(small); + wrefresh(small); + touchwin(large); + wrefresh(large); + wmove(small, 5, 3); + waddstr(small, " clrtobot>"); + wclrtobot(small); + wrefresh(small); + + /* DIFFERENCE! */ + getch(); + + endwin(); + + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/foldkeys.c b/contrib/ncurses/test/foldkeys.c new file mode 100644 index 00000000..bb3801e2 --- /dev/null +++ b/contrib/ncurses/test/foldkeys.c @@ -0,0 +1,281 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * Copyright 2006-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey, 2006 + * + * $Id: foldkeys.c,v 1.12 2023/02/25 16:51:01 tom Exp $ + * + * Demonstrate a method for altering key definitions at runtime. + * + * This program reads the key definitions, merging those which have xterm-style + * modifiers into their equivalents which have no modifiers. It does this + * merging only for the keys which are defined in the terminal description. + */ + +#define NEED_TIME_H +#include + +#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS + +#define MY_LOGFILE "demo_foldkeys.log" +#define MY_KEYS (KEY_MAX + 1) + +/* + * Log the most recently-written line to our logfile + */ +static void +log_last_line(WINDOW *win) +{ + FILE *fp; + + if ((fp = fopen(MY_LOGFILE, "a")) != 0) { + char temp[256]; + int y, x, n; + int need = sizeof(temp) - 1; + if (need > COLS) + need = COLS; + getyx(win, y, x); + wmove(win, y - 1, 0); + n = winnstr(win, temp, need); + while (n-- > 0) { + if (isspace(UChar(temp[n]))) + temp[n] = '\0'; + else + break; + } + wmove(win, y, x); + fprintf(fp, "%s\n", temp); + fclose(fp); + } +} + +/* + * ncurses has no API for telling what the actual last key-code is. That is + * a secret because the codes past KEY_MAX are computed at run-time and may + * differ depending on the previous calls to newterm(), etc. It is unlikely + * that one could have more than a thousand key definitions... + */ +#define MAX_KEYS 2000 + +typedef struct { + const char *name; + const char *value; + int code; + int state; +} KeyInfo; + +static void +demo_foldkeys(void) +{ + KeyInfo info[MAX_KEYS]; + int info_len = 0; + int merged = 0; + int code; + int j, k; + + /* + * Tell ncurses that we want to use function keys. That will make it add + * any user-defined keys that appear in the terminfo. + */ + keypad(stdscr, TRUE); + + /* + * List the predefined keys using the strnames[] array. + */ + for (code = 0; code < STRCOUNT; ++code) { + NCURSES_CONST char *name = strnames[code]; + NCURSES_CONST char *value = tigetstr(name); + if (value != 0 && value != (NCURSES_CONST char *) -1) { + info[info_len].name = strnames[code]; + info[info_len].code = key_defined(value); + info[info_len].value = value; + info[info_len].state = 0; + if (info[info_len].code > 0) + ++info_len; + } + } + + /* + * We can get the names for user-defined keys from keyname(). It returns + * a name like KEY_foo for the predefined keys, which tigetstr() does not + * understand. + */ + for (code = KEY_MAX; code < MAX_KEYS; ++code) { + NCURSES_CONST char *name = keyname(code); + if (name != 0) { + info[info_len].name = name; + info[info_len].code = code; + info[info_len].value = tigetstr(name); + info[info_len].state = 0; + ++info_len; + } + } + printw("Initially %d key definitions\n", info_len); + + /* + * Look for keys that have xterm-style modifiers. + */ + for (j = 0; j < info_len; ++j) { + int first, second; + char final[2]; + char *value; + size_t need; + + if (info[j].state == 0 + && sscanf(info[j].value, + "\033[%d;%d%c", + &first, + &second, + final) == 3 + && *final != ';' + && (need = strlen(info[j].value)) != 0 + && (value = strdup(info[j].value)) != 0) { + (void) need; /* _nc_SLIMIT is normally nothing */ + _nc_SPRINTF(value, _nc_SLIMIT(need) "\033[%d%c", first, *final); + for (k = 0; k < info_len; ++k) { + if (info[k].state == 0 + && !strcmp(info[k].value, value)) { + info[j].state = 1; + break; + } + } + if (info[j].state == 0) { + _nc_SPRINTF(value, _nc_SLIMIT(need) "\033O%c", *final); + for (k = 0; k < info_len; ++k) { + if (info[k].state == 0 + && !strcmp(info[k].value, value)) { + info[j].state = 1; + break; + } + } + } + if (info[j].state == 1) { + if ((define_key(info[j].value, info[k].code)) != ERR) { + printw("map %s to %s\n", info[j].value, info[k].value); + keyok(info[j].code, FALSE); + ++merged; + } else { + printw("? cannot define_key %d:%s\n", j, info[j].value); + } + } else { + printw("? cannot merge %d:%s\n", j, info[j].value); + } + free(value); + } + } + printw("Merged to %d key definitions\n", info_len - merged); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: foldkeys [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + TimeType previous; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + if (newterm(0, stdout, stdin) == 0) { + fprintf(stderr, "Cannot initialize terminal\n"); + ExitProgram(EXIT_FAILURE); + } + + unlink(MY_LOGFILE); + + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + scrollok(stdscr, TRUE); + keypad(stdscr, TRUE); + move(0, 0); + + demo_foldkeys(); + + GetClockTime(&previous); + + while ((ch = getch()) != ERR) { + bool escaped = (ch >= MY_KEYS); + const char *name = keyname(escaped ? (ch - MY_KEYS) : ch); + TimeType current; + + GetClockTime(¤t); + printw("%6.03f ", ElapsedSeconds(&previous, ¤t)); + previous = current; + + printw("Keycode %d, name %s%s\n", + ch, + escaped ? "ESC-" : "", + name != 0 ? name : ""); + log_last_line(stdscr); + clrtoeol(); + if (ch == 'q') + break; + } + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/form_driver_w.c b/contrib/ncurses/test/form_driver_w.c new file mode 100644 index 00000000..ff60f45c --- /dev/null +++ b/contrib/ncurses/test/form_driver_w.c @@ -0,0 +1,208 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2013-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Gaute Hope, 2013 * + ****************************************************************************/ + +/* + * $Id: form_driver_w.c,v 1.18 2024/10/06 23:13:40 tom Exp $ + * + * Test form_driver_w (int, int, wchar_t), a wide char aware + * replacement of form_driver. + */ + +#include +#include + +#if USE_WIDEC_SUPPORT && USE_LIBFORM && (defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH >= 20131207) + +#include + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: form_driver_w [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " ^D,^Q,ESC - quit program", + " , - move to next field", + " , - move to previous field", + 0 + }; + +#define NUM_FIELDS 3 +#define MyRow(n) (4 + (n) * 2) +#define MyCol(n) 10 + FIELD *field[NUM_FIELDS + 1]; + FORM *my_form; + bool done = FALSE; + int n; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + /* Initialize curses */ + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + + /* Initialize the fields */ + for (n = 0; n < NUM_FIELDS; ++n) { + field[n] = new_field(1, 10, MyRow(n), 18, 0, 0); + set_field_back(field[n], A_UNDERLINE); + /* Print a line for the option */ + field_opts_off(field[n], O_AUTOSKIP); + /* Don't go to next field when this is filled */ + } + field[n] = NULL; + + /* Create the form and post it */ + my_form = new_form(field); + post_form(my_form); + refresh(); + + for (n = 0; n < NUM_FIELDS; ++n) { + mvprintw(MyRow(n), MyCol(n), "Value %d:", n + 1); + } + + /* Loop through to get user requests */ + while (!done) { + wint_t c2; + int ret = get_wch(&c2); + + mvprintw(MyRow(NUM_FIELDS), + MyCol(NUM_FIELDS), + "Got %d (%#x), type: %s", + (int) c2, + (int) c2, + (ret == KEY_CODE_YES) + ? "KEY_CODE_YES" + : ((ret == OK) + ? "OK" + : ((ret == ERR) + ? "ERR" + : "?"))); + clrtoeol(); + + switch (ret) { + case KEY_CODE_YES: + switch (c2) { + case KEY_DOWN: + /* Go to next field */ + form_driver_w(my_form, KEY_CODE_YES, REQ_NEXT_FIELD); + /* Go to the end of the present buffer */ + /* Leaves nicely at the last character */ + form_driver_w(my_form, KEY_CODE_YES, REQ_END_LINE); + break; + case KEY_BTAB: + case KEY_UP: + /* Go to previous field */ + form_driver_w(my_form, KEY_CODE_YES, REQ_PREV_FIELD); + form_driver_w(my_form, KEY_CODE_YES, REQ_END_LINE); + break; + default: + break; + } + break; + case OK: + switch (c2) { + case CTRL('D'): + case QUIT: + case ESCAPE: + done = TRUE; + break; + case '\t': + form_driver_w(my_form, KEY_CODE_YES, REQ_NEXT_FIELD); + form_driver_w(my_form, KEY_CODE_YES, REQ_END_LINE); + break; + case HELP_KEY_1: + popup_msg(form_win(my_form), help); + break; + default: + form_driver_w(my_form, OK, (wchar_t) c2); + break; + } + break; + } + } + + /* Un post form and free the memory */ + unpost_form(my_form); + free_form(my_form); + for (n = 0; n < NUM_FIELDS; ++n) { + free_field(field[n]); + } + + endwin(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the wide-ncurses and forms library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* USE_WIDEC_SUPPORT */ diff --git a/contrib/ncurses/test/gdc.6 b/contrib/ncurses/test/gdc.6 new file mode 100644 index 00000000..700687e6 --- /dev/null +++ b/contrib/ncurses/test/gdc.6 @@ -0,0 +1,106 @@ +.\"*************************************************************************** +.\" Copyright 2020,2024 Thomas E. Dickey * +.\" Copyright 1998-2006,2017 Free Software Foundation, Inc. * +.\" * +.\" Permission is hereby granted, free of charge, to any person obtaining a * +.\" copy of this software and associated documentation files (the * +.\" "Software"), to deal in the Software without restriction, including * +.\" without limitation the rights to use, copy, modify, merge, publish, * +.\" distribute, distribute with modifications, sublicense, and/or sell * +.\" copies of the Software, and to permit persons to whom the Software is * +.\" furnished to do so, subject to the following conditions: * +.\" * +.\" The above copyright notice and this permission notice shall be included * +.\" in all copies or substantial portions of the Software. * +.\" * +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * +.\" IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * +.\" DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * +.\" OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * +.\" THE USE OR OTHER DEALINGS IN THE SOFTWARE. * +.\" * +.\" Except as contained in this notice, the name(s) of the above copyright * +.\" holders shall not be used in advertising or otherwise to promote the * +.\" sale, use or other dealings in this Software without prior written * +.\" authorization. * +.\"*************************************************************************** +.\" +.\" $Id: gdc.6,v 1.10 2024/06/22 21:31:03 tom Exp $ +.TH GDC 6 2024-06-15 ncurses-examples Games +.ie \n(.g \{\ +.ds `` \(lq +.ds '' \(rq +.\} +.el \{\ +.ie t .ds `` `` +.el .ds `` "" +.ie t .ds '' '' +.el .ds '' "" +.\} +.SH NAME +gdc \- +grand digital clock using +.I curses +.SH SYNOPSIS +.B gdc +.RB [ \-dns ] +.RB [ \-t +.IB hh : mm : ss\c +] +.RI [ count ] +.SH DESCRIPTION +.I gdc +uses +.I curses +to display a clock on the terminal. +It constructs the digits from reverse-video blank characters. +If the terminal type supports color, +the digits are drawn in red. +Make the clock stop, +pause, +or resume by typing \*(``q\*('', +\*(``s\*('', +or space, +respectively. +.PP +Given a numeric operand, +the clock +stops after +.I count +seconds. +Normally, +.I gdc +runs \*(``forever\*('' +(at least 2 billion seconds). +.SH OPTIONS +.TP +.B \-d +uses the terminal's default background color. +.TP +.B \-n +reads input from +.IR \%/dev/null , +making +.I gdc +ignore the stop and pause commands. +You can still stop it with a terminal interrupt. +.TP +.B \-s +scrolls the digits up as they change. +When running on a fast display, +the program breaks up the scrolling into sub-second redraws, +making the operation appear smooth. +.TP +.BR \-t \ \c +.IB hh : mm : ss +uses the specified time instead of the current time. +.SH AUTHORS +Amos Shapir, +John Lupien +(modifications for +.IR curses ), +Thomas Dickey +(improvements for +.IR \%ncurses ) diff --git a/contrib/ncurses/test/gdc.c b/contrib/ncurses/test/gdc.c new file mode 100644 index 00000000..fbf97ba3 --- /dev/null +++ b/contrib/ncurses/test/gdc.c @@ -0,0 +1,490 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * Grand digital clock for curses compatible terminals + * Usage: gdc [-s] [-t hh:mm:ss] [n] -- run for n seconds (default infinity) + * Flags: -s: scroll + * + * modified 10-18-89 for curses (jrl) + * 10-18-89 added signal handling + * + * $Id: gdc.c,v 1.62 2024/10/06 20:08:59 tom Exp $ + */ + +#include + +#include + +#define YBASE 10 +#define XBASE 10 +#define XLENGTH 54 +#define YDEPTH 5 + +#define PAIR_DIGITS 1 +#define PAIR_OTHERS 2 +#define PAIR_FRAMES 3 + +static short disp[11] = +{ + 075557, 011111, 071747, 071717, 055711, + 074717, 074757, 071111, 075757, 075717, 002020 +}; +static long older[6], next[6], newer[6], mask; + +static int sigtermed = 0; +static bool redirected = FALSE; +static bool hascolor = FALSE; +static bool hascustomtime = FALSE; + +static void +sighndl(int signo) +{ + signal(signo, sighndl); + sigtermed = signo; + if (redirected) { + stop_curses(); + ExitProgram(EXIT_FAILURE); + } +} + +static void +check_term(void) +{ + if (sigtermed) { + (void) standend(); + stop_curses(); + fprintf(stderr, "gdc terminated by signal %d\n", sigtermed); + ExitProgram(EXIT_FAILURE); + } +} + +static void +drawbox(bool scrolling) +{ + chtype bottom[XLENGTH + 1]; + + if (hascolor) + (void) attrset(AttrArg(COLOR_PAIR(PAIR_FRAMES), 0)); + + MvAddCh(YBASE - 1, XBASE - 1, ACS_ULCORNER); + hline(ACS_HLINE, XLENGTH); + MvAddCh(YBASE - 1, XBASE + XLENGTH, ACS_URCORNER); + + MvAddCh(YBASE + YDEPTH, XBASE - 1, ACS_LLCORNER); + if ((mvinchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH)) != ERR) { + int n; + for (n = 0; n < XLENGTH; n++) { + if (!scrolling) + bottom[n] &= ~A_COLOR; + bottom[n] = ACS_HLINE | (bottom[n] & (A_ATTRIBUTES | A_COLOR)); + } + (void) mvaddchnstr(YBASE + YDEPTH, XBASE, bottom, XLENGTH); + } + MvAddCh(YBASE + YDEPTH, XBASE + XLENGTH, ACS_LRCORNER); + + move(YBASE, XBASE - 1); + vline(ACS_VLINE, YDEPTH); + + move(YBASE, XBASE + XLENGTH); + vline(ACS_VLINE, YDEPTH); + + if (hascolor) + (void) attrset(AttrArg(COLOR_PAIR(PAIR_OTHERS), 0)); +} + +static void +standt(int on) +{ + if (on) { + if (hascolor) { + attron(COLOR_PAIR(PAIR_DIGITS)); + } else { + attron(A_STANDOUT); + } + } else { + if (hascolor) { + attron(COLOR_PAIR(PAIR_OTHERS)); + } else { + attroff(A_STANDOUT); + } + } +} + +static void +set(int t, int n) +{ + int i, m; + + m = 7 << n; + for (i = 0; i < 5; i++) { + next[i] |= ((disp[t] >> ((4 - i) * 3)) & 07) << n; + mask |= (next[i] ^ older[i]) & m; + } + if (mask & m) + mask |= m; +} + +static GCC_NORETURN void +usage(int ok) +{ + static const char *msg[] = + { + "usage: gdc [-dns] -[t HH:MM:SS] [COUNT]" + ,"" + ,"Display a digital clock, running indefinitely or for COUNT seconds." + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d uses the terminal's default background color" +#endif + ," -n reads input from /dev/null" + ," -s scrolls each digit into place" + ," -t TIME specify starting time as hh:mm:ss (default is ``now'')" + }; + unsigned j; + for (j = 0; j < SIZEOF(msg); j++) + fprintf(stderr, "%s\n", msg[j]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} + +static time_t +parse_time(const char *value) +{ + int hh, mm, ss; + int check; + time_t result; + char c = 0; + NCURSES_CONST struct tm *tm; + + switch (sscanf(value, "%d:%d:%d%c", &hh, &mm, &ss, &c)) { + default: + usage(FALSE); + /* NOTREACHED */ + case 1: + if (strspn(value, "0123456789") >= 2) { + switch (sscanf(value, "%02d%02d%02d%c", &hh, &mm, &ss, &c)) { + default: + usage(FALSE); + /* NOTREACHED */ + case 1: + mm = 0; + /* FALLTHRU */ + case 2: + ss = 0; + /* FALLTHRU */ + case 3: + break; + } + break; + } else { + mm = 0; + } + /* FALLTHRU */ + case 2: + ss = 0; + /* FALLTHRU */ + case 3: + break; + } + + if ((hh < 0) || (hh >= 24) || + (mm < 0) || (mm >= 60) || + (ss < 0) || (ss >= 60)) { + usage(FALSE); + } + + /* adjust so that the localtime in the main loop will give usable time */ + result = (hh * 3600) + ((mm * 60) + ss); + for (check = 0; check < 24; ++check) { + tm = localtime(&result); + if (tm->tm_hour == hh) + break; + result += 3600; + } + + if (tm->tm_hour != hh) { + fprintf(stderr, "Cannot find local time for %s!\n", value); + usage(FALSE); + } + return result; +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + time_t now; + NCURSES_CONST struct tm *tm; + long t, a; + int i, j, s, k, ch; + int count = 0; + FILE *ofp = stdout; + FILE *ifp = stdin; + bool smooth = FALSE; + bool stages = FALSE; + time_t starts = 0; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "dnst:")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case 'n': + ifp = fopen("/dev/null", "r"); + redirected = TRUE; + break; + case 's': + smooth = TRUE; + break; + case 't': + hascustomtime = TRUE; + starts = parse_time(optarg); + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) { + count = atoi(argv[optind++]); + assert(count >= 0); + if (optind < argc) + usage(FALSE); + } + + InitAndCatch({ + if (redirected) { + NCURSES_CONST char *name = getenv("TERM"); + if (name == 0 + || newterm(name, ofp, ifp) == 0) { + fprintf(stderr, "cannot open terminal\n"); + ExitProgram(EXIT_FAILURE); + } + } else { + initscr(); + } + } + ,sighndl); + + cbreak(); + noecho(); + nodelay(stdscr, 1); + curs_set(0); + + hascolor = has_colors(); + + if (hascolor) { + short bg = COLOR_BLACK; + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() == OK)) + bg = -1; +#endif + init_pair(PAIR_DIGITS, COLOR_BLACK, COLOR_RED); + init_pair(PAIR_OTHERS, COLOR_RED, bg); + init_pair(PAIR_FRAMES, COLOR_WHITE, bg); + (void) attrset(AttrArg(COLOR_PAIR(PAIR_OTHERS), 0)); + } + + restart: + for (j = 0; j < 5; j++) + older[j] = newer[j] = next[j] = 0; + + clear(); + drawbox(FALSE); + + do { + char buf[40]; + + if (starts != 0) { + now = ++starts; + } else { + time(&now); + } + tm = localtime(&now); + + mask = 0; + set(tm->tm_sec % 10, 0); + set(tm->tm_sec / 10, 4); + set(tm->tm_min % 10, 10); + set(tm->tm_min / 10, 14); + set(tm->tm_hour % 10, 20); + set(tm->tm_hour / 10, 24); + set(10, 7); + set(10, 17); + + for (k = 0; k < 6; k++) { + if (smooth) { + for (i = 0; i < 5; i++) + newer[i] = (newer[i] & ~mask) | (newer[i + 1] & mask); + newer[5] = (newer[5] & ~mask) | (next[k] & mask); + } else { + newer[k] = (newer[k] & ~mask) | (next[k] & mask); + } + next[k] = 0; + for (s = 1; s >= 0; s--) { + standt(s); + for (i = 0; i < 6; i++) { + if ((a = (newer[i] ^ older[i]) & (s ? newer : older)[i]) + != 0) { + for (j = 0, t = 1 << 26; t; t >>= 1, j++) { + if (a & t) { + if (!(a & (t << 1))) { + move(YBASE + i, XBASE + 2 * j); + } + addstr(" "); + } + } + } + if (!s) { + older[i] = newer[i]; + } + } + if (!s) { + if (smooth) + drawbox(TRUE); + refresh(); + /* + * If we're scrolling, space out the refreshes to fake + * movement. That's 7 frames, or 6 intervals, which would + * be 166 msec if we spread it out over a second. It looks + * better (but will work on a slow terminal, e.g., less + * than 9600bd) to squeeze that into a half-second, and use + * half of 170 msec to ensure that the program doesn't eat + * a lot of time when asking what time it is, at the top of + * this loop -T.Dickey + */ + if (smooth) + napms(85); + if (stages) { + stages = FALSE; + switch (wgetch(stdscr)) { + case 'q': + count = 1; + break; + case 'S': + stages = TRUE; + /* FALLTHRU */ + case 's': + nodelay(stdscr, FALSE); + break; + case ' ': + nodelay(stdscr, TRUE); + break; +#ifdef KEY_RESIZE + case KEY_RESIZE: +#endif + case '?': + goto restart; + case ERR: + check_term(); + /* FALLTHRU */ + default: + continue; + } + } + } + } + } + + if (!hascustomtime) { + /* this depends on the detailed format of ctime(3) */ + _nc_STRNCPY(buf, ctime(&now), (size_t) 30); + { + char *d2 = buf + 10; + NCURSES_CONST char *s2 = buf + 19; + while ((*d2++ = *s2++) != '\0') ; + } + MvAddStr(16, 30, buf); + } + + move(6, 0); + drawbox(FALSE); + refresh(); + + /* + * If we're not smooth-scrolling, wait 1000 msec (1 sec). Use napms() + * rather than sleep() because the latter does odd things on some + * systems, e.g., suspending output as well. + */ + if (smooth) + napms(500); + else + napms(1000); + + /* + * This is a safe way to check if we're interrupted - making the signal + * handler set a flag that we can check. Since we're running + * nodelay(), the wgetch() call returns immediately, and in particular + * will return an error if interrupted. This works only if we can + * read from the input, of course. + */ + stages = FALSE; + switch (wgetch(stdscr)) { + case 'q': + count = 1; + break; + case 'S': + stages = TRUE; + /* FALLTHRU */ + case 's': + nodelay(stdscr, FALSE); + break; + case ' ': + nodelay(stdscr, TRUE); + break; +#ifdef KEY_RESIZE + case KEY_RESIZE: +#endif + case '?': + goto restart; + case ERR: + check_term(); + /* FALLTHRU */ + default: + continue; + } + } while (--count); + (void) standend(); + stop_curses(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/hanoi.c b/contrib/ncurses/test/hanoi.c new file mode 100644 index 00000000..6d92332f --- /dev/null +++ b/contrib/ncurses/test/hanoi.c @@ -0,0 +1,376 @@ +/**************************************************************************** + * Copyright 2019-2021,2022 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * Name: Towers of Hanoi. + * + * Desc: + * This is a playable copy of towers of hanoi. + * Its sole purpose is to demonstrate my Amiga Curses package. + * This program should compile on any system that has Curses. + * 'hanoi' will give a manual game with 7 playing pieces. + * 'hanoi n' will give a manual game with n playing pieces. + * 'hanoi n a' will give an auto solved game with n playing pieces. + * + * Author: Simon J Raybould (sie@fulcrum.bt.co.uk). + * (This version has been slightly modified by the ncurses maintainers.) + * + * Date: 05.Nov.90 + * + * $Id: hanoi.c,v 1.47 2022/12/04 00:40:11 tom Exp $ + */ + +#include +#include + +#define NPEGS 3 /* This is not configurable !! */ +#define MINTILES 3 +#define MAXTILES 9 +#define DEFAULTTILES 7 +#define TOPLINE 6 +#define BASELINE 16 +#define STATUSLINE (LINES-3) +#define LEFTPEG 19 +#define MIDPEG 39 +#define RIGHTPEG 59 + +#define LENTOIND(x) (((int)(x)-1)/2) +#define OTHER(a,b) (3-((a)+(b))) + +struct Peg { + size_t Length[MAXTILES]; + int Count; +}; + +static struct Peg Pegs[NPEGS]; +static int PegPos[] = +{ + LEFTPEG, + MIDPEG, + RIGHTPEG +}; +static short TileColour[] = +{ + COLOR_GREEN, /* Length 3 */ + COLOR_MAGENTA, /* Length 5 */ + COLOR_RED, /* Length 7 */ + COLOR_BLUE, /* Length 9 */ + COLOR_CYAN, /* Length 11 */ + COLOR_YELLOW, /* Length 13 */ + COLOR_GREEN, /* Length 15 */ + COLOR_MAGENTA, /* Length 17 */ + COLOR_RED, /* Length 19 */ +}; +static int NTiles = 0; +static int NMoves = 0; +static bool AutoFlag = FALSE; + +static int +InvalidMove(int From, int To) +{ + if (From >= NPEGS) + return TRUE; + if (From < 0) + return TRUE; + if (To >= NPEGS) + return TRUE; + if (To < 0) + return TRUE; + if (From == To) + return TRUE; + if (!Pegs[From].Count) + return TRUE; + if (Pegs[To].Count && + Pegs[From].Length[Pegs[From].Count - 1] > + Pegs[To].Length[Pegs[To].Count - 1]) + return TRUE; + return FALSE; +} + +static void +InitTiles(void) +{ + int Size, SlotNo; + + for (Size = NTiles * 2 + 1, SlotNo = 0; Size >= 3; Size -= 2) + Pegs[0].Length[SlotNo++] = (size_t) Size; + + Pegs[0].Count = NTiles; + Pegs[1].Count = 0; + Pegs[2].Count = 0; +} + +static int +two2n(int n) +{ + int result = 1; + while (n-- > 0) + result *= 2; + return result; +} + +static void +DisplayTiles(void) +{ + int Line, peg, SlotNo; + char TileBuf[BUFSIZ]; + + erase(); + MvAddStr(1, 24, "T O W E R S O F H A N O I"); + MvAddStr(3, 34, "SJR 1990"); + MvPrintw(19, 5, "Moves : %d of %d", NMoves, two2n(NTiles) - 1); + (void) attrset(A_REVERSE); + MvAddStr(BASELINE, 8, + " "); + + for (Line = TOPLINE; Line < BASELINE; Line++) { + MvAddCh(Line, LEFTPEG, ' '); + MvAddCh(Line, MIDPEG, ' '); + MvAddCh(Line, RIGHTPEG, ' '); + } + MvAddCh(BASELINE, LEFTPEG, '1'); + MvAddCh(BASELINE, MIDPEG, '2'); + MvAddCh(BASELINE, RIGHTPEG, '3'); + (void) attrset(A_NORMAL); + + /* Draw tiles */ + for (peg = 0; peg < NPEGS; peg++) { + for (SlotNo = 0; SlotNo < Pegs[peg].Count; SlotNo++) { + size_t len = Pegs[peg].Length[SlotNo]; + if (len < sizeof(TileBuf) - 1 && len < (size_t) PegPos[peg]) { + memset(TileBuf, ' ', len); + TileBuf[len] = '\0'; + if (has_colors()) + (void) attrset(AttrArg(COLOR_PAIR(LENTOIND(len)), 0)); + else + (void) attrset(A_REVERSE); + MvAddStr(BASELINE - (SlotNo + 1), + (PegPos[peg] - (int) len / 2), + TileBuf); + } + } + } + (void) attrset(A_NORMAL); + refresh(); +} + +static int +GetMove(int *From, int *To) +{ + MvAddStr(STATUSLINE, 0, "Next move ('q' to quit) from "); + clrtoeol(); + refresh(); + if ((*From = getch()) == 'q') + return TRUE; + *From -= ('0' + 1); + addstr(" to "); + clrtoeol(); + refresh(); + + if ((*To = getch()) == 'q') + return TRUE; + *To -= ('0' + 1); + refresh(); + if (!AutoFlag) + napms(500); + + move(STATUSLINE, 0); + clrtoeol(); + refresh(); + return FALSE; +} + +static void +MakeMove(int From, int To) +{ + Pegs[From].Count--; + Pegs[To].Length[Pegs[To].Count] = Pegs[From].Length[Pegs[From].Count]; + Pegs[To].Count++; + NMoves++; + DisplayTiles(); +} + +static void +AutoMove(int From, int To, int Num) +{ + if (Num == 1) { + MakeMove(From, To); + napms(500); + } else { + AutoMove(From, OTHER(From, To), Num - 1); + MakeMove(From, To); + napms(500); + AutoMove(OTHER(From, To), To, Num - 1); + } +} + +static int +Solved(int NumTiles) +{ + int i; + + for (i = 1; i < NPEGS; i++) + if (Pegs[i].Count == NumTiles) + return TRUE; + return FALSE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: hanoi [options] [[] [a]]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + ," -n NUM set number of tiles (positional param is deprecated)" + ," -X solve automatically (positional \"a\" is deprecated)" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char **argv) +{ + int ch, FromCol, ToCol; + +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + + NTiles = DEFAULTTILES; + while ((ch = getopt(argc, argv, OPTS_COMMON "dn:X")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case 'n': + NTiles = atoi(optarg); + break; + case 'X': + AutoFlag = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + setlocale(LC_ALL, ""); + + switch (argc - optind) { + case 2: + if (strcmp(argv[optind + 1], "a")) { + usage(FALSE); + } + AutoFlag = TRUE; + /* FALLTHRU */ + case 1: + NTiles = atoi(argv[optind]); + /* FALLTHRU */ + case 0: + break; + default: + usage(FALSE); + } + + if (NTiles > MAXTILES || NTiles < MINTILES) { + fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES); + usage(FALSE); + } + + initscr(); + if (has_colors()) { + int i; + short bg = COLOR_BLACK; + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() == OK)) + bg = -1; +#endif + for (i = 0; i < 9; i++) + init_pair((short) (i + 1), bg, TileColour[i]); + } + cbreak(); + if (LINES < 24) { + endwin(); + fprintf(stderr, "Min screen length 24 lines\n"); + ExitProgram(EXIT_FAILURE); + } + if (AutoFlag) { + curs_set(0); + leaveok(stdscr, TRUE); /* Attempt to remove cursor */ + } + InitTiles(); + DisplayTiles(); + if (AutoFlag) { + do { + noecho(); + AutoMove(0, 2, NTiles); + } while (!Solved(NTiles)); + sleep(2); + } else { + echo(); + for (;;) { + if (GetMove(&FromCol, &ToCol)) + break; + if (InvalidMove(FromCol, ToCol)) { + MvAddStr(STATUSLINE, 0, "Invalid Move !!"); + refresh(); + beep(); + continue; + } + MakeMove(FromCol, ToCol); + if (Solved(NTiles)) { + MvPrintw(STATUSLINE, 0, + "Well Done !! You did it in %d moves", NMoves); + refresh(); + sleep(5); + break; + } + } + } + stop_curses(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/hashtest.c b/contrib/ncurses/test/hashtest.c new file mode 100644 index 00000000..be79c0e1 --- /dev/null +++ b/contrib/ncurses/test/hashtest.c @@ -0,0 +1,254 @@ +/**************************************************************************** + * Copyright 2019-2020,2022 Thomas E. Dickey * + * Copyright 1998-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * hashtest.c -- test hash mapping + * + * Generate timing statistics for vertical-motion optimization. + * + * $Id: hashtest.c,v 1.39 2022/12/04 00:40:11 tom Exp $ + */ + +#include + +#define LO_CHAR ' ' +#define HI_CHAR '~' + +static bool continuous = FALSE; +static bool reverse_loops = FALSE; +static bool single_step = FALSE; +static bool extend_corner = FALSE; +static int foot_lines = 0; +static int head_lines = 0; + +static void +cleanup(void) +{ + move(LINES - 1, 0); + clrtoeol(); + refresh(); + endwin(); +} + +static void +finish(int sig GCC_UNUSED) +{ + cleanup(); + ExitProgram(EXIT_FAILURE); +} + +static void +genlines(int base) +{ + int i, j; + +#if USE_TRACE + if (base == 'a') + Trace(("Resetting screen")); + else + Trace(("Painting `%c' screen", base)); +#endif + + /* Do this so writes to lower-right corner don't cause a spurious + * scrolling operation. This _shouldn't_ break the scrolling + * optimization, since that's computed in the refresh() call. + */ + scrollok(stdscr, FALSE); + + move(0, 0); + for (i = 0; i < head_lines; i++) + for (j = 0; j < COLS; j++) + AddCh(UChar((j % 8 == 0) ? ('A' + j / 8) : '-')); + + move(head_lines, 0); + for (i = head_lines; i < LINES - foot_lines; i++) { + chtype c = (chtype) ((base - LO_CHAR + i) % (HI_CHAR - LO_CHAR + 1) + + LO_CHAR); + int hi = (extend_corner || (i < LINES - 1)) ? COLS : COLS - 1; + for (j = 0; j < hi; j++) + AddCh(c); + } + + for (i = LINES - foot_lines; i < LINES; i++) { + move(i, 0); + for (j = 0; j < (extend_corner ? COLS : COLS - 1); j++) + AddCh(UChar((j % 8 == 0) ? ('A' + j / 8) : '-')); + } + + scrollok(stdscr, TRUE); + if (single_step) { + move(LINES - 1, 0); + getch(); + } else + refresh(); +} + +static void +one_cycle(int ch) +{ + if (continuous) { + genlines(ch); + } else if (ch != 'a') { + genlines('a'); + genlines(ch); + } +} + +static void +run_test(bool optimized GCC_UNUSED) +{ + char ch; + int lo = continuous ? LO_CHAR : 'a' - LINES; + int hi = continuous ? HI_CHAR : 'a' + LINES; + + if (lo < LO_CHAR) + lo = LO_CHAR; + if (hi > HI_CHAR) + hi = HI_CHAR; + +#if defined(TRACE) || defined(NCURSES_TEST) + if (optimized) { + Trace(("With hash mapping")); + _nc_optimize_enable |= OPTIMIZE_HASHMAP; + } else { + Trace(("Without hash mapping")); + _nc_optimize_enable &= ~OPTIMIZE_HASHMAP; + } +#endif + + if (reverse_loops) + for (ch = (char) hi; ch >= lo; ch--) + one_cycle(ch); + else + for (ch = (char) lo; ch <= hi; ch++) + one_cycle(ch); +} + +static void +usage(int ok) +{ + static const char *const tbl[] = + { + "Usage: hashtest [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -c continuous (don't reset between refresh's)" + ," -F num leave 'num' lines constant for footer" + ," -H num leave 'num' lines constant for header" + ," -l num repeat test 'num' times" + ," -n test the normal optimizer" + ," -o test the hashed optimizer" + ," -r reverse the loops" + ," -s single-step" + ," -x assume lower-right corner extension" + }; + size_t n; + + for (n = 0; n < SIZEOF(tbl); n++) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int test_loops = 1; + int test_normal = FALSE; + int test_optimize = FALSE; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "cF:H:l:norsx")) != -1) { + switch (ch) { + case 'c': + continuous = TRUE; + break; + case 'F': + foot_lines = atoi(optarg); + break; + case 'H': + head_lines = atoi(optarg); + break; + case 'l': + test_loops = atoi(optarg); + assert(test_loops >= 0); + break; + case 'n': + test_normal = TRUE; + break; + case 'o': + test_optimize = TRUE; + break; + case 'r': + reverse_loops = TRUE; + break; + case 's': + single_step = TRUE; + break; + case 'x': + extend_corner = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (!test_normal && !test_optimize) { + test_normal = TRUE; + test_optimize = TRUE; + } +#if USE_TRACE + curses_trace(TRACE_TIMES); +#endif + + InitAndCatch(initscr(), finish); + keypad(stdscr, TRUE); /* enable keyboard mapping */ + (void) nonl(); /* tell curses not to do NL->CR/NL on output */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + scrollok(stdscr, TRUE); + + while (test_loops-- > 0) { + if (test_normal) + run_test(FALSE); + if (test_optimize) + run_test(TRUE); + } + + cleanup(); /* we're done */ + ExitProgram(EXIT_SUCCESS); +} +/* hashtest.c ends here */ diff --git a/contrib/ncurses/test/inch_wide.c b/contrib/ncurses/test/inch_wide.c new file mode 100644 index 00000000..7359a9c5 --- /dev/null +++ b/contrib/ncurses/test/inch_wide.c @@ -0,0 +1,327 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2007-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: inch_wide.c,v 1.14 2024/10/06 23:14:31 tom Exp $ + */ +/* + int in_wch(cchar_t *wcval); + int mvin_wch(int y, int x, cchar_t *wcval); + int mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval); + int win_wch(WINDOW *win, cchar_t *wcval); + int in_wchstr(cchar_t *wchstr); + int in_wchnstr(cchar_t *wchstr, int n); + int win_wchstr(WINDOW *win, cchar_t *wchstr); + int win_wchnstr(WINDOW *win, cchar_t *wchstr, int n); + int mvin_wchstr(int y, int x, cchar_t *wchstr); + int mvin_wchnstr(int y, int x, cchar_t *wchstr, int n); + int mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wchstr); + int mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wchstr, int n); +*/ + +#include +#include + +#if USE_WIDEC_SUPPORT + +#define BASE_Y 7 +#define MAX_COLS 1024 + +static bool +Quit(int ch) +{ + return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +static int +test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) +{ + static NCURSES_CONST char *help[] = + { + "Test input from screen using inch(), etc., in a moveable viewport.", + "", + "Commands:", + " ESC/^Q - quit", + " h,j,k,l (and arrow-keys) - move viewport", + " w - recur to new window", + " for next input file", + 0 + }; + + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int j; + int txt_x = 0, txt_y = 0; + int base_y; + cchar_t ch; + cchar_t text[MAX_COLS]; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((j = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(j)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + while (!Quit(j = mvwgetch(txtwin, txt_y, txt_x))) { + int limit; + + switch (j) { + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) + txt_y++; + else + beep(); + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) + txt_y--; + else + beep(); + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) + txt_x--; + else + beep(); + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) + txt_x++; + else + beep(); + break; + case 'w': + test_inchs(level + 1, argv, chrwin, strwin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + case HELP_KEY_1: + popup_msg(txtwin, help); + break; + default: + beep(); + break; + } + + MvWPrintw(chrwin, 0, 0, "char:"); + wclrtoeol(chrwin); + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + if (win_wch(txtwin, &ch) != ERR) { + if (wadd_wch(chrwin, &ch) != ERR) { + for (j = txt_x + 1; j < getmaxx(txtwin); ++j) { + if (mvwin_wch(txtwin, txt_y, j, &ch) != ERR) { + if (wadd_wch(chrwin, &ch) == ERR) { + break; + } + } else { + break; + } + } + } + } + } else { + move(txt_y, txt_x); + if (in_wch(&ch) != ERR) { + if (wadd_wch(chrwin, &ch) != ERR) { + for (j = txt_x + 1; j < getmaxx(txtwin); ++j) { + if (mvin_wch(txt_y, j, &ch) != ERR) { + if (wadd_wch(chrwin, &ch) == ERR) { + break; + } + } else { + break; + } + } + } + } + } + wnoutrefresh(chrwin); + + MvWPrintw(strwin, 0, 0, "text:"); + wclrtobot(strwin); + + limit = getmaxx(strwin) - 5; + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + if (win_wchstr(txtwin, text) != ERR) { + (void) mvwadd_wchstr(strwin, 0, 5, text); + } + + wmove(txtwin, txt_y, txt_x); + if (win_wchnstr(txtwin, text, limit) != ERR) { + (void) mvwadd_wchstr(strwin, 1, 5, text); + } + + if (mvwin_wchstr(txtwin, txt_y, txt_x, text) != ERR) { + (void) mvwadd_wchstr(strwin, 2, 5, text); + } + + if (mvwin_wchnstr(txtwin, txt_y, txt_x, text, limit) != ERR) { + (void) mvwadd_wchstr(strwin, 3, 5, text); + } + } else { + move(txt_y, txt_x); + if (in_wchstr(text) != ERR) { + (void) mvwadd_wchstr(strwin, 0, 5, text); + } + + move(txt_y, txt_x); + if (in_wchnstr(text, limit) != ERR) { + (void) mvwadd_wchstr(strwin, 1, 5, text); + } + + if (mvin_wchstr(txt_y, txt_x, text) != ERR) { + (void) mvwadd_wchstr(strwin, 2, 5, text); + } + + if (mvin_wchnstr(txt_y, txt_x, text, limit) != ERR) { + (void) mvwadd_wchstr(strwin, 3, 5, text); + } + } + + wnoutrefresh(strwin); + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: inch_wide [options] [file1 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *chrbox; + WINDOW *chrwin; + WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) + usage(FALSE); + + initscr(); + + chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(chrbox, 0, 0); + wnoutrefresh(chrbox); + + chrwin = derwin(chrbox, 1, COLS - 2, 1, 1); + strwin = derwin(chrbox, 4, COLS - 2, 2, 1); + + test_inchs(optind, argv, chrwin, strwin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/inchs.c b/contrib/ncurses/test/inchs.c new file mode 100644 index 00000000..211ca9d6 --- /dev/null +++ b/contrib/ncurses/test/inchs.c @@ -0,0 +1,331 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2007-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: inchs.c,v 1.20 2024/10/06 21:17:54 tom Exp $ + * + * Author: Thomas E Dickey + */ +/* + chtype inch(void); + chtype winch(WINDOW *win); + chtype mvinch(int y, int x); + chtype mvwinch(WINDOW *win, int y, int x); + int inchstr(chtype *chstr); + int inchnstr(chtype *chstr, int n); + int winchstr(WINDOW *win, chtype *chstr); + int winchnstr(WINDOW *win, chtype *chstr, int n); + int mvinchstr(int y, int x, chtype *chstr); + int mvinchnstr(int y, int x, chtype *chstr, int n); + int mvwinchstr(WINDOW *win, int y, int x, chtype *chstr); + int mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n); +*/ + +#include +#include + +#define BASE_Y 7 +#define MAX_COLS 1024 + +static void +failed(const char *s) +{ + int save = errno; + endwin(); + errno = save; + perror(s); + ExitProgram(EXIT_FAILURE); +} + +static bool +Quit(int ch) +{ + return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +static int +test_inchs(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) +{ + static NCURSES_CONST char *help[] = + { + "Test input from screen using inch(), etc., in a moveable viewport.", + "", + "Commands:", + " ESC/^Q - quit", + " h,j,k,l (and arrow-keys) - move viewport", + " w - recur to new window", + " for next input file", + 0 + }; + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int ch, j; + int txt_x = 0, txt_y = 0; + int base_y; + chtype text[MAX_COLS]; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + if (txtwin == 0) + failed("cannot create txtwin"); + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((j = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(j)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + while (!Quit(j = mvwgetch(txtwin, txt_y, txt_x))) { + int limit; + + switch (j) { + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) + txt_y++; + else + beep(); + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) + txt_y--; + else + beep(); + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) + txt_x--; + else + beep(); + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) + txt_x++; + else + beep(); + break; + case 'w': + test_inchs(level + 1, argv, chrwin, strwin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + case HELP_KEY_1: + popup_msg(txtwin, help); + break; + default: + beep(); + break; + } + + MvWPrintw(chrwin, 0, 0, "char:"); + wclrtoeol(chrwin); + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + + if ((ch = (int) winch(txtwin)) != ERR) { + if (waddch(chrwin, (chtype) ch) != ERR) { + for (j = txt_x + 1; j < getmaxx(txtwin); ++j) { + if ((ch = (int) mvwinch(txtwin, txt_y, j)) != ERR) { + if (waddch(chrwin, (chtype) ch) == ERR) { + break; + } + } else { + break; + } + } + } + } + } else { + move(txt_y, txt_x); + + if ((ch = (int) inch()) != ERR) { + if (waddch(chrwin, (chtype) ch) != ERR) { + for (j = txt_x + 1; j < getmaxx(txtwin); ++j) { + if ((ch = (int) mvinch(txt_y, j)) != ERR) { + if (waddch(chrwin, (chtype) ch) == ERR) { + break; + } + } else { + break; + } + } + } + } + } + wnoutrefresh(chrwin); + + MvWPrintw(strwin, 0, 0, "text:"); + wclrtobot(strwin); + + limit = getmaxx(strwin) - 5; + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + if (winchstr(txtwin, text) != ERR) { + MvWAddChStr(strwin, 0, 5, text); + } + + wmove(txtwin, txt_y, txt_x); + if (winchnstr(txtwin, text, limit) != ERR) { + MvWAddChStr(strwin, 1, 5, text); + } + + if (mvwinchstr(txtwin, txt_y, txt_x, text) != ERR) { + MvWAddChStr(strwin, 2, 5, text); + } + + if (mvwinchnstr(txtwin, txt_y, txt_x, text, limit) != ERR) { + MvWAddChStr(strwin, 3, 5, text); + } + } else { + move(txt_y, txt_x); + if (inchstr(text) != ERR) { + MvWAddChStr(strwin, 0, 5, text); + } + + move(txt_y, txt_x); + if (inchnstr(text, limit) != ERR) { + MvWAddChStr(strwin, 1, 5, text); + } + + if (mvinchstr(txt_y, txt_x, text) != ERR) { + MvWAddChStr(strwin, 2, 5, text); + } + + if (mvinchnstr(txt_y, txt_x, text, limit) != ERR) { + MvWAddChStr(strwin, 3, 5, text); + } + } + + wnoutrefresh(strwin); + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: inchs [options] file1 [file2 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *chrbox; + WINDOW *chrwin; + WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) + usage(FALSE); + + initscr(); + + chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(chrbox, 0, 0); + wnoutrefresh(chrbox); + + chrwin = derwin(chrbox, 1, COLS - 2, 1, 1); + strwin = derwin(chrbox, 4, COLS - 2, 2, 1); + + test_inchs(optind, argv, chrwin, strwin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/ins_wide.c b/contrib/ncurses/test/ins_wide.c new file mode 100644 index 00000000..7887f695 --- /dev/null +++ b/contrib/ncurses/test/ins_wide.c @@ -0,0 +1,525 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2002-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: ins_wide.c,v 1.31 2024/10/05 19:26:24 tom Exp $ + * + * Demonstrate the wins_wstr() and wins_wch functions. + * Thomas Dickey - 2002/11/23 + * + * Note: to provide inputs for *ins_wch(), we use setcchar(). A quirk of the + * X/Open definition for that function is that the string contains no + * characters with negative width. Any control character (such as tab) falls + * into that category. So it follows that *ins_wch() cannot render a tab + * character because there is no legal way to construct a cchar_t containing + * one. X/Open does not document this, and it would be logical to assume that + * *ins_wstr() has the same limitation, but it uses a wchar_t string directly, + * and does not document how tabs are handled. + */ + +#include + +#if USE_WIDEC_SUPPORT + +#define WIDE_LINEDATA +#include + +/* definitions to make it simpler to compare with inserts.c */ +#define InsNStr ins_nwstr +#define InsStr ins_wstr +#define MvInsNStr (void) mvins_nwstr +#define MvInsStr (void) mvins_wstr +#define MvWInsNStr (void) mvwins_nwstr +#define MvWInsStr (void) mvwins_wstr +#define WInsNStr wins_nwstr +#define WInsStr wins_wstr + +#define MY_TABSIZE 8 + +typedef enum { + oDefault = 0, + oMove = 1, + oWindow = 2, + oMoveWindow = 3 +} Options; + +static bool m_opt = FALSE; +static bool w_opt = FALSE; +static int n_opt = -1; + +static void +legend(WINDOW *win, int level, Options state, const wchar_t *buffer, int length) +{ + const char *showstate; + + switch (state) { + default: + case oDefault: + showstate = ""; + break; + case oMove: + showstate = " (mvXXX)"; + break; + case oWindow: + showstate = " (winXXX)"; + break; + case oMoveWindow: + showstate = " (mvwinXXX)"; + break; + } + + wmove(win, 0, 0); + wprintw(win, + "The Strings/Chars displays should match. Enter any characters, except:\n"); + wprintw(win, + "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n"); + wclrtoeol(win); + wprintw(win, "Level %d,%s inserted %d characters <", level, + showstate, length); + waddwstr(win, buffer); + waddstr(win, ">"); +} + +static int +ColOf(const wchar_t *buffer, int length, int margin) +{ + int n; + int result; + + for (n = 0, result = margin + 1; n < length; ++n) { + int ch = buffer[n]; + switch (ch) { + case '\n': + /* actually newline should clear the remainder of the line + * and move to the next line - but that seems a little awkward + * in this example. + */ + case '\r': + result = 0; + break; + case '\b': + if (result > 0) + --result; + break; + case '\t': + result += (MY_TABSIZE - (result % MY_TABSIZE)); + break; + case '\177': + result += 2; + break; + default: + result += wcwidth((wchar_t) ch); + if (ch < 32) + ++result; + break; + } + } + return result; +} + +static int +ConvertCh(chtype source, cchar_t *target) +{ + wchar_t tmp_wchar[2]; + + tmp_wchar[0] = (wchar_t) source; + tmp_wchar[1] = 0; + if (setcchar(target, tmp_wchar, A_NORMAL, 0, (void *) 0) == ERR) { + beep(); + return FALSE; + } + return TRUE; +} + +static int +MvWInsCh(WINDOW *win, int y, int x, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = mvwins_wch(win, y, x, &tmp_cchar); + } else { + code = mvwinsch(win, y, x, ch); + } + return code; +} + +static int +MvInsCh(int y, int x, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = mvins_wch(y, x, &tmp_cchar); + } else { + code = mvinsch(y, x, ch); + } + return code; +} + +static int +WInsCh(WINDOW *win, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = wins_wch(win, &tmp_cchar); + } else { + code = winsch(win, ch); + } + return code; +} + +static int +InsCh(chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = ins_wch(&tmp_cchar); + } else { + code = insch(ch); + } + return code; +} + +#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n))) +static void +test_inserts(int level) +{ + static bool first = TRUE; + + int ch; + int limit; + int row = 1; + int col; + int row2, col2; + int length; + wchar_t buffer[BUFSIZ]; + WINDOW *look = 0; + WINDOW *work = 0; + WINDOW *show = 0; + int margin = (2 * MY_TABSIZE) - 1; + Options option = (Options) ((int) (m_opt ? oMove : oDefault) + | (int) ((w_opt || (level > 0)) + ? oWindow : oDefault)); + + if (first) { + static char cmd[80]; + setlocale(LC_ALL, ""); + + _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd)); + putenv(cmd); + + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + keypad(stdscr, TRUE); + + /* + * Show the characters inserted in color, to distinguish from those + * that are shifted. + */ + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + } + } + + limit = LINES - 5; + if (level > 0) { + look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); + work = newwin(limit - 2, COLS - (2 * level), 1, level); + show = newwin(4, COLS, limit + 1, 0); + box(look, 0, 0); + wnoutrefresh(look); + limit -= 2; + } else { + work = stdscr; + show = derwin(stdscr, 4, COLS, limit + 1, 0); + } + keypad(work, TRUE); + + for (col = margin + 1; col < COLS; col += MY_TABSIZE) + MvWVLine(work, row, col, '.', limit - 2); + + MvWVLine(work, row, margin, ACS_VLINE, limit - 2); + MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2); + limit /= 2; + + MvWAddStr(work, 1, 2, "String"); + MvWAddStr(work, limit + 1, 2, "Chars"); + wnoutrefresh(work); + + buffer[length = 0] = '\0'; + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + + if (has_colors()) { + wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' ')); + } + + while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { + wmove(work, row, margin + 1); + switch (ch) { + case key_RECUR: + test_inserts(level + 1); + + if (look) + touchwin(look); + touchwin(work); + touchwin(show); + + if (look) + wnoutrefresh(look); + wnoutrefresh(work); + wnoutrefresh(show); + + doupdate(); + break; + case key_NEWLINE: + if (row < limit) { + ++row; + /* put the whole string in, all at once */ + col2 = margin + 1; + switch (option) { + case oDefault: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (move(row, col2) != ERR) { + InsNStr(buffer + col, LEN(col)); + } + } + } else { + if (move(row, col2) != ERR) { + InsStr(buffer); + } + } + break; + case oMove: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvInsNStr(row, col2, buffer + col, LEN(col)); + } + } else { + MvInsStr(row, col2, buffer); + } + break; + case oWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (wmove(work, row, col2) != ERR) { + WInsNStr(work, buffer + col, LEN(col)); + } + } + } else { + if (wmove(work, row, col2) != ERR) { + WInsStr(work, buffer); + } + } + break; + case oMoveWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvWInsNStr(work, row, col2, buffer + col, LEN(col)); + } + } else { + MvWInsStr(work, row, col2, buffer); + } + break; + } + + /* do the corresponding single-character insertion */ + row2 = limit + row; + for (col = 0; col < length; ++col) { + col2 = ColOf(buffer, col, margin); + switch (option) { + case oDefault: + if (move(row2, col2) != ERR) { + InsCh((chtype) buffer[col]); + } + break; + case oMove: + MvInsCh(row2, col2, (chtype) buffer[col]); + break; + case oWindow: + if (wmove(work, row2, col2) != ERR) { + WInsCh(work, (chtype) buffer[col]); + } + break; + case oMoveWindow: + MvWInsCh(work, row2, col2, (chtype) buffer[col]); + break; + } + } + } else { + beep(); + } + break; + default: + if (length >= BUFSIZ - 2) + break; + buffer[length++] = (wchar_t) ch; + buffer[length] = '\0'; + + /* put the string in, one character at a time */ + col = ColOf(buffer, length - 1, margin); + switch (option) { + case oDefault: + if (move(row, col) != ERR) { + InsStr(buffer + length - 1); + } + break; + case oMove: + MvInsStr(row, col, buffer + length - 1); + break; + case oWindow: + if (wmove(work, row, col) != ERR) { + WInsStr(work, buffer + length - 1); + } + break; + case oMoveWindow: + MvWInsStr(work, row, col, buffer + length - 1); + break; + } + + /* do the corresponding single-character insertion */ + switch (option) { + case oDefault: + if (move(limit + row, col) != ERR) { + InsCh((chtype) ch); + } + break; + case oMove: + MvInsCh(limit + row, col, (chtype) ch); + break; + case oWindow: + if (wmove(work, limit + row, col) != ERR) { + WInsCh(work, (chtype) ch); + } + break; + case oMoveWindow: + MvWInsCh(work, limit + row, col, (chtype) ch); + break; + } + + wnoutrefresh(work); + + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + break; + } + } + if (level > 0) { + delwin(work); + delwin(look); + } + delwin(show); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: ins_wide [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f FILE read data from given file" + ," -n NUM limit string-inserts to NUM bytes on ^N replay" + ," -m perform wmove/move separately from insert-functions" + ," -w use window-parameter even when stdscr would be implied" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) { + switch (ch) { + case 'f': + init_linedata(optarg); + break; + case 'm': + m_opt = TRUE; + break; + case 'n': + n_opt = atoi(optarg); + if (n_opt == 0) + n_opt = -1; + break; + case 'w': + w_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + test_inserts(0); + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/insdelln.c b/contrib/ncurses/test/insdelln.c new file mode 100644 index 00000000..7fc84141 --- /dev/null +++ b/contrib/ncurses/test/insdelln.c @@ -0,0 +1,429 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2008-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: insdelln.c,v 1.17 2024/10/06 21:08:52 tom Exp $ + * + * test-driver for deleteln, wdeleteln, insdelln, winsdelln, insertln, winsertln + */ + +#include + +#if HAVE_WINSDELLN + +#include + +#define SHOW(n) ((n) == ERR ? "ERR" : "OK") +#define COLOR_DEFAULT (-1) + +typedef struct { + unsigned c; + unsigned v; + int pair; + unsigned attr; + int count; + int ch; + const char *c_msg; + const char *v_msg; + int y_val; + int x_val; + int y_beg, x_beg; + int y_max, x_max; +} STATUS; + +static const char * +color_params(unsigned state, int *pair) +{ + /* *INDENT-OFF* */ + static struct { + short pair; + short fg, bg; + const char *msg; + } table[] = { + { 0, COLOR_DEFAULT, COLOR_DEFAULT, "default" }, + { 1, COLOR_RED, COLOR_BLACK, "red/black" }, + { 2, COLOR_WHITE, COLOR_BLUE, "white/blue" }, + }; + /* *INDENT-ON* */ + + const char *result = 0; + + if (has_colors()) { + static bool first = TRUE; + if (first) { + unsigned n; + + start_color(); + for (n = 0; n < SIZEOF(table); ++n) { + init_pair(table[n].pair, table[n].fg, table[n].bg); + } + } + if (state < SIZEOF(table)) { + *pair = table[state].pair; + result = table[state].msg; + } + } + return result; +} + +static const char * +video_params(unsigned state, unsigned *attr) +{ + /* *INDENT-OFF* */ + static struct { + unsigned attr; + const char *msg; + } table[] = { + { A_NORMAL, "normal" }, + { A_BOLD, "bold" }, + { A_REVERSE, "reverse" }, + { A_UNDERLINE, "underline" }, + { A_BLINK, "blink" }, + }; + /* *INDENT-ON* */ + + const char *result = 0; + + if (state < SIZEOF(table)) { + *attr = table[state].attr; + result = table[state].msg; + } + return result; +} + +/* fill the window with a test-pattern */ +static void +fill_window(WINDOW *win) +{ + int y, x; + int y0 = -1, x0 = -1; + + getyx(win, y, x); + wmove(win, 0, 0); + while (waddstr(win, "0123456789 abcdefghijklmnopqrstuvwxyz ") != ERR) { + int y1, x1; + getyx(win, y1, x1); + if (y1 == y0 && x1 == x0) + break; + x0 = x1; + y0 = y1; + } + wmove(win, y, x); +} + +static void +show_status(WINDOW *win, STATUS * sp) +{ + int y, x; + + getyx(win, y, x); + wmove(win, 0, 0); + wprintw(win, "Count %d", sp->count); + if (sp->v_msg != 0) + wprintw(win, " Video %s", sp->v_msg); + if (sp->c_msg != 0) + wprintw(win, " Color %s", sp->c_msg); + wclrtoeol(win); + wmove(win, y, x); +} + +static void +reshow_status(WINDOW *win, STATUS * sp) +{ + fill_window(win); + show_status(win, sp); +} + +static void +do_subwindow(WINDOW *win, const STATUS * sp, void func(WINDOW *)) +{ + WINDOW *win1 = newwin(sp->y_max - 2, sp->x_max - 2, + sp->y_beg + 1, sp->x_beg + 1); + + if (win1 != 0 && sp->y_max > 4 && sp->x_max > 4) { + WINDOW *win2 = derwin(win1, sp->y_max - 4, sp->x_max - 4, 1, 1); + + if (win2 != 0) { + box(win1, 0, 0); + wrefresh(win1); + func(win2); + + delwin(win2); + } else { + beep(); + } + delwin(win1); + touchwin(win); + } else { + if (win1) + delwin(win1); + beep(); + } +} + +static void +init_status(WINDOW *win, STATUS * sp) +{ + memset(sp, 0, sizeof(*sp)); + sp->c = 99; + sp->v = 99; + sp->ch = ' '; + + keypad(win, TRUE); + fill_window(win); + + getbegyx(win, sp->y_beg, sp->x_beg); + getmaxyx(win, sp->y_max, sp->x_max); +} + +static void +show_help(WINDOW *win) +{ + static NCURSES_CONST char *table[] = + { + "Basic commands:" + ,"Use h/j/k/l or arrow keys to move the cursor." + ,"Set the count parameter for insert/delete by entering digits 0-9." + ,"" + ,"Other commands:" + ,"space toggles through the set of video attributes and colors." + ,"t touches (forces repaint) of the current line." + ,"i calls insertln at the current position with the given count." + ,"d calls deleteln at the window beginning with the given count." + ,"I calls insdelln at the window beginning with the given count." + ,"D calls insdelln at the window beginning with the given -count." + ,"f refills the window with test-pattern using current attributes." + ,"w recur to test windows other than stdscr" + ,"q quit" + ,"= resets count to zero." + ,"? shows this help-window" + ,0 + }; + + popup_msg(win, table); +} + +static void +update_status(WINDOW *win, STATUS * sp) +{ + switch (sp->ch) { + case ' ': /* next test-iteration */ + if (has_colors()) { + if ((sp->c_msg = color_params(++(sp->c), &(sp->pair))) == 0) { + sp->c_msg = color_params(sp->c = 0, &(sp->pair)); + if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { + sp->v_msg = video_params(sp->v = 0, &(sp->attr)); + } + } + } else { + if ((sp->v_msg = video_params(++(sp->v), &(sp->attr))) == 0) { + sp->v_msg = video_params(sp->v = 0, &(sp->attr)); + } + } + sp->count = 0; + show_status(win, sp); + break; + case KEY_LEFT: + case 'h': + if (sp->x_val > 0) + wmove(win, sp->y_val, --(sp->x_val)); + break; + case KEY_DOWN: + case 'j': + if (sp->y_val < sp->y_max) + wmove(win, ++(sp->y_val), sp->x_val); + break; + case KEY_UP: + case 'k': + if (sp->y_val > 0) + wmove(win, --(sp->y_val), sp->x_val); + break; + case KEY_RIGHT: + case 'l': + if (sp->x_val < sp->x_max) + wmove(win, sp->y_val, ++(sp->x_val)); + break; + case 't': + touchline(win, sp->y_val, 1); + break; + case '=': + sp->count = 0; + show_status(win, sp); + break; + case HELP_KEY_1: + show_help(win); + break; + default: + if (isdigit(sp->ch)) { + sp->count = (sp->count * 10) + (sp->ch - '0'); + show_status(win, sp); + } else { + beep(); + } + break; + } +} + +static void +test_winsdelln(WINDOW *win) +{ + STATUS st; + int n; + + init_status(win, &st); + + do { + (void) wattrset(win, AttrArg(COLOR_PAIR(st.pair), st.attr)); + switch (st.ch) { + case 'i': + for (n = 0; n < st.count; ++n) + winsertln(win); + break; + case 'd': + for (n = 0; n < st.count; ++n) + wdeleteln(win); + break; + case 'I': + winsdelln(win, st.count); + break; + case 'D': + winsdelln(win, -st.count); + break; + case 'f': + fill_window(win); + reshow_status(win, &st); + break; + case 'w': + do_subwindow(win, &st, test_winsdelln); + break; + case 'q': + return; + default: + update_status(win, &st); + break; + } + } while ((st.ch = wgetch(win)) != ERR); +} + +static void +test_insdelln(void) +{ + STATUS st; + int n; + + init_status(stdscr, &st); + + do { + (void) attrset(AttrArg(COLOR_PAIR(st.pair), st.attr)); + switch (st.ch) { + case 'i': + for (n = 0; n < st.count; ++n) + insertln(); + break; + case 'd': + for (n = 0; n < st.count; ++n) + deleteln(); + break; + case 'I': + insdelln(st.count); + break; + case 'D': + insdelln(-st.count); + break; + case 'f': + fill_window(stdscr); + reshow_status(stdscr, &st); + break; + case 'w': + do_subwindow(stdscr, &st, test_winsdelln); + break; + case 'q': + return; + default: + update_status(stdscr, &st); + break; + } + } while ((st.ch = getch()) != ERR); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: insdelln [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + initscr(); + cbreak(); + noecho(); + + test_insdelln(); + endwin(); + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses winsdelln function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/inserts.c b/contrib/ncurses/test/inserts.c new file mode 100644 index 00000000..edc14adc --- /dev/null +++ b/contrib/ncurses/test/inserts.c @@ -0,0 +1,454 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2002-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: inserts.c,v 1.35 2024/10/05 19:26:24 tom Exp $ + * + * Demonstrate the winsstr() and winsch functions. + * Thomas Dickey - 2002/10/19 + */ + +#include + +#if HAVE_WINSSTR + +#include + +#define InsNStr insnstr +#define InsStr insstr +#define MvInsNStr (void) mvinsnstr +#define MvInsStr (void) mvinsstr +#define MvWInsNStr (void) mvwinsnstr +#define MvWInsStr (void) mvwinsstr +#define WInsNStr winsnstr +#define WInsStr winsstr + +#define InsCh insch +#define MvInsCh (void) mvinsch +#define MvWInsCh (void) mvwinsch +#define WInsCh winsch + +#define MY_TABSIZE 8 + +typedef enum { + oDefault = 0, + oMove = 1, + oWindow = 2, + oMoveWindow = 3 +} Options; + +static bool m_opt = FALSE; +static bool w_opt = FALSE; +static int n_opt = -1; + +static void +legend(WINDOW *win, int level, Options state, char *buffer, int length) +{ + const char *showstate; + + switch (state) { + default: + case oDefault: + showstate = ""; + break; + case oMove: + showstate = " (mvXXX)"; + break; + case oWindow: + showstate = " (winXXX)"; + break; + case oMoveWindow: + showstate = " (mvwinXXX)"; + break; + } + + wmove(win, 0, 0); + wprintw(win, + "The Strings/Chars displays should match. Enter any characters, except:\n"); + wprintw(win, + "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n"); + wclrtoeol(win); + wprintw(win, "Level %d,%s inserted %d characters <%s>", level, + showstate, length, buffer); +} + +static int +ColOf(const char *buffer, int length, int margin) +{ + int n; + int result; + + for (n = 0, result = margin + 1; n < length; ++n) { + int ch = UChar(buffer[n]); + switch (ch) { + case '\n': + /* actually newline should clear the remainder of the line + * and move to the next line - but that seems a little awkward + * in this example. + */ + case '\r': + result = 0; + break; + case '\b': + if (result > 0) + --result; + break; + case '\t': + result += (MY_TABSIZE - (result % MY_TABSIZE)); + break; + case '\177': + result += 2; + break; + default: + ++result; + if (ch < 32) + ++result; + break; + } + } + return result; +} + +#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n))) +static void +test_inserts(int level) +{ + static bool first = TRUE; + + int ch; + int limit; + int row = 1; + int col; + int row2, col2; + int length; + char buffer[BUFSIZ]; + WINDOW *look = 0; + WINDOW *work = 0; + WINDOW *show = 0; + int margin = (2 * MY_TABSIZE) - 1; + Options option = (Options) ((unsigned) (m_opt + ? oMove + : oDefault) + | (unsigned) ((w_opt || (level > 0)) + ? oWindow + : oDefault)); + + if (first) { + static char cmd[80]; + setlocale(LC_ALL, ""); + + _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd)); + putenv(cmd); + + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + keypad(stdscr, TRUE); + + /* + * Show the characters inserted in color, to distinguish from those + * that are shifted. + */ + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + } + } + + limit = LINES - 5; + if (level > 0) { + look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); + work = newwin(limit - 2, COLS - (2 * level), 1, level); + show = newwin(4, COLS, limit + 1, 0); + box(look, 0, 0); + wnoutrefresh(look); + limit -= 2; + } else { + work = stdscr; + show = derwin(stdscr, 4, COLS, limit + 1, 0); + } + keypad(work, TRUE); + + for (col = margin + 1; col < COLS; col += MY_TABSIZE) + MvWVLine(work, row, col, '.', limit - 2); + + MvWVLine(work, row, margin, ACS_VLINE, limit - 2); + MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2); + limit /= 2; + + MvWAddStr(work, 1, 2, "String"); + MvWAddStr(work, limit + 1, 2, "Chars"); + wnoutrefresh(work); + + buffer[length = 0] = '\0'; + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + + if (has_colors()) { + wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' ')); + } + + while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { + wmove(work, row, margin + 1); + switch (ch) { + case key_RECUR: + test_inserts(level + 1); + + if (look) + touchwin(look); + touchwin(work); + touchwin(show); + + if (look) + wnoutrefresh(look); + wnoutrefresh(work); + wnoutrefresh(show); + + doupdate(); + break; + case key_NEWLINE: + if (row < limit) { + ++row; + /* put the whole string in, all at once */ + col2 = margin + 1; + switch (option) { + case oDefault: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (move(row, col2) != ERR) { + InsNStr(buffer + col, LEN(col)); + } + } + } else { + if (move(row, col2) != ERR) { + InsStr(buffer); + } + } + break; + case oMove: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvInsNStr(row, col2, buffer + col, LEN(col)); + } + } else { + MvInsStr(row, col2, buffer); + } + break; + case oWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (wmove(work, row, col2) != ERR) { + WInsNStr(work, buffer + col, LEN(col)); + } + } + } else { + if (wmove(work, row, col2) != ERR) { + WInsStr(work, buffer); + } + } + break; + case oMoveWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvWInsNStr(work, row, col2, buffer + col, LEN(col)); + } + } else { + MvWInsStr(work, row, col2, buffer); + } + break; + } + + /* do the corresponding single-character insertion */ + row2 = limit + row; + for (col = 0; col < length; ++col) { + col2 = ColOf(buffer, col, margin); + switch (option) { + case oDefault: + if (move(row2, col2) != ERR) { + InsCh(UChar(buffer[col])); + } + break; + case oMove: + MvInsCh(row2, col2, UChar(buffer[col])); + break; + case oWindow: + if (wmove(work, row2, col2) != ERR) { + WInsCh(work, UChar(buffer[col])); + } + break; + case oMoveWindow: + MvWInsCh(work, row2, col2, UChar(buffer[col])); + break; + } + } + } else { + beep(); + } + break; + default: + if (ch <= 0 || ch > 255) { + beep(); + break; + } + if (length >= BUFSIZ - 2) + break; + buffer[length++] = (char) ch; + buffer[length] = '\0'; + + /* put the string in, one character at a time */ + col = ColOf(buffer, length - 1, margin); + switch (option) { + case oDefault: + if (move(row, col) != ERR) { + InsStr(buffer + length - 1); + } + break; + case oMove: + MvInsStr(row, col, buffer + length - 1); + break; + case oWindow: + if (wmove(work, row, col) != ERR) { + WInsStr(work, buffer + length - 1); + } + break; + case oMoveWindow: + MvWInsStr(work, row, col, buffer + length - 1); + break; + } + + /* do the corresponding single-character insertion */ + switch (option) { + case oDefault: + if (move(limit + row, col) != ERR) { + InsCh(UChar(ch)); + } + break; + case oMove: + MvInsCh(limit + row, col, UChar(ch)); + break; + case oWindow: + if (wmove(work, limit + row, col) != ERR) { + WInsCh(work, UChar(ch)); + } + break; + case oMoveWindow: + MvWInsCh(work, limit + row, col, UChar(ch)); + break; + } + + wnoutrefresh(work); + + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + break; + } + } + if (level > 0) { + delwin(work); + delwin(look); + } + delwin(show); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: inserts [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f FILE read data from given file" + ," -n NUM limit string-inserts to NUM bytes on ^N replay" + ," -m perform wmove/move separately from insert-functions" + ," -w use window-parameter even when stdscr would be implied" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) { + switch (ch) { + case 'f': + init_linedata(optarg); + break; + case 'm': + m_opt = TRUE; + break; + case 'n': + n_opt = atoi(optarg); + if (n_opt == 0) + n_opt = -1; + break; + case 'w': + w_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + test_inserts(0); + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the winsstr function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_WINSSTR */ diff --git a/contrib/ncurses/test/key_names.c b/contrib/ncurses/test/key_names.c new file mode 100644 index 00000000..fa7fdba6 --- /dev/null +++ b/contrib/ncurses/test/key_names.c @@ -0,0 +1,115 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 2007-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: key_names.c,v 1.11 2022/12/04 00:40:11 tom Exp $ + */ + +#include + +#if USE_WIDEC_SUPPORT + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: key_names" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -m call meta(TRUE) in initialization" + ," -s call newterm, etc., to complete initialization" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int n; + + bool do_setup = FALSE; + bool do_meta = FALSE; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "ms")) != -1) { + switch (ch) { + case 'm': + do_meta = TRUE; + break; + case 's': + do_setup = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if (do_setup) { + /* + * Get the terminfo entry into memory, and tell ncurses that we want to + * use function keys. That will make it add any user-defined keys that + * appear in the terminfo. + */ + newterm(getenv("TERM"), stderr, stdin); + keypad(stdscr, TRUE); + if (do_meta) + meta(stdscr, TRUE); + endwin(); + } + for (n = -1; n < KEY_MAX + 512; n++) { + int check = wcwidth((wchar_t) n); + const char *result = check >= 0 ? key_name((wchar_t) n) : "?"; + if (result != 0) + printf("%d(%5o):%s\n", n, n, result); + } + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/keynames.c b/contrib/ncurses/test/keynames.c new file mode 100644 index 00000000..cae260f6 --- /dev/null +++ b/contrib/ncurses/test/keynames.c @@ -0,0 +1,104 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2006,2008 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: keynames.c,v 1.13 2022/12/04 00:40:11 tom Exp $ + */ + +#include + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: keynames" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -m call meta(TRUE) in initialization" + ," -s call newterm, etc., to complete initialization" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int n; + bool do_setup = FALSE; + bool do_meta = FALSE; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "ms")) != -1) { + switch (ch) { + case 'm': + do_meta = TRUE; + break; + case 's': + do_setup = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if (do_setup) { + /* + * Get the terminfo entry into memory, and tell ncurses that we want to + * use function keys. That will make it add any user-defined keys that + * appear in the terminfo. + */ + newterm(getenv("TERM"), stderr, stdin); + keypad(stdscr, TRUE); + if (do_meta) + meta(stdscr, TRUE); + endwin(); + } + + for (n = -1; n < KEY_MAX + 512; n++) { + const char *result = keyname(n); + if (result != 0) + printf("%d(%5o):%s\n", n, n, result); + } + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/knight.c b/contrib/ncurses/test/knight.c new file mode 100644 index 00000000..274e175d --- /dev/null +++ b/contrib/ncurses/test/knight.c @@ -0,0 +1,964 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 1998-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * Knight's Tour - a brain game + * + * The original of this game was anonymous. It had an unbelievably bogus + * interface, you actually had to enter square coordinates! Redesign by + * Eric S. Raymond July 22 1995. Mouse support + * added September 20th 1995. + * + * $Id: knight.c,v 1.53 2024/10/05 19:38:58 tom Exp $ + */ + +#include + +/* board size */ +#define YLIMIT 8 +#define XLIMIT 8 +#define MAXMOVES (ylimit * xlimit) + +/* where to start the instructions */ +#define INSTRY 2 +#define INSTRX 35 + +/* corner of board */ +#define BOARDY 2 +#define BOARDX 0 + +/* notification line */ +#define NOTIFYY 21 + +/* virtual color values */ +#define TRAIL_COLOR 1 +#define PLUS_COLOR 2 +#define MINUS_COLOR 3 + +#define CX(x) (2 + 4 * (x)) +#define CY(y) (1 + 2 * (y)) +#define cellmove(y, x) wmove(boardwin, CY(y), CX(x)) +#define CXINV(x) (((x) - 1) / 4) +#define CYINV(y) (((y) - 2) / 2) + +typedef struct { + int x, y; +} HISTORY; + +typedef int SQUARES[YLIMIT][XLIMIT]; + +static WINDOW *boardwin; /* the board window */ +static WINDOW *helpwin; /* the help window */ +static WINDOW *msgwin; /* the message window */ + +#if HAVE_USE_DEFAULT_COLORS +static bool d_option; +#endif + +static chtype minus = '-'; /* possible-move character */ +static chtype oldch; +static chtype plus = '+'; /* cursor hot-spot character */ +static chtype trail = '#'; /* trail character */ + +static int ylimit = YLIMIT; +static int xlimit = XLIMIT; +static int maxmoves = (YLIMIT * XLIMIT); + +static int count_tries; /* count of trials so far */ +static int test_test; /* FIXME */ +/* *INDENT-OFF* */ +static const struct { + int y; + int x; +} offsets[] = { + { 2, 1 }, + { 1, 2 }, + { -1, 2 }, + { -2, 1 }, + { -2, -1 }, + { -1, -2 }, + { 1, -2 }, + { 2, -1 }, +}; +#define MAX_OFFSET (unsigned)SIZEOF(offsets) +/* *INDENT-ON* */ + +static void +init_program(void) +{ + setlocale(LC_ALL, ""); + + srand((unsigned) getpid()); + initscr(); + cbreak(); /* immediate char return */ + noecho(); /* no immediate echo */ + + maxmoves = MAXMOVES; + boardwin = newwin(ylimit * 2 + 1, xlimit * 4 + 1, BOARDY, BOARDX); + helpwin = newwin(0, 0, INSTRY, INSTRX); + msgwin = newwin(1, INSTRX - 1, NOTIFYY, 0); + + scrollok(msgwin, TRUE); + keypad(boardwin, TRUE); + + if (has_colors()) { + int bg = COLOR_BLACK; + + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() == OK)) + bg = -1; +#endif + + (void) init_pair(TRAIL_COLOR, (short) COLOR_CYAN, (short) bg); + (void) init_pair(PLUS_COLOR, (short) COLOR_RED, (short) bg); + (void) init_pair(MINUS_COLOR, (short) COLOR_GREEN, (short) bg); + + trail |= (chtype) COLOR_PAIR(TRAIL_COLOR); + plus |= (chtype) COLOR_PAIR(PLUS_COLOR); + minus |= (chtype) COLOR_PAIR(MINUS_COLOR); + } +#ifdef NCURSES_MOUSE_VERSION + (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL); +#endif /* NCURSES_MOUSE_VERSION */ +#if defined(PDCURSES) + mouse_set(BUTTON1_RELEASED); +#endif + + oldch = minus; +} + +static void +help1(void) +/* game explanation -- initial help screen */ +{ + (void) waddstr(helpwin, "Knight's move is a solitaire puzzle. Your\n"); + (void) waddstr(helpwin, "objective is to visit each square of the \n"); + (void) waddstr(helpwin, "chessboard exactly once by making knight's\n"); + (void) waddstr(helpwin, "moves (one square right or left followed \n"); + (void) waddstr(helpwin, "by two squares up or down, or two squares \n"); + (void) waddstr(helpwin, "right or left followed by one square up or\n"); + (void) waddstr(helpwin, "down). You may start anywhere.\n\n"); + + (void) waddstr(helpwin, "Use arrow keys to move the cursor around.\n"); + (void) waddstr(helpwin, "When you want to move your knight to the \n"); + (void) waddstr(helpwin, "cursor location, press or Enter.\n"); + (void) waddstr(helpwin, "Illegal moves will be rejected with an \n"); + (void) waddstr(helpwin, "audible beep.\n\n"); + (void) waddstr(helpwin, "The program will detect if you solve the\n"); + (void) waddstr(helpwin, "puzzle; also inform you when you run out\n"); + (void) waddstr(helpwin, "of legal moves.\n\n"); + + MvWAddStr(helpwin, NOTIFYY - INSTRY, 0, + "Press `?' to go to keystroke help."); +} + +static void +help2(void) +/* keystroke help screen */ +{ + (void) waddstr(helpwin, "Possible moves are shown with `-'.\n\n"); + + (void) waddstr(helpwin, "You can move around with the arrow keys or\n"); + (void) waddstr(helpwin, "with the rogue/hack movement keys. Other\n"); + (void) waddstr(helpwin, "commands allow you to undo moves or redraw.\n"); + (void) waddstr(helpwin, "Your mouse may work; try left-button to\n"); + (void) waddstr(helpwin, "move to the square under the pointer.\n\n"); + + (void) waddstr(helpwin, "x,q -- exit y k u 7 8 9\n"); + (void) waddstr(helpwin, "r -- redraw screen \\|/ \\|/ \n"); + (void) waddstr(helpwin, "bksp -- undo move h-+-l 4-+-6\n"); + (void) waddstr(helpwin, "a -- autojump /|\\ /|\\ \n"); + if (ylimit <= 6) { + (void) waddstr(helpwin, "R -- solve (slow) b j n 1 2 3\n"); + } else { + (void) waddstr(helpwin, " b j n 1 2 3\n"); + } + + (void) waddstr(helpwin, "\nYou can place your knight on the selected\n"); + (void) waddstr(helpwin, "square with spacebar, Enter, or the keypad\n"); + (void) waddstr(helpwin, "center key. Use F/B to review the path.\n"); + + MvWAddStr(helpwin, NOTIFYY - INSTRY, 0, + "Press `?' to go to game explanation"); +} + +static void +show_help(bool * keyhelp) +{ + werase(helpwin); + if (*keyhelp) { + help1(); + *keyhelp = FALSE; + } else { + help2(); + *keyhelp = TRUE; + } + wrefresh(helpwin); +} + +static inline bool +isValidYX(int y, int x) +{ + return (y >= 0 && y < ylimit && x >= 0 && x < xlimit) ? TRUE : FALSE; +} + +static inline bool +isUnusedYX(SQUARES squares, int y, int x) +{ + return (isValidYX(y, x) && (!squares[y][x]) ? TRUE : FALSE); +} + +static bool +boardIsFilled(SQUARES squares, int y, int x) +{ + unsigned n; + + for (n = 0; n < MAX_OFFSET; n++) { + if (isUnusedYX(squares, y + offsets[n].y, x + offsets[n].x)) { + return FALSE; + } + } + return TRUE; +} + +static void +drawBoard(void) +{ + int i, j; + + MvAddStr(0, 20, "KNIGHT'S MOVE -- a logical solitaire"); + + move(BOARDY, BOARDX); + waddch(boardwin, ACS_ULCORNER); + for (j = 0; j < (ylimit - 1); j++) { + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_TTEE); + } + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_URCORNER); + + for (i = 1; i < ylimit; i++) { + move(BOARDY + i * 2 - 1, BOARDX); + waddch(boardwin, ACS_VLINE); + for (j = 0; j < xlimit; j++) { + waddch(boardwin, ' '); + waddch(boardwin, ' '); + waddch(boardwin, ' '); + waddch(boardwin, ACS_VLINE); + } + move(BOARDY + i * 2, BOARDX); + waddch(boardwin, ACS_LTEE); + for (j = 0; j < xlimit - 1; j++) { + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_PLUS); + } + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_RTEE); + } + + move(BOARDY + i * 2 - 1, BOARDX); + waddch(boardwin, ACS_VLINE); + for (j = 0; j < xlimit; j++) { + waddch(boardwin, ' '); + waddch(boardwin, ' '); + waddch(boardwin, ' '); + waddch(boardwin, ACS_VLINE); + } + + move(BOARDY + i * 2, BOARDX); + waddch(boardwin, ACS_LLCORNER); + for (j = 0; j < xlimit - 1; j++) { + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_BTEE); + } + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_HLINE); + waddch(boardwin, ACS_LRCORNER); +} + +static void +mark_possibles(SQUARES squares, int y, int x, chtype mark) +{ + unsigned n; + + for (n = 0; n < MAX_OFFSET; n++) { + if (isUnusedYX(squares, y + offsets[n].y, x + offsets[n].x)) { + cellmove(y + offsets[n].y, x + offsets[n].x); + waddch(boardwin, mark); + } + } +} + +static bool +find_next_move(SQUARES squares, HISTORY * doneData, int doneSize, int *y, int *x) +{ + bool result = FALSE; + + if (doneSize > 1) { + unsigned j; + int oldy = doneData[doneSize - 1].y; + int oldx = doneData[doneSize - 1].x; + int found = -1; + int first = -1; + int next = -1; + + for (j = 0; j < MAX_OFFSET * 2; j++) { + unsigned k = j % MAX_OFFSET; + int newy = oldy + offsets[k].y; + int newx = oldx + offsets[k].x; + if (isUnusedYX(squares, newy, newx)) { + if (first < 0) + first = (int) k; + if (newy == *y + && newx == *x) { + found = (int) k; + } else if (found >= 0) { + next = (int) k; + break; + } + } + } + if (found < 0) + next = first; + if (next >= 0) { + *y = oldy + offsets[next].y; + *x = oldx + offsets[next].x; + } + result = TRUE; + } + return result; +} + +static void +count_next_moves(SQUARES squares, int count_moves, int y, int x) +{ + int count = 0; + unsigned j; + + wprintw(msgwin, "\nMove %d", count_moves); + for (j = 0; j < MAX_OFFSET; j++) { + int newy = y + offsets[j].y; + int newx = x + offsets[j].x; + if (isUnusedYX(squares, newy, newx)) { + ++count; + } + } + wprintw(msgwin, ", gives %d choices", count); + wclrtoeol(msgwin); +} + +static void +unmarkcell(int row, int column) +{ + cellmove(row, column); + waddch(boardwin, '\b'); + waddch(boardwin, ' '); + waddch(boardwin, minus); + waddch(boardwin, ' '); +} + +static void +markcell(chtype tchar, int row, int column) +{ + cellmove(row, column); + waddch(boardwin, '\b'); + waddch(boardwin, tchar); + waddch(boardwin, tchar); + waddch(boardwin, tchar); +} + +static void +drawMove(SQUARES squares, int count_moves, chtype tchar, int oldy, int oldx, int + row, int column) +/* place the stars, update board & currents */ +{ + if (count_moves <= 1) { + int i, j; + + for (i = 0; i < ylimit; i++) { + for (j = 0; j < xlimit; j++) { + if (count_moves == 0) { + unmarkcell(i, j); + } else { + cellmove(i, j); + if (winch(boardwin) == minus) + waddch(boardwin, ' '); + } + } + } + } else { + markcell(tchar, oldy, oldx); + mark_possibles(squares, oldy, oldx, ' '); + } + + if (row >= 0 && column >= 0) { + markcell(trail, row, column); + mark_possibles(squares, row, column, minus); + squares[row][column] = TRUE; + } + + wprintw(msgwin, "\nMove %d", count_moves); + if (count_tries != count_moves) + wprintw(msgwin, " (%d tries)", count_tries); + wclrtoeol(msgwin); +} + +static int +iabs(int num) +{ + if (num < 0) + return (-num); + else + return (num); +} + +static bool +evaluate_move(SQUARES squares, const HISTORY * doneData, int doneSize, + int row, int column) +{ + if (doneSize <= 1) + return (TRUE); + else if (squares[row][column] == TRUE) { + waddstr(msgwin, "\nYou've already been there."); + return (FALSE); + } else { + int rdif = iabs(row - doneData[doneSize - 1].y); + int cdif = iabs(column - doneData[doneSize - 1].x); + + if (!((rdif == 1) && (cdif == 2)) && !((rdif == 2) && (cdif == 1))) { + waddstr(msgwin, "\nThat's not a legal knight's move."); + return (FALSE); + } + } + + return (TRUE); +} + +static int +completed(SQUARES squares) +{ + int i, j, count = 0; + + for (i = 0; i < ylimit; i++) { + for (j = 0; j < xlimit; j++) { + if (squares[i][j] != 0) { + count += 1; + } + } + } + return ((count == maxmoves) ? -1 : count); +} + +static void +no_previous_move(void) +{ + waddstr(msgwin, "\nNo previous move."); + beep(); +} + +/* Recursively try all possible moves, starting from (y,x) */ +static int +recurBack(SQUARES squares, int y, int x, int total) +{ + int longest = total; + int best_x = x; + int best_y = y; + int result; + + if (total < maxmoves) { + unsigned k; + + for (k = 0; k < MAX_OFFSET; k++) { + int try_x = x + offsets[k].x; + int try_y = y + offsets[k].y; + if (isUnusedYX(squares, try_y, try_x)) { + ++test_test; + squares[try_y][try_x] = total + 1; + result = recurBack(squares, try_y, try_x, total + 1); + if (result > longest) { + longest = result; + best_x = try_x; + best_y = try_y; + } + if (result >= maxmoves) + break; + squares[try_y][try_x] = 0; /* allow retry... */ + } + } + } + + result = total; + if (longest > total) { + result = longest; + squares[best_y][best_x] = total + 1; + (void) recurBack(squares, best_y, best_x, total + 1); + if (result < maxmoves) + squares[best_y][best_x] = 0; + } + + return result; +} + +/* + * Solve the Knight Tour problem using backtracking, returning the length of + * the resulting solution. If this is invoked from a point where the remaining + * choices cannot complete the tour, the result will fall short. + */ +static int +useBacktracking(SQUARES result, HISTORY * doneData, int doneSize) +{ + int y = 0, x = 0, n; + SQUARES squares; + int total; + int actual = doneSize - 1; + + memset(squares, 0, sizeof(squares)); + for (n = 1; n <= actual; ++n) { + y = doneData[n].y; + x = doneData[n].x; + squares[y][x] = n; + } + + total = recurBack(squares, y, x, actual); + if (total > actual) { + for (y = 0; y < ylimit; ++y) { + for (x = 0; x < xlimit; ++x) { + result[y][x] = squares[y][x]; + if ((n = squares[y][x]) != 0) { + doneData[n].y = y; + doneData[n].x = x; + } + } + } + } + return total; +} + +static int +reviewHistory(HISTORY * history, int count_moves, int review, int *ny, int *nx) +{ + if (review < 0) { + beep(); + review = 0; + } else if (review > count_moves - 2) { + beep(); + review = count_moves - 2; + } else { + *ny = history[count_moves - review - 1].y; + *nx = history[count_moves - review - 1].x; + wprintw(msgwin, "\nReview %d:%d.", count_moves - review - 1, + count_moves - 1); + wrefresh(msgwin); + } + return review; +} + +static void +play(void) +/* play the game */ +{ + bool keyhelp; /* TRUE if keystroke help is up */ + int i, j, count; + int lastcol; /* last location visited */ + int lastrow; + int ny = 0, nx = 0; + int review = 0; /* review history */ + int test_size; + int rw = 0, col = 0; /* current row and column */ + + do { + SQUARES squares; + HISTORY history[(YLIMIT * XLIMIT) + 1]; + int count_moves = 0; /* count of moves so far */ + + /* clear screen and draw board */ + werase(boardwin); + werase(helpwin); + werase(msgwin); + drawBoard(); + help1(); + wnoutrefresh(stdscr); + wnoutrefresh(helpwin); + wnoutrefresh(msgwin); + wnoutrefresh(boardwin); + doupdate(); + + for (i = 0; i < ylimit; i++) { + for (j = 0; j < xlimit; j++) { + unmarkcell(i, j); + } + } + memset(squares, 0, sizeof(squares)); + memset(history, 0, sizeof(history)); + history[0].y = history[0].x = -1; + history[1].y = history[1].x = -1; + lastrow = lastcol = -2; + count_moves = 1; + count_tries = 1; + keyhelp = FALSE; + show_help(&keyhelp); + + for (;;) { + if (rw != lastrow || col != lastcol) { + if (lastrow >= 0 && lastcol >= 0) { + cellmove(lastrow, lastcol); + if (squares[lastrow][lastcol]) + waddch(boardwin, trail); + else + waddch(boardwin, oldch); + } + + cellmove(rw, col); + oldch = winch(boardwin); + + lastrow = rw; + lastcol = col; + } + cellmove(rw, col); + waddch(boardwin, plus); + cellmove(rw, col); + + wrefresh(msgwin); + + switch (wgetch(boardwin)) { + case 'k': + case '8': + case KEY_UP: + ny = rw + ylimit - 1; + nx = col; + break; + case 'j': + case '2': + case KEY_DOWN: + ny = rw + 1; + nx = col; + break; + case 'h': + case '4': + case KEY_LEFT: + ny = rw; + nx = col + xlimit - 1; + break; + case 'l': + case '6': + case KEY_RIGHT: + ny = rw; + nx = col + 1; + break; + case 'y': + case '7': + case KEY_A1: + ny = rw + ylimit - 1; + nx = col + xlimit - 1; + break; + case 'b': + case '1': + case KEY_C1: + ny = rw + 1; + nx = col + xlimit - 1; + break; + case 'u': + case '9': + case KEY_A3: + ny = rw + ylimit - 1; + nx = col + 1; + break; + case 'n': + case '3': + case KEY_C3: + ny = rw + 1; + nx = col + 1; + break; + +#ifdef KEY_MOUSE + case KEY_MOUSE: +#ifdef NCURSES_MOUSE_VERSION + { + MEVENT myevent; + + getmouse(&myevent); + if (myevent.y >= CY(0) && myevent.y <= CY(ylimit) + && myevent.x >= CX(0) && myevent.x <= CX(xlimit)) { + nx = CXINV(myevent.x); + ny = CYINV(myevent.y); + ungetch('\n'); + break; + } else { + beep(); + continue; + } + } +#endif /* NCURSES_MOUSE_VERSION */ +#ifdef PDCURSES + { + int test_y, test_x; + request_mouse_pos(); + test_y = MOUSE_Y_POS + 0; + test_x = MOUSE_X_POS + 1; + if (test_y >= CY(0) && test_y <= CY(ylimit) + && test_x >= CX(0) && test_x <= CX(xlimit)) { + ny = CYINV(test_y); + nx = CXINV(test_x); + wmove(helpwin, 0, 0); + wrefresh(helpwin); + ungetch('\n'); + } + break; + } +#endif /* PDCURSES */ +#endif /* KEY_MOUSE */ + + case KEY_B2: + case '\n': + case ' ': + review = 0; + if (evaluate_move(squares, history, count_moves, rw, col)) { + drawMove(squares, + count_moves, + trail, + history[count_moves - 1].y, + history[count_moves - 1].x, + rw, col); + history[count_moves].y = (short) rw; + history[count_moves].x = (short) col; + count_moves++; + count_tries++; + + if (boardIsFilled(squares, rw, col)) { + if (completed(squares) < 0) { + waddstr(msgwin, "\nYou won."); + } else { + waddstr(msgwin, + "\nNo further moves are possible."); + } + } + } else { + beep(); + } + break; + + case KEY_UNDO: + case KEY_BACKSPACE: + case '\b': + review = 0; + if (count_moves <= 0) { + no_previous_move(); + } else if (count_moves <= 1) { + ny = history[count_moves].y; + nx = history[count_moves].x; + if (nx < 0 || ny < 0) { + ny = (lastrow >= 0) ? lastrow : 0; + nx = (lastcol >= 0) ? lastcol : 0; + } + count_moves = 0; + squares[ny][nx] = FALSE; + oldch = minus; + drawMove(squares, count_moves, ' ', ny, nx, -1, -1); + count_moves = 1; + count_tries = 1; + no_previous_move(); + } else { + int oldy = history[count_moves - 1].y; + int oldx = history[count_moves - 1].x; + + if (!squares[rw][col]) { + cellmove(rw, col); + waddch(boardwin, ' '); + } + + squares[oldy][oldx] = FALSE; + --count_moves; + ny = history[count_moves - 1].y; + nx = history[count_moves - 1].x; + if (nx < 0 || ny < 0) { + ny = oldy; + nx = oldx; + } + drawMove(squares, count_moves, ' ', oldy, oldx, ny, nx); + + /* avoid problems if we just changed the current cell */ + cellmove(lastrow, lastcol); + oldch = winch(boardwin); + } + break; + + case 'a': + nx = col; + ny = rw; + if (find_next_move(squares, history, count_moves, &ny, &nx)) + count_next_moves(squares, count_moves, ny, nx); + else + beep(); + break; + + case 'F': + review = reviewHistory(history, count_moves, review - 1, + &ny, &nx); + break; + + case 'B': + review = reviewHistory(history, count_moves, review + 1, + &ny, &nx); + break; + + case 'R': + if (ylimit <= 6) { + wprintw(msgwin, "\nworking..."); + wrefresh(msgwin); + test_test = 0; + test_size = useBacktracking(squares, history, count_moves); + wprintw(msgwin, "\nOk %d:%d (%d tests)", + test_size, maxmoves, test_test); + review = 0; + while (count_moves <= test_size) { + markcell(trail, + ny = history[count_moves].y, + nx = history[count_moves].x); + count_moves++; + } + } else { + wprintw(msgwin, "\nBoard is too large."); + } + wrefresh(msgwin); + break; + +#if HAVE_CURSCR + case KEY_REDO: + case '\f': + case 'r': + clearok(curscr, TRUE); + wnoutrefresh(stdscr); + wnoutrefresh(boardwin); + wnoutrefresh(msgwin); + wnoutrefresh(helpwin); + doupdate(); + break; +#endif + + case 'q': + case 'x': + goto dropout; + + case HELP_KEY_1: + show_help(&keyhelp); + break; + + default: + beep(); + break; + } + + col = nx % xlimit; + rw = ny % ylimit; + } + + dropout: + if ((count = completed(squares)) < 0) + wprintw(msgwin, "\nYou won. Care to try again? "); + else + wprintw(msgwin, "\n%d squares filled. Try again? ", count); + wclrtoeol(msgwin); + } while + (tolower(wgetch(msgwin)) == 'y'); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: knight [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + ," -n NUM set board-size to NUM*NUM (default 8x8)" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON "dn:")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case 'n': + ch = atoi(optarg); + if (ch < 3 || ch > 8) { + fprintf(stderr, "board size %d is outside [3..8]\n", ch); + usage(FALSE); + } + xlimit = ylimit = ch; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + init_program(); + + play(); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/linedata.h b/contrib/ncurses/test/linedata.h new file mode 100644 index 00000000..f042ab44 --- /dev/null +++ b/contrib/ncurses/test/linedata.h @@ -0,0 +1,111 @@ +/**************************************************************************** + * Copyright 2018,2020 Thomas E. Dickey * + * Copyright 2009-2010,2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: linedata.h,v 1.8 2020/02/02 23:34:34 tom Exp $ + * + * Utility functions for reading a line of text from a file. + */ +#ifndef LINEDATA_H_incl +#define LINEDATA_H_incl 1 + +#include + +#define isQUIT(c) ((c) == QUIT || (c) == ESCAPE) + +#define key_RECUR CTRL('W') +#define key_NEWLINE CTRL('N') +#define key_BACKSPACE '\b' + +static FILE *linedata; + +static void +failed(const char *s) +{ + perror(s); + ExitProgram(EXIT_FAILURE); +} + +static void +init_linedata(const char *name) +{ + if ((linedata = fopen(name, "r")) == 0) { + failed(name); + } +} + +static int +read_linedata(WINDOW *work) +{ + int result; + if (linedata != 0) { + result = fgetc(linedata); + if (result == EOF) { + fclose(linedata); + linedata = 0; + result = read_linedata(work); + } else { + wrefresh(work); + if (result == '\n') { + result = key_NEWLINE; + } + } + } else { +#ifdef WIDE_LINEDATA + wint_t ch; + int code; + + result = ERR; + while ((code = wget_wch(work, &ch)) != ERR) { + + if (code == KEY_CODE_YES) { + switch (ch) { + case KEY_DOWN: + result = key_NEWLINE; + break; + case KEY_BACKSPACE: + result = key_BACKSPACE; + break; + default: + beep(); + continue; + } + } else { + result = (int) ch; + break; + } + } +#else + result = wgetch(work); +#endif + } + return result; +} + +#endif /* LINEDATA_H_incl */ diff --git a/contrib/ncurses/test/link2exe.sh b/contrib/ncurses/test/link2exe.sh new file mode 100755 index 00000000..cabecd54 --- /dev/null +++ b/contrib/ncurses/test/link2exe.sh @@ -0,0 +1,2 @@ +NM8=`echo $1 | head -c 8` +djlink -d dosemu_${NM8}.exe.dbg $1 -n ${NM8}.exe -o ${NM8}.exe -f 0x80 diff --git a/contrib/ncurses/test/linux-color.dat b/contrib/ncurses/test/linux-color.dat new file mode 100644 index 00000000..ef922ebe --- /dev/null +++ b/contrib/ncurses/test/linux-color.dat @@ -0,0 +1,49 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2004,2006 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: linux-color.dat,v 1.3 2020/02/08 21:38:22 tom Exp $ +# These values are derived from linux/drivers/char/vt.c (default_red[], +# default_grn[] and default_blu[]), commented +/* the default colour table, for VGA+ colour systems */ +scale:255 +0: 0 0 0 +1: 170 0 0 +2: 0 170 0 +3: 170 85 0 +4: 0 0 170 +5: 170 0 170 +6: 0 170 170 +7: 170 170 170 +8: 85 85 85 +9: 255 85 85 +10: 85 255 85 +11: 255 255 85 +12: 85 85 255 +13: 255 85 255 +14: 85 255 255 +15: 255 255 255 diff --git a/contrib/ncurses/test/list_keys.c b/contrib/ncurses/test/list_keys.c new file mode 100644 index 00000000..4496cb5a --- /dev/null +++ b/contrib/ncurses/test/list_keys.c @@ -0,0 +1,533 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: list_keys.c,v 1.34 2024/10/05 19:26:24 tom Exp $ + * + * Author: Thomas E Dickey + * + * List function keys for one or more terminals. + */ + +#define USE_TINFO +#include + +#if NCURSES_XNAMES +#if HAVE_TERM_ENTRY_H +#include +#else +#undef NCURSES_XNAMES +#define NCURSES_XNAMES 0 +#endif +#endif + +#if HAVE_TIGETSTR +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) + +static bool f_opt = FALSE; +static bool m_opt = FALSE; +static bool t_opt = FALSE; + +#if NCURSES_XNAMES || HAVE_USE_EXTENDED_NAMES +static bool x_opt = FALSE; +#endif + +typedef enum { + ktCursor + ,ktFunction + ,ktOther +#if HAVE_USE_EXTENDED_NAMES + ,ktExtended +#endif +} KEYTYPE; + +typedef struct { + KEYTYPE type; + const char *name; +} KEYNAMES; + +#define Type(n) list[n].type +#define Name(n) list[n].name + +static void +failed(const char *msg) +{ + perror(msg); + ExitProgram(EXIT_FAILURE); +} + +static const char * +full_name(const char *name) +{ + const char *result = name; + int n; + for (n = 0; strnames[n] != 0; ++n) { + if (!strcmp(name, strnames[n])) { + result = strfnames[n]; + break; + } + } + return result; +} + +static int +show_key(const char *name, bool show) +{ + int width = 0; + NCURSES_CONST char *value = tigetstr((NCURSES_CONST char *) name); + + if (show && t_opt) + fputc('"', stdout); + + if (value != 0 && value != (char *) -1) { + while (*value != 0) { + char buffer[10]; + int ch = UChar(*value++); + switch (ch) { + case '\177': + _nc_STRCPY(buffer, "^?", sizeof(buffer)); + break; + case '\033': + _nc_STRCPY(buffer, "\\E", sizeof(buffer)); + break; + case '\b': + _nc_STRCPY(buffer, "\\b", sizeof(buffer)); + break; + case '\f': + _nc_STRCPY(buffer, "\\f", sizeof(buffer)); + break; + case '\n': + _nc_STRCPY(buffer, "\\n", sizeof(buffer)); + break; + case '\r': + _nc_STRCPY(buffer, "\\r", sizeof(buffer)); + break; + case ' ': + _nc_STRCPY(buffer, "\\s", sizeof(buffer)); + break; + case '\t': + _nc_STRCPY(buffer, "\\t", sizeof(buffer)); + break; + case '^': + _nc_STRCPY(buffer, "\\^", sizeof(buffer)); + break; + case ':': + _nc_STRCPY(buffer, "\\072", sizeof(buffer)); + break; + case '\\': + _nc_STRCPY(buffer, "\\\\", sizeof(buffer)); + break; + default: + if (t_opt && ch == '"') { + _nc_STRCPY(buffer, "\"\"", sizeof(buffer)); + } else if (isgraph(ch)) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "%c", ch); + } else if (ch < 32) { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "^%c", ch + '@'); + } else { + _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) + "\\%03o", ch); + } + break; + } + width += (int) strlen(buffer); + if (show) + fputs(buffer, stdout); + } + } + + if (show && t_opt) + fputc('"', stdout); + + return width; +} + +static bool +valid_key(const char *name, TERMINAL **terms, int count) +{ + bool result = FALSE; + if (*name == 'k') { + int k; + for (k = 0; k < count; ++k) { + set_curterm(terms[k]); + if (show_key(name, FALSE)) { + result = TRUE; + break; + } + } + } + return result; +} + +static int +compare_keys(const void *a, const void *b) +{ + const KEYNAMES *p = (const KEYNAMES *) a; + const KEYNAMES *q = (const KEYNAMES *) b; + int result = (int) (p->type - q->type); + int pn, qn; + if (result == 0) { + if (p->type == ktFunction && + sscanf(p->name, "kf%d", &pn) == 1 && + sscanf(q->name, "kf%d", &qn) == 1) { + result = (pn - qn); + } else { + result = strcmp(p->name, q->name); + } + } + return result; +} + +static void +draw_line(int width) +{ + if (!t_opt) { + int j; + for (j = 0; j < width; ++j) { + printf("-"); + } + printf("\n"); + } +} + +static const char * +modified_key(const char *name) +{ + static char result[100]; + char buffer[sizeof(result) - 10]; + int value; + char chr; + static const char *modifiers[][2] = + { + {"", ""}, + {"s-", "shift-"}, + {"a-", "alt-"}, + {"as-", "alt-shift-"}, + {"c-", "ctrl-"}, + {"sc-", "ctrl-shift-"}, + {"ac-", "alt-ctrl-"}, + {"acs-" "alt-ctrl-shift-"}, + }; + + if (strlen(name) > (sizeof(result) - 3)) { + *result = '\0'; + } else if (sscanf(name, "kf%d%c", &value, &chr) == 1 && + value >= 1 && + value <= 63) { + /* map 1,2,3,4,5,6,7 to 1,2,5,... */ + int map = ((value - 1) / 12); + int key = ((value - 1) % 12); + int bit1 = (map & 2); + int bit2 = (map & 4); + map &= ~6; + map |= (bit1 << 1) | (bit2 >> 1); + _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result)) + "%sF%d", modifiers[map][(unsigned) f_opt], 1 + key); + } else if (sscanf(name, "k%80[A-Z]%d%c", buffer, &value, &chr) == 2 && + (value > 1 && + value <= 8) && + (!strcmp(buffer, "UP") || + !strcmp(buffer, "DN") || + !strcmp(buffer, "LFT") || + !strcmp(buffer, "RIT") || + !strcmp(buffer, "IC") || + !strcmp(buffer, "DC") || + !strcmp(buffer, "HOM") || + !strcmp(buffer, "END") || + !strcmp(buffer, "NXT") || + !strcmp(buffer, "PRV"))) { + _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result)) + "%sk%s", modifiers[value - 1][(unsigned) f_opt], buffer); + } else if (sscanf(name, "k%80[A-Z]%c", buffer, &chr) == 1 && + (!strcmp(buffer, "UP") || + !strcmp(buffer, "DN"))) { + _nc_SPRINTF(result, _nc_SLIMIT(sizeof(result)) + "%sk%s", modifiers[1][(unsigned) f_opt], buffer); + } else { + *result = '\0'; + } + return result; +} + +static void +list_keys(TERMINAL **terms, int count) +{ + int j, k; + int widths0 = 0; + int widths1 = 0; + int widths2 = 0; + int widthsx; + int check; + size_t total = 0; + size_t actual = 0; + const char *name = f_opt ? "strfname" : "strname"; + const char *modifier = "extended"; + KEYNAMES *list; + + for (total = 0; strnames[total]; ++total) { + ; + } +#if NCURSES_XNAMES + if (x_opt) { + for (k = 0; k < count; ++k) { + const TERMTYPE *term; + set_curterm(terms[k]); + term = (TERMTYPE *) cur_term; + total += (size_t) (NUM_STRINGS(term) - STRCOUNT); + } + } +#endif + list = typeCalloc(KEYNAMES, total + 1); + for (j = 0; strnames[j]; ++j) { + Type(j) = ktOther; + if (sscanf(strnames[j], "kf%d", &k) == 1) { + Type(j) = ktFunction; + } else if (!(strncmp) (strnames[j], "kcu", 3)) { + Type(j) = ktCursor; + } + Name(j) = strnames[j]; + } +#if NCURSES_XNAMES + if (x_opt) { + int m, n; + + for (k = 0; k < count; ++k) { + TERMTYPE *term; + + set_curterm(terms[k]); + term = (TERMTYPE *) cur_term; + for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { + bool found = FALSE; + const char *estr = ExtStrname(term, (int) n, strnames); + for (m = STRCOUNT; m < j; ++m) { + if (!strcmp(estr, Name(m))) { + found = TRUE; + break; + } + } + if (!found) { + Type(j) = ktExtended; + Name(j++) = estr; + } + } + } + } +#endif + actual = (size_t) j; + qsort(list, actual, sizeof(KEYNAMES), compare_keys); + + widths0 = (int) strlen(name); + if (m_opt) + widths1 = (int) strlen(modifier); + + for (k = 0; k < count; ++k) { + const char *value; + set_curterm(terms[k]); + if ((value = termname()) == NULL) + failed("termname"); + check = (int) strlen(value); + if (widths2 < check) + widths2 = check; + } + for (j = 0; Name(j) != 0; ++j) { + if (valid_key(Name(j), terms, count)) { + const char *label = f_opt ? full_name(Name(j)) : Name(j); + check = (int) strlen(label); + if (widths0 < check) + widths0 = check; + for (k = 0; k < count; ++k) { + set_curterm(terms[k]); + check = show_key(Name(j), FALSE) + 1; + if (widths2 < check) + widths2 = check; + if (m_opt) { + check = (int) strlen(modified_key(Name(j))); + if (widths1 < check) + widths1 = check; + } + } + } + } + + if (t_opt) { + printf("\"%s\"", name); + if (m_opt) + printf(",\"%s\"", modifier); + } else { + printf("%-*s", widths0, name); + if (m_opt) + printf(" %-*s", widths1, modifier); + } + for (k = 0; k < count; ++k) { + set_curterm(terms[k]); + if (t_opt) { + printf(",\"%s\"", termname()); + } else if (k + 1 >= count) { + printf(" %s", termname()); + } else { + printf(" %-*s", widths2, termname()); + } + } + printf("\n"); + + widthsx = widths0 + ((count + 1) * widths2); + + for (j = 0; Name(j) != 0; ++j) { + if (j == 0 || (Type(j) != Type(j - 1))) + draw_line(widthsx); + if (valid_key(Name(j), terms, count)) { + const char *label = f_opt ? full_name(Name(j)) : Name(j); + if (t_opt) { + printf("\"%s\"", label); + if (m_opt) + printf(",\"%s\"", modified_key(Name(j))); + } else { + printf("%-*s", widths0, label); + if (m_opt) + printf(" %-*s", widths1, modified_key(Name(j))); + } + for (k = 0; k < count; ++k) { + printf(t_opt ? "," : " "); + set_curterm(terms[k]); + check = show_key(Name(j), TRUE); + if (!t_opt) { + if (k + 1 < count) { + printf("%*s", widths2 - check, " "); + } + } + } + printf("\n"); + } + } + free(list); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: list_keys [options] [terminal [terminal2 [...]]]" + ,"" + ,"Print capabilities for terminal special keys." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f print full names" + ," -m print modifier-column for shift/control keys" + ," -t print result as CSV table" +#ifdef NCURSES_VERSION + ," -x print extended capabilities" +#endif + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + TERMINAL **terms = typeCalloc(TERMINAL *, argc + 1); + + while ((ch = getopt(argc, argv, OPTS_COMMON "fmtx")) != -1) { + switch (ch) { + case 'f': + f_opt = TRUE; + break; + case 'm': + m_opt = TRUE; + break; + case 't': + t_opt = TRUE; + break; +#if NCURSES_XNAMES || HAVE_USE_EXTENDED_NAMES + case 'x': + x_opt = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + +#if HAVE_USE_EXTENDED_NAMES + use_extended_names(x_opt); +#endif + + if (optind < argc) { + int found = 0; + int status; + int n; + for (n = optind; n < argc; ++n) { + setupterm((NCURSES_CONST char *) argv[n], 1, &status); + if (status > 0 && cur_term != 0) { + terms[found++] = cur_term; + } + } + if (found) + list_keys(terms, found); + } else { + setupterm(NULL, 1, (int *) 0); + terms[0] = cur_term; + list_keys(terms, 1); + } + + free(terms); + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the terminfo arrays\n"); + ExitProgram(EXIT_FAILURE); +} +#endif +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + printf("This program requires the terminfo functions such as tigetstr\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/listused.sh b/contrib/ncurses/test/listused.sh new file mode 100755 index 00000000..45653ebd --- /dev/null +++ b/contrib/ncurses/test/listused.sh @@ -0,0 +1,186 @@ +#!/bin/sh +############################################################################## +# Copyright 2020-2021,2022 Thomas E. Dickey # +# Copyright 2003-2006,2010 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: listused.sh,v 1.12 2022/07/16 16:33:38 tom Exp $ +# A very simple script to list all entrypoints that are used by either a test +# program, or within the libraries. This relies on the output format of 'nm', +# and assumes that the libraries are configured with TRACE defined, and using +# these options: +# --disable-macros +# --enable-opaque-curses +# --enable-sp-funcs +# --enable-widec +# --without-gpm +# Static libraries are used, to provide some filtering based on internal usage +# of the different symbols. + +# keep the sorting independent of locale: +if test "${LANGUAGE+set}" = set; then LANGUAGE=C; export LANGUAGE; fi +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +if test "${LC_COLLATE+set}" = set; then LC_COLLATE=C; export LC_COLLATE; fi + +NM_OPTS= + +if test ! -d ../objects ; then + echo "? need objects to run this script" + exit 1 +elif test ! -d ../lib ; then + echo "? need libraries to run this script" + exit 1 +fi + +PROGS= +for name in `(echo "test:";sort modules; echo "progs:";sort ../progs/modules) |sed -e 's/[ ].*//' -e '/^[#@]/d'` +do + case $name in + *:) + PROGS="$PROGS $name" + ;; + *) + NAME=../objects/${name}.o + if test -f "$NAME" + then + PROGS="$PROGS $NAME" + fi + ;; + esac +done + +# For each library - +for lib in ../lib/*.a +do + LIB=`basename "$lib" .a` + case $LIB in + *_*|*+*) + continue + ;; + esac + + tmp=`echo "$LIB"|sed -e 's/w$//'` + echo + echo "${tmp}:" + echo "$tmp" |sed -e 's/./-/g' + # Construct a list of public externals provided by the library. + WANT=`nm $NM_OPTS "$lib" |\ + sed -e 's/^[^ ]*//' \ + -e 's/^ *//' \ + -e '/^[ a-z] /d' \ + -e '/:$/d' \ + -e '/^$/d' \ + -e '/^U /d' \ + -e 's/^[A-Z] //' \ + -e '/^_/d' |\ + sort -u` + # List programs which use that external. + for name in $WANT + do + HAVE= + tags= + last= + for prog in $PROGS + do + case $prog in + *:) + tags=$prog + ;; + *) + TEST=`nm $NM_OPTS "$prog" |\ + sed -e 's/^[^ ]*//' \ + -e 's/^ *//' \ + -e '/^[ a-z] /d' \ + -e '/:$/d' \ + -e '/^$/d' \ + -e 's/^[A-Z] //' \ + -e '/^_/d' \ + -e 's/^'${name}'$/_/' \ + -e '/^[^_]/d'` + if test -n "$TEST" + then + have=`basename "$prog" .o` + if test -n "$HAVE" + then + if test "$last" = "$tags" + then + HAVE="$HAVE $have" + else + HAVE="$HAVE $tags $have" + fi + else + HAVE="$tags $have" + fi + last="$tags" + fi + ;; + esac + done + # if we did not find a program using it directly, see if it + # is used within a library. + if test -z "$HAVE" + then + for tmp in ../lib/*.a + do + case $tmp in + *_*|*+*) + continue + ;; + esac + TEST=`nm $NM_OPTS "$tmp" |\ + sed -e 's/^[^ ]*//' \ + -e 's/^ *//' \ + -e '/^[ a-z] /d' \ + -e '/:$/d' \ + -e '/^$/d' \ + -e '/^[A-TV-Z] /d' \ + -e 's/^[A-Z] //' \ + -e '/^_/d' \ + -e 's/^'${name}'$/_/' \ + -e '/^[^_]/d'` + if test -n "$TEST" + then + tmp=`basename "$tmp" .a |sed -e 's/w$//'` + HAVE=`echo "$tmp" | sed -e 's/lib/lib: /'` + break + fi + done + fi + test -z "$HAVE" && HAVE="-" + lenn=`expr 39 - length "$name"` + lenn=`expr "$lenn" / 8` + tabs= + while test "$lenn" != 0 + do + tabs="${tabs} " + lenn=`expr "$lenn" - 1` + done + echo "${name}${tabs}${HAVE}" + done +done diff --git a/contrib/ncurses/test/lrtest.c b/contrib/ncurses/test/lrtest.c new file mode 100644 index 00000000..0e609d01 --- /dev/null +++ b/contrib/ncurses/test/lrtest.c @@ -0,0 +1,214 @@ +/**************************************************************************** + * Copyright 2019-2020,2022 Thomas E. Dickey * + * Copyright 1998-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * Test lower-right-hand corner access + * + * originally by Eric S. Raymond , written for animation + * and resizing -T.Dickey + * + * This can't be part of the ncurses test-program, because ncurses rips off the + * bottom line to do labels. + * + * $Id: lrtest.c,v 1.29 2022/12/10 23:44:18 tom Exp $ + */ + +#include + +typedef struct { + int y, x, mode, dir, inc; + chtype value; +} MARK; + +/* + * Make a couple of markers go 'round the border to demonstrate that we can + * really write to all positions properly. + */ +static void +show(MARK *m) +{ + MvAddCh(m->y, m->x, m->value); + if (m->mode == 0) { /* along the x-direction */ + m->x += m->inc; + if (m->x >= COLS) { + m->x = COLS - 1; + m->inc = -m->dir * m->inc; + m->y += m->inc; + m->mode = 1; + } else if (m->x < 0) { + m->x = 0; + m->inc = -m->dir * m->inc; + m->y += m->inc; + m->mode = 1; + } + } else { /* along the y-direction */ + m->y += m->inc; + if (m->y >= LINES) { + m->y = LINES - 1; + m->inc = m->dir * m->inc; + m->x += m->inc; + m->mode = 0; + } else if (m->y < 0) { + m->y = 0; + m->inc = m->dir * m->inc; + m->x += m->inc; + m->mode = 0; + } + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: lrtest [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static MARK marks[] = + { + {0, 0, 0, -1, 1, '+' | A_BOLD}, + {0, 0, 1, 1, 2, 'X'}, + {0, 0, 1, -1, 3, 'Y'}, + {0, 8, 0, -1, 1, '+' | A_BOLD}, + {0, 9, 0, -1, 1, '+' | A_BOLD}, + {1, 0, 1, 1, 1, '*' | A_REVERSE}, + {2, 0, 1, 1, 1, '*' | A_REVERSE} + }; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + initscr(); + noecho(); + cbreak(); + nodelay(stdscr, TRUE); + curs_set(0); + +#ifdef KEY_RESIZE + keypad(stdscr, TRUE); + restart: +#endif + move(LINES / 2 - 1, 4); + if (!(has_ic() +#if HAVE_SETUPTERM + /* see PutCharLR() */ + || auto_right_margin + || (enter_am_mode && exit_am_mode) +#endif + )) { + addstr("Your terminal lacks the capabilities needed to address the\n"); + move(LINES / 2, 4); + addstr("lower-right-hand corner of the screen.\n"); + } else { + addstr("This is a test of access to the lower right corner.\n"); + move(LINES / 2, 4); + addstr("If the top of the box is missing, the test failed.\n"); + move(LINES / 2 + 1, 4); + addstr("Please report this (with a copy of your terminfo entry).\n"); + move(LINES / 2 + 2, 4); + addstr("to the ncurses maintainers, at bug-ncurses@gnu.org.\n"); + } + + for (;;) { + int c2; + unsigned n; + + box(stdscr, 0, 0); + for (n = 0; n < SIZEOF(marks); n++) { + show(&marks[n]); + } + + if ((c2 = getch()) > 0) { + if (c2 == 'q') + break; + else if (c2 == 's') + nodelay(stdscr, FALSE); + else if (c2 == ' ') + nodelay(stdscr, TRUE); +#ifdef TRACE + else if (c2 == 'T') + curses_trace(0); + else if (c2 == 't') + curses_trace(TRACE_CALLS | TRACE_ICALLS | TRACE_UPDATE); +#endif +#ifdef KEY_RESIZE + else if (c2 == KEY_RESIZE) { + for (n = 0; n < SIZEOF(marks); n++) { + if (marks[n].mode == 0) { /* moving along x-direction */ + if (marks[n].y) + marks[n].y = LINES - 1; + } else { + if (marks[n].x) + marks[n].x = COLS - 1; + } + } + flash(); + erase(); + wrefresh(curscr); + goto restart; + } +#endif + } + napms(50); + refresh(); + } + + stop_curses(); + ExitProgram(EXIT_SUCCESS); +} + +/* lrtest.c ends here */ diff --git a/contrib/ncurses/test/make-tar.sh b/contrib/ncurses/test/make-tar.sh new file mode 100755 index 00000000..df4b66aa --- /dev/null +++ b/contrib/ncurses/test/make-tar.sh @@ -0,0 +1,163 @@ +#!/bin/sh +# $Id: make-tar.sh,v 1.21 2022/11/05 19:41:33 tom Exp $ +############################################################################## +# Copyright 2019-2021,2022 Thomas E. Dickey # +# Copyright 2010-2015,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# Construct a tar-file containing only the test tree as well as its associated +# scripts. The reason for doing that is to simplify distributing the test +# programs as a separate package. + +CDPATH=: +export CDPATH + +TARGET=`pwd` + +: "${PKG_NAME:=ncurses-examples}" +: "${ROOTNAME:=ncurses-test}" +: "${DESTDIR:=$TARGET}" +: "${TMPDIR:=/tmp}" + +# make timestamps of generated files predictable +same_timestamp() { + [ -f ../NEWS ] || echo "OOPS $1" + touch -r ../NEWS "$1" +} + +grep_assign() { + grep_assign=`grep -E "^$2\>" "$1" | sed -e "s/^$2[ ]*=[ ]*//" -e 's/"//g'` + eval "$2"=\""$grep_assign"\" +} + +grep_patchdate() { + grep_assign ../dist.mk NCURSES_MAJOR + grep_assign ../dist.mk NCURSES_MINOR + grep_assign ../dist.mk NCURSES_PATCH +} + +# The rpm spec-file in the ncurses tree is a template. Fill in the version +# information from dist.mk +edit_specfile() { + sed \ + -e "s/\\/$NCURSES_MAJOR/g" \ + -e "s/\\/$NCURSES_MINOR/g" \ + -e "s/\\/$NCURSES_PATCH/g" "$1" >"$1.new" + chmod u+w "$1" + mv "$1.new" "$1" + same_timestamp "$1" +} + +make_changelog() { + [ -f "$1" ] && chmod u+w "$1" + cat >"$1" <MANIFEST ) +same_timestamp $BUILD/$ROOTNAME/MANIFEST + +cd $BUILD || exit + +# Remove build-artifacts. +find . -name RCS -exec rm -rf {} \; +find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null +find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null +find $BUILD/$ROOTNAME -type d -exec rmdir {} \; 2>/dev/null + +# There is no need for this script in the tar file. +rm -f $ROOTNAME/make-tar.sh + +# Remove build-artifacts. +find . -name "*.gz" -exec rm -rf {} \; + +# Make the files writable... +chmod -R u+w . + +# Cleanup timestamps +[ -n "$TOUCH_DIRS" ] && "$TOUCH_DIRS" "$ROOTNAME" + +tar cf - $TAR_OPTIONS $ROOTNAME | gzip >"$DESTDIR/$ROOTNAME.tar.gz" +cd "$DESTDIR" || exit + +pwd +ls -l $ROOTNAME.tar.gz + +# vi:ts=4 sw=4 diff --git a/contrib/ncurses/test/mensetmanus.xbm b/contrib/ncurses/test/mensetmanus.xbm new file mode 100644 index 00000000..095b8ec4 --- /dev/null +++ b/contrib/ncurses/test/mensetmanus.xbm @@ -0,0 +1,258 @@ +#define mensetmanus_width 161 +#define mensetmanus_height 145 + +static char mensetmanus_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0xdb, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07, + 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf7, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x61, 0x00, 0x00, 0xc6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xff, + 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xe1, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc3, 0xf6, 0x1f, 0x00, 0x00, + 0x00, 0xc0, 0xc0, 0xff, 0xff, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x9f, 0x65, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0x00, + 0x07, 0x80, 0x87, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x9f, 0x6d, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xc7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x89, 0x6d, + 0x1b, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, + 0x00, 0xc0, 0xe1, 0x5b, 0xdb, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x80, 0x83, + 0x5b, 0xdb, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x81, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x5b, 0x1b, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x80, 0x6d, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x5b, 0x1b, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x80, 0x6d, 0x1b, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x5b, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xe0, 0x83, 0x6d, 0x19, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x5b, 0x0b, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0x83, 0x6d, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5b, 0x0f, 0x0e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x6d, + 0x1b, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4b, 0x0f, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x79, 0x1b, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x6b, 0xbf, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xfb, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x6d, 0xb7, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xed, 0xf7, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xfe, + 0x7f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xed, 0xd7, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0xf8, 0xff, 0x07, 0x00, + 0x00, 0x00, 0xe0, 0xfe, 0xd7, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0x7f, 0xe0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xf0, + 0xff, 0xd6, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xbf, 0x73, 0x80, 0x3b, 0x7c, 0x00, 0x00, 0x00, 0xf8, 0xe7, 0xd6, 0xef, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xb9, 0x73, 0xc0, + 0x3b, 0xf0, 0x01, 0x00, 0x00, 0xff, 0xc3, 0xbf, 0xe7, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0xb8, 0x7f, 0xe0, 0x3b, 0xc0, 0x03, + 0x00, 0xc0, 0xbf, 0xc7, 0xbf, 0xe7, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0xb8, 0xff, 0xf8, 0x3b, 0x80, 0x07, 0x00, 0xe0, 0x61, + 0x87, 0xfd, 0xe7, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0xb8, 0xf3, 0xff, 0x3b, 0x00, 0x0f, 0x00, 0x78, 0x60, 0x8e, 0xf1, 0x67, + 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xb8, 0xc3, 0x8f, + 0x7b, 0x00, 0x0e, 0x00, 0x38, 0xe0, 0x8c, 0x03, 0x66, 0x87, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0xb8, 0x03, 0x83, 0x7b, 0x00, 0x1e, + 0x00, 0x1c, 0xe0, 0x1d, 0x03, 0x76, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x07, 0xb8, 0xe3, 0x8f, 0xbb, 0x01, 0x39, 0x00, 0x1e, 0xe0, + 0x3b, 0x03, 0xf6, 0x87, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, + 0xb8, 0xe3, 0x8f, 0x3b, 0xc6, 0x38, 0x00, 0x17, 0xe0, 0x73, 0x07, 0xfe, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0b, 0xb8, 0xe7, 0x8e, + 0x3b, 0x38, 0x78, 0x00, 0x13, 0xe0, 0x77, 0x06, 0xfe, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0xe0, 0x12, 0x3c, 0xff, 0xce, 0x3b, 0x00, 0x78, + 0x80, 0x13, 0x60, 0xef, 0x0e, 0xfe, 0x00, 0x00, 0x60, 0x08, 0x00, 0x00, + 0x00, 0x70, 0x22, 0x3e, 0xfc, 0xfe, 0x39, 0x00, 0xe8, 0x80, 0x61, 0x60, + 0xce, 0x0f, 0xfe, 0x00, 0x00, 0x60, 0xf8, 0x00, 0x00, 0x00, 0x70, 0xc2, + 0x39, 0xf8, 0x7e, 0x38, 0x00, 0xc8, 0xc0, 0x81, 0x71, 0xde, 0x0f, 0xfe, + 0x00, 0x00, 0x60, 0x88, 0x00, 0x00, 0x00, 0x70, 0x04, 0x38, 0xe0, 0x0e, + 0x38, 0x00, 0xc4, 0xc0, 0x01, 0x7e, 0xbc, 0x1f, 0xfe, 0x00, 0x00, 0x60, + 0x88, 0x00, 0x00, 0x00, 0x78, 0x04, 0x38, 0xe0, 0x0e, 0x38, 0x00, 0xc4, + 0xc1, 0x01, 0x60, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x60, 0x84, 0x0f, 0x00, + 0x00, 0x78, 0x08, 0x38, 0xe0, 0x0f, 0x38, 0x00, 0x82, 0xe1, 0x01, 0x60, + 0x74, 0x3e, 0xfe, 0x00, 0x00, 0x60, 0x44, 0x08, 0x00, 0x00, 0xb8, 0x10, + 0x38, 0xe0, 0x0f, 0x38, 0x00, 0x81, 0xe1, 0x00, 0x60, 0xe4, 0x3e, 0xfe, + 0x00, 0x00, 0x60, 0x44, 0x08, 0x00, 0x00, 0x98, 0x20, 0x38, 0xf8, 0x3f, + 0x38, 0x80, 0x80, 0xe1, 0x01, 0x60, 0xc4, 0x3c, 0xfe, 0x00, 0x00, 0x60, + 0x24, 0x0c, 0x00, 0x00, 0x1c, 0xc1, 0x39, 0x3c, 0x78, 0x38, 0x40, 0x80, + 0x61, 0x01, 0x60, 0xc4, 0x79, 0xfe, 0x00, 0x00, 0x60, 0x22, 0x32, 0x00, + 0x00, 0x1c, 0x01, 0x3e, 0x1c, 0xf0, 0x38, 0xf0, 0x9f, 0x61, 0x01, 0x60, + 0x84, 0x7b, 0xee, 0x00, 0x00, 0x60, 0x12, 0x21, 0x00, 0x00, 0x1c, 0x02, + 0x38, 0x0e, 0xe7, 0xf8, 0x3f, 0xe0, 0x61, 0x00, 0x60, 0x04, 0xf7, 0xce, + 0x00, 0x00, 0x60, 0x92, 0x10, 0x00, 0x00, 0x1c, 0x04, 0x38, 0x06, 0xff, + 0x38, 0x40, 0x80, 0x61, 0x02, 0x60, 0x04, 0xe7, 0xcf, 0x00, 0x00, 0x60, + 0x8a, 0x18, 0x00, 0x00, 0x1c, 0x18, 0x38, 0x07, 0xf0, 0x38, 0x00, 0x81, + 0x61, 0x02, 0x60, 0x04, 0xee, 0xcf, 0xff, 0x03, 0x60, 0x49, 0xe4, 0x00, + 0x00, 0x1c, 0x70, 0x38, 0x07, 0xe7, 0x38, 0x00, 0x82, 0x61, 0x04, 0x60, + 0x04, 0xdc, 0xcf, 0x01, 0x04, 0x60, 0x25, 0x42, 0x00, 0x00, 0x1c, 0xfe, + 0x3f, 0x03, 0xff, 0x38, 0x00, 0x84, 0x61, 0x08, 0x60, 0x04, 0xfc, 0xcf, + 0xf8, 0xff, 0x60, 0x95, 0x31, 0x00, 0x00, 0xfc, 0x01, 0xff, 0x03, 0xf0, + 0xf8, 0x1f, 0x88, 0x61, 0x10, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0xe1, + 0x53, 0x0c, 0x00, 0x00, 0x38, 0xf0, 0xff, 0x03, 0xef, 0xf8, 0x7f, 0x90, + 0x61, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x00, 0xff, 0xe3, 0x2b, 0xfe, 0x00, + 0x00, 0x18, 0xf8, 0xff, 0x03, 0xff, 0x7c, 0xf0, 0x90, 0x61, 0x00, 0x3e, + 0x36, 0xe3, 0xe1, 0x00, 0x00, 0xe3, 0x9f, 0x60, 0x00, 0x00, 0x38, 0x3c, + 0x00, 0x03, 0xf0, 0x1f, 0xe0, 0xa0, 0xe1, 0x00, 0x30, 0x22, 0xe2, 0xc0, + 0x00, 0xff, 0xe3, 0x7f, 0x18, 0x00, 0x00, 0x38, 0x0e, 0x00, 0x07, 0xe7, + 0x07, 0xc0, 0xe1, 0xc1, 0x00, 0x18, 0x22, 0xe2, 0xc0, 0x00, 0x00, 0xe1, + 0x1f, 0x07, 0x00, 0x00, 0x38, 0x06, 0x00, 0x07, 0xef, 0x01, 0xc0, 0xc1, + 0xc1, 0x01, 0x16, 0x24, 0xe2, 0xc0, 0x01, 0xff, 0xe1, 0xff, 0x00, 0x00, + 0x00, 0x70, 0x07, 0x00, 0x0e, 0xf8, 0x00, 0x80, 0xc3, 0xc0, 0xf1, 0x11, + 0x24, 0xe4, 0xc0, 0x03, 0xe0, 0xe1, 0x7f, 0x00, 0x00, 0x00, 0x70, 0x07, + 0x00, 0x1e, 0x3c, 0x00, 0x80, 0xe3, 0x80, 0x0f, 0x10, 0x24, 0xe4, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xfc, 0x0f, + 0x00, 0x00, 0x63, 0x80, 0x01, 0x08, 0x44, 0xe4, 0xc0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x01, 0x00, 0xe0, 0x03, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x73, + 0x80, 0x03, 0x08, 0x44, 0xe4, 0xc0, 0xfc, 0x00, 0x07, 0x0e, 0x00, 0x00, + 0x00, 0xc0, 0x03, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x33, 0x00, 0x03, 0x08, + 0x44, 0xe4, 0xe0, 0xcc, 0x00, 0x07, 0x0e, 0x00, 0x00, 0x00, 0xc0, 0x03, + 0x00, 0x78, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x07, 0x04, 0x44, 0xe8, 0x70, + 0xcc, 0x01, 0x87, 0x0f, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x3e, 0x00, + 0x00, 0x80, 0x1f, 0x00, 0x0e, 0x04, 0x44, 0xe8, 0x38, 0xcc, 0x81, 0xe7, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x80, 0x0f, + 0x00, 0x1c, 0x02, 0x44, 0xf8, 0x1e, 0xcc, 0xe1, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xc0, 0x23, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x38, 0x01, + 0x42, 0xfc, 0x0f, 0xcc, 0xf1, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, + 0xf0, 0x39, 0x00, 0x00, 0xe0, 0x03, 0x00, 0xf0, 0x00, 0xc2, 0xff, 0x07, + 0xcc, 0x7f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x7c, 0x0e, 0x00, + 0x00, 0xf0, 0x01, 0x00, 0xe0, 0x03, 0xe2, 0xe7, 0x07, 0xcc, 0x1f, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xbf, 0x23, 0xe0, 0xff, 0xff, 0x00, + 0x00, 0xc0, 0x1f, 0xff, 0x64, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0x3c, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, + 0x7f, 0x64, 0x06, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, + 0xf8, 0x1f, 0x78, 0x7c, 0x7f, 0x00, 0x00, 0x00, 0xfc, 0x20, 0x64, 0x06, + 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xf8, 0x33, 0x1c, + 0x38, 0x66, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x6c, 0x06, 0xcc, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x3e, 0x0e, 0x38, 0x76, 0x00, + 0x00, 0x00, 0x0c, 0x20, 0x68, 0x06, 0xcc, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x38, 0xf8, 0x87, 0x0f, 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, + 0x20, 0x68, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, + 0x78, 0xf8, 0x0f, 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, + 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf8, 0xff, 0x0f, + 0x38, 0x76, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, 0xcc, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xf8, 0xff, 0x0e, 0x38, 0x76, 0x00, + 0x00, 0x00, 0x0c, 0x10, 0x68, 0x06, 0xcc, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1c, 0xf8, 0xe1, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, + 0x08, 0x68, 0x06, 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, + 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, 0x08, 0x68, 0x06, + 0xcc, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0xe0, 0x0e, + 0x38, 0x3e, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x68, 0x06, 0xcc, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, + 0x00, 0x00, 0x1c, 0x04, 0x68, 0x06, 0xcc, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, + 0x02, 0x68, 0x06, 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x02, 0x68, 0x06, + 0xcc, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0xe0, 0x0e, + 0x38, 0x3e, 0x00, 0x00, 0x00, 0x1c, 0x01, 0x68, 0x06, 0xcc, 0x1c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, + 0x00, 0x00, 0x18, 0x01, 0x68, 0x06, 0xcc, 0x1c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x98, + 0x00, 0x68, 0x06, 0xcc, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, + 0x38, 0xe0, 0x0e, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x98, 0x00, 0x68, 0x06, + 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x38, 0xe0, 0x0e, + 0x38, 0x1e, 0x00, 0x00, 0x00, 0x58, 0x00, 0x6c, 0x0e, 0xcc, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xe0, 0x0e, 0x38, 0x1e, 0x00, + 0x00, 0x00, 0x38, 0x00, 0x64, 0x0e, 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x01, 0x70, 0xe0, 0x0e, 0x1c, 0x1e, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x64, 0x1e, 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, + 0xe0, 0xe1, 0x0e, 0x0f, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x3e, + 0xcc, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0xef, 0xce, + 0x07, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x3e, 0xcc, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xff, 0xfe, 0x03, 0x1e, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x64, 0x7e, 0xcc, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, + 0x00, 0x64, 0x66, 0xcc, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x00, 0xe0, 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x66, 0xe6, + 0xcc, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xe0, 0x0e, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x18, 0x00, 0x62, 0xc6, 0xcd, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xfe, 0xff, 0x0f, 0x1e, 0x00, + 0x00, 0x00, 0x18, 0x00, 0x62, 0xc6, 0xcd, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0xc0, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x62, 0x86, 0xcf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, + 0xf0, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x61, 0x86, + 0xcf, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0xfc, 0x00, 0x00, + 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x38, 0x00, 0x61, 0x8e, 0xcf, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0x00, 0x0e, 0x0e, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0x7f, 0xfe, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0x00, 0xf0, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xf0, + 0xff, 0x3f, 0xff, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, + 0xe0, 0x01, 0x00, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x8f, 0x07, + 0x9e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xe0, 0x07, 0x00, + 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x30, 0x00, 0xc0, 0xff, 0x3f, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xf0, + 0xff, 0xff, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, + 0x38, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x38, 0x00, 0x38, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0xdc, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, + 0x38, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x9c, 0x03, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x18, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x07, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x1c, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0c, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x1c, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0c, 0x00, + 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, + 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0e, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x1c, 0x1c, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, + 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x1c, 0x00, + 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x07, 0x06, 0x00, 0x18, 0x38, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x06, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0xfc, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0e, 0x00, 0x18, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, + 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x0e, 0x00, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, + 0x38, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x38, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x1c, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x18, 0x00, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, + 0x1e, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x18, 0x00, + 0x30, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x1e, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x30, 0xe0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x0c, 0x3c, 0x00, 0x30, 0xf0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x03, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x7e, 0x00, 0x70, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x0f, + 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xe7, 0x00, + 0x70, 0xbc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1f, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xdc, 0xe3, 0x00, 0x60, 0x1e, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x0f, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xc1, 0x01, 0xe0, 0x0f, 0x0f, 0x00, 0x00, 0x00, + 0x80, 0x07, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0xf8, 0x80, 0x03, 0xe0, 0x03, 0x1e, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xe0, + 0x1b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x78, 0x80, 0x07, + 0xe0, 0x01, 0x1c, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xc0, 0x1b, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x0f, 0xe0, 0x01, 0x38, + 0x00, 0x00, 0x00, 0xf0, 0x00, 0xc0, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x30, 0x0e, 0x1e, 0xc0, 0x71, 0xf8, 0x00, 0x00, 0x00, + 0x78, 0x00, 0xdc, 0x19, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x1f, 0x1e, 0xc0, 0xf9, 0xf8, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; diff --git a/contrib/ncurses/test/mini.xterm_48x48.xpm b/contrib/ncurses/test/mini.xterm_48x48.xpm new file mode 100644 index 00000000..c4738f8e --- /dev/null +++ b/contrib/ncurses/test/mini.xterm_48x48.xpm @@ -0,0 +1,264 @@ +/* XPM */ +static char * mini_xterm_48x48_xpm[] = { +"48 48 213 2", +" c None", +". c #FF0000", +"+ c #FF5300", +"@ c #FF5E00", +"# c #FF4800", +"$ c #FF4200", +"% c #FF4000", +"& c #FF4B00", +"* c #FF5200", +"= c #FF5400", +"- c #FF3500", +"; c #FF5100", +"> c #FF5C00", +", c #FF3000", +"' c #FF4500", +") c #FF2000", +"! c #FF0300", +"~ c #FF1600", +"{ c #FF5D00", +"] c #FF3800", +"^ c #FF0200", +"/ c #FF0900", +"( c #FF2B00", +"_ c #FF3300", +": c #FF1A00", +"< c #FF1300", +"[ c #FF1200", +"} c #FF5700", +"| c #4577BA", +"1 c #874E78", +"2 c #887577", +"3 c #887E77", +"4 c #887977", +"5 c #875078", +"6 c #566CA9", +"7 c #5E70A1", +"8 c #884E77", +"9 c #887677", +"0 c #7C5B83", +"a c #795686", +"b c #008DFE", +"c c #0012F3", +"d c #000BF2", +"e c #008FFE", +"f c #006CFA", +"g c #0000F1", +"h c #0001F1", +"i c #0020F4", +"j c #0040F6", +"k c #0959F0", +"l c #1158E8", +"m c #1159E8", +"n c #0058F9", +"o c #001DF4", +"p c #0023F4", +"q c #005BFA", +"r c #0060FA", +"s c #0E58EB", +"t c #0651F3", +"u c #0033F5", +"v c #000EF2", +"w c #006EFA", +"x c #0092FF", +"y c #001FF4", +"z c #000FF2", +"A c #0C51EC", +"B c #326AC9", +"C c #7A6583", +"D c #CA6234", +"E c #FC5F03", +"F c #FF5800", +"G c #FF0800", +"H c #F4060B", +"I c #007CFB", +"J c #0013F3", +"K c #007EFB", +"L c #FF1800", +"M c #F3590C", +"N c #AB6152", +"O c #4F4EAD", +"P c #175CE4", +"Q c #0036F5", +"R c #0022F4", +"S c #0095FD", +"T c #0084FD", +"U c #0004F1", +"V c #0051F8", +"W c #345AC7", +"X c #E61519", +"Y c #FF5900", +"Z c #FF4600", +"` c #FF0100", +" . c #446EB9", +".. c #0034F6", +"+. c #0032F5", +"@. c #FF2200", +"#. c #006FFA", +"$. c #002DF5", +"%. c #0086FD", +"&. c #0046F7", +"*. c #0015F3", +"=. c #0076FC", +"-. c #FF0400", +";. c #FF2300", +">. c #FF2900", +",. c #9E3E61", +"'. c #0039F6", +"). c #FF2A00", +"!. c #FF4300", +"~. c #0071FB", +"{. c #005EF9", +"]. c #004DF7", +"^. c #008CFE", +"/. c #0008F2", +"(. c #001DF3", +"_. c #007DFB", +":. c #FF4100", +"<. c #FF5B00", +"[. c #A3425C", +"}. c #994C66", +"|. c #FF1100", +"1. c #0072FB", +"2. c #000AF2", +"3. c #006EFC", +"4. c #0017F3", +"5. c #007FFB", +"6. c #FF0600", +"7. c #FF5600", +"8. c #A56A5A", +"9. c #A53B5A", +"0. c #FF4F00", +"a. c #0076FB", +"b. c #0076FA", +"c. c #0093FF", +"d. c #007DFC", +"e. c #FF1C00", +"f. c #A5765A", +"g. c #A55D5A", +"h. c #006FFB", +"i. c #002CF5", +"j. c #008AFD", +"k. c #006BF9", +"l. c #FF3A00", +"m. c #FF5000", +"n. c #007BFB", +"o. c #008BFD", +"p. c #A5755A", +"q. c #9A5565", +"r. c #A43A5B", +"s. c #FF4D00", +"t. c #80507F", +"u. c #FF0F00", +"v. c #7A5485", +"w. c #A5555A", +"x. c #FF0A00", +"y. c #A53D5A", +"z. c #A4515B", +"A. c #A5685A", +"B. c #A5735A", +"C. c #FF0700", +"D. c #FF2E00", +"E. c #FF1500", +"F. c #A3705C", +"G. c #FF0500", +"H. c #9A4965", +"I. c #FF0E00", +"J. c #FF3B00", +"K. c #FF2D00", +"L. c #A13C5E", +"M. c #FF4C00", +"N. c #62649D", +"O. c #FF0B00", +"P. c #FF4700", +"Q. c #FF1D00", +"R. c #A56D5A", +"S. c #FF2C00", +"T. c #A4465B", +"U. c #FF1400", +"V. c #A03E61", +"W. c #FF3100", +"X. c #FF1B00", +"Y. c #FF1000", +"Z. c #0029F5", +"`. c #0027F4", +" + c #4571BA", +".+ c #FF3900", +"++ c #FF3200", +"@+ c #008EFD", +"#+ c #0019F3", +"$+ c #0090FD", +"%+ c #FF0D00", +"&+ c #FF1E00", +"*+ c #FF4E00", +"=+ c #0088FC", +"-+ c #0087FC", +";+ c #FF1900", +">+ c #0036F6", +",+ c #FF2100", +"'+ c #0073FB", +")+ c #0062FA", +"!+ c #001AF3", +"~+ c #2463D8", +"{+ c #3E58BE", +"]+ c #2A7FD3", +"^+ c #807B7F", +"/+ c #008EFB", +"(+ c #006AFA", +"_+ c #004CF8", +":+ c #717B8D", +"<+ c #EE0B11", +"[+ c #F73E08", +"}+ c #FF1F00", +"|+ c #FF5500", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ . . # @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . % & & & * @ @ @ @ @ = & & & & & . . - & & & & & ; @ > & & & & , . ", +" . . . . . . * @ @ @ @ ; . . . . . . . . . . . . . ' @ ) . . . . . . ", +" ! ~ { @ @ @ @ ] ^ / ( @ $ . ", +" ^ _ @ @ @ @ @ : ! < [ > } ^ . ", +" | 1 2 3 3 3 3 4 5 6 7 8 9 3 0 a ", +" b c d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d c e ", +" f g g g g g g h i j k l m n o g g g g g g p q r s t u v g g g g g g g w ", +" x y g g g g z A B C D E F G H I c g g g g J K L / M N O P Q h g g g g R S ", +" T g g g U V W X Y @ @ @ @ Z ` ...g g g g +. ` ' @ @.. #.$.g g g g %. ", +" &.g g *.=. -.;.@ @ @ @ @ >.,.'.g g g g '. / ).@ !.. ~.{.U g g ]. ", +" ^./.g (._. ` :.@ @ @ @ <.[.'.g g g g '.}.|.<.} ^ . 1.2.g d e ", +" 3.g 4.5. 6.7.@ @ @ @ 8.'.g g g g '.9.0.@ [ . a./.g b. ", +" c.R /.d. -.e.@ @ @ @ f.'.g g g g '.g.@ - . h.h i. ", +" j.k.%. ^ l.@ @ @ f.'.g g g g '.f.m.` n.f o. ", +" ! * @ @ f.'.g g g g '.p.G . ", +" ! ~ { @ f.'.g g g g '.q.. ", +" ^ _ @ f.'.g g g g '.r. ", +" ^ s.f.'.g g g g '.t. ", +" ^ u.p.'.g g g g '.v. ", +" ^ w.'.g g g g '.r. ", +" x.y.'.g g g g '.z.^ ", +" ` A.'.g g g g '.B.x.. ", +" C.D.f.'.g g g g '.f.# ` ", +" < E.{ F.'.g g g g '.f.@ ( ^ ", +" : G.; @ H.'.g g g g '.f.@ <.I.^ ", +" -.J.@ K.L.'.g g g g '.f.@ @ s.` ", +" I.) @ M.. N.'.g g g g '.f.@ @ @ _ ^ ", +" L O.F <.6.. '.g g g g '.f.@ @ @ { E.! ", +" ^ P.@ Q.. '.g g g g '.R.@ @ @ @ * ! ", +" G S.@ % . '.g g g g '.T.{ @ @ @ @ l.^ ", +" < U.> 7.^ ..g g g g u V.W.@ @ @ @ @ e.! ", +" X.-.m.@ Y.. Z.g g g g `. +` M.@ @ @ @ 7.6. ", +" -..+@ ++. @+#+g g g g #+$+^ %+<.@ @ @ @ :.` ", +" I.&+@ *+. =+h g g g g h -+ ! >.@ @ @ @ @ ;.^ ", +" ;+x.} > C.. >+g g g g g g >+ ` Z @ @ @ @ Y / . ", +" ` ' @ ,+. %.1.'+)+!+g g g g g g g g #+)+~+{+]+^+@ @ @ P.` ", +" / ).@ !.. /+(+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+(+:+@ @ @ @ ).^ ", +" I.[ > F . . <+[+@ @ @ @ <.I.` ", +" . . . . . . 0.@ }+. . . . . . . . . . . . . |+@ @ @ @ s.. . . . . . ", +" O.@ @ @ @ @ @ @ @ @ @ @ @ @ ^ ! $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . & & & & & & & & & & & & & . . , & & & & & & & & & & & & & & & , . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" "}; diff --git a/contrib/ncurses/test/mk-test.awk b/contrib/ncurses/test/mk-test.awk new file mode 100644 index 00000000..a194a5d4 --- /dev/null +++ b/contrib/ncurses/test/mk-test.awk @@ -0,0 +1,190 @@ +# $Id: mk-test.awk,v 1.30 2021/12/19 16:54:36 tom Exp $ +############################################################################## +# Copyright 2019-2020,2021 Thomas E. Dickey # +# Copyright 2006-2017,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# generate Makefile for ncurses tests. +BEGIN { + first = 1; + count = 0; + } +/^#/ { + next; + } +/^$/ { + next; + } + { + if (first) { + print "# generated by mk-test.awk\n"; + first = 0; + } + progs[count] = $1; + flags[count] = $2; + using[count] = $3; + files[count] = ""; + for (n = 4; n <= NF; ++n) { + files[count] = sprintf("%s $(MODEL)/%s$o", files[count], $n); + } + count = count + 1; + } +END { + for (n = 0; n < count; ++n) { + if (n == 0) { + printf "TESTS\t= "; + } else { + printf "\t "; + } + printf "$(destdir)%s$x", progs[n]; + if (n < count - 1) { + printf " \\"; + } + print ""; + } + print "SCRIPTS = \\" + print " $(srcdir)/savescreen.sh \\" + print " $(srcdir)/tput-colorcube \\" + print " $(srcdir)/tput-initc \\" + print " $(srcdir)/tracemunch" + print "DATAFILES = \\" + print " $(srcdir)/*.x* \\" + print " $(srcdir)/*.dat" + print "" + print "all:: $(TESTS)" + print "" + print "sources:" + print "" + print "check::" + print " @ echo The test-programs are interactive" + print "tags:" + print " $(CTAGS) *.[ch]" + print "" + print "# no libraries here" + print "libs \\" + print "install.libs \\" + print "uninstall.libs:" + print "" + if (INSTALL == "yes") { + print "# we might install the test-programs" + print "$(PACKAGE) :" + print " @echo \"creating $(PACKAGE) script\"" + print " @$(SHELL) -c '\\" + print " L=$(real_bindir); \\" + print " rm -f $@; \\" + print " echo \"#!$(SHELL)\" > $@;\\" + print " echo \"PATH=\\\"$$L\\\":\\$$PATH\" >>$@;\\" + print " echo \"export PATH\" >>$@;\\" + print " echo \"if test \\$$# != 0; then\" >>$@;\\" + print " echo \" exec \\\"\\$$@\\\"\" >>$@;\\" + print " echo \"elif test -t 1; then\" >>$@;\\" + print " echo \" cd \\\"$$L\\\" || exit\" >>$@;\\" + print " echo \" ls -l | \\$${PAGER:-less}\" >>$@;\\" + print " echo \"fi\" >>$@;\\" + print " echo \"echo \\\"usage: $@ [program]\\\"\" >>$@'" + print "" + print "install \\" + print "install.test: $(PACKAGE) $(BINDIR) $(REAL_BINDIR) $(DATADIR) $(TESTS)" + + print " @echo \"installing $(PACKAGE) -> $(BINDIR)/\"" + print " @$(INSTALL_SCRIPT) $(PACKAGE) $(BINDIR)" + + print " @$(SHELL) -c 'for src in $(TESTS); do \\" + print " dst=`echo $$src | $(TRANSFORM)`; \\" + print " echo \"installing $$src -> $(REAL_BINDIR)/$$dst\"; \\" + print " $(INSTALL_PROG) $$src $(REAL_BINDIR)/$$dst; \\" + print " done'" + + print " @$(SHELL) -c 'for src in $(SCRIPTS); do \\" + print " dst=`echo $$src | sed -e 's,^.*/,,' | $(TRANSFORM)`; \\" + print " echo \"installing $$src -> $(REAL_BINDIR)/$$dst\"; \\" + print " $(INSTALL_SCRIPT) $$src $(REAL_BINDIR)/$$dst; \\" + print " done'" + + print " @$(SHELL) -c 'for src in $(DATAFILES); do \\" + print " dst=`echo $$src | sed -e 's,^.*/,,'`; \\" + print " echo \"installing $$src -> $(DATADIR)/$$dst\"; \\" + print " $(INSTALL_DATA) $$src $(DATADIR)/$$dst; \\" + print " done'" + print "" + print "uninstall \\" + print "uninstall.test:" + + print " -rm -f $(BINDIR)/$(PACKAGE)" + + print " @$(SHELL) -c 'for src in $(TESTS); do \\" + print " dst=`echo $$src | $(TRANSFORM)`; \\" + print " rm -f $(REAL_BINDIR)/$$dst; \\" + print " done'" + + print " @$(SHELL) -c 'for src in $(SCRIPTS); do \\" + print " dst=`echo $$src | sed -e 's,^.*/,,' | $(TRANSFORM)`; \\" + print " rm -f $(REAL_BINDIR)/$$dst; \\" + print " done'" + + print " @$(SHELL) -c 'for src in $(DATAFILES); do \\" + print " dst=`echo $$src | sed -e 's,^.*/,,'`; \\" + print " rm -f $(DATADIR)/$$dst; \\" + print " done'" + } else { + print "install \\" + print "install.test \\" + print "uninstall \\" + print "uninstall.test:" + } + print "" + print "mostlyclean ::" + print " -rm -f core tags TAGS *~ *.bak *.i *.ln *.atac trace" + print "" + print "clean :: mostlyclean" + print " -$(SHELL) -c \"if test -n '$x' ; then $(MAKE) clean x=''; fi\"" + print " -rm -rf *$o screendump *.lis $(TESTS) .libs *.dSYM" + print " -rm -f $(PACKAGE)" + print "" + print "distclean :: clean" + print " -rm -f Makefile ncurses_cfg.h config.status config.log" + print "" + print "realclean :: distclean" + print "" + print "lint:" + print " $(SHELL) -c 'for N in $(TESTS); do echo LINT:$$N; $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(srcdir)/$$N.c $(LINT_LIBS); done'" + print "$(BINDIR) $(REAL_BINDIR) $(DATADIR) :" + print " mkdir -p $@" + + + if (ECHO_LINK != "") { + ECHO_LINK="@ echo linking $@ ... ;" + } + for (n = 0; n < count; ++n) { + print ""; + printf "$(destdir)%s$x:%s %s\n", progs[n], files[n], using[n]; + printf "\t%s$(LINK) -o $@%s %s\n", ECHO_LINK, files[n], flags[n]; + } + + } diff --git a/contrib/ncurses/test/modules b/contrib/ncurses/test/modules new file mode 100644 index 00000000..a3eb5808 --- /dev/null +++ b/contrib/ncurses/test/modules @@ -0,0 +1,126 @@ +# $Id: modules,v 1.80 2024/06/15 19:00:13 tom Exp $ +############################################################################## +# Copyright 2018-2023,2024 Thomas E. Dickey # +# Copyright 1998-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey 1997-on +# +# Test-Program modules + +@ base +back_ground progs $(srcdir) $(HEADER_DEPS) $(srcdir)/color_name.h $(srcdir)/dump_window.h +background progs $(srcdir) $(HEADER_DEPS) $(srcdir)/color_name.h $(srcdir)/dump_window.h +blue progs $(srcdir) $(HEADER_DEPS) +bs progs $(srcdir) $(HEADER_DEPS) +cardfile progs $(srcdir) $(HEADER_DEPS) $(incdir)/panel.h $(incdir)/form.h +chgat progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +clip_printw progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +color_content progs $(srcdir) $(HEADER_DEPS) +color_set progs $(srcdir) $(HEADER_DEPS) +combine progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_window.h $(srcdir)/popup_msg.h +demo_altkeys progs $(srcdir) $(HEADER_DEPS) +demo_defkey progs $(srcdir) $(HEADER_DEPS) +demo_forms progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h +demo_keyok progs $(srcdir) $(HEADER_DEPS) +demo_menus progs $(srcdir) $(HEADER_DEPS) $(incdir)/menu.h +demo_new_pair progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +demo_panels progs $(srcdir) $(HEADER_DEPS) $(incdir)/panel.h +demo_tabs progs $(srcdir) $(HEADER_DEPS) +demo_termcap progs $(srcdir) $(HEADER_DEPS) $(incdir)/term_entry.h $(incdir)/termcap.h +demo_terminfo progs $(srcdir) $(HEADER_DEPS) $(incdir)/term_entry.h +ditto progs $(srcdir) $(HEADER_DEPS) +dots progs $(srcdir) $(HEADER_DEPS) +dots_curses progs $(srcdir) $(HEADER_DEPS) +dots_mvcur progs $(srcdir) $(HEADER_DEPS) +dots_termcap progs $(srcdir) $(HEADER_DEPS) +dots_xcurses progs $(srcdir) $(HEADER_DEPS) +dump_window progs $(srcdir) $(HEADER_DEPS) $(srcdir)/dump_window.h +dup_field progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h $(srcdir)/popup_msg.h +echochar progs $(srcdir) $(HEADER_DEPS) +edit_field progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h $(srcdir)/popup_msg.h +extended_color progs $(srcdir) $(HEADER_DEPS) +filter progs $(srcdir) $(HEADER_DEPS) +firework progs $(srcdir) $(HEADER_DEPS) +firstlast progs $(srcdir) $(HEADER_DEPS) +foldkeys progs $(srcdir) $(HEADER_DEPS) +form_driver_w progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h $(incdir)/form.h +gdc progs $(srcdir) $(HEADER_DEPS) +hanoi progs $(srcdir) $(HEADER_DEPS) +hashtest progs $(srcdir) $(HEADER_DEPS) +inch_wide progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +inchs progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +ins_wide progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h +insdelln progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +inserts progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h +key_names progs $(srcdir) $(HEADER_DEPS) +keynames progs $(srcdir) $(HEADER_DEPS) +knight progs $(srcdir) $(HEADER_DEPS) +list_keys progs $(srcdir) $(HEADER_DEPS) $(incdir)/term_entry.h +lrtest progs $(srcdir) $(HEADER_DEPS) +move_field progs $(srcdir) $(HEADER_DEPS) $(srcdir)/edit_field.h $(srcdir)/popup_msg.h +movewindow progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +ncurses progs $(srcdir) $(HEADER_DEPS) $(incdir)/panel.h $(incdir)/menu.h $(incdir)/form.h +newdemo progs $(srcdir) $(HEADER_DEPS) +padview progs $(srcdir) $(HEADER_DEPS) $(srcdir)/widechars.h $(srcdir)/popup_msg.h +pair_content progs $(srcdir) $(HEADER_DEPS) +picsmap progs $(srcdir) $(HEADER_DEPS) $(srcdir)/picsmap.h +popup_msg progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +railroad progs $(srcdir) $(HEADER_DEPS) +rain progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +redraw progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +savescreen progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h $(srcdir)/parse_rgb.h +sp_tinfo progs $(srcdir) $(HEADER_DEPS) +tclock progs $(srcdir) $(HEADER_DEPS) +test_add_wchstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h +test_addchstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h +test_addstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h +test_addwstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/linedata.h +test_arrays progs $(srcdir) $(HEADER_DEPS) +test_delwin progs $(srcdir) $(HEADER_DEPS) +test_endwin progs $(srcdir) $(HEADER_DEPS) +test_get_wstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +test_getstr progs $(srcdir) $(HEADER_DEPS) $(srcdir)/popup_msg.h +test_instr progs $(srcdir) $(HEADER_DEPS) +test_inwstr progs $(srcdir) $(HEADER_DEPS) +test_mouse progs $(srcdir) $(HEADER_DEPS) +test_opaque progs $(srcdir) $(HEADER_DEPS) +test_setupterm progs $(srcdir) $(HEADER_DEPS) +test_sgr progs $(srcdir) $(HEADER_DEPS) +test_termattrs progs $(srcdir) $(HEADER_DEPS) +test_tparm progs $(srcdir) $(HEADER_DEPS) $(incdir)/term_entry.h +test_unget_wch progs $(srcdir) $(HEADER_DEPS) +test_vid_puts progs $(srcdir) $(HEADER_DEPS) +test_vidputs progs $(srcdir) $(HEADER_DEPS) +testaddch progs $(srcdir) $(HEADER_DEPS) +testcurs progs $(srcdir) $(HEADER_DEPS) +testscanw progs $(srcdir) $(HEADER_DEPS) +view progs $(srcdir) $(HEADER_DEPS) $(srcdir)/widechars.h $(srcdir)/popup_msg.h +worm progs $(srcdir) $(HEADER_DEPS) +xmas progs $(srcdir) $(HEADER_DEPS) + +# vile:makemode diff --git a/contrib/ncurses/test/move_field.c b/contrib/ncurses/test/move_field.c new file mode 100644 index 00000000..db834140 --- /dev/null +++ b/contrib/ncurses/test/move_field.c @@ -0,0 +1,547 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: move_field.c,v 1.19 2024/10/06 21:12:35 tom Exp $ + * + * Demonstrate move_field(). + */ + +#include + +#if USE_LIBFORM + +#include +#include + +#define DO_DEMO CTRL('F') /* actual key for toggling demo-mode */ +#define MY_DEMO EDIT_FIELD('f') /* internal request-code */ + +static char empty[] = ""; +static FIELD *all_fields[100]; +/* *INDENT-OFF* */ +static struct { + int code; + int result; + const char *help; +} commands[] = { + { CTRL('A'), REQ_BEG_FIELD, "go to beginning of field" }, + { CTRL('D'), REQ_DOWN_FIELD, "move downward to field" }, + { CTRL('E'), REQ_END_FIELD, "go to end of field" }, + { CTRL('H'), REQ_DEL_PREV, "delete previous character" }, + { CTRL('I'), REQ_NEXT_FIELD, "go to next field" }, + { CTRL('K'), REQ_CLR_EOF, "clear to end of field" }, + { CTRL('N'), REQ_NEXT_FIELD, "go to next field" }, + { CTRL('P'), REQ_PREV_FIELD, "go to previous field" }, + { CTRL('Q'), MY_QUIT, "exit form" }, + { CTRL('U'), REQ_UP_FIELD, "move upward to field" }, + { CTRL('W'), REQ_NEXT_WORD, "go to next word" }, + { CTRL('X'), REQ_CLR_FIELD, "clear field" }, + { CTRL('['), MY_QUIT, "exit form" }, + { HELP_KEY_2, MY_HELP, "show this screen", }, + { KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" }, + { KEY_BTAB, REQ_PREV_FIELD, "go to previous field" }, + { KEY_DOWN, REQ_DOWN_CHAR, "move down 1 character" }, + { KEY_END, REQ_LAST_FIELD, "go to last field" }, + { KEY_HOME, REQ_FIRST_FIELD, "go to first field" }, + { KEY_LEFT, REQ_LEFT_CHAR, "move left 1 character" }, + { KEY_NEXT, REQ_NEXT_FIELD, "go to next field" }, + { KEY_PREVIOUS, REQ_PREV_FIELD, "go to previous field" }, + { KEY_RIGHT, REQ_RIGHT_CHAR, "move right 1 character" }, + { KEY_UP, REQ_UP_CHAR, "move up 1 character" }, + { DO_DEMO, MY_DEMO, "move current field with cursor keys" } +}; +/* *INDENT-ON* */ + +static void +my_help_edit_field(void) +{ + int used = 0; + unsigned n; + char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); + + msgs[used++] = strdup("Defined form edit/traversal keys:"); + for (n = 0; n < SIZEOF(commands); ++n) { + char *msg; + const char *name; + const char *code = keyname(commands[n].code); + size_t need = 5; +#ifdef NCURSES_VERSION + if ((name = form_request_name(commands[n].result)) == 0) +#endif + name = commands[n].help; + need = 5 + strlen(code) + strlen(name); + msg = typeMalloc(char, need); + _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); + msgs[used++] = msg; + } + msgs[used++] = + strdup("Arrow keys move within a field as you would expect."); + msgs[used] = 0; + popup_msg2(stdscr, msgs); + for (n = 0; msgs[n] != 0; ++n) { + free(msgs[n]); + } + free(msgs); +} + +static FIELD * +make_label(const char *label, int frow, int fcol) +{ + FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0); + + if (f) { + set_field_buffer(f, 0, label); + set_field_opts(f, (int) ((unsigned) field_opts(f) & (unsigned) ~O_ACTIVE)); + } + return (f); +} + +static FIELD * +make_field(int frow, int fcol, int rows, int cols) +{ + FIELD *f = new_field(rows, cols, frow, fcol, 0, 1); + + if (f) { + set_field_back(f, A_UNDERLINE); + init_edit_field(f, empty); + } + return (f); +} + +static void +erase_form(FORM *f) +{ + WINDOW *w = form_win(f); + WINDOW *s = form_sub(f); + + unpost_form(f); + werase(w); + wrefresh(w); + delwin(s); +} + +static FieldAttrs * +my_field_attrs(NCURSES_CONST FIELD *f) +{ + return (FieldAttrs *) field_userptr(f); +} + +static int +buffer_length(NCURSES_CONST FIELD *f) +{ + return my_field_attrs(f)->row_lengths[0]; +} + +static void +set_buffer_length(NCURSES_CONST FIELD *f, int length) +{ + my_field_attrs(f)->row_lengths[0] = length; +} + +static int +offset_in_field(NCURSES_CONST FORM *form) +{ + NCURSES_CONST FIELD *field = current_field(form); + int currow, curcol; + + form_getyx(form, currow, curcol); + return curcol + currow * (int) field->dcols; +} + +static void +inactive_field(FIELD *f) +{ + set_field_back(f, my_field_attrs(f)->background); +} + +static int +my_edit_field(FORM *form, int *result) +{ + int ch = wgetch(form_win(form)); + int status; + FIELD *before; + unsigned n; + int before_row; + int before_col; + int before_off = offset_in_field(form); + + form_getyx(form, before_row, before_col); + before = current_field(form); + set_field_back(before, A_NORMAL); + if (ch <= KEY_MAX) { + set_field_back(before, A_REVERSE); + } else if (ch <= MAX_FORM_COMMAND) { + inactive_field(before); + } + + *result = ch; + for (n = 0; n < SIZEOF(commands); ++n) { + if (commands[n].code == ch) { + *result = commands[n].result; + break; + } + } + + status = form_driver(form, *result); + + if (status == E_OK) { + bool modified = TRUE; + int length = buffer_length(before); + + if (length < before_off) + length = before_off; + switch (*result) { + case REQ_CLR_EOF: + length = before_off; + break; + case REQ_CLR_EOL: + if ((int) (before_row + 1) == (int) (before->rows)) + length = before_off; + break; + case REQ_CLR_FIELD: + length = 0; + break; + case REQ_DEL_CHAR: + if (length > before_off) + --length; + break; + case REQ_DEL_PREV: + if (length > 0) { + if (before_col > 0) { + --length; + } else if (before_row > 0) { + length -= (int) before->cols + before_col; + } + } + break; + case REQ_NEW_LINE: + length += (int) before->cols; + break; + + default: + modified = (ch < MIN_FORM_COMMAND + && isprint(UChar(ch))); + break; + } + + /* + * If we do not force a re-validation, then field_buffer 0 will + * be lagging by one character. + */ + if (modified && form_driver(form, REQ_VALIDATION) == E_OK && *result + < MIN_FORM_COMMAND) + ++length; + + set_buffer_length(before, length); + } + + if (current_field(form) != before) + inactive_field(before); + return status; +} + +static FIELD ** +copy_fields(FIELD **source, size_t length) +{ + FIELD **target = typeCalloc(FIELD *, length + 1); + memcpy(target, source, length * sizeof(FIELD *)); + return target; +} + +/* display a status message to show what's happening */ +static void +show_status(NCURSES_CONST FORM *form, NCURSES_CONST FIELD *field) +{ + NCURSES_CONST WINDOW *sub = form_sub(form); + int currow, curcol; + + getyx(stdscr, currow, curcol); + mvprintw(LINES - 1, 0, + "Field at [%d,%d]. Press %s to quit moving.", + getbegy(sub) + form_field_row(field), + getbegx(sub) + form_field_col(field), + keyname(DO_DEMO)); + clrtobot(); + move(currow, curcol); + refresh(); +} + +/* + * Move the current label+field in response to cursor-keys (or h,j,k,l) until + * a control/F is read. + */ +static void +do_demo(FORM *form) +{ + int count = field_count(form); + FIELD *my_field = current_field(form); + FIELD **old_fields = form_fields(form); + + if (count > 0 && old_fields != NULL && my_field != NULL) { + size_t needed = (size_t) count; + FIELD **new_fields = copy_fields(old_fields, needed); + + if (new_fields != NULL) { + bool found = FALSE; + int ch; + + /* TODO: move the label too, in parallel with the editing field */ + + /* remove the current field from the newer list */ + for (ch = 0; ch <= count; ++ch) { + if (found) { + new_fields[ch - 1] = new_fields[ch]; + } else if (new_fields[ch] == my_field) { + found = TRUE; + } + } + + if (found) { + int currow, curcol; + + getyx(stdscr, currow, curcol); + + show_status(form, my_field); + while ((ch = wgetch(form_win(form))) != DO_DEMO) { + int field_y = form_field_row(my_field); + int field_x = form_field_col(my_field); + + switch (ch) { + case 'h': + case KEY_LEFT: + if (field_x > 0) + field_x--; + break; + case 'j': + case KEY_DOWN: + field_y++; + break; + case 'k': + case KEY_UP: + if (field_y > 0) + field_y--; + break; + case 'l': + case KEY_RIGHT: + field_x++; + break; + case CTRL('Q'): + case CTRL('['): + ch = DO_DEMO; + /* FALLTHRU */ + case DO_DEMO: + break; + default: + continue; + } + + if (ch == DO_DEMO) + break; + + /* alter connected fields temporarily to move the field */ + unpost_form(form); + set_form_fields(form, new_fields); + post_form(form); + + /* TODO: update screen position on success */ + move_field(my_field, field_y, field_x); + + /* restore the form's list of fields */ + unpost_form(form); + set_form_fields(form, old_fields); + post_form(form); + + show_status(form, my_field); + } + + /* cleanup */ + move(LINES - 1, 0); + clrtobot(); + move(currow, curcol); + refresh(); + } + } + free(new_fields); + } +} + +static int +my_form_driver(FORM *form, int c) +{ + switch (c) { + case MY_QUIT: + if (form_driver(form, REQ_VALIDATION) == E_OK) + return (TRUE); + break; + case MY_HELP: + my_help_edit_field(); + break; + case MY_DEMO: + do_demo(form); + break; + default: + beep(); + break; + } + return (FALSE); +} + +static void +demo_forms(void) +{ + FORM *form; + int c; + unsigned n = 0; + const char *fname; + + /* describe the form */ + all_fields[n++] = make_label("Sample Form", 0, 15); + + fname = "Last Name"; + all_fields[n++] = make_label(fname, 2, 0); + all_fields[n++] = make_field(3, 0, 1, 18); + set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); + + fname = "First Name"; + all_fields[n++] = make_label(fname, 2, 20); + all_fields[n++] = make_field(3, 20, 1, 12); + set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); + + fname = "Middle Name"; + all_fields[n++] = make_label(fname, 2, 34); + all_fields[n++] = make_field(3, 34, 1, 12); + set_field_type(all_fields[n - 1], TYPE_ALPHA, 1); + + fname = "Comments"; + all_fields[n++] = make_label(fname, 5, 0); + all_fields[n++] = make_field(6, 0, 4, 46); + init_edit_field(all_fields[n - 1], empty); + + all_fields[n] = (FIELD *) 0; + + if ((form = new_form(all_fields)) != 0) { + int finished = 0; + + post_form(form); + + while (!finished) { + switch (my_edit_field(form, &c)) { + case E_OK: + break; + case E_UNKNOWN_COMMAND: + finished = my_form_driver(form, c); + break; + default: + beep(); + break; + } + } + + erase_form(form); + + free_form(form); + } + for (c = 0; all_fields[c] != 0; c++) { + free_edit_field(all_fields[c]); + free_field(all_fields[c]); + } + noraw(); + nl(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: move_field [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + initscr(); + cbreak(); + noecho(); + raw(); + nonl(); /* lets us read ^M's */ + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + init_pair(2, COLOR_GREEN, COLOR_BLACK); + init_pair(3, COLOR_CYAN, COLOR_BLACK); + bkgd((chtype) COLOR_PAIR(1)); + refresh(); + } + + demo_forms(); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses form library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/movewindow.c b/contrib/ncurses/test/movewindow.c new file mode 100644 index 00000000..a01b616c --- /dev/null +++ b/contrib/ncurses/test/movewindow.c @@ -0,0 +1,812 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2006-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: movewindow.c,v 1.56 2024/10/06 18:44:26 tom Exp $ + * + * Demonstrate move functions for windows and derived windows from the curses + * library. + * + * Author: Thomas E. Dickey + */ +/* +derwin +mvderwin +subwin +mvwin + +TODO: + add command to reset subwindow's origin to coincide with parent. + add command to delete subwindow (check if it has subwindows though) + */ + +#include + +#if HAVE_MVDERWIN && HAVE_MVWIN + +#include + +#ifdef HAVE_XCURSES +#undef derwin +#endif + +#undef LINE_MAX + +#define LINE_MIN 2 +#define LINE_MAX (LINES - 2) +#define COL_MIN 2 +#define COL_MAX (COLS - 2) + +typedef struct { + int y, x; +} PAIR; + +typedef struct { + WINDOW *parent; /* need this since WINDOW->_parent is not portable */ + WINDOW *child; /* the actual value */ +} FRAME; + +static void head_line(CONST_FMT char *fmt, ...) GCC_PRINTFLIKE(1, 2); +static void tail_line(CONST_FMT char *fmt, ...) GCC_PRINTFLIKE(1, 2); + +static unsigned num_windows; +static FRAME *all_windows; + +static void +failed(const char *s) +{ + perror(s); + endwin(); + ExitProgram(EXIT_FAILURE); +} + +static void +message(int lineno, CONST_FMT char *fmt, va_list argp) +{ + int y, x; + + getyx(stdscr, y, x); + move(lineno, 0); + clrtoeol(); + +#ifdef HAVE_XCURSES + { + char buffer[1024]; + vsprintf(buffer, fmt, argp); + addstr(buffer); + } +#elif defined(HAVE_VW_PRINTW) + vw_printw(stdscr, fmt, argp); +#else + vwprintw(stdscr, fmt, argp); +#endif + + move(y, x); + refresh(); +} + +static void +head_line(CONST_FMT char *fmt, ...) +{ + va_list argp; + + va_start(argp, fmt); + message(0, fmt, argp); + va_end(argp); +} + +static void +tail_line(CONST_FMT char *fmt, ...) +{ + va_list argp; + + va_start(argp, fmt); + message(LINES - 1, fmt, argp); + va_end(argp); +} + +/* + * Arrow keys move cursor, return location at current on non-arrow key. + */ +static PAIR * +selectcell(WINDOW *parent, + NCURSES_CONST WINDOW *child, + int uli, int ulj, + int lri, int lrj, + bool relative, + bool * more) +{ + static PAIR res; /* result cell */ + int si = lri - uli + 1; /* depth of the select area */ + int sj = lrj - ulj + 1; /* width of the select area */ + int i = 0, j = 0; /* offsets into the select area */ + + res.y = uli; + res.x = ulj; + + if (child != 0) { + if (relative) { + getparyx(child, i, j); + } else { + getbegyx(child, i, j); + i -= uli + getbegy(parent); + j -= ulj + getbegx(parent); + } + } + + if (more) + *more = FALSE; + + for (;;) { + bool moved = FALSE; + + tail_line("Upper left [%2d,%2d] Lower right [%2d,%2d] -> %d,%d -> %d,%d", + uli, ulj, + lri, lrj, + i, j, + uli + i, ulj + j); + wmove(parent, uli + i, ulj + j); + + switch (wgetch(parent)) { + case KEY_UP: + i += si - 1; + moved = TRUE; + break; + case KEY_DOWN: + i++; + moved = TRUE; + break; + case KEY_LEFT: + j += sj - 1; + moved = TRUE; + break; + case KEY_RIGHT: + j++; + moved = TRUE; + break; + case QUIT: + /* FALLTHRU */ + case ESCAPE: + return ((PAIR *) 0); +#ifdef NCURSES_MOUSE_VERSION + case KEY_MOUSE: + { + MEVENT event; + + getmouse(&event); + if (event.y > uli && event.x > ulj) { + if (parent != stdscr) { + i = event.y - getbegy(parent) - uli; + j = event.x - getbegx(parent) - ulj; + } else { + i = event.y - uli; + j = event.x - ulj; + } + } else { + beep(); + break; + } + } +#endif + /* FALLTHRU */ + default: + res.y = uli + i; + res.x = ulj + j; + return (&res); + } + + if (si <= 0) + i = 0; + else + i %= si; + + if (sj <= 0) + j = 0; + else + j %= sj; + + /* + * If the caller can handle continuous movement, return the result. + */ + if (moved && more) { + *more = TRUE; + res.y = uli + i; + res.x = ulj + j; + return (&res); + } + } +} + +/* + * Ask user for a window definition. + */ +static bool +getwindow(WINDOW *parent, PAIR * ul, PAIR * lr) +{ + int min_col = (parent == stdscr) ? COL_MIN : 0; + int max_col = (parent == stdscr) ? COL_MAX : getmaxx(parent); + int min_line = (parent == stdscr) ? LINE_MIN : 0; + int max_line = (parent == stdscr) ? LINE_MAX : getmaxy(parent); + NCURSES_CONST PAIR *tmp; + bool result = FALSE; + + head_line("Use arrows to move cursor, anything else to mark corner 1"); + if ((tmp = selectcell(parent, 0, + min_line, min_col, + max_line, max_col, + FALSE, + (bool *) 0)) != 0) { + *ul = *tmp; + MvWAddCh(parent, ul->y, ul->x, '*'); + + head_line("Use arrows to move cursor, anything else to mark corner 2"); + if ((tmp = selectcell(parent, 0, + ul->y, ul->x, + max_line, max_col, + FALSE, + (bool *) 0)) != 0) { + *lr = *tmp; + MvWAddCh(parent, lr->y, lr->x, '*'); + wmove(parent, lr->y, lr->x); + wsyncdown(parent); + wrefresh(parent); + result = (lr->y != ul->y && lr->x != ul->x); + } + } + head_line("done"); + return result; +} + +/* + * Draw a box inside the given window. + */ +static void +box_inside(WINDOW *win) +{ + int y0, x0; + int y1, x1; + + getyx(win, y0, x0); + getmaxyx(win, y1, x1); + + MvWHLine(win, 0, 0, ACS_HLINE, x1); + MvWHLine(win, y1 - 1, 0, ACS_HLINE, x1); + + MvWVLine(win, 0, 0, ACS_VLINE, y1); + MvWVLine(win, 0, x1 - 1, ACS_VLINE, y1); + + MvWAddCh(win, 0, 0, ACS_ULCORNER); + MvWAddCh(win, y1 - 1, 0, ACS_LLCORNER); + MvWAddCh(win, 0, x1 - 1, ACS_URCORNER); + MvWAddCh(win, y1 - 1, x1 - 1, ACS_LRCORNER); + + wsyncdown(win); + wmove(win, y0, x0); + wrefresh(win); +} + +/* + * Add a window to our list. + */ +static void +add_window(WINDOW *parent, WINDOW *child) +{ + static unsigned have = 0; + unsigned need = ((num_windows + 1) | 31) + 1; + + keypad(child, TRUE); + if (need > have) { + all_windows = typeRealloc(FRAME, need, all_windows); + if (!all_windows) + failed("add_window"); + have = need; + } + all_windows[num_windows].parent = parent; + all_windows[num_windows].child = child; + num_windows++; +} + +static int +window2num(const WINDOW *const win) +{ + int n; + int result = -1; + for (n = 0; n < (int) num_windows; ++n) { + if (win == all_windows[n].child) { + result = n; + break; + } + } + return result; +} + +static WINDOW * +parent_of(NCURSES_CONST WINDOW *win) +{ + WINDOW *result = 0; + int n = window2num(win); + if (n >= 0) + result = all_windows[n].parent; + return result; +} + +static void +repaint_one(WINDOW *win) +{ + touchwin(win); + wnoutrefresh(win); +} + +static void +refresh_all(WINDOW *win) +{ + unsigned n; + + for (n = 0; n < num_windows; ++n) { + if (all_windows[n].child != win) { + repaint_one(all_windows[n].child); + } + } + + repaint_one(win); + doupdate(); +} + +static WINDOW * +next_window(WINDOW *win) +{ + WINDOW *result = win; + int n = window2num(win); + + if (n++ >= 0) { + result = all_windows[(unsigned) n % num_windows].child; + wmove(result, 0, 0); + wrefresh(result); + } + return result; +} + +static WINDOW * +prev_window(WINDOW *win) +{ + WINDOW *result = win; + int n = window2num(win); + + if (n-- >= 0) { + if (n < 0) + n = (int) (num_windows - 1); + result = all_windows[(unsigned) n % num_windows].child; + wmove(result, 0, 0); + wrefresh(result); + } + return result; +} + +static void +recur_move_window(const WINDOW *const parent, int dy, int dx) +{ + unsigned n; + + for (n = 0; n < num_windows; ++n) { + if (all_windows[n].parent == parent) { + mvwin(all_windows[n].child, dy, dx); + recur_move_window(all_windows[n].child, dy, dx); + } + } +} + +/* + * test mvwin(). + */ +static bool +move_window(WINDOW *win, bool recur) +{ + WINDOW *parent = parent_of(win); + bool result = FALSE; + + if (parent != 0) { + bool top = (parent == stdscr); + int min_col = top ? COL_MIN : 0; + int max_col = top ? COL_MAX : getmaxx(parent); + int min_line = top ? LINE_MIN : 0; + int max_line = top ? LINE_MAX : getmaxy(parent); + NCURSES_CONST PAIR *tmp; + bool more; + + head_line("Select new position for %swindow", top ? "" : "sub"); + + while ((tmp = selectcell(parent, + win, + min_line, min_col, + max_line, max_col, + FALSE, + &more)) != 0) { + int y0, x0; + getbegyx(parent, y0, x0); + /* + * Moving a subwindow has the effect of moving a viewport around + * the screen. The parent window retains the contents of the + * subwindow in the original location, but the viewport will show + * the contents (again) at the new location. So it will look odd + * when testing. + */ + if (mvwin(win, y0 + tmp->y, x0 + tmp->x) != ERR) { + if (recur) { + recur_move_window(win, tmp->y, tmp->x); + } + refresh_all(win); + doupdate(); + result = TRUE; + } else { + result = FALSE; + } + if (!more) + break; + } + } + head_line("done"); + return result; +} + +static void +show_derwin(NCURSES_CONST WINDOW *win) +{ + int pary, parx, maxy, maxx; + + getmaxyx(win, maxy, maxx); + getparyx(win, pary, parx); + + head_line("Select new position for derived window at %d,%d (%d,%d)", + pary, parx, maxy, maxx); +} + +/* + * test mvderwin(). + */ +static bool +move_derwin(WINDOW *win) +{ + WINDOW *parent = parent_of(win); + bool result = FALSE; + + if (parent != 0) { + bool top = (parent == stdscr); + int min_col = top ? COL_MIN : 0; + int max_col = top ? COL_MAX : getmaxx(parent); + int min_line = top ? LINE_MIN : 0; + int max_line = top ? LINE_MAX : getmaxy(parent); + NCURSES_CONST PAIR *tmp; + bool more; + + show_derwin(win); + while ((tmp = selectcell(parent, + win, + min_line, min_col, + max_line, max_col, + TRUE, + &more)) != 0) { + if (mvderwin(win, tmp->y, tmp->x) != ERR) { + refresh_all(win); + doupdate(); + repaint_one(win); + doupdate(); + result = TRUE; + show_derwin(win); + } else { + flash(); + } + if (!more) + break; + } + } + head_line("done"); + return result; +} + +static void +fill_window(WINDOW *win, chtype ch) +{ + int y, x; + int y0, x0; + int y1, x1; + + getyx(win, y0, x0); + getmaxyx(win, y1, x1); + for (y = 0; y < y1; ++y) { + for (x = 0; x < x1; ++x) { + MvWAddCh(win, y, x, ch); + } + } + wsyncdown(win); + wmove(win, y0, x0); + wrefresh(win); +} + +static void +fill_with_pattern(WINDOW *win) +{ + int y, x; + int y0, x0; + int y1, x1; + int ch = 'a'; + + getyx(win, y0, x0); + getmaxyx(win, y1, x1); + for (y = 0; y < y1; ++y) { + for (x = 0; x < x1; ++x) { + MvWAddCh(win, y, x, (chtype) ch); + if (++ch > 'z') + ch = 'a'; + } + } + wsyncdown(win); + wmove(win, y0, x0); + wrefresh(win); +} + +#define lines_of(ul,lr) (lr.y - ul.y + 1) +#define cols_of(ul,lr) (lr.x - ul.x + 1) +#define pair_of(ul) ul.y, ul.x + +static WINDOW * +create_my_window(WINDOW *current) +{ + PAIR ul, lr; + WINDOW *result = 0; + + if (getwindow(stdscr, &ul, &lr)) { + result = newwin(lines_of(ul, lr), cols_of(ul, lr), pair_of(ul)); + if (result != 0) { + fill_window(result, 'c'); + add_window(stdscr, result); + } + } + if (result == 0) + result = current; + return result; +} + +static WINDOW * +create_my_derwin(WINDOW *parent) +{ + PAIR ul, lr; + WINDOW *result = 0; + + if (getwindow(parent, &ul, &lr)) { + result = derwin(parent, lines_of(ul, lr), cols_of(ul, lr), pair_of(ul)); + if (result != 0) { + fill_window(result, 'd'); + add_window(parent, result); + } + } + if (result == 0) + result = parent; + return result; +} + +static WINDOW * +create_my_subwin(WINDOW *parent) +{ + PAIR ul, lr; + WINDOW *result = 0; + + if (getwindow(parent, &ul, &lr)) { + result = subwin(parent, + lines_of(ul, lr), + cols_of(ul, lr), + ul.y + getbegy(parent), + ul.x + getbegx(parent)); + if (result != 0) { + fill_window(result, 's'); + add_window(parent, result); + } + } + if (result == 0) + result = parent; + return result; +} + +static void +show_help(WINDOW *current) +{ + /* *INDENT-OFF* */ + static struct { + int key; + CONST_FMT char * msg; + } help[] = { + { HELP_KEY_1, "Show this screen" }, + { 'b', "Draw a box inside the current window" }, + { 'c', "Create a new window" }, + { 'd', "Create a new derived window" }, + { 'D', "Move derived window (moves viewport)" }, + { 'f', "Fill the current window with the next character" }, + { 'F', "Fill the current window with a pattern" }, + { 'm', "Move the current window" }, + { 'M', "Move the current window (and its children)" }, + { 'q', "Quit" }, + { 's', "Create a new subwindow" }, + { CTRL('L'), "Repaint all windows, doing current one last" }, + { CTRL('N'), "Cursor to next window" }, + { CTRL('P'), "Cursor to previous window" }, + }; + /* *INDENT-ON* */ + + char **msgs = typeCalloc(char *, SIZEOF(help) + 1); + size_t n; + + for (n = 0; n < SIZEOF(help); ++n) { + size_t need = (21 + strlen(help[n].msg)); + msgs[n] = typeMalloc(char, need); + _nc_SPRINTF(msgs[n], _nc_SLIMIT(need) + "%-20s%s", keyname(help[n].key), help[n].msg); + } + popup_msg2(current, msgs); + for (n = 0; n < SIZEOF(help); ++n) { + free(msgs[n]); + } + free(msgs); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: movewindow [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *current_win; + int ch; + bool done = FALSE; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + initscr(); + cbreak(); + noecho(); + nonl(); + intrflush(stdscr, FALSE); + + add_window(0, current_win = stdscr); + +#ifdef NCURSES_MOUSE_VERSION + (void) mousemask(BUTTON1_CLICKED, (mmask_t *) NULL); +#endif /* NCURSES_MOUSE_VERSION */ + + while (!done && (ch = wgetch(current_win)) != ERR) { + int y, x; + + getyx(current_win, y, x); + + switch (ch) { + case HELP_KEY_1: + show_help(current_win); + break; + case 'b': + box_inside(current_win); + break; + case 'c': + current_win = create_my_window(current_win); + break; + case 'd': + current_win = create_my_derwin(current_win); + break; + case 'D': + if (!move_derwin(current_win)) { + tail_line("error"); + continue; + } + break; + case 'f': + fill_window(current_win, (chtype) wgetch(current_win)); + break; + case 'F': + fill_with_pattern(current_win); + break; + case 'm': + case 'M': + if (!move_window(current_win, (ch == 'M'))) { + tail_line("error"); + continue; + } + break; + case 'q': + done = TRUE; + break; + case 's': + current_win = create_my_subwin(current_win); + break; + case CTRL('L'): + refresh_all(current_win); + break; + case CTRL('N'): + current_win = next_window(current_win); + break; + case CTRL('P'): + current_win = prev_window(current_win); + break; +#if 0 + /* want to allow cursor to move around the current window too */ + /* want to test the resizing of windows and subwindows too */ + /* want to allow deleting a window also */ +#endif + default: + wmove(current_win, y, x); + tail_line("unrecognized key (use '?' for help)"); + beep(); + continue; + } + tail_line("size [%d,%d] begin [%d,%d] parent [%d,%d]", + getmaxy(current_win), + getmaxx(current_win), + getbegy(current_win), + getbegx(current_win), + getpary(current_win), + getparx(current_win)); + wmove(current_win, 0, 0); + } + endwin(); +#if NO_LEAKS + free(all_windows); +#endif + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the curses mvderwin and mvwin functions\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/ncurses.c b/contrib/ncurses/test/ncurses.c new file mode 100644 index 00000000..fbdcc122 --- /dev/null +++ b/contrib/ncurses/test/ncurses.c @@ -0,0 +1,8075 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/**************************************************************************** + +NAME + ncurses.c --- ncurses library exerciser + +SYNOPSIS + ncurses + +DESCRIPTION + An interactive test module for the ncurses library. + +AUTHOR + Author: Eric S. Raymond 1993 + Thomas E. Dickey (beginning revision 1.27 in 1996). + +$Id: ncurses.c,v 1.541 2024/10/06 20:18:59 tom Exp $ + +***************************************************************************/ + +#define NEED_TIME_H 1 +#include + +#ifdef __hpux +#undef mvwdelch /* HPUX 11.23 macro will not compile */ +#endif + +#if HAVE_SYS_TIME_H && HAVE_SYS_TIME_SELECT +#include +#endif + +#if HAVE_SYS_SELECT_H +#include +#endif + +#if USE_LIBPANEL +#include +#endif + +#if USE_LIBMENU +#include +#endif + +#if USE_LIBFORM +#include +#endif + +#ifdef NCURSES_VERSION + +#define NCURSES_CONST_PARAM const void + +#ifdef TRACE +static unsigned save_trace = TRACE_ORDINARY | TRACE_ICALLS | TRACE_CALLS; +#endif + +#else + +#define NCURSES_CONST_PARAM char + +#define mmask_t chtype /* not specified in XSI */ + +#ifndef ACS_S3 +#ifdef CURSES_ACS_ARRAY +#define ACS_S3 (CURSES_ACS_ARRAY['p']) /* scan line 3 */ +#define ACS_S7 (CURSES_ACS_ARRAY['r']) /* scan line 7 */ +#define ACS_LEQUAL (CURSES_ACS_ARRAY['y']) /* less/equal */ +#define ACS_GEQUAL (CURSES_ACS_ARRAY['z']) /* greater/equal */ +#define ACS_PI (CURSES_ACS_ARRAY['{']) /* Pi */ +#define ACS_NEQUAL (CURSES_ACS_ARRAY['|']) /* not equal */ +#define ACS_STERLING (CURSES_ACS_ARRAY['}']) /* UK pound sign */ +#else +#define ACS_S3 (A_ALTCHARSET + 'p') /* scan line 3 */ +#define ACS_S7 (A_ALTCHARSET + 'r') /* scan line 7 */ +#define ACS_LEQUAL (A_ALTCHARSET + 'y') /* less/equal */ +#define ACS_GEQUAL (A_ALTCHARSET + 'z') /* greater/equal */ +#define ACS_PI (A_ALTCHARSET + '{') /* Pi */ +#define ACS_NEQUAL (A_ALTCHARSET + '|') /* not equal */ +#define ACS_STERLING (A_ALTCHARSET + '}') /* UK pound sign */ +#endif +#endif /* ACS_S3 */ + +#ifndef WACS_S3 +#ifdef CURSES_WACS_ARRAY +#define WACS_S3 (&(CURSES_WACS_ARRAY['p'])) /* scan line 3 */ +#define WACS_S7 (&(CURSES_WACS_ARRAY['r'])) /* scan line 7 */ +#define WACS_LEQUAL (&(CURSES_WACS_ARRAY['y'])) /* less/equal */ +#define WACS_GEQUAL (&(CURSES_WACS_ARRAY['z'])) /* greater/equal */ +#define WACS_PI (&(CURSES_WACS_ARRAY['{'])) /* Pi */ +#define WACS_NEQUAL (&(CURSES_WACS_ARRAY['|'])) /* not equal */ +#define WACS_STERLING (&(CURSES_WACS_ARRAY['}'])) /* UK pound sign */ +#endif +#endif + +#endif + +#if HAVE_WCSRTOMBS +#define count_wchars(src, len, state) wcsrtombs(0, &src, len, state) +#define trans_wchars(dst, src, len, state) wcsrtombs(dst, &src, len, state) +#define reset_wchars(state) init_mb(state) +#elif HAVE_WCSTOMBS && HAVE_MBTOWC && HAVE_MBLEN +#define count_wchars(src, len, state) wcstombs(0, src, len) +#define trans_wchars(dst, src, len, state) wcstombs(dst, src, len) +#define reset_wchars(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0)) +#define state_unused +#endif + +#if HAVE_MBSRTOWCS +#define count_mbytes(src, len, state) mbsrtowcs(0, &src, len, state) +#define trans_mbytes(dst, src, len, state) mbsrtowcs(dst, &src, len, state) +#define reset_mbytes(state) init_mb(state) +#elif HAVE_MBSTOWCS && HAVE_MBTOWC && HAVE_MBLEN +#define count_mbytes(src, len, state) mbstowcs(0, src, len) +#define trans_mbytes(dst, src, len, state) mbstowcs(dst, src, len) +#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0)) +#define state_unused +#endif + +#define ToggleAcs(temp,real) temp = ((temp == real) ? NULL : real) + +#define P(string) printw("%s\n", string) + +#define BLANK ' ' /* this is the background character */ + +static int MaxColors; /* the actual number of colors we'll use */ +static int MinColors; /* the minimum color code */ +static bool UseColors; /* true if we use colors */ + +#undef max_pairs +static int max_pairs; /* ...and the number of color pairs */ + +#if HAVE_COLOR_CONTENT +typedef struct { + NCURSES_COLOR_T red; + NCURSES_COLOR_T green; + NCURSES_COLOR_T blue; +} RGB_DATA; + +static RGB_DATA *all_colors; +#endif + +static void main_menu(bool); +static GCC_NORETURN void failed(const char *s); + +static void +failed(const char *s) +{ + perror(s); + endwin(); + ExitProgram(EXIT_FAILURE); +} + +static void +Repaint(void) +{ + touchwin(stdscr); +#if HAVE_CURSCR + touchwin(curscr); + wrefresh(curscr); +#else + wrefresh(stdscr); +#endif +} + +static bool +isQuit(int c, bool escape) +{ + return ((c) == QUIT || (escape && ((c) == ESCAPE))); +} +#define case_QUIT QUIT: case ESCAPE + +/* Common function to allow ^T to toggle trace-mode in the middle of a test + * so that trace-files can be made smaller. + */ +static int +wGetchar(WINDOW *win) +{ + int c; +#ifdef TRACE + while ((c = wgetch(win)) == CTRL('T')) { + if (_nc_tracing) { + save_trace = _nc_tracing; + Trace(("TOGGLE-TRACING OFF")); + _nc_tracing = 0; + } else { + _nc_tracing = save_trace; + } + curses_trace(_nc_tracing); + if (_nc_tracing) + Trace(("TOGGLE-TRACING ON")); + } +#else + c = wgetch(win); +#endif + return c; +} +#define Getchar() wGetchar(stdscr) + +#if USE_SOFTKEYS +/* replaces wgetnstr(), since we want to be able to edit values */ +static void +wGetstring(WINDOW *win, char *buffer, int limit) +{ + int y0, x0, x; + bool done = FALSE; + + echo(); + getyx(win, y0, x0); + (void) wattrset(win, A_REVERSE); + + x = (int) strlen(buffer); + while (!done) { + int ch; + if (x > (int) strlen(buffer)) + x = (int) strlen(buffer); + wmove(win, y0, x0); + wprintw(win, "%-*s", limit, buffer); + wmove(win, y0, x0 + x); + switch (ch = wGetchar(win)) { + case '\n': + case KEY_ENTER: + done = TRUE; + break; + case CTRL('U'): + *buffer = '\0'; + break; + case '\b': + case KEY_BACKSPACE: + case KEY_DC: + if (x > 0) { + int j; + for (j = --x; (buffer[j] = buffer[j + 1]) != '\0'; ++j) { + ; + } + } else { + beep(); + } + break; + case KEY_LEFT: + if (x > 0) { + --x; + } else { + flash(); + } + break; + case KEY_RIGHT: + ++x; + break; + default: + if (!isprint(UChar(ch)) || ch >= KEY_MIN) { + beep(); + } else if ((int) strlen(buffer) < limit) { + int j; + for (j = (int) strlen(buffer) + 1; j > x; --j) { + buffer[j] = buffer[j - 1]; + } + buffer[x++] = (char) ch; + } else { + flash(); + } + } + } + + wattroff(win, A_REVERSE); + wmove(win, y0, x0); + noecho(); +} +#endif + +#if USE_WIDEC_SUPPORT +static wchar_t +fullwidth_digit(int ch) +{ + return (wchar_t) (ch + 0xff10 - '0'); +} + +static void +make_fullwidth_text(wchar_t *target, const char *source) +{ + int ch; + while ((ch = *source++) != 0) { + *target++ = fullwidth_digit(ch); + } + *target = 0; +} + +static void +make_narrow_text(wchar_t *target, const char *source) +{ + int ch; + while ((ch = *source++) != 0) { + *target++ = (wchar_t) ch; + } + *target = 0; +} + +#if USE_LIBPANEL +static void +make_fullwidth_digit(cchar_t *target, int digit) +{ + wchar_t source[2]; + + source[0] = fullwidth_digit(digit + '0'); + source[1] = 0; + setcchar(target, source, A_NORMAL, 0, 0); +} +#endif + +static int +wGet_wchar(WINDOW *win, wint_t *result) +{ + int c; +#ifdef TRACE + while ((c = wget_wch(win, result)) == CTRL('T')) { + if (_nc_tracing) { + save_trace = _nc_tracing; + Trace(("TOGGLE-TRACING OFF")); + _nc_tracing = 0; + } else { + _nc_tracing = save_trace; + } + curses_trace(_nc_tracing); + if (_nc_tracing) + Trace(("TOGGLE-TRACING ON")); + } +#else + c = wget_wch(win, result); +#endif + return c; +} +#define Get_wchar(result) wGet_wchar(stdscr, result) + +/* replaces wgetn_wstr(), since we want to be able to edit values */ +#if USE_SOFTKEYS +static void +wGet_wstring(WINDOW *win, wchar_t *buffer, int limit) +{ + int y0, x0, x; + wint_t ch; + bool done = FALSE; + bool fkey = FALSE; + + echo(); + getyx(win, y0, x0); + (void) wattrset(win, A_REVERSE); + + x = (int) wcslen(buffer); + while (!done) { + if (x > (int) wcslen(buffer)) + x = (int) wcslen(buffer); + + /* clear the "window' */ + wmove(win, y0, x0); + wprintw(win, "%*s", limit, " "); + + /* write the existing buffer contents */ + wmove(win, y0, x0); + waddnwstr(win, buffer, limit); + + /* positions the cursor past character 'x' */ + wmove(win, y0, x0); + waddnwstr(win, buffer, x); + + switch (wGet_wchar(win, &ch)) { + case KEY_CODE_YES: + fkey = TRUE; + switch (ch) { + case KEY_ENTER: + ch = '\n'; + fkey = FALSE; + break; + case KEY_BACKSPACE: + case KEY_DC: + ch = '\b'; + fkey = FALSE; + break; + case KEY_LEFT: + case KEY_RIGHT: + break; + default: + ch = (wint_t) -1; + break; + } + break; + case OK: + fkey = FALSE; + break; + default: + ch = (wint_t) -1; + fkey = TRUE; + break; + } + + switch (ch) { + case '\n': + done = TRUE; + break; + case CTRL('U'): + *buffer = '\0'; + break; + case '\b': + if (x > 0) { + int j; + for (j = --x; (buffer[j] = buffer[j + 1]) != '\0'; ++j) { + ; + } + } else { + beep(); + } + break; + case KEY_LEFT: + if (x > 0) { + --x; + } else { + beep(); + } + break; + case KEY_RIGHT: + ++x; + break; + default: + if (fkey) { + beep(); + } else if ((int) wcslen(buffer) < limit) { + int j; + for (j = (int) wcslen(buffer) + 1; j > x; --j) { + buffer[j] = buffer[j - 1]; + } + buffer[x++] = (wchar_t) ch; + } else { + beep(); + } + } + } + + wattroff(win, A_REVERSE); + wmove(win, y0, x0); + noecho(); +} +#endif /* USE_SOFTKEYS */ + +#endif /* USE_WIDEC_SUPPORT */ + +static void +Pause(void) +{ + move(LINES - 1, 0); + addstr("Press any key to continue... "); + (void) Getchar(); +} + +static void +Cannot(const char *what) +{ + printw("\nThis %s terminal %s\n\n", getenv("TERM"), what); + Pause(); + endwin(); +} + +static void +ShellOut(bool message) +{ + if (message) + addstr("Shelling out..."); + def_prog_mode(); + endwin(); +#ifdef _NC_WINDOWS + system("cmd.exe"); +#else + IGNORE_RC(system("sh")); +#endif + if (message) + addstr("returned from shellout.\n"); + refresh(); +} + +#ifdef NCURSES_MOUSE_VERSION +/* + * This function is the same as _tracemouse(), but we cannot count on that + * being available in the non-debug library. + */ +static const char * +mouse_decode(MEVENT const *ep) +{ + static char buf[80 + (5 * 10) + (32 * 15)]; + + (void) _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + "id %2d at (%2d, %2d, %d) state %4lx = {", + ep->id, ep->x, ep->y, ep->z, (unsigned long) ep->bstate); + +#define SHOW(m, s) \ + if ((ep->bstate & m)==m) { \ + _nc_STRCAT(buf, s, sizeof(buf)); \ + _nc_STRCAT(buf, ", ", sizeof(buf)); \ + } + + SHOW(BUTTON1_RELEASED, "release-1"); + SHOW(BUTTON1_PRESSED, "press-1"); + SHOW(BUTTON1_CLICKED, "click-1"); + SHOW(BUTTON1_DOUBLE_CLICKED, "doubleclick-1"); + SHOW(BUTTON1_TRIPLE_CLICKED, "tripleclick-1"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON1_RESERVED_EVENT, "reserved-1"); +#endif + + SHOW(BUTTON2_RELEASED, "release-2"); + SHOW(BUTTON2_PRESSED, "press-2"); + SHOW(BUTTON2_CLICKED, "click-2"); + SHOW(BUTTON2_DOUBLE_CLICKED, "doubleclick-2"); + SHOW(BUTTON2_TRIPLE_CLICKED, "tripleclick-2"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON2_RESERVED_EVENT, "reserved-2"); +#endif + + SHOW(BUTTON3_RELEASED, "release-3"); + SHOW(BUTTON3_PRESSED, "press-3"); + SHOW(BUTTON3_CLICKED, "click-3"); + SHOW(BUTTON3_DOUBLE_CLICKED, "doubleclick-3"); + SHOW(BUTTON3_TRIPLE_CLICKED, "tripleclick-3"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON3_RESERVED_EVENT, "reserved-3"); +#endif + + SHOW(BUTTON4_RELEASED, "release-4"); + SHOW(BUTTON4_PRESSED, "press-4"); + SHOW(BUTTON4_CLICKED, "click-4"); + SHOW(BUTTON4_DOUBLE_CLICKED, "doubleclick-4"); + SHOW(BUTTON4_TRIPLE_CLICKED, "tripleclick-4"); +#if NCURSES_MOUSE_VERSION == 1 + SHOW(BUTTON4_RESERVED_EVENT, "reserved-4"); +#endif + +#if NCURSES_MOUSE_VERSION == 2 + SHOW(BUTTON5_RELEASED, "release-5"); + SHOW(BUTTON5_PRESSED, "press-5"); + SHOW(BUTTON5_CLICKED, "click-5"); + SHOW(BUTTON5_DOUBLE_CLICKED, "doubleclick-5"); + SHOW(BUTTON5_TRIPLE_CLICKED, "tripleclick-5"); +#endif + + SHOW(BUTTON_CTRL, "ctrl"); + SHOW(BUTTON_SHIFT, "shift"); + SHOW(BUTTON_ALT, "alt"); + SHOW(ALL_MOUSE_EVENTS, "all-events"); + SHOW(REPORT_MOUSE_POSITION, "position"); + +#undef SHOW + + if (buf[strlen(buf) - 1] == ' ') + buf[strlen(buf) - 2] = '\0'; + _nc_STRCAT(buf, "}", sizeof(buf)); + return (buf); +} + +static void +show_mouse(WINDOW *win) +{ + MEVENT event; + bool outside; + bool show_loc; + + getmouse(&event); + outside = !wenclose(win, event.y, event.x); + + if (outside) { + (void) wstandout(win); + waddstr(win, "KEY_MOUSE"); + (void) wstandend(win); + } else { + waddstr(win, "KEY_MOUSE"); + } + wprintw(win, ", %s", mouse_decode(&event)); + + if (outside) + win = stdscr; + + show_loc = wmouse_trafo(win, &event.y, &event.x, FALSE); + + if (show_loc) { + int y, x; + getyx(win, y, x); + wmove(win, event.y, event.x); + waddch(win, '*'); + wmove(win, y, x); + } + + if (outside) + wnoutrefresh(win); +} +#endif /* NCURSES_MOUSE_VERSION */ + +/**************************************************************************** + * + * Character input test + * + ****************************************************************************/ + +#define NUM_GETCH_FLAGS 256 +typedef bool GetchFlags[NUM_GETCH_FLAGS]; + +static void +setup_getch(WINDOW *win, GetchFlags flags) +{ + keypad(win, flags['k']); /* should be redundant, but for testing */ + meta(win, flags['m']); /* force this to a known state */ + if (flags['e']) + echo(); + else + noecho(); +} + +static void +init_getch(WINDOW *win, GetchFlags flags, int delay) +{ + memset(flags, FALSE, NUM_GETCH_FLAGS); + flags[UChar('k')] = (win == stdscr); + flags[UChar('m')] = TRUE; + flags[UChar('t')] = (delay != 0); + + setup_getch(win, flags); +} + +static bool +blocking_getch(GetchFlags flags, int delay) +{ + return ((delay < 0) && flags['t']); +} + +#define ExitOnEscape() (flags[UChar('k')] && flags[UChar('t')]) + +static void +wgetch_help(WINDOW *win, GetchFlags flags) +{ + static const char *help[] = + { + "e -- toggle echo mode" + ,"g -- triggers a getstr test" + ,"k -- toggle keypad/literal mode" + ,"m -- toggle meta (7-bit/8-bit) mode" + ,"^q -- quit" + ,"s -- shell out" + ,"t -- toggle timeout" + ,"w -- create a new window" +#ifdef SIGTSTP + ,"z -- suspend this process" +#endif + }; + int y, x; + unsigned chk = ((SIZEOF(help) + 1) / 2); + unsigned n; + + getyx(win, y, x); + move(0, 0); + printw("Type any key to see its %s value. Also:\n", + flags['k'] ? "keypad" : "literal"); + for (n = 0; n < SIZEOF(help); ++n) { + const char *msg = help[n]; + int row = 1 + (int) (n % chk); + int col = (n >= chk) ? COLS / 2 : 0; + int flg = ((strstr(msg, "toggle") != 0) + && (flags[UChar(*msg)] != FALSE)); + if (*msg == '^' && ExitOnEscape()) + msg = "^[,^q -- quit"; + if (flg) + (void) standout(); + MvPrintw(row, col, "%s", msg); + if (col == 0) + clrtoeol(); + if (flg) + (void) standend(); + } + wrefresh(stdscr); + wmove(win, y, x); +} + +static void +wgetch_wrap(WINDOW *win, int first_y) +{ + int last_y = getmaxy(win) - 1; + int y = getcury(win) + 1; + + if (y >= last_y) + y = first_y; + wmove(win, y, 0); + wclrtoeol(win); +} + +#if defined(KEY_RESIZE) && HAVE_WRESIZE +typedef struct { + WINDOW *text; + WINDOW *frame; +} WINSTACK; + +static WINSTACK *winstack = 0; +static unsigned len_winstack = 0; + +static void +forget_boxes(void) +{ + if (winstack != 0) { + free(winstack); + } + winstack = 0; + len_winstack = 0; +} + +static void +remember_boxes(unsigned level, WINDOW *txt_win, WINDOW *box_win) +{ + unsigned need = (level + 1) * 2; + + assert(level < (unsigned) COLS); + + if (winstack == 0) { + len_winstack = 20; + winstack = typeMalloc(WINSTACK, len_winstack); + } else if (need >= len_winstack) { + len_winstack = need; + winstack = typeRealloc(WINSTACK, len_winstack, winstack); + } + if (!winstack) + failed("remember_boxes"); + winstack[level].text = txt_win; + winstack[level].frame = box_win; +} + +#if USE_SOFTKEYS && (defined(NCURSES_VERSION_PATCH) && NCURSES_VERSION_PATCH < 20071229) && NCURSES_EXT_FUNCS +static void +slk_repaint(void) +{ + /* this chunk is now done in resize_term() */ + slk_touch(); + slk_clear(); + slk_noutrefresh(); +} + +#else +#define slk_repaint() /* nothing */ +#endif + +#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE +/* + * For wgetch_test(), we create pairs of windows - one for a box, one for text. + * Resize both and paint the box in the parent. + */ +static void +resize_boxes(unsigned level, const WINDOW *const win) +{ + unsigned n; + int base = 5; + int high = LINES - base; + int wide = COLS; + + touchwin(stdscr); + wnoutrefresh(stdscr); + + slk_repaint(); + + for (n = 0; n < level; ++n) { + wresize(winstack[n].frame, high, wide); + wresize(winstack[n].text, high - 2, wide - 2); + high -= 2; + wide -= 2; + werase(winstack[n].text); + box(winstack[n].frame, 0, 0); + wnoutrefresh(winstack[n].frame); + wprintw(winstack[n].text, + "size %dx%d\n", + getmaxy(winstack[n].text), + getmaxx(winstack[n].text)); + wnoutrefresh(winstack[n].text); + if (winstack[n].text == win) + break; + } + doupdate(); +} +#endif /* resize_boxes */ +#else +#define forget_boxes() /* nothing */ +#define remember_boxes(level,text,frame) /* nothing */ +#endif + +/* + * Return-code is OK/ERR or a keyname. + */ +static const char * +ok_keyname(int code) +{ + return ((code == OK) ? "OK" : ((code == ERR) ? "ERR" : keyname(code))); +} + +static void +wgetch_test(unsigned level, WINDOW *win, int delay) +{ + char buf[BUFSIZ]; + int first_y, first_x; + int incount = 0; + GetchFlags flags; + + init_getch(win, flags, delay); + notimeout(win, FALSE); + wtimeout(win, delay); + getyx(win, first_y, first_x); + + wgetch_help(win, flags); + wsetscrreg(win, first_y, getmaxy(win) - 1); + scrollok(win, TRUE); + + for (;;) { + int c; + + while ((c = wGetchar(win)) == ERR) { + incount++; + if (blocking_getch(flags, delay)) { + (void) wprintw(win, "%05d: input error", incount); + break; + } else { + (void) wprintw(win, "%05d: input timed out", incount); + } + wgetch_wrap(win, first_y); + } + if (c == ERR && blocking_getch(flags, delay)) { + wprintw(win, "ERR"); + wgetch_wrap(win, first_y); + } else if (isQuit(c, ExitOnEscape())) { + break; + } else if (c == 'e') { + flags[UChar('e')] = !flags[UChar('e')]; + setup_getch(win, flags); + wgetch_help(win, flags); + } else if (c == 'g') { + waddstr(win, "wgetnstr test: "); + echo(); + c = wgetnstr(win, buf, sizeof(buf) - 1); + noecho(); + wprintw(win, "I saw %d characters:\n\t`%s' (%s).", + (int) strlen(buf), buf, + ok_keyname(c)); + wclrtoeol(win); + wgetch_wrap(win, first_y); + } else if (c == 'k') { + flags[UChar('k')] = !flags[UChar('k')]; + setup_getch(win, flags); + wgetch_help(win, flags); + } else if (c == 'm') { + flags[UChar('m')] = !flags[UChar('m')]; + setup_getch(win, flags); + wgetch_help(win, flags); + } else if (c == 's') { + ShellOut(TRUE); + } else if (c == 't') { + notimeout(win, flags[UChar('t')]); + flags[UChar('t')] = !flags[UChar('t')]; + wgetch_help(win, flags); + } else if (c == 'w') { + int high = getmaxy(win) - 1 - first_y + 1; + int wide = getmaxx(win) - first_x; + int old_y, old_x; + int new_y = first_y + getbegy(win); + int new_x = first_x + getbegx(win); + + getyx(win, old_y, old_x); + if (high > 2 && wide > 2) { + WINDOW *wb = newwin(high, wide, new_y, new_x); + WINDOW *wi = newwin(high - 2, wide - 2, new_y + 1, new_x + 1); + + box(wb, 0, 0); + wrefresh(wb); + wmove(wi, 0, 0); + remember_boxes(level, wi, wb); + wgetch_test(level + 1, wi, delay); + delwin(wi); + delwin(wb); + + wgetch_help(win, flags); + wmove(win, old_y, old_x); + touchwin(win); + wrefresh(win); + doupdate(); + } +#ifdef SIGTSTP + } else if (c == 'z') { + kill(getpid(), SIGTSTP); +#endif + } else { + wprintw(win, "Key pressed: %04o ", c); +#ifdef NCURSES_MOUSE_VERSION + if (c == KEY_MOUSE) { + show_mouse(win); + } else +#endif /* NCURSES_MOUSE_VERSION */ + if (c >= KEY_MIN) { +#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE + if (c == KEY_RESIZE) { + resize_boxes(level, win); + } +#endif + (void) waddstr(win, keyname(c)); + } else if (c >= 0x80) { + unsigned c2 = (unsigned) c; +#if !(defined(NCURSES_VERSION) || defined(_XOPEN_CURSES)) + /* at least Solaris SVR4 curses breaks unctrl(128), etc. */ + c2 &= 0x7f; +#endif + if (isprint(UChar(c))) + (void) wprintw(win, "%c", UChar(c)); + else if (c2 != UChar(c)) + (void) wprintw(win, "M-%s", unctrl(c2)); + else + (void) wprintw(win, "%s", unctrl(c2)); + waddstr(win, " (high-half character)"); + } else { + if (isprint(c)) + (void) wprintw(win, "%c (ASCII printable character)", c); + else + (void) wprintw(win, "%s (ASCII control character)", + unctrl(UChar(c))); + } + wgetch_wrap(win, first_y); + } + } + + wtimeout(win, -1); + + if (!level) + init_getch(win, flags, delay); +} + +static int +begin_getch_test(void) +{ + char buf[BUFSIZ]; + int delay; + + refresh(); + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, (mmask_t *) 0); +#endif + + (void) printw("Delay in 10ths of a second ( for blocking input)? "); + echo(); + getnstr(buf, sizeof(buf) - 1); + noecho(); + nonl(); + + if (isdigit(UChar(buf[0]))) { + delay = atoi(buf) * 100; + } else { + delay = -1; + } + raw(); + move(6, 0); + return delay; +} + +static void +finish_getch_test(void) +{ +#ifdef NCURSES_MOUSE_VERSION + mousemask(0, (mmask_t *) 0); +#endif + erase(); + noraw(); + nl(); + endwin(); +} + +static int +getch_test(bool recur GCC_UNUSED) +{ + int delay = begin_getch_test(); + + slk_restore(); + wgetch_test(0, stdscr, delay); + forget_boxes(); + finish_getch_test(); + slk_clear(); + return OK; +} + +#if USE_WIDEC_SUPPORT +/* + * For wget_wch_test(), we create pairs of windows - one for a box, one for text. + * Resize both and paint the box in the parent. + */ +#if defined(KEY_RESIZE) && HAVE_WRESIZE +static void +resize_wide_boxes(unsigned level, const WINDOW *const win) +{ + unsigned n; + int base = 5; + int high = LINES - base; + int wide = COLS; + + touchwin(stdscr); + wnoutrefresh(stdscr); + + slk_repaint(); + + for (n = 0; n < level; ++n) { + wresize(winstack[n].frame, high, wide); + wresize(winstack[n].text, high - 2, wide - 2); + high -= 2; + wide -= 2; + werase(winstack[n].text); + box_set(winstack[n].frame, 0, 0); + wnoutrefresh(winstack[n].frame); + wprintw(winstack[n].text, + "size %dx%d\n", + getmaxy(winstack[n].text), + getmaxx(winstack[n].text)); + wnoutrefresh(winstack[n].text); + if (winstack[n].text == win) + break; + } + doupdate(); +} +#endif /* KEY_RESIZE */ + +static char * +wcstos(const wchar_t *src) +{ + int need; + char *result = 0; + const wchar_t *tmp = src; +#ifndef state_unused + mbstate_t state; +#endif + + reset_wchars(state); + if ((need = (int) count_wchars(tmp, 0, &state)) > 0) { + unsigned have = (unsigned) need; + if ((result = typeCalloc(char, have + 1)) != 0) { + tmp = src; + if (trans_wchars(result, tmp, have, &state) != have) { + free(result); + result = 0; + } + } else { + failed("wcstos"); + } + } + return result; +} + +static void +wget_wch_test(unsigned level, WINDOW *win, int delay) +{ + wchar_t wchar_buf[BUFSIZ]; + wint_t wint_buf[BUFSIZ]; + int first_y, first_x; + wint_t c; + int incount = 0; + GetchFlags flags; + char *temp; + + init_getch(win, flags, delay); + notimeout(win, FALSE); + wtimeout(win, delay); + getyx(win, first_y, first_x); + + wgetch_help(win, flags); + wsetscrreg(win, first_y, getmaxy(win) - 1); + scrollok(win, TRUE); + + for (;;) { + int code; + + while ((code = wGet_wchar(win, &c)) == ERR) { + incount++; + if (blocking_getch(flags, delay)) { + (void) wprintw(win, "%05d: input error", incount); + break; + } else { + (void) wprintw(win, "%05d: input timed out", incount); + } + wgetch_wrap(win, first_y); + } + if (code == ERR && blocking_getch(flags, delay)) { + wprintw(win, "ERR"); + wgetch_wrap(win, first_y); + } else if (isQuit((int) c, ExitOnEscape())) { + break; + } else if (c == 'e') { + flags[UChar('e')] = !flags[UChar('e')]; + setup_getch(win, flags); + wgetch_help(win, flags); + } else if (c == 'g') { + waddstr(win, "wgetn_str test: "); + echo(); + code = wgetn_wstr(win, wint_buf, BUFSIZ - 1); + noecho(); + if (code == ERR) { + wprintw(win, "wgetn_wstr returns an error."); + } else { + int n; + for (n = 0; (wchar_buf[n] = (wchar_t) wint_buf[n]) != 0; ++n) { + ; + } + if ((temp = wcstos(wchar_buf)) != 0) { + wprintw(win, "I saw %d characters:\n\t`%s'.", + (int) wcslen(wchar_buf), temp); + free(temp); + } else { + wprintw(win, "I saw %d characters (cannot convert).", + (int) wcslen(wchar_buf)); + } + } + wclrtoeol(win); + wgetch_wrap(win, first_y); + } else if (c == 'k') { + flags[UChar('k')] = !flags[UChar('k')]; + setup_getch(win, flags); + wgetch_help(win, flags); + } else if (c == 'm') { + flags[UChar('m')] = !flags[UChar('m')]; + setup_getch(win, flags); + wgetch_help(win, flags); + } else if (c == 's') { + ShellOut(TRUE); + } else if (c == 't') { + notimeout(win, flags[UChar('t')]); + flags[UChar('t')] = !flags[UChar('t')]; + wgetch_help(win, flags); + } else if (c == 'w') { + int high = getmaxy(win) - 1 - first_y + 1; + int wide = getmaxx(win) - first_x; + int old_y, old_x; + int new_y = first_y + getbegy(win); + int new_x = first_x + getbegx(win); + + getyx(win, old_y, old_x); + if (high > 2 && wide > 2) { + WINDOW *wb = newwin(high, wide, new_y, new_x); + WINDOW *wi = newwin(high - 2, wide - 2, new_y + 1, new_x + 1); + + box_set(wb, 0, 0); + wrefresh(wb); + wmove(wi, 0, 0); + remember_boxes(level, wi, wb); + wget_wch_test(level + 1, wi, delay); + delwin(wi); + delwin(wb); + + wgetch_help(win, flags); + wmove(win, old_y, old_x); + touchwin(win); + wrefresh(win); + } +#ifdef SIGTSTP + } else if (c == 'z') { + kill(getpid(), SIGTSTP); +#endif + } else { + wprintw(win, "Key pressed: %04o ", (int) c); +#ifdef NCURSES_MOUSE_VERSION + if (c == KEY_MOUSE) { + show_mouse(win); + } else +#endif /* NCURSES_MOUSE_VERSION */ + if (code == KEY_CODE_YES) { +#if defined(KEY_RESIZE) && HAVE_WRESIZE + if (c == KEY_RESIZE) { + resize_wide_boxes(level, win); + } +#endif + (void) waddstr(win, keyname((wchar_t) c)); + } else { + (void) waddstr(win, key_name((wchar_t) c)); + if (c < 256 && iscntrl(c)) { + (void) wprintw(win, " (control character)"); + } else { + (void) wprintw(win, " = %#x (printable character)", + (unsigned) c); + } + } + wgetch_wrap(win, first_y); + } + } + + wtimeout(win, -1); + + if (!level) + init_getch(win, flags, delay); +} + +static int +x_getch_test(bool recur GCC_UNUSED) +{ + int delay = begin_getch_test(); + + slk_restore(); + wget_wch_test(0, stdscr, delay); + forget_boxes(); + finish_getch_test(); + slk_clear(); + return OK; +} +#endif + +/**************************************************************************** + * + * Character attributes test + * + ****************************************************************************/ + +#if HAVE_SETUPTERM || HAVE_TGETENT +#define get_ncv() TIGETNUM("ncv","NC") +#define get_xmc() TIGETNUM("xmc","sg") +#else +#define get_ncv() -1 +#define get_xmc() -1 +#endif + +#if !HAVE_TERMATTRS +static chtype +my_termattrs(void) +{ + static int first = TRUE; + static chtype result = 0; + + if (first) { +#if !HAVE_TIGETSTR + char buffer[4096]; + char parsed[4096]; + char *area_pointer = parsed; + + tgetent(buffer, getenv("TERM")); +#endif + + if (TIGETSTR("smso", "so")) + result |= A_STANDOUT; + if (TIGETSTR("smul", "us")) + result |= A_UNDERLINE; + if (TIGETSTR("rev", "mr")) + result |= A_REVERSE; + if (TIGETSTR("blink", "mb")) + result |= A_BLINK; + if (TIGETSTR("dim", "mh")) + result |= A_DIM; + if (TIGETSTR("bold", "md")) + result |= A_BOLD; + if (TIGETSTR("smacs", "ac")) + result |= A_ALTCHARSET; + + first = FALSE; + } + return result; +} +#define termattrs() my_termattrs() +#endif + +#define ATTRSTRING_1ST 32 /* ' ' */ +#define ATTRSTRING_END 126 /* '~' */ + +#define COLS_PRE_ATTRS 5 +#define COLS_AFT_ATTRS 15 +#define COL_ATTRSTRING (COLS_PRE_ATTRS + 17) +#define LEN_ATTRSTRING (COLS - (COL_ATTRSTRING + COLS_AFT_ATTRS)) +#define MAX_ATTRSTRING (ATTRSTRING_END + 1 - ATTRSTRING_1ST) + +static char attr_test_string[MAX_ATTRSTRING + 1]; + +static void +attr_legend(WINDOW *helpwin) +{ + int row = 1; + int col = 1; + + MvWPrintw(helpwin, row++, col, + "ESC to exit."); + MvWPrintw(helpwin, row++, col, + "^L repaints."); + ++row; + MvWPrintw(helpwin, row++, col, + "Modify the test strings:"); + MvWPrintw(helpwin, row++, col, + " A digit sets gaps on each side of displayed attributes"); + MvWPrintw(helpwin, row++, col, + " shifts the text left/right. "); + ++row; + MvWPrintw(helpwin, row++, col, + "Toggles:"); + if (UseColors) { + MvWPrintw(helpwin, row++, col, + " f/F/b/B toggle foreground/background background color"); + MvWPrintw(helpwin, row++, col, + " t/T toggle text/background color attribute"); + } + MvWPrintw(helpwin, row++, col, + " a/A toggle ACS (alternate character set) mapping"); + MvWPrintw(helpwin, row, col, + " v/V toggle video attribute to combine with each line"); +#if USE_WIDEC_SUPPORT + MvWPrintw(helpwin, row, col, + " w/W toggle normal/wide (double-width) test-characters"); +#endif +} + +static void +show_color_attr(int fg, int bg, int tx) +{ + if (UseColors) { + printw(" Colors (fg %d, bg %d", fg, bg); + if (tx >= 0) + printw(", text %d", tx); + printw("),"); + } +} + +static bool +cycle_color_attr(int ch, NCURSES_COLOR_T *fg, NCURSES_COLOR_T *bg, NCURSES_COLOR_T *tx) +{ + bool error = FALSE; + + if (UseColors) { + switch (ch) { + case 'f': + *fg = (NCURSES_COLOR_T) (*fg + 1); + break; + case 'F': + *fg = (NCURSES_COLOR_T) (*fg - 1); + break; + case 'b': + *bg = (NCURSES_COLOR_T) (*bg + 1); + break; + case 'B': + *bg = (NCURSES_COLOR_T) (*bg - 1); + break; + case 't': + *tx = (NCURSES_COLOR_T) (*tx + 1); + break; + case 'T': + *tx = (NCURSES_COLOR_T) (*tx - 1); + break; + default: + beep(); + error = TRUE; + break; + } + if (*fg >= COLORS) + *fg = (NCURSES_COLOR_T) MinColors; + if (*fg < MinColors) + *fg = (NCURSES_COLOR_T) (COLORS - 1); + if (*bg >= COLORS) + *bg = (NCURSES_COLOR_T) MinColors; + if (*bg < MinColors) + *bg = (NCURSES_COLOR_T) (COLORS - 1); + if (*tx >= COLORS) + *tx = -1; + if (*tx < -1) + *tx = (NCURSES_COLOR_T) (COLORS - 1); + } else { + beep(); + error = TRUE; + } + return error; +} + +static void +adjust_attr_string(int adjust) +{ + char save = attr_test_string[0]; + int first = ((int) UChar(save)) + adjust; + + if (first >= ATTRSTRING_1ST) { + int j, k; + + for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) { + if (k > ATTRSTRING_END) + break; + attr_test_string[j] = (char) k; + if (((k + 1 - first) % 5) == 0) { + if (++j >= MAX_ATTRSTRING) + break; + attr_test_string[j] = ' '; + } + } + if ((LEN_ATTRSTRING - j) > 5) { + attr_test_string[0] = save; + adjust_attr_string(adjust - 1); + } else { + while (j < MAX_ATTRSTRING) + attr_test_string[j++] = ' '; + attr_test_string[j] = '\0'; + } + } +} + +/* + * Prefer the right-end of the string for starting, since that maps to the + * VT100 line-drawing. + */ +static int +default_attr_string(void) +{ + int result = (ATTRSTRING_END - LEN_ATTRSTRING); + result += (LEN_ATTRSTRING / 5); + if (result < ATTRSTRING_1ST) + result = ATTRSTRING_1ST; + return result; +} + +static void +init_attr_string(void) +{ + attr_test_string[0] = (char) default_attr_string(); + adjust_attr_string(0); +} + +static int +show_attr(WINDOW *win, int row, int skip, bool arrow, chtype attr, const char *name) +{ + int ncv = get_ncv(); + chtype test = attr & (chtype) (~(A_ALTCHARSET | A_CHARTEXT)); + + if (arrow) + MvPrintw(row, COLS_PRE_ATTRS - 3, "-->"); + MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name); + MvPrintw(row, COL_ATTRSTRING - 1, "|"); + if (skip) + printw("%*s", skip, " "); + /* + * Just for testing, write text using the alternate character set one + * character at a time (to pass its rendition directly), and use the + * string operation for the other attributes. + */ + wmove(win, 0, 0); + werase(win); + if (attr & A_ALTCHARSET) { + const char *s; + + for (s = attr_test_string; *s != '\0'; ++s) { + chtype ch = UChar(*s); + (void) waddch(win, ch | attr); + } + } else { + (void) wattrset(win, AttrArg(attr, 0)); + (void) waddstr(win, attr_test_string); + (void) wattroff(win, (int) attr); + } + if (skip) + printw("%*s", skip, " "); + MvPrintw(row, COL_ATTRSTRING + LEN_ATTRSTRING, "|"); + if (test != A_NORMAL) { + if (!(termattrs() & test)) { + printw(" (N/A)"); + } else { + if (ncv > 0 && stdscr && (getbkgd(stdscr) & A_COLOR)) { + static const chtype table[] = + { + A_STANDOUT, + A_UNDERLINE, + A_REVERSE, + A_BLINK, + A_DIM, + A_BOLD, +#ifdef A_INVIS + A_INVIS, +#endif +#ifdef A_ITALIC + A_ITALIC, +#endif + A_PROTECT, + A_ALTCHARSET + }; + unsigned n; + bool found = FALSE; + for (n = 0; n < SIZEOF(table); n++) { + if ((table[n] & attr) != 0 + && ((1 << n) & ncv) != 0) { + found = TRUE; + break; + } + } + if (found) + printw(" (NCV)"); + } + if ((termattrs() & test) != test) { + printw(" (Part)"); + } + } + } + return row + 2; +} + +typedef struct { + chtype attr; + NCURSES_CONST char *name; +} ATTR_TBL; +/* *INDENT-OFF* */ +static const ATTR_TBL attrs_to_test[] = { + { A_STANDOUT, "STANDOUT" }, + { A_REVERSE, "REVERSE" }, + { A_BOLD, "BOLD" }, + { A_UNDERLINE, "UNDERLINE" }, + { A_DIM, "DIM" }, + { A_BLINK, "BLINK" }, + { A_PROTECT, "PROTECT" }, +#ifdef A_INVIS + { A_INVIS, "INVISIBLE" }, +#endif +#ifdef A_ITALIC + { A_ITALIC, "ITALIC" }, +#endif + { A_NORMAL, "NORMAL" }, +}; +/* *INDENT-ON* */ + +static unsigned +init_attr_list(ATTR_TBL * target, attr_t attrs) +{ + unsigned result = 0; + size_t n; + + for (n = 0; n < SIZEOF(attrs_to_test); ++n) { + attr_t test = attrs_to_test[n].attr; + if (test == A_NORMAL || (test & attrs) != 0) { + target[result++] = attrs_to_test[n]; + } + } + return result; +} + +#if USE_WIDEC_SUPPORT +typedef struct { + attr_t attr; + NCURSES_CONST char *name; +} W_ATTR_TBL; +/* *INDENT-OFF* */ +static const W_ATTR_TBL w_attrs_to_test[] = { + { WA_STANDOUT, "STANDOUT" }, + { WA_REVERSE, "REVERSE" }, + { WA_BOLD, "BOLD" }, + { WA_UNDERLINE, "UNDERLINE" }, + { WA_DIM, "DIM" }, + { WA_BLINK, "BLINK" }, + { WA_PROTECT, "PROTECT" }, +#ifdef WA_INVIS + { WA_INVIS, "INVISIBLE" }, +#endif +#ifdef WA_ITALIC + { WA_ITALIC, "ITALIC" }, +#endif + { WA_NORMAL, "NORMAL" }, +}; +/* *INDENT-ON* */ + +static unsigned +init_w_attr_list(W_ATTR_TBL * target, attr_t attrs) +{ + unsigned result = 0; + size_t n; + + for (n = 0; n < SIZEOF(w_attrs_to_test); ++n) { + attr_t test = w_attrs_to_test[n].attr; + if (test == WA_NORMAL || (test & attrs) != 0) { + target[result++] = w_attrs_to_test[n]; + } + } + return result; +} +#endif + +static bool +attr_getc(int *skip, + NCURSES_COLOR_T *fg, + NCURSES_COLOR_T *bg, + NCURSES_COLOR_T *tx, + int *ac, + unsigned *kc, + unsigned limit) +{ + bool result = TRUE; + bool error = FALSE; + WINDOW *helpwin; + + do { + int ch = Getchar(); + + error = FALSE; + if (ch < 256 && isdigit(ch)) { + *skip = (ch - '0'); + } else { + switch (ch) { + case CTRL('L'): + Repaint(); + break; + case HELP_KEY_1: + if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { + box(helpwin, 0, 0); + attr_legend(helpwin); + wGetchar(helpwin); + delwin(helpwin); + } + break; + case 'a': + *ac = 0; + break; + case 'A': + *ac = A_ALTCHARSET; + break; + case 'v': + if (*kc == 0) + *kc = limit - 1; + else + *kc -= 1; + break; + case 'V': + *kc += 1; + if (*kc >= limit) + *kc = 0; + break; + case '<': + adjust_attr_string(-1); + break; + case '>': + adjust_attr_string(1); + break; + case case_QUIT: + result = FALSE; + break; + default: + error = cycle_color_attr(ch, fg, bg, tx); + break; + } + } + } while (error); + return result; +} + +static int +attr_test(bool recur GCC_UNUSED) +/* test text attributes */ +{ + int n; + int skip = get_xmc(); + NCURSES_COLOR_T fg = COLOR_BLACK; /* color pair 0 is special */ + NCURSES_COLOR_T bg = COLOR_BLACK; + NCURSES_COLOR_T tx = -1; + int ac = 0; + WINDOW *my_wins[SIZEOF(attrs_to_test)]; + ATTR_TBL my_list[SIZEOF(attrs_to_test)]; + unsigned my_size = init_attr_list(my_list, termattrs()); + + if (my_size > 1) { + unsigned j, k; + + for (j = 0; j < my_size; ++j) { + my_wins[j] = subwin(stdscr, + 1, LEN_ATTRSTRING, + 2 + (int) (2 * j), COL_ATTRSTRING); + scrollok(my_wins[j], FALSE); + } + + if (skip < 0) + skip = 0; + + n = skip; /* make it easy */ + k = my_size - 1; + init_attr_string(); + + do { + int row = 2; + chtype normal = A_NORMAL | BLANK; + chtype extras = (chtype) ac; + + if (UseColors) { + NCURSES_PAIRS_T pair; + if ((fg != COLOR_BLACK) || (bg != COLOR_BLACK)) { + pair = 1; + if (init_pair(pair, fg, bg) == ERR) { + beep(); + } else { + normal |= (chtype) COLOR_PAIR(pair); + } + } + if (tx >= 0) { + pair = 2; + if (init_pair(pair, tx, bg) == ERR) { + beep(); + } else { + extras |= (chtype) COLOR_PAIR(pair); + normal &= ~A_COLOR; + } + } + } + bkgd(normal); + bkgdset(normal); + erase(); + + box(stdscr, 0, 0); + MvAddStr(0, 20, "Character attribute test display"); + + for (j = 0; j < my_size; ++j) { + bool arrow = (j == k); + row = show_attr(my_wins[j], row, n, arrow, + normal | + extras | + my_list[j].attr | + my_list[k].attr, + my_list[j].name); + } + + MvPrintw(row, COLS_PRE_ATTRS, + "This terminal does %shave the magic-cookie glitch", + get_xmc() > -1 ? "" : "not "); + MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help."); + show_color_attr(fg, bg, tx); + printw(" ACS (%d)", ac != 0); + + refresh(); + } while (attr_getc(&n, &fg, &bg, &tx, &ac, &k, my_size)); + + bkgdset(A_NORMAL | BLANK); + erase(); + endwin(); + return OK; + } else { + Cannot("does not support video attributes."); + return ERR; + } +} + +#if USE_WIDEC_SUPPORT +static bool use_fullwidth; +static wchar_t wide_attr_test_string[MAX_ATTRSTRING + 1]; + +#define FULL_LO 0xff00 +#define FULL_HI 0xff5e +#define HALF_LO 0x20 + +#define isFullWidth(ch) ((int)(ch) >= FULL_LO && (int)(ch) <= FULL_HI) +#define ToNormalWidth(ch) (wchar_t) (((int)(ch) - FULL_LO) + HALF_LO) +#define ToFullWidth(ch) (wchar_t) (((int)(ch) - HALF_LO) + FULL_LO) + +/* + * Returns an ASCII code in [32..126] + */ +static wchar_t +normal_wchar(int ch) +{ + wchar_t result = (wchar_t) ch; + if (isFullWidth(ch)) + result = ToNormalWidth(ch); + return result; +} + +/* + * Returns either an ASCII code in in [32..126] or full-width in + * [0xff00..0xff5e], according to use_fullwidth setting. + */ +static wchar_t +target_wchar(int ch) +{ + wchar_t result = (wchar_t) ch; + if (use_fullwidth) { + if (!isFullWidth(ch)) + result = ToFullWidth(ch); + } else { + if (isFullWidth(ch)) + result = ToNormalWidth(ch); + } + return result; +} + +static void +wide_adjust_attr_string(int adjust) +{ + wchar_t save = wide_attr_test_string[0]; + int first = ((int) normal_wchar(save)) + adjust; + + if (first >= ATTRSTRING_1ST) { + int j, k; + + for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) { + if (k > ATTRSTRING_END) + break; + wide_attr_test_string[j] = target_wchar(k); + if (((k + 1 - first) % 5) == 0) { + if (++j >= MAX_ATTRSTRING) + break; + wide_attr_test_string[j] = ' '; + } + } + if ((LEN_ATTRSTRING - j) > 5) { + wide_attr_test_string[0] = save; + wide_adjust_attr_string(adjust - 1); + } else { + while (j < MAX_ATTRSTRING) + wide_attr_test_string[j++] = ' '; + wide_attr_test_string[j] = '\0'; + } + } +} + +static void +wide_init_attr_string(void) +{ + use_fullwidth = FALSE; + wide_attr_test_string[0] = (wchar_t) default_attr_string(); + wide_adjust_attr_string(0); +} + +static void +set_wide_background(NCURSES_PAIRS_T pair) +{ + cchar_t normal; + wchar_t blank[2]; + + blank[0] = ' '; + blank[1] = 0; + setcchar(&normal, blank, A_NORMAL, pair, 0); + bkgrnd(&normal); + bkgrndset(&normal); +} + +static attr_t +get_wide_background(void) +{ + attr_t result = WA_NORMAL; + attr_t attr; + cchar_t ch; + NCURSES_PAIRS_T pair; + + memset(&ch, 0, sizeof(ch)); + if (getbkgrnd(&ch) != ERR) { + wchar_t wch[CCHARW_MAX]; + + if (getcchar(&ch, wch, &attr, &pair, 0) != ERR) { + result = attr; + } + } + return result; +} + +static int +wide_show_attr(WINDOW *win, + int row, + int skip, + bool arrow, + attr_t attr, + NCURSES_PAIRS_T pair, + const char *name) +{ + int ncv = get_ncv(); + attr_t test = attr & ~WA_ALTCHARSET; + + if (arrow) + MvPrintw(row, COLS_PRE_ATTRS - 3, "-->"); + MvPrintw(row, COLS_PRE_ATTRS, "%s mode:", name); + MvPrintw(row, COL_ATTRSTRING - 1, "|"); + if (skip) + printw("%*s", skip, " "); + + /* + * Just for testing, write text using the alternate character set one + * character at a time (to pass its rendition directly), and use the + * string operation for the other attributes. + */ + wmove(win, 0, 0); + werase(win); + if (attr & WA_ALTCHARSET) { + const wchar_t *s; + cchar_t ch; + + for (s = wide_attr_test_string; *s != L'\0'; ++s) { + wchar_t fill[2]; + fill[0] = *s; + fill[1] = L'\0'; + setcchar(&ch, fill, attr, pair, 0); + (void) wadd_wch(win, &ch); + } + } else { + attr_t old_attr = 0; + NCURSES_PAIRS_T old_pair = 0; + + (void) (wattr_get) (win, &old_attr, &old_pair, 0); + (void) wattr_set(win, attr, pair, 0); + (void) waddwstr(win, wide_attr_test_string); + (void) wattr_set(win, old_attr, old_pair, 0); + } + if (skip) + printw("%*s", skip, " "); + MvPrintw(row, COL_ATTRSTRING + LEN_ATTRSTRING, "|"); + if (test != A_NORMAL) { + if (!(term_attrs() & test)) { + printw(" (N/A)"); + } else { + if (ncv > 0 && (get_wide_background() & A_COLOR)) { + static const attr_t table[] = + { + WA_STANDOUT, + WA_UNDERLINE, + WA_REVERSE, + WA_BLINK, + WA_DIM, + WA_BOLD, + WA_INVIS, + WA_PROTECT, + WA_ALTCHARSET + }; + unsigned n; + bool found = FALSE; + for (n = 0; n < SIZEOF(table); n++) { + if ((table[n] & attr) != 0 + && ((1 << n) & ncv) != 0) { + found = TRUE; + break; + } + } + if (found) + printw(" (NCV)"); + } + if ((term_attrs() & test) != test) { + printw(" (Part)"); + } + } + } + return row + 2; +} + +static bool +wide_attr_getc(int *skip, + NCURSES_COLOR_T *fg, NCURSES_COLOR_T *bg, + NCURSES_COLOR_T *tx, int *ac, + unsigned *kc, unsigned limit) +{ + bool result = TRUE; + bool error = FALSE; + WINDOW *helpwin; + + do { + int ch = Getchar(); + + error = FALSE; + if (ch < 256 && isdigit(ch)) { + *skip = (ch - '0'); + } else { + switch (ch) { + case CTRL('L'): + Repaint(); + break; + case HELP_KEY_1: + if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { + box_set(helpwin, 0, 0); + attr_legend(helpwin); + wGetchar(helpwin); + delwin(helpwin); + } + break; + case 'a': + *ac = 0; + break; + case 'A': + *ac = A_ALTCHARSET; + break; + case 'v': + if (*kc == 0) + *kc = limit - 1; + else + *kc -= 1; + break; + case 'V': + *kc += 1; + if (*kc >= limit) + *kc = 0; + break; + case 'w': + use_fullwidth = FALSE; + wide_adjust_attr_string(0); + break; + case 'W': + use_fullwidth = TRUE; + wide_adjust_attr_string(0); + break; + case '<': + wide_adjust_attr_string(-1); + break; + case '>': + wide_adjust_attr_string(1); + break; + case case_QUIT: + result = FALSE; + break; + default: + error = cycle_color_attr(ch, fg, bg, tx); + break; + } + } + } while (error); + return result; +} + +static int +x_attr_test(bool recur GCC_UNUSED) +/* test text attributes using wide-character calls */ +{ + int n; + int skip = get_xmc(); + NCURSES_COLOR_T fg = COLOR_BLACK; /* color pair 0 is special */ + NCURSES_COLOR_T bg = COLOR_BLACK; + NCURSES_COLOR_T tx = -1; + int ac = 0; + W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)]; + WINDOW *my_wins[SIZEOF(w_attrs_to_test)]; + unsigned my_size = init_w_attr_list(my_list, term_attrs()); + + if (my_size > 1) { + unsigned j, k; + + for (j = 0; j < my_size; ++j) { + my_wins[j] = subwin(stdscr, + 1, LEN_ATTRSTRING, + 2 + (int) (2 * j), COL_ATTRSTRING); + scrollok(my_wins[j], FALSE); + } + + if (skip < 0) + skip = 0; + + n = skip; /* make it easy */ + k = my_size - 1; + wide_init_attr_string(); + + do { + int row = 2; + NCURSES_PAIRS_T pair = 0; + NCURSES_PAIRS_T extras = 0; + + if (UseColors) { + pair = (NCURSES_PAIRS_T) (fg != COLOR_BLACK || bg != COLOR_BLACK); + if (pair != 0) { + pair = 1; + if (init_pair(pair, fg, bg) == ERR) { + beep(); + } + } + extras = pair; + if (tx >= 0) { + extras = 2; + if (init_pair(extras, tx, bg) == ERR) { + beep(); + } + } + } + set_wide_background(pair); + erase(); + + box_set(stdscr, 0, 0); + MvAddStr(0, 20, "Character attribute test display"); + + for (j = 0; j < my_size; ++j) { + row = wide_show_attr(my_wins[j], row, n, (j == k), + ((attr_t) ac | + my_list[j].attr | + my_list[k].attr), + extras, + my_list[j].name); + } + + MvPrintw(row, COLS_PRE_ATTRS, + "This terminal does %shave the magic-cookie glitch", + get_xmc() > -1 ? "" : "not "); + MvPrintw(row + 1, COLS_PRE_ATTRS, "Enter '?' for help."); + show_color_attr(fg, bg, tx); + printw(" ACS (%d)", ac != 0); + + refresh(); + } while (wide_attr_getc(&n, &fg, &bg, &tx, &ac, &k, my_size)); + + set_wide_background(0); + erase(); + endwin(); + return OK; + } else { + Cannot("does not support extended video attributes."); + return ERR; + } +} +#endif + +/**************************************************************************** + * + * Color support tests + * + ****************************************************************************/ + +static NCURSES_CONST char *the_color_names[] = +{ + "black", + "red", + "green", + "yellow", + "blue", + "magenta", + "cyan", + "white", + "BLACK", + "RED", + "GREEN", + "YELLOW", + "BLUE", + "MAGENTA", + "CYAN", + "WHITE" +}; + +static void +show_color_name(int y, int x, int color, bool wide, int zoom) +{ + if (move(y, x) != ERR) { + char temp[80]; + int width = 8; + + if (wide || zoom) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%02d", color); + if (wide) + width = 4; + if ((int) strlen(temp) >= width) { + int pwr2 = 0; + while ((1 << pwr2) < color) + ++pwr2; + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + width > 4 ? "2^%d" : "^%d", pwr2); + } + } else if (color >= 8) { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "[%02d]", color); + } else if (color < 0) { + _nc_STRCPY(temp, "default", sizeof(temp)); + } else { + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%.*s", 16, the_color_names[color]); + } + printw("%-*.*s", width, width, temp); + } +} + +static void +color_legend(WINDOW *helpwin, bool wide) +{ + int row = 1; + int col = 1; + + MvWPrintw(helpwin, row++, col, + "ESC to exit."); + ++row; + MvWPrintw(helpwin, row++, col, + "Use up/down arrow to scroll through the display if it is"); + MvWPrintw(helpwin, row++, col, + "longer than one screen. Control/N and Control/P can be used"); + MvWPrintw(helpwin, row++, col, + "in place of up/down arrow. Use pageup/pagedown to scroll a"); + MvWPrintw(helpwin, row++, col, + "full screen; control/B and control/F can be used here."); + ++row; + MvWPrintw(helpwin, row++, col, + "Toggles:"); + MvWPrintw(helpwin, row++, col, + " a/A toggle altcharset off/on"); + MvWPrintw(helpwin, row++, col, + " b/B toggle bold off/on"); + if (has_colors()) { + MvWPrintw(helpwin, row++, col, + " c/C cycle used-colors through 8,16,...,COLORS"); + } + MvWPrintw(helpwin, row++, col, + " n/N toggle text/number on/off"); + MvWPrintw(helpwin, row++, col, + " r/R toggle reverse on/off"); + MvWPrintw(helpwin, row++, col, + " w/W switch width between 4/8 columns"); + MvWPrintw(helpwin, row++, col, + " z/Z zoom out (or in)"); +#if USE_WIDEC_SUPPORT + if (wide) { + MvWPrintw(helpwin, row++, col, + "Wide characters:"); + MvWPrintw(helpwin, row, col, + " x/X toggle text between ASCII and wide-character"); + } +#else + (void) wide; +#endif +} + +#define set_color_test(name, value) if (name != value) { name = value; base_row = 0; } + +static int +color_cycle(int current, int step) +{ + int result = current; + if (step < 0) { + if (current <= 8) { + result = COLORS; + } else { + result = 8; + if ((result * 2) > COLORS) { + result = COLORS; + } else { + while ((result * 2) < current) { + result *= 2; + } + } + } + } else { + if (current >= COLORS) { + result = 8; + } else { + result *= 2; + } + if (result > COLORS) + result = COLORS; + } + return result; +} + +/* generate a color test pattern */ +static int +color_test(bool recur GCC_UNUSED) +{ + NCURSES_PAIRS_T i; + int top = 0, width; + int base_row = 0; + int grid_top = top + 3; + int page_size = (LINES - grid_top); + int pairs_max; + int colors_max = COLORS; + int col_limit; + int row_limit; + int per_row; + char *numbered = 0; + const char *hello; + bool done = FALSE; + bool opt_acsc = FALSE; + bool opt_bold = FALSE; + bool opt_revs = FALSE; + bool opt_nums = FALSE; + bool opt_wide = FALSE; + int opt_zoom = 0; + WINDOW *helpwin; + + if (!UseColors) { + Cannot("does not support color."); + return ERR; + } + + numbered = typeCalloc(char, COLS + 1); + done = ((COLS < 16) || (numbered == 0)); + + /* + * Because the number of colors is usually a power of two, we also use + * a power of two for the number of colors shown per line (to be tidy). + */ + for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ; + + reloop: + while (!done) { + int shown = 0; + int zoom_size = (1 << opt_zoom); + int colors_max1 = colors_max / zoom_size; + double colors_max2 = (double) colors_max1 * (double) colors_max1; + + pairs_max = PAIR_NUMBER(A_COLOR) + 1; + if (colors_max2 <= COLOR_PAIRS) { + int limit = (colors_max1 - MinColors) * (colors_max1 - MinColors); + if (pairs_max > limit) + pairs_max = limit; + } + if (pairs_max > COLOR_PAIRS) + pairs_max = COLOR_PAIRS; + if (pairs_max < colors_max1) + pairs_max = colors_max1; + + /* this assumes an 80-column line */ + if (opt_wide) { + width = 4; + hello = "Test"; + per_row = (col_limit / ((colors_max1 > 8) ? width : 8)); + } else { + width = 8; + hello = "Hello"; + per_row = (col_limit / width); + } + per_row -= MinColors; + + row_limit = (pairs_max + per_row - 1) / per_row; + + move(0, 0); + (void) printw("There are %d color pairs and %d colors", + pairs_max, COLORS); + if (colors_max1 != COLORS) + (void) printw(" (using %d colors)", colors_max1); + if (MinColors) + (void) addstr(" besides 'default'"); + if (opt_zoom) + (void) printw(" zoom:%d", opt_zoom); + + clrtobot(); + MvPrintw(top + 1, 0, + "%dx%d matrix of foreground/background colors, bold *%s*\n", + row_limit, + per_row, + opt_bold ? "on" : "off"); + + /* show color names/numbers across the top */ + for (i = 0; i < per_row; i++) { + show_color_name(top + 2, + (i + 1) * width, + (int) i * zoom_size + MinColors, + opt_wide, + opt_zoom); + } + + /* show a grid of colors, with color names/ numbers on the left */ + for (i = (NCURSES_PAIRS_T) (base_row * per_row); i < pairs_max; i++) { + int row = grid_top + (i / per_row) - base_row; + int col = (i % per_row + 1) * width; + + if ((i / per_row) > row_limit) + break; + +#define InxToFG(i) (int)((((unsigned long)(i) * (unsigned long)zoom_size) % (unsigned long)(colors_max1 - MinColors)) + (unsigned long)MinColors) +#define InxToBG(i) (int)((((unsigned long)(i) * (unsigned long)zoom_size) / (unsigned long)(colors_max1 - MinColors)) + (unsigned long)MinColors) + if (row >= 0 && move(row, col) != ERR) { + NCURSES_COLOR_T fg = (NCURSES_COLOR_T) InxToFG(i); + NCURSES_COLOR_T bg = (NCURSES_COLOR_T) InxToBG(i); + NCURSES_PAIRS_T pair = i; + + init_pair(pair, fg, bg); + attron(COLOR_PAIR(pair)); + if (opt_acsc) + attron(A_ALTCHARSET); + if (opt_bold) + attron(A_BOLD); + if (opt_revs) + attron(A_REVERSE); + + if (opt_nums) { + _nc_SPRINTF(numbered, _nc_SLIMIT((size_t) (COLS + 1)) + "{%02X}", (int) i); + hello = numbered; + } + printw("%-*.*s", width, width, hello); + (void) attrset(A_NORMAL); + + if ((i % per_row) == 0 && InxToFG(i) == MinColors) { + show_color_name(row, 0, + InxToBG(i), + opt_wide, + opt_zoom); + } + ++shown; + } else if (shown) { + break; + } + } + + switch (wGetchar(stdscr)) { + case 'a': + opt_acsc = FALSE; + break; + case 'A': + opt_acsc = TRUE; + break; + case 'b': + opt_bold = FALSE; + break; + case 'B': + opt_bold = TRUE; + break; + case 'c': + colors_max = color_cycle(colors_max, -1); + break; + case 'C': + colors_max = color_cycle(colors_max, 1); + break; + case 'n': + opt_nums = FALSE; + break; + case 'N': + opt_nums = TRUE; + break; + case 'r': + opt_revs = FALSE; + break; + case 'R': + opt_revs = TRUE; + break; + case case_QUIT: + done = TRUE; + continue; + case 'w': + set_color_test(opt_wide, FALSE); + break; + case 'W': + set_color_test(opt_wide, TRUE); + break; + case 'z': + if (opt_zoom <= 0) { + beep(); + } else { + --opt_zoom; + goto reloop; + } + break; + case 'Z': + if ((1 << opt_zoom) >= colors_max) { + beep(); + } else { + ++opt_zoom; + goto reloop; + } + break; + case CTRL('p'): + case KEY_UP: + if (base_row <= 0) { + beep(); + } else { + base_row -= 1; + } + break; + case CTRL('n'): + case KEY_DOWN: + if (base_row + page_size >= row_limit) { + beep(); + } else { + base_row += 1; + } + break; + case CTRL('b'): + case KEY_PREVIOUS: + case KEY_PPAGE: + if (base_row <= 0) { + beep(); + } else { + base_row -= (page_size - 1); + if (base_row < 0) + base_row = 0; + } + break; + case CTRL('f'): + case KEY_NEXT: + case KEY_NPAGE: + if (base_row + page_size >= row_limit) { + beep(); + } else { + base_row += page_size - 1; + if (base_row + page_size >= row_limit) { + base_row = row_limit - page_size - 1; + } + } + break; + case HELP_KEY_1: + if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { + box(helpwin, 0, 0); + color_legend(helpwin, FALSE); + wGetchar(helpwin); + delwin(helpwin); + } + break; + default: + beep(); + continue; + } + } + + erase(); + endwin(); + + free(numbered); + return OK; +} + +#if USE_WIDEC_SUPPORT + +#if USE_EXTENDED_COLOR +#define InitExtendedPair(p,f,g) init_extended_pair((p),(f),(g)) +#define ExtendedColorSet(p) color_set((NCURSES_PAIRS_T) (p), &(p)) +#define EXTENDED_PAIRS_T int +#else +#define InitExtendedPair(p,f,g) init_pair((NCURSES_PAIRS_T) (p),(NCURSES_COLOR_T)(f),(NCURSES_COLOR_T)(g)) +#define ExtendedColorSet(p) color_set((NCURSES_PAIRS_T) (p), NULL) +#define EXTENDED_PAIRS_T NCURSES_PAIRS_T +#endif + +/* generate a color test pattern */ +static int +x_color_test(bool recur GCC_UNUSED) +{ + int i; + int top = 0, width; + int base_row = 0; + int grid_top = top + 3; + int page_size = (LINES - grid_top); + int pairs_max; + int colors_max = COLORS; + int col_limit; + int row_limit; + int per_row; + char *numbered = 0; + const char *hello; + bool done = FALSE; + bool opt_acsc = FALSE; + bool opt_bold = FALSE; + bool opt_revs = FALSE; + bool opt_wide = FALSE; + bool opt_nums = FALSE; + bool opt_xchr = FALSE; + int opt_zoom = 0; + wchar_t *buffer = 0; + WINDOW *helpwin; + + if (!UseColors) { + Cannot("does not support color."); + return ERR; + } + numbered = typeCalloc(char, COLS + 1); + buffer = typeCalloc(wchar_t, COLS + 1); + done = ((COLS < 16) || (numbered == 0) || (buffer == 0)); + + /* + * Because the number of colors is usually a power of two, we also use + * a power of two for the number of colors shown per line (to be tidy). + */ + for (col_limit = 1; col_limit * 2 < COLS; col_limit *= 2) ; + + reloop: + while (!done) { + int shown = 0; + int zoom_size = (1 << opt_zoom); + int colors_max1 = colors_max / zoom_size; + double colors_max2 = (double) colors_max1 * (double) colors_max1; + + pairs_max = ((unsigned) (-1)) / 2; + if (colors_max2 <= COLOR_PAIRS) { + int limit = (colors_max1 - MinColors) * (colors_max1 - MinColors); + if (pairs_max > limit) + pairs_max = limit; + } + if (pairs_max > COLOR_PAIRS) + pairs_max = COLOR_PAIRS; + if (pairs_max < colors_max1) + pairs_max = colors_max1; + + if (opt_wide) { + width = 4; + hello = "Test"; + per_row = (col_limit / ((colors_max1 > 8) ? width : 8)); + } else { + width = 8; + hello = "Hello"; + per_row = (col_limit / width); + } + per_row -= MinColors; + + if (opt_xchr) { + make_fullwidth_text(buffer, hello); + width *= 2; + per_row /= 2; + } else { + make_narrow_text(buffer, hello); + } + + row_limit = (pairs_max + per_row - 1) / per_row; + + move(0, 0); + (void) printw("There are %d color pairs and %d colors", + pairs_max, COLORS); + if (colors_max1 != COLORS) + (void) printw(" (using %d colors)", colors_max1); + if (MinColors) + (void) addstr(" besides 'default'"); + if (opt_zoom) + (void) printw(" zoom:%d", opt_zoom); + + clrtobot(); + MvPrintw(top + 1, 0, + "%dx%d matrix of foreground/background colors, bold *%s*\n", + row_limit, + per_row, + opt_bold ? "on" : "off"); + + /* show color names/numbers across the top */ + for (i = 0; i < per_row; i++) { + show_color_name(top + 2, + (i + 1) * width, + i * zoom_size + MinColors, + opt_wide, + opt_zoom); + } + + /* show a grid of colors, with color names/ numbers on the left */ + for (i = (base_row * per_row); i < pairs_max; i++) { + int row = grid_top + (i / per_row) - base_row; + int col = (i % per_row + 1) * width; + int pair = i; + + if ((i / per_row) > row_limit) + break; + + if (row >= 0 && move(row, col) != ERR) { + InitExtendedPair(pair, InxToFG(i), InxToBG(i)); + (void) ExtendedColorSet(pair); + if (opt_acsc) + attr_on(WA_ALTCHARSET, NULL); + if (opt_bold) + attr_on(WA_BOLD, NULL); + if (opt_revs) + attr_on(WA_REVERSE, NULL); + + if (opt_nums) { + _nc_SPRINTF(numbered, + _nc_SLIMIT((size_t) (COLS + 1) * sizeof(wchar_t)) + "{%02X}", (unsigned) i); + if (opt_xchr) { + make_fullwidth_text(buffer, numbered); + } else { + make_narrow_text(buffer, numbered); + } + } + addnwstr(buffer, width); + (void) attr_set(A_NORMAL, 0, NULL); + + if ((i % per_row) == 0 && InxToFG(i) == MinColors) { + show_color_name(row, 0, + InxToBG(i), + opt_wide, + opt_zoom); + } + ++shown; + } else if (shown) { + break; + } + } + + switch (wGetchar(stdscr)) { + case 'a': + opt_acsc = FALSE; + break; + case 'A': + opt_acsc = TRUE; + break; + case 'b': + opt_bold = FALSE; + break; + case 'B': + opt_bold = TRUE; + break; + case 'c': + colors_max = color_cycle(colors_max, -1); + break; + case 'C': + colors_max = color_cycle(colors_max, 1); + break; + case 'n': + opt_nums = FALSE; + break; + case 'N': + opt_nums = TRUE; + break; + case 'r': + opt_revs = FALSE; + break; + case 'R': + opt_revs = TRUE; + break; + case case_QUIT: + done = TRUE; + continue; + case 'w': + set_color_test(opt_wide, FALSE); + break; + case 'W': + set_color_test(opt_wide, TRUE); + break; + case 'x': + opt_xchr = FALSE; + break; + case 'X': + opt_xchr = TRUE; + break; + case 'z': + if (opt_zoom <= 0) { + beep(); + } else { + --opt_zoom; + goto reloop; + } + break; + case 'Z': + if ((1 << opt_zoom) >= colors_max) { + beep(); + } else { + ++opt_zoom; + goto reloop; + } + break; + case CTRL('p'): + case KEY_UP: + if (base_row <= 0) { + beep(); + } else { + base_row -= 1; + } + break; + case CTRL('n'): + case KEY_DOWN: + if (base_row + page_size >= row_limit) { + beep(); + } else { + base_row += 1; + } + break; + case CTRL('b'): + case KEY_PREVIOUS: + case KEY_PPAGE: + if (base_row <= 0) { + beep(); + } else { + base_row -= (page_size - 1); + if (base_row < 0) + base_row = 0; + } + break; + case CTRL('f'): + case KEY_NEXT: + case KEY_NPAGE: + if (base_row + page_size >= row_limit) { + beep(); + } else { + base_row += page_size - 1; + if (base_row + page_size >= row_limit) { + base_row = row_limit - page_size - 1; + } + } + break; + case HELP_KEY_1: + if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) { + box(helpwin, 0, 0); + color_legend(helpwin, TRUE); + wGetchar(helpwin); + delwin(helpwin); + } + break; + default: + beep(); + continue; + } + } + + erase(); + endwin(); + + free(numbered); + free(buffer); + return OK; +} +#endif /* USE_WIDEC_SUPPORT */ + +#if HAVE_COLOR_CONTENT +static void +change_color(NCURSES_PAIRS_T current, int field, int value, int usebase) +{ + NCURSES_COLOR_T red, green, blue; + + color_content(current, &red, &green, &blue); + + switch (field) { + case 0: + red = (NCURSES_COLOR_T) (usebase ? (red + value) : value); + break; + case 1: + green = (NCURSES_COLOR_T) (usebase ? (green + value) : value); + break; + case 2: + blue = (NCURSES_COLOR_T) (usebase ? (blue + value) : value); + break; + } + + if (init_color(current, red, green, blue) == ERR) + beep(); +} + +static void +reset_all_colors(void) +{ + NCURSES_PAIRS_T c; + + for (c = 0; c < COLORS; ++c) + init_color(c, + all_colors[c].red, + all_colors[c].green, + all_colors[c].blue); +} + +#define okCOLOR(n) ((n) >= 0 && (n) < MaxColors) +#define okRGB(n) ((n) >= 0 && (n) <= 1000) +#define DecodeRGB(n) (NCURSES_COLOR_T) ((n * 1000) / 0xffff) + +static void +init_all_colors(bool xterm_colors, NCURSES_CONST char *palette_file) +{ + NCURSES_PAIRS_T cp; + all_colors = typeMalloc(RGB_DATA, (unsigned) MaxColors); + if (!all_colors) + failed("all_colors"); + for (cp = 0; cp < MaxColors; ++cp) { + color_content(cp, + &all_colors[cp].red, + &all_colors[cp].green, + &all_colors[cp].blue); + } + /* xterm and compatible terminals can read results of an OSC string + * asking for the current color palette. + */ + if (xterm_colors) { + int n; + char result[BUFSIZ]; + int check_n; + unsigned check_r, check_g, check_b; + + raw(); + noecho(); + + for (n = 0; n < MaxColors; ++n) { + int got; + + fprintf(stderr, "\033]4;%d;?\007", n); + got = (int) read(0, result, sizeof(result) - 1); + if (got < 0) + break; + result[got] = '\0'; + if (sscanf(result, "\033]4;%d;rgb:%x/%x/%x\007", + &check_n, + &check_r, + &check_g, + &check_b) == 4 && + check_n == n) { + all_colors[n].red = DecodeRGB(check_r); + all_colors[n].green = DecodeRGB(check_g); + all_colors[n].blue = DecodeRGB(check_b); + } else { + break; + } + } + reset_prog_mode(); + } + if (palette_file != 0) { + FILE *fp = fopen(palette_file, "r"); + if (fp != 0) { + char buffer[BUFSIZ]; + int red, green, blue; + int scale = 1000; + int c; + while (fgets(buffer, sizeof(buffer), fp) != 0) { + if (sscanf(buffer, "scale:%d", &c) == 1) { + scale = c; + if (scale < 100) + scale = 100; + if (scale > 1000) + scale = 1000; + } else if (sscanf(buffer, "%d:%d %d %d", + &c, + &red, + &green, + &blue) == 4 + && okCOLOR(c) + && okRGB(red) + && okRGB(green) + && okRGB(blue)) { +#define Scaled(n) (NCURSES_COLOR_T) (((n) * 1000) / scale) + all_colors[c].red = Scaled(red); + all_colors[c].green = Scaled(green); + all_colors[c].blue = Scaled(blue); + } + } + fclose(fp); + } + } +} + +#define scaled_rgb(n) ((255 * (n)) / 1000) + +static int +color_edit(bool recur GCC_UNUSED) +/* display the color test pattern, without trying to edit colors */ +{ + int i; + int current; + int this_c, value, field; + int last_c; + int top_color; + int page_size; + + if (!UseColors) { + Cannot("does not support color."); + return ERR; + } else if (!can_change_color()) { + Cannot("has hardwired color values."); + return ERR; + } + + reset_all_colors(); +#ifdef KEY_RESIZE + retry: +#endif + current = 0; + this_c = 0; + value = 0; + field = 0; + top_color = 0; + page_size = (LINES - 6); + erase(); + + for (i = 0; i < MaxColors; i++) + init_pair((NCURSES_PAIRS_T) i, + (NCURSES_COLOR_T) COLOR_WHITE, + (NCURSES_COLOR_T) i); + + MvPrintw(LINES - 2, 0, "Number: %d", value); + + do { + NCURSES_COLOR_T red, green, blue; + + attron(A_BOLD); + MvAddStr(0, 20, "Color RGB Value Editing"); + attroff(A_BOLD); + + for (i = (NCURSES_COLOR_T) top_color; + (i - top_color < page_size) + && (i < MaxColors); i++) { + char numeric[80]; + + _nc_SPRINTF(numeric, _nc_SLIMIT(sizeof(numeric)) "[%d]", i); + MvPrintw(2 + i - top_color, 0, "%c %-8s:", + (i == current ? '>' : ' '), + (i < (int) SIZEOF(the_color_names) + ? the_color_names[i] : numeric)); + (void) attrset(AttrArg(COLOR_PAIR(i), 0)); + addstr(" "); + (void) attrset(A_NORMAL); + + color_content((NCURSES_PAIRS_T) i, &red, &green, &blue); + addstr(" R = "); + if (current == i && field == 0) + attron(A_STANDOUT); + printw("%04d", (int) red); + if (current == i && field == 0) + (void) attrset(A_NORMAL); + addstr(", G = "); + if (current == i && field == 1) + attron(A_STANDOUT); + printw("%04d", (int) green); + if (current == i && field == 1) + (void) attrset(A_NORMAL); + addstr(", B = "); + if (current == i && field == 2) + attron(A_STANDOUT); + printw("%04d", (int) blue); + if (current == i && field == 2) + (void) attrset(A_NORMAL); + (void) attrset(A_NORMAL); + printw(" ( %3d %3d %3d )", + (int) scaled_rgb(red), + (int) scaled_rgb(green), + (int) scaled_rgb(blue)); + } + + MvAddStr(LINES - 3, 0, + "Use up/down to select a color, left/right to change fields."); + MvAddStr(LINES - 2, 0, + "Modify field by typing nnn=, nnn-, or nnn+. ? for help."); + + move(2 + current - top_color, 0); + + last_c = this_c; + this_c = Getchar(); + if (this_c < 256 && isdigit(this_c) && !isdigit(last_c)) + value = 0; + + switch (this_c) { +#ifdef KEY_RESIZE + case KEY_RESIZE: + move(0, 0); + goto retry; +#endif + case '!': + ShellOut(FALSE); + /* FALLTHRU */ + case CTRL('r'): + endwin(); + refresh(); + break; + case CTRL('l'): + refresh(); + break; + case CTRL('b'): + case KEY_PPAGE: + if (current > 0) + current -= (page_size - 1); + else + beep(); + break; + + case CTRL('f'): + case KEY_NPAGE: + if (current < (MaxColors - 1)) + current += (page_size - 1); + else + beep(); + break; + + case CTRL('p'): + case KEY_UP: + current = (current == 0 ? (MaxColors - 1) : current - 1); + break; + + case CTRL('n'): + case KEY_DOWN: + current = (current == (MaxColors - 1) ? 0 : current + 1); + break; + + case '\t': + case KEY_RIGHT: + field = (field == 2 ? 0 : field + 1); + break; + + case KEY_BTAB: + case KEY_LEFT: + field = (field == 0 ? 2 : field - 1); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + value = value * 10 + (this_c - '0'); + break; + + case '+': + change_color((NCURSES_PAIRS_T) current, field, value, 1); + break; + + case '-': + change_color((NCURSES_PAIRS_T) current, field, -value, 1); + break; + + case '=': + change_color((NCURSES_PAIRS_T) current, field, value, 0); + break; + + case HELP_KEY_1: + erase(); + P(" RGB Value Editing Help"); + P(""); + P("You are in the RGB value editor. Use the arrow keys to select one of"); + P("the fields in one of the RGB triples of the current colors; the one"); + P("currently selected will be reverse-video highlighted."); + P(""); + P("To change a field, enter the digits of the new value; they are echoed"); + P("as entered. Finish by typing `='. The change will take effect instantly."); + P("To increment or decrement a value, use the same procedure, but finish"); + P("with a `+' or `-'."); + P(""); + P("Use `!' to shell-out, ^R or ^L to repaint the screen."); + P(""); + P("Press 'm' to invoke the top-level menu with the current color settings."); + P("To quit, do ESC"); + + Pause(); + erase(); + break; + + case 'm': + endwin(); + main_menu(FALSE); + for (i = 0; i < MaxColors; i++) + init_pair((NCURSES_PAIRS_T) i, + (NCURSES_COLOR_T) COLOR_WHITE, + (NCURSES_COLOR_T) i); + refresh(); + break; + + case case_QUIT: + break; + + default: + beep(); + break; + } + + if (current < 0) + current = 0; + if (current >= MaxColors) + current = MaxColors - 1; + if (current < top_color) + top_color = current; + if (current - top_color >= page_size) + top_color = current - (page_size - 1); + + MvPrintw(LINES - 1, 0, "Number: %d", value); + clrtoeol(); + } while + (!isQuit(this_c, TRUE)); + + erase(); + + /* + * ncurses does not reset each color individually when calling endwin(). + */ + reset_all_colors(); + + endwin(); + return OK; +} +#endif /* HAVE_COLOR_CONTENT */ + +/**************************************************************************** + * + * Alternate character-set stuff + * + ****************************************************************************/ +static bool +cycle_attr(int ch, unsigned *at_code, attr_t *attr, ATTR_TBL * list, unsigned limit) +{ + bool result = TRUE; + + switch (ch) { + case 'v': + if ((*at_code += 1) >= limit) + *at_code = 0; + break; + case 'V': + if (*at_code == 0) + *at_code = limit - 1; + else + *at_code -= 1; + break; + default: + result = FALSE; + break; + } + if (result) + *attr = list[*at_code].attr; + return result; +} + +#if USE_WIDEC_SUPPORT +static bool +cycle_w_attr(int ch, unsigned *at_code, attr_t *attr, W_ATTR_TBL * list, unsigned limit) +{ + bool result = TRUE; + + switch (ch) { + case 'v': + if ((*at_code += 1) >= limit) + *at_code = 0; + break; + case 'V': + if (*at_code == 0) + *at_code = limit - 1; + else + *at_code -= 1; + break; + default: + result = FALSE; + break; + } + if (result) + *attr = list[*at_code].attr; + return result; +} +#endif + +static bool +cycle_colors(int ch, int *fg, int *bg, NCURSES_PAIRS_T *pair) +{ + bool result = FALSE; + + if (UseColors) { + result = TRUE; + switch (ch) { + case 'F': + if ((*fg -= 1) < 0) + *fg = COLORS - 1; + break; + case 'f': + if ((*fg += 1) >= COLORS) + *fg = 0; + break; + case 'B': + if ((*bg -= 1) < 0) + *bg = COLORS - 1; + break; + case 'b': + if ((*bg += 1) >= COLORS) + *bg = 0; + break; + default: + result = FALSE; + break; + } + if (result) { + *pair = (NCURSES_PAIRS_T) (*fg != COLOR_BLACK || *bg != COLOR_BLACK); + if (*pair != 0) { + *pair = 1; + if (init_pair(*pair, + (NCURSES_COLOR_T) *fg, + (NCURSES_COLOR_T) *bg) == ERR) { + result = FALSE; + } + } + } + } + return result; +} + +/**************************************************************************** + * + * Soft-key label test + * + ****************************************************************************/ + +#if USE_SOFTKEYS + +#define SLK_HELP 17 +#define SLK_WORK (SLK_HELP + 3) + +static void +slk_help(void) +{ + static const char *table[] = + { + "Available commands are:" + ,"" + ,"^L -- repaint this message and activate soft keys" + ,"a/d -- activate/disable soft keys" + ,"c -- set centered format for labels" + ,"l -- set left-justified format for labels" + ,"r -- set right-justified format for labels" + ,"[12345678] -- set label; labels are numbered 1 through 8" + ,"e -- erase stdscr (should not erase labels)" + ,"s -- test scrolling of shortened screen" + ,"v/V -- cycle through video attributes" +#if HAVE_SLK_COLOR + ,"F/f/B/b -- cycle through foreground/background colors" +#endif + ,"ESC -- return to main menu" + ,"" + ,"Note: if activating the soft keys causes your terminal to scroll up" + ,"one line, your terminal auto-scrolls when anything is written to the" + ,"last screen position. The ncurses code does not yet handle this" + ,"gracefully." + }; + unsigned j; + + move(2, 0); + for (j = 0; j < SIZEOF(table); ++j) { + P(table[j]); + } + refresh(); +} + +#if HAVE_SLK_COLOR +static void +call_slk_color(int fg, int bg) +{ + init_pair(1, (NCURSES_COLOR_T) bg, (NCURSES_COLOR_T) fg); + slk_color(1); + MvPrintw(SLK_WORK, 0, "Colors %d/%d\n", fg, bg); + clrtoeol(); + slk_touch(); + slk_noutrefresh(); + refresh(); +} +#endif + +static int +slk_test(bool recur GCC_UNUSED) +/* exercise the soft keys */ +{ + int c, fmt = 1; + char buf[9]; + NCURSES_CONST char *s; + attr_t attr = A_NORMAL; + unsigned at_code = 0; +#if HAVE_SLK_COLOR + int fg = COLOR_BLACK; + int bg = COLOR_WHITE; + NCURSES_PAIRS_T pair = 0; +#endif + ATTR_TBL my_list[SIZEOF(attrs_to_test)]; + unsigned my_size = init_attr_list(my_list, termattrs()); + + c = CTRL('l'); +#if HAVE_SLK_COLOR + if (UseColors) { + call_slk_color(fg, bg); + } +#endif + + do { + move(0, 0); + switch (c) { + case CTRL('l'): + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Soft Key Exerciser"); + attroff(A_BOLD); + + slk_help(); + /* fall through */ + + case 'a': + slk_restore(); + break; + + case 'e': + wclear(stdscr); + break; + + case 's': + MvPrintw(SLK_WORK, 0, "Press Q to stop the scrolling-test: "); + while ((c = Getchar()) != 'Q' && (c != ERR)) + AddCh(c); + break; + + case 'd': + slk_clear(); + break; + + case 'l': + fmt = 0; + break; + + case 'c': + fmt = 1; + break; + + case 'r': + fmt = 2; + break; + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + MvAddStr(SLK_WORK, 0, "Please enter the label value: "); + _nc_STRCPY(buf, "", sizeof(buf)); + if ((s = slk_label(c - '0')) != 0) { + _nc_STRNCPY(buf, s, (size_t) 8); + } + wGetstring(stdscr, buf, 8); + slk_set((c - '0'), buf, fmt); + slk_refresh(); + move(SLK_WORK, 0); + clrtobot(); + break; + + case case_QUIT: + goto done; + +#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE + case KEY_RESIZE: + wnoutrefresh(stdscr); + break; +#endif + + default: + if (cycle_attr(c, &at_code, &attr, my_list, my_size)) { + slk_attrset((chtype) attr); + slk_touch(); + slk_noutrefresh(); + break; + } +#if HAVE_SLK_COLOR + if (cycle_colors(c, &fg, &bg, &pair)) { + if (UseColors) { + call_slk_color(fg, bg); + } else { + beep(); + } + break; + } +#endif + beep(); + break; + } + } while (!isQuit(c = Getchar(), TRUE)); + + done: + slk_clear(); + erase(); + endwin(); + return OK; +} + +#if USE_WIDEC_SUPPORT +#define SLKLEN 8 +static int +x_slk_test(bool recur GCC_UNUSED) +/* exercise the soft keys */ +{ + int c, fmt = 1; + wchar_t buf[SLKLEN + 1]; + char *s; + attr_t attr = WA_NORMAL; + unsigned at_code = 0; + int fg = COLOR_BLACK; + int bg = COLOR_WHITE; + NCURSES_PAIRS_T pair = 0; + W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)]; + unsigned my_size = init_w_attr_list(my_list, term_attrs()); + + c = CTRL('l'); + if (UseColors) { + call_slk_color(fg, bg); + } + do { + move(0, 0); + switch (c) { + case CTRL('l'): + erase(); + attr_on(WA_BOLD, NULL); + MvAddStr(0, 20, "Soft Key Exerciser"); + attr_off(WA_BOLD, NULL); + + slk_help(); + /* fall through */ + + case 'a': + slk_restore(); + break; + + case 'e': + wclear(stdscr); + break; + + case 's': + MvPrintw(SLK_WORK, 0, "Press Q to stop the scrolling-test: "); + while ((c = Getchar()) != 'Q' && (c != ERR)) + AddCh(c); + break; + + case 'd': + slk_clear(); + break; + + case 'l': + fmt = 0; + break; + + case 'c': + fmt = 1; + break; + + case 'r': + fmt = 2; + break; + + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + MvAddStr(SLK_WORK, 0, "Please enter the label value: "); + *buf = 0; + if ((s = slk_label(c - '0')) != 0) { + char *temp = strdup(s); + size_t used = strlen(temp); + size_t want = SLKLEN; +#ifndef state_unused + mbstate_t state; +#endif + + buf[0] = L'\0'; + while (want > 0 && used != 0) { + size_t test; + const char *base = s; + + reset_mbytes(state); + test = count_mbytes(base, 0, &state); + if (test == (size_t) -1) { + temp[--used] = 0; + } else if (test > want) { + temp[--used] = 0; + } else { + reset_mbytes(state); + trans_mbytes(buf, base, want, &state); + break; + } + } + free(temp); + } + wGet_wstring(stdscr, buf, SLKLEN); + slk_wset((c - '0'), buf, fmt); + slk_refresh(); + move(SLK_WORK, 0); + clrtobot(); + break; + + case case_QUIT: + goto done; + + case 'F': + if (UseColors) { + fg = (NCURSES_COLOR_T) ((fg + 1) % COLORS); + call_slk_color(fg, bg); + } + break; + case 'B': + if (UseColors) { + bg = (NCURSES_COLOR_T) ((bg + 1) % COLORS); + call_slk_color(fg, bg); + } + break; +#if defined(NCURSES_VERSION) && defined(KEY_RESIZE) && HAVE_WRESIZE + case KEY_RESIZE: + wnoutrefresh(stdscr); + break; +#endif + default: + if (cycle_w_attr(c, &at_code, &attr, my_list, my_size)) { + slk_attr_set(attr, (NCURSES_COLOR_T) (fg || bg), NULL); + slk_touch(); + slk_noutrefresh(); + break; + } +#if HAVE_SLK_COLOR + if (cycle_colors(c, &fg, &bg, &pair)) { + if (UseColors) { + call_slk_color(fg, bg); + } else { + beep(); + } + break; + } +#endif + beep(); + break; + } + } while (!isQuit(c = Getchar(), TRUE)); + + done: + slk_clear(); + erase(); + endwin(); + return OK; +} +#endif +#endif /* SLK_INIT */ + +static void +show_256_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +{ + unsigned first = 0; + unsigned last = 255; + unsigned code; + int count; + + erase(); + attron(A_BOLD); + MvPrintw(0, 20, "Display of Character Codes %#0x to %#0x", + first, last); + attroff(A_BOLD); + refresh(); + + for (code = first; code <= last; ++code) { + int row = (int) (2 + (code / 16)); + int col = (int) (5 * (code % 16)); + IGNORE_RC(mvaddch(row, col, colored_chtype(code, attr, pair))); + for (count = 1; count < repeat; ++count) { + AddCh(colored_chtype(code, attr, pair)); + } + } + +} + +/* + * Show a slice of 32 characters, allowing those to be repeated up to the + * screen's width. + * + * ISO 6429: codes 0x80 to 0x9f may be control characters that cause the + * terminal to perform functions. The remaining codes can be graphic. + */ +static void +show_upper_chars(int base, int pagesize, int repeat, attr_t attr, NCURSES_PAIRS_T pair) +{ + unsigned code; + unsigned first = (unsigned) base; + unsigned last = first + (unsigned) pagesize - 2; + bool C1 = (first == 128); + int reply; + + erase(); + attron(A_BOLD); + MvPrintw(0, 20, "Display of %s Character Codes %d to %d", + C1 ? "C1" : "GR", first, last); + attroff(A_BOLD); + refresh(); + + for (code = first; code <= last; code++) { + int count = repeat; + int row = 2 + ((int) (code - first) % (pagesize / 2)); + int col = ((int) (code - first) / (pagesize / 2)) * COLS / 2; + char tmp[80]; + _nc_SPRINTF(tmp, _nc_SLIMIT(sizeof(tmp)) "%3u (0x%x)", code, code); + MvPrintw(row, col, "%*s: ", COLS / 4, tmp); + + do { + if (C1) + nodelay(stdscr, TRUE); + echochar(colored_chtype(code, attr, pair)); + if (C1) { + /* (yes, this _is_ crude) */ + while ((reply = Getchar()) != ERR) { + AddCh(UChar(reply)); + napms(10); + } + nodelay(stdscr, FALSE); + } + } while (--count > 0); + } +} + +#define PC_COLS 4 + +static void +show_pc_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +{ + unsigned code; + + erase(); + attron(A_BOLD); + MvPrintw(0, 20, "Display of PC Character Codes"); + attroff(A_BOLD); + refresh(); + + for (code = 0; code < 16; ++code) { + MvPrintw(2, (int) code * PC_COLS + 8, "%X", code); + } + for (code = 0; code < 256; code++) { + int count = repeat; + int row = 3 + (int) (code / 16) + (code >= 128); + int col = 8 + (int) (code % 16) * PC_COLS; + if ((code % 16) == 0) + MvPrintw(row, 0, "0x%02x:", code); + move(row, col); + do { + switch (code) { + case '\n': + case '\r': + case '\b': + case '\f': + case '\033': + case 0x9b: + /* + * Skip the ones that do not work. + */ + break; + default: + AddCh(colored_chtype(code, A_ALTCHARSET | attr, pair)); + break; + } + } while (--count > 0); + } +} + +static void +show_box_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +{ + (void) repeat; + + attr |= (attr_t) COLOR_PAIR(pair); + + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the ACS Line-Drawing Set"); + attroff(A_BOLD); + refresh(); + /* *INDENT-OFF* */ + wborder(stdscr, + colored_chtype(ACS_VLINE, attr, pair), + colored_chtype(ACS_VLINE, attr, pair), + colored_chtype(ACS_HLINE, attr, pair), + colored_chtype(ACS_HLINE, attr, pair), + colored_chtype(ACS_ULCORNER, attr, pair), + colored_chtype(ACS_URCORNER, attr, pair), + colored_chtype(ACS_LLCORNER, attr, pair), + colored_chtype(ACS_LRCORNER, attr, pair)); + MvHLine(LINES / 2, 0, colored_chtype(ACS_HLINE, attr, pair), COLS); + MvVLine(0, COLS / 2, colored_chtype(ACS_VLINE, attr, pair), LINES); + MvAddCh(0, COLS / 2, colored_chtype(ACS_TTEE, attr, pair)); + MvAddCh(LINES / 2, COLS / 2, colored_chtype(ACS_PLUS, attr, pair)); + MvAddCh(LINES - 1, COLS / 2, colored_chtype(ACS_BTEE, attr, pair)); + MvAddCh(LINES / 2, 0, colored_chtype(ACS_LTEE, attr, pair)); + MvAddCh(LINES / 2, COLS - 1, colored_chtype(ACS_RTEE, attr, pair)); + /* *INDENT-ON* */ +} + +static int +show_1_acs(int n, int repeat, const char *name, chtype code) +{ + const int height = 16; + int row = 2 + (n % height); + int col = (n / height) * COLS / 2; + + MvPrintw(row, col, "%*s : ", COLS / 4, name); + do { + AddCh(code); + } while (--repeat > 0); + return n + 1; +} + +static void +show_acs_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +/* display the ACS character set */ +{ + int n; + +#define BOTH(name) #name, colored_chtype(name, attr, (chtype) pair) + + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the ACS Character Set"); + attroff(A_BOLD); + refresh(); + + n = show_1_acs(0, repeat, BOTH(ACS_ULCORNER)); + n = show_1_acs(n, repeat, BOTH(ACS_URCORNER)); + n = show_1_acs(n, repeat, BOTH(ACS_LLCORNER)); + n = show_1_acs(n, repeat, BOTH(ACS_LRCORNER)); + + n = show_1_acs(n, repeat, BOTH(ACS_LTEE)); + n = show_1_acs(n, repeat, BOTH(ACS_RTEE)); + n = show_1_acs(n, repeat, BOTH(ACS_TTEE)); + n = show_1_acs(n, repeat, BOTH(ACS_BTEE)); + + n = show_1_acs(n, repeat, BOTH(ACS_HLINE)); + n = show_1_acs(n, repeat, BOTH(ACS_VLINE)); + + /* + * HPUX's ACS definitions are broken here. Just give up. + */ +#if !(defined(__hpux) && !defined(NCURSES_VERSION)) + n = show_1_acs(n, repeat, BOTH(ACS_LARROW)); + n = show_1_acs(n, repeat, BOTH(ACS_RARROW)); + n = show_1_acs(n, repeat, BOTH(ACS_UARROW)); + n = show_1_acs(n, repeat, BOTH(ACS_DARROW)); + + n = show_1_acs(n, repeat, BOTH(ACS_BLOCK)); + n = show_1_acs(n, repeat, BOTH(ACS_BOARD)); + n = show_1_acs(n, repeat, BOTH(ACS_LANTERN)); + n = show_1_acs(n, repeat, BOTH(ACS_BULLET)); + n = show_1_acs(n, repeat, BOTH(ACS_CKBOARD)); + n = show_1_acs(n, repeat, BOTH(ACS_DEGREE)); + n = show_1_acs(n, repeat, BOTH(ACS_DIAMOND)); + n = show_1_acs(n, repeat, BOTH(ACS_PLMINUS)); + n = show_1_acs(n, repeat, BOTH(ACS_PLUS)); + + n = show_1_acs(n, repeat, BOTH(ACS_GEQUAL)); + n = show_1_acs(n, repeat, BOTH(ACS_NEQUAL)); + n = show_1_acs(n, repeat, BOTH(ACS_LEQUAL)); + + n = show_1_acs(n, repeat, BOTH(ACS_STERLING)); + n = show_1_acs(n, repeat, BOTH(ACS_PI)); + n = show_1_acs(n, repeat, BOTH(ACS_S1)); + n = show_1_acs(n, repeat, BOTH(ACS_S3)); + n = show_1_acs(n, repeat, BOTH(ACS_S7)); + (void) show_1_acs(n, repeat, BOTH(ACS_S9)); +#endif +#undef BOTH +} + +static int +acs_test(bool recur GCC_UNUSED) +{ + int c = 'a'; + int pagesize = 32; + char *term = getenv("TERM"); + const char *pch_kludge = ((term != 0 && strstr(term, "linux")) + ? "p=PC, " + : ""); + attr_t attr = A_NORMAL; + int digit = 0; + int repeat = 1; + int fg = COLOR_BLACK; + int bg = COLOR_BLACK; + unsigned at_code = 0; + NCURSES_PAIRS_T pair = 0; + void (*last_show_acs) (int, attr_t, NCURSES_PAIRS_T) = 0; + ATTR_TBL my_list[SIZEOF(attrs_to_test)]; + unsigned my_size = init_attr_list(my_list, termattrs()); + + do { + switch (c) { + case CTRL('L'): + Repaint(); + break; + case 'a': + ToggleAcs(last_show_acs, show_acs_chars); + break; + case 'p': + if (*pch_kludge) + ToggleAcs(last_show_acs, show_pc_chars); + else + beep(); + break; + case 'w': + if (pagesize == 32) { + pagesize = 256; + } else { + pagesize = 32; + } + break; + case 'x': + ToggleAcs(last_show_acs, show_box_chars); + break; + case '0': + case '1': + case '2': + case '3': + digit = (c - '0'); + last_show_acs = 0; + break; + case '-': + if (digit > 0) { + --digit; + last_show_acs = 0; + } else { + beep(); + } + break; + case '+': + if (digit < 3) { + ++digit; + last_show_acs = 0; + } else { + beep(); + } + break; + case '>': + if (repeat < (COLS / 4)) + ++repeat; + break; + case '<': + if (repeat > 1) + --repeat; + break; + default: + if (cycle_attr(c, &at_code, &attr, my_list, my_size) + || cycle_colors(c, &fg, &bg, &pair)) { + break; + } else { + beep(); + } + break; + } + if (pagesize != 32) { + show_256_chars(repeat, attr, pair); + } else if (last_show_acs != 0) { + last_show_acs(repeat, attr, pair); + } else { + show_upper_chars(digit * pagesize + 128, pagesize, repeat, attr, pair); + } + + MvPrintw(LINES - 3, 0, + "Note: ANSI terminals may not display C1 characters."); + MvPrintw(LINES - 2, 0, + "Select: a=ACS, w=all x=box, %s0=C1, 1-3,+/- non-ASCII, repeat, ESC=quit", + pch_kludge); + if (UseColors) { + MvPrintw(LINES - 1, 0, + "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.", + my_list[at_code].name, + fg, bg); + } else { + MvPrintw(LINES - 1, 0, + "v/V cycles through video attributes (%s).", + my_list[at_code].name); + } + refresh(); + } while (!isQuit(c = Getchar(), TRUE)); + + Pause(); + erase(); + endwin(); + return OK; +} + +#if USE_WIDEC_SUPPORT +static cchar_t * +merge_wide_attr(cchar_t *dst, const cchar_t *src, attr_t attr, NCURSES_PAIRS_T pair) +{ + + *dst = *src; + do { + TEST_CCHAR(src, { + attr |= (test_attrs & A_ALTCHARSET); + setcchar(dst, test_wch, attr, pair, NULL); + }, { + ; + }); + } while (0); + return dst; +} + +/* + * Header/legend take up no more than 8 lines, leaving 16 lines on a 24-line + * display. If there are no repeats, we could normally display 16 lines of 64 + * characters (1024 total). However, taking repeats and double-width cells + * into account, use 256 characters for the page. + */ +static void +show_paged_widechars(unsigned base, + unsigned pagesize, + int repeat, + int space, + attr_t attr, + NCURSES_PAIRS_T pair) +{ + unsigned first = base * pagesize; + unsigned last = first + pagesize - 1; + int per_line = 16; + cchar_t temp; + wchar_t code; + wchar_t codes[10]; + + erase(); + attron(A_BOLD); + MvPrintw(0, 20, "Display of Character Codes %#x to %#x", first, last); + attroff(A_BOLD); + + for (code = (wchar_t) first; code <= (wchar_t) last; code++) { + int row = (2 + (int) (code - (wchar_t) first) / per_line); + int col = 5 * ((int) code % per_line); + int count; + + memset(&codes, 0, sizeof(codes)); + codes[0] = code; + setcchar(&temp, codes, attr, pair, 0); + move(row, col); + if (wcwidth(code) == 0 && code != 0) { + AddCh((chtype) space | + (A_REVERSE ^ attr) | + (attr_t) COLOR_PAIR(pair)); + } + add_wch(&temp); + for (count = 1; count < repeat; ++count) { + add_wch(&temp); + } + } +} + +static void +show_upper_widechars(unsigned first, int repeat, int space, attr_t attr, NCURSES_PAIRS_T pair) +{ + cchar_t temp; + wchar_t code; + unsigned last = first + 31; + + erase(); + attron(A_BOLD); + MvPrintw(0, 20, "Display of Character Codes %d to %d", first, last); + attroff(A_BOLD); + + for (code = (wchar_t) first; code <= (wchar_t) last; code++) { + int row = 2 + ((int) (code - (wchar_t) first) % 16); + int col = ((int) (code - (wchar_t) first) / 16) * COLS / 2; + wchar_t codes[10]; + char tmp[80]; + int count = repeat; + + _nc_SPRINTF(tmp, _nc_SLIMIT(sizeof(tmp)) + "%3ld (0x%lx)", (long) code, (long) code); + MvPrintw(row, col, "%*s: ", COLS / 4, tmp); + + memset(&codes, 0, sizeof(codes)); + codes[0] = code; + setcchar(&temp, codes, attr, pair, 0); + + do { + int y, x; + + /* + * Give non-spacing characters something to combine with. If we + * don't, they'll bunch up in a heap on the space after the ":". + * Mark them with reverse-video to make them simpler to find on + * the display. + */ + if (wcwidth(code) == 0) { + AddCh((chtype) space | + (A_REVERSE ^ attr) | + (attr_t) COLOR_PAIR(pair)); + } + /* + * This uses echo_wchar(), for comparison with the normal 'f' + * test (and to make a test-case for echo_wchar()). The screen + * may flicker because the erase() at the top of the function + * is met by the builtin refresh() in echo_wchar(). + */ + echo_wchar(&temp); + /* + * The repeat-count may make text wrap - avoid that. + */ + getyx(stdscr, y, x); + (void) y; + if (x >= col + (COLS / 2) - 2) + break; + } while (--count > 0); + } +} + +static int +show_1_wacs(int n, int repeat, const char *name, const cchar_t *code) +{ + const int height = 16; + int row = 2 + (n % height); + int col = (n / height) * COLS / 2; + + MvPrintw(row, col, "%*s : ", COLS / 4, name); + while (--repeat >= 0) { + add_wch(code); + } + return n + 1; +} + +#define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair) + +static void +show_wacs_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +/* display the wide-ACS character set */ +{ + cchar_t temp; + + int n; + +/*#define BOTH2(name) #name, &(name) */ +#define BOTH2(name) #name, MERGE_ATTR(name) + + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); + attroff(A_BOLD); + refresh(); + + n = show_1_wacs(0, repeat, BOTH2(WACS_ULCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_URCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LLCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LRCORNER)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_LTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_RTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_TTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BTEE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_HLINE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_VLINE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); + n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PLUS)); + +#ifdef CURSES_WACS_ARRAY + n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); + (void) show_1_wacs(n, repeat, BOTH2(WACS_S9)); +#endif +} + +#ifdef WACS_D_PLUS +static void +show_wacs_chars_double(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +/* display the wide-ACS character set */ +{ + cchar_t temp; + + int n; + +/*#define BOTH2(name) #name, &(name) */ +#define BOTH2(name) #name, MERGE_ATTR(name) + + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); + attroff(A_BOLD); + refresh(); + + n = show_1_wacs(0, repeat, BOTH2(WACS_D_ULCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_URCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_LLCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_LRCORNER)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_D_LTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_RTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_TTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_BTEE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_D_HLINE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_VLINE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); + n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); + n = show_1_wacs(n, repeat, BOTH2(WACS_D_PLUS)); + +#ifdef CURSES_WACS_ARRAY + n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); + (void) show_1_wacs(n, repeat, BOTH2(WACS_S9)); +#endif +} +#endif + +#ifdef WACS_T_PLUS +static void +show_wacs_chars_thick(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +/* display the wide-ACS character set */ +{ + cchar_t temp; + + int n; + +/*#define BOTH2(name) #name, &(name) */ +#define BOTH2(name) #name, MERGE_ATTR(name) + + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); + attroff(A_BOLD); + refresh(); + + n = show_1_wacs(0, repeat, BOTH2(WACS_T_ULCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_URCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_LLCORNER)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_LRCORNER)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_T_LTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_RTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_TTEE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_BTEE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_T_HLINE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_VLINE)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN)); + n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET)); + n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE)); + n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS)); + n = show_1_wacs(n, repeat, BOTH2(WACS_T_PLUS)); + +#ifdef CURSES_WACS_ARRAY + n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL)); + n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL)); + + n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING)); + n = show_1_wacs(n, repeat, BOTH2(WACS_PI)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S1)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S3)); + n = show_1_wacs(n, repeat, BOTH2(WACS_S7)); + (void) show_1_wacs(n, repeat, BOTH2(WACS_S9)); +#endif +} +#endif + +#undef MERGE_ATTR + +#define MERGE_ATTR(n,wch) merge_wide_attr(&temp[n], wch, attr, pair) + +static void +show_wbox_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +{ + cchar_t temp[8]; + + (void) repeat; + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the Wide-ACS Line-Drawing Set"); + attroff(A_BOLD); + refresh(); + + wborder_set(stdscr, + MERGE_ATTR(0, WACS_VLINE), + MERGE_ATTR(1, WACS_VLINE), + MERGE_ATTR(2, WACS_HLINE), + MERGE_ATTR(3, WACS_HLINE), + MERGE_ATTR(4, WACS_ULCORNER), + MERGE_ATTR(5, WACS_URCORNER), + MERGE_ATTR(6, WACS_LLCORNER), + MERGE_ATTR(7, WACS_LRCORNER)); + /* *INDENT-OFF* */ + (void) mvhline_set(LINES / 2, 0, MERGE_ATTR(0, WACS_HLINE), COLS); + (void) mvvline_set(0, COLS / 2, MERGE_ATTR(0, WACS_VLINE), LINES); + (void) mvadd_wch(0, COLS / 2, MERGE_ATTR(0, WACS_TTEE)); + (void) mvadd_wch(LINES / 2, COLS / 2, MERGE_ATTR(0, WACS_PLUS)); + (void) mvadd_wch(LINES - 1, COLS / 2, MERGE_ATTR(0, WACS_BTEE)); + (void) mvadd_wch(LINES / 2, 0, MERGE_ATTR(0, WACS_LTEE)); + (void) mvadd_wch(LINES / 2, COLS - 1, MERGE_ATTR(0, WACS_RTEE)); + /* *INDENT-ON* */ +} + +#undef MERGE_ATTR + +static int +show_2_wacs(int n, const char *name, const char *code, attr_t attr, NCURSES_PAIRS_T pair) +{ + const int height = 16; + int row = 2 + (n % height); + int col = (n / height) * COLS / 2; + char temp[80]; + + MvPrintw(row, col, "%*s : ", COLS / 4, name); + (void) attr_set(attr, pair, 0); + _nc_STRNCPY(temp, code, 20); + addstr(temp); + (void) attr_set(A_NORMAL, 0, 0); + return n + 1; +} + +#define SHOW_UTF8(n, name, code) show_2_wacs(n, name, code, attr, pair) + +static void +show_utf8_chars(int repeat, attr_t attr, NCURSES_PAIRS_T pair) +{ + int n; + + (void) repeat; + erase(); + attron(A_BOLD); + MvAddStr(0, 20, "Display of the Wide-ACS Character Set"); + attroff(A_BOLD); + refresh(); + /* *INDENT-OFF* */ + n = SHOW_UTF8(0, "WACS_ULCORNER", "\342\224\214"); + n = SHOW_UTF8(n, "WACS_URCORNER", "\342\224\220"); + n = SHOW_UTF8(n, "WACS_LLCORNER", "\342\224\224"); + n = SHOW_UTF8(n, "WACS_LRCORNER", "\342\224\230"); + + n = SHOW_UTF8(n, "WACS_LTEE", "\342\224\234"); + n = SHOW_UTF8(n, "WACS_RTEE", "\342\224\244"); + n = SHOW_UTF8(n, "WACS_TTEE", "\342\224\254"); + n = SHOW_UTF8(n, "WACS_BTEE", "\342\224\264"); + + n = SHOW_UTF8(n, "WACS_HLINE", "\342\224\200"); + n = SHOW_UTF8(n, "WACS_VLINE", "\342\224\202"); + + n = SHOW_UTF8(n, "WACS_LARROW", "\342\206\220"); + n = SHOW_UTF8(n, "WACS_RARROW", "\342\206\222"); + n = SHOW_UTF8(n, "WACS_UARROW", "\342\206\221"); + n = SHOW_UTF8(n, "WACS_DARROW", "\342\206\223"); + + n = SHOW_UTF8(n, "WACS_BLOCK", "\342\226\256"); + n = SHOW_UTF8(n, "WACS_BOARD", "\342\226\222"); + n = SHOW_UTF8(n, "WACS_LANTERN", "\342\230\203"); + n = SHOW_UTF8(n, "WACS_BULLET", "\302\267"); + n = SHOW_UTF8(n, "WACS_CKBOARD", "\342\226\222"); + n = SHOW_UTF8(n, "WACS_DEGREE", "\302\260"); + n = SHOW_UTF8(n, "WACS_DIAMOND", "\342\227\206"); + n = SHOW_UTF8(n, "WACS_PLMINUS", "\302\261"); + n = SHOW_UTF8(n, "WACS_PLUS", "\342\224\274"); + n = SHOW_UTF8(n, "WACS_GEQUAL", "\342\211\245"); + n = SHOW_UTF8(n, "WACS_NEQUAL", "\342\211\240"); + n = SHOW_UTF8(n, "WACS_LEQUAL", "\342\211\244"); + + n = SHOW_UTF8(n, "WACS_STERLING", "\302\243"); + n = SHOW_UTF8(n, "WACS_PI", "\317\200"); + n = SHOW_UTF8(n, "WACS_S1", "\342\216\272"); + n = SHOW_UTF8(n, "WACS_S3", "\342\216\273"); + n = SHOW_UTF8(n, "WACS_S7", "\342\216\274"); + (void) SHOW_UTF8(n, "WACS_S9", "\342\216\275"); + /* *INDENT-ON* */ +} + +/* display the wide-ACS character set */ +static int +x_acs_test(bool recur GCC_UNUSED) +{ + int c = 'a'; + unsigned digit = 0; + int repeat = 1; + int space = ' '; + unsigned pagesize = 32; + attr_t attr = WA_NORMAL; + int fg = COLOR_BLACK; + int bg = COLOR_BLACK; + unsigned at_code = 0; + NCURSES_PAIRS_T pair = 0; + void (*last_show_wacs) (int, attr_t, NCURSES_PAIRS_T) = 0; + W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)]; + unsigned my_size = init_w_attr_list(my_list, term_attrs()); + char at_page[20]; + bool pending_code = FALSE; + + at_page[0] = '\0'; + do { + switch (c) { + case CTRL('L'): + Repaint(); + break; + case 'a': + ToggleAcs(last_show_wacs, show_wacs_chars); + break; +#ifdef WACS_D_PLUS + case 'd': + ToggleAcs(last_show_wacs, show_wacs_chars_double); + break; +#endif +#ifdef WACS_T_PLUS + case 't': + ToggleAcs(last_show_wacs, show_wacs_chars_thick); + break; +#endif + case 'w': + if (pagesize == 32) { + pagesize = 256; + } else { + pagesize = 32; + } + break; + case 'x': + ToggleAcs(last_show_wacs, show_wbox_chars); + break; + case 'u': + ToggleAcs(last_show_wacs, show_utf8_chars); + break; + case '@': + pending_code = !pending_code; + if (pending_code) { + _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit); + } else if (at_page[0] != '\0') { + sscanf(at_page, "%x", &digit); + } + break; + default: + if (pending_code && isxdigit(c)) { + size_t len = strlen(at_page); + if (len && at_page[0] == '0') { + memmove(at_page, at_page + 1, len--); + } + if (len < sizeof(at_page) - 1) { + at_page[len++] = (char) c; + at_page[len] = '\0'; + } + } else if (pending_code + && (c == '\b' || c == KEY_BACKSPACE || c == KEY_DC)) { + size_t len = strlen(at_page); + if (len) + at_page[--len] = '\0'; + } else if (c < 256 && isdigit(c)) { + digit = (unsigned) (c - '0'); + last_show_wacs = 0; + } else if (c == '+') { + ++digit; + _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit); + last_show_wacs = 0; + } else if (c == '-' && digit > 0) { + --digit; + _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", + UChar(digit)); + last_show_wacs = 0; + } else if (c == '>' && repeat < (COLS / 4)) { + ++repeat; + } else if (c == '<' && repeat > 1) { + --repeat; + } else if (c == '_') { + space = (space == ' ') ? '_' : ' '; + last_show_wacs = 0; + } else if (cycle_w_attr(c, &at_code, &attr, my_list, my_size) + || cycle_colors(c, &fg, &bg, &pair)) { + if (last_show_wacs != 0) + break; + } else { + beep(); + break; + } + break; + } + if (pagesize != 32) { + show_paged_widechars(digit, pagesize, repeat, space, attr, pair); + } else if (last_show_wacs != 0) { + last_show_wacs(repeat, attr, pair); + } else { + show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair); + } + + MvPrintw(LINES - 4, 0, + "Select: a/d/t WACS, w=%d/page, @", + pagesize); + printw("%s", + pending_code ? at_page : "page"); + addstr(", x=box, u UTF-8, ^L repaint"); + MvPrintw(LINES - 3, 2, + "0-9,+/- non-ASCII, repeat, _ space, ESC=quit"); + if (UseColors) { + MvPrintw(LINES - 2, 2, + "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.", + my_list[at_code].name, + fg, bg); + } else { + MvPrintw(LINES - 2, 2, + "v/V cycles through video attributes (%s).", + my_list[at_code].name); + } + refresh(); + } while (!isQuit(c = Getchar(), TRUE)); + + Pause(); + erase(); + endwin(); + return OK; +} + +#endif + +/* + * Graphic-rendition test (adapted from vttest) + */ +static int +sgr_attr_test(bool recur GCC_UNUSED) +{ + int pass; + + for (pass = 0; pass < 2; pass++) { + chtype normal = ((pass == 0 ? A_NORMAL : A_REVERSE)) | BLANK; + + /* Use non-default colors if possible to exercise bce a little */ + if (UseColors) { + init_pair(1, COLOR_WHITE, COLOR_BLUE); + normal |= (chtype) COLOR_PAIR(1); + } + bkgdset(normal); + erase(); + MvPrintw(1, 20, "Graphic rendition test pattern:"); + + MvPrintw(4, 1, "vanilla"); + +#define set_sgr(mask) bkgdset((normal^(mask))); + set_sgr(A_BOLD); + MvPrintw(4, 40, "bold"); + + set_sgr(A_UNDERLINE); + MvPrintw(6, 6, "underline"); + + set_sgr(A_BOLD | A_UNDERLINE); + MvPrintw(6, 45, "bold underline"); + + set_sgr(A_BLINK); + MvPrintw(8, 1, "blink"); + + set_sgr(A_BLINK | A_BOLD); + MvPrintw(8, 40, "bold blink"); + + set_sgr(A_UNDERLINE | A_BLINK); + MvPrintw(10, 6, "underline blink"); + + set_sgr(A_BOLD | A_UNDERLINE | A_BLINK); + MvPrintw(10, 45, "bold underline blink"); + + set_sgr(A_REVERSE); + MvPrintw(12, 1, "negative"); + + set_sgr(A_BOLD | A_REVERSE); + MvPrintw(12, 40, "bold negative"); + + set_sgr(A_UNDERLINE | A_REVERSE); + MvPrintw(14, 6, "underline negative"); + + set_sgr(A_BOLD | A_UNDERLINE | A_REVERSE); + MvPrintw(14, 45, "bold underline negative"); + + set_sgr(A_BLINK | A_REVERSE); + MvPrintw(16, 1, "blink negative"); + + set_sgr(A_BOLD | A_BLINK | A_REVERSE); + MvPrintw(16, 40, "bold blink negative"); + + set_sgr(A_UNDERLINE | A_BLINK | A_REVERSE); + MvPrintw(18, 6, "underline blink negative"); + + set_sgr(A_BOLD | A_UNDERLINE | A_BLINK | A_REVERSE); + MvPrintw(18, 45, "bold underline blink negative"); + + bkgdset(normal); + MvPrintw(LINES - 2, 1, "%s background. ", pass == 0 ? "Dark" : + "Light"); + clrtoeol(); + Pause(); + } + + bkgdset(A_NORMAL | BLANK); + erase(); + endwin(); + return OK; +} + +/**************************************************************************** + * + * Windows and scrolling tester. + * + ****************************************************************************/ + +#define BOTLINES 4 /* number of line stolen from screen bottom */ + +typedef struct { + int y, x; +} pair; + +#define FRAME struct frame +FRAME +{ + FRAME *next, *last; + bool do_scroll; + bool do_keypad; + WINDOW *wind; +}; + +#if defined(NCURSES_VERSION) && NCURSES_EXT_FUNCS +#if (NCURSES_VERSION_PATCH < 20070331) +#define is_keypad(win) (win)->_use_keypad +#define is_scrollok(win) (win)->_scroll +#endif +#else +#define is_keypad(win) FALSE +#define is_scrollok(win) FALSE +#endif + +static WINDOW * +frame_win(FRAME * curp) +{ + return (curp != 0) ? curp->wind : stdscr; +} + +/* We need to know if these flags are actually set, so don't look in FRAME. + * These names are known to work with SVr4 curses as well as ncurses. The + * _use_keypad name does not work with Solaris 8. + */ +static bool +HaveKeypad(FRAME * curp) +{ + WINDOW *win = frame_win(curp); + (void) win; + return is_keypad(win); +} + +static bool +HaveScroll(FRAME * curp) +{ + WINDOW *win = frame_win(curp); + (void) win; + return is_scrollok(win); +} + +static void +newwin_legend(FRAME * curp) +{ +#define DATA(num, name) { name, num } + static const struct { + const char *msg; + int code; + } legend[] = { + DATA(0, "^C = create window"), + DATA(0, "^N = next window"), + DATA(0, "^P = previous window"), + DATA(0, "^F = scroll forward"), + DATA(0, "^B = scroll backward"), + DATA(1, "^K = keypad(%s)"), + DATA(2, "^S = scrollok(%s)"), + DATA(0, "^W = save window"), + DATA(0, "^R = restore window"), +#if HAVE_WRESIZE + DATA(0, "^X = resize"), +#endif + DATA(3, "^Q%s = exit") + }; +#undef DATA + size_t n; + bool do_keypad = HaveKeypad(curp); + bool do_scroll = HaveScroll(curp); + char buf[BUFSIZ]; + + move(LINES - 4, 0); + + for (n = 0; n < SIZEOF(legend); n++) { + int x; + + switch (legend[n].code) { + default: + _nc_STRCPY(buf, legend[n].msg, sizeof(buf)); + break; + case 1: + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + legend[n].msg, do_keypad ? "yes" : "no"); + break; + case 2: + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + legend[n].msg, do_scroll ? "yes" : "no"); + break; + case 3: + _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf)) + legend[n].msg, do_keypad ? "/ESC" : ""); + break; + } + x = getcurx(stdscr); + addstr((COLS < (x + 3 + (int) strlen(buf))) ? "\n" : (n ? ", " : "")); + addstr(buf); + } + clrtoeol(); +} + +static void +transient(FRAME * curp, NCURSES_CONST char *msg) +{ + newwin_legend(curp); + if (msg) { + MvAddStr(LINES - 1, 0, msg); + refresh(); + napms(1000); + } + + move(LINES - 1, 0); + printw("%s characters are echoed, window should %sscroll.", + HaveKeypad(curp) ? "Non-arrow" : "All other", + HaveScroll(curp) ? "" : "not "); + clrtoeol(); +} + +static void +newwin_report(FRAME * curp) +/* report on the cursor's current position, then restore it */ +{ + WINDOW *win = frame_win(curp); + int y, x; + + if (win != stdscr) + transient(curp, (char *) 0); + getyx(win, y, x); + move(LINES - 1, COLS - 17); + printw("Y = %2d X = %2d", y, x); + if (win != stdscr) + refresh(); + else + wmove(win, y, x); +} + +static pair * +selectcell(int uli, int ulj, int lri, int lrj) +/* arrows keys move cursor, return location at current on non-arrow key */ +{ + static pair res; /* result cell */ + int si = lri - uli + 1; /* depth of the select area */ + int sj = lrj - ulj + 1; /* width of the select area */ + int i = 0, j = 0; /* offsets into the select area */ + + res.y = uli; + res.x = ulj; + for (;;) { + move(uli + i, ulj + j); + newwin_report((FRAME *) 0); + + switch (Getchar()) { + case KEY_UP: + i += si - 1; + break; + case KEY_DOWN: + i++; + break; + case KEY_LEFT: + j += sj - 1; + break; + case KEY_RIGHT: + j++; + break; + case case_QUIT: + return ((pair *) 0); +#ifdef NCURSES_MOUSE_VERSION + case KEY_MOUSE: + { + MEVENT event; + + getmouse(&event); + if (event.y > uli && event.x > ulj) { + i = event.y - uli; + j = event.x - ulj; + } else { + beep(); + break; + } + } +#endif + /* FALLTHRU */ + default: + res.y = uli + i; + res.x = ulj + j; + return (&res); + } + i %= si; + j %= sj; + } +} + +static void +outerbox(pair ul, pair lr, bool onoff) +/* draw or erase a box *outside* the given pair of corners */ +{ + MvAddCh(ul.y - 1, lr.x - 1, onoff ? ACS_ULCORNER : ' '); + MvAddCh(ul.y - 1, lr.x + 1, onoff ? ACS_URCORNER : ' '); + MvAddCh(lr.y + 1, lr.x + 1, onoff ? ACS_LRCORNER : ' '); + MvAddCh(lr.y + 1, ul.x - 1, onoff ? ACS_LLCORNER : ' '); + move(ul.y - 1, ul.x); + hline(onoff ? ACS_HLINE : ' ', lr.x - ul.x + 1); + move(ul.y, ul.x - 1); + vline(onoff ? ACS_VLINE : ' ', lr.y - ul.y + 1); + move(lr.y + 1, ul.x); + hline(onoff ? ACS_HLINE : ' ', lr.x - ul.x + 1); + move(ul.y, lr.x + 1); + vline(onoff ? ACS_VLINE : ' ', lr.y - ul.y + 1); +} + +static WINDOW * +getwindow(void) +/* Ask user for a window definition */ +{ + WINDOW *rwindow; + pair ul, lr; + NCURSES_CONST pair *tmp; + + move(0, 0); + clrtoeol(); + addstr("Use arrows to move cursor, anything else to mark corner 1"); + refresh(); + if ((tmp = selectcell(2, 1, LINES - BOTLINES - 2, COLS - 2)) == (pair *) 0) + return ((WINDOW *) 0); + memcpy(&ul, tmp, sizeof(pair)); + MvAddCh(ul.y - 1, ul.x - 1, ACS_ULCORNER); + move(0, 0); + clrtoeol(); + addstr("Use arrows to move cursor, anything else to mark corner 2"); + refresh(); + if ((tmp = selectcell(ul.y, ul.x, LINES - BOTLINES - 2, COLS - 2)) == + (pair *) 0) + return ((WINDOW *) 0); + memcpy(&lr, tmp, sizeof(pair)); + + rwindow = subwin(stdscr, lr.y - ul.y + 1, lr.x - ul.x + 1, ul.y, ul.x); + + outerbox(ul, lr, TRUE); + refresh(); + + if (rwindow != 0) + wrefresh(rwindow); + + move(0, 0); + clrtoeol(); + return (rwindow); +} + +static void +newwin_move(FRAME * curp, int dy, int dx) +{ + WINDOW *win = frame_win(curp); + int cur_y, cur_x; + int max_y, max_x; + + getyx(win, cur_y, cur_x); + getmaxyx(win, max_y, max_x); + if ((cur_x += dx) < 0) + cur_x = 0; + else if (cur_x >= max_x) + cur_x = max_x - 1; + if ((cur_y += dy) < 0) + cur_y = 0; + else if (cur_y >= max_y) + cur_y = max_y - 1; + wmove(win, cur_y, cur_x); +} + +static FRAME * +delete_framed(FRAME * fp, bool showit) +{ + FRAME *np = 0; + + if (fp != 0) { + fp->last->next = fp->next; + fp->next->last = fp->last; + + if (showit) { + werase(fp->wind); + wrefresh(fp->wind); + } + delwin(fp->wind); + + np = (fp == fp->next) ? NULL : fp->next; + free(fp); + } + return np; +} + +static int +scroll_test(bool recur GCC_UNUSED) +/* Demonstrate windows */ +{ + int c; + FRAME *current = (FRAME *) 0, *neww; + WINDOW *usescr; +#if HAVE_PUTWIN && HAVE_GETWIN + FILE *fp; +#endif + +#define DUMPFILE "screendump" + +#ifdef NCURSES_MOUSE_VERSION + mousemask(BUTTON1_CLICKED, (mmask_t *) 0); +#endif + c = CTRL('C'); + raw(); + do { + transient((FRAME *) 0, (char *) 0); + switch (c) { + case CTRL('C'): + if ((neww = typeCalloc(FRAME, (size_t) 1)) == 0) { + failed("scroll_test"); + goto breakout; + } + if ((neww->wind = getwindow()) == (WINDOW *) 0) { + failed("scroll_test"); + free(neww); + goto breakout; + } + + if (current == 0) { /* First element, */ + neww->next = neww; /* so point it at itself */ + neww->last = neww; + } else { + neww->next = current->next; + neww->last = current; + neww->last->next = neww; + neww->next->last = neww; + } + current = neww; + /* SVr4 curses sets the keypad on all newly-created windows to + * false. Someone reported that PDCurses makes new windows inherit + * this flag. Remove the following 'keypad()' call to test this + */ + keypad(current->wind, TRUE); + current->do_keypad = HaveKeypad(current); + current->do_scroll = HaveScroll(current); + break; + + case CTRL('N'): /* go to next window */ + if (current) + current = current->next; + break; + + case CTRL('P'): /* go to previous window */ + if (current) + current = current->last; + break; + + case CTRL('F'): /* scroll current window forward */ + if (current) + wscrl(frame_win(current), 1); + break; + + case CTRL('B'): /* scroll current window backwards */ + if (current) + wscrl(frame_win(current), -1); + break; + + case CTRL('K'): /* toggle keypad mode for current */ + if (current) { + current->do_keypad = !current->do_keypad; + keypad(current->wind, current->do_keypad); + } + break; + + case CTRL('S'): + if (current) { + current->do_scroll = !current->do_scroll; + scrollok(current->wind, current->do_scroll); + } + break; + +#if HAVE_PUTWIN && HAVE_GETWIN + case CTRL('W'): /* save and delete window */ + if ((current != 0) && (current == current->next)) { + transient(current, "Will not save/delete ONLY window"); + break; + } else if ((fp = fopen(DUMPFILE, "w")) == (FILE *) 0) { + transient(current, "Can't open screen dump file"); + } else { + int rc = putwin(frame_win(current), fp); + (void) fclose(fp); + + if (rc == OK) { + current = delete_framed(current, TRUE); + } else { + transient(current, "Can't write screen dump file"); + } + } + break; + + case CTRL('R'): /* restore window */ + if ((fp = fopen(DUMPFILE, "r")) == (FILE *) 0) { + transient(current, "Can't open screen dump file"); + } else { + if ((neww = typeCalloc(FRAME, (size_t) 1)) != 0) { + + neww->next = current ? current->next : 0; + neww->last = current; + if (neww->last != 0) + neww->last->next = neww; + if (neww->next != 0) + neww->next->last = neww; + + neww->wind = getwin(fp); + + wrefresh(neww->wind); + } else { + failed("scroll_test"); + } + (void) fclose(fp); + } + break; +#endif + +#if HAVE_WRESIZE + case CTRL('X'): /* resize window */ + if (current) { + NCURSES_CONST pair *tmp; + pair ul, lr; + int mx, my; + + move(0, 0); + clrtoeol(); + addstr("Use arrows to move cursor, anything else to mark new corner"); + refresh(); + + getbegyx(current->wind, ul.y, ul.x); + + tmp = selectcell(ul.y, ul.x, LINES - BOTLINES - 2, COLS - 2); + if (tmp == (pair *) 0) { + beep(); + break; + } + + getmaxyx(current->wind, lr.y, lr.x); + lr.y += (ul.y - 1); + lr.x += (ul.x - 1); + outerbox(ul, lr, FALSE); + wnoutrefresh(stdscr); + + /* strictly cosmetic hack for the test */ + getmaxyx(current->wind, my, mx); + if (my > tmp->y - ul.y) { + getyx(current->wind, lr.y, lr.x); + wmove(current->wind, tmp->y - ul.y + 1, 0); + wclrtobot(current->wind); + wmove(current->wind, lr.y, lr.x); + } + if (mx > tmp->x - ul.x) { + int i; + for (i = 0; i < my; i++) { + wmove(current->wind, i, tmp->x - ul.x + 1); + wclrtoeol(current->wind); + } + } + wnoutrefresh(current->wind); + + memcpy(&lr, tmp, sizeof(pair)); + (void) wresize(current->wind, lr.y - ul.y + 0, lr.x - ul.x + 0); + + getbegyx(current->wind, ul.y, ul.x); + getmaxyx(current->wind, lr.y, lr.x); + lr.y += (ul.y - 1); + lr.x += (ul.x - 1); + outerbox(ul, lr, TRUE); + wnoutrefresh(stdscr); + + wnoutrefresh(current->wind); + move(0, 0); + clrtoeol(); + doupdate(); + } + break; +#endif /* HAVE_WRESIZE */ + + case KEY_UP: + newwin_move(current, -1, 0); + break; + case KEY_DOWN: + newwin_move(current, 1, 0); + break; + case KEY_LEFT: + newwin_move(current, 0, -1); + break; + case KEY_RIGHT: + newwin_move(current, 0, 1); + break; + + case KEY_BACKSPACE: + /* FALLTHROUGH */ + case KEY_DC: + { + int y, x; + getyx(frame_win(current), y, x); + if (--x < 0) { + if (--y < 0) + break; + x = getmaxx(frame_win(current)) - 1; + } + (void) mvwdelch(frame_win(current), y, x); + } + break; + + case '\r': + c = '\n'; + /* FALLTHROUGH */ + + default: + if (current) + waddch(current->wind, (chtype) c); + else + beep(); + break; + } + newwin_report(current); + usescr = frame_win(current); + wrefresh(usescr); + } while + (!isQuit(c = wGetchar(usescr), TRUE) + && (c != ERR)); + + breakout: + while (current != 0) + current = delete_framed(current, FALSE); + + scrollok(stdscr, TRUE); /* reset to driver's default */ +#ifdef NCURSES_MOUSE_VERSION + mousemask(0, (mmask_t *) 0); +#endif + noraw(); + erase(); + endwin(); + return OK; +} + +/**************************************************************************** + * + * Panels tester + * + ****************************************************************************/ + +#if USE_LIBPANEL +static int nap_msec = 1; + +static NCURSES_CONST char *mod[] = +{ + "test ", + "TEST ", + "(**) ", + "*()* ", + "<--> ", + "LAST " +}; + +/*+------------------------------------------------------------------------- + wait_a_while(msec) +--------------------------------------------------------------------------*/ +static void +wait_a_while(int msec GCC_UNUSED) +{ +#if HAVE_NAPMS + if (nap_msec == 1) + wGetchar(stdscr); + else + napms(nap_msec); +#else + if (nap_msec == 1) + wGetchar(stdscr); + else if (msec > 1000) + sleep((unsigned) msec / 1000); + else + sleep(1); +#endif +} /* end of wait_a_while */ + +/*+------------------------------------------------------------------------- + saywhat(text) +--------------------------------------------------------------------------*/ +static void +saywhat(NCURSES_CONST char *text) +{ + wmove(stdscr, LINES - 1, 0); + wclrtoeol(stdscr); + if (text != 0 && *text != '\0') { + waddstr(stdscr, text); + waddstr(stdscr, "; "); + } + waddstr(stdscr, "press any key to continue"); +} /* end of saywhat */ + +/*+------------------------------------------------------------------------- + mkpanel(rows,cols,tly,tlx) - alloc a win and panel and associate them +--------------------------------------------------------------------------*/ +static PANEL * +mkpanel(NCURSES_COLOR_T color, int rows, int cols, int tly, int tlx) +{ + WINDOW *win; + PANEL *pan = 0; + + if ((win = newwin(rows, cols, tly, tlx)) != 0) { + if ((pan = new_panel(win)) == 0) { + delwin(win); + } else if (UseColors) { + NCURSES_COLOR_T fg = (NCURSES_COLOR_T) ((color == COLOR_BLUE) + ? COLOR_WHITE + : COLOR_BLACK); + NCURSES_COLOR_T bg = color; + + init_pair(color, fg, bg); + wbkgdset(win, (attr_t) (COLOR_PAIR(color) | ' ')); + } else { + wbkgdset(win, A_BOLD | ' '); + } + } + return pan; +} /* end of mkpanel */ + +/*+------------------------------------------------------------------------- + rmpanel(pan) +--------------------------------------------------------------------------*/ +static void +rmpanel(PANEL *pan) +{ + WINDOW *win = panel_window(pan); + del_panel(pan); + delwin(win); +} /* end of rmpanel */ + +/*+------------------------------------------------------------------------- + pflush() +--------------------------------------------------------------------------*/ +static void +pflush(void) +{ + update_panels(); + doupdate(); +} /* end of pflush */ + +/*+------------------------------------------------------------------------- + fill_panel(win) +--------------------------------------------------------------------------*/ +static void +init_panel(WINDOW *win) +{ + register int y, x; + + for (y = 0; y < LINES - 1; y++) { + for (x = 0; x < COLS; x++) + wprintw(win, "%d", (y + x) % 10); + } +} + +static void +fill_panel(NCURSES_CONST PANEL *pan) +{ + WINDOW *win = panel_window(pan); + const char *userptr = (const char *) panel_userptr(pan); + int num = (userptr && *userptr) ? userptr[1] : '?'; + int y, x; + + wmove(win, 1, 1); + wprintw(win, "-pan%c-", num); + wclrtoeol(win); + box(win, 0, 0); + for (y = 2; y < getmaxy(win) - 1; y++) { + for (x = 1; x < getmaxx(win) - 1; x++) { + wmove(win, y, x); + waddch(win, UChar(num)); + } + } +} + +#if USE_WIDEC_SUPPORT +static void +init_wide_panel(WINDOW *win) +{ + int digit; + cchar_t temp[10]; + + for (digit = 0; digit < 10; ++digit) + make_fullwidth_digit(&temp[digit], digit); + + do { + int y, x; + getyx(stdscr, y, x); + digit = (y + x / 2) % 10; + } while (wadd_wch(win, &temp[digit]) != ERR); +} + +static void +fill_wide_panel(NCURSES_CONST PANEL *pan) +{ + WINDOW *win = panel_window(pan); + const char *userptr = (const char *) panel_userptr(pan); + int num = (userptr && *userptr) ? userptr[1] : '?'; + int y, x; + + wmove(win, 1, 1); + wprintw(win, "-pan%c-", num); + wclrtoeol(win); + box(win, 0, 0); + for (y = 2; y < getmaxy(win) - 1; y++) { + for (x = 1; x < getmaxx(win) - 1; x++) { + wmove(win, y, x); + waddch(win, UChar(num)); + } + } +} +#endif + +#define MAX_PANELS 5 + +static void +canned_panel(PANEL *px[MAX_PANELS + 1], NCURSES_CONST char *cmd) +{ + int which = cmd[1] - '0'; + + saywhat(cmd); + switch (*cmd) { + case 'h': + hide_panel(px[which]); + break; + case 's': + show_panel(px[which]); + break; + case 't': + top_panel(px[which]); + break; + case 'b': + bottom_panel(px[which]); + break; + case 'd': + rmpanel(px[which]); + break; + } + pflush(); + wait_a_while(nap_msec); +} + +static int +demo_panels(void (*InitPanel) (WINDOW *), void (*FillPanel) (NCURSES_CONST PANEL *)) +{ + int count; + int itmp; + PANEL *px[MAX_PANELS + 1]; + + scrollok(stdscr, FALSE); /* we don't want stdscr to scroll! */ + refresh(); + + InitPanel(stdscr); + for (count = 0; count < 5; count++) { + px[1] = mkpanel(COLOR_RED, + LINES / 2 - 2, + COLS / 8 + 1, + 0, + 0); + set_panel_userptr(px[1], (NCURSES_CONST void *) "p1"); + + px[2] = mkpanel(COLOR_GREEN, + LINES / 2 + 1, + COLS / 7, + LINES / 4, + COLS / 10); + set_panel_userptr(px[2], (NCURSES_CONST void *) "p2"); + + px[3] = mkpanel(COLOR_YELLOW, + LINES / 4, + COLS / 10, + LINES / 2, + COLS / 9); + set_panel_userptr(px[3], (NCURSES_CONST void *) "p3"); + + px[4] = mkpanel(COLOR_BLUE, + LINES / 2 - 2, + COLS / 8, + LINES / 2 - 2, + COLS / 3); + set_panel_userptr(px[4], (NCURSES_CONST void *) "p4"); + + px[5] = mkpanel(COLOR_MAGENTA, + LINES / 2 - 2, + COLS / 8, + LINES / 2, + COLS / 2 - 2); + set_panel_userptr(px[5], (NCURSES_CONST void *) "p5"); + + FillPanel(px[1]); + FillPanel(px[2]); + FillPanel(px[3]); + FillPanel(px[4]); + FillPanel(px[5]); + + hide_panel(px[4]); + hide_panel(px[5]); + pflush(); + saywhat(""); + wait_a_while(nap_msec); + + saywhat("h3 s1 s2 s4 s5"); + move_panel(px[1], 0, 0); + hide_panel(px[3]); + show_panel(px[1]); + show_panel(px[2]); + show_panel(px[4]); + show_panel(px[5]); + pflush(); + wait_a_while(nap_msec); + + canned_panel(px, "s1"); + canned_panel(px, "s2"); + + saywhat("m2"); + move_panel(px[2], LINES / 3 + 1, COLS / 8); + pflush(); + wait_a_while(nap_msec); + + canned_panel(px, "s3"); + + saywhat("m3"); + move_panel(px[3], LINES / 4 + 1, COLS / 15); + pflush(); + wait_a_while(nap_msec); + + canned_panel(px, "b3"); + canned_panel(px, "s4"); + canned_panel(px, "s5"); + canned_panel(px, "t3"); + canned_panel(px, "t1"); + canned_panel(px, "t2"); + canned_panel(px, "t3"); + canned_panel(px, "t4"); + + for (itmp = 0; itmp < 6; itmp++) { + WINDOW *w4 = panel_window(px[4]); + WINDOW *w5 = panel_window(px[5]); + + saywhat("m4"); + wmove(w4, LINES / 8, 1); + waddstr(w4, mod[itmp]); + move_panel(px[4], LINES / 6, itmp * (COLS / 8)); + wmove(w5, LINES / 6, 1); + waddstr(w5, mod[itmp]); + pflush(); + wait_a_while(nap_msec); + + saywhat("m5"); + wmove(w4, LINES / 6, 1); + waddstr(w4, mod[itmp]); + move_panel(px[5], LINES / 3 - 1, (itmp * 10) + 6); + wmove(w5, LINES / 8, 1); + waddstr(w5, mod[itmp]); + pflush(); + wait_a_while(nap_msec); + } + + saywhat("m4"); + move_panel(px[4], LINES / 6, itmp * (COLS / 8)); + pflush(); + wait_a_while(nap_msec); + + canned_panel(px, "t5"); + canned_panel(px, "t2"); + canned_panel(px, "t1"); + canned_panel(px, "d2"); + canned_panel(px, "h3"); + canned_panel(px, "d1"); + canned_panel(px, "d4"); + canned_panel(px, "d5"); + canned_panel(px, "d3"); + + wait_a_while(nap_msec); + if (nap_msec == 1) + break; + nap_msec = 100L; + } + + erase(); + endwin(); + return OK; +} + +#if USE_LIBPANEL +static int +panel_test(bool recur GCC_UNUSED) +{ + return demo_panels(init_panel, fill_panel); +} +#endif + +#if USE_WIDEC_SUPPORT && USE_LIBPANEL +static int +x_panel_test(bool recur GCC_UNUSED) +{ + return demo_panels(init_wide_panel, fill_wide_panel); +} +#endif +#endif /* USE_LIBPANEL */ + +/**************************************************************************** + * + * Pad tester + * + ****************************************************************************/ + +#if HAVE_NEWPAD + +/* The behavior of mvhline, mvvline for negative/zero length is unspecified, + * though we can rely on negative x/y values to stop the macro. + */ +static void +do_h_line(int y, int x, chtype c, int to) +{ + if ((to) > (x)) + MvHLine(y, x, c, (to) - (x)); +} + +static void +do_v_line(int y, int x, chtype c, int to) +{ + if ((to) > (y)) + MvVLine(y, x, c, (to) - (y)); +} + +#define GRIDSIZE 3 + +static bool pending_pan = FALSE; +static bool show_panner_legend = TRUE; + +static int +panner_legend(int line) +{ + static const char *const legend[] = + { + "Use arrow keys (or U,D,L,R) to pan, ESC to quit, ! to shell-out.", + "Use +,- (or j,k) to grow/shrink the panner vertically.", + "Use <,> (or h,l) to grow/shrink the panner horizontally.", + "Number repeats. Toggle legend:? filler:a timer:t scrollmark:s." + }; + int n = ((int) SIZEOF(legend) - (LINES - line)); + if (n >= 0 && n < (int) SIZEOF(legend)) { + if (move(line, 0) != ERR) { + if (show_panner_legend) + printw("%s", legend[n]); + clrtoeol(); + return show_panner_legend; + } + } + return FALSE; +} + +static void +panner_h_cleanup(int from_y, int from_x, int to_x) +{ + if (!panner_legend(from_y)) + do_h_line(from_y, from_x, ' ', to_x); +} + +static void +panner_v_cleanup(int from_y, int from_x, int to_y) +{ + if (!panner_legend(from_y)) + do_v_line(from_y, from_x, ' ', to_y); +} + +static void +fill_pad(WINDOW *panpad, bool pan_lines, bool colored) +{ + int y, x; + unsigned gridcount = 0; + chtype fill = 0; +#ifdef A_COLOR + if (colored) + fill = (chtype) COLOR_PAIR(1); +#endif + + wmove(panpad, 0, 0); + for (y = 0; y < getmaxy(panpad); y++) { + for (x = 0; x < getmaxx(panpad); x++) { + if (y % GRIDSIZE == 0 && x % GRIDSIZE == 0) { + if (y == 0 && x == 0) + waddch(panpad, pan_lines ? ACS_ULCORNER : '+'); + else if (y == 0) + waddch(panpad, pan_lines ? ACS_TTEE : '+'); + else if (y == 0 || x == 0) + waddch(panpad, pan_lines ? ACS_LTEE : '+'); + else + waddch(panpad, (chtype) ((pan_lines ? 'a' : 'A') + + (int) (gridcount++ % 26)) | fill); + } else if (y % GRIDSIZE == 0) + waddch(panpad, pan_lines ? ACS_HLINE : '-'); + else if (x % GRIDSIZE == 0) + waddch(panpad, pan_lines ? ACS_VLINE : '|'); + else + waddch(panpad, ' '); + } + } +} + +static void +panner(WINDOW *pad, + int top_x, int top_y, int porty, int portx, + int (*pgetc) (WINDOW *), + bool colored) +{ + TimeType before, after; + bool timing = TRUE; + bool pan_lines = FALSE; + bool scrollers = TRUE; + int basex = 0; + int basey = 0; + int pxmax, pymax, lowend, highend, c; + + getmaxyx(pad, pymax, pxmax); + scrollok(stdscr, FALSE); /* we don't want stdscr to scroll! */ + + c = KEY_REFRESH; + do { +#ifdef NCURSES_VERSION + /* + * During shell-out, the user may have resized the window. Adjust + * the port size of the pad to accommodate this. Ncurses automatically + * resizes all of the normal windows to fit on the new screen. + */ + if (top_x > COLS) + top_x = COLS; + if (portx > COLS) + portx = COLS; + if (top_y > LINES) + top_y = LINES; + if (porty > LINES) + porty = LINES; +#endif + switch (c) { + case KEY_REFRESH: + erase(); + + /* FALLTHRU */ + case HELP_KEY_1: + if (c == HELP_KEY_1) + show_panner_legend = !show_panner_legend; + panner_legend(LINES - 4); + panner_legend(LINES - 3); + panner_legend(LINES - 2); + panner_legend(LINES - 1); + break; + case 'a': + pan_lines = !pan_lines; + fill_pad(pad, pan_lines, colored); + pending_pan = FALSE; + break; + + case 't': + timing = !timing; + if (!timing) + panner_legend(LINES - 1); + break; + case 's': + scrollers = !scrollers; + break; + + /* Move the top-left corner of the pad, keeping the bottom-right + * corner fixed. + */ + case 'h': /* increase-columns: move left edge to left */ + if (top_x <= 0) + beep(); + else { + panner_v_cleanup(top_y, top_x, porty); + top_x--; + } + break; + + case 'j': /* decrease-lines: move top-edge down */ + if (top_y >= porty) + beep(); + else { + panner_h_cleanup(top_y - 1, top_x - (top_x > 0), portx); + top_y++; + } + break; + + case 'k': /* increase-lines: move top-edge up */ + if (top_y <= 0) + beep(); + else { + top_y--; + panner_h_cleanup(top_y, top_x, portx); + } + break; + + case 'l': /* decrease-columns: move left-edge to right */ + if (top_x >= portx) + beep(); + else { + panner_v_cleanup(top_y - (top_y > 0), top_x - 1, porty); + top_x++; + } + break; + + /* Move the bottom-right corner of the pad, keeping the top-left + * corner fixed. + */ + case KEY_IC: /* increase-columns: move right-edge to right */ + if (portx >= pxmax || portx >= COLS) + beep(); + else { + panner_v_cleanup(top_y - (top_y > 0), portx - 1, porty); + ++portx; + } + break; + + case KEY_IL: /* increase-lines: move bottom-edge down */ + if (porty >= pymax || porty >= LINES) + beep(); + else { + panner_h_cleanup(porty - 1, top_x - (top_x > 0), portx); + ++porty; + } + break; + + case KEY_DC: /* decrease-columns: move bottom edge up */ + if (portx <= top_x) + beep(); + else { + portx--; + panner_v_cleanup(top_y - (top_y > 0), portx, porty); + } + break; + + case KEY_DL: /* decrease-lines */ + if (porty <= top_y) + beep(); + else { + porty--; + panner_h_cleanup(porty, top_x - (top_x > 0), portx); + } + break; + + case KEY_LEFT: /* pan leftwards */ + if (basex > 0) + basex--; + else + beep(); + break; + + case KEY_RIGHT: /* pan rightwards */ + if (basex + portx - (pymax > porty) < pxmax) + basex++; + else + beep(); + break; + + case KEY_UP: /* pan upwards */ + if (basey > 0) + basey--; + else + beep(); + break; + + case KEY_DOWN: /* pan downwards */ + if (basey + porty - (pxmax > portx) < pymax) + basey++; + else + beep(); + break; + + case 'H': + case KEY_HOME: + case KEY_FIND: + basey = 0; + break; + + case 'E': + case KEY_END: + case KEY_SELECT: + basey = pymax - porty; + if (basey < 0) + basey = 0; + break; + + default: + beep(); + break; + } + + MvAddCh(top_y - 1, top_x - 1, ACS_ULCORNER); + do_v_line(top_y, top_x - 1, ACS_VLINE, porty); + do_h_line(top_y - 1, top_x, ACS_HLINE, portx); + + if (scrollers && (pxmax > portx - 1)) { + int length = (portx - top_x - 1); + float ratio = ((float) length) / ((float) pxmax); + + lowend = (int) ((float) top_x + ((float) basex * ratio)); + highend = (int) ((float) top_x + ((float) (basex + length) * ratio)); + + do_h_line(porty - 1, top_x, ACS_HLINE, lowend); + if (highend < portx) { + attron(A_REVERSE); + do_h_line(porty - 1, lowend, ' ', highend + 1); + attroff(A_REVERSE); + do_h_line(porty - 1, highend + 1, ACS_HLINE, portx); + } + } else + do_h_line(porty - 1, top_x, ACS_HLINE, portx); + + if (scrollers && (pymax > porty - 1)) { + int length = (porty - top_y - 1); + float ratio = ((float) length) / ((float) pymax); + + lowend = (int) ((float) top_y + ((float) basey * ratio)); + highend = (int) ((float) top_y + ((float) (basey + length) * ratio)); + + do_v_line(top_y, portx - 1, ACS_VLINE, lowend); + if (highend < porty) { + attron(A_REVERSE); + do_v_line(lowend, portx - 1, ' ', highend + 1); + attroff(A_REVERSE); + do_v_line(highend + 1, portx - 1, ACS_VLINE, porty); + } + } else + do_v_line(top_y, portx - 1, ACS_VLINE, porty); + + MvAddCh(top_y - 1, portx - 1, ACS_URCORNER); + MvAddCh(porty - 1, top_x - 1, ACS_LLCORNER); + MvAddCh(porty - 1, portx - 1, ACS_LRCORNER); + + if (!pending_pan) { + GetClockTime(&before); + wnoutrefresh(stdscr); + + pnoutrefresh(pad, + basey, basex, + top_y, top_x, + porty - (pxmax > portx) - 1, + portx - (pymax > porty) - 1); + + doupdate(); + if (timing) { + GetClockTime(&after); + move(LINES - 1, COLS - 12); + printw("Secs: %6.03f", ElapsedSeconds(&before, &after)); + refresh(); + } + } + + } while + ((c = pgetc(pad)) != KEY_EXIT); + + scrollok(stdscr, TRUE); /* reset to driver's default */ +} + +static int +padgetch(WINDOW *win) +{ + static int count; + static int last; + + if ((pending_pan = (count > 0)) != FALSE) { + count--; + pending_pan = (count != 0); + } else { + for (;;) { + int c; + switch (c = wGetchar(win)) { + case '!': + ShellOut(FALSE); + /* FALLTHRU */ + case CTRL('r'): + endwin(); + refresh(); + c = KEY_REFRESH; + break; + case CTRL('l'): + c = KEY_REFRESH; + break; + case 'U': + c = KEY_UP; + break; + case 'D': + c = KEY_DOWN; + break; + case 'R': + c = KEY_RIGHT; + break; + case 'L': + c = KEY_LEFT; + break; + case '+': + c = KEY_IL; + break; + case '-': + c = KEY_DL; + break; + case '>': + c = KEY_IC; + break; + case '<': + c = KEY_DC; + break; + case ERR: /* FALLTHRU */ + case case_QUIT: + count = 0; + c = KEY_EXIT; + break; + default: + if (c >= '0' && c <= '9') { + count = count * 10 + (c - '0'); + continue; + } + break; + } + last = c; + break; + } + if (count > 0) + count--; + } + return (last); +} + +#define PAD_HIGH 200 +#define PAD_WIDE 200 + +static int +pad_test(bool recur GCC_UNUSED) +/* Demonstrate pads. */ +{ + WINDOW *panpad = newpad(PAD_HIGH, PAD_WIDE); + + if (panpad == 0) { + Cannot("cannot create requested pad"); + return ERR; + } +#ifdef A_COLOR + if (UseColors) { + init_pair(1, COLOR_BLACK, COLOR_GREEN); + init_pair(2, COLOR_CYAN, COLOR_BLUE); + wbkgd(panpad, (chtype) (COLOR_PAIR(2) | ' ')); + } +#endif + fill_pad(panpad, FALSE, TRUE); + + panner_legend(LINES - 4); + panner_legend(LINES - 3); + panner_legend(LINES - 2); + panner_legend(LINES - 1); + + keypad(panpad, TRUE); + + /* Make the pad (initially) narrow enough that a trace file won't wrap. + * We'll still be able to widen it during a test, since that's required + * for testing boundaries. + */ + panner(panpad, 2, 2, LINES - 5, COLS - 15, padgetch, TRUE); + + delwin(panpad); + endwin(); + erase(); + return OK; +} +#endif /* HAVE_NEWPAD */ + +/**************************************************************************** + * + * Tests from John Burnell's PDCurses tester + * + ****************************************************************************/ + +static void +Continue(WINDOW *win) +{ + noecho(); + wmove(win, 10, 1); + MvWAddStr(win, 10, 1, " Press any key to continue"); + wrefresh(win); + wGetchar(win); +} + +static int +flushinp_test(bool recur GCC_UNUSED) +/* Input test, adapted from John Burnell's PDCurses tester */ +{ + WINDOW *win = stdscr; + int w, h, bx, by, sw, sh, i; + + WINDOW *subWin; + wclear(win); + + getmaxyx(win, h, w); + getbegyx(win, by, bx); + sw = w / 3; + sh = h / 3; + if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == 0) + return ERR; + +#ifdef A_COLOR + if (UseColors) { + init_pair(2, COLOR_CYAN, COLOR_BLUE); + wbkgd(subWin, (chtype) (COLOR_PAIR(2) | ' ')); + } +#endif + (void) wattrset(subWin, A_BOLD); + box(subWin, ACS_VLINE, ACS_HLINE); + MvWAddStr(subWin, 2, 1, "This is a subwindow"); + wrefresh(win); + + /* + * This used to set 'nocbreak()'. However, Alexander Lukyanov says that + * it only happened to "work" on SVr4 because that implementation does not + * emulate nocbreak+noecho mode, whereas ncurses does. To get the desired + * test behavior, we're using 'cbreak()', which will allow a single + * character to return without needing a newline. - T.Dickey 1997/10/11. + */ + cbreak(); + MvWAddStr(win, 0, 1, "This is a test of the flushinp() call."); + + MvWAddStr(win, 2, 1, "Type random keys for 5 seconds."); + MvWAddStr(win, 3, 1, + "These should be discarded (not echoed) after the subwindow goes away."); + wrefresh(win); + + for (i = 0; i < 5; i++) { + MvWPrintw(subWin, 1, 1, "Time = %d", i); + wrefresh(subWin); + napms(1000); + flushinp(); + } + + delwin(subWin); + werase(win); + flash(); + wrefresh(win); + napms(1000); + + MvWAddStr(win, 2, 1, + "If you were still typing when the window timer expired,"); + MvWAddStr(win, 3, 1, + "or else you typed nothing at all while it was running,"); + MvWAddStr(win, 4, 1, + "test was invalid. You'll see garbage or nothing at all. "); + MvWAddStr(win, 6, 1, "Press a key"); + wmove(win, 9, 10); + wrefresh(win); + echo(); + wGetchar(win); + flushinp(); + MvWAddStr(win, 12, 0, + "If you see any key other than what you typed, flushinp() is broken."); + Continue(win); + + wmove(win, 9, 10); + wdelch(win); + wrefresh(win); + wmove(win, 12, 0); + clrtoeol(); + waddstr(win, + "What you typed should now have been deleted; if not, wdelch() failed."); + Continue(win); + + cbreak(); + return OK; +} + +/**************************************************************************** + * + * Menu test + * + ****************************************************************************/ + +#if USE_LIBMENU + +#define MENU_Y 8 +#define MENU_X 8 + +static int +menu_virtualize(int c) +{ + if (c == '\n' || c == KEY_EXIT) + return (MAX_COMMAND + 1); + else if (c == 'u') + return (REQ_SCR_ULINE); + else if (c == 'd') + return (REQ_SCR_DLINE); + else if (c == 'b' || c == KEY_NPAGE) + return (REQ_SCR_UPAGE); + else if (c == 'f' || c == KEY_PPAGE) + return (REQ_SCR_DPAGE); + else if (c == 'n' || c == KEY_DOWN) + return (REQ_NEXT_ITEM); + else if (c == 'p' || c == KEY_UP) + return (REQ_PREV_ITEM); + else if (c == ' ') + return (REQ_TOGGLE_ITEM); + else { + if (c != KEY_MOUSE) + beep(); + return (c); + } +} + +static CONST_MENUS char *animals[] = +{ + "Lions", + "Tigers", + "Bears", + "(Oh my!)", + "Newts", + "Platypi", + "Lemurs", + "(Oh really?!)", + "Leopards", + "Panthers", + "Pumas", + "Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs", + "Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs, Lions, Tigers, Bears, (Oh my!), Newts, Platypi, Lemurs", + (char *) 0 +}; + +static int +menu_test(bool recur GCC_UNUSED) +{ + MENU *m; + ITEM *items[SIZEOF(animals)]; + ITEM **ip = items; + CONST_MENUS char **ap; + int mrows, mcols, c; + WINDOW *menuwin; + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif + MvAddStr(0, 0, "This is the menu test:"); + MvAddStr(2, 0, " Use up and down arrow to move the select bar."); + MvAddStr(3, 0, " 'n' and 'p' act like arrows."); + MvAddStr(4, 0, + " 'b' and 'f' scroll up/down (page), 'u' and 'd' (line)."); + MvAddStr(5, 0, " Press return to exit."); + refresh(); + + for (ap = animals; *ap; ap++) { + if ((*ip = new_item(*ap, "")) != 0) + ++ip; + } + *ip = (ITEM *) 0; + + m = new_menu(items); + + set_menu_format(m, (SIZEOF(animals) + 1) / 2, 1); + scale_menu(m, &mrows, &mcols); + + menuwin = newwin(mrows + 2, mcols + 2, MENU_Y, MENU_X); + set_menu_win(m, menuwin); + keypad(menuwin, TRUE); + box(menuwin, 0, 0); + + set_menu_sub(m, derwin(menuwin, mrows, mcols, 1, 1)); + + post_menu(m); + + while ((c = menu_driver(m, menu_virtualize(wGetchar(menuwin)))) != E_UNKNOWN_COMMAND) { + if (c == E_NOT_POSTED) + break; + if (c == E_REQUEST_DENIED) + beep(); + } + + MvPrintw(LINES - 2, 0, + "You chose: %s\n", item_name(current_item(m))); + (void) addstr("Press any key to continue..."); + wGetchar(stdscr); + + unpost_menu(m); + delwin(menuwin); + + free_menu(m); + for (ip = items; *ip; ip++) + free_item(*ip); +#ifdef NCURSES_MOUSE_VERSION + mousemask(0, (mmask_t *) 0); +#endif + return OK; +} + +#ifdef TRACE +#define T_TBL(name) { #name, name } +static struct { + const char *name; + unsigned mask; +} t_tbl[] = { + + T_TBL(TRACE_DISABLE), + T_TBL(TRACE_TIMES), + T_TBL(TRACE_TPUTS), + T_TBL(TRACE_UPDATE), + T_TBL(TRACE_MOVE), + T_TBL(TRACE_CHARPUT), + T_TBL(TRACE_ORDINARY), + T_TBL(TRACE_CALLS), + T_TBL(TRACE_VIRTPUT), + T_TBL(TRACE_IEVENT), + T_TBL(TRACE_BITS), + T_TBL(TRACE_ICALLS), + T_TBL(TRACE_CCALLS), + T_TBL(TRACE_DATABASE), + T_TBL(TRACE_ATTRS), + T_TBL(TRACE_MAXIMUM), + { + (char *) 0, 0 + } +}; + +static char * +tracetrace(unsigned tlevel) +{ + static char *buf; + static size_t need = 12; + int n; + + if (buf == 0) { + for (n = 0; t_tbl[n].name != 0; n++) + need += strlen(t_tbl[n].name) + 2; + buf = typeMalloc(char, need); + if (!buf) + failed("tracetrace"); + } + _nc_SPRINTF(buf, _nc_SLIMIT(need) "0x%02x = {", tlevel); + if (tlevel == 0) { + _nc_STRCAT(buf, t_tbl[0].name ? t_tbl[0].name : "", need); + _nc_STRCAT(buf, ", ", need); + } else { + for (n = 1; t_tbl[n].name != 0; n++) + if ((tlevel & t_tbl[n].mask) == t_tbl[n].mask) { + _nc_STRCAT(buf, t_tbl[n].name, need); + _nc_STRCAT(buf, ", ", need); + } + } + if (buf[strlen(buf) - 2] == ',') + buf[strlen(buf) - 2] = '\0'; + _nc_STRCAT(buf, "}", need); + return buf; +} + +/* fake a dynamically reconfigurable menu using the 0th entry to deselect + * the others + */ +static int +run_trace_menu(MENU * m) +{ + ITEM **items; + NCURSES_CONST ITEM *i; + ITEM **p; + + for (;;) { + bool changed = FALSE; + switch (menu_driver(m, menu_virtualize(wGetchar(menu_win(m))))) { + case E_UNKNOWN_COMMAND: + return FALSE; + default: + items = menu_items(m); + i = current_item(m); + if (i == items[0]) { + if (item_value(i)) { + for (p = items + 1; *p != 0; p++) + if (item_value(*p)) { + set_item_value(*p, FALSE); + changed = TRUE; + } + } + } else { + for (p = items + 1; *p != 0; p++) + if (item_value(*p)) { + set_item_value(items[0], FALSE); + changed = TRUE; + break; + } + } + if (!changed) + return TRUE; + } + } +} + +static int +trace_set(bool recur GCC_UNUSED) +/* interactively set the trace level */ +{ + MENU *m; + ITEM *items[SIZEOF(t_tbl)]; + ITEM **ip = items; + int mrows, mcols; + unsigned newtrace; + int n; + WINDOW *menuwin; + + MvAddStr(0, 0, "Interactively set trace level:"); + MvAddStr(2, 0, " Press space bar to toggle a selection."); + MvAddStr(3, 0, " Use up and down arrow to move the select bar."); + MvAddStr(4, 0, " Press return to set the trace level."); + MvPrintw(6, 0, "(Current trace level is %s)", tracetrace(_nc_tracing)); + + refresh(); + + for (n = 0; t_tbl[n].name != 0; n++) { + if ((*ip = new_item(t_tbl[n].name, "")) != 0) { + ++ip; + } + } + *ip = (ITEM *) 0; + + m = new_menu(items); + + set_menu_format(m, 0, 2); + scale_menu(m, &mrows, &mcols); + + menu_opts_off(m, O_ONEVALUE); + menuwin = newwin(mrows + 2, mcols + 2, MENU_Y, MENU_X); + set_menu_win(m, menuwin); + keypad(menuwin, TRUE); + box(menuwin, 0, 0); + + set_menu_sub(m, derwin(menuwin, mrows, mcols, 1, 1)); + + post_menu(m); + + for (ip = menu_items(m); *ip; ip++) { + unsigned mask = t_tbl[item_index(*ip)].mask; + if (mask == 0) + set_item_value(*ip, _nc_tracing == 0); + else if ((mask & _nc_tracing) == mask) + set_item_value(*ip, TRUE); + } + + while (run_trace_menu(m)) { + /* EMPTY */ ; + } + + newtrace = 0; + for (ip = menu_items(m); *ip; ip++) + if (item_value(*ip)) + newtrace |= t_tbl[item_index(*ip)].mask; + curses_trace(newtrace); + Trace(("trace level interactively set to %s", tracetrace(_nc_tracing))); + + MvPrintw(LINES - 2, 0, + "Trace level is %s\n", tracetrace(_nc_tracing)); + (void) addstr("Press any key to continue..."); + wGetchar(stdscr); + + unpost_menu(m); + delwin(menuwin); + + free_menu(m); + for (ip = items; *ip; ip++) + free_item(*ip); + + return OK; +} +#endif /* TRACE */ +#endif /* USE_LIBMENU */ + +/**************************************************************************** + * + * Forms test + * + ****************************************************************************/ +#if USE_LIBFORM +static FIELD * +make_label(int frow, int fcol, NCURSES_CONST char *label) +{ + FIELD *f = new_field(1, (int) strlen(label), frow, fcol, 0, 0); + + if (f) { + set_field_buffer(f, 0, label); + set_field_opts(f, (int) ((unsigned) field_opts(f) & (unsigned) ~O_ACTIVE)); + } + return (f); +} + +static FIELD * +make_field(int frow, int fcol, int rows, int cols, bool secure) +{ + FIELD *f = new_field(rows, cols, frow, fcol, 0, secure ? 1 : 0); + + if (f) { + set_field_back(f, A_UNDERLINE); + set_field_userptr(f, (void *) 0); + } + return (f); +} + +static void +display_form(FORM *f) +{ + WINDOW *w; + int rows, cols; + + scale_form(f, &rows, &cols); + + if ((w = newwin(rows + 2, cols + 4, 0, 0)) != (WINDOW *) 0) { + set_form_win(f, w); + set_form_sub(f, derwin(w, rows, cols, 1, 2)); + box(w, 0, 0); + keypad(w, TRUE); + if (post_form(f) != E_OK) + wrefresh(w); + } +} + +static void +erase_form(FORM *f) +{ + WINDOW *w = form_win(f); + WINDOW *s = form_sub(f); + + unpost_form(f); + werase(w); + wrefresh(w); + delwin(s); + delwin(w); +} + +static int +edit_secure(FIELD *me, int c) +{ + int rows, cols, frow, fcol, nrow, nbuf; + + if (field_info(me, &rows, &cols, &frow, &fcol, &nrow, &nbuf) == E_OK + && nbuf > 0) { + NCURSES_CONST char *source = field_buffer(me, 1); + size_t have = (source ? strlen(source) : 0) + 1; + size_t need = 80 + have; + char *temp = malloc(need); + + if (temp != 0) { + size_t len; + _nc_STRNCPY(temp, source ? source : "", have + 1); + len = (size_t) (char *) field_userptr(me); + if (c <= KEY_MAX) { + if (isgraph(UChar(c)) && (len + 1) < sizeof(temp)) { + temp[len++] = (char) c; + temp[len] = 0; + set_field_buffer(me, 1, temp); + c = '*'; + } else { + c = 0; + } + } else { + switch (c) { + case REQ_BEG_FIELD: + case REQ_CLR_EOF: + case REQ_CLR_EOL: + case REQ_DEL_LINE: + case REQ_DEL_WORD: + case REQ_DOWN_CHAR: + case REQ_END_FIELD: + case REQ_INS_CHAR: + case REQ_INS_LINE: + case REQ_LEFT_CHAR: + case REQ_NEW_LINE: + case REQ_NEXT_WORD: + case REQ_PREV_WORD: + case REQ_RIGHT_CHAR: + case REQ_UP_CHAR: + c = 0; /* we don't want to do inline editing */ + break; + case REQ_CLR_FIELD: + if (len) { + temp[0] = 0; + set_field_buffer(me, 1, temp); + } + break; + case REQ_DEL_CHAR: + case REQ_DEL_PREV: + if (len) { + temp[--len] = 0; + set_field_buffer(me, 1, temp); + } + break; + } + } + set_field_userptr(me, (void *) len); + free(temp); + } + } + return c; +} + +static int +form_virtualize(NCURSES_CONST FORM *f, WINDOW *w) +{ + /* *INDENT-OFF* */ + static const struct { + int code; + int result; + } lookup[] = { + { CTRL('A'), REQ_NEXT_CHOICE }, + { CTRL('B'), REQ_PREV_WORD }, + { CTRL('C'), REQ_CLR_EOL }, + { CTRL('D'), REQ_DOWN_FIELD }, + { CTRL('E'), REQ_END_FIELD }, + { CTRL('F'), REQ_NEXT_PAGE }, + { CTRL('G'), REQ_DEL_WORD }, + { CTRL('H'), REQ_DEL_PREV }, + { CTRL('I'), REQ_INS_CHAR }, + { CTRL('K'), REQ_CLR_EOF }, + { CTRL('L'), REQ_LEFT_FIELD }, + { CTRL('M'), REQ_NEW_LINE }, + { CTRL('N'), REQ_NEXT_FIELD }, + { CTRL('O'), REQ_INS_LINE }, + { CTRL('P'), REQ_PREV_FIELD }, + { CTRL('R'), REQ_RIGHT_FIELD }, + { CTRL('S'), REQ_BEG_FIELD }, + { CTRL('U'), REQ_UP_FIELD }, + { CTRL('V'), REQ_DEL_CHAR }, + { CTRL('W'), REQ_NEXT_WORD }, + { CTRL('X'), REQ_CLR_FIELD }, + { CTRL('Y'), REQ_DEL_LINE }, + { CTRL('Z'), REQ_PREV_CHOICE }, + { ESCAPE, MAX_FORM_COMMAND + 1 }, + { KEY_BACKSPACE, REQ_DEL_PREV }, + { KEY_DOWN, REQ_DOWN_CHAR }, + { KEY_END, REQ_LAST_FIELD }, + { KEY_HOME, REQ_FIRST_FIELD }, + { KEY_LEFT, REQ_LEFT_CHAR }, + { KEY_LL, REQ_LAST_FIELD }, + { KEY_NEXT, REQ_NEXT_FIELD }, + { KEY_NPAGE, REQ_NEXT_PAGE }, + { KEY_PPAGE, REQ_PREV_PAGE }, + { KEY_PREVIOUS, REQ_PREV_FIELD }, + { KEY_RIGHT, REQ_RIGHT_CHAR }, + { KEY_UP, REQ_UP_CHAR }, + { QUIT, MAX_FORM_COMMAND + 1 } + }; + /* *INDENT-ON* */ + + static int mode = REQ_INS_MODE; + int c = wGetchar(w); + FIELD *me = current_field(f); + bool current = TRUE; + + if (c == CTRL(']')) { + if (mode == REQ_INS_MODE) { + mode = REQ_OVL_MODE; + } else { + mode = REQ_INS_MODE; + } + c = mode; + } else { + unsigned n; + for (n = 0; n < SIZEOF(lookup); n++) { + if (lookup[n].code == c) { + c = lookup[n].result; + break; + } + } + } + MvPrintw(0, COLS - 6, "(%s)", mode == REQ_INS_MODE ? "INS" : "OVL"); + + /* + * Force the field that the user is typing into to be in reverse video, + * while the other fields are shown underlined. + */ + switch (c) { + case REQ_BEG_FIELD: + case REQ_CLR_EOF: + case REQ_CLR_EOL: + case REQ_CLR_FIELD: + case REQ_DEL_CHAR: + case REQ_DEL_LINE: + case REQ_DEL_PREV: + case REQ_DEL_WORD: + case REQ_END_FIELD: + case REQ_INS_CHAR: + case REQ_INS_LINE: + case REQ_LEFT_CHAR: + case REQ_LEFT_FIELD: + case REQ_NEXT_WORD: + case REQ_RIGHT_CHAR: + current = TRUE; + break; + default: + current = (c < KEY_MAX); + break; + } + if (current) { + c = edit_secure(me, c); + set_field_back(me, A_REVERSE); + } else { + c = edit_secure(me, c); + set_field_back(me, A_UNDERLINE); + } + return c; +} + +static int +my_form_driver(FORM *form, int c) +{ + if (c == (MAX_FORM_COMMAND + 1) + && form_driver(form, REQ_VALIDATION) == E_OK) + return (TRUE); + else { + beep(); + return (FALSE); + } +} + +#ifdef NCURSES_VERSION +#define FIELDCHECK_CB(func) bool func(FIELD * fld, const void * data GCC_UNUSED) +#define CHAR_CHECK_CB(func) bool func(int ch, const void *data GCC_UNUSED) +#else +#define FIELDCHECK_CB(func) int func(FIELD * fld, char * data GCC_UNUSED) +#define CHAR_CHECK_CB(func) int func(int ch, char *data GCC_UNUSED) +#endif + +/* + * Allow a middle initial, optionally with a '.' to end it. + */ +static +FIELDCHECK_CB(mi_field_check) +{ + char *s = field_buffer(fld, 0); + int state = 0; + int n; + + for (n = 0; s[n] != '\0'; ++n) { + switch (state) { + case 0: + if (s[n] == '.') { + if (n != 1) + return FALSE; + state = 2; + } else if (isspace(UChar(s[n]))) { + state = 2; + } + break; + case 2: + if (!isspace(UChar(s[n]))) + return FALSE; + break; + } + } + + /* force the form to display a leading capital */ + if (islower(UChar(s[0]))) { + s[0] = (char) toupper(UChar(s[0])); + set_field_buffer(fld, 0, s); + } + return TRUE; +} + +static +CHAR_CHECK_CB(mi_char_check) +{ + return ((isalpha(ch) || ch == '.') ? TRUE : FALSE); +} + +/* + * Passwords should be at least 6 characters. + */ +static +FIELDCHECK_CB(pw_field_check) +{ + NCURSES_CONST char *s = field_buffer(fld, 0); + int n; + + for (n = 0; s[n] != '\0'; ++n) { + if (isspace(UChar(s[n]))) { + if (n < 6) + return FALSE; + } + } + return TRUE; +} + +static +CHAR_CHECK_CB(pw_char_check) +{ + return (isgraph(ch) ? TRUE : FALSE); +} + +static int +form_test(bool recur GCC_UNUSED) +{ + FORM *form; + FIELD *f[12]; + NCURSES_CONST FIELD *secure; + FIELDTYPE *fty_middle = new_fieldtype(mi_field_check, mi_char_check); + FIELDTYPE *fty_passwd = new_fieldtype(pw_field_check, pw_char_check); + int c; + unsigned n = 0; + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif + + move(18, 0); + addstr("Defined edit/traversal keys: ^Q/ESC- exit form\n"); + addstr("^N -- go to next field ^P -- go to previous field\n"); + addstr("Home -- go to first field End -- go to last field\n"); + addstr("^L -- go to field to left ^R -- go to field to right\n"); + addstr("^U -- move upward to field ^D -- move downward to field\n"); + addstr("^W -- go to next word ^B -- go to previous word\n"); + addstr("^S -- go to start of field ^E -- go to end of field\n"); + addstr("^H -- delete previous char ^Y -- delete line\n"); + addstr("^G -- delete current word ^C -- clear to end of line\n"); + addstr("^K -- clear to end of field ^X -- clear field\n"); + addstr("Arrow keys move within a field as you would expect. ^] toggles overlay mode."); + + MvAddStr(4, 57, "Forms Entry Test"); + + refresh(); + + /* describe the form */ + memset(f, 0, sizeof(f)); + f[n++] = make_label(0, 15, "Sample Form"); + + f[n++] = make_label(2, 0, "Last Name"); + f[n++] = make_field(3, 0, 1, 18, FALSE); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + f[n++] = make_label(2, 20, "First Name"); + f[n++] = make_field(3, 20, 1, 12, FALSE); + set_field_type(f[n - 1], TYPE_ALPHA, 1); + + f[n++] = make_label(2, 34, "Middle Name"); + f[n++] = make_field(3, 34, 1, 12, FALSE); + set_field_type(f[n - 1], fty_middle); + + f[n++] = make_label(5, 0, "Comments"); + f[n++] = make_field(6, 0, 4, 46, FALSE); + + f[n++] = make_label(5, 20, "Password:"); + secure = + f[n++] = make_field(5, 30, 1, 9, TRUE); + set_field_type(f[n - 1], fty_passwd); + f[n] = (FIELD *) 0; + + if ((form = new_form(f)) != 0) { + WINDOW *w; + int finished = 0; + + display_form(form); + + w = form_win(form); + raw(); + nonl(); /* lets us read ^M's */ + while (!finished) { + switch (form_driver(form, c = form_virtualize(form, w))) { + case E_OK: + MvAddStr(5, 57, field_buffer(secure, 1)); + clrtoeol(); + refresh(); + break; + case E_UNKNOWN_COMMAND: + finished = my_form_driver(form, c); + break; + default: + beep(); + break; + } + } + + erase_form(form); + + free_form(form); + } + for (c = 0; f[c] != 0; c++) + free_field(f[c]); + free_fieldtype(fty_middle); + free_fieldtype(fty_passwd); + noraw(); + nl(); + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif + return OK; +} +#endif /* USE_LIBFORM */ + +/**************************************************************************** + * + * Overlap test + * + ****************************************************************************/ + +#if HAVE_COPYWIN /* ...and overlay, overwrite */ + +static const int overlap_HEAD = 1; +static const int overlap_FOOT = 6; + +static WINDOW * +make_overlap(int n) +{ + WINDOW *result; + int y, x; + + getmaxyx(stdscr, y, x); + if (y < 23 || x < 80) { + Cannot("The screen is too small for this test"); + result = 0; + } else { + int ymax = y - (overlap_HEAD + overlap_FOOT); + int high = ymax / 5; /* equal-sized parts for cross */ + int xmax = x - 2; /* margin */ + int wide = (xmax / 5) & ~1; + int lmar, tmar; + + if (high > 8) + high = 8; + + if (wide > 8) + wide = 8; + + tmar = (ymax - (5 * high)) / 2 + overlap_HEAD; + lmar = (xmax - (5 * wide)) / 2; + + if (n == 0) { + result = newwin(3 * high, 3 * wide, tmar, lmar); + } else { + result = newwin(3 * high, 3 * wide, tmar + 2 * high, lmar + 2 * wide); + } + } + return result; +} + +static void +clear_overlap(void) +{ + int row; + + for (row = overlap_HEAD; row < LINES - overlap_FOOT; ++row) { + move(row, 0); + clrtoeol(); + } +} + +static int +move_overlap(int shift, WINDOW *win1) +{ + int ymax = getmaxy(stdscr) - (overlap_HEAD + overlap_FOOT); + int high = ymax / 5; /* equal-sized parts for cross */ + int tmar; + int xmax1 = getmaxx(win1) + 1; + int lmar1 = (COLS - (5 * (xmax1) / 3)) / 2; + int rc = ERR; + + if (high > 8) + high = 8; + tmar = (ymax - (5 * high)) / 2 + overlap_HEAD; + + rc = mvwin(win1, tmar, lmar1 + shift); + return rc; +} + +static void +fillwin(WINDOW *win, char ch) +{ + int y, x; + int y1, x1; + + getmaxyx(win, y1, x1); + for (y = 0; y < y1; y++) { + wmove(win, y, 0); + for (x = 0; x < x1; x++) + waddch(win, UChar(ch)); + } +} + +#define InCross(x,y, x1,y1) \ + (((x > (x1 - 1) / 3) && (x <= (2 * (x1 - 1)) / 3)) \ + || (((y > (y1 - 1) / 3) && (y <= (2 * (y1 - 1)) / 3)))) + +static void +crosswin(WINDOW *win, char ch) +{ + int y, x; + int y1, x1; + int xw = 1; + + getmaxyx(win, y1, x1); + for (y = 0; y < y1; y++) { + for (x = 0; x < x1; x += xw) { + if (InCross(x, y, x1, y1)) { + wmove(win, y, x); + waddch(win, UChar(ch)); + } + } + } +} + +/* + * Match "crosswin()", but using line-drawing characters. This could be done + * a little simpler using box(), but the reason for this example is to test + * hline/vline and addch with line-drawing vs the copy/overlay functions. + */ +static void +crossbox(WINDOW *win) +{ + int y1, x1; + int ymax, xmax; + + getmaxyx(win, y1, x1); + + ymax = (y1 + 1); + xmax = (x1 + 1); + + mvwhline(win, 0, (xmax / 3), ACS_HLINE, (xmax / 3)); + mvwhline(win, ymax / 3, 0, ACS_HLINE, xmax); + mvwhline(win, ((2 * ymax) / 3) - 1, 0, ACS_HLINE, xmax); + mvwhline(win, y1 - 1, (xmax / 3), ACS_HLINE, (xmax / 3)); + + mvwvline(win, (ymax / 3), 0, ACS_VLINE, (ymax / 3)); + mvwvline(win, 0, xmax / 3, ACS_VLINE, ymax); + mvwvline(win, 0, ((2 * xmax) / 3) - 1, ACS_VLINE, ymax); + mvwvline(win, (ymax / 3), x1 - 1, ACS_VLINE, (ymax / 3)); + + mvwaddch(win, 0, (xmax / 3), ACS_ULCORNER); + mvwaddch(win, 0, ((2 * xmax) / 3) - 1, ACS_URCORNER); + mvwaddch(win, y1 - 1, (xmax / 3), ACS_LLCORNER); + mvwaddch(win, y1 - 1, ((2 * xmax) / 3) - 1, ACS_LRCORNER); + + mvwaddch(win, (ymax / 3), 0, ACS_ULCORNER); + mvwaddch(win, ((2 * ymax) / 3) - 1, 0, ACS_LLCORNER); + mvwaddch(win, (ymax / 3), x1 - 1, ACS_URCORNER); + mvwaddch(win, ((2 * ymax) / 3) - 1, x1 - 1, ACS_LRCORNER); + + mvwaddch(win, (ymax / 3), (xmax / 3), ACS_PLUS); + mvwaddch(win, (ymax / 3), ((2 * xmax) / 3) - 1, ACS_PLUS); + mvwaddch(win, ((2 * ymax) / 3) - 1, ((2 * xmax) / 3) - 1, ACS_PLUS); + mvwaddch(win, ((2 * ymax) / 3) - 1, (xmax / 3), ACS_PLUS); +} + +typedef enum { + otBASE_refresh = 0 + ,otBASE_fill + ,otBASE_draw + ,otBASE_clear + ,otBASE_copy +} otBASE; + +#define OVERLAP_FLAVORS 6 + +typedef enum { + otFILL_normal = 0 + ,otFILL_bold + ,otFILL_color + ,otFILL_bright +} otFILL; + +#define LimitFILL() UseColors ? 4 : 2 + +typedef enum { + otDRAW_text_cross = 0 + ,otDRAW_line_box + ,otDRAW_line_cross + ,otDRAW_set_bg + ,otDRAW_reset_bg +} otDRAW; + +#define LimitDRAW() UseColors ? 5 : 3 + +typedef enum { + otCOPY_overwrite = 0 + ,otCOPY_merge + ,otCOPY_force + ,otCOPY_overlay +} otCOPY; + +#define LimitCOPY() 4 + +static void +overlap_helpitem(int state, int item, char *message) +{ + int row = (item / 2); + int col = ((item % 2) ? COLS / 2 : 0); + + move(LINES - 6 + row, col); + printw("%c%c = %s", state == row ? '>' : ' ', 'a' + item, message); + clrtoeol(); +} + +static void +overlap_test_1_attr(WINDOW *win, int flavor, int col) +{ + NCURSES_PAIRS_T cpair = (NCURSES_PAIRS_T) (1 + (flavor * 2) + col); + + switch ((otFILL) flavor) { + case otFILL_normal: + (void) wattrset(win, A_NORMAL); + break; + case otFILL_bold: + (void) wattrset(win, A_BOLD); + break; + case otFILL_color: + init_pair(cpair, COLOR_BLUE, COLOR_WHITE); + (void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_NORMAL)); + break; + case otFILL_bright: + init_pair(cpair, COLOR_WHITE, COLOR_BLUE); + (void) wattrset(win, AttrArg(COLOR_PAIR(cpair), A_BOLD)); + break; + } +} + +static void +overlap_test_2_attr(WINDOW *win, int flavor, int col) +{ + NCURSES_PAIRS_T cpair = (NCURSES_PAIRS_T) (9 + (flavor * 2) + col); + + switch ((otDRAW) flavor) { + case otDRAW_text_cross: + /* no effect */ + break; + case otDRAW_line_box: + /* no effect */ + break; + case otDRAW_line_cross: + /* no effect */ + break; + case otDRAW_set_bg: + init_pair(cpair, COLOR_RED, COLOR_GREEN); + wbkgdset(win, colored_chtype(' ', A_BLINK, cpair)); + break; + case otDRAW_reset_bg: + wbkgdset(win, ' ' | A_NORMAL); + break; + } +} + +static int +overlap_help(int state, int flavors[OVERLAP_FLAVORS]) +{ + int item; + int limit[OVERLAP_FLAVORS]; + char msg[80]; + + if (state < 0) + state += OVERLAP_FLAVORS; + state = state % OVERLAP_FLAVORS; + assert(state >= 0 && state < OVERLAP_FLAVORS); + + for (item = 0; item < (2 * OVERLAP_FLAVORS); ++item) { + int row = item / 2; + int col = item % 2; + const char *ths = col ? "B" : "A"; + const char *tht = col ? "A" : "B"; + + switch ((otBASE) row) { + case otBASE_refresh: + limit[row] = 1; + flavors[row] = 0; + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "refresh %s, then %s, then doupdate.", ths, tht); + break; + case otBASE_fill: + limit[row] = LimitFILL(); + flavors[row] %= limit[row]; + overlap_test_1_attr(stdscr, flavors[row], col); + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "fill window %s with letter %s.", ths, ths); + break; + case otBASE_draw: + limit[row] = LimitDRAW(); + flavors[row] %= limit[row]; + switch ((otDRAW) flavors[row]) { + case otDRAW_text_cross: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "cross text-pattern in window %s.", ths); + break; + case otDRAW_line_box: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "draw line-box in window %s.", ths); + break; + case otDRAW_line_cross: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "draw line-cross in window %s.", ths); + break; + case otDRAW_set_bg: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "set background of window %s.", ths); + break; + case otDRAW_reset_bg: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "reset background of window %s.", ths); + break; + } + break; + case otBASE_clear: + limit[row] = 1; + flavors[row] = 0; + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "clear window %s.", ths); + break; + case otBASE_copy: + limit[row] = LimitCOPY(); + flavors[row] %= limit[row]; + switch ((otCOPY) flavors[row]) { + case otCOPY_overwrite: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "overwrite %s onto %s.", ths, tht); + break; + case otCOPY_merge: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "copywin(FALSE) %s onto %s.", ths, tht); + break; + case otCOPY_force: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "copywin(TRUE) %s onto %s.", ths, tht); + break; + case otCOPY_overlay: + _nc_SPRINTF(msg, _nc_SLIMIT(sizeof(msg)) + "overlay %s onto %s.", ths, tht); + break; + } + break; + } + overlap_helpitem(state, item, msg); + (void) wattrset(stdscr, A_NORMAL); + wbkgdset(stdscr, ' ' | A_NORMAL); + } + move(LINES - 1, 0); + printw("^Q/ESC = terminate test. shift. Up/down/space select (row %d", + state + 1); + if (limit[state] > 1) + printw(" test %d:%d", 1 + flavors[state], limit[state]); + printw(")."); + clrtoeol(); + + return state; +} + +static void +overlap_test_0(WINDOW *a, WINDOW *b) +{ + touchwin(a); + touchwin(b); + wnoutrefresh(a); + wnoutrefresh(b); + doupdate(); +} + +static void +overlap_test_1(int flavor, int col, WINDOW *a, char fill) +{ + overlap_test_1_attr(a, flavor, col); + fillwin(a, fill); + (void) wattrset(a, A_NORMAL); +} + +static void +overlap_test_2(int flavor, int col, WINDOW *a, char fill) +{ + overlap_test_2_attr(a, flavor, col); + switch ((otDRAW) flavor) { + case otDRAW_text_cross: + crosswin(a, fill); + break; + case otDRAW_line_box: + box(a, 0, 0); + break; + case otDRAW_line_cross: + crossbox(a); + break; + case otDRAW_set_bg: + /* done in overlap_test_2_attr */ + break; + case otDRAW_reset_bg: + /* done in overlap_test_2_attr */ + break; + } +} + +static void +overlap_test_3(WINDOW *a) +{ + wclear(a); + wmove(a, 0, 0); +} + +static void +overlap_test_4(int flavor, NCURSES_CONST WINDOW *a, WINDOW *b) +{ + switch ((otCOPY) flavor) { + case otCOPY_overwrite: + overwrite(a, b); + break; + case otCOPY_merge: + copywin(a, b, 0, 0, 0, 0, getmaxy(b), getmaxx(b), FALSE); + break; + case otCOPY_force: + copywin(a, b, 0, 0, 0, 0, getmaxy(b), getmaxx(b), TRUE); + break; + case otCOPY_overlay: + overlay(a, b); + break; + } +} + +/* test effects of overlapping windows */ +static int +overlap_test(bool recur GCC_UNUSED) +{ + WINDOW *win1, *win2; + int ch; + int shift = 0, last_refresh = -1; + int state, flavor[OVERLAP_FLAVORS]; + + if ((win1 = make_overlap(0)) == 0) { + return ERR; + } else if ((win2 = make_overlap(1)) == 0) { + delwin(win1); + return ERR; + } + + curs_set(0); + raw(); + refresh(); + move(0, 0); + printw("Test wnoutrefresh() for two overlapping windows:"); + + memset(flavor, 0, sizeof(flavor)); + state = overlap_help(0, flavor); + + while (!isQuit(ch = Getchar(), TRUE)) { + switch (ch) { + case 'a': /* refresh window A first, then B */ + overlap_test_0(win1, win2); + break; + + case 'b': /* refresh window B first, then A */ + overlap_test_0(win2, win1); + break; + + case 'c': /* fill window A so it is visible */ + overlap_test_1(flavor[otBASE_fill], 0, win1, 'A'); + break; + + case 'd': /* fill window B so it is visible */ + overlap_test_1(flavor[otBASE_fill], 1, win2, 'B'); + break; + + case 'e': /* cross test pattern in window A */ + overlap_test_2(flavor[otBASE_draw], 0, win1, 'A'); + break; + + case 'f': /* cross test pattern in window A */ + overlap_test_2(flavor[otBASE_draw], 1, win2, 'B'); + break; + + case 'g': /* clear window A */ + overlap_test_3(win1); + break; + + case 'h': /* clear window B */ + overlap_test_3(win2); + break; + + case 'i': /* overwrite A onto B */ + overlap_test_4(flavor[otBASE_copy], win1, win2); + break; + + case 'j': /* overwrite B onto A */ + overlap_test_4(flavor[otBASE_copy], win2, win1); + break; + + case CTRL('n'): + case KEY_DOWN: + state = overlap_help(state + 1, flavor); + break; + + case CTRL('p'): + case KEY_UP: + state = overlap_help(state - 1, flavor); + break; + + case ' ': + flavor[state] += 1; + state = overlap_help(state, flavor); + break; + + case HELP_KEY_1: + state = overlap_help(state, flavor); + break; + + case '<': + /* FALLTHRU */ + case '>': + /* see below */ + break; + + default: + beep(); + break; + } + + switch (ch) { + case 'a': + /* FALLTHRU */ + case 'b': + last_refresh = ch; + break; + case '<': + shift -= 2; + /* FALLTHRU */ + case '>': + shift += 1; + if (move_overlap(shift, win1) != OK) { + flash(); + shift += (ch == '>') ? -1 : 1; + } else if (last_refresh > 0) { + clear_overlap(); + wnoutrefresh(stdscr); + if (last_refresh == 'a') + overlap_test_0(win1, win2); + else + overlap_test_0(win2, win1); + } + break; + default: + last_refresh = -1; + break; + } + } + + delwin(win2); + delwin(win1); + erase(); + stop_curses(); + return OK; +} + +#if USE_WIDEC_SUPPORT +static void +x_fillwin(WINDOW *win, wchar_t ch) +{ + int y, x; + int y1, x1; + + getmaxyx(win, y1, x1); + x1 /= 2; + for (y = 0; y < y1; y++) { + wmove(win, y, 0); + for (x = 0; x < x1; x++) + waddnwstr(win, &ch, 1); + } +} + +static void +x_crosswin(WINDOW *win, wchar_t ch) +{ + int y, x; + int y1, x1; + int xw = 2; + + getmaxyx(win, y1, x1); + for (y = 0; y < y1; y++) { + for (x = 0; x < x1; x += xw) { + if (InCross(x, y, x1, y1)) { + wmove(win, y, x); + waddnwstr(win, &ch, 1); + } + } + } +} + +static void +x_overlap_test_1(int flavor, int col, WINDOW *a, wchar_t fill) +{ + overlap_test_1_attr(a, flavor, col); + x_fillwin(a, fill); + (void) wattrset(a, A_NORMAL); +} + +static void +x_overlap_test_2(int flavor, int col, WINDOW *a, wchar_t fill) +{ + overlap_test_2_attr(a, flavor, col); + switch ((otDRAW) flavor) { + case otDRAW_text_cross: + x_crosswin(a, fill); + break; + case otDRAW_line_box: + box(a, 0, 0); + break; + case otDRAW_line_cross: + crossbox(a); + break; + case otDRAW_set_bg: + /* done in overlap_test_2_attr */ + break; + case otDRAW_reset_bg: + /* done in overlap_test_2_attr */ + break; + } +} + +/* test effects of overlapping windows */ +static int +x_overlap_test(bool recur GCC_UNUSED) +{ + const wchar_t WIDE_A = 0xff21; + const wchar_t WIDE_B = 0xff22; + WINDOW *win1, *win2; + int ch; + int shift = 0, last_refresh = -1; + int state, flavor[OVERLAP_FLAVORS]; + + if ((win1 = make_overlap(0)) == 0) { + return ERR; + } else if ((win2 = make_overlap(1)) == 0) { + delwin(win1); + return ERR; + } + + curs_set(0); + raw(); + refresh(); + move(0, 0); + printw("Test wnoutrefresh() for overlapping windows with double-cell characters:"); + + memset(flavor, 0, sizeof(flavor)); + state = overlap_help(0, flavor); + + while (!isQuit(ch = Getchar(), TRUE)) { + switch (ch) { + case 'a': /* refresh window A first, then B */ + overlap_test_0(win1, win2); + break; + + case 'b': /* refresh window B first, then A */ + overlap_test_0(win2, win1); + break; + + case 'c': /* fill window A so it is visible */ + x_overlap_test_1(flavor[otBASE_fill], 0, win1, WIDE_A); + break; + + case 'd': /* fill window B so it is visible */ + x_overlap_test_1(flavor[otBASE_fill], 1, win2, WIDE_B); + break; + + case 'e': /* cross test pattern in window A */ + x_overlap_test_2(flavor[otBASE_draw], 0, win1, WIDE_A); + break; + + case 'f': /* cross test pattern in window A */ + x_overlap_test_2(flavor[otBASE_draw], 1, win2, WIDE_B); + break; + + case 'g': /* clear window A */ + overlap_test_3(win1); + break; + + case 'h': /* clear window B */ + overlap_test_3(win2); + break; + + case 'i': /* overwrite A onto B */ + overlap_test_4(flavor[otBASE_copy], win1, win2); + break; + + case 'j': /* overwrite B onto A */ + overlap_test_4(flavor[otBASE_copy], win2, win1); + break; + + case CTRL('n'): + case KEY_DOWN: + state = overlap_help(state + 1, flavor); + break; + + case CTRL('p'): + case KEY_UP: + state = overlap_help(state - 1, flavor); + break; + + case ' ': + flavor[state] += 1; + state = overlap_help(state, flavor); + break; + + case HELP_KEY_1: + state = overlap_help(state, flavor); + break; + + case '<': + /* FALLTHRU */ + case '>': + /* see below */ + break; + + default: + beep(); + break; + } + + switch (ch) { + case 'a': + /* FALLTHRU */ + case 'b': + last_refresh = ch; + break; + case '<': + shift -= 2; + /* FALLTHRU */ + case '>': + shift += 1; + if (move_overlap(shift, win1) != OK) { + flash(); + shift += (ch == '>') ? -1 : 1; + } else if (last_refresh > 0) { + clear_overlap(); + wnoutrefresh(stdscr); + if (last_refresh == 'a') + overlap_test_0(win1, win2); + else + overlap_test_0(win2, win1); + } + break; + default: + last_refresh = -1; + break; + } + } + + delwin(win2); + delwin(win1); + erase(); + stop_curses(); + return OK; +} +#endif /* USE_WIDEC_SUPPORT */ + +#endif /* HAVE_COPYWIN */ + +static void +show_setting_name(const char *name) +{ + printw("%-25s ", name); +} + +static void +show_string_setting(const char *name, const char *value) +{ + show_setting_name(name); + if (value) { + printw("\"%s\"", value); + } else { + attron(A_REVERSE); + addstr(""); + attroff(A_REVERSE); + } + AddCh('\n'); +} + +static void +show_number_setting(const char *name, int value) +{ + show_setting_name(name); + if (value >= 0) { + printw("%d", value); + } else { + attron(A_REVERSE); + printw("%d", value); + attroff(A_REVERSE); + } + AddCh('\n'); +} + +static void +show_boolean_setting(const char *name, int value) +{ + show_setting_name(name); + if (value >= 0) { + printw("%s", value ? "TRUE" : "FALSE"); + } else { + attron(A_REVERSE); + printw("%d", value); + attroff(A_REVERSE); + } + AddCh('\n'); +} + +static int +settings_test(bool recur GCC_UNUSED) +{ +#if USE_WIDEC_SUPPORT + wchar_t ch; +#endif + + move(0, 0); + show_string_setting("termname", termname()); + show_string_setting("longname", longname()); + show_number_setting("baudrate", baudrate()); + if (erasechar() > 0) { + show_string_setting("unctrl(erasechar)", unctrl((chtype) erasechar())); + show_string_setting("keyname(erasechar)", keyname(erasechar())); + } + if (killchar() > 0) { + show_string_setting("unctrl(killchar)", unctrl((chtype) killchar())); + show_string_setting("keyname(killchar)", keyname(killchar())); + } +#if USE_WIDEC_SUPPORT + if (erasewchar(&ch) == OK) { + show_string_setting("key_name(erasewchar)", key_name(ch)); + } + if (killwchar(&ch) == OK) { + show_string_setting("key_name(killwchar)", key_name(ch)); + } +#endif + show_boolean_setting("has_ic", has_ic()); + show_boolean_setting("has_il", has_il()); + show_boolean_setting("has_colors", has_colors()); +#if HAVE_COLOR_CONTENT + show_boolean_setting("can_change_color", can_change_color()); +#endif + show_setting_name("LINES"); + printw("%d\n", LINES); + show_setting_name("COLS"); + printw("%d\n", COLS); + Pause(); + erase(); + stop_curses(); + return OK; +} + +/**************************************************************************** + * + * Main sequence + * + ****************************************************************************/ + +static void +usage(int ok) +{ + static const char *const tbl[] = + { + "Usage: ncurses [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#ifdef NCURSES_VERSION + ," -a f,b set default-colors (assumed white-on-black)" + ," -d use default-colors if terminal supports them" +#endif +#if HAVE_USE_ENV + ," -E call use_env(FALSE) to ignore $LINES and $COLUMNS" +#endif +#if USE_SOFTKEYS + ," -e fmt specify format for soft-keys test (e)" +#endif +#if HAVE_RIPOFFLINE + ," -F rip-off footer line (can repeat)" + ," -H rip-off header line (can repeat)" +#endif + ," -m do not use colors" +#if HAVE_COLOR_CONTENT + ," -p file rgb values to use in 'd' rather than ncurses's builtin" +#endif +#if USE_LIBPANEL + ," -s msec specify nominal time for panel-demo (default: 1, to hold)" +#endif +#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS) + ," -T call use_tioctl(TRUE) to allow SIGWINCH to override environment" +#endif +#ifdef TRACE + ," -t mask specify default trace-level (may toggle with ^T)" +#endif +#if HAVE_COLOR_CONTENT + ," -x use xterm-compatible control for reading color palette" +#endif + }; + size_t n; + for (n = 0; n < SIZEOF(tbl); n++) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} + +static void +set_terminal_modes(void) +{ + noraw(); + cbreak(); + noecho(); + scrollok(stdscr, TRUE); + idlok(stdscr, TRUE); + keypad(stdscr, TRUE); +} + +#ifdef SIGUSR1 +static void +announce_sig(int sig) +{ + (void) fprintf(stderr, "Handled signal %d\r\n", sig); +} +#endif + +#if HAVE_RIPOFFLINE +static int +rip_footer(WINDOW *win, int cols) +{ + wbkgd(win, A_REVERSE); + werase(win); + wmove(win, 0, 0); + wprintw(win, "footer: window %p, %d columns", (void *) win, cols); + wnoutrefresh(win); + return OK; +} + +static int +rip_header(WINDOW *win, int cols) +{ + wbkgd(win, A_REVERSE); + werase(win); + wmove(win, 0, 0); + wprintw(win, "header: window %p, %d columns", (void *) win, cols); + wnoutrefresh(win); + return OK; +} +#endif /* HAVE_RIPOFFLINE */ + +static void +main_menu(bool top) +{ +#if USE_WIDEC_SUPPORT + typedef struct { + bool recur; + int (*narrow_func) (bool); + int (*wide_func) (bool); + int code; + const char *help; + } MyCmds; +#define BOTH(a) a, x_ ## a +#define ONLY(a) a, NULL +#define CMDS(recur, funcs,code,help) { recur, funcs, code, help } +#else + typedef struct { + bool recur; + int (*narrow_func) (bool); + int code; + const char *help; + } MyCmds; +#define BOTH(a) a +#define ONLY(a) a +#define CMDS(recur, funcs,code,help) { recur, funcs, code, help } +#endif + /* *INDENT-OFF* */ + static MyCmds cmds[] = + { + CMDS(TRUE, BOTH(getch_test), 'a', "keyboard and mouse input test"), + CMDS(TRUE, BOTH(attr_test), 'b', "character attribute test"), + CMDS(TRUE, BOTH(color_test), 'c', "color test pattern"), +#if HAVE_COLOR_CONTENT + CMDS(FALSE, ONLY(color_edit), 'd', "edit RGB color values"), +#endif +#if USE_SOFTKEYS + CMDS(TRUE, BOTH(slk_test), 'e', "exercise soft keys"), +#endif + CMDS(TRUE, BOTH(acs_test), 'f', "display ACS characters"), + CMDS(TRUE, ONLY(scroll_test), 'g', "display windows and scrolling"), + CMDS(TRUE, ONLY(flushinp_test), 'i', "test flushinp()"), + CMDS(TRUE, ONLY(sgr_attr_test), 'k', "display character attributes"), +#if USE_LIBMENU + CMDS(TRUE, ONLY(menu_test), 'm', "exercise menu library"), +#endif +#if USE_LIBPANEL + CMDS(TRUE, BOTH(panel_test), 'o', "exercise panel library"), +#endif +#if HAVE_NEWPAD + CMDS(TRUE, ONLY(pad_test), 'p', "exercise pad features"), +#endif + CMDS(TRUE, ONLY(NULL), 'q', "quit"), +#if USE_LIBMENU + CMDS(TRUE, ONLY(form_test), 'r', "exercise form library"), +#endif +#if HAVE_COPYWIN + CMDS(TRUE, BOTH(overlap_test), 's', "overlapping-refresh test"), +#endif +#if USE_LIBMENU && defined(TRACE) + CMDS(TRUE, ONLY(trace_set), 't', "set trace level"), +#endif + CMDS(TRUE, ONLY(settings_test), 'v', "show terminal name and settings"), + CMDS(FALSE, ONLY(NULL), '?', "repeat this command summary") + }; + /* *INDENT-ON* */ + + int (*doit) (bool); + char command; + unsigned n; + do { + printf("This is the ncurses main menu (uppercase for wide-characters)\n"); + for (n = 0; n < SIZEOF(cmds); ++n) { + if (top || cmds[n].recur) { + putchar(' '); +#if USE_WIDEC_SUPPORT + if (cmds[n].wide_func) { + printf("%c,", toupper(cmds[n].code)); + } +#endif + printf("%c\t= %s\n", cmds[n].code, cmds[n].help); + } + } + + (void) fputs("> ", stdout); + (void) fflush(stdout); /* necessary under SVr4 curses */ + + /* + * This used to be an 'fgets()' call (until 1996/10). However with + * some runtime libraries, mixing stream I/O and 'read()' causes the + * input stream to be flushed when switching between the two. + */ + command = 0; + for (;;) { + char ch = '\0'; + if (read(fileno(stdin), &ch, (size_t) 1) <= 0) { + int save_err = errno; + perror("\nOOPS"); + if (save_err == EINTR) { + clearerr(stdin); + continue; + } else if (command == 0) { + command = 'q'; + } + break; + } else if (command == 0 && !isspace(UChar(ch))) { + command = ch; + } else if (ch == '\n' || ch == '\r') { + if ((command == 'd') && !top) { + (void) fputs("Do not nest test-d\n", stdout); + command = 0; + } + if (command != 0) + break; + (void) fputs("> ", stdout); + (void) fflush(stdout); + } + } + + doit = NULL; + for (n = 0; n < SIZEOF(cmds); ++n) { + if (cmds[n].code == command) { + doit = cmds[n].narrow_func; + break; + } +#if USE_WIDEC_SUPPORT + if (toupper(cmds[n].code) == command) { + doit = cmds[n].wide_func; + break; + } +#endif + } + + if (doit != NULL && doit(FALSE) == OK) { + /* + * This may be overkill; it is intended to reset everything back + * to the initial terminal modes so that tests don't get in + * each other's way. + */ + flushinp(); + set_terminal_modes(); + reset_prog_mode(); + clear(); + refresh(); + endwin(); + if (command == '?') { + (void) puts("This is the ncurses capability tester."); + (void) + puts("You may select a test from the main menu by typing the"); + (void) + puts("key letter of the choice (the letter to left of the =)"); + (void) + puts("at the > prompt. Type `q' to exit."); + } + continue; + } + } while + (command != 'q'); +} + +/*+------------------------------------------------------------------------- + main(argc,argv) +--------------------------------------------------------------------------*/ +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int my_e_param = 1; +#ifdef NCURSES_VERSION_PATCH +#if HAVE_USE_DEFAULT_COLORS + int default_fg = COLOR_WHITE; + int default_bg = COLOR_BLACK; + bool default_colors = FALSE; +#if HAVE_ASSUME_DEFAULT_COLORS + bool assumed_colors = FALSE; +#endif +#endif +#endif + bool monochrome = FALSE; +#if HAVE_COLOR_CONTENT + bool xterm_colors = FALSE; + NCURSES_CONST char *palette_file = 0; +#endif + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "a:dEe:FHmp:s:Tt:x")) != -1) { + switch (ch) { +#ifdef NCURSES_VERSION_PATCH +#if HAVE_USE_DEFAULT_COLORS +#if HAVE_ASSUME_DEFAULT_COLORS + case 'a': + assumed_colors = TRUE; + switch (sscanf(optarg, "%d,%d", &default_fg, &default_bg)) { + case 0: + default_fg = COLOR_WHITE; + /* FALLTHRU */ + case 1: + default_bg = COLOR_BLACK; + break; + } + break; +#endif + case 'd': + default_colors = TRUE; + break; +#endif +#endif +#if HAVE_USE_ENV + case 'E': + use_env(FALSE); + break; +#endif + case 'e': + my_e_param = atoi(optarg); +#ifdef NCURSES_VERSION + if (my_e_param > 3) /* allow extended layouts */ + usage(FALSE); +#else + if (my_e_param > 1) + usage(FALSE); +#endif + break; +#if HAVE_RIPOFFLINE + case 'F': + ripoffline(-1, rip_footer); + break; + case 'H': + ripoffline(1, rip_header); + break; +#endif /* HAVE_RIPOFFLINE */ + case 'm': + monochrome = TRUE; + break; +#if HAVE_COLOR_CONTENT + case 'p': + palette_file = optarg; + break; +#endif +#if USE_LIBPANEL + case 's': + nap_msec = (int) atol(optarg); + break; +#endif +#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS) + case 'T': + use_tioctl(TRUE); + break; +#endif +#ifdef TRACE + case 't': + save_trace = (unsigned) strtol(optarg, 0, 0); + break; +#endif +#if HAVE_COLOR_CONTENT + case 'x': + xterm_colors = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + /* + * If there's no menus (unlikely for ncurses!), then we'll have to set + * tracing on initially, just in case the user wants to test something that + * doesn't involve wGetchar. + */ +#ifdef TRACE + /* enable debugging */ +#if !USE_LIBMENU + curses_trace(save_trace); +#else + if (!isatty(fileno(stdin))) + curses_trace(save_trace); +#endif /* USE_LIBMENU */ +#endif /* TRACE */ + +#if USE_SOFTKEYS + /* tell it we're going to play with soft keys */ + slk_init(my_e_param); +#endif + +#ifdef SIGUSR1 + /* set up null signal catcher so we can see what interrupts to getch do */ + signal(SIGUSR1, announce_sig); +#endif + + /* we must initialize the curses data structure only once */ + initscr(); + bkgdset(BLANK); + + set_terminal_modes(); + def_prog_mode(); + + /* tests, in general, will want these modes */ + UseColors = (bool) (monochrome ? FALSE : has_colors()); + + if (UseColors) { + start_color(); +#ifdef NCURSES_VERSION_PATCH + MaxColors = COLORS; /* was > 16 ? 16 : COLORS */ +#if HAVE_USE_DEFAULT_COLORS + if (default_colors) { + use_default_colors(); + MinColors = -1; + } +#if HAVE_ASSUME_DEFAULT_COLORS + if (assumed_colors) + assume_default_colors(default_fg, default_bg); +#endif +#endif +#else /* normal SVr4 curses */ + MaxColors = COLORS; /* was > 8 ? 8 : COLORS */ +#endif + max_pairs = COLOR_PAIRS; /* was > 256 ? 256 : COLOR_PAIRS */ + +#if HAVE_COLOR_CONTENT + if (can_change_color()) { + init_all_colors(xterm_colors, palette_file); + } +#endif + } + + /* + * Return to terminal mode, so we're guaranteed of being able to + * select terminal commands even if the capabilities are wrong. + */ + endwin(); + +#if HAVE_CURSES_VERSION + (void) printf("Welcome to %s. Press ? for help.\n", curses_version()); +#elif defined(NCURSES_VERSION_MAJOR) && defined(NCURSES_VERSION_MINOR) && defined(NCURSES_VERSION_PATCH) + (void) printf("Welcome to ncurses %d.%d.%d. Press ? for help.\n", + NCURSES_VERSION_MAJOR, + NCURSES_VERSION_MINOR, + NCURSES_VERSION_PATCH); +#else + (void) puts("Welcome to ncurses. Press ? for help."); +#endif + + main_menu(TRUE); + + ExitProgram(EXIT_SUCCESS); +} + +/* ncurses.c ends here */ diff --git a/contrib/ncurses/test/ncurses_tst.hin b/contrib/ncurses/test/ncurses_tst.hin new file mode 100644 index 00000000..238fc220 --- /dev/null +++ b/contrib/ncurses/test/ncurses_tst.hin @@ -0,0 +1,57 @@ +/**************************************************************************** + * Copyright 2020 Thomas E. Dickey * + * Copyright 1998 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1998 * + ****************************************************************************/ +/* + * $Id: ncurses_tst.hin,v 1.3 2020/02/02 23:34:34 tom Exp $ + * + * This is a template-file used to generate the "ncurses_cfg.h" file. + * + * Rather than list every definition, the configuration script substitutes + * the definitions that it finds using 'sed'. You need a patch (971222) + * to autoconf 2.12 to do this. + */ +#ifndef NC_CONFIG_H +#define NC_CONFIG_H +@DEFS@ + + /* The C compiler may not treat these properly but C++ has to */ +#ifdef __cplusplus +#undef const +#undef inline +#else +#if defined(lint) || defined(TRACE) +#undef inline +#define inline /* nothing */ +#endif +#endif + +#endif /* NC_CONFIG_H */ diff --git a/contrib/ncurses/test/newdemo.c b/contrib/ncurses/test/newdemo.c new file mode 100644 index 00000000..78761534 --- /dev/null +++ b/contrib/ncurses/test/newdemo.c @@ -0,0 +1,401 @@ +/* + * newdemo.c - A demo program using PDCurses. The program illustrate + * the use of colours for text output. + * + * $Id: newdemo.c,v 1.48 2022/12/10 23:36:05 tom Exp $ + */ + +#include + +#include + +/* + * The Australian map + */ +static CONST_MENUS char *AusMap[16] = +{ + " A A ", + " N.T. AAAAA AAAA ", + " AAAAAAAAAAA AAAAAAAA ", + " AAAAAAAAAAAAAAAAAAAAAAAAA Qld.", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ", + " AAAAAAAAAAAAAAAAAAAAAAAAAAAA ", + " AAAAAAAAAAAAAAAAAAAAAAAAA N.S.W.", + "W.A. AAAAAAAAA AAAAAA Vic.", + " AAA S.A. AA", + " A Tas.", + "" +}; + +/* + * Funny messages + */ +#define NMESSAGES 6 + +static const char *messages[] = +{ + "Hello from the Land Down Under", + "The Land of crocs. and a big Red Rock", + "Where the sunflower runs along the highways", + "the dusty red roads lead one to loneliness", + "Blue sky in the morning and", + "freezing nights and twinkling stars", + "" +}; + +/* + * Trap interrupt + */ +static void +trap(int sig GCC_UNUSED) +{ + stop_curses(); + ExitProgram(EXIT_FAILURE); +} + +/* + * Wait for user + */ +static int +WaitForUser(WINDOW *win) +{ + time_t t; + + nodelay(win, TRUE); + t = time((time_t *) 0); + + while (1) { + chtype key; + if ((int) (key = (chtype) wgetch(win)) != ERR) { + if (key == 'q' || key == 'Q') + return 1; + else + return 0; + } + if (time((time_t *) 0) - t > 5) + return 0; + } +} + +static void +set_colors(WINDOW *win, int pair, int foreground, int background) +{ + if (has_colors()) { + if (pair > COLOR_PAIRS) + pair = COLOR_PAIRS; + init_pair((short) pair, (short) foreground, (short) background); + (void) wattrset(win, AttrArg(COLOR_PAIR(pair), 0)); + } +} + +static chtype +use_colors(WINDOW *win, int pair, chtype attrs) +{ + if (has_colors()) { + if (pair > COLOR_PAIRS) + pair = COLOR_PAIRS; + attrs |= (chtype) COLOR_PAIR(pair); + } + (void) wattrset(win, AttrArg(attrs, 0)); + return attrs; +} + +/* + * Test sub windows + */ +static int +SubWinTest(WINDOW *win) +{ + int w, h, sw, sh, bx, by; + WINDOW *swin1, *swin2, *swin3; + + getmaxyx(win, h, w); + getbegyx(win, by, bx); + sw = w / 3; + sh = h / 3; + + if ((swin1 = subwin(win, sh, sw, by + 3, bx + 5)) == NULL) { + return 1; + } + if ((swin2 = subwin(win, sh, sw, by + 4, bx + 8)) == NULL) { + delwin(swin1); + return 1; + } + if ((swin3 = subwin(win, sh, sw, by + 5, bx + 11)) == NULL) { + delwin(swin1); + delwin(swin2); + return 1; + } + + set_colors(swin1, 8, COLOR_RED, COLOR_BLUE); + werase(swin1); + MvWAddStr(swin1, 0, 3, "Sub-window 1"); + wrefresh(swin1); + + set_colors(swin2, 9, COLOR_CYAN, COLOR_MAGENTA); + werase(swin2); + MvWAddStr(swin2, 0, 3, "Sub-window 2"); + wrefresh(swin2); + + set_colors(swin3, 10, COLOR_YELLOW, COLOR_GREEN); + werase(swin3); + MvWAddStr(swin3, 0, 3, "Sub-window 3"); + wrefresh(swin3); + + delwin(swin1); + delwin(swin2); + delwin(swin3); + WaitForUser(win); + return 0; +} + +static int +bounce(int n, int *dir, int len) +{ + if (*dir > 0) + ++n; + else + --n; + if (n <= 1 || n >= len - 2) + *dir = *dir ? 0 : 1; + return n; +} + +/* + * Bouncing balls + */ +static int +BouncingBalls(WINDOW *win) +{ + int w, h; + int x1, y1, xd1, yd1; + int x2, y2, xd2, yd2; + int x3, y3, xd3, yd3; + + getmaxyx(win, h, w); + + x1 = 2 + rand() % (w - 4); + y1 = 2 + rand() % (h - 4); + x2 = 2 + rand() % (w - 4); + y2 = 2 + rand() % (h - 4); + x3 = 2 + rand() % (w - 4); + y3 = 2 + rand() % (h - 4); + + xd1 = 1; + yd1 = 1; + xd2 = 1; + yd2 = 0; + xd3 = 0; + yd3 = 1; + + nodelay(win, TRUE); + + while (wgetch(win) == ERR) { + x1 = bounce(x1, &xd1, w); + y1 = bounce(y1, &yd1, h); + x2 = bounce(x2, &xd2, w); + y2 = bounce(y2, &yd2, h); + x3 = bounce(x3, &xd3, w); + y3 = bounce(y3, &yd3, h); + + set_colors(win, 11, COLOR_RED, COLOR_BLUE); + MvWAddCh(win, y1, x1, 'O'); + + set_colors(win, 12, COLOR_BLUE, COLOR_RED); + MvWAddCh(win, y2, x2, '*'); + + set_colors(win, 13, COLOR_YELLOW, COLOR_WHITE); + MvWAddCh(win, y3, x3, '@'); + + wmove(win, 0, 0); + wrefresh(win); + delay_output(100); + } + return 0; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: newdemo [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +/* + * Main driver + */ +int +main(int argc, char *argv[]) +{ + WINDOW *win; + int x, y, i, k; + char buffer[SIZEOF(messages) * 80]; + int width, height; + chtype save[80]; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + InitAndCatch(initscr(), trap); + if (has_colors()) + start_color(); + cbreak(); + curs_set(0); + width = 48; + height = 14; /* Create a drawing window */ + win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2); + if (win == NULL) { + stop_curses(); + ExitProgram(EXIT_FAILURE); + } + + while (1) { + int w; + int j; + chtype c; + const char *message; + + set_colors(win, 1, COLOR_WHITE, COLOR_BLUE); + werase(win); + + set_colors(win, 2, COLOR_RED, COLOR_RED); + box(win, ACS_VLINE, ACS_HLINE); + wrefresh(win); + /* Do ramdom output of a character */ + use_colors(win, 1, A_NORMAL); + c = 'a'; + for (i = 0; i < 5000; ++i) { + x = rand() % (width - 2) + 1; + y = rand() % (height - 2) + 1; + MvWAddCh(win, y, x, c); + wrefresh(win); + nodelay(win, TRUE); + if (wgetch(win) != ERR) + break; + if (i == 2000) { + c = 'b'; + set_colors(win, 3, COLOR_CYAN, COLOR_YELLOW); + } + } + + SubWinTest(win); + /* Erase and draw green window */ + set_colors(win, 4, COLOR_YELLOW, COLOR_GREEN); + wbkgd(win, use_colors(win, 4, A_BOLD)); + werase(win); + wrefresh(win); + /* Draw RED bounding box */ + use_colors(win, 2, A_NORMAL); + box(win, ' ', ' '); + wrefresh(win); + /* Display Australia map */ + use_colors(win, 4, A_BOLD); + i = 0; + while (*AusMap[i]) { + MvWAddStr(win, i + 1, 8, AusMap[i]); + wrefresh(win); + delay_output(50); + ++i; + } + + set_colors(win, 5, COLOR_BLUE, COLOR_WHITE); + use_colors(win, 5, A_BLINK); + MvWAddStr(win, height - 2, 6, " PDCurses 2.1 for DOS, OS/2 and Unix"); + wrefresh(win); + + /* Draw running messages */ + set_colors(win, 6, COLOR_YELLOW, COLOR_WHITE); + message = messages[j = 0]; + i = 1; + w = width - 2; + _nc_STRCPY(buffer, message, sizeof(buffer)); + while (j < NMESSAGES) { + while ((int) strlen(buffer) < w) { + _nc_STRCAT(buffer, " ... ", sizeof(buffer)); + _nc_STRCAT(buffer, messages[++j % NMESSAGES], sizeof(buffer)); + } + + if (i < w) + (void) mvwaddnstr(win, height / 2, w - i, buffer, i); + else + (void) mvwaddnstr(win, height / 2, 1, buffer, w); + + wrefresh(win); + nodelay(win, TRUE); + if (wgetch(win) != ERR) { + flushinp(); + break; + } + if (i++ >= w) { + for (k = 0; (buffer[k] = buffer[k + 1]) != '\0'; k++) ; + } + delay_output(100); + } + + j = 0; + /* Draw running As across in RED */ + set_colors(win, 7, COLOR_RED, COLOR_GREEN); + memset(save, ' ', sizeof(save)); + for (i = 2; i < width - 4; ++i) { + k = (int) mvwinch(win, 4, i); + if (k == ERR) + break; + save[j++] = c = (chtype) k; + c &= A_CHARTEXT; + MvWAddCh(win, 4, i, c); + } + wrefresh(win); + + /* Put a message up wait for a key */ + i = height - 2; + use_colors(win, 5, A_NORMAL); + MvWAddStr(win, i, 5, " Type a key to continue or 'Q' to quit "); + wrefresh(win); + + if (WaitForUser(win) == 1) + break; + + j = 0; /* Restore the old line */ + for (i = 2; i < width - 4; ++i) + MvWAddCh(win, 4, i, save[j++]); + wrefresh(win); + + BouncingBalls(win); + /* Put a message up wait for a key */ + i = height - 2; + use_colors(win, 5, A_NORMAL); + MvWAddStr(win, i, 5, " Type a key to continue or 'Q' to quit "); + wrefresh(win); + if (WaitForUser(win) == 1) + break; + } + stop_curses(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/package/debian-mingw/compat b/contrib/ncurses/test/package/debian-mingw/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/test/package/debian-mingw/control b/contrib/ncurses/test/package/debian-mingw/control new file mode 100644 index 00000000..116103d2 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/control @@ -0,0 +1,18 @@ +Source: ncurses-examples +Maintainer: Thomas E. Dickey +Section: misc +Priority: optional +Standards-Version: 4.6.1.0 +Build-Depends: debhelper (>= 5) +Homepage: https://invisible-island.net/ncurses/ncurses-examples.html + +Package: mingw32-ncurses-examples +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: example/test programs from ncurses + These are the example/test programs from the ncurses distribution. + . + This package is used for testing ABI 6 with the MinGW 32-bit port. + . + This package installs in "bin/ncurses-examples" to avoid conflict with other + packages. diff --git a/contrib/ncurses/test/package/debian-mingw/copyright b/contrib/ncurses/test/package/debian-mingw/copyright new file mode 100644 index 00000000..7546e1cc --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/copyright @@ -0,0 +1,79 @@ +Upstream source https://invisible-island.net/ncurses/ncurses-examples.html + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 2003-2023,2024 by Thomas E. Dickey +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + + FSF changes to this file are in the public domain. + + Calling this script install-sh is preferred over install.sh, to prevent + `make' implicit rules from creating a file called install from it + when there is no Makefile. + + This script is compatible with the BSD install script, but was written + from scratch. It can only install one file at a time, a restriction + shared with many OS's install programs. + +On Debian systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL-2' + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/test/package/debian-mingw/docs b/contrib/ncurses/test/package/debian-mingw/docs new file mode 100644 index 00000000..e845566c --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/docs @@ -0,0 +1 @@ +README diff --git a/contrib/ncurses/test/package/debian-mingw/rules b/contrib/ncurses/test/package/debian-mingw/rules new file mode 100755 index 00000000..3a791507 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/rules @@ -0,0 +1,101 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +NCURSES_PKG = ncurses-examples + +TARGET = i686-w64-mingw32 +MINGW_BIN = /usr/bin +MINGW_TOP = /usr/$(TARGET) +MINGW_TMP = $(CURDIR)/debian/mingw32-ncurses-examples + +CFLAGS = $(CC_NORMAL) + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + + +configure: configure-stamp +configure-stamp: + dh_testdir + + CFLAGS="$(CFLAGS)" ./configure \ + --host=$(TARGET) \ + --target=$(TARGET) \ + --prefix=$(MINGW_TOP) \ + --bindir=\$${prefix}/bin/$(NCURSES_PKG) \ + --datadir=\$${prefix}/share/$(NCURSES_PKG) \ + --with-screen=ncursesw6td \ + --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f makefile ] || $(MAKE) distclean + + rm -f configure-stamp build-stamp install-stamp + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_prep + dh_installdirs + + $(MAKE) install DESTDIR=$(MINGW_TMP) + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# No binary-indep target. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installexamples + dh_installchangelogs NEWS + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/contrib/ncurses/test/package/debian-mingw/source/format b/contrib/ncurses/test/package/debian-mingw/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/test/package/debian-mingw/watch b/contrib/ncurses/test/package/debian-mingw/watch new file mode 100644 index 00000000..c35c8e38 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \ + debian uupdate diff --git a/contrib/ncurses/test/package/debian-mingw64/compat b/contrib/ncurses/test/package/debian-mingw64/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/test/package/debian-mingw64/control b/contrib/ncurses/test/package/debian-mingw64/control new file mode 100644 index 00000000..df942b75 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/control @@ -0,0 +1,18 @@ +Source: ncurses-examples +Maintainer: Thomas E. Dickey +Section: misc +Priority: optional +Standards-Version: 4.6.1.0 +Build-Depends: debhelper (>= 5) +Homepage: https://invisible-island.net/ncurses/ncurses-examples.html + +Package: mingw64-ncurses-examples +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: example/test programs from ncurses + These are the example/test programs from the ncurses distribution. + . + This package is used for testing ABI 6 with the MinGW 64-bit port. + . + This package installs in "bin/ncurses-examples" to avoid conflict with other + packages. diff --git a/contrib/ncurses/test/package/debian-mingw64/copyright b/contrib/ncurses/test/package/debian-mingw64/copyright new file mode 100644 index 00000000..7546e1cc --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/copyright @@ -0,0 +1,79 @@ +Upstream source https://invisible-island.net/ncurses/ncurses-examples.html + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 2003-2023,2024 by Thomas E. Dickey +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + + FSF changes to this file are in the public domain. + + Calling this script install-sh is preferred over install.sh, to prevent + `make' implicit rules from creating a file called install from it + when there is no Makefile. + + This script is compatible with the BSD install script, but was written + from scratch. It can only install one file at a time, a restriction + shared with many OS's install programs. + +On Debian systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL-2' + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/test/package/debian-mingw64/docs b/contrib/ncurses/test/package/debian-mingw64/docs new file mode 100644 index 00000000..e845566c --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/docs @@ -0,0 +1 @@ +README diff --git a/contrib/ncurses/test/package/debian-mingw64/rules b/contrib/ncurses/test/package/debian-mingw64/rules new file mode 100755 index 00000000..571b9a7e --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/rules @@ -0,0 +1,101 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CC_NORMAL = -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +CC_STRICT = $(CC_NORMAL) -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +NCURSES_PKG = ncurses-examples + +TARGET = x86_64-w64-mingw32 +MINGW_BIN = /usr/bin +MINGW_TOP = /usr/$(TARGET) +MINGW_TMP = $(CURDIR)/debian/mingw64-ncurses-examples + +CFLAGS = $(CC_NORMAL) + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + + +configure: configure-stamp +configure-stamp: + dh_testdir + + CFLAGS="$(CFLAGS)" ./configure \ + --host=$(TARGET) \ + --target=$(TARGET) \ + --prefix=$(MINGW_TOP) \ + --bindir=\$${prefix}/bin/$(NCURSES_PKG) \ + --datadir=\$${prefix}/share/$(NCURSES_PKG) \ + --with-screen=ncursesw6td \ + --with-pkg-config-libdir=/usr/$(TARGET)/lib/pkgconfig + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f makefile ] || $(MAKE) distclean + + rm -f configure-stamp build-stamp install-stamp + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_prep + dh_installdirs + + $(MAKE) install DESTDIR=$(MINGW_TMP) + + touch install-stamp + +# Build architecture-independent files here. +binary-indep: build install +# No binary-indep target. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installdocs + dh_installexamples + dh_installchangelogs NEWS + dh_strip + dh_compress + dh_fixperms + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/contrib/ncurses/test/package/debian-mingw64/source/format b/contrib/ncurses/test/package/debian-mingw64/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/test/package/debian-mingw64/watch b/contrib/ncurses/test/package/debian-mingw64/watch new file mode 100644 index 00000000..c35c8e38 --- /dev/null +++ b/contrib/ncurses/test/package/debian-mingw64/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \ + debian uupdate diff --git a/contrib/ncurses/test/package/debian/compat b/contrib/ncurses/test/package/debian/compat new file mode 100644 index 00000000..48082f72 --- /dev/null +++ b/contrib/ncurses/test/package/debian/compat @@ -0,0 +1 @@ +12 diff --git a/contrib/ncurses/test/package/debian/control b/contrib/ncurses/test/package/debian/control new file mode 100644 index 00000000..89de1b8c --- /dev/null +++ b/contrib/ncurses/test/package/debian/control @@ -0,0 +1,26 @@ +Source: ncurses-examples +Maintainer: Thomas E. Dickey +Section: misc +Priority: optional +Standards-Version: 4.6.1.0 +Build-Depends: debhelper (>= 5) +Homepage: https://invisible-island.net/ncurses/ncurses-examples.html + +Package: ncurses-examples +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: example/test programs from ncurses + These are the example/test programs from the ncurses distribution. + . + This package installs in "bin/ncurses-examples" to avoid conflict with other + packages. + +Package: ncursest-examples +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: example/test programs from ncurses + These are the example/test programs from the ncurses distribution, using + the thread configuration. + . + This package installs in "bin/ncursest-examples" to avoid conflict with other + packages. diff --git a/contrib/ncurses/test/package/debian/copyright b/contrib/ncurses/test/package/debian/copyright new file mode 100644 index 00000000..7546e1cc --- /dev/null +++ b/contrib/ncurses/test/package/debian/copyright @@ -0,0 +1,79 @@ +Upstream source https://invisible-island.net/ncurses/ncurses-examples.html + +Current ncurses maintainer: Thomas Dickey + +------------------------------------------------------------------------------- +Files: * +Copyright: 2017-2023,2024 Thomas E. Dickey +Copyright: 1998-2016,2017 Free Software Foundation, Inc. +License: X11 + +Files: aclocal.m4 package +Copyright: 2003-2023,2024 by Thomas E. Dickey +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, distribute with modifications, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR + THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name(s) of the above copyright + holders shall not be used in advertising or otherwise to promote the + sale, use or other dealings in this Software without prior written + authorization. + +------------------------------------------------------------------------------- +Files: install-sh +Copyright: 1994 X Consortium +License: X11 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- + TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of the X Consortium shall not + be used in advertising or otherwise to promote the sale, use or other deal- + ings in this Software without prior written authorization from the X Consor- + tium. + + FSF changes to this file are in the public domain. + + Calling this script install-sh is preferred over install.sh, to prevent + `make' implicit rules from creating a file called install from it + when there is no Makefile. + + This script is compatible with the BSD install script, but was written + from scratch. It can only install one file at a time, a restriction + shared with many OS's install programs. + +On Debian systems, the complete text of the GNU General +Public License can be found in '/usr/share/common-licenses/GPL-2' + +-- vile: txtmode file-encoding=utf-8 diff --git a/contrib/ncurses/test/package/debian/docs b/contrib/ncurses/test/package/debian/docs new file mode 100644 index 00000000..e845566c --- /dev/null +++ b/contrib/ncurses/test/package/debian/docs @@ -0,0 +1 @@ +README diff --git a/contrib/ncurses/test/package/debian/rules b/contrib/ncurses/test/package/debian/rules new file mode 100755 index 00000000..842e5858 --- /dev/null +++ b/contrib/ncurses/test/package/debian/rules @@ -0,0 +1,167 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# packages +NCURSES_PKG = ncurses-examples +NCURSEST_PKG = ncursest-examples + +PACKAGES.indep = # ncurses-examples-docs +PACKAGES.arch = $(NCURSES_PKG) $(NCURSEST_PKG) + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +CFLAGS = $(shell dpkg-buildflags --get CFLAGS) +CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS) +LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS) + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +verbose = # -v + +configure = \ + CFLAGS="$(CFLAGS)" \ + CPPFLAGS="$(CPPFLAGS)" \ + LDFLAGS="$(LDFLAGS)" ../../configure \ + --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --prefix=/usr \ + --disable-rpath-hack + +.PHONY: all config build install binary clean config-indep config-arch \ + build-indep build-arch install-indep install-arch binary-indep \ + binary-arch + +all: build + +config: config-indep config-arch +build: build-indep build-arch +install: install-indep install-arch +binary: binary-indep binary-arch +clean: + dh_testdir + dh_testroot + dh_clean $(verbose) + rm -rf t + +config-indep: $(PACKAGES.indep:%=config-%-stamp) +config-arch: $(PACKAGES.arch:%=config-%-stamp) + +build-indep: $(PACKAGES.indep:%=build-%-stamp) +build-arch: $(PACKAGES.arch:%=build-%-stamp) + +install-indep: $(PACKAGES.indep:%=install-%-stamp) +install-arch: $(PACKAGES.arch:%=install-%-stamp) + +config-$(NCURSES_PKG)-stamp: + dh_testdir + + rm -rf t/ncurses6 + mkdir -p t/ncurses6 + + cd t/ncurses6; $(configure) \ + --datadir=\$${datarootdir}/$(NCURSES_PKG) \ + --with-screen=ncursesw6td + + touch $@ + +config-$(NCURSEST_PKG)-stamp: + dh_testdir + + rm -rf t/ncursest6 + mkdir -p t/ncursest6 + + cd t/ncursest6; $(configure) \ + --datadir=\$${datarootdir}/$(NCURSEST_PKG) \ + --with-screen=ncursestw6td + + touch $@ + +build-$(NCURSES_PKG)-stamp: config-$(NCURSES_PKG)-stamp + dh_testdir + + $(MAKE) -C t/ncurses6 + + touch $@ + +build-$(NCURSEST_PKG)-stamp: config-$(NCURSEST_PKG)-stamp + dh_testdir + + $(MAKE) -C t/ncursest6 + + touch $@ + +install-$(NCURSES_PKG)-stamp: build-$(NCURSES_PKG)-stamp + dh_testdir + dh_testroot + dh_installdirs $(verbose) + dh_prep $(verbose) -p$(NCURSES_PKG) + + $(MAKE) -C t/ncurses6 install \ + PACKAGE=$(NCURSES_PKG) \ + DESTDIR=$(CURDIR)/debian/$(NCURSES_PKG) + + touch $@ + +install-$(NCURSEST_PKG)-stamp: build-$(NCURSEST_PKG)-stamp + dh_testdir + dh_testroot + dh_installdirs $(verbose) + dh_prep $(verbose) -p$(NCURSEST_PKG) + + $(MAKE) -C t/ncursest6 install \ + PACKAGE=$(NCURSEST_PKG) \ + DESTDIR=$(CURDIR)/debian/$(NCURSEST_PKG) + + touch $@ + +# Build architecture-independent files here. +binary-indep: install-indep +ifneq ($(PACKAGES.indep),) + rm -f $(PACKAGES.indep:%=install-%-stamp) + dh_testdir + dh_testroot + dh_installdocs $(verbose) $(PACKAGES.indep:%=-p%) + dh_installman $(verbose) $(PACKAGES.indep:%=-p%) + dh_installexamples $(verbose) $(PACKAGES.indep:%=-p%) + dh_installchangelogs $(verbose) $(PACKAGES.indep:%=-p%) NEWS + dh_compress $(verbose) $(PACKAGES.indep:%=-p%) + dh_fixperms $(verbose) $(PACKAGES.indep:%=-p%) + dh_installdeb $(verbose) $(PACKAGES.indep:%=-p%) + dh_gencontrol $(verbose) $(PACKAGES.indep:%=-p%) + dh_md5sums $(verbose) $(PACKAGES.indep:%=-p%) + dh_builddeb $(verbose) $(PACKAGES.indep:%=-p%) +endif + +# Build architecture-dependent files here. +binary-arch: install-arch +ifneq ($(PACKAGES.arch),) + rm -f $(PACKAGES.arch:%=install-%-stamp) + dh_testdir + dh_testroot + dh_installdocs $(verbose) $(PACKAGES.arch:%=-p%) + dh_installchangelogs $(verbose) $(PACKAGES.arch:%=-p%) NEWS + dh_strip $(verbose) $(PACKAGES.arch:%=-p%) + dh_compress $(verbose) $(PACKAGES.arch:%=-p%) + dh_fixperms $(verbose) $(PACKAGES.arch:%=-p%) + dh_installdeb $(verbose) $(PACKAGES.arch:%=-p%) + dh_makeshlibs $(verbose) $(PACKAGES.arch:%=-p%) + dh_shlibdeps $(verbose) $(PACKAGES.arch:%=-p%) + dh_gencontrol $(verbose) $(PACKAGES.arch:%=-p%) + dh_md5sums $(verbose) $(PACKAGES.arch:%=-p%) + dh_builddeb $(verbose) $(PACKAGES.arch:%=-p%) +endif diff --git a/contrib/ncurses/test/package/debian/source/format b/contrib/ncurses/test/package/debian/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/contrib/ncurses/test/package/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/contrib/ncurses/test/package/debian/watch b/contrib/ncurses/test/package/debian/watch new file mode 100644 index 00000000..c35c8e38 --- /dev/null +++ b/contrib/ncurses/test/package/debian/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive https://invisible-island.net/archives/ncurses-examples/ncurses-examples-([\d.]+)\.tgz \ + debian uupdate diff --git a/contrib/ncurses/test/package/mingw-ncurses-examples.spec b/contrib/ncurses/test/package/mingw-ncurses-examples.spec new file mode 100644 index 00000000..bfadd10e --- /dev/null +++ b/contrib/ncurses/test/package/mingw-ncurses-examples.spec @@ -0,0 +1,124 @@ +Summary: ncurses-examples - example/test programs from ncurses +%?mingw_package_header + +%global AppProgram ncurses-examples +%global AppVersion MAJOR.MINOR +%global AppRelease YYYYMMDD +# $Id: mingw-ncurses-examples.spec,v 1.11 2023/02/25 23:10:34 tom Exp $ +Name: mingw32-ncurses6-examples +Version: %{AppVersion} +Release: %{AppRelease} +License: X11 +Group: Development/Libraries +URL: https://invisible-island.net/ncurses/%{AppProgram}.html +Source: https://invisible-island.net/archives/%{AppProgram}/%{AppProgram}-%{release}.tgz + +BuildRequires: mingw32-ncurses6 + +BuildRequires: mingw32-filesystem >= 95 +BuildRequires: mingw32-gcc +BuildRequires: mingw32-binutils + +BuildRequires: mingw64-ncurses6 + +BuildRequires: mingw64-filesystem >= 95 +BuildRequires: mingw64-gcc +BuildRequires: mingw64-binutils + +%define CC_NORMAL -Wall -Wstrict-prototypes -Wmissing-prototypes -Wshadow -Wconversion +%define CC_STRICT %{CC_NORMAL} -W -Wbad-function-cast -Wcast-align -Wcast-qual -Wmissing-declarations -Wnested-externs -Wpointer-arith -Wwrite-strings -ansi -pedantic + +%description -n mingw32-ncurses6-examples +Cross-compiling support for ncurses to mingw32. + +The ncurses library routines are a terminal-independent method of +updating character screens with reasonable optimization. + +This package is used for testing ABI 6 with cross-compiles to MinGW. + +%package -n mingw64-ncurses6-examples +Summary: Curses library for MinGW64 + +%description -n mingw64-ncurses6-examples +Cross-compiling support for ncurses to mingw64. + +The ncurses library routines are a terminal-independent method of +updating character screens with reasonable optimization. + +This package is used for testing ABI 6 with cross-compiles to MinGW. + +%prep + +# override location of bindir, e.g., to avoid conflict with pdcurses +%global mingw32_bindir %{mingw32_exec_prefix}/bin/%{AppProgram} +%global mingw64_bindir %{mingw64_exec_prefix}/bin/%{AppProgram} + +%global mingw32_datadir %{mingw32_datadir}/%{AppProgram} +%global mingw64_datadir %{mingw64_datadir}/%{AppProgram} + +%global mingw32_libexec %{mingw32_libexecdir}/%{AppProgram} +%global mingw64_libexec %{mingw64_libexecdir}/%{AppProgram} + +%define CFG_OPTS \\\ + --enable-echo \\\ + --enable-warnings \\\ + --verbose \\\ + --with-screen=ncursesw6 + +%define debug_package %{nil} +%setup -q -n ncurses-examples-%{release} + +%build +mkdir BUILD-W32 +pushd BUILD-W32 +CFLAGS="%{CC_NORMAL}" \ +CC=%{mingw32_cc} \ +NCURSES_CONFIG_SUFFIX=dev \ +%mingw32_configure %{CFG_OPTS} \ + --datadir=%{mingw32_datadir} +make +popd + +mkdir BUILD-W64 +pushd BUILD-W64 +CFLAGS="%{CC_NORMAL}" \ +CC=%{mingw64_cc} \ +%mingw64_configure %{CFG_OPTS} \ + --datadir=%{mingw32_datadir} +make +popd + +%install +rm -rf $RPM_BUILD_ROOT + +pushd BUILD-W32 +%{mingw32_make} install DESTDIR=$RPM_BUILD_ROOT +popd + +pushd BUILD-W64 +%{mingw64_make} install DESTDIR=$RPM_BUILD_ROOT +popd + +%files -n mingw32-ncurses6-examples +%defattr(-,root,root,-) +%{mingw32_bindir}/* +%{mingw32_datadir}/* +%{mingw32_libexec}/* + +%files -n mingw64-ncurses6-examples +%defattr(-,root,root,-) +%{mingw64_bindir}/* +%{mingw64_datadir}/* +%{mingw64_libexec}/* + +%changelog + +* Sat Feb 25 2023 Thomas Dickey +- use libexecdir for programs rather than subdir of bindir +- amend URLs per rpmlint + +* Sat Nov 16 2019 Thomas Dickey +- modify clean-rule to work around Fedora NFS bugs. + +* Sat Oct 19 2013 Thomas E. Dickey +- initial version diff --git a/contrib/ncurses/test/package/ncurses-examples.spec b/contrib/ncurses/test/package/ncurses-examples.spec new file mode 100644 index 00000000..8f1a3cbe --- /dev/null +++ b/contrib/ncurses/test/package/ncurses-examples.spec @@ -0,0 +1,115 @@ +Summary: example/test programs from ncurses +%global AppProgram ncurses-examples +%global AltProgram ncursest-examples +%global AppVersion MAJOR.MINOR +%global AppRelease YYYYMMDD +# $Id: ncurses-examples.spec,v 1.22 2023/02/25 23:10:49 tom Exp $ +Name: %{AppProgram} +Version: %{AppVersion} +Release: %{AppRelease} +License: MIT +Group: Applications/Development +URL: https://invisible-island.net/ncurses/%{AppProgram}.html +Source: https://invisible-island.net/archives/%{AppProgram}/%{AppProgram}-%{release}.tgz + +%description +These are the example/test programs from the ncurses MAJOR.MINOR distribution, +for patch-date YYYYMMDD. + +This package installs in "bin/%{AppProgram}" to avoid conflict with other +packages. + +%package -n %{AltProgram} +Summary: examples/test programs from ncurses with POSIX thread support + +%description -n %{AltProgram} +These are the example/test programs from the ncurses MAJOR.MINOR distribution, +for patch-date YYYYMMDD, using the "ncurseswt" library to demonstrate the +use of POSIX threads, e.g., in ditto, rain, and worm. + +This package installs in "bin/%{AltProgram}" to avoid conflict with other +packages. + +%prep + +%setup -q -n %{AppProgram}-%{AppRelease} + +%define debug_package %{nil} + +%build + +%global _configure ../configure +%define my_srcdir .. + +mkdir BUILD-%{AppProgram} +pushd BUILD-%{AppProgram} +INSTALL_PROGRAM='${INSTALL}' \ +NCURSES_CONFIG_SUFFIX=dev \ +CONFIGURE_TOP=%{my_srcdir} \ +%configure \ + --target %{_target_platform} \ + --prefix=%{_prefix} \ + --datadir=%{_datarootdir}/%{AppProgram} \ + --with-screen=ncursesw6dev \ + --disable-rpath-hack + +make +popd + +mkdir BUILD-%{AltProgram} +pushd BUILD-%{AltProgram} +INSTALL_PROGRAM='${INSTALL}' \ +NCURSES_CONFIG_SUFFIX=dev \ +CONFIGURE_TOP=%{my_srcdir} \ +%configure \ + --target %{_target_platform} \ + --prefix=%{_prefix} \ + --datadir=%{_datarootdir}/%{AltProgram} \ + --with-screen=ncursestw6dev \ + --disable-rpath-hack + +make +popd + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +pushd BUILD-%{AppProgram} +make install PACKAGE=%{AppProgram} DESTDIR=$RPM_BUILD_ROOT +popd + +pushd BUILD-%{AltProgram} +make install PACKAGE=%{AltProgram} DESTDIR=$RPM_BUILD_ROOT +popd + +%files -n %{AppProgram} +%defattr(-,root,root) +%{_bindir}/%{AppProgram} +%{_libexecdir}/%{AppProgram}/* +%{_datarootdir}/%{AppProgram}/* + +%files -n %{AltProgram} +%defattr(-,root,root) +%{_bindir}/%{AltProgram} +%{_libexecdir}/%{AltProgram}/* +%{_datarootdir}/%{AltProgram}/* + +%changelog +# each patch should add its ChangeLog entries here + +* Sat Feb 25 2023 Thomas Dickey +- amend URLs per rpmlint + +* Sat Dec 18 2021 Thomas Dickey +- use libexecdir for programs rather than subdir of bindir + +* Sat Nov 16 2019 Thomas Dickey +- modify clean-rule to work around Fedora NFS bugs. + +* Sat Nov 11 2017 Thomas Dickey +- add example data-files +- use rpm built-in "configure" +- suppress debug-package + +* Thu Mar 25 2010 Thomas Dickey +- initial version diff --git a/contrib/ncurses/test/padview.c b/contrib/ncurses/test/padview.c new file mode 100644 index 00000000..35167f33 --- /dev/null +++ b/contrib/ncurses/test/padview.c @@ -0,0 +1,550 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * clone of view.c, using pads + * + * $Id: padview.c,v 1.24 2024/10/06 21:08:25 tom Exp $ + */ + +#include +#include +#include + +#include +#include + +#if HAVE_NEWPAD + +static GCC_NORETURN void finish(int sig); + +#define my_pair 1 + +static WINDOW *global_pad; +static int shift = 0; +static bool try_color = FALSE; + +static char *fname; +static int num_lines; + +#if USE_WIDEC_SUPPORT +static bool n_option = FALSE; +#endif + +static void +failed(const char *msg) +{ + endwin(); + fprintf(stderr, "%s\n", msg); + ExitProgram(EXIT_FAILURE); +} + +static void +finish(int sig) +{ + endwin(); + if (global_pad != NULL) + delwin(global_pad); + ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS); +} + +static void +show_all(const char *tag, WINDOW *my_pad, int my_row) +{ + int i; + int digits; + char temp[BUFSIZ]; + time_t this_time; + + for (digits = 1, i = num_lines; i > 0; i /= 10) { + ++digits; + } + + wattrset(stdscr, COLOR_PAIR(my_pair)); + clear(); + + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "view %.*s", (int) strlen(tag), tag); + i = (int) strlen(temp); + _nc_SPRINTF(temp + i, _nc_SLIMIT(sizeof(temp) - (size_t) i) + " %.*s", (int) sizeof(temp) - i - 2, fname); + mvprintw(0, 0, "%.*s", COLS, temp); + this_time = time((time_t *) 0); + _nc_STRNCPY(temp, ctime(&this_time), (size_t) 30); + if ((i = (int) strlen(temp)) != 0) { + temp[--i] = 0; + mvprintw(0, COLS - i - 2, " %s", temp); + } + + for (i = 1; i < LINES; i++) { + int actual = my_row + i; + if (actual > num_lines) { + break; + } + mvprintw(i, 0, "%*d:", digits, actual); + } + wnoutrefresh(stdscr); + pnoutrefresh(my_pad, my_row, shift, 1, digits + 1, LINES - 1, COLS - 1); + doupdate(); +} + +static WINDOW * +read_file(const char *filename) +{ + FILE *fp; + int pass; + int k; + int height, width; + size_t j; + size_t len; + struct stat sb; + char *my_blob; + char **my_vec = 0; + WINDOW *my_pad; + + if (stat(filename, &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG) { + failed("input is not a file"); + } + + if (sb.st_size == 0) { + failed("input is empty"); + } + + if ((fp = fopen(filename, "r")) == 0) { + failed("cannot open input-file"); + } + + if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0) { + failed("cannot allocate memory for input-file"); + } + + len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp); + fclose(fp); + + if (len > (size_t) sb.st_size) + len = (size_t) sb.st_size; + my_blob[len] = '\0'; + + for (pass = 0; pass < 2; ++pass) { + char *base = my_blob; + k = 0; + for (j = 0; j < len; ++j) { + if (my_blob[j] == '\n') { + if (pass) { + my_vec[k] = base; + my_blob[j] = '\0'; + } + base = my_blob + j + 1; + ++k; + } + } + if (base != (my_blob + j)) { + if (pass) + my_vec[k] = base; + ++k; + } + num_lines = k; + if (pass == 0) { + if (((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) { + failed("cannot allocate line-vector #1"); + } + } else { + if (my_vec[0] == NULL) + my_vec[0] = my_blob; + } + } + +#if USE_WIDEC_SUPPORT + if (!memcmp("\357\273\277", my_blob, 3)) { + const char *s = my_blob + 3; + char *d = my_blob; + Trace(("trim BOM")); + do { + } while ((*d++ = *s++) != '\0'); + } +#endif + + height = num_lines; + width = (int) strlen(my_vec[0]); + for (k = 1; my_vec[k]; ++k) { + int check = (int) (my_vec[k] - my_vec[k - 1]); + if (width < check) + width = check; + } + width = (width + 1) * 5; + my_pad = newpad(height, width); + if (my_pad == 0) + failed("cannot allocate pad workspace"); + if (try_color) { + wattrset(my_pad, COLOR_PAIR(my_pair)); + wbkgd(my_pad, (chtype) (' ' | COLOR_PAIR(my_pair))); + } + + /* + * Use the curses library for rendering, including tab-conversion. + */ + Trace(("slurp the file")); + for (k = 0; my_vec[k]; ++k) { + char *s; +#if USE_WIDEC_SUPPORT + const char *last = my_vec[k] + (int) strlen(my_vec[k]); + wchar_t wch[2]; + size_t rc; +#ifndef state_unused + mbstate_t state; +#endif +#endif /* USE_WIDEC_SUPPORT */ + + wmove(my_pad, k, 0); +#if USE_WIDEC_SUPPORT + wch[1] = 0; + reset_mbytes(state); +#endif + for (s = my_vec[k]; *s != '\0'; ++s) { +#if USE_WIDEC_SUPPORT + if (!n_option) { + rc = (size_t) check_mbytes(wch[0], s, (size_t) (last - s), state); + if ((long) rc == -1 || (long) rc == -2) { + break; + } + s += rc - 1; + waddwstr(my_pad, wch); + } else +#endif + waddch(my_pad, *s & 0xff); + } + } + + free(my_vec); + free(my_blob); + + return my_pad; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: view [options] file" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -c use color if terminal supports it" + ," -i ignore INT, QUIT, TERM signals" +#if USE_WIDEC_SUPPORT + ," -n use waddch (bytes) rather then wadd_wch (wide-chars)" +#endif + ," -s start in single-step mode, waiting for input" +#ifdef TRACE + ," -t trace screen updates" + ," -T NUM specify trace mask" +#endif + }; + size_t n; + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " q,^Q,ESC - quit this program", + "", + " p, - scroll the viewport up by one row", + " n, - scroll the viewport down by one row", + " l, - scroll the viewport left by one column", + " r, - scroll the viewport right by one column", + " <,> - scroll the viewport left/right by 8 columns", + "", + " h, - scroll the viewport to top of file", + " ^F, - scroll to the next page", + " ^B, - scroll to the previous page", + " e, - scroll the viewport to end of file", + "", + " ^L - repaint using redrawwin()", + "", + " 0 through 9 - enter digits for count", + " s - use entered count for halfdelay() parameter", + " - if no entered count, stop nodelay()", + " - begin nodelay()", + 0 + }; + + int ch; + int i; + int my_delay = 0; + WINDOW *my_pad; + int my_row = 0; + int value = 0; + bool done = FALSE; + bool got_number = FALSE; + bool ignore_sigs = FALSE; + bool single_step = FALSE; + const char *my_label = "Input"; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "cinstT:")) != -1) { + switch (ch) { + case 'c': + try_color = TRUE; + break; + case 'i': + ignore_sigs = TRUE; + break; +#if USE_WIDEC_SUPPORT + case 'n': + n_option = TRUE; + break; +#endif + case 's': + single_step = TRUE; + break; +#ifdef TRACE + case 'T': + { + char *next = 0; + int tvalue = (int) strtol(optarg, &next, 0); + if (tvalue < 0 || (next != 0 && *next != 0)) + usage(FALSE); + curses_trace((unsigned) tvalue); + } + break; + case 't': + curses_trace(TRACE_CALLS); + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind + 1 != argc) + usage(FALSE); + + InitAndCatch(initscr(), ignore_sigs ? SIG_IGN : finish); + keypad(stdscr, TRUE); /* enable keyboard mapping */ + (void) nonl(); /* tell curses not to do NL->CR/NL on output */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + if (!single_step) + nodelay(stdscr, TRUE); + idlok(stdscr, TRUE); /* allow use of insert/delete line */ + + if (try_color) { + if (has_colors()) { + start_color(); + init_pair(my_pair, COLOR_WHITE, COLOR_BLUE); + bkgd((chtype) (' ' | COLOR_PAIR(my_pair))); + } else { + try_color = FALSE; + } + } + + /* + * Do this after starting color, otherwise the pad's background will be + * uncolored after the ncurses 6.1.20181208 fixes. + */ + global_pad = + my_pad = read_file(fname = argv[optind]); + + my_row = 0; + while (!done) { + int n, c; + + if (!got_number) + show_all(my_label, my_pad, my_row); + + for (;;) { + c = getch(); + if ((c < 127) && isdigit(c)) { + if (!got_number) { + MvPrintw(0, 0, "Count: "); + clrtoeol(); + } + addch(UChar(c)); + value = 10 * value + (c - '0'); + got_number = TRUE; + } else + break; + } + if (got_number && value) { + n = value; + } else { + n = 1; + } + + if (c != ERR) + my_label = keyname(c); + switch (c) { + case KEY_DOWN: + case 'n': + for (i = 0; i < n; i++) + if (my_row < (num_lines - LINES + 1)) + my_row++; + else + break; + break; + + case KEY_UP: + case 'p': + for (i = 0; i < n; i++) + if (my_row > 0) + my_row--; + else + break; + break; + + case 'h': + /* FALLTHRU */ + case KEY_HOME: + my_row = 0; + break; + + case '<': + if ((shift -= 8) < 0) + shift = 0; + break; + case '>': + shift += 8; + break; + + case 'e': + /* FALLTHRU */ + case KEY_END: + if (num_lines > LINES) + my_row = (num_lines - LINES + 1); + else + my_row = (num_lines - 2); + break; + + case CTRL('F'): + /* FALLTHRU */ + case KEY_NPAGE: + for (i = 0; i < n; i++) { + if (my_row < (num_lines - 5)) + my_row += (LINES - 1); + else + my_row = (num_lines - 2); + } + break; + + case CTRL('B'): + /* FALLTHRU */ + case KEY_PPAGE: + for (i = 0; i < n; i++) { + if (my_row >= LINES) + my_row -= (LINES - 1); + else + my_row = 0; + } + break; + + case 'r': + case KEY_RIGHT: + shift += n; + break; + + case 'l': + case KEY_LEFT: + shift -= n; + if (shift < 0) { + shift = 0; + beep(); + } + break; + + case 'q': + case QUIT: + case ESCAPE: + done = TRUE; + break; + +#ifdef KEY_RESIZE + case KEY_RESIZE: /* ignore this; ncurses will repaint */ + break; +#endif + case 's': +#if HAVE_HALFDELAY + if (got_number) { + halfdelay(my_delay = n); + } else { + nodelay(stdscr, FALSE); + my_delay = -1; + } +#else + nodelay(stdscr, FALSE); + my_delay = -1; +#endif + break; + case ' ': + nodelay(stdscr, TRUE); + my_delay = 0; + break; + case CTRL('L'): + redrawwin(stdscr); + break; + case ERR: + if (!my_delay) + napms(50); + break; + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + default: + beep(); + break; + } + if (c >= KEY_MIN || (c > 0 && !isdigit(UChar(c)))) { + got_number = FALSE; + value = 0; + } + } + + finish(0); /* we're done */ +} +#else +int +main(void) +{ + printf("This program requires the curses pad functions\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/pair_content.c b/contrib/ncurses/test/pair_content.c new file mode 100644 index 00000000..2b759a82 --- /dev/null +++ b/contrib/ncurses/test/pair_content.c @@ -0,0 +1,316 @@ +/**************************************************************************** + * Copyright 2018-2022,2023 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: pair_content.c,v 1.22 2023/02/25 16:43:56 tom Exp $ + */ + +#define NEED_TIME_H +#include + +#if USE_EXTENDED_COLOR +typedef int my_color_t; +#else +typedef NCURSES_COLOR_T my_color_t; +#endif + +typedef struct { + my_color_t fg; + my_color_t bg; +} MYPAIR; + +static int f_opt; +static int i_opt; +static int l_opt; +static int n_opt; +static int p_opt; +static int r_opt; +static int s_opt; + +#if USE_EXTENDED_COLOR +static int x_opt; +#endif + +static MYPAIR *expected; + +static TimeType initial_time; +static TimeType finish_time; + +static GCC_NORETURN void +finish(int code) +{ + free(expected); + ExitProgram(code); +} + +static void +failed(const char *msg) +{ + printw("%s", msg); + getch(); + endwin(); + finish(EXIT_FAILURE); +} + +#if USE_EXTENDED_COLOR +static int +InitPair(int pair, int fg, int bg) +{ + int rc; + if (x_opt) { + rc = init_extended_pair(pair, fg, bg); + } else { + rc = init_pair((NCURSES_PAIRS_T) pair, + (NCURSES_COLOR_T) fg, + (NCURSES_COLOR_T) bg); + } + return rc; +} + +static int +PairContent(int pair, int *fgp, int *bgp) +{ + int rc; + if (x_opt) { + rc = extended_pair_content(pair, fgp, bgp); + } else { + short fg, bg; + if ((rc = pair_content((short) pair, &fg, &bg)) == OK) { + *fgp = fg; + *bgp = bg; + } + } + return rc; +} +#else +#define InitPair(pair,fg,bg) init_pair((NCURSES_COLOR_T)pair,(NCURSES_COLOR_T)fg,(NCURSES_COLOR_T)bg) +#define PairContent(pair,fgp,bgp) pair_content((NCURSES_PAIRS_T)pair,fgp,bgp) +#endif + +static my_color_t +random_color(void) +{ + return (my_color_t) (rand() % COLORS); +} + +static void +setup_test(void) +{ + setlocale(LC_ALL, ""); + initscr(); + cbreak(); + noecho(); + scrollok(stdscr, TRUE); + if (has_colors()) { + start_color(); + + if (!f_opt) + f_opt = 1; + if (!l_opt) + l_opt = COLOR_PAIRS; + if (l_opt <= 1) + failed("color-pair limit must be greater than one"); + + if (!n_opt) { + int pair; + size_t need = (size_t) ((l_opt > COLOR_PAIRS) + ? l_opt + : COLOR_PAIRS) + 1; + + expected = typeCalloc(MYPAIR, need); + if (s_opt) { + my_color_t fg; + my_color_t bg; + pair = f_opt; + for (fg = 0; fg < COLORS; ++fg) { + for (bg = 0; bg < COLORS; ++bg) { + if (pair < l_opt) { + InitPair(pair, fg, bg); + expected[pair].fg = (my_color_t) fg; + expected[pair].bg = (my_color_t) bg; + ++pair; + } else { + break; + } + } + } + } else { + for (pair = f_opt; pair < l_opt; ++pair) { + expected[pair].fg = random_color(); + expected[pair].bg = random_color(); + InitPair(pair, expected[pair].fg, expected[pair].bg); + } + } + } + } else { + failed("This demo requires a color terminal"); + } + GetClockTime(&initial_time); +} + +static void +run_test(void) +{ + int pair; + bool success = TRUE; + for (pair = 1; pair < l_opt; ++pair) { + my_color_t fg; + my_color_t bg; + if (PairContent(pair, &fg, &bg) == OK) { + if (expected != 0) { + if (fg != expected[pair].fg) + success = FALSE; + if (bg != expected[pair].bg) + success = FALSE; + } + } + } + if (i_opt) { + addch(success ? '.' : '?'); + refresh(); + } +} + +static void +finish_test(void) +{ + getch(); + endwin(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: pair_content [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f PAIR first color pair to test (default: 1)" + ," -i interactive, showing test-progress" + ," -l PAIR last color pair to test (default: max_pairs-1)" + ," -n do not initialize color pairs" + ," -p print data for color pairs instead of testing" + ," -r COUNT repeat for given count" + ," -s initialize pairs sequentially rather than random" +#if USE_EXTENDED_COLOR + ," -x use extended color pairs/values" +#endif + }; + size_t n; + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:il:npr:sx")) != -1) { + switch (ch) { + case 'f': + if ((f_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 'i': + i_opt = 1; + break; + case 'l': + if ((l_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 'n': + n_opt = 1; + break; + case 'p': + p_opt = 1; + break; + case 'r': + if ((r_opt = atoi(optarg)) <= 0) + usage(FALSE); + break; + case 's': + s_opt = 1; + break; +#if USE_EXTENDED_COLOR + case 'x': + x_opt = 1; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + if (r_opt <= 0) + r_opt = 1; + + setup_test(); + if (p_opt) { + int i; + endwin(); + for (i = f_opt; i < l_opt; ++i) { + my_color_t fg, bg; + if (PairContent(i, &fg, &bg) == OK) { + printf("%d: %d %d\n", i, fg, bg); + } else { + printf("%d: ? ?\n", i); + } + } + } else { + int repeat; + + for (repeat = 0; repeat < r_opt; ++repeat) { + run_test(); + if (i_opt) { + addch('.'); + refresh(); + } + } + + if (i_opt) { + addch('\n'); + } + printw("DONE: "); + GetClockTime(&finish_time); + printw("%.03f seconds", ElapsedSeconds(&initial_time, &finish_time)); + finish_test(); + } + + finish(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/parse_rgb.h b/contrib/ncurses/test/parse_rgb.h new file mode 100644 index 00000000..b931ed00 --- /dev/null +++ b/contrib/ncurses/test/parse_rgb.h @@ -0,0 +1,98 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: parse_rgb.h,v 1.6 2024/10/05 19:26:24 tom Exp $ + * + * Sample implementation of ncurses RGB extension from user_caps(5). + */ +#ifndef PARSE_RBG_H_incl +#define PARSE_RBG_H_incl 1 + +#include + +#if HAVE_TIGETSTR && USE_WIDEC_SUPPORT +static int +parse_rgb(int *r_max, int *g_max, int *b_max) +{ + int colors = tigetnum("colors"); + int result = ERR; + + *r_max = *g_max = *b_max = 0; + + if (colors > 0) { + int max_bits; + int bits; + int pwr2; + int r = 0, g = 0, b = 0; + const char *data; + char ch; + + for (max_bits = 0, pwr2 = 1; + pwr2 < colors; + ++max_bits, pwr2 <<= 1) { + ; + } + + if (tigetflag("RGB") > 0) { + result = OK; + r = g = b = (max_bits + 2) / 3; + } else if ((bits = tigetnum("RGB")) > 0) { + result = OK; + r = g = b = bits; + } else if ((data = tigetstr("RGB")) != ABSENT_STRING + && data != CANCELLED_STRING + && sscanf(data, "%d/%d/%d%c", &r, &g, &b, &ch) == 3) { + result = OK; + } + + if ((r + g + b) < max_bits) { + result = ERR; + } else if (result == 0) { + if (r > max_bits) { + r = max_bits; + g = b = 0; + } + *r_max = r; + if (g > (max_bits -= r)) { + g = max_bits; + b = 0; + } + *g_max = g; + if (b > (max_bits -= g)) { + b = max_bits; + } + *b_max = b; + } + } + return result; +} +#else +#define parse_rgb(r,g,b) (ERR) +#endif + +#endif /* PARSE_RBG_H_incl */ diff --git a/contrib/ncurses/test/picsmap.c b/contrib/ncurses/test/picsmap.c new file mode 100644 index 00000000..46ec7251 --- /dev/null +++ b/contrib/ncurses/test/picsmap.c @@ -0,0 +1,1835 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: picsmap.c,v 1.150 2024/10/05 19:26:24 tom Exp $ + * + * Author: Thomas E. Dickey + * + * A little more interesting than "dots", read a simple image into memory and + * measure the time taken to paint it normally vs randomly. + * + * TODO improve use of rgb-names using tsearch. + * + * TODO add option to dump picture in non-optimized mode, e.g., like tput. + * TODO write cells/second to stderr (or log) + * TODO write picture left-to-right/top-to-bottom + * TODO write picture randomly + * TODO add one-shot option vs repeat-count before exiting + * TODO add option "-xc" for init_color vs init_extended_color + * TODO add option "-xa" for init_pair vs alloc_pair + * TODO use pad to allow pictures larger than screen + * TODO add option to just use convert (which can scale) vs builtin xbm/xpm. + * TODO add scr_dump and scr_restore calls + * TODO add option for assume_default_colors + */ +#include + +#include +#include + +#if HAVE_TSEARCH +#include +#endif + +#undef CUR /* use only the curses interface */ + +#define L_BLOCK '[' +#define R_BLOCK ']' + +#define L_CURLY '{' +#define R_CURLY '}' + +#define MaxSCALE 1000 /* input curses ranges 0..1000 */ +#define MaxRGB 255 /* output color ranges 0..255 */ +#define okCOLOR(n) ((n) >= 0 && (n) < COLORS) +#define okSCALE(n) ((n) >= 0 && (n) <= MaxSCALE) +#define Scaled256(n) (NCURSES_COLOR_T) (int)(((double)(n) * MaxSCALE) / 255) +#define ScaledColor(n) (NCURSES_COLOR_T) (int)(((double)(n) * MaxSCALE) / scale) + +#ifndef RGB_PATH +#define RGB_PATH "/etc/X11/rgb.txt" +#endif + +#include + +typedef struct { + size_t file; + size_t name; + size_t list; + size_t data; + size_t head; + size_t pair; + size_t cell; +} HOW_MUCH; + +#undef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) + +/* + * tfind will return null on failure, so we map subscripts starting at one. + */ +#define P2I(n) (((int)(my_intptr_t)(n)) - 1) +#define I2P(n) (void *)(my_intptr_t)((n) + 1) + +#define pause_curses() if (in_curses) stop_curses() + +#define debugmsg if (debugging) logmsg +#define debugmsg2 if (debugging) logmsg2 + +static GCC_NORETURN void cleanup(int); +static void giveup(const char *fmt, ...) GCC_PRINTFLIKE(1, 2); +static void logmsg(const char *fmt, ...) GCC_PRINTFLIKE(1, 2); +static void logmsg2(const char *fmt, ...) GCC_PRINTFLIKE(1, 2); +static void warning(const char *fmt, ...) GCC_PRINTFLIKE(1, 2); +static int gather_c_values(int); + +static FILE *logfp = 0; +static double aspect_ratio = 0.6; +static bool in_curses = FALSE; +static bool debugging = FALSE; +static bool quiet = FALSE; +static int slow_time = -1; +static RGB_NAME *rgb_table; +static RGB_DATA *all_colors; +static HOW_MUCH how_much; + +static int reading_last; +static int reading_size; +static FG_NODE *reading_ncols; + +#if HAVE_TSEARCH +static void *reading_ntree; +#endif + +#if HAVE_ALLOC_PAIR && USE_EXTENDED_COLOR +#define USE_EXTENDED_COLORS 1 +static bool use_extended_pairs = FALSE; +static bool use_extended_colors = FALSE; +#else +#define USE_EXTENDED_COLORS 0 +#endif + +static void +logmsg(const char *fmt, ...) +{ + if (logfp != 0) { + va_list ap; + va_start(ap, fmt); + vfprintf(logfp, fmt, ap); + va_end(ap); + fputc('\n', logfp); + fflush(logfp); + } +} + +static void +logmsg2(const char *fmt, ...) +{ + if (logfp != 0) { + va_list ap; + va_start(ap, fmt); + vfprintf(logfp, fmt, ap); + va_end(ap); + fflush(logfp); + } +} + +static void +close_log(void) +{ + if (logfp != 0) { + logmsg("Allocations:"); + logmsg("%8ld file", (long) how_much.file); + logmsg("%8ld name", (long) how_much.name); + logmsg("%8ld list", (long) how_much.list); + logmsg("%8ld data", (long) how_much.data); + logmsg("%8ld head", (long) how_much.head); + logmsg("%8ld pair", (long) how_much.pair); + logmsg("%8ld cell", (long) how_much.cell); + logmsg("%8ld window", LINES * COLS * (long) sizeof(NCURSES_CH_T)); + fclose(logfp); + logfp = 0; + } +} + +static void +cleanup(int code) +{ + pause_curses(); + close_log(); + ExitProgram(code); + /* NOTREACHED */ +} + +static void +failed(const char *msg) +{ + int save = errno; + perror(msg); + logmsg("failed with %s", strerror(save)); + cleanup(EXIT_FAILURE); +} + +static void +warning(const char *fmt, ...) +{ + if (logfp != 0) { + va_list ap; + va_start(ap, fmt); + vfprintf(logfp, fmt, ap); + va_end(ap); + fputc('\n', logfp); + fflush(logfp); + } else { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); + cleanup(EXIT_FAILURE); + } +} + +static void +free_data(char **data) +{ + if (data != 0) { + free(data[0]); + free(data); + } +} + +static PICS_HEAD * +free_pics_head(PICS_HEAD * pics) +{ + if (pics != 0) { + free(pics->fgcol); + free(pics->cells); + free(pics->name); + free(pics); + pics = 0; + } + return pics; +} + +static void +begin_c_values(int size) +{ + reading_last = 0; + reading_size = size; + reading_ncols = typeCalloc(FG_NODE, size + 1); + how_much.pair += (sizeof(FG_NODE) * (size_t) size); + /* black is always the first slot, to work around P2I/I2P logic */ + gather_c_values(0); +} + +#if HAVE_TSEARCH +static int +compare_c_values(const void *p, const void *q) +{ + const int a = P2I(p); + const int b = P2I(q); + return (reading_ncols[a].fgcol - reading_ncols[b].fgcol); +} + +#ifdef DEBUG_TSEARCH +static void +check_c_values(int ln) +{ + static int oops = 5; + FG_NODE **ft; + int n; + for (n = 0; n < reading_last; ++n) { + ft = tfind(I2P(n), &reading_ntree, compare_c_values); + if (ft != 0) { + int q = P2I(*ft); + if (reading_ncols[q].fgcol != reading_ncols[n].fgcol) { + logmsg("@%d, %d:%d (%d) %d %d fgcol %06X %06X", ln, n, + reading_last - 1, + reading_size, + q, n, + reading_ncols[n].fgcol, + reading_ncols[q].fgcol); + } + } else { + logmsg("@%d, %d:%d (%d) ? %d null %06X", ln, n, + reading_last - 1, + reading_size, + n, + reading_ncols[n].fgcol); + if (oops-- <= 0) + return; + } + } +} +#else +#define check_c_values(n) /* nothing */ +#endif +#endif + +static int +gather_c_values(int fg) +{ + int found = -1; +#if HAVE_TSEARCH + FG_NODE **ft; + int next = reading_last; + + reading_ncols[next].fgcol = fg; + reading_ncols[next].count = 0; + + check_c_values(__LINE__); + if ((ft = tfind(I2P(next), &reading_ntree, compare_c_values)) != 0) { + found = P2I(*ft); + } else { + if (reading_last + 2 >= reading_size) { + int more = ((MAX(reading_last, reading_size) + 2) * 3) / 2; + int last = reading_last + 1; + FG_NODE *p = typeRealloc(FG_NODE, more, reading_ncols); + if (p == 0) + goto done; + + reading_size = more; + reading_ncols = p; + memset(reading_ncols + last, 0, + sizeof(FG_NODE) * (size_t) (more - last)); + check_c_values(__LINE__); + } + ++reading_last; + how_much.pair += sizeof(FG_NODE); + if ((ft = tsearch(I2P(next), &reading_ntree, compare_c_values)) != 0) { + found = P2I(*ft); + if (found != next) + logmsg("OOPS expected slot %d, got %d", next, found); + debugmsg("allocated color #%d as #%06X", next, fg); + check_c_values(__LINE__); + } + } +#else + int n; + + for (n = 0; n < reading_last; ++n) { + if (reading_ncols[n].fgcol == fg) { + found = n; + break; + } + } + if (found < 0) { + if (reading_last + 2 >= reading_size) { + int more = ((reading_last + 2) * 3) / 2; + FG_NODE *p = typeRealloc(FG_NODE, more, reading_ncols); + if (p == 0) + goto done; + + how_much.pair -= (sizeof(FG_NODE) * (size_t) reading_size); + how_much.pair += (sizeof(FG_NODE) * (size_t) more); + reading_size = more; + reading_ncols = p; + memset(reading_ncols + reading_last, 0, + sizeof(FG_NODE) * (size_t) (more - reading_last)); + } + reading_ncols[reading_last].fgcol = fg; + found = reading_last++; + } +#endif + done: + return found; +} + +static void +finish_c_values(PICS_HEAD * head) +{ + head->colors = reading_last; + head->fgcol = reading_ncols; + + reading_last = 0; + reading_size = 0; + reading_ncols = 0; +} + +static void +dispose_c_values(void) +{ +#if HAVE_TSEARCH + if (reading_ntree != 0) { + int n; + for (n = 0; n < reading_last; ++n) { + tdelete(I2P(n), &reading_ntree, compare_c_values); + } + reading_ntree = 0; + } +#endif + if (reading_ncols != 0) { + free(reading_ncols); + reading_ncols = 0; + } + reading_last = 0; + reading_size = 0; +} + +static int +is_file(const char *filename, struct stat *sb) +{ + int result = 0; + if (stat(filename, sb) == 0 + && (sb->st_mode & S_IFMT) == S_IFREG + && sb->st_size != 0) { + result = 1; + } + debugmsg("is_file(%s) %d", filename, result); + return result; +} + +/* + * Simplify reading xbm/xpm files by first making an array of lines. Blank + * lines are filtered out. + */ +static char ** +read_file(const char *filename) +{ + char **result = 0; + struct stat sb; + + if (!quiet) { + pause_curses(); + printf("** %s\n", filename); + } + + if (is_file(filename, &sb)) { + size_t size = (size_t) sb.st_size; + char *blob = typeCalloc(char, size + 1); + bool binary = FALSE; + unsigned k = 0; + + result = typeCalloc(char *, size + 1); + how_much.file += ((size + 1) * 2); + + if (blob != 0 && result != 0) { + FILE *fp = fopen(filename, "r"); + if (fp != 0) { + logmsg("opened %s", filename); + + if (fread(blob, sizeof(char), size, fp) == size) { + bool had_line = TRUE; + unsigned j; + + for (j = 0; (size_t) j < size; ++j) { + if (blob[j] == '\0' || + (UChar(blob[j]) < 32 && + !isspace(UChar(blob[j]))) || + (UChar(blob[j]) >= 128 && UChar(blob[j]) < 160)) { + binary = TRUE; + } + if (blob[j] == '\n') { + blob[j] = '\0'; + if (k && !binary) { + debugmsg2("[%5d] %s\n", k, result[k - 1]); + } + had_line = TRUE; + } else if (had_line) { + had_line = FALSE; + result[k++] = blob + j; + } + } + result[k] = 0; + if (k && !binary) { + debugmsg2("[%5d] %s\n", k, result[k - 1]); + } + } + fclose(fp); + } else { + logmsg("cannot open %s", filename); + } + } + if (k == 0) { + debugmsg("...file is empty"); + free(blob); + free(result); + result = 0; + } else if (binary) { + debugmsg("...file is non-text"); + } + } + return result; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: picsmap [options] [imagefile [...]]" + ,"Read/display one or more xbm/xpm files (possibly use \"convert\")" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -a ratio aspect-ratio correction for ImageMagick" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + ," -L add debugging information to logfile" + ," -l FILE write informational messages to FILE" + ," -p FILE color-palette file (default \"$TERM.dat\")" + ," -q less verbose" + ," -r FILE xpm uses X rgb color-names in FILE (default \"" RGB_PATH "\")" + ," -s SECS pause for SECS seconds after display vs getch" +#if USE_EXTENDED_COLORS + ," -x [pc] use extension (p=extended-pairs, c=extended-colors)" + ," Either/both extension may be given" +#endif + }; + size_t n; + + pause_curses(); + + fflush(stdout); + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + cleanup(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} + +static void +giveup(const char *fmt, ...) +{ + va_list ap; + + pause_curses(); + fflush(stdout); + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fputc('\n', stderr); + va_end(ap); + + if (logfp) { + va_start(ap, fmt); + vfprintf(logfp, fmt, ap); + fputc('\n', logfp); + va_end(ap); + fflush(logfp); + } + + usage(FALSE); +} + +/* + * Palette files are named for $TERM values. However, there are fewer palette + * files than $TERM's. Although there are known problems (some cannot even get + * black and white correct), for the purpose of comparison, pretending that + * those map into "xterm" is useful. + */ +static char ** +read_palette(const char *filename) +{ + static const char *data_dir = DATA_DIR; + char **result = 0; + size_t last = strlen(filename); + size_t need = (strlen(data_dir) + 20 + last); + char *full_name = malloc(need); + char *s; + struct stat sb; + + if (full_name != 0) { + int tries; + for (tries = 0; tries < 8; ++tries) { + + *(s = full_name) = '\0'; + if (tries & 1) { + if (strchr(filename, '/') == 0) { + _nc_SPRINTF(full_name, _nc_SLIMIT(need) "%s/", data_dir); + } else { + continue; + } + } + s += strlen(s); + if (((size_t) (s - full_name) + last + 1) >= need) + continue; + + _nc_STRCAT(full_name, filename, need); + if (tries & 4) { + char *t = s; + const char *tc; + int num; + char chr; + int found = 0; + while (*t != '\0') { + if (*t == '-') { + if (sscanf(t, "-%d%c", &num, &chr) == 2 && + chr == 'c' && + (tc = strchr(t, chr)) != 0 && + !(strncmp) (tc, "color", 5)) { + found = 1; + } + break; + } + ++t; + } + if (found && (t != s) + && (strncmp) (s, "xterm", (size_t) (t - s))) { + _nc_SPRINTF(s, _nc_SLIMIT(need - (size_t) (s - full_name)) + "xterm%s", filename + (t - s)); + } else { + continue; + } + } + + if (tries & 2) { + int len = (int) strlen(filename); + if (len <= 4 || strcmp(filename + len - 4, ".dat")) { + _nc_STRCAT(full_name, ".dat", need); + } else { + continue; + } + } + if (is_file(full_name, &sb)) + goto ok; + } + goto failed; + ok: + result = read_file(full_name); + failed: + free(full_name); + } + return result; +} + +static void +init_palette(const char *palette_file) +{ + if (palette_file != 0) { + char **data = read_palette(palette_file); + + all_colors = typeMalloc(RGB_DATA, (unsigned) COLORS); + how_much.data += (sizeof(RGB_DATA) * (unsigned) COLORS); + +#if HAVE_COLOR_CONTENT + { + int cp; + for (cp = 0; cp < COLORS; ++cp) { + color_content((short) cp, + &all_colors[cp].red, + &all_colors[cp].green, + &all_colors[cp].blue); + } + } +#else + memset(all_colors, 0, sizeof(RGB_DATA) * (size_t) COLORS); +#endif + if (data != 0) { + int n; + int red, green, blue; + int scale = MaxSCALE; + int c; + for (n = 0; data[n] != 0; ++n) { + if (sscanf(data[n], "scale:%d", &c) == 1) { + scale = c; + } else if (sscanf(data[n], "%d:%d %d %d", + &c, + &red, + &green, + &blue) == 4 + && okCOLOR(c) + && okSCALE(red) + && okSCALE(green) + && okSCALE(blue)) { + /* *INDENT-EQLS* */ + all_colors[c].red = ScaledColor(red); + all_colors[c].green = ScaledColor(green); + all_colors[c].blue = ScaledColor(blue); + } + } + } + free_data(data); + /* *INDENT-EQLS* */ + } else if (COLORS > 1) { + int power2 = 1; + int shift = 0; + + while (power2 < COLORS) { + ++shift; + power2 <<= 1; + } + + if ((power2 != COLORS) || ((shift % 3) != 0)) { + if (all_colors == 0) { + init_palette(getenv("TERM")); + if (all_colors == 0) { + giveup("With %d colors, you need a palette-file", COLORS); + } + } + } + } +} + +/* + * Map the 24-bit RGB value to a color index if using a palette, otherwise to a + * direct color value. + */ +static int +map_color(int value) +{ + int result = value; + + if (result < 0) { + result = -1; + } else { + /* *INDENT-EQLS* */ + int red = (value & 0xff0000) >> 16; + int green = (value & 0x00ff00) >> 8; + int blue = (value & 0x0000ff) >> 0; + + if (all_colors != 0) { +#define Diff2(n,m) ((m) - all_colors[n].m) * ((m) - all_colors[n].m) +#define Diff2S(n) Diff2(n,red) + Diff2(n,green) + Diff2(n,blue) + int d2 = Diff2S(0); + int n; + + /* *INDENT-EQLS* */ + red = Scaled256(red); + green = Scaled256(green); + blue = Scaled256(blue); + + for (result = 0, n = 1; n < COLORS; ++n) { + int d = Diff2(n, red) + Diff2(n, green) + Diff2(n, blue); + if (d < d2) { + d2 = d; + result = n; + } + } + } else { /* direct color */ + int power2 = 1; + int shifts = 8; + + while (power2 < COLORS) { + power2 <<= 3; + shifts--; + } + + if (shifts > 0) { + /* TODO: round up */ + red >>= shifts; + green >>= shifts; + blue >>= shifts; + result = ((red << (2 * (8 - shifts))) + + (green << (8 - shifts)) + + blue); + } + } + } + return result; +} + +static int +bytes_of(int value) +{ + if (value & 7) { + value |= 7; + value++; + } + return value; +} + +static int match_c(const char *, const char *, ...) GCC_SCANFLIKE(2,3); + +static char * +skip_s(char *s) +{ + while (isspace(UChar(*s))) + s++; + return s; +} + +static const char * +skip_cs(const char *s) +{ + while (isspace(UChar(*s))) + s++; + return s; +} + +static char * +skip_word(char *s) +{ + s = skip_s(s); + while (isgraph(UChar(*s))) + s++; + return s; +} + +static int +match_c(const char *source, const char *pattern, ...) +{ + int limit = (int) strlen(source); + const char *last_s = source + limit; + va_list ap; + int ch; + int *ip; + char *cp; + float *fp; + long lv; + + va_start(ap, pattern); + + limit = -1; + while (*pattern != '\0') { + ch = UChar(*pattern++); + /* blank in the pattern matches zero-or-more blanks in source */ + if (isspace(ch)) { + source = skip_cs(source); + continue; + } + /* %c, %d, %s are like sscanf except for special treatment of blanks */ + if (ch == '%' && *pattern != '\0' && strchr("%cdnfsx", *pattern)) { + bool found = FALSE; + ch = *pattern++; + switch (ch) { + case '%': + source++; + break; + case 'c': + cp = va_arg(ap, char *); + do { + *cp++ = *source++; + } while (--limit > 0); + break; + case 'd': + case 'x': + limit = -1; + ip = va_arg(ap, int *); + lv = strtol(source, &cp, ch == 'd' ? 10 : 16); + if (cp != 0 && cp != source) { + *ip = (int) lv; + source = cp; + } else { + goto finish; + } + break; + case 'f': + /* floating point for pixels... */ + fp = va_arg(ap, float *); + lv = strtol(source, &cp, 10); + if (cp == 0 || cp == source) + goto finish; + *fp = (float) lv; + source = cp; + if (*source == '.') { + lv = strtol(++source, &cp, 10); + if (cp == 0 || cp == source) + goto finish; + { + float scale = 1.0f; + int digits = (int) (cp - source); + while (digits-- > 0) { + scale *= 10.0f; + } + *fp += (float) lv / scale; + } + source = cp; + } + break; + case 'n': + /* not really sscanf... */ + limit = *va_arg(ap, int *); + break; + case 's': + limit = -1; + cp = va_arg(ap, char *); + while (*source != '\0') { + ch = UChar(*source); + if (isspace(ch)) { + break; + } else if (found && (ch == *skip_cs(pattern))) { + break; + } else { + *cp++ = *source++; + found = TRUE; + } + } + *cp = '\0'; + break; + } + continue; + } + /* other characters are matched literally */ + if (*source++ != ch) { + break; + } + } + finish: + + va_end(ap); + if (source > last_s) + source = last_s; + return (*source || *pattern) ? 0 : 1; +} + +static int +match_colors(const char *source, int cpp, char *arg1, char *arg2, char *arg3) +{ + int result = 0; + + /* most files use a quasi-fixed format */ + if (match_c(source, " \"%n%c %s %s \" , ", &cpp, arg1, arg2, arg3)) { + arg1[cpp] = '\0'; + result = 1; + } else { + const char *s = skip_cs(source); + size_t have = strlen(source); + + if (*s++ == '"' && have > ((size_t) cpp + 2)) { + memcpy(arg1, s, (size_t) cpp); + s += cpp; + while (*s++ == '\t') { + char *t; + for (t = arg2; (*s != '\0') && strchr("\t\"", *s) == 0;) { + if (*s == ' ') { + s = skip_cs(s); + break; + } + *t++ = *s++; + *t = '\0'; + } + for (t = arg3; (*s != '\0') && strchr("\t\"", *s) == 0;) { + *t++ = *s++; + *t = '\0'; + } + if (!strcmp(arg2, "c")) { + result = 1; + break; + } + } + } + } + return result; +} + +static RGB_NAME * +parse_rgb(char **data) +{ + char buf[BUFSIZ]; + int n; + unsigned long r, g, b; + char *s, *t; + size_t item = 0; + size_t need; + RGB_NAME *result = 0; + + for (need = 0; data[need] != 0; ++need) ; + + result = typeCalloc(RGB_NAME, need + 2); + how_much.name += (sizeof(RGB_NAME) * (need + 2)); + + for (n = 0; data[n] != 0; ++n) { + if (strlen(t = data[n]) >= sizeof(buf) - 1) + continue; + if (*(s = skip_s(t)) == '!') + continue; + + r = strtoul(s, &t, 10); + s = skip_s(t); + g = strtoul(s, &t, 10); + s = skip_s(t); + b = strtoul(s, &t, 10); + s = skip_s(t); + + result[item].name = s; + t = s + strlen(s); + while (t-- != s && isspace(UChar(*t))) { + *t = '\0'; + } + result[item].value = (int) ((r & 0xff) << 16 | + (g & 0xff) << 8 | + (b & 0xff)); + ++item; + } + + result[item].name = "none"; + result[item].value = -1; + + return result; +} + +#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c)) + +static int +CaselessCmp(const char *a, const char *b) +{ /* strcasecmp isn't portable */ + while (*a && *b) { + int cmp = LOWERCASE(*a) - LOWERCASE(*b); + if (cmp != 0) + break; + a++, b++; + } + return LOWERCASE(*a) - LOWERCASE(*b); +} + +static RGB_NAME * +lookup_rgb(const char *name) +{ + RGB_NAME *result = 0; + if (rgb_table != 0) { + int n; + for (n = 0; rgb_table[n].name != 0; ++n) { + if (!CaselessCmp(name, rgb_table[n].name)) { + result = &rgb_table[n]; + break; + } + } + } + return result; +} + +static PICS_HEAD * +parse_xbm(char **data) +{ + int n; + int state = 0; + char buf[2048]; + int num; + char ch; + char *s; + char *t; + PICS_HEAD *result; + size_t which = 0; + size_t cells = 0; + + debugmsg("called parse_xbm"); + + result = typeCalloc(PICS_HEAD, 1); + how_much.head += sizeof(PICS_HEAD); + + begin_c_values(2); + gather_c_values(0); + gather_c_values(0xffffff); + + for (n = 0; data[n] != 0; ++n) { + if (strlen(s = data[n]) >= sizeof(buf) - 1) + continue; + switch (state) { + case 0: + case 1: + case 2: + if (sscanf(s, "#define %1024s %d%c", buf, &num, &ch) >= 2) { + if ((t = strstr(buf, "_width")) != 0) { + state |= 1; + result->wide = (short) bytes_of(num); + } else if ((t = strstr(buf, "_height")) != 0) { + state |= 2; + result->high = (short) num; + } else { + break; + } + *t = '\0'; + if (result->name) { + if (strcmp(result->name, buf)) { + goto finish; + } + } else { + result->name = strdup(buf); + } + } + break; + case 3: + if (sscanf(s, "static char %1024[^_ ]_bits[]%c", buf, &ch) >= 1) { + if (strcmp(result->name, buf)) { + goto finish; + } + state = 4; + cells = (size_t) (result->wide * result->high); + + result->cells = typeCalloc(PICS_CELL, cells); + how_much.cell += (sizeof(PICS_CELL) * cells); + + if ((s = strchr(s, L_CURLY)) == 0) + break; + ++s; + } else { + break; + } + case 4: + while (*s != '\0') { + while (isspace(UChar(*s))) { + ++s; + } + if (isdigit(UChar(*s))) { + long value = strtol(s, &t, 0); + int b; + if (t != s || value > MaxRGB || value < 0) { + s = t; + } else { + state = -1; + goto finish; + } + for (b = 0; b < 8; ++b) { + if (((1L << b) & value) != 0) { + result->cells[which].ch = '*'; + result->cells[which].fg = 1; + reading_ncols[1].count++; + } else { + result->cells[which].ch = ' '; + result->cells[which].fg = 0; + reading_ncols[0].count++; + } + if (++which > cells) { + state = -1; + goto finish; + } + } + } + if (*s == R_CURLY) { + state = 5; + goto finish; + } else if (*s == ',') { + ++s; + } + } + break; + default: + break; + } + } + finish: + if (state < 4) { + debugmsg("...state was only %d", state); + if (result) { + result = free_pics_head(result); + } + } else { + finish_c_values(result); + } + return result; +} + +static PICS_HEAD * +parse_xpm(char **data) +{ + int state = 0; + PICS_HEAD *result; + RGB_NAME *by_name; + int n; + int cells = 0; + int cpp = 1; /* chars per pixel */ + int num[6]; + int found; + int which = 0; + int num_colors = 0; + char ch; + const char *cs; + char *s; + char buf[BUFSIZ]; + char arg1[BUFSIZ]; + char arg2[BUFSIZ]; + char arg3[BUFSIZ]; + char **list = 0; + + debugmsg("called parse_xpm"); + + result = typeCalloc(PICS_HEAD, 1); + how_much.head += sizeof(PICS_HEAD); + + for (n = 0; data[n] != 0; ++n) { + if (strlen(s = data[n]) >= sizeof(buf) - 1) + continue; + switch (state) { + case 0: + if (match_c(s, " /* XPM */ ")) { + state = 1; + } + break; + case 1: + if (match_c(s, " static char * %s [] = %c ", arg1, &ch) && + ch == L_CURLY) { + result->name = strdup(arg1); + state = 2; + } + break; + case 2: + if (match_c(s, " \" %d %d %d %d \" , ", + num + 0, num + 1, num + 2, num + 3) || + match_c(s, " \" %d %d %d %d %d %d \" , ", + num + 0, num + 1, num + 2, num + 3, num + 4, num + 5)) { + result->wide = (short) num[0]; + result->high = (short) num[1]; + result->colors = num[2]; + + begin_c_values(num[2]); + + cells = (result->wide * result->high); + + result->cells = typeCalloc(PICS_CELL, cells); + how_much.cell += sizeof(PICS_CELL) * (size_t) cells; + + list = typeCalloc(char *, result->colors + 1); + how_much.list += sizeof(char *) * (size_t) (result->colors + 1); + + cpp = num[3]; + state = 3; + } + break; + case 3: + if (!match_colors(s, cpp, arg1, arg2, arg3)) { + break; + } + num_colors++; + free(list[reading_last]); + list[reading_last] = strdup(arg1); + if ((by_name = lookup_rgb(arg3)) != 0) { + found = gather_c_values(by_name->value); + } else if (*arg3 == '#') { + char *rgb = arg3 + 1; + unsigned long value = strtoul(rgb, &s, 16); + switch ((int) strlen(rgb)) { + case 6: + break; + case 12: + value = (((value >> 24) & 0xff0000L) + | ((value >> 16) & 0xff00L) + | ((value >> 8) & 0xffL)); + break; + default: + warning("unexpected rgb value %s", rgb); + break; + } + found = gather_c_values((int) value); + } else { + found = gather_c_values(0); /* actually an error */ + } + debugmsg(" [%d:%d] %06X", num_colors, result->colors, + reading_ncols[(found >= 0) ? found : 0].fgcol); + if (num_colors >= result->colors) { + finish_c_values(result); + state = 4; + if (list[0] == 0) + list[0] = strdup("\033"); + } + break; + case 4: + if (*(cs = skip_cs(s)) == '"') { + ++cs; + while (*cs != '\0' && *cs != '"') { + int c; + + /* FIXME - factor out */ + for (c = 0; c < result->colors; ++c) { + if (list[c] == 0) { + /* should not happen... */ + continue; + } + if (!(strncmp) (cs, list[c], (size_t) cpp)) { + result->cells[which].ch = list[c][0]; + result->cells[which].fg = c; + result->fgcol[c].count++; + break; + } + } + + if (result->cells[which].ch == 0) { + result->cells[which].ch = '?'; + result->cells[which].fg = 0; + } + + if (++which >= cells) { + state = 5; + break; + } + for (c = cpp; c > 0; --c, ++cs) { + if (*cs == '\0') + break; + } + } + } + break; + } + } + + if (result && list) { + for (n = 0; n < result->colors; ++n) + free(list[n]); + free(list); + } + + if (state < 5) { + debugmsg("...state was only %d", state); + result = free_pics_head(result); + } + + if (result) { + debugmsg("...allocated %d colors", result->colors); + } + + return result; +} + +/* + * The obscurely-named "convert" is provided by ImageMagick + */ +static PICS_HEAD * +parse_img(const char *filename) +{ + size_t need = strlen(filename) + 256; + char *cmd = malloc(need); + FILE *pp; + char buffer[BUFSIZ]; + char dummy[BUFSIZ]; + bool okay = TRUE; + PICS_HEAD *result; + int pic_x = 0; + int pic_y = 0; + int width = in_curses ? COLS : 80; + + _nc_SPRINTF(cmd, _nc_SLIMIT(need) "identify \"%s\"", filename); + if (quiet) + _nc_STRCAT(cmd, " 2>/dev/null", need); + + logmsg("...opening pipe to %s", cmd); + + result = typeCalloc(PICS_HEAD, 1); + how_much.head += sizeof(PICS_HEAD); + + if ((pp = popen(cmd, "r")) != 0) { + if (fgets(buffer, sizeof(buffer), pp) != 0) { + size_t n = strlen(filename); + debugmsg2("...read %s", buffer); + if (strlen(buffer) > n && + !(strncmp) (buffer, filename, n) && + isspace(UChar(buffer[n])) && + sscanf(skip_word(buffer + n), " %dx%d ", &pic_x, &pic_y) == 2) { + /* distort image to make it show normally on terminal */ + pic_x = (int) ((double) pic_x / aspect_ratio); + } else { + pic_x = pic_y = 0; + } + } + pclose(pp); + } + if (pic_x <= 0 || pic_y <= 0) + goto finish; + + _nc_SPRINTF(cmd, _nc_SLIMIT(need) + "convert " "-resize %dx%d\\! " "-thumbnail %dx \"%s\" " + "-define txt:compliance=SVG txt:-", + pic_x, pic_y, width, filename); + if (quiet) + _nc_STRCAT(cmd, " 2>/dev/null", need); + + logmsg("...opening pipe to %s", cmd); + if ((pp = popen(cmd, "r")) != 0) { + int count = 0; + int col = 0; + int row = 0; + int len = 0; + while (fgets(buffer, sizeof(buffer), pp) != 0) { + debugmsg2("[%5d] %s", count + 1, buffer); + if (strlen(buffer) > 160) { /* 80 columns would be enough */ + okay = FALSE; + break; + } + if (count++ == 0) { + if (match_c(buffer, + "# ImageMagick pixel enumeration: %d,%d,%d,%s ", + &col, &row, &len, dummy)) { + result->name = strdup(filename); + result->wide = (short) col; + result->high = (short) row; + + begin_c_values(256); + + result->cells = typeCalloc(PICS_CELL, (size_t) (col * row)); + how_much.cell += (sizeof(PICS_CELL) * (size_t) (col * row)); + } else { + okay = FALSE; + break; + } + } else { + /* + * subsequent lines begin "col,row: (r,g,b,a) #RGB". + * Those r/g/b could be integers (0..255) or float-percentages. + */ + int r, g, b, nocolor; + float rf, gf, bf; + unsigned check; + char *s = strchr(buffer, '#'); + const char *t = s; + bool matched = FALSE; + + if (s != 0) { + /* after the "#RGB", there are differences - just ignore */ + while (*s != '\0' && !isspace(UChar(*s))) + ++s; + *++s = '\0'; + } + + if (match_c(buffer, + "%d,%d: (%d,%d,%d,%d) #%x ", + &col, &row, + &r, &g, &b, &nocolor, + &check)) { + matched = TRUE; + } else if (match_c(buffer, + "%d,%d: (%f%%,%f%%,%f%%,%d) #%x ", + &col, &row, + &rf, &gf, &bf, &nocolor, + &check) || + match_c(buffer, + "%d,%d: (%f%%,%f%%,%f%%) #%x ", + &col, &row, + &rf, &gf, &bf, + &check)) { + matched = TRUE; + +#define fp_fix(n) (int) (MaxRGB * (((n) > 100.0 ? 100.0 : (n)) / 100.0)) + + r = fp_fix(rf); + g = fp_fix(gf); + b = fp_fix(bf); + } + if ((s - t) > 8) /* 6 hex digits vs 8 */ + check /= 256; + if (matched) { + int which, c; + int want_r = (check >> 16) & 0xff; + int want_g = (check >> 8) & 0xff; + int want_b = (check >> 0) & 0xff; + +#define fp_err(tst,ref) ((tst > MaxRGB) || ((tst - ref)*(tst - ref)) > 4) + + if (fp_err(r, want_r) || + fp_err(g, want_g) || + fp_err(b, want_b)) { + okay = FALSE; + break; + } + c = gather_c_values((int) check); + which = col + (row * result->wide); + result->cells[which].ch = ((in_curses || + check == 0xffffff) + ? ' ' + : '#'); + if (c >= 0 && c < reading_last) { + result->cells[which].fg = c; + reading_ncols[c].count++; + } else { + result->cells[which].fg = -1; + } + } else { + okay = FALSE; + break; + } + } + } + finish_c_values(result); + pclose(pp); + if (okay) { + /* FIXME - is this trimming needed? */ + for (len = result->colors; len > 3; len--) { + if (result->fgcol[len - 1].fgcol == 0) { + result->colors = len - 1; + } else { + break; + } + } + } + } + finish: + free(cmd); + + if (!okay) { + result = free_pics_head(result); + } + + return result; +} + +static PICS_HEAD * +read_picture(const char *filename, char **data) +{ + PICS_HEAD *pics; + if ((pics = parse_xbm(data)) == 0) { + dispose_c_values(); + if ((pics = parse_xpm(data)) == 0) { + dispose_c_values(); + if ((pics = parse_img(filename)) == 0) { + dispose_c_values(); + free_data(data); + warning("unexpected file-format for \"%s\"", filename); + } else if (pics->high == 0 || pics->wide == 0) { + dispose_c_values(); + free_data(data); + pics = free_pics_head(pics); + warning("no picture found in \"%s\"", filename); + } + } + } + return pics; +} + +#define fg_color(pics,n) (pics->fgcol[n].fgcol) + +static void +dump_picture(const PICS_HEAD * pics) +{ + int y, x; + + printf("Name %s\n", pics->name); + printf("Size %dx%d\n", pics->high, pics->wide); + printf("Color\n"); + for (y = 0; y < pics->colors; ++y) { + if (fg_color(pics, y) < 0) { + printf(" %3d: %d\n", y, fg_color(pics, y)); + } else { + printf(" %3d: #%06x\n", y, fg_color(pics, y)); + } + } + for (y = 0; y < pics->high; ++y) { + for (x = 0; x < pics->wide; ++x) { + putchar(pics->cells[y * pics->wide + x].ch); + } + putchar('\n'); + } +} + +#ifndef USE_DISPLAY_DRIVER +static void +init_display(const char *palette_path, int opt_d) +{ + (void) opt_d; + if (isatty(fileno(stdout))) { + in_curses = TRUE; + setlocale(LC_ALL, ""); + initscr(); + cbreak(); + noecho(); + curs_set(0); + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (opt_d) + use_default_colors(); +#endif + init_palette(palette_path); + } + scrollok(stdscr, FALSE); + stop_curses(); + } +} + +static void +show_picture(PICS_HEAD * pics) +{ + int y, x; + int n; + + debugmsg("called show_picture"); + logmsg("...using %dx%d screen", LINES, COLS); +#if HAVE_RESET_COLOR_PAIRS + reset_color_pairs(); +#elif HAVE_CURSCR + wclear(curscr); + clear(); +#endif + if (has_colors()) { + logmsg("...using %d colors", pics->colors); + for (n = 0; n < pics->colors; ++n) { + int my_pair = (n + 1); + int my_color = map_color(fg_color(pics, n)); +#if USE_EXTENDED_COLORS + if (use_extended_pairs) { + init_extended_pair(my_pair, my_color, my_color); + } else +#endif + { + my_pair &= 0x7fff; + my_color &= 0x7fff; + init_pair((short) my_pair, (short) my_color, (short) my_color); + } + } + attrset(COLOR_PAIR(1)); + erase(); + } + for (y = 0; y < pics->high; ++y) { + if (y >= LINES) + break; + move(y, 0); + + for (x = 0; x < pics->wide; ++x) { + int my_pair; + + if (x >= COLS) + break; + n = (y * pics->wide + x); + my_pair = pics->cells[n].fg + 1; +#if USE_EXTENDED_COLORS + if (use_extended_pairs) { + cchar_t temp; + wchar_t wch[2]; + wch[0] = (wchar_t) pics->cells[n].ch; + wch[1] = 0; + setcchar(&temp, wch, A_NORMAL, (short) my_pair, &my_pair); + add_wch(&temp); + } else +#endif + { + attrset(COLOR_PAIR(my_pair)); + addch((chtype) pics->cells[n].ch); + } + } + } + if (slow_time >= 0) { + refresh(); + if (slow_time > 0) { +#ifdef NCURSES_VERSION + napms(1000 * slow_time); +#else + sleep((unsigned) slow_time); +#endif + } + } else { + wmove(stdscr, 0, 0); + getch(); + } + if (!quiet) + endwin(); +} +#endif + +static int +compare_fg_counts(const void *a, const void *b) +{ + const FG_NODE *p = (const FG_NODE *) a; + const FG_NODE *q = (const FG_NODE *) b; + return (q->count - p->count); +} + +static void +report_colors(PICS_HEAD * pics) +{ + int accum; + double level; + int j; + int shift; + int total; + char buffer[256]; + + if (logfp == 0) + return; + + qsort(pics->fgcol, (size_t) pics->colors, sizeof(FG_NODE), compare_fg_counts); + /* + * For debugging, show a (short) list of the colors used. + */ + if (debugging && (pics->colors < 1000)) { + int digits = 0; + int high; + int wide = 4; + for (j = pics->colors; j != 0; j /= 10) { + ++digits; + if (j < 10) + ++digits; + } + if (digits > 8) + digits = 8; + logmsg("These colors were used:"); + high = (pics->colors + wide - 1) / wide; + for (j = 0; j < high && j < pics->colors; ++j) { + int k; + char *s = buffer; + *s = '\0'; + for (k = 0; k < wide; ++k) { + int n = j + (k * high); + size_t want = (sizeof(buffer) - (size_t) (s - buffer)); + if (want < 100 || want >= sizeof(buffer)) + break; + if (n >= pics->colors) + break; + if (k) { + *s++ = ' '; + if (digits < 8) { + _nc_SPRINTF(s, _nc_SLIMIT(want) "%*s", 8 - digits, + " "); + s += strlen(s); + } + } + if (pics->fgcol[n].fgcol >= 0) { + _nc_SPRINTF(s, _nc_SLIMIT(want) "%3d #%06X %*d", n, + pics->fgcol[n].fgcol, + digits, pics->fgcol[n].count); + } else { + _nc_SPRINTF(s, _nc_SLIMIT(want) "%3d (empty) %*d", n, + digits, pics->fgcol[n].count); + } + s += strlen(s); + if ((s - buffer) > 100) + break; + } + logmsg("%s", buffer); + } + } + + /* + * Given the list of colors sorted by the number of times they are used, + * log a short report showing the number of colors for 90%, 99%, 99.9%, + * etc. + */ + logmsg("Number of colors versus number of cells"); + total = pics->high * pics->wide; + accum = 0; + level = 0.1; + shift = 1; + for (j = 0; j < pics->colors; ++j) { + accum += pics->fgcol[j].count; + if (accum >= (total * (1.0 - level))) { + int after = (shift > 2) ? shift - 2 : 0; + logmsg("%8d colors (%.1f%%) in %d cells (%.*f%%)", + j + 1, + (100.0 * (j + 1)) / pics->colors, + accum, + after, (100.0 * accum) / total); + if (accum >= total) + break; + level /= 10.0; + shift++; + } + } +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int opt_d = FALSE; + char ignore_ch; + const char *palette_path = 0; + const char *rgb_path = RGB_PATH; + + while ((ch = getopt(argc, argv, OPTS_COMMON "a:dLl:p:qr:s:x:")) != -1) { + switch (ch) { + case 'a': + if (sscanf(optarg, "%lf%c", &aspect_ratio, &ignore_ch) != 1 + || aspect_ratio < 0.1 + || aspect_ratio > 10.) { + fprintf(stderr, "Expected a number in [0.1 to 10.]: %s\n", optarg); + usage(FALSE); + } + break; +#if HAVE_USE_DEFAULT_COLORS + case 'd': + opt_d = TRUE; + break; +#endif + case 'L': + debugging = TRUE; + break; + case 'l': + if ((logfp = fopen(optarg, "a")) == 0) + failed(optarg); + break; + case 'p': + palette_path = optarg; + break; + case 'q': + quiet = TRUE; + break; + case 'r': + rgb_path = optarg; + break; + case 's': + slow_time = atoi(optarg); + break; +#if USE_EXTENDED_COLORS + case 'x': + { + const char *s = optarg; + while (*s) { + switch (*s++) { + case 'p': + use_extended_pairs = TRUE; + break; + case 'c': + use_extended_colors = TRUE; + break; + default: + usage(FALSE); + break; + } + } + } + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if (optind < argc) { + char **rgb_data = read_file(rgb_path); + int n; + + if (rgb_data) + rgb_table = parse_rgb(rgb_data); + + init_display(palette_path, opt_d); + if (optind >= argc) + giveup("expected at least one image filename"); + + for (n = optind; n < argc; ++n) { + PICS_HEAD *pics; + char **data = read_file(argv[n]); + + if (data == 0) { + warning("cannot read \"%s\"", argv[n]); + continue; + } + if ((pics = read_picture(argv[n], data)) != 0) { + if (in_curses) { + show_picture(pics); + } else { + dump_picture(pics); + } + report_colors(pics); + dispose_c_values(); + free_data(data); + free_pics_head(pics); + } + } + free_data(rgb_data); + free(rgb_table); + free(all_colors); + } else { + usage(FALSE); + } + + cleanup(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/picsmap.h b/contrib/ncurses/test/picsmap.h new file mode 100644 index 00000000..fc790a94 --- /dev/null +++ b/contrib/ncurses/test/picsmap.h @@ -0,0 +1,71 @@ +/**************************************************************************** + * Copyright 2020,2021 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey * + ****************************************************************************/ +/* $Id: picsmap.h,v 1.5 2021/04/24 23:25:17 tom Exp $ */ + +#ifndef PICSMAP_H_INCL +#define PICSMAP_H_INCL 1 + +typedef int NUM_COLOR; +typedef unsigned short NUM_COUNT; + +typedef struct { + char ch; /* nominal character to display */ + NUM_COLOR fg; /* foreground color */ +} PICS_CELL; + +typedef struct { + NUM_COLOR fgcol; + NUM_COUNT count; +} FG_NODE; + +typedef struct { + char *name; + short high; + short wide; + int colors; + FG_NODE *fgcol; + PICS_CELL *cells; +} PICS_HEAD; + +typedef struct { + const char *name; + int value; +} RGB_NAME; + +typedef struct { + short red; + short green; + short blue; +} RGB_DATA; + +#endif /* PICSMAP_H_INCL */ diff --git a/contrib/ncurses/test/popup_msg.c b/contrib/ncurses/test/popup_msg.c new file mode 100644 index 00000000..245bb587 --- /dev/null +++ b/contrib/ncurses/test/popup_msg.c @@ -0,0 +1,185 @@ +/**************************************************************************** + * Copyright 2018-2021,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: popup_msg.c,v 1.14 2024/10/26 19:28:11 Stas.Sergeev Exp $ + * + * Show a multi-line message in a window which may extend beyond the screen. + * + * Thomas Dickey - 2017/4/15. + */ + +#include + +#include + +#if HAVE_NEWPAD + +static WINDOW *old_window; + +static void +begin_popup(void) +{ + doupdate(); + old_window = dupwin(curscr); +} + +static void +end_popup(void) +{ + touchwin(old_window); + wnoutrefresh(old_window); + doupdate(); + delwin(old_window); +} + +/* + * Display a temporary window, e.g., to display a help-message. + */ +void +popup_msg(WINDOW *parent, NCURSES_CONST char *const *msg) +{ + int x0 = 4; + int y0 = 2; + int y1 = 0; + int y2 = 0; + int wide = getmaxx(parent) - ((x0 + 1) * 2); + int high = getmaxy(parent) - ((y0 + 1) * 2); + WINDOW *help; + WINDOW *data; + int n; + int width = 0; + int length; + int last_y; + int ch = ERR; + + for (n = 0; msg[n] != 0; ++n) { + int check = (int) strlen(msg[n]); + if (width < check) + width = check; + } + length = n; + + if ((help = newwin(high, wide, y0, x0)) == 0) + return; + if ((data = newpad(length + 2, width + 1)) == 0) { + delwin(help); + return; + } + + begin_popup(); + + keypad(data, TRUE); + + waddstr(data, "Press ^[ or ^Q to exit this window.\n\n"); + for (n = 0; n < length; ++n) { + waddstr(data, msg[n]); + if ((n + 1) < length) { + waddch(data, '\n'); + } + } + y2 = getcury(data); + last_y = (y2 - (high - 3)); + + do { + switch (ch) { + case KEY_HOME: + y1 = 0; + break; + case KEY_END: + y1 = last_y; + break; + case KEY_PREVIOUS: + case KEY_PPAGE: + if (y1 > 0) { + y1 -= high / 2; + if (y1 < 0) + y1 = 0; + } else { + beep(); + } + break; + case KEY_NEXT: + case KEY_NPAGE: + if (y1 < last_y) { + y1 += high / 2; + if (y1 > last_y) + y1 = last_y; + } else { + beep(); + } + break; + case CTRL('P'): + case KEY_UP: + if (y1 > 0) + --y1; + else + beep(); + break; + case CTRL('N'): + case KEY_DOWN: + if (y1 < last_y) + ++y1; + else + beep(); + break; + default: + beep(); + break; + case ERR: + break; + } + werase(help); + box(help, 0, 0); + wnoutrefresh(help); + pnoutrefresh(data, y1, 0, y0 + 1, x0 + 1, high, wide); + doupdate(); + } while ((ch = wgetch(data)) != ERR && ch != QUIT && ch != ESCAPE); + werase(help); + wrefresh(help); + delwin(help); + delwin(data); + + end_popup(); +} + +void +popup_msg2(WINDOW *parent, char **msg) +{ + popup_msg(parent, (NCURSES_CONST char *const *) msg); +} + +#else +void +popup_msg(WINDOW *parent, NCURSES_CONST char *const *msg) +{ + (void) parent; + (void) msg; + beep(); +} +#endif diff --git a/contrib/ncurses/test/popup_msg.h b/contrib/ncurses/test/popup_msg.h new file mode 100644 index 00000000..6b08fd78 --- /dev/null +++ b/contrib/ncurses/test/popup_msg.h @@ -0,0 +1,43 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: popup_msg.h,v 1.6 2024/10/06 21:17:54 tom Exp $ + * + * Utility functions for a popup-message or help-screen. + */ + +#ifndef POPUP_MSG_H_incl +#define POPUP_MSG_H_incl 1 + +#include + +extern void popup_msg(WINDOW *parent, NCURSES_CONST char *const *msg); +extern void popup_msg2(WINDOW *parent, char **msg); + +#endif /* POPUP_MSG_H_incl */ diff --git a/contrib/ncurses/test/programs b/contrib/ncurses/test/programs new file mode 100644 index 00000000..3f784d30 --- /dev/null +++ b/contrib/ncurses/test/programs @@ -0,0 +1,121 @@ +# $Id: programs,v 1.58 2024/06/29 18:49:58 tom Exp $ +############################################################################## +# Copyright 2018-2023,2024 Thomas E. Dickey # +# Copyright 2006-2016,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# +# Author: Thomas E. Dickey +# +# programs used for ncurses tests +back_ground $(LDFLAGS_CURSES) $(LOCAL_LIBS) back_ground dump_window +background $(LDFLAGS_CURSES) $(LOCAL_LIBS) background dump_window +blue $(LDFLAGS_CURSES) $(LOCAL_LIBS) blue +bs $(LDFLAGS_CURSES) $(LOCAL_LIBS) bs +cardfile $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) cardfile +chgat $(LDFLAGS_CURSES) $(LOCAL_LIBS) chgat popup_msg +clip_printw $(LDFLAGS_CURSES) $(LOCAL_LIBS) clip_printw popup_msg +color_content $(LDFLAGS_CURSES) $(LOCAL_LIBS) color_content +color_set $(LDFLAGS_CURSES) $(LOCAL_LIBS) color_set +combine $(LDFLAGS_CURSES) $(LOCAL_LIBS) combine dump_window popup_msg +demo_altkeys $(LDFLAGS_CURSES) $(LOCAL_LIBS) demo_altkeys +demo_defkey $(LDFLAGS_CURSES) $(LOCAL_LIBS) demo_defkey +demo_forms $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) demo_forms edit_field popup_msg +demo_keyok $(LDFLAGS_CURSES) $(LOCAL_LIBS) demo_keyok +demo_menus $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) demo_menus +demo_new_pair $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) demo_new_pair popup_msg +demo_panels $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) demo_panels +demo_tabs $(LDFLAGS_CURSES) $(LOCAL_LIBS) demo_tabs +demo_termcap $(LDFLAGS_TINFO) $(LOCAL_LIBS) demo_termcap +demo_terminfo $(LDFLAGS_TINFO) $(LOCAL_LIBS) demo_terminfo +ditto $(LDFLAGS_THREADS) $(LOCAL_LIBS) ditto +dots $(LDFLAGS_TINFO) $(LOCAL_LIBS) dots +dots_curses $(LDFLAGS_CURSES) $(LOCAL_LIBS) dots_curses +dots_mvcur $(LDFLAGS_CURSES) $(LOCAL_LIBS) dots_mvcur +dots_termcap $(LDFLAGS_TINFO) $(LOCAL_LIBS) dots_termcap +dots_xcurses $(LDFLAGS_CURSES) $(LOCAL_LIBS) dots_xcurses +dup_field $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) dup_field edit_field popup_msg +echochar $(LDFLAGS_CURSES) $(LOCAL_LIBS) echochar +extended_color $(LDFLAGS_CURSES) $(LOCAL_LIBS) extended_color +filter $(LDFLAGS_CURSES) $(LOCAL_LIBS) filter +firework $(LDFLAGS_CURSES) $(LOCAL_LIBS) firework +firstlast $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) firstlast +foldkeys $(LDFLAGS_CURSES) $(LOCAL_LIBS) foldkeys +form_driver_w $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) form_driver_w popup_msg +gdc $(LDFLAGS_CURSES) $(LOCAL_LIBS) gdc +hanoi $(LDFLAGS_CURSES_M) $(LOCAL_LIBS) hanoi +hashtest $(LDFLAGS_CURSES) $(LOCAL_LIBS) hashtest +inch_wide $(LDFLAGS_CURSES) $(LOCAL_LIBS) inch_wide popup_msg +inchs $(LDFLAGS_CURSES) $(LOCAL_LIBS) inchs popup_msg +ins_wide $(LDFLAGS_CURSES) $(LOCAL_LIBS) ins_wide +insdelln $(LDFLAGS_CURSES) $(LOCAL_LIBS) insdelln popup_msg +inserts $(LDFLAGS_CURSES) $(LOCAL_LIBS) inserts +key_names $(LDFLAGS_CURSES) $(LOCAL_LIBS) key_names +keynames $(LDFLAGS_CURSES) $(LOCAL_LIBS) keynames +knight $(LDFLAGS_CURSES) $(LOCAL_LIBS) knight +list_keys $(LDFLAGS_TINFO) $(LOCAL_LIBS) list_keys +lrtest $(LDFLAGS_CURSES) $(LOCAL_LIBS) lrtest +move_field $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) move_field edit_field popup_msg +movewindow $(LDFLAGS_CURSES) $(LOCAL_LIBS) movewindow popup_msg +ncurses $(LDFLAGS_DEFAULT) $(LOCAL_LIBS) ncurses +newdemo $(LDFLAGS_CURSES) $(LOCAL_LIBS) newdemo +padview $(LDFLAGS_CURSES) $(LOCAL_LIBS) padview popup_msg +pair_content $(LDFLAGS_CURSES) $(LOCAL_LIBS) pair_content +picsmap $(LDFLAGS_CURSES) $(LOCAL_LIBS) picsmap +railroad $(LDFLAGS_TINFO) $(LOCAL_LIBS) railroad +rain $(LDFLAGS_THREADS) $(LOCAL_LIBS) rain popup_msg +redraw $(LDFLAGS_CURSES) $(LOCAL_LIBS) redraw popup_msg +savescreen $(LDFLAGS_CURSES) $(LOCAL_LIBS) savescreen popup_msg +sp_tinfo $(LDFLAGS_TINFO) $(LOCAL_LIBS) sp_tinfo +tclock $(LDFLAGS_CURSES_M) $(LOCAL_LIBS) tclock +test_add_wchstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_add_wchstr +test_addchstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_addchstr +test_addstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_addstr +test_addwstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_addwstr +test_arrays $(LDFLAGS_TINFO) $(LOCAL_LIBS) test_arrays +test_delwin $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_delwin +test_endwin $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_endwin +test_get_wstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_get_wstr popup_msg +test_getstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_getstr popup_msg +test_instr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_instr popup_msg +test_inwstr $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_inwstr popup_msg +test_mouse $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_mouse +test_opaque $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_opaque +test_setupterm $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_setupterm +test_sgr $(LDFLAGS_TINFO) $(LOCAL_LIBS) test_sgr +test_termattrs $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_termattrs +test_tparm $(LDFLAGS_TINFO) $(LOCAL_LIBS) test_tparm +test_unget_wch $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_unget_wch +test_vid_puts $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_vid_puts +test_vidputs $(LDFLAGS_CURSES) $(LOCAL_LIBS) test_vidputs +testaddch $(LDFLAGS_CURSES) $(LOCAL_LIBS) testaddch +testcurs $(LDFLAGS_CURSES) $(LOCAL_LIBS) testcurs +testscanw $(LDFLAGS_CURSES) $(LOCAL_LIBS) testscanw +view $(LDFLAGS_CURSES) $(LOCAL_LIBS) view popup_msg +worm $(LDFLAGS_THREADS) $(LOCAL_LIBS) worm +xmas $(LDFLAGS_CURSES) $(LOCAL_LIBS) xmas + +# vile:makemode diff --git a/contrib/ncurses/test/railroad.c b/contrib/ncurses/test/railroad.c new file mode 100644 index 00000000..fa9590a2 --- /dev/null +++ b/contrib/ncurses/test/railroad.c @@ -0,0 +1,292 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 2000-2013,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey - 2000 + * + * $Id: railroad.c,v 1.27 2024/10/05 19:26:24 tom Exp $ + * + * A simple demo of the termcap interface. + */ +#define USE_TINFO +#include + +#if HAVE_TGETENT + +static char *wipeit; +static char *moveit; +static int length; +static int height; + +static char *finisC; +static char *finisS; +static char *finisU; + +static char *startC; +static char *startS; +static char *startU; + +static char *backup; + +static bool interrupted = FALSE; + +static +TPUTS_PROTO(outc, c) +{ + int rc = OK; + + if (interrupted) { + char tmp = (char) c; + if (write(STDOUT_FILENO, &tmp, (size_t) 1) == -1) + rc = ERR; + } else { + if (putc(c, stdout) == EOF) + rc = ERR; + } + TPUTS_RETURN(rc); +} + +static void +PutChar(int ch) +{ + putchar(ch); + fflush(stdout); + napms(moveit ? 10 : 50); /* not really termcap... */ +} + +static void +Backup(void) +{ + tputs(backup != 0 ? backup : "\b", 1, outc); +} + +static void +MyShowCursor(int flag) +{ + if (startC != 0 && finisC != 0) { + tputs(flag ? startC : finisC, 1, outc); + } +} + +static void +StandOut(int flag) +{ + if (startS != 0 && finisS != 0) { + tputs(flag ? startS : finisS, 1, outc); + } +} + +static void +Underline(int flag) +{ + if (startU != 0 && finisU != 0) { + tputs(flag ? startU : finisU, 1, outc); + } +} + +static void +ShowSign(char *string) +{ + const char *base = string; + int first, last; + + if (moveit != 0) { + tputs(tgoto(moveit, 0, height - 1), 1, outc); + tputs(wipeit, 1, outc); + } + + while (*string != 0) { + int ch = *string; + if (ch != ' ') { + if (moveit != 0) { + for (first = length - 2; first >= (string - base); first--) { + if (first < length - 1) { + tputs(tgoto(moveit, first + 1, height - 1), 1, outc); + PutChar(' '); + } + tputs(tgoto(moveit, first, height - 1), 1, outc); + PutChar(ch); + } + } else { + last = ch; + if (isalpha(ch)) { + first = isupper(ch) ? 'A' : 'a'; + } else if (isdigit(ch)) { + first = '0'; + } else { + first = ch; + } + if (first < last) { + Underline(1); + while (first < last) { + PutChar(first); + Backup(); + first++; + } + Underline(0); + } + } + if (moveit != 0) + Backup(); + } + StandOut(1); + PutChar(ch); + StandOut(0); + fflush(stdout); + string++; + } + if (moveit != 0) + tputs(wipeit, 1, outc); + putchar('\n'); +} + +static void +cleanup(void) +{ + Underline(0); + StandOut(0); + MyShowCursor(1); +} + +static void +onsig(int n GCC_UNUSED) +{ + interrupted = TRUE; + cleanup(); + ExitProgram(EXIT_FAILURE); +} + +static void +railroad(char **args) +{ + NCURSES_CONST char *name = getenv("TERM"); + char buffer[1024]; + char area[1024], *ap = area; + int z; + + if (name == 0) +#ifdef EXP_WIN32_DRIVER + name = "ms-terminal"; +#else + name = "dumb"; +#endif + + InitAndCatch(z = tgetent(buffer, name), onsig); + if (z >= 0) { + + wipeit = tgetstr("ce", &ap); + height = tgetnum("li"); + length = tgetnum("co"); + moveit = tgetstr("cm", &ap); + + if (wipeit == 0 + || moveit == 0 + || height <= 0 + || length <= 0) { + wipeit = 0; + moveit = 0; + height = 0; + length = 0; + } + + startS = tgetstr("so", &ap); + finisS = tgetstr("se", &ap); + + startU = tgetstr("us", &ap); + finisU = tgetstr("ue", &ap); + + backup = tgetstr("le", &ap); + + startC = tgetstr("ve", &ap); + finisC = tgetstr("vi", &ap); + + MyShowCursor(0); + + while (*args) { + ShowSign(*args++); + } + MyShowCursor(1); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: railroad [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if (optind < argc) { + railroad(argv + optind); + } else { + static char world[] = "Hello World"; + static char *hello[] = + {world, 0}; + railroad(hello); + } + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires termcap\n"); + exit(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/rain.c b/contrib/ncurses/test/rain.c new file mode 100644 index 00000000..06a5ff4f --- /dev/null +++ b/contrib/ncurses/test/rain.c @@ -0,0 +1,468 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 1998-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: rain.c,v 1.62 2024/10/06 21:09:00 tom Exp $ + */ +#include +#include + +/* rain 11/3/1980 EPS/CITHEP */ + +#ifdef USE_PTHREADS +#include +#endif + +WANT_USE_WINDOW(); + +#define MAX_THREADS 10 +#define MAX_DROP 5 + +struct DATA; + +typedef void (*DrawPart) (const struct DATA *); + +typedef struct DATA { + int y, x; +#ifdef USE_PTHREADS + DrawPart func; + int state; +#endif +} DATA; + +#ifdef USE_PTHREADS +pthread_cond_t cond_next_drop; +pthread_mutex_t mutex_drop_data; +pthread_mutex_t mutex_next_drop; +static int used_threads; + +typedef struct { + pthread_t myself; + long counter; +} STATS; + +static STATS drop_threads[MAX_THREADS]; +#endif + +#if HAVE_USE_WINDOW +static int +safe_wgetch(WINDOW *w, void *data GCC_UNUSED) +{ + return wgetch(w); +} +#endif + +static void +onsig(int n GCC_UNUSED) +{ + stop_curses(); + ExitProgram(EXIT_FAILURE); +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static int +random_x(void) +{ + return (int) (((double) (COLS - 4) * ranf()) + 2); +} + +static int +random_y(void) +{ + return (int) (((double) (LINES - 4) * ranf()) + 2); +} + +static int +next_j(int j) +{ + if (j == 0) + j = MAX_DROP - 1; + else + --j; + if (has_colors()) { + int z = (int) (3 * ranf()); + (void) attrset(AttrArg(COLOR_PAIR(z), (z ? A_BOLD : A_NORMAL))); + } + return j; +} + +static void +part1(const DATA * drop) +{ + MvAddCh(drop->y, drop->x, '.'); +} + +static void +part2(const DATA * drop) +{ + MvAddCh(drop->y, drop->x, 'o'); +} + +static void +part3(const DATA * drop) +{ + MvAddCh(drop->y, drop->x, 'O'); +} + +static void +part4(const DATA * drop) +{ + MvAddCh(drop->y - 1, drop->x, '-'); + MvAddStr(drop->y, drop->x - 1, "|.|"); + MvAddCh(drop->y + 1, drop->x, '-'); +} + +static void +part5(const DATA * drop) +{ + MvAddCh(drop->y - 2, drop->x, '-'); + MvAddStr(drop->y - 1, drop->x - 1, "/ \\"); + MvAddStr(drop->y, drop->x - 2, "| O |"); + MvAddStr(drop->y + 1, drop->x - 1, "\\ /"); + MvAddCh(drop->y + 2, drop->x, '-'); +} + +static void +part6(const DATA * drop) +{ + MvAddCh(drop->y - 2, drop->x, ' '); + MvAddStr(drop->y - 1, drop->x - 1, " "); + MvAddStr(drop->y, drop->x - 2, " "); + MvAddStr(drop->y + 1, drop->x - 1, " "); + MvAddCh(drop->y + 2, drop->x, ' '); +} + +#ifdef USE_PTHREADS +static void +napsome(void) +{ + napms(60); +} + +/* + * This runs inside the use_window() mutex. + */ +static int +really_draw(WINDOW *win, void *arg) +{ + DATA *data = (DATA *) arg; + + (void) win; + next_j(data->state); + data->func(data); + refresh(); + return OK; +} + +static void +draw_part(void (*func) (const DATA *), int state, DATA * data) +{ + data->func = func; + data->state = state; + use_window(stdscr, really_draw, (void *) data); + napsome(); +} + +/* + * Tell the threads that one of them can start work on a new raindrop. + * They may all be busy if we're sending requests too rapidly. + */ +static int +put_next_drop(void) +{ + pthread_cond_broadcast(&cond_next_drop); + pthread_mutex_unlock(&mutex_next_drop); + + return 0; +} + +/* + * Wait until we're assigned the task of drawing a new raindrop. + */ +static int +get_next_drop(void) +{ + pthread_mutex_lock(&mutex_next_drop); + pthread_cond_wait(&cond_next_drop, &mutex_next_drop); + + return TRUE; +} + +static void * +draw_drop(void *arg) +{ + DATA mydata; + int mystats; + + /* + * Find myself in the list of threads so we can count the number of loops. + */ + for (mystats = 0; mystats < MAX_THREADS; ++mystats) { +#if defined(_NC_WINDOWS_NATIVE) && !defined(__WINPTHREADS_VERSION) + if (drop_threads[mystats].myself.p == pthread_self().p) +#else + if (drop_threads[mystats].myself == pthread_self()) +#endif + break; + } + + do { + if (mystats < MAX_THREADS) + drop_threads[mystats].counter++; + + /* + * Make a copy of caller's data. We're cheating for the cases after + * the first loop since we still have a pointer into the main thread + * to the data which it uses for setting up this thread (but it has + * been modified to use different coordinates). + */ + pthread_mutex_lock(&mutex_drop_data); + mydata = *(DATA *) arg; + pthread_mutex_unlock(&mutex_drop_data); + + draw_part(part1, 0, &mydata); + draw_part(part2, 1, &mydata); + draw_part(part3, 2, &mydata); + draw_part(part4, 3, &mydata); + draw_part(part5, 4, &mydata); + draw_part(part6, 0, &mydata); + + } while (get_next_drop()); + + return NULL; +} + +/* + * The description of pthread_create() is misleading, since it implies that + * threads will exit cleanly after their function returns. + * + * Since they do not (and the number of threads is limited by system + * resources), make a limited number of threads, and signal any that are + * waiting when we want a thread past that limit. + */ +static int +start_drop(DATA * data) +{ + int rc; + + if (!used_threads) { + /* mutex and condition for signalling thread */ + pthread_mutex_init(&mutex_next_drop, NULL); + pthread_cond_init(&cond_next_drop, NULL); + } + + if (used_threads < MAX_THREADS) { + rc = pthread_create(&(drop_threads[used_threads].myself), + NULL, + draw_drop, + data); + ++used_threads; + } else { + rc = put_next_drop(); + } + return rc; +} +#endif + +static int +get_input(void) +{ + return USING_WINDOW1(stdscr, wgetch, safe_wgetch); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: rain [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " q/Q exit the program", + " s do single-step", + " undo single-step", + "", + 0 + }; + + bool done = FALSE; + DATA drop; +#ifndef USE_PTHREADS + DATA last[MAX_DROP]; +#endif + int j = 0; + int ch; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + + while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + InitAndCatch(initscr(), onsig); + if (has_colors()) { + int bg = COLOR_BLACK; + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() == OK)) + bg = -1; +#endif + init_pair(1, COLOR_BLUE, (short) bg); + init_pair(2, COLOR_CYAN, (short) bg); + } + nl(); + noecho(); + curs_set(0); + timeout(0); + +#ifdef USE_PTHREADS + pthread_mutex_init(&mutex_drop_data, NULL); +#else /* !USE_PTHREADS */ + for (j = MAX_DROP; --j >= 0;) { + last[j].x = random_x(); + last[j].y = random_y(); + } + j = 0; +#endif + + while (!done) { +#ifdef USE_PTHREADS + pthread_mutex_lock(&mutex_drop_data); + + drop.x = random_x(); + drop.y = random_y(); + + if (start_drop(&drop) != 0) { + beep(); + } + + pthread_mutex_unlock(&mutex_drop_data); +#else + drop.x = random_x(); + drop.y = random_y(); + + /* + * The non-threaded code draws parts of each drop on each loop. + */ + part1(&drop); + + part2(&last[j]); + + j = next_j(j); + part3(&last[j]); + + j = next_j(j); + part4(&last[j]); + + j = next_j(j); + part5(&last[j]); + + j = next_j(j); + part6(&last[j]); + + last[j] = drop; +#endif + + switch (get_input()) { + case ('q'): + case ('Q'): + done = TRUE; + break; + case 's': + nodelay(stdscr, FALSE); + break; + case ' ': + nodelay(stdscr, TRUE); + break; +#ifdef KEY_RESIZE + case (KEY_RESIZE): + break; +#endif + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + case ERR: + break; + default: + beep(); + } + napms(50); + } + stop_curses(); +#ifdef USE_PTHREADS + printf("Counts per thread:\n"); + for (j = 0; j < MAX_THREADS; ++j) + printf(" %d:%ld\n", j, drop_threads[j].counter); +#endif + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/redraw.c b/contrib/ncurses/test/redraw.c new file mode 100644 index 00000000..bdc7bdd8 --- /dev/null +++ b/contrib/ncurses/test/redraw.c @@ -0,0 +1,249 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2006-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: redraw.c,v 1.18 2024/10/06 21:17:54 tom Exp $ + * + * Demonstrate the redrawwin() and wredrawln() functions. + * Thomas Dickey - 2006/11/4 + */ + +#include +#include + +static void +trash(int beg_x, int max_x, int cur_x) +{ + int x; + + for (x = cur_x; x > beg_x; --x) { + putchar('\b'); + } + for (x = beg_x; x < max_x; ++x) { + if (x < cur_x) + putchar('<'); + else if (x == cur_x) + putchar('='); + else if (x > cur_x) + putchar('>'); + } + for (x = max_x; x > cur_x; --x) { + putchar('\b'); + } + fflush(stdout); +} + +static void +test_redraw(WINDOW *win) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " ^Q/ESC/q - quit", + " w - recur in a new window", + " ! - overwrite current line using stdio outside curses.", +#ifdef NCURSES_VERSION + " @ - run \"date\" command, to put its output on screen.", +#endif + " ^L - call redrawwin() for current window.", + " ^W - call wredrawln() for current line/current window.", + " arrow-keys - move cursor on the screen", + "", + "Other control characters are added to the screen in printable form.", + "Other printable characters are added to the screen as is.", + 0 + }; + + WINDOW *win1; + WINDOW *win2; + bool done = FALSE; + int max_y, max_x; + int beg_y, beg_x; + + assert(win != 0); + + scrollok(win, TRUE); + keypad(win, TRUE); + getmaxyx(win, max_y, max_x); + getbegyx(win, beg_y, beg_x); + + while (!done) { + int ch = wgetch(win); + int y, x; + + getyx(win, y, x); + switch (ch) { + case 'q': + /* FALLTHRU */ + case QUIT: + case ESCAPE: + done = TRUE; + break; + case 'w': + win1 = newwin(max_y, max_x, + beg_y, beg_x); + win2 = newwin(max_y - 2, max_x - 2, + beg_y + 1, beg_x + 1); + box(win1, 0, 0); + wrefresh(win1); + + test_redraw(win2); + + delwin(win2); + delwin(win1); + + touchwin(win); + break; + + case '!': + /* + * redrawwin() and wredrawln() do not take into account the + * possibility that the cursor may have moved. That makes them + * cumbersome for using with a shell command. So we simply + * trash the current line of the window using backspace/overwrite. + */ + trash(beg_x, max_x, x + beg_x); + break; + +#ifdef NCURSES_VERSION + case '@': + /* + * For a shell command, we can work around the problem noted above + * using mvcur(). It is ifdef'd for NCURSES, since X/Open does + * not define the case where the old location is unknown. + */ + IGNORE_RC(system("date")); + mvcur(-1, -1, y, x); + break; +#endif + + case CTRL('W'): + redrawwin(win); + break; + + case CTRL('L'): + wredrawln(win, y, 1); + break; + + case KEY_UP: + if (y > 0) + wmove(win, y - 1, x); + break; + + case KEY_DOWN: + if (y < max_y) + wmove(win, y + 1, x); + break; + + case KEY_LEFT: + if (x > 0) + wmove(win, y, x - 1); + break; + + case KEY_RIGHT: + if (x < max_x) + wmove(win, y, x + 1); + break; + + case HELP_KEY_1: + popup_msg(win, help); + break; + + default: + if (ch > KEY_MIN) { + waddstr(win, keyname(ch)); + waddch(win, '\n'); + } else { + waddstr(win, unctrl(UChar(ch))); + } + break; + } + wnoutrefresh(win); + doupdate(); + } +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: redraw [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -e use stderr (default stdout)" + ," -n do not initialize terminal" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + bool no_init = FALSE; + FILE *my_fp = stdout; + + while ((ch = getopt(argc, argv, OPTS_COMMON "en")) != -1) { + switch (ch) { + case 'e': + my_fp = stderr; + break; + case 'n': + no_init = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + if (no_init) { + START_TRACE(); + } else { + newterm((char *) 0, my_fp, stdin); + } + + raw(); + noecho(); + test_redraw(stdscr); + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/savescreen.c b/contrib/ncurses/test/savescreen.c new file mode 100644 index 00000000..878f9c3e --- /dev/null +++ b/contrib/ncurses/test/savescreen.c @@ -0,0 +1,663 @@ +/**************************************************************************** + * Copyright 2018-2022,2024 Thomas E. Dickey * + * Copyright 2006-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: savescreen.c,v 1.65 2024/10/06 21:10:09 tom Exp $ + * + * Demonstrate save/restore functions from the curses library. + * Thomas Dickey - 2007/7/14 + */ + +#define NEED_TIME_H +#include +#include +#include + +#if HAVE_SCR_DUMP + +#include +#include + +#if defined(__hpux) +#define MyMarker 'X' +#else +#define MyMarker ACS_DIAMOND +#endif + +#define MAX_ANSI 8 + +static bool use_init = FALSE; +static bool keep_dumps = FALSE; + +#if USE_WIDEC_SUPPORT +/* In HPUX curses, cchar_t is opaque; other implementations are not */ +static wchar_t +BaseChar(cchar_t data) +{ + wchar_t my_wchar[CCHARW_MAX]; + wchar_t result = 0; + attr_t my_attr; + short my_pair; + if (getcchar(&data, my_wchar, &my_attr, &my_pair, NULL) == OK) + result = my_wchar[0]; + return result; +} +#endif + +static int +fexists(const char *name) +{ + struct stat sb; + return (stat(name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFREG); +} + +static void +setup_next(void) +{ + curs_set(1); + reset_shell_mode(); +} + +static void +cleanup(char *files[]) +{ + if (!keep_dumps) { + int n; + + for (n = 0; files[n] != 0; ++n) { + unlink(files[n]); + } + } +} + +static int +load_screen(NCURSES_CONST char *filename) +{ + int result; + + if (use_init) { + if ((result = scr_init(filename)) != ERR) + result = scr_restore(filename); + } else { + result = scr_set(filename); + } + return result; +} + +/* + * scr_restore() or scr_set() operates on curscr. If we read a character using + * getch() that will refresh stdscr, wiping out the result. To avoid that, + * copy the data back from curscr to stdscr. + */ +static void +after_load(void) +{ + overwrite(curscr, stdscr); + doupdate(); +} + +static void +show_what(int color, int which, int last) +{ + int y, x, n; + time_t now; + char *mytime; + + getyx(stdscr, y, x); + + move(0, 0); + printw("Color %d. Saved %d of %d (? for help)", color, which, last + 1); + + now = time((time_t *) 0); + mytime = ctime(&now); + for (n = (int) strlen(mytime) - 1; n >= 0; --n) { + if (isspace(UChar(mytime[n]))) { + mytime[n] = '\0'; + } else { + break; + } + } + mvprintw(0, (COLS - n - 2), " %s", mytime); + + move(y, x); + + refresh(); +} + +static int +get_command(int color, int which, int last) +{ + int ch; + + timeout(50); + + do { + show_what(color, which, last); + ch = getch(); + } while (ch == ERR); + + return ch; +} + +static int +dump_screen(char **files, int color, int which, int last, bool use_colors) +{ +#if USE_WIDEC_SUPPORT + cchar_t mycc; +#endif + NCURSES_CONST char *filename = files[which]; + bool dumped = FALSE; + + if (filename != 0) { + dumped = TRUE; + show_what(color, ++which, last); + if (scr_dump(filename) == ERR) { + endwin(); + printf("Cannot write screen-dump %s\n", filename); + cleanup(files); + ExitProgram(EXIT_SUCCESS); + } + if (use_colors) { + int cx, cy; + int pair = 1 + (which % MAX_ANSI); + /* + * Change the background color, to make it more obvious. But that + * changes the existing text-color. Copy the old values from the + * currently displayed screen. + */ + bkgd((chtype) COLOR_PAIR(pair)); + for (cy = 1; cy < LINES; ++cy) { + for (cx = 0; cx < COLS; ++cx) { + wmove(curscr, cy, cx); + wmove(stdscr, cy, cx); +#if USE_WIDEC_SUPPORT + if (win_wch(curscr, &mycc) != ERR) { + int myxx = wcwidth(BaseChar(mycc)); + if (myxx > 0) { + wadd_wchnstr(stdscr, &mycc, 1); + cx += (myxx - 1); + } + } +#else + waddch(stdscr, winch(curscr)); +#endif + } + } + } + } + return dumped; +} + +static void +editor_help(void) +{ + static NCURSES_CONST char *msgs[] = + { + "You are now in the screen-editor, which allows you to make some", + "lines on the screen, as well as save copies of the screen to a", + "temporary file", + "", + "Keys:", + " q quit", + " n run the screen-loader to show the saved screens", + " dump a screen", + "", + " a toggle between '#' and graphic symbol for drawing", + " c change color drawn by line to next in palette", + " h,j,k,l or arrows to move around the screen, drawing", + 0 + }; + popup_msg(stdscr, msgs); +} + +static void +replay_help(void) +{ + static NCURSES_CONST char *msgs[] = + { + "You are now in the screen-loader, which allows you to view", + "the dumped/restored screens.", + "", + "Keys:", + " q quit", + " load the next screen", + " load the previous screen", + 0 + }; + popup_msg(stdscr, msgs); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: savescreen [-r] files" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f file fill/initialize screen using text from this file" + ," -i use scr_init/scr_restore rather than scr_set" + ," -k keep the restored dump-files rather than removing them" + ," -r replay the screen-dump files" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int which = 0; + int last; + bool use_colors = FALSE; + bool replaying = FALSE; + bool done = FALSE; + char **files; + NCURSES_CONST char *fill_by = 0; +#if USE_WIDEC_SUPPORT + cchar_t mycc; + static const wchar_t mywc[2] = + {L'#', 0}; +#endif + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:ikr")) != -1) { + switch (ch) { + case 'f': + fill_by = optarg; + break; + case 'i': + use_init = TRUE; + break; + case 'k': + keep_dumps = TRUE; + break; + case 'r': + replaying = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + files = argv + optind; + last = argc - optind - 1; + + if (replaying) { + while (last >= 0 && !fexists(files[last])) + --last; + } + + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + curs_set(0); + + if (has_colors() && (start_color() == OK) && COLORS >= MAX_ANSI) { +#if USE_WIDEC_SUPPORT + bool using_rgb = FALSE; +#endif + static const struct { + int fg, bg; + } table[MAX_ANSI] = { +#define DATA(fg,bg) { COLOR_##fg, COLOR_##bg } + DATA(RED, WHITE), + DATA(GREEN, WHITE), + DATA(YELLOW, BLACK), + DATA(BLUE, WHITE), + DATA(MAGENTA, WHITE), + DATA(MAGENTA, BLACK), + DATA(CYAN, WHITE), + DATA(CYAN, BLACK), +#undef DATA + }; + int n; + int pair = 1; + + use_colors = TRUE; + /* + * Discounting color-pair 0 (no color), make the next 8 color pairs + * useful for leaving a visually distinct trail of characters on the + * screen. + */ + for (n = 0; n < MAX_ANSI; ++n) { + init_pair((short) pair++, (short) table[n].fg, (short) table[n].bg); + } + /* + * After that, use color pairs for constructing a test-pattern, e.g., + * imitating xterm's scripts. + */ + if (fill_by == 0) { + if (COLORS <= 256) { + for (n = 0; n < COLORS; ++n) + init_pair((short) (n + MAX_ANSI), (short) n, (short) n); + } +#if HAVE_TIGETSTR && USE_WIDEC_SUPPORT + else { + int r_max, g_max, b_max; + + if (parse_rgb(&r_max, &g_max, &b_max) > 0) { + int rows = LINES - 1; + int cols = COLS - 1; + int b_delta = (b_max / rows); + int r_delta = (r_max / cols); + int g_delta = (g_max / cols); + int row = 0; + int b = 0; + + using_rgb = TRUE; + while (row++ < rows) { + int col = 0; + int r = 0; + int g = g_max; + while (col++ < cols) { + int color = (((r * (g_max + 1)) + g) * (b_max + 1) + + b + MAX_ANSI); +#if USE_EXTENDED_COLOR + init_extended_pair(pair, color, color); +#else + init_pair(pair, color, color); +#endif + pair++; + r += r_delta; + g -= g_delta; + } + b += b_delta; + } + } + } +#endif + } + if ((fill_by == 0) && !replaying) { +#if USE_WIDEC_SUPPORT + int cube = 0; +#endif + /* + * Originally (before wide-characters) ncurses supported 16 colors. + */ + if (COLORS >= 16 && COLORS <= 256) { + mvprintw(2, 0, "System colors:\n"); + for (n = 0; n < 16; ++n) { + pair = n + MAX_ANSI; + addch((chtype) (' ' | COLOR_PAIR(pair))); + addch((chtype) (' ' | COLOR_PAIR(pair))); + if (((n + 1) % 8) == 0) + addch('\n'); + } + } + /* + * Even with ncurses, you need wide-character support to have more + * than 16 colors. + */ +#if USE_WIDEC_SUPPORT + if (COLORS == 88) { + cube = 4; + } else if (COLORS == 256) { + cube = 6; + } + if (cube != 0) { + int r, g, b; + int cube0 = 16; + int cube1 = cube0 + (cube * cube * cube); + + addch('\n'); + printw("Color cube, %dx%dx%d:\n", cube, cube, cube); + for (g = 0; g < cube; g++) { + for (r = 0; r < cube; r++) { + for (b = 0; b < cube; b++) { + pair = MAX_ANSI + + 16 + + (r * cube * cube) + (g * cube) + b; + setcchar(&mycc, mywc, 0, (short) pair, NULL); + add_wch(&mycc); + add_wch(&mycc); + } + addch(' '); + } + addch('\n'); + } + addch('\n'); + printw("Grayscale ramp:\n"); + for (n = cube1; n < COLORS; ++n) { + pair = n + MAX_ANSI; + setcchar(&mycc, mywc, 0, (short) pair, NULL); + add_wch(&mycc); + add_wch(&mycc); + } + } else if ((COLORS > 256) && using_rgb) { + int rows = LINES - 1; + int cols = COLS - 1; + int row = 0; + + pair = MAX_ANSI; + while (row++ < rows) { + int col = 0; + while (col++ < cols) { + setcchar(&mycc, mywc, 0, (short) pair, &pair); + add_wch(&mycc); + ++pair; + } + addch('\n'); + } + addch('\n'); + } +#endif + } + } + + if (fill_by != 0) { + FILE *fp = fopen(fill_by, "r"); + if (fp != 0) { + bool filled = FALSE; + move(1, 0); + while ((ch = fgetc(fp)) != EOF) { + if (addch(UChar(ch)) == ERR) { + filled = TRUE; + break; + } + } + fclose(fp); + if (!filled) { + while (addch(' ') != ERR) { + ; + } + } + move(0, 0); + } else { + stop_curses(); + fprintf(stderr, "Cannot open \"%s\"\n", fill_by); + ExitProgram(EXIT_FAILURE); + } + } + + if (replaying) { + + /* + * Use the last file as the initial/current screen. + */ + if (last < 0) { + stop_curses(); + printf("No screen-dumps given\n"); + ExitProgram(EXIT_FAILURE); + } + + which = last; + if (load_screen(files[which]) == ERR) { + stop_curses(); + printf("Cannot load screen-dump %s\n", files[which]); + ExitProgram(EXIT_FAILURE); + } + after_load(); + + while (!done && (ch = getch()) != ERR) { + switch (ch) { + case 'n': + /* + * If we got a "next" here, skip to the final screen before + * moving to the next process. + */ + setup_next(); + which = last; + done = TRUE; + break; + case 'q': + cleanup(files); + done = TRUE; + break; + case KEY_BACKSPACE: + case '\b': + if (--which < 0) + which = last; + break; + case ' ': + if (++which > last) + which = 0; + break; + case HELP_KEY_1: + replay_help(); + break; + default: + beep(); + continue; + } + + if (ch == 'q') { + ; + } else if (scr_restore(files[which]) == ERR) { + endwin(); + printf("Cannot load screen-dump %s\n", files[which]); + cleanup(files); + ExitProgram(EXIT_FAILURE); + } else { + wrefresh(curscr); + } + } + endwin(); + } else { + int y = 0; + int x = 0; + int color = 0; + int altchars = 0; + bool dirty = use_colors || (fill_by != 0); + + while (!done) { + switch (get_command(color, which, last)) { + case 'n': + if (dirty && files[which]) { + dump_screen(files, color, which, last, use_colors); + } + setup_next(); + done = TRUE; + break; + case 'q': + cleanup(files); + done = TRUE; + break; + case ' ': + if (dump_screen(files, color, which, last, use_colors)) { + which = (which + 1) % MAX_ANSI; + dirty = FALSE; + } else { + setup_next(); + done = TRUE; + } + break; + case KEY_LEFT: + case 'h': + if (--x < 0) + x = COLS - 1; + break; + case KEY_DOWN: + case 'j': + if (++y >= LINES) + y = 1; + break; + case KEY_UP: + case 'k': + if (--y < 1) + y = LINES - 1; + break; + case KEY_RIGHT: + case 'l': + if (++x >= COLS) + x = 0; + break; + case 'a': + altchars = !altchars; + break; + case 'c': + if (use_colors) { + color = (color + 1) % MAX_ANSI; + } + break; + case HELP_KEY_1: + editor_help(); + break; + default: + beep(); + continue; + } + if (!done) { + chtype attr = A_REVERSE; + chtype ch2 = (altchars ? MyMarker : '#'); + if (use_colors) { + attr |= (chtype) COLOR_PAIR(color); + } + move(y, x); + AddCh(ch2 | attr); + move(y, x); + dirty = TRUE; + } + } + endwin(); + } + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the screen-dump functions\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/savescreen.sh b/contrib/ncurses/test/savescreen.sh new file mode 100755 index 00000000..1ffab2fc --- /dev/null +++ b/contrib/ncurses/test/savescreen.sh @@ -0,0 +1,67 @@ +#!/bin/sh +############################################################################## +# Copyright 2020,2022 Thomas E. Dickey # +# Copyright 2007-2009,2018 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: savescreen.sh,v 1.8 2022/07/16 16:34:34 tom Exp $ +# +# Use this script to exercise "savescreen". +# It starts by generating a series of temporary-filenames, which are passed +# to the test-program. Loop as long as the first file named exists. + +: "${TMPDIR:=/tmp}" + +# "mktemp -d" would be preferable, but is not standard. +MY_DIR=$TMPDIR/savescreen$$ +trap "rm -rf $MY_DIR; exit 1" 1 2 3 +trap "rm -rf $MY_DIR" 0 +umask 077 +mkdir $MY_DIR || exit 1 + +PARAMS= +NFILES=4 +PREFIX=$MY_DIR/savescreen +n=0 +BEGINS=$PREFIX-$n.tmp +while test $n != $NFILES +do + LATEST=$PREFIX-$n.tmp + PARAMS="$PARAMS $LATEST" + n=`expr $n + 1` +done + +${0%.sh} $PARAMS +if test -f $BEGINS +then + while test -f $BEGINS + do + "${0%.sh}" -r $PARAMS + test $? != 0 && break + done +else + echo "No screens were saved" +fi diff --git a/contrib/ncurses/test/sp_tinfo.c b/contrib/ncurses/test/sp_tinfo.c new file mode 100644 index 00000000..72b20cfb --- /dev/null +++ b/contrib/ncurses/test/sp_tinfo.c @@ -0,0 +1,359 @@ +/**************************************************************************** + * Copyright 2019-2022,2023 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: sp_tinfo.c,v 1.29 2023/06/24 14:14:56 tom Exp $ + * + * TOTO: add option for non-sp-funcs interface + */ + +#define USE_TINFO +#include + +#if HAVE_TPUTS_SP +/* + * The higher-level curses library stores a TERMINAL* inside SCREEN, but the + * latter is opaque. This structure helps us keep the two associated. + */ +typedef struct { + const char *name; + FILE *fp; + SCREEN *sp; + TERMINAL *term; + int (*outc) (SCREEN *, int); +} MYDATA; + +static bool opt_n = FALSE; /* true to suppress new_prescr */ +static bool opt_t = FALSE; /* true to use termcap */ + +static int +my_outc(SCREEN *sp, int ch) +{ + (void) sp; + return fputc(ch, stdout); +} + +static int +my_errc(SCREEN *sp, int ch) +{ + (void) sp; + return fputc(ch, stderr); +} + +static MYDATA * +initialize(const char *name, FILE *output) +{ + MYDATA *result = typeCalloc(MYDATA, 1); + int error; + + result->fp = output; + result->name = name; + result->outc = (fileno(output) == 1) ? my_outc : my_errc; + result->sp = opt_n ? NULL : new_prescr(); + + if (opt_t) { + char *temp = strdup(name); + tgetent_sp(result->sp, temp, name); + free(temp); + } else { + setupterm((NCURSES_CONST char *) name, fileno(output), &error); + } + result->term = cur_term; + + return result; +} + +static void +show_flag(MYDATA * data, const char *name, int value) +{ + if (value < 0) { + fprintf(data->fp, " %s = (unknown)\n", name); + } else if (value == 0) { + fprintf(data->fp, " %s = false\n", name); + } else { + fprintf(data->fp, " %s = true\n", name); + } +} + +#define TC_PARMS data->sp, (NCURSES_CONST char *)tc +#define TI_PARMS data->sp, (NCURSES_CONST char *)ti + +static void +show_cap_flag(MYDATA * data, const char *ti, const char *tc) +{ + const char *name = (opt_t ? tc : ti); + show_flag(data, name, (opt_t + ? tgetflag_sp(TC_PARMS) + : tigetflag_sp(TI_PARMS))); +} + +static void +show_number(MYDATA * data, const char *name, int value) +{ + if (value <= -2) { + fprintf(data->fp, " %s = (unknown)\n", name); + } else if (value <= -1) { + fprintf(data->fp, " %s = (missing)\n", name); + } else { + fprintf(data->fp, " %s = %d\n", name, value); + } +} + +static void +show_cap_number(MYDATA * data, const char *ti, const char *tc) +{ + const char *name = (opt_t ? tc : ti); + show_number(data, name, (opt_t + ? tgetnum_sp(TC_PARMS) + : tigetnum_sp(TI_PARMS))); +} + +static void +show_string(MYDATA * data, const char *name, const char *value) +{ + fprintf(data->fp, " %s = ", name); + if (value == 0) { + fprintf(data->fp, "(missing)"); + } else if (value == (char *) -1) { + fprintf(data->fp, "(canceled)"); + } else { + int ch; + while ((ch = UChar(*value++)) != '\0') { + if (ch < 32) { + fprintf(data->fp, "^%c", ch | '@'); + } else if (ch == 127) { + fprintf(data->fp, "^?"); + } else if (ch > 127) { + fprintf(data->fp, "\\%03o", ch); + } else { + fprintf(data->fp, "%c", ch); + } + } + } + fprintf(data->fp, "\n"); +} + +static void +show_cap_string(MYDATA * data, const char *ti, const char *tc) +{ + const char *name = (opt_t ? tc : ti); + char tcapjunk[1024]; + char *tcap_ptr = tcapjunk; + show_string(data, name, (opt_t + ? tgetstr_sp(TC_PARMS, &tcap_ptr) + : tigetstr_sp(TI_PARMS))); +} + +static void +show_char(MYDATA * data, const char *name, int value) +{ + if (value < 0) { + show_string(data, name, "(missing)"); + } else { + char temp[2]; + temp[0] = (char) value; + temp[1] = '\0'; + show_string(data, name, temp); + } +} + +static void +do_stuff(MYDATA * data) +{ + SCREEN *sp = data->sp; +#if NCURSES_EXT_FUNCS + char *s; + int my_code = 1234; + const char *my_text = "\033[?m"; +#endif + + set_curterm_sp(sp, data->term); + + /* putp always goes to standard output */ + putp_sp(sp, "Hello "); + putp_sp(sp, data->name); + putp_sp(sp, "!\n"); + + fprintf(data->fp, "Term: %s\n", termname_sp(sp)); + fprintf(data->fp, "Long: %s\n", longname_sp(sp)); + show_cap_flag(data, "am", "am"); + show_cap_number(data, "lines", "li"); + show_cap_string(data, "clear", "cl"); + show_cap_string(data, "tbc", "ct"); + show_flag(data, "has_ic", has_ic_sp(sp)); + show_flag(data, "has_il", has_il_sp(sp)); + show_number(data, "baudrate", baudrate_sp(sp)); + show_char(data, "erase ch", erasechar_sp(sp)); + show_char(data, "kill ch", killchar_sp(sp)); + show_string(data, "unctrl", unctrl_sp(sp, 033)); + fflush(data->fp); + +#if NCURSES_EXT_FUNCS + define_key_sp(sp, my_text, my_code); + has_key_sp(sp, 0); + key_defined_sp(sp, my_text); + if ((s = keybound_sp(sp, my_code, 0)) != 0) + free(s); +#endif + keyname_sp(sp, '?'); +#if NCURSES_EXT_FUNCS + keyok_sp(sp, my_code, FALSE); + keyok_sp(sp, my_code, TRUE); +#endif + + savetty_sp(sp); + + def_shell_mode_sp(sp); + + /* + * These functions are low-level settings for ncurses. + */ +#if NCURSES_EXT_FUNCS + set_tabsize_sp(sp, 5); /* waddch */ +#endif + typeahead_sp(sp, FALSE); /* waddch */ + use_env_sp(sp, FALSE); /* newterm */ + use_tioctl_sp(sp, FALSE); /* newterm */ + intrflush_sp(sp, 0, 0); /* wgetch */ + flushinp_sp(sp); /* waddch */ + halfdelay_sp(sp, 5); /* wgetch */ + + /* + * These manipulate the terminal modes, mainly for wgetch. + */ + cbreak_sp(sp); + raw_sp(sp); + def_prog_mode_sp(sp); + + delay_output_sp(sp, 200); + + napms_sp(sp, 10); + + nocbreak_sp(sp); + noqiflush_sp(sp); + noraw_sp(sp); + qiflush_sp(sp); + + resetty_sp(sp); + + tputs_sp(sp, "{reset-mode}\n", 0, data->outc); + + reset_prog_mode_sp(sp); + + curs_set_sp(sp, 0); + tputs_sp(sp, "{prog-mode}\n", 0, data->outc); + + reset_shell_mode_sp(sp); + + tputs_sp(sp, "{shell-mode}\n", 0, data->outc); +} + +static void +cleanup(MYDATA * data) +{ + set_curterm(data->term); + del_curterm(data->term); + free(data); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: sp_tinfo [output] [error]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -n suppress call to new_prescr()" + ," -t use termcap functions rather than terminfo" + }; + size_t n; + for (n = 0; n < SIZEOF(tbl); ++n) { + fprintf(stderr, "%s\n", tbl[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + MYDATA *my_out; + MYDATA *my_err; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON "nt")) != -1) { + switch (ch) { + case 'n': + opt_n = TRUE; + break; + case 't': + opt_t = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + argv += (optind - 1); + argc -= (optind - 1); + + if (argc > 3) + usage(FALSE); + + my_out = initialize((argc > 1) ? argv[1] : "vt100", stdout); + my_err = initialize((argc > 2) ? argv[2] : "ansi", stderr); + + do_stuff(my_out); + do_stuff(my_err); + + if (my_out != my_err) { + cleanup(my_out); + cleanup(my_err); + } else { + cleanup(my_out); + } + + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + fprintf(stderr, + "This program requires the low-level ncurses sp-funcs tputs_sp\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/tclock.c b/contrib/ncurses/test/tclock.c new file mode 100644 index 00000000..8491c5ef --- /dev/null +++ b/contrib/ncurses/test/tclock.c @@ -0,0 +1,299 @@ +/* $Id: tclock.c,v 1.49 2024/10/05 18:47:56 tom Exp $ */ + +#define NEED_TIME_H +#include + +#if HAVE_MATH_H && HAVE_MATH_FUNCS + +#include + +/* + tclock - analog/digital clock for curses. + If it gives you joy, then + (a) I'm glad + (b) you need to get out more :-) + + This program is copyright Howard Jones, September 1994 + (ha.jones@ic.ac.uk). It may be freely distributed as + long as this copyright message remains intact, and any + modifications are clearly marked as such. [In fact, if + you modify it, I wouldn't mind the modifications back, + especially if they add any nice features. A good one + would be a precalc table for the 60 hand positions, so + that the floating point stuff can be ditched. As I said, + it was a 20 hackup minute job.] + + COMING SOON: tfishtank. Be the envy of your mac-owning + colleagues. +*/ + +/* To compile: cc -o tclock tclock.c -lcurses -lm */ + +#ifndef PI +#define PI 3.141592654 +#endif + +#define sign(_x) (_x<0?-1:1) + +#define ASPECT 2.2 +#define ROUND(value) ((int)((value) + 0.5)) + +#define A2X(angle,radius) ROUND(ASPECT * radius * sin(angle)) +#define A2Y(angle,radius) ROUND(radius * cos(angle)) + +/* Plot a point */ +static void +plot(int x, int y, int col) +{ + MvAddCh(y, x, (chtype) col); +} + +/* Draw a diagonal(arbitrary) line using Bresenham's algorithm. */ +static void +dline(int pair, int from_x, int from_y, int x2, int y2, int ch) +{ + int dx, dy; + int ax, ay; + int sx, sy; + int x, y; + int d; + + if (has_colors()) + (void) attrset(AttrArg(COLOR_PAIR(pair), 0)); + + dx = x2 - from_x; + dy = y2 - from_y; + + ax = abs(dx * 2); + ay = abs(dy * 2); + + sx = sign(dx); + sy = sign(dy); + + x = from_x; + y = from_y; + + if (ax > ay) { + d = ay - (ax / 2); + + while (1) { + plot(x, y, ch); + if (x == x2) + return; + + if (d >= 0) { + y += sy; + d -= ax; + } + x += sx; + d += ay; + } + } else { + d = ax - (ay / 2); + + while (1) { + plot(x, y, ch); + if (y == y2) + return; + + if (d >= 0) { + x += sx; + d -= ay; + } + y += sy; + d += ax; + } + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: tclock [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static TimeType initial; + + int i, cx, cy; + double cr, mradius, hradius, mangle, hangle; + double sangle, sradius, hours; + int hdx, hdy; + int mdx, mdy; + int sdx, sdy; + int ch; + int lastbeep = -1; + bool odd = FALSE; + time_t tim; + const struct tm *t; + char szChar[20]; + char *text; + short my_bg = COLOR_BLACK; + TimeType current; +#if HAVE_USE_DEFAULT_COLORS + bool d_option = FALSE; +#endif + + while ((ch = getopt(argc, argv, OPTS_COMMON "d")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + d_option = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + initscr(); + noecho(); + cbreak(); + nodelay(stdscr, TRUE); + curs_set(0); + + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (d_option && (use_default_colors() == OK)) + my_bg = -1; +#endif + init_pair(1, COLOR_RED, my_bg); + init_pair(2, COLOR_MAGENTA, my_bg); + init_pair(3, COLOR_GREEN, my_bg); + init_pair(4, COLOR_WHITE, COLOR_BLUE); + } +#ifdef KEY_RESIZE + keypad(stdscr, TRUE); + restart: +#endif + cx = (COLS - 1) / 2; /* 39 */ + cy = LINES / 2; /* 12 */ + if (cx / ASPECT < cy) + cr = cx / ASPECT; + else + cr = cy; + sradius = (5 * cr) / 6; /* 10 */ + mradius = (3 * cr) / 4; /* 9 */ + hradius = cr / 2; /* 6 */ + + for (i = 0; i < 12; i++) { + sangle = (i + 1) * (2.0 * PI) / 12.0; + sdx = A2X(sangle, sradius); + sdy = A2Y(sangle, sradius); + _nc_SPRINTF(szChar, _nc_SLIMIT(sizeof(szChar)) "%d", i + 1); + + MvAddStr(cy - sdy, cx + sdx, szChar); + } + + MvAddStr(0, 0, "ASCII Clock by Howard Jones (ha.jones@ic.ac.uk),1994"); + + sradius = (4 * sradius) / 5; + for (;;) { + napms(100); + + tim = time(0); + t = localtime(&tim); + + hours = (t->tm_hour + (t->tm_min / 60.0)); + if (hours > 12.0) + hours -= 12.0; + + mangle = ((t->tm_min + (t->tm_sec / 60.0)) * (2 * PI) / 60.0); + mdx = A2X(mangle, mradius); + mdy = A2Y(mangle, mradius); + + hangle = ((hours) * (2.0 * PI) / 12.0); + hdx = A2X(hangle, hradius); + hdy = A2Y(hangle, hradius); + + GetClockTime(¤t); + + sangle = (ElapsedSeconds(&initial, ¤t) * (2.0 * PI) / 60.0); + sdx = A2X(sangle, sradius); + sdy = A2Y(sangle, sradius); + + dline(3, cx, cy, cx + mdx, cy - mdy, '#'); + + (void) attrset(A_REVERSE); + dline(2, cx, cy, cx + hdx, cy - hdy, '.'); + attroff(A_REVERSE); + + if (has_colors()) + (void) attrset(AttrArg(COLOR_PAIR(1), 0)); + + dline(1, cx, cy, cx + sdx, cy - sdy, 'O'); + + if (has_colors()) + (void) attrset(AttrArg(COLOR_PAIR(0), 0)); + + text = ctime(&tim); + MvPrintw(2, 0, "%.*s", (int) (strlen(text) - 1), text); + refresh(); + if ((t->tm_sec % 5) == 0 + && t->tm_sec != lastbeep) { + lastbeep = t->tm_sec; + if (has_colors()) { + odd = !odd; + bkgd((chtype) (odd ? COLOR_PAIR(4) : COLOR_PAIR(0))); + } + beep(); + } + + if ((ch = getch()) != ERR) { +#ifdef KEY_RESIZE + if (ch == KEY_RESIZE) { + flash(); + erase(); + wrefresh(curscr); + goto restart; + } +#endif + break; + } + + dline(0, cx, cy, cx + hdx, cy - hdy, ' '); + dline(0, cx, cy, cx + mdx, cy - mdy, ' '); + dline(0, cx, cy, cx + sdx, cy - sdy, ' '); + + } + + stop_curses(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the header math.h and trignometric functions\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/terminal.xbm b/contrib/ncurses/test/terminal.xbm new file mode 100644 index 00000000..b8d9204b --- /dev/null +++ b/contrib/ncurses/test/terminal.xbm @@ -0,0 +1,52 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** name of Evans & Sutherland not be used in advertising or publi- **/ +/** city pertaining to distribution of the software without specif- **/ +/** ic, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND DISCLAIMS ALL WARRANTIES WITH REGARD TO **/ +/** THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILI- **/ +/** TY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND BE LIABLE **/ +/** FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAM- **/ +/** AGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, **/ +/** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS **/ +/** ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PER- **/ +/** FORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ + +#define xterm_width 48 +#define xterm_height 48 +static char xterm_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x20, 0xfe, 0xff, 0xff, 0x1f, 0x05, + 0x20, 0x01, 0x00, 0x00, 0x20, 0x09, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x11, + 0xa0, 0xfc, 0xff, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0xfc, 0x01, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0xfc, 0xff, 0x3f, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0xfc, 0x03, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0xfc, 0xff, 0x01, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0xfc, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0x21, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x11, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0x11, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x09, + 0xa0, 0x00, 0x00, 0x00, 0x40, 0x09, 0xa0, 0x00, 0x00, 0x00, 0x40, 0x05, + 0x20, 0x01, 0x00, 0x00, 0x20, 0x05, 0x20, 0xfe, 0xff, 0xff, 0x1f, 0x03, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xa0, 0xaa, 0xaa, 0xaa, 0x2a, 0x03, 0x10, 0x00, 0x00, 0x00, 0x80, 0x02, + 0x50, 0x55, 0x55, 0x55, 0x95, 0x02, 0x08, 0x00, 0x00, 0x00, 0x40, 0x02, + 0xa8, 0xaa, 0xaa, 0xaa, 0x4a, 0x02, 0x04, 0x00, 0x00, 0x00, 0x20, 0x01, + 0xb4, 0xff, 0xff, 0xff, 0xad, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/contrib/ncurses/test/test.priv.h b/contrib/ncurses/test/test.priv.h new file mode 100644 index 00000000..f495a698 --- /dev/null +++ b/contrib/ncurses/test/test.priv.h @@ -0,0 +1,1356 @@ +/**************************************************************************** + * Copyright 2018-2023,2024 Thomas E. Dickey * + * Copyright 1998-2017,2018 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Thomas E. Dickey 1996-on * + ****************************************************************************/ +/* $Id: test.priv.h,v 1.220 2024/10/05 19:01:00 tom Exp $ */ + +#ifndef __TEST_PRIV_H +#define __TEST_PRIV_H 1 + +#include + +/* + * Fix ifdef's that look for the form/menu/panel libraries, if we are building + * with wide-character ncurses. + */ +#ifdef HAVE_LIBFORMW +#define HAVE_LIBFORMW 1 +#define HAVE_LIBFORM 1 +#endif + +#ifdef HAVE_LIBMENUW +#define HAVE_LIBMENUW 1 +#define HAVE_LIBMENU 1 +#endif + +#ifdef HAVE_LIBPANELW +#define HAVE_LIBPANELW 1 +#define HAVE_LIBPANEL 1 +#endif + +/* + * Fallback definitions to accommodate broken compilers. + */ +#ifndef HAVE_ALLOC_PAIR +#define HAVE_ALLOC_PAIR 0 +#endif + +#ifndef HAVE_ASSUME_DEFAULT_COLORS +#define HAVE_ASSUME_DEFAULT_COLORS 0 +#endif + +#ifndef HAVE_CFMAKERAW +#define HAVE_CFMAKERAW 0 +#endif + +#ifndef HAVE_CHGAT +#define HAVE_CHGAT 0 +#endif + +#ifndef HAVE_CLOCK_GETTIME +#define HAVE_CLOCK_GETTIME 0 +#endif + +#ifndef HAVE_COLOR_CONTENT +#define HAVE_COLOR_CONTENT 0 +#endif + +#ifndef HAVE_COPYWIN +#define HAVE_COPYWIN 0 +#endif + +#ifndef HAVE_COLOR_SET +#define HAVE_COLOR_SET 0 +#endif + +#ifndef HAVE_BSD_STRING_H +#define HAVE_BSD_STRING_H 0 +#endif + +#ifndef HAVE_CURSES_VERSION +#define HAVE_CURSES_VERSION 0 +#endif + +#ifndef HAVE_CURSCR +#define HAVE_CURSCR 0 +#endif + +#ifndef HAVE_DELSCREEN +#define HAVE_DELSCREEN 0 +#endif + +#ifndef HAVE_DUPWIN +#define HAVE_DUPWIN 0 +#endif + +#ifndef HAVE_FILTER +#define HAVE_FILTER 0 +#endif + +#ifndef HAVE_FORM_H +#define HAVE_FORM_H 0 +#endif + +#ifndef HAVE_GETBEGX +#define HAVE_GETBEGX 0 +#endif + +#ifndef HAVE_GETCURX +#define HAVE_GETCURX 0 +#endif + +#ifndef HAVE_GETMAXX +#define HAVE_GETMAXX 0 +#endif + +#ifndef HAVE_GETTIMEOFDAY +#define HAVE_GETTIMEOFDAY 0 +#endif + +#ifndef HAVE_GETOPT_H +#define HAVE_GETOPT_H 0 +#endif + +#ifndef HAVE_GETPARX +#define HAVE_GETPARX 0 +#endif + +#ifndef HAVE_GETWIN +#define HAVE_GETWIN 0 +#endif + +#ifndef HAVE_HALFDELAY +#define HAVE_HALFDELAY 0 +#endif + +#ifndef HAVE_INIT_EXTENDED_COLOR +#define HAVE_INIT_EXTENDED_COLOR 0 +#endif + +#ifndef HAVE_LIBFORM +#define HAVE_LIBFORM 0 +#endif + +#ifndef HAVE_LIBMENU +#define HAVE_LIBMENU 0 +#endif + +#ifndef HAVE_LIBPANEL +#define HAVE_LIBPANEL 0 +#endif + +#ifndef HAVE_LANGINFO_CODESET +#define HAVE_LANGINFO_CODESET 0 +#endif + +#ifndef HAVE_LOCALE_H +#define HAVE_LOCALE_H 0 +#endif + +#ifndef HAVE_MATH_FUNCS +#define HAVE_MATH_FUNCS 0 +#endif + +#ifndef HAVE_MATH_H +#define HAVE_MATH_H 0 +#endif + +#ifndef HAVE_MENU_H +#define HAVE_MENU_H 0 +#endif + +#ifndef HAVE_MVDERWIN +#define HAVE_MVDERWIN 0 +#endif + +#ifndef HAVE_MVVLINE +#define HAVE_MVVLINE 0 +#endif + +#ifndef HAVE_MVWIN +#define HAVE_MVWIN 0 +#endif + +#ifndef HAVE_MVWVLINE +#define HAVE_MVWVLINE 0 +#endif + +#ifndef HAVE_NAPMS +#define HAVE_NAPMS 1 +#endif + +#ifndef HAVE_NC_ALLOC_H +#define HAVE_NC_ALLOC_H 0 +#endif + +#ifndef HAVE_NEWPAD +#define HAVE_NEWPAD 0 +#endif + +#ifndef HAVE_PANEL_H +#define HAVE_PANEL_H 0 +#endif + +#ifndef HAVE_PUTWIN +#define HAVE_PUTWIN 0 +#endif + +#ifndef HAVE_RESET_COLOR_PAIRS +#define HAVE_RESET_COLOR_PAIRS 0 +#endif + +#ifndef HAVE_RESIZE_TERM +#define HAVE_RESIZE_TERM 0 +#endif + +#ifndef HAVE_RESTARTTERM +#define HAVE_RESTARTTERM 0 +#endif + +#ifndef HAVE_RIPOFFLINE +#define HAVE_RIPOFFLINE 0 +#endif + +#ifndef HAVE_SCR_DUMP +#define HAVE_SCR_DUMP 0 +#endif + +#ifndef HAVE_SETUPTERM +#define HAVE_SETUPTERM 0 +#endif + +#ifndef HAVE_SLK_COLOR +#define HAVE_SLK_COLOR 0 +#endif + +#ifndef HAVE_SLK_INIT +#define HAVE_SLK_INIT 0 +#endif + +#ifndef HAVE_STDINT_H +#define HAVE_STDINT_H 0 +#endif + +#ifndef HAVE_STDNORETURN_H +#define HAVE_STDNORETURN_H 0 +#endif + +#ifndef HAVE_STRSTR +#define HAVE_STRSTR 0 +#endif + +#ifndef HAVE_SYS_IOCTL_H +#define HAVE_SYS_IOCTL_H 0 +#endif + +#ifndef HAVE_SYS_SELECT_H +#define HAVE_SYS_SELECT_H 0 +#endif + +#ifndef HAVE_TERMATTRS +#define HAVE_TERMATTRS 0 +#endif + +#ifndef HAVE_TERMIOS_H +#define HAVE_TERMIOS_H 0 +#endif + +#ifndef HAVE_TERMNAME +#define HAVE_TERMNAME 0 +#endif + +#ifndef HAVE_TERM_ENTRY_H +#define HAVE_TERM_ENTRY_H 0 +#endif + +#ifndef HAVE_TGETENT +#define HAVE_TGETENT 0 +#endif + +#ifndef HAVE_TIGETNUM +#define HAVE_TIGETNUM 0 +#endif + +#ifndef HAVE_TIGETSTR +#define HAVE_TIGETSTR 0 +#endif + +#ifndef HAVE_TIPARM +#define HAVE_TIPARM 0 +#endif + +#ifndef HAVE_TIPARM_S +#define HAVE_TIPARM_S 0 +#endif + +#ifndef HAVE_TISCAN_S +#define HAVE_TISCAN_S 0 +#endif + +#ifndef HAVE_TPUTS_SP +#define HAVE_TPUTS_SP 0 +#endif + +#ifndef HAVE_TSEARCH +#define HAVE_TSEARCH 0 +#endif + +#ifndef HAVE_TYPEAHEAD +#define HAVE_TYPEAHEAD 0 +#endif + +#ifndef HAVE_WINSSTR +#define HAVE_WINSSTR 0 +#endif + +#ifndef HAVE_UNGET_WCH +#define HAVE_UNGET_WCH 0 +#endif + +#ifndef HAVE_USE_DEFAULT_COLORS +#define HAVE_USE_DEFAULT_COLORS 0 +#endif + +#ifndef HAVE_USE_ENV +#define HAVE_USE_ENV 0 +#endif + +#ifndef HAVE_USE_EXTENDED_NAMES +#define HAVE_USE_EXTENDED_NAMES 0 +#endif + +#ifndef HAVE_USE_SCREEN +#define HAVE_USE_SCREEN 0 +#endif + +#ifndef HAVE_USE_WINDOW +#define HAVE_USE_WINDOW 0 +#endif + +#ifndef HAVE_VIDPUTS +#define HAVE_VIDPUTS 0 +#endif + +#ifndef HAVE_VID_PUTS +#define HAVE_VID_PUTS 0 +#endif + +#ifndef HAVE_WINSDELLN +#define HAVE_WINSDELLN 0 +#endif + +#ifndef HAVE_WRESIZE +#define HAVE_WRESIZE 0 +#endif + +#ifndef HAVE__TRACEF +#define HAVE__TRACEF 0 +#endif + +#ifndef NCURSES_EXT_FUNCS +#define NCURSES_EXT_FUNCS 0 +#endif + +#ifndef NEED_PTEM_H +#define NEED_PTEM_H 0 +#endif + +#ifndef NEED_WCHAR_H +#define NEED_WCHAR_H 0 +#endif + +#ifndef NO_LEAKS +#define NO_LEAKS 0 +#endif + +#ifndef HAVE__NC_TPARM_ANALYZE +#define HAVE__NC_TPARM_ANALYZE 0 +#endif + +/* + * Workaround for HPUX + */ +#if defined(__hpux) && !defined(NCURSES_VERSION) +#define _ACS_COMPAT_CODE /* needed for acs_map vs __acs_map */ +#endif + +#include +#include +#include +#include +#include + +#if HAVE_UNISTD_H +#include +#endif + +#include /* include before curses.h to work around glibc bug */ + +#if NEED_WCHAR_H +#include +#ifdef HAVE_LIBUTF8_H +#include +#endif +#endif + +#if defined(HAVE_XCURSES) +#include +#elif defined(HAVE_NCURSESW_NCURSES_H) +#include +#elif defined(HAVE_NCURSES_NCURSES_H) +#include +#else +#include +#endif + +#if HAVE_STDNORETURN_H && !defined(NCURSES_VERSION) +#include +#undef GCC_NORETURN +#define GCC_NORETURN _Noreturn +#endif + +#if !(defined(NCURSES_WGETCH_EVENTS) && defined(NEED_KEY_EVENT)) +#undef KEY_EVENT /* reduce compiler-warnings with Visual C++ */ +#endif + +#if defined(HAVE_XCURSES) || defined(PDCURSES) +/* no other headers */ +#undef HAVE_SETUPTERM /* nonfunctional */ +#define HAVE_SETUPTERM 0 +#undef HAVE_TGETENT /* nonfunctional */ +#define HAVE_TGETENT 0 +#undef HAVE_TIGETSTR /* nonfunctional */ +#define HAVE_TIGETSTR 0 +#elif defined(HAVE_NCURSESW_TERM_H) +#include +#elif defined(HAVE_NCURSES_TERM_H) +#include +#elif defined(HAVE_TERM_H) +#include +#endif + +/* + * Not all curses.h implementations include unctrl.h, + */ +#if defined(HAVE_NCURSESW_UNCTRL_H) +#include +#elif defined(HAVE_NCURSES_UNCTRL_H) +#include +#elif defined(HAVE_UNCTRL_H) +#include +#endif + +#if HAVE_GETOPT_H +#include +#elif !defined(HAVE_GETOPT_HEADER) +/* 'getopt()' may be prototyped in , but declaring its variables + * doesn't hurt. + */ +extern char *optarg; +extern int optind; +#endif /* HAVE_GETOPT_H */ + +#if HAVE_LOCALE_H +#include +#else +#define setlocale(name,string) /* nothing */ +#endif + +#include +#include + +#if HAVE_STDINT_H +#include +#define my_intptr_t intptr_t +#else +#define my_intptr_t long +#endif + +#if defined(_MSC_VER) +#undef popen +#define popen(s,n) _popen(s,n) +#undef pclose +#define pclose(s) _pclose(s) +#endif + +#ifndef GCC_NORETURN +#define GCC_NORETURN /* nothing */ +#endif +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(a,b) /* nothing */ +#endif +#ifndef GCC_SCANFLIKE +#define GCC_SCANFLIKE(a,b) /* nothing */ +#endif +#ifndef GCC_UNUSED +#define GCC_UNUSED /* nothing */ +#endif + +#ifndef HAVE_GETNSTR +#define getnstr(s,n) getstr(s) +#endif + +#if HAVE_INIT_EXTENDED_COLOR +#define USE_EXTENDED_COLOR 1 +#else +#define USE_EXTENDED_COLOR 0 +#endif + +#ifndef USE_SOFTKEYS +#if HAVE_SLK_INIT +#define USE_SOFTKEYS 1 +#else +#define USE_SOFTKEYS 0 +#endif +#endif + +#if !USE_SOFTKEYS +#define slk_init() /* nothing */ +#define slk_restore() /* nothing */ +#define slk_clear() /* nothing */ +#endif + +#ifndef HAVE_CURSES_DATA_TABSIZE +#define HAVE_CURSES_DATA_TABSIZE 0 +#endif + +#if !NCURSES_EXT_FUNCS +#if HAVE_CURSES_DATA_TABSIZE +#define set_tabsize(n) TABSIZE = (n) +#else +#define set_tabsize(n) /* nothing */ +#endif +#endif + +#if HAVE_TPUTS_SP +#define USE_SP_FUNCS 1 +#else +#define USE_SP_FUNCS 0 +#endif + +#ifndef HAVE_WSYNCDOWN +#define wsyncdown(win) /* nothing */ +#endif + +#ifndef USE_WIDEC_SUPPORT +#if (defined(_XOPEN_SOURCE_EXTENDED) \ + || (defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 >= 500)) \ + || (defined(NCURSES_WIDECHAR) && (NCURSES_WIDECHAR - 0 < 1))) \ + && defined(WACS_ULCORNER) +#define USE_WIDEC_SUPPORT 1 +#else +#define USE_WIDEC_SUPPORT 0 +#endif +#endif + +#if HAVE_PANEL_H && HAVE_LIBPANEL +#define USE_LIBPANEL 1 +#else +#define USE_LIBPANEL 0 +#endif + +#if HAVE_MENU_H && HAVE_LIBMENU +#define USE_LIBMENU 1 +#else +#define USE_LIBMENU 0 +#endif + +#if HAVE_FORM_H && HAVE_LIBFORM +#define USE_LIBFORM 1 +#else +#define USE_LIBFORM 0 +#endif + +/* workaround, to build against NetBSD's variant of the form library */ +#ifdef HAVE_NETBSD_FORM_H +#define form_getyx(form, y, x) y = (int)current_field(form)->cursor_ypos, x = (int)current_field(form)->cursor_xpos +#define form_field_row(field) (field)->form_row +#define form_field_col(field) (field)->form_col +#else /* e.g., SVr4, ncurses */ +#define form_getyx(form, y, x) y = (int)(form)->currow, x = (int)(form)->curcol +#define form_field_row(field) (field)->frow +#define form_field_col(field) (field)->fcol +#endif + +/* workaround, to build against NetBSD's variant of the form library */ +#ifdef HAVE_NETBSD_MENU_H +#define menu_itemwidth(menu) (menu)->max_item_width +#else +#define menu_itemwidth(menu) (menu)->itemlen +#endif + +#ifndef HAVE_TYPE_ATTR_T +#if !USE_WIDEC_SUPPORT && !defined(attr_t) +#define attr_t chtype +#endif +#endif + +#undef NCURSES_CH_T +#if !USE_WIDEC_SUPPORT +#define NCURSES_CH_T chtype +#else +#define NCURSES_CH_T cchar_t +#endif + +#ifndef NCURSES_COLOR_T +#define NCURSES_COLOR_T short +#endif + +#ifndef NCURSES_PAIRS_T +#define NCURSES_PAIRS_T short +#endif + +#ifndef CCHARW_MAX +#define CCHARW_MAX 5 +#endif + +#if defined(NCURSES_VERSION) && defined(CURSES_WACS_ARRAY) && !defined(CURSES_WACS_SYMBOLS) +#define CURSES_WACS_SYMBOLS +#endif + +#if defined(CURSES_WACS_ARRAY) && !defined(CURSES_WACS_SYMBOLS) +/* NetBSD 5.1 defines these incorrectly */ +#undef WACS_RARROW +#undef WACS_LARROW +#undef WACS_UARROW +#undef WACS_DARROW +#undef WACS_BLOCK +#undef WACS_DIAMOND +#undef WACS_CKBOARD +#undef WACS_DEGREE +#undef WACS_PLMINUS +#undef WACS_BOARD +#undef WACS_LANTERN +#undef WACS_LRCORNER +#undef WACS_URCORNER +#undef WACS_ULCORNER +#undef WACS_LLCORNER +#undef WACS_PLUS +#undef WACS_HLINE +#undef WACS_S1 +#undef WACS_S9 +#undef WACS_LTEE +#undef WACS_RTEE +#undef WACS_BTEE +#undef WACS_TTEE +#undef WACS_VLINE +#undef WACS_BULLET +#undef WACS_S3 +#undef WACS_S7 +#undef WACS_LEQUAL +#undef WACS_GEQUAL +#undef WACS_PI +#undef WACS_NEQUAL +#undef WACS_STERLING + +#define WACS_RARROW &(CURSES_WACS_ARRAY['+']) +#define WACS_LARROW &(CURSES_WACS_ARRAY[',']) +#define WACS_UARROW &(CURSES_WACS_ARRAY['-']) +#define WACS_DARROW &(CURSES_WACS_ARRAY['.']) +#define WACS_BLOCK &(CURSES_WACS_ARRAY['0']) +#define WACS_DIAMOND &(CURSES_WACS_ARRAY['`']) +#define WACS_CKBOARD &(CURSES_WACS_ARRAY['a']) +#define WACS_DEGREE &(CURSES_WACS_ARRAY['f']) +#define WACS_PLMINUS &(CURSES_WACS_ARRAY['g']) +#define WACS_BOARD &(CURSES_WACS_ARRAY['h']) +#define WACS_LANTERN &(CURSES_WACS_ARRAY['i']) +#define WACS_LRCORNER &(CURSES_WACS_ARRAY['j']) +#define WACS_URCORNER &(CURSES_WACS_ARRAY['k']) +#define WACS_ULCORNER &(CURSES_WACS_ARRAY['l']) +#define WACS_LLCORNER &(CURSES_WACS_ARRAY['m']) +#define WACS_PLUS &(CURSES_WACS_ARRAY['n']) +#define WACS_HLINE &(CURSES_WACS_ARRAY['q']) +#define WACS_S1 &(CURSES_WACS_ARRAY['o']) +#define WACS_S9 &(CURSES_WACS_ARRAY['s']) +#define WACS_LTEE &(CURSES_WACS_ARRAY['t']) +#define WACS_RTEE &(CURSES_WACS_ARRAY['u']) +#define WACS_BTEE &(CURSES_WACS_ARRAY['v']) +#define WACS_TTEE &(CURSES_WACS_ARRAY['w']) +#define WACS_VLINE &(CURSES_WACS_ARRAY['x']) +#define WACS_BULLET &(CURSES_WACS_ARRAY['~']) +#define WACS_S3 &(CURSES_WACS_ARRAY['p']) +#define WACS_S7 &(CURSES_WACS_ARRAY['r']) +#define WACS_LEQUAL &(CURSES_WACS_ARRAY['y']) +#define WACS_GEQUAL &(CURSES_WACS_ARRAY['z']) +#define WACS_PI &(CURSES_WACS_ARRAY['{']) +#define WACS_NEQUAL &(CURSES_WACS_ARRAY['|']) +#define WACS_STERLING &(CURSES_WACS_ARRAY['}']) +#endif + +#ifndef WA_NORMAL +#define WA_NORMAL A_NORMAL +#endif +#ifndef WA_BOLD +#define WA_BOLD A_BOLD +#endif +#ifndef WA_REVERSE +#define WA_REVERSE A_REVERSE +#endif +#ifndef WA_UNDERLINE +#define WA_UNDERLINE A_UNDERLINE +#endif +#ifndef WA_BLINK +#define WA_BLINK A_BLINK +#endif + +#ifndef OK +#define OK (0) +#endif + +#ifndef ERR +#define ERR (-1) +#endif + +#undef CTRL +#define CTRL(x) ((x) & 0x1f) + +#define QUIT CTRL('Q') +#define ESCAPE CTRL('[') + +#ifndef KEY_MIN +#define KEY_MIN 256 /* not defined in Solaris 8 */ +#endif + +#define HELP_KEY_1 '?' +#define HELP_KEY_2 KEY_F(1) + +/* our "standard" options for getopt, needed for help2man */ +#define OPTS_USAGE 'h' +#define OPTS_VERSION 'V' +#define OPTS_COMMON "hV" +#define USAGE_COMMON \ + "Common options:"\ +," -h show this message"\ +," -V show version of curses" + +#if HAVE_CURSES_VERSION +#define format_version(buffer, size) strcpy(buffer, curses_version()) +#elif defined(NCURSES_VERSION_MAJOR) && defined(NCURSES_VERSION_MINOR) && defined(NCURSES_VERSION_PATCH) +#define format_version(buffer, size) \ + _nc_SPRINTF(buffer, _nc_SLIMIT(size) "ncurses %d.%d.%d", \ + NCURSES_VERSION_MAJOR, \ + NCURSES_VERSION_MINOR, \ + NCURSES_VERSION_PATCH) +#else +#define format_version(buffer, size) strcpy(buffer, "ncurses-examples") +#endif + +#define VERSION_COMMON() \ +static char *version_common(char **argv) { \ + const char *base = argv[0]; \ + const char *part = strrchr(base, '/'); \ + size_t need = strlen(base) + 80; \ + char *result = malloc(need); \ + if (result != NULL) { \ + if (part++ == NULL) part = base; \ + _nc_SPRINTF(result, _nc_SLIMIT(need) "%.20s: ", part); \ + format_version(result + strlen(result), need - strlen(result)); \ + } \ + return result; \ +} \ +static void show_version(char **argv) { \ + char *value = version_common(argv); \ + if (value != NULL) { \ + puts(value); \ + free(value); \ + } \ +} + +/* from nc_string.h, to make this stand alone */ +#if HAVE_BSD_STRING_H +#include +#endif + +#ifdef __cplusplus +#define NCURSES_VOID /* nothing */ +#else +#define NCURSES_VOID (void) +#endif + +#ifndef HAVE_STRLCAT +#define HAVE_STRLCAT 0 +#endif + +#ifndef HAVE_STRLCPY +#define HAVE_STRLCPY 0 +#endif + +#ifndef HAVE_SNPRINTF +#define HAVE_SNPRINTF 0 +#endif + +#ifndef HAVE_STRDUP +#define HAVE_STRDUP 0 +#endif + +#ifndef USE_STRING_HACKS +#define USE_STRING_HACKS 0 +#endif + +#ifndef HAVE_STRSTR +#define HAVE_STRSTR 0 +#endif + +#ifndef NCURSES_CAST +#ifdef __cplusplus +extern "C" { +#define NCURSES_CAST(type,value) static_cast(value) +#else +#define NCURSES_CAST(type,value) (type)(value) +#endif +#endif + +#if USE_STRING_HACKS && HAVE_STRLCAT +#define _nc_STRCAT(d,s,n) NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,n)) +#define _nc_STRNCAT(d,s,m,n) NCURSES_VOID strlcat((d),(s),NCURSES_CAST(size_t,m)) +#else +#define _nc_STRCAT(d,s,n) NCURSES_VOID strcat((d),(s)) +#define _nc_STRNCAT(d,s,m,n) NCURSES_VOID strncat((d),(s),(n)) +#endif + +#if USE_STRING_HACKS && HAVE_STRLCPY +#define _nc_STRCPY(d,s,n) NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n)) +#define _nc_STRNCPY(d,s,n) NCURSES_VOID strlcpy((d),(s),NCURSES_CAST(size_t,n)) +#else +#define _nc_STRCPY(d,s,n) NCURSES_VOID strcpy((d),(s)) +#define _nc_STRNCPY(d,s,n) NCURSES_VOID strncpy((d),(s),(n)) +#endif + +#if USE_STRING_HACKS && HAVE_SNPRINTF +#define _nc_SPRINTF NCURSES_VOID (snprintf) +#define _nc_SLIMIT(n) NCURSES_CAST(size_t,n), +#else +#define _nc_SPRINTF NCURSES_VOID (sprintf) +#define _nc_SLIMIT(n) /* nothing */ +#endif + +/* + * X/Open Curses does not define the arrays of terminfo/termcap names as SVr4 + * curses did, and some implementations provide them anyway, but undeclared. + */ +#ifdef DECL_CURSES_DATA_BOOLNAMES +extern char *boolnames[], *boolcodes[], *boolfnames[]; +extern char *numnames[], *numcodes[], *numfnames[]; +extern char *strnames[], *strcodes[], *strfnames[]; +#endif + +/* + * Again, an SVr4 curses feature latent in the libraries but not in headers. + */ +#ifndef DECL_CURSES_DATA_TABSIZE +#define DECL_CURSES_DATA_TABSIZE 0 +#endif + +#if DECL_CURSES_DATA_TABSIZE +extern int TABSIZE; +#undef HAVE_CURSES_DATA_TABSIZE +#define HAVE_CURSES_DATA_TABSIZE 1 +#endif + +#ifndef HAVE_CURSES_DATA_TABSIZE +#define HAVE_CURSES_DATA_TABSIZE 0 +#endif + +/* + * X/Open Curses provides termname(), whose return value is analogous to the + * SVr4 curses variable ttytype[]. + */ +#ifndef HAVE_CURSES_DATA_TTYTYPE +#define HAVE_CURSES_DATA_TTYTYPE 0 +#endif + +#ifndef DECL_CURSES_DATA_TTYTYPE +#define DECL_CURSES_DATA_TTYTYPE 0 +#endif + +#if !defined(ttytype) && (!HAVE_CURSES_DATA_TTYTYPE || DECL_CURSES_DATA_TTYTYPE) +#define ttytype termname() +#endif + +#define colored_chtype(ch, attr, pair) \ + ((chtype) (ch) | (chtype) (attr) | (chtype) COLOR_PAIR(pair)) + +/* + * Workaround for HPUX + */ +#if defined(__hpux) && !defined(NCURSES_VERSION) +#define getbegx(w) __getbegx(w) +#define getbegy(w) __getbegy(w) +#define getcurx(w) __getcurx(w) +#define getcury(w) __getcury(w) +#define getmaxx(w) __getmaxx(w) +#define getmaxy(w) __getmaxy(w) +#define getparx(w) __getparx(w) +#define getpary(w) __getpary(w) +#endif + +/* + * Workaround in case getcchar() returns a positive value when the source + * string produces only a L'\0'. + */ +#define TEST_CCHAR(s, then_stmt, else_stmt) \ + if (getcchar(s, NULL, NULL, NULL, NULL) > 0) { \ + wchar_t test_wch[CCHARW_MAX + 2]; \ + attr_t test_attrs; \ + NCURSES_PAIRS_T test_pair; \ + \ + if (getcchar( s, test_wch, &test_attrs, &test_pair, NULL) == OK \ + && test_wch[0] != L'\0') { \ + then_stmt \ + } else { \ + else_stmt \ + } \ + } else { \ + else_stmt \ + } +/* + * These usually are implemented as macros, but may be functions. + */ +#if !defined(getcurx) && !HAVE_GETCURX +#define getcurx(win) ((win) ? ((int)(win)->_curx) : ERR) +#define getcury(win) ((win) ? ((int)(win)->_cury) : ERR) +#endif + +#if !defined(getbegx) && !HAVE_GETBEGX +#define getbegx(win) ((win) ? ((int)(win)->_begx) : ERR) +#define getbegy(win) ((win) ? ((int)(win)->_begy) : ERR) +#endif + +#if !defined(getmaxx) && !HAVE_GETMAXX +#define getmaxx(win) ((win) ? ((int)(win)->_maxx + 1) : ERR) +#define getmaxy(win) ((win) ? ((int)(win)->_maxy + 1) : ERR) +#endif + +/* + * Solaris 10 xpg4: +#define __m_getparx(w) ((w)->_parent == (WINDOW *) 0 ? -1 \ + : (w)->_begx - (w)->_parent->_begx) + */ +#if !defined(getparx) && !HAVE_GETPARX +#ifdef __m_getparx +#define getparx(win) __m_getparx(win) +#define getpary(win) __m_getpary(win) +#else +#define getparx(win) ((win)?((win)->_parx + 1):ERR) +#define getpary(win) ((win)?((win)->_pary + 1):ERR) +#endif +#endif + +#if !defined(mvwvline) && !HAVE_MVWVLINE +#define mvwvline(w,y,x,ch,n) (move(y,x) == ERR ? ERR : wvline(w,ch,n)) +#define mvwhline(w,y,x,ch,n) (move(y,x) == ERR ? ERR : whline(w,ch,n)) +#endif + +#if !defined(mvvline) && !HAVE_MVVLINE +#define mvvline(y,x,ch,n) (move(y,x) == ERR ? ERR : vline(ch,n)) +#define mvhline(y,x,ch,n) (move(y,x) == ERR ? ERR : hline(ch,n)) +#endif + +/* + * Try to accommodate curses implementations that have no terminfo support. + */ +#if HAVE_TIGETNUM +#define TIGETNUM(ti,tc) tigetnum(ti) +#else +#define TIGETNUM(ti,tc) tgetnum(tc) +#endif + +#if HAVE_TIGETSTR +#define TIGETSTR(ti,tc) tigetstr(ti) +#else +#define TIGETSTR(ti,tc) tgetstr(tc,&area_pointer) +#endif + +/* + * So far (2013 - more than ten years), only ncurses implements + * use_extended_names(). + */ +#if defined(NCURSES_XNAMES) +#elif defined(NCURSES_VERSION) && defined(HAVE_TERM_ENTRY_H) && HAVE_TERM_ENTRY_H +#define NCURSES_XNAMES 1 +#else +#define NCURSES_XNAMES 0 +#endif + +/* + * ncurses restores the cursor in endwin(). Other libraries may not. + */ +#ifdef NCURSES_VERSION +#define stop_curses() endwin() +#else +#define stop_curses() do { endwin(); curs_set(1); } while (0) +#endif + +/* ncurses implements tparm() with varargs, X/Open with a fixed-parameter list + * (which is incompatible with legacy usage, doesn't solve any problems). + */ +#define tparm3(a,b,c) tparm(a,b,c,0,0,0,0,0,0,0) +#define tparm2(a,b) tparm(a,b,0,0,0,0,0,0,0,0) + +#define UChar(c) ((unsigned char)(c)) + +#ifndef SIZEOF +#define SIZEOF(table) (sizeof(table)/sizeof(table[0])) +#endif + +#if defined(NCURSES_VERSION) && HAVE_NC_ALLOC_H +#include +#if HAVE_EXIT_TERMINFO && !defined(USE_CURSES) && (defined(USE_TERMINFO) || defined(USE_TINFO)) +#undef ExitProgram +#define ExitProgram(code) exit_terminfo(code) +#elif HAVE_EXIT_CURSES +#undef ExitProgram +#define ExitProgram(code) exit_curses(code) +#endif +#else /* not ncurses-tree */ +#define typeMalloc(type,n) (type *) malloc((size_t)(n) * sizeof(type)) +#define typeCalloc(type,elts) (type *) calloc((size_t)(elts), sizeof(type)) +#define typeRealloc(type,n,p) (type *) realloc(p, (size_t)(n) * sizeof(type)) +#endif + +#ifndef ExitProgram +#define ExitProgram(code) exit(code) +#endif + +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +#define EXIT_FAILURE 1 +#endif + +#undef _NC_WINDOWS_NATIVE +#if (defined(_WIN32) || defined(_WIN64)) +#define _NC_WINDOWS_NATIVE 1 +#endif + +#if defined(_NC_WINDOWS_NATIVE) || defined(USE_WIN32CON_DRIVER) + +#if defined(PDCURSES) +#ifdef WINVER +# if WINVER < 0x0501 +# error WINVER must at least be 0x0501 +# endif +#else +# define WINVER 0x0501 +#endif +#include +#include /* for struct timeval */ +#undef sleep +#define sleep(n) Sleep((n) * 1000) +#define SIGHUP 1 +#define SIGKILL 9 +#define getlogin() "username" + +#elif defined(EXP_WIN32_DRIVER) + +#if defined(HAVE_NCURSESW_NCURSES_H) +#include +#elif defined(HAVE_NCURSES_NCURSES_H) +#include +#else +#include +#endif + +#else + +#if defined(HAVE_NCURSESW_NCURSES_H) +#include +#elif defined(HAVE_NCURSES_NCURSES_H) +#include +#else +#include +#endif + +#endif + +/* conflicts in test/firstlast.c */ +#undef large +#undef small + +#endif + +#ifdef NEED_TIME_H +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif +#endif + +#if HAVE_CLOCK_GETTIME +# define GetClockTime(t) clock_gettime(CLOCK_REALTIME, t) +# define TimeType struct timespec +# define TimeScale 1000000000L /* 1e9 */ +# define ElapsedSeconds(b,e) \ + (double) (((e)->tv_sec - (b)->tv_sec) \ + + ((e)->tv_nsec - (b)->tv_nsec) / TimeScale) +#elif HAVE_GETTIMEOFDAY +# define GetClockTime(t) gettimeofday(t, 0) +# define TimeType struct timeval +# define TimeScale 1000000L /* 1e6 */ +# define ElapsedSeconds(b,e) \ + (double) (((e)->tv_sec - (b)->tv_sec) \ + + ((e)->tv_usec - (b)->tv_usec) / TimeScale) +#else +# define TimeType time_t +# define GetClockTime(t) time((time_t*)0) +# define ElapsedSeconds(b,e) (double)((e) - (b)) +#endif + +/* + * Ultrix 3.1 + */ +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif + +#if !HAVE_STRSTR +extern char *_nc_strstr(const char *, const char *); +#define strstr(a,b) _nc_strstr((a),(b)) +#endif /* !HAVE_STRSTR */ + +/* Use this to quiet gcc's -Wwrite-strings warnings, but accommodate SVr4 + * curses which doesn't have const parameters declared (so far) in the places + * that XSI shows. + */ +#ifndef NCURSES_CONST +#ifdef PDCURSES +#define NCURSES_CONST const /* close enough */ +#else +#define NCURSES_CONST /* nothing */ +#endif +#endif + +/* out-of-band values for representing absent capabilities */ +#define ABSENT_BOOLEAN ((signed char)-1) /* 255 */ +#define ABSENT_NUMERIC (-1) +#define ABSENT_STRING (char *)0 + +/* out-of-band values for representing cancels */ +#define CANCELLED_BOOLEAN ((signed char)-2) /* 254 */ +#define CANCELLED_NUMERIC (-2) +#define CANCELLED_STRING (char *)(-1) + +#define VALID_BOOLEAN(s) ((unsigned char)(s) <= 1) /* reject "-1" */ +#define VALID_NUMERIC(s) ((s) >= 0) +#define VALID_STRING(s) ((s) != CANCELLED_STRING && (s) != ABSENT_STRING) + +#define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~" + +#define CATCHALL(handler) do { \ + int nsig; \ + for (nsig = SIGHUP; nsig < SIGTERM; ++nsig) \ + if (nsig != SIGKILL) \ + signal(nsig, handler); \ + } while(0) + +#ifdef NCURSES_VERSION +#define InitAndCatch(init,handler) do { CATCHALL(handler); init; } while (0) +#else +#define InitAndCatch(init,handler) do { init; CATCHALL(handler); } while (0) +#endif + +#if defined(_NC_WINDOWS_NATIVE) || defined(USE_WIN32CON_DRIVER) +#define SetupAlarm(opt) (void)opt +#else +#define SetupAlarm(opt) if (opt) alarm((unsigned)opt) +#endif + +/* + * Workaround for clean(er) compile with Solaris's legacy curses. + * The same would be needed for HPUX 10.20 + */ +#ifndef TPUTS_ARG +#define TPUTS_ARG int +#endif + +#if defined(sun) && !defined(_XOPEN_CURSES) && !defined(NCURSES_VERSION_PATCH) +#undef TPUTS_ARG +#define TPUTS_ARG char +extern char *tgoto(char *, int, int); /* available, but not prototyped */ +#endif + +#ifndef TPUTS_PROTO +#define TPUTS_PROTO(func,value) int func(TPUTS_ARG value) +#endif + +#ifndef TPUTS_RETURN +#define TPUTS_RETURN(value) return value +#endif + +/* + * Workarounds for Solaris's X/Open curses + */ +#if !defined(KEY_MIN) && defined(__KEY_MIN) +#define KEY_MIN __KEY_MIN +#endif +#if !defined(KEY_MAX) && defined(__KEY_MIN) +#define KEY_MAX __KEY_MAX +#endif + +/* + * Workaround to build with Sun's default SVr4 curses. + */ +#ifdef NCURSES_VERSION +#ifndef HAVE_VW_PRINTW +#define HAVE_VW_PRINTW 1 +#endif +#endif + +/* + * ncurses provides arrays of capability names; X/Open discarded these SVr4 + * features. Some implementations continue to provide them (see the test + * configure script). + */ +#ifdef NCURSES_VERSION +#ifndef HAVE_CURSES_DATA_BOOLNAMES +#define HAVE_CURSES_DATA_BOOLNAMES 1 +#endif +#endif + +/* + * ncurses provides a termcap interface; a few packagers replace or displace + * its header file with an incompatible one. The demo_termcap program uses + * the ncurses file, if available. + */ +#ifdef NCURSES_VERSION +#ifndef HAVE_NCURSES_TERMCAP_H +#define HAVE_NCURSES_TERMCAP_H 0 +#endif +#ifndef HAVE_TERMCAP_H +#define HAVE_TERMCAP_H 0 +#endif +#endif + +/* + * ncurses uses const in some places where X/Open does (or did) not allow. + */ +#if defined(NCURSES_CONST) +#define CONST_MENUS NCURSES_CONST +#elif defined(PDCURSES) +#define CONST_MENUS const +#else +#define CONST_MENUS /* nothing */ +#endif + +#if defined(NCURSES_CONST) +#define CONST_FMT NCURSES_CONST +#elif defined(PDCURSES) +#define CONST_FMT const +#else +#define CONST_FMT /* nothing */ +#endif + +/* + * Simplify setting up demo of threading with these macros. + */ + +#if HAVE_USE_WINDOW +#define USING_WINDOW(w,func) use_window(w, (NCURSES_WINDOW_CB) func, w) +#define USING_WINDOW1(w,func,safe) use_window(w, (NCURSES_WINDOW_CB) safe, NULL) +#define USING_WINDOW2(w,func,data) use_window(w, (NCURSES_WINDOW_CB) func, data) +#define WANT_USE_WINDOW() extern void _nc_want_use_window(void) +#else +#define USING_WINDOW(w,func) func(w, NULL) +#define USING_WINDOW1(w,func,safe) func(w) +#define USING_WINDOW2(w,func,data) func(w,data) +#define WANT_USE_WINDOW() extern void _nc_want_use_window(void) +#endif + +#if HAVE_USE_WINDOW +#define USING_SCREEN(s,func,data) use_screen(s, (NCURSES_SCREEN_CB) func, data) +#define WANT_USE_SCREEN() extern void _nc_want_use_screen(void) +#else +#define USING_SCREEN(s,func,data) func(data) +#define WANT_USE_SCREEN() extern void _nc_want_use_screen(void) +#endif + +#if defined(TRACE) && HAVE__TRACEF && HAVE_CURSES_TRACE +#define Trace(p) _tracef p +#define USE_TRACE 1 +#define START_TRACE() \ + if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \ + int t = _nc_getenv_num("NCURSES_TRACE"); \ + if (t >= 0) \ + curses_trace((unsigned) t); \ + } +extern unsigned _nc_tracing; +extern int _nc_getenv_num(const char *); +#else +#undef TRACE +#define Trace(p) /* nothing */ +#define USE_TRACE 0 +#define START_TRACE() /* nothing */ +#endif + +#define Trace2(p) /* nothing */ + +#define AddCh(c) (void) addch((chtype)(c)) +#define WAddCh(w,c) (void) waddch((w),(chtype)(c)) +#define MvAddCh(y,x,c) (void) mvaddch((y),(x),(chtype)(c)) +#define MvWAddCh(w,y,x,c) (void) mvwaddch((w),(y),(x),(chtype)(c)) +#define MvAddStr(y,x,s) (void) mvaddstr((y),(x),(s)) +#define MvWAddStr(w,y,x,s) (void) mvwaddstr((w),(y),(x),(s)) +#define MvWAddChStr(w,y,x,s) (void) mvwaddchstr((w),(y),(x),(s)) +#define MvPrintw (void) mvprintw +#define MvWPrintw (void) mvwprintw +#define MvHLine (void) mvhline +#define MvWHLine (void) mvwhline +#define MvVLine (void) mvvline +#define MvWVLine (void) mvwvline + +/* + * The macro likely uses unsigned values, while X/Open prototype uses int. + */ +#if defined(wattrset) || defined(PDCURSES) +#define AttrArg(p,a) (chtype) ((chtype)(p) | (chtype)(a)) +#else +#define AttrArg(p,a) (int) ((chtype)(p) | (chtype)(a)) +#endif + +/* + * Workaround for defective implementation of gcc attribute warn_unused_result + */ +#if defined(__GNUC__) && defined(_FORTIFY_SOURCE) +#define IGNORE_RC(func) errno = func +#else +#define IGNORE_RC(func) (void) func +#endif /* gcc workarounds */ + +#define init_mb(state) memset(&state, 0, sizeof(state)) + +#endif /* __TEST_PRIV_H */ diff --git a/contrib/ncurses/test/test_add_wchstr.c b/contrib/ncurses/test/test_add_wchstr.c new file mode 100644 index 00000000..2c5e9115 --- /dev/null +++ b/contrib/ncurses/test/test_add_wchstr.c @@ -0,0 +1,619 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2009-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_add_wchstr.c,v 1.35 2024/10/05 19:26:24 tom Exp $ + * + * Demonstrate the waddwchstr() and wadd_wch functions. + * Thomas Dickey - 2009/9/12 + * + * Note: to provide inputs for *add_wch(), we use setcchar(). A quirk of the + * X/Open definition for that function is that the string contains no + * characters with negative width. Any control character (such as tab) falls + * into that category. So it follows that *add_wch() cannot render a tab + * character because there is no legal way to construct a cchar_t containing + * one. X/Open does not document this, and it would be logical to assume that + * *addwchstr() has the same limitation, but it uses a wchar_t string directly, + * and does not document how tabs are handled. + */ + +#include + +#if USE_WIDEC_SUPPORT + +#define WIDE_LINEDATA +#include + +#undef AddCh +#undef MvAddCh +#undef MvAddStr +#undef MvWAddCh +#undef MvWAddChStr +#undef MvWAddStr +#undef WAddCh + +/* + * redefinitions to simplify comparison between test_*str programs + */ +#define AddNStr add_wchnstr +#define AddStr add_wchstr +#define MvAddNStr (void) mvadd_wchnstr +#define MvAddStr (void) mvadd_wchstr +#define MvWAddNStr (void) mvwadd_wchnstr +#define MvWAddStr (void) mvwadd_wchstr +#define MvWAddChStr(w,y,x,s) (void) mvwadd_wchstr((w),(y),(x),(s)) +#define WAddNStr wadd_wchnstr +#define WAddStr wadd_wchstr + +#define MY_TABSIZE 8 + +typedef enum { + oDefault = 0, + oMove = 1, + oWindow = 2, + oMoveWindow = 3 +} Options; + +static bool m_opt = FALSE; +static bool pass_ctls = FALSE; +static bool w_opt = FALSE; +static int n_opt = -1; + +static cchar_t *temp_buffer; +static size_t temp_length; + +#define TempBuffer(source_len, source_cast) \ + if (source != 0) { \ + const char *temp; \ + size_t need = source_len + 1; \ + wchar_t have[2]; \ + int n = 0; \ + \ + if (need > temp_length) { \ + temp_length = need * 2; \ + temp_buffer = typeRealloc(cchar_t, temp_length, temp_buffer); \ + if (!temp_buffer) \ + failed("TempBuffer"); \ + } \ + have[0] = 0; \ + have[1] = 0; \ + do { \ + have[0] = source_cast; \ + if (!pass_ctls \ + && have[0] != 0 \ + && have[0] < 256 \ + && (temp = unctrl((chtype) have[0])) != 0 \ + && strlen(temp) > 1) { \ + while (*temp != '\0') { \ + have[0] = (wchar_t) *temp++; \ + setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \ + } \ + } else { \ + setcchar(&temp_buffer[n++], have, A_NORMAL, 0, NULL); \ + } \ + } while (have[0] != 0); \ + } else if (temp_buffer != 0) { \ + free(temp_buffer); \ + temp_buffer = 0; \ + temp_length = 0; \ + } \ + return temp_buffer; + +static size_t +ChWLen(const wchar_t *source) +{ + size_t result = wcslen(source); + + if (!pass_ctls) { + size_t adjust = 0; + size_t n; + + for (n = 0; source[n] != 0; ++n) { + const char *s; + + if ((source[n] < 256) && (s = unctrl((chtype) source[n])) != 0) { + adjust += (strlen(s) - 1); + } + } + result += adjust; + } + return result; +} + +static cchar_t * +ChStr(const char *source) +{ + TempBuffer(strlen(source), UChar(*source++)); +} + +static cchar_t * +ChWStr(const wchar_t *source) +{ + TempBuffer(ChWLen(source), *source++); +} + +static void +legend(WINDOW *win, int level, Options state, const wchar_t *buffer, int length) +{ + const char *showstate; + + switch (state) { + default: + case oDefault: + showstate = ""; + break; + case oMove: + showstate = " (mvXXX)"; + break; + case oWindow: + showstate = " (winXXX)"; + break; + case oMoveWindow: + showstate = " (mvwinXXX)"; + break; + } + + wmove(win, 0, 0); + wprintw(win, + "The Strings/Chars displays should match. Enter any characters, except:\n"); + wprintw(win, + "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n"); + wclrtoeol(win); + wprintw(win, "Level %d,%s added %d characters <", level, + showstate, length); + waddwstr(win, buffer); + waddstr(win, ">"); +} + +static int +ColOf(const wchar_t *buffer, int length, int margin) +{ + int n; + int result; + + for (n = 0, result = margin + 1; n < length; ++n) { + int ch = buffer[n]; + switch (ch) { + case '\n': + /* actually newline should clear the remainder of the line + * and move to the next line - but that seems a little awkward + * in this example. + */ + case '\r': + result = 0; + break; + case '\b': + if (result > 0) + --result; + break; + case '\t': + result += (MY_TABSIZE - (result % MY_TABSIZE)); + break; + case '\177': + result += 2; + break; + default: + result += wcwidth((wchar_t) ch); + if (ch < 32) + ++result; + break; + } + } + return result; +} + +static int +ConvertCh(chtype source, cchar_t *target) +{ + wchar_t tmp_wchar[2]; + + tmp_wchar[0] = (wchar_t) source; + tmp_wchar[1] = 0; + if (setcchar(target, tmp_wchar, A_NORMAL, 0, (void *) 0) == ERR) { + beep(); + return FALSE; + } + return TRUE; +} + +static int +MvWAddCh(WINDOW *win, int y, int x, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = mvwadd_wch(win, y, x, &tmp_cchar); + } else { + code = mvwaddch(win, y, x, ch); + } + return code; +} + +static int +MvAddCh(int y, int x, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = mvadd_wch(y, x, &tmp_cchar); + } else { + code = mvaddch(y, x, ch); + } + return code; +} + +static int +WAddCh(WINDOW *win, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = wadd_wch(win, &tmp_cchar); + } else { + code = waddch(win, ch); + } + return code; +} + +static int +AddCh(chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = add_wch(&tmp_cchar); + } else { + code = addch(ch); + } + return code; +} + +#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n))) +static void +recursive_test(int level) +{ + static bool first = TRUE; + + int ch; + int limit; + int row = 1; + int col; + int row2, col2; + int length; + wchar_t buffer[BUFSIZ]; + WINDOW *look = 0; + WINDOW *work = 0; + WINDOW *show = 0; + int margin = (2 * MY_TABSIZE) - 1; + Options option = (Options) ((unsigned) (m_opt + ? oMove + : oDefault) + | (unsigned) ((w_opt || (level > 0)) + ? oWindow + : oDefault)); + + if (first) { + static char cmd[80]; + setlocale(LC_ALL, ""); + + _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd)); + putenv(cmd); + + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + keypad(stdscr, TRUE); + + /* + * Show the characters added in color, to distinguish from those that + * are shifted. + */ + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + } + } + + limit = LINES - 5; + if (level > 0) { + look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); + work = newwin(limit - 2, COLS - (2 * level), 1, level); + show = newwin(4, COLS, limit + 1, 0); + box(look, 0, 0); + wnoutrefresh(look); + limit -= 2; + } else { + work = stdscr; + show = derwin(stdscr, 4, COLS, limit + 1, 0); + } + keypad(work, TRUE); + + for (col = margin + 1; col < COLS; col += MY_TABSIZE) + MvWVLine(work, row, col, '.', limit - 2); + + MvWVLine(work, row, margin, ACS_VLINE, limit - 2); + MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2); + limit /= 2; + + MvWAddChStr(work, 1, 2, ChStr("String")); + MvWAddChStr(work, limit + 1, 2, ChStr("Chars")); + wnoutrefresh(work); + + buffer[length = 0] = '\0'; + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + + if (has_colors()) { + wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' ')); + } + + while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { + wmove(work, row, margin + 1); + switch (ch) { + case key_RECUR: + recursive_test(level + 1); + + if (look) + touchwin(look); + touchwin(work); + touchwin(show); + + if (look) + wnoutrefresh(look); + wnoutrefresh(work); + wnoutrefresh(show); + + doupdate(); + break; + case key_NEWLINE: + if (row < limit) { + ++row; + /* put the whole string in, all at once */ + col2 = margin + 1; + switch (option) { + case oDefault: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (move(row, col2) != ERR) { + AddNStr(ChWStr(buffer + col), LEN(col)); + } + } + } else { + if (move(row, col2) != ERR) { + AddStr(ChWStr(buffer)); + } + } + break; + case oMove: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvAddNStr(row, col2, ChWStr(buffer + col), LEN(col)); + } + } else { + MvAddStr(row, col2, ChWStr(buffer)); + } + break; + case oWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (wmove(work, row, col2) != ERR) { + WAddNStr(work, ChWStr(buffer + col), LEN(col)); + } + } + } else { + if (wmove(work, row, col2) != ERR) { + WAddStr(work, ChWStr(buffer)); + } + } + break; + case oMoveWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvWAddNStr(work, row, col2, ChWStr(buffer + + col), LEN(col)); + } + } else { + MvWAddStr(work, row, col2, ChWStr(buffer)); + } + break; + } + + /* do the corresponding single-character add */ + row2 = limit + row; + for (col = 0; col < length; ++col) { + col2 = ColOf(buffer, col, margin); + switch (option) { + case oDefault: + if (move(row2, col2) != ERR) { + AddCh((chtype) buffer[col]); + } + break; + case oMove: + MvAddCh(row2, col2, (chtype) buffer[col]); + break; + case oWindow: + if (wmove(work, row2, col2) != ERR) { + WAddCh(work, (chtype) buffer[col]); + } + break; + case oMoveWindow: + MvWAddCh(work, row2, col2, (chtype) buffer[col]); + break; + } + } + } else { + beep(); + } + break; + default: + buffer[length++] = (wchar_t) ch; + buffer[length] = '\0'; + + /* put the string in, one character at a time */ + col = ColOf(buffer, length - 1, margin); + switch (option) { + case oDefault: + if (move(row, col) != ERR) { + AddStr(ChWStr(buffer + length - 1)); + } + break; + case oMove: + MvAddStr(row, col, ChWStr(buffer + length - 1)); + break; + case oWindow: + if (wmove(work, row, col) != ERR) { + WAddStr(work, ChWStr(buffer + length - 1)); + } + break; + case oMoveWindow: + MvWAddStr(work, row, col, ChWStr(buffer + length - 1)); + break; + } + + /* do the corresponding single-character add */ + switch (option) { + case oDefault: + if (move(limit + row, col) != ERR) { + AddCh((chtype) ch); + } + break; + case oMove: + MvAddCh(limit + row, col, (chtype) ch); + break; + case oWindow: + if (wmove(work, limit + row, col) != ERR) { + WAddCh(work, (chtype) ch); + } + break; + case oMoveWindow: + MvWAddCh(work, limit + row, col, (chtype) ch); + break; + } + + wnoutrefresh(work); + + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + break; + } + } + delwin(show); + if (level > 0) { + delwin(work); + delwin(look); + } +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_add_wchstr [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f FILE read data from given file" + ," -n NUM limit string-adds to NUM bytes on ^N replay" + ," -m perform wmove/move separately from add-functions" + ," -p pass-thru control characters without using unctrl()" + ," -w use window-parameter even when stdscr would be implied" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:pw")) != -1) { + switch (ch) { + case 'f': + init_linedata(optarg); + break; + case 'm': + m_opt = TRUE; + break; + case 'n': + n_opt = atoi(optarg); + if (n_opt == 0) + n_opt = -1; + break; + case 'p': + pass_ctls = TRUE; + break; + case 'w': + w_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + recursive_test(0); + endwin(); +#if NO_LEAKS + free(temp_buffer); +#endif + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_addchstr.c b/contrib/ncurses/test/test_addchstr.c new file mode 100644 index 00000000..1de86c07 --- /dev/null +++ b/contrib/ncurses/test/test_addchstr.c @@ -0,0 +1,529 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2009-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_addchstr.c,v 1.30 2024/10/05 19:26:24 tom Exp $ + * + * Demonstrate the waddchstr() and waddch functions. + * Thomas Dickey - 2009/9/12 + */ + +#include +#include + +/* + * redefinitions to simplify comparison between test_*str programs + */ +#undef MvAddStr +#undef MvWAddStr + +#define AddNStr addchnstr +#define AddStr addchstr +#define MvAddNStr (void) mvaddchnstr +#define MvAddStr (void) mvaddchstr +#define MvWAddNStr (void) mvwaddchnstr +#define MvWAddStr (void) mvwaddchstr +#define WAddNStr waddchnstr +#define WAddStr waddchstr + +#define MY_TABSIZE 8 + +typedef enum { + oDefault = 0, + oMove = 1, + oWindow = 2, + oMoveWindow = 3 +} Options; + +static bool m_opt = FALSE; +static bool pass_ctls = FALSE; +static bool w_opt = FALSE; +static int n_opt = -1; + +static chtype show_attr; +static chtype *temp_buffer; +static size_t temp_length; + +#define TempBuffer(source_cast) + +static size_t +ChLen(const char *source) +{ + size_t result = strlen(source); + + if (!pass_ctls) { + size_t adjust = 0; + size_t n; + + for (n = 0; n < result; ++n) { + const char *s = unctrl(UChar(source[n])); + if (s != 0) { + adjust += (strlen(s) - 1); + } + } + result += adjust; + } + return result; +} + +static chtype * +ChStr(const char *source) +{ + if (source != 0) { + size_t need = ChLen(source) + 1; + int n = 0; + + if (need > temp_length) { + temp_length = need * 2; + temp_buffer = typeRealloc(chtype, temp_length, temp_buffer); + if (!temp_buffer) + failed("TempBuffer"); + } + do { + const char *s; + chtype ch = UChar(*source++); + if (!pass_ctls && (s = unctrl(ch)) != 0) { + while (*s != '\0') { + temp_buffer[n++] = UChar(*s++); + } + } else { + temp_buffer[n++] = ch; + } + } while (source[0] != 0); + temp_buffer[n] = 0; + } else if (temp_buffer != 0) { + free(temp_buffer); + temp_buffer = 0; + temp_length = 0; + } + return temp_buffer; +} + +/* color the strings drawn in the workspace */ +static chtype * +ChStr2(const char *source) +{ + size_t len = ChLen(source); + size_t n; + chtype *result = ChStr(source); + for (n = 0; n < len; ++n) { + result[n] |= show_attr; + } + return result; +} + +static void +legend(WINDOW *win, int level, Options state, char *buffer, int length) +{ + const char *showstate; + + switch (state) { + default: + case oDefault: + showstate = ""; + break; + case oMove: + showstate = " (mvXXX)"; + break; + case oWindow: + showstate = " (winXXX)"; + break; + case oMoveWindow: + showstate = " (mvwinXXX)"; + break; + } + + wmove(win, 0, 0); + wprintw(win, + "The Strings/Chars displays should match. Enter any characters, except:\n"); + wprintw(win, + "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n"); + wclrtoeol(win); + wprintw(win, "Level %d,%s added %d characters <%s>", level, + showstate, length, buffer); +} + +static int +ColOf(const char *buffer, int length, int margin) +{ + int n; + int result; + + for (n = 0, result = margin + 1; n < length; ++n) { + int ch = UChar(buffer[n]); + switch (ch) { + case '\n': + /* actually newline should clear the remainder of the line + * and move to the next line - but that seems a little awkward + * in this example. + */ + case '\r': + result = 0; + break; + case '\b': + if (result > 0) + --result; + break; + case '\t': + result += (MY_TABSIZE - (result % MY_TABSIZE)); + break; + case '\177': + result += 2; + break; + default: + ++result; + if (ch < 32) + ++result; + break; + } + } + return result; +} + +#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n))) +static void +recursive_test(int level) +{ + static bool first = TRUE; + + int ch; + int limit; + int row = 1; + int col; + int row2, col2; + int length; + char buffer[BUFSIZ]; + WINDOW *look = 0; + WINDOW *work = 0; + WINDOW *show = 0; + int margin = (2 * MY_TABSIZE) - 1; + Options option = (Options) ((unsigned) (m_opt + ? oMove + : oDefault) + | (unsigned) ((w_opt || (level > 0)) + ? oWindow + : oDefault)); + + if (first) { + static char cmd[80]; + setlocale(LC_ALL, ""); + + _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd)); + putenv(cmd); + + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + keypad(stdscr, TRUE); + + /* + * Show the characters added in color, to distinguish from those that + * are shifted. + */ + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + } + } + + limit = LINES - 5; + if (level > 0) { + look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); + work = newwin(limit - 2, COLS - (2 * level), 1, level); + show = newwin(4, COLS, limit + 1, 0); + box(look, 0, 0); + wnoutrefresh(look); + limit -= 2; + } else { + work = stdscr; + show = derwin(stdscr, 4, COLS, limit + 1, 0); + } + keypad(work, TRUE); + + for (col = margin + 1; col < COLS; col += MY_TABSIZE) + MvWVLine(work, row, col, '.', limit - 2); + + MvWVLine(work, row, margin, ACS_VLINE, limit - 2); + MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2); + limit /= 2; + + MvWAddChStr(work, 1, 2, ChStr("String")); + MvWAddChStr(work, limit + 1, 2, ChStr("Chars")); + wnoutrefresh(work); + + buffer[length = 0] = '\0'; + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + + if (has_colors()) { + show_attr = (chtype) COLOR_PAIR(1); + wbkgdset(work, show_attr | ' '); + } else { + show_attr = A_STANDOUT; + } + + while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { + wmove(work, row, margin + 1); + switch (ch) { + case key_RECUR: + recursive_test(level + 1); + + if (look) + touchwin(look); + touchwin(work); + touchwin(show); + + if (look) + wnoutrefresh(look); + wnoutrefresh(work); + wnoutrefresh(show); + + doupdate(); + break; + case key_NEWLINE: + if (row < limit) { + ++row; + /* put the whole string in, all at once */ + col2 = margin + 1; + switch (option) { + case oDefault: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (move(row, col2) != ERR) { + AddNStr(ChStr2(buffer + col), LEN(col)); + } + } + } else { + if (move(row, col2) != ERR) { + AddStr(ChStr2(buffer)); + } + } + break; + case oMove: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvAddNStr(row, col2, ChStr2(buffer + col), LEN(col)); + } + } else { + MvAddStr(row, col2, ChStr2(buffer)); + } + break; + case oWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (wmove(work, row, col2) != ERR) { + WAddNStr(work, ChStr2(buffer + col), LEN(col)); + } + } + } else { + if (wmove(work, row, col2) != ERR) { + WAddStr(work, ChStr2(buffer)); + } + } + break; + case oMoveWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvWAddNStr(work, row, col2, ChStr2(buffer + col), + LEN(col)); + } + } else { + MvWAddStr(work, row, col2, ChStr2(buffer)); + } + break; + } + + /* do the corresponding single-character add */ + row2 = limit + row; + for (col = 0; col < length; ++col) { + col2 = ColOf(buffer, col, margin); + switch (option) { + case oDefault: + if (move(row2, col2) != ERR) { + AddCh(UChar(buffer[col])); + } + break; + case oMove: + MvAddCh(row2, col2, UChar(buffer[col])); + break; + case oWindow: + if (wmove(work, row2, col2) != ERR) { + WAddCh(work, UChar(buffer[col])); + } + break; + case oMoveWindow: + MvWAddCh(work, row2, col2, UChar(buffer[col])); + break; + } + } + } else { + beep(); + } + break; + case KEY_BACKSPACE: + ch = '\b'; + /* FALLTHRU */ + default: + if (ch <= 0 || ch > 255) { + beep(); + break; + } + buffer[length++] = (char) ch; + buffer[length] = '\0'; + + /* put the string in, one character at a time */ + col = ColOf(buffer, length - 1, margin); + switch (option) { + case oDefault: + if (move(row, col) != ERR) { + AddStr(ChStr2(buffer + length - 1)); + } + break; + case oMove: + MvAddStr(row, col, ChStr2(buffer + length - 1)); + break; + case oWindow: + if (wmove(work, row, col) != ERR) { + WAddStr(work, ChStr2(buffer + length - 1)); + } + break; + case oMoveWindow: + MvWAddStr(work, row, col, ChStr2(buffer + length - 1)); + break; + } + + /* do the corresponding single-character add */ + switch (option) { + case oDefault: + if (move(limit + row, col) != ERR) { + AddCh(UChar(ch)); + } + break; + case oMove: + MvAddCh(limit + row, col, UChar(ch)); + break; + case oWindow: + if (wmove(work, limit + row, col) != ERR) { + WAddCh(work, UChar(ch)); + } + break; + case oMoveWindow: + MvWAddCh(work, limit + row, col, UChar(ch)); + break; + } + + wnoutrefresh(work); + + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + break; + } + } + if (level > 0) { + delwin(work); + delwin(look); + } + delwin(show); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_addchstr [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f FILE read data from given file" + ," -n NUM limit string-adds to NUM bytes on ^N replay" + ," -m perform wmove/move separately from add-functions" + ," -p pass-thru control characters without using unctrl()" + ," -w use window-parameter even when stdscr would be implied" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:pw")) != -1) { + switch (ch) { + case 'f': + init_linedata(optarg); + break; + case 'm': + m_opt = TRUE; + break; + case 'n': + n_opt = atoi(optarg); + if (n_opt == 0) + n_opt = -1; + break; + case 'p': + pass_ctls = TRUE; + break; + case 'w': + w_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + recursive_test(0); + endwin(); +#if NO_LEAKS + free(temp_buffer); +#endif + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/test_addstr.c b/contrib/ncurses/test/test_addstr.c new file mode 100644 index 00000000..940404bb --- /dev/null +++ b/contrib/ncurses/test/test_addstr.c @@ -0,0 +1,437 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2009-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_addstr.c,v 1.21 2024/10/05 19:27:33 tom Exp $ + * + * Demonstrate the waddstr() and waddch functions. + * Thomas Dickey - 2009/9/12 + */ + +#include +#include + +/* + * redefinitions to simplify comparison between test_*str programs + */ +#define AddNStr addnstr +#define AddStr addstr +#define MvAddNStr (void) mvaddnstr +#define MvWAddNStr (void) mvwaddnstr +#define WAddNStr waddnstr +#define WAddStr waddstr + +#define MY_TABSIZE 8 + +typedef enum { + oDefault = 0, + oMove = 1, + oWindow = 2, + oMoveWindow = 3 +} Options; + +static bool m_opt = FALSE; +static bool w_opt = FALSE; +static int n_opt = -1; + +static void +legend(WINDOW *win, int level, Options state, char *buffer, int length) +{ + const char *showstate; + + switch (state) { + default: + case oDefault: + showstate = ""; + break; + case oMove: + showstate = " (mvXXX)"; + break; + case oWindow: + showstate = " (winXXX)"; + break; + case oMoveWindow: + showstate = " (mvwinXXX)"; + break; + } + + wmove(win, 0, 0); + wprintw(win, + "The Strings/Chars displays should match. Enter any characters, except:\n"); + wprintw(win, + "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n"); + wclrtoeol(win); + wprintw(win, "Level %d,%s added %d characters <%s>", level, + showstate, length, buffer); +} + +static int +ColOf(const char *buffer, int length, int margin) +{ + int n; + int result; + + for (n = 0, result = margin + 1; n < length; ++n) { + int ch = UChar(buffer[n]); + switch (ch) { + case '\n': + /* actually newline should clear the remainder of the line + * and move to the next line - but that seems a little awkward + * in this example. + */ + case '\r': + result = 0; + break; + case '\b': + if (result > 0) + --result; + break; + case '\t': + result += (MY_TABSIZE - (result % MY_TABSIZE)); + break; + case '\177': + result += 2; + break; + default: + ++result; + if (ch < 32) + ++result; + break; + } + } + return result; +} + +#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n))) +static void +recursive_test(int level) +{ + static bool first = TRUE; + + int ch; + int limit; + int row = 1; + int col; + int row2, col2; + int length; + char buffer[BUFSIZ]; + WINDOW *look = 0; + WINDOW *work = 0; + WINDOW *show = 0; + int margin = (2 * MY_TABSIZE) - 1; + Options option = (Options) ((unsigned) (m_opt + ? oMove + : oDefault) + | (unsigned) ((w_opt || (level > 0)) + ? oWindow + : oDefault)); + + if (first) { + static char cmd[80]; + setlocale(LC_ALL, ""); + + _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd)); + putenv(cmd); + + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + keypad(stdscr, TRUE); + + /* + * Show the characters added in color, to distinguish from those that + * are shifted. + */ + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + } + } + + limit = LINES - 5; + if (level > 0) { + look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); + work = newwin(limit - 2, COLS - (2 * level), 1, level); + show = newwin(4, COLS, limit + 1, 0); + box(look, 0, 0); + wnoutrefresh(look); + limit -= 2; + } else { + work = stdscr; + show = derwin(stdscr, 4, COLS, limit + 1, 0); + } + keypad(work, TRUE); + + for (col = margin + 1; col < COLS; col += MY_TABSIZE) + MvWVLine(work, row, col, '.', limit - 2); + + MvWVLine(work, row, margin, ACS_VLINE, limit - 2); + MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2); + limit /= 2; + + MvWAddStr(work, 1, 2, "String"); + MvWAddStr(work, limit + 1, 2, "Chars"); + wnoutrefresh(work); + + buffer[length = 0] = '\0'; + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + + if (has_colors()) { + wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' ')); + } + + while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { + wmove(work, row, margin + 1); + switch (ch) { + case key_RECUR: + recursive_test(level + 1); + + if (look) + touchwin(look); + touchwin(work); + touchwin(show); + + if (look) + wnoutrefresh(look); + wnoutrefresh(work); + wnoutrefresh(show); + + doupdate(); + break; + case key_NEWLINE: + if (row < limit) { + ++row; + /* put the whole string in, all at once */ + col2 = margin + 1; + switch (option) { + case oDefault: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (move(row, col2) != ERR) { + AddNStr(buffer + col, LEN(col)); + } + } + } else { + if (move(row, col2) != ERR) { + AddStr(buffer); + } + } + break; + case oMove: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvAddNStr(row, col2, buffer + col, LEN(col)); + } + } else { + MvAddStr(row, col2, buffer); + } + break; + case oWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (wmove(work, row, col2) != ERR) { + WAddNStr(work, buffer + col, LEN(col)); + } + } + } else { + if (wmove(work, row, col2) != ERR) { + WAddStr(work, buffer); + } + } + break; + case oMoveWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvWAddNStr(work, row, col2, buffer + col, LEN(col)); + } + } else { + MvWAddStr(work, row, col2, buffer); + } + break; + } + + /* do the corresponding single-character add */ + row2 = limit + row; + for (col = 0; col < length; ++col) { + col2 = ColOf(buffer, col, margin); + switch (option) { + case oDefault: + if (move(row2, col2) != ERR) { + AddCh(UChar(buffer[col])); + } + break; + case oMove: + MvAddCh(row2, col2, UChar(buffer[col])); + break; + case oWindow: + if (wmove(work, row2, col2) != ERR) { + WAddCh(work, UChar(buffer[col])); + } + break; + case oMoveWindow: + MvWAddCh(work, row2, col2, UChar(buffer[col])); + break; + } + } + } else { + beep(); + } + break; + default: + if (ch <= 0 || ch > 255) { + beep(); + break; + } + buffer[length++] = (char) ch; + buffer[length] = '\0'; + + /* put the string in, one character at a time */ + col = ColOf(buffer, length - 1, margin); + switch (option) { + case oDefault: + if (move(row, col) != ERR) { + AddStr(buffer + length - 1); + } + break; + case oMove: + MvAddStr(row, col, buffer + length - 1); + break; + case oWindow: + if (wmove(work, row, col) != ERR) { + WAddStr(work, buffer + length - 1); + } + break; + case oMoveWindow: + MvWAddStr(work, row, col, buffer + length - 1); + break; + } + + /* do the corresponding single-character add */ + switch (option) { + case oDefault: + if (move(limit + row, col) != ERR) { + AddCh(UChar(ch)); + } + break; + case oMove: + MvAddCh(limit + row, col, UChar(ch)); + break; + case oWindow: + if (wmove(work, limit + row, col) != ERR) { + WAddCh(work, UChar(ch)); + } + break; + case oMoveWindow: + MvWAddCh(work, limit + row, col, UChar(ch)); + break; + } + + wnoutrefresh(work); + + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + break; + } + } + delwin(show); + if (level > 0) { + delwin(work); + delwin(look); + } +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_addstr [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f FILE read data from given file" + ," -n NUM limit string-adds to NUM bytes on ^N replay" + ," -m perform wmove/move separately from add-functions" + ," -w use window-parameter even when stdscr would be implied" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) { + switch (ch) { + case 'f': + init_linedata(optarg); + break; + case 'm': + m_opt = TRUE; + break; + case 'n': + n_opt = atoi(optarg); + if (n_opt == 0) + n_opt = -1; + break; + case 'w': + w_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + recursive_test(0); + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/test_addwstr.c b/contrib/ncurses/test/test_addwstr.c new file mode 100644 index 00000000..cfc4e817 --- /dev/null +++ b/contrib/ncurses/test/test_addwstr.c @@ -0,0 +1,537 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * Copyright 2009-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_addwstr.c,v 1.23 2024/10/05 19:27:33 tom Exp $ + * + * Demonstrate the waddwstr() and wadd_wch functions. + * Thomas Dickey - 2009/9/12 + * + * Note: to provide inputs for *add_wch(), we use setcchar(). A quirk of the + * X/Open definition for that function is that the string contains no + * characters with negative width. Any control character (such as tab) falls + * into that category. So it follows that *add_wch() cannot render a tab + * character because there is no legal way to construct a cchar_t containing + * one. X/Open does not document this, and it would be logical to assume that + * *addwstr() has the same limitation, but it uses a wchar_t string directly, + * and does not document how tabs are handled. + */ + +#include + +#if USE_WIDEC_SUPPORT + +#define WIDE_LINEDATA +#include + +#undef AddCh +#undef MvAddCh +#undef MvAddStr +#undef MvWAddCh +#undef MvWAddStr +#undef WAddCh + +/* + * redefinitions to simplify comparison between test_*str programs + */ +#define AddNStr addnwstr +#define AddStr addwstr +#define MvAddNStr (void) mvaddnwstr +#define MvAddStr (void) mvaddwstr +#define MvWAddNStr (void) mvwaddnwstr +#define MvWAddStr (void) mvwaddwstr +#define WAddNStr waddnwstr +#define WAddStr waddwstr + +#define MY_TABSIZE 8 + +typedef enum { + oDefault = 0, + oMove = 1, + oWindow = 2, + oMoveWindow = 3 +} Options; + +static bool m_opt = FALSE; +static bool w_opt = FALSE; +static int n_opt = -1; + +static void +legend(WINDOW *win, int level, Options state, const wchar_t *buffer, int length) +{ + const char *showstate; + + switch (state) { + default: + case oDefault: + showstate = ""; + break; + case oMove: + showstate = " (mvXXX)"; + break; + case oWindow: + showstate = " (winXXX)"; + break; + case oMoveWindow: + showstate = " (mvwinXXX)"; + break; + } + + wmove(win, 0, 0); + wprintw(win, + "The Strings/Chars displays should match. Enter any characters, except:\n"); + wprintw(win, + "down-arrow or ^N to repeat on next line, ^W for inner window, ESC to exit.\n"); + wclrtoeol(win); + wprintw(win, "Level %d,%s added %d characters <", level, showstate, length); + waddwstr(win, buffer); + waddstr(win, ">"); +} + +static int +ColOf(const wchar_t *const buffer, int length, int margin) +{ + int n; + int result; + + for (n = 0, result = margin + 1; n < length; ++n) { + int ch = buffer[n]; + switch (ch) { + case '\n': + /* actually newline should clear the remainder of the line + * and move to the next line - but that seems a little awkward + * in this example. + */ + case '\r': + result = 0; + break; + case '\b': + if (result > 0) + --result; + break; + case '\t': + result += (MY_TABSIZE - (result % MY_TABSIZE)); + break; + case '\177': + result += 2; + break; + default: + result += wcwidth((wchar_t) ch); + if (ch < 32) + ++result; + break; + } + } + return result; +} + +static int +ConvertCh(chtype source, cchar_t *target) +{ + wchar_t tmp_wchar[2]; + + tmp_wchar[0] = (wchar_t) source; + tmp_wchar[1] = 0; + if (setcchar(target, tmp_wchar, A_NORMAL, 0, (void *) 0) == ERR) { + beep(); + return FALSE; + } + return TRUE; +} + +static int +MvWAddCh(WINDOW *win, int y, int x, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = mvwadd_wch(win, y, x, &tmp_cchar); + } else { + code = mvwaddch(win, y, x, ch); + } + return code; +} + +static int +MvAddCh(int y, int x, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = mvadd_wch(y, x, &tmp_cchar); + } else { + code = mvaddch(y, x, ch); + } + return code; +} + +static int +WAddCh(WINDOW *win, chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = wadd_wch(win, &tmp_cchar); + } else { + code = waddch(win, ch); + } + return code; +} + +static int +AddCh(chtype ch) +{ + int code; + cchar_t tmp_cchar; + + if (ConvertCh(ch, &tmp_cchar)) { + code = add_wch(&tmp_cchar); + } else { + code = addch(ch); + } + return code; +} + +#define LEN(n) ((length - (n) > n_opt) ? n_opt : (length - (n))) +static void +recursive_test(int level) +{ + static bool first = TRUE; + + int ch; + int limit; + int row = 1; + int col; + int row2, col2; + int length; + wchar_t buffer[BUFSIZ]; + WINDOW *look = 0; + WINDOW *work = 0; + WINDOW *show = 0; + int margin = (2 * MY_TABSIZE) - 1; + Options option = (Options) ((unsigned) (m_opt + ? oMove + : oDefault) + | (unsigned) ((w_opt || (level > 0)) + ? oWindow + : oDefault)); + + if (first) { + static char cmd[80]; + setlocale(LC_ALL, ""); + + _nc_STRCPY(cmd, "TABSIZE=8", sizeof(cmd)); + putenv(cmd); + + initscr(); + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + keypad(stdscr, TRUE); + + /* + * Show the characters added in color, to distinguish from those that + * are shifted. + */ + if (has_colors()) { + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + } + } + + limit = LINES - 5; + if (level > 0) { + look = newwin(limit, COLS - (2 * (level - 1)), 0, level - 1); + work = newwin(limit - 2, COLS - (2 * level), 1, level); + show = newwin(4, COLS, limit + 1, 0); + box(look, 0, 0); + wnoutrefresh(look); + limit -= 2; + } else { + work = stdscr; + show = derwin(stdscr, 4, COLS, limit + 1, 0); + } + keypad(work, TRUE); + + for (col = margin + 1; col < COLS; col += MY_TABSIZE) + MvWVLine(work, row, col, '.', limit - 2); + + MvWVLine(work, row, margin, ACS_VLINE, limit - 2); + MvWVLine(work, row, margin + 1, ACS_VLINE, limit - 2); + limit /= 2; + + (void) mvwaddstr(work, 1, 2, "String"); + (void) mvwaddstr(work, limit + 1, 2, "Chars"); + wnoutrefresh(work); + + buffer[length = 0] = '\0'; + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + + if (has_colors()) { + wbkgdset(work, (chtype) (COLOR_PAIR(1) | ' ')); + } + + while ((ch = read_linedata(work)) != ERR && !isQUIT(ch)) { + wmove(work, row, margin + 1); + switch (ch) { + case key_RECUR: + recursive_test(level + 1); + + if (look) + touchwin(look); + touchwin(work); + touchwin(show); + + if (look) + wnoutrefresh(look); + wnoutrefresh(work); + wnoutrefresh(show); + + doupdate(); + break; + case key_NEWLINE: + if (row < limit) { + ++row; + /* put the whole string in, all at once */ + col2 = margin + 1; + switch (option) { + case oDefault: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (move(row, col2) != ERR) { + AddNStr(buffer + col, LEN(col)); + } + } + } else { + if (move(row, col2) != ERR) { + AddStr(buffer); + } + } + break; + case oMove: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvAddNStr(row, col2, buffer + col, LEN(col)); + } + } else { + MvAddStr(row, col2, buffer); + } + break; + case oWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + if (wmove(work, row, col2) != ERR) { + WAddNStr(work, buffer + col, LEN(col)); + } + } + } else { + if (wmove(work, row, col2) != ERR) { + WAddStr(work, buffer); + } + } + break; + case oMoveWindow: + if (n_opt > 1) { + for (col = 0; col < length; col += n_opt) { + col2 = ColOf(buffer, col, margin); + MvWAddNStr(work, row, col2, buffer + col, LEN(col)); + } + } else { + MvWAddStr(work, row, col2, buffer); + } + break; + } + + /* do the corresponding single-character add */ + row2 = limit + row; + for (col = 0; col < length; ++col) { + col2 = ColOf(buffer, col, margin); + switch (option) { + case oDefault: + if (move(row2, col2) != ERR) { + AddCh((chtype) buffer[col]); + } + break; + case oMove: + MvAddCh(row2, col2, (chtype) buffer[col]); + break; + case oWindow: + if (wmove(work, row2, col2) != ERR) { + WAddCh(work, (chtype) buffer[col]); + } + break; + case oMoveWindow: + MvWAddCh(work, row2, col2, (chtype) buffer[col]); + break; + } + } + } else { + beep(); + } + break; + case KEY_BACKSPACE: + ch = '\b'; + /* FALLTHRU */ + default: + buffer[length++] = (wchar_t) ch; + buffer[length] = '\0'; + + /* put the string in, one character at a time */ + col = ColOf(buffer, length - 1, margin); + switch (option) { + case oDefault: + if (move(row, col) != ERR) { + AddStr(buffer + length - 1); + } + break; + case oMove: + MvAddStr(row, col, buffer + length - 1); + break; + case oWindow: + if (wmove(work, row, col) != ERR) { + WAddStr(work, buffer + length - 1); + } + break; + case oMoveWindow: + MvWAddStr(work, row, col, buffer + length - 1); + break; + } + + /* do the corresponding single-character add */ + switch (option) { + case oDefault: + if (move(limit + row, col) != ERR) { + AddCh((chtype) ch); + } + break; + case oMove: + MvAddCh(limit + row, col, (chtype) ch); + break; + case oWindow: + if (wmove(work, limit + row, col) != ERR) { + WAddCh(work, (chtype) ch); + } + break; + case oMoveWindow: + MvWAddCh(work, limit + row, col, (chtype) ch); + break; + } + + wnoutrefresh(work); + + legend(show, level, option, buffer, length); + wnoutrefresh(show); + + doupdate(); + break; + } + } + delwin(show); + if (level > 0) { + delwin(work); + delwin(look); + } +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_addwstr [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -f FILE read data from given file" + ," -n NUM limit string-adds to NUM bytes on ^N replay" + ," -m perform wmove/move separately from add-functions" + ," -w use window-parameter even when stdscr would be implied" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "f:mn:w")) != -1) { + switch (ch) { + case 'f': + init_linedata(optarg); + break; + case 'm': + m_opt = TRUE; + break; + case 'n': + n_opt = atoi(optarg); + if (n_opt == 0) + n_opt = -1; + break; + case 'w': + w_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + recursive_test(0); + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_arrays.c b/contrib/ncurses/test/test_arrays.c new file mode 100644 index 00000000..f89cb280 --- /dev/null +++ b/contrib/ncurses/test/test_arrays.c @@ -0,0 +1,233 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 2007-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_arrays.c,v 1.13 2022/12/10 23:23:27 tom Exp $ + * + * Author: Thomas E Dickey + * + * Demonstrate the public arrays from the terminfo library. + +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolnames[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolcodes[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) boolfnames[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numnames[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numcodes[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) numfnames[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strnames[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strcodes[]; +extern NCURSES_EXPORT_VAR(NCURSES_CONST char * const ) strfnames[]; + + */ + +#define USE_TINFO +#include + +#if HAVE_TIGETSTR +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) + +static bool opt_C; +static bool opt_T; +static bool opt_c; +static bool opt_f; +static bool opt_n; +static bool opt_t; + +#define PLAIN(opts, name) if (opts) dump_array(#name, name) + +static void +dump_array(const char *name, NCURSES_CONST char *const *list) +{ + int n; + + printf("%s:\n", name); + for (n = 0; list[n] != 0; ++n) { + printf("%5d:%s\n", n, list[n]); + } +} + +static void +dump_plain(void) +{ + PLAIN(opt_T && opt_n, boolnames); + PLAIN(opt_C && opt_c, boolcodes); + PLAIN(opt_T && opt_f, boolfnames); + + PLAIN(opt_T && opt_n, numnames); + PLAIN(opt_C && opt_c, numcodes); + PLAIN(opt_T && opt_f, numfnames); + + PLAIN(opt_T && opt_n, strnames); + PLAIN(opt_C && opt_c, strcodes); + PLAIN(opt_T && opt_f, strfnames); +} + +#define STRING(opts, name) if (opts) { printf("%s\"%s\"", c++ ? "," : "", name); } +#define NUMBER(opts, value) if (opts) { printf("%s%d", c++ ? "," : "", value); } + +static void +dump_table(void) +{ + int c = 0; + int r; + + STRING(opt_t, "Index"); + STRING(opt_t, "Type"); + STRING(opt_n, "Name"); + STRING(opt_c, "Code"); + STRING(opt_f, "FName"); + printf("\n"); + + for (r = 0; boolnames[r]; ++r) { + c = 0; + NUMBER(opt_t, r); + STRING(opt_t, "bool"); + STRING(opt_T && opt_n, boolnames[r]); + STRING(opt_C && opt_c, boolcodes[r]); + STRING(opt_T && opt_f, boolfnames[r]); + printf("\n"); + } + + for (r = 0; numnames[r]; ++r) { + c = 0; + NUMBER(opt_t, r); + STRING(opt_t, "num"); + STRING(opt_T && opt_n, numnames[r]); + STRING(opt_C && opt_c, numcodes[r]); + STRING(opt_T && opt_f, numfnames[r]); + printf("\n"); + } + + for (r = 0; strnames[r]; ++r) { + c = 0; + NUMBER(opt_t, r); + STRING(opt_t, "str"); + STRING(opt_T && opt_n, strnames[r]); + STRING(opt_C && opt_c, strcodes[r]); + STRING(opt_T && opt_f, strfnames[r]); + printf("\n"); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_arrays [options]" + ,"" + ,"If no options are given, print all (boolean, numeric, string)" + ,"capability names showing their index within the tables." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -C print termcap names" + ," -T print terminfo names" + ," -c print termcap names" + ," -f print full terminfo names" + ," -n print short terminfo names" + ," -t print the result as CSV table" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON "CTcfnt")) != -1) { + switch (ch) { + case 'C': + opt_C = TRUE; + break; + case 'T': + opt_T = TRUE; + break; + case 'c': + opt_c = TRUE; + break; + case 'f': + opt_f = TRUE; + break; + case 'n': + opt_n = TRUE; + break; + case 't': + opt_t = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + if (!(opt_T || opt_C)) { + opt_T = opt_C = TRUE; + } + if (!(opt_c || opt_f || opt_n)) { + opt_c = opt_f = opt_n = TRUE; + } + + if (opt_t) { + dump_table(); + } else { + dump_plain(); + } + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the terminfo arrays\n"); + ExitProgram(EXIT_FAILURE); +} +#endif +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + printf("This program requires the terminfo functions such as tigetstr\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/test_delwin.c b/contrib/ncurses/test/test_delwin.c new file mode 100644 index 00000000..09ef5c53 --- /dev/null +++ b/contrib/ncurses/test/test_delwin.c @@ -0,0 +1,151 @@ +/**************************************************************************** + * Copyright 2022,2023 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * $Id: test_delwin.c,v 1.5 2023/05/27 20:34:51 tom Exp $ + */ +#include + +#define STATUS 10 + +static SCREEN *my_screen; + +static void +show_rc(const char *what, const char *explain, int rc) +{ + printw("%s : %d (%s)\n", what, rc, explain); +} + +static void +next_step(WINDOW *win) +{ + int ch = wgetch(win); + if (ch == QUIT || ch == ESCAPE) { + endwin(); + /* use this to verify if delscreen frees all memory */ + delscreen(my_screen); + exit(EXIT_FAILURE); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_delwin [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char **argv) +{ + WINDOW *parent, *child1; + int rc; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + if ((my_screen = newterm(NULL, stdout, stdin)) == NULL) + ExitProgram(EXIT_FAILURE); + + noecho(); + cbreak(); + + refresh(); + wsetscrreg(stdscr, 0, STATUS - 1); + scrollok(stdscr, TRUE); + + parent = newwin(0, 0, STATUS, 0); + box(parent, 0, 0); + wrefresh(parent); + next_step(parent); + + printw("New window %p %s\n", (void *) parent, "Top window"); + mvwprintw(parent, 1, 1, "Top window"); + wrefresh(parent); + next_step(stdscr); + + child1 = derwin(parent, LINES - STATUS - 4, COLS - 4, 2, 2); + box(child1, 0, 0); + mvwprintw(child1, 1, 1, "Sub window"); + wrefresh(child1); + + printw("Sub window %p %s\n", (void *) child1, "Hello world!"); + next_step(stdscr); + + show_rc("Deleted parent", + "should fail, it still has a subwindow", + delwin(parent)); + next_step(stdscr); + show_rc("Deleted child1", + "should succeed", + rc = delwin(child1)); + next_step(stdscr); + if (rc == OK) { + wclrtobot(parent); + box(parent, 0, 0); + next_step(parent); + } + show_rc("Deleted parent", + "should succeed, it has no subwindow now", + rc = delwin(parent)); + next_step(stdscr); + if (rc == OK) { + touchwin(stdscr); + next_step(stdscr); + } + show_rc("Deleted parent", + "should fail, may dump core", + delwin(parent)); + next_step(stdscr); + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/test_endwin.c b/contrib/ncurses/test/test_endwin.c new file mode 100644 index 00000000..b761f22a --- /dev/null +++ b/contrib/ncurses/test/test_endwin.c @@ -0,0 +1,132 @@ +/**************************************************************************** + * Copyright 2023,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_endwin.c,v 1.3 2024/10/05 19:27:33 tom Exp $ + */ +#include + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_endwin [options]" + ,"" + ,"Options:" + ," -e call endwin() an extra time" + ," -i call initscr() before endwin()" + ," -n call newterm() before endwin()" + ," -r call refresh() before endwin()" + ," -s call getch() after endwin(), to refresh screen" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +#define status(opt,name,rc) if (opt) printf(" %s: %s", name, (rc) == OK ? "OK" : "ERR") + +int +main(int argc, char *argv[]) +{ + int ch; + int rc_r = OK; + int rc_e1 = OK; + int rc_e2 = OK; + int rc_e3 = OK; + const SCREEN *sp = NULL; + bool opt_e = FALSE; + bool opt_i = FALSE; + bool opt_n = FALSE; + bool opt_r = FALSE; + bool opt_s = FALSE; + + while ((ch = getopt(argc, argv, "einrs" OPTS_COMMON)) != -1) { + switch (ch) { + case 'e': + opt_e = TRUE; + break; + case 'i': + opt_i = TRUE; + break; + case 'n': + opt_n = TRUE; + break; + case 'r': + opt_r = TRUE; + break; + case 's': + opt_s = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + if (opt_i && opt_n) + usage(TRUE); + + if (opt_i) { + initscr(); + } else if (opt_n) { + sp = newterm(NULL, stdout, stdin); + } + if (opt_r) { + rc_r = refresh(); + } + rc_e1 = endwin(); + if (opt_e) { + rc_e2 = endwin(); + } + if (opt_s) { + getch(); + rc_e3 = endwin(); + } + printf("status:"); + status(opt_i, "initscr(-i)", OK); + status(opt_n, "newterm(-n)", (sp != NULL) ? OK : ERR); + status(opt_r, "refresh(-r)", rc_r); + status(TRUE, "endwin", rc_e1); + status(opt_e, "endwin(-e)", rc_e2); + status(opt_s, "endwin(-s)", rc_e3); + printf("\n"); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/test_get_wstr.c b/contrib/ncurses/test/test_get_wstr.c new file mode 100644 index 00000000..78887dbb --- /dev/null +++ b/contrib/ncurses/test/test_get_wstr.c @@ -0,0 +1,429 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2007-2011,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_get_wstr.c,v 1.16 2024/10/06 23:15:10 tom Exp $ + * + * Author: Thomas E Dickey + * + * Demonstrate the get_wstr functions from the curses library. + + int get_wstr(wint_t *wstr); + int getn_wstr(wint_t *wstr, int n); + int wget_wstr(WINDOW *win, wint_t *wstr); + int wgetn_wstr(WINDOW *win, wint_t *wstr, int n); + int mvget_wstr(int y, int x, wint_t *wstr); + int mvgetn_wstr(int y, int x, wint_t *wstr, int n); + int mvwget_wstr(WINDOW *win, int y, int x, wint_t *wstr); + int mvwgetn_wstr(WINDOW *win, int y, int x, wint_t *wstr, int n); + */ + +#include +#include + +#if HAVE_CHGAT +/* NetBSD curses wchgat */ + +#if USE_WIDEC_SUPPORT + +#define BASE_Y 6 +#define MAX_COLS 1024 + +typedef enum { + eGetStr = 0, + eGetNStr, + eMvGetStr, + eMvGetNStr, + eMaxFlavor +} Flavors; + +static bool +Quit(int ch) +{ + return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +static int +Remainder(const WINDOW *txtwin) +{ + int result = getmaxx(txtwin) - getcurx(txtwin); + return (result > 0) ? result : 0; +} + +/* + * Show a highlighted line in the place where input will happen. + */ +static void +ShowPrompt(WINDOW *txtwin, int limit) +{ + wchgat(txtwin, limit, WA_REVERSE, 0, NULL); + wnoutrefresh(txtwin); +} + +static void +MovePrompt(WINDOW *txtwin, int limit, int y, int x) +{ + wchgat(txtwin, Remainder(txtwin), WA_NORMAL, 0, NULL); + wmove(txtwin, y, x); + ShowPrompt(txtwin, limit); +} + +static int +ShowFlavor(WINDOW *strwin, WINDOW *txtwin, int flavor, int limit) +{ + const char *name = "?"; + bool limited = FALSE; + bool wins = (txtwin != stdscr); + int result; + + switch (flavor) { + case eGetStr: + name = wins ? "wget_wstr" : "get_wstr"; + break; + case eGetNStr: + limited = TRUE; + name = wins ? "wgetn_wstr" : "getn_wstr"; + break; + case eMvGetStr: + name = wins ? "mvwget_wstr" : "mvget_wstr"; + break; + case eMvGetNStr: + limited = TRUE; + name = wins ? "mvwgetn_wstr" : "mvgetn_wstr"; + break; + case eMaxFlavor: + break; + } + + wmove(strwin, 0, 0); + werase(strwin); + + if (limited) { + wprintw(strwin, "%s(%d):", name, limit); + } else { + wprintw(strwin, "%s:", name); + } + result = limited ? limit : Remainder(txtwin); + ShowPrompt(txtwin, result); + + wnoutrefresh(strwin); + return result; +} + +static int +recursive_test(int level, char **argv, WINDOW *strwin) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " q,^Q,ESC - quit this program", + " ^Q,ESC - quit help-screen", + "", + " p, - move beginning of prompt one up row", + " j, - move beginning of prompt one down row", + " h, - move beginning of prompt one left column", + " l, - move beginning of prompt one right column", + "", + " - - reduce getnstr buffer-size one column", + " + - increase getnstr buffer-size one column", + " : - prompt for input-text", + "", + " < - scroll \"left\" through getstr-functions", + " > - scroll \"right\" through getstr-functions", + "", + " w - recur to subwindow", + " ?, - show help-screen", + 0 + }; + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int ch; + int rc; + int txt_x = 0, txt_y = 0; + int base_y; + int flavor = 0; + int limit = getmaxx(strwin) - 5; + int actual; + wint_t buffer[MAX_COLS]; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((ch = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(ch)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + wmove(txtwin, txt_y, txt_x); + actual = ShowFlavor(strwin, txtwin, flavor, limit); + while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) { + switch (ch) { + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) { + MovePrompt(txtwin, actual, ++txt_y, txt_x); + } else { + beep(); + } + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) { + MovePrompt(txtwin, actual, --txt_y, txt_x); + } else { + beep(); + } + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) { + MovePrompt(txtwin, actual, txt_y, --txt_x); + } else { + beep(); + } + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) { + MovePrompt(txtwin, actual, txt_y, ++txt_x); + } else { + beep(); + } + break; + + case 'w': + recursive_test(level + 1, argv, strwin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + + case '-': + if (limit > 0) { + actual = ShowFlavor(strwin, txtwin, flavor, --limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + } else { + beep(); + } + break; + + case '+': + actual = ShowFlavor(strwin, txtwin, flavor, ++limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + break; + + case '<': + if (flavor > 0) { + actual = ShowFlavor(strwin, txtwin, --flavor, limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + } else { + beep(); + } + break; + + case '>': + if (flavor + 1 < eMaxFlavor) { + actual = ShowFlavor(strwin, txtwin, ++flavor, limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + } else { + beep(); + } + break; + + case ':': + actual = ShowFlavor(strwin, txtwin, flavor, limit); + *buffer = '\0'; + rc = ERR; + echo(); + (void) wattrset(txtwin, A_REVERSE); + switch (flavor) { + case eGetStr: + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + rc = wget_wstr(txtwin, buffer); + } else { + move(txt_y, txt_x); + rc = get_wstr(buffer); + } + break; + case eGetNStr: + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + rc = wgetn_wstr(txtwin, buffer, limit); + } else { + move(txt_y, txt_x); + rc = getn_wstr(buffer, limit); + } + break; + case eMvGetStr: + if (txtwin != stdscr) { + rc = mvwget_wstr(txtwin, txt_y, txt_x, buffer); + } else { + rc = mvget_wstr(txt_y, txt_x, buffer); + } + break; + case eMvGetNStr: + if (txtwin != stdscr) { + rc = mvwgetn_wstr(txtwin, txt_y, txt_x, buffer, limit); + } else { + rc = mvgetn_wstr(txt_y, txt_x, buffer, limit); + } + break; + case eMaxFlavor: + break; + } + noecho(); + (void) wattrset(txtwin, A_NORMAL); + wprintw(strwin, "%s:", (rc == OK) ? "OK" : "ERR"); + (void) waddwstr(strwin, (wchar_t *) buffer); + wnoutrefresh(strwin); + break; + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + default: + beep(); + break; + } + doupdate(); + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_get_wstr [options] [file1 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *chrbox; + WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) + usage(FALSE); + + initscr(); + + chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(chrbox, 0, 0); + wnoutrefresh(chrbox); + + strwin = derwin(chrbox, 4, COLS - 2, 1, 1); + + recursive_test(optind, argv, strwin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif +#else +int +main(void) +{ + printf("This program requires the curses chgat function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_getstr.c b/contrib/ncurses/test/test_getstr.c new file mode 100644 index 00000000..15cd4c96 --- /dev/null +++ b/contrib/ncurses/test/test_getstr.c @@ -0,0 +1,429 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2007-2012,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_getstr.c,v 1.19 2024/10/06 22:36:46 tom Exp $ + * + * Author: Thomas E Dickey + * + * Demonstrate the getstr functions from the curses library. + + int getstr(char *str); + int getnstr(char *str, int n); + int wgetstr(WINDOW *win, char *str); + int wgetnstr(WINDOW *win, char *str, int n); + int mvgetstr(int y, int x, char *str); + int mvwgetstr(WINDOW *win, int y, int x, char *str); + int mvgetnstr(int y, int x, char *str, int n); + int mvwgetnstr(WINDOW *, int y, int x, char *str, int n); + */ + +#include +#include + +#if HAVE_CHGAT +/* Solaris SVr4 curses lacks wchgat, mvgetnstr, mvwgetnstr */ + +#define BASE_Y 6 +#define MAX_COLS 1024 + +typedef enum { + eGetStr = 0, + eGetNStr, + eMvGetStr, + eMvGetNStr, + eMaxFlavor +} Flavors; + +/* + * Return-code is OK/ERR or a keyname. + */ +static const char * +ok_keyname(int code) +{ + return ((code == OK) ? "OK" : ((code == ERR) ? "ERR" : keyname(code))); +} + +static bool +Quit(int ch) +{ + return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +static int +Remainder(NCURSES_CONST WINDOW *txtwin) +{ + int result = getmaxx(txtwin) - getcurx(txtwin); + return (result > 0) ? result : 0; +} + +/* + * Show a highlighted line in the place where input will happen. + */ +static void +ShowPrompt(WINDOW *txtwin, int limit) +{ + wchgat(txtwin, limit, WA_REVERSE, 0, NULL); + wnoutrefresh(txtwin); +} + +static void +MovePrompt(WINDOW *txtwin, int limit, int y, int x) +{ + wchgat(txtwin, Remainder(txtwin), WA_NORMAL, 0, NULL); + wmove(txtwin, y, x); + ShowPrompt(txtwin, limit); +} + +static int +ShowFlavor(WINDOW *strwin, WINDOW *txtwin, int flavor, int limit) +{ + const char *name = "?"; + bool limited = FALSE; + bool wins = (txtwin != stdscr); + int result; + + switch (flavor) { + case eGetStr: + name = wins ? "wgetstr" : "getstr"; + break; + case eGetNStr: + limited = TRUE; + name = wins ? "wgetnstr" : "getnstr"; + break; + case eMvGetStr: + name = wins ? "mvwgetstr" : "mvgetstr"; + break; + case eMvGetNStr: + limited = TRUE; + name = wins ? "mvwgetnstr" : "mvgetnstr"; + break; + case eMaxFlavor: + break; + } + + wmove(strwin, 0, 0); + werase(strwin); + + if (limited) { + wprintw(strwin, "%s(%d):", name, limit); + } else { + wprintw(strwin, "%s:", name); + } + result = limited ? limit : Remainder(txtwin); + ShowPrompt(txtwin, result); + + wnoutrefresh(strwin); + return result; +} + +static int +recursive_test(int level, char **argv, WINDOW *strwin) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " q,^Q,ESC - quit this program", + " ^Q,ESC - quit help-screen", + "", + " p, - move beginning of prompt one up row", + " j, - move beginning of prompt one down row", + " h, - move beginning of prompt one left column", + " l, - move beginning of prompt one right column", + "", + " - - reduce getnstr buffer-size one column", + " + - increase getnstr buffer-size one column", + " : - prompt for input-text", + "", + " < - scroll \"left\" through getstr-functions", + " > - scroll \"right\" through getstr-functions", + "", + " w - recur to subwindow", + " ?, - show help-screen", + 0 + }; + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int ch; + int rc; + int txt_x = 0, txt_y = 0; + int base_y; + int flavor = 0; + int limit = getmaxx(strwin) - 5; + int actual; + + char buffer[MAX_COLS]; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((ch = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(ch)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + wmove(txtwin, txt_y, txt_x); + actual = ShowFlavor(strwin, txtwin, flavor, limit); + while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) { + switch (ch) { + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) { + MovePrompt(txtwin, actual, ++txt_y, txt_x); + } else { + beep(); + } + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) { + MovePrompt(txtwin, actual, --txt_y, txt_x); + } else { + beep(); + } + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) { + MovePrompt(txtwin, actual, txt_y, --txt_x); + } else { + beep(); + } + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) { + MovePrompt(txtwin, actual, txt_y, ++txt_x); + } else { + beep(); + } + break; + + case 'w': + recursive_test(level + 1, argv, strwin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + + case '-': + if (limit > 0) { + actual = ShowFlavor(strwin, txtwin, flavor, --limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + } else { + beep(); + } + break; + + case '+': + actual = ShowFlavor(strwin, txtwin, flavor, ++limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + break; + + case '<': + if (flavor > 0) { + actual = ShowFlavor(strwin, txtwin, --flavor, limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + } else { + beep(); + } + break; + + case '>': + if (flavor + 1 < eMaxFlavor) { + actual = ShowFlavor(strwin, txtwin, ++flavor, limit); + MovePrompt(txtwin, actual, txt_y, txt_x); + } else { + beep(); + } + break; + + case ':': + actual = ShowFlavor(strwin, txtwin, flavor, limit); + *buffer = '\0'; + rc = ERR; + echo(); + (void) wattrset(txtwin, A_REVERSE); + switch (flavor) { + case eGetStr: + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + rc = wgetstr(txtwin, buffer); + } else { + move(txt_y, txt_x); + rc = getstr(buffer); + } + break; + case eGetNStr: + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + rc = wgetnstr(txtwin, buffer, limit); + } else { + move(txt_y, txt_x); + rc = getnstr(buffer, limit); + } + break; + case eMvGetStr: + if (txtwin != stdscr) { + rc = mvwgetstr(txtwin, txt_y, txt_x, buffer); + } else { + rc = mvgetstr(txt_y, txt_x, buffer); + } + break; + case eMvGetNStr: + if (txtwin != stdscr) { + rc = mvwgetnstr(txtwin, txt_y, txt_x, buffer, limit); + } else { + rc = mvgetnstr(txt_y, txt_x, buffer, limit); + } + break; + case eMaxFlavor: + break; + } + noecho(); + (void) wattrset(txtwin, A_NORMAL); + wprintw(strwin, "%s:%s", ok_keyname(rc), buffer); + wnoutrefresh(strwin); + break; + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + default: + beep(); + break; + } + doupdate(); + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_getstr [options] [file1 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *chrbox; + WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) + usage(FALSE); + + initscr(); + + chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(chrbox, 0, 0); + wnoutrefresh(chrbox); + + strwin = derwin(chrbox, 4, COLS - 2, 1, 1); + + recursive_test(optind, argv, strwin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the curses chgat function\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_instr.c b/contrib/ncurses/test/test_instr.c new file mode 100644 index 00000000..80717471 --- /dev/null +++ b/contrib/ncurses/test/test_instr.c @@ -0,0 +1,322 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2007-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_instr.c,v 1.15 2024/10/06 21:11:54 tom Exp $ + * + * Author: Thomas E Dickey + * + * Demonstrate the instr functions from the curses library. + + int instr(char *str); + int innstr(char *str, int n); + int winstr(WINDOW *win, char *str); + int winnstr(WINDOW *win, char *str, int n); + int mvinstr(int y, int x, char *str); + int mvinnstr(int y, int x, char *str, int n); + int mvwinstr(WINDOW *win, int y, int x, char *str); + int mvwinnstr(WINDOW *win, int y, int x, char *str, int n); + */ + +#include +#include + +#define BASE_Y 6 +#define MAX_COLS 1024 + +static bool +Quit(int ch) +{ + return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +static void +show_1st(WINDOW *win, int line, NCURSES_CONST char *buffer) +{ + MvWAddStr(win, line, 5, buffer); +} + +static void +showmore(WINDOW *win, int line, NCURSES_CONST char *buffer) +{ + wmove(win, line, 0); + wclrtoeol(win); + show_1st(win, line, buffer); +} + +static void +show_help(WINDOW *win) +{ + static NCURSES_CONST char *msgs[] = + { + "Show file contents and a viewport from the variants of winstr." + ,"Use h/j/k/l or arrow keys to move the viewport." + ,"" + ,"Other commands:" + ,"+ increases the buffer-size used." + ,"- decreases the buffer-size used." + ,"w opens new window on the next filename." + ,"q quits the current file/window." + ,"? shows this help-window" + ,0 + }; + + popup_msg(win, msgs); +} + +static int +recursive_test(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) +{ + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int ch; + int txt_x = 0, txt_y = 0; + int base_y; + int limit = getmaxx(strwin) - 5; + + char buffer[MAX_COLS]; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + *buffer = '\0'; + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((ch = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(ch)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) { + switch (ch) { + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) + txt_y++; + else + beep(); + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) + txt_y--; + else + beep(); + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) + txt_x--; + else + beep(); + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) + txt_x++; + else + beep(); + break; + case 'w': + recursive_test(level + 1, argv, chrwin, strwin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + case '-': + if (limit > 0) { + --limit; + } else { + beep(); + } + break; + case '+': + if (limit + 2 < MAX_COLS) { + ++limit; + } else { + beep(); + } + break; + case HELP_KEY_1: + show_help(txtwin); + continue; + default: + beep(); + break; + } + + MvWPrintw(chrwin, 0, 0, "line:"); + wclrtoeol(chrwin); + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + + if (winstr(txtwin, buffer) != ERR) { + show_1st(chrwin, 0, buffer); + } + if (mvwinstr(txtwin, txt_y, txt_x, buffer) != ERR) { + showmore(chrwin, 1, buffer); + } + } else { + move(txt_y, txt_x); + + if (instr(buffer) != ERR) { + show_1st(chrwin, 0, buffer); + } + if (mvinstr(txt_y, txt_x, buffer) != ERR) { + showmore(chrwin, 1, buffer); + } + } + wnoutrefresh(chrwin); + + MvWPrintw(strwin, 0, 0, "%4d:", limit); + wclrtobot(strwin); + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + if (winnstr(txtwin, buffer, limit) != ERR) { + show_1st(strwin, 0, buffer); + } + + if (mvwinnstr(txtwin, txt_y, txt_x, buffer, limit) != ERR) { + showmore(strwin, 1, buffer); + } + } else { + move(txt_y, txt_x); + if (innstr(buffer, limit) != ERR) { + show_1st(strwin, 0, buffer); + } + + if (mvinnstr(txt_y, txt_x, buffer, limit) != ERR) { + showmore(strwin, 1, buffer); + } + } + + wnoutrefresh(strwin); + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_instr [options] [file1 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *chrbox; + WINDOW *chrwin; + WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) { + fprintf(stderr, "At least one text-file is needed\n"); + usage(FALSE); + } + + initscr(); + + chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(chrbox, 0, 0); + wnoutrefresh(chrbox); + + chrwin = derwin(chrbox, 2, COLS - 2, 1, 1); + strwin = derwin(chrbox, 2, COLS - 2, 3, 1); + + recursive_test(optind, argv, chrwin, strwin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/test_inwstr.c b/contrib/ncurses/test/test_inwstr.c new file mode 100644 index 00000000..1cf5e56f --- /dev/null +++ b/contrib/ncurses/test/test_inwstr.c @@ -0,0 +1,331 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2007-2010,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_inwstr.c,v 1.11 2024/10/06 23:15:38 tom Exp $ + * + * Author: Thomas E Dickey + * + * Demonstrate the inwstr functions from the curses library. + + int inwstr(wchar_t *str); + int innwstr(wchar_t *str, int n); + int winwstr(WINDOW *win, wchar_t *str); + int winnwstr(WINDOW *win, wchar_t *str, int n); + int mvinwstr(int y, int x, wchar_t *str); + int mvinnwstr(int y, int x, wchar_t *str, int n); + int mvwinwstr(WINDOW *win, int y, int x, wchar_t *str); + int mvwinnwstr(WINDOW *win, int y, int x, wchar_t *str, int n); + */ + +#include + +#if USE_WIDEC_SUPPORT + +#include + +#define BASE_Y 6 +#define MAX_COLS 1024 + +static bool +Quit(int ch) +{ + return (ch == ERR || ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +static void +show_1st(WINDOW *win, int line, const wchar_t *buffer) +{ + (void) mvwaddwstr(win, line, 5, buffer); +} + +static void +showmore(WINDOW *win, int line, const wchar_t *buffer) +{ + wmove(win, line, 0); + wclrtoeol(win); + show_1st(win, line, buffer); +} + +static void +show_help(WINDOW *win) +{ + static NCURSES_CONST char *msgs[] = + { + "Show file contents and a viewport from the variants of winwstr." + ,"Use h/j/k/l or arrow keys to move the viewport." + ,"" + ,"Other commands:" + ,"+ increases the buffer-size used." + ,"- decreases the buffer-size used." + ,"w opens new window on the next filename." + ,"q quits the current file/window." + ,"? shows this help-window" + ,0 + }; + + popup_msg(win, msgs); +} + +static int +recursive_test(int level, char **argv, WINDOW *chrwin, WINDOW *strwin) +{ + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int ch; + int txt_x = 0, txt_y = 0; + int base_y; + int limit = getmaxx(strwin) - 5; + wchar_t buffer[MAX_COLS]; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((ch = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(ch)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + while (!Quit(ch = mvwgetch(txtwin, txt_y, txt_x))) { + switch (ch) { + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) + txt_y++; + else + beep(); + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) + txt_y--; + else + beep(); + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) + txt_x--; + else + beep(); + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) + txt_x++; + else + beep(); + break; + case 'w': + recursive_test(level + 1, argv, chrwin, strwin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + case '-': + if (limit > 0) { + --limit; + } else { + beep(); + } + break; + case '+': + if (limit + 2 < MAX_COLS) { + ++limit; + } else { + beep(); + } + break; + case HELP_KEY_1: + show_help(txtwin); + continue; + default: + beep(); + break; + } + + MvWPrintw(chrwin, 0, 0, "line:"); + wclrtoeol(chrwin); + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + + if (winwstr(txtwin, buffer) != ERR) { + show_1st(chrwin, 0, buffer); + } + if (mvwinwstr(txtwin, txt_y, txt_x, buffer) != ERR) { + showmore(chrwin, 1, buffer); + } + } else { + move(txt_y, txt_x); + + if (inwstr(buffer) != ERR) { + show_1st(chrwin, 0, buffer); + } + if (mvinwstr(txt_y, txt_x, buffer) != ERR) { + showmore(chrwin, 1, buffer); + } + } + wnoutrefresh(chrwin); + + MvWPrintw(strwin, 0, 0, "%4d:", limit); + wclrtobot(strwin); + + if (txtwin != stdscr) { + wmove(txtwin, txt_y, txt_x); + if (winnwstr(txtwin, buffer, limit) != ERR) { + show_1st(strwin, 0, buffer); + } + + if (mvwinnwstr(txtwin, txt_y, txt_x, buffer, limit) != ERR) { + showmore(strwin, 1, buffer); + } + } else { + move(txt_y, txt_x); + if (innwstr(buffer, limit) != ERR) { + show_1st(strwin, 0, buffer); + } + + if (mvinnwstr(txt_y, txt_x, buffer, limit) != ERR) { + showmore(strwin, 1, buffer); + } + } + + wnoutrefresh(strwin); + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_inwstr [options] [file1 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *chrbox; + WINDOW *chrwin; + WINDOW *strwin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) { + fprintf(stderr, "At least one text-file is needed\n"); + usage(FALSE); + } + + initscr(); + + chrbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(chrbox, 0, 0); + wnoutrefresh(chrbox); + + chrwin = derwin(chrbox, 2, COLS - 2, 1, 1); + strwin = derwin(chrbox, 2, COLS - 2, 3, 1); + + recursive_test(optind, argv, chrwin, strwin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_mouse.c b/contrib/ncurses/test/test_mouse.c new file mode 100644 index 00000000..9e9a72c9 --- /dev/null +++ b/contrib/ncurses/test/test_mouse.c @@ -0,0 +1,284 @@ +/**************************************************************************** + * Copyright 2022-2023,2024 Thomas E. Dickey * + * Copyright 2022 Leonid S. Usov * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + ****************************************************************************/ +/* + * $Id: test_mouse.c,v 1.33 2024/10/05 18:47:56 tom Exp $ + * + * Author: Leonid S Usov + * + * Observe mouse events in the raw terminal or parsed ncurses modes + */ + +#include + +#if defined(NCURSES_MOUSE_VERSION) && !defined(_NC_WINDOWS_NATIVE) + +static int logoffset = 0; + +static void +raw_loop(void) +{ + const char *xtermcap; + + printf("Entering raw mode. Ctrl-c to quit.\n"); + + newterm(NULL, stdout, stdin); + raw(); + xtermcap = tigetstr("XM"); + if (!VALID_STRING(xtermcap)) { + fprintf(stderr, "couldn't get XM terminfo"); + return; + } + + putp(tgoto(xtermcap, 1, 1)); + fflush(stdout); + + while (1) { + int c = getc(stdin); + const char *pretty; + + if (c == -1 || c == '\003') { + break; + } else if (c == '\033') { + printf("\r\n\\E"); + } else if ((pretty = unctrl((chtype) c)) != NULL) { + printf("%s", pretty); + } else if (isprint(c)) { + printf("%c", c); + } else { + printf("{%x}", UChar(c)); + } + } + + putp(tgoto(xtermcap, 0, 0)); + fflush(stdout); + noraw(); +} + +static void logw(const char *fmt, ...) GCC_PRINTFLIKE(1, 2); + +static void +logw(const char *fmt, ...) +{ + int row = getcury(stdscr); + va_list args; + + va_start(args, fmt); + wmove(stdscr, row++, 0); + vw_printw(stdscr, fmt, args); + va_end(args); + + clrtoeol(); + + row %= (getmaxy(stdscr) - logoffset); + if (row < logoffset) { + row = logoffset; + } + + wmove(stdscr, row, 0); + wprintw(stdscr, ">"); + clrtoeol(); +} + +static void +cooked_loop(char *my_environ, int interval) +{ + MEVENT event; + + initscr(); + noecho(); + cbreak(); /* Line buffering disabled; pass everything */ + nonl(); + keypad(stdscr, TRUE); + + /* Get all the mouse events */ + mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); + mouseinterval(interval); + + logw("Ctrl-c to quit"); + logw("--------------"); + if (my_environ) + logw("%s", my_environ); + logoffset = getcury(stdscr); + + while (1) { + int c = getch(); + + switch (c) { + case KEY_MOUSE: + if (getmouse(&event) == OK) { + unsigned btn; + mmask_t events; +#if NCURSES_MOUSE_VERSION > 1 + const unsigned max_btn = 5; +#else + const unsigned max_btn = 4; +#endif + const mmask_t btn_mask = (NCURSES_BUTTON_RELEASED | + NCURSES_BUTTON_PRESSED | + NCURSES_BUTTON_CLICKED | + NCURSES_DOUBLE_CLICKED | + NCURSES_TRIPLE_CLICKED); + bool found = FALSE; + for (btn = 1; btn <= max_btn; btn++) { + events = (mmask_t) (event.bstate + & NCURSES_MOUSE_MASK(btn, btn_mask)); + if (events == 0) + continue; +#define ShowQ(btn,name) \ + (((event.bstate & NCURSES_MOUSE_MASK(btn, NCURSES_ ## name)) != 0) \ + ? (" " #name) \ + : "") +#define ShowM(name) \ + (((event.bstate & NCURSES_MOUSE_MASK(btn, BUTTON_ ## name)) != 0) \ + ? (" " #name) \ + : "") +#define ShowP() \ + ((event.bstate & REPORT_MOUSE_POSITION) != 0 \ + ? " position" \ + : "") + logw("[%08lX] button %d%s%s%s%s%s%s%s%s%s @ %d, %d", + (unsigned long) events, + btn, + ShowQ(btn, BUTTON_RELEASED), + ShowQ(btn, BUTTON_PRESSED), + ShowQ(btn, BUTTON_CLICKED), + ShowQ(btn, DOUBLE_CLICKED), + ShowQ(btn, TRIPLE_CLICKED), + ShowM(SHIFT), + ShowM(CTRL), + ShowM(ALT), + ShowP(), + event.y, event.x); + found = TRUE; + } + /* + * A position report need not have a button associated with it. + * The modifiers probably are unused. + */ + if (!found && (event.bstate & REPORT_MOUSE_POSITION)) { + logw("[%08lX]%s%s%s%s @ %d, %d", + (unsigned long) events, + ShowM(SHIFT), + ShowM(CTRL), + ShowM(ALT), + ShowP(), + event.y, event.x); + } + } + break; + case '\003': + goto end; + default: + logw("got another char: 0x%x", UChar(c)); + } + refresh(); + } + end: + endwin(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_mouse [options]" + ,"" + ,"Test mouse events. These examples for $TERM demonstrate xterm" + ,"features:" + ," xterm" + ," xterm-1002" + ," xterm-1003" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -r show raw input stream, injecting a new line before every ESC" + ," -i n set mouse interval to n; default is 0 (no double-clicks)" + ," -T term use terminal description other than $TERM" + }; + unsigned n; + for (n = 0; n < sizeof(msg) / sizeof(char *); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + bool rawmode = FALSE; + int interval = 0; + int ch; + size_t my_len; + char *my_environ = NULL; + const char *term_format = "TERM=%s"; + + while ((ch = getopt(argc, argv, OPTS_COMMON "i:rT:")) != -1) { + switch (ch) { + case 'i': + interval = atoi(optarg); + break; + case 'r': + rawmode = TRUE; + break; + case 'T': + my_len = strlen(term_format) + strlen(optarg) + 1; + my_environ = malloc(my_len); + if (my_environ != NULL) { + _nc_SPRINTF(my_environ, _nc_SLIMIT(my_len) term_format, optarg); + putenv(my_environ); + } + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) { + usage(FALSE); + ExitProgram(EXIT_FAILURE); + } + + if (rawmode) { + raw_loop(); + } else { + cooked_loop(my_environ, interval); + } + + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_opaque.c b/contrib/ncurses/test/test_opaque.c new file mode 100644 index 00000000..cc8d657d --- /dev/null +++ b/contrib/ncurses/test/test_opaque.c @@ -0,0 +1,524 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2007-2008,2009 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_opaque.c,v 1.16 2024/10/05 19:27:33 tom Exp $ + * + * Author: Thomas E Dickey + * + * Demonstrate the opaque functions from the curses library. + + WINDOW * wgetparent (const WINDOW *); + bool is_cleared(const WINDOW *win); + bool is_idcok(const WINDOW *win); + bool is_idlok(const WINDOW *win); + bool is_immedok(const WINDOW *win); + bool is_keypad(const WINDOW *win); + bool is_leaveok(const WINDOW *win); + bool is_nodelay(const WINDOW *win); + bool is_notimeout(const WINDOW *win); + bool is_scrollok(const WINDOW *win); + bool is_syncok(const WINDOW *win); + int wgetscrreg (const WINDOW *, int *, int *); + bool is_pad(const WINDOW *win); + bool is_subwin(const WINDOW *win); + int wgetdelay(const WINDOW *win); + */ + +#include + +#define BASE_Y 6 +#define MAX_COLS 1024 + +#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20090906) && NCURSES_EXT_FUNCS && NCURSES_OPAQUE + +static bool +Quit(int ch) +{ + return (ch == 'q' || ch == QUIT || ch == ESCAPE); +} + +typedef bool(*BoolOpaque) (WINDOW *, int); + +static bool +test_opaque_cleared(WINDOW *win, int mode) +{ + if (mode >= 0) { + if (mode) + wclear(win); + } + return is_cleared(win); +} + +static bool +test_opaque_idcok(WINDOW *win, int mode) +{ + if (mode >= 0) { + idcok(win, mode); + } + return is_idcok(win); +} + +static bool +test_opaque_idlok(WINDOW *win, int mode) +{ + if (mode >= 0) { + idlok(win, mode); + } + return is_idlok(win); +} + +static bool +test_opaque_immedok(WINDOW *win, int mode) +{ + if (mode >= 0) { + immedok(win, mode); + } + return is_immedok(win); +} + +static bool +test_opaque_keypad(WINDOW *win, int mode) +{ + if (mode >= 0) { + keypad(win, mode); + } + return is_keypad(win); +} + +static bool +test_opaque_leaveok(WINDOW *win, int mode) +{ + if (mode >= 0) { + leaveok(win, mode); + } + return is_leaveok(win); +} + +static bool +test_opaque_nodelay(WINDOW *win, int mode) +{ + if (mode >= 0) { + nodelay(win, mode); + } + return is_nodelay(win); +} + +static bool +test_opaque_notimeout(WINDOW *win, int mode) +{ + if (mode >= 0) { + notimeout(win, mode); + } + return is_notimeout(win); +} + +static bool +test_opaque_scrollok(WINDOW *win, int mode) +{ + if (mode >= 0) { + scrollok(win, mode); + } + return is_scrollok(win); +} + +static bool +test_opaque_syncok(WINDOW *win, int mode) +{ + if (mode >= 0) { + syncok(win, mode); + } + return is_syncok(win); +} + +static int +status_y(const WINDOW *stswin, int cell) +{ + return (cell % getmaxy(stswin)); +} + +static int +status_x(const WINDOW *stswin, int cell) +{ + return (15 * (cell / getmaxy(stswin))); +} + +static void +to_keyword(WINDOW *stswin, int cell) +{ + wmove(stswin, status_y(stswin, cell), status_x(stswin, cell)); +} + +static void +to_result(WINDOW *stswin, int cell, bool before) +{ + int y = status_y(stswin, cell); + int x = status_x(stswin, cell) + 11; + if (!before) + ++x; + wmove(stswin, y, x); +} + +static void +show_keyword(WINDOW *stswin, int cell, int active, const char *name) +{ + to_keyword(stswin, cell); + if (active == cell) + (void) wstandout(stswin); + wprintw(stswin, "%s:", name); + if (active == cell) + (void) wstandend(stswin); +} +/* *INDENT-OFF* */ +static struct { + const char *name; + BoolOpaque func; +} bool_funcs[] = { + { "cleared", test_opaque_cleared }, + { "idcok", test_opaque_idcok }, + { "idlok", test_opaque_idlok }, + { "immedok", test_opaque_immedok }, + { "keypad", test_opaque_keypad }, + { "leaveok", test_opaque_leaveok }, + { "nodelay", test_opaque_nodelay }, + { "notimeout", test_opaque_notimeout }, + { "scrollok", test_opaque_scrollok }, + { "syncok", test_opaque_syncok } +}; +/* *INDENT-ON* */ + +#define bool2c(c) ((c) ? 'T' : 'F') + +/* + * Display and/or allow update for the properties accessed in the opaque + * window. Some may change state after refreshing the window, so we + * distinguish between them using the 'before' parameter. + */ +static int +show_opaque(WINDOW *stswin, WINDOW *txtwin, bool before, int active) +{ + int n; + int top, bottom; + + if (before) { + werase(stswin); + } + for (n = 0; n < (int) SIZEOF(bool_funcs); ++n) { + show_keyword(stswin, n, active, bool_funcs[n].name); + + to_result(stswin, n, before); + wprintw(stswin, "%c", bool2c(bool_funcs[n].func(txtwin, -1))); + } + + show_keyword(stswin, n, active, "is_pad"); + to_result(stswin, n, TRUE); + wprintw(stswin, "%c", bool2c(is_pad(txtwin))); + + ++n; + show_keyword(stswin, n, active, "is_subwin"); + to_result(stswin, n, TRUE); + wprintw(stswin, "%c", bool2c(is_subwin(txtwin))); + + ++n; + show_keyword(stswin, n, active, "wgetparent"); + to_result(stswin, n, TRUE); + wprintw(stswin, "%p", (void *) wgetparent(txtwin)); + + ++n; + show_keyword(stswin, n, active, "wgetdelay"); + to_result(stswin, n, TRUE); + wprintw(stswin, "%d", wgetdelay(txtwin)); + + ++n; + show_keyword(stswin, n, active, "wgetscrreg"); + to_result(stswin, n, TRUE); + if (wgetscrreg(txtwin, &top, &bottom) == OK) + wprintw(stswin, "%d,%d", top, bottom); + else + wprintw(stswin, "none"); + + wnoutrefresh(stswin); + return active; +} + +static int +test_opaque(int level, char **argv, WINDOW *stswin) +{ + WINDOW *txtbox = 0; + WINDOW *txtwin = 0; + FILE *fp; + int ch; + int txt_x = 0, txt_y = 0; + int base_y; + bool in_status = FALSE; + int active = 0; + + if (argv[level] == 0) { + beep(); + return FALSE; + } + + if (level > 1) { + txtbox = newwin(LINES - BASE_Y, COLS - level, BASE_Y, level); + box(txtbox, 0, 0); + wnoutrefresh(txtbox); + + txtwin = derwin(txtbox, + getmaxy(txtbox) - 2, + getmaxx(txtbox) - 2, + 1, 1); + base_y = 0; + } else { + txtwin = stdscr; + base_y = BASE_Y; + } + + keypad(txtwin, TRUE); /* enable keyboard mapping */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + txt_y = base_y; + txt_x = 0; + wmove(txtwin, txt_y, txt_x); + + if ((fp = fopen(argv[level], "r")) != 0) { + while ((ch = fgetc(fp)) != EOF) { + if (waddch(txtwin, UChar(ch)) != OK) { + break; + } + } + fclose(fp); + } else { + wprintw(txtwin, "Cannot open:\n%s", argv[1]); + } + + for (;;) { + if (in_status) { + to_keyword(stswin, active); + + ch = wgetch(stswin); + show_opaque(stswin, txtwin, TRUE, active); + if (Quit(ch)) + break; + + switch (ch) { + case '\t': + in_status = FALSE; + break; + case KEY_DOWN: + case 'j': + if (active < (int) SIZEOF(bool_funcs) - 1) + active++; + else + beep(); + break; + case KEY_UP: + case 'k': + if (active > 0) + active--; + else + beep(); + break; + case ' ': + bool_funcs[active].func(txtwin, + !bool_funcs[active].func(txtwin, -1)); + break; + default: + beep(); + break; + } + show_opaque(stswin, txtwin, FALSE, in_status ? active : -1); + } else { + ch = mvwgetch(txtwin, txt_y, txt_x); + show_opaque(stswin, txtwin, TRUE, -1); + if (Quit(ch)) + break; + + switch (ch) { + case '\t': + in_status = TRUE; + break; + case KEY_DOWN: + case 'j': + if (txt_y < getmaxy(txtwin) - 1) + txt_y++; + else + beep(); + break; + case KEY_UP: + case 'k': + if (txt_y > base_y) + txt_y--; + else + beep(); + break; + case KEY_LEFT: + case 'h': + if (txt_x > 0) + txt_x--; + else + beep(); + break; + case KEY_RIGHT: + case 'l': + if (txt_x < getmaxx(txtwin) - 1) + txt_x++; + else + beep(); + break; + case 'w': + test_opaque(level + 1, argv, stswin); + if (txtbox != 0) { + touchwin(txtbox); + wnoutrefresh(txtbox); + } else { + touchwin(txtwin); + wnoutrefresh(txtwin); + } + break; + default: + beep(); + napms(100); + break; + } + + show_opaque(stswin, txtwin, FALSE, -1); + } + } + if (level > 1) { + delwin(txtwin); + delwin(txtbox); + } + return TRUE; +} + +static void +test_set_escdelay(void) +{ + set_escdelay((100 + ESCDELAY) / 2); +} + +static void +test_set_tabsize(void) +{ + int y0, x0; + int y, x; + int save_tabsize = TABSIZE; + + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + + for (y = 0; y < LINES; ++y) { + set_tabsize(y + 1); + if (move(y, 0) == ERR) + break; + for (x = 0; x < COLS;) { + addch('\t'); + if (addch('*') == ERR) { + break; + } + getyx(stdscr, y0, x0); + if (y0 != y || x0 == x) { + break; + } + } + } + getch(); + erase(); + + set_tabsize(save_tabsize); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_opaque [options] file1 [file2 [...]]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *stsbox; + WINDOW *stswin; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + if (optind + 1 > argc) + usage(FALSE); + + initscr(); + + test_set_escdelay(); + test_set_tabsize(); + + stsbox = derwin(stdscr, BASE_Y, COLS, 0, 0); + box(stsbox, 0, 0); + wnoutrefresh(stsbox); + + stswin = derwin(stsbox, BASE_Y - 2, COLS - 2, 1, 1); + keypad(stswin, TRUE); + + test_opaque(optind, argv, stswin); + + endwin(); + ExitProgram(EXIT_SUCCESS); +} +#else +int +main(void) +{ + printf("This program requires the ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_setupterm.c b/contrib/ncurses/test/test_setupterm.c new file mode 100644 index 00000000..24d7c46c --- /dev/null +++ b/contrib/ncurses/test/test_setupterm.c @@ -0,0 +1,275 @@ +/**************************************************************************** + * Copyright 2020-2022,2023 Thomas E. Dickey * + * Copyright 2015,2016 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: test_setupterm.c,v 1.17 2023/06/24 14:19:52 tom Exp $ + * + * A simple demo of setupterm/restartterm. + */ +#include + +#if HAVE_TIGETSTR + +static bool a_opt = FALSE; +static bool f_opt = FALSE; +static bool n_opt = FALSE; +static bool r_opt = FALSE; + +#if NO_LEAKS +static TERMINAL **saved_terminals; +static size_t num_saved; +static size_t max_saved; + +static void +failed(const char *msg) +{ + perror(msg); + ExitProgram(EXIT_FAILURE); +} + +static void +finish(int code) +{ + size_t n; + for (n = 0; n < num_saved; ++n) + del_curterm(saved_terminals[n]); + free(saved_terminals); + ExitProgram(code); +} + +static void +save_curterm(void) +{ + size_t n; + bool found = FALSE; + for (n = 0; n < num_saved; ++n) { + if (saved_terminals[n] == cur_term) { + found = TRUE; + break; + } + } + if (!found) { + if (num_saved + 1 >= max_saved) { + max_saved += 100; + saved_terminals = typeRealloc(TERMINAL *, max_saved, saved_terminals); + if (saved_terminals == NULL) + failed("realloc"); + } + saved_terminals[num_saved++] = cur_term; + } +} + +#else +#define finish(code) ExitProgram(code) +#define save_curterm() /* nothing */ +#endif + +static void +test_rc(NCURSES_CONST char *name, int actual_rc, int actual_err) +{ + int expect_rc = -1; + int expect_err = -1; + + if (name == 0) + name = getenv("TERM"); + if (name == 0) + name = "?"; + + switch (*name) { + case 'v': /* vt100 is normal */ + case 'd': /* dumb has no special flags */ + expect_rc = 0; + expect_err = 1; + break; + case 'l': /* lpr is hardcopy */ + expect_err = 1; + break; + case 'u': /* unknown is generic */ + expect_err = 0; + break; + default: + break; + } + if (n_opt) { + expect_rc = -1; + expect_err = -1; + } + printf("%s", + ((actual_rc == expect_rc && actual_err == expect_err) + ? "OK" + : "ERR")); + printf(" '%s'", name); + if (actual_rc == expect_rc) { + printf(" rc=%d", actual_rc); + } else { + printf(" rc=%d (%d)", actual_rc, expect_rc); + } + if (actual_err == expect_err) { + printf(" err=%d", actual_err); + } else { + printf(" err=%d (%d)", actual_err, expect_err); + } + printf("\n"); +} + +static void +test_setupterm(NCURSES_CONST char *name) +{ + int rc; + int err = -99; + +#if HAVE_RESTARTTERM + if (r_opt) + rc = restartterm(name, 0, f_opt ? NULL : &err); + else +#endif + rc = setupterm(name, 0, f_opt ? NULL : &err); + test_rc(name, rc, err); + save_curterm(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_setupterm [options] [terminal]" + ,"" + ,USAGE_COMMON + ,"Demonstrate error-checking for setupterm and restartterm." + ,"" + ,"Options:" + ," -a automatic test for each success/error code" + ," -f treat errors as fatal" + ," -n set environment to disable terminfo database, assuming" + ," the compiled-in paths for database also fail" +#if HAVE_RESTARTTERM + ," -r test restartterm rather than setupterm" +#endif + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + finish(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int n; + + while ((ch = getopt(argc, argv, OPTS_COMMON "afnr")) != -1) { + switch (ch) { + case 'a': + a_opt = TRUE; + break; + case 'f': + f_opt = TRUE; + break; + case 'n': + n_opt = TRUE; + break; +#if HAVE_RESTARTTERM + case 'r': + r_opt = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + if (n_opt) { + static char none[][25] = + { + "HOME=/GUI", + "TERMINFO=/GUI", + "TERMINFO_DIRS=/GUI" + }; + /* + * We can turn this off, but not on again, because ncurses caches the + * directory locations. + */ + printf("** without database\n"); + for (n = 0; n < 3; ++n) + putenv(none[n]); + } else { + printf("** with database\n"); + } + + /* + * The restartterm relies on an existing screen, so we make one here. + */ + if (r_opt) { + newterm("ansi", stdout, stdin); + reset_shell_mode(); + save_curterm(); + } + + if (a_opt) { + static char predef[][9] = + {"vt100", "dumb", "lpr", "unknown", "none-such"}; + if (optind < argc) { + usage(FALSE); + } + for (n = 0; n < 4; ++n) { + test_setupterm(predef[n]); + } + } else { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + test_setupterm(argv[n]); + } + } else { + test_setupterm(NULL); + } + } + + finish(EXIT_SUCCESS); +} + +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + printf("This program requires the terminfo functions such as tigetstr\n"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/test_sgr.c b/contrib/ncurses/test/test_sgr.c new file mode 100644 index 00000000..f7a7863b --- /dev/null +++ b/contrib/ncurses/test/test_sgr.c @@ -0,0 +1,392 @@ +/**************************************************************************** + * Copyright 2019-2023,2024 Thomas E. Dickey * + * Copyright 2015-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: test_sgr.c,v 1.25 2024/10/06 21:05:50 tom Exp $ + * + * A simple demo of the sgr/sgr0 terminal capabilities. + */ +#define USE_TINFO +#include + +#if !HAVE_TIGETSTR +static GCC_NORETURN void failed(const char *); + +static void +failed(const char *msg) +{ + fprintf(stderr, "%s\n", msg); + ExitProgram(EXIT_FAILURE); +} +#endif + +#if HAVE_TIGETSTR + +static bool no_init = FALSE; +static bool q_opt = FALSE; + +static char *d_opt; +static char *e_opt; +static char **db_list; +static int db_item; + +static long total_values; + +static char * +make_dbitem(const char *const p, const char *const q) +{ + size_t need = strlen(e_opt) + 2 + (size_t) (p - q); + char *result = malloc(need); + _nc_SPRINTF(result, _nc_SLIMIT(need) "%s=%.*s", e_opt, (int) (p - q), q); + return result; +} + +static void +make_dblist(void) +{ + if (d_opt && e_opt) { + int pass; + + for (pass = 0; pass < 2; ++pass) { + char *p, *q; + size_t count = 0; + + for (p = q = d_opt; *p != '\0'; ++p) { + if (*p == ':') { + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + q = p + 1; + } + } + if (p != q + 1) { + if (pass) { + db_list[count] = make_dbitem(p, q); + } + count++; + } + if (!pass) { + db_list = typeCalloc(char *, count + 1); + } + } + } +} + +static char * +next_dbitem(void) +{ + char *result = 0; + + if (db_list) { + if ((result = db_list[db_item]) == 0) { + db_item = 0; + result = db_list[0]; + } else { + db_item++; + } + } + printf("** %s\n", result ? result : ""); + return result; +} + +#if NO_LEAKS +static void +free_dblist(void) +{ + if (db_list) { + int n; + for (n = 0; db_list[n]; ++n) + free(db_list[n]); + free(db_list); + db_list = 0; + } +} +#endif + +#define MAXPAR 9 +#define MAXSGR (1 << MAXPAR) +#define BITS2P(n) (count & (1 << (n - 1))) +#define MASK_SMSO (1 << 0) +#define MASK_BOLD (1 << 5) +#define MASK_REV (1 << 2) + +static void +dumpit(unsigned bits, unsigned ignore, NCURSES_CONST char *sgr, NCURSES_CONST char *sgr0) +{ + static NCURSES_CONST char sample[] = "abcdefghijklm"; + static NCURSES_CONST char params[] = "SURBDBIPA"; + unsigned n; + + printf("%4u ", bits); + bits &= ~ignore; + for (n = 0; n < MAXPAR; ++n) { + putchar((int) ((bits & (unsigned) (1 << n)) ? params[n] : '-')); + } + putchar(' '); + putp(sgr); + putp(sample); + putp(sgr0); + putchar('\n'); +} + +static bool +one_bit(unsigned a, unsigned b) +{ + unsigned c = (a ^ b); + bool result = FALSE; + if (c) { + while (!(c & 1)) { + c >>= 1; + } + result = (c == 1); + } + return result; +} + +static void +brute_force(const char *name) +{ + NCURSES_CONST char *my_sgr; + NCURSES_CONST char *my_sgr0; + NCURSES_CONST char *my_bold; + NCURSES_CONST char *my_revs; + NCURSES_CONST char *my_smso; + char *my_name = strdup(name); + + if (db_list) { + putenv(next_dbitem()); + } + + if (!q_opt) + printf("Terminal type \"%s\"\n", my_name); + + if (no_init) { + START_TRACE(); + } else { + setupterm((NCURSES_CONST char *) my_name, 1, (int *) 0); + } + + if (!q_opt) { + if (strcmp(my_name, ttytype)) + printf("... actual \"%s\"\n", ttytype); + } + + my_sgr = tigetstr("sgr"); + my_sgr0 = tigetstr("sgr0"); + my_bold = tigetstr("bold"); + my_revs = tigetstr("rev"); + my_smso = tigetstr("smso"); + + if (!VALID_STRING(my_sgr)) { + fprintf(stderr, "no \"sgr\" capability found\n"); + } else if (!VALID_STRING(my_sgr0)) { + fprintf(stderr, "no \"sgr0\" capability found\n"); + } else { + char *values[MAXSGR + MAXPAR]; + unsigned j; + unsigned ignore = 0; + unsigned reason = 0; + unsigned repeat = 0; + unsigned count; + for (count = 0; count < MAXSGR; ++count) { + values[count] = tparm(my_sgr, + BITS2P(1), + BITS2P(2), + BITS2P(3), + BITS2P(4), + BITS2P(5), + BITS2P(6), + BITS2P(7), + BITS2P(8), + BITS2P(9)); + if (values[count] != 0) { + values[count] = strdup(values[count]); + } + } + for (count = 0; count < MAXSGR; ++count) { + if (values[count] != 0) { + for (j = count + 1; j < MAXSGR; ++j) { + if (values[j] == 0) + continue; + if (strcmp(values[count], values[j])) + continue; + if (one_bit(count, j)) { + free(values[j]); + values[j] = 0; + } + } + } + } + for (j = 0; j < MAXPAR; ++j) { + unsigned mask = (unsigned) (1 << j); + for (count = 0; count < MAXSGR; ++count) { + if ((count & mask) != 0) + continue; + if (values[count] != 0 && values[count + mask] != 0) { + mask = 0; + break; + } + } + ignore |= mask; + } + /* smso is tested first, but often duplicates bold or reverse. */ + if (VALID_STRING(my_smso)) { + if (VALID_STRING(my_bold) && !strcmp(my_bold, my_smso)) { + repeat |= MASK_SMSO; + reason = MASK_BOLD; + } + if (VALID_STRING(my_revs) && !strcmp(my_revs, my_smso)) { + repeat |= MASK_SMSO; + reason = MASK_REV; + } + } + for (count = 0; count < MAXSGR; ++count) { + if (values[count] != 0) { + bool found = FALSE; + if ((repeat & MASK_SMSO) != 0 + && (count & MASK_SMSO) != 0) { + found = TRUE; + } else { + for (j = 0; j < count; ++j) { + if (values[j] != 0 && !strcmp(values[j], values[count])) { + if ((repeat & MASK_SMSO) != 0 + && (j & MASK_SMSO) != 0 + && (count & reason) != 0) { + continue; + } + found = TRUE; + break; + } + } + } + if (!found) { + dumpit(count, ignore, values[count], my_sgr0); + ++total_values; + } + } + } + for (count = 0; count < MAXSGR; ++count) { + free(values[count]); + } + } + free(my_name); + del_curterm(cur_term); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_sgr [options] [terminal]" + ,"" + ,"Print all distinct combinations of sgr capability." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -d LIST colon-separated list of databases to use" + ," -e NAME environment variable to set with -d option" + ," -n do not initialize terminal, to test error-checking" + ," -q quiet (prints only counts)" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + const char *name; + + while ((ch = getopt(argc, argv, OPTS_COMMON "d:e:nq")) != -1) { + switch (ch) { + case 'd': + d_opt = optarg; + break; + case 'e': + e_opt = optarg; + break; + case 'n': + no_init = TRUE; + break; + case 'q': + q_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + make_dblist(); + + if (optind < argc) { + int n; + for (n = optind; n < argc; ++n) { + brute_force(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + brute_force(name); + } else { + static const char dumb[] = "dumb"; + brute_force(dumb); + } + + printf("%ld distinct values\n", total_values); + +#if NO_LEAKS + free_dblist(); +#endif + + ExitProgram(EXIT_SUCCESS); +} + +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + failed("This program requires the terminfo functions such as tigetstr"); + ExitProgram(EXIT_FAILURE); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/test_termattrs.c b/contrib/ncurses/test/test_termattrs.c new file mode 100644 index 00000000..ec44cc22 --- /dev/null +++ b/contrib/ncurses/test/test_termattrs.c @@ -0,0 +1,207 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_termattrs.c,v 1.8 2022/12/10 23:23:27 tom Exp $ + * + * Demonstrate the termattrs and term_attrs functions. + */ + +#define USE_CURSES +#define USE_TINFO +#include + +#if HAVE_SETUPTERM + +static FILE *my_fp; + +static void +test_termattrs(unsigned long value) +{ +#define DATA(name) { name, #name } + static struct { + unsigned long code; + const char *name; + } table[] = { +#ifdef A_ATTRIBUTES + DATA(A_ATTRIBUTES), +#endif +#ifdef A_CHARTEXT + DATA(A_CHARTEXT), +#endif +#ifdef A_COLOR + DATA(A_COLOR), +#endif +#ifdef A_STANDOUT + DATA(A_STANDOUT), +#endif +#ifdef A_UNDERLINE + DATA(A_UNDERLINE), +#endif +#ifdef A_REVERSE + DATA(A_REVERSE), +#endif +#ifdef A_BLINK + DATA(A_BLINK), +#endif +#ifdef A_DIM + DATA(A_DIM), +#endif +#ifdef A_BOLD + DATA(A_BOLD), +#endif +#ifdef A_ALTCHARSET + DATA(A_ALTCHARSET), +#endif +#ifdef A_INVIS + DATA(A_INVIS), +#endif +#ifdef A_PROTECT + DATA(A_PROTECT), +#endif +#ifdef A_HORIZONTAL + DATA(A_HORIZONTAL), +#endif +#ifdef A_LEFT + DATA(A_LEFT), +#endif +#ifdef A_LOW + DATA(A_LOW), +#endif +#ifdef A_RIGHT + DATA(A_RIGHT), +#endif +#ifdef A_TOP + DATA(A_TOP), +#endif +#ifdef A_VERTICAL + DATA(A_VERTICAL), +#endif +#ifdef A_ITALIC + DATA(A_ITALIC), +#endif + }; + size_t n; + fprintf(my_fp, "Result: %08lX\r\n", value); + for (n = 0; n < SIZEOF(table); ++n) { + if ((value & table[n].code) != 0) { + fprintf(my_fp, "%08lX %08lX %s\r\n", + table[n].code, value & table[n].code, table[n].name); + } + }; + fputs("\r\n", my_fp); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_termattrs [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -e use stderr (default stdout)" + ," -n do not initialize terminal" + ," -s use setupterm rather than newterm" +#if USE_WIDEC_SUPPORT + ," -w use term_attrs rather than termattrs" +#endif + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + bool no_init = FALSE; + bool s_opt = FALSE; +#if USE_WIDEC_SUPPORT + bool w_opt = FALSE; +#endif + + my_fp = stdout; + + while ((ch = getopt(argc, argv, OPTS_COMMON "ensw")) != -1) { + switch (ch) { + case 'e': + my_fp = stderr; + break; + case 'n': + no_init = TRUE; + break; + case 's': + s_opt = TRUE; + break; +#if USE_WIDEC_SUPPORT + case 'w': + w_opt = TRUE; + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + if (no_init) { + START_TRACE(); + } else if (s_opt) { + setupterm((char *) 0, fileno(my_fp), (int *) 0); + } else { + newterm((char *) 0, my_fp, stdin); + } +#if USE_WIDEC_SUPPORT + if (w_opt) + test_termattrs((unsigned long) term_attrs()); + else +#endif + test_termattrs((unsigned long) termattrs()); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + fprintf(stderr, "This program requires terminfo\n"); + exit(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_tparm.c b/contrib/ncurses/test/test_tparm.c new file mode 100644 index 00000000..5a8f6502 --- /dev/null +++ b/contrib/ncurses/test/test_tparm.c @@ -0,0 +1,709 @@ +/**************************************************************************** + * Copyright 2020-2023,2024 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/* + * Author: Thomas E. Dickey + * + * $Id: test_tparm.c,v 1.42 2024/10/06 20:50:27 tom Exp $ + * + * Exercise tparm/tiparm, either for all possible capabilities with fixed + * parameters, or one capability with specific combinations of parameters. + */ +#define USE_TINFO +#include + +#if NCURSES_XNAMES +#if HAVE_TERM_ENTRY_H +#include +#else +#undef NCURSES_XNAMES +#define NCURSES_XNAMES 0 +#endif +#endif + +#define MAX_PARM 9 + +#define GrowArray(array,limit,length) \ + if (length + 2 >= limit) { \ + limit *= 2; \ + array = typeRealloc(char *, limit, array); \ + if (array == 0) { \ + failed("no memory: " #array); \ + } \ + } + +static GCC_NORETURN void failed(const char *); + +static void +failed(const char *msg) +{ + fprintf(stderr, "%s\n", msg); + ExitProgram(EXIT_FAILURE); +} + +#if HAVE_TIGETSTR + +static int a_opt; +static int p_opt; +static int v_opt; + +#if HAVE_TIPARM +static int i_opt; +#endif + +#if HAVE_TIPARM_S +static int s_opt; +#endif + +/* + * Total tests (and failures): + */ +static long total_tests; +static long total_fails; + +/* + * Total characters formatted for tputs: + */ +static long total_nulls; +static long total_ctrls; +static long total_print; + +static int +output_func(int ch) +{ + if (ch == 0) { + total_nulls++; + } else if (ch < 32 || (ch >= 127 && ch < 160)) { + total_ctrls++; + } else { + total_print++; + } + return ch; +} + +static int +isNumeric(NCURSES_CONST char *source) +{ + char *next = 0; + long value = strtol(source, &next, 0); + int result = (next == 0 || next == source || *next != '\0') ? 0 : 1; + (void) value; + return result; +} + +static int +relevant(const char *name, const char *value) +{ + int code = 1; + if (VALID_STRING(value)) { + if (strstr(value, "%p") == 0 + && strstr(value, "%d") == 0 + && strstr(value, "%s") == 0 + && (!p_opt || strstr(value, "$<") == 0)) { + if (v_opt > 2) + printf("? %s noparams\n", name); + code = 0; + } + } else { + if (v_opt > 2) { + printf("? %s %s\n", + (value == ABSENT_STRING) + ? "absent" + : "cancel", + name); + } + code = 0; + } + return code; +} + +static int +increment(long *all_parms, int *num_parms, int len_parms, int end_parms) +{ + int rc = 0; + int n; + + if (len_parms > MAX_PARM) + len_parms = MAX_PARM; + + if (end_parms < len_parms) { + if (all_parms[end_parms]++ >= num_parms[end_parms]) { + all_parms[end_parms] = 0; + increment(all_parms, num_parms, len_parms, end_parms + 1); + } + } + for (n = 0; n < len_parms; ++n) { + if (all_parms[n] != 0) { + rc = 1; + break; + } + } + /* return 1 until the vector resets to all 0's */ + return rc; +} + +/* parse the format string to determine which positional parameters + * are assumed to be strings. + */ +#if HAVE_TISCAN_S +static int +analyze_format(const char *format, int *mask, char **p_is_s) +{ + int arg_count; + int arg_mask; + int n; + if (tiscan_s(&arg_count, &arg_mask, format) == OK) { + *mask = arg_mask; + for (n = 0; n < MAX_PARM; ++n) { + static char dummy[1]; + p_is_s[n] = (arg_mask & 1) ? dummy : NULL; + arg_mask >>= 1; + } + } else { + *mask = 0; + arg_count = 0; + for (n = 0; n < MAX_PARM; ++n) { + p_is_s[n] = NULL; + } + } + return arg_count; +} +#elif HAVE__NC_TPARM_ANALYZE +extern int _nc_tparm_analyze(TERMINAL *, const char *, char **, int *); + +static int +analyze_format(const char *format, int *mask, char **p_is_s) +{ + int popcount = 0; + int analyzed = _nc_tparm_analyze(cur_term, format, p_is_s, &popcount); + int n; + if (analyzed < popcount) { + analyzed = popcount; + } + *mask = 0; + for (n = 0; n < MAX_PARM; ++n) { + if (p_is_s[n]) + *mask |= (1 << n); + } + return analyzed; +} +#else +/* TODO: make this work without direct use of ncurses internals. */ +static int +analyze_format(const char *format, int *mask, char **p_is_s) +{ + int n; + char *filler = strstr(format, "%s"); + *mask = 0; + for (n = 0; n < MAX_PARM; ++n) { + p_is_s[n] = filler; + } + return n; +} +#endif + +#define NumStr(n) use_strings[n] \ + ? (long) (my_intptr_t) (number[n] \ + ? string[n] \ + : NULL) \ + : number[n] + +#define NS_0(fmt) fmt +#define NS_1(fmt) NS_0(fmt), NumStr(0) +#define NS_2(fmt) NS_1(fmt), NumStr(1) +#define NS_3(fmt) NS_2(fmt), NumStr(2) +#define NS_4(fmt) NS_3(fmt), NumStr(3) +#define NS_5(fmt) NS_4(fmt), NumStr(4) +#define NS_6(fmt) NS_5(fmt), NumStr(5) +#define NS_7(fmt) NS_6(fmt), NumStr(6) +#define NS_8(fmt) NS_7(fmt), NumStr(7) +#define NS_9(fmt) NS_8(fmt), NumStr(8) + +static void +test_tparm(const char *name, NCURSES_CONST char *format, long *number, char **string) +{ + char *use_strings[MAX_PARM]; + char *result = NULL; + int nparam; + int mask; + + nparam = analyze_format(format, &mask, use_strings); +#if HAVE_TIPARM_S + if (s_opt) { + switch (nparam) { + case 0: + result = tiparm_s(0, mask, NS_0(format)); + break; + case 1: + result = tiparm_s(1, mask, NS_1(format)); + break; + case 2: + result = tiparm_s(2, mask, NS_2(format)); + break; + case 3: + result = tiparm_s(3, mask, NS_3(format)); + break; + case 4: + result = tiparm_s(4, mask, NS_4(format)); + break; + case 5: + result = tiparm_s(5, mask, NS_5(format)); + break; + case 6: + result = tiparm_s(6, mask, NS_6(format)); + break; + case 7: + result = tiparm_s(7, mask, NS_7(format)); + break; + case 8: + result = tiparm_s(8, mask, NS_8(format)); + break; + case 9: + result = tiparm_s(9, mask, NS_9(format)); + break; + } + } else +#endif +#if HAVE_TIPARM + if (i_opt) { + switch (nparam) { + case 0: + result = tiparm(NS_0(format)); + break; + case 1: + result = tiparm(NS_1(format)); + break; + case 2: + result = tiparm(NS_2(format)); + break; + case 3: + result = tiparm(NS_3(format)); + break; + case 4: + result = tiparm(NS_4(format)); + break; + case 5: + result = tiparm(NS_5(format)); + break; + case 6: + result = tiparm(NS_6(format)); + break; + case 7: + result = tiparm(NS_7(format)); + break; + case 8: + result = tiparm(NS_8(format)); + break; + case 9: + result = tiparm(NS_9(format)); + break; + } + } else +#endif + result = tparm(NS_9(format)); + total_tests++; + if (result != NULL) { + tputs(result, 1, output_func); + } else { + total_fails++; + } + if (v_opt > 1) { + int n; + printf(".. %3d =", result != 0 ? (int) strlen(result) : -1); + for (n = 0; n < nparam; ++n) { + if (use_strings[n]) { + if (number[n]) { + printf(" \"%s\"", string[n]); + } else { + printf(" ?"); + } + } else { + printf(" %2ld", number[n]); + } + } + printf(" %s\n", name); + } +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_tparm [options] [capability] [value1 [value2 [...]]]" + ,"" + ,"Use tparm/tputs for all distinct combinations of given capability." + ,"" + ,USAGE_COMMON + ,"Options:" + ," -T TERM override $TERM; this may be a comma-separated list or \"-\"" + ," to read a list from standard-input" + ," -a test all combinations of parameters" + ," [value1...] forms a vector of maximum parameter-values." +#if HAVE_TIPARM + ," -i test tiparm rather than tparm" +#endif + ," -p test capabilities with no parameters but having padding" + ," -r NUM repeat tests NUM times" +#if HAVE_TIPARM_S + ," -s test tiparm_s rather than tparm" +#endif + ," -v show values and results" + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} + +#define PLURAL(n) n, (n != 1) ? "s" : "" +#define COLONS(n) (n >= 1) ? ":" : "" + +#define NUMFORM "%10ld" +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int n; + int r_run, t_run, n_run; + char *old_term = getenv("TERM"); + int r_opt = 1; + char *t_opt = 0; + + int std_caps = 0; /* predefine items in all_caps[] */ + int len_caps = 0; /* cur # of items in all_caps[] */ + int max_caps = 10; /* max # of items in all_caps[] */ + char **all_caps = typeCalloc(char *, max_caps); + + long all_parms[10]; /* workspace for "-a" option */ + + int len_terms = 0; /* cur # of items in all_terms[] */ + int max_terms = 10; /* max # of items in all_terms[] */ + char **all_terms = typeCalloc(char *, max_terms); + + int use_caps; + int max_name = 10; /* max # of items in cap_name[] */ + int max_data = 10; /* max # of items in cap_data[] */ + char **cap_name; + char **cap_data; + + int len_parms = 0; /* cur # of items in num_parms[], str_parms[] */ + int max_parms = argc + 10; /* max # of items in num_parms[], str_parms[] */ + int *num_parms = typeCalloc(int, max_parms); + char **str_parms = typeCalloc(char *, max_parms); + long use_parms = 1; + + if (all_caps == 0 || all_terms == 0 || num_parms == 0 || str_parms == 0) + failed("no memory"); + + while ((ch = getopt(argc, argv, OPTS_COMMON "T:aipr:sv")) != -1) { + switch (ch) { + case 'T': + t_opt = optarg; + break; + case 'a': + ++a_opt; + break; +#if HAVE_TIPARM + case 'i': + ++i_opt; + break; +#endif + case 'p': + ++p_opt; + break; + case 'r': + r_opt = atoi(optarg); + break; +#if HAVE_TIPARM_S + case 's': + ++s_opt; + break; +#endif + case 'v': + ++v_opt; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + /* + * If there is a nonnumeric parameter after the options, use that as the + * capability name. + */ + if (optind < argc) { + if (!isNumeric(argv[optind])) { + all_caps[len_caps++] = strdup(argv[optind++]); + } + } + + /* + * Any remaining arguments must be possible parameter values. If numeric, + * and "-a" is not set, use those as the actual values for which the + * capabilities are tested. + */ + while (optind < argc) { + if (isNumeric(argv[optind])) { + char *dummy = 0; + long value = strtol(argv[optind], &dummy, 0); + num_parms[len_parms] = (int) value; + } + str_parms[len_parms] = argv[optind]; + ++optind; + ++len_parms; + } + for (n = len_parms; n < max_parms; ++n) { + static char dummy[1]; + str_parms[n] = dummy; + } + if (v_opt) { + printf("%d parameter%s%s\n", PLURAL(len_parms), COLONS(len_parms)); + if (v_opt > 3) { + for (n = 0; n < len_parms; ++n) { + printf(" %d: %d (%s)\n", n + 1, num_parms[n], str_parms[n]); + } + } + } + + /* + * Make a list of values for $TERM. Accept "-" for standard input to + * simplify scripting a check of the whole database. + */ + old_term = strdup((old_term == 0) ? "unknown" : old_term); + if (t_opt != 0) { + if (!strcmp(t_opt, "-")) { + char buffer[BUFSIZ]; + while (fgets(buffer, sizeof(buffer) - 1, stdin) != 0) { + char *s = buffer; + char *t; + while (isspace(UChar(s[0]))) + ++s; + t = s + strlen(s); + while (t != s && isspace(UChar(t[-1]))) + *--t = '\0'; + s = strdup(s); + if (len_terms + 2 >= max_terms) { + max_terms *= 2; + all_terms = typeRealloc(char *, max_terms, all_terms); + if (all_terms == 0) + failed("no memory: all_terms"); + } + all_terms[len_terms++] = s; + } + } else { + char *s = t_opt; + NCURSES_CONST char *t; + while ((t = strtok(s, ",")) != 0) { + s = 0; + if (len_terms + 2 >= max_terms) { + max_terms *= 2; + all_terms = typeRealloc(char *, max_terms, all_terms); + if (all_terms == 0) + failed("no memory: all_terms"); + } + all_terms[len_terms++] = strdup(t); + } + } + } else { + all_terms[len_terms++] = strdup(old_term); + } + all_terms[len_terms] = 0; + if (v_opt) { + printf("%d term%s:\n", PLURAL(len_terms)); + if (v_opt > 3) { + for (n = 0; n < len_terms; ++n) { + printf(" %d: %s\n", n + 1, all_terms[n]); + } + } + } + + /* + * If no capability name was selected, use the predefined list of string + * capabilities. + * + * TODO: To address the "other" systems which do not follow SVr4, + * just use the output from infocmp on $TERM. + */ + if (len_caps == 0) { +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) + for (n = 0; strnames[n] != 0; ++n) { + GrowArray(all_caps, max_caps, len_caps); + all_caps[len_caps++] = strdup(strnames[n]); + } +#else + all_caps[len_caps++] = strdup("cup"); + all_caps[len_caps++] = strdup("sgr"); +#endif + } + std_caps = len_caps; + all_caps[len_caps] = 0; + if (v_opt) { + printf("%d name%s%s\n", PLURAL(len_caps), COLONS(len_caps)); + if (v_opt > 3) { + for (n = 0; n < len_caps; ++n) { + printf(" %d: %s\n", n + 1, all_caps[n]); + } + } + } + + cap_name = typeMalloc(char *, (max_name = 1 + len_caps)); + cap_data = typeMalloc(char *, (max_data = 1 + len_caps)); + + if (r_opt <= 0) + r_opt = 1; + + if (a_opt) { + for (n = 0; n < max_parms; ++n) + if (num_parms[n]) + use_parms *= (num_parms[n] + 1); + } + + for (r_run = 0; r_run < r_opt; ++r_run) { + for (t_run = 0; t_run < len_terms; ++t_run) { + int errs; + + if (setupterm(all_terms[t_run], fileno(stdout), &errs) != OK) { + printf("** skipping %s (errs:%d)\n", all_terms[t_run], errs); + } +#if NCURSES_XNAMES + len_caps = std_caps; + if (cur_term) { + NCURSES_CONST TERMTYPE *term = (TERMTYPE *) cur_term; + for (n = STRCOUNT; n < NUM_STRINGS(term); ++n) { + GrowArray(all_caps, max_caps, len_caps); + GrowArray(cap_name, max_name, len_caps); + GrowArray(cap_data, max_data, len_caps); + all_caps[len_caps++] = strdup(ExtStrname(term, (int) n, strnames)); + } + } +#else + (void) std_caps; +#endif + + /* + * Most of the capabilities have no parameters, e.g., they are + * function-keys or simple operations such as clear-display. + * Ignore those, since they do not really exercise tparm. + */ + use_caps = 0; + for (n = 0; n < len_caps; ++n) { + char *value = tigetstr(all_caps[n]); + if (relevant(all_caps[n], value)) { + cap_name[use_caps] = all_caps[n]; + cap_data[use_caps] = value; + use_caps++; + } + } + + if (v_opt) { + printf("[%d:%d] %d paramerized cap%s * %ld test-case%s \"%s\"\n", + r_run + 1, r_opt, + PLURAL(use_caps), + PLURAL(use_parms), + all_terms[t_run]); + } + + memset(all_parms, 0, sizeof(all_parms)); + if (a_opt) { + /* for each combination of values */ + do { + for (n_run = 0; n_run < use_caps; ++n_run) { + test_tparm(cap_name[n_run], + cap_data[n_run], + all_parms, + str_parms); + } + } + while (increment(all_parms, num_parms, len_parms, 0)); + } else { + /* for the given values */ + for (n_run = 0; n_run < use_caps; ++n_run) { + test_tparm(cap_name[n_run], + cap_data[n_run], + all_parms, + str_parms); + } + } +#if NCURSES_XNAMES + for (n = std_caps; n < len_caps; ++n) { + free(all_caps[n]); + } +#endif + if (cur_term != 0) { + del_curterm(cur_term); + } else { + printf("? no cur_term\n"); + } + } + } + + printf("Tests:\n"); + printf(NUMFORM " total\n", total_tests); + if (total_fails) + printf(NUMFORM " failed\n", total_fails); + printf("Characters:\n"); + printf(NUMFORM " nulls\n", total_nulls); + printf(NUMFORM " controls\n", total_ctrls); + printf(NUMFORM " printable\n", total_print); + printf(NUMFORM " total\n", total_nulls + total_ctrls + total_print); +#if NO_LEAKS + for (n = 0; n < std_caps; ++n) { + free(all_caps[n]); + } + free(all_caps); + free(old_term); + for (n = 0; n < len_terms; ++n) { + free(all_terms[n]); + } + free(all_terms); + free(num_parms); + free(str_parms); + free(cap_name); + free(cap_data); +#endif + + ExitProgram(EXIT_SUCCESS); +} + +#else /* !HAVE_TIGETSTR */ +int +main(void) +{ + failed("This program requires the terminfo functions such as tigetstr"); +} +#endif /* HAVE_TIGETSTR */ diff --git a/contrib/ncurses/test/test_unget_wch.c b/contrib/ncurses/test/test_unget_wch.c new file mode 100644 index 00000000..58085304 --- /dev/null +++ b/contrib/ncurses/test/test_unget_wch.c @@ -0,0 +1,116 @@ +/**************************************************************************** + * Copyright 2022 Thomas E. Dickey * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_unget_wch.c,v 1.4 2022/12/10 23:31:31 tom Exp $ + * + * Demonstrate the unget_wch and unget functions. + */ + +#include + +#if USE_WIDEC_SUPPORT && HAVE_UNGET_WCH +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: test_unget_wch [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int step = 0; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + initscr(); + keypad(stdscr, TRUE); + cbreak(); + noecho(); + scrollok(stdscr, TRUE); + + for (;;) { + wint_t widechar; + int rc = get_wch(&widechar); + if (rc == KEY_CODE_YES) { + printw("KEY[%d] %s\n", ++step, keyname((int) widechar)); + ungetch((int) widechar); + printw("...[%d] %s\n", step, keyname(getch())); + } else if (widechar == QUIT || widechar == ESCAPE) { + break; + } else { + printw("CHR[%d] %s\n", ++step, key_name((wchar_t) widechar)); + unget_wch((wchar_t) widechar); + rc = get_wch(&widechar); + printw("%s[%d] %s\n", + ((rc == KEY_CODE_YES) + ? "???" + : "..."), + step, key_name((wchar_t) widechar)); + } + } + + endwin(); + + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the wide-ncurses library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_vid_puts.c b/contrib/ncurses/test/test_vid_puts.c new file mode 100644 index 00000000..0d7d7abb --- /dev/null +++ b/contrib/ncurses/test/test_vid_puts.c @@ -0,0 +1,166 @@ +/**************************************************************************** + * Copyright 2020-2021,2022 Thomas E. Dickey * + * Copyright 2013-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_vid_puts.c,v 1.17 2022/12/10 22:28:50 tom Exp $ + * + * Demonstrate the vid_puts and vid_attr functions. + * Thomas Dickey - 2013/01/12 + */ + +#define USE_TINFO +#include + +#if USE_WIDEC_SUPPORT && HAVE_SETUPTERM && HAVE_VID_PUTS + +static FILE *my_fp; +static bool p_opt = FALSE; + +static +TPUTS_PROTO(outc, c) +{ + int rc; + + rc = putc(c, my_fp); + TPUTS_RETURN(rc); +} + +static bool +outs(const char *s) +{ + if (VALID_STRING(s)) { + tputs(s, 1, outc); + return TRUE; + } + return FALSE; +} + +static void +cleanup(void) +{ + if (cur_term != 0) { + outs(exit_attribute_mode); + if (!outs(orig_colors)) + outs(orig_pair); + outs(cursor_normal); + } +} + +static void +change_attr(chtype attr) +{ + if (p_opt) { + vid_puts(attr, (short) 0, (void *) 0, outc); + } else { + vid_attr(attr, (short) 0, (void *) 0); + } +} + +static void +test_vid_puts(void) +{ + fprintf(my_fp, "Name: "); + change_attr(A_BOLD); + fputs("Bold", my_fp); + change_attr(A_REVERSE); + fputs(" Reverse", my_fp); + change_attr(A_NORMAL); + fputs("\n", my_fp); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_vid_puts [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -e use stderr (default stdout)" + ," -n do not initialize terminal" + ," -p use vid_puts (default vid_attr)" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + bool no_init = FALSE; + + my_fp = stdout; + + while ((ch = getopt(argc, argv, OPTS_COMMON "enp")) != -1) { + switch (ch) { + case 'e': + my_fp = stderr; + break; + case 'n': + no_init = TRUE; + break; + case 'p': + p_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + if (no_init) { + START_TRACE(); + } else { + setupterm((char *) 0, fileno(my_fp), (int *) 0); + } + test_vid_puts(); + cleanup(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + printf("This program requires the wide-ncurses terminfo library\n"); + ExitProgram(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/test_vidputs.c b/contrib/ncurses/test/test_vidputs.c new file mode 100644 index 00000000..0c02cdee --- /dev/null +++ b/contrib/ncurses/test/test_vidputs.c @@ -0,0 +1,165 @@ +/**************************************************************************** + * Copyright 2020-2022,2024 Thomas E. Dickey * + * Copyright 2013-2014,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * $Id: test_vidputs.c,v 1.16 2024/10/06 21:17:54 tom Exp $ + * + * Demonstrate the vidputs and vidattr functions. + * Thomas Dickey - 2013/01/12 + */ + +#define USE_TINFO +#include + +#if HAVE_SETUPTERM && HAVE_VIDPUTS + +static FILE *my_fp; +static bool p_opt = FALSE; + +static +TPUTS_PROTO(outc, c) +{ + int rc; + + rc = putc(c, my_fp); + TPUTS_RETURN(rc); +} + +static bool +outs(NCURSES_CONST char *s) +{ + if (VALID_STRING(s)) { + tputs(s, 1, outc); + return TRUE; + } + return FALSE; +} + +static void +cleanup(void) +{ + if (cur_term != 0) { + outs(exit_attribute_mode); + if (!outs(orig_colors)) + outs(orig_pair); + outs(cursor_normal); + } +} + +static void +change_attr(chtype attr) +{ + if (p_opt) { + vidputs(attr, outc); + } else { + vidattr(attr); + } +} + +static void +test_vidputs(void) +{ + fprintf(my_fp, "Name: "); + change_attr(A_BOLD); + fputs("Bold", my_fp); + change_attr(A_REVERSE); + fputs(" Reverse", my_fp); + change_attr(A_NORMAL); + fputs("\n", my_fp); +} + +static void +usage(int ok) +{ + static const char *tbl[] = + { + "Usage: test_vidputs [options]" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -e use stderr (default stdout)" + ," -n do not initialize terminal" + ," -p use vidputs (default vidattr)" + }; + unsigned n; + for (n = 0; n < SIZEOF(tbl); ++n) + fprintf(stderr, "%s\n", tbl[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + bool no_init = FALSE; + + my_fp = stdout; + + while ((ch = getopt(argc, argv, OPTS_COMMON "enp")) != -1) { + switch (ch) { + case 'e': + my_fp = stderr; + break; + case 'n': + no_init = TRUE; + break; + case 'p': + p_opt = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + if (no_init) { + START_TRACE(); + } else { + setupterm((char *) 0, fileno(my_fp), (int *) 0); + } + test_vidputs(); + cleanup(); + ExitProgram(EXIT_SUCCESS); +} + +#else +int +main(void) +{ + fprintf(stderr, "This program requires terminfo\n"); + exit(EXIT_FAILURE); +} +#endif diff --git a/contrib/ncurses/test/testaddch.c b/contrib/ncurses/test/testaddch.c new file mode 100644 index 00000000..e393c3cc --- /dev/null +++ b/contrib/ncurses/test/testaddch.c @@ -0,0 +1,121 @@ +/**************************************************************************** + * Copyright 2020,2022 Thomas E. Dickey * + * Copyright 1998-2013,2014 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * This is an example written by Alexander V. Lukyanov , + * to demonstrate an inconsistency between ncurses and SVr4 curses. + * + * $Id: testaddch.c,v 1.15 2022/12/10 23:44:18 tom Exp $ + */ +#include + +static void +attr_addstr(const char *s, chtype a) +{ + while (*s) + addch(((unsigned char) (*s++)) | a); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: testaddch [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + unsigned i; + chtype back, set, attr; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + + initscr(); + start_color(); + init_pair(1, COLOR_WHITE, COLOR_BLUE); + init_pair(2, COLOR_WHITE, COLOR_RED); + init_pair(3, COLOR_BLACK, COLOR_MAGENTA); + init_pair(4, COLOR_BLACK, COLOR_GREEN); + init_pair(5, COLOR_BLACK, COLOR_CYAN); + init_pair(6, COLOR_BLACK, COLOR_YELLOW); + init_pair(7, COLOR_BLACK, COLOR_WHITE); + + for (i = 0; i < 8; i++) { + back = (i & 1) ? A_BOLD | 'B' : ' '; + set = (i & 2) ? A_REVERSE : 0; + attr = (chtype) ((i & 4) ? COLOR_PAIR(4) : 0); + + bkgdset(back); + (void) attrset(AttrArg(set, 0)); + + attr_addstr("Test string with spaces -> <-\n", attr); + } + addch('\n'); + for (i = 0; i < 8; i++) { + back = (i & 1) ? (A_BOLD | 'B' | (chtype) COLOR_PAIR(1)) : ' '; + set = (i & 2) ? (A_REVERSE | (chtype) COLOR_PAIR(2)) : 0; + attr = (chtype) ((i & 4) ? (chtype) COLOR_PAIR(4) : 0); + + bkgdset(back); + (void) attrset(AttrArg(set, 0)); + + attr_addstr("Test string with spaces -> <-\n", attr); + } + + getch(); + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/testcurs.c b/contrib/ncurses/test/testcurs.c new file mode 100644 index 00000000..7e6594b9 --- /dev/null +++ b/contrib/ncurses/test/testcurs.c @@ -0,0 +1,805 @@ +/* + * This is a test program for the PDCurses screen package for IBM PC type + * machines. + * + * This program was written by John Burnell (johnb@kea.am.dsir.govt.nz) + * wrs(5/28/93) -- modified to be consistent (perform identically) with either + * PDCurses or under Unix System V, R4 + * + * $Id: testcurs.c,v 1.59 2024/10/05 19:17:19 tom Exp $ + */ + +#include + +#if defined(XCURSES) +const char *XCursesProgramName = "testcurs"; +#endif + +static int initTest(WINDOW **); +static void display_menu(int, int); +static void inputTest(WINDOW *); +static void introTest(WINDOW *); +static void outputTest(WINDOW *); +#if HAVE_NEWPAD +static void padTest(WINDOW *); +#endif +static void scrollTest(WINDOW *); +#if defined(PDCURSES) && !defined(XCURSES) +static void resizeTest(WINDOW *); +#endif + +static int width, height; + +static void +Continue(WINDOW *win) +{ + int y1 = getmaxy(win); + int x1 = getmaxx(win); + int y0 = y1 < 10 ? y1 : 10; + int x0 = 1; + chtype save; + + save = mvwinch(win, y0, x1 - 1); + + MvWAddStr(win, y0, x0, " Press any key to continue"); + wclrtoeol(win); + getyx(win, y0, x0); + + MvWAddCh(win, y0, x1 - 1, save); + + wmove(win, y0, x0); + raw(); + wgetch(win); +} + +static int +initTest(WINDOW **win) +{ +#ifdef PDCDEBUG + PDC_debug("initTest called\n"); +#endif +#ifdef TRACE + curses_trace(TRACE_MAXIMUM); +#endif + initscr(); +#ifdef PDCDEBUG + PDC_debug("after initscr()\n"); +#endif +#ifdef A_COLOR + if (has_colors()) + start_color(); +#endif + width = 60; + height = 13; /* Create a drawing window */ + *win = newwin(height, width, (LINES - height) / 2, (COLS - width) / 2); + if (*win == NULL) { + stop_curses(); + return 0; + } + return 1; +} + +static void +introTest(WINDOW *win) +{ + wmove(win, height / 2 - 5, width / 2); + wvline(win, ACS_VLINE, 10); + wmove(win, height / 2, width / 2 - 10); + whline(win, ACS_HLINE, 20); + Continue(win); + + beep(); + werase(win); + + box(win, ACS_VLINE, ACS_HLINE); + wrefresh(win); + cbreak(); + MvWAddStr(win, 1, 1, + "You should have rectangle in the middle of the screen"); + MvWAddStr(win, 2, 1, "You should have heard a beep"); + Continue(win); + return; +} + +static void +scrollTest(WINDOW *win) +{ + int i; + int half; + int OldY; + NCURSES_CONST char *Message = "The window will now scroll slowly"; + + wclear(win); + OldY = getmaxy(win); + half = OldY / 2; + MvWAddStr(win, OldY - 2, 1, Message); + wrefresh(win); + scrollok(win, TRUE); + for (i = 1; i <= OldY; i++) { + napms(600); + scroll(win); + wrefresh(win); + } + + werase(win); + for (i = 1; i < OldY; i++) { + MvWPrintw(win, i, 1, "Line %d", i); + } + MvWPrintw(win, OldY - 2, 1, "The top of the window will scroll"); + wmove(win, 1, 1); + wsetscrreg(win, 0, half - 1); + box(win, ACS_VLINE, ACS_HLINE); + wrefresh(win); + for (i = 1; i <= half; i++) { + napms(600); + scroll(win); + box(win, ACS_VLINE, ACS_HLINE); + wrefresh(win); + } + + werase(win); + for (i = 1; i < OldY; i++) { + MvWPrintw(win, i, 1, "Line %d", i); + } + MvWPrintw(win, 1, 1, "The bottom of the window will scroll"); + wmove(win, OldY - 2, 1); + wsetscrreg(win, half, --OldY); + box(win, ACS_VLINE, ACS_HLINE); + wrefresh(win); + for (i = half; i <= OldY; i++) { + napms(600); + wscrl(win, -1); + box(win, ACS_VLINE, ACS_HLINE); + wrefresh(win); + } + wsetscrreg(win, 0, OldY); +} + +static void +inputTest(WINDOW *win) +{ + int answered; + int repeat; + int w, h, bx, by, sw, sh, i, num; + char buffer[80]; + WINDOW *subWin; + wclear(win); + + getmaxyx(win, h, w); + getbegyx(win, by, bx); + sw = w / 3; + sh = h / 3; + if ((subWin = subwin(win, sh, sw, by + h - sh - 2, bx + w - sw - 2)) == NULL) + return; + +#ifdef A_COLOR + if (has_colors()) { + init_pair(2, COLOR_WHITE, COLOR_RED); + wbkgd(subWin, (chtype) COLOR_PAIR(2) | A_BOLD); + } else + wbkgd(subWin, A_BOLD); +#else + wbkgd(subWin, A_BOLD); +#endif + box(subWin, ACS_VLINE, ACS_HLINE); + wrefresh(win); + + nocbreak(); + MvWAddStr(win, 2, 1, "Press some keys for 5 seconds"); + MvWAddStr(win, 1, 1, "Pressing ^C should do nothing"); + wrefresh(win); + + werase(subWin); + box(subWin, ACS_VLINE, ACS_HLINE); + for (i = 0; i < 5; i++) { + MvWPrintw(subWin, 1, 1, "Time = %d", i); + wrefresh(subWin); + napms(1000); + flushinp(); + } + + delwin(subWin); + werase(win); + flash(); + wrefresh(win); + napms(500); + + MvWAddStr(win, 2, 1, "Press a key, followed by ENTER"); + wmove(win, 9, 10); + wrefresh(win); + echo(); + noraw(); + wgetch(win); + flushinp(); + + wmove(win, 9, 10); + wdelch(win); + MvWAddStr(win, 4, 1, "The character should now have been deleted"); + Continue(win); + + wclear(win); + MvWAddStr(win, 1, 1, "Press keys (or mouse buttons) to show their names"); + MvWAddStr(win, 2, 1, "Press spacebar to finish"); + wrefresh(win); + + keypad(win, TRUE); + raw(); + noecho(); + +#if HAVE_TYPEAHEAD + typeahead(-1); +#endif + +#ifdef NCURSES_MOUSE_VERSION + mousemask(ALL_MOUSE_EVENTS, (mmask_t *) 0); +#endif +#if defined(PDCURSES) + mouse_set(ALL_MOUSE_EVENTS); +#endif + + for (;;) { + int c; + + wmove(win, 3, 5); + c = wgetch(win); + wclrtobot(win); + if (c >= KEY_MIN) + wprintw(win, "Key Pressed: %s", keyname(c)); + else if (isprint(UChar(c))) + wprintw(win, "Key Pressed: %c", c); + else + wprintw(win, "Key Pressed: %s", unctrl(UChar(c))); +#ifdef KEY_MOUSE + if (c == KEY_MOUSE) { +#if defined(NCURSES_MOUSE_VERSION) +#define ButtonChanged(n) ((event.bstate) & NCURSES_MOUSE_MASK(n, (NCURSES_BUTTON_RELEASED|NCURSES_BUTTON_PRESSED|NCURSES_BUTTON_CLICKED|NCURSES_DOUBLE_CLICKED|NCURSES_TRIPLE_CLICKED|NCURSES_RESERVED_EVENT))) +#define ButtonPressed(n) ((event.bstate) & NCURSES_MOUSE_MASK(n, NCURSES_BUTTON_PRESSED)) +#define ButtonDouble(n) ((event.bstate) & NCURSES_MOUSE_MASK(n, NCURSES_DOUBLE_CLICKED)) +#define ButtonTriple(n) ((event.bstate) & NCURSES_MOUSE_MASK(n, NCURSES_TRIPLE_CLICKED)) +#define ButtonRelease(n) ((event.bstate) & NCURSES_MOUSE_MASK(n, NCURSES_BUTTON_RELEASED)) + MEVENT event; + int button = 0; + + getmouse(&event); + if (ButtonChanged(1)) + button = 1; + else if (ButtonChanged(2)) + button = 2; + else if (ButtonChanged(3)) + button = 3; + else + button = 0; + wmove(win, 4, 18); + wprintw(win, "Button %d: ", button); + if (ButtonPressed(button)) + wprintw(win, "pressed: "); + else if (ButtonDouble(button)) + wprintw(win, "double: "); + else if (ButtonTriple(button)) + wprintw(win, "triple: "); + else + wprintw(win, "released: "); + wprintw(win, " Position: Y: %d X: %d", event.y, event.x); +#elif defined(PDCURSES) + int button = 0; + request_mouse_pos(); + if (BUTTON_CHANGED(1)) + button = 1; + else if (BUTTON_CHANGED(2)) + button = 2; + else if (BUTTON_CHANGED(3)) + button = 3; + else + button = 0; + wmove(win, 4, 18); + wprintw(win, "Button %d: ", button); + if (MOUSE_MOVED) + wprintw(win, "moved: "); + else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_PRESSED) + wprintw(win, "pressed: "); + else if ((BUTTON_STATUS(button) & BUTTON_ACTION_MASK) == BUTTON_DOUBLE_CLICKED) + wprintw(win, "double: "); + else + wprintw(win, "released: "); + wprintw(win, " Position: Y: %d X: %d", MOUSE_Y_POS, MOUSE_X_POS); +#endif /* NCURSES_VERSION vs PDCURSES */ + } +#endif /* KEY_MOUSE */ + wrefresh(win); + if (c == ' ') + break; + } +#if 0 + nodelay(win, TRUE); + wgetch(win); + nodelay(win, FALSE); +#endif +#if defined(PDCURSES) + mouse_set(0L); +#endif + refresh(); + + repeat = 0; + do { + static const char *fmt[] = + { + "%d %10s", + "%d %[a-zA-Z]s", + "%d %[][a-zA-Z]s", + "%d %[^0-9]" + }; + char *format = strdup(fmt[(unsigned) repeat % SIZEOF(fmt)]); + + wclear(win); + MvWAddStr(win, 3, 2, "The window should have moved"); + MvWAddStr(win, 4, 2, + "This text should have appeared without you pressing a key"); + MvWPrintw(win, 6, 2, + "Scanning with format \"%s\"", format); + mvwin(win, 2 + 2 * (repeat % 4), 1 + 2 * (repeat % 4)); + erase(); + refresh(); + wrefresh(win); + echo(); + noraw(); + num = 0; + *buffer = 0; + answered = mvwscanw(win, 7, 6, format, &num, buffer); + MvWPrintw(win, 8, 6, + "String: %s Number: %d (%d values read)", + buffer, num, answered); + Continue(win); + ++repeat; + free(format); + } while (answered > 0); +} + +static void +outputTest(WINDOW *win) +{ + char Buffer[80]; + chtype ch; + int by, bx; + +#if !HAVE_TIGETSTR +#if HAVE_TGETENT + char tc_buffer[4096]; + char tc_parsed[4096]; + char *area_pointer = tc_parsed; + tgetent(tc_buffer, getenv("TERM")); +#else +#define tgetstr(a,b) 0 +#endif +#endif /* !HAVE_TIGETSTR */ + + nl(); + wclear(win); + MvWAddStr(win, 1, 1, + "You should now have a screen in the upper left corner, and this text should have wrapped"); + mvwin(win, 2, 1); + waddstr(win, "\nThis text should be down\n"); + waddstr(win, "and broken into two here ^"); + Continue(win); + + wclear(win); + wattron(win, A_BOLD); + MvWAddStr(win, 1, 1, "A new window will appear with this text in it"); + MvWAddStr(win, 8, 1, "Press any key to continue"); + wrefresh(win); + wgetch(win); + + getbegyx(win, by, bx); + + if (LINES < 24 || COLS < 75) { + MvWAddStr(win, 5, 1, + "Some tests have been skipped as they require a"); + MvWAddStr(win, 6, 1, "display of at least 24 LINES by 75 COLUMNS"); + Continue(win); + } else { + WINDOW *win1 = newwin(10, 50, 14, 25); + if (win1 == NULL) { + endwin(); + return; + } +#ifdef A_COLOR + if (has_colors()) { + init_pair(3, COLOR_BLUE, COLOR_WHITE); + wbkgd(win1, (chtype) COLOR_PAIR(3)); + } else + wbkgd(win1, A_NORMAL); +#else + wbkgd(win1, A_NORMAL); +#endif + wclear(win1); + MvWAddStr(win1, 5, 1, + "This text should appear; using overlay option"); + copywin(win, win1, 0, 0, 0, 0, 9, 49, TRUE); + +#if defined(PDCURSES) && !defined(XCURSES) + box(win1, 0xb3, 0xc4); +#else + box(win1, ACS_VLINE, ACS_HLINE); +#endif + wmove(win1, 8, 26); + wrefresh(win1); + wgetch(win1); + + wclear(win1); + wattron(win1, A_BLINK); + MvWAddStr(win1, 4, 1, + "This blinking text should appear in only the second window"); + wattroff(win1, A_BLINK); + mvwin(win1, by, bx); + overlay(win, win1); + mvwin(win1, 14, 25); + wmove(win1, 8, 26); + wrefresh(win1); + wgetch(win1); + delwin(win1); + } + + clear(); + wclear(win); + wrefresh(win); + MvWAddStr(win, 6, 2, "This line shouldn't appear"); + MvWAddStr(win, 4, 2, "Only half of the next line is visible"); + MvWAddStr(win, 5, 2, "Only half of the next line is visible"); + wmove(win, 6, 1); + wclrtobot(win); + wmove(win, 5, 20); + wclrtoeol(win); + MvWAddStr(win, 8, 2, "This line also shouldn't appear"); + wmove(win, 8, 1); + wdeleteln(win); + Continue(win); + + wmove(win, 5, 9); + ch = winch(win); + + wclear(win); + wmove(win, 6, 2); + waddstr(win, "The next char should be l: "); + winsch(win, ch); + Continue(win); + +#if HAVE_WINSSTR + (void) mvwinsstr(win, 6, 2, "A1B2C3D4E5"); + Continue(win); +#endif + + wmove(win, 5, 1); + winsertln(win); + MvWAddStr(win, 5, 2, "The lines below should have moved down"); + Continue(win); + + wclear(win); + wmove(win, 2, 2); + wprintw(win, "This is a formatted string in a window: %d %s\n", 42, + "is it"); + MvWAddStr(win, 10, 1, "Enter a string: "); + wrefresh(win); + noraw(); + echo(); + *Buffer = 0; + wscanw(win, "%s", Buffer); + + printw("This is a formatted string in stdscr: %d %s\n", 42, "is it"); + MvAddStr(10, 1, "Enter a string: "); + *Buffer = 0; + scanw("%s", Buffer); + + if (TIGETSTR("cvvis", "vs") != 0) { + wclear(win); + curs_set(2); + MvWAddStr(win, 1, 1, "The cursor should appear as a block (visible)"); + Continue(win); + } + + if (TIGETSTR("civis", "vi") != 0) { + wclear(win); + curs_set(0); + MvWAddStr(win, 1, 1, + "The cursor should have disappeared (invisible)"); + Continue(win); + } + + if (TIGETSTR("cnorm", "ve") != 0) { + wclear(win); + curs_set(1); + MvWAddStr(win, 1, 1, "The cursor should be an underline (normal)"); + Continue(win); + } +#ifdef A_COLOR + if (has_colors()) { + wclear(win); + MvWAddStr(win, 1, 1, "Colors should change after you press a key"); + Continue(win); + init_pair(1, COLOR_RED, COLOR_WHITE); + wrefresh(win); + } +#endif + + werase(win); + +#if HAVE_TERMNAME + MvWAddStr(win, 1, 1, "Information About Your Terminal"); + MvWAddStr(win, 3, 1, termname()); + MvWAddStr(win, 4, 1, longname()); + if (termattrs() & A_BLINK) + MvWAddStr(win, 5, 1, "This terminal supports blinking."); + else + MvWAddStr(win, 5, 1, "This terminal does NOT support blinking."); +#endif + + (void) mvwaddnstr(win, 7, 5, "Have a nice day!ok", 16); + wrefresh(win); + + (void) mvwinnstr(win, 7, 5, Buffer, 18); + MvAddStr(LINES - 2, 10, Buffer); + refresh(); + Continue(win); +} + +#if defined(PDCURSES) && !defined(XCURSES) +static void +resizeTest(WINDOW *dummy GCC_UNUSED) +{ + WINDOW *win1; + + savetty(); + + clear(); + refresh(); +# if defined(OS2) + resize_term(50, 120); +# else + resize_term(50, 80); +# endif + + win1 = newwin(10, 50, 14, 25); + if (win1 == NULL) { + stop_curses(); + return; + } +#ifdef A_COLOR + if (has_colors()) { + init_pair(3, COLOR_BLUE, COLOR_WHITE); + wattrset(win1, COLOR_PAIR(3)); + } +#endif + wclear(win1); + + MvWAddStr(win1, 1, 1, "The screen may now have 50 lines"); + Continue(win1); + + wclear(win1); + resetty(); + + MvWAddStr(win1, 1, 1, "The screen should now be reset"); + Continue(win1); + + delwin(win1); + + clear(); + refresh(); + +} +#endif + +#if HAVE_NEWPAD +static void +padTest(WINDOW *dummy GCC_UNUSED) +{ + WINDOW *pad; + + if ((pad = newpad(50, 100)) != 0) { + WINDOW *spad; + + wattron(pad, A_REVERSE); + MvWAddStr(pad, 5, 2, "This is a new pad"); + (void) wattrset(pad, A_NORMAL); + MvWAddStr(pad, 8, 0, + "The end of this line should be truncated here:except now"); + MvWAddStr(pad, 11, 1, "This line should not appear.It will now"); + wmove(pad, 10, 1); + wclrtoeol(pad); + MvWAddStr(pad, 10, 1, " Press any key to continue"); + prefresh(pad, 0, 0, 0, 0, 10, 45); + keypad(pad, TRUE); + raw(); + wgetch(pad); + + if ((spad = subpad(pad, 12, 25, 6, 52)) != 0) { + MvWAddStr(spad, 2, 2, "This is a new subpad"); + box(spad, 0, 0); + delwin(spad); + } + prefresh(pad, 0, 0, 0, 0, 15, 75); + keypad(pad, TRUE); + raw(); + wgetch(pad); + + MvWAddStr(pad, 35, 2, "This is displayed at line 35 in the pad"); + MvWAddStr(pad, 40, 1, " Press any key to continue"); + prefresh(pad, 30, 0, 0, 0, 10, 45); + keypad(pad, TRUE); + raw(); + wgetch(pad); + + delwin(pad); + } +} +#endif /* HAVE_NEWPAD */ + +struct commands { + NCURSES_CONST char *text; + void (*function) (WINDOW *); +}; +typedef struct commands COMMAND; + +static const COMMAND command[] = +{ + {"General Test", introTest}, +#if HAVE_NEWPAD + {"Pad Test", padTest}, +#endif +#if defined(PDCURSES) && !defined(XCURSES) + {"Resize Test", resizeTest}, +#endif + {"Scroll Test", scrollTest}, + {"Input Test", inputTest}, + {"Output Test", outputTest} +}; +#define MAX_OPTIONS (int) SIZEOF(command) + +static void +display_menu(int old_option, int new_option) +{ + int i; + + assert((new_option >= 0) && (new_option < MAX_OPTIONS)); + + (void) attrset(A_NORMAL); + MvAddStr(3, 20, "PDCurses Test Program"); + + for (i = 0; i < (int) MAX_OPTIONS; i++) + MvAddStr(5 + i, 25, command[i].text); + + if ((old_option >= 0) && (old_option < MAX_OPTIONS)) + MvAddStr(5 + old_option, 25, command[old_option].text); + + (void) attrset(A_REVERSE); + MvAddStr(5 + new_option, 25, command[new_option].text); + (void) attrset(A_NORMAL); + MvAddStr(13, 3, + "Use Up and Down Arrows to select - Enter to run - Q to quit"); + refresh(); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: testcurs [options]" + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + WINDOW *win; + int old_option = (-1); + int new_option = 0; + bool quit = FALSE; + int n; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + setlocale(LC_ALL, ""); + +#ifdef PDCDEBUG + PDC_debug("testcurs started\n"); +#endif + if (!initTest(&win)) + ExitProgram(EXIT_FAILURE); + + erase(); + display_menu(old_option, new_option); + + for (;;) { + int key; + +#ifdef A_COLOR + if (has_colors()) { + init_pair(1, COLOR_WHITE, COLOR_BLUE); + wbkgd(win, (chtype) COLOR_PAIR(1)); + } else + wbkgd(win, A_REVERSE); +#else + wbkgd(win, A_REVERSE); +#endif + werase(win); + + noecho(); + keypad(stdscr, TRUE); + raw(); + key = getch(); + if (key < KEY_MIN && key > 0 && isalpha(UChar(key))) { + if (islower(UChar(key))) + key = toupper(key); + for (n = 0; n < MAX_OPTIONS; ++n) { + if (key == command[n].text[0]) { + display_menu(old_option, new_option = n); + key = ' '; + break; + } + } + } + switch (key) { + case 10: + case 13: + case KEY_ENTER: + erase(); + refresh(); + (*command[new_option].function) (win); + erase(); + display_menu(old_option, new_option); + break; + case KEY_UP: + new_option = ((new_option == 0) + ? new_option + : new_option - 1); + display_menu(old_option, new_option); + break; + case KEY_DOWN: + new_option = ((new_option == (MAX_OPTIONS - 1)) + ? new_option + : new_option + 1); + display_menu(old_option, new_option); + break; + case 'Q': + case 'q': + quit = TRUE; + break; + default: + beep(); + break; + case ' ': + break; + } + if (quit == TRUE) + break; + } + + delwin(win); + + stop_curses(); +#ifdef XCURSES + XCursesExit(); +#endif + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/testscanw.c b/contrib/ncurses/test/testscanw.c new file mode 100644 index 00000000..ec33b06e --- /dev/null +++ b/contrib/ncurses/test/testscanw.c @@ -0,0 +1,104 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2002,2006 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* gleaned from a web-search, shows a bug combining scanw and implicit scroll. + * Date: 1997/03/17 + * From: bayern@morpheus.cis.yale.edu + * + * $Id: testscanw.c,v 1.16 2024/10/05 19:27:33 tom Exp $ + */ +#include + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: testscanw [options] tokens" + ,"" + ,"Tokens are integers (starting line-number) or k+, k- to turn keypad on/off." + ,"" + ,USAGE_COMMON + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + long badanswer = 1; + long *response = &badanswer; + int ch; + + while ((ch = getopt(argc, argv, OPTS_COMMON)) != -1) { + switch (ch) { + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + initscr(); + scrollok(stdscr, TRUE); + idlok(stdscr, TRUE); + echo(); + +#if 0 + curses_trace(TRACE_UPDATE | TRACE_CALLS); +#endif + while (optind < argc) { + const char *token = argv[optind++]; + if (isdigit(UChar(*token))) + move(atoi(token), 0); + else if (!strcmp(token, "k+")) + keypad(stdscr, TRUE); + else if (!strcmp(token, "k-")) + keypad(stdscr, FALSE); + } + + while (badanswer) { + printw("Enter a number (0 to quit):\n"); + printw("--> "); + scanw("%20ld", response); /* yes, it's a pointer */ + } + endwin(); + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/tput-colorcube b/contrib/ncurses/test/tput-colorcube new file mode 100755 index 00000000..67a4997a --- /dev/null +++ b/contrib/ncurses/test/tput-colorcube @@ -0,0 +1,131 @@ +#!/bin/sh +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: tput-colorcube,v 1.2 2020/02/02 23:34:34 tom Exp $ +# Use this script to print an xterm-style color cube, e.g., as done in +# the xterm 88colors2.pl and 256colors2.pl scripts. + +failed() { + printf "?? $*\n" >&2 + exit 1 +} + +newline() { + tput op + printf "\n" +} + +if [ $# = 1 ] +then + myterm=$1 +elif [ $# = 0 ] +then + myterm=$TERM +else + failed "expected one parameter or none" +fi + +colors=$(tput -T $myterm colors 2>/dev/null) +if [ ${colors:-0} -le 0 ] +then + myterm=${myterm%%-color} + colors=$(tput -T $myterm colors 2>/dev/null) +fi +if [ ${colors:-0} -le 0 ] +then + failed "terminal $myterm does not support color" +fi + +printf "System colors:\n" + +color=0 +inrow=$colors +to_do=$colors +[ $colors -gt 256 ] && colors=256 +[ $inrow -gt 8 ] && inrow=8 +[ $to_do -gt 16 ] && to_do=16 +while [ $color -lt $to_do ] +do + [ $color = $inrow ] && newline + tput setab $color + printf ' ' + color=$(expr $color + 1) +done +newline + +[ $colors -le 16 ] && exit + +if [ $colors = 256 ] +then + cube=6 + ramp=232 +elif [ $colors -ge 88 ] +then + cube=4 + ramp=80 +else + exit +fi + +printf "\n" +printf "Color cube, ${cube}x${cube}x${cube}:\n" +g=0 +cube2=$(expr $cube \* $cube) +while [ $g -lt $cube ] +do + r=0 + while [ $r -lt $cube ] + do + b=0 + while [ $b -lt $cube ] + do + color=$(expr 16 + \( $r \* $cube2 \) + \( $g \* $cube \) + $b) + tput setab $color + printf ' ' + b=$(expr $b + 1) + done + tput op + printf ' ' + r=$(expr $r + 1) + done + newline + g=$(expr $g + 1) +done + +printf "\n" +printf "Grayscale ramp:\n" +color=$ramp +while [ $color -lt $colors ] +do + tput setab $color + printf ' ' + color=$(expr $color + 1) +done +newline +# vi:ts=4 sw=4 diff --git a/contrib/ncurses/test/tput-initc b/contrib/ncurses/test/tput-initc new file mode 100755 index 00000000..9d71c4f6 --- /dev/null +++ b/contrib/ncurses/test/tput-initc @@ -0,0 +1,156 @@ +#!/bin/sh +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: tput-initc,v 1.6 2020/02/02 23:34:34 tom Exp $ +# Some of the ".dat" files in ncurses' test-directory give r/g/b numbers for +# default palettes of xterm and Linux console. This script reads the numbers +# and (assuming the same or compatible terminal) uses tput to (re)initialize +# the palette using those numbers. + +failed() { + printf "?? $*\n" >&2 + exit 1 +} + +usage() { + cat >&2 <<-EOF + usage: $0 [-r] [-s] [palette-data] + + Use this script with a palette data-file to (re)initialize colors with + tput. This script assumes arrangements for 16-, 88- and 256-colors + like the xterm 88colors2.pl and 256colors2.pl scripts. + + Options: + -r reverse palette + -s reverse system colors (first 16 if more than 16 colors) +EOF + exit 1 +} + +opt_r=no +opt_s=no + +while getopts "rs" option "$@" +do + case $option in + (r) + opt_r=yes + ;; + (s) + opt_s=yes + ;; + (*) + usage + ;; + esac +done +shift $(expr $OPTIND - 1) + +if [ $# = 1 ] +then + file=$1 +elif [ $# = 0 ] +then + file=$TERM.dat +else + failed "expected one parameter or none" +fi + +if [ ! -f "$file" ] +then + if [ -f "$file.dat" ] + then + file="$file.dat" + else + failed "no such file: $file" + fi +fi + +myterm=${file%%.dat} +colors=$(tput -T $myterm colors 2>/dev/null) +if [ ${colors:-0} -le 0 ] +then + myterm=${myterm%%-color} + colors=$(tput -T $myterm colors 2>/dev/null) +fi +if [ ${colors:-0} -le 0 ] +then + failed "terminal $myterm does not support color" +fi + +cat $file |\ +awk -v opt_r=$opt_r \ + -v opt_s=$opt_s \ + -v colors=$colors \ + -v myterm=$myterm ' +BEGIN { + limit = 1000; + range = -1; + cramp = -1; + if ( colors == 88 ) { + cramp = 80; + } else if ( colors = 256 ) { + cramp = 232; + } +} +function scaled(n) { + return (n * 1000)/limit; +} + +/^scale:[0-9]+/{ + sub("^scale:","",$0); + limit = $0; +} + +/^[0-9]+:/{ + sub(":","",$1); + item = $1 + 0; + if (range < item) { + range = item; + } + params[$1] = sprintf ("%d %d %d", scaled($2),scaled($3),scaled($4)); +} +END { + for (n = 0; n <= range; ++n) { + m = n; + if ( opt_r == "yes" ) { + if ( colors <= 16 ) { + m = range - n; + } else if ( ( opt_s == "yes" ) && ( n < 16 ) ) { + m = 15 - n; + } else if ( n >= cramp ) { + m = cramp + colors - 1 - n; + } else { + m = 16 + cramp - 1 - n; + } + } + printf "tput -T%s initc %d %s\n", myterm, m, params[n]; + } +} +' |sh - diff --git a/contrib/ncurses/test/tracemunch b/contrib/ncurses/test/tracemunch new file mode 100755 index 00000000..b2d3b03b --- /dev/null +++ b/contrib/ncurses/test/tracemunch @@ -0,0 +1,939 @@ +#!/usr/bin/env perl +# $Id: tracemunch,v 1.41 2021/09/04 10:31:03 tom Exp $ +############################################################################## +# Copyright 2018-2020,2021 Thomas E. Dickey # +# Copyright 1998-2005,2017 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# tracemunch -- compactify ncurses trace logs +# +# The error logs produced by ncurses with tracing enabled can be very tedious +# to wade through. This script helps by compacting runs of log lines that +# can be conveniently expressed as higher-level operations. + +use strict; +use warnings; + +$| = 1; + +our $putattr = + 'PutAttrChar\(\{\{ ' . "'(.)'" + . ' = 0[0-7]+ \}\}\) at \(([0-9]+), ([0-9]+)\)'; +our $waddnstr = +'^called \{waddnstr\((0x[[:xdigit:]]+|window\d+),"((\\.|[^\"]*))",[-]?[0-9]+\)'; + +our %TR = qw( + DISABLE 0x0000 + TIMES 0x0001 + TPUTS 0x0002 + UPDATE 0x0004 + MOVE 0x0008 + CHARPUT 0x0010 + ORDINARY 0x001F + CALLS 0x0020 + VIRTPUT 0x0040 + IEVENT 0x0080 + BITS 0x0100 + ICALLS 0x0200 + CCALLS 0x0400 + DATABASE 0x0800 + ATTRS 0x1000 +); + +our $tracelevel = 0; + +our $tSCREEN = 1; # SCREEN* +our $tWINDOW = 2; # WINDOW* +our $tTERMINAL = 3; # TERMINAL* +our $tPANEL = 4; # PANEL* +our $tFIELD = 5; # FIELD* +our $tFORM = 5; # FORM* +our $tMENU = 6; # MENU* +our $tITEM = 7; # ITEM* + +our %known_p1_types = ( + $tSCREEN => "SCREEN*", + $tWINDOW => "WINDOW*", + $tTERMINAL => "TERMINAL*", + $tPANEL => "PANEL*", + $tFORM => "FORM*", + $tFIELD => "FIELD*", + $tMENU => "MENU*", + $tITEM => "ITEM*", +); + +# If the trace is complete, we can infer addresses using the return value from +# newwin, etc. But if it is incomplete, we can still check for special cases +# such as SCREEN* and WINDOW* parameters. In this table, the type for the +# first parameter is encoded, relying upon an ncurses programming convention: +our %known_p1 = ( + TransformLine => $tSCREEN, + _nc_console_read => $tSCREEN, + _nc_freewin => $tWINDOW, + _nc_initscr => $tSCREEN, + _nc_makenew => $tSCREEN, + _nc_mingw_console_read => $tSCREEN, + _nc_reset_colors => $tSCREEN, + _nc_scroll_optimize => $tSCREEN, + _nc_tinfo => $tSCREEN, + _nc_tinfo_mvcur => $tSCREEN, + _nc_wgetch => $tWINDOW, + adjust_window => $tWINDOW, + assume_default_colors => $tSCREEN, + attr_get => $tWINDOW, + baudrate => $tSCREEN, + beep => $tSCREEN, + border_set => $tWINDOW, + bottom_panel => $tPANEL, + bottom_panel => $tPANEL, + box => $tWINDOW, + box_set => $tWINDOW, + can_change_color => $tSCREEN, + cbreak => $tSCREEN, + ceiling_panel => $tSCREEN, + clearok => $tWINDOW, + color_content => $tSCREEN, + copywin => $tWINDOW, + current_item => $tMENU, + curs_set => $tSCREEN, + decrease_size => $tSCREEN, + def_prog_mode => $tSCREEN, + def_shell_mode => $tSCREEN, + define_key => $tSCREEN, + del_curterm => $tSCREEN, + del_panel => $tPANEL, + del_panel => $tPANEL, + delay_output => $tSCREEN, + delscreen => $tSCREEN, + delwin => $tWINDOW, + derwin => $tWINDOW, + doupdate => $tSCREEN, + dup_field => $tFIELD, + dupwin => $tWINDOW, + echo => $tSCREEN, + endwin => $tSCREEN, + erasechar => $tSCREEN, + field_opts_off => $tFIELD, + field_opts_on => $tFIELD, + filter => $tSCREEN, + flash => $tSCREEN, + flushinp => $tSCREEN, + form_driver => $tFORM, + form_driver_w => $tFORM, + form_opts_off => $tFORM, + form_opts_on => $tFORM, + free_field => $tFIELD, + free_form => $tFORM, + free_item => $tITEM, + free_menu => $tMENU, + getattrs => $tWINDOW, + getbegx => $tWINDOW, + getbegy => $tWINDOW, + getbkgd => $tWINDOW, + getcurx => $tWINDOW, + getcury => $tWINDOW, + getmaxx => $tWINDOW, + getmaxy => $tWINDOW, + getmouse => $tSCREEN, + getparx => $tWINDOW, + getpary => $tWINDOW, + ground_panel => $tSCREEN, + halfdelay => $tSCREEN, + has_ic => $tSCREEN, + has_il => $tSCREEN, + has_key => $tSCREEN, + hide_panel => $tPANEL, + hide_panel => $tPANEL, + idcok => $tWINDOW, + idlok => $tWINDOW, + immedok => $tWINDOW, + increase_size => $tSCREEN, + init_color => $tSCREEN, + init_pair => $tSCREEN, + intrflush => $tSCREEN, + is_cleared => $tWINDOW, + is_idcok => $tWINDOW, + is_idlok => $tWINDOW, + is_immedok => $tWINDOW, + is_keypad => $tWINDOW, + is_leaveok => $tWINDOW, + is_linetouched => $tWINDOW, + is_nodelay => $tWINDOW, + is_notimeout => $tWINDOW, + is_pad => $tWINDOW, + is_scrollok => $tWINDOW, + is_subwin => $tWINDOW, + is_syncok => $tWINDOW, + is_term_resized => $tSCREEN, + is_wintouched => $tWINDOW, + item_count => $tMENU, + item_description => $tITEM, + item_index => $tITEM, + item_init => $tMENU, + item_name => $tITEM, + item_opts => $tITEM, + item_opts_off => $tITEM, + item_opts_on => $tITEM, + item_term => $tMENU, + item_userptr => $tITEM, + item_value => $tITEM, + item_visible => $tITEM, + key_defined => $tSCREEN, + keybound => $tSCREEN, + keyok => $tSCREEN, + keypad => $tWINDOW, + killchar => $tSCREEN, + leaveok => $tWINDOW, + link_field => $tFIELD, + longname => $tSCREEN, + menu_back => $tMENU, + menu_driver => $tMENU, + menu_fore => $tMENU, + menu_format => $tMENU, + menu_grey => $tMENU, + menu_init => $tMENU, + menu_items => $tMENU, + menu_mark => $tMENU, + menu_opts => $tMENU, + menu_opts_off => $tMENU, + menu_opts_on => $tMENU, + menu_pad => $tMENU, + menu_pattern => $tMENU, + menu_spacing => $tMENU, + menu_sub => $tMENU, + menu_term => $tMENU, + menu_userptr => $tMENU, + menu_win => $tMENU, + meta => $tWINDOW, + mouseinterval => $tSCREEN, + mousemask => $tSCREEN, + move_field => $tFIELD, + move_panel => $tPANEL, + move_panel => $tPANEL, + mvcur => $tSCREEN, + mvderwin => $tWINDOW, + mvwadd_wch => $tWINDOW, + mvwadd_wchnstr => $tWINDOW, + mvwadd_wchstr => $tWINDOW, + mvwaddch => $tWINDOW, + mvwaddchnstr => $tWINDOW, + mvwaddchstr => $tWINDOW, + mvwaddnstr => $tWINDOW, + mvwaddnwstr => $tWINDOW, + mvwaddstr => $tWINDOW, + mvwaddwstr => $tWINDOW, + mvwchgat => $tWINDOW, + mvwdelch => $tWINDOW, + mvwget_wch => $tWINDOW, + mvwget_wstr => $tWINDOW, + mvwgetch => $tWINDOW, + mvwgetn_wstr => $tWINDOW, + mvwgetnstr => $tWINDOW, + mvwgetstr => $tWINDOW, + mvwhline => $tWINDOW, + mvwhline_set => $tWINDOW, + mvwin => $tWINDOW, + mvwin_wch => $tWINDOW, + mvwin_wchnstr => $tWINDOW, + mvwin_wchstr => $tWINDOW, + mvwinch => $tWINDOW, + mvwinchnstr => $tWINDOW, + mvwinchstr => $tWINDOW, + mvwins_nwstr => $tWINDOW, + mvwins_wch => $tWINDOW, + mvwins_wstr => $tWINDOW, + mvwinsch => $tWINDOW, + mvwinsnstr => $tWINDOW, + mvwinsstr => $tWINDOW, + mvwinstr => $tWINDOW, + mvwinwstr => $tWINDOW, + mvwvline => $tWINDOW, + mvwvline_set => $tWINDOW, + new_panel => $tWINDOW, + new_panel => $tWINDOW, + newpad => $tSCREEN, + newterm => $tSCREEN, + newwin => $tSCREEN, + nl => $tSCREEN, + nocbreak => $tSCREEN, + nodelay => $tWINDOW, + noecho => $tSCREEN, + nofilter => $tSCREEN, + nonl => $tSCREEN, + noqiflush => $tSCREEN, + noraw => $tSCREEN, + notimeout => $tWINDOW, + overlap => $tWINDOW, + overlay => $tWINDOW, + overwrite => $tWINDOW, + pair_content => $tSCREEN, + panel_above => $tPANEL, + panel_above => $tPANEL, + panel_below => $tPANEL, + panel_below => $tPANEL, + panel_hidden => $tPANEL, + panel_hidden => $tPANEL, + panel_userptr => $tPANEL, + panel_userptr => $tPANEL, + panel_window => $tPANEL, + panel_window => $tPANEL, + pecho_wchar => $tWINDOW, + pechochar => $tWINDOW, + pnoutrefresh => $tWINDOW, + pos_form_cursor => $tFORM, + pos_menu_cursor => $tMENU, + post_form => $tFORM, + post_menu => $tMENU, + putwin => $tWINDOW, + qiflush => $tSCREEN, + raw => $tSCREEN, + redrawwin => $tWINDOW, + replace_panel => $tPANEL, + replace_panel => $tPANEL, + reset_prog_mode => $tSCREEN, + reset_shell_mode => $tSCREEN, + resetty => $tSCREEN, + resize_term => $tSCREEN, + resizeterm => $tSCREEN, + restartterm => $tSCREEN, + ripoffline => $tSCREEN, + savetty => $tSCREEN, + scale_menu => $tMENU, + scr_init => $tSCREEN, + scr_restore => $tSCREEN, + scr_set => $tSCREEN, + scroll => $tWINDOW, + scrollok => $tWINDOW, + set_current_field => $tFORM, + set_current_item => $tMENU, + set_curterm => $tTERMINAL, + set_field_back => $tFIELD, + set_field_buffer => $tFIELD, + set_field_fore => $tFIELD, + set_field_init => $tFORM, + set_field_just => $tFIELD, + set_field_opts => $tFIELD, + set_field_pad => $tFIELD, + set_field_status => $tFIELD, + set_field_term => $tFORM, + set_field_type => $tFIELD, + set_field_userptr => $tFIELD, + set_form_fields => $tFORM, + set_form_init => $tFORM, + set_form_opts => $tFORM, + set_form_page => $tFORM, + set_form_sub => $tFORM, + set_form_term => $tFORM, + set_form_userptr => $tFORM, + set_form_win => $tFORM, + set_item_init => $tMENU, + set_item_opts => $tITEM, + set_item_term => $tMENU, + set_item_userptr => $tITEM, + set_item_value => $tITEM, + set_menu_back => $tMENU, + set_menu_fore => $tMENU, + set_menu_format => $tMENU, + set_menu_grey => $tMENU, + set_menu_init => $tMENU, + set_menu_items => $tMENU, + set_menu_mark => $tMENU, + set_menu_opts => $tMENU, + set_menu_pad => $tMENU, + set_menu_pattern => $tMENU, + set_menu_spacing => $tMENU, + set_menu_sub => $tMENU, + set_menu_term => $tMENU, + set_menu_userptr => $tMENU, + set_menu_win => $tMENU, + set_new_page => $tFIELD, + set_panel_userptr => $tPANEL, + set_panel_userptr => $tPANEL, + set_term => $tSCREEN, + set_top_row => $tMENU, + show_panel => $tPANEL, + show_panel => $tPANEL, + slk_attr => $tSCREEN, + slk_attr_set => $tSCREEN, + slk_attroff => $tSCREEN, + slk_attron => $tSCREEN, + slk_attrset => $tSCREEN, + slk_clear => $tSCREEN, + slk_color => $tSCREEN, + slk_init => $tSCREEN, + slk_label => $tSCREEN, + slk_noutrefresh => $tSCREEN, + slk_refresh => $tSCREEN, + slk_restore => $tSCREEN, + slk_set => $tSCREEN, + slk_touch => $tSCREEN, + start_color => $tSCREEN, + subwin => $tWINDOW, + syncok => $tWINDOW, + termattrs => $tSCREEN, + termname => $tSCREEN, + tgetflag => $tSCREEN, + tgetnum => $tSCREEN, + tigetflag => $tSCREEN, + tigetnum => $tSCREEN, + tigetstr => $tSCREEN, + tinfo => $tSCREEN, + top_panel => $tPANEL, + top_panel => $tPANEL, + top_row => $tMENU, + touchline => $tWINDOW, + touchwin => $tWINDOW, + typeahead => $tSCREEN, + unfocus_current_field => $tFORM, + unget_wch => $tSCREEN, + ungetch => $tSCREEN, + ungetmouse => $tSCREEN, + unpost_form => $tFORM, + unpost_menu => $tMENU, + untouchwin => $tWINDOW, + update_panels_sp => $tSCREEN, + use_default_colors => $tSCREEN, + use_env => $tSCREEN, + use_legacy_coding => $tSCREEN, + use_screen => $tSCREEN, + use_tioctl => $tSCREEN, + use_window => $tWINDOW, + vidattr => $tSCREEN, + vidputs => $tSCREEN, + vw_printw => $tWINDOW, + vwprintw => $tWINDOW, + wadd_wch => $tWINDOW, + wadd_wchnstr => $tWINDOW, + wadd_wchstr => $tWINDOW, + waddch => $tWINDOW, + waddchnstr => $tWINDOW, + waddchstr => $tWINDOW, + waddnstr => $tWINDOW, + waddnwstr => $tWINDOW, + waddstr => $tWINDOW, + waddwstr => $tWINDOW, + wattr_get => $tWINDOW, + wattr_off => $tWINDOW, + wattr_on => $tWINDOW, + wattr_set => $tWINDOW, + wattroff => $tWINDOW, + wattron => $tWINDOW, + wattrset => $tWINDOW, + wbkgd => $tWINDOW, + wbkgdset => $tWINDOW, + wborder => $tWINDOW, + wborder_set => $tWINDOW, + wchgat => $tWINDOW, + wclear => $tWINDOW, + wclrtobot => $tWINDOW, + wclrtoeol => $tWINDOW, + wcolor_set => $tWINDOW, + wcursyncup => $tWINDOW, + wdelch => $tWINDOW, + wdeleteln => $tWINDOW, + wechochar => $tWINDOW, + wenclose => $tWINDOW, + werase => $tWINDOW, + wget_wch => $tWINDOW, + wget_wstr => $tWINDOW, + wgetbkgrnd => $tWINDOW, + wgetch => $tWINDOW, + wgetch_events => $tWINDOW, + wgetdelay => $tWINDOW, + wgetn_wstr => $tWINDOW, + wgetnstr => $tWINDOW, + wgetparent => $tWINDOW, + wgetscrreg => $tWINDOW, + wgetstr => $tWINDOW, + whline => $tWINDOW, + whline_set => $tWINDOW, + win_wch => $tWINDOW, + win_wchnstr => $tWINDOW, + win_wchstr => $tWINDOW, + winch => $tWINDOW, + winchnstr => $tWINDOW, + winchstr => $tWINDOW, + winnstr => $tWINDOW, + winnwstr => $tWINDOW, + wins_nwstr => $tWINDOW, + wins_wch => $tWINDOW, + wins_wstr => $tWINDOW, + winsch => $tWINDOW, + winsdelln => $tWINDOW, + winsertln => $tWINDOW, + winsnstr => $tWINDOW, + winsstr => $tWINDOW, + winstr => $tWINDOW, + winwstr => $tWINDOW, + wmouse_trafo => $tWINDOW, + wmove => $tWINDOW, + wnoutrefresh => $tWINDOW, + wprintw => $tWINDOW, + wredrawln => $tWINDOW, + wrefresh => $tWINDOW, + wresize => $tWINDOW, + wscrl => $tWINDOW, + wsetscrreg => $tWINDOW, + wstandend => $tWINDOW, + wstandout => $tWINDOW, + wsyncdown => $tWINDOW, + wsyncup => $tWINDOW, + wtimeout => $tWINDOW, + wtouchln => $tWINDOW, + wvline => $tWINDOW, +); + +our $fld_nums = 0; +our $frm_nums = 0; +our $itm_nums = 0; +our $mnu_nums = 0; +our $pan_nums = 0; +our $scr_nums = 0; +our $thr_nums = 0; +our $trm_nums = 0; +our $try_nums = 0; +our $usr_nums = 0; +our $win_nums = 0; + +our $curscr = ""; +our $newscr = ""; +our $stdscr = ""; + +our %fld_addr; # FIELD* +our %frm_addr; # FORM* +our %itm_addr; # ITEM* +our %mnu_addr; # MENU* +our %pan_addr; # PANEL* +our %scr_addr; # SCREEN* +our %thr_addr; # thread-id +our %trm_addr; # TERMINAL* +our %try_addr; # tries-number +our %usr_addr; # user-pointer +our %win_addr; # WINDOW* + +sub has_addr($) { + my $value = shift; + my $result = 0; + $result = 1 if ( $value =~ /\b0x[[:xdigit:]]+\b/i ); + return $result; +} + +sub transaddr($) { + my $arg = shift; + my $n; + + $arg =~ s/\b$curscr\b/curscr/g if ($curscr); + $arg =~ s/\b$newscr\b/newscr/g if ($newscr); + $arg =~ s/\b$stdscr\b/stdscr/g if ($stdscr); + if ( &has_addr($arg) ) { + foreach my $addr ( keys %fld_addr ) { + $n = $fld_addr{$addr}; + $arg =~ s/\b$addr\b/field$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %frm_addr ) { + $n = $frm_addr{$addr}; + $arg =~ s/\b$addr\b/form$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %itm_addr ) { + $n = $itm_addr{$addr}; + $arg =~ s/\b$addr\b/item$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %mnu_addr ) { + $n = $mnu_addr{$addr}; + $arg =~ s/\b$addr\b/menu$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %pan_addr ) { + $n = $pan_addr{$addr}; + $arg =~ s/\b$addr\b/panel$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %scr_addr ) { + $n = $scr_addr{$addr}; + $arg =~ s/\b$addr\b/screen$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %thr_addr ) { + $n = $thr_addr{$addr}; + $arg =~ s/\b$addr\b/thread$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %trm_addr ) { + $n = $trm_addr{$addr}; + $arg =~ s/\b$addr\b/terminal$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %try_addr ) { + $n = $try_addr{$addr}; + $arg =~ s/\b$addr\b/tries_$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %usr_addr ) { + $n = $usr_addr{$addr}; + $arg =~ s/\b$addr\b/user_ptr$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + foreach my $addr ( keys %win_addr ) { + $n = $win_addr{$addr}; + $arg =~ s/\b$addr\b/window$n/g if ( defined $n ); + } + } + if ( &has_addr($arg) ) { + if ( $arg =~ /add_wch\((window\d+,)?0x[[:xdigit:]]+\)/i ) { + $arg =~ s/(0x[[:xdigit:]]+)[)]/\&wch)/i; + } + elsif ( + $arg =~ /color_content\((screen\d+,)?\d+(,0x[[:xdigit:]]+){3}/i ) + { + $arg =~ s/(,0x[[:xdigit:]]+){3}[)]/,\&r,\&g,\&b)/i; + } + elsif ( $arg =~ /pair_content\((screen\d+,)?\d+(,0x[[:xdigit:]]+){2}/i ) + { + $arg =~ s/(,0x[[:xdigit:]]+){2}[)]/,\&fg,\&bg)/i; + } + } + if ( &has_addr($arg) and $arg =~ /called\s+\{/ ) { + my $func = $arg; + chomp $func; + $func =~ s/^.*called\s+\{([[:alnum:]_]+)\(.*$/$1/; + if ( defined $known_p1{$func} ) { + my $addr = $arg; + my $type = $known_p1{$func}; + chomp $addr; + $addr =~ s/^[^(]+\((0x[[:xdigit:]]+).*$/$1/i; + if ( $addr !~ /^0x[[:xdigit:]]+$/i ) { + if ( $type == $tSCREEN and $addr =~ /^[^(]+\(screen\d+[,)]/ ) { + + # ignore + } + elsif ( $type == $tWINDOW + and $addr =~ + /^[^(]+\((stdscr|newscr|curscr|window\d+)[,)]/ ) + { + + # ignore + } + elsif ( $type == $tTERMINAL + and $addr =~ /^[^(]+\(terminal\d+[,)]/ ) + { + # ignore + } + elsif ( $type == $tPANEL and $addr =~ /^[^(]+\(panel\d+[,)]/ ) { + + # ignore + } + elsif ( $type == $tFIELD and $addr =~ /^[^(]+\(field\d+[,)]/ ) { + + # ignore + } + elsif ( $type == $tMENU and $addr =~ /^[^(]+\(menu\d+[,)]/ ) { + + # ignore + } + elsif ( $type == $tITEM and $addr =~ /^[^(]+\(item\d+[,)]/ ) { + + # ignore + } + else { + printf "OOPS - expected type \"%s\", skipping\n>>$addr\n", + $known_p1_types{$type}; + } + } + elsif ( $type == $tSCREEN ) { + $scr_addr{$addr} = ++$scr_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tWINDOW ) { + $win_addr{$addr} = ++$win_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tTERMINAL ) { + $trm_addr{$addr} = ++$trm_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tPANEL ) { + $pan_addr{$addr} = ++$pan_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tFIELD ) { + $fld_addr{$addr} = ++$fld_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tFORM ) { + $frm_addr{$addr} = ++$frm_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tMENU ) { + $mnu_addr{$addr} = ++$mnu_nums; + $arg = &transaddr($arg); + } + elsif ( $type == $tITEM ) { + $itm_addr{$addr} = ++$itm_nums; + $arg = &transaddr($arg); + } + } + } + + return $arg; +} + +sub muncher($) { + my $STDIN = shift; + + while (<$STDIN>) { + my $addr; + my $n; + my $awaiting = ""; + + CLASSIFY: { + + next unless $_; + + # just in case someone tries a file with cr/lf line-endings: + $_ =~ s/\r\n/\n/g; + $_ =~ s/\r/\n/g; + + if ( $_ =~ + /^TRACING NCURSES version.*\(tracelevel=(0x[[:xdigit:]]+)\)/ ) + { + $tracelevel = hex $1; + print; + next; + } + + my $thread = ""; + if ( $_ =~ /^(0x[[:xdigit:]]+):/ ) { + $thr_addr{$1} = ++$thr_nums unless defined $thr_addr{$1}; + $thread = "thread" . $thr_addr{$1} . ":"; + $_ =~ s/^[^:]*://; + } + + # Transform window pointer addresses to make it easier to compare logs + $awaiting = "curscr" if ( $_ =~ /creating curscr/ ); + $awaiting = "newscr" if ( $_ =~ /creating newscr/ ); + $awaiting = "stdscr" if ( $_ =~ /creating stdscr/ ); + $awaiting = "screen" if ( $_ =~ /^(\+ )*called \{new_prescr\(\)/ ); + if ( $_ =~ /^create :window 0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + if ( $awaiting eq "curscr" ) { + $curscr = $addr; + } + elsif ( $awaiting eq "newscr" ) { + $newscr = $addr; + } + elsif ( $awaiting eq "stdscr" ) { + $stdscr = $addr; + } + else { + $win_addr{$addr} = $win_nums++; + } + $awaiting = ""; + } + elsif ( $_ =~ /^create :(root|new)_panel 0x([[:xdigit:]]+)/ ) { + $addr = "0x$2"; + $pan_addr{$addr} = $pan_nums++; + $_ = &transaddr($_); + } + elsif ( $_ =~ /^create :user_ptr 0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + $usr_addr{$addr} = $usr_nums++; + $_ = &transaddr($_); + } + elsif ( $_ =~ /^create :field 0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + $fld_addr{$addr} = $fld_nums++; + $_ = &transaddr($_); + } + elsif ( $_ =~ /^create :form 0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + $frm_addr{$addr} = $frm_nums++; + $_ = &transaddr($_); + } + elsif ( $_ =~ /^create :menu 0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + $mnu_addr{$addr} = $mnu_nums++; + $_ = &transaddr($_); + } + elsif ( $_ =~ /^create :item 0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + $itm_addr{$addr} = $itm_nums++; + $_ = &transaddr($_); + } + elsif ( $_ =~ /^(\+ )*called \{set_curterm\((0x[[:xdigit:]]+)\)/ ) { + $trm_addr{$2} = ++$trm_nums unless defined $trm_addr{$2}; + } + elsif ( $_ =~ /^(\+ )*called \{_nc_add_to_try\((0x[[:xdigit:]]+),/ ) + { + $try_addr{$2} = ++$try_nums unless defined $try_addr{$2}; + } + elsif ( $_ =~ /^(\+ )*_nc_alloc_screen_sp 0x([[:xdigit:]]+)/ ) { + $addr = "0x$2"; + $scr_addr{$addr} = ++$scr_nums unless ( $scr_addr{$addr} ); + $awaiting = ""; + } + elsif ( $_ =~ /^(\+ )*return }0x([[:xdigit:]]+)/ ) { + $addr = "0x$2"; + if ( $awaiting eq "screen" ) { + $scr_addr{$addr} = ++$scr_nums unless ( $scr_addr{$addr} ); + } + } + elsif ( $_ =~ /^\.\.\.deleted win=0x([[:xdigit:]]+)/ ) { + $addr = "0x$1"; + $_ = &transaddr($_); + if ( $addr eq $curscr ) { + $curscr = ""; + } + elsif ( $addr eq $newscr ) { + $newscr = ""; + } + elsif ( $addr eq $stdscr ) { + $stdscr = ""; + } + else { + undef $win_addr{$addr}; + } + } + elsif ( $_ =~ /^\.\.\.deleted pan=\"0x([[:xdigit:]]+)\"/ ) { + $addr = "0x$1"; + $_ = &transaddr($_); + undef $pan_addr{$addr}; + } + elsif ( $_ =~ /^([+ ])*called \{free_field\(0x([[:xdigit:]]+)\)/ ) { + $addr = "0x$2"; + $_ = &transaddr($_); + undef $fld_addr{$addr}; + } + elsif ( $_ =~ /^([+ ])*called \{free_form\(0x([[:xdigit:]]+)\)/ ) { + $addr = "0x$2"; + $_ = &transaddr($_); + undef $frm_addr{$addr}; + } + elsif ( $_ =~ /^([+ ])*called \{free_menu\(0x([[:xdigit:]]+)\)/ ) { + $addr = "0x$2"; + $_ = &transaddr($_); + undef $mnu_addr{$addr}; + } + elsif ( $_ =~ /^([+ ])*called \{free_item\(0x([[:xdigit:]]+)\)/ ) { + $addr = "0x$2"; + $_ = &transaddr($_); + undef $itm_addr{$addr}; + } + + # Compactify runs of PutAttrChar + if ( ( ( $tracelevel & $TR{CHARPUT} ) != 0 ) and $_ =~ /$putattr/ ) + { + my $putattr_chars = $1; + my $starty = $2; + my $startx = $3; + while (<$STDIN>) { + if ( $_ =~ /$putattr/ ) { + $putattr_chars .= $1; + } + else { + next if ( $_ =~ /^PUTC 0x[[:xdigit:]]+.*/ ); + next if ( $_ =~ /^\.\.\.skip.*/ ); + next if ( $_ =~ /^forced to blank.*/ ); + last; + } + } + print "RUN of PutAttrChar()s:" + . " \"$putattr_chars\" from ${starty}, ${startx}\n"; + redo CLASSIFY; + } + + # Compactify runs of waddnstr calls + if ( ( ( $tracelevel & $TR{CALLS} ) != 0 ) and $_ =~ /$waddnstr/ ) { + my $waddnstr_chars = $2; + my $winaddr = $1; + while (<$STDIN>) { + next if ( $_ =~ /^return \}0/ ); + if ( $_ =~ /$waddnstr/ && $1 eq $winaddr ) { + $waddnstr_chars .= $2; + } + else { + last; + } + } + my $winaddstr = &transaddr($winaddr); + print "RUN of waddnstr()s:" + . " $winaddstr, \"$waddnstr_chars\"\n"; + redo CLASSIFY; + } + + # More transformations can go here + + # Repeated runs of anything + my $anyline = &transaddr($_); + my $repeatcount = 1; + while (<$STDIN>) { + if ( &transaddr($_) eq $anyline ) { + $repeatcount++; + } + else { + last; + } + } + if ( $repeatcount > 1 ) { + print "${repeatcount} REPEATS OF $anyline"; + } + else { + print $thread . $anyline; + } + redo CLASSIFY if $_; + + } # :CLASSIFY + } +} + +for my $tr ( keys %TR ) { + $TR{$tr} = hex $TR{$tr}; +} + +if ( $#ARGV >= 0 ) { + while ( $#ARGV >= 0 ) { + my $file = shift @ARGV; + open my $ifh, "<", $file or die $!; + &muncher($ifh); + } +} +else { + &muncher( \*STDIN ); +} + +# tracemunch ends here diff --git a/contrib/ncurses/test/view.c b/contrib/ncurses/test/view.c new file mode 100644 index 00000000..7009508a --- /dev/null +++ b/contrib/ncurses/test/view.c @@ -0,0 +1,666 @@ +/**************************************************************************** + * Copyright 2019-2022,2024 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + * view.c -- a silly little viewer program + * + * written by Eric S. Raymond December 1994 + * to test the scrolling code in ncurses. + * + * modified by Thomas Dickey July 1995 to demonstrate + * the use of 'resizeterm()', and May 2000 to illustrate wide-character + * handling. This program intentionally does not use pads, to allow testing + * with less-capable implementations of curses. + * + * Takes a filename argument. It's a simple file-viewer with various + * scroll-up and scroll-down commands. + * + * n -- scroll one line forward + * p -- scroll one line back + * + * Either command accepts a numeric prefix interpreted as a repeat count. + * Thus, typing `5n' should scroll forward 5 lines in the file. + * + * The way you can tell this is working OK is that, in the trace file, + * there should be one scroll operation plus a small number of line + * updates, as opposed to a whole-page update. This means the physical + * scroll operation worked, and the refresh() code only had to do a + * partial repaint. + * + * $Id: view.c,v 1.147 2024/10/06 21:08:05 tom Exp $ + */ + +#include +#include +#include + +#include +#include + +static GCC_NORETURN void finish(int sig); + +#define my_pair 1 + +static int shift = 0; +static bool try_color = FALSE; + +static char *fname; +static NCURSES_CH_T **vec_lines; +static NCURSES_CH_T **lptr; +static int num_lines; + +#if USE_WIDEC_SUPPORT +static bool n_option = FALSE; +#endif + +static GCC_NORETURN void +failed(const char *msg) +{ + endwin(); + fprintf(stderr, "%s\n", msg); + ExitProgram(EXIT_FAILURE); +} + +static int +ch_len(NCURSES_CH_T *src) +{ + int result = 0; + +#if USE_WIDEC_SUPPORT + for (;;) { + TEST_CCHAR(src, { + int len = wcwidth(test_wch[0]); + result += (len > 0) ? len : 1; + ++src; + } + , { + break; + }) + } +#else + while (*src++) + result++; +#endif + return result; +} + +static void +finish(int sig) +{ + endwin(); +#if NO_LEAKS + if (vec_lines != 0) { + int n; + for (n = 0; n < num_lines; ++n) { + free(vec_lines[n]); + } + free(vec_lines); + } +#endif + ExitProgram(sig != 0 ? EXIT_FAILURE : EXIT_SUCCESS); +} + +static void +show_all(const char *tag) +{ + int i; + int digits; + char temp[BUFSIZ]; + time_t this_time; + + for (digits = 1, i = num_lines; i > 0; i /= 10) { + ++digits; + } + + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "view %.*s", (int) strlen(tag), tag); + i = (int) strlen(temp); + _nc_SPRINTF(temp + i, _nc_SLIMIT(sizeof(temp) - (size_t) i) + " %.*s", (int) sizeof(temp) - i - 2, fname); + move(0, 0); + printw("%.*s", COLS, temp); + clrtoeol(); + this_time = time((time_t *) 0); + _nc_STRNCPY(temp, ctime(&this_time), (size_t) 30); + if ((i = (int) strlen(temp)) != 0) { + temp[--i] = 0; + if (move(0, COLS - i - 2) != ERR) + printw(" %s", temp); + } + + scrollok(stdscr, FALSE); /* prevent screen from moving */ + for (i = 1; i < LINES; i++) { + NCURSES_CH_T *s; + int len; + int actual = (int) (lptr + i - vec_lines); + + if (actual > num_lines) { + if (i < LINES - 1) { + int y, x; + getyx(stdscr, y, x); + move(i, 0); + clrtobot(); + move(y, x); + } + break; + } + move(i, 0); + printw("%*d:", digits, actual); + clrtoeol(); + if ((s = lptr[i - 1]) == 0) { + continue; + } + len = ch_len(s); + if (len > shift) { +#if USE_WIDEC_SUPPORT + /* + * An index into an array of cchar_t's is not necessarily the same + * as the column-offset. A pad would do this directly. Here we + * must translate (or compute a table of offsets). + */ + { + int j; + int width; + + for (j = actual = 0; j < shift; ++j) { + TEST_CCHAR(s + j, { + width = wcwidth(test_wch[0]); + } + , { + width = 1; + }); + actual += width; + if (actual > shift) { + break; + } else if (actual == shift) { + ++j; + break; + } + } + if (actual < len) { + if (actual > shift) + addch('<'); + add_wchstr(s + j + (actual > shift)); + } + } +#else + addchstr(s + shift); +#endif + } +#if defined(NCURSES_VERSION) || defined(HAVE_WCHGAT) + if (try_color) + wchgat(stdscr, -1, WA_NORMAL, my_pair, NULL); +#endif + } + setscrreg(1, LINES - 1); + scrollok(stdscr, TRUE); + refresh(); +} + +static void +read_file(const char *filename) +{ + FILE *fp; + int pass; + int k; + int width; + size_t j; + size_t len; + struct stat sb; + char *my_blob; + char **my_vec = 0; + WINDOW *my_win; + + if (stat(filename, &sb) != 0 + || (sb.st_mode & S_IFMT) != S_IFREG) { + failed("input is not a file"); + } + + if (sb.st_size == 0) { + failed("input is empty"); + } + + if ((fp = fopen(filename, "r")) == 0) { + failed("cannot open input-file"); + } + + if ((my_blob = malloc((size_t) sb.st_size + 1)) == 0) { + failed("cannot allocate memory for input-file"); + } + + len = fread(my_blob, sizeof(char), (size_t) sb.st_size, fp); + fclose(fp); + + if (len > (size_t) sb.st_size) + len = (size_t) sb.st_size; + my_blob[len] = '\0'; + + for (pass = 0; pass < 2; ++pass) { + char *base = my_blob; + k = 0; + for (j = 0; j < len; ++j) { + if (my_blob[j] == '\n') { + if (pass) { + my_vec[k] = base; + my_blob[j] = '\0'; + } + base = my_blob + j + 1; + ++k; + } + } + if (base != (my_blob + j)) { + if (pass) + my_vec[k] = base; + ++k; + } + num_lines = k; + if (pass == 0) { + if (((my_vec = typeCalloc(char *, (size_t) k + 2)) == 0)) { + failed("cannot allocate line-vector #1"); + } + } else { + if (my_vec[0] == NULL) + my_vec[0] = my_blob; + } + } + +#if USE_WIDEC_SUPPORT + if (!memcmp("\357\273\277", my_blob, 3)) { + const char *s = my_blob + 3; + char *d = my_blob; + Trace(("trim BOM")); + do { + } while ((*d++ = *s++) != '\0'); + } +#endif + + width = (int) strlen(my_vec[0]); + for (k = 1; my_vec[k]; ++k) { + int check = (int) (my_vec[k] - my_vec[k - 1]); + if (width < check) + width = check; + } + width = (width + 1) * 5; + my_win = newwin(2, width, 0, 0); + if (my_win == 0) { + failed("cannot allocate temporary window"); + } + + if ((vec_lines = typeCalloc(NCURSES_CH_T *, (size_t) num_lines + 2)) == 0) { + failed("cannot allocate line-vector #2"); + } + + /* + * Use the curses library for rendering, including tab-conversion. This + * will not make the resulting array's indices correspond to column for + * lines containing double-width cells because the "in_wch" functions will + * ignore the skipped cells. Use pads for that sort of thing. + */ + Trace(("slurp the file")); + for (k = 0; my_vec[k]; ++k) { + char *s; + int y, x; +#if USE_WIDEC_SUPPORT + const char *last = my_vec[k] + (int) strlen(my_vec[k]); + wchar_t wch[2]; + size_t rc; +#ifndef state_unused + mbstate_t state; +#endif +#endif /* USE_WIDEC_SUPPORT */ + + werase(my_win); + wmove(my_win, 0, 0); +#if USE_WIDEC_SUPPORT + wch[1] = 0; + reset_mbytes(state); +#endif + for (s = my_vec[k]; *s != '\0'; ++s) { +#if USE_WIDEC_SUPPORT + if (!n_option) { + rc = (size_t) check_mbytes(wch[0], s, (size_t) (last - s), state); + if ((long) rc == -1 || (long) rc == -2) { + break; + } + s += rc - 1; + waddwstr(my_win, wch); + } else +#endif + waddch(my_win, *s & 0xff); + } + getyx(my_win, y, x); + if (y) + x = width - 1; + wmove(my_win, 0, 0); + /* "x + 1" works with standard curses; some implementations are buggy */ + if ((vec_lines[k] = typeCalloc(NCURSES_CH_T, x + width + 1)) == 0) { + failed("cannot allocate line-vector #3"); + } +#if USE_WIDEC_SUPPORT + win_wchnstr(my_win, vec_lines[k], x); +#else + winchnstr(my_win, vec_lines[k], x); +#endif + } + + delwin(my_win); + free(my_vec); + free(my_blob); +} + +static GCC_NORETURN void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: view [options] file" + ,"" + ,USAGE_COMMON + ,"Options:" + ," -c use color if terminal supports it" + ," -i ignore INT, QUIT, TERM signals" +#if USE_WIDEC_SUPPORT + ," -n use waddch (bytes) rather then wadd_wch (wide-chars)" +#endif + ," -s start in single-step mode, waiting for input" +#ifdef TRACE + ," -t trace screen updates" + ," -T NUM specify trace mask" +#endif + }; + size_t n; + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + static NCURSES_CONST char *help[] = + { + "Commands:", + " q,^Q,ESC - quit this program", + "", + " p, - scroll the viewport up by one row", + " n, - scroll the viewport down by one row", + " l, - scroll the viewport left by one column", + " r, - scroll the viewport right by one column", + " <,> - scroll the viewport left/right by 8 columns", + "", + " h, - scroll the viewport to top of file", + " ^F, - scroll to the next page", + " ^B, - scroll to the previous page", + " e, - scroll the viewport to end of file", + "", + " ^L - repaint using redrawwin()", + "", + " 0 through 9 - enter digits for count", + " s - use entered count for halfdelay() parameter", + " - if no entered count, stop nodelay()", + " - begin nodelay()", + 0 + }; + + int ch; + int i; + int my_delay = 0; + NCURSES_CH_T **olptr; + int value = 0; + bool done = FALSE; + bool got_number = FALSE; + bool ignore_sigs = FALSE; + bool single_step = FALSE; + const char *my_label = "Input"; + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "cinstT:")) != -1) { + switch (ch) { + case 'c': + try_color = TRUE; + break; + case 'i': + ignore_sigs = TRUE; + break; +#if USE_WIDEC_SUPPORT + case 'n': + n_option = TRUE; + break; +#endif + case 's': + single_step = TRUE; + break; +#ifdef TRACE + case 'T': + { + char *next = 0; + int tvalue = (int) strtol(optarg, &next, 0); + if (tvalue < 0 || (next != 0 && *next != 0)) + usage(FALSE); + curses_trace((unsigned) tvalue); + } + break; + case 't': + curses_trace(TRACE_CALLS); + break; +#endif + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind + 1 != argc) + usage(FALSE); + + InitAndCatch(initscr(), ignore_sigs ? SIG_IGN : finish); + keypad(stdscr, TRUE); /* enable keyboard mapping */ + (void) nonl(); /* tell curses not to do NL->CR/NL on output */ + (void) cbreak(); /* take input chars one at a time, no wait for \n */ + (void) noecho(); /* don't echo input */ + if (!single_step) + nodelay(stdscr, TRUE); + idlok(stdscr, TRUE); /* allow use of insert/delete line */ + + read_file(fname = argv[optind]); + + if (try_color) { + if (has_colors()) { + start_color(); + init_pair(my_pair, COLOR_WHITE, COLOR_BLUE); + bkgd((chtype) COLOR_PAIR(my_pair)); + } else { + try_color = FALSE; + } + } + + lptr = vec_lines; + while (!done) { + int n, c; + + if (!got_number) + show_all(my_label); + + for (;;) { + c = getch(); + if ((c < 127) && isdigit(c)) { + if (!got_number) { + MvPrintw(0, 0, "Count: "); + clrtoeol(); + } + addch(UChar(c)); + value = 10 * value + (c - '0'); + got_number = TRUE; + } else + break; + } + if (got_number && value) { + n = value; + } else { + n = 1; + } + + if (c != ERR) + my_label = keyname(c); + switch (c) { + case KEY_DOWN: + case 'n': + olptr = lptr; + for (i = 0; i < n; i++) + if ((lptr - vec_lines) < (num_lines - LINES + 1)) + lptr++; + else + break; + scrl((int) (lptr - olptr)); + break; + + case KEY_UP: + case 'p': + olptr = lptr; + for (i = 0; i < n; i++) + if (lptr > vec_lines) + lptr--; + else + break; + scrl((int) (lptr - olptr)); + break; + + case 'h': + /* FALLTHRU */ + case KEY_HOME: + lptr = vec_lines; + break; + + case '<': + if ((shift -= 8) < 0) + shift = 0; + break; + case '>': + shift += 8; + break; + + case 'e': + /* FALLTHRU */ + case KEY_END: + if (num_lines > LINES) + lptr = (vec_lines + num_lines - LINES + 1); + else + lptr = (vec_lines + (num_lines - 2)); + break; + + case CTRL('F'): + /* FALLTHRU */ + case KEY_NPAGE: + for (i = 0; i < n; i++) { + if ((lptr - vec_lines) < (num_lines - 5)) + lptr += (LINES - 1); + else + lptr = (vec_lines + num_lines - 2); + } + break; + + case CTRL('B'): + /* FALLTHRU */ + case KEY_PPAGE: + for (i = 0; i < n; i++) { + if ((lptr - vec_lines) >= LINES) + lptr -= (LINES - 1); + else + lptr = vec_lines; + } + break; + + case 'r': + case KEY_RIGHT: + shift += n; + break; + + case 'l': + case KEY_LEFT: + shift -= n; + if (shift < 0) { + shift = 0; + beep(); + } + break; + + case 'q': + case QUIT: + case ESCAPE: + done = TRUE; + break; + +#ifdef KEY_RESIZE + case KEY_RESIZE: /* ignore this; ncurses will repaint */ + break; +#endif + case 's': +#if HAVE_HALFDELAY + if (got_number) { + halfdelay(my_delay = n); + } else { + nodelay(stdscr, FALSE); + my_delay = -1; + } +#else + nodelay(stdscr, FALSE); + my_delay = -1; +#endif + break; + case ' ': + nodelay(stdscr, TRUE); + my_delay = 0; + break; + case CTRL('L'): + redrawwin(stdscr); + break; + case ERR: + if (!my_delay) + napms(50); + break; + case HELP_KEY_1: + popup_msg(stdscr, help); + break; + default: + beep(); + break; + } + if (c >= KEY_MIN || (c > 0 && !isdigit(UChar(c)))) { + got_number = FALSE; + value = 0; + } + } + + finish(0); /* we're done */ +} diff --git a/contrib/ncurses/test/widechars-utf8-tabs.txt b/contrib/ncurses/test/widechars-utf8-tabs.txt new file mode 100644 index 00000000..ca605a1d --- /dev/null +++ b/contrib/ncurses/test/widechars-utf8-tabs.txt @@ -0,0 +1,15 @@ +APPLE -- It's an APPLE. +DOG -- No, that's not my DOG. +ORANGE -- Yeah, that's JUICY. +CHICKEN -- Normally not a PET. +CAT -- No, never put a DOG and a CAT together! +FISH -- Cats like FISH. +LEMON -- You KNOW how it TASTES. +----+----1----+----2----+----3----+----4 +APPLE -- It's an APPLE. + APPLE -- It's an APPLE. + APPLE -- It's an APPLE. + APPLE -- It's an APPLE. + APPLE -- It's an APPLE. + APPLE -- It's an APPLE. +----+----1----+----2----+----3----+----4 diff --git a/contrib/ncurses/test/widechars-utf8.txt b/contrib/ncurses/test/widechars-utf8.txt new file mode 100644 index 00000000..43ecd0f7 --- /dev/null +++ b/contrib/ncurses/test/widechars-utf8.txt @@ -0,0 +1,7 @@ +APPLE -- It's an APPLE. +DOG -- No, that's not my DOG. +ORANGE -- Yeah, that's JUICY. +CHICKEN -- Normally not a PET. +CAT -- No, never put a DOG and a CAT together! +FISH -- Cats like FISH. +LEMON -- You KNOW how it TASTES. diff --git a/contrib/ncurses/test/widechars.h b/contrib/ncurses/test/widechars.h new file mode 100644 index 00000000..fe38243b --- /dev/null +++ b/contrib/ncurses/test/widechars.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * Copyright 2018-2020,2024 Thomas E. Dickey * + * Copyright 2012 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +#ifndef __WIDECHARS_H +#define __WIDECHARS_H 1 + +#include + +#if USE_WIDEC_SUPPORT + +#if defined(_NC_MINGW) +/* + * MinGW has wide-character functions, but they do not work correctly. + */ + +extern int _nc_mbtowc(wchar_t *pwc, const char *s, size_t n); +extern int __MINGW_NOTHROW _nc_mbtowc(wchar_t *pwc, const char *s, size_t n); +#define mbtowc(pwc,s,n) _nc_mbtowc(pwc,s,n) + +extern int __MINGW_NOTHROW _nc_mblen(const char *, size_t); +#define mblen(s,n) _nc_mblen(s, n) + +#endif /* _WIN32||_WIN64 */ + +#if HAVE_MBTOWC && HAVE_MBLEN +#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0)) +#define count_mbytes(buffer,length,state) mblen(buffer,length) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbtowc(&wch, buffer, length) +#define state_unused +#elif HAVE_MBRTOWC && HAVE_MBRLEN +#define reset_mbytes(state) init_mb(state) +#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&state) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbrtowc(&wch, buffer, length, &state) +#else +make an error +#endif + +#else + +#endif /* USE_WIDEC_SUPPORT */ + +extern void widechars_stub(void); + +#endif /* __WIDECHARS_H */ diff --git a/contrib/ncurses/test/worm.c b/contrib/ncurses/test/worm.c new file mode 100644 index 00000000..7c4842e4 --- /dev/null +++ b/contrib/ncurses/test/worm.c @@ -0,0 +1,697 @@ +/**************************************************************************** + * Copyright 2018-2020,2022 Thomas E. Dickey * + * Copyright 1998-2016,2017 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ +/* + + @@@ @@@ @@@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@ + @@@ @@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@ + @@@ @@@ @@@@ @@@@ @@@@ @@@@ @@@ @@@@ + @@@ @@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ + @@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ + @@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ @@@ @@@ + @@@@@@@@@@@@ @@@@ @@@@ @@@ @@@ @@@ @@@ + @@@@ @@@@ @@@@@@@@@@@@ @@@ @@@ @@@ @@@ + @@ @@ @@@@@@@@@@ @@@ @@@ @@@ @@@ + + Eric P. Scott + Caltech High Energy Physics + October, 1980 + + Hacks to turn this into a test frame for cursor movement: + Eric S. Raymond + January, 1995 + + July 1995 (esr): worms is now in living color! :-) + + This program makes a good torture-test for the ncurses cursor-optimization + code. You can use -T to set the worm move interval over which movement + traces will be dumped. The program stops and waits for one character of + input at the beginning and end of the interval. + + $Id: worm.c,v 1.89 2022/12/24 20:46:49 tom Exp $ +*/ + +#include + +#ifndef NCURSES_VERSION +#undef TRACE +#endif + +#ifdef USE_PTHREADS +#include +#endif + +WANT_USE_WINDOW(); + +#define MAX_WORMS 40 +#define MAX_LENGTH 1024 + +static chtype flavor[] = +{ + 'O', '*', '#', '$', '%', '0', '@', +}; +static const int xinc[] = +{ + 1, 1, 1, 0, -1, -1, -1, 0 +}, yinc[] = +{ + -1, 0, 1, 1, 1, 0, -1, -1 +}; + +typedef struct worm { + int orientation; + int head; + int *xpos; + int *ypos; + chtype attrs; +#ifdef USE_PTHREADS + pthread_t thread; +#endif +} WORM; + +static unsigned long sequence = 0; +static bool quitting = FALSE; + +static WORM worm[MAX_WORMS]; +static int max_refs; +static int **refs; +static int last_x, last_y; + +static const char *field; +static int length = 16, number = 3; +static chtype trail = ' '; + +static unsigned pending; + +#ifdef USE_PTHREADS +#define Locked(statement) { \ + pthread_mutex_lock(&pending_mutex); \ + statement; \ + pthread_mutex_unlock(&pending_mutex); \ + } +pthread_mutex_t pending_mutex; +#else +#define Locked(statement) statement +#endif + +#ifdef TRACE +static int generation, trace_start, trace_end; +#endif /* TRACE */ +/* *INDENT-OFF* */ +static const struct options { + int nopts; + int opts[3]; +} normal[8]={ + { 3, { 7, 0, 1 } }, + { 3, { 0, 1, 2 } }, + { 3, { 1, 2, 3 } }, + { 3, { 2, 3, 4 } }, + { 3, { 3, 4, 5 } }, + { 3, { 4, 5, 6 } }, + { 3, { 5, 6, 7 } }, + { 3, { 6, 7, 0 } } +}, upper[8]={ + { 1, { 1, 0, 0 } }, + { 2, { 1, 2, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 2, { 4, 5, 0 } }, + { 1, { 5, 0, 0 } }, + { 2, { 1, 5, 0 } } +}, left[8]={ + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 2, { 2, 3, 0 } }, + { 1, { 3, 0, 0 } }, + { 2, { 3, 7, 0 } }, + { 1, { 7, 0, 0 } }, + { 2, { 7, 0, 0 } } +}, right[8]={ + { 1, { 7, 0, 0 } }, + { 2, { 3, 7, 0 } }, + { 1, { 3, 0, 0 } }, + { 2, { 3, 4, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 2, { 6, 7, 0 } } +}, lower[8]={ + { 0, { 0, 0, 0 } }, + { 2, { 0, 1, 0 } }, + { 1, { 1, 0, 0 } }, + { 2, { 1, 5, 0 } }, + { 1, { 5, 0, 0 } }, + { 2, { 5, 6, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } } +}, upleft[8]={ + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 1, { 3, 0, 0 } }, + { 2, { 1, 3, 0 } }, + { 1, { 1, 0, 0 } } +}, upright[8]={ + { 2, { 3, 5, 0 } }, + { 1, { 3, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 1, { 5, 0, 0 } } +}, lowleft[8]={ + { 3, { 7, 0, 1 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 1, { 1, 0, 0 } }, + { 2, { 1, 7, 0 } }, + { 1, { 7, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } } +}, lowright[8]={ + { 0, { 0, 0, 0 } }, + { 1, { 7, 0, 0 } }, + { 2, { 5, 7, 0 } }, + { 1, { 5, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } }, + { 0, { 0, 0, 0 } } +}; +/* *INDENT-ON* */ + +#if HAVE_USE_WINDOW +static int +safe_wgetch(WINDOW *w, void *data GCC_UNUSED) +{ + return wgetch(w); +} +static int +safe_wrefresh(WINDOW *w, void *data GCC_UNUSED) +{ + return wrefresh(w); +} +#endif + +#ifdef KEY_RESIZE +static void +failed(const char *s) +{ + perror(s); + stop_curses(); + ExitProgram(EXIT_FAILURE); +} +#endif + +static void +cleanup(void) +{ + USING_WINDOW1(stdscr, wrefresh, safe_wrefresh); + stop_curses(); +} + +static void +onsig(int sig GCC_UNUSED) +{ + cleanup(); + ExitProgram(EXIT_FAILURE); +} + +static double +ranf(void) +{ + long r = (rand() & 077777); + return ((double) r / 32768.); +} + +static int +draw_worm(WINDOW *win, void *data) +{ + WORM *w = (WORM *) data; + const struct options *op; + unsigned mask = (unsigned) (~(1 << (w - worm))); + chtype attrs; + + int x; + int y; + int h; + + bool done = FALSE; + bool is_pending; + + Locked(is_pending = ((mask & pending) != 0)); + + attrs = w->attrs | (is_pending ? A_REVERSE : 0); + + if ((x = w->xpos[h = w->head]) < 0) { + wmove(win, y = w->ypos[h] = last_y, x = w->xpos[h] = 0); + waddch(win, attrs); + refs[y][x]++; + } else { + y = w->ypos[h]; + } + + if (x > last_x) + x = last_x; + if (y > last_y) + y = last_y; + + if (++h == length) + h = 0; + + if (w->xpos[w->head = h] >= 0) { + int x1, y1; + x1 = w->xpos[h]; + y1 = w->ypos[h]; + if (y1 < LINES + && x1 < COLS + && --refs[y1][x1] == 0) { + wmove(win, y1, x1); + waddch(win, trail); + } + } + + op = &(x == 0 + ? (y == 0 + ? upleft + : (y == last_y + ? lowleft + : left)) + : (x == last_x + ? (y == 0 + ? upright + : (y == last_y + ? lowright + : right)) + : (y == 0 + ? upper + : (y == last_y + ? lower + : normal))))[w->orientation]; + + switch (op->nopts) { + case 0: + done = TRUE; + Trace(("done - draw_worm")); + break; + case 1: + w->orientation = op->opts[0]; + break; + default: + w->orientation = op->opts[(int) (ranf() * (double) op->nopts)]; + break; + } + + if (!done) { + x += xinc[w->orientation]; + y += yinc[w->orientation]; + wmove(win, y, x); + + if (y < 0) + y = 0; + waddch(win, attrs); + + w->ypos[h] = y; + w->xpos[h] = x; + refs[y][x]++; + } + + return done; +} + +#ifdef USE_PTHREADS +static bool +quit_worm(int bitnum) +{ + Locked(pending = (pending | (unsigned) (1 << bitnum))); + + napms(10); /* let the other thread(s) have a chance */ + + Locked(pending = (pending & (unsigned) ~(1 << bitnum))); + + return quitting; +} + +static void * +start_worm(void *arg) +{ + unsigned long compare = 0; + Trace(("start_worm")); + while (!quit_worm((int) (((struct worm *) arg) - worm))) { + for (;;) { + bool done = FALSE; + Locked(done = (compare >= sequence)); + if (done) + break; + ++compare; + USING_WINDOW2(stdscr, draw_worm, arg); + } + } + Trace(("...start_worm (done)")); + return NULL; +} +#endif + +static bool +draw_all_worms(void) +{ + bool done = FALSE; + int n; + struct worm *w; + +#ifdef USE_PTHREADS + static bool first = TRUE; + if (first) { + first = FALSE; + for (n = 0, w = &worm[0]; n < number; n++, w++) { + (void) pthread_create(&(w->thread), NULL, start_worm, w); + } + } +#else + for (n = 0, w = &worm[0]; n < number; n++, w++) { + if (USING_WINDOW2(stdscr, draw_worm, w)) + done = TRUE; + } +#endif + return done; +} + +static int +get_input(void) +{ + int ch; + ch = USING_WINDOW1(stdscr, wgetch, safe_wgetch); + return ch; +} + +#ifdef KEY_RESIZE +static int +update_refs(WINDOW *win, void *data) +{ + int x, y; + + (void) win; + (void) data; + if (last_x != COLS - 1) { + for (y = 0; y <= last_y; y++) { + refs[y] = typeRealloc(int, (size_t) COLS, refs[y]); + if (!refs[y]) + failed("update_refs"); + for (x = last_x + 1; x < COLS; x++) + refs[y][x] = 0; + } + last_x = COLS - 1; + } + if (last_y != LINES - 1) { + for (y = LINES; y <= last_y; y++) + free(refs[y]); + max_refs = LINES; + refs = typeRealloc(int *, (size_t) LINES, refs); + for (y = last_y + 1; y < LINES; y++) { + refs[y] = typeMalloc(int, (size_t) COLS); + if (!refs[y]) + failed("update_refs"); + for (x = 0; x < COLS; x++) + refs[y][x] = 0; + } + last_y = LINES - 1; + } + return OK; +} +#endif + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: worm [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + ," -f fill screen with copies of \"WORM\" at start" + ," -l set length of worms" + ," -n set number of worms" + ," -t leave trail of \".\"" +#ifdef TRACE + ," -T , set trace interval" + ," -N suppress cursor-movement optimization" +#endif + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int x, y; + int n; + struct worm *w; + int *ip; + bool done = FALSE; +#if HAVE_USE_DEFAULT_COLORS + bool opt_d = FALSE; +#endif + + setlocale(LC_ALL, ""); + + while ((ch = getopt(argc, argv, OPTS_COMMON "dfl:n:tT:N")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + opt_d = TRUE; + break; +#endif + case 'f': + field = "WORM"; + break; + case 'l': + if ((length = atoi(optarg)) < 2 || length > MAX_LENGTH) { + fprintf(stderr, "%s: Invalid length\n", *argv); + usage(FALSE); + } + break; + case 'n': + if ((number = atoi(optarg)) < 1 || number > MAX_WORMS) { + fprintf(stderr, "%s: Invalid number of worms\n", *argv); + usage(FALSE); + } + break; + case 't': + trail = '.'; + break; +#ifdef TRACE + case 'T': + if (sscanf(optarg, "%d,%d", &trace_start, &trace_end) != 2) + usage(FALSE); + break; + case 'N': + _nc_optimize_enable ^= OPTIMIZE_ALL; /* declared by ncurses */ + break; +#endif /* TRACE */ + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + if (optind < argc) + usage(FALSE); + + signal(SIGINT, onsig); + initscr(); + noecho(); + cbreak(); + nonl(); + + curs_set(0); + + last_y = LINES - 1; + last_x = COLS - 1; + +#ifdef A_COLOR + if (has_colors()) { + int bg = COLOR_BLACK; + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (opt_d && (use_default_colors() == OK)) + bg = -1; +#endif + +#define SET_COLOR(num, fg) \ + init_pair(num+1, (short) fg, (short) bg); \ + flavor[num] |= (chtype) COLOR_PAIR(num+1) | A_BOLD + + SET_COLOR(0, COLOR_GREEN); + SET_COLOR(1, COLOR_RED); + SET_COLOR(2, COLOR_CYAN); + SET_COLOR(3, COLOR_WHITE); + SET_COLOR(4, COLOR_MAGENTA); + SET_COLOR(5, COLOR_BLUE); + SET_COLOR(6, COLOR_YELLOW); + } +#endif /* A_COLOR */ + + max_refs = LINES; + refs = typeMalloc(int *, (size_t) max_refs); + for (y = 0; y < max_refs; y++) { + refs[y] = typeMalloc(int, (size_t) COLS); + for (x = 0; x < COLS; x++) { + refs[y][x] = 0; + } + } + +#ifdef BADCORNER + /* if addressing the lower right corner doesn't work in your curses */ + refs[last_y][last_x] = 1; +#endif /* BADCORNER */ + + for (n = number, w = &worm[0]; --n >= 0; w++) { + w->attrs = flavor[(unsigned) n % SIZEOF(flavor)]; + w->orientation = 0; + w->head = 0; + + if (!(ip = typeMalloc(int, (size_t) (length + 1)))) { + fprintf(stderr, "%s: out of memory\n", *argv); + ExitProgram(EXIT_FAILURE); + } + w->xpos = ip; + for (x = length; --x >= 0;) + *ip++ = -1; + if (!(ip = typeMalloc(int, (size_t) (length + 1)))) { + fprintf(stderr, "%s: out of memory\n", *argv); + ExitProgram(EXIT_FAILURE); + } + w->ypos = ip; + for (y = length; --y >= 0;) + *ip++ = -1; + } + if (field) { + const char *p; + p = field; + for (y = last_y; --y >= 0;) { + for (x = COLS; --x >= 0;) { + addch((chtype) (*p++)); + if (!*p) + p = field; + } + } + } + USING_WINDOW1(stdscr, wrefresh, safe_wrefresh); + nodelay(stdscr, TRUE); + +#ifdef USE_PTHREADS + pthread_mutex_init(&pending_mutex, NULL); +#endif + + while (!done) { + Locked(++sequence); + if ((ch = get_input()) > 0) { +#ifdef TRACE + if (trace_start || trace_end) { + if (generation == trace_start) { + curses_trace(TRACE_CALLS); + get_input(); + } else if (generation == trace_end) { + curses_trace(0); + get_input(); + } + + generation++; + } +#endif + +#ifdef KEY_RESIZE + if (ch == KEY_RESIZE) { + USING_WINDOW(stdscr, update_refs); + } +#endif + + /* + * Make it simple to put this into single-step mode, or resume + * normal operation -T.Dickey + */ + if (ch == 'q') { + quitting = TRUE; + done = TRUE; + Trace(("done - quitting")); + continue; + } else if (ch == 's') { + nodelay(stdscr, FALSE); + } else if (ch == ' ') { + nodelay(stdscr, TRUE); + } + } + + done = draw_all_worms(); + napms(10); + USING_WINDOW1(stdscr, wrefresh, safe_wrefresh); + } + + Trace(("Cleanup")); + cleanup(); +#ifdef USE_PTHREADS + /* + * Do this just in case one of the threads did not really exit. + */ + Trace(("join all threads")); + for (n = 0; n < number; n++) { + pthread_join(worm[n].thread, NULL); + } +#endif +#if NO_LEAKS + for (y = 0; y < max_refs; y++) { + free(refs[y]); + } + free(refs); + for (n = number, w = &worm[0]; --n >= 0; w++) { + free(w->xpos); + free(w->ypos); + } +#endif + ExitProgram(EXIT_SUCCESS); +} diff --git a/contrib/ncurses/test/xmas.c b/contrib/ncurses/test/xmas.c new file mode 100644 index 00000000..9ba3a26c --- /dev/null +++ b/contrib/ncurses/test/xmas.c @@ -0,0 +1,1178 @@ +/******************************************************************************/ +/* asciixmas */ +/* December 1989 Larry Bartz Indianapolis, IN */ +/* */ +/* */ +/* I'm dreaming of an ascii character-based monochrome Christmas, */ +/* Just like the one's I used to know! */ +/* Via a full duplex communications channel, */ +/* At 9600 bits per second, */ +/* Even though it's kinda slow. */ +/* */ +/* I'm dreaming of an ascii character-based monochrome Christmas, */ +/* With ev'ry C program I write! */ +/* May your screen be merry and bright! */ +/* And may all your Christmases be amber or green, */ +/* (for reduced eyestrain and improved visibility)! */ +/* */ +/* */ +/* */ +/* */ +/* */ +/* IMPLEMENTATION */ +/* */ +/* Feel free to modify the defined string FROMWHO to reflect you, your */ +/* organization, your site, whatever. */ +/* */ +/* This really looks a lot better if you can turn off your cursor before */ +/* execution. I wanted to do that here but very few termcap entries or */ +/* terminfo definitions have the appropriate string defined. If you know */ +/* the string(s) for the terminal(s) you use or which your site supports, */ +/* you could call asciixmas from within a shell in which you issue the */ +/* string to the terminal. The cursor is distracting but it doesn't really */ +/* ruin the show. */ +/* */ +/* At our site, we invoke this for our users just after login and the */ +/* determination of terminal type. */ +/* */ +/* */ +/* PORTABILITY */ +/* */ +/* I wrote this using only the very simplest curses functions so that it */ +/* might be the most portable. I was personally able to test on five */ +/* different cpu/UNIX combinations. */ +/* */ +/* */ +/* COMPILE */ +/* */ +/* usually this: */ +/* */ +/* cc -O asciixmas.c -lcurses -o asciixmas -s */ +/* */ +/* */ +/* Zilog S8000 models 11, 21, 31, etc with ZEUS variant of SYSTEM III */ +/* maybe other SYSTEM III also: */ +/* */ +/* cc asciixmas.c -lcurses -ltermlib -o asciixmas -s */ +/* */ +/* as above with optional "peephole optimizer" installed: */ +/* */ +/* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s */ +/* */ +/* */ +/* Zilog S8000 models 32, 130 with WE32100 chip and SYS V, REL2 */ +/* maybe 3B2 also? */ +/* */ +/* cc -f -O -K sd asciixmas.c -lcurses -o asciixmas -s */ +/* */ +/* */ +/* Pyramid, Sequent, any other "dual universe" types compile and execute */ +/* under either universe. The compile line for the ucb universe (as you */ +/* might expect) is the same as for SYS III UNIX: */ +/* */ +/* cc -O asciixmas.c -lcurses -ltermlib -o asciixmas -s */ +/* */ +/* The above compile will also hold true for other BSD systems. (I hope) */ +/* */ +/* */ +/* */ +/* */ +/* For the Scrooges out there among you who don't want this thing to loop */ +/* forever (or until the user hits a key), insert this into your compile */ +/* line just after "cc" : */ +/* */ +/* -DNOLOOP */ +/* */ +/* like so: */ +/* */ +/* cc -DNOLOOP -O asciixmas.c -lcurses -o asciixmas -s */ +/* */ +/* */ +/* */ +/******************************************************************************/ + +/* + * $Id: xmas.c,v 1.39 2022/12/04 00:40:11 tom Exp $ + */ +#include + +#define FROMWHO "Mark Hessling - (M.Hessling@gu.edu.au)" + +static int my_bg = COLOR_BLACK; +static int y_pos, x_pos; + +static WINDOW *treescrn; +static WINDOW *treescrn2; +static WINDOW *treescrn3; +static WINDOW *treescrn4; +static WINDOW *treescrn5; +static WINDOW *treescrn6; +static WINDOW *treescrn7; +static WINDOW *treescrn8; +static WINDOW *dotdeer0; +static WINDOW *stardeer0; +static WINDOW *lildeer0; +static WINDOW *lildeer1; +static WINDOW *lildeer2; +static WINDOW *lildeer3; +static WINDOW *middeer0; +static WINDOW *middeer1; +static WINDOW *middeer2; +static WINDOW *middeer3; +static WINDOW *bigdeer0; +static WINDOW *bigdeer1; +static WINDOW *bigdeer2; +static WINDOW *bigdeer3; +static WINDOW *bigdeer4; +static WINDOW *lookdeer0; +static WINDOW *lookdeer1; +static WINDOW *lookdeer2; +static WINDOW *lookdeer3; +static WINDOW *lookdeer4; +static WINDOW *w_holiday; +static WINDOW *w_del_msg; +static bool *my_pairs; + +static GCC_NORETURN void done(int sig); + +static void +set_color(WINDOW *win, chtype color) +{ + if (has_colors()) { + int n = (int) (color + 1); + if (my_pairs == 0) + my_pairs = typeCalloc(bool, (size_t) (COLORS + 1)); + if (!my_pairs[n]) { + init_pair((short) n, (short) color, (short) my_bg); + my_pairs[n] = TRUE; + } + wattroff(win, A_COLOR); + wattron(win, COLOR_PAIR(n)); + } +} + +static void +unset_color(WINDOW *win) +{ + if (has_colors()) + (void) wattrset(win, COLOR_PAIR(0)); +} + +static void +look_out(int msecs) +{ + napms(msecs); + if (getch() != ERR) { + beep(); + done(0); + } +} + +static int +boxit(void) +{ + int x = 0; + + while (x < 20) { + MvAddCh(x, 7, '|'); + ++x; + } + + x = 8; + + while (x < 80) { + MvAddCh(19, x, '_'); + ++x; + } + + x = 0; + + while (x < 80) { + MvAddCh(22, x, '_'); + ++x; + } + + return (0); +} + +static int +seas(void) +{ + MvAddCh(4, 1, 'S'); + MvAddCh(6, 1, 'E'); + MvAddCh(8, 1, 'A'); + MvAddCh(10, 1, 'S'); + MvAddCh(12, 1, 'O'); + MvAddCh(14, 1, 'N'); + MvAddCh(16, 1, '`'); + MvAddCh(18, 1, 'S'); + + return (0); +} + +static int +greet(void) +{ + MvAddCh(3, 5, 'G'); + MvAddCh(5, 5, 'R'); + MvAddCh(7, 5, 'E'); + MvAddCh(9, 5, 'E'); + MvAddCh(11, 5, 'T'); + MvAddCh(13, 5, 'I'); + MvAddCh(15, 5, 'N'); + MvAddCh(17, 5, 'G'); + MvAddCh(19, 5, 'S'); + + return (0); +} + +static int +fromwho(void) +{ + MvAddStr(21, 13, FROMWHO); + return (0); +} + +static int +tree(void) +{ + set_color(treescrn, COLOR_GREEN); + MvWAddCh(treescrn, 1, 11, (chtype) '/'); + MvWAddCh(treescrn, 2, 11, (chtype) '/'); + MvWAddCh(treescrn, 3, 10, (chtype) '/'); + MvWAddCh(treescrn, 4, 9, (chtype) '/'); + MvWAddCh(treescrn, 5, 9, (chtype) '/'); + MvWAddCh(treescrn, 6, 8, (chtype) '/'); + MvWAddCh(treescrn, 7, 7, (chtype) '/'); + MvWAddCh(treescrn, 8, 6, (chtype) '/'); + MvWAddCh(treescrn, 9, 6, (chtype) '/'); + MvWAddCh(treescrn, 10, 5, (chtype) '/'); + MvWAddCh(treescrn, 11, 3, (chtype) '/'); + MvWAddCh(treescrn, 12, 2, (chtype) '/'); + + MvWAddCh(treescrn, 1, 13, (chtype) '\\'); + MvWAddCh(treescrn, 2, 13, (chtype) '\\'); + MvWAddCh(treescrn, 3, 14, (chtype) '\\'); + MvWAddCh(treescrn, 4, 15, (chtype) '\\'); + MvWAddCh(treescrn, 5, 15, (chtype) '\\'); + MvWAddCh(treescrn, 6, 16, (chtype) '\\'); + MvWAddCh(treescrn, 7, 17, (chtype) '\\'); + MvWAddCh(treescrn, 8, 18, (chtype) '\\'); + MvWAddCh(treescrn, 9, 18, (chtype) '\\'); + MvWAddCh(treescrn, 10, 19, (chtype) '\\'); + MvWAddCh(treescrn, 11, 21, (chtype) '\\'); + MvWAddCh(treescrn, 12, 22, (chtype) '\\'); + + MvWAddCh(treescrn, 4, 10, (chtype) '_'); + MvWAddCh(treescrn, 4, 14, (chtype) '_'); + MvWAddCh(treescrn, 8, 7, (chtype) '_'); + MvWAddCh(treescrn, 8, 17, (chtype) '_'); + + MvWAddStr(treescrn, 13, 0, "//////////// \\\\\\\\\\\\\\\\\\\\\\\\"); + + MvWAddStr(treescrn, 14, 11, "| |"); + MvWAddStr(treescrn, 15, 11, "|_|"); + + unset_color(treescrn); + wrefresh(treescrn); + wrefresh(w_del_msg); + + return (0); +} + +static int +balls(void) +{ + overlay(treescrn, treescrn2); + + set_color(treescrn2, COLOR_BLUE); + MvWAddCh(treescrn2, 3, 9, (chtype) '@'); + MvWAddCh(treescrn2, 3, 15, (chtype) '@'); + MvWAddCh(treescrn2, 4, 8, (chtype) '@'); + MvWAddCh(treescrn2, 4, 16, (chtype) '@'); + MvWAddCh(treescrn2, 5, 7, (chtype) '@'); + MvWAddCh(treescrn2, 5, 17, (chtype) '@'); + MvWAddCh(treescrn2, 7, 6, (chtype) '@'); + MvWAddCh(treescrn2, 7, 18, (chtype) '@'); + MvWAddCh(treescrn2, 8, 5, (chtype) '@'); + MvWAddCh(treescrn2, 8, 19, (chtype) '@'); + MvWAddCh(treescrn2, 10, 4, (chtype) '@'); + MvWAddCh(treescrn2, 10, 20, (chtype) '@'); + MvWAddCh(treescrn2, 11, 2, (chtype) '@'); + MvWAddCh(treescrn2, 11, 22, (chtype) '@'); + MvWAddCh(treescrn2, 12, 1, (chtype) '@'); + MvWAddCh(treescrn2, 12, 23, (chtype) '@'); + + unset_color(treescrn2); + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +star(void) +{ + (void) wattrset(treescrn2, A_BOLD | A_BLINK); + set_color(treescrn2, COLOR_YELLOW); + + MvWAddCh(treescrn2, 0, 12, (chtype) '*'); + (void) wstandend(treescrn2); + + unset_color(treescrn2); + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +strng1(void) +{ + (void) wattrset(treescrn2, A_BOLD | A_BLINK); + set_color(treescrn2, COLOR_WHITE); + + MvWAddCh(treescrn2, 3, 13, (chtype) '\''); + MvWAddCh(treescrn2, 3, 12, (chtype) ':'); + MvWAddCh(treescrn2, 3, 11, (chtype) '.'); + + wattroff(treescrn2, A_BOLD | A_BLINK); + unset_color(treescrn2); + + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +strng2(void) +{ + (void) wattrset(treescrn2, A_BOLD | A_BLINK); + set_color(treescrn2, COLOR_WHITE); + + MvWAddCh(treescrn2, 5, 14, (chtype) '\''); + MvWAddCh(treescrn2, 5, 13, (chtype) ':'); + MvWAddCh(treescrn2, 5, 12, (chtype) '.'); + MvWAddCh(treescrn2, 5, 11, (chtype) ','); + MvWAddCh(treescrn2, 6, 10, (chtype) '\''); + MvWAddCh(treescrn2, 6, 9, (chtype) ':'); + + wattroff(treescrn2, A_BOLD | A_BLINK); + unset_color(treescrn2); + + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +strng3(void) +{ + (void) wattrset(treescrn2, A_BOLD | A_BLINK); + set_color(treescrn2, COLOR_WHITE); + + MvWAddCh(treescrn2, 7, 16, (chtype) '\''); + MvWAddCh(treescrn2, 7, 15, (chtype) ':'); + MvWAddCh(treescrn2, 7, 14, (chtype) '.'); + MvWAddCh(treescrn2, 7, 13, (chtype) ','); + MvWAddCh(treescrn2, 8, 12, (chtype) '\''); + MvWAddCh(treescrn2, 8, 11, (chtype) ':'); + MvWAddCh(treescrn2, 8, 10, (chtype) '.'); + MvWAddCh(treescrn2, 8, 9, (chtype) ','); + + wattroff(treescrn2, A_BOLD | A_BLINK); + unset_color(treescrn2); + + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +strng4(void) +{ + (void) wattrset(treescrn2, A_BOLD | A_BLINK); + set_color(treescrn2, COLOR_WHITE); + + MvWAddCh(treescrn2, 9, 17, (chtype) '\''); + MvWAddCh(treescrn2, 9, 16, (chtype) ':'); + MvWAddCh(treescrn2, 9, 15, (chtype) '.'); + MvWAddCh(treescrn2, 9, 14, (chtype) ','); + MvWAddCh(treescrn2, 10, 13, (chtype) '\''); + MvWAddCh(treescrn2, 10, 12, (chtype) ':'); + MvWAddCh(treescrn2, 10, 11, (chtype) '.'); + MvWAddCh(treescrn2, 10, 10, (chtype) ','); + MvWAddCh(treescrn2, 11, 9, (chtype) '\''); + MvWAddCh(treescrn2, 11, 8, (chtype) ':'); + MvWAddCh(treescrn2, 11, 7, (chtype) '.'); + MvWAddCh(treescrn2, 11, 6, (chtype) ','); + MvWAddCh(treescrn2, 12, 5, (chtype) '\''); + + wattroff(treescrn2, A_BOLD | A_BLINK); + unset_color(treescrn2); + + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +strng5(void) +{ + (void) wattrset(treescrn2, A_BOLD | A_BLINK); + set_color(treescrn2, COLOR_WHITE); + + MvWAddCh(treescrn2, 11, 19, (chtype) '\''); + MvWAddCh(treescrn2, 11, 18, (chtype) ':'); + MvWAddCh(treescrn2, 11, 17, (chtype) '.'); + MvWAddCh(treescrn2, 11, 16, (chtype) ','); + MvWAddCh(treescrn2, 12, 15, (chtype) '\''); + MvWAddCh(treescrn2, 12, 14, (chtype) ':'); + MvWAddCh(treescrn2, 12, 13, (chtype) '.'); + MvWAddCh(treescrn2, 12, 12, (chtype) ','); + + wattroff(treescrn2, A_BOLD | A_BLINK); + unset_color(treescrn2); + + /* save a fully lit tree */ + overlay(treescrn2, treescrn); + + wrefresh(treescrn2); + wrefresh(w_del_msg); + return (0); +} + +static int +blinkit(void) +{ + static int cycle; + + if (cycle > 4) { + cycle = 0; + } + + touchwin(treescrn8); + + switch (cycle) { + case 0: + overlay(treescrn3, treescrn8); + break; + case 1: + overlay(treescrn4, treescrn8); + break; + case 2: + overlay(treescrn5, treescrn8); + break; + case 3: + overlay(treescrn6, treescrn8); + break; + case 4: + overlay(treescrn7, treescrn8); + break; + } + touchwin(treescrn8); + wrefresh(treescrn8); + wrefresh(w_del_msg); + look_out(50); + + /*ALL ON************************************************** */ + + overlay(treescrn, treescrn8); + wrefresh(treescrn8); + wrefresh(w_del_msg); + look_out(50); + + ++cycle; + return (0); +} + +static void +deer_step(WINDOW *win, int y, int x) +{ + mvwin(win, y, x); + wrefresh(win); + wrefresh(w_del_msg); + look_out(5); +} + +static int +reindeer(void) +{ + int looper; + y_pos = 0; + + for (x_pos = 70; x_pos > 62; x_pos--) { + for (looper = 0; looper < 4; looper++) { + MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '.'); + wrefresh(dotdeer0); + wrefresh(w_del_msg); + werase(dotdeer0); + wrefresh(dotdeer0); + wrefresh(w_del_msg); + look_out(50); + } + } + + y_pos = 2; + + for (; x_pos > 50; x_pos--) { + for (looper = 0; looper < 4; looper++) { + + if (x_pos < 56) { + y_pos = 3; + + MvWAddCh(stardeer0, y_pos, x_pos, (chtype) '*'); + wrefresh(stardeer0); + wrefresh(w_del_msg); + werase(stardeer0); + wrefresh(stardeer0); + wrefresh(w_del_msg); + } else { + MvWAddCh(dotdeer0, y_pos, x_pos, (chtype) '*'); + wrefresh(dotdeer0); + wrefresh(w_del_msg); + werase(dotdeer0); + wrefresh(dotdeer0); + wrefresh(w_del_msg); + } + } + } + + x_pos = 58; + + for (y_pos = 2; y_pos < 5; y_pos++) { + + touchwin(lildeer0); + wrefresh(lildeer0); + wrefresh(w_del_msg); + + for (looper = 0; looper < 4; looper++) { + deer_step(lildeer3, y_pos, x_pos); + deer_step(lildeer2, y_pos, x_pos); + deer_step(lildeer1, y_pos, x_pos); + deer_step(lildeer2, y_pos, x_pos); + deer_step(lildeer3, y_pos, x_pos); + + touchwin(lildeer0); + wrefresh(lildeer0); + wrefresh(w_del_msg); + + x_pos -= 2; + } + } + + x_pos = 35; + + for (y_pos = 5; y_pos < 10; y_pos++) { + + touchwin(middeer0); + wrefresh(middeer0); + wrefresh(w_del_msg); + + for (looper = 0; looper < 2; looper++) { + deer_step(middeer3, y_pos, x_pos); + deer_step(middeer2, y_pos, x_pos); + deer_step(middeer1, y_pos, x_pos); + deer_step(middeer2, y_pos, x_pos); + deer_step(middeer3, y_pos, x_pos); + + touchwin(middeer0); + wrefresh(middeer0); + wrefresh(w_del_msg); + + x_pos -= 3; + } + } + + look_out(300); + + y_pos = 1; + + for (x_pos = 8; x_pos < 16; x_pos++) { + deer_step(bigdeer4, y_pos, x_pos); + deer_step(bigdeer3, y_pos, x_pos); + deer_step(bigdeer2, y_pos, x_pos); + deer_step(bigdeer1, y_pos, x_pos); + deer_step(bigdeer2, y_pos, x_pos); + deer_step(bigdeer3, y_pos, x_pos); + deer_step(bigdeer4, y_pos, x_pos); + deer_step(bigdeer0, y_pos, x_pos); + } + + --x_pos; + + for (looper = 0; looper < 6; looper++) { + deer_step(lookdeer4, y_pos, x_pos); + deer_step(lookdeer3, y_pos, x_pos); + deer_step(lookdeer2, y_pos, x_pos); + deer_step(lookdeer1, y_pos, x_pos); + deer_step(lookdeer2, y_pos, x_pos); + deer_step(lookdeer3, y_pos, x_pos); + deer_step(lookdeer4, y_pos, x_pos); + } + + deer_step(lookdeer0, y_pos, x_pos); + + for (; y_pos < 10; y_pos++) { + for (looper = 0; looper < 2; looper++) { + deer_step(bigdeer4, y_pos, x_pos); + deer_step(bigdeer3, y_pos, x_pos); + deer_step(bigdeer2, y_pos, x_pos); + deer_step(bigdeer1, y_pos, x_pos); + deer_step(bigdeer2, y_pos, x_pos); + deer_step(bigdeer3, y_pos, x_pos); + deer_step(bigdeer4, y_pos, x_pos); + } + deer_step(bigdeer0, y_pos, x_pos); + } + + --y_pos; + + deer_step(lookdeer3, y_pos, x_pos); + return (0); +} + +static void +done(int sig GCC_UNUSED) +{ + move(LINES - 1, 0); + refresh(); + stop_curses(); + +#if NO_LEAKS + if (my_pairs != 0) + free(my_pairs); +#endif + + ExitProgram(EXIT_SUCCESS); +} + +static void +usage(int ok) +{ + static const char *msg[] = + { + "Usage: xmas [options]" + ,"" + ,USAGE_COMMON + ,"Options:" +#if HAVE_USE_DEFAULT_COLORS + ," -d invoke use_default_colors" +#endif + ," -q execute once, then quit" + }; + size_t n; + + for (n = 0; n < SIZEOF(msg); n++) + fprintf(stderr, "%s\n", msg[n]); + + ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE); +} +/* *INDENT-OFF* */ +VERSION_COMMON() +/* *INDENT-ON* */ + +int +main(int argc, char *argv[]) +{ + int ch; + int loopy; +#if HAVE_USE_DEFAULT_COLORS + bool opt_d = FALSE; +#endif + bool opt_q = FALSE; + + while ((ch = getopt(argc, argv, OPTS_COMMON "dq")) != -1) { + switch (ch) { +#if HAVE_USE_DEFAULT_COLORS + case 'd': + opt_d = TRUE; + break; +#endif + case 'q': + opt_q = TRUE; + break; + case OPTS_VERSION: + show_version(argv); + ExitProgram(EXIT_SUCCESS); + default: + usage(ch == OPTS_USAGE); + /* NOTREACHED */ + } + } + + setlocale(LC_ALL, ""); + + InitAndCatch(initscr(), done); + noecho(); + nonl(); + refresh(); + + if (has_colors()) { + start_color(); +#if HAVE_USE_DEFAULT_COLORS + if (opt_d && (use_default_colors() == OK)) + my_bg = -1; +#endif + } + curs_set(0); + + if ((treescrn = newwin(16, 27, 3, 53)) == 0 || + (treescrn2 = newwin(16, 27, 3, 53)) == 0 || + (treescrn3 = newwin(16, 27, 3, 53)) == 0 || + (treescrn4 = newwin(16, 27, 3, 53)) == 0 || + (treescrn5 = newwin(16, 27, 3, 53)) == 0 || + (treescrn6 = newwin(16, 27, 3, 53)) == 0 || + (treescrn7 = newwin(16, 27, 3, 53)) == 0 || + (treescrn8 = newwin(16, 27, 3, 53)) == 0 || + + (dotdeer0 = newwin(3, 71, 0, 8)) == 0 || + + (stardeer0 = newwin(4, 56, 0, 8)) == 0 || + + (lildeer0 = newwin(7, 53, 0, 8)) == 0 || + (lildeer1 = newwin(2, 4, 0, 0)) == 0 || + (lildeer2 = newwin(2, 4, 0, 0)) == 0 || + (lildeer3 = newwin(2, 4, 0, 0)) == 0 || + + (middeer0 = newwin(15, 42, 0, 8)) == 0 || + (middeer1 = newwin(3, 7, 0, 0)) == 0 || + (middeer2 = newwin(3, 7, 0, 0)) == 0 || + (middeer3 = newwin(3, 7, 0, 0)) == 0 || + + (bigdeer0 = newwin(10, 23, 0, 0)) == 0 || + (bigdeer1 = newwin(10, 23, 0, 0)) == 0 || + (bigdeer2 = newwin(10, 23, 0, 0)) == 0 || + (bigdeer3 = newwin(10, 23, 0, 0)) == 0 || + (bigdeer4 = newwin(10, 23, 0, 0)) == 0 || + + (lookdeer0 = newwin(10, 25, 0, 0)) == 0 || + (lookdeer1 = newwin(10, 25, 0, 0)) == 0 || + (lookdeer2 = newwin(10, 25, 0, 0)) == 0 || + (lookdeer3 = newwin(10, 25, 0, 0)) == 0 || + (lookdeer4 = newwin(10, 25, 0, 0)) == 0 || + + (w_holiday = newwin(1, 26, 3, 27)) == 0 || + + (w_del_msg = newwin(1, 19, 23, 60)) == 0) { + stop_curses(); + fprintf(stderr, "Cannot create windows - screen too small\n"); + ExitProgram(EXIT_FAILURE); + } + + MvWAddStr(w_del_msg, 0, 0, "Hit any key to quit"); + + MvWAddStr(w_holiday, 0, 0, "H A P P Y H O L I D A Y S"); + + /* set up the windows for our various reindeer */ + + /* lildeer1 */ + MvWAddCh(lildeer1, 0, 0, (chtype) 'V'); + MvWAddCh(lildeer1, 1, 0, (chtype) '@'); + MvWAddCh(lildeer1, 1, 1, (chtype) '<'); + MvWAddCh(lildeer1, 1, 2, (chtype) '>'); + MvWAddCh(lildeer1, 1, 3, (chtype) '~'); + + /* lildeer2 */ + MvWAddCh(lildeer2, 0, 0, (chtype) 'V'); + MvWAddCh(lildeer2, 1, 0, (chtype) '@'); + MvWAddCh(lildeer2, 1, 1, (chtype) '|'); + MvWAddCh(lildeer2, 1, 2, (chtype) '|'); + MvWAddCh(lildeer2, 1, 3, (chtype) '~'); + + /* lildeer3 */ + MvWAddCh(lildeer3, 0, 0, (chtype) 'V'); + MvWAddCh(lildeer3, 1, 0, (chtype) '@'); + MvWAddCh(lildeer3, 1, 1, (chtype) '>'); + MvWAddCh(lildeer3, 1, 2, (chtype) '<'); + MvWAddCh(lildeer2, 1, 3, (chtype) '~'); + + /* middeer1 */ + MvWAddCh(middeer1, 0, 2, (chtype) 'y'); + MvWAddCh(middeer1, 0, 3, (chtype) 'y'); + MvWAddCh(middeer1, 1, 2, (chtype) '0'); + MvWAddCh(middeer1, 1, 3, (chtype) '('); + MvWAddCh(middeer1, 1, 4, (chtype) '='); + MvWAddCh(middeer1, 1, 5, (chtype) ')'); + MvWAddCh(middeer1, 1, 6, (chtype) '~'); + MvWAddCh(middeer1, 2, 3, (chtype) '\\'); + MvWAddCh(middeer1, 2, 4, (chtype) '/'); + + /* middeer2 */ + MvWAddCh(middeer2, 0, 2, (chtype) 'y'); + MvWAddCh(middeer2, 0, 3, (chtype) 'y'); + MvWAddCh(middeer2, 1, 2, (chtype) '0'); + MvWAddCh(middeer2, 1, 3, (chtype) '('); + MvWAddCh(middeer2, 1, 4, (chtype) '='); + MvWAddCh(middeer2, 1, 5, (chtype) ')'); + MvWAddCh(middeer2, 1, 6, (chtype) '~'); + MvWAddCh(middeer2, 2, 3, (chtype) '|'); + MvWAddCh(middeer2, 2, 5, (chtype) '|'); + + /* middeer3 */ + MvWAddCh(middeer3, 0, 2, (chtype) 'y'); + MvWAddCh(middeer3, 0, 3, (chtype) 'y'); + MvWAddCh(middeer3, 1, 2, (chtype) '0'); + MvWAddCh(middeer3, 1, 3, (chtype) '('); + MvWAddCh(middeer3, 1, 4, (chtype) '='); + MvWAddCh(middeer3, 1, 5, (chtype) ')'); + MvWAddCh(middeer3, 1, 6, (chtype) '~'); + MvWAddCh(middeer3, 2, 2, (chtype) '/'); + MvWAddCh(middeer3, 2, 6, (chtype) '\\'); + + /* bigdeer1 */ + MvWAddCh(bigdeer1, 0, 17, (chtype) '\\'); + MvWAddCh(bigdeer1, 0, 18, (chtype) '/'); + MvWAddCh(bigdeer1, 0, 20, (chtype) '\\'); + MvWAddCh(bigdeer1, 0, 21, (chtype) '/'); + MvWAddCh(bigdeer1, 1, 18, (chtype) '\\'); + MvWAddCh(bigdeer1, 1, 20, (chtype) '/'); + MvWAddCh(bigdeer1, 2, 19, (chtype) '|'); + MvWAddCh(bigdeer1, 2, 20, (chtype) '_'); + MvWAddCh(bigdeer1, 3, 18, (chtype) '/'); + MvWAddCh(bigdeer1, 3, 19, (chtype) '^'); + MvWAddCh(bigdeer1, 3, 20, (chtype) '0'); + MvWAddCh(bigdeer1, 3, 21, (chtype) '\\'); + MvWAddCh(bigdeer1, 4, 17, (chtype) '/'); + MvWAddCh(bigdeer1, 4, 18, (chtype) '/'); + MvWAddCh(bigdeer1, 4, 19, (chtype) '\\'); + MvWAddCh(bigdeer1, 4, 22, (chtype) '\\'); + MvWAddStr(bigdeer1, 5, 7, "^~~~~~~~~// ~~U"); + MvWAddStr(bigdeer1, 6, 7, "( \\_____( /"); + MvWAddStr(bigdeer1, 7, 8, "( ) /"); + MvWAddStr(bigdeer1, 8, 9, "\\\\ /"); + MvWAddStr(bigdeer1, 9, 11, "\\>/>"); + + /* bigdeer2 */ + MvWAddCh(bigdeer2, 0, 17, (chtype) '\\'); + MvWAddCh(bigdeer2, 0, 18, (chtype) '/'); + MvWAddCh(bigdeer2, 0, 20, (chtype) '\\'); + MvWAddCh(bigdeer2, 0, 21, (chtype) '/'); + MvWAddCh(bigdeer2, 1, 18, (chtype) '\\'); + MvWAddCh(bigdeer2, 1, 20, (chtype) '/'); + MvWAddCh(bigdeer2, 2, 19, (chtype) '|'); + MvWAddCh(bigdeer2, 2, 20, (chtype) '_'); + MvWAddCh(bigdeer2, 3, 18, (chtype) '/'); + MvWAddCh(bigdeer2, 3, 19, (chtype) '^'); + MvWAddCh(bigdeer2, 3, 20, (chtype) '0'); + MvWAddCh(bigdeer2, 3, 21, (chtype) '\\'); + MvWAddCh(bigdeer2, 4, 17, (chtype) '/'); + MvWAddCh(bigdeer2, 4, 18, (chtype) '/'); + MvWAddCh(bigdeer2, 4, 19, (chtype) '\\'); + MvWAddCh(bigdeer2, 4, 22, (chtype) '\\'); + MvWAddStr(bigdeer2, 5, 7, "^~~~~~~~~// ~~U"); + MvWAddStr(bigdeer2, 6, 7, "(( )____( /"); + MvWAddStr(bigdeer2, 7, 7, "( / |"); + MvWAddStr(bigdeer2, 8, 8, "\\/ |"); + MvWAddStr(bigdeer2, 9, 9, "|> |>"); + + /* bigdeer3 */ + MvWAddCh(bigdeer3, 0, 17, (chtype) '\\'); + MvWAddCh(bigdeer3, 0, 18, (chtype) '/'); + MvWAddCh(bigdeer3, 0, 20, (chtype) '\\'); + MvWAddCh(bigdeer3, 0, 21, (chtype) '/'); + MvWAddCh(bigdeer3, 1, 18, (chtype) '\\'); + MvWAddCh(bigdeer3, 1, 20, (chtype) '/'); + MvWAddCh(bigdeer3, 2, 19, (chtype) '|'); + MvWAddCh(bigdeer3, 2, 20, (chtype) '_'); + MvWAddCh(bigdeer3, 3, 18, (chtype) '/'); + MvWAddCh(bigdeer3, 3, 19, (chtype) '^'); + MvWAddCh(bigdeer3, 3, 20, (chtype) '0'); + MvWAddCh(bigdeer3, 3, 21, (chtype) '\\'); + MvWAddCh(bigdeer3, 4, 17, (chtype) '/'); + MvWAddCh(bigdeer3, 4, 18, (chtype) '/'); + MvWAddCh(bigdeer3, 4, 19, (chtype) '\\'); + MvWAddCh(bigdeer3, 4, 22, (chtype) '\\'); + MvWAddStr(bigdeer3, 5, 7, "^~~~~~~~~// ~~U"); + MvWAddStr(bigdeer3, 6, 6, "( ()_____( /"); + MvWAddStr(bigdeer3, 7, 6, "/ / /"); + MvWAddStr(bigdeer3, 8, 5, "|/ \\"); + MvWAddStr(bigdeer3, 9, 5, "/> \\>"); + + /* bigdeer4 */ + MvWAddCh(bigdeer4, 0, 17, (chtype) '\\'); + MvWAddCh(bigdeer4, 0, 18, (chtype) '/'); + MvWAddCh(bigdeer4, 0, 20, (chtype) '\\'); + MvWAddCh(bigdeer4, 0, 21, (chtype) '/'); + MvWAddCh(bigdeer4, 1, 18, (chtype) '\\'); + MvWAddCh(bigdeer4, 1, 20, (chtype) '/'); + MvWAddCh(bigdeer4, 2, 19, (chtype) '|'); + MvWAddCh(bigdeer4, 2, 20, (chtype) '_'); + MvWAddCh(bigdeer4, 3, 18, (chtype) '/'); + MvWAddCh(bigdeer4, 3, 19, (chtype) '^'); + MvWAddCh(bigdeer4, 3, 20, (chtype) '0'); + MvWAddCh(bigdeer4, 3, 21, (chtype) '\\'); + MvWAddCh(bigdeer4, 4, 17, (chtype) '/'); + MvWAddCh(bigdeer4, 4, 18, (chtype) '/'); + MvWAddCh(bigdeer4, 4, 19, (chtype) '\\'); + MvWAddCh(bigdeer4, 4, 22, (chtype) '\\'); + MvWAddStr(bigdeer4, 5, 7, "^~~~~~~~~// ~~U"); + MvWAddStr(bigdeer4, 6, 6, "( )______( /"); + MvWAddStr(bigdeer4, 7, 5, "(/ \\"); + MvWAddStr(bigdeer4, 8, 0, "v___= ----^"); + + /* lookdeer1 */ + MvWAddStr(lookdeer1, 0, 16, "\\/ \\/"); + MvWAddStr(lookdeer1, 1, 17, "\\Y/ \\Y/"); + MvWAddStr(lookdeer1, 2, 19, "\\=/"); + MvWAddStr(lookdeer1, 3, 17, "^\\o o/^"); + MvWAddStr(lookdeer1, 4, 17, "//( )"); + MvWAddStr(lookdeer1, 5, 7, "^~~~~~~~~// \\O/"); + MvWAddStr(lookdeer1, 6, 7, "( \\_____( /"); + MvWAddStr(lookdeer1, 7, 8, "( ) /"); + MvWAddStr(lookdeer1, 8, 9, "\\\\ /"); + MvWAddStr(lookdeer1, 9, 11, "\\>/>"); + + /* lookdeer2 */ + MvWAddStr(lookdeer2, 0, 16, "\\/ \\/"); + MvWAddStr(lookdeer2, 1, 17, "\\Y/ \\Y/"); + MvWAddStr(lookdeer2, 2, 19, "\\=/"); + MvWAddStr(lookdeer2, 3, 17, "^\\o o/^"); + MvWAddStr(lookdeer2, 4, 17, "//( )"); + MvWAddStr(lookdeer2, 5, 7, "^~~~~~~~~// \\O/"); + MvWAddStr(lookdeer2, 6, 7, "(( )____( /"); + MvWAddStr(lookdeer2, 7, 7, "( / |"); + MvWAddStr(lookdeer2, 8, 8, "\\/ |"); + MvWAddStr(lookdeer2, 9, 9, "|> |>"); + + /* lookdeer3 */ + MvWAddStr(lookdeer3, 0, 16, "\\/ \\/"); + MvWAddStr(lookdeer3, 1, 17, "\\Y/ \\Y/"); + MvWAddStr(lookdeer3, 2, 19, "\\=/"); + MvWAddStr(lookdeer3, 3, 17, "^\\o o/^"); + MvWAddStr(lookdeer3, 4, 17, "//( )"); + MvWAddStr(lookdeer3, 5, 7, "^~~~~~~~~// \\O/"); + MvWAddStr(lookdeer3, 6, 6, "( ()_____( /"); + MvWAddStr(lookdeer3, 7, 6, "/ / /"); + MvWAddStr(lookdeer3, 8, 5, "|/ \\"); + MvWAddStr(lookdeer3, 9, 5, "/> \\>"); + + /* lookdeer4 */ + MvWAddStr(lookdeer4, 0, 16, "\\/ \\/"); + MvWAddStr(lookdeer4, 1, 17, "\\Y/ \\Y/"); + MvWAddStr(lookdeer4, 2, 19, "\\=/"); + MvWAddStr(lookdeer4, 3, 17, "^\\o o/^"); + MvWAddStr(lookdeer4, 4, 17, "//( )"); + MvWAddStr(lookdeer4, 5, 7, "^~~~~~~~~// \\O/"); + MvWAddStr(lookdeer4, 6, 6, "( )______( /"); + MvWAddStr(lookdeer4, 7, 5, "(/ \\"); + MvWAddStr(lookdeer4, 8, 0, "v___= ----^"); + + /***********************************************/ + cbreak(); + nodelay(stdscr, TRUE); + do { + clear(); + werase(treescrn); + touchwin(w_del_msg); + touchwin(treescrn); + werase(treescrn2); + touchwin(treescrn2); + werase(treescrn8); + touchwin(treescrn8); + refresh(); + look_out(150); + boxit(); + refresh(); + look_out(150); + seas(); + refresh(); + look_out(150); + greet(); + refresh(); + look_out(150); + fromwho(); + refresh(); + look_out(150); + tree(); + look_out(150); + balls(); + look_out(150); + star(); + look_out(150); + strng1(); + strng2(); + strng3(); + strng4(); + strng5(); + + /* set up the windows for our blinking trees */ + /* **************************************** */ + /* treescrn3 */ + + overlay(treescrn, treescrn3); + + /*balls */ + MvWAddCh(treescrn3, 4, 18, ' '); + MvWAddCh(treescrn3, 7, 6, ' '); + MvWAddCh(treescrn3, 8, 19, ' '); + MvWAddCh(treescrn3, 11, 22, ' '); + + /*star */ + MvWAddCh(treescrn3, 0, 12, '*'); + + /*strng1 */ + MvWAddCh(treescrn3, 3, 11, ' '); + + /*strng2 */ + MvWAddCh(treescrn3, 5, 13, ' '); + MvWAddCh(treescrn3, 6, 10, ' '); + + /*strng3 */ + MvWAddCh(treescrn3, 7, 16, ' '); + MvWAddCh(treescrn3, 7, 14, ' '); + + /*strng4 */ + MvWAddCh(treescrn3, 10, 13, ' '); + MvWAddCh(treescrn3, 10, 10, ' '); + MvWAddCh(treescrn3, 11, 8, ' '); + + /*strng5 */ + MvWAddCh(treescrn3, 11, 18, ' '); + MvWAddCh(treescrn3, 12, 13, ' '); + + /* treescrn4 */ + + overlay(treescrn, treescrn4); + + /*balls */ + MvWAddCh(treescrn4, 3, 9, ' '); + MvWAddCh(treescrn4, 4, 16, ' '); + MvWAddCh(treescrn4, 7, 6, ' '); + MvWAddCh(treescrn4, 8, 19, ' '); + MvWAddCh(treescrn4, 11, 2, ' '); + MvWAddCh(treescrn4, 12, 23, ' '); + + /*star */ + (void) wstandout(treescrn4); + MvWAddCh(treescrn4, 0, 12, '*'); + (void) wstandend(treescrn4); + + /*strng1 */ + MvWAddCh(treescrn4, 3, 13, ' '); + + /*strng2 */ + + /*strng3 */ + MvWAddCh(treescrn4, 7, 15, ' '); + MvWAddCh(treescrn4, 8, 11, ' '); + + /*strng4 */ + MvWAddCh(treescrn4, 9, 16, ' '); + MvWAddCh(treescrn4, 10, 12, ' '); + MvWAddCh(treescrn4, 11, 8, ' '); + + /*strng5 */ + MvWAddCh(treescrn4, 11, 18, ' '); + MvWAddCh(treescrn4, 12, 14, ' '); + + /* treescrn5 */ + + overlay(treescrn, treescrn5); + + /*balls */ + MvWAddCh(treescrn5, 3, 15, ' '); + MvWAddCh(treescrn5, 10, 20, ' '); + MvWAddCh(treescrn5, 12, 1, ' '); + + /*star */ + MvWAddCh(treescrn5, 0, 12, '*'); + + /*strng1 */ + MvWAddCh(treescrn5, 3, 11, ' '); + + /*strng2 */ + MvWAddCh(treescrn5, 5, 12, ' '); + + /*strng3 */ + MvWAddCh(treescrn5, 7, 14, ' '); + MvWAddCh(treescrn5, 8, 10, ' '); + + /*strng4 */ + MvWAddCh(treescrn5, 9, 15, ' '); + MvWAddCh(treescrn5, 10, 11, ' '); + MvWAddCh(treescrn5, 11, 7, ' '); + + /*strng5 */ + MvWAddCh(treescrn5, 11, 17, ' '); + MvWAddCh(treescrn5, 12, 13, ' '); + + /* treescrn6 */ + + overlay(treescrn, treescrn6); + + /*balls */ + MvWAddCh(treescrn6, 6, 7, ' '); + MvWAddCh(treescrn6, 7, 18, ' '); + MvWAddCh(treescrn6, 10, 4, ' '); + MvWAddCh(treescrn6, 11, 23, ' '); + + /*star */ + (void) wstandout(treescrn6); + MvWAddCh(treescrn6, 0, 12, '*'); + (void) wstandend(treescrn6); + + /*strng1 */ + + /*strng2 */ + MvWAddCh(treescrn6, 5, 11, ' '); + + /*strng3 */ + MvWAddCh(treescrn6, 7, 13, ' '); + MvWAddCh(treescrn6, 8, 9, ' '); + + /*strng4 */ + MvWAddCh(treescrn6, 9, 14, ' '); + MvWAddCh(treescrn6, 10, 10, ' '); + MvWAddCh(treescrn6, 11, 6, ' '); + + /*strng5 */ + MvWAddCh(treescrn6, 11, 16, ' '); + MvWAddCh(treescrn6, 12, 12, ' '); + + /* treescrn7 */ + + overlay(treescrn, treescrn7); + + /*balls */ + MvWAddCh(treescrn7, 3, 15, ' '); + MvWAddCh(treescrn7, 6, 7, ' '); + MvWAddCh(treescrn7, 7, 18, ' '); + MvWAddCh(treescrn7, 10, 4, ' '); + MvWAddCh(treescrn7, 11, 22, ' '); + + /*star */ + MvWAddCh(treescrn7, 0, 12, '*'); + + /*strng1 */ + MvWAddCh(treescrn7, 3, 12, ' '); + + /*strng2 */ + MvWAddCh(treescrn7, 5, 13, ' '); + MvWAddCh(treescrn7, 6, 9, ' '); + + /*strng3 */ + MvWAddCh(treescrn7, 7, 15, ' '); + MvWAddCh(treescrn7, 8, 11, ' '); + + /*strng4 */ + MvWAddCh(treescrn7, 9, 16, ' '); + MvWAddCh(treescrn7, 10, 12, ' '); + MvWAddCh(treescrn7, 11, 8, ' '); + + /*strng5 */ + MvWAddCh(treescrn7, 11, 18, ' '); + MvWAddCh(treescrn7, 12, 14, ' '); + + look_out(150); + reindeer(); + + touchwin(w_holiday); + wrefresh(w_holiday); + wrefresh(w_del_msg); + + look_out(500); + for (loopy = 0; loopy < 100; loopy++) { + blinkit(); + } + } while (!opt_q); + done(0); +} diff --git a/contrib/ncurses/test/xterm-16color.dat b/contrib/ncurses/test/xterm-16color.dat new file mode 100644 index 00000000..075c44b8 --- /dev/null +++ b/contrib/ncurses/test/xterm-16color.dat @@ -0,0 +1,54 @@ +############################################################################## +# Copyright 2020,2021 Thomas E. Dickey # +# Copyright 2004-2006,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: xterm-16color.dat,v 1.5 2021/06/17 21:20:30 tom Exp $ +# This illustrates the predefined colors for XFree86 xterm's "xterm-16color". +# If you set $TERM to "xterm-88color" (and have xterm compiled to support the +# 88-color or 256-color feature), you can use the ncurses 'd' screen to +# manipulate the colors shown in the screen. The 'd' screen is limited to +# the first 16 colors, and xterm happens to use the same first 16 colors in +# the extended color models that support initc. +# +# The colors shown are for xterm patch #192. +scale:255 +0: 0 0 0 black +1: 205 0 0 red3 +2: 0 205 0 green3 +3: 205 205 0 yellow3 +4: 0 0 238 blue2 +5: 205 0 205 magenta3 +6: 0 205 205 cyan3 +7: 229 229 229 gray90 +8: 127 127 127 gray50 +9: 255 0 0 red +10: 0 255 0 green +11: 255 255 0 yellow +12: 92 92 255 customblue +13: 255 0 255 magenta +14: 0 255 255 cyan +15: 255 255 255 white diff --git a/contrib/ncurses/test/xterm-256color.dat b/contrib/ncurses/test/xterm-256color.dat new file mode 100644 index 00000000..28f518ed --- /dev/null +++ b/contrib/ncurses/test/xterm-256color.dat @@ -0,0 +1,294 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2009,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: xterm-256color.dat,v 1.3 2020/02/08 21:38:22 tom Exp $ +# This illustrates the predefined colors for xterm's "xterm-256color" feature. +# If you set $TERM to "xterm-256color" (and have xterm compiled to support the +# 256-color feature), you can use the ncurses 'd' screen to +# manipulate the colors shown in the screen. The 'd' screen is limited to +# the first 16 colors, and xterm happens to use the same first 16 colors in +# the extended color models that support initc. +# +# The colors shown are for xterm patch #192. +scale:255 +0: 0 0 0 black +1: 205 0 0 red3 +2: 0 205 0 green3 +3: 205 205 0 yellow3 +4: 0 0 238 blue2 +5: 205 0 205 magenta3 +6: 0 205 205 cyan3 +7: 229 229 229 gray90 +8: 127 127 127 gray50 +9: 255 0 0 red +10: 0 255 0 green +11: 255 255 0 yellow +12: 92 92 255 customblue +13: 255 0 255 magenta +14: 0 255 255 cyan +15: 255 255 255 white +16: 0 0 0 +17: 0 0 95 +18: 0 0 135 +19: 0 0 175 +20: 0 0 215 +21: 0 0 255 +22: 0 95 0 +23: 0 95 95 +24: 0 95 135 +25: 0 95 175 +26: 0 95 215 +27: 0 95 255 +28: 0 135 0 +29: 0 135 95 +30: 0 135 135 +31: 0 135 175 +32: 0 135 215 +33: 0 135 255 +34: 0 175 0 +35: 0 175 95 +36: 0 175 135 +37: 0 175 175 +38: 0 175 215 +39: 0 175 255 +40: 0 215 0 +41: 0 215 95 +42: 0 215 135 +43: 0 215 175 +44: 0 215 215 +45: 0 215 255 +46: 0 255 0 +47: 0 255 95 +48: 0 255 135 +49: 0 255 175 +50: 0 255 215 +51: 0 255 255 +52: 95 0 0 +53: 95 0 95 +54: 95 0 135 +55: 95 0 175 +56: 95 0 215 +57: 95 0 255 +58: 95 95 0 +59: 95 95 95 +60: 95 95 135 +61: 95 95 175 +62: 95 95 215 +63: 95 95 255 +64: 95 135 0 +65: 95 135 95 +66: 95 135 135 +67: 95 135 175 +68: 95 135 215 +69: 95 135 255 +70: 95 175 0 +71: 95 175 95 +72: 95 175 135 +73: 95 175 175 +74: 95 175 215 +75: 95 175 255 +76: 95 215 0 +77: 95 215 95 +78: 95 215 135 +79: 95 215 175 +80: 95 215 215 +81: 95 215 255 +82: 95 255 0 +83: 95 255 95 +84: 95 255 135 +85: 95 255 175 +86: 95 255 215 +87: 95 255 255 +88: 135 0 0 +89: 135 0 95 +90: 135 0 135 +91: 135 0 175 +92: 135 0 215 +93: 135 0 255 +94: 135 95 0 +95: 135 95 95 +96: 135 95 135 +97: 135 95 175 +98: 135 95 215 +99: 135 95 255 +100: 135 135 0 +101: 135 135 95 +102: 135 135 135 +103: 135 135 175 +104: 135 135 215 +105: 135 135 255 +106: 135 175 0 +107: 135 175 95 +108: 135 175 135 +109: 135 175 175 +110: 135 175 215 +111: 135 175 255 +112: 135 215 0 +113: 135 215 95 +114: 135 215 135 +115: 135 215 175 +116: 135 215 215 +117: 135 215 255 +118: 135 255 0 +119: 135 255 95 +120: 135 255 135 +121: 135 255 175 +122: 135 255 215 +123: 135 255 255 +124: 175 0 0 +125: 175 0 95 +126: 175 0 135 +127: 175 0 175 +128: 175 0 215 +129: 175 0 255 +130: 175 95 0 +131: 175 95 95 +132: 175 95 135 +133: 175 95 175 +134: 175 95 215 +135: 175 95 255 +136: 175 135 0 +137: 175 135 95 +138: 175 135 135 +139: 175 135 175 +140: 175 135 215 +141: 175 135 255 +142: 175 175 0 +143: 175 175 95 +144: 175 175 135 +145: 175 175 175 +146: 175 175 215 +147: 175 175 255 +148: 175 215 0 +149: 175 215 95 +150: 175 215 135 +151: 175 215 175 +152: 175 215 215 +153: 175 215 255 +154: 175 255 0 +155: 175 255 95 +156: 175 255 135 +157: 175 255 175 +158: 175 255 215 +159: 175 255 255 +160: 215 0 0 +161: 215 0 95 +162: 215 0 135 +163: 215 0 175 +164: 215 0 215 +165: 215 0 255 +166: 215 95 0 +167: 215 95 95 +168: 215 95 135 +169: 215 95 175 +170: 215 95 215 +171: 215 95 255 +172: 215 135 0 +173: 215 135 95 +174: 215 135 135 +175: 215 135 175 +176: 215 135 215 +177: 215 135 255 +178: 215 175 0 +179: 215 175 95 +180: 215 175 135 +181: 215 175 175 +182: 215 175 215 +183: 215 175 255 +184: 215 215 0 +185: 215 215 95 +186: 215 215 135 +187: 215 215 175 +188: 215 215 215 +189: 215 215 255 +190: 215 255 0 +191: 215 255 95 +192: 215 255 135 +193: 215 255 175 +194: 215 255 215 +195: 215 255 255 +196: 255 0 0 +197: 255 0 95 +198: 255 0 135 +199: 255 0 175 +200: 255 0 215 +201: 255 0 255 +202: 255 95 0 +203: 255 95 95 +204: 255 95 135 +205: 255 95 175 +206: 255 95 215 +207: 255 95 255 +208: 255 135 0 +209: 255 135 95 +210: 255 135 135 +211: 255 135 175 +212: 255 135 215 +213: 255 135 255 +214: 255 175 0 +215: 255 175 95 +216: 255 175 135 +217: 255 175 175 +218: 255 175 215 +219: 255 175 255 +220: 255 215 0 +221: 255 215 95 +222: 255 215 135 +223: 255 215 175 +224: 255 215 215 +225: 255 215 255 +226: 255 255 0 +227: 255 255 95 +228: 255 255 135 +229: 255 255 175 +230: 255 255 215 +231: 255 255 255 +232: 8 8 8 +233: 18 18 18 +234: 28 28 28 +235: 38 38 38 +236: 48 48 48 +237: 58 58 58 +238: 68 68 68 +239: 78 78 78 +240: 88 88 88 +241: 98 98 98 +242: 108 108 108 +243: 118 118 118 +244: 128 128 128 +245: 138 138 138 +246: 148 148 148 +247: 158 158 158 +248: 168 168 168 +249: 178 178 178 +250: 188 188 188 +251: 198 198 198 +252: 208 208 208 +253: 218 218 218 +254: 228 228 228 +255: 238 238 238 diff --git a/contrib/ncurses/test/xterm-88color.dat b/contrib/ncurses/test/xterm-88color.dat new file mode 100644 index 00000000..48ee18bd --- /dev/null +++ b/contrib/ncurses/test/xterm-88color.dat @@ -0,0 +1,126 @@ +############################################################################## +# Copyright 2020 Thomas E. Dickey # +# Copyright 2005-2009,2016 Free Software Foundation, Inc. # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the "Software"), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, distribute # +# with modifications, sublicense, and/or sell copies of the Software, and to # +# permit persons to whom the Software is furnished to do so, subject to the # +# following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL # +# THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +# Except as contained in this notice, the name(s) of the above copyright # +# holders shall not be used in advertising or otherwise to promote the sale, # +# use or other dealings in this Software without prior written # +# authorization. # +############################################################################## +# $Id: xterm-88color.dat,v 1.5 2020/02/08 21:38:22 tom Exp $ +# This illustrates the predefined colors for xterm's "xterm-88color" feature. +# If you set $TERM to "xterm-88color" (and have xterm compiled to support the +# 88-color or 256-color feature), you can use the ncurses 'd' screen to +# manipulate the colors shown in the screen. The 'd' screen is limited to +# the first 16 colors, and xterm happens to use the same first 16 colors in +# the extended color models that support initc. +# +# The colors shown are for xterm patch #192. +scale:255 +0: 0 0 0 black +1: 205 0 0 red3 +2: 0 205 0 green3 +3: 205 205 0 yellow3 +4: 0 0 238 blue2 +5: 205 0 205 magenta3 +6: 0 205 205 cyan3 +7: 229 229 229 gray90 +8: 127 127 127 gray50 +9: 255 0 0 red +10: 0 255 0 green +11: 255 255 0 yellow +12: 92 92 255 customblue +13: 255 0 255 magenta +14: 0 255 255 cyan +15: 255 255 255 white +16: 0 0 0 +17: 0 0 139 +18: 0 0 205 +19: 0 0 255 +20: 0 139 0 +21: 0 139 139 +22: 0 139 205 +23: 0 139 255 +24: 0 205 0 +25: 0 205 139 +26: 0 205 205 +27: 0 205 255 +28: 0 255 0 +29: 0 255 139 +30: 0 255 205 +31: 0 255 255 +32: 139 0 0 +33: 139 0 139 +34: 139 0 205 +35: 139 0 255 +36: 139 139 0 +37: 139 139 139 +38: 139 139 205 +39: 139 139 255 +40: 139 205 0 +41: 139 205 139 +42: 139 205 205 +43: 139 205 255 +44: 139 255 0 +45: 139 255 139 +46: 139 255 205 +47: 139 255 255 +48: 205 0 0 +49: 205 0 139 +50: 205 0 205 +51: 205 0 255 +52: 205 139 0 +53: 205 139 139 +54: 205 139 205 +55: 205 139 255 +56: 205 205 0 +57: 205 205 139 +58: 205 205 205 +59: 205 205 255 +60: 205 255 0 +61: 205 255 139 +62: 205 255 205 +63: 205 255 255 +64: 255 0 0 +65: 255 0 139 +66: 255 0 205 +67: 255 0 255 +68: 255 139 0 +69: 255 139 139 +70: 255 139 205 +71: 255 139 255 +72: 255 205 0 +73: 255 205 139 +74: 255 205 205 +75: 255 205 255 +76: 255 255 0 +77: 255 255 139 +78: 255 255 205 +79: 255 255 255 +80: 46 46 46 +81: 92 92 92 +82: 113 113 113 +83: 139 139 139 +84: 162 162 162 +85: 185 185 185 +86: 208 208 208 +87: 231 231 231 diff --git a/contrib/ncurses/test/xterm-color_48x48.xpm b/contrib/ncurses/test/xterm-color_48x48.xpm new file mode 100644 index 00000000..d8a501f5 --- /dev/null +++ b/contrib/ncurses/test/xterm-color_48x48.xpm @@ -0,0 +1,61 @@ +/* XPM */ +static char * xterm_color_48x48_xpm[] = { +"48 48 10 1", +". c None", +" c #555500", +"+ c #000000", +"@ c #FFFFFF", +"# c #FF0000", +"$ c #070700", +"% c #0B0B00", +"& c #FF8400", +"* c #49FF00", +"= c #60B7FF", +"................................................", +"......++++++++++++++++++++++++++++++++++........", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +".....+@@@++++++++++++++++++++++++++++@@@+@+.....", +".....+@@++++++++++++++++++++++++++++++@@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@@@+...", +".....+@++###++++###++++++++++++++++++++@+@@@@+..", +".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@++++++##++++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", +".....+@++###++++###++++++++++++++++++++@+@@@@+..", +".....+@++++++++++++++++++++++++++++++++@+@@@@+..", +".....+@$+++++++++++++++++++++++++++++++@+@@@@+..", +".....+@%@@@@@@@+&&&&&++****+++==+++==++@+@@@@+..", +".....+@++++@++++&++++++*+++*++==+++==++@+@@@@+..", +".....+@++++@++++&++++++*+++*++=+=+=+=++@+@@@@+..", +".....+@++++@++++&&&&+++****+++=+=+=+=++@+@@@@+..", +".....+@++++@++++&++++++*+*++++=++=++=++@+@@@+...", +".....+@++++@++++&++++++*++*+++=++=++=++@+@@@+...", +".....+@++++@++++&&&&&++*+++*++=+++++=++@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@+.....", +".....+@@++++++++++++++++++++++++++++++@@+@+.....", +".....+@@@++++++++++++++++++++++++++++@@@++......", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +"......++++++++++++++++++++++++++++++++++........", +"................................................", +"................................................", +"......++++++++++++++++++++++++++++++++++++......", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +".....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@++......", +"....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+......", +"....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@+......", +"...+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+......", +"...+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@@+......", +"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+.......", +"..+@++@++++++++++++++++++++++++++@++@+@+........", +".+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+.........", +".+++++++++++++++++++++++++++++++++++++..........", +"................................................"}; From 53f7aaa049579978df8296471e5d77160c519267 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Sun, 11 May 2025 14:31:57 +0300 Subject: [PATCH 2/3] make: integrate ncurses --- makefile | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/makefile b/makefile index 19da4d4e..962e7357 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,5 @@ TOP ?= . +ATOP = $(abspath $(TOP)) -include Makefile.conf export prefix export PKG_CONFIG_PATH := $(PKG_CONFIG_PATH):$(datadir)/pkgconfig:$(libdir)/pkgconfig @@ -13,10 +14,11 @@ DJDEV64LIB = $(TOP)/lib/libdjdev64.so.*.* DJDEV64DEVL = $(TOP)/lib/libdjdev64.so DJSTUB64LIB = $(TOP)/lib/libdjstub64.so.*.* DJSTUB64DEVL = $(TOP)/lib/libdjstub64.so +NC_BUILD = contrib/ncurses/build -.PHONY: subs dj64 djdev64 demos +.PHONY: subs dj64 djdev64 demos ncurses -all: Makefile.conf dj64 djdev64 +all: Makefile.conf dj64 djdev64 ncurses @echo @echo "Done building. You may need to run \"sudo make install\" now." @echo "You can first run \"sudo make uninstall\" to purge the prev install." @@ -56,6 +58,7 @@ install_dj64: $(INSTALL) -m 0644 dj64.pc $(DESTDIR)$(datadir)/pkgconfig $(INSTALL) -m 0644 dj64_s.pc $(DESTDIR)$(datadir)/pkgconfig $(INSTALL) -m 0644 dj64static.pc $(DESTDIR)$(datadir)/pkgconfig + $(MAKE) -C $(NC_BUILD) install install_djdev64: $(INSTALL) -d $(DESTDIR)$(datadir) @@ -75,6 +78,7 @@ install: install_dj64 install_djdev64 install_demos @echo "Done installing. You may need to run \"sudo ldconfig\" now." uninstall: + $(MAKE) -C $(NC_BUILD) uninstall $(RM) -r $(DESTDIR)$(prefix)/i386-pc-dj64 $(RM) -r $(DESTDIR)$(includedir)/djdev64 $(RM) $(DESTDIR)$(datadir)/pkgconfig/dj64.pc @@ -94,6 +98,7 @@ clean: demos_clean $(MAKE) -C src/djdev64 clean $(RM) *.pc $(RM) -r lib + $(RM) -r $(NC_BUILD) deb: debuild -i -us -uc -b && $(MAKE) clean >/dev/null @@ -116,3 +121,30 @@ demos_clean: install_demos: $(MAKE) -C demos src_install + +L_CPPFLAGS = $(shell PKG_CONFIG_PATH=. pkg-config --variable=xcppflags --define-variable=dj64prefix=$(ATOP) dj64) +L_CFLAGS = $(shell PKG_CONFIG_PATH=. pkg-config --cflags dj64) +L_LIBS = $(shell PKG_CONFIG_PATH=. pkg-config --libs-only-L --libs-only-l --define-variable=libdir=$(ATOP)/lib dj64) +R_PREFIX = $(shell PKG_CONFIG_PATH=. pkg-config --variable=dj64prefix dj64) +R_LIBDIR = $(shell PKG_CONFIG_PATH=. pkg-config --variable=libdir dj64) +L_LDFLAGS = $(shell PKG_CONFIG_PATH=. pkg-config --libs-only-other dj64) \ + -Wl,-rpath=$(R_LIBDIR) -nostdlib +$(NC_BUILD): + mkdir -p $@ +ncurses: dj64.pc | $(NC_BUILD) + cd $(NC_BUILD) && \ + CPPFLAGS="$(L_CPPFLAGS)" \ + CFLAGS="$(L_CFLAGS) $(CFLAGS)" \ + LIBS="$(L_LIBS)" \ + LDFLAGS="$(L_LDFLAGS)" \ + ../configure --host=x86_64-pc-linux-gnu \ + --prefix=$(R_PREFIX) \ + --libdir=$(R_LIBDIR) \ + --without-manpages \ + --without-cxx \ + --without-debug \ + --with-fallbacks=vt100,ansi,cygwin,linux,djgpp,djgpp203,djgpp204 \ + --disable-database \ + --without-tests \ + --without-progs + $(MAKE) -C $(NC_BUILD) From 03900bf1f0070bb5bef9751a8d1fe3eddf7988a5 Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Sun, 11 May 2025 15:16:23 +0300 Subject: [PATCH 3/3] deb,rpm: integrate ncurses --- debian/dj64-dev-static.install | 2 +- debian/dj64-dev.install | 4 ++++ dj64dev.spec.rpkg | 6 +++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/debian/dj64-dev-static.install b/debian/dj64-dev-static.install index 97a4a85a..c96d1809 100644 --- a/debian/dj64-dev-static.install +++ b/debian/dj64-dev-static.install @@ -1,4 +1,4 @@ usr/i386-pc-dj64/lib/libc.a -usr/i386-pc-dj64/lib64/*.a +usr/i386-pc-dj64/lib64/libdj64_s.a usr/share/pkgconfig/dj64_s.pc usr/share/pkgconfig/dj64static.pc diff --git a/debian/dj64-dev.install b/debian/dj64-dev.install index c575796c..d763c23c 100644 --- a/debian/dj64-dev.install +++ b/debian/dj64-dev.install @@ -1,6 +1,10 @@ usr/i386-pc-dj64/include usr/i386-pc-dj64/lib/*.o usr/i386-pc-dj64/lib64/*.so +usr/i386-pc-dj64/lib64/libformw.a +usr/i386-pc-dj64/lib64/libmenuw.a +usr/i386-pc-dj64/lib64/libncursesw.a +usr/i386-pc-dj64/lib64/libpanelw.a usr/i386-pc-dj64/share/* usr/share/pkgconfig/dj64.pc usr/share/doc/dj64/* diff --git a/dj64dev.spec.rpkg b/dj64dev.spec.rpkg index 6c0f5671..bdb029bd 100644 --- a/dj64dev.spec.rpkg +++ b/dj64dev.spec.rpkg @@ -83,6 +83,10 @@ This package contains tools and headers for building dj64-enabled programs. %{_prefix}/i386-pc-dj64/include %{_prefix}/i386-pc-dj64/lib/*.o %{_prefix}/i386-pc-dj64/lib64/*.so +%{_prefix}/i386-pc-dj64/lib64/libformw.a +%{_prefix}/i386-pc-dj64/lib64/libmenuw.a +%{_prefix}/i386-pc-dj64/lib64/libncursesw.a +%{_prefix}/i386-pc-dj64/lib64/libpanelw.a %{_prefix}/i386-pc-dj64/share/* %{_datadir}/pkgconfig/dj64.pc %{_docdir}/dj64 @@ -100,7 +104,7 @@ May be needed on non-glibc systems. %files dj64-devel-static %defattr(-,root,root) %{_prefix}/i386-pc-dj64/lib/libc.a -%{_prefix}/i386-pc-dj64/lib64/*.a +%{_prefix}/i386-pc-dj64/lib64/libdj64_s.a %{_datadir}/pkgconfig/dj64_s.pc %{_datadir}/pkgconfig/dj64static.pc %end